From 58365b34bb4d84dda4e2fe73cd9eb7e9267ed86c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 22 Jan 2019 15:20:50 -0800 Subject: [PATCH 0001/1679] cmd/compile/internal/syntax: allow more than one rune "unread" Make it possible to "unread" more than one byte before the most recently read rune. Use a better name than ungetr2 and make it slightly more efficient. R=Go1.13 Change-Id: I45d5dfa11e508259a972ca6560d1f78d7a51fe15 Reviewed-on: https://go-review.googlesource.com/c/158957 Reviewed-by: Russ Cox --- src/cmd/compile/internal/syntax/scanner.go | 4 +- src/cmd/compile/internal/syntax/source.go | 51 +++++++++++++--------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go index 7db33fb6b9..112afa5eb6 100644 --- a/src/cmd/compile/internal/syntax/scanner.go +++ b/src/cmd/compile/internal/syntax/scanner.go @@ -150,7 +150,7 @@ redo: case '.': c = s.getr() if isDigit(c) { - s.ungetr2() + s.unread(1) s.number('.') break } @@ -160,7 +160,7 @@ redo: s.tok = _DotDotDot break } - s.ungetr2() + s.unread(1) } s.ungetr() s.tok = _Dot diff --git a/src/cmd/compile/internal/syntax/source.go b/src/cmd/compile/internal/syntax/source.go index c6168b8594..c671e3c11e 100644 --- a/src/cmd/compile/internal/syntax/source.go +++ b/src/cmd/compile/internal/syntax/source.go @@ -22,6 +22,9 @@ import ( const linebase = 1 const colbase = 1 +// max. number of bytes to unread +const maxunread = 10 + // buf [...read...|...|...unread...|s|...free...] // ^ ^ ^ ^ // | | | | @@ -59,20 +62,21 @@ func (s *source) init(src io.Reader, errh func(line, pos uint, msg string)) { s.suf = -1 } -// ungetr ungets the most recently read rune. +// ungetr sets the reading position to a previous reading +// position, usually the one of the most recently read +// rune, but possibly earlier (see unread below). func (s *source) ungetr() { s.r, s.line, s.col = s.r0, s.line0, s.col0 } -// ungetr2 is like ungetr but enables a 2nd ungetr. -// It must not be called if one of the runes seen -// was a newline or had a UTF-8 encoding longer than -// 1 byte. -func (s *source) ungetr2() { - s.ungetr() - // line must not have changed - s.r0-- - s.col0-- +// unread moves the previous reading position to a position +// that is n bytes earlier in the source. The next ungetr +// call will set the reading position to that moved position. +// The "unread" runes must be single byte and not contain any +// newlines; and 0 <= n <= maxunread must hold. +func (s *source) unread(n int) { + s.r0 -= n + s.col0 -= uint(n) } func (s *source) error(msg string) { @@ -142,7 +146,7 @@ redo: // BOM's are only allowed as the first character in a file const BOM = 0xfeff if r == BOM { - if s.r0 > 0 { // s.r0 is always > 0 after 1st character (fill will set it to 1) + if s.r0 > 0 { // s.r0 is always > 0 after 1st character (fill will set it to maxunread) s.error("invalid BOM in the middle of the file") } goto redo @@ -153,20 +157,25 @@ redo: func (s *source) fill() { // Slide unread bytes to beginning but preserve last read char - // (for one ungetr call) plus one extra byte (for a 2nd ungetr - // call, only for ".." character sequence and float literals - // starting with "."). - if s.r0 > 1 { + // (for one ungetr call) plus maxunread extra bytes (for one + // unread call). + if s.r0 > maxunread { + n := s.r0 - maxunread // number of bytes to slide down // save literal prefix, if any - // (We see at most one ungetr call while reading - // a literal, so make sure s.r0 remains in buf.) + // (make sure we keep maxunread bytes and the last + // read char in the buffer) if s.suf >= 0 { - s.lit = append(s.lit, s.buf[s.suf:s.r0]...) - s.suf = 1 // == s.r0 after slide below + // we have a literal + if s.suf < n { + // save literal prefix + s.lit = append(s.lit, s.buf[s.suf:n]...) + s.suf = 0 + } else { + s.suf -= n + } } - n := s.r0 - 1 copy(s.buf[:], s.buf[n:s.w]) - s.r0 = 1 // eqv: s.r0 -= n + s.r0 = maxunread // eqv: s.r0 -= n s.r -= n s.w -= n } -- GitLab From 7bc2aa670f47266d3c5a840d748a1f2e805b89d7 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 23 Jan 2019 15:36:41 -0800 Subject: [PATCH 0002/1679] math/big: permit upper-case 'P' binary exponent (not just 'p') The current implementation accepted binary exponents but restricted them to 'p'. This change permits both 'p' and 'P'. R=Go1.13 Updates #29008. Change-Id: I7a89ccb86af4438f17b0422be7cb630ffcf43272 Reviewed-on: https://go-review.googlesource.com/c/159297 Reviewed-by: Russ Cox Reviewed-by: Emmanuel Odeke --- src/math/big/floatconv.go | 4 ++-- src/math/big/floatconv_test.go | 2 ++ src/math/big/ratconv.go | 8 ++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go index 95d1bf84e2..5cc9e24f4c 100644 --- a/src/math/big/floatconv.go +++ b/src/math/big/floatconv.go @@ -224,7 +224,7 @@ func (z *Float) pow5(n uint64) *Float { // sign = "+" | "-" . // prefix = "0" ( "x" | "X" | "b" | "B" ) . // mantissa = digits | digits "." [ digits ] | "." digits . -// exponent = ( "E" | "e" | "p" ) [ sign ] digits . +// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // digits = digit { digit } . // digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // infinity = [ sign ] ( "inf" | "Inf" ) . @@ -238,7 +238,7 @@ func (z *Float) pow5(n uint64) *Float { // The octal prefix "0" is not supported (a leading "0" is simply // considered a "0"). // -// A "p" exponent indicates a binary (rather then decimal) exponent; +// A "p" or "P" exponent indicates a binary (rather then decimal) exponent; // for instance "0x1.fffffffffffffp1023" (using base 0) represents the // maximum float64 value. For hexadecimal mantissae, the exponent must // be binary, if present (an "e" or "E" exponent indicator cannot be diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index 269e2652e8..6db9bf2e46 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -108,6 +108,7 @@ func TestFloatSetFloat64String(t *testing.T) { {"0b001p-3", 0.125}, {"0b.001p3", 1}, {"0b0.01p2", 1}, + {"0b0.01P+2", 1}, // hexadecimal mantissa and exponent {"0x0", 0}, @@ -117,6 +118,7 @@ func TestFloatSetFloat64String(t *testing.T) { {"0xff", 255}, {"0X.8p1", 1}, {"-0X0.00008p16", -0.5}, + {"-0X0.00008P+16", -0.5}, {"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64}, {"0x1.fffffffffffffp1023", math.MaxFloat64}, } { diff --git a/src/math/big/ratconv.go b/src/math/big/ratconv.go index 5656280e84..bd2509f168 100644 --- a/src/math/big/ratconv.go +++ b/src/math/big/ratconv.go @@ -130,10 +130,10 @@ func (z *Rat) SetString(s string) (*Rat, bool) { } // scanExponent scans the longest possible prefix of r representing a decimal -// ('e', 'E') or binary ('p') exponent, if any. It returns the exponent, the -// exponent base (10 or 2), or a read or syntax error, if any. +// ('e', 'E') or binary ('p', 'P') exponent, if any. It returns the exponent, +// the exponent base (10 or 2), or a read or syntax error, if any. // -// exponent = ( "E" | "e" | "p" ) [ sign ] digits . +// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // sign = "+" | "-" . // digits = digit { digit } . // digit = "0" ... "9" . @@ -153,7 +153,7 @@ func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err err switch ch { case 'e', 'E': // ok - case 'p': + case 'p', 'P': if binExpOk { base = 2 break // ok -- GitLab From ceb849dd97aebf08eee5f3683619494c56190f81 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Sat, 12 Jan 2019 20:33:58 -0800 Subject: [PATCH 0003/1679] cmd/compile: accept new Go2 number literals This CL introduces compiler support for the new binary and octal integer literals, hexadecimal floats, and digit separators for all number literals. The new Go 2 number literal scanner accepts the following liberal format: number = [ prefix ] digits [ "." digits ] [ exponent ] [ "i" ] . prefix = "0" [ "b" |"B" | "o" | "O" | "x" | "X" ] . digits = { digit | "_" } . exponent = ( "e" | "E" | "p" | "P" ) [ "+" | "-" ] digits . If the number starts with "0x" or "0X", digit is any hexadecimal digit; otherwise, digit is any decimal digit. If the accepted number is not valid, errors are reported accordingly. See the new test cases in scanner_test.go for a selection of valid and invalid numbers and the respective error messages. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: Ic8febc7bd4dc5186b16a8c8897691e81125cf0ca Reviewed-on: https://go-review.googlesource.com/c/157677 Reviewed-by: Ian Lance Taylor Reviewed-by: Russ Cox --- src/cmd/compile/internal/gc/mpfloat.go | 6 +- src/cmd/compile/internal/gc/mpint.go | 7 + src/cmd/compile/internal/syntax/scanner.go | 233 +++++++++++++----- .../compile/internal/syntax/scanner_test.go | 224 ++++++++++++++++- src/go/types/stdlib_test.go | 1 + test/fixedbugs/issue9036.go | 16 +- test/literal2.go | 88 +++++++ 7 files changed, 487 insertions(+), 88 deletions(-) create mode 100644 test/literal2.go diff --git a/src/cmd/compile/internal/gc/mpfloat.go b/src/cmd/compile/internal/gc/mpfloat.go index d1f5cb1200..846ce4cca7 100644 --- a/src/cmd/compile/internal/gc/mpfloat.go +++ b/src/cmd/compile/internal/gc/mpfloat.go @@ -8,6 +8,7 @@ import ( "fmt" "math" "math/big" + "strings" ) // implements float arithmetic @@ -177,11 +178,14 @@ func (a *Mpflt) Neg() { } func (a *Mpflt) SetString(as string) { + // TODO(gri) remove this code once math/big.Float.Parse can handle separators + as = strings.Replace(as, "_", "", -1) // strip separators + for len(as) > 0 && (as[0] == ' ' || as[0] == '\t') { as = as[1:] } - f, _, err := a.Val.Parse(as, 10) + f, _, err := a.Val.Parse(as, 0) if err != nil { yyerror("malformed constant: %s (%v)", as, err) a.Val.SetFloat64(0) diff --git a/src/cmd/compile/internal/gc/mpint.go b/src/cmd/compile/internal/gc/mpint.go index e4dd22d0a0..e06f39f8d9 100644 --- a/src/cmd/compile/internal/gc/mpint.go +++ b/src/cmd/compile/internal/gc/mpint.go @@ -7,6 +7,7 @@ package gc import ( "fmt" "math/big" + "strings" ) // implements integer arithmetic @@ -281,6 +282,12 @@ func (a *Mpint) SetInt64(c int64) { } func (a *Mpint) SetString(as string) { + // TODO(gri) remove this code once math/big.Int.SetString can handle 0o-octals and separators + as = strings.Replace(as, "_", "", -1) // strip separators + if len(as) >= 2 && as[0] == '0' && (as[1] == 'o' || as[1] == 'O') { + as = "0" + as[2:] + } + _, ok := a.Val.SetString(as, 0) if !ok { // required syntax is [+-][0[x]]d* diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go index 112afa5eb6..0a77d48b3d 100644 --- a/src/cmd/compile/internal/syntax/scanner.go +++ b/src/cmd/compile/internal/syntax/scanner.go @@ -47,6 +47,10 @@ func (s *scanner) init(src io.Reader, errh func(line, col uint, msg string), mod s.nlsemi = false } +func (s *scanner) errorf(format string, args ...interface{}) { + s.error(fmt.Sprintf(format, args...)) +} + // next advances the scanner by reading the next token. // // If a read, source encoding, or lexical error occurs, next calls @@ -149,8 +153,9 @@ redo: case '.': c = s.getr() - if isDigit(c) { - s.unread(1) + if isDecimal(c) { + s.ungetr() + s.unread(1) // correct position of '.' (needed by startLit in number) s.number('.') break } @@ -304,7 +309,7 @@ redo: default: s.tok = 0 - s.error(fmt.Sprintf("invalid character %#U", c)) + s.errorf("invalid character %#U", c) goto redo } @@ -320,11 +325,7 @@ assignop: } func isLetter(c rune) bool { - return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || c == '_' -} - -func isDigit(c rune) bool { - return '0' <= c && c <= '9' + return 'a' <= lower(c) && lower(c) <= 'z' || c == '_' } func (s *scanner) ident() { @@ -332,7 +333,7 @@ func (s *scanner) ident() { // accelerate common case (7bit ASCII) c := s.getr() - for isLetter(c) || isDigit(c) { + for isLetter(c) || isDecimal(c) { c = s.getr() } @@ -372,10 +373,10 @@ func (s *scanner) isIdentRune(c rune, first bool) bool { // ok case unicode.IsDigit(c): if first { - s.error(fmt.Sprintf("identifier cannot begin with digit %#U", c)) + s.errorf("identifier cannot begin with digit %#U", c) } case c >= utf8.RuneSelf: - s.error(fmt.Sprintf("invalid identifier character %#U", c)) + s.errorf("invalid identifier character %#U", c) default: return false } @@ -401,86 +402,188 @@ func init() { } } +func lower(c rune) rune { return ('a' - 'A') | c } // returns lower-case c iff c is ASCII letter +func isDecimal(c rune) bool { return '0' <= c && c <= '9' } +func isHex(c rune) bool { return '0' <= c && c <= '9' || 'a' <= lower(c) && lower(c) <= 'f' } + +// digits accepts the sequence { digit | '_' } starting with c0. +// If base <= 10, digits accepts any decimal digit but records +// the index (relative to the literal start) of a digit >= base +// in *invalid, if *invalid < 0. +// digits returns the first rune that is not part of the sequence +// anymore, and a bitset describing whether the sequence contained +// digits (bit 0 is set), or separators '_' (bit 1 is set). +func (s *scanner) digits(c0 rune, base int, invalid *int) (c rune, digsep int) { + c = c0 + if base <= 10 { + max := rune('0' + base) + for isDecimal(c) || c == '_' { + ds := 1 + if c == '_' { + ds = 2 + } else if c >= max && *invalid < 0 { + *invalid = int(s.col0 - s.col) // record invalid rune index + } + digsep |= ds + c = s.getr() + } + } else { + for isHex(c) || c == '_' { + ds := 1 + if c == '_' { + ds = 2 + } + digsep |= ds + c = s.getr() + } + } + return +} + func (s *scanner) number(c rune) { s.startLit() + base := 10 // number base + prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b' + digsep := 0 // bit 0: digit present, bit 1: '_' present + invalid := -1 // index of invalid digit in literal, or < 0 + + // integer part + var ds int if c != '.' { - s.kind = IntLit // until proven otherwise + s.kind = IntLit if c == '0' { c = s.getr() - if c == 'x' || c == 'X' { - // hex + switch lower(c) { + case 'x': c = s.getr() - hasDigit := false - for isDigit(c) || 'a' <= c && c <= 'f' || 'A' <= c && c <= 'F' { - c = s.getr() - hasDigit = true - } - if !hasDigit { - s.error("malformed hex constant") - } - goto done - } - - // decimal 0, octal, or float - has8or9 := false - for isDigit(c) { - if c > '7' { - has8or9 = true - } + base, prefix = 16, 'x' + case 'o': c = s.getr() - } - if c != '.' && c != 'e' && c != 'E' && c != 'i' { - // octal - if has8or9 { - s.error("malformed octal constant") - } - goto done - } - - } else { - // decimal or float - for isDigit(c) { + base, prefix = 8, 'o' + case 'b': c = s.getr() + base, prefix = 2, 'b' + default: + base, prefix = 8, '0' + digsep = 1 // leading 0 } } + c, ds = s.digits(c, base, &invalid) + digsep |= ds } - // float + // fractional part if c == '.' { s.kind = FloatLit - c = s.getr() - for isDigit(c) { - c = s.getr() + if prefix == 'o' || prefix == 'b' { + s.error("invalid radix point in " + litname(prefix)) } + c, ds = s.digits(s.getr(), base, &invalid) + digsep |= ds + } + + if digsep&1 == 0 { + s.error(litname(prefix) + " has no digits") } // exponent - if c == 'e' || c == 'E' { - s.kind = FloatLit + if e := lower(c); e == 'e' || e == 'p' { + switch { + case e == 'e' && prefix != 0 && prefix != '0': + s.errorf("%q exponent requires decimal mantissa", c) + case e == 'p' && prefix != 'x': + s.errorf("%q exponent requires hexadecimal mantissa", c) + } c = s.getr() - if c == '-' || c == '+' { + s.kind = FloatLit + if c == '+' || c == '-' { c = s.getr() } - if !isDigit(c) { - s.error("malformed floating-point constant exponent") - } - for isDigit(c) { - c = s.getr() + c, ds = s.digits(c, 10, nil) + digsep |= ds + if ds&1 == 0 { + s.error("exponent has no digits") } + } else if prefix == 'x' && s.kind == FloatLit { + s.error("hexadecimal mantissa requires a 'p' exponent") } - // complex + // suffix 'i' if c == 'i' { s.kind = ImagLit - s.getr() + if prefix != 0 && prefix != '0' { + s.error("invalid suffix 'i' on " + litname(prefix)) + } + c = s.getr() } - -done: s.ungetr() + s.nlsemi = true s.lit = string(s.stopLit()) s.tok = _Literal + + if s.kind == IntLit && invalid >= 0 { + s.errh(s.line, s.col+uint(invalid), fmt.Sprintf("invalid digit %q in %s", s.lit[invalid], litname(prefix))) + } + + if digsep&2 != 0 { + if i := invalidSep(s.lit); i >= 0 { + s.errh(s.line, s.col+uint(i), "'_' must separate successive digits") + } + } +} + +func litname(prefix rune) string { + switch prefix { + case 'x': + return "hexadecimal literal" + case 'o', '0': + return "octal literal" + case 'b': + return "binary literal" + } + return "decimal literal" +} + +// invalidSep returns the index of the first invalid separator in x, or -1. +func invalidSep(x string) int { + x1 := ' ' // prefix char, we only care if it's 'x' + d := '.' // digit, one of '_', '0' (a digit), or '.' (anything else) + i := 0 + + // a prefix counts as a digit + if len(x) >= 2 && x[0] == '0' { + x1 = lower(rune(x[1])) + if x1 == 'x' || x1 == 'o' || x1 == 'b' { + d = '0' + i = 2 + } + } + + // mantissa and exponent + for ; i < len(x); i++ { + p := d // previous digit + d = rune(x[i]) + switch { + case d == '_': + if p != '0' { + return i + } + case isDecimal(d) || x1 == 'x' && isHex(d): + d = '0' + default: + if p == '_' { + return i - 1 + } + d = '.' + } + } + if d == '_' { + return len(x) - 1 + } + + return -1 } func (s *scanner) rune() { @@ -713,12 +816,10 @@ func (s *scanner) escape(quote rune) bool { for i := n; i > 0; i-- { d := base switch { - case isDigit(c): + case isDecimal(c): d = uint32(c) - '0' - case 'a' <= c && c <= 'f': - d = uint32(c) - ('a' - 10) - case 'A' <= c && c <= 'F': - d = uint32(c) - ('A' - 10) + case 'a' <= lower(c) && lower(c) <= 'f': + d = uint32(lower(c)) - ('a' - 10) } if d >= base { if c < 0 { @@ -728,7 +829,7 @@ func (s *scanner) escape(quote rune) bool { if base == 8 { kind = "octal" } - s.error(fmt.Sprintf("non-%s character in escape sequence: %c", kind, c)) + s.errorf("non-%s character in escape sequence: %c", kind, c) s.ungetr() return false } @@ -739,7 +840,7 @@ func (s *scanner) escape(quote rune) bool { s.ungetr() if x > max && base == 8 { - s.error(fmt.Sprintf("octal escape value > 255: %d", x)) + s.errorf("octal escape value > 255: %d", x) return false } diff --git a/src/cmd/compile/internal/syntax/scanner_test.go b/src/cmd/compile/internal/syntax/scanner_test.go index 0b7c2cfe43..0f0579e2a5 100644 --- a/src/cmd/compile/internal/syntax/scanner_test.go +++ b/src/cmd/compile/internal/syntax/scanner_test.go @@ -45,15 +45,17 @@ func TestTokens(t *testing.T) { // make source var buf bytes.Buffer for i, s := range sampleTokens { - buf.WriteString("\t\t\t\t"[:i&3]) // leading indentation - buf.WriteString(s.src) // token - buf.WriteString(" "[:i&7]) // trailing spaces - buf.WriteString("/*line foo:1 */ // bar\n") // comments (don't crash w/o directive handler) + buf.WriteString("\t\t\t\t"[:i&3]) // leading indentation + buf.WriteString(s.src) // token + buf.WriteString(" "[:i&7]) // trailing spaces + fmt.Fprintf(&buf, "/*line foo:%d */ // bar\n", i+linebase) // comments (don't crash w/o directive handler) } // scan source var got scanner - got.init(&buf, nil, 0) + got.init(&buf, func(line, col uint, msg string) { + t.Fatalf("%d:%d: %s", line, col, msg) + }, 0) got.next() for i, want := range sampleTokens { nlsemi := false @@ -140,8 +142,16 @@ var sampleTokens = [...]struct { {_Literal, "12345", 0, 0}, {_Literal, "123456789012345678890123456789012345678890", 0, 0}, {_Literal, "01234567", 0, 0}, - {_Literal, "0x0", 0, 0}, + {_Literal, "0_1_234_567", 0, 0}, + {_Literal, "0X0", 0, 0}, {_Literal, "0xcafebabe", 0, 0}, + {_Literal, "0x_cafe_babe", 0, 0}, + {_Literal, "0O0", 0, 0}, + {_Literal, "0o000", 0, 0}, + {_Literal, "0o_000", 0, 0}, + {_Literal, "0B1", 0, 0}, + {_Literal, "0b01100110", 0, 0}, + {_Literal, "0b_0110_0110", 0, 0}, {_Literal, "0.", 0, 0}, {_Literal, "0.e0", 0, 0}, {_Literal, "0.e-1", 0, 0}, @@ -323,6 +333,202 @@ func TestComments(t *testing.T) { } } +func TestNumbers(t *testing.T) { + for _, test := range []struct { + kind LitKind + src, tokens, err string + }{ + // binaries + {IntLit, "0b0", "0b0", ""}, + {IntLit, "0b1010", "0b1010", ""}, + {IntLit, "0B1110", "0B1110", ""}, + + {IntLit, "0b", "0b", "binary literal has no digits"}, + {IntLit, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, + {IntLit, "0b01a0", "0b01 a0", ""}, // only accept 0-9 + + // binary floats and imaginaries (invalid) + {FloatLit, "0b.", "0b.", "invalid radix point in binary literal"}, + {FloatLit, "0b.1", "0b.1", "invalid radix point in binary literal"}, + {FloatLit, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, + {FloatLit, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, + {FloatLit, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, + {ImagLit, "0b10i", "0b10i", "invalid suffix 'i' on binary literal"}, + + // octals + {IntLit, "0o0", "0o0", ""}, + {IntLit, "0o1234", "0o1234", ""}, + {IntLit, "0O1234", "0O1234", ""}, + + {IntLit, "0o", "0o", "octal literal has no digits"}, + {IntLit, "0o8123", "0o8123", "invalid digit '8' in octal literal"}, + {IntLit, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, + {IntLit, "0o12a3", "0o12 a3", ""}, // only accept 0-9 + + // octal floats and imaginaries (invalid) + {FloatLit, "0o.", "0o.", "invalid radix point in octal literal"}, + {FloatLit, "0o.2", "0o.2", "invalid radix point in octal literal"}, + {FloatLit, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, + {FloatLit, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, + {FloatLit, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, + {ImagLit, "0o10i", "0o10i", "invalid suffix 'i' on octal literal"}, + + // 0-octals + {IntLit, "0", "0", ""}, + {IntLit, "0123", "0123", ""}, + + {IntLit, "08123", "08123", "invalid digit '8' in octal literal"}, + {IntLit, "01293", "01293", "invalid digit '9' in octal literal"}, + {IntLit, "0F.", "0 F .", ""}, // only accept 0-9 + {IntLit, "0123F.", "0123 F .", ""}, + {IntLit, "0123456x", "0123456 x", ""}, + + // decimals + {IntLit, "1", "1", ""}, + {IntLit, "1234", "1234", ""}, + + {IntLit, "1f", "1 f", ""}, // only accept 0-9 + + // decimal floats + {FloatLit, "0.", "0.", ""}, + {FloatLit, "123.", "123.", ""}, + {FloatLit, "0123.", "0123.", ""}, + + {FloatLit, ".0", ".0", ""}, + {FloatLit, ".123", ".123", ""}, + {FloatLit, ".0123", ".0123", ""}, + + {FloatLit, "0.0", "0.0", ""}, + {FloatLit, "123.123", "123.123", ""}, + {FloatLit, "0123.0123", "0123.0123", ""}, + + {FloatLit, "0e0", "0e0", ""}, + {FloatLit, "123e+0", "123e+0", ""}, + {FloatLit, "0123E-1", "0123E-1", ""}, + + {FloatLit, "0.e+1", "0.e+1", ""}, + {FloatLit, "123.E-10", "123.E-10", ""}, + {FloatLit, "0123.e123", "0123.e123", ""}, + + {FloatLit, ".0e-1", ".0e-1", ""}, + {FloatLit, ".123E+10", ".123E+10", ""}, + {FloatLit, ".0123E123", ".0123E123", ""}, + + {FloatLit, "0.0e1", "0.0e1", ""}, + {FloatLit, "123.123E-10", "123.123E-10", ""}, + {FloatLit, "0123.0123e+456", "0123.0123e+456", ""}, + + {FloatLit, "0e", "0e", "exponent has no digits"}, + {FloatLit, "0E+", "0E+", "exponent has no digits"}, + {FloatLit, "1e+f", "1e+ f", "exponent has no digits"}, + {FloatLit, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, + {FloatLit, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, + + // decimal imaginaries + {ImagLit, "0.i", "0.i", ""}, + {ImagLit, ".123i", ".123i", ""}, + {ImagLit, "123.123i", "123.123i", ""}, + {ImagLit, "123e+0i", "123e+0i", ""}, + {ImagLit, "123.E-10i", "123.E-10i", ""}, + {ImagLit, ".123E+10i", ".123E+10i", ""}, + + // hexadecimals + {IntLit, "0x0", "0x0", ""}, + {IntLit, "0x1234", "0x1234", ""}, + {IntLit, "0xcafef00d", "0xcafef00d", ""}, + {IntLit, "0XCAFEF00D", "0XCAFEF00D", ""}, + + {IntLit, "0x", "0x", "hexadecimal literal has no digits"}, + {IntLit, "0x1g", "0x1 g", ""}, + + // hexadecimal floats + {FloatLit, "0x0p0", "0x0p0", ""}, + {FloatLit, "0x12efp-123", "0x12efp-123", ""}, + {FloatLit, "0xABCD.p+0", "0xABCD.p+0", ""}, + {FloatLit, "0x.0189P-0", "0x.0189P-0", ""}, + {FloatLit, "0x1.ffffp+1023", "0x1.ffffp+1023", ""}, + + {FloatLit, "0x.", "0x.", "hexadecimal literal has no digits"}, + {FloatLit, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"}, + {FloatLit, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"}, + {FloatLit, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"}, + {FloatLit, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"}, + {FloatLit, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"}, + {FloatLit, "0x0p", "0x0p", "exponent has no digits"}, + {FloatLit, "0xeP-", "0xeP-", "exponent has no digits"}, + {FloatLit, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, + {FloatLit, "0x1.2p1a", "0x1.2p1 a", ""}, + + // hexadecimal imaginaries (invalid) + {ImagLit, "0xf00i", "0xf00i", "invalid suffix 'i' on hexadecimal literal"}, + {ImagLit, "0xf00.bap+12i", "0xf00.bap+12i", "invalid suffix 'i' on hexadecimal literal"}, + + // separators + {IntLit, "0b_1000_0001", "0b_1000_0001", ""}, + {IntLit, "0o_600", "0o_600", ""}, + {IntLit, "0_466", "0_466", ""}, + {IntLit, "1_000", "1_000", ""}, + {FloatLit, "1_000.000_1", "1_000.000_1", ""}, + {ImagLit, "10e+1_2_3i", "10e+1_2_3i", ""}, + {IntLit, "0x_f00d", "0x_f00d", ""}, + {FloatLit, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""}, + + {IntLit, "0b__1000", "0b__1000", "'_' must separate successive digits"}, + {IntLit, "0o60___0", "0o60___0", "'_' must separate successive digits"}, + {IntLit, "0466_", "0466_", "'_' must separate successive digits"}, + {FloatLit, "1_.", "1_.", "'_' must separate successive digits"}, + {FloatLit, "0._1", "0._1", "'_' must separate successive digits"}, + {FloatLit, "2.7_e0", "2.7_e0", "'_' must separate successive digits"}, + {ImagLit, "10e+12_i", "10e+12_i", "'_' must separate successive digits"}, + {IntLit, "0x___0", "0x___0", "'_' must separate successive digits"}, + {FloatLit, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"}, + } { + var s scanner + var err string + s.init(strings.NewReader(test.src), func(_, _ uint, msg string) { + if err == "" { + err = msg + } + }, 0) + + for i, want := range strings.Split(test.tokens, " ") { + err = "" + s.next() + + // compute lit where where s.lit is not defined + var lit string + switch s.tok { + case _Name, _Literal: + lit = s.lit + case _Dot: + lit = "." + } + + if i == 0 { + if s.tok != _Literal || s.kind != test.kind { + t.Errorf("%q: got token %s (kind = %d); want literal (kind = %d)", test.src, s.tok, s.kind, test.kind) + } + if err != test.err { + t.Errorf("%q: got error %q; want %q", test.src, err, test.err) + } + } + + if lit != want { + t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, s.tok, want) + } + } + + // make sure we read all + s.next() + if s.tok == _Semi { + s.next() + } + if s.tok != _EOF { + t.Errorf("%q: got %s; want EOF", test.src, s.tok) + } + } +} + func TestScanErrors(t *testing.T) { for _, test := range []struct { src, msg string @@ -345,12 +551,10 @@ func TestScanErrors(t *testing.T) { {"x + ~y", "invalid character U+007E '~'", 0, 4}, {"foo$bar = 0", "invalid character U+0024 '$'", 0, 3}, - {"const x = 0xyz", "malformed hex constant", 0, 12}, - {"0123456789", "malformed octal constant", 0, 10}, + {"0123456789", "invalid digit '8' in octal literal", 0, 8}, {"0123456789. /* foobar", "comment not terminated", 0, 12}, // valid float constant {"0123456789e0 /*\nfoobar", "comment not terminated", 0, 13}, // valid float constant - {"var a, b = 08, 07\n", "malformed octal constant", 0, 13}, - {"(x + 1.0e+x)", "malformed floating-point constant exponent", 0, 10}, + {"var a, b = 09, 07\n", "invalid digit '9' in octal literal", 0, 12}, {`''`, "empty character literal or unescaped ' in character literal", 0, 1}, {"'\n", "newline in character literal", 0, 1}, diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index 84908fd190..b63fcc43b0 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -155,6 +155,7 @@ func TestStdTest(t *testing.T) { } testTestDir(t, filepath.Join(runtime.GOROOT(), "test"), + "literal2.go", // go/scanner cannot handle new number literals yet - TODO(gri) enable once fixed "cmplxdivide.go", // also needs file cmplxdivide1.go - ignore ) } diff --git a/test/fixedbugs/issue9036.go b/test/fixedbugs/issue9036.go index 75ffb2ddef..38f06c30c8 100644 --- a/test/fixedbugs/issue9036.go +++ b/test/fixedbugs/issue9036.go @@ -4,7 +4,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Expects to see error messages on 'p' exponents. +// Expects to see error messages on 'p' exponents +// for non-hexadecimal floats. package main @@ -16,16 +17,9 @@ const ( x3 = 0x1e10 // integer (e is a hex digit) ) -// 'p' exponents are invalid - the 'p' is not considered -// part of a floating-point number, but introduces a new -// (unexpected) name. -// -// Error recovery is not ideal and we use a new declaration -// each time for the parser to recover. - -const x4 = 0x1p10 // ERROR "unexpected p10" -const x5 = 1p10 // ERROR "unexpected p10" -const x6 = 0p0 // ERROR "unexpected p0" +const x4 = 0x1p10 // valid hexadecimal float +const x5 = 1p10 // ERROR "'p' exponent requires hexadecimal mantissa" +const x6 = 0P0 // ERROR "'P' exponent requires hexadecimal mantissa" func main() { fmt.Printf("%g %T\n", x1, x1) diff --git a/test/literal2.go b/test/literal2.go new file mode 100644 index 0000000000..dbe22a012e --- /dev/null +++ b/test/literal2.go @@ -0,0 +1,88 @@ +// run + +// Copyright 2019 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. + +// Test Go2 literal syntax for basic types. +// TODO add more tests + +package main + +import "fmt" + +func assert(cond bool) { + if !cond { + panic("assertion failed") + } +} + +func equal(x, y float64) bool { + if x != y { + fmt.Printf("%g != %g\n", x, y) + return false + } + return true +} + +func main() { + // 0-octals + assert(0_1 == 01) + assert(012 == 012) + assert(0_1_2 == 012) + + // decimals + assert(1_000_000 == 1000000) + + // hexadecimals + assert(0x_1 == 0x1) + assert(0x1_2 == 0x12) + assert(0X_cafe_f00d == 0xcafef00d) + + // octals + assert(0o_1 == 01) + assert(0o12 == 012) + assert(0O_1_2 == 012) + + // binaries + assert(0b_1 == 1) + assert(0b10 == 2) + assert(0b_1_0 == 2) + + // decimal floats + assert(0. == 0.0) + assert(.0 == 0.0) + assert(1_0. == 10.0) + assert(.0_1 == 0.01) + assert(1_0.0_1 == 10.01) + + assert(0.e1_0 == 0.0e10) + assert(.0e1_0 == 0.0e10) + assert(1_0.e1_0 == 10.0e10) + assert(.0_1e1_0 == 0.01e10) + assert(1_0.0_1e1_0 == 10.01e10) + + // hexadecimal floats + assert(equal(0x1p-2, 0.25)) + assert(equal(0x2.p10, 2048.0)) + assert(equal(0x1.Fp+0, 1.9375)) + assert(equal(0X.8p-0, 0.5)) + assert(equal(0X1FFFP-16, 0.1249847412109375)) + assert(equal(0x1.fffffffffffffp1023, 1.7976931348623157e308)) + + assert(equal(0x_1p-2, 0.25)) + assert(equal(0x2.p1_0, 2048.0)) + assert(equal(0x1_0.Fp+0, 16.9375)) + assert(equal(0X_0.8p-0, 0.5)) + assert(equal(0X_1FF_FP-16, 0.1249847412109375)) + assert(equal(0x1.f_ffff_ffff_ffffP1_023, 1.7976931348623157e308)) + + // imaginaries + assert(0i == complex(0, 0)) + assert(09i == complex(0, 9)) // "09i" is a decimal int followed by "i" + assert(1.2e+3i == complex(0, 1.2e+3)) + + assert(0_0i == complex(0, 0)) + assert(0_9i == complex(0, 9)) // "0_9i" is a decimal int followed by "i" + assert(1.2_0e+0_3i == complex(0, 1.2e+3)) +} -- GitLab From 42e0cc604661f39baa28124247a9bac1d98fc0bb Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 28 Jan 2019 15:29:23 -0800 Subject: [PATCH 0004/1679] go/scanner: accept new Go2 number literals This CL introduces go/scanner support for the new binary and octal integer literals, hexadecimal floats, and digit separators for all number literals. The new code is closely mirroring the respective code for number literals in cmd/compile/internal/syntax/scanner.go. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: I5315c6aaa7cfc41a618296be20e3acd5114d6b3c Reviewed-on: https://go-review.googlesource.com/c/159997 Reviewed-by: Ian Lance Taylor Reviewed-by: Russ Cox --- src/go/scanner/scanner.go | 239 +++++++++++++++++++++++---------- src/go/scanner/scanner_test.go | 206 +++++++++++++++++++++++++++- 2 files changed, 367 insertions(+), 78 deletions(-) diff --git a/src/go/scanner/scanner.go b/src/go/scanner/scanner.go index e78abf12a2..9e85d4898a 100644 --- a/src/go/scanner/scanner.go +++ b/src/go/scanner/scanner.go @@ -150,6 +150,10 @@ func (s *Scanner) error(offs int, msg string) { s.ErrorCount++ } +func (s *Scanner) errorf(offs int, format string, args ...interface{}) { + s.error(offs, fmt.Sprintf(format, args...)) +} + func (s *Scanner) scanComment() string { // initial '/' already consumed; s.ch == '/' || s.ch == '*' offs := s.offset - 1 // position of initial '/' @@ -336,11 +340,11 @@ func (s *Scanner) findLineEnd() bool { } func isLetter(ch rune) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= utf8.RuneSelf && unicode.IsLetter(ch) + return 'a' <= lower(ch) && lower(ch) <= 'z' || ch == '_' || ch >= utf8.RuneSelf && unicode.IsLetter(ch) } func isDigit(ch rune) bool { - return '0' <= ch && ch <= '9' || ch >= utf8.RuneSelf && unicode.IsDigit(ch) + return isDecimal(ch) || ch >= utf8.RuneSelf && unicode.IsDigit(ch) } func (s *Scanner) scanIdentifier() string { @@ -355,95 +359,188 @@ func digitVal(ch rune) int { switch { case '0' <= ch && ch <= '9': return int(ch - '0') - case 'a' <= ch && ch <= 'f': - return int(ch - 'a' + 10) - case 'A' <= ch && ch <= 'F': - return int(ch - 'A' + 10) + case 'a' <= lower(ch) && lower(ch) <= 'f': + return int(lower(ch) - 'a' + 10) } return 16 // larger than any legal digit val } -func (s *Scanner) scanMantissa(base int) { - for digitVal(s.ch) < base { - s.next() +func lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter +func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } +func isHex(ch rune) bool { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' } + +// digits accepts the sequence { digit | '_' }. +// If base <= 10, digits accepts any decimal digit but records +// the offset (relative to the source start) of a digit >= base +// in *invalid, if *invalid < 0. +// digits returns a bitset describing whether the sequence contained +// digits (bit 0 is set), or separators '_' (bit 1 is set). +func (s *Scanner) digits(base int, invalid *int) (digsep int) { + if base <= 10 { + max := rune('0' + base) + for isDecimal(s.ch) || s.ch == '_' { + ds := 1 + if s.ch == '_' { + ds = 2 + } else if s.ch >= max && *invalid < 0 { + *invalid = int(s.offset) // record invalid rune offset + } + digsep |= ds + s.next() + } + } else { + for isHex(s.ch) || s.ch == '_' { + ds := 1 + if s.ch == '_' { + ds = 2 + } + digsep |= ds + s.next() + } } + return } -func (s *Scanner) scanNumber(seenDecimalPoint bool) (token.Token, string) { - // digitVal(s.ch) < 10 +func (s *Scanner) scanNumber() (token.Token, string) { offs := s.offset - tok := token.INT + tok := token.ILLEGAL - if seenDecimalPoint { - offs-- - tok = token.FLOAT - s.scanMantissa(10) - goto exponent - } + base := 10 // number base + prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b' + digsep := 0 // bit 0: digit present, bit 1: '_' present + invalid := -1 // index of invalid digit in literal, or < 0 - if s.ch == '0' { - // int or float - offs := s.offset - s.next() - if s.ch == 'x' || s.ch == 'X' { - // hexadecimal int + // integer part + if s.ch != '.' { + tok = token.INT + if s.ch == '0' { s.next() - s.scanMantissa(16) - if s.offset-offs <= 2 { - // only scanned "0x" or "0X" - s.error(offs, "illegal hexadecimal number") - } - } else { - // octal int or float - seenDecimalDigit := false - s.scanMantissa(8) - if s.ch == '8' || s.ch == '9' { - // illegal octal int or float - seenDecimalDigit = true - s.scanMantissa(10) - } - if s.ch == '.' || s.ch == 'e' || s.ch == 'E' || s.ch == 'i' { - goto fraction - } - // octal int - if seenDecimalDigit { - s.error(offs, "illegal octal number") + switch lower(s.ch) { + case 'x': + s.next() + base, prefix = 16, 'x' + case 'o': + s.next() + base, prefix = 8, 'o' + case 'b': + s.next() + base, prefix = 2, 'b' + default: + base, prefix = 8, '0' + digsep = 1 // leading 0 } } - goto exit + digsep |= s.digits(base, &invalid) } - // decimal int or float - s.scanMantissa(10) - -fraction: + // fractional part if s.ch == '.' { tok = token.FLOAT + if prefix == 'o' || prefix == 'b' { + s.error(s.offset, "invalid radix point in "+litname(prefix)) + } s.next() - s.scanMantissa(10) + digsep |= s.digits(base, &invalid) } -exponent: - if s.ch == 'e' || s.ch == 'E' { - tok = token.FLOAT + if digsep&1 == 0 { + s.error(s.offset, litname(prefix)+" has no digits") + } + + // exponent + if e := lower(s.ch); e == 'e' || e == 'p' { + switch { + case e == 'e' && prefix != 0 && prefix != '0': + s.errorf(s.offset, "%q exponent requires decimal mantissa", s.ch) + case e == 'p' && prefix != 'x': + s.errorf(s.offset, "%q exponent requires hexadecimal mantissa", s.ch) + } s.next() - if s.ch == '-' || s.ch == '+' { + tok = token.FLOAT + if s.ch == '+' || s.ch == '-' { s.next() } - if digitVal(s.ch) < 10 { - s.scanMantissa(10) - } else { - s.error(offs, "illegal floating-point exponent") + ds := s.digits(10, nil) + digsep |= ds + if ds&1 == 0 { + s.error(s.offset, "exponent has no digits") } + } else if prefix == 'x' && tok == token.FLOAT { + s.error(s.offset, "hexadecimal mantissa requires a 'p' exponent") } + // suffix 'i' if s.ch == 'i' { tok = token.IMAG + if prefix != 0 && prefix != '0' { + s.error(s.offset, "invalid suffix 'i' on "+litname(prefix)) + } s.next() } -exit: - return tok, string(s.src[offs:s.offset]) + lit := string(s.src[offs:s.offset]) + if tok == token.INT && invalid >= 0 { + s.errorf(invalid, "invalid digit %q in %s", lit[invalid-offs], litname(prefix)) + } + if digsep&2 != 0 { + if i := invalidSep(lit); i >= 0 { + s.error(offs+i, "'_' must separate successive digits") + } + } + + return tok, lit +} + +func litname(prefix rune) string { + switch prefix { + case 'x': + return "hexadecimal literal" + case 'o', '0': + return "octal literal" + case 'b': + return "binary literal" + } + return "decimal literal" +} + +// invalidSep returns the index of the first invalid separator in x, or -1. +func invalidSep(x string) int { + x1 := ' ' // prefix char, we only care if it's 'x' + d := '.' // digit, one of '_', '0' (a digit), or '.' (anything else) + i := 0 + + // a prefix counts as a digit + if len(x) >= 2 && x[0] == '0' { + x1 = lower(rune(x[1])) + if x1 == 'x' || x1 == 'o' || x1 == 'b' { + d = '0' + i = 2 + } + } + + // mantissa and exponent + for ; i < len(x); i++ { + p := d // previous digit + d = rune(x[i]) + switch { + case d == '_': + if p != '0' { + return i + } + case isDecimal(d) || x1 == 'x' && isHex(d): + d = '0' + default: + if p == '_' { + return i - 1 + } + d = '.' + } + } + if d == '_' { + return len(x) - 1 + } + + return -1 } // scanEscape parses an escape sequence where rune is the accepted @@ -708,9 +805,9 @@ scanAgain: insertSemi = true tok = token.IDENT } - case '0' <= ch && ch <= '9': + case isDecimal(ch) || ch == '.' && isDecimal(rune(s.peek())): insertSemi = true - tok, lit = s.scanNumber(false) + tok, lit = s.scanNumber() default: s.next() // always make progress switch ch { @@ -741,16 +838,12 @@ scanAgain: case ':': tok = s.switch2(token.COLON, token.DEFINE) case '.': - if '0' <= s.ch && s.ch <= '9' { - insertSemi = true - tok, lit = s.scanNumber(true) - } else { - tok = token.PERIOD - if s.ch == '.' && s.peek() == '.' { - s.next() - s.next() // consume last '.' - tok = token.ELLIPSIS - } + // fractions starting with a '.' are handled by outer switch + tok = token.PERIOD + if s.ch == '.' && s.peek() == '.' { + s.next() + s.next() // consume last '.' + tok = token.ELLIPSIS } case ',': tok = token.COMMA @@ -835,7 +928,7 @@ scanAgain: default: // next reports unexpected BOMs - don't repeat if ch != bom { - s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch)) + s.errorf(s.file.Offset(pos), "illegal character %#U", ch) } insertSemi = s.insertSemi // preserve insertSemi info tok = token.ILLEGAL diff --git a/src/go/scanner/scanner_test.go b/src/go/scanner/scanner_test.go index 36c962209c..1d6865f198 100644 --- a/src/go/scanner/scanner_test.go +++ b/src/go/scanner/scanner_test.go @@ -10,6 +10,7 @@ import ( "os" "path/filepath" "runtime" + "strings" "testing" ) @@ -802,11 +803,10 @@ var errors = []struct { {"078.", token.FLOAT, 0, "078.", ""}, {"07801234567.", token.FLOAT, 0, "07801234567.", ""}, {"078e0", token.FLOAT, 0, "078e0", ""}, - {"0E", token.FLOAT, 0, "0E", "illegal floating-point exponent"}, // issue 17621 - {"078", token.INT, 0, "078", "illegal octal number"}, - {"07800000009", token.INT, 0, "07800000009", "illegal octal number"}, - {"0x", token.INT, 0, "0x", "illegal hexadecimal number"}, - {"0X", token.INT, 0, "0X", "illegal hexadecimal number"}, + {"0E", token.FLOAT, 2, "0E", "exponent has no digits"}, // issue 17621 + {"078", token.INT, 2, "078", "invalid digit '8' in octal literal"}, + {"07090000008", token.INT, 3, "07090000008", "invalid digit '9' in octal literal"}, + {"0x", token.INT, 2, "0x", "hexadecimal literal has no digits"}, {"\"abc\x00def\"", token.STRING, 4, "\"abc\x00def\"", "illegal character NUL"}, {"\"abc\x80def\"", token.STRING, 4, "\"abc\x80def\"", "illegal UTF-8 encoding"}, {"\ufeff\ufeff", token.ILLEGAL, 3, "\ufeff\ufeff", "illegal byte order mark"}, // only first BOM is ignored @@ -912,3 +912,199 @@ func BenchmarkScanFile(b *testing.B) { } } } + +func TestNumbers(t *testing.T) { + for _, test := range []struct { + tok token.Token + src, tokens, err string + }{ + // binaries + {token.INT, "0b0", "0b0", ""}, + {token.INT, "0b1010", "0b1010", ""}, + {token.INT, "0B1110", "0B1110", ""}, + + {token.INT, "0b", "0b", "binary literal has no digits"}, + {token.INT, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, + {token.INT, "0b01a0", "0b01 a0", ""}, // only accept 0-9 + + // binary floats and imaginaries (invalid) + {token.FLOAT, "0b.", "0b.", "invalid radix point in binary literal"}, + {token.FLOAT, "0b.1", "0b.1", "invalid radix point in binary literal"}, + {token.FLOAT, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, + {token.FLOAT, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, + {token.FLOAT, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, + {token.IMAG, "0b10i", "0b10i", "invalid suffix 'i' on binary literal"}, + + // octals + {token.INT, "0o0", "0o0", ""}, + {token.INT, "0o1234", "0o1234", ""}, + {token.INT, "0O1234", "0O1234", ""}, + + {token.INT, "0o", "0o", "octal literal has no digits"}, + {token.INT, "0o8123", "0o8123", "invalid digit '8' in octal literal"}, + {token.INT, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, + {token.INT, "0o12a3", "0o12 a3", ""}, // only accept 0-9 + + // octal floats and imaginaries (invalid) + {token.FLOAT, "0o.", "0o.", "invalid radix point in octal literal"}, + {token.FLOAT, "0o.2", "0o.2", "invalid radix point in octal literal"}, + {token.FLOAT, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, + {token.FLOAT, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, + {token.FLOAT, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, + {token.IMAG, "0o10i", "0o10i", "invalid suffix 'i' on octal literal"}, + + // 0-octals + {token.INT, "0", "0", ""}, + {token.INT, "0123", "0123", ""}, + + {token.INT, "08123", "08123", "invalid digit '8' in octal literal"}, + {token.INT, "01293", "01293", "invalid digit '9' in octal literal"}, + {token.INT, "0F.", "0 F .", ""}, // only accept 0-9 + {token.INT, "0123F.", "0123 F .", ""}, + {token.INT, "0123456x", "0123456 x", ""}, + + // decimals + {token.INT, "1", "1", ""}, + {token.INT, "1234", "1234", ""}, + + {token.INT, "1f", "1 f", ""}, // only accept 0-9 + + // decimal floats + {token.FLOAT, "0.", "0.", ""}, + {token.FLOAT, "123.", "123.", ""}, + {token.FLOAT, "0123.", "0123.", ""}, + + {token.FLOAT, ".0", ".0", ""}, + {token.FLOAT, ".123", ".123", ""}, + {token.FLOAT, ".0123", ".0123", ""}, + + {token.FLOAT, "0.0", "0.0", ""}, + {token.FLOAT, "123.123", "123.123", ""}, + {token.FLOAT, "0123.0123", "0123.0123", ""}, + + {token.FLOAT, "0e0", "0e0", ""}, + {token.FLOAT, "123e+0", "123e+0", ""}, + {token.FLOAT, "0123E-1", "0123E-1", ""}, + + {token.FLOAT, "0.e+1", "0.e+1", ""}, + {token.FLOAT, "123.E-10", "123.E-10", ""}, + {token.FLOAT, "0123.e123", "0123.e123", ""}, + + {token.FLOAT, ".0e-1", ".0e-1", ""}, + {token.FLOAT, ".123E+10", ".123E+10", ""}, + {token.FLOAT, ".0123E123", ".0123E123", ""}, + + {token.FLOAT, "0.0e1", "0.0e1", ""}, + {token.FLOAT, "123.123E-10", "123.123E-10", ""}, + {token.FLOAT, "0123.0123e+456", "0123.0123e+456", ""}, + + {token.FLOAT, "0e", "0e", "exponent has no digits"}, + {token.FLOAT, "0E+", "0E+", "exponent has no digits"}, + {token.FLOAT, "1e+f", "1e+ f", "exponent has no digits"}, + {token.FLOAT, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, + {token.FLOAT, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, + + // decimal imaginaries + {token.IMAG, "0.i", "0.i", ""}, + {token.IMAG, ".123i", ".123i", ""}, + {token.IMAG, "123.123i", "123.123i", ""}, + {token.IMAG, "123e+0i", "123e+0i", ""}, + {token.IMAG, "123.E-10i", "123.E-10i", ""}, + {token.IMAG, ".123E+10i", ".123E+10i", ""}, + + // hexadecimals + {token.INT, "0x0", "0x0", ""}, + {token.INT, "0x1234", "0x1234", ""}, + {token.INT, "0xcafef00d", "0xcafef00d", ""}, + {token.INT, "0XCAFEF00D", "0XCAFEF00D", ""}, + + {token.INT, "0x", "0x", "hexadecimal literal has no digits"}, + {token.INT, "0x1g", "0x1 g", ""}, + + // hexadecimal floats + {token.FLOAT, "0x0p0", "0x0p0", ""}, + {token.FLOAT, "0x12efp-123", "0x12efp-123", ""}, + {token.FLOAT, "0xABCD.p+0", "0xABCD.p+0", ""}, + {token.FLOAT, "0x.0189P-0", "0x.0189P-0", ""}, + {token.FLOAT, "0x1.ffffp+1023", "0x1.ffffp+1023", ""}, + + {token.FLOAT, "0x.", "0x.", "hexadecimal literal has no digits"}, + {token.FLOAT, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"}, + {token.FLOAT, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"}, + {token.FLOAT, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"}, + {token.FLOAT, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"}, + {token.FLOAT, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"}, + {token.FLOAT, "0x0p", "0x0p", "exponent has no digits"}, + {token.FLOAT, "0xeP-", "0xeP-", "exponent has no digits"}, + {token.FLOAT, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, + {token.FLOAT, "0x1.2p1a", "0x1.2p1 a", ""}, + + // hexadecimal imaginaries (invalid) + {token.IMAG, "0xf00i", "0xf00i", "invalid suffix 'i' on hexadecimal literal"}, + {token.IMAG, "0xf00.bap+12i", "0xf00.bap+12i", "invalid suffix 'i' on hexadecimal literal"}, + + // separators + {token.INT, "0b_1000_0001", "0b_1000_0001", ""}, + {token.INT, "0o_600", "0o_600", ""}, + {token.INT, "0_466", "0_466", ""}, + {token.INT, "1_000", "1_000", ""}, + {token.FLOAT, "1_000.000_1", "1_000.000_1", ""}, + {token.IMAG, "10e+1_2_3i", "10e+1_2_3i", ""}, + {token.INT, "0x_f00d", "0x_f00d", ""}, + {token.FLOAT, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""}, + + {token.INT, "0b__1000", "0b__1000", "'_' must separate successive digits"}, + {token.INT, "0o60___0", "0o60___0", "'_' must separate successive digits"}, + {token.INT, "0466_", "0466_", "'_' must separate successive digits"}, + {token.FLOAT, "1_.", "1_.", "'_' must separate successive digits"}, + {token.FLOAT, "0._1", "0._1", "'_' must separate successive digits"}, + {token.FLOAT, "2.7_e0", "2.7_e0", "'_' must separate successive digits"}, + {token.IMAG, "10e+12_i", "10e+12_i", "'_' must separate successive digits"}, + {token.INT, "0x___0", "0x___0", "'_' must separate successive digits"}, + {token.FLOAT, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"}, + } { + var s Scanner + var err string + s.Init(fset.AddFile("", fset.Base(), len(test.src)), []byte(test.src), func(_ token.Position, msg string) { + if err == "" { + err = msg + } + }, 0) + for i, want := range strings.Split(test.tokens, " ") { + err = "" + _, tok, lit := s.Scan() + + // compute lit where for tokens where lit is not defined + switch tok { + case token.PERIOD: + lit = "." + case token.ADD: + lit = "+" + case token.SUB: + lit = "-" + } + + if i == 0 { + if tok != test.tok { + t.Errorf("%q: got token %s; want %s", test.src, tok, test.tok) + } + if err != test.err { + t.Errorf("%q: got error %q; want %q", test.src, err, test.err) + } + } + + if lit != want { + t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, tok, want) + } + } + + // make sure we read all + _, tok, _ := s.Scan() + if tok == token.SEMICOLON { + _, tok, _ = s.Scan() + } + if tok != token.EOF { + t.Errorf("%q: got %s; want EOF", test.src, tok) + } + } +} -- GitLab From 149d9de4b1e50d9f671c79264075f72fa01343e5 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 28 Jan 2019 16:33:49 -0800 Subject: [PATCH 0005/1679] cmd/gofmt: test that Go 2 number literals can be formatted R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: Icd25aa7f6e18ed671ea6cf2b1b292899daf4b1a5 Reviewed-on: https://go-review.googlesource.com/c/160018 Reviewed-by: Russ Cox --- src/cmd/gofmt/testdata/go2numbers.golden | 156 +++++++++++++++++++++++ src/cmd/gofmt/testdata/go2numbers.input | 156 +++++++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 src/cmd/gofmt/testdata/go2numbers.golden create mode 100644 src/cmd/gofmt/testdata/go2numbers.input diff --git a/src/cmd/gofmt/testdata/go2numbers.golden b/src/cmd/gofmt/testdata/go2numbers.golden new file mode 100644 index 0000000000..a227a58362 --- /dev/null +++ b/src/cmd/gofmt/testdata/go2numbers.golden @@ -0,0 +1,156 @@ +package p + +const ( + _ = 0 + _ = 0123 + _ = 0123456 + + _ = 0_123 + _ = 0123_456 + + // decimals + _ = 1 + _ = 1234 + _ = 1234567 + + _ = 1_234 + _ = 1_234_567 + + // hexadecimals + _ = 0x0 + _ = 0x1234 + _ = 0xcafef00d + + _ = 0X0 + _ = 0X1234 + _ = 0XCAFEf00d + + _ = 0X_0 + _ = 0X_1234 + _ = 0X_CAFE_f00d + + // octals + _ = 0o0 + _ = 0o1234 + _ = 0o01234567 + + _ = 0O0 + _ = 0O1234 + _ = 0O01234567 + + _ = 0o_0 + _ = 0o_1234 + _ = 0o0123_4567 + + _ = 0O_0 + _ = 0O_1234 + _ = 0O0123_4567 + + // binaries + _ = 0b0 + _ = 0b1011 + _ = 0b00101101 + + _ = 0B0 + _ = 0B1011 + _ = 0B00101101 + + _ = 0b_0 + _ = 0b10_11 + _ = 0b_0010_1101 + + // decimal floats + _ = 0. + _ = 123. + _ = 0123. + + _ = .0 + _ = .123 + _ = .0123 + + _ = 0e0 + _ = 123e+0 + _ = 0123E-1 + + _ = 0e-0 + _ = 123E+0 + _ = 0123E123 + + _ = 0.e+1 + _ = 123.E-10 + _ = 0123.e123 + + _ = .0e-1 + _ = .123E+10 + _ = .0123E123 + + _ = 0.0 + _ = 123.123 + _ = 0123.0123 + + _ = 0.0e1 + _ = 123.123E-10 + _ = 0123.0123e+456 + + _ = 1_2_3. + _ = 0_123. + + _ = 0_0e0 + _ = 1_2_3e0 + _ = 0_123e0 + + _ = 0e-0_0 + _ = 1_2_3E+0 + _ = 0123E1_2_3 + + _ = 0.e+1 + _ = 123.E-1_0 + _ = 01_23.e123 + + _ = .0e-1 + _ = .123E+10 + _ = .0123E123 + + _ = 1_2_3.123 + _ = 0123.01_23 + + // hexadecimal floats + _ = 0x0.p+0 + _ = 0Xdeadcafe.p-10 + _ = 0x1234.P123 + + _ = 0x.1p-0 + _ = 0X.deadcafep2 + _ = 0x.1234P+10 + + _ = 0x0p0 + _ = 0Xdeadcafep+1 + _ = 0x1234P-10 + + _ = 0x0.0p0 + _ = 0Xdead.cafep+1 + _ = 0x12.34P-10 + + _ = 0Xdead_cafep+1 + _ = 0x_1234P-10 + + _ = 0X_dead_cafe.p-10 + _ = 0x12_34.P1_2_3 + + // imaginaries + _ = 0i + _ = 00i + _ = 1234i + _ = 1234567i + + _ = 1_234i + _ = 1_234_567i + + _ = 0.i + _ = 123.i + _ = 0123.i + + _ = 0.e+1i + _ = 123.E-1_0i + _ = 01_23.e123i +) diff --git a/src/cmd/gofmt/testdata/go2numbers.input b/src/cmd/gofmt/testdata/go2numbers.input new file mode 100644 index 0000000000..a227a58362 --- /dev/null +++ b/src/cmd/gofmt/testdata/go2numbers.input @@ -0,0 +1,156 @@ +package p + +const ( + _ = 0 + _ = 0123 + _ = 0123456 + + _ = 0_123 + _ = 0123_456 + + // decimals + _ = 1 + _ = 1234 + _ = 1234567 + + _ = 1_234 + _ = 1_234_567 + + // hexadecimals + _ = 0x0 + _ = 0x1234 + _ = 0xcafef00d + + _ = 0X0 + _ = 0X1234 + _ = 0XCAFEf00d + + _ = 0X_0 + _ = 0X_1234 + _ = 0X_CAFE_f00d + + // octals + _ = 0o0 + _ = 0o1234 + _ = 0o01234567 + + _ = 0O0 + _ = 0O1234 + _ = 0O01234567 + + _ = 0o_0 + _ = 0o_1234 + _ = 0o0123_4567 + + _ = 0O_0 + _ = 0O_1234 + _ = 0O0123_4567 + + // binaries + _ = 0b0 + _ = 0b1011 + _ = 0b00101101 + + _ = 0B0 + _ = 0B1011 + _ = 0B00101101 + + _ = 0b_0 + _ = 0b10_11 + _ = 0b_0010_1101 + + // decimal floats + _ = 0. + _ = 123. + _ = 0123. + + _ = .0 + _ = .123 + _ = .0123 + + _ = 0e0 + _ = 123e+0 + _ = 0123E-1 + + _ = 0e-0 + _ = 123E+0 + _ = 0123E123 + + _ = 0.e+1 + _ = 123.E-10 + _ = 0123.e123 + + _ = .0e-1 + _ = .123E+10 + _ = .0123E123 + + _ = 0.0 + _ = 123.123 + _ = 0123.0123 + + _ = 0.0e1 + _ = 123.123E-10 + _ = 0123.0123e+456 + + _ = 1_2_3. + _ = 0_123. + + _ = 0_0e0 + _ = 1_2_3e0 + _ = 0_123e0 + + _ = 0e-0_0 + _ = 1_2_3E+0 + _ = 0123E1_2_3 + + _ = 0.e+1 + _ = 123.E-1_0 + _ = 01_23.e123 + + _ = .0e-1 + _ = .123E+10 + _ = .0123E123 + + _ = 1_2_3.123 + _ = 0123.01_23 + + // hexadecimal floats + _ = 0x0.p+0 + _ = 0Xdeadcafe.p-10 + _ = 0x1234.P123 + + _ = 0x.1p-0 + _ = 0X.deadcafep2 + _ = 0x.1234P+10 + + _ = 0x0p0 + _ = 0Xdeadcafep+1 + _ = 0x1234P-10 + + _ = 0x0.0p0 + _ = 0Xdead.cafep+1 + _ = 0x12.34P-10 + + _ = 0Xdead_cafep+1 + _ = 0x_1234P-10 + + _ = 0X_dead_cafe.p-10 + _ = 0x12_34.P1_2_3 + + // imaginaries + _ = 0i + _ = 00i + _ = 1234i + _ = 1234567i + + _ = 1_234i + _ = 1_234_567i + + _ = 0.i + _ = 123.i + _ = 0123.i + + _ = 0.e+1i + _ = 123.E-1_0i + _ = 01_23.e123i +) -- GitLab From 1f701200d979d550e13f37e9be3da99b5a1304cb Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 29 Jan 2019 15:41:50 -0800 Subject: [PATCH 0006/1679] go/constant: accept new Go2 number literals This CL introduces go/constant support for the new binary and octal integer literals, hexadecimal floats, and digit separators for all number literals. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: I7a55f91b8b6373ae6d98ba923b626d33c5552946 Reviewed-on: https://go-review.googlesource.com/c/160239 Reviewed-by: Russ Cox --- src/go/constant/value.go | 36 ++++++++- src/go/constant/value_test.go | 146 +++++++++++++++++++++++++++++++++- 2 files changed, 179 insertions(+), 3 deletions(-) diff --git a/src/go/constant/value.go b/src/go/constant/value.go index 0982243edb..f7efa95404 100644 --- a/src/go/constant/value.go +++ b/src/go/constant/value.go @@ -315,8 +315,9 @@ func makeFloatFromLiteral(lit string) Value { // but it'll take forever to parse as a Rat. lit = "0" } - r, _ := newRat().SetString(lit) - return ratVal{r} + if r, ok := newRat().SetString(lit); ok { + return ratVal{r} + } } // otherwise use floats return makeFloat(f) @@ -380,8 +381,17 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value { panic("MakeFromLiteral called with non-zero last argument") } + // TODO(gri) Remove stripSep and, for token.INT, 0o-octal handling + // below once strconv and math/big can handle separators + // and 0o-octals. + switch tok { case token.INT: + // TODO(gri) remove 0o-special case once strconv and math/big can handle 0o-octals + lit = stripSep(lit) + if len(lit) >= 2 && lit[0] == '0' && (lit[1] == 'o' || lit[1] == 'O') { + lit = "0" + lit[2:] + } if x, err := strconv.ParseInt(lit, 0, 64); err == nil { return int64Val(x) } @@ -390,11 +400,13 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value { } case token.FLOAT: + lit = stripSep(lit) if x := makeFloatFromLiteral(lit); x != nil { return x } case token.IMAG: + lit = stripSep(lit) if n := len(lit); n > 0 && lit[n-1] == 'i' { if im := makeFloatFromLiteral(lit[:n-1]); im != nil { return makeComplex(int64Val(0), im) @@ -420,6 +432,26 @@ func MakeFromLiteral(lit string, tok token.Token, zero uint) Value { return unknownVal{} } +func stripSep(s string) string { + // avoid making a copy if there are no separators (common case) + i := 0 + for i < len(s) && s[i] != '_' { + i++ + } + if i == len(s) { + return s + } + + // make a copy of s without separators + var buf []byte + for i := 0; i < len(s); i++ { + if c := s[i]; c != '_' { + buf = append(buf, c) + } + } + return string(buf) +} + // ---------------------------------------------------------------------------- // Accessors // diff --git a/src/go/constant/value_test.go b/src/go/constant/value_test.go index 68b87eaa55..560712a8f5 100644 --- a/src/go/constant/value_test.go +++ b/src/go/constant/value_test.go @@ -11,7 +11,151 @@ import ( "testing" ) -// TODO(gri) expand this test framework +var intTests = []string{ + // 0-octals + `0_123 = 0123`, + `0123_456 = 0123456`, + + // decimals + `1_234 = 1234`, + `1_234_567 = 1234567`, + + // hexadecimals + `0X_0 = 0`, + `0X_1234 = 0x1234`, + `0X_CAFE_f00d = 0xcafef00d`, + + // octals + `0o0 = 0`, + `0o1234 = 01234`, + `0o01234567 = 01234567`, + + `0O0 = 0`, + `0O1234 = 01234`, + `0O01234567 = 01234567`, + + `0o_0 = 0`, + `0o_1234 = 01234`, + `0o0123_4567 = 01234567`, + + `0O_0 = 0`, + `0O_1234 = 01234`, + `0O0123_4567 = 01234567`, + + // binaries + `0b0 = 0`, + `0b1011 = 0xb`, + `0b00101101 = 0x2d`, + + `0B0 = 0`, + `0B1011 = 0xb`, + `0B00101101 = 0x2d`, + + `0b_0 = 0`, + `0b10_11 = 0xb`, + `0b_0010_1101 = 0x2d`, +} + +// The RHS operand may be a floating-point quotient n/d of two integer values n and d. +var floatTests = []string{ + // decimal floats + `1_2_3. = 123.`, + `0_123. = 123.`, + + `0_0e0 = 0.`, + `1_2_3e0 = 123.`, + `0_123e0 = 123.`, + + `0e-0_0 = 0.`, + `1_2_3E+0 = 123.`, + `0123E1_2_3 = 123e123`, + + `0.e+1 = 0.`, + `123.E-1_0 = 123e-10`, + `01_23.e123 = 123e123`, + + `.0e-1 = .0`, + `.123E+10 = .123e10`, + `.0123E123 = .0123e123`, + + `1_2_3.123 = 123.123`, + `0123.01_23 = 123.0123`, + + // hexadecimal floats + `0x0.p+0 = 0.`, + `0Xdeadcafe.p-10 = 0xdeadcafe/1024`, + `0x1234.P84 = 0x1234000000000000000000000`, + + `0x.1p-0 = 1/16`, + `0X.deadcafep4 = 0xdeadcafe/0x10000000`, + `0x.1234P+12 = 0x1234/0x10`, + + `0x0p0 = 0.`, + `0Xdeadcafep+1 = 0x1bd5b95fc`, + `0x1234P-10 = 0x1234/1024`, + + `0x0.0p0 = 0.`, + `0Xdead.cafep+1 = 0x1bd5b95fc/0x10000`, + `0x12.34P-10 = 0x1234/0x40000`, + + `0Xdead_cafep+1 = 0xdeadcafep+1`, + `0x_1234P-10 = 0x1234p-10`, + + `0X_dead_cafe.p-10 = 0xdeadcafe.p-10`, + `0x12_34.P1_2_3 = 0x1234.p123`, +} + +var imagTests = []string{ + `1_234i = 1234i`, + `1_234_567i = 1234567i`, + + `0.i = 0i`, + `123.i = 123i`, + `0123.i = 123i`, + + `0.e+1i = 0i`, + `123.E-1_0i = 123e-10i`, + `01_23.e123i = 123e123i`, +} + +func testNumbers(t *testing.T, kind token.Token, tests []string) { + for _, test := range tests { + a := strings.Split(test, " = ") + if len(a) != 2 { + t.Errorf("invalid test case: %s", test) + continue + } + + x := MakeFromLiteral(a[0], kind, 0) + var y Value + if i := strings.Index(a[1], "/"); i >= 0 && kind == token.FLOAT { + n := MakeFromLiteral(a[1][:i], token.INT, 0) + d := MakeFromLiteral(a[1][i+1:], token.INT, 0) + y = BinaryOp(n, token.QUO, d) + } else { + y = MakeFromLiteral(a[1], kind, 0) + } + + xk := x.Kind() + yk := y.Kind() + if xk != yk || xk == Unknown { + t.Errorf("%s: got kind %d != %d", test, xk, yk) + continue + } + + if !Compare(x, token.EQL, y) { + t.Errorf("%s: %s != %s", test, x, y) + } + } +} + +// TestNumbers verifies that differently written literals +// representing the same number do have the same value. +func TestNumbers(t *testing.T) { + testNumbers(t, token.INT, intTests) + testNumbers(t, token.FLOAT, floatTests) + testNumbers(t, token.IMAG, imagTests) +} var opTests = []string{ // unary operations -- GitLab From 257f30433b66c0ec992fe36ccd5403580a7cbced Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 29 Jan 2019 16:00:45 -0800 Subject: [PATCH 0007/1679] go/types: add tests for new Go 2 number literals This CL ensures that go/types can now handle the new Go 2 number literals. The relevant changes enabling them in go/types were made in go/constant in the CL https://golang.org/cl/160239. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: I45c1387198fac94769ac59c5301d86b4e1a1ff98 Reviewed-on: https://go-review.googlesource.com/c/160240 Reviewed-by: Russ Cox --- src/go/types/check_test.go | 1 + src/go/types/stdlib_test.go | 1 - src/go/types/testdata/literals.src | 111 +++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/go/types/testdata/literals.src diff --git a/src/go/types/check_test.go b/src/go/types/check_test.go index 45e1fcb605..358e7c5cc8 100644 --- a/src/go/types/check_test.go +++ b/src/go/types/check_test.go @@ -88,6 +88,7 @@ var tests = [][]string{ {"testdata/stmt1.src"}, {"testdata/gotos.src"}, {"testdata/labels.src"}, + {"testdata/literals.src"}, {"testdata/issues.src"}, {"testdata/blank.src"}, {"testdata/issue25008b.src", "testdata/issue25008a.src"}, // order (b before a) is crucial! diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index b63fcc43b0..84908fd190 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -155,7 +155,6 @@ func TestStdTest(t *testing.T) { } testTestDir(t, filepath.Join(runtime.GOROOT(), "test"), - "literal2.go", // go/scanner cannot handle new number literals yet - TODO(gri) enable once fixed "cmplxdivide.go", // also needs file cmplxdivide1.go - ignore ) } diff --git a/src/go/types/testdata/literals.src b/src/go/types/testdata/literals.src new file mode 100644 index 0000000000..494a465f48 --- /dev/null +++ b/src/go/types/testdata/literals.src @@ -0,0 +1,111 @@ +// Copyright 2019 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. + +// This file tests various representations of literals +// and compares them with literals or constant expressions +// of equal values. + +package literals + +func _() { + // 0-octals + assert(0_123 == 0123) + assert(0123_456 == 0123456) + + // decimals + assert(1_234 == 1234) + assert(1_234_567 == 1234567) + + // hexadecimals + assert(0X_0 == 0) + assert(0X_1234 == 0x1234) + assert(0X_CAFE_f00d == 0xcafef00d) + + // octals + assert(0o0 == 0) + assert(0o1234 == 01234) + assert(0o01234567 == 01234567) + + assert(0O0 == 0) + assert(0O1234 == 01234) + assert(0O01234567 == 01234567) + + assert(0o_0 == 0) + assert(0o_1234 == 01234) + assert(0o0123_4567 == 01234567) + + assert(0O_0 == 0) + assert(0O_1234 == 01234) + assert(0O0123_4567 == 01234567) + + // binaries + assert(0b0 == 0) + assert(0b1011 == 0xb) + assert(0b00101101 == 0x2d) + + assert(0B0 == 0) + assert(0B1011 == 0xb) + assert(0B00101101 == 0x2d) + + assert(0b_0 == 0) + assert(0b10_11 == 0xb) + assert(0b_0010_1101 == 0x2d) + + // decimal floats + assert(1_2_3. == 123.) + assert(0_123. == 123.) + + assert(0_0e0 == 0.) + assert(1_2_3e0 == 123.) + assert(0_123e0 == 123.) + + assert(0e-0_0 == 0.) + assert(1_2_3E+0 == 123.) + assert(0123E1_2_3 == 123e123) + + assert(0.e+1 == 0.) + assert(123.E-1_0 == 123e-10) + assert(01_23.e123 == 123e123) + + assert(.0e-1 == .0) + assert(.123E+10 == .123e10) + assert(.0123E123 == .0123e123) + + assert(1_2_3.123 == 123.123) + assert(0123.01_23 == 123.0123) + + // hexadecimal floats + assert(0x0.p+0 == 0.) + assert(0Xdeadcafe.p-10 == 0xdeadcafe/1024.0) + assert(0x1234.P84 == 0x1234000000000000000000000) + + assert(0x.1p-0 == 1./16) + assert(0X.deadcafep4 == 1.0*0xdeadcafe/0x10000000) + assert(0x.1234P+12 == 1.0*0x1234/0x10) + + assert(0x0p0 == 0.) + assert(0Xdeadcafep+1 == 0x1bd5b95fc) + assert(0x1234P-10 == 0x1234/1024.0) + + assert(0x0.0p0 == 0.) + assert(0Xdead.cafep+1 == 1.0*0x1bd5b95fc/0x10000) + assert(0x12.34P-10 == 1.0*0x1234/0x40000) + + assert(0Xdead_cafep+1 == 0xdeadcafep+1) + assert(0x_1234P-10 == 0x1234p-10) + + assert(0X_dead_cafe.p-10 == 0xdeadcafe.p-10) + assert(0x12_34.P1_2_3 == 0x1234.p123) + + assert(1_234i == 1234i) + assert(1_234_567i == 1234567i) + + assert(0.i == 0i) + assert(123.i == 123i) + assert(0123.i == 123i) + + assert(0.e+1i == 0i) + assert(123.E-1_0i == 123e-10i) + assert(01_23.e123i == 123e123i) +} -- GitLab From 69de40c9af9253cc738f4c4ac2a7be37bff5be94 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 29 Jan 2019 22:12:13 -0800 Subject: [PATCH 0008/1679] cmd/gofmt: normalize number prefixes and exponents Rewrite non-decimal number prefixes to always use a lower-case base ("0X" -> "0x", etc.), and rewrite exponents to use a lower-case 'e' or 'p'. Leave hexadecimal digits and 0-octals alone. Comparing the best time of 3 runs of `time go test -run All` with the time for a gofmt that doesn't do the rewrite shows no increase in runtime for this bulk gofmt application (in fact on my machine I see a small decline, probably due to cache effects). R=Go1.13 Updates #12711. Updates #19308. Updates #29008. Change-Id: I9c6ebed2ffa0a6a001c59412a73382090955f5a9 Reviewed-on: https://go-review.googlesource.com/c/160184 Reviewed-by: Ian Lance Taylor --- src/cmd/gofmt/gofmt.go | 47 ++++++++++++++ src/cmd/gofmt/testdata/go2numbers.golden | 80 ++++++++++++------------ src/cmd/gofmt/testdata/go2numbers.input | 2 + 3 files changed, 90 insertions(+), 39 deletions(-) diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index ac6852f2e4..ce4613fb60 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -112,6 +112,8 @@ func processFile(filename string, in io.Reader, out io.Writer, stdin bool) error simplify(file) } + ast.Inspect(file, normalizeNumbers) + res, err := format(fileSet, file, sourceAdj, indentAdj, src, printer.Config{Mode: printerMode, Tabwidth: tabWidth}) if err != nil { return err @@ -326,3 +328,48 @@ func backupFile(filename string, data []byte, perm os.FileMode) (string, error) return bakname, err } + +// normalizeNumbers rewrites base prefixes and exponents to +// use lower-case letters. It leaves hexadecimal digits alone. +func normalizeNumbers(n ast.Node) bool { + lit, _ := n.(*ast.BasicLit) + if lit == nil { + return true + } + if len(lit.Value) < 2 { + return false // only one digit - nothing to do + } + // lit.Value >= 2 + + switch lit.Kind { + case token.INT: + switch lit.Value[:2] { + case "0X": + lit.Value = "0x" + lit.Value[2:] + case "0O": + lit.Value = "0o" + lit.Value[2:] + case "0B": + lit.Value = "0b" + lit.Value[2:] + } + + case token.FLOAT: + switch lit.Value[:2] { + default: + if i := strings.LastIndexByte(lit.Value, 'E'); i >= 0 { + lit.Value = lit.Value[:i] + "e" + lit.Value[i+1:] + } + case "0x": + if i := strings.LastIndexByte(lit.Value, 'P'); i >= 0 { + lit.Value = lit.Value[:i] + "p" + lit.Value[i+1:] + } + case "0X": + if i := strings.LastIndexByte(lit.Value, 'P'); i >= 0 { + lit.Value = "0x" + lit.Value[2:i] + "p" + lit.Value[i+1:] + } else { + lit.Value = "0x" + lit.Value[2:] + } + } + } + + return false +} diff --git a/src/cmd/gofmt/testdata/go2numbers.golden b/src/cmd/gofmt/testdata/go2numbers.golden index a227a58362..2fab834bcd 100644 --- a/src/cmd/gofmt/testdata/go2numbers.golden +++ b/src/cmd/gofmt/testdata/go2numbers.golden @@ -1,6 +1,7 @@ package p const ( + // 0-octals _ = 0 _ = 0123 _ = 0123456 @@ -21,39 +22,39 @@ const ( _ = 0x1234 _ = 0xcafef00d - _ = 0X0 - _ = 0X1234 - _ = 0XCAFEf00d + _ = 0x0 + _ = 0x1234 + _ = 0xCAFEf00d - _ = 0X_0 - _ = 0X_1234 - _ = 0X_CAFE_f00d + _ = 0x_0 + _ = 0x_1234 + _ = 0x_CAFE_f00d // octals _ = 0o0 _ = 0o1234 _ = 0o01234567 - _ = 0O0 - _ = 0O1234 - _ = 0O01234567 + _ = 0o0 + _ = 0o1234 + _ = 0o01234567 _ = 0o_0 _ = 0o_1234 _ = 0o0123_4567 - _ = 0O_0 - _ = 0O_1234 - _ = 0O0123_4567 + _ = 0o_0 + _ = 0o_1234 + _ = 0o0123_4567 // binaries _ = 0b0 _ = 0b1011 _ = 0b00101101 - _ = 0B0 - _ = 0B1011 - _ = 0B00101101 + _ = 0b0 + _ = 0b1011 + _ = 0b00101101 _ = 0b_0 _ = 0b10_11 @@ -70,26 +71,26 @@ const ( _ = 0e0 _ = 123e+0 - _ = 0123E-1 + _ = 0123e-1 _ = 0e-0 - _ = 123E+0 - _ = 0123E123 + _ = 123e+0 + _ = 0123e123 _ = 0.e+1 - _ = 123.E-10 + _ = 123.e-10 _ = 0123.e123 _ = .0e-1 - _ = .123E+10 - _ = .0123E123 + _ = .123e+10 + _ = .0123e123 _ = 0.0 _ = 123.123 _ = 0123.0123 _ = 0.0e1 - _ = 123.123E-10 + _ = 123.123e-10 _ = 0123.0123e+456 _ = 1_2_3. @@ -100,42 +101,43 @@ const ( _ = 0_123e0 _ = 0e-0_0 - _ = 1_2_3E+0 - _ = 0123E1_2_3 + _ = 1_2_3e+0 + _ = 0123e1_2_3 _ = 0.e+1 - _ = 123.E-1_0 + _ = 123.e-1_0 _ = 01_23.e123 _ = .0e-1 - _ = .123E+10 - _ = .0123E123 + _ = .123e+10 + _ = .0123e123 _ = 1_2_3.123 _ = 0123.01_23 // hexadecimal floats _ = 0x0.p+0 - _ = 0Xdeadcafe.p-10 - _ = 0x1234.P123 + _ = 0xdeadcafe.p-10 + _ = 0x1234.p123 _ = 0x.1p-0 - _ = 0X.deadcafep2 - _ = 0x.1234P+10 + _ = 0x.deadcafep2 + _ = 0x.1234p+10 _ = 0x0p0 - _ = 0Xdeadcafep+1 - _ = 0x1234P-10 + _ = 0xdeadcafep+1 + _ = 0x1234p-10 _ = 0x0.0p0 - _ = 0Xdead.cafep+1 - _ = 0x12.34P-10 + _ = 0xdead.cafep+1 + _ = 0x12.34p-10 - _ = 0Xdead_cafep+1 - _ = 0x_1234P-10 + _ = 0xdead_cafep+1 + _ = 0x_1234p-10 - _ = 0X_dead_cafe.p-10 - _ = 0x12_34.P1_2_3 + _ = 0x_dead_cafe.p-10 + _ = 0x12_34.p1_2_3 + _ = 0x1_2_3_4.p-1_2_3 // imaginaries _ = 0i diff --git a/src/cmd/gofmt/testdata/go2numbers.input b/src/cmd/gofmt/testdata/go2numbers.input index a227a58362..7b3fd391da 100644 --- a/src/cmd/gofmt/testdata/go2numbers.input +++ b/src/cmd/gofmt/testdata/go2numbers.input @@ -1,6 +1,7 @@ package p const ( + // 0-octals _ = 0 _ = 0123 _ = 0123456 @@ -136,6 +137,7 @@ const ( _ = 0X_dead_cafe.p-10 _ = 0x12_34.P1_2_3 + _ = 0X1_2_3_4.P-1_2_3 // imaginaries _ = 0i -- GitLab From 85c1798ac60917857fe33dd2722cc56fa323313a Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 14 Jan 2019 13:34:42 -0800 Subject: [PATCH 0009/1679] text/scanner: don't crash when calling TokenText in error handler Make sure Scanner.tokEnd is set before we call Scanner.Error and update documentation accordingly. (Until now tokEnd was only set before returning from Scan, so a call to TokenText during error handling may have crashed.) While at it, tighten a check in Scanner.TokenText to ensure Scanner.tokEnd >= Scanner.tokPos if we have a token. Also, silence error messages to Stderr in unrelated TestIllegalExponent. Fixes #29723. Change-Id: Ia97beeae91eaf9e0ed3dada0a806f1f7122461cc Reviewed-on: https://go-review.googlesource.com/c/157819 Reviewed-by: Josh Bleecher Snyder --- src/text/scanner/scanner.go | 6 ++++-- src/text/scanner/scanner_test.go | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/text/scanner/scanner.go b/src/text/scanner/scanner.go index 893a4edbaf..62b3231e5e 100644 --- a/src/text/scanner/scanner.go +++ b/src/text/scanner/scanner.go @@ -322,6 +322,7 @@ func (s *Scanner) Peek() rune { } func (s *Scanner) error(msg string) { + s.tokEnd = s.srcPos - s.lastCharLen // make sure token text is terminated s.ErrorCount++ if s.Error != nil { s.Error(s, msg) @@ -664,17 +665,18 @@ func (s *Scanner) Pos() (pos Position) { } // TokenText returns the string corresponding to the most recently scanned token. -// Valid after calling Scan(). +// Valid after calling Scan and in calls of Scanner.Error. func (s *Scanner) TokenText() string { if s.tokPos < 0 { // no token text return "" } - if s.tokEnd < 0 { + if s.tokEnd < s.tokPos { // if EOF was reached, s.tokEnd is set to -1 (s.srcPos == 0) s.tokEnd = s.tokPos } + // s.tokEnd >= s.tokPos if s.tokBuf.Len() == 0 { // common case: the entire token text is still in srcBuf diff --git a/src/text/scanner/scanner_test.go b/src/text/scanner/scanner_test.go index e26e816f51..e7539a058b 100644 --- a/src/text/scanner/scanner_test.go +++ b/src/text/scanner/scanner_test.go @@ -293,6 +293,12 @@ func TestScan(t *testing.T) { func TestIllegalExponent(t *testing.T) { const src = "1.5e 1.5E 1e+ 1e- 1.5z" s := new(Scanner).Init(strings.NewReader(src)) + s.Error = func(s *Scanner, msg string) { + const want = "illegal exponent" + if msg != want { + t.Errorf("%s: got error %q; want %q", s.TokenText(), msg, want) + } + } checkTokErr(t, s, 1, Float, "1.5e") checkTokErr(t, s, 1, Float, "1.5E") checkTokErr(t, s, 1, Float, "1e+") @@ -692,3 +698,16 @@ func TestScanEOFHandling(t *testing.T) { t.Errorf("scanner called Read %d times, not once", r) } } + +func TestIssue29723(t *testing.T) { + s := new(Scanner).Init(strings.NewReader(`x "`)) + s.Error = func(s *Scanner, _ string) { + got := s.TokenText() // this call shouldn't panic + const want = `"` + if got != want { + t.Errorf("got %q; want %q", got, want) + } + } + for r := s.Scan(); r != EOF; r = s.Scan() { + } +} -- GitLab From 33ac854481c49632a4b924b184f83e068014b486 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 11 Feb 2019 14:27:43 -0800 Subject: [PATCH 0010/1679] cmd/compile: do not export float or complex constants with -asmhdr The -asmhdr flag is used to generate header files for assembly code such that that code has access to compile-time constants. During the build these constants end up in the (ephemeral) file go_asm.h. For historical reasons, floating-point and complex constants are printed with a 'p' exponent but with decimal mantissa; also, because of the compiler-internal precision of 512 bits, the mantissae are quite large (and conversions are comparatively slow). With the changes to the new Go 2 number literals, the respective upcoming changes to text/scanner (which in turn is used by the assembler) will make text/scanner newly accept hexadecimal floats; but also decimal floats using the incorrect 'p' exponent and report an error in that case. As a consequence, the assembler will report an error when trying to parse the before-mentioned decimal floating-point values which are using 'p' exponents. Since these constants are never needed in the assembly code, do not emit them in the first place. Change-Id: I06c7c96b04e8d062441120107992472f87a651b2 Reviewed-on: https://go-review.googlesource.com/c/161904 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/gc/export.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/compile/internal/gc/export.go b/src/cmd/compile/internal/gc/export.go index 791fc063b7..31e6ab5b6d 100644 --- a/src/cmd/compile/internal/gc/export.go +++ b/src/cmd/compile/internal/gc/export.go @@ -209,6 +209,10 @@ func dumpasmhdr() { } switch n.Op { case OLITERAL: + t := n.Val().Ctype() + if t == CTFLT || t == CTCPLX { + break + } fmt.Fprintf(b, "#define const_%s %#v\n", n.Sym.Name, n.Val()) case OTYPE: -- GitLab From 710417bc92af19379101acbcd4e0f79dba38c891 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 5 Feb 2019 12:42:46 -0800 Subject: [PATCH 0011/1679] text/scanner: accept new Go2 number literals This CL introduces text/scanner support for the new binary and octal integer literals, hexadecimal floats, and digit separators for all number literals. The new code is closely mirroring the respective code for number literals in cmd/compile/internal/syntax/scanner.go. Uniformly use the term "invalid" rather than "illegal" in error messages to match the respective error messages in the other scanners directly. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: I2f291de13ba5afc0e530cd8326e6bf4c3858ebac Reviewed-on: https://go-review.googlesource.com/c/161199 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/text/scanner/scanner.go | 252 +++++++++++++++++++++---------- src/text/scanner/scanner_test.go | 228 ++++++++++++++++++++++++---- 2 files changed, 371 insertions(+), 109 deletions(-) diff --git a/src/text/scanner/scanner.go b/src/text/scanner/scanner.go index 62b3231e5e..38c27f6a08 100644 --- a/src/text/scanner/scanner.go +++ b/src/text/scanner/scanner.go @@ -266,7 +266,7 @@ func (s *Scanner) next() rune { s.srcPos += width s.lastCharLen = width s.column++ - s.error("illegal UTF-8 encoding") + s.error("invalid UTF-8 encoding") return ch } } @@ -281,7 +281,7 @@ func (s *Scanner) next() rune { switch ch { case 0: // for compatibility with other tools - s.error("illegal character NUL") + s.error("invalid character NUL") case '\n': s.line++ s.lastLineLen = s.column @@ -335,6 +335,10 @@ func (s *Scanner) error(msg string) { fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) } +func (s *Scanner) errorf(format string, args ...interface{}) { + s.error(fmt.Sprintf(format, args...)) +} + func (s *Scanner) isIdentRune(ch rune, i int) bool { if s.IsIdentRune != nil { return s.IsIdentRune(ch, i) @@ -351,95 +355,189 @@ func (s *Scanner) scanIdentifier() rune { return ch } -func digitVal(ch rune) int { - switch { - case '0' <= ch && ch <= '9': - return int(ch - '0') - case 'a' <= ch && ch <= 'f': - return int(ch - 'a' + 10) - case 'A' <= ch && ch <= 'F': - return int(ch - 'A' + 10) +func lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case ch iff ch is ASCII letter +func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } +func isHex(ch rune) bool { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' } + +// digits accepts the sequence { digit | '_' } starting with ch0. +// If base <= 10, digits accepts any decimal digit but records +// the first invalid digit >= base in *invalid if *invalid == 0. +// digits returns the first rune that is not part of the sequence +// anymore, and a bitset describing whether the sequence contained +// digits (bit 0 is set), or separators '_' (bit 1 is set). +func (s *Scanner) digits(ch0 rune, base int, invalid *rune) (ch rune, digsep int) { + ch = ch0 + if base <= 10 { + max := rune('0' + base) + for isDecimal(ch) || ch == '_' { + ds := 1 + if ch == '_' { + ds = 2 + } else if ch >= max && *invalid == 0 { + *invalid = ch + } + digsep |= ds + ch = s.next() + } + } else { + for isHex(ch) || ch == '_' { + ds := 1 + if ch == '_' { + ds = 2 + } + digsep |= ds + ch = s.next() + } } - return 16 // larger than any legal digit val + return } -func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } +func (s *Scanner) scanNumber(ch rune, integerPart bool) (rune, rune) { + base := 10 // number base + prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b' + digsep := 0 // bit 0: digit present, bit 1: '_' present + invalid := rune(0) // invalid digit in literal, or 0 + + // integer part + var tok rune + var ds int + if integerPart { + tok = Int + if ch == '0' { + ch = s.next() + switch lower(ch) { + case 'x': + ch = s.next() + base, prefix = 16, 'x' + case 'o': + ch = s.next() + base, prefix = 8, 'o' + case 'b': + ch = s.next() + base, prefix = 2, 'b' + default: + base, prefix = 8, '0' + digsep = 1 // leading 0 + } + } + ch, ds = s.digits(ch, base, &invalid) + digsep |= ds + } -func (s *Scanner) scanMantissa(ch rune) rune { - for isDecimal(ch) { - ch = s.next() + // fractional part + if !integerPart || ch == '.' { + tok = Float + if prefix == 'o' || prefix == 'b' { + s.error("invalid radix point in " + litname(prefix)) + } + if ch == '.' { + ch = s.next() + } + ch, ds = s.digits(ch, base, &invalid) + digsep |= ds } - return ch -} -func (s *Scanner) scanFraction(ch rune) rune { - if ch == '.' { - ch = s.scanMantissa(s.next()) + if digsep&1 == 0 { + s.error(litname(prefix) + " has no digits") } - return ch -} -func (s *Scanner) scanExponent(ch rune) rune { - if ch == 'e' || ch == 'E' { + // exponent + if e := lower(ch); e == 'e' || e == 'p' { + switch { + case e == 'e' && prefix != 0 && prefix != '0': + s.errorf("%q exponent requires decimal mantissa", ch) + case e == 'p' && prefix != 'x': + s.errorf("%q exponent requires hexadecimal mantissa", ch) + } ch = s.next() - if ch == '-' || ch == '+' { + tok = Float + if ch == '+' || ch == '-' { ch = s.next() } - if !isDecimal(ch) { - s.error("illegal exponent") + ch, ds = s.digits(ch, 10, nil) + digsep |= ds + if ds&1 == 0 { + s.error("exponent has no digits") } - ch = s.scanMantissa(ch) + } else if prefix == 'x' && tok == Float { + s.error("hexadecimal mantissa requires a 'p' exponent") } - return ch + + if tok == Int && invalid != 0 { + s.errorf("invalid digit %q in %s", invalid, litname(prefix)) + } + + if digsep&2 != 0 { + s.tokEnd = s.srcPos - s.lastCharLen // make sure token text is terminated + if i := invalidSep(s.TokenText()); i >= 0 { + s.error("'_' must separate successive digits") + } + } + + return tok, ch } -func (s *Scanner) scanNumber(ch rune) (rune, rune) { - // isDecimal(ch) - if ch == '0' { - // int or float - ch = s.next() - if ch == 'x' || ch == 'X' { - // hexadecimal int - ch = s.next() - hasMantissa := false - for digitVal(ch) < 16 { - ch = s.next() - hasMantissa = true - } - if !hasMantissa { - s.error("illegal hexadecimal number") - } - } else { - // octal int or float - has8or9 := false - for isDecimal(ch) { - if ch > '7' { - has8or9 = true - } - ch = s.next() - } - if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') { - // float - ch = s.scanFraction(ch) - ch = s.scanExponent(ch) - return Float, ch +func litname(prefix rune) string { + switch prefix { + default: + return "decimal literal" + case 'x': + return "hexadecimal literal" + case 'o', '0': + return "octal literal" + case 'b': + return "binary literal" + } +} + +// invalidSep returns the index of the first invalid separator in x, or -1. +func invalidSep(x string) int { + x1 := ' ' // prefix char, we only care if it's 'x' + d := '.' // digit, one of '_', '0' (a digit), or '.' (anything else) + i := 0 + + // a prefix counts as a digit + if len(x) >= 2 && x[0] == '0' { + x1 = lower(rune(x[1])) + if x1 == 'x' || x1 == 'o' || x1 == 'b' { + d = '0' + i = 2 + } + } + + // mantissa and exponent + for ; i < len(x); i++ { + p := d // previous digit + d = rune(x[i]) + switch { + case d == '_': + if p != '0' { + return i } - // octal int - if has8or9 { - s.error("illegal octal number") + case isDecimal(d) || x1 == 'x' && isHex(d): + d = '0' + default: + if p == '_' { + return i - 1 } + d = '.' } - return Int, ch } - // decimal int or float - ch = s.scanMantissa(ch) - if s.Mode&ScanFloats != 0 && (ch == '.' || ch == 'e' || ch == 'E') { - // float - ch = s.scanFraction(ch) - ch = s.scanExponent(ch) - return Float, ch + if d == '_' { + return len(x) - 1 + } + + return -1 +} + +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= lower(ch) && lower(ch) <= 'f': + return int(lower(ch) - 'a' + 10) } - return Int, ch + return 16 // larger than any legal digit val } func (s *Scanner) scanDigits(ch rune, base, n int) rune { @@ -448,7 +546,7 @@ func (s *Scanner) scanDigits(ch rune, base, n int) rune { n-- } if n > 0 { - s.error("illegal char escape") + s.error("invalid char escape") } return ch } @@ -468,7 +566,7 @@ func (s *Scanner) scanEscape(quote rune) rune { case 'U': ch = s.scanDigits(s.next(), 16, 8) default: - s.error("illegal char escape") + s.error("invalid char escape") } return ch } @@ -503,7 +601,7 @@ func (s *Scanner) scanRawString() { func (s *Scanner) scanChar() { if s.scanString('\'') != 1 { - s.error("illegal char literal") + s.error("invalid char literal") } } @@ -584,7 +682,7 @@ redo: } case isDecimal(ch): if s.Mode&(ScanInts|ScanFloats) != 0 { - tok, ch = s.scanNumber(ch) + tok, ch = s.scanNumber(ch, true) } else { ch = s.next() } @@ -607,9 +705,7 @@ redo: case '.': ch = s.next() if isDecimal(ch) && s.Mode&ScanFloats != 0 { - tok = Float - ch = s.scanMantissa(ch) - ch = s.scanExponent(ch) + tok, ch = s.scanNumber(ch, false) } case '/': ch = s.next() diff --git a/src/text/scanner/scanner_test.go b/src/text/scanner/scanner_test.go index e7539a058b..58db8e1971 100644 --- a/src/text/scanner/scanner_test.go +++ b/src/text/scanner/scanner_test.go @@ -290,11 +290,11 @@ func TestScan(t *testing.T) { testScan(t, GoTokens&^SkipComments) } -func TestIllegalExponent(t *testing.T) { +func TestInvalidExponent(t *testing.T) { const src = "1.5e 1.5E 1e+ 1e- 1.5z" s := new(Scanner).Init(strings.NewReader(src)) s.Error = func(s *Scanner, msg string) { - const want = "illegal exponent" + const want = "exponent has no digits" if msg != want { t.Errorf("%s: got error %q; want %q", s.TokenText(), msg, want) } @@ -378,7 +378,7 @@ func TestScanSelectedMask(t *testing.T) { testScanSelectedMode(t, 0, 0) testScanSelectedMode(t, ScanIdents, Ident) // Don't test ScanInts and ScanNumbers since some parts of - // the floats in the source look like (illegal) octal ints + // the floats in the source look like (invalid) octal ints // and ScanNumbers may return either Int or Float. testScanSelectedMode(t, ScanChars, Char) testScanSelectedMode(t, ScanStrings, String) @@ -480,34 +480,34 @@ func testError(t *testing.T, src, pos, msg string, tok rune) { } func TestError(t *testing.T) { - testError(t, "\x00", ":1:1", "illegal character NUL", 0) - testError(t, "\x80", ":1:1", "illegal UTF-8 encoding", utf8.RuneError) - testError(t, "\xff", ":1:1", "illegal UTF-8 encoding", utf8.RuneError) - - testError(t, "a\x00", ":1:2", "illegal character NUL", Ident) - testError(t, "ab\x80", ":1:3", "illegal UTF-8 encoding", Ident) - testError(t, "abc\xff", ":1:4", "illegal UTF-8 encoding", Ident) - - testError(t, `"a`+"\x00", ":1:3", "illegal character NUL", String) - testError(t, `"ab`+"\x80", ":1:4", "illegal UTF-8 encoding", String) - testError(t, `"abc`+"\xff", ":1:5", "illegal UTF-8 encoding", String) - - testError(t, "`a"+"\x00", ":1:3", "illegal character NUL", RawString) - testError(t, "`ab"+"\x80", ":1:4", "illegal UTF-8 encoding", RawString) - testError(t, "`abc"+"\xff", ":1:5", "illegal UTF-8 encoding", RawString) - - testError(t, `'\"'`, ":1:3", "illegal char escape", Char) - testError(t, `"\'"`, ":1:3", "illegal char escape", String) - - testError(t, `01238`, ":1:6", "illegal octal number", Int) - testError(t, `01238123`, ":1:9", "illegal octal number", Int) - testError(t, `0x`, ":1:3", "illegal hexadecimal number", Int) - testError(t, `0xg`, ":1:3", "illegal hexadecimal number", Int) - testError(t, `'aa'`, ":1:4", "illegal char literal", Char) - testError(t, `1.5e`, ":1:5", "illegal exponent", Float) - testError(t, `1.5E`, ":1:5", "illegal exponent", Float) - testError(t, `1.5e+`, ":1:6", "illegal exponent", Float) - testError(t, `1.5e-`, ":1:6", "illegal exponent", Float) + testError(t, "\x00", ":1:1", "invalid character NUL", 0) + testError(t, "\x80", ":1:1", "invalid UTF-8 encoding", utf8.RuneError) + testError(t, "\xff", ":1:1", "invalid UTF-8 encoding", utf8.RuneError) + + testError(t, "a\x00", ":1:2", "invalid character NUL", Ident) + testError(t, "ab\x80", ":1:3", "invalid UTF-8 encoding", Ident) + testError(t, "abc\xff", ":1:4", "invalid UTF-8 encoding", Ident) + + testError(t, `"a`+"\x00", ":1:3", "invalid character NUL", String) + testError(t, `"ab`+"\x80", ":1:4", "invalid UTF-8 encoding", String) + testError(t, `"abc`+"\xff", ":1:5", "invalid UTF-8 encoding", String) + + testError(t, "`a"+"\x00", ":1:3", "invalid character NUL", RawString) + testError(t, "`ab"+"\x80", ":1:4", "invalid UTF-8 encoding", RawString) + testError(t, "`abc"+"\xff", ":1:5", "invalid UTF-8 encoding", RawString) + + testError(t, `'\"'`, ":1:3", "invalid char escape", Char) + testError(t, `"\'"`, ":1:3", "invalid char escape", String) + + testError(t, `01238`, ":1:6", "invalid digit '8' in octal literal", Int) + testError(t, `01238123`, ":1:9", "invalid digit '8' in octal literal", Int) + testError(t, `0x`, ":1:3", "hexadecimal literal has no digits", Int) + testError(t, `0xg`, ":1:3", "hexadecimal literal has no digits", Int) + testError(t, `'aa'`, ":1:4", "invalid char literal", Char) + testError(t, `1.5e`, ":1:5", "exponent has no digits", Float) + testError(t, `1.5E`, ":1:5", "exponent has no digits", Float) + testError(t, `1.5e+`, ":1:6", "exponent has no digits", Float) + testError(t, `1.5e-`, ":1:6", "exponent has no digits", Float) testError(t, `'`, ":1:2", "literal not terminated", Char) testError(t, `'`+"\n", ":1:2", "literal not terminated", Char) @@ -711,3 +711,169 @@ func TestIssue29723(t *testing.T) { for r := s.Scan(); r != EOF; r = s.Scan() { } } + +func TestNumbers(t *testing.T) { + for _, test := range []struct { + tok rune + src, tokens, err string + }{ + // binaries + {Int, "0b0", "0b0", ""}, + {Int, "0b1010", "0b1010", ""}, + {Int, "0B1110", "0B1110", ""}, + + {Int, "0b", "0b", "binary literal has no digits"}, + {Int, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, + {Int, "0b01a0", "0b01 a0", ""}, // only accept 0-9 + + // binary floats (invalid) + {Float, "0b.", "0b.", "invalid radix point in binary literal"}, + {Float, "0b.1", "0b.1", "invalid radix point in binary literal"}, + {Float, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, + {Float, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, + {Float, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, + + // octals + {Int, "0o0", "0o0", ""}, + {Int, "0o1234", "0o1234", ""}, + {Int, "0O1234", "0O1234", ""}, + + {Int, "0o", "0o", "octal literal has no digits"}, + {Int, "0o8123", "0o8123", "invalid digit '8' in octal literal"}, + {Int, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, + {Int, "0o12a3", "0o12 a3", ""}, // only accept 0-9 + + // octal floats (invalid) + {Float, "0o.", "0o.", "invalid radix point in octal literal"}, + {Float, "0o.2", "0o.2", "invalid radix point in octal literal"}, + {Float, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, + {Float, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, + {Float, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, + + // 0-octals + {Int, "0", "0", ""}, + {Int, "0123", "0123", ""}, + + {Int, "08123", "08123", "invalid digit '8' in octal literal"}, + {Int, "01293", "01293", "invalid digit '9' in octal literal"}, + {Int, "0F.", "0 F .", ""}, // only accept 0-9 + {Int, "0123F.", "0123 F .", ""}, + {Int, "0123456x", "0123456 x", ""}, + + // decimals + {Int, "1", "1", ""}, + {Int, "1234", "1234", ""}, + + {Int, "1f", "1 f", ""}, // only accept 0-9 + + // decimal floats + {Float, "0.", "0.", ""}, + {Float, "123.", "123.", ""}, + {Float, "0123.", "0123.", ""}, + + {Float, ".0", ".0", ""}, + {Float, ".123", ".123", ""}, + {Float, ".0123", ".0123", ""}, + + {Float, "0.0", "0.0", ""}, + {Float, "123.123", "123.123", ""}, + {Float, "0123.0123", "0123.0123", ""}, + + {Float, "0e0", "0e0", ""}, + {Float, "123e+0", "123e+0", ""}, + {Float, "0123E-1", "0123E-1", ""}, + + {Float, "0.e+1", "0.e+1", ""}, + {Float, "123.E-10", "123.E-10", ""}, + {Float, "0123.e123", "0123.e123", ""}, + + {Float, ".0e-1", ".0e-1", ""}, + {Float, ".123E+10", ".123E+10", ""}, + {Float, ".0123E123", ".0123E123", ""}, + + {Float, "0.0e1", "0.0e1", ""}, + {Float, "123.123E-10", "123.123E-10", ""}, + {Float, "0123.0123e+456", "0123.0123e+456", ""}, + + {Float, "0e", "0e", "exponent has no digits"}, + {Float, "0E+", "0E+", "exponent has no digits"}, + {Float, "1e+f", "1e+ f", "exponent has no digits"}, + {Float, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, + {Float, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, + + // hexadecimals + {Int, "0x0", "0x0", ""}, + {Int, "0x1234", "0x1234", ""}, + {Int, "0xcafef00d", "0xcafef00d", ""}, + {Int, "0XCAFEF00D", "0XCAFEF00D", ""}, + + {Int, "0x", "0x", "hexadecimal literal has no digits"}, + {Int, "0x1g", "0x1 g", ""}, + + // hexadecimal floats + {Float, "0x0p0", "0x0p0", ""}, + {Float, "0x12efp-123", "0x12efp-123", ""}, + {Float, "0xABCD.p+0", "0xABCD.p+0", ""}, + {Float, "0x.0189P-0", "0x.0189P-0", ""}, + {Float, "0x1.ffffp+1023", "0x1.ffffp+1023", ""}, + + {Float, "0x.", "0x.", "hexadecimal literal has no digits"}, + {Float, "0x0.", "0x0.", "hexadecimal mantissa requires a 'p' exponent"}, + {Float, "0x.0", "0x.0", "hexadecimal mantissa requires a 'p' exponent"}, + {Float, "0x1.1", "0x1.1", "hexadecimal mantissa requires a 'p' exponent"}, + {Float, "0x1.1e0", "0x1.1e0", "hexadecimal mantissa requires a 'p' exponent"}, + {Float, "0x1.2gp1a", "0x1.2 gp1a", "hexadecimal mantissa requires a 'p' exponent"}, + {Float, "0x0p", "0x0p", "exponent has no digits"}, + {Float, "0xeP-", "0xeP-", "exponent has no digits"}, + {Float, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, + {Float, "0x1.2p1a", "0x1.2p1 a", ""}, + + // separators + {Int, "0b_1000_0001", "0b_1000_0001", ""}, + {Int, "0o_600", "0o_600", ""}, + {Int, "0_466", "0_466", ""}, + {Int, "1_000", "1_000", ""}, + {Float, "1_000.000_1", "1_000.000_1", ""}, + {Int, "0x_f00d", "0x_f00d", ""}, + {Float, "0x_f00d.0p1_2", "0x_f00d.0p1_2", ""}, + + {Int, "0b__1000", "0b__1000", "'_' must separate successive digits"}, + {Int, "0o60___0", "0o60___0", "'_' must separate successive digits"}, + {Int, "0466_", "0466_", "'_' must separate successive digits"}, + {Float, "1_.", "1_.", "'_' must separate successive digits"}, + {Float, "0._1", "0._1", "'_' must separate successive digits"}, + {Float, "2.7_e0", "2.7_e0", "'_' must separate successive digits"}, + {Int, "0x___0", "0x___0", "'_' must separate successive digits"}, + {Float, "0x1.0_p0", "0x1.0_p0", "'_' must separate successive digits"}, + } { + s := new(Scanner).Init(strings.NewReader(test.src)) + var err string + s.Error = func(s *Scanner, msg string) { + if err == "" { + err = msg + } + } + + for i, want := range strings.Split(test.tokens, " ") { + err = "" + tok := s.Scan() + lit := s.TokenText() + if i == 0 { + if tok != test.tok { + t.Errorf("%q: got token %s; want %s", test.src, TokenString(tok), TokenString(test.tok)) + } + if err != test.err { + t.Errorf("%q: got error %q; want %q", test.src, err, test.err) + } + } + if lit != want { + t.Errorf("%q: got literal %q (%s); want %s", test.src, lit, TokenString(tok), want) + } + } + + // make sure we read all + if tok := s.Scan(); tok != EOF { + t.Errorf("%q: got %s; want EOF", test.src, TokenString(tok)) + } + } +} -- GitLab From 6fa1336531b0d1dac2b18123d74bcec4e0defdd9 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 23 Jan 2019 18:10:54 -0800 Subject: [PATCH 0012/1679] go/types: permit signed integer shift count Permit shifts by non-constant signed integer shift counts. Share logic for constant shift counts in non-constant shifts and improve error messages a little bit. R=Go1.13 Updates #19113. Change-Id: Ia01d83ca8aa60a6a3f4c49f026e0c46396f852be Reviewed-on: https://go-review.googlesource.com/c/159317 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Alan Donovan --- src/go/types/expr.go | 37 ++++++++++++++++---------------- src/go/types/stdlib_test.go | 1 + src/go/types/testdata/decls1.src | 4 ++-- src/go/types/testdata/expr1.src | 8 +++---- src/go/types/testdata/shifts.src | 26 ++++++++++++++++------ 5 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/go/types/expr.go b/src/go/types/expr.go index 0dc007069f..66d62d6885 100644 --- a/src/go/types/expr.go +++ b/src/go/types/expr.go @@ -655,11 +655,10 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) { return } - // spec: "The right operand in a shift expression must have unsigned - // integer type or be an untyped constant representable by a value of - // type uint." + // spec: "The right operand in a shift expression must have integer type + // or be an untyped constant representable by a value of type uint." switch { - case isUnsigned(y.typ): + case isInteger(y.typ): // nothing to do case isUntyped(y.typ): check.convertUntyped(y, Typ[Uint]) @@ -668,21 +667,28 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) { return } default: - check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y) + check.invalidOp(y.pos(), "shift count %s must be integer", y) x.mode = invalid return } + var yval constant.Value + if y.mode == constant_ { + // rhs must be an integer value + // (Either it was of an integer type already, or it was + // untyped and successfully converted to a uint above.) + yval = constant.ToInt(y.val) + assert(yval.Kind() == constant.Int) + if constant.Sign(yval) < 0 { + check.invalidOp(y.pos(), "negative shift count %s", y) + x.mode = invalid + return + } + } + if x.mode == constant_ { if y.mode == constant_ { - // rhs must be an integer value - yval := constant.ToInt(y.val) - if yval.Kind() != constant.Int { - check.invalidOp(y.pos(), "shift count %s must be unsigned integer", y) - x.mode = invalid - return - } - // rhs must be within reasonable bounds + // rhs must be within reasonable bounds in constant shifts const shiftBound = 1023 - 1 + 52 // so we can express smallestFloat64 s, ok := constant.Uint64Val(yval) if !ok || s > shiftBound { @@ -741,11 +747,6 @@ func (check *Checker) shift(x, y *operand, e *ast.BinaryExpr, op token.Token) { } } - // constant rhs must be >= 0 - if y.mode == constant_ && constant.Sign(y.val) < 0 { - check.invalidOp(y.pos(), "shift count %s must not be negative", y) - } - // non-constant shift - lhs must be an integer if !isInteger(x.typ) { check.invalidOp(x.pos(), "shifted operand %s must be integer", x) diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index 84908fd190..b254b29bdf 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -167,6 +167,7 @@ func TestStdFixed(t *testing.T) { } testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "fixedbugs"), + "bug073.go", // checks for unsigned integer shift - disabled for now "bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore "issue6889.go", // gc-specific test "issue7746.go", // large constants - consumes too much memory diff --git a/src/go/types/testdata/decls1.src b/src/go/types/testdata/decls1.src index 07405469a4..e6beb78358 100644 --- a/src/go/types/testdata/decls1.src +++ b/src/go/types/testdata/decls1.src @@ -43,7 +43,7 @@ var ( s11 = &v s12 = -(u + *t11) / *&v s13 = a /* ERROR "shifted operand" */ << d - s14 = i << j /* ERROR "must be unsigned" */ + s14 = i << j s18 = math.Pi * 10.0 s19 = s1 /* ERROR "cannot call" */ () s20 = f0 /* ERROR "no value" */ () @@ -62,7 +62,7 @@ var ( t11 *complex64 = &v t12 complex64 = -(u + *t11) / *&v t13 int = a /* ERROR "shifted operand" */ << d - t14 int = i << j /* ERROR "must be unsigned" */ + t14 int = i << j t15 math /* ERROR "not in selector" */ t16 math.xxx /* ERROR "not declared" */ t17 math /* ERROR "not a type" */ .Pi diff --git a/src/go/types/testdata/expr1.src b/src/go/types/testdata/expr1.src index eaaf610b03..4ead815158 100644 --- a/src/go/types/testdata/expr1.src +++ b/src/go/types/testdata/expr1.src @@ -35,8 +35,8 @@ func _(x, y int, z myint) { x = x * y x = x / y x = x % y - x = x << y // ERROR must be unsigned integer - x = x >> y // ERROR must be unsigned integer + x = x << y + x = x >> y z = z + 1 z = z + 1.0 @@ -46,8 +46,8 @@ func _(x, y int, z myint) { z = z /* ERROR mismatched types */ * y z = z /* ERROR mismatched types */ / y z = z /* ERROR mismatched types */ % y - z = z << y // ERROR must be unsigned integer - z = z >> y // ERROR must be unsigned integer + z = z << y + z = z >> y } type myuint uint diff --git a/src/go/types/testdata/shifts.src b/src/go/types/testdata/shifts.src index 52e340ec65..ebc95ba4d7 100644 --- a/src/go/types/testdata/shifts.src +++ b/src/go/types/testdata/shifts.src @@ -10,9 +10,21 @@ func shifts0() { s = 10 _ = 0<<0 _ = 1< Date: Mon, 11 Feb 2019 16:43:09 -0800 Subject: [PATCH 0013/1679] cmd/compile: update compiler's format test (fix long test) Change-Id: Ia546d3f0a12a3c3c291f7b6d5291193fdd47d7dd Reviewed-on: https://go-review.googlesource.com/c/161966 Run-TryBot: Robert Griesemer Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/cmd/compile/fmtmap_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/compile/fmtmap_test.go b/src/cmd/compile/fmtmap_test.go index 81ba20ff0f..018447efa1 100644 --- a/src/cmd/compile/fmtmap_test.go +++ b/src/cmd/compile/fmtmap_test.go @@ -81,6 +81,7 @@ var knownFormats = map[string]string{ "bool %v": "", "byte %08b": "", "byte %c": "", + "byte %q": "", "byte %v": "", "cmd/compile/internal/arm.shift %d": "", "cmd/compile/internal/gc.Class %d": "", @@ -124,6 +125,7 @@ var knownFormats = map[string]string{ "cmd/compile/internal/ssa.relation %s": "", "cmd/compile/internal/syntax.Error %q": "", "cmd/compile/internal/syntax.Expr %#v": "", + "cmd/compile/internal/syntax.LitKind %d": "", "cmd/compile/internal/syntax.Node %T": "", "cmd/compile/internal/syntax.Operator %s": "", "cmd/compile/internal/syntax.Pos %s": "", @@ -175,6 +177,7 @@ var knownFormats = map[string]string{ "reflect.Type %s": "", "rune %#U": "", "rune %c": "", + "rune %q": "", "string %-*s": "", "string %-16s": "", "string %-6s": "", -- GitLab From 1edd2a34c1bcf2133b659878e8b59e401eb8cc24 Mon Sep 17 00:00:00 2001 From: berkant ipek <41230766+0xbkt@users.noreply.github.com> Date: Tue, 12 Feb 2019 14:45:12 +0000 Subject: [PATCH 0014/1679] net/http/httptrace: fix typo Change-Id: I15279e4aa9306bde925929907a7b5e7ef5d8b642 GitHub-Last-Rev: 6bc2d66aecd424b322ec0c23b280e74cb22e08c3 GitHub-Pull-Request: golang/go#30193 Reviewed-on: https://go-review.googlesource.com/c/162018 Reviewed-by: Brad Fitzpatrick --- src/net/http/httptrace/trace.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/http/httptrace/trace.go b/src/net/http/httptrace/trace.go index 3a627412b3..8b377edee5 100644 --- a/src/net/http/httptrace/trace.go +++ b/src/net/http/httptrace/trace.go @@ -152,7 +152,7 @@ type ClientTrace struct { WroteHeaders func() // Wait100Continue is called if the Request specified - // "Expected: 100-continue" and the Transport has written the + // "Expect: 100-continue" and the Transport has written the // request headers but is waiting for "100 Continue" from the // server before writing the request body. Wait100Continue func() -- GitLab From 07717247d8decf5a5793f04c368eab3f43fad44f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 16:25:54 -0500 Subject: [PATCH 0015/1679] strconv: parse hex floats This CL updates ParseFloat to recognize standard hexadecimal floating-point constants. See golang.org/design/19308-number-literals for background. For #29008. Change-Id: I45f3b0c36b5d92c0e8a4b35c05443a83d7a6d4b3 Reviewed-on: https://go-review.googlesource.com/c/160241 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/strconv/atof.go | 205 ++++++++++++++++++++++++++++++--------- src/strconv/atof_test.go | 176 +++++++++++++++++++++++++++++++++ src/strconv/atoi.go | 8 ++ 3 files changed, 341 insertions(+), 48 deletions(-) diff --git a/src/strconv/atof.go b/src/strconv/atof.go index ada85e9fed..3ced3c7167 100644 --- a/src/strconv/atof.go +++ b/src/strconv/atof.go @@ -12,7 +12,7 @@ package strconv import "math" -var optimize = true // can change for testing +var optimize = true // set to false to force slow-path conversions for testing func equalIgnoreCase(s1, s2 string) bool { if len(s1) != len(s2) { @@ -119,7 +119,7 @@ func (b *decimal) set(s string) (ok bool) { // just be sure to move the decimal point by // a lot (say, 100000). it doesn't matter if it's // not the exact number. - if i < len(s) && (s[i] == 'e' || s[i] == 'E') { + if i < len(s) && lower(s[i]) == 'e' { i++ if i >= len(s) { return @@ -152,10 +152,9 @@ func (b *decimal) set(s string) (ok bool) { } // readFloat reads a decimal mantissa and exponent from a float -// string representation. It sets ok to false if the number could +// string representation. It returns ok==false if the number could // not fit return types or is invalid. -func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { - const uint64digits = 19 +func readFloat(s string) (mantissa uint64, exp int, neg, trunc, hex, ok bool) { i := 0 // optional sign @@ -171,6 +170,16 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { } // digits + base := uint64(10) + maxMantDigits := 19 // 10^19 fits in uint64 + expChar := byte('e') + if i+2 < len(s) && s[i] == '0' && lower(s[i+1]) == 'x' { + base = 16 + maxMantDigits = 16 // 16^16 fits in uint64 + i += 2 + expChar = 'p' + hex = true + } sawdot := false sawdigits := false nd := 0 @@ -193,11 +202,23 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { continue } nd++ - if ndMant < uint64digits { - mantissa *= 10 + if ndMant < maxMantDigits { + mantissa *= base mantissa += uint64(c - '0') ndMant++ - } else if s[i] != '0' { + } else if c != '0' { + trunc = true + } + continue + + case base == 16 && 'a' <= lower(c) && lower(c) <= 'f': + sawdigits = true + nd++ + if ndMant < maxMantDigits { + mantissa *= 16 + mantissa += uint64(lower(c) - 'a' + 10) + ndMant++ + } else { trunc = true } continue @@ -211,12 +232,17 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { dp = nd } + if base == 16 { + dp *= 4 + ndMant *= 4 + } + // optional exponent moves decimal point. // if we read a very large, very long number, // just be sure to move the decimal point by // a lot (say, 100000). it doesn't matter if it's // not the exact number. - if i < len(s) && (s[i] == 'e' || s[i] == 'E') { + if i < len(s) && lower(s[i]) == expChar { i++ if i >= len(s) { return @@ -238,6 +264,9 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { } } dp += e * esign + } else if base == 16 { + // Must have exponent. + return } if i != len(s) { @@ -249,7 +278,6 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, ok bool) { } ok = true return - } // decimal power of ten to binary power of two. @@ -433,6 +461,76 @@ func atof32exact(mantissa uint64, exp int, neg bool) (f float32, ok bool) { return } +// atofHex converts the hex floating-point string s +// to a rounded float32 or float64 value (depending on flt==&float32info or flt==&float64info) +// and returns it as a float64. +// The string s has already been parsed into a mantissa, exponent, and sign (neg==true for negative). +// If trunc is true, trailing non-zero bits have been omitted from the mantissa. +func atofHex(s string, flt *floatInfo, mantissa uint64, exp int, neg, trunc bool) (float64, error) { + maxExp := 1<>(flt.mantbits+2) == 0 { + mantissa <<= 1 + exp-- + } + if trunc { + mantissa |= 1 + } + for mantissa>>(1+flt.mantbits+2) != 0 { + mantissa = mantissa>>1 | mantissa&1 + exp++ + } + + // If exponent is too negative, + // denormalize in hopes of making it representable. + // (The -2 is for the rounding bits.) + for mantissa > 1 && exp < minExp-2 { + mantissa = mantissa>>1 | mantissa&1 + exp++ + } + + // Round using two bottom bits. + round := mantissa & 3 + mantissa >>= 2 + round |= mantissa & 1 // round to even (round up if mantissa is odd) + exp += 2 + if round == 3 { + mantissa++ + if mantissa == 1<<(1+flt.mantbits) { + mantissa >>= 1 + exp++ + } + } + + if mantissa>>flt.mantbits == 0 { // Denormal or zero. + exp = flt.bias + } + var err error + if exp > maxExp { // infinity and range error + mantissa = 1 << flt.mantbits + exp = maxExp + 1 + err = rangeError(fnParseFloat, s) + } + + bits := mantissa & (1< Date: Tue, 29 Jan 2019 20:16:59 -0500 Subject: [PATCH 0016/1679] strconv: format hex floats This CL updates FormatFloat to format standard hexadecimal floating-point constants, using the 'x' and 'X' verbs. See golang.org/design/19308-number-literals for background. For #29008. Change-Id: I540b8f71d492cfdb7c58af533d357a564591f28b Reviewed-on: https://go-review.googlesource.com/c/160242 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/floatconv_test.go | 6 +-- src/strconv/ftoa.go | 98 ++++++++++++++++++++++++++++++++-- src/strconv/ftoa_test.go | 27 +++++++++- src/strconv/quote.go | 5 +- 4 files changed, 126 insertions(+), 10 deletions(-) diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index 6db9bf2e46..154c818905 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -268,7 +268,7 @@ func TestFloat64Text(t *testing.T) { {32, 'g', -1, "32"}, {32, 'g', 0, "3e+01"}, - {100, 'x', -1, "%x"}, + // {100, 'x', -1, "%x"}, // {math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs // {-math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs @@ -440,8 +440,8 @@ func TestFloatText(t *testing.T) { {"-1024.0", 64, 'p', 0, "-0x.8p+11"}, // unsupported format - {"3.14", 64, 'x', 0, "%x"}, - {"-3.14", 64, 'x', 0, "%x"}, + //{"3.14", 64, 'x', 0, "%x"}, + //{"-3.14", 64, 'x', 0, "%x"}, } { f, _, err := ParseFloat(test.x, 0, test.prec, ToNearestEven) if err != nil { diff --git a/src/strconv/ftoa.go b/src/strconv/ftoa.go index a7ccbe6727..432521b24f 100644 --- a/src/strconv/ftoa.go +++ b/src/strconv/ftoa.go @@ -32,12 +32,14 @@ var float64info = floatInfo{52, 11, -1023} // 'e' (-d.dddde±dd, a decimal exponent), // 'E' (-d.ddddE±dd, a decimal exponent), // 'f' (-ddd.dddd, no exponent), -// 'g' ('e' for large exponents, 'f' otherwise), or -// 'G' ('E' for large exponents, 'f' otherwise). +// 'g' ('e' for large exponents, 'f' otherwise), +// 'G' ('E' for large exponents, 'f' otherwise), +// 'x' (-0xd.ddddp±ddd, a hexadecimal fraction and binary exponent), or +// 'X' (-0Xd.ddddP±ddd, a hexadecimal fraction and binary exponent). // // The precision prec controls the number of digits (excluding the exponent) -// printed by the 'e', 'E', 'f', 'g', and 'G' formats. -// For 'e', 'E', and 'f' it is the number of digits after the decimal point. +// printed by the 'e', 'E', 'f', 'g', 'G', 'x', and 'X' formats. +// For 'e', 'E', 'f', 'x', and 'X', it is the number of digits after the decimal point. // For 'g' and 'G' it is the maximum number of significant digits (trailing // zeros are removed). // The special precision -1 uses the smallest number of digits @@ -94,10 +96,13 @@ func genericFtoa(dst []byte, val float64, fmt byte, prec, bitSize int) []byte { } exp += flt.bias - // Pick off easy binary format. + // Pick off easy binary, hex formats. if fmt == 'b' { return fmtB(dst, neg, mant, exp, flt) } + if fmt == 'x' || fmt == 'X' { + return fmtX(dst, prec, fmt, neg, mant, exp, flt) + } if !optimize { return bigFtoa(dst, prec, fmt, neg, mant, exp, flt) @@ -439,6 +444,89 @@ func fmtB(dst []byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte { return dst } +// %x: -0x1.yyyyyyyyp±ddd or -0x0p+0. (y is hex digit, d is decimal digit) +func fmtX(dst []byte, prec int, fmt byte, neg bool, mant uint64, exp int, flt *floatInfo) []byte { + if mant == 0 { + exp = 0 + } + + // Shift digits so leading 1 (if any) is at bit 1<<60. + mant <<= 60 - flt.mantbits + for mant != 0 && mant&(1<<60) == 0 { + mant <<= 1 + exp-- + } + + // Round if requested. + if prec >= 0 && prec < 15 { + shift := uint(prec * 4) + extra := (mant << shift) & (1<<60 - 1) + mant >>= 60 - shift + if extra|(mant&1) > 1<<59 { + mant++ + } + mant <<= 60 - shift + if mant&(1<<61) != 0 { + // Wrapped around. + mant >>= 1 + exp++ + } + } + + hex := lowerhex + if fmt == 'X' { + hex = upperhex + } + + // sign, 0x, leading digit + if neg { + dst = append(dst, '-') + } + dst = append(dst, '0', fmt, '0'+byte((mant>>60)&1)) + + // .fraction + mant <<= 4 // remove leading 0 or 1 + if prec < 0 && mant != 0 { + dst = append(dst, '.') + for mant != 0 { + dst = append(dst, hex[(mant>>60)&15]) + mant <<= 4 + } + } else if prec > 0 { + dst = append(dst, '.') + for i := 0; i < prec; i++ { + dst = append(dst, hex[(mant>>60)&15]) + mant <<= 4 + } + } + + // p± + ch := byte('P') + if fmt == lower(fmt) { + ch = 'p' + } + dst = append(dst, ch) + if exp < 0 { + ch = '-' + exp = -exp + } else { + ch = '+' + } + dst = append(dst, ch) + + // dd or ddd or dddd + switch { + case exp < 100: + dst = append(dst, byte(exp/10)+'0', byte(exp%10)+'0') + case exp < 1000: + dst = append(dst, byte(exp/100)+'0', byte((exp/10)%10)+'0', byte(exp%10)+'0') + default: + dst = append(dst, byte(exp/1000)+'0', byte(exp/100)%10+'0', byte((exp/10)%10)+'0', byte(exp%10)+'0') + } + + return dst +} + func min(a, b int) int { if a < b { return a diff --git a/src/strconv/ftoa_test.go b/src/strconv/ftoa_test.go index 1d3030be81..055fef99aa 100644 --- a/src/strconv/ftoa_test.go +++ b/src/strconv/ftoa_test.go @@ -30,9 +30,15 @@ var ftoatests = []ftoaTest{ {1, 'f', 5, "1.00000"}, {1, 'g', 5, "1"}, {1, 'g', -1, "1"}, + {1, 'x', -1, "0x1p+00"}, + {1, 'x', 5, "0x1.00000p+00"}, {20, 'g', -1, "20"}, + {20, 'x', -1, "0x1.4p+04"}, {1234567.8, 'g', -1, "1.2345678e+06"}, + {1234567.8, 'x', -1, "0x1.2d687cccccccdp+20"}, {200000, 'g', -1, "200000"}, + {200000, 'x', -1, "0x1.86ap+17"}, + {200000, 'X', -1, "0X1.86AP+17"}, {2000000, 'g', -1, "2e+06"}, // g conversion and zero suppression @@ -50,6 +56,7 @@ var ftoatests = []ftoaTest{ {0, 'f', 5, "0.00000"}, {0, 'g', 5, "0"}, {0, 'g', -1, "0"}, + {0, 'x', 5, "0x0.00000p+00"}, {-1, 'e', 5, "-1.00000e+00"}, {-1, 'f', 5, "-1.00000"}, @@ -100,7 +107,8 @@ var ftoatests = []ftoaTest{ {32, 'g', -1, "32"}, {32, 'g', 0, "3e+01"}, - {100, 'x', -1, "%x"}, + {100, 'x', -1, "0x1.9p+06"}, + {100, 'y', -1, "%y"}, {math.NaN(), 'g', -1, "NaN"}, {-math.NaN(), 'g', -1, "NaN"}, @@ -128,6 +136,23 @@ var ftoatests = []ftoaTest{ // Issue 2625. {383260575764816448, 'f', 0, "383260575764816448"}, {383260575764816448, 'g', -1, "3.8326057576481645e+17"}, + + // rounding + {2.275555555555555, 'x', -1, "0x1.23456789abcdep+01"}, + {2.275555555555555, 'x', 0, "0x1p+01"}, + {2.275555555555555, 'x', 2, "0x1.23p+01"}, + {2.275555555555555, 'x', 16, "0x1.23456789abcde000p+01"}, + {2.275555555555555, 'x', 21, "0x1.23456789abcde00000000p+01"}, + {2.2755555510520935, 'x', -1, "0x1.2345678p+01"}, + {2.2755555510520935, 'x', 6, "0x1.234568p+01"}, + {2.275555431842804, 'x', -1, "0x1.2345668p+01"}, + {2.275555431842804, 'x', 6, "0x1.234566p+01"}, + {3.999969482421875, 'x', -1, "0x1.ffffp+01"}, + {3.999969482421875, 'x', 4, "0x1.ffffp+01"}, + {3.999969482421875, 'x', 3, "0x1.000p+02"}, + {3.999969482421875, 'x', 2, "0x1.00p+02"}, + {3.999969482421875, 'x', 1, "0x1.0p+02"}, + {3.999969482421875, 'x', 0, "0x1p+02"}, } func TestFtoa(t *testing.T) { diff --git a/src/strconv/quote.go b/src/strconv/quote.go index 6cd2f93068..d8a1ed9ecc 100644 --- a/src/strconv/quote.go +++ b/src/strconv/quote.go @@ -11,7 +11,10 @@ import ( "unicode/utf8" ) -const lowerhex = "0123456789abcdef" +const ( + lowerhex = "0123456789abcdef" + upperhex = "0123456789ABCDEF" +) func quoteWith(s string, quote byte, ASCIIonly, graphicOnly bool) string { return string(appendQuotedWith(make([]byte, 0, 3*len(s)/2), s, quote, ASCIIonly, graphicOnly)) -- GitLab From 36a81d5ec37904e44a9a2959c140687d558cd25f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 20:59:33 -0500 Subject: [PATCH 0017/1679] strconv: accept underscores in ParseInt, ParseUint, ParseFloat This CL modifies ParseInt, ParseUint, and ParseFloat to accept digit-separating underscores in their arguments. For ParseInt and ParseUint, the underscores are only allowed when base == 0. See golang.org/design/19308-number-literals for background. For #28493. Change-Id: I057ca2539d89314643f591ba8144c3ea7126651c Reviewed-on: https://go-review.googlesource.com/c/160243 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/strconv/atof.go | 22 ++++++++++-- src/strconv/atof_test.go | 37 ++++++++++++++++++++ src/strconv/atoi.go | 70 ++++++++++++++++++++++++++++++++----- src/strconv/atoi_test.go | 75 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 193 insertions(+), 11 deletions(-) diff --git a/src/strconv/atof.go b/src/strconv/atof.go index 3ced3c7167..504b9613fb 100644 --- a/src/strconv/atof.go +++ b/src/strconv/atof.go @@ -83,6 +83,9 @@ func (b *decimal) set(s string) (ok bool) { sawdigits := false for ; i < len(s); i++ { switch { + case s[i] == '_': + // underscoreOK already called + continue case s[i] == '.': if sawdot { return @@ -135,7 +138,11 @@ func (b *decimal) set(s string) (ok bool) { return } e := 0 - for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ { + for ; i < len(s) && ('0' <= s[i] && s[i] <= '9' || s[i] == '_'); i++ { + if s[i] == '_' { + // underscoreOK already called + continue + } if e < 10000 { e = e*10 + int(s[i]) - '0' } @@ -187,6 +194,10 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, hex, ok bool) { dp := 0 for ; i < len(s); i++ { switch c := s[i]; true { + case c == '_': + // underscoreOK already called + continue + case c == '.': if sawdot { return @@ -258,7 +269,11 @@ func readFloat(s string) (mantissa uint64, exp int, neg, trunc, hex, ok bool) { return } e := 0 - for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ { + for ; i < len(s) && ('0' <= s[i] && s[i] <= '9' || s[i] == '_'); i++ { + if s[i] == '_' { + // underscoreOK already called + continue + } if e < 10000 { e = e*10 + int(s[i]) - '0' } @@ -640,6 +655,9 @@ func atof64(s string) (f float64, err error) { // away from the largest floating point number of the given size, // ParseFloat returns f = ±Inf, err.Err = ErrRange. func ParseFloat(s string, bitSize int) (float64, error) { + if !underscoreOK(s) { + return 0, syntaxError(fnParseFloat, s) + } if bitSize == 32 { f, err := atof32(s) return float64(f), err diff --git a/src/strconv/atof_test.go b/src/strconv/atof_test.go index f67386a000..abe6c64466 100644 --- a/src/strconv/atof_test.go +++ b/src/strconv/atof_test.go @@ -47,6 +47,9 @@ var atoftests = []atofTest{ {"0x1p0", "1", nil}, {"0x1p1", "2", nil}, {"0x1p-1", "0.5", nil}, + {"0x1ep-1", "15", nil}, + {"-0x1ep-1", "-15", nil}, + {"-0x1_ep-1", "-15", nil}, {"0x1p-200", "6.223015277861142e-61", nil}, {"0x1p200", "1.6069380442589903e+60", nil}, {"0x1fFe2.p0", "131042", nil}, @@ -299,6 +302,40 @@ var atoftests = []atofTest{ // Round to even (up). {"1.00000000000000033306690738754696212708950042724609375", "1.0000000000000004", nil}, {"0x1.00000000000018p0", "1.0000000000000004", nil}, + + // Underscores. + {"1_23.50_0_0e+1_2", "1.235e+14", nil}, + {"-_123.5e+12", "0", ErrSyntax}, + {"+_123.5e+12", "0", ErrSyntax}, + {"_123.5e+12", "0", ErrSyntax}, + {"1__23.5e+12", "0", ErrSyntax}, + {"123_.5e+12", "0", ErrSyntax}, + {"123._5e+12", "0", ErrSyntax}, + {"123.5_e+12", "0", ErrSyntax}, + {"123.5__0e+12", "0", ErrSyntax}, + {"123.5e_+12", "0", ErrSyntax}, + {"123.5e+_12", "0", ErrSyntax}, + {"123.5e_-12", "0", ErrSyntax}, + {"123.5e-_12", "0", ErrSyntax}, + {"123.5e+1__2", "0", ErrSyntax}, + {"123.5e+12_", "0", ErrSyntax}, + + {"0x_1_2.3_4_5p+1_2", "74565", nil}, + {"-_0x12.345p+12", "0", ErrSyntax}, + {"+_0x12.345p+12", "0", ErrSyntax}, + {"_0x12.345p+12", "0", ErrSyntax}, + {"0x__12.345p+12", "0", ErrSyntax}, + {"0x1__2.345p+12", "0", ErrSyntax}, + {"0x12_.345p+12", "0", ErrSyntax}, + {"0x12._345p+12", "0", ErrSyntax}, + {"0x12.3__45p+12", "0", ErrSyntax}, + {"0x12.345_p+12", "0", ErrSyntax}, + {"0x12.345p_+12", "0", ErrSyntax}, + {"0x12.345p+_12", "0", ErrSyntax}, + {"0x12.345p_-12", "0", ErrSyntax}, + {"0x12.345p-_12", "0", ErrSyntax}, + {"0x12.345p+1__2", "0", ErrSyntax}, + {"0x12.345p+12_", "0", ErrSyntax}, } var atof32tests = []atofTest{ diff --git a/src/strconv/atoi.go b/src/strconv/atoi.go index 186c9b3f86..ecbc9f4bbe 100644 --- a/src/strconv/atoi.go +++ b/src/strconv/atoi.go @@ -58,10 +58,12 @@ const maxUint64 = 1<<64 - 1 func ParseUint(s string, base int, bitSize int) (uint64, error) { const fnParseUint = "ParseUint" - if len(s) == 0 { + if s == "" || !underscoreOK(s) { return 0, syntaxError(fnParseUint, s) } + base0 := base == 0 + s0 := s switch { case 2 <= base && base <= 36: @@ -70,7 +72,7 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) { case base == 0: // Look for octal, hex prefix. switch { - case s[0] == '0' && len(s) > 1 && (s[1] == 'x' || s[1] == 'X'): + case s[0] == '0' && len(s) >= 3 && lower(s[1]) == 'x': if len(s) < 3 { return 0, syntaxError(fnParseUint, s0) } @@ -111,12 +113,13 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) { for _, c := range []byte(s) { var d byte switch { + case c == '_' && base0: + // underscoreOK already called + continue case '0' <= c && c <= '9': d = c - '0' - case 'a' <= c && c <= 'z': - d = c - 'a' + 10 - case 'A' <= c && c <= 'Z': - d = c - 'A' + 10 + case 'a' <= lower(c) && lower(c) <= 'z': + d = lower(c) - 'a' + 10 default: return 0, syntaxError(fnParseUint, s0) } @@ -164,8 +167,7 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) { func ParseInt(s string, base int, bitSize int) (i int64, err error) { const fnParseInt = "ParseInt" - // Empty string bad. - if len(s) == 0 { + if s == "" { return 0, syntaxError(fnParseInt, s) } @@ -236,10 +238,60 @@ func Atoi(s string) (int, error) { return n, nil } - // Slow path for invalid or big integers. + // Slow path for invalid, big, or underscored integers. i64, err := ParseInt(s, 10, 0) if nerr, ok := err.(*NumError); ok { nerr.Func = fnAtoi } return int(i64), err } + +// underscoreOK reports whether the underscores in s are allowed. +// Checking them in this one function lets all the parsers skip over them simply. +// Underscore must appear only between digits or between a base prefix and a digit. +func underscoreOK(s string) bool { + // saw tracks the last character (class) we saw: + // ^ for beginning of number, + // 0 for a digit or base prefix, + // _ for an underscore, + // ! for none of the above. + saw := '^' + i := 0 + + // Optional sign. + if len(s) >= 1 && (s[0] == '-' || s[0] == '+') { + s = s[1:] + } + + // Optional base prefix. + hex := false + if len(s) >= 2 && s[0] == '0' && (lower(s[1]) == 'b' || lower(s[1]) == 'o' || lower(s[1]) == 'x') { + i = 2 + saw = '0' // base prefix counts as a digit for "underscore as digit separator" + hex = lower(s[1]) == 'x' + } + + // Number proper. + for ; i < len(s); i++ { + // Digits are always okay. + if '0' <= s[i] && s[i] <= '9' || hex && 'a' <= lower(s[i]) && lower(s[i]) <= 'f' { + saw = '0' + continue + } + // Underscore must follow digit. + if s[i] == '_' { + if saw != '0' { + return false + } + saw = '_' + continue + } + // Underscore must also be followed by digit. + if saw == '_' { + return false + } + // Saw non-digit, non-underscore. + saw = '!' + } + return saw != '_' +} diff --git a/src/strconv/atoi_test.go b/src/strconv/atoi_test.go index e2f505a665..ec0542abf8 100644 --- a/src/strconv/atoi_test.go +++ b/src/strconv/atoi_test.go @@ -29,6 +29,10 @@ var parseUint64Tests = []parseUint64Test{ {"18446744073709551615", 1<<64 - 1, nil}, {"18446744073709551616", 1<<64 - 1, ErrRange}, {"18446744073709551620", 1<<64 - 1, ErrRange}, + {"1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed + {"_12345", 0, ErrSyntax}, + {"1__2345", 0, ErrSyntax}, + {"12345_", 0, ErrSyntax}, } type parseUint64BaseTest struct { @@ -61,6 +65,42 @@ var parseUint64BaseTests = []parseUint64BaseTest{ {"01777777777777777777778", 0, 0, ErrSyntax}, {"02000000000000000000000", 0, 1<<64 - 1, ErrRange}, {"0200000000000000000000", 0, 1 << 61, nil}, + + // underscores allowed with base == 0 only + {"1_2_3_4_5", 0, 12345, nil}, + {"_12345", 0, 0, ErrSyntax}, + {"1__2345", 0, 0, ErrSyntax}, + {"12345_", 0, 0, ErrSyntax}, + + {"1_2_3_4_5", 10, 0, ErrSyntax}, + {"_12345", 10, 0, ErrSyntax}, + {"1__2345", 10, 0, ErrSyntax}, + {"12345_", 10, 0, ErrSyntax}, + + {"0x_1_2_3_4_5", 0, 0x12345, nil}, + {"_0x12345", 0, 0, ErrSyntax}, + {"0x__12345", 0, 0, ErrSyntax}, + {"0x1__2345", 0, 0, ErrSyntax}, + {"0x1234__5", 0, 0, ErrSyntax}, + {"0x12345_", 0, 0, ErrSyntax}, + + {"1_2_3_4_5", 16, 0, ErrSyntax}, + {"_12345", 16, 0, ErrSyntax}, + {"1__2345", 16, 0, ErrSyntax}, + {"1234__5", 16, 0, ErrSyntax}, + {"12345_", 16, 0, ErrSyntax}, + + {"0_1_2_3_4_5", 0, 012345, nil}, + {"_012345", 0, 0, ErrSyntax}, + {"0__12345", 0, 0, ErrSyntax}, + {"01234__5", 0, 0, ErrSyntax}, + {"012345_", 0, 0, ErrSyntax}, + + {"0_1_2_3_4_5", 8, 0, ErrSyntax}, + {"_012345", 8, 0, ErrSyntax}, + {"0__12345", 8, 0, ErrSyntax}, + {"01234__5", 8, 0, ErrSyntax}, + {"012345_", 8, 0, ErrSyntax}, } type parseInt64Test struct { @@ -87,6 +127,11 @@ var parseInt64Tests = []parseInt64Test{ {"-9223372036854775808", -1 << 63, nil}, {"9223372036854775809", 1<<63 - 1, ErrRange}, {"-9223372036854775809", -1 << 63, ErrRange}, + {"-1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed + {"-_12345", 0, ErrSyntax}, + {"_12345", 0, ErrSyntax}, + {"1__2345", 0, ErrSyntax}, + {"12345_", 0, ErrSyntax}, } type parseInt64BaseTest struct { @@ -144,6 +189,26 @@ var parseInt64BaseTests = []parseInt64BaseTest{ {"10", 16, 16, nil}, {"-123456789abcdef", 16, -0x123456789abcdef, nil}, {"7fffffffffffffff", 16, 1<<63 - 1, nil}, + + // underscores + {"-0x_1_2_3_4_5", 0, -0x12345, nil}, + {"0x_1_2_3_4_5", 0, 0x12345, nil}, + {"-_0x12345", 0, 0, ErrSyntax}, + {"_-0x12345", 0, 0, ErrSyntax}, + {"_0x12345", 0, 0, ErrSyntax}, + {"0x__12345", 0, 0, ErrSyntax}, + {"0x1__2345", 0, 0, ErrSyntax}, + {"0x1234__5", 0, 0, ErrSyntax}, + {"0x12345_", 0, 0, ErrSyntax}, + + {"-0_1_2_3_4_5", 0, -012345, nil}, // octal + {"0_1_2_3_4_5", 0, 012345, nil}, // octal + {"-_012345", 0, 0, ErrSyntax}, + {"_-012345", 0, 0, ErrSyntax}, + {"_012345", 0, 0, ErrSyntax}, + {"0__12345", 0, 0, ErrSyntax}, + {"01234__5", 0, 0, ErrSyntax}, + {"012345_", 0, 0, ErrSyntax}, } type parseUint32Test struct { @@ -162,6 +227,11 @@ var parseUint32Tests = []parseUint32Test{ {"987654321", 987654321, nil}, {"4294967295", 1<<32 - 1, nil}, {"4294967296", 1<<32 - 1, ErrRange}, + {"1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed + {"_12345", 0, ErrSyntax}, + {"_12345", 0, ErrSyntax}, + {"1__2345", 0, ErrSyntax}, + {"12345_", 0, ErrSyntax}, } type parseInt32Test struct { @@ -190,6 +260,11 @@ var parseInt32Tests = []parseInt32Test{ {"-2147483648", -1 << 31, nil}, {"2147483649", 1<<31 - 1, ErrRange}, {"-2147483649", -1 << 31, ErrRange}, + {"-1_2_3_4_5", 0, ErrSyntax}, // base=10 so no underscores allowed + {"-_12345", 0, ErrSyntax}, + {"_12345", 0, ErrSyntax}, + {"1__2345", 0, ErrSyntax}, + {"12345_", 0, ErrSyntax}, } type numErrorTest struct { -- GitLab From 11af3535310ed1f92cb75f523082702988bbd7f6 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 21:21:38 -0500 Subject: [PATCH 0018/1679] strconv: add 0b, 0o integer prefixes in ParseInt, ParseUint This CL modifies ParseInt and ParseUint to recognize 0b and 0o as binary and octal base prefixes when base == 0. See golang.org/design/19308-number-literals for background. For #19308. For #12711. Change-Id: I8efe067f415aa517bdefbff7e230d3fa1694d530 Reviewed-on: https://go-review.googlesource.com/c/160244 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer Reviewed-by: Rob Pike --- src/strconv/atoi.go | 33 +++++++++++++++++++-------------- src/strconv/atoi_test.go | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/strconv/atoi.go b/src/strconv/atoi.go index ecbc9f4bbe..31774d0c9a 100644 --- a/src/strconv/atoi.go +++ b/src/strconv/atoi.go @@ -71,18 +71,22 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) { case base == 0: // Look for octal, hex prefix. - switch { - case s[0] == '0' && len(s) >= 3 && lower(s[1]) == 'x': - if len(s) < 3 { - return 0, syntaxError(fnParseUint, s0) + base = 10 + if s[0] == '0' { + switch { + case len(s) >= 3 && lower(s[1]) == 'b': + base = 2 + s = s[2:] + case len(s) >= 3 && lower(s[1]) == 'o': + base = 8 + s = s[2:] + case len(s) >= 3 && lower(s[1]) == 'x': + base = 16 + s = s[2:] + default: + base = 8 + s = s[1:] } - base = 16 - s = s[2:] - case s[0] == '0': - base = 8 - s = s[1:] - default: - base = 10 } default: @@ -149,13 +153,14 @@ func ParseUint(s string, base int, bitSize int) (uint64, error) { // bit size (0 to 64) and returns the corresponding value i. // // If base == 0, the base is implied by the string's prefix: -// base 16 for "0x", base 8 for "0", and base 10 otherwise. -// For bases 1, below 0 or above 36 an error is returned. +// base 2 for "0b", base 8 for "0" or "0o", base 16 for "0x", +// and base 10 otherwise. +// If base is below 0, is 1, or is above 36, an error is returned. // // The bitSize argument specifies the integer type // that the result must fit into. Bit sizes 0, 8, 16, 32, and 64 // correspond to int, int8, int16, int32, and int64. -// For a bitSize below 0 or above 64 an error is returned. +// If bitSize is below 0 or above 64, an error is returned. // // The errors that ParseInt returns have concrete type *NumError // and include err.Num = s. If s is empty or contains invalid diff --git a/src/strconv/atoi_test.go b/src/strconv/atoi_test.go index ec0542abf8..8b0576b659 100644 --- a/src/strconv/atoi_test.go +++ b/src/strconv/atoi_test.go @@ -65,42 +65,69 @@ var parseUint64BaseTests = []parseUint64BaseTest{ {"01777777777777777777778", 0, 0, ErrSyntax}, {"02000000000000000000000", 0, 1<<64 - 1, ErrRange}, {"0200000000000000000000", 0, 1 << 61, nil}, + {"0b", 0, 0, ErrSyntax}, + {"0B", 0, 0, ErrSyntax}, + {"0b101", 0, 5, nil}, + {"0B101", 0, 5, nil}, + {"0o", 0, 0, ErrSyntax}, + {"0O", 0, 0, ErrSyntax}, + {"0o377", 0, 255, nil}, + {"0O377", 0, 255, nil}, // underscores allowed with base == 0 only - {"1_2_3_4_5", 0, 12345, nil}, + {"1_2_3_4_5", 0, 12345, nil}, // base 0 => 10 {"_12345", 0, 0, ErrSyntax}, {"1__2345", 0, 0, ErrSyntax}, {"12345_", 0, 0, ErrSyntax}, - {"1_2_3_4_5", 10, 0, ErrSyntax}, + {"1_2_3_4_5", 10, 0, ErrSyntax}, // base 10 {"_12345", 10, 0, ErrSyntax}, {"1__2345", 10, 0, ErrSyntax}, {"12345_", 10, 0, ErrSyntax}, - {"0x_1_2_3_4_5", 0, 0x12345, nil}, + {"0x_1_2_3_4_5", 0, 0x12345, nil}, // base 0 => 16 {"_0x12345", 0, 0, ErrSyntax}, {"0x__12345", 0, 0, ErrSyntax}, {"0x1__2345", 0, 0, ErrSyntax}, {"0x1234__5", 0, 0, ErrSyntax}, {"0x12345_", 0, 0, ErrSyntax}, - {"1_2_3_4_5", 16, 0, ErrSyntax}, + {"1_2_3_4_5", 16, 0, ErrSyntax}, // base 16 {"_12345", 16, 0, ErrSyntax}, {"1__2345", 16, 0, ErrSyntax}, {"1234__5", 16, 0, ErrSyntax}, {"12345_", 16, 0, ErrSyntax}, - {"0_1_2_3_4_5", 0, 012345, nil}, + {"0_1_2_3_4_5", 0, 012345, nil}, // base 0 => 8 (0377) {"_012345", 0, 0, ErrSyntax}, {"0__12345", 0, 0, ErrSyntax}, {"01234__5", 0, 0, ErrSyntax}, {"012345_", 0, 0, ErrSyntax}, - {"0_1_2_3_4_5", 8, 0, ErrSyntax}, + {"0o_1_2_3_4_5", 0, 012345, nil}, // base 0 => 8 (0o377) + {"_0o12345", 0, 0, ErrSyntax}, + {"0o__12345", 0, 0, ErrSyntax}, + {"0o1234__5", 0, 0, ErrSyntax}, + {"0o12345_", 0, 0, ErrSyntax}, + + {"0_1_2_3_4_5", 8, 0, ErrSyntax}, // base 8 {"_012345", 8, 0, ErrSyntax}, {"0__12345", 8, 0, ErrSyntax}, {"01234__5", 8, 0, ErrSyntax}, {"012345_", 8, 0, ErrSyntax}, + + {"0b_1_0_1", 0, 5, nil}, // base 0 => 2 (0b101) + {"_0b101", 0, 0, ErrSyntax}, + {"0b__101", 0, 0, ErrSyntax}, + {"0b1__01", 0, 0, ErrSyntax}, + {"0b10__1", 0, 0, ErrSyntax}, + {"0b101_", 0, 0, ErrSyntax}, + + {"1_0_1", 2, 0, ErrSyntax}, // base 2 + {"_101", 2, 0, ErrSyntax}, + {"1_01", 2, 0, ErrSyntax}, + {"10_1", 2, 0, ErrSyntax}, + {"101_", 2, 0, ErrSyntax}, } type parseInt64Test struct { -- GitLab From cf4dc25503e6fb630280f8de0f11112aecb94b57 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 Feb 2019 10:20:28 -0800 Subject: [PATCH 0019/1679] os: don't return ENOENT if directory removed before Fstatat Fixes #30197 Change-Id: I08b592fbd477d6879eb5d3b7fcbbc8322ea90103 Reviewed-on: https://go-review.googlesource.com/c/162078 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/removeall_at.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 7f2d5922ae..0b7d5efb7a 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -71,6 +71,9 @@ func removeAllFrom(parent *File, path string) error { var statInfo syscall.Stat_t statErr := unix.Fstatat(parentFd, path, &statInfo, unix.AT_SYMLINK_NOFOLLOW) if statErr != nil { + if IsNotExist(statErr) { + return nil + } return statErr } if statInfo.Mode&syscall.S_IFMT != syscall.S_IFDIR { -- GitLab From c75ee696c341cef94b00409b3692f3df82af1c71 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 12 Feb 2019 18:33:24 +0000 Subject: [PATCH 0020/1679] doc/go1.12: soften, expand crypto/rc4 assembly removal text Change-Id: I46fa43f6c5ac49386f4622e1363d8976f49c0894 Reviewed-on: https://go-review.googlesource.com/c/162019 Reviewed-by: Andrew Bonventre Reviewed-by: Ian Lance Taylor --- doc/go1.12.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index 3b086e7001..75315d1b52 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -493,8 +493,11 @@ for {
crypto/rc4

- This release removes the optimized assembly implementations. RC4 is insecure - and should only be used for compatibility with legacy systems. + This release removes the assembly implementations, leaving only + the pure Go version. The Go compiler generates code that is + either slightly better or slightly worse, depending on the exact + CPU. RC4 is insecure and should only be used for compatibility + with legacy systems.

-- GitLab From ffd096db2b1cff6399eb1f86e5652564ee8ee362 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 Feb 2019 20:45:45 -0800 Subject: [PATCH 0021/1679] doc: don't use "go tool vet" as an example Fixes #30199 Change-Id: Ib4586e3facb8c0985c8882482d94843b648b9d2f Reviewed-on: https://go-review.googlesource.com/c/162257 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- doc/cmd.html | 8 +++----- doc/install-source.html | 20 +------------------- 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/doc/cmd.html b/doc/cmd.html index c590f4d3ec..e30684793a 100644 --- a/doc/cmd.html +++ b/doc/cmd.html @@ -18,10 +18,8 @@ underlying binary with arguments appropriate to package-level processing.

The programs can also be run as stand-alone binaries, with unmodified arguments, -using the go tool subcommand, such as go tool vet. -This style of invocation allows, for instance, checking a single source file -rather than an entire package: go tool vet myprogram.go as -compared to go vet mypackage. +using the go tool subcommand, such as go tool cgo. +For most commands this is mainly useful for debugging. Some of the commands, such as pprof, are accessible only through the go tool subcommand.

@@ -76,7 +74,7 @@ and rewrites them to use newer ones. -fmt +fmt      Fmt formats Go packages, it is also available as an independent gofmt command with more general options. diff --git a/doc/install-source.html b/doc/install-source.html index 6d416d33f1..bbe7cdfd00 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -349,15 +349,7 @@ provides essential setup instructions for using the Go tools.

The source code for several Go tools (including godoc) is kept in the go.tools repository. -To install all of them, run the go get command: -

- -
-$ go get golang.org/x/tools/cmd/...
-
- -

-Or if you just want to install a specific command (godoc in this case): +To install one of the tools (godoc in this case):

@@ -374,16 +366,6 @@ You must also have a workspace (GOPATH) set up;
 see How to Write Go Code for the details.
 

-

-Note: The go command will install the godoc -binary to $GOROOT/bin (or $GOBIN) and the -cover and vet binaries to -$GOROOT/pkg/tool/$GOOS_$GOARCH. -You can access the latter commands with -"go tool cover" and -"go tool vet". -

-

Community resources

-- GitLab From af8f4062c24cb36af4dc24fbaffd23aa7f7bde36 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sat, 9 Feb 2019 23:31:59 -0500 Subject: [PATCH 0022/1679] runtime: scan gp._panic in stack scan In runtime.gopanic, the _panic object p is stack allocated and referenced from gp._panic. With stack objects, p on stack is dead at the point preprintpanics runs. gp._panic points to p, but stack scan doesn't look at gp. Heap scan of gp does look at gp._panic, but it stops and ignores the pointer as it points to the stack. So whatever p points to may be collected and clobbered. We need to scan gp._panic explicitly during stack scan. To test it reliably, we introduce a GODEBUG mode "clobberfree", which clobbers the memory content when the GC frees an object. Fixes #30150. Change-Id: I11128298f03a89f817faa221421a9d332b41dced Reviewed-on: https://go-review.googlesource.com/c/161778 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall Reviewed-by: Austin Clements --- src/runtime/crash_test.go | 12 ++++++++++++ src/runtime/extern.go | 4 ++++ src/runtime/mgcmark.go | 6 ++++++ src/runtime/mgcsweep.go | 14 +++++++++++++- src/runtime/runtime1.go | 2 ++ src/runtime/testdata/testprog/crash.go | 21 +++++++++++++++++++++ 6 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 6fba4dd91a..03ebf022a6 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -728,3 +728,15 @@ func TestG0StackOverflow(t *testing.T) { runtime.G0StackOverflow() } + +// Test that panic message is not clobbered. +// See issue 30150. +func TestDoublePanic(t *testing.T) { + output := runTestProg(t, "testprog", "DoublePanic", "GODEBUG=clobberfree=1") + wants := []string{"panic: XXX", "panic: YYY"} + for _, want := range wants { + if !strings.Contains(output, want) { + t.Errorf("output:\n%s\n\nwant output containing: %s", output, want) + } + } +} diff --git a/src/runtime/extern.go b/src/runtime/extern.go index af858a331f..437406d991 100644 --- a/src/runtime/extern.go +++ b/src/runtime/extern.go @@ -27,6 +27,10 @@ It is a comma-separated list of name=val pairs setting these named variables: allocfreetrace: setting allocfreetrace=1 causes every allocation to be profiled and a stack trace printed on each object's allocation and free. + clobberfree: setting clobberfree=1 causes the garbage collector to + clobber the memory content of an object with bad content when it frees + the object. + cgocheck: setting cgocheck=0 disables all checks for packages using cgo to incorrectly pass Go pointers to non-Go code. Setting cgocheck=1 (the default) enables relatively cheap diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 86416caab5..022cc8d7d7 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -709,7 +709,13 @@ func scanstack(gp *g, gcw *gcWork) { return true } gentraceback(^uintptr(0), ^uintptr(0), 0, gp, 0, nil, 0x7fffffff, scanframe, nil, 0) + + // Find additional pointers that point into the stack from the heap. + // Currently this includes defers and panics. See also function copystack. tracebackdefers(gp, scanframe, nil) + if gp._panic != nil { + state.putPtr(uintptr(unsafe.Pointer(gp._panic))) + } // Find and scan all reachable stack objects. state.buildIndex() diff --git a/src/runtime/mgcsweep.go b/src/runtime/mgcsweep.go index edb9fcac09..6ac3b03176 100644 --- a/src/runtime/mgcsweep.go +++ b/src/runtime/mgcsweep.go @@ -291,7 +291,7 @@ func (s *mspan) sweep(preserve bool) bool { } } - if debug.allocfreetrace != 0 || raceenabled || msanenabled { + if debug.allocfreetrace != 0 || debug.clobberfree != 0 || raceenabled || msanenabled { // Find all newly freed objects. This doesn't have to // efficient; allocfreetrace has massive overhead. mbits := s.markBitsForBase() @@ -302,6 +302,9 @@ func (s *mspan) sweep(preserve bool) bool { if debug.allocfreetrace != 0 { tracefree(unsafe.Pointer(x), size) } + if debug.clobberfree != 0 { + clobberfree(unsafe.Pointer(x), size) + } if raceenabled { racefree(unsafe.Pointer(x), size) } @@ -446,3 +449,12 @@ retry: traceGCSweepDone() } } + +// clobberfree sets the memory content at x to bad content, for debugging +// purposes. +func clobberfree(x unsafe.Pointer, size uintptr) { + // size (span.elemsize) is always a multiple of 4. + for i := uintptr(0); i < size; i += 4 { + *(*uint32)(add(x, i)) = 0xdeadbeef + } +} diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go index c5667e73ad..0c0a31ee6a 100644 --- a/src/runtime/runtime1.go +++ b/src/runtime/runtime1.go @@ -301,6 +301,7 @@ type dbgVar struct { var debug struct { allocfreetrace int32 cgocheck int32 + clobberfree int32 efence int32 gccheckmark int32 gcpacertrace int32 @@ -318,6 +319,7 @@ var debug struct { var dbgvars = []dbgVar{ {"allocfreetrace", &debug.allocfreetrace}, + {"clobberfree", &debug.clobberfree}, {"cgocheck", &debug.cgocheck}, {"efence", &debug.efence}, {"gccheckmark", &debug.gccheckmark}, diff --git a/src/runtime/testdata/testprog/crash.go b/src/runtime/testdata/testprog/crash.go index 4d83132198..c4990cdda9 100644 --- a/src/runtime/testdata/testprog/crash.go +++ b/src/runtime/testdata/testprog/crash.go @@ -11,6 +11,7 @@ import ( func init() { register("Crash", Crash) + register("DoublePanic", DoublePanic) } func test(name string) { @@ -43,3 +44,23 @@ func Crash() { testInNewThread("second-new-thread") test("main-again") } + +type P string + +func (p P) String() string { + // Try to free the "YYY" string header when the "XXX" + // panic is stringified. + runtime.GC() + runtime.GC() + runtime.GC() + return string(p) +} + +// Test that panic message is not clobbered. +// See issue 30150. +func DoublePanic() { + defer func() { + panic(P("YYY")) + }() + panic(P("XXX")) +} -- GitLab From b690d7e513737769f6eed7cc53ca088517771547 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Sat, 8 Dec 2018 23:32:15 -0800 Subject: [PATCH 0023/1679] net/http/httputil: make TestDumpRequest idempotent TestDumpRequest was failing with -count=2 or more because for test cases that involved mustReadRequest, the body was created as a *bufio.Reader. DumpRequest and DumpRequestOut would then read the body until EOF and would close it after use. However, on re-runs of the test, the body would be terminally exhausted and result in an unexpected error "http: invalid Read on closed Body". The update to the test cases adds an extra field "GetReq" which allows us to construct requests per run of the tests and hence make the test indefinitely re-runnable/idempotent. "Req" or "GetReq" are mutually exclusive: either one of them can be set or nil, but not both. Fixes #26858 Change-Id: Ice3083dac1aa3249da4afc7075cd984eb159530d Reviewed-on: https://go-review.googlesource.com/c/153377 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/http/httputil/dump_test.go | 98 ++++++++++++++++++------------ 1 file changed, 59 insertions(+), 39 deletions(-) diff --git a/src/net/http/httputil/dump_test.go b/src/net/http/httputil/dump_test.go index 63312dd885..97954ca88d 100644 --- a/src/net/http/httputil/dump_test.go +++ b/src/net/http/httputil/dump_test.go @@ -18,7 +18,10 @@ import ( ) type dumpTest struct { - Req http.Request + // Either Req or GetReq can be set/nil but not both. + Req *http.Request + GetReq func() *http.Request + Body interface{} // optional []byte or func() io.ReadCloser to populate Req.Body WantDump string @@ -29,7 +32,7 @@ type dumpTest struct { var dumpTests = []dumpTest{ // HTTP/1.1 => chunked coding; body; empty trailer { - Req: http.Request{ + Req: &http.Request{ Method: "GET", URL: &url.URL{ Scheme: "http", @@ -52,7 +55,7 @@ var dumpTests = []dumpTest{ // Verify that DumpRequest preserves the HTTP version number, doesn't add a Host, // and doesn't add a User-Agent. { - Req: http.Request{ + Req: &http.Request{ Method: "GET", URL: mustParseURL("/foo"), ProtoMajor: 1, @@ -67,7 +70,7 @@ var dumpTests = []dumpTest{ }, { - Req: *mustNewRequest("GET", "http://example.com/foo", nil), + Req: mustNewRequest("GET", "http://example.com/foo", nil), WantDumpOut: "GET /foo HTTP/1.1\r\n" + "Host: example.com\r\n" + @@ -79,8 +82,7 @@ var dumpTests = []dumpTest{ // with a bytes.Buffer and hang with all goroutines not // runnable. { - Req: *mustNewRequest("GET", "https://example.com/foo", nil), - + Req: mustNewRequest("GET", "https://example.com/foo", nil), WantDumpOut: "GET /foo HTTP/1.1\r\n" + "Host: example.com\r\n" + "User-Agent: Go-http-client/1.1\r\n" + @@ -89,7 +91,7 @@ var dumpTests = []dumpTest{ // Request with Body, but Dump requested without it. { - Req: http.Request{ + Req: &http.Request{ Method: "POST", URL: &url.URL{ Scheme: "http", @@ -114,7 +116,7 @@ var dumpTests = []dumpTest{ // Request with Body > 8196 (default buffer size) { - Req: http.Request{ + Req: &http.Request{ Method: "POST", URL: &url.URL{ Scheme: "http", @@ -145,8 +147,10 @@ var dumpTests = []dumpTest{ }, { - Req: *mustReadRequest("GET http://foo.com/ HTTP/1.1\r\n" + - "User-Agent: blah\r\n\r\n"), + GetReq: func() *http.Request { + return mustReadRequest("GET http://foo.com/ HTTP/1.1\r\n" + + "User-Agent: blah\r\n\r\n") + }, NoBody: true, WantDump: "GET http://foo.com/ HTTP/1.1\r\n" + "User-Agent: blah\r\n\r\n", @@ -154,22 +158,25 @@ var dumpTests = []dumpTest{ // Issue #7215. DumpRequest should return the "Content-Length" when set { - Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + - "Host: passport.myhost.com\r\n" + - "Content-Length: 3\r\n" + - "\r\nkey1=name1&key2=name2"), + GetReq: func() *http.Request { + return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + + "Host: passport.myhost.com\r\n" + + "Content-Length: 3\r\n" + + "\r\nkey1=name1&key2=name2") + }, WantDump: "POST /v2/api/?login HTTP/1.1\r\n" + "Host: passport.myhost.com\r\n" + "Content-Length: 3\r\n" + "\r\nkey", }, - // Issue #7215. DumpRequest should return the "Content-Length" in ReadRequest { - Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + - "Host: passport.myhost.com\r\n" + - "Content-Length: 0\r\n" + - "\r\nkey1=name1&key2=name2"), + GetReq: func() *http.Request { + return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + + "Host: passport.myhost.com\r\n" + + "Content-Length: 0\r\n" + + "\r\nkey1=name1&key2=name2") + }, WantDump: "POST /v2/api/?login HTTP/1.1\r\n" + "Host: passport.myhost.com\r\n" + "Content-Length: 0\r\n\r\n", @@ -177,9 +184,11 @@ var dumpTests = []dumpTest{ // Issue #7215. DumpRequest should not return the "Content-Length" if unset { - Req: *mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + - "Host: passport.myhost.com\r\n" + - "\r\nkey1=name1&key2=name2"), + GetReq: func() *http.Request { + return mustReadRequest("POST /v2/api/?login HTTP/1.1\r\n" + + "Host: passport.myhost.com\r\n" + + "\r\nkey1=name1&key2=name2") + }, WantDump: "POST /v2/api/?login HTTP/1.1\r\n" + "Host: passport.myhost.com\r\n\r\n", }, @@ -187,8 +196,7 @@ var dumpTests = []dumpTest{ // Issue 18506: make drainBody recognize NoBody. Otherwise // this was turning into a chunked request. { - Req: *mustNewRequest("POST", "http://example.com/foo", http.NoBody), - + Req: mustNewRequest("POST", "http://example.com/foo", http.NoBody), WantDumpOut: "POST /foo HTTP/1.1\r\n" + "Host: example.com\r\n" + "User-Agent: Go-http-client/1.1\r\n" + @@ -200,28 +208,40 @@ var dumpTests = []dumpTest{ func TestDumpRequest(t *testing.T) { numg0 := runtime.NumGoroutine() for i, tt := range dumpTests { - setBody := func() { - if tt.Body == nil { - return + if tt.Req != nil && tt.GetReq != nil || tt.Req == nil && tt.GetReq == nil { + t.Errorf("#%d: either .Req(%p) or .GetReq(%p) can be set/nil but not both", i, tt.Req, tt.GetReq) + continue + } + + freshReq := func(ti dumpTest) *http.Request { + req := ti.Req + if req == nil { + req = ti.GetReq() } - switch b := tt.Body.(type) { + + if req.Header == nil { + req.Header = make(http.Header) + } + + if ti.Body == nil { + return req + } + switch b := ti.Body.(type) { case []byte: - tt.Req.Body = ioutil.NopCloser(bytes.NewReader(b)) + req.Body = ioutil.NopCloser(bytes.NewReader(b)) case func() io.ReadCloser: - tt.Req.Body = b() + req.Body = b() default: - t.Fatalf("Test %d: unsupported Body of %T", i, tt.Body) + t.Fatalf("Test %d: unsupported Body of %T", i, ti.Body) } - } - if tt.Req.Header == nil { - tt.Req.Header = make(http.Header) + return req } if tt.WantDump != "" { - setBody() - dump, err := DumpRequest(&tt.Req, !tt.NoBody) + req := freshReq(tt) + dump, err := DumpRequest(req, !tt.NoBody) if err != nil { - t.Errorf("DumpRequest #%d: %s", i, err) + t.Errorf("DumpRequest #%d: %s\nWantDump:\n%s", i, err, tt.WantDump) continue } if string(dump) != tt.WantDump { @@ -231,8 +251,8 @@ func TestDumpRequest(t *testing.T) { } if tt.WantDumpOut != "" { - setBody() - dump, err := DumpRequestOut(&tt.Req, !tt.NoBody) + req := freshReq(tt) + dump, err := DumpRequestOut(req, !tt.NoBody) if err != nil { t.Errorf("DumpRequestOut #%d: %s", i, err) continue -- GitLab From 48bb61166711f47eb401f245c704a5a4887d4503 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 13 Feb 2019 16:15:09 +0000 Subject: [PATCH 0024/1679] crypto/tls, runtime: document GODEBUG TLS 1.3 option Change-Id: I6801676335924414ce50249df2b7bea08886b203 Reviewed-on: https://go-review.googlesource.com/c/162360 Reviewed-by: Filippo Valsorda --- src/crypto/tls/tls.go | 9 +++++++++ src/runtime/extern.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/crypto/tls/tls.go b/src/crypto/tls/tls.go index f8e32ab495..578035cf73 100644 --- a/src/crypto/tls/tls.go +++ b/src/crypto/tls/tls.go @@ -4,6 +4,15 @@ // Package tls partially implements TLS 1.2, as specified in RFC 5246, // and TLS 1.3, as specified in RFC 8446. +// +// TLS 1.3 is available only on an opt-in basis in Go 1.12. To enable +// it, set the GODEBUG environment variable (comma-separated key=value +// options) such that it includes "tls13=1". To enable it from within +// the process, set the environment variable before any use of TLS: +// +// func init() { +// os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",tls13=1") +// } package tls // BUG(agl): The crypto/tls package only implements some countermeasures diff --git a/src/runtime/extern.go b/src/runtime/extern.go index 437406d991..e308dd38b1 100644 --- a/src/runtime/extern.go +++ b/src/runtime/extern.go @@ -127,7 +127,7 @@ It is a comma-separated list of name=val pairs setting these named variables: IDs will refer to the ID of the goroutine at the time of creation; it's possible for this ID to be reused for another goroutine. Setting N to 0 will report no ancestry information. -The net and net/http packages also refer to debugging variables in GODEBUG. +The net, net/http, and crypto/tls packages also refer to debugging variables in GODEBUG. See the documentation for those packages for details. The GOMAXPROCS variable limits the number of operating system threads that -- GitLab From 7cf31d8f4116420e396c5e8690c043b2ce83f90a Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 13 Feb 2019 19:07:40 +0000 Subject: [PATCH 0025/1679] doc/go1.12: note that Go 1.12 is the last release to include godoc Updates #30029 Change-Id: I88e09035d675e7a6855ada0262eb42636c9822cc Reviewed-on: https://go-review.googlesource.com/c/162417 Reviewed-by: Andrew Bonventre --- doc/go1.12.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index 75315d1b52..fda61a69a7 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -303,7 +303,9 @@ for {

In Go 1.12, godoc no longer has a command-line interface and is only a web server. Users should use go doc - for command-line help output instead. + for command-line help output instead. Go 1.12 is the last release that will + include the godoc webserver; in Go 1.13 it will be available + via go get.

-- GitLab From 4c89a10fb9f4fcb2ed01b6e7325e53b4bc487fc2 Mon Sep 17 00:00:00 2001 From: Zhou Peng Date: Fri, 15 Feb 2019 16:41:33 +0800 Subject: [PATCH 0026/1679] database/sql/driver: fix typo Change-Id: I6e7035db4b3e2a09e5655eb7646eea9d99fb7118 Reviewed-on: https://go-review.googlesource.com/c/162917 Reviewed-by: Brad Fitzpatrick --- src/database/sql/driver/driver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/sql/driver/driver.go b/src/database/sql/driver/driver.go index 5ff2bc9735..ecc6547bf3 100644 --- a/src/database/sql/driver/driver.go +++ b/src/database/sql/driver/driver.go @@ -137,7 +137,7 @@ type Pinger interface { // Execer is an optional interface that may be implemented by a Conn. // -// If a Conn implements neither ExecerContext nor Execer Execer, +// If a Conn implements neither ExecerContext nor Execer, // the sql package's DB.Exec will first prepare a query, execute the statement, // and then close the statement. // -- GitLab From 65c2069a9f30cb6fa2c512d17dc0ad654d621da9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Feb 2019 17:37:50 -0500 Subject: [PATCH 0027/1679] cmd/go: only generate a go.mod file during 'go mod init' In the general case, we do not know the correct module path for a new module unless we have checked its VCS tags for a major version. If we do not know the correct path, then we should not synthesize a go.mod file automatically from it. On the other hand, we don't want to run VCS commands in the working directory without an explicit request by the user to do so: 'go mod init' can reasonably invoke a VCS command, but 'go build' should not. Therefore, we should only create a go.mod file during 'go mod init'. This change removes the previous behavior of synthesizing a file automatically, and instead suggests a command that the user can opt to run explicitly. Updates #29433 Updates #27009 Updates #30228 Change-Id: I8c4554969db17156e97428df220b129a4d361040 Reviewed-on: https://go-review.googlesource.com/c/162699 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/init.go | 77 ++++++++++--------- src/cmd/go/internal/modload/init_test.go | 42 ---------- src/cmd/go/internal/modload/load.go | 2 +- .../go/testdata/script/mod_convert_dep.txt | 22 ++++++ .../go/testdata/script/mod_convert_git.txt | 15 +++- .../go/testdata/script/mod_convert_glide.txt | 9 +++ .../testdata/script/mod_convert_glockfile.txt | 9 +++ .../go/testdata/script/mod_convert_godeps.txt | 9 +++ .../go/testdata/script/mod_convert_tsv.txt | 9 +++ .../script/mod_convert_vendor_conf.txt | 9 +++ .../script/mod_convert_vendor_json.txt | 9 +++ .../script/mod_convert_vendor_manifest.txt | 9 +++ .../script/mod_convert_vendor_yml.txt | 9 +++ src/cmd/go/testdata/script/mod_find.txt | 12 +++ 14 files changed, 162 insertions(+), 80 deletions(-) delete mode 100644 src/cmd/go/internal/modload/init_test.go diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 22d14ccce7..a0514d425e 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -154,7 +154,7 @@ func Init() { die() // Don't init a module that we're just going to ignore. } // No automatic enabling in GOPATH. - if root, _ := FindModuleRoot(cwd, "", false); root != "" { + if root := findModuleRoot(cwd); root != "" { cfg.GoModInGOPATH = filepath.Join(root, "go.mod") } return @@ -164,7 +164,7 @@ func Init() { // Running 'go mod init': go.mod will be created in current directory. modRoot = cwd } else { - modRoot, _ = FindModuleRoot(cwd, "", MustUseModules) + modRoot = findModuleRoot(cwd) if modRoot == "" { if !MustUseModules { // GO111MODULE is 'auto' (or unset), and we can't find a module root. @@ -302,6 +302,19 @@ func die() { if inGOPATH && !MustUseModules { base.Fatalf("go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'") } + if cwd != "" { + if dir, name := findAltConfig(cwd); dir != "" { + rel, err := filepath.Rel(cwd, dir) + if err != nil { + rel = dir + } + cdCmd := "" + if rel != "." { + cdCmd = fmt.Sprintf("cd %s && ", rel) + } + base.Fatalf("go: cannot find main module, but found %s in %s\n\tto create a module there, run:\n\t%sgo mod init", name, dir, cdCmd) + } + } base.Fatalf("go: cannot find main module; see 'go help modules'") } @@ -330,12 +343,6 @@ func InitMod() { gomod := filepath.Join(modRoot, "go.mod") data, err := ioutil.ReadFile(gomod) if err != nil { - if os.IsNotExist(err) { - legacyModInit() - modFileToBuildList() - WriteGoMod() - return - } base.Fatalf("go: %v", err) } @@ -349,7 +356,7 @@ func InitMod() { if len(f.Syntax.Stmt) == 0 || f.Module == nil { // Empty mod file. Must add module path. - path, err := FindModulePath(modRoot) + path, err := findModulePath(modRoot) if err != nil { base.Fatalf("go: %v", err) } @@ -387,7 +394,7 @@ func Allowed(m module.Version) bool { func legacyModInit() { if modFile == nil { - path, err := FindModulePath(modRoot) + path, err := findModulePath(modRoot) if err != nil { base.Fatalf("go: %v", err) } @@ -454,19 +461,13 @@ var altConfigs = []string{ ".git/config", } -// Exported only for testing. -func FindModuleRoot(dir, limit string, legacyConfigOK bool) (root, file string) { +func findModuleRoot(dir string) (root string) { dir = filepath.Clean(dir) - dir1 := dir - limit = filepath.Clean(limit) // Look for enclosing go.mod. for { if fi, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil && !fi.IsDir() { - return dir, "go.mod" - } - if dir == limit { - break + return dir } d := filepath.Dir(dir) if d == dir { @@ -474,37 +475,41 @@ func FindModuleRoot(dir, limit string, legacyConfigOK bool) (root, file string) } dir = d } + return "" +} - // Failing that, look for enclosing alternate version config. - if legacyConfigOK { - dir = dir1 - for { - for _, name := range altConfigs { - if fi, err := os.Stat(filepath.Join(dir, name)); err == nil && !fi.IsDir() { - return dir, name +func findAltConfig(dir string) (root, name string) { + dir = filepath.Clean(dir) + for { + for _, name := range altConfigs { + if fi, err := os.Stat(filepath.Join(dir, name)); err == nil && !fi.IsDir() { + if rel := search.InDir(dir, cfg.BuildContext.GOROOT); rel == "." { + // Don't suggest creating a module from $GOROOT/.git/config. + return "", "" } + return dir, name } - if dir == limit { - break - } - d := filepath.Dir(dir) - if d == dir { - break - } - dir = d } + d := filepath.Dir(dir) + if d == dir { + break + } + dir = d } - return "", "" } -// Exported only for testing. -func FindModulePath(dir string) (string, error) { +func findModulePath(dir string) (string, error) { if CmdModModule != "" { // Running go mod init x/y/z; return x/y/z. return CmdModModule, nil } + // TODO(bcmills): once we have located a plausible module path, we should + // query version control (if available) to verify that it matches the major + // version of the most recent tag. + // See https://golang.org/issue/29433 and https://golang.org/issue/27009. + // Cast about for import comments, // first in top-level directory, then in subdirectories. list, _ := ioutil.ReadDir(dir) diff --git a/src/cmd/go/internal/modload/init_test.go b/src/cmd/go/internal/modload/init_test.go deleted file mode 100644 index 2df9d8af7d..0000000000 --- a/src/cmd/go/internal/modload/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 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 modload - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" -) - -func TestFindModuleRootIgnoreDir(t *testing.T) { - // In Plan 9, directories are automatically created in /n. - // For example, /n/go.mod always exist, but it's a directory. - // Test that we ignore directories when trying to find go.mod and other config files. - - dir, err := ioutil.TempDir("", "gotest") - if err != nil { - t.Fatalf("failed to create temporary directory: %v", err) - } - defer os.RemoveAll(dir) - if err := os.Mkdir(filepath.Join(dir, "go.mod"), os.ModeDir|0755); err != nil { - t.Fatalf("Mkdir failed: %v", err) - } - for _, name := range altConfigs { - if err := os.MkdirAll(filepath.Join(dir, name), os.ModeDir|0755); err != nil { - t.Fatalf("MkdirAll failed: %v", err) - } - } - p := filepath.Join(dir, "example") - if err := os.Mkdir(p, os.ModeDir|0755); err != nil { - t.Fatalf("Mkdir failed: %v", err) - } - if root, _ := FindModuleRoot(p, "", false); root != "" { - t.Errorf("FindModuleRoot(%q, \"\", false): %q, want empty string", p, root) - } - if root, _ := FindModuleRoot(p, "", true); root != "" { - t.Errorf("FindModuleRoot(%q, \"\", true): %q, want empty string", p, root) - } -} diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 5bb943dd6d..6d6c037af2 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -111,7 +111,7 @@ func ImportPaths(patterns []string) []*search.Match { } else { pkg = Target.Path + suffix } - } else if sub := search.InDir(dir, cfg.GOROOTsrc); sub != "" && !strings.Contains(sub, "@") { + } else if sub := search.InDir(dir, cfg.GOROOTsrc); sub != "" && sub != "." && !strings.Contains(sub, "@") { pkg = filepath.ToSlash(sub) } else if path := pathInModuleCache(dir); path != "" { pkg = path diff --git a/src/cmd/go/testdata/script/mod_convert_dep.txt b/src/cmd/go/testdata/script/mod_convert_dep.txt index cc1083bcba..267c90eb3c 100644 --- a/src/cmd/go/testdata/script/mod_convert_dep.txt +++ b/src/cmd/go/testdata/script/mod_convert_dep.txt @@ -1,9 +1,31 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found Gopkg.lock in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' +# In Plan 9, directories are automatically created in /n. +# For example, /n/Gopkg.lock always exists, but it's a directory. +# Test that we ignore directories when trying to find alternate config files. +cd $WORK/gopkgdir/x +! go list . +stderr 'cannot find main module' +! stderr 'Gopkg.lock' +! stderr 'go mod init' + -- $WORK/test/Gopkg.lock -- -- $WORK/test/x/x.go -- package x // import "m/x" +-- $WORK/gopkgdir/Gopkg.lock/README.txt -- +../Gopkg.lock is a directory, not a file. +-- $WORK/gopkgdir/x/x.go -- +package x // import "m/x" diff --git a/src/cmd/go/testdata/script/mod_convert_git.txt b/src/cmd/go/testdata/script/mod_convert_git.txt index 5ef534a8f8..ece505a7ba 100644 --- a/src/cmd/go/testdata/script/mod_convert_git.txt +++ b/src/cmd/go/testdata/script/mod_convert_git.txt @@ -1,10 +1,23 @@ env GO111MODULE=on -# detect root of module tree as root of enclosing git repo +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found .git/config in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' +# We should not suggest creating a go.mod file in $GOROOT, even though there may be a .git/config there. +cd $GOROOT +! go list . +! stderr 'go mod init' + -- $WORK/test/.git/config -- -- $WORK/test/x/x.go -- package x // import "m/x" diff --git a/src/cmd/go/testdata/script/mod_convert_glide.txt b/src/cmd/go/testdata/script/mod_convert_glide.txt index 50460bbf36..9f1fff51bf 100644 --- a/src/cmd/go/testdata/script/mod_convert_glide.txt +++ b/src/cmd/go/testdata/script/mod_convert_glide.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found glide.lock in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_glockfile.txt b/src/cmd/go/testdata/script/mod_convert_glockfile.txt index 4d9aaffab5..6aa0794888 100644 --- a/src/cmd/go/testdata/script/mod_convert_glockfile.txt +++ b/src/cmd/go/testdata/script/mod_convert_glockfile.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found GLOCKFILE in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_godeps.txt b/src/cmd/go/testdata/script/mod_convert_godeps.txt index 61fbab1124..da7b6c1059 100644 --- a/src/cmd/go/testdata/script/mod_convert_godeps.txt +++ b/src/cmd/go/testdata/script/mod_convert_godeps.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found Godeps/Godeps.json in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_tsv.txt b/src/cmd/go/testdata/script/mod_convert_tsv.txt index 5b82d85d65..6015ac8754 100644 --- a/src/cmd/go/testdata/script/mod_convert_tsv.txt +++ b/src/cmd/go/testdata/script/mod_convert_tsv.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found dependencies.tsv in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_vendor_conf.txt b/src/cmd/go/testdata/script/mod_convert_vendor_conf.txt index b45d3b69fe..57ec4191a4 100644 --- a/src/cmd/go/testdata/script/mod_convert_vendor_conf.txt +++ b/src/cmd/go/testdata/script/mod_convert_vendor_conf.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found vendor.conf in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_vendor_json.txt b/src/cmd/go/testdata/script/mod_convert_vendor_json.txt index cb6e5fee15..47d111d4c1 100644 --- a/src/cmd/go/testdata/script/mod_convert_vendor_json.txt +++ b/src/cmd/go/testdata/script/mod_convert_vendor_json.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found vendor/vendor.json in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_vendor_manifest.txt b/src/cmd/go/testdata/script/mod_convert_vendor_manifest.txt index bcf185136b..68edb9dc29 100644 --- a/src/cmd/go/testdata/script/mod_convert_vendor_manifest.txt +++ b/src/cmd/go/testdata/script/mod_convert_vendor_manifest.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found vendor/manifest in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_convert_vendor_yml.txt b/src/cmd/go/testdata/script/mod_convert_vendor_yml.txt index 0cd245bace..4ed140a25a 100644 --- a/src/cmd/go/testdata/script/mod_convert_vendor_yml.txt +++ b/src/cmd/go/testdata/script/mod_convert_vendor_yml.txt @@ -1,6 +1,15 @@ env GO111MODULE=on +# We should not create a go.mod file unless the user ran 'go mod init' explicitly. +# However, we should suggest 'go mod init' if we can find an alternate config file. cd $WORK/test/x +! go list . +stderr 'found vendor.yml in .*[/\\]test' +stderr '\s*cd \.\. && go mod init' + +# The command we suggested should succeed. +cd .. +go mod init go list -m all stdout '^m$' diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index f4ac8d01f5..eb7f974b3b 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -43,6 +43,13 @@ go mod init stderr 'empty' rm go.mod +# In Plan 9, directories are automatically created in /n. +# For example, /n/go.mod always exist, but it's a directory. +# Test that we ignore directories when trying to find go.mod. +cd $WORK/gomoddir +! go list . +stderr 'cannot find main module' + [!symlink] stop # gplink1/src/empty where gopathlink -> GOPATH @@ -89,3 +96,8 @@ package y package z -- $GOPATH/src/example.com/x/y/z/Godeps/Godeps.json -- {"ImportPath": "unexpected.com/z"} + +-- $WORK/gomoddir/go.mod/README.txt -- +../go.mod is a directory, not a file. +-- $WORK/gomoddir/p.go -- +package p -- GitLab From 5fcc24074f8e48cd8404bd250c2c268aca2bc3d2 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 15 Feb 2019 18:55:45 +0000 Subject: [PATCH 0028/1679] syscall: skip TestSyscallNoError when temp dir is mounted nosuid Fixes #30258 Change-Id: I73b63eb9d3aca00f562fdc3af010e96269bb6b9c Reviewed-on: https://go-review.googlesource.com/c/162891 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Katie Hockman --- src/syscall/syscall_linux_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/syscall/syscall_linux_test.go b/src/syscall/syscall_linux_test.go index 293549a841..8a578639bd 100644 --- a/src/syscall/syscall_linux_test.go +++ b/src/syscall/syscall_linux_test.go @@ -360,10 +360,23 @@ func TestSyscallNoError(t *testing.T) { strconv.FormatUint(uint64(-uid), 10) + " / " + strconv.FormatUint(uint64(uid), 10) if got != want { + if filesystemIsNoSUID(tmpBinary) { + t.Skip("skipping test when temp dir is mounted nosuid") + } t.Errorf("expected %s, got %s", want, got) } } +// filesystemIsNoSUID reports whether the filesystem for the given +// path is mounted nosuid. +func filesystemIsNoSUID(path string) bool { + var st syscall.Statfs_t + if syscall.Statfs(path, &st) != nil { + return false + } + return st.Flags&syscall.MS_NOSUID != 0 +} + func syscallNoError() { // Test that the return value from SYS_GETEUID32 (which cannot fail) // doesn't get treated as an error (see https://golang.org/issue/22924) -- GitLab From e1acd854f754f496be341211e9deee53fc7e3404 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 15 Feb 2019 13:00:03 -0800 Subject: [PATCH 0029/1679] cmd/go: add newline after module-requires-version message Fixes #30263 Change-Id: Iefb3d8baf815c19eaf915a59048e1da799ca0cdf Reviewed-on: https://go-review.googlesource.com/c/162957 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/work/exec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index baa5872687..bbcbdd7568 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -655,7 +655,7 @@ func (b *Builder) build(a *Action) (err error) { if len(out) > 0 { output := b.processOutput(out) if p.Module != nil && !allowedVersion(p.Module.GoVersion) { - output += "note: module requires Go " + p.Module.GoVersion + output += "note: module requires Go " + p.Module.GoVersion + "\n" } b.showOutput(a, a.Package.Dir, a.Package.Desc(), output) if err != nil { -- GitLab From 585c9e8412540b10be5154d019828a1a27f7b4c4 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sun, 20 Jan 2019 10:52:11 -0800 Subject: [PATCH 0030/1679] cmd/compile: implement shifts by signed amounts Allow shifts by signed amounts. Panic if the shift amount is negative. TODO: We end up doing two compares per shift, see Ian's comment https://github.com/golang/go/issues/19113#issuecomment-443241799 that we could do it with a single comparison in the normal case. The prove pass mostly handles this code well. For instance, it removes the <0 check for cases like this: if s >= 0 { _ = x << s } _ = x << len(a) This case isn't handled well yet: _ = x << (y & 0xf) I'll do followon CLs for unhandled cases as needed. Update #19113 R=go1.13 Change-Id: I839a5933d94b54ab04deb9dd5149f32c51c90fa1 Reviewed-on: https://go-review.googlesource.com/c/158719 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/builtin.go | 1 + .../compile/internal/gc/builtin/runtime.go | 1 + src/cmd/compile/internal/gc/go.go | 1 + src/cmd/compile/internal/gc/ssa.go | 9 +- src/cmd/compile/internal/gc/typecheck.go | 4 +- src/cmd/compile/internal/ssa/rewrite.go | 3 +- src/cmd/internal/obj/x86/obj6.go | 2 +- src/runtime/panic.go | 20 +++- test/fixedbugs/bug073.go | 10 +- test/fixedbugs/issue19113.go | 108 ++++++++++++++++++ 10 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 test/fixedbugs/issue19113.go diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index 04f4cbfd58..f32fcd675d 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -13,6 +13,7 @@ var runtimeDecls = [...]struct { {"panicindex", funcTag, 5}, {"panicslice", funcTag, 5}, {"panicdivide", funcTag, 5}, + {"panicshift", funcTag, 5}, {"panicmakeslicelen", funcTag, 5}, {"throwinit", funcTag, 5}, {"panicwrap", funcTag, 5}, diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index fc879badb2..210881a6e9 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -18,6 +18,7 @@ func newobject(typ *byte) *any func panicindex() func panicslice() func panicdivide() +func panicshift() func panicmakeslicelen() func throwinit() func panicwrap() diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 376637ba9a..2213d8d9b8 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -296,6 +296,7 @@ var ( msanwrite, newproc, panicdivide, + panicshift, panicdottypeE, panicdottypeI, panicindex, diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index e20137669a..6ddc9fba7a 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -84,6 +84,7 @@ func initssaconfig() { panicnildottype = sysfunc("panicnildottype") panicoverflow = sysfunc("panicoverflow") panicslice = sysfunc("panicslice") + panicshift = sysfunc("panicshift") raceread = sysfunc("raceread") racereadrange = sysfunc("racereadrange") racewrite = sysfunc("racewrite") @@ -2128,7 +2129,13 @@ func (s *state) expr(n *Node) *ssa.Value { case OLSH, ORSH: a := s.expr(n.Left) b := s.expr(n.Right) - return s.newValue2(s.ssaShiftOp(n.Op, n.Type, n.Right.Type), a.Type, a, b) + bt := b.Type + if bt.IsSigned() { + cmp := s.newValue2(s.ssaOp(OGE, bt), types.Types[TBOOL], b, s.zeroVal(bt)) + s.check(cmp, panicshift) + bt = bt.ToUnsigned() + } + return s.newValue2(s.ssaShiftOp(n.Op, n.Type, bt), a.Type, a, b) case OANDAND, OOROR: // To implement OANDAND (and OOROR), we introduce a // new temporary variable to hold the result. The diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 4fc1c5c73c..63e0d78273 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -660,8 +660,8 @@ func typecheck1(n *Node, top int) (res *Node) { r = defaultlit(r, types.Types[TUINT]) n.Right = r t := r.Type - if !t.IsInteger() || t.IsSigned() { - yyerror("invalid operation: %v (shift count type %v, must be unsigned integer)", n, r.Type) + if !t.IsInteger() { + yyerror("invalid operation: %v (shift count type %v, must be integer)", n, r.Type) n.Type = nil return n } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index a154249371..6edb593df9 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1115,7 +1115,8 @@ func needRaceCleanup(sym interface{}, v *Value) bool { case OpStaticCall: switch v.Aux.(fmt.Stringer).String() { case "runtime.racefuncenter", "runtime.racefuncexit", "runtime.panicindex", - "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap": + "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap", + "runtime.panicshift": // Check for racefuncenter will encounter racefuncexit and vice versa. // Allow calls to panic* default: diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index babfd38ad2..a6931e8441 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -968,7 +968,7 @@ func isZeroArgRuntimeCall(s *obj.LSym) bool { return false } switch s.Name { - case "runtime.panicindex", "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap": + case "runtime.panicindex", "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap", "runtime.panicshift": return true } return false diff --git a/src/runtime/panic.go b/src/runtime/panic.go index bb83be4715..59916dd5e5 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -23,16 +23,16 @@ func panicCheckMalloc(err error) { var indexError = error(errorString("index out of range")) -// The panicindex, panicslice, and panicdivide functions are called by +// The panic{index,slice,divide,shift} functions are called by // code generated by the compiler for out of bounds index expressions, -// out of bounds slice expressions, and division by zero. The -// panicdivide (again), panicoverflow, panicfloat, and panicmem +// out of bounds slice expressions, division by zero, and shift by negative. +// The panicdivide (again), panicoverflow, panicfloat, and panicmem // functions are called by the signal handler when a signal occurs // indicating the respective problem. // -// Since panicindex and panicslice are never called directly, and +// Since panic{index,slice,shift} are never called directly, and // since the runtime package should never have an out of bounds slice -// or array reference, if we see those functions called from the +// or array reference or negative shift, if we see those functions called from the // runtime package we turn the panic into a throw. That will dump the // entire runtime stack for easier debugging. @@ -68,6 +68,16 @@ func panicoverflow() { panic(overflowError) } +var shiftError = error(errorString("negative shift amount")) + +func panicshift() { + if hasPrefix(funcname(findfunc(getcallerpc())), "runtime.") { + throw(string(shiftError.(errorString))) + } + panicCheckMalloc(shiftError) + panic(shiftError) +} + var floatError = error(errorString("floating point error")) func panicfloat() { diff --git a/test/fixedbugs/bug073.go b/test/fixedbugs/bug073.go index 49b47ae464..f3605b37cf 100644 --- a/test/fixedbugs/bug073.go +++ b/test/fixedbugs/bug073.go @@ -1,4 +1,4 @@ -// errorcheck +// compile // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -7,8 +7,8 @@ package main func main() { - var s int = 0; - var x int = 0; - x = x << s; // ERROR "illegal|inval|shift" - x = x >> s; // ERROR "illegal|inval|shift" + var s int = 0 + var x int = 0 + x = x << s // as of 1.13, these are ok + x = x >> s // as of 1.13, these are ok } diff --git a/test/fixedbugs/issue19113.go b/test/fixedbugs/issue19113.go new file mode 100644 index 0000000000..5e01dde699 --- /dev/null +++ b/test/fixedbugs/issue19113.go @@ -0,0 +1,108 @@ +// run + +// Copyright 2019 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 main + +import "reflect" + +var tests = []interface{}{ + func(x int, s int) int { + return x << s + }, + func(x int, s int64) int { + return x << s + }, + func(x int, s int32) int { + return x << s + }, + func(x int, s int16) int { + return x << s + }, + func(x int, s int8) int { + return x << s + }, + func(x int, s int) int { + return x >> s + }, + func(x int, s int64) int { + return x >> s + }, + func(x int, s int32) int { + return x >> s + }, + func(x int, s int16) int { + return x >> s + }, + func(x int, s int8) int { + return x >> s + }, + func(x uint, s int) uint { + return x << s + }, + func(x uint, s int64) uint { + return x << s + }, + func(x uint, s int32) uint { + return x << s + }, + func(x uint, s int16) uint { + return x << s + }, + func(x uint, s int8) uint { + return x << s + }, + func(x uint, s int) uint { + return x >> s + }, + func(x uint, s int64) uint { + return x >> s + }, + func(x uint, s int32) uint { + return x >> s + }, + func(x uint, s int16) uint { + return x >> s + }, + func(x uint, s int8) uint { + return x >> s + }, +} + +func main() { + for _, t := range tests { + runTest(reflect.ValueOf(t)) + } +} + +func runTest(f reflect.Value) { + xt := f.Type().In(0) + st := f.Type().In(1) + + for _, x := range []int{1, 0, -1} { + for _, s := range []int{-99, -64, -63, -32, -31, -16, -15, -8, -7, -1, 0, 1, 7, 8, 15, 16, 31, 32, 63, 64, 99} { + args := []reflect.Value{ + reflect.ValueOf(x).Convert(xt), + reflect.ValueOf(s).Convert(st), + } + if s < 0 { + shouldPanic(func() { + f.Call(args) + }) + } else { + f.Call(args) // should not panic + } + } + } +} + +func shouldPanic(f func()) { + defer func() { + if recover() == nil { + panic("did not panic") + } + }() + f() +} -- GitLab From ef454fd586ee30d8b35b5895320619ebde2beb98 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 15 Feb 2019 23:42:32 +0000 Subject: [PATCH 0031/1679] doc/go1.12: document net/url.Parse now rejecting ASCII CTLs Updates #27302 Updates #22907 Change-Id: Iac6957f3517265dfb9c662efb7af31192e3bfd6c Reviewed-on: https://go-review.googlesource.com/c/162960 Reviewed-by: Ian Lance Taylor --- doc/go1.12.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/go1.12.html b/doc/go1.12.html index fda61a69a7..1b937fdd79 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -694,6 +694,20 @@ for { +

net/url
+
+

+ Parse, + ParseRequestURI, + and + URL.Parse + now return an + error for URLs containing ASCII control characters, which includes NULL, + tab, and newlines. +

+ +
+
net/http/httputil

-- GitLab From dca707b2a040642bb46aa4da4fb4eb6188cc2502 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 15 Feb 2019 15:01:29 -0500 Subject: [PATCH 0032/1679] cmd/compile: guard against loads with negative offset from readonly constants CL 154057 adds guards agaist out-of-bound reads from readonly constants. It turns out that in dead code, the offset can also be negative. Guard against negative offset as well. Fixes #30257. Change-Id: I47c2a2e434dd466c08ae6f50f213999a358c796e Reviewed-on: https://go-review.googlesource.com/c/162819 Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/rewrite.go | 8 ++++---- test/fixedbugs/issue29215.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 6edb593df9..9c9de750b2 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1142,7 +1142,7 @@ func symIsRO(sym interface{}) bool { // read8 reads one byte from the read-only global sym at offset off. func read8(sym interface{}, off int64) uint8 { lsym := sym.(*obj.LSym) - if off >= int64(len(lsym.P)) { + if off >= int64(len(lsym.P)) || off < 0 { // Invalid index into the global sym. // This can happen in dead code, so we don't want to panic. // Just return any value, it will eventually get ignored. @@ -1155,7 +1155,7 @@ func read8(sym interface{}, off int64) uint8 { // read16 reads two bytes from the read-only global sym at offset off. func read16(sym interface{}, off int64, bigEndian bool) uint16 { lsym := sym.(*obj.LSym) - if off >= int64(len(lsym.P))-1 { + if off >= int64(len(lsym.P))-1 || off < 0 { return 0 } if bigEndian { @@ -1168,7 +1168,7 @@ func read16(sym interface{}, off int64, bigEndian bool) uint16 { // read32 reads four bytes from the read-only global sym at offset off. func read32(sym interface{}, off int64, bigEndian bool) uint32 { lsym := sym.(*obj.LSym) - if off >= int64(len(lsym.P))-3 { + if off >= int64(len(lsym.P))-3 || off < 0 { return 0 } if bigEndian { @@ -1181,7 +1181,7 @@ func read32(sym interface{}, off int64, bigEndian bool) uint32 { // read64 reads eight bytes from the read-only global sym at offset off. func read64(sym interface{}, off int64, bigEndian bool) uint64 { lsym := sym.(*obj.LSym) - if off >= int64(len(lsym.P))-7 { + if off >= int64(len(lsym.P))-7 || off < 0 { return 0 } if bigEndian { diff --git a/test/fixedbugs/issue29215.go b/test/fixedbugs/issue29215.go index df703aa25d..4e8f107aee 100644 --- a/test/fixedbugs/issue29215.go +++ b/test/fixedbugs/issue29215.go @@ -16,3 +16,20 @@ func f() { } _ = s == "bbb" } + +// Another case: load from negative offset of a symbol +// in dead code (issue 30257). +func g() { + var i int + var s string + + if true { + s = "a" + } + + if f := 0.0; -f < 0 { + i = len(s[:4]) + } + + _ = s[i-1:0] != "bb" && true +} -- GitLab From 5aac0f0d1edbeb03ffe1c189ec97d55c2a7c1e84 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 23 Jan 2019 20:47:44 -0800 Subject: [PATCH 0033/1679] go/types: include test/fixedbugs/bug073.go again in test This test was excluded from the go/types std lib test because it tested old behavior (shift count must be an unsigned int). With the compiler changes made and the test adjusted accordingly, we can include it again. Updates #19113. Change-Id: If9b6b83505d2bd2b426fcefa225986d73658a229 Reviewed-on: https://go-review.googlesource.com/c/159319 Reviewed-by: Emmanuel Odeke --- src/go/types/stdlib_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/go/types/stdlib_test.go b/src/go/types/stdlib_test.go index b254b29bdf..84908fd190 100644 --- a/src/go/types/stdlib_test.go +++ b/src/go/types/stdlib_test.go @@ -167,7 +167,6 @@ func TestStdFixed(t *testing.T) { } testTestDir(t, filepath.Join(runtime.GOROOT(), "test", "fixedbugs"), - "bug073.go", // checks for unsigned integer shift - disabled for now "bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore "issue6889.go", // gc-specific test "issue7746.go", // large constants - consumes too much memory -- GitLab From a10b4cff91cb5d26e2049f6efc20349aa4d50d20 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 5 Feb 2019 14:33:24 -0800 Subject: [PATCH 0034/1679] spec: document signed integer shift counts Updates #19113. Change-Id: I4726f51c5061c33979cdd061f6d4616fa97edb9a Reviewed-on: https://go-review.googlesource.com/c/161201 Reviewed-by: Rob Pike --- doc/go_spec.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index dcc81ed628..f3d2320d86 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -3439,7 +3439,7 @@ to the type of the other operand.

-The right operand in a shift expression must have unsigned integer type +The right operand in a shift expression must have integer type or be an untyped constant representable by a value of type uint. If the left operand of a non-constant shift expression is an untyped constant, @@ -3586,7 +3586,9 @@ be replaced by a bitwise AND operation:

The shift operators shift the left operand by the shift count specified by the -right operand. They implement arithmetic shifts if the left operand is a signed +right operand, which must be positive. If the shift count is negative at run time, +a run-time panic occurs. +The shift operators implement arithmetic shifts if the left operand is a signed integer and logical shifts if it is an unsigned integer. There is no upper limit on the shift count. Shifts behave as if the left operand is shifted n times by 1 for a shift @@ -5921,7 +5923,7 @@ var a = complex(2, -2) // complex128 const b = complex(1.0, -1.4) // untyped complex constant 1 - 1.4i x := float32(math.Cos(math.Pi/2)) // float32 var c64 = complex(5, -x) // complex64 -var s uint = complex(1, 0) // untyped complex constant 1 + 0i can be converted to uint +var s int = complex(1, 0) // untyped complex constant 1 + 0i can be converted to int _ = complex(1, 2<<s) // illegal: 2 assumes floating-point type, cannot shift var rl = real(c64) // float32 var im = imag(a) // float64 -- GitLab From cf155b00d18f855eaaf2a541190dba3ff7b7cf8a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 14 Feb 2019 17:38:36 -0500 Subject: [PATCH 0035/1679] runtime: make tests that invoke 'go build' module-agnostic In module mode, building the current directory requires a go.mod file (in order to determine the import path of the package). Change the tests to pass explicit file arguments instead, since those can be built in module mode without defining a module. Updates #30228 Change-Id: I680c658d1f79645f73ad4d1e88189ea50a4852e9 Reviewed-on: https://go-review.googlesource.com/c/162837 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/runtime/crash_unix_test.go | 2 +- src/runtime/runtime-gdb_test.go | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/runtime/crash_unix_test.go b/src/runtime/crash_unix_test.go index 1384e00210..987c7095a0 100644 --- a/src/runtime/crash_unix_test.go +++ b/src/runtime/crash_unix_test.go @@ -63,7 +63,7 @@ func TestCrashDumpsAllThreads(t *testing.T) { t.Fatalf("failed to create Go file: %v", err) } - cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index a988d1d702..d0f905e4d7 100644 --- a/src/runtime/runtime-gdb_test.go +++ b/src/runtime/runtime-gdb_test.go @@ -156,7 +156,7 @@ func testGdbPython(t *testing.T, cgo bool) { } nLines := lastLine(src) - cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { @@ -337,7 +337,7 @@ func TestGdbBacktrace(t *testing.T) { if err != nil { t.Fatalf("failed to create file: %v", err) } - cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { @@ -408,7 +408,7 @@ func TestGdbAutotmpTypes(t *testing.T) { if err != nil { t.Fatalf("failed to create file: %v", err) } - cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { @@ -474,7 +474,7 @@ func TestGdbConst(t *testing.T) { if err != nil { t.Fatalf("failed to create file: %v", err) } - cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { @@ -539,7 +539,7 @@ func TestGdbPanic(t *testing.T) { if err != nil { t.Fatalf("failed to create file: %v", err) } - cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", "a.exe", "main.go") cmd.Dir = dir out, err := testenv.CleanCmdEnv(cmd).CombinedOutput() if err != nil { -- GitLab From 613f0a31445666cd573bf070309607e579b0b5c7 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Feb 2019 15:06:46 -0500 Subject: [PATCH 0036/1679] cmd/go: set GO111MODULE=off explicitly in tests that assume GOPATH mode We will soon switch GO111MODULE to 'on' by default, and when that happens these tests will otherwise break. Updates #30228 Change-Id: I1016d429b1dfb889d1aae8bc86fb2567cf0fc56f Reviewed-on: https://go-review.googlesource.com/c/162697 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/go_test.go | 1 + src/cmd/go/testdata/script/binary_only.txt | 2 ++ src/cmd/go/testdata/script/build_GOTMPDIR.txt | 2 ++ src/cmd/go/testdata/script/build_cache_compile.txt | 2 ++ src/cmd/go/testdata/script/build_cache_gomips.txt | 2 ++ src/cmd/go/testdata/script/build_cache_link.txt | 2 ++ src/cmd/go/testdata/script/build_cache_output.txt | 2 ++ src/cmd/go/testdata/script/build_nocache.txt | 2 ++ src/cmd/go/testdata/script/build_relative_pkgdir.txt | 2 ++ src/cmd/go/testdata/script/build_relative_tmpdir.txt | 2 ++ src/cmd/go/testdata/script/build_runtime_gcflags.txt | 2 ++ src/cmd/go/testdata/script/cache_unix.txt | 2 ++ src/cmd/go/testdata/script/cgo_syso_issue29253.txt | 2 ++ src/cmd/go/testdata/script/clean_testcache.txt | 2 ++ src/cmd/go/testdata/script/cover_atomic_pkgall.txt | 2 ++ src/cmd/go/testdata/script/cover_pkgall_runtime.txt | 2 ++ src/cmd/go/testdata/script/cpu_profile_twice.txt | 2 ++ src/cmd/go/testdata/script/fileline.txt | 2 ++ src/cmd/go/testdata/script/gcflags_patterns.txt | 2 ++ src/cmd/go/testdata/script/get_brace.txt | 2 ++ src/cmd/go/testdata/script/get_dotfiles.txt | 2 ++ src/cmd/go/testdata/script/get_tilde.txt | 2 ++ src/cmd/go/testdata/script/get_unicode.txt | 2 ++ src/cmd/go/testdata/script/get_with_git_trace.txt | 2 ++ src/cmd/go/testdata/script/goflags.txt | 2 ++ src/cmd/go/testdata/script/help.txt | 2 ++ src/cmd/go/testdata/script/install_cleans_build.txt | 2 ++ src/cmd/go/testdata/script/install_cross_gobin.txt | 2 ++ src/cmd/go/testdata/script/install_rebuild_gopath.txt | 2 ++ src/cmd/go/testdata/script/install_rebuild_removed.txt | 2 ++ src/cmd/go/testdata/script/linkname.txt | 2 ++ src/cmd/go/testdata/script/list_bad_import.txt | 2 ++ src/cmd/go/testdata/script/list_compiled_imports.txt | 2 ++ src/cmd/go/testdata/script/list_find.txt | 2 ++ src/cmd/go/testdata/script/list_importmap.txt | 2 ++ src/cmd/go/testdata/script/list_std.txt | 2 ++ src/cmd/go/testdata/script/list_tags.txt | 2 ++ src/cmd/go/testdata/script/list_test_e.txt | 2 ++ src/cmd/go/testdata/script/list_test_imports.txt | 2 ++ src/cmd/go/testdata/script/mod_find.txt | 2 ++ src/cmd/go/testdata/script/mod_gobuild_import.txt | 6 ++---- src/cmd/go/testdata/script/pattern_syntax_error.txt | 2 ++ src/cmd/go/testdata/script/run_hello.txt | 2 ++ src/cmd/go/testdata/script/run_wildcard.txt | 2 ++ src/cmd/go/testdata/script/script_wait.txt | 2 ++ src/cmd/go/testdata/script/test_badtest.txt | 2 ++ src/cmd/go/testdata/script/test_compile_binary.txt | 2 ++ src/cmd/go/testdata/script/test_devnull.txt | 2 ++ src/cmd/go/testdata/script/vendor_complex.txt | 2 ++ src/cmd/go/testdata/script/vet_asm.txt | 2 ++ 50 files changed, 99 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index c58bc7408d..866241bf39 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -394,6 +394,7 @@ func (tg *testgoData) setenv(name, val string) { func (tg *testgoData) unsetenv(name string) { if tg.env == nil { tg.env = append([]string(nil), os.Environ()...) + tg.env = append(tg.env, "GO111MODULE=off") } for i, v := range tg.env { if strings.HasPrefix(v, name+"=") { diff --git a/src/cmd/go/testdata/script/binary_only.txt b/src/cmd/go/testdata/script/binary_only.txt index 397904efaa..1842d8cea3 100644 --- a/src/cmd/go/testdata/script/binary_only.txt +++ b/src/cmd/go/testdata/script/binary_only.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # check that error for missing binary-only says where it should be ! go build b stderr pkg[\\/].*a\.a diff --git a/src/cmd/go/testdata/script/build_GOTMPDIR.txt b/src/cmd/go/testdata/script/build_GOTMPDIR.txt index ea06dcc472..da54ced524 100644 --- a/src/cmd/go/testdata/script/build_GOTMPDIR.txt +++ b/src/cmd/go/testdata/script/build_GOTMPDIR.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Set GOCACHE to a clean directory to ensure that 'go build' has work to report. env GOCACHE=$WORK/gocache diff --git a/src/cmd/go/testdata/script/build_cache_compile.txt b/src/cmd/go/testdata/script/build_cache_compile.txt index 7db881a268..04a6f9af1d 100644 --- a/src/cmd/go/testdata/script/build_cache_compile.txt +++ b/src/cmd/go/testdata/script/build_cache_compile.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Set up fresh GOCACHE. env GOCACHE=$WORK/gocache mkdir $GOCACHE diff --git a/src/cmd/go/testdata/script/build_cache_gomips.txt b/src/cmd/go/testdata/script/build_cache_gomips.txt index c77acc3f2f..3218354929 100644 --- a/src/cmd/go/testdata/script/build_cache_gomips.txt +++ b/src/cmd/go/testdata/script/build_cache_gomips.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Set up fresh GOCACHE. env GOCACHE=$WORK/gocache mkdir $GOCACHE diff --git a/src/cmd/go/testdata/script/build_cache_link.txt b/src/cmd/go/testdata/script/build_cache_link.txt index 61e7ee46d3..658bb88496 100644 --- a/src/cmd/go/testdata/script/build_cache_link.txt +++ b/src/cmd/go/testdata/script/build_cache_link.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Set up fresh GOCACHE. env GOCACHE=$WORK/gocache mkdir $GOCACHE diff --git a/src/cmd/go/testdata/script/build_cache_output.txt b/src/cmd/go/testdata/script/build_cache_output.txt index ee4099e5f3..41c84ace7a 100644 --- a/src/cmd/go/testdata/script/build_cache_output.txt +++ b/src/cmd/go/testdata/script/build_cache_output.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!gc] skip # Set up fresh GOCACHE. diff --git a/src/cmd/go/testdata/script/build_nocache.txt b/src/cmd/go/testdata/script/build_nocache.txt index 5aa46e0b77..46e95fa89d 100644 --- a/src/cmd/go/testdata/script/build_nocache.txt +++ b/src/cmd/go/testdata/script/build_nocache.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # As of Go 1.12, the module cache is required. # If none of the variables we use to locate GOCACHE are set, the cache is off diff --git a/src/cmd/go/testdata/script/build_relative_pkgdir.txt b/src/cmd/go/testdata/script/build_relative_pkgdir.txt index 76098a0662..0716bcd56a 100644 --- a/src/cmd/go/testdata/script/build_relative_pkgdir.txt +++ b/src/cmd/go/testdata/script/build_relative_pkgdir.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Regression test for golang.org/issue/21309: accept relative -pkgdir argument. [short] skip diff --git a/src/cmd/go/testdata/script/build_relative_tmpdir.txt b/src/cmd/go/testdata/script/build_relative_tmpdir.txt index 9490a285d3..3e98a67b81 100644 --- a/src/cmd/go/testdata/script/build_relative_tmpdir.txt +++ b/src/cmd/go/testdata/script/build_relative_tmpdir.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # If GOTMPDIR is relative, 'go build' should derive an absolute $WORK directory. cd $WORK mkdir tmp diff --git a/src/cmd/go/testdata/script/build_runtime_gcflags.txt b/src/cmd/go/testdata/script/build_runtime_gcflags.txt index 767b768b82..5354a73935 100644 --- a/src/cmd/go/testdata/script/build_runtime_gcflags.txt +++ b/src/cmd/go/testdata/script/build_runtime_gcflags.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Set up fresh GOCACHE. env GOCACHE=$WORK/gocache mkdir $GOCACHE diff --git a/src/cmd/go/testdata/script/cache_unix.txt b/src/cmd/go/testdata/script/cache_unix.txt index f700ebe3ed..0e07ba6382 100644 --- a/src/cmd/go/testdata/script/cache_unix.txt +++ b/src/cmd/go/testdata/script/cache_unix.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Integration test for cache directory calculation (cmd/go/internal/cache). [windows] skip diff --git a/src/cmd/go/testdata/script/cgo_syso_issue29253.txt b/src/cmd/go/testdata/script/cgo_syso_issue29253.txt index 0d18fa91d6..9825d1e3e9 100644 --- a/src/cmd/go/testdata/script/cgo_syso_issue29253.txt +++ b/src/cmd/go/testdata/script/cgo_syso_issue29253.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # This test tests that we can link in-package syso files that provides symbols # for cgo. See issue 29253. [!cgo] stop diff --git a/src/cmd/go/testdata/script/clean_testcache.txt b/src/cmd/go/testdata/script/clean_testcache.txt index a2d592deff..5ac968b7d0 100644 --- a/src/cmd/go/testdata/script/clean_testcache.txt +++ b/src/cmd/go/testdata/script/clean_testcache.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go clean -testcache # should work (see golang.org/issue/29757). cd x diff --git a/src/cmd/go/testdata/script/cover_atomic_pkgall.txt b/src/cmd/go/testdata/script/cover_atomic_pkgall.txt index c122c05cb6..c3bc67df53 100644 --- a/src/cmd/go/testdata/script/cover_atomic_pkgall.txt +++ b/src/cmd/go/testdata/script/cover_atomic_pkgall.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [short] skip go test -coverpkg=all -covermode=atomic x diff --git a/src/cmd/go/testdata/script/cover_pkgall_runtime.txt b/src/cmd/go/testdata/script/cover_pkgall_runtime.txt index 5d169d6312..9927c30690 100644 --- a/src/cmd/go/testdata/script/cover_pkgall_runtime.txt +++ b/src/cmd/go/testdata/script/cover_pkgall_runtime.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Issue 23882 [short] skip diff --git a/src/cmd/go/testdata/script/cpu_profile_twice.txt b/src/cmd/go/testdata/script/cpu_profile_twice.txt index 142d5ee718..38d6439fb1 100644 --- a/src/cmd/go/testdata/script/cpu_profile_twice.txt +++ b/src/cmd/go/testdata/script/cpu_profile_twice.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Issue 23150 [short] skip diff --git a/src/cmd/go/testdata/script/fileline.txt b/src/cmd/go/testdata/script/fileline.txt index cdc3be2df8..5cb35f0dac 100644 --- a/src/cmd/go/testdata/script/fileline.txt +++ b/src/cmd/go/testdata/script/fileline.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # look for short, relative file:line in error message ! go run ../../gopath/x/y/z/err.go stderr ^..[\\/]x[\\/]y[\\/]z[\\/]err.go: diff --git a/src/cmd/go/testdata/script/gcflags_patterns.txt b/src/cmd/go/testdata/script/gcflags_patterns.txt index 40f80b7d6e..f2e6e2b67d 100644 --- a/src/cmd/go/testdata/script/gcflags_patterns.txt +++ b/src/cmd/go/testdata/script/gcflags_patterns.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!gc] skip 'using -gcflags and -ldflags' # -gcflags=-e applies to named packages, not dependencies diff --git a/src/cmd/go/testdata/script/get_brace.txt b/src/cmd/go/testdata/script/get_brace.txt index be81d8f487..3449a0c2c8 100644 --- a/src/cmd/go/testdata/script/get_brace.txt +++ b/src/cmd/go/testdata/script/get_brace.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!exec:git] skip # Set up some empty repositories. diff --git a/src/cmd/go/testdata/script/get_dotfiles.txt b/src/cmd/go/testdata/script/get_dotfiles.txt index 1876114362..38a3fac612 100644 --- a/src/cmd/go/testdata/script/get_dotfiles.txt +++ b/src/cmd/go/testdata/script/get_dotfiles.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!exec:git] skip # Set up a benign repository and a repository with a dotfile name. diff --git a/src/cmd/go/testdata/script/get_tilde.txt b/src/cmd/go/testdata/script/get_tilde.txt index 08289ca405..6d18174acc 100644 --- a/src/cmd/go/testdata/script/get_tilde.txt +++ b/src/cmd/go/testdata/script/get_tilde.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Paths containing windows short names should be rejected before attempting to fetch. ! go get example.com/longna~1.dir/thing stderr 'trailing tilde and digits' diff --git a/src/cmd/go/testdata/script/get_unicode.txt b/src/cmd/go/testdata/script/get_unicode.txt index 31edcdb9f6..ab1b914f50 100644 --- a/src/cmd/go/testdata/script/get_unicode.txt +++ b/src/cmd/go/testdata/script/get_unicode.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!exec:git] skip # Construct a repository that imports a non-ASCII path. diff --git a/src/cmd/go/testdata/script/get_with_git_trace.txt b/src/cmd/go/testdata/script/get_with_git_trace.txt index 93341a302c..98854c72ad 100644 --- a/src/cmd/go/testdata/script/get_with_git_trace.txt +++ b/src/cmd/go/testdata/script/get_with_git_trace.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + env GIT_TRACE=1 [!net] skip diff --git a/src/cmd/go/testdata/script/goflags.txt b/src/cmd/go/testdata/script/goflags.txt index 20de325ac2..fac6d80720 100644 --- a/src/cmd/go/testdata/script/goflags.txt +++ b/src/cmd/go/testdata/script/goflags.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # GOFLAGS sets flags for commands env GOFLAGS='-e -f={{.Dir}} --test.benchtime=1s -count=10' diff --git a/src/cmd/go/testdata/script/help.txt b/src/cmd/go/testdata/script/help.txt index 9f455256f7..e6cbc82928 100644 --- a/src/cmd/go/testdata/script/help.txt +++ b/src/cmd/go/testdata/script/help.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go help shows overview. go help stdout 'Go is a tool' diff --git a/src/cmd/go/testdata/script/install_cleans_build.txt b/src/cmd/go/testdata/script/install_cleans_build.txt index b8d322de62..7f1b917439 100644 --- a/src/cmd/go/testdata/script/install_cleans_build.txt +++ b/src/cmd/go/testdata/script/install_cleans_build.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # 'go install' with no arguments should clean up after go build cd mycmd go build diff --git a/src/cmd/go/testdata/script/install_cross_gobin.txt b/src/cmd/go/testdata/script/install_cross_gobin.txt index 587081f135..d9ab35c2e1 100644 --- a/src/cmd/go/testdata/script/install_cross_gobin.txt +++ b/src/cmd/go/testdata/script/install_cross_gobin.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + cd mycmd go build mycmd diff --git a/src/cmd/go/testdata/script/install_rebuild_gopath.txt b/src/cmd/go/testdata/script/install_rebuild_gopath.txt index d42b07004b..14a6c8611e 100644 --- a/src/cmd/go/testdata/script/install_rebuild_gopath.txt +++ b/src/cmd/go/testdata/script/install_rebuild_gopath.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # GOPATH with p1 in d1, p2 in d2 env GOPATH=$WORK/d1${:}$WORK/d2 diff --git a/src/cmd/go/testdata/script/install_rebuild_removed.txt b/src/cmd/go/testdata/script/install_rebuild_removed.txt index e7620a08ca..5db3778d8e 100644 --- a/src/cmd/go/testdata/script/install_rebuild_removed.txt +++ b/src/cmd/go/testdata/script/install_rebuild_removed.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go command should detect package staleness as source file set changes go install mypkg ! stale mypkg diff --git a/src/cmd/go/testdata/script/linkname.txt b/src/cmd/go/testdata/script/linkname.txt index e2ec00c6ed..11336594d3 100644 --- a/src/cmd/go/testdata/script/linkname.txt +++ b/src/cmd/go/testdata/script/linkname.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # check for linker name in error message about linker crash [!gc] skip ! go build -ldflags=-crash_for_testing x.go diff --git a/src/cmd/go/testdata/script/list_bad_import.txt b/src/cmd/go/testdata/script/list_bad_import.txt index 3d9cac0d5f..958c576c53 100644 --- a/src/cmd/go/testdata/script/list_bad_import.txt +++ b/src/cmd/go/testdata/script/list_bad_import.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # This test matches mod_list_bad_import, but in GOPATH mode. # Please keep them in sync. diff --git a/src/cmd/go/testdata/script/list_compiled_imports.txt b/src/cmd/go/testdata/script/list_compiled_imports.txt index e6f5abb6af..7780b074c1 100644 --- a/src/cmd/go/testdata/script/list_compiled_imports.txt +++ b/src/cmd/go/testdata/script/list_compiled_imports.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!cgo] skip # go list should report import "C" diff --git a/src/cmd/go/testdata/script/list_find.txt b/src/cmd/go/testdata/script/list_find.txt index 63c6896e50..aaac6585dd 100644 --- a/src/cmd/go/testdata/script/list_find.txt +++ b/src/cmd/go/testdata/script/list_find.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go list -find should not report imports go list -f {{.Incomplete}} x/y/z... # should probably exit non-zero but never has diff --git a/src/cmd/go/testdata/script/list_importmap.txt b/src/cmd/go/testdata/script/list_importmap.txt index a42dc47f24..52ee6028f5 100644 --- a/src/cmd/go/testdata/script/list_importmap.txt +++ b/src/cmd/go/testdata/script/list_importmap.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # gccgo does not have standard packages. [gccgo] skip diff --git a/src/cmd/go/testdata/script/list_std.txt b/src/cmd/go/testdata/script/list_std.txt index 046bec6ac5..88a659f743 100644 --- a/src/cmd/go/testdata/script/list_std.txt +++ b/src/cmd/go/testdata/script/list_std.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!gc] skip # listing GOROOT should only find standard packages diff --git a/src/cmd/go/testdata/script/list_tags.txt b/src/cmd/go/testdata/script/list_tags.txt index c5dc99e9fb..49069bd213 100644 --- a/src/cmd/go/testdata/script/list_tags.txt +++ b/src/cmd/go/testdata/script/list_tags.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go list supports -tags go list -tags=thetag ./my... stdout mypkg diff --git a/src/cmd/go/testdata/script/list_test_e.txt b/src/cmd/go/testdata/script/list_test_e.txt index f1473322c6..4e36b88e85 100644 --- a/src/cmd/go/testdata/script/list_test_e.txt +++ b/src/cmd/go/testdata/script/list_test_e.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # issue 25980: crash in go list -e -test go list -e -test -f '{{.Error}}' p stdout '^p[/\\]d_test.go:2:8: cannot find package "d" in any of:' diff --git a/src/cmd/go/testdata/script/list_test_imports.txt b/src/cmd/go/testdata/script/list_test_imports.txt index 51d1ce9a69..b2a6bc45f9 100644 --- a/src/cmd/go/testdata/script/list_test_imports.txt +++ b/src/cmd/go/testdata/script/list_test_imports.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # issue 26880: list with tests has wrong variant in imports go list -test -f '{{.ImportPath}}:{{with .Imports}} {{join . ", "}}{{end}}' a b cmp stdout imports.txt diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index eb7f974b3b..703a88e99c 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -1,3 +1,5 @@ +env GO111MODULE=auto + # Derive module path from import comment. cd $WORK/x exists x.go diff --git a/src/cmd/go/testdata/script/mod_gobuild_import.txt b/src/cmd/go/testdata/script/mod_gobuild_import.txt index 932b8b66f9..d2d1645b83 100644 --- a/src/cmd/go/testdata/script/mod_gobuild_import.txt +++ b/src/cmd/go/testdata/script/mod_gobuild_import.txt @@ -7,14 +7,12 @@ env GO111MODULE=off ! exec $WORK/testimport.exe x/y/z/w . # GO111MODULE=auto in GOPATH/src -env GO111MODULE= -! exec $WORK/testimport.exe x/y/z/w . env GO111MODULE=auto ! exec $WORK/testimport.exe x/y/z/w . # GO111MODULE=auto outside GOPATH/src cd $GOPATH/other -env GO111MODULE= +env GO111MODULE=auto exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go @@ -22,7 +20,6 @@ stdout w2.go stderr 'cannot find module providing package x/y/z/w' cd z -env GO111MODULE=auto exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go @@ -33,6 +30,7 @@ stdout w2.go # GO111MODULE=on in GOPATH/src cd $GOPATH/src +env GO111MODULE=on exec $WORK/testimport.exe x/y/z/w . stdout w1.go cd w diff --git a/src/cmd/go/testdata/script/pattern_syntax_error.txt b/src/cmd/go/testdata/script/pattern_syntax_error.txt index 8e6549b5c5..9a1f5e52f0 100644 --- a/src/cmd/go/testdata/script/pattern_syntax_error.txt +++ b/src/cmd/go/testdata/script/pattern_syntax_error.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # patterns match directories with syntax errors ! go list ./... ! go build ./... diff --git a/src/cmd/go/testdata/script/run_hello.txt b/src/cmd/go/testdata/script/run_hello.txt index 8c4c1c1683..939b661e58 100644 --- a/src/cmd/go/testdata/script/run_hello.txt +++ b/src/cmd/go/testdata/script/run_hello.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # hello world go run hello.go stderr 'hello world' diff --git a/src/cmd/go/testdata/script/run_wildcard.txt b/src/cmd/go/testdata/script/run_wildcard.txt index cd401e00e6..72036d1d8d 100644 --- a/src/cmd/go/testdata/script/run_wildcard.txt +++ b/src/cmd/go/testdata/script/run_wildcard.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Fix for https://github.com/golang/go/issues/28696: # go run x/... should not panic when directory x doesn't exist. diff --git a/src/cmd/go/testdata/script/script_wait.txt b/src/cmd/go/testdata/script/script_wait.txt index 0770b39523..3cd4ded9dd 100644 --- a/src/cmd/go/testdata/script/script_wait.txt +++ b/src/cmd/go/testdata/script/script_wait.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + [!exec:echo] skip [!exec:false] skip diff --git a/src/cmd/go/testdata/script/test_badtest.txt b/src/cmd/go/testdata/script/test_badtest.txt index 42fcfed2fc..f5db6941a0 100644 --- a/src/cmd/go/testdata/script/test_badtest.txt +++ b/src/cmd/go/testdata/script/test_badtest.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + ! go test badtest/... ! stdout ^ok stdout ^FAIL\tbadtest/badexec diff --git a/src/cmd/go/testdata/script/test_compile_binary.txt b/src/cmd/go/testdata/script/test_compile_binary.txt index 6c01bc5729..6562f2453f 100644 --- a/src/cmd/go/testdata/script/test_compile_binary.txt +++ b/src/cmd/go/testdata/script/test_compile_binary.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + ! go test -c compile_binary/... stderr 'build comment' diff --git a/src/cmd/go/testdata/script/test_devnull.txt b/src/cmd/go/testdata/script/test_devnull.txt index c414e59ba3..e7ebda33ee 100644 --- a/src/cmd/go/testdata/script/test_devnull.txt +++ b/src/cmd/go/testdata/script/test_devnull.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # go test -c -o NUL # should work (see golang.org/issue/28035). cd x diff --git a/src/cmd/go/testdata/script/vendor_complex.txt b/src/cmd/go/testdata/script/vendor_complex.txt index 6513451df8..9ca94e72c5 100644 --- a/src/cmd/go/testdata/script/vendor_complex.txt +++ b/src/cmd/go/testdata/script/vendor_complex.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # smoke test for complex build configuration go build -o complex.exe complex [exec:gccgo] go build -compiler=gccgo -o complex.exe complex diff --git a/src/cmd/go/testdata/script/vet_asm.txt b/src/cmd/go/testdata/script/vet_asm.txt index 807e2b76f5..ea920ea866 100644 --- a/src/cmd/go/testdata/script/vet_asm.txt +++ b/src/cmd/go/testdata/script/vet_asm.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # Issue 27665. Verify that "go vet" analyzes non-Go files. env GOOS=linux -- GitLab From f8abdd6c8a6bb4882e708f87d1e83ba5f897aeff Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 13 Feb 2019 16:38:01 -0800 Subject: [PATCH 0037/1679] cmd/gofmt: normalize integer imaginary literals starting with 0 An 'i' suffix on an integer literal marks the integer literal as a decimal integer imaginary value, even if the literal without the suffix starts with a 0 and thus looks like an octal value: 0123i == 123i // != 0123 * 1i This is at best confusing, and at worst a potential source of bugs. It is always safe to rewrite such literals into the equivalent literal without the leading 0. This CL implements this normalization. Change-Id: Ib77ad535f98b5be912ecbdec20ca1b472c1b4973 Reviewed-on: https://go-review.googlesource.com/c/162538 Run-TryBot: Robert Griesemer Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/gofmt/gofmt.go | 51 ++++++++++++++++++------ src/cmd/gofmt/testdata/go2numbers.golden | 14 ++++++- src/cmd/gofmt/testdata/go2numbers.input | 12 ++++++ 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index ce4613fb60..4bba44489d 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -330,7 +330,9 @@ func backupFile(filename string, data []byte, perm os.FileMode) (string, error) } // normalizeNumbers rewrites base prefixes and exponents to -// use lower-case letters. It leaves hexadecimal digits alone. +// use lower-case letters, and removes leading 0's from +// integer imaginary literals. It leaves hexadecimal digits +// alone. func normalizeNumbers(n ast.Node) bool { lit, _ := n.(*ast.BasicLit) if lit == nil { @@ -339,37 +341,60 @@ func normalizeNumbers(n ast.Node) bool { if len(lit.Value) < 2 { return false // only one digit - nothing to do } - // lit.Value >= 2 + // len(lit.Value) >= 2 + x := lit.Value switch lit.Kind { case token.INT: - switch lit.Value[:2] { + switch x[:2] { case "0X": - lit.Value = "0x" + lit.Value[2:] + lit.Value = "0x" + x[2:] case "0O": - lit.Value = "0o" + lit.Value[2:] + lit.Value = "0o" + x[2:] case "0B": - lit.Value = "0b" + lit.Value[2:] + lit.Value = "0b" + x[2:] } case token.FLOAT: switch lit.Value[:2] { default: - if i := strings.LastIndexByte(lit.Value, 'E'); i >= 0 { - lit.Value = lit.Value[:i] + "e" + lit.Value[i+1:] + if i := strings.LastIndexByte(x, 'E'); i >= 0 { + lit.Value = x[:i] + "e" + x[i+1:] } case "0x": - if i := strings.LastIndexByte(lit.Value, 'P'); i >= 0 { - lit.Value = lit.Value[:i] + "p" + lit.Value[i+1:] + if i := strings.LastIndexByte(x, 'P'); i >= 0 { + lit.Value = x[:i] + "p" + x[i+1:] } case "0X": - if i := strings.LastIndexByte(lit.Value, 'P'); i >= 0 { - lit.Value = "0x" + lit.Value[2:i] + "p" + lit.Value[i+1:] + if i := strings.LastIndexByte(x, 'P'); i >= 0 { + lit.Value = "0x" + x[2:i] + "p" + x[i+1:] } else { - lit.Value = "0x" + lit.Value[2:] + lit.Value = "0x" + x[2:] + } + } + + case token.IMAG: + // Note that integer imaginary literals may contain + // any decimal digit even if they start with zero. + // Imaginary literals should always end in 'i' but be + // conservative and check anyway before proceeding. + if x[0] == '0' && x[len(x)-1] == 'i' && isDecimals(x[1:len(x)-1]) { + x = strings.TrimLeft(x, "0_") + if x == "i" { + x = "0i" } + lit.Value = x } } return false } + +// isDecimals reports whether x consists entirely of decimal digits and underscores. +func isDecimals(x string) bool { + i := 0 + for i < len(x) && ('0' <= x[i] && x[i] <= '9' || x[i] == '_') { + i++ + } + return i == len(x) +} diff --git a/src/cmd/gofmt/testdata/go2numbers.golden b/src/cmd/gofmt/testdata/go2numbers.golden index 2fab834bcd..abefcb6c58 100644 --- a/src/cmd/gofmt/testdata/go2numbers.golden +++ b/src/cmd/gofmt/testdata/go2numbers.golden @@ -141,10 +141,22 @@ const ( // imaginaries _ = 0i - _ = 00i + _ = 0i + _ = 8i + _ = 0i + _ = 123i + _ = 123i + _ = 56789i _ = 1234i _ = 1234567i + _ = 0i + _ = 0i + _ = 8i + _ = 0i + _ = 123i + _ = 123i + _ = 56_789i _ = 1_234i _ = 1_234_567i diff --git a/src/cmd/gofmt/testdata/go2numbers.input b/src/cmd/gofmt/testdata/go2numbers.input index 7b3fd391da..51a9f8eaf6 100644 --- a/src/cmd/gofmt/testdata/go2numbers.input +++ b/src/cmd/gofmt/testdata/go2numbers.input @@ -142,9 +142,21 @@ const ( // imaginaries _ = 0i _ = 00i + _ = 08i + _ = 0000000000i + _ = 0123i + _ = 0000000123i + _ = 0000056789i _ = 1234i _ = 1234567i + _ = 0i + _ = 0_0i + _ = 0_8i + _ = 0_000_000_000i + _ = 0_123i + _ = 0_000_000_123i + _ = 0_000_056_789i _ = 1_234i _ = 1_234_567i -- GitLab From fae44a2be350940c3b29919e274e9a7e63f22df7 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 13 Feb 2019 17:00:36 -0800 Subject: [PATCH 0038/1679] src, misc: apply gofmt This applies the new gofmt literal normalizations to the library. Change-Id: I8c1e8ef62eb556fc568872c9f77a31ef236348e7 Reviewed-on: https://go-review.googlesource.com/c/162539 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/archive/tar/strconv.go | 2 +- src/archive/tar/strconv_test.go | 42 +++++++++---------- .../compile/internal/gc/testdata/fp_test.go | 18 ++++---- .../x/sys/windows/security_windows.go | 2 +- src/compress/flate/deflate_test.go | 2 +- .../internal/gcimporter/testdata/exports.go | 2 +- src/math/cmplx/tan.go | 6 +-- src/math/sin.go | 36 ++++++++-------- src/math/sincos.go | 6 +-- src/math/tan.go | 22 +++++----- src/math/tanh.go | 12 +++--- 11 files changed, 75 insertions(+), 75 deletions(-) diff --git a/src/archive/tar/strconv.go b/src/archive/tar/strconv.go index d144485a49..0a910f33b9 100644 --- a/src/archive/tar/strconv.go +++ b/src/archive/tar/strconv.go @@ -244,7 +244,7 @@ func formatPAXTime(ts time.Time) (s string) { if secs < 0 { sign = "-" // Remember sign secs = -(secs + 1) // Add a second to secs - nsecs = -(nsecs - 1E9) // Take that second away from nsecs + nsecs = -(nsecs - 1e9) // Take that second away from nsecs } return strings.TrimRight(fmt.Sprintf("%s%d.%09d", sign, secs, nsecs), "0") } diff --git a/src/archive/tar/strconv_test.go b/src/archive/tar/strconv_test.go index 4cc388cb0f..dd3505a758 100644 --- a/src/archive/tar/strconv_test.go +++ b/src/archive/tar/strconv_test.go @@ -303,27 +303,27 @@ func TestFormatPAXTime(t *testing.T) { {1350244992, 300000000, "1350244992.3"}, {1350244992, 23960100, "1350244992.0239601"}, {1350244992, 23960108, "1350244992.023960108"}, - {+1, +1E9 - 1E0, "1.999999999"}, - {+1, +1E9 - 1E3, "1.999999"}, - {+1, +1E9 - 1E6, "1.999"}, - {+1, +0E0 - 0E0, "1"}, - {+1, +1E6 - 0E0, "1.001"}, - {+1, +1E3 - 0E0, "1.000001"}, - {+1, +1E0 - 0E0, "1.000000001"}, - {0, 1E9 - 1E0, "0.999999999"}, - {0, 1E9 - 1E3, "0.999999"}, - {0, 1E9 - 1E6, "0.999"}, - {0, 0E0, "0"}, - {0, 1E6 + 0E0, "0.001"}, - {0, 1E3 + 0E0, "0.000001"}, - {0, 1E0 + 0E0, "0.000000001"}, - {-1, -1E9 + 1E0, "-1.999999999"}, - {-1, -1E9 + 1E3, "-1.999999"}, - {-1, -1E9 + 1E6, "-1.999"}, - {-1, -0E0 + 0E0, "-1"}, - {-1, -1E6 + 0E0, "-1.001"}, - {-1, -1E3 + 0E0, "-1.000001"}, - {-1, -1E0 + 0E0, "-1.000000001"}, + {+1, +1e9 - 1e0, "1.999999999"}, + {+1, +1e9 - 1e3, "1.999999"}, + {+1, +1e9 - 1e6, "1.999"}, + {+1, +0e0 - 0e0, "1"}, + {+1, +1e6 - 0e0, "1.001"}, + {+1, +1e3 - 0e0, "1.000001"}, + {+1, +1e0 - 0e0, "1.000000001"}, + {0, 1e9 - 1e0, "0.999999999"}, + {0, 1e9 - 1e3, "0.999999"}, + {0, 1e9 - 1e6, "0.999"}, + {0, 0e0, "0"}, + {0, 1e6 + 0e0, "0.001"}, + {0, 1e3 + 0e0, "0.000001"}, + {0, 1e0 + 0e0, "0.000000001"}, + {-1, -1e9 + 1e0, "-1.999999999"}, + {-1, -1e9 + 1e3, "-1.999999"}, + {-1, -1e9 + 1e6, "-1.999"}, + {-1, -0e0 + 0e0, "-1"}, + {-1, -1e6 + 0e0, "-1.001"}, + {-1, -1e3 + 0e0, "-1.000001"}, + {-1, -1e0 + 0e0, "-1.000000001"}, {-1350244992, 0, "-1350244992"}, {-1350244992, -300000000, "-1350244992.3"}, {-1350244992, -23960100, "-1350244992.0239601"}, diff --git a/src/cmd/compile/internal/gc/testdata/fp_test.go b/src/cmd/compile/internal/gc/testdata/fp_test.go index daed2b417a..7d61a8063e 100644 --- a/src/cmd/compile/internal/gc/testdata/fp_test.go +++ b/src/cmd/compile/internal/gc/testdata/fp_test.go @@ -179,7 +179,7 @@ func integer2floatConversions(t *testing.T) { } { // Check maximum values - a, b, c, d, e, f, g, h, i := conv2Float64_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823E38) + a, b, c, d, e, f, g, h, i := conv2Float64_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823e38) expect64(t, "a", a, 127) expect64(t, "b", b, 255) expect64(t, "c", c, 32767) @@ -188,11 +188,11 @@ func integer2floatConversions(t *testing.T) { expect64(t, "f", f, float64(uint32(0xffffffff))) expect64(t, "g", g, float64(int64(0x7fffffffffffffff))) expect64(t, "h", h, float64(uint64(0xffffffffffffffff))) - expect64(t, "i", i, float64(float32(3.402823E38))) + expect64(t, "i", i, float64(float32(3.402823e38))) } { // Check minimum values (and tweaks for unsigned) - a, b, c, d, e, f, g, h, i := conv2Float64_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5E-45) + a, b, c, d, e, f, g, h, i := conv2Float64_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5e-45) expect64(t, "a", a, -128) expect64(t, "b", b, 254) expect64(t, "c", c, -32768) @@ -201,11 +201,11 @@ func integer2floatConversions(t *testing.T) { expect64(t, "f", f, float64(uint32(0xfffffffe))) expect64(t, "g", g, float64(^int64(0x7fffffffffffffff))) expect64(t, "h", h, float64(uint64(0xfffffffffffff401))) - expect64(t, "i", i, float64(float32(1.5E-45))) + expect64(t, "i", i, float64(float32(1.5e-45))) } { // Check maximum values - a, b, c, d, e, f, g, h, i := conv2Float32_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823E38) + a, b, c, d, e, f, g, h, i := conv2Float32_ssa(127, 255, 32767, 65535, 0x7fffffff, 0xffffffff, 0x7fffFFFFffffFFFF, 0xffffFFFFffffFFFF, 3.402823e38) expect32(t, "a", a, 127) expect32(t, "b", b, 255) expect32(t, "c", c, 32767) @@ -214,11 +214,11 @@ func integer2floatConversions(t *testing.T) { expect32(t, "f", f, float32(uint32(0xffffffff))) expect32(t, "g", g, float32(int64(0x7fffffffffffffff))) expect32(t, "h", h, float32(uint64(0xffffffffffffffff))) - expect32(t, "i", i, float32(float64(3.402823E38))) + expect32(t, "i", i, float32(float64(3.402823e38))) } { // Check minimum values (and tweaks for unsigned) - a, b, c, d, e, f, g, h, i := conv2Float32_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5E-45) + a, b, c, d, e, f, g, h, i := conv2Float32_ssa(-128, 254, -32768, 65534, ^0x7fffffff, 0xfffffffe, ^0x7fffFFFFffffFFFF, 0xffffFFFFffffF401, 1.5e-45) expect32(t, "a", a, -128) expect32(t, "b", b, 254) expect32(t, "c", c, -32768) @@ -227,7 +227,7 @@ func integer2floatConversions(t *testing.T) { expect32(t, "f", f, float32(uint32(0xfffffffe))) expect32(t, "g", g, float32(^int64(0x7fffffffffffffff))) expect32(t, "h", h, float32(uint64(0xfffffffffffff401))) - expect32(t, "i", i, float32(float64(1.5E-45))) + expect32(t, "i", i, float32(float64(1.5e-45))) } } @@ -1685,7 +1685,7 @@ func TestFP(t *testing.T) { c := float32(3.0) d := float32(4.0) - tiny := float32(1.5E-45) // smallest f32 denorm = 2**(-149) + tiny := float32(1.5e-45) // smallest f32 denorm = 2**(-149) dtiny := float64(tiny) // well within range of f64 fail64("+", add64_ssa, a, b, 7.0) diff --git a/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go index 4f17a3331f..9f946da6fe 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go @@ -149,7 +149,7 @@ const ( DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS = 0x22b DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS = 0x22c DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d - DOMAIN_ALIAS_RID_MONITORING_USERS = 0X22e + DOMAIN_ALIAS_RID_MONITORING_USERS = 0x22e DOMAIN_ALIAS_RID_LOGGING_USERS = 0x22f DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS = 0x230 DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS = 0x231 diff --git a/src/compress/flate/deflate_test.go b/src/compress/flate/deflate_test.go index 831be2198c..079c03c283 100644 --- a/src/compress/flate/deflate_test.go +++ b/src/compress/flate/deflate_test.go @@ -161,7 +161,7 @@ func TestVeryLongSparseChunk(t *testing.T) { t.Errorf("NewWriter: %v", err) return } - if _, err = io.Copy(w, &sparseReader{l: 23E8}); err != nil { + if _, err = io.Copy(w, &sparseReader{l: 23e8}); err != nil { t.Errorf("Compress failed: %v", err) return } diff --git a/src/go/internal/gcimporter/testdata/exports.go b/src/go/internal/gcimporter/testdata/exports.go index 9a0273ba20..8ba3242102 100644 --- a/src/go/internal/gcimporter/testdata/exports.go +++ b/src/go/internal/gcimporter/testdata/exports.go @@ -19,7 +19,7 @@ const ( C1 = 3.14159265 C2 = 2.718281828i C3 = -123.456e-789 - C4 = +123.456E+789 + C4 = +123.456e+789 C5 = 1234i C6 = "foo\n" C7 = `bar\n` diff --git a/src/math/cmplx/tan.go b/src/math/cmplx/tan.go index 2990552155..0243ea0417 100644 --- a/src/math/cmplx/tan.go +++ b/src/math/cmplx/tan.go @@ -92,9 +92,9 @@ func Tanh(x complex128) complex128 { func reducePi(x float64) float64 { const ( // extended precision value of PI: - DP1 = 3.14159265160560607910E0 // ?? 0x400921fb54000000 - DP2 = 1.98418714791870343106E-9 // ?? 0x3e210b4610000000 - DP3 = 1.14423774522196636802E-17 // ?? 0x3c6a62633145c06e + DP1 = 3.14159265160560607910e0 // ?? 0x400921fb54000000 + DP2 = 1.98418714791870343106e-9 // ?? 0x3e210b4610000000 + DP3 = 1.14423774522196636802e-17 // ?? 0x3c6a62633145c06e ) t := x / math.Pi if t >= 0 { diff --git a/src/math/sin.go b/src/math/sin.go index cc8b1366ad..3b6dbe3397 100644 --- a/src/math/sin.go +++ b/src/math/sin.go @@ -91,22 +91,22 @@ package math // sin coefficients var _sin = [...]float64{ - 1.58962301576546568060E-10, // 0x3de5d8fd1fd19ccd - -2.50507477628578072866E-8, // 0xbe5ae5e5a9291f5d - 2.75573136213857245213E-6, // 0x3ec71de3567d48a1 - -1.98412698295895385996E-4, // 0xbf2a01a019bfdf03 - 8.33333333332211858878E-3, // 0x3f8111111110f7d0 - -1.66666666666666307295E-1, // 0xbfc5555555555548 + 1.58962301576546568060e-10, // 0x3de5d8fd1fd19ccd + -2.50507477628578072866e-8, // 0xbe5ae5e5a9291f5d + 2.75573136213857245213e-6, // 0x3ec71de3567d48a1 + -1.98412698295895385996e-4, // 0xbf2a01a019bfdf03 + 8.33333333332211858878e-3, // 0x3f8111111110f7d0 + -1.66666666666666307295e-1, // 0xbfc5555555555548 } // cos coefficients var _cos = [...]float64{ - -1.13585365213876817300E-11, // 0xbda8fa49a0861a9b - 2.08757008419747316778E-9, // 0x3e21ee9d7b4e3f05 - -2.75573141792967388112E-7, // 0xbe927e4f7eac4bc6 - 2.48015872888517045348E-5, // 0x3efa01a019c844f5 - -1.38888888888730564116E-3, // 0xbf56c16c16c14f91 - 4.16666666666665929218E-2, // 0x3fa555555555554b + -1.13585365213876817300e-11, // 0xbda8fa49a0861a9b + 2.08757008419747316778e-9, // 0x3e21ee9d7b4e3f05 + -2.75573141792967388112e-7, // 0xbe927e4f7eac4bc6 + 2.48015872888517045348e-5, // 0x3efa01a019c844f5 + -1.38888888888730564116e-3, // 0xbf56c16c16c14f91 + 4.16666666666665929218e-2, // 0x3fa555555555554b } // Cos returns the cosine of the radian argument x. @@ -118,9 +118,9 @@ func Cos(x float64) float64 func cos(x float64) float64 { const ( - PI4A = 7.85398125648498535156E-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668E-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170, + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) // special cases switch { @@ -179,9 +179,9 @@ func Sin(x float64) float64 func sin(x float64) float64 { const ( - PI4A = 7.85398125648498535156E-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668E-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170, + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) // special cases switch { diff --git a/src/math/sincos.go b/src/math/sincos.go index c002db6b3c..5c5726f689 100644 --- a/src/math/sincos.go +++ b/src/math/sincos.go @@ -14,9 +14,9 @@ package math // Sincos(NaN) = NaN, NaN func Sincos(x float64) (sin, cos float64) { const ( - PI4A = 7.85398125648498535156E-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668E-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170, + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) // special cases switch { diff --git a/src/math/tan.go b/src/math/tan.go index 0d5394cf26..49b1239208 100644 --- a/src/math/tan.go +++ b/src/math/tan.go @@ -61,16 +61,16 @@ package math // tan coefficients var _tanP = [...]float64{ - -1.30936939181383777646E4, // 0xc0c992d8d24f3f38 - 1.15351664838587416140E6, // 0x413199eca5fc9ddd - -1.79565251976484877988E7, // 0xc1711fead3299176 + -1.30936939181383777646e4, // 0xc0c992d8d24f3f38 + 1.15351664838587416140e6, // 0x413199eca5fc9ddd + -1.79565251976484877988e7, // 0xc1711fead3299176 } var _tanQ = [...]float64{ - 1.00000000000000000000E0, - 1.36812963470692954678E4, //0x40cab8a5eeb36572 - -1.32089234440210967447E6, //0xc13427bc582abc96 - 2.50083801823357915839E7, //0x4177d98fc2ead8ef - -5.38695755929454629881E7, //0xc189afe03cbe5a31 + 1.00000000000000000000e0, + 1.36812963470692954678e4, //0x40cab8a5eeb36572 + -1.32089234440210967447e6, //0xc13427bc582abc96 + 2.50083801823357915839e7, //0x4177d98fc2ead8ef + -5.38695755929454629881e7, //0xc189afe03cbe5a31 } // Tan returns the tangent of the radian argument x. @@ -83,9 +83,9 @@ func Tan(x float64) float64 func tan(x float64) float64 { const ( - PI4A = 7.85398125648498535156E-1 // 0x3fe921fb40000000, Pi/4 split into three parts - PI4B = 3.77489470793079817668E-8 // 0x3e64442d00000000, - PI4C = 2.69515142907905952645E-15 // 0x3ce8469898cc5170, + PI4A = 7.85398125648498535156e-1 // 0x3fe921fb40000000, Pi/4 split into three parts + PI4B = 3.77489470793079817668e-8 // 0x3e64442d00000000, + PI4C = 2.69515142907905952645e-15 // 0x3ce8469898cc5170, ) // special cases switch { diff --git a/src/math/tanh.go b/src/math/tanh.go index eaa0e4cc52..0b7fb7f854 100644 --- a/src/math/tanh.go +++ b/src/math/tanh.go @@ -55,14 +55,14 @@ package math // var tanhP = [...]float64{ - -9.64399179425052238628E-1, - -9.92877231001918586564E1, - -1.61468768441708447952E3, + -9.64399179425052238628e-1, + -9.92877231001918586564e1, + -1.61468768441708447952e3, } var tanhQ = [...]float64{ - 1.12811678491632931402E2, - 2.23548839060100448583E3, - 4.84406305325125486048E3, + 1.12811678491632931402e2, + 2.23548839060100448583e3, + 4.84406305325125486048e3, } // Tanh returns the hyperbolic tangent of x. -- GitLab From d7d3887e3e1cae524f1530fd0942f9a64d669de9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Feb 2019 18:07:49 -0500 Subject: [PATCH 0039/1679] cmd/internal/obj/x86: fix issue19518_test in module mode Updates #30228 Change-Id: I6a38269f322d906702921b3879ff48c8a96ab511 Reviewed-on: https://go-review.googlesource.com/c/162831 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/internal/obj/x86/issue19518_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/internal/obj/x86/issue19518_test.go b/src/cmd/internal/obj/x86/issue19518_test.go index fa2beb8aad..4a29285ff1 100644 --- a/src/cmd/internal/obj/x86/issue19518_test.go +++ b/src/cmd/internal/obj/x86/issue19518_test.go @@ -41,6 +41,10 @@ func objdumpOutput(t *testing.T) []byte { t.Fatal(err) } defer os.RemoveAll(tmpdir) + err = ioutil.WriteFile(filepath.Join(tmpdir, "go.mod"), []byte("module issue19518\n"), 0666) + if err != nil { + t.Fatal(err) + } tmpfile, err := os.Create(filepath.Join(tmpdir, "input.s")) if err != nil { t.Fatal(err) -- GitLab From 8827147932314ab623cc65e071c5b48b2d76e37b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 19 Feb 2019 13:53:39 -0500 Subject: [PATCH 0040/1679] cmd/nm: fix testGoLib helper to be module-agnostic Updates #30228 Change-Id: I3c7864e6725312df5ec978cdc130ccfe8fc2e738 Reviewed-on: https://go-review.googlesource.com/c/162836 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/nm/nm_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 1b5bd21ad5..8176ddd7f4 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -222,12 +222,16 @@ func testGoLib(t *testing.T, iscgo bool) { if e := file.Close(); err == nil { err = e } + if err == nil { + err = ioutil.WriteFile(filepath.Join(libpath, "go.mod"), []byte("module mylib\n"), 0666) + } if err != nil { t.Fatal(err) } args := []string{"install", "mylib"} cmd := exec.Command(testenv.GoToolPath(t), args...) + cmd.Dir = libpath cmd.Env = append(os.Environ(), "GOPATH="+gopath) out, err := cmd.CombinedOutput() if err != nil { -- GitLab From 165a8d93cde73208487d854b71fc4142f2c39c6b Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 19 Feb 2019 14:43:52 -0500 Subject: [PATCH 0041/1679] cmd/vet: do not write test vet binary to GOROOT Updates #28387 Change-Id: Ie5a5f1f798eb5900f9c7bdef165abcca02dd0dde Reviewed-on: https://go-review.googlesource.com/c/163037 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/vet/vet_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index d106c5c29c..6e8cc70440 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -21,15 +21,21 @@ import ( "testing" ) -const ( - dataDir = "testdata" - binary = "./testvet.exe" -) +const dataDir = "testdata" + +var binary string // We implement TestMain so remove the test binary when all is done. func TestMain(m *testing.M) { + dir, err := ioutil.TempDir("", "vet_test") + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + defer os.RemoveAll(dir) + binary = filepath.Join(dir, "testvet.exe") + result := m.Run() - os.Remove(binary) os.Exit(result) } -- GitLab From 041d31b8820b62996cf1aa7b6fff77a818f2d94d Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Sun, 17 Feb 2019 15:35:52 -0800 Subject: [PATCH 0042/1679] cmd/compile: don't mix internal float/complex constants of different precision There are several places where a new (internal) complex constant is allocated via new(Mpcplx) rather than newMpcmplx(). The problem with using new() is that the Mpcplx data structure's Real and Imag components don't get initialized with an Mpflt of the correct precision (they have precision 0, which may be adjusted later). In all cases but one, the components of those complex constants are set using a Set operation which "inherits" the correct precision from the value that is being set. But when creating a complex value for an imaginary literal, the imaginary component is set via SetString which assumes 64bits of precision by default. As a result, the internal representation of 0.01i and complex(0, 0.01) was not correct. Replaced all used of new(Mpcplx) with newMpcmplx() and added a new test. Fixes #30243. Change-Id: Ife7fd6ccd42bf887a55c6ce91727754657e6cb2d Reviewed-on: https://go-review.googlesource.com/c/163000 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/const.go | 8 +++---- src/cmd/compile/internal/gc/mpfloat.go | 2 ++ src/cmd/compile/internal/gc/noder.go | 2 +- src/cmd/compile/internal/gc/swt_test.go | 2 +- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/fixedbugs/issue30243.go | 27 ++++++++++++++++++++++++ 6 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 test/fixedbugs/issue30243.go diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 3a9080e67d..f2035bf9a8 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -427,13 +427,13 @@ bad: func tocplx(v Val) Val { switch u := v.U.(type) { case *Mpint: - c := new(Mpcplx) + c := newMpcmplx() c.Real.SetInt(u) c.Imag.SetFloat64(0.0) v.U = c case *Mpflt: - c := new(Mpcplx) + c := newMpcmplx() c.Real.Set(u) c.Imag.SetFloat64(0.0) v.U = c @@ -845,7 +845,7 @@ Outer: case CTCPLX: x, y := x.U.(*Mpcplx), y.U.(*Mpcplx) - u := new(Mpcplx) + u := newMpcmplx() u.Real.Set(&x.Real) u.Imag.Set(&x.Imag) switch op { @@ -900,7 +900,7 @@ func unaryOp(op Op, x Val, t *types.Type) Val { case CTCPLX: x := x.U.(*Mpcplx) - u := new(Mpcplx) + u := newMpcmplx() u.Real.Set(&x.Real) u.Imag.Set(&x.Imag) u.Real.Neg() diff --git a/src/cmd/compile/internal/gc/mpfloat.go b/src/cmd/compile/internal/gc/mpfloat.go index 846ce4cca7..b3a9af452a 100644 --- a/src/cmd/compile/internal/gc/mpfloat.go +++ b/src/cmd/compile/internal/gc/mpfloat.go @@ -32,12 +32,14 @@ type Mpcplx struct { Imag Mpflt } +// Use newMpflt (not new(Mpflt)!) to get the correct default precision. func newMpflt() *Mpflt { var a Mpflt a.Val.SetPrec(Mpprec) return &a } +// Use newMpcmplx (not new(Mpcplx)!) to get the correct default precision. func newMpcmplx() *Mpcplx { var a Mpcplx a.Real = *newMpflt() diff --git a/src/cmd/compile/internal/gc/noder.go b/src/cmd/compile/internal/gc/noder.go index 3aa303c0c1..3fab95b917 100644 --- a/src/cmd/compile/internal/gc/noder.go +++ b/src/cmd/compile/internal/gc/noder.go @@ -1327,7 +1327,7 @@ func (p *noder) basicLit(lit *syntax.BasicLit) Val { return Val{U: x} case syntax.ImagLit: - x := new(Mpcplx) + x := newMpcmplx() x.Imag.SetString(strings.TrimSuffix(s, "i")) return Val{U: x} diff --git a/src/cmd/compile/internal/gc/swt_test.go b/src/cmd/compile/internal/gc/swt_test.go index 74419596d2..2f73ef7b99 100644 --- a/src/cmd/compile/internal/gc/swt_test.go +++ b/src/cmd/compile/internal/gc/swt_test.go @@ -16,7 +16,7 @@ func nodrune(r rune) *Node { } func nodflt(f float64) *Node { - v := new(Mpflt) + v := newMpflt() v.SetFloat64(f) return nodlit(Val{v}) } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 63e0d78273..e22fd6445a 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1589,7 +1589,7 @@ func typecheck1(n *Node, top int) (res *Node) { if l.Op == OLITERAL && r.Op == OLITERAL { // make it a complex literal - c := new(Mpcplx) + c := newMpcmplx() c.Real.Set(toflt(l.Val()).U.(*Mpflt)) c.Imag.Set(toflt(r.Val()).U.(*Mpflt)) setconst(n, Val{c}) diff --git a/test/fixedbugs/issue30243.go b/test/fixedbugs/issue30243.go new file mode 100644 index 0000000000..51fd204cbc --- /dev/null +++ b/test/fixedbugs/issue30243.go @@ -0,0 +1,27 @@ +// run + +// Copyright 2019 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. + +// Compile-time constants, even if they cannot be represented +// accurately, should remain the same in operations that don't +// affect their values. + +package main + +import "fmt" + +func main() { + const x = 0.01 + const xi = 0.01i + const xc = complex(0, x) + + if imag(xi) != x { + fmt.Printf("FAILED: %g != %g\n", imag(xi), x) + } + + if xi != complex(0, x) { + fmt.Printf("FAILED: %g != %g\n", xi, complex(0, x)) + } +} -- GitLab From c3b49186a6781de58a07bc49ae289354ae98e3be Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 14 Feb 2019 17:53:14 -0800 Subject: [PATCH 0043/1679] go/scanner: accept 'i' suffix orthogonally on all numbers This change accepts the 'i' suffix on binary and octal integer literals as well as hexadecimal floats. The suffix was already accepted on decimal integers and floats. See also the respective language in the spec change: https://golang.org/cl/161098 Change-Id: I0c182bdf58f8fd1f70090e581b3ccb2f5e2e4e79 Reviewed-on: https://go-review.googlesource.com/c/162880 Reviewed-by: Ian Lance Taylor --- src/go/scanner/scanner.go | 3 --- src/go/scanner/scanner_test.go | 20 ++++++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/go/scanner/scanner.go b/src/go/scanner/scanner.go index 9e85d4898a..00fe2dc0b1 100644 --- a/src/go/scanner/scanner.go +++ b/src/go/scanner/scanner.go @@ -472,9 +472,6 @@ func (s *Scanner) scanNumber() (token.Token, string) { // suffix 'i' if s.ch == 'i' { tok = token.IMAG - if prefix != 0 && prefix != '0' { - s.error(s.offset, "invalid suffix 'i' on "+litname(prefix)) - } s.next() } diff --git a/src/go/scanner/scanner_test.go b/src/go/scanner/scanner_test.go index 1d6865f198..9d3bbbbb24 100644 --- a/src/go/scanner/scanner_test.go +++ b/src/go/scanner/scanner_test.go @@ -927,13 +927,14 @@ func TestNumbers(t *testing.T) { {token.INT, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, {token.INT, "0b01a0", "0b01 a0", ""}, // only accept 0-9 - // binary floats and imaginaries (invalid) {token.FLOAT, "0b.", "0b.", "invalid radix point in binary literal"}, {token.FLOAT, "0b.1", "0b.1", "invalid radix point in binary literal"}, {token.FLOAT, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, {token.FLOAT, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, {token.FLOAT, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, - {token.IMAG, "0b10i", "0b10i", "invalid suffix 'i' on binary literal"}, + + {token.IMAG, "0b10i", "0b10i", ""}, + {token.IMAG, "0b10.0i", "0b10.0i", "invalid radix point in binary literal"}, // octals {token.INT, "0o0", "0o0", ""}, @@ -945,13 +946,14 @@ func TestNumbers(t *testing.T) { {token.INT, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, {token.INT, "0o12a3", "0o12 a3", ""}, // only accept 0-9 - // octal floats and imaginaries (invalid) {token.FLOAT, "0o.", "0o.", "invalid radix point in octal literal"}, {token.FLOAT, "0o.2", "0o.2", "invalid radix point in octal literal"}, {token.FLOAT, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, {token.FLOAT, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, {token.FLOAT, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, - {token.IMAG, "0o10i", "0o10i", "invalid suffix 'i' on octal literal"}, + + {token.IMAG, "0o10i", "0o10i", ""}, + {token.IMAG, "0o10e0i", "0o10e0i", "'e' exponent requires decimal mantissa"}, // 0-octals {token.INT, "0", "0", ""}, @@ -969,6 +971,9 @@ func TestNumbers(t *testing.T) { {token.INT, "1f", "1 f", ""}, // only accept 0-9 + {token.IMAG, "0i", "0i", ""}, + {token.IMAG, "0678i", "0678i", ""}, + // decimal floats {token.FLOAT, "0.", "0.", ""}, {token.FLOAT, "123.", "123.", ""}, @@ -1004,7 +1009,6 @@ func TestNumbers(t *testing.T) { {token.FLOAT, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, {token.FLOAT, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, - // decimal imaginaries {token.IMAG, "0.i", "0.i", ""}, {token.IMAG, ".123i", ".123i", ""}, {token.IMAG, "123.123i", "123.123i", ""}, @@ -1021,6 +1025,8 @@ func TestNumbers(t *testing.T) { {token.INT, "0x", "0x", "hexadecimal literal has no digits"}, {token.INT, "0x1g", "0x1 g", ""}, + {token.IMAG, "0xf00i", "0xf00i", ""}, + // hexadecimal floats {token.FLOAT, "0x0p0", "0x0p0", ""}, {token.FLOAT, "0x12efp-123", "0x12efp-123", ""}, @@ -1039,9 +1045,7 @@ func TestNumbers(t *testing.T) { {token.FLOAT, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, {token.FLOAT, "0x1.2p1a", "0x1.2p1 a", ""}, - // hexadecimal imaginaries (invalid) - {token.IMAG, "0xf00i", "0xf00i", "invalid suffix 'i' on hexadecimal literal"}, - {token.IMAG, "0xf00.bap+12i", "0xf00.bap+12i", "invalid suffix 'i' on hexadecimal literal"}, + {token.IMAG, "0xf00.bap+12i", "0xf00.bap+12i", ""}, // separators {token.INT, "0b_1000_0001", "0b_1000_0001", ""}, -- GitLab From 4ad5537bfa47a3cb55bb8194c3b6fa46de938fed Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 14 Feb 2019 17:34:29 -0800 Subject: [PATCH 0044/1679] cmd/compile: accept 'i' suffix orthogonally on all numbers This change accepts the 'i' suffix on binary and octal integer literals as well as hexadecimal floats. The suffix was already accepted on decimal integers and floats. Note that 0123i == 123i for backward-compatibility (and 09i is valid). See also the respective language in the spec change: https://golang.org/cl/161098 Change-Id: I9d2d755cba36a3fa7b9e24308c73754d4568daaf Reviewed-on: https://go-review.googlesource.com/c/162878 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/gc/mpfloat.go | 28 +++++++++++--- src/cmd/compile/internal/syntax/scanner.go | 3 -- .../compile/internal/syntax/scanner_test.go | 20 ++++++---- src/cmd/compile/internal/syntax/tokens.go | 3 ++ test/literal2.go | 38 ++++++++++--------- 5 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/cmd/compile/internal/gc/mpfloat.go b/src/cmd/compile/internal/gc/mpfloat.go index b3a9af452a..c1bbd3c1b4 100644 --- a/src/cmd/compile/internal/gc/mpfloat.go +++ b/src/cmd/compile/internal/gc/mpfloat.go @@ -183,15 +183,33 @@ func (a *Mpflt) SetString(as string) { // TODO(gri) remove this code once math/big.Float.Parse can handle separators as = strings.Replace(as, "_", "", -1) // strip separators + // TODO(gri) why is this needed? for len(as) > 0 && (as[0] == ' ' || as[0] == '\t') { as = as[1:] } - f, _, err := a.Val.Parse(as, 0) - if err != nil { - yyerror("malformed constant: %s (%v)", as, err) - a.Val.SetFloat64(0) - return + // Currently, Val.Parse below (== math/big.Float.Parse) does not + // handle the 0o-octal prefix which can appear with octal integers + // with 'i' suffix, which end up here as imaginary components of + // complex numbers. Handle explicitly for now. + // TODO(gri) remove once Float.Parse can handle octals (it handles 0b/0B) + var f *big.Float + if strings.HasPrefix(as, "0o") || strings.HasPrefix(as, "0O") { + x, ok := new(big.Int).SetString(as[2:], 8) + if !ok { + yyerror("malformed constant: %s", as) + a.Val.SetFloat64(0) + return + } + f = a.Val.SetInt(x) + } else { + var err error + f, _, err = a.Val.Parse(as, 0) + if err != nil { + yyerror("malformed constant: %s (%v)", as, err) + a.Val.SetFloat64(0) + return + } } if f.IsInf() { diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go index 0a77d48b3d..fbb3e1a40e 100644 --- a/src/cmd/compile/internal/syntax/scanner.go +++ b/src/cmd/compile/internal/syntax/scanner.go @@ -512,9 +512,6 @@ func (s *scanner) number(c rune) { // suffix 'i' if c == 'i' { s.kind = ImagLit - if prefix != 0 && prefix != '0' { - s.error("invalid suffix 'i' on " + litname(prefix)) - } c = s.getr() } s.ungetr() diff --git a/src/cmd/compile/internal/syntax/scanner_test.go b/src/cmd/compile/internal/syntax/scanner_test.go index 0f0579e2a5..bfc44950be 100644 --- a/src/cmd/compile/internal/syntax/scanner_test.go +++ b/src/cmd/compile/internal/syntax/scanner_test.go @@ -347,13 +347,14 @@ func TestNumbers(t *testing.T) { {IntLit, "0b0190", "0b0190", "invalid digit '9' in binary literal"}, {IntLit, "0b01a0", "0b01 a0", ""}, // only accept 0-9 - // binary floats and imaginaries (invalid) {FloatLit, "0b.", "0b.", "invalid radix point in binary literal"}, {FloatLit, "0b.1", "0b.1", "invalid radix point in binary literal"}, {FloatLit, "0b1.0", "0b1.0", "invalid radix point in binary literal"}, {FloatLit, "0b1e10", "0b1e10", "'e' exponent requires decimal mantissa"}, {FloatLit, "0b1P-1", "0b1P-1", "'P' exponent requires hexadecimal mantissa"}, - {ImagLit, "0b10i", "0b10i", "invalid suffix 'i' on binary literal"}, + + {ImagLit, "0b10i", "0b10i", ""}, + {ImagLit, "0b10.0i", "0b10.0i", "invalid radix point in binary literal"}, // octals {IntLit, "0o0", "0o0", ""}, @@ -365,13 +366,14 @@ func TestNumbers(t *testing.T) { {IntLit, "0o1293", "0o1293", "invalid digit '9' in octal literal"}, {IntLit, "0o12a3", "0o12 a3", ""}, // only accept 0-9 - // octal floats and imaginaries (invalid) {FloatLit, "0o.", "0o.", "invalid radix point in octal literal"}, {FloatLit, "0o.2", "0o.2", "invalid radix point in octal literal"}, {FloatLit, "0o1.2", "0o1.2", "invalid radix point in octal literal"}, {FloatLit, "0o1E+2", "0o1E+2", "'E' exponent requires decimal mantissa"}, {FloatLit, "0o1p10", "0o1p10", "'p' exponent requires hexadecimal mantissa"}, - {ImagLit, "0o10i", "0o10i", "invalid suffix 'i' on octal literal"}, + + {ImagLit, "0o10i", "0o10i", ""}, + {ImagLit, "0o10e0i", "0o10e0i", "'e' exponent requires decimal mantissa"}, // 0-octals {IntLit, "0", "0", ""}, @@ -389,6 +391,9 @@ func TestNumbers(t *testing.T) { {IntLit, "1f", "1 f", ""}, // only accept 0-9 + {ImagLit, "0i", "0i", ""}, + {ImagLit, "0678i", "0678i", ""}, + // decimal floats {FloatLit, "0.", "0.", ""}, {FloatLit, "123.", "123.", ""}, @@ -424,7 +429,6 @@ func TestNumbers(t *testing.T) { {FloatLit, "0p0", "0p0", "'p' exponent requires hexadecimal mantissa"}, {FloatLit, "1.0P-1", "1.0P-1", "'P' exponent requires hexadecimal mantissa"}, - // decimal imaginaries {ImagLit, "0.i", "0.i", ""}, {ImagLit, ".123i", ".123i", ""}, {ImagLit, "123.123i", "123.123i", ""}, @@ -441,6 +445,8 @@ func TestNumbers(t *testing.T) { {IntLit, "0x", "0x", "hexadecimal literal has no digits"}, {IntLit, "0x1g", "0x1 g", ""}, + {ImagLit, "0xf00i", "0xf00i", ""}, + // hexadecimal floats {FloatLit, "0x0p0", "0x0p0", ""}, {FloatLit, "0x12efp-123", "0x12efp-123", ""}, @@ -459,9 +465,7 @@ func TestNumbers(t *testing.T) { {FloatLit, "0x1234PAB", "0x1234P AB", "exponent has no digits"}, {FloatLit, "0x1.2p1a", "0x1.2p1 a", ""}, - // hexadecimal imaginaries (invalid) - {ImagLit, "0xf00i", "0xf00i", "invalid suffix 'i' on hexadecimal literal"}, - {ImagLit, "0xf00.bap+12i", "0xf00.bap+12i", "invalid suffix 'i' on hexadecimal literal"}, + {ImagLit, "0xf00.bap+12i", "0xf00.bap+12i", ""}, // separators {IntLit, "0b_1000_0001", "0b_1000_0001", ""}, diff --git a/src/cmd/compile/internal/syntax/tokens.go b/src/cmd/compile/internal/syntax/tokens.go index e00255a45e..9b26c9f12f 100644 --- a/src/cmd/compile/internal/syntax/tokens.go +++ b/src/cmd/compile/internal/syntax/tokens.go @@ -92,6 +92,9 @@ func contains(tokset uint64, tok token) bool { type LitKind uint +// TODO(gri) With the 'i' (imaginary) suffix now permitted on integer +// and floating-point numbers, having a single ImagLit does +// not represent the literal kind well anymore. Remove it? const ( IntLit LitKind = iota FloatLit diff --git a/test/literal2.go b/test/literal2.go index dbe22a012e..f552e33ada 100644 --- a/test/literal2.go +++ b/test/literal2.go @@ -5,7 +5,8 @@ // license that can be found in the LICENSE file. // Test Go2 literal syntax for basic types. -// TODO add more tests +// Avoid running gofmt on this file to preserve the +// test cases with upper-case prefixes (0B, 0O, 0X). package main @@ -17,7 +18,7 @@ func assert(cond bool) { } } -func equal(x, y float64) bool { +func equal(x, y interface{}) bool { if x != y { fmt.Printf("%g != %g\n", x, y) return false @@ -30,24 +31,30 @@ func main() { assert(0_1 == 01) assert(012 == 012) assert(0_1_2 == 012) + assert(0_1_2i == complex(0, 12)) // decimal digits despite leading 0 for backward-compatibility + assert(00089i == complex(0, 89)) // decimal digits despite leading 0 for backward-compatibility // decimals assert(1_000_000 == 1000000) + assert(1_000i == complex(0, 1000)) // hexadecimals assert(0x_1 == 0x1) assert(0x1_2 == 0x12) - assert(0X_cafe_f00d == 0xcafef00d) + assert(0x_cafe_f00d == 0xcafef00d) + assert(0x_cafei == complex(0, 0xcafe)) // octals assert(0o_1 == 01) assert(0o12 == 012) - assert(0O_1_2 == 012) + assert(0o_1_2 == 012) + assert(0o_1_2i == complex(0, 0o12)) // binaries assert(0b_1 == 1) assert(0b10 == 2) assert(0b_1_0 == 2) + assert(0b_1_0i == complex(0, 2)) // decimal floats assert(0. == 0.0) @@ -55,34 +62,29 @@ func main() { assert(1_0. == 10.0) assert(.0_1 == 0.01) assert(1_0.0_1 == 10.01) + assert(1_0.0_1i == complex(0, 10.01)) assert(0.e1_0 == 0.0e10) assert(.0e1_0 == 0.0e10) assert(1_0.e1_0 == 10.0e10) assert(.0_1e1_0 == 0.01e10) assert(1_0.0_1e1_0 == 10.01e10) + assert(1_0.0_1e1_0i == complex(0, 10.01e10)) // hexadecimal floats assert(equal(0x1p-2, 0.25)) assert(equal(0x2.p10, 2048.0)) assert(equal(0x1.Fp+0, 1.9375)) - assert(equal(0X.8p-0, 0.5)) - assert(equal(0X1FFFP-16, 0.1249847412109375)) + assert(equal(0x.8p-0, 0.5)) + assert(equal(0x1FFFp-16, 0.1249847412109375)) assert(equal(0x1.fffffffffffffp1023, 1.7976931348623157e308)) + assert(equal(0x1.fffffffffffffp1023i, complex(0, 1.7976931348623157e308))) assert(equal(0x_1p-2, 0.25)) assert(equal(0x2.p1_0, 2048.0)) assert(equal(0x1_0.Fp+0, 16.9375)) - assert(equal(0X_0.8p-0, 0.5)) - assert(equal(0X_1FF_FP-16, 0.1249847412109375)) - assert(equal(0x1.f_ffff_ffff_ffffP1_023, 1.7976931348623157e308)) - - // imaginaries - assert(0i == complex(0, 0)) - assert(09i == complex(0, 9)) // "09i" is a decimal int followed by "i" - assert(1.2e+3i == complex(0, 1.2e+3)) - - assert(0_0i == complex(0, 0)) - assert(0_9i == complex(0, 9)) // "0_9i" is a decimal int followed by "i" - assert(1.2_0e+0_3i == complex(0, 1.2e+3)) + assert(equal(0x_0.8p-0, 0.5)) + assert(equal(0x_1FF_Fp-16, 0.1249847412109375)) + assert(equal(0x1.f_ffff_ffff_ffffp1_023, 1.7976931348623157e308)) + assert(equal(0x1.f_ffff_ffff_ffffp1_023i, complex(0, 1.7976931348623157e308))) } -- GitLab From 34291f5f3e0a40eac110132b620b1444c2123d0e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Feb 2019 18:04:32 -0500 Subject: [PATCH 0045/1679] cmd/internal/goobj: make the buildGoobj test helper work in module mode Updates #30228 Change-Id: I8dd4a1f94dfd3be324a4f213941a20fa1b8b1215 Reviewed-on: https://go-review.googlesource.com/c/162832 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/internal/goobj/goobj_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/internal/goobj/goobj_test.go b/src/cmd/internal/goobj/goobj_test.go index 3b41589bbf..840b45c908 100644 --- a/src/cmd/internal/goobj/goobj_test.go +++ b/src/cmd/internal/goobj/goobj_test.go @@ -122,10 +122,14 @@ func buildGoobj() error { if testenv.HasCGO() { gopath := filepath.Join(buildDir, "gopath") err = copyDir(filepath.Join(gopath, "src", "mycgo"), filepath.Join("testdata", "mycgo")) + if err == nil { + err = ioutil.WriteFile(filepath.Join(gopath, "src", "mycgo", "go.mod"), []byte("module mycgo\n"), 0666) + } if err != nil { return err } cmd := exec.Command(gotool, "install", "-gcflags=all="+os.Getenv("GO_GCFLAGS"), "mycgo") + cmd.Dir = filepath.Join(gopath, "src", "mycgo") cmd.Env = append(os.Environ(), "GOPATH="+gopath) out, err = cmd.CombinedOutput() if err != nil { -- GitLab From 583975b9348a7c80998e79967c06862bb8e8d893 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Feb 2019 18:12:28 -0500 Subject: [PATCH 0046/1679] cmd/link: fix TestUnresolved in module mode Updates #30228 Change-Id: I9f0e7e59922bd56b17889f72124b7d14b2433218 Reviewed-on: https://go-review.googlesource.com/c/162833 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/link/link_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index e0aae02884..74238a2000 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -139,6 +139,7 @@ func TestUnresolved(t *testing.T) { // linker would find an undefined reference to "zero" created // by the runtime package. + write("go.mod", "module testunresolved\n") write("main.go", `package main func main() { -- GitLab From b88462ef8b9b0d8613c13deb27ef5f8b72eeab6e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Feb 2019 17:58:21 -0500 Subject: [PATCH 0047/1679] cmd/cover: fix TestHtmlUnformatted in module mode Updates #30228 Change-Id: Id9dffa6c805ac630945bac8febe342ce633626c6 Reviewed-on: https://go-review.googlesource.com/c/162830 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/cover/cover_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index 3de9b0c12d..f002442b63 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -448,6 +448,10 @@ func TestHtmlUnformatted(t *testing.T) { t.Fatal(err) } + if err := ioutil.WriteFile(filepath.Join(htmlUDir, "go.mod"), []byte("module htmlunformatted\n"), 0444); err != nil { + t.Fatal(err) + } + const htmlUContents = ` package htmlunformatted @@ -475,6 +479,7 @@ lab: // testcover -html TMPDIR/htmlunformatted.cov -o unformatted.html cmd = exec.Command(testcover, "-html", htmlUProfile, "-o", htmlUHTML) + cmd.Dir = htmlUDir run(cmd, t) } -- GitLab From 1e4a88fa0a599cb8c201996a5f7b069b85be9905 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 19 Feb 2019 13:48:15 -0500 Subject: [PATCH 0048/1679] cmd/link/internal/ld: make dwarf_test and associated testdata module-agnostic Updates #30228 Change-Id: I31aac4cb113c0c88a54329181ad27aee3d8acc71 Reviewed-on: https://go-review.googlesource.com/c/162835 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Than McIntosh --- src/cmd/link/internal/ld/dwarf_test.go | 24 +++++-------------- .../testdata/httptest/{src => }/main/main.go | 0 .../ld/testdata/issue25459/{src => }/a/a.go | 0 .../issue25459/{src => }/main/main.go | 2 +- .../testdata/issue26237/{src => }/b.dir/b.go | 0 .../issue26237/{src => }/main/main.go | 2 +- 6 files changed, 8 insertions(+), 20 deletions(-) rename src/cmd/link/internal/ld/testdata/httptest/{src => }/main/main.go (100%) rename src/cmd/link/internal/ld/testdata/issue25459/{src => }/a/a.go (100%) rename src/cmd/link/internal/ld/testdata/issue25459/{src => }/main/main.go (65%) rename src/cmd/link/internal/ld/testdata/issue26237/{src => }/b.dir/b.go (100%) rename src/cmd/link/internal/ld/testdata/issue26237/{src => }/main/main.go (75%) diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go index 7bbe2b710c..287ad5c99d 100644 --- a/src/cmd/link/internal/ld/dwarf_test.go +++ b/src/cmd/link/internal/ld/dwarf_test.go @@ -114,26 +114,14 @@ func gobuild(t *testing.T, dir string, testfile string, gcflags string) *builtFi return &builtFile{f, dst} } -func envWithGoPathSet(gp string) []string { - env := os.Environ() - for i := 0; i < len(env); i++ { - if strings.HasPrefix(env[i], "GOPATH=") { - env[i] = "GOPATH=" + gp - return env - } - } - env = append(env, "GOPATH="+gp) - return env -} - -// Similar to gobuild() above, but runs off a separate GOPATH environment +// Similar to gobuild() above, but uses a main package instead of a test.go file. -func gobuildTestdata(t *testing.T, tdir string, gopathdir string, packtobuild string, gcflags string) *builtFile { +func gobuildTestdata(t *testing.T, tdir string, pkgDir string, gcflags string) *builtFile { dst := filepath.Join(tdir, "out.exe") // Run a build with an updated GOPATH - cmd := exec.Command(testenv.GoToolPath(t), "build", gcflags, "-o", dst, packtobuild) - cmd.Env = envWithGoPathSet(gopathdir) + cmd := exec.Command(testenv.GoToolPath(t), "build", gcflags, "-o", dst) + cmd.Dir = pkgDir if b, err := cmd.CombinedOutput(); err != nil { t.Logf("build: %s\n", b) t.Fatalf("build error: %v", err) @@ -727,7 +715,7 @@ func main() { } } -func abstractOriginSanity(t *testing.T, gopathdir string, flags string) { +func abstractOriginSanity(t *testing.T, pkgDir string, flags string) { t.Parallel() dir, err := ioutil.TempDir("", "TestAbstractOriginSanity") @@ -737,7 +725,7 @@ func abstractOriginSanity(t *testing.T, gopathdir string, flags string) { defer os.RemoveAll(dir) // Build with inlining, to exercise DWARF inlining support. - f := gobuildTestdata(t, dir, gopathdir, "main", flags) + f := gobuildTestdata(t, dir, filepath.Join(pkgDir, "main"), flags) d, err := f.DWARF() if err != nil { diff --git a/src/cmd/link/internal/ld/testdata/httptest/src/main/main.go b/src/cmd/link/internal/ld/testdata/httptest/main/main.go similarity index 100% rename from src/cmd/link/internal/ld/testdata/httptest/src/main/main.go rename to src/cmd/link/internal/ld/testdata/httptest/main/main.go diff --git a/src/cmd/link/internal/ld/testdata/issue25459/src/a/a.go b/src/cmd/link/internal/ld/testdata/issue25459/a/a.go similarity index 100% rename from src/cmd/link/internal/ld/testdata/issue25459/src/a/a.go rename to src/cmd/link/internal/ld/testdata/issue25459/a/a.go diff --git a/src/cmd/link/internal/ld/testdata/issue25459/src/main/main.go b/src/cmd/link/internal/ld/testdata/issue25459/main/main.go similarity index 65% rename from src/cmd/link/internal/ld/testdata/issue25459/src/main/main.go rename to src/cmd/link/internal/ld/testdata/issue25459/main/main.go index be05f59dac..7b5796d714 100644 --- a/src/cmd/link/internal/ld/testdata/issue25459/src/main/main.go +++ b/src/cmd/link/internal/ld/testdata/issue25459/main/main.go @@ -1,6 +1,6 @@ package main -import "a" +import "cmd/link/internal/ld/testdata/issue25459/a" var Glob int diff --git a/src/cmd/link/internal/ld/testdata/issue26237/src/b.dir/b.go b/src/cmd/link/internal/ld/testdata/issue26237/b.dir/b.go similarity index 100% rename from src/cmd/link/internal/ld/testdata/issue26237/src/b.dir/b.go rename to src/cmd/link/internal/ld/testdata/issue26237/b.dir/b.go diff --git a/src/cmd/link/internal/ld/testdata/issue26237/src/main/main.go b/src/cmd/link/internal/ld/testdata/issue26237/main/main.go similarity index 75% rename from src/cmd/link/internal/ld/testdata/issue26237/src/main/main.go rename to src/cmd/link/internal/ld/testdata/issue26237/main/main.go index 6fdaa0bfa1..fdb1223d86 100644 --- a/src/cmd/link/internal/ld/testdata/issue26237/src/main/main.go +++ b/src/cmd/link/internal/ld/testdata/issue26237/main/main.go @@ -3,7 +3,7 @@ package main import ( "fmt" - b "b.dir" + b "cmd/link/internal/ld/testdata/issue26237/b.dir" ) var skyx int -- GitLab From dace6544b3ff077d8cc02fc37d59187be253ab70 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 19 Feb 2019 14:53:26 -0500 Subject: [PATCH 0049/1679] cmd/vet: make vet_test module-agnostic vet_test currently uses a custom GOPATH for each test, but it turns out not to be necessary. Updates #30228 Change-Id: Id7a7bf6d759bd94adccf44e197be1728c2f23575 Reviewed-on: https://go-review.googlesource.com/c/163038 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Alan Donovan --- src/cmd/vet/testdata/{src => }/asm/asm.go | 0 src/cmd/vet/testdata/{src => }/asm/asm1.s | 0 .../vet/testdata/{src => }/assign/assign.go | 0 .../vet/testdata/{src => }/atomic/atomic.go | 0 src/cmd/vet/testdata/{src => }/bool/bool.go | 0 .../testdata/{src => }/buildtag/buildtag.go | 0 src/cmd/vet/testdata/{src => }/cgo/cgo.go | 0 .../testdata/{src => }/composite/composite.go | 0 .../testdata/{src => }/copylock/copylock.go | 0 .../testdata/{src => }/deadcode/deadcode.go | 0 .../{src => }/httpresponse/httpresponse.go | 0 .../{src => }/lostcancel/lostcancel.go | 0 .../vet/testdata/{src => }/method/method.go | 0 .../vet/testdata/{src => }/nilfunc/nilfunc.go | 0 src/cmd/vet/testdata/{src => }/print/print.go | 52 +++++++++---------- .../testdata/{src => }/rangeloop/rangeloop.go | 0 src/cmd/vet/testdata/{src => }/shift/shift.go | 0 .../testdata/{src => }/structtag/structtag.go | 0 .../vet/testdata/{src => }/tagtest/file1.go | 0 .../vet/testdata/{src => }/tagtest/file2.go | 0 .../testdata/{src => }/testingpkg/tests.go | 0 .../{src => }/testingpkg/tests_test.go | 0 .../testdata/{src => }/unmarshal/unmarshal.go | 0 .../testdata/{src => }/unsafeptr/unsafeptr.go | 0 .../vet/testdata/{src => }/unused/unused.go | 0 src/cmd/vet/vet_test.go | 14 ++--- 26 files changed, 31 insertions(+), 35 deletions(-) rename src/cmd/vet/testdata/{src => }/asm/asm.go (100%) rename src/cmd/vet/testdata/{src => }/asm/asm1.s (100%) rename src/cmd/vet/testdata/{src => }/assign/assign.go (100%) rename src/cmd/vet/testdata/{src => }/atomic/atomic.go (100%) rename src/cmd/vet/testdata/{src => }/bool/bool.go (100%) rename src/cmd/vet/testdata/{src => }/buildtag/buildtag.go (100%) rename src/cmd/vet/testdata/{src => }/cgo/cgo.go (100%) rename src/cmd/vet/testdata/{src => }/composite/composite.go (100%) rename src/cmd/vet/testdata/{src => }/copylock/copylock.go (100%) rename src/cmd/vet/testdata/{src => }/deadcode/deadcode.go (100%) rename src/cmd/vet/testdata/{src => }/httpresponse/httpresponse.go (100%) rename src/cmd/vet/testdata/{src => }/lostcancel/lostcancel.go (100%) rename src/cmd/vet/testdata/{src => }/method/method.go (100%) rename src/cmd/vet/testdata/{src => }/nilfunc/nilfunc.go (100%) rename src/cmd/vet/testdata/{src => }/print/print.go (94%) rename src/cmd/vet/testdata/{src => }/rangeloop/rangeloop.go (100%) rename src/cmd/vet/testdata/{src => }/shift/shift.go (100%) rename src/cmd/vet/testdata/{src => }/structtag/structtag.go (100%) rename src/cmd/vet/testdata/{src => }/tagtest/file1.go (100%) rename src/cmd/vet/testdata/{src => }/tagtest/file2.go (100%) rename src/cmd/vet/testdata/{src => }/testingpkg/tests.go (100%) rename src/cmd/vet/testdata/{src => }/testingpkg/tests_test.go (100%) rename src/cmd/vet/testdata/{src => }/unmarshal/unmarshal.go (100%) rename src/cmd/vet/testdata/{src => }/unsafeptr/unsafeptr.go (100%) rename src/cmd/vet/testdata/{src => }/unused/unused.go (100%) diff --git a/src/cmd/vet/testdata/src/asm/asm.go b/src/cmd/vet/testdata/asm/asm.go similarity index 100% rename from src/cmd/vet/testdata/src/asm/asm.go rename to src/cmd/vet/testdata/asm/asm.go diff --git a/src/cmd/vet/testdata/src/asm/asm1.s b/src/cmd/vet/testdata/asm/asm1.s similarity index 100% rename from src/cmd/vet/testdata/src/asm/asm1.s rename to src/cmd/vet/testdata/asm/asm1.s diff --git a/src/cmd/vet/testdata/src/assign/assign.go b/src/cmd/vet/testdata/assign/assign.go similarity index 100% rename from src/cmd/vet/testdata/src/assign/assign.go rename to src/cmd/vet/testdata/assign/assign.go diff --git a/src/cmd/vet/testdata/src/atomic/atomic.go b/src/cmd/vet/testdata/atomic/atomic.go similarity index 100% rename from src/cmd/vet/testdata/src/atomic/atomic.go rename to src/cmd/vet/testdata/atomic/atomic.go diff --git a/src/cmd/vet/testdata/src/bool/bool.go b/src/cmd/vet/testdata/bool/bool.go similarity index 100% rename from src/cmd/vet/testdata/src/bool/bool.go rename to src/cmd/vet/testdata/bool/bool.go diff --git a/src/cmd/vet/testdata/src/buildtag/buildtag.go b/src/cmd/vet/testdata/buildtag/buildtag.go similarity index 100% rename from src/cmd/vet/testdata/src/buildtag/buildtag.go rename to src/cmd/vet/testdata/buildtag/buildtag.go diff --git a/src/cmd/vet/testdata/src/cgo/cgo.go b/src/cmd/vet/testdata/cgo/cgo.go similarity index 100% rename from src/cmd/vet/testdata/src/cgo/cgo.go rename to src/cmd/vet/testdata/cgo/cgo.go diff --git a/src/cmd/vet/testdata/src/composite/composite.go b/src/cmd/vet/testdata/composite/composite.go similarity index 100% rename from src/cmd/vet/testdata/src/composite/composite.go rename to src/cmd/vet/testdata/composite/composite.go diff --git a/src/cmd/vet/testdata/src/copylock/copylock.go b/src/cmd/vet/testdata/copylock/copylock.go similarity index 100% rename from src/cmd/vet/testdata/src/copylock/copylock.go rename to src/cmd/vet/testdata/copylock/copylock.go diff --git a/src/cmd/vet/testdata/src/deadcode/deadcode.go b/src/cmd/vet/testdata/deadcode/deadcode.go similarity index 100% rename from src/cmd/vet/testdata/src/deadcode/deadcode.go rename to src/cmd/vet/testdata/deadcode/deadcode.go diff --git a/src/cmd/vet/testdata/src/httpresponse/httpresponse.go b/src/cmd/vet/testdata/httpresponse/httpresponse.go similarity index 100% rename from src/cmd/vet/testdata/src/httpresponse/httpresponse.go rename to src/cmd/vet/testdata/httpresponse/httpresponse.go diff --git a/src/cmd/vet/testdata/src/lostcancel/lostcancel.go b/src/cmd/vet/testdata/lostcancel/lostcancel.go similarity index 100% rename from src/cmd/vet/testdata/src/lostcancel/lostcancel.go rename to src/cmd/vet/testdata/lostcancel/lostcancel.go diff --git a/src/cmd/vet/testdata/src/method/method.go b/src/cmd/vet/testdata/method/method.go similarity index 100% rename from src/cmd/vet/testdata/src/method/method.go rename to src/cmd/vet/testdata/method/method.go diff --git a/src/cmd/vet/testdata/src/nilfunc/nilfunc.go b/src/cmd/vet/testdata/nilfunc/nilfunc.go similarity index 100% rename from src/cmd/vet/testdata/src/nilfunc/nilfunc.go rename to src/cmd/vet/testdata/nilfunc/nilfunc.go diff --git a/src/cmd/vet/testdata/src/print/print.go b/src/cmd/vet/testdata/print/print.go similarity index 94% rename from src/cmd/vet/testdata/src/print/print.go rename to src/cmd/vet/testdata/print/print.go index 6bacd0fd74..7a4783aee4 100644 --- a/src/cmd/vet/testdata/src/print/print.go +++ b/src/cmd/vet/testdata/print/print.go @@ -126,16 +126,16 @@ func PrintfTests() { fmt.Printf("%U", x) // ERROR "Printf format %U has arg x of wrong type float64" fmt.Printf("%x", nil) // ERROR "Printf format %x has arg nil of wrong type untyped nil" fmt.Printf("%X", 2.3) // ERROR "Printf format %X has arg 2.3 of wrong type float64" - fmt.Printf("%s", stringerv) // ERROR "Printf format %s has arg stringerv of wrong type print.ptrStringer" - fmt.Printf("%t", stringerv) // ERROR "Printf format %t has arg stringerv of wrong type print.ptrStringer" - fmt.Printf("%s", embeddedStringerv) // ERROR "Printf format %s has arg embeddedStringerv of wrong type print.embeddedStringer" - fmt.Printf("%t", embeddedStringerv) // ERROR "Printf format %t has arg embeddedStringerv of wrong type print.embeddedStringer" - fmt.Printf("%q", notstringerv) // ERROR "Printf format %q has arg notstringerv of wrong type print.notstringer" - fmt.Printf("%t", notstringerv) // ERROR "Printf format %t has arg notstringerv of wrong type print.notstringer" - fmt.Printf("%t", stringerarrayv) // ERROR "Printf format %t has arg stringerarrayv of wrong type print.stringerarray" - fmt.Printf("%t", notstringerarrayv) // ERROR "Printf format %t has arg notstringerarrayv of wrong type print.notstringerarray" - fmt.Printf("%q", notstringerarrayv) // ERROR "Printf format %q has arg notstringerarrayv of wrong type print.notstringerarray" - fmt.Printf("%d", BoolFormatter(true)) // ERROR "Printf format %d has arg BoolFormatter\(true\) of wrong type print.BoolFormatter" + fmt.Printf("%s", stringerv) // ERROR "Printf format %s has arg stringerv of wrong type .*print.ptrStringer" + fmt.Printf("%t", stringerv) // ERROR "Printf format %t has arg stringerv of wrong type .*print.ptrStringer" + fmt.Printf("%s", embeddedStringerv) // ERROR "Printf format %s has arg embeddedStringerv of wrong type .*print.embeddedStringer" + fmt.Printf("%t", embeddedStringerv) // ERROR "Printf format %t has arg embeddedStringerv of wrong type .*print.embeddedStringer" + fmt.Printf("%q", notstringerv) // ERROR "Printf format %q has arg notstringerv of wrong type .*print.notstringer" + fmt.Printf("%t", notstringerv) // ERROR "Printf format %t has arg notstringerv of wrong type .*print.notstringer" + fmt.Printf("%t", stringerarrayv) // ERROR "Printf format %t has arg stringerarrayv of wrong type .*print.stringerarray" + fmt.Printf("%t", notstringerarrayv) // ERROR "Printf format %t has arg notstringerarrayv of wrong type .*print.notstringerarray" + fmt.Printf("%q", notstringerarrayv) // ERROR "Printf format %q has arg notstringerarrayv of wrong type .*print.notstringerarray" + fmt.Printf("%d", BoolFormatter(true)) // ERROR "Printf format %d has arg BoolFormatter\(true\) of wrong type .*print.BoolFormatter" fmt.Printf("%z", FormatterVal(true)) // correct (the type is responsible for formatting) fmt.Printf("%d", FormatterVal(true)) // correct (the type is responsible for formatting) fmt.Printf("%s", nonemptyinterface) // correct (the type is responsible for formatting) @@ -186,10 +186,10 @@ func PrintfTests() { Printf("d%", 2) // ERROR "Printf format % is missing verb at end of string" Printf("%d", percentDV) Printf("%d", &percentDV) - Printf("%d", notPercentDV) // ERROR "Printf format %d has arg notPercentDV of wrong type print.notPercentDStruct" - Printf("%d", ¬PercentDV) // ERROR "Printf format %d has arg ¬PercentDV of wrong type \*print.notPercentDStruct" + Printf("%d", notPercentDV) // ERROR "Printf format %d has arg notPercentDV of wrong type .*print.notPercentDStruct" + Printf("%d", ¬PercentDV) // ERROR "Printf format %d has arg ¬PercentDV of wrong type \*.*print.notPercentDStruct" Printf("%p", ¬PercentDV) // Works regardless: we print it as a pointer. - Printf("%q", &percentDV) // ERROR "Printf format %q has arg &percentDV of wrong type \*print.percentDStruct" + Printf("%q", &percentDV) // ERROR "Printf format %q has arg &percentDV of wrong type \*.*print.percentDStruct" Printf("%s", percentSV) Printf("%s", &percentSV) // Good argument reorderings. @@ -234,7 +234,7 @@ func PrintfTests() { Printf("%T", someFunction) // ok: maybe someone wants to see the type // Bug: used to recur forever. Printf("%p %x", recursiveStructV, recursiveStructV.next) - Printf("%p %x", recursiveStruct1V, recursiveStruct1V.next) // ERROR "Printf format %x has arg recursiveStruct1V\.next of wrong type \*print\.RecursiveStruct2" + Printf("%p %x", recursiveStruct1V, recursiveStruct1V.next) // ERROR "Printf format %x has arg recursiveStruct1V\.next of wrong type \*.*print\.RecursiveStruct2" Printf("%p %x", recursiveSliceV, recursiveSliceV) Printf("%p %x", recursiveMapV, recursiveMapV) // Special handling for Log. @@ -587,37 +587,37 @@ func UnexportedStringerOrError() { fmt.Printf("%s", unexportedInterface{3}) // ok; we can't see the problem us := unexportedStringer{} - fmt.Printf("%s", us) // ERROR "Printf format %s has arg us of wrong type print.unexportedStringer" - fmt.Printf("%s", &us) // ERROR "Printf format %s has arg &us of wrong type [*]print.unexportedStringer" + fmt.Printf("%s", us) // ERROR "Printf format %s has arg us of wrong type .*print.unexportedStringer" + fmt.Printf("%s", &us) // ERROR "Printf format %s has arg &us of wrong type [*].*print.unexportedStringer" usf := unexportedStringerOtherFields{ s: "foo", S: "bar", } - fmt.Printf("%s", usf) // ERROR "Printf format %s has arg usf of wrong type print.unexportedStringerOtherFields" - fmt.Printf("%s", &usf) // ERROR "Printf format %s has arg &usf of wrong type [*]print.unexportedStringerOtherFields" + fmt.Printf("%s", usf) // ERROR "Printf format %s has arg usf of wrong type .*print.unexportedStringerOtherFields" + fmt.Printf("%s", &usf) // ERROR "Printf format %s has arg &usf of wrong type [*].*print.unexportedStringerOtherFields" ue := unexportedError{ e: &errorer{}, } - fmt.Printf("%s", ue) // ERROR "Printf format %s has arg ue of wrong type print.unexportedError" - fmt.Printf("%s", &ue) // ERROR "Printf format %s has arg &ue of wrong type [*]print.unexportedError" + fmt.Printf("%s", ue) // ERROR "Printf format %s has arg ue of wrong type .*print.unexportedError" + fmt.Printf("%s", &ue) // ERROR "Printf format %s has arg &ue of wrong type [*].*print.unexportedError" uef := unexportedErrorOtherFields{ s: "foo", e: &errorer{}, S: "bar", } - fmt.Printf("%s", uef) // ERROR "Printf format %s has arg uef of wrong type print.unexportedErrorOtherFields" - fmt.Printf("%s", &uef) // ERROR "Printf format %s has arg &uef of wrong type [*]print.unexportedErrorOtherFields" + fmt.Printf("%s", uef) // ERROR "Printf format %s has arg uef of wrong type .*print.unexportedErrorOtherFields" + fmt.Printf("%s", &uef) // ERROR "Printf format %s has arg &uef of wrong type [*].*print.unexportedErrorOtherFields" uce := unexportedCustomError{ e: errorer{}, } - fmt.Printf("%s", uce) // ERROR "Printf format %s has arg uce of wrong type print.unexportedCustomError" + fmt.Printf("%s", uce) // ERROR "Printf format %s has arg uce of wrong type .*print.unexportedCustomError" uei := unexportedErrorInterface{} - fmt.Printf("%s", uei) // ERROR "Printf format %s has arg uei of wrong type print.unexportedErrorInterface" + fmt.Printf("%s", uei) // ERROR "Printf format %s has arg uei of wrong type .*print.unexportedErrorInterface" fmt.Println("foo\n", "bar") // not an error fmt.Println("foo\n") // ERROR "Println arg list ends with redundant newline" @@ -627,7 +627,7 @@ func UnexportedStringerOrError() { intSlice := []int{3, 4} fmt.Printf("%s", intSlice) // ERROR "Printf format %s has arg intSlice of wrong type \[\]int" nonStringerArray := [1]unexportedStringer{{}} - fmt.Printf("%s", nonStringerArray) // ERROR "Printf format %s has arg nonStringerArray of wrong type \[1\]print.unexportedStringer" + fmt.Printf("%s", nonStringerArray) // ERROR "Printf format %s has arg nonStringerArray of wrong type \[1\].*print.unexportedStringer" fmt.Printf("%s", []stringer{3, 4}) // not an error fmt.Printf("%s", [2]stringer{3, 4}) // not an error } @@ -677,5 +677,5 @@ func PointersToCompoundTypes() { type T1 struct { X *T2 } - fmt.Printf("%s\n", T1{&T2{"x"}}) // ERROR "Printf format %s has arg T1{&T2{.x.}} of wrong type print\.T1" + fmt.Printf("%s\n", T1{&T2{"x"}}) // ERROR "Printf format %s has arg T1{&T2{.x.}} of wrong type .*print\.T1" } diff --git a/src/cmd/vet/testdata/src/rangeloop/rangeloop.go b/src/cmd/vet/testdata/rangeloop/rangeloop.go similarity index 100% rename from src/cmd/vet/testdata/src/rangeloop/rangeloop.go rename to src/cmd/vet/testdata/rangeloop/rangeloop.go diff --git a/src/cmd/vet/testdata/src/shift/shift.go b/src/cmd/vet/testdata/shift/shift.go similarity index 100% rename from src/cmd/vet/testdata/src/shift/shift.go rename to src/cmd/vet/testdata/shift/shift.go diff --git a/src/cmd/vet/testdata/src/structtag/structtag.go b/src/cmd/vet/testdata/structtag/structtag.go similarity index 100% rename from src/cmd/vet/testdata/src/structtag/structtag.go rename to src/cmd/vet/testdata/structtag/structtag.go diff --git a/src/cmd/vet/testdata/src/tagtest/file1.go b/src/cmd/vet/testdata/tagtest/file1.go similarity index 100% rename from src/cmd/vet/testdata/src/tagtest/file1.go rename to src/cmd/vet/testdata/tagtest/file1.go diff --git a/src/cmd/vet/testdata/src/tagtest/file2.go b/src/cmd/vet/testdata/tagtest/file2.go similarity index 100% rename from src/cmd/vet/testdata/src/tagtest/file2.go rename to src/cmd/vet/testdata/tagtest/file2.go diff --git a/src/cmd/vet/testdata/src/testingpkg/tests.go b/src/cmd/vet/testdata/testingpkg/tests.go similarity index 100% rename from src/cmd/vet/testdata/src/testingpkg/tests.go rename to src/cmd/vet/testdata/testingpkg/tests.go diff --git a/src/cmd/vet/testdata/src/testingpkg/tests_test.go b/src/cmd/vet/testdata/testingpkg/tests_test.go similarity index 100% rename from src/cmd/vet/testdata/src/testingpkg/tests_test.go rename to src/cmd/vet/testdata/testingpkg/tests_test.go diff --git a/src/cmd/vet/testdata/src/unmarshal/unmarshal.go b/src/cmd/vet/testdata/unmarshal/unmarshal.go similarity index 100% rename from src/cmd/vet/testdata/src/unmarshal/unmarshal.go rename to src/cmd/vet/testdata/unmarshal/unmarshal.go diff --git a/src/cmd/vet/testdata/src/unsafeptr/unsafeptr.go b/src/cmd/vet/testdata/unsafeptr/unsafeptr.go similarity index 100% rename from src/cmd/vet/testdata/src/unsafeptr/unsafeptr.go rename to src/cmd/vet/testdata/unsafeptr/unsafeptr.go diff --git a/src/cmd/vet/testdata/src/unused/unused.go b/src/cmd/vet/testdata/unused/unused.go similarity index 100% rename from src/cmd/vet/testdata/src/unused/unused.go rename to src/cmd/vet/testdata/unused/unused.go diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 6e8cc70440..e9b8c69d53 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -13,6 +13,7 @@ import ( "log" "os" "os/exec" + "path" "path/filepath" "regexp" "strconv" @@ -65,14 +66,9 @@ func Build(t *testing.T) { built = true } -func vetCmd(t *testing.T, args ...string) *exec.Cmd { - cmd := exec.Command(testenv.GoToolPath(t), "vet", "-vettool="+binary) - cmd.Args = append(cmd.Args, args...) - testdata, err := filepath.Abs("testdata") - if err != nil { - t.Fatal(err) - } - cmd.Env = append(os.Environ(), "GOPATH="+testdata) +func vetCmd(t *testing.T, arg, pkg string) *exec.Cmd { + cmd := exec.Command(testenv.GoToolPath(t), "vet", "-vettool="+binary, arg, path.Join("cmd/vet/testdata", pkg)) + cmd.Env = os.Environ() return cmd } @@ -119,7 +115,7 @@ func TestVet(t *testing.T) { cmd.Env = append(cmd.Env, "GOOS=linux", "GOARCH=amd64") } - dir := filepath.Join("testdata/src", pkg) + dir := filepath.Join("testdata", pkg) gos, err := filepath.Glob(filepath.Join(dir, "*.go")) if err != nil { t.Fatal(err) -- GitLab From 153c0da89bca6726545cf4451053235b552d3d51 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 19 Feb 2019 18:12:13 -0800 Subject: [PATCH 0050/1679] path/filepath: revert "fix Windows-specific Clean bug" Revert CL 137055, which changed Clean("\\somepath\dir\") to return "\\somepath\dir" on Windows. It's not entirely clear this is correct, as this path is really "\\server\share\", and as such the trailing slash may be the path on that share, much like "C:\". In any case, the change broke existing code, so roll it back for now and rethink for 1.13. Updates #27791 Fixes #30307 Change-Id: I69200b1efe38bdb6d452b744582a2bfbb3acbcec Reviewed-on: https://go-review.googlesource.com/c/163077 Reviewed-by: Brad Fitzpatrick Reviewed-by: Emmanuel Odeke --- src/path/filepath/path.go | 11 +++-------- src/path/filepath/path_test.go | 3 --- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/path/filepath/path.go b/src/path/filepath/path.go index bbb90306a7..aba1717e7d 100644 --- a/src/path/filepath/path.go +++ b/src/path/filepath/path.go @@ -96,19 +96,14 @@ func Clean(path string) string { } return originalPath + "." } - - n := len(path) - if volLen > 2 && n == 1 && os.IsPathSeparator(path[0]) { - // UNC volume name with trailing slash. - return FromSlash(originalPath[:volLen]) - } rooted := os.IsPathSeparator(path[0]) // Invariants: // reading from path; r is index of next byte to process. - // writing to out; w is index of next byte to write. - // dotdot is index in out where .. must stop, either because + // writing to buf; w is index of next byte to write. + // dotdot is index in buf where .. must stop, either because // it is the leading slash or it is a leading ../../.. prefix. + n := len(path) out := lazybuf{path: path, volAndPath: originalPath, volLen: volLen} r, dotdot := 0, 0 if rooted { diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go index 9c4c7ebedc..7a434a4292 100644 --- a/src/path/filepath/path_test.go +++ b/src/path/filepath/path_test.go @@ -93,9 +93,6 @@ var wincleantests = []PathTest{ {`//host/share/foo/../baz`, `\\host\share\baz`}, {`\\a\b\..\c`, `\\a\b\c`}, {`\\a\b`, `\\a\b`}, - {`\\a\b\`, `\\a\b`}, - {`\\folder\share\foo`, `\\folder\share\foo`}, - {`\\folder\share\foo\`, `\\folder\share\foo`}, } func TestClean(t *testing.T) { -- GitLab From 34fb5855eb73fe04ee0bcfc0d9ca8be5440a560b Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 20 Feb 2019 10:44:52 -0800 Subject: [PATCH 0051/1679] text/scanner: don't liberally consume (invalid) floats or underbars This is a follow-up on https://golang.org/cl/161199 which introduced the new Go 2 number literals to text/scanner. That change introduced a bug by allowing decimal and hexadecimal floats to be consumed even if the scanner was not configured to accept floats. This CL changes the code to not consume a radix dot '.' or exponent unless the scanner is configured to accept floats. This CL also introduces a new mode "AllowNumberbars" which controls whether underbars '_' are permitted as digit separators in numbers or not. There is a possibility that we may need to refine text/scanner further (e.g., the Float mode now includes hexadecimal floats which it didn't recognize before). We're very early in the cycle, so let's see how it goes. RELNOTE=yes Updates #12711. Updates #19308. Updates #28493. Updates #29008. Fixes #30320. Change-Id: I6481d314f0384e09ef6803ffad38dc529b1e89a3 Reviewed-on: https://go-review.googlesource.com/c/163079 Reviewed-by: Ian Lance Taylor --- api/except.txt | 1 + api/next.txt | 3 ++ src/text/scanner/scanner.go | 48 ++++++++++++++++++-------------- src/text/scanner/scanner_test.go | 37 ++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 21 deletions(-) diff --git a/api/except.txt b/api/except.txt index 637be18135..a608d5783e 100644 --- a/api/except.txt +++ b/api/except.txt @@ -457,3 +457,4 @@ pkg syscall (freebsd-arm-cgo), type Stat_t struct, Nlink uint16 pkg syscall (freebsd-arm-cgo), type Stat_t struct, Rdev uint32 pkg syscall (freebsd-arm-cgo), type Statfs_t struct, Mntfromname [88]int8 pkg syscall (freebsd-arm-cgo), type Statfs_t struct, Mntonname [88]int8 +pkg text/scanner, const GoTokens = 1012 \ No newline at end of file diff --git a/api/next.txt b/api/next.txt index e69de29bb2..aaea62d70b 100644 --- a/api/next.txt +++ b/api/next.txt @@ -0,0 +1,3 @@ +pkg text/scanner, const AllowNumberbars = 1024 +pkg text/scanner, const AllowNumberbars ideal-int +pkg text/scanner, const GoTokens = 2036 diff --git a/src/text/scanner/scanner.go b/src/text/scanner/scanner.go index 38c27f6a08..8db0ed28d3 100644 --- a/src/text/scanner/scanner.go +++ b/src/text/scanner/scanner.go @@ -59,15 +59,16 @@ func (pos Position) String() string { // "foo" is scanned as the token sequence '"' Ident '"'. // const ( - ScanIdents = 1 << -Ident - ScanInts = 1 << -Int - ScanFloats = 1 << -Float // includes Ints - ScanChars = 1 << -Char - ScanStrings = 1 << -String - ScanRawStrings = 1 << -RawString - ScanComments = 1 << -Comment - SkipComments = 1 << -skipComment // if set with ScanComments, comments become white space - GoTokens = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments + ScanIdents = 1 << -Ident + ScanInts = 1 << -Int + ScanFloats = 1 << -Float // includes Ints and hexadecimal floats + ScanChars = 1 << -Char + ScanStrings = 1 << -String + ScanRawStrings = 1 << -RawString + ScanComments = 1 << -Comment + SkipComments = 1 << -skipComment // if set with ScanComments, comments become white space + AllowNumberbars = 1 << -allowNumberbars // if set, number literals may contain underbars as digit separators + GoTokens = ScanIdents | ScanFloats | ScanChars | ScanStrings | ScanRawStrings | ScanComments | SkipComments | AllowNumberbars ) // The result of Scan is one of these tokens or a Unicode character. @@ -80,7 +81,10 @@ const ( String RawString Comment + + // internal use only skipComment + allowNumberbars ) var tokenString = map[rune]string{ @@ -359,7 +363,8 @@ func lower(ch rune) rune { return ('a' - 'A') | ch } // returns lower-case c func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } func isHex(ch rune) bool { return '0' <= ch && ch <= '9' || 'a' <= lower(ch) && lower(ch) <= 'f' } -// digits accepts the sequence { digit | '_' } starting with ch0. +// digits accepts the sequence { digit } (if AllowNumberbars is not set) +// or { digit | '_' } (if AllowNumberbars is set), starting with ch0. // If base <= 10, digits accepts any decimal digit but records // the first invalid digit >= base in *invalid if *invalid == 0. // digits returns the first rune that is not part of the sequence @@ -369,7 +374,7 @@ func (s *Scanner) digits(ch0 rune, base int, invalid *rune) (ch rune, digsep int ch = ch0 if base <= 10 { max := rune('0' + base) - for isDecimal(ch) || ch == '_' { + for isDecimal(ch) || ch == '_' && s.Mode&AllowNumberbars != 0 { ds := 1 if ch == '_' { ds = 2 @@ -380,7 +385,7 @@ func (s *Scanner) digits(ch0 rune, base int, invalid *rune) (ch rune, digsep int ch = s.next() } } else { - for isHex(ch) || ch == '_' { + for isHex(ch) || ch == '_' && s.Mode&AllowNumberbars != 0 { ds := 1 if ch == '_' { ds = 2 @@ -392,7 +397,7 @@ func (s *Scanner) digits(ch0 rune, base int, invalid *rune) (ch rune, digsep int return } -func (s *Scanner) scanNumber(ch rune, integerPart bool) (rune, rune) { +func (s *Scanner) scanNumber(ch rune, seenDot bool) (rune, rune) { base := 10 // number base prefix := rune(0) // one of 0 (decimal), '0' (0-octal), 'x', 'o', or 'b' digsep := 0 // bit 0: digit present, bit 1: '_' present @@ -401,7 +406,7 @@ func (s *Scanner) scanNumber(ch rune, integerPart bool) (rune, rune) { // integer part var tok rune var ds int - if integerPart { + if !seenDot { tok = Int if ch == '0' { ch = s.next() @@ -422,17 +427,18 @@ func (s *Scanner) scanNumber(ch rune, integerPart bool) (rune, rune) { } ch, ds = s.digits(ch, base, &invalid) digsep |= ds + if ch == '.' && s.Mode&ScanFloats != 0 { + ch = s.next() + seenDot = true + } } // fractional part - if !integerPart || ch == '.' { + if seenDot { tok = Float if prefix == 'o' || prefix == 'b' { s.error("invalid radix point in " + litname(prefix)) } - if ch == '.' { - ch = s.next() - } ch, ds = s.digits(ch, base, &invalid) digsep |= ds } @@ -442,7 +448,7 @@ func (s *Scanner) scanNumber(ch rune, integerPart bool) (rune, rune) { } // exponent - if e := lower(ch); e == 'e' || e == 'p' { + if e := lower(ch); (e == 'e' || e == 'p') && s.Mode&ScanFloats != 0 { switch { case e == 'e' && prefix != 0 && prefix != '0': s.errorf("%q exponent requires decimal mantissa", ch) @@ -682,7 +688,7 @@ redo: } case isDecimal(ch): if s.Mode&(ScanInts|ScanFloats) != 0 { - tok, ch = s.scanNumber(ch, true) + tok, ch = s.scanNumber(ch, false) } else { ch = s.next() } @@ -705,7 +711,7 @@ redo: case '.': ch = s.next() if isDecimal(ch) && s.Mode&ScanFloats != 0 { - tok, ch = s.scanNumber(ch, false) + tok, ch = s.scanNumber(ch, true) } case '/': ch = s.next() diff --git a/src/text/scanner/scanner_test.go b/src/text/scanner/scanner_test.go index 58db8e1971..6ae8fd9a08 100644 --- a/src/text/scanner/scanner_test.go +++ b/src/text/scanner/scanner_test.go @@ -877,3 +877,40 @@ func TestNumbers(t *testing.T) { } } } + +func TestIssue30320(t *testing.T) { + for _, test := range []struct { + in, want string + mode uint + }{ + {"foo01.bar31.xx-0-1-1-0", "01 31 0 1 1 0", ScanInts}, + {"foo0/12/0/5.67", "0 12 0 5 67", ScanInts}, + {"xxx1e0yyy", "1 0", ScanInts}, + {"1_2", "1 2", ScanInts}, // don't consume _ as part of a number if not explicitly enabled + {"1_2", "1_2", ScanInts | AllowNumberbars}, + {"xxx1.0yyy2e3ee", "1 0 2 3", ScanInts}, + {"xxx1.0yyy2e3ee", "1.0 2e3", ScanFloats}, + } { + got := extractInts(test.in, test.mode) + if got != test.want { + t.Errorf("%q: got %q; want %q", test.in, got, test.want) + } + } +} + +func extractInts(t string, mode uint) (res string) { + var s Scanner + s.Init(strings.NewReader(t)) + s.Mode = mode + for { + switch tok := s.Scan(); tok { + case Int, Float: + if len(res) > 0 { + res += " " + } + res += s.TokenText() + case EOF: + return + } + } +} -- GitLab From 889aa5eb98ff2a5134f5b075525479da399e5c4f Mon Sep 17 00:00:00 2001 From: Herbie Ong Date: Wed, 20 Feb 2019 11:30:14 -0800 Subject: [PATCH 0052/1679] go/build: add go1.13 release tag Adding this early in the cycle to start regression testing in the master toolchain. Change-Id: Ia151429c4f94efbac0aa41ab6bc16e7462b0e303 Reviewed-on: https://go-review.googlesource.com/c/163082 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/go/build/build.go | 2 +- src/go/build/doc.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/go/build/build.go b/src/go/build/build.go index 0fa67201f8..94db198764 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -299,7 +299,7 @@ func defaultContext() Context { // (perhaps it is the stub to use in that case) should say "+build !go1.x". // NOTE: If you add to this list, also update the doc comment in doc.go. // NOTE: The last element in ReleaseTags should be the current release. - const version = 12 // go1.12 + const version = 13 // go1.13 for i := 1; i <= version; i++ { c.ReleaseTags = append(c.ReleaseTags, "go1."+strconv.Itoa(i)) } diff --git a/src/go/build/doc.go b/src/go/build/doc.go index 8e3858feea..f6444c7e05 100644 --- a/src/go/build/doc.go +++ b/src/go/build/doc.go @@ -109,6 +109,7 @@ // - "go1.10", from Go version 1.10 onward // - "go1.11", from Go version 1.11 onward // - "go1.12", from Go version 1.12 onward +// - "go1.13", from Go version 1.13 onward // - any additional words listed in ctxt.BuildTags // // There are no build tags for beta or minor releases. -- GitLab From 0349f29a55fc194e3d51f748ec9ddceab87a5668 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sun, 17 Feb 2019 23:12:55 -0500 Subject: [PATCH 0053/1679] cmd/compile: flow interface data to heap if CONVIFACE of a non-direct interface escapes Consider the following code: func f(x []*T) interface{} { return x } It returns an interface that holds a heap copy of x (by calling convT2I or friend), therefore x escape to heap. The current escape analysis only recognizes that x flows to the result. This is not sufficient, since if the result does not escape, x's content may be stack allocated and this will result a heap-to-stack pointer, which is bad. Fix this by realizing that if a CONVIFACE escapes and we're converting from a non-direct interface type, the data needs to escape to heap. Running "toolstash -cmp" on std & cmd, the generated machine code are identical for all packages. However, the export data (escape tags) differ in the following packages. It looks to me that all are similar to the "f" above, where the parameter should escape to heap. io/ioutil/ioutil.go:118 old: leaking param: r to result ~r1 level=0 new: leaking param: r image/image.go:943 old: leaking param: p to result ~r0 level=1 new: leaking param content: p net/url/url.go:200 old: leaking param: s to result ~r2 level=0 new: leaking param: s (as a consequence) net/url/url.go:183 old: leaking param: s to result ~r1 level=0 new: leaking param: s net/url/url.go:194 old: leaking param: s to result ~r1 level=0 new: leaking param: s net/url/url.go:699 old: leaking param: u to result ~r0 level=1 new: leaking param: u net/url/url.go:775 old: (*URL).String u does not escape new: leaking param content: u net/url/url.go:1038 old: leaking param: u to result ~r0 level=1 new: leaking param: u net/url/url.go:1099 old: (*URL).MarshalBinary u does not escape new: leaking param content: u flag/flag.go:235 old: leaking param: s to result ~r0 level=1 new: leaking param content: s go/scanner/errors.go:105 old: leaking param: p to result ~r0 level=0 new: leaking param: p database/sql/sql.go:204 old: leaking param: ns to result ~r0 level=0 new: leaking param: ns go/constant/value.go:303 old: leaking param: re to result ~r2 level=0, leaking param: im to result ~r2 level=0 new: leaking param: re, leaking param: im go/constant/value.go:846 old: leaking param: x to result ~r1 level=0 new: leaking param: x encoding/xml/xml.go:518 old: leaking param: d to result ~r1 level=2 new: leaking param content: d encoding/xml/xml.go:122 old: leaking param: leaking param: t to result ~r1 level=0 new: leaking param: t crypto/x509/verify.go:506 old: leaking param: c to result ~r8 level=0 new: leaking param: c crypto/x509/verify.go:563 old: leaking param: c to result ~r3 level=0, leaking param content: c new: leaking param: c crypto/x509/verify.go:615 old: (nothing) new: leaking closure reference c crypto/x509/verify.go:996 old: leaking param: c to result ~r1 level=0, leaking param content: c new: leaking param: c net/http/filetransport.go:30 old: leaking param: fs to result ~r1 level=0 new: leaking param: fs net/http/h2_bundle.go:2684 old: leaking param: mh to result ~r0 level=2 new: leaking param content: mh net/http/h2_bundle.go:7352 old: http2checkConnHeaders req does not escape new: leaking param content: req net/http/pprof/pprof.go:221 old: leaking param: name to result ~r1 level=0 new: leaking param: name cmd/internal/bio/must.go:21 old: leaking param: w to result ~r1 level=0 new: leaking param: w Fixes #29353. Change-Id: I7e7798ae773728028b0dcae5bccb3ada51189c68 Reviewed-on: https://go-review.googlesource.com/c/162829 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky Reviewed-by: David Chase --- src/cmd/compile/internal/gc/esc.go | 10 ++++++++++ test/escape_because.go | 2 +- test/escape_param.go | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 322b2dcd0b..bd0fb82554 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -2105,6 +2105,16 @@ func (e *EscState) escwalkBody(level Level, dst *Node, src *Node, step *EscStep, step.describe(src) } extraloopdepth = modSrcLoopdepth + if src.Op == OCONVIFACE { + lt := src.Left.Type + if !lt.IsInterface() && !isdirectiface(lt) && types.Haspointers(lt) { + // We're converting from a non-direct interface type. + // The interface will hold a heap copy of the data + // (by calling convT2I or friend). Flow the data to heap. + // See issue 29353. + e.escwalk(level, &e.theSink, src.Left, e.stepWalk(dst, src.Left, "interface-converted", step)) + } + } } case ODOT, diff --git a/test/escape_because.go b/test/escape_because.go index 3b67ff9e4b..64fa28ddda 100644 --- a/test/escape_because.go +++ b/test/escape_because.go @@ -43,7 +43,7 @@ func f2(q *int) { // ERROR "from &u \(address-of\) at escape_because.go:43$" "fr sink = &u // ERROR "&u escapes to heap$" "from &u \(interface-converted\) at escape_because.go:43$" "from sink \(assigned to top level variable\) at escape_because.go:43$" } -func f3(r *int) interface{} { // ERROR "from \[\]\*int literal \(slice-literal-element\) at escape_because.go:47$" "from c \(assigned\) at escape_because.go:47$" "from c \(interface-converted\) at escape_because.go:48$" "from ~r1 \(return\) at escape_because.go:48$" "leaking param: r to result ~r1 level=-1$" +func f3(r *int) interface{} { // ERROR "from \[\]\*int literal \(slice-literal-element\) at escape_because.go:47$" "from c \(assigned\) at escape_because.go:47$" "from c \(interface-converted\) at escape_because.go:48$" "from ~r1 \(return\) at escape_because.go:48$" "leaking param: r" c := []*int{r} // ERROR "\[\]\*int literal escapes to heap$" "from c \(assigned\) at escape_because.go:47$" "from c \(interface-converted\) at escape_because.go:48$" "from ~r1 \(return\) at escape_because.go:48$" return c // "return" // ERROR "c escapes to heap$" "from ~r1 \(return\) at escape_because.go:48$" } diff --git a/test/escape_param.go b/test/escape_param.go index dff13b6f7c..175a4f03dd 100644 --- a/test/escape_param.go +++ b/test/escape_param.go @@ -424,3 +424,18 @@ func h(x *Node) { // ERROR "leaking param: x" Sink = g(y) f(y) } + +// interface(in) -> out +// See also issue 29353. + +// Convert to a non-direct interface, require an allocation and +// copy x to heap (not to result). +func param14a(x [4]*int) interface{} { // ERROR "leaking param: x$" + return x // ERROR "x escapes to heap" +} + +// Convert to a direct interface, does not need an allocation. +// So x only leaks to result. +func param14b(x *int) interface{} { // ERROR "leaking param: x to result ~r1 level=0" + return x // ERROR "x escapes to heap" +} -- GitLab From 2ef8abb41f2565e38e520c18773308b3cf005af6 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Thu, 21 Feb 2019 07:53:15 +0000 Subject: [PATCH 0054/1679] cmd/internal/obj/arm64: fix the bug assembling TSTW Current assembler reports error when it assembles "TSTW $1689262177517664, R3", but go1.11 was building fine. Fixes #30334 Change-Id: I9c16d36717cd05df2134e8eb5b17edc385aff0a9 Reviewed-on: https://go-review.googlesource.com/c/163259 Run-TryBot: Ben Shi TryBot-Result: Gobot Gobot Reviewed-by: Ben Shi --- src/cmd/asm/internal/asm/testdata/arm64.s | 12 ++++++++++++ src/cmd/internal/obj/arm64/asm7.go | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index d025543e6d..b54fd86045 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -261,6 +261,18 @@ TEXT foo(SB), DUPOK|NOSPLIT, $-8 ORRW $0x1b000, R2, R3 // ORRW $110592, R2, R3 // 1b0096523b00a07243001b2a TSTW $0x500000, R1 // TSTW $5242880, R1 // 1b0aa0523f001b6a TSTW $0xff00ff, R1 // TSTW $16711935, R1 // 3f9c0072 + TSTW $0x60060, R5 // TSTW $393312, R5 // 1b0c8052db00a072bf001b6a + TSTW $0x6006000060060, R5 // TSTW $1689262177517664, R5 // 1b0c8052db00a072bf001b6a + ANDW $0x6006000060060, R5 // ANDW $1689262177517664, R5 // 1b0c8052db00a072a5001b0a + ANDSW $0x6006000060060, R5 // ANDSW $1689262177517664, R5 // 1b0c8052db00a072a5001b6a + EORW $0x6006000060060, R5 // EORW $1689262177517664, R5 // 1b0c8052db00a072a5001b4a + ORRW $0x6006000060060, R5 // ORRW $1689262177517664, R5 // 1b0c8052db00a072a5001b2a + BICW $0x6006000060060, R5 // BICW $1689262177517664, R5 // 1b0c8052db00a072a5003b0a + EONW $0x6006000060060, R5 // EONW $1689262177517664, R5 // 1b0c8052db00a072a5003b4a + ORNW $0x6006000060060, R5 // ORNW $1689262177517664, R5 // 1b0c8052db00a072a5003b2a + BICSW $0x6006000060060, R5 // BICSW $1689262177517664, R5 // 1b0c8052db00a072a5003b6a + ADDW $0x60060, R2 // ADDW $393312, R2 // 4280011142804111 + CMPW $0x60060, R2 // CMPW $393312, R2 // 1b0c8052db00a0725f001b6b AND $8, R0, RSP // 1f007d92 ORR $8, R0, RSP // 1f007db2 diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 093b222898..cbe5796234 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -2986,7 +2986,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { num := uint8(0) cls := oclass(&p.From) if isADDWop(p.As) { - if (cls != C_LCON) && (cls != C_ADDCON2) { + if !cmp(C_LCON, cls) { c.ctxt.Diag("illegal combination: %v", p) } num = c.omovlconst(AMOVW, p, &p.From, REGTMP, os[:]) @@ -3271,7 +3271,7 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { num := uint8(0) cls := oclass(&p.From) if isANDWop(p.As) { - if (cls != C_LCON) && (cls != C_ADDCON) { + if !cmp(C_LCON, cls) { c.ctxt.Diag("illegal combination: %v", p) } num = c.omovlconst(AMOVW, p, &p.From, REGTMP, os[:]) -- GitLab From 56e4b0b3a2520015cb1d38b5bf67820e75e16f83 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 09:20:42 -0500 Subject: [PATCH 0055/1679] misc/android: add build constraints on files intended to be built by filename only Updates #30228 Change-Id: I91a763d94de935d9102d927b5cefee564bbf049b Reviewed-on: https://go-review.googlesource.com/c/163208 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/cleaner.go | 2 ++ misc/android/go_android_exec.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/misc/android/cleaner.go b/misc/android/cleaner.go index dafb162697..edbbdcd0ef 100644 --- a/misc/android/cleaner.go +++ b/misc/android/cleaner.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build ignore + // Cleaner removes anything from /data/local/tmp/goroot not on a builtin list. // Used by androidtest.bash. package main diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index c6270872c7..2376e29796 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build ignore + // This program can be used as go_android_GOARCH_exec by the Go tool. // It executes binaries on an android device using adb. package main -- GitLab From b35dacaac57b039205d9b07ea24098e2c3fcb12e Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Wed, 13 Feb 2019 03:37:57 -0500 Subject: [PATCH 0056/1679] crypto/rc4: remove false guarantees from Reset docs and deprecate it Nothing in Go can truly guarantee a key will be gone from memory (see #21865), so remove that claim. That makes Reset useless, because unlike most Reset methods it doesn't restore the original value state, so deprecate it. Change-Id: I6bb0f7f94c7e6dd4c5ac19761bc8e5df1f9ec618 Reviewed-on: https://go-review.googlesource.com/c/162297 Reviewed-by: Brad Fitzpatrick --- src/crypto/rc4/rc4.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/crypto/rc4/rc4.go b/src/crypto/rc4/rc4.go index d5e6ebcd71..c2df0db2dc 100644 --- a/src/crypto/rc4/rc4.go +++ b/src/crypto/rc4/rc4.go @@ -45,8 +45,10 @@ func NewCipher(key []byte) (*Cipher, error) { return &c, nil } -// Reset zeros the key data so that it will no longer appear in the -// process's memory. +// Reset zeros the key data and makes the Cipher unusable. +// +// Deprecated: Reset can't guarantee that the key will be entirely removed from +// the process's memory. func (c *Cipher) Reset() { for i := range c.s { c.s[i] = 0 -- GitLab From 8ea27e117fffbb14ef3605a641444b79e9bd6c9e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 09:06:09 -0500 Subject: [PATCH 0057/1679] misc/cgo/errors: fix tests in module mode Updates #30228 Change-Id: I84bc705591bdb3da0106404b24353251939355b8 Reviewed-on: https://go-review.googlesource.com/c/163209 Reviewed-by: Jay Conrod --- misc/cgo/errors/errors_test.go | 2 +- misc/cgo/errors/ptr_test.go | 9 +++++++-- misc/cgo/errors/{src => testdata}/err1.go | 0 misc/cgo/errors/{src => testdata}/err2.go | 0 misc/cgo/errors/{src => testdata}/err3.go | 0 misc/cgo/errors/{src => testdata}/err4.go | 0 misc/cgo/errors/{src => testdata}/issue11097a.go | 0 misc/cgo/errors/{src => testdata}/issue11097b.go | 0 misc/cgo/errors/{src => testdata}/issue13129.go | 0 misc/cgo/errors/{src => testdata}/issue13423.go | 0 misc/cgo/errors/{src => testdata}/issue13467.go | 0 misc/cgo/errors/{src => testdata}/issue13635.go | 0 misc/cgo/errors/{src => testdata}/issue13830.go | 0 misc/cgo/errors/{src => testdata}/issue14669.go | 0 misc/cgo/errors/{src => testdata}/issue16116.go | 0 misc/cgo/errors/{src => testdata}/issue16591.go | 0 misc/cgo/errors/{src => testdata}/issue18452.go | 0 misc/cgo/errors/{src => testdata}/issue18889.go | 0 misc/cgo/errors/{src => testdata}/issue26745.go | 0 misc/cgo/errors/{src => testdata}/issue28069.go | 0 misc/cgo/errors/{src => testdata}/issue28721.go | 0 misc/cgo/errors/{src => testdata}/issue7757.go | 0 misc/cgo/errors/{src => testdata}/issue8442.go | 0 misc/cgo/errors/{src => testdata}/long_double_size.go | 0 misc/cgo/errors/{src => testdata}/malloc.go | 0 25 files changed, 8 insertions(+), 3 deletions(-) rename misc/cgo/errors/{src => testdata}/err1.go (100%) rename misc/cgo/errors/{src => testdata}/err2.go (100%) rename misc/cgo/errors/{src => testdata}/err3.go (100%) rename misc/cgo/errors/{src => testdata}/err4.go (100%) rename misc/cgo/errors/{src => testdata}/issue11097a.go (100%) rename misc/cgo/errors/{src => testdata}/issue11097b.go (100%) rename misc/cgo/errors/{src => testdata}/issue13129.go (100%) rename misc/cgo/errors/{src => testdata}/issue13423.go (100%) rename misc/cgo/errors/{src => testdata}/issue13467.go (100%) rename misc/cgo/errors/{src => testdata}/issue13635.go (100%) rename misc/cgo/errors/{src => testdata}/issue13830.go (100%) rename misc/cgo/errors/{src => testdata}/issue14669.go (100%) rename misc/cgo/errors/{src => testdata}/issue16116.go (100%) rename misc/cgo/errors/{src => testdata}/issue16591.go (100%) rename misc/cgo/errors/{src => testdata}/issue18452.go (100%) rename misc/cgo/errors/{src => testdata}/issue18889.go (100%) rename misc/cgo/errors/{src => testdata}/issue26745.go (100%) rename misc/cgo/errors/{src => testdata}/issue28069.go (100%) rename misc/cgo/errors/{src => testdata}/issue28721.go (100%) rename misc/cgo/errors/{src => testdata}/issue7757.go (100%) rename misc/cgo/errors/{src => testdata}/issue8442.go (100%) rename misc/cgo/errors/{src => testdata}/long_double_size.go (100%) rename misc/cgo/errors/{src => testdata}/malloc.go (100%) diff --git a/misc/cgo/errors/errors_test.go b/misc/cgo/errors/errors_test.go index 59054f4703..f727158c48 100644 --- a/misc/cgo/errors/errors_test.go +++ b/misc/cgo/errors/errors_test.go @@ -18,7 +18,7 @@ import ( ) func path(file string) string { - return filepath.Join("src", file) + return filepath.Join("testdata", file) } func check(t *testing.T, file string) { diff --git a/misc/cgo/errors/ptr_test.go b/misc/cgo/errors/ptr_test.go index 254671f179..629f4c9226 100644 --- a/misc/cgo/errors/ptr_test.go +++ b/misc/cgo/errors/ptr_test.go @@ -444,8 +444,8 @@ func testOne(t *testing.T, pt ptrTest) { } defer os.RemoveAll(gopath) - src := filepath.Join(gopath, "src") - if err := os.Mkdir(src, 0777); err != nil { + src := filepath.Join(gopath, "src", "ptrtest") + if err := os.MkdirAll(src, 0777); err != nil { t.Fatal(err) } @@ -490,6 +490,11 @@ func testOne(t *testing.T, pt ptrTest) { } } + gomod := fmt.Sprintf("module %s\n", filepath.Base(src)) + if err := ioutil.WriteFile(filepath.Join(src, "go.mod"), []byte(gomod), 0666); err != nil { + t.Fatalf("writing go.mod: %v", err) + } + args := func(cmd *exec.Cmd) string { return strings.Join(cmd.Args, " ") } diff --git a/misc/cgo/errors/src/err1.go b/misc/cgo/errors/testdata/err1.go similarity index 100% rename from misc/cgo/errors/src/err1.go rename to misc/cgo/errors/testdata/err1.go diff --git a/misc/cgo/errors/src/err2.go b/misc/cgo/errors/testdata/err2.go similarity index 100% rename from misc/cgo/errors/src/err2.go rename to misc/cgo/errors/testdata/err2.go diff --git a/misc/cgo/errors/src/err3.go b/misc/cgo/errors/testdata/err3.go similarity index 100% rename from misc/cgo/errors/src/err3.go rename to misc/cgo/errors/testdata/err3.go diff --git a/misc/cgo/errors/src/err4.go b/misc/cgo/errors/testdata/err4.go similarity index 100% rename from misc/cgo/errors/src/err4.go rename to misc/cgo/errors/testdata/err4.go diff --git a/misc/cgo/errors/src/issue11097a.go b/misc/cgo/errors/testdata/issue11097a.go similarity index 100% rename from misc/cgo/errors/src/issue11097a.go rename to misc/cgo/errors/testdata/issue11097a.go diff --git a/misc/cgo/errors/src/issue11097b.go b/misc/cgo/errors/testdata/issue11097b.go similarity index 100% rename from misc/cgo/errors/src/issue11097b.go rename to misc/cgo/errors/testdata/issue11097b.go diff --git a/misc/cgo/errors/src/issue13129.go b/misc/cgo/errors/testdata/issue13129.go similarity index 100% rename from misc/cgo/errors/src/issue13129.go rename to misc/cgo/errors/testdata/issue13129.go diff --git a/misc/cgo/errors/src/issue13423.go b/misc/cgo/errors/testdata/issue13423.go similarity index 100% rename from misc/cgo/errors/src/issue13423.go rename to misc/cgo/errors/testdata/issue13423.go diff --git a/misc/cgo/errors/src/issue13467.go b/misc/cgo/errors/testdata/issue13467.go similarity index 100% rename from misc/cgo/errors/src/issue13467.go rename to misc/cgo/errors/testdata/issue13467.go diff --git a/misc/cgo/errors/src/issue13635.go b/misc/cgo/errors/testdata/issue13635.go similarity index 100% rename from misc/cgo/errors/src/issue13635.go rename to misc/cgo/errors/testdata/issue13635.go diff --git a/misc/cgo/errors/src/issue13830.go b/misc/cgo/errors/testdata/issue13830.go similarity index 100% rename from misc/cgo/errors/src/issue13830.go rename to misc/cgo/errors/testdata/issue13830.go diff --git a/misc/cgo/errors/src/issue14669.go b/misc/cgo/errors/testdata/issue14669.go similarity index 100% rename from misc/cgo/errors/src/issue14669.go rename to misc/cgo/errors/testdata/issue14669.go diff --git a/misc/cgo/errors/src/issue16116.go b/misc/cgo/errors/testdata/issue16116.go similarity index 100% rename from misc/cgo/errors/src/issue16116.go rename to misc/cgo/errors/testdata/issue16116.go diff --git a/misc/cgo/errors/src/issue16591.go b/misc/cgo/errors/testdata/issue16591.go similarity index 100% rename from misc/cgo/errors/src/issue16591.go rename to misc/cgo/errors/testdata/issue16591.go diff --git a/misc/cgo/errors/src/issue18452.go b/misc/cgo/errors/testdata/issue18452.go similarity index 100% rename from misc/cgo/errors/src/issue18452.go rename to misc/cgo/errors/testdata/issue18452.go diff --git a/misc/cgo/errors/src/issue18889.go b/misc/cgo/errors/testdata/issue18889.go similarity index 100% rename from misc/cgo/errors/src/issue18889.go rename to misc/cgo/errors/testdata/issue18889.go diff --git a/misc/cgo/errors/src/issue26745.go b/misc/cgo/errors/testdata/issue26745.go similarity index 100% rename from misc/cgo/errors/src/issue26745.go rename to misc/cgo/errors/testdata/issue26745.go diff --git a/misc/cgo/errors/src/issue28069.go b/misc/cgo/errors/testdata/issue28069.go similarity index 100% rename from misc/cgo/errors/src/issue28069.go rename to misc/cgo/errors/testdata/issue28069.go diff --git a/misc/cgo/errors/src/issue28721.go b/misc/cgo/errors/testdata/issue28721.go similarity index 100% rename from misc/cgo/errors/src/issue28721.go rename to misc/cgo/errors/testdata/issue28721.go diff --git a/misc/cgo/errors/src/issue7757.go b/misc/cgo/errors/testdata/issue7757.go similarity index 100% rename from misc/cgo/errors/src/issue7757.go rename to misc/cgo/errors/testdata/issue7757.go diff --git a/misc/cgo/errors/src/issue8442.go b/misc/cgo/errors/testdata/issue8442.go similarity index 100% rename from misc/cgo/errors/src/issue8442.go rename to misc/cgo/errors/testdata/issue8442.go diff --git a/misc/cgo/errors/src/long_double_size.go b/misc/cgo/errors/testdata/long_double_size.go similarity index 100% rename from misc/cgo/errors/src/long_double_size.go rename to misc/cgo/errors/testdata/long_double_size.go diff --git a/misc/cgo/errors/src/malloc.go b/misc/cgo/errors/testdata/malloc.go similarity index 100% rename from misc/cgo/errors/src/malloc.go rename to misc/cgo/errors/testdata/malloc.go -- GitLab From 27b9571de800c05a41081ea80cd934e48e0a8f70 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 22 Feb 2019 18:35:58 +0100 Subject: [PATCH 0058/1679] androidtest.bash: wait for device to be ready before using it Updates #23824 Change-Id: I265e3f40192a0a4bf54f608d9408ba0cfef2b69c Reviewed-on: https://go-review.googlesource.com/c/163457 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick --- src/androidtest.bash | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/androidtest.bash b/src/androidtest.bash index e43b89c0dc..a3784bc454 100755 --- a/src/androidtest.bash +++ b/src/androidtest.bash @@ -69,6 +69,12 @@ cp -a "${GOROOT}/test" "${FAKE_GOROOT}/" cp -a "${GOROOT}/lib" "${FAKE_GOROOT}/" cp -a "${pkgdir}" "${FAKE_GOROOT}/pkg/" +# In case we're booting a device or emulator alongside androidtest.bash +# wait for it to be ready. adb wait-for-device is not enough, we have +# wait for sys.boot_completed. +echo '# Waiting for android device to be ready' +adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' + echo '# Syncing test files to android device' adb $GOANDROID_ADB_FLAGS shell mkdir -p /data/local/tmp/goroot time adb $GOANDROID_ADB_FLAGS sync data &> /dev/null -- GitLab From 13d9a29060f5fb28022003e006a92b22a75c650e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 12:34:27 -0500 Subject: [PATCH 0059/1679] misc/cgo/testcarchive: fix tests in module mode Updates #30228 Change-Id: I830e3c83416b2e5744f30d1a903a74c50462716b Reviewed-on: https://go-review.googlesource.com/c/163210 Run-TryBot: Bryan C. Mills Reviewed-by: Ian Lance Taylor Reviewed-by: Jay Conrod --- misc/cgo/testcarchive/carchive_test.go | 134 +++++++++--------- misc/cgo/testcarchive/overlaydir_test.go | 81 +++++++++++ .../{src => testdata}/libgo/libgo.go | 2 +- .../{src => testdata}/libgo2/libgo2.go | 0 .../{src => testdata}/libgo3/libgo3.go | 0 .../{src => testdata}/libgo4/libgo4.go | 0 .../{src => testdata}/libgo6/sigprof.go | 0 misc/cgo/testcarchive/{ => testdata}/main.c | 0 misc/cgo/testcarchive/{ => testdata}/main2.c | 0 misc/cgo/testcarchive/{ => testdata}/main3.c | 0 misc/cgo/testcarchive/{ => testdata}/main4.c | 0 misc/cgo/testcarchive/{ => testdata}/main5.c | 0 misc/cgo/testcarchive/{ => testdata}/main6.c | 0 .../testcarchive/{ => testdata}/main_unix.c | 0 .../{ => testdata}/main_windows.c | 0 .../cgo/testcarchive/{src => testdata}/p/p.go | 0 src/cmd/dist/test.go | 2 +- 17 files changed, 150 insertions(+), 69 deletions(-) create mode 100644 misc/cgo/testcarchive/overlaydir_test.go rename misc/cgo/testcarchive/{src => testdata}/libgo/libgo.go (97%) rename misc/cgo/testcarchive/{src => testdata}/libgo2/libgo2.go (100%) rename misc/cgo/testcarchive/{src => testdata}/libgo3/libgo3.go (100%) rename misc/cgo/testcarchive/{src => testdata}/libgo4/libgo4.go (100%) rename misc/cgo/testcarchive/{src => testdata}/libgo6/sigprof.go (100%) rename misc/cgo/testcarchive/{ => testdata}/main.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main2.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main3.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main4.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main5.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main6.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main_unix.c (100%) rename misc/cgo/testcarchive/{ => testdata}/main_windows.c (100%) rename misc/cgo/testcarchive/{src => testdata}/p/p.go (100%) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index 457ac0db09..d6b35fb9ec 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -10,6 +10,7 @@ import ( "debug/elf" "fmt" "io/ioutil" + "log" "os" "os/exec" "path/filepath" @@ -28,16 +29,41 @@ var bin []string // C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)). var cc []string -// An environment with GOPATH=$(pwd). -var gopathEnv []string - // ".exe" on Windows. var exeSuffix string -var GOOS, GOARCH string +var GOOS, GOARCH, GOPATH string var libgodir string -func init() { +func TestMain(m *testing.M) { + log.SetFlags(log.Lshortfile) + os.Exit(testMain(m)) +} + +func testMain(m *testing.M) int { + // We need a writable GOPATH in which to run the tests. + // Construct one in a temporary directory. + var err error + GOPATH, err = ioutil.TempDir("", "carchive_test") + if err != nil { + log.Panic(err) + } + defer os.RemoveAll(GOPATH) + os.Setenv("GOPATH", GOPATH) + + // Copy testdata into GOPATH/src/testarchive, along with a go.mod file + // declaring the same path. + modRoot := filepath.Join(GOPATH, "src", "testcarchive") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := os.Chdir(modRoot); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil { + log.Panic(err) + } + GOOS = goEnv("GOOS") GOARCH = goEnv("GOARCH") bin = cmdToRun("./testp") @@ -83,50 +109,36 @@ func init() { // TODO(crawshaw): can we do better? cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...) } - libgodir = GOOS + "_" + GOARCH + libbase := GOOS + "_" + GOARCH if runtime.Compiler == "gccgo" { - libgodir = "gccgo_" + libgodir + "_fPIC" + libbase = "gccgo_" + libgodir + "_fPIC" } else { switch GOOS { case "darwin": if GOARCH == "arm" || GOARCH == "arm64" { - libgodir += "_shared" + libbase += "_shared" } case "dragonfly", "freebsd", "linux", "netbsd", "openbsd", "solaris": - libgodir += "_shared" - } - } - cc = append(cc, "-I", filepath.Join("pkg", libgodir)) - - // Build an environment with GOPATH=$(pwd) - env := os.Environ() - var n []string - for _, e := range env { - if !strings.HasPrefix(e, "GOPATH=") { - n = append(n, e) + libbase += "_shared" } } - dir, err := os.Getwd() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - n = append(n, "GOPATH="+dir) - gopathEnv = n + libgodir = filepath.Join(GOPATH, "pkg", libbase, "testcarchive") + cc = append(cc, "-I", libgodir) if GOOS == "windows" { exeSuffix = ".exe" } + + return m.Run() } func goEnv(key string) string { out, err := exec.Command("go", "env", key).Output() if err != nil { - fmt.Fprintf(os.Stderr, "go env %s failed:\n%s\n", key, err) if ee, ok := err.(*exec.ExitError); ok { fmt.Fprintf(os.Stderr, "%s", ee.Stderr) } - os.Exit(2) + log.Panicf("go env %s failed:\n%s\n", key, err) } return strings.TrimSpace(string(out)) } @@ -143,7 +155,6 @@ func cmdToRun(name string) []string { func testInstall(t *testing.T, exe, libgoa, libgoh string, buildcmd ...string) { t.Helper() cmd := exec.Command(buildcmd[0], buildcmd[1:]...) - cmd.Env = gopathEnv t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) @@ -204,7 +215,7 @@ func checkLineComments(t *testing.T, hdrname string) { } func TestInstall(t *testing.T) { - defer os.RemoveAll("pkg") + defer os.RemoveAll(filepath.Join(GOPATH, "pkg")) libgoa := "libgo.a" if runtime.Compiler == "gccgo" { @@ -212,17 +223,17 @@ func TestInstall(t *testing.T) { } testInstall(t, "./testp1"+exeSuffix, - filepath.Join("pkg", libgodir, libgoa), - filepath.Join("pkg", libgodir, "libgo.h"), - "go", "install", "-i", "-buildmode=c-archive", "libgo") + filepath.Join(libgodir, libgoa), + filepath.Join(libgodir, "libgo.h"), + "go", "install", "-i", "-buildmode=c-archive", "./libgo") // Test building libgo other than installing it. // Header files are now present. testInstall(t, "./testp2"+exeSuffix, "libgo.a", "libgo.h", - "go", "build", "-buildmode=c-archive", filepath.Join("src", "libgo", "libgo.go")) + "go", "build", "-buildmode=c-archive", filepath.Join(".", "libgo", "libgo.go")) testInstall(t, "./testp3"+exeSuffix, "libgo.a", "libgo.h", - "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "libgo") + "go", "build", "-buildmode=c-archive", "-o", "libgo.a", "./libgo") } func TestEarlySignalHandler(t *testing.T) { @@ -240,11 +251,10 @@ func TestEarlySignalHandler(t *testing.T) { os.Remove("libgo2.a") os.Remove("libgo2.h") os.Remove("testp") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -273,11 +283,10 @@ func TestSignalForwarding(t *testing.T) { os.Remove("libgo2.a") os.Remove("libgo2.h") os.Remove("testp") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -317,11 +326,10 @@ func TestSignalForwardingExternal(t *testing.T) { os.Remove("libgo2.a") os.Remove("libgo2.h") os.Remove("testp") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "libgo2") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo2.a", "./libgo2") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -433,11 +441,10 @@ func TestOsSignal(t *testing.T) { os.Remove("libgo3.a") os.Remove("libgo3.h") os.Remove("testp") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "libgo3") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo3.a", "./libgo3") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -469,11 +476,10 @@ func TestSigaltstack(t *testing.T) { os.Remove("libgo4.a") os.Remove("libgo4.h") os.Remove("testp") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "libgo4") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo4.a", "./libgo4") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -517,7 +523,7 @@ func TestExtar(t *testing.T) { os.Remove("libgo4.h") os.Remove("testar") os.Remove("testar.ran") - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() os.Remove("testar") @@ -530,8 +536,7 @@ func TestExtar(t *testing.T) { t.Fatal(err) } - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "libgo4") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-ldflags=-extar="+filepath.Join(dir, "testar"), "-o", "libgo4.a", "./libgo4") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -555,11 +560,10 @@ func TestPIE(t *testing.T) { defer func() { os.Remove("testp" + exeSuffix) - os.RemoveAll("pkg") + os.RemoveAll(filepath.Join(GOPATH, "pkg")) }() - cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "libgo") - cmd.Env = gopathEnv + cmd := exec.Command("go", "install", "-i", "-buildmode=c-archive", "./libgo") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -570,7 +574,7 @@ func TestPIE(t *testing.T) { libgoa = "liblibgo.a" } - ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join("pkg", libgodir, libgoa)) + ccArgs := append(cc, "-fPIE", "-pie", "-o", "testp"+exeSuffix, "main.c", "main_unix.c", filepath.Join(libgodir, libgoa)) if runtime.Compiler == "gccgo" { ccArgs = append(ccArgs, "-lgo") } @@ -643,8 +647,7 @@ func TestSIGPROF(t *testing.T) { os.Remove("libgo6.h") }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "libgo6") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-o", "libgo6.a", "./libgo6") if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) @@ -683,8 +686,7 @@ func TestCompileWithoutShared(t *testing.T) { os.Remove("libgo2.h") }() - cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "libgo2") - cmd.Env = gopathEnv + cmd := exec.Command("go", "build", "-buildmode=c-archive", "-gcflags=-shared=false", "-o", "libgo2.a", "./libgo2") t.Log(cmd.Args) out, err := cmd.CombinedOutput() t.Logf("%s", out) @@ -732,15 +734,14 @@ func TestCompileWithoutShared(t *testing.T) { // Test that installing a second time recreates the header files. func TestCachedInstall(t *testing.T) { - defer os.RemoveAll("pkg") + defer os.RemoveAll(filepath.Join(GOPATH, "pkg")) - h1 := filepath.Join("pkg", libgodir, "libgo.h") - h2 := filepath.Join("pkg", libgodir, "p.h") + h1 := filepath.Join(libgodir, "libgo.h") + h2 := filepath.Join(libgodir, "p.h") - buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "libgo"} + buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "./libgo"} cmd := exec.Command(buildcmd[0], buildcmd[1:]...) - cmd.Env = gopathEnv t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) @@ -762,7 +763,6 @@ func TestCachedInstall(t *testing.T) { } cmd = exec.Command(buildcmd[0], buildcmd[1:]...) - cmd.Env = gopathEnv t.Log(buildcmd) if out, err := cmd.CombinedOutput(); err != nil { t.Logf("%s", out) diff --git a/misc/cgo/testcarchive/overlaydir_test.go b/misc/cgo/testcarchive/overlaydir_test.go new file mode 100644 index 0000000000..68878e4c66 --- /dev/null +++ b/misc/cgo/testcarchive/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 carchive_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testcarchive/src/libgo/libgo.go b/misc/cgo/testcarchive/testdata/libgo/libgo.go similarity index 97% rename from misc/cgo/testcarchive/src/libgo/libgo.go rename to misc/cgo/testcarchive/testdata/libgo/libgo.go index 45958a546c..37b30c1463 100644 --- a/misc/cgo/testcarchive/src/libgo/libgo.go +++ b/misc/cgo/testcarchive/testdata/libgo/libgo.go @@ -10,7 +10,7 @@ import ( "syscall" "time" - _ "p" + _ "testcarchive/p" ) import "C" diff --git a/misc/cgo/testcarchive/src/libgo2/libgo2.go b/misc/cgo/testcarchive/testdata/libgo2/libgo2.go similarity index 100% rename from misc/cgo/testcarchive/src/libgo2/libgo2.go rename to misc/cgo/testcarchive/testdata/libgo2/libgo2.go diff --git a/misc/cgo/testcarchive/src/libgo3/libgo3.go b/misc/cgo/testcarchive/testdata/libgo3/libgo3.go similarity index 100% rename from misc/cgo/testcarchive/src/libgo3/libgo3.go rename to misc/cgo/testcarchive/testdata/libgo3/libgo3.go diff --git a/misc/cgo/testcarchive/src/libgo4/libgo4.go b/misc/cgo/testcarchive/testdata/libgo4/libgo4.go similarity index 100% rename from misc/cgo/testcarchive/src/libgo4/libgo4.go rename to misc/cgo/testcarchive/testdata/libgo4/libgo4.go diff --git a/misc/cgo/testcarchive/src/libgo6/sigprof.go b/misc/cgo/testcarchive/testdata/libgo6/sigprof.go similarity index 100% rename from misc/cgo/testcarchive/src/libgo6/sigprof.go rename to misc/cgo/testcarchive/testdata/libgo6/sigprof.go diff --git a/misc/cgo/testcarchive/main.c b/misc/cgo/testcarchive/testdata/main.c similarity index 100% rename from misc/cgo/testcarchive/main.c rename to misc/cgo/testcarchive/testdata/main.c diff --git a/misc/cgo/testcarchive/main2.c b/misc/cgo/testcarchive/testdata/main2.c similarity index 100% rename from misc/cgo/testcarchive/main2.c rename to misc/cgo/testcarchive/testdata/main2.c diff --git a/misc/cgo/testcarchive/main3.c b/misc/cgo/testcarchive/testdata/main3.c similarity index 100% rename from misc/cgo/testcarchive/main3.c rename to misc/cgo/testcarchive/testdata/main3.c diff --git a/misc/cgo/testcarchive/main4.c b/misc/cgo/testcarchive/testdata/main4.c similarity index 100% rename from misc/cgo/testcarchive/main4.c rename to misc/cgo/testcarchive/testdata/main4.c diff --git a/misc/cgo/testcarchive/main5.c b/misc/cgo/testcarchive/testdata/main5.c similarity index 100% rename from misc/cgo/testcarchive/main5.c rename to misc/cgo/testcarchive/testdata/main5.c diff --git a/misc/cgo/testcarchive/main6.c b/misc/cgo/testcarchive/testdata/main6.c similarity index 100% rename from misc/cgo/testcarchive/main6.c rename to misc/cgo/testcarchive/testdata/main6.c diff --git a/misc/cgo/testcarchive/main_unix.c b/misc/cgo/testcarchive/testdata/main_unix.c similarity index 100% rename from misc/cgo/testcarchive/main_unix.c rename to misc/cgo/testcarchive/testdata/main_unix.c diff --git a/misc/cgo/testcarchive/main_windows.c b/misc/cgo/testcarchive/testdata/main_windows.c similarity index 100% rename from misc/cgo/testcarchive/main_windows.c rename to misc/cgo/testcarchive/testdata/main_windows.c diff --git a/misc/cgo/testcarchive/src/p/p.go b/misc/cgo/testcarchive/testdata/p/p.go similarity index 100% rename from misc/cgo/testcarchive/src/p/p.go rename to misc/cgo/testcarchive/testdata/p/p.go diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 74cee8f421..30b4468b08 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -692,7 +692,7 @@ func (t *tester) registerTests() { }) } if t.supportedBuildmode("c-archive") { - t.registerHostTest("testcarchive", "../misc/cgo/testcarchive", "misc/cgo/testcarchive", "carchive_test.go") + t.registerHostTest("testcarchive", "../misc/cgo/testcarchive", "misc/cgo/testcarchive", ".") } if t.supportedBuildmode("c-shared") { t.registerHostTest("testcshared", "../misc/cgo/testcshared", "misc/cgo/testcshared", "cshared_test.go") -- GitLab From ffde2ddb95eb265b9031fbb24a7faa2b1d876630 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 14:17:19 -0500 Subject: [PATCH 0060/1679] misc/cgo/testshared: fix tests in module mode Updates #30228 Change-Id: I5cc739eb9fdfb648ec45e350d43d4cb02e450553 Reviewed-on: https://go-review.googlesource.com/c/163211 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- misc/cgo/testshared/overlaydir_test.go | 81 +++++ misc/cgo/testshared/shared_test.go | 339 ++++++++++-------- .../testshared/{src => testdata}/dep2/dep2.go | 2 +- .../testshared/{src => testdata}/dep3/dep3.go | 4 +- .../{src => testdata}/depBase/asm.s | 0 .../{src => testdata}/depBase/dep.go | 0 .../{src => testdata}/depBase/gccgo.go | 0 .../{src => testdata}/depBase/stubs.go | 0 .../{src => testdata}/division/division.go | 0 .../testshared/{src => testdata}/exe/exe.go | 2 +- .../testshared/{src => testdata}/exe2/exe2.go | 2 +- .../testshared/{src => testdata}/exe3/exe3.go | 2 +- .../{src => testdata}/execgo/exe.go | 0 .../{src => testdata}/explicit/explicit.go | 2 +- .../{src => testdata}/global/main.go | 2 +- .../{src => testdata}/globallib/global.go | 0 .../{src => testdata}/iface/main.go | 4 +- .../testshared/{src => testdata}/iface_a/a.go | 2 +- .../testshared/{src => testdata}/iface_b/b.go | 2 +- .../testshared/{src => testdata}/iface_i/i.go | 0 .../{src => testdata}/implicit/implicit.go | 0 .../implicitcmd/implicitcmd.go | 4 +- .../{src => testdata}/issue25065/a.go | 0 .../{src => testdata}/trivial/trivial.go | 0 24 files changed, 276 insertions(+), 172 deletions(-) create mode 100644 misc/cgo/testshared/overlaydir_test.go rename misc/cgo/testshared/{src => testdata}/dep2/dep2.go (82%) rename misc/cgo/testshared/{src => testdata}/dep3/dep3.go (91%) rename misc/cgo/testshared/{src => testdata}/depBase/asm.s (100%) rename misc/cgo/testshared/{src => testdata}/depBase/dep.go (100%) rename misc/cgo/testshared/{src => testdata}/depBase/gccgo.go (100%) rename misc/cgo/testshared/{src => testdata}/depBase/stubs.go (100%) rename misc/cgo/testshared/{src => testdata}/division/division.go (100%) rename misc/cgo/testshared/{src => testdata}/exe/exe.go (97%) rename misc/cgo/testshared/{src => testdata}/exe2/exe2.go (77%) rename misc/cgo/testshared/{src => testdata}/exe3/exe3.go (62%) rename misc/cgo/testshared/{src => testdata}/execgo/exe.go (100%) rename misc/cgo/testshared/{src => testdata}/explicit/explicit.go (74%) rename misc/cgo/testshared/{src => testdata}/global/main.go (98%) rename misc/cgo/testshared/{src => testdata}/globallib/global.go (100%) rename misc/cgo/testshared/{src => testdata}/iface/main.go (85%) rename misc/cgo/testshared/{src => testdata}/iface_a/a.go (91%) rename misc/cgo/testshared/{src => testdata}/iface_b/b.go (91%) rename misc/cgo/testshared/{src => testdata}/iface_i/i.go (100%) rename misc/cgo/testshared/{src => testdata}/implicit/implicit.go (100%) rename misc/cgo/testshared/{src => testdata}/implicitcmd/implicitcmd.go (63%) rename misc/cgo/testshared/{src => testdata}/issue25065/a.go (100%) rename misc/cgo/testshared/{src => testdata}/trivial/trivial.go (100%) diff --git a/misc/cgo/testshared/overlaydir_test.go b/misc/cgo/testshared/overlaydir_test.go new file mode 100644 index 0000000000..68be056256 --- /dev/null +++ b/misc/cgo/testshared/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 shared_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index 41a24efe22..9a8c398976 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -44,31 +44,35 @@ func run(t *testing.T, msg string, args ...string) { // goCmd invokes the go tool with the installsuffix set up by TestMain. It calls // t.Fatalf if the command fails. -func goCmd(t *testing.T, args ...string) { +func goCmd(t *testing.T, args ...string) string { newargs := []string{args[0], "-installsuffix=" + suffix} if testing.Verbose() { newargs = append(newargs, "-x") } newargs = append(newargs, args[1:]...) c := exec.Command("go", newargs...) + + stderr := new(strings.Builder) var output []byte var err error if testing.Verbose() { - fmt.Printf("+ go %s\n", strings.Join(newargs, " ")) - c.Stdout = os.Stdout + fmt.Printf("+ go %s\n", strings.Join(args, " ")) c.Stderr = os.Stderr - err = c.Run() - output = []byte("(output above)") + stderr.WriteString("(output above)") } else { - output, err = c.CombinedOutput() + c.Stderr = stderr } + output, err = c.Output() + if err != nil { if t != nil { - t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output) + t.Helper() + t.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr) } else { - log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, output) + log.Fatalf("executing %s failed %v:\n%s", strings.Join(c.Args, " "), err, stderr) } } + return string(bytes.TrimSpace(output)) } // TestMain calls testMain so that the latter can use defer (TestMain exits with os.Exit). @@ -105,47 +109,32 @@ func testMain(m *testing.M) (int, error) { // Some tests need to edit the source in GOPATH, so copy this directory to a // temporary directory and chdir to that. - scratchDir, err := ioutil.TempDir("", "testshared") + gopath, err := ioutil.TempDir("", "testshared") if err != nil { return 0, fmt.Errorf("TempDir failed: %v", err) } if testing.Verbose() { - fmt.Printf("+ mkdir -p %s\n", scratchDir) - } - defer os.RemoveAll(scratchDir) - err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error { - scratchPath := filepath.Join(scratchDir, path) - if info.IsDir() { - if path == "." { - return nil - } - if testing.Verbose() { - fmt.Printf("+ mkdir -p %s\n", scratchPath) - } - return os.Mkdir(scratchPath, info.Mode()) - } else { - fromBytes, err := ioutil.ReadFile(path) - if err != nil { - return err - } - if testing.Verbose() { - fmt.Printf("+ cp %s %s\n", path, scratchPath) - } - return ioutil.WriteFile(scratchPath, fromBytes, info.Mode()) - } - }) - if err != nil { - return 0, fmt.Errorf("walk failed: %v", err) + fmt.Printf("+ mkdir -p %s\n", gopath) + } + defer os.RemoveAll(gopath) + + modRoot := filepath.Join(gopath, "src", "testshared") + if err := overlayDir(modRoot, "testdata"); err != nil { + return 0, err } - os.Setenv("GOPATH", scratchDir) if testing.Verbose() { - fmt.Printf("+ export GOPATH=%s\n", scratchDir) + fmt.Printf("+ cd %s\n", modRoot) + } + os.Chdir(modRoot) + if err := ioutil.WriteFile("go.mod", []byte("module testshared\n"), 0666); err != nil { + return 0, err } - myContext.GOPATH = scratchDir + + os.Setenv("GOPATH", gopath) if testing.Verbose() { - fmt.Printf("+ cd %s\n", scratchDir) + fmt.Printf("+ export GOPATH=%s\n", gopath) } - os.Chdir(scratchDir) + myContext.GOPATH = gopath // All tests depend on runtime being built into a shared library. Because // that takes a few seconds, do it here and have all tests use the version @@ -154,15 +143,20 @@ func testMain(m *testing.M) (int, error) { goCmd(nil, append([]string{"install", "-buildmode=shared"}, minpkgs...)...) myContext.InstallSuffix = suffix + "_dynlink" - depP, err := myContext.Import("depBase", ".", build.ImportComment) + depP, err := myContext.Import("./depBase", ".", build.ImportComment) if err != nil { return 0, fmt.Errorf("import failed: %v", err) } - gopathInstallDir = depP.PkgTargetRoot + if depP.PkgTargetRoot == "" { + gopathInstallDir = filepath.Dir(goCmd(nil, "list", "-buildmode=shared", "-f", "{{.Target}}", "./depBase")) + } else { + gopathInstallDir = filepath.Join(depP.PkgTargetRoot, "testshared") + } return m.Run(), nil } func TestMain(m *testing.M) { + log.SetFlags(log.Lshortfile) flag.Parse() // Some of the tests install binaries into a custom GOPATH. @@ -350,6 +344,7 @@ func readNotes(f *elf.File) ([]*note, error) { } func dynStrings(t *testing.T, path string, flag elf.DynTag) []string { + t.Helper() f, err := elf.Open(path) if err != nil { t.Fatalf("elf.Open(%q) failed: %v", path, err) @@ -363,6 +358,7 @@ func dynStrings(t *testing.T, path string, flag elf.DynTag) []string { } func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) { + t.Helper() for _, dynstring := range dynStrings(t, path, elf.DT_NEEDED) { if re.MatchString(dynstring) { return @@ -372,10 +368,12 @@ func AssertIsLinkedToRegexp(t *testing.T, path string, re *regexp.Regexp) { } func AssertIsLinkedTo(t *testing.T, path, lib string) { + t.Helper() AssertIsLinkedToRegexp(t, path, regexp.MustCompile(regexp.QuoteMeta(lib))) } func AssertHasRPath(t *testing.T, path, dir string) { + t.Helper() for _, tag := range []elf.DynTag{elf.DT_RPATH, elf.DT_RUNPATH} { for _, dynstring := range dynStrings(t, path, tag) { for _, rpath := range strings.Split(dynstring, ":") { @@ -390,15 +388,15 @@ func AssertHasRPath(t *testing.T, path, dir string) { // Build a trivial program that links against the shared runtime and check it runs. func TestTrivialExecutable(t *testing.T) { - goCmd(t, "install", "-linkshared", "trivial") - run(t, "trivial executable", "./bin/trivial") - AssertIsLinkedTo(t, "./bin/trivial", soname) - AssertHasRPath(t, "./bin/trivial", gorootInstallDir) + goCmd(t, "install", "-linkshared", "./trivial") + run(t, "trivial executable", "../../bin/trivial") + AssertIsLinkedTo(t, "../../bin/trivial", soname) + AssertHasRPath(t, "../../bin/trivial", gorootInstallDir) } // Build a trivial program in PIE mode that links against the shared runtime and check it runs. func TestTrivialExecutablePIE(t *testing.T) { - goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "trivial") + goCmd(t, "build", "-buildmode=pie", "-o", "trivial.pie", "-linkshared", "./trivial") run(t, "trivial executable", "./trivial.pie") AssertIsLinkedTo(t, "./trivial.pie", soname) AssertHasRPath(t, "./trivial.pie", gorootInstallDir) @@ -406,15 +404,15 @@ func TestTrivialExecutablePIE(t *testing.T) { // Build a division test program and check it runs. func TestDivisionExecutable(t *testing.T) { - goCmd(t, "install", "-linkshared", "division") - run(t, "division executable", "./bin/division") + goCmd(t, "install", "-linkshared", "./division") + run(t, "division executable", "../../bin/division") } // Build an executable that uses cgo linked against the shared runtime and check it // runs. func TestCgoExecutable(t *testing.T) { - goCmd(t, "install", "-linkshared", "execgo") - run(t, "cgo executable", "./bin/execgo") + goCmd(t, "install", "-linkshared", "./execgo") + run(t, "cgo executable", "../../bin/execgo") } func checkPIE(t *testing.T, name string) { @@ -433,7 +431,7 @@ func checkPIE(t *testing.T, name string) { func TestTrivialPIE(t *testing.T) { name := "trivial_pie" - goCmd(t, "build", "-buildmode=pie", "-o="+name, "trivial") + goCmd(t, "build", "-buildmode=pie", "-o="+name, "./trivial") defer os.Remove(name) run(t, name, "./"+name) checkPIE(t, name) @@ -441,7 +439,7 @@ func TestTrivialPIE(t *testing.T) { func TestCgoPIE(t *testing.T) { name := "cgo_pie" - goCmd(t, "build", "-buildmode=pie", "-o="+name, "execgo") + goCmd(t, "build", "-buildmode=pie", "-o="+name, "./execgo") defer os.Remove(name) run(t, name, "./"+name) checkPIE(t, name) @@ -450,15 +448,16 @@ func TestCgoPIE(t *testing.T) { // Build a GOPATH package into a shared library that links against the goroot runtime // and an executable that links against both. func TestGopathShlib(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - AssertIsLinkedTo(t, filepath.Join(gopathInstallDir, "libdepBase.so"), soname) - goCmd(t, "install", "-linkshared", "exe") - AssertIsLinkedTo(t, "./bin/exe", soname) - AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so") - AssertHasRPath(t, "./bin/exe", gorootInstallDir) - AssertHasRPath(t, "./bin/exe", gopathInstallDir) + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase") + AssertIsLinkedTo(t, shlib, soname) + goCmd(t, "install", "-linkshared", "./exe") + AssertIsLinkedTo(t, "../../bin/exe", soname) + AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib)) + AssertHasRPath(t, "../../bin/exe", gorootInstallDir) + AssertHasRPath(t, "../../bin/exe", filepath.Dir(gopathInstallDir)) // And check it runs. - run(t, "executable linked to GOPATH library", "./bin/exe") + run(t, "executable linked to GOPATH library", "../../bin/exe") } // The shared library contains a note listing the packages it contains in a section @@ -470,8 +469,8 @@ func testPkgListNote(t *testing.T, f *elf.File, note *note) { if isOffsetLoaded(f, note.section.Offset) { t.Errorf("package list section contained in PT_LOAD segment") } - if note.desc != "depBase\n" { - t.Errorf("incorrect package list %q, want %q", note.desc, "depBase\n") + if note.desc != "testshared/depBase\n" { + t.Errorf("incorrect package list %q, want %q", note.desc, "testshared/depBase\n") } } @@ -528,8 +527,9 @@ func testDepsNote(t *testing.T, f *elf.File, note *note) { // The shared library contains notes with defined contents; see above. func TestNotes(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - f, err := elf.Open(filepath.Join(gopathInstallDir, "libdepBase.so")) + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + shlib := goCmd(t, "list", "-f", "{{.Shlib}}", "-buildmode=shared", "-linkshared", "./depBase") + f, err := elf.Open(shlib) if err != nil { t.Fatal(err) } @@ -581,23 +581,24 @@ func TestNotes(t *testing.T) { // runtime, another package (dep2) that links against the first, and an // executable that links against dep2. func TestTwoGopathShlibs(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2") - goCmd(t, "install", "-linkshared", "exe2") - run(t, "executable linked to GOPATH library", "./bin/exe2") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2") + goCmd(t, "install", "-linkshared", "./exe2") + run(t, "executable linked to GOPATH library", "../../bin/exe2") } func TestThreeGopathShlibs(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep2") - goCmd(t, "install", "-buildmode=shared", "-linkshared", "dep3") - goCmd(t, "install", "-linkshared", "exe3") - run(t, "executable linked to GOPATH library", "./bin/exe3") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep2") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./dep3") + goCmd(t, "install", "-linkshared", "./exe3") + run(t, "executable linked to GOPATH library", "../../bin/exe3") } -// If gccgo is not available or not new enough call t.Skip. Otherwise, -// return a build.Context that is set up for gccgo. -func prepGccgo(t *testing.T) build.Context { +// If gccgo is not available or not new enough, call t.Skip. +func requireGccgo(t *testing.T) { + t.Helper() + gccgoName := os.Getenv("GCCGO") if gccgoName == "" { gccgoName = "gccgo" @@ -614,61 +615,64 @@ func prepGccgo(t *testing.T) build.Context { if string(output) < "5" { t.Skipf("gccgo too old (%s)", strings.TrimSpace(string(output))) } - gccgoContext := build.Default - gccgoContext.InstallSuffix = suffix + "_fPIC" - gccgoContext.Compiler = "gccgo" - gccgoContext.GOPATH = os.Getenv("GOPATH") - return gccgoContext + + gomod, err := exec.Command("go", "env", "GOMOD").Output() + if err != nil { + t.Fatalf("go env GOMOD: %v", err) + } + if len(bytes.TrimSpace(gomod)) > 0 { + t.Skipf("gccgo not supported in module mode; see golang.org/issue/30344") + } } // Build a GOPATH package into a shared library with gccgo and an executable that // links against it. func TestGoPathShlibGccgo(t *testing.T) { - gccgoContext := prepGccgo(t) + requireGccgo(t) libgoRE := regexp.MustCompile("libgo.so.[0-9]+") - depP, err := gccgoContext.Import("depBase", ".", build.ImportComment) - if err != nil { - t.Fatalf("import failed: %v", err) - } - gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs") - goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase") - AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE) - goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe") - AssertIsLinkedToRegexp(t, "./bin/exe", libgoRE) - AssertIsLinkedTo(t, "./bin/exe", "libdepBase.so") - AssertHasRPath(t, "./bin/exe", gccgoInstallDir) + goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase") + + // Run 'go list' after 'go install': with gccgo, we apparently don't know the + // shlib location until after we've installed it. + shlib := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase") + + AssertIsLinkedToRegexp(t, shlib, libgoRE) + goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe") + AssertIsLinkedToRegexp(t, "../../bin/exe", libgoRE) + AssertIsLinkedTo(t, "../../bin/exe", filepath.Base(shlib)) + AssertHasRPath(t, "../../bin/exe", filepath.Dir(shlib)) // And check it runs. - run(t, "gccgo-built", "./bin/exe") + run(t, "gccgo-built", "../../bin/exe") } // The gccgo version of TestTwoGopathShlibs: build a GOPATH package into a shared // library with gccgo, another GOPATH package that depends on the first and an // executable that links the second library. func TestTwoGopathShlibsGccgo(t *testing.T) { - gccgoContext := prepGccgo(t) + requireGccgo(t) libgoRE := regexp.MustCompile("libgo.so.[0-9]+") - depP, err := gccgoContext.Import("depBase", ".", build.ImportComment) - if err != nil { - t.Fatalf("import failed: %v", err) - } - gccgoInstallDir := filepath.Join(depP.PkgTargetRoot, "shlibs") - goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "depBase") - goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "dep2") - goCmd(t, "install", "-compiler=gccgo", "-linkshared", "exe2") + goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./depBase") + goCmd(t, "install", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "./dep2") + goCmd(t, "install", "-compiler=gccgo", "-linkshared", "./exe2") + + // Run 'go list' after 'go install': with gccgo, we apparently don't know the + // shlib location until after we've installed it. + dep2 := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./dep2") + depBase := goCmd(t, "list", "-compiler=gccgo", "-buildmode=shared", "-linkshared", "-f", "{{.Shlib}}", "./depBase") - AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdepBase.so"), libgoRE) - AssertIsLinkedToRegexp(t, filepath.Join(gccgoInstallDir, "libdep2.so"), libgoRE) - AssertIsLinkedTo(t, filepath.Join(gccgoInstallDir, "libdep2.so"), "libdepBase.so") - AssertIsLinkedToRegexp(t, "./bin/exe2", libgoRE) - AssertIsLinkedTo(t, "./bin/exe2", "libdep2") - AssertIsLinkedTo(t, "./bin/exe2", "libdepBase.so") + AssertIsLinkedToRegexp(t, depBase, libgoRE) + AssertIsLinkedToRegexp(t, dep2, libgoRE) + AssertIsLinkedTo(t, dep2, filepath.Base(depBase)) + AssertIsLinkedToRegexp(t, "../../bin/exe2", libgoRE) + AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(dep2)) + AssertIsLinkedTo(t, "../../bin/exe2", filepath.Base(depBase)) // And check it runs. - run(t, "gccgo-built", "./bin/exe2") + run(t, "gccgo-built", "../../bin/exe2") } // Testing rebuilding of shared libraries when they are stale is a bit more @@ -694,9 +698,9 @@ func resetFileStamps() { } } - reset("bin") - reset("pkg") - reset("src") + reset("../../bin") + reset("../../pkg") + reset("../../src") reset(gorootInstallDir) } @@ -746,6 +750,7 @@ func touch(t *testing.T, path string) (cleanup func()) { // isNew returns if the path is newer than the time stamp used by touch. func isNew(t *testing.T, path string) bool { + t.Helper() fi, err := os.Stat(path) if err != nil { t.Fatal(err) @@ -771,40 +776,47 @@ func AssertNotRebuilt(t *testing.T, msg, path string) { } func TestRebuilding(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - goCmd(t, "install", "-linkshared", "exe") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + goCmd(t, "install", "-linkshared", "./exe") + info := strings.Fields(goCmd(t, "list", "-buildmode=shared", "-linkshared", "-f", "{{.Target}} {{.Shlib}}", "./depBase")) + if len(info) != 2 { + t.Fatalf("go list failed to report Target and/or Shlib") + } + target := info[0] + shlib := info[1] // If the source is newer than both the .a file and the .so, both are rebuilt. t.Run("newsource", func(t *testing.T) { resetFileStamps() - cleanup := touch(t, "src/depBase/dep.go") + cleanup := touch(t, "./depBase/dep.go") defer func() { cleanup() - goCmd(t, "install", "-linkshared", "exe") + goCmd(t, "install", "-linkshared", "./exe") }() - goCmd(t, "install", "-linkshared", "exe") - AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "depBase.a")) - AssertRebuilt(t, "new source", filepath.Join(gopathInstallDir, "libdepBase.so")) + goCmd(t, "install", "-linkshared", "./exe") + AssertRebuilt(t, "new source", target) + AssertRebuilt(t, "new source", shlib) }) // If the .a file is newer than the .so, the .so is rebuilt (but not the .a) t.Run("newarchive", func(t *testing.T) { resetFileStamps() - AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a")) - goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "depBase") - AssertNotRebuilt(t, "new .a file before build", filepath.Join(gopathInstallDir, "depBase.a")) - cleanup := touch(t, filepath.Join(gopathInstallDir, "depBase.a")) + AssertNotRebuilt(t, "new .a file before build", target) + goCmd(t, "list", "-linkshared", "-f={{.ImportPath}} {{.Stale}} {{.StaleReason}} {{.Target}}", "./depBase") + AssertNotRebuilt(t, "new .a file before build", target) + cleanup := touch(t, target) defer func() { cleanup() - goCmd(t, "install", "-v", "-linkshared", "exe") + goCmd(t, "install", "-v", "-linkshared", "./exe") }() - goCmd(t, "install", "-v", "-linkshared", "exe") - AssertNotRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "depBase.a")) - AssertRebuilt(t, "new .a file", filepath.Join(gopathInstallDir, "libdepBase.so")) + goCmd(t, "install", "-v", "-linkshared", "./exe") + AssertNotRebuilt(t, "new .a file", target) + AssertRebuilt(t, "new .a file", shlib) }) } func appendFile(t *testing.T, path, content string) { + t.Helper() f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND, 0660) if err != nil { t.Fatalf("os.OpenFile failed: %v", err) @@ -821,16 +833,24 @@ func appendFile(t *testing.T, path, content string) { } } -func writeFile(t *testing.T, path, content string) { - err := ioutil.WriteFile(path, []byte(content), 0644) +func createFile(t *testing.T, path, content string) { + t.Helper() + f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0644) if err != nil { - t.Fatalf("ioutil.WriteFile failed: %v", err) + t.Fatalf("os.OpenFile failed: %v", err) + } + _, err = f.WriteString(content) + if closeErr := f.Close(); err == nil { + err = closeErr + } + if err != nil { + t.Fatalf("WriteString failed: %v", err) } } func TestABIChecking(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - goCmd(t, "install", "-linkshared", "exe") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + goCmd(t, "install", "-linkshared", "./exe") // If we make an ABI-breaking change to depBase and rebuild libp.so but not exe, // exe will abort with a complaint on startup. @@ -838,18 +858,21 @@ func TestABIChecking(t *testing.T) { // some senses but suffices for the narrow definition of ABI compatibility the // toolchain uses today. resetFileStamps() - appendFile(t, "src/depBase/dep.go", "func ABIBreak() {}\n") - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - c := exec.Command("./bin/exe") + + createFile(t, "./depBase/break.go", "package depBase\nfunc ABIBreak() {}\n") + defer os.Remove("./depBase/break.go") + + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + c := exec.Command("../../bin/exe") output, err := c.CombinedOutput() if err == nil { t.Fatal("executing exe did not fail after ABI break") } scanner := bufio.NewScanner(bytes.NewReader(output)) foundMsg := false - const wantLine = "abi mismatch detected between the executable and libdepBase.so" + const wantPrefix = "abi mismatch detected between the executable and lib" for scanner.Scan() { - if scanner.Text() == wantLine { + if strings.HasPrefix(scanner.Text(), wantPrefix) { foundMsg = true break } @@ -858,20 +881,20 @@ func TestABIChecking(t *testing.T) { t.Errorf("scanner encountered error: %v", err) } if !foundMsg { - t.Fatalf("exe failed, but without line %q; got output:\n%s", wantLine, output) + t.Fatalf("exe failed, but without line %q; got output:\n%s", wantPrefix, output) } // Rebuilding exe makes it work again. - goCmd(t, "install", "-linkshared", "exe") - run(t, "rebuilt exe", "./bin/exe") + goCmd(t, "install", "-linkshared", "./exe") + run(t, "rebuilt exe", "../../bin/exe") // If we make a change which does not break ABI (such as adding an unexported // function) and rebuild libdepBase.so, exe still works, even if new function // is in a file by itself. resetFileStamps() - writeFile(t, "src/depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n") - goCmd(t, "install", "-buildmode=shared", "-linkshared", "depBase") - run(t, "after non-ABI breaking change", "./bin/exe") + createFile(t, "./depBase/dep2.go", "package depBase\nfunc noABIBreak() {}\n") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./depBase") + run(t, "after non-ABI breaking change", "../../bin/exe") } // If a package 'explicit' imports a package 'implicit', building @@ -881,29 +904,29 @@ func TestABIChecking(t *testing.T) { // executable rather than fetching it from the shared library. The // link still succeeds and the executable still runs though. func TestImplicitInclusion(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "explicit") - goCmd(t, "install", "-linkshared", "implicitcmd") - run(t, "running executable linked against library that contains same package as it", "./bin/implicitcmd") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./explicit") + goCmd(t, "install", "-linkshared", "./implicitcmd") + run(t, "running executable linked against library that contains same package as it", "../../bin/implicitcmd") } // Tests to make sure that the type fields of empty interfaces and itab // fields of nonempty interfaces are unique even across modules, // so that interface equality works correctly. func TestInterface(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_a") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_a") // Note: iface_i gets installed implicitly as a dependency of iface_a. - goCmd(t, "install", "-buildmode=shared", "-linkshared", "iface_b") - goCmd(t, "install", "-linkshared", "iface") - run(t, "running type/itab uniqueness tester", "./bin/iface") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./iface_b") + goCmd(t, "install", "-linkshared", "./iface") + run(t, "running type/itab uniqueness tester", "../../bin/iface") } // Access a global variable from a library. func TestGlobal(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "globallib") - goCmd(t, "install", "-linkshared", "global") - run(t, "global executable", "./bin/global") - AssertIsLinkedTo(t, "./bin/global", soname) - AssertHasRPath(t, "./bin/global", gorootInstallDir) + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./globallib") + goCmd(t, "install", "-linkshared", "./global") + run(t, "global executable", "../../bin/global") + AssertIsLinkedTo(t, "../../bin/global", soname) + AssertHasRPath(t, "../../bin/global", gorootInstallDir) } // Run a test using -linkshared of an installed shared package. @@ -915,5 +938,5 @@ func TestTestInstalledShared(t *testing.T) { // Test generated pointer method with -linkshared. // Issue 25065. func TestGeneratedMethod(t *testing.T) { - goCmd(t, "install", "-buildmode=shared", "-linkshared", "issue25065") + goCmd(t, "install", "-buildmode=shared", "-linkshared", "./issue25065") } diff --git a/misc/cgo/testshared/src/dep2/dep2.go b/misc/cgo/testshared/testdata/dep2/dep2.go similarity index 82% rename from misc/cgo/testshared/src/dep2/dep2.go rename to misc/cgo/testshared/testdata/dep2/dep2.go index c2c812adb9..94f38cf507 100644 --- a/misc/cgo/testshared/src/dep2/dep2.go +++ b/misc/cgo/testshared/testdata/dep2/dep2.go @@ -1,6 +1,6 @@ package dep2 -import "depBase" +import "testshared/depBase" var W int = 1 diff --git a/misc/cgo/testshared/src/dep3/dep3.go b/misc/cgo/testshared/testdata/dep3/dep3.go similarity index 91% rename from misc/cgo/testshared/src/dep3/dep3.go rename to misc/cgo/testshared/testdata/dep3/dep3.go index 7b7c9dac1f..6b02ad2ee5 100644 --- a/misc/cgo/testshared/src/dep3/dep3.go +++ b/misc/cgo/testshared/testdata/dep3/dep3.go @@ -7,8 +7,8 @@ package dep3 // the type data in this case and later crash. import ( - "dep2" - "depBase" + "testshared/dep2" + "testshared/depBase" ) type Dep3 struct { diff --git a/misc/cgo/testshared/src/depBase/asm.s b/misc/cgo/testshared/testdata/depBase/asm.s similarity index 100% rename from misc/cgo/testshared/src/depBase/asm.s rename to misc/cgo/testshared/testdata/depBase/asm.s diff --git a/misc/cgo/testshared/src/depBase/dep.go b/misc/cgo/testshared/testdata/depBase/dep.go similarity index 100% rename from misc/cgo/testshared/src/depBase/dep.go rename to misc/cgo/testshared/testdata/depBase/dep.go diff --git a/misc/cgo/testshared/src/depBase/gccgo.go b/misc/cgo/testshared/testdata/depBase/gccgo.go similarity index 100% rename from misc/cgo/testshared/src/depBase/gccgo.go rename to misc/cgo/testshared/testdata/depBase/gccgo.go diff --git a/misc/cgo/testshared/src/depBase/stubs.go b/misc/cgo/testshared/testdata/depBase/stubs.go similarity index 100% rename from misc/cgo/testshared/src/depBase/stubs.go rename to misc/cgo/testshared/testdata/depBase/stubs.go diff --git a/misc/cgo/testshared/src/division/division.go b/misc/cgo/testshared/testdata/division/division.go similarity index 100% rename from misc/cgo/testshared/src/division/division.go rename to misc/cgo/testshared/testdata/division/division.go diff --git a/misc/cgo/testshared/src/exe/exe.go b/misc/cgo/testshared/testdata/exe/exe.go similarity index 97% rename from misc/cgo/testshared/src/exe/exe.go rename to misc/cgo/testshared/testdata/exe/exe.go index bd864d88ad..86582581a6 100644 --- a/misc/cgo/testshared/src/exe/exe.go +++ b/misc/cgo/testshared/testdata/exe/exe.go @@ -1,7 +1,7 @@ package main import ( - "depBase" + "testshared/depBase" "os" "reflect" "runtime" diff --git a/misc/cgo/testshared/src/exe2/exe2.go b/misc/cgo/testshared/testdata/exe2/exe2.go similarity index 77% rename from misc/cgo/testshared/src/exe2/exe2.go rename to misc/cgo/testshared/testdata/exe2/exe2.go index 675fd1f365..433f331e36 100644 --- a/misc/cgo/testshared/src/exe2/exe2.go +++ b/misc/cgo/testshared/testdata/exe2/exe2.go @@ -1,6 +1,6 @@ package main -import "dep2" +import "testshared/dep2" func main() { d := &dep2.Dep2{} diff --git a/misc/cgo/testshared/src/exe3/exe3.go b/misc/cgo/testshared/testdata/exe3/exe3.go similarity index 62% rename from misc/cgo/testshared/src/exe3/exe3.go rename to misc/cgo/testshared/testdata/exe3/exe3.go index 643f2605f6..533e3a9e3d 100644 --- a/misc/cgo/testshared/src/exe3/exe3.go +++ b/misc/cgo/testshared/testdata/exe3/exe3.go @@ -1,6 +1,6 @@ package main -import "dep3" +import "testshared/dep3" func main() { dep3.D3() diff --git a/misc/cgo/testshared/src/execgo/exe.go b/misc/cgo/testshared/testdata/execgo/exe.go similarity index 100% rename from misc/cgo/testshared/src/execgo/exe.go rename to misc/cgo/testshared/testdata/execgo/exe.go diff --git a/misc/cgo/testshared/src/explicit/explicit.go b/misc/cgo/testshared/testdata/explicit/explicit.go similarity index 74% rename from misc/cgo/testshared/src/explicit/explicit.go rename to misc/cgo/testshared/testdata/explicit/explicit.go index 6a4453f775..af969fcb23 100644 --- a/misc/cgo/testshared/src/explicit/explicit.go +++ b/misc/cgo/testshared/testdata/explicit/explicit.go @@ -1,7 +1,7 @@ package explicit import ( - "implicit" + "testshared/implicit" ) func E() int { diff --git a/misc/cgo/testshared/src/global/main.go b/misc/cgo/testshared/testdata/global/main.go similarity index 98% rename from misc/cgo/testshared/src/global/main.go rename to misc/cgo/testshared/testdata/global/main.go index 94e7f247de..f43e7c3fb3 100644 --- a/misc/cgo/testshared/src/global/main.go +++ b/misc/cgo/testshared/testdata/global/main.go @@ -5,7 +5,7 @@ package main import ( - "globallib" + "testshared/globallib" ) //go:noinline diff --git a/misc/cgo/testshared/src/globallib/global.go b/misc/cgo/testshared/testdata/globallib/global.go similarity index 100% rename from misc/cgo/testshared/src/globallib/global.go rename to misc/cgo/testshared/testdata/globallib/global.go diff --git a/misc/cgo/testshared/src/iface/main.go b/misc/cgo/testshared/testdata/iface/main.go similarity index 85% rename from misc/cgo/testshared/src/iface/main.go rename to misc/cgo/testshared/testdata/iface/main.go index 3d5b54e73b..d26ebbcc9c 100644 --- a/misc/cgo/testshared/src/iface/main.go +++ b/misc/cgo/testshared/testdata/iface/main.go @@ -4,8 +4,8 @@ package main -import "iface_a" -import "iface_b" +import "testshared/iface_a" +import "testshared/iface_b" func main() { if iface_a.F() != iface_b.F() { diff --git a/misc/cgo/testshared/src/iface_a/a.go b/misc/cgo/testshared/testdata/iface_a/a.go similarity index 91% rename from misc/cgo/testshared/src/iface_a/a.go rename to misc/cgo/testshared/testdata/iface_a/a.go index e11047c166..e2cef1ecda 100644 --- a/misc/cgo/testshared/src/iface_a/a.go +++ b/misc/cgo/testshared/testdata/iface_a/a.go @@ -4,7 +4,7 @@ package iface_a -import "iface_i" +import "testshared/iface_i" //go:noinline func F() interface{} { diff --git a/misc/cgo/testshared/src/iface_b/b.go b/misc/cgo/testshared/testdata/iface_b/b.go similarity index 91% rename from misc/cgo/testshared/src/iface_b/b.go rename to misc/cgo/testshared/testdata/iface_b/b.go index 47aee2e77e..dd3e027b37 100644 --- a/misc/cgo/testshared/src/iface_b/b.go +++ b/misc/cgo/testshared/testdata/iface_b/b.go @@ -4,7 +4,7 @@ package iface_b -import "iface_i" +import "testshared/iface_i" //go:noinline func F() interface{} { diff --git a/misc/cgo/testshared/src/iface_i/i.go b/misc/cgo/testshared/testdata/iface_i/i.go similarity index 100% rename from misc/cgo/testshared/src/iface_i/i.go rename to misc/cgo/testshared/testdata/iface_i/i.go diff --git a/misc/cgo/testshared/src/implicit/implicit.go b/misc/cgo/testshared/testdata/implicit/implicit.go similarity index 100% rename from misc/cgo/testshared/src/implicit/implicit.go rename to misc/cgo/testshared/testdata/implicit/implicit.go diff --git a/misc/cgo/testshared/src/implicitcmd/implicitcmd.go b/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go similarity index 63% rename from misc/cgo/testshared/src/implicitcmd/implicitcmd.go rename to misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go index f6112933e5..4d4296738e 100644 --- a/misc/cgo/testshared/src/implicitcmd/implicitcmd.go +++ b/misc/cgo/testshared/testdata/implicitcmd/implicitcmd.go @@ -1,8 +1,8 @@ package main import ( - "explicit" - "implicit" + "testshared/explicit" + "testshared/implicit" ) func main() { diff --git a/misc/cgo/testshared/src/issue25065/a.go b/misc/cgo/testshared/testdata/issue25065/a.go similarity index 100% rename from misc/cgo/testshared/src/issue25065/a.go rename to misc/cgo/testshared/testdata/issue25065/a.go diff --git a/misc/cgo/testshared/src/trivial/trivial.go b/misc/cgo/testshared/testdata/trivial/trivial.go similarity index 100% rename from misc/cgo/testshared/src/trivial/trivial.go rename to misc/cgo/testshared/testdata/trivial/trivial.go -- GitLab From a00611f58d5322899c45c63758e43d2a2c5a2a11 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 16:18:28 -0500 Subject: [PATCH 0061/1679] misc/cgo/testcshared: fix tests in module mode Updates #30228 Change-Id: Ie9dca7c64be8dff729be98cb6190236287afd23e Reviewed-on: https://go-review.googlesource.com/c/163213 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- misc/cgo/testcshared/cshared_test.go | 144 ++++++++++-------- misc/cgo/testcshared/overlaydir_test.go | 81 ++++++++++ .../{src => testdata}/go2c2go/go/shlib.go | 0 .../{src => testdata}/go2c2go/m1/c.c | 0 .../{src => testdata}/go2c2go/m1/main.go | 0 .../{src => testdata}/go2c2go/m2/main.go | 0 .../{src => testdata}/libgo/libgo.go | 2 +- .../{src => testdata}/libgo2/dup2.go | 0 .../{src => testdata}/libgo2/dup3.go | 0 .../{src => testdata}/libgo2/libgo2.go | 0 .../{src => testdata}/libgo4/libgo4.go | 0 .../{src => testdata}/libgo5/libgo5.go | 0 misc/cgo/testcshared/{ => testdata}/main0.c | 0 misc/cgo/testcshared/{ => testdata}/main1.c | 0 misc/cgo/testcshared/{ => testdata}/main2.c | 0 misc/cgo/testcshared/{ => testdata}/main3.c | 0 misc/cgo/testcshared/{ => testdata}/main4.c | 0 misc/cgo/testcshared/{ => testdata}/main5.c | 0 misc/cgo/testcshared/{src => testdata}/p/p.go | 0 src/cmd/dist/test.go | 2 +- 20 files changed, 160 insertions(+), 69 deletions(-) create mode 100644 misc/cgo/testcshared/overlaydir_test.go rename misc/cgo/testcshared/{src => testdata}/go2c2go/go/shlib.go (100%) rename misc/cgo/testcshared/{src => testdata}/go2c2go/m1/c.c (100%) rename misc/cgo/testcshared/{src => testdata}/go2c2go/m1/main.go (100%) rename misc/cgo/testcshared/{src => testdata}/go2c2go/m2/main.go (100%) rename misc/cgo/testcshared/{src => testdata}/libgo/libgo.go (97%) rename misc/cgo/testcshared/{src => testdata}/libgo2/dup2.go (100%) rename misc/cgo/testcshared/{src => testdata}/libgo2/dup3.go (100%) rename misc/cgo/testcshared/{src => testdata}/libgo2/libgo2.go (100%) rename misc/cgo/testcshared/{src => testdata}/libgo4/libgo4.go (100%) rename misc/cgo/testcshared/{src => testdata}/libgo5/libgo5.go (100%) rename misc/cgo/testcshared/{ => testdata}/main0.c (100%) rename misc/cgo/testcshared/{ => testdata}/main1.c (100%) rename misc/cgo/testcshared/{ => testdata}/main2.c (100%) rename misc/cgo/testcshared/{ => testdata}/main3.c (100%) rename misc/cgo/testcshared/{ => testdata}/main4.c (100%) rename misc/cgo/testcshared/{ => testdata}/main5.c (100%) rename misc/cgo/testcshared/{src => testdata}/p/p.go (100%) diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index e5b90ff194..163cea2136 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -5,13 +5,13 @@ package cshared_test import ( + "bytes" "debug/elf" "fmt" "io/ioutil" "log" "os" "os/exec" - "path" "path/filepath" "strings" "sync" @@ -22,9 +22,6 @@ import ( // C compiler with args (from $(go env CC) $(go env GOGCCFLAGS)). var cc []string -// An environment with GOPATH=$(pwd). -var gopathEnv []string - // ".exe" on Windows. var exeSuffix string @@ -33,6 +30,12 @@ var installdir, androiddir string var libSuffix, libgoname string func TestMain(m *testing.M) { + os.Exit(testMain(m)) +} + +func testMain(m *testing.M) int { + log.SetFlags(log.Lshortfile) + GOOS = goEnv("GOOS") GOARCH = goEnv("GOARCH") GOROOT = goEnv("GOROOT") @@ -41,19 +44,6 @@ func TestMain(m *testing.M) { log.Fatalf("Unable able to find GOROOT at '%s'", GOROOT) } - // Directory where cgo headers and outputs will be installed. - // The installation directory format varies depending on the platform. - installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared", GOOS, GOARCH)) - switch GOOS { - case "darwin": - libSuffix = "dylib" - case "windows": - libSuffix = "dll" - default: - libSuffix = "so" - installdir = path.Join("pkg", fmt.Sprintf("%s_%s_testcshared_shared", GOOS, GOARCH)) - } - androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid()) if GOOS == "android" { args := append(adbCmd(), "shell", "mkdir", "-p", androiddir) @@ -62,10 +52,9 @@ func TestMain(m *testing.M) { if err != nil { log.Fatalf("setupAndroid failed: %v\n%s\n", err, out) } + defer cleanupAndroid() } - libgoname = "libgo." + libSuffix - cc = []string{goEnv("CC")} out := goEnv("GOGCCFLAGS") @@ -120,34 +109,56 @@ func TestMain(m *testing.M) { } cc = append(cc, "-I", filepath.Join("pkg", libgodir)) - // Build an environment with GOPATH=$(pwd) - dir, err := os.Getwd() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - gopathEnv = append(os.Environ(), "GOPATH="+dir) - if GOOS == "windows" { exeSuffix = ".exe" } - st := m.Run() + // Copy testdata into GOPATH/src/testcshared, along with a go.mod file + // declaring the same path. + + GOPATH, err := ioutil.TempDir("", "cshared_test") + if err != nil { + log.Panic(err) + } + defer os.RemoveAll(GOPATH) + os.Setenv("GOPATH", GOPATH) + + // Copy testdata into GOPATH/src/testarchive, along with a go.mod file + // declaring the same path. + modRoot := filepath.Join(GOPATH, "src", "testcshared") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := os.Chdir(modRoot); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil { + log.Panic(err) + } - os.Remove(libgoname) - os.RemoveAll("pkg") - cleanupHeaders() - cleanupAndroid() + // Directory where cgo headers and outputs will be installed. + // The installation directory format varies depending on the platform. + output, err := exec.Command("go", "list", + "-buildmode=c-shared", + "-installsuffix", "testcshared", + "-f", "{{.Target}}", + "./libgo").CombinedOutput() + if err != nil { + log.Panicf("go list failed: %v\n%s", err, output) + } + target := string(bytes.TrimSpace(output)) + libgoname = filepath.Base(target) + installdir = filepath.Dir(target) + libSuffix = strings.TrimPrefix(filepath.Ext(target), ".") - os.Exit(st) + return m.Run() } func goEnv(key string) string { out, err := exec.Command("go", "env", key).Output() if err != nil { - fmt.Fprintf(os.Stderr, "go env %s failed:\n%s", key, err) - fmt.Fprintf(os.Stderr, "%s", err.(*exec.ExitError).Stderr) - os.Exit(2) + log.Printf("go env %s failed:\n%s", key, err) + log.Panicf("%s", err.(*exec.ExitError).Stderr) } return strings.TrimSpace(string(out)) } @@ -197,10 +208,12 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string { return strings.Replace(string(out), "\r", "", -1) } -func run(t *testing.T, env []string, args ...string) string { +func run(t *testing.T, extraEnv []string, args ...string) string { t.Helper() cmd := exec.Command(args[0], args[1:]...) - cmd.Env = env + if len(extraEnv) > 0 { + cmd.Env = append(os.Environ(), extraEnv...) + } if GOOS != "windows" { // TestUnexportedSymbols relies on file descriptor 30 @@ -220,12 +233,12 @@ func run(t *testing.T, env []string, args ...string) string { return string(out) } -func runExe(t *testing.T, env []string, args ...string) string { +func runExe(t *testing.T, extraEnv []string, args ...string) string { t.Helper() if GOOS == "android" { - return adbRun(t, env, args...) + return adbRun(t, append(os.Environ(), extraEnv...), args...) } - return run(t, env, args...) + return run(t, extraEnv, args...) } func runCC(t *testing.T, args ...string) string { @@ -237,9 +250,8 @@ func runCC(t *testing.T, args ...string) string { func createHeaders() error { args := []string{"go", "install", "-i", "-buildmode=c-shared", - "-installsuffix", "testcshared", "libgo"} + "-installsuffix", "testcshared", "./libgo"} cmd := exec.Command(args[0], args[1:]...) - cmd.Env = gopathEnv out, err := cmd.CombinedOutput() if err != nil { return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out) @@ -248,9 +260,8 @@ func createHeaders() error { args = []string{"go", "build", "-buildmode=c-shared", "-installsuffix", "testcshared", "-o", libgoname, - filepath.Join("src", "libgo", "libgo.go")} + filepath.Join(".", "libgo", "libgo.go")} cmd = exec.Command(args[0], args[1:]...) - cmd.Env = gopathEnv out, err = cmd.CombinedOutput() if err != nil { return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out) @@ -282,10 +293,6 @@ func createHeadersOnce(t *testing.T) { } } -func cleanupHeaders() { - os.Remove("libgo.h") -} - func cleanupAndroid() { if GOOS != "android" { return @@ -294,7 +301,7 @@ func cleanupAndroid() { cmd := exec.Command(args[0], args[1:]...) out, err := cmd.CombinedOutput() if err != nil { - log.Fatalf("cleanupAndroid failed: %v\n%s\n", err, out) + log.Panicf("cleanupAndroid failed: %v\n%s\n", err, out) } } @@ -312,7 +319,7 @@ func TestExportedSymbols(t *testing.T) { defer os.Remove(bin) - out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin) + out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin) if strings.TrimSpace(out) != "PASS" { t.Error(out) } @@ -361,11 +368,11 @@ func TestUnexportedSymbols(t *testing.T) { libname := "libgo2." + libSuffix run(t, - gopathEnv, + nil, "go", "build", "-buildmode=c-shared", "-installsuffix", "testcshared", - "-o", libname, "libgo2", + "-o", libname, "./libgo2", ) adbPush(t, libname) @@ -380,7 +387,7 @@ func TestUnexportedSymbols(t *testing.T) { defer os.Remove(libname) defer os.Remove(bin) - out := runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), bin) + out := runExe(t, []string{"LD_LIBRARY_PATH=."}, bin) if strings.TrimSpace(out) != "PASS" { t.Error(out) @@ -418,7 +425,7 @@ func TestMainExportedOnAndroid(t *testing.T) { func testSignalHandlers(t *testing.T, pkgname, cfile, cmd string) { libname := pkgname + "." + libSuffix run(t, - gopathEnv, + nil, "go", "build", "-buildmode=c-shared", "-installsuffix", "testcshared", @@ -451,7 +458,7 @@ func TestSignalHandlers(t *testing.T) { t.Logf("Skipping on %s", GOOS) return } - testSignalHandlers(t, "libgo4", "main4.c", "testp4") + testSignalHandlers(t, "./libgo4", "main4.c", "testp4") } // test5: test signal handlers with os/signal.Notify @@ -461,7 +468,7 @@ func TestSignalHandlersWithNotify(t *testing.T) { t.Logf("Skipping on %s", GOOS) return } - testSignalHandlers(t, "libgo5", "main5.c", "testp5") + testSignalHandlers(t, "./libgo5", "main5.c", "testp5") } func TestPIE(t *testing.T) { @@ -515,14 +522,16 @@ func TestCachedInstall(t *testing.T) { } // defer os.RemoveAll(tmpdir) - copyFile(t, filepath.Join(tmpdir, "src", "libgo", "libgo.go"), filepath.Join("src", "libgo", "libgo.go")) - copyFile(t, filepath.Join(tmpdir, "src", "p", "p.go"), filepath.Join("src", "p", "p.go")) + copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod") + copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go")) + copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "p", "p.go"), filepath.Join("p", "p.go")) - env := append(os.Environ(), "GOPATH="+tmpdir) + env := append(os.Environ(), "GOPATH="+tmpdir, "GOBIN="+filepath.Join(tmpdir, "bin")) - buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "libgo"} + buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "./libgo"} cmd := exec.Command(buildcmd[0], buildcmd[1:]...) + cmd.Dir = filepath.Join(tmpdir, "src", "testcshared") cmd.Env = env t.Log(buildcmd) out, err := cmd.CombinedOutput() @@ -572,6 +581,7 @@ func TestCachedInstall(t *testing.T) { } cmd = exec.Command(buildcmd[0], buildcmd[1:]...) + cmd.Dir = filepath.Join(tmpdir, "src", "testcshared") cmd.Env = env t.Log(buildcmd) out, err = cmd.CombinedOutput() @@ -621,8 +631,8 @@ func TestGo2C2Go(t *testing.T) { } defer os.RemoveAll(tmpdir) - shlib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix) - run(t, gopathEnv, "go", "build", "-buildmode=c-shared", "-o", shlib, "go2c2go/go") + lib := filepath.Join(tmpdir, "libtestgo2c2go."+libSuffix) + run(t, nil, "go", "build", "-buildmode=c-shared", "-o", lib, "./go2c2go/go") cgoCflags := os.Getenv("CGO_CFLAGS") if cgoCflags != "" { @@ -636,7 +646,7 @@ func TestGo2C2Go(t *testing.T) { } cgoLdflags += "-L" + tmpdir + " -ltestgo2c2go" - goenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "CGO_CFLAGS="+cgoCflags, "CGO_LDFLAGS="+cgoLdflags) + goenv := []string{"CGO_CFLAGS=" + cgoCflags, "CGO_LDFLAGS=" + cgoLdflags} ldLibPath := os.Getenv("LD_LIBRARY_PATH") if ldLibPath != "" { @@ -644,13 +654,13 @@ func TestGo2C2Go(t *testing.T) { } ldLibPath += tmpdir - runenv := append(gopathEnv[:len(gopathEnv):len(gopathEnv)], "LD_LIBRARY_PATH="+ldLibPath) + runenv := []string{"LD_LIBRARY_PATH=" + ldLibPath} bin := filepath.Join(tmpdir, "m1") + exeSuffix - run(t, goenv, "go", "build", "-o", bin, "go2c2go/m1") + run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m1") runExe(t, runenv, bin) bin = filepath.Join(tmpdir, "m2") + exeSuffix - run(t, goenv, "go", "build", "-o", bin, "go2c2go/m2") + run(t, goenv, "go", "build", "-o", bin, "./go2c2go/m2") runExe(t, runenv, bin) } diff --git a/misc/cgo/testcshared/overlaydir_test.go b/misc/cgo/testcshared/overlaydir_test.go new file mode 100644 index 0000000000..1eaabf6fe2 --- /dev/null +++ b/misc/cgo/testcshared/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 cshared_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testcshared/src/go2c2go/go/shlib.go b/misc/cgo/testcshared/testdata/go2c2go/go/shlib.go similarity index 100% rename from misc/cgo/testcshared/src/go2c2go/go/shlib.go rename to misc/cgo/testcshared/testdata/go2c2go/go/shlib.go diff --git a/misc/cgo/testcshared/src/go2c2go/m1/c.c b/misc/cgo/testcshared/testdata/go2c2go/m1/c.c similarity index 100% rename from misc/cgo/testcshared/src/go2c2go/m1/c.c rename to misc/cgo/testcshared/testdata/go2c2go/m1/c.c diff --git a/misc/cgo/testcshared/src/go2c2go/m1/main.go b/misc/cgo/testcshared/testdata/go2c2go/m1/main.go similarity index 100% rename from misc/cgo/testcshared/src/go2c2go/m1/main.go rename to misc/cgo/testcshared/testdata/go2c2go/m1/main.go diff --git a/misc/cgo/testcshared/src/go2c2go/m2/main.go b/misc/cgo/testcshared/testdata/go2c2go/m2/main.go similarity index 100% rename from misc/cgo/testcshared/src/go2c2go/m2/main.go rename to misc/cgo/testcshared/testdata/go2c2go/m2/main.go diff --git a/misc/cgo/testcshared/src/libgo/libgo.go b/misc/cgo/testcshared/testdata/libgo/libgo.go similarity index 97% rename from misc/cgo/testcshared/src/libgo/libgo.go rename to misc/cgo/testcshared/testdata/libgo/libgo.go index 8a4bf795e9..063441766a 100644 --- a/misc/cgo/testcshared/src/libgo/libgo.go +++ b/misc/cgo/testcshared/testdata/libgo/libgo.go @@ -5,8 +5,8 @@ package main import ( - _ "p" "syscall" + _ "testcshared/p" "time" ) diff --git a/misc/cgo/testcshared/src/libgo2/dup2.go b/misc/cgo/testcshared/testdata/libgo2/dup2.go similarity index 100% rename from misc/cgo/testcshared/src/libgo2/dup2.go rename to misc/cgo/testcshared/testdata/libgo2/dup2.go diff --git a/misc/cgo/testcshared/src/libgo2/dup3.go b/misc/cgo/testcshared/testdata/libgo2/dup3.go similarity index 100% rename from misc/cgo/testcshared/src/libgo2/dup3.go rename to misc/cgo/testcshared/testdata/libgo2/dup3.go diff --git a/misc/cgo/testcshared/src/libgo2/libgo2.go b/misc/cgo/testcshared/testdata/libgo2/libgo2.go similarity index 100% rename from misc/cgo/testcshared/src/libgo2/libgo2.go rename to misc/cgo/testcshared/testdata/libgo2/libgo2.go diff --git a/misc/cgo/testcshared/src/libgo4/libgo4.go b/misc/cgo/testcshared/testdata/libgo4/libgo4.go similarity index 100% rename from misc/cgo/testcshared/src/libgo4/libgo4.go rename to misc/cgo/testcshared/testdata/libgo4/libgo4.go diff --git a/misc/cgo/testcshared/src/libgo5/libgo5.go b/misc/cgo/testcshared/testdata/libgo5/libgo5.go similarity index 100% rename from misc/cgo/testcshared/src/libgo5/libgo5.go rename to misc/cgo/testcshared/testdata/libgo5/libgo5.go diff --git a/misc/cgo/testcshared/main0.c b/misc/cgo/testcshared/testdata/main0.c similarity index 100% rename from misc/cgo/testcshared/main0.c rename to misc/cgo/testcshared/testdata/main0.c diff --git a/misc/cgo/testcshared/main1.c b/misc/cgo/testcshared/testdata/main1.c similarity index 100% rename from misc/cgo/testcshared/main1.c rename to misc/cgo/testcshared/testdata/main1.c diff --git a/misc/cgo/testcshared/main2.c b/misc/cgo/testcshared/testdata/main2.c similarity index 100% rename from misc/cgo/testcshared/main2.c rename to misc/cgo/testcshared/testdata/main2.c diff --git a/misc/cgo/testcshared/main3.c b/misc/cgo/testcshared/testdata/main3.c similarity index 100% rename from misc/cgo/testcshared/main3.c rename to misc/cgo/testcshared/testdata/main3.c diff --git a/misc/cgo/testcshared/main4.c b/misc/cgo/testcshared/testdata/main4.c similarity index 100% rename from misc/cgo/testcshared/main4.c rename to misc/cgo/testcshared/testdata/main4.c diff --git a/misc/cgo/testcshared/main5.c b/misc/cgo/testcshared/testdata/main5.c similarity index 100% rename from misc/cgo/testcshared/main5.c rename to misc/cgo/testcshared/testdata/main5.c diff --git a/misc/cgo/testcshared/src/p/p.go b/misc/cgo/testcshared/testdata/p/p.go similarity index 100% rename from misc/cgo/testcshared/src/p/p.go rename to misc/cgo/testcshared/testdata/p/p.go diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 30b4468b08..6392321091 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -695,7 +695,7 @@ func (t *tester) registerTests() { t.registerHostTest("testcarchive", "../misc/cgo/testcarchive", "misc/cgo/testcarchive", ".") } if t.supportedBuildmode("c-shared") { - t.registerHostTest("testcshared", "../misc/cgo/testcshared", "misc/cgo/testcshared", "cshared_test.go") + t.registerHostTest("testcshared", "../misc/cgo/testcshared", "misc/cgo/testcshared", ".") } if t.supportedBuildmode("shared") { t.registerTest("testshared", "../misc/cgo/testshared", t.goTest(), t.timeout(600)) -- GitLab From 8f1e2d4ef7c8d415b0a2e4ae08e16e4722c795d5 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 08:36:41 -0500 Subject: [PATCH 0062/1679] misc/cgo/testsanitizers: move test source files into testdata directory If we run 'go test ./...' in the misc module, we don't want to see errors for these standalone files. We could instead add +ignore tags to each file individually, but this is exactly what a testdata directory is for. Updates #30228 Change-Id: I7047ad888dd6aff701f5982d58b6a79f6a487c58 Reviewed-on: https://go-review.googlesource.com/c/163417 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- misc/cgo/testsanitizers/cc_test.go | 2 +- misc/cgo/testsanitizers/{src => testdata}/msan.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan2.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan2_cmsan.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan3.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan4.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan5.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan6.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan_fail.go | 0 misc/cgo/testsanitizers/{src => testdata}/msan_shared.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan10.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan11.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan12.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan2.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan3.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan4.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan5.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan6.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan7.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan8.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan9.go | 0 misc/cgo/testsanitizers/{src => testdata}/tsan_shared.go | 0 23 files changed, 1 insertion(+), 1 deletion(-) rename misc/cgo/testsanitizers/{src => testdata}/msan.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan2.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan2_cmsan.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan3.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan4.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan5.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan6.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan_fail.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/msan_shared.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan10.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan11.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan12.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan2.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan3.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan4.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan5.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan6.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan7.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan8.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan9.go (100%) rename misc/cgo/testsanitizers/{src => testdata}/tsan_shared.go (100%) diff --git a/misc/cgo/testsanitizers/cc_test.go b/misc/cgo/testsanitizers/cc_test.go index 218e225429..0192a663dd 100644 --- a/misc/cgo/testsanitizers/cc_test.go +++ b/misc/cgo/testsanitizers/cc_test.go @@ -394,7 +394,7 @@ func (c *config) checkRuntime() (skip bool, err error) { // srcPath returns the path to the given file relative to this test's source tree. func srcPath(path string) string { - return filepath.Join("src", path) + return filepath.Join("testdata", path) } // A tempDir manages a temporary directory within a test. diff --git a/misc/cgo/testsanitizers/src/msan.go b/misc/cgo/testsanitizers/testdata/msan.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan.go rename to misc/cgo/testsanitizers/testdata/msan.go diff --git a/misc/cgo/testsanitizers/src/msan2.go b/misc/cgo/testsanitizers/testdata/msan2.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan2.go rename to misc/cgo/testsanitizers/testdata/msan2.go diff --git a/misc/cgo/testsanitizers/src/msan2_cmsan.go b/misc/cgo/testsanitizers/testdata/msan2_cmsan.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan2_cmsan.go rename to misc/cgo/testsanitizers/testdata/msan2_cmsan.go diff --git a/misc/cgo/testsanitizers/src/msan3.go b/misc/cgo/testsanitizers/testdata/msan3.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan3.go rename to misc/cgo/testsanitizers/testdata/msan3.go diff --git a/misc/cgo/testsanitizers/src/msan4.go b/misc/cgo/testsanitizers/testdata/msan4.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan4.go rename to misc/cgo/testsanitizers/testdata/msan4.go diff --git a/misc/cgo/testsanitizers/src/msan5.go b/misc/cgo/testsanitizers/testdata/msan5.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan5.go rename to misc/cgo/testsanitizers/testdata/msan5.go diff --git a/misc/cgo/testsanitizers/src/msan6.go b/misc/cgo/testsanitizers/testdata/msan6.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan6.go rename to misc/cgo/testsanitizers/testdata/msan6.go diff --git a/misc/cgo/testsanitizers/src/msan_fail.go b/misc/cgo/testsanitizers/testdata/msan_fail.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan_fail.go rename to misc/cgo/testsanitizers/testdata/msan_fail.go diff --git a/misc/cgo/testsanitizers/src/msan_shared.go b/misc/cgo/testsanitizers/testdata/msan_shared.go similarity index 100% rename from misc/cgo/testsanitizers/src/msan_shared.go rename to misc/cgo/testsanitizers/testdata/msan_shared.go diff --git a/misc/cgo/testsanitizers/src/tsan.go b/misc/cgo/testsanitizers/testdata/tsan.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan.go rename to misc/cgo/testsanitizers/testdata/tsan.go diff --git a/misc/cgo/testsanitizers/src/tsan10.go b/misc/cgo/testsanitizers/testdata/tsan10.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan10.go rename to misc/cgo/testsanitizers/testdata/tsan10.go diff --git a/misc/cgo/testsanitizers/src/tsan11.go b/misc/cgo/testsanitizers/testdata/tsan11.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan11.go rename to misc/cgo/testsanitizers/testdata/tsan11.go diff --git a/misc/cgo/testsanitizers/src/tsan12.go b/misc/cgo/testsanitizers/testdata/tsan12.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan12.go rename to misc/cgo/testsanitizers/testdata/tsan12.go diff --git a/misc/cgo/testsanitizers/src/tsan2.go b/misc/cgo/testsanitizers/testdata/tsan2.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan2.go rename to misc/cgo/testsanitizers/testdata/tsan2.go diff --git a/misc/cgo/testsanitizers/src/tsan3.go b/misc/cgo/testsanitizers/testdata/tsan3.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan3.go rename to misc/cgo/testsanitizers/testdata/tsan3.go diff --git a/misc/cgo/testsanitizers/src/tsan4.go b/misc/cgo/testsanitizers/testdata/tsan4.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan4.go rename to misc/cgo/testsanitizers/testdata/tsan4.go diff --git a/misc/cgo/testsanitizers/src/tsan5.go b/misc/cgo/testsanitizers/testdata/tsan5.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan5.go rename to misc/cgo/testsanitizers/testdata/tsan5.go diff --git a/misc/cgo/testsanitizers/src/tsan6.go b/misc/cgo/testsanitizers/testdata/tsan6.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan6.go rename to misc/cgo/testsanitizers/testdata/tsan6.go diff --git a/misc/cgo/testsanitizers/src/tsan7.go b/misc/cgo/testsanitizers/testdata/tsan7.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan7.go rename to misc/cgo/testsanitizers/testdata/tsan7.go diff --git a/misc/cgo/testsanitizers/src/tsan8.go b/misc/cgo/testsanitizers/testdata/tsan8.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan8.go rename to misc/cgo/testsanitizers/testdata/tsan8.go diff --git a/misc/cgo/testsanitizers/src/tsan9.go b/misc/cgo/testsanitizers/testdata/tsan9.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan9.go rename to misc/cgo/testsanitizers/testdata/tsan9.go diff --git a/misc/cgo/testsanitizers/src/tsan_shared.go b/misc/cgo/testsanitizers/testdata/tsan_shared.go similarity index 100% rename from misc/cgo/testsanitizers/src/tsan_shared.go rename to misc/cgo/testsanitizers/testdata/tsan_shared.go -- GitLab From 3726d91d680b20d147f5b0b6222232d10930d121 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 12:00:12 -0500 Subject: [PATCH 0063/1679] cmd/go/internal/imports: use the full path to resolve symlinks info.Name returns a name relative to the directory, so we need to prefix that directory in the Stat call. (This was missed in CL 141097 due to the fact that the test only happened to check symlinks in the current directory.) This allows the misc/ tests to work in module mode on platforms that support symlinks. Updates #30228 Updates #28107 Change-Id: Ie31836382df0cbd7d203b7a8b637c4743d68b6f3 Reviewed-on: https://go-review.googlesource.com/c/163517 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/imports/scan.go | 2 +- src/cmd/go/testdata/script/mod_symlink.txt | 29 ++++++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/internal/imports/scan.go b/src/cmd/go/internal/imports/scan.go index 966a38cfef..3d9b6132b1 100644 --- a/src/cmd/go/internal/imports/scan.go +++ b/src/cmd/go/internal/imports/scan.go @@ -26,7 +26,7 @@ func ScanDir(dir string, tags map[string]bool) ([]string, []string, error) { // If the directory entry is a symlink, stat it to obtain the info for the // link target instead of the link itself. if info.Mode()&os.ModeSymlink != 0 { - info, err = os.Stat(name) + info, err = os.Stat(filepath.Join(dir, name)) if err != nil { continue // Ignore broken symlinks. } diff --git a/src/cmd/go/testdata/script/mod_symlink.txt b/src/cmd/go/testdata/script/mod_symlink.txt index 61da3cc355..49bece2b84 100644 --- a/src/cmd/go/testdata/script/mod_symlink.txt +++ b/src/cmd/go/testdata/script/mod_symlink.txt @@ -2,16 +2,31 @@ env GO111MODULE=on [!symlink] skip # 'go list' should resolve modules of imported packages. -go list -deps -f '{{.Module}}' +go list -deps -f '{{.Module}}' . stdout golang.org/x/text -# They should continue to resolve if the importing file is a symlink. +go list -deps -f '{{.Module}}' ./subpkg +stdout golang.org/x/text + +# Create a copy of the module using symlinks in src/links. mkdir links +symlink links/go.mod -> $GOPATH/src/go.mod +symlink links/issue.go -> $GOPATH/src/issue.go +mkdir links/subpkg +symlink links/subpkg/issue.go -> $GOPATH/src/subpkg/issue.go + +# We should see the copy as a valid module root. cd links -symlink go.mod -> ../go.mod -symlink issue.go -> ../issue.go +go env GOMOD +stdout links[/\\]go.mod +go list -m +stdout golang.org/issue/28107 -go list -deps -f '{{.Module}}' +# The symlink-based copy should contain the same packages +# and have the same dependencies as the original. +go list -deps -f '{{.Module}}' . +stdout golang.org/x/text +go list -deps -f '{{.Module}}' ./subpkg stdout golang.org/x/text -- go.mod -- @@ -21,3 +36,7 @@ module golang.org/issue/28107 package issue import _ "golang.org/x/text/language" +-- subpkg/issue.go -- +package issue + +import _ "golang.org/x/text/language" -- GitLab From 551af5f50a29366260e82fc636c7c6def50b1101 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 10:17:22 -0500 Subject: [PATCH 0064/1679] misc/cgo/test: fix tests in module mode This change preserves the ability to test misc/cgo/test in GOPATH mode, at the cost of indirection through a 'go test' subprocess. Updates #30228 Change-Id: I08de855e62278d30fa622b2f7478e43dd2ab0e96 Reviewed-on: https://go-review.googlesource.com/c/163418 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/callback.go | 4 + misc/cgo/test/cgo_linux_test.go | 1 - misc/cgo/test/cgo_test.go | 96 +++++++++---------- misc/cgo/test/overlaydir_test.go | 81 ++++++++++++++++ misc/cgo/test/pkg_test.go | 58 +++++++++++ misc/cgo/test/testdata/cgo_linux_test.go | 9 ++ misc/cgo/test/testdata/cgo_test.go | 18 ++++ misc/cgo/test/{ => testdata}/gcc68255.go | 2 +- misc/cgo/test/{ => testdata}/gcc68255/a.go | 0 misc/cgo/test/{ => testdata}/gcc68255/c.c | 0 misc/cgo/test/{ => testdata}/gcc68255/c.h | 0 misc/cgo/test/{ => testdata}/issue20266.go | 0 .../{ => testdata}/issue20266/issue20266.h | 0 misc/cgo/test/{ => testdata}/issue23555.go | 4 +- misc/cgo/test/{ => testdata}/issue23555a/a.go | 0 misc/cgo/test/{ => testdata}/issue23555b/a.go | 0 .../{ => testdata}/issue24161_darwin_test.go | 10 +- .../test/{ => testdata}/issue24161arg/def.go | 0 .../test/{ => testdata}/issue24161arg/use.go | 0 .../test/{ => testdata}/issue24161e0/main.go | 0 .../test/{ => testdata}/issue24161e1/main.go | 0 .../test/{ => testdata}/issue24161e2/main.go | 0 .../{ => testdata}/issue24161res/restype.go | 0 misc/cgo/test/{ => testdata}/issue26213/jni.h | 0 .../{ => testdata}/issue26213/test26213.go | 0 misc/cgo/test/{ => testdata}/issue26430.go | 2 +- misc/cgo/test/{ => testdata}/issue26430/a.go | 0 misc/cgo/test/{ => testdata}/issue26430/b.go | 0 misc/cgo/test/{ => testdata}/issue26743.go | 2 +- misc/cgo/test/{ => testdata}/issue26743/a.go | 0 misc/cgo/test/{ => testdata}/issue26743/b.go | 0 misc/cgo/test/{ => testdata}/issue27054/egl.h | 0 .../{ => testdata}/issue27054/test27054.go | 0 misc/cgo/test/{ => testdata}/issue27340.go | 2 +- misc/cgo/test/{ => testdata}/issue27340/a.go | 0 misc/cgo/test/{ => testdata}/issue8756.go | 2 +- .../{ => testdata}/issue8756/issue8756.go | 0 misc/cgo/test/{ => testdata}/issue8828.go | 2 +- .../test/{ => testdata}/issue8828/issue8828.c | 0 .../test/{ => testdata}/issue8828/trivial.go | 0 misc/cgo/test/{ => testdata}/issue9026.go | 2 +- .../{ => testdata}/issue9026/issue9026.go | 0 .../test/{ => testdata}/issue9400/asm_386.s | 0 .../{ => testdata}/issue9400/asm_amd64x.s | 0 .../test/{ => testdata}/issue9400/asm_arm.s | 0 .../test/{ => testdata}/issue9400/asm_arm64.s | 0 .../{ => testdata}/issue9400/asm_mips64x.s | 0 .../test/{ => testdata}/issue9400/asm_mipsx.s | 0 .../{ => testdata}/issue9400/asm_ppc64x.s | 0 .../test/{ => testdata}/issue9400/asm_s390x.s | 0 .../test/{ => testdata}/issue9400/gccgo.go | 0 .../test/{ => testdata}/issue9400/stubs.go | 0 .../test/{ => testdata}/issue9400_linux.go | 2 +- misc/cgo/test/{ => testdata}/issue9510.go | 4 +- misc/cgo/test/{ => testdata}/issue9510a/a.go | 0 misc/cgo/test/{ => testdata}/issue9510b/b.go | 0 misc/cgo/test/{ => testdata}/test26213.go | 2 +- 57 files changed, 233 insertions(+), 70 deletions(-) create mode 100644 misc/cgo/test/overlaydir_test.go create mode 100644 misc/cgo/test/pkg_test.go create mode 100644 misc/cgo/test/testdata/cgo_linux_test.go create mode 100644 misc/cgo/test/testdata/cgo_test.go rename misc/cgo/test/{ => testdata}/gcc68255.go (93%) rename misc/cgo/test/{ => testdata}/gcc68255/a.go (100%) rename misc/cgo/test/{ => testdata}/gcc68255/c.c (100%) rename misc/cgo/test/{ => testdata}/gcc68255/c.h (100%) rename misc/cgo/test/{ => testdata}/issue20266.go (100%) rename misc/cgo/test/{ => testdata}/issue20266/issue20266.h (100%) rename misc/cgo/test/{ => testdata}/issue23555.go (82%) rename misc/cgo/test/{ => testdata}/issue23555a/a.go (100%) rename misc/cgo/test/{ => testdata}/issue23555b/a.go (100%) rename misc/cgo/test/{ => testdata}/issue24161_darwin_test.go (85%) rename misc/cgo/test/{ => testdata}/issue24161arg/def.go (100%) rename misc/cgo/test/{ => testdata}/issue24161arg/use.go (100%) rename misc/cgo/test/{ => testdata}/issue24161e0/main.go (100%) rename misc/cgo/test/{ => testdata}/issue24161e1/main.go (100%) rename misc/cgo/test/{ => testdata}/issue24161e2/main.go (100%) rename misc/cgo/test/{ => testdata}/issue24161res/restype.go (100%) rename misc/cgo/test/{ => testdata}/issue26213/jni.h (100%) rename misc/cgo/test/{ => testdata}/issue26213/test26213.go (100%) rename misc/cgo/test/{ => testdata}/issue26430.go (90%) rename misc/cgo/test/{ => testdata}/issue26430/a.go (100%) rename misc/cgo/test/{ => testdata}/issue26430/b.go (100%) rename misc/cgo/test/{ => testdata}/issue26743.go (90%) rename misc/cgo/test/{ => testdata}/issue26743/a.go (100%) rename misc/cgo/test/{ => testdata}/issue26743/b.go (100%) rename misc/cgo/test/{ => testdata}/issue27054/egl.h (100%) rename misc/cgo/test/{ => testdata}/issue27054/test27054.go (100%) rename misc/cgo/test/{ => testdata}/issue27340.go (91%) rename misc/cgo/test/{ => testdata}/issue27340/a.go (100%) rename misc/cgo/test/{ => testdata}/issue8756.go (88%) rename misc/cgo/test/{ => testdata}/issue8756/issue8756.go (100%) rename misc/cgo/test/{ => testdata}/issue8828.go (92%) rename misc/cgo/test/{ => testdata}/issue8828/issue8828.c (100%) rename misc/cgo/test/{ => testdata}/issue8828/trivial.go (100%) rename misc/cgo/test/{ => testdata}/issue9026.go (81%) rename misc/cgo/test/{ => testdata}/issue9026/issue9026.go (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_386.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_amd64x.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_arm.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_arm64.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_mips64x.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_mipsx.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_ppc64x.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/asm_s390x.s (100%) rename misc/cgo/test/{ => testdata}/issue9400/gccgo.go (100%) rename misc/cgo/test/{ => testdata}/issue9400/stubs.go (100%) rename misc/cgo/test/{ => testdata}/issue9400_linux.go (98%) rename misc/cgo/test/{ => testdata}/issue9510.go (91%) rename misc/cgo/test/{ => testdata}/issue9510a/a.go (100%) rename misc/cgo/test/{ => testdata}/issue9510b/b.go (100%) rename misc/cgo/test/{ => testdata}/test26213.go (92%) diff --git a/misc/cgo/test/callback.go b/misc/cgo/test/callback.go index 4fc6b39ffa..d48aeaabd9 100644 --- a/misc/cgo/test/callback.go +++ b/misc/cgo/test/callback.go @@ -209,6 +209,10 @@ func testCallbackCallers(t *testing.T) { if strings.HasPrefix(fname, "_") { fname = path.Base(f.Name()[1:]) } + // In module mode, this package has a fully-qualified import path. + // Remove it if present. + fname = strings.TrimPrefix(fname, "misc/cgo/") + namei := "" if i < len(name) { namei = name[i] diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go index 9c15f69e40..c2e96b5387 100644 --- a/misc/cgo/test/cgo_linux_test.go +++ b/misc/cgo/test/cgo_linux_test.go @@ -9,4 +9,3 @@ import "testing" func TestSetgid(t *testing.T) { testSetgid(t) } func Test6997(t *testing.T) { test6997(t) } func TestBuildID(t *testing.T) { testBuildID(t) } -func Test9400(t *testing.T) { test9400(t) } diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 2cb93d9c2e..2d6d269608 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -10,91 +10,85 @@ import "testing" // so that they can use cgo (import "C"). // These wrappers are here for gotest to find. -func TestAlign(t *testing.T) { testAlign(t) } -func TestConst(t *testing.T) { testConst(t) } -func TestEnum(t *testing.T) { testEnum(t) } -func TestAtol(t *testing.T) { testAtol(t) } -func TestErrno(t *testing.T) { testErrno(t) } -func TestMultipleAssign(t *testing.T) { testMultipleAssign(t) } -func TestUnsignedInt(t *testing.T) { testUnsignedInt(t) } -func TestCallback(t *testing.T) { testCallback(t) } -func TestCallbackGC(t *testing.T) { testCallbackGC(t) } -func TestCallbackPanic(t *testing.T) { testCallbackPanic(t) } -func TestCallbackPanicLoop(t *testing.T) { testCallbackPanicLoop(t) } -func TestCallbackPanicLocked(t *testing.T) { testCallbackPanicLocked(t) } -func TestPanicFromC(t *testing.T) { testPanicFromC(t) } -func TestZeroArgCallback(t *testing.T) { testZeroArgCallback(t) } -func TestBlocking(t *testing.T) { testBlocking(t) } func Test1328(t *testing.T) { test1328(t) } -func TestParallelSleep(t *testing.T) { testParallelSleep(t) } -func TestSetEnv(t *testing.T) { testSetEnv(t) } -func TestHelpers(t *testing.T) { testHelpers(t) } -func TestLibgcc(t *testing.T) { testLibgcc(t) } func Test1635(t *testing.T) { test1635(t) } -func TestPrintf(t *testing.T) { testPrintf(t) } -func Test4029(t *testing.T) { test4029(t) } -func TestBoolAlign(t *testing.T) { testBoolAlign(t) } +func Test3250(t *testing.T) { test3250(t) } func Test3729(t *testing.T) { test3729(t) } func Test3775(t *testing.T) { test3775(t) } -func TestCthread(t *testing.T) { testCthread(t) } -func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) } +func Test4029(t *testing.T) { test4029(t) } +func Test4339(t *testing.T) { test4339(t) } func Test5227(t *testing.T) { test5227(t) } -func TestCflags(t *testing.T) { testCflags(t) } +func Test5242(t *testing.T) { test5242(t) } func Test5337(t *testing.T) { test5337(t) } func Test5548(t *testing.T) { test5548(t) } func Test5603(t *testing.T) { test5603(t) } -func Test6833(t *testing.T) { test6833(t) } -func Test3250(t *testing.T) { test3250(t) } -func TestCallbackStack(t *testing.T) { testCallbackStack(t) } -func TestFpVar(t *testing.T) { testFpVar(t) } -func Test4339(t *testing.T) { test4339(t) } -func Test6390(t *testing.T) { test6390(t) } func Test5986(t *testing.T) { test5986(t) } -func Test7665(t *testing.T) { test7665(t) } -func TestNaming(t *testing.T) { testNaming(t) } +func Test6390(t *testing.T) { test6390(t) } +func Test6833(t *testing.T) { test6833(t) } +func Test6907(t *testing.T) { test6907(t) } +func Test6907Go(t *testing.T) { test6907Go(t) } func Test7560(t *testing.T) { test7560(t) } -func Test5242(t *testing.T) { test5242(t) } -func Test8092(t *testing.T) { test8092(t) } +func Test7665(t *testing.T) { test7665(t) } func Test7978(t *testing.T) { test7978(t) } -func Test8694(t *testing.T) { test8694(t) } +func Test8092(t *testing.T) { test8092(t) } func Test8517(t *testing.T) { test8517(t) } +func Test8694(t *testing.T) { test8694(t) } func Test8811(t *testing.T) { test8811(t) } -func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) } -func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) } -func Test9026(t *testing.T) { test9026(t) } -func Test9510(t *testing.T) { test9510(t) } func Test9557(t *testing.T) { test9557(t) } func Test10303(t *testing.T) { test10303(t, 10) } func Test11925(t *testing.T) { test11925(t) } func Test12030(t *testing.T) { test12030(t) } -func TestGCC68255(t *testing.T) { testGCC68255(t) } -func TestCallGoWithString(t *testing.T) { testCallGoWithString(t) } func Test14838(t *testing.T) { test14838(t) } -func Test8756(t *testing.T) { test8756(t) } func Test17065(t *testing.T) { test17065(t) } -func TestThreadLock(t *testing.T) { testThreadLockFunc(t) } -func TestCheckConst(t *testing.T) { testCheckConst(t) } func Test17537(t *testing.T) { test17537(t) } func Test18126(t *testing.T) { test18126(t) } -func Test20369(t *testing.T) { test20369(t) } func Test18720(t *testing.T) { test18720(t) } -func Test20266(t *testing.T) { test20266(t) } func Test20129(t *testing.T) { test20129(t) } +func Test20369(t *testing.T) { test20369(t) } func Test20910(t *testing.T) { test20910(t) } func Test21708(t *testing.T) { test21708(t) } func Test21809(t *testing.T) { test21809(t) } -func Test6907(t *testing.T) { test6907(t) } -func Test6907Go(t *testing.T) { test6907Go(t) } func Test21897(t *testing.T) { test21897(t) } func Test22906(t *testing.T) { test22906(t) } +func Test23356(t *testing.T) { test23356(t) } func Test24206(t *testing.T) { test24206(t) } func Test25143(t *testing.T) { test25143(t) } -func Test23356(t *testing.T) { test23356(t) } func Test26066(t *testing.T) { test26066(t) } -func Test26213(t *testing.T) { test26213(t) } func Test27660(t *testing.T) { test27660(t) } func Test28896(t *testing.T) { test28896(t) } func Test30065(t *testing.T) { test30065(t) } +func TestAlign(t *testing.T) { testAlign(t) } +func TestAtol(t *testing.T) { testAtol(t) } +func TestBlocking(t *testing.T) { testBlocking(t) } +func TestBoolAlign(t *testing.T) { testBoolAlign(t) } +func TestCallGoWithString(t *testing.T) { testCallGoWithString(t) } +func TestCallback(t *testing.T) { testCallback(t) } +func TestCallbackCallers(t *testing.T) { testCallbackCallers(t) } +func TestCallbackGC(t *testing.T) { testCallbackGC(t) } +func TestCallbackPanic(t *testing.T) { testCallbackPanic(t) } +func TestCallbackPanicLocked(t *testing.T) { testCallbackPanicLocked(t) } +func TestCallbackPanicLoop(t *testing.T) { testCallbackPanicLoop(t) } +func TestCallbackStack(t *testing.T) { testCallbackStack(t) } +func TestCflags(t *testing.T) { testCflags(t) } +func TestCheckConst(t *testing.T) { testCheckConst(t) } +func TestConst(t *testing.T) { testConst(t) } +func TestCthread(t *testing.T) { testCthread(t) } +func TestEnum(t *testing.T) { testEnum(t) } +func TestErrno(t *testing.T) { testErrno(t) } +func TestFpVar(t *testing.T) { testFpVar(t) } +func TestHelpers(t *testing.T) { testHelpers(t) } +func TestLibgcc(t *testing.T) { testLibgcc(t) } +func TestMultipleAssign(t *testing.T) { testMultipleAssign(t) } +func TestNaming(t *testing.T) { testNaming(t) } +func TestPanicFromC(t *testing.T) { testPanicFromC(t) } +func TestParallelSleep(t *testing.T) { testParallelSleep(t) } +func TestPrintf(t *testing.T) { testPrintf(t) } +func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) } +func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) } +func TestSetEnv(t *testing.T) { testSetEnv(t) } +func TestThreadLock(t *testing.T) { testThreadLockFunc(t) } +func TestUnsignedInt(t *testing.T) { testUnsignedInt(t) } +func TestZeroArgCallback(t *testing.T) { testZeroArgCallback(t) } func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) } func BenchmarkGoString(b *testing.B) { benchGoString(b) } diff --git a/misc/cgo/test/overlaydir_test.go b/misc/cgo/test/overlaydir_test.go new file mode 100644 index 0000000000..1b5c67de70 --- /dev/null +++ b/misc/cgo/test/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 cgotest + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/test/pkg_test.go b/misc/cgo/test/pkg_test.go new file mode 100644 index 0000000000..9c8a61e871 --- /dev/null +++ b/misc/cgo/test/pkg_test.go @@ -0,0 +1,58 @@ +// Copyright 2019 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 cgotest + +import ( + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +// TestCrossPackageTests compiles and runs tests that depend on imports of other +// local packages, using source code stored in the testdata directory. +// +// The tests in the misc directory tree do not have a valid import path in +// GOPATH mode, so they previously used relative imports. However, relative +// imports do not work in module mode. In order to make the test work in both +// modes, we synthesize a GOPATH in which the module paths are equivalent, and +// run the tests as a subprocess. +// +// If and when we no longer support these tests in GOPATH mode, we can remove +// this shim and move the tests currently located in testdata back into the +// parent directory. +func TestCrossPackageTests(t *testing.T) { + GOPATH, err := ioutil.TempDir("", "cgotest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(GOPATH) + + modRoot := filepath.Join(GOPATH, "src", "cgotest") + if err := overlayDir(modRoot, "testdata"); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgotest\n"), 0666); err != nil { + t.Fatal(err) + } + + cmd := exec.Command("go", "test") + if testing.Verbose() { + cmd.Args = append(cmd.Args, "-v") + } + if testing.Short() { + cmd.Args = append(cmd.Args, "-short") + } + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err := cmd.CombinedOutput() + if err == nil { + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + } else { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } +} diff --git a/misc/cgo/test/testdata/cgo_linux_test.go b/misc/cgo/test/testdata/cgo_linux_test.go new file mode 100644 index 0000000000..5cef09fbe7 --- /dev/null +++ b/misc/cgo/test/testdata/cgo_linux_test.go @@ -0,0 +1,9 @@ +// Copyright 2012 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 cgotest + +import "testing" + +func Test9400(t *testing.T) { test9400(t) } diff --git a/misc/cgo/test/testdata/cgo_test.go b/misc/cgo/test/testdata/cgo_test.go new file mode 100644 index 0000000000..ffa076f4ee --- /dev/null +++ b/misc/cgo/test/testdata/cgo_test.go @@ -0,0 +1,18 @@ +// Copyright 2011 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 cgotest + +import "testing" + +// The actual test functions are in non-_test.go files +// so that they can use cgo (import "C"). +// These wrappers are here for gotest to find. + +func Test8756(t *testing.T) { test8756(t) } +func Test9026(t *testing.T) { test9026(t) } +func Test9510(t *testing.T) { test9510(t) } +func Test20266(t *testing.T) { test20266(t) } +func Test26213(t *testing.T) { test26213(t) } +func TestGCC68255(t *testing.T) { testGCC68255(t) } diff --git a/misc/cgo/test/gcc68255.go b/misc/cgo/test/testdata/gcc68255.go similarity index 93% rename from misc/cgo/test/gcc68255.go rename to misc/cgo/test/testdata/gcc68255.go index 23e103dc10..b431462349 100644 --- a/misc/cgo/test/gcc68255.go +++ b/misc/cgo/test/testdata/gcc68255.go @@ -7,7 +7,7 @@ package cgotest import ( "testing" - "./gcc68255" + "cgotest/gcc68255" ) func testGCC68255(t *testing.T) { diff --git a/misc/cgo/test/gcc68255/a.go b/misc/cgo/test/testdata/gcc68255/a.go similarity index 100% rename from misc/cgo/test/gcc68255/a.go rename to misc/cgo/test/testdata/gcc68255/a.go diff --git a/misc/cgo/test/gcc68255/c.c b/misc/cgo/test/testdata/gcc68255/c.c similarity index 100% rename from misc/cgo/test/gcc68255/c.c rename to misc/cgo/test/testdata/gcc68255/c.c diff --git a/misc/cgo/test/gcc68255/c.h b/misc/cgo/test/testdata/gcc68255/c.h similarity index 100% rename from misc/cgo/test/gcc68255/c.h rename to misc/cgo/test/testdata/gcc68255/c.h diff --git a/misc/cgo/test/issue20266.go b/misc/cgo/test/testdata/issue20266.go similarity index 100% rename from misc/cgo/test/issue20266.go rename to misc/cgo/test/testdata/issue20266.go diff --git a/misc/cgo/test/issue20266/issue20266.h b/misc/cgo/test/testdata/issue20266/issue20266.h similarity index 100% rename from misc/cgo/test/issue20266/issue20266.h rename to misc/cgo/test/testdata/issue20266/issue20266.h diff --git a/misc/cgo/test/issue23555.go b/misc/cgo/test/testdata/issue23555.go similarity index 82% rename from misc/cgo/test/issue23555.go rename to misc/cgo/test/testdata/issue23555.go index 5fa44e6355..4e944b5acd 100644 --- a/misc/cgo/test/issue23555.go +++ b/misc/cgo/test/testdata/issue23555.go @@ -7,5 +7,5 @@ package cgotest -import _ "./issue23555a" -import _ "./issue23555b" +import _ "cgotest/issue23555a" +import _ "cgotest/issue23555b" diff --git a/misc/cgo/test/issue23555a/a.go b/misc/cgo/test/testdata/issue23555a/a.go similarity index 100% rename from misc/cgo/test/issue23555a/a.go rename to misc/cgo/test/testdata/issue23555a/a.go diff --git a/misc/cgo/test/issue23555b/a.go b/misc/cgo/test/testdata/issue23555b/a.go similarity index 100% rename from misc/cgo/test/issue23555b/a.go rename to misc/cgo/test/testdata/issue23555b/a.go diff --git a/misc/cgo/test/issue24161_darwin_test.go b/misc/cgo/test/testdata/issue24161_darwin_test.go similarity index 85% rename from misc/cgo/test/issue24161_darwin_test.go rename to misc/cgo/test/testdata/issue24161_darwin_test.go index 48072ff121..64f4442856 100644 --- a/misc/cgo/test/issue24161_darwin_test.go +++ b/misc/cgo/test/testdata/issue24161_darwin_test.go @@ -15,11 +15,11 @@ package cgotest import ( "testing" - "./issue24161arg" - "./issue24161e0" - "./issue24161e1" - "./issue24161e2" - "./issue24161res" + "cgotest/issue24161arg" + "cgotest/issue24161e0" + "cgotest/issue24161e1" + "cgotest/issue24161e2" + "cgotest/issue24161res" ) func Test24161Arg(t *testing.T) { diff --git a/misc/cgo/test/issue24161arg/def.go b/misc/cgo/test/testdata/issue24161arg/def.go similarity index 100% rename from misc/cgo/test/issue24161arg/def.go rename to misc/cgo/test/testdata/issue24161arg/def.go diff --git a/misc/cgo/test/issue24161arg/use.go b/misc/cgo/test/testdata/issue24161arg/use.go similarity index 100% rename from misc/cgo/test/issue24161arg/use.go rename to misc/cgo/test/testdata/issue24161arg/use.go diff --git a/misc/cgo/test/issue24161e0/main.go b/misc/cgo/test/testdata/issue24161e0/main.go similarity index 100% rename from misc/cgo/test/issue24161e0/main.go rename to misc/cgo/test/testdata/issue24161e0/main.go diff --git a/misc/cgo/test/issue24161e1/main.go b/misc/cgo/test/testdata/issue24161e1/main.go similarity index 100% rename from misc/cgo/test/issue24161e1/main.go rename to misc/cgo/test/testdata/issue24161e1/main.go diff --git a/misc/cgo/test/issue24161e2/main.go b/misc/cgo/test/testdata/issue24161e2/main.go similarity index 100% rename from misc/cgo/test/issue24161e2/main.go rename to misc/cgo/test/testdata/issue24161e2/main.go diff --git a/misc/cgo/test/issue24161res/restype.go b/misc/cgo/test/testdata/issue24161res/restype.go similarity index 100% rename from misc/cgo/test/issue24161res/restype.go rename to misc/cgo/test/testdata/issue24161res/restype.go diff --git a/misc/cgo/test/issue26213/jni.h b/misc/cgo/test/testdata/issue26213/jni.h similarity index 100% rename from misc/cgo/test/issue26213/jni.h rename to misc/cgo/test/testdata/issue26213/jni.h diff --git a/misc/cgo/test/issue26213/test26213.go b/misc/cgo/test/testdata/issue26213/test26213.go similarity index 100% rename from misc/cgo/test/issue26213/test26213.go rename to misc/cgo/test/testdata/issue26213/test26213.go diff --git a/misc/cgo/test/issue26430.go b/misc/cgo/test/testdata/issue26430.go similarity index 90% rename from misc/cgo/test/issue26430.go rename to misc/cgo/test/testdata/issue26430.go index 3ad5420989..14c7a7c307 100644 --- a/misc/cgo/test/issue26430.go +++ b/misc/cgo/test/testdata/issue26430.go @@ -7,4 +7,4 @@ package cgotest -import _ "./issue26430" +import _ "cgotest/issue26430" diff --git a/misc/cgo/test/issue26430/a.go b/misc/cgo/test/testdata/issue26430/a.go similarity index 100% rename from misc/cgo/test/issue26430/a.go rename to misc/cgo/test/testdata/issue26430/a.go diff --git a/misc/cgo/test/issue26430/b.go b/misc/cgo/test/testdata/issue26430/b.go similarity index 100% rename from misc/cgo/test/issue26430/b.go rename to misc/cgo/test/testdata/issue26430/b.go diff --git a/misc/cgo/test/issue26743.go b/misc/cgo/test/testdata/issue26743.go similarity index 90% rename from misc/cgo/test/issue26743.go rename to misc/cgo/test/testdata/issue26743.go index 35c8473a61..000fb2bfdf 100644 --- a/misc/cgo/test/issue26743.go +++ b/misc/cgo/test/testdata/issue26743.go @@ -7,4 +7,4 @@ package cgotest -import _ "./issue26743" +import _ "cgotest/issue26743" diff --git a/misc/cgo/test/issue26743/a.go b/misc/cgo/test/testdata/issue26743/a.go similarity index 100% rename from misc/cgo/test/issue26743/a.go rename to misc/cgo/test/testdata/issue26743/a.go diff --git a/misc/cgo/test/issue26743/b.go b/misc/cgo/test/testdata/issue26743/b.go similarity index 100% rename from misc/cgo/test/issue26743/b.go rename to misc/cgo/test/testdata/issue26743/b.go diff --git a/misc/cgo/test/issue27054/egl.h b/misc/cgo/test/testdata/issue27054/egl.h similarity index 100% rename from misc/cgo/test/issue27054/egl.h rename to misc/cgo/test/testdata/issue27054/egl.h diff --git a/misc/cgo/test/issue27054/test27054.go b/misc/cgo/test/testdata/issue27054/test27054.go similarity index 100% rename from misc/cgo/test/issue27054/test27054.go rename to misc/cgo/test/testdata/issue27054/test27054.go diff --git a/misc/cgo/test/issue27340.go b/misc/cgo/test/testdata/issue27340.go similarity index 91% rename from misc/cgo/test/issue27340.go rename to misc/cgo/test/testdata/issue27340.go index f8c8a87f20..337550f608 100644 --- a/misc/cgo/test/issue27340.go +++ b/misc/cgo/test/testdata/issue27340.go @@ -7,6 +7,6 @@ package cgotest -import "./issue27340" +import "cgotest/issue27340" var issue27340Var = issue27340.Issue27340GoFunc diff --git a/misc/cgo/test/issue27340/a.go b/misc/cgo/test/testdata/issue27340/a.go similarity index 100% rename from misc/cgo/test/issue27340/a.go rename to misc/cgo/test/testdata/issue27340/a.go diff --git a/misc/cgo/test/issue8756.go b/misc/cgo/test/testdata/issue8756.go similarity index 88% rename from misc/cgo/test/issue8756.go rename to misc/cgo/test/testdata/issue8756.go index d8ee3b8213..406c64c0f3 100644 --- a/misc/cgo/test/issue8756.go +++ b/misc/cgo/test/testdata/issue8756.go @@ -8,7 +8,7 @@ import "C" import ( "testing" - "./issue8756" + "cgotest/issue8756" ) func test8756(t *testing.T) { diff --git a/misc/cgo/test/issue8756/issue8756.go b/misc/cgo/test/testdata/issue8756/issue8756.go similarity index 100% rename from misc/cgo/test/issue8756/issue8756.go rename to misc/cgo/test/testdata/issue8756/issue8756.go diff --git a/misc/cgo/test/issue8828.go b/misc/cgo/test/testdata/issue8828.go similarity index 92% rename from misc/cgo/test/issue8828.go rename to misc/cgo/test/testdata/issue8828.go index 304797c929..0bca0f25cf 100644 --- a/misc/cgo/test/issue8828.go +++ b/misc/cgo/test/testdata/issue8828.go @@ -9,7 +9,7 @@ package cgotest -import "./issue8828" +import "cgotest/issue8828" func p() { issue8828.Bar() diff --git a/misc/cgo/test/issue8828/issue8828.c b/misc/cgo/test/testdata/issue8828/issue8828.c similarity index 100% rename from misc/cgo/test/issue8828/issue8828.c rename to misc/cgo/test/testdata/issue8828/issue8828.c diff --git a/misc/cgo/test/issue8828/trivial.go b/misc/cgo/test/testdata/issue8828/trivial.go similarity index 100% rename from misc/cgo/test/issue8828/trivial.go rename to misc/cgo/test/testdata/issue8828/trivial.go diff --git a/misc/cgo/test/issue9026.go b/misc/cgo/test/testdata/issue9026.go similarity index 81% rename from misc/cgo/test/issue9026.go rename to misc/cgo/test/testdata/issue9026.go index 8848d0e811..3f48881655 100644 --- a/misc/cgo/test/issue9026.go +++ b/misc/cgo/test/testdata/issue9026.go @@ -3,7 +3,7 @@ package cgotest import ( "testing" - "./issue9026" + "cgotest/issue9026" ) func test9026(t *testing.T) { issue9026.Test(t) } diff --git a/misc/cgo/test/issue9026/issue9026.go b/misc/cgo/test/testdata/issue9026/issue9026.go similarity index 100% rename from misc/cgo/test/issue9026/issue9026.go rename to misc/cgo/test/testdata/issue9026/issue9026.go diff --git a/misc/cgo/test/issue9400/asm_386.s b/misc/cgo/test/testdata/issue9400/asm_386.s similarity index 100% rename from misc/cgo/test/issue9400/asm_386.s rename to misc/cgo/test/testdata/issue9400/asm_386.s diff --git a/misc/cgo/test/issue9400/asm_amd64x.s b/misc/cgo/test/testdata/issue9400/asm_amd64x.s similarity index 100% rename from misc/cgo/test/issue9400/asm_amd64x.s rename to misc/cgo/test/testdata/issue9400/asm_amd64x.s diff --git a/misc/cgo/test/issue9400/asm_arm.s b/misc/cgo/test/testdata/issue9400/asm_arm.s similarity index 100% rename from misc/cgo/test/issue9400/asm_arm.s rename to misc/cgo/test/testdata/issue9400/asm_arm.s diff --git a/misc/cgo/test/issue9400/asm_arm64.s b/misc/cgo/test/testdata/issue9400/asm_arm64.s similarity index 100% rename from misc/cgo/test/issue9400/asm_arm64.s rename to misc/cgo/test/testdata/issue9400/asm_arm64.s diff --git a/misc/cgo/test/issue9400/asm_mips64x.s b/misc/cgo/test/testdata/issue9400/asm_mips64x.s similarity index 100% rename from misc/cgo/test/issue9400/asm_mips64x.s rename to misc/cgo/test/testdata/issue9400/asm_mips64x.s diff --git a/misc/cgo/test/issue9400/asm_mipsx.s b/misc/cgo/test/testdata/issue9400/asm_mipsx.s similarity index 100% rename from misc/cgo/test/issue9400/asm_mipsx.s rename to misc/cgo/test/testdata/issue9400/asm_mipsx.s diff --git a/misc/cgo/test/issue9400/asm_ppc64x.s b/misc/cgo/test/testdata/issue9400/asm_ppc64x.s similarity index 100% rename from misc/cgo/test/issue9400/asm_ppc64x.s rename to misc/cgo/test/testdata/issue9400/asm_ppc64x.s diff --git a/misc/cgo/test/issue9400/asm_s390x.s b/misc/cgo/test/testdata/issue9400/asm_s390x.s similarity index 100% rename from misc/cgo/test/issue9400/asm_s390x.s rename to misc/cgo/test/testdata/issue9400/asm_s390x.s diff --git a/misc/cgo/test/issue9400/gccgo.go b/misc/cgo/test/testdata/issue9400/gccgo.go similarity index 100% rename from misc/cgo/test/issue9400/gccgo.go rename to misc/cgo/test/testdata/issue9400/gccgo.go diff --git a/misc/cgo/test/issue9400/stubs.go b/misc/cgo/test/testdata/issue9400/stubs.go similarity index 100% rename from misc/cgo/test/issue9400/stubs.go rename to misc/cgo/test/testdata/issue9400/stubs.go diff --git a/misc/cgo/test/issue9400_linux.go b/misc/cgo/test/testdata/issue9400_linux.go similarity index 98% rename from misc/cgo/test/issue9400_linux.go rename to misc/cgo/test/testdata/issue9400_linux.go index 7719535d25..e94a9bb45f 100644 --- a/misc/cgo/test/issue9400_linux.go +++ b/misc/cgo/test/testdata/issue9400_linux.go @@ -18,7 +18,7 @@ import ( "sync/atomic" "testing" - "./issue9400" + "cgotest/issue9400" ) func test9400(t *testing.T) { diff --git a/misc/cgo/test/issue9510.go b/misc/cgo/test/testdata/issue9510.go similarity index 91% rename from misc/cgo/test/issue9510.go rename to misc/cgo/test/testdata/issue9510.go index efd3f770b6..2c79fab97f 100644 --- a/misc/cgo/test/issue9510.go +++ b/misc/cgo/test/testdata/issue9510.go @@ -11,8 +11,8 @@ import ( "runtime" "testing" - "./issue9510a" - "./issue9510b" + "cgotest/issue9510a" + "cgotest/issue9510b" ) func test9510(t *testing.T) { diff --git a/misc/cgo/test/issue9510a/a.go b/misc/cgo/test/testdata/issue9510a/a.go similarity index 100% rename from misc/cgo/test/issue9510a/a.go rename to misc/cgo/test/testdata/issue9510a/a.go diff --git a/misc/cgo/test/issue9510b/b.go b/misc/cgo/test/testdata/issue9510b/b.go similarity index 100% rename from misc/cgo/test/issue9510b/b.go rename to misc/cgo/test/testdata/issue9510b/b.go diff --git a/misc/cgo/test/test26213.go b/misc/cgo/test/testdata/test26213.go similarity index 92% rename from misc/cgo/test/test26213.go rename to misc/cgo/test/testdata/test26213.go index 176a7ece9c..c80032cb3b 100644 --- a/misc/cgo/test/test26213.go +++ b/misc/cgo/test/testdata/test26213.go @@ -7,7 +7,7 @@ package cgotest import ( "testing" - "./issue26213" + "cgotest/issue26213" ) func test26213(t *testing.T) { -- GitLab From eb2d1cdd1bbc1912e316040f8ef9a363511d3747 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 17:38:53 -0500 Subject: [PATCH 0065/1679] misc/cgo/testplugin: convert test.bash to Go and fix in module mode Updates #30228 Updates #28387 Change-Id: Iad7d960b70221f90ccc2372bb1d4d41cec3926e4 Reviewed-on: https://go-review.googlesource.com/c/163214 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- .../{src => testdata}/common/common.go | 0 .../{src => testdata}/plugin-mismatch/main.go | 2 +- misc/cgo/testplugin/overlaydir_test.go | 81 ++++++++ misc/cgo/testplugin/plugin_test.go | 192 ++++++++++++++++++ misc/cgo/testplugin/test.bash | 109 ---------- .../{src => testdata}/checkdwarf/main.go | 0 .../{src => testdata}/common/common.go | 0 .../testplugin/{src => testdata}/host/host.go | 2 +- .../{src => testdata}/iface/main.go | 2 +- .../testplugin/{src => testdata}/iface_a/a.go | 2 +- .../testplugin/{src => testdata}/iface_b/b.go | 2 +- .../testplugin/{src => testdata}/iface_i/i.go | 0 .../{src => testdata}/issue18584/main.go | 0 .../{src => testdata}/issue18584/plugin.go | 0 .../dynamodbstreamsevt/definition.go | 0 .../{src => testdata}/issue18676/main.go | 2 +- .../{src => testdata}/issue18676/plugin.go | 2 +- .../{src => testdata}/issue19418/main.go | 0 .../{src => testdata}/issue19418/plugin.go | 0 .../{src => testdata}/issue19529/plugin.go | 0 .../{src => testdata}/issue19534/main.go | 0 .../{src => testdata}/issue19534/plugin.go | 0 .../{src => testdata}/issue22175/main.go | 0 .../{src => testdata}/issue22175/plugin1.go | 0 .../{src => testdata}/issue22175/plugin2.go | 0 .../{src => testdata}/issue22295.pkg/main.go | 0 .../issue22295.pkg/plugin.go | 0 .../{src => testdata}/issue24351/main.go | 0 .../{src => testdata}/issue24351/plugin.go | 0 .../{src => testdata}/issue25756/main.go | 0 .../issue25756/plugin/c-life.c | 0 .../issue25756/plugin/life.go | 0 .../issue25756/plugin/life.h | 0 .../{src => testdata}/plugin1/plugin1.go | 2 +- .../{src => testdata}/plugin2/plugin2.go | 2 +- .../{src => testdata}/sub/plugin1/plugin1.go | 2 +- .../{ => testdata}/unnamed1/main.go | 2 + .../{ => testdata}/unnamed2/main.go | 2 + src/cmd/dist/test.go | 2 +- 39 files changed, 288 insertions(+), 120 deletions(-) rename misc/cgo/testplugin/altpath/{src => testdata}/common/common.go (100%) rename misc/cgo/testplugin/altpath/{src => testdata}/plugin-mismatch/main.go (94%) create mode 100644 misc/cgo/testplugin/overlaydir_test.go create mode 100644 misc/cgo/testplugin/plugin_test.go delete mode 100755 misc/cgo/testplugin/test.bash rename misc/cgo/testplugin/{src => testdata}/checkdwarf/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/common/common.go (100%) rename misc/cgo/testplugin/{src => testdata}/host/host.go (99%) rename misc/cgo/testplugin/{src => testdata}/iface/main.go (97%) rename misc/cgo/testplugin/{src => testdata}/iface_a/a.go (91%) rename misc/cgo/testplugin/{src => testdata}/iface_b/b.go (91%) rename misc/cgo/testplugin/{src => testdata}/iface_i/i.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue18584/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue18584/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue18676/dynamodbstreamsevt/definition.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue18676/main.go (96%) rename misc/cgo/testplugin/{src => testdata}/issue18676/plugin.go (82%) rename misc/cgo/testplugin/{src => testdata}/issue19418/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue19418/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue19529/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue19534/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue19534/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue22175/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue22175/plugin1.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue22175/plugin2.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue22295.pkg/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue22295.pkg/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue24351/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue24351/plugin.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue25756/main.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue25756/plugin/c-life.c (100%) rename misc/cgo/testplugin/{src => testdata}/issue25756/plugin/life.go (100%) rename misc/cgo/testplugin/{src => testdata}/issue25756/plugin/life.h (100%) rename misc/cgo/testplugin/{src => testdata}/plugin1/plugin1.go (97%) rename misc/cgo/testplugin/{src => testdata}/plugin2/plugin2.go (97%) rename misc/cgo/testplugin/{src => testdata}/sub/plugin1/plugin1.go (93%) rename misc/cgo/testplugin/{ => testdata}/unnamed1/main.go (96%) rename misc/cgo/testplugin/{ => testdata}/unnamed2/main.go (95%) diff --git a/misc/cgo/testplugin/altpath/src/common/common.go b/misc/cgo/testplugin/altpath/testdata/common/common.go similarity index 100% rename from misc/cgo/testplugin/altpath/src/common/common.go rename to misc/cgo/testplugin/altpath/testdata/common/common.go diff --git a/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go b/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go similarity index 94% rename from misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go rename to misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go index 8aacafc453..bfb4ba45aa 100644 --- a/misc/cgo/testplugin/altpath/src/plugin-mismatch/main.go +++ b/misc/cgo/testplugin/altpath/testdata/plugin-mismatch/main.go @@ -10,7 +10,7 @@ import "C" // The common package imported here does not match the common package // imported by plugin1. A program that attempts to load plugin1 and // plugin-mismatch should produce an error. -import "common" +import "testplugin/common" func ReadCommonX() int { return common.X diff --git a/misc/cgo/testplugin/overlaydir_test.go b/misc/cgo/testplugin/overlaydir_test.go new file mode 100644 index 0000000000..b68436ac03 --- /dev/null +++ b/misc/cgo/testplugin/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 plugin_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go new file mode 100644 index 0000000000..8bea9e5356 --- /dev/null +++ b/misc/cgo/testplugin/plugin_test.go @@ -0,0 +1,192 @@ +// Copyright 2019 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 plugin_test + +import ( + "bytes" + "context" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + "time" +) + +var gcflags string = os.Getenv("GO_GCFLAGS") + +func TestMain(m *testing.M) { + log.SetFlags(log.Lshortfile) + + // Copy testdata into GOPATH/src/testarchive, along with a go.mod file + // declaring the same path. + + GOPATH, err := ioutil.TempDir("", "plugin_test") + if err != nil { + log.Panic(err) + } + defer os.RemoveAll(GOPATH) + + modRoot := filepath.Join(GOPATH, "src", "testplugin") + altRoot := filepath.Join(GOPATH, "alt", "src", "testplugin") + for srcRoot, dstRoot := range map[string]string{ + "testdata": modRoot, + filepath.Join("altpath", "testdata"): altRoot, + } { + if err := overlayDir(dstRoot, srcRoot); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile(filepath.Join(dstRoot, "go.mod"), []byte("module testplugin\n"), 0666); err != nil { + log.Panic(err) + } + } + + os.Setenv("GOPATH", filepath.Join(GOPATH, "alt")) + if err := os.Chdir(altRoot); err != nil { + log.Panic(err) + } + goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch") + + os.Setenv("GOPATH", GOPATH) + if err := os.Chdir(modRoot); err != nil { + log.Panic(err) + } + + os.Setenv("LD_LIBRARY_PATH", modRoot) + + goCmd(nil, "build", "-i", "-buildmode=plugin", "./plugin1") + goCmd(nil, "build", "-buildmode=plugin", "./plugin2") + so, err := ioutil.ReadFile("plugin2.so") + if err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile("plugin2-dup.so", so, 0444); err != nil { + log.Panic(err) + } + + goCmd(nil, "build", "-buildmode=plugin", "-o=sub/plugin1.so", "./sub/plugin1") + goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed1.so", "./unnamed1/main.go") + goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go") + goCmd(nil, "build", "-o", "host.exe", "./host") + + os.Exit(m.Run()) +} + +func goCmd(t *testing.T, op string, args ...string) { + if t != nil { + t.Helper() + } + run(t, "go", append([]string{op, "-gcflags", gcflags}, args...)...) +} + +func run(t *testing.T, bin string, args ...string) string { + cmd := exec.Command(bin, args...) + cmd.Stderr = new(strings.Builder) + out, err := cmd.Output() + if err != nil { + if t == nil { + log.Panicf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) + } else { + t.Helper() + t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) + } + } + + return string(bytes.TrimSpace(out)) +} + +func TestDWARFSections(t *testing.T) { + // test that DWARF sections are emitted for plugins and programs importing "plugin" + if runtime.GOOS != "darwin" { + // On macOS, for some reason, the linker doesn't add debug sections to .so, + // see issue #27502. + goCmd(t, "run", "./checkdwarf/main.go", "plugin2.so", "plugin2.UnexportedNameReuse") + } + goCmd(t, "run", "./checkdwarf/main.go", "./host.exe", "main.main") +} + +func TestRunHost(t *testing.T) { + run(t, "./host.exe") +} + +func TestUniqueTypesAndItabs(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "./iface_a") + goCmd(t, "build", "-buildmode=plugin", "./iface_b") + goCmd(t, "build", "-o", "iface.exe", "./iface") + run(t, "./iface.exe") +} + +func TestIssue18676(t *testing.T) { + // make sure we don't add the same itab twice. + // The buggy code hangs forever, so use a timeout to check for that. + goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18676/plugin.go") + goCmd(t, "build", "-o", "issue18676.exe", "./issue18676/main.go") + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + cmd := exec.CommandContext(ctx, "./issue18676.exe") + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, out) + } +} + +func TestIssue19534(t *testing.T) { + // Test that we can load a plugin built in a path with non-alpha characters. + goCmd(t, "build", "-buildmode=plugin", "-ldflags='-pluginpath=issue.19534'", "-o", "plugin.so", "./issue19534/plugin.go") + goCmd(t, "build", "-o", "issue19534.exe", "./issue19534/main.go") + run(t, "./issue19534.exe") +} + +func TestIssue18584(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue18584/plugin.go") + goCmd(t, "build", "-o", "issue18584.exe", "./issue18584/main.go") + run(t, "./issue18584.exe") +} + +func TestIssue19418(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-ldflags=-X main.Val=linkstr", "-o", "plugin.so", "./issue19418/plugin.go") + goCmd(t, "build", "-o", "issue19418.exe", "./issue19418/main.go") + run(t, "./issue19418.exe") +} + +func TestIssue19529(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "plugin.so", "./issue19529/plugin.go") +} + +func TestIssue22175(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin1.so", "./issue22175/plugin1.go") + goCmd(t, "build", "-buildmode=plugin", "-o", "issue22175_plugin2.so", "./issue22175/plugin2.go") + goCmd(t, "build", "-o", "issue22175.exe", "./issue22175/main.go") + run(t, "./issue22175.exe") +} + +func TestIssue22295(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "issue.22295.so", "./issue22295.pkg") + goCmd(t, "build", "-o", "issue22295.exe", "./issue22295.pkg/main.go") + run(t, "./issue22295.exe") +} + +func TestIssue24351(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "issue24351.so", "./issue24351/plugin.go") + goCmd(t, "build", "-o", "issue24351.exe", "./issue24351/main.go") + run(t, "./issue24351.exe") +} + +func TestIssue25756(t *testing.T) { + goCmd(t, "build", "-buildmode=plugin", "-o", "life.so", "./issue25756/plugin") + goCmd(t, "build", "-o", "issue25756.exe", "./issue25756/main.go") + // Fails intermittently, but 20 runs should cause the failure + for n := 20; n > 0; n-- { + t.Run(fmt.Sprint(n), func(t *testing.T) { + t.Parallel() + run(t, "./issue25756.exe") + }) + } +} diff --git a/misc/cgo/testplugin/test.bash b/misc/cgo/testplugin/test.bash deleted file mode 100755 index 1b94bc4bad..0000000000 --- a/misc/cgo/testplugin/test.bash +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2016 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. - -set -e - -if [ ! -f src/host/host.go ]; then - cwd=$(pwd) - echo "misc/cgo/testplugin/test.bash is running in $cwd" 1>&2 - exit 1 -fi - -goos=$(go env GOOS) -goarch=$(go env GOARCH) - -function cleanup() { - rm -f plugin*.so unnamed*.so iface*.so life.so issue* - rm -rf host pkg sub iface -} -trap cleanup EXIT - -rm -rf pkg sub -mkdir sub - -GOPATH=$(pwd) go build -i -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin1 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin2 -cp plugin2.so plugin2-dup.so -GOPATH=$(pwd)/altpath go build -gcflags "$GO_GCFLAGS" -buildmode=plugin plugin-mismatch -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=sub/plugin1.so sub/plugin1 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed1.so unnamed1/main.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o=unnamed2.so unnamed2/main.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" host - -# test that DWARF sections are emitted for plugins and programs importing "plugin" -if [ $GOOS != "darwin" ]; then - # On macOS, for some reason, the linker doesn't add debug sections to .so, - # see issue #27502. - go run src/checkdwarf/main.go plugin2.so plugin2.UnexportedNameReuse -fi -go run src/checkdwarf/main.go host main.main - -LD_LIBRARY_PATH=$(pwd) ./host - -# Test that types and itabs get properly uniqified. -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_a -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin iface_b -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" iface -LD_LIBRARY_PATH=$(pwd) ./iface - -function _timeout() ( - set -e - $2 & - p=$! - (sleep $1; kill $p 2>/dev/null) & - p2=$! - wait $p 2>/dev/null - kill -0 $p2 2>/dev/null -) - -# Test for issue 18676 - make sure we don't add the same itab twice. -# The buggy code hangs forever, so use a timeout to check for that. -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18676/plugin.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18676 src/issue18676/main.go -_timeout 10s ./issue18676 - -# Test for issue 19534 - that we can load a plugin built in a path with non-alpha -# characters -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -ldflags='-pluginpath=issue.19534' -o plugin.so src/issue19534/plugin.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19534 src/issue19534/main.go -./issue19534 - -# Test for issue 18584 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue18584/plugin.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue18584 src/issue18584/main.go -./issue18584 - -# Test for issue 19418 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin "-ldflags=-X main.Val=linkstr" -o plugin.so src/issue19418/plugin.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue19418 src/issue19418/main.go -./issue19418 - -# Test for issue 19529 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o plugin.so src/issue19529/plugin.go - -# Test for issue 22175 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin1.so src/issue22175/plugin1.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue22175_plugin2.so src/issue22175/plugin2.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22175 src/issue22175/main.go -./issue22175 - -# Test for issue 22295 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue.22295.so issue22295.pkg -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue22295 src/issue22295.pkg/main.go -./issue22295 - -# Test for issue 24351 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o issue24351.so src/issue24351/plugin.go -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue24351 src/issue24351/main.go -./issue24351 - -# Test for issue 25756 -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -buildmode=plugin -o life.so issue25756/plugin -GOPATH=$(pwd) go build -gcflags "$GO_GCFLAGS" -o issue25756 src/issue25756/main.go -# Fails intermittently, but 20 runs should cause the failure -for i in `seq 1 20`; -do - ./issue25756 > /dev/null -done diff --git a/misc/cgo/testplugin/src/checkdwarf/main.go b/misc/cgo/testplugin/testdata/checkdwarf/main.go similarity index 100% rename from misc/cgo/testplugin/src/checkdwarf/main.go rename to misc/cgo/testplugin/testdata/checkdwarf/main.go diff --git a/misc/cgo/testplugin/src/common/common.go b/misc/cgo/testplugin/testdata/common/common.go similarity index 100% rename from misc/cgo/testplugin/src/common/common.go rename to misc/cgo/testplugin/testdata/common/common.go diff --git a/misc/cgo/testplugin/src/host/host.go b/misc/cgo/testplugin/testdata/host/host.go similarity index 99% rename from misc/cgo/testplugin/src/host/host.go rename to misc/cgo/testplugin/testdata/host/host.go index 0ca17da3de..a3799328cd 100644 --- a/misc/cgo/testplugin/src/host/host.go +++ b/misc/cgo/testplugin/testdata/host/host.go @@ -11,7 +11,7 @@ import ( "plugin" "strings" - "common" + "testplugin/common" ) func init() { diff --git a/misc/cgo/testplugin/src/iface/main.go b/misc/cgo/testplugin/testdata/iface/main.go similarity index 97% rename from misc/cgo/testplugin/src/iface/main.go rename to misc/cgo/testplugin/testdata/iface/main.go index 5e7e4d8b48..7b4ea97442 100644 --- a/misc/cgo/testplugin/src/iface/main.go +++ b/misc/cgo/testplugin/testdata/iface/main.go @@ -5,7 +5,7 @@ package main import ( - "iface_i" + "testplugin/iface_i" "log" "plugin" ) diff --git a/misc/cgo/testplugin/src/iface_a/a.go b/misc/cgo/testplugin/testdata/iface_a/a.go similarity index 91% rename from misc/cgo/testplugin/src/iface_a/a.go rename to misc/cgo/testplugin/testdata/iface_a/a.go index 29d2e27764..357f7e827e 100644 --- a/misc/cgo/testplugin/src/iface_a/a.go +++ b/misc/cgo/testplugin/testdata/iface_a/a.go @@ -4,7 +4,7 @@ package main -import "iface_i" +import "testplugin/iface_i" //go:noinline func F() interface{} { diff --git a/misc/cgo/testplugin/src/iface_b/b.go b/misc/cgo/testplugin/testdata/iface_b/b.go similarity index 91% rename from misc/cgo/testplugin/src/iface_b/b.go rename to misc/cgo/testplugin/testdata/iface_b/b.go index 29d2e27764..357f7e827e 100644 --- a/misc/cgo/testplugin/src/iface_b/b.go +++ b/misc/cgo/testplugin/testdata/iface_b/b.go @@ -4,7 +4,7 @@ package main -import "iface_i" +import "testplugin/iface_i" //go:noinline func F() interface{} { diff --git a/misc/cgo/testplugin/src/iface_i/i.go b/misc/cgo/testplugin/testdata/iface_i/i.go similarity index 100% rename from misc/cgo/testplugin/src/iface_i/i.go rename to misc/cgo/testplugin/testdata/iface_i/i.go diff --git a/misc/cgo/testplugin/src/issue18584/main.go b/misc/cgo/testplugin/testdata/issue18584/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue18584/main.go rename to misc/cgo/testplugin/testdata/issue18584/main.go diff --git a/misc/cgo/testplugin/src/issue18584/plugin.go b/misc/cgo/testplugin/testdata/issue18584/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue18584/plugin.go rename to misc/cgo/testplugin/testdata/issue18584/plugin.go diff --git a/misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go b/misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go similarity index 100% rename from misc/cgo/testplugin/src/issue18676/dynamodbstreamsevt/definition.go rename to misc/cgo/testplugin/testdata/issue18676/dynamodbstreamsevt/definition.go diff --git a/misc/cgo/testplugin/src/issue18676/main.go b/misc/cgo/testplugin/testdata/issue18676/main.go similarity index 96% rename from misc/cgo/testplugin/src/issue18676/main.go rename to misc/cgo/testplugin/testdata/issue18676/main.go index c75409dafe..b1dadbedf2 100644 --- a/misc/cgo/testplugin/src/issue18676/main.go +++ b/misc/cgo/testplugin/testdata/issue18676/main.go @@ -17,8 +17,8 @@ package main import ( "encoding/json" - "issue18676/dynamodbstreamsevt" "plugin" + "testplugin/issue18676/dynamodbstreamsevt" ) func main() { diff --git a/misc/cgo/testplugin/src/issue18676/plugin.go b/misc/cgo/testplugin/testdata/issue18676/plugin.go similarity index 82% rename from misc/cgo/testplugin/src/issue18676/plugin.go rename to misc/cgo/testplugin/testdata/issue18676/plugin.go index 8a3b85a75c..e7fc74f777 100644 --- a/misc/cgo/testplugin/src/issue18676/plugin.go +++ b/misc/cgo/testplugin/testdata/issue18676/plugin.go @@ -6,6 +6,6 @@ package main import "C" -import "issue18676/dynamodbstreamsevt" +import "testplugin/issue18676/dynamodbstreamsevt" func F(evt *dynamodbstreamsevt.Event) {} diff --git a/misc/cgo/testplugin/src/issue19418/main.go b/misc/cgo/testplugin/testdata/issue19418/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue19418/main.go rename to misc/cgo/testplugin/testdata/issue19418/main.go diff --git a/misc/cgo/testplugin/src/issue19418/plugin.go b/misc/cgo/testplugin/testdata/issue19418/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue19418/plugin.go rename to misc/cgo/testplugin/testdata/issue19418/plugin.go diff --git a/misc/cgo/testplugin/src/issue19529/plugin.go b/misc/cgo/testplugin/testdata/issue19529/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue19529/plugin.go rename to misc/cgo/testplugin/testdata/issue19529/plugin.go diff --git a/misc/cgo/testplugin/src/issue19534/main.go b/misc/cgo/testplugin/testdata/issue19534/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue19534/main.go rename to misc/cgo/testplugin/testdata/issue19534/main.go diff --git a/misc/cgo/testplugin/src/issue19534/plugin.go b/misc/cgo/testplugin/testdata/issue19534/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue19534/plugin.go rename to misc/cgo/testplugin/testdata/issue19534/plugin.go diff --git a/misc/cgo/testplugin/src/issue22175/main.go b/misc/cgo/testplugin/testdata/issue22175/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue22175/main.go rename to misc/cgo/testplugin/testdata/issue22175/main.go diff --git a/misc/cgo/testplugin/src/issue22175/plugin1.go b/misc/cgo/testplugin/testdata/issue22175/plugin1.go similarity index 100% rename from misc/cgo/testplugin/src/issue22175/plugin1.go rename to misc/cgo/testplugin/testdata/issue22175/plugin1.go diff --git a/misc/cgo/testplugin/src/issue22175/plugin2.go b/misc/cgo/testplugin/testdata/issue22175/plugin2.go similarity index 100% rename from misc/cgo/testplugin/src/issue22175/plugin2.go rename to misc/cgo/testplugin/testdata/issue22175/plugin2.go diff --git a/misc/cgo/testplugin/src/issue22295.pkg/main.go b/misc/cgo/testplugin/testdata/issue22295.pkg/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue22295.pkg/main.go rename to misc/cgo/testplugin/testdata/issue22295.pkg/main.go diff --git a/misc/cgo/testplugin/src/issue22295.pkg/plugin.go b/misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue22295.pkg/plugin.go rename to misc/cgo/testplugin/testdata/issue22295.pkg/plugin.go diff --git a/misc/cgo/testplugin/src/issue24351/main.go b/misc/cgo/testplugin/testdata/issue24351/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue24351/main.go rename to misc/cgo/testplugin/testdata/issue24351/main.go diff --git a/misc/cgo/testplugin/src/issue24351/plugin.go b/misc/cgo/testplugin/testdata/issue24351/plugin.go similarity index 100% rename from misc/cgo/testplugin/src/issue24351/plugin.go rename to misc/cgo/testplugin/testdata/issue24351/plugin.go diff --git a/misc/cgo/testplugin/src/issue25756/main.go b/misc/cgo/testplugin/testdata/issue25756/main.go similarity index 100% rename from misc/cgo/testplugin/src/issue25756/main.go rename to misc/cgo/testplugin/testdata/issue25756/main.go diff --git a/misc/cgo/testplugin/src/issue25756/plugin/c-life.c b/misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c similarity index 100% rename from misc/cgo/testplugin/src/issue25756/plugin/c-life.c rename to misc/cgo/testplugin/testdata/issue25756/plugin/c-life.c diff --git a/misc/cgo/testplugin/src/issue25756/plugin/life.go b/misc/cgo/testplugin/testdata/issue25756/plugin/life.go similarity index 100% rename from misc/cgo/testplugin/src/issue25756/plugin/life.go rename to misc/cgo/testplugin/testdata/issue25756/plugin/life.go diff --git a/misc/cgo/testplugin/src/issue25756/plugin/life.h b/misc/cgo/testplugin/testdata/issue25756/plugin/life.h similarity index 100% rename from misc/cgo/testplugin/src/issue25756/plugin/life.h rename to misc/cgo/testplugin/testdata/issue25756/plugin/life.h diff --git a/misc/cgo/testplugin/src/plugin1/plugin1.go b/misc/cgo/testplugin/testdata/plugin1/plugin1.go similarity index 97% rename from misc/cgo/testplugin/src/plugin1/plugin1.go rename to misc/cgo/testplugin/testdata/plugin1/plugin1.go index 0a9fa2f2c1..136c179b65 100644 --- a/misc/cgo/testplugin/src/plugin1/plugin1.go +++ b/misc/cgo/testplugin/testdata/plugin1/plugin1.go @@ -8,7 +8,7 @@ package main import "C" import ( - "common" + "testplugin/common" "reflect" ) diff --git a/misc/cgo/testplugin/src/plugin2/plugin2.go b/misc/cgo/testplugin/testdata/plugin2/plugin2.go similarity index 97% rename from misc/cgo/testplugin/src/plugin2/plugin2.go rename to misc/cgo/testplugin/testdata/plugin2/plugin2.go index a67f2de27a..37168a13e1 100644 --- a/misc/cgo/testplugin/src/plugin2/plugin2.go +++ b/misc/cgo/testplugin/testdata/plugin2/plugin2.go @@ -12,7 +12,7 @@ import "C" // void cfunc() {} // uses cgo_topofstack import ( - "common" + "testplugin/common" "reflect" "strings" ) diff --git a/misc/cgo/testplugin/src/sub/plugin1/plugin1.go b/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go similarity index 93% rename from misc/cgo/testplugin/src/sub/plugin1/plugin1.go rename to misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go index cf9000c4a4..5f891b09a3 100644 --- a/misc/cgo/testplugin/src/sub/plugin1/plugin1.go +++ b/misc/cgo/testplugin/testdata/sub/plugin1/plugin1.go @@ -7,7 +7,7 @@ package main // // No C code required. import "C" -import "common" +import "testplugin/common" func F() int { return 17 } diff --git a/misc/cgo/testplugin/unnamed1/main.go b/misc/cgo/testplugin/testdata/unnamed1/main.go similarity index 96% rename from misc/cgo/testplugin/unnamed1/main.go rename to misc/cgo/testplugin/testdata/unnamed1/main.go index caf09c9e89..dd1777b418 100644 --- a/misc/cgo/testplugin/unnamed1/main.go +++ b/misc/cgo/testplugin/testdata/unnamed1/main.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build ignore + package main // // No C code required. diff --git a/misc/cgo/testplugin/unnamed2/main.go b/misc/cgo/testplugin/testdata/unnamed2/main.go similarity index 95% rename from misc/cgo/testplugin/unnamed2/main.go rename to misc/cgo/testplugin/testdata/unnamed2/main.go index 7ef66109c5..757436f250 100644 --- a/misc/cgo/testplugin/unnamed2/main.go +++ b/misc/cgo/testplugin/testdata/unnamed2/main.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// +build ignore + package main // // No C code required. diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 6392321091..a03803b911 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -701,7 +701,7 @@ func (t *tester) registerTests() { t.registerTest("testshared", "../misc/cgo/testshared", t.goTest(), t.timeout(600)) } if t.supportedBuildmode("plugin") { - t.registerTest("testplugin", "../misc/cgo/testplugin", "./test.bash") + t.registerTest("testplugin", "../misc/cgo/testplugin", t.goTest(), t.timeout(600)) } if gohostos == "linux" && goarch == "amd64" { t.registerTest("testasan", "../misc/cgo/testasan", "go", "run", "main.go") -- GitLab From c6611b2f7e31aa9152f9279fd9ba0343137af7c0 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 12:14:23 -0500 Subject: [PATCH 0066/1679] misc/cgo/stdio: fix tests in module mode Updates #30228 Change-Id: I4d213c6fe68c47ccb877f13b55128e035f76a26b Reviewed-on: https://go-review.googlesource.com/c/163421 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/stdio/overlaydir_test.go | 81 ++++++++++++++++++++ misc/cgo/stdio/stdio_test.go | 60 +++++++++++++++ misc/cgo/stdio/{ => testdata}/chain.go | 2 +- misc/cgo/stdio/{ => testdata}/chain.out | 0 misc/cgo/stdio/{ => testdata}/fib.go | 2 +- misc/cgo/stdio/{ => testdata}/fib.out | 0 misc/cgo/stdio/{ => testdata}/hello.go | 2 +- misc/cgo/stdio/{ => testdata}/hello.out | 0 misc/cgo/stdio/{ => testdata}/run.out | 0 misc/cgo/stdio/{ => testdata/stdio}/file.go | 0 misc/cgo/stdio/{ => testdata/stdio}/stdio.go | 0 src/cmd/dist/test.go | 2 +- 12 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 misc/cgo/stdio/overlaydir_test.go create mode 100644 misc/cgo/stdio/stdio_test.go rename misc/cgo/stdio/{ => testdata}/chain.go (98%) rename misc/cgo/stdio/{ => testdata}/chain.out (100%) rename misc/cgo/stdio/{ => testdata}/fib.go (98%) rename misc/cgo/stdio/{ => testdata}/fib.out (100%) rename misc/cgo/stdio/{ => testdata}/hello.go (92%) rename misc/cgo/stdio/{ => testdata}/hello.out (100%) rename misc/cgo/stdio/{ => testdata}/run.out (100%) rename misc/cgo/stdio/{ => testdata/stdio}/file.go (100%) rename misc/cgo/stdio/{ => testdata/stdio}/stdio.go (100%) diff --git a/misc/cgo/stdio/overlaydir_test.go b/misc/cgo/stdio/overlaydir_test.go new file mode 100644 index 0000000000..8a8dcdb3a5 --- /dev/null +++ b/misc/cgo/stdio/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 stdio_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/stdio/stdio_test.go b/misc/cgo/stdio/stdio_test.go new file mode 100644 index 0000000000..cb32da8444 --- /dev/null +++ b/misc/cgo/stdio/stdio_test.go @@ -0,0 +1,60 @@ +// Copyright 2019 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 stdio_test + +import ( + "bytes" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +func TestMain(m *testing.M) { + log.SetFlags(log.Lshortfile) + os.Exit(testMain(m)) +} + +func testMain(m *testing.M) int { + GOPATH, err := ioutil.TempDir("", "cgostdio") + if err != nil { + log.Panic(err) + } + defer os.RemoveAll(GOPATH) + os.Setenv("GOPATH", GOPATH) + + // Copy testdata into GOPATH/src/cgostdio, along with a go.mod file + // declaring the same path. + modRoot := filepath.Join(GOPATH, "src", "cgostdio") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := os.Chdir(modRoot); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil { + log.Panic(err) + } + + return m.Run() +} + +func TestTestRun(t *testing.T) { + out, err := exec.Command("go", "env", "GOROOT").Output() + if err != nil { + t.Fatal(err) + } + GOROOT := string(bytes.TrimSpace(out)) + + cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".") + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) +} diff --git a/misc/cgo/stdio/chain.go b/misc/cgo/stdio/testdata/chain.go similarity index 98% rename from misc/cgo/stdio/chain.go rename to misc/cgo/stdio/testdata/chain.go index cdc385208c..6c3f406a0d 100644 --- a/misc/cgo/stdio/chain.go +++ b/misc/cgo/stdio/testdata/chain.go @@ -14,7 +14,7 @@ import ( "runtime" "strconv" - "../stdio" + "cgostdio/stdio" ) const N = 10 diff --git a/misc/cgo/stdio/chain.out b/misc/cgo/stdio/testdata/chain.out similarity index 100% rename from misc/cgo/stdio/chain.out rename to misc/cgo/stdio/testdata/chain.out diff --git a/misc/cgo/stdio/fib.go b/misc/cgo/stdio/testdata/fib.go similarity index 98% rename from misc/cgo/stdio/fib.go rename to misc/cgo/stdio/testdata/fib.go index 58f185c90f..49cb0ea06f 100644 --- a/misc/cgo/stdio/fib.go +++ b/misc/cgo/stdio/testdata/fib.go @@ -17,7 +17,7 @@ import ( "runtime" "strconv" - "../stdio" + "cgostdio/stdio" ) func fibber(c, out chan int64, i int64) { diff --git a/misc/cgo/stdio/fib.out b/misc/cgo/stdio/testdata/fib.out similarity index 100% rename from misc/cgo/stdio/fib.out rename to misc/cgo/stdio/testdata/fib.out diff --git a/misc/cgo/stdio/hello.go b/misc/cgo/stdio/testdata/hello.go similarity index 92% rename from misc/cgo/stdio/hello.go rename to misc/cgo/stdio/testdata/hello.go index 56220d34be..046bfee7a7 100644 --- a/misc/cgo/stdio/hello.go +++ b/misc/cgo/stdio/testdata/hello.go @@ -8,7 +8,7 @@ package main -import "../stdio" +import "cgostdio/stdio" func main() { stdio.Stdout.WriteString(stdio.Greeting + "\n") diff --git a/misc/cgo/stdio/hello.out b/misc/cgo/stdio/testdata/hello.out similarity index 100% rename from misc/cgo/stdio/hello.out rename to misc/cgo/stdio/testdata/hello.out diff --git a/misc/cgo/stdio/run.out b/misc/cgo/stdio/testdata/run.out similarity index 100% rename from misc/cgo/stdio/run.out rename to misc/cgo/stdio/testdata/run.out diff --git a/misc/cgo/stdio/file.go b/misc/cgo/stdio/testdata/stdio/file.go similarity index 100% rename from misc/cgo/stdio/file.go rename to misc/cgo/stdio/testdata/stdio/file.go diff --git a/misc/cgo/stdio/stdio.go b/misc/cgo/stdio/testdata/stdio/stdio.go similarity index 100% rename from misc/cgo/stdio/stdio.go rename to misc/cgo/stdio/testdata/stdio/stdio.go diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index a03803b911..1eabb85639 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -611,7 +611,7 @@ func (t *tester) registerTests() { name: "cgo_stdio", heading: "../misc/cgo/stdio", fn: func(dt *distTest) error { - t.addCmd(dt, "misc/cgo/stdio", "go", "run", filepath.Join(os.Getenv("GOROOT"), "test/run.go"), "-", ".") + t.addCmd(dt, "misc/cgo/stdio", t.goTest(), t.timeout(120)) return nil }, }) -- GitLab From 01f34cbf525bcdef5ca0040960e029ac92b62642 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 12:22:10 -0500 Subject: [PATCH 0067/1679] misc/cgo/life: fix tests in module mode Updates #30228 Change-Id: Ie972694254d2195ca9760ea7ffb6073e01c52488 Reviewed-on: https://go-review.googlesource.com/c/163422 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- misc/cgo/life/life_test.go | 60 ++++++++++++++++++++ misc/cgo/life/overlaydir_test.go | 81 +++++++++++++++++++++++++++ misc/cgo/life/{ => testdata}/c-life.c | 0 misc/cgo/life/{ => testdata}/life.go | 2 +- misc/cgo/life/{ => testdata}/life.h | 0 misc/cgo/life/{ => testdata}/main.go | 4 +- misc/cgo/life/{ => testdata}/main.out | 0 src/cmd/dist/test.go | 2 +- 8 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 misc/cgo/life/life_test.go create mode 100644 misc/cgo/life/overlaydir_test.go rename misc/cgo/life/{ => testdata}/c-life.c (100%) rename misc/cgo/life/{ => testdata}/life.go (98%) rename misc/cgo/life/{ => testdata}/life.h (100%) rename misc/cgo/life/{ => testdata}/main.go (94%) rename misc/cgo/life/{ => testdata}/main.out (100%) diff --git a/misc/cgo/life/life_test.go b/misc/cgo/life/life_test.go new file mode 100644 index 0000000000..3b17adae74 --- /dev/null +++ b/misc/cgo/life/life_test.go @@ -0,0 +1,60 @@ +// Copyright 2019 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 life_test + +import ( + "bytes" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +func TestMain(m *testing.M) { + log.SetFlags(log.Lshortfile) + os.Exit(testMain(m)) +} + +func testMain(m *testing.M) int { + GOPATH, err := ioutil.TempDir("", "cgolife") + if err != nil { + log.Panic(err) + } + defer os.RemoveAll(GOPATH) + os.Setenv("GOPATH", GOPATH) + + // Copy testdata into GOPATH/src/cgolife, along with a go.mod file + // declaring the same path. + modRoot := filepath.Join(GOPATH, "src", "cgolife") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := os.Chdir(modRoot); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil { + log.Panic(err) + } + + return m.Run() +} + +func TestTestRun(t *testing.T) { + out, err := exec.Command("go", "env", "GOROOT").Output() + if err != nil { + t.Fatal(err) + } + GOROOT := string(bytes.TrimSpace(out)) + + cmd := exec.Command("go", "run", filepath.Join(GOROOT, "test", "run.go"), "-", ".") + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) +} diff --git a/misc/cgo/life/overlaydir_test.go b/misc/cgo/life/overlaydir_test.go new file mode 100644 index 0000000000..f381ea62f3 --- /dev/null +++ b/misc/cgo/life/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 life_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/life/c-life.c b/misc/cgo/life/testdata/c-life.c similarity index 100% rename from misc/cgo/life/c-life.c rename to misc/cgo/life/testdata/c-life.c diff --git a/misc/cgo/life/life.go b/misc/cgo/life/testdata/life.go similarity index 98% rename from misc/cgo/life/life.go rename to misc/cgo/life/testdata/life.go index 170a620c87..2e0af81d05 100644 --- a/misc/cgo/life/life.go +++ b/misc/cgo/life/testdata/life.go @@ -4,7 +4,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -package life +package cgolife // #include "life.h" import "C" diff --git a/misc/cgo/life/life.h b/misc/cgo/life/testdata/life.h similarity index 100% rename from misc/cgo/life/life.h rename to misc/cgo/life/testdata/life.h diff --git a/misc/cgo/life/main.go b/misc/cgo/life/testdata/main.go similarity index 94% rename from misc/cgo/life/main.go rename to misc/cgo/life/testdata/main.go index 145a273bdd..cc2ca7c742 100644 --- a/misc/cgo/life/main.go +++ b/misc/cgo/life/testdata/main.go @@ -14,7 +14,7 @@ import ( "flag" "fmt" - "." + "cgolife" ) const MAXDIM = 100 @@ -34,7 +34,7 @@ func main() { } } - life.Run(*gen, *dim, *dim, a[:]) + cgolife.Run(*gen, *dim, *dim, a[:]) for i := 0; i < *dim; i++ { for j := 0; j < *dim; j++ { diff --git a/misc/cgo/life/main.out b/misc/cgo/life/testdata/main.out similarity index 100% rename from misc/cgo/life/main.out rename to misc/cgo/life/testdata/main.out diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 1eabb85639..c5cc6dcb3c 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -619,7 +619,7 @@ func (t *tester) registerTests() { name: "cgo_life", heading: "../misc/cgo/life", fn: func(dt *distTest) error { - t.addCmd(dt, "misc/cgo/life", "go", "run", filepath.Join(os.Getenv("GOROOT"), "test/run.go"), "-", ".") + t.addCmd(dt, "misc/cgo/life", t.goTest(), t.timeout(120)) return nil }, }) -- GitLab From f5aecc1d1dfab8ad3397915f13920825e2ce6701 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 24 Feb 2019 15:51:48 +0000 Subject: [PATCH 0068/1679] Revert "androidtest.bash: wait for device to be ready before using it" This reverts commit 27b9571de800c05a41081ea80cd934e48e0a8f70. Reason for revert: broke the multi-device Android builder. And the wait logic is moving to the exec wrapper anyway. Change-Id: I3e429106bbe70b3a12286f8f229a2b558279eec4 Reviewed-on: https://go-review.googlesource.com/c/163620 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/androidtest.bash | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/androidtest.bash b/src/androidtest.bash index a3784bc454..e43b89c0dc 100755 --- a/src/androidtest.bash +++ b/src/androidtest.bash @@ -69,12 +69,6 @@ cp -a "${GOROOT}/test" "${FAKE_GOROOT}/" cp -a "${GOROOT}/lib" "${FAKE_GOROOT}/" cp -a "${pkgdir}" "${FAKE_GOROOT}/pkg/" -# In case we're booting a device or emulator alongside androidtest.bash -# wait for it to be ready. adb wait-for-device is not enough, we have -# wait for sys.boot_completed. -echo '# Waiting for android device to be ready' -adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' - echo '# Syncing test files to android device' adb $GOANDROID_ADB_FLAGS shell mkdir -p /data/local/tmp/goroot time adb $GOANDROID_ADB_FLAGS sync data &> /dev/null -- GitLab From 73b803ee532173f64a5d3fb2cd0fbe789d49571e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 24 Feb 2019 16:46:23 +0100 Subject: [PATCH 0069/1679] misc: wait for device readyness in the exec wrapper Updates #23824 Change-Id: I5472a05eb2cf571ccc84c76c6f592bf4dd2e3cb4 Reviewed-on: https://go-review.googlesource.com/c/163621 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 2376e29796..e36edacc76 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -59,6 +59,11 @@ func main() { log.SetFlags(0) log.SetPrefix("go_android_exec: ") + // In case we're booting a device or emulator alongside androidtest.bash + // wait for it to be ready. adb wait-for-device is not enough, we have to + // wait for sys.boot_completed. + run("wait-for-device", "shell", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") + // Prepare a temporary directory that will be cleaned up at the end. deviceGotmp := fmt.Sprintf("/data/local/tmp/%s-%d", filepath.Base(os.Args[1]), os.Getpid()) -- GitLab From 2d3474043cd35ba06d3566df520e8550c479944f Mon Sep 17 00:00:00 2001 From: Lynn Boger Date: Thu, 21 Feb 2019 14:48:52 -0500 Subject: [PATCH 0070/1679] cmd/compile: call ginsnop, not ginsnop2 on ppc64le for mid-stack inlining tracebacks A recent change to fix stacktraces for inlined functions introduced a regression on ppc64le when compiling position independent code. That happened because ginsnop2 was called for the purpose of inserting a NOP to identify the location of the inlined function, when ginsnop should have been used. ginsnop2 is intended to be used before deferreturn to ensure r2 is properly restored when compiling position independent code. In some cases the location where r2 is loaded from might not be initialized. If that happens and r2 is used to generate an address, the result is likely a SEGV. This fixes that problem. Fixes #30283 Change-Id: If70ef27fc65ef31969712422306ac3a57adbd5b6 Reviewed-on: https://go-review.googlesource.com/c/163337 Reviewed-by: Cherry Zhang Reviewed-by: Carlos Eduardo Seo Reviewed-by: Keith Randall Run-TryBot: Andrew Bonventre TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/amd64/galign.go | 1 + src/cmd/compile/internal/arm/galign.go | 1 + src/cmd/compile/internal/arm64/galign.go | 1 + src/cmd/compile/internal/gc/go.go | 7 ++++--- src/cmd/compile/internal/gc/ssa.go | 2 +- src/cmd/compile/internal/mips/galign.go | 1 + src/cmd/compile/internal/mips64/galign.go | 1 + src/cmd/compile/internal/ppc64/galign.go | 3 ++- src/cmd/compile/internal/s390x/galign.go | 1 + src/cmd/compile/internal/wasm/ssa.go | 1 + src/cmd/compile/internal/x86/galign.go | 1 + 11 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/cmd/compile/internal/amd64/galign.go b/src/cmd/compile/internal/amd64/galign.go index 58c469995f..f6bb961c29 100644 --- a/src/cmd/compile/internal/amd64/galign.go +++ b/src/cmd/compile/internal/amd64/galign.go @@ -24,6 +24,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = ssaMarkMoves arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/arm/galign.go b/src/cmd/compile/internal/arm/galign.go index 241edaf3a0..8469dbdd73 100644 --- a/src/cmd/compile/internal/arm/galign.go +++ b/src/cmd/compile/internal/arm/galign.go @@ -19,6 +19,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/arm64/galign.go b/src/cmd/compile/internal/arm64/galign.go index a64be8e7a6..f01fe8a571 100644 --- a/src/cmd/compile/internal/arm64/galign.go +++ b/src/cmd/compile/internal/arm64/galign.go @@ -19,6 +19,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 2213d8d9b8..007585ef10 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -255,9 +255,10 @@ type Arch struct { Use387 bool // should 386 backend use 387 FP instructions instead of sse2. SoftFloat bool - PadFrame func(int64) int64 - ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog - Ginsnop func(*Progs) *obj.Prog + PadFrame func(int64) int64 + ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog + Ginsnop func(*Progs) *obj.Prog + Ginsnopdefer func(*Progs) *obj.Prog // special ginsnop for deferreturn // SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags. SSAMarkMoves func(*SSAGenState, *ssa.Block) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 6ddc9fba7a..9d56c562d0 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5604,7 +5604,7 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) { // insert an actual hardware NOP that will have the right line number. // This is different from obj.ANOP, which is a virtual no-op // that doesn't make it into the instruction stream. - thearch.Ginsnop(s.pp) + thearch.Ginsnopdefer(s.pp) } if sym, ok := v.Aux.(*obj.LSym); ok { diff --git a/src/cmd/compile/internal/mips/galign.go b/src/cmd/compile/internal/mips/galign.go index f207a17bbf..596dbd7fa0 100644 --- a/src/cmd/compile/internal/mips/galign.go +++ b/src/cmd/compile/internal/mips/galign.go @@ -22,6 +22,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAGenValue = ssaGenValue arch.SSAGenBlock = ssaGenBlock diff --git a/src/cmd/compile/internal/mips64/galign.go b/src/cmd/compile/internal/mips64/galign.go index 5252719e8e..07e9f98be5 100644 --- a/src/cmd/compile/internal/mips64/galign.go +++ b/src/cmd/compile/internal/mips64/galign.go @@ -22,6 +22,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/ppc64/galign.go b/src/cmd/compile/internal/ppc64/galign.go index da971d864d..8ad3084410 100644 --- a/src/cmd/compile/internal/ppc64/galign.go +++ b/src/cmd/compile/internal/ppc64/galign.go @@ -20,7 +20,8 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto - arch.Ginsnop = ginsnop2 + arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop2 arch.SSAMarkMoves = ssaMarkMoves arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/s390x/galign.go b/src/cmd/compile/internal/s390x/galign.go index 3f624692bb..26359abe66 100644 --- a/src/cmd/compile/internal/s390x/galign.go +++ b/src/cmd/compile/internal/s390x/galign.go @@ -17,6 +17,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = ssaMarkMoves arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 6e6dc557b4..897d6146c5 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -20,6 +20,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zeroRange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = ssaMarkMoves arch.SSAGenValue = ssaGenValue diff --git a/src/cmd/compile/internal/x86/galign.go b/src/cmd/compile/internal/x86/galign.go index 56cc6c637d..7f53ee3731 100644 --- a/src/cmd/compile/internal/x86/galign.go +++ b/src/cmd/compile/internal/x86/galign.go @@ -32,6 +32,7 @@ func Init(arch *gc.Arch) { arch.ZeroRange = zerorange arch.ZeroAuto = zeroAuto arch.Ginsnop = ginsnop + arch.Ginsnopdefer = ginsnop arch.SSAMarkMoves = ssaMarkMoves } -- GitLab From 2f9728aacdf90d21a530f68c6887cfe545954935 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 25 Feb 2019 19:13:57 +0000 Subject: [PATCH 0071/1679] doc/go1.12: change go install to go get Using go get prevents the failure case of when the user doesn't have the repo on their machine. Change-Id: I9c1174087728b5b06b578b0d52df6eeb7e8c7a3c Reviewed-on: https://go-review.googlesource.com/c/163718 Reviewed-by: Brad Fitzpatrick --- doc/go1.12.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index 1b937fdd79..0c6463a04d 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -109,7 +109,7 @@ Do not send CLs removing the interior tags from such phrases. is no longer available with go vet. Checking for variable shadowing may now be done using

-go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
+go get -u golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
 go vet -vettool=$(which shadow)
 

@@ -121,7 +121,7 @@ The Go tour is no longer included in the main binary distribution. To run the tour locally, instead of running go tool tour, manually install it:
-go install golang.org/x/tour
+go get -u golang.org/x/tour
 tour
 

-- GitLab From 9d26ec85fc5657409d415caf647b11f614dd48c8 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 25 Feb 2019 20:02:00 +0000 Subject: [PATCH 0072/1679] doc/go1.12: remove draft notice Change-Id: Ib6a0f5c35b1efc3f3c8e7ca2a5c4f35bf8bf5e5d Reviewed-on: https://go-review.googlesource.com/c/163720 Reviewed-by: Brad Fitzpatrick --- doc/go1.12.html | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index 0c6463a04d..30d1960177 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -15,14 +15,7 @@ Do not send CLs removing the interior tags from such phrases. ul li { margin: 0.5em 0; } -

DRAFT RELEASE NOTES - Introduction to Go 1.12

- -

- - Go 1.12 is not yet released. These are work-in-progress - release notes. Go 1.12 is expected to be released in February 2019. - -

+

Introduction to Go 1.12

The latest Go release, version 1.12, arrives six months after Go 1.11. -- GitLab From 8bffb8546cb8ed1c849989ddf2b151edc983a616 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 25 Feb 2019 21:33:12 +0000 Subject: [PATCH 0073/1679] doc: document Go 1.12 Change-Id: I845375d2b3824211b80885228ba5b45503cba1a6 Reviewed-on: https://go-review.googlesource.com/c/163722 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 73f7a0e304..58f9a585ed 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -23,6 +23,13 @@ in supported releases as needed by issuing minor revisions (for example, Go 1.6.1, Go 1.6.2, and so on).

+

go1.12 (released 2019/02/25)

+ +

+Go 1.12 is a major release of Go. +Read the Go 1.12 Release Notes for more information. +

+

go1.11 (released 2018/08/24)

-- GitLab From dd4e7f9722ab22d9da2dca03c559eca3ef3fe1c7 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 10:50:47 -0500 Subject: [PATCH 0074/1679] misc/cgo/testso{,var}: fix tests in module mode Add _test.go files in the individal directories to invoke 'go build' with appropriate arguments. Move the test driver out of cmd/dist so that it's easier to invoke the test separately (using 'go test .'). Updates #30228 Updates #28387 Change-Id: Ibc4a024a52c12a274058298b41cc90709f7f56c8 Reviewed-on: https://go-review.googlesource.com/c/163420 Reviewed-by: Ian Lance Taylor --- misc/cgo/testso/noso_test.go | 9 ++ misc/cgo/testso/overlaydir_test.go | 81 ++++++++++++ misc/cgo/testso/so_test.go | 126 +++++++++++++++++++ misc/cgo/testso/{ => testdata}/cgoso.c | 0 misc/cgo/testso/{ => testdata}/cgoso.go | 0 misc/cgo/testso/{ => testdata}/cgoso_c.c | 0 misc/cgo/testso/{ => testdata}/cgoso_unix.go | 0 misc/cgo/testso/{ => testdata}/main.go | 2 +- misc/cgo/testsovar/noso_test.go | 9 ++ misc/cgo/testsovar/overlaydir_test.go | 81 ++++++++++++ misc/cgo/testsovar/so_test.go | 126 +++++++++++++++++++ misc/cgo/testsovar/{ => testdata}/cgoso.go | 0 misc/cgo/testsovar/{ => testdata}/cgoso_c.c | 0 misc/cgo/testsovar/{ => testdata}/cgoso_c.h | 0 misc/cgo/testsovar/{ => testdata}/main.go | 2 +- src/cmd/dist/test.go | 98 +-------------- 16 files changed, 436 insertions(+), 98 deletions(-) create mode 100644 misc/cgo/testso/noso_test.go create mode 100644 misc/cgo/testso/overlaydir_test.go create mode 100644 misc/cgo/testso/so_test.go rename misc/cgo/testso/{ => testdata}/cgoso.c (100%) rename misc/cgo/testso/{ => testdata}/cgoso.go (100%) rename misc/cgo/testso/{ => testdata}/cgoso_c.c (100%) rename misc/cgo/testso/{ => testdata}/cgoso_unix.go (100%) rename misc/cgo/testso/{ => testdata}/main.go (92%) create mode 100644 misc/cgo/testsovar/noso_test.go create mode 100644 misc/cgo/testsovar/overlaydir_test.go create mode 100644 misc/cgo/testsovar/so_test.go rename misc/cgo/testsovar/{ => testdata}/cgoso.go (100%) rename misc/cgo/testsovar/{ => testdata}/cgoso_c.c (100%) rename misc/cgo/testsovar/{ => testdata}/cgoso_c.h (100%) rename misc/cgo/testsovar/{ => testdata}/main.go (92%) diff --git a/misc/cgo/testso/noso_test.go b/misc/cgo/testso/noso_test.go new file mode 100644 index 0000000000..c88aebfb02 --- /dev/null +++ b/misc/cgo/testso/noso_test.go @@ -0,0 +1,9 @@ +// Copyright 2019 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. + +// +build !cgo + +package so_test + +// Nothing to test. diff --git a/misc/cgo/testso/overlaydir_test.go b/misc/cgo/testso/overlaydir_test.go new file mode 100644 index 0000000000..10c874d925 --- /dev/null +++ b/misc/cgo/testso/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 so_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testso/so_test.go b/misc/cgo/testso/so_test.go new file mode 100644 index 0000000000..500b08fae8 --- /dev/null +++ b/misc/cgo/testso/so_test.go @@ -0,0 +1,126 @@ +// Copyright 2019 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. + +// +build cgo + +package so_test + +import ( + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" +) + +func requireTestSOSupported(t *testing.T) { + t.Helper() + switch runtime.GOARCH { + case "arm", "arm64": + if runtime.GOOS == "darwin" { + t.Skip("No exec facility on iOS.") + } + case "ppc64": + t.Skip("External linking not implemented on ppc64 (issue #8912).") + case "mips64le", "mips64": + t.Skip("External linking not implemented on mips64.") + } + if runtime.GOOS == "android" { + t.Skip("No exec facility on Android.") + } +} + +func TestSO(t *testing.T) { + requireTestSOSupported(t) + + GOPATH, err := ioutil.TempDir("", "cgosotest") + if err != nil { + log.Fatal(err) + } + defer os.RemoveAll(GOPATH) + + modRoot := filepath.Join(GOPATH, "src", "cgosotest") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil { + log.Panic(err) + } + + cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS") + cmd.Dir = modRoot + cmd.Stderr = new(strings.Builder) + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err := cmd.Output() + if err != nil { + t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) + } + lines := strings.Split(string(out), "\n") + if len(lines) != 3 || lines[2] != "" { + t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines) + } + + cc := lines[0] + if cc == "" { + t.Fatal("CC environment variable (go env CC) cannot be empty") + } + gogccflags := strings.Split(lines[1], " ") + + // build shared object + ext := "so" + args := append(gogccflags, "-shared") + switch runtime.GOOS { + case "darwin": + ext = "dylib" + args = append(args, "-undefined", "suppress", "-flat_namespace") + case "windows": + ext = "dll" + args = append(args, "-DEXPORT_DLL") + } + sofname := "libcgosotest." + ext + args = append(args, "-o", sofname, "cgoso_c.c") + + cmd = exec.Command(cc, args...) + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + + cmd = exec.Command("go", "build", "-o", "main.exe", "main.go") + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + + cmd = exec.Command("./main.exe") + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + if runtime.GOOS != "windows" { + s := "LD_LIBRARY_PATH" + if runtime.GOOS == "darwin" { + s = "DYLD_LIBRARY_PATH" + } + cmd.Env = append(os.Environ(), s+"=.") + + // On FreeBSD 64-bit architectures, the 32-bit linker looks for + // different environment variables. + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.") + } + } + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) +} diff --git a/misc/cgo/testso/cgoso.c b/misc/cgo/testso/testdata/cgoso.c similarity index 100% rename from misc/cgo/testso/cgoso.c rename to misc/cgo/testso/testdata/cgoso.c diff --git a/misc/cgo/testso/cgoso.go b/misc/cgo/testso/testdata/cgoso.go similarity index 100% rename from misc/cgo/testso/cgoso.go rename to misc/cgo/testso/testdata/cgoso.go diff --git a/misc/cgo/testso/cgoso_c.c b/misc/cgo/testso/testdata/cgoso_c.c similarity index 100% rename from misc/cgo/testso/cgoso_c.c rename to misc/cgo/testso/testdata/cgoso_c.c diff --git a/misc/cgo/testso/cgoso_unix.go b/misc/cgo/testso/testdata/cgoso_unix.go similarity index 100% rename from misc/cgo/testso/cgoso_unix.go rename to misc/cgo/testso/testdata/cgoso_unix.go diff --git a/misc/cgo/testso/main.go b/misc/cgo/testso/testdata/main.go similarity index 92% rename from misc/cgo/testso/main.go rename to misc/cgo/testso/testdata/main.go index 88aa4322d2..963d45121e 100644 --- a/misc/cgo/testso/main.go +++ b/misc/cgo/testso/testdata/main.go @@ -6,7 +6,7 @@ package main -import "." +import "cgosotest" func main() { cgosotest.Test() diff --git a/misc/cgo/testsovar/noso_test.go b/misc/cgo/testsovar/noso_test.go new file mode 100644 index 0000000000..c88aebfb02 --- /dev/null +++ b/misc/cgo/testsovar/noso_test.go @@ -0,0 +1,9 @@ +// Copyright 2019 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. + +// +build !cgo + +package so_test + +// Nothing to test. diff --git a/misc/cgo/testsovar/overlaydir_test.go b/misc/cgo/testsovar/overlaydir_test.go new file mode 100644 index 0000000000..10c874d925 --- /dev/null +++ b/misc/cgo/testsovar/overlaydir_test.go @@ -0,0 +1,81 @@ +// Copyright 2019 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 so_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + symBase, err := filepath.Rel(srcRoot, dstRoot) + if err != nil { + symBase, err = filepath.Abs(srcRoot) + if err != nil { + return err + } + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/cgo/testsovar/so_test.go b/misc/cgo/testsovar/so_test.go new file mode 100644 index 0000000000..500b08fae8 --- /dev/null +++ b/misc/cgo/testsovar/so_test.go @@ -0,0 +1,126 @@ +// Copyright 2019 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. + +// +build cgo + +package so_test + +import ( + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" +) + +func requireTestSOSupported(t *testing.T) { + t.Helper() + switch runtime.GOARCH { + case "arm", "arm64": + if runtime.GOOS == "darwin" { + t.Skip("No exec facility on iOS.") + } + case "ppc64": + t.Skip("External linking not implemented on ppc64 (issue #8912).") + case "mips64le", "mips64": + t.Skip("External linking not implemented on mips64.") + } + if runtime.GOOS == "android" { + t.Skip("No exec facility on Android.") + } +} + +func TestSO(t *testing.T) { + requireTestSOSupported(t) + + GOPATH, err := ioutil.TempDir("", "cgosotest") + if err != nil { + log.Fatal(err) + } + defer os.RemoveAll(GOPATH) + + modRoot := filepath.Join(GOPATH, "src", "cgosotest") + if err := overlayDir(modRoot, "testdata"); err != nil { + log.Panic(err) + } + if err := ioutil.WriteFile(filepath.Join(modRoot, "go.mod"), []byte("module cgosotest\n"), 0666); err != nil { + log.Panic(err) + } + + cmd := exec.Command("go", "env", "CC", "GOGCCFLAGS") + cmd.Dir = modRoot + cmd.Stderr = new(strings.Builder) + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err := cmd.Output() + if err != nil { + t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) + } + lines := strings.Split(string(out), "\n") + if len(lines) != 3 || lines[2] != "" { + t.Fatalf("Unexpected output from %s:\n%s", strings.Join(cmd.Args, " "), lines) + } + + cc := lines[0] + if cc == "" { + t.Fatal("CC environment variable (go env CC) cannot be empty") + } + gogccflags := strings.Split(lines[1], " ") + + // build shared object + ext := "so" + args := append(gogccflags, "-shared") + switch runtime.GOOS { + case "darwin": + ext = "dylib" + args = append(args, "-undefined", "suppress", "-flat_namespace") + case "windows": + ext = "dll" + args = append(args, "-DEXPORT_DLL") + } + sofname := "libcgosotest." + ext + args = append(args, "-o", sofname, "cgoso_c.c") + + cmd = exec.Command(cc, args...) + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + + cmd = exec.Command("go", "build", "-o", "main.exe", "main.go") + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + + cmd = exec.Command("./main.exe") + cmd.Dir = modRoot + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + if runtime.GOOS != "windows" { + s := "LD_LIBRARY_PATH" + if runtime.GOOS == "darwin" { + s = "DYLD_LIBRARY_PATH" + } + cmd.Env = append(os.Environ(), s+"=.") + + // On FreeBSD 64-bit architectures, the 32-bit linker looks for + // different environment variables. + if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { + cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.") + } + } + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) +} diff --git a/misc/cgo/testsovar/cgoso.go b/misc/cgo/testsovar/testdata/cgoso.go similarity index 100% rename from misc/cgo/testsovar/cgoso.go rename to misc/cgo/testsovar/testdata/cgoso.go diff --git a/misc/cgo/testsovar/cgoso_c.c b/misc/cgo/testsovar/testdata/cgoso_c.c similarity index 100% rename from misc/cgo/testsovar/cgoso_c.c rename to misc/cgo/testsovar/testdata/cgoso_c.c diff --git a/misc/cgo/testsovar/cgoso_c.h b/misc/cgo/testsovar/testdata/cgoso_c.h similarity index 100% rename from misc/cgo/testsovar/cgoso_c.h rename to misc/cgo/testsovar/testdata/cgoso_c.h diff --git a/misc/cgo/testsovar/main.go b/misc/cgo/testsovar/testdata/main.go similarity index 92% rename from misc/cgo/testsovar/main.go rename to misc/cgo/testsovar/testdata/main.go index 9c8a1c4e66..87b52cef60 100644 --- a/misc/cgo/testsovar/main.go +++ b/misc/cgo/testsovar/testdata/main.go @@ -6,7 +6,7 @@ package main -import "." +import "cgosotest" func main() { cgosotest.Test() diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index c5cc6dcb3c..31b44e8ef4 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -6,7 +6,6 @@ package main import ( "bytes" - "errors" "flag" "fmt" "io/ioutil" @@ -675,22 +674,8 @@ func (t *tester) registerTests() { // recompile the entire standard library. If make.bash ran with // special -gcflags, that's not true. if t.cgoEnabled && gogcflags == "" { - if t.cgoTestSOSupported() { - t.tests = append(t.tests, distTest{ - name: "testso", - heading: "../misc/cgo/testso", - fn: func(dt *distTest) error { - return t.cgoTestSO(dt, "misc/cgo/testso") - }, - }) - t.tests = append(t.tests, distTest{ - name: "testsovar", - heading: "../misc/cgo/testsovar", - fn: func(dt *distTest) error { - return t.cgoTestSO(dt, "misc/cgo/testsovar") - }, - }) - } + t.registerHostTest("testso", "../misc/cgo/testso", "misc/cgo/testso", ".") + t.registerHostTest("testsovar", "../misc/cgo/testsovar", "misc/cgo/testsovar", ".") if t.supportedBuildmode("c-archive") { t.registerHostTest("testcarchive", "../misc/cgo/testcarchive", "misc/cgo/testcarchive", ".") } @@ -1166,85 +1151,6 @@ func (t *tester) runPending(nextTest *distTest) { } } -func (t *tester) cgoTestSOSupported() bool { - if goos == "android" || t.iOS() { - // No exec facility on Android or iOS. - return false - } - if goarch == "ppc64" { - // External linking not implemented on ppc64 (issue #8912). - return false - } - if goarch == "mips64le" || goarch == "mips64" { - // External linking not implemented on mips64. - return false - } - return true -} - -func (t *tester) cgoTestSO(dt *distTest, testpath string) error { - t.runPending(dt) - - timelog("start", dt.name) - defer timelog("end", dt.name) - - dir := filepath.Join(goroot, testpath) - - // build shared object - output, err := exec.Command("go", "env", "CC").Output() - if err != nil { - return fmt.Errorf("Error running go env CC: %v", err) - } - cc := strings.TrimSuffix(string(output), "\n") - if cc == "" { - return errors.New("CC environment variable (go env CC) cannot be empty") - } - output, err = exec.Command("go", "env", "GOGCCFLAGS").Output() - if err != nil { - return fmt.Errorf("Error running go env GOGCCFLAGS: %v", err) - } - gogccflags := strings.Split(strings.TrimSuffix(string(output), "\n"), " ") - - ext := "so" - args := append(gogccflags, "-shared") - switch goos { - case "darwin": - ext = "dylib" - args = append(args, "-undefined", "suppress", "-flat_namespace") - case "windows": - ext = "dll" - args = append(args, "-DEXPORT_DLL") - } - sofname := "libcgosotest." + ext - args = append(args, "-o", sofname, "cgoso_c.c") - - if err := t.dirCmd(dir, cc, args).Run(); err != nil { - return err - } - defer os.Remove(filepath.Join(dir, sofname)) - - if err := t.dirCmd(dir, "go", "build", "-o", "main.exe", "main.go").Run(); err != nil { - return err - } - defer os.Remove(filepath.Join(dir, "main.exe")) - - cmd := t.dirCmd(dir, "./main.exe") - if goos != "windows" { - s := "LD_LIBRARY_PATH" - if goos == "darwin" { - s = "DYLD_LIBRARY_PATH" - } - cmd.Env = append(os.Environ(), s+"=.") - - // On FreeBSD 64-bit architectures, the 32-bit linker looks for - // different environment variables. - if goos == "freebsd" && gohostarch == "386" { - cmd.Env = append(cmd.Env, "LD_32_LIBRARY_PATH=.") - } - } - return cmd.Run() -} - func (t *tester) hasBash() bool { switch gohostos { case "windows", "plan9": -- GitLab From c6da080b1a74b295ea3dba373234934af949e480 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 15:11:16 -0500 Subject: [PATCH 0075/1679] misc/cgo/testgodefs: move source files into testdata These source files fail to build with 'go test ./...'. Move them into testdata so that only test.bash will see them. Updates #30228 Change-Id: I3673f3cb64b0c128a2bca5fee7679b672fe90770 Reviewed-on: https://go-review.googlesource.com/c/163212 Reviewed-by: Ian Lance Taylor --- misc/cgo/testgodefs/test.bash | 4 +++- misc/cgo/testgodefs/{ => testdata}/anonunion.go | 0 misc/cgo/testgodefs/{ => testdata}/fieldtypedef.go | 0 misc/cgo/testgodefs/{ => testdata}/issue8478.go | 0 misc/cgo/testgodefs/{ => testdata}/main.go | 0 5 files changed, 3 insertions(+), 1 deletion(-) rename misc/cgo/testgodefs/{ => testdata}/anonunion.go (100%) rename misc/cgo/testgodefs/{ => testdata}/fieldtypedef.go (100%) rename misc/cgo/testgodefs/{ => testdata}/issue8478.go (100%) rename misc/cgo/testgodefs/{ => testdata}/main.go (100%) diff --git a/misc/cgo/testgodefs/test.bash b/misc/cgo/testgodefs/test.bash index 012d007fc3..e4ce2ee7a8 100755 --- a/misc/cgo/testgodefs/test.bash +++ b/misc/cgo/testgodefs/test.bash @@ -9,6 +9,8 @@ # import "C" block. Add more tests here. FILE_PREFIXES="anonunion issue8478 fieldtypedef" +cd testdata + RM= for FP in $FILE_PREFIXES do @@ -16,7 +18,7 @@ do RM="${RM} ${FP}_defs.go" done -go build . && ./testgodefs +go build -o testgodefs . && ./testgodefs EXIT=$? rm -rf _obj testgodefs ${RM} exit $EXIT diff --git a/misc/cgo/testgodefs/anonunion.go b/misc/cgo/testgodefs/testdata/anonunion.go similarity index 100% rename from misc/cgo/testgodefs/anonunion.go rename to misc/cgo/testgodefs/testdata/anonunion.go diff --git a/misc/cgo/testgodefs/fieldtypedef.go b/misc/cgo/testgodefs/testdata/fieldtypedef.go similarity index 100% rename from misc/cgo/testgodefs/fieldtypedef.go rename to misc/cgo/testgodefs/testdata/fieldtypedef.go diff --git a/misc/cgo/testgodefs/issue8478.go b/misc/cgo/testgodefs/testdata/issue8478.go similarity index 100% rename from misc/cgo/testgodefs/issue8478.go rename to misc/cgo/testgodefs/testdata/issue8478.go diff --git a/misc/cgo/testgodefs/main.go b/misc/cgo/testgodefs/testdata/main.go similarity index 100% rename from misc/cgo/testgodefs/main.go rename to misc/cgo/testgodefs/testdata/main.go -- GitLab From 1670da9ee4aabe3a9e35703d5ca34265d2294e99 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 22 Feb 2019 15:58:15 -0500 Subject: [PATCH 0076/1679] test: add a go.mod file in the working directory of nosplit.go Updates #30228 Change-Id: I41bbedf15fa51242f69a3b1ecafd0d3191271799 Reviewed-on: https://go-review.googlesource.com/c/163518 Reviewed-by: Jay Conrod --- test/nosplit.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/nosplit.go b/test/nosplit.go index 734f456cc9..46810b1a2f 100644 --- a/test/nosplit.go +++ b/test/nosplit.go @@ -218,6 +218,10 @@ func main() { } defer os.RemoveAll(dir) + if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), []byte("module go-test-nosplit\n"), 0666); err != nil { + log.Panic(err) + } + tests = strings.Replace(tests, "\t", " ", -1) tests = commentRE.ReplaceAllString(tests, "") -- GitLab From 50bb2b6b0f11e4e3ef73aee55946cd4da546f6b1 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 20 Feb 2019 18:11:11 -0500 Subject: [PATCH 0077/1679] cmd/go: allow "stdout" and "stderr" as inputs to script_test "cp" command Updates #30241 Change-Id: I543d8914faf810835d3327baa3c84b3dff124156 Reviewed-on: https://go-review.googlesource.com/c/163519 Reviewed-by: Ian Lance Taylor --- src/cmd/go/script_test.go | 29 +++++++++++++++++++++++------ src/cmd/go/testdata/script/README | 2 ++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index c56c1fd3e4..9cc2521e79 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -509,16 +509,33 @@ func (ts *testScript) cmdCp(neg bool, args []string) { } for _, arg := range args[:len(args)-1] { - src := ts.mkabs(arg) - info, err := os.Stat(src) - ts.check(err) - data, err := ioutil.ReadFile(src) - ts.check(err) + var ( + src string + data []byte + mode os.FileMode + ) + switch arg { + case "stdout": + src = arg + data = []byte(ts.stdout) + mode = 0666 + case "stderr": + src = arg + data = []byte(ts.stderr) + mode = 0666 + default: + src = ts.mkabs(arg) + info, err := os.Stat(src) + ts.check(err) + mode = info.Mode() & 0777 + data, err = ioutil.ReadFile(src) + ts.check(err) + } targ := dst if dstDir { targ = filepath.Join(dst, filepath.Base(src)) } - ts.check(ioutil.WriteFile(targ, data, info.Mode()&0777)) + ts.check(ioutil.WriteFile(targ, data, mode)) } } diff --git a/src/cmd/go/testdata/script/README b/src/cmd/go/testdata/script/README index a7b50fff16..0c34333823 100644 --- a/src/cmd/go/testdata/script/README +++ b/src/cmd/go/testdata/script/README @@ -108,6 +108,8 @@ The commands are: - cp src... dst Copy the listed files to the target file or existing directory. + src can include "stdout" or "stderr" to use the standard output or standard error + from the most recent exec or go command. - env [key=value...] With no arguments, print the environment (useful for debugging). -- GitLab From e1a6d1fc08b2701ac9f67353cb52c51d52877669 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 22:13:54 -0500 Subject: [PATCH 0078/1679] fmt: format hex floats and complexes This CL modifies fmt's printer to implement %x and %X for formatting floating-point data (floats and complexes) in standard hexadecimal notation. See golang.org/design/19308-number-literals for background. For #29008. Vet update is #29986. Change-Id: If2842a11631bc393a1ebcf6914ed07658652af5a Reviewed-on: https://go-review.googlesource.com/c/160245 Reviewed-by: Robert Griesemer Reviewed-by: Rob Pike --- src/fmt/doc.go | 2 ++ src/fmt/fmt_test.go | 24 ++++++++++++++++++++++++ src/fmt/format.go | 15 +++++++++++---- src/fmt/print.go | 4 ++-- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/fmt/doc.go b/src/fmt/doc.go index 3b657f3681..c349f8e321 100644 --- a/src/fmt/doc.go +++ b/src/fmt/doc.go @@ -40,6 +40,8 @@ %F synonym for %f %g %e for large exponents, %f otherwise. Precision is discussed below. %G %E for large exponents, %F otherwise + %x hexadecimal notation (with decimal power of two exponent), e.g. -0x1.23abcp+20 + %X upper-case hexadecimal notation, e.g. -0X1.23ABCP+20 String and slice of bytes (treated equivalently with these verbs): %s the uninterpreted bytes of the string or slice %q a double-quoted string safely escaped with Go syntax diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 068c2620a8..2d10c7a841 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -413,6 +413,8 @@ var fmtTests = []struct { // floats {"%+.3e", 0.0, "+0.000e+00"}, {"%+.3e", 1.0, "+1.000e+00"}, + {"%+.3x", 0.0, "+0x0.000p+00"}, + {"%+.3x", 1.0, "+0x1.000p+00"}, {"%+.3f", -1.0, "-1.000"}, {"%+.3F", -1.0, "-1.000"}, {"%+.3F", float32(-1.0), "-1.000"}, @@ -428,6 +430,8 @@ var fmtTests = []struct { {"%+10.2f", -1.0, " -1.00"}, {"% .3E", -1.0, "-1.000E+00"}, {"% .3e", 1.0, " 1.000e+00"}, + {"% .3X", -1.0, "-0X1.000P+00"}, + {"% .3x", 1.0, " 0x1.000p+00"}, {"%+.3g", 0.0, "+0"}, {"%+.3g", 1.0, "+1"}, {"%+.3g", -1.0, "-1"}, @@ -445,17 +449,21 @@ var fmtTests = []struct { {"%#g", 1000000.0, "1.00000e+06"}, {"%#.0f", 1.0, "1."}, {"%#.0e", 1.0, "1.e+00"}, + {"%#.0x", 1.0, "0x1.p+00"}, {"%#.0g", 1.0, "1."}, {"%#.0g", 1100000.0, "1.e+06"}, {"%#.4f", 1.0, "1.0000"}, {"%#.4e", 1.0, "1.0000e+00"}, + {"%#.4x", 1.0, "0x1.0000p+00"}, {"%#.4g", 1.0, "1.000"}, {"%#.4g", 100000.0, "1.000e+05"}, {"%#.0f", 123.0, "123."}, {"%#.0e", 123.0, "1.e+02"}, + {"%#.0x", 123.0, "0x1.p+07"}, {"%#.0g", 123.0, "1.e+02"}, {"%#.4f", 123.0, "123.0000"}, {"%#.4e", 123.0, "1.2300e+02"}, + {"%#.4x", 123.0, "0x1.ec00p+06"}, {"%#.4g", 123.0, "123.0"}, {"%#.4g", 123000.0, "1.230e+05"}, {"%#9.4g", 1.0, " 1.000"}, @@ -474,17 +482,23 @@ var fmtTests = []struct { {"%20f", posInf, " +Inf"}, {"% 20F", posInf, " Inf"}, {"% 20e", negInf, " -Inf"}, + {"% 20x", negInf, " -Inf"}, {"%+20E", negInf, " -Inf"}, + {"%+20X", negInf, " -Inf"}, {"% +20g", negInf, " -Inf"}, {"%+-20G", posInf, "+Inf "}, {"%20e", NaN, " NaN"}, + {"%20x", NaN, " NaN"}, {"% +20E", NaN, " +NaN"}, + {"% +20X", NaN, " +NaN"}, {"% -20g", NaN, " NaN "}, {"%+-20G", NaN, "+NaN "}, // Zero padding does not apply to infinities and NaN. {"%+020e", posInf, " +Inf"}, + {"%+020x", posInf, " +Inf"}, {"%-020f", negInf, "-Inf "}, {"%-020E", NaN, "NaN "}, + {"%-020X", NaN, "NaN "}, // complex values {"%.f", 0i, "(0+0i)"}, @@ -492,23 +506,29 @@ var fmtTests = []struct { {"%+.f", 0i, "(+0+0i)"}, {"% +.f", 0i, "(+0+0i)"}, {"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"}, + {"%+.3x", 0i, "(+0x0.000p+00+0x0.000p+00i)"}, {"%+.3f", 0i, "(+0.000+0.000i)"}, {"%+.3g", 0i, "(+0+0i)"}, {"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"}, + {"%+.3x", 1 + 2i, "(+0x1.000p+00+0x1.000p+01i)"}, {"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, {"%.3e", 0i, "(0.000e+00+0.000e+00i)"}, + {"%.3x", 0i, "(0x0.000p+00+0x0.000p+00i)"}, {"%.3f", 0i, "(0.000+0.000i)"}, {"%.3F", 0i, "(0.000+0.000i)"}, {"%.3F", complex64(0i), "(0.000+0.000i)"}, {"%.3g", 0i, "(0+0i)"}, {"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"}, + {"%.3x", 1 + 2i, "(0x1.000p+00+0x1.000p+01i)"}, {"%.3f", 1 + 2i, "(1.000+2.000i)"}, {"%.3g", 1 + 2i, "(1+2i)"}, {"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"}, + {"%.3x", -1 - 2i, "(-0x1.000p+00-0x1.000p+01i)"}, {"%.3f", -1 - 2i, "(-1.000-2.000i)"}, {"%.3g", -1 - 2i, "(-1-2i)"}, {"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"}, + {"% .3X", -1 - 2i, "(-0X1.000P+00-0X1.000P+01i)"}, {"%+.3g", 1 + 2i, "(+1+2i)"}, {"%+.3g", complex64(1 + 2i), "(+1+2i)"}, {"%#g", 1 + 2i, "(1.00000+2.00000i)"}, @@ -517,11 +537,13 @@ var fmtTests = []struct { {"%#g", -1e10 - 1.11e100i, "(-1.00000e+10-1.11000e+100i)"}, {"%#.0f", 1.23 + 1.0i, "(1.+1.i)"}, {"%#.0e", 1.23 + 1.0i, "(1.e+00+1.e+00i)"}, + {"%#.0x", 1.23 + 1.0i, "(0x1.p+00+0x1.p+00i)"}, {"%#.0g", 1.23 + 1.0i, "(1.+1.i)"}, {"%#.0g", 0 + 100000i, "(0.+1.e+05i)"}, {"%#.0g", 1230000 + 0i, "(1.e+06+0.i)"}, {"%#.4f", 1 + 1.23i, "(1.0000+1.2300i)"}, {"%#.4e", 123 + 1i, "(1.2300e+02+1.0000e+00i)"}, + {"%#.4x", 123 + 1i, "(0x1.ec00p+06+0x1.0000p+00i)"}, {"%#.4g", 123 + 1.23i, "(123.0+1.230i)"}, {"%#12.5g", 0 + 100000i, "( 0.0000 +1.0000e+05i)"}, {"%#12.5g", 1230000 - 0i, "( 1.2300e+06 +0.0000i)"}, @@ -541,7 +563,9 @@ var fmtTests = []struct { {"% f", complex(negInf, negInf), "(-Inf-Infi)"}, {"% f", complex(NaN, NaN), "( NaN+NaNi)"}, {"%8e", complex(posInf, posInf), "( +Inf +Infi)"}, + {"%8x", complex(posInf, posInf), "( +Inf +Infi)"}, {"% 8E", complex(posInf, posInf), "( Inf +Infi)"}, + {"% 8X", complex(posInf, posInf), "( Inf +Infi)"}, {"%+8f", complex(negInf, negInf), "( -Inf -Infi)"}, {"% +8g", complex(negInf, negInf), "( -Inf -Infi)"}, {"% -8G", complex(NaN, NaN), "( NaN +NaN i)"}, diff --git a/src/fmt/format.go b/src/fmt/format.go index d6da8aed1e..6d93908095 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -510,7 +510,7 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { if f.sharp && verb != 'b' { digits := 0 switch verb { - case 'v', 'g', 'G': + case 'v', 'g', 'G', 'x': digits = prec // If no precision is set explicitly use a precision of 6. if digits == -1 { @@ -519,8 +519,8 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { } // Buffer pre-allocated with enough room for - // exponent notations of the form "e+123". - var tailBuf [5]byte + // exponent notations of the form "e+123" or "p-1023". + var tailBuf [6]byte tail := tailBuf[:0] hasDecimalPoint := false @@ -529,9 +529,16 @@ func (f *fmt) fmtFloat(v float64, size int, verb rune, prec int) { switch num[i] { case '.': hasDecimalPoint = true - case 'e', 'E': + case 'p', 'P': tail = append(tail, num[i:]...) num = num[:i] + case 'e', 'E': + if verb != 'x' && verb != 'X' { + tail = append(tail, num[i:]...) + num = num[:i] + break + } + fallthrough default: digits-- } diff --git a/src/fmt/print.go b/src/fmt/print.go index 42fcd8b979..9976b8d263 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -407,7 +407,7 @@ func (p *pp) fmtFloat(v float64, size int, verb rune) { switch verb { case 'v': p.fmt.fmtFloat(v, size, 'g', -1) - case 'b', 'g', 'G': + case 'b', 'g', 'G', 'x', 'X': p.fmt.fmtFloat(v, size, verb, -1) case 'f', 'e', 'E': p.fmt.fmtFloat(v, size, verb, 6) @@ -425,7 +425,7 @@ func (p *pp) fmtComplex(v complex128, size int, verb rune) { // Make sure any unsupported verbs are found before the // calls to fmtFloat to not generate an incorrect error string. switch verb { - case 'v', 'b', 'g', 'G', 'f', 'F', 'e', 'E': + case 'v', 'b', 'g', 'G', 'x', 'X', 'f', 'F', 'e', 'E': oldPlus := p.fmt.plus p.buf.WriteByte('(') p.fmtFloat(real(v), size/2, verb) -- GitLab From ac51237affc016dd22f5b4f67dc8a2d09adf1fb2 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 22:24:36 -0500 Subject: [PATCH 0079/1679] fmt: format 0b, 0o prefixes in %#b and %O This CL modifies fmt's printer to implement %#b and %O to emit leading 0b and 0o prefixes on binary and octal. (%#o is already taken and emits "0377"; %O emits "0o377".) See golang.org/design/19308-number-literals for background. For #19308. For #12711. Vet update is #29986. Change-Id: I7c38a4484c48a03abe9f6d45c7d981c7c314f583 Reviewed-on: https://go-review.googlesource.com/c/160246 Reviewed-by: Robert Griesemer Reviewed-by: Rob Pike --- src/fmt/doc.go | 5 +++-- src/fmt/fmt_test.go | 6 ++++++ src/fmt/format.go | 14 +++++++++++++- src/fmt/print.go | 18 +++++++++--------- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/fmt/doc.go b/src/fmt/doc.go index c349f8e321..e0edff456c 100644 --- a/src/fmt/doc.go +++ b/src/fmt/doc.go @@ -26,6 +26,7 @@ %c the character represented by the corresponding Unicode code point %d base 10 %o base 8 + %O base 8 with 0o prefix %q a single-quoted character literal safely escaped with Go syntax. %x base 16, with lower-case letters for a-f %X base 16, with upper-case letters for A-F @@ -113,8 +114,8 @@ + always print a sign for numeric values; guarantee ASCII-only output for %q (%+q) - pad with spaces on the right rather than the left (left-justify the field) - # alternate format: add leading 0 for octal (%#o), 0x for hex (%#x); - 0X for hex (%#X); suppress 0x for %p (%#p); + # alternate format: add leading 0b for binary (%#b), 0 for octal (%#o), + 0x or 0X for hex (%#x or %#X); suppress 0x for %p (%#p); for %q, print a raw (backquoted) string if strconv.CanBackquote returns true; always print a decimal point for %e, %E, %f, %F, %g and %G; diff --git a/src/fmt/fmt_test.go b/src/fmt/fmt_test.go index 2d10c7a841..bbaf40a619 100644 --- a/src/fmt/fmt_test.go +++ b/src/fmt/fmt_test.go @@ -354,11 +354,17 @@ var fmtTests = []struct { {"%+d", -12345, "-12345"}, {"%b", 7, "111"}, {"%b", -6, "-110"}, + {"%#b", 7, "0b111"}, + {"%#b", -6, "-0b110"}, {"%b", ^uint32(0), "11111111111111111111111111111111"}, {"%b", ^uint64(0), "1111111111111111111111111111111111111111111111111111111111111111"}, {"%b", int64(-1 << 63), zeroFill("-1", 63, "")}, {"%o", 01234, "1234"}, + {"%o", -01234, "-1234"}, {"%#o", 01234, "01234"}, + {"%#o", -01234, "-01234"}, + {"%O", 01234, "0o1234"}, + {"%O", -01234, "-0o1234"}, {"%o", ^uint32(0), "37777777777"}, {"%o", ^uint64(0), "1777777777777777777777"}, {"%#X", 0, "0X0"}, diff --git a/src/fmt/format.go b/src/fmt/format.go index 6d93908095..24e7e9551a 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -191,7 +191,7 @@ func (f *fmt) fmtUnicode(u uint64) { } // fmtInteger formats signed and unsigned integers. -func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { +func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, verb rune, digits string) { negative := isSigned && int64(u) < 0 if negative { u = -u @@ -275,6 +275,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { // Various prefixes: 0x, -, etc. if f.sharp { switch base { + case 2: + // Add a leading 0b. + i-- + buf[i] = 'b' + i-- + buf[i] = '0' case 8: if buf[i] != '0' { i-- @@ -288,6 +294,12 @@ func (f *fmt) fmtInteger(u uint64, base int, isSigned bool, digits string) { buf[i] = '0' } } + if verb == 'O' { + i-- + buf[i] = 'o' + i-- + buf[i] = '0' + } if negative { i-- diff --git a/src/fmt/print.go b/src/fmt/print.go index 9976b8d263..121c7c59e4 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -363,7 +363,7 @@ func (p *pp) fmtBool(v bool, verb rune) { func (p *pp) fmt0x64(v uint64, leading0x bool) { sharp := p.fmt.sharp p.fmt.sharp = leading0x - p.fmt.fmtInteger(v, 16, unsigned, ldigits) + p.fmt.fmtInteger(v, 16, unsigned, 'v', ldigits) p.fmt.sharp = sharp } @@ -374,18 +374,18 @@ func (p *pp) fmtInteger(v uint64, isSigned bool, verb rune) { if p.fmt.sharpV && !isSigned { p.fmt0x64(v, true) } else { - p.fmt.fmtInteger(v, 10, isSigned, ldigits) + p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits) } case 'd': - p.fmt.fmtInteger(v, 10, isSigned, ldigits) + p.fmt.fmtInteger(v, 10, isSigned, verb, ldigits) case 'b': - p.fmt.fmtInteger(v, 2, isSigned, ldigits) - case 'o': - p.fmt.fmtInteger(v, 8, isSigned, ldigits) + p.fmt.fmtInteger(v, 2, isSigned, verb, ldigits) + case 'o', 'O': + p.fmt.fmtInteger(v, 8, isSigned, verb, ldigits) case 'x': - p.fmt.fmtInteger(v, 16, isSigned, ldigits) + p.fmt.fmtInteger(v, 16, isSigned, verb, ldigits) case 'X': - p.fmt.fmtInteger(v, 16, isSigned, udigits) + p.fmt.fmtInteger(v, 16, isSigned, verb, udigits) case 'c': p.fmt.fmtC(v) case 'q': @@ -483,7 +483,7 @@ func (p *pp) fmtBytes(v []byte, verb rune, typeString string) { if i > 0 { p.buf.WriteByte(' ') } - p.fmt.fmtInteger(uint64(c), 10, unsigned, ldigits) + p.fmt.fmtInteger(uint64(c), 10, unsigned, verb, ldigits) } p.buf.WriteByte(']') } -- GitLab From f601d412ceae1338999b203c50168af34285c634 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 23:06:06 -0500 Subject: [PATCH 0080/1679] fmt: scan new number syntax This CL updates fmt's scanner to accept the new number syntaxes: - Hexadecimal floating-point values. - Digit-separating underscores. - Leading 0b and 0o prefixes. See golang.org/design/19308-number-literals for background. For #12711. For #19308. For #28493. For #29008. Change-Id: I5582af5c94059c781e6cf4e862441d3df3006adf Reviewed-on: https://go-review.googlesource.com/c/160247 Reviewed-by: Robert Griesemer --- src/fmt/doc.go | 15 ++++++------- src/fmt/scan.go | 50 ++++++++++++++++++++++++++++++++------------ src/fmt/scan_test.go | 38 +++++++++++++++++++++++++++++++-- 3 files changed, 81 insertions(+), 22 deletions(-) diff --git a/src/fmt/doc.go b/src/fmt/doc.go index e0edff456c..2cb409b617 100644 --- a/src/fmt/doc.go +++ b/src/fmt/doc.go @@ -286,10 +286,10 @@ For example, %x will scan an integer as a hexadecimal number, and %v will scan the default representation format for the value. The Printf verbs %p and %T and the flags # and + are not implemented. - The verbs %e %E %f %F %g and %G are all equivalent and scan any - floating-point or complex value. For float and complex literals in - scientific notation, both the decimal (e) and binary (p) exponent - formats are supported (for example: "2.3e+7" and "4.5p-8"). + For floating-point and complex values, all valid formatting verbs + (%b %e %E %f %F %g %G %x %X and %v) are equivalent and accept + both decimal and hexadecimal notation (for example: "2.3e+7", "0x4.5p-8") + and digit-separating underscores (for example: "3.14159_26535_89793"). Input processed by verbs is implicitly space-delimited: the implementation of every verb except %c starts by discarding @@ -297,9 +297,10 @@ (and %v reading into a string) stops consuming input at the first space or newline character. - The familiar base-setting prefixes 0 (octal) and 0x - (hexadecimal) are accepted when scanning integers without - a format or with the %v verb. + The familiar base-setting prefixes 0b (binary), 0o and 0 (octal), + and 0x (hexadecimal) are accepted when scanning integers + without a format or with the %v verb, as are digit-separating + underscores. Width is interpreted in the input text but there is no syntax for scanning with a precision (no %5.2f, just %5f). diff --git a/src/fmt/scan.go b/src/fmt/scan.go index ae79e39dee..d42703cb71 100644 --- a/src/fmt/scan.go +++ b/src/fmt/scan.go @@ -562,7 +562,7 @@ const ( hexadecimalDigits = "0123456789aAbBcCdDeEfF" sign = "+-" period = "." - exponent = "eEp" + exponent = "eEpP" ) // getBase returns the numeric base represented by the verb and its digit string. @@ -609,20 +609,26 @@ func (s *ss) scanRune(bitSize int) int64 { return r } -// scanBasePrefix reports whether the integer begins with a 0 or 0x, +// scanBasePrefix reports whether the integer begins with a bas prefix // and returns the base, digit string, and whether a zero was found. // It is called only if the verb is %v. func (s *ss) scanBasePrefix() (base int, digits string, found bool) { if !s.peek("0") { - return 10, decimalDigits, false + return 0, decimalDigits + "_", false } s.accept("0") found = true // We've put a digit into the token buffer. - // Special cases for '0' && '0x' - base, digits = 8, octalDigits - if s.peek("xX") { - s.consume("xX", false) - base, digits = 16, hexadecimalDigits + // Special cases for 0, 0b, 0o, 0x. + base, digits = 0, octalDigits+"_" + if s.peek("bB") { + s.consume("bB", true) + base, digits = 0, binaryDigits+"_" + } else if s.peek("oO") { + s.consume("oO", true) + base, digits = 0, octalDigits+"_" + } else if s.peek("xX") { + s.consume("xX", true) + base, digits = 0, hexadecimalDigits+"_" } return } @@ -705,21 +711,27 @@ func (s *ss) floatToken() string { if s.accept("iI") && s.accept("nN") && s.accept("fF") { return string(s.buf) } + digits := decimalDigits + "_" + exp := exponent + if s.accept("0") && s.accept("xX") { + digits = hexadecimalDigits + "_" + exp = "pP" + } // digits? - for s.accept(decimalDigits) { + for s.accept(digits) { } // decimal point? if s.accept(period) { // fraction? - for s.accept(decimalDigits) { + for s.accept(digits) { } } // exponent? - if s.accept(exponent) { + if s.accept(exp) { // leading sign? s.accept(sign) // digits? - for s.accept(decimalDigits) { + for s.accept(decimalDigits + "_") { } } return string(s.buf) @@ -749,9 +761,21 @@ func (s *ss) complexTokens() (real, imag string) { return real, imagSign + imag } +func hasX(s string) bool { + for i := 0; i < len(s); i++ { + if s[i] == 'x' || s[i] == 'X' { + return true + } + } + return false +} + // convertFloat converts the string to a float64value. func (s *ss) convertFloat(str string, n int) float64 { - if p := indexRune(str, 'p'); p >= 0 { + // strconv.ParseFloat will handle "+0x1.fp+2", + // but we have to implement our non-standard + // decimal+binary exponent mix (1.2p4) ourselves. + if p := indexRune(str, 'p'); p >= 0 && !hasX(str) { // Atof doesn't handle power-of-2 exponents, // but they're easy to evaluate. f, err := strconv.ParseFloat(str[:p], n) diff --git a/src/fmt/scan_test.go b/src/fmt/scan_test.go index d7019d9439..b14a6f5deb 100644 --- a/src/fmt/scan_test.go +++ b/src/fmt/scan_test.go @@ -124,12 +124,18 @@ var scanTests = []ScanTest{ {"T\n", &boolVal, true}, // boolean test vals toggle to be sure they are written {"F\n", &boolVal, false}, // restored to zero value {"21\n", &intVal, 21}, + {"2_1\n", &intVal, 21}, {"0\n", &intVal, 0}, {"000\n", &intVal, 0}, {"0x10\n", &intVal, 0x10}, + {"0x_1_0\n", &intVal, 0x10}, {"-0x10\n", &intVal, -0x10}, {"0377\n", &intVal, 0377}, + {"0_3_7_7\n", &intVal, 0377}, + {"0o377\n", &intVal, 0377}, + {"0o_3_7_7\n", &intVal, 0377}, {"-0377\n", &intVal, -0377}, + {"-0o377\n", &intVal, -0377}, {"0\n", &uintVal, uint(0)}, {"000\n", &uintVal, uint(0)}, {"0x10\n", &uintVal, uint(0x10)}, @@ -163,13 +169,20 @@ var scanTests = []ScanTest{ {"2.3e2\n", &float64Val, 2.3e2}, {"2.3p2\n", &float64Val, 2.3 * 4}, {"2.3p+2\n", &float64Val, 2.3 * 4}, - {"2.3p+66\n", &float64Val, 2.3 * (1 << 32) * (1 << 32) * 4}, - {"2.3p-66\n", &float64Val, 2.3 / ((1 << 32) * (1 << 32) * 4)}, + {"2.3p+66\n", &float64Val, 2.3 * (1 << 66)}, + {"2.3p-66\n", &float64Val, 2.3 / (1 << 66)}, + {"0x2.3p-66\n", &float64Val, float64(0x23) / (1 << 70)}, + {"2_3.4_5\n", &float64Val, 23.45}, {"2.35\n", &stringVal, "2.35"}, {"2345678\n", &bytesVal, []byte("2345678")}, {"(3.4e1-2i)\n", &complex128Val, 3.4e1 - 2i}, {"-3.45e1-3i\n", &complex64Val, complex64(-3.45e1 - 3i)}, {"-.45e1-1e2i\n", &complex128Val, complex128(-.45e1 - 100i)}, + {"-.4_5e1-1E2i\n", &complex128Val, complex128(-.45e1 - 100i)}, + {"0x1.0p1+0x1.0P2i\n", &complex128Val, complex128(2 + 4i)}, + {"-0x1p1-0x1p2i\n", &complex128Val, complex128(-2 - 4i)}, + {"-0x1ep-1-0x1p2i\n", &complex128Val, complex128(-15 - 4i)}, + {"-0x1_Ep-1-0x1p0_2i\n", &complex128Val, complex128(-15 - 4i)}, {"hello\n", &stringVal, "hello"}, // Carriage-return followed by newline. (We treat \r\n as \n always.) @@ -207,8 +220,15 @@ var scanfTests = []ScanfTest{ {"%v", "TRUE\n", &boolVal, true}, {"%t", "false\n", &boolVal, false}, {"%v", "-71\n", &intVal, -71}, + {"%v", "-7_1\n", &intVal, -71}, + {"%v", "0b111\n", &intVal, 7}, + {"%v", "0b_1_1_1\n", &intVal, 7}, {"%v", "0377\n", &intVal, 0377}, + {"%v", "0_3_7_7\n", &intVal, 0377}, + {"%v", "0o377\n", &intVal, 0377}, + {"%v", "0o_3_7_7\n", &intVal, 0377}, {"%v", "0x44\n", &intVal, 0x44}, + {"%v", "0x_4_4\n", &intVal, 0x44}, {"%d", "72\n", &intVal, 72}, {"%c", "a\n", &runeVal, 'a'}, {"%c", "\u5072\n", &runeVal, '\u5072'}, @@ -222,17 +242,31 @@ var scanfTests = []ScanfTest{ {"%x", "a75\n", &intVal, 0xa75}, {"%v", "71\n", &uintVal, uint(71)}, {"%d", "72\n", &uintVal, uint(72)}, + {"%d", "7_2\n", &uintVal, uint(7)}, // only %v takes underscores {"%d", "73\n", &uint8Val, uint8(73)}, {"%d", "74\n", &uint16Val, uint16(74)}, {"%d", "75\n", &uint32Val, uint32(75)}, {"%d", "76\n", &uint64Val, uint64(76)}, {"%b", "1001001\n", &uintVal, uint(73)}, + {"%b", "100_1001\n", &uintVal, uint(4)}, {"%o", "075\n", &uintVal, uint(075)}, + {"%o", "07_5\n", &uintVal, uint(07)}, // only %v takes underscores {"%x", "a75\n", &uintVal, uint(0xa75)}, {"%x", "A75\n", &uintVal, uint(0xa75)}, + {"%x", "A7_5\n", &uintVal, uint(0xa7)}, // only %v takes underscores {"%U", "U+1234\n", &intVal, int(0x1234)}, {"%U", "U+4567\n", &uintVal, uint(0x4567)}, + {"%e", "2.3\n", &float64Val, 2.3}, + {"%E", "2.3e1\n", &float32Val, float32(2.3e1)}, + {"%f", "2.3e2\n", &float64Val, 2.3e2}, + {"%g", "2.3p2\n", &float64Val, 2.3 * 4}, + {"%G", "2.3p+2\n", &float64Val, 2.3 * 4}, + {"%v", "2.3p+66\n", &float64Val, 2.3 * (1 << 66)}, + {"%f", "2.3p-66\n", &float64Val, 2.3 / (1 << 66)}, + {"%G", "0x2.3p-66\n", &float64Val, float64(0x23) / (1 << 70)}, + {"%E", "2_3.4_5\n", &float64Val, 23.45}, + // Strings {"%s", "using-%s\n", &stringVal, "using-%s"}, {"%x", "7573696e672d2578\n", &stringVal, "using-%x"}, -- GitLab From 3cf56e78d812069d2ffb65b5c29a76961b0b0af8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 29 Jan 2019 23:21:29 -0500 Subject: [PATCH 0081/1679] text/template: accept new number syntax This CL updates text/template's scanner to accept the new number syntaxes: - Hexadecimal floating-point values. - Digit-separating underscores. - Leading 0b and 0o prefixes. See golang.org/design/19308-number-literals for background. For #12711. For #19308. For #28493. For #29008. Change-Id: I68c16ea35c3f506701063781388de72bafee6b8d Reviewed-on: https://go-review.googlesource.com/c/160248 Reviewed-by: Rob Pike Reviewed-by: Robert Griesemer --- src/html/template/template_test.go | 6 ++++++ src/text/template/exec.go | 6 +++--- src/text/template/exec_test.go | 21 +++++++++++++++++++++ src/text/template/parse/lex.go | 21 ++++++++++++++++----- src/text/template/parse/lex_test.go | 12 +++++++++++- src/text/template/parse/node.go | 2 +- src/text/template/parse/parse_test.go | 12 ++++++++++++ 7 files changed, 70 insertions(+), 10 deletions(-) diff --git a/src/html/template/template_test.go b/src/html/template/template_test.go index 90c5a73ba7..13e6ba406e 100644 --- a/src/html/template/template_test.go +++ b/src/html/template/template_test.go @@ -115,6 +115,12 @@ func TestRedefineOtherParsers(t *testing.T) { } } +func TestNumbers(t *testing.T) { + c := newTestCase(t) + c.mustParse(c.root, `{{print 1_2.3_4}} {{print 0x0_1.e_0p+02}}`) + c.mustExecute(c.root, nil, "12.34 7.5") +} + type testCase struct { t *testing.T root *Template diff --git a/src/text/template/exec.go b/src/text/template/exec.go index c6ce657cf6..d34d248441 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -495,7 +495,7 @@ func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value { switch { case constant.IsComplex: return reflect.ValueOf(constant.Complex128) // incontrovertible. - case constant.IsFloat && !isHexConstant(constant.Text) && strings.ContainsAny(constant.Text, ".eE"): + case constant.IsFloat && !isHexInt(constant.Text) && strings.ContainsAny(constant.Text, ".eEpP"): return reflect.ValueOf(constant.Float64) case constant.IsInt: n := int(constant.Int64) @@ -509,8 +509,8 @@ func (s *state) idealConstant(constant *parse.NumberNode) reflect.Value { return zero } -func isHexConstant(s string) bool { - return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') +func isHexInt(s string) bool { + return len(s) > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X') && !strings.ContainsAny(s, "pP") } func (s *state) evalFieldNode(dot reflect.Value, field *parse.FieldNode, args []parse.Node, final reflect.Value) reflect.Value { diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index bfd6d38bf4..6cdb285bd8 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -542,6 +542,27 @@ var execTests = []execTest{ {"error method, error", "{{.MyError true}}", "", tVal, false}, {"error method, no error", "{{.MyError false}}", "false", tVal, true}, + // Numbers + {"decimal", "{{print 1234}}", "1234", tVal, true}, + {"decimal _", "{{print 12_34}}", "1234", tVal, true}, + {"binary", "{{print 0b101}}", "5", tVal, true}, + {"binary _", "{{print 0b_1_0_1}}", "5", tVal, true}, + {"BINARY", "{{print 0B101}}", "5", tVal, true}, + {"octal0", "{{print 0377}}", "255", tVal, true}, + {"octal", "{{print 0o377}}", "255", tVal, true}, + {"octal _", "{{print 0o_3_7_7}}", "255", tVal, true}, + {"OCTAL", "{{print 0O377}}", "255", tVal, true}, + {"hex", "{{print 0x123}}", "291", tVal, true}, + {"hex _", "{{print 0x1_23}}", "291", tVal, true}, + {"HEX", "{{print 0X123ABC}}", "1194684", tVal, true}, + {"float", "{{print 123.4}}", "123.4", tVal, true}, + {"float _", "{{print 0_0_1_2_3.4}}", "123.4", tVal, true}, + {"hex float", "{{print +0x1.ep+2}}", "7.5", tVal, true}, + {"hex float _", "{{print +0x_1.e_0p+0_2}}", "7.5", tVal, true}, + {"HEX float", "{{print +0X1.EP+2}}", "7.5", tVal, true}, + {"print multi", "{{print 1_2_3_4 7.5_00_00_00}}", "1234 7.5", tVal, true}, + {"print multi2", "{{print 1234 0x0_1.e_0p+02}}", "1234 7.5", tVal, true}, + // Fixed bugs. // Must separate dot and receiver; otherwise args are evaluated with dot set to variable. {"bug0", "{{range .MSIone}}{{if $.Method1 .}}X{{end}}{{end}}", "X", tVal, true}, diff --git a/src/text/template/parse/lex.go b/src/text/template/parse/lex.go index 94a676c579..92b97f423f 100644 --- a/src/text/template/parse/lex.go +++ b/src/text/template/parse/lex.go @@ -565,17 +565,28 @@ func (l *lexer) scanNumber() bool { // Optional leading sign. l.accept("+-") // Is it hex? - digits := "0123456789" - if l.accept("0") && l.accept("xX") { - digits = "0123456789abcdefABCDEF" + digits := "0123456789_" + if l.accept("0") { + // Note: Leading 0 does not mean octal in floats. + if l.accept("xX") { + digits = "0123456789abcdefABCDEF_" + } else if l.accept("oO") { + digits = "01234567_" + } else if l.accept("bB") { + digits = "01_" + } } l.acceptRun(digits) if l.accept(".") { l.acceptRun(digits) } - if l.accept("eE") { + if len(digits) == 10+1 && l.accept("eE") { + l.accept("+-") + l.acceptRun("0123456789_") + } + if len(digits) == 16+6+1 && l.accept("pP") { l.accept("+-") - l.acceptRun("0123456789") + l.acceptRun("0123456789_") } // Is it imaginary? l.accept("i") diff --git a/src/text/template/parse/lex_test.go b/src/text/template/parse/lex_test.go index 6e7ece9db3..563c4fc1cb 100644 --- a/src/text/template/parse/lex_test.go +++ b/src/text/template/parse/lex_test.go @@ -120,7 +120,7 @@ var lexTests = []lexTest{ {"quote", `{{"abc \n\t\" "}}`, []item{tLeft, tQuote, tRight, tEOF}}, {"raw quote", "{{" + raw + "}}", []item{tLeft, tRawQuote, tRight, tEOF}}, {"raw quote with newline", "{{" + rawNL + "}}", []item{tLeft, tRawQuoteNL, tRight, tEOF}}, - {"numbers", "{{1 02 0x14 -7.2i 1e3 +1.2e-4 4.2i 1+2i}}", []item{ + {"numbers", "{{1 02 0x14 0X14 -7.2i 1e3 1E3 +1.2e-4 4.2i 1+2i 1_2 0x1.e_fp4 0X1.E_FP4}}", []item{ tLeft, mkItem(itemNumber, "1"), tSpace, @@ -128,15 +128,25 @@ var lexTests = []lexTest{ tSpace, mkItem(itemNumber, "0x14"), tSpace, + mkItem(itemNumber, "0X14"), + tSpace, mkItem(itemNumber, "-7.2i"), tSpace, mkItem(itemNumber, "1e3"), tSpace, + mkItem(itemNumber, "1E3"), + tSpace, mkItem(itemNumber, "+1.2e-4"), tSpace, mkItem(itemNumber, "4.2i"), tSpace, mkItem(itemComplex, "1+2i"), + tSpace, + mkItem(itemNumber, "1_2"), + tSpace, + mkItem(itemNumber, "0x1.e_fp4"), + tSpace, + mkItem(itemNumber, "0X1.E_FP4"), tRight, tEOF, }}, diff --git a/src/text/template/parse/node.go b/src/text/template/parse/node.go index dca83dacce..1174a4b970 100644 --- a/src/text/template/parse/node.go +++ b/src/text/template/parse/node.go @@ -596,7 +596,7 @@ func (t *Tree) newNumber(pos Pos, text string, typ itemType) (*NumberNode, error if err == nil { // If we parsed it as a float but it looks like an integer, // it's a huge number too large to fit in an int. Reject it. - if !strings.ContainsAny(text, ".eE") { + if !strings.ContainsAny(text, ".eEpP") { return nil, fmt.Errorf("integer overflow: %q", text) } n.IsFloat = true diff --git a/src/text/template/parse/parse_test.go b/src/text/template/parse/parse_test.go index 15cc65670a..5cb41d0bf5 100644 --- a/src/text/template/parse/parse_test.go +++ b/src/text/template/parse/parse_test.go @@ -30,8 +30,15 @@ var numberTests = []numberTest{ {"0", true, true, true, false, 0, 0, 0, 0}, {"-0", true, true, true, false, 0, 0, 0, 0}, // check that -0 is a uint. {"73", true, true, true, false, 73, 73, 73, 0}, + {"7_3", true, true, true, false, 73, 73, 73, 0}, + {"0b10_010_01", true, true, true, false, 73, 73, 73, 0}, + {"0B10_010_01", true, true, true, false, 73, 73, 73, 0}, {"073", true, true, true, false, 073, 073, 073, 0}, + {"0o73", true, true, true, false, 073, 073, 073, 0}, + {"0O73", true, true, true, false, 073, 073, 073, 0}, {"0x73", true, true, true, false, 0x73, 0x73, 0x73, 0}, + {"0X73", true, true, true, false, 0x73, 0x73, 0x73, 0}, + {"0x7_3", true, true, true, false, 0x73, 0x73, 0x73, 0}, {"-73", true, false, true, false, -73, 0, -73, 0}, {"+73", true, false, true, false, 73, 0, 73, 0}, {"100", true, true, true, false, 100, 100, 100, 0}, @@ -39,7 +46,12 @@ var numberTests = []numberTest{ {"-1e9", true, false, true, false, -1e9, 0, -1e9, 0}, {"-1.2", false, false, true, false, 0, 0, -1.2, 0}, {"1e19", false, true, true, false, 0, 1e19, 1e19, 0}, + {"1e1_9", false, true, true, false, 0, 1e19, 1e19, 0}, + {"1E19", false, true, true, false, 0, 1e19, 1e19, 0}, {"-1e19", false, false, true, false, 0, 0, -1e19, 0}, + {"0x_1p4", true, true, true, false, 16, 16, 16, 0}, + {"0X_1P4", true, true, true, false, 16, 16, 16, 0}, + {"0x_1p-4", false, false, true, false, 0, 0, 1 / 16., 0}, {"4i", false, false, false, true, 0, 0, 0, 4i}, {"-1.2+4.2i", false, false, false, true, 0, 0, 0, -1.2 + 4.2i}, {"073i", false, false, false, true, 0, 0, 0, 73i}, // not octal! -- GitLab From b5a68a9e414dc1d412d623f80c54aafe3ada0f14 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 25 Feb 2019 22:09:46 -0500 Subject: [PATCH 0082/1679] misc/cgo: skip cgotest.TestCrossPackageTests on iOS and set PWD I hope that this will fix the tests on iOS, but 'gomote create' isn't giving me an instance I can test with. (Please patch and test before approving.) Updates #15919 Updates #30228 Change-Id: I1b7cd30d5b127a1ad3243b329fa005d229f69a24 Reviewed-on: https://go-review.googlesource.com/c/163726 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Elias Naur --- misc/cgo/life/life_test.go | 1 + misc/cgo/stdio/stdio_test.go | 1 + misc/cgo/test/pkg_test.go | 8 ++++++++ misc/cgo/testcarchive/carchive_test.go | 1 + misc/cgo/testcshared/cshared_test.go | 1 + misc/cgo/testplugin/plugin_test.go | 2 ++ misc/cgo/testshared/shared_test.go | 1 + 7 files changed, 15 insertions(+) diff --git a/misc/cgo/life/life_test.go b/misc/cgo/life/life_test.go index 3b17adae74..0f024c9d1d 100644 --- a/misc/cgo/life/life_test.go +++ b/misc/cgo/life/life_test.go @@ -37,6 +37,7 @@ func testMain(m *testing.M) int { if err := os.Chdir(modRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", modRoot) if err := ioutil.WriteFile("go.mod", []byte("module cgolife\n"), 0666); err != nil { log.Panic(err) } diff --git a/misc/cgo/stdio/stdio_test.go b/misc/cgo/stdio/stdio_test.go index cb32da8444..85ab6ae3e5 100644 --- a/misc/cgo/stdio/stdio_test.go +++ b/misc/cgo/stdio/stdio_test.go @@ -37,6 +37,7 @@ func testMain(m *testing.M) int { if err := os.Chdir(modRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", modRoot) if err := ioutil.WriteFile("go.mod", []byte("module cgostdio\n"), 0666); err != nil { log.Panic(err) } diff --git a/misc/cgo/test/pkg_test.go b/misc/cgo/test/pkg_test.go index 9c8a61e871..6857609a10 100644 --- a/misc/cgo/test/pkg_test.go +++ b/misc/cgo/test/pkg_test.go @@ -9,6 +9,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strings" "testing" ) @@ -26,6 +27,13 @@ import ( // this shim and move the tests currently located in testdata back into the // parent directory. func TestCrossPackageTests(t *testing.T) { + if runtime.GOOS == "darwin" { + switch runtime.GOARCH { + case "arm", "arm64": + t.Skip("Can't exec cmd/go subprocess on iOS.") + } + } + GOPATH, err := ioutil.TempDir("", "cgotest") if err != nil { t.Fatal(err) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index d6b35fb9ec..611a770245 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -60,6 +60,7 @@ func testMain(m *testing.M) int { if err := os.Chdir(modRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", modRoot) if err := ioutil.WriteFile("go.mod", []byte("module testcarchive\n"), 0666); err != nil { log.Panic(err) } diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index 163cea2136..833650e5e6 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -132,6 +132,7 @@ func testMain(m *testing.M) int { if err := os.Chdir(modRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", modRoot) if err := ioutil.WriteFile("go.mod", []byte("module testcshared\n"), 0666); err != nil { log.Panic(err) } diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go index 8bea9e5356..2c110494d0 100644 --- a/misc/cgo/testplugin/plugin_test.go +++ b/misc/cgo/testplugin/plugin_test.go @@ -51,12 +51,14 @@ func TestMain(m *testing.M) { if err := os.Chdir(altRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", altRoot) goCmd(nil, "build", "-buildmode=plugin", "-o", filepath.Join(modRoot, "plugin-mismatch.so"), "./plugin-mismatch") os.Setenv("GOPATH", GOPATH) if err := os.Chdir(modRoot); err != nil { log.Panic(err) } + os.Setenv("PWD", modRoot) os.Setenv("LD_LIBRARY_PATH", modRoot) diff --git a/misc/cgo/testshared/shared_test.go b/misc/cgo/testshared/shared_test.go index 9a8c398976..ac1a1c7f1a 100644 --- a/misc/cgo/testshared/shared_test.go +++ b/misc/cgo/testshared/shared_test.go @@ -126,6 +126,7 @@ func testMain(m *testing.M) (int, error) { fmt.Printf("+ cd %s\n", modRoot) } os.Chdir(modRoot) + os.Setenv("PWD", modRoot) if err := ioutil.WriteFile("go.mod", []byte("module testshared\n"), 0666); err != nil { return 0, err } -- GitLab From c0101b1961299ce6d13fac3c1dd13d3aea22b276 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Sun, 24 Feb 2019 22:48:46 +0100 Subject: [PATCH 0083/1679] time: parse 1us in Nanoseconds example The example for Nanoseconds() currently reads: ns, _ := time.ParseDuration("1000ns") fmt.Printf("one microsecond has %d nanoseconds.", ns.Nanoseconds()) which is not terribly interesting: it seems obvious that parsing "1000ns" and then calling Nanoseconds() will print 1000. The mention of microseconds in the text suggests that the author's intention was, instead, to write something like this: u, _ := time.ParseDuration("1us") i.e. build a time value by parsing 1 microsecond, and then print the value in nanoseconds. Change the example to do this. Change-Id: I4ddb123f0935a12cda3b5d6f1ca919bfcd6383d6 Reviewed-on: https://go-review.googlesource.com/c/163622 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/time/example_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/time/example_test.go b/src/time/example_test.go index 0fd325f2e4..a3532584ef 100644 --- a/src/time/example_test.go +++ b/src/time/example_test.go @@ -113,8 +113,8 @@ func ExampleDuration_Minutes() { } func ExampleDuration_Nanoseconds() { - ns, _ := time.ParseDuration("1000ns") - fmt.Printf("one microsecond has %d nanoseconds.", ns.Nanoseconds()) + u, _ := time.ParseDuration("1us") + fmt.Printf("one microsecond has %d nanoseconds.", u.Nanoseconds()) // Output: one microsecond has 1000 nanoseconds. } -- GitLab From 467456b0afcbe8b74c49b356f0e5d41d1c6efc9f Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Tue, 26 Feb 2019 18:18:44 +0100 Subject: [PATCH 0084/1679] doc: add 1.12 to the project history Go 1.12 is released, but it's currently not listed in the https://golang.org/project page. Change-Id: Ib5820f74245e4c986014c64eb40fa2911473e64b Reviewed-on: https://go-review.googlesource.com/c/163837 Reviewed-by: Brad Fitzpatrick --- doc/contrib.html | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/contrib.html b/doc/contrib.html index b4b19a6af7..fc853a9119 100644 --- a/doc/contrib.html +++ b/doc/contrib.html @@ -34,6 +34,7 @@ We encourage all Go users to subscribe to

A summary of the changes between Go releases. Notes for the major releases:

    +
  • Go 1.12 (February 2019)
  • Go 1.11 (August 2018)
  • Go 1.10 (February 2018)
  • Go 1.9 (August 2017)
  • -- GitLab From be9c534cdef07630606fde23344fc8a5d769a04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 16 Dec 2018 18:44:31 +0100 Subject: [PATCH 0085/1679] cmd/compile: don't crash on -d=ssa/ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I forgot how to pull up the ssa debug options help, so instead of writing -d=ssa/help, I just wrote -d=ssa/. Much to my amusement, the compiler just crashed, as shown below. Fix that. panic: runtime error: index out of range goroutine 1 [running]: cmd/compile/internal/ssa.PhaseOption(0x7ffc375d2b70, 0x0, 0xdbff91, 0x5, 0x1, 0x0, 0x0, 0x1, 0x1) /home/mvdan/tip/src/cmd/compile/internal/ssa/compile.go:327 +0x1876 cmd/compile/internal/gc.Main(0xde7bd8) /home/mvdan/tip/src/cmd/compile/internal/gc/main.go:411 +0x41d0 main.main() /home/mvdan/tip/src/cmd/compile/main.go:51 +0xab Change-Id: Ia2ad394382ddf8f4498b16b5cfb49be0317fc1aa Reviewed-on: https://go-review.googlesource.com/c/154421 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/compile.go | 3 ++- src/cmd/go/testdata/script/gcflags_patterns.txt | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go index 29618e29c3..38f12abf18 100644 --- a/src/cmd/compile/internal/ssa/compile.go +++ b/src/cmd/compile/internal/ssa/compile.go @@ -212,7 +212,8 @@ var BuildDump string // name of function to dump after initial build of ssa // BOOT_GO_GCFLAGS=-d='ssa/~^.*scc$/off' GO_GCFLAGS='-d=ssa/~^.*scc$/off' ./make.bash // func PhaseOption(phase, flag string, val int, valString string) string { - if phase == "help" { + switch phase { + case "", "help": lastcr := 0 phasenames := " check, all, build, intrinsics" for _, p := range passes { diff --git a/src/cmd/go/testdata/script/gcflags_patterns.txt b/src/cmd/go/testdata/script/gcflags_patterns.txt index f2e6e2b67d..c790ddda0a 100644 --- a/src/cmd/go/testdata/script/gcflags_patterns.txt +++ b/src/cmd/go/testdata/script/gcflags_patterns.txt @@ -27,6 +27,10 @@ stderr 'compile.* -e.* -p z1' go test -c -n -gcflags='all=-e' z1 stderr 'compile.* -e.* -p z3 ' +# this particular -gcflags argument made the compiler crash +! go build -gcflags=-d=ssa/ z1 +stderr 'PhaseOptions usage' + # -ldflags for implicit test package applies to test binary go test -c -n -gcflags=-N -ldflags=-X=x.y=z z1 stderr 'compile.* -N .*z_test.go' -- GitLab From 856525ce5c49624fe43d1842a118964d3e38e528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 9 Dec 2018 17:35:21 +0000 Subject: [PATCH 0086/1679] text/template: improve nil errors in evalField If we're accessing a field on a nil struct pointer, and that field is present in the type, we should print a "nil pointer evaluating X.Y" error instead of the broader "can't evaluate field Y in X". The latter error should still be used for the cases where the field is simply missing. While at it, remove the isNil checks in the struct and map cases. The indirect func will only return a true isNil when returning a pointer or interface reflect.Value, so it's impossible for either of these checks to be useful. Finally, extend the test suite to test a handful of these edge cases, including the one shown in the original issue. Fixes #29137. Change-Id: I53408ced8a7b53807a0a8461b6baef1cd01d25ae Reviewed-on: https://go-review.googlesource.com/c/153341 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/text/template/exec.go | 22 +++++++---- src/text/template/exec_test.go | 70 +++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/text/template/exec.go b/src/text/template/exec.go index d34d248441..964bb87cda 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -591,9 +591,6 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, case reflect.Struct: tField, ok := receiver.Type().FieldByName(fieldName) if ok { - if isNil { - s.errorf("nil pointer evaluating %s.%s", typ, fieldName) - } field := receiver.FieldByIndex(tField.Index) if tField.PkgPath != "" { // field is unexported s.errorf("%s is an unexported field of struct type %s", fieldName, typ) @@ -605,9 +602,6 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, return field } case reflect.Map: - if isNil { - s.errorf("nil pointer evaluating %s.%s", typ, fieldName) - } // If it's a map, attempt to use the field name as a key. nameVal := reflect.ValueOf(fieldName) if nameVal.Type().AssignableTo(receiver.Type().Key()) { @@ -627,6 +621,18 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, } return result } + case reflect.Ptr: + etyp := receiver.Type().Elem() + if etyp.Kind() == reflect.Struct { + if _, ok := etyp.FieldByName(fieldName); !ok { + // If there's no such field, say "can't evaluate" + // instead of "nil pointer evaluating". + break + } + } + if isNil { + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + } } s.errorf("can't evaluate field %s in type %s", fieldName, typ) panic("not reached") @@ -899,7 +905,9 @@ func (s *state) evalEmptyInterface(dot reflect.Value, n parse.Node) reflect.Valu panic("not reached") } -// indirect returns the item at the end of indirection, and a bool to indicate if it's nil. +// indirect returns the item at the end of indirection, and a bool to indicate +// if it's nil. If the returned bool is true, the returned value's kind will be +// either a pointer or interface. func indirect(v reflect.Value) (rv reflect.Value, isNil bool) { for ; v.Kind() == reflect.Ptr || v.Kind() == reflect.Interface; v = v.Elem() { if v.IsNil() { diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 6cdb285bd8..5947e3ec63 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -1349,20 +1349,64 @@ func TestBlock(t *testing.T) { } } -// Check that calling an invalid field on nil pointer prints -// a field error instead of a distracting nil pointer error. -// https://golang.org/issue/15125 -func TestMissingFieldOnNil(t *testing.T) { - tmpl := Must(New("tmpl").Parse("{{.MissingField}}")) - var d *T - err := tmpl.Execute(ioutil.Discard, d) - got := "" - if err != nil { - got = err.Error() +func TestEvalFieldErrors(t *testing.T) { + tests := []struct { + name, src string + value interface{} + want string + }{ + { + // Check that calling an invalid field on nil pointer + // prints a field error instead of a distracting nil + // pointer error. https://golang.org/issue/15125 + "MissingFieldOnNil", + "{{.MissingField}}", + (*T)(nil), + "can't evaluate field MissingField in type *template.T", + }, + { + "MissingFieldOnNonNil", + "{{.MissingField}}", + &T{}, + "can't evaluate field MissingField in type *template.T", + }, + { + "ExistingFieldOnNil", + "{{.X}}", + (*T)(nil), + "nil pointer evaluating *template.T.X", + }, + { + "MissingKeyOnNilMap", + "{{.MissingKey}}", + (*map[string]string)(nil), + "nil pointer evaluating *map[string]string.MissingKey", + }, + { + "MissingKeyOnNilMapPtr", + "{{.MissingKey}}", + (*map[string]string)(nil), + "nil pointer evaluating *map[string]string.MissingKey", + }, + { + "MissingKeyOnMapPtrToNil", + "{{.MissingKey}}", + &map[string]string{}, + "", + }, } - want := "can't evaluate field MissingField in type *template.T" - if !strings.HasSuffix(got, want) { - t.Errorf("got error %q, want %q", got, want) + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + tmpl := Must(New("tmpl").Parse(tc.src)) + err := tmpl.Execute(ioutil.Discard, tc.value) + got := "" + if err != nil { + got = err.Error() + } + if !strings.HasSuffix(got, tc.want) { + t.Fatalf("got error %q, want %q", got, tc.want) + } + }) } } -- GitLab From b65ab889ab7f4eb69a75de5f774faf386aaf8380 Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Tue, 5 Feb 2019 13:29:29 +0300 Subject: [PATCH 0087/1679] net/rpc: fix args order in strings.Contains call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The old code looks suspicious and is fragile. It would fail if error messages were not totally the same. Swapped the arguments order to fix that. Change-Id: Id5df7242fb9224d0090245286ef8986ebb15e921 Reviewed-on: https://go-review.googlesource.com/c/161157 Run-TryBot: Iskander Sharipov TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí --- src/net/rpc/client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/rpc/client_test.go b/src/net/rpc/client_test.go index d116d2acc9..03225e3d01 100644 --- a/src/net/rpc/client_test.go +++ b/src/net/rpc/client_test.go @@ -57,7 +57,7 @@ func TestGobError(t *testing.T) { if err == nil { t.Fatal("no error") } - if !strings.Contains("reading body EOF", err.(error).Error()) { + if !strings.Contains(err.(error).Error(), "reading body EOF") { t.Fatal("expected `reading body EOF', got", err) } }() -- GitLab From 42a82ce1a7051b3a2762bff73b6eda4797e0fd4b Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 24 Jan 2019 17:27:23 +0000 Subject: [PATCH 0088/1679] math/bits: optimize Reverse32 and Reverse64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use ReverseBytes32 and ReverseBytes64 to speed up these functions. The byte reversal functions are intrinsics on most platforms and generally compile to a single instruction. name old time/op new time/op delta Reverse32 2.41ns ± 1% 1.94ns ± 3% -19.60% (p=0.000 n=20+19) Reverse64 3.85ns ± 1% 2.56ns ± 1% -33.32% (p=0.000 n=17+19) Change-Id: I160bf59a0c7bd5db94114803ec5a59fae448f096 Reviewed-on: https://go-review.googlesource.com/c/159358 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/bits/bits.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go index b06c363348..6f367dcc93 100644 --- a/src/math/bits/bits.go +++ b/src/math/bits/bits.go @@ -232,8 +232,7 @@ func Reverse32(x uint32) uint32 { x = x>>1&(m0&m) | x&(m0&m)<<1 x = x>>2&(m1&m) | x&(m1&m)<<2 x = x>>4&(m2&m) | x&(m2&m)<<4 - x = x>>8&(m3&m) | x&(m3&m)<<8 - return x>>16 | x<<16 + return ReverseBytes32(x) } // Reverse64 returns the value of x with its bits in reversed order. @@ -242,9 +241,7 @@ func Reverse64(x uint64) uint64 { x = x>>1&(m0&m) | x&(m0&m)<<1 x = x>>2&(m1&m) | x&(m1&m)<<2 x = x>>4&(m2&m) | x&(m2&m)<<4 - x = x>>8&(m3&m) | x&(m3&m)<<8 - x = x>>16&(m4&m) | x&(m4&m)<<16 - return x>>32 | x<<32 + return ReverseBytes64(x) } // --- ReverseBytes --- -- GitLab From da2d02a9356f2d808992990510eca2b26513be0c Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 24 Feb 2019 13:18:13 +0100 Subject: [PATCH 0089/1679] cmd/dist: build exec wrappers during bootstrap The androidtest.bash script encodes the additional steps to build Go and run tests on Android. In order to add sharded builders and trybots, Android needs to fit into the usual make.bash + cmd/dist test pattern. This change moves building the exec wrapper into cmd/dist bootstrap. Do the same for iOS while we're here. Updates #23824 Change-Id: I58a1b0679c3a6c92fdc7fff464b469641f1fee74 Reviewed-on: https://go-review.googlesource.com/c/163618 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/androidtest.bash | 5 +---- src/cmd/dist/build.go | 30 +++++++++++++++++++++++++++++- src/iostest.bash | 6 +----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/androidtest.bash b/src/androidtest.bash index e43b89c0dc..12f240cc58 100755 --- a/src/androidtest.bash +++ b/src/androidtest.bash @@ -31,14 +31,11 @@ fi export CGO_ENABLED=1 unset GOBIN -# Do the build first, so we can build go_android_exec and cleaner. +# Do the build first, so we can build the 'cleaner' binary. # Also lets us fail early before the (slow) adb push if the build is broken. . ./make.bash --no-banner export GOROOT=$(dirname $(pwd)) export PATH=$GOROOT/bin:$PATH -GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build \ - -o ../bin/go_android_${GOARCH}_exec \ - ../misc/android/go_android_exec.go export pkgdir=$(dirname $(go list -f '{{.Target}}' runtime)) if [ "$pkgdir" = "" ]; then diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index ad2c96436a..6388e3e863 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1366,14 +1366,42 @@ func cmdbootstrap() { // Remove go_bootstrap now that we're done. xremove(pathf("%s/go_bootstrap", tooldir)) + // Build the exec wrapper if necessary. + if wrapperPath := wrapperPathFor(goos, goarch); wrapperPath != "" { + oldcc := os.Getenv("CC") + os.Setenv("GOOS", gohostos) + os.Setenv("GOARCH", gohostarch) + os.Setenv("CC", compilerEnvLookup(defaultcc, gohostos, gohostarch)) + goCmd(cmdGo, "build", "-o", pathf("%s/go_%s_%s_exec%s", gobin, goos, goarch, exe), wrapperPath) + // Restore environment. + // TODO(elias.naur): support environment variables in goCmd? + os.Setenv("GOOS", goos) + os.Setenv("GOARCH", goarch) + os.Setenv("CC", oldcc) + } + // Print trailing banner unless instructed otherwise. if !noBanner { banner() } } +func wrapperPathFor(goos, goarch string) string { + switch { + case goos == "android": + return pathf("%s/misc/android/go_android_exec.go", goroot) + case goos == "darwin" && (goarch == "arm" || goarch == "arm64"): + return pathf("%s/misc/ios/go_darwin_arm_exec.go", goroot) + } + return "" +} + func goInstall(goBinary string, args ...string) { - installCmd := []string{goBinary, "install", "-gcflags=all=" + gogcflags, "-ldflags=all=" + goldflags} + goCmd(goBinary, "install", args...) +} + +func goCmd(goBinary string, cmd string, args ...string) { + installCmd := []string{goBinary, cmd, "-gcflags=all=" + gogcflags, "-ldflags=all=" + goldflags} if vflag > 0 { installCmd = append(installCmd, "-v") } diff --git a/src/iostest.bash b/src/iostest.bash index b402ff0792..1fc1666bae 100755 --- a/src/iostest.bash +++ b/src/iostest.bash @@ -56,14 +56,10 @@ export PATH=$GOROOT/bin:$PATH export CGO_ENABLED=1 export CC_FOR_TARGET=$GOROOT/misc/ios/clangwrap.sh -# Run the build for the host bootstrap, so we can build go_darwin_arm_exec. +# Run the build for the host bootstrap, so we can build detect.go. # Also lets us fail early before the (slow) ios-deploy if the build is broken. ./make.bash -GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go build \ - -o ../bin/go_darwin_${GOARCH}_exec \ - ../misc/ios/go_darwin_arm_exec.go - if [ "$GOIOS_DEV_ID" = "" ]; then echo "detecting iOS development identity" eval $(GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH go run ../misc/ios/detect.go) -- GitLab From 3ef7e3d44f3dfaceab83b779c8bcd1cebe834de2 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 25 Feb 2019 09:30:01 +0100 Subject: [PATCH 0090/1679] cmd/vendor/golang.org/x/sys: re-vendor Fixes #29423 Change-Id: I376d0776c3810c2273d1ea234ebe681d5fd2ae64 Reviewed-on: https://go-review.googlesource.com/c/163623 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- .../vendor/golang.org/x/sys/unix/README.md | 16 +- .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 29 + src/cmd/vendor/golang.org/x/sys/unix/mkall.sh | 22 +- .../vendor/golang.org/x/sys/unix/mkerrors.sh | 17 +- .../x/sys/unix/mksyscall_aix_ppc.pl | 384 ---- .../x/sys/unix/mksyscall_aix_ppc64.pl | 579 ------ .../x/sys/unix/mksyscall_solaris.pl | 294 --- .../golang.org/x/sys/unix/syscall_aix.go | 2 +- .../golang.org/x/sys/unix/syscall_darwin.go | 1 + .../x/sys/unix/syscall_dragonfly.go | 1 + .../golang.org/x/sys/unix/syscall_linux.go | 31 +- .../x/sys/unix/syscall_linux_386.go | 1 + .../x/sys/unix/syscall_linux_amd64.go | 1 + .../x/sys/unix/syscall_linux_arm.go | 1 + .../x/sys/unix/syscall_linux_arm64.go | 1 + .../x/sys/unix/syscall_linux_mips64x.go | 1 + .../x/sys/unix/syscall_linux_mipsx.go | 1 + .../x/sys/unix/syscall_linux_ppc64x.go | 1 + .../x/sys/unix/syscall_linux_riscv64.go | 4 + .../x/sys/unix/syscall_linux_s390x.go | 1 + .../x/sys/unix/syscall_linux_sparc64.go | 1 + .../x/sys/unix/syscall_linux_test.go | 49 + .../x/sys/unix/syscall_netbsd_arm64.go | 33 + .../x/sys/unix/syscall_unix_test.go | 38 +- .../x/sys/unix/zerrors_linux_386.go | 31 +- .../x/sys/unix/zerrors_linux_amd64.go | 31 +- .../x/sys/unix/zerrors_linux_arm.go | 31 +- .../x/sys/unix/zerrors_linux_arm64.go | 31 +- .../x/sys/unix/zerrors_linux_mips.go | 31 +- .../x/sys/unix/zerrors_linux_mips64.go | 31 +- .../x/sys/unix/zerrors_linux_mips64le.go | 31 +- .../x/sys/unix/zerrors_linux_mipsle.go | 31 +- .../x/sys/unix/zerrors_linux_ppc64.go | 31 +- .../x/sys/unix/zerrors_linux_ppc64le.go | 31 +- .../x/sys/unix/zerrors_linux_riscv64.go | 31 +- .../x/sys/unix/zerrors_linux_s390x.go | 31 +- .../x/sys/unix/zerrors_linux_sparc64.go | 31 +- .../x/sys/unix/zerrors_netbsd_arm64.go | 1762 ++++++++++++++++ .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 2 +- .../x/sys/unix/zsyscall_aix_ppc64.go | 2 +- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 2 +- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 2 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 15 + .../x/sys/unix/zsyscall_darwin_amd64.s | 2 + .../x/sys/unix/zsyscall_dragonfly_amd64.go | 20 + .../x/sys/unix/zsyscall_linux_386.go | 57 +- .../x/sys/unix/zsyscall_linux_amd64.go | 57 +- .../x/sys/unix/zsyscall_linux_arm.go | 57 +- .../x/sys/unix/zsyscall_linux_arm64.go | 57 +- .../x/sys/unix/zsyscall_linux_mips.go | 57 +- .../x/sys/unix/zsyscall_linux_mips64.go | 57 +- .../x/sys/unix/zsyscall_linux_mips64le.go | 57 +- .../x/sys/unix/zsyscall_linux_mipsle.go | 57 +- .../x/sys/unix/zsyscall_linux_ppc64.go | 57 +- .../x/sys/unix/zsyscall_linux_ppc64le.go | 57 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 37 +- .../x/sys/unix/zsyscall_linux_s390x.go | 57 +- .../x/sys/unix/zsyscall_linux_sparc64.go | 57 +- .../x/sys/unix/zsyscall_netbsd_arm64.go | 1826 +++++++++++++++++ .../x/sys/unix/zsyscall_solaris_amd64.go | 2 +- .../x/sys/unix/zsysnum_darwin_amd64.go | 6 +- .../x/sys/unix/zsysnum_dragonfly_amd64.go | 2 +- .../x/sys/unix/zsysnum_freebsd_386.go | 2 +- .../x/sys/unix/zsysnum_freebsd_amd64.go | 2 +- .../x/sys/unix/zsysnum_freebsd_arm.go | 2 +- .../x/sys/unix/zsysnum_freebsd_arm64.go | 2 +- .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 +++ .../x/sys/unix/zsysnum_openbsd_386.go | 2 +- .../x/sys/unix/zsysnum_openbsd_amd64.go | 2 +- .../x/sys/unix/zsysnum_openbsd_arm.go | 2 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 61 +- .../x/sys/unix/ztypes_linux_amd64.go | 61 +- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 61 +- .../x/sys/unix/ztypes_linux_arm64.go | 61 +- .../x/sys/unix/ztypes_linux_mips.go | 61 +- .../x/sys/unix/ztypes_linux_mips64.go | 61 +- .../x/sys/unix/ztypes_linux_mips64le.go | 61 +- .../x/sys/unix/ztypes_linux_mipsle.go | 61 +- .../x/sys/unix/ztypes_linux_ppc64.go | 61 +- .../x/sys/unix/ztypes_linux_ppc64le.go | 61 +- .../x/sys/unix/ztypes_linux_riscv64.go | 63 +- .../x/sys/unix/ztypes_linux_s390x.go | 61 +- .../x/sys/unix/ztypes_linux_sparc64.go | 61 +- .../x/sys/unix/ztypes_netbsd_arm64.go | 472 +++++ .../x/sys/windows/syscall_windows.go | 13 + .../x/sys/windows/zsyscall_windows.go | 20 + src/cmd/vendor/vendor.json | 32 +- 87 files changed, 6285 insertions(+), 1611 deletions(-) create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s delete mode 100755 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.pl delete mode 100755 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.pl delete mode 100755 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go diff --git a/src/cmd/vendor/golang.org/x/sys/unix/README.md b/src/cmd/vendor/golang.org/x/sys/unix/README.md index 2bf415fb1c..eb2f78ae29 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/README.md +++ b/src/cmd/vendor/golang.org/x/sys/unix/README.md @@ -32,7 +32,7 @@ To build the files for your current OS and architecture, make sure GOOS and GOARCH are set correctly and run `mkall.sh`. This will generate the files for your specific system. Running `mkall.sh -n` shows the commands that will be run. -Requirements: bash, perl, go +Requirements: bash, go ### New Build System (currently for `GOOS == "linux"`) @@ -52,14 +52,14 @@ system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will then generate all of the files for all of the GOOS/GOARCH pairs in the new build system. Running `mkall.sh -n` shows the commands that will be run. -Requirements: bash, perl, go, docker +Requirements: bash, go, docker ## Component files This section describes the various files used in the code generation process. It also contains instructions on how to modify these files to add a new architecture/OS or to add additional syscalls, types, or constants. Note that -if you are using the new build system, the scripts cannot be called normally. +if you are using the new build system, the scripts/programs cannot be called normally. They must be called from within the docker container. ### asm files @@ -81,8 +81,8 @@ each GOOS/GOARCH pair. ### mksysnum -Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` -for the old system). This script takes in a list of header files containing the +Mksysnum is a Go program located at `${GOOS}/mksysnum.go` (or `mksysnum_${GOOS}.go` +for the old system). This program takes in a list of header files containing the syscall number declarations and parses them to produce the corresponding list of Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated constants. @@ -92,14 +92,14 @@ new installation of the target OS (or updating the source checkouts for the new build system). However, depending on the OS, you make need to update the parsing in mksysnum. -### mksyscall.pl +### mksyscall.go The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are hand-written Go files which implement system calls (for unix, the specific OS, or the specific OS/Architecture pair respectively) that need special handling and list `//sys` comments giving prototypes for ones that can be generated. -The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +The mksyscall.go program takes the `//sys` and `//sysnb` comments and converts them into syscalls. This requires the name of the prototype in the comment to match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function prototype can be exported (capitalized) or not. @@ -160,7 +160,7 @@ signal numbers, and constants. Generated by `mkerrors.sh` (see above). ### `zsyscall_${GOOS}_${GOARCH}.go` A file containing all the generated syscalls for a specific GOOS and GOARCH. -Generated by `mksyscall.pl` (see above). +Generated by `mksyscall.go` (see above). ### `zsysnum_${GOOS}_${GOARCH}.go` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s b/src/cmd/vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s new file mode 100644 index 0000000000..6f98ba5a37 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s @@ -0,0 +1,29 @@ +// Copyright 2019 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. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM64, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh index b9804c0ca6..75152f99b2 100755 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh @@ -62,12 +62,12 @@ _* | *_ | _) ;; aix_ppc) mkerrors="$mkerrors -maix32" - mksyscall="./mksyscall_aix_ppc.pl -aix" + mksyscall="go run mksyscall_aix_ppc.go -aix" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; aix_ppc64) mkerrors="$mkerrors -maix64" - mksyscall="./mksyscall_aix_ppc64.pl -aix" + mksyscall="go run mksyscall_aix_ppc64.go -aix" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; darwin_386) @@ -99,31 +99,31 @@ darwin_arm64) dragonfly_amd64) mkerrors="$mkerrors -m64" mksyscall="go run mksyscall.go -dragonfly" - mksysnum="go run mksysnum.go 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32" - mksysnum="go run mksysnum.go 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_amd64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; freebsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -arm" - mksysnum="go run mksysnum.go 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; freebsd_arm64) mkerrors="$mkerrors -m64" - mksysnum="go run mksysnum.go 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; netbsd_386) @@ -150,27 +150,27 @@ openbsd_386) mkerrors="$mkerrors -m32" mksyscall="go run mksyscall.go -l32 -openbsd" mksysctl="./mksysctl_openbsd.pl" - mksysnum="go run mksysnum.go 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_amd64) mkerrors="$mkerrors -m64" mksyscall="go run mksyscall.go -openbsd" mksysctl="./mksysctl_openbsd.pl" - mksysnum="go run mksysnum.go 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" mktypes="GOARCH=$GOARCH go tool cgo -godefs" ;; openbsd_arm) mkerrors="$mkerrors" mksyscall="go run mksyscall.go -l32 -openbsd -arm" mksysctl="./mksysctl_openbsd.pl" - mksysnum="go run mksysnum.go 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" + mksysnum="go run mksysnum.go 'https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master'" # Let the type of C char be signed for making the bare syscall # API consistent across platforms. mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" ;; solaris_amd64) - mksyscall="./mksyscall_solaris.pl" + mksyscall="go run mksyscall_solaris.go" mkerrors="$mkerrors -m64" mksysnum= mktypes="GOARCH=$GOARCH go tool cgo -godefs" diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh index 178077f47b..6a23484e5b 100755 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -179,8 +179,10 @@ struct ltchars { #include #include #include +#include #include #include +#include #include #include #include @@ -257,16 +259,6 @@ struct ltchars { #define FS_KEY_DESC_PREFIX "fscrypt:" #define FS_KEY_DESC_PREFIX_SIZE 8 #define FS_MAX_KEY_SIZE 64 - -// XDP socket constants do not appear to be picked up otherwise. -// Copied from samples/bpf/xdpsock_user.c. -#ifndef SOL_XDP -#define SOL_XDP 283 -#endif - -#ifndef AF_XDP -#define AF_XDP 44 -#endif ' includes_NetBSD=' @@ -453,7 +445,7 @@ ccflags="$@" $2 !~ "MNT_BITS" && $2 ~ /^(MS|MNT|UMOUNT)_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || - $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT)_/ || $2 ~ /^KEXEC_/ || $2 ~ /^LINUX_REBOOT_CMD_/ || $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || @@ -474,12 +466,13 @@ ccflags="$@" $2 ~ /^CLONE_[A-Z_]+/ || $2 !~ /^(BPF_TIMEVAL)$/ && $2 ~ /^(BPF|DLT)_/ || - $2 ~ /^CLOCK_/ || + $2 ~ /^(CLOCK|TIMER)_/ || $2 ~ /^CAN_/ || $2 ~ /^CAP_/ || $2 ~ /^ALG_/ || $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || $2 ~ /^GRND_/ || + $2 ~ /^RND/ || $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || $2 ~ /^KEYCTL_/ || $2 ~ /^PERF_EVENT_IOC_/ || diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.pl b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.pl deleted file mode 100755 index c44de8d310..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.pl +++ /dev/null @@ -1,384 +0,0 @@ -#!/usr/bin/env perl -# Copyright 2018 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. - -# This program reads a file containing function prototypes -# (like syscall_aix.go) and generates system call bodies. -# The prototypes are marked by lines beginning with "//sys" -# and read like func declarations if //sys is replaced by func, but: -# * The parameter lists must give a name for each argument. -# This includes return parameters. -# * The parameter lists must give a type for each argument: -# the (x, y, z int) shorthand is not allowed. -# * If the return parameter is an error number, it must be named err. -# * If go func name needs to be different than its libc name, -# * or the function is not in libc, name could be specified -# * at the end, after "=" sign, like -# //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt - -use strict; - -my $cmdline = "mksyscall_aix_ppc.pl " . join(' ', @ARGV); -my $errors = 0; -my $_32bit = ""; -my $tags = ""; # build tags -my $aix = 0; -my $solaris = 0; - -binmode STDOUT; - -if($ARGV[0] eq "-b32") { - $_32bit = "big-endian"; - shift; -} elsif($ARGV[0] eq "-l32") { - $_32bit = "little-endian"; - shift; -} -if($ARGV[0] eq "-aix") { - $aix = 1; - shift; -} -if($ARGV[0] eq "-tags") { - shift; - $tags = $ARGV[0]; - shift; -} - -if($ARGV[0] =~ /^-/) { - print STDERR "usage: mksyscall_aix.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; - exit 1; -} - -sub parseparamlist($) { - my ($list) = @_; - $list =~ s/^\s*//; - $list =~ s/\s*$//; - if($list eq "") { - return (); - } - return split(/\s*,\s*/, $list); -} - -sub parseparam($) { - my ($p) = @_; - if($p !~ /^(\S*) (\S*)$/) { - print STDERR "$ARGV:$.: malformed parameter: $p\n"; - $errors = 1; - return ("xx", "int"); - } - return ($1, $2); -} - -my $package = ""; -my $text = ""; -my $c_extern = "/*\n#include \n#include \n"; -my @vars = (); -while(<>) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - $package = $1 if !$package && /^package (\S+)$/; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, err error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - $in = join(', ', @in); - $out = join(', ', @out); - - # Try in vain to keep people from editing this file. - # The theory is that they jump into the middle of the file - # without reading the header. - $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - - # Check if value return, err return available - my $errvar = ""; - my $retvar = ""; - my $rettype = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - } else { - $retvar = $name; - $rettype = $type; - } - } - - # System call name. - #if($func ne "fcntl") { - - if($sysname eq "") { - $sysname = "$func"; - } - - $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; - $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. - - my $C_rettype = ""; - if($rettype eq "unsafe.Pointer") { - $C_rettype = "uintptr_t"; - } elsif($rettype eq "uintptr") { - $C_rettype = "uintptr_t"; - } elsif($rettype =~ /^_/) { - $C_rettype = "uintptr_t"; - } elsif($rettype eq "int") { - $C_rettype = "int"; - } elsif($rettype eq "int32") { - $C_rettype = "int"; - } elsif($rettype eq "int64") { - $C_rettype = "long long"; - } elsif($rettype eq "uint32") { - $C_rettype = "unsigned int"; - } elsif($rettype eq "uint64") { - $C_rettype = "unsigned long long"; - } else { - $C_rettype = "int"; - } - if($sysname eq "exit") { - $C_rettype = "void"; - } - - # Change types to c - my @c_in = (); - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @c_in, "uintptr_t"; - } elsif($type eq "string") { - push @c_in, "uintptr_t"; - } elsif($type =~ /^\[\](.*)/) { - push @c_in, "uintptr_t", "size_t"; - } elsif($type eq "unsafe.Pointer") { - push @c_in, "uintptr_t"; - } elsif($type eq "uintptr") { - push @c_in, "uintptr_t"; - } elsif($type =~ /^_/) { - push @c_in, "uintptr_t"; - } elsif($type eq "int") { - push @c_in, "int"; - } elsif($type eq "int32") { - push @c_in, "int"; - } elsif($type eq "int64") { - push @c_in, "long long"; - } elsif($type eq "uint32") { - push @c_in, "unsigned int"; - } elsif($type eq "uint64") { - push @c_in, "unsigned long long"; - } else { - push @c_in, "int"; - } - } - - if ($func ne "fcntl" && $func ne "FcntlInt" && $func ne "readlen" && $func ne "writelen") { - # Imports of system calls from libc - $c_extern .= "$C_rettype $sysname"; - my $c_in = join(', ', @c_in); - $c_extern .= "($c_in);\n"; - } - - # So file name. - if($aix) { - if($modname eq "") { - $modname = "libc.a/shr_64.o"; - } else { - print STDERR "$func: only syscall using libc are available\n"; - $errors = 1; - next; - } - } - - my $strconvfunc = "C.CString"; - my $strconvtype = "*byte"; - - # Go function header. - if($out ne "") { - $out = " ($out)"; - } - if($text ne "") { - $text .= "\n" - } - - $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; - - # Prepare arguments to call. - my @args = (); - my $n = 0; - my $arg_n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @args, "C.uintptr_t(uintptr(unsafe.Pointer($name)))"; - } elsif($type eq "string" && $errvar ne "") { - $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; - push @args, "C.uintptr_t(_p$n)"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $text .= "\t_p$n := uintptr(unsafe.Pointer($strconvfunc($name)))\n"; - push @args, "C.uintptr_t(_p$n)"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass nil in that case. - $text .= "\tvar _p$n *$1\n"; - $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; - push @args, "C.uintptr_t(uintptr(unsafe.Pointer(_p$n)))"; - $n++; - $text .= "\tvar _p$n int\n"; - $text .= "\t_p$n = len($name)\n"; - push @args, "C.size_t(_p$n)"; - $n++; - } elsif($type eq "int64" && $_32bit ne "") { - if($_32bit eq "big-endian") { - push @args, "uintptr($name >> 32)", "uintptr($name)"; - } else { - push @args, "uintptr($name)", "uintptr($name >> 32)"; - } - $n++; - } elsif($type eq "bool") { - $text .= "\tvar _p$n uint32\n"; - $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; - push @args, "_p$n"; - $n++; - } elsif($type =~ /^_/) { - push @args, "C.uintptr_t(uintptr($name))"; - } elsif($type eq "unsafe.Pointer") { - push @args, "C.uintptr_t(uintptr($name))"; - } elsif($type eq "int") { - if (($arg_n == 2) && (($func eq "readlen") || ($func eq "writelen"))) { - push @args, "C.size_t($name)"; - } elsif ($arg_n == 0 && $func eq "fcntl") { - push @args, "C.uintptr_t($name)"; - } elsif (($arg_n == 2) && (($func eq "fcntl") || ($func eq "FcntlInt"))) { - push @args, "C.uintptr_t($name)"; - } else { - push @args, "C.int($name)"; - } - } elsif($type eq "int32") { - push @args, "C.int($name)"; - } elsif($type eq "int64") { - push @args, "C.longlong($name)"; - } elsif($type eq "uint32") { - push @args, "C.uint($name)"; - } elsif($type eq "uint64") { - push @args, "C.ulonglong($name)"; - } elsif($type eq "uintptr") { - push @args, "C.uintptr_t($name)"; - } else { - push @args, "C.int($name)"; - } - $arg_n++; - } - my $nargs = @args; - - - # Determine which form to use; pad args with zeros. - if ($nonblock) { - } - - my $args = join(', ', @args); - my $call = ""; - if ($sysname eq "exit") { - if ($errvar ne "") { - $call .= "er :="; - } else { - $call .= ""; - } - } elsif ($errvar ne "") { - $call .= "r0,er :="; - } elsif ($retvar ne "") { - $call .= "r0,_ :="; - } else { - $call .= "" - } - $call .= "C.$sysname($args)"; - - # Assign return values. - my $body = ""; - my $failexpr = ""; - - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err") { - $reg = "e1"; - } else { - $reg = "r0"; - } - if($reg ne "e1" ) { - $body .= "\t$name = $type($reg)\n"; - } - } - - # verify return - if ($sysname ne "exit" && $errvar ne "") { - if ($C_rettype =~ /^uintptr/) { - $body .= "\tif \(uintptr\(r0\) ==\^uintptr\(0\) && er != nil\) {\n"; - $body .= "\t\t$errvar = er\n"; - $body .= "\t}\n"; - } else { - $body .= "\tif \(r0 ==-1 && er != nil\) {\n"; - $body .= "\t\t$errvar = er\n"; - $body .= "\t}\n"; - } - } elsif ($errvar ne "") { - $body .= "\tif \(er != nil\) {\n"; - $body .= "\t\t$errvar = er\n"; - $body .= "\t}\n"; - } - - $text .= "\t$call\n"; - $text .= $body; - - $text .= "\treturn\n"; - $text .= "}\n"; -} - -if($errors) { - exit 1; -} - -print <) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - $package = $1 if !$package && /^package (\S+)$/; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, err error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - $in = join(', ', @in); - $out = join(', ', @out); - - if($sysname eq "") { - $sysname = "$func"; - } - - my $onlyCommon = 0; - if ($func eq "readlen" || $func eq "writelen" || $func eq "FcntlInt" || $func eq "FcntlFlock") { - # This function call another syscall which is already implemented. - # Therefore, the gc and gccgo part must not be generated. - $onlyCommon = 1 - } - - # Try in vain to keep people from editing this file. - # The theory is that they jump into the middle of the file - # without reading the header. - - $textcommon .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - if (!$onlyCommon) { - $textgccgo .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - $textgc .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - } - - - # Check if value return, err return available - my $errvar = ""; - my $retvar = ""; - my $rettype = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - } else { - $retvar = $name; - $rettype = $type; - } - } - - - $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; - $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. - - # GCCGO Prototype return type - my $C_rettype = ""; - if($rettype eq "unsafe.Pointer") { - $C_rettype = "uintptr_t"; - } elsif($rettype eq "uintptr") { - $C_rettype = "uintptr_t"; - } elsif($rettype =~ /^_/) { - $C_rettype = "uintptr_t"; - } elsif($rettype eq "int") { - $C_rettype = "int"; - } elsif($rettype eq "int32") { - $C_rettype = "int"; - } elsif($rettype eq "int64") { - $C_rettype = "long long"; - } elsif($rettype eq "uint32") { - $C_rettype = "unsigned int"; - } elsif($rettype eq "uint64") { - $C_rettype = "unsigned long long"; - } else { - $C_rettype = "int"; - } - if($sysname eq "exit") { - $C_rettype = "void"; - } - - # GCCGO Prototype arguments type - my @c_in = (); - foreach my $i (0 .. $#in) { - my ($name, $type) = parseparam($in[$i]); - if($type =~ /^\*/) { - push @c_in, "uintptr_t"; - } elsif($type eq "string") { - push @c_in, "uintptr_t"; - } elsif($type =~ /^\[\](.*)/) { - push @c_in, "uintptr_t", "size_t"; - } elsif($type eq "unsafe.Pointer") { - push @c_in, "uintptr_t"; - } elsif($type eq "uintptr") { - push @c_in, "uintptr_t"; - } elsif($type =~ /^_/) { - push @c_in, "uintptr_t"; - } elsif($type eq "int") { - if (($i == 0 || $i == 2) && $func eq "fcntl"){ - # These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock - push @c_in, "uintptr_t"; - } else { - push @c_in, "int"; - } - } elsif($type eq "int32") { - push @c_in, "int"; - } elsif($type eq "int64") { - push @c_in, "long long"; - } elsif($type eq "uint32") { - push @c_in, "unsigned int"; - } elsif($type eq "uint64") { - push @c_in, "unsigned long long"; - } else { - push @c_in, "int"; - } - } - - if (!$onlyCommon){ - # GCCGO Prototype Generation - # Imports of system calls from libc - $c_extern .= "$C_rettype $sysname"; - my $c_in = join(', ', @c_in); - $c_extern .= "($c_in);\n"; - } - - # GC Library name - if($modname eq "") { - $modname = "libc.a/shr_64.o"; - } else { - print STDERR "$func: only syscall using libc are available\n"; - $errors = 1; - next; - } - my $sysvarname = "libc_${sysname}"; - - if (!$onlyCommon){ - # GC Runtime import of function to allow cross-platform builds. - $dynimports .= "//go:cgo_import_dynamic ${sysvarname} ${sysname} \"$modname\"\n"; - # GC Link symbol to proc address variable. - $linknames .= "//go:linkname ${sysvarname} ${sysvarname}\n"; - # GC Library proc address variable. - push @vars, $sysvarname; - } - - my $strconvfunc ="BytePtrFromString"; - my $strconvtype = "*byte"; - - # Go function header. - if($out ne "") { - $out = " ($out)"; - } - if($textcommon ne "") { - $textcommon .= "\n" - } - - $textcommon .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out ; - - # Prepare arguments to call. - my @argscommun = (); # Arguments in the commun part - my @argscall = (); # Arguments for call prototype - my @argsgc = (); # Arguments for gc call (with syscall6) - my @argsgccgo = (); # Arguments for gccgo call (with C.name_of_syscall) - my $n = 0; - my $arg_n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @argscommun, "uintptr(unsafe.Pointer($name))"; - push @argscall, "$name uintptr"; - push @argsgc, "$name"; - push @argsgccgo, "C.uintptr_t($name)"; - } elsif($type eq "string" && $errvar ne "") { - $textcommon .= "\tvar _p$n $strconvtype\n"; - $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; - $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - - push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; - push @argscall, "_p$n uintptr "; - push @argsgc, "_p$n"; - push @argsgccgo, "C.uintptr_t(_p$n)"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $textcommon .= "\tvar _p$n $strconvtype\n"; - $textcommon .= "\t_p$n, $errvar = $strconvfunc($name)\n"; - $textcommon .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - - push @argscommun, "uintptr(unsafe.Pointer(_p$n))"; - push @argscall, "_p$n uintptr"; - push @argsgc, "_p$n"; - push @argsgccgo, "C.uintptr_t(_p$n)"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass nil in that case. - $textcommon .= "\tvar _p$n *$1\n"; - $textcommon .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; - push @argscommun, "uintptr(unsafe.Pointer(_p$n))", "len($name)"; - push @argscall, "_p$n uintptr", "_lenp$n int"; - push @argsgc, "_p$n", "uintptr(_lenp$n)"; - push @argsgccgo, "C.uintptr_t(_p$n)", "C.size_t(_lenp$n)"; - $n++; - } elsif($type eq "int64" && $_32bit ne "") { - print STDERR "$ARGV:$.: $func uses int64 with 32 bits mode. Case not yet implemented\n"; - # if($_32bit eq "big-endian") { - # push @args, "uintptr($name >> 32)", "uintptr($name)"; - # } else { - # push @args, "uintptr($name)", "uintptr($name >> 32)"; - # } - # $n++; - } elsif($type eq "bool") { - print STDERR "$ARGV:$.: $func uses bool. Case not yet implemented\n"; - # $text .= "\tvar _p$n uint32\n"; - # $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; - # push @args, "_p$n"; - # $n++; - } elsif($type =~ /^_/ ||$type eq "unsafe.Pointer") { - push @argscommun, "uintptr($name)"; - push @argscall, "$name uintptr"; - push @argsgc, "$name"; - push @argsgccgo, "C.uintptr_t($name)"; - } elsif($type eq "int") { - if (($arg_n == 0 || $arg_n == 2) && ($func eq "fcntl" || $func eq "FcntlInt" || $func eq "FcntlFlock")) { - # These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock - push @argscommun, "uintptr($name)"; - push @argscall, "$name uintptr"; - push @argsgc, "$name"; - push @argsgccgo, "C.uintptr_t($name)"; - } else { - push @argscommun, "$name"; - push @argscall, "$name int"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.int($name)"; - } - } elsif($type eq "int32") { - push @argscommun, "$name"; - push @argscall, "$name int32"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.int($name)"; - } elsif($type eq "int64") { - push @argscommun, "$name"; - push @argscall, "$name int64"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.longlong($name)"; - } elsif($type eq "uint32") { - push @argscommun, "$name"; - push @argscall, "$name uint32"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.uint($name)"; - } elsif($type eq "uint64") { - push @argscommun, "$name"; - push @argscall, "$name uint64"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.ulonglong($name)"; - } elsif($type eq "uintptr") { - push @argscommun, "$name"; - push @argscall, "$name uintptr"; - push @argsgc, "$name"; - push @argsgccgo, "C.uintptr_t($name)"; - } else { - push @argscommun, "int($name)"; - push @argscall, "$name int"; - push @argsgc, "uintptr($name)"; - push @argsgccgo, "C.int($name)"; - } - $arg_n++; - } - my $nargs = @argsgc; - - # COMMUN function generation - my $argscommun = join(', ', @argscommun); - my $callcommun = "call$sysname($argscommun)"; - my @ret = ("_", "_"); - my $body = ""; - my $do_errno = 0; - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err") { - $reg = "e1"; - $ret[1] = $reg; - $do_errno = 1; - } else { - $reg = "r0"; - $ret[0] = $reg; - } - if($type eq "bool") { - $reg = "$reg != 0"; - } - if($reg ne "e1") { - $body .= "\t$name = $type($reg)\n"; - } - } - if ($ret[0] eq "_" && $ret[1] eq "_") { - $textcommon .= "\t$callcommun\n"; - } else { - $textcommon .= "\t$ret[0], $ret[1] := $callcommun\n"; - } - $textcommon .= $body; - - if ($do_errno) { - $textcommon .= "\tif e1 != 0 {\n"; - $textcommon .= "\t\terr = errnoErr(e1)\n"; - $textcommon .= "\t}\n"; - } - $textcommon .= "\treturn\n"; - $textcommon .= "}\n"; - - if ($onlyCommon){ - next - } - # CALL Prototype - my $callProto = sprintf "func call%s(%s) (r1 uintptr, e1 Errno) {\n", $sysname, join(', ', @argscall); - - # GC function generation - my $asm = "syscall6"; - if ($nonblock) { - $asm = "rawSyscall6"; - } - - if(@argsgc <= 6) { - while(@argsgc < 6) { - push @argsgc, "0"; - } - } else { - print STDERR "$ARGV:$.: too many arguments to system call\n"; - } - my $argsgc = join(', ', @argsgc); - my $callgc = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $argsgc)"; - - $textgc .= $callProto; - $textgc .= "\tr1, _, e1 = $callgc\n"; - $textgc .= "\treturn\n}\n"; - - # GCCGO function generation - my $argsgccgo = join(', ', @argsgccgo); - my $callgccgo = "C.$sysname($argsgccgo)"; - $textgccgo .= $callProto; - $textgccgo .= "\tr1 = uintptr($callgccgo)\n"; - $textgccgo .= "\te1 = syscall.GetErrno()\n"; - $textgccgo .= "\treturn\n}\n"; -} - -if($errors) { - exit 1; -} - -# Print zsyscall_aix_ppc64.go -open(my $fcommun, '>', 'zsyscall_aix_ppc64.go'); -my $tofcommun = <', 'zsyscall_aix_ppc64_gc.go'); -my $tofgc = <', 'zsyscall_aix_ppc64_gccgo.go'); -my $tofgccgo = <) { - chomp; - s/\s+/ /g; - s/^\s+//; - s/\s+$//; - $package = $1 if !$package && /^package (\S+)$/; - my $nonblock = /^\/\/sysnb /; - next if !/^\/\/sys / && !$nonblock; - - # Line must be of the form - # func Open(path string, mode int, perm int) (fd int, err error) - # Split into name, in params, out params. - if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { - print STDERR "$ARGV:$.: malformed //sys declaration\n"; - $errors = 1; - next; - } - my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); - - # Split argument lists on comma. - my @in = parseparamlist($in); - my @out = parseparamlist($out); - - # Try in vain to keep people from editing this file. - # The theory is that they jump into the middle of the file - # without reading the header. - $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; - - # So file name. - if($modname eq "") { - $modname = "libc"; - } - - # System call name. - if($sysname eq "") { - $sysname = "$func"; - } - - # System call pointer variable name. - my $sysvarname = "proc$sysname"; - - my $strconvfunc = "BytePtrFromString"; - my $strconvtype = "*byte"; - - $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. - - # Runtime import of function to allow cross-platform builds. - $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; - # Link symbol to proc address variable. - $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; - # Library proc address variable. - push @vars, $sysvarname; - - # Go function header. - $out = join(', ', @out); - if($out ne "") { - $out = " ($out)"; - } - if($text ne "") { - $text .= "\n" - } - $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; - - # Check if err return available - my $errvar = ""; - foreach my $p (@out) { - my ($name, $type) = parseparam($p); - if($type eq "error") { - $errvar = $name; - last; - } - } - - # Prepare arguments to Syscall. - my @args = (); - my $n = 0; - foreach my $p (@in) { - my ($name, $type) = parseparam($p); - if($type =~ /^\*/) { - push @args, "uintptr(unsafe.Pointer($name))"; - } elsif($type eq "string" && $errvar ne "") { - $text .= "\tvar _p$n $strconvtype\n"; - $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; - $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type eq "string") { - print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; - $text .= "\tvar _p$n $strconvtype\n"; - $text .= "\t_p$n, _ = $strconvfunc($name)\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))"; - $n++; - } elsif($type =~ /^\[\](.*)/) { - # Convert slice into pointer, length. - # Have to be careful not to take address of &a[0] if len == 0: - # pass nil in that case. - $text .= "\tvar _p$n *$1\n"; - $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; - push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; - $n++; - } elsif($type eq "int64" && $_32bit ne "") { - if($_32bit eq "big-endian") { - push @args, "uintptr($name >> 32)", "uintptr($name)"; - } else { - push @args, "uintptr($name)", "uintptr($name >> 32)"; - } - } elsif($type eq "bool") { - $text .= "\tvar _p$n uint32\n"; - $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; - push @args, "uintptr(_p$n)"; - $n++; - } else { - push @args, "uintptr($name)"; - } - } - my $nargs = @args; - - # Determine which form to use; pad args with zeros. - my $asm = "sysvicall6"; - if ($nonblock) { - $asm = "rawSysvicall6"; - } - if(@args <= 6) { - while(@args < 6) { - push @args, "0"; - } - } else { - print STDERR "$ARGV:$.: too many arguments to system call\n"; - } - - # Actual call. - my $args = join(', ', @args); - my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; - - # Assign return values. - my $body = ""; - my $failexpr = ""; - my @ret = ("_", "_", "_"); - my @pout= (); - my $do_errno = 0; - for(my $i=0; $i<@out; $i++) { - my $p = $out[$i]; - my ($name, $type) = parseparam($p); - my $reg = ""; - if($name eq "err") { - $reg = "e1"; - $ret[2] = $reg; - $do_errno = 1; - } else { - $reg = sprintf("r%d", $i); - $ret[$i] = $reg; - } - if($type eq "bool") { - $reg = "$reg != 0"; - } - if($type eq "int64" && $_32bit ne "") { - # 64-bit number in r1:r0 or r0:r1. - if($i+2 > @out) { - print STDERR "$ARGV:$.: not enough registers for int64 return\n"; - } - if($_32bit eq "big-endian") { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); - } else { - $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); - } - $ret[$i] = sprintf("r%d", $i); - $ret[$i+1] = sprintf("r%d", $i+1); - } - if($reg ne "e1") { - $body .= "\t$name = $type($reg)\n"; - } - } - if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { - $text .= "\t$call\n"; - } else { - $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; - } - $text .= $body; - - if ($do_errno) { - $text .= "\tif e1 != 0 {\n"; - $text .= "\t\terr = e1\n"; - $text .= "\t}\n"; - } - $text .= "\treturn\n"; - $text .= "}\n"; -} - -if($errors) { - exit 1; -} - -print < 0 { + p = unsafe.Pointer(&filter[0]) + } + return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter)) +} + // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) // KeyctlInt calls keyctl commands in which each argument is an int. @@ -1381,6 +1408,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Chroot(path string) (err error) //sys ClockGetres(clockid int32, res *Timespec) (err error) //sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) //sys Close(fd int) (err error) //sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) //sys DeleteModule(name string, flags int) (err error) @@ -1441,7 +1469,6 @@ func Getpgrp() (pid int) { //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) -//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) //sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) //sys Setdomainname(p []byte) (err error) @@ -1466,6 +1493,7 @@ func Setgid(uid int) (err error) { //sys Setpriority(which int, who int, prio int) (err error) //sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Signalfd(fd int, mask *Sigset_t, flags int) = SYS_SIGNALFD4 //sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) //sys Sync() //sys Syncfs(fd int) (err error) @@ -1682,7 +1710,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { // Shmdt // Shmget // Sigaltstack -// Signalfd // Swapoff // Swapon // Sysfs diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 74bc098ce1..e2f8cf6e5a 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -68,6 +68,7 @@ func Pipe2(p []int, flags int) (err error) { //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 //sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 615f2918ad..87a30744d6 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -43,6 +43,7 @@ func Lstat(path string, stat *Stat_t) (err error) { //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index ad2bd2582f..cda3559419 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -89,6 +89,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 //sys Pause() (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index fa5a9a6f64..6d56722401 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -30,6 +30,7 @@ func EpollCreate(size int) (fd int, err error) { //sys Listen(s int, n int) (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 18541dc573..b3b21ec1e2 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -24,6 +24,7 @@ package unix //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 99e0e999a1..5144d4e133 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -28,6 +28,7 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys Listen(s int, n int) (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 //sys Setfsgid(gid int) (err error) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 41451854bc..0a100b66a3 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -30,6 +30,7 @@ package unix //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 44aa1227a6..f23ca451c7 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -207,3 +207,7 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { } return ppoll(&fds[0], len(fds), ts, nil) } + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index f52f148f9f..f81dbdc9c8 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -30,6 +30,7 @@ import ( //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index 72e64187de..b69565616f 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -26,6 +26,7 @@ package unix //sys Pause() (err error) //sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go index 758efa66e5..3c3bd816fd 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go @@ -32,11 +32,27 @@ func TestIoctlGetInt(t *testing.T) { t.Logf("%d bits of entropy available", v) } +func TestIoctlGetRTCTime(t *testing.T) { + f, err := os.Open("/dev/rtc0") + if err != nil { + t.Skipf("skipping test, %v", err) + } + defer f.Close() + + v, err := unix.IoctlGetRTCTime(int(f.Fd())) + if err != nil { + t.Fatalf("failed to perform ioctl: %v", err) + } + + t.Logf("RTC time: %04d-%02d-%02d %02d:%02d:%02d", v.Year+1900, v.Mon+1, v.Mday, v.Hour, v.Min, v.Sec) +} + func TestPpoll(t *testing.T) { if runtime.GOOS == "android" { t.Skip("mkfifo syscall is not available on android, skipping test") } + defer chtmpdir(t)() f, cleanup := mktmpfifo(t) defer cleanup() @@ -482,3 +498,36 @@ func TestSyncFileRange(t *testing.T) { t.Fatalf("SyncFileRange: unexpected error: %v, want EINVAL", err) } } + +func TestClockNanosleep(t *testing.T) { + delay := 100 * time.Millisecond + + // Relative timespec. + start := time.Now() + rel := unix.NsecToTimespec(delay.Nanoseconds()) + err := unix.ClockNanosleep(unix.CLOCK_MONOTONIC, 0, &rel, nil) + if err == unix.ENOSYS || err == unix.EPERM { + t.Skip("clock_nanosleep syscall is not available, skipping test") + } else if err != nil { + t.Errorf("ClockNanosleep(CLOCK_MONOTONIC, 0, %#v, nil) = %v", &rel, err) + } else if slept := time.Now().Sub(start); slept < delay { + t.Errorf("ClockNanosleep(CLOCK_MONOTONIC, 0, %#v, nil) slept only %v", &rel, slept) + } + + // Absolute timespec. + start = time.Now() + until := start.Add(delay) + abs := unix.NsecToTimespec(until.UnixNano()) + err = unix.ClockNanosleep(unix.CLOCK_REALTIME, unix.TIMER_ABSTIME, &abs, nil) + if err != nil { + t.Errorf("ClockNanosleep(CLOCK_REALTIME, TIMER_ABSTIME, %#v (=%v), nil) = %v", &abs, until, err) + } else if slept := time.Now().Sub(start); slept < delay { + t.Errorf("ClockNanosleep(CLOCK_REALTIME, TIMER_ABSTIME, %#v (=%v), nil) slept only %v", &abs, until, slept) + } + + // Invalid clock. clock_nanosleep(2) says EINVAL, but it’s actually EOPNOTSUPP. + err = unix.ClockNanosleep(unix.CLOCK_THREAD_CPUTIME_ID, 0, &rel, nil) + if err != unix.EINVAL && err != unix.EOPNOTSUPP { + t.Errorf("ClockNanosleep(CLOCK_THREAD_CPUTIME_ID, 0, %#v, nil) = %v, want EINVAL or EOPNOTSUPP", &rel, err) + } +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go new file mode 100644 index 0000000000..f3434465a1 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go @@ -0,0 +1,33 @@ +// Copyright 2019 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. + +// +build arm64,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go index c1b1ea59a0..f6abe8c0d6 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go @@ -396,14 +396,24 @@ func TestDup(t *testing.T) { t.Fatalf("Dup: %v", err) } - err = unix.Dup2(newFd, newFd+1) + // Create and reserve a file descriptor. + // Dup2 automatically closes it before reusing it. + nullFile, err := os.Open("/dev/null") + if err != nil { + t.Fatal(err) + } + dupFd := int(file.Fd()) + err = unix.Dup2(newFd, dupFd) if err != nil { t.Fatalf("Dup2: %v", err) } + // Keep the dummy file open long enough to not be closed in + // its finalizer. + runtime.KeepAlive(nullFile) b1 := []byte("Test123") b2 := make([]byte, 7) - _, err = unix.Write(newFd+1, b1) + _, err = unix.Write(dupFd, b1) if err != nil { t.Fatalf("Write to dup2 fd failed: %v", err) } @@ -426,6 +436,7 @@ func TestPoll(t *testing.T) { t.Skip("mkfifo syscall is not available on android and iOS, skipping test") } + defer chtmpdir(t)() f, cleanup := mktmpfifo(t) defer cleanup() @@ -623,6 +634,29 @@ func TestMkdev(t *testing.T) { } } +func TestRenameat(t *testing.T) { + defer chtmpdir(t)() + + from, to := "renamefrom", "renameto" + + touch(t, from) + + err := unix.Renameat(unix.AT_FDCWD, from, unix.AT_FDCWD, to) + if err != nil { + t.Fatalf("Renameat: unexpected error: %v", err) + } + + _, err = os.Stat(to) + if err != nil { + t.Error(err) + } + + _, err = os.Stat(from) + if err == nil { + t.Errorf("Renameat: stat of renamed file %q unexpectedly succeeded", from) + } +} + // mktmpfifo creates a temporary FIFO and provides a cleanup function. func mktmpfifo(t *testing.T) (*os.File, func()) { err := unix.Mkfifo("fifo", 0666) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index c62bb94902..cb89df8f54 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -707,6 +707,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -778,6 +779,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1537,6 +1539,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1744,6 +1753,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1905,6 +1916,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2038,6 +2060,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2052,6 +2075,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2071,6 +2095,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2085,6 +2112,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2101,6 +2129,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 93f65d7d1a..73c9b88ca7 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -707,6 +707,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -778,6 +779,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1538,6 +1540,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1745,6 +1754,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1906,6 +1917,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2039,6 +2061,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2053,6 +2076,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2072,6 +2096,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2086,6 +2113,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2102,6 +2130,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index ccc57676fd..f1ef82f57e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1544,6 +1546,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1751,6 +1760,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1912,6 +1923,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2045,6 +2067,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2059,6 +2082,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2078,6 +2102,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2092,6 +2119,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2108,6 +2136,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9c57337c62..cf17c99069 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -709,6 +709,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -780,6 +781,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1528,6 +1530,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1735,6 +1744,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1896,6 +1907,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2030,6 +2052,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2044,6 +2067,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2063,6 +2087,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2077,6 +2104,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2093,6 +2121,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 66cdbfd586..380913c4fc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1537,6 +1539,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1744,6 +1753,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1905,6 +1916,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2038,6 +2060,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2052,6 +2075,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2071,6 +2095,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2085,6 +2112,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 @@ -2098,6 +2126,7 @@ const ( TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 038cfeb7db..fb82529ac9 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1537,6 +1539,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1744,6 +1753,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1905,6 +1916,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2038,6 +2060,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2052,6 +2075,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2071,6 +2095,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2085,6 +2112,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 @@ -2098,6 +2126,7 @@ const ( TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 2b9af2f5ef..677d904562 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1537,6 +1539,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1744,6 +1753,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1905,6 +1916,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2038,6 +2060,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2052,6 +2075,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2071,6 +2095,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2085,6 +2112,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 @@ -2098,6 +2126,7 @@ const ( TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index d117b63672..7ddd09d782 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1537,6 +1539,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1744,6 +1753,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x80 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1905,6 +1916,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2038,6 +2060,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2052,6 +2075,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2071,6 +2095,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2085,6 +2112,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x5410 TCSBRK = 0x5405 TCSBRKP = 0x5486 @@ -2098,6 +2126,7 @@ const ( TCSETSW = 0x540f TCSETSW2 = 0x8030542c TCXONC = 0x5406 + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x80047478 TIOCEXCL = 0x740d diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index ed12556bf4..ebaca417b4 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1595,6 +1597,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1802,6 +1811,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1963,6 +1974,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2094,6 +2116,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2108,6 +2131,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2127,6 +2151,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2141,6 +2168,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x2000741d TCSBRKP = 0x5425 @@ -2151,6 +2179,7 @@ const ( TCSETSF = 0x802c7416 TCSETSW = 0x802c7415 TCXONC = 0x2000741e + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 4aa4fa9c99..02938cb6ed 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1595,6 +1597,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1802,6 +1811,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1963,6 +1974,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2094,6 +2116,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2108,6 +2131,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2127,6 +2151,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2141,6 +2168,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x2000741d TCSBRKP = 0x5425 @@ -2151,6 +2179,7 @@ const ( TCSETSF = 0x802c7416 TCSETSW = 0x802c7415 TCXONC = 0x2000741e + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index cfe9ef8b1b..5aea4b9093 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1525,6 +1527,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1732,6 +1741,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1893,6 +1904,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2026,6 +2048,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2040,6 +2063,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2059,6 +2083,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2073,6 +2100,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2089,6 +2117,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 1149661109..7f7c2e3e2f 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -706,6 +706,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -777,6 +778,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1598,6 +1600,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x40085203 + RNDADDTOENTCNT = 0x40045201 + RNDCLEARPOOL = 0x5206 + RNDGETENTCNT = 0x80045200 + RNDGETPOOL = 0x80085202 + RNDRESEEDCRNG = 0x5207 + RNDZAPENTCNT = 0x5204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1805,6 +1814,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x80000 + SFD_NONBLOCK = 0x800 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1966,6 +1977,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x27 SO_DONTROUTE = 0x5 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x4 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x31 @@ -2099,6 +2121,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2113,6 +2136,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2132,6 +2156,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2146,6 +2173,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x5409 TCSBRKP = 0x5425 @@ -2162,6 +2190,7 @@ const ( TCSETXF = 0x5434 TCSETXW = 0x5435 TCXONC = 0x540a + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x5428 TIOCCONS = 0x541d TIOCEXCL = 0x540c diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 036f3247c7..968e21fd68 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -41,7 +41,7 @@ const ( AF_KEY = 0xf AF_LLC = 0x1a AF_LOCAL = 0x1 - AF_MAX = 0x2c + AF_MAX = 0x2d AF_MPLS = 0x1c AF_NETBEUI = 0xd AF_NETLINK = 0x10 @@ -710,6 +710,7 @@ const ( IN_ISDIR = 0x40000000 IN_LOOPBACKNET = 0x7f IN_MASK_ADD = 0x20000000 + IN_MASK_CREATE = 0x10000000 IN_MODIFY = 0x2 IN_MOVE = 0xc0 IN_MOVED_FROM = 0x40 @@ -781,6 +782,7 @@ const ( IPV6_MINHOPCOUNT = 0x49 IPV6_MTU = 0x18 IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_ALL = 0x1d IPV6_MULTICAST_HOPS = 0x12 IPV6_MULTICAST_IF = 0x11 IPV6_MULTICAST_LOOP = 0x13 @@ -1590,6 +1592,13 @@ const ( RLIMIT_SIGPENDING = 0xb RLIMIT_STACK = 0x3 RLIM_INFINITY = 0xffffffffffffffff + RNDADDENTROPY = 0x80085203 + RNDADDTOENTCNT = 0x80045201 + RNDCLEARPOOL = 0x20005206 + RNDGETENTCNT = 0x40045200 + RNDGETPOOL = 0x40085202 + RNDRESEEDCRNG = 0x20005207 + RNDZAPENTCNT = 0x20005204 RTAX_ADVMSS = 0x8 RTAX_CC_ALGO = 0x10 RTAX_CWND = 0x7 @@ -1797,6 +1806,8 @@ const ( SECCOMP_MODE_STRICT = 0x1 SECURITYFS_MAGIC = 0x73636673 SELINUX_MAGIC = 0xf97cff8c + SFD_CLOEXEC = 0x400000 + SFD_NONBLOCK = 0x4000 SHUT_RD = 0x0 SHUT_RDWR = 0x2 SHUT_WR = 0x1 @@ -1958,6 +1969,17 @@ const ( SO_DETACH_FILTER = 0x1b SO_DOMAIN = 0x1029 SO_DONTROUTE = 0x10 + SO_EE_CODE_TXTIME_INVALID_PARAM = 0x1 + SO_EE_CODE_TXTIME_MISSED = 0x2 + SO_EE_CODE_ZEROCOPY_COPIED = 0x1 + SO_EE_ORIGIN_ICMP = 0x2 + SO_EE_ORIGIN_ICMP6 = 0x3 + SO_EE_ORIGIN_LOCAL = 0x1 + SO_EE_ORIGIN_NONE = 0x0 + SO_EE_ORIGIN_TIMESTAMPING = 0x4 + SO_EE_ORIGIN_TXSTATUS = 0x4 + SO_EE_ORIGIN_TXTIME = 0x6 + SO_EE_ORIGIN_ZEROCOPY = 0x5 SO_ERROR = 0x1007 SO_GET_FILTER = 0x1a SO_INCOMING_CPU = 0x33 @@ -2090,6 +2112,7 @@ const ( TCOOFF = 0x0 TCOON = 0x1 TCP_CC_INFO = 0x1a + TCP_CM_INQ = 0x24 TCP_CONGESTION = 0xd TCP_COOKIE_IN_ALWAYS = 0x1 TCP_COOKIE_MAX = 0x10 @@ -2104,6 +2127,7 @@ const ( TCP_FASTOPEN_KEY = 0x21 TCP_FASTOPEN_NO_COOKIE = 0x22 TCP_INFO = 0xb + TCP_INQ = 0x24 TCP_KEEPCNT = 0x6 TCP_KEEPIDLE = 0x4 TCP_KEEPINTVL = 0x5 @@ -2123,6 +2147,9 @@ const ( TCP_QUEUE_SEQ = 0x15 TCP_QUICKACK = 0xc TCP_REPAIR = 0x13 + TCP_REPAIR_OFF = 0x0 + TCP_REPAIR_OFF_NO_WP = -0x1 + TCP_REPAIR_ON = 0x1 TCP_REPAIR_OPTIONS = 0x16 TCP_REPAIR_QUEUE = 0x14 TCP_REPAIR_WINDOW = 0x1d @@ -2137,6 +2164,7 @@ const ( TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 TCP_WINDOW_CLAMP = 0xa + TCP_ZEROCOPY_RECEIVE = 0x23 TCSAFLUSH = 0x2 TCSBRK = 0x20005405 TCSBRKP = 0x5425 @@ -2150,6 +2178,7 @@ const ( TCSETSW = 0x8024540a TCSETSW2 = 0x802c540e TCXONC = 0x20005406 + TIMER_ABSTIME = 0x1 TIOCCBRK = 0x2000747a TIOCCONS = 0x20007424 TIOCEXCL = 0x2000740d diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go new file mode 100644 index 0000000000..fb6c60441d --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go @@ -0,0 +1,1762 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_CMD_START = 0x1 + EXTATTR_CMD_STOP = 0x2 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_BASIC_FLAGS = 0xe782807f + MNT_DEFEXPORTED = 0x200 + MNT_DISCARD = 0x800000 + MNT_EXKERB = 0x800 + MNT_EXNORESPORT = 0x8000000 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x10000000 + MNT_EXRDONLY = 0x80 + MNT_EXTATTR = 0x1000000 + MNT_FORCE = 0x80000 + MNT_GETARGS = 0x400000 + MNT_IGNORE = 0x100000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_LOG = 0x2000000 + MNT_NOATIME = 0x4000000 + MNT_NOCOREDUMP = 0x8000 + MNT_NODEV = 0x10 + MNT_NODEVMTIME = 0x40000000 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOWAIT = 0x2 + MNT_OP_FLAGS = 0x4d0000 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELATIME = 0x20000 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SOFTDEP = 0x80000000 + MNT_SYMPERM = 0x20000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xff90ffff + MNT_WAIT = 0x1 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "operation not permitted"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "input/output error"}, + {6, "ENXIO", "device not configured"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EDEADLK", "resource deadlock avoided"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "cross-device link"}, + {19, "ENODEV", "operation not supported by device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "too many open files in system"}, + {24, "EMFILE", "too many open files"}, + {25, "ENOTTY", "inappropriate ioctl for device"}, + {26, "ETXTBSY", "text file busy"}, + {27, "EFBIG", "file too large"}, + {28, "ENOSPC", "no space left on device"}, + {29, "ESPIPE", "illegal seek"}, + {30, "EROFS", "read-only file system"}, + {31, "EMLINK", "too many links"}, + {32, "EPIPE", "broken pipe"}, + {33, "EDOM", "numerical argument out of domain"}, + {34, "ERANGE", "result too large or too small"}, + {35, "EAGAIN", "resource temporarily unavailable"}, + {36, "EINPROGRESS", "operation now in progress"}, + {37, "EALREADY", "operation already in progress"}, + {38, "ENOTSOCK", "socket operation on non-socket"}, + {39, "EDESTADDRREQ", "destination address required"}, + {40, "EMSGSIZE", "message too long"}, + {41, "EPROTOTYPE", "protocol wrong type for socket"}, + {42, "ENOPROTOOPT", "protocol option not available"}, + {43, "EPROTONOSUPPORT", "protocol not supported"}, + {44, "ESOCKTNOSUPPORT", "socket type not supported"}, + {45, "EOPNOTSUPP", "operation not supported"}, + {46, "EPFNOSUPPORT", "protocol family not supported"}, + {47, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {48, "EADDRINUSE", "address already in use"}, + {49, "EADDRNOTAVAIL", "can't assign requested address"}, + {50, "ENETDOWN", "network is down"}, + {51, "ENETUNREACH", "network is unreachable"}, + {52, "ENETRESET", "network dropped connection on reset"}, + {53, "ECONNABORTED", "software caused connection abort"}, + {54, "ECONNRESET", "connection reset by peer"}, + {55, "ENOBUFS", "no buffer space available"}, + {56, "EISCONN", "socket is already connected"}, + {57, "ENOTCONN", "socket is not connected"}, + {58, "ESHUTDOWN", "can't send after socket shutdown"}, + {59, "ETOOMANYREFS", "too many references: can't splice"}, + {60, "ETIMEDOUT", "connection timed out"}, + {61, "ECONNREFUSED", "connection refused"}, + {62, "ELOOP", "too many levels of symbolic links"}, + {63, "ENAMETOOLONG", "file name too long"}, + {64, "EHOSTDOWN", "host is down"}, + {65, "EHOSTUNREACH", "no route to host"}, + {66, "ENOTEMPTY", "directory not empty"}, + {67, "EPROCLIM", "too many processes"}, + {68, "EUSERS", "too many users"}, + {69, "EDQUOT", "disc quota exceeded"}, + {70, "ESTALE", "stale NFS file handle"}, + {71, "EREMOTE", "too many levels of remote in path"}, + {72, "EBADRPC", "RPC struct is bad"}, + {73, "ERPCMISMATCH", "RPC version wrong"}, + {74, "EPROGUNAVAIL", "RPC prog. not avail"}, + {75, "EPROGMISMATCH", "program version wrong"}, + {76, "EPROCUNAVAIL", "bad procedure for program"}, + {77, "ENOLCK", "no locks available"}, + {78, "ENOSYS", "function not implemented"}, + {79, "EFTYPE", "inappropriate file type or format"}, + {80, "EAUTH", "authentication error"}, + {81, "ENEEDAUTH", "need authenticator"}, + {82, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "ELAST", "protocol error"}, +} + +// Signal table +var signalList = [...]struct { + num syscall.Signal + name string + desc string +}{ + {1, "SIGHUP", "hangup"}, + {2, "SIGINT", "interrupt"}, + {3, "SIGQUIT", "quit"}, + {4, "SIGILL", "illegal instruction"}, + {5, "SIGTRAP", "trace/BPT trap"}, + {6, "SIGIOT", "abort trap"}, + {7, "SIGEMT", "EMT trap"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGBUS", "bus error"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGSYS", "bad system call"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGURG", "urgent I/O condition"}, + {17, "SIGSTOP", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {19, "SIGCONT", "continued"}, + {20, "SIGCHLD", "child exited"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGIO", "I/O possible"}, + {24, "SIGXCPU", "cputime limit exceeded"}, + {25, "SIGXFSZ", "filesize limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window size changes"}, + {29, "SIGINFO", "information request"}, + {30, "SIGUSR1", "user defined signal 1"}, + {31, "SIGUSR2", "user defined signal 2"}, + {32, "SIGPWR", "power fail/restart"}, +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 6bae21e5d8..79f6e0566e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -1,4 +1,4 @@ -// mksyscall_aix_ppc.pl -aix -tags aix,ppc syscall_aix.go syscall_aix_ppc.go +// go run mksyscall_aix_ppc.go -aix -tags aix,ppc syscall_aix.go syscall_aix_ppc.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build aix,ppc diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index 3e929e520e..e645a05cbe 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -1,4 +1,4 @@ -// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build aix,ppc64 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index a185ee8424..0b8eb72102 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -1,4 +1,4 @@ -// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build aix,ppc64 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index aef7c0e784..e88a442787 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -1,4 +1,4 @@ -// mksyscall_aix_ppc64.pl -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go +// go run mksyscall_aix_ppc64.go -aix -tags aix,ppc64 syscall_aix.go syscall_aix_ppc64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build aix,ppc64 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index b50178d679..c142e33e92 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -943,6 +943,21 @@ func libc_chroot_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := syscall_syscall(funcPC(libc_clock_gettime_trampoline), uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_clock_gettime_trampoline() + +//go:linkname libc_clock_gettime libc_clock_gettime +//go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := syscall_syscall(funcPC(libc_close_trampoline), uintptr(fd), 0, 0) if e1 != 0 { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index da9b900a8c..1a3915197d 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -108,6 +108,8 @@ TEXT ·libc_chown_trampoline(SB),NOSPLIT,$0-0 JMP libc_chown(SB) TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) +TEXT ·libc_clock_gettime_trampoline(SB),NOSPLIT,$0-0 + JMP libc_clock_gettime(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go index da9986dd21..ae9f1a21e6 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -1194,6 +1194,26 @@ func Rename(from string, to string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Revoke(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index 5356a51759..c8b451000b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1901,6 +1898,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 0f6d265d8b..2aac3184bc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1906,6 +1903,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 012261ad54..13c06c2815 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2016,6 +2013,26 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) written = int(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index b890cb03c6..737fa8d181 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1829,6 +1826,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index cc17b43d35..0a85f3f8db 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1820,6 +1817,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index 25026415dd..ec7007e781 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1850,6 +1847,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index 83d8bb8af8..c5bb25d964 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1850,6 +1847,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index b16b3e1029..26ada0478f 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1820,6 +1817,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) n = int(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 27b6a6bf0e..2da9cb700a 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1921,6 +1918,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index f7ecc9afda..772733d83f 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1921,6 +1918,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index e3cd4e53f9..996eba517a 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index 3001d37981..cb9072a33a 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1891,6 +1888,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index aafe3660fa..5e48a1001b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -437,6 +437,16 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ClockNanosleep(clockid int32, flags int, request *Timespec, remain *Timespec) (err error) { + _, _, e1 := Syscall6(SYS_CLOCK_NANOSLEEP, uintptr(clockid), uintptr(flags), uintptr(unsafe.Pointer(request)), uintptr(unsafe.Pointer(remain)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) if e1 != 0 { @@ -1195,26 +1205,6 @@ func Removexattr(path string, attr string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { - var _p0 *byte - _p0, err = BytePtrFromString(oldpath) - if err != nil { - return - } - var _p1 *byte - _p1, err = BytePtrFromString(newpath) - if err != nil { - return - } - _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1370,6 +1360,13 @@ func Setxattr(path string, attr string, data []byte, flags int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Signalfd(fd int, mask *Sigset_t, flags int) { + SyscallNoError(SYS_SIGNALFD4, uintptr(fd), uintptr(unsafe.Pointer(mask)), uintptr(flags)) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1890,6 +1887,26 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Seek(fd int, offset int64, whence int) (off int64, err error) { r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) off = int64(r0) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go new file mode 100644 index 0000000000..603d144334 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -0,0 +1,1826 @@ +// go run mksyscall.go -netbsd -tags netbsd,arm64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), 0, uintptr(length), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(pathfd), uintptr(unsafe.Pointer(_p0)), uintptr(linkfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFOAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(fromfd int, from string, tofd int, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 97b22a499e..5f614760c6 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -1,4 +1,4 @@ -// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go +// go run mksyscall_solaris.go -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build solaris,amd64 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go index 9e2837e0e3..654dd3da3b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// go run mksysnum.go /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/sys/syscall.h // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,darwin @@ -431,6 +431,8 @@ const ( SYS_NTP_ADJTIME = 527 SYS_NTP_GETTIME = 528 SYS_OS_FAULT_WITH_PAYLOAD = 529 - SYS_MAXSYSCALL = 530 + SYS_KQUEUE_WORKLOOP_CTL = 530 + SYS___MACH_BRIDGE_REMOTE_TIME = 531 + SYS_MAXSYSCALL = 532 SYS_INVALID = 63 ) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go index ff3976edbb..464c9a9832 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master +// go run mksysnum.go https://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,dragonfly diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go index b1e81b7172..55c3a32945 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,freebsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go index 73e277fe7a..b39be6cb8f 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,freebsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go index e12b469196..44ffd4ce5e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master +// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,freebsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go index 8c1e16ca51..9f21e9550e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go @@ -1,4 +1,4 @@ -// mksysnum_freebsd.pl +// go run mksysnum.go https://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,freebsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go new file mode 100644 index 0000000000..0291c0931b --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go @@ -0,0 +1,274 @@ +// go run mksysnum.go http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master +// Code generated by the command above; DO NOT EDIT. + +// +build arm64,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go index d5bf3c4499..b0207d1c9b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master +// go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,openbsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go index cbcfdfb336..f0dec6f0b4 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master +// go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,openbsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go index a84cead963..33d1dc5404 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -1,4 +1,4 @@ -// go run mksysnum.go http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master +// go run mksysnum.go https://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,openbsd diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index ebf10d48d3..18724670a8 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -405,6 +405,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -434,6 +439,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -569,6 +575,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -634,6 +641,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 @@ -759,7 +777,30 @@ type Sigset_t struct { Val [32]uint32 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1964,6 +2005,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1983,4 +2028,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 99a6900d21..6ddbf0665c 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -406,6 +406,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -435,6 +440,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -570,6 +576,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -635,6 +642,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -772,7 +790,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1977,6 +2018,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1996,4 +2041,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 5ccc4b5414..b8e3ec1384 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -409,6 +409,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -438,6 +443,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -573,6 +579,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -638,6 +645,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 @@ -748,7 +766,30 @@ type Sigset_t struct { Val [32]uint32 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1955,6 +1996,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1974,4 +2019,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index be375d9bb2..2f73f0086d 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -407,6 +407,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -436,6 +441,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -571,6 +577,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -636,6 +643,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -751,7 +769,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1956,6 +1997,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1975,4 +2020,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 195f7e1f85..4a2a18bcb0 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -408,6 +408,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -437,6 +442,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -572,6 +578,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -637,6 +644,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 @@ -753,7 +771,30 @@ type Sigset_t struct { Val [32]uint32 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1961,6 +2002,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1980,4 +2025,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 77acf56985..41e4513de1 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -407,6 +407,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -436,6 +441,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -571,6 +577,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -636,6 +643,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -753,7 +771,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1958,6 +1999,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1977,4 +2022,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 2fb7498da6..4a3d74b76e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -407,6 +407,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -436,6 +441,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -571,6 +577,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -636,6 +643,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -753,7 +771,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1958,6 +1999,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1977,4 +2022,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 41cb14863c..8ae3ca4e4e 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -408,6 +408,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -437,6 +442,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -572,6 +578,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -637,6 +644,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x8 @@ -753,7 +771,30 @@ type Sigset_t struct { Val [32]uint32 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1961,6 +2002,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1980,4 +2025,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 8e6b5fa68e..50294c94c0 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -408,6 +408,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -437,6 +442,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -572,6 +578,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -637,6 +644,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -761,7 +779,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1966,6 +2007,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1985,4 +2030,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 019d2d6a9d..d2acf3a734 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -408,6 +408,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -437,6 +442,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -572,6 +578,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -637,6 +644,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -761,7 +779,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1966,6 +2007,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1985,4 +2030,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index cf110ce2b3..675c596880 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -212,7 +212,7 @@ type RawSockaddrInet6 struct { type RawSockaddrUnix struct { Family uint16 - Path [108]uint8 + Path [108]int8 } type RawSockaddrLinklayer struct { @@ -407,6 +407,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -436,6 +441,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -571,6 +577,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -636,6 +643,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -778,7 +796,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1983,6 +2024,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -2002,4 +2047,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index abdc0863df..9f2cf0dfd7 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -406,6 +406,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -435,6 +440,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -570,6 +576,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -635,6 +642,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -774,7 +792,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x80045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1980,6 +2021,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1999,4 +2044,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index b0c9798d75..68643903c9 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -410,6 +410,11 @@ type TCPInfo struct { Total_retrans uint32 } +type CanFilter struct { + Id uint32 + Mask uint32 +} + const ( SizeofSockaddrInet4 = 0x10 SizeofSockaddrInet6 = 0x1c @@ -439,6 +444,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0x68 + SizeofCanFilter = 0x8 ) const ( @@ -574,6 +580,7 @@ const ( SizeofIfAddrmsg = 0x8 SizeofRtMsg = 0xc SizeofRtNexthop = 0x8 + SizeofNdUseroptmsg = 0x10 ) type NlMsghdr struct { @@ -639,6 +646,17 @@ type RtNexthop struct { Ifindex int32 } +type NdUseroptmsg struct { + Family uint8 + Pad1 uint8 + Opts_len uint16 + Ifindex int32 + Icmp_type uint8 + Icmp_code uint8 + Pad2 uint16 + Pad3 uint32 +} + const ( SizeofSockFilter = 0x8 SizeofSockFprog = 0x10 @@ -756,7 +774,30 @@ type Sigset_t struct { Val [16]uint64 } -const RNDGETENTCNT = 0x40045200 +type SignalfdSiginfo struct { + Signo uint32 + Errno int32 + Code int32 + Pid uint32 + Uid uint32 + Fd int32 + Tid uint32 + Band uint32 + Overrun uint32 + Trapno uint32 + Status int32 + Int int32 + Ptr uint64 + Utime uint64 + Stime uint64 + Addr uint64 + Addr_lsb uint16 + _ uint16 + Syscall int32 + Call_addr uint64 + Arch uint32 + _ [28]uint8 +} const PERF_IOC_FLAG_GROUP = 0x1 @@ -1961,6 +2002,10 @@ const ( NCSI_CHANNEL_ATTR_VLAN_ID = 0xa ) +type ScmTimestamping struct { + Ts [3]Timespec +} + const ( SOF_TIMESTAMPING_TX_HARDWARE = 0x1 SOF_TIMESTAMPING_TX_SOFTWARE = 0x2 @@ -1980,4 +2025,18 @@ const ( SOF_TIMESTAMPING_LAST = 0x4000 SOF_TIMESTAMPING_MASK = 0x7fff + + SCM_TSTAMP_SND = 0x0 + SCM_TSTAMP_SCHED = 0x1 + SCM_TSTAMP_ACK = 0x2 ) + +type SockExtendedErr struct { + Errno uint32 + Origin uint8 + Type uint8 + Code uint8 + Pad uint8 + Info uint32 + Data uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go new file mode 100644 index 0000000000..43da2c41c5 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -0,0 +1,472 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,netbsd + +package unix + +const ( + SizeofPtr = 0x8 + SizeofShort = 0x2 + SizeofInt = 0x4 + SizeofLong = 0x8 + SizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Ptmget struct { + Cfd int32 + Sfd int32 + Cn [1024]byte + Sn [1024]byte +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go index 8a00b71f1d..f72fa55f3e 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -172,6 +172,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) //sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) //sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] +//sys waitForMultipleObjects(count uint32, handles uintptr, waitAll bool, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] = WaitForMultipleObjects //sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW //sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) //sys GetFileType(filehandle Handle) (n uint32, err error) @@ -589,6 +590,18 @@ func LoadSetFileCompletionNotificationModes() error { return procSetFileCompletionNotificationModes.Find() } +func WaitForMultipleObjects(handles []Handle, waitAll bool, waitMilliseconds uint32) (event uint32, err error) { + // Every other win32 array API takes arguments as "pointer, count", except for this function. So we + // can't declare it as a usual [] type, because mksyscall will use the opposite order. We therefore + // trivially stub this ourselves. + + var handlePtr *Handle + if len(handles) > 0 { + handlePtr = &handles[0] + } + return waitForMultipleObjects(uint32(len(handles)), uintptr(unsafe.Pointer(handlePtr)), waitAll, waitMilliseconds) +} + // net api calls const socket_error = uintptr(^uint32(0)) diff --git a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go index fc56aec035..e4b54e2d92 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -112,6 +112,7 @@ var ( procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procWaitForMultipleObjects = modkernel32.NewProc("WaitForMultipleObjects") procGetTempPathW = modkernel32.NewProc("GetTempPathW") procCreatePipe = modkernel32.NewProc("CreatePipe") procGetFileType = modkernel32.NewProc("GetFileType") @@ -1084,6 +1085,25 @@ func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, return } +func waitForMultipleObjects(count uint32, handles uintptr, waitAll bool, waitMilliseconds uint32) (event uint32, err error) { + var _p0 uint32 + if waitAll { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall6(procWaitForMultipleObjects.Addr(), 4, uintptr(count), uintptr(handles), uintptr(_p0), uintptr(waitMilliseconds), 0, 0) + event = uint32(r0) + if event == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) n = uint32(r0) diff --git a/src/cmd/vendor/vendor.json b/src/cmd/vendor/vendor.json index ef7255acd1..053e2afc4f 100644 --- a/src/cmd/vendor/vendor.json +++ b/src/cmd/vendor/vendor.json @@ -135,46 +135,46 @@ "revisionTime": "2018-05-24T11:38:20Z" }, { - "checksumSHA1": "VmY64lAjYXrfzg4lPNIXh9HqIg0=", + "checksumSHA1": "v0kuTLSywKZmIwuyR3JyT18CgZk=", "path": "golang.org/x/sys/unix", - "revision": "1775db3f06b568179d273425900dd09125831dd5", - "revisionTime": "2019-01-06T17:38:07Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { - "checksumSHA1": "WoSat9PbqZFXREek5bkUBr256/Q=", + "checksumSHA1": "/G/UvW6DnpLWoplv0wkB3JunvXk=", "path": "golang.org/x/sys/windows", - "revision": "074acd46bca67915925527c07849494d115e7c43", - "revisionTime": "2018-12-18T18:24:21Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "yEg3f1MGwuyDh5NrNEGkWKlTyqY=", "path": "golang.org/x/sys/windows/registry", - "revision": "90868a75fefd03942536221d7c0e2f84ec62a668", - "revisionTime": "2018-08-01T20:46:00Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "sL1Y17u+ri3uepsUZOZ4uopiPEg=", "path": "golang.org/x/sys/windows/svc", - "revision": "074acd46bca67915925527c07849494d115e7c43", - "revisionTime": "2018-12-18T18:24:21Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "e9KJPWrdqg5PMkbE2w60Io8rY4M=", "path": "golang.org/x/sys/windows/svc/debug", - "revision": "90868a75fefd03942536221d7c0e2f84ec62a668", - "revisionTime": "2018-08-01T20:46:00Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "dz53pQfqAnXG8HdJj+nazXN9YRw=", "path": "golang.org/x/sys/windows/svc/eventlog", - "revision": "90868a75fefd03942536221d7c0e2f84ec62a668", - "revisionTime": "2018-08-01T20:46:00Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "vV6Mr/b+1GaHiHLnq2zEejQJVec=", "path": "golang.org/x/sys/windows/svc/mgr", - "revision": "90868a75fefd03942536221d7c0e2f84ec62a668", - "revisionTime": "2018-08-01T20:46:00Z" + "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", + "revisionTime": "2019-02-24T20:24:49Z" }, { "checksumSHA1": "witNkDO7koGO7+oxpBMZBvoxz3c=", -- GitLab From e3d99a3f8608e308eedc201b83eeb2f0e0d9dc81 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 24 Feb 2019 15:18:02 +0100 Subject: [PATCH 0091/1679] misc/android,cmd/dist: move $GOROOT copying to the exec wrapper To run the standard library tests on Android, the androidtest.bash script copies GOROOT to the device. Move that logic to the android exec wrapper, thereby making androidtest.bash obsolete. Apart from making Android less special, the sharded builder infrastructure should now be able to run (emulated) Android builders and trybots without special treatment. Updates #23824 Change-Id: I41591fea9a15b38c6dcf84046ea57f1e9165eaa5 Reviewed-on: https://go-review.googlesource.com/c/163619 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/README | 16 +++++----- misc/android/cleaner.go | 41 -------------------------- misc/android/go_android_exec.go | 46 +++++++++++++++++++++++++++++ src/androidtest.bash | 52 ++------------------------------- src/cmd/dist/build.go | 6 +++- 5 files changed, 61 insertions(+), 100 deletions(-) delete mode 100644 misc/android/cleaner.go diff --git a/misc/android/README b/misc/android/README index f01ca2cc2b..38e7cf41e3 100644 --- a/misc/android/README +++ b/misc/android/README @@ -6,18 +6,18 @@ mobile subrepository: https://github.com/golang/mobile -To run the standard library tests, see androidtest.bash. Run it as +To run the standard library tests, enable Cgo and use an appropriate +C compiler from the Android NDK. For example, - CC_FOR_TARGET=$STANDALONE_NDK_PATH/bin/clang GOARCH=arm64 ./androidtest.bash - -To create a standalone android NDK tool chain, follow the instructions on - - https://developer.android.com/ndk/guides/standalone_toolchain + CGO_ENABLED=1 \ + GOOS=android \ + GOARCH=arm64 \ + CC=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang \ + ./all.bash To run tests on the Android device, add the bin directory to PATH so the go tool can find the go_android_$GOARCH_exec wrapper generated by -androidtest.bash. Then, use the same GOARCH as when androidtest.bash ran -and set GOOS to android. For example, to run the go1 benchmarks +make.bash. For example, to run the go1 benchmarks export PATH=$GOROOT/bin:$PATH cd $GOROOT/test/bench/go1/ diff --git a/misc/android/cleaner.go b/misc/android/cleaner.go deleted file mode 100644 index edbbdcd0ef..0000000000 --- a/misc/android/cleaner.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -// Cleaner removes anything from /data/local/tmp/goroot not on a builtin list. -// Used by androidtest.bash. -package main - -import ( - "log" - "os" - "path/filepath" - "strings" -) - -func main() { - const goroot = "/data/local/tmp/goroot" - expect := make(map[string]bool) - for _, f := range strings.Split(files, "\n") { - expect[filepath.Join(goroot, f)] = true - } - - err := filepath.Walk(goroot, func(path string, info os.FileInfo, err error) error { - if expect[path] { - return nil - } - log.Printf("removing %s", path) - if err := os.RemoveAll(path); err != nil { - return err - } - if info.IsDir() { - return filepath.SkipDir - } - return nil - }) - if err != nil { - log.Fatal(err) - } -} diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index e36edacc76..1a8ae7070e 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -13,6 +13,7 @@ import ( "fmt" "go/build" "io" + "io/ioutil" "log" "os" "os/exec" @@ -78,6 +79,8 @@ func main() { deviceCwd := filepath.Join(deviceGoroot, subdir) if !inGoRoot { deviceCwd = filepath.Join(deviceGopath, subdir) + } else { + adbSyncGoroot() } // Binary names can conflict. @@ -164,3 +167,46 @@ func subdir() (pkgpath string, underGoRoot bool) { cwd, runtime.GOROOT(), build.Default.GOPATH) return "", false } + +// adbSyncGoroot ensures that files necessary for testing the Go standard +// packages are present on the attached device. +func adbSyncGoroot() { + // Also known by cmd/dist. The bootstrap command deletes the file. + statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status") + stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666) + if err != nil { + log.Fatal(err) + } + defer stat.Close() + // Serialize check and syncing. + if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil { + log.Fatal(err) + } + s, err := ioutil.ReadAll(stat) + if err != nil { + log.Fatal(err) + } + if string(s) == "done" { + return + } + devRoot := "/data/local/tmp/goroot" + run("shell", "rm", "-rf", devRoot) + run("shell", "mkdir", "-p", devRoot+"/pkg") + goroot := runtime.GOROOT() + goCmd := filepath.Join(goroot, "bin", "go") + runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output() + if err != nil { + log.Fatal(err) + } + pkgdir := filepath.Dir(string(runtimea)) + if pkgdir == "" { + log.Fatal("could not find android pkg dir") + } + for _, dir := range []string{"src", "test", "lib"} { + run("push", filepath.Join(goroot, dir), filepath.Join(devRoot)) + } + run("push", filepath.Join(pkgdir), filepath.Join(devRoot, "pkg/")) + if _, err := stat.Write([]byte("done")); err != nil { + log.Fatal(err) + } +} diff --git a/src/androidtest.bash b/src/androidtest.bash index 12f240cc58..ba776d2278 100755 --- a/src/androidtest.bash +++ b/src/androidtest.bash @@ -4,8 +4,6 @@ # license that can be found in the LICENSE file. # For testing Android. -# The compiler runs locally, then a copy of the GOROOT is pushed to a -# target device using adb, and the tests are run there. set -e ulimit -c 0 # no core files @@ -31,55 +29,9 @@ fi export CGO_ENABLED=1 unset GOBIN -# Do the build first, so we can build the 'cleaner' binary. -# Also lets us fail early before the (slow) adb push if the build is broken. -. ./make.bash --no-banner export GOROOT=$(dirname $(pwd)) +# Put the exec wrapper into PATH export PATH=$GOROOT/bin:$PATH -export pkgdir=$(dirname $(go list -f '{{.Target}}' runtime)) -if [ "$pkgdir" = "" ]; then - echo "could not find android pkg dir" 1>&2 - exit 1 -fi - -export ANDROID_TEST_DIR=/tmp/androidtest-$$ - -function cleanup() { - rm -rf ${ANDROID_TEST_DIR} -} -trap cleanup EXIT - -# Push GOROOT to target device. -# -# The adb sync command will sync either the /system or /data -# directories of an android device from a similar directory -# on the host. We copy the files required for running tests under -# /data/local/tmp/goroot. The adb sync command does not follow -# symlinks so we have to copy. -export ANDROID_PRODUCT_OUT="${ANDROID_TEST_DIR}/out" -FAKE_GOROOT=$ANDROID_PRODUCT_OUT/data/local/tmp/goroot -mkdir -p $FAKE_GOROOT -mkdir -p $FAKE_GOROOT/pkg -cp -a "${GOROOT}/src" "${FAKE_GOROOT}/" -cp -a "${GOROOT}/test" "${FAKE_GOROOT}/" -cp -a "${GOROOT}/lib" "${FAKE_GOROOT}/" -cp -a "${pkgdir}" "${FAKE_GOROOT}/pkg/" - -echo '# Syncing test files to android device' -adb $GOANDROID_ADB_FLAGS shell mkdir -p /data/local/tmp/goroot -time adb $GOANDROID_ADB_FLAGS sync data &> /dev/null - -export CLEANER=${ANDROID_TEST_DIR}/androidcleaner-$$ -cp ../misc/android/cleaner.go $CLEANER.go -echo 'var files = `' >> $CLEANER.go -(cd $ANDROID_PRODUCT_OUT/data/local/tmp/goroot; find . >> $CLEANER.go) -echo '`' >> $CLEANER.go -go build -o $CLEANER $CLEANER.go -adb $GOANDROID_ADB_FLAGS push $CLEANER /data/local/tmp/cleaner -adb $GOANDROID_ADB_FLAGS shell /data/local/tmp/cleaner - -echo '' - # Run standard tests. -bash run.bash --no-rebuild +bash all.bash diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 6388e3e863..43e1fe66f3 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1366,7 +1366,11 @@ func cmdbootstrap() { // Remove go_bootstrap now that we're done. xremove(pathf("%s/go_bootstrap", tooldir)) - // Build the exec wrapper if necessary. + if goos == "android" { + // Make sure the exec wrapper will sync a fresh $GOROOT to the device. + xremove(pathf("%s/go_android_exec-adb-sync-status", os.TempDir())) + } + if wrapperPath := wrapperPathFor(goos, goarch); wrapperPath != "" { oldcc := os.Getenv("CC") os.Setenv("GOOS", gohostos) -- GitLab From 1aa0fcff465a7eb92836bdf343222cb34e9c6d33 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 25 Feb 2019 10:52:42 +0100 Subject: [PATCH 0092/1679] misc/android: serialize adb commands on android emulators Android emulator builders are soon to join the trybot set. To avoid flaky runs, work around a longstanding adb bug where concurrent adb commands sometimes fail. I haven't seen the problem on actual devices until recently. It seems that the recently added "adb wait-for-device" can introduce flakyness with errors such as: adb: error: failed to get feature set: protocol fault (couldn't read status): Connection reset by peer Instead of working around that, give up and serialize use of adb everywhere. Fixes #23795 Updates #23824 Change-Id: If347c9981fa32ff8a1e14b7454f122ef682450a6 Reviewed-on: https://go-review.googlesource.com/c/163625 Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 1a8ae7070e..0055fb832a 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -60,6 +60,19 @@ func main() { log.SetFlags(0) log.SetPrefix("go_android_exec: ") + // Concurrent use of adb is flaky, so serialize adb commands. + // See https://github.com/golang/go/issues/23795 or + // https://issuetracker.google.com/issues/73230216. + lockPath := filepath.Join(os.TempDir(), "go_android_exec-adb-lock") + lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0666) + if err != nil { + log.Fatal(err) + } + defer lock.Close() + if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil { + log.Fatal(err) + } + // In case we're booting a device or emulator alongside androidtest.bash // wait for it to be ready. adb wait-for-device is not enough, we have to // wait for sys.boot_completed. @@ -87,15 +100,7 @@ func main() { // E.g. template.test from the {html,text}/template packages. binName := fmt.Sprintf("%s-%d", filepath.Base(os.Args[1]), os.Getpid()) deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName) - - // The push of the binary happens in parallel with other tests. - // Unfortunately, a simultaneous call to adb shell hold open - // file descriptors, so it is necessary to push then move to - // avoid a "text file busy" error on execution. - // https://code.google.com/p/android/issues/detail?id=65857 - run("push", os.Args[1], deviceBin+"-tmp") - run("shell", "cp '"+deviceBin+"-tmp' '"+deviceBin+"'") - run("shell", "rm '"+deviceBin+"-tmp'") + run("push", os.Args[1], deviceBin) // Forward SIGQUIT from the go command to show backtraces from // the binary instead of from this wrapper. -- GitLab From 7be432e65979f88aceba000db37c325c81127c7d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 25 Feb 2019 11:18:03 +0100 Subject: [PATCH 0093/1679] misc/android: copy testdata directories to device before running We've got away with not copying the testdata directories for the standard library because the exec wrapper also pushes almost the entire $GOROOT tree to the device, including testdata directories. Similar to what the iOS exec wrapper does. Change-Id: I91ef63ef84a658fc8843002890132c64b7c1d20e Reviewed-on: https://go-review.googlesource.com/c/163626 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 0055fb832a..fa84f00f67 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -95,6 +95,7 @@ func main() { } else { adbSyncGoroot() } + run("shell", "mkdir", "-p", deviceCwd) // Binary names can conflict. // E.g. template.test from the {html,text}/template packages. @@ -102,6 +103,10 @@ func main() { deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName) run("push", os.Args[1], deviceBin) + if _, err := os.Stat("testdata"); err == nil { + run("push", "testdata", deviceCwd) + } + // Forward SIGQUIT from the go command to show backtraces from // the binary instead of from this wrapper. quit := make(chan os.Signal, 1) -- GitLab From acf786f4fb08bd75e4f40b8e89e60878b1f47de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 22 Jan 2019 21:27:43 +0000 Subject: [PATCH 0094/1679] cmd/compile: remove unused func eqtypenoname MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Its only use was removed in golang.org/cl/114797, committed in October 2018. Change-Id: I6560ccfb10d7c763f6470b20c853716779c18cee Reviewed-on: https://go-review.googlesource.com/c/158897 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/subr.go | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 2a976dc4f0..7dcbc6a9e1 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -537,26 +537,6 @@ func methtype(t *types.Type) *types.Type { return nil } -// Are t1 and t2 equal struct types when field names are ignored? -// For deciding whether the result struct from g can be copied -// directly when compiling f(g()). -func eqtypenoname(t1 *types.Type, t2 *types.Type) bool { - if t1 == nil || t2 == nil || !t1.IsStruct() || !t2.IsStruct() { - return false - } - - if t1.NumFields() != t2.NumFields() { - return false - } - for i, f1 := range t1.FieldSlice() { - f2 := t2.Field(i) - if !types.Identical(f1.Type, f2.Type) { - return false - } - } - return true -} - // Is type src assignment compatible to type dst? // If so, return op code to use in conversion. // If not, return 0. -- GitLab From 15b4c71a912846530315c3e854feaaa9d0d54220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 9 Feb 2019 17:50:02 +0000 Subject: [PATCH 0095/1679] text/template: error on method calls on nil interfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Trying to call a method on a nil interface is a panic in Go. For example: var stringer fmt.Stringer println(stringer.String()) // nil pointer dereference In https://golang.org/cl/143097 we started recovering panics encountered during function and method calls. However, we didn't handle this case, as text/template panics before evalCall is ever run. In particular, reflect's MethodByName will panic if the receiver is of interface kind and nil: panic: reflect: Method on nil interface value Simply add a check for that edge case, and have Template.Execute return a helpful error. Note that Execute shouldn't just error if the interface contains a typed nil, since we're able to find a method to call in that case. Finally, add regression tests for both the nil and typed nil interface cases. Fixes #30143. Change-Id: Iffb21b40e14ba5fea0fcdd179cd80d1f23cabbab Reviewed-on: https://go-review.googlesource.com/c/161761 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/text/template/exec.go | 7 +++++ src/text/template/exec_test.go | 49 ++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/text/template/exec.go b/src/text/template/exec.go index 964bb87cda..62cf19d30c 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -576,6 +576,13 @@ func (s *state) evalField(dot reflect.Value, fieldName string, node parse.Node, } typ := receiver.Type() receiver, isNil := indirect(receiver) + if receiver.Kind() == reflect.Interface && isNil { + // Calling a method on a nil interface can't work. The + // MethodByName method call below would panic. + s.errorf("nil pointer evaluating %s.%s", typ, fieldName) + return zero + } + // Unless it's an interface, need to get to a value of type *T to guarantee // we see all methods of T and *T. ptr := receiver diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 5947e3ec63..a95631718c 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -58,8 +58,10 @@ type T struct { Empty3 interface{} Empty4 interface{} // Non-empty interfaces. - NonEmptyInterface I - NonEmptyInterfacePtS *I + NonEmptyInterface I + NonEmptyInterfacePtS *I + NonEmptyInterfaceNil I + NonEmptyInterfaceTypedNil I // Stringer. Str fmt.Stringer Err error @@ -141,24 +143,25 @@ var tVal = &T{ {"one": 1, "two": 2}, {"eleven": 11, "twelve": 12}, }, - Empty1: 3, - Empty2: "empty2", - Empty3: []int{7, 8}, - Empty4: &U{"UinEmpty"}, - NonEmptyInterface: &T{X: "x"}, - NonEmptyInterfacePtS: &siVal, - Str: bytes.NewBuffer([]byte("foozle")), - Err: errors.New("erroozle"), - PI: newInt(23), - PS: newString("a string"), - PSI: newIntSlice(21, 22, 23), - BinaryFunc: func(a, b string) string { return fmt.Sprintf("[%s=%s]", a, b) }, - VariadicFunc: func(s ...string) string { return fmt.Sprint("<", strings.Join(s, "+"), ">") }, - VariadicFuncInt: func(a int, s ...string) string { return fmt.Sprint(a, "=<", strings.Join(s, "+"), ">") }, - NilOKFunc: func(s *int) bool { return s == nil }, - ErrFunc: func() (string, error) { return "bla", nil }, - PanicFunc: func() string { panic("test panic") }, - Tmpl: Must(New("x").Parse("test template")), // "x" is the value of .X + Empty1: 3, + Empty2: "empty2", + Empty3: []int{7, 8}, + Empty4: &U{"UinEmpty"}, + NonEmptyInterface: &T{X: "x"}, + NonEmptyInterfacePtS: &siVal, + NonEmptyInterfaceTypedNil: (*T)(nil), + Str: bytes.NewBuffer([]byte("foozle")), + Err: errors.New("erroozle"), + PI: newInt(23), + PS: newString("a string"), + PSI: newIntSlice(21, 22, 23), + BinaryFunc: func(a, b string) string { return fmt.Sprintf("[%s=%s]", a, b) }, + VariadicFunc: func(s ...string) string { return fmt.Sprint("<", strings.Join(s, "+"), ">") }, + VariadicFuncInt: func(a int, s ...string) string { return fmt.Sprint(a, "=<", strings.Join(s, "+"), ">") }, + NilOKFunc: func(s *int) bool { return s == nil }, + ErrFunc: func() (string, error) { return "bla", nil }, + PanicFunc: func() string { panic("test panic") }, + Tmpl: Must(New("x").Parse("test template")), // "x" is the value of .X } var tSliceOfNil = []*T{nil} @@ -365,6 +368,7 @@ var execTests = []execTest{ {".NilOKFunc not nil", "{{call .NilOKFunc .PI}}", "false", tVal, true}, {".NilOKFunc nil", "{{call .NilOKFunc nil}}", "true", tVal, true}, {"method on nil value from slice", "-{{range .}}{{.Method1 1234}}{{end}}-", "-1234-", tSliceOfNil, true}, + {"method on typed nil interface value", "{{.NonEmptyInterfaceTypedNil.Method0}}", "M0", tVal, true}, // Function call builtin. {".BinaryFunc", "{{call .BinaryFunc `1` `2`}}", "[1=2]", tVal, true}, @@ -1557,6 +1561,11 @@ func TestExecutePanicDuringCall(t *testing.T) { "{{call .PanicFunc}}", tVal, `template: t:1:2: executing "t" at : error calling call: test panic`, }, + { + "method call on nil interface", + "{{.NonEmptyInterfaceNil.Method0}}", tVal, + `template: t:1:23: executing "t" at <.NonEmptyInterfaceNil.Method0>: nil pointer evaluating template.I.Method0`, + }, } for _, tc := range tests { b := new(bytes.Buffer) -- GitLab From 8cf1d1634a423a9509c54a6cc8e2ec632a8a6e38 Mon Sep 17 00:00:00 2001 From: Ketan Parmar Date: Thu, 31 Jan 2019 07:28:15 +0530 Subject: [PATCH 0096/1679] encoding/json: add example for json.HTMLEscape Change-Id: Ib00fcfd46eae27eea0a3d4cab4406f4c461fb57b Reviewed-on: https://go-review.googlesource.com/c/160517 Reviewed-by: Andrew Bonventre Run-TryBot: Andrew Bonventre TryBot-Result: Gobot Gobot --- src/encoding/json/example_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/encoding/json/example_test.go b/src/encoding/json/example_test.go index 2031cba793..4c075ddaa6 100644 --- a/src/encoding/json/example_test.go +++ b/src/encoding/json/example_test.go @@ -301,3 +301,11 @@ func ExampleValid() { // Output: // true false } + +func ExampleHTMLEscape() { + var out bytes.Buffer + json.HTMLEscape(&out, []byte(`{"Name":"HTML content"}`)) + out.WriteTo(os.Stdout) + // Output: + //{"Name":"\u003cb\u003eHTML content\u003c/b\u003e"} +} -- GitLab From 8ca559eed5a5b87cb4a1ebe29c95b47aa723151e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 26 Feb 2019 19:01:47 +0100 Subject: [PATCH 0097/1679] cmd/dist: skip Fortran tests on Android They don't work on Android but will be run if the host has gfortran installed. Change-Id: I983c5695a9e963def90e4f8264fb00077a0c5e53 Reviewed-on: https://go-review.googlesource.com/c/163838 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/dist/test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 31b44e8ef4..6f2eee19df 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -626,7 +626,7 @@ func (t *tester) registerTests() { if fortran == "" { fortran, _ = exec.LookPath("gfortran") } - if t.hasBash() && fortran != "" { + if t.hasBash() && goos != "android" && fortran != "" { t.tests = append(t.tests, distTest{ name: "cgo_fortran", heading: "../misc/cgo/fortran", -- GitLab From 01971b97c11cd55e9e65f628b7f1c3fc8ef81944 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 10 Nov 2018 06:58:36 -0800 Subject: [PATCH 0098/1679] cmd/compile: cull dead code The special case for ODOTPTR to handle zero-width fields is unneeded. It is an artifact of the old backend, from which time this code dates. The Node to SSA converter is careful to insert a nil check. This is tested in test/nilptr2.go, among other places. Passes toolstash-check. Change-Id: I6c1d99f7ff5abdae9aa08ee047dc088a3fe8dc3c Reviewed-on: https://go-review.googlesource.com/c/148828 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/walk.go | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 509579d21f..9bfdaffa62 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -493,7 +493,7 @@ opswitch: n.Left = walkexpr(n.Left, init) n.Right = walkexpr(n.Right, init) - case ODOT: + case ODOT, ODOTPTR: usefield(n) n.Left = walkexpr(n.Left, init) @@ -508,17 +508,6 @@ opswitch: n.List.Set1(itabname(n.Type, n.Left.Type)) } - case ODOTPTR: - usefield(n) - if n.Op == ODOTPTR && n.Left.Type.Elem().Width == 0 { - // No actual copy will be generated, so emit an explicit nil check. - n.Left = cheapexpr(n.Left, init) - - checknil(n.Left, init) - } - - n.Left = walkexpr(n.Left, init) - case OLEN, OCAP: if isRuneCount(n) { // Replace len([]rune(string)) with runtime.countrunes(string). -- GitLab From 8d72e59853de42cb50a5aa172cedcc9010345184 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Tue, 22 Jan 2019 16:21:32 -0500 Subject: [PATCH 0099/1679] crypto/tls: remove superfluous for label Change-Id: I8ea3043fcbaf7a5f73b2a796171a7f1cb3cb3693 Reviewed-on: https://go-review.googlesource.com/c/158818 Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/crypto/tls/handshake_client.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/crypto/tls/handshake_client.go b/src/crypto/tls/handshake_client.go index ca74989f6e..31bd069bbc 100644 --- a/src/crypto/tls/handshake_client.go +++ b/src/crypto/tls/handshake_client.go @@ -85,7 +85,6 @@ func (c *Conn) makeClientHello() (*clientHelloMsg, ecdheParameters, error) { possibleCipherSuites := config.cipherSuites() hello.cipherSuites = make([]uint16, 0, len(possibleCipherSuites)) -NextCipherSuite: for _, suiteId := range possibleCipherSuites { for _, suite := range cipherSuites { if suite.id != suiteId { @@ -94,10 +93,10 @@ NextCipherSuite: // Don't advertise TLS 1.2-only cipher suites unless // we're attempting TLS 1.2. if hello.vers < VersionTLS12 && suite.flags&suiteTLS12 != 0 { - continue + break } hello.cipherSuites = append(hello.cipherSuites, suiteId) - continue NextCipherSuite + break } } -- GitLab From c6e47069af1a4e93547450e34253da2b22b9c23d Mon Sep 17 00:00:00 2001 From: Marat Khabibullin Date: Wed, 13 Feb 2019 19:19:33 +0000 Subject: [PATCH 0100/1679] net/textproto: prevent test from failing with nil pointer dereference The variable err could have nil value when we call err.Error(), because after we check it for nil above we continue the test (t.Errorf doesn't stop the test execution). Updates #30208 Change-Id: Ibcf38698326c69c06068989510311e37806995c6 GitHub-Last-Rev: 3ab20f6d7fe34ed9b777e0894b57166d173de8ca GitHub-Pull-Request: golang/go#30214 Reviewed-on: https://go-review.googlesource.com/c/162457 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/textproto/reader_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go index f85fbdc36d..6d9bcd841b 100644 --- a/src/net/textproto/reader_test.go +++ b/src/net/textproto/reader_test.go @@ -332,7 +332,7 @@ func TestReadMultiLineError(t *testing.T) { if msg != wantMsg { t.Errorf("ReadResponse: msg=%q, want %q", msg, wantMsg) } - if err.Error() != "550 "+wantMsg { + if err != nil && err.Error() != "550 "+wantMsg { t.Errorf("ReadResponse: error=%q, want %q", err.Error(), "550 "+wantMsg) } } -- GitLab From 6d781decad8cde821245d03189a1f87021d6671c Mon Sep 17 00:00:00 2001 From: Michael Fraenkel Date: Tue, 22 Jan 2019 19:10:29 -0500 Subject: [PATCH 0101/1679] cmd/compile: confusing error if composite literal field is a method When looking for the field specified in a composite literal, check that the specified name is actually a field and not a method. Fixes #29855. Change-Id: Id77666e846f925907b1eec64213b1d25af8a2466 Reviewed-on: https://go-review.googlesource.com/c/158938 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/reflect.go | 2 +- src/cmd/compile/internal/gc/subr.go | 6 +++--- src/cmd/compile/internal/gc/typecheck.go | 5 +++-- src/cmd/compile/internal/types/type.go | 5 +++++ test/fixedbugs/issue29855.go | 17 +++++++++++++++++ 5 files changed, 29 insertions(+), 6 deletions(-) create mode 100644 test/fixedbugs/issue29855.go diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 7a93ece8b9..8b058330dd 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -375,7 +375,7 @@ func methods(t *types.Type) []*Sig { // generating code if necessary. var ms []*Sig for _, f := range mt.AllMethods().Slice() { - if f.Type.Etype != TFUNC || f.Type.Recv() == nil { + if !f.IsMethod() { Fatalf("non-method on %v method %v %v\n", mt, f.Sym, f) } if f.Type.Recv() == nil { diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 7dcbc6a9e1..3a261244d1 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1180,7 +1180,7 @@ func lookdot0(s *types.Sym, t *types.Type, save **types.Field, ignorecase bool) c := 0 if u.IsStruct() || u.IsInterface() { for _, f := range u.Fields().Slice() { - if f.Sym == s || (ignorecase && f.Type.Etype == TFUNC && f.Type.Recv() != nil && strings.EqualFold(f.Sym.Name, s.Name)) { + if f.Sym == s || (ignorecase && f.IsMethod() && strings.EqualFold(f.Sym.Name, s.Name)) { if save != nil { *save = f } @@ -1420,7 +1420,7 @@ func expandmeth(t *types.Type) { } // dotpath may have dug out arbitrary fields, we only want methods. - if f.Type.Etype != TFUNC || f.Type.Recv() == nil { + if !f.IsMethod() { continue } @@ -1631,7 +1631,7 @@ func ifacelookdot(s *types.Sym, t *types.Type, ignorecase bool) (m *types.Field, } } - if m.Type.Etype != TFUNC || m.Type.Recv() == nil { + if !m.IsMethod() { yyerror("%v.%v is a field, not a method", t, s) return nil, followptr } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index e22fd6445a..0702da25ee 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3250,8 +3250,9 @@ func typecheckcomplit(n *Node) (res *Node) { } continue } - p, _ := dotpath(l.Sym, t, nil, true) - if p == nil { + var f *types.Field + p, _ := dotpath(l.Sym, t, &f, true) + if p == nil || f.IsMethod() { yyerror("unknown field '%v' in struct literal of type %v", l.Sym, t) continue } diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index 3e5f5cbf49..7d123e4610 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -392,6 +392,11 @@ func (f *Field) End() int64 { return f.Offset + f.Type.Width } +// IsMethod reports whether f represents a method rather than a struct field. +func (f *Field) IsMethod() bool { + return f.Type.Etype == TFUNC && f.Type.Recv() != nil +} + // Fields is a pointer to a slice of *Field. // This saves space in Types that do not have fields or methods // compared to a simple slice of *Field. diff --git a/test/fixedbugs/issue29855.go b/test/fixedbugs/issue29855.go new file mode 100644 index 0000000000..b57eae2b44 --- /dev/null +++ b/test/fixedbugs/issue29855.go @@ -0,0 +1,17 @@ +// errorcheck + +// Copyright 2018 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 main + +type T struct { + GlobalName string +} + +var t = T{Name: "foo"} // ERROR "unknown field 'Name' in struct literal of type T" + +func (t T) Name() string { + return t.GlobalName +} -- GitLab From 576a3c61d9a0960565e068732c26f8fa96314f7a Mon Sep 17 00:00:00 2001 From: Marat Khabibullin Date: Wed, 13 Feb 2019 19:18:25 +0000 Subject: [PATCH 0102/1679] crypto/x509: remove redundant check for nil in tests Comparing err variable to be not nil is redundant in this case. The code above ensures that it is always not nil. Updates #30208 Change-Id: I0a41601273de36a05d22270a743c0bdedeb1d0bf GitHub-Last-Rev: 372e0fd48f90f33e266fbcdf2ccf87b9f1311c4f GitHub-Pull-Request: golang/go#30213 Reviewed-on: https://go-review.googlesource.com/c/162439 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/crypto/x509/name_constraints_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/crypto/x509/name_constraints_test.go b/src/crypto/x509/name_constraints_test.go index 4c9bc1b87a..735534da95 100644 --- a/src/crypto/x509/name_constraints_test.go +++ b/src/crypto/x509/name_constraints_test.go @@ -2220,10 +2220,8 @@ func TestBadNamesInSANs(t *testing.T) { continue } - if err != nil { - if str := err.Error(); !strings.Contains(str, "cannot parse ") { - t.Errorf("bad name %q triggered unrecognised error: %s", badName, str) - } + if str := err.Error(); !strings.Contains(str, "cannot parse ") { + t.Errorf("bad name %q triggered unrecognised error: %s", badName, str) } } } -- GitLab From 39fa3f171c7b790a3f8f22d8398fdf67d680b5a7 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Thu, 7 Feb 2019 13:11:12 +0530 Subject: [PATCH 0103/1679] cmd/compile: fix a typo in assignment mismatch error Fixes #30087 Change-Id: Ic6d80f8e6e1831886af8613420b1bd129a1b4850 Reviewed-on: https://go-review.googlesource.com/c/161577 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/typecheck.go | 2 +- test/fixedbugs/issue30087.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue30087.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 0702da25ee..7593f0d1e1 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3603,7 +3603,7 @@ func typecheckas2(n *Node) { mismatch: switch r.Op { default: - yyerror("assignment mismatch: %d variable but %d values", cl, cr) + yyerror("assignment mismatch: %d variables but %d values", cl, cr) case OCALLFUNC, OCALLMETH, OCALLINTER: yyerror("assignment mismatch: %d variables but %v returns %d values", cl, r.Left, cr) } diff --git a/test/fixedbugs/issue30087.go b/test/fixedbugs/issue30087.go new file mode 100644 index 0000000000..dc12364d80 --- /dev/null +++ b/test/fixedbugs/issue30087.go @@ -0,0 +1,14 @@ +// errorcheck + +// Copyright 2019 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 main + +func main() { + var a, b = 1 // ERROR "assignment mismatch: 2 variables but 1 values" + _ = 1, 2 // ERROR "assignment mismatch: 1 variables but 2 values" + c, d := 1 // ERROR "assignment mismatch: 2 variables but 1 values" + e, f := 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values" +} -- GitLab From da50e10c2e80e8c4f53a0bb1d20de57995abc7ca Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Mon, 18 Feb 2019 14:43:06 +0530 Subject: [PATCH 0104/1679] go/doc: skip escaping comments in pre-formatted blocks CL 150377 made the change of converting smart quotes to their html escaped entities for ToHTML, and to unicode quotes for ToText. But for ToText, the change converted the quotes in pre-formatted text too. This fixes that behavior to not touch any text in pre-formatted blocks, which also makes the behavior consistent with ToHTML. Fixes #29730 Change-Id: I58e0216cbdbe189d06d82147e5a02b620af14734 Reviewed-on: https://go-review.googlesource.com/c/162922 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/doc/comment.go | 1 - src/go/doc/comment_test.go | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/go/doc/comment.go b/src/go/doc/comment.go index 0ec42643fd..73857330fa 100644 --- a/src/go/doc/comment.go +++ b/src/go/doc/comment.go @@ -445,7 +445,6 @@ func ToText(w io.Writer, text string, indent, preIndent string, width int) { w.Write([]byte("\n")) } else { w.Write([]byte(preIndent)) - line = convertQuotes(line) w.Write([]byte(line)) } } diff --git a/src/go/doc/comment_test.go b/src/go/doc/comment_test.go index e0adeb2f5c..0687f3a62b 100644 --- a/src/go/doc/comment_test.go +++ b/src/go/doc/comment_test.go @@ -126,6 +126,14 @@ $ pre $ pre2 `, }, + { + in: "Para.\n\tshould not be ``escaped''", + out: []block{ + {opPara, []string{"Para.\n"}}, + {opPre, []string{"should not be ``escaped''"}}, + }, + text: ". Para.\n\n$ should not be ``escaped''", + }, } func TestBlocks(t *testing.T) { -- GitLab From e90e7a59dc1aa9cd488400d58405064943b4d3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 16 Dec 2018 19:11:28 +0100 Subject: [PATCH 0105/1679] encoding/base32: simplify and speed up decoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First, we can lift the enc.decodeMap nil check out of the loop. Second, we can make it clear to the compiler that 'in := src[0]' doesn't need a bounds check, by making len(src)==0 a single if check that always stops the loop. This is by far the largest speed-up. Third, we can use a dst slice index instead of reslicing dst, which removes work from the loop body. While at it, we can merge the two 'switch dlen' pieces of code, which simplifies the code and doesn't affect performance. name old time/op new time/op delta DecodeString-8 80.2µs ± 0% 67.5µs ± 0% -15.81% (p=0.002 n=6+6) name old speed new speed delta DecodeString-8 163MB/s ± 0% 194MB/s ± 0% +18.78% (p=0.002 n=6+6) Change-Id: Iefeaae94c03453f8760452b1da706a77b3522718 Reviewed-on: https://go-review.googlesource.com/c/154422 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/base32/base32.go | 52 +++++++++++++++-------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/encoding/base32/base32.go b/src/encoding/base32/base32.go index 3fb6caceab..e14d2d4987 100644 --- a/src/encoding/base32/base32.go +++ b/src/encoding/base32/base32.go @@ -284,7 +284,12 @@ func (e CorruptInputError) Error() string { // additional data is an error. This method assumes that src has been // stripped of all supported whitespace ('\r' and '\n'). func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) { + // Lift the nil check outside of the loop. + _ = enc.decodeMap + + dsti := 0 olen := len(src) + for len(src) > 0 && !end { // Decode quantum using the base32 alphabet var dbuf [8]byte @@ -292,17 +297,15 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) { for j := 0; j < 8; { - // We have reached the end and are missing padding - if len(src) == 0 && enc.padChar != NoPadding { - return n, false, CorruptInputError(olen - len(src) - j) - } - - // We have reached the end and are not expecing any padding - if len(src) == 0 && enc.padChar == NoPadding { + if len(src) == 0 { + if enc.padChar != NoPadding { + // We have reached the end and are missing padding + return n, false, CorruptInputError(olen - len(src) - j) + } + // We have reached the end and are not expecing any padding dlen, end = j, true break } - in := src[0] src = src[1:] if in == byte(enc.padChar) && j >= 2 && len(src) < 8 { @@ -339,37 +342,26 @@ func (enc *Encoding) decode(dst, src []byte) (n int, end bool, err error) { // quantum switch dlen { case 8: - dst[4] = dbuf[6]<<5 | dbuf[7] + dst[dsti+4] = dbuf[6]<<5 | dbuf[7] + n++ fallthrough case 7: - dst[3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3 + dst[dsti+3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3 + n++ fallthrough case 5: - dst[2] = dbuf[3]<<4 | dbuf[4]>>1 + dst[dsti+2] = dbuf[3]<<4 | dbuf[4]>>1 + n++ fallthrough case 4: - dst[1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4 + dst[dsti+1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4 + n++ fallthrough case 2: - dst[0] = dbuf[0]<<3 | dbuf[1]>>2 - } - - if !end { - dst = dst[5:] - } - - switch dlen { - case 2: - n += 1 - case 4: - n += 2 - case 5: - n += 3 - case 7: - n += 4 - case 8: - n += 5 + dst[dsti+0] = dbuf[0]<<3 | dbuf[1]>>2 + n++ } + dsti += 5 } return n, end, nil } -- GitLab From 1e58bb14910f117554e5e749648e8b0d0771726b Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 10 Nov 2018 07:00:32 -0800 Subject: [PATCH 0106/1679] cmd/compile: inline checknil Now that checknil has only a single caller, inline it. Passes toolstash-check. Change-Id: I5b13596bef84dd9a3e7f4bff8560903f1e54acfb Reviewed-on: https://go-review.googlesource.com/c/148829 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/closure.go | 8 +++++++- src/cmd/compile/internal/gc/subr.go | 12 ------------ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 284ecdf457..6db0f02001 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -523,8 +523,14 @@ func walkpartialcall(n *Node, init *Nodes) *Node { // Trigger panic for method on nil interface now. // Otherwise it happens in the wrapper and is confusing. n.Left = cheapexpr(n.Left, init) + n.Left = walkexpr(n.Left, nil) - checknil(n.Left, init) + tab := nod(OITAB, n.Left, nil) + tab = typecheck(tab, ctxExpr) + + c := nod(OCHECKNIL, tab, nil) + c.SetTypecheck(1) + init.Append(c) } typ := partialCallType(n) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 3a261244d1..775147bff7 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1829,18 +1829,6 @@ func isbadimport(path string, allowSpace bool) bool { return false } -func checknil(x *Node, init *Nodes) { - x = walkexpr(x, nil) // caller has not done this yet - if x.Type.IsInterface() { - x = nod(OITAB, x, nil) - x = typecheck(x, ctxExpr) - } - - n := nod(OCHECKNIL, x, nil) - n.SetTypecheck(1) - init.Append(n) -} - // Can this type be stored directly in an interface word? // Yes, if the representation is a single pointer. func isdirectiface(t *types.Type) bool { -- GitLab From 675503c507194a48c01a39a0f25a6d0c9d772477 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 30 Jan 2019 00:49:33 -0500 Subject: [PATCH 0107/1679] math/big: add %x float format big.Float already had %p for printing hex format, but that format normalizes differently from fmt's %x and ignores precision entirely. This CL adds %x to big.Float, matching fmt's behavior: the verb is spelled 'x' not 'p', the mantissa is normalized to [1, 2), and precision is respected. See golang.org/design/19308-number-literals for background. For #29008. Change-Id: I9c1b9612107094856797e5b0b584c556c1914895 Reviewed-on: https://go-review.googlesource.com/c/160249 Reviewed-by: Robert Griesemer --- src/math/big/floatconv_test.go | 229 ++++++++++++++++++++------------- src/math/big/ftoa.go | 102 +++++++++++++-- 2 files changed, 229 insertions(+), 102 deletions(-) diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index 154c818905..768943b902 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -268,7 +268,7 @@ func TestFloat64Text(t *testing.T) { {32, 'g', -1, "32"}, {32, 'g', 0, "3e+01"}, - // {100, 'x', -1, "%x"}, + {100, 'x', -1, "0x1.9p+06"}, // {math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs // {-math.NaN(), 'g', -1, "NaN"}, // Float doesn't support NaNs @@ -339,115 +339,166 @@ func actualPrec(x float64) uint { } func TestFloatText(t *testing.T) { + const defaultRound = ^RoundingMode(0) + for _, test := range []struct { x string + round RoundingMode prec uint format byte digits int want string }{ - {"0", 10, 'f', 0, "0"}, - {"-0", 10, 'f', 0, "-0"}, - {"1", 10, 'f', 0, "1"}, - {"-1", 10, 'f', 0, "-1"}, - - {"1.459", 100, 'e', 0, "1e+00"}, - {"2.459", 100, 'e', 1, "2.5e+00"}, - {"3.459", 100, 'e', 2, "3.46e+00"}, - {"4.459", 100, 'e', 3, "4.459e+00"}, - {"5.459", 100, 'e', 4, "5.4590e+00"}, - - {"1.459", 100, 'E', 0, "1E+00"}, - {"2.459", 100, 'E', 1, "2.5E+00"}, - {"3.459", 100, 'E', 2, "3.46E+00"}, - {"4.459", 100, 'E', 3, "4.459E+00"}, - {"5.459", 100, 'E', 4, "5.4590E+00"}, - - {"1.459", 100, 'f', 0, "1"}, - {"2.459", 100, 'f', 1, "2.5"}, - {"3.459", 100, 'f', 2, "3.46"}, - {"4.459", 100, 'f', 3, "4.459"}, - {"5.459", 100, 'f', 4, "5.4590"}, - - {"1.459", 100, 'g', 0, "1"}, - {"2.459", 100, 'g', 1, "2"}, - {"3.459", 100, 'g', 2, "3.5"}, - {"4.459", 100, 'g', 3, "4.46"}, - {"5.459", 100, 'g', 4, "5.459"}, - - {"1459", 53, 'g', 0, "1e+03"}, - {"2459", 53, 'g', 1, "2e+03"}, - {"3459", 53, 'g', 2, "3.5e+03"}, - {"4459", 53, 'g', 3, "4.46e+03"}, - {"5459", 53, 'g', 4, "5459"}, - - {"1459", 53, 'G', 0, "1E+03"}, - {"2459", 53, 'G', 1, "2E+03"}, - {"3459", 53, 'G', 2, "3.5E+03"}, - {"4459", 53, 'G', 3, "4.46E+03"}, - {"5459", 53, 'G', 4, "5459"}, - - {"3", 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"}, - {"3", 10, 'f', 40, "3.0000000000000000000000000000000000000000"}, - {"3", 10, 'g', 40, "3"}, - - {"3e40", 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"}, - {"3e40", 100, 'f', 4, "30000000000000000000000000000000000000000.0000"}, - {"3e40", 100, 'g', 40, "3e+40"}, + {"0", defaultRound, 10, 'f', 0, "0"}, + {"-0", defaultRound, 10, 'f', 0, "-0"}, + {"1", defaultRound, 10, 'f', 0, "1"}, + {"-1", defaultRound, 10, 'f', 0, "-1"}, + + {"1.459", defaultRound, 100, 'e', 0, "1e+00"}, + {"2.459", defaultRound, 100, 'e', 1, "2.5e+00"}, + {"3.459", defaultRound, 100, 'e', 2, "3.46e+00"}, + {"4.459", defaultRound, 100, 'e', 3, "4.459e+00"}, + {"5.459", defaultRound, 100, 'e', 4, "5.4590e+00"}, + + {"1.459", defaultRound, 100, 'E', 0, "1E+00"}, + {"2.459", defaultRound, 100, 'E', 1, "2.5E+00"}, + {"3.459", defaultRound, 100, 'E', 2, "3.46E+00"}, + {"4.459", defaultRound, 100, 'E', 3, "4.459E+00"}, + {"5.459", defaultRound, 100, 'E', 4, "5.4590E+00"}, + + {"1.459", defaultRound, 100, 'f', 0, "1"}, + {"2.459", defaultRound, 100, 'f', 1, "2.5"}, + {"3.459", defaultRound, 100, 'f', 2, "3.46"}, + {"4.459", defaultRound, 100, 'f', 3, "4.459"}, + {"5.459", defaultRound, 100, 'f', 4, "5.4590"}, + + {"1.459", defaultRound, 100, 'g', 0, "1"}, + {"2.459", defaultRound, 100, 'g', 1, "2"}, + {"3.459", defaultRound, 100, 'g', 2, "3.5"}, + {"4.459", defaultRound, 100, 'g', 3, "4.46"}, + {"5.459", defaultRound, 100, 'g', 4, "5.459"}, + + {"1459", defaultRound, 53, 'g', 0, "1e+03"}, + {"2459", defaultRound, 53, 'g', 1, "2e+03"}, + {"3459", defaultRound, 53, 'g', 2, "3.5e+03"}, + {"4459", defaultRound, 53, 'g', 3, "4.46e+03"}, + {"5459", defaultRound, 53, 'g', 4, "5459"}, + + {"1459", defaultRound, 53, 'G', 0, "1E+03"}, + {"2459", defaultRound, 53, 'G', 1, "2E+03"}, + {"3459", defaultRound, 53, 'G', 2, "3.5E+03"}, + {"4459", defaultRound, 53, 'G', 3, "4.46E+03"}, + {"5459", defaultRound, 53, 'G', 4, "5459"}, + + {"3", defaultRound, 10, 'e', 40, "3.0000000000000000000000000000000000000000e+00"}, + {"3", defaultRound, 10, 'f', 40, "3.0000000000000000000000000000000000000000"}, + {"3", defaultRound, 10, 'g', 40, "3"}, + + {"3e40", defaultRound, 100, 'e', 40, "3.0000000000000000000000000000000000000000e+40"}, + {"3e40", defaultRound, 100, 'f', 4, "30000000000000000000000000000000000000000.0000"}, + {"3e40", defaultRound, 100, 'g', 40, "3e+40"}, // make sure "stupid" exponents don't stall the machine - {"1e1000000", 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"}, - {"1e646456992", 64, 'p', 0, "0x.e883a0c5c8c7c42ap+2147483644"}, - {"1e646456993", 64, 'p', 0, "+Inf"}, - {"1e1000000000", 64, 'p', 0, "+Inf"}, - {"1e-1000000", 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"}, - {"1e-646456993", 64, 'p', 0, "0x.e17c8956983d9d59p-2147483647"}, - {"1e-646456994", 64, 'p', 0, "0"}, - {"1e-1000000000", 64, 'p', 0, "0"}, + {"1e1000000", defaultRound, 64, 'p', 0, "0x.88b3a28a05eade3ap+3321929"}, + {"1e646456992", defaultRound, 64, 'p', 0, "0x.e883a0c5c8c7c42ap+2147483644"}, + {"1e646456993", defaultRound, 64, 'p', 0, "+Inf"}, + {"1e1000000000", defaultRound, 64, 'p', 0, "+Inf"}, + {"1e-1000000", defaultRound, 64, 'p', 0, "0x.efb4542cc8ca418ap-3321928"}, + {"1e-646456993", defaultRound, 64, 'p', 0, "0x.e17c8956983d9d59p-2147483647"}, + {"1e-646456994", defaultRound, 64, 'p', 0, "0"}, + {"1e-1000000000", defaultRound, 64, 'p', 0, "0"}, // minimum and maximum values - {"1p2147483646", 64, 'p', 0, "0x.8p+2147483647"}, - {"0x.8p2147483647", 64, 'p', 0, "0x.8p+2147483647"}, - {"0x.8p-2147483647", 64, 'p', 0, "0x.8p-2147483647"}, - {"1p-2147483649", 64, 'p', 0, "0x.8p-2147483648"}, + {"1p2147483646", defaultRound, 64, 'p', 0, "0x.8p+2147483647"}, + {"0x.8p2147483647", defaultRound, 64, 'p', 0, "0x.8p+2147483647"}, + {"0x.8p-2147483647", defaultRound, 64, 'p', 0, "0x.8p-2147483647"}, + {"1p-2147483649", defaultRound, 64, 'p', 0, "0x.8p-2147483648"}, // TODO(gri) need tests for actual large Floats - {"0", 53, 'b', 0, "0"}, - {"-0", 53, 'b', 0, "-0"}, - {"1.0", 53, 'b', 0, "4503599627370496p-52"}, - {"-1.0", 53, 'b', 0, "-4503599627370496p-52"}, - {"4503599627370496", 53, 'b', 0, "4503599627370496p+0"}, + {"0", defaultRound, 53, 'b', 0, "0"}, + {"-0", defaultRound, 53, 'b', 0, "-0"}, + {"1.0", defaultRound, 53, 'b', 0, "4503599627370496p-52"}, + {"-1.0", defaultRound, 53, 'b', 0, "-4503599627370496p-52"}, + {"4503599627370496", defaultRound, 53, 'b', 0, "4503599627370496p+0"}, // issue 9939 - {"3", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - {"03", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - {"3.", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - {"3.0", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - {"3.00", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - {"3.000", 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, - - {"3", 350, 'p', 0, "0x.cp+2"}, - {"03", 350, 'p', 0, "0x.cp+2"}, - {"3.", 350, 'p', 0, "0x.cp+2"}, - {"3.0", 350, 'p', 0, "0x.cp+2"}, - {"3.00", 350, 'p', 0, "0x.cp+2"}, - {"3.000", 350, 'p', 0, "0x.cp+2"}, - - {"0", 64, 'p', 0, "0"}, - {"-0", 64, 'p', 0, "-0"}, - {"1024.0", 64, 'p', 0, "0x.8p+11"}, - {"-1024.0", 64, 'p', 0, "-0x.8p+11"}, - - // unsupported format - //{"3.14", 64, 'x', 0, "%x"}, - //{"-3.14", 64, 'x', 0, "%x"}, + {"3", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + {"03", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + {"3.", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + {"3.0", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + {"3.00", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + {"3.000", defaultRound, 350, 'b', 0, "1720123961992553633708115671476565205597423741876210842803191629540192157066363606052513914832594264915968p-348"}, + + {"3", defaultRound, 350, 'p', 0, "0x.cp+2"}, + {"03", defaultRound, 350, 'p', 0, "0x.cp+2"}, + {"3.", defaultRound, 350, 'p', 0, "0x.cp+2"}, + {"3.0", defaultRound, 350, 'p', 0, "0x.cp+2"}, + {"3.00", defaultRound, 350, 'p', 0, "0x.cp+2"}, + {"3.000", defaultRound, 350, 'p', 0, "0x.cp+2"}, + + {"0", defaultRound, 64, 'p', 0, "0"}, + {"-0", defaultRound, 64, 'p', 0, "-0"}, + {"1024.0", defaultRound, 64, 'p', 0, "0x.8p+11"}, + {"-1024.0", defaultRound, 64, 'p', 0, "-0x.8p+11"}, + + {"0", defaultRound, 64, 'x', -1, "0x0p+00"}, + {"0", defaultRound, 64, 'x', 0, "0x0p+00"}, + {"0", defaultRound, 64, 'x', 1, "0x0.0p+00"}, + {"0", defaultRound, 64, 'x', 5, "0x0.00000p+00"}, + {"3.25", defaultRound, 64, 'x', 0, "0x1p+02"}, + {"-3.25", defaultRound, 64, 'x', 0, "-0x1p+02"}, + {"3.25", defaultRound, 64, 'x', 1, "0x1.ap+01"}, + {"-3.25", defaultRound, 64, 'x', 1, "-0x1.ap+01"}, + {"3.25", defaultRound, 64, 'x', -1, "0x1.ap+01"}, + {"-3.25", defaultRound, 64, 'x', -1, "-0x1.ap+01"}, + {"1024.0", defaultRound, 64, 'x', 0, "0x1p+10"}, + {"-1024.0", defaultRound, 64, 'x', 0, "-0x1p+10"}, + {"1024.0", defaultRound, 64, 'x', 5, "0x1.00000p+10"}, + {"8191.0", defaultRound, 53, 'x', -1, "0x1.fffp+12"}, + {"8191.5", defaultRound, 53, 'x', -1, "0x1.fff8p+12"}, + {"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"}, + {"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"}, + {"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"}, + {"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"}, + {"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"}, + {"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"}, + + {"8191.53125", defaultRound, 53, 'x', -1, "0x1.fff88p+12"}, + {"8191.53125", ToNearestEven, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.53125", ToNearestAway, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.53125", ToZero, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.53125", AwayFromZero, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.53125", ToNegativeInf, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.53125", ToPositiveInf, 53, 'x', 5, "0x1.fff88p+12"}, + + {"8191.53125", defaultRound, 53, 'x', 4, "0x1.fff8p+12"}, + {"8191.53125", defaultRound, 53, 'x', 3, "0x1.000p+13"}, + {"8191.53125", defaultRound, 53, 'x', 0, "0x1p+13"}, + {"8191.533203125", defaultRound, 53, 'x', -1, "0x1.fff888p+12"}, + {"8191.533203125", defaultRound, 53, 'x', 6, "0x1.fff888p+12"}, + {"8191.533203125", defaultRound, 53, 'x', 5, "0x1.fff88p+12"}, + {"8191.533203125", defaultRound, 53, 'x', 4, "0x1.fff9p+12"}, + + {"8191.53125", ToNearestEven, 53, 'x', 4, "0x1.fff8p+12"}, + {"8191.53125", ToNearestAway, 53, 'x', 4, "0x1.fff9p+12"}, + {"8191.53125", ToZero, 53, 'x', 4, "0x1.fff8p+12"}, + {"8191.53125", ToZero, 53, 'x', 2, "0x1.ffp+12"}, + {"8191.53125", AwayFromZero, 53, 'x', 4, "0x1.fff9p+12"}, + {"8191.53125", ToNegativeInf, 53, 'x', 4, "0x1.fff8p+12"}, + {"-8191.53125", ToNegativeInf, 53, 'x', 4, "-0x1.fff9p+12"}, + {"8191.53125", ToPositiveInf, 53, 'x', 4, "0x1.fff9p+12"}, + {"-8191.53125", ToPositiveInf, 53, 'x', 4, "-0x1.fff8p+12"}, } { f, _, err := ParseFloat(test.x, 0, test.prec, ToNearestEven) if err != nil { t.Errorf("%v: %s", test, err) continue } + if test.round != defaultRound { + f.SetMode(test.round) + } got := f.Text(test.format, test.digits) if got != test.want { @@ -458,7 +509,7 @@ func TestFloatText(t *testing.T) { // ('p' format is not supported by strconv.FormatFloat, // and its output for 0.0 prints a biased exponent value // as in 0p-1074 which makes no sense to emulate here) - if test.prec == 53 && test.format != 'p' && f.Sign() != 0 { + if test.prec == 53 && test.format != 'p' && f.Sign() != 0 && (test.round == ToNearestEven || test.round == defaultRound) { f64, acc := f.Float64() if acc != Exact { t.Errorf("%v: expected exact conversion to float64", test) diff --git a/src/math/big/ftoa.go b/src/math/big/ftoa.go index d2a85886c7..6cae63ed09 100644 --- a/src/math/big/ftoa.go +++ b/src/math/big/ftoa.go @@ -22,24 +22,28 @@ import ( // 'f' -ddddd.dddd, no exponent // 'g' like 'e' for large exponents, like 'f' otherwise // 'G' like 'E' for large exponents, like 'f' otherwise -// 'b' -ddddddp±dd, binary exponent -// 'p' -0x.dddp±dd, binary exponent, hexadecimal mantissa +// 'x' -0xd.dddddp±dd, hexadecimal mantissa, decimal power of two exponent +// 'p' -0x.dddp±dd, hexadecimal mantissa, decimal power of two exponent (non-standard) +// 'b' -ddddddp±dd, decimal mantissa, decimal power of two exponent (non-standard) // -// For the binary exponent formats, the mantissa is printed in normalized form: +// For the power-of-two exponent formats, the mantissa is printed in normalized form: // -// 'b' decimal integer mantissa using x.Prec() bits, or -0 -// 'p' hexadecimal fraction with 0.5 <= 0.mantissa < 1.0, or -0 +// 'x' hexadecimal mantissa in [1, 2), or 0 +// 'p' hexadecimal mantissa in [½, 1), or 0 +// 'b' decimal integer mantissa using x.Prec() bits, or 0 +// +// Note that the 'x' form is the one used by most other languages and libraries. // // If format is a different character, Text returns a "%" followed by the // unrecognized format character. // // The precision prec controls the number of digits (excluding the exponent) -// printed by the 'e', 'E', 'f', 'g', and 'G' formats. For 'e', 'E', and 'f' -// it is the number of digits after the decimal point. For 'g' and 'G' it is -// the total number of digits. A negative precision selects the smallest -// number of decimal digits necessary to identify the value x uniquely using -// x.Prec() mantissa bits. -// The prec value is ignored for the 'b' or 'p' format. +// printed by the 'e', 'E', 'f', 'g', 'G', and 'x' formats. +// For 'e', 'E', 'f', and 'x', it is the number of digits after the decimal point. +// For 'g' and 'G' it is the total number of digits. A negative precision selects +// the smallest number of decimal digits necessary to identify the value x uniquely +// using x.Prec() mantissa bits. +// The prec value is ignored for the 'b' and 'p' formats. func (x *Float) Text(format byte, prec int) string { cap := 10 // TODO(gri) determine a good/better value here if prec > 0 { @@ -76,6 +80,8 @@ func (x *Float) Append(buf []byte, fmt byte, prec int) []byte { return x.fmtB(buf) case 'p': return x.fmtP(buf) + case 'x': + return x.fmtX(buf, prec) } // Algorithm: @@ -308,6 +314,7 @@ func fmtF(buf []byte, prec int, d decimal) []byte { // The mantissa is normalized such that is uses x.Prec() bits in binary // representation. // The sign of x is ignored, and x must not be an Inf. +// (The caller handles Inf before invoking fmtB.) func (x *Float) fmtB(buf []byte) []byte { if x.form == zero { return append(buf, '0') @@ -336,11 +343,80 @@ func (x *Float) fmtB(buf []byte) []byte { return strconv.AppendInt(buf, e, 10) } +// fmtX appends the string of x in the format "0x1." mantissa "p" exponent +// with a hexadecimal mantissa and a binary exponent, or "0x0p0" if x is zero, +// and returns the extended buffer. +// A non-zero mantissa is normalized such that 1.0 <= mantissa < 2.0. +// The sign of x is ignored, and x must not be an Inf. +// (The caller handles Inf before invoking fmtX.) +func (x *Float) fmtX(buf []byte, prec int) []byte { + if x.form == zero { + buf = append(buf, "0x0"...) + if prec > 0 { + buf = append(buf, '.') + for i := 0; i < prec; i++ { + buf = append(buf, '0') + } + } + buf = append(buf, "p+00"...) + return buf + } + + if debugFloat && x.form != finite { + panic("non-finite float") + } + + // round mantissa to n bits + var n uint + if prec < 0 { + n = 1 + (x.MinPrec()-1+3)/4*4 // round MinPrec up to 1 mod 4 + } else { + n = 1 + 4*uint(prec) + } + // n%4 == 1 + x = new(Float).SetPrec(n).SetMode(x.mode).Set(x) + + // adjust mantissa to use exactly n bits + m := x.mant + switch w := uint(len(x.mant)) * _W; { + case w < n: + m = nat(nil).shl(m, n-w) + case w > n: + m = nat(nil).shr(m, w-n) + } + exp := x.exp - 1 + + hm := m.utoa(16) + if debugFloat && hm[0] != '1' { + panic("incorrect mantissa: " + string(hm)) + } + buf = append(buf, "0x1"...) + if len(hm) > 1 { + buf = append(buf, '.') + buf = append(buf, hm[1:]...) + } + + buf = append(buf, 'p') + exp64 := int64(exp) + if exp64 >= 0 { + buf = append(buf, '+') + } else { + exp64 = -exp64 + buf = append(buf, '-') + } + // Force at least two exponent digits, to match fmt. + if exp64 < 10 { + buf = append(buf, '0') + } + return strconv.AppendInt(buf, exp64, 10) +} + // fmtP appends the string of x in the format "0x." mantissa "p" exponent // with a hexadecimal mantissa and a binary exponent, or "0" if x is zero, // and returns the extended buffer. // The mantissa is normalized such that 0.5 <= 0.mantissa < 1.0. // The sign of x is ignored, and x must not be an Inf. +// (The caller handles Inf before invoking fmtP.) func (x *Float) fmtP(buf []byte) []byte { if x.form == zero { return append(buf, '0') @@ -380,7 +456,7 @@ var _ fmt.Formatter = &floatZero // *Float must implement fmt.Formatter // Format implements fmt.Formatter. It accepts all the regular // formats for floating-point numbers ('b', 'e', 'E', 'f', 'F', -// 'g', 'G') as well as 'p' and 'v'. See (*Float).Text for the +// 'g', 'G', 'x') as well as 'p' and 'v'. See (*Float).Text for the // interpretation of 'p'. The 'v' format is handled like 'g'. // Format also supports specification of the minimum precision // in digits, the output field width, as well as the format flags @@ -394,7 +470,7 @@ func (x *Float) Format(s fmt.State, format rune) { } switch format { - case 'e', 'E', 'f', 'b', 'p': + case 'e', 'E', 'f', 'b', 'p', 'x': // nothing to do case 'F': // (*Float).Text doesn't support 'F'; handle like 'f' -- GitLab From d6311ff1e43dd1e7c9cb9edccd10a04b63a7c41f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 30 Jan 2019 00:55:38 -0500 Subject: [PATCH 0108/1679] math/big: add %#b and %O integer formats Matching fmt, %#b now prints an 0b prefix, and %O prints octal with an 0o prefix. See golang.org/design/19308-number-literals for background. For #19308. For #12711. Change-Id: I139c5a9a1dfae15415621601edfa13c6a5f19cfc Reviewed-on: https://go-review.googlesource.com/c/160250 Reviewed-by: Rob Pike Reviewed-by: Robert Griesemer --- src/math/big/intconv.go | 12 +++++++++--- src/math/big/intconv_test.go | 6 +++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/math/big/intconv.go b/src/math/big/intconv.go index 6cca827c8e..65174c5018 100644 --- a/src/math/big/intconv.go +++ b/src/math/big/intconv.go @@ -50,8 +50,9 @@ func writeMultiple(s fmt.State, text string, count int) { var _ fmt.Formatter = intOne // *Int must implement fmt.Formatter // Format implements fmt.Formatter. It accepts the formats -// 'b' (binary), 'o' (octal), 'd' (decimal), 'x' (lowercase -// hexadecimal), and 'X' (uppercase hexadecimal). +// 'b' (binary), 'o' (octal with 0 prefix), 'O' (octal with 0o prefix), +// 'd' (decimal), 'x' (lowercase hexadecimal), and +// 'X' (uppercase hexadecimal). // Also supported are the full suite of package fmt's format // flags for integral types, including '+' and ' ' for sign // control, '#' for leading zero in octal and for hexadecimal, @@ -66,7 +67,7 @@ func (x *Int) Format(s fmt.State, ch rune) { switch ch { case 'b': base = 2 - case 'o': + case 'o', 'O': base = 8 case 'd', 's', 'v': base = 10 @@ -98,6 +99,8 @@ func (x *Int) Format(s fmt.State, ch rune) { prefix := "" if s.Flag('#') { switch ch { + case 'b': // binary + prefix = "0b" case 'o': // octal prefix = "0" case 'x': // hexadecimal @@ -106,6 +109,9 @@ func (x *Int) Format(s fmt.State, ch rune) { prefix = "0X" } } + if ch == 'O' { + prefix = "0o" + } digits := x.abs.utoa(base) if ch == 'X' { diff --git a/src/math/big/intconv_test.go b/src/math/big/intconv_test.go index 2e01ee327d..d23a3e2beb 100644 --- a/src/math/big/intconv_test.go +++ b/src/math/big/intconv_test.go @@ -214,8 +214,12 @@ var formatTests = []struct { {"10", "%y", "%!y(big.Int=10)"}, {"-10", "%y", "%!y(big.Int=-10)"}, - {"10", "%#b", "1010"}, + {"10", "%#b", "0b1010"}, {"10", "%#o", "012"}, + {"10", "%O", "0o12"}, + {"-10", "%#b", "-0b1010"}, + {"-10", "%#o", "-012"}, + {"-10", "%O", "-0o12"}, {"10", "%#d", "10"}, {"10", "%#v", "10"}, {"10", "%#x", "0xa"}, -- GitLab From c63dc6d45956ba471cc88658df4674df3f679a70 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 26 Feb 2019 11:56:19 -0800 Subject: [PATCH 0109/1679] cmd/compile: remove badgerbadgerbadger optimization As discussed in #29242, this optimization is for a bash-ism. No one writes Go code like this. In this repo, it triggers only in test/fixedbugs/bug425.go and that appears to be accidental. Fixes #29242 Change-Id: I257e6ecc73f24680f7282c6ab28729de4e8b27af Reviewed-on: https://go-review.googlesource.com/c/163728 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/walk.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 9bfdaffa62..57bf8a1e0e 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -3342,12 +3342,6 @@ func walkcompareInterface(n *Node, init *Nodes) *Node { } func walkcompareString(n *Node, init *Nodes) *Node { - // s + "badgerbadgerbadger" == "badgerbadgerbadger" - if (n.Op == OEQ || n.Op == ONE) && Isconst(n.Right, CTSTR) && n.Left.Op == OADDSTR && n.Left.List.Len() == 2 && Isconst(n.Left.List.Second(), CTSTR) && strlit(n.Right) == strlit(n.Left.List.Second()) { - r := nod(n.Op, nod(OLEN, n.Left.List.First(), nil), nodintconst(0)) - return finishcompare(n, r, init) - } - // Rewrite comparisons to short constant strings as length+byte-wise comparisons. var cs, ncs *Node // const string, non-const string switch { -- GitLab From c97e57657643de69bf1dc58f3ffde75d31eda0c8 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 28 Dec 2018 09:32:09 -1000 Subject: [PATCH 0110/1679] html/template: use strings.Builder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ...and size initial buffers more accurately. Easy pickings only. More might remain. name old time/op new time/op delta CSSEscaper-8 1.17µs ± 1% 0.80µs ± 2% -31.55% (p=0.000 n=44+48) CSSEscaperNoSpecials-8 205ns ± 2% 204ns ± 3% -0.73% (p=0.014 n=46+49) DecodeCSS-8 438ns ± 2% 436ns ± 2% ~ (p=0.099 n=48+47) DecodeCSSNoSpecials-8 6.11ns ± 3% 5.93ns ± 3% -2.85% (p=0.000 n=50+48) CSSValueFilter-8 149ns ± 0% 145ns ± 0% -2.68% (p=0.000 n=32+35) CSSValueFilterOk-8 238ns ± 2% 234ns ± 2% -1.40% (p=0.000 n=49+47) EscapedExecute-8 2.53µs ± 2% 2.55µs ± 1% +0.87% (p=0.000 n=48+49) HTMLNospaceEscaper-8 1.35µs ± 2% 0.92µs ± 1% -31.74% (p=0.000 n=48+48) HTMLNospaceEscaperNoSpecials-8 278ns ± 2% 263ns ± 2% -5.17% (p=0.000 n=47+49) StripTags-8 778ns ± 2% 786ns ± 1% +0.96% (p=0.000 n=46+47) StripTagsNoSpecials-8 84.2ns ± 1% 84.1ns ± 1% ~ (p=0.300 n=48+48) JSValEscaperWithNum-8 506ns ± 2% 486ns ± 3% -3.82% (p=0.000 n=47+45) JSValEscaperWithStr-8 1.61µs ± 1% 1.64µs ± 1% +1.75% (p=0.000 n=44+49) JSValEscaperWithStrNoSpecials-8 548ns ± 2% 552ns ± 2% +0.78% (p=0.000 n=48+46) JSValEscaperWithObj-8 1.91µs ± 2% 1.87µs ± 1% -2.08% (p=0.000 n=49+47) JSValEscaperWithObjNoSpecials-8 735ns ± 2% 742ns ± 2% +1.01% (p=0.000 n=47+49) JSStrEscaperNoSpecials-8 228ns ± 4% 211ns ± 3% -7.53% (p=0.000 n=50+49) JSStrEscaper-8 1.11µs ± 1% 0.78µs ± 1% -29.94% (p=0.000 n=48+48) JSRegexpEscaperNoSpecials-8 214ns ± 2% 212ns ± 3% -1.12% (p=0.000 n=50+49) JSRegexpEscaper-8 1.17µs ± 0% 0.79µs ± 1% -31.92% (p=0.000 n=48+47) TemplateSpecialTags-8 172µs ± 1% 172µs ± 1% ~ (p=0.976 n=48+47) URLEscaper-8 1.88µs ± 2% 1.87µs ± 2% -0.56% (p=0.001 n=49+49) URLEscaperNoSpecials-8 162ns ± 1% 169ns ± 1% +3.76% (p=0.000 n=49+50) URLNormalizer-8 1.29µs ± 3% 1.29µs ± 2% -0.37% (p=0.041 n=48+48) URLNormalizerNoSpecials-8 185ns ± 1% 186ns ± 1% +0.15% (p=0.013 n=49+49) SrcsetFilter-8 616ns ± 1% 618ns ± 1% +0.36% (p=0.000 n=46+46) SrcsetFilterNoSpecials-8 359ns ± 0% 352ns ± 0% -1.93% (p=0.000 n=40+43) [Geo mean] 560ns 525ns -6.17% name old alloc/op new alloc/op delta CSSEscaper-8 672B ± 0% 336B ± 0% -50.00% (p=0.000 n=50+50) CSSEscaperNoSpecials-8 0.00B 0.00B ~ (all equal) DecodeCSS-8 160B ± 0% 160B ± 0% ~ (all equal) DecodeCSSNoSpecials-8 0.00B 0.00B ~ (all equal) CSSValueFilter-8 96.0B ± 0% 96.0B ± 0% ~ (all equal) CSSValueFilterOk-8 48.0B ± 0% 48.0B ± 0% ~ (all equal) EscapedExecute-8 688B ± 0% 624B ± 0% -9.30% (p=0.000 n=50+50) HTMLNospaceEscaper-8 752B ± 0% 368B ± 0% -51.06% (p=0.000 n=50+50) HTMLNospaceEscaperNoSpecials-8 48.0B ± 0% 32.0B ± 0% -33.33% (p=0.000 n=50+50) StripTags-8 224B ± 0% 224B ± 0% ~ (all equal) StripTagsNoSpecials-8 112B ± 0% 112B ± 0% ~ (all equal) JSValEscaperWithNum-8 96.0B ± 0% 40.0B ± 0% -58.33% (p=0.000 n=50+50) JSValEscaperWithStr-8 384B ± 0% 384B ± 0% ~ (all equal) JSValEscaperWithStrNoSpecials-8 96.0B ± 0% 96.0B ± 0% ~ (all equal) JSValEscaperWithObj-8 448B ± 0% 448B ± 0% ~ (all equal) JSValEscaperWithObjNoSpecials-8 160B ± 0% 160B ± 0% ~ (all equal) JSStrEscaperNoSpecials-8 0.00B 0.00B ~ (all equal) JSStrEscaper-8 672B ± 0% 336B ± 0% -50.00% (p=0.000 n=50+50) JSRegexpEscaperNoSpecials-8 0.00B 0.00B ~ (all equal) JSRegexpEscaper-8 672B ± 0% 336B ± 0% -50.00% (p=0.000 n=50+50) TemplateSpecialTags-8 48.0kB ± 0% 47.9kB ± 0% -0.13% (p=0.000 n=50+48) URLEscaper-8 336B ± 0% 336B ± 0% ~ (all equal) URLEscaperNoSpecials-8 112B ± 0% 112B ± 0% ~ (all equal) URLNormalizer-8 176B ± 0% 176B ± 0% ~ (all equal) URLNormalizerNoSpecials-8 112B ± 0% 112B ± 0% ~ (all equal) SrcsetFilter-8 160B ± 0% 160B ± 0% ~ (all equal) SrcsetFilterNoSpecials-8 160B ± 0% 160B ± 0% ~ (all equal) [Geo mean] 259B 216B -16.60% name old allocs/op new allocs/op delta CSSEscaper-8 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=50+50) CSSEscaperNoSpecials-8 0.00 0.00 ~ (all equal) DecodeCSS-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) DecodeCSSNoSpecials-8 0.00 0.00 ~ (all equal) CSSValueFilter-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) CSSValueFilterOk-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) EscapedExecute-8 18.0 ± 0% 18.0 ± 0% ~ (all equal) HTMLNospaceEscaper-8 5.00 ± 0% 3.00 ± 0% -40.00% (p=0.000 n=50+50) HTMLNospaceEscaperNoSpecials-8 1.00 ± 0% 1.00 ± 0% ~ (all equal) StripTags-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) StripTagsNoSpecials-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) JSValEscaperWithNum-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) JSValEscaperWithStr-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) JSValEscaperWithStrNoSpecials-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) JSValEscaperWithObj-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) JSValEscaperWithObjNoSpecials-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) JSStrEscaperNoSpecials-8 0.00 0.00 ~ (all equal) JSStrEscaper-8 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=50+50) JSRegexpEscaperNoSpecials-8 0.00 0.00 ~ (all equal) JSRegexpEscaper-8 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.000 n=50+50) TemplateSpecialTags-8 185 ± 0% 185 ± 0% ~ (all equal) URLEscaper-8 4.00 ± 0% 4.00 ± 0% ~ (all equal) URLEscaperNoSpecials-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) URLNormalizer-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) URLNormalizerNoSpecials-8 2.00 ± 0% 2.00 ± 0% ~ (all equal) SrcsetFilter-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) SrcsetFilterNoSpecials-8 3.00 ± 0% 3.00 ± 0% ~ (all equal) [Geo mean] 3.41 3.05 -10.65% Change-Id: I809ea56495ce1881656af7e24621448ab64b449a Reviewed-on: https://go-review.googlesource.com/c/155919 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/html/template/css.go | 6 +++++- src/html/template/html.go | 8 +++++++- src/html/template/js.go | 9 ++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/html/template/css.go b/src/html/template/css.go index 1587af8385..eb92fc92b5 100644 --- a/src/html/template/css.go +++ b/src/html/template/css.go @@ -7,6 +7,7 @@ package template import ( "bytes" "fmt" + "strings" "unicode" "unicode/utf8" ) @@ -156,7 +157,7 @@ func isCSSSpace(b byte) bool { // cssEscaper escapes HTML and CSS special characters using \+ escapes. func cssEscaper(args ...interface{}) string { s, _ := stringify(args...) - var b bytes.Buffer + var b strings.Builder r, w, written := rune(0), 0, 0 for i := 0; i < len(s); i += w { // See comment in htmlEscaper. @@ -168,6 +169,9 @@ func cssEscaper(args ...interface{}) string { default: continue } + if written == 0 { + b.Grow(len(s)) + } b.WriteString(s[written:i]) b.WriteString(repl) written = i + w diff --git a/src/html/template/html.go b/src/html/template/html.go index 2ea5a7d4bc..13a0cd0436 100644 --- a/src/html/template/html.go +++ b/src/html/template/html.go @@ -137,7 +137,7 @@ var htmlNospaceNormReplacementTable = []string{ // htmlReplacer returns s with runes replaced according to replacementTable // and when badRunes is true, certain bad runes are allowed through unescaped. func htmlReplacer(s string, replacementTable []string, badRunes bool) string { - written, b := 0, new(bytes.Buffer) + written, b := 0, new(strings.Builder) r, w := rune(0), 0 for i := 0; i < len(s); i += w { // Cannot use 'for range s' because we need to preserve the width @@ -146,6 +146,9 @@ func htmlReplacer(s string, replacementTable []string, badRunes bool) string { r, w = utf8.DecodeRuneInString(s[i:]) if int(r) < len(replacementTable) { if repl := replacementTable[r]; len(repl) != 0 { + if written == 0 { + b.Grow(len(s)) + } b.WriteString(s[written:i]) b.WriteString(repl) written = i + w @@ -154,6 +157,9 @@ func htmlReplacer(s string, replacementTable []string, badRunes bool) string { // No-op. // IE does not allow these ranges in unquoted attrs. } else if 0xfdd0 <= r && r <= 0xfdef || 0xfff0 <= r && r <= 0xffff { + if written == 0 { + b.Grow(len(s)) + } fmt.Fprintf(b, "%s&#x%x;", s[written:i], r) written = i + w } diff --git a/src/html/template/js.go b/src/html/template/js.go index 872f6786b3..04c7c325db 100644 --- a/src/html/template/js.go +++ b/src/html/template/js.go @@ -187,7 +187,7 @@ func jsValEscaper(args ...interface{}) string { } first, _ := utf8.DecodeRune(b) last, _ := utf8.DecodeLastRune(b) - var buf bytes.Buffer + var buf strings.Builder // Prevent IdentifierNames and NumericLiterals from running into // keywords: in, instanceof, typeof, void pad := isJSIdentPart(first) || isJSIdentPart(last) @@ -217,7 +217,7 @@ func jsValEscaper(args ...interface{}) string { if pad { buf.WriteByte(' ') } - b = buf.Bytes() + return buf.String() } return string(b) } @@ -253,7 +253,7 @@ func jsRegexpEscaper(args ...interface{}) string { // It also replaces runes U+2028 and U+2029 with the raw strings `\u2028` and // `\u2029`. func replace(s string, replacementTable []string) string { - var b bytes.Buffer + var b strings.Builder r, w, written := rune(0), 0, 0 for i := 0; i < len(s); i += w { // See comment in htmlEscaper. @@ -269,6 +269,9 @@ func replace(s string, replacementTable []string) string { default: continue } + if written == 0 { + b.Grow(len(s)) + } b.WriteString(s[written:i]) b.WriteString(repl) written = i + w -- GitLab From 5cf4e442a5dc1f4a1d6f3fd04b1083bc192e648e Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Fri, 25 Jan 2019 18:56:22 +1100 Subject: [PATCH 0111/1679] runtime: fix syscall.NewCallback to return all bits for uintptr values syscall.NewCallback mistakenly used MOVL even for windows/amd64, which only returned the lower 32 bits regardless of the architecture. This was due to a copy and paste after porting from windows/386. The code now uses MOVQ, which will return all the available bits. Also adjust TestReturnAfterStackGrowInCallback to ensure we never regress. Fixes #29331 Change-Id: I4f5c8021c33f234c2bb7baa9ef7a6b4870172509 Reviewed-on: https://go-review.googlesource.com/c/159579 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke Reviewed-by: Keith Randall --- src/runtime/sys_windows_amd64.s | 2 +- src/runtime/syscall_windows_test.go | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/runtime/sys_windows_amd64.s b/src/runtime/sys_windows_amd64.s index 612f0a474d..43a26497ad 100644 --- a/src/runtime/sys_windows_amd64.s +++ b/src/runtime/sys_windows_amd64.s @@ -351,7 +351,7 @@ TEXT runtime·callbackasm1(SB),NOSPLIT,$0 ADDQ $64, SP POPFQ - MOVL -8(CX)(DX*1), AX // return value + MOVQ -8(CX)(DX*1), AX // return value POPQ -8(CX)(DX*1) // restore bytes just after the args RET diff --git a/src/runtime/syscall_windows_test.go b/src/runtime/syscall_windows_test.go index 3ad6512976..5335c12f0f 100644 --- a/src/runtime/syscall_windows_test.go +++ b/src/runtime/syscall_windows_test.go @@ -655,12 +655,16 @@ uintptr_t cfunc(callback f, uintptr_t n) { r uintptr err syscall.Errno } + want := result{ + // Make it large enough to test issue #29331. + r: (^uintptr(0)) >> 24, + err: 333, + } c := make(chan result) go func() { - r, _, err := proc.Call(cb, 100) + r, _, err := proc.Call(cb, want.r) c <- result{r, err.(syscall.Errno)} }() - want := result{r: 100, err: 333} if got := <-c; got != want { t.Errorf("got %d want %d", got, want) } -- GitLab From 57976fe2b4cbd44d27e27af510494de0d182e703 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 15 Jan 2019 15:00:43 -0800 Subject: [PATCH 0112/1679] cmd/compile: update comment about x86 nop instruction generator The comment about losing the high bits is incorrect. We now use these nops in places where they really need to be a nop. (Before inline marks, we used them just before deferreturn calls, so they could clobber any caller-saved values.) Change-Id: I433d1ec455aa37dab8fef6eb7d407f3737dbb97f Reviewed-on: https://go-review.googlesource.com/c/158057 Reviewed-by: Ilya Tocar --- src/cmd/compile/internal/amd64/ggen.go | 9 ++++++--- src/cmd/compile/internal/x86/ggen.go | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ggen.go b/src/cmd/compile/internal/amd64/ggen.go index ee4f872bd8..bd2c6720d3 100644 --- a/src/cmd/compile/internal/amd64/ggen.go +++ b/src/cmd/compile/internal/amd64/ggen.go @@ -142,9 +142,12 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) { } func ginsnop(pp *gc.Progs) *obj.Prog { - // This is actually not the x86 NOP anymore, - // but at the point where it gets used, AX is dead - // so it's okay if we lose the high bits. + // This is a hardware nop (1-byte 0x90) instruction, + // even though we describe it as an explicit XCHGL here. + // Particularly, this does not zero the high 32 bits + // like typical *L opcodes. + // (gas assembles "xchg %eax,%eax" to 0x87 0xc0, which + // does zero the high 32 bits.) p := pp.Prog(x86.AXCHGL) p.From.Type = obj.TYPE_REG p.From.Reg = x86.REG_AX diff --git a/src/cmd/compile/internal/x86/ggen.go b/src/cmd/compile/internal/x86/ggen.go index 1851af57c4..86bb782aab 100644 --- a/src/cmd/compile/internal/x86/ggen.go +++ b/src/cmd/compile/internal/x86/ggen.go @@ -54,6 +54,7 @@ func zeroAuto(pp *gc.Progs, n *gc.Node) { } func ginsnop(pp *gc.Progs) *obj.Prog { + // See comment in ../amd64/ggen.go. p := pp.Prog(x86.AXCHGL) p.From.Type = obj.TYPE_REG p.From.Reg = x86.REG_AX -- GitLab From 933e34ac995cf7b2a1d044dc530bfafbf697758d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 25 Feb 2019 14:51:58 -0800 Subject: [PATCH 0113/1679] cmd/compile: treat slice pointers as non-nil var a []int = ... p := &a[0] _ = *p We don't need to nil check on the 3rd line. If the bounds check on the 2nd line passes, we know p is non-nil. We rely on the fact that any cap>0 slice has a non-nil pointer as its pointer to the backing array. This is true for all safely-constructed slices, and I don't see any reason why someone would violate this rule using unsafe. R=go1.13 Fixes #30366 Change-Id: I3ed764fcb72cfe1fbf963d8c1a82e24e3b6dead7 Reviewed-on: https://go-review.googlesource.com/c/163740 Run-TryBot: Keith Randall Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/ssa/nilcheck.go | 4 +++- test/codegen/slices.go | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/nilcheck.go b/src/cmd/compile/internal/ssa/nilcheck.go index 5f58e2d7ec..5369a51023 100644 --- a/src/cmd/compile/internal/ssa/nilcheck.go +++ b/src/cmd/compile/internal/ssa/nilcheck.go @@ -49,7 +49,9 @@ func nilcheckelim(f *Func) { // value, or a value constructed from an offset of a // non-nil ptr (OpAddPtr) implies it is non-nil // We also assume unsafe pointer arithmetic generates non-nil pointers. See #27180. - if v.Op == OpAddr || v.Op == OpLocalAddr || v.Op == OpAddPtr || v.Op == OpOffPtr || v.Op == OpAdd32 || v.Op == OpAdd64 || v.Op == OpSub32 || v.Op == OpSub64 { + // We assume that SlicePtr is non-nil because we do a bounds check + // before the slice access (and all cap>0 slices have a non-nil ptr). See #30366. + if v.Op == OpAddr || v.Op == OpLocalAddr || v.Op == OpAddPtr || v.Op == OpOffPtr || v.Op == OpAdd32 || v.Op == OpAdd64 || v.Op == OpSub32 || v.Op == OpSub64 || v.Op == OpSlicePtr { nonNilValues[v.ID] = true } } diff --git a/test/codegen/slices.go b/test/codegen/slices.go index 15dbcee737..6477c6f6c7 100644 --- a/test/codegen/slices.go +++ b/test/codegen/slices.go @@ -61,3 +61,13 @@ func SliceExtensionInt64(s []int, l64 int64) []int { // 386:-`.*runtime\.memclr` return append(s, make([]int, l64)...) } + +// ---------------------- // +// Nil check of &s[0] // +// ---------------------- // +// See issue 30366 +func SliceNilCheck(s []int) { + p := &s[0] + // amd64:-`TESTB` + _ = *p +} -- GitLab From f495f549acb3505792902151d6306f177fb65207 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 22 Jan 2019 10:08:10 -0800 Subject: [PATCH 0114/1679] cmd/compile: don't bother compiling functions named "_" They can't be used, so we don't need code generated for them. We just need to report errors in their bodies. The compiler currently has a bunch of special cases sprinkled about for "_" functions, because we never generate a linker symbol for them. Instead, abort compilation earlier so we never reach any of that special-case code. Fixes #29870 Change-Id: I3530c9c353deabcf75ce9072c0b740e992349ee5 Reviewed-on: https://go-review.googlesource.com/c/158845 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/gsubr.go | 5 ---- src/cmd/compile/internal/gc/pgen.go | 20 ++++++------- src/cmd/compile/internal/gc/plive.go | 42 ++++++++++++++-------------- src/cmd/compile/internal/gc/ssa.go | 5 +--- 4 files changed, 31 insertions(+), 41 deletions(-) diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index 5ad7b9a1b6..6e9f80a89d 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -176,11 +176,6 @@ func (pp *Progs) settext(fn *Node) { ptxt := pp.Prog(obj.ATEXT) pp.Text = ptxt - if fn.Func.lsym == nil { - // func _() { } - return - } - fn.Func.lsym.Func.Text = ptxt ptxt.From.Type = obj.TYPE_MEM ptxt.From.Name = obj.NAME_EXTERN diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 1dc4b53427..6914e3c5f8 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -258,17 +258,15 @@ func compile(fn *Node) { // be types of stack objects. We need to do this here // because symbols must be allocated before the parallel // phase of the compiler. - if fn.Func.lsym != nil { // not func _(){} - for _, n := range fn.Func.Dcl { - switch n.Class() { - case PPARAM, PPARAMOUT, PAUTO: - if livenessShouldTrack(n) && n.Addrtaken() { - dtypesym(n.Type) - // Also make sure we allocate a linker symbol - // for the stack object data, for the same reason. - if fn.Func.lsym.Func.StackObjects == nil { - fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym() - } + for _, n := range fn.Func.Dcl { + switch n.Class() { + case PPARAM, PPARAMOUT, PAUTO: + if livenessShouldTrack(n) && n.Addrtaken() { + dtypesym(n.Type) + // Also make sure we allocate a linker symbol + // for the stack object data, for the same reason. + if fn.Func.lsym.Func.StackObjects == nil { + fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym() } } } diff --git a/src/cmd/compile/internal/gc/plive.go b/src/cmd/compile/internal/gc/plive.go index b48a9ea87e..a9a01e5c12 100644 --- a/src/cmd/compile/internal/gc/plive.go +++ b/src/cmd/compile/internal/gc/plive.go @@ -1426,26 +1426,26 @@ func liveness(e *ssafn, f *ssa.Func, pp *Progs) LivenessMap { } // Emit the live pointer map data structures - if ls := e.curfn.Func.lsym; ls != nil { - ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit() - - p := pp.Prog(obj.AFUNCDATA) - Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps) - p.To.Type = obj.TYPE_MEM - p.To.Name = obj.NAME_EXTERN - p.To.Sym = ls.Func.GCArgs - - p = pp.Prog(obj.AFUNCDATA) - Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps) - p.To.Type = obj.TYPE_MEM - p.To.Name = obj.NAME_EXTERN - p.To.Sym = ls.Func.GCLocals - - p = pp.Prog(obj.AFUNCDATA) - Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps) - p.To.Type = obj.TYPE_MEM - p.To.Name = obj.NAME_EXTERN - p.To.Sym = ls.Func.GCRegs - } + ls := e.curfn.Func.lsym + ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit() + + p := pp.Prog(obj.AFUNCDATA) + Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = ls.Func.GCArgs + + p = pp.Prog(obj.AFUNCDATA) + Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = ls.Func.GCLocals + + p = pp.Prog(obj.AFUNCDATA) + Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = ls.Func.GCRegs + return lv.livenessMap } diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 9d56c562d0..c8befa40cd 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5175,10 +5175,7 @@ func genssa(f *ssa.Func, pp *Progs) { } case ssa.OpInlMark: p := thearch.Ginsnop(s.pp) - if pp.curfn.Func.lsym != nil { - // lsym is nil if the function name is "_". - pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32()) - } + pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32()) // TODO: if matching line number, merge somehow with previous instruction? default: -- GitLab From 8d057f3a0a1b972f01c1872214c05b58909f50f3 Mon Sep 17 00:00:00 2001 From: Tooru Takahashi Date: Fri, 11 Jan 2019 14:08:37 +0000 Subject: [PATCH 0115/1679] cmd/internal/src: fix typo in pos.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I31ac8845e72c3027c9a463b1f691f4d2b7913ec0 GitHub-Last-Rev: a6b185cc41d649141e6034b77bcfe53525498ea6 GitHub-Pull-Request: golang/go#29682 Reviewed-on: https://go-review.googlesource.com/c/157518 Reviewed-by: Brad Fitzpatrick Run-TryBot: Daniel Martí --- src/cmd/internal/src/pos.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go index 110a57b98d..5063b133f3 100644 --- a/src/cmd/internal/src/pos.go +++ b/src/cmd/internal/src/pos.go @@ -343,7 +343,7 @@ const ( // positions. // PosDefaultStmt uint = iota // Default; position is not a statement boundary, but might be if optimization removes the designated statement boundary - PosIsStmt // Position is a statement bounday; if optimization removes the corresponding instruction, it should attempt to find a new instruction to be the boundary. + PosIsStmt // Position is a statement boundary; if optimization removes the corresponding instruction, it should attempt to find a new instruction to be the boundary. PosNotStmt // Position should not be a statement boundary, but line should be preserved for profiling and low-level debugging purposes. ) -- GitLab From 38a4b37905cd7df3a97fa6dbf070f570c4bf135b Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 18 Dec 2018 15:59:47 +0100 Subject: [PATCH 0116/1679] syscall: add empty line before marker comments in zsyscall_darwin_*.go This was spotted during the review of the corresponding CL 154179 for x/sys/unix. Let's change it in syscall as well to be consistent. Change-Id: I33f25db1f6ba941b694c2aa276336448cc2b9b51 Reviewed-on: https://go-review.googlesource.com/c/154719 Run-TryBot: Tobias Klauser Reviewed-by: Brad Fitzpatrick --- src/syscall/mksyscall.pl | 2 +- src/syscall/zsyscall_darwin_386.go | 118 ++++++++++++++++++++++++++ src/syscall/zsyscall_darwin_amd64.go | 118 ++++++++++++++++++++++++++ src/syscall/zsyscall_darwin_arm.go | 119 +++++++++++++++++++++++++++ src/syscall/zsyscall_darwin_arm64.go | 119 +++++++++++++++++++++++++++ 5 files changed, 475 insertions(+), 1 deletion(-) diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index 079b08dcb9..667ca54c02 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -350,7 +350,7 @@ while(<>) { $text .= "//go:linkname $funcname $funcname\n"; # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix. my $basename = substr $funcname, 5; - $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n"; + $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n\n"; } } } diff --git a/src/syscall/zsyscall_darwin_386.go b/src/syscall/zsyscall_darwin_386.go index 758ff7b129..7f783eb40d 100644 --- a/src/syscall/zsyscall_darwin_386.go +++ b/src/syscall/zsyscall_darwin_386.go @@ -22,6 +22,7 @@ func libc_getgroups_trampoline() //go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { @@ -36,6 +37,7 @@ func libc_setgroups_trampoline() //go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { @@ -51,6 +53,7 @@ func libc_wait4_trampoline() //go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { @@ -66,6 +69,7 @@ func libc_accept_trampoline() //go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -80,6 +84,7 @@ func libc_bind_trampoline() //go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -94,6 +99,7 @@ func libc_connect_trampoline() //go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { @@ -109,6 +115,7 @@ func libc_socket_trampoline() //go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { @@ -123,6 +130,7 @@ func libc_getsockopt_trampoline() //go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { @@ -137,6 +145,7 @@ func libc_setsockopt_trampoline() //go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -151,6 +160,7 @@ func libc_getpeername_trampoline() //go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -165,6 +175,7 @@ func libc_getsockname_trampoline() //go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { @@ -179,6 +190,7 @@ func libc_shutdown_trampoline() //go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { @@ -193,6 +205,7 @@ func libc_socketpair_trampoline() //go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -214,6 +227,7 @@ func libc_recvfrom_trampoline() //go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -234,6 +248,7 @@ func libc_sendto_trampoline() //go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -249,6 +264,7 @@ func libc_recvmsg_trampoline() //go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -264,6 +280,7 @@ func libc_sendmsg_trampoline() //go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { @@ -279,6 +296,7 @@ func libc_kevent_trampoline() //go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -298,6 +316,7 @@ func libc_utimes_trampoline() //go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { @@ -312,6 +331,7 @@ func libc_futimes_trampoline() //go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { @@ -327,6 +347,7 @@ func libc_fcntl_trampoline() //go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { @@ -341,6 +362,7 @@ func libc_ptrace_trampoline() //go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]int32) (err error) { @@ -355,6 +377,7 @@ func libc_pipe_trampoline() //go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { @@ -369,6 +392,7 @@ func libc_kill_trampoline() //go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -388,6 +412,7 @@ func libc_access_trampoline() //go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { @@ -402,6 +427,7 @@ func libc_adjtime_trampoline() //go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -421,6 +447,7 @@ func libc_chdir_trampoline() //go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -440,6 +467,7 @@ func libc_chflags_trampoline() //go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -459,6 +487,7 @@ func libc_chmod_trampoline() //go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -478,6 +507,7 @@ func libc_chown_trampoline() //go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -497,6 +527,7 @@ func libc_chroot_trampoline() //go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { @@ -511,6 +542,7 @@ func libc_close_trampoline() //go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { @@ -526,6 +558,7 @@ func libc_dup_trampoline() //go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { @@ -540,6 +573,7 @@ func libc_dup2_trampoline() //go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { @@ -564,6 +598,7 @@ func libc_exchangedata_trampoline() //go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { @@ -578,6 +613,7 @@ func libc_fchdir_trampoline() //go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { @@ -592,6 +628,7 @@ func libc_fchflags_trampoline() //go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { @@ -606,6 +643,7 @@ func libc_fchmod_trampoline() //go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { @@ -620,6 +658,7 @@ func libc_fchown_trampoline() //go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { @@ -634,6 +673,7 @@ func libc_flock_trampoline() //go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { @@ -649,6 +689,7 @@ func libc_fpathconf_trampoline() //go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { @@ -663,6 +704,7 @@ func libc_fsync_trampoline() //go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { @@ -677,6 +719,7 @@ func libc_ftruncate_trampoline() //go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { @@ -689,6 +732,7 @@ func libc_getdtablesize_trampoline() //go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { @@ -701,6 +745,7 @@ func libc_getegid_trampoline() //go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { @@ -713,6 +758,7 @@ func libc_geteuid_trampoline() //go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { @@ -725,6 +771,7 @@ func libc_getgid_trampoline() //go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { @@ -740,6 +787,7 @@ func libc_getpgid_trampoline() //go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { @@ -752,6 +800,7 @@ func libc_getpgrp_trampoline() //go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { @@ -764,6 +813,7 @@ func libc_getpid_trampoline() //go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { @@ -776,6 +826,7 @@ func libc_getppid_trampoline() //go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { @@ -791,6 +842,7 @@ func libc_getpriority_trampoline() //go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { @@ -805,6 +857,7 @@ func libc_getrlimit_trampoline() //go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { @@ -819,6 +872,7 @@ func libc_getrusage_trampoline() //go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { @@ -834,6 +888,7 @@ func libc_getsid_trampoline() //go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { @@ -846,6 +901,7 @@ func libc_getuid_trampoline() //go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { @@ -858,6 +914,7 @@ func libc_issetugid_trampoline() //go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { @@ -873,6 +930,7 @@ func libc_kqueue_trampoline() //go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -892,6 +950,7 @@ func libc_lchown_trampoline() //go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -916,6 +975,7 @@ func libc_link_trampoline() //go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { @@ -930,6 +990,7 @@ func libc_listen_trampoline() //go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -949,6 +1010,7 @@ func libc_mkdir_trampoline() //go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -968,6 +1030,7 @@ func libc_mkfifo_trampoline() //go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -987,6 +1050,7 @@ func libc_mknod_trampoline() //go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -1007,6 +1071,7 @@ func libc_mlock_trampoline() //go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { @@ -1021,6 +1086,7 @@ func libc_mlockall_trampoline() //go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -1041,6 +1107,7 @@ func libc_mprotect_trampoline() //go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -1061,6 +1128,7 @@ func libc_munlock_trampoline() //go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { @@ -1075,6 +1143,7 @@ func libc_munlockall_trampoline() //go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1095,6 +1164,7 @@ func libc_open_trampoline() //go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1115,6 +1185,7 @@ func libc_pathconf_trampoline() //go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1136,6 +1207,7 @@ func libc_pread_trampoline() //go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1157,6 +1229,7 @@ func libc_pwrite_trampoline() //go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1178,6 +1251,7 @@ func libc_read_trampoline() //go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1204,6 +1278,7 @@ func libc_readlink_trampoline() //go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1228,6 +1303,7 @@ func libc_rename_trampoline() //go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1247,6 +1323,7 @@ func libc_revoke_trampoline() //go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1266,6 +1343,7 @@ func libc_rmdir_trampoline() //go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { @@ -1281,6 +1359,7 @@ func libc_lseek_trampoline() //go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { @@ -1295,6 +1374,7 @@ func libc_select_trampoline() //go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { @@ -1309,6 +1389,7 @@ func libc_setegid_trampoline() //go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { @@ -1323,6 +1404,7 @@ func libc_seteuid_trampoline() //go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { @@ -1337,6 +1419,7 @@ func libc_setgid_trampoline() //go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1356,6 +1439,7 @@ func libc_setlogin_trampoline() //go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { @@ -1370,6 +1454,7 @@ func libc_setpgid_trampoline() //go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { @@ -1384,6 +1469,7 @@ func libc_setpriority_trampoline() //go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { @@ -1398,6 +1484,7 @@ func libc_setprivexec_trampoline() //go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { @@ -1412,6 +1499,7 @@ func libc_setregid_trampoline() //go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { @@ -1426,6 +1514,7 @@ func libc_setreuid_trampoline() //go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { @@ -1440,6 +1529,7 @@ func libc_setrlimit_trampoline() //go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { @@ -1455,6 +1545,7 @@ func libc_setsid_trampoline() //go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { @@ -1469,6 +1560,7 @@ func libc_settimeofday_trampoline() //go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { @@ -1483,6 +1575,7 @@ func libc_setuid_trampoline() //go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1507,6 +1600,7 @@ func libc_symlink_trampoline() //go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { @@ -1521,6 +1615,7 @@ func libc_sync_trampoline() //go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1540,6 +1635,7 @@ func libc_truncate_trampoline() //go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { @@ -1552,6 +1648,7 @@ func libc_umask_trampoline() //go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { @@ -1571,6 +1668,7 @@ func libc_undelete_trampoline() //go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1590,6 +1688,7 @@ func libc_unlink_trampoline() //go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1609,6 +1708,7 @@ func libc_unmount_trampoline() //go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1630,6 +1730,7 @@ func libc_write_trampoline() //go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writev(fd int, iovecs []Iovec) (cnt uintptr, err error) { @@ -1651,6 +1752,7 @@ func libc_writev_trampoline() //go:linkname libc_writev libc_writev //go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { @@ -1666,6 +1768,7 @@ func libc_mmap_trampoline() //go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { @@ -1680,6 +1783,7 @@ func libc_munmap_trampoline() //go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fork() (pid int, err error) { @@ -1695,6 +1799,7 @@ func libc_fork_trampoline() //go:linkname libc_fork libc_fork //go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req int, arg int) (err error) { @@ -1709,6 +1814,7 @@ func libc_ioctl_trampoline() //go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { @@ -1733,6 +1839,7 @@ func libc_execve_trampoline() //go:linkname libc_execve libc_execve //go:cgo_import_dynamic libc_execve execve "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exit(res int) (err error) { @@ -1747,6 +1854,7 @@ func libc_exit_trampoline() //go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -1767,6 +1875,7 @@ func libc_sysctl_trampoline() //go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { @@ -1797,6 +1906,7 @@ func libc_unlinkat_trampoline() //go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { @@ -1817,6 +1927,7 @@ func libc_openat_trampoline() //go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { @@ -1831,6 +1942,7 @@ func libc_fstat64_trampoline() //go:linkname libc_fstat64 libc_fstat64 //go:cgo_import_dynamic libc_fstat64 fstat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { @@ -1845,6 +1957,7 @@ func libc_fstatfs64_trampoline() //go:linkname libc_fstatfs64 libc_fstatfs64 //go:cgo_import_dynamic libc_fstatfs64 fstatfs64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { @@ -1866,6 +1979,7 @@ func libc___getdirentries64_trampoline() //go:linkname libc___getdirentries64 libc___getdirentries64 //go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tp *Timeval) (err error) { @@ -1880,6 +1994,7 @@ func libc_gettimeofday_trampoline() //go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -1899,6 +2014,7 @@ func libc_lstat64_trampoline() //go:linkname libc_lstat64 libc_lstat64 //go:cgo_import_dynamic libc_lstat64 lstat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1918,6 +2034,7 @@ func libc_stat64_trampoline() //go:linkname libc_stat64 libc_stat64 //go:cgo_import_dynamic libc_stat64 stat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1937,6 +2054,7 @@ func libc_statfs64_trampoline() //go:linkname libc_statfs64 libc_statfs64 //go:cgo_import_dynamic libc_statfs64 statfs64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { diff --git a/src/syscall/zsyscall_darwin_amd64.go b/src/syscall/zsyscall_darwin_amd64.go index afc3d72d8d..141f071105 100644 --- a/src/syscall/zsyscall_darwin_amd64.go +++ b/src/syscall/zsyscall_darwin_amd64.go @@ -22,6 +22,7 @@ func libc_getgroups_trampoline() //go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { @@ -36,6 +37,7 @@ func libc_setgroups_trampoline() //go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { @@ -51,6 +53,7 @@ func libc_wait4_trampoline() //go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { @@ -66,6 +69,7 @@ func libc_accept_trampoline() //go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -80,6 +84,7 @@ func libc_bind_trampoline() //go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -94,6 +99,7 @@ func libc_connect_trampoline() //go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { @@ -109,6 +115,7 @@ func libc_socket_trampoline() //go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { @@ -123,6 +130,7 @@ func libc_getsockopt_trampoline() //go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { @@ -137,6 +145,7 @@ func libc_setsockopt_trampoline() //go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -151,6 +160,7 @@ func libc_getpeername_trampoline() //go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -165,6 +175,7 @@ func libc_getsockname_trampoline() //go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { @@ -179,6 +190,7 @@ func libc_shutdown_trampoline() //go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { @@ -193,6 +205,7 @@ func libc_socketpair_trampoline() //go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -214,6 +227,7 @@ func libc_recvfrom_trampoline() //go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -234,6 +248,7 @@ func libc_sendto_trampoline() //go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -249,6 +264,7 @@ func libc_recvmsg_trampoline() //go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -264,6 +280,7 @@ func libc_sendmsg_trampoline() //go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { @@ -279,6 +296,7 @@ func libc_kevent_trampoline() //go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -298,6 +316,7 @@ func libc_utimes_trampoline() //go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { @@ -312,6 +331,7 @@ func libc_futimes_trampoline() //go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { @@ -327,6 +347,7 @@ func libc_fcntl_trampoline() //go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { @@ -341,6 +362,7 @@ func libc_ptrace_trampoline() //go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]int32) (err error) { @@ -355,6 +377,7 @@ func libc_pipe_trampoline() //go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { @@ -369,6 +392,7 @@ func libc_kill_trampoline() //go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -388,6 +412,7 @@ func libc_access_trampoline() //go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { @@ -402,6 +427,7 @@ func libc_adjtime_trampoline() //go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -421,6 +447,7 @@ func libc_chdir_trampoline() //go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -440,6 +467,7 @@ func libc_chflags_trampoline() //go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -459,6 +487,7 @@ func libc_chmod_trampoline() //go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -478,6 +507,7 @@ func libc_chown_trampoline() //go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -497,6 +527,7 @@ func libc_chroot_trampoline() //go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { @@ -511,6 +542,7 @@ func libc_close_trampoline() //go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { @@ -526,6 +558,7 @@ func libc_dup_trampoline() //go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { @@ -540,6 +573,7 @@ func libc_dup2_trampoline() //go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { @@ -564,6 +598,7 @@ func libc_exchangedata_trampoline() //go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { @@ -578,6 +613,7 @@ func libc_fchdir_trampoline() //go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { @@ -592,6 +628,7 @@ func libc_fchflags_trampoline() //go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { @@ -606,6 +643,7 @@ func libc_fchmod_trampoline() //go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { @@ -620,6 +658,7 @@ func libc_fchown_trampoline() //go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { @@ -634,6 +673,7 @@ func libc_flock_trampoline() //go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { @@ -649,6 +689,7 @@ func libc_fpathconf_trampoline() //go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { @@ -663,6 +704,7 @@ func libc_fsync_trampoline() //go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { @@ -677,6 +719,7 @@ func libc_ftruncate_trampoline() //go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { @@ -689,6 +732,7 @@ func libc_getdtablesize_trampoline() //go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { @@ -701,6 +745,7 @@ func libc_getegid_trampoline() //go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { @@ -713,6 +758,7 @@ func libc_geteuid_trampoline() //go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { @@ -725,6 +771,7 @@ func libc_getgid_trampoline() //go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { @@ -740,6 +787,7 @@ func libc_getpgid_trampoline() //go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { @@ -752,6 +800,7 @@ func libc_getpgrp_trampoline() //go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { @@ -764,6 +813,7 @@ func libc_getpid_trampoline() //go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { @@ -776,6 +826,7 @@ func libc_getppid_trampoline() //go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { @@ -791,6 +842,7 @@ func libc_getpriority_trampoline() //go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { @@ -805,6 +857,7 @@ func libc_getrlimit_trampoline() //go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { @@ -819,6 +872,7 @@ func libc_getrusage_trampoline() //go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { @@ -834,6 +888,7 @@ func libc_getsid_trampoline() //go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { @@ -846,6 +901,7 @@ func libc_getuid_trampoline() //go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { @@ -858,6 +914,7 @@ func libc_issetugid_trampoline() //go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { @@ -873,6 +930,7 @@ func libc_kqueue_trampoline() //go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -892,6 +950,7 @@ func libc_lchown_trampoline() //go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -916,6 +975,7 @@ func libc_link_trampoline() //go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { @@ -930,6 +990,7 @@ func libc_listen_trampoline() //go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -949,6 +1010,7 @@ func libc_mkdir_trampoline() //go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -968,6 +1030,7 @@ func libc_mkfifo_trampoline() //go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -987,6 +1050,7 @@ func libc_mknod_trampoline() //go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -1007,6 +1071,7 @@ func libc_mlock_trampoline() //go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { @@ -1021,6 +1086,7 @@ func libc_mlockall_trampoline() //go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -1041,6 +1107,7 @@ func libc_mprotect_trampoline() //go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -1061,6 +1128,7 @@ func libc_munlock_trampoline() //go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { @@ -1075,6 +1143,7 @@ func libc_munlockall_trampoline() //go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1095,6 +1164,7 @@ func libc_open_trampoline() //go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1115,6 +1185,7 @@ func libc_pathconf_trampoline() //go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1136,6 +1207,7 @@ func libc_pread_trampoline() //go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1157,6 +1229,7 @@ func libc_pwrite_trampoline() //go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1178,6 +1251,7 @@ func libc_read_trampoline() //go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1204,6 +1278,7 @@ func libc_readlink_trampoline() //go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1228,6 +1303,7 @@ func libc_rename_trampoline() //go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1247,6 +1323,7 @@ func libc_revoke_trampoline() //go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1266,6 +1343,7 @@ func libc_rmdir_trampoline() //go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { @@ -1281,6 +1359,7 @@ func libc_lseek_trampoline() //go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { @@ -1295,6 +1374,7 @@ func libc_select_trampoline() //go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { @@ -1309,6 +1389,7 @@ func libc_setegid_trampoline() //go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { @@ -1323,6 +1404,7 @@ func libc_seteuid_trampoline() //go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { @@ -1337,6 +1419,7 @@ func libc_setgid_trampoline() //go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1356,6 +1439,7 @@ func libc_setlogin_trampoline() //go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { @@ -1370,6 +1454,7 @@ func libc_setpgid_trampoline() //go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { @@ -1384,6 +1469,7 @@ func libc_setpriority_trampoline() //go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { @@ -1398,6 +1484,7 @@ func libc_setprivexec_trampoline() //go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { @@ -1412,6 +1499,7 @@ func libc_setregid_trampoline() //go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { @@ -1426,6 +1514,7 @@ func libc_setreuid_trampoline() //go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { @@ -1440,6 +1529,7 @@ func libc_setrlimit_trampoline() //go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { @@ -1455,6 +1545,7 @@ func libc_setsid_trampoline() //go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { @@ -1469,6 +1560,7 @@ func libc_settimeofday_trampoline() //go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { @@ -1483,6 +1575,7 @@ func libc_setuid_trampoline() //go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1507,6 +1600,7 @@ func libc_symlink_trampoline() //go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { @@ -1521,6 +1615,7 @@ func libc_sync_trampoline() //go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1540,6 +1635,7 @@ func libc_truncate_trampoline() //go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { @@ -1552,6 +1648,7 @@ func libc_umask_trampoline() //go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { @@ -1571,6 +1668,7 @@ func libc_undelete_trampoline() //go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1590,6 +1688,7 @@ func libc_unlink_trampoline() //go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1609,6 +1708,7 @@ func libc_unmount_trampoline() //go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1630,6 +1730,7 @@ func libc_write_trampoline() //go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writev(fd int, iovecs []Iovec) (cnt uintptr, err error) { @@ -1651,6 +1752,7 @@ func libc_writev_trampoline() //go:linkname libc_writev libc_writev //go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { @@ -1666,6 +1768,7 @@ func libc_mmap_trampoline() //go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { @@ -1680,6 +1783,7 @@ func libc_munmap_trampoline() //go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fork() (pid int, err error) { @@ -1695,6 +1799,7 @@ func libc_fork_trampoline() //go:linkname libc_fork libc_fork //go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req int, arg int) (err error) { @@ -1709,6 +1814,7 @@ func libc_ioctl_trampoline() //go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { @@ -1733,6 +1839,7 @@ func libc_execve_trampoline() //go:linkname libc_execve libc_execve //go:cgo_import_dynamic libc_execve execve "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exit(res int) (err error) { @@ -1747,6 +1854,7 @@ func libc_exit_trampoline() //go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -1767,6 +1875,7 @@ func libc_sysctl_trampoline() //go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { @@ -1797,6 +1906,7 @@ func libc_unlinkat_trampoline() //go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { @@ -1817,6 +1927,7 @@ func libc_openat_trampoline() //go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { @@ -1831,6 +1942,7 @@ func libc_fstat64_trampoline() //go:linkname libc_fstat64 libc_fstat64 //go:cgo_import_dynamic libc_fstat64 fstat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { @@ -1845,6 +1957,7 @@ func libc_fstatfs64_trampoline() //go:linkname libc_fstatfs64 libc_fstatfs64 //go:cgo_import_dynamic libc_fstatfs64 fstatfs64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { @@ -1866,6 +1979,7 @@ func libc___getdirentries64_trampoline() //go:linkname libc___getdirentries64 libc___getdirentries64 //go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tp *Timeval) (err error) { @@ -1880,6 +1994,7 @@ func libc_gettimeofday_trampoline() //go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -1899,6 +2014,7 @@ func libc_lstat64_trampoline() //go:linkname libc_lstat64 libc_lstat64 //go:cgo_import_dynamic libc_lstat64 lstat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1918,6 +2034,7 @@ func libc_stat64_trampoline() //go:linkname libc_stat64 libc_stat64 //go:cgo_import_dynamic libc_stat64 stat64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1937,6 +2054,7 @@ func libc_statfs64_trampoline() //go:linkname libc_statfs64 libc_statfs64 //go:cgo_import_dynamic libc_statfs64 statfs64 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { diff --git a/src/syscall/zsyscall_darwin_arm.go b/src/syscall/zsyscall_darwin_arm.go index 80ef9e514f..9bfaac6ef7 100644 --- a/src/syscall/zsyscall_darwin_arm.go +++ b/src/syscall/zsyscall_darwin_arm.go @@ -22,6 +22,7 @@ func libc_getgroups_trampoline() //go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { @@ -36,6 +37,7 @@ func libc_setgroups_trampoline() //go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { @@ -51,6 +53,7 @@ func libc_wait4_trampoline() //go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { @@ -66,6 +69,7 @@ func libc_accept_trampoline() //go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -80,6 +84,7 @@ func libc_bind_trampoline() //go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -94,6 +99,7 @@ func libc_connect_trampoline() //go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { @@ -109,6 +115,7 @@ func libc_socket_trampoline() //go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { @@ -123,6 +130,7 @@ func libc_getsockopt_trampoline() //go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { @@ -137,6 +145,7 @@ func libc_setsockopt_trampoline() //go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -151,6 +160,7 @@ func libc_getpeername_trampoline() //go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -165,6 +175,7 @@ func libc_getsockname_trampoline() //go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { @@ -179,6 +190,7 @@ func libc_shutdown_trampoline() //go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { @@ -193,6 +205,7 @@ func libc_socketpair_trampoline() //go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -214,6 +227,7 @@ func libc_recvfrom_trampoline() //go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -234,6 +248,7 @@ func libc_sendto_trampoline() //go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -249,6 +264,7 @@ func libc_recvmsg_trampoline() //go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -264,6 +280,7 @@ func libc_sendmsg_trampoline() //go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { @@ -279,6 +296,7 @@ func libc_kevent_trampoline() //go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -298,6 +316,7 @@ func libc_utimes_trampoline() //go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { @@ -312,6 +331,7 @@ func libc_futimes_trampoline() //go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { @@ -327,6 +347,7 @@ func libc_fcntl_trampoline() //go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { @@ -341,6 +362,7 @@ func libc_ptrace_trampoline() //go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]int32) (err error) { @@ -355,6 +377,7 @@ func libc_pipe_trampoline() //go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { @@ -369,6 +392,7 @@ func libc_kill_trampoline() //go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -388,6 +412,7 @@ func libc_access_trampoline() //go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { @@ -402,6 +427,7 @@ func libc_adjtime_trampoline() //go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -421,6 +447,7 @@ func libc_chdir_trampoline() //go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -440,6 +467,7 @@ func libc_chflags_trampoline() //go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -459,6 +487,7 @@ func libc_chmod_trampoline() //go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -478,6 +507,7 @@ func libc_chown_trampoline() //go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -497,6 +527,7 @@ func libc_chroot_trampoline() //go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { @@ -511,6 +542,7 @@ func libc_close_trampoline() //go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { @@ -526,6 +558,7 @@ func libc_dup_trampoline() //go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { @@ -540,6 +573,7 @@ func libc_dup2_trampoline() //go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { @@ -564,6 +598,7 @@ func libc_exchangedata_trampoline() //go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { @@ -578,6 +613,7 @@ func libc_fchdir_trampoline() //go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { @@ -592,6 +628,7 @@ func libc_fchflags_trampoline() //go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { @@ -606,6 +643,7 @@ func libc_fchmod_trampoline() //go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { @@ -620,6 +658,7 @@ func libc_fchown_trampoline() //go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { @@ -634,6 +673,7 @@ func libc_flock_trampoline() //go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { @@ -649,6 +689,7 @@ func libc_fpathconf_trampoline() //go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { @@ -663,6 +704,7 @@ func libc_fsync_trampoline() //go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { @@ -677,6 +719,7 @@ func libc_ftruncate_trampoline() //go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { @@ -689,6 +732,7 @@ func libc_getdtablesize_trampoline() //go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { @@ -701,6 +745,7 @@ func libc_getegid_trampoline() //go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { @@ -713,6 +758,7 @@ func libc_geteuid_trampoline() //go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { @@ -725,6 +771,7 @@ func libc_getgid_trampoline() //go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { @@ -740,6 +787,7 @@ func libc_getpgid_trampoline() //go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { @@ -752,6 +800,7 @@ func libc_getpgrp_trampoline() //go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { @@ -764,6 +813,7 @@ func libc_getpid_trampoline() //go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { @@ -776,6 +826,7 @@ func libc_getppid_trampoline() //go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { @@ -791,6 +842,7 @@ func libc_getpriority_trampoline() //go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { @@ -805,6 +857,7 @@ func libc_getrlimit_trampoline() //go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { @@ -819,6 +872,7 @@ func libc_getrusage_trampoline() //go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { @@ -834,6 +888,7 @@ func libc_getsid_trampoline() //go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { @@ -846,6 +901,7 @@ func libc_getuid_trampoline() //go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { @@ -858,6 +914,7 @@ func libc_issetugid_trampoline() //go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { @@ -873,6 +930,7 @@ func libc_kqueue_trampoline() //go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -892,6 +950,7 @@ func libc_lchown_trampoline() //go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -916,6 +975,7 @@ func libc_link_trampoline() //go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { @@ -930,6 +990,7 @@ func libc_listen_trampoline() //go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -949,6 +1010,7 @@ func libc_mkdir_trampoline() //go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -968,6 +1030,7 @@ func libc_mkfifo_trampoline() //go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -987,6 +1050,7 @@ func libc_mknod_trampoline() //go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -1007,6 +1071,7 @@ func libc_mlock_trampoline() //go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { @@ -1021,6 +1086,7 @@ func libc_mlockall_trampoline() //go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -1041,6 +1107,7 @@ func libc_mprotect_trampoline() //go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -1061,6 +1128,7 @@ func libc_munlock_trampoline() //go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { @@ -1075,6 +1143,7 @@ func libc_munlockall_trampoline() //go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1095,6 +1164,7 @@ func libc_open_trampoline() //go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1115,6 +1185,7 @@ func libc_pathconf_trampoline() //go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1136,6 +1207,7 @@ func libc_pread_trampoline() //go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1157,6 +1229,7 @@ func libc_pwrite_trampoline() //go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1178,6 +1251,7 @@ func libc_read_trampoline() //go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1204,6 +1278,7 @@ func libc_readlink_trampoline() //go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1228,6 +1303,7 @@ func libc_rename_trampoline() //go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1247,6 +1323,7 @@ func libc_revoke_trampoline() //go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1266,6 +1343,7 @@ func libc_rmdir_trampoline() //go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { @@ -1281,6 +1359,7 @@ func libc_lseek_trampoline() //go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { @@ -1295,6 +1374,7 @@ func libc_select_trampoline() //go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { @@ -1309,6 +1389,7 @@ func libc_setegid_trampoline() //go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { @@ -1323,6 +1404,7 @@ func libc_seteuid_trampoline() //go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { @@ -1337,6 +1419,7 @@ func libc_setgid_trampoline() //go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1356,6 +1439,7 @@ func libc_setlogin_trampoline() //go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { @@ -1370,6 +1454,7 @@ func libc_setpgid_trampoline() //go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { @@ -1384,6 +1469,7 @@ func libc_setpriority_trampoline() //go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { @@ -1398,6 +1484,7 @@ func libc_setprivexec_trampoline() //go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { @@ -1412,6 +1499,7 @@ func libc_setregid_trampoline() //go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { @@ -1426,6 +1514,7 @@ func libc_setreuid_trampoline() //go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { @@ -1440,6 +1529,7 @@ func libc_setrlimit_trampoline() //go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { @@ -1455,6 +1545,7 @@ func libc_setsid_trampoline() //go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { @@ -1469,6 +1560,7 @@ func libc_settimeofday_trampoline() //go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { @@ -1483,6 +1575,7 @@ func libc_setuid_trampoline() //go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1507,6 +1600,7 @@ func libc_symlink_trampoline() //go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { @@ -1521,6 +1615,7 @@ func libc_sync_trampoline() //go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1540,6 +1635,7 @@ func libc_truncate_trampoline() //go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { @@ -1552,6 +1648,7 @@ func libc_umask_trampoline() //go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { @@ -1571,6 +1668,7 @@ func libc_undelete_trampoline() //go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1590,6 +1688,7 @@ func libc_unlink_trampoline() //go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1609,6 +1708,7 @@ func libc_unmount_trampoline() //go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1630,6 +1730,7 @@ func libc_write_trampoline() //go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writev(fd int, iovecs []Iovec) (cnt uintptr, err error) { @@ -1651,6 +1752,7 @@ func libc_writev_trampoline() //go:linkname libc_writev libc_writev //go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { @@ -1666,6 +1768,7 @@ func libc_mmap_trampoline() //go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { @@ -1680,6 +1783,7 @@ func libc_munmap_trampoline() //go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fork() (pid int, err error) { @@ -1695,6 +1799,7 @@ func libc_fork_trampoline() //go:linkname libc_fork libc_fork //go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req int, arg int) (err error) { @@ -1709,6 +1814,7 @@ func libc_ioctl_trampoline() //go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { @@ -1733,6 +1839,7 @@ func libc_execve_trampoline() //go:linkname libc_execve libc_execve //go:cgo_import_dynamic libc_execve execve "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exit(res int) (err error) { @@ -1747,6 +1854,7 @@ func libc_exit_trampoline() //go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -1767,6 +1875,7 @@ func libc_sysctl_trampoline() //go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { @@ -1797,6 +1906,7 @@ func libc_unlinkat_trampoline() //go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { @@ -1817,6 +1927,7 @@ func libc_openat_trampoline() //go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func closedir(dir uintptr) (err error) { @@ -1831,6 +1942,7 @@ func libc_closedir_trampoline() //go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { @@ -1845,6 +1957,7 @@ func libc_fstat_trampoline() //go:linkname libc_fstat libc_fstat //go:cgo_import_dynamic libc_fstat fstat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { @@ -1859,6 +1972,7 @@ func libc_fstatfs_trampoline() //go:linkname libc_fstatfs libc_fstatfs //go:cgo_import_dynamic libc_fstatfs fstatfs "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tp *Timeval) (err error) { @@ -1873,6 +1987,7 @@ func libc_gettimeofday_trampoline() //go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -1892,6 +2007,7 @@ func libc_lstat_trampoline() //go:linkname libc_lstat libc_lstat //go:cgo_import_dynamic libc_lstat lstat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readdir_r(dir uintptr, entry uintptr, result uintptr) (res int) { @@ -1904,6 +2020,7 @@ func libc_readdir_r_trampoline() //go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1923,6 +2040,7 @@ func libc_stat_trampoline() //go:linkname libc_stat libc_stat //go:cgo_import_dynamic libc_stat stat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1942,6 +2060,7 @@ func libc_statfs_trampoline() //go:linkname libc_statfs libc_statfs //go:cgo_import_dynamic libc_statfs statfs "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { diff --git a/src/syscall/zsyscall_darwin_arm64.go b/src/syscall/zsyscall_darwin_arm64.go index a917176a31..cdb3630ebd 100644 --- a/src/syscall/zsyscall_darwin_arm64.go +++ b/src/syscall/zsyscall_darwin_arm64.go @@ -22,6 +22,7 @@ func libc_getgroups_trampoline() //go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setgroups(ngid int, gid *_Gid_t) (err error) { @@ -36,6 +37,7 @@ func libc_setgroups_trampoline() //go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { @@ -51,6 +53,7 @@ func libc_wait4_trampoline() //go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { @@ -66,6 +69,7 @@ func libc_accept_trampoline() //go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -80,6 +84,7 @@ func libc_bind_trampoline() //go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { @@ -94,6 +99,7 @@ func libc_connect_trampoline() //go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socket(domain int, typ int, proto int) (fd int, err error) { @@ -109,6 +115,7 @@ func libc_socket_trampoline() //go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { @@ -123,6 +130,7 @@ func libc_getsockopt_trampoline() //go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { @@ -137,6 +145,7 @@ func libc_setsockopt_trampoline() //go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -151,6 +160,7 @@ func libc_getpeername_trampoline() //go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { @@ -165,6 +175,7 @@ func libc_getsockname_trampoline() //go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Shutdown(s int, how int) (err error) { @@ -179,6 +190,7 @@ func libc_shutdown_trampoline() //go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { @@ -193,6 +205,7 @@ func libc_socketpair_trampoline() //go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { @@ -214,6 +227,7 @@ func libc_recvfrom_trampoline() //go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { @@ -234,6 +248,7 @@ func libc_sendto_trampoline() //go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -249,6 +264,7 @@ func libc_recvmsg_trampoline() //go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { @@ -264,6 +280,7 @@ func libc_sendmsg_trampoline() //go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { @@ -279,6 +296,7 @@ func libc_kevent_trampoline() //go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func utimes(path string, timeval *[2]Timeval) (err error) { @@ -298,6 +316,7 @@ func libc_utimes_trampoline() //go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func futimes(fd int, timeval *[2]Timeval) (err error) { @@ -312,6 +331,7 @@ func libc_futimes_trampoline() //go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntl(fd int, cmd int, arg int) (val int, err error) { @@ -327,6 +347,7 @@ func libc_fcntl_trampoline() //go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { @@ -341,6 +362,7 @@ func libc_ptrace_trampoline() //go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func pipe(p *[2]int32) (err error) { @@ -355,6 +377,7 @@ func libc_pipe_trampoline() //go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func kill(pid int, signum int, posix int) (err error) { @@ -369,6 +392,7 @@ func libc_kill_trampoline() //go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Access(path string, mode uint32) (err error) { @@ -388,6 +412,7 @@ func libc_access_trampoline() //go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { @@ -402,6 +427,7 @@ func libc_adjtime_trampoline() //go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chdir(path string) (err error) { @@ -421,6 +447,7 @@ func libc_chdir_trampoline() //go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chflags(path string, flags int) (err error) { @@ -440,6 +467,7 @@ func libc_chflags_trampoline() //go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chmod(path string, mode uint32) (err error) { @@ -459,6 +487,7 @@ func libc_chmod_trampoline() //go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chown(path string, uid int, gid int) (err error) { @@ -478,6 +507,7 @@ func libc_chown_trampoline() //go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Chroot(path string) (err error) { @@ -497,6 +527,7 @@ func libc_chroot_trampoline() //go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Close(fd int) (err error) { @@ -511,6 +542,7 @@ func libc_close_trampoline() //go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup(fd int) (nfd int, err error) { @@ -526,6 +558,7 @@ func libc_dup_trampoline() //go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Dup2(from int, to int) (err error) { @@ -540,6 +573,7 @@ func libc_dup2_trampoline() //go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Exchangedata(path1 string, path2 string, options int) (err error) { @@ -564,6 +598,7 @@ func libc_exchangedata_trampoline() //go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchdir(fd int) (err error) { @@ -578,6 +613,7 @@ func libc_fchdir_trampoline() //go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchflags(fd int, flags int) (err error) { @@ -592,6 +628,7 @@ func libc_fchflags_trampoline() //go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchmod(fd int, mode uint32) (err error) { @@ -606,6 +643,7 @@ func libc_fchmod_trampoline() //go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fchown(fd int, uid int, gid int) (err error) { @@ -620,6 +658,7 @@ func libc_fchown_trampoline() //go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Flock(fd int, how int) (err error) { @@ -634,6 +673,7 @@ func libc_flock_trampoline() //go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fpathconf(fd int, name int) (val int, err error) { @@ -649,6 +689,7 @@ func libc_fpathconf_trampoline() //go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fsync(fd int) (err error) { @@ -663,6 +704,7 @@ func libc_fsync_trampoline() //go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Ftruncate(fd int, length int64) (err error) { @@ -677,6 +719,7 @@ func libc_ftruncate_trampoline() //go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getdtablesize() (size int) { @@ -689,6 +732,7 @@ func libc_getdtablesize_trampoline() //go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getegid() (egid int) { @@ -701,6 +745,7 @@ func libc_getegid_trampoline() //go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Geteuid() (uid int) { @@ -713,6 +758,7 @@ func libc_geteuid_trampoline() //go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getgid() (gid int) { @@ -725,6 +771,7 @@ func libc_getgid_trampoline() //go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgid(pid int) (pgid int, err error) { @@ -740,6 +787,7 @@ func libc_getpgid_trampoline() //go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpgrp() (pgrp int) { @@ -752,6 +800,7 @@ func libc_getpgrp_trampoline() //go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpid() (pid int) { @@ -764,6 +813,7 @@ func libc_getpid_trampoline() //go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getppid() (ppid int) { @@ -776,6 +826,7 @@ func libc_getppid_trampoline() //go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getpriority(which int, who int) (prio int, err error) { @@ -791,6 +842,7 @@ func libc_getpriority_trampoline() //go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrlimit(which int, lim *Rlimit) (err error) { @@ -805,6 +857,7 @@ func libc_getrlimit_trampoline() //go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getrusage(who int, rusage *Rusage) (err error) { @@ -819,6 +872,7 @@ func libc_getrusage_trampoline() //go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getsid(pid int) (sid int, err error) { @@ -834,6 +888,7 @@ func libc_getsid_trampoline() //go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Getuid() (uid int) { @@ -846,6 +901,7 @@ func libc_getuid_trampoline() //go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Issetugid() (tainted bool) { @@ -858,6 +914,7 @@ func libc_issetugid_trampoline() //go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Kqueue() (fd int, err error) { @@ -873,6 +930,7 @@ func libc_kqueue_trampoline() //go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lchown(path string, uid int, gid int) (err error) { @@ -892,6 +950,7 @@ func libc_lchown_trampoline() //go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Link(path string, link string) (err error) { @@ -916,6 +975,7 @@ func libc_link_trampoline() //go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Listen(s int, backlog int) (err error) { @@ -930,6 +990,7 @@ func libc_listen_trampoline() //go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkdir(path string, mode uint32) (err error) { @@ -949,6 +1010,7 @@ func libc_mkdir_trampoline() //go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mkfifo(path string, mode uint32) (err error) { @@ -968,6 +1030,7 @@ func libc_mkfifo_trampoline() //go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mknod(path string, mode uint32, dev int) (err error) { @@ -987,6 +1050,7 @@ func libc_mknod_trampoline() //go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlock(b []byte) (err error) { @@ -1007,6 +1071,7 @@ func libc_mlock_trampoline() //go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mlockall(flags int) (err error) { @@ -1021,6 +1086,7 @@ func libc_mlockall_trampoline() //go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Mprotect(b []byte, prot int) (err error) { @@ -1041,6 +1107,7 @@ func libc_mprotect_trampoline() //go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlock(b []byte) (err error) { @@ -1061,6 +1128,7 @@ func libc_munlock_trampoline() //go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Munlockall() (err error) { @@ -1075,6 +1143,7 @@ func libc_munlockall_trampoline() //go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Open(path string, mode int, perm uint32) (fd int, err error) { @@ -1095,6 +1164,7 @@ func libc_open_trampoline() //go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pathconf(path string, name int) (val int, err error) { @@ -1115,6 +1185,7 @@ func libc_pathconf_trampoline() //go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pread(fd int, p []byte, offset int64) (n int, err error) { @@ -1136,6 +1207,7 @@ func libc_pread_trampoline() //go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Pwrite(fd int, p []byte, offset int64) (n int, err error) { @@ -1157,6 +1229,7 @@ func libc_pwrite_trampoline() //go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func read(fd int, p []byte) (n int, err error) { @@ -1178,6 +1251,7 @@ func libc_read_trampoline() //go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Readlink(path string, buf []byte) (n int, err error) { @@ -1204,6 +1278,7 @@ func libc_readlink_trampoline() //go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rename(from string, to string) (err error) { @@ -1228,6 +1303,7 @@ func libc_rename_trampoline() //go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Revoke(path string) (err error) { @@ -1247,6 +1323,7 @@ func libc_revoke_trampoline() //go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Rmdir(path string) (err error) { @@ -1266,6 +1343,7 @@ func libc_rmdir_trampoline() //go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { @@ -1281,6 +1359,7 @@ func libc_lseek_trampoline() //go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { @@ -1295,6 +1374,7 @@ func libc_select_trampoline() //go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setegid(egid int) (err error) { @@ -1309,6 +1389,7 @@ func libc_setegid_trampoline() //go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Seteuid(euid int) (err error) { @@ -1323,6 +1404,7 @@ func libc_seteuid_trampoline() //go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setgid(gid int) (err error) { @@ -1337,6 +1419,7 @@ func libc_setgid_trampoline() //go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setlogin(name string) (err error) { @@ -1356,6 +1439,7 @@ func libc_setlogin_trampoline() //go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpgid(pid int, pgid int) (err error) { @@ -1370,6 +1454,7 @@ func libc_setpgid_trampoline() //go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setpriority(which int, who int, prio int) (err error) { @@ -1384,6 +1469,7 @@ func libc_setpriority_trampoline() //go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setprivexec(flag int) (err error) { @@ -1398,6 +1484,7 @@ func libc_setprivexec_trampoline() //go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setregid(rgid int, egid int) (err error) { @@ -1412,6 +1499,7 @@ func libc_setregid_trampoline() //go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setreuid(ruid int, euid int) (err error) { @@ -1426,6 +1514,7 @@ func libc_setreuid_trampoline() //go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setrlimit(which int, lim *Rlimit) (err error) { @@ -1440,6 +1529,7 @@ func libc_setrlimit_trampoline() //go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setsid() (pid int, err error) { @@ -1455,6 +1545,7 @@ func libc_setsid_trampoline() //go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Settimeofday(tp *Timeval) (err error) { @@ -1469,6 +1560,7 @@ func libc_settimeofday_trampoline() //go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Setuid(uid int) (err error) { @@ -1483,6 +1575,7 @@ func libc_setuid_trampoline() //go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Symlink(path string, link string) (err error) { @@ -1507,6 +1600,7 @@ func libc_symlink_trampoline() //go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Sync() (err error) { @@ -1521,6 +1615,7 @@ func libc_sync_trampoline() //go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Truncate(path string, length int64) (err error) { @@ -1540,6 +1635,7 @@ func libc_truncate_trampoline() //go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Umask(newmask int) (oldmask int) { @@ -1552,6 +1648,7 @@ func libc_umask_trampoline() //go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Undelete(path string) (err error) { @@ -1571,6 +1668,7 @@ func libc_undelete_trampoline() //go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unlink(path string) (err error) { @@ -1590,6 +1688,7 @@ func libc_unlink_trampoline() //go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Unmount(path string, flags int) (err error) { @@ -1609,6 +1708,7 @@ func libc_unmount_trampoline() //go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func write(fd int, p []byte) (n int, err error) { @@ -1630,6 +1730,7 @@ func libc_write_trampoline() //go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func writev(fd int, iovecs []Iovec) (cnt uintptr, err error) { @@ -1651,6 +1752,7 @@ func libc_writev_trampoline() //go:linkname libc_writev libc_writev //go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { @@ -1666,6 +1768,7 @@ func libc_mmap_trampoline() //go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func munmap(addr uintptr, length uintptr) (err error) { @@ -1680,6 +1783,7 @@ func libc_munmap_trampoline() //go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fork() (pid int, err error) { @@ -1695,6 +1799,7 @@ func libc_fork_trampoline() //go:linkname libc_fork libc_fork //go:cgo_import_dynamic libc_fork fork "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctl(fd int, req int, arg int) (err error) { @@ -1709,6 +1814,7 @@ func libc_ioctl_trampoline() //go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { @@ -1733,6 +1839,7 @@ func libc_execve_trampoline() //go:linkname libc_execve libc_execve //go:cgo_import_dynamic libc_execve execve "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func exit(res int) (err error) { @@ -1747,6 +1854,7 @@ func libc_exit_trampoline() //go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { @@ -1767,6 +1875,7 @@ func libc_sysctl_trampoline() //go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (val int, err error) { @@ -1797,6 +1906,7 @@ func libc_unlinkat_trampoline() //go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func openat(fd int, path string, flags int, perm uint32) (fdret int, err error) { @@ -1817,6 +1927,7 @@ func libc_openat_trampoline() //go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func closedir(dir uintptr) (err error) { @@ -1831,6 +1942,7 @@ func libc_closedir_trampoline() //go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstat(fd int, stat *Stat_t) (err error) { @@ -1845,6 +1957,7 @@ func libc_fstat_trampoline() //go:linkname libc_fstat libc_fstat //go:cgo_import_dynamic libc_fstat fstat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Fstatfs(fd int, stat *Statfs_t) (err error) { @@ -1859,6 +1972,7 @@ func libc_fstatfs_trampoline() //go:linkname libc_fstatfs libc_fstatfs //go:cgo_import_dynamic libc_fstatfs fstatfs "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Gettimeofday(tp *Timeval) (err error) { @@ -1873,6 +1987,7 @@ func libc_gettimeofday_trampoline() //go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Lstat(path string, stat *Stat_t) (err error) { @@ -1892,6 +2007,7 @@ func libc_lstat_trampoline() //go:linkname libc_lstat libc_lstat //go:cgo_import_dynamic libc_lstat lstat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func readdir_r(dirp uintptr, entry uintptr, result uintptr) (res int) { @@ -1904,6 +2020,7 @@ func libc_readdir_r_trampoline() //go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Stat(path string, stat *Stat_t) (err error) { @@ -1923,6 +2040,7 @@ func libc_stat_trampoline() //go:linkname libc_stat libc_stat //go:cgo_import_dynamic libc_stat stat "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func Statfs(path string, stat *Statfs_t) (err error) { @@ -1942,6 +2060,7 @@ func libc_statfs_trampoline() //go:linkname libc_statfs libc_statfs //go:cgo_import_dynamic libc_statfs statfs "/usr/lib/libSystem.B.dylib" + // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { -- GitLab From 5a7e8f466e9becdb7277ac725b5540d6bd8e3727 Mon Sep 17 00:00:00 2001 From: Yasser Abdolmaleki Date: Sun, 10 Feb 2019 17:55:27 -0800 Subject: [PATCH 0117/1679] crypto/tls: fix typo Change-Id: If9332bae87449c94fc14710133614fcd84d2815c Reviewed-on: https://go-review.googlesource.com/c/161726 Reviewed-by: Filippo Valsorda --- src/crypto/tls/handshake_client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go index 7441e5b556..62479d840c 100644 --- a/src/crypto/tls/handshake_client_test.go +++ b/src/crypto/tls/handshake_client_test.go @@ -28,7 +28,7 @@ import ( func init() { // TLS 1.3 cipher suites preferences are not configurable and change based - // on the architecture. Force them to the version with AES accelleration for + // on the architecture. Force them to the version with AES acceleration for // test consistency. once.Do(initDefaultCipherSuites) varDefaultCipherSuitesTLS13 = []uint16{ -- GitLab From ea65d015b838f2ca75debacacbbb039fe5e96b26 Mon Sep 17 00:00:00 2001 From: Ggicci Date: Mon, 11 Feb 2019 18:00:02 +0800 Subject: [PATCH 0118/1679] net/http: clean the path of the stripped URL by StripPrefix The path of the new stripped URL should also be cleaned. Since an empty path may cause unexpected errors in some HTTP handlers, e.g. http.ServeFile. Fixes #30165 Change-Id: Ib44fdce6388b5d62ffbcab5266925ef8f13f26e2 Reviewed-on: https://go-review.googlesource.com/c/161738 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/serve_test.go | 9 +++++++++ src/net/http/server.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 6eb0088a96..86cdb34ebb 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -2900,6 +2900,15 @@ func TestStripPrefix(t *testing.T) { t.Errorf("test 2: got status %v, want %v", g, e) } res.Body.Close() + + res, err = c.Get(ts.URL + "/foo") + if err != nil { + t.Fatal(err) + } + if g, e := res.Header.Get("X-Path"), "/"; g != e { + t.Errorf("test 3: got %s, want %s", g, e) + } + res.Body.Close() } // https://golang.org/issue/18952. diff --git a/src/net/http/server.go b/src/net/http/server.go index aa9c3f5d2e..e68ec2f01e 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2030,7 +2030,7 @@ func StripPrefix(prefix string, h Handler) Handler { *r2 = *r r2.URL = new(url.URL) *r2.URL = *r.URL - r2.URL.Path = p + r2.URL.Path = cleanPath(p) h.ServeHTTP(w, r2) } else { NotFound(w, r) -- GitLab From c55eeeb718b0dfd008f0d722c8b8d05f8b02d62b Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 8 Feb 2019 09:25:05 +0100 Subject: [PATCH 0119/1679] runtime: use hw.ncpuonline sysctl in getncpu on openbsd The number of CPUs reported by the hw.ncpu sysctl is twice as high as the actual number of CPUs running on OpenBSD 6.4. with hyperthreading disabled (hw.smt=0). Try hw.cpuonline first and fall back to hw.ncpu in case it fails (which is the case on older OpenBSD before 6.4). Fixes #30127 Change-Id: Id091234b8038cc9f7c40519d039fc1a05437c40d Reviewed-on: https://go-review.googlesource.com/c/161757 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Matthew Dempsky --- src/runtime/os_openbsd.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 96112cb25b..353a5d94ba 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -84,9 +84,10 @@ const ( _CTL_KERN = 1 _KERN_OSREV = 3 - _CTL_HW = 6 - _HW_NCPU = 3 - _HW_PAGESIZE = 7 + _CTL_HW = 6 + _HW_NCPU = 3 + _HW_PAGESIZE = 7 + _HW_NCPUONLINE = 25 ) func sysctlInt(mib []uint32) (int32, bool) { @@ -100,9 +101,14 @@ func sysctlInt(mib []uint32) (int32, bool) { } func getncpu() int32 { - // Fetch hw.ncpu via sysctl. - if ncpu, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok { - return int32(ncpu) + // Try hw.ncpuonline first because hw.ncpu would report a number twice as + // high as the actual CPUs running on OpenBSD 6.4 with hyperthreading + // disabled (hw.smt=0). See https://golang.org/issue/30127 + if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPUONLINE}); ok { + return int32(n) + } + if n, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok { + return int32(n) } return 1 } -- GitLab From ef954a03eb9d4e8d19e1024db088095110e19a0b Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 8 Feb 2019 17:57:46 +0100 Subject: [PATCH 0120/1679] bytes: hoist error creation out of function generating frame information in errors will cause this function to no longer be inlined. Updates #29934. Change-Id: I1d7bc11707f1872d7315f627bfb9a12afa41e358 Reviewed-on: https://go-review.googlesource.com/c/161760 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox Reviewed-by: Brad Fitzpatrick --- src/bytes/buffer.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bytes/buffer.go b/src/bytes/buffer.go index aff2db5084..190c468162 100644 --- a/src/bytes/buffer.go +++ b/src/bytes/buffer.go @@ -385,13 +385,15 @@ func (b *Buffer) UnreadRune() error { return nil } +var errUnreadByte = errors.New("bytes.Buffer: UnreadByte: previous operation was not a successful read") + // UnreadByte unreads the last byte returned by the most recent successful // read operation that read at least one byte. If a write has happened since // the last read, if the last read returned an error, or if the read read zero // bytes, UnreadByte returns an error. func (b *Buffer) UnreadByte() error { if b.lastRead == opInvalid { - return errors.New("bytes.Buffer: UnreadByte: previous operation was not a successful read") + return errUnreadByte } b.lastRead = opInvalid if b.off > 0 { -- GitLab From 2cdebb5174bba43fc1c76198c79f6be982c5c63a Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sat, 3 Nov 2018 17:23:30 -0400 Subject: [PATCH 0121/1679] cmd/link: delete stale deadcode reference Back when the linker did code generation after dead code elimination, it had to know that references to runtime.read_tls_fallback could be generated at code generation time (and never appear before that). Now that code generation is done by the compiler, the references to runtime.read_tls_fallback are obvious in the relocations, so the linker no longer needs special knowledge of this symbol. Change-Id: I9813a8478e85a6a13470b2d0528db53fd33fcfdf Reviewed-on: https://go-review.googlesource.com/c/154601 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/ld/deadcode.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 8f582174c5..627ce05d7a 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -209,11 +209,6 @@ func (d *deadcodepass) markMethod(m methodref) { func (d *deadcodepass) init() { var names []string - if d.ctxt.Arch.Family == sys.ARM { - // mark some functions that are only referenced after linker code editing - names = append(names, "runtime.read_tls_fallback") - } - if d.ctxt.BuildMode == BuildModeShared { // Mark all symbols defined in this library as reachable when // building a shared library. -- GitLab From 08831b150c60b96045a614f3d35abf631ddd4b4a Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Tue, 16 Oct 2018 16:11:59 +0200 Subject: [PATCH 0122/1679] cmd/compile: avoid collisions between statictmps and user vars Avoid name collisions between autogenerated statictmp variables and user defined global variables. Fixes #25113 Change-Id: I023eb42a5c2bd2f5352b046d33363faed87084dc Reviewed-on: https://go-review.googlesource.com/c/142497 Reviewed-by: Josh Bleecher Snyder Reviewed-by: Emmanuel Odeke Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/sinit.go | 2 +- src/cmd/compile/internal/ssa/writebarrier.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index de0298b746..efdaf1c3c5 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -568,7 +568,7 @@ var statuniqgen int // name generator for static temps // returned node for readonly nodes. func staticname(t *types.Type) *Node { // Don't use lookupN; it interns the resulting string, but these are all unique. - n := newname(lookup(fmt.Sprintf("statictmp_%d", statuniqgen))) + n := newname(lookup(fmt.Sprintf(".stmp_%d", statuniqgen))) statuniqgen++ addvar(n, t, PEXTERN) return n diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index 1024ab25ab..1f40927951 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -439,7 +439,7 @@ func IsSanitizerSafeAddr(v *Value) bool { // test sym.Type==objabi.SRODATA, but we don't // initialize sym.Type until after function // compilation. - if strings.HasPrefix(sym.Name, `"".statictmp_`) { + if strings.HasPrefix(sym.Name, `""..stmp_`) { return true } } -- GitLab From 337662f7caef76abd0122edffdc1f7f8102f19f8 Mon Sep 17 00:00:00 2001 From: Derek Phan Date: Sun, 13 Jan 2019 06:07:33 +0000 Subject: [PATCH 0123/1679] io: align style of test comments in multi_test.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic93a084311de46461ed3b30f4ac2fe11311e74d7 GitHub-Last-Rev: 32fbd63b10d0fa489406333ff6f8b6708974a73c GitHub-Pull-Request: golang/go#29705 Reviewed-on: https://go-review.googlesource.com/c/157642 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Matt Layher --- src/io/multi_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/io/multi_test.go b/src/io/multi_test.go index 9cbab4d211..d34794a367 100644 --- a/src/io/multi_test.go +++ b/src/io/multi_test.go @@ -77,7 +77,7 @@ func TestMultiWriter_String(t *testing.T) { testMultiWriter(t, new(bytes.Buffer)) } -// test that a multiWriter.WriteString calls results in at most 1 allocation, +// Test that a multiWriter.WriteString calls results in at most 1 allocation, // even if multiple targets don't support WriteString. func TestMultiWriter_WriteStringSingleAlloc(t *testing.T) { var sink1, sink2 bytes.Buffer @@ -149,7 +149,7 @@ func (f writerFunc) Write(p []byte) (int, error) { return f(p) } -// Test that MultiWriter properly flattens chained multiWriters, +// Test that MultiWriter properly flattens chained multiWriters. func TestMultiWriterSingleChainFlatten(t *testing.T) { pc := make([]uintptr, 1000) // 1000 should fit the full stack n := runtime.Callers(0, pc) -- GitLab From d090429ea9af7cc2958fd95460196b02212c2b62 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Fri, 22 Feb 2019 15:53:52 +0000 Subject: [PATCH 0124/1679] all: fix typos as reported by 'misspell' Change-Id: I904b8655f21743189814bccf24073b6fbb9fc56d GitHub-Last-Rev: b032c14394c949f9ad7b18d019a3979d38d4e1fb GitHub-Pull-Request: golang/go#29997 Reviewed-on: https://go-review.googlesource.com/c/160421 Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/inl_test.go | 4 ++-- src/cmd/compile/internal/ssa/html.go | 2 +- src/cmd/trace/annotations.go | 8 ++++---- src/cmd/trace/goroutines.go | 8 ++++---- src/internal/xcoff/file.go | 4 ++-- src/os/os_windows_test.go | 2 +- src/runtime/mem_bsd.go | 2 +- src/runtime/mgcstack.go | 2 +- src/runtime/symtab.go | 2 +- src/syscall/syscall_aix.go | 2 +- src/testing/testing.go | 2 +- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index 58d13f2dcf..c29c1755f3 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -26,7 +26,7 @@ func TestIntendedInlining(t *testing.T) { t.Parallel() // want is the list of function names (by package) that should - // be inlinable. If they have no callers in thier packages, they + // be inlinable. If they have no callers in their packages, they // might not actually be inlined anywhere. want := map[string][]string{ "runtime": { @@ -218,7 +218,7 @@ func TestIntendedInlining(t *testing.T) { if m := canInline.FindStringSubmatch(line); m != nil { fname := m[1] fullname := curPkg + "." + fname - // If function must be inlined somewhere, beeing inlinable is not enough + // If function must be inlined somewhere, being inlinable is not enough if _, ok := must[fullname]; !ok { delete(notInlinedReason, fullname) continue diff --git a/src/cmd/compile/internal/ssa/html.go b/src/cmd/compile/internal/ssa/html.go index 1202987acc..a1b718096d 100644 --- a/src/cmd/compile/internal/ssa/html.go +++ b/src/cmd/compile/internal/ssa/html.go @@ -1080,7 +1080,7 @@ type dotWriter struct { } // newDotWriter returns non-nil value when mask is valid. -// dotWriter will generate SVGs only for the phases specifed in the mask. +// dotWriter will generate SVGs only for the phases specified in the mask. // mask can contain following patterns and combinations of them: // * - all of them; // x-y - x through y, inclusive; diff --git a/src/cmd/trace/annotations.go b/src/cmd/trace/annotations.go index 2498415681..d991588a72 100644 --- a/src/cmd/trace/annotations.go +++ b/src/cmd/trace/annotations.go @@ -1159,17 +1159,17 @@ var templUserRegionType = template.Must(template.New("").Funcs(template.FuncMap{ d := time.Duration(nsec) * time.Nanosecond return template.HTML(niceDuration(d)) }, - "percent": func(dividened, divisor int64) template.HTML { + "percent": func(dividend, divisor int64) template.HTML { if divisor == 0 { return "" } - return template.HTML(fmt.Sprintf("(%.1f%%)", float64(dividened)/float64(divisor)*100)) + return template.HTML(fmt.Sprintf("(%.1f%%)", float64(dividend)/float64(divisor)*100)) }, - "barLen": func(dividened, divisor int64) template.HTML { + "barLen": func(dividend, divisor int64) template.HTML { if divisor == 0 { return "0" } - return template.HTML(fmt.Sprintf("%.2f%%", float64(dividened)/float64(divisor)*100)) + return template.HTML(fmt.Sprintf("%.2f%%", float64(dividend)/float64(divisor)*100)) }, "unknownTime": func(desc regionDesc) int64 { sum := desc.ExecTime + desc.IOTime + desc.BlockTime + desc.SyscallTime + desc.SchedWaitTime diff --git a/src/cmd/trace/goroutines.go b/src/cmd/trace/goroutines.go index 548871a82c..100891d64e 100644 --- a/src/cmd/trace/goroutines.go +++ b/src/cmd/trace/goroutines.go @@ -166,17 +166,17 @@ var templGoroutine = template.Must(template.New("").Funcs(template.FuncMap{ d := time.Duration(nsec) * time.Nanosecond return template.HTML(niceDuration(d)) }, - "percent": func(dividened, divisor int64) template.HTML { + "percent": func(dividend, divisor int64) template.HTML { if divisor == 0 { return "" } - return template.HTML(fmt.Sprintf("(%.1f%%)", float64(dividened)/float64(divisor)*100)) + return template.HTML(fmt.Sprintf("(%.1f%%)", float64(dividend)/float64(divisor)*100)) }, - "barLen": func(dividened, divisor int64) template.HTML { + "barLen": func(dividend, divisor int64) template.HTML { if divisor == 0 { return "0" } - return template.HTML(fmt.Sprintf("%.2f%%", float64(dividened)/float64(divisor)*100)) + return template.HTML(fmt.Sprintf("%.2f%%", float64(dividend)/float64(divisor)*100)) }, "unknownTime": func(desc *trace.GDesc) int64 { sum := desc.ExecTime + desc.IOTime + desc.BlockTime + desc.SyscallTime + desc.SchedWaitTime diff --git a/src/internal/xcoff/file.go b/src/internal/xcoff/file.go index 0923b9fcf3..66b5391d58 100644 --- a/src/internal/xcoff/file.go +++ b/src/internal/xcoff/file.go @@ -334,8 +334,8 @@ func NewFile(r io.ReaderAt) (*File, error) { // If this symbol is a function, it must retrieve its size from // its AUX_FCN entry. - // It can happend that a function symbol doesn't have any AUX_FCN. - // In this case, needAuxFcn is false and their size will be set to 0 + // It can happen that a function symbol doesn't have any AUX_FCN. + // In this case, needAuxFcn is false and their size will be set to 0. if needAuxFcn { switch f.TargetMachine { case U802TOCMAGIC: diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go index 285e1eb35e..dc9e629b01 100644 --- a/src/os/os_windows_test.go +++ b/src/os/os_windows_test.go @@ -1013,7 +1013,7 @@ func TestStatOfInvalidName(t *testing.T) { // It returns path to the found drive root directory (like Z:\) or error. func findUnusedDriveLetter() (string, error) { // Do not use A: and B:, because they are reserved for floppy drive. - // Do not use C:, becasue it is normally used for main drive. + // Do not use C:, because it is normally used for main drive. for l := 'Z'; l >= 'D'; l-- { p := string(l) + `:\` _, err := os.Stat(p) diff --git a/src/runtime/mem_bsd.go b/src/runtime/mem_bsd.go index 84238d7279..796bb44223 100644 --- a/src/runtime/mem_bsd.go +++ b/src/runtime/mem_bsd.go @@ -45,7 +45,7 @@ func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer { flags := int32(_MAP_ANON | _MAP_PRIVATE) if raceenabled && GOOS == "darwin" { // Currently the race detector expects memory to live within a certain - // range, and on Darwin 10.10 mmap is prone to ignoring hints, moreso + // range, and on Darwin 10.10 mmap is prone to ignoring hints, more so // than later versions and other BSDs (#26475). So, even though it's // potentially dangerous to MAP_FIXED, we do it in the race detection // case because it'll help maintain the race detector's invariants. diff --git a/src/runtime/mgcstack.go b/src/runtime/mgcstack.go index 86e60d4381..baeaa4fd55 100644 --- a/src/runtime/mgcstack.go +++ b/src/runtime/mgcstack.go @@ -274,7 +274,7 @@ func (s *stackScanState) addObject(addr uintptr, typ *_type) { obj.off = uint32(addr - s.stack.lo) obj.size = uint32(typ.size) obj.setType(typ) - // obj.left and obj.right will be initalized by buildIndex before use. + // obj.left and obj.right will be initialized by buildIndex before use. s.nobjs++ } diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 17e342ef69..a7538482dc 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -475,7 +475,7 @@ func FuncForPC(pc uintptr) *Func { } if inldata := funcdata(f, _FUNCDATA_InlTree); inldata != nil { // Note: strict=false so bad PCs (those between functions) don't crash the runtime. - // We just report the preceeding function in that situation. See issue 29735. + // We just report the preceding function in that situation. See issue 29735. // TODO: Perhaps we should report no function at all in that case. // The runtime currently doesn't have function end info, alas. if ix := pcdatavalue1(f, _PCDATA_InlTreeIndex, pc, nil, false); ix >= 0 { diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 6512761c33..ea88c666be 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -388,7 +388,7 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) func (sa *RawSockaddrUnix) getLen() (int, error) { // Some versions of AIX have a bug in getsockname (see IV78655). // We can't rely on sa.Len being set correctly. - n := SizeofSockaddrUnix - 3 // substract leading Family, Len, terminating NUL. + n := SizeofSockaddrUnix - 3 // subtract leading Family, Len, terminating NUL. for i := 0; i < n; i++ { if sa.Path[i] == 0 { n = i diff --git a/src/testing/testing.go b/src/testing/testing.go index 3068630e8a..79dcf76908 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -614,7 +614,7 @@ func (c *common) log(s string) { c.logDepth(s, 3) // logDepth + log + public function } -// logDepth generates the output. At an arbitary stack depth +// logDepth generates the output at an arbitrary stack depth. func (c *common) logDepth(s string, depth int) { c.mu.Lock() defer c.mu.Unlock() -- GitLab From b325799cad7a12abb6964b5dd2a6e5b0e913413e Mon Sep 17 00:00:00 2001 From: Jeremy Jay Date: Mon, 18 Feb 2019 03:33:28 +0000 Subject: [PATCH 0125/1679] compress/gzip: clarify that Multistream gzip requires a ByteReader Change-Id: Ib24778f3172c011e6a39ee65dce8764f3cc911ea GitHub-Last-Rev: 9c617c1e60ac48db67e26e64ce240d3845c0e6ac GitHub-Pull-Request: golang/go#30284 Reviewed-on: https://go-review.googlesource.com/c/162999 Reviewed-by: Joe Tsai Run-TryBot: Joe Tsai TryBot-Result: Gobot Gobot --- src/compress/gzip/gunzip.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compress/gzip/gunzip.go b/src/compress/gzip/gunzip.go index 85d52e8500..924bce10b7 100644 --- a/src/compress/gzip/gunzip.go +++ b/src/compress/gzip/gunzip.go @@ -126,8 +126,8 @@ func (z *Reader) Reset(r io.Reader) error { // can be useful when reading file formats that distinguish individual gzip // data streams or mix gzip data streams with other data streams. // In this mode, when the Reader reaches the end of the data stream, -// Read returns io.EOF. If the underlying reader implements io.ByteReader, -// it will be left positioned just after the gzip stream. +// Read returns io.EOF. The underlying reader must implement io.ByteReader +// in order to be left positioned just after the gzip stream. // To start the next stream, call z.Reset(r) followed by z.Multistream(false). // If there is no next stream, z.Reset(r) will return io.EOF. func (z *Reader) Multistream(ok bool) { -- GitLab From c3c90d0132437bf7bdf2bab791161768767cbc3a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 13 Feb 2019 21:45:58 -0800 Subject: [PATCH 0126/1679] test: add test case that caused a gccgo compiler crash Change-Id: Icdc980e0dcb5639c49aba5f4f252f33bd207e4fa Reviewed-on: https://go-review.googlesource.com/c/162617 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Cherry Zhang --- test/fixedbugs/gcc89321.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 test/fixedbugs/gcc89321.go diff --git a/test/fixedbugs/gcc89321.go b/test/fixedbugs/gcc89321.go new file mode 100644 index 0000000000..93ca6b40a5 --- /dev/null +++ b/test/fixedbugs/gcc89321.go @@ -0,0 +1,17 @@ +// compile + +// Copyright 2019 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. + +// https://gcc.gnu.org/PR89321 +// gccgo compiler crash building map literals with a zero-sized value type. + +package p + +type M map[byte]struct{} + +var ( + M1 = M{1: {}, 2: {}, 3: {}} + M2 = M{1: {}, 2: {}} +) -- GitLab From b68624464dc41ffb09b9ee5314d3455904acd2a8 Mon Sep 17 00:00:00 2001 From: Dmitry Mottl Date: Fri, 22 Feb 2019 16:50:54 +0000 Subject: [PATCH 0127/1679] net/http: add godoc for Dir.Open function This commit adds godoc for Dir.Open function. Change-Id: Ibc3b22f38660a082802e1f868c5cf9d880fc2801 GitHub-Last-Rev: 774cfd7d8cc61989179956e47d51451135b6c203 GitHub-Pull-Request: golang/go#30353 Reviewed-on: https://go-review.googlesource.com/c/163437 Reviewed-by: Brad Fitzpatrick --- src/net/http/fs.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/net/http/fs.go b/src/net/http/fs.go index db44d6b029..41d46dced2 100644 --- a/src/net/http/fs.go +++ b/src/net/http/fs.go @@ -63,6 +63,8 @@ func mapDirOpenError(originalErr error, name string) error { return originalErr } +// Open implements FileSystem using os.Open, opening files for reading rooted +// and relative to the directory d. func (d Dir) Open(name string) (File, error) { if filepath.Separator != '/' && strings.ContainsRune(name, filepath.Separator) { return nil, errors.New("http: invalid character in file path") -- GitLab From 3a9037368e28e3c5cf587d8780af6b0b8659f91e Mon Sep 17 00:00:00 2001 From: Bryan Heden Date: Thu, 14 Feb 2019 02:35:00 +0000 Subject: [PATCH 0128/1679] fmt: fix an error in documentation for fmt Original Printf("%d", hi) obviously doesn't produce %!d(string=hi) unless somewhere before this code block you have hi := "hi" somewhere, also this change maintains consistency with the rest of it Change-Id: I40d8cca623176dcad66374ba74e3a1f8f975ac9e GitHub-Last-Rev: 242e9ee6afba7ab22ed2967b0ba01ef18db01ca9 GitHub-Pull-Request: golang/go#30223 Reviewed-on: https://go-review.googlesource.com/c/162541 Reviewed-by: Brad Fitzpatrick --- src/fmt/doc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmt/doc.go b/src/fmt/doc.go index 2cb409b617..a7115809d3 100644 --- a/src/fmt/doc.go +++ b/src/fmt/doc.go @@ -217,7 +217,7 @@ description of the problem, as in these examples: Wrong type or unknown verb: %!verb(type=value) - Printf("%d", hi): %!d(string=hi) + Printf("%d", "hi"): %!d(string=hi) Too many arguments: %!(EXTRA type=value) Printf("hi", "guys"): hi%!(EXTRA string=guys) Too few arguments: %!verb(MISSING) -- GitLab From c1050a8e54e1e1c06aa02ccf2b36c13a95666121 Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Fri, 28 Dec 2018 21:40:04 +0300 Subject: [PATCH 0129/1679] cmd/compile: don't generate newobject call for 0-sized types Emit &runtime.zerobase instead of a call to newobject for allocations of zero sized objects in walk.go. Fixes #29446 Change-Id: I11b67981d55009726a17c2e582c12ce0c258682e Reviewed-on: https://go-review.googlesource.com/c/155840 Run-TryBot: Iskander Sharipov TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/walk.go | 10 +++++++++ test/codegen/alloc.go | 34 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/codegen/alloc.go diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 57bf8a1e0e..1d6321212e 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1940,6 +1940,16 @@ func callnew(t *types.Type) *Node { yyerror("%v is go:notinheap; heap allocation disallowed", t) } dowidth(t) + + if t.Size() == 0 { + // Return &runtime.zerobase if we know that the requested size is 0. + // This is what runtime.mallocgc would return. + z := newname(Runtimepkg.Lookup("zerobase")) + z.SetClass(PEXTERN) + z.Type = t + return typecheck(nod(OADDR, z, nil), ctxExpr) + } + fn := syslook("newobject") fn = substArgTypes(fn, t) v := mkcall1(fn, types.NewPtr(t), nil, typename(t)) diff --git a/test/codegen/alloc.go b/test/codegen/alloc.go new file mode 100644 index 0000000000..31455fdabf --- /dev/null +++ b/test/codegen/alloc.go @@ -0,0 +1,34 @@ +// asmcheck + +// Copyright 2018 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. + +// These tests check that allocating a 0-size object does not +// introduce a call to runtime.newobject. + +package codegen + +func zeroAllocNew1() *struct{} { + // 386:-`CALL\truntime\.newobject` + // amd64:-`CALL\truntime\.newobject` + // arm:-`CALL\truntime\.newobject` + // arm64:-`CALL\truntime\.newobject` + return new(struct{}) +} + +func zeroAllocNew2() *[0]int { + // 386:-`CALL\truntime\.newobject` + // amd64:-`CALL\truntime\.newobject` + // arm:-`CALL\truntime\.newobject` + // arm64:-`CALL\truntime\.newobject` + return new([0]int) +} + +func zeroAllocSliceLit() []int { + // 386:-`CALL\truntime\.newobject` + // amd64:-`CALL\truntime\.newobject` + // arm:-`CALL\truntime\.newobject` + // arm64:-`CALL\truntime\.newobject` + return []int{} +} -- GitLab From 068a832a7e176121a2c0767d55e774f10705c72b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 5 Feb 2019 22:52:03 -0800 Subject: [PATCH 0130/1679] time: read 64-bit data if available Also store 64-bit data in lib/time/zoneinfo.zip. The comments argue that we don't need the 64-bit data until 2037 or 2106, but that turns out not to be the case. We also need them for dates before December 13, 1901, which is time.Unix(-0x80000000, 0). Fixes #30099 Change-Id: Ib8c9efb29b7b3c08531ae69912c588209d6320e9 Reviewed-on: https://go-review.googlesource.com/c/161202 Reviewed-by: Brad Fitzpatrick --- lib/time/update.bash | 13 ------ lib/time/zoneinfo.zip | Bin 365447 -> 788764 bytes src/time/zoneinfo_read.go | 96 +++++++++++++++++++++++++++++++++----- src/time/zoneinfo_test.go | 21 +++++++++ 4 files changed, 105 insertions(+), 25 deletions(-) diff --git a/lib/time/update.bash b/lib/time/update.bash index 8d6785b9af..5dc74f9f0b 100755 --- a/lib/time/update.bash +++ b/lib/time/update.bash @@ -21,21 +21,8 @@ curl -L -O https://www.iana.org/time-zones/repository/releases/tzdata$DATA.tar.g tar xzf tzcode$CODE.tar.gz tar xzf tzdata$DATA.tar.gz -# Turn off 64-bit output in time zone files. -# We don't need those until 2037. -perl -p -i -e 's/pass <= 2/pass <= 1/' zic.c - make CFLAGS=-DSTD_INSPIRED AWK=awk TZDIR=zoneinfo posix_only -# America/Los_Angeles should not be bigger than 1100 bytes. -# If it is, we probably failed to disable the 64-bit output, which -# triples the size of the files. -size=$(ls -l zoneinfo/America/Los_Angeles | awk '{print $5}') -if [ $size -gt 1200 ]; then - echo 'zone file too large; 64-bit edit failed?' >&2 - exit 2 -fi - cd zoneinfo rm -f ../../zoneinfo.zip zip -0 -r ../../zoneinfo.zip * diff --git a/lib/time/zoneinfo.zip b/lib/time/zoneinfo.zip index bacb724322bcdea720f864b69e6edf13b6de7502..a79e5d98fd20788ec4910fbab0d7b801b3a820a0 100644 GIT binary patch literal 788764 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�os4KL3o2> zm>os?55e0NSy?OvK#lA4>CLr$>-sy;y&6c(Tjh#)r4{JF30u!pWmU_U$U zf}~DGg5>!p0qU>bJ~U;ts{ zBU>X=b8_;_v-8M1a0yfgfH26JpaaoCY{`9E5)7a1+DWP-3BnUwgC`xPXPW~1jv;IB{xtmg{<~ky#TZibM6EN z9?DfM`%w0MVfA0H#Nmy@O`} zL09X6!ozBG**iEqMwh)$0rfT*Ks%K{>4KbP@57+@B5pZ5uAXjiNxV~HQAtK>PHJu? z8Ixw9o-GK2A^=pRg4hGx(>))iIuCSO9tb1fb03_XUzA#$R9Re_mqLb5L0i2*806D3 z=mL9z*$qAt!oGP9A|@&aM3sLo5EH&LL7e&Q1o6-NCP+M9KSA>Hf(cTGCr*&wvsXZ7 z%{l?uIr9bNdL{_S*E9+!u|7tQp z|6meqY44Dzx4tZ(o-f_+)Wg){9QJ|YOk|^_3elWHp}8C*zUHPVAtk2!G5;P z1cx-`363q60#0tM6P#0|1zc30PjGeqE8xa@a)P_^eF67(&jdV~4+?mmJ0alpc(H)@ zx>W)`XZBCI!A?&-s zga}bLfr#ru6C%HA2t;lBG9mgZmq5${L4nvUZv^7%KMTZ9IVX@1e^nr{_SJ+W`|SeB zv1cZv$j=l=wOuzMjbrPCblC|L(qBxUkny)@LgtCe30ZeTCS9ev03uxjLk4XF0|o{LMn=dDY7C5w3^-aepwtV(AcNp3 z7}Qb$rDBjEC?$hvP-+IzpcDT0z5Cv-2=+4AU-I^f@n~#1<|0K z3!*`}7es?{Fo*`_Vh|0=$sih(n?W=vM}ufkt_IPdoDHHuxf?`-ayWnobB@BoLl`h&EmkUnPJ35<3F}2qO;<1t;dm2PBr}BpnYO#c2RK${2KvG3W?m(DB8T91jgThfIC%;{}=w9}P68bSr4R;@zN~ZL~n= zz*Ym@v?B_73#J?ByDd{NXs9$Wl=WR;6t1wrm@P}e#3IDNk@>Ju=b2&hNtl`-%Sy9P}5ln9lB3ArShCYp(sChL($K(3MKyj8%l1j zS17Z{F(^B9dO?MRpFzdy7Yda>3=FE8`WIB+5HhGqDqK*z{fj}Jcb`K2^lJw2p+CY$ zaMMJ^|NmEfAQeAo=Nj3^dN;w2I|o(jpfnAlLFpPy)9P67C{FNseW1JmvImqOKr|>% zfM`&@0Mi3>tT!lMfigQNZ-Hn~{sPlexc@so~@+XJ}^Fieghz}}*Ks2Zv0@0wd2trhz6BiAR1JDfoM<}2BJab7>EXyWgr?< zo`L8FZOAeAjSZhR40QR%#7ImD2WlJ`+Zo&F8W`E>_!=7O8A4hIMta5|23q5w+2&0+ z2O|Rm2qRBsgrugICTFH6<`hsmdj#q$ftv?Qe7s#0X5D$97&ALSscPQ?Wt-Xnm)M>M zF4s<6fClaV|Lbf(B{+q1MsO=ZB__yPP)vfX2GJnvK{Ut-AR6Qh5Djt)m?q6R*k*{1 z&9G6Mz`?)(!pJQy_ngG!)Oe>va)yXN*ZF}k$ca4+3=AN)NW;e!Ci8Z*Cd}V;Hvn{D zE@%)Pbf5HtdG-kpGc5vG65c1U23!hYbGVqmZm=bQLt%3Qr@*uTE{3TITpua|xF3`! z@Z6kof%iaU0^iQE3;Zif9|+8hxFFaW{y?bG>H_F;UC_n4q62atHCKRPdgKG6qBjA? z?$!@Xg3bk)s>?nwGujYf&i4O-h4h&V7SA3&u>8I5g4MCZ53FxbxL~vXL4xh>q6>EY zhZ5{(hg@*TUy|V1QW)Um-#gVo?>W^8KG%!_d~0G8{I-b%_{Z2M1Wf%F5NM;A5L9|2AXtVuAtZEHK*;Z>31Oyl z0>Yj$K8TRpaUtT!;|G!dW?hI{a`Zv;y_yR#Ez2Lo?u)w+m(uwlexAdH1m9%|iS4lg zNxB^g$?5h1DZE(;sqTsasc(G}($$#*($DH8WU@UC$XqLskoD|%K=w492RY{-U&t-v zdyu#O=!N{y4-X3ZmtQC}z4V|czw<(|=#~d1{@E8w{#{Hcv*-vYySF)^LLw`mV&Bw+ z${#)fRrAUds&D88)YL^L)b0=nsEe~ssGt4`G&xJVb#~A^Ol;Hc|NrA>KzSXpzUx2q zwCJlB7zIFc#g3qpJwbO)hlemY284i8KIkAR2BI#zgXa-Y834*BAR3fcKr|@7fM`&j z0nwm*1E!&uOoQ?dh!4s`AZtPS2t8&;)C)S zhz8{|5Dm&}AR3h4Kr|@NfoM>^1JR(o2ckjw4@86VAczL#Ll6zhiy#`5A3^l+zvP+= z9G;+Z0OVg#SpcFzlTE7a$r` zW`Jl=xdEayr@83p2l$|(>HDyzWsk;h>BL1h+*4=T4nG^p$X(V+4RM1#sO z5DhBFKs2Z<1JR)J3`B#Muhz6B`AR1H-f@n}#2%3vhd@}RO4#0Qn1AR1JLf@n}V3Zg+}DToG@ryzPbm8szS znjHz9xGC|2p+}94fdPcYkaqVwC1zwM#ychErKA=mlCwq`)Mf)=P_V{ACx#@JZhKL% z{!`wAZE0Z%+np~Z?BFp=*zvdR!|7Lr2{$Hg`M|(X&;U9Q4s;eA=o~oE8E~NU-#}-- zfzEvco%seolJcw21nX@V89?W|fzEaVo$F>lyB@qV0kkW@$$!HH&~60KP6St%_y#xr zk_qlAjt%ZVCJK16C^vZCC>HQ~!rI`yBUHfWtndfl8JY}!YrcN)ui$0~=(+wOFj2iB zC}-z~U`Nh|5TDr}LKR*&gz40N2xmCk5Ft9NAmYLLhRClq1yKhkHbh^ID~MUSjv;od zLqS~U1cvyjN(Bj-MGT2`b{~>FLl~0d6h5SAnlYr>F?~oA3TjA~eexmwlSxCy-(w## zFNrl|-Cgk^d*hFWoMT4|awpzu$Xm9&Air==LqS_-L1ENQhN86Wf?})P3?**91*KAR z8OroCKa~BdXQ<%!{!no%k)iUv?uV*f&J5M(`9IVwj&G=4_whqrvtvVj-{lX``kR@N z1rKCpA`kxmKNoyO#M}v>xtY}qK!*$UH-MI#Kn|9KA1=fJY5;%^7IFsNb{ibR06J*M z8FIomD2YHZ5py)~#009)K?w>(gAx^p1|=*I4N6=f8kE4m^xw7*AR3g=Kr|$=fh;Wm z4R&KN_Zd|l=wh2C;@_KP$C4;po9pbL5UGWgAyc|Mn8n`tI!0HI4FUFXiy>r z(V&D1qCtrjM1vA6h<3<72UZVCxF9|#@q%bj0tV5bL=2)q2^mC#5;KSfC1^1HV!YC_{i~P^JLUpo{^gAFKz5D=342_@GPzqCpu2M1wL5hz4aC5Dm&SAR3f$ zKr|@xfM`$#0@0vM1foG12}FZ36Nm<7C=dlWi${C z%4{GSl;J=$DAR#xP{sq%pv(uNK^YK4gEAqA24zGL4a$rl8k8YHG$>PoXi&xk)4w3w zq(B)I#0O2ehymblneVz|wP1B4yY9 zfTr+S|NlRH0o0MB@3Q-~;N|3_%kGEvwLhTL2+D$>6bYh1sS-qkQYMIot|9@iq{ns* z6{;BIN-9@at!1Nlpd^5Jo74A~nA_7vMoHj^5Qe7Z(No9lVA@&7wo7gtUFMPQ`q0G`ivGMc*r7&p& z<*XM9DyDx8RJ~3qsEOV;P}f?cp#Jao22HL$1oP|)7De}m5Do&~z|7H-hn zoVP%~u6cvO!#vtZ!deu-Txt!FKmf1-l6x8|-J#R&dCFwZXAv`vNEbGaH;!W-f5iU$?>4rFwzu z=Z6OFx-%5qFCRAWurpJ_ndzmjRLdap-$R9{r91}F_YNz>w7fHj z-M3UBF6Dwj{JeIB1m8Cs65AIqNYXvGAvwKuK??7N4XN(w3sT=s+K{g9xgh;)$%agJ z?FE@@!!~3+=UtFJt=J&vf|f#VS*StY1|Eg{Fmr=~{&xz6W|9U)`4<$5MSmNV_-|4u z`7geq%;MaFvU@)_R7h-CP_gg!hRPq47F5mKyP^6<$%2}?`5S6?ge|CxYur#j!(svW z&L2FDcotT6HabEEhD*yq^+bOIsO>*@0%%><+zE_4|NqaO09tC^Sim6i|9^i2BlyZ6 z23b%KAOO_*4-a7o2nb;S9Wx&Z8V>XZjSG4Qg9ijbt0h4h22A7V4S=?gfG|iMsMQQ& zD}h?|h`WA_XM*^kj0U1FDSs&d(}`*VAR3(MKnzgE1DP^I6Fdn8%77p)C=-HcP(}pN zpv(xOK^YQ6gEA$E24zez-RlgVqylA75FeCDK{P0%f@n}?1<{}k3!*`p7DR(GE{FzY zUJwn+z#tlwi9s|dBZFvAW(Luq3=N_|nHofcGB$_?Wo{4+%HSXxl*vIfD5HaEZ4q$q z0F>cDd{Cwb(V&bEqCuG-M1u+d5Dh8>Ks2Zz0MVer07Qcd1P~1>6hJhnU;xpe!U05s z3J4GlDkQ-4zu(|VQBYw4;)4nd5Dh9cKs2b}0MVer14M%g5D*P2L_jpCAOX>!!URNv z3KS3xDpWu;s9*unpuz=2g9;cB4Ju?nG^n5f(V)TxOh4BEEed1+6*?e3sNez7*0-;N z;~!K2f%u?82tT3`BzpF%S(Z$UroxFayz`0u4li3N;W7D%e0YsBi<( zpaKp=g9^6T}A_=4$ux54tDLKwsc6~rJKR2YM3P=O4hL4`7i1{KU88d^BB;2%Vx z_l0bb(z#Kc>SZ)!(gx&la4F5@=p7tl>F5pW^x-=@{)NBG=LB8`1`tN>^m!!aWTqun zkg;kFG-nFJAg4S*%%QGcFzd;^1GBFQ8-V7AKyyQj=88KkHrQyeq$= zmi-CZu)=1q!-_j58&=88cUX1S%3$@MMu#=~CmO7Mcf(;_&p(6pdt4nh)Q1{uTsOyI zlXt;}&3$zaTU2%%Y|Tq>*d}^l!*)L>haDW^8+NL^Jh1cm&keg-P9NBPQOsa3L#)Hz zxrQ6|ecIx%f5I(;1DBs4I2h+{aHzM>;c&n_gCn^G4o3|d42~7qI2;#9GB{zDci_a& zx(%nq0uG$InXmygj|Hl4iJ@suS+6ED5-`FE-(RXIKDet_w8J^{7rU;jyPwz%zIG2hW8hF1%1@eDLDquM4l( z9zS?>@y>rkNwLMKGk;ye9rGk_!6HT@YO#n;hVj00O+dl9~zk#e)8)j z{NnJw@au=ygWoT7FZ{Wo^Wg6Z{tN$h@ICmy{Nn|N=^q|2wqL%$RDS6JbHRtvIqK0l zYVIS>sh>p(Q9 zyaUmoG7m(9$~_PbD*He*sQd%bpfV6l{|N#Qy@1L>5Fb_$ zR6c@eP#FoLLFFWf29=c{8dP3_Xi%96qCw>*hz6CNAR1JDf@n|~3Zg;fD2N7?r63wq zo`PslnF^+#{{*`aRJMZnpz;+&gUVPiJ=YK{4=QUxd{B7{qCsUYhz6CrAR1Kmf@o0r z3!*_~Fo*_~!yp<|7K3O|c?_aKWipulSqC;BR5pY7pz;|+gUVG<2;2sJsU8 zL1i|G29?_&8dP?JXi)hLqCsUihz6D8VERGn1rQA?&p|Y(Ob5}Ravem2%61S9D&Ijg zsEh~EpmH8WgUWgk4Jz+JG^or6(V%i4On>|ZHXl^}gZQ9207Qf80T2zU3qUleJ^<06 zIsrt3>ID!DsvAHwsD1#^pgICXgX#$o4XP_ZG^oA+(V#j5O#kqD0HQ&42Z#pMA0Qf3 zhk$5sJpy8Y>Jm^*KK%oDE*n&*fViM~1w@1D77)#n@E$z3JGypbA$V4%r}@kx^@GU{zlhs@PX6UAYHpbe5DOiIl|f+#H|TgAY)gr!ok1*!a_)ELc%jL zOHwoPi^#f)6*LkK!k{b!ni~bN6+xrn^LCuxFn_o5f&~|NHY{9pso`{|#s*NGdMVLF z;k$m>gdZA<1b)lL3xEc}Km%Z)!7tFj7iiE6G~fjq>;esRNqsU|ApJ;ug3Kkc1+oW! zPLSL9V}bm_+Y=PZv=tN^_fAj><5f`3x+S1u`d&fRYmb1M=tTu}t$70K|K2Xp-%6ZGp!7Z^--nqZhdNx`UCWrDGLiGoQm+XPef zFafH-2)4f)5|BM z@Ge@A>K-{E^=-?7bam?q>1WdxWU|Xn$Xx5OAnV!x3E9(96>=`f2;`QzE99;JCy*be zsZh}WK%mf!TcIfbkU+8MTZIz;B?2Y?ITw^!9GFmc@AZNTiA57C_MKf&`J-h*)x7l! zs&AxCsHvN{pmvAHgu1xm1@$wuCV+bb%%Cw7dJbB{?fU<}F$L6Q?{5HYE@~`*tXu(& zUiUYEMz7~i09}jK-@qUV9?u4kUProwFn~s^Bf~=&A_GDgB3)cU7{Ei?(1k4E@et6q zV+NdOA%W682&3c!Q1hp@t!oa52IU734ayTB8k8?UG$?O?Xi)wD(V#p6rV~vRKr|?? zfM`&D0nwm51F{5^Z$LCC?|^7f{sGaTJOrXa`3OXV@)C#!fm8AgTtV_4dR3HH;4x1aS#p4=O7xC*FiKWzk_H{ zo(IvOd=H{Qc^^cB@;`_Ml>s0cR1Sb>P+0(`KVJsh2PzXld{DUnqCsT?nBF`cEDtIp zKzvX+0ir==1&9Wf7a$r`W`Jl=xdEaGJi2E+%IGawpN)_`bGc>|(BWe$i2l{+9BRQ7;qQ27I*L1hq# z29-k~8dMg6Xi#|sqCsU6n10&=b`Pj*0`WoR6Nm#Tpy+s za6g#bz;koM2i^mv4SYK%ec)d?i9ujy$p^vC5(c5lun)qSVGJUX79T`CEf~Zsr9Oyj zN-;<%nHNZM{9%w{k}Qz=B+(%K@OOdC#a|7w2k#chZM@SUzi@wnLK#1UV&lRBrO=NI z%2|6qsF+@6Q1zPsK}~ckgSuAZ2lam!8#K9+KWN_D+@ST!^@H}l(Tn9W*%=Em*XlH6 zJ$qb`J?wJgtLD>mJgR&He24yP{4a!;|8kD_2G$@OK=|oO&(E`e9 zAU-I&foM>c1JR&t2crM&&<5EF&VC>UC<}t=UUg6|W&mYH5FeBsK{O~!f@n~-1ks?Z z38F#S6GVfuD2N7SQxFZxsvsJaT|qP`%YtZ7wgu6ktP7$+*%w5EvM`7SWn&Nx%E}-b zl$}8|C`*IsPZD7FfwDG;56a#k8kEIBG$@;cXi!!M(V*-OqCr_6M1!(Dhz4bS5Dm)y zAR1HzfM`%L0HQ%f0hs=G5o{l*NC5Fc#R7;16%8O7R6Ky_(OcmR!Pnq=&zTMmFQ03E z1)y;8tr@*^1QZUSA`?V|icJs=DmpXRp47<^HD1M!UuK+1`tMGV&hqum{Xcr zLPk@Gi-CawghA0)31usu$yo?#7A5?C@Lk_705tU{oaz2SBvR{vsHf%!F-x8Y;+ota zB$PB0Bst!GkYeIakov?`ApP)dg3QG?1+oXvC&+C)S0KM|V}e2%!w1F2$q7oKk3J}8 zt$(0mdgOzu*Te^EqRT$0YZX6G|97}RlPmOr=Dno_TCdC>Xzyz;(77CvpgS+KKyR~I zf_|NMfx%>n1jF?74@O155{%tFKbQpFNibE{{$OUbFTtFh_k)G>tp|v^axZ?czCG`O z&H8r*w!0f1*!5p1u%Dguz#)HAfn!U3f|LK00_T*(1Q-3X0#_I31lP|iKDg_~KXAX? z^}&&oDW`al^=M|=`8TM=8)i9lU?AqO)0@Y#9d4j8Nq^( z&=UzEzdsj*nXXC*d&>VILhjguh$A0AME+axAZp3w57GC!9>lb4{Sdn^=RsV`^bhg# z{2nCuZYfA?&rV3vomP;X?wgRpTTzheuAh+lHmV?9T`(d2tW7~C+vkMLwQ>bn&#oq9 zPqX@vbN=Il+%lODdFwAf$PfMZp`d^3gF@2>ABys)KPVPG^r6JR@Tx45A4M^r-9yw-y18#W0wb?F7QJLD4T;yerLXD}qNGBPnUu@DE@*ojj| zlqyh412tZb9{>%^?%V(xn7w)dG%$Po0Hfgl|Hlt7ih>(2lHf*-ELcPk#Ae_Cooww2 zZNj*M24`JeLKs{@?V8{a22eW()~JDw(Sq&5(E$RbdJqPwfv0>>>jRYfK{UM8lJFZm z!41j@AaPJ`0BHi{2oMd*6(AavGe9&bcYtV64gt}iTmqs&IR!+6atoOL#04%DLAeIR z2jv_P4az+r8kB=TG$5Dm&*AR3gzKr|?qf$4vT z!S;c28;B3eaUdF$>p(Op=YeQY?gP=F90;O8xe!Eyaw3QZT{p=rzVzB&u3S2u|9lHpoLAe(s0m{K38kCDcG$<#7 zXi#nj(V!d+qCvSDM1yiRhz8|u5Dm)VAR3g*!Sv@9VDmw_9mEIacn}TB^_x&r2vQql>{IfR2qP2P>BGdL8StS29*pT8dN%fXiy0OqCuqunEw449R8rv z0>lTE7$6!{YJlk@AHnv6N)HepRDytLP$>eUK_v-@29+it8dRcyXi%vFqCq7Khz6A| zAR1J{fM`%D1EN7C4TuJnHemW~6xcnWQU}Bbl{_FCRQiDFwQ^v2P$>lBgGwS04JwU5 zG^j)Z(V$WZM1x8u5DhAwKs2a?0@0vS3PgiSDi94St-$oZ`(X1yr51<}D!D*3sPqEU z`xb-cL8Tao4=Tw(G^jKK(V!9yM1x8-5DhBXK=jBe-MCzXLrh%>4Z$v7d5`r60|NsH zBad16B*q6MR*}(e01X|1Fet!5Gzf#otaivvd$Qx*)hpm(BJgn40U1zne?SJbi{zXR zXt?V50myKbvu_B4Q!r%63Sm%r#oFPfa;w~i2)A3 zE`@IRx1%uN|B4U?h8e*Dj2&hUOcka9%!NS*SP}y-um+kOU~@FSz-}mZfW0^O0;j-_ z1DtDL25^12b%6W9%?ms?zdP_A*nNR-=S>Ixl{W$eX6|+n?A#R~R5{l{ICD;bNMyZ( zsApY(m}R1axMo6tgi`GRNlvE#DW>=XQrb!iQlA12NIx>(Aalv+fb1dB4RV`A4#+S3 zzCoeP-9fSO<_4uOO$X(yZw4x6+zzTl=y=klx#y7Sf_(A!+ILBDR|0fWhL8w}IeIT#f?Y%q48;9wH0w82!p$id8*WrI0; zh=YZUqJhP8GY88*%m!A+B^<18KQ*w~U~<5A_i+Qe31SEAXRkDH$p3M`vE}FnC;wXq zoKu!>aM9m$z}2O5gX`z_4(__k4BRhYbnxWuF!0>G*}>~=mVx)2^9OvcwQcaN*?7Qj zTgC?en8^nMrg?1$v?)ChRHm~bSSI{HNEqLSkUy3O!c0GG2zwgl5FyWN5OLJPA@bjQ zgQ%ra4$=268pO2xafscw*&r_Eorhnx!*2DxR)4tX1-4D!QV9SZvY7!;bR zI~3*LGbk40bSUvZU{La3^+1`$oegF8*$-4m?AuVW@8yBY9}6~A%{zUd`bN`+n!2?I zYIme;sEg}AP(Q@fI;B@|KbGD z4193{19<-!qbx{-K@v1#WXADloN$UK5W7(5{J@UUrkXloBgkpXJl zfiNhOO@wuAKt%*%8(CBwh!4tiAR3hMz;t2&`1U_g1_bfJnGnPPWkir^GlIb@=Rg?} z#06za5Dm(hAR3f8K{P0Xf@n}C1<|043Z{E=!7KAX85YC`Wm*so%D5mJlzBlkC#K?MVd1{Dq<8dN}lXiy;m zqCo`(hz1oFAR1I)fM`&m0jB?R9stpx!UIg-dkyA;3K0+=RFHsZP+m1JP$2}O zK?My&rQ4sRG37(f{L zz*E?erLv-s*V1<%{(+cp z0o78V@djt;Tnf%P6p+CnjA9X}E&*8v5(HTYq7`FigDVx}V@`>-96Wl6HnHmJ=YKPR zk%0k(k#Bi*&M!*LiT6k>O3E)KC+I+@uz)bg(V*EO5F0%0F>l90@Z{==AK?k0nIBMf z3Yu62`GT2+_5c4>;En(y5J6))pyt5N4WI>iph+v_V8uRNh4Y#ZkTXCS#aW<$E_&Aj z?jV4i2jasft3b{K@j*@n(IDr7=|s*CRCY4BkA@aKAa}wr^1QcqYFR0g8wZwpvfdPc2kvb=EqkQx8N-~o{*B#e*|~v10&B4a8kvUH4v-2DR0EQd$3TTq9P>Z$W(o_AQGH6K@3p-1ks>83Zg;z6hwpa zDu@Q###CVY*sCB@$vmWl}$oZ|IsICaAv zWrgFV+tU*+FX1e>8hVxC_JQILckWGZxVv&f!M%Nz4fi{X3LeahZg`j(Qt+tGw&Ag- zS;3Py`G%*O5(UrPZ5W=L%YAsEF30dvoZ-VOb_Rx5-yVH<{p=CLn`=ityghb=;obg+ z1@G5CX!syEq2SLAs}Fxq$UgYDL*~Q(<^LZrO#kNpGy#HYNd(Q*VgeGV*6Eu+tn#2T6V1gzu zK@*ptNlVa#C1|n|G*Jnfq#UVB5x@lrX!Rt%1|Ul7j1h%L#Wo+2=KlY`eipu_A*e44 zUbld~X&4;B09v>JDtJk18p3lvs0l}G(-2f5fYgIZ1rQA?8Nl=nckrQUxSEcj(gLIo zRAPW=P^kf;K_v%>29+Kl8dQRSXizBvqCq7Ihz6A=AR1JnfM`&u0-`}B3y21lE+86I z!hmQ{DFdQGB@KuMl{O$6RN{bWP^kl^zdiZ@qCuq(hz6BFAR1H(foM=k1foHu5r_tr zNFW+iDuHNF$poUor4xt&DxpA8G5sHS`W;kKfw-X33PgiSED#MUwLmneo4a5hPY9Ja^vVmw&=?0=fB^-zbm2w~&RMLTHP-zFE zK_woD29f@n}_2%BtqL8Uf`29?|(8dQ3NXiy0bqCurNhz6D9V0v`9 z33&O&NLX$%T7!WGH;8K}Pt)B${{k-q0|*NsjaK@lmd8it7m>4^0yKgT!k}yinkN9U zMIb|zas~5uy-rxr#!#?u*4czbsgDX4H@|$aBx_y4Qq$!L%YsjRST5R`u)=uFhZX;p zK3FB(_hHq&_6Ms!7kpT=FZ03L%RwL3&GUY+ezVDk4RyK?HqHqw*p%*-u(`&#V2is> z!qynkf^F)23EQo|7wlmBkg!wwX2H&9mlAffeEqQd*p`GnPp*I1yZ*w1eMfeF*x$eD z!GR^SKOD@T^59TQ?T5quWe<*|#D6%dAMxOrZ%x5*eyay3bmIy@fwW6Ta(575vaBfAEvvrr;MxgZQ9w z97Kc4au5wF&%rcwSvja&2k}8=JBS9A?;sjf#)D{3IS-;iWj%-nmG@x!K{ME$pmHC? z2bKLG8dUy+XiyyhqCxclhz8XKAR1I3fM`&i0HQ(l0*D6H4Imm+KY(aZ9RZ?2^#q6p z)fFHbR9}E-P@MsyLG=ch{&ofI9#H)O;)CiC5DltFKs2Z>0nwoP1Vn@C6c7!nS3oqV zZUNDt`UOOT>KG6Ws%JnnsICFgp!x@dm1cKzvX=1foH8 z5r_uYM<52MP6Fi?s`dMpfct@<`U_<2XumHMe2&<_Z!;L}_kq&m=r)6C;QUF=Z3ZMa zGe&5eg}9#K3{JM6UW^P3AdK8IbV@8rN=(To=axdyHUSU@WdP8E84z1wWu?l~9j(bv z`4~Pu;G5EOfqy!~1A&sf3xZ{j9ted5To8``pCDpj7XUhL19Fqi|NkeXLG85@(x9cx zS1*8;GQ&18fX>{2-FyqO28406(LlC?Fh~j9HK3{p#|9=d8VIwHOV1Wcug(F3RG=eZl3EUu1 z0N^zYn=eJ;IrlPhGBAKJ^48?Y#O%_NL~^z!gBG2EFvxANQ(WXgqdK4y@<0&6tzZs56jTY>k${0)3N_bTwO++!dxbH0LL=R5m@%mxFI$Ycdk&m;pe zOIHPPO&0?RrNjl2oN5MAOwJ2N?^haz_bV~dbtaL4;anrAY-=n4m2LeEph~5`0W=5z zIia$@0kpoXu>i6s2K8LZ5C+hF91NhFIY8M1ly#w7o^fP!(2GAoD%Wmpgm%CsOF zlyN~cDD#47PzDCkpiB&+K^YlDgEBLS24!dv4a(FY8kDg?G$?a}>Crotz?*Qet3Wn77Po!u;Lr4GY?2CM=xwvSCr` zzX^+5*cg_$KA5nie_6xnPM!&%n&48R1Ow;*;vX7Q7=H3cO!&o7#_;P$sle|S5e$EB zgbVyVVa4!oho!*(6*3GAGo%F=+y5~zmH!oBE|h9uNtB$x8t|uq&EfY1c7uBj?7gNF zI0X(gaIW1b!1ZBK1NVc46L@a!XW%{1Jb`cLLI(bo3j_paHZurzHVFt-rZNa;rU-~c zx-*D+x(SF`YBGpxY6wUuxi(00atTN=sW(V{Qkx+Ch_gZF62}DDgRdLpHolr5zwm5> zLYb_9V&nP-rO^KZ%2{U^R7@WVsCunqP!l~YpsqE6LH*zT37T9*44U^2PSAQ4!l1ox z@dTaA1r56MS|{jj4ryNz?u)e*U=nLyzKOYrv*R5f2zr0+)lQ)jR zb91MF*INe$?>S2+_*{!=@U3Z|;J3}L!9ON*LclbIhCmzd2|;B{4Z$+H6GB3tG=%)& zpAcqxtRd{FjzEOmV}^*Md;*dGjxt0o`5+K|Z#hFu%O!!>eVq((DO&{M=Vdb__+FTh z*xufdq`PTCa(ZS%3h$H&sqWqlsc*|Bq^s*Tq@RtLkjc*9kh#`sLe{g74cXJe1#&L% zG31t63goT-z>ps%El|*ZiJ{Q+uRu}$7KUQc`vN8Y(-=zr{hm-}v8kc#-rWfm5>px~ z_U)fg`J=3%YTm*L)i)v1jN03A;= zcLL~mn$-(HtuoM!_n6&puQ&qIDaz`Gc^OxeW0dP919Ql>KRZj z1o1&R5k!M>BZvm&NDvLml^`0FGeI;ccY^8uWep%2luJQ0D5rwyL<#UJe^8DE@j$6f`Jhq_Bw(|F3+!Io-E%=)2D|<@V7~oq(2Wla3=a9{z+i z-#s2GO8W8bpIiY7h-7twA)X#0JrzQX52r zN^TGhD!oB8s00Vmpi&%6|N9L#A5@xy_@ELUM1x9oFuiX-SRPcmgZQ8l9z=smc@PaM z=|ME8vi8;38-jEeL~LYsbLA0AhnzQ!Sd*Z?LU8$YHzG$qhT?`W<#$ zDKOY2UVC8I*2Nok|JdlTXWDgxy*Hm6*jK@|VgGIkhXYal8xGE$>u|{Wu)*QF3kQzK zeA{p|fyLqIKP`jfj^+oBKUi;YqH&7DDc^+~PQ7b8aL)I?!MP1@4_wwX-EhS@<-iwP z4udcAza99>nq%0?_24`mC~75NR+FGMWRWccr(xxs3I)`QCi z+B3ry%)cGmV6k6ogTwBR1`b!b4}dPY2VHOvJwgaF1wfF5owx$M%$|vrg_ZUH|3l!> z*uxh@@V$Sa7zFV_u?V6;F$tnUu?eCF$|(Xu?(U?F%6gZ6xg7Y1)@Qz3q*rb7>EX?GBEw24BRmW zr8W>Bl;S`%DAj@K4OU=zQ0fEmK`9VKgHj=g2Bkz04N8q*`YJd0lnGF(1o1&B6GRV= z)CoE+%h=8sZPp06fKotO%(71Z9>brX-eSj+RoRrBrng_{^ozQtC3elpHOk zSeaR=R)=CQrTi4z+(At!5SGMRO8KVdrQ}zQ7Ej2Uo z2T&CTs=h!~m%|3(4US=U6g8s2Z7mi=0@z;z8j+!IBWe>1sO}$aL=A8wN)poe0;M=m zqX(4gKr|@jfoM?b1JR%q2%dPZR{8=p8o#_jR=6k zVes_vK7toTfKnc)xFOib+vx{Z4;pm|?bR9S%rBgq+v1l>Ku3aX?agXAaZ(13!+4Ww*Z zw*y3v_U{I`f2S1=9^3|{Gf)Nsr8N*uYy%3E20`jU=@3K@hO~&i0MZSc$eYE&zyQM7 zn@hoodGS7_ndEG90WFgUVNei&>R=Fi=ug@GUAjOWHrnJaeE`(A2leY6cFo`5$ZX&M zihK9Te-^l34%*=HvCP49v&japixH5Ua>1Q+W+F&%^~1u%%mf*30%-xw+Z{YZs7U(% zA2gE(S`Y-f#st^w9nOQHK~V(4C{YF~l8WZ6-vXjXi>3i8n*J^YHSLCF+EgOVzUCbP(*RdU5% zdd1dHJqQ|y0%19<%_pbQ)V%!Sc*o45RB}o%Pzwr#K_LR4&IT~LXbq0kiM@>K{b5`W8ZZZ8 z+`T}r(!@LpN1{NzKu}pV^m~D@g`0#1&5?VBck0P(M}Z0_(6AJUX8r$v{}DPgq~K8n zDtwCOY}^B)M+>O|>iwaw-lTNUeAoO9pu!2GcSuoT1xlV&O{UmOtNB79s-V^s2xDJ? z;GAESlAlEB4Bs$qOkrPT4yvv|jVMsl8q};NueyS+GG~FTGCzEQ4&@X)mO$lG(VVs5 zM#5-0HAu=Sc!%#lc(ppY1L&Ys2`aBZDHB8wj?{_0c-k;cR5OExfdPcE7f&Ij$)&jz zx1~SG<1K6h%B_Il>w`6jJcG0ToU~bJkq}(W8ab&@QCV3#Gx37O@vVxy$@z zo7fl_Kv)E6LeDcVB{MNEu^>N(;)Mvw`0gn?6|RJFKiTEd&kR=_UVi}HG;~ej?1$^7 z+Zk>!tp9LRbSA^i2NOTs`nR zv6o|kk|9Vv=&C#rjq5TjP|^g+gOVqR1|?At4N9gU8kAH)G$^@(Xi$;`(+?(s4@*G6vD0qzs}#$r(h0k~D}0C2J53O4=YAl)OPSD2an;P%;P6u*EtAyt=thzV# z!|KoV3~Tn4e^`4tkzw7u$Peo`J2Pykv;MGgPJF|r^oWAZHI5Bi+^q_>#wa&zQ07df;~^3G3;G`@58<$Cm8nkANX(}>Kenr4K@Xb zT6!1``?q{Jl9I=8R6p&*G2gC+d8|M2TaI>YZ5o*zKBcKXSr+^uyl;G8ca}$R4~~ zAh+>OgZ#q%1qx;S42q2l3zR}XGAL*5{h(rcnL*WS{s%SDt>7E5LAPInZobyMx4A*< zmFoxXeN!8BE+-Y}&MR-w+w4-HUl-Y6Fj=j@FujbysF5`MgVnJI4A!^Te6U&nr@?l2-v_(?dkyxp3qCmHA82rF=`C>b zU)127l3(DW-_qdf5?J8+c{_ud(QL*pKE>vzBQE% ze%lNR{9~dU0;UNS1lrg(1eJa%2$qp=2noGb5b}qyAKyqFIOzK0qT+bau_beA+Fr$-m0@U}Iiy4x0{ zzRhSzSC=nHKkL)GRi>}j41Ip_a>$Su=m$XoyLLw*=9LqY%H4~3@h z8H)0kekc~b$WY?n{-NaG+lDfWB?V>o&Noy@v=vnB+t^U~Bcq^d-sFbr8(sx9b)^lp zJ9G-_;=&v1XYdukPt?PALlHBQDi&5G4n9qTPwxN!wO24(mkd1r|L@!YI#Orn2GFU= zs~0eEfY-RWgfKXRu2BjOVQ>x)VQ_|?*9SSU4|HxHj+Jhpau9@3%0*DairAJVsJsNJ z2bGy18dPqAXi(V+qCw>+hz6CRAR1JTg6V&o!7WBmc?#l#%2W^yDpx@?sB8t%pz;+& zgUVPC4Jv0rG^nfv(V+4cM1#s)5DhAKK{TlB1<|1L7es@~U=R%|he0%`EC$h_@)%4% zdjP&R3REtG_@J^GM1#s_5DhA$K{TkG2GO9h8bpK2YY+`8vq3bd+y>F0vKvH$%5M-2 zD#JlEs2m5;pt2l9gUWL-{Ua4@Ke5-=g35Z3K2UiNqCsUohz6DWAR1KmgJ@9s528VJ z0GOt6OC3~ifb0R)9UvN1e}HJJU2{ACFgTn*bq&Z|P<;cUL3Iv@2Gu(t8dUdyXi)tF zqCs^Khz8X|AR1H`foM>D1g3wagU^!u{lXKRE?upPJvBeKIhuSATGFG12I5# z8;AzgZy*{}$AM^2JqMyebsdNX)psBoROf+cP`wADL3JO92GxHc8dL{@Xiz-}qCs^b zhz8Y%AR1IBf@n~^2&O-Qn@0?w`Vqtj)sY|?R8N9vP+bY4LG>kw2GyA$8dPtBXi(h= zqCxd1hz8Z6AR1JUf@n}(3Zm7u8o}4qg6dQdA5^b`>3f?&%`*m2{R-lP>R1pBs%Jqo zsICRkp!ya>gX&xm4XSrRG^p+c(V+SlM1$&J5Dlt_K{Ti?2GOAU7(|2WWDpIim%;S2 ze;^86KZ6*cIvPZS>S+)Ss;faXsJ;f#pgJ2wgX(P%4XV3AG^qXt(V#jUM1$&a5Dlu! zK{Tj72h*RogD7yl4q|}nb`TA!-@)|eY7hmk=RpimT@Ru`^*x9N)%hSARPTdmP~8ur zLG?d~2DJe|G^iZ_qCsr|5DjV%fayPs;P3{u3qX8O+W-!}9&?tWZs`Nn>KB%$>RrH`r z9#p}DDtA!DKHA|OavfgKMopqH3sI_w*eS{k8USPfl`fELdsi=D-~^S~jJzO{K@eQJ zaOxTuFgUwFyPeK1Aq=j;kR#$j*$#wpbT~o93J8Ogz|$}&%YxD|hz6x)5DiMtAVr`w z4WdEm8bpKAHi!nLZx9Vi;~*N8&OtONt%GP#dI!^^4Ovhyj5cKDu7EolpusLsfPe

    nWjy>kO}c+VHPe8o|+f=mKo6q7+EX=b|``1%Xt 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 z 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°AbWCEfLz7r1M&+3FDMwl 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

    0z{A9}EtM{EWfVuSYq2hj~~R&%|$Q=s2Sv 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 a9}>XI1}Z62nNpctPBJhYvgc-CU;qH^F;JlZ delta 66881 zcmbO;$)J6?7;k_#GYc032<(hgpU5lA?z_%7#&@0ZL_;b4opI`ZTeDRf0vH$=K$xFF zhQTqdC^I=x-#sxYzbHR1H8g~iff=f0a^ek}$p#*>lNA^Rc|m$vwJXy685kJ+C)+Vf zzzhbfdaENl`8=xtSe3^D?T&N?28Q&>3QW>4Rnr}>a#~NWWip*C$Bb^64YL$X8HQnS z=T25&kwj4ib(k=U!x$JCgcxL|-*@B||YKF-#h2S<%U)aoSJb8jjz+@Q_A+WldmJ|8S zj0_CTjFW9d;Bh$JaXq8)<_RK^jFV-w1$9B;4G$Ft1_oY4qVvm4%uTJtNOI7S0$YLP zI~z%O0zmN{I9WTZ%=jzB#J~W;NXgnYC*CnJvosIc4v71nOTA^BY^%Tnb{{;Ip}Nnf zv^X(45m_%d^r0zF2jsKVMTZ;Z7#SEqmwQXt!@ zz;hEyAZvqcfM+@e1_o|~4LCyuKY4-t)7NN$(MpIVf%_nqu z87KD|pl8R`2DpO?5up8s@M0D05NLpcqf3MT%WXbJ1_lsDiY~9xBvgNbGt+rv&dC>z zZcny0g*fDyTHDE71_p-Q$&sdrJi4%%*$czjONXf@HDKRM#wNgaMpx`2)+EwPMATt942qP5%&Z(s(s8POr6j) z0QMO?4KOe;AoxIow+%{lpW)Wzuyzc?W!0zC32o5!L$78+4tyOF|MJ`Q0da(FZEj8mVS9S^U~ zVeP@t^S`f_GBYrMFgOS2rh*%UA(>gFiFqg?39iF7^CVa?PyU{v1h!b`s^jGz1_p*6 zhRN!g@^DXsEpEt6mg8~^4l&_EX_NZ#eCu)XVq#$MVwyZZ3ts0y4F8(N&op^n0mSea zt-xDz85kJmGE6>K0M8jg~$(8Repss1(7WS@2=a2mY*_^m9Y zC0*SPS35cJM&#uAQw5Ab{y}z+5R!kqixP8E^HMUivQd15!%;T7Wcrj?7#NgTCYN=> zEdnRr&F4CwGf$USW>Nx&AKXO@3=GKO7hDqWomoki^I+1H&Dr$#-X2+Z~+s?wW6nv znSlX>!37K~R!dOZb<-E>F&R&9;A7(0Zt#-Jih24rA4X+xy3l%A8QsmyzyQL?>B1>L zvlyiT21!(G>jRi4tL{(&XE(1M+ORA!(NIbdj&fHsH>2SaGyJr6QrSydGgEC($o7RxH*tJA)wSe+4Icr&5I8QFu^s2 z*EAo5Yf?kE!kZbS5M1}AOm)`^Abx@;vHOhPQH8f?DVr0OhRZ0 z+46=W%o12a1~(B}G8g{@#UBVG7cjo5c`5l-7%|AmI6ZF)<5qAKf|CprpLHsz`_;@a zdDmT};^Hc&@nnH}QPU01v9L_$zt00!Z0)Ia;5`!q!+WO5n)eau9o!>nyuXEM@|R~y z;Nl%Qxr;K$On)E6ErArKFdu*owYTmKe#FGU@Q7(L{|iJR2MYGh887BDOp1Mo2o@VEimAm5G5Nm1(*f6C*r2z{zU*ITl9F z?OjZais1akHGSn4CJC^s+b7mRGuiYx9E|WLHY7Vu|8R&=Zu+*JjD3h0NnMt>v6z{G zp_qBPAunPeU^=K_y}g;2(TsVz(mo~?u;Ev}MOuGhVPN>eGJT>L!fAB8~NKFweWgIvYf8cw|n9sn#kU#yI4U7Fn$|%nS@Q%+vcL8O6nX^YcnFlT&kYP@1FAWE;%L zIsNBlCWY;j0~jTkr^iP^Qvmx~l|@1<3=BdnAVW|Kxb0VuF<*zM1y^nX-*cE`SQ!{V z7`bxuOD&I&%r8Q%NrbGxm{Bj7#Khp*%YV5qNKzW z)Fv^w-8X$sGZV*j{bI)C$q}89!Lh}X!p>z33=Cz{Q%jJ78XSwqN*GKqb?3SwlvS?XSxim6)ejbU|~YUxjk#G-d{d zY0T4a)-xjNUyzr#>oqV&Gf%JYWCT}U)0cEIY9K`%xb{M>kEN#@E@TuHC8jFI(5nE} zJN-urw*VJnm=03nz$-j- zBI9)3nT%5rWm)&Nqg|UB85lM*PH&jQs0vs6a5JMS6XFK0A#tDqm z^B+Jn?Q32Y9jK!P*E32?w@l~eL-VKtE@tC8nREamtej0_Ar zz+o>j{Xhmvd_lr0VJ~AZl1;m$a%~XdDluI?lbapM>tH?8AIxStH@$x+qx$svMT{oX zC+uP5p6+{?(G?K}HsjlKb3Mx$85lqqrJhaA$*e-HA;Iko{a+ne7rx-w1|{mcmI#QlFC>DkJ}zyQL?C9H2|VQFekKFW9!xP;x_@tM($Y5MJ- zjB4O4`q*va*@FxW3LVy~8)6;%2&Y0dV!42`V^BShtmdp$cAdKv1m(-G? zeAGG_62$3$82>R%U&X=%X>2tGe+k%gzLE zWr2;J{55OR_QxDdwTzSJ6>v@d_YBf7la7D66w-p9uEmFB1E{aEy@8L(lX?2>hg^_$ zR&vdSYi2AA3}!6TcZegYHC)JSyq!;i={KaS2M#2qPm^YIFfuT3Fi!VZWHKx(I- zp1^i@`iC$kA#laX#=luWjG2J}gpnh}vA8rZITI~Hz=52n$;7$6QH|*o({xWgCP;Jl zubJ51dS(WOdgkekdQ9*>;`W7lOr=PExUPSGtt&GFgDdm&U*=3m&EoZp#?#mNvvO>Y zvS1Qnp8kIlGh_@%#6fW8I|c>@5Ju^nrRJpOA}3mK$7Q;`6BFn3BuA!Q@IEOx;UX$U z2FTbSwEyFhnpc)ugklURgpledyotUl|R$Zu43cdK5r=- z59{=Ko7q&sagNkL>YL4k821IoBU%HA?d*irmlzlrE-_4JUBHCai-=#qv=Y>01}DJe zz$9dd)a}{uXE= zPyDjnyM>v7p@n(+`7KPSy|V2JTbbM;B_X)eKBhFL>GemUb|IBX>yI+Q`(NN5)pkS!2;45`$v2ao&BVX}!s62x?qd?3 zKKBe0yr~D#^Y{!?0;JIdj_C6DYttt(F)&O7yG3kzWhFN^a*GXI_IIYOdL{-25Qe%f_7S?<7C&MtLDFOQUy?(Y ziGcxxMIrVqc*(>CvuFFpmrSY<unB=j%MhItaGP}c#2RkoWe}il2KLSgxWs|iAk%dO z5$=T*wO}Rgws{Z1YeuFE3L%t$oMSURUx?XwICdPmt^Lgep`aM5j>;>PIe!) zR@JsJFfg<*OwW};fgy%*dcG_om_Pw)y#1&wvmqnA4Fry0coo9HzyRu}e5gn3 zr(ER(&zhpmd0c-Z9Cne3f#D+4bblpgL?Z<}61YN%c^T96w=yh{5W4o;J6404fkA_L zI=2=xqQEcw%woJfRg3v8({w*0W=Pxmu;IRqysQiiysXpfjF8d;xNy}u&&Ijk;S}3R z$j}TpI9o49nEhs8VED~2J;7nXxdhD?SBLf2nBNye)iFwIr z>qNk|t#@JO++OF*%*QxA&kY*74D!zdplzETH?+{5{yvMTZF`10a}>CN!!@~f0i-qm zAZF7wAw~uUA;#%}K1fak+p@uznREJjALe`DrZ?D2h}Oq+dw-;`1!Z%1Lj#<_;rRgB>P9*<<6ZP9qoXe+2cQZrQ zFSyQAoT|mhzyQL?soFO&IW-eYgZNz!Gw1ZH-OS(M#Q->FWq)QIn8V1xFo$va);_c} zx1Fz_xtI~$`2wp&%A>NAkz5B(&)D*)`+2tmSxgKJSxnP;7Ba)TciRmYGAA)jU(d+} z$@|7PGxr5DGcW`)PoKLSDH(v8v)ex`XBJ}ycLu?`KR53?Pi`ZRgU=MAT4* zlzd_vnHMAVnZWT0&pp!*>_E5*CBc_%H|yWY!oaYTW%|mUNckO9bWLBdkC}5j$1dhl zmg#=Sps5~dY`X3kQtbh5R3OHt!Qp7SXTm8^yHuHZ`n-z>2S9Suw~Nd#n5MJdVpalo zDJq;g3uBoW7(f`gO92`{Pc6$#Nkxfj&{V?qhFi>bOo(Adq~=cl1Eg33yA0mk0b92A z*b2roObiSljBJ^EQDR<7d`KzUusJwK$G>If+`i=%a|hG(10SJ*;as4?1e$!QWtjfq zBU0#rlQDR<#qSd{WVQtyA@BVz*nk%*PIvf>7OHVnH-!1i4w_rl-$i5e8eb=ln#SP6h@B5Jt1aC9w=`C>0!e);uh+ z(=B*egu!hH4ZGiS7BDj~fG}vq41XW$iWzVc+rZ0`z&!m{DVI7p@uvtJc&5z6z@W@D z-9nrN-kgI>`Sppj{9r^hApURYv^>Yiz;KRnI3s4moZGWySsECpFIQyI z0sERU^PXcE0|P_Y^aqM8@bYFlID8zHSd^ykRAPZNDrJ=~nSvI6Bu&4e!~&lLn4EaS zczVAw3+HqPWfq<3SCm;qz>Y?Ebow`C7DP)1n+Jc{%8L6iF);WrO~0Ybf@mRu)f(!t z$TLlUp1>sn4nUrls@pOc7#KiUkU?g8!vt;-f2c_=aF+28Lkf>EFzd z0uStNKXVol=IL>BIn}`Wf7v5qW1^uHc;Usf>7j8O7#SEqm$6UVr85zdw>hF@_6Uv4_$2x3=AL)&f_2hoD*}BOG~g!{(@WHZ~a*Ur#}yX zMz);$$HYwx3=EqXrZ;*bmY{>XtJ4Esuy9Pj(CSZAxFUg~1_*>|%JxdFSV3ClYipSbv{M{`HrP3=AL) z*YA{Al$VIHsuD8MJpJxG7Ow3nfh?ODr*|!8fwBD~8H@}JAPhIgv81vnu@re^7F^W@M6pyr0#XY!QaEGk%)UpA3=AO51xtdy ziOGp5l_WSKx1XQMx`T0g-8@!7aLKXPEpHDf7iLUPNM;d(cjmwuaAz`$@$~Q%XgC$K z)?fU=$iM)?@Nn`h$}TM_Mx9mu_>A3V`=u0?!;I4>WU>f@3zFoxYixPU3=Db9(>G=! z+q0h0cspYji!SqY`5qPxu-eYuB5OIB85lU3rxl|oL%T8-&h0V9Ec=AM2z9Cz-pGw)6dsHUF5qmgW(URckP4M|pDO(N6h6{j#WFn};zlY1iSG9bvP zM^Q72GQ|I2olBqB=s#yHdZd`;&pBLl-(#_1cUBBFEq#i=aU7^mMq!wFd``s>B&r2PyG4Eq_TFPMeo3~-ld zJv%GM^q;d>+NOuhVUYm0ic+qfvjnGG*a#JzmNA3Vvi~X;jbAl=@H#Tn^|sM8>*p#W|?)coyn29-D<46cYkdj0at@{2Q*GK)}S36xnOOI+^G zW7!Ky9pIviL2ccWw~P!7APmn;zKQ9HDQLrM;KK9%QWnnbtV>w7GfwC6U=;yp+{9Iz z?Ftzf7z(GKS;2xd$##{~db-9+7K`cUSF%We?LrPJxLr<(dFk2ts2LYEpun~W35fiK zBo5xyNU;JAmIsSjm8Rcc4NXR$oIac_Vqjn>n*M(^izsqIVhmbY!#O>C4U6scpH5tm zCRq2MeX5`Y4#MzI^e##)&daY%L<_~~;Iuw*Ehw#nifwR{wqoYoE>tWIwFi z!0t@!-p327ia{9e&Op!%Odi@$D>zMoD`dN)pb8mOet?b0UGJ2{&d9(3!f+!(5{omk zQ}a*;Nx-ev>8&SOZcpFa$_fc5M1cz3_yWoo!5N8p=^2TrO&C!Bb~?O>1*bDaHRN{= zwd-Ir9km*&`*?VHF9QPu2*XozP-0$sK9<>y>CwWhG1I+7SRn&b2q#WIcL6CfP#pxW zR1&vO(wo7=zyQMVN+l#UqX;d3f>TV^ea=9p>7g$<^}t15ixtOgQ)UJRQ|9UG?jrdH z6z<#Zv2Zd^e{+Tl(p_OJl#ztwuf%6al@K_8?Rv(dH0?eoq?NKmZXxSt1_lNYhI`v9 zF*~sct*r!d5U91rIeqPO3qP~GW1KFj z4s9VuaBA(zVqjnZVYt4KjLh7E43tI@BtPu`!D2RD`WmM&xQ5u7w}0z@1_lNY2KSpm z9u5XArp`{xL#evK4WsF2ez9;)zyFiv6u8d;P6S2f>P+_;85lqqo(LTC5>qNsY6(yY z11{yK7ud0KY;X9(vWjs!Gb5`AxV|XRP}}^1k%0k(;U!&IPGU-CS$=T|S`l3MnZ;&% zGb8IJND%^d1#%$3T>%P&Bz$22PKl+>KD>t*7#I#QOpjzo+WrZvRi}ZAIdE{<+b?N` zD22{Ff`cnFFFmm!zX-KK57TWi{TwH29M}kO*~PggpAl3mf-t=73du)nxgbId+!}A@ zW`(xK!HEq~ULutuj-ZM;2`!<5=Vnn$P;hV|7ZC8^iUbu9s8b=}<~Y230GC4ZwX)kG z3s3V!SP^w9cmx1Ed~;fa)ouF8PF6wiu#qHt1}msF48q`HBT$eH!{Bx?%k=+^to-0`v%2fM7P7Sjsmu?_&#pvmzJr}1_mwkgx}OXyq}7yH z7E}sqm8LLG&y`_?56et1tY@*?epZH6ml51e0q4QV2fWt^tNDgyS%j~)IYznB;p zKp5^3zs%(PVzjX=a11|q!NIwm_Zi0qrs-4Pa%g}PSxQ*ozg7kY1`vjqXugTriN(ce z?LUwallvt(ruQbY22IaNVuftBQ1X4C4jM}XVYm~VGC>t3N|S2)MpM?QjML{^vO?M& z0W+WdU&hG5u#9o~0ZUfId;&PkHdwQAZkMrQErf;{D1Cr)aVxj!s#}Z<47V7k%iFQS zo9OV2w7tNNbsgjM*RR=y!Rb==Lh^r5X#>LWbQxTfnv$2Aou5;QmLEZ_E1T^l&Y&^} z)Vc)sLE!B^1_lOrAH*>w6*UWi>k4=?5bRc@Dpt-D$%m*_EO_Psk$9mq2cYZ|nv<9p z@03`Qk5a;-Cup!$YbQNl6v52E5Wze>+8<#Rd`@Hgg_oSF%+u{7Sk=G(l2B*}_qEgfv5aiVDha*_uGl42Ff$1EH(B=ao*-Y0DOb!AacuZe)4~BLf2nBhpu5dPYhjYRv^2lh~e- z#TvsnT|SQ$(x&k4-~YCRfq|i9x_urZSU_W9*3)O@u{uo;&4=b_vv(PKQy3W-Kp5e| z!V=68hv@-PEF#-a=d&h2h8@7!=<9Ud?uU#F3?K~8M!|{M8HqWl%cUT#-7}@EoZJ5u zv#thZWtQm^Dp&=;X|0BZ-}4&UzCWxr4~B)6W`6sv0bl@H51|maETA^8%>vPLMlH|dqQB(imFYy57~x+ zR57`f7H1^pp^bNetH-Wp)@$IlF*vCrhA5`rYeljLbx6YRMqDpw6zUGc^!e?qNPQ?! zf&8wWb<_0tL(suKc<&FkM;4TKyc0`u6Z29~!VS_gf_DhPuHoyL5H*vLfng@&bpCEu z_@ECch{4U6?eX2Lxs20w`dJ|ZT)SFy>p(3q5JqI2qS8FHp-Ire7t@#avzkr!h+u(q z3J`e|DbzwzbK)J#GRu&MPq5`$uwxNpThkk6A_WSlor^S>1y=jz{krB$j0_By7^lyj zht%8wHxlKYyZ<{e{X zU^vD&ea{l40s@>%|DENW%Q(GZB`ajv#h-3ww#`fo44avz&s&Ms*x3GQC2J|u^wS$y zA*;>OrA>;JSQ!|USf~HnfKUsLu>MUfJllgdvfgKzzIq?47I^JVpxdUvMg|535C*Tk zDaip%{wC`?Cl;i}hou&!pf>10MbLEX{j6crDX}aA3q!bG- z948-O-NZCq?gT4j9uvtcekV{%9Ak8^$ZRjaEz8QlAj>*^?RkW`2(K_*0C^?+E~_ed zrT{TI4>|8-;T9}YEr?NiaEsfg<#*3xMg|5D2Di9j-VZKG%*#QWDgdRU>E~y%a&G_j zjCDO^n*z9KfbU11zWX&Rd`<Bt?!r%pWFw2}1^Ad|N*Emhj zS;Ee_o$)PeKht!$FFE#~Gz8DzFfcHPG005+vz1#Cc|HW3{tBG9c&5vIWz_(uKliV! z@cEdDhEm{)-z6kp_$C7b0|Z>s@+#;Q#{z0|<*S$V}UgvIGh|T|3?82kR7sHgN8{x9*YkNd^XnlMK_}{6tCy zpwu<(H!J7#KOSsTr_b|ZgQT#pn{F(;#=yXEjbS?1A4H;t7$5hCb?J2Jf6$7T>t_5M zH)aL~H|FV%{}B0VyI>)k1vAJM8sKREYCYQvba(A)pBc zd5tI7BE;SV$T>q$iyV{D#yLQqMC?@nYt@18dq&afnux`X@Qu*wph+aqIb|@+&LG18 zsvc4j^^p@1tQmo{w_(9-v;;jJZEpkE|47T%ZI>b<6VmL)wtO9FukyvsXf`12RR;G( z5POv&N25R;9$A`=HsA_s_ijIZ5Vm<4+}%ekoq~)iK{bQIE42uHkE z3cL{;c@-aMBeru!W=^WUGidv8UTR(mMjr?JGCr^u92WD*hcYuTgfdV6z{(CU*5NJg z$rs9ardM;ab8Zh{W9ML=zK4%p8=PeA_8L!$WoBRiVQ`WS4l#3fLG@3e6qnt0AAWXm z=IMXL*_Bj4VSv11i3Jn}80U(BIy7kOl)#~Pfk|chQ6>fk5C(;wD{AP0mZ@ylQ(|vn znm)OZLqip08R9S+1_o9J83xz%$^z8#0u~i2p5nLf{poo9M64|M(c zlgiH`AdlKjXY^(lhR^7MO;0$>#Wj7lH#?*U|G+Niy(0qy0|+Bop^L>?UOw!yU}ptP zii`o9&Hx!M>^#$3{MdywKuPS~i`Pvsr*eRjSV^*eRA~-sKN}V-tkVp+ zS*IHWK^-daQT7)oSU?!bQeAU&OYNq=^@j$H)(h(jkRw4DNsqP(x*nV9`2p-a(>DjO z3xU%|yWzq>P}%@tl=OiS*LKr&1KGKz=LfPwW|QGwoIW9t9WgG6!&Cj0IiVmAfiRK- zb&b&-XgB?S5W6fmA0Wp!I3GaLE~XCD*ammSK4&M-2HE8}{Xj4~Vq665I;jwLuIVu$ z?2r`@XT{fi0Qnw-Q9=Mqvf>YgCX9QJ?@t4TH3%blN81wJaW>OW!SvK`lXU<)2{rlZ zVk9Py>BaugDe^)s&sMOW=^Mk)y}=#M&NbaP9O{kOms7uhya2)|-oOmuX%Xyl;6Q>0 z@O146^e99PQ*i!E&xm>l@-PS^dm1Cp+Dvzd1m%WEb|J7vTSnnWAWa~QtP#U$Hq(ED zG}=e83xQJrJdH6hFu+nkXoxd{<;Gtie}XWwUomp8&2&8}F1G24vFs9H2cMYUw+yR; zF><2K^!c&uJkuY?vO@+nUs%0p0a*va$X1%6hm+0p=s0$s>GR{D@xu8a;0DY}B#pWl zMWWsGfOvLUurnVWm5_kxK}u)Zm=%i6bnXOpd9Wsr)@z?Z2@`~oH0c^*luvfkPbIL+ zfy+?jcz~6m?!F-~y} zfdPb(92%9FUX+S*t^s(udpo~0$7;yYjNn#2vhAQ52UmzU!xB?Ut58xNn$_UW>kNb5 zUyyNE@VE&BOmlutdVYEl+LQ%iF!sW9_PLDHt>&;p#)^@hfb4U7|E5s`FV-S`N$!)ec~?m0G8>qpRucf2bV4#VG^)lW?%qeK?a#=S5cNcgHsQ9 zEVus{`*)`4T~!6n+2Uxc-+naM}fQu-^!Y0U!Ej02xi%Syo&{wE|rnC`@ zoxs*L9g-D|U}9j1V4AM&z=7NmRiA#`i9>XIw*!YN({x)m4nc4XvUaW9smR2@0K!Ny z=$n~`WtAm3@2qv>_zGU;$1*)Sg$1(Wz)RczIV5Bu!v|1D2PYOKmgJ+%K|#h#z=7@W z0}AY&0UVHd`#sYSX@Sy_HuLmb0UYqoIwU3y0y*9=f%gc2eK~J?<4@2+>_?2#dm@oy z9TXtj??rNKgA{q-;UwhT02=awx-AIp#A}E>h^zpPj4iib`WrDbFn};<CYQDAbS*C&qp_wGcz!NFjC>^lv;#V znS!HYdqg9L1@mZJ#P&nXu-wZ_5*7;4nxX2aJobIYr5@rq%?}=3$WUybulK8 zw#M{@2ark|a7nRt4m$05ZsJ@zLw+@AQqOpah- zV2EIuKJh2Q9guK)`jbPFWx6>lCnSuKO6hD?PIz=c@*G+zeQ|&6Ge2eq20!NM0lb`O zCHf*>PJX1S3dvk=F#_h6GR}RN#>~Kw#ys6X4q-0Xf8eUANe;A>1>Pv|8H&( zA%&l!Y$T5u_++H%Z_E*n1IN~OI}6V1kaU8t&J4&;NzVrzwv1W9qlGY{88_Y511Z$d zT5RB^7$UVnW@n%!pjT=U+I}#k^as|s=isS0304LM5JoBjd@_rZ(8jbuXBuz6y_oA3 z%XF=cT&m#m@_+PV7DHwR1`tLnFTFEUQEC%VCKtnQ%5{t2v zUr5CPI2sj~rRm*bW?%qeq-gX_%t2d&2X2jgtK*yvNsr)mA#z=VTzV$v#e*8jc_@un zNa{z_IN)3uwe!xaE@lRXF6QZPCnLoT$hPV0r*m>{_nN}#1hEnvQpl6{NFn84jOF;t z?TATy@Mr;(`Q6{3J}?M_Mhn~$lS}f^=F`CgKp&QIa!of{&MBmX+Sy`YU}BJAaCbsZ za!3gQYzcA-0$Jkjr0a?{7L23?JOqr~k!1#1;EOQ?j6ReA9&<+42O4uGrt=FP;6~O6 z8sG*E_!8_k}r{;@Mbh?O_s zUVhyrPI%iBwu$o+Psr3b1_lNY2IVZzyp+tuJbmZCPRGq%yGACqL z0pdvd>BlZ}qE6kT+?bPVd87%vXKA|PRZe(o8#GIq4_>wo&SXfY*<3?X1*)21rh$uE z&;8|7!CMEQ$C$&MoKcinT#}oJdYm`7?R)oNIzc@) zs7~+HqV&?#9JDbMu=dG!IhCe!--Cum`j6FhVExmz?;(|MV3i&BAQpi$GxF{bP-gZd zuq{LlR5T&4g=1roVel+2N=!v>vqI+ake053lRDyj3`kP+p$3FP>m<=N4ot1od2_gt13WqrXUQ;|Gua*e_&mp zdDD|j(>MI(6r6sKi3>7$%FfJ%oSVUobj0}^kVd+1YDH#pzP@{EUMkw^P>drv5GPLE z=j1}lqag31o;U?gafqX9AfrxDo17A}5<%-%P!lYuFoK_F1NOC?YSww!%o5nw*h)P; zDJ~gsDsZ`7kO`Vb1YuBZAXp#?YyLeZNe!9vb*4KNSZq&*>i>pgXD< z_VKyKGB7a2P8W3KLbT?=g$?+avRp?l?diTT(1o;1SdDqXSsuEO7G_mIVh-vmXvkp- z1x{Q_(_Mc+_YnU{z(;*B zFff2xUod-IL5HCwm7+Cl!2WV}<#GiZ04aZ8@cur*z`y{)pf)SqfV9LCv}6X_!Cd3U zHG8_Q2Nz^|Z|$N>iJ1%x44KpYJh;$``86I~#?!q#p(!#1lKgjy|~1tudIaz06bpM0w5qUJwF~qprkM? z(FLwbvhwE5f>;{mgB0KhOQn6ew7_LR)UmxQz$&2|gkj+ol30|8?HCcTlXv?GqH`s~3nU%|I#6dU|glm+Ew`ATDum>)_SVZSm6>7#OB8 zOxF)WiXV`flN&NQrgsN%B~G6Z3^n+$>7Fg%K$yNUml$iTobkzu++7@EJP^ZSGL4TW*V zfOjf`-TXI$k0tzxFff2HXw(*_-#Z`F7(hu? zVBNFhxvIb+3GP0YZCv98TP6$|@`LGiPs~lqL_5G29LH&iTuRgLC2~Q|eld`EeiKp( z{7pp4JdU6(4}+nWtllSs6`wi zdZuP_d4bQB0VlN{=YKb#sdzyaTGE^rz{N5BcNSObbb%Z$$kt5cY7W$1gxTv@nw*W% zl>qf}w<9V&uziTO(sceZ>}V49H(;04eSN9ay1+@0$Plcf??j`nQmJPEmy&zhG;5GKV6Gfh#@r( zz}6v31V~d3=CR6aB*4}ot$(ZQKqLxKVg?`Yj&1!LSmUBA8|+UrGBBKG zoL)Z>kqaQrp9>SY+8L*RoXVvQR_oli;?P$H28OQ;)3v4{r37$FZJ5S&a{AI4T*BZs z8DdbEfq@N_+Ve5e8hEY%F}@4#RqsI>v;y_2LB~LsrlT$doQ^hL1#V;_w&XD|fEt+r zL8xmkz(pf`J3hEECw*~h8>p2D!l1@nKyZjf0BTEfI(X%u&=xLn=INr%OiEy@kPk5e zSrz1uY85z&&<-yGYeZ~)g19lr-y0<HE)ep{-p)S?B_84dc4t97u?R^&zY5LWA`ka}tZOTnUDL%s$e= z%Dj(|GAXziL>#OPZYUwH;eo7*2HTQaT9S$0+XPK!qFp@(&OL}~b$Z|@E)n=zLvXai zTOZ)nC&(AvfL5P`2J7QoO>FR!3;AjruvLi55T<`*});bntR^_7|0S+!&P*21KYe&As z0~$hD7CR%|-vJI6q~j7Fs&OOwGT``zAD0Nu1@I&d%LN1%ae=j+Onf}=5EBCf2!jfT zaMUh7Y;kWc({uq7Zt>~cEVxy{gDr^pMFs}YU`x1ea42&4g9q9X6OCX!$W8?5A-r6Z zgO`y>jv0QR`1FhR+}fb)!KVj0am#>nGW=fB=^75)ns7NY(AW-qvl#e5Aqm(*e})B( zw?OM+Avce^BxZxQm$Nd!^;&}T!fz1=A8L!NH=mIKc5As`N>*ZSDkudYX}17rN4A=e z0a?2|6I{DvQf5jPC^sVMHV5g3dkWnDMb^Cyq1z*|C=s+m8cDMPNHen4LMT@IGEcwf z$Sn!?s5MAA;x2Mf9~jxL7tC;%IwuwjaICKjg_m7;jl6cmNXS&$nggx3qhHA8Mt zN4FPuOJeo0ahXk zw;XZnI+Av9m?5VP)G)gt2GBo5c?oS&DN4H}k1*NuArIjoXpR*IUY!38L?X4C@BUka|-Co`!i6|;N+rxw&J+mYS= z3Sj``0(T^bgCh)nVLL|AVk-l;+c!V2D8CG}z7AbGa)hB4rJoVnUEsI6qiaWwGF0vR zW#P7mWacK7W|yGm5(1$fE(h1{o0yZBl#i0dz(oOWyWh!8KktoHsDkZ6R*sr9+vMSP zIYF;}NAf3FGjg^<)hwd`*X*5{o|uE0Jiwaa*T7@c<(m>cmPM|{zD$&{he zM-3%jHMn-zeep<61#89~KT8mrof08e#v^G4m-EOukO!r>wNi)M481iTNiR5zkh1`) zt1qZe7w|`~Qc!PG~%2cfrz5!cb9 zx4$o#A#8Kb$jm5B%qUGnaW1&hN8E=C8vRDLFVzxZfMZE!c78TmX9KJsc`Ghzqrt}t zp&xONJ(7RH$r}0Y7Sv>Y)()W`dXGJlW^iC3Zmmae?3US2j}GCMg2z2L7r+m^X8;{= zfb7>#P7IS9+eI;Q0kZ2*b3w23be>S8Twn`oxgifOpfW|>&MzslXtv$M)jChb9Ib>VF5sZ9-0&02XoQ&|dFZ8y1B#&dH zCQ%eOHm6MQi{zGpI}coTwV>Q~j~vK~sYsTk=B4C=4!uUV4RP5$dSN7yKHV+~DLH@x z5OLi-dhUIe&M;Z;K4w=HIdh4m% z)K)S$&!sL)+*r)azyQLiWwS~(LVIu~dWHqN6>%N~`mn;iI)>@%W4T4)X%DO(`AiDb zqE@Y(RQGnr^W5>bnmr#4|H6fH11{GdmHweN*%Db2IZ&QHx)2^c?^2`?(M^0|N-7 zHWi$E5e9e`Cgzl8mY|g0VAmgsdg}>3+7vu(ha9`}CLpx?B*q6MR-x!7P#DKeMCf)* zNz6vk3$Eur@V#Y(ooJ0(&nZns=ylDB4^GS}OH2VB{D>6v_MoZ~x!r-9mG2=L;hbNT zm=o`jSOnVThT;xzx&A(ZTblXQG=}NCiAWVAI63{b$ZD-&W?%qe)Y4gWI>U7S07jIe z7OVwv?-6?8{A?D(^rMN~itrQ*u04^bEl{g!-}#78@JlU^kIV;MH-r=fVEtj&bGxQ6 zFff2Hs{YMO5c-`Gi;@ykKucDU^n+tzv81qb83O|Y2&2Zr#H9%R0i~&+yJdqiL0cJ- zi~u_Uxj;pALdY_N5srE3rI|TsLq^~rOLC2_OJ`{`UVI92%{>DHs-~-3 zpqln#XzIRpv>TPTntSg z72Vpf2gKV0P)%nyGjd@>6>=Sj8tPvTf%S<_uie4Oj-fATmU8?KMg|5DM%DNA2w0!+ z^aB~_QM^kk*9H{mAdDLD49B6GfgUYSQnOp?+ zSm;<>nwOjj+K+~0A2>bzH51!g&&y<=P6<+~1Q%z>0M9uN%6%jUim1dPzqU3n6Wo&0B ztiHs+zyQLiwfin*#_3*VNVPjSfg=uBL?4vAt%9&DC^bD3ZSe~@Y@a%3xk9d#MX#!s zsUdXxWfnkggF^}#u;rg8<;~P*VqgGa)Z8Vch0yMsT9lcB+AIL~iW9#q_ikZkU;ts% zA<9l2gl<3ZVGc+(gUb>43L)_BJy?@MfZ>H>umM6Zv>m698O&~`N{1FQF))BIYKwEO z0poP93T}DSW;Ak9DudGYo@mTCePso=5~_Nhd^6eEObiSljM_NOGh>|IbB0L@qY+&G zer@_hCI$u&Ms-q@CFAsrN^~cExG1s%)~-YCL)h6cPVczIB#U9iwT5G9>zNoBKp4$c z_Keeg9$|5n-G50AT_y$w5JpXpc}|Se`(H9iVAz6K3Wwgte&xbA{eBfvod8ZnxEq(} zJP>i|oLC7yfEy_#fHRE9+^?UUnHd;B7`4bO^JJXfTa8p?f>Vw$e2W@-Zf5gE*yfv9 zl?XbC93|y|vkc;}T=Xon(jTGUFTW^1F9S8vgPn`qi9@Y0g#sC;Ppm--9I$oBB|K{B z#}|ySE+oIGBp=(LfxB(q!*m7)1`tNozATt=xR0g_Pi<#lU;ts%${;d~ak_#yGfI;KTx`6Q zm~OI_fq?;pQHu?oaD)?mGSPY>VCz0=t*UKdU|;}Y)ZkE$V4VKG4kAm!ko+bb!^pq@!lGw zy1%0UOMer&L4_IxtMVA9uWdq#0&o&T&T*(oEVl?@pLx$7(f`+y0hg7?JkMs#b}Lxu;mXcbJk5~VPF7ZRLf1P5xRZz^ODi~4&azY zJ`)->WR6|4gl!?9O0ooXG7M}T@&QT^vX8DXOz=!!Db1#V#7;mbFAKVxEG0AWwJU(KKZ4Y#h5D@!SflWdnTNMHT+RSSa=D-grLOCyvq2XOst~|6;7Rn zu}lmMAdKpW=H-mj_jDrp8k~TUn}w)pLT44iO7Fb$uk;w7VB2=B31gb|ayf0FEZ-0u?6M3?yo>D{o|+ey|ID?BKoM1sm9&bJRrfdLxpJ zrIp~r43XjpoTQLXaYxm?b`wIkM`9VeZg3w`uY!3k=yp61M(sm(ZbRsHO3XlOgn>gE zIX$9=bleVvX2-meO!Pt;YPQlfUhz(w&?%X|^=HhGlp8w10F#-pfOgDdkvyUmeo0q3CE-#K2v^rJ>) z+8z|E!}1|_gd!OLcEFzV6LmTn7#KhpwJzY;i(-IFVp%5Y8~`{iA#Z&}O^vtrGEV33 zLrVN$2d4-ec&5z6zyQLi4nBSm#lC>VoLp>!r2jW`TApKMU;trM2b&&YoW8FQsoe$6 zE{vJ?9ASH%Q61=e48_8r{E`gtP0UC^1oon=@+H$G1_lNYM(vNjKgKxyo)U`;M$Zp9 zR8X6fOO7*6Ki!YsT>WJ$EAGR@zyQLi)ym}4jMMMxvWR0?!Shme8~DT>@Hq&ujz1{n z=$>Po-Y@|v6N4jqbK~bJphyN`)Np%n4ka9%6TzpRA%y}sJzuovmKNT8o{_<^2$Yyn z(=xayMLwkqwJ809(B_k$mtL8gSd>%=Iz|V{67VK)U5052Ny^O0EJj`G3|`2NywMbO+r!DLPzys6Gr{}Mk=zPS z7CSG0=xSqNU;ts%(!uRI9@^>$ zutT@ss^|hk(rl{5~pDA zx-yBg&0t_)0AW<`3fzb4^-avnMC<8;wblyG=$OICzyQLiTHnI7I+j!xp-pLk&kvX} zb!H#r$W_pWNn{tFdI+~QIT5v?2G$9`cN~1MJhILYkD)pP6HCx`?SVtMn6>^Qh(xXDnjc*fKy}VZjrT|%nS@5jG7vI zUqQ9HCFUlkm!hv>0$Yr@hZ3|=7umb_-a>T;Ct?hhg0&*=B1d)e`FBvQprtoxvk>6x z2si%PzyrCZ7_t@1Xfudl zjZ2@`=!5PW2Vqo=4qu@f{lVAZBE<|iJyajz*tC*?fdPcMP;AWl4%O(An2feJ5ga~O ze>6qIYIM}_3I74r8Cq1DTZmei5wP?#Osh*qB52Pxl5@eS0r{jo)YS0cC)85V;d}Ak z`DmFHoP>Y9Se>+=fq?;pQ45K$zoELF^KB$bp4w^Qym4-QJ0yOTUXy5(T(ItohsH3@X+@SO6u8-2XxKf_8HjXC`G9fzF9W z3Nx_X3~KA1yk%ry0AWodSVLN0(P*kk*{4v4ezx~P`%!XB^l6LSkY}p z4l`7n)0m;Uof7lXvq5*lBk2VvFVve#k@JuU3si4VW@TbZ21Fz)KR6#iigi%8}l@)5IcTr+-UVddFdPsxY;T1FIcCj)sFn};> zO*@SpravPwFQpP~79ZRPFws<>)XK=f0K%w!fJdBA&CVJ5nMsK`#b_}Fw%aZ%nf)&# z0|N-7+P#4rsy(#0MAr|!<;VeAWCOZ{etNwtx0uuyUZ`Tn;*9K!#3ayN21ro@&c5NY zQ6$5JWh?IqD zb}3E57S2257P4+;U|;}Y)Uf&j)9D2|QUI+12re&>ZAJC%TREt$zNN*s8(;#?(KM=(%gblRJVi6InWV0 z(-o?@#iTNHp&F1*(Lo9%a6;x>lg|jMbU_$3As6XEb%*4mx2nMQfXmZ-4{kBZ`36vx zj-c8-2`%}70|dE*Kn;+uhEUCspb`ShY{`7B>~`#n+>aYEO=nz&G#LOMV~}LeV1>2e zQO6kCjbT=$W+#@U7G>rol@_7)cfetSe8MVfn4C6+nh=toU5VQB09USgWkIE|Mlou- znQaEu8Jd%rn3t4@z5j7Ov}5mf1_lNYM$Igq7Et}(iA9OY8K?y~*wx>H8|&UMGBAKJ zs;k{Bp?aM&GSP|^a5lU6?bp4_j0_AQjGE2Ltf4x+6LXU@64AGLfHOGa+<){w(?naS zZokar{9?2*L2wzI5*GNcm4Sf)gi*`jiw;n|zKPkO;c?W24z^gy_klWSBoc&C18c4$ zRI^hisIEj^Mh+e?2$=co|1w4f1`tN|a-lQRbcdBli3)62E4S&YTZ{}0AdG5PyerhM z$kd|LGPG6;I6=x@Nd6BhNI)1hLDsuN^#&KErsSn&=jT+SXEktR54oL)+SuFd2{pkn z1#Jii9J9D9S6?rvM(2$Dy!1l!$`u?)$f+5%wN~uSH2vW!qQHzKJ0Z`peshLHksFfQygprdGY6zQ#K(&TumFA_# z2PEdDB%<}2z?p|tRPO0XCI$u&M$J5Ip->YXbJ16Nn1Py=)^{V*I~W-lKo~V;2uDD5 zIwhuOq@Xo2!O7pdfB)MO1_lNYMosvlh6WMBYcRBKCOpgMySvojLG*S8>57~r&6!@}?Rj*)=@gi+Jt zoH(dvr^Ia3iVdvsfl2Agxr_`9AdITyE`VlrBC1;@dc_v@NrcRiuDh>qtoP50l3G`J4-A#!Pn>cc06 zP@B9<%M;O7xr4{mZ*Jt47HueEVsHd4vnt6FWmLq9*tjaG!+fWXk z3J7%D6bL!07kyKzO)Zjk=fr~4_^{NX6jT?0{oKIE{q-#q0|N-7W&^G|rs)eeBV_|{ zO@QoS)SAGt5y?uoM0EdxTTwFG%WuoFGBAKJs%< zGEHB&1!)=#Y@bid@1Dnu3=ANQYM)atl6}D?iFrBL)>9)NK!Ivsem~RngRilq2w{$u z+1HpD7(f^`O1UN=SqZw<9PPLwun#%*pEQKcqoJuBk;++cE$R}IFMN}MfdPb3y&*gWS*K5CUP>x@T?lrT-lew}4lpn< zfH3OJnZ;D5Y1@(3V}Mi1y>*YQPckqtfG}z*ahry0VR&jWYNZd(6<;^qSO_^*8hy!Q z_;h65uBFLnGZSFna@~xd}BTOBB= zy3WMF0K%w~f-y^&rpNC@UzIv7tyvi4I}k>7VZ(A{8=XswiZW5{14mI{7#J8p7}X2Mw<4PWx)=i03t;WYNgP%CtZm5J15%67LI9khmTq(8f!xH& zz<@e+y=FVp^u4>0rmn#?G;)Zc*3cfik*#wC9dU~kSQwU}=H9FOn5Jj%LCU`1^p6}g zsHvmi5VB=1iACjTGe}_jkkdbEMJ5K&>5!Q@s7(oQO9lC8 z57d@QEkYYc=?4x8Ms8*?5fxFN#8SP*$uvQ(UQ!!Ar z7G8yG1s&ImBM6q=U}6AOWGQHs4mg7#Z@ogzAkPun5GNxerCD&>26-0@YJ%8w2X3oh zYI$0IXjPXj{Agn&Z-aFsAKQeg`@|QxZuk+yNV>t{j=aGK zHQe2Q!gU9O&ZI6$&PXjs8x{fIeWJYg=RDBGKp@PFGX5_9n~A|0bdE5Rt>7G`b(mXP zDEA)|gL6h^PAY1K0uP=dFQ!H9Dy)U;at5vI$V<&D0iCjrWCOU$K^!ZOen8YtCT6I$ zkO=WC#z;=!J7Mhh8czb9unxlPDBg-`fVl#1`tN9=>bi?pAleYa80i) zKy7J(-G+QyI;z{A2{SW5?$$%{57=$Ti(fY&EYyrBw1z#*Aleu8o1xNRMPnb=u&$SMja+u0M!G!d(Y4i zC1-;NEMi_%%>i9h2*RiX7HV=3+uVIaw2e?Sf<1zKpggKaRzfv`kC;dDKiIwpb~*16 zm)j!;nT9;vK3yyhMZQcB)uC$;8bOx?qTAU1?nE}ocOZuuHXG zSXY2t3Bsr@HCKXI2#Q1#6pi3?({8vh5R_&>7&YDOLTJ=AM2&uMqXF5Es4Wf$Wr&rb zd7#D1#b^Z(*uDLgIic7+dK9V|Z~L``*IjfGmCt=Ki*MAB%6;#9CFV_#1F0`edTqk1w{9buy(YIJ}T0djPp zCW6N>orvo<(IX{2BkCO}bU+w2gfcYX)@oxZ32YgKAAvN1FsjDaNE%U{3r;=AX%;p0 zfaFkc_$iD4k@&Rk)d=PL0 zW+ke|Ivu!`x~SzV*sYI_N=U#oqJ}GzE?lEFTBQZn>Ct-aGbpu!FsjaWgic*U)B?{4 zR5T;U2x`&Hs|U9eON4Bm^Pn2$R#Z>+BJ}B^S_lrEcZ)2vuxk|5hg+zNTEK#9d~nBV zDo9OfQGNkhI}n`vkXtOMx$hc6n@edD`V0rSWsH1(Flx)#$&{G^dLOk@YED`r+OQP3 zW40z#S|9tdG7qenrzc)QnluAD6>+0D`ofH#ws6~`64Q%PQ4gU3cRr9UL+yNMIl?uE zC8m_39{&dJzRxh|{RJCVN9{p6xFGcA=cMPS7okmFVR#fZjAPuGr*FKBwB#CWAL0^l z^exWCo^bm>TLM!v5_3_zJK%sqjuuq=ruo42`{d`Pp!KxCntjg)t%+e_U;trM&Bj4+ z&A$10iD+k}fqi=E2$O&XGXnz%qxLGUg)vXNiZuTK_Glm5Q}qfK1_lsD4cN#ixLxj< zNkyO=zES73!PfaMbCF47VPF7ZRO_VUnWwMCurGJz?U%3x52*H?Nru}Onp2sWmtTgq zb`or#?c4c#V1rDk`uWnBrwhJe7slA{fPC#ZY8F|V$vl0-HKgftaPTiK30?7unSlX> zQG@?lF5HQ}i77>ys0)U{iTuX|Z&z(*1_lsDP2}uFaLvK_Y1qbSk#iTS-zrMsdVR7= zlX9}K?s!7hkLvI>6>$B*+4%)osKcM&gwXyVNd$WiyIT#{>m5R^N0;Ry2Z%fdPb32lLoEn5P>!aG(t4f#a36YvoQwCI$u&Mvd21U2q5b zX6B)#S+M84wEdsMf)>?tg1vCP!HGqQCHbgxk>Fv1J<|_qfl?C)qvkN}ezto)b(*BV-tk)B_akD8OfHfM>?{FK4WzyQLiHW$x2%{F`+)v?}0}_kS zHmrj6{@u1Q;wU2n0|=w)-SHBx*E_Qatq=!0T2VHV2X^2ds-q9ThU*QM!J>F2n`r zfT*2!UUe}uFn};>d|3*xOuz6HDF=Xq33+KmB7(f^`1kbCpFnC~_ z%RpWvh8kDi8Y~Q+$*CBVM~IP)AT1UK$Qf~{GhEuj#&iTpM zjtfV=`37~;&RiRACFq2Nyu`f3qRcYXd<8CxaxITE!8W?1mPPD3a3h>E64TM_2iM=o z_M_I{+Yp+46D#ve(5@N*_oh7emrsRlxj`+m8+DPaF3Kz}$xTG9r@+P8Y@b_dFsGvy z2}*i!{l1AgDVb$xtLVT!M|M1_&o3jiJLl)-7oi3lxHx(mcj`9mxJOjC&(&v{9{2{S zx&aqQIt=}VFu$S}M{x#7Zp}b#IDmuc$nAUgU|LbF`i0Qyom!M$nwo>wwE;&``j6Fh zF#V{JG}{nvbx>+)9{MS^;F1G*KNf1qVP(X^;EBEw%K$X+h`g+n4W%R$FlAxzEG|k+ zMQzoCOGD(7hfs6a3JVqnY$pzZiz(#29jL|BPD_wB@crXR!`$GJO2m!u=zE=8tXLSl z%M-H_b5hZkxPWa#zSs)YwhU_)2A|BNO4R-#xVXs@uBre{ii0p}akJWng~1nXS{G4n zFgma>_@-85Cg-D;8{ia(e0ULRv^qJkO#6T|U;|DC$mbEFD*xgHx5X(jD=`>t3lcaD zBA+&fng*x3qUZ*#nnF#(;1G~g%{q^L@;Jnkg~1nFf$MU+AQLok48o|%;XFi(xi8w} zF*xlZA7zZ1_Hun$82l2;60=aVGq~th-q}|Jf@sGcbTKs`KPS zK{|AuJsd+&w1MLleA`%41PcRn83$^_f-8icT@U|;}YROffb zAQ_OBh*lYaE0eX0E+u9%Fff2HYGpDb7NOZKF*`9o4K)FQ13va_p$RPLPy^m84xv3H zF(b1CwKoBda;`95)d&U#1`tM#@|Q@u!xOVnvlckmkfR(m*xKU}HU}i8gYGy=M|C>5 zAj!&`Hw$Dj2&3k0{REcj{NIqOGO$;pj_q9mQVYVUUcH!rurMUCC=u;QC2&Q!Y|`$8 z1_lNO5Js&C3lkB#BNGcy@($SIr=GjZCowQEfH11XW=ROGe)*-jsi=i8*qbu<((Pjz z7#KhpHJk*JS*FK*M;b~2Cx}-^x5ZCmU|;}Y)C9338QHd?wEP^@{b=CzREJIXYypK3 z2%|R5rl%mZyO$=WB<3V1=Ao?|02jJz{_pXg#lXM-!l)5rlZr6HD?cL-<0L?EcpWKx z|7#)x0|N-7hL=JbLVrMhULx87li=L+Nxj4rw#fiBH~mD??Uz`JcHc2LLDy&Qb%rhF zMorKM(-Bs?mnNc)L4hqsPSB_p-_1bi4NlC>#}dnWR);Ub?(0I0<;F~w>4h;|m?v@K z4rbRZgnb_QdHFe|IjH3pIG7V-^L&>xFff2HYA|bNBlLUcgPJ`ki5i^D$~La?f-U?< zO=c1~2;J_9xk;I5=XHV8h=IiOo1h{Kgi+JTb|mcqnI*}InP^K6!4dVT$*6r3BLf2n zqefI#F2Z`Z%q-MW3+!~{^o8p5q})Uf9)M3~{5m{p3_hzAEAa;=XVc(0LkJC-JA=b-OL z2N%7_tw_|wcC{2?JNDKjI0!uFP1p=7AV3&32o9DZ3<$_CDv9?6Z3Rj~9d-a`7vusJ zHM^vjBg}BlC@n=TrNGgTtQj@>^(qjWLyFM!f(z7_*X)#P7#J8p7&PXiDKr2_kmLr!*sFokE zMQ9IB%tY@ofOR9UBSqEyv<{&gvXT@fmxIH3(UlGMrx_U-Ko~Wgo0<^19ShKAJi+1Y z+_&P;R|W&BhNRWHh?d;vM>bXVoKeC8+|QG~IJFJbs0U%xmUGtx7KVV} z5Q_k`hCSFO_TV()>DeSQtWsQF|TWb{TTN3AJ683DJUe$v!yDkZNf$D5hFaHyos4|QT12r>E zI?Td=zT6S4cc diff --git a/src/time/zoneinfo_read.go b/src/time/zoneinfo_read.go index d8d4070d5b..d54632fb49 100644 --- a/src/time/zoneinfo_read.go +++ b/src/time/zoneinfo_read.go @@ -59,6 +59,16 @@ func (d *dataIO) big4() (n uint32, ok bool) { return uint32(p[3]) | uint32(p[2])<<8 | uint32(p[1])<<16 | uint32(p[0])<<24, true } +func (d *dataIO) big8() (n uint64, ok bool) { + n1, ok1 := d.big4() + n2, ok2 := d.big4() + if !ok1 || !ok2 { + d.error = true + return 0, false + } + return (uint64(n1) << 32) | uint64(n2), true +} + func (d *dataIO) byte() (n byte, ok bool) { p := d.read(1) if len(p) < 1 { @@ -93,9 +103,21 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { } // 1-byte version, then 15 bytes of padding + var version int var p []byte - if p = d.read(16); len(p) != 16 || p[0] != 0 && p[0] != '2' && p[0] != '3' { + if p = d.read(16); len(p) != 16 { return nil, badData + } else { + switch p[0] { + case 0: + version = 1 + case '2': + version = 2 + case '3': + version = 3 + default: + return nil, badData + } } // six big-endian 32-bit integers: @@ -119,11 +141,53 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { if !ok { return nil, badData } + if uint32(int(nn)) != nn { + return nil, badData + } n[i] = int(nn) } + // If we have version 2 or 3, then the data is first written out + // in a 32-bit format, then written out again in a 64-bit format. + // Skip the 32-bit format and read the 64-bit one, as it can + // describe a broader range of dates. + + is64 := false + if version > 1 { + // Skip the 32-bit data. + skip := n[NTime]*4 + + n[NTime] + + n[NZone]*6 + + n[NChar] + + n[NLeap]*8 + + n[NStdWall] + + n[NUTCLocal] + // Skip the version 2 header that we just read. + skip += 4 + 16 + d.read(skip) + + is64 = true + + // Read the counts again, they can differ. + for i := 0; i < 6; i++ { + nn, ok := d.big4() + if !ok { + return nil, badData + } + if uint32(int(nn)) != nn { + return nil, badData + } + n[i] = int(nn) + } + } + + size := 4 + if is64 { + size = 8 + } + // Transition times. - txtimes := dataIO{d.read(n[NTime] * 4), false} + txtimes := dataIO{d.read(n[NTime] * size), false} // Time zone indices for transition times. txzones := d.read(n[NTime]) @@ -135,7 +199,7 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { abbrev := d.read(n[NChar]) // Leap-second time pairs - d.read(n[NLeap] * 8) + d.read(n[NLeap] * (size + 4)) // Whether tx times associated with local time types // are specified as standard time or wall time. @@ -149,10 +213,6 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { return nil, badData } - // If version == 2 or 3, the entire file repeats, this time using - // 8-byte ints for txtimes and leap seconds. - // We won't need those until 2106. - // Now we can build up a useful data structure. // First the zone information. // utcoff[4] isdst[1] nameindex[1] @@ -163,6 +223,9 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { if n, ok = zonedata.big4(); !ok { return nil, badData } + if uint32(int(n)) != n { + return nil, badData + } zone[i].offset = int(int32(n)) var b byte if b, ok = zonedata.byte(); !ok { @@ -186,12 +249,21 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { // Now the transition time info. tx := make([]zoneTrans, n[NTime]) for i := range tx { - var ok bool - var n uint32 - if n, ok = txtimes.big4(); !ok { - return nil, badData + var n int64 + if !is64 { + if n4, ok := txtimes.big4(); !ok { + return nil, badData + } else { + n = int64(int32(n4)) + } + } else { + if n8, ok := txtimes.big8(); !ok { + return nil, badData + } else { + n = int64(n8) + } } - tx[i].when = int64(int32(n)) + tx[i].when = n if int(txzones[i]) >= len(zone) { return nil, badData } diff --git a/src/time/zoneinfo_test.go b/src/time/zoneinfo_test.go index 4458ba8e26..cd0731768e 100644 --- a/src/time/zoneinfo_test.go +++ b/src/time/zoneinfo_test.go @@ -152,3 +152,24 @@ func TestLoadLocationFromTZData(t *testing.T) { t.Errorf("return values of LoadLocationFromTZData and LoadLocation don't match") } } + +// Issue 30099. +func TestEarlyLocation(t *testing.T) { + time.ForceZipFileForTesting(true) + defer time.ForceZipFileForTesting(false) + + const locName = "America/New_York" + loc, err := time.LoadLocation(locName) + if err != nil { + t.Fatal(err) + } + + d := time.Date(1900, time.January, 1, 0, 0, 0, 0, loc) + tzName, tzOffset := d.Zone() + if want := "EST"; tzName != want { + t.Errorf("Zone name == %s, want %s", tzName, want) + } + if want := -18000; tzOffset != want { + t.Errorf("Zone offset == %d, want %d", tzOffset, want) + } +} -- GitLab From 97f81572c4a97b6539f0a7b3ca3089daf3d6b4c3 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Sun, 3 Feb 2019 16:07:39 +0000 Subject: [PATCH 0131/1679] bytes: clean up a test Change-Id: Iaa0e1721996b582bba9509c083755e1f125abb6b GitHub-Last-Rev: c9b13ec0cdc2b22aafa54706dc6df6113a11712b GitHub-Pull-Request: golang/go#29996 Reviewed-on: https://go-review.googlesource.com/c/160420 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/bytes/buffer_test.go | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/bytes/buffer_test.go b/src/bytes/buffer_test.go index 6e9d6952a5..7626d277d4 100644 --- a/src/bytes/buffer_test.go +++ b/src/bytes/buffer_test.go @@ -131,11 +131,8 @@ func TestBasicOperations(t *testing.T) { check(t, "TestBasicOperations (3)", &buf, "") n, err := buf.Write(testBytes[0:1]) - if n != 1 { - t.Errorf("wrote 1 byte, but n == %d", n) - } - if err != nil { - t.Errorf("err should always be nil, but err == %s", err) + if want := 1; err != nil || n != want { + t.Errorf("Write: got (%d, %v), want (%d, %v)", n, err, want, nil) } check(t, "TestBasicOperations (4)", &buf, "a") @@ -143,8 +140,8 @@ func TestBasicOperations(t *testing.T) { check(t, "TestBasicOperations (5)", &buf, "ab") n, err = buf.Write(testBytes[2:26]) - if n != 24 { - t.Errorf("wrote 24 bytes, but n == %d", n) + if want := 24; err != nil || n != want { + t.Errorf("Write: got (%d, %v), want (%d, %v)", n, err, want, nil) } check(t, "TestBasicOperations (6)", &buf, testString[0:26]) @@ -159,15 +156,12 @@ func TestBasicOperations(t *testing.T) { buf.WriteByte(testString[1]) c, err := buf.ReadByte() - if err != nil { - t.Error("ReadByte unexpected eof") - } - if c != testString[1] { - t.Errorf("ReadByte wrong value c=%v", c) + if want := testString[1]; err != nil || c != want { + t.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c, err, want, nil) } c, err = buf.ReadByte() - if err == nil { - t.Error("ReadByte unexpected not eof") + if err != io.EOF { + t.Errorf("ReadByte: got (%q, %v), want (%q, %v)", c, err, byte(0), io.EOF) } } } -- GitLab From dc0455225acdc98685064964defc6df7cd3d4c40 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Fri, 22 Feb 2019 15:51:40 +0000 Subject: [PATCH 0132/1679] net: explain why we ignore the first line of Plan 9 interface-status files Change-Id: Ia0847790a597c35ebb572db6fc1b7534ecf8f006 GitHub-Last-Rev: 03f039d0abbce0e2a2bf15201948e46354950a22 GitHub-Pull-Request: golang/go#30022 Reviewed-on: https://go-review.googlesource.com/c/160446 Reviewed-by: Brad Fitzpatrick --- src/net/interface_plan9.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/net/interface_plan9.go b/src/net/interface_plan9.go index e5d77390f8..8fe9138406 100644 --- a/src/net/interface_plan9.go +++ b/src/net/interface_plan9.go @@ -152,10 +152,14 @@ func interfaceAddrTable(ifi *Interface) ([]Addr, error) { } defer statusf.close() + // Read but ignore first line as it only contains the table header. + // See https://9p.io/magic/man2html/3/ip + if _, ok := statusf.readLine(); !ok { + return nil, errors.New("cannot read header line for interface: " + status) + } line, ok := statusf.readLine() - line, ok = statusf.readLine() if !ok { - return nil, errors.New("cannot parse IP address for interface: " + status) + return nil, errors.New("cannot read IP address for interface: " + status) } // This assumes only a single address for the interface. -- GitLab From 4b05dc91b0fe99724721e3545807f3b8f1310c52 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 26 Feb 2019 06:31:21 -0800 Subject: [PATCH 0133/1679] os: clarify that mode argument is only used if file is created Fixes #30400 Change-Id: Icbd1dda29562afa80c8e37657133a6fe48070ac0 Reviewed-on: https://go-review.googlesource.com/c/163744 Reviewed-by: Rob Pike --- src/os/file.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/os/file.go b/src/os/file.go index fdead63bfc..8c25cc0a3b 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -265,10 +265,10 @@ func Open(name string) (*File, error) { return OpenFile(name, O_RDONLY, 0) } -// Create creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. +// Create creates or truncates the named file. If the file already exists, +// it is truncated. If the file does not exist, it is created with mode 0666 +// (before umask). If successful, methods on the returned File can +// be used for I/O; the associated file descriptor has mode O_RDWR. // If there is an error, it will be of type *PathError. func Create(name string) (*File, error) { return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) @@ -276,7 +276,8 @@ func Create(name string) (*File, error) { // OpenFile is the generalized open call; most users will use Open // or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm (before umask), if applicable. If successful, +// (O_RDONLY etc.). If the file does not exist, and the O_CREATE flag +// is passed, it is created with mode perm (before umask). If successful, // methods on the returned File can be used for I/O. // If there is an error, it will be of type *PathError. func OpenFile(name string, flag int, perm FileMode) (*File, error) { -- GitLab From b97e40fc30843ebbb91f1ae38599a883498d828a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Feb 2019 16:34:48 -0800 Subject: [PATCH 0134/1679] net: remove unixgram test sockets Updates https://gcc.gnu.org/PR89406 Change-Id: Iccf2760e42e9caa90720b96e74a805a9c0d48f35 Reviewed-on: https://go-review.googlesource.com/c/163277 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Mikio Hara Reviewed-by: Than McIntosh --- src/net/listen_test.go | 3 +++ src/net/mockserver_test.go | 2 -- src/net/splice_test.go | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/net/listen_test.go b/src/net/listen_test.go index 6c3f70cc7b..6c9b92a9fc 100644 --- a/src/net/listen_test.go +++ b/src/net/listen_test.go @@ -780,6 +780,9 @@ func TestListenConfigControl(t *testing.T) { continue } c.Close() + if network == "unixgram" { + os.Remove(address) + } } }) } diff --git a/src/net/mockserver_test.go b/src/net/mockserver_test.go index 530293578a..e085f4440b 100644 --- a/src/net/mockserver_test.go +++ b/src/net/mockserver_test.go @@ -17,8 +17,6 @@ import ( ) // testUnixAddr uses ioutil.TempFile to get a name that is unique. -// It also uses /tmp directory in case it is prohibited to create UNIX -// sockets in TMPDIR. func testUnixAddr() string { f, err := ioutil.TempFile("", "go-nettest") if err != nil { diff --git a/src/net/splice_test.go b/src/net/splice_test.go index 4c300172c5..e2a6638e8f 100644 --- a/src/net/splice_test.go +++ b/src/net/splice_test.go @@ -242,6 +242,7 @@ func testSpliceNoUnixgram(t *testing.T) { if err != nil { t.Fatal(err) } + defer os.Remove(addr.Name) up, err := ListenUnixgram("unixgram", addr) if err != nil { t.Fatal(err) -- GitLab From e609bd373fc9909758b6f4d2403c155e6cf55e23 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 7 Dec 2018 15:00:49 -0800 Subject: [PATCH 0135/1679] cmd/link: use SeekPC in testDWARF This makes the tests slightly faster, though the bulk of the time is still spent building the test programs. Also run some tests in parallel. Updates #26470 Change-Id: Ia5ec2b99831d69c426b43dbab80613aa03e705f5 Reviewed-on: https://go-review.googlesource.com/c/153258 Reviewed-by: Austin Clements --- src/cmd/link/dwarf_test.go | 53 ++++++++++++-------------------------- src/cmd/link/link_test.go | 4 +++ 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 2c01456f6b..710457aeb9 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -8,7 +8,6 @@ import ( "cmd/internal/objfile" "debug/dwarf" "internal/testenv" - "io" "io/ioutil" "os" "os/exec" @@ -46,6 +45,8 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) for _, prog := range []string{"testprog", "testprogcgo"} { t.Run(prog, func(t *testing.T) { + t.Parallel() + exe := filepath.Join(tmpDir, prog+".exe") dir := "../../runtime/testdata/" + prog cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe) @@ -109,43 +110,23 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) wantFile := path.Join(prog, "main.go") wantLine := 24 r := d.Reader() + entry, err := r.SeekPC(addr) + if err != nil { + t.Fatal(err) + } + lr, err := d.LineReader(entry) + if err != nil { + t.Fatal(err) + } var line dwarf.LineEntry - for { - cu, err := r.Next() - if err != nil { - t.Fatal(err) - } - if cu == nil { - break - } - if cu.Tag != dwarf.TagCompileUnit { - r.SkipChildren() - continue - } - if cu.Val(dwarf.AttrStmtList) == nil { - continue - } - lr, err := d.LineReader(cu) - if err != nil { - t.Fatal(err) - } - for { - err := lr.Next(&line) - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - if line.Address == addr { - if !strings.HasSuffix(line.File.Name, wantFile) || line.Line != wantLine { - t.Errorf("%#x is %s:%d, want %s:%d", addr, line.File.Name, line.Line, filepath.Join("...", wantFile), wantLine) - } - return - } - } + if err := lr.SeekPC(addr, &line); err == dwarf.ErrUnknownPC { + t.Fatalf("did not find file:line for %#x (main.main)", addr) + } else if err != nil { + t.Fatal(err) + } + if !strings.HasSuffix(line.File.Name, wantFile) || line.Line != wantLine { + t.Errorf("%#x is %s:%d, want %s:%d", addr, line.File.Name, line.Line, filepath.Join("...", wantFile), wantLine) } - t.Fatalf("did not find file:line for %#x (main.main)", addr) }) } } diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 74238a2000..5200c3a6f0 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -39,6 +39,8 @@ func TestLargeSymName(t *testing.T) { } func TestIssue21703(t *testing.T) { + t.Parallel() + testenv.MustHaveGoBuild(t) const source = ` @@ -78,6 +80,8 @@ func main() {} // to, for example, save facts produced by a modular static analysis // such as golang.org/x/tools/go/analysis. func TestIssue28429(t *testing.T) { + t.Parallel() + testenv.MustHaveGoBuild(t) tmpdir, err := ioutil.TempDir("", "issue28429-") -- GitLab From 7a9968f96fdfa0979e7f086d37592c5df9b9a27c Mon Sep 17 00:00:00 2001 From: WhisperRain <2516435583@qq.com> Date: Tue, 26 Feb 2019 23:01:53 +0000 Subject: [PATCH 0136/1679] container/heap: avoid memory leak in example Set element in slice to nil avoiding memory leak. Change-Id: I9dbef9a0466407011e326725d3a0b681cd815389 GitHub-Last-Rev: 1bae5d375876a7f146eb04c2a5ba88d079264eb3 GitHub-Pull-Request: golang/go#30386 Reviewed-on: https://go-review.googlesource.com/c/163601 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/container/heap/example_pq_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/container/heap/example_pq_test.go b/src/container/heap/example_pq_test.go index 7017095cb8..da1a233b70 100644 --- a/src/container/heap/example_pq_test.go +++ b/src/container/heap/example_pq_test.go @@ -45,6 +45,7 @@ func (pq *PriorityQueue) Pop() interface{} { old := *pq n := len(old) item := old[n-1] + old[n-1] = nil // avoid memory leak item.index = -1 // for safety *pq = old[0 : n-1] return item -- GitLab From 98cbf45cfc6a5a50cc6ac2367f9572cb198b57c7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 22 Jan 2019 07:40:19 -0800 Subject: [PATCH 0137/1679] go/types: add gccgo sizes information This will need to be updated from time to time as new targets are added to gccgo. But that is better than always returning nil. Change-Id: I04b8c4d0f8efa38e2a148eb2e38b16b09f0351c3 Reviewed-on: https://go-review.googlesource.com/c/158844 Run-TryBot: Ian Lance Taylor Reviewed-by: Alan Donovan Reviewed-by: Robert Griesemer TryBot-Result: Gobot Gobot --- src/go/types/gccgosizes.go | 40 ++++++++++++++++++++++++++++++++++++++ src/go/types/sizes.go | 10 ++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/go/types/gccgosizes.go diff --git a/src/go/types/gccgosizes.go b/src/go/types/gccgosizes.go new file mode 100644 index 0000000000..d5c92c6d1d --- /dev/null +++ b/src/go/types/gccgosizes.go @@ -0,0 +1,40 @@ +// Copyright 2019 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. + +// This is a copy of the file generated during the gccgo build process. +// Last update 2019-01-22. + +package types + +var gccgoArchSizes = map[string]*StdSizes{ + "386": {4, 4}, + "alpha": {8, 8}, + "amd64": {8, 8}, + "amd64p32": {4, 8}, + "arm": {4, 8}, + "armbe": {4, 8}, + "arm64": {8, 8}, + "arm64be": {8, 8}, + "ia64": {8, 8}, + "m68k": {4, 2}, + "mips": {4, 8}, + "mipsle": {4, 8}, + "mips64": {8, 8}, + "mips64le": {8, 8}, + "mips64p32": {4, 8}, + "mips64p32le": {4, 8}, + "nios2": {4, 8}, + "ppc": {4, 8}, + "ppc64": {8, 8}, + "ppc64le": {8, 8}, + "riscv": {4, 8}, + "riscv64": {8, 8}, + "s390": {4, 8}, + "s390x": {8, 8}, + "sh": {4, 8}, + "shbe": {4, 8}, + "sparc": {4, 8}, + "sparc64": {8, 8}, + "wasm": {8, 8}, +} diff --git a/src/go/types/sizes.go b/src/go/types/sizes.go index f890c30377..6ab6157b82 100644 --- a/src/go/types/sizes.go +++ b/src/go/types/sizes.go @@ -182,10 +182,16 @@ var gcArchSizes = map[string]*StdSizes{ // "386", "arm", "arm64", "amd64", "amd64p32", "mips", "mipsle", // "mips64", "mips64le", "ppc64", "ppc64le", "riscv64", "s390x", "sparc64", "wasm". func SizesFor(compiler, arch string) Sizes { - if compiler != "gc" { + var m map[string]*StdSizes + switch compiler { + case "gc": + m = gcArchSizes + case "gccgo": + m = gccgoArchSizes + default: return nil } - s, ok := gcArchSizes[arch] + s, ok := m[arch] if !ok { return nil } -- GitLab From 20930c7623be7c78189898795d089002c2f9de41 Mon Sep 17 00:00:00 2001 From: Francesc Campoy Date: Mon, 11 Feb 2019 16:33:12 +0200 Subject: [PATCH 0138/1679] regexp: limit the capacity of slices of bytes returned by FindX This change limits the capacity of the slices of bytes returned by: - Find - FindAll - FindAllSubmatch to be the same as their length. Fixes #30169 Change-Id: I07b632757d2bfeab42fce0d42364e2a16c597360 Reviewed-on: https://go-review.googlesource.com/c/161877 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/regexp/find_test.go | 20 ++++++++++++++++---- src/regexp/regexp.go | 8 ++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/regexp/find_test.go b/src/regexp/find_test.go index e07eb7d5c0..87c49b074f 100644 --- a/src/regexp/find_test.go +++ b/src/regexp/find_test.go @@ -161,6 +161,9 @@ func TestFind(t *testing.T) { t.Errorf("expected match; got none: %s", test) case test.matches != nil && result != nil: expect := test.text[test.matches[0][0]:test.matches[0][1]] + if len(result) != cap(result) { + t.Errorf("expected capacity %d got %d: %s", len(result), cap(result), test) + } if expect != string(result) { t.Errorf("expected %q got %q: %s", expect, result, test) } @@ -242,9 +245,13 @@ func TestFindAll(t *testing.T) { continue } for k, e := range test.matches { + got := result[k] + if len(got) != cap(got) { + t.Errorf("match %d: expected capacity %d got %d: %s", k, len(got), cap(got), test) + } expect := test.text[e[0]:e[1]] - if expect != string(result[k]) { - t.Errorf("match %d: expected %q got %q: %s", k, expect, result[k], test) + if expect != string(got) { + t.Errorf("match %d: expected %q got %q: %s", k, expect, got, test) } } } @@ -323,9 +330,14 @@ func testSubmatchBytes(test *FindTest, n int, submatches []int, result [][]byte, } continue } + got := result[k/2] + if len(got) != cap(got) { + t.Errorf("match %d: expected capacity %d got %d: %s", n, len(got), cap(got), test) + return + } expect := test.text[submatches[k]:submatches[k+1]] - if expect != string(result[k/2]) { - t.Errorf("match %d: expected %q got %q: %s", n, expect, result, test) + if expect != string(got) { + t.Errorf("match %d: expected %q got %q: %s", n, expect, got, test) return } } diff --git a/src/regexp/regexp.go b/src/regexp/regexp.go index 38b3c86d9f..88122d4250 100644 --- a/src/regexp/regexp.go +++ b/src/regexp/regexp.go @@ -761,7 +761,7 @@ func (re *Regexp) Find(b []byte) []byte { if a == nil { return nil } - return b[a[0]:a[1]] + return b[a[0]:a[1]:a[1]] } // FindIndex returns a two-element slice of integers defining the location of @@ -829,7 +829,7 @@ func (re *Regexp) FindSubmatch(b []byte) [][]byte { ret := make([][]byte, 1+re.numSubexp) for i := range ret { if 2*i < len(a) && a[2*i] >= 0 { - ret[i] = b[a[2*i]:a[2*i+1]] + ret[i] = b[a[2*i]:a[2*i+1]:a[2*i+1]] } } return ret @@ -1025,7 +1025,7 @@ func (re *Regexp) FindAll(b []byte, n int) [][]byte { if result == nil { result = make([][]byte, 0, startSize) } - result = append(result, b[match[0]:match[1]]) + result = append(result, b[match[0]:match[1]:match[1]]) }) return result } @@ -1100,7 +1100,7 @@ func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte { slice := make([][]byte, len(match)/2) for j := range slice { if match[2*j] >= 0 { - slice[j] = b[match[2*j]:match[2*j+1]] + slice[j] = b[match[2*j]:match[2*j+1]:match[2*j+1]] } } result = append(result, slice) -- GitLab From 572329ef7f62ced3bd0d099d670247cc2bbb8810 Mon Sep 17 00:00:00 2001 From: go101 Date: Fri, 22 Feb 2019 02:11:55 +0000 Subject: [PATCH 0139/1679] go/ast: break out after first variable in ExampleCommentMap The current ExampleCommentMap might panic if there are more satisfied comments in the parsed program. Change-Id: Ibe6943470aa0cfb450dae9fc07c1199acaabef73 GitHub-Last-Rev: c79e98c2868179ea47618b296ce28c5eebc0b99d GitHub-Pull-Request: golang/go#28587 Reviewed-on: https://go-review.googlesource.com/c/147359 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer --- src/go/ast/example_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/go/ast/example_test.go b/src/go/ast/example_test.go index 52a77981b8..e3013f64be 100644 --- a/src/go/ast/example_test.go +++ b/src/go/ast/example_test.go @@ -151,7 +151,7 @@ package main const hello = "Hello, World!" // line comment 1 // This comment is associated with the foo variable. -var foo = hello // line comment 2 +var foo = hello // line comment 2 // This comment is associated with the main function. func main() { @@ -176,6 +176,7 @@ func main() { if gen, ok := decl.(*ast.GenDecl); ok && gen.Tok == token.VAR { copy(f.Decls[i:], f.Decls[i+1:]) f.Decls = f.Decls[:len(f.Decls)-1] + break } } -- GitLab From a73abca37bcdc4016ccf98754c68f21e7abc8c0e Mon Sep 17 00:00:00 2001 From: Brian Kessler Date: Wed, 13 Feb 2019 13:18:17 -0700 Subject: [PATCH 0140/1679] math/big: handle alias of cofactor inputs in GCD If the variables passed in to the cofactor arguments of GCD (x, y) aliased the input arguments (a, b), the previous implementation would result in incorrect results for y. This change reorganizes the calculation so that the only case that need to be handled is when y aliases b, which can be handled with a simple check. Tests were added for all of the alias cases for input arguments and and and irrelevant test case for a previous binary GCD calculation was dropped. Fixes #30217 Change-Id: Ibe6137f09b3e1ae3c29e3c97aba85b67f33dc169 Reviewed-on: https://go-review.googlesource.com/c/162517 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer TryBot-Result: Gobot Gobot --- src/math/big/int.go | 18 ++++++++++++------ src/math/big/int_test.go | 41 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/math/big/int.go b/src/math/big/int.go index dab9a5cc0f..8c1a54a9c6 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -700,15 +700,21 @@ func (z *Int) lehmerGCD(x, y, a, b *Int) *Int { } } - if x != nil { - *x = *Ua - } - if y != nil { + // avoid aliasing b needed in the division below + if y == b { + B.Set(b) + } else { + B = b + } // y = (z - a*x)/b - y.Mul(a, Ua) + y.Mul(a, Ua) // y can safely alias a y.Sub(A, y) - y.Div(y, b) + y.Div(y, B) + } + + if x != nil { + *x = *Ua } *z = *A diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index 7ef2b3907f..48d08d0e7e 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -760,9 +760,6 @@ var gcdTests = []struct { {"935", "-3", "8", "64515", "24310"}, {"935000000000000000", "-3", "8", "64515000000000000000", "24310000000000000000"}, {"1", "-221", "22059940471369027483332068679400581064239780177629666810348940098015901108344", "98920366548084643601728869055592650835572950932266967461790948584315647051443", "991"}, - - // test early exit (after one Euclidean iteration) in binaryGCD - {"1", "", "", "1", "98920366548084643601728869055592650835572950932266967461790948584315647051443"}, } func testGcd(t *testing.T, d, x, y, a, b *Int) { @@ -793,6 +790,12 @@ func testGcd(t *testing.T, d, x, y, a, b *Int) { if a2.Cmp(d) != 0 { t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, a2, d) } + if x != nil && X.Cmp(x) != 0 { + t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, X, x) + } + if y != nil && Y.Cmp(y) != 0 { + t.Errorf("aliased z = a GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, Y, y) + } a2 = new(Int).Set(a) b2 = new(Int).Set(b) @@ -800,6 +803,38 @@ func testGcd(t *testing.T, d, x, y, a, b *Int) { if b2.Cmp(d) != 0 { t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, b2, d) } + if x != nil && X.Cmp(x) != 0 { + t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, X, x) + } + if y != nil && Y.Cmp(y) != 0 { + t.Errorf("aliased z = b GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, Y, y) + } + + a2 = new(Int).Set(a) + b2 = new(Int).Set(b) + D = new(Int).GCD(a2, b2, a2, b2) // x = a, y = b + if D.Cmp(d) != 0 { + t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, D, d) + } + if x != nil && a2.Cmp(x) != 0 { + t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, a2, x) + } + if y != nil && b2.Cmp(y) != 0 { + t.Errorf("aliased x = a, y = b GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, b2, y) + } + + a2 = new(Int).Set(a) + b2 = new(Int).Set(b) + D = new(Int).GCD(b2, a2, a2, b2) // x = b, y = a + if D.Cmp(d) != 0 { + t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got d = %s, want %s", x, y, a, b, D, d) + } + if x != nil && b2.Cmp(x) != 0 { + t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got x = %s, want %s", x, y, a, b, b2, x) + } + if y != nil && a2.Cmp(y) != 0 { + t.Errorf("aliased x = b, y = a GCD(%s, %s, %s, %s): got y = %s, want %s", x, y, a, b, a2, y) + } } func TestGcd(t *testing.T) { -- GitLab From e5fb1c6d7ad0f7308d520b18d745e130b32af083 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 26 Feb 2019 15:52:59 -0800 Subject: [PATCH 0141/1679] cmd/compile/internal/ssa: fix bad CL rebase CL 142497 renamed "statictmp_N" to ".stmp_N", but missed an instance that was added by CL 151498 (submitted between the window that CL 142497 was reviewed/tested and later rebased/merged). Change-Id: I597ee59dfa40821c7af2881b47e06f84a8140ec8 Reviewed-on: https://go-review.googlesource.com/c/163877 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/writebarrier.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index 1f40927951..49770018f8 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -384,7 +384,7 @@ func IsReadOnlyGlobalAddr(v *Value) bool { return false } // See TODO in OpAddr case in IsSanitizerSafeAddr below. - return strings.HasPrefix(v.Aux.(*obj.LSym).Name, `"".statictmp_`) + return strings.HasPrefix(v.Aux.(*obj.LSym).Name, `""..stmp_`) } // IsNewObject reports whether v is a pointer to a freshly allocated & zeroed object at memory state mem. -- GitLab From 6fa7669fd7d9994ef20e40f41a9771d664d00c5e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 4 Dec 2018 15:11:03 -0800 Subject: [PATCH 0142/1679] cmd/compile: unify duplicate const detection logic Consistent logic for handling both duplicate map keys and case values, and eliminates ad hoc value hashing code. Also makes cmd/compile consistent with go/types's handling of duplicate constants (see #28085), which is at least an improvement over the status quo even if we settle on something different for the spec. As a side effect, this also suppresses cmd/compile's warnings about duplicate nils in (non-interface expression) switch statements, which was technically never allowed by the spec anyway. Updates #28085. Updates #28378. Change-Id: I176a251e770c3c5bc11c2bf8d1d862db8f252a17 Reviewed-on: https://go-review.googlesource.com/c/152544 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 63 +++++++++++++++++++ src/cmd/compile/internal/gc/swt.go | 78 ++++-------------------- src/cmd/compile/internal/gc/typecheck.go | 65 +------------------- test/fixedbugs/issue28085.go | 29 +++++++++ 4 files changed, 107 insertions(+), 128 deletions(-) create mode 100644 test/fixedbugs/issue28085.go diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index f2035bf9a8..de7df645e6 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -1422,3 +1422,66 @@ func hascallchan(n *Node) bool { return false } + +// A constSet represents a set of Go constant expressions. +type constSet struct { + m map[constSetKey]*Node +} + +type constSetKey struct { + typ *types.Type + val interface{} +} + +// add adds constant expressions to s. If a constant expression of +// equal value and identical type has already been added, then that +// type expression is returned. Otherwise, add returns nil. +// +// add also returns nil if n is not a Go constant expression. +// +// n must not be an untyped constant. +func (s *constSet) add(n *Node) *Node { + if n.Op == OCONVIFACE && n.Implicit() { + n = n.Left + } + + if !n.isGoConst() { + return nil + } + if n.Type.IsUntyped() { + Fatalf("%v is untyped", n) + } + + // Consts are only duplicates if they have the same value and + // identical types. + // + // In general, we have to use types.Identical to test type + // identity, because == gives false negatives for anonymous + // types and the byte/uint8 and rune/int32 builtin type + // aliases. However, this is not a problem here, because + // constant expressions are always untyped or have a named + // type, and we explicitly handle the builtin type aliases + // below. + // + // This approach may need to be revisited though if we fix + // #21866 by treating all type aliases like byte/uint8 and + // rune/int32. + + typ := n.Type + switch typ { + case types.Bytetype: + typ = types.Types[TUINT8] + case types.Runetype: + typ = types.Types[TINT32] + } + k := constSetKey{typ, n.Val().Interface()} + + if s.m == nil { + s.m = make(map[constSetKey]*Node) + } + old, dup := s.m[k] + if !dup { + s.m[k] = n + } + return old +} diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go index cc9a8f8b2c..70fc66bf57 100644 --- a/src/cmd/compile/internal/gc/swt.go +++ b/src/cmd/compile/internal/gc/swt.go @@ -627,78 +627,24 @@ func checkDupExprCases(exprname *Node, clauses []*Node) { if exprname == nil { return } - // The common case is that s's expression is not an interface. - // In that case, all constant clauses have the same type, - // so checking for duplicates can be done solely by value. - if !exprname.Type.IsInterface() { - seen := make(map[interface{}]*Node) - for _, ncase := range clauses { - for _, n := range ncase.List.Slice() { - // Can't check for duplicates that aren't constants, per the spec. Issue 15896. - // Don't check for duplicate bools. Although the spec allows it, - // (1) the compiler hasn't checked it in the past, so compatibility mandates it, and - // (2) it would disallow useful things like - // case GOARCH == "arm" && GOARM == "5": - // case GOARCH == "arm": - // which would both evaluate to false for non-ARM compiles. - if ct := consttype(n); ct == 0 || ct == CTBOOL { - continue - } - val := n.Val().Interface() - prev, dup := seen[val] - if !dup { - seen[val] = n - continue - } - yyerrorl(ncase.Pos, "duplicate case %s in switch\n\tprevious case at %v", - nodeAndVal(n), prev.Line()) - } - } - return - } - - // s's expression is an interface. This is fairly rare, so - // keep this simple. Case expressions are only duplicates if - // they have the same value and identical types. - // - // In general, we have to use eqtype to test type identity, - // because == gives false negatives for anonymous types and - // the byte/uint8 and rune/int32 builtin type aliases. - // However, this is not a problem here, because constant - // expressions are always untyped or have a named type, and we - // explicitly handle the builtin type aliases below. - // - // This approach may need to be revisited though if we fix - // #21866 by treating all type aliases like byte/uint8 and - // rune/int32. - type typeVal struct { - typ *types.Type - val interface{} - } - seen := make(map[typeVal]*Node) + var cs constSet for _, ncase := range clauses { for _, n := range ncase.List.Slice() { - if ct := consttype(n); ct == 0 || ct == CTBOOL || ct == CTNIL { + // Don't check for duplicate bools. Although the spec allows it, + // (1) the compiler hasn't checked it in the past, so compatibility mandates it, and + // (2) it would disallow useful things like + // case GOARCH == "arm" && GOARM == "5": + // case GOARCH == "arm": + // which would both evaluate to false for non-ARM compiles. + if n.Type.IsBoolean() { continue } - tv := typeVal{ - typ: n.Type, - val: n.Val().Interface(), - } - switch tv.typ { - case types.Bytetype: - tv.typ = types.Types[TUINT8] - case types.Runetype: - tv.typ = types.Types[TINT32] - } - prev, dup := seen[tv] - if !dup { - seen[tv] = n - continue + + if prev := cs.add(n); prev != nil { + yyerrorl(ncase.Pos, "duplicate case %s in switch\n\tprevious case at %v", + nodeAndVal(n), prev.Line()) } - yyerrorl(ncase.Pos, "duplicate case %s in switch\n\tprevious case at %v", - nodeAndVal(n), prev.Line()) } } } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 7593f0d1e1..69ba9ef52a 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -8,7 +8,6 @@ import ( "cmd/compile/internal/types" "cmd/internal/objabi" "fmt" - "math" "strings" ) @@ -2913,64 +2912,6 @@ func fielddup(name string, hash map[string]bool) { hash[name] = true } -func keydup(n *Node, hash map[uint32][]*Node) { - orign := n - if n.Op == OCONVIFACE { - n = n.Left - } - evconst(n) - if n.Op != OLITERAL { - return // we don't check variables - } - - const PRIME1 = 3 - - var h uint32 - switch v := n.Val().U.(type) { - default: // unknown, bool, nil - h = 23 - - case *Mpint: - h = uint32(v.Int64()) - - case *Mpflt: - x := math.Float64bits(v.Float64()) - for i := 0; i < 8; i++ { - h = h*PRIME1 + uint32(x&0xFF) - x >>= 8 - } - - case string: - for i := 0; i < len(v); i++ { - h = h*PRIME1 + uint32(v[i]) - } - } - - var cmp Node - for _, a := range hash[h] { - cmp.Op = OEQ - cmp.Left = n - if a.Op == OCONVIFACE && orign.Op == OCONVIFACE { - a = a.Left - } - if !types.Identical(a.Type, n.Type) { - continue - } - cmp.Right = a - evconst(&cmp) - if cmp.Op != OLITERAL { - // Sometimes evconst fails. See issue 12536. - continue - } - if cmp.Val().U.(bool) { - yyerror("duplicate key %v in map literal", n) - return - } - } - - hash[h] = append(hash[h], orign) -} - // iscomptype reports whether type t is a composite literal type // or a pointer to one. func iscomptype(t *types.Type) bool { @@ -3131,7 +3072,7 @@ func typecheckcomplit(n *Node) (res *Node) { } case TMAP: - hash := make(map[uint32][]*Node) + var cs constSet for i3, l := range n.List.Slice() { setlineno(l) if l.Op != OKEY { @@ -3145,8 +3086,8 @@ func typecheckcomplit(n *Node) (res *Node) { r = typecheck(r, ctxExpr) r = defaultlit(r, t.Key()) l.Left = assignconv(r, t.Key(), "map key") - if l.Left.Op != OCONV { - keydup(l.Left, hash) + if cs.add(l.Left) != nil { + yyerror("duplicate key %v in map literal", l.Left) } r = l.Right diff --git a/test/fixedbugs/issue28085.go b/test/fixedbugs/issue28085.go new file mode 100644 index 0000000000..01fffd52a6 --- /dev/null +++ b/test/fixedbugs/issue28085.go @@ -0,0 +1,29 @@ +// errorcheck + +// Copyright 2018 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 p + +var _ = map[interface{}]int{ + 0: 0, + 0: 0, // ERROR "duplicate" +} + +var _ = map[interface{}]int{ + interface{}(0): 0, + interface{}(0): 0, // ok +} + +func _() { + switch interface{}(0) { + case 0: + case 0: // ERROR "duplicate" + } + + switch interface{}(0) { + case interface{}(0): + case interface{}(0): // ok + } +} -- GitLab From 9426d8c63311c17483d93a20efc26e6dbb759772 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Wed, 27 Feb 2019 11:41:48 +1100 Subject: [PATCH 0143/1679] time: rewrite ExampleDuration_Nanoseconds to be more idiomatic. Fix the punctuation and use the proper units for microseconds, while explaining the incorrect but common variant 'us'. Change-Id: I9e96694ef27ab4761efccd8616ac7b6700f60d39 Reviewed-on: https://go-review.googlesource.com/c/163917 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/time/example_test.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/time/example_test.go b/src/time/example_test.go index a3532584ef..3b3c88e6af 100644 --- a/src/time/example_test.go +++ b/src/time/example_test.go @@ -113,9 +113,14 @@ func ExampleDuration_Minutes() { } func ExampleDuration_Nanoseconds() { - u, _ := time.ParseDuration("1us") - fmt.Printf("one microsecond has %d nanoseconds.", u.Nanoseconds()) - // Output: one microsecond has 1000 nanoseconds. + u, _ := time.ParseDuration("1µs") + fmt.Printf("One microsecond is %d nanoseconds.\n", u.Nanoseconds()) + // The package also accepts the incorrect but common prefix u for micro. + v, _ := time.ParseDuration("1us") + fmt.Printf("One microsecond is %6.2e seconds.\n", v.Seconds()) + // Output: + // One microsecond is 1000 nanoseconds. + // One microsecond is 1.00e-06 seconds. } func ExampleDuration_Seconds() { -- GitLab From b9d19eff7756aeabd35672f244fb60f45d0f86ee Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Fri, 22 Feb 2019 05:41:20 +0900 Subject: [PATCH 0144/1679] net: use EUI-48/EUI-64 reserved address blocks for documentation Updates #15228. Change-Id: I1b73defccb4c933d71c408aa31d32af9d1bc4ab8 Reviewed-on: https://go-review.googlesource.com/c/163357 Reviewed-by: Matt Layher --- src/net/mac.go | 18 +++++------ src/net/mac_test.go | 76 ++++++++++++++++++++++++++++----------------- 2 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/net/mac.go b/src/net/mac.go index f3b1694735..373ac3d7e2 100644 --- a/src/net/mac.go +++ b/src/net/mac.go @@ -26,15 +26,15 @@ func (a HardwareAddr) String() string { // ParseMAC parses s as an IEEE 802 MAC-48, EUI-48, EUI-64, or a 20-octet // IP over InfiniBand link-layer address using one of the following formats: -// 01:23:45:67:89:ab -// 01:23:45:67:89:ab:cd:ef -// 01:23:45:67:89:ab:cd:ef:00:00:01:23:45:67:89:ab:cd:ef:00:00 -// 01-23-45-67-89-ab -// 01-23-45-67-89-ab-cd-ef -// 01-23-45-67-89-ab-cd-ef-00-00-01-23-45-67-89-ab-cd-ef-00-00 -// 0123.4567.89ab -// 0123.4567.89ab.cdef -// 0123.4567.89ab.cdef.0000.0123.4567.89ab.cdef.0000 +// 00:00:5e:00:53:01 +// 02:00:5e:10:00:00:00:01 +// 00:00:00:00:fe:80:00:00:00:00:00:00:02:00:5e:10:00:00:00:01 +// 00-00-5e-00-53-01 +// 02-00-5e-10-00-00-00-01 +// 00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01 +// 0000.5e00.5301 +// 0200.5e10.0000.0001 +// 0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001 func ParseMAC(s string) (hw HardwareAddr, err error) { if len(s) < 14 { goto error diff --git a/src/net/mac_test.go b/src/net/mac_test.go index 2630d19047..cad884fcf5 100644 --- a/src/net/mac_test.go +++ b/src/net/mac_test.go @@ -15,49 +15,69 @@ var parseMACTests = []struct { out HardwareAddr err string }{ - {"01:23:45:67:89:AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""}, - {"01-23-45-67-89-AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""}, - {"0123.4567.89AB", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab}, ""}, - {"ab:cd:ef:AB:CD:EF", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef}, ""}, - {"01.02.03.04.05.06", nil, "invalid MAC address"}, - {"01:02:03:04:05:06:", nil, "invalid MAC address"}, - {"x1:02:03:04:05:06", nil, "invalid MAC address"}, - {"01002:03:04:05:06", nil, "invalid MAC address"}, - {"01:02003:04:05:06", nil, "invalid MAC address"}, - {"01:02:03004:05:06", nil, "invalid MAC address"}, - {"01:02:03:04005:06", nil, "invalid MAC address"}, - {"01:02:03:04:05006", nil, "invalid MAC address"}, - {"01-02:03:04:05:06", nil, "invalid MAC address"}, - {"01:02-03-04-05-06", nil, "invalid MAC address"}, - {"0123:4567:89AF", nil, "invalid MAC address"}, - {"0123-4567-89AF", nil, "invalid MAC address"}, - {"01:23:45:67:89:AB:CD:EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""}, - {"01-23-45-67-89-AB-CD-EF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""}, - {"0123.4567.89AB.CDEF", HardwareAddr{1, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef}, ""}, + // See RFC 7042, Section 2.1.1. + {"00:00:5e:00:53:01", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""}, + {"00-00-5e-00-53-01", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""}, + {"0000.5e00.5301", HardwareAddr{0x00, 0x00, 0x5e, 0x00, 0x53, 0x01}, ""}, + + // See RFC 7042, Section 2.2.2. + {"02:00:5e:10:00:00:00:01", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""}, + {"02-00-5e-10-00-00-00-01", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""}, + {"0200.5e10.0000.0001", HardwareAddr{0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01}, ""}, + + // See RFC 4391, Section 9.1.1. { - "01:23:45:67:89:ab:cd:ef:00:00:01:23:45:67:89:ab:cd:ef:00:00", + "00:00:00:00:fe:80:00:00:00:00:00:00:02:00:5e:10:00:00:00:01", HardwareAddr{ - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01, }, "", }, { - "01-23-45-67-89-ab-cd-ef-00-00-01-23-45-67-89-ab-cd-ef-00-00", + "00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01", HardwareAddr{ - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01, }, "", }, { - "0123.4567.89ab.cdef.0000.0123.4567.89ab.cdef.0000", + "0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001", HardwareAddr{ - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, - 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x5e, 0x10, 0x00, 0x00, 0x00, 0x01, }, "", }, + + {"ab:cd:ef:AB:CD:EF", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef}, ""}, + {"ab:cd:ef:AB:CD:EF:ab:cd", HardwareAddr{0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd}, ""}, + { + "ab:cd:ef:AB:CD:EF:ab:cd:ef:AB:CD:EF:ab:cd:ef:AB:CD:EF:ab:cd", + HardwareAddr{ + 0xab, 0xcd, 0xef, 0xab, + 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, + 0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd, + }, + "", + }, + + {"01.02.03.04.05.06", nil, "invalid MAC address"}, + {"01:02:03:04:05:06:", nil, "invalid MAC address"}, + {"x1:02:03:04:05:06", nil, "invalid MAC address"}, + {"01002:03:04:05:06", nil, "invalid MAC address"}, + {"01:02003:04:05:06", nil, "invalid MAC address"}, + {"01:02:03004:05:06", nil, "invalid MAC address"}, + {"01:02:03:04005:06", nil, "invalid MAC address"}, + {"01:02:03:04:05006", nil, "invalid MAC address"}, + {"01-02:03:04:05:06", nil, "invalid MAC address"}, + {"01:02-03-04-05-06", nil, "invalid MAC address"}, + {"0123:4567:89AF", nil, "invalid MAC address"}, + {"0123-4567-89AF", nil, "invalid MAC address"}, } func TestParseMAC(t *testing.T) { -- GitLab From ec521467e33eee0a62ed426ca0c66b865baedfc7 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:38:18 +0000 Subject: [PATCH 0145/1679] net: add missing error check in test Change-Id: Id2e57bc8e18e062f60c6ac8a58dc15e049352088 GitHub-Last-Rev: 6d33b809cf8a3b5412333b1c3cc237000be8101d GitHub-Pull-Request: golang/go#30016 Reviewed-on: https://go-review.googlesource.com/c/160440 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Mikio Hara --- src/net/dial_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/net/dial_test.go b/src/net/dial_test.go index 3a2c59a2d1..07d2bb22aa 100644 --- a/src/net/dial_test.go +++ b/src/net/dial_test.go @@ -338,6 +338,11 @@ func TestDialParallel(t *testing.T) { if c != nil { c.Close() } + if tt.expectOk && err != nil { + t.Errorf("#%d (cancel): got %v; want nil", i, err) + } else if !tt.expectOk && err == nil { + t.Errorf("#%d (cancel): got nil; want non-nil", i) + } elapsed = time.Now().Sub(startTime) if elapsed > 100*time.Millisecond { t.Errorf("#%d (cancel): got %v; want <= 100ms", i, elapsed) -- GitLab From 4a91d5501754f36dd09c23d99bbfa0bba37fe6f6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 26 Feb 2019 16:50:31 -0800 Subject: [PATCH 0146/1679] cmd/go: preserve more env vars for TestScript child processes These are required when testing gccgo. Change-Id: I6a81d7f4d48292c32a8b3b15ef44d859ab3aa26e Reviewed-on: https://go-review.googlesource.com/c/163861 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/script_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index 9cc2521e79..c5e0064036 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -83,7 +83,12 @@ type backgroundCmd struct { } var extraEnvKeys = []string{ - "SYSTEMROOT", // must be preserved on Windows to find DLLs; golang.org/issue/25210 + "SYSTEMROOT", // must be preserved on Windows to find DLLs; golang.org/issue/25210 + "LD_LIBRARY_PATH", // must be preserved on Unix systems to find shared libraries + "CC", // don't lose user settings when invoking cgo + "GO_TESTING_GOTOOLS", // for gccgo testing + "GCCGO", // for gccgo testing + "GCCGOTOOLDIR", // for gccgo testing } // setup sets up the test execution temporary directory and environment. -- GitLab From f31305b71bcbfe85b918466aa6dd18e19a4b94a1 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 15 Feb 2019 16:28:05 -0800 Subject: [PATCH 0147/1679] cmd/asm: improve DATA size operand validation Prior to this change, DATA instructions accepted the values 1, 2, 4, and 8 as sizes. The acceptable sizes were further restricted to 4 and 8 for float constants. This was both too restrictive and not restrictive enough: string constants may reasonably have any length, and address constants should really only accept pointer-length sizes. Fixes #30269 Change-Id: I06e44ecdf5909eca7b19553861aec1fa39655c2b Reviewed-on: https://go-review.googlesource.com/c/163747 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/asm/internal/asm/asm.go | 28 ++++++++++++++++++------- src/cmd/asm/internal/asm/pseudo_test.go | 7 +++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index 5da64f135a..3d99af6889 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -7,6 +7,7 @@ package asm import ( "bytes" "fmt" + "strconv" "text/scanner" "cmd/asm/internal/arch" @@ -200,7 +201,11 @@ func (p *Parser) asmData(operands [][]lex.Token) { p.errorf("expect /size for DATA argument") return } - scale := p.parseScale(op[n-1].String()) + szop := op[n-1].String() + sz, err := strconv.Atoi(szop) + if err != nil { + p.errorf("bad size for DATA argument: %q", szop) + } op = op[:n-2] nameAddr := p.address(op) if !p.validSymbol("DATA", &nameAddr, true) { @@ -223,24 +228,33 @@ func (p *Parser) asmData(operands [][]lex.Token) { p.errorf("overlapping DATA entry for %s", name) return } - p.dataAddr[name] = nameAddr.Offset + int64(scale) + p.dataAddr[name] = nameAddr.Offset + int64(sz) switch valueAddr.Type { case obj.TYPE_CONST: - nameAddr.Sym.WriteInt(p.ctxt, nameAddr.Offset, int(scale), valueAddr.Offset) + switch sz { + case 1, 2, 4, 8: + nameAddr.Sym.WriteInt(p.ctxt, nameAddr.Offset, int(sz), valueAddr.Offset) + default: + p.errorf("bad int size for DATA argument: %d", sz) + } case obj.TYPE_FCONST: - switch scale { + switch sz { case 4: nameAddr.Sym.WriteFloat32(p.ctxt, nameAddr.Offset, float32(valueAddr.Val.(float64))) case 8: nameAddr.Sym.WriteFloat64(p.ctxt, nameAddr.Offset, valueAddr.Val.(float64)) default: - panic("bad float scale") + p.errorf("bad float size for DATA argument: %d", sz) } case obj.TYPE_SCONST: - nameAddr.Sym.WriteString(p.ctxt, nameAddr.Offset, int(scale), valueAddr.Val.(string)) + nameAddr.Sym.WriteString(p.ctxt, nameAddr.Offset, int(sz), valueAddr.Val.(string)) case obj.TYPE_ADDR: - nameAddr.Sym.WriteAddr(p.ctxt, nameAddr.Offset, int(scale), valueAddr.Sym, valueAddr.Offset) + if sz == p.arch.PtrSize { + nameAddr.Sym.WriteAddr(p.ctxt, nameAddr.Offset, int(sz), valueAddr.Sym, valueAddr.Offset) + } else { + p.errorf("bad addr size for DATA argument: %d", sz) + } } } diff --git a/src/cmd/asm/internal/asm/pseudo_test.go b/src/cmd/asm/internal/asm/pseudo_test.go index 52c98b4056..100bef91cf 100644 --- a/src/cmd/asm/internal/asm/pseudo_test.go +++ b/src/cmd/asm/internal/asm/pseudo_test.go @@ -43,6 +43,13 @@ func TestErroneous(t *testing.T) { {"DATA", "0", "expect two operands for DATA"}, {"DATA", "(0), 1", "expect /size for DATA argument"}, {"DATA", "@B(SB)/4,0", "expected '(', found B"}, // Issue 23580. + {"DATA", "·A(SB)/4,0", "DATA value must be an immediate constant or address"}, + {"DATA", "·B(SB)/4,$0", ""}, + {"DATA", "·C(SB)/5,$0", "bad int size for DATA argument: 5"}, + {"DATA", "·D(SB)/5,$0.0", "bad float size for DATA argument: 5"}, + {"DATA", "·E(SB)/4,$·A(SB)", "bad addr size for DATA argument: 4"}, + {"DATA", "·F(SB)/8,$·A(SB)", ""}, + {"DATA", "·G(SB)/5,$\"abcde\"", ""}, {"GLOBL", "", "expect two or three operands for GLOBL"}, {"GLOBL", "0,1", "GLOBL symbol \"\" must be a symbol(SB)"}, {"GLOBL", "@B(SB), 0", "expected '(', found B"}, // Issue 23580. -- GitLab From 88343530720a52c96b21f2bd5488c8fb607605d7 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Wed, 20 Feb 2019 13:40:31 -0500 Subject: [PATCH 0148/1679] Revert "crypto/tls: disable RSA-PSS in TLS 1.2" In Go 1.13 we will enable RSA-PSS in TLS 1.2 at the same time as we make TLS 1.3 enabled by default. This reverts commit 7ccd3583eddcd79679fb29cfc83a6e6fb6973f1e. Updates #30055 Change-Id: I6f2ddf7652d1172a6b29f4e335ff3a71a89974bc Reviewed-on: https://go-review.googlesource.com/c/163080 Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot Reviewed-by: Adam Langley --- src/crypto/tls/common.go | 3 - src/crypto/tls/handshake_client_test.go | 24 --- src/crypto/tls/handshake_server.go | 4 +- src/crypto/tls/handshake_server_test.go | 146 ++++---------- src/crypto/tls/key_agreement.go | 2 +- .../Client-TLSv12-ClientCert-RSA-PSS-Disabled | 137 ------------- .../Client-TLSv13-ClientCert-RSA-PSS-Disabled | 138 ------------- ...2-ClientAuthRequestedAndGiven-PSS-Disabled | 126 ------------ ...uthRequestedAndGiven-PSS-Disabled-Required | 74 ------- .../testdata/Server-TLSv12-RSA-PSS-Disabled | 84 -------- .../Server-TLSv12-RSA-PSS-Disabled-Required | 54 ------ ...3-ClientAuthRequestedAndGiven-PSS-Disabled | 182 ------------------ .../testdata/Server-TLSv13-RSA-PSS-Disabled | 103 ---------- src/crypto/tls/tls_test.go | 8 +- 14 files changed, 42 insertions(+), 1043 deletions(-) delete mode 100644 src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled delete mode 100644 src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled delete mode 100644 src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled delete mode 100644 src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required delete mode 100644 src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled delete mode 100644 src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required delete mode 100644 src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled delete mode 100644 src/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled diff --git a/src/crypto/tls/common.go b/src/crypto/tls/common.go index f695528fe0..d9f2d92512 100644 --- a/src/crypto/tls/common.go +++ b/src/crypto/tls/common.go @@ -178,9 +178,6 @@ var supportedSignatureAlgorithms = []SignatureScheme{ ECDSAWithSHA1, } -// RSA-PSS is disabled in TLS 1.2 for Go 1.12. See Issue 30055. -var supportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithms[3:] - // helloRetryRequestRandom is set as the Random value of a ServerHello // to signal that the message is actually a HelloRetryRequest. var helloRetryRequestRandom = []byte{ // See RFC 8446, Section 4.1.3. diff --git a/src/crypto/tls/handshake_client_test.go b/src/crypto/tls/handshake_client_test.go index 62479d840c..d961cab4bc 100644 --- a/src/crypto/tls/handshake_client_test.go +++ b/src/crypto/tls/handshake_client_test.go @@ -855,30 +855,6 @@ func TestHandshakeClientCertRSAPKCS1v15(t *testing.T) { runClientTestTLS12(t, test) } -func TestHandshakeClientCertPSSDisabled(t *testing.T) { - config := testConfig.Clone() - cert, _ := X509KeyPair([]byte(clientCertificatePEM), []byte(clientKeyPEM)) - config.Certificates = []Certificate{cert} - - test := &clientTest{ - name: "ClientCert-RSA-PSS-Disabled", - args: []string{"-cipher", "AES128", "-Verify", "1"}, - config: config, - } - - // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2, - // and check that handshakes still work. - testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12 - defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }() - supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12 - - // Use t.Run to ensure the defer runs after all parallel tests end. - t.Run("", func(t *testing.T) { - runClientTestTLS12(t, test) - runClientTestTLS13(t, test) - }) -} - func TestClientKeyUpdate(t *testing.T) { test := &clientTest{ name: "KeyUpdate", diff --git a/src/crypto/tls/handshake_server.go b/src/crypto/tls/handshake_server.go index 4f4b60ae2c..2745f3313f 100644 --- a/src/crypto/tls/handshake_server.go +++ b/src/crypto/tls/handshake_server.go @@ -463,7 +463,7 @@ func (hs *serverHandshakeState) doFullHandshake() error { } if c.vers >= VersionTLS12 { certReq.hasSignatureAlgorithm = true - certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithmsTLS12 + certReq.supportedSignatureAlgorithms = supportedSignatureAlgorithms } // An empty list of certificateAuthorities signals to @@ -559,7 +559,7 @@ func (hs *serverHandshakeState) doFullHandshake() error { } // Determine the signature type. - _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, supportedSignatureAlgorithmsTLS12, c.vers) + _, sigType, hashFunc, err := pickSignatureAlgorithm(pub, []SignatureScheme{certVerify.signatureAlgorithm}, supportedSignatureAlgorithms, c.vers) if err != nil { c.sendAlert(alertIllegalParameter) return err diff --git a/src/crypto/tls/handshake_server_test.go b/src/crypto/tls/handshake_server_test.go index c23f98f6bc..411648ef68 100644 --- a/src/crypto/tls/handshake_server_test.go +++ b/src/crypto/tls/handshake_server_test.go @@ -1211,33 +1211,6 @@ func TestHandshakeServerRSAPSS(t *testing.T) { runServerTestTLS13(t, test) } -func TestHandshakeServerPSSDisabled(t *testing.T) { - test := &serverTest{ - name: "RSA-PSS-Disabled", - command: []string{"openssl", "s_client", "-no_ticket"}, - wait: true, - } - - // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2, - // and check that handshakes still work. - testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12 - defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }() - supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12 - - runServerTestTLS12(t, test) - runServerTestTLS13(t, test) - - test = &serverTest{ - name: "RSA-PSS-Disabled-Required", - command: []string{"openssl", "s_client", "-no_ticket", "-sigalgs", "rsa_pss_rsae_sha256"}, - wait: true, - - expectHandshakeErrorIncluding: "peer doesn't support any common signature algorithms", - } - - runServerTestTLS12(t, test) -} - func benchmarkHandshakeServer(b *testing.B, version uint16, cipherSuite uint16, curve CurveID, cert []byte, key crypto.PrivateKey) { config := testConfig.Clone() config.CipherSuites = []uint16{cipherSuite} @@ -1417,82 +1390,49 @@ func TestClientAuth(t *testing.T) { defer os.Remove(ecdsaCertPath) ecdsaKeyPath = tempFile(clientECDSAKeyPEM) defer os.Remove(ecdsaKeyPath) + } else { + t.Parallel() } - t.Run("Normal", func(t *testing.T) { - config := testConfig.Clone() - config.ClientAuth = RequestClientCert - - test := &serverTest{ - name: "ClientAuthRequestedNotGiven", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA"}, - config: config, - } - runServerTestTLS12(t, test) - runServerTestTLS13(t, test) - - config.ClientAuth = RequireAnyClientCert - - test = &serverTest{ - name: "ClientAuthRequestedAndGiven", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", - "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pss_rsae_sha256"}, - config: config, - expectedPeerCerts: []string{clientCertificatePEM}, - } - runServerTestTLS12(t, test) - runServerTestTLS13(t, test) - - test = &serverTest{ - name: "ClientAuthRequestedAndECDSAGiven", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", - "-cert", ecdsaCertPath, "-key", ecdsaKeyPath}, - config: config, - expectedPeerCerts: []string{clientECDSACertificatePEM}, - } - runServerTestTLS12(t, test) - runServerTestTLS13(t, test) - - test = &serverTest{ - name: "ClientAuthRequestedAndPKCS1v15Given", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", - "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pkcs1_sha256"}, - config: config, - expectedPeerCerts: []string{clientCertificatePEM}, - } - runServerTestTLS12(t, test) - }) + config := testConfig.Clone() + config.ClientAuth = RequestClientCert - // Restore the default signature algorithms, disabling RSA-PSS in TLS 1.2, - // and check that handshakes still work. - testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12 - defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }() - supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12 + test := &serverTest{ + name: "ClientAuthRequestedNotGiven", + command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA"}, + config: config, + } + runServerTestTLS12(t, test) + runServerTestTLS13(t, test) - t.Run("PSSDisabled", func(t *testing.T) { - config := testConfig.Clone() - config.ClientAuth = RequireAnyClientCert - - test := &serverTest{ - name: "ClientAuthRequestedAndGiven-PSS-Disabled", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", - "-cert", certPath, "-key", keyPath}, - config: config, - expectedPeerCerts: []string{clientCertificatePEM}, - } - runServerTestTLS12(t, test) - runServerTestTLS13(t, test) + test = &serverTest{ + name: "ClientAuthRequestedAndGiven", + command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", + "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pss_rsae_sha256"}, + config: config, + expectedPeerCerts: []string{clientCertificatePEM}, + } + runServerTestTLS12(t, test) + runServerTestTLS13(t, test) - test = &serverTest{ - name: "ClientAuthRequestedAndGiven-PSS-Disabled-Required", - command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", - "-cert", certPath, "-key", keyPath, "-client_sigalgs", "rsa_pss_rsae_sha256"}, - config: config, + test = &serverTest{ + name: "ClientAuthRequestedAndECDSAGiven", + command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", + "-cert", ecdsaCertPath, "-key", ecdsaKeyPath}, + config: config, + expectedPeerCerts: []string{clientECDSACertificatePEM}, + } + runServerTestTLS12(t, test) + runServerTestTLS13(t, test) - expectHandshakeErrorIncluding: "client didn't provide a certificate", - } - runServerTestTLS12(t, test) - }) + test = &serverTest{ + name: "ClientAuthRequestedAndPKCS1v15Given", + command: []string{"openssl", "s_client", "-no_ticket", "-cipher", "AES128-SHA", + "-cert", certPath, "-key", keyPath, "-sigalgs", "rsa_pkcs1_sha256"}, + config: config, + expectedPeerCerts: []string{clientCertificatePEM}, + } + runServerTestTLS12(t, test) } func TestSNIGivenOnFailure(t *testing.T) { @@ -1782,7 +1722,6 @@ T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g if err != nil { t.Fatal(err) } - done := make(chan struct{}) go func() { config := testConfig.Clone() @@ -1800,15 +1739,4 @@ T+E0J8wlH24pgwQHzy7Ko2qLwn1b5PW8ecrlvP1g t.Errorf(`expected "handshake failure", got %q`, err) } <-done - - // With RSA-PSS disabled and TLS 1.2, this should work. - - testSupportedSignatureAlgorithmsTLS12 := supportedSignatureAlgorithmsTLS12 - defer func() { supportedSignatureAlgorithmsTLS12 = testSupportedSignatureAlgorithmsTLS12 }() - supportedSignatureAlgorithmsTLS12 = savedSupportedSignatureAlgorithmsTLS12 - - serverConfig := testConfig.Clone() - serverConfig.Certificates = []Certificate{cert} - serverConfig.MaxVersion = VersionTLS12 - testHandshake(t, testConfig, serverConfig) } diff --git a/src/crypto/tls/key_agreement.go b/src/crypto/tls/key_agreement.go index 05fe77b3e2..628e578e48 100644 --- a/src/crypto/tls/key_agreement.go +++ b/src/crypto/tls/key_agreement.go @@ -177,7 +177,7 @@ NextCandidate: return nil, errors.New("tls: certificate private key does not implement crypto.Signer") } - signatureAlgorithm, sigType, hashFunc, err := pickSignatureAlgorithm(priv.Public(), clientHello.supportedSignatureAlgorithms, supportedSignatureAlgorithmsTLS12, ka.version) + signatureAlgorithm, sigType, hashFunc, err := pickSignatureAlgorithm(priv.Public(), clientHello.supportedSignatureAlgorithms, supportedSignatureAlgorithms, ka.version) if err != nil { return nil, err } diff --git a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled b/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled deleted file mode 100644 index 9d59cb125d..0000000000 --- a/src/crypto/tls/testdata/Client-TLSv12-ClientCert-RSA-PSS-Disabled +++ /dev/null @@ -1,137 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 f8 01 00 00 f4 03 03 00 00 00 00 00 |................| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 |........... ....| -00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 32 cc a8 |.............2..| -00000050 cc a9 c0 2f c0 2b c0 30 c0 2c c0 27 c0 13 c0 23 |.../.+.0.,.'...#| -00000060 c0 09 c0 14 c0 0a 00 9c 00 9d 00 3c 00 2f 00 35 |...........<./.5| -00000070 c0 12 00 0a 00 05 c0 11 c0 07 13 01 13 03 13 02 |................| -00000080 01 00 00 79 00 05 00 05 01 00 00 00 00 00 0a 00 |...y............| -00000090 0a 00 08 00 1d 00 17 00 18 00 19 00 0b 00 02 01 |................| -000000a0 00 00 0d 00 18 00 16 08 04 08 05 08 06 04 01 04 |................| -000000b0 03 05 01 05 03 06 01 06 03 02 01 02 03 ff 01 00 |................| -000000c0 01 00 00 12 00 00 00 2b 00 09 08 03 04 03 03 03 |.......+........| -000000d0 02 03 01 00 33 00 26 00 24 00 1d 00 20 2f e5 7d |....3.&.$... /.}| -000000e0 a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 ff f6 |.G.bC.(.._.).0..| -000000f0 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |........_X.;t| ->>> Flow 2 (server to client) -00000000 16 03 03 00 59 02 00 00 55 03 03 33 ad 8d f8 90 |....Y...U..3....| -00000010 d1 72 5d ef e8 94 0f d7 58 15 59 9f 0b f9 ec 73 |.r].....X.Y....s| -00000020 99 53 f7 03 81 53 1a aa 05 f0 17 20 55 a1 9e 4e |.S...S..... U..N| -00000030 98 26 6b b8 d5 bc 2c 3e ca f6 a0 d9 bb f2 3b dd |.&k...,>......;.| -00000040 be 99 f1 35 de 1c f6 51 5b 19 4f 55 c0 2f 00 00 |...5...Q[.OU./..| -00000050 0d ff 01 00 01 00 00 0b 00 04 03 00 01 02 16 03 |................| -00000060 03 02 59 0b 00 02 55 00 02 52 00 02 4f 30 82 02 |..Y...U..R..O0..| -00000070 4b 30 82 01 b4 a0 03 02 01 02 02 09 00 e8 f0 9d |K0..............| -00000080 3f e2 5b ea a6 30 0d 06 09 2a 86 48 86 f7 0d 01 |?.[..0...*.H....| -00000090 01 0b 05 00 30 1f 31 0b 30 09 06 03 55 04 0a 13 |....0.1.0...U...| -000000a0 02 47 6f 31 10 30 0e 06 03 55 04 03 13 07 47 6f |.Go1.0...U....Go| -000000b0 20 52 6f 6f 74 30 1e 17 0d 31 36 30 31 30 31 30 | Root0...1601010| -000000c0 30 30 30 30 30 5a 17 0d 32 35 30 31 30 31 30 30 |00000Z..25010100| -000000d0 30 30 30 30 5a 30 1a 31 0b 30 09 06 03 55 04 0a |0000Z0.1.0...U..| -000000e0 13 02 47 6f 31 0b 30 09 06 03 55 04 03 13 02 47 |..Go1.0...U....G| -000000f0 6f 30 81 9f 30 0d 06 09 2a 86 48 86 f7 0d 01 01 |o0..0...*.H.....| -00000100 01 05 00 03 81 8d 00 30 81 89 02 81 81 00 db 46 |.......0.......F| -00000110 7d 93 2e 12 27 06 48 bc 06 28 21 ab 7e c4 b6 a2 |}...'.H..(!.~...| -00000120 5d fe 1e 52 45 88 7a 36 47 a5 08 0d 92 42 5b c2 |]..RE.z6G....B[.| -00000130 81 c0 be 97 79 98 40 fb 4f 6d 14 fd 2b 13 8b c2 |....y.@.Om..+...| -00000140 a5 2e 67 d8 d4 09 9e d6 22 38 b7 4a 0b 74 73 2b |..g....."8.J.ts+| -00000150 c2 34 f1 d1 93 e5 96 d9 74 7b f3 58 9f 6c 61 3c |.4......t{.X.la<| -00000160 c0 b0 41 d4 d9 2b 2b 24 23 77 5b 1c 3b bd 75 5d |..A..++$#w[.;.u]| -00000170 ce 20 54 cf a1 63 87 1d 1e 24 c4 f3 1d 1a 50 8b |. T..c...$....P.| -00000180 aa b6 14 43 ed 97 a7 75 62 f4 14 c8 52 d7 02 03 |...C...ub...R...| -00000190 01 00 01 a3 81 93 30 81 90 30 0e 06 03 55 1d 0f |......0..0...U..| -000001a0 01 01 ff 04 04 03 02 05 a0 30 1d 06 03 55 1d 25 |.........0...U.%| -000001b0 04 16 30 14 06 08 2b 06 01 05 05 07 03 01 06 08 |..0...+.........| -000001c0 2b 06 01 05 05 07 03 02 30 0c 06 03 55 1d 13 01 |+.......0...U...| -000001d0 01 ff 04 02 30 00 30 19 06 03 55 1d 0e 04 12 04 |....0.0...U.....| -000001e0 10 9f 91 16 1f 43 43 3e 49 a6 de 6d b6 80 d7 9f |.....CC>I..m....| -000001f0 60 30 1b 06 03 55 1d 23 04 14 30 12 80 10 48 13 |`0...U.#..0...H.| -00000200 49 4d 13 7e 16 31 bb a3 01 d5 ac ab 6e 7b 30 19 |IM.~.1......n{0.| -00000210 06 03 55 1d 11 04 12 30 10 82 0e 65 78 61 6d 70 |..U....0...examp| -00000220 6c 65 2e 67 6f 6c 61 6e 67 30 0d 06 09 2a 86 48 |le.golang0...*.H| -00000230 86 f7 0d 01 01 0b 05 00 03 81 81 00 9d 30 cc 40 |.............0.@| -00000240 2b 5b 50 a0 61 cb ba e5 53 58 e1 ed 83 28 a9 58 |+[P.a...SX...(.X| -00000250 1a a9 38 a4 95 a1 ac 31 5a 1a 84 66 3d 43 d3 2d |..8....1Z..f=C.-| -00000260 d9 0b f2 97 df d3 20 64 38 92 24 3a 00 bc cf 9c |...... d8.$:....| -00000270 7d b7 40 20 01 5f aa d3 16 61 09 a2 76 fd 13 c3 |}.@ ._...a..v...| -00000280 cc e1 0c 5c ee b1 87 82 f1 6c 04 ed 73 bb b3 43 |...\.....l..s..C| -00000290 77 8d 0c 1c f1 0f a1 d8 40 83 61 c9 4c 72 2b 9d |w.......@.a.Lr+.| -000002a0 ae db 46 06 06 4d f4 c1 b3 3e c0 d1 bd 42 d4 db |..F..M...>...B..| -000002b0 fe 3d 13 60 84 5c 21 d3 3b e9 fa e7 16 03 03 00 |.=.`.\!.;.......| -000002c0 ac 0c 00 00 a8 03 00 1d 20 2d c8 0c d2 27 fc f9 |........ -...'..| -000002d0 79 71 c4 17 ea 45 ec 0b dd 66 ce af ec 49 96 7d |yq...E...f...I.}| -000002e0 43 ff 88 68 b1 a8 bb e1 38 08 04 00 80 5a ab 5b |C..h....8....Z.[| -000002f0 e6 b3 32 e2 98 ae c3 ed 7c f9 90 c4 a4 ea dd 70 |..2.....|......p| -00000300 fc a4 f8 ef d1 15 0d b7 ad b8 e3 1f 3e c0 e4 40 |............>..@| -00000310 0d 7b 50 36 8f 88 cb 88 59 7c 20 63 d1 7f 36 9e |.{P6....Y| c..6.| -00000320 de a7 cb 6a 49 fd 65 32 36 0b 10 6a df 58 ef fd |...jI.e26..j.X..| -00000330 f6 fc e6 65 e7 81 0e 73 25 87 c7 89 dc ec ae 7c |...e...s%......|| -00000340 e4 81 79 79 a2 b9 12 28 ab 3b d0 2e 5e 81 47 2a |..yy...(.;..^.G*| -00000350 79 1e 16 21 fa 64 78 24 33 24 f7 ac f1 11 a7 15 |y..!.dx$3$......| -00000360 98 f6 24 52 14 7c 1f 28 0c 24 b1 a9 8a 16 03 03 |..$R.|.(.$......| -00000370 00 3a 0d 00 00 36 03 01 02 40 00 2e 04 03 05 03 |.:...6...@......| -00000380 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 08 05 |................| -00000390 08 06 04 01 05 01 06 01 03 03 02 03 03 01 02 01 |................| -000003a0 03 02 02 02 04 02 05 02 06 02 00 00 16 03 03 00 |................| -000003b0 04 0e 00 00 00 |.....| ->>> Flow 3 (client to server) -00000000 16 03 03 01 fd 0b 00 01 f9 00 01 f6 00 01 f3 30 |...............0| -00000010 82 01 ef 30 82 01 58 a0 03 02 01 02 02 10 5c 19 |...0..X.......\.| -00000020 c1 89 65 83 55 6f dc 0b c9 b9 93 9f e9 bc 30 0d |..e.Uo........0.| -00000030 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 12 31 |..*.H........0.1| -00000040 10 30 0e 06 03 55 04 0a 13 07 41 63 6d 65 20 43 |.0...U....Acme C| -00000050 6f 30 1e 17 0d 31 36 30 38 31 37 32 31 35 32 33 |o0...16081721523| -00000060 31 5a 17 0d 31 37 30 38 31 37 32 31 35 32 33 31 |1Z..170817215231| -00000070 5a 30 12 31 10 30 0e 06 03 55 04 0a 13 07 41 63 |Z0.1.0...U....Ac| -00000080 6d 65 20 43 6f 30 81 9f 30 0d 06 09 2a 86 48 86 |me Co0..0...*.H.| -00000090 f7 0d 01 01 01 05 00 03 81 8d 00 30 81 89 02 81 |...........0....| -000000a0 81 00 ba 6f aa 86 bd cf bf 9f f2 ef 5c 94 60 78 |...o........\.`x| -000000b0 6f e8 13 f2 d1 96 6f cd d9 32 6e 22 37 ce 41 f9 |o.....o..2n"7.A.| -000000c0 ca 5d 29 ac e1 27 da 61 a2 ee 81 cb 10 c7 df 34 |.])..'.a.......4| -000000d0 58 95 86 e9 3d 19 e6 5c 27 73 60 c8 8d 78 02 f4 |X...=..\'s`..x..| -000000e0 1d a4 98 09 a3 19 70 69 3c 25 62 66 2a ab 22 23 |......pi<%bf*."#| -000000f0 c5 7b 85 38 4f 2e 09 73 32 a7 bd 3e 9b ad ca 84 |.{.8O..s2..>....| -00000100 07 e6 0f 3a ff 77 c5 9d 41 85 00 8a b6 9b ee b0 |...:.w..A.......| -00000110 a4 3f 2d 4c 4c e6 42 3e bb 51 c8 dd 48 54 f4 0c |.?-LL.B>.Q..HT..| -00000120 8e 47 02 03 01 00 01 a3 46 30 44 30 0e 06 03 55 |.G......F0D0...U| -00000130 1d 0f 01 01 ff 04 04 03 02 05 a0 30 13 06 03 55 |...........0...U| -00000140 1d 25 04 0c 30 0a 06 08 2b 06 01 05 05 07 03 01 |.%..0...+.......| -00000150 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 0f |0...U.......0.0.| -00000160 06 03 55 1d 11 04 08 30 06 87 04 7f 00 00 01 30 |..U....0.......0| -00000170 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 03 81 |...*.H..........| -00000180 81 00 46 ab 44 a2 fb 28 54 f8 5a 67 f8 62 94 f1 |..F.D..(T.Zg.b..| -00000190 9a b2 18 9e f2 b1 de 1d 7e 6f 76 95 a9 ba e7 5d |........~ov....]| -000001a0 a8 16 6c 9c f7 09 d3 37 e4 4b 2b 36 7c 01 ad 41 |..l....7.K+6|..A| -000001b0 d2 32 d8 c3 d2 93 f9 10 6b 8e 95 b9 2c 17 8a a3 |.2......k...,...| -000001c0 44 48 bc 59 13 83 16 04 88 a4 81 5c 25 0d 98 0c |DH.Y.......\%...| -000001d0 ac 11 b1 28 56 be 1d cd 61 62 84 09 bf d6 80 c6 |...(V...ab......| -000001e0 45 8d 82 2c b4 d8 83 9b db c9 22 b7 2a 12 11 7b |E..,......".*..{| -000001f0 fa 02 3b c1 c9 ff ea c9 9d a8 49 d3 95 d7 d5 0e |..;.......I.....| -00000200 e5 35 16 03 03 00 25 10 00 00 21 20 2f e5 7d a3 |.5....%...! /.}.| -00000210 47 cd 62 43 15 28 da ac 5f bb 29 07 30 ff f6 84 |G.bC.(.._.).0...| -00000220 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 16 03 03 00 |......._X.;t....| -00000230 88 0f 00 00 84 08 04 00 80 8b ad 4b 9a 7a 53 b8 |...........K.zS.| -00000240 6a 0a e7 71 6a 9b 8b 89 7d 3a 49 c9 af ce 3f e2 |j..qj...}:I...?.| -00000250 3e cc 0b da 57 9b 8c 2f 58 0f a9 05 4d e9 de 83 |>...W../X...M...| -00000260 60 e8 1c 77 ef 23 e4 aa 6b c3 15 64 98 f8 b1 72 |`..w.#..k..d...r| -00000270 b2 8a 9e a3 19 3d 73 84 05 53 59 e1 bb e1 db 51 |.....=s..SY....Q| -00000280 49 38 cf 8b ee 3c b6 05 0d ba 62 02 b3 36 dc c1 |I8...<....b..6..| -00000290 e1 52 4d bd 6a c1 3e 55 ff 82 5f e3 7c 84 1c 65 |.RM.j.>U.._.|..e| -000002a0 45 53 b9 c0 56 99 ac 56 d7 4a fa 72 3e 63 36 06 |ES..V..V.J.r>c6.| -000002b0 d3 60 ef 34 05 3f 57 20 79 14 03 03 00 01 01 16 |.`.4.?W y.......| -000002c0 03 03 00 28 00 00 00 00 00 00 00 00 00 26 b7 73 |...(.........&.s| -000002d0 b5 e9 b3 8a 63 00 9b 36 a0 cf 2a 60 0f 8a 59 75 |....c..6..*`..Yu| -000002e0 08 71 97 dc 66 73 15 04 08 b4 d3 91 |.q..fs......| ->>> Flow 4 (server to client) -00000000 14 03 03 00 01 01 16 03 03 00 28 d2 b2 3f a8 43 |..........(..?.C| -00000010 41 1a 85 20 9f ee 21 6a c5 96 cf 7c 01 8e f6 3a |A.. ..!j...|...:| -00000020 e3 29 14 68 ea 74 a3 ef 85 04 78 33 db c7 d4 c9 |.).h.t....x3....| -00000030 a2 fd 6a |..j| ->>> Flow 5 (client to server) -00000000 17 03 03 00 1e 00 00 00 00 00 00 00 01 c3 3b 68 |..............;h| -00000010 b5 e9 4d 75 22 92 fb 19 85 88 38 97 12 3f ce ca |..Mu".....8..?..| -00000020 36 c0 d6 15 03 03 00 1a 00 00 00 00 00 00 00 02 |6...............| -00000030 c1 a9 03 81 61 04 7c 86 24 e9 90 22 59 6f c7 bc |....a.|.$.."Yo..| -00000040 c2 a1 |..| diff --git a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled b/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled deleted file mode 100644 index 98d718bab2..0000000000 --- a/src/crypto/tls/testdata/Client-TLSv13-ClientCert-RSA-PSS-Disabled +++ /dev/null @@ -1,138 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 f8 01 00 00 f4 03 03 00 00 00 00 00 |................| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 00 |........... ....| -00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 32 cc a8 |.............2..| -00000050 cc a9 c0 2f c0 2b c0 30 c0 2c c0 27 c0 13 c0 23 |.../.+.0.,.'...#| -00000060 c0 09 c0 14 c0 0a 00 9c 00 9d 00 3c 00 2f 00 35 |...........<./.5| -00000070 c0 12 00 0a 00 05 c0 11 c0 07 13 01 13 03 13 02 |................| -00000080 01 00 00 79 00 05 00 05 01 00 00 00 00 00 0a 00 |...y............| -00000090 0a 00 08 00 1d 00 17 00 18 00 19 00 0b 00 02 01 |................| -000000a0 00 00 0d 00 18 00 16 08 04 08 05 08 06 04 01 04 |................| -000000b0 03 05 01 05 03 06 01 06 03 02 01 02 03 ff 01 00 |................| -000000c0 01 00 00 12 00 00 00 2b 00 09 08 03 04 03 03 03 |.......+........| -000000d0 02 03 01 00 33 00 26 00 24 00 1d 00 20 2f e5 7d |....3.&.$... /.}| -000000e0 a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 ff f6 |.G.bC.(.._.).0..| -000000f0 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 |........_X.;t| ->>> Flow 2 (server to client) -00000000 16 03 03 00 7a 02 00 00 76 03 03 e5 55 1c 7e bc |....z...v...U.~.| -00000010 05 a3 af 8b 02 03 6a 08 34 35 43 9f 35 c1 39 36 |......j.45C.5.96| -00000020 97 ab d9 4f 77 26 88 31 f8 1c a4 20 00 00 00 00 |...Ow&.1... ....| -00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000040 00 00 00 00 00 00 00 00 00 00 00 00 13 01 00 00 |................| -00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 63 |..+.....3.$... c| -00000060 74 2f 45 26 f4 7c cd d6 cb 8d 9f b5 6b 88 41 ef |t/E&.|......k.A.| -00000070 f4 cd 00 54 91 29 98 e4 a0 6b 6d b5 2f 39 01 14 |...T.)...km./9..| -00000080 03 03 00 01 01 17 03 03 00 17 e6 81 13 75 85 fe |.............u..| -00000090 7d c6 09 24 01 bf 44 78 65 4e 5f d0 37 b9 89 15 |}..$..DxeN_.7...| -000000a0 98 17 03 03 00 42 88 5c b3 19 ee 62 c0 2d 95 51 |.....B.\...b.-.Q| -000000b0 fd 88 e0 13 aa 53 e5 5a 45 be 0f 07 6f 46 c8 1b |.....S.ZE...oF..| -000000c0 a2 b5 2a 7c 46 5f b5 90 46 95 b9 a4 ce 44 a8 a7 |..*|F_..F....D..| -000000d0 3d 8e ce d2 76 57 44 e0 0e 83 af f3 2f 00 55 cb |=...vWD...../.U.| -000000e0 1f e7 d2 42 22 6f 78 0c 17 03 03 02 6d 45 f7 95 |...B"ox.....mE..| -000000f0 68 b9 ad 32 13 34 84 c2 dd 62 a7 f5 18 0f 0b a6 |h..2.4...b......| -00000100 b8 5c dd 06 69 0d 07 ea 6b ec ad ad a7 13 ea f3 |.\..i...k.......| -00000110 87 9b 74 a9 53 49 b3 a9 ff f3 eb 71 1b 25 63 8b |..t.SI.....q.%c.| -00000120 c6 0f 6a 21 bc f1 fb 4b 8e d4 07 6e c6 8e 9f bf |..j!...K...n....| -00000130 73 eb 1e a5 d7 e4 a1 cd 6e 7e de 45 a2 b4 6f 25 |s.......n~.E..o%| -00000140 fe c2 a1 84 b8 09 d1 65 90 6d ef 07 ea d0 25 01 |.......e.m....%.| -00000150 54 f2 8e f8 53 38 1e 35 a9 af be 2a 8d 81 9b 77 |T...S8.5...*...w| -00000160 38 22 42 b8 56 ea 72 ab c3 ac 9b 17 1a 0b 65 94 |8"B.V.r.......e.| -00000170 8a 81 6d 83 c6 f4 76 32 ed f7 84 4d ec 17 0e 45 |..m...v2...M...E| -00000180 74 e8 ba b0 46 92 62 8c 73 07 a8 1f d5 d3 44 d1 |t...F.b.s.....D.| -00000190 53 21 62 8b 02 c6 20 40 1d f1 75 2b 8a 6a 60 2a |S!b... @..u+.j`*| -000001a0 ee 04 5f c0 46 6d 74 7a 18 4a e0 ca d4 a6 6a a2 |.._.Fmtz.J....j.| -000001b0 11 21 20 4a 3e 57 3c 67 ff 61 3d 15 32 14 f2 01 |.! J>W.$..@.| -00000250 10 59 17 11 6f 3c 11 8b eb b2 42 e7 d5 b7 ee d2 |.Y..o<....B.....| -00000260 ae 95 9c 21 48 34 d9 5a 20 95 7c 72 35 05 5e 6c |...!H4.Z .|r5.^l| -00000270 a2 05 46 30 e6 33 d3 91 ac c8 17 4b b1 15 cc f0 |..F0.3.....K....| -00000280 af bb 7c 56 e0 5b 25 8e 35 e0 2e 35 91 0d e0 bc |..|V.[%.5..5....| -00000290 f6 9c 3b 15 f8 96 dc 4e 6c aa 57 c9 f0 1f 55 e2 |..;....Nl.W...U.| -000002a0 d9 5d 09 71 f9 af 17 69 29 d5 94 8a 5f fa b2 ad |.].q...i)..._...| -000002b0 1b b9 ce 90 e7 bd 02 1b ad 9d 91 19 7e f3 8f 2d |............~..-| -000002c0 70 d5 af 2c e7 29 b1 f9 3c 5a 7f 04 6f 73 88 da |p..,.)...'B.| -00000320 6f 13 da a1 b2 b1 43 76 69 eb f1 c6 e2 b5 6c 57 |o.....Cvi.....lW| -00000330 e0 88 c9 0d 7d 37 1b 0b a0 b7 cd 6b ba 3a 52 55 |....}7.....k.:RU| -00000340 61 c6 5c 71 ce 1e 69 b9 ea b4 c6 a5 78 c5 b8 b6 |a.\q..i.....x...| -00000350 4e b1 94 84 a3 d4 31 d9 3b 15 17 03 03 00 99 6c |N.....1.;......l| -00000360 5d dd 43 24 9d 6e 5d 64 d3 54 30 aa 98 c3 7e 21 |].C$.n]d.T0...~!| -00000370 05 06 fc 3b eb 52 12 36 6b 2e e1 32 5a 59 30 a7 |...;.R.6k..2ZY0.| -00000380 b0 bb 52 1a 36 e6 78 20 84 8c cf 0d 90 da c7 88 |..R.6.x ........| -00000390 c4 2f bc b4 b6 03 1b 34 9b c8 12 db bc 87 95 d3 |./.....4........| -000003a0 84 4e 41 c1 de 2f 4c 66 d9 13 fc 78 31 05 6c 67 |.NA../Lf...x1.lg| -000003b0 e3 3d 28 36 0f fe 5f 45 29 d2 1b 4d a5 60 dc f7 |.=(6.._E)..M.`..| -000003c0 20 74 cf f5 7b 3f f7 58 53 0c 64 7d 3f c6 f1 ac | t..{?.XS.d}?...| -000003d0 a9 1b 60 d8 ea a5 32 11 23 6d 66 19 70 2b fa ce |..`...2.#mf.p+..| -000003e0 c8 f6 9d cc 12 83 a1 e1 4b be 98 d3 c2 56 65 34 |........K....Ve4| -000003f0 73 3a b3 6e d8 2c db 3b 17 03 03 00 35 e6 ce 17 |s:.n.,.;....5...| -00000400 e5 92 38 9e 00 2d 66 bf a9 e2 13 66 01 af 64 15 |..8..-f....f..d.| -00000410 8d da 6b f3 a7 f6 5c 76 e1 f4 c4 2f dc 93 c4 3c |..k...\v.../...<| -00000420 69 5a 30 e5 db 5a b5 0b 98 4e 43 a3 51 ba 41 9d |iZ0..Z...NC.Q.A.| -00000430 18 c0 |..| ->>> Flow 3 (client to server) -00000000 14 03 03 00 01 01 17 03 03 02 11 24 0f 0c cc 6a |...........$...j| -00000010 8e 07 9c d7 f9 84 55 cc 79 a7 c1 c5 fb 6e 29 5e |......U.y....n)^| -00000020 31 e1 b1 00 c0 c9 a8 94 59 75 f4 b5 86 7c a4 8c |1.......Yu...|..| -00000030 8d 79 dd 42 45 67 69 f5 fb f0 02 54 f5 8f 1a 86 |.y.BEgi....T....| -00000040 2f a0 4e 9b 68 e2 69 36 48 cb 8e cc 26 fa 1b 60 |/.N.h.i6H...&..`| -00000050 c8 f3 b7 7c 36 dd 59 71 a3 f8 9a 7a bc 8a e1 10 |...|6.Yq...z....| -00000060 8f 6d 69 60 07 b6 62 6d d3 2b fa a4 81 eb ae 3f |.mi`..bm.+.....?| -00000070 9d 7e 1d d7 d1 89 24 4e 7e 65 4b d2 37 58 b2 56 |.~....$N~eK.7X.V| -00000080 a1 8e 10 73 44 9c f1 c7 60 97 49 99 e2 82 74 58 |...sD...`.I...tX| -00000090 e3 1f 41 ec 1d 13 85 f1 95 98 39 cb d1 51 f7 0e |..A.......9..Q..| -000000a0 fe e4 fa 04 20 1a f2 c5 ae 64 9d eb f8 ff 03 ce |.... ....d......| -000000b0 ca 12 7c dd a6 b4 2c a3 eb 8e 83 2c cf 77 6b 82 |..|...,....,.wk.| -000000c0 68 77 58 5d 3e ef 01 0b 78 e9 37 b0 36 9c 62 44 |hwX]>...x.7.6.bD| -000000d0 88 ae f1 5a d7 93 81 0a 84 cf 4f 3b db 05 41 92 |...Z......O;..A.| -000000e0 4d 31 3d 06 9e 73 11 43 de 3e ec b8 b0 48 99 84 |M1=..s.C.>...H..| -000000f0 bc 0c 7c 86 93 03 d5 5f c5 21 34 a5 cc c7 d5 42 |..|...._.!4....B| -00000100 1d 69 94 53 39 d9 56 07 40 46 44 89 e6 95 8d e9 |.i.S9.V.@FD.....| -00000110 ca 6d f0 e0 2a 22 70 bc e7 7f 8e 15 0c 56 51 e3 |.m..*"p......VQ.| -00000120 46 5c b9 66 c5 8b 07 d3 f0 bb 84 fe 71 d6 a2 90 |F\.f........q...| -00000130 d9 ec 46 00 82 10 38 9c 8f 35 e5 48 d8 82 7f 65 |..F...8..5.H...e| -00000140 68 f5 42 48 74 6b 29 79 f3 32 b6 a1 aa 42 73 e3 |h.BHtk)y.2...Bs.| -00000150 c3 f6 fc 76 9e 32 59 26 a6 75 4a dc 65 23 73 10 |...v.2Y&.uJ.e#s.| -00000160 35 79 a5 41 7b 72 d5 cd 33 1f 7d 98 b3 39 4b f6 |5y.A{r..3.}..9K.| -00000170 e8 09 ed d6 62 a0 48 b5 76 47 2e 7e 1a 5d 75 6d |....b.H.vG.~.]um| -00000180 c2 98 22 17 b1 8f 2e a5 a2 b3 b3 5e d9 89 c5 a0 |.."........^....| -00000190 46 2a ac af 20 66 e9 f3 02 84 26 51 c0 0a 2e 0c |F*.. f....&Q....| -000001a0 d3 90 3c 9f 19 3f 25 3e 7d 3a 38 6f f3 ce 2f c4 |..<..?%>}:8o../.| -000001b0 7b 84 e4 d5 c2 c8 90 54 6d 2c 59 70 34 44 53 25 |{......Tm,Yp4DS%| -000001c0 ee ee d6 7e 13 30 1e 09 ff f2 79 bd 7c a1 af a9 |...~.0....y.|...| -000001d0 a9 7b 51 6a d8 17 41 22 f5 d0 5d 84 00 a7 5f 1a |.{Qj..A"..]..._.| -000001e0 b6 15 98 de f4 bd cd fe 70 38 5c 0f 44 60 5a 7d |........p8\.D`Z}| -000001f0 be df 6e 56 bb 83 0b 10 fa 5d 3a 2c 9e 4a 00 7f |..nV.....]:,.J..| -00000200 ec f4 42 52 52 95 5e e1 bd cc cf a0 45 c2 79 2c |..BRR.^.....E.y,| -00000210 10 4d 14 35 ad bd 18 d4 b1 aa 09 65 17 03 03 00 |.M.5.......e....| -00000220 99 a4 2c 7a c2 25 ba 3b a2 84 1f e8 a0 d1 5c c4 |..,z.%.;......\.| -00000230 bb c6 f8 fc eb 19 3e f5 e6 53 9f c3 35 d3 7a 00 |......>..S..5.z.| -00000240 68 e1 e0 2f 73 75 d7 2d df 44 aa 34 43 bf 66 c1 |h../su.-.D.4C.f.| -00000250 31 0d e6 86 f8 71 6b 71 ac 89 c5 26 cf d9 1e 43 |1....qkq...&...C| -00000260 33 c3 48 68 e0 4d f5 d5 69 ff fc 02 47 cc 91 41 |3.Hh.M..i...G..A| -00000270 83 41 58 04 2a 02 53 3c 3b 0a 4c 18 16 00 fd e8 |.AX.*.S<;.L.....| -00000280 64 54 0d 34 a1 3d a5 4b bd c2 54 17 c3 5a 82 7a |dT.4.=.K..T..Z.z| -00000290 55 5d a9 57 63 62 ef 8b 3a 75 f2 cd 34 ef d6 30 |U].Wcb..:u..4..0| -000002a0 08 7f 03 0b c3 eb 29 94 88 11 38 42 40 6f bf cc |......)...8B@o..| -000002b0 d4 01 3f 8a 90 11 f9 da fd 9e 17 03 03 00 35 7d |..?...........5}| -000002c0 2d 12 d7 58 d0 76 43 25 d1 8d 5c 5c b1 7f fa 48 |-..X.vC%..\\...H| -000002d0 a9 21 48 02 64 76 91 6c 79 7e b9 22 33 f7 32 cb |.!H.dv.ly~."3.2.| -000002e0 50 22 78 02 96 4e 2d f6 09 68 06 8e 44 e6 fd 7f |P"x..N-..h..D...| -000002f0 cf 0a 7e a3 17 03 03 00 17 84 cd d8 f2 e2 38 2e |..~...........8.| -00000300 57 e5 47 76 48 50 34 9e 65 d4 c6 1d 7d b3 4e 91 |W.GvHP4.e...}.N.| -00000310 17 03 03 00 13 e5 05 98 5b 87 5d db ae 89 38 2c |........[.]...8,| -00000320 35 89 31 14 73 cd 16 54 |5.1.s..T| diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled deleted file mode 100644 index cb626a1104..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled +++ /dev/null @@ -1,126 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 97 01 00 00 93 03 03 9e b1 2a 26 04 |.............*&.| -00000010 8d 66 df 43 cb 0a 85 80 4f f2 99 7d 80 20 64 7e |.f.C....O..}. d~| -00000020 30 a0 bb 60 ac 0e d4 ce f0 ae 98 00 00 04 00 2f |0..`.........../| -00000030 00 ff 01 00 00 66 00 00 00 0e 00 0c 00 00 09 31 |.....f.........1| -00000040 32 37 2e 30 2e 30 2e 31 00 0b 00 04 03 00 01 02 |27.0.0.1........| -00000050 00 0a 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 |................| -00000060 00 16 00 00 00 17 00 00 00 0d 00 30 00 2e 04 03 |...........0....| -00000070 05 03 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 |................| -00000080 08 05 08 06 04 01 05 01 06 01 03 03 02 03 03 01 |................| -00000090 02 01 03 02 02 02 04 02 05 02 06 02 |............| ->>> Flow 2 (server to client) -00000000 16 03 03 00 31 02 00 00 2d 03 03 00 00 00 00 00 |....1...-.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 44 4f 57 4e 47 52 44 01 00 00 2f 00 00 |...DOWNGRD.../..| -00000030 05 ff 01 00 01 00 16 03 03 02 59 0b 00 02 55 00 |..........Y...U.| -00000040 02 52 00 02 4f 30 82 02 4b 30 82 01 b4 a0 03 02 |.R..O0..K0......| -00000050 01 02 02 09 00 e8 f0 9d 3f e2 5b ea a6 30 0d 06 |........?.[..0..| -00000060 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 1f 31 0b |.*.H........0.1.| -00000070 30 09 06 03 55 04 0a 13 02 47 6f 31 10 30 0e 06 |0...U....Go1.0..| -00000080 03 55 04 03 13 07 47 6f 20 52 6f 6f 74 30 1e 17 |.U....Go Root0..| -00000090 0d 31 36 30 31 30 31 30 30 30 30 30 30 5a 17 0d |.160101000000Z..| -000000a0 32 35 30 31 30 31 30 30 30 30 30 30 5a 30 1a 31 |250101000000Z0.1| -000000b0 0b 30 09 06 03 55 04 0a 13 02 47 6f 31 0b 30 09 |.0...U....Go1.0.| -000000c0 06 03 55 04 03 13 02 47 6f 30 81 9f 30 0d 06 09 |..U....Go0..0...| -000000d0 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 |*.H............0| -000000e0 81 89 02 81 81 00 db 46 7d 93 2e 12 27 06 48 bc |.......F}...'.H.| -000000f0 06 28 21 ab 7e c4 b6 a2 5d fe 1e 52 45 88 7a 36 |.(!.~...]..RE.z6| -00000100 47 a5 08 0d 92 42 5b c2 81 c0 be 97 79 98 40 fb |G....B[.....y.@.| -00000110 4f 6d 14 fd 2b 13 8b c2 a5 2e 67 d8 d4 09 9e d6 |Om..+.....g.....| -00000120 22 38 b7 4a 0b 74 73 2b c2 34 f1 d1 93 e5 96 d9 |"8.J.ts+.4......| -00000130 74 7b f3 58 9f 6c 61 3c c0 b0 41 d4 d9 2b 2b 24 |t{.X.la<..A..++$| -00000140 23 77 5b 1c 3b bd 75 5d ce 20 54 cf a1 63 87 1d |#w[.;.u]. T..c..| -00000150 1e 24 c4 f3 1d 1a 50 8b aa b6 14 43 ed 97 a7 75 |.$....P....C...u| -00000160 62 f4 14 c8 52 d7 02 03 01 00 01 a3 81 93 30 81 |b...R.........0.| -00000170 90 30 0e 06 03 55 1d 0f 01 01 ff 04 04 03 02 05 |.0...U..........| -00000180 a0 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06 |.0...U.%..0...+.| -00000190 01 05 05 07 03 01 06 08 2b 06 01 05 05 07 03 02 |........+.......| -000001a0 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 19 |0...U.......0.0.| -000001b0 06 03 55 1d 0e 04 12 04 10 9f 91 16 1f 43 43 3e |..U..........CC>| -000001c0 49 a6 de 6d b6 80 d7 9f 60 30 1b 06 03 55 1d 23 |I..m....`0...U.#| -000001d0 04 14 30 12 80 10 48 13 49 4d 13 7e 16 31 bb a3 |..0...H.IM.~.1..| -000001e0 01 d5 ac ab 6e 7b 30 19 06 03 55 1d 11 04 12 30 |....n{0...U....0| -000001f0 10 82 0e 65 78 61 6d 70 6c 65 2e 67 6f 6c 61 6e |...example.golan| -00000200 67 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 |g0...*.H........| -00000210 03 81 81 00 9d 30 cc 40 2b 5b 50 a0 61 cb ba e5 |.....0.@+[P.a...| -00000220 53 58 e1 ed 83 28 a9 58 1a a9 38 a4 95 a1 ac 31 |SX...(.X..8....1| -00000230 5a 1a 84 66 3d 43 d3 2d d9 0b f2 97 df d3 20 64 |Z..f=C.-...... d| -00000240 38 92 24 3a 00 bc cf 9c 7d b7 40 20 01 5f aa d3 |8.$:....}.@ ._..| -00000250 16 61 09 a2 76 fd 13 c3 cc e1 0c 5c ee b1 87 82 |.a..v......\....| -00000260 f1 6c 04 ed 73 bb b3 43 77 8d 0c 1c f1 0f a1 d8 |.l..s..Cw.......| -00000270 40 83 61 c9 4c 72 2b 9d ae db 46 06 06 4d f4 c1 |@.a.Lr+...F..M..| -00000280 b3 3e c0 d1 bd 42 d4 db fe 3d 13 60 84 5c 21 d3 |.>...B...=.`.\!.| -00000290 3b e9 fa e7 16 03 03 00 1b 0d 00 00 17 02 01 40 |;..............@| -000002a0 00 10 04 01 04 03 05 01 05 03 06 01 06 03 02 01 |................| -000002b0 02 03 00 00 16 03 03 00 04 0e 00 00 00 |.............| ->>> Flow 3 (client to server) -00000000 16 03 03 01 fd 0b 00 01 f9 00 01 f6 00 01 f3 30 |...............0| -00000010 82 01 ef 30 82 01 58 a0 03 02 01 02 02 10 5c 19 |...0..X.......\.| -00000020 c1 89 65 83 55 6f dc 0b c9 b9 93 9f e9 bc 30 0d |..e.Uo........0.| -00000030 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 12 31 |..*.H........0.1| -00000040 10 30 0e 06 03 55 04 0a 13 07 41 63 6d 65 20 43 |.0...U....Acme C| -00000050 6f 30 1e 17 0d 31 36 30 38 31 37 32 31 35 32 33 |o0...16081721523| -00000060 31 5a 17 0d 31 37 30 38 31 37 32 31 35 32 33 31 |1Z..170817215231| -00000070 5a 30 12 31 10 30 0e 06 03 55 04 0a 13 07 41 63 |Z0.1.0...U....Ac| -00000080 6d 65 20 43 6f 30 81 9f 30 0d 06 09 2a 86 48 86 |me Co0..0...*.H.| -00000090 f7 0d 01 01 01 05 00 03 81 8d 00 30 81 89 02 81 |...........0....| -000000a0 81 00 ba 6f aa 86 bd cf bf 9f f2 ef 5c 94 60 78 |...o........\.`x| -000000b0 6f e8 13 f2 d1 96 6f cd d9 32 6e 22 37 ce 41 f9 |o.....o..2n"7.A.| -000000c0 ca 5d 29 ac e1 27 da 61 a2 ee 81 cb 10 c7 df 34 |.])..'.a.......4| -000000d0 58 95 86 e9 3d 19 e6 5c 27 73 60 c8 8d 78 02 f4 |X...=..\'s`..x..| -000000e0 1d a4 98 09 a3 19 70 69 3c 25 62 66 2a ab 22 23 |......pi<%bf*."#| -000000f0 c5 7b 85 38 4f 2e 09 73 32 a7 bd 3e 9b ad ca 84 |.{.8O..s2..>....| -00000100 07 e6 0f 3a ff 77 c5 9d 41 85 00 8a b6 9b ee b0 |...:.w..A.......| -00000110 a4 3f 2d 4c 4c e6 42 3e bb 51 c8 dd 48 54 f4 0c |.?-LL.B>.Q..HT..| -00000120 8e 47 02 03 01 00 01 a3 46 30 44 30 0e 06 03 55 |.G......F0D0...U| -00000130 1d 0f 01 01 ff 04 04 03 02 05 a0 30 13 06 03 55 |...........0...U| -00000140 1d 25 04 0c 30 0a 06 08 2b 06 01 05 05 07 03 01 |.%..0...+.......| -00000150 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 0f |0...U.......0.0.| -00000160 06 03 55 1d 11 04 08 30 06 87 04 7f 00 00 01 30 |..U....0.......0| -00000170 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 03 81 |...*.H..........| -00000180 81 00 46 ab 44 a2 fb 28 54 f8 5a 67 f8 62 94 f1 |..F.D..(T.Zg.b..| -00000190 9a b2 18 9e f2 b1 de 1d 7e 6f 76 95 a9 ba e7 5d |........~ov....]| -000001a0 a8 16 6c 9c f7 09 d3 37 e4 4b 2b 36 7c 01 ad 41 |..l....7.K+6|..A| -000001b0 d2 32 d8 c3 d2 93 f9 10 6b 8e 95 b9 2c 17 8a a3 |.2......k...,...| -000001c0 44 48 bc 59 13 83 16 04 88 a4 81 5c 25 0d 98 0c |DH.Y.......\%...| -000001d0 ac 11 b1 28 56 be 1d cd 61 62 84 09 bf d6 80 c6 |...(V...ab......| -000001e0 45 8d 82 2c b4 d8 83 9b db c9 22 b7 2a 12 11 7b |E..,......".*..{| -000001f0 fa 02 3b c1 c9 ff ea c9 9d a8 49 d3 95 d7 d5 0e |..;.......I.....| -00000200 e5 35 16 03 03 00 86 10 00 00 82 00 80 3f 1b ee |.5...........?..| -00000210 02 ec a5 9f 6e 38 69 2c b7 03 89 65 b4 92 79 a0 |....n8i,...e..y.| -00000220 b2 0b ab 9b 44 9c 68 d1 8e 5c 40 9c b5 1c a5 70 |....D.h..\@....p| -00000230 00 a2 2e fb 98 b7 45 7b 9c 63 46 68 1d 55 9e 01 |......E{.cFh.U..| -00000240 7f 84 31 62 07 c4 2f 20 5f 1a 94 8c 1f f4 3a 6d |..1b../ _.....:m| -00000250 a8 2b b8 08 5b ec 27 e3 49 9e 51 b3 66 98 09 ba |.+..[.'.I.Q.f...| -00000260 64 65 c8 3c 11 fb 14 4a c9 ea 3c 5e 52 10 a0 0b |de.<...J..<^R...| -00000270 a9 fc 10 13 c9 99 0c a0 8b b4 40 66 0e 11 5e 1d |..........@f..^.| -00000280 8b 45 5c 4d 0d 39 39 f6 0c 59 8f 06 99 16 03 03 |.E\M.99..Y......| -00000290 00 88 0f 00 00 84 04 01 00 80 71 1c 9c fd b2 c9 |..........q.....| -000002a0 b9 7f f3 51 e2 63 96 08 56 d2 bd 19 61 9f 3f be |...Q.c..V...a.?.| -000002b0 e5 4c 22 a8 3f 81 98 2d 67 56 4e 2d 61 6e 51 e5 |.L".?..-gVN-anQ.| -000002c0 11 24 bd 1b 38 ba dc 8c 76 51 1d 3c 6e 81 50 9a |.$..8...vQ.| -00000330 8d 82 6c f3 04 55 2c 13 d9 5b 0a 73 88 4f 8b 3c |..l..U,..[.s.O.<| -00000340 cd ef 1a a7 15 7c 33 bb ff fa 01 c4 87 d7 df 47 |.....|3........G| -00000350 37 b6 fe 1d e6 82 c2 8a 33 b1 c9 ae 85 45 c8 0d |7.......3....E..| -00000360 38 47 69 2d 54 |8Gi-T| ->>> Flow 4 (server to client) -00000000 14 03 03 00 01 01 16 03 03 00 40 00 00 00 00 00 |..........@.....| -00000010 00 00 00 00 00 00 00 00 00 00 00 20 98 12 44 63 |........... ..Dc| -00000020 e7 77 e6 e8 c0 c7 d7 b6 f7 c4 4e 13 e3 79 af 33 |.w........N..y.3| -00000030 3b 6c 86 22 c5 9e dd 25 74 e5 7b 37 fb 24 c6 48 |;l."...%t.{7.$.H| -00000040 c9 74 a7 9b 9b 32 a7 c1 b9 bb e0 17 03 03 00 40 |.t...2.........@| -00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000060 80 d7 ec 51 cf ae d4 1a af 11 59 d1 0c 62 a6 67 |...Q......Y..b.g| -00000070 2e 6f 18 23 29 75 92 07 b1 16 09 8f 2d f8 04 fe |.o.#)u......-...| -00000080 ce 71 2c b6 00 fd 7b 53 cb 6d 97 06 06 e6 af f4 |.q,...{S.m......| -00000090 15 03 03 00 30 00 00 00 00 00 00 00 00 00 00 00 |....0...........| -000000a0 00 00 00 00 00 73 14 3a 87 3b ca 3a 2b b2 52 30 |.....s.:.;.:+.R0| -000000b0 98 62 88 1b a7 58 66 47 66 72 fd bb b6 b7 6b 99 |.b...XfGfr....k.| -000000c0 20 ab e9 22 62 | .."b| diff --git a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required b/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required deleted file mode 100644 index 86d5415cc8..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv12-ClientAuthRequestedAndGiven-PSS-Disabled-Required +++ /dev/null @@ -1,74 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 97 01 00 00 93 03 03 d7 9c de f8 62 |...............b| -00000010 7e 32 5b bc d5 12 35 89 42 37 be ca 55 74 24 61 |~2[...5.B7..Ut$a| -00000020 c0 50 91 0f 1b 42 29 9f c1 6a cb 00 00 04 00 2f |.P...B)..j...../| -00000030 00 ff 01 00 00 66 00 00 00 0e 00 0c 00 00 09 31 |.....f.........1| -00000040 32 37 2e 30 2e 30 2e 31 00 0b 00 04 03 00 01 02 |27.0.0.1........| -00000050 00 0a 00 0c 00 0a 00 1d 00 17 00 1e 00 19 00 18 |................| -00000060 00 16 00 00 00 17 00 00 00 0d 00 30 00 2e 04 03 |...........0....| -00000070 05 03 06 03 08 07 08 08 08 09 08 0a 08 0b 08 04 |................| -00000080 08 05 08 06 04 01 05 01 06 01 03 03 02 03 03 01 |................| -00000090 02 01 03 02 02 02 04 02 05 02 06 02 |............| ->>> Flow 2 (server to client) -00000000 16 03 03 00 31 02 00 00 2d 03 03 00 00 00 00 00 |....1...-.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 44 4f 57 4e 47 52 44 01 00 00 2f 00 00 |...DOWNGRD.../..| -00000030 05 ff 01 00 01 00 16 03 03 02 59 0b 00 02 55 00 |..........Y...U.| -00000040 02 52 00 02 4f 30 82 02 4b 30 82 01 b4 a0 03 02 |.R..O0..K0......| -00000050 01 02 02 09 00 e8 f0 9d 3f e2 5b ea a6 30 0d 06 |........?.[..0..| -00000060 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 1f 31 0b |.*.H........0.1.| -00000070 30 09 06 03 55 04 0a 13 02 47 6f 31 10 30 0e 06 |0...U....Go1.0..| -00000080 03 55 04 03 13 07 47 6f 20 52 6f 6f 74 30 1e 17 |.U....Go Root0..| -00000090 0d 31 36 30 31 30 31 30 30 30 30 30 30 5a 17 0d |.160101000000Z..| -000000a0 32 35 30 31 30 31 30 30 30 30 30 30 5a 30 1a 31 |250101000000Z0.1| -000000b0 0b 30 09 06 03 55 04 0a 13 02 47 6f 31 0b 30 09 |.0...U....Go1.0.| -000000c0 06 03 55 04 03 13 02 47 6f 30 81 9f 30 0d 06 09 |..U....Go0..0...| -000000d0 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 |*.H............0| -000000e0 81 89 02 81 81 00 db 46 7d 93 2e 12 27 06 48 bc |.......F}...'.H.| -000000f0 06 28 21 ab 7e c4 b6 a2 5d fe 1e 52 45 88 7a 36 |.(!.~...]..RE.z6| -00000100 47 a5 08 0d 92 42 5b c2 81 c0 be 97 79 98 40 fb |G....B[.....y.@.| -00000110 4f 6d 14 fd 2b 13 8b c2 a5 2e 67 d8 d4 09 9e d6 |Om..+.....g.....| -00000120 22 38 b7 4a 0b 74 73 2b c2 34 f1 d1 93 e5 96 d9 |"8.J.ts+.4......| -00000130 74 7b f3 58 9f 6c 61 3c c0 b0 41 d4 d9 2b 2b 24 |t{.X.la<..A..++$| -00000140 23 77 5b 1c 3b bd 75 5d ce 20 54 cf a1 63 87 1d |#w[.;.u]. T..c..| -00000150 1e 24 c4 f3 1d 1a 50 8b aa b6 14 43 ed 97 a7 75 |.$....P....C...u| -00000160 62 f4 14 c8 52 d7 02 03 01 00 01 a3 81 93 30 81 |b...R.........0.| -00000170 90 30 0e 06 03 55 1d 0f 01 01 ff 04 04 03 02 05 |.0...U..........| -00000180 a0 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06 |.0...U.%..0...+.| -00000190 01 05 05 07 03 01 06 08 2b 06 01 05 05 07 03 02 |........+.......| -000001a0 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 19 |0...U.......0.0.| -000001b0 06 03 55 1d 0e 04 12 04 10 9f 91 16 1f 43 43 3e |..U..........CC>| -000001c0 49 a6 de 6d b6 80 d7 9f 60 30 1b 06 03 55 1d 23 |I..m....`0...U.#| -000001d0 04 14 30 12 80 10 48 13 49 4d 13 7e 16 31 bb a3 |..0...H.IM.~.1..| -000001e0 01 d5 ac ab 6e 7b 30 19 06 03 55 1d 11 04 12 30 |....n{0...U....0| -000001f0 10 82 0e 65 78 61 6d 70 6c 65 2e 67 6f 6c 61 6e |...example.golan| -00000200 67 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 |g0...*.H........| -00000210 03 81 81 00 9d 30 cc 40 2b 5b 50 a0 61 cb ba e5 |.....0.@+[P.a...| -00000220 53 58 e1 ed 83 28 a9 58 1a a9 38 a4 95 a1 ac 31 |SX...(.X..8....1| -00000230 5a 1a 84 66 3d 43 d3 2d d9 0b f2 97 df d3 20 64 |Z..f=C.-...... d| -00000240 38 92 24 3a 00 bc cf 9c 7d b7 40 20 01 5f aa d3 |8.$:....}.@ ._..| -00000250 16 61 09 a2 76 fd 13 c3 cc e1 0c 5c ee b1 87 82 |.a..v......\....| -00000260 f1 6c 04 ed 73 bb b3 43 77 8d 0c 1c f1 0f a1 d8 |.l..s..Cw.......| -00000270 40 83 61 c9 4c 72 2b 9d ae db 46 06 06 4d f4 c1 |@.a.Lr+...F..M..| -00000280 b3 3e c0 d1 bd 42 d4 db fe 3d 13 60 84 5c 21 d3 |.>...B...=.`.\!.| -00000290 3b e9 fa e7 16 03 03 00 1b 0d 00 00 17 02 01 40 |;..............@| -000002a0 00 10 04 01 04 03 05 01 05 03 06 01 06 03 02 01 |................| -000002b0 02 03 00 00 16 03 03 00 04 0e 00 00 00 |.............| ->>> Flow 3 (client to server) -00000000 16 03 03 00 07 0b 00 00 03 00 00 00 16 03 03 00 |................| -00000010 86 10 00 00 82 00 80 1d c6 6c b0 b9 b3 41 06 80 |.........l...A..| -00000020 e0 f5 df 06 ae 0f 2f 5f 72 14 44 47 16 c4 f0 a6 |....../_r.DG....| -00000030 68 be fa ee ec 9b 38 b0 e4 bd a3 e9 ca 18 5b 25 |h.....8.......[%| -00000040 33 31 57 86 63 59 0e ce 10 77 f8 42 a6 5c ad 3f |31W.cY...w.B.\.?| -00000050 80 85 a5 c1 06 4c 36 aa f3 ee 62 39 66 69 76 51 |.....L6...b9fivQ| -00000060 57 cc a0 b1 35 81 d5 38 01 2d 83 0e 2e 6b a9 84 |W...5..8.-...k..| -00000070 0d 8b 29 93 90 78 2d 0d 33 5f 85 0d 00 0c e2 5f |..)..x-.3_....._| -00000080 83 21 28 27 83 ad 9d 19 2d 01 35 6d 85 2e 8d 6b |.!('....-.5m...k| -00000090 eb 7a cd 8a 3f 42 e2 14 03 03 00 01 01 16 03 03 |.z..?B..........| -000000a0 00 40 5e 19 0f d0 4c 17 e0 25 e6 6b a1 d9 ea 59 |.@^...L..%.k...Y| -000000b0 f4 3a 55 84 2c 50 1e 53 47 78 45 b8 97 f7 7f 3d |.:U.,P.SGxE....=| -000000c0 af d9 7a ad 30 30 77 1a 93 05 19 5b 9b 13 70 e0 |..z.00w....[..p.| -000000d0 e0 f8 ba 6a bd 74 c5 71 0d 5a 2c 3f 2d 98 1a 3c |...j.t.q.Z,?-..<| -000000e0 5a 7d |Z}| ->>> Flow 4 (server to client) -00000000 15 03 03 00 02 02 2a |......*| diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled b/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled deleted file mode 100644 index 302e64e60f..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled +++ /dev/null @@ -1,84 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 cb 01 00 00 c7 03 03 ed 3d 3e 10 95 |............=>..| -00000010 8b 6f 6c be 5c b7 77 c0 79 91 f8 b3 6f 52 27 18 |.ol.\.w.y...oR'.| -00000020 0a b7 88 52 df 3c 6c 87 b4 5a 4c 00 00 38 c0 2c |...R.>> Flow 2 (server to client) -00000000 16 03 03 00 31 02 00 00 2d 03 03 00 00 00 00 00 |....1...-.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 44 4f 57 4e 47 52 44 01 00 c0 30 00 00 |...DOWNGRD...0..| -00000030 05 ff 01 00 01 00 16 03 03 02 59 0b 00 02 55 00 |..........Y...U.| -00000040 02 52 00 02 4f 30 82 02 4b 30 82 01 b4 a0 03 02 |.R..O0..K0......| -00000050 01 02 02 09 00 e8 f0 9d 3f e2 5b ea a6 30 0d 06 |........?.[..0..| -00000060 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 1f 31 0b |.*.H........0.1.| -00000070 30 09 06 03 55 04 0a 13 02 47 6f 31 10 30 0e 06 |0...U....Go1.0..| -00000080 03 55 04 03 13 07 47 6f 20 52 6f 6f 74 30 1e 17 |.U....Go Root0..| -00000090 0d 31 36 30 31 30 31 30 30 30 30 30 30 5a 17 0d |.160101000000Z..| -000000a0 32 35 30 31 30 31 30 30 30 30 30 30 5a 30 1a 31 |250101000000Z0.1| -000000b0 0b 30 09 06 03 55 04 0a 13 02 47 6f 31 0b 30 09 |.0...U....Go1.0.| -000000c0 06 03 55 04 03 13 02 47 6f 30 81 9f 30 0d 06 09 |..U....Go0..0...| -000000d0 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 |*.H............0| -000000e0 81 89 02 81 81 00 db 46 7d 93 2e 12 27 06 48 bc |.......F}...'.H.| -000000f0 06 28 21 ab 7e c4 b6 a2 5d fe 1e 52 45 88 7a 36 |.(!.~...]..RE.z6| -00000100 47 a5 08 0d 92 42 5b c2 81 c0 be 97 79 98 40 fb |G....B[.....y.@.| -00000110 4f 6d 14 fd 2b 13 8b c2 a5 2e 67 d8 d4 09 9e d6 |Om..+.....g.....| -00000120 22 38 b7 4a 0b 74 73 2b c2 34 f1 d1 93 e5 96 d9 |"8.J.ts+.4......| -00000130 74 7b f3 58 9f 6c 61 3c c0 b0 41 d4 d9 2b 2b 24 |t{.X.la<..A..++$| -00000140 23 77 5b 1c 3b bd 75 5d ce 20 54 cf a1 63 87 1d |#w[.;.u]. T..c..| -00000150 1e 24 c4 f3 1d 1a 50 8b aa b6 14 43 ed 97 a7 75 |.$....P....C...u| -00000160 62 f4 14 c8 52 d7 02 03 01 00 01 a3 81 93 30 81 |b...R.........0.| -00000170 90 30 0e 06 03 55 1d 0f 01 01 ff 04 04 03 02 05 |.0...U..........| -00000180 a0 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06 |.0...U.%..0...+.| -00000190 01 05 05 07 03 01 06 08 2b 06 01 05 05 07 03 02 |........+.......| -000001a0 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 19 |0...U.......0.0.| -000001b0 06 03 55 1d 0e 04 12 04 10 9f 91 16 1f 43 43 3e |..U..........CC>| -000001c0 49 a6 de 6d b6 80 d7 9f 60 30 1b 06 03 55 1d 23 |I..m....`0...U.#| -000001d0 04 14 30 12 80 10 48 13 49 4d 13 7e 16 31 bb a3 |..0...H.IM.~.1..| -000001e0 01 d5 ac ab 6e 7b 30 19 06 03 55 1d 11 04 12 30 |....n{0...U....0| -000001f0 10 82 0e 65 78 61 6d 70 6c 65 2e 67 6f 6c 61 6e |...example.golan| -00000200 67 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 |g0...*.H........| -00000210 03 81 81 00 9d 30 cc 40 2b 5b 50 a0 61 cb ba e5 |.....0.@+[P.a...| -00000220 53 58 e1 ed 83 28 a9 58 1a a9 38 a4 95 a1 ac 31 |SX...(.X..8....1| -00000230 5a 1a 84 66 3d 43 d3 2d d9 0b f2 97 df d3 20 64 |Z..f=C.-...... d| -00000240 38 92 24 3a 00 bc cf 9c 7d b7 40 20 01 5f aa d3 |8.$:....}.@ ._..| -00000250 16 61 09 a2 76 fd 13 c3 cc e1 0c 5c ee b1 87 82 |.a..v......\....| -00000260 f1 6c 04 ed 73 bb b3 43 77 8d 0c 1c f1 0f a1 d8 |.l..s..Cw.......| -00000270 40 83 61 c9 4c 72 2b 9d ae db 46 06 06 4d f4 c1 |@.a.Lr+...F..M..| -00000280 b3 3e c0 d1 bd 42 d4 db fe 3d 13 60 84 5c 21 d3 |.>...B...=.`.\!.| -00000290 3b e9 fa e7 16 03 03 00 ac 0c 00 00 a8 03 00 1d |;...............| -000002a0 20 2f e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 | /.}.G.bC.(.._.)| -000002b0 07 30 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b |.0.........._X.;| -000002c0 74 04 01 00 80 a5 a9 75 be 51 ff dc b3 bb 77 79 |t......u.Q....wy| -000002d0 ef 5b 9f d9 27 6c 76 ea ce 5c 66 20 03 2e 94 fd |.[..'lv..\f ....| -000002e0 28 94 69 ff 06 ab bd 34 43 51 72 fb 15 42 e6 38 |(.i....4CQr..B.8| -000002f0 c5 7a 5d 7f 35 a7 3c 85 ec df 95 23 0f 28 c7 dc |.z].5.<....#.(..| -00000300 0e a6 ec fe 5e 77 3f 95 1d a7 73 1d d8 7b 68 92 |....^w?...s..{h.| -00000310 5b a5 b8 ba f5 7c a5 60 2e 43 d6 60 64 3e 33 c7 |[....|.`.C.`d>3.| -00000320 8b c2 56 68 e3 28 2b 2e 8b 9a 85 29 77 73 24 3e |..Vh.(+....)ws$>| -00000330 2b 95 b8 40 a7 f1 60 b5 9e 85 3e 1d ae ab 7f 85 |+..@..`...>.....| -00000340 63 63 d1 cf 62 16 03 03 00 04 0e 00 00 00 |cc..b.........| ->>> Flow 3 (client to server) -00000000 16 03 03 00 25 10 00 00 21 20 43 dd 3e 28 34 9f |....%...! C.>(4.| -00000010 a9 0c 8e 14 66 01 a1 dd 15 8e 71 b4 05 83 d9 a3 |....f.....q.....| -00000020 5f 5c a3 31 ad 5c d5 5a ad 56 14 03 03 00 01 01 |_\.1.\.Z.V......| -00000030 16 03 03 00 28 f3 ad d2 ec 9e 1e 85 2d 96 5f bc |....(.......-._.| -00000040 70 cc 0a c2 22 ef 0a fe fb b0 77 f1 59 59 08 a6 |p...".....w.YY..| -00000050 57 39 16 00 82 0b 60 1e 9a 74 75 3a 8a |W9....`..tu:.| ->>> Flow 4 (server to client) -00000000 14 03 03 00 01 01 16 03 03 00 28 00 00 00 00 00 |..........(.....| -00000010 00 00 00 cf 63 14 29 73 c7 7b 6c 98 50 db 5f 8e |....c.)s.{l.P._.| -00000020 f4 de 68 bc c0 60 2c db 9e 1f d9 48 55 51 05 47 |..h..`,....HUQ.G| -00000030 7e 43 37 17 03 03 00 25 00 00 00 00 00 00 00 01 |~C7....%........| -00000040 67 0a e7 77 dd 1a 30 87 27 90 b0 42 31 42 09 53 |g..w..0.'..B1B.S| -00000050 03 bf 0c 10 3a c3 a7 95 e9 6e 63 57 ad 15 03 03 |....:....ncW....| -00000060 00 1a 00 00 00 00 00 00 00 02 d5 1a ac 66 50 93 |.............fP.| -00000070 46 0a da 98 1f cc 30 40 c1 47 c7 88 |F.....0@.G..| diff --git a/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required b/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required deleted file mode 100644 index 9e9570fed0..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv12-RSA-PSS-Disabled-Required +++ /dev/null @@ -1,54 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 91 01 00 00 8d 03 03 5a 8a 66 22 31 |...........Z.f"1| -00000010 69 92 30 d5 7b 7c 17 a7 7c 14 d6 3c a9 9e ba dd |i.0.{|..|..<....| -00000020 7c 73 fe b4 b4 dd d8 28 39 32 0d 00 00 2a c0 30 ||s.....(92...*.0| -00000030 00 9f cc a8 cc aa c0 2f 00 9e c0 28 00 6b c0 27 |......./...(.k.'| -00000040 00 67 c0 14 00 39 c0 13 00 33 00 9d 00 9c 00 3d |.g...9...3.....=| -00000050 00 3c 00 35 00 2f 00 ff 01 00 00 3a 00 00 00 0e |.<.5./.....:....| -00000060 00 0c 00 00 09 31 32 37 2e 30 2e 30 2e 31 00 0b |.....127.0.0.1..| -00000070 00 04 03 00 01 02 00 0a 00 0c 00 0a 00 1d 00 17 |................| -00000080 00 1e 00 19 00 18 00 16 00 00 00 17 00 00 00 0d |................| -00000090 00 04 00 02 08 04 |......| ->>> Flow 2 (server to client) -00000000 16 03 03 00 31 02 00 00 2d 03 03 00 00 00 00 00 |....1...-.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 44 4f 57 4e 47 52 44 01 00 c0 30 00 00 |...DOWNGRD...0..| -00000030 05 ff 01 00 01 00 16 03 03 02 59 0b 00 02 55 00 |..........Y...U.| -00000040 02 52 00 02 4f 30 82 02 4b 30 82 01 b4 a0 03 02 |.R..O0..K0......| -00000050 01 02 02 09 00 e8 f0 9d 3f e2 5b ea a6 30 0d 06 |........?.[..0..| -00000060 09 2a 86 48 86 f7 0d 01 01 0b 05 00 30 1f 31 0b |.*.H........0.1.| -00000070 30 09 06 03 55 04 0a 13 02 47 6f 31 10 30 0e 06 |0...U....Go1.0..| -00000080 03 55 04 03 13 07 47 6f 20 52 6f 6f 74 30 1e 17 |.U....Go Root0..| -00000090 0d 31 36 30 31 30 31 30 30 30 30 30 30 5a 17 0d |.160101000000Z..| -000000a0 32 35 30 31 30 31 30 30 30 30 30 30 5a 30 1a 31 |250101000000Z0.1| -000000b0 0b 30 09 06 03 55 04 0a 13 02 47 6f 31 0b 30 09 |.0...U....Go1.0.| -000000c0 06 03 55 04 03 13 02 47 6f 30 81 9f 30 0d 06 09 |..U....Go0..0...| -000000d0 2a 86 48 86 f7 0d 01 01 01 05 00 03 81 8d 00 30 |*.H............0| -000000e0 81 89 02 81 81 00 db 46 7d 93 2e 12 27 06 48 bc |.......F}...'.H.| -000000f0 06 28 21 ab 7e c4 b6 a2 5d fe 1e 52 45 88 7a 36 |.(!.~...]..RE.z6| -00000100 47 a5 08 0d 92 42 5b c2 81 c0 be 97 79 98 40 fb |G....B[.....y.@.| -00000110 4f 6d 14 fd 2b 13 8b c2 a5 2e 67 d8 d4 09 9e d6 |Om..+.....g.....| -00000120 22 38 b7 4a 0b 74 73 2b c2 34 f1 d1 93 e5 96 d9 |"8.J.ts+.4......| -00000130 74 7b f3 58 9f 6c 61 3c c0 b0 41 d4 d9 2b 2b 24 |t{.X.la<..A..++$| -00000140 23 77 5b 1c 3b bd 75 5d ce 20 54 cf a1 63 87 1d |#w[.;.u]. T..c..| -00000150 1e 24 c4 f3 1d 1a 50 8b aa b6 14 43 ed 97 a7 75 |.$....P....C...u| -00000160 62 f4 14 c8 52 d7 02 03 01 00 01 a3 81 93 30 81 |b...R.........0.| -00000170 90 30 0e 06 03 55 1d 0f 01 01 ff 04 04 03 02 05 |.0...U..........| -00000180 a0 30 1d 06 03 55 1d 25 04 16 30 14 06 08 2b 06 |.0...U.%..0...+.| -00000190 01 05 05 07 03 01 06 08 2b 06 01 05 05 07 03 02 |........+.......| -000001a0 30 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 19 |0...U.......0.0.| -000001b0 06 03 55 1d 0e 04 12 04 10 9f 91 16 1f 43 43 3e |..U..........CC>| -000001c0 49 a6 de 6d b6 80 d7 9f 60 30 1b 06 03 55 1d 23 |I..m....`0...U.#| -000001d0 04 14 30 12 80 10 48 13 49 4d 13 7e 16 31 bb a3 |..0...H.IM.~.1..| -000001e0 01 d5 ac ab 6e 7b 30 19 06 03 55 1d 11 04 12 30 |....n{0...U....0| -000001f0 10 82 0e 65 78 61 6d 70 6c 65 2e 67 6f 6c 61 6e |...example.golan| -00000200 67 30 0d 06 09 2a 86 48 86 f7 0d 01 01 0b 05 00 |g0...*.H........| -00000210 03 81 81 00 9d 30 cc 40 2b 5b 50 a0 61 cb ba e5 |.....0.@+[P.a...| -00000220 53 58 e1 ed 83 28 a9 58 1a a9 38 a4 95 a1 ac 31 |SX...(.X..8....1| -00000230 5a 1a 84 66 3d 43 d3 2d d9 0b f2 97 df d3 20 64 |Z..f=C.-...... d| -00000240 38 92 24 3a 00 bc cf 9c 7d b7 40 20 01 5f aa d3 |8.$:....}.@ ._..| -00000250 16 61 09 a2 76 fd 13 c3 cc e1 0c 5c ee b1 87 82 |.a..v......\....| -00000260 f1 6c 04 ed 73 bb b3 43 77 8d 0c 1c f1 0f a1 d8 |.l..s..Cw.......| -00000270 40 83 61 c9 4c 72 2b 9d ae db 46 06 06 4d f4 c1 |@.a.Lr+...F..M..| -00000280 b3 3e c0 d1 bd 42 d4 db fe 3d 13 60 84 5c 21 d3 |.>...B...=.`.\!.| -00000290 3b e9 fa e7 15 03 03 00 02 02 28 |;.........(| diff --git a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled b/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled deleted file mode 100644 index 89361f1557..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv13-ClientAuthRequestedAndGiven-PSS-Disabled +++ /dev/null @@ -1,182 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 e0 01 00 00 dc 03 03 32 03 2a b3 ed |...........2.*..| -00000010 c2 1a 71 f2 ff ea 0b 1c fa f9 c6 88 03 7c 84 89 |..q..........|..| -00000020 4e 45 60 81 d9 58 dc 9f 0a 60 d1 20 ce 4d 59 a5 |NE`..X...`. .MY.| -00000030 10 b1 76 53 f5 77 26 fd 17 08 f9 e5 14 03 c4 0a |..vS.w&.........| -00000040 65 fd 83 bb a9 3b 24 05 24 1b ef 00 00 08 13 02 |e....;$.$.......| -00000050 13 03 13 01 00 ff 01 00 00 8b 00 00 00 0e 00 0c |................| -00000060 00 00 09 31 32 37 2e 30 2e 30 2e 31 00 0b 00 04 |...127.0.0.1....| -00000070 03 00 01 02 00 0a 00 0c 00 0a 00 1d 00 17 00 1e |................| -00000080 00 19 00 18 00 16 00 00 00 17 00 00 00 0d 00 1e |................| -00000090 00 1c 04 03 05 03 06 03 08 07 08 08 08 09 08 0a |................| -000000a0 08 0b 08 04 08 05 08 06 04 01 05 01 06 01 00 2b |...............+| -000000b0 00 03 02 03 04 00 2d 00 02 01 01 00 33 00 26 00 |......-.....3.&.| -000000c0 24 00 1d 00 20 06 b0 03 80 81 d6 e7 f4 31 85 4c |$... ........1.L| -000000d0 e3 50 35 c1 df 6e 28 9f 38 ce c0 7b fc 71 00 8c |.P5..n(.8..{.q..| -000000e0 9a 25 07 95 57 |.%..W| ->>> Flow 2 (server to client) -00000000 16 03 03 00 7a 02 00 00 76 03 03 00 00 00 00 00 |....z...v.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 00 00 00 00 00 00 00 00 20 ce 4d 59 a5 |........... .MY.| -00000030 10 b1 76 53 f5 77 26 fd 17 08 f9 e5 14 03 c4 0a |..vS.w&.........| -00000040 65 fd 83 bb a9 3b 24 05 24 1b ef 00 13 02 00 00 |e....;$.$.......| -00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 2f |..+.....3.$... /| -00000060 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0| -00000070 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 14 |.........._X.;t.| -00000080 03 03 00 01 01 17 03 03 00 17 ad ce ff 21 b8 39 |.............!.9| -00000090 16 f6 10 6e 8d 6c 0f 46 2f 58 55 b3 e4 4f 2d 5c |...n.l.F/XU..O-\| -000000a0 26 17 03 03 00 3c fd 24 07 75 28 2b f2 ec d9 74 |&....<.$.u(+...t| -000000b0 f0 76 e4 02 e6 02 bd 47 58 0f 68 60 ac 6c 59 a8 |.v.....GX.h`.lY.| -000000c0 87 94 b9 cb c3 fa 41 15 4c 95 b8 58 da 8c d9 ea |......A.L..X....| -000000d0 3a ab 0c 06 83 a5 2b d1 39 6f 32 92 bf e1 c0 f4 |:.....+.9o2.....| -000000e0 49 51 17 03 03 02 6d 22 dc 8c fc ae 21 96 41 17 |IQ....m"....!.A.| -000000f0 45 93 6e 08 61 6b 46 b9 9a cf 2e 79 a8 1a 46 30 |E.n.akF....y..F0| -00000100 a4 de 3d 53 87 bf 57 3a 44 4f 5b 3f c9 b2 f0 0e |..=S..W:DO[?....| -00000110 56 5f 5a ee 5a 1f df cc fe f3 54 ab 87 d7 bb 00 |V_Z.Z.....T.....| -00000120 2c 61 de ad 31 9c d4 cf 43 bf e7 84 d1 1d 3c cb |,a..1...C.....<.| -00000130 82 d1 81 9d 13 90 6b c8 fd 01 53 4f 13 a5 91 a4 |......k...SO....| -00000140 fe 20 ce 2c 34 96 62 b7 6f f0 f0 65 f0 01 18 99 |. .,4.b.o..e....| -00000150 31 3d cb c6 72 6f 54 d6 ec fa a3 dd 94 67 6b b9 |1=..roT......gk.| -00000160 ff 2c 41 ba 00 d5 25 ba b1 7a e5 d2 1c 0b 37 ad |.,A...%..z....7.| -00000170 df 0b 62 be b3 69 5b 84 39 2d 72 c2 b9 ec 68 87 |..b..i[.9-r...h.| -00000180 32 23 92 4b a8 f0 17 25 0f d7 86 97 45 65 73 e1 |2#.K...%....Ees.| -00000190 49 c4 3c 8d 26 43 34 06 4c be 50 76 ae 63 6f 1d |I.<.&C4.L.Pv.co.| -000001a0 ed 57 93 5a 7f 98 e2 1e 5f 94 74 a2 54 59 63 12 |.W.Z...._.t.TYc.| -000001b0 bb 8b df 77 20 3a 9c ea c7 40 b0 cf 8e 7f f8 98 |...w :...@......| -000001c0 06 92 38 be 77 11 17 03 c2 ac af fc 8d 7d d5 6b |..8.w........}.k| -000001d0 f7 2b 7a f3 b8 dc b0 cf 3e f7 c5 f4 b3 34 4b 06 |.+z.....>....4K.| -000001e0 c6 ed b5 dc 0c 2d 4e bc 03 94 cc 03 f2 9f 5d c6 |.....-N.......].| -000001f0 57 36 5a 01 81 65 27 75 1d 4f 22 9f b5 da 7f e2 |W6Z..e'u.O".....| -00000200 7d 36 f3 4b 05 3f 40 47 c6 1b af e6 99 c0 ca 35 |}6.K.?@G.......5| -00000210 98 c8 30 60 7b 42 4e e7 5c 90 28 d7 4e db f3 78 |..0`{BN.\.(.N..x| -00000220 22 e2 a3 86 0c 9e 19 43 0e 89 d4 f6 78 38 21 16 |"......C....x8!.| -00000230 84 38 36 6a 2d a5 94 2c 52 2b 00 de 67 16 e8 89 |.86j-..,R+..g...| -00000240 32 21 0e fd b0 23 91 06 8b fa 82 70 21 bc 1f 29 |2!...#.....p!..)| -00000250 32 af f4 b9 15 7f aa 22 c1 e8 e3 2c 92 b4 d8 2a |2......"...,...*| -00000260 64 58 f4 f1 85 85 14 92 f3 16 8e 2d 5b a6 7e ef |dX.........-[.~.| -00000270 22 5a 58 bb 4c f1 36 70 2f ca 03 df fb 0a d0 03 |"ZX.L.6p/.......| -00000280 55 5d d9 6b 63 48 d2 75 82 d4 56 af 17 5a 60 4f |U].kcH.u..V..Z`O| -00000290 af 8b 17 d6 fd 96 be 3d 82 25 0e 73 2e 58 0e 0a |.......=.%.s.X..| -000002a0 5c 2d c8 f5 17 b0 ae 7d 39 90 cb 75 bb 4b 33 22 |\-.....}9..u.K3"| -000002b0 bd a2 02 00 70 43 a8 54 ee 7c 25 d5 d7 88 08 f6 |....pC.T.|%.....| -000002c0 3f 34 61 55 f5 d3 53 0c 8c b1 9b fd 4e d9 65 7a |?4aU..S.....N.ez| -000002d0 2b 6e b4 d5 37 34 18 f3 14 00 9f 56 40 d9 15 ea |+n..74.....V@...| -000002e0 59 5a 4b 4a bb f7 19 72 60 4a 08 8f 75 d6 7b a4 |YZKJ...r`J..u.{.| -000002f0 de 79 c5 21 1a cb 82 97 b3 88 d8 ae 65 30 cc 56 |.y.!........e0.V| -00000300 da a3 04 5c 63 f4 44 a5 eb 05 55 ad 78 46 44 ac |...\c.D...U.xFD.| -00000310 56 2e f6 f7 eb 47 f6 f1 62 8d df 27 7d 86 5e 58 |V....G..b..'}.^X| -00000320 5f 4c 34 6e f6 c0 fd 56 7d 46 82 5d 53 db 2a 84 |_L4n...V}F.]S.*.| -00000330 45 db e7 9c b9 23 32 59 cf 85 f7 12 c5 e8 9e 3c |E....#2Y.......<| -00000340 2d 3f 81 a5 24 cf 36 ad d6 65 02 35 84 de 43 f8 |-?..$.6..e.5..C.| -00000350 04 e2 8b ae 17 03 03 00 99 ce e8 48 a3 34 5e fb |...........H.4^.| -00000360 76 f1 e4 3b da 94 0a 25 ee 78 f6 31 24 10 05 25 |v..;...%.x.1$..%| -00000370 9c e5 ca fc ef c5 66 86 08 15 d8 69 75 d8 49 e9 |......f....iu.I.| -00000380 9b 86 71 3f 1f 41 ee f0 bc 8d 4e aa bc 30 f0 8f |..q?.A....N..0..| -00000390 7b b1 94 7e aa 74 3f eb 23 c5 c9 aa 9a c3 f7 12 |{..~.t?.#.......| -000003a0 23 30 95 2e e1 1b 9c fe 8b 50 b1 d9 17 cf af a1 |#0.......P......| -000003b0 ff ce 8d fa 7e bd 23 59 d0 7a fb 30 12 f4 8d 86 |....~.#Y.z.0....| -000003c0 0c 3c fd 03 50 d4 7f bb f6 fa ba 1d fc 32 cc 7e |.<..P........2.~| -000003d0 12 3a 33 90 c6 82 5d 6a 90 23 6d b8 e6 60 7d d3 |.:3...]j.#m..`}.| -000003e0 a8 f0 0c 75 bc b5 67 68 ed 58 ef 4d ac 91 47 c9 |...u..gh.X.M..G.| -000003f0 c4 bc 17 03 03 00 45 ae 0d 8d 76 8d 28 34 1b 09 |......E...v.(4..| -00000400 4d d5 df 2e aa f8 ff 71 b2 0e 60 a1 ce 8a 58 9c |M......q..`...X.| -00000410 45 64 31 6c 9b 46 66 64 27 98 e6 f3 93 e8 92 81 |Ed1l.Ffd'.......| -00000420 3d 4f db da 98 72 0d b7 71 27 ac 2b 61 81 97 0b |=O...r..q'.+a...| -00000430 e7 ae 32 d7 e2 66 4d 5d f7 01 d0 77 |..2..fM]...w| ->>> Flow 3 (client to server) -00000000 14 03 03 00 01 01 17 03 03 02 11 f6 03 90 9e bc |................| -00000010 dc 00 9b f9 dd 7b 65 dd b0 69 b4 b5 42 fc 25 f2 |.....{e..i..B.%.| -00000020 2b 7e be 52 1a 4b f1 e4 21 94 0d 88 4a 58 07 37 |+~.R.K..!...JX.7| -00000030 67 c7 e3 c4 62 eb 17 57 5d 52 d4 a9 03 39 0e 7d |g...b..W]R...9.}| -00000040 d0 c3 1a 8d ef ec b7 a8 9b 93 50 0d 7f fd a1 10 |..........P.....| -00000050 b6 82 99 21 3f e3 3d 3d 47 04 c3 cd a7 b3 ab e0 |...!?.==G.......| -00000060 f6 33 47 0e 1c 30 36 45 21 32 34 c2 2c 72 20 72 |.3G..06E!24.,r r| -00000070 b6 c7 5b 95 8a 97 84 54 2e d0 5f d5 80 e7 8f 7a |..[....T.._....z| -00000080 6f 50 96 8a 33 13 c6 97 85 25 47 6b 8a b2 a0 29 |oP..3....%Gk...)| -00000090 cd 7f 0e 38 94 53 08 8b c3 2f 89 a2 10 c2 22 5a |...8.S.../...."Z| -000000a0 95 42 a3 45 73 a8 d0 ac 6d ba 95 a4 51 63 b9 b4 |.B.Es...m...Qc..| -000000b0 79 61 be dd c6 ab 97 72 38 30 63 55 a7 7d 9a eb |ya.....r80cU.}..| -000000c0 bb 5a f6 d0 3d 05 81 5d 0e e5 7a 8b ae fe d2 3b |.Z..=..]..z....;| -000000d0 db 85 3a 13 81 ee 36 b3 ff 41 47 d1 67 bf 17 5e |..:...6..AG.g..^| -000000e0 9d a3 4c 92 51 a9 1b 4b ca 13 f6 ee 8a e5 b3 01 |..L.Q..K........| -000000f0 e7 87 ee 1e 2a 9e 56 3d 01 7e 0f cb e5 d6 ea 13 |....*.V=.~......| -00000100 05 3e 8c 5a 24 d0 36 6b 54 9f 8e 3f 07 73 a0 bf |.>.Z$.6kT..?.s..| -00000110 84 c2 90 72 ce 48 50 49 47 27 b3 14 56 5c c7 63 |...r.HPIG'..V\.c| -00000120 7e 7e b5 8f 9d 6d 70 32 6f 3f 4d 53 80 ae f6 2b |~~...mp2o?MS...+| -00000130 fb c9 7a de 76 aa 68 a3 9b a9 a7 47 55 d0 cb f8 |..z.v.h....GU...| -00000140 e8 c4 1c f5 0f 54 82 5b c5 45 18 41 05 da 72 ce |.....T.[.E.A..r.| -00000150 84 d1 8b 00 40 e9 f9 cf b5 d5 3e 71 ee 25 dc 7d |....@.....>q.%.}| -00000160 3b 00 67 68 9d 78 d2 c0 7b cb 5d 9e 79 2c b5 f4 |;.gh.x..{.].y,..| -00000170 1b ea b8 d8 de bd 36 71 2a 26 49 44 1b 5b 92 ad |......6q*&ID.[..| -00000180 1c 2d 2f ab 8e 15 d7 b3 96 89 da 58 77 75 42 32 |.-/........XwuB2| -00000190 c3 6b f1 5e 0b da 91 71 1e d5 f1 dd 32 d8 b6 a5 |.k.^...q....2...| -000001a0 21 a1 1d 5e b1 df 01 37 33 ac 93 11 94 6d b8 e6 |!..^...73....m..| -000001b0 3b be 86 31 da cf b6 ab cd f5 12 4f 85 45 24 06 |;..1.......O.E$.| -000001c0 34 40 7b c5 f8 5f c3 f9 3b cf 9d 2a b3 2e 65 e4 |4@{.._..;..*..e.| -000001d0 0e ed fc 7c b4 2b 32 bf 0e 8f b3 85 93 74 8b e8 |...|.+2......t..| -000001e0 25 e0 47 c0 d8 52 8e c9 ed 7f 16 41 3f b3 79 d8 |%.G..R.....A?.y.| -000001f0 d1 47 19 ae fb ab 97 a5 b2 42 7c a0 73 ad 4f 62 |.G.......B|.s.Ob| -00000200 cf 35 52 7c d6 47 b8 1f e9 65 b0 99 f7 67 e7 64 |.5R|.G...e...g.d| -00000210 14 83 46 c7 90 6e 4d 01 3a c2 e6 19 17 03 03 00 |..F..nM.:.......| -00000220 99 a5 e0 38 3a 91 4a 1d 87 9a eb a6 95 87 35 fc |...8:.J.......5.| -00000230 ae 42 8d 3a fe f6 39 f3 c2 c2 f0 9a f5 8f b5 75 |.B.:..9........u| -00000240 18 6b 84 c0 5b 96 6a 9c 0c aa 81 fc 9a 2e 01 f7 |.k..[.j.........| -00000250 d8 b1 5d 4a 54 cf 79 90 fb 79 57 ff d9 d1 46 59 |..]JT.y..yW...FY| -00000260 02 84 3d ee cc 68 ea 05 1d a2 79 fb 1d 1e d6 ad |..=..h....y.....| -00000270 5b 95 3b 6b 9a c9 07 e5 e4 20 07 6a a0 74 c8 1a |[.;k..... .j.t..| -00000280 31 53 a4 e6 bb bb 28 61 47 41 d5 f3 45 38 71 86 |1S....(aGA..E8q.| -00000290 35 12 f4 8a f2 e4 e9 ae 96 a9 14 ce 8a 1c 5d 59 |5.............]Y| -000002a0 3c d7 3a e7 93 35 c2 53 9f d8 4d cb 98 bd e1 72 |<.:..5.S..M....r| -000002b0 a8 80 55 a6 cd 9c 50 41 ec 50 17 03 03 00 45 2d |..U...PA.P....E-| -000002c0 90 3b 73 cc 24 52 ad 22 90 0e 7d bf 2a a2 44 09 |.;s.$R."..}.*.D.| -000002d0 e2 43 61 f2 48 9b 73 85 00 05 8b 0a 51 ad a0 c0 |.Ca.H.s.....Q...| -000002e0 64 ef 5e 11 86 37 b0 32 af 11 f7 98 7b 74 39 90 |d.^..7.2....{t9.| -000002f0 fa d0 32 f3 fe 4d 01 6b 78 75 31 7e 67 4f 61 0f |..2..M.kxu1~gOa.| -00000300 bb c6 3e c0 |..>.| ->>> Flow 4 (server to client) -00000000 17 03 03 02 9b f5 b2 d6 62 fe e0 c8 8d cc 7a cd |........b.....z.| -00000010 29 51 b2 77 0d 9a 54 fb 43 6d f6 9c e1 ff 28 be |)Q.w..T.Cm....(.| -00000020 fc 50 68 80 2f 1c 4f 50 44 95 64 49 0a 66 fe 79 |.Ph./.OPD.dI.f.y| -00000030 46 ba 88 e9 03 be 5c 91 60 84 78 03 a8 c6 21 90 |F.....\.`.x...!.| -00000040 cd 79 de 2d 2f 81 dd 08 1f 52 1a 0e d8 69 16 22 |.y.-/....R...i."| -00000050 a6 59 5b 2b 85 08 00 16 e7 85 bd 43 9a cc ce e6 |.Y[+.......C....| -00000060 3a ee 70 25 0b 95 90 4b c0 42 4a 48 25 d3 50 92 |:.p%...K.BJH%.P.| -00000070 19 e1 3e b8 72 c5 a1 e8 dd 9f a4 57 2d b0 a6 24 |..>.r......W-..$| -00000080 8b 8c 55 41 f3 26 45 dd dd 2b d3 15 8d d9 ca e4 |..UA.&E..+......| -00000090 15 6e b5 6d 99 79 ba 46 00 e6 5e 75 52 fd f9 26 |.n.m.y.F..^uR..&| -000000a0 cf cd 69 cf be 29 a7 b9 7d 1b 1d 6b ab 17 ee 4e |..i..)..}..k...N| -000000b0 f5 24 b0 89 0f b5 c7 41 4e ea cd 32 98 47 23 bc |.$.....AN..2.G#.| -000000c0 91 03 b1 23 e0 5c 5e 37 40 95 da 90 ef eb 95 81 |...#.\^7@.......| -000000d0 7b 2d c7 15 8f f8 2d ba 69 41 0e a9 eb 19 6c 6c |{-....-.iA....ll| -000000e0 73 b0 05 fc b9 f4 76 91 2b 6a 72 fa d6 e5 87 a9 |s.....v.+jr.....| -000000f0 90 49 81 8c d5 fa 78 a2 a1 8f 77 c7 35 78 1b ba |.I....x...w.5x..| -00000100 ac 3c 41 51 ce 4e 99 c9 74 a0 bc 51 12 b5 15 2c |..G| -00000280 71 63 2f 0c 94 c9 42 ac bc 4c 0a 16 fe 9a 90 eb |qc/...B..L......| -00000290 02 75 16 1a 10 23 b2 75 67 c7 c5 17 55 9b cf 69 |.u...#.ug...U..i| -000002a0 17 03 03 00 1e 45 8c ed 99 0f 8a 83 d8 89 70 49 |.....E........pI| -000002b0 17 a8 fd 2b 6e ef ff 53 fa 99 52 89 ee 8b 19 f1 |...+n..S..R.....| -000002c0 41 09 30 17 03 03 00 13 14 f0 f6 ef c5 f9 52 15 |A.0...........R.| -000002d0 77 de 5e 46 63 8d 3b 2f 07 84 aa |w.^Fc.;/...| diff --git a/src/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled b/src/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled deleted file mode 100644 index c13db8d68a..0000000000 --- a/src/crypto/tls/testdata/Server-TLSv13-RSA-PSS-Disabled +++ /dev/null @@ -1,103 +0,0 @@ ->>> Flow 1 (client to server) -00000000 16 03 01 00 e0 01 00 00 dc 03 03 1e 9f 50 05 56 |.............P.V| -00000010 a7 21 c8 df 56 a8 f3 bb e4 15 3b b0 04 e5 f5 10 |.!..V.....;.....| -00000020 d8 5b 0e 68 d3 b4 39 64 b5 89 9c 20 5a 6b 29 6d |.[.h..9d... Zk)m| -00000030 22 a0 e0 fb 7f 2d 87 48 e7 b4 c9 b3 5a d0 2b c7 |"....-.H....Z.+.| -00000040 ad d8 e4 ad d5 eb 81 b3 1f 61 0e 65 00 08 13 02 |.........a.e....| -00000050 13 03 13 01 00 ff 01 00 00 8b 00 00 00 0e 00 0c |................| -00000060 00 00 09 31 32 37 2e 30 2e 30 2e 31 00 0b 00 04 |...127.0.0.1....| -00000070 03 00 01 02 00 0a 00 0c 00 0a 00 1d 00 17 00 1e |................| -00000080 00 19 00 18 00 16 00 00 00 17 00 00 00 0d 00 1e |................| -00000090 00 1c 04 03 05 03 06 03 08 07 08 08 08 09 08 0a |................| -000000a0 08 0b 08 04 08 05 08 06 04 01 05 01 06 01 00 2b |...............+| -000000b0 00 03 02 03 04 00 2d 00 02 01 01 00 33 00 26 00 |......-.....3.&.| -000000c0 24 00 1d 00 20 ba 67 99 b3 60 71 ed 6c bb 8d 7e |$... .g..`q.l..~| -000000d0 4c c3 ea 37 6d 90 b6 f8 91 67 71 2c 84 a7 32 3a |L..7m....gq,..2:| -000000e0 23 2a 90 13 35 |#*..5| ->>> Flow 2 (server to client) -00000000 16 03 03 00 7a 02 00 00 76 03 03 00 00 00 00 00 |....z...v.......| -00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| -00000020 00 00 00 00 00 00 00 00 00 00 00 20 5a 6b 29 6d |........... Zk)m| -00000030 22 a0 e0 fb 7f 2d 87 48 e7 b4 c9 b3 5a d0 2b c7 |"....-.H....Z.+.| -00000040 ad d8 e4 ad d5 eb 81 b3 1f 61 0e 65 13 02 00 00 |.........a.e....| -00000050 2e 00 2b 00 02 03 04 00 33 00 24 00 1d 00 20 2f |..+.....3.$... /| -00000060 e5 7d a3 47 cd 62 43 15 28 da ac 5f bb 29 07 30 |.}.G.bC.(.._.).0| -00000070 ff f6 84 af c4 cf c2 ed 90 99 5f 58 cb 3b 74 14 |.........._X.;t.| -00000080 03 03 00 01 01 17 03 03 00 17 d9 74 68 ee e6 54 |...........th..T| -00000090 e3 7a 0e ee 86 c7 a8 bb c7 65 fc e4 c4 6c 58 7a |.z.......e...lXz| -000000a0 1e 17 03 03 02 6d 98 c3 0c cc 80 fe ea 70 13 4e |.....m.......p.N| -000000b0 2f f6 49 99 5f 27 0a f9 4d cf e5 1a 9a 37 fb e7 |/.I._'..M....7..| -000000c0 3b a4 60 82 43 df fb fa 47 15 6f d8 db d2 3e c3 |;.`.C...G.o...>.| -000000d0 dd a0 37 ca b2 b4 c9 1b 5c 86 4a e0 7e 06 1e 27 |..7.....\.J.~..'| -000000e0 73 c6 cd 54 37 df 95 b1 c6 d5 44 85 2c 67 7d a7 |s..T7.....D.,g}.| -000000f0 2a 7d 87 86 5e f3 e5 60 f8 7c de bf 78 89 35 9b |*}..^..`.|..x.5.| -00000100 d1 0b 8a dd 6f 40 d8 5a 55 10 e2 71 b0 7a 5e 4b |....o@.ZU..q.z^K| -00000110 86 18 be 18 a7 f8 8e c6 ae 8c 1e df bf 84 77 c5 |..............w.| -00000120 dc b1 17 26 72 ea bb 9b 28 6c bf 19 8d 1a 22 90 |...&r...(l....".| -00000130 0f 19 92 5b ff db 07 84 48 61 68 f0 50 20 76 a3 |...[....Hah.P v.| -00000140 d3 f2 4a 3b 60 f5 73 cb 61 f7 11 63 f2 a7 0e 18 |..J;`.s.a..c....| -00000150 30 96 d0 17 f1 2f 58 09 49 33 15 3e 31 e4 17 e8 |0..../X.I3.>1...| -00000160 07 48 b5 43 06 40 60 4f a0 78 0d 51 0c 3f 0f 1a |.H.C.@`O.x.Q.?..| -00000170 8c 95 7a 3e 36 66 36 22 dc 58 4e b7 3e 19 ad de |..z>6f6".XN.>...| -00000180 c9 f9 b0 76 e4 e2 8c 04 27 6f 67 8f fe 86 b9 41 |...v....'og....A| -00000190 53 7d 9f d1 e0 a6 0b ec fc c0 82 bf 00 36 28 4d |S}...........6(M| -000001a0 20 3a e3 42 67 87 16 64 6c 4f e2 54 23 d1 0f 32 | :.Bg..dlO.T#..2| -000001b0 e9 16 9a da 46 a6 39 18 d5 6e a6 93 25 de a1 77 |....F.9..n..%..w| -000001c0 d9 26 b5 7c b4 85 8a 69 48 90 11 a9 8c 42 ca b8 |.&.|...iH....B..| -000001d0 88 63 df ec 6c e3 9f 2c 29 75 9b 57 79 8b 69 66 |.c..l..,)u.Wy.if| -000001e0 16 9e 93 48 04 8a 41 e0 8b 0e fb a5 9c fd 68 f6 |...H..A.......h.| -000001f0 5f ab 89 11 e4 aa 4c 6c 92 df b3 a3 39 f0 38 d9 |_.....Ll....9.8.| -00000200 7d 1b 42 13 ee d1 83 e2 20 3f 60 81 96 d9 63 2c |}.B..... ?`...c,| -00000210 e8 54 a5 08 41 9b 1d 02 41 37 a2 ce 0c 9b 34 bf |.T..A...A7....4.| -00000220 43 c5 ac 90 67 cd 6b b6 55 31 36 b1 2b 0e ed 8c |C...g.k.U16.+...| -00000230 23 ae 71 b2 ab f3 94 68 f2 f6 87 d3 87 61 ca aa |#.q....h.....a..| -00000240 0b 65 63 a1 11 dc 6d 74 33 c8 24 a6 ae 40 27 c7 |.ec...mt3.$..@'.| -00000250 d4 06 51 89 15 35 66 21 b0 82 15 87 70 c5 b8 8d |..Q..5f!....p...| -00000260 34 48 ff 41 e0 1a b0 46 f7 38 47 53 64 f7 a3 a2 |4H.A...F.8GSd...| -00000270 61 96 72 ea 90 de 86 18 64 49 91 ed 97 05 e3 27 |a.r.....dI.....'| -00000280 47 df ea 06 c6 28 f9 79 51 5e 64 b6 de 52 75 8a |G....(.yQ^d..Ru.| -00000290 79 8d 8e a6 d5 b0 f1 a6 ab 76 44 25 4b 80 5e e4 |y........vD%K.^.| -000002a0 d4 aa c6 2d 77 1a 49 52 16 d6 73 6b 18 2d d1 a6 |...-w.IR..sk.-..| -000002b0 4c e1 be 4d f8 79 34 a1 4c 81 88 9c 4b 85 f3 28 |L..M.y4.L...K..(| -000002c0 97 fc 3a 7e cf d4 81 2c d3 57 df 09 f5 49 f5 cf |..:~...,.W...I..| -000002d0 c7 7c 22 b3 8e 95 0f 97 6d d1 56 e3 43 7e 52 0f |.|".....m.V.C~R.| -000002e0 d4 da 3f e0 4e 06 b9 84 18 7d 7c 56 49 e0 d7 4a |..?.N....}|VI..J| -000002f0 d6 df c4 70 0c 74 5b 1f 4d 76 28 cd 3b b0 9e 27 |...p.t[.Mv(.;..'| -00000300 cc 6b 1a 13 41 1a 6b bf 0d 2d 93 b2 d5 7e 7e 25 |.k..A.k..-...~~%| -00000310 0e 8a 9c 17 03 03 00 99 df 4b 8e 3e d0 14 be 76 |.........K.>...v| -00000320 f1 d3 ca b1 39 c0 7e 6c 4f 8c d9 0d b8 83 07 39 |....9.~lO......9| -00000330 08 55 13 1e 3d 68 0f 99 9f 9a 68 1f 57 6a aa 41 |.U..=h....h.Wj.A| -00000340 a4 40 2b 12 f2 4b 6c db 3c 59 fa 99 5c e2 c7 2d |.@+..Kl.>> Flow 3 (client to server) -00000000 14 03 03 00 01 01 17 03 03 00 45 4b 7c c5 9e c6 |..........EK|...| -00000010 47 4a 90 d8 c2 c0 49 f7 3b c4 26 eb 15 18 9c bc |GJ....I.;.&.....| -00000020 c8 44 f0 53 94 2f 0f c8 d7 c1 86 42 ed b7 8f 63 |.D.S./.....B...c| -00000030 a0 97 5d 5b 15 01 3a 3d ca a6 d0 1a a4 77 cc 7e |..][..:=.....w.~| -00000040 88 fd 0b c9 a0 46 b7 40 25 8a 03 6e 99 66 bb 84 |.....F.@%..n.f..| ->>> Flow 4 (server to client) -00000000 17 03 03 00 1e 6a 41 80 ca 72 5f c3 ee e1 88 49 |.....jA..r_....I| -00000010 6d be a4 d9 26 07 5c 2b 2c a7 83 b5 c4 eb 4e 4b |m...&.\+,.....NK| -00000020 a1 29 98 17 03 03 00 13 2a f9 33 6c 46 f7 9a 51 |.)......*.3lF..Q| -00000030 1b 36 cd bc d8 5d 94 0d 9e 4b 72 |.6...]...Kr| diff --git a/src/crypto/tls/tls_test.go b/src/crypto/tls/tls_test.go index 208c13c195..9c26769b09 100644 --- a/src/crypto/tls/tls_test.go +++ b/src/crypto/tls/tls_test.go @@ -23,15 +23,11 @@ import ( "time" ) -var savedSupportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithmsTLS12 - func init() { - // TLS 1.3 is opt-in for Go 1.12, and RSA-PSS is disabled in TLS 1.2, but we - // want to run most tests with both enabled. TestTLS13Switch below and the - // "PSS-Disabled" recordings test the disabled behavior. See Issue 30055. + // TLS 1.3 is opt-in for Go 1.12, but we want to run most tests with it enabled. + // TestTLS13Switch below tests the disabled behavior. See Issue 30055. tls13Support.Do(func() {}) // defuse the sync.Once tls13Support.cached = true - supportedSignatureAlgorithmsTLS12 = supportedSignatureAlgorithms } var rsaCertPEM = `-----BEGIN CERTIFICATE----- -- GitLab From 5a1c7b5841270f9f1b2836aa1d23b289ec24fdc2 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Wed, 20 Feb 2019 13:50:08 -0500 Subject: [PATCH 0149/1679] crypto/tls: enable TLS 1.3 by default Updates #30055 Change-Id: I3e79dd7592673c5d76568b0bcded6c391c3be6b3 Reviewed-on: https://go-review.googlesource.com/c/163081 Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot Reviewed-by: Adam Langley --- src/crypto/tls/common.go | 8 ++++---- src/crypto/tls/tls.go | 9 ++------- src/crypto/tls/tls_test.go | 7 ------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/crypto/tls/common.go b/src/crypto/tls/common.go index d9f2d92512..7bc2e674f9 100644 --- a/src/crypto/tls/common.go +++ b/src/crypto/tls/common.go @@ -776,7 +776,7 @@ func (c *Config) supportedVersions(isClient bool) []uint16 { if isClient && v < VersionTLS10 { continue } - // TLS 1.3 is opt-in in Go 1.12. + // TLS 1.3 is opt-out in Go 1.13. if v == VersionTLS13 && !isTLS13Supported() { continue } @@ -791,11 +791,11 @@ var tls13Support struct { cached bool } -// isTLS13Supported returns whether the program opted into TLS 1.3 via -// GODEBUG=tls13=1. It's cached after the first execution. +// isTLS13Supported returns whether the program enabled TLS 1.3 by not opting +// out with GODEBUG=tls13=0. It's cached after the first execution. func isTLS13Supported() bool { tls13Support.Do(func() { - tls13Support.cached = goDebugString("tls13") == "1" + tls13Support.cached = goDebugString("tls13") != "0" }) return tls13Support.cached } diff --git a/src/crypto/tls/tls.go b/src/crypto/tls/tls.go index 578035cf73..35820745ec 100644 --- a/src/crypto/tls/tls.go +++ b/src/crypto/tls/tls.go @@ -5,14 +5,9 @@ // Package tls partially implements TLS 1.2, as specified in RFC 5246, // and TLS 1.3, as specified in RFC 8446. // -// TLS 1.3 is available only on an opt-in basis in Go 1.12. To enable +// TLS 1.3 is available on an opt-out basis in Go 1.13. To disable // it, set the GODEBUG environment variable (comma-separated key=value -// options) such that it includes "tls13=1". To enable it from within -// the process, set the environment variable before any use of TLS: -// -// func init() { -// os.Setenv("GODEBUG", os.Getenv("GODEBUG")+",tls13=1") -// } +// options) such that it includes "tls13=0". package tls // BUG(agl): The crypto/tls package only implements some countermeasures diff --git a/src/crypto/tls/tls_test.go b/src/crypto/tls/tls_test.go index 9c26769b09..0a3aeeff73 100644 --- a/src/crypto/tls/tls_test.go +++ b/src/crypto/tls/tls_test.go @@ -23,13 +23,6 @@ import ( "time" ) -func init() { - // TLS 1.3 is opt-in for Go 1.12, but we want to run most tests with it enabled. - // TestTLS13Switch below tests the disabled behavior. See Issue 30055. - tls13Support.Do(func() {}) // defuse the sync.Once - tls13Support.cached = true -} - var rsaCertPEM = `-----BEGIN CERTIFICATE----- MIIB0zCCAX2gAwIBAgIJAI/M7BYjwB+uMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX -- GitLab From 8da1b01e4c850d7cfbcdf5294e90d893e91a6a27 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 15 Feb 2019 12:15:11 +0100 Subject: [PATCH 0150/1679] debug/pe: omit panic in (*File).ImportedSymbols on empty optional headers If a PE file with invalid optional header size (neither sizeofOptionalHeader32 nor sizeofOptionalHeader64) is passed to NewFile, the File.OptionalHeader will be nil which leads to a panic in (*File).ImportedSymbols(). Fixes #30250 Change-Id: Ie97306de4a0e2dcfdc7b1b599891f574aa63adca Reviewed-on: https://go-review.googlesource.com/c/162858 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman --- src/debug/pe/file.go | 4 ++++ src/debug/pe/file_test.go | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go index 1c308b3dc3..1d714bf6e7 100644 --- a/src/debug/pe/file.go +++ b/src/debug/pe/file.go @@ -324,6 +324,10 @@ type ImportDirectory struct { // satisfied by other libraries at dynamic load time. // It does not return weak symbols. func (f *File) ImportedSymbols() ([]string, error) { + if f.OptionalHeader == nil { + return nil, nil + } + pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64 // grab the number of data directory entries diff --git a/src/debug/pe/file_test.go b/src/debug/pe/file_test.go index 9613af3a3c..f4b24f7253 100644 --- a/src/debug/pe/file_test.go +++ b/src/debug/pe/file_test.go @@ -5,6 +5,7 @@ package pe import ( + "bytes" "debug/dwarf" "internal/testenv" "io/ioutil" @@ -627,3 +628,22 @@ func TestImportTableInUnknownSection(t *testing.T) { t.Fatalf("unable to locate any imported symbols within file %q.", path) } } + +func TestInvalidFormat(t *testing.T) { + crashers := [][]byte{ + // https://golang.org/issue/30250 + []byte("\x00\x00\x00\x0000000\x00\x00\x00\x00\x00\x00\x000000" + + "00000000000000000000" + + "000000000\x00\x00\x0000000000" + + "00000000000000000000" + + "0000000000000000"), + } + + for _, data := range crashers { + f, err := NewFile(bytes.NewReader(data)) + if err != nil { + t.Error(err) + } + f.ImportedSymbols() + } +} -- GitLab From 9cb2471334e75c5e8f459e820feb75da315563a7 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 15 Feb 2019 14:59:36 +0100 Subject: [PATCH 0151/1679] debug/pe: prevent slice out of bounds access in (*File).ImportedSymbols Fixes #30253 Change-Id: I0c3d67649ea379b67f3575c1219fe05a04f056ae Reviewed-on: https://go-review.googlesource.com/c/162859 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman --- src/debug/pe/file.go | 2 +- src/debug/pe/file_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go index 1d714bf6e7..58814162bc 100644 --- a/src/debug/pe/file.go +++ b/src/debug/pe/file.go @@ -377,7 +377,7 @@ func (f *File) ImportedSymbols() ([]string, error) { // start decoding the import directory var ida []ImportDirectory - for len(d) > 0 { + for len(d) >= 20 { var dt ImportDirectory dt.OriginalFirstThunk = binary.LittleEndian.Uint32(d[0:4]) dt.TimeDateStamp = binary.LittleEndian.Uint32(d[4:8]) diff --git a/src/debug/pe/file_test.go b/src/debug/pe/file_test.go index f4b24f7253..6c7fe13caf 100644 --- a/src/debug/pe/file_test.go +++ b/src/debug/pe/file_test.go @@ -637,6 +637,36 @@ func TestInvalidFormat(t *testing.T) { "000000000\x00\x00\x0000000000" + "00000000000000000000" + "0000000000000000"), + // https://golang.org/issue/30253 + []byte("L\x01\b\x00regi\x00\x00\x00\x00\x00\x00\x00\x00\xe0\x00\x0f\x03" + + "\v\x01\x02\x18\x00\x0e\x00\x00\x00\x1e\x00\x00\x00\x02\x00\x00\x80\x12\x00\x00" + + "\x00\x10\x00\x00\x00 \x00\x00\x00\x00@\x00\x00\x10\x00\x00\x00\x02\x00\x00" + + "\x04\x00\x00\x00\x01\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00" + + "\x00\x04\x00\x00\x06S\x00\x00\x03\x00\x00\x00\x00\x00 \x00\x00\x10\x00\x00" + + "\x00\x00\x10\x00\x00\x10\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00`\x00\x00x\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x80\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8`\x00\x00|\x00\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x00\x00\x00\x00.text\x00\x00\x00d\f\x00\x00\x00\x10\x00\x00" + + "\x00\x0e\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "`\x00P`.data\x00\x00\x00\x10\x00\x00\x00\x00 \x00\x00" + + "\x00\x02\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "@\x000\xc0.rdata\x00\x004\x01\x00\x00\x000\x00\x00" + + "\x00\x02\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "@\x000@.eh_fram\xa0\x03\x00\x00\x00@\x00\x00" + + "\x00\x04\x00\x00\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "@\x000@.bss\x00\x00\x00\x00`\x00\x00\x00\x00P\x00\x00" + + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + + "\x80\x000\xc0.idata\x00\x00x\x03\x00\x00\x00`\x00\x00" + + "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00" + + "0\xc0.CRT\x00\x00\x00\x00\x18\x00\x00\x00\x00p\x00\x00\x00\x02" + + "\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00" + + "0\xc0.tls\x00\x00\x00\x00 \x00\x00\x00\x00\x80\x00\x00\x00\x02" + + "\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x001\xc9" + + "H\x895\x1d"), } for _, data := range crashers { -- GitLab From 8ee9bca2729ead81da6bf5a18b87767ff396d1b7 Mon Sep 17 00:00:00 2001 From: Gergely Brautigam Date: Fri, 18 Jan 2019 21:43:56 +0100 Subject: [PATCH 0152/1679] cmd/compile: suppress typecheck errors in a type switch case with broken type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a type switch case expression has failed typechecking, the case body is likely to also fail with confusing or spurious errors. Suppress typechecking the case body when this happens. Fixes #28926 Change-Id: Idfdb9d5627994f2fd90154af1659e9a92bf692c4 Reviewed-on: https://go-review.googlesource.com/c/158617 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/swt.go | 16 ++++++++-------- test/fixedbugs/issue28926.go | 24 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 test/fixedbugs/issue28926.go diff --git a/src/cmd/compile/internal/gc/swt.go b/src/cmd/compile/internal/gc/swt.go index 70fc66bf57..6a41885954 100644 --- a/src/cmd/compile/internal/gc/swt.go +++ b/src/cmd/compile/internal/gc/swt.go @@ -184,18 +184,11 @@ func typecheckswitch(n *Node) { } } - if n.Type == nil || n.Type.IsUntyped() { - // if the value we're switching on has no type or is untyped, - // we've already printed an error and don't need to continue - // typechecking the body - return - } - if top == Etype { ll := ncase.List if ncase.Rlist.Len() != 0 { nvar := ncase.Rlist.First() - if ll.Len() == 1 && ll.First().Type != nil && !ll.First().Type.IsKind(TNIL) { + if ll.Len() == 1 && (ll.First().Type == nil || !ll.First().Type.IsKind(TNIL)) { // single entry type switch nvar.Type = ll.First().Type } else { @@ -203,6 +196,13 @@ func typecheckswitch(n *Node) { nvar.Type = n.Type } + if nvar.Type == nil || nvar.Type.IsUntyped() { + // if the value we're switching on has no type or is untyped, + // we've already printed an error and don't need to continue + // typechecking the body + continue + } + nvar = typecheck(nvar, ctxExpr|ctxAssign) ncase.Rlist.SetFirst(nvar) } diff --git a/test/fixedbugs/issue28926.go b/test/fixedbugs/issue28926.go new file mode 100644 index 0000000000..5a46bd307c --- /dev/null +++ b/test/fixedbugs/issue28926.go @@ -0,0 +1,24 @@ +// errorcheck + +// Copyright 2018 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 main + +type Stringer interface { + String() string +} + +func main() { + var e interface{} + switch e := e.(type) { + case G: // ERROR "undefined: G" + e.M() // ok: this error should be ignored because the case failed its typecheck + case E: // ERROR "undefined: E" + e.D() // ok: this error should be ignored because the case failed its typecheck + case Stringer: + // ok: this error should not be ignored to prove that passing legs aren't left out + _ = e.(T) // ERROR "undefined: T" + } +} -- GitLab From 4a9aba5afe8358b1f7a55d374fbefd9504f377e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 11:17:12 +0100 Subject: [PATCH 0153/1679] syscall: add missing Setrlimit and Termios on aix/ppc64 This commits adds a missing syscall and a missing structure in syscall package. Change-Id: I9d630454c56337267f7bbb023e601246e14fc929 Reviewed-on: https://go-review.googlesource.com/c/163978 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser Reviewed-by: Ian Lance Taylor --- src/syscall/syscall_aix.go | 1 + src/syscall/types_aix.go | 5 +++ src/syscall/zsyscall_aix_ppc64.go | 13 +++++++ src/syscall/ztypes_aix_ppc64.go | 56 +++++++++++++++++-------------- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index ea88c666be..186522bdde 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -601,6 +601,7 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid), //sysnb Setpgid(pid int, pgid int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, buf *Statfs_t) (err error) //sys Symlink(path string, link string) (err error) diff --git a/src/syscall/types_aix.go b/src/syscall/types_aix.go index b961bdb197..ee9380a673 100644 --- a/src/syscall/types_aix.go +++ b/src/syscall/types_aix.go @@ -26,6 +26,7 @@ package syscall #include #include +#include #include #include @@ -170,3 +171,7 @@ const ( _AT_REMOVEDIR = C.AT_REMOVEDIR _AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW ) + +// Terminal handling + +type Termios C.struct_termios diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index fe27dcadf2..7d01dc013c 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -83,6 +83,7 @@ import "unsafe" //go:cgo_import_dynamic libc_Setpgid setpgid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setregid setregid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setreuid setreuid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_Setrlimit setrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Stat stat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Statfs statfs "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Symlink symlink "libc.a/shr_64.o" @@ -171,6 +172,7 @@ import "unsafe" //go:linkname libc_Setpgid libc_Setpgid //go:linkname libc_Setregid libc_Setregid //go:linkname libc_Setreuid libc_Setreuid +//go:linkname libc_Setrlimit libc_Setrlimit //go:linkname libc_Stat libc_Stat //go:linkname libc_Statfs libc_Statfs //go:linkname libc_Symlink libc_Symlink @@ -262,6 +264,7 @@ var ( libc_Setpgid, libc_Setregid, libc_Setreuid, + libc_Setrlimit, libc_Stat, libc_Statfs, libc_Symlink, @@ -1198,6 +1201,16 @@ func Setreuid(ruid int, euid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSyscall6(uintptr(unsafe.Pointer(&libc_Setrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/syscall/ztypes_aix_ppc64.go b/src/syscall/ztypes_aix_ppc64.go index 314266ea79..68810dbe7e 100644 --- a/src/syscall/ztypes_aix_ppc64.go +++ b/src/syscall/ztypes_aix_ppc64.go @@ -79,28 +79,27 @@ type Flock_t struct { } type Stat_t struct { - Dev uint64 - Ino uint64 - Mode uint32 - Nlink int16 - Flag uint16 - Uid uint32 - Gid uint32 - Rdev uint64 - Ssize int32 - Pad_cgo_0 [4]byte - Atim StTimespec_t - Mtim StTimespec_t - Ctim StTimespec_t - Blksize int64 - Blocks int64 - Vfstype int32 - Vfs uint32 - Type uint32 - Gen uint32 - Reserved [9]uint32 - Padto_ll uint32 - Size int64 + Dev uint64 + Ino uint64 + Mode uint32 + Nlink int16 + Flag uint16 + Uid uint32 + Gid uint32 + Rdev uint64 + Ssize int32 + Atim StTimespec_t + Mtim StTimespec_t + Ctim StTimespec_t + Blksize int64 + Blocks int64 + Vfstype int32 + Vfs uint32 + Type uint32 + Gen uint32 + Reserved [9]uint32 + Padto_ll uint32 + Size int64 } type Statfs_t struct { @@ -114,7 +113,6 @@ type Statfs_t struct { Ffree uint64 Fsid Fsid64_t Vfstype int32 - Pad_cgo_0 [4]byte Fsize uint64 Vfsnumber int32 Vfsoff int32 @@ -123,7 +121,7 @@ type Statfs_t struct { Fname [32]uint8 Fpack [32]uint8 Name_max int32 - Pad_cgo_1 [4]byte + Pad_cgo_0 [4]byte } type Fsid64_t struct { @@ -214,10 +212,8 @@ type Linger struct { type Msghdr struct { Name *byte Namelen uint32 - Pad_cgo_0 [4]byte Iov *Iovec Iovlen int32 - Pad_cgo_1 [4]byte Control *byte Controllen uint32 Flags int32 @@ -270,3 +266,11 @@ const ( _AT_REMOVEDIR = 0x1 _AT_SYMLINK_NOFOLLOW = 0x1 ) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [16]uint8 +} -- GitLab From bd986286767f046ae47b6496d4dffb541e6d0cb6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Feb 2019 10:22:32 -0500 Subject: [PATCH 0154/1679] math/cmplx: avoid panic in Pow(x, NaN()) Fixes #30088 Change-Id: I08cec17feddc86bd08532e6b135807e3c8f4c1b2 Reviewed-on: https://go-review.googlesource.com/c/161197 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/cmplx/cmath_test.go | 6 ++++-- src/math/cmplx/pow.go | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/math/cmplx/cmath_test.go b/src/math/cmplx/cmath_test.go index 80c3b33937..fbb49fdd5b 100644 --- a/src/math/cmplx/cmath_test.go +++ b/src/math/cmplx/cmath_test.go @@ -400,9 +400,11 @@ var polarSC = []ff{ } var vcPowSC = [][2]complex128{ {NaN(), NaN()}, + {0, NaN()}, } var powSC = []complex128{ NaN(), + NaN(), } var vcSinSC = []complex128{ NaN(), @@ -734,8 +736,8 @@ func TestPow(t *testing.T) { } } for i := 0; i < len(vcPowSC); i++ { - if f := Pow(vcPowSC[i][0], vcPowSC[i][0]); !cAlike(powSC[i], f) { - t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][0], f, powSC[i]) + if f := Pow(vcPowSC[i][0], vcPowSC[i][1]); !cAlike(powSC[i], f) { + t.Errorf("Pow(%g, %g) = %g, want %g", vcPowSC[i][0], vcPowSC[i][1], f, powSC[i]) } } for _, pt := range branchPoints { diff --git a/src/math/cmplx/pow.go b/src/math/cmplx/pow.go index 1630b879b8..5a405f8e96 100644 --- a/src/math/cmplx/pow.go +++ b/src/math/cmplx/pow.go @@ -48,6 +48,9 @@ import "math" // Pow(0, c) for real(c)<0 returns Inf+0i if imag(c) is zero, otherwise Inf+Inf i. func Pow(x, y complex128) complex128 { if x == 0 { // Guaranteed also true for x == -0. + if IsNaN(y) { + return NaN() + } r, i := real(y), imag(y) switch { case r == 0: -- GitLab From 43732816be576bfa3b57e58941d7a46b46090dc3 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Wed, 26 Dec 2018 12:09:49 +0530 Subject: [PATCH 0155/1679] syscall/js: add a note about a bug in TypedArray MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #29355 Change-Id: I4018d420c8d413b2681744af18ffb65da03ac504 Reviewed-on: https://go-review.googlesource.com/c/155778 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Richard Musiol --- src/syscall/js/typedarray.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/syscall/js/typedarray.go b/src/syscall/js/typedarray.go index aa56cf69f3..04c0057106 100644 --- a/src/syscall/js/typedarray.go +++ b/src/syscall/js/typedarray.go @@ -25,6 +25,11 @@ var ( var _ Wrapper = TypedArray{} // TypedArray must implement Wrapper // TypedArray represents a JavaScript typed array. +// +// BUG(neelance): The typed array currently becomes inaccessible when Go requests more memory +// from the WebAssembly host. It is recommended to only use the typed array synchronously +// without keeping a long-lived reference. You can also check if the length property is zero +// to detect this detached state of the typed array. type TypedArray struct { Value } -- GitLab From 850e3636d5d269c71df22a88f49423fe87179519 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Wed, 27 Feb 2019 20:56:43 +0900 Subject: [PATCH 0156/1679] Revert "net: add missing error check in test" This reverts commit ec521467e33eee0a62ed426ca0c66b865baedfc7. Reson for revert: The test cases using slowDst4 and slowDst6 are fragile. We need to find out a better approach to the trick on the IP routeability. Change-Id: I544453886e809d1c7b339673d8f1d5bdef357147 Reviewed-on: https://go-review.googlesource.com/c/163919 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/net/dial_test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/net/dial_test.go b/src/net/dial_test.go index 07d2bb22aa..3a2c59a2d1 100644 --- a/src/net/dial_test.go +++ b/src/net/dial_test.go @@ -338,11 +338,6 @@ func TestDialParallel(t *testing.T) { if c != nil { c.Close() } - if tt.expectOk && err != nil { - t.Errorf("#%d (cancel): got %v; want nil", i, err) - } else if !tt.expectOk && err == nil { - t.Errorf("#%d (cancel): got nil; want non-nil", i) - } elapsed = time.Now().Sub(startTime) if elapsed > 100*time.Millisecond { t.Errorf("#%d (cancel): got %v; want <= 100ms", i, elapsed) -- GitLab From 0d8c3637b1482402eb5328ca089862eb30fa636a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 27 Feb 2019 13:49:17 +0100 Subject: [PATCH 0157/1679] cmd/go: fix -Wl,--whole-archive for aix/ppc64 --whole-archive doesn't exist on AIX. It was already removed most of the time but was still added with c-archive or c-shared buildmodes. Change-Id: Ia7360638509d4a4d91674b0281ed4b112508a2c9 Reviewed-on: https://go-review.googlesource.com/c/164037 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/gccgo.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 69a25bea62..184d2919ca 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -407,6 +407,7 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string } var realOut string + goLibBegin := str.StringList(wholeArchive, "-lgolibbegin", noWholeArchive) switch buildmode { case "exe": if usesCgo && cfg.Goos == "linux" { @@ -428,7 +429,8 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string // split-stack and non-split-stack code in a single -r // link, and libgo picks up non-split-stack code from // libffi. - ldflags = append(ldflags, "-Wl,-r", "-nostdlib", "-Wl,--whole-archive", "-lgolibbegin", "-Wl,--no-whole-archive") + ldflags = append(ldflags, "-Wl,-r", "-nostdlib") + ldflags = append(ldflags, goLibBegin...) if nopie := b.gccNoPie([]string{tools.linker()}); nopie != "" { ldflags = append(ldflags, nopie) @@ -443,7 +445,10 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string out = out + ".o" case "c-shared": - ldflags = append(ldflags, "-shared", "-nostdlib", "-Wl,--whole-archive", "-lgolibbegin", "-Wl,--no-whole-archive", "-lgo", "-lgcc_s", "-lgcc", "-lc", "-lgcc") + ldflags = append(ldflags, "-shared", "-nostdlib") + ldflags = append(ldflags, goLibBegin...) + ldflags = append(ldflags, "-lgo", "-lgcc_s", "-lgcc", "-lc", "-lgcc") + case "shared": if cfg.Goos != "aix" { ldflags = append(ldflags, "-zdefs") -- GitLab From f40cb19affbb3be090b3519f957b5198744022be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 27 Feb 2019 13:09:22 +0100 Subject: [PATCH 0158/1679] internal/lazyregexp: add a lazy Regexp package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was implemented as part of go/doc, but it's going to be useful in other packages. In particular, many packages under cmd/go like web and vcs make somewhat heavy use of global regexes, which add a non-trivial amount of init work to the cmd/go program. A lazy wrapper around regexp.Regexp will make it trivial to get rid of the extra cost with a trivial refactor, so make it possible for other packages in the repository to make use of it. While naming the package, give the members better names, such as lazyregexp.New and lazyregexp.Regexp. We're also considering adding some form of a lazy API to the public regexp package, so this internal package will allow us to get some initial experience across std and cmd. For #29382. Change-Id: I30b0e72871d5267c309786f95f4cb15c68b2393d Reviewed-on: https://go-review.googlesource.com/c/164040 Run-TryBot: Daniel Martí Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/go/build/deps_test.go | 11 ++++++----- src/go/doc/comment.go | 5 +++-- src/go/doc/reader.go | 7 ++++--- src/{go/doc => internal/lazyregexp}/lazyre.go | 18 +++++++++--------- 4 files changed, 22 insertions(+), 19 deletions(-) rename src/{go/doc => internal/lazyregexp}/lazyre.go (66%) diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 2c29a3e601..9d6d038dab 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -192,10 +192,11 @@ var pkgDeps = map[string][]string{ "runtime/trace": {"L0", "context", "fmt"}, "text/tabwriter": {"L2"}, - "testing": {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"}, - "testing/iotest": {"L2", "log"}, - "testing/quick": {"L2", "flag", "fmt", "reflect", "time"}, - "internal/testenv": {"L2", "OS", "flag", "testing", "syscall"}, + "testing": {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"}, + "testing/iotest": {"L2", "log"}, + "testing/quick": {"L2", "flag", "fmt", "reflect", "time"}, + "internal/testenv": {"L2", "OS", "flag", "testing", "syscall"}, + "internal/lazyregexp": {"L2", "OS", "regexp"}, // L4 is defined as L3+fmt+log+time, because in general once // you're using L3 packages, use of fmt, log, or time is not a big deal. @@ -208,7 +209,7 @@ var pkgDeps = map[string][]string{ // Go parser. "go/ast": {"L4", "OS", "go/scanner", "go/token"}, - "go/doc": {"L4", "OS", "go/ast", "go/token", "regexp", "text/template"}, + "go/doc": {"L4", "OS", "go/ast", "go/token", "regexp", "internal/lazyregexp", "text/template"}, "go/parser": {"L4", "OS", "go/ast", "go/scanner", "go/token"}, "go/printer": {"L4", "OS", "go/ast", "go/scanner", "go/token", "text/tabwriter"}, "go/scanner": {"L4", "OS", "go/token"}, diff --git a/src/go/doc/comment.go b/src/go/doc/comment.go index 73857330fa..31ee93e44f 100644 --- a/src/go/doc/comment.go +++ b/src/go/doc/comment.go @@ -8,6 +8,7 @@ package doc import ( "bytes" + "internal/lazyregexp" "io" "strings" "text/template" // for HTMLEscape @@ -69,7 +70,7 @@ const ( urlRx = protoPart + `://` + hostPart + pathPart ) -var matchRx = newLazyRE(`(` + urlRx + `)|(` + identRx + `)`) +var matchRx = lazyregexp.New(`(` + urlRx + `)|(` + identRx + `)`) var ( html_a = []byte(` 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") -func newLazyRE(str string) *lazyRE { - lr := &lazyRE{str: str} +func New(str string) *Regexp { + lr := &Regexp{str: str} if inTest { // In tests, always compile the regexps early. lr.re() -- GitLab From dd91269b7c470d07ba0efe1abab85011f41e38bc Mon Sep 17 00:00:00 2001 From: erifan01 Date: Wed, 2 Jan 2019 09:14:26 +0000 Subject: [PATCH 0159/1679] cmd/compile: optimize math/bits Len32 intrinsic on arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Arm64 has a 32-bit CLZ instruction CLZW, which can be used for intrinsic Len32. Function LeadingZeros32 calls Len32, with this change, the assembly code of LeadingZeros32 becomes more concise. Go code: func f32(x uint32) { z = bits.LeadingZeros32(x) } Before: "".f32 STEXT size=32 args=0x8 locals=0x0 leaf 0x0000 00000 (test.go:7) TEXT "".f32(SB), LEAF|NOFRAME|ABIInternal, $0-8 0x0004 00004 (test.go:7) MOVWU "".x(FP), R0 0x0008 00008 ($GOROOT/src/math/bits/bits.go:30) CLZ R0, R0 0x000c 00012 ($GOROOT/src/math/bits/bits.go:30) SUB $32, R0, R0 0x0010 00016 (test.go:7) MOVD R0, "".z(SB) 0x001c 00028 (test.go:7) RET (R30) After: "".f32 STEXT size=32 args=0x8 locals=0x0 leaf 0x0000 00000 (test.go:7) TEXT "".f32(SB), LEAF|NOFRAME|ABIInternal, $0-8 0x0004 00004 (test.go:7) MOVWU "".x(FP), R0 0x0008 00008 ($GOROOT/src/math/bits/bits.go:30) CLZW R0, R0 0x000c 00012 (test.go:7) MOVD R0, "".z(SB) 0x0018 00024 (test.go:7) RET (R30) Benchmarks: name old time/op new time/op delta LeadingZeros-8 2.53ns ± 0% 2.55ns ± 0% +0.67% (p=0.000 n=10+10) LeadingZeros8-8 3.56ns ± 0% 3.56ns ± 0% ~ (all equal) LeadingZeros16-8 3.55ns ± 0% 3.56ns ± 0% ~ (p=0.465 n=10+10) LeadingZeros32-8 3.55ns ± 0% 2.96ns ± 0% -16.71% (p=0.000 n=10+7) LeadingZeros64-8 2.53ns ± 0% 2.54ns ± 0% ~ (p=0.059 n=8+10) Change-Id: Ie5666bb82909e341060e02ffd4e86c0e5d67e90a Reviewed-on: https://go-review.googlesource.com/c/157000 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 4 ++-- src/cmd/compile/internal/ssa/gen/ARM64.rules | 1 + src/cmd/compile/internal/ssa/rewriteARM64.go | 22 ++++++++++++++++++++ test/codegen/mathbits.go | 2 +- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index c8befa40cd..95904edd6a 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3327,7 +3327,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpBitLen32, types.Types[TINT], args[0]) }, - sys.AMD64) + sys.AMD64, sys.ARM64) addF("math/bits", "Len32", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { if s.config.PtrSize == 4 { @@ -3336,7 +3336,7 @@ func init() { x := s.newValue1(ssa.OpZeroExt32to64, types.Types[TUINT64], args[0]) return s.newValue1(ssa.OpBitLen64, types.Types[TINT], x) }, - sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) addF("math/bits", "Len16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { if s.config.PtrSize == 4 { diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 1efce66016..fc806f75a0 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -123,6 +123,7 @@ (FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) -> (FMOVSgpfp val) (BitLen64 x) -> (SUB (MOVDconst [64]) (CLZ x)) +(BitLen32 x) -> (SUB (MOVDconst [32]) (CLZW x)) (Bswap64 x) -> (REV x) (Bswap32 x) -> (REVW x) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 2afd0f335e..05b8b9c697 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -427,6 +427,8 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpAtomicStorePtrNoWB_0(v) case OpAvg64u: return rewriteValueARM64_OpAvg64u_0(v) + case OpBitLen32: + return rewriteValueARM64_OpBitLen32_0(v) case OpBitLen64: return rewriteValueARM64_OpBitLen64_0(v) case OpBitRev16: @@ -32715,6 +32717,26 @@ func rewriteValueARM64_OpAvg64u_0(v *Value) bool { return true } } +func rewriteValueARM64_OpBitLen32_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (BitLen32 x) + // cond: + // result: (SUB (MOVDconst [32]) (CLZW x)) + for { + x := v.Args[0] + v.reset(OpARM64SUB) + v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) + v0.AuxInt = 32 + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpARM64CLZW, typ.Int) + v1.AddArg(x) + v.AddArg(v1) + return true + } +} func rewriteValueARM64_OpBitLen64_0(v *Value) bool { b := v.Block _ = b diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 44ab2c02b7..d8b1775b0f 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -31,7 +31,7 @@ func LeadingZeros64(n uint64) int { func LeadingZeros32(n uint32) int { // amd64:"BSRQ","LEAQ",-"CMOVQEQ" // s390x:"FLOGR" - // arm:"CLZ" arm64:"CLZ" + // arm:"CLZ" arm64:"CLZW" // mips:"CLZ" return bits.LeadingZeros32(n) } -- GitLab From a1925076fe5436bf7316fd2ab30d5e716df46f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 30 Dec 2018 18:43:13 +0100 Subject: [PATCH 0160/1679] cmd/go: add benchmark that execs 'go env GOARCH' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'go env' is used for many quick operations, such as in go/packages to query GOARCH and GOMOD. It often is a bottleneck; for example, go/packages doesn't know whether or not to use Go modules until it has queried GOMOD. As such, this go command should be fast. Right now it's slower than it should be. This commit adds a simple benchmark with os/exec, since we're particularly interested in the cost of cmd/go's large init function. Updates #29382. Change-Id: Ifee6fb9997b9b89565fbfc2739a00c86117b1d37 Reviewed-on: https://go-review.googlesource.com/c/155961 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/init_test.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/cmd/go/init_test.go diff --git a/src/cmd/go/init_test.go b/src/cmd/go/init_test.go new file mode 100644 index 0000000000..ed90a77841 --- /dev/null +++ b/src/cmd/go/init_test.go @@ -0,0 +1,34 @@ +// Copyright 2018 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 main_test + +import ( + "internal/testenv" + "os/exec" + "testing" +) + +// BenchmarkExecGoEnv measures how long it takes for 'go env GOARCH' to run. +// Since 'go' is executed, remember to run 'go install cmd/go' before running +// the benchmark if any changes were done. +func BenchmarkExecGoEnv(b *testing.B) { + testenv.MustHaveExec(b) + b.StopTimer() + gotool, err := testenv.GoTool() + if err != nil { + b.Fatal(err) + } + for i := 0; i < b.N; i++ { + cmd := exec.Command(gotool, "env", "GOARCH") + + b.StartTimer() + err := cmd.Run() + b.StopTimer() + + if err != nil { + b.Fatal(err) + } + } +} -- GitLab From d7518ac51879011a732440d4a49dc7043759e2c8 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Wed, 27 Feb 2019 17:25:28 +0100 Subject: [PATCH 0161/1679] doc: add 1.10.8 and 1.11.5 to the releases list Fixes #30431 Change-Id: I379e78a1c385942a19e1a10b91d732f9a73899e6 Reviewed-on: https://go-review.googlesource.com/c/164041 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 58f9a585ed..3b6131b331 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -73,6 +73,13 @@ See the Go +1.11.5 milestone on our issue tracker for details. +

    +

    go1.10 (released 2018/02/16)

    @@ -138,6 +145,13 @@ See the Go +1.10.8 milestone on our issue tracker for details. +

    +

    go1.9 (released 2017/08/24)

    -- GitLab From 2c86713303ba0aac0bf112e2f44f04d5fcd4bf42 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 20 Feb 2019 13:52:23 -0500 Subject: [PATCH 0162/1679] cmd/go: expand tests for standard-library vendoring in GOPATH mode This should help to catch any regressions in the course of implementing #26924. Updates #26924 Change-Id: Ide28a9aa0235867e0ce72f855fbed51c50e2c2f2 Reviewed-on: https://go-review.googlesource.com/c/163520 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/testdata/script/list_std.txt | 17 +++++++++++++--- src/cmd/go/testdata/script/std_vendor.txt | 24 +++++++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/std_vendor.txt diff --git a/src/cmd/go/testdata/script/list_std.txt b/src/cmd/go/testdata/script/list_std.txt index 88a659f743..5960d442e5 100644 --- a/src/cmd/go/testdata/script/list_std.txt +++ b/src/cmd/go/testdata/script/list_std.txt @@ -2,13 +2,24 @@ env GO111MODULE=off [!gc] skip -# listing GOROOT should only find standard packages +# Listing GOROOT should only find standard packages. cd $GOROOT/src go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' ./... ! stdout . # TODO: ignore _/blah/go/src in output -# our vendored packages should be reported as standard -go list std cmd +# Standard packages should include cmd, but not cmd/vendor. +go list ./... +stdout cmd/compile +! stdout vendor/golang.org +! stdout cmd/vendor + +# In GOPATH mode, packages vendored into GOROOT should be reported as standard. +go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd stdout internal/x/net/http2/hpack stdout cmd/vendor/golang\.org/x/arch/x86/x86asm + +# However, vendored packages should not match wildcard patterns beginning with cmd. +go list cmd/... +stdout cmd/compile +! stdout cmd/vendor diff --git a/src/cmd/go/testdata/script/std_vendor.txt b/src/cmd/go/testdata/script/std_vendor.txt new file mode 100644 index 0000000000..f781519973 --- /dev/null +++ b/src/cmd/go/testdata/script/std_vendor.txt @@ -0,0 +1,24 @@ +env GO111MODULE=off + +[!gc] skip + +# 'go list' should report imports from _test.go in the TestImports field. +go list -f '{{.TestImports}}' +stdout net/http # from .TestImports + +# 'go list -test' should report vendored transitive dependencies of _test.go +# imports in the Deps field, with a 'vendor' prefix on their import paths. +go list -test -f '{{.Deps}}' +stdout internal/x/crypto # dep of .TestImports + +-- go.mod -- +module m + +-- x.go -- +package x + +-- x_test.go -- +package x +import "testing" +import _ "net/http" +func Test(t *testing.T) {} -- GitLab From 5c9a96c420ce8eace6168defa0a8eff05c55ef60 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 27 Feb 2019 10:46:18 -0500 Subject: [PATCH 0163/1679] misc/cgo/test: skip TestCrossPackageTests on Android This test currently fails in the Android builders, with the message pkg_test.go:64: go test -short: exec: "go": executable file not found in $PATH (https://build.golang.org/log/39ec0da5bfb7793359e199cc8e358ca5a8257840) I was not able to test this change, because I can't get 'gomote create' to return an instance of anything Android. However, I will watch the build dashboard after submitting to verify that the fix works. Updates #30228 Android appears to lack a 'go' command in the. Change-Id: Ieacac7f50d19e2cfef2f5d60e79a159e55b5cfa8 Reviewed-on: https://go-review.googlesource.com/c/164097 Run-TryBot: Bryan C. Mills Reviewed-by: Elias Naur --- misc/cgo/test/pkg_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misc/cgo/test/pkg_test.go b/misc/cgo/test/pkg_test.go index 6857609a10..76b0d586b2 100644 --- a/misc/cgo/test/pkg_test.go +++ b/misc/cgo/test/pkg_test.go @@ -27,7 +27,10 @@ import ( // this shim and move the tests currently located in testdata back into the // parent directory. func TestCrossPackageTests(t *testing.T) { - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "android": + t.Skip("Can't exec cmd/go subprocess on Android.") + case "darwin": switch runtime.GOARCH { case "arm", "arm64": t.Skip("Can't exec cmd/go subprocess on iOS.") -- GitLab From c81b830023d33b51384f14245bee195c65c1f7b8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 27 Feb 2019 12:14:59 -0500 Subject: [PATCH 0164/1679] cmd/dist: execute misc/cgo/testso{,var} as regular tests, not host tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These tests use runtime.GOOS and runtime.GOARCH to determine whether to run, so must be built and run using the destination's — not the host's — GOOS and GOARCH. Updates #30228 Change-Id: I6774dacd01c68b395fca8ca61f70d5879270af8a Reviewed-on: https://go-review.googlesource.com/c/164117 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/dist/test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 6f2eee19df..025da74a15 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -674,8 +674,8 @@ func (t *tester) registerTests() { // recompile the entire standard library. If make.bash ran with // special -gcflags, that's not true. if t.cgoEnabled && gogcflags == "" { - t.registerHostTest("testso", "../misc/cgo/testso", "misc/cgo/testso", ".") - t.registerHostTest("testsovar", "../misc/cgo/testsovar", "misc/cgo/testsovar", ".") + t.registerTest("testso", "../misc/cgo/testso", t.goTest(), t.timeout(600)) + t.registerTest("testsovar", "../misc/cgo/testsovar", t.goTest(), t.timeout(600)) if t.supportedBuildmode("c-archive") { t.registerHostTest("testcarchive", "../misc/cgo/testcarchive", "misc/cgo/testcarchive", ".") } -- GitLab From fa8a3f3080bdc59d18f3c093e8239bf34e976906 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 27 Feb 2019 12:25:59 -0500 Subject: [PATCH 0165/1679] cmd/link: do not close over the loop variable in testDWARF Fixes #30429 Updates #16520 Updates #20733 Change-Id: Iae41f06c09aaaed500936f5496d90cefbe8293e4 Reviewed-on: https://go-review.googlesource.com/c/164119 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Ian Lance Taylor --- src/cmd/link/dwarf_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 710457aeb9..880b2ced6d 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -44,6 +44,7 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) defer os.RemoveAll(tmpDir) for _, prog := range []string{"testprog", "testprogcgo"} { + prog := prog t.Run(prog, func(t *testing.T) { t.Parallel() -- GitLab From 5f8ca7ee24e82fa86171062724ed84e8b6e79ae2 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 21 Feb 2019 15:39:34 -0500 Subject: [PATCH 0166/1679] misc: add go.mod file Updates #30228 Updates #30241 Change-Id: I7ee839f4d2840873f7e37b3aff93fe534c6b52e6 Reviewed-on: https://go-review.googlesource.com/c/163207 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/go.mod | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 misc/go.mod diff --git a/misc/go.mod b/misc/go.mod new file mode 100644 index 0000000000..fc9f1133a4 --- /dev/null +++ b/misc/go.mod @@ -0,0 +1,11 @@ +// Module misc contains tests and binaries that pertain to specific build modes +// (cgo) and platforms (Android and iOS). +// +// The 'run' scripts in ../src execute these tests and binaries, which need to +// be in a module in order to build and run successfully in module mode. +// (Otherwise, they lack well-defined import paths, and module mode — unlike +// GOPATH mode — does not synthesize import paths from the absolute working +// directory.) +module misc + +go 1.12 -- GitLab From c33a9511e7ba79177c256e1ff9d7c952ab80104f Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 27 Feb 2019 18:53:14 +0100 Subject: [PATCH 0167/1679] cmd/dist: fix variable name Noticed by Bryan after CL 163618 went in. Change-Id: Ia33c80dca60321f6a8329097ff55118e5d2634ab Reviewed-on: https://go-review.googlesource.com/c/164042 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/dist/build.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 43e1fe66f3..03f0f03657 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1405,17 +1405,17 @@ func goInstall(goBinary string, args ...string) { } func goCmd(goBinary string, cmd string, args ...string) { - installCmd := []string{goBinary, cmd, "-gcflags=all=" + gogcflags, "-ldflags=all=" + goldflags} + goCmd := []string{goBinary, cmd, "-gcflags=all=" + gogcflags, "-ldflags=all=" + goldflags} if vflag > 0 { - installCmd = append(installCmd, "-v") + goCmd = append(goCmd, "-v") } // Force only one process at a time on vx32 emulation. if gohostos == "plan9" && os.Getenv("sysname") == "vx32" { - installCmd = append(installCmd, "-p=1") + goCmd = append(goCmd, "-p=1") } - run(goroot, ShowOutput|CheckExit, append(installCmd, args...)...) + run(goroot, ShowOutput|CheckExit, append(goCmd, args...)...) } func checkNotStale(goBinary string, targets ...string) { -- GitLab From 694cd005c3943027a4533a0a534837108ccd66f6 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 2 Dec 2018 10:15:35 -0800 Subject: [PATCH 0168/1679] runtime: speed up ifaceeq for direct ifaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit name old time/op new time/op delta EfaceCmpDiff-8 421ns ± 3% 299ns ± 3% -28.93% (p=0.000 n=92+94) EfaceCmpDiffIndirect-8 497ns ± 4% 496ns ± 3% ~ (p=0.840 n=98+92) Change-Id: Id1a8c779413ba35ab0f58d055870b6a0714b51b7 Reviewed-on: https://go-review.googlesource.com/c/152163 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/alg.go | 8 ++++++-- src/runtime/runtime_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/runtime/alg.go b/src/runtime/alg.go index 887dbebdeb..1c6795a1fa 100644 --- a/src/runtime/alg.go +++ b/src/runtime/alg.go @@ -224,7 +224,10 @@ func efaceeq(t *_type, x, y unsafe.Pointer) bool { panic(errorString("comparing uncomparable type " + t.string())) } if isDirectIface(t) { - return eq(noescape(unsafe.Pointer(&x)), noescape(unsafe.Pointer(&y))) + // Direct interface types are ptr, chan, map, func, and single-element structs/arrays thereof. + // Maps and funcs are not comparable, so they can't reach here. + // Ptrs, chans, and single-element items can be compared directly using ==. + return x == y } return eq(x, y) } @@ -238,7 +241,8 @@ func ifaceeq(tab *itab, x, y unsafe.Pointer) bool { panic(errorString("comparing uncomparable type " + t.string())) } if isDirectIface(t) { - return eq(noescape(unsafe.Pointer(&x)), noescape(unsafe.Pointer(&y))) + // See comment in efaceeq. + return x == y } return eq(x, y) } diff --git a/src/runtime/runtime_test.go b/src/runtime/runtime_test.go index 8263d4059a..5ea9cbd88a 100644 --- a/src/runtime/runtime_test.go +++ b/src/runtime/runtime_test.go @@ -70,6 +70,18 @@ func BenchmarkEfaceCmpDiff(b *testing.B) { } } +func BenchmarkEfaceCmpDiffIndirect(b *testing.B) { + efaceCmp1 = [2]int{1, 2} + efaceCmp2 = [2]int{1, 2} + for i := 0; i < b.N; i++ { + for j := 0; j < 100; j++ { + if efaceCmp1 != efaceCmp2 { + b.Fatal("bad comparison") + } + } + } +} + func BenchmarkDefer(b *testing.B) { for i := 0; i < b.N; i++ { defer1() -- GitLab From 9892ccff23c94c5fabd704ff0c027d45b7b03cb8 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 6 Nov 2018 16:27:58 -0800 Subject: [PATCH 0169/1679] cmd/compile: add types.SoleComponent, use in convFuncName The specialized conversion functions care only about a type's layout in memory, so e.g. [1]string is equivalent to string. Add types.SoleComponent to assist with such use cases, and use it for the specialized conversion functions. Increases the number of convTstring calls by ~1%. Change-Id: I09a392909f2037387b30642781e65f707a048af5 Reviewed-on: https://go-review.googlesource.com/c/148577 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/walk.go | 12 ++++++++---- src/cmd/compile/internal/types/type.go | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 1d6321212e..41a9d8e9dc 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -398,10 +398,14 @@ func convFuncName(from, to *types.Type) (fnname string, needsaddr bool) { return "convT32", false case from.Size() == 8 && from.Align == types.Types[TUINT64].Align && !types.Haspointers(from): return "convT64", false - case from.IsString(): - return "convTstring", false - case from.IsSlice(): - return "convTslice", false + } + if sc := from.SoleComponent(); sc != nil { + switch { + case sc.IsString(): + return "convTstring", false + case sc.IsSlice(): + return "convTslice", false + } } switch tkind { diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index 7d123e4610..e2f3e66d8b 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -1395,6 +1395,28 @@ func (t *Type) NumComponents(countBlank componentsIncludeBlankFields) int64 { return 1 } +// SoleComponent returns the only primitive component in t, +// if there is exactly one. Otherwise, it returns nil. +// Components are counted as in NumComponents, including blank fields. +func (t *Type) SoleComponent() *Type { + switch t.Etype { + case TSTRUCT: + if t.IsFuncArgStruct() { + Fatalf("SoleComponent func arg struct") + } + if t.NumFields() != 1 { + return nil + } + return t.Field(0).Type.SoleComponent() + case TARRAY: + if t.NumElem() != 1 { + return nil + } + return t.Elem().SoleComponent() + } + return t +} + // ChanDir returns the direction of a channel type t. // The direction will be one of Crecv, Csend, or Cboth. func (t *Type) ChanDir() ChanDir { -- GitLab From 58bf401293bd1de3740613f586b5b970dc991d39 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 27 Dec 2018 14:23:29 -1000 Subject: [PATCH 0170/1679] time: reject tzdata with no zones Fixes #29437 Change-Id: Ice0a03a543e564d66651bfdfce5cd32ebaa35926 Reviewed-on: https://go-review.googlesource.com/c/155746 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/time/zoneinfo_read.go | 8 +++++++- src/time/zoneinfo_test.go | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/time/zoneinfo_read.go b/src/time/zoneinfo_read.go index d54632fb49..1e559a62cc 100644 --- a/src/time/zoneinfo_read.go +++ b/src/time/zoneinfo_read.go @@ -216,7 +216,13 @@ func LoadLocationFromTZData(name string, data []byte) (*Location, error) { // Now we can build up a useful data structure. // First the zone information. // utcoff[4] isdst[1] nameindex[1] - zone := make([]zone, n[NZone]) + nzone := n[NZone] + if nzone == 0 { + // Reject tzdata files with no zones. There's nothing useful in them. + // This also avoids a panic later when we add and then use a fake transition (golang.org/issue/29437). + return nil, badData + } + zone := make([]zone, nzone) for i := range zone { var ok bool var n uint32 diff --git a/src/time/zoneinfo_test.go b/src/time/zoneinfo_test.go index cd0731768e..a7ef10c6bc 100644 --- a/src/time/zoneinfo_test.go +++ b/src/time/zoneinfo_test.go @@ -173,3 +173,12 @@ func TestEarlyLocation(t *testing.T) { t.Errorf("Zone offset == %d, want %d", tzOffset, want) } } + +func TestMalformedTZData(t *testing.T) { + // The goal here is just that malformed tzdata results in an error, not a panic. + issue29437 := "TZif\x00000000000000000\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0000" + _, err := time.LoadLocationFromTZData("abc", []byte(issue29437)) + if err == nil { + t.Error("expected error, got none") + } +} -- GitLab From 1413e94178748d369391cb700d76ff4abdd5cf63 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 27 Feb 2019 13:02:04 -0500 Subject: [PATCH 0171/1679] cmd/dist: execute cgo_stdio and cgo_life as host tests Now that these tests are written in Go, they must be run in host mode in order to be able to exec `go run` as a subprocess. Updates #30228 Change-Id: Ibedf86a8e18ae1b6f583c1bbdcb99d19c8e01744 Reviewed-on: https://go-review.googlesource.com/c/164137 Run-TryBot: Bryan C. Mills Reviewed-by: Elias Naur TryBot-Result: Gobot Gobot --- src/cmd/dist/test.go | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 025da74a15..68401e546b 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -606,22 +606,8 @@ func (t *tester) registerTests() { if t.cgoEnabled && !t.iOS() { // Disabled on iOS. golang.org/issue/15919 - t.tests = append(t.tests, distTest{ - name: "cgo_stdio", - heading: "../misc/cgo/stdio", - fn: func(dt *distTest) error { - t.addCmd(dt, "misc/cgo/stdio", t.goTest(), t.timeout(120)) - return nil - }, - }) - t.tests = append(t.tests, distTest{ - name: "cgo_life", - heading: "../misc/cgo/life", - fn: func(dt *distTest) error { - t.addCmd(dt, "misc/cgo/life", t.goTest(), t.timeout(120)) - return nil - }, - }) + t.registerHostTest("cgo_stdio", "../misc/cgo/stdio", "misc/cgo/stdio", ".") + t.registerHostTest("cgo_life", "../misc/cgo/life", "misc/cgo/life", ".") fortran := os.Getenv("FC") if fortran == "" { fortran, _ = exec.LookPath("gfortran") -- GitLab From 36b09f334f4d6ca96573b275118bd45db80f3727 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 8 Feb 2019 17:50:07 +0100 Subject: [PATCH 0172/1679] strconv: remove use of DeepEqual for testing errors Comparing errors using DeepEqual breaks if frame information is added as proposed in Issue #29934. Updates #29934. Change-Id: I0372883288f974998138f95f6c7c79a60f922a3e Reviewed-on: https://go-review.googlesource.com/c/162177 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox Reviewed-by: Damien Neil --- src/strconv/atoi_test.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/strconv/atoi_test.go b/src/strconv/atoi_test.go index 8b0576b659..b167c96833 100644 --- a/src/strconv/atoi_test.go +++ b/src/strconv/atoi_test.go @@ -521,12 +521,22 @@ var parseBaseTests = []parseErrorTest{ {37, baseErrStub}, } +func equalError(a, b error) bool { + if a == nil { + return b == nil + } + if b == nil { + return a == nil + } + return a.Error() == b.Error() +} + func TestParseIntBitSize(t *testing.T) { for i := range parseBitSizeTests { test := &parseBitSizeTests[i] testErr := test.errStub("ParseInt", test.arg) _, err := ParseInt("0", 0, test.arg) - if !reflect.DeepEqual(testErr, err) { + if !equalError(testErr, err) { t.Errorf("ParseInt(\"0\", 0, %v) = 0, %v want 0, %v", test.arg, err, testErr) } @@ -538,7 +548,7 @@ func TestParseUintBitSize(t *testing.T) { test := &parseBitSizeTests[i] testErr := test.errStub("ParseUint", test.arg) _, err := ParseUint("0", 0, test.arg) - if !reflect.DeepEqual(testErr, err) { + if !equalError(testErr, err) { t.Errorf("ParseUint(\"0\", 0, %v) = 0, %v want 0, %v", test.arg, err, testErr) } @@ -550,7 +560,7 @@ func TestParseIntBase(t *testing.T) { test := &parseBaseTests[i] testErr := test.errStub("ParseInt", test.arg) _, err := ParseInt("0", test.arg, 0) - if !reflect.DeepEqual(testErr, err) { + if !equalError(testErr, err) { t.Errorf("ParseInt(\"0\", %v, 0) = 0, %v want 0, %v", test.arg, err, testErr) } @@ -562,7 +572,7 @@ func TestParseUintBase(t *testing.T) { test := &parseBaseTests[i] testErr := test.errStub("ParseUint", test.arg) _, err := ParseUint("0", test.arg, 0) - if !reflect.DeepEqual(testErr, err) { + if !equalError(testErr, err) { t.Errorf("ParseUint(\"0\", %v, 0) = 0, %v want 0, %v", test.arg, err, testErr) } -- GitLab From b34c5f0cb46d77c3929fc2b37e86f811c4d32377 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 8 Feb 2019 17:50:36 +0100 Subject: [PATCH 0173/1679] net/http: remove use of DeepEqual for testing errors Comparing errors using DeepEqual breaks if frame information is added as proposed in Issue #29934. Updates #29934. Change-Id: I4ef076e262109a9d6f5b18846129df2535611d71 Reviewed-on: https://go-review.googlesource.com/c/162178 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil Reviewed-by: Russ Cox --- src/net/http/clientserver_test.go | 2 +- src/net/http/transport.go | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/net/http/clientserver_test.go b/src/net/http/clientserver_test.go index 465bae1478..d61d77839d 100644 --- a/src/net/http/clientserver_test.go +++ b/src/net/http/clientserver_test.go @@ -560,7 +560,7 @@ func testCancelRequestMidBody(t *testing.T, h2 bool) { if all != "Hello" { t.Errorf("Read %q (%q + %q); want Hello", all, firstRead, rest) } - if !reflect.DeepEqual(err, ExportErrRequestCanceled) { + if err != ExportErrRequestCanceled { t.Errorf("ReadAll error = %v; want %v", err, ExportErrRequestCanceled) } } diff --git a/src/net/http/transport.go b/src/net/http/transport.go index a8c5efe6aa..bb9657f4ee 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -2073,7 +2073,10 @@ func (e *httpError) Timeout() bool { return e.timeout } func (e *httpError) Temporary() bool { return true } var errTimeout error = &httpError{err: "net/http: timeout awaiting response headers", timeout: true} -var errRequestCanceled = errors.New("net/http: request canceled") + +// errRequestCanceled is set to be identical to the one from h2 to facilitate +// testing. +var errRequestCanceled = http2errRequestCanceled var errRequestCanceledConn = errors.New("net/http: request canceled while waiting for connection") // TODO: unify? func nop() {} -- GitLab From b9596aea50a0703f89c6f11c206cfd2c7dd189fa Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 8 Feb 2019 17:52:08 +0100 Subject: [PATCH 0174/1679] encoding/json: remove use of DeepEqual for testing errors Comparing errors using DeepEqual breaks if frame information is added as proposed in Issue #29934. Updates #29934. Change-Id: Ib430c9ddbe588dd1dd51314c408c74c07285e1ff Reviewed-on: https://go-review.googlesource.com/c/162179 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox Reviewed-by: Damien Neil --- src/encoding/json/decode_test.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 54432600a5..60454c6058 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -1021,12 +1021,22 @@ func TestMarshalEmbeds(t *testing.T) { } } +func equalError(a, b error) bool { + if a == nil { + return b == nil + } + if b == nil { + return a == nil + } + return a.Error() == b.Error() +} + func TestUnmarshal(t *testing.T) { for i, tt := range unmarshalTests { var scan scanner in := []byte(tt.in) if err := checkValid(in, &scan); err != nil { - if !reflect.DeepEqual(err, tt.err) { + if !equalError(err, tt.err) { t.Errorf("#%d: checkValid: %#v", i, err) continue } @@ -1044,7 +1054,7 @@ func TestUnmarshal(t *testing.T) { if tt.disallowUnknownFields { dec.DisallowUnknownFields() } - if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) { + if err := dec.Decode(v.Interface()); !equalError(err, tt.err) { t.Errorf("#%d: %v, want %v", i, err, tt.err) continue } else if err != nil { @@ -2270,7 +2280,7 @@ func TestUnmarshalEmbeddedUnexported(t *testing.T) { for i, tt := range tests { err := Unmarshal([]byte(tt.in), tt.ptr) - if !reflect.DeepEqual(err, tt.err) { + if !equalError(err, tt.err) { t.Errorf("#%d: %v, want %v", i, err, tt.err) } if !reflect.DeepEqual(tt.ptr, tt.out) { -- GitLab From 9650726e79e20386b59b253e98dcaaa768e06c95 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 8 Feb 2019 17:48:17 +0100 Subject: [PATCH 0175/1679] internal/reflectlite: lite version of reflect package to be used by errors package for checking assignability and setting error values in As. Updates #29934. Change-Id: I8c1d02a2c6efa0919d54b286cfe8b4edc26da059 Reviewed-on: https://go-review.googlesource.com/c/161759 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- src/go/build/deps_test.go | 2 + src/internal/reflectlite/all_test.go | 1046 +++++++++++++++++++++ src/internal/reflectlite/asm.s | 5 + src/internal/reflectlite/export_test.go | 115 +++ src/internal/reflectlite/set_test.go | 92 ++ src/internal/reflectlite/tostring_test.go | 98 ++ src/internal/reflectlite/type.go | 904 ++++++++++++++++++ src/internal/reflectlite/value.go | 448 +++++++++ src/runtime/iface.go | 5 + src/runtime/malloc.go | 5 + src/runtime/mbarrier.go | 5 + src/runtime/runtime1.go | 12 + 12 files changed, 2737 insertions(+) create mode 100644 src/internal/reflectlite/all_test.go create mode 100644 src/internal/reflectlite/asm.s create mode 100644 src/internal/reflectlite/export_test.go create mode 100644 src/internal/reflectlite/set_test.go create mode 100644 src/internal/reflectlite/tostring_test.go create mode 100644 src/internal/reflectlite/type.go create mode 100644 src/internal/reflectlite/value.go diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 9d6d038dab..3bf4b7acfa 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -46,6 +46,7 @@ var pkgDeps = map[string][]string{ "unsafe": {}, "internal/cpu": {}, "internal/bytealg": {"unsafe", "internal/cpu"}, + "internal/reflectlite": {"runtime", "unsafe"}, "L0": { "errors", @@ -57,6 +58,7 @@ var pkgDeps = map[string][]string{ "unsafe", "internal/cpu", "internal/bytealg", + "internal/reflectlite", }, // L1 adds simple functions and strings processing, diff --git a/src/internal/reflectlite/all_test.go b/src/internal/reflectlite/all_test.go new file mode 100644 index 0000000000..e2c4f30487 --- /dev/null +++ b/src/internal/reflectlite/all_test.go @@ -0,0 +1,1046 @@ +// 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 reflectlite_test + +import ( + "encoding/base64" + "fmt" + . "internal/reflectlite" + "math" + "reflect" + "runtime" + "testing" + "unsafe" +) + +func ToValue(v Value) reflect.Value { + return reflect.ValueOf(ToInterface(v)) +} + +func TypeString(t Type) string { + return fmt.Sprintf("%T", ToInterface(Zero(t))) +} + +type integer int +type T struct { + a int + b float64 + c string + d *int +} + +type pair struct { + i interface{} + s string +} + +func assert(t *testing.T, s, want string) { + t.Helper() + if s != want { + t.Errorf("have %#q want %#q", s, want) + } +} + +var typeTests = []pair{ + {struct{ x int }{}, "int"}, + {struct{ x int8 }{}, "int8"}, + {struct{ x int16 }{}, "int16"}, + {struct{ x int32 }{}, "int32"}, + {struct{ x int64 }{}, "int64"}, + {struct{ x uint }{}, "uint"}, + {struct{ x uint8 }{}, "uint8"}, + {struct{ x uint16 }{}, "uint16"}, + {struct{ x uint32 }{}, "uint32"}, + {struct{ x uint64 }{}, "uint64"}, + {struct{ x float32 }{}, "float32"}, + {struct{ x float64 }{}, "float64"}, + {struct{ x int8 }{}, "int8"}, + {struct{ x (**int8) }{}, "**int8"}, + {struct{ x (**integer) }{}, "**reflectlite_test.integer"}, + {struct{ x ([32]int32) }{}, "[32]int32"}, + {struct{ x ([]int8) }{}, "[]int8"}, + {struct{ x (map[string]int32) }{}, "map[string]int32"}, + {struct{ x (chan<- string) }{}, "chan<- string"}, + {struct { + x struct { + c chan *int32 + d float32 + } + }{}, + "struct { c chan *int32; d float32 }", + }, + {struct{ x (func(a int8, b int32)) }{}, "func(int8, int32)"}, + {struct { + x struct { + c func(chan *integer, *int8) + } + }{}, + "struct { c func(chan *reflectlite_test.integer, *int8) }", + }, + {struct { + x struct { + a int8 + b int32 + } + }{}, + "struct { a int8; b int32 }", + }, + {struct { + x struct { + a int8 + b int8 + c int32 + } + }{}, + "struct { a int8; b int8; c int32 }", + }, + {struct { + x struct { + a int8 + b int8 + c int8 + d int32 + } + }{}, + "struct { a int8; b int8; c int8; d int32 }", + }, + {struct { + x struct { + a int8 + b int8 + c int8 + d int8 + e int32 + } + }{}, + "struct { a int8; b int8; c int8; d int8; e int32 }", + }, + {struct { + x struct { + a int8 + b int8 + c int8 + d int8 + e int8 + f int32 + } + }{}, + "struct { a int8; b int8; c int8; d int8; e int8; f int32 }", + }, + {struct { + x struct { + a int8 `reflect:"hi there"` + } + }{}, + `struct { a int8 "reflect:\"hi there\"" }`, + }, + {struct { + x struct { + a int8 `reflect:"hi \x00there\t\n\"\\"` + } + }{}, + `struct { a int8 "reflect:\"hi \\x00there\\t\\n\\\"\\\\\"" }`, + }, + {struct { + x struct { + f func(args ...int) + } + }{}, + "struct { f func(...int) }", + }, + // {struct { + // x (interface { + // a(func(func(int) int) func(func(int)) int) + // b() + // }) + // }{}, + // "interface { reflectlite_test.a(func(func(int) int) func(func(int)) int); reflectlite_test.b() }", + // }, + {struct { + x struct { + int32 + int64 + } + }{}, + "struct { int32; int64 }", + }, +} + +var valueTests = []pair{ + {new(int), "132"}, + {new(int8), "8"}, + {new(int16), "16"}, + {new(int32), "32"}, + {new(int64), "64"}, + {new(uint), "132"}, + {new(uint8), "8"}, + {new(uint16), "16"}, + {new(uint32), "32"}, + {new(uint64), "64"}, + {new(float32), "256.25"}, + {new(float64), "512.125"}, + {new(complex64), "532.125+10i"}, + {new(complex128), "564.25+1i"}, + {new(string), "stringy cheese"}, + {new(bool), "true"}, + {new(*int8), "*int8(0)"}, + {new(**int8), "**int8(0)"}, + {new([5]int32), "[5]int32{0, 0, 0, 0, 0}"}, + {new(**integer), "**reflectlite_test.integer(0)"}, + {new(map[string]int32), "map[string]int32{}"}, + {new(chan<- string), "chan<- string"}, + {new(func(a int8, b int32)), "func(int8, int32)(arg)"}, + {new(struct { + c chan *int32 + d float32 + }), + "struct { c chan *int32; d float32 }{chan *int32, 0}", + }, + {new(struct{ c func(chan *integer, *int8) }), + "struct { c func(chan *reflectlite_test.integer, *int8) }{func(chan *reflectlite_test.integer, *int8)(arg)}", + }, + {new(struct { + a int8 + b int32 + }), + "struct { a int8; b int32 }{0, 0}", + }, + {new(struct { + a int8 + b int8 + c int32 + }), + "struct { a int8; b int8; c int32 }{0, 0, 0}", + }, +} + +func testType(t *testing.T, i int, typ Type, want string) { + s := TypeString(typ) + if s != want { + t.Errorf("#%d: have %#q, want %#q", i, s, want) + } +} + +func testReflectType(t *testing.T, i int, typ Type, want string) { + s := TypeString(typ) + if s != want { + t.Errorf("#%d: have %#q, want %#q", i, s, want) + } +} + +func TestTypes(t *testing.T) { + for i, tt := range typeTests { + testReflectType(t, i, Field(ValueOf(tt.i), 0).Type(), tt.s) + } +} + +func TestSetValue(t *testing.T) { + for i, tt := range valueTests { + v := ValueOf(tt.i).Elem() + switch v.Kind() { + case Int: + v.Set(ValueOf(int(132))) + case Int8: + v.Set(ValueOf(int8(8))) + case Int16: + v.Set(ValueOf(int16(16))) + case Int32: + v.Set(ValueOf(int32(32))) + case Int64: + v.Set(ValueOf(int64(64))) + case Uint: + v.Set(ValueOf(uint(132))) + case Uint8: + v.Set(ValueOf(uint8(8))) + case Uint16: + v.Set(ValueOf(uint16(16))) + case Uint32: + v.Set(ValueOf(uint32(32))) + case Uint64: + v.Set(ValueOf(uint64(64))) + case Float32: + v.Set(ValueOf(float32(256.25))) + case Float64: + v.Set(ValueOf(512.125)) + case Complex64: + v.Set(ValueOf(complex64(532.125 + 10i))) + case Complex128: + v.Set(ValueOf(complex128(564.25 + 1i))) + case String: + v.Set(ValueOf("stringy cheese")) + case Bool: + v.Set(ValueOf(true)) + } + s := valueToString(v) + if s != tt.s { + t.Errorf("#%d: have %#q, want %#q", i, s, tt.s) + } + } +} + +func TestCanSetField(t *testing.T) { + type embed struct{ x, X int } + type Embed struct{ x, X int } + type S1 struct { + embed + x, X int + } + type S2 struct { + *embed + x, X int + } + type S3 struct { + Embed + x, X int + } + type S4 struct { + *Embed + x, X int + } + + type testCase struct { + index []int + canSet bool + } + tests := []struct { + val Value + cases []testCase + }{{ + val: ValueOf(&S1{}), + cases: []testCase{ + {[]int{0}, false}, + {[]int{0, 0}, false}, + {[]int{0, 1}, true}, + {[]int{1}, false}, + {[]int{2}, true}, + }, + }, { + val: ValueOf(&S2{embed: &embed{}}), + cases: []testCase{ + {[]int{0}, false}, + {[]int{0, 0}, false}, + {[]int{0, 1}, true}, + {[]int{1}, false}, + {[]int{2}, true}, + }, + }, { + val: ValueOf(&S3{}), + cases: []testCase{ + {[]int{0}, true}, + {[]int{0, 0}, false}, + {[]int{0, 1}, true}, + {[]int{1}, false}, + {[]int{2}, true}, + }, + }, { + val: ValueOf(&S4{Embed: &Embed{}}), + cases: []testCase{ + {[]int{0}, true}, + {[]int{0, 0}, false}, + {[]int{0, 1}, true}, + {[]int{1}, false}, + {[]int{2}, true}, + }, + }} + + for _, tt := range tests { + t.Run(tt.val.Type().Name(), func(t *testing.T) { + for _, tc := range tt.cases { + f := tt.val + for _, i := range tc.index { + if f.Kind() == Ptr { + f = f.Elem() + } + f = Field(f, i) + } + if got := f.CanSet(); got != tc.canSet { + t.Errorf("CanSet() = %v, want %v", got, tc.canSet) + } + } + }) + } +} + +var _i = 7 + +var valueToStringTests = []pair{ + {123, "123"}, + {123.5, "123.5"}, + {byte(123), "123"}, + {"abc", "abc"}, + {T{123, 456.75, "hello", &_i}, "reflectlite_test.T{123, 456.75, hello, *int(&7)}"}, + {new(chan *T), "*chan *reflectlite_test.T(&chan *reflectlite_test.T)"}, + {[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"}, + {&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"}, + {[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"}, + {&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"}, +} + +func TestValueToString(t *testing.T) { + for i, test := range valueToStringTests { + s := valueToString(ValueOf(test.i)) + if s != test.s { + t.Errorf("#%d: have %#q, want %#q", i, s, test.s) + } + } +} + +func TestPtrSetNil(t *testing.T) { + var i int32 = 1234 + ip := &i + vip := ValueOf(&ip) + vip.Elem().Set(Zero(vip.Elem().Type())) + if ip != nil { + t.Errorf("got non-nil (%d), want nil", *ip) + } +} + +func TestMapSetNil(t *testing.T) { + m := make(map[string]int) + vm := ValueOf(&m) + vm.Elem().Set(Zero(vm.Elem().Type())) + if m != nil { + t.Errorf("got non-nil (%p), want nil", m) + } +} + +func TestAll(t *testing.T) { + testType(t, 1, TypeOf((int8)(0)), "int8") + testType(t, 2, TypeOf((*int8)(nil)).Elem(), "int8") + + typ := TypeOf((*struct { + c chan *int32 + d float32 + })(nil)) + testType(t, 3, typ, "*struct { c chan *int32; d float32 }") + etyp := typ.Elem() + testType(t, 4, etyp, "struct { c chan *int32; d float32 }") +} + +func TestInterfaceValue(t *testing.T) { + var inter struct { + E interface{} + } + inter.E = 123.456 + v1 := ValueOf(&inter) + v2 := Field(v1.Elem(), 0) + // assert(t, TypeString(v2.Type()), "interface {}") + v3 := v2.Elem() + assert(t, TypeString(v3.Type()), "float64") + + i3 := ToInterface(v2) + if _, ok := i3.(float64); !ok { + t.Error("v2.Interface() did not return float64, got ", TypeOf(i3)) + } +} + +func TestFunctionValue(t *testing.T) { + var x interface{} = func() {} + v := ValueOf(x) + if fmt.Sprint(ToInterface(v)) != fmt.Sprint(x) { + t.Fatalf("TestFunction returned wrong pointer") + } + assert(t, TypeString(v.Type()), "func()") +} + +var appendTests = []struct { + orig, extra []int +}{ + {make([]int, 2, 4), []int{22}}, + {make([]int, 2, 4), []int{22, 33, 44}}, +} + +func sameInts(x, y []int) bool { + if len(x) != len(y) { + return false + } + for i, xx := range x { + if xx != y[i] { + return false + } + } + return true +} + +func TestBigUnnamedStruct(t *testing.T) { + b := struct{ a, b, c, d int64 }{1, 2, 3, 4} + v := ValueOf(b) + b1 := ToInterface(v).(struct { + a, b, c, d int64 + }) + if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d { + t.Errorf("ValueOf(%v).Interface().(*Big) = %v", b, b1) + } +} + +type big struct { + a, b, c, d, e int64 +} + +func TestBigStruct(t *testing.T) { + b := big{1, 2, 3, 4, 5} + v := ValueOf(b) + b1 := ToInterface(v).(big) + if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e { + t.Errorf("ValueOf(%v).Interface().(big) = %v", b, b1) + } +} + +type Basic struct { + x int + y float32 +} + +type NotBasic Basic + +type DeepEqualTest struct { + a, b interface{} + eq bool +} + +// Simple functions for DeepEqual tests. +var ( + fn1 func() // nil. + fn2 func() // nil. + fn3 = func() { fn1() } // Not nil. +) + +type self struct{} + +type Loop *Loop +type Loopy interface{} + +var loop1, loop2 Loop +var loopy1, loopy2 Loopy + +func init() { + loop1 = &loop2 + loop2 = &loop1 + + loopy1 = &loopy2 + loopy2 = &loopy1 +} + +var typeOfTests = []DeepEqualTest{ + // Equalities + {nil, nil, true}, + {1, 1, true}, + {int32(1), int32(1), true}, + {0.5, 0.5, true}, + {float32(0.5), float32(0.5), true}, + {"hello", "hello", true}, + {make([]int, 10), make([]int, 10), true}, + {&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true}, + {Basic{1, 0.5}, Basic{1, 0.5}, true}, + {error(nil), error(nil), true}, + {map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true}, + {fn1, fn2, true}, + + // Inequalities + {1, 2, false}, + {int32(1), int32(2), false}, + {0.5, 0.6, false}, + {float32(0.5), float32(0.6), false}, + {"hello", "hey", false}, + {make([]int, 10), make([]int, 11), false}, + {&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false}, + {Basic{1, 0.5}, Basic{1, 0.6}, false}, + {Basic{1, 0}, Basic{2, 0}, false}, + {map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false}, + {map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false}, + {map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false}, + {map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false}, + {nil, 1, false}, + {1, nil, false}, + {fn1, fn3, false}, + {fn3, fn3, false}, + {[][]int{{1}}, [][]int{{2}}, false}, + {math.NaN(), math.NaN(), false}, + {&[1]float64{math.NaN()}, &[1]float64{math.NaN()}, false}, + {&[1]float64{math.NaN()}, self{}, true}, + {[]float64{math.NaN()}, []float64{math.NaN()}, false}, + {[]float64{math.NaN()}, self{}, true}, + {map[float64]float64{math.NaN(): 1}, map[float64]float64{1: 2}, false}, + {map[float64]float64{math.NaN(): 1}, self{}, true}, + + // Nil vs empty: not the same. + {[]int{}, []int(nil), false}, + {[]int{}, []int{}, true}, + {[]int(nil), []int(nil), true}, + {map[int]int{}, map[int]int(nil), false}, + {map[int]int{}, map[int]int{}, true}, + {map[int]int(nil), map[int]int(nil), true}, + + // Mismatched types + {1, 1.0, false}, + {int32(1), int64(1), false}, + {0.5, "hello", false}, + {[]int{1, 2, 3}, [3]int{1, 2, 3}, false}, + {&[3]interface{}{1, 2, 4}, &[3]interface{}{1, 2, "s"}, false}, + {Basic{1, 0.5}, NotBasic{1, 0.5}, false}, + {map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false}, + + // Possible loops. + {&loop1, &loop1, true}, + {&loop1, &loop2, true}, + {&loopy1, &loopy1, true}, + {&loopy1, &loopy2, true}, +} + +func TestTypeOf(t *testing.T) { + // Special case for nil + if typ := TypeOf(nil); typ != nil { + t.Errorf("expected nil type for nil value; got %v", typ) + } + for _, test := range typeOfTests { + v := ValueOf(test.a) + if !v.IsValid() { + continue + } + typ := TypeOf(test.a) + if typ != v.Type() { + t.Errorf("TypeOf(%v) = %v, but ValueOf(%v).Type() = %v", test.a, typ, test.a, v.Type()) + } + } +} + +func Nil(a interface{}, t *testing.T) { + n := Field(ValueOf(a), 0) + if !n.IsNil() { + t.Errorf("%v should be nil", a) + } +} + +func NotNil(a interface{}, t *testing.T) { + n := Field(ValueOf(a), 0) + if n.IsNil() { + t.Errorf("value of type %v should not be nil", TypeString(ValueOf(a).Type())) + } +} + +func TestIsNil(t *testing.T) { + // These implement IsNil. + // Wrap in extra struct to hide interface type. + doNil := []interface{}{ + struct{ x *int }{}, + struct{ x interface{} }{}, + struct{ x map[string]int }{}, + struct{ x func() bool }{}, + struct{ x chan int }{}, + struct{ x []string }{}, + struct{ x unsafe.Pointer }{}, + } + for _, ts := range doNil { + ty := TField(TypeOf(ts), 0) + v := Zero(ty) + v.IsNil() // panics if not okay to call + } + + // Check the implementations + var pi struct { + x *int + } + Nil(pi, t) + pi.x = new(int) + NotNil(pi, t) + + var si struct { + x []int + } + Nil(si, t) + si.x = make([]int, 10) + NotNil(si, t) + + var ci struct { + x chan int + } + Nil(ci, t) + ci.x = make(chan int) + NotNil(ci, t) + + var mi struct { + x map[int]int + } + Nil(mi, t) + mi.x = make(map[int]int) + NotNil(mi, t) + + var ii struct { + x interface{} + } + Nil(ii, t) + ii.x = 2 + NotNil(ii, t) + + var fi struct { + x func(t *testing.T) + } + Nil(fi, t) + fi.x = TestIsNil + NotNil(fi, t) +} + +// Indirect returns the value that v points to. +// If v is a nil pointer, Indirect returns a zero Value. +// If v is not a pointer, Indirect returns v. +func Indirect(v Value) Value { + if v.Kind() != Ptr { + return v + } + return v.Elem() +} + +func TestNilPtrValueSub(t *testing.T) { + var pi *int + if pv := ValueOf(pi); pv.Elem().IsValid() { + t.Error("ValueOf((*int)(nil)).Elem().IsValid()") + } +} + +type Point struct { + x, y int +} + +// This will be index 0. +func (p Point) AnotherMethod(scale int) int { + return -1 +} + +// This will be index 1. +func (p Point) Dist(scale int) int { + //println("Point.Dist", p.x, p.y, scale) + return p.x*p.x*scale + p.y*p.y*scale +} + +// This will be index 2. +func (p Point) GCMethod(k int) int { + runtime.GC() + return k + p.x +} + +// This will be index 3. +func (p Point) NoArgs() { + // Exercise no-argument/no-result paths. +} + +// This will be index 4. +func (p Point) TotalDist(points ...Point) int { + tot := 0 + for _, q := range points { + dx := q.x - p.x + dy := q.y - p.y + tot += dx*dx + dy*dy // Should call Sqrt, but it's just a test. + + } + return tot +} + +type D1 struct { + d int +} +type D2 struct { + d int +} + +func TestImportPath(t *testing.T) { + tests := []struct { + t Type + path string + }{ + {TypeOf(&base64.Encoding{}).Elem(), "encoding/base64"}, + {TypeOf(int(0)), ""}, + {TypeOf(int8(0)), ""}, + {TypeOf(int16(0)), ""}, + {TypeOf(int32(0)), ""}, + {TypeOf(int64(0)), ""}, + {TypeOf(uint(0)), ""}, + {TypeOf(uint8(0)), ""}, + {TypeOf(uint16(0)), ""}, + {TypeOf(uint32(0)), ""}, + {TypeOf(uint64(0)), ""}, + {TypeOf(uintptr(0)), ""}, + {TypeOf(float32(0)), ""}, + {TypeOf(float64(0)), ""}, + {TypeOf(complex64(0)), ""}, + {TypeOf(complex128(0)), ""}, + {TypeOf(byte(0)), ""}, + {TypeOf(rune(0)), ""}, + {TypeOf([]byte(nil)), ""}, + {TypeOf([]rune(nil)), ""}, + {TypeOf(string("")), ""}, + {TypeOf((*interface{})(nil)).Elem(), ""}, + {TypeOf((*byte)(nil)), ""}, + {TypeOf((*rune)(nil)), ""}, + {TypeOf((*int64)(nil)), ""}, + {TypeOf(map[string]int{}), ""}, + {TypeOf((*error)(nil)).Elem(), ""}, + {TypeOf((*Point)(nil)), ""}, + {TypeOf((*Point)(nil)).Elem(), "internal/reflectlite_test"}, + } + for _, test := range tests { + if path := test.t.PkgPath(); path != test.path { + t.Errorf("%v.PkgPath() = %q, want %q", test.t, path, test.path) + } + } +} + +func noAlloc(t *testing.T, n int, f func(int)) { + if testing.Short() { + t.Skip("skipping malloc count in short mode") + } + if runtime.GOMAXPROCS(0) > 1 { + t.Skip("skipping; GOMAXPROCS>1") + } + i := -1 + allocs := testing.AllocsPerRun(n, func() { + f(i) + i++ + }) + if allocs > 0 { + t.Errorf("%d iterations: got %v mallocs, want 0", n, allocs) + } +} + +func TestAllocations(t *testing.T) { + noAlloc(t, 100, func(j int) { + var i interface{} + var v Value + + // We can uncomment this when compiler escape analysis + // is good enough to see that the integer assigned to i + // does not escape and therefore need not be allocated. + // + // i = 42 + j + // v = ValueOf(i) + // if int(v.Int()) != 42+j { + // panic("wrong int") + // } + + i = func(j int) int { return j } + v = ValueOf(i) + if ToInterface(v).(func(int) int)(j) != j { + panic("wrong result") + } + }) +} + +func TestSetPanic(t *testing.T) { + ok := func(f func()) { f() } + bad := shouldPanic + clear := func(v Value) { v.Set(Zero(v.Type())) } + + type t0 struct { + W int + } + + type t1 struct { + Y int + t0 + } + + type T2 struct { + Z int + namedT0 t0 + } + + type T struct { + X int + t1 + T2 + NamedT1 t1 + NamedT2 T2 + namedT1 t1 + namedT2 T2 + } + + // not addressable + v := ValueOf(T{}) + bad(func() { clear(Field(v, 0)) }) // .X + bad(func() { clear(Field(v, 1)) }) // .t1 + bad(func() { clear(Field(Field(v, 1), 0)) }) // .t1.Y + bad(func() { clear(Field(Field(v, 1), 1)) }) // .t1.t0 + bad(func() { clear(Field(Field(Field(v, 1), 1), 0)) }) // .t1.t0.W + bad(func() { clear(Field(v, 2)) }) // .T2 + bad(func() { clear(Field(Field(v, 2), 0)) }) // .T2.Z + bad(func() { clear(Field(Field(v, 2), 1)) }) // .T2.namedT0 + bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W + bad(func() { clear(Field(v, 3)) }) // .NamedT1 + bad(func() { clear(Field(Field(v, 3), 0)) }) // .NamedT1.Y + bad(func() { clear(Field(Field(v, 3), 1)) }) // .NamedT1.t0 + bad(func() { clear(Field(Field(Field(v, 3), 1), 0)) }) // .NamedT1.t0.W + bad(func() { clear(Field(v, 4)) }) // .NamedT2 + bad(func() { clear(Field(Field(v, 4), 0)) }) // .NamedT2.Z + bad(func() { clear(Field(Field(v, 4), 1)) }) // .NamedT2.namedT0 + bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W + bad(func() { clear(Field(v, 5)) }) // .namedT1 + bad(func() { clear(Field(Field(v, 5), 0)) }) // .namedT1.Y + bad(func() { clear(Field(Field(v, 5), 1)) }) // .namedT1.t0 + bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W + bad(func() { clear(Field(v, 6)) }) // .namedT2 + bad(func() { clear(Field(Field(v, 6), 0)) }) // .namedT2.Z + bad(func() { clear(Field(Field(v, 6), 1)) }) // .namedT2.namedT0 + bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W + + // addressable + v = ValueOf(&T{}).Elem() + ok(func() { clear(Field(v, 0)) }) // .X + bad(func() { clear(Field(v, 1)) }) // .t1 + ok(func() { clear(Field(Field(v, 1), 0)) }) // .t1.Y + bad(func() { clear(Field(Field(v, 1), 1)) }) // .t1.t0 + ok(func() { clear(Field(Field(Field(v, 1), 1), 0)) }) // .t1.t0.W + ok(func() { clear(Field(v, 2)) }) // .T2 + ok(func() { clear(Field(Field(v, 2), 0)) }) // .T2.Z + bad(func() { clear(Field(Field(v, 2), 1)) }) // .T2.namedT0 + bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W + ok(func() { clear(Field(v, 3)) }) // .NamedT1 + ok(func() { clear(Field(Field(v, 3), 0)) }) // .NamedT1.Y + bad(func() { clear(Field(Field(v, 3), 1)) }) // .NamedT1.t0 + ok(func() { clear(Field(Field(Field(v, 3), 1), 0)) }) // .NamedT1.t0.W + ok(func() { clear(Field(v, 4)) }) // .NamedT2 + ok(func() { clear(Field(Field(v, 4), 0)) }) // .NamedT2.Z + bad(func() { clear(Field(Field(v, 4), 1)) }) // .NamedT2.namedT0 + bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W + bad(func() { clear(Field(v, 5)) }) // .namedT1 + bad(func() { clear(Field(Field(v, 5), 0)) }) // .namedT1.Y + bad(func() { clear(Field(Field(v, 5), 1)) }) // .namedT1.t0 + bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W + bad(func() { clear(Field(v, 6)) }) // .namedT2 + bad(func() { clear(Field(Field(v, 6), 0)) }) // .namedT2.Z + bad(func() { clear(Field(Field(v, 6), 1)) }) // .namedT2.namedT0 + bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W +} + +func shouldPanic(f func()) { + defer func() { + if recover() == nil { + panic("did not panic") + } + }() + f() +} + +type S struct { + i1 int64 + i2 int64 +} + +func TestBigZero(t *testing.T) { + const size = 1 << 10 + var v [size]byte + z := ToInterface(Zero(ValueOf(v).Type())).([size]byte) + for i := 0; i < size; i++ { + if z[i] != 0 { + t.Fatalf("Zero object not all zero, index %d", i) + } + } +} + +func TestInvalid(t *testing.T) { + // Used to have inconsistency between IsValid() and Kind() != Invalid. + type T struct{ v interface{} } + + v := Field(ValueOf(T{}), 0) + if v.IsValid() != true || v.Kind() != Interface { + t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind()) + } + v = v.Elem() + if v.IsValid() != false || v.Kind() != Invalid { + t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind()) + } +} + +type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int + +type nameTest struct { + v interface{} + want string +} + +var nameTests = []nameTest{ + {(*int32)(nil), "int32"}, + {(*D1)(nil), "D1"}, + {(*[]D1)(nil), ""}, + {(*chan D1)(nil), ""}, + {(*func() D1)(nil), ""}, + {(*<-chan D1)(nil), ""}, + {(*chan<- D1)(nil), ""}, + {(*interface{})(nil), ""}, + {(*interface { + F() + })(nil), ""}, + {(*TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678)(nil), "TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678"}, +} + +func TestNames(t *testing.T) { + for _, test := range nameTests { + typ := TypeOf(test.v).Elem() + if got := typ.Name(); got != test.want { + t.Errorf("%v Name()=%q, want %q", typ, got, test.want) + } + } +} + +type embed struct { + EmbedWithUnexpMeth +} + +func TestNameBytesAreAligned(t *testing.T) { + typ := TypeOf(embed{}) + b := FirstMethodNameBytes(typ) + v := uintptr(unsafe.Pointer(b)) + if v%unsafe.Alignof((*byte)(nil)) != 0 { + t.Errorf("reflect.name.bytes pointer is not aligned: %x", v) + } +} + +// TestUnaddressableField tests that the reflect package will not allow +// a type from another package to be used as a named type with an +// unexported field. +// +// This ensures that unexported fields cannot be modified by other packages. +func TestUnaddressableField(t *testing.T) { + var b Buffer // type defined in reflect, a different package + var localBuffer struct { + buf []byte + } + lv := ValueOf(&localBuffer).Elem() + rv := ValueOf(b) + shouldPanic(func() { + lv.Set(rv) + }) +} + +type Tint int + +type Tint2 = Tint + +type Talias1 struct { + byte + uint8 + int + int32 + rune +} + +type Talias2 struct { + Tint + Tint2 +} + +func TestAliasNames(t *testing.T) { + t1 := Talias1{byte: 1, uint8: 2, int: 3, int32: 4, rune: 5} + out := fmt.Sprintf("%#v", t1) + want := "reflectlite_test.Talias1{byte:0x1, uint8:0x2, int:3, int32:4, rune:5}" + if out != want { + t.Errorf("Talias1 print:\nhave: %s\nwant: %s", out, want) + } + + t2 := Talias2{Tint: 1, Tint2: 2} + out = fmt.Sprintf("%#v", t2) + want = "reflectlite_test.Talias2{Tint:1, Tint2:2}" + if out != want { + t.Errorf("Talias2 print:\nhave: %s\nwant: %s", out, want) + } +} diff --git a/src/internal/reflectlite/asm.s b/src/internal/reflectlite/asm.s new file mode 100644 index 0000000000..a7b69b65ba --- /dev/null +++ b/src/internal/reflectlite/asm.s @@ -0,0 +1,5 @@ +// Copyright 2019 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. + +// Trigger build without complete flag. \ No newline at end of file diff --git a/src/internal/reflectlite/export_test.go b/src/internal/reflectlite/export_test.go new file mode 100644 index 0000000000..354ea9dbd0 --- /dev/null +++ b/src/internal/reflectlite/export_test.go @@ -0,0 +1,115 @@ +// Copyright 2019 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 reflectlite + +import ( + "unsafe" +) + +// Field returns the i'th field of the struct v. +// It panics if v's Kind is not Struct or i is out of range. +func Field(v Value, i int) Value { + if v.kind() != Struct { + panic(&ValueError{"reflect.Value.Field", v.kind()}) + } + tt := (*structType)(unsafe.Pointer(v.typ)) + if uint(i) >= uint(len(tt.fields)) { + panic("reflect: Field index out of range") + } + field := &tt.fields[i] + typ := field.typ + + // Inherit permission bits from v, but clear flagEmbedRO. + fl := v.flag&(flagStickyRO|flagIndir|flagAddr) | flag(typ.Kind()) + // Using an unexported field forces flagRO. + if !field.name.isExported() { + if field.embedded() { + fl |= flagEmbedRO + } else { + fl |= flagStickyRO + } + } + // Either flagIndir is set and v.ptr points at struct, + // or flagIndir is not set and v.ptr is the actual struct data. + // In the former case, we want v.ptr + offset. + // In the latter case, we must have field.offset = 0, + // so v.ptr + field.offset is still the correct address. + ptr := add(v.ptr, field.offset(), "same as non-reflect &v.field") + return Value{typ, ptr, fl} +} + +func TField(typ Type, i int) Type { + t := typ.(*rtype) + if t.Kind() != Struct { + panic("reflect: Field of non-struct type") + } + tt := (*structType)(unsafe.Pointer(t)) + + return StructFieldType(tt, i) +} + +// Field returns the i'th struct field. +func StructFieldType(t *structType, i int) Type { + if i < 0 || i >= len(t.fields) { + panic("reflect: Field index out of bounds") + } + p := &t.fields[i] + return toType(p.typ) +} + +// Zero returns a Value representing the zero value for the specified type. +// The result is different from the zero value of the Value struct, +// which represents no value at all. +// For example, Zero(TypeOf(42)) returns a Value with Kind Int and value 0. +// The returned value is neither addressable nor settable. +func Zero(typ Type) Value { + if typ == nil { + panic("reflect: Zero(nil)") + } + t := typ.(*rtype) + fl := flag(t.Kind()) + if ifaceIndir(t) { + return Value{t, unsafe_New(t), fl | flagIndir} + } + return Value{t, nil, fl} +} + +// ToInterface returns v's current value as an interface{}. +// It is equivalent to: +// var i interface{} = (v's underlying value) +// It panics if the Value was obtained by accessing +// unexported struct fields. +func ToInterface(v Value) (i interface{}) { + return valueInterface(v) +} + +type EmbedWithUnexpMeth struct{} + +func (EmbedWithUnexpMeth) f() {} + +type pinUnexpMeth interface { + f() +} + +var pinUnexpMethI = pinUnexpMeth(EmbedWithUnexpMeth{}) + +func FirstMethodNameBytes(t Type) *byte { + _ = pinUnexpMethI + + ut := t.uncommon() + if ut == nil { + panic("type has no methods") + } + m := ut.methods()[0] + mname := t.(*rtype).nameOff(m.name) + if *mname.data(0, "name flag field")&(1<<2) == 0 { + panic("method name does not have pkgPath *string") + } + return mname.bytes +} + +type Buffer struct { + buf []byte +} diff --git a/src/internal/reflectlite/set_test.go b/src/internal/reflectlite/set_test.go new file mode 100644 index 0000000000..817e4beae1 --- /dev/null +++ b/src/internal/reflectlite/set_test.go @@ -0,0 +1,92 @@ +// Copyright 2011 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 reflectlite_test + +import ( + "bytes" + "go/ast" + "go/token" + . "internal/reflectlite" + "io" + "testing" +) + +func TestImplicitSetConversion(t *testing.T) { + // Assume TestImplicitMapConversion covered the basics. + // Just make sure conversions are being applied at all. + var r io.Reader + b := new(bytes.Buffer) + rv := ValueOf(&r).Elem() + rv.Set(ValueOf(b)) + if r != b { + t.Errorf("after Set: r=%T(%v)", r, r) + } +} + +var implementsTests = []struct { + x interface{} + t interface{} + b bool +}{ + {new(*bytes.Buffer), new(io.Reader), true}, + {new(bytes.Buffer), new(io.Reader), false}, + {new(*bytes.Buffer), new(io.ReaderAt), false}, + {new(*ast.Ident), new(ast.Expr), true}, + {new(*notAnExpr), new(ast.Expr), false}, + {new(*ast.Ident), new(notASTExpr), false}, + {new(notASTExpr), new(ast.Expr), false}, + {new(ast.Expr), new(notASTExpr), false}, + {new(*notAnExpr), new(notASTExpr), true}, +} + +type notAnExpr struct{} + +func (notAnExpr) Pos() token.Pos { return token.NoPos } +func (notAnExpr) End() token.Pos { return token.NoPos } +func (notAnExpr) exprNode() {} + +type notASTExpr interface { + Pos() token.Pos + End() token.Pos + exprNode() +} + +func TestImplements(t *testing.T) { + for _, tt := range implementsTests { + xv := TypeOf(tt.x).Elem() + xt := TypeOf(tt.t).Elem() + if b := xv.Implements(xt); b != tt.b { + t.Errorf("(%s).Implements(%s) = %v, want %v", TypeString(xv), TypeString(xt), b, tt.b) + } + } +} + +var assignableTests = []struct { + x interface{} + t interface{} + b bool +}{ + {new(chan int), new(<-chan int), true}, + {new(<-chan int), new(chan int), false}, + {new(*int), new(IntPtr), true}, + {new(IntPtr), new(*int), true}, + {new(IntPtr), new(IntPtr1), false}, + {new(Ch), new(<-chan interface{}), true}, + // test runs implementsTests too +} + +type IntPtr *int +type IntPtr1 *int +type Ch <-chan interface{} + +func TestAssignableTo(t *testing.T) { + for i, tt := range append(assignableTests, implementsTests...) { + xv := TypeOf(tt.x).Elem() + xt := TypeOf(tt.t).Elem() + if b := xv.AssignableTo(xt); b != tt.b { + t.Errorf("%d:AssignableTo: got %v, want %v", i, b, tt.b) + } + } +} diff --git a/src/internal/reflectlite/tostring_test.go b/src/internal/reflectlite/tostring_test.go new file mode 100644 index 0000000000..a1e5dae09d --- /dev/null +++ b/src/internal/reflectlite/tostring_test.go @@ -0,0 +1,98 @@ +// 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. + +// Formatting of reflection types and values for debugging. +// Not defined as methods so they do not need to be linked into most binaries; +// the functions are not used by the library itself, only in tests. + +package reflectlite_test + +import ( + . "internal/reflectlite" + "reflect" + "strconv" +) + +// valueToString returns a textual representation of the reflection value val. +// For debugging only. +func valueToString(v Value) string { + return valueToStringImpl(reflect.ValueOf(ToInterface(v))) +} + +func valueToStringImpl(val reflect.Value) string { + var str string + if !val.IsValid() { + return "" + } + typ := val.Type() + switch val.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return strconv.FormatInt(val.Int(), 10) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return strconv.FormatUint(val.Uint(), 10) + case reflect.Float32, reflect.Float64: + return strconv.FormatFloat(val.Float(), 'g', -1, 64) + case reflect.Complex64, reflect.Complex128: + c := val.Complex() + return strconv.FormatFloat(real(c), 'g', -1, 64) + "+" + strconv.FormatFloat(imag(c), 'g', -1, 64) + "i" + case reflect.String: + return val.String() + case reflect.Bool: + if val.Bool() { + return "true" + } else { + return "false" + } + case reflect.Ptr: + v := val + str = typ.String() + "(" + if v.IsNil() { + str += "0" + } else { + str += "&" + valueToStringImpl(v.Elem()) + } + str += ")" + return str + case reflect.Array, reflect.Slice: + v := val + str += typ.String() + str += "{" + for i := 0; i < v.Len(); i++ { + if i > 0 { + str += ", " + } + str += valueToStringImpl(v.Index(i)) + } + str += "}" + return str + case reflect.Map: + str += typ.String() + str += "{" + str += "" + str += "}" + return str + case reflect.Chan: + str = typ.String() + return str + case reflect.Struct: + t := typ + v := val + str += t.String() + str += "{" + for i, n := 0, v.NumField(); i < n; i++ { + if i > 0 { + str += ", " + } + str += valueToStringImpl(v.Field(i)) + } + str += "}" + return str + case reflect.Interface: + return typ.String() + "(" + valueToStringImpl(val.Elem()) + ")" + case reflect.Func: + return typ.String() + "(arg)" + default: + panic("valueToString: can't print type " + typ.String()) + } +} diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go new file mode 100644 index 0000000000..35bc0db2c7 --- /dev/null +++ b/src/internal/reflectlite/type.go @@ -0,0 +1,904 @@ +// 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 reflectlite implements lightweight version of reflect, not using +// any package except for "runtime" and "unsafe". +package reflectlite + +import ( + "unsafe" +) + +// Type is the representation of a Go type. +// +// Not all methods apply to all kinds of types. Restrictions, +// if any, are noted in the documentation for each method. +// Use the Kind method to find out the kind of type before +// calling kind-specific methods. Calling a method +// inappropriate to the kind of type causes a run-time panic. +// +// Type values are comparable, such as with the == operator, +// so they can be used as map keys. +// Two Type values are equal if they represent identical types. +type Type interface { + // Methods applicable to all types. + + // Name returns the type's name within its package for a defined type. + // For other (non-defined) types it returns the empty string. + Name() string + + // PkgPath returns a defined type's package path, that is, the import path + // that uniquely identifies the package, such as "encoding/base64". + // If the type was predeclared (string, error) or not defined (*T, struct{}, + // []int, or A where A is an alias for a non-defined type), the package path + // will be the empty string. + PkgPath() string + + // Kind returns the specific kind of this type. + Kind() Kind + + // Implements reports whether the type implements the interface type u. + Implements(u Type) bool + + // AssignableTo reports whether a value of the type is assignable to type u. + AssignableTo(u Type) bool + + // Elem returns a type's element type. + // It panics if the type's Kind is not Ptr. + Elem() Type + + common() *rtype + uncommon() *uncommonType +} + +/* + * These data structures are known to the compiler (../../cmd/internal/gc/reflect.go). + * A few are known to ../runtime/type.go to convey to debuggers. + * They are also known to ../runtime/type.go. + */ + +// A Kind represents the specific kind of type that a Type represents. +// The zero Kind is not a valid kind. +type Kind uint + +const ( + Invalid Kind = iota + Bool + Int + Int8 + Int16 + Int32 + Int64 + Uint + Uint8 + Uint16 + Uint32 + Uint64 + Uintptr + Float32 + Float64 + Complex64 + Complex128 + Array + Chan + Func + Interface + Map + Ptr + Slice + String + Struct + UnsafePointer +) + +// tflag is used by an rtype to signal what extra type information is +// available in the memory directly following the rtype value. +// +// tflag values must be kept in sync with copies in: +// cmd/compile/internal/gc/reflect.go +// cmd/link/internal/ld/decodesym.go +// runtime/type.go +type tflag uint8 + +const ( + // tflagUncommon means that there is a pointer, *uncommonType, + // just beyond the outer type structure. + // + // For example, if t.Kind() == Struct and t.tflag&tflagUncommon != 0, + // then t has uncommonType data and it can be accessed as: + // + // type tUncommon struct { + // structType + // u uncommonType + // } + // u := &(*tUncommon)(unsafe.Pointer(t)).u + tflagUncommon tflag = 1 << 0 + + // tflagExtraStar means the name in the str field has an + // extraneous '*' prefix. This is because for most types T in + // a program, the type *T also exists and reusing the str data + // saves binary size. + tflagExtraStar tflag = 1 << 1 + + // tflagNamed means the type has a name. + tflagNamed tflag = 1 << 2 +) + +// rtype is the common implementation of most values. +// It is embedded in other struct types. +// +// rtype must be kept in sync with ../runtime/type.go:/^type._type. +type rtype struct { + size uintptr + ptrdata uintptr // number of bytes in the type that can contain pointers + hash uint32 // hash of type; avoids computation in hash tables + tflag tflag // extra type information flags + align uint8 // alignment of variable with this type + fieldAlign uint8 // alignment of struct field with this type + kind uint8 // enumeration for C + alg *typeAlg // algorithm table + gcdata *byte // garbage collection data + str nameOff // string form + ptrToThis typeOff // type for pointer to this type, may be zero +} + +// a copy of runtime.typeAlg +type typeAlg struct { + // function for hashing objects of this type + // (ptr to object, seed) -> hash + hash func(unsafe.Pointer, uintptr) uintptr + // function for comparing objects of this type + // (ptr to object A, ptr to object B) -> ==? + equal func(unsafe.Pointer, unsafe.Pointer) bool +} + +// Method on non-interface type +type method struct { + name nameOff // name of method + mtyp typeOff // method type (without receiver) + ifn textOff // fn used in interface call (one-word receiver) + tfn textOff // fn used for normal method call +} + +// uncommonType is present only for defined types or types with methods +// (if T is a defined type, the uncommonTypes for T and *T have methods). +// Using a pointer to this struct reduces the overall size required +// to describe a non-defined type with no methods. +type uncommonType struct { + pkgPath nameOff // import path; empty for built-in types like int, string + mcount uint16 // number of methods + xcount uint16 // number of exported methods + moff uint32 // offset from this uncommontype to [mcount]method + _ uint32 // unused +} + +// chanDir represents a channel type's direction. +type chanDir int + +const ( + recvDir chanDir = 1 << iota // <-chan + sendDir // chan<- + bothDir = recvDir | sendDir // chan +) + +// arrayType represents a fixed array type. +type arrayType struct { + rtype + elem *rtype // array element type + slice *rtype // slice type + len uintptr +} + +// chanType represents a channel type. +type chanType struct { + rtype + elem *rtype // channel element type + dir uintptr // channel direction (chanDir) +} + +// funcType represents a function type. +// +// A *rtype for each in and out parameter is stored in an array that +// directly follows the funcType (and possibly its uncommonType). So +// a function type with one method, one input, and one output is: +// +// struct { +// funcType +// uncommonType +// [2]*rtype // [0] is in, [1] is out +// } +type funcType struct { + rtype + inCount uint16 + outCount uint16 // top bit is set if last input parameter is ... +} + +// imethod represents a method on an interface type +type imethod struct { + name nameOff // name of method + typ typeOff // .(*FuncType) underneath +} + +// interfaceType represents an interface type. +type interfaceType struct { + rtype + pkgPath name // import path + methods []imethod // sorted by hash +} + +// mapType represents a map type. +type mapType struct { + rtype + key *rtype // map key type + elem *rtype // map element (value) type + keysize uint8 // size of key slot + valuesize uint8 // size of value slot + bucketsize uint16 // size of bucket + flags uint32 +} + +// ptrType represents a pointer type. +type ptrType struct { + rtype + elem *rtype // pointer element (pointed at) type +} + +// sliceType represents a slice type. +type sliceType struct { + rtype + elem *rtype // slice element type +} + +// Struct field +type structField struct { + name name // name is always non-empty + typ *rtype // type of field + offsetEmbed uintptr // byte offset of field<<1 | isEmbedded +} + +func (f *structField) offset() uintptr { + return f.offsetEmbed >> 1 +} + +func (f *structField) embedded() bool { + return f.offsetEmbed&1 != 0 +} + +// structType represents a struct type. +type structType struct { + rtype + pkgPath name + fields []structField // sorted by offset +} + +// name is an encoded type name with optional extra data. +// +// The first byte is a bit field containing: +// +// 1<<0 the name is exported +// 1<<1 tag data follows the name +// 1<<2 pkgPath nameOff follows the name and tag +// +// The next two bytes are the data length: +// +// l := uint16(data[1])<<8 | uint16(data[2]) +// +// Bytes [3:3+l] are the string data. +// +// If tag data follows then bytes 3+l and 3+l+1 are the tag length, +// with the data following. +// +// If the import path follows, then 4 bytes at the end of +// the data form a nameOff. The import path is only set for concrete +// methods that are defined in a different package than their type. +// +// If a name starts with "*", then the exported bit represents +// whether the pointed to type is exported. +type name struct { + bytes *byte +} + +func (n name) data(off int, whySafe string) *byte { + return (*byte)(add(unsafe.Pointer(n.bytes), uintptr(off), whySafe)) +} + +func (n name) isExported() bool { + return (*n.bytes)&(1<<0) != 0 +} + +func (n name) nameLen() int { + return int(uint16(*n.data(1, "name len field"))<<8 | uint16(*n.data(2, "name len field"))) +} + +func (n name) tagLen() int { + if *n.data(0, "name flag field")&(1<<1) == 0 { + return 0 + } + off := 3 + n.nameLen() + return int(uint16(*n.data(off, "name taglen field"))<<8 | uint16(*n.data(off+1, "name taglen field"))) +} + +func (n name) name() (s string) { + if n.bytes == nil { + return + } + b := (*[4]byte)(unsafe.Pointer(n.bytes)) + + hdr := (*stringHeader)(unsafe.Pointer(&s)) + hdr.Data = unsafe.Pointer(&b[3]) + hdr.Len = int(b[1])<<8 | int(b[2]) + return s +} + +func (n name) tag() (s string) { + tl := n.tagLen() + if tl == 0 { + return "" + } + nl := n.nameLen() + hdr := (*stringHeader)(unsafe.Pointer(&s)) + hdr.Data = unsafe.Pointer(n.data(3+nl+2, "non-empty string")) + hdr.Len = tl + return s +} + +func (n name) pkgPath() string { + if n.bytes == nil || *n.data(0, "name flag field")&(1<<2) == 0 { + return "" + } + off := 3 + n.nameLen() + if tl := n.tagLen(); tl > 0 { + off += 2 + tl + } + var nameOff int32 + // Note that this field may not be aligned in memory, + // so we cannot use a direct int32 assignment here. + copy((*[4]byte)(unsafe.Pointer(&nameOff))[:], (*[4]byte)(unsafe.Pointer(n.data(off, "name offset field")))[:]) + pkgPathName := name{(*byte)(resolveTypeOff(unsafe.Pointer(n.bytes), nameOff))} + return pkgPathName.name() +} + +/* + * The compiler knows the exact layout of all the data structures above. + * The compiler does not know about the data structures and methods below. + */ + +const ( + kindDirectIface = 1 << 5 + kindGCProg = 1 << 6 // Type.gc points to GC program + kindNoPointers = 1 << 7 + kindMask = (1 << 5) - 1 +) + +func (t *uncommonType) methods() []method { + if t.mcount == 0 { + return nil + } + return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.mcount > 0"))[:t.mcount:t.mcount] +} + +func (t *uncommonType) exportedMethods() []method { + if t.xcount == 0 { + return nil + } + return (*[1 << 16]method)(add(unsafe.Pointer(t), uintptr(t.moff), "t.xcount > 0"))[:t.xcount:t.xcount] +} + +// resolveNameOff resolves a name offset from a base pointer. +// The (*rtype).nameOff method is a convenience wrapper for this function. +// Implemented in the runtime package. +func resolveNameOff(ptrInModule unsafe.Pointer, off int32) unsafe.Pointer + +// resolveTypeOff resolves an *rtype offset from a base type. +// The (*rtype).typeOff method is a convenience wrapper for this function. +// Implemented in the runtime package. +func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer + +type nameOff int32 // offset to a name +type typeOff int32 // offset to an *rtype +type textOff int32 // offset from top of text section + +func (t *rtype) nameOff(off nameOff) name { + return name{(*byte)(resolveNameOff(unsafe.Pointer(t), int32(off)))} +} + +func (t *rtype) typeOff(off typeOff) *rtype { + return (*rtype)(resolveTypeOff(unsafe.Pointer(t), int32(off))) +} + +func (t *rtype) uncommon() *uncommonType { + if t.tflag&tflagUncommon == 0 { + return nil + } + switch t.Kind() { + case Struct: + return &(*structTypeUncommon)(unsafe.Pointer(t)).u + case Ptr: + type u struct { + ptrType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Func: + type u struct { + funcType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Slice: + type u struct { + sliceType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Array: + type u struct { + arrayType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Chan: + type u struct { + chanType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Map: + type u struct { + mapType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Interface: + type u struct { + interfaceType + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + default: + type u struct { + rtype + u uncommonType + } + return &(*u)(unsafe.Pointer(t)).u + } +} + +func (t *rtype) String() string { + s := t.nameOff(t.str).name() + if t.tflag&tflagExtraStar != 0 { + return s[1:] + } + return s +} + +func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) } + +func (t *rtype) common() *rtype { return t } + +func (t *rtype) exportedMethods() []method { + ut := t.uncommon() + if ut == nil { + return nil + } + return ut.exportedMethods() +} + +func (t *rtype) NumMethod() int { + if t.Kind() == Interface { + tt := (*interfaceType)(unsafe.Pointer(t)) + return tt.NumMethod() + } + return len(t.exportedMethods()) +} + +func (t *rtype) PkgPath() string { + if t.tflag&tflagNamed == 0 { + return "" + } + ut := t.uncommon() + if ut == nil { + return "" + } + return t.nameOff(ut.pkgPath).name() +} + +func (t *rtype) Name() string { + if t.tflag&tflagNamed == 0 { + return "" + } + s := t.String() + i := len(s) - 1 + for i >= 0 { + if s[i] == '.' { + break + } + i-- + } + return s[i+1:] +} + +func (t *rtype) chanDir() chanDir { + if t.Kind() != Chan { + panic("reflect: chanDir of non-chan type") + } + tt := (*chanType)(unsafe.Pointer(t)) + return chanDir(tt.dir) +} + +func (t *rtype) Elem() Type { + switch t.Kind() { + case Array: + tt := (*arrayType)(unsafe.Pointer(t)) + return toType(tt.elem) + case Chan: + tt := (*chanType)(unsafe.Pointer(t)) + return toType(tt.elem) + case Map: + tt := (*mapType)(unsafe.Pointer(t)) + return toType(tt.elem) + case Ptr: + tt := (*ptrType)(unsafe.Pointer(t)) + return toType(tt.elem) + case Slice: + tt := (*sliceType)(unsafe.Pointer(t)) + return toType(tt.elem) + } + panic("reflect: Elem of invalid type") +} + +func (t *rtype) In(i int) Type { + if t.Kind() != Func { + panic("reflect: In of non-func type") + } + tt := (*funcType)(unsafe.Pointer(t)) + return toType(tt.in()[i]) +} + +func (t *rtype) Key() Type { + if t.Kind() != Map { + panic("reflect: Key of non-map type") + } + tt := (*mapType)(unsafe.Pointer(t)) + return toType(tt.key) +} + +func (t *rtype) Len() int { + if t.Kind() != Array { + panic("reflect: Len of non-array type") + } + tt := (*arrayType)(unsafe.Pointer(t)) + return int(tt.len) +} + +func (t *rtype) NumField() int { + if t.Kind() != Struct { + panic("reflect: NumField of non-struct type") + } + tt := (*structType)(unsafe.Pointer(t)) + return len(tt.fields) +} + +func (t *rtype) NumIn() int { + if t.Kind() != Func { + panic("reflect: NumIn of non-func type") + } + tt := (*funcType)(unsafe.Pointer(t)) + return int(tt.inCount) +} + +func (t *rtype) NumOut() int { + if t.Kind() != Func { + panic("reflect: NumOut of non-func type") + } + tt := (*funcType)(unsafe.Pointer(t)) + return len(tt.out()) +} + +func (t *rtype) Out(i int) Type { + if t.Kind() != Func { + panic("reflect: Out of non-func type") + } + tt := (*funcType)(unsafe.Pointer(t)) + return toType(tt.out()[i]) +} + +func (t *funcType) in() []*rtype { + uadd := unsafe.Sizeof(*t) + if t.tflag&tflagUncommon != 0 { + uadd += unsafe.Sizeof(uncommonType{}) + } + if t.inCount == 0 { + return nil + } + return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "t.inCount > 0"))[:t.inCount] +} + +func (t *funcType) out() []*rtype { + uadd := unsafe.Sizeof(*t) + if t.tflag&tflagUncommon != 0 { + uadd += unsafe.Sizeof(uncommonType{}) + } + outCount := t.outCount & (1<<15 - 1) + if outCount == 0 { + return nil + } + return (*[1 << 20]*rtype)(add(unsafe.Pointer(t), uadd, "outCount > 0"))[t.inCount : t.inCount+outCount] +} + +// add returns p+x. +// +// The whySafe string is ignored, so that the function still inlines +// as efficiently as p+x, but all call sites should use the string to +// record why the addition is safe, which is to say why the addition +// does not cause x to advance to the very end of p's allocation +// and therefore point incorrectly at the next block in memory. +func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { + return unsafe.Pointer(uintptr(p) + x) +} + +// NumMethod returns the number of interface methods in the type's method set. +func (t *interfaceType) NumMethod() int { return len(t.methods) } + +// TypeOf returns the reflection Type that represents the dynamic type of i. +// If i is a nil interface value, TypeOf returns nil. +func TypeOf(i interface{}) Type { + eface := *(*emptyInterface)(unsafe.Pointer(&i)) + return toType(eface.typ) +} + +func (t *rtype) Implements(u Type) bool { + if u == nil { + panic("reflect: nil type passed to Type.Implements") + } + if u.Kind() != Interface { + panic("reflect: non-interface type passed to Type.Implements") + } + return implements(u.(*rtype), t) +} + +func (t *rtype) AssignableTo(u Type) bool { + if u == nil { + panic("reflect: nil type passed to Type.AssignableTo") + } + uu := u.(*rtype) + return directlyAssignable(uu, t) || implements(uu, t) +} + +// implements reports whether the type V implements the interface type T. +func implements(T, V *rtype) bool { + if T.Kind() != Interface { + return false + } + t := (*interfaceType)(unsafe.Pointer(T)) + if len(t.methods) == 0 { + return true + } + + // The same algorithm applies in both cases, but the + // method tables for an interface type and a concrete type + // are different, so the code is duplicated. + // In both cases the algorithm is a linear scan over the two + // lists - T's methods and V's methods - simultaneously. + // Since method tables are stored in a unique sorted order + // (alphabetical, with no duplicate method names), the scan + // through V's methods must hit a match for each of T's + // methods along the way, or else V does not implement T. + // This lets us run the scan in overall linear time instead of + // the quadratic time a naive search would require. + // See also ../runtime/iface.go. + if V.Kind() == Interface { + v := (*interfaceType)(unsafe.Pointer(V)) + i := 0 + for j := 0; j < len(v.methods); j++ { + tm := &t.methods[i] + tmName := t.nameOff(tm.name) + vm := &v.methods[j] + vmName := V.nameOff(vm.name) + if vmName.name() == tmName.name() && V.typeOff(vm.typ) == t.typeOff(tm.typ) { + if !tmName.isExported() { + tmPkgPath := tmName.pkgPath() + if tmPkgPath == "" { + tmPkgPath = t.pkgPath.name() + } + vmPkgPath := vmName.pkgPath() + if vmPkgPath == "" { + vmPkgPath = v.pkgPath.name() + } + if tmPkgPath != vmPkgPath { + continue + } + } + if i++; i >= len(t.methods) { + return true + } + } + } + return false + } + + v := V.uncommon() + if v == nil { + return false + } + i := 0 + vmethods := v.methods() + for j := 0; j < int(v.mcount); j++ { + tm := &t.methods[i] + tmName := t.nameOff(tm.name) + vm := vmethods[j] + vmName := V.nameOff(vm.name) + if vmName.name() == tmName.name() && V.typeOff(vm.mtyp) == t.typeOff(tm.typ) { + if !tmName.isExported() { + tmPkgPath := tmName.pkgPath() + if tmPkgPath == "" { + tmPkgPath = t.pkgPath.name() + } + vmPkgPath := vmName.pkgPath() + if vmPkgPath == "" { + vmPkgPath = V.nameOff(v.pkgPath).name() + } + if tmPkgPath != vmPkgPath { + continue + } + } + if i++; i >= len(t.methods) { + return true + } + } + } + return false +} + +// directlyAssignable reports whether a value x of type V can be directly +// assigned (using memmove) to a value of type T. +// https://golang.org/doc/go_spec.html#Assignability +// Ignoring the interface rules (implemented elsewhere) +// and the ideal constant rules (no ideal constants at run time). +func directlyAssignable(T, V *rtype) bool { + // x's type V is identical to T? + if T == V { + return true + } + + // Otherwise at least one of T and V must not be defined + // and they must have the same kind. + if T.Name() != "" && V.Name() != "" || T.Kind() != V.Kind() { + return false + } + + // x's type T and V must have identical underlying types. + return haveIdenticalUnderlyingType(T, V, true) +} + +func haveIdenticalType(T, V Type, cmpTags bool) bool { + if cmpTags { + return T == V + } + + if T.Name() != V.Name() || T.Kind() != V.Kind() { + return false + } + + return haveIdenticalUnderlyingType(T.common(), V.common(), false) +} + +func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool { + if T == V { + return true + } + + kind := T.Kind() + if kind != V.Kind() { + return false + } + + // Non-composite types of equal kind have same underlying type + // (the predefined instance of the type). + if Bool <= kind && kind <= Complex128 || kind == String || kind == UnsafePointer { + return true + } + + // Composite types. + switch kind { + case Array: + return T.Len() == V.Len() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) + + case Chan: + // Special case: + // x is a bidirectional channel value, T is a channel type, + // and x's type V and T have identical element types. + if V.chanDir() == bothDir && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) { + return true + } + + // Otherwise continue test for identical underlying type. + return V.chanDir() == T.chanDir() && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) + + case Func: + t := (*funcType)(unsafe.Pointer(T)) + v := (*funcType)(unsafe.Pointer(V)) + if t.outCount != v.outCount || t.inCount != v.inCount { + return false + } + for i := 0; i < t.NumIn(); i++ { + if !haveIdenticalType(t.In(i), v.In(i), cmpTags) { + return false + } + } + for i := 0; i < t.NumOut(); i++ { + if !haveIdenticalType(t.Out(i), v.Out(i), cmpTags) { + return false + } + } + return true + + case Interface: + t := (*interfaceType)(unsafe.Pointer(T)) + v := (*interfaceType)(unsafe.Pointer(V)) + if len(t.methods) == 0 && len(v.methods) == 0 { + return true + } + // Might have the same methods but still + // need a run time conversion. + return false + + case Map: + return haveIdenticalType(T.Key(), V.Key(), cmpTags) && haveIdenticalType(T.Elem(), V.Elem(), cmpTags) + + case Ptr, Slice: + return haveIdenticalType(T.Elem(), V.Elem(), cmpTags) + + case Struct: + t := (*structType)(unsafe.Pointer(T)) + v := (*structType)(unsafe.Pointer(V)) + if len(t.fields) != len(v.fields) { + return false + } + if t.pkgPath.name() != v.pkgPath.name() { + return false + } + for i := range t.fields { + tf := &t.fields[i] + vf := &v.fields[i] + if tf.name.name() != vf.name.name() { + return false + } + if !haveIdenticalType(tf.typ, vf.typ, cmpTags) { + return false + } + if cmpTags && tf.name.tag() != vf.name.tag() { + return false + } + if tf.offsetEmbed != vf.offsetEmbed { + return false + } + } + return true + } + + return false +} + +type structTypeUncommon struct { + structType + u uncommonType +} + +// toType converts from a *rtype to a Type that can be returned +// to the client of package reflect. In gc, the only concern is that +// a nil *rtype must be replaced by a nil Type, but in gccgo this +// function takes care of ensuring that multiple *rtype for the same +// type are coalesced into a single Type. +func toType(t *rtype) Type { + if t == nil { + return nil + } + return t +} + +// ifaceIndir reports whether t is stored indirectly in an interface value. +func ifaceIndir(t *rtype) bool { + return t.kind&kindDirectIface == 0 +} diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go new file mode 100644 index 0000000000..837fa6c638 --- /dev/null +++ b/src/internal/reflectlite/value.go @@ -0,0 +1,448 @@ +// 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 reflectlite + +import ( + "runtime" + "unsafe" +) + +// Value is the reflection interface to a Go value. +// +// Not all methods apply to all kinds of values. Restrictions, +// if any, are noted in the documentation for each method. +// Use the Kind method to find out the kind of value before +// calling kind-specific methods. Calling a method +// inappropriate to the kind of type causes a run time panic. +// +// The zero Value represents no value. +// Its IsValid method returns false, its Kind method returns Invalid, +// its String method returns "", and all other methods panic. +// Most functions and methods never return an invalid value. +// If one does, its documentation states the conditions explicitly. +// +// A Value can be used concurrently by multiple goroutines provided that +// the underlying Go value can be used concurrently for the equivalent +// direct operations. +// +// To compare two Values, compare the results of the Interface method. +// Using == on two Values does not compare the underlying values +// they represent. +type Value struct { + // typ holds the type of the value represented by a Value. + typ *rtype + + // Pointer-valued data or, if flagIndir is set, pointer to data. + // Valid when either flagIndir is set or typ.pointers() is true. + ptr unsafe.Pointer + + // flag holds metadata about the value. + // The lowest bits are flag bits: + // - flagStickyRO: obtained via unexported not embedded field, so read-only + // - flagEmbedRO: obtained via unexported embedded field, so read-only + // - flagIndir: val holds a pointer to the data + // - flagAddr: v.CanAddr is true (implies flagIndir) + // Value cannot represent method values. + // The next five bits give the Kind of the value. + // This repeats typ.Kind() except for method values. + // The remaining 23+ bits give a method number for method values. + // If flag.kind() != Func, code can assume that flagMethod is unset. + // If ifaceIndir(typ), code can assume that flagIndir is set. + flag + + // A method value represents a curried method invocation + // like r.Read for some receiver r. The typ+val+flag bits describe + // the receiver r, but the flag's Kind bits say Func (methods are + // functions), and the top bits of the flag give the method number + // in r's type's method table. +} + +type flag uintptr + +const ( + flagKindWidth = 5 // there are 27 kinds + flagKindMask flag = 1< Date: Wed, 27 Feb 2019 17:43:46 +0000 Subject: [PATCH 0176/1679] math/big: better initial guess for nat.sqrt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The proposed change introduces a better initial guess which is closer to the final value and therefore converges in fewer steps. Consider for example sqrt(8): previously the guess was 8, whereas now it is 4 (and the result is 2). All this change does is it computes the division by two more accurately while it keeps the guess ≥ √x. Change-Id: I917248d734a7b0488d14a647a063f674e56c4e30 GitHub-Last-Rev: c06d9d4876c8e7d6739f0e4b687e370fe1e9aad7 GitHub-Pull-Request: golang/go#28981 Reviewed-on: https://go-review.googlesource.com/c/163866 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/nat.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/big/nat.go b/src/math/big/nat.go index 1e4a3b09cf..336633a2fa 100644 --- a/src/math/big/nat.go +++ b/src/math/big/nat.go @@ -1345,7 +1345,7 @@ func (z nat) sqrt(x nat) nat { var z1, z2 nat z1 = z z1 = z1.setUint64(1) - z1 = z1.shl(z1, uint(x.bitLen()/2+1)) // must be ≥ √x + z1 = z1.shl(z1, uint(x.bitLen()+1)/2) // must be ≥ √x for n := 0; ; n++ { z2, _ = z2.div(nil, x, z1) z2 = z2.add(z2, z1) -- GitLab From 37f84817247d3b8e687a701ccb0d6bc7ffe3cb78 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 22 Feb 2019 23:41:38 +0100 Subject: [PATCH 0177/1679] errors: add Frame and Formatter/Printer interfaces errors.New now implements Formatter and includes Frame information that is reported when detail is requested. Partly implements proposal Issue #29934. Change-Id: Id76888d246d7d862595b5e92d517b9c03f23a7a6 Reviewed-on: https://go-review.googlesource.com/c/163557 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/errors/errors.go | 14 ++++++++-- src/errors/format.go | 34 ++++++++++++++++++++++++ src/errors/frame.go | 56 +++++++++++++++++++++++++++++++++++++++ src/errors/frame_test.go | 43 ++++++++++++++++++++++++++++++ src/go/build/deps_test.go | 2 +- 5 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 src/errors/format.go create mode 100644 src/errors/frame.go create mode 100644 src/errors/frame_test.go diff --git a/src/errors/errors.go b/src/errors/errors.go index b8a46921be..f23a96c43e 100644 --- a/src/errors/errors.go +++ b/src/errors/errors.go @@ -6,15 +6,25 @@ package errors // New returns an error that formats as the given text. +// +// The returned error contains a Frame set to the caller's location and +// implements Formatter to show this information when printed with details. func New(text string) error { - return &errorString{text} + return &errorString{text, Caller(1)} } // errorString is a trivial implementation of error. type errorString struct { - s string + s string + frame Frame } func (e *errorString) Error() string { return e.s } + +func (e *errorString) FormatError(p Printer) (next error) { + p.Print(e.s) + e.frame.Format(p) + return nil +} diff --git a/src/errors/format.go b/src/errors/format.go new file mode 100644 index 0000000000..12deed3cf7 --- /dev/null +++ b/src/errors/format.go @@ -0,0 +1,34 @@ +// Copyright 2018 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 errors + +// A Formatter formats error messages. +type Formatter interface { + error + + // FormatError prints the receiver's first error and returns the next error in + // the error chain, if any. + FormatError(p Printer) (next error) +} + +// A Printer formats error messages. +// +// The most common implementation of Printer is the one provided by package fmt +// during Printf. Localization packages such as golang.org/x/text/message +// typically provide their own implementations. +type Printer interface { + // Print appends args to the message output. + Print(args ...interface{}) + + // Printf writes a formatted string. + Printf(format string, args ...interface{}) + + // Detail reports whether error detail is requested. + // After the first call to Detail, all text written to the Printer + // is formatted as additional detail, or ignored when + // detail has not been requested. + // If Detail returns false, the caller can avoid printing the detail at all. + Detail() bool +} diff --git a/src/errors/frame.go b/src/errors/frame.go new file mode 100644 index 0000000000..a5369e5c36 --- /dev/null +++ b/src/errors/frame.go @@ -0,0 +1,56 @@ +// Copyright 2018 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 errors + +import ( + "runtime" +) + +// A Frame contains part of a call stack. +type Frame struct { + // Make room for three PCs: the one we were asked for, what it called, + // and possibly a PC for skipPleaseUseCallersFrames. See: + // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 + frames [3]uintptr +} + +// Caller returns a Frame that describes a frame on the caller's stack. +// The argument skip is the number of frames to skip over. +// Caller(0) returns the frame for the caller of Caller. +func Caller(skip int) Frame { + var s Frame + runtime.Callers(skip+1, s.frames[:]) + return s +} + +// location reports the file, line, and function of a frame. +// +// The returned function may be "" even if file and line are not. +func (f Frame) location() (function, file string, line int) { + frames := runtime.CallersFrames(f.frames[:]) + if _, ok := frames.Next(); !ok { + return "", "", 0 + } + fr, ok := frames.Next() + if !ok { + return "", "", 0 + } + return fr.Function, fr.File, fr.Line +} + +// Format prints the stack as error detail. +// It should be called from an error's Format implementation, +// before printing any other error detail. +func (f Frame) Format(p Printer) { + if p.Detail() { + function, file, line := f.location() + if function != "" { + p.Printf("%s\n ", function) + } + if file != "" { + p.Printf("%s:%d\n", file, line) + } + } +} diff --git a/src/errors/frame_test.go b/src/errors/frame_test.go new file mode 100644 index 0000000000..864a6934d1 --- /dev/null +++ b/src/errors/frame_test.go @@ -0,0 +1,43 @@ +// Copyright 2018 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 errors_test + +import ( + "bytes" + "errors" + "fmt" + "math/big" + "testing" +) + +type myType struct{} + +func (myType) Format(s fmt.State, v rune) { + s.Write(bytes.Repeat([]byte("Hi! "), 10)) +} + +func BenchmarkErrorf(b *testing.B) { + err := errors.New("foo") + // pi := big.NewFloat(3.14) // Something expensive. + num := big.NewInt(5) + args := func(a ...interface{}) []interface{} { return a } + benchCases := []struct { + name string + format string + args []interface{} + }{ + {"no_format", "msg: %v", args(err)}, + {"with_format", "failed %d times: %v", args(5, err)}, + {"method: mytype", "pi: %v", args("myfile.go", myType{}, err)}, + {"method: number", "pi: %v", args("myfile.go", num, err)}, + } + for _, bc := range benchCases { + b.Run(bc.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = fmt.Errorf(bc.format, bc.args...) + } + }) + } +} diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 3bf4b7acfa..6866abc9b5 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -34,7 +34,7 @@ import ( // var pkgDeps = map[string][]string{ // L0 is the lowest level, core, nearly unavoidable packages. - "errors": {}, + "errors": {"runtime"}, "io": {"errors", "sync", "sync/atomic"}, "runtime": {"unsafe", "runtime/internal/atomic", "runtime/internal/sys", "runtime/internal/math", "internal/cpu", "internal/bytealg"}, "runtime/internal/sys": {}, -- GitLab From 62f5e8156ef56fa61e6af56f4ccc633bde1a9120 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Sat, 23 Feb 2019 00:09:40 +0100 Subject: [PATCH 0178/1679] errors: add Unwrap, Is, and As Unwrap, Is and As are as defined in proposal Issue #29934. Also add Opaque for enforcing an error cannot be unwrapped. Change-Id: I4f3feaa42e3ee7477b588164ac622ba4d5e77cad Reviewed-on: https://go-review.googlesource.com/c/163558 Run-TryBot: Marcel van Lohuizen Reviewed-by: Damien Neil --- src/errors/example_test.go | 15 +++ src/errors/wrap.go | 106 +++++++++++++++ src/errors/wrap_test.go | 258 +++++++++++++++++++++++++++++++++++++ src/go/build/deps_test.go | 2 +- 4 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 src/errors/wrap.go create mode 100644 src/errors/wrap_test.go diff --git a/src/errors/example_test.go b/src/errors/example_test.go index 5dc8841237..7724c16cdf 100644 --- a/src/errors/example_test.go +++ b/src/errors/example_test.go @@ -5,7 +5,9 @@ package errors_test import ( + "errors" "fmt" + "os" "time" ) @@ -32,3 +34,16 @@ func Example() { } // Output: 1989-03-15 22:30:00 +0000 UTC: the file system has gone away } + +func ExampleAs() { + _, err := os.Open("non-existing") + if err != nil { + var pathError *os.PathError + if errors.As(err, &pathError) { + fmt.Println("Failed at path:", pathError.Path) + } + } + + // Output: + // Failed at path: non-existing +} diff --git a/src/errors/wrap.go b/src/errors/wrap.go new file mode 100644 index 0000000000..fc7bf71f8a --- /dev/null +++ b/src/errors/wrap.go @@ -0,0 +1,106 @@ +// Copyright 2018 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 errors + +import ( + "internal/reflectlite" +) + +// A Wrapper provides context around another error. +type Wrapper interface { + // Unwrap returns the next error in the error chain. + // If there is no next error, Unwrap returns nil. + Unwrap() error +} + +// Opaque returns an error with the same error formatting as err +// but that does not match err and cannot be unwrapped. +func Opaque(err error) error { + return noWrapper{err} +} + +type noWrapper struct { + error +} + +func (e noWrapper) FormatError(p Printer) (next error) { + if f, ok := e.error.(Formatter); ok { + return f.FormatError(p) + } + p.Print(e.error) + return nil +} + +// Unwrap returns the result of calling the Unwrap method on err, if err +// implements Unwrap. Otherwise, Unwrap returns nil. +func Unwrap(err error) error { + u, ok := err.(Wrapper) + if !ok { + return nil + } + return u.Unwrap() +} + +// Is reports whether any error in err's chain matches target. +// +// An error is considered to match a target if it is equal to that target or if +// it implements a method Is(error) bool such that Is(target) returns true. +func Is(err, target error) bool { + if target == nil { + return err == target + } + for { + if err == target { + return true + } + if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { + return true + } + // TODO: consider supporing target.Is(err). This would allow + // user-definable predicates, but also may allow for coping with sloppy + // APIs, thereby making it easier to get away with them. + if err = Unwrap(err); err == nil { + return false + } + } +} + +// As finds the first error in err's chain that matches the type to which target +// points, and if so, sets the target to its value and returns true. An error +// matches a type if it is assignable to the target type, or if it has a method +// As(interface{}) bool such that As(target) returns true. As will panic if +// target is not a non-nil pointer to a type which implements error or is of +// interface type. +// +// The As method should set the target to its value and return true if err +// matches the type to which target points. +func As(err error, target interface{}) bool { + if target == nil { + panic("errors: target cannot be nil") + } + val := reflectlite.ValueOf(target) + typ := val.Type() + if typ.Kind() != reflectlite.Ptr || val.IsNil() { + panic("errors: target must be a non-nil pointer") + } + if e := typ.Elem(); e.Kind() != reflectlite.Interface && !e.Implements(errorType) { + panic("errors: *target must be interface or implement error") + } + targetType := typ.Elem() + for { + if reflectlite.TypeOf(err).AssignableTo(targetType) { + val.Elem().Set(reflectlite.ValueOf(err)) + return true + } + if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { + return true + } + if err = Unwrap(err); err == nil { + return false + } + } +} + +var errorType = reflectlite.TypeOf((*error)(nil)).Elem() diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go new file mode 100644 index 0000000000..657890c1a6 --- /dev/null +++ b/src/errors/wrap_test.go @@ -0,0 +1,258 @@ +// Copyright 2018 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 errors_test + +import ( + "bytes" + "errors" + "fmt" + "os" + "testing" +) + +func TestIs(t *testing.T) { + err1 := errors.New("1") + erra := wrapped{"wrap 2", err1} + errb := wrapped{"wrap 3", erra} + erro := errors.Opaque(err1) + errco := wrapped{"opaque", erro} + + err3 := errors.New("3") + + poser := &poser{"either 1 or 3", func(err error) bool { + return err == err1 || err == err3 + }} + + testCases := []struct { + err error + target error + match bool + }{ + {nil, nil, true}, + {err1, nil, false}, + {err1, err1, true}, + {erra, err1, true}, + {errb, err1, true}, + {errco, erro, true}, + {errco, err1, false}, + {erro, erro, true}, + {err1, err3, false}, + {erra, err3, false}, + {errb, err3, false}, + {poser, err1, true}, + {poser, err3, true}, + {poser, erra, false}, + {poser, errb, false}, + {poser, erro, false}, + {poser, errco, false}, + } + for _, tc := range testCases { + t.Run("", func(t *testing.T) { + if got := errors.Is(tc.err, tc.target); got != tc.match { + t.Errorf("Is(%v, %v) = %v, want %v", tc.err, tc.target, got, tc.match) + } + }) + } +} + +type poser struct { + msg string + f func(error) bool +} + +func (p *poser) Error() string { return p.msg } +func (p *poser) Is(err error) bool { return p.f(err) } +func (p *poser) As(err interface{}) bool { + switch x := err.(type) { + case **poser: + *x = p + case *errorT: + *x = errorT{} + case **os.PathError: + *x = &os.PathError{} + default: + return false + } + return true +} + +func TestAs(t *testing.T) { + var errT errorT + var errP *os.PathError + var timeout interface{ Timeout() bool } + var p *poser + _, errF := os.Open("non-existing") + + testCases := []struct { + err error + target interface{} + match bool + }{{ + wrapped{"pittied the fool", errorT{}}, + &errT, + true, + }, { + errF, + &errP, + true, + }, { + errors.Opaque(errT), + &errT, + false, + }, { + errorT{}, + &errP, + false, + }, { + wrapped{"wrapped", nil}, + &errT, + false, + }, { + &poser{"error", nil}, + &errT, + true, + }, { + &poser{"path", nil}, + &errP, + true, + }, { + &poser{"oh no", nil}, + &p, + true, + }, { + errors.New("err"), + &timeout, + false, + }, { + errF, + &timeout, + true, + }, { + wrapped{"path error", errF}, + &timeout, + true, + }} + for i, tc := range testCases { + name := fmt.Sprintf("%d:As(Errorf(..., %v), %v)", i, tc.err, tc.target) + t.Run(name, func(t *testing.T) { + match := errors.As(tc.err, tc.target) + if match != tc.match { + t.Fatalf("match: got %v; want %v", match, tc.match) + } + if !match { + return + } + if tc.target == nil { + t.Fatalf("non-nil result after match") + } + }) + } +} + +func TestAsValidation(t *testing.T) { + var s string + testCases := []interface{}{ + nil, + (*int)(nil), + "error", + &s, + } + err := errors.New("error") + for _, tc := range testCases { + t.Run(fmt.Sprintf("%T(%v)", tc, tc), func(t *testing.T) { + defer func() { + recover() + }() + if errors.As(err, tc) { + t.Errorf("As(err, %T(%v)) = true, want false", tc, tc) + return + } + t.Errorf("As(err, %T(%v)) did not panic", tc, tc) + }) + } +} + +func TestUnwrap(t *testing.T) { + err1 := errors.New("1") + erra := wrapped{"wrap 2", err1} + erro := errors.Opaque(err1) + + testCases := []struct { + err error + want error + }{ + {nil, nil}, + {wrapped{"wrapped", nil}, nil}, + {err1, nil}, + {erra, err1}, + {wrapped{"wrap 3", erra}, erra}, + + {erro, nil}, + {wrapped{"opaque", erro}, erro}, + } + for _, tc := range testCases { + if got := errors.Unwrap(tc.err); got != tc.want { + t.Errorf("Unwrap(%v) = %v, want %v", tc.err, got, tc.want) + } + } +} + +func TestOpaque(t *testing.T) { + someError := errors.New("some error") + testCases := []struct { + err error + next error + }{ + {errorT{}, nil}, + {wrapped{"b", nil}, nil}, + {wrapped{"c", someError}, someError}, + } + for _, tc := range testCases { + t.Run("", func(t *testing.T) { + opaque := errors.Opaque(tc.err) + + f, ok := opaque.(errors.Formatter) + if !ok { + t.Fatal("Opaque error does not implement Formatter") + } + var p printer + next := f.FormatError(&p) + if next != tc.next { + t.Errorf("next was %v; want %v", next, tc.next) + } + if got, want := p.buf.String(), tc.err.Error(); got != want { + t.Errorf("error was %q; want %q", got, want) + } + if got := errors.Unwrap(opaque); got != nil { + t.Errorf("Unwrap returned non-nil error (%v)", got) + } + }) + } +} + +type errorT struct{} + +func (errorT) Error() string { return "errorT" } + +type wrapped struct { + msg string + err error +} + +func (e wrapped) Error() string { return e.msg } + +func (e wrapped) Unwrap() error { return e.err } + +func (e wrapped) FormatError(p errors.Printer) error { + p.Print(e.msg) + return e.err +} + +type printer struct { + errors.Printer + buf bytes.Buffer +} + +func (p *printer) Print(args ...interface{}) { fmt.Fprint(&p.buf, args...) } diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 6866abc9b5..73270d3a23 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -34,7 +34,7 @@ import ( // var pkgDeps = map[string][]string{ // L0 is the lowest level, core, nearly unavoidable packages. - "errors": {"runtime"}, + "errors": {"runtime", "internal/reflectlite"}, "io": {"errors", "sync", "sync/atomic"}, "runtime": {"unsafe", "runtime/internal/atomic", "runtime/internal/sys", "runtime/internal/math", "internal/cpu", "internal/bytealg"}, "runtime/internal/sys": {}, -- GitLab From 6be6f114e0d483a233101a67c9644cd72bd3ae7a Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Sat, 23 Feb 2019 00:29:15 +0100 Subject: [PATCH 0179/1679] fmt: add frame info to Errorf and support %w Partly implements proposal Issue #29934. Change-Id: Ibcf12f383158dcfbc313ab29c417a710571d1acb Reviewed-on: https://go-review.googlesource.com/c/163559 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- .../tools/go/analysis/passes/printf/printf.go | 1 + src/fmt/doc.go | 18 +- src/fmt/errors.go | 239 ++++++++ src/fmt/errors_test.go | 534 ++++++++++++++++++ src/fmt/format.go | 5 + src/fmt/format_example_test.go | 46 ++ src/fmt/print.go | 35 +- src/go/build/deps_test.go | 2 +- 8 files changed, 853 insertions(+), 27 deletions(-) create mode 100644 src/fmt/errors.go create mode 100644 src/fmt/errors_test.go create mode 100644 src/fmt/format_example_test.go diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go index c0265aafee..8f657b1bfa 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go @@ -731,6 +731,7 @@ var printVerbs = []printVerb{ {'T', "-", anyType}, {'U', "-#", argRune | argInt}, {'v', allFlags, anyType}, + {'w', noFlag, anyType}, {'x', sharpNumFlag, argRune | argInt | argString | argPointer}, {'X', sharpNumFlag, argRune | argInt | argString | argPointer}, } diff --git a/src/fmt/doc.go b/src/fmt/doc.go index a7115809d3..b784399e0d 100644 --- a/src/fmt/doc.go +++ b/src/fmt/doc.go @@ -149,20 +149,28 @@ 1. If the operand is a reflect.Value, the operand is replaced by the concrete value that it holds, and printing continues with the next rule. - 2. If an operand implements the Formatter interface, it will - be invoked. Formatter provides fine control of formatting. + 2. If an operand implements the Formatter interface, and not + errors.Formatter, it will be invoked. Formatter provides fine + control of formatting. 3. If the %v verb is used with the # flag (%#v) and the operand implements the GoStringer interface, that will be invoked. If the format (which is implicitly %v for Println etc.) is valid - for a string (%s %q %v %x %X), the following two rules apply: + for a string (%s %q %v %x %X), the following three rules apply: - 4. If an operand implements the error interface, the Error method + 4. If an operand implements errors.Formatter, the FormatError + method will be invoked with an errors.Printer to print the error. + If the %v flag is used with the + flag (%+v), the Detail method + of the Printer will return true and the error will be formatted + as a detailed error message. Otherwise the printed string will + be formatted as required by the verb (if any). + + 5. If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any). - 5. If an operand implements method String() string, that method + 6. If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any). diff --git a/src/fmt/errors.go b/src/fmt/errors.go new file mode 100644 index 0000000000..0fd3e83814 --- /dev/null +++ b/src/fmt/errors.go @@ -0,0 +1,239 @@ +// Copyright 2018 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 fmt + +import ( + "errors" + "strings" +) + +// Errorf formats according to a format specifier and returns the string as a +// value that satisfies error. +// +// The returned error includes the file and line number of the caller when +// formatted with additional detail enabled. If the last argument is an error +// the returned error's Format method will return it if the format string ends +// with ": %s", ": %v", or ": %w". If the last argument is an error and the +// format string ends with ": %w", the returned error implements errors.Wrapper +// with an Unwrap method returning it. +func Errorf(format string, a ...interface{}) error { + err, wrap := lastError(format, a) + if err == nil { + return &noWrapError{Sprintf(format, a...), nil, errors.Caller(1)} + } + + // TODO: this is not entirely correct. The error value could be + // printed elsewhere in format if it mixes numbered with unnumbered + // substitutions. With relatively small changes to doPrintf we can + // have it optionally ignore extra arguments and pass the argument + // list in its entirety. + msg := Sprintf(format[:len(format)-len(": %s")], a[:len(a)-1]...) + if wrap { + return &wrapError{msg, err, errors.Caller(1)} + } + return &noWrapError{msg, err, errors.Caller(1)} +} + +func lastError(format string, a []interface{}) (err error, wrap bool) { + wrap = strings.HasSuffix(format, ": %w") + if !wrap && + !strings.HasSuffix(format, ": %s") && + !strings.HasSuffix(format, ": %v") { + return nil, false + } + + if len(a) == 0 { + return nil, false + } + + err, ok := a[len(a)-1].(error) + if !ok { + return nil, false + } + + return err, wrap +} + +type noWrapError struct { + msg string + err error + frame errors.Frame +} + +func (e *noWrapError) Error() string { + return Sprint(e) +} + +func (e *noWrapError) FormatError(p errors.Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +type wrapError struct { + msg string + err error + frame errors.Frame +} + +func (e *wrapError) Error() string { + return Sprint(e) +} + +func (e *wrapError) FormatError(p errors.Printer) (next error) { + p.Print(e.msg) + e.frame.Format(p) + return e.err +} + +func (e *wrapError) Unwrap() error { + return e.err +} + +func fmtError(p *pp, verb rune, err error) (handled bool) { + var ( + sep = " " // separator before next error + w = p // print buffer where error text is written + ) + switch { + // Note that this switch must match the preference order + // for ordinary string printing (%#v before %+v, and so on). + + case p.fmt.sharpV: + if stringer, ok := p.arg.(GoStringer); ok { + // Print the result of GoString unadorned. + p.fmt.fmtS(stringer.GoString()) + return true + } + return false + + case p.fmt.plusV: + sep = "\n - " + w.fmt.fmtFlags = fmtFlags{plusV: p.fmt.plusV} // only keep detail flag + + // The width or precision of a detailed view could be the number of + // errors to print from a list. + + default: + // Use an intermediate buffer in the rare cases that precision, + // truncation, or one of the alternative verbs (q, x, and X) are + // specified. + switch verb { + case 's', 'v': + if (!w.fmt.widPresent || w.fmt.wid == 0) && !w.fmt.precPresent { + break + } + fallthrough + case 'q', 'x', 'X': + w = newPrinter() + defer w.free() + default: + w.badVerb(verb) + return true + } + } + +loop: + for { + w.fmt.inDetail = false + switch v := err.(type) { + case errors.Formatter: + err = v.FormatError((*errPP)(w)) + case Formatter: + if w.fmt.plusV { + v.Format((*errPPState)(w), 'v') // indent new lines + } else { + v.Format(w, 'v') // do not indent new lines + } + break loop + default: + w.fmtString(v.Error(), 's') + break loop + } + if err == nil { + break + } + if w.fmt.needColon || !p.fmt.plusV { + w.buf.WriteByte(':') + w.fmt.needColon = false + } + w.buf.WriteString(sep) + w.fmt.inDetail = false + w.fmt.needNewline = false + } + + if w != p { + p.fmtString(string(w.buf), verb) + } + return true +} + +var detailSep = []byte("\n ") + +// errPPState wraps a pp to implement State with indentation. It is used +// for errors implementing fmt.Formatter. +type errPPState pp + +func (p *errPPState) Width() (wid int, ok bool) { return (*pp)(p).Width() } +func (p *errPPState) Precision() (prec int, ok bool) { return (*pp)(p).Precision() } +func (p *errPPState) Flag(c int) bool { return (*pp)(p).Flag(c) } + +func (p *errPPState) Write(b []byte) (n int, err error) { + if p.fmt.plusV { + if len(b) == 0 { + return 0, nil + } + if p.fmt.inDetail && p.fmt.needColon { + p.fmt.needNewline = true + if b[0] == '\n' { + b = b[1:] + } + } + k := 0 + for i, c := range b { + if p.fmt.needNewline { + if p.fmt.inDetail && p.fmt.needColon { + p.buf.WriteByte(':') + p.fmt.needColon = false + } + p.buf.Write(detailSep) + p.fmt.needNewline = false + } + if c == '\n' { + p.buf.Write(b[k:i]) + k = i + 1 + p.fmt.needNewline = true + } + } + p.buf.Write(b[k:]) + if !p.fmt.inDetail { + p.fmt.needColon = true + } + } else if !p.fmt.inDetail { + p.buf.Write(b) + } + return len(b), nil + +} + +// errPP wraps a pp to implement an errors.Printer. +type errPP pp + +func (p *errPP) Print(args ...interface{}) { + if !p.fmt.inDetail || p.fmt.plusV { + Fprint((*errPPState)(p), args...) + } +} + +func (p *errPP) Printf(format string, args ...interface{}) { + if !p.fmt.inDetail || p.fmt.plusV { + Fprintf((*errPPState)(p), format, args...) + } +} + +func (p *errPP) Detail() bool { + p.fmt.inDetail = true + return p.fmt.plusV +} diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go new file mode 100644 index 0000000000..9e6ad74697 --- /dev/null +++ b/src/fmt/errors_test.go @@ -0,0 +1,534 @@ +// Copyright 2018 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 fmt_test + +import ( + "errors" + "fmt" + "io" + "os" + "path" + "reflect" + "regexp" + "strconv" + "strings" + "testing" +) + +func TestErrorf(t *testing.T) { + chained := &wrapped{"chained", nil} + chain := func(s ...string) (a []string) { + for _, s := range s { + a = append(a, cleanPath(s)) + } + return a + } + noArgsWrap := "no args: %w" // avoid vet check + testCases := []struct { + got error + want []string + }{{ + fmt.Errorf("no args"), + chain("no args/path.TestErrorf/path.go:xxx"), + }, { + fmt.Errorf(noArgsWrap), + chain("no args: %!w(MISSING)/path.TestErrorf/path.go:xxx"), + }, { + fmt.Errorf("nounwrap: %s", "simple"), + chain(`nounwrap: simple/path.TestErrorf/path.go:xxx`), + }, { + fmt.Errorf("nounwrap: %v", "simple"), + chain(`nounwrap: simple/path.TestErrorf/path.go:xxx`), + }, { + fmt.Errorf("%s failed: %v", "foo", chained), + chain("foo failed/path.TestErrorf/path.go:xxx", + "chained/somefile.go:xxx"), + }, { + fmt.Errorf("no wrap: %s", chained), + chain("no wrap/path.TestErrorf/path.go:xxx", + "chained/somefile.go:xxx"), + }, { + fmt.Errorf("%s failed: %w", "foo", chained), + chain("wraps:foo failed/path.TestErrorf/path.go:xxx", + "chained/somefile.go:xxx"), + }, { + fmt.Errorf("nowrapv: %v", chained), + chain("nowrapv/path.TestErrorf/path.go:xxx", + "chained/somefile.go:xxx"), + }, { + fmt.Errorf("wrapw: %w", chained), + chain("wraps:wrapw/path.TestErrorf/path.go:xxx", + "chained/somefile.go:xxx"), + }, { + fmt.Errorf("not wrapped: %+v", chained), + chain("not wrapped: chained: somefile.go:123/path.TestErrorf/path.go:xxx"), + }} + for i, tc := range testCases { + t.Run(strconv.Itoa(i)+"/"+path.Join(tc.want...), func(t *testing.T) { + got := errToParts(tc.got) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("Format:\n got: %+q\nwant: %+q", got, tc.want) + } + + gotStr := tc.got.Error() + wantStr := fmt.Sprint(tc.got) + if gotStr != wantStr { + t.Errorf("Error:\n got: %+q\nwant: %+q", gotStr, wantStr) + } + }) + } +} + +func TestErrorFormatter(t *testing.T) { + testCases := []struct { + err error + fmt string + want string + regexp bool + }{{ + err: errors.New("foo"), + fmt: "%+v", + want: "foo:" + + "\n fmt_test.TestErrorFormatter" + + "\n .+/fmt/errors_test.go:\\d\\d", + regexp: true, + }, { + err: &wrapped{"simple", nil}, + fmt: "%s", + want: "simple", + }, { + err: &wrapped{"can't adumbrate elephant", outOfPeanuts{}}, + fmt: "%s", + want: "can't adumbrate elephant: out of peanuts", + }, { + err: &wrapped{"a", &wrapped{"b", &wrapped{"c", nil}}}, + fmt: "%s", + want: "a: b: c", + }, { + err: &wrapped{"simple", nil}, + fmt: "%+v", + want: "simple:" + + "\n somefile.go:123", + }, { + err: &wrapped{"can't adumbrate elephant", outOfPeanuts{}}, + fmt: "%+v", + want: "can't adumbrate elephant:" + + "\n somefile.go:123" + + "\n - out of peanuts:" + + "\n the elephant is on strike" + + "\n and the 12 monkeys" + + "\n are laughing", + }, { + err: &wrapped{"simple", nil}, + fmt: "%#v", + want: "&fmt_test.wrapped{msg:\"simple\", err:error(nil)}", + }, { + err: ¬AFormatterError{}, + fmt: "%+v", + want: "not a formatter", + }, { + err: &wrapped{"wrap", ¬AFormatterError{}}, + fmt: "%+v", + want: "wrap:" + + "\n somefile.go:123" + + "\n - not a formatter", + }, { + err: &withFrameAndMore{frame: errors.Caller(0)}, + fmt: "%+v", + want: "something:" + + "\n fmt_test.TestErrorFormatter" + + "\n .+/fmt/errors_test.go:\\d\\d\\d" + + "\n something more", + regexp: true, + }, { + err: fmtTwice("Hello World!"), + fmt: "%#v", + want: "2 times Hello World!", + }, { + err: &wrapped{"fallback", os.ErrNotExist}, + fmt: "%s", + want: "fallback: file does not exist", + }, { + err: &wrapped{"fallback", os.ErrNotExist}, + fmt: "%+v", + // Note: no colon after the last error, as there are no details. + want: "fallback:" + + "\n somefile.go:123" + + "\n - file does not exist:" + + "\n os.init.ializers" + + "\n .+/os/error.go:\\d\\d", + regexp: true, + }, { + err: &wrapped{"outer", + errors.Opaque(&wrapped{"mid", + &wrapped{"inner", nil}})}, + fmt: "%s", + want: "outer: mid: inner", + }, { + err: &wrapped{"outer", + errors.Opaque(&wrapped{"mid", + &wrapped{"inner", nil}})}, + fmt: "%+v", + want: "outer:" + + "\n somefile.go:123" + + "\n - mid:" + + "\n somefile.go:123" + + "\n - inner:" + + "\n somefile.go:123", + }, { + err: &wrapped{"new style", formatError("old style")}, + fmt: "%v", + want: "new style: old style", + }, { + err: &wrapped{"new style", formatError("old style")}, + fmt: "%q", + want: `"new style: old style"`, + }, { + err: &wrapped{"new style", formatError("old style")}, + fmt: "%+v", + // Note the extra indentation. + // Colon for old style error is rendered by the fmt.Formatter + // implementation of the old-style error. + want: "new style:" + + "\n somefile.go:123" + + "\n - old style:" + + "\n otherfile.go:456", + }, { + err: &wrapped{"simple", nil}, + fmt: "%-12s", + want: "simple ", + }, { + // Don't use formatting flags for detailed view. + err: &wrapped{"simple", nil}, + fmt: "%+12v", + want: "simple:" + + "\n somefile.go:123", + }, { + err: &wrapped{"can't adumbrate elephant", outOfPeanuts{}}, + fmt: "%+50s", + want: " can't adumbrate elephant: out of peanuts", + }, { + err: &wrapped{"café", nil}, + fmt: "%q", + want: `"café"`, + }, { + err: &wrapped{"café", nil}, + fmt: "%+q", + want: `"caf\u00e9"`, + }, { + err: &wrapped{"simple", nil}, + fmt: "% x", + want: "73 69 6d 70 6c 65", + }, { + err: &wrapped{"msg with\nnewline", + &wrapped{"and another\none", nil}}, + fmt: "%s", + want: "msg with" + + "\nnewline: and another" + + "\none", + }, { + err: &wrapped{"msg with\nnewline", + &wrapped{"and another\none", nil}}, + fmt: "%+v", + want: "msg with" + + "\n newline:" + + "\n somefile.go:123" + + "\n - and another" + + "\n one:" + + "\n somefile.go:123", + }, { + err: wrapped{"", wrapped{"inner message", nil}}, + fmt: "%+v", + want: "somefile.go:123" + + "\n - inner message:" + + "\n somefile.go:123", + }, { + err: detail{"empty detail", "", nil}, + fmt: "%s", + want: "empty detail", + }, { + err: detail{"empty detail", "", nil}, + fmt: "%+v", + want: "empty detail", + }, { + err: detail{"newline at start", "\nextra", nil}, + fmt: "%s", + want: "newline at start", + }, { + err: detail{"newline at start", "\n extra", nil}, + fmt: "%+v", + want: "newline at start:" + + "\n extra", + }, { + err: detail{"newline at start", "\nextra", + detail{"newline at start", "\nmore", nil}}, + fmt: "%+v", + want: "newline at start:" + + "\n extra" + + "\n - newline at start:" + + "\n more", + }, { + err: detail{"two newlines at start", "\n\nextra", + detail{"two newlines at start", "\n\nmore", nil}}, + fmt: "%+v", + want: "two newlines at start:" + + "\n " + // note the explicit space + "\n extra" + + "\n - two newlines at start:" + + "\n " + + "\n more", + }, { + err: &detail{"single newline", "\n", nil}, + fmt: "%+v", + want: "single newline", + }, { + err: &detail{"single newline", "\n", + &detail{"single newline", "\n", nil}}, + fmt: "%+v", + want: "single newline:" + + "\n - single newline", + }, { + err: &detail{"newline at end", "detail\n", nil}, + fmt: "%+v", + want: "newline at end:" + + "\n detail", + }, { + err: &detail{"newline at end", "detail\n", + &detail{"newline at end", "detail\n", nil}}, + fmt: "%+v", + want: "newline at end:" + + "\n detail" + + "\n - newline at end:" + + "\n detail", + }, { + err: &detail{"two newlines at end", "detail\n\n", + &detail{"two newlines at end", "detail\n\n", nil}}, + fmt: "%+v", + want: "two newlines at end:" + + "\n detail" + + "\n " + + "\n - two newlines at end:" + + "\n detail" + + "\n ", // note the additional space + }, { + err: nil, + fmt: "%+v", + want: "", + }, { + err: (*wrapped)(nil), + fmt: "%+v", + want: "", + }, { + err: &wrapped{"simple", nil}, + fmt: "%T", + want: "*fmt_test.wrapped", + }, { + err: &wrapped{"simple", nil}, + fmt: "%🤪", + want: "%!🤪(*fmt_test.wrapped=&{simple })", + }, { + err: formatError("use fmt.Formatter"), + fmt: "%#v", + want: "use fmt.Formatter", + }, { + err: wrapped{"using errors.Formatter", + formatError("use fmt.Formatter")}, + fmt: "%#v", + want: "fmt_test.wrapped{msg:\"using errors.Formatter\", err:\"use fmt.Formatter\"}", + }, { + err: fmtTwice("%s %s", "ok", panicValue{}), + fmt: "%s", + want: "ok %!s(PANIC=String method: panic)/ok %!s(PANIC=String method: panic)", + }, { + err: fmtTwice("%o %s", panicValue{}, "ok"), + fmt: "%s", + want: "{} ok/{} ok", + }} + for i, tc := range testCases { + t.Run(fmt.Sprintf("%d/%s", i, tc.fmt), func(t *testing.T) { + got := fmt.Sprintf(tc.fmt, tc.err) + var ok bool + if tc.regexp { + var err error + ok, err = regexp.MatchString(tc.want+"$", got) + if err != nil { + t.Fatal(err) + } + } else { + ok = got == tc.want + } + if !ok { + t.Errorf("\n got: %q\nwant: %q", got, tc.want) + } + }) + } +} + +var _ errors.Formatter = wrapped{} + +type wrapped struct { + msg string + err error +} + +func (e wrapped) Error() string { return fmt.Sprint(e) } + +func (e wrapped) FormatError(p errors.Printer) (next error) { + p.Print(e.msg) + p.Detail() + p.Print("somefile.go:123") + return e.err +} + +var _ errors.Formatter = outOfPeanuts{} + +type outOfPeanuts struct{} + +func (e outOfPeanuts) Error() string { return fmt.Sprint(e) } + +func (e outOfPeanuts) Format(fmt.State, rune) { + panic("should never be called by one of the tests") +} + +func (outOfPeanuts) FormatError(p errors.Printer) (next error) { + p.Printf("out of %s", "peanuts") + p.Detail() + p.Print("the elephant is on strike\n") + p.Printf("and the %d monkeys\nare laughing", 12) + return nil +} + +type withFrameAndMore struct { + frame errors.Frame +} + +func (e *withFrameAndMore) Error() string { return fmt.Sprint(e) } + +func (e *withFrameAndMore) FormatError(p errors.Printer) (next error) { + p.Print("something") + if p.Detail() { + e.frame.Format(p) + p.Print("something more") + } + return nil +} + +type notAFormatterError struct{} + +func (e notAFormatterError) Error() string { return "not a formatter" } + +type detail struct { + msg string + detail string + next error +} + +func (e detail) Error() string { return fmt.Sprint(e) } + +func (e detail) FormatError(p errors.Printer) (next error) { + p.Print(e.msg) + p.Detail() + p.Print(e.detail) + return e.next +} + +// formatError is an error implementing Format instead of errors.Formatter. +// The implementation mimics the implementation of github.com/pkg/errors. +type formatError string + +func (e formatError) Error() string { return string(e) } + +func (e formatError) Format(s fmt.State, verb rune) { + // Body based on pkg/errors/errors.go + switch verb { + case 'v': + if s.Flag('+') { + io.WriteString(s, string(e)) + fmt.Fprintf(s, ":\n%s", "otherfile.go:456") + return + } + fallthrough + case 's': + io.WriteString(s, string(e)) + case 'q': + fmt.Fprintf(s, "%q", string(e)) + } +} + +func (e formatError) GoString() string { + panic("should never be called") +} + +type fmtTwiceErr struct { + format string + args []interface{} +} + +func fmtTwice(format string, a ...interface{}) error { + return fmtTwiceErr{format, a} +} + +func (e fmtTwiceErr) Error() string { return fmt.Sprint(e) } + +func (e fmtTwiceErr) FormatError(p errors.Printer) (next error) { + p.Printf(e.format, e.args...) + p.Print("/") + p.Printf(e.format, e.args...) + return nil +} + +func (e fmtTwiceErr) GoString() string { + return "2 times " + fmt.Sprintf(e.format, e.args...) +} + +type panicValue struct{} + +func (panicValue) String() string { panic("panic") } + +var rePath = regexp.MustCompile(`( [^ ]*)fmt.*test\.`) +var reLine = regexp.MustCompile(":[0-9]*\n?$") + +func cleanPath(s string) string { + s = rePath.ReplaceAllString(s, "/path.") + s = reLine.ReplaceAllString(s, ":xxx") + s = strings.Replace(s, "\n ", "", -1) + s = strings.Replace(s, " /", "/", -1) + return s +} + +func errToParts(err error) (a []string) { + for err != nil { + var p testPrinter + if errors.Unwrap(err) != nil { + p.str += "wraps:" + } + f, ok := err.(errors.Formatter) + if !ok { + a = append(a, err.Error()) + break + } + err = f.FormatError(&p) + a = append(a, cleanPath(p.str)) + } + return a + +} + +type testPrinter struct { + str string +} + +func (p *testPrinter) Print(a ...interface{}) { + p.str += fmt.Sprint(a...) +} + +func (p *testPrinter) Printf(format string, a ...interface{}) { + p.str += fmt.Sprintf(format, a...) +} + +func (p *testPrinter) Detail() bool { + p.str += " /" + return true +} diff --git a/src/fmt/format.go b/src/fmt/format.go index 24e7e9551a..546c456c50 100644 --- a/src/fmt/format.go +++ b/src/fmt/format.go @@ -34,6 +34,11 @@ type fmtFlags struct { // different, flagless formats set at the top level. plusV bool sharpV bool + + // error-related flags. + inDetail bool + needNewline bool + needColon bool } // A fmt is the raw formatter used by Printf etc. diff --git a/src/fmt/format_example_test.go b/src/fmt/format_example_test.go new file mode 100644 index 0000000000..386f10ef23 --- /dev/null +++ b/src/fmt/format_example_test.go @@ -0,0 +1,46 @@ +// Copyright 2018 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 fmt_test + +import ( + "errors" + "fmt" + "path/filepath" + "regexp" +) + +func baz() error { return errors.New("baz flopped") } +func bar() error { return fmt.Errorf("bar(nameserver 139): %v", baz()) } +func foo() error { return fmt.Errorf("foo: %s", bar()) } + +func Example_formatting() { + err := foo() + fmt.Println("Error:") + fmt.Printf("%v\n", err) + fmt.Println() + fmt.Println("Detailed error:") + fmt.Println(stripPath(fmt.Sprintf("%+v\n", err))) + // Output: + // Error: + // foo: bar(nameserver 139): baz flopped + // + // Detailed error: + // foo: + // fmt_test.foo + // fmt/format_example_test.go:16 + // - bar(nameserver 139): + // fmt_test.bar + // fmt/format_example_test.go:15 + // - baz flopped: + // fmt_test.baz + // fmt/format_example_test.go:14 +} + +func stripPath(s string) string { + rePath := regexp.MustCompile(`( [^ ]*)fmt`) + s = rePath.ReplaceAllString(s, " fmt") + s = filepath.ToSlash(s) + return s +} diff --git a/src/fmt/print.go b/src/fmt/print.go index 121c7c59e4..c4ec73c77a 100644 --- a/src/fmt/print.go +++ b/src/fmt/print.go @@ -217,12 +217,6 @@ func Sprintf(format string, a ...interface{}) string { return s } -// Errorf formats according to a format specifier and returns the string -// as a value that satisfies error. -func Errorf(format string, a ...interface{}) error { - return errors.New(Sprintf(format, a...)) -} - // These routines do not take a format string // Fprint formats using the default formats for its operands and writes to w. @@ -576,12 +570,22 @@ func (p *pp) handleMethods(verb rune) (handled bool) { if p.erroring { return } - // Is it a Formatter? - if formatter, ok := p.arg.(Formatter); ok { + switch x := p.arg.(type) { + case errors.Formatter: + handled = true + defer p.catchPanic(p.arg, verb, "FormatError") + return fmtError(p, verb, x) + + case Formatter: handled = true defer p.catchPanic(p.arg, verb, "Format") - formatter.Format(p, verb) + x.Format(p, verb) return + + case error: + handled = true + defer p.catchPanic(p.arg, verb, "Error") + return fmtError(p, verb, x) } // If we're doing Go syntax and the argument knows how to supply it, take care of it now. @@ -599,18 +603,7 @@ func (p *pp) handleMethods(verb rune) (handled bool) { // Println etc. set verb to %v, which is "stringable". switch verb { case 'v', 's', 'x', 'X', 'q': - // Is it an error or Stringer? - // The duplication in the bodies is necessary: - // setting handled and deferring catchPanic - // must happen before calling the method. - switch v := p.arg.(type) { - case error: - handled = true - defer p.catchPanic(p.arg, verb, "Error") - p.fmtString(v.Error(), verb) - return - - case Stringer: + if v, ok := p.arg.(Stringer); ok { handled = true defer p.catchPanic(p.arg, verb, "String") p.fmtString(v.String(), verb) diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 73270d3a23..3b6dbd6221 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -183,7 +183,7 @@ var pkgDeps = map[string][]string{ }, // Formatted I/O: few dependencies (L1) but we must add reflect and internal/fmtsort. - "fmt": {"L1", "os", "reflect", "internal/fmtsort"}, + "fmt": {"L1", "bytes", "strings", "os", "reflect", "internal/fmtsort"}, "log": {"L1", "os", "fmt", "time"}, // Packages used by testing must be low-level (L2+fmt). -- GitLab From 694ee61277300a4c24d570e75c1b63fff8dea468 Mon Sep 17 00:00:00 2001 From: Arash Bina Date: Wed, 6 Feb 2019 21:41:55 -0500 Subject: [PATCH 0180/1679] crypto/x509: improve error when PKCS1, PKCS8, EC keys are mixed up Improve error messages if ParsePKCS8PrivateKey/ParseECPrivateKey /ParsePKCS1PrivateKey or ParsePKIXPublicKey/ParsePKCS1PublicKey are called erroneously instead of one another. Fixes #30094 Change-Id: Ia419c5f320167791aa82e174b4e9ce0f3275ec63 Reviewed-on: https://go-review.googlesource.com/c/161557 Reviewed-by: Filippo Valsorda Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot --- src/crypto/x509/pkcs1.go | 9 ++++++++ src/crypto/x509/pkcs8.go | 6 +++++ src/crypto/x509/pkcs8_test.go | 22 ++++++++++++++++++ src/crypto/x509/sec1.go | 6 +++++ src/crypto/x509/sec1_test.go | 22 ++++++++++++++++++ src/crypto/x509/x509.go | 3 +++ src/crypto/x509/x509_test.go | 43 +++++++++++++++++++++++++++++++++++ 7 files changed, 111 insertions(+) diff --git a/src/crypto/x509/pkcs1.go b/src/crypto/x509/pkcs1.go index 82502cfe58..5857c17a45 100644 --- a/src/crypto/x509/pkcs1.go +++ b/src/crypto/x509/pkcs1.go @@ -49,6 +49,12 @@ func ParsePKCS1PrivateKey(der []byte) (*rsa.PrivateKey, error) { return nil, asn1.SyntaxError{Msg: "trailing data"} } if err != nil { + if _, err := asn1.Unmarshal(der, &ecPrivateKey{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParseECPrivateKey instead for this key format)") + } + if _, err := asn1.Unmarshal(der, &pkcs8{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)") + } return nil, err } @@ -125,6 +131,9 @@ func ParsePKCS1PublicKey(der []byte) (*rsa.PublicKey, error) { var pub pkcs1PublicKey rest, err := asn1.Unmarshal(der, &pub) if err != nil { + if _, err := asn1.Unmarshal(der, &publicKeyInfo{}); err == nil { + return nil, errors.New("x509: failed to parse public key (use ParsePKIXPublicKey instead for this key format)") + } return nil, err } if len(rest) > 0 { diff --git a/src/crypto/x509/pkcs8.go b/src/crypto/x509/pkcs8.go index fb1340c6df..bf3bd9e565 100644 --- a/src/crypto/x509/pkcs8.go +++ b/src/crypto/x509/pkcs8.go @@ -28,6 +28,12 @@ type pkcs8 struct { func ParsePKCS8PrivateKey(der []byte) (key interface{}, err error) { var privKey pkcs8 if _, err := asn1.Unmarshal(der, &privKey); err != nil { + if _, err := asn1.Unmarshal(der, &ecPrivateKey{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParseECPrivateKey instead for this key format)") + } + if _, err := asn1.Unmarshal(der, &pkcs1PrivateKey{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParsePKCS1PrivateKey instead for this key format)") + } return nil, err } switch { diff --git a/src/crypto/x509/pkcs8_test.go b/src/crypto/x509/pkcs8_test.go index c8f11e64d1..4a72cc0c5e 100644 --- a/src/crypto/x509/pkcs8_test.go +++ b/src/crypto/x509/pkcs8_test.go @@ -11,6 +11,7 @@ import ( "crypto/rsa" "encoding/hex" "reflect" + "strings" "testing" ) @@ -107,3 +108,24 @@ func TestPKCS8(t *testing.T) { } } } + +const hexPKCS8TestPKCS1Key = "3082025c02010002818100b1a1e0945b9289c4d3f1329f8a982c4a2dcd59bfd372fb8085a9c517554607ebd2f7990eef216ac9f4605f71a03b04f42a5255b158cf8e0844191f5119348baa44c35056e20609bcf9510f30ead4b481c81d7865fb27b8e0090e112b717f3ee08cdfc4012da1f1f7cf2a1bc34c73a54a12b06372d09714742dd7895eadde4aa5020301000102818062b7fa1db93e993e40237de4d89b7591cc1ea1d04fed4904c643f17ae4334557b4295270d0491c161cb02a9af557978b32b20b59c267a721c4e6c956c2d147046e9ae5f2da36db0106d70021fa9343455f8f973a4b355a26fd19e6b39dee0405ea2b32deddf0f4817759ef705d02b34faab9ca93c6766e9f722290f119f34449024100d9c29a4a013a90e35fd1be14a3f747c589fac613a695282d61812a711906b8a0876c6181f0333ca1066596f57bff47e7cfcabf19c0fc69d9cd76df743038b3cb024100d0d3546fecf879b5551f2bd2c05e6385f2718a08a6face3d2aecc9d7e03645a480a46c81662c12ad6bd6901e3bd4f38029462de7290859567cdf371c79088d4f024100c254150657e460ea58573fcf01a82a4791e3d6223135c8bdfed69afe84fbe7857274f8eb5165180507455f9b4105c6b08b51fe8a481bb986a202245576b713530240045700003b7a867d0041df9547ae2e7f50248febd21c9040b12dae9c2feab0d3d4609668b208e4727a3541557f84d372ac68eaf74ce1018a4c9a0ef92682c8fd02405769731480bb3a4570abf422527c5f34bf732fa6c1e08cc322753c511ce055fac20fc770025663ad3165324314df907f1f1942f0448a7e9cdbf87ecd98b92156" +const hexPKCS8TestECKey = "3081a40201010430bdb9839c08ee793d1157886a7a758a3c8b2a17a4df48f17ace57c72c56b4723cf21dcda21d4e1ad57ff034f19fcfd98ea00706052b81040022a16403620004feea808b5ee2429cfcce13c32160e1c960990bd050bb0fdf7222f3decd0a55008e32a6aa3c9062051c4cba92a7a3b178b24567412d43cdd2f882fa5addddd726fe3e208d2c26d733a773a597abb749714df7256ead5105fa6e7b3650de236b50" + +var pkcs8MismatchKeyTests = []struct { + hexKey string + errorContains string +}{ + {hexKey: hexPKCS8TestECKey, errorContains: "use ParseECPrivateKey instead"}, + {hexKey: hexPKCS8TestPKCS1Key, errorContains: "use ParsePKCS1PrivateKey instead"}, +} + +func TestPKCS8MismatchKeyFormat(t *testing.T) { + for i, test := range pkcs8MismatchKeyTests { + derBytes, _ := hex.DecodeString(test.hexKey) + _, err := ParsePKCS8PrivateKey(derBytes) + if !strings.Contains(err.Error(), test.errorContains) { + t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err) + } + } +} diff --git a/src/crypto/x509/sec1.go b/src/crypto/x509/sec1.go index 3008d0df77..faba9dbe5d 100644 --- a/src/crypto/x509/sec1.go +++ b/src/crypto/x509/sec1.go @@ -65,6 +65,12 @@ func marshalECPrivateKeyWithOID(key *ecdsa.PrivateKey, oid asn1.ObjectIdentifier func parseECPrivateKey(namedCurveOID *asn1.ObjectIdentifier, der []byte) (key *ecdsa.PrivateKey, err error) { var privKey ecPrivateKey if _, err := asn1.Unmarshal(der, &privKey); err != nil { + if _, err := asn1.Unmarshal(der, &pkcs8{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParsePKCS8PrivateKey instead for this key format)") + } + if _, err := asn1.Unmarshal(der, &pkcs1PrivateKey{}); err == nil { + return nil, errors.New("x509: failed to parse private key (use ParsePKCS1PrivateKey instead for this key format)") + } return nil, errors.New("x509: failed to parse EC private key: " + err.Error()) } if privKey.Version != ecPrivKeyVersion { diff --git a/src/crypto/x509/sec1_test.go b/src/crypto/x509/sec1_test.go index 573c937caf..9ac251896b 100644 --- a/src/crypto/x509/sec1_test.go +++ b/src/crypto/x509/sec1_test.go @@ -7,6 +7,7 @@ package x509 import ( "bytes" "encoding/hex" + "strings" "testing" ) @@ -42,3 +43,24 @@ func TestParseECPrivateKey(t *testing.T) { } } } + +const hexECTestPKCS1Key = "3082025c02010002818100b1a1e0945b9289c4d3f1329f8a982c4a2dcd59bfd372fb8085a9c517554607ebd2f7990eef216ac9f4605f71a03b04f42a5255b158cf8e0844191f5119348baa44c35056e20609bcf9510f30ead4b481c81d7865fb27b8e0090e112b717f3ee08cdfc4012da1f1f7cf2a1bc34c73a54a12b06372d09714742dd7895eadde4aa5020301000102818062b7fa1db93e993e40237de4d89b7591cc1ea1d04fed4904c643f17ae4334557b4295270d0491c161cb02a9af557978b32b20b59c267a721c4e6c956c2d147046e9ae5f2da36db0106d70021fa9343455f8f973a4b355a26fd19e6b39dee0405ea2b32deddf0f4817759ef705d02b34faab9ca93c6766e9f722290f119f34449024100d9c29a4a013a90e35fd1be14a3f747c589fac613a695282d61812a711906b8a0876c6181f0333ca1066596f57bff47e7cfcabf19c0fc69d9cd76df743038b3cb024100d0d3546fecf879b5551f2bd2c05e6385f2718a08a6face3d2aecc9d7e03645a480a46c81662c12ad6bd6901e3bd4f38029462de7290859567cdf371c79088d4f024100c254150657e460ea58573fcf01a82a4791e3d6223135c8bdfed69afe84fbe7857274f8eb5165180507455f9b4105c6b08b51fe8a481bb986a202245576b713530240045700003b7a867d0041df9547ae2e7f50248febd21c9040b12dae9c2feab0d3d4609668b208e4727a3541557f84d372ac68eaf74ce1018a4c9a0ef92682c8fd02405769731480bb3a4570abf422527c5f34bf732fa6c1e08cc322753c511ce055fac20fc770025663ad3165324314df907f1f1942f0448a7e9cdbf87ecd98b92156" +const hexECTestPKCS8Key = "30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100cfb1b5bf9685ffa97b4f99df4ff122b70e59ac9b992f3bc2b3dde17d53c1a34928719b02e8fd17839499bfbd515bd6ef99c7a1c47a239718fe36bfd824c0d96060084b5f67f0273443007a24dfaf5634f7772c9346e10eb294c2306671a5a5e719ae24b4de467291bc571014b0e02dec04534d66a9bb171d644b66b091780e8d020301000102818100b595778383c4afdbab95d2bfed12b3f93bb0a73a7ad952f44d7185fd9ec6c34de8f03a48770f2009c8580bcd275e9632714e9a5e3f32f29dc55474b2329ff0ebc08b3ffcb35bc96e6516b483df80a4a59cceb71918cbabf91564e64a39d7e35dce21cb3031824fdbc845dba6458852ec16af5dddf51a8397a8797ae0337b1439024100ea0eb1b914158c70db39031dd8904d6f18f408c85fbbc592d7d20dee7986969efbda081fdf8bc40e1b1336d6b638110c836bfdc3f314560d2e49cd4fbde1e20b024100e32a4e793b574c9c4a94c8803db5152141e72d03de64e54ef2c8ed104988ca780cd11397bc359630d01b97ebd87067c5451ba777cf045ca23f5912f1031308c702406dfcdbbd5a57c9f85abc4edf9e9e29153507b07ce0a7ef6f52e60dcfebe1b8341babd8b789a837485da6c8d55b29bbb142ace3c24a1f5b54b454d01b51e2ad03024100bd6a2b60dee01e1b3bfcef6a2f09ed027c273cdbbaf6ba55a80f6dcc64e4509ee560f84b4f3e076bd03b11e42fe71a3fdd2dffe7e0902c8584f8cad877cdc945024100aa512fa4ada69881f1d8bb8ad6614f192b83200aef5edf4811313d5ef30a86cbd0a90f7b025c71ea06ec6b34db6306c86b1040670fd8654ad7291d066d06d031" + +var ecMismatchKeyTests = []struct { + hexKey string + errorContains string +}{ + {hexKey: hexECTestPKCS8Key, errorContains: "use ParsePKCS8PrivateKey instead"}, + {hexKey: hexECTestPKCS1Key, errorContains: "use ParsePKCS1PrivateKey instead"}, +} + +func TestECMismatchKeyFormat(t *testing.T) { + for i, test := range ecMismatchKeyTests { + derBytes, _ := hex.DecodeString(test.hexKey) + _, err := ParseECPrivateKey(derBytes) + if !strings.Contains(err.Error(), test.errorContains) { + t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err) + } + } +} diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 58098adc2d..4f9b305e7c 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -54,6 +54,9 @@ type pkixPublicKey struct { func ParsePKIXPublicKey(derBytes []byte) (pub interface{}, err error) { var pki publicKeyInfo if rest, err := asn1.Unmarshal(derBytes, &pki); err != nil { + if _, err := asn1.Unmarshal(derBytes, &pkcs1PublicKey{}); err == nil { + return nil, errors.New("x509: failed to parse public key (use ParsePKCS1PublicKey instead for this key format)") + } return nil, err } else if len(rest) != 0 { return nil, errors.New("x509: trailing data after ASN.1 of public-key") diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index 388156e209..f5851f1f11 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -54,6 +54,17 @@ func TestParsePKCS1PrivateKey(t *testing.T) { } } +func TestPKCS1MismatchPublicKeyFormat(t *testing.T) { + + const pkixPublicKey = "30820122300d06092a864886f70d01010105000382010f003082010a0282010100dd5a0f37d3ca5232852ccc0e81eebec270e2f2c6c44c6231d852971a0aad00aa7399e9b9de444611083c59ea919a9d76c20a7be131a99045ec19a7bb452d647a72429e66b87e28be9e8187ed1d2a2a01ef3eb2360706bd873b07f2d1f1a72337aab5ec94e983e39107f52c480d404915e84d75a3db2cfd601726a128cb1d7f11492d4bdb53272e652276667220795c709b8a9b4af6489cbf48bb8173b8fb607c834a71b6e8bf2d6aab82af3c8ad7ce16d8dcf58373a6edc427f7484d09744d4c08f4e19ed07adbf6cb31243bc5d0d1145e77a08a6fc5efd208eca67d6abf2d6f38f58b6fdd7c28774fb0cc03fc4935c6e074842d2e1479d3d8787249258719f90203010001" + const errorContains = "use ParsePKIXPublicKey instead" + derBytes, _ := hex.DecodeString(pkixPublicKey) + _, err := ParsePKCS1PublicKey(derBytes) + if !strings.Contains(err.Error(), errorContains) { + t.Errorf("expected error containing %q, got %s", errorContains, err) + } +} + func TestParsePKIXPublicKey(t *testing.T) { block, _ := pem.Decode([]byte(pemPublicKey)) pub, err := ParsePKIXPublicKey(block.Bytes) @@ -106,6 +117,17 @@ wg/HcAJWY60xZTJDFN+Qfx8ZQvBEin6c2/h+zZi5IVY= -----END RSA PRIVATE KEY----- ` +func TestPKIXMismatchPublicKeyFormat(t *testing.T) { + + const pkcs1PublicKey = "308201080282010100817cfed98bcaa2e2a57087451c7674e0c675686dc33ff1268b0c2a6ee0202dec710858ee1c31bdf5e7783582e8ca800be45f3275c6576adc35d98e26e95bb88ca5beb186f853b8745d88bc9102c5f38753bcda519fb05948d5c77ac429255ff8aaf27d9f45d1586e95e2e9ba8a7cb771b8a09dd8c8fed3f933fd9b439bc9f30c475953418ef25f71a2b6496f53d94d39ce850aa0cc75d445b5f5b4f4ee4db78ab197a9a8d8a852f44529a007ac0ac23d895928d60ba538b16b0b087a7f903ed29770e215019b77eaecc360f35f7ab11b6d735978795b2c4a74e5bdea4dc6594cd67ed752a108e666729a753ab36d6c4f606f8760f507e1765be8cd744007e629020103" + const errorContains = "use ParsePKCS1PublicKey instead" + derBytes, _ := hex.DecodeString(pkcs1PublicKey) + _, err := ParsePKIXPublicKey(derBytes) + if !strings.Contains(err.Error(), errorContains) { + t.Errorf("expected error containing %q, got %s", errorContains, err) + } +} + var testPrivateKey *rsa.PrivateKey func init() { @@ -2017,3 +2039,24 @@ func TestMultipleURLsInCRLDP(t *testing.T) { t.Errorf("CRL distribution points = %#v, want #%v", got, want) } } + +const hexPKCS1TestPKCS8Key = "30820278020100300d06092a864886f70d0101010500048202623082025e02010002818100cfb1b5bf9685ffa97b4f99df4ff122b70e59ac9b992f3bc2b3dde17d53c1a34928719b02e8fd17839499bfbd515bd6ef99c7a1c47a239718fe36bfd824c0d96060084b5f67f0273443007a24dfaf5634f7772c9346e10eb294c2306671a5a5e719ae24b4de467291bc571014b0e02dec04534d66a9bb171d644b66b091780e8d020301000102818100b595778383c4afdbab95d2bfed12b3f93bb0a73a7ad952f44d7185fd9ec6c34de8f03a48770f2009c8580bcd275e9632714e9a5e3f32f29dc55474b2329ff0ebc08b3ffcb35bc96e6516b483df80a4a59cceb71918cbabf91564e64a39d7e35dce21cb3031824fdbc845dba6458852ec16af5dddf51a8397a8797ae0337b1439024100ea0eb1b914158c70db39031dd8904d6f18f408c85fbbc592d7d20dee7986969efbda081fdf8bc40e1b1336d6b638110c836bfdc3f314560d2e49cd4fbde1e20b024100e32a4e793b574c9c4a94c8803db5152141e72d03de64e54ef2c8ed104988ca780cd11397bc359630d01b97ebd87067c5451ba777cf045ca23f5912f1031308c702406dfcdbbd5a57c9f85abc4edf9e9e29153507b07ce0a7ef6f52e60dcfebe1b8341babd8b789a837485da6c8d55b29bbb142ace3c24a1f5b54b454d01b51e2ad03024100bd6a2b60dee01e1b3bfcef6a2f09ed027c273cdbbaf6ba55a80f6dcc64e4509ee560f84b4f3e076bd03b11e42fe71a3fdd2dffe7e0902c8584f8cad877cdc945024100aa512fa4ada69881f1d8bb8ad6614f192b83200aef5edf4811313d5ef30a86cbd0a90f7b025c71ea06ec6b34db6306c86b1040670fd8654ad7291d066d06d031" +const hexPKCS1TestECKey = "3081a40201010430bdb9839c08ee793d1157886a7a758a3c8b2a17a4df48f17ace57c72c56b4723cf21dcda21d4e1ad57ff034f19fcfd98ea00706052b81040022a16403620004feea808b5ee2429cfcce13c32160e1c960990bd050bb0fdf7222f3decd0a55008e32a6aa3c9062051c4cba92a7a3b178b24567412d43cdd2f882fa5addddd726fe3e208d2c26d733a773a597abb749714df7256ead5105fa6e7b3650de236b50" + +var pkcs1MismatchKeyTests = []struct { + hexKey string + errorContains string +}{ + {hexKey: hexPKCS1TestPKCS8Key, errorContains: "use ParsePKCS8PrivateKey instead"}, + {hexKey: hexPKCS1TestECKey, errorContains: "use ParseECPrivateKey instead"}, +} + +func TestPKCS1MismatchKeyFormat(t *testing.T) { + for i, test := range pkcs1MismatchKeyTests { + derBytes, _ := hex.DecodeString(test.hexKey) + _, err := ParsePKCS1PrivateKey(derBytes) + if !strings.Contains(err.Error(), test.errorContains) { + t.Errorf("#%d: expected error containing %q, got %s", i, test.errorContains, err) + } + } +} -- GitLab From df557fe3ea94ff8888abd6a6ab4cc5d5351d77a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 30 Dec 2018 18:46:22 +0100 Subject: [PATCH 0181/1679] cmd/go: avoid compiling most regexes at init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These regexes are all related to commands like get and build, so they're unnecessary for simpler commands like env. In particular, we need env to be fast, since libraries like go/packages call it early and often. Some external Go tools are interactive, so milliseconds matter. lazyregexp eagerly compiles the patterns when running from within a test binary, so there's no longer any need to do that as part of non-test binaries. Picking up the low-hanging fruit spotted by 'perf record' shaves off well over a full millisecond off the benchmark on my laptop: name old time/op new time/op delta ExecGoEnv-8 4.92ms ± 1% 3.81ms ± 0% -22.52% (p=0.004 n=6+5) This CL required adding a few more methods to the lazy regexp wrapper. Updates #29382. Change-Id: I22417ab6258f7437a2feea0d25ceb2bb4d735a15 Reviewed-on: https://go-review.googlesource.com/c/155540 Run-TryBot: Daniel Martí Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/get/vcs.go | 50 +++++++++----------- src/cmd/go/internal/modfetch/codehost/vcs.go | 10 ++-- src/cmd/go/internal/modfetch/pseudo.go | 4 +- src/cmd/go/internal/modfile/rule.go | 4 +- src/cmd/go/internal/modload/init.go | 6 +-- src/cmd/go/internal/work/exec.go | 7 +-- src/cmd/go/internal/work/security.go | 9 ++-- src/go/doc/example.go | 4 +- src/go/doc/headscan.go | 4 +- src/internal/lazyregexp/lazyre.go | 20 ++++++++ 10 files changed, 67 insertions(+), 51 deletions(-) diff --git a/src/cmd/go/internal/get/vcs.go b/src/cmd/go/internal/get/vcs.go index a7a2ba32cc..6f60bc0631 100644 --- a/src/cmd/go/internal/get/vcs.go +++ b/src/cmd/go/internal/get/vcs.go @@ -8,6 +8,7 @@ import ( "encoding/json" "errors" "fmt" + "internal/lazyregexp" "internal/singleflight" "log" "net/url" @@ -170,7 +171,7 @@ var vcsGit = &vcsCmd{ // scpSyntaxRe matches the SCP-like addresses used by Git to access // repositories by SSH. -var scpSyntaxRe = regexp.MustCompile(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`) +var scpSyntaxRe = lazyregexp.New(`^([a-zA-Z0-9_]+)@([a-zA-Z0-9._-]+):(.*)$`) func gitRemoteRepo(vcsGit *vcsCmd, rootDir string) (remoteRepo string, err error) { cmd := "config remote.origin.url" @@ -525,13 +526,11 @@ func (v *vcsCmd) tagSync(dir, tag string) error { // version control system and repository name. type vcsPath struct { prefix string // prefix this description applies to - re string // pattern for import path + regexp *lazyregexp.Regexp // compiled pattern for import path repo string // repository to use (expand with match of re) vcs string // version control system to use (expand with match of re) check func(match map[string]string) error // additional checks ping bool // ping for scheme to use to download repo - - regexp *regexp.Regexp // cached compiled form of re } // vcsFromDir inspects dir and its parents to determine the @@ -632,7 +631,14 @@ type RepoRoot struct { vcs *vcsCmd // internal: vcs command access } -var httpPrefixRE = regexp.MustCompile(`^https?:`) +func httpPrefix(s string) string { + for _, prefix := range [...]string{"http:", "https:"} { + if strings.HasPrefix(s, prefix) { + return prefix + } + } + return "" +} // ModuleMode specifies whether to prefer modules when looking up code sources. type ModuleMode int @@ -677,10 +683,10 @@ var errUnknownSite = errors.New("dynamic lookup required to find mapping") func repoRootFromVCSPaths(importPath, scheme string, security web.SecurityMode, vcsPaths []*vcsPath) (*RepoRoot, error) { // A common error is to use https://packagepath because that's what // hg and git require. Diagnose this helpfully. - if loc := httpPrefixRE.FindStringIndex(importPath); loc != nil { + if prefix := httpPrefix(importPath); prefix != "" { // The importPath has been cleaned, so has only one slash. The pattern // ignores the slashes; the error message puts them back on the RHS at least. - return nil, fmt.Errorf("%q not allowed in import path", importPath[loc[0]:loc[1]]+"//") + return nil, fmt.Errorf("%q not allowed in import path", prefix+"//") } for _, srv := range vcsPaths { if !strings.HasPrefix(importPath, srv.prefix) { @@ -975,7 +981,7 @@ var vcsPaths = []*vcsPath{ // Github { prefix: "github.com/", - re: `^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`), vcs: "git", repo: "https://{root}", check: noVCSSuffix, @@ -984,7 +990,7 @@ var vcsPaths = []*vcsPath{ // Bitbucket { prefix: "bitbucket.org/", - re: `^(?Pbitbucket\.org/(?P[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Pbitbucket\.org/(?P[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`), repo: "https://{root}", check: bitbucketVCS, }, @@ -992,7 +998,7 @@ var vcsPaths = []*vcsPath{ // IBM DevOps Services (JazzHub) { prefix: "hub.jazz.net/git/", - re: `^(?Phub\.jazz\.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Phub\.jazz\.net/git/[a-z0-9]+/[A-Za-z0-9_.\-]+)(/[A-Za-z0-9_.\-]+)*$`), vcs: "git", repo: "https://{root}", check: noVCSSuffix, @@ -1001,7 +1007,7 @@ var vcsPaths = []*vcsPath{ // Git at Apache { prefix: "git.apache.org/", - re: `^(?Pgit\.apache\.org/[a-z0-9_.\-]+\.git)(/[A-Za-z0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Pgit\.apache\.org/[a-z0-9_.\-]+\.git)(/[A-Za-z0-9_.\-]+)*$`), vcs: "git", repo: "https://{root}", }, @@ -1009,7 +1015,7 @@ var vcsPaths = []*vcsPath{ // Git at OpenStack { prefix: "git.openstack.org/", - re: `^(?Pgit\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Pgit\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`), vcs: "git", repo: "https://{root}", }, @@ -1017,7 +1023,7 @@ var vcsPaths = []*vcsPath{ // chiselapp.com for fossil { prefix: "chiselapp.com/", - re: `^(?Pchiselapp\.com/user/[A-Za-z0-9]+/repository/[A-Za-z0-9_.\-]+)$`, + regexp: lazyregexp.New(`^(?Pchiselapp\.com/user/[A-Za-z0-9]+/repository/[A-Za-z0-9_.\-]+)$`), vcs: "fossil", repo: "https://{root}", }, @@ -1025,8 +1031,8 @@ var vcsPaths = []*vcsPath{ // General syntax for any server. // Must be last. { - re: `^(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\-]+)+?)\.(?Pbzr|fossil|git|hg|svn))(/~?[A-Za-z0-9_.\-]+)*$`, - ping: true, + regexp: lazyregexp.New(`(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?(/~?[A-Za-z0-9_.\-]+)+?)\.(?Pbzr|fossil|git|hg|svn))(/~?[A-Za-z0-9_.\-]+)*$`), + ping: true, }, } @@ -1038,25 +1044,13 @@ var vcsPathsAfterDynamic = []*vcsPath{ // Launchpad. See golang.org/issue/11436. { prefix: "launchpad.net/", - re: `^(?Plaunchpad\.net/((?P[A-Za-z0-9_.\-]+)(?P/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, + regexp: lazyregexp.New(`^(?Plaunchpad\.net/((?P[A-Za-z0-9_.\-]+)(?P/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`), vcs: "bzr", repo: "https://{root}", check: launchpadVCS, }, } -func init() { - // fill in cached regexps. - // Doing this eagerly discovers invalid regexp syntax - // without having to run a command that needs that regexp. - for _, srv := range vcsPaths { - srv.regexp = regexp.MustCompile(srv.re) - } - for _, srv := range vcsPathsAfterDynamic { - srv.regexp = regexp.MustCompile(srv.re) - } -} - // noVCSSuffix checks that the repository name does not // end in .foo for any version control system foo. // The usual culprit is ".git". diff --git a/src/cmd/go/internal/modfetch/codehost/vcs.go b/src/cmd/go/internal/modfetch/codehost/vcs.go index 59c2b15d19..83f097e00e 100644 --- a/src/cmd/go/internal/modfetch/codehost/vcs.go +++ b/src/cmd/go/internal/modfetch/codehost/vcs.go @@ -7,11 +7,11 @@ package codehost import ( "encoding/xml" "fmt" + "internal/lazyregexp" "io" "io/ioutil" "os" "path/filepath" - "regexp" "sort" "strconv" "strings" @@ -124,10 +124,10 @@ type vcsCmd struct { vcs string // vcs name "hg" init func(remote string) []string // cmd to init repo to track remote tags func(remote string) []string // cmd to list local tags - tagRE *regexp.Regexp // regexp to extract tag names from output of tags cmd + tagRE *lazyregexp.Regexp // regexp to extract tag names from output of tags cmd branches func(remote string) []string // cmd to list local branches - branchRE *regexp.Regexp // regexp to extract branch names from output of tags cmd - badLocalRevRE *regexp.Regexp // regexp of names that must not be served out of local cache without doing fetch first + branchRE *lazyregexp.Regexp // regexp to extract branch names from output of tags cmd + badLocalRevRE *lazyregexp.Regexp // regexp of names that must not be served out of local cache without doing fetch first statLocal func(rev, remote string) []string // cmd to stat local rev parseStat func(rev, out string) (*RevInfo, error) // cmd to parse output of statLocal fetch []string // cmd to fetch everything from remote @@ -136,7 +136,7 @@ type vcsCmd struct { readZip func(rev, subdir, remote, target string) []string // cmd to read rev's subdir as zip file } -var re = regexp.MustCompile +var re = lazyregexp.New var vcsCmds = map[string]*vcsCmd{ "hg": { diff --git a/src/cmd/go/internal/modfetch/pseudo.go b/src/cmd/go/internal/modfetch/pseudo.go index 32c7bf883b..f105373cd4 100644 --- a/src/cmd/go/internal/modfetch/pseudo.go +++ b/src/cmd/go/internal/modfetch/pseudo.go @@ -37,7 +37,7 @@ package modfetch import ( "cmd/go/internal/semver" "fmt" - "regexp" + "internal/lazyregexp" "strings" "time" ) @@ -86,7 +86,7 @@ func PseudoVersion(major, older string, t time.Time, rev string) string { return v + patch + "-0." + segment + build } -var pseudoVersionRE = regexp.MustCompile(`^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)\d{14}-[A-Za-z0-9]+(\+incompatible)?$`) +var pseudoVersionRE = lazyregexp.New(`^v[0-9]+\.(0\.0-|\d+\.\d+-([^+]*\.)?0\.)\d{14}-[A-Za-z0-9]+(\+incompatible)?$`) // IsPseudoVersion reports whether v is a pseudo-version. func IsPseudoVersion(v string) bool { diff --git a/src/cmd/go/internal/modfile/rule.go b/src/cmd/go/internal/modfile/rule.go index 7f9a18c6c2..0fd5a7146a 100644 --- a/src/cmd/go/internal/modfile/rule.go +++ b/src/cmd/go/internal/modfile/rule.go @@ -8,8 +8,8 @@ import ( "bytes" "errors" "fmt" + "internal/lazyregexp" "path/filepath" - "regexp" "sort" "strconv" "strings" @@ -154,7 +154,7 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File return f, nil } -var GoVersionRE = regexp.MustCompile(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`) +var GoVersionRE = lazyregexp.New(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`) func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, fix VersionFixer, strict bool) { // If strict is false, this module is a dependency. diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index a0514d425e..20f7389f55 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -21,11 +21,11 @@ import ( "encoding/json" "fmt" "go/build" + "internal/lazyregexp" "io/ioutil" "os" "path" "path/filepath" - "regexp" "runtime/debug" "strconv" "strings" @@ -569,8 +569,8 @@ func findModulePath(dir string) (string, error) { } var ( - gitOriginRE = regexp.MustCompile(`(?m)^\[remote "origin"\]\r?\n\turl = (?:https://github.com/|git@github.com:|gh:)([^/]+/[^/]+?)(\.git)?\r?\n`) - importCommentRE = regexp.MustCompile(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`) + gitOriginRE = lazyregexp.New(`(?m)^\[remote "origin"\]\r?\n\turl = (?:https://github.com/|git@github.com:|gh:)([^/]+/[^/]+?)(\.git)?\r?\n`) + importCommentRE = lazyregexp.New(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`) ) func findImportComment(file string) string { diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index bbcbdd7568..37766c2ce5 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -11,6 +11,7 @@ import ( "encoding/json" "errors" "fmt" + "internal/lazyregexp" "io" "io/ioutil" "log" @@ -1838,8 +1839,8 @@ func (b *Builder) showOutput(a *Action, dir, desc, out string) { // print this error. var errPrintedOutput = errors.New("already printed output - no need to show error") -var cgoLine = regexp.MustCompile(`\[[^\[\]]+\.(cgo1|cover)\.go:[0-9]+(:[0-9]+)?\]`) -var cgoTypeSigRe = regexp.MustCompile(`\b_C2?(type|func|var|macro)_\B`) +var cgoLine = lazyregexp.New(`\[[^\[\]]+\.(cgo1|cover)\.go:[0-9]+(:[0-9]+)?\]`) +var cgoTypeSigRe = lazyregexp.New(`\b_C2?(type|func|var|macro)_\B`) // run runs the command given by cmdline in the directory dir. // If the command fails, run prints information about the failure @@ -2412,7 +2413,7 @@ func buildFlags(name, defaults string, fromPackage []string, check func(string, return str.StringList(envList("CGO_"+name, defaults), fromPackage), nil } -var cgoRe = regexp.MustCompile(`[/\\:]`) +var cgoRe = lazyregexp.New(`[/\\:]`) func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgofiles, gccfiles, gxxfiles, mfiles, ffiles []string) (outGo, outObj []string, err error) { p := a.Package diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go index 1a401b8981..e3d85e29c1 100644 --- a/src/cmd/go/internal/work/security.go +++ b/src/cmd/go/internal/work/security.go @@ -32,14 +32,15 @@ package work import ( "cmd/go/internal/load" "fmt" + "internal/lazyregexp" "os" "regexp" "strings" ) -var re = regexp.MustCompile +var re = lazyregexp.New -var validCompilerFlags = []*regexp.Regexp{ +var validCompilerFlags = []*lazyregexp.Regexp{ re(`-D([A-Za-z_].*)`), re(`-F([^@\-].*)`), re(`-I([^@\-].*)`), @@ -130,7 +131,7 @@ var validCompilerFlagsWithNextArg = []string{ "-x", } -var validLinkerFlags = []*regexp.Regexp{ +var validLinkerFlags = []*lazyregexp.Regexp{ re(`-F([^@\-].*)`), re(`-l([^@\-].*)`), re(`-L([^@\-].*)`), @@ -217,7 +218,7 @@ func checkLinkerFlags(name, source string, list []string) error { return checkFlags(name, source, list, validLinkerFlags, validLinkerFlagsWithNextArg) } -func checkFlags(name, source string, list []string, valid []*regexp.Regexp, validNext []string) error { +func checkFlags(name, source string, list []string, valid []*lazyregexp.Regexp, validNext []string) error { // Let users override rules with $CGO_CFLAGS_ALLOW, $CGO_CFLAGS_DISALLOW, etc. var ( allow *regexp.Regexp diff --git a/src/go/doc/example.go b/src/go/doc/example.go index 81956f2fdb..7d1a57058a 100644 --- a/src/go/doc/example.go +++ b/src/go/doc/example.go @@ -9,8 +9,8 @@ package doc import ( "go/ast" "go/token" + "internal/lazyregexp" "path" - "regexp" "sort" "strconv" "strings" @@ -104,7 +104,7 @@ func Examples(files ...*ast.File) []*Example { return list } -var outputPrefix = regexp.MustCompile(`(?i)^[[:space:]]*(unordered )?output:`) +var outputPrefix = lazyregexp.New(`(?i)^[[:space:]]*(unordered )?output:`) // Extracts the expected output and whether there was a valid output comment func exampleOutput(b *ast.BlockStmt, comments []*ast.CommentGroup) (output string, unordered, ok bool) { diff --git a/src/go/doc/headscan.go b/src/go/doc/headscan.go index 1ccaa15819..3f782cc1b4 100644 --- a/src/go/doc/headscan.go +++ b/src/go/doc/headscan.go @@ -22,9 +22,9 @@ import ( "go/doc" "go/parser" "go/token" + "internal/lazyregexp" "os" "path/filepath" - "regexp" "runtime" "strings" ) @@ -35,7 +35,7 @@ var ( ) // ToHTML in comment.go assigns a (possibly blank) ID to each heading -var html_h = regexp.MustCompile(`

    `) +var html_h = lazyregexp.New(`

    `) const html_endh = "

    \n" diff --git a/src/internal/lazyregexp/lazyre.go b/src/internal/lazyregexp/lazyre.go index e4170683eb..0c744fa39f 100644 --- a/src/internal/lazyregexp/lazyre.go +++ b/src/internal/lazyregexp/lazyre.go @@ -27,6 +27,14 @@ func (r *Regexp) build() { r.str = "" } +func (r *Regexp) FindSubmatch(s []byte) [][]byte { + return r.re().FindSubmatch(s) +} + +func (r *Regexp) FindStringSubmatch(s string) []string { + return r.re().FindStringSubmatch(s) +} + func (r *Regexp) FindStringSubmatchIndex(s string) []int { return r.re().FindStringSubmatchIndex(s) } @@ -35,10 +43,22 @@ func (r *Regexp) ReplaceAllString(src, repl string) string { return r.re().ReplaceAllString(src, repl) } +func (r *Regexp) FindString(s string) string { + return r.re().FindString(s) +} + +func (r *Regexp) FindAllString(s string, n int) []string { + return r.re().FindAllString(s, n) +} + func (r *Regexp) MatchString(s string) bool { return r.re().MatchString(s) } +func (r *Regexp) SubexpNames() []string { + return r.re().SubexpNames() +} + var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") func New(str string) *Regexp { -- GitLab From b00ef3b8654ea64651805460fe23c67716cdd827 Mon Sep 17 00:00:00 2001 From: ZZMarquis Date: Wed, 27 Feb 2019 19:26:13 +0000 Subject: [PATCH 0182/1679] crypto/x509: remove the redundant type declaration Change-Id: I50668a4c943ecab91b2b33370f6cfb3784afafd1 GitHub-Last-Rev: c8223adfc8b7d3fc712089bb9cb03d6832ab558b GitHub-Pull-Request: golang/go#29654 Reviewed-on: https://go-review.googlesource.com/c/157338 Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot Reviewed-by: Filippo Valsorda --- src/crypto/x509/x509.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 4f9b305e7c..80e4dec0f3 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -1930,7 +1930,7 @@ func buildExtensions(template *Certificate, subjectIsEmpty bool, authorityKeyId dp := distributionPoint{ DistributionPoint: distributionPointName{ FullName: []asn1.RawValue{ - asn1.RawValue{Tag: 6, Class: 2, Bytes: []byte(name)}, + {Tag: 6, Class: 2, Bytes: []byte(name)}, }, }, } -- GitLab From 9f9c5fa8c7b8ad4d6a691aa3f1b557a9216d838f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 23 Jan 2019 09:01:37 +0100 Subject: [PATCH 0183/1679] cmd/link: fix -a with external linker This commit fixes a panic when -a was used with external linkmode. Fixes #29807 Change-Id: I8cd42775f2953cec620cbc9ab345421c2694c9a2 Reviewed-on: https://go-review.googlesource.com/c/158998 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/data.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index e0fad1acfd..0bd7d82b54 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -824,8 +824,10 @@ func Datblk(ctxt *Link, addr int64, size int64) { for i := range sym.R { r := &sym.R[i] // Copying sym.Reloc has measurable impact on performance rsname := "" + rsval := int64(0) if r.Sym != nil { rsname = r.Sym.Name + rsval = r.Sym.Value } typ := "?" switch r.Type { @@ -836,7 +838,7 @@ func Datblk(ctxt *Link, addr int64, size int64) { case objabi.R_CALL: typ = "call" } - ctxt.Logf("\treloc %.8x/%d %s %s+%#x [%#x]\n", uint(sym.Value+int64(r.Off)), r.Siz, typ, rsname, r.Add, r.Sym.Value+r.Add) + ctxt.Logf("\treloc %.8x/%d %s %s+%#x [%#x]\n", uint(sym.Value+int64(r.Off)), r.Siz, typ, rsname, r.Add, rsval+r.Add) } } -- GitLab From 56f0c046cfe9019e30ad0d0f85ac974de394ebd7 Mon Sep 17 00:00:00 2001 From: Valentin Vidic Date: Wed, 27 Feb 2019 20:20:58 +0000 Subject: [PATCH 0184/1679] regexp: add ReplaceAllStringFunc example Change-Id: I016312f3ecf3dfcbf0eaf24e31b6842d80abb029 GitHub-Last-Rev: 360047c9006dba643429c006f89d813d927999b3 GitHub-Pull-Request: golang/go#30445 Reviewed-on: https://go-review.googlesource.com/c/164257 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/regexp/example_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/regexp/example_test.go b/src/regexp/example_test.go index 3008c56b6b..a44c9396de 100644 --- a/src/regexp/example_test.go +++ b/src/regexp/example_test.go @@ -7,6 +7,7 @@ package regexp_test import ( "fmt" "regexp" + "strings" ) func Example() { @@ -204,6 +205,13 @@ func ExampleRegexp_ReplaceAllString() { // -W-xxW- } +func ExampleRegexp_ReplaceAllStringFunc() { + re := regexp.MustCompile(`[^aeiou]`) + fmt.Println(re.ReplaceAllStringFunc("seafood fool", strings.ToUpper)) + // Output: + // SeaFooD FooL +} + func ExampleRegexp_SubexpNames() { re := regexp.MustCompile(`(?P[a-zA-Z]+) (?P[a-zA-Z]+)`) fmt.Println(re.MatchString("Alan Turing")) -- GitLab From e32203f647370897c6a28018c16cfd9584849569 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 27 Feb 2019 14:13:55 -0800 Subject: [PATCH 0185/1679] doc/go1.12: new go line in go.mod can break builds with Go 1.11 - 1.11.3 Fixes #30446 Change-Id: If069f72fa9735f839df92f3ede3bf7b6d7a695a5 Reviewed-on: https://go-review.googlesource.com/c/164317 Reviewed-by: Brad Fitzpatrick Reviewed-by: Bryan C. Mills --- doc/go1.12.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/go1.12.html b/doc/go1.12.html index 30d1960177..ec2783f479 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -185,6 +185,17 @@ tour that build fails.

    +

    + This changed use of the go directive means that if you + use Go 1.12 to build a module, thus recording go 1.12 + in the go.mod file, you will get an error when + attempting to build the same module with Go 1.11 through Go 1.11.3. + Go 1.11.4 or later will work fine, as will releases older than Go 1.11. + If you must use Go 1.11 through 1.11.3, you can avoid the problem by + setting the language version to 1.11, using the Go 1.12 go tool, + via go mod edit -go=1.11. +

    +

    When an import cannot be resolved using the active modules, the go command will now try to use the modules mentioned in the -- GitLab From 2deda8792a1f0139eba0bee527f3141659491444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 15:48:22 +0100 Subject: [PATCH 0186/1679] cmd/link: improve XCOFF symbol table This commit improves symbol table for XCOFF format. It adds symbol alignment, TLS symbols and move the whole symbol table at the end of the FILE. As relocations in the future external linking will need symbols' index, we cannot write the symbol table when it's generated. Change-Id: I5dcae85b95e538b65f1a128faf56d4e2aa15baf1 Reviewed-on: https://go-review.googlesource.com/c/163998 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/data.go | 1 + src/cmd/link/internal/ld/xcoff.go | 178 ++++++++++++++++++++---------- 2 files changed, 118 insertions(+), 61 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 0bd7d82b54..e72ad40ce9 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -994,6 +994,7 @@ func symalign(s *sym.Symbol) int32 { for int64(align) > s.Size && align > min { align >>= 1 } + s.Align = align return align } diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 1561ce8cd0..e565a3588d 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -9,6 +9,7 @@ import ( "cmd/internal/objabi" "cmd/link/internal/sym" "encoding/binary" + "math/bits" "strings" ) @@ -155,6 +156,10 @@ const ( LDSYMSZ_64 = 24 ) +// Type representing all XCOFF symbols. +type xcoffSym interface { +} + // Symbol Table Entry type XcoffSymEnt64 struct { Nvalue uint64 // Symbol value @@ -214,9 +219,12 @@ const ( // File Auxiliary Entry type XcoffAuxFile64 struct { - Xfname [8]byte // Name or offset inside string table - Xftype uint8 // Source file string type - Xauxtype uint8 // Type of auxiliary entry + Xzeroes uint32 // The name is always in the string table + Xoffset uint32 // Offset in the string table + X_pad1 [6]byte + Xftype uint8 // Source file string type + X_pad2 [2]byte + Xauxtype uint8 // Type of auxiliary entry } // Function Auxiliary Entry @@ -240,6 +248,13 @@ type XcoffAuxCSect64 struct { Xauxtype uint8 // Type of auxiliary entry } +// DWARF Auxiliary Entry +type XcoffAuxDWARF64 struct { + Xscnlen uint64 // Length of this symbol section + X_pad [9]byte + Xauxtype uint8 // Type of auxiliary entry +} + // Auxiliary type const ( _AUX_EXCEPT = 255 @@ -365,6 +380,7 @@ type xcoffFile struct { loaderSize uint64 symtabOffset int64 // offset to the start of symbol table symbolCount uint32 // number of symbol table records written + symtabSym []xcoffSym // XCOFF symbols for the symbol table dynLibraries map[string]int // Dynamic libraries in .loader section. The integer represents its import file number (- 1) loaderSymbols []*xcoffLoaderSymbol // symbols inside .loader symbol table loaderReloc []*xcoffLoaderReloc // Reloc that must be made inside loader @@ -504,8 +520,9 @@ func Xcoffinit(ctxt *Link) { // type records C_FILE information needed for genasmsym in XCOFF. type xcoffSymSrcFile struct { name string - fileSymNb uint32 // Symbol number of this C_FILE - csectSymNb uint64 // Symbol number for the current .csect + file *XcoffSymEnt64 // Symbol of this C_FILE + csectAux *XcoffAuxCSect64 // Symbol for the current .csect + csectSymNb uint64 // Symbol number for the current .csect csectSize int64 } @@ -514,12 +531,30 @@ var ( currSymSrcFile xcoffSymSrcFile ) -// writeSymbol writes a symbol or an auxiliary symbol entry on ctxt.out. -func (f *xcoffFile) writeSymbol(out *OutBuf, byteOrder binary.ByteOrder, sym interface{}) { - binary.Write(out, byteOrder, sym) +// addSymbol writes a symbol or an auxiliary symbol entry on ctxt.out. +func (f *xcoffFile) addSymbol(sym xcoffSym) { + f.symtabSym = append(f.symtabSym, sym) f.symbolCount++ } +// xcoffAlign returns the log base 2 of the symbol's alignment. +func xcoffAlign(x *sym.Symbol, t SymbolType) uint8 { + align := x.Align + if align == 0 { + if t == TextSym { + align = int32(Funcalign) + } else { + align = symalign(x) + } + } + return logBase2(int(align)) +} + +// logBase2 returns the log in base 2 of a. +func logBase2(a int) uint8 { + return uint8(bits.Len(uint(a)) - 1) +} + // Write symbols needed when a new file appared : // - a C_FILE with one auxiliary entry for its name // - C_DWARF symbols to provide debug information @@ -537,17 +572,16 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 Ntype: 0, // Go isn't inside predefined language. Nnumaux: 1, } - f.writeSymbol(ctxt.Out, ctxt.Arch.ByteOrder, s) + f.addSymbol(s) + currSymSrcFile.file = s // Auxiliary entry for file name. - ctxt.Out.Write32(0) - ctxt.Out.Write32(uint32(f.stringTable.add(name))) - ctxt.Out.Write32(0) // 6 bytes empty - ctxt.Out.Write16(0) - ctxt.Out.Write8(XFT_FN) - ctxt.Out.Write16(0) // 2 bytes empty - ctxt.Out.Write8(_AUX_FILE) - f.symbolCount++ + auxf := &XcoffAuxFile64{ + Xoffset: uint32(f.stringTable.add(name)), + Xftype: XFT_FN, + Xauxtype: _AUX_FILE, + } + f.addSymbol(auxf) /* Dwarf */ for _, sect := range Segdwarf.Sections { @@ -569,7 +603,7 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 Nscnum: f.getXCOFFscnum(sect), Nnumaux: 1, } - f.writeSymbol(ctxt.Out, ctxt.Arch.ByteOrder, s) + f.addSymbol(s) // update the DWARF section offset in this file if sect.Name != ".debug_abbrev" { @@ -577,11 +611,12 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 } // Auxiliary dwarf section - ctxt.Out.Write64(dwsize) // section length - ctxt.Out.Write64(0) // nreloc - ctxt.Out.Write8(0) // pad - ctxt.Out.Write8(_AUX_SECT) - f.symbolCount++ + auxd := &XcoffAuxDWARF64{ + Xscnlen: dwsize, + Xauxtype: _AUX_SECT, + } + + f.addSymbol(auxd) } /* .csect */ @@ -592,7 +627,6 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 } currSymSrcFile.csectSymNb = uint64(f.symbolCount) - currSymSrcFile.csectSize = 0 // No offset because no name s = &XcoffSymEnt64{ @@ -602,15 +636,17 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 Ntype: 0, // check visibility ? Nnumaux: 1, } - f.writeSymbol(ctxt.Out, ctxt.Arch.ByteOrder, s) + f.addSymbol(s) aux := &XcoffAuxCSect64{ Xsmclas: XMC_PR, - Xsmtyp: XTY_SD | 5<<3, // align = 5 + Xsmtyp: XTY_SD | logBase2(Funcalign)<<3, Xauxtype: _AUX_CSECT, } - f.writeSymbol(ctxt.Out, ctxt.Arch.ByteOrder, aux) + f.addSymbol(aux) + currSymSrcFile.csectAux = aux + currSymSrcFile.csectSize = 0 } // Update values for the previous package. @@ -618,39 +654,30 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 // - Xsclen of the csect symbol. func (f *xcoffFile) updatePreviousFile(ctxt *Link, last bool) { // first file - if currSymSrcFile.fileSymNb == 0 { + if currSymSrcFile.file == nil { return } - prevOff := f.symtabOffset + int64(currSymSrcFile.fileSymNb*SYMESZ) - currOff := ctxt.Out.Offset() - // Update C_FILE - ctxt.Out.SeekSet(prevOff) + cfile := currSymSrcFile.file if last { - ctxt.Out.Write64(0xFFFFFFFFFFFFFFFF) + cfile.Nvalue = 0xFFFFFFFFFFFFFFFF } else { - ctxt.Out.Write64(uint64(f.symbolCount)) + cfile.Nvalue = uint64(f.symbolCount) } // update csect scnlen in this auxiliary entry - prevOff = f.symtabOffset + int64((currSymSrcFile.csectSymNb+1)*SYMESZ) - ctxt.Out.SeekSet(prevOff) - ctxt.Out.Write32(uint32(currSymSrcFile.csectSize & 0xFFFFFFFF)) - prevOff += 12 - ctxt.Out.SeekSet(prevOff) - ctxt.Out.Write32(uint32(currSymSrcFile.csectSize >> 32)) - - ctxt.Out.SeekSet(currOff) - + aux := currSymSrcFile.csectAux + aux.Xscnlenlo = uint32(currSymSrcFile.csectSize & 0xFFFFFFFF) + aux.Xscnlenhi = uint32(currSymSrcFile.csectSize >> 32) } // Write symbol representing a .text function. // The symbol table is split with C_FILE corresponding to each package // and not to each source file as it should be. -func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []interface{} { +func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { // New XCOFF symbols which will be written. - syms := []interface{}{} + syms := []xcoffSym{} // Check if a new file is detected. if x.File == "" { // Undefined global symbol @@ -664,7 +691,6 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []interface{} { // update previous file values xfile.updatePreviousFile(ctxt, false) currSymSrcFile.name = x.File - currSymSrcFile.fileSymNb = f.symbolCount f.writeSymbolNewFile(ctxt, x.File, uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) } } @@ -703,6 +729,8 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []interface{} { Xsmtyp: XTY_LD, // label definition (based on C) Xauxtype: _AUX_CSECT, } + a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) + syms = append(syms, a4) return syms } @@ -712,7 +740,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, // All XCOFF symbols generated by this GO symbols // Can be a symbol entry or a auxiliary entry - syms := []interface{}{} + syms := []xcoffSym{} switch t { default: @@ -745,6 +773,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, Xsmclas: XMC_PR, Xsmtyp: XTY_SD, } + a4.Xsmtyp |= uint8(xcoffAlign(x, TextSym) << 3) syms = append(syms, a4) } @@ -785,6 +814,8 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, // Read only data if x.Type >= sym.STYPE && x.Type <= sym.SPCLNTAB { a4.Xsmclas = XMC_RO + } else if x.Name == "TOC" { + a4.Xsmclas = XMC_TC0 } else { a4.Xsmclas = XMC_RW } @@ -794,6 +825,8 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, a4.Xsmtyp |= XTY_CM } + a4.Xsmtyp |= uint8(xcoffAlign(x, t) << 3) + syms = append(syms, a4) case UndefinedSym: @@ -820,24 +853,43 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, a4.Xsmclas = XMC_RW } + syms = append(syms, a4) + + case TLSSym: + s := &XcoffSymEnt64{ + Nsclass: C_EXT, + Noffset: uint32(xfile.stringTable.add(str)), + Nscnum: xfile.getXCOFFscnum(x.Sect), + Nvalue: uint64(x.Value), + Nnumaux: 1, + } + + x.Dynid = int32(xfile.symbolCount) + syms = append(syms, s) + + size := uint64(x.Size) + a4 := &XcoffAuxCSect64{ + Xauxtype: _AUX_CSECT, + Xsmclas: XMC_UL, + Xsmtyp: XTY_CM, + Xscnlenlo: uint32(size & 0xFFFFFFFF), + Xscnlenhi: uint32(size >> 32), + } + syms = append(syms, a4) } for _, s := range syms { - xfile.writeSymbol(ctxt.Out, ctxt.Arch.ByteOrder, s) + xfile.addSymbol(s) } } -// Generate XCOFF Symbol table and XCOFF String table +// Generate XCOFF Symbol table. +// It will be written in out file in Asmbxcoff, because it must be +// at the very end, especially after relocation sections which needs symbols' index. func (f *xcoffFile) asmaixsym(ctxt *Link) { - // write symbol table genasmsym(ctxt, putaixsym) - - // update last file Svalue xfile.updatePreviousFile(ctxt, true) - - // write string table - xfile.stringTable.write(ctxt.Out) } func (f *xcoffFile) genDynSym(ctxt *Link) { @@ -1251,8 +1303,7 @@ func (f *xcoffFile) writeFileHeader(ctxt *Link) { f.xahdr.Otoc = uint64(toc.Value) f.xahdr.Osntoc = f.getXCOFFscnum(toc.Sect) - // Based on dump -o - f.xahdr.Oalgntext = 0x5 + f.xahdr.Oalgntext = int16(logBase2(int(Funcalign))) f.xahdr.Oalgndata = 0x5 binary.Write(ctxt.Out, binary.BigEndian, &f.xfhdr) @@ -1310,11 +1361,16 @@ func Asmbxcoff(ctxt *Link, fileoff int64) { // TODO: Relocation } - // Write symbol table - symo := Rnd(ctxt.Out.Offset(), int64(*FlagRound)) - xfile.symtabOffset = symo - ctxt.Out.SeekSet(int64(symo)) + // Write symtab xfile.asmaixsym(ctxt) + xfile.symtabOffset = ctxt.Out.Offset() + for _, s := range xfile.symtabSym { + binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, s) + } + // write string table + xfile.stringTable.write(ctxt.Out) + + ctxt.Out.Flush() // write headers xcoffwrite(ctxt) -- GitLab From d3631955d454a8cfc0b63065ef1cc4c8db64ae46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 15:54:11 +0100 Subject: [PATCH 0187/1679] cmd/link: set correct sizes for XCOFF outer symbols This commit fixes the size of outer symbols like type.*. Outer symbols cannot have a nil size on AIX or they will be removed by ld as long as all their sub-symbols. Change-Id: I68ff3ce5a3a034e3c3eb23431aba31245073cf20 Reviewed-on: https://go-review.googlesource.com/c/163999 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/data.go | 21 +++++++++++++ src/cmd/link/internal/ld/xcoff.go | 51 +++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index e72ad40ce9..46d85f003d 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1475,6 +1475,7 @@ func (ctxt *Link) dodata() { } datsize = Rnd(datsize, int64(sect.Align)) for _, symn := range sym.ReadOnly { + symnStartValue := datsize for _, s := range data[symn] { datsize = aligndatsize(datsize, s) s.Sect = sect @@ -1483,6 +1484,13 @@ func (ctxt *Link) dodata() { datsize += s.Size } checkdatsize(ctxt, datsize, symn) + if ctxt.HeadType == objabi.Haix { + // Read-only symbols might be wrapped inside their outer + // symbol. + // XCOFF symbol table needs to know the size of + // these outer symbols. + xcoffUpdateOuterSize(ctxt, datsize-symnStartValue, symn) + } } sect.Length = uint64(datsize) - sect.Vaddr @@ -1557,6 +1565,7 @@ func (ctxt *Link) dodata() { datsize = Rnd(datsize, int64(sect.Align)) for _, symnro := range sym.ReadOnly { symn := sym.RelROMap[symnro] + symnStartValue := datsize for _, s := range data[symn] { datsize = aligndatsize(datsize, s) if s.Outer != nil && s.Outer.Sect != nil && s.Outer.Sect != sect { @@ -1568,6 +1577,13 @@ func (ctxt *Link) dodata() { datsize += s.Size } checkdatsize(ctxt, datsize, symn) + if ctxt.HeadType == objabi.Haix { + // Read-only symbols might be wrapped inside their outer + // symbol. + // XCOFF symbol table needs to know the size of + // these outer symbols. + xcoffUpdateOuterSize(ctxt, datsize-symnStartValue, symn) + } } sect.Length = uint64(datsize) - sect.Vaddr @@ -1601,6 +1617,11 @@ func (ctxt *Link) dodata() { } checkdatsize(ctxt, datsize, sym.SITABLINK) sect.Length = uint64(datsize) - sect.Vaddr + if ctxt.HeadType == objabi.Haix { + // Store .itablink size because its symbols are wrapped + // under an outer symbol: runtime.itablink. + xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SITABLINK) + } /* gosymtab */ sect = addrelrosection(".gosymtab") diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index e565a3588d..188c7a5cff 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -529,8 +529,48 @@ type xcoffSymSrcFile struct { var ( currDwscnoff = make(map[string]uint64) // Needed to create C_DWARF symbols currSymSrcFile xcoffSymSrcFile + outerSymSize = make(map[string]int64) ) +// xcoffUpdateOuterSize stores the size of outer symbols in order to have it +// in the symbol table. +func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { + if size == 0 { + return + } + + switch stype { + default: + Errorf(nil, "unknown XCOFF outer symbol for type %s", stype.String()) + case sym.SRODATA, sym.SRODATARELRO, sym.SFUNCTAB, sym.SSTRING: + // Nothing to do + case sym.STYPERELRO: + if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) { + outerSymSize["typerel.*"] = size + return + } + fallthrough + case sym.STYPE: + if !ctxt.DynlinkingGo() { + outerSymSize["type.*"] = size + } + case sym.SGOSTRING: + outerSymSize["go.string.*"] = size + case sym.SGOFUNC: + if !ctxt.DynlinkingGo() { + outerSymSize["go.func.*"] = size + } + case sym.SGOFUNCRELRO: + outerSymSize["go.funcrel.*"] = size + case sym.SGCBITS: + outerSymSize["runtime.gcbits.*"] = size + case sym.SITABLINK: + outerSymSize["runtime.itablink"] = size + + } + +} + // addSymbol writes a symbol or an auxiliary symbol entry on ctxt.out. func (f *xcoffFile) addSymbol(sym xcoffSym) { f.symtabSym = append(f.symtabSym, sym) @@ -888,6 +928,17 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, // It will be written in out file in Asmbxcoff, because it must be // at the very end, especially after relocation sections which needs symbols' index. func (f *xcoffFile) asmaixsym(ctxt *Link) { + // Get correct size for symbols wrapping others symbols like go.string.* + // sym.Size can be used directly as the symbols have already been written. + for name, size := range outerSymSize { + sym := ctxt.Syms.ROLookup(name, 0) + if sym == nil { + Errorf(nil, "unknown outer symbol with name %s", name) + } else { + sym.Size = size + } + } + genasmsym(ctxt, putaixsym) xfile.updatePreviousFile(ctxt, true) } -- GitLab From 8e8abf368d5b8050f40408b23a4027824351f674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 11:27:41 +0100 Subject: [PATCH 0188/1679] archive/tar, syscall: add statUnix for aix/ppc64 This commit add statUnix function for aix/ppc64. It also adds Unix and Nano methods for AIX time structure. Change-Id: I9fd62d34a47e87cd46f2f936cb736da0bdff7959 Reviewed-on: https://go-review.googlesource.com/c/163957 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/archive/tar/stat_actime1.go | 2 +- src/archive/tar/stat_unix.go | 7 ++++++- src/syscall/syscall_aix.go | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/archive/tar/stat_actime1.go b/src/archive/tar/stat_actime1.go index cf9cc79c59..1bdd1c9dcb 100644 --- a/src/archive/tar/stat_actime1.go +++ b/src/archive/tar/stat_actime1.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux dragonfly openbsd solaris +// +build aix linux dragonfly openbsd solaris package tar diff --git a/src/archive/tar/stat_unix.go b/src/archive/tar/stat_unix.go index 868105f338..d1576db41d 100644 --- a/src/archive/tar/stat_unix.go +++ b/src/archive/tar/stat_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux darwin dragonfly freebsd openbsd netbsd solaris +// +build aix linux darwin dragonfly freebsd openbsd netbsd solaris package tar @@ -54,6 +54,11 @@ func statUnix(fi os.FileInfo, h *Header) error { if h.Typeflag == TypeChar || h.Typeflag == TypeBlock { dev := uint64(sys.Rdev) // May be int32 or uint32 switch runtime.GOOS { + case "aix": + var major, minor uint32 + major = uint32((dev & 0x3fffffff00000000) >> 32) + minor = uint32((dev & 0x00000000ffffffff) >> 0) + h.Devmajor, h.Devminor = int64(major), int64(minor) case "linux": // Copied from golang.org/x/sys/unix/dev_linux.go. major := uint32((dev & 0x00000000000fff00) >> 8) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 186522bdde..4947248e38 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -28,6 +28,14 @@ const ( SYS_FCNTL ) +func (ts *StTimespec_t) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (ts *StTimespec_t) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + /* * Wrapped */ -- GitLab From bd23e84b73b90947a676ec9a5325de52d7186815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 27 Feb 2019 22:02:51 +0000 Subject: [PATCH 0189/1679] internal/lazytemplate: add a lazy template wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similar to internal/lazyregexp, this will allow removing unnecessary work from init functions with trivial refactors, thanks to sync.Once. Copy the structure. The only major difference is that a template also carries a name. For #29382. Change-Id: I65d096dc2e2072b310bf59a814cd62669856b5b5 Reviewed-on: https://go-review.googlesource.com/c/164337 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/go/build/deps_test.go | 11 ++--- src/internal/lazyregexp/lazyre.go | 7 +++ src/internal/lazytemplate/lazytemplate.go | 52 +++++++++++++++++++++++ 3 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/internal/lazytemplate/lazytemplate.go diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 3b6dbd6221..8e289ae95d 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -194,11 +194,12 @@ var pkgDeps = map[string][]string{ "runtime/trace": {"L0", "context", "fmt"}, "text/tabwriter": {"L2"}, - "testing": {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"}, - "testing/iotest": {"L2", "log"}, - "testing/quick": {"L2", "flag", "fmt", "reflect", "time"}, - "internal/testenv": {"L2", "OS", "flag", "testing", "syscall"}, - "internal/lazyregexp": {"L2", "OS", "regexp"}, + "testing": {"L2", "flag", "fmt", "internal/race", "os", "runtime/debug", "runtime/pprof", "runtime/trace", "time"}, + "testing/iotest": {"L2", "log"}, + "testing/quick": {"L2", "flag", "fmt", "reflect", "time"}, + "internal/testenv": {"L2", "OS", "flag", "testing", "syscall"}, + "internal/lazyregexp": {"L2", "OS", "regexp"}, + "internal/lazytemplate": {"L2", "OS", "text/template"}, // L4 is defined as L3+fmt+log+time, because in general once // you're using L3 packages, use of fmt, log, or time is not a big deal. diff --git a/src/internal/lazyregexp/lazyre.go b/src/internal/lazyregexp/lazyre.go index 0c744fa39f..2681af35af 100644 --- a/src/internal/lazyregexp/lazyre.go +++ b/src/internal/lazyregexp/lazyre.go @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +// Package lazyregexp is a thin wrapper over regexp, allowing the use of global +// regexp variables without forcing them to be compiled at init. package lazyregexp import ( @@ -11,6 +13,8 @@ import ( "sync" ) +// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be +// compiled the first time it is needed. type Regexp struct { str string once sync.Once @@ -61,6 +65,9 @@ func (r *Regexp) SubexpNames() []string { var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") +// New creates a new lazy regexp, delaying the compiling work until it is first +// needed. If the code is being run as part of tests, the regexp compiling will +// happen immediately. func New(str string) *Regexp { lr := &Regexp{str: str} if inTest { diff --git a/src/internal/lazytemplate/lazytemplate.go b/src/internal/lazytemplate/lazytemplate.go new file mode 100644 index 0000000000..c83eaeaf3e --- /dev/null +++ b/src/internal/lazytemplate/lazytemplate.go @@ -0,0 +1,52 @@ +// Copyright 2019 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 lazytemplate is a thin wrapper over text/template, allowing the use +// of global template variables without forcing them to be parsed at init. +package lazytemplate + +import ( + "io" + "os" + "strings" + "sync" + "text/template" +) + +// Template is a wrapper around text/template.Template, where the underlying +// template will be parsed the first time it is needed. +type Template struct { + name, text string + + once sync.Once + tmpl *template.Template +} + +func (r *Template) tp() *template.Template { + r.once.Do(r.build) + return r.tmpl +} + +func (r *Template) build() { + r.tmpl = template.Must(template.New(r.name).Parse(r.text)) + r.name, r.text = "", "" +} + +func (r *Template) Execute(w io.Writer, data interface{}) error { + return r.tp().Execute(w, data) +} + +var inTest = len(os.Args) > 0 && strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") + +// New creates a new lazy template, delaying the parsing work until it is first +// needed. If the code is being run as part of tests, the template parsing will +// happen immediately. +func New(name, text string) *Template { + lt := &Template{name: name, text: text} + if inTest { + // In tests, always parse the templates early. + lt.tp() + } + return lt +} -- GitLab From 61170f85e62f1326d42c4dbd8aa17ab4a1305a87 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Wed, 27 Feb 2019 14:01:55 +1100 Subject: [PATCH 0190/1679] time: move the explanation of u/micro to the ParseDuration example Fix a few missing capitalizations in drive-by. Change-Id: I7353c12f3ccddefc0f26a98590caf9e446129558 Reviewed-on: https://go-review.googlesource.com/c/163918 Run-TryBot: Rob Pike TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/time/example_test.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/time/example_test.go b/src/time/example_test.go index 3b3c88e6af..25c34ebc1c 100644 --- a/src/time/example_test.go +++ b/src/time/example_test.go @@ -90,14 +90,21 @@ func ExampleDuration_Truncate() { func ExampleParseDuration() { hours, _ := time.ParseDuration("10h") complex, _ := time.ParseDuration("1h10m10s") + micro, _ := time.ParseDuration("1µs") + // The package also accepts the incorrect but common prefix u for micro. + micro2, _ := time.ParseDuration("1us") fmt.Println(hours) fmt.Println(complex) - fmt.Printf("there are %.0f seconds in %v\n", complex.Seconds(), complex) + fmt.Printf("There are %.0f seconds in %v.\n", complex.Seconds(), complex) + fmt.Printf("There are %d nanoseconds in %v.\n", micro.Nanoseconds(), micro) + fmt.Printf("There are %6.2e seconds in %v.\n", micro2.Seconds(), micro) // Output: // 10h0m0s // 1h10m10s - // there are 4210 seconds in 1h10m10s + // There are 4210 seconds in 1h10m10s. + // There are 1000 nanoseconds in 1µs. + // There are 1.00e-06 seconds in 1µs. } func ExampleDuration_Hours() { @@ -115,18 +122,14 @@ func ExampleDuration_Minutes() { func ExampleDuration_Nanoseconds() { u, _ := time.ParseDuration("1µs") fmt.Printf("One microsecond is %d nanoseconds.\n", u.Nanoseconds()) - // The package also accepts the incorrect but common prefix u for micro. - v, _ := time.ParseDuration("1us") - fmt.Printf("One microsecond is %6.2e seconds.\n", v.Seconds()) // Output: // One microsecond is 1000 nanoseconds. - // One microsecond is 1.00e-06 seconds. } func ExampleDuration_Seconds() { m, _ := time.ParseDuration("1m30s") - fmt.Printf("take off in t-%.0f seconds.", m.Seconds()) - // Output: take off in t-90 seconds. + fmt.Printf("Take off in t-%.0f seconds.", m.Seconds()) + // Output: Take off in t-90 seconds. } var c chan int -- GitLab From 6a72dd77f4f675ef7a162f0111e092faafc73ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 30 Dec 2018 19:03:02 +0100 Subject: [PATCH 0191/1679] cmd/go: delay parsing the testmain template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The template is over a hundred lines and full of pipelines, and text/template isn't optimised to parse quickly, so it's no wonder that delaying the parsing to the first template use makes 'go env' much faster. Like in the previous patches to get rid of global regexp.MustCompile vars, use the newly introduced lazytemplate package. Close to two full milliseconds are shaved off of 'go env' runs. name old time/op new time/op delta ExecGoEnv-8 4.27ms ± 0% 2.63ms ± 1% -38.43% (p=0.002 n=6+6) Updates #29382. Change-Id: I4e2569e51ddf2afe1b46eb1a9e9e5845f7a3b0bd Reviewed-on: https://go-review.googlesource.com/c/155962 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/load/test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index bd6f00bb66..0a9548e5c8 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -15,10 +15,10 @@ import ( "go/doc" "go/parser" "go/token" + "internal/lazytemplate" "path/filepath" "sort" "strings" - "text/template" "unicode" "unicode/utf8" ) @@ -556,7 +556,7 @@ func checkTestFunc(fn *ast.FuncDecl, arg string) error { return nil } -var testmainTmpl = template.Must(template.New("main").Parse(` +var testmainTmpl = lazytemplate.New("main", ` package main import ( @@ -657,4 +657,4 @@ func main() { {{end}} } -`)) +`) -- GitLab From c2b707bcf18e763a1fafc7c6fe955c64760df255 Mon Sep 17 00:00:00 2001 From: Benny Siegert Date: Thu, 28 Feb 2019 11:54:22 +0100 Subject: [PATCH 0192/1679] syscall: use 64-bit alignment on netbsd-arm netbsd-arm needs the same override to the alignment function as openbsd-arm. This fixes the TestPassFD failure. Update golang/go#24771 Change-Id: Ib124fc776f6e2e3b3932784365c2bd3944523a52 Reviewed-on: https://go-review.googlesource.com/c/164458 Run-TryBot: Tobias Klauser Reviewed-by: Tobias Klauser TryBot-Result: Gobot Gobot --- src/syscall/sockcmsg_unix.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/syscall/sockcmsg_unix.go b/src/syscall/sockcmsg_unix.go index 954148012f..fa198686b1 100644 --- a/src/syscall/sockcmsg_unix.go +++ b/src/syscall/sockcmsg_unix.go @@ -25,8 +25,8 @@ func cmsgAlignOf(salen int) int { if sizeofPtr == 8 { salign = 4 } - case "openbsd": - // OpenBSD armv7 requires 64-bit alignment. + case "netbsd", "openbsd": + // NetBSD and OpenBSD armv7 require 64-bit alignment. if runtime.GOARCH == "arm" { salign = 8 } -- GitLab From 336ae0d242bca424d0a0a48b663d290af7968ba9 Mon Sep 17 00:00:00 2001 From: Benny Siegert Date: Thu, 28 Feb 2019 13:58:11 +0100 Subject: [PATCH 0193/1679] cmd: update vendored golang.org/x/sys/unix This pulls in CL 164497. Fixes #24771 Change-Id: I88f2062e2c42363591dcb9e592a7a8381268ddeb Reviewed-on: https://go-review.googlesource.com/c/164460 Reviewed-by: Tobias Klauser Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot --- src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 4 ++-- src/cmd/vendor/vendor.json | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 5f9ae233a7..26e8b36cfc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -25,8 +25,8 @@ func cmsgAlignOf(salen int) int { if SizeofPtr == 8 { salign = 4 } - case "openbsd": - // OpenBSD armv7 requires 64-bit alignment. + case "netbsd", "openbsd": + // NetBSD and OpenBSD armv7 require 64-bit alignment. if runtime.GOARCH == "arm" { salign = 8 } diff --git a/src/cmd/vendor/vendor.json b/src/cmd/vendor/vendor.json index 053e2afc4f..93b94aef12 100644 --- a/src/cmd/vendor/vendor.json +++ b/src/cmd/vendor/vendor.json @@ -135,10 +135,10 @@ "revisionTime": "2018-05-24T11:38:20Z" }, { - "checksumSHA1": "v0kuTLSywKZmIwuyR3JyT18CgZk=", + "checksumSHA1": "/4HmlX92To16u5s2bryHkTS4+CM=", "path": "golang.org/x/sys/unix", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" + "revision": "a34e9553db1e492c9a76e60db2296ae7e5fbb772", + "revisionTime": "2019-02-28T12:11:59Z" }, { "checksumSHA1": "/G/UvW6DnpLWoplv0wkB3JunvXk=", -- GitLab From 1f17d61026a9d83591db420ba1441c8555d2f4a0 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 28 Feb 2019 04:40:51 -0500 Subject: [PATCH 0194/1679] internal/cpu: change s390x API to match x/sys/cpu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL changes the internal/cpu API to more closely match the public version in x/sys/cpu (added in CL 163003). This will make it easier to update the dependencies of vendored code. The most prominent renaming is from VE1 to VXE for the vector-enhancements facility 1. VXE is the mnemonic used for this facility in the HWCAP vector. Change-Id: I922d6c8bb287900a4bd7af70567e22eac567b5c1 Reviewed-on: https://go-review.googlesource.com/c/164437 Reviewed-by: Martin Möhrmann Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot --- src/crypto/elliptic/p256_s390x.go | 2 +- src/internal/cpu/cpu.go | 39 ++++++++++++++++--------------- src/internal/cpu/cpu_s390x.go | 39 ++++++++++++++++++++----------- 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/crypto/elliptic/p256_s390x.go b/src/crypto/elliptic/p256_s390x.go index ac53a85a5c..0d9478bfd6 100644 --- a/src/crypto/elliptic/p256_s390x.go +++ b/src/crypto/elliptic/p256_s390x.go @@ -15,7 +15,7 @@ import ( const ( offsetS390xHasVX = unsafe.Offsetof(cpu.S390X.HasVX) - offsetS390xHasVE1 = unsafe.Offsetof(cpu.S390X.HasVE1) + offsetS390xHasVE1 = unsafe.Offsetof(cpu.S390X.HasVXE) ) type p256CurveFast struct { diff --git a/src/internal/cpu/cpu.go b/src/internal/cpu/cpu.go index eb74a9fa82..3029bcb0c2 100644 --- a/src/internal/cpu/cpu.go +++ b/src/internal/cpu/cpu.go @@ -109,25 +109,26 @@ type arm64 struct { var S390X s390x type s390x struct { - _ CacheLinePad - HasZArch bool // z architecture mode is active [mandatory] - HasSTFLE bool // store facility list extended [mandatory] - HasLDisp bool // long (20-bit) displacements [mandatory] - HasEImm bool // 32-bit immediates [mandatory] - HasDFP bool // decimal floating point - HasETF3Enhanced bool // ETF-3 enhanced - HasMSA bool // message security assist (CPACF) - HasAES bool // KM-AES{128,192,256} functions - HasAESCBC bool // KMC-AES{128,192,256} functions - HasAESCTR bool // KMCTR-AES{128,192,256} functions - HasAESGCM bool // KMA-GCM-AES{128,192,256} functions - HasGHASH bool // KIMD-GHASH function - HasSHA1 bool // K{I,L}MD-SHA-1 functions - HasSHA256 bool // K{I,L}MD-SHA-256 functions - HasSHA512 bool // K{I,L}MD-SHA-512 functions - HasVX bool // vector facility. Note: the runtime sets this when it processes auxv records. - HasVE1 bool // vector-enhancement 1 - _ CacheLinePad + _ CacheLinePad + HasZARCH bool // z architecture mode is active [mandatory] + HasSTFLE bool // store facility list extended [mandatory] + HasLDISP bool // long (20-bit) displacements [mandatory] + HasEIMM bool // 32-bit immediates [mandatory] + HasDFP bool // decimal floating point + HasETF3EH bool // ETF-3 enhanced + HasMSA bool // message security assist (CPACF) + HasAES bool // KM-AES{128,192,256} functions + HasAESCBC bool // KMC-AES{128,192,256} functions + HasAESCTR bool // KMCTR-AES{128,192,256} functions + HasAESGCM bool // KMA-GCM-AES{128,192,256} functions + HasGHASH bool // KIMD-GHASH function + HasSHA1 bool // K{I,L}MD-SHA-1 functions + HasSHA256 bool // K{I,L}MD-SHA-256 functions + HasSHA512 bool // K{I,L}MD-SHA-512 functions + HasSHA3 bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions + HasVX bool // vector facility. Note: the runtime sets this when it processes auxv records. + HasVXE bool // vector-enhancements facility 1 + _ CacheLinePad } // Initialize examines the processor and sets the relevant variables above. diff --git a/src/internal/cpu/cpu_s390x.go b/src/internal/cpu/cpu_s390x.go index 4d63ef60d1..2c3c9d0ea8 100644 --- a/src/internal/cpu/cpu_s390x.go +++ b/src/internal/cpu/cpu_s390x.go @@ -22,9 +22,15 @@ const ( aes256 function = 20 // AES-256 // K{I,L}MD function codes - sha1 function = 1 // SHA-1 - sha256 function = 2 // SHA-256 - sha512 function = 3 // SHA-512 + sha1 function = 1 // SHA-1 + sha256 function = 2 // SHA-256 + sha512 function = 3 // SHA-512 + sha3_224 function = 32 // SHA3-224 + sha3_256 function = 33 // SHA3-256 + sha3_384 function = 34 // SHA3-384 + sha3_512 function = 35 // SHA3-512 + shake128 function = 36 // SHAKE-128 + shake256 function = 37 // SHAKE-256 // KLMD function codes ghash function = 65 // GHASH @@ -72,7 +78,7 @@ const ( msa8 facility = 146 // message-security-assist extension 8 // vector facilities - ve1 facility = 135 // vector-enhancements 1 + vxe facility = 135 // vector-enhancements 1 // Note: vx and highgprs are excluded because they require // kernel support and so must be fetched from HWCAP. @@ -110,26 +116,26 @@ func klmdQuery() queryResult func doinit() { options = []option{ - {Name: "zarch", Feature: &S390X.HasZArch}, + {Name: "zarch", Feature: &S390X.HasZARCH}, {Name: "stfle", Feature: &S390X.HasSTFLE}, - {Name: "ldisp", Feature: &S390X.HasLDisp}, + {Name: "ldisp", Feature: &S390X.HasLDISP}, {Name: "msa", Feature: &S390X.HasMSA}, - {Name: "eimm", Feature: &S390X.HasEImm}, + {Name: "eimm", Feature: &S390X.HasEIMM}, {Name: "dfp", Feature: &S390X.HasDFP}, - {Name: "etf3eh", Feature: &S390X.HasETF3Enhanced}, + {Name: "etf3eh", Feature: &S390X.HasETF3EH}, {Name: "vx", Feature: &S390X.HasVX}, - {Name: "ve1", Feature: &S390X.HasVE1}, + {Name: "vxe", Feature: &S390X.HasVXE}, } aes := []function{aes128, aes192, aes256} facilities := stfle() - S390X.HasZArch = facilities.Has(zarch) + S390X.HasZARCH = facilities.Has(zarch) S390X.HasSTFLE = facilities.Has(stflef) - S390X.HasLDisp = facilities.Has(ldisp) - S390X.HasEImm = facilities.Has(eimm) + S390X.HasLDISP = facilities.Has(ldisp) + S390X.HasEIMM = facilities.Has(eimm) S390X.HasDFP = facilities.Has(dfp) - S390X.HasETF3Enhanced = facilities.Has(etf3eh) + S390X.HasETF3EH = facilities.Has(etf3eh) S390X.HasMSA = facilities.Has(msa) if S390X.HasMSA { @@ -153,8 +159,13 @@ func doinit() { S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256) S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512) S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist + sha3 := []function{ + sha3_224, sha3_256, sha3_384, sha3_512, + shake128, shake256, + } + S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...) } if S390X.HasVX { - S390X.HasVE1 = facilities.Has(ve1) + S390X.HasVXE = facilities.Has(vxe) } } -- GitLab From 72d24a7484063d1ca1113badb481f725382e39b8 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Thu, 28 Feb 2019 15:20:59 +0100 Subject: [PATCH 0195/1679] cmd/compile: simplify zero ext operations on wasm On wasm every integer is stored with 64 bits. We can do zero extension by simply zeroing the upper bits. Change-Id: I02c54a38b3b2b7654fff96055edab1b92d48ff32 Reviewed-on: https://go-review.googlesource.com/c/164461 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/Wasm.rules | 6 +- src/cmd/compile/internal/ssa/rewriteWasm.go | 90 +++++++-------------- 2 files changed, 33 insertions(+), 63 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index 64198839d0..41d8d1122d 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -59,9 +59,9 @@ (SignExt32to64 x) -> (I64ShrS (I64Shl x (I64Const [32])) (I64Const [32])) (SignExt16to(64|32) x) -> (I64ShrS (I64Shl x (I64Const [48])) (I64Const [48])) (SignExt8to(64|32|16) x) -> (I64ShrS (I64Shl x (I64Const [56])) (I64Const [56])) -(ZeroExt32to64 x) -> (I64ShrU (I64Shl x (I64Const [32])) (I64Const [32])) -(ZeroExt16to(64|32) x) -> (I64ShrU (I64Shl x (I64Const [48])) (I64Const [48])) -(ZeroExt8to(64|32|16) x) -> (I64ShrU (I64Shl x (I64Const [56])) (I64Const [56])) +(ZeroExt32to64 x) -> (I64And x (I64Const [0xffffffff])) +(ZeroExt16to(64|32) x) -> (I64And x (I64Const [0xffff])) +(ZeroExt8to(64|32|16) x) -> (I64And x (I64Const [0xff])) (Slicemask x) -> (I64ShrS (I64Sub (I64Const [0]) x) (I64Const [63])) diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index c17ed54b3c..e14d6251be 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -6386,19 +6386,14 @@ func rewriteValueWasm_OpZeroExt16to32_0(v *Value) bool { } // match: (ZeroExt16to32 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [48])) (I64Const [48])) + // result: (I64And x (I64Const [0xffff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 48 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xffff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 48 - v.AddArg(v2) return true } } @@ -6423,19 +6418,14 @@ func rewriteValueWasm_OpZeroExt16to64_0(v *Value) bool { } // match: (ZeroExt16to64 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [48])) (I64Const [48])) + // result: (I64And x (I64Const [0xffff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 48 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xffff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 48 - v.AddArg(v2) return true } } @@ -6460,19 +6450,14 @@ func rewriteValueWasm_OpZeroExt32to64_0(v *Value) bool { } // match: (ZeroExt32to64 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [32])) (I64Const [32])) + // result: (I64And x (I64Const [0xffffffff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 32 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xffffffff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 32 - v.AddArg(v2) return true } } @@ -6497,19 +6482,14 @@ func rewriteValueWasm_OpZeroExt8to16_0(v *Value) bool { } // match: (ZeroExt8to16 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [56])) (I64Const [56])) + // result: (I64And x (I64Const [0xff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 56 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 56 - v.AddArg(v2) return true } } @@ -6534,19 +6514,14 @@ func rewriteValueWasm_OpZeroExt8to32_0(v *Value) bool { } // match: (ZeroExt8to32 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [56])) (I64Const [56])) + // result: (I64And x (I64Const [0xff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 56 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 56 - v.AddArg(v2) return true } } @@ -6571,19 +6546,14 @@ func rewriteValueWasm_OpZeroExt8to64_0(v *Value) bool { } // match: (ZeroExt8to64 x) // cond: - // result: (I64ShrU (I64Shl x (I64Const [56])) (I64Const [56])) + // result: (I64And x (I64Const [0xff])) for { x := v.Args[0] - v.reset(OpWasmI64ShrU) - v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) - v0.AddArg(x) - v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v1.AuxInt = 56 - v0.AddArg(v1) + v.reset(OpWasmI64And) + v.AddArg(x) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 0xff v.AddArg(v0) - v2 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) - v2.AuxInt = 56 - v.AddArg(v2) return true } } -- GitLab From 444039e0546c3db1e8f73fb0a74ed21e45a09cb9 Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Thu, 28 Feb 2019 09:10:36 -0800 Subject: [PATCH 0196/1679] fmt: fix %d and other non-string verbs on errors When formatting an error with a non-string formatting verb such as %d, use the default formatting behavior rather than treating this as a bad verb. For example, this should print 42, not %!d(main.E=42): var E int func (E) Error() string { return "error" } fmt.Printf("%d", E(42)) Fixes #30472 Change-Id: I62fd309c8ee9839a69052b0ec7f1808449dcee8e Reviewed-on: https://go-review.googlesource.com/c/164557 Reviewed-by: Brad Fitzpatrick --- src/fmt/errors.go | 3 +-- src/fmt/errors_test.go | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/fmt/errors.go b/src/fmt/errors.go index 0fd3e83814..7506b6a20b 100644 --- a/src/fmt/errors.go +++ b/src/fmt/errors.go @@ -130,8 +130,7 @@ func fmtError(p *pp, verb rune, err error) (handled bool) { w = newPrinter() defer w.free() default: - w.badVerb(verb) - return true + return false } } diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go index 9e6ad74697..d2957e675b 100644 --- a/src/fmt/errors_test.go +++ b/src/fmt/errors_test.go @@ -327,7 +327,7 @@ func TestErrorFormatter(t *testing.T) { }, { err: &wrapped{"simple", nil}, fmt: "%🤪", - want: "%!🤪(*fmt_test.wrapped=&{simple })", + want: "&{%!🤪(string=simple) }", }, { err: formatError("use fmt.Formatter"), fmt: "%#v", @@ -345,6 +345,14 @@ func TestErrorFormatter(t *testing.T) { err: fmtTwice("%o %s", panicValue{}, "ok"), fmt: "%s", want: "{} ok/{} ok", + }, { + err: intError(4), + fmt: "%v", + want: "error 4", + }, { + err: intError(4), + fmt: "%d", + want: "4", }} for i, tc := range testCases { t.Run(fmt.Sprintf("%d/%s", i, tc.fmt), func(t *testing.T) { @@ -434,6 +442,15 @@ func (e detail) FormatError(p errors.Printer) (next error) { return e.next } +type intError int + +func (e intError) Error() string { return fmt.Sprint(e) } + +func (e intError) FormatError(p errors.Printer) (next error) { + p.Printf("error %d", e) + return nil +} + // formatError is an error implementing Format instead of errors.Formatter. // The implementation mimics the implementation of github.com/pkg/errors. type formatError string -- GitLab From b47f31f68ce7a00ce9432e656014d72f1e94734e Mon Sep 17 00:00:00 2001 From: cia-rana Date: Thu, 28 Feb 2019 01:04:58 +0900 Subject: [PATCH 0197/1679] image/png: delete unused statement Change-Id: I91378d5d5ecc1fc6741127a3924c631904da736b Reviewed-on: https://go-review.googlesource.com/c/164199 Run-TryBot: Rob Pike TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/image/png/writer.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/image/png/writer.go b/src/image/png/writer.go index c03335120e..2bd4fde692 100644 --- a/src/image/png/writer.go +++ b/src/image/png/writer.go @@ -288,7 +288,6 @@ func filter(cr *[nFilter][]byte, pr []byte, bpp int) int { } } if sum < best { - best = sum filter = ftAverage } -- GitLab From 7fa195c1b9650db3e91b90af6b16405e7e0ba9ce Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 27 Feb 2019 17:12:23 -0800 Subject: [PATCH 0198/1679] cmd/compile: fix false positives in isGoConst isGoConst could spuriously return true for variables that shadow a constant declaration with the same name. Because even named constants are always represented by OLITERAL nodes, the easy fix is to just ignore ONAME nodes in isGoConst. We can similarly ignore ONONAME nodes. Confirmed that k8s.io/kubernetes/test/e2e/storage builds again with this fix. Fixes #30430. Change-Id: I899400d749982d341dc248a7cd5a18277c2795ec Reviewed-on: https://go-review.googlesource.com/c/164319 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 13 ------------- test/fixedbugs/issue30430.go | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 test/fixedbugs/issue30430.go diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index de7df645e6..0e6d838eaa 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -1280,8 +1280,6 @@ func indexconst(n *Node) int64 { // // Expressions derived from nil, like string([]byte(nil)), while they // may be known at compile time, are not Go language constants. -// Only called for expressions known to evaluate to compile-time -// constants. func (n *Node) isGoConst() bool { if n.Orig != nil { n = n.Orig @@ -1359,17 +1357,6 @@ func (n *Node) isGoConst() bool { return true } - case ONAME: - l := asNode(n.Sym.Def) - if l != nil && l.Op == OLITERAL && n.Val().Ctype() != CTNIL { - return true - } - - case ONONAME: - if asNode(n.Sym.Def) != nil && asNode(n.Sym.Def).Op == OIOTA { - return true - } - case OALIGNOF, OOFFSETOF, OSIZEOF: return true } diff --git a/test/fixedbugs/issue30430.go b/test/fixedbugs/issue30430.go new file mode 100644 index 0000000000..6c27b82881 --- /dev/null +++ b/test/fixedbugs/issue30430.go @@ -0,0 +1,17 @@ +// compile + +// Copyright 2019 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. + +// Issue 30430: isGoConst returned true for non-const variables, +// resulting in ICE. + +package p + +func f() { + var s string + _ = map[string]string{s: ""} +} + +const s = "" -- GitLab From 9d40fadb1c3245a318b155ee3e19a4de139401dc Mon Sep 17 00:00:00 2001 From: lukechampine Date: Thu, 28 Feb 2019 19:03:18 +0000 Subject: [PATCH 0199/1679] fmtsort: sort interfaces deterministically Previously, the result of sorting a map[interface{}] containing multiple concrete types was non-deterministic. To ensure consistent results, sort first by type name, then by concrete value. Fixes #30398 Change-Id: I10fd4b6a74eefbc87136853af6b2e689bc76ae9d GitHub-Last-Rev: 1b07f0c275716e1b2834f74f9c67f897bae82882 GitHub-Pull-Request: golang/go#30406 Reviewed-on: https://go-review.googlesource.com/c/163745 Reviewed-by: Rob Pike Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/internal/fmtsort/sort.go | 2 +- src/internal/fmtsort/sort_test.go | 42 ++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/internal/fmtsort/sort.go b/src/internal/fmtsort/sort.go index c959cbee1f..70a305a3a1 100644 --- a/src/internal/fmtsort/sort.go +++ b/src/internal/fmtsort/sort.go @@ -167,7 +167,7 @@ func compare(aVal, bVal reflect.Value) int { if c, ok := nilCompare(aVal, bVal); ok { return c } - c := compare(reflect.ValueOf(aType), reflect.ValueOf(bType)) + c := compare(reflect.ValueOf(aVal.Elem().Type()), reflect.ValueOf(bVal.Elem().Type())) if c != 0 { return c } diff --git a/src/internal/fmtsort/sort_test.go b/src/internal/fmtsort/sort_test.go index 6b10c775b0..e060d4bf51 100644 --- a/src/internal/fmtsort/sort_test.go +++ b/src/internal/fmtsort/sort_test.go @@ -126,10 +126,6 @@ var sortTests = []sortTest{ map[[2]int]string{{7, 2}: "72", {7, 1}: "71", {3, 4}: "34"}, "[3 4]:34 [7 1]:71 [7 2]:72", }, - { - map[interface{}]string{7: "7", 4: "4", 3: "3", nil: "nil"}, - ":nil 3:3 4:4 7:7", - }, } func sprint(data interface{}) string { @@ -210,3 +206,41 @@ func TestOrder(t *testing.T) { } } } + +func TestInterface(t *testing.T) { + // A map containing multiple concrete types should be sorted by type, + // then value. However, the relative ordering of types is unspecified, + // so test this by checking the presence of sorted subgroups. + m := map[interface{}]string{ + [2]int{1, 0}: "", + [2]int{0, 1}: "", + true: "", + false: "", + 3.1: "", + 2.1: "", + 1.1: "", + math.NaN(): "", + 3: "", + 2: "", + 1: "", + "c": "", + "b": "", + "a": "", + struct{ x, y int }{1, 0}: "", + struct{ x, y int }{0, 1}: "", + } + got := sprint(m) + typeGroups := []string{ + "NaN: 1.1: 2.1: 3.1:", // float64 + "false: true:", // bool + "1: 2: 3:", // int + "a: b: c:", // string + "[0 1]: [1 0]:", // [2]int + "{0 1}: {1 0}:", // struct{ x int; y int } + } + for _, g := range typeGroups { + if !strings.Contains(got, g) { + t.Errorf("sorted map should contain %q", g) + } + } +} -- GitLab From d96b7fbf98bfac4861cda1b5c17a002ce8d62aa5 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 12 Dec 2018 11:15:37 -0800 Subject: [PATCH 0200/1679] cmd/compile: rewrite f(g()) for multi-value g() during typecheck This CL moves order.go's copyRet logic for rewriting f(g()) into t1, t2, ... = g(); f(t1, t2, ...) earlier into typecheck. This allows the rest of the compiler to stop worrying about multi-value functions appearing outside of OAS2FUNC nodes. This changes compiler behavior in a few observable ways: 1. Typechecking error messages for builtin functions now use general case error messages rather than unnecessarily differing ones. 2. Because f(g()) is rewritten before inlining, saved inline bodies now see the rewritten form too. This could be addressed, but doesn't seem worthwhile. 3. Most notably, this simplifies escape analysis and fixes a memory corruption issue in esc.go. See #29197 for details. Fixes #15992. Fixes #29197. Change-Id: I86a70668301efeec8fbd11fe2d242e359a3ad0af Reviewed-on: https://go-review.googlesource.com/c/153841 Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/esc.go | 7 - src/cmd/compile/internal/gc/fmt.go | 13 +- src/cmd/compile/internal/gc/iexport.go | 3 +- src/cmd/compile/internal/gc/init.go | 9 + src/cmd/compile/internal/gc/inl.go | 18 +- src/cmd/compile/internal/gc/order.go | 60 +----- src/cmd/compile/internal/gc/typecheck.go | 258 ++++++++--------------- test/cmplx.go | 6 +- test/copy1.go | 2 +- test/fixedbugs/issue15992.go | 38 ++++ test/fixedbugs/issue15992.out | 4 + test/fixedbugs/issue17038.go | 2 +- test/fixedbugs/issue9521.go | 4 +- 13 files changed, 157 insertions(+), 267 deletions(-) create mode 100644 test/fixedbugs/issue15992.go create mode 100644 test/fixedbugs/issue15992.out diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index bd0fb82554..c533439cc8 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -1604,13 +1604,6 @@ func (e *EscState) esccall(call *Node, parent *Node) { } argList := call.List - if argList.Len() == 1 { - arg := argList.First() - if arg.Type.IsFuncArgStruct() { // f(g()) - argList = e.nodeEscState(arg).Retval - } - } - args := argList.Slice() if indirect { diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index fc1af603a2..12f341b660 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1404,14 +1404,11 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { } mode.Fprintf(s, "sliceheader{%v,%v,%v}", n.Left, n.List.First(), n.List.Second()) - case OCOPY: - mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) - - case OCOMPLEX: - if n.List.Len() == 1 { - mode.Fprintf(s, "%#v(%v)", n.Op, n.List.First()) - } else { + case OCOMPLEX, OCOPY: + if n.Left != nil { mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) + } else { + mode.Fprintf(s, "%#v(%.v)", n.Op, n.List) } case OCONV, @@ -1540,6 +1537,8 @@ func (n *Node) nodefmt(s fmt.State, flag FmtFlag, mode fmtMode) { if flag&FmtLong != 0 && t != nil { if t.Etype == TNIL { fmt.Fprint(s, "nil") + } else if n.Op == ONAME && n.Name.AutoTemp() { + mode.Fprintf(s, "%v value", t) } else { mode.Fprintf(s, "%v (type %v)", n, t) } diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 2a34e2ea77..7fbf7cc6e2 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -1387,7 +1387,8 @@ func (w *exportWriter) localIdent(s *types.Sym, v int32) { return } - if i := strings.LastIndex(name, "."); i >= 0 { + // TODO(mdempsky): Fix autotmp hack. + if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, ".autotmp_") { Fatalf("unexpected dot in identifier: %v", name) } diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index e981f83653..bd70ad600f 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -14,6 +14,9 @@ import ( // the name, normally "pkg.init", is altered to "pkg.init.0". var renameinitgen int +// Dummy function for autotmps generated during typechecking. +var dummyInitFn = nod(ODCLFUNC, nil, nil) + func renameinit() *types.Sym { s := lookupN("init.", renameinitgen) renameinitgen++ @@ -114,6 +117,12 @@ func fninit(n []*Node) { initsym := lookup("init") fn := dclfunc(initsym, nod(OTFUNC, nil, nil)) + for _, dcl := range dummyInitFn.Func.Dcl { + dcl.Name.Curfn = fn + } + fn.Func.Dcl = append(fn.Func.Dcl, dummyInitFn.Func.Dcl...) + dummyInitFn = nil + // (3) a := nod(OIF, nil, nil) a.Left = nod(OGT, gatevar, nodintconst(1)) diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 81cad31a13..88c294173b 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -589,24 +589,13 @@ func inlnode(n *Node, maxCost int32) *Node { } inlnodelist(n.List, maxCost) - switch n.Op { - case OBLOCK: + if n.Op == OBLOCK { for _, n2 := range n.List.Slice() { if n2.Op == OINLCALL { inlconv2stmt(n2) } } - - case ORETURN, OCALLFUNC, OCALLMETH, OCALLINTER, OAPPEND, OCOMPLEX: - // if we just replaced arg in f(arg()) or return arg with an inlined call - // and arg returns multiple values, glue as list - if n.List.Len() == 1 && n.List.First().Op == OINLCALL && n.List.First().Rlist.Len() > 1 { - n.List.Set(inlconv2list(n.List.First())) - break - } - fallthrough - - default: + } else { s := n.List.Slice() for i1, n1 := range s { if n1 != nil && n1.Op == OINLCALL { @@ -1016,9 +1005,6 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node { // to pass as a slice. numvals := n.List.Len() - if numvals == 1 && n.List.First().Type.IsFuncArgStruct() { - numvals = n.List.First().Type.NumFields() - } x := as.List.Len() for as.List.Len() < numvals { diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 4848a02bb6..3e5d9eb82b 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -380,66 +380,12 @@ func (o *Order) init(n *Node) { n.Ninit.Set(nil) } -// Ismulticall reports whether the list l is f() for a multi-value function. -// Such an f() could appear as the lone argument to a multi-arg function. -func ismulticall(l Nodes) bool { - // one arg only - if l.Len() != 1 { - return false - } - n := l.First() - - // must be call - switch n.Op { - default: - return false - case OCALLFUNC, OCALLMETH, OCALLINTER: - // call must return multiple values - return n.Left.Type.NumResults() > 1 - } -} - -// copyRet emits t1, t2, ... = n, where n is a function call, -// and then returns the list t1, t2, .... -func (o *Order) copyRet(n *Node) []*Node { - if !n.Type.IsFuncArgStruct() { - Fatalf("copyret %v %d", n.Type, n.Left.Type.NumResults()) - } - - slice := n.Type.Fields().Slice() - l1 := make([]*Node, len(slice)) - l2 := make([]*Node, len(slice)) - for i, t := range slice { - tmp := temp(t.Type) - l1[i] = tmp - l2[i] = tmp - } - - as := nod(OAS2, nil, nil) - as.List.Set(l1) - as.Rlist.Set1(n) - as = typecheck(as, ctxStmt) - o.stmt(as) - - return l2 -} - -// callArgs orders the list of call arguments *l. -func (o *Order) callArgs(l *Nodes) { - if ismulticall(*l) { - // return f() where f() is multiple values. - l.Set(o.copyRet(l.First())) - } else { - o.exprList(*l) - } -} - // call orders the call expression n. // n.Op is OCALLMETH/OCALLFUNC/OCALLINTER or a builtin like OCOPY. func (o *Order) call(n *Node) { n.Left = o.expr(n.Left, nil) n.Right = o.expr(n.Right, nil) // ODDDARG temp - o.callArgs(&n.List) + o.exprList(n.List) if n.Op != OCALLFUNC { return @@ -811,7 +757,7 @@ func (o *Order) stmt(n *Node) { o.cleanTemp(t) case ORETURN: - o.callArgs(&n.List) + o.exprList(n.List) o.out = append(o.out, n) // Special: clean case temporaries in each block entry. @@ -1174,7 +1120,7 @@ func (o *Order) expr(n, lhs *Node) *Node { n.List.SetFirst(o.expr(n.List.First(), nil)) // order x n.List.Second().Left = o.expr(n.List.Second().Left, nil) // order y } else { - o.callArgs(&n.List) + o.exprList(n.List) } if lhs == nil || lhs.Op != ONAME && !samesafeexpr(lhs, n.List.First()) { diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 69ba9ef52a..d5d1ced0e1 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1318,11 +1318,7 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - if n.List.Len() == 1 && !n.IsDDD() { - n.List.SetFirst(typecheck(n.List.First(), ctxExpr|ctxMultiOK)) - } else { - typecheckslice(n.List.Slice(), ctxExpr) - } + typecheckargs(n) t := l.Type if t == nil { n.Type = nil @@ -1516,51 +1512,24 @@ func typecheck1(n *Node, top int) (res *Node) { case OCOMPLEX: ok |= ctxExpr - var r *Node - var l *Node - if n.List.Len() == 1 { - typecheckslice(n.List.Slice(), ctxMultiOK) - if n.List.First().Op != OCALLFUNC && n.List.First().Op != OCALLMETH { - yyerror("invalid operation: complex expects two arguments") - n.Type = nil - return n - } - - t := n.List.First().Left.Type - if !t.IsKind(TFUNC) { - // Bail. This error will be reported elsewhere. - return n - } - if t.NumResults() != 2 { - yyerror("invalid operation: complex expects two arguments, %v returns %d results", n.List.First(), t.NumResults()) - n.Type = nil - return n - } - - t = n.List.First().Type - l = asNode(t.Field(0).Nname) - r = asNode(t.Field(1).Nname) - } else { - if !twoarg(n) { - n.Type = nil - return n - } - n.Left = typecheck(n.Left, ctxExpr) - n.Right = typecheck(n.Right, ctxExpr) - l = n.Left - r = n.Right - if l.Type == nil || r.Type == nil { - n.Type = nil - return n - } - l, r = defaultlit2(l, r, false) - if l.Type == nil || r.Type == nil { - n.Type = nil - return n - } - n.Left = l - n.Right = r + typecheckargs(n) + if !twoarg(n) { + n.Type = nil + return n + } + l := n.Left + r := n.Right + if l.Type == nil || r.Type == nil { + n.Type = nil + return n } + l, r = defaultlit2(l, r, false) + if l.Type == nil || r.Type == nil { + n.Type = nil + return n + } + n.Left = l + n.Right = r if !types.Identical(l.Type, r.Type) { yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type) @@ -1622,6 +1591,8 @@ func typecheck1(n *Node, top int) (res *Node) { ok |= ctxStmt case ODELETE: + ok |= ctxStmt + typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to delete") @@ -1641,8 +1612,6 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - ok |= ctxStmt - typecheckslice(args.Slice(), ctxExpr) l := args.First() r := args.Second() if l.Type != nil && !l.Type.IsMap() { @@ -1655,6 +1624,7 @@ func typecheck1(n *Node, top int) (res *Node) { case OAPPEND: ok |= ctxExpr + typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to append") @@ -1662,25 +1632,12 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - if args.Len() == 1 && !n.IsDDD() { - args.SetFirst(typecheck(args.First(), ctxExpr|ctxMultiOK)) - } else { - typecheckslice(args.Slice(), ctxExpr) - } - t := args.First().Type if t == nil { n.Type = nil return n } - // Unpack multiple-return result before type-checking. - var funarg *types.Type - if t.IsFuncArgStruct() { - funarg = t - t = t.Field(0).Type - } - n.Type = t if !t.IsSlice() { if Isconst(args.First(), CTNIL) { @@ -1716,44 +1673,23 @@ func typecheck1(n *Node, top int) (res *Node) { break } - if funarg != nil { - for _, t := range funarg.FieldSlice()[1:] { - if assignop(t.Type, n.Type.Elem(), nil) == 0 { - yyerror("cannot append %v value to []%v", t.Type, n.Type.Elem()) - } - } - } else { - as := args.Slice()[1:] - for i, n := range as { - if n.Type == nil { - continue - } - as[i] = assignconv(n, t.Elem(), "append") - checkwidth(as[i].Type) // ensure width is calculated for backend + as := args.Slice()[1:] + for i, n := range as { + if n.Type == nil { + continue } + as[i] = assignconv(n, t.Elem(), "append") + checkwidth(as[i].Type) // ensure width is calculated for backend } case OCOPY: ok |= ctxStmt | ctxExpr - args := n.List - if args.Len() < 2 { - yyerror("missing arguments to copy") + typecheckargs(n) + if !twoarg(n) { n.Type = nil return n } - - if args.Len() > 2 { - yyerror("too many arguments to copy") - n.Type = nil - return n - } - - n.Left = args.First() - n.Right = args.Second() - n.List.Set(nil) n.Type = types.Types[TINT] - n.Left = typecheck(n.Left, ctxExpr) - n.Right = typecheck(n.Right, ctxExpr) if n.Left.Type == nil || n.Right.Type == nil { n.Type = nil return n @@ -2149,11 +2085,7 @@ func typecheck1(n *Node, top int) (res *Node) { case ORETURN: ok |= ctxStmt - if n.List.Len() == 1 { - typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) - } else { - typecheckslice(n.List.Slice(), ctxExpr) - } + typecheckargs(n) if Curfn == nil { yyerror("return outside function") n.Type = nil @@ -2257,6 +2189,51 @@ func typecheck1(n *Node, top int) (res *Node) { return n } +func typecheckargs(n *Node) { + if n.List.Len() != 1 || n.IsDDD() { + typecheckslice(n.List.Slice(), ctxExpr) + return + } + + typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) + t := n.List.First().Type + if t == nil || !t.IsFuncArgStruct() { + return + } + + // Rewrite f(g()) into t1, t2, ... = g(); f(t1, t2, ...). + + // Save n as n.Orig for fmt.go. + if n.Orig == n { + n.Orig = n.sepcopy() + } + + as := nod(OAS2, nil, nil) + as.Rlist.AppendNodes(&n.List) + + // If we're outside of function context, then this call will + // be executed during the generated init function. However, + // init.go hasn't yet created it. Instead, associate the + // temporary variables with dummyInitFn for now, and init.go + // will reassociate them later when it's appropriate. + static := Curfn == nil + if static { + Curfn = dummyInitFn + } + for _, f := range t.FieldSlice() { + t := temp(f.Type) + as.Ninit.Append(nod(ODCL, t, nil)) + as.List.Append(t) + n.List.Append(t) + } + if static { + Curfn = nil + } + + as = typecheck(as, ctxStmt) + n.Ninit.Append(as) +} + func checksliceindex(l *Node, r *Node, tp *types.Type) bool { t := r.Type if t == nil { @@ -2396,24 +2373,15 @@ func twoarg(n *Node) bool { if n.Left != nil { return true } - if n.List.Len() == 0 { - yyerror("missing argument to %v - %v", n.Op, n) + if n.List.Len() != 2 { + if n.List.Len() < 2 { + yyerror("not enough arguments in call to %v", n) + } else { + yyerror("too many arguments in call to %v", n) + } return false } - n.Left = n.List.First() - if n.List.Len() == 1 { - yyerror("missing argument to %v - %v", n.Op, n) - n.List.Set(nil) - return false - } - - if n.List.Len() > 2 { - yyerror("too many arguments to %v - %v", n.Op, n) - n.List.Set(nil) - return false - } - n.Right = n.List.Second() n.List.Set(nil) return true @@ -2673,8 +2641,6 @@ func hasddd(t *types.Type) bool { // typecheck assignment: type list = expression list func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, desc func() string) { var t *types.Type - var n1 int - var n2 int var i int lno := lineno @@ -2687,57 +2653,10 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, var n *Node if nl.Len() == 1 { n = nl.First() - if n.Type != nil && n.Type.IsFuncArgStruct() { - if !hasddd(tstruct) { - n1 := tstruct.NumFields() - n2 := n.Type.NumFields() - if n2 > n1 { - goto toomany - } - if n2 < n1 { - goto notenough - } - } - - lfs := tstruct.FieldSlice() - rfs := n.Type.FieldSlice() - var why string - for i, tl := range lfs { - if tl.IsDDD() { - for _, tn := range rfs[i:] { - if assignop(tn.Type, tl.Type.Elem(), &why) == 0 { - if call != nil { - yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type.Elem(), call, why) - } else { - yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type.Elem(), desc(), why) - } - } - } - return - } - - if i >= len(rfs) { - goto notenough - } - tn := rfs[i] - if assignop(tn.Type, tl.Type, &why) == 0 { - if call != nil { - yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type, call, why) - } else { - yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type, desc(), why) - } - } - } - - if len(rfs) > len(lfs) { - goto toomany - } - return - } } - n1 = tstruct.NumFields() - n2 = nl.Len() + n1 := tstruct.NumFields() + n2 := nl.Len() if !hasddd(tstruct) { if n2 > n1 { goto toomany @@ -2779,6 +2698,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, return } + // TODO(mdempsky): Make into ... call with implicit slice. for ; i < nl.Len(); i++ { n = nl.Index(i) setlineno(n) @@ -2886,14 +2806,8 @@ func (nl Nodes) retsigerr(isddd bool) string { } var typeStrings []string - if nl.Len() == 1 && nl.First().Type != nil && nl.First().Type.IsFuncArgStruct() { - for _, f := range nl.First().Type.Fields().Slice() { - typeStrings = append(typeStrings, sigrepr(f.Type)) - } - } else { - for _, n := range nl.Slice() { - typeStrings = append(typeStrings, sigrepr(n.Type)) - } + for _, n := range nl.Slice() { + typeStrings = append(typeStrings, sigrepr(n.Type)) } ddd := "" diff --git a/test/cmplx.go b/test/cmplx.go index dedf2bd8d3..d63c7ebc7e 100644 --- a/test/cmplx.go +++ b/test/cmplx.go @@ -49,10 +49,10 @@ func main() { _ = complex(f64, F64) // ERROR "complex" _ = complex(F64, f64) // ERROR "complex" - _ = complex(F1()) // ERROR "expects two arguments.*returns 1" - _ = complex(F3()) // ERROR "expects two arguments.*returns 3" + _ = complex(F1()) // ERROR "not enough arguments" + _ = complex(F3()) // ERROR "too many arguments" - _ = complex() // ERROR "missing argument" + _ = complex() // ERROR "not enough arguments" c128 = complex(f32, f32) // ERROR "cannot use" c64 = complex(f64, f64) // ERROR "cannot use" diff --git a/test/copy1.go b/test/copy1.go index 14285498f8..e1fa105584 100644 --- a/test/copy1.go +++ b/test/copy1.go @@ -14,7 +14,7 @@ func main() { si := make([]int, 8) sf := make([]float64, 8) - _ = copy() // ERROR "missing arguments" + _ = copy() // ERROR "not enough arguments" _ = copy(1, 2, 3) // ERROR "too many arguments" _ = copy(si, "hi") // ERROR "have different element types.*int.*string" diff --git a/test/fixedbugs/issue15992.go b/test/fixedbugs/issue15992.go new file mode 100644 index 0000000000..957bb89fac --- /dev/null +++ b/test/fixedbugs/issue15992.go @@ -0,0 +1,38 @@ +// run + +// Copyright 2018 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 main + +import ( + "fmt" +) + +func f(a []byte) ([]byte, []byte) { + return a, []byte("abc") +} + +func g(a []byte) ([]byte, string) { + return a, "abc" +} + +func h(m map[int]int) (map[int]int, int) { + return m, 0 +} + +func main() { + a := []byte{1, 2, 3} + n := copy(f(a)) + fmt.Println(n, a) + + b := []byte{1, 2, 3} + n = copy(f(b)) + fmt.Println(n, b) + + m := map[int]int{0: 0} + fmt.Println(len(m)) + delete(h(m)) + fmt.Println(len(m)) +} diff --git a/test/fixedbugs/issue15992.out b/test/fixedbugs/issue15992.out new file mode 100644 index 0000000000..e0011e3edb --- /dev/null +++ b/test/fixedbugs/issue15992.out @@ -0,0 +1,4 @@ +3 [97 98 99] +3 [97 98 99] +1 +0 diff --git a/test/fixedbugs/issue17038.go b/test/fixedbugs/issue17038.go index e07a4b22ce..0de31c8e7b 100644 --- a/test/fixedbugs/issue17038.go +++ b/test/fixedbugs/issue17038.go @@ -6,4 +6,4 @@ package main -const A = complex(0()) // ERROR "cannot call non-function" "const initializer .* is not a constant" +const A = complex(0()) // ERROR "cannot call non-function" "const initializer .* is not a constant" "not enough arguments" diff --git a/test/fixedbugs/issue9521.go b/test/fixedbugs/issue9521.go index ef0a5a6547..4e4a55f1e1 100644 --- a/test/fixedbugs/issue9521.go +++ b/test/fixedbugs/issue9521.go @@ -13,6 +13,6 @@ func f() (_, _ []int) { return } func g() (x []int, y float64) { return } func main() { - _ = append(f()) // ERROR "cannot append \[\]int value to \[\]int" - _ = append(g()) // ERROR "cannot append float64 value to \[\]int" + _ = append(f()) // ERROR "cannot use \[\]int value as type int in append" + _ = append(g()) // ERROR "cannot use float64 value as type int in append" } -- GitLab From aafa855fd3f50f8d5c69a9f0e1ff06c50cfdcd64 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 1 Mar 2019 01:15:24 +0100 Subject: [PATCH 0201/1679] misc/ios: evaluate symlinks before comparing GOROOT and GOPATH CL 163726 added workarounds to keep the iOS builders happy in a symlinked temporary dir. The workarounds also made the tests more realistic and improved performance. Keep them but also handle symlinks better in the exec wrapper. Change-Id: Iaa2c03a1a3fb3aa5aaf62d79d52b63d5d8f11db5 Reviewed-on: https://go-review.googlesource.com/c/164698 Reviewed-by: Bryan C. Mills --- misc/ios/go_darwin_arm_exec.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/misc/ios/go_darwin_arm_exec.go b/misc/ios/go_darwin_arm_exec.go index d1bf9fd150..3eb1757e8f 100644 --- a/misc/ios/go_darwin_arm_exec.go +++ b/misc/ios/go_darwin_arm_exec.go @@ -633,8 +633,12 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { if err != nil { return "", false, err } - if root := runtime.GOROOT(); strings.HasPrefix(cwd, root) { - subdir, err := filepath.Rel(root, cwd) + goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) + if err != nil { + return "", false, err + } + if strings.HasPrefix(cwd, goroot) { + subdir, err := filepath.Rel(goroot, cwd) if err != nil { return "", false, err } @@ -642,10 +646,14 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { } for _, p := range filepath.SplitList(build.Default.GOPATH) { - if !strings.HasPrefix(cwd, p) { + pabs, err := filepath.EvalSymlinks(p) + if err != nil { + return "", false, err + } + if !strings.HasPrefix(cwd, pabs) { continue } - subdir, err := filepath.Rel(p, cwd) + subdir, err := filepath.Rel(pabs, cwd) if err == nil { return subdir, false, nil } -- GitLab From db2b6e15667f9001bbd1ef133ce64328cd329166 Mon Sep 17 00:00:00 2001 From: Alex Tokarev Date: Fri, 23 Nov 2018 13:45:51 +0700 Subject: [PATCH 0202/1679] cmd/link: remove unused flag -D (FlagDataAddr) FlagDataAddr is a vestige from git commit 0cafb9e (2008; no Gerrit CL number). It was never used but unfortunately setting it would cause a spurious warning: warning: -D is ignored because of -R0x1000 yet if -R was unset e.g. -R=0, the linker would crash with a divide by zero runtime panic. Fixes #28921 Change-Id: Ia910399bc269337a9a860f3a26cd48fae6e62724 Reviewed-on: https://go-review.googlesource.com/c/151021 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/link/internal/amd64/obj.go | 19 +------------------ src/cmd/link/internal/arm/obj.go | 19 +------------------ src/cmd/link/internal/arm64/obj.go | 17 ----------------- src/cmd/link/internal/ld/main.go | 3 +-- src/cmd/link/internal/ld/pe.go | 6 ------ src/cmd/link/internal/ld/xcoff.go | 2 -- src/cmd/link/internal/mips/obj.go | 8 -------- src/cmd/link/internal/mips64/obj.go | 14 -------------- src/cmd/link/internal/ppc64/obj.go | 15 --------------- src/cmd/link/internal/s390x/obj.go | 8 -------- src/cmd/link/internal/x86/obj.go | 19 +------------------ 11 files changed, 4 insertions(+), 126 deletions(-) diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index 87e809166a..eeeed1ab1a 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -84,9 +83,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x200000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x200000 } @@ -99,9 +95,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x1000000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } case objabi.Hlinux, /* elf64 executable */ objabi.Hfreebsd, /* freebsd */ @@ -115,9 +108,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = (1 << 22) + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -130,19 +120,12 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagDataAddr and ld.FlagRound are set in ld.Peinit + // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit return } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index 77716bb954..ea91711df0 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -81,9 +80,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4128 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -99,9 +95,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } @@ -113,9 +106,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } @@ -125,19 +115,12 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagDataAddr and ld.FlagRound are set in ld.Peinit + // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit return } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 405d22d74f..04202012ee 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -80,9 +79,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -93,9 +89,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } @@ -105,9 +98,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -119,15 +109,8 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index b87ee8094f..e1d2da3f30 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -88,7 +88,6 @@ var ( FlagRound = flag.Int("R", -1, "set address rounding `quantum`") FlagTextAddr = flag.Int64("T", -1, "set text segment `address`") - FlagDataAddr = flag.Int64("D", -1, "set data segment `address`") flagEntrySymbol = flag.String("E", "", "set `entry` symbol name") cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`") @@ -181,7 +180,7 @@ func Main(arch *sys.Arch, theArch Arch) { } if ctxt.Debugvlog != 0 { - ctxt.Logf("HEADER = -H%d -T0x%x -D0x%x -R0x%x\n", ctxt.HeadType, uint64(*FlagTextAddr), uint64(*FlagDataAddr), uint32(*FlagRound)) + ctxt.Logf("HEADER = -H%d -T0x%x -R0x%x\n", ctxt.HeadType, uint64(*FlagTextAddr), uint32(*FlagRound)) } switch ctxt.BuildMode { diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 68251786ed..3d9cb4898d 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -975,15 +975,9 @@ func Peinit(ctxt *Link) { if *FlagTextAddr == -1 { *FlagTextAddr = PEBASE + int64(PESECTHEADR) } - if *FlagDataAddr == -1 { - *FlagDataAddr = 0 - } if *FlagRound == -1 { *FlagRound = int(PESECTALIGN) } - if *FlagDataAddr != 0 && *FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*FlagDataAddr), uint32(*FlagRound)) - } } func pewrite(ctxt *Link) { diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 188c7a5cff..4535b1ad60 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -97,7 +97,6 @@ type XcoffAoutHdr64 struct { Ox64flags uint16 // Additional Flags For 64-Bit Objects Oresv3a int16 // Reserved Oresv3 [2]int32 // Reserved - } // Section Header @@ -507,7 +506,6 @@ func Xcoffinit(ctxt *Link) { Errorf(nil, "-T not available on AIX") } *FlagTextAddr = XCOFFTEXTBASE + int64(HEADR) - *FlagDataAddr = 0 if *FlagRound != -1 { Errorf(nil, "-R not available on AIX") } diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index c5d3451c39..3c71e23497 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -82,15 +81,8 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index 83974e5b56..b01746e59a 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -81,9 +80,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 16*1024 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 16 * 1024 } @@ -94,9 +90,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } @@ -108,15 +101,8 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index fbedc728d9..ef84031739 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -85,9 +84,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4128 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -98,9 +94,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } @@ -112,19 +105,11 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } case objabi.Haix: ld.Xcoffinit(ctxt) - - } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) } } diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index 9ac7eb8217..a7e30e2d65 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -81,15 +80,8 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x10000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 6a744dc04e..dbb31263a8 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -34,7 +34,6 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/ld" - "fmt" ) func Init() (*sys.Arch, ld.Arch) { @@ -79,9 +78,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -91,9 +87,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 4096 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -108,9 +101,6 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x08048000 + int64(ld.HEADR) } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 4096 } @@ -122,19 +112,12 @@ func archinit(ctxt *ld.Link) { if *ld.FlagTextAddr == -1 { *ld.FlagTextAddr = 0x20000 } - if *ld.FlagDataAddr == -1 { - *ld.FlagDataAddr = 0 - } if *ld.FlagRound == -1 { *ld.FlagRound = 0x10000 } case objabi.Hwindows: /* PE executable */ - // ld.HEADR, ld.FlagTextAddr, ld.FlagDataAddr and ld.FlagRound are set in ld.Peinit + // ld.HEADR, ld.FlagTextAddr, ld.FlagRound are set in ld.Peinit return } - - if *ld.FlagDataAddr != 0 && *ld.FlagRound != 0 { - fmt.Printf("warning: -D0x%x is ignored because of -R0x%x\n", uint64(*ld.FlagDataAddr), uint32(*ld.FlagRound)) - } } -- GitLab From 13d24b685a6d7b05a249f85be91c390f5595f745 Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Thu, 28 Feb 2019 16:40:11 +0800 Subject: [PATCH 0203/1679] cmd/go/internal/cache: disable builds if GOCACHE is not an absolute path If GOCACHE is set but is not an absolute path, we cannot build. And GOCACHE=off also returns the error message "build cache is disabled by GOCACHE=off". Fixes #30447 Change-Id: I24f64bc886599ca0acd757acada4714aebe4d3ae Reviewed-on: https://go-review.googlesource.com/c/164200 Run-TryBot: Baokun Lee Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/cache/default.go | 7 ++++++- src/cmd/go/testdata/script/build_nocache.txt | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/cache/default.go b/src/cmd/go/internal/cache/default.go index f545c14700..7d389c3c1a 100644 --- a/src/cmd/go/internal/cache/default.go +++ b/src/cmd/go/internal/cache/default.go @@ -37,7 +37,7 @@ See golang.org to learn more about Go. // the first time Default is called. func initDefaultCache() { dir := DefaultDir() - if dir == "off" || dir == "" { + if dir == "off" { if defaultDirErr != nil { base.Fatalf("build cache is required, but could not be located: %v", defaultDirErr) } @@ -74,7 +74,12 @@ func DefaultDir() string { defaultDirOnce.Do(func() { defaultDir = os.Getenv("GOCACHE") + if filepath.IsAbs(defaultDir) || defaultDir == "off" { + return + } if defaultDir != "" { + defaultDir = "off" + defaultDirErr = fmt.Errorf("GOCACHE is not an absolute path") return } diff --git a/src/cmd/go/testdata/script/build_nocache.txt b/src/cmd/go/testdata/script/build_nocache.txt index 46e95fa89d..1059cad45c 100644 --- a/src/cmd/go/testdata/script/build_nocache.txt +++ b/src/cmd/go/testdata/script/build_nocache.txt @@ -12,6 +12,11 @@ env HOME= ! go build -o triv triv.go stderr 'build cache is required, but could not be located: GOCACHE is not defined and .*' +# If GOCACHE is set but is not an absolute path, and we cannot build. +env GOCACHE=test +! go build -o triv triv.go +stderr 'build cache is required, but could not be located: GOCACHE is not an absolute path' + # An explicit GOCACHE=off also disables builds. env GOCACHE=off ! go build -o triv triv.go -- GitLab From 38642b9fced4ed79fafe31a96b2bb432474f2e36 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Fri, 1 Mar 2019 05:49:48 +0000 Subject: [PATCH 0204/1679] Revert "cmd/compile: rewrite f(g()) for multi-value g() during typecheck" This reverts commit d96b7fbf98bfac4861cda1b5c17a002ce8d62aa5. Reason for revert: broke noopt and longtest builders. Change-Id: Ifaec64d817c4336cb255a2e9db00526b7bc5606a Reviewed-on: https://go-review.googlesource.com/c/164757 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/esc.go | 7 + src/cmd/compile/internal/gc/fmt.go | 13 +- src/cmd/compile/internal/gc/iexport.go | 3 +- src/cmd/compile/internal/gc/init.go | 9 - src/cmd/compile/internal/gc/inl.go | 18 +- src/cmd/compile/internal/gc/order.go | 60 +++++- src/cmd/compile/internal/gc/typecheck.go | 258 +++++++++++++++-------- test/cmplx.go | 6 +- test/copy1.go | 2 +- test/fixedbugs/issue15992.go | 38 ---- test/fixedbugs/issue15992.out | 4 - test/fixedbugs/issue17038.go | 2 +- test/fixedbugs/issue9521.go | 4 +- 13 files changed, 267 insertions(+), 157 deletions(-) delete mode 100644 test/fixedbugs/issue15992.go delete mode 100644 test/fixedbugs/issue15992.out diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index c533439cc8..bd0fb82554 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -1604,6 +1604,13 @@ func (e *EscState) esccall(call *Node, parent *Node) { } argList := call.List + if argList.Len() == 1 { + arg := argList.First() + if arg.Type.IsFuncArgStruct() { // f(g()) + argList = e.nodeEscState(arg).Retval + } + } + args := argList.Slice() if indirect { diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index 12f341b660..fc1af603a2 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1404,11 +1404,14 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { } mode.Fprintf(s, "sliceheader{%v,%v,%v}", n.Left, n.List.First(), n.List.Second()) - case OCOMPLEX, OCOPY: - if n.Left != nil { - mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) + case OCOPY: + mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) + + case OCOMPLEX: + if n.List.Len() == 1 { + mode.Fprintf(s, "%#v(%v)", n.Op, n.List.First()) } else { - mode.Fprintf(s, "%#v(%.v)", n.Op, n.List) + mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) } case OCONV, @@ -1537,8 +1540,6 @@ func (n *Node) nodefmt(s fmt.State, flag FmtFlag, mode fmtMode) { if flag&FmtLong != 0 && t != nil { if t.Etype == TNIL { fmt.Fprint(s, "nil") - } else if n.Op == ONAME && n.Name.AutoTemp() { - mode.Fprintf(s, "%v value", t) } else { mode.Fprintf(s, "%v (type %v)", n, t) } diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 7fbf7cc6e2..2a34e2ea77 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -1387,8 +1387,7 @@ func (w *exportWriter) localIdent(s *types.Sym, v int32) { return } - // TODO(mdempsky): Fix autotmp hack. - if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, ".autotmp_") { + if i := strings.LastIndex(name, "."); i >= 0 { Fatalf("unexpected dot in identifier: %v", name) } diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index bd70ad600f..e981f83653 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -14,9 +14,6 @@ import ( // the name, normally "pkg.init", is altered to "pkg.init.0". var renameinitgen int -// Dummy function for autotmps generated during typechecking. -var dummyInitFn = nod(ODCLFUNC, nil, nil) - func renameinit() *types.Sym { s := lookupN("init.", renameinitgen) renameinitgen++ @@ -117,12 +114,6 @@ func fninit(n []*Node) { initsym := lookup("init") fn := dclfunc(initsym, nod(OTFUNC, nil, nil)) - for _, dcl := range dummyInitFn.Func.Dcl { - dcl.Name.Curfn = fn - } - fn.Func.Dcl = append(fn.Func.Dcl, dummyInitFn.Func.Dcl...) - dummyInitFn = nil - // (3) a := nod(OIF, nil, nil) a.Left = nod(OGT, gatevar, nodintconst(1)) diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 88c294173b..81cad31a13 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -589,13 +589,24 @@ func inlnode(n *Node, maxCost int32) *Node { } inlnodelist(n.List, maxCost) - if n.Op == OBLOCK { + switch n.Op { + case OBLOCK: for _, n2 := range n.List.Slice() { if n2.Op == OINLCALL { inlconv2stmt(n2) } } - } else { + + case ORETURN, OCALLFUNC, OCALLMETH, OCALLINTER, OAPPEND, OCOMPLEX: + // if we just replaced arg in f(arg()) or return arg with an inlined call + // and arg returns multiple values, glue as list + if n.List.Len() == 1 && n.List.First().Op == OINLCALL && n.List.First().Rlist.Len() > 1 { + n.List.Set(inlconv2list(n.List.First())) + break + } + fallthrough + + default: s := n.List.Slice() for i1, n1 := range s { if n1 != nil && n1.Op == OINLCALL { @@ -1005,6 +1016,9 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node { // to pass as a slice. numvals := n.List.Len() + if numvals == 1 && n.List.First().Type.IsFuncArgStruct() { + numvals = n.List.First().Type.NumFields() + } x := as.List.Len() for as.List.Len() < numvals { diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 3e5d9eb82b..4848a02bb6 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -380,12 +380,66 @@ func (o *Order) init(n *Node) { n.Ninit.Set(nil) } +// Ismulticall reports whether the list l is f() for a multi-value function. +// Such an f() could appear as the lone argument to a multi-arg function. +func ismulticall(l Nodes) bool { + // one arg only + if l.Len() != 1 { + return false + } + n := l.First() + + // must be call + switch n.Op { + default: + return false + case OCALLFUNC, OCALLMETH, OCALLINTER: + // call must return multiple values + return n.Left.Type.NumResults() > 1 + } +} + +// copyRet emits t1, t2, ... = n, where n is a function call, +// and then returns the list t1, t2, .... +func (o *Order) copyRet(n *Node) []*Node { + if !n.Type.IsFuncArgStruct() { + Fatalf("copyret %v %d", n.Type, n.Left.Type.NumResults()) + } + + slice := n.Type.Fields().Slice() + l1 := make([]*Node, len(slice)) + l2 := make([]*Node, len(slice)) + for i, t := range slice { + tmp := temp(t.Type) + l1[i] = tmp + l2[i] = tmp + } + + as := nod(OAS2, nil, nil) + as.List.Set(l1) + as.Rlist.Set1(n) + as = typecheck(as, ctxStmt) + o.stmt(as) + + return l2 +} + +// callArgs orders the list of call arguments *l. +func (o *Order) callArgs(l *Nodes) { + if ismulticall(*l) { + // return f() where f() is multiple values. + l.Set(o.copyRet(l.First())) + } else { + o.exprList(*l) + } +} + // call orders the call expression n. // n.Op is OCALLMETH/OCALLFUNC/OCALLINTER or a builtin like OCOPY. func (o *Order) call(n *Node) { n.Left = o.expr(n.Left, nil) n.Right = o.expr(n.Right, nil) // ODDDARG temp - o.exprList(n.List) + o.callArgs(&n.List) if n.Op != OCALLFUNC { return @@ -757,7 +811,7 @@ func (o *Order) stmt(n *Node) { o.cleanTemp(t) case ORETURN: - o.exprList(n.List) + o.callArgs(&n.List) o.out = append(o.out, n) // Special: clean case temporaries in each block entry. @@ -1120,7 +1174,7 @@ func (o *Order) expr(n, lhs *Node) *Node { n.List.SetFirst(o.expr(n.List.First(), nil)) // order x n.List.Second().Left = o.expr(n.List.Second().Left, nil) // order y } else { - o.exprList(n.List) + o.callArgs(&n.List) } if lhs == nil || lhs.Op != ONAME && !samesafeexpr(lhs, n.List.First()) { diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index d5d1ced0e1..69ba9ef52a 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1318,7 +1318,11 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - typecheckargs(n) + if n.List.Len() == 1 && !n.IsDDD() { + n.List.SetFirst(typecheck(n.List.First(), ctxExpr|ctxMultiOK)) + } else { + typecheckslice(n.List.Slice(), ctxExpr) + } t := l.Type if t == nil { n.Type = nil @@ -1512,24 +1516,51 @@ func typecheck1(n *Node, top int) (res *Node) { case OCOMPLEX: ok |= ctxExpr - typecheckargs(n) - if !twoarg(n) { - n.Type = nil - return n - } - l := n.Left - r := n.Right - if l.Type == nil || r.Type == nil { - n.Type = nil - return n - } - l, r = defaultlit2(l, r, false) - if l.Type == nil || r.Type == nil { - n.Type = nil - return n + var r *Node + var l *Node + if n.List.Len() == 1 { + typecheckslice(n.List.Slice(), ctxMultiOK) + if n.List.First().Op != OCALLFUNC && n.List.First().Op != OCALLMETH { + yyerror("invalid operation: complex expects two arguments") + n.Type = nil + return n + } + + t := n.List.First().Left.Type + if !t.IsKind(TFUNC) { + // Bail. This error will be reported elsewhere. + return n + } + if t.NumResults() != 2 { + yyerror("invalid operation: complex expects two arguments, %v returns %d results", n.List.First(), t.NumResults()) + n.Type = nil + return n + } + + t = n.List.First().Type + l = asNode(t.Field(0).Nname) + r = asNode(t.Field(1).Nname) + } else { + if !twoarg(n) { + n.Type = nil + return n + } + n.Left = typecheck(n.Left, ctxExpr) + n.Right = typecheck(n.Right, ctxExpr) + l = n.Left + r = n.Right + if l.Type == nil || r.Type == nil { + n.Type = nil + return n + } + l, r = defaultlit2(l, r, false) + if l.Type == nil || r.Type == nil { + n.Type = nil + return n + } + n.Left = l + n.Right = r } - n.Left = l - n.Right = r if !types.Identical(l.Type, r.Type) { yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type) @@ -1591,8 +1622,6 @@ func typecheck1(n *Node, top int) (res *Node) { ok |= ctxStmt case ODELETE: - ok |= ctxStmt - typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to delete") @@ -1612,6 +1641,8 @@ func typecheck1(n *Node, top int) (res *Node) { return n } + ok |= ctxStmt + typecheckslice(args.Slice(), ctxExpr) l := args.First() r := args.Second() if l.Type != nil && !l.Type.IsMap() { @@ -1624,7 +1655,6 @@ func typecheck1(n *Node, top int) (res *Node) { case OAPPEND: ok |= ctxExpr - typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to append") @@ -1632,12 +1662,25 @@ func typecheck1(n *Node, top int) (res *Node) { return n } + if args.Len() == 1 && !n.IsDDD() { + args.SetFirst(typecheck(args.First(), ctxExpr|ctxMultiOK)) + } else { + typecheckslice(args.Slice(), ctxExpr) + } + t := args.First().Type if t == nil { n.Type = nil return n } + // Unpack multiple-return result before type-checking. + var funarg *types.Type + if t.IsFuncArgStruct() { + funarg = t + t = t.Field(0).Type + } + n.Type = t if !t.IsSlice() { if Isconst(args.First(), CTNIL) { @@ -1673,23 +1716,44 @@ func typecheck1(n *Node, top int) (res *Node) { break } - as := args.Slice()[1:] - for i, n := range as { - if n.Type == nil { - continue + if funarg != nil { + for _, t := range funarg.FieldSlice()[1:] { + if assignop(t.Type, n.Type.Elem(), nil) == 0 { + yyerror("cannot append %v value to []%v", t.Type, n.Type.Elem()) + } + } + } else { + as := args.Slice()[1:] + for i, n := range as { + if n.Type == nil { + continue + } + as[i] = assignconv(n, t.Elem(), "append") + checkwidth(as[i].Type) // ensure width is calculated for backend } - as[i] = assignconv(n, t.Elem(), "append") - checkwidth(as[i].Type) // ensure width is calculated for backend } case OCOPY: ok |= ctxStmt | ctxExpr - typecheckargs(n) - if !twoarg(n) { + args := n.List + if args.Len() < 2 { + yyerror("missing arguments to copy") n.Type = nil return n } + + if args.Len() > 2 { + yyerror("too many arguments to copy") + n.Type = nil + return n + } + + n.Left = args.First() + n.Right = args.Second() + n.List.Set(nil) n.Type = types.Types[TINT] + n.Left = typecheck(n.Left, ctxExpr) + n.Right = typecheck(n.Right, ctxExpr) if n.Left.Type == nil || n.Right.Type == nil { n.Type = nil return n @@ -2085,7 +2149,11 @@ func typecheck1(n *Node, top int) (res *Node) { case ORETURN: ok |= ctxStmt - typecheckargs(n) + if n.List.Len() == 1 { + typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) + } else { + typecheckslice(n.List.Slice(), ctxExpr) + } if Curfn == nil { yyerror("return outside function") n.Type = nil @@ -2189,51 +2257,6 @@ func typecheck1(n *Node, top int) (res *Node) { return n } -func typecheckargs(n *Node) { - if n.List.Len() != 1 || n.IsDDD() { - typecheckslice(n.List.Slice(), ctxExpr) - return - } - - typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) - t := n.List.First().Type - if t == nil || !t.IsFuncArgStruct() { - return - } - - // Rewrite f(g()) into t1, t2, ... = g(); f(t1, t2, ...). - - // Save n as n.Orig for fmt.go. - if n.Orig == n { - n.Orig = n.sepcopy() - } - - as := nod(OAS2, nil, nil) - as.Rlist.AppendNodes(&n.List) - - // If we're outside of function context, then this call will - // be executed during the generated init function. However, - // init.go hasn't yet created it. Instead, associate the - // temporary variables with dummyInitFn for now, and init.go - // will reassociate them later when it's appropriate. - static := Curfn == nil - if static { - Curfn = dummyInitFn - } - for _, f := range t.FieldSlice() { - t := temp(f.Type) - as.Ninit.Append(nod(ODCL, t, nil)) - as.List.Append(t) - n.List.Append(t) - } - if static { - Curfn = nil - } - - as = typecheck(as, ctxStmt) - n.Ninit.Append(as) -} - func checksliceindex(l *Node, r *Node, tp *types.Type) bool { t := r.Type if t == nil { @@ -2373,15 +2396,24 @@ func twoarg(n *Node) bool { if n.Left != nil { return true } - if n.List.Len() != 2 { - if n.List.Len() < 2 { - yyerror("not enough arguments in call to %v", n) - } else { - yyerror("too many arguments in call to %v", n) - } + if n.List.Len() == 0 { + yyerror("missing argument to %v - %v", n.Op, n) return false } + n.Left = n.List.First() + if n.List.Len() == 1 { + yyerror("missing argument to %v - %v", n.Op, n) + n.List.Set(nil) + return false + } + + if n.List.Len() > 2 { + yyerror("too many arguments to %v - %v", n.Op, n) + n.List.Set(nil) + return false + } + n.Right = n.List.Second() n.List.Set(nil) return true @@ -2641,6 +2673,8 @@ func hasddd(t *types.Type) bool { // typecheck assignment: type list = expression list func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, desc func() string) { var t *types.Type + var n1 int + var n2 int var i int lno := lineno @@ -2653,10 +2687,57 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, var n *Node if nl.Len() == 1 { n = nl.First() + if n.Type != nil && n.Type.IsFuncArgStruct() { + if !hasddd(tstruct) { + n1 := tstruct.NumFields() + n2 := n.Type.NumFields() + if n2 > n1 { + goto toomany + } + if n2 < n1 { + goto notenough + } + } + + lfs := tstruct.FieldSlice() + rfs := n.Type.FieldSlice() + var why string + for i, tl := range lfs { + if tl.IsDDD() { + for _, tn := range rfs[i:] { + if assignop(tn.Type, tl.Type.Elem(), &why) == 0 { + if call != nil { + yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type.Elem(), call, why) + } else { + yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type.Elem(), desc(), why) + } + } + } + return + } + + if i >= len(rfs) { + goto notenough + } + tn := rfs[i] + if assignop(tn.Type, tl.Type, &why) == 0 { + if call != nil { + yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type, call, why) + } else { + yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type, desc(), why) + } + } + } + + if len(rfs) > len(lfs) { + goto toomany + } + return + } } - n1 := tstruct.NumFields() - n2 := nl.Len() + n1 = tstruct.NumFields() + n2 = nl.Len() if !hasddd(tstruct) { if n2 > n1 { goto toomany @@ -2698,7 +2779,6 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, return } - // TODO(mdempsky): Make into ... call with implicit slice. for ; i < nl.Len(); i++ { n = nl.Index(i) setlineno(n) @@ -2806,8 +2886,14 @@ func (nl Nodes) retsigerr(isddd bool) string { } var typeStrings []string - for _, n := range nl.Slice() { - typeStrings = append(typeStrings, sigrepr(n.Type)) + if nl.Len() == 1 && nl.First().Type != nil && nl.First().Type.IsFuncArgStruct() { + for _, f := range nl.First().Type.Fields().Slice() { + typeStrings = append(typeStrings, sigrepr(f.Type)) + } + } else { + for _, n := range nl.Slice() { + typeStrings = append(typeStrings, sigrepr(n.Type)) + } } ddd := "" diff --git a/test/cmplx.go b/test/cmplx.go index d63c7ebc7e..dedf2bd8d3 100644 --- a/test/cmplx.go +++ b/test/cmplx.go @@ -49,10 +49,10 @@ func main() { _ = complex(f64, F64) // ERROR "complex" _ = complex(F64, f64) // ERROR "complex" - _ = complex(F1()) // ERROR "not enough arguments" - _ = complex(F3()) // ERROR "too many arguments" + _ = complex(F1()) // ERROR "expects two arguments.*returns 1" + _ = complex(F3()) // ERROR "expects two arguments.*returns 3" - _ = complex() // ERROR "not enough arguments" + _ = complex() // ERROR "missing argument" c128 = complex(f32, f32) // ERROR "cannot use" c64 = complex(f64, f64) // ERROR "cannot use" diff --git a/test/copy1.go b/test/copy1.go index e1fa105584..14285498f8 100644 --- a/test/copy1.go +++ b/test/copy1.go @@ -14,7 +14,7 @@ func main() { si := make([]int, 8) sf := make([]float64, 8) - _ = copy() // ERROR "not enough arguments" + _ = copy() // ERROR "missing arguments" _ = copy(1, 2, 3) // ERROR "too many arguments" _ = copy(si, "hi") // ERROR "have different element types.*int.*string" diff --git a/test/fixedbugs/issue15992.go b/test/fixedbugs/issue15992.go deleted file mode 100644 index 957bb89fac..0000000000 --- a/test/fixedbugs/issue15992.go +++ /dev/null @@ -1,38 +0,0 @@ -// run - -// Copyright 2018 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 main - -import ( - "fmt" -) - -func f(a []byte) ([]byte, []byte) { - return a, []byte("abc") -} - -func g(a []byte) ([]byte, string) { - return a, "abc" -} - -func h(m map[int]int) (map[int]int, int) { - return m, 0 -} - -func main() { - a := []byte{1, 2, 3} - n := copy(f(a)) - fmt.Println(n, a) - - b := []byte{1, 2, 3} - n = copy(f(b)) - fmt.Println(n, b) - - m := map[int]int{0: 0} - fmt.Println(len(m)) - delete(h(m)) - fmt.Println(len(m)) -} diff --git a/test/fixedbugs/issue15992.out b/test/fixedbugs/issue15992.out deleted file mode 100644 index e0011e3edb..0000000000 --- a/test/fixedbugs/issue15992.out +++ /dev/null @@ -1,4 +0,0 @@ -3 [97 98 99] -3 [97 98 99] -1 -0 diff --git a/test/fixedbugs/issue17038.go b/test/fixedbugs/issue17038.go index 0de31c8e7b..e07a4b22ce 100644 --- a/test/fixedbugs/issue17038.go +++ b/test/fixedbugs/issue17038.go @@ -6,4 +6,4 @@ package main -const A = complex(0()) // ERROR "cannot call non-function" "const initializer .* is not a constant" "not enough arguments" +const A = complex(0()) // ERROR "cannot call non-function" "const initializer .* is not a constant" diff --git a/test/fixedbugs/issue9521.go b/test/fixedbugs/issue9521.go index 4e4a55f1e1..ef0a5a6547 100644 --- a/test/fixedbugs/issue9521.go +++ b/test/fixedbugs/issue9521.go @@ -13,6 +13,6 @@ func f() (_, _ []int) { return } func g() (x []int, y float64) { return } func main() { - _ = append(f()) // ERROR "cannot use \[\]int value as type int in append" - _ = append(g()) // ERROR "cannot use float64 value as type int in append" + _ = append(f()) // ERROR "cannot append \[\]int value to \[\]int" + _ = append(g()) // ERROR "cannot append float64 value to \[\]int" } -- GitLab From d24c3124cab290f5f7e1c75be4c6cbe6dd05a85c Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 1 Mar 2019 01:03:20 +0100 Subject: [PATCH 0205/1679] misc/android: evaluate symlinks before comparing GOROOT and GOPATH Should fix Android builders on Darwin hosts. Change-Id: I1554849bdf2ad2440529af7f93566fa6f11d5407 Reviewed-on: https://go-review.googlesource.com/c/164697 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index fa84f00f67..845ed6e99c 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -156,8 +156,12 @@ func subdir() (pkgpath string, underGoRoot bool) { if err != nil { log.Fatal(err) } - if root := runtime.GOROOT(); strings.HasPrefix(cwd, root) { - subdir, err := filepath.Rel(root, cwd) + goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) + if err != nil { + log.Fatal(err) + } + if strings.HasPrefix(cwd, goroot) { + subdir, err := filepath.Rel(goroot, cwd) if err != nil { log.Fatal(err) } @@ -165,10 +169,14 @@ func subdir() (pkgpath string, underGoRoot bool) { } for _, p := range filepath.SplitList(build.Default.GOPATH) { - if !strings.HasPrefix(cwd, p) { + pabs, err := filepath.EvalSymlinks(p) + if err != nil { + log.Fatal(err) + } + if !strings.HasPrefix(cwd, pabs) { continue } - subdir, err := filepath.Rel(p, cwd) + subdir, err := filepath.Rel(pabs, cwd) if err == nil { return subdir, false } -- GitLab From 4832bf8bde9df6695f6f4e15a7885a1609bb579f Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 14 Feb 2019 23:42:24 +0100 Subject: [PATCH 0206/1679] debug/elf: perform stricter section header table checks in NewFile If an ELF file has no section header table (shoff = 0), shnum must be zero as well according to elf(5). So far, when only shnum was zero but shoff was non-zero (i.e. in an invalid ELF file) shstrndx wasn't properly checked and could result in an 'index out of range' later on. Fixes #10996 Change-Id: Ic248d2d77099b0036458e2a844b086a5f463c844 Reviewed-on: https://go-review.googlesource.com/c/162857 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/debug/elf/file.go | 7 +++++-- src/debug/elf/file_test.go | 11 +++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go index b2adc2834f..f92a2b0052 100644 --- a/src/debug/elf/file.go +++ b/src/debug/elf/file.go @@ -276,7 +276,6 @@ func NewFile(r io.ReaderAt) (*File, error) { var phentsize, phnum int var shoff int64 var shentsize, shnum, shstrndx int - shstrndx = -1 switch f.Class { case ELFCLASS32: hdr := new(Header32) @@ -318,7 +317,11 @@ func NewFile(r io.ReaderAt) (*File, error) { shstrndx = int(hdr.Shstrndx) } - if shnum > 0 && shoff > 0 && (shstrndx < 0 || shstrndx >= shnum) { + if shoff == 0 && shnum != 0 { + return nil, &FormatError{0, "invalid ELF shnum for shoff=0", shnum} + } + + if shnum > 0 && shstrndx >= shnum { return nil, &FormatError{0, "invalid ELF shstrndx", shstrndx} } diff --git a/src/debug/elf/file_test.go b/src/debug/elf/file_test.go index d7c1e9f800..b826a0ff05 100644 --- a/src/debug/elf/file_test.go +++ b/src/debug/elf/file_test.go @@ -810,3 +810,14 @@ func TestNoSectionOverlaps(t *testing.T) { } } } + +func TestIssue10996(t *testing.T) { + data := []byte("\u007fELF\x02\x01\x010000000000000" + + "\x010000000000000000000" + + "\x00\x00\x00\x00\x00\x00\x00\x0000000000\x00\x00\x00\x00" + + "0000") + _, err := NewFile(bytes.NewReader(data)) + if err == nil { + t.Fatalf("opening invalid ELF file unexpectedly suceeded") + } +} -- GitLab From 60abc07113e66873d468f54bb5be09fbdd20ca07 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 28 Feb 2019 08:40:55 +0100 Subject: [PATCH 0207/1679] misc/android: adb push --sync testdata (A stripped down version of) $GOROOT is uploaded to the device before running standar library tests, including many (all?) testdata directories. Use the --sync flag when pushing testdata directories to the device in case it is already present. Change-Id: If8104f9d15838c1be3623adcf831a7188303c376 Reviewed-on: https://go-review.googlesource.com/c/164338 Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 845ed6e99c..55461df31a 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -104,7 +104,7 @@ func main() { run("push", os.Args[1], deviceBin) if _, err := os.Stat("testdata"); err == nil { - run("push", "testdata", deviceCwd) + run("push", "--sync", "testdata", deviceCwd) } // Forward SIGQUIT from the go command to show backtraces from -- GitLab From e27402aee03b9232b7042ca6cba8b42b15727ef7 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 25 Feb 2019 11:32:00 +0100 Subject: [PATCH 0208/1679] cmd/dist, cmd/link: allow passing default dynamic linker/loader Add an environment variable to make.bash to allow setting the default dynamic linker/loader. This fixes alpine builds to use /lib/ld-musl-x86_64.so.1: $ readelf -l ../bin/go | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/' /lib/ld-musl-x86_64.so.1 Also re-enable the internal linker tests that were previously disabled for alpine (CL 41759, CL 41678). Fixes #18243 Updates #19938 This resurrects CL 50070 authored by Jessie Frazelle. Change-Id: I132b5282045a3d60c8568e3b002a7f075eac2d93 Reviewed-on: https://go-review.googlesource.com/c/163977 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/dist/build.go | 3 +++ src/cmd/dist/buildruntime.go | 1 + src/cmd/dist/test.go | 9 +-------- src/cmd/internal/objabi/util.go | 1 + src/cmd/link/internal/ld/elf.go | 5 +++++ src/make.bash | 12 ++++++++++++ 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 03f0f03657..87739a510d 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -48,6 +48,7 @@ var ( defaultcflags string defaultldflags string defaultpkgconfig string + defaultldso string rebuildall bool defaultclang bool @@ -207,6 +208,8 @@ func xinit() { } defaultpkgconfig = b + defaultldso = os.Getenv("GO_LDSO") + // For tools being invoked but also for os.ExpandEnv. os.Setenv("GO386", go386) os.Setenv("GOARCH", goarch) diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go index 5aadc8da67..d5462792f8 100644 --- a/src/cmd/dist/buildruntime.go +++ b/src/cmd/dist/buildruntime.go @@ -76,6 +76,7 @@ func mkzbootstrap(file string) { fmt.Fprintf(&buf, "const defaultGOOS = runtime.GOOS\n") fmt.Fprintf(&buf, "const defaultGOARCH = runtime.GOARCH\n") fmt.Fprintf(&buf, "const defaultGO_EXTLINK_ENABLED = `%s`\n", goextlinkenabled) + fmt.Fprintf(&buf, "const defaultGO_LDSO = `%s`\n", defaultldso) fmt.Fprintf(&buf, "const version = `%s`\n", findgoversion()) fmt.Fprintf(&buf, "const stackGuardMultiplierDefault = %d\n", stackGuardMultiplierDefault()) fmt.Fprintf(&buf, "const goexperiment = `%s`\n", os.Getenv("GOEXPERIMENT")) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 68401e546b..8084e474a8 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -570,10 +570,7 @@ func (t *tester) registerTests() { } // Test internal linking of PIE binaries where it is supported. - if goos == "linux" && goarch == "amd64" && !isAlpineLinux() { - // Issue 18243: We don't have a way to set the default - // dynamic linker used in internal linking mode. So - // this test is skipped on Alpine. + if goos == "linux" && goarch == "amd64" { t.tests = append(t.tests, distTest{ name: "pie_internal", heading: "internal linking of -buildmode=pie", @@ -899,10 +896,6 @@ func (t *tester) internalLink() bool { if goarch == "arm64" || goarch == "mips64" || goarch == "mips64le" || goarch == "mips" || goarch == "mipsle" { return false } - if isAlpineLinux() { - // Issue 18243. - return false - } return true } diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index da49f706f6..907f75cb4f 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -28,6 +28,7 @@ var ( GOARM = goarm() GOMIPS = gomips() GOMIPS64 = gomips64() + GO_LDSO = defaultGO_LDSO Version = version ) diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index c2a2b3a7ba..19bcbbb87a 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1840,6 +1840,11 @@ func Asmbelf(ctxt *Link, symo int64) { sh.type_ = SHT_PROGBITS sh.flags = SHF_ALLOC sh.addralign = 1 + + if interpreter == "" && objabi.GO_LDSO != "" { + interpreter = objabi.GO_LDSO + } + if interpreter == "" { switch ctxt.HeadType { case objabi.Hlinux: diff --git a/src/make.bash b/src/make.bash index 13497eb039..b0e33cf6a4 100755 --- a/src/make.bash +++ b/src/make.bash @@ -34,6 +34,9 @@ # controls the default behavior of the linker's -linkmode option. The # default value depends on the system. # +# GO_LDSO: Sets the default dynamic linker/loader (ld.so) to be used +# by the internal linker. +# # CC: Command line to run to compile C code for GOHOSTARCH. # Default is "gcc". Also supported: "clang". # @@ -126,6 +129,15 @@ if [ "$(uname -s)" = "GNU/kFreeBSD" ]; then export CGO_ENABLED=0 fi +# On Alpine Linux, use the musl dynamic linker/loader +if [ -f "/etc/alpine-release" ]; then + if type readelf >/dev/null 2>&1; then + echo "int main() { return 0; }" | ${CC:-gcc} -o ./test-alpine-ldso -x c - + export GO_LDSO=$(readelf -l ./test-alpine-ldso | grep 'interpreter:' | sed -e 's/^.*interpreter: \(.*\)[]]/\1/') + rm -f ./test-alpine-ldso + fi +fi + # Clean old generated file that will cause problems in the build. rm -f ./runtime/runtime_defs.go -- GitLab From 2edd559223f3b3fd54e354c9a9703248a935c91a Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Thu, 28 Feb 2019 20:21:32 +1100 Subject: [PATCH 0209/1679] os: make Readlink work with symlinks with target like \??\Volume{ABCD}\ windows-arm TMP directory live inside such link (see https://github.com/golang/go/issues/29746#issuecomment-456526811 for details), so symlinks like that will be common at least on windows-arm. This CL builds on current syscall.Readlink implementation. Main difference between the two is how new code handles symlink targets, like \??\Volume{ABCD}\. New implementation uses Windows CreateFile API with FILE_FLAG_OPEN_REPARSE_POINT flag to get \??\Volume{ABCD}\ file handle. And then it uses Windows GetFinalPathNameByHandle with VOLUME_NAME_DOS flag to convert that handle into standard Windows path. FILE_FLAG_OPEN_REPARSE_POINT flag ensures that symlink is not followed when CreateFile opens the file. Fixes #30463 Change-Id: I33b18227ce36144caed694169ef2e429fd995fb4 Reviewed-on: https://go-review.googlesource.com/c/164201 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- .../syscall/windows/reparse_windows.go | 24 ++++ src/os/file_posix.go | 20 --- src/os/file_unix.go | 19 +++ src/os/file_windows.go | 120 ++++++++++++++++++ src/os/os_windows_test.go | 115 +++++++++++++++++ 5 files changed, 278 insertions(+), 20 deletions(-) diff --git a/src/internal/syscall/windows/reparse_windows.go b/src/internal/syscall/windows/reparse_windows.go index 7c6ad8fb7e..610b733c4a 100644 --- a/src/internal/syscall/windows/reparse_windows.go +++ b/src/internal/syscall/windows/reparse_windows.go @@ -4,6 +4,11 @@ package windows +import ( + "syscall" + "unsafe" +) + const ( FSCTL_SET_REPARSE_POINT = 0x000900A4 IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 @@ -15,6 +20,13 @@ const ( // in https://msdn.microsoft.com/en-us/library/cc232007.aspx // and https://msdn.microsoft.com/en-us/library/cc232006.aspx. +type REPARSE_DATA_BUFFER struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + DUMMYUNIONNAME byte +} + // REPARSE_DATA_BUFFER_HEADER is a common part of REPARSE_DATA_BUFFER structure. type REPARSE_DATA_BUFFER_HEADER struct { ReparseTag uint32 @@ -46,6 +58,12 @@ type SymbolicLinkReparseBuffer struct { PathBuffer [1]uint16 } +// Path returns path stored in rb. +func (rb *SymbolicLinkReparseBuffer) Path() string { + p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0])) + return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2]) +} + type MountPointReparseBuffer struct { // The integer that contains the offset, in bytes, // of the substitute name string in the PathBuffer array, @@ -62,3 +80,9 @@ type MountPointReparseBuffer struct { PrintNameLength uint16 PathBuffer [1]uint16 } + +// Path returns path stored in rb. +func (rb *MountPointReparseBuffer) Path() string { + p := (*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0])) + return syscall.UTF16ToString(p[rb.SubstituteNameOffset/2 : (rb.SubstituteNameOffset+rb.SubstituteNameLength)/2]) +} diff --git a/src/os/file_posix.go b/src/os/file_posix.go index 1c0de5c3a1..2343079219 100644 --- a/src/os/file_posix.go +++ b/src/os/file_posix.go @@ -7,32 +7,12 @@ package os import ( - "runtime" "syscall" "time" ) func sigpipe() // implemented in package runtime -// Readlink returns the destination of the named symbolic link. -// If there is an error, it will be of type *PathError. -func Readlink(name string) (string, error) { - for len := 128; ; len *= 2 { - b := make([]byte, len) - n, e := fixCount(syscall.Readlink(fixLongPath(name), b)) - // buffer too small - if runtime.GOOS == "aix" && e == syscall.ERANGE { - continue - } - if e != nil { - return "", &PathError{"readlink", name, e} - } - if n < len { - return string(b[0:n]), nil - } - } -} - // syscallMode returns the syscall-specific mode bits from Go's portable mode bits. func syscallMode(i FileMode) (o uint32) { o |= uint32(i.Perm()) diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 2615df9d5b..857cbdb68d 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -399,3 +399,22 @@ func (f *File) readdir(n int) (fi []FileInfo, err error) { } return fi, err } + +// Readlink returns the destination of the named symbolic link. +// If there is an error, it will be of type *PathError. +func Readlink(name string) (string, error) { + for len := 128; ; len *= 2 { + b := make([]byte, len) + n, e := fixCount(syscall.Readlink(name, b)) + // buffer too small + if runtime.GOOS == "aix" && e == syscall.ERANGE { + continue + } + if e != nil { + return "", &PathError{"readlink", name, e} + } + if n < len { + return string(b[0:n]), nil + } + } +} diff --git a/src/os/file_windows.go b/src/os/file_windows.go index 85f248774c..b0206d9200 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -5,6 +5,7 @@ package os import ( + "errors" "internal/poll" "internal/syscall/windows" "runtime" @@ -396,3 +397,122 @@ func Symlink(oldname, newname string) error { } return nil } + +// openSymlink calls CreateFile Windows API with FILE_FLAG_OPEN_REPARSE_POINT +// parameter, so that Windows does not follow symlink, if path is a symlink. +// openSymlink returns opened file handle. +func openSymlink(path string) (syscall.Handle, error) { + p, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) + // Use FILE_FLAG_OPEN_REPARSE_POINT, otherwise CreateFile will follow symlink. + // See https://docs.microsoft.com/en-us/windows/desktop/FileIO/symbolic-link-effects-on-file-systems-functions#createfile-and-createfiletransacted + attrs |= syscall.FILE_FLAG_OPEN_REPARSE_POINT + h, err := syscall.CreateFile(p, 0, 0, nil, syscall.OPEN_EXISTING, attrs, 0) + if err != nil { + return 0, err + } + return h, nil +} + +// normaliseLinkPath converts absolute paths returned by +// DeviceIoControl(h, FSCTL_GET_REPARSE_POINT, ...) +// into paths acceptable by all Windows APIs. +// For example, it coverts +// \??\C:\foo\bar into C:\foo\bar +// \??\UNC\foo\bar into \\foo\bar +// \??\Volume{abc}\ into C:\ +func normaliseLinkPath(path string) (string, error) { + if len(path) < 4 || path[:4] != `\??\` { + // unexpected path, return it as is + return path, nil + } + // we have path that start with \??\ + s := path[4:] + switch { + case len(s) >= 2 && s[1] == ':': // \??\C:\foo\bar + return s, nil + case len(s) >= 4 && s[:4] == `UNC\`: // \??\UNC\foo\bar + return `\\` + s[4:], nil + } + + // handle paths, like \??\Volume{abc}\... + + err := windows.LoadGetFinalPathNameByHandle() + if err != nil { + // we must be using old version of Windows + return "", err + } + + h, err := openSymlink(path) + if err != nil { + return "", err + } + defer syscall.CloseHandle(h) + + buf := make([]uint16, 100) + for { + n, err := windows.GetFinalPathNameByHandle(h, &buf[0], uint32(len(buf)), windows.VOLUME_NAME_DOS) + if err != nil { + return "", err + } + if n < uint32(len(buf)) { + break + } + buf = make([]uint16, n) + } + s = syscall.UTF16ToString(buf) + if len(s) > 4 && s[:4] == `\\?\` { + s = s[4:] + if len(s) > 3 && s[:3] == `UNC` { + // return path like \\server\share\... + return `\` + s[3:], nil + } + return s, nil + } + return "", errors.New("GetFinalPathNameByHandle returned unexpected path: " + s) +} + +func readlink(path string) (string, error) { + h, err := openSymlink(path) + if err != nil { + return "", err + } + defer syscall.CloseHandle(h) + + rdbbuf := make([]byte, syscall.MAXIMUM_REPARSE_DATA_BUFFER_SIZE) + var bytesReturned uint32 + err = syscall.DeviceIoControl(h, syscall.FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) + if err != nil { + return "", err + } + + rdb := (*windows.REPARSE_DATA_BUFFER)(unsafe.Pointer(&rdbbuf[0])) + switch rdb.ReparseTag { + case syscall.IO_REPARSE_TAG_SYMLINK: + rb := (*windows.SymbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.DUMMYUNIONNAME)) + s := rb.Path() + if rb.Flags&windows.SYMLINK_FLAG_RELATIVE != 0 { + return s, nil + } + return normaliseLinkPath(s) + case windows.IO_REPARSE_TAG_MOUNT_POINT: + return normaliseLinkPath((*windows.MountPointReparseBuffer)(unsafe.Pointer(&rdb.DUMMYUNIONNAME)).Path()) + default: + // the path is not a symlink or junction but another type of reparse + // point + return "", syscall.ENOENT + } +} + +// Readlink returns the destination of the named symbolic link. +// If there is an error, it will be of type *PathError. +func Readlink(name string) (string, error) { + s, err := readlink(fixLongPath(name)) + if err != nil { + return "", &PathError{"readlink", name, err} + } + return s, nil +} diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go index dc9e629b01..0b42e089bd 100644 --- a/src/os/os_windows_test.go +++ b/src/os/os_windows_test.go @@ -1050,3 +1050,118 @@ func TestRootDirAsTemp(t *testing.T) { t.Fatalf("unexpected child process output %q, want %q", have, want) } } + +func testReadlink(t *testing.T, path, want string) { + got, err := os.Readlink(path) + if err != nil { + t.Error(err) + return + } + if got != want { + t.Errorf(`Readlink(%q): got %q, want %q`, path, got, want) + } +} + +func mklink(t *testing.T, link, target string) { + output, err := osexec.Command("cmd", "/c", "mklink", link, target).CombinedOutput() + if err != nil { + t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output) + } +} + +func mklinkj(t *testing.T, link, target string) { + output, err := osexec.Command("cmd", "/c", "mklink", "/J", link, target).CombinedOutput() + if err != nil { + t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output) + } +} + +func mklinkd(t *testing.T, link, target string) { + output, err := osexec.Command("cmd", "/c", "mklink", "/D", link, target).CombinedOutput() + if err != nil { + t.Fatalf("failed to run mklink %v %v: %v %q", link, target, err, output) + } +} + +func TestWindowsReadlink(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "TestWindowsReadlink") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpdir) + + // Make sure tmpdir is not a symlink, otherwise tests will fail. + tmpdir, err = filepath.EvalSymlinks(tmpdir) + if err != nil { + t.Fatal(err) + } + + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + err = os.Chdir(tmpdir) + if err != nil { + t.Fatal(err) + } + defer os.Chdir(wd) + + vol := filepath.VolumeName(tmpdir) + output, err := osexec.Command("cmd", "/c", "mountvol", vol, "/L").CombinedOutput() + if err != nil { + t.Fatalf("failed to run mountvol %v /L: %v %q", vol, err, output) + } + ntvol := strings.Trim(string(output), " \n\r") + + dir := filepath.Join(tmpdir, "dir") + err = os.MkdirAll(dir, 0777) + if err != nil { + t.Fatal(err) + } + + absdirjlink := filepath.Join(tmpdir, "absdirjlink") + mklinkj(t, absdirjlink, dir) + testReadlink(t, absdirjlink, dir) + + ntdirjlink := filepath.Join(tmpdir, "ntdirjlink") + mklinkj(t, ntdirjlink, ntvol+absdirjlink[len(filepath.VolumeName(absdirjlink)):]) + testReadlink(t, ntdirjlink, absdirjlink) + + ntdirjlinktolink := filepath.Join(tmpdir, "ntdirjlinktolink") + mklinkj(t, ntdirjlinktolink, ntvol+absdirjlink[len(filepath.VolumeName(absdirjlink)):]) + testReadlink(t, ntdirjlinktolink, absdirjlink) + + mklinkj(t, "reldirjlink", "dir") + testReadlink(t, "reldirjlink", dir) // relative directory junction resolves to absolute path + + // Make sure we have sufficient privilege to run mklink command. + testenv.MustHaveSymlink(t) + + absdirlink := filepath.Join(tmpdir, "absdirlink") + mklinkd(t, absdirlink, dir) + testReadlink(t, absdirlink, dir) + + ntdirlink := filepath.Join(tmpdir, "ntdirlink") + mklinkd(t, ntdirlink, ntvol+absdirlink[len(filepath.VolumeName(absdirlink)):]) + testReadlink(t, ntdirlink, absdirlink) + + mklinkd(t, "reldirlink", "dir") + testReadlink(t, "reldirlink", "dir") + + file := filepath.Join(tmpdir, "file") + err = ioutil.WriteFile(file, []byte(""), 0666) + if err != nil { + t.Fatal(err) + } + + filelink := filepath.Join(tmpdir, "filelink") + mklink(t, filelink, file) + testReadlink(t, filelink, file) + + linktofilelink := filepath.Join(tmpdir, "linktofilelink") + mklink(t, linktofilelink, ntvol+filelink[len(filepath.VolumeName(filelink)):]) + testReadlink(t, linktofilelink, filelink) + + mklink(t, "relfilelink", "file") + testReadlink(t, "relfilelink", "file") +} -- GitLab From 44d3bb998ca00e49d9e0138954287af206b614bf Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Thu, 28 Feb 2019 20:20:40 +1100 Subject: [PATCH 0210/1679] path/filepath: do not call GetFinalPathNameByHandle from EvalSymlinks EvalSymlinks is using GetFinalPathNameByHandle to handle symlinks with unusual targets like \??\Volume{ABCD}\. But since CL 164201, os.Readlink handles path like that too. So remove all that extra code that EvalSymlinks calls when os.Readlink fails - it is not needed any more. Now that windows EvalSymlinks implementation is similar to unix implementation, we can remove all slashAfterFilePathError related code too. So do that. This also makes TestIssue29372 pass even when TMP directory refers to symlinks with target like \??\Volume{ABCD}\. So remove TestIssue29372 code that helped it pass on windows-arm. TestIssue29372 should pass as is now. Fixes #29746 Change-Id: I568d142c89d3297bff8513069bceaa6be51fe7e4 Reviewed-on: https://go-review.googlesource.com/c/164202 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/path/filepath/path_test.go | 10 --- src/path/filepath/path_windows_test.go | 6 ++ src/path/filepath/symlink.go | 3 +- src/path/filepath/symlink_unix.go | 9 --- src/path/filepath/symlink_windows.go | 99 +------------------------- 5 files changed, 9 insertions(+), 118 deletions(-) diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go index 7a434a4292..709dccb61b 100644 --- a/src/path/filepath/path_test.go +++ b/src/path/filepath/path_test.go @@ -1377,16 +1377,6 @@ func TestIssue29372(t *testing.T) { } defer os.RemoveAll(tmpDir) - if runtime.GOOS == "windows" { - // This test is broken on windows, if temporary directory - // is a symlink. See issue 29746. - // TODO(brainman): Remove this hack once issue #29746 is fixed. - tmpDir, err = filepath.EvalSymlinks(tmpDir) - if err != nil { - t.Fatal(err) - } - } - path := filepath.Join(tmpDir, "file.txt") err = ioutil.WriteFile(path, nil, 0644) if err != nil { diff --git a/src/path/filepath/path_windows_test.go b/src/path/filepath/path_windows_test.go index d1735d39bd..f7c454bf65 100644 --- a/src/path/filepath/path_windows_test.go +++ b/src/path/filepath/path_windows_test.go @@ -529,6 +529,12 @@ func TestNTNamespaceSymlink(t *testing.T) { } defer os.RemoveAll(tmpdir) + // Make sure tmpdir is not a symlink, otherwise tests will fail. + tmpdir, err = filepath.EvalSymlinks(tmpdir) + if err != nil { + t.Fatal(err) + } + vol := filepath.VolumeName(tmpdir) output, err = exec.Command("cmd", "/c", "mountvol", vol, "/L").CombinedOutput() if err != nil { diff --git a/src/path/filepath/symlink.go b/src/path/filepath/symlink.go index 4b41039e25..a08b85a29c 100644 --- a/src/path/filepath/symlink.go +++ b/src/path/filepath/symlink.go @@ -8,6 +8,7 @@ import ( "errors" "os" "runtime" + "syscall" ) func walkSymlinks(path string) (string, error) { @@ -78,7 +79,7 @@ func walkSymlinks(path string) (string, error) { if fi.Mode()&os.ModeSymlink == 0 { if !fi.Mode().IsDir() && end < len(path) { - return "", slashAfterFilePathError + return "", syscall.ENOTDIR } continue } diff --git a/src/path/filepath/symlink_unix.go b/src/path/filepath/symlink_unix.go index b57e7f2277..d20e63a987 100644 --- a/src/path/filepath/symlink_unix.go +++ b/src/path/filepath/symlink_unix.go @@ -2,15 +2,6 @@ package filepath -import ( - "syscall" -) - -// walkSymlinks returns slashAfterFilePathError error for paths like -// //path/to/existing_file/ and /path/to/existing_file/. and /path/to/existing_file/.. - -var slashAfterFilePathError = syscall.ENOTDIR - func evalSymlinks(path string) (string, error) { return walkSymlinks(path) } diff --git a/src/path/filepath/symlink_windows.go b/src/path/filepath/symlink_windows.go index 531dc26fc0..a799488c18 100644 --- a/src/path/filepath/symlink_windows.go +++ b/src/path/filepath/symlink_windows.go @@ -5,9 +5,6 @@ package filepath import ( - "errors" - "internal/syscall/windows" - "os" "strings" "syscall" ) @@ -109,108 +106,14 @@ func toNorm(path string, normBase func(string) (string, error)) (string, error) return volume + normPath, nil } -// evalSymlinksUsingGetFinalPathNameByHandle uses Windows -// GetFinalPathNameByHandle API to retrieve the final -// path for the specified file. -func evalSymlinksUsingGetFinalPathNameByHandle(path string) (string, error) { - err := windows.LoadGetFinalPathNameByHandle() - if err != nil { - // we must be using old version of Windows - return "", err - } - - if path == "" { - return path, nil - } - - // Use Windows I/O manager to dereference the symbolic link, as per - // https://blogs.msdn.microsoft.com/oldnewthing/20100212-00/?p=14963/ - p, err := syscall.UTF16PtrFromString(path) - if err != nil { - return "", err - } - h, err := syscall.CreateFile(p, 0, 0, nil, - syscall.OPEN_EXISTING, syscall.FILE_FLAG_BACKUP_SEMANTICS, 0) - if err != nil { - return "", err - } - defer syscall.CloseHandle(h) - - buf := make([]uint16, 100) - for { - n, err := windows.GetFinalPathNameByHandle(h, &buf[0], uint32(len(buf)), windows.VOLUME_NAME_DOS) - if err != nil { - return "", err - } - if n < uint32(len(buf)) { - break - } - buf = make([]uint16, n) - } - s := syscall.UTF16ToString(buf) - if len(s) > 4 && s[:4] == `\\?\` { - s = s[4:] - if len(s) > 3 && s[:3] == `UNC` { - // return path like \\server\share\... - return `\` + s[3:], nil - } - return s, nil - } - return "", errors.New("GetFinalPathNameByHandle returned unexpected path=" + s) -} - -func samefile(path1, path2 string) bool { - fi1, err := os.Lstat(path1) - if err != nil { - return false - } - fi2, err := os.Lstat(path2) - if err != nil { - return false - } - return os.SameFile(fi1, fi2) -} - -// walkSymlinks returns slashAfterFilePathError error for paths like -// //path/to/existing_file/ and /path/to/existing_file/. and /path/to/existing_file/.. - -var slashAfterFilePathError = errors.New("attempting to walk past file path.") - func evalSymlinks(path string) (string, error) { newpath, err := walkSymlinks(path) - if err == slashAfterFilePathError { - return "", syscall.ENOTDIR - } if err != nil { - newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path) - if err2 == nil { - return toNorm(newpath2, normBase) - } return "", err } newpath, err = toNorm(newpath, normBase) if err != nil { - newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path) - if err2 == nil { - return toNorm(newpath2, normBase) - } return "", err } - if strings.ToUpper(newpath) == strings.ToUpper(path) { - // walkSymlinks did not actually walk any symlinks, - // so we don't need to try GetFinalPathNameByHandle. - return newpath, nil - } - newpath2, err2 := evalSymlinksUsingGetFinalPathNameByHandle(path) - if err2 != nil { - return newpath, nil - } - newpath2, err2 = toNorm(newpath2, normBase) - if err2 != nil { - return newpath, nil - } - if samefile(newpath, newpath2) { - return newpath, nil - } - return newpath2, nil + return newpath, nil } -- GitLab From 1f3d38fdaaff88d7ce711612fbe9b7fc7182efd7 Mon Sep 17 00:00:00 2001 From: Ketan Parmar Date: Fri, 8 Feb 2019 11:58:23 +0530 Subject: [PATCH 0211/1679] bytes: add examples for ToTitleSpecial, ToUpperSpecial and ToLowerSpecial Change-Id: If700a150492181f68e23e90ef829ff9eaf7ca7b5 Reviewed-on: https://go-review.googlesource.com/c/161737 Run-TryBot: Andrew Bonventre TryBot-Result: Gobot Gobot Reviewed-by: Andrew Bonventre --- src/bytes/example_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/bytes/example_test.go b/src/bytes/example_test.go index 6d328378fa..5ba7077c1d 100644 --- a/src/bytes/example_test.go +++ b/src/bytes/example_test.go @@ -365,6 +365,16 @@ func ExampleToTitle() { // ХЛЕБ } +func ExampleToTitleSpecial() { + str := []byte("ahoj vývojári golang") + totitle := bytes.ToTitleSpecial(unicode.AzeriCase, str) + fmt.Println("Original : " + string(str)) + fmt.Println("ToTitle : " + string(totitle)) + // Output: + // Original : ahoj vývojári golang + // ToTitle : AHOJ VÝVOJÁRİ GOLANG +} + func ExampleTrim() { fmt.Printf("[%q]", bytes.Trim([]byte(" !!! Achtung! Achtung! !!! "), "! ")) // Output: ["Achtung! Achtung"] @@ -438,11 +448,31 @@ func ExampleToUpper() { // Output: GOPHER } +func ExampleToUpperSpecial() { + str := []byte("ahoj vývojári golang") + totitle := bytes.ToUpperSpecial(unicode.AzeriCase, str) + fmt.Println("Original : " + string(str)) + fmt.Println("ToUpper : " + string(totitle)) + // Output: + // Original : ahoj vývojári golang + // ToUpper : AHOJ VÝVOJÁRİ GOLANG +} + func ExampleToLower() { fmt.Printf("%s", bytes.ToLower([]byte("Gopher"))) // Output: gopher } +func ExampleToLowerSpecial() { + str := []byte("AHOJ VÝVOJÁRİ GOLANG") + totitle := bytes.ToLowerSpecial(unicode.AzeriCase, str) + fmt.Println("Original : " + string(str)) + fmt.Println("ToLower : " + string(totitle)) + // Output: + // Original : AHOJ VÝVOJÁRİ GOLANG + // ToLower : ahoj vývojári golang +} + func ExampleReader_Len() { fmt.Println(bytes.NewReader([]byte("Hi!")).Len()) fmt.Println(bytes.NewReader([]byte("こんにちは!")).Len()) -- GitLab From 40df9cc6062492cd323f2251dd1583d200d1207e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 27 Feb 2019 20:43:29 -0500 Subject: [PATCH 0212/1679] cmd/compile: make KeepAlive work on stack object Currently, runtime.KeepAlive applied on a stack object doesn't actually keeps the stack object alive, and the heap object referenced from it could be collected. This is because the address of the stack object is rematerializeable, and we just ignored KeepAlive on rematerializeable values. This CL fixes it. Fixes #30476. Change-Id: Ic1f75ee54ed94ea79bd46a8ddcd9e81d01556d1d Reviewed-on: https://go-review.googlesource.com/c/164537 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/regalloc.go | 7 ++++++ test/fixedbugs/issue30476.go | 30 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/fixedbugs/issue30476.go diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go index 8946cf6b5c..a265479316 100644 --- a/src/cmd/compile/internal/ssa/regalloc.go +++ b/src/cmd/compile/internal/ssa/regalloc.go @@ -1220,6 +1220,13 @@ func (s *regAllocState) regalloc(f *Func) { // This forces later liveness analysis to make the // value live at this point. v.SetArg(0, s.makeSpill(a, b)) + } else if _, ok := a.Aux.(GCNode); ok && vi.rematerializeable { + // Rematerializeable value with a gc.Node. This is the address of + // a stack object (e.g. an LEAQ). Keep the object live. + // Change it to VarLive, which is what plive expects for locals. + v.Op = OpVarLive + v.SetArgs1(v.Args[1]) + v.Aux = a.Aux } else { // In-register and rematerializeable values are already live. // These are typically rematerializeable constants like nil, diff --git a/test/fixedbugs/issue30476.go b/test/fixedbugs/issue30476.go new file mode 100644 index 0000000000..a2147ec0c1 --- /dev/null +++ b/test/fixedbugs/issue30476.go @@ -0,0 +1,30 @@ +// run + +// Copyright 2019 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. + +// Issue 30476: KeepAlive didn't keep stack object alive. + +package main + +import "runtime" + +func main() { + x := new([10]int) + runtime.SetFinalizer(x, func(*[10]int) { panic("FAIL: finalizer runs") }) + p := &T{x, 0} + use(p) + runtime.GC() + runtime.GC() + runtime.GC() + runtime.KeepAlive(p) +} + +type T struct { + x *[10]int + y int +} + +//go:noinline +func use(*T) {} -- GitLab From 192b675f1778039563296cac253aa281d4b13d12 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Mon, 11 Feb 2019 06:37:49 +0000 Subject: [PATCH 0213/1679] cmd/compile: add an optimaztion rule for math/bits.ReverseBytes16 on arm64 On amd64 ReverseBytes16 is lowered to a rotate instruction. However arm64 doesn't have 16-bit rotate instruction, but has a REV16W instruction which can be used for ReverseBytes16. This CL adds a rule to turn the patterns like (x<<8) | (x>>8) (the type of x is uint16, and "|" can also be "^" or "+") to a REV16W instruction. Code: func reverseBytes16(i uint16) uint16 { return bits.ReverseBytes16(i) } Before: 0x0004 00004 (test.go:6) MOVHU "".i(FP), R0 0x0008 00008 ($GOROOT/src/math/bits/bits.go:262) UBFX $8, R0, $8, R1 0x000c 00012 ($GOROOT/src/math/bits/bits.go:262) ORR R0<<8, R1, R0 0x0010 00016 (test.go:6) MOVH R0, "".~r1+8(FP) 0x0014 00020 (test.go:6) RET (R30) After: 0x0000 00000 (test.go:6) MOVHU "".i(FP), R0 0x0004 00004 (test.go:6) REV16W R0, R0 0x0008 00008 (test.go:6) MOVH R0, "".~r1+8(FP) 0x000c 00012 (test.go:6) RET (R30) Benchmarks: name old time/op new time/op delta ReverseBytes-224 1.000000ns +- 0% 1.000000ns +- 0% ~ (all equal) ReverseBytes16-224 1.500000ns +- 0% 1.000000ns +- 0% -33.33% (p=0.000 n=9+10) ReverseBytes32-224 1.000000ns +- 0% 1.000000ns +- 0% ~ (all equal) ReverseBytes64-224 1.000000ns +- 0% 1.000000ns +- 0% ~ (all equal) Change-Id: I87cd41b2d8e549bf39c601f185d5775bd42d739c Reviewed-on: https://go-review.googlesource.com/c/157757 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 3 + src/cmd/compile/internal/ssa/rewriteARM64.go | 113 +++++++++++++++++-- test/codegen/mathbits.go | 1 + 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index fc806f75a0..3f49a9bcf9 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1786,6 +1786,9 @@ (CMPconst [64] (SUB (MOVDconst [32]) (ANDconst [31] y))))) && cc.(Op) == OpARM64LessThanU -> (RORW x y) +// ((x>>8) | (x<<8)) -> (REV16W x), the type of x is uint16, "|" can also be "^" or "+". +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) -> (REV16W x) + // Extract from reg pair (ADDshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) ( ORshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 05b8b9c697..fe815efb14 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -2304,6 +2304,8 @@ func rewriteValueARM64_OpARM64ADDconst_0(v *Value) bool { func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (ADDshiftLL (MOVDconst [c]) x [d]) // cond: // result: (ADDconst [c] (SLLconst x [d])) @@ -2387,6 +2389,35 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (ADDshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16W x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != arm64BFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARM64REV16W) + v.AddArg(x) + return true + } // match: (ADDshiftLL [c] (SRLconst x [64-c]) x2) // cond: // result: (EXTRconst [64-c] x2 x) @@ -26504,6 +26535,8 @@ func rewriteValueARM64_OpARM64ORconst_0(v *Value) bool { func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (ORshiftLL (MOVDconst [c]) x [d]) // cond: // result: (ORconst [c] (SLLconst x [d])) @@ -26610,6 +26643,35 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (ORshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16W x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != arm64BFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARM64REV16W) + v.AddArg(x) + return true + } // match: (ORshiftLL [c] (SRLconst x [64-c]) x2) // cond: // result: (EXTRconst [64-c] x2 x) @@ -26739,6 +26801,11 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { v0.AddArg(mem) return true } + return false +} +func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { + b := v.Block + _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) @@ -26795,11 +26862,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { v0.AddArg(mem) return true } - return false -} -func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { - b := v.Block - _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) // cond: x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr idx mem) @@ -27754,6 +27816,11 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { v0.AddArg(mem) return true } + return false +} +func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { + b := v.Block + _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) @@ -27810,11 +27877,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { v0.AddArg(v1) return true } - return false -} -func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { - b := v.Block - _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem)) y1:(MOVDnop x1:(MOVBUloadidx ptr0 idx0 mem))) // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (REV16W (MOVHUloadidx ptr0 idx0 mem)) @@ -31905,6 +31967,8 @@ func rewriteValueARM64_OpARM64XORconst_0(v *Value) bool { func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (XORshiftLL (MOVDconst [c]) x [d]) // cond: // result: (XORconst [c] (SLLconst x [d])) @@ -32010,6 +32074,35 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (XORshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16W x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARM64UBFX { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != arm64BFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARM64REV16W) + v.AddArg(x) + return true + } // match: (XORshiftLL [c] (SRLconst x [64-c]) x2) // cond: // result: (EXTRconst [64-c] x2 x) diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index d8b1775b0f..b2a8e3ea7a 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -170,6 +170,7 @@ func ReverseBytes32(n uint32) uint32 { func ReverseBytes16(n uint16) uint16 { // amd64:"ROLW" + // arm64:"REV16W",-"UBFX",-"ORR" return bits.ReverseBytes16(n) } -- GitLab From e881604d1c48725230c4062227e8502041dc6dfe Mon Sep 17 00:00:00 2001 From: artemkaxboy Date: Fri, 23 Nov 2018 12:52:53 +0700 Subject: [PATCH 0214/1679] cmd/internal/obj/x86: unexport movtab Change-Id: Ia071f6914b3c155a88103f930af00028986ec8c7 Reviewed-on: https://go-review.googlesource.com/c/151019 Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/x86/asm6.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index c3da29ce2c..987ded2fca 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -92,7 +92,7 @@ type Optab struct { op opBytes } -type Movtab struct { +type movtab struct { as obj.As ft uint8 f3t uint8 @@ -3619,7 +3619,7 @@ const ( movTLSReg ) -var ymovtab = []Movtab{ +var ymovtab = []movtab{ // push {APUSHL, Ycs, Ynone, Ynone, movLit, [4]uint8{0x0e, 0}}, {APUSHL, Yss, Ynone, Ynone, movLit, [4]uint8{0x16, 0}}, @@ -3733,8 +3733,8 @@ var ymovtab = []Movtab{ {AMOVW, Ytask, Ynone, Yml, movRegMem2op, [4]uint8{0x0f, 0x00, 1, 0}}, /* load full pointer - unsupported - Movtab{AMOVL, Yml, Ycol, movFullPtr, [4]uint8{0, 0, 0, 0}}, - Movtab{AMOVW, Yml, Ycol, movFullPtr, [4]uint8{Pe, 0, 0, 0}}, + {AMOVL, Yml, Ycol, movFullPtr, [4]uint8{0, 0, 0, 0}}, + {AMOVW, Yml, Ycol, movFullPtr, [4]uint8{Pe, 0, 0, 0}}, */ // double shift -- GitLab From c04e47f82159f1010d7403276b3dff5ab836fd00 Mon Sep 17 00:00:00 2001 From: Vladimir Kuzmin Date: Thu, 10 Jan 2019 00:52:39 -0800 Subject: [PATCH 0215/1679] net/http: add StatusEarlyHints (103) HTTP status code 103 (Early Hints) from RFC 8297. Fixes #29655 Change-Id: Ia1edbb561ee46f42d7fa1aae3ab9586497fcdb6c Reviewed-on: https://go-review.googlesource.com/c/157339 Run-TryBot: Agniva De Sarker Reviewed-by: Brad Fitzpatrick --- src/net/http/status.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/net/http/status.go b/src/net/http/status.go index 086f3d1a71..286315f639 100644 --- a/src/net/http/status.go +++ b/src/net/http/status.go @@ -10,6 +10,7 @@ const ( StatusContinue = 100 // RFC 7231, 6.2.1 StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2 StatusProcessing = 102 // RFC 2518, 10.1 + StatusEarlyHints = 103 // RFC 8297 StatusOK = 200 // RFC 7231, 6.3.1 StatusCreated = 201 // RFC 7231, 6.3.2 @@ -79,6 +80,7 @@ var statusText = map[int]string{ StatusContinue: "Continue", StatusSwitchingProtocols: "Switching Protocols", StatusProcessing: "Processing", + StatusEarlyHints: "Early Hints", StatusOK: "OK", StatusCreated: "Created", -- GitLab From 4f4c2a79d4f952b96d58aec2926b4c894245071b Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 27 Feb 2019 12:34:20 -0500 Subject: [PATCH 0216/1679] runtime: scan defer closure in stack scan With stack objects, when we scan the stack, it scans defers with tracebackdefers, but it seems to me that tracebackdefers doesn't include the func value itself, which could be a stack allocated closure. Scan it explicitly. Alternatively, we can change tracebackdefers to include the func value, which in turn needs to change the type of stkframe. Fixes #30453. Change-Id: I55a6e43264d6952ab2fa5c638bebb89fdc410e2b Reviewed-on: https://go-review.googlesource.com/c/164118 Reviewed-by: Keith Randall --- src/runtime/mgcmark.go | 7 +++++++ src/runtime/stack_test.go | 8 ++++++++ src/runtime/testdata/testprog/gc.go | 23 +++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index 022cc8d7d7..cc4e7d06d3 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -713,6 +713,13 @@ func scanstack(gp *g, gcw *gcWork) { // Find additional pointers that point into the stack from the heap. // Currently this includes defers and panics. See also function copystack. tracebackdefers(gp, scanframe, nil) + for d := gp._defer; d != nil; d = d.link { + // tracebackdefers above does not scan the func value, which could + // be a stack allocated closure. See issue 30453. + if d.fn != nil { + scanblock(uintptr(unsafe.Pointer(&d.fn)), sys.PtrSize, &oneptrmask[0], gcw, &state) + } + } if gp._panic != nil { state.putPtr(uintptr(unsafe.Pointer(gp._panic))) } diff --git a/src/runtime/stack_test.go b/src/runtime/stack_test.go index f52381710d..7bc63967bb 100644 --- a/src/runtime/stack_test.go +++ b/src/runtime/stack_test.go @@ -787,3 +787,11 @@ func TestTracebackAncestors(t *testing.T) { } } } + +// Test that defer closure is correctly scanned when the stack is scanned. +func TestDeferLiveness(t *testing.T) { + output := runTestProg(t, "testprog", "DeferLiveness", "GODEBUG=clobberfree=1") + if output != "" { + t.Errorf("output:\n%s\n\nwant no output", output) + } +} diff --git a/src/runtime/testdata/testprog/gc.go b/src/runtime/testdata/testprog/gc.go index fdf08be7e9..ea6604f132 100644 --- a/src/runtime/testdata/testprog/gc.go +++ b/src/runtime/testdata/testprog/gc.go @@ -18,6 +18,7 @@ func init() { register("GCFairness2", GCFairness2) register("GCSys", GCSys) register("GCPhys", GCPhys) + register("DeferLiveness", DeferLiveness) } func GCSys() { @@ -207,3 +208,25 @@ func GCPhys() { fmt.Println("OK") runtime.KeepAlive(saved) } + +// Test that defer closure is correctly scanned when the stack is scanned. +func DeferLiveness() { + var x [10]int + escape(&x) + fn := func() { + if x[0] != 42 { + panic("FAIL") + } + } + defer fn() + + x[0] = 42 + runtime.GC() + runtime.GC() + runtime.GC() +} + +//go:noinline +func escape(x interface{}) { sink2 = x; sink2 = nil } + +var sink2 interface{} -- GitLab From 4e10ce45f5ea4f1328876c0defd7d8c8150fc397 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 28 Feb 2019 16:47:17 -0500 Subject: [PATCH 0217/1679] go/build: set GO111MODULE=off explicitly in TestImportVendor* These tests check for GOPATH-mode vendoring behavior, so make sure they're in GOPATH mode. Updates #30228 Change-Id: I646f59b67cb76dacd07adc3f6ed15ed63f4e22a4 Reviewed-on: https://go-review.googlesource.com/c/164620 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/go/build/build_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index db8b12eabf..cfcb8167a1 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -350,6 +350,10 @@ func TestImportDirNotExist(t *testing.T) { func TestImportVendor(t *testing.T) { testenv.MustHaveGoBuild(t) // really must just have source + + defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE")) + os.Setenv("GO111MODULE", "off") + ctxt := Default wd, err := os.Getwd() if err != nil { @@ -368,6 +372,10 @@ func TestImportVendor(t *testing.T) { func TestImportVendorFailure(t *testing.T) { testenv.MustHaveGoBuild(t) // really must just have source + + defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE")) + os.Setenv("GO111MODULE", "off") + ctxt := Default wd, err := os.Getwd() if err != nil { @@ -387,6 +395,10 @@ func TestImportVendorFailure(t *testing.T) { func TestImportVendorParentFailure(t *testing.T) { testenv.MustHaveGoBuild(t) // really must just have source + + defer os.Setenv("GO111MODULE", os.Getenv("GO111MODULE")) + os.Setenv("GO111MODULE", "off") + ctxt := Default wd, err := os.Getwd() if err != nil { -- GitLab From 8eef74b493e48f3dfac6619b01ac7efe26c134b5 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 1 Mar 2019 08:25:35 +0100 Subject: [PATCH 0218/1679] misc/android,misc/ios: evaluate current working directory symlinks Previous CLs added symlink evaulation to GOROOT and GOPATH. Unfortunately that only fixed tests that ran outside GOROOT. To fix the standard library tests, evaluate symlinks in the current working directory as well. Change-Id: Ia406a968235ae4321a1002567520105998582d15 Reviewed-on: https://go-review.googlesource.com/c/164699 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 4 ++++ misc/ios/go_darwin_arm_exec.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 55461df31a..9a4e2afc80 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -156,6 +156,10 @@ func subdir() (pkgpath string, underGoRoot bool) { if err != nil { log.Fatal(err) } + cwd, err = filepath.EvalSymlinks(cwd) + if err != nil { + log.Fatal(err) + } goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) if err != nil { log.Fatal(err) diff --git a/misc/ios/go_darwin_arm_exec.go b/misc/ios/go_darwin_arm_exec.go index 3eb1757e8f..6a3d9def68 100644 --- a/misc/ios/go_darwin_arm_exec.go +++ b/misc/ios/go_darwin_arm_exec.go @@ -633,6 +633,10 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { if err != nil { return "", false, err } + cwd, err = filepath.EvalSymlinks(cwd) + if err != nil { + log.Fatal(err) + } goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) if err != nil { return "", false, err -- GitLab From 7c388cc89c76bc7167287fb488afcaf5a4aa12bf Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 1 Mar 2019 09:23:44 -0500 Subject: [PATCH 0219/1679] go/internal/srcimporter: set -mod=vendor before running tests Otherwise, if the working directory is inside a standard-library module, the test may try to fetch module contents from GOPROXY or upstream. Updates #26924 Updates #30228 Updates #30241 Change-Id: I4cb9a07721bd808fd094f7ed55a74cf7bce9cd6f Reviewed-on: https://go-review.googlesource.com/c/164625 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- .../internal/srcimporter/srcimporter_test.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go index b84672610c..f8e1c323b3 100644 --- a/src/go/internal/srcimporter/srcimporter_test.go +++ b/src/go/internal/srcimporter/srcimporter_test.go @@ -10,6 +10,7 @@ import ( "go/types" "internal/testenv" "io/ioutil" + "os" "path" "path/filepath" "runtime" @@ -18,6 +19,23 @@ import ( "time" ) +func TestMain(m *testing.M) { + // Add -mod=vendor to GOFLAGS to ensure that we don't fetch modules while importing std or cmd. + // + // TODO(golang.org/issue/30240): If we load go.mod files from vendor/ + // automatically, this will probably no longer be necessary. + var goflags []string + for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { + if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { + goflags = append(goflags, f) + } + } + goflags = append(goflags, "-mod=vendor") + os.Setenv("GOFLAGS", strings.Join(goflags, " ")) + + os.Exit(m.Run()) +} + const maxTime = 2 * time.Second var importer = New(&build.Default, token.NewFileSet(), make(map[string]*types.Package)) -- GitLab From 820ad17303e42665fbe9d38d79f07ed218e86302 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 20 Feb 2019 15:15:18 -0800 Subject: [PATCH 0220/1679] cmd/go: remove work directory on usage error Ensure that cmd/go consistently calls base.Exit rather than os.Exit, so that we don't incorrectly leave the work directory around on exit. Test this by modifying the testsuite to run all the tests with TMPDIR set to a temporary directory, and then check that no files are left behind in that temporary directory. Adjust a couple of tests to make this approach work. Updates #30500 Updates https://gcc.gnu.org/PR89406 Change-Id: Ib6a5fc8a288a6cf4713022baa2b8dfefad62ba34 Reviewed-on: https://go-review.googlesource.com/c/163237 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/go_test.go | 39 +++++++++++++++++++++++++++-- src/cmd/go/internal/base/base.go | 3 ++- src/cmd/go/internal/cmdflag/flag.go | 3 ++- src/cmd/go/internal/help/help.go | 6 +++-- src/cmd/go/internal/vet/vetflag.go | 12 ++++++--- src/cmd/go/internal/work/action.go | 6 +++-- src/cmd/go/internal/work/exec.go | 2 +- src/cmd/go/internal/work/gccgo.go | 3 ++- src/cmd/go/internal/work/init.go | 15 +++++++---- src/cmd/go/script_test.go | 1 + 10 files changed, 71 insertions(+), 19 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 866241bf39..dfada6c806 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -146,7 +146,18 @@ func TestMain(m *testing.M) { select {} } - dir, err := ioutil.TempDir(os.Getenv("GOTMPDIR"), "cmd-go-test-") + // Run with a temporary TMPDIR to check that the tests don't + // leave anything behind. + topTmpdir, err := ioutil.TempDir("", "cmd-go-test-") + if err != nil { + log.Fatal(err) + } + if !*testWork { + defer removeAll(topTmpdir) + } + os.Setenv(tempEnvName(), topTmpdir) + + dir, err := ioutil.TempDir(topTmpdir, "tmpdir") if err != nil { log.Fatal(err) } @@ -258,6 +269,23 @@ func TestMain(m *testing.M) { removeAll(testTmpDir) // os.Exit won't run defer } + if !*testWork { + // There shouldn't be anything left in topTmpdir. + dirf, err := os.Open(topTmpdir) + if err != nil { + log.Fatal(err) + } + names, err := dirf.Readdirnames(0) + if err != nil { + log.Fatal(err) + } + if len(names) > 0 { + log.Fatalf("unexpected files left in tmpdir: %v", names) + } + + removeAll(topTmpdir) + } + os.Exit(r) } @@ -5059,7 +5087,8 @@ func TestExecBuildX(t *testing.T) { obj := tg.path("main") tg.run("build", "-x", "-o", obj, src) sh := tg.path("test.sh") - err := ioutil.WriteFile(sh, []byte("set -e\n"+tg.getStderr()), 0666) + cmds := tg.getStderr() + err := ioutil.WriteFile(sh, []byte("set -e\n"+cmds), 0666) if err != nil { t.Fatal(err) } @@ -5090,6 +5119,12 @@ func TestExecBuildX(t *testing.T) { if string(out) != "hello" { t.Fatalf("got %q; want %q", out, "hello") } + + matches := regexp.MustCompile(`^WORK=(.*)\n`).FindStringSubmatch(cmds) + if len(matches) == 0 { + t.Fatal("no WORK directory") + } + tg.must(os.RemoveAll(matches[1])) } func TestParallelNumber(t *testing.T) { diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index e7f54c9a36..bf810ff762 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -82,7 +82,8 @@ func (c *Command) Name() string { func (c *Command) Usage() { fmt.Fprintf(os.Stderr, "usage: %s\n", c.UsageLine) fmt.Fprintf(os.Stderr, "Run 'go help %s' for details.\n", c.LongName()) - os.Exit(2) + SetExitStatus(2) + Exit() } // Runnable reports whether the command can be run; otherwise diff --git a/src/cmd/go/internal/cmdflag/flag.go b/src/cmd/go/internal/cmdflag/flag.go index 7f2c53def8..3f934328fe 100644 --- a/src/cmd/go/internal/cmdflag/flag.go +++ b/src/cmd/go/internal/cmdflag/flag.go @@ -66,7 +66,8 @@ func SyntaxError(cmd, msg string) { } else { fmt.Fprintf(os.Stderr, `run "go help %s" for more information`+"\n", cmd) } - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } // AddKnownFlags registers the flags in defns with base.AddKnownFlag. diff --git a/src/cmd/go/internal/help/help.go b/src/cmd/go/internal/help/help.go index 312a29590f..121deb70a5 100644 --- a/src/cmd/go/internal/help/help.go +++ b/src/cmd/go/internal/help/help.go @@ -63,7 +63,8 @@ Args: helpSuccess = " " + strings.Join(args[:i], " ") } fmt.Fprintf(os.Stderr, "go help %s: unknown help topic. Run '%s'.\n", strings.Join(args, " "), helpSuccess) - os.Exit(2) // failed at 'go help cmd' + base.SetExitStatus(2) // failed at 'go help cmd' + base.Exit() } if len(cmd.Commands) > 0 { @@ -167,7 +168,8 @@ func tmpl(w io.Writer, text string, data interface{}) { if ew.err != nil { // I/O error writing. Ignore write on closed pipe. if strings.Contains(ew.err.Error(), "pipe") { - os.Exit(1) + base.SetExitStatus(1) + base.Exit() } base.Fatalf("writing output: %v", ew.err) } diff --git a/src/cmd/go/internal/vet/vetflag.go b/src/cmd/go/internal/vet/vetflag.go index 37342f4163..cbe7f8ce08 100644 --- a/src/cmd/go/internal/vet/vetflag.go +++ b/src/cmd/go/internal/vet/vetflag.go @@ -76,7 +76,8 @@ func vetFlags(usage func(), args []string) (passToVet, packageNames []string) { vetcmd.Stdout = out if err := vetcmd.Run(); err != nil { fmt.Fprintf(os.Stderr, "go vet: can't execute %s -flags: %v\n", tool, err) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } var analysisFlags []struct { Name string @@ -85,7 +86,8 @@ func vetFlags(usage func(), args []string) (passToVet, packageNames []string) { } if err := json.Unmarshal(out.Bytes(), &analysisFlags); err != nil { fmt.Fprintf(os.Stderr, "go vet: can't unmarshal JSON from %s -flags: %v", tool, err) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } // Add vet's flags to vetflagDefn. @@ -134,7 +136,8 @@ func vetFlags(usage func(), args []string) (passToVet, packageNames []string) { if f == nil { fmt.Fprintf(os.Stderr, "vet: flag %q not defined\n", args[i]) fmt.Fprintf(os.Stderr, "Run \"go help vet\" for more information\n") - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } if f.Value != nil { if err := f.Value.Set(value); err != nil { @@ -182,5 +185,6 @@ func usage() { } fmt.Fprintf(os.Stderr, "Run '%s -help' for the vet tool's flags.\n", cmd) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 1f91046eb1..a47b9ba370 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -248,12 +248,14 @@ func (b *Builder) Init() { if _, ok := cfg.OSArchSupportsCgo[cfg.Goos+"/"+cfg.Goarch]; !ok && cfg.BuildContext.Compiler == "gc" { fmt.Fprintf(os.Stderr, "cmd/go: unsupported GOOS/GOARCH pair %s/%s\n", cfg.Goos, cfg.Goarch) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } for _, tag := range cfg.BuildContext.BuildTags { if strings.Contains(tag, ",") { fmt.Fprintf(os.Stderr, "cmd/go: -tags space-separated list contains comma\n") - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } } } diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 37766c2ce5..bb71faac9c 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2327,7 +2327,7 @@ func (b *Builder) gccSupportsFlag(compiler []string, flag string) bool { // version of GCC, so some systems have frozen on it. // Now we pass an empty file on stdin, which should work at least for // GCC and clang. - cmdArgs := str.StringList(compiler, flag, "-c", "-x", "c", "-") + cmdArgs := str.StringList(compiler, flag, "-c", "-x", "c", "-", "-o", os.DevNull) if cfg.BuildN || cfg.BuildX { b.Showcmd(b.WorkDir, "%s || true", joinUnambiguously(cmdArgs)) if cfg.BuildN { diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 184d2919ca..053d32dc0b 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -56,7 +56,8 @@ func checkGccgoBin() { return } fmt.Fprintf(os.Stderr, "cmd/go: gccgo: %s\n", gccgoErr) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } func (tools gccgoToolchain) gc(b *Builder, a *Action, archive string, importcfg []byte, symabis string, asmhdr bool, gofiles []string) (ofile string, output []byte, err error) { diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index 693a53e9ab..3381ab544c 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -29,7 +29,8 @@ func BuildInit() { p, err := filepath.Abs(cfg.BuildPkgdir) if err != nil { fmt.Fprintf(os.Stderr, "go %s: evaluating -pkgdir: %v\n", flag.Args()[0], err) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } cfg.BuildPkgdir = p } @@ -41,16 +42,19 @@ func instrumentInit() { } if cfg.BuildRace && cfg.BuildMSan { fmt.Fprintf(os.Stderr, "go %s: may not use -race and -msan simultaneously\n", flag.Args()[0]) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } if cfg.BuildMSan && !sys.MSanSupported(cfg.Goos, cfg.Goarch) { fmt.Fprintf(os.Stderr, "-msan is not supported on %s/%s\n", cfg.Goos, cfg.Goarch) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } if cfg.BuildRace { if !sys.RaceDetectorSupported(cfg.Goos, cfg.Goarch) { fmt.Fprintf(os.Stderr, "go %s: -race is only supported on linux/amd64, linux/ppc64le, linux/arm64, freebsd/amd64, netbsd/amd64, darwin/amd64 and windows/amd64\n", flag.Args()[0]) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } } mode := "race" @@ -61,7 +65,8 @@ func instrumentInit() { if !cfg.BuildContext.CgoEnabled { fmt.Fprintf(os.Stderr, "go %s: %s requires cgo; enable cgo by setting CGO_ENABLED=1\n", flag.Args()[0], modeFlag) - os.Exit(2) + base.SetExitStatus(2) + base.Exit() } forcedGcflags = append(forcedGcflags, modeFlag) forcedLdflags = append(forcedLdflags, modeFlag) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index c5e0064036..e204471beb 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -399,6 +399,7 @@ func (ts *testScript) cmdCc(neg bool, args []string) { var b work.Builder b.Init() ts.cmdExec(neg, append(b.GccCmd(".", ""), args...)) + os.RemoveAll(b.WorkDir) } // cd changes to a different directory. -- GitLab From ee6bec958dcb701a3cfc46d85ad51d7dc97e5c1f Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 1 Mar 2019 08:40:40 -0500 Subject: [PATCH 0221/1679] misc/cgo/test: set PWD when executing 'go test' in an alternate GOPATH That makes the test more friendly to the Android exec script, since it won't have to evaluate symlinks to find the directory. Change-Id: I06aae3224d489eed6d7fac7e462361f3bf1dd3da Reviewed-on: https://go-review.googlesource.com/c/164624 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Elias Naur --- misc/cgo/test/pkg_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/cgo/test/pkg_test.go b/misc/cgo/test/pkg_test.go index 76b0d586b2..08e075c022 100644 --- a/misc/cgo/test/pkg_test.go +++ b/misc/cgo/test/pkg_test.go @@ -59,7 +59,7 @@ func TestCrossPackageTests(t *testing.T) { cmd.Args = append(cmd.Args, "-short") } cmd.Dir = modRoot - cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) + cmd.Env = append(os.Environ(), "GOPATH="+GOPATH, "PWD="+cmd.Dir) out, err := cmd.CombinedOutput() if err == nil { t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) -- GitLab From 45861a64d311e05c43f18d58d53ae258222519c8 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 1 Mar 2019 12:08:00 +0100 Subject: [PATCH 0222/1679] androidtest.bash: delete Android now works with all.bash. Change-Id: I1087308865d2eb31f02501b5798e14d11145b185 Reviewed-on: https://go-review.googlesource.com/c/164700 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 5 ++--- src/androidtest.bash | 37 --------------------------------- 2 files changed, 2 insertions(+), 40 deletions(-) delete mode 100755 src/androidtest.bash diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 9a4e2afc80..ffdacb3db8 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -51,7 +51,6 @@ func run(args ...string) string { } const ( - // Directory structure on the target device androidtest.bash assumes. deviceGoroot = "/data/local/tmp/goroot" deviceGopath = "/data/local/tmp/gopath" ) @@ -73,8 +72,8 @@ func main() { log.Fatal(err) } - // In case we're booting a device or emulator alongside androidtest.bash - // wait for it to be ready. adb wait-for-device is not enough, we have to + // In case we're booting a device or emulator alongside all.bash, wait for + // it to be ready. adb wait-for-device is not enough, we have to // wait for sys.boot_completed. run("wait-for-device", "shell", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") diff --git a/src/androidtest.bash b/src/androidtest.bash deleted file mode 100755 index ba776d2278..0000000000 --- a/src/androidtest.bash +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2014 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. - -# For testing Android. - -set -e -ulimit -c 0 # no core files - -if [ ! -f make.bash ]; then - echo 'androidtest.bash must be run from $GOROOT/src' 1>&2 - exit 1 -fi - -if [ -z $GOOS ]; then - export GOOS=android -fi -if [ "$GOOS" != "android" ]; then - echo "androidtest.bash requires GOOS=android, got GOOS=$GOOS" 1>&2 - exit 1 -fi - -if [ -n "$GOARM" ] && [ "$GOARM" != "7" ]; then - echo "android only supports GOARM=7, got GOARM=$GOARM" 1>&2 - exit 1 -fi - -export CGO_ENABLED=1 -unset GOBIN - -export GOROOT=$(dirname $(pwd)) -# Put the exec wrapper into PATH -export PATH=$GOROOT/bin:$PATH - -# Run standard tests. -bash all.bash -- GitLab From b45f5b5e16c8176c909b441ebfa731cd6ff0cd63 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 1 Mar 2019 10:09:02 -0500 Subject: [PATCH 0223/1679] cmd/go: quote expanded shell variables used within regular expressions We mostly use shell variables for paths, and we don't want file paths like "C:\work\go1.4" to turn into regular expressions. Updates #30228 Updates #30241 Change-Id: If18b775b2f8b2821eaf197c4be4a322066af839f Reviewed-on: https://go-review.googlesource.com/c/164626 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Jay Conrod --- src/cmd/go/script_test.go | 166 +++++++++++++++++++++++++------------- 1 file changed, 111 insertions(+), 55 deletions(-) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index e204471beb..48420daa1f 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -192,7 +192,7 @@ func (ts *testScript) run() { a, err := txtar.ParseFile(ts.file) ts.check(err) for _, f := range a.Files { - name := ts.mkabs(ts.expand(f.Name)) + name := ts.mkabs(ts.expand(f.Name, false)) ts.check(os.MkdirAll(filepath.Dir(name), 0777)) ts.check(ioutil.WriteFile(name, f.Data, 0666)) } @@ -238,34 +238,24 @@ Script: } // Parse input line. Ignore blanks entirely. - args := ts.parse(line) - if len(args) == 0 { + parsed := ts.parse(line) + if parsed.name == "" { + if parsed.neg || len(parsed.conds) > 0 { + ts.fatalf("missing command") + } continue } // Echo command to log. fmt.Fprintf(&ts.log, "> %s\n", line) - // Command prefix [cond] means only run this command if cond is satisfied. - for strings.HasPrefix(args[0], "[") && strings.HasSuffix(args[0], "]") { - cond := args[0] - cond = cond[1 : len(cond)-1] - cond = strings.TrimSpace(cond) - args = args[1:] - if len(args) == 0 { - ts.fatalf("missing command after condition") - } - want := true - if strings.HasPrefix(cond, "!") { - want = false - cond = strings.TrimSpace(cond[1:]) - } + for _, cond := range parsed.conds { // Known conds are: $GOOS, $GOARCH, runtime.Compiler, and 'short' (for testing.Short). // // NOTE: If you make changes here, update testdata/script/README too! // ok := false - switch cond { + switch cond.tag { case runtime.GOOS, runtime.GOARCH, runtime.Compiler: ok = true case "short": @@ -285,8 +275,8 @@ Script: case "symlink": ok = testenv.HasSymlink() default: - if strings.HasPrefix(cond, "exec:") { - prog := cond[len("exec:"):] + if strings.HasPrefix(cond.tag, "exec:") { + prog := cond.tag[len("exec:"):] ok = execCache.Do(prog, func() interface{} { if runtime.GOOS == "plan9" && prog == "git" { // The Git command is usually not the real Git on Plan 9. @@ -298,33 +288,22 @@ Script: }).(bool) break } - if !imports.KnownArch[cond] && !imports.KnownOS[cond] && cond != "gc" && cond != "gccgo" { - ts.fatalf("unknown condition %q", cond) + if !imports.KnownArch[cond.tag] && !imports.KnownOS[cond.tag] && cond.tag != "gc" && cond.tag != "gccgo" { + ts.fatalf("unknown condition %q", cond.tag) } } - if ok != want { + if ok != cond.want { // Don't run rest of line. continue Script } } - // Command prefix ! means negate the expectations about this command: - // go command should fail, match should not be found, etc. - neg := false - if args[0] == "!" { - neg = true - args = args[1:] - if len(args) == 0 { - ts.fatalf("! on line by itself") - } - } - // Run command. - cmd := scriptCmds[args[0]] + cmd := scriptCmds[parsed.name] if cmd == nil { - ts.fatalf("unknown command %q", args[0]) + ts.fatalf("unknown command %q", parsed.name) } - cmd(ts, neg, args[1:]) + cmd(ts, parsed.neg, parsed.args) // Command can ask script to stop early. if ts.stopped { @@ -376,6 +355,14 @@ var scriptCmds = map[string]func(*testScript, bool, []string){ "wait": (*testScript).cmdWait, } +// When expanding shell variables for these commands, we apply regexp quoting to +// expanded strings within the first argument. +var regexpCmd = map[string]bool{ + "grep": true, + "stderr": true, + "stdout": true, +} + // addcrlf adds CRLF line endings to the named files. func (ts *testScript) cmdAddcrlf(neg bool, args []string) { if len(args) == 0 { @@ -486,8 +473,8 @@ func (ts *testScript) doCmdCmp(args []string, env bool) { text2 = string(data) if env { - text1 = ts.expand(text1) - text2 = ts.expand(text2) + text1 = ts.expand(text1, false) + text2 = ts.expand(text2, false) } if text1 == text2 { @@ -765,9 +752,11 @@ func scriptMatch(ts *testScript, neg bool, args []string, text, name string) { ts.fatalf("usage: %s [-count=N] 'pattern'%s", name, extraUsage) } - pattern := args[0] - re, err := regexp.Compile(`(?m)` + pattern) - ts.check(err) + pattern := `(?m)` + args[0] + re, err := regexp.Compile(pattern) + if err != nil { + ts.fatalf("regexp.Compile(%q): %v", pattern, err) + } isGrep := name == "grep" if isGrep { @@ -956,8 +945,20 @@ func interruptProcess(p *os.Process) { } // expand applies environment variable expansion to the string s. -func (ts *testScript) expand(s string) string { - return os.Expand(s, func(key string) string { return ts.envMap[key] }) +func (ts *testScript) expand(s string, inRegexp bool) string { + return os.Expand(s, func(key string) string { + e := ts.envMap[key] + if inRegexp { + // Replace workdir with $WORK, since we have done the same substitution in + // the text we're about to compare against. + e = strings.ReplaceAll(e, ts.workdir, "$WORK") + + // Quote to literal strings: we want paths like C:\work\go1.4 to remain + // paths rather than regular expressions. + e = regexp.QuoteMeta(e) + } + return e + }) } // fatalf aborts the test with the given failure message. @@ -975,27 +976,82 @@ func (ts *testScript) mkabs(file string) string { return filepath.Join(ts.cd, file) } +// A condition guards execution of a command. +type condition struct { + want bool + tag string +} + +// A command is a complete command parsed from a script. +type command struct { + neg bool // if true, expect the command to fail + conds []condition // all must be satisfied + name string // the name of the command; must be non-empty + args []string // shell-expanded arguments following name +} + // parse parses a single line as a list of space-separated arguments // subject to environment variable expansion (but not resplitting). // Single quotes around text disable splitting and expansion. // To embed a single quote, double it: 'Don''t communicate by sharing memory.' -func (ts *testScript) parse(line string) []string { +func (ts *testScript) parse(line string) command { ts.line = line var ( - args []string - arg string // text of current arg so far (need to add line[start:i]) - start = -1 // if >= 0, position where current arg text chunk starts - quoted = false // currently processing quoted text + cmd command + arg string // text of current arg so far (need to add line[start:i]) + start = -1 // if >= 0, position where current arg text chunk starts + quoted = false // currently processing quoted text + isRegexp = false // currently processing unquoted regular expression ) + + flushArg := func() { + defer func() { + arg = "" + start = -1 + }() + + if cmd.name != "" { + cmd.args = append(cmd.args, arg) + isRegexp = false // Commands take only one regexp argument, so no subsequent args are regexps. + return + } + + // Command prefix ! means negate the expectations about this command: + // go command should fail, match should not be found, etc. + if arg == "!" { + if cmd.neg { + ts.fatalf("duplicated '!' token") + } + cmd.neg = true + return + } + + // Command prefix [cond] means only run this command if cond is satisfied. + if strings.HasPrefix(arg, "[") && strings.HasSuffix(arg, "]") { + want := true + arg = strings.TrimSpace(arg[1 : len(arg)-1]) + if strings.HasPrefix(arg, "!") { + want = false + arg = strings.TrimSpace(arg[1:]) + } + if arg == "" { + ts.fatalf("empty condition") + } + cmd.conds = append(cmd.conds, condition{want: want, tag: arg}) + return + } + + cmd.name = arg + isRegexp = regexpCmd[cmd.name] + } + for i := 0; ; i++ { if !quoted && (i >= len(line) || line[i] == ' ' || line[i] == '\t' || line[i] == '\r' || line[i] == '#') { // Found arg-separating space. if start >= 0 { - arg += ts.expand(line[start:i]) - args = append(args, arg) - start = -1 - arg = "" + arg += ts.expand(line[start:i], isRegexp) + flushArg() } if i >= len(line) || line[i] == '#' { break @@ -1009,7 +1065,7 @@ func (ts *testScript) parse(line string) []string { if !quoted { // starting a quoted chunk if start >= 0 { - arg += ts.expand(line[start:i]) + arg += ts.expand(line[start:i], isRegexp) } start = i + 1 quoted = true @@ -1033,7 +1089,7 @@ func (ts *testScript) parse(line string) []string { start = i } } - return args + return cmd } // diff returns a formatted diff of the two texts, -- GitLab From 1cd6d8b974517e6c0506d3959a9ad08f98e89902 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 13:08:30 -0800 Subject: [PATCH 0224/1679] cmd/vet: let TestMain run deferred functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split TestMain into two functions so that we can defer cleanups. Updates #30500 Change-Id: I1fa7957be0779c079ec4d221a8321b45ddb973e2 Reviewed-on: https://go-review.googlesource.com/c/164860 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí --- src/cmd/vet/vet_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index e9b8c69d53..5d8139d977 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -28,16 +28,19 @@ var binary string // We implement TestMain so remove the test binary when all is done. func TestMain(m *testing.M) { + os.Exit(testMain(m)) +} + +func testMain(m *testing.M) int { dir, err := ioutil.TempDir("", "vet_test") if err != nil { fmt.Fprintln(os.Stderr, err) - os.Exit(1) + return 1 } defer os.RemoveAll(dir) binary = filepath.Join(dir, "testvet.exe") - result := m.Run() - os.Exit(result) + return m.Run() } var ( -- GitLab From 4aff88ded24c575bed9c1c0d1fc149eab405111a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 13:01:46 -0800 Subject: [PATCH 0225/1679] misc/cgo/testcshared: delete temporary directory in test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deferred os.RemoveAll was accidentally committed as commented out in the original https://golang.org/cl/87158. Updates #30500 Change-Id: Idc5195816d7978253760dbfd78fde6d22c456296 Reviewed-on: https://go-review.googlesource.com/c/164858 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí --- misc/cgo/testcshared/cshared_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index 833650e5e6..8c4c3c7e57 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -521,7 +521,7 @@ func TestCachedInstall(t *testing.T) { if err != nil { t.Fatal(err) } - // defer os.RemoveAll(tmpdir) + defer os.RemoveAll(tmpdir) copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "go.mod"), "go.mod") copyFile(t, filepath.Join(tmpdir, "src", "testcshared", "libgo", "libgo.go"), filepath.Join("libgo", "libgo.go")) -- GitLab From 7dc3d9f85f424445a49577aad33e576992c1f67d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 13:05:33 -0800 Subject: [PATCH 0226/1679] misc/cgo/testplugin: let TestMain run deferred functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split TestMain into two functions so that we can defer cleanups. Updates #30500 Change-Id: I4a5c7ddb8218a8bd056c8733c3cb9feb895e77a0 Reviewed-on: https://go-review.googlesource.com/c/164859 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí --- misc/cgo/testplugin/plugin_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/misc/cgo/testplugin/plugin_test.go b/misc/cgo/testplugin/plugin_test.go index 2c110494d0..54e3db36c4 100644 --- a/misc/cgo/testplugin/plugin_test.go +++ b/misc/cgo/testplugin/plugin_test.go @@ -23,7 +23,10 @@ var gcflags string = os.Getenv("GO_GCFLAGS") func TestMain(m *testing.M) { log.SetFlags(log.Lshortfile) + os.Exit(testMain(m)) +} +func testMain(m *testing.M) int { // Copy testdata into GOPATH/src/testarchive, along with a go.mod file // declaring the same path. @@ -77,7 +80,7 @@ func TestMain(m *testing.M) { goCmd(nil, "build", "-buildmode=plugin", "-o=unnamed2.so", "./unnamed2/main.go") goCmd(nil, "build", "-o", "host.exe", "./host") - os.Exit(m.Run()) + return m.Run() } func goCmd(t *testing.T, op string, args ...string) { -- GitLab From 412f659280607b06de9b25569cf668ea8f23dd57 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 07:12:24 -0800 Subject: [PATCH 0227/1679] net: return poll.SendFile error from sendFile We were accidentally ignoring any error returned by poll.SendFile. Noticed by reading the code. It could only change behavior if the sendfile system call both wrote some bytes and returned an error. Change-Id: I0693d6ec0a30f5a86b78d38793899ca29fb9e156 Reviewed-on: https://go-review.googlesource.com/c/164760 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/sendfile_linux.go | 4 ++-- src/net/sendfile_unix_alt.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/net/sendfile_linux.go b/src/net/sendfile_linux.go index 297e625d24..e5150aa5e8 100644 --- a/src/net/sendfile_linux.go +++ b/src/net/sendfile_linux.go @@ -42,8 +42,8 @@ func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) { written, werr = poll.SendFile(&c.pfd, int(fd), remain) return true }) - if werr == nil { - werr = err + if err == nil { + err = werr } if lr != nil { diff --git a/src/net/sendfile_unix_alt.go b/src/net/sendfile_unix_alt.go index 43df3bfd15..8cededce58 100644 --- a/src/net/sendfile_unix_alt.go +++ b/src/net/sendfile_unix_alt.go @@ -68,8 +68,8 @@ func sendFile(c *netFD, r io.Reader) (written int64, err error, handled bool) { written, werr = poll.SendFile(&c.pfd, int(fd), pos, remain) return true }) - if werr == nil { - werr = err + if err == nil { + err = werr } if lr != nil { -- GitLab From 619cc9fa4152399dde89d2a4700ee737cae444e0 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 13:25:44 -0800 Subject: [PATCH 0228/1679] go/internal/gccgoimporter: remove temporary directories in test Updates #30500 Change-Id: I42716c2bfd7f087303bc63d7518e32b52fd0d762 Reviewed-on: https://go-review.googlesource.com/c/164862 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/go/internal/gccgoimporter/importer_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/go/internal/gccgoimporter/importer_test.go b/src/go/internal/gccgoimporter/importer_test.go index 7a21c5f2f4..58fa8c8cf5 100644 --- a/src/go/internal/gccgoimporter/importer_test.go +++ b/src/go/internal/gccgoimporter/importer_test.go @@ -143,17 +143,21 @@ func TestObjImporter(t *testing.T) { } t.Logf("gccgo version %d.%d", major, minor) - tmpdir, err := ioutil.TempDir("", "") + tmpdir, err := ioutil.TempDir("", "TestObjImporter") if err != nil { t.Fatal(err) } + defer os.RemoveAll(tmpdir) + initmap := make(map[*types.Package]InitData) imp := GetImporter([]string{tmpdir}, initmap) - artmpdir, err := ioutil.TempDir("", "") + artmpdir, err := ioutil.TempDir("", "TestObjImporter") if err != nil { t.Fatal(err) } + defer os.RemoveAll(artmpdir) + arinitmap := make(map[*types.Package]InitData) arimp := GetImporter([]string{artmpdir}, arinitmap) @@ -198,8 +202,4 @@ func TestObjImporter(t *testing.T) { t.Fatal(err) } } - - if err = os.Remove(tmpdir); err != nil { - t.Fatal(err) - } } -- GitLab From 249f5d2af4e14a087c462596f142064529609c3b Mon Sep 17 00:00:00 2001 From: Vladimir Varankin Date: Tue, 26 Feb 2019 23:21:59 +0000 Subject: [PATCH 0229/1679] cmd/go: refer to testflag help in go test -help output The change makes it easier for a user to get to the page where she can check supported test flags, by adding 'go test testflag' reference to the 'go test -help' output. Fix #30365 Change-Id: I5b3db7853021ef68d096dcb467d7957d7e1bf623 GitHub-Last-Rev: ce3dec59fcae0cca232372f01cdda98773c290c0 GitHub-Pull-Request: golang/go#30420 Reviewed-on: https://go-review.googlesource.com/c/163858 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/base/base.go | 2 +- src/cmd/go/internal/test/test.go | 8 +++++++- src/cmd/go/testdata/script/help.txt | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/internal/base/base.go b/src/cmd/go/internal/base/base.go index bf810ff762..028f9b6aef 100644 --- a/src/cmd/go/internal/base/base.go +++ b/src/cmd/go/internal/base/base.go @@ -30,7 +30,7 @@ type Command struct { Run func(cmd *Command, args []string) // UsageLine is the one-line usage message. - // The first word in the line is taken to be the command name. + // The words between "go" and the first flag or argument in the line are taken to be the command name. UsageLine string // Short is the short description shown in the 'go help' output. diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 8dfb3df22d..fe90af3be5 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -514,10 +514,16 @@ var testVetFlags = []string{ // "-unusedresult", } +func testCmdUsage() { + fmt.Fprintf(os.Stderr, "usage: %s\n", CmdTest.UsageLine) + fmt.Fprintf(os.Stderr, "Run 'go help %s' and 'go help %s' for details.\n", CmdTest.LongName(), HelpTestflag.LongName()) + os.Exit(2) +} + func runTest(cmd *base.Command, args []string) { modload.LoadTests = true - pkgArgs, testArgs = testFlags(cmd.Usage, args) + pkgArgs, testArgs = testFlags(testCmdUsage, args) work.FindExecCmd() // initialize cached result diff --git a/src/cmd/go/testdata/script/help.txt b/src/cmd/go/testdata/script/help.txt index e6cbc82928..9752ede2e3 100644 --- a/src/cmd/go/testdata/script/help.txt +++ b/src/cmd/go/testdata/script/help.txt @@ -42,7 +42,7 @@ stderr 'Run ''go tool vet -help'' for the vet tool''s flags' # lines. ! go test -h stderr 'usage: go test' -stderr 'Run ''go help test'' for details' +stderr 'Run ''go help test'' and ''go help testflag'' for details.' # go help get shows usage for get go help get -- GitLab From c05f2b4869e6ac581e85638f9dc3dba16d9ba2f4 Mon Sep 17 00:00:00 2001 From: Samuel Kelemen Date: Fri, 1 Mar 2019 22:42:58 +0000 Subject: [PATCH 0230/1679] net/http: update net/http package to replace a broken link with an archive link replaces broken link with a web.archive.org link. Change-Id: I438536a6ac51d837c30be5df7d3d0caadf65bb95 GitHub-Last-Rev: 0601e4d6b2440f7fb97a6700b74651dc16645c50 GitHub-Pull-Request: golang/go#30523 Reviewed-on: https://go-review.googlesource.com/c/164761 Reviewed-by: Bryan C. Mills --- src/net/http/cgi/child.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/http/cgi/child.go b/src/net/http/cgi/child.go index 10325c2eb5..cb140f8f2f 100644 --- a/src/net/http/cgi/child.go +++ b/src/net/http/cgi/child.go @@ -102,7 +102,7 @@ func RequestFromMap(params map[string]string) (*http.Request, error) { } // There's apparently a de-facto standard for this. - // https://docstore.mik.ua/orelly/linux/cgi/ch03_02.htm#ch03-35636 + // https://web.archive.org/web/20170105004655/http://docstore.mik.ua/orelly/linux/cgi/ch03_02.htm#ch03-35636 if s := params["HTTPS"]; s == "on" || s == "ON" || s == "1" { r.TLS = &tls.ConnectionState{HandshakeComplete: true} } -- GitLab From aef1a7e19251dee75c30c5fc0828ac5cb9722035 Mon Sep 17 00:00:00 2001 From: Marat Khabibullin Date: Wed, 13 Feb 2019 19:20:50 +0000 Subject: [PATCH 0231/1679] html/template: prevent test from failing with nil pointer dereference The variable err could have nil value when we call err.Error(), because after we check it for nil above we continue the test (t.Errorf doesn't stop the test execution). Updates #30208 Change-Id: I6f7a8609f2453f622a1fa94a50c99d2e04d5fbcd GitHub-Last-Rev: 3a5d9b1e9e202327af17cc1b93bfa69f6701af84 GitHub-Pull-Request: golang/go#30215 Reviewed-on: https://go-review.googlesource.com/c/162477 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/html/template/escape_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/html/template/escape_test.go b/src/html/template/escape_test.go index e6c12a8a25..e72a9ba11f 100644 --- a/src/html/template/escape_test.go +++ b/src/html/template/escape_test.go @@ -1869,8 +1869,7 @@ func TestErrorOnUndefined(t *testing.T) { err := tmpl.Execute(nil, nil) if err == nil { t.Error("expected error") - } - if !strings.Contains(err.Error(), "incomplete") { + } else if !strings.Contains(err.Error(), "incomplete") { t.Errorf("expected error about incomplete template; got %s", err) } } -- GitLab From 3415b3556b47c69982d47fb3f4735ec05fecdda1 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Mon, 4 Feb 2019 12:46:08 +0000 Subject: [PATCH 0232/1679] encoding/base32: remove ineffectual assignment in test Change-Id: I8aaa3d1d2797f3ace34bc09f5123538f6a77efce GitHub-Last-Rev: 2758c462041ff5e444651b7927d53e809d2efe4d GitHub-Pull-Request: golang/go#30009 Reviewed-on: https://go-review.googlesource.com/c/160433 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/encoding/base32/base32_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoding/base32/base32_test.go b/src/encoding/base32/base32_test.go index b74054ba40..cbe635161a 100644 --- a/src/encoding/base32/base32_test.go +++ b/src/encoding/base32/base32_test.go @@ -119,7 +119,7 @@ func TestDecoder(t *testing.T) { testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded)) testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded) if err != io.EOF { - count, err = decoder.Read(dbuf) + _, err = decoder.Read(dbuf) } testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF) } -- GitLab From 44dc661453a59587a81265c17f7c469b60e9059a Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 12:55:43 -0800 Subject: [PATCH 0233/1679] cmd/link: reliably remove temporary directory in testDwarf We were using t.Parallel in a subtest, which meant that the main test would not wait for the subtest, so the main test would delete the temporary directory before the subtest used it. The subtest worked because "go build -o /tmp/x/y/p.exe p" creates /tmp/x/y as needed. Updates #30500 Change-Id: I5904ecac748d15ded4cb609f049fa548b8916a0e Reviewed-on: https://go-review.googlesource.com/c/164857 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/dwarf_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 880b2ced6d..9c3bc624ef 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -37,17 +37,17 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) t.Fatalf("cmd/link is stale - run go install cmd/link") } - tmpDir, err := ioutil.TempDir("", "go-link-TestDWARF") - if err != nil { - t.Fatal("TempDir failed: ", err) - } - defer os.RemoveAll(tmpDir) - for _, prog := range []string{"testprog", "testprogcgo"} { prog := prog t.Run(prog, func(t *testing.T) { t.Parallel() + tmpDir, err := ioutil.TempDir("", "go-link-TestDWARF") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + exe := filepath.Join(tmpDir, prog+".exe") dir := "../../runtime/testdata/" + prog cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe) -- GitLab From c422c97b72164d7188c7b2b677ab10dd9a34ae34 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:36:22 +0000 Subject: [PATCH 0234/1679] go/printer: add missing error checks in tests Change-Id: I696da3b07c8b0a2802d3d1291f475e241e4ad90a GitHub-Last-Rev: df571ce03bd07a1e12203774f4c120f5017590f6 GitHub-Pull-Request: golang/go#30011 Reviewed-on: https://go-review.googlesource.com/c/160435 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/go/printer/printer_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/go/printer/printer_test.go b/src/go/printer/printer_test.go index 91eca585c0..a240bf4846 100644 --- a/src/go/printer/printer_test.go +++ b/src/go/printer/printer_test.go @@ -153,6 +153,10 @@ func runcheck(t *testing.T, source, golden string, mode checkMode) { // (This is very difficult to achieve in general and for now // it is only checked for files explicitly marked as such.) res, err = format(gld, mode) + if err != nil { + t.Error(err) + return + } if err := diff(golden, fmt.Sprintf("format(%s)", golden), gld, res); err != nil { t.Errorf("golden is not idempotent: %s", err) } @@ -744,6 +748,9 @@ func TestParenthesizedDecl(t *testing.T) { const src = "package p; var ( a float64; b int )" fset := token.NewFileSet() f, err := parser.ParseFile(fset, "", src, 0) + if err != nil { + t.Fatal(err) + } // print the original package var buf bytes.Buffer -- GitLab From 44dec304add9b07c404197009f4c7c3e831ebc22 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Mon, 4 Feb 2019 12:46:00 +0000 Subject: [PATCH 0235/1679] encoding/base64: remove ineffectual assignment in test Change-Id: I4a0d5b2f76138895567939920fa5d83cbdec17d2 GitHub-Last-Rev: 061d9d1d5655a6a9d8371f08d2f77a0ed7a495cc GitHub-Pull-Request: golang/go#30008 Reviewed-on: https://go-review.googlesource.com/c/160432 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/encoding/base64/base64_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/encoding/base64/base64_test.go b/src/encoding/base64/base64_test.go index f7f312ca39..beb63d7c5a 100644 --- a/src/encoding/base64/base64_test.go +++ b/src/encoding/base64/base64_test.go @@ -175,7 +175,7 @@ func TestDecoder(t *testing.T) { testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded)) testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded) if err != io.EOF { - count, err = decoder.Read(dbuf) + _, err = decoder.Read(dbuf) } testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF) } -- GitLab From b136b17a8c105cd600bd52df507d461784593dee Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:34:34 +0000 Subject: [PATCH 0236/1679] cmd/go/internal/modconv: remove unused variables Change-Id: I429db8dca219fb931f7b05ce7a7324e8c4ba935b GitHub-Last-Rev: 2257a5bf23e7d79f54bedba2c2bed8c59bb6114c GitHub-Pull-Request: golang/go#29999 Reviewed-on: https://go-review.googlesource.com/c/160423 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modconv/glide.go | 3 +-- src/cmd/go/internal/modconv/glock.go | 3 +-- src/cmd/go/internal/modconv/tsv.go | 3 +-- src/cmd/go/internal/modconv/vconf.go | 3 +-- src/cmd/go/internal/modconv/vyml.go | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/internal/modconv/glide.go b/src/cmd/go/internal/modconv/glide.go index 3bc675fcc0..18ab57814d 100644 --- a/src/cmd/go/internal/modconv/glide.go +++ b/src/cmd/go/internal/modconv/glide.go @@ -15,8 +15,7 @@ func ParseGlideLock(file string, data []byte) (*modfile.File, error) { mf := new(modfile.File) imports := false name := "" - for lineno, line := range strings.Split(string(data), "\n") { - lineno++ + for _, line := range strings.Split(string(data), "\n") { if line == "" { continue } diff --git a/src/cmd/go/internal/modconv/glock.go b/src/cmd/go/internal/modconv/glock.go index 1b786a939c..164a8e70d9 100644 --- a/src/cmd/go/internal/modconv/glock.go +++ b/src/cmd/go/internal/modconv/glock.go @@ -13,8 +13,7 @@ import ( func ParseGLOCKFILE(file string, data []byte) (*modfile.File, error) { mf := new(modfile.File) - for lineno, line := range strings.Split(string(data), "\n") { - lineno++ + for _, line := range strings.Split(string(data), "\n") { f := strings.Fields(line) if len(f) >= 2 && f[0] != "cmd" { mf.Require = append(mf.Require, &modfile.Require{Mod: module.Version{Path: f[0], Version: f[1]}}) diff --git a/src/cmd/go/internal/modconv/tsv.go b/src/cmd/go/internal/modconv/tsv.go index feba181e05..106cddedd3 100644 --- a/src/cmd/go/internal/modconv/tsv.go +++ b/src/cmd/go/internal/modconv/tsv.go @@ -13,8 +13,7 @@ import ( func ParseDependenciesTSV(file string, data []byte) (*modfile.File, error) { mf := new(modfile.File) - for lineno, line := range strings.Split(string(data), "\n") { - lineno++ + for _, line := range strings.Split(string(data), "\n") { f := strings.Split(line, "\t") if len(f) >= 3 { mf.Require = append(mf.Require, &modfile.Require{Mod: module.Version{Path: f[0], Version: f[2]}}) diff --git a/src/cmd/go/internal/modconv/vconf.go b/src/cmd/go/internal/modconv/vconf.go index a9a8e62518..f62eba7762 100644 --- a/src/cmd/go/internal/modconv/vconf.go +++ b/src/cmd/go/internal/modconv/vconf.go @@ -13,8 +13,7 @@ import ( func ParseVendorConf(file string, data []byte) (*modfile.File, error) { mf := new(modfile.File) - for lineno, line := range strings.Split(string(data), "\n") { - lineno++ + for _, line := range strings.Split(string(data), "\n") { if i := strings.Index(line, "#"); i >= 0 { line = line[:i] } diff --git a/src/cmd/go/internal/modconv/vyml.go b/src/cmd/go/internal/modconv/vyml.go index 0f017a3c7a..8a06519932 100644 --- a/src/cmd/go/internal/modconv/vyml.go +++ b/src/cmd/go/internal/modconv/vyml.go @@ -15,8 +15,7 @@ func ParseVendorYML(file string, data []byte) (*modfile.File, error) { mf := new(modfile.File) vendors := false path := "" - for lineno, line := range strings.Split(string(data), "\n") { - lineno++ + for _, line := range strings.Split(string(data), "\n") { if line == "" { continue } -- GitLab From 49bc5690a39b09c60601c21349ee730aea9e5ca6 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Mon, 4 Feb 2019 12:42:55 +0000 Subject: [PATCH 0237/1679] cmd/link: add missing error check in test Change-Id: I54998f1b7daa8f8db7a2007b4eb86e9789c03656 GitHub-Last-Rev: 97667ead6f62dad2af0d6b1f78deccef16417044 GitHub-Pull-Request: golang/go#30006 Reviewed-on: https://go-review.googlesource.com/c/160430 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/link/linkbig_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/link/linkbig_test.go b/src/cmd/link/linkbig_test.go index 21208e86e4..78d2bc1afe 100644 --- a/src/cmd/link/linkbig_test.go +++ b/src/cmd/link/linkbig_test.go @@ -28,6 +28,9 @@ func TestLargeText(t *testing.T) { var w bytes.Buffer const FN = 4 tmpdir, err := ioutil.TempDir("", "bigtext") + if err != nil { + t.Fatalf("can't create temp directory: %v\n", err) + } defer os.RemoveAll(tmpdir) -- GitLab From 3fe97ba0ff1262f86f75cbd141e4c1f50f0a919e Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:34:52 +0000 Subject: [PATCH 0238/1679] cmd/go/internal/work: properly ignore error Change-Id: Id0e8d170730d946b60c661d90bc98d0ca7545391 GitHub-Last-Rev: 19fed775b7e87c8c721b4487458354a2d5532a6c GitHub-Pull-Request: golang/go#30001 Reviewed-on: https://go-review.googlesource.com/c/160425 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/work/exec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index bb71faac9c..62651cc683 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -268,7 +268,7 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID { fmt.Fprintf(h, "compile %s %q %q\n", id, forcedGccgoflags, p.Internal.Gccgoflags) fmt.Fprintf(h, "pkgpath %s\n", gccgoPkgpath(p)) if len(p.SFiles) > 0 { - id, err = b.gccgoToolID(BuildToolchain.compiler(), "assembler-with-cpp") + id, _ = b.gccgoToolID(BuildToolchain.compiler(), "assembler-with-cpp") // Ignore error; different assembler versions // are unlikely to make any difference anyhow. fmt.Fprintf(h, "asm %q\n", id) -- GitLab From acf8f2c1545b4ce2459a48fac32340bad7e8c692 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:35:01 +0000 Subject: [PATCH 0239/1679] cmd/go/internal/modload: correctly report devel versions Change-Id: Ie26b86c7502e41796732caad4d7e254246f70b7f GitHub-Last-Rev: 3b80c0e4b17ec2b2a5b95e40d5880df2b856c6dd GitHub-Pull-Request: golang/go#30002 Reviewed-on: https://go-review.googlesource.com/c/160426 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modload/build.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 2a8be90b78..4d4e512ef5 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -219,7 +219,7 @@ func PackageBuildInfo(path string, deps []string) string { if r.Path == "" { h = "\t" + modfetch.Sum(mod) } - fmt.Fprintf(&buf, "dep\t%s\t%s%s\n", mod.Path, mod.Version, h) + fmt.Fprintf(&buf, "dep\t%s\t%s%s\n", mod.Path, mv, h) if r.Path != "" { fmt.Fprintf(&buf, "=>\t%s\t%s\t%s\n", r.Path, r.Version, modfetch.Sum(r)) } -- GitLab From d346a9b7725b5313ddda3913cbcd5ff5fba0c909 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:34:43 +0000 Subject: [PATCH 0240/1679] cmd/go/internal/modfetch: add missing error checks Change-Id: I51a9c06384875fbb12db0e05128f23bd23a163a1 GitHub-Last-Rev: 126452f15cbb8e06ff683dcd60e63f1925dcf8f1 GitHub-Pull-Request: golang/go#30000 Reviewed-on: https://go-review.googlesource.com/c/160424 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modfetch/coderepo.go | 3 +++ src/cmd/go/internal/modfetch/pseudo.go | 3 +++ src/cmd/go/internal/modfetch/pseudo_test.go | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index 5018b6d8af..54baaaa909 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -541,6 +541,9 @@ func (r *codeRepo) Zip(dst io.Writer, version string) error { return err } w, err := zw.Create(r.modPrefix(version) + "/" + name) + if err != nil { + return err + } lr := &io.LimitedReader{R: rc, N: size + 1} if _, err := io.Copy(w, lr); err != nil { return err diff --git a/src/cmd/go/internal/modfetch/pseudo.go b/src/cmd/go/internal/modfetch/pseudo.go index f105373cd4..88c3d3a527 100644 --- a/src/cmd/go/internal/modfetch/pseudo.go +++ b/src/cmd/go/internal/modfetch/pseudo.go @@ -98,6 +98,9 @@ func IsPseudoVersion(v string) bool { // embedded in the pseudo-version is not a valid time. func PseudoVersionTime(v string) (time.Time, error) { timestamp, _, err := parsePseudoVersion(v) + if err != nil { + return time.Time{}, err + } t, err := time.Parse("20060102150405", timestamp) if err != nil { return time.Time{}, fmt.Errorf("pseudo-version with malformed time %s: %q", timestamp, v) diff --git a/src/cmd/go/internal/modfetch/pseudo_test.go b/src/cmd/go/internal/modfetch/pseudo_test.go index 3c2fa51468..d0e800b450 100644 --- a/src/cmd/go/internal/modfetch/pseudo_test.go +++ b/src/cmd/go/internal/modfetch/pseudo_test.go @@ -60,6 +60,13 @@ func TestPseudoVersionTime(t *testing.T) { } } +func TestInvalidPseudoVersionTime(t *testing.T) { + const v = "---" + if _, err := PseudoVersionTime(v); err == nil { + t.Error("expected error, got nil instead") + } +} + func TestPseudoVersionRev(t *testing.T) { for _, tt := range pseudoTests { rev, err := PseudoVersionRev(tt.version) -- GitLab From 342764a21606ba6f964400cc747ee6c9a88fc959 Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Mon, 26 Nov 2018 11:40:32 +0300 Subject: [PATCH 0241/1679] runtime/pprof/internal/profile: use idiomatic swapping gogrep found only one such case with the pattern below: $tmp := $x; $x = $y; $y = $tmp R=1.13 Change-Id: I6e46fb5ef2887f24fa9fc451323a8cef272e2886 Reviewed-on: https://go-review.googlesource.com/c/151200 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/runtime/pprof/internal/profile/profile.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/runtime/pprof/internal/profile/profile.go b/src/runtime/pprof/internal/profile/profile.go index a6f8354b1e..443accdd6d 100644 --- a/src/runtime/pprof/internal/profile/profile.go +++ b/src/runtime/pprof/internal/profile/profile.go @@ -211,9 +211,7 @@ func (p *Profile) setMain() { continue } // Swap what we guess is main to position 0. - tmp := p.Mapping[i] - p.Mapping[i] = p.Mapping[0] - p.Mapping[0] = tmp + p.Mapping[i], p.Mapping[0] = p.Mapping[0], p.Mapping[i] break } } -- GitLab From 2889332edfb90d70827fa714b0fa40a28b0621b5 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Mon, 17 Dec 2018 11:06:30 +0700 Subject: [PATCH 0242/1679] net/http: make TimeoutHandler's ResponseWriter implement Pusher Fixes #29193 Change-Id: I03088205e51036abbc861ab5b7d141327b0429ae Reviewed-on: https://go-review.googlesource.com/c/154383 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/server.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/net/http/server.go b/src/net/http/server.go index e68ec2f01e..9ae0bbff14 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -3223,6 +3223,25 @@ type timeoutWriter struct { code int } +var _ Pusher = (*timeoutWriter)(nil) +var _ Flusher = (*timeoutWriter)(nil) + +// Push implements the Pusher interface. +func (tw *timeoutWriter) Push(target string, opts *PushOptions) error { + if pusher, ok := tw.w.(Pusher); ok { + return pusher.Push(target, opts) + } + return ErrNotSupported +} + +// Flush implements the Flusher interface. +func (tw *timeoutWriter) Flush() { + f, ok := tw.w.(Flusher) + if ok { + f.Flush() + } +} + func (tw *timeoutWriter) Header() Header { return tw.h } func (tw *timeoutWriter) Write(p []byte) (int, error) { -- GitLab From 337a1bde026f227fa9536653cc51efa13970657a Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 30 Jan 2019 17:35:18 +0000 Subject: [PATCH 0243/1679] cmd/internal/obj: stay consistent by defining loop variable outside loop header Change-Id: Ieb0ae01cf393c4983e809ce95fedeaa854d19a99 GitHub-Last-Rev: 908f7565183c1cd19a3fbc47f406d53ad388fb97 GitHub-Pull-Request: golang/go#30004 Reviewed-on: https://go-review.googlesource.com/c/160428 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/internal/obj/objfile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index c6d2de4273..a94717a404 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -252,7 +252,7 @@ func (w *objWriter) writeSymDebug(s *LSym) { for i := 0; i < len(s.P); i += 16 { fmt.Fprintf(ctxt.Bso, "\t%#04x", uint(i)) j := i - for j = i; j < i+16 && j < len(s.P); j++ { + for ; j < i+16 && j < len(s.P); j++ { fmt.Fprintf(ctxt.Bso, " %02x", s.P[j]) } for ; j < i+16; j++ { -- GitLab From aa5165d62cf623230dd820afe2bdba92bd15beeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 25 Nov 2018 23:22:11 +0000 Subject: [PATCH 0244/1679] encoding/hex: simplify decoder arithmetic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove all multiplications and divisions from the main decoding loop. name old time/op new time/op delta Decode/256-8 323ns ± 0% 293ns ± 0% -9.29% (p=0.000 n=5+4) Decode/1024-8 1.26µs ± 0% 1.14µs ± 0% -9.48% (p=0.000 n=6+5) Decode/4096-8 4.99µs ± 0% 4.51µs ± 0% -9.55% (p=0.002 n=6+6) Decode/16384-8 20.0µs ± 0% 18.1µs ± 0% -9.54% (p=0.002 n=6+6) name old speed new speed delta Decode/256-8 791MB/s ± 0% 872MB/s ± 0% +10.34% (p=0.002 n=6+6) Decode/1024-8 814MB/s ± 0% 899MB/s ± 0% +10.48% (p=0.004 n=6+5) Decode/4096-8 821MB/s ± 0% 908MB/s ± 0% +10.55% (p=0.002 n=6+6) Decode/16384-8 821MB/s ± 0% 908MB/s ± 0% +10.54% (p=0.002 n=6+6) Change-Id: Ie9f91242ce04c130a77c1184379e3b9de38fe713 Reviewed-on: https://go-review.googlesource.com/c/151199 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/hex/hex.go | 17 +++++++++-------- src/encoding/hex/hex_test.go | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/encoding/hex/hex.go b/src/encoding/hex/hex.go index 2bb2b57df9..7675de9bd9 100644 --- a/src/encoding/hex/hex.go +++ b/src/encoding/hex/hex.go @@ -55,23 +55,24 @@ func DecodedLen(x int) int { return x / 2 } // If the input is malformed, Decode returns the number // of bytes decoded before the error. func Decode(dst, src []byte) (int, error) { - var i int - for i = 0; i < len(src)/2; i++ { - a, ok := fromHexChar(src[i*2]) + i, j := 0, 1 + for ; j < len(src); j += 2 { + a, ok := fromHexChar(src[j-1]) if !ok { - return i, InvalidByteError(src[i*2]) + return i, InvalidByteError(src[j-1]) } - b, ok := fromHexChar(src[i*2+1]) + b, ok := fromHexChar(src[j]) if !ok { - return i, InvalidByteError(src[i*2+1]) + return i, InvalidByteError(src[j]) } dst[i] = (a << 4) | b + i++ } if len(src)%2 == 1 { // Check for invalid char before reporting bad length, // since the invalid char (if present) is an earlier problem. - if _, ok := fromHexChar(src[i*2]); !ok { - return i, InvalidByteError(src[i*2]) + if _, ok := fromHexChar(src[j-1]); !ok { + return i, InvalidByteError(src[j-1]) } return i, ErrLength } diff --git a/src/encoding/hex/hex_test.go b/src/encoding/hex/hex_test.go index e9f4b3a53a..ba703cf1c1 100644 --- a/src/encoding/hex/hex_test.go +++ b/src/encoding/hex/hex_test.go @@ -249,6 +249,20 @@ func BenchmarkEncode(b *testing.B) { } } +func BenchmarkDecode(b *testing.B) { + for _, size := range []int{256, 1024, 4096, 16384} { + src := bytes.Repeat([]byte{'2', 'b', '7', '4', '4', 'f', 'a', 'a'}, size/8) + sink = make([]byte, size/2) + + b.Run(fmt.Sprintf("%v", size), func(b *testing.B) { + b.SetBytes(int64(size)) + for i := 0; i < b.N; i++ { + Decode(sink, src) + } + }) + } +} + func BenchmarkDump(b *testing.B) { for _, size := range []int{256, 1024, 4096, 16384} { src := bytes.Repeat([]byte{2, 3, 5, 7, 9, 11, 13, 17}, size/8) -- GitLab From 5edb175b40a87f3dba90aed14390de9affee77f2 Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Mon, 4 Feb 2019 12:44:00 +0000 Subject: [PATCH 0245/1679] cmd/compile/internal/ssa: ignore error from second call to MatchString in test Change-Id: I714612b41facc8d1ec22974e8aaf2a5a3592e8f5 GitHub-Last-Rev: a0b3917e45bc1d24590e9c9cb3550da4c4008c49 GitHub-Pull-Request: golang/go#29998 Reviewed-on: https://go-review.googlesource.com/c/160422 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/debug_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/debug_test.go b/src/cmd/compile/internal/ssa/debug_test.go index 0a409bec2c..7246a13ff6 100644 --- a/src/cmd/compile/internal/ssa/debug_test.go +++ b/src/cmd/compile/internal/ssa/debug_test.go @@ -934,7 +934,8 @@ func expect(want string, got tstring) { if match { return } - match, err = regexp.MatchString(want, got.e) + // Ignore error as we have already checked for it before + match, _ = regexp.MatchString(want, got.e) if match { return } -- GitLab From 5126feadd6e4ca890da0156c59b159085959120e Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Mon, 14 Jan 2019 13:43:11 +0530 Subject: [PATCH 0246/1679] bufio: fix emptyFinalToken example to handle multiple Reads Fixes #25909 Change-Id: I9a53a1a06aab5d1877a8e9b1b8b782d77d6027a8 Reviewed-on: https://go-review.googlesource.com/c/157758 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/bufio/example_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bufio/example_test.go b/src/bufio/example_test.go index 4666e6d985..bb57139918 100644 --- a/src/bufio/example_test.go +++ b/src/bufio/example_test.go @@ -94,6 +94,9 @@ func ExampleScanner_emptyFinalToken() { return i + 1, data[:i], nil } } + if !atEOF { + return 0, nil, nil + } // There is one final token to be delivered, which may be the empty string. // Returning bufio.ErrFinalToken here tells Scan there are no more tokens after this // but does not trigger an error to be returned from Scan itself. -- GitLab From 37b84e2782e5c19c3053316853a6fba923b0f06b Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 2 Mar 2019 11:14:29 -0800 Subject: [PATCH 0247/1679] os/exec: add BenchmarkExecEcho Change-Id: Ie955cdc505766447f70b8f262160fe05b60a5b0c Reviewed-on: https://go-review.googlesource.com/c/164959 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/bench_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/os/exec/bench_test.go diff --git a/src/os/exec/bench_test.go b/src/os/exec/bench_test.go new file mode 100644 index 0000000000..e8cf73bef7 --- /dev/null +++ b/src/os/exec/bench_test.go @@ -0,0 +1,23 @@ +// Copyright 2019 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 exec + +import ( + "testing" +) + +func BenchmarkExecEcho(b *testing.B) { + b.ReportAllocs() + path, err := LookPath("echo") + if err != nil { + b.Fatalf("could not find echo: %v", err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + if err := Command(path).Run(); err != nil { + b.Fatalf("echo: %v", err) + } + } +} -- GitLab From beadf433c37498dafc6748cc510eeab2636b5be3 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 2 Mar 2019 11:14:33 -0800 Subject: [PATCH 0248/1679] os/exec: provide map size hint in dedupEnvCase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The common case is that most env vars are distinct; optimize for that. name old time/op new time/op delta ExecEcho-8 2.16ms ± 3% 2.14ms ± 1% ~ (p=0.315 n=10+10) name old alloc/op new alloc/op delta ExecEcho-8 7.87kB ± 0% 6.35kB ± 0% -19.31% (p=0.000 n=9+10) name old allocs/op new allocs/op delta ExecEcho-8 72.0 ± 0% 69.0 ± 0% -4.17% (p=0.000 n=10+10) Change-Id: I42bb696c6862f2ea12c5cbd2f24c64336a7a759a Reviewed-on: https://go-review.googlesource.com/c/164960 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/exec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 1aa3ab93dc..7b2b2ebd92 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -713,7 +713,7 @@ func dedupEnv(env []string) []string { // If caseInsensitive is true, the case of keys is ignored. func dedupEnvCase(caseInsensitive bool, env []string) []string { out := make([]string, 0, len(env)) - saw := map[string]int{} // key => index into out + saw := make(map[string]int, len(env)) // key => index into out for _, kv := range env { eq := strings.Index(kv, "=") if eq < 0 { -- GitLab From 06c86e0fc3eec6635fce31b8cd6b988087a8f872 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 2 Mar 2019 11:14:46 -0800 Subject: [PATCH 0249/1679] syscall: optimize SlicePtrFromStrings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of allocating a byte slice for every string, calculated the required size and create a single slice big enough to hold all of them. As an added benefit, any error encountered will now be returned before allocations occur. os/exec package benchmarks: name old time/op new time/op delta ExecEcho-8 2.14ms ± 1% 2.14ms ± 3% ~ (p=0.842 n=10+9) name old alloc/op new alloc/op delta ExecEcho-8 6.35kB ± 0% 6.18kB ± 0% -2.65% (p=0.000 n=10+10) name old allocs/op new allocs/op delta ExecEcho-8 69.0 ± 0% 36.0 ± 0% -47.83% (p=0.000 n=10+10) Change-Id: I84118d8473037d873f73903d4e4f6ed14f531ce7 Reviewed-on: https://go-review.googlesource.com/c/164961 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/exec_unix.go | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/syscall/exec_unix.go b/src/syscall/exec_unix.go index 997ccab07e..4421c449cf 100644 --- a/src/syscall/exec_unix.go +++ b/src/syscall/exec_unix.go @@ -9,6 +9,7 @@ package syscall import ( + "internal/bytealg" "runtime" "sync" "unsafe" @@ -81,15 +82,21 @@ func StringSlicePtr(ss []string) []*byte { // pointers to NUL-terminated byte arrays. If any string contains // a NUL byte, it returns (nil, EINVAL). func SlicePtrFromStrings(ss []string) ([]*byte, error) { - var err error - bb := make([]*byte, len(ss)+1) - for i := 0; i < len(ss); i++ { - bb[i], err = BytePtrFromString(ss[i]) - if err != nil { - return nil, err + n := 0 + for _, s := range ss { + if bytealg.IndexByteString(s, 0) != -1 { + return nil, EINVAL } + n += len(s) + 1 // +1 for NUL + } + bb := make([]*byte, len(ss)+1) + b := make([]byte, n) + n = 0 + for i, s := range ss { + bb[i] = &b[n] + copy(b[n:], s) + n += len(s) + 1 } - bb[len(ss)] = nil return bb, nil } -- GitLab From e0ff4e6dc013ac18728743a43b6faa812737bdb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 31 Dec 2018 19:48:21 +0100 Subject: [PATCH 0250/1679] encoding/pem: skip whitespace work on most inputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit encoding/base64 already skips \r and \n when decoding, so this package must only deal with spaces and tabs. Those aren't nearly as common, so we can add a fast path with bytes.ContainsAny to skip the costly alloc and filtering code. name old time/op new time/op delta Decode-8 279µs ± 0% 259µs ± 1% -7.07% (p=0.002 n=6+6) name old speed new speed delta Decode-8 319MB/s ± 0% 343MB/s ± 1% +7.61% (p=0.002 n=6+6) name old alloc/op new alloc/op delta Decode-8 164kB ± 0% 74kB ± 0% -54.90% (p=0.002 n=6+6) name old allocs/op new allocs/op delta Decode-8 12.0 ± 0% 11.0 ± 0% -8.33% (p=0.002 n=6+6) Change-Id: Idfca8700c52f46eb70a4a7e0d2db3bf0124e4699 Reviewed-on: https://go-review.googlesource.com/c/155964 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/pem/pem.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/encoding/pem/pem.go b/src/encoding/pem/pem.go index 35058c306b..a7272da5ad 100644 --- a/src/encoding/pem/pem.go +++ b/src/encoding/pem/pem.go @@ -50,14 +50,22 @@ func getLine(data []byte) (line, rest []byte) { return bytes.TrimRight(data[0:i], " \t"), data[j:] } -// removeWhitespace returns a copy of its input with all spaces, tab and -// newline characters removed. -func removeWhitespace(data []byte) []byte { +// removeSpacesAndTabs returns a copy of its input with all spaces and tabs +// removed, if there were any. Otherwise, the input is returned unchanged. +// +// The base64 decoder already skips newline characters, so we don't need to +// filter them out here. +func removeSpacesAndTabs(data []byte) []byte { + if !bytes.ContainsAny(data, " \t") { + // Fast path; most base64 data within PEM contains newlines, but + // no spaces nor tabs. Skip the extra alloc and work. + return data + } result := make([]byte, len(data)) n := 0 for _, b := range data { - if b == ' ' || b == '\t' || b == '\r' || b == '\n' { + if b == ' ' || b == '\t' { continue } result[n] = b @@ -155,7 +163,7 @@ func Decode(data []byte) (p *Block, rest []byte) { return decodeError(data, rest) } - base64Data := removeWhitespace(rest[:endIndex]) + base64Data := removeSpacesAndTabs(rest[:endIndex]) p.Bytes = make([]byte, base64.StdEncoding.DecodedLen(len(base64Data))) n, err := base64.StdEncoding.Decode(p.Bytes, base64Data) if err != nil { -- GitLab From 3de2fb21b7b4d472637f83031ec48e9bf539a4ee Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 2 Mar 2019 13:07:54 +0100 Subject: [PATCH 0251/1679] misc/android: use adb exec-out instead of adb shell to avoid buffering According to https://stackoverflow.com/questions/46233200/stop-buffering-of-adb-shell-output the adb exec-out commands avoids the buffering inherent to adb shell. Let's see if using exec-out will fix the android builder flakyness where exitcodes or output were sometimes missing. Updates #30512 (perhaps fixes it). Change-Id: Ib953ef0262b20730e0d4c332058d29c5066bfeb2 Reviewed-on: https://go-review.googlesource.com/c/164661 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index ffdacb3db8..166ced8d0f 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -75,12 +75,12 @@ func main() { // In case we're booting a device or emulator alongside all.bash, wait for // it to be ready. adb wait-for-device is not enough, we have to // wait for sys.boot_completed. - run("wait-for-device", "shell", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") + run("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") // Prepare a temporary directory that will be cleaned up at the end. deviceGotmp := fmt.Sprintf("/data/local/tmp/%s-%d", filepath.Base(os.Args[1]), os.Getpid()) - run("shell", "mkdir", "-p", deviceGotmp) + run("exec-out", "mkdir", "-p", deviceGotmp) // Determine the package by examining the current working // directory, which will look something like @@ -94,7 +94,7 @@ func main() { } else { adbSyncGoroot() } - run("shell", "mkdir", "-p", deviceCwd) + run("exec-out", "mkdir", "-p", deviceCwd) // Binary names can conflict. // E.g. template.test from the {html,text}/template packages. @@ -114,16 +114,13 @@ func main() { for range quit { // We don't have the PID of the running process; use the // binary name instead. - run("shell", "killall -QUIT "+binName) + run("exec-out", "killall -QUIT "+binName) } }() - // The adb shell command will return an exit code of 0 regardless - // of the command run. E.g. - // $ adb shell false - // $ echo $? - // 0 + // In light of // https://code.google.com/p/android/issues/detail?id=3254 - // So we append the exitcode to the output and parse it from there. + // dont trust the exitcode of adb. Instead, append the exitcode to + // the output and parse it from there. const exitstr = "exitcode=" cmd := `export TMPDIR="` + deviceGotmp + `"` + `; export GOROOT="` + deviceGoroot + `"` + @@ -131,11 +128,11 @@ func main() { `; cd "` + deviceCwd + `"` + "; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") + "; echo -n " + exitstr + "$?" - output := run("shell", cmd) + output := run("exec-out", cmd) signal.Reset(syscall.SIGQUIT) close(quit) - run("shell", "rm", "-rf", deviceGotmp) // Clean up. + run("exec-out", "rm", "-rf", deviceGotmp) // Clean up. exitIdx := strings.LastIndex(output, exitstr) if exitIdx == -1 { @@ -211,8 +208,8 @@ func adbSyncGoroot() { return } devRoot := "/data/local/tmp/goroot" - run("shell", "rm", "-rf", devRoot) - run("shell", "mkdir", "-p", devRoot+"/pkg") + run("exec-out", "rm", "-rf", devRoot) + run("exec-out", "mkdir", "-p", devRoot+"/pkg") goroot := runtime.GOROOT() goCmd := filepath.Join(goroot, "bin", "go") runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output() -- GitLab From fc42cf8b8ccf6753c01e063ac090b2a60e70f077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 25 Nov 2018 14:53:24 +0000 Subject: [PATCH 0252/1679] encoding/base64: lift nil check out of encode loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most of the encoding time is spent in the first Encode loop, since the rest of the function only deals with the few remaining bytes. Any unnecessary work done in that loop body matters tremendously. One such unnecessary bottleneck was the use of the enc.encode table. Since enc is a pointer receiver, and the field is first used within the loop, the encoder must perform a nil check at every iteration. Add a dummy use of the field before the start of the loop, to move the nil check there. After that line, the compiler now knows that enc can't be nil, and thus the hot loop is free of nil checks. name old time/op new time/op delta EncodeToString-4 14.7µs ± 0% 13.7µs ± 1% -6.53% (p=0.000 n=10+10) name old speed new speed delta EncodeToString-4 559MB/s ± 0% 598MB/s ± 1% +6.99% (p=0.000 n=10+10) Updates #20206. Change-Id: Icbb523a7bd9e470a8be0a448d1d78ade97ed4ff6 Reviewed-on: https://go-review.googlesource.com/c/151158 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/base64/base64.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/encoding/base64/base64.go b/src/encoding/base64/base64.go index 0bb37b311a..a90e4dfa12 100644 --- a/src/encoding/base64/base64.go +++ b/src/encoding/base64/base64.go @@ -123,6 +123,10 @@ func (enc *Encoding) Encode(dst, src []byte) { if len(src) == 0 { return } + // enc is a pointer receiver, so the use of enc.encode within the hot + // loop below means a nil check at every operation. Lift that nil check + // outside of the loop to speed up the encoder. + _ = enc.encode di, si := 0, 0 n := (len(src) / 3) * 3 -- GitLab From ec01d8f74bf60c0fe52335bf8bcf475e3653822d Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Sun, 3 Mar 2019 16:42:08 +0000 Subject: [PATCH 0253/1679] cmd/internal/obj/mips: use r instead of p.Reg in call to OP_IRR Change-Id: Id77764ed2d693e632e2a7b4e4638c17e0caf2276 GitHub-Last-Rev: 9ebe28252086ddcd530905eb9cf50b4a66413291 GitHub-Pull-Request: golang/go#30003 Reviewed-on: https://go-review.googlesource.com/c/160427 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/mips/asm0.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index e4004be98d..458e071e47 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -1275,7 +1275,7 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { r = REGZERO } /* only use 10 bits of trap code */ - o1 = OP_IRR(c.opirr(p.As), (uint32(v)&0x3FF)<<6, uint32(p.Reg), uint32(p.To.Reg)) + o1 = OP_IRR(c.opirr(p.As), (uint32(v)&0x3FF)<<6, uint32(r), uint32(p.To.Reg)) case 16: /* sll $c,[r1],r2 */ v := c.regoff(&p.From) -- GitLab From 59712fd03d37c0d17cce9f6605a9cc87fa0d4870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 3 Mar 2019 15:30:24 +0000 Subject: [PATCH 0254/1679] os/exec: preallocate for Cmd.childFiles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We're always going to add stdin, stdout, and stderr to childFiles, so its length will be at least three. The final length will be those three elements plus however many files were given via ExtraFiles. Allocate for that final length directly, saving two slice growth allocs in the common case where ExtraFiles is empty. name old time/op new time/op delta ExecEcho-8 435µs ± 0% 435µs ± 0% ~ (p=0.394 n=6+6) name old alloc/op new alloc/op delta ExecEcho-8 6.39kB ± 0% 6.37kB ± 0% -0.39% (p=0.002 n=6+6) name old allocs/op new allocs/op delta ExecEcho-8 36.0 ± 0% 34.0 ± 0% -5.56% (p=0.002 n=6+6) Change-Id: Ib702c0da1e43f0a55ed937af6d45fca6a170e8f3 Reviewed-on: https://go-review.googlesource.com/c/164898 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/exec.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 7b2b2ebd92..30fd64a4b1 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -376,6 +376,7 @@ func (c *Cmd) Start() error { } } + c.childFiles = make([]*os.File, 0, 3+len(c.ExtraFiles)) type F func(*Cmd) (*os.File, error) for _, setupFd := range []F{(*Cmd).stdin, (*Cmd).stdout, (*Cmd).stderr} { fd, err := setupFd(c) -- GitLab From 0dc62565401eba11bf9aec127c6c9f5aa4ecf1c9 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Sun, 3 Mar 2019 18:33:34 +0100 Subject: [PATCH 0255/1679] doc: fix bad lib/time link in 1.12 release notes There's a "lib/time" sub-section in the Go 1.12 relase notes that points to a non-existent golang.org/pkg/lib/time page. The note is about a change in the tz database in the src/lib/time directory, but the section's title (and the link) should probably just refer to the time package. Change-Id: Ibf9dacd710e72886f14ad0b7415fea1e8d25b83a Reviewed-on: https://go-review.googlesource.com/c/164977 Reviewed-by: Brad Fitzpatrick --- doc/go1.12.html | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index ec2783f479..2945eb1c43 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -611,17 +611,6 @@ for {

-
lib/time
-
-

- The time zone database in $GOROOT/lib/time/zoneinfo.zip - has been updated to version 2018i. Note that this ZIP file is - only used if a time zone database is not provided by the operating - system. -

- -
-
math

@@ -935,6 +924,17 @@ for {

+
time
+
+

+ The time zone database in $GOROOT/lib/time/zoneinfo.zip + has been updated to version 2018i. Note that this ZIP file is + only used if a time zone database is not provided by the operating + system. +

+ +
+
unsafe

-- GitLab From 42b79f08239216eeea3cc1b0febc992f91bd88de Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Wed, 26 Dec 2018 13:34:47 +0100 Subject: [PATCH 0256/1679] misc/wasm: better adapt to different JavaScript environments This change adds support for using wasm with Electron. It refactors environment detection to a more modular approach instead of explicitly testing for Node.js. Fixes #29404 Change-Id: I882a9c56523744e7fd7cb2013d158df91cf91d14 Reviewed-on: https://go-review.googlesource.com/c/164665 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/wasm/wasm_exec.js | 72 +++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index 165d567750..8eff751d62 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -3,6 +3,15 @@ // license that can be found in the LICENSE file. (() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + if (typeof global !== "undefined") { // global already exists } else if (typeof window !== "undefined") { @@ -13,30 +22,15 @@ throw new Error("cannot export Go (neither global, window nor self is defined)"); } - // Map web browser API and Node.js API to a single common API (preferring web standards over Node.js API). - const isNodeJS = global.process && global.process.title === "node"; - if (isNodeJS) { + if (!global.require && typeof require !== "undefined") { global.require = require; - global.fs = require("fs"); - - const nodeCrypto = require("crypto"); - global.crypto = { - getRandomValues(b) { - nodeCrypto.randomFillSync(b); - }, - }; + } - global.performance = { - now() { - const [sec, nsec] = process.hrtime(); - return sec * 1000 + nsec / 1000000; - }, - }; + if (!global.fs && global.require) { + global.fs = require("fs"); + } - const util = require("util"); - global.TextEncoder = util.TextEncoder; - global.TextDecoder = util.TextDecoder; - } else { + if (!global.fs) { let outputBuf = ""; global.fs = { constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused @@ -72,6 +66,34 @@ }; } + if (!global.crypto) { + const nodeCrypto = require("crypto"); + global.crypto = { + getRandomValues(b) { + nodeCrypto.randomFillSync(b); + }, + }; + } + + if (!global.performance) { + global.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + if (!global.TextEncoder) { + global.TextEncoder = require("util").TextEncoder; + } + + if (!global.TextDecoder) { + global.TextDecoder = require("util").TextDecoder; + } + + // End of polyfills for common API. + const encoder = new TextEncoder("utf-8"); const decoder = new TextDecoder("utf-8"); @@ -439,7 +461,13 @@ } } - if (isNodeJS) { + if ( + global.require && + global.require.main === module && + global.process && + global.process.versions && + !global.process.versions.electron + ) { if (process.argv.length < 3) { process.stderr.write("usage: go_js_wasm_exec [wasm binary] [arguments]\n"); process.exit(1); -- GitLab From 83610c90bbe4f5f0b18ac01da3f3921c2f7090e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 3 Mar 2019 18:31:33 +0000 Subject: [PATCH 0257/1679] os/exec: don't use the echo binary for a benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most notably, it's missing on Windows machines. For example, windows-amd64-race started failing consistently: --- FAIL: BenchmarkExecEcho bench_test.go:15: could not find echo: exec: "echo": executable file not found in %PATH% We can also reproduce this from Linux with Wine: $ GOOS=windows go test -bench=. -benchtime=1x -run=- -exec wine --- FAIL: BenchmarkExecEcho bench_test.go:15: could not find echo: exec: "echo": executable file not found in %PATH% Instead, use the "hostname" program, which is available on Windows too. Interestingly enough, it's also slightly faster than "echo". Any program is fine as long as it's close enough to a no-op, though. name old time/op new time/op delta ExecEcho-8 422µs ± 0% 395µs ± 0% -6.39% (p=0.004 n=6+5) name old alloc/op new alloc/op delta ExecEcho-8 6.39kB ± 0% 6.42kB ± 0% +0.53% (p=0.002 n=6+6) name old allocs/op new allocs/op delta ExecEcho-8 36.0 ± 0% 36.0 ± 0% ~ (all equal) Change-Id: I772864d69979172b5cf807552c84d0e165e73051 Reviewed-on: https://go-review.googlesource.com/c/164704 Run-TryBot: Daniel Martí Reviewed-by: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/os/exec/bench_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/os/exec/bench_test.go b/src/os/exec/bench_test.go index e8cf73bef7..9a94001e84 100644 --- a/src/os/exec/bench_test.go +++ b/src/os/exec/bench_test.go @@ -8,16 +8,16 @@ import ( "testing" ) -func BenchmarkExecEcho(b *testing.B) { +func BenchmarkExecHostname(b *testing.B) { b.ReportAllocs() - path, err := LookPath("echo") + path, err := LookPath("hostname") if err != nil { - b.Fatalf("could not find echo: %v", err) + b.Fatalf("could not find hostname: %v", err) } b.ResetTimer() for i := 0; i < b.N; i++ { if err := Command(path).Run(); err != nil { - b.Fatalf("echo: %v", err) + b.Fatalf("hostname: %v", err) } } } -- GitLab From 159b2de4428d47e422ffd696e0f0c62353c4bb79 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Tue, 22 Jan 2019 09:10:59 +0000 Subject: [PATCH 0258/1679] cmd/compile: optimize math/bits.Div32 for arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Benchmark: name old time/op new time/op delta Div-8 22.0ns ± 0% 22.0ns ± 0% ~ (all equal) Div32-8 6.51ns ± 0% 3.00ns ± 0% -53.90% (p=0.000 n=10+8) Div64-8 22.5ns ± 0% 22.5ns ± 0% ~ (all equal) Code: func div32(hi, lo, y uint32) (q, r uint32) {return bits.Div32(hi, lo, y)} Before: 0x0020 00032 (test.go:24) MOVWU "".y+8(FP), R0 0x0024 00036 ($GOROOT/src/math/bits/bits.go:472) CBZW R0, 132 0x0028 00040 ($GOROOT/src/math/bits/bits.go:472) MOVWU "".hi(FP), R1 0x002c 00044 ($GOROOT/src/math/bits/bits.go:472) CMPW R1, R0 0x0030 00048 ($GOROOT/src/math/bits/bits.go:472) BLS 96 0x0034 00052 ($GOROOT/src/math/bits/bits.go:475) MOVWU "".lo+4(FP), R2 0x0038 00056 ($GOROOT/src/math/bits/bits.go:475) ORR R1<<32, R2, R1 0x003c 00060 ($GOROOT/src/math/bits/bits.go:476) CBZ R0, 140 0x0040 00064 ($GOROOT/src/math/bits/bits.go:476) UDIV R0, R1, R2 0x0044 00068 (test.go:24) MOVW R2, "".q+16(FP) 0x0048 00072 ($GOROOT/src/math/bits/bits.go:476) UREM R0, R1, R0 0x0050 00080 (test.go:24) MOVW R0, "".r+20(FP) 0x0054 00084 (test.go:24) MOVD -8(RSP), R29 0x0058 00088 (test.go:24) MOVD.P 32(RSP), R30 0x005c 00092 (test.go:24) RET (R30) After: 0x001c 00028 (test.go:24) MOVWU "".y+8(FP), R0 0x0020 00032 (test.go:24) CBZW R0, 92 0x0024 00036 (test.go:24) MOVWU "".hi(FP), R1 0x0028 00040 (test.go:24) CMPW R0, R1 0x002c 00044 (test.go:24) BHS 84 0x0030 00048 (test.go:24) MOVWU "".lo+4(FP), R2 0x0034 00052 (test.go:24) ORR R1<<32, R2, R4 0x0038 00056 (test.go:24) UDIV R0, R4, R3 0x003c 00060 (test.go:24) MSUB R3, R4, R0, R4 0x0040 00064 (test.go:24) MOVW R3, "".q+16(FP) 0x0044 00068 (test.go:24) MOVW R4, "".r+20(FP) 0x0048 00072 (test.go:24) MOVD -8(RSP), R29 0x004c 00076 (test.go:24) MOVD.P 16(RSP), R30 0x0050 00080 (test.go:24) RET (R30) UREM instruction in the previous assembly code will be converted to UDIV and MSUB instructions on arm64. However the UDIV instruction in UREM is unnecessary, because it's a duplicate of the previous UDIV. This CL adds a rule to have this extra UDIV instruction removed by CSE. Change-Id: Ie2508784320020b2de022806d09f75a7871bb3d7 Reviewed-on: https://go-review.googlesource.com/c/159577 Reviewed-by: Keith Randall Reviewed-by: Cherry Zhang Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 7 +++ src/cmd/compile/internal/ssa/rewriteARM64.go | 48 ++++++++++++++++++++ test/codegen/mathbits.go | 5 ++ 3 files changed, 60 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 3f49a9bcf9..133a893610 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -133,6 +133,13 @@ (BitRev16 x) -> (SRLconst [48] (RBIT x)) (BitRev8 x) -> (SRLconst [56] (RBIT x)) +// In fact, UMOD will be translated into UREM instruction, and UREM is originally translated into +// UDIV and MSUB instructions. But if there is already an identical UDIV instruction just before or +// after UREM (case like quo, rem := z/y, z%y), then the second UDIV instruction becomes redundant. +// The purpose of this rule is to have this extra UDIV instruction removed in CSE pass. +(UMOD x y) -> (MSUB x y (UDIV x y)) +(UMODW x y) -> (MSUBW x y (UDIVW x y)) + // boolean ops -- booleans are represented with 0=false, 1=true (AndB x y) -> (AND x y) (OrB x y) -> (OR x y) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index fe815efb14..45801a4003 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -30667,6 +30667,30 @@ func rewriteValueARM64_OpARM64UDIVW_0(v *Value) bool { return false } func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (UMOD x y) + // cond: + // result: (MSUB x y (UDIV x y)) + for { + if v.Type != typ.UInt64 { + break + } + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + v.reset(OpARM64MSUB) + v.Type = typ.UInt64 + v.AddArg(x) + v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64UDIV, typ.UInt64) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true + } // match: (UMOD _ (MOVDconst [1])) // cond: // result: (MOVDconst [0]) @@ -30724,6 +30748,30 @@ func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { return false } func rewriteValueARM64_OpARM64UMODW_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (UMODW x y) + // cond: + // result: (MSUBW x y (UDIVW x y)) + for { + if v.Type != typ.UInt32 { + break + } + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + v.reset(OpARM64MSUBW) + v.Type = typ.UInt32 + v.AddArg(x) + v.AddArg(y) + v0 := b.NewValue0(v.Pos, OpARM64UDIVW, typ.UInt32) + v0.AddArg(x) + v0.AddArg(y) + v.AddArg(v0) + return true + } // match: (UMODW _ (MOVDconst [c])) // cond: uint32(c)==1 // result: (MOVDconst [0]) diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index b2a8e3ea7a..cc3c91eb0d 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -476,6 +476,11 @@ func Div(hi, lo, x uint) (q, r uint) { return bits.Div(hi, lo, x) } +func Div32(hi, lo, x uint32) (q, r uint32) { + // arm64:"ORR","UDIV","MSUB",-"UREM" + return bits.Div32(hi, lo, x) +} + func Div64(hi, lo, x uint64) (q, r uint64) { // amd64:"DIVQ" return bits.Div64(hi, lo, x) -- GitLab From c0d82bb0eca81aa13c2e605b4a25655f61a159aa Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Wed, 12 Dec 2018 13:04:44 +0100 Subject: [PATCH 0259/1679] all: rename WebAssembly instructions according to spec changes The names of some instructions have been updated in the WebAssembly specification to be more consistent, see https://github.com/WebAssembly/spec/commit/994591e51c9df9e7ef980b04d660709b79982f75. This change to the spec is possible because it is still in a draft state. Go's support for WebAssembly is still experimental and thus excempt from the compatibility promise. Being consistent with the spec should warrant this breaking change to the assembly instruction names. Change-Id: Iafb8b18ee7f55dd0e23c6c7824aa1fad43117ef1 Reviewed-on: https://go-review.googlesource.com/c/153797 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/Wasm.rules | 34 +++++------ src/cmd/compile/internal/ssa/gen/WasmOps.go | 8 +-- src/cmd/compile/internal/ssa/opGen.go | 24 ++++---- src/cmd/compile/internal/ssa/rewriteWasm.go | 64 ++++++++++----------- src/cmd/compile/internal/wasm/ssa.go | 12 ++-- src/cmd/internal/obj/wasm/a.out.go | 36 ++++++------ src/cmd/internal/obj/wasm/anames.go | 36 ++++++------ src/cmd/internal/obj/wasm/wasmobj.go | 26 ++++----- src/internal/bytealg/compare_wasm.s | 2 +- src/internal/bytealg/indexbyte_wasm.s | 4 +- src/reflect/asm_wasm.s | 4 +- src/runtime/asm_wasm.s | 2 +- src/runtime/rt0_js_wasm.s | 4 +- src/runtime/sys_wasm.s | 4 +- 14 files changed, 130 insertions(+), 130 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index 41d8d1122d..b7ecae7d8c 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -72,23 +72,23 @@ (Trunc16to8 x) -> x // Lowering float <-> int -(Cvt32to32F x) -> (LoweredRound32F (F64ConvertSI64 (SignExt32to64 x))) -(Cvt32to64F x) -> (F64ConvertSI64 (SignExt32to64 x)) -(Cvt64to32F x) -> (LoweredRound32F (F64ConvertSI64 x)) -(Cvt64to64F x) -> (F64ConvertSI64 x) -(Cvt32Uto32F x) -> (LoweredRound32F (F64ConvertUI64 (ZeroExt32to64 x))) -(Cvt32Uto64F x) -> (F64ConvertUI64 (ZeroExt32to64 x)) -(Cvt64Uto32F x) -> (LoweredRound32F (F64ConvertUI64 x)) -(Cvt64Uto64F x) -> (F64ConvertUI64 x) - -(Cvt32Fto32 x) -> (I64TruncSF64 x) -(Cvt32Fto64 x) -> (I64TruncSF64 x) -(Cvt64Fto32 x) -> (I64TruncSF64 x) -(Cvt64Fto64 x) -> (I64TruncSF64 x) -(Cvt32Fto32U x) -> (I64TruncUF64 x) -(Cvt32Fto64U x) -> (I64TruncUF64 x) -(Cvt64Fto32U x) -> (I64TruncUF64 x) -(Cvt64Fto64U x) -> (I64TruncUF64 x) +(Cvt32to32F x) -> (LoweredRound32F (F64ConvertI64S (SignExt32to64 x))) +(Cvt32to64F x) -> (F64ConvertI64S (SignExt32to64 x)) +(Cvt64to32F x) -> (LoweredRound32F (F64ConvertI64S x)) +(Cvt64to64F x) -> (F64ConvertI64S x) +(Cvt32Uto32F x) -> (LoweredRound32F (F64ConvertI64U (ZeroExt32to64 x))) +(Cvt32Uto64F x) -> (F64ConvertI64U (ZeroExt32to64 x)) +(Cvt64Uto32F x) -> (LoweredRound32F (F64ConvertI64U x)) +(Cvt64Uto64F x) -> (F64ConvertI64U x) + +(Cvt32Fto32 x) -> (I64TruncF64S x) +(Cvt32Fto64 x) -> (I64TruncF64S x) +(Cvt64Fto32 x) -> (I64TruncF64S x) +(Cvt64Fto64 x) -> (I64TruncF64S x) +(Cvt32Fto32U x) -> (I64TruncF64U x) +(Cvt32Fto64U x) -> (I64TruncF64U x) +(Cvt64Fto32U x) -> (I64TruncF64U x) +(Cvt64Fto64U x) -> (I64TruncF64U x) (Cvt32Fto64F x) -> x (Cvt64Fto32F x) -> (LoweredRound32F x) diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index e0f2f92a3f..c0ad9498ff 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -187,10 +187,10 @@ func init() { {name: "F64Mul", asm: "F64Mul", argLength: 2, reg: fp21, typ: "Float64"}, // arg0 * arg1 {name: "F64Div", asm: "F64Div", argLength: 2, reg: fp21, typ: "Float64"}, // arg0 / arg1 - {name: "I64TruncSF64", asm: "I64TruncSF64", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to a signed integer - {name: "I64TruncUF64", asm: "I64TruncUF64", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to an unsigned integer - {name: "F64ConvertSI64", asm: "F64ConvertSI64", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the signed integer arg0 to a float - {name: "F64ConvertUI64", asm: "F64ConvertUI64", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the unsigned integer arg0 to a float + {name: "I64TruncF64S", asm: "I64TruncF64S", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to a signed integer + {name: "I64TruncF64U", asm: "I64TruncF64U", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to an unsigned integer + {name: "F64ConvertI64S", asm: "F64ConvertI64S", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the signed integer arg0 to a float + {name: "F64ConvertI64U", asm: "F64ConvertI64U", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the unsigned integer arg0 to a float } archs = append(archs, arch{ diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 2278407a26..948bbdc32a 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -2075,10 +2075,10 @@ const ( OpWasmF64Sub OpWasmF64Mul OpWasmF64Div - OpWasmI64TruncSF64 - OpWasmI64TruncUF64 - OpWasmF64ConvertSI64 - OpWasmF64ConvertUI64 + OpWasmI64TruncF64S + OpWasmI64TruncF64U + OpWasmF64ConvertI64S + OpWasmF64ConvertI64U OpAdd8 OpAdd16 @@ -28000,9 +28000,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "I64TruncSF64", + name: "I64TruncF64S", argLen: 1, - asm: wasm.AI64TruncSF64, + asm: wasm.AI64TruncF64S, reg: regInfo{ inputs: []inputInfo{ {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 @@ -28013,9 +28013,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "I64TruncUF64", + name: "I64TruncF64U", argLen: 1, - asm: wasm.AI64TruncUF64, + asm: wasm.AI64TruncF64U, reg: regInfo{ inputs: []inputInfo{ {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 @@ -28026,9 +28026,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "F64ConvertSI64", + name: "F64ConvertI64S", argLen: 1, - asm: wasm.AF64ConvertSI64, + asm: wasm.AF64ConvertI64S, reg: regInfo{ inputs: []inputInfo{ {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 @@ -28039,9 +28039,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "F64ConvertUI64", + name: "F64ConvertI64U", argLen: 1, - asm: wasm.AF64ConvertUI64, + asm: wasm.AF64ConvertI64U, reg: regInfo{ inputs: []inputInfo{ {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index e14d6251be..1b7b5022da 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -913,10 +913,10 @@ func rewriteValueWasm_OpConvert_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto32_0(v *Value) bool { // match: (Cvt32Fto32 x) // cond: - // result: (I64TruncSF64 x) + // result: (I64TruncF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncSF64) + v.reset(OpWasmI64TruncF64S) v.AddArg(x) return true } @@ -924,10 +924,10 @@ func rewriteValueWasm_OpCvt32Fto32_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto32U_0(v *Value) bool { // match: (Cvt32Fto32U x) // cond: - // result: (I64TruncUF64 x) + // result: (I64TruncF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncUF64) + v.reset(OpWasmI64TruncF64U) v.AddArg(x) return true } @@ -935,10 +935,10 @@ func rewriteValueWasm_OpCvt32Fto32U_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto64_0(v *Value) bool { // match: (Cvt32Fto64 x) // cond: - // result: (I64TruncSF64 x) + // result: (I64TruncF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncSF64) + v.reset(OpWasmI64TruncF64S) v.AddArg(x) return true } @@ -958,10 +958,10 @@ func rewriteValueWasm_OpCvt32Fto64F_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto64U_0(v *Value) bool { // match: (Cvt32Fto64U x) // cond: - // result: (I64TruncUF64 x) + // result: (I64TruncF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncUF64) + v.reset(OpWasmI64TruncF64U) v.AddArg(x) return true } @@ -973,11 +973,11 @@ func rewriteValueWasm_OpCvt32Uto32F_0(v *Value) bool { _ = typ // match: (Cvt32Uto32F x) // cond: - // result: (LoweredRound32F (F64ConvertUI64 (ZeroExt32to64 x))) + // result: (LoweredRound32F (F64ConvertI64U (ZeroExt32to64 x))) for { x := v.Args[0] v.reset(OpWasmLoweredRound32F) - v0 := b.NewValue0(v.Pos, OpWasmF64ConvertUI64, typ.Float64) + v0 := b.NewValue0(v.Pos, OpWasmF64ConvertI64U, typ.Float64) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v1.AddArg(x) v0.AddArg(v1) @@ -992,10 +992,10 @@ func rewriteValueWasm_OpCvt32Uto64F_0(v *Value) bool { _ = typ // match: (Cvt32Uto64F x) // cond: - // result: (F64ConvertUI64 (ZeroExt32to64 x)) + // result: (F64ConvertI64U (ZeroExt32to64 x)) for { x := v.Args[0] - v.reset(OpWasmF64ConvertUI64) + v.reset(OpWasmF64ConvertI64U) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) v.AddArg(v0) @@ -1009,11 +1009,11 @@ func rewriteValueWasm_OpCvt32to32F_0(v *Value) bool { _ = typ // match: (Cvt32to32F x) // cond: - // result: (LoweredRound32F (F64ConvertSI64 (SignExt32to64 x))) + // result: (LoweredRound32F (F64ConvertI64S (SignExt32to64 x))) for { x := v.Args[0] v.reset(OpWasmLoweredRound32F) - v0 := b.NewValue0(v.Pos, OpWasmF64ConvertSI64, typ.Float64) + v0 := b.NewValue0(v.Pos, OpWasmF64ConvertI64S, typ.Float64) v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v1.AddArg(x) v0.AddArg(v1) @@ -1028,10 +1028,10 @@ func rewriteValueWasm_OpCvt32to64F_0(v *Value) bool { _ = typ // match: (Cvt32to64F x) // cond: - // result: (F64ConvertSI64 (SignExt32to64 x)) + // result: (F64ConvertI64S (SignExt32to64 x)) for { x := v.Args[0] - v.reset(OpWasmF64ConvertSI64) + v.reset(OpWasmF64ConvertI64S) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) v.AddArg(v0) @@ -1041,10 +1041,10 @@ func rewriteValueWasm_OpCvt32to64F_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto32_0(v *Value) bool { // match: (Cvt64Fto32 x) // cond: - // result: (I64TruncSF64 x) + // result: (I64TruncF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncSF64) + v.reset(OpWasmI64TruncF64S) v.AddArg(x) return true } @@ -1063,10 +1063,10 @@ func rewriteValueWasm_OpCvt64Fto32F_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto32U_0(v *Value) bool { // match: (Cvt64Fto32U x) // cond: - // result: (I64TruncUF64 x) + // result: (I64TruncF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncUF64) + v.reset(OpWasmI64TruncF64U) v.AddArg(x) return true } @@ -1074,10 +1074,10 @@ func rewriteValueWasm_OpCvt64Fto32U_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto64_0(v *Value) bool { // match: (Cvt64Fto64 x) // cond: - // result: (I64TruncSF64 x) + // result: (I64TruncF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncSF64) + v.reset(OpWasmI64TruncF64S) v.AddArg(x) return true } @@ -1085,10 +1085,10 @@ func rewriteValueWasm_OpCvt64Fto64_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto64U_0(v *Value) bool { // match: (Cvt64Fto64U x) // cond: - // result: (I64TruncUF64 x) + // result: (I64TruncF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncUF64) + v.reset(OpWasmI64TruncF64U) v.AddArg(x) return true } @@ -1100,11 +1100,11 @@ func rewriteValueWasm_OpCvt64Uto32F_0(v *Value) bool { _ = typ // match: (Cvt64Uto32F x) // cond: - // result: (LoweredRound32F (F64ConvertUI64 x)) + // result: (LoweredRound32F (F64ConvertI64U x)) for { x := v.Args[0] v.reset(OpWasmLoweredRound32F) - v0 := b.NewValue0(v.Pos, OpWasmF64ConvertUI64, typ.Float64) + v0 := b.NewValue0(v.Pos, OpWasmF64ConvertI64U, typ.Float64) v0.AddArg(x) v.AddArg(v0) return true @@ -1113,10 +1113,10 @@ func rewriteValueWasm_OpCvt64Uto32F_0(v *Value) bool { func rewriteValueWasm_OpCvt64Uto64F_0(v *Value) bool { // match: (Cvt64Uto64F x) // cond: - // result: (F64ConvertUI64 x) + // result: (F64ConvertI64U x) for { x := v.Args[0] - v.reset(OpWasmF64ConvertUI64) + v.reset(OpWasmF64ConvertI64U) v.AddArg(x) return true } @@ -1128,11 +1128,11 @@ func rewriteValueWasm_OpCvt64to32F_0(v *Value) bool { _ = typ // match: (Cvt64to32F x) // cond: - // result: (LoweredRound32F (F64ConvertSI64 x)) + // result: (LoweredRound32F (F64ConvertI64S x)) for { x := v.Args[0] v.reset(OpWasmLoweredRound32F) - v0 := b.NewValue0(v.Pos, OpWasmF64ConvertSI64, typ.Float64) + v0 := b.NewValue0(v.Pos, OpWasmF64ConvertI64S, typ.Float64) v0.AddArg(x) v.AddArg(v0) return true @@ -1141,10 +1141,10 @@ func rewriteValueWasm_OpCvt64to32F_0(v *Value) bool { func rewriteValueWasm_OpCvt64to64F_0(v *Value) bool { // match: (Cvt64to64F x) // cond: - // result: (F64ConvertSI64 x) + // result: (F64ConvertI64S x) for { x := v.Args[0] - v.reset(OpWasmF64ConvertSI64) + v.reset(OpWasmF64ConvertI64S) v.AddArg(x) return true } diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 897d6146c5..604c88247f 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -283,13 +283,13 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { case ssa.OpWasmI64Eqz: getValue64(s, v.Args[0]) s.Prog(v.Op.Asm()) - s.Prog(wasm.AI64ExtendUI32) + s.Prog(wasm.AI64ExtendI32U) case ssa.OpWasmI64Eq, ssa.OpWasmI64Ne, ssa.OpWasmI64LtS, ssa.OpWasmI64LtU, ssa.OpWasmI64GtS, ssa.OpWasmI64GtU, ssa.OpWasmI64LeS, ssa.OpWasmI64LeU, ssa.OpWasmI64GeS, ssa.OpWasmI64GeU, ssa.OpWasmF64Eq, ssa.OpWasmF64Ne, ssa.OpWasmF64Lt, ssa.OpWasmF64Gt, ssa.OpWasmF64Le, ssa.OpWasmF64Ge: getValue64(s, v.Args[0]) getValue64(s, v.Args[1]) s.Prog(v.Op.Asm()) - s.Prog(wasm.AI64ExtendUI32) + s.Prog(wasm.AI64ExtendI32U) case ssa.OpWasmI64Add, ssa.OpWasmI64Sub, ssa.OpWasmI64Mul, ssa.OpWasmI64DivU, ssa.OpWasmI64RemS, ssa.OpWasmI64RemU, ssa.OpWasmI64And, ssa.OpWasmI64Or, ssa.OpWasmI64Xor, ssa.OpWasmI64Shl, ssa.OpWasmI64ShrS, ssa.OpWasmI64ShrU, ssa.OpWasmF64Add, ssa.OpWasmF64Sub, ssa.OpWasmF64Mul, ssa.OpWasmF64Div: getValue64(s, v.Args[0]) @@ -307,17 +307,17 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { } s.Prog(wasm.AI64DivS) - case ssa.OpWasmI64TruncSF64: + case ssa.OpWasmI64TruncF64S: getValue64(s, v.Args[0]) p := s.Prog(wasm.ACall) p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncS} - case ssa.OpWasmI64TruncUF64: + case ssa.OpWasmI64TruncF64U: getValue64(s, v.Args[0]) p := s.Prog(wasm.ACall) p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncU} - case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertSI64, ssa.OpWasmF64ConvertUI64: + case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U: getValue64(s, v.Args[0]) s.Prog(v.Op.Asm()) @@ -362,7 +362,7 @@ func getValue64(s *gc.SSAGenState, v *ssa.Value) { reg := v.Reg() getReg(s, reg) if reg == wasm.REG_SP { - s.Prog(wasm.AI64ExtendUI32) + s.Prog(wasm.AI64ExtendI32U) } } diff --git a/src/cmd/internal/obj/wasm/a.out.go b/src/cmd/internal/obj/wasm/a.out.go index 0e8196be60..f1830ba036 100644 --- a/src/cmd/internal/obj/wasm/a.out.go +++ b/src/cmd/internal/obj/wasm/a.out.go @@ -186,25 +186,25 @@ const ( AF64Copysign AI32WrapI64 - AI32TruncSF32 - AI32TruncUF32 - AI32TruncSF64 - AI32TruncUF64 - AI64ExtendSI32 - AI64ExtendUI32 - AI64TruncSF32 - AI64TruncUF32 - AI64TruncSF64 - AI64TruncUF64 - AF32ConvertSI32 - AF32ConvertUI32 - AF32ConvertSI64 - AF32ConvertUI64 + AI32TruncF32S + AI32TruncF32U + AI32TruncF64S + AI32TruncF64U + AI64ExtendI32S + AI64ExtendI32U + AI64TruncF32S + AI64TruncF32U + AI64TruncF64S + AI64TruncF64U + AF32ConvertI32S + AF32ConvertI32U + AF32ConvertI64S + AF32ConvertI64U AF32DemoteF64 - AF64ConvertSI32 - AF64ConvertUI32 - AF64ConvertSI64 - AF64ConvertUI64 + AF64ConvertI32S + AF64ConvertI32U + AF64ConvertI64S + AF64ConvertI64U AF64PromoteF32 AI32ReinterpretF32 AI64ReinterpretF64 diff --git a/src/cmd/internal/obj/wasm/anames.go b/src/cmd/internal/obj/wasm/anames.go index 369de3092d..7ef09d665e 100644 --- a/src/cmd/internal/obj/wasm/anames.go +++ b/src/cmd/internal/obj/wasm/anames.go @@ -153,25 +153,25 @@ var Anames = []string{ "F64Max", "F64Copysign", "I32WrapI64", - "I32TruncSF32", - "I32TruncUF32", - "I32TruncSF64", - "I32TruncUF64", - "I64ExtendSI32", - "I64ExtendUI32", - "I64TruncSF32", - "I64TruncUF32", - "I64TruncSF64", - "I64TruncUF64", - "F32ConvertSI32", - "F32ConvertUI32", - "F32ConvertSI64", - "F32ConvertUI64", + "I32TruncF32S", + "I32TruncF32U", + "I32TruncF64S", + "I32TruncF64U", + "I64ExtendI32S", + "I64ExtendI32U", + "I64TruncF32S", + "I64TruncF32U", + "I64TruncF64S", + "I64TruncF64U", + "F32ConvertI32S", + "F32ConvertI32U", + "F32ConvertI64S", + "F32ConvertI64U", "F32DemoteF64", - "F64ConvertSI32", - "F64ConvertUI32", - "F64ConvertSI64", - "F64ConvertUI64", + "F64ConvertI32S", + "F64ConvertI32U", + "F64ConvertI64S", + "F64ConvertI64U", "F64PromoteF32", "I32ReinterpretF32", "I64ReinterpretF64", diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go index fbea103dcb..4a499b4f91 100644 --- a/src/cmd/internal/obj/wasm/wasmobj.go +++ b/src/cmd/internal/obj/wasm/wasmobj.go @@ -181,7 +181,7 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { // Not // If // Get SP - // I64ExtendUI32 + // I64ExtendI32U // I64Const $framesize+8 // I64Add // I64Load panic_argp(R0) @@ -212,7 +212,7 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { p = appendp(p, AIf) p = appendp(p, AGet, regAddr(REG_SP)) - p = appendp(p, AI64ExtendUI32) + p = appendp(p, AI64ExtendI32U) p = appendp(p, AI64Const, constAddr(framesize+8)) p = appendp(p, AI64Add) p = appendp(p, AI64Load, panicargp) @@ -584,7 +584,7 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { case obj.NAME_AUTO, obj.NAME_PARAM: p = appendp(p, AGet, regAddr(get.From.Reg)) if get.From.Reg == REG_SP { - p = appendp(p, AI64ExtendUI32) + p = appendp(p, AI64ExtendI32U) } if get.From.Offset != 0 { p = appendp(p, AI64Const, constAddr(get.From.Offset)) @@ -641,7 +641,7 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { case obj.NAME_NONE, obj.NAME_PARAM, obj.NAME_AUTO: p = appendp(p, AGet, regAddr(mov.From.Reg)) if mov.From.Reg == REG_SP { - p = appendp(p, AI64ExtendUI32) + p = appendp(p, AI64ExtendI32U) } p = appendp(p, AI64Const, constAddr(mov.From.Offset)) p = appendp(p, AI64Add) @@ -654,7 +654,7 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { case obj.TYPE_REG: p = appendp(p, AGet, mov.From) if mov.From.Reg == REG_SP { - p = appendp(p, AI64ExtendUI32) + p = appendp(p, AI64ExtendI32U) } case obj.TYPE_MEM: @@ -788,13 +788,13 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { reg := p.From.Reg switch { case reg >= REG_PC_F && reg <= REG_PAUSE: - w.WriteByte(0x23) // get_global + w.WriteByte(0x23) // global.get writeUleb128(w, uint64(reg-REG_PC_F)) case reg >= REG_R0 && reg <= REG_R15: - w.WriteByte(0x20) // get_local (i64) + w.WriteByte(0x20) // local.get (i64) writeUleb128(w, uint64(reg-REG_R0)) case reg >= REG_F0 && reg <= REG_F15: - w.WriteByte(0x20) // get_local (f64) + w.WriteByte(0x20) // local.get (f64) writeUleb128(w, uint64(numI+(reg-REG_F0))) default: panic("bad Get: invalid register") @@ -808,14 +808,14 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { reg := p.To.Reg switch { case reg >= REG_PC_F && reg <= REG_PAUSE: - w.WriteByte(0x24) // set_global + w.WriteByte(0x24) // global.set writeUleb128(w, uint64(reg-REG_PC_F)) case reg >= REG_R0 && reg <= REG_F15: if p.Link.As == AGet && p.Link.From.Reg == reg { - w.WriteByte(0x22) // tee_local + w.WriteByte(0x22) // local.tee p = p.Link } else { - w.WriteByte(0x21) // set_local + w.WriteByte(0x21) // local.set } if reg <= REG_R15 { writeUleb128(w, uint64(reg-REG_R0)) @@ -834,10 +834,10 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { reg := p.To.Reg switch { case reg >= REG_R0 && reg <= REG_R15: - w.WriteByte(0x22) // tee_local (i64) + w.WriteByte(0x22) // local.tee (i64) writeUleb128(w, uint64(reg-REG_R0)) case reg >= REG_F0 && reg <= REG_F15: - w.WriteByte(0x22) // tee_local (f64) + w.WriteByte(0x22) // local.tee (f64) writeUleb128(w, uint64(numI+(reg-REG_F0))) default: panic("bad Tee: invalid register") diff --git a/src/internal/bytealg/compare_wasm.s b/src/internal/bytealg/compare_wasm.s index b2a20a08f6..2d28215b1a 100644 --- a/src/internal/bytealg/compare_wasm.s +++ b/src/internal/bytealg/compare_wasm.s @@ -44,7 +44,7 @@ TEXT cmpbody<>(SB), NOSPLIT, $0-0 Get R4 I32WrapI64 Call memcmp<>(SB) - I64ExtendSI32 + I64ExtendI32S Set R5 Get R5 diff --git a/src/internal/bytealg/indexbyte_wasm.s b/src/internal/bytealg/indexbyte_wasm.s index aae11b30a6..4d940a3bb0 100644 --- a/src/internal/bytealg/indexbyte_wasm.s +++ b/src/internal/bytealg/indexbyte_wasm.s @@ -12,7 +12,7 @@ TEXT ·IndexByte(SB), NOSPLIT, $0-40 I64Load b_len+8(FP) I32WrapI64 Call memchr<>(SB) - I64ExtendSI32 + I64ExtendI32S Set R0 Get SP @@ -35,7 +35,7 @@ TEXT ·IndexByteString(SB), NOSPLIT, $0-32 I64Load s_len+8(FP) I32WrapI64 Call memchr<>(SB) - I64ExtendSI32 + I64ExtendI32S Set R0 I64Const $-1 diff --git a/src/reflect/asm_wasm.s b/src/reflect/asm_wasm.s index 627e295769..63b4d94fca 100644 --- a/src/reflect/asm_wasm.s +++ b/src/reflect/asm_wasm.s @@ -16,7 +16,7 @@ TEXT ·makeFuncStub(SB),(NOSPLIT|WRAPPER),$32 Get SP Get SP - I64ExtendUI32 + I64ExtendI32U I64Const $argframe+0(FP) I64Add I64Store $8 @@ -38,7 +38,7 @@ TEXT ·methodValueCall(SB),(NOSPLIT|WRAPPER),$32 Get SP Get SP - I64ExtendUI32 + I64ExtendI32U I64Const $argframe+0(FP) I64Add I64Store $8 diff --git a/src/runtime/asm_wasm.s b/src/runtime/asm_wasm.s index 374b9f73db..1d25ee899d 100644 --- a/src/runtime/asm_wasm.s +++ b/src/runtime/asm_wasm.s @@ -366,7 +366,7 @@ TEXT NAME(SB), WRAPPER, $MAXSIZE-32; \ Set RET1; \ \ Get SP; \ - I64ExtendUI32; \ + I64ExtendI32U; \ Get R0; \ I64Add; \ Set RET2; \ diff --git a/src/runtime/rt0_js_wasm.s b/src/runtime/rt0_js_wasm.s index 50adbe2225..c4efd9637c 100644 --- a/src/runtime/rt0_js_wasm.s +++ b/src/runtime/rt0_js_wasm.s @@ -23,12 +23,12 @@ TEXT wasm_export_run(SB),NOSPLIT,$0 Get SP Get R0 // argc - I64ExtendUI32 + I64ExtendI32U I64Store $0 Get SP Get R1 // argv - I64ExtendUI32 + I64ExtendI32U I64Store $8 I32Const $runtime·rt0_go(SB) diff --git a/src/runtime/sys_wasm.s b/src/runtime/sys_wasm.s index 6e28656340..d7bab926dc 100644 --- a/src/runtime/sys_wasm.s +++ b/src/runtime/sys_wasm.s @@ -117,7 +117,7 @@ TEXT runtime·wasmTruncS(SB), NOSPLIT, $0-0 End Get R0 - I64TruncSF64 + I64TruncF64S Return TEXT runtime·wasmTruncU(SB), NOSPLIT, $0-0 @@ -146,7 +146,7 @@ TEXT runtime·wasmTruncU(SB), NOSPLIT, $0-0 End Get R0 - I64TruncUF64 + I64TruncF64U Return TEXT runtime·exitThread(SB), NOSPLIT, $0-0 -- GitLab From 4fb900e9ca1f08c57b074e7bf6a7eab90b92c898 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 3 Mar 2019 17:02:14 -0800 Subject: [PATCH 0260/1679] internal/poll: copy and use errnoErr to avoid allocations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Converting a syscall.Errno to an interface is a significant source of allocations in os/exec. Elsewhere in the tree, we have pre-allocated errors for common errno values. Use the same trick here. This CL makes yet another copy of this code. The problem is that there isn't really a great place to share it. The existing copies are in: cmd/vendor/golang.org/x/sys/unix cmd/vendor/golang.org/x/sys/windows cmd/vendor/golang.org/x/sys/windows/registry internal/syscall/windows internal/syscall/windows/registry syscall internal/poll can't import from cmd/vendor, and cmd/vendor can't import from internal/*, so we can ignore cmd/vendor. We could put the unix version in internal/syscall/unix and then have a platform-independent wrapper in internal/syscall. But syscall couldn't use it; internal/syscall/* depends on syscall. So that only allows code re-use with internal/syscall/windows/*. We could create a new very low level internal package, internal/errno. But syscall couldn't use it, because it has to import syscall to get access to syscall.Errno. So that only allows code re-use with internal/syscall/windows/*. It's not clear that that any of these options pulls its weight. The obvious and "correct" place for this is syscall. But we can't export syscall's version, because package syscall is frozen. So just copy the code. There's not much of it. name old alloc/op new alloc/op delta ExecHostname-8 6.15kB ± 0% 6.13kB ± 0% -0.38% (p=0.000 n=20+19) name old allocs/op new allocs/op delta ExecHostname-8 34.0 ± 0% 31.0 ± 0% -8.82% (p=0.000 n=20+20) Fixes #30535 Change-Id: Idd31c7cced6e15387acc698ffc011e1b7b479903 Reviewed-on: https://go-review.googlesource.com/c/164971 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/internal/poll/errno_unix.go | 33 ++++++++++++++++++++++++++++ src/internal/poll/errno_windows.go | 31 ++++++++++++++++++++++++++ src/internal/poll/fd_poll_runtime.go | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/internal/poll/errno_unix.go create mode 100644 src/internal/poll/errno_windows.go diff --git a/src/internal/poll/errno_unix.go b/src/internal/poll/errno_unix.go new file mode 100644 index 0000000000..0b23fc3210 --- /dev/null +++ b/src/internal/poll/errno_unix.go @@ -0,0 +1,33 @@ +// Copyright 2019 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. + +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package poll + +import "syscall" + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case syscall.EAGAIN: + return errEAGAIN + case syscall.EINVAL: + return errEINVAL + case syscall.ENOENT: + return errENOENT + } + return e +} diff --git a/src/internal/poll/errno_windows.go b/src/internal/poll/errno_windows.go new file mode 100644 index 0000000000..e3bddb4bb2 --- /dev/null +++ b/src/internal/poll/errno_windows.go @@ -0,0 +1,31 @@ +// Copyright 2019 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. + +// +build windows + +package poll + +import "syscall" + +// Do the interface allocations only once for common +// Errno values. + +var ( + errERROR_IO_PENDING error = syscall.Errno(syscall.ERROR_IO_PENDING) +) + +// ErrnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case syscall.ERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} diff --git a/src/internal/poll/fd_poll_runtime.go b/src/internal/poll/fd_poll_runtime.go index 687f702556..2932615d85 100644 --- a/src/internal/poll/fd_poll_runtime.go +++ b/src/internal/poll/fd_poll_runtime.go @@ -42,7 +42,7 @@ func (pd *pollDesc) init(fd *FD) error { runtime_pollUnblock(ctx) runtime_pollClose(ctx) } - return syscall.Errno(errno) + return errnoErr(syscall.Errno(errno)) } pd.runtimeCtx = ctx return nil -- GitLab From 0db5534d7acb3c5ce39145ec3aaa490cca1a81ea Mon Sep 17 00:00:00 2001 From: Brian Kessler Date: Thu, 31 Jan 2019 22:05:49 -0700 Subject: [PATCH 0261/1679] encoding/csv: document that Writer is buffered Add documentation that individual Write calls are buffered and copy documentation from bufio.Writer notifying the user to call Flush and Error when all writes are complete. Remove reference to "file" since the implementation is general and allows any io.Writer. Fixes #30045 Change-Id: I50165470e548f296494e764707fbabe36c665015 Reviewed-on: https://go-review.googlesource.com/c/160680 Reviewed-by: Brad Fitzpatrick --- src/encoding/csv/writer.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/encoding/csv/writer.go b/src/encoding/csv/writer.go index 31c4f9c22d..b18996a930 100644 --- a/src/encoding/csv/writer.go +++ b/src/encoding/csv/writer.go @@ -12,7 +12,7 @@ import ( "unicode/utf8" ) -// A Writer writes records to a CSV encoded file. +// A Writer writes records using CSV encoding. // // As returned by NewWriter, a Writer writes records terminated by a // newline and uses ',' as the field delimiter. The exported fields can be @@ -21,6 +21,12 @@ import ( // Comma is the field delimiter. // // If UseCRLF is true, the Writer ends each output line with \r\n instead of \n. +// +// The writes of individual records are buffered. +// After all data has been written, the client should call the +// Flush method to guarantee all data has been forwarded to +// the underlying io.Writer. Any errors that occurred should +// be checked by calling the Error method. type Writer struct { Comma rune // Field delimiter (set to ',' by NewWriter) UseCRLF bool // True to use \r\n as the line terminator @@ -37,6 +43,8 @@ func NewWriter(w io.Writer) *Writer { // Writer writes a single CSV record to w along with any necessary quoting. // A record is a slice of strings with each string being one field. +// Writes are buffered, so Flush must eventually be called to ensure +// that the record is written to the underlying io.Writer. func (w *Writer) Write(record []string) error { if !validDelim(w.Comma) { return errInvalidDelim @@ -122,7 +130,8 @@ func (w *Writer) Error() error { return err } -// WriteAll writes multiple CSV records to w using Write and then calls Flush. +// WriteAll writes multiple CSV records to w using Write and then calls Flush, +// returning any error from the Flush. func (w *Writer) WriteAll(records [][]string) error { for _, record := range records { err := w.Write(record) -- GitLab From d1887676d96daf969d886a4ec13cbad4908d51af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 3 Mar 2019 23:52:00 +0000 Subject: [PATCH 0262/1679] os/exec: less allocs in the common case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Stdin, Stdout, and Stderr are nil, there are no goroutines to keep track of, so we don't need a channel. And in startProcess, preallocate the right size for sysattr.Files, saving a bit of space and a couple of slice growth allocs. name old time/op new time/op delta ExecHostname-8 419µs ± 0% 417µs ± 1% ~ (p=0.093 n=6+6) name old alloc/op new alloc/op delta ExecHostname-8 6.40kB ± 0% 6.28kB ± 0% -1.86% (p=0.002 n=6+6) name old allocs/op new allocs/op delta ExecHostname-8 34.0 ± 0% 31.0 ± 0% -8.82% (p=0.002 n=6+6) Change-Id: Ic1d617f29e9c6431cdcadc7f9bb992750a6d5f48 Reviewed-on: https://go-review.googlesource.com/c/164801 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/exec.go | 13 ++++++++----- src/os/exec_plan9.go | 1 + src/os/exec_posix.go | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 30fd64a4b1..424b49cf06 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -404,11 +404,14 @@ func (c *Cmd) Start() error { c.closeDescriptors(c.closeAfterStart) - c.errch = make(chan error, len(c.goroutine)) - for _, fn := range c.goroutine { - go func(fn func() error) { - c.errch <- fn() - }(fn) + // Don't allocate the channel unless there are goroutines to fire. + if len(c.goroutine) > 0 { + c.errch = make(chan error, len(c.goroutine)) + for _, fn := range c.goroutine { + go func(fn func() error) { + c.errch <- fn() + }(fn) + } } if c.ctx != nil { diff --git a/src/os/exec_plan9.go b/src/os/exec_plan9.go index bab16ccad3..b0abf743dd 100644 --- a/src/os/exec_plan9.go +++ b/src/os/exec_plan9.go @@ -27,6 +27,7 @@ func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err e Sys: attr.Sys, } + sysattr.Files = make([]uintptr, 0, len(attr.Files)) for _, f := range attr.Files { sysattr.Files = append(sysattr.Files, f.Fd()) } diff --git a/src/os/exec_posix.go b/src/os/exec_posix.go index 4c8261295c..7b1ef67d1c 100644 --- a/src/os/exec_posix.go +++ b/src/os/exec_posix.go @@ -40,6 +40,7 @@ func startProcess(name string, argv []string, attr *ProcAttr) (p *Process, err e if sysattr.Env == nil { sysattr.Env = Environ() } + sysattr.Files = make([]uintptr, 0, len(attr.Files)) for _, f := range attr.Files { sysattr.Files = append(sysattr.Files, f.Fd()) } -- GitLab From 68eb3ccdec3712b9da01b812a3baa1f1e7f07ff3 Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Wed, 23 Jan 2019 00:22:53 +0800 Subject: [PATCH 0263/1679] cmd/api: fix no go files package panic Fixes #29837 Change-Id: I7d57c24d2133932c076df6f41dd6589f777b65dd Reviewed-on: https://go-review.googlesource.com/c/158877 Run-TryBot: Baokun Lee TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/api/goapi.go | 10 ++++++++-- src/cmd/api/goapi_test.go | 13 +++++++++++++ src/cmd/api/testdata/src/issue29837/p/README | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/cmd/api/testdata/src/issue29837/p/README diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 02dfa7c841..60359229de 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -169,7 +169,13 @@ func main() { // w.Import(name) will return nil continue } - pkg, _ := w.Import(name) + pkg, err := w.Import(name) + if _, nogo := err.(*build.NoGoError); nogo { + continue + } + if err != nil { + log.Fatalf("Import(%q): %v", name, err) + } w.export(pkg) } } @@ -470,7 +476,7 @@ func (w *Walker) Import(name string) (*types.Package, error) { info, err := context.ImportDir(dir, 0) if err != nil { if _, nogo := err.(*build.NoGoError); nogo { - return nil, nil + return nil, err } log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err) } diff --git a/src/cmd/api/goapi_test.go b/src/cmd/api/goapi_test.go index 1c8e2a345b..fc1bcc908a 100644 --- a/src/cmd/api/goapi_test.go +++ b/src/cmd/api/goapi_test.go @@ -203,3 +203,16 @@ func TestIssue21181(t *testing.T) { w.export(pkg) } } + +func TestIssue29837(t *testing.T) { + for _, c := range contexts { + c.Compiler = build.Default.Compiler + } + for _, context := range contexts { + w := NewWalker(context, "testdata/src/issue29837") + _, err := w.Import("p") + if _, nogo := err.(*build.NoGoError); !nogo { + t.Errorf("expected *build.NoGoError, got %T", err) + } + } +} diff --git a/src/cmd/api/testdata/src/issue29837/p/README b/src/cmd/api/testdata/src/issue29837/p/README new file mode 100644 index 0000000000..770bc0f1b2 --- /dev/null +++ b/src/cmd/api/testdata/src/issue29837/p/README @@ -0,0 +1 @@ +Empty directory for test, see https://golang.org/issues/29837. \ No newline at end of file -- GitLab From 88da9ccb98ffaf84bb06b98c9a24af5d0a7025d2 Mon Sep 17 00:00:00 2001 From: Carrie Bynon Date: Fri, 15 Feb 2019 22:16:54 +1100 Subject: [PATCH 0264/1679] doc: make path platform dependent Path should now appear with the correct slash, depending on which platform install document is being viewed - keeping in line with the rest of the document. Fixes #30160 Change-Id: Ib10e5a4adf366c700bff6f8d246bd5e3111ed61c Reviewed-on: https://go-review.googlesource.com/c/go/+/162918 Reviewed-by: Andrew Bonventre --- doc/install.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/install.html b/doc/install.html index a41c60ba6c..dda39fcaa7 100644 --- a/doc/install.html +++ b/doc/install.html @@ -204,7 +204,7 @@ you will need to set the G

-Next, make the directory src/hello inside your workspace, +Next, make the directory src/hellosrc\hello inside your workspace, and in that directory create a file named hello.go that looks like:

-- GitLab From 0c7cdb49d89b34baf1f407135b64fd38876823e2 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Sat, 19 Jan 2019 12:19:09 +0530 Subject: [PATCH 0265/1679] misc/git: remove pre-commit file All hook files are automatically set up when any git-codereview command is run. And since the contribution guidelines point to installing git-codereview, this file does not serve any purpose any more. Change-Id: I165f6905ca03fd3d512c59e2654ef79e76de934c Reviewed-on: https://go-review.googlesource.com/c/go/+/158677 Reviewed-by: Andrew Bonventre --- misc/git/pre-commit | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100755 misc/git/pre-commit diff --git a/misc/git/pre-commit b/misc/git/pre-commit deleted file mode 100755 index 242159f04a..0000000000 --- a/misc/git/pre-commit +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh -# Copyright 2012 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. - -# git gofmt pre-commit hook -# -# To use, store as .git/hooks/pre-commit inside your repository and make sure -# it has execute permissions. -# -# This script does not handle file names that contain spaces. - -gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '\.go$') -[ -z "$gofiles" ] && exit 0 - -unformatted=$(gofmt -l $gofiles) -[ -z "$unformatted" ] && exit 0 - -# Some files are not gofmt'd. Print message and fail. - -echo >&2 "Go files must be formatted with gofmt. Please run:" -for fn in $unformatted; do - echo >&2 " gofmt -w $PWD/$fn" -done - -exit 1 -- GitLab From abf8e355a8fe4b77009cb55f6bef11f74e6ade03 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Wed, 23 Jan 2019 17:33:35 +0000 Subject: [PATCH 0266/1679] runtime: use MADV_FREE_REUSABLE on darwin Currently on darwin we use MADV_FREE, which unfortunately doesn't result in a change in the process's RSS until pages actually get kicked out, which the OS is free to do lazily (e.g. until it finds itself under memory pressure). To remedy this, we instead use MADV_FREE_REUSABLE which has similar semantics, except that it also sets a reusable bit on each page so the process's RSS gets reported more accurately. The one caveat is for every time we call MADV_FREE_REUSABLE on a region we must call MADV_FREE_REUSE to keep the kernel's accounting updated. Also, because this change requires adding new constants that only exist on darwin, it splits mem_bsd.go into mem_bsd.go and mem_darwin.go. Fixes #29844. Change-Id: Idb6421698511138a430807bcbbd1516cd57557c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/159117 Reviewed-by: Brad Fitzpatrick Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot --- src/runtime/defs_darwin.go | 6 ++- src/runtime/defs_darwin_386.go | 6 ++- src/runtime/defs_darwin_amd64.go | 6 ++- src/runtime/defs_darwin_arm.go | 6 ++- src/runtime/defs_darwin_arm64.go | 6 ++- src/runtime/mem_bsd.go | 16 +------ src/runtime/mem_darwin.go | 80 ++++++++++++++++++++++++++++++++ 7 files changed, 102 insertions(+), 24 deletions(-) create mode 100644 src/runtime/mem_darwin.go diff --git a/src/runtime/defs_darwin.go b/src/runtime/defs_darwin.go index d5dc7944ee..61ae7a4186 100644 --- a/src/runtime/defs_darwin.go +++ b/src/runtime/defs_darwin.go @@ -41,8 +41,10 @@ const ( MAP_PRIVATE = C.MAP_PRIVATE MAP_FIXED = C.MAP_FIXED - MADV_DONTNEED = C.MADV_DONTNEED - MADV_FREE = C.MADV_FREE + MADV_DONTNEED = C.MADV_DONTNEED + MADV_FREE = C.MADV_FREE + MADV_FREE_REUSABLE = C.MADV_FREE_REUSABLE + MADV_FREE_REUSE = C.MADV_FREE_REUSE SA_SIGINFO = C.SA_SIGINFO SA_RESTART = C.SA_RESTART diff --git a/src/runtime/defs_darwin_386.go b/src/runtime/defs_darwin_386.go index 24a6f15ca7..ae56d154fa 100644 --- a/src/runtime/defs_darwin_386.go +++ b/src/runtime/defs_darwin_386.go @@ -19,8 +19,10 @@ const ( _MAP_PRIVATE = 0x2 _MAP_FIXED = 0x10 - _MADV_DONTNEED = 0x4 - _MADV_FREE = 0x5 + _MADV_DONTNEED = 0x4 + _MADV_FREE = 0x5 + _MADV_FREE_REUSABLE = 0x7 + _MADV_FREE_REUSE = 0x8 _SA_SIGINFO = 0x40 _SA_RESTART = 0x2 diff --git a/src/runtime/defs_darwin_amd64.go b/src/runtime/defs_darwin_amd64.go index dc4faeb770..a339ebd4c6 100644 --- a/src/runtime/defs_darwin_amd64.go +++ b/src/runtime/defs_darwin_amd64.go @@ -19,8 +19,10 @@ const ( _MAP_PRIVATE = 0x2 _MAP_FIXED = 0x10 - _MADV_DONTNEED = 0x4 - _MADV_FREE = 0x5 + _MADV_DONTNEED = 0x4 + _MADV_FREE = 0x5 + _MADV_FREE_REUSABLE = 0x7 + _MADV_FREE_REUSE = 0x8 _SA_SIGINFO = 0x40 _SA_RESTART = 0x2 diff --git a/src/runtime/defs_darwin_arm.go b/src/runtime/defs_darwin_arm.go index 52dfbd04b7..148b0a764e 100644 --- a/src/runtime/defs_darwin_arm.go +++ b/src/runtime/defs_darwin_arm.go @@ -21,8 +21,10 @@ const ( _MAP_PRIVATE = 0x2 _MAP_FIXED = 0x10 - _MADV_DONTNEED = 0x4 - _MADV_FREE = 0x5 + _MADV_DONTNEED = 0x4 + _MADV_FREE = 0x5 + _MADV_FREE_REUSABLE = 0x7 + _MADV_FREE_REUSE = 0x8 _SA_SIGINFO = 0x40 _SA_RESTART = 0x2 diff --git a/src/runtime/defs_darwin_arm64.go b/src/runtime/defs_darwin_arm64.go index fb5acaca3d..46e6d9ff8c 100644 --- a/src/runtime/defs_darwin_arm64.go +++ b/src/runtime/defs_darwin_arm64.go @@ -19,8 +19,10 @@ const ( _MAP_PRIVATE = 0x2 _MAP_FIXED = 0x10 - _MADV_DONTNEED = 0x4 - _MADV_FREE = 0x5 + _MADV_DONTNEED = 0x4 + _MADV_FREE = 0x5 + _MADV_FREE_REUSABLE = 0x7 + _MADV_FREE_REUSE = 0x8 _SA_SIGINFO = 0x40 _SA_RESTART = 0x2 diff --git a/src/runtime/mem_bsd.go b/src/runtime/mem_bsd.go index 796bb44223..cc70e806ea 100644 --- a/src/runtime/mem_bsd.go +++ b/src/runtime/mem_bsd.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd nacl netbsd openbsd solaris +// +build dragonfly freebsd nacl netbsd openbsd solaris package runtime @@ -42,19 +42,7 @@ func sysFault(v unsafe.Pointer, n uintptr) { } func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer { - flags := int32(_MAP_ANON | _MAP_PRIVATE) - if raceenabled && GOOS == "darwin" { - // Currently the race detector expects memory to live within a certain - // range, and on Darwin 10.10 mmap is prone to ignoring hints, more so - // than later versions and other BSDs (#26475). So, even though it's - // potentially dangerous to MAP_FIXED, we do it in the race detection - // case because it'll help maintain the race detector's invariants. - // - // TODO(mknyszek): Drop this once support for Darwin 10.10 is dropped, - // and reconsider this when #24133 is addressed. - flags |= _MAP_FIXED - } - p, err := mmap(v, n, _PROT_NONE, flags, -1, 0) + p, err := mmap(v, n, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE, -1, 0) if err != 0 { return nil } diff --git a/src/runtime/mem_darwin.go b/src/runtime/mem_darwin.go new file mode 100644 index 0000000000..fd5bba9aa7 --- /dev/null +++ b/src/runtime/mem_darwin.go @@ -0,0 +1,80 @@ +// Copyright 2018 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 runtime + +import ( + "unsafe" +) + +// Don't split the stack as this function may be invoked without a valid G, +// which prevents us from allocating more stack. +//go:nosplit +func sysAlloc(n uintptr, sysStat *uint64) unsafe.Pointer { + v, err := mmap(nil, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_PRIVATE, -1, 0) + if err != 0 { + return nil + } + mSysStatInc(sysStat, n) + return v +} + +func sysUnused(v unsafe.Pointer, n uintptr) { + // MADV_FREE_REUSABLE is like MADV_FREE except it also propagates + // accounting information about the process to task_info. + madvise(v, n, _MADV_FREE_REUSABLE) +} + +func sysUsed(v unsafe.Pointer, n uintptr) { + // MADV_FREE_REUSE is necessary to keep the kernel's accounting + // accurate. If called on any memory region that hasn't been + // MADV_FREE_REUSABLE'd, it's a no-op. + madvise(v, n, _MADV_FREE_REUSE) +} + +// Don't split the stack as this function may be invoked without a valid G, +// which prevents us from allocating more stack. +//go:nosplit +func sysFree(v unsafe.Pointer, n uintptr, sysStat *uint64) { + mSysStatDec(sysStat, n) + munmap(v, n) +} + +func sysFault(v unsafe.Pointer, n uintptr) { + mmap(v, n, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE|_MAP_FIXED, -1, 0) +} + +func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer { + flags := int32(_MAP_ANON | _MAP_PRIVATE) + if raceenabled { + // Currently the race detector expects memory to live within a certain + // range, and on Darwin 10.10 mmap is prone to ignoring hints, moreso + // than later versions and other BSDs (#26475). So, even though it's + // potentially dangerous to MAP_FIXED, we do it in the race detection + // case because it'll help maintain the race detector's invariants. + // + // TODO(mknyszek): Drop this once support for Darwin 10.10 is dropped, + // and reconsider this when #24133 is addressed. + flags |= _MAP_FIXED + } + p, err := mmap(v, n, _PROT_NONE, flags, -1, 0) + if err != 0 { + return nil + } + return p +} + +const _ENOMEM = 12 + +func sysMap(v unsafe.Pointer, n uintptr, sysStat *uint64) { + mSysStatInc(sysStat, n) + + p, err := mmap(v, n, _PROT_READ|_PROT_WRITE, _MAP_ANON|_MAP_FIXED|_MAP_PRIVATE, -1, 0) + if err == _ENOMEM { + throw("runtime: out of memory") + } + if p != v || err != 0 { + throw("runtime: cannot map pages in arena address space") + } +} -- GitLab From 87cc56718adb43340b24fcf9e5f14d87c028ce88 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 3 Mar 2019 13:08:40 -0800 Subject: [PATCH 0267/1679] math/big: optimize shlVU_g and shrVU_g MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Special case shifts by zero. Provide hints to the compiler that shifts are bounded. There are no existing benchmarks for shifts, but the Float implementation uses shifts, so we can use those. Benchmarks on amd64 with -tags=math_big_pure_go. name old time/op new time/op delta FloatString/100-8 869ns ± 3% 872ns ± 4% +0.40% (p=0.001 n=94+83) FloatString/1000-8 26.5µs ± 1% 26.4µs ± 1% -0.46% (p=0.000 n=87+96) FloatString/10000-8 2.18ms ± 2% 2.18ms ± 2% ~ (p=0.687 n=90+89) FloatString/100000-8 200ms ± 7% 197ms ± 5% -1.47% (p=0.000 n=100+90) FloatAdd/10-8 65.9ns ± 4% 64.0ns ± 4% -2.94% (p=0.000 n=92+93) FloatAdd/100-8 71.3ns ± 4% 67.4ns ± 4% -5.51% (p=0.000 n=96+93) FloatAdd/1000-8 128ns ± 1% 121ns ± 0% -5.69% (p=0.000 n=91+80) FloatAdd/10000-8 718ns ± 4% 626ns ± 4% -12.83% (p=0.000 n=99+99) FloatAdd/100000-8 6.43µs ± 3% 5.50µs ± 1% -14.50% (p=0.000 n=98+83) FloatSub/10-8 57.7ns ± 2% 57.0ns ± 4% -1.20% (p=0.000 n=89+96) FloatSub/100-8 59.9ns ± 3% 58.7ns ± 4% -2.10% (p=0.000 n=100+98) FloatSub/1000-8 94.5ns ± 1% 88.6ns ± 0% -6.16% (p=0.000 n=74+70) FloatSub/10000-8 456ns ± 1% 416ns ± 5% -8.83% (p=0.000 n=87+95) FloatSub/100000-8 4.00µs ± 1% 3.57µs ± 1% -10.87% (p=0.000 n=68+85) FloatSqrt/64-8 585ns ± 1% 579ns ± 1% -0.99% (p=0.000 n=92+90) FloatSqrt/128-8 1.26µs ± 1% 1.23µs ± 2% -2.42% (p=0.000 n=91+81) FloatSqrt/256-8 1.45µs ± 3% 1.40µs ± 1% -3.61% (p=0.000 n=96+90) FloatSqrt/1000-8 4.03µs ± 1% 3.91µs ± 1% -3.05% (p=0.000 n=90+93) FloatSqrt/10000-8 48.0µs ± 0% 47.3µs ± 1% -1.55% (p=0.000 n=90+90) FloatSqrt/100000-8 1.23ms ± 3% 1.22ms ± 4% -1.00% (p=0.000 n=99+99) FloatSqrt/1000000-8 96.7ms ± 4% 98.0ms ±10% ~ (p=0.322 n=89+99) Change-Id: I0f941c05b7c324256d7f0674559b6ba906e92ba8 Reviewed-on: https://go-review.googlesource.com/c/go/+/164967 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith.go | 54 +++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/math/big/arith.go b/src/math/big/arith.go index f9db9118eb..611193ef18 100644 --- a/src/math/big/arith.go +++ b/src/math/big/arith.go @@ -204,32 +204,46 @@ func subVW_g(z, x []Word, y Word) (c Word) { } func shlVU_g(z, x []Word, s uint) (c Word) { - if n := len(z); n > 0 { - ŝ := _W - s - w1 := x[n-1] - c = w1 >> ŝ - for i := n - 1; i > 0; i-- { - w := w1 - w1 = x[i-1] - z[i] = w<>ŝ - } - z[0] = w1 << s + if s == 0 { + copy(z, x) + return + } + if len(z) == 0 { + return + } + s &= _W - 1 // hint to the compiler that shifts by s don't need guard code + ŝ := _W - s + ŝ &= _W - 1 // ditto + w1 := x[len(z)-1] + c = w1 >> ŝ + for i := len(z) - 1; i > 0; i-- { + w := w1 + w1 = x[i-1] + z[i] = w<>ŝ } + z[0] = w1 << s return } func shrVU_g(z, x []Word, s uint) (c Word) { - if n := len(z); n > 0 { - ŝ := _W - s - w1 := x[0] - c = w1 << ŝ - for i := 0; i < n-1; i++ { - w := w1 - w1 = x[i+1] - z[i] = w>>s | w1<<ŝ - } - z[n-1] = w1 >> s + if s == 0 { + copy(z, x) + return + } + if len(z) == 0 { + return + } + s &= _W - 1 // hint to the compiler that shifts by s don't need guard code + ŝ := _W - s + ŝ &= _W - 1 // ditto + w1 := x[0] + c = w1 << ŝ + for i := 0; i < len(z)-1; i++ { + w := w1 + w1 = x[i+1] + z[i] = w>>s | w1<<ŝ } + z[len(z)-1] = w1 >> s return } -- GitLab From c74659290a473cf932ec6bc96bfa7e96a930676e Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Tue, 5 Mar 2019 03:10:38 +0800 Subject: [PATCH 0268/1679] os: remove unreadable directories in RemoveAll Fixes #30555 Change-Id: Ib894b4f3cdba23a18a69c9470cf69ceb83591a4d Reviewed-on: https://go-review.googlesource.com/c/go/+/165057 Run-TryBot: Baokun Lee TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/os/removeall_at.go | 3 ++- src/os/removeall_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 0b7d5efb7a..94232cf556 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -92,7 +92,8 @@ func removeAllFrom(parent *File, path string) error { if IsNotExist(err) { return nil } - return err + recurseErr = err + break } names, readErr := file.Readdirnames(request) diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index 9dab0d4bb1..21371d8776 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -372,3 +372,33 @@ func TestRemoveAllButReadOnly(t *testing.T) { } } } + +func TestRemoveUnreadableDir(t *testing.T) { + switch runtime.GOOS { + case "nacl", "js", "windows": + t.Skipf("skipping test on %s", runtime.GOOS) + } + + if Getuid() == 0 { + t.Skip("skipping test when running as root") + } + + t.Parallel() + + tempDir, err := ioutil.TempDir("", "TestRemoveAllButReadOnly-") + if err != nil { + t.Fatal(err) + } + defer RemoveAll(tempDir) + + target := filepath.Join(tempDir, "d0", "d1", "d2") + if err := MkdirAll(target, 0755); err != nil { + t.Fatal(err) + } + if err := Chmod(target, 0300); err != nil { + t.Fatal(err) + } + if err := RemoveAll(filepath.Join(tempDir, "d0")); err != nil { + t.Fatal(err) + } +} -- GitLab From d5edbcac9857cd77723f153d03c55c87923d714f Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 2 Mar 2019 14:42:51 -0800 Subject: [PATCH 0269/1679] math/big: rewrite pure Go implementations to use math/bits MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While we're here, delete addWW_g and subWW_g, per the TODO. They are now obsolete. Benchmarks on amd64 with -tags=math_big_pure_go. name old time/op new time/op delta AddVV/1-8 5.24ns ± 2% 5.12ns ± 1% -2.11% (p=0.000 n=82+87) AddVV/2-8 6.44ns ± 1% 6.33ns ± 2% -1.82% (p=0.000 n=77+82) AddVV/3-8 7.89ns ± 8% 6.97ns ± 4% -11.71% (p=0.000 n=100+96) AddVV/4-8 8.60ns ± 0% 7.72ns ± 4% -10.24% (p=0.000 n=90+96) AddVV/5-8 10.3ns ± 4% 8.5ns ± 1% -17.02% (p=0.000 n=96+91) AddVV/10-8 16.2ns ± 5% 12.8ns ± 1% -21.11% (p=0.000 n=97+86) AddVV/100-8 148ns ± 1% 117ns ± 5% -21.07% (p=0.000 n=66+98) AddVV/1000-8 1.41µs ± 4% 1.13µs ± 3% -19.90% (p=0.000 n=97+97) AddVV/10000-8 14.2µs ± 5% 11.2µs ± 1% -20.82% (p=0.000 n=99+84) AddVV/100000-8 142µs ± 4% 113µs ± 4% -20.40% (p=0.000 n=91+92) SubVV/1-8 5.29ns ± 1% 5.11ns ± 0% -3.30% (p=0.000 n=87+88) SubVV/2-8 6.36ns ± 4% 6.33ns ± 2% -0.56% (p=0.002 n=98+73) SubVV/3-8 7.58ns ± 5% 6.98ns ± 4% -8.01% (p=0.000 n=97+91) SubVV/4-8 8.61ns ± 3% 7.98ns ± 2% -7.31% (p=0.000 n=95+83) SubVV/5-8 10.6ns ± 2% 8.5ns ± 1% -19.56% (p=0.000 n=79+89) SubVV/10-8 16.3ns ± 4% 12.7ns ± 1% -21.97% (p=0.000 n=98+82) SubVV/100-8 124ns ± 1% 118ns ± 1% -4.83% (p=0.000 n=85+81) SubVV/1000-8 1.14µs ± 5% 1.12µs ± 2% -1.17% (p=0.000 n=97+81) SubVV/10000-8 11.6µs ±10% 11.2µs ± 1% -3.39% (p=0.000 n=100+84) SubVV/100000-8 114µs ± 6% 114µs ± 5% ~ (p=0.396 n=83+94) AddVW/1-8 4.04ns ± 4% 4.34ns ± 4% +7.57% (p=0.000 n=96+98) AddVW/2-8 4.34ns ± 5% 4.40ns ± 5% +1.40% (p=0.000 n=99+98) AddVW/3-8 5.43ns ± 0% 5.54ns ± 2% +1.97% (p=0.000 n=85+94) AddVW/4-8 6.23ns ± 1% 6.18ns ± 2% -0.66% (p=0.000 n=77+78) AddVW/5-8 6.78ns ± 2% 6.90ns ± 4% +1.77% (p=0.000 n=80+99) AddVW/10-8 10.5ns ± 4% 9.9ns ± 1% -5.77% (p=0.000 n=97+69) AddVW/100-8 114ns ± 3% 91ns ± 0% -20.38% (p=0.000 n=98+77) AddVW/1000-8 1.12µs ± 1% 0.87µs ± 1% -22.80% (p=0.000 n=82+68) AddVW/10000-8 11.2µs ± 2% 8.5µs ± 5% -23.85% (p=0.000 n=85+100) AddVW/100000-8 112µs ± 2% 85µs ± 5% -24.22% (p=0.000 n=71+96) SubVW/1-8 4.09ns ± 2% 4.18ns ± 4% +2.32% (p=0.000 n=78+96) SubVW/2-8 4.59ns ± 5% 4.52ns ± 7% -1.54% (p=0.000 n=98+94) SubVW/3-8 5.41ns ±10% 5.55ns ± 1% +2.48% (p=0.000 n=100+89) SubVW/4-8 6.51ns ± 2% 6.19ns ± 0% -4.85% (p=0.000 n=97+81) SubVW/5-8 7.25ns ± 3% 6.90ns ± 4% -4.93% (p=0.000 n=97+96) SubVW/10-8 10.6ns ± 4% 9.8ns ± 2% -7.32% (p=0.000 n=95+96) SubVW/100-8 90.4ns ± 0% 90.8ns ± 0% +0.43% (p=0.000 n=83+78) SubVW/1000-8 853ns ± 4% 857ns ± 2% +0.42% (p=0.000 n=100+98) SubVW/10000-8 8.52µs ± 4% 8.53µs ± 2% ~ (p=0.061 n=99+97) SubVW/100000-8 84.8µs ± 5% 84.2µs ± 2% -0.78% (p=0.000 n=99+93) AddMulVVW/1-8 8.73ns ± 0% 5.33ns ± 3% -38.91% (p=0.000 n=91+96) AddMulVVW/2-8 14.8ns ± 3% 6.5ns ± 2% -56.33% (p=0.000 n=100+79) AddMulVVW/3-8 18.6ns ± 2% 7.8ns ± 5% -57.84% (p=0.000 n=89+96) AddMulVVW/4-8 24.0ns ± 2% 9.8ns ± 0% -59.09% (p=0.000 n=95+67) AddMulVVW/5-8 29.0ns ± 2% 11.5ns ± 5% -60.44% (p=0.000 n=90+97) AddMulVVW/10-8 54.1ns ± 0% 18.8ns ± 1% -65.37% (p=0.000 n=82+84) AddMulVVW/100-8 508ns ± 2% 165ns ± 4% -67.62% (p=0.000 n=72+98) AddMulVVW/1000-8 4.96µs ± 3% 1.55µs ± 1% -68.86% (p=0.000 n=99+91) AddMulVVW/10000-8 50.0µs ± 4% 15.5µs ± 4% -68.95% (p=0.000 n=97+97) AddMulVVW/100000-8 491µs ± 1% 156µs ± 8% -68.22% (p=0.000 n=79+95) Change-Id: I4c6ae0b4065f371aea8103f6a85d9e9274bf01d0 Reviewed-on: https://go-review.googlesource.com/c/go/+/164965 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith.go | 162 ++++++------------------------------- src/math/big/arith_test.go | 42 ---------- 2 files changed, 26 insertions(+), 178 deletions(-) diff --git a/src/math/big/arith.go b/src/math/big/arith.go index 611193ef18..541694c670 100644 --- a/src/math/big/arith.go +++ b/src/math/big/arith.go @@ -19,10 +19,6 @@ const ( _W = bits.UintSize // word size in bits _B = 1 << _W // digit base _M = _B - 1 // digit mask - - _W2 = _W / 2 // half word size in bits - _B2 = 1 << _W2 // half digit base - _M2 = _B2 - 1 // half digit mask ) // ---------------------------------------------------------------------------- @@ -30,50 +26,18 @@ const ( // // These operations are used by the vector operations below. -// z1<<_W + z0 = x+y+c, with c == 0 or 1 -func addWW_g(x, y, c Word) (z1, z0 Word) { - yc := y + c - z0 = x + yc - if z0 < x || yc < y { - z1 = 1 - } - return -} - -// z1<<_W + z0 = x-y-c, with c == 0 or 1 -func subWW_g(x, y, c Word) (z1, z0 Word) { - yc := y + c - z0 = x - yc - if z0 > x || yc < y { - z1 = 1 - } - return -} - // z1<<_W + z0 = x*y -// Adapted from Warren, Hacker's Delight, p. 132. func mulWW_g(x, y Word) (z1, z0 Word) { - x0 := x & _M2 - x1 := x >> _W2 - y0 := y & _M2 - y1 := y >> _W2 - w0 := x0 * y0 - t := x1*y0 + w0>>_W2 - w1 := t & _M2 - w2 := t >> _W2 - w1 += x0 * y1 - z1 = x1*y1 + w2 + w1>>_W2 - z0 = x * y - return + hi, lo := bits.Mul(uint(x), uint(y)) + return Word(hi), Word(lo) } // z1<<_W + z0 = x*y + c func mulAddWWW_g(x, y, c Word) (z1, z0 Word) { - z1, zz0 := mulWW_g(x, y) - if z0 = zz0 + c; z0 < zz0 { - z1++ - } - return + hi, lo := bits.Mul(uint(x), uint(y)) + var cc uint + lo, cc = bits.Add(lo, uint(c), 0) + return Word(hi + cc), Word(lo) } // nlz returns the number of leading zeros in x. @@ -83,122 +47,48 @@ func nlz(x Word) uint { } // q = (u1<<_W + u0 - r)/v -// Adapted from Warren, Hacker's Delight, p. 152. func divWW_g(u1, u0, v Word) (q, r Word) { - if u1 >= v { - return 1<<_W - 1, 1<<_W - 1 - } - - s := nlz(v) - v <<= s - - vn1 := v >> _W2 - vn0 := v & _M2 - un32 := u1<>(_W-s) - un10 := u0 << s - un1 := un10 >> _W2 - un0 := un10 & _M2 - q1 := un32 / vn1 - rhat := un32 - q1*vn1 - - for q1 >= _B2 || q1*vn0 > _B2*rhat+un1 { - q1-- - rhat += vn1 - if rhat >= _B2 { - break - } - } - - un21 := un32*_B2 + un1 - q1*v - q0 := un21 / vn1 - rhat = un21 - q0*vn1 - - for q0 >= _B2 || q0*vn0 > _B2*rhat+un0 { - q0-- - rhat += vn1 - if rhat >= _B2 { - break - } - } - - return q1*_B2 + q0, (un21*_B2 + un0 - q0*v) >> s + qq, rr := bits.Div(uint(u1), uint(u0), uint(v)) + return Word(qq), Word(rr) } -// Keep for performance debugging. -// Using addWW_g is likely slower. -const use_addWW_g = false - // The resulting carry c is either 0 or 1. func addVV_g(z, x, y []Word) (c Word) { - if use_addWW_g { - for i := range z { - c, z[i] = addWW_g(x[i], y[i], c) - } - return - } - - for i, xi := range x[:len(z)] { - yi := y[i] - zi := xi + yi + c - z[i] = zi - // see "Hacker's Delight", section 2-12 (overflow detection) - c = (xi&yi | (xi|yi)&^zi) >> (_W - 1) + for i := range x[:len(z)] { + zi, cc := bits.Add(uint(x[i]), uint(y[i]), uint(c)) + z[i] = Word(zi) + c = Word(cc) } return } // The resulting carry c is either 0 or 1. func subVV_g(z, x, y []Word) (c Word) { - if use_addWW_g { - for i := range z { - c, z[i] = subWW_g(x[i], y[i], c) - } - return - } - - for i, xi := range x[:len(z)] { - yi := y[i] - zi := xi - yi - c - z[i] = zi - // see "Hacker's Delight", section 2-12 (overflow detection) - c = (yi&^xi | (yi|^xi)&zi) >> (_W - 1) + for i := range x[:len(z)] { + zi, cc := bits.Sub(uint(x[i]), uint(y[i]), uint(c)) + z[i] = Word(zi) + c = Word(cc) } return } // The resulting carry c is either 0 or 1. func addVW_g(z, x []Word, y Word) (c Word) { - if use_addWW_g { - c = y - for i := range z { - c, z[i] = addWW_g(x[i], c, 0) - } - return - } - c = y - for i, xi := range x[:len(z)] { - zi := xi + c - z[i] = zi - c = xi &^ zi >> (_W - 1) + for i := range x[:len(z)] { + zi, cc := bits.Add(uint(x[i]), uint(c), 0) + z[i] = Word(zi) + c = Word(cc) } return } func subVW_g(z, x []Word, y Word) (c Word) { - if use_addWW_g { - c = y - for i := range z { - c, z[i] = subWW_g(x[i], c, 0) - } - return - } - c = y - for i, xi := range x[:len(z)] { - zi := xi - c - z[i] = zi - c = (zi &^ xi) >> (_W - 1) + for i := range x[:len(z)] { + zi, cc := bits.Sub(uint(x[i]), uint(c), 0) + z[i] = Word(zi) + c = Word(cc) } return } @@ -255,11 +145,11 @@ func mulAddVWW_g(z, x []Word, y, r Word) (c Word) { return } -// TODO(gri) Remove use of addWW_g here and then we can remove addWW_g and subWW_g. func addMulVVW_g(z, x []Word, y Word) (c Word) { for i := range z { z1, z0 := mulAddWWW_g(x[i], y, z[i]) - c, z[i] = addWW_g(z0, c, 0) + lo, cc := bits.Add(uint(z0), uint(c), 0) + c, z[i] = Word(cc), Word(lo) c += z1 } return diff --git a/src/math/big/arith_test.go b/src/math/big/arith_test.go index cf386b3b38..8a64321102 100644 --- a/src/math/big/arith_test.go +++ b/src/math/big/arith_test.go @@ -14,48 +14,6 @@ import ( var isRaceBuilder = strings.HasSuffix(testenv.Builder(), "-race") -type funWW func(x, y, c Word) (z1, z0 Word) -type argWW struct { - x, y, c, z1, z0 Word -} - -var sumWW = []argWW{ - {0, 0, 0, 0, 0}, - {0, 1, 0, 0, 1}, - {0, 0, 1, 0, 1}, - {0, 1, 1, 0, 2}, - {12345, 67890, 0, 0, 80235}, - {12345, 67890, 1, 0, 80236}, - {_M, 1, 0, 1, 0}, - {_M, 0, 1, 1, 0}, - {_M, 1, 1, 1, 1}, - {_M, _M, 0, 1, _M - 1}, - {_M, _M, 1, 1, _M}, -} - -func testFunWW(t *testing.T, msg string, f funWW, a argWW) { - z1, z0 := f(a.x, a.y, a.c) - if z1 != a.z1 || z0 != a.z0 { - t.Errorf("%s%+v\n\tgot z1:z0 = %#x:%#x; want %#x:%#x", msg, a, z1, z0, a.z1, a.z0) - } -} - -func TestFunWW(t *testing.T) { - for _, a := range sumWW { - arg := a - testFunWW(t, "addWW_g", addWW_g, arg) - - arg = argWW{a.y, a.x, a.c, a.z1, a.z0} - testFunWW(t, "addWW_g symmetric", addWW_g, arg) - - arg = argWW{a.z0, a.x, a.c, a.z1, a.y} - testFunWW(t, "subWW_g", subWW_g, arg) - - arg = argWW{a.z0, a.y, a.c, a.z1, a.x} - testFunWW(t, "subWW_g symmetric", subWW_g, arg) - } -} - type funVV func(z, x, y []Word) (c Word) type argVV struct { z, x, y nat -- GitLab From a1f7dbf0aa5c9c7bd6677c53d68aa991e4b18797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Sun, 13 Jan 2019 18:10:19 +0100 Subject: [PATCH 0270/1679] strconv: simplify (*extFloat).Multiply using math/bits.Mul64 This method was using a handwritten long multiplication of uint64s. Since implementation of #24813 we can remove it and replace it by Mul64 from math/bits. This brings a small speedup for 64-bit platforms. Benchmarks on Haswell Celeron 2955U. benchmark old ns/op new ns/op delta BenchmarkAppendFloat/Decimal-2 127 127 +0.00% BenchmarkAppendFloat/Float-2 340 317 -6.76% BenchmarkAppendFloat/Exp-2 258 233 -9.69% BenchmarkAppendFloat/NegExp-2 256 231 -9.77% BenchmarkAppendFloat/Big-2 402 375 -6.72% BenchmarkAppendFloat/BinaryExp-2 113 114 +0.88% BenchmarkAppendFloat/32Integer-2 125 125 +0.00% BenchmarkAppendFloat/32ExactFraction-2 274 249 -9.12% BenchmarkAppendFloat/32Point-2 339 317 -6.49% BenchmarkAppendFloat/32Exp-2 255 229 -10.20% BenchmarkAppendFloat/32NegExp-2 254 229 -9.84% BenchmarkAppendFloat/64Fixed1-2 165 154 -6.67% BenchmarkAppendFloat/64Fixed2-2 184 176 -4.35% BenchmarkAppendFloat/64Fixed3-2 168 158 -5.95% BenchmarkAppendFloat/64Fixed4-2 187 177 -5.35% BenchmarkAppendFloat/Slowpath64-2 84977 84883 -0.11% Change-Id: If05784e856289b3b7bf136567882e7ee10234756 Reviewed-on: https://go-review.googlesource.com/c/go/+/157717 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/strconv/extfloat.go | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/strconv/extfloat.go b/src/strconv/extfloat.go index 32d3340f5f..2a2dd7a408 100644 --- a/src/strconv/extfloat.go +++ b/src/strconv/extfloat.go @@ -214,20 +214,9 @@ func (f *extFloat) Normalize() uint { // Multiply sets f to the product f*g: the result is correctly rounded, // but not normalized. func (f *extFloat) Multiply(g extFloat) { - fhi, flo := f.mant>>32, uint64(uint32(f.mant)) - ghi, glo := g.mant>>32, uint64(uint32(g.mant)) - - // Cross products. - cross1 := fhi * glo - cross2 := flo * ghi - - // f.mant*g.mant is fhi*ghi << 64 + (cross1+cross2) << 32 + flo*glo - f.mant = fhi*ghi + (cross1 >> 32) + (cross2 >> 32) - rem := uint64(uint32(cross1)) + uint64(uint32(cross2)) + ((flo * glo) >> 32) + hi, lo := bits.Mul64(f.mant, g.mant) // Round up. - rem += (1 << 31) - - f.mant += (rem >> 32) + f.mant = hi + (lo >> 63) f.exp = f.exp + g.exp + 64 } -- GitLab From 6b04550820ac70283d856ceb8cb84d3883862c72 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Mon, 4 Mar 2019 15:02:45 -0800 Subject: [PATCH 0271/1679] testing: fix missing verb in StartTimer doc Fixes StartTimer's doc with the verb 'be' that was previously missing in 'can also used'. Change-Id: I4b3e6103fbf62d676056d32fcce4618536b7c05c Reviewed-on: https://go-review.googlesource.com/c/go/+/165117 Reviewed-by: Brad Fitzpatrick --- src/testing/benchmark.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 8dd8cbc17e..24bac313d2 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -104,7 +104,7 @@ type B struct { } // StartTimer starts timing a test. This function is called automatically -// before a benchmark starts, but it can also used to resume timing after +// before a benchmark starts, but it can also be used to resume timing after // a call to StopTimer. func (b *B) StartTimer() { if !b.timerOn { -- GitLab From 294edb272d5d145665bdf8b4254609eae0363a8d Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 1 Mar 2019 12:31:18 -0800 Subject: [PATCH 0272/1679] path/filepath: don't discard .. in EvalSymlinks EvalSymlinks was mishandling cases like "/x/../../y" or "../../../x" where there is an extra ".." that goes past the start of the path. Fixes #30520 Change-Id: I07525575f83009032fa1a99aa270c8d42007d276 Reviewed-on: https://go-review.googlesource.com/c/go/+/164762 Reviewed-by: Bryan C. Mills --- src/path/filepath/path_test.go | 100 +++++++++++++++++++++++++++++++++ src/path/filepath/symlink.go | 10 +++- 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/src/path/filepath/path_test.go b/src/path/filepath/path_test.go index 709dccb61b..2d13149f3f 100644 --- a/src/path/filepath/path_test.go +++ b/src/path/filepath/path_test.go @@ -1400,3 +1400,103 @@ func TestIssue29372(t *testing.T) { } } } + +// Issue 30520 part 1. +func TestEvalSymlinksAboveRoot(t *testing.T) { + testenv.MustHaveSymlink(t) + + t.Parallel() + + tmpDir, err := ioutil.TempDir("", "TestEvalSymlinksAboveRoot") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + evalTmpDir, err := filepath.EvalSymlinks(tmpDir) + if err != nil { + t.Fatal(err) + } + + if err := os.Mkdir(filepath.Join(evalTmpDir, "a"), 0777); err != nil { + t.Fatal(err) + } + if err := os.Symlink(filepath.Join(evalTmpDir, "a"), filepath.Join(evalTmpDir, "b")); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(filepath.Join(evalTmpDir, "a", "file"), nil, 0666); err != nil { + t.Fatal(err) + } + + // Count the number of ".." elements to get to the root directory. + vol := filepath.VolumeName(evalTmpDir) + c := strings.Count(evalTmpDir[len(vol):], string(os.PathSeparator)) + var dd []string + for i := 0; i < c+2; i++ { + dd = append(dd, "..") + } + + wantSuffix := strings.Join([]string{"a", "file"}, string(os.PathSeparator)) + + // Try different numbers of "..". + for _, i := range []int{c, c + 1, c + 2} { + check := strings.Join([]string{evalTmpDir, strings.Join(dd[:i], string(os.PathSeparator)), evalTmpDir[len(vol)+1:], "b", "file"}, string(os.PathSeparator)) + if resolved, err := filepath.EvalSymlinks(check); err != nil { + t.Errorf("EvalSymlinks(%q) failed: %v", check, err) + } else if !strings.HasSuffix(resolved, wantSuffix) { + t.Errorf("EvalSymlinks(%q) = %q does not end with %q", check, resolved, wantSuffix) + } else { + t.Logf("EvalSymlinks(%q) = %q", check, resolved) + } + } +} + +// Issue 30520 part 2. +func TestEvalSymlinksAboveRootChdir(t *testing.T) { + testenv.MustHaveSymlink(t) + + tmpDir, err := ioutil.TempDir("", "TestEvalSymlinksAboveRootChdir") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + wd, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + defer os.Chdir(wd) + + if err := os.Chdir(tmpDir); err != nil { + t.Fatal(err) + } + + subdir := filepath.Join("a", "b") + if err := os.MkdirAll(subdir, 0777); err != nil { + t.Fatal(err) + } + if err := os.Symlink(subdir, "c"); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(filepath.Join(subdir, "file"), nil, 0666); err != nil { + t.Fatal(err) + } + + subdir = filepath.Join("d", "e", "f") + if err := os.MkdirAll(subdir, 0777); err != nil { + t.Fatal(err) + } + if err := os.Chdir(subdir); err != nil { + t.Fatal(err) + } + + check := filepath.Join("..", "..", "..", "c", "file") + wantSuffix := filepath.Join("a", "b", "file") + if resolved, err := filepath.EvalSymlinks(check); err != nil { + t.Errorf("EvalSymlinks(%q) failed: %v", check, err) + } else if !strings.HasSuffix(resolved, wantSuffix) { + t.Errorf("EvalSymlinks(%q) = %q does not end with %q", check, resolved, wantSuffix) + } else { + t.Logf("EvalSymlinks(%q) = %q", check, resolved) + } +} diff --git a/src/path/filepath/symlink.go b/src/path/filepath/symlink.go index a08b85a29c..335b315a20 100644 --- a/src/path/filepath/symlink.go +++ b/src/path/filepath/symlink.go @@ -45,18 +45,26 @@ func walkSymlinks(path string) (string, error) { } else if path[start:end] == ".." { // Back up to previous component if possible. // Note that volLen includes any leading slash. + + // Set r to the index of the last slash in dest, + // after the volume. var r int for r = len(dest) - 1; r >= volLen; r-- { if os.IsPathSeparator(dest[r]) { break } } - if r < volLen { + if r < volLen || dest[r+1:] == ".." { + // Either path has no slashes + // (it's empty or just "C:") + // or it ends in a ".." we had to keep. + // Either way, keep this "..". if len(dest) > volLen { dest += pathSeparator } dest += ".." } else { + // Discard everything since the last slash. dest = dest[:r] } continue -- GitLab From c1e2227505cb856bbe9e8274e8427397d5df6c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 15:59:05 +0100 Subject: [PATCH 0273/1679] runtime: use AIX C ABI in asmcgocall The commit fixes asmcgocall in order to use the AIX C ABI. Change-Id: I2a44914a65557a841ea1e12991938af26ad7fd1d Reviewed-on: https://go-review.googlesource.com/c/go/+/164000 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/asm_ppc64x.s | 43 ++++++++++++++++++++++++------------- src/runtime/sys_aix_ppc64.s | 8 ++++++- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index 0a89b57cd8..a1d7ce103c 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -10,6 +10,12 @@ #include "textflag.h" #include "asm_ppc64x.h" +#ifdef GOOS_aix +#define cgoCalleeStackSize 48 +#else +#define cgoCalleeStackSize 32 +#endif + TEXT runtime·rt0_go(SB),NOSPLIT,$0 // R1 = stack; R3 = argc; R4 = argv; R13 = C TLS base pointer @@ -46,14 +52,16 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0 MOVD R13, R5 // arg 2: TLS base pointer MOVD $setg_gcc<>(SB), R4 // arg 1: setg MOVD g, R3 // arg 0: G - // C functions expect 32 bytes of space on caller stack frame - // and a 16-byte aligned R1 + // C functions expect 32 (48 for AIX) bytes of space on caller + // stack frame and a 16-byte aligned R1 MOVD R1, R14 // save current stack - SUB $32, R1 // reserve 32 bytes + SUB $cgoCalleeStackSize, R1 // reserve the callee area RLDCR $0, R1, $~15, R1 // 16-byte align BL (CTR) // may clobber R0, R3-R12 MOVD R14, R1 // restore stack +#ifndef GOOS_aix MOVD 24(R1), R2 +#endif XOR R0, R0 // fix R0 nocgo: @@ -553,6 +561,12 @@ TEXT gosave<>(SB),NOSPLIT|NOFRAME,$0 BL runtime·badctxt(SB) RET +#ifdef GOOS_aix +#define asmcgocallSaveOffset cgoCalleeStackSize + 8 +#else +#define asmcgocallSaveOffset cgoCalleeStackSize +#endif + // func asmcgocall(fn, arg unsafe.Pointer) int32 // Call fn(arg) on the scheduler stack, // aligned appropriately for the gcc ABI. @@ -583,19 +597,21 @@ TEXT ·asmcgocall(SB),NOSPLIT,$0-20 // Now on a scheduling stack (a pthread-created stack). g0: - // Save room for two of our pointers, plus 32 bytes of callee - // save area that lives on the caller stack. #ifdef GOOS_aix // Create a fake LR to improve backtrace. MOVD $runtime·asmcgocall(SB), R6 MOVD R6, 16(R1) + // AIX also save one argument on the stack. + SUB $8, R1 #endif - SUB $48, R1 + // Save room for two of our pointers, plus the callee + // save area that lives on the caller stack. + SUB $(asmcgocallSaveOffset+16), R1 RLDCR $0, R1, $~15, R1 // 16-byte alignment for gcc ABI - MOVD R5, 40(R1) // save old g on stack + MOVD R5, (asmcgocallSaveOffset+8)(R1)// save old g on stack MOVD (g_stack+stack_hi)(R5), R5 SUB R7, R5 - MOVD R5, 32(R1) // save depth in old g stack (can't just save SP, as stack might be copied during a callback) + MOVD R5, asmcgocallSaveOffset(R1) // save depth in old g stack (can't just save SP, as stack might be copied during a callback) #ifdef GOOS_aix MOVD R7, 0(R1) // Save frame pointer to allow manual backtrace with gdb #else @@ -607,24 +623,21 @@ g0: #ifdef GOARCH_ppc64 // ppc64 use elf ABI v1. we must get the real entry address from // first slot of the function descriptor before call. -#ifndef GOOS_aix - // aix just passes the function pointer for the moment, see golang.org/cl/146898 for details. + // Same for AIX. MOVD 8(R12), R2 MOVD (R12), R12 -#endif #endif MOVD R12, CTR MOVD R4, R3 // arg in r3 BL (CTR) - - // C code can clobber R0, so set it back to 0. F27-F31 are + // C code can clobber R0, so set it back to 0. F27-F31 are // callee save, so we don't need to recover those. XOR R0, R0 // Restore g, stack pointer, toc pointer. // R3 is errno, so don't touch it - MOVD 40(R1), g + MOVD (asmcgocallSaveOffset+8)(R1), g MOVD (g_stack+stack_hi)(g), R5 - MOVD 32(R1), R6 + MOVD asmcgocallSaveOffset(R1), R6 SUB R6, R5 #ifndef GOOS_aix MOVD 24(R5), R2 diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index 38e60f99eb..ea7fae0ce7 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -30,7 +30,13 @@ TEXT runtime·callCfunction(SB), NOSPLIT|NOFRAME,$0 // Called by runtime.asmcgocall // It reserves a stack of 288 bytes for the C function. // NOT USING GO CALLING CONVENTION -TEXT runtime·asmsyscall6(SB),NOSPLIT,$256 +// runtime.asmsyscall6 is a function descriptor to the real asmsyscall6. +DATA runtime·asmsyscall6+0(SB)/8, $runtime·_asmsyscall6(SB) +DATA runtime·asmsyscall6+8(SB)/8, $TOC(SB) +DATA runtime·asmsyscall6+16(SB)/8, $0 +GLOBL runtime·asmsyscall6(SB), NOPTR, $24 + +TEXT runtime·_asmsyscall6(SB),NOSPLIT,$256 MOVD R3, 48(R1) // Save libcall for later MOVD libcall_fn(R3), R12 MOVD libcall_args(R3), R9 -- GitLab From b6625758e407eaa2038d7355546689eea9bf4ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 28 Feb 2019 09:55:27 +0100 Subject: [PATCH 0274/1679] cmd/go: pass -X64 to ar on aix/ppc64 On aix/ppc64, ar tool must always have -X64 argument if it aims to create 64 bits archives. This commit also adds the -D flag handler when calling ar with gccgotoolchain, to match gccgo version. Change-Id: I1f5750f8f64a7073780d283567f0b60fc7fa5b97 Reviewed-on: https://go-review.googlesource.com/c/go/+/164417 Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/gccgo.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 053d32dc0b..0ba690fd62 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -203,11 +203,14 @@ func (tools gccgoToolchain) pack(b *Builder, a *Action, afile string, ofiles []s if cfg.Goos == "aix" && cfg.Goarch == "ppc64" { // AIX puts both 32-bit and 64-bit objects in the same archive. // Tell the AIX "ar" command to only care about 64-bit objects. - // AIX "ar" command does not know D option. arArgs = []string{"-X64"} } - - return b.run(a, p.Dir, p.ImportPath, nil, tools.ar(), arArgs, "rc", mkAbs(objdir, afile), absOfiles) + absAfile := mkAbs(objdir, afile) + // Try with D modifier first, then without if that fails. + if b.run(a, p.Dir, p.ImportPath, nil, tools.ar(), arArgs, "rcD", absAfile, absOfiles) != nil { + return b.run(a, p.Dir, p.ImportPath, nil, tools.ar(), arArgs, "rc", absAfile, absOfiles) + } + return nil } func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string, allactions []*Action, buildmode, desc string) error { @@ -249,6 +252,13 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string return nil } + var arArgs []string + if cfg.Goos == "aix" && cfg.Goarch == "ppc64" { + // AIX puts both 32-bit and 64-bit objects in the same archive. + // Tell the AIX "ar" command to only care about 64-bit objects. + arArgs = []string{"-X64"} + } + newID := 0 readAndRemoveCgoFlags := func(archive string) (string, error) { newID++ @@ -266,11 +276,11 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string return "", nil } } - err := b.run(root, root.Objdir, desc, nil, tools.ar(), "x", newArchive, "_cgo_flags") + err := b.run(root, root.Objdir, desc, nil, tools.ar(), arArgs, "x", newArchive, "_cgo_flags") if err != nil { return "", err } - err = b.run(root, ".", desc, nil, tools.ar(), "d", newArchive, "_cgo_flags") + err = b.run(root, ".", desc, nil, tools.ar(), arArgs, "d", newArchive, "_cgo_flags") if err != nil { return "", err } @@ -487,7 +497,7 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string switch buildmode { case "c-archive": - if err := b.run(root, ".", desc, nil, tools.ar(), "rc", realOut, out); err != nil { + if err := b.run(root, ".", desc, nil, tools.ar(), arArgs, "rc", realOut, out); err != nil { return err } } -- GitLab From 4e20d999ec4cc9c6ff8e3d01e79c26a8ba775b7b Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Sun, 3 Mar 2019 13:10:59 +0000 Subject: [PATCH 0275/1679] os: simplify check whether to run subtest of TestRemoveAll Change-Id: Ic5b46cfb393f5ba7b91b3fb73b158b0bc238a532 GitHub-Last-Rev: e5c5db51bcc4848d807b0ce45e85c022492b2013 GitHub-Pull-Request: golang/go#30019 Reviewed-on: https://go-review.googlesource.com/c/go/+/160443 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/os/removeall_test.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index 21371d8776..8690bb5d2a 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -80,16 +80,8 @@ func TestRemoveAll(t *testing.T) { t.Fatalf("Lstat %q succeeded after RemoveAll (third)", path) } - // Determine if we should run the following test. - testit := true - if runtime.GOOS == "windows" { - // Chmod is not supported under windows. - testit = false - } else { - // Test fails as root. - testit = Getuid() != 0 - } - if testit { + // Chmod is not supported under Windows and test fails as root. + if runtime.GOOS != "windows" && Getuid() != 0 { // Make directory with file and subdirectory and trigger error. if err = MkdirAll(dpath, 0777); err != nil { t.Fatalf("MkdirAll %q: %s", dpath, err) -- GitLab From ab0c9510a988027f305d213213ed2eaaabbffe77 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 4 Mar 2019 18:28:51 -0800 Subject: [PATCH 0276/1679] syscall: on ARM GNU/Linux let Pipe fall back to pipe Android O seems to require Pipe to call the pipe2 system call. But kernel version 2.6.23 only supports pipe, not pipe2. So try pipe2 first, then fall back to pipe. Fixes #30549 Change-Id: I3c5d86e8e945a5ec8a0ecea7853302952c0476c4 Reviewed-on: https://go-review.googlesource.com/c/go/+/165217 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/syscall_linux_arm.go | 6 ++++++ src/syscall/zsyscall_linux_arm.go | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/syscall/syscall_linux_arm.go b/src/syscall/syscall_linux_arm.go index 65543193e1..a7acd08033 100644 --- a/src/syscall/syscall_linux_arm.go +++ b/src/syscall/syscall_linux_arm.go @@ -19,12 +19,18 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } +//sysnb pipe(p *[2]_C_int) (err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int + // Try pipe2 first for Android O, then try pipe for kernel 2.6.23. err = pipe2(&pp, 0) + if err == ENOSYS { + err = pipe(&pp) + } p[0] = int(pp[0]) p[1] = int(pp[1]) return diff --git a/src/syscall/zsyscall_linux_arm.go b/src/syscall/zsyscall_linux_arm.go index 3d099aa16d..3d01cd35d5 100644 --- a/src/syscall/zsyscall_linux_arm.go +++ b/src/syscall/zsyscall_linux_arm.go @@ -1138,6 +1138,16 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { -- GitLab From 95d4e6158b4199e1eee957e2c8c934d2cb86c35e Mon Sep 17 00:00:00 2001 From: hengwu0 <41297446+hengwu0@users.noreply.github.com> Date: Tue, 5 Mar 2019 01:24:35 +0000 Subject: [PATCH 0277/1679] cmd/compile: fix mips64 instruction UNPREDICTABLE bug Replace addu with a sll instruction with a definite behavior (sll will discard the upper 32 bits of the 64 bits, then do sign extensions, with certain behavior). It won't have any UNPREDICTABLE expectation. Fixes #30459 Change-Id: Id79085c28c5cc4f86939b4ef08ef4bff46077c45 GitHub-Last-Rev: 03569796a9a64ed6c7d56a5bca966fc62c89b4ff GitHub-Pull-Request: golang/go#30461 Reviewed-on: https://go-review.googlesource.com/c/go/+/164758 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/mips/asm0.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index 458e071e47..c117269c35 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -1120,9 +1120,11 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) { case 1: /* mov r1,r2 ==> OR r1,r0,r2 */ a := AOR if p.As == AMOVW && c.ctxt.Arch.Family == sys.MIPS64 { - a = AADDU // sign-extended to high 32 bits + // on MIPS64, most of the 32-bit instructions have unpredictable behavior, + // but SLL is special that the result is always sign-extended to 64-bit. + a = ASLL } - o1 = OP_RRR(c.oprrr(a), uint32(REGZERO), uint32(p.From.Reg), uint32(p.To.Reg)) + o1 = OP_RRR(c.oprrr(a), uint32(p.From.Reg), uint32(REGZERO), uint32(p.To.Reg)) case 2: /* add/sub r1,[r2],r3 */ r := int(p.Reg) -- GitLab From 29bc4f12581d836a96139c924f16a4987324edd1 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sun, 28 Oct 2018 01:44:09 +0700 Subject: [PATCH 0278/1679] encoding/json: add Path to UnmarshalTypeError MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When parsing nested object, UnmarshalTypeError does not contain actual path to nested field in original JSON. This commit change Field to contain the full path to that field. One can get the Field name by stripping all the leading path elements. Fixes #22369 Change-Id: I6969cc08abe8387a351e3fb2944adfaa0dccad2a Reviewed-on: https://go-review.googlesource.com/c/go/+/145218 Reviewed-by: Daniel Martí Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- src/encoding/json/decode.go | 8 ++++++-- src/encoding/json/decode_test.go | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 731553dca6..3900bcc165 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -125,7 +125,7 @@ type UnmarshalTypeError struct { Type reflect.Type // type of Go value it could not be assigned to Offset int64 // error occurred after reading Offset bytes Struct string // name of the struct type containing the field - Field string // name of the field holding the Go value + Field string // the full path from root node to the field } func (e *UnmarshalTypeError) Error() string { @@ -730,7 +730,11 @@ func (d *decodeState) object(v reflect.Value) error { } subv = subv.Field(i) } - d.errorContext.Field = f.name + if originalErrorContext.Field == "" { + d.errorContext.Field = f.name + } else { + d.errorContext.Field = originalErrorContext.Field + "." + f.name + } d.errorContext.Struct = t } else if d.disallowUnknownFields { d.saveError(fmt.Errorf("json: unknown field %q", key)) diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index 60454c6058..d99d65d763 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -45,6 +45,14 @@ type W struct { S SS } +type P struct { + PP PP +} + +type PP struct { + T T +} + type SS string func (*SS) UnmarshalJSON(data []byte) error { @@ -816,7 +824,7 @@ var unmarshalTests = []unmarshalTest{ err: &UnmarshalTypeError{ Value: "string", Struct: "V", - Field: "F2", + Field: "V.F2", Type: reflect.TypeOf(int32(0)), Offset: 20, }, @@ -827,7 +835,7 @@ var unmarshalTests = []unmarshalTest{ err: &UnmarshalTypeError{ Value: "string", Struct: "V", - Field: "F2", + Field: "V.F2", Type: reflect.TypeOf(int32(0)), Offset: 30, }, @@ -923,6 +931,18 @@ var unmarshalTests = []unmarshalTest{ ptr: new(MustNotUnmarshalText), err: &UnmarshalTypeError{Value: "object", Type: reflect.TypeOf(&MustNotUnmarshalText{}), Offset: 1}, }, + // #22369 + { + in: `{"PP": {"T": {"Y": "bad-type"}}}`, + ptr: new(P), + err: &UnmarshalTypeError{ + Value: "string", + Struct: "T", + Field: "PP.T.Y", + Type: reflect.TypeOf(int(0)), + Offset: 29, + }, + }, } func TestMarshal(t *testing.T) { -- GitLab From 94cbfc2f7f6b375426381c81d8efe78b12e058c3 Mon Sep 17 00:00:00 2001 From: Johan Brandhorst Date: Sun, 3 Mar 2019 20:16:13 +0000 Subject: [PATCH 0279/1679] net/http: support configuring redirect fetch option Adds a magic header value that is translated to the Fetch API redirect option, following existing practices. Updates #26769 Change-Id: Iaf1c9f710de63ea941a360b73f1b4bb725331a35 Reviewed-on: https://go-review.googlesource.com/c/go/+/164666 Reviewed-by: Richard Musiol Reviewed-by: Agniva De Sarker Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot --- src/net/http/roundtrip_js.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/net/http/roundtrip_js.go b/src/net/http/roundtrip_js.go index 1e38b908d3..21d19515fa 100644 --- a/src/net/http/roundtrip_js.go +++ b/src/net/http/roundtrip_js.go @@ -33,6 +33,14 @@ const jsFetchMode = "js.fetch:mode" // Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters const jsFetchCreds = "js.fetch:credentials" +// jsFetchRedirect is a Request.Header map key that, if present, +// signals that the map entry is actually an option to the Fetch API redirect setting. +// Valid values are: "follow", "error", "manual" +// The default is "follow". +// +// Reference: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters +const jsFetchRedirect = "js.fetch:redirect" + // RoundTrip implements the RoundTripper interface using the WHATWG Fetch API. func (t *Transport) RoundTrip(req *Request) (*Response, error) { if useFakeNetwork() { @@ -60,6 +68,10 @@ func (t *Transport) RoundTrip(req *Request) (*Response, error) { opt.Set("mode", h) req.Header.Del(jsFetchMode) } + if h := req.Header.Get(jsFetchRedirect); h != "" { + opt.Set("redirect", h) + req.Header.Del(jsFetchRedirect) + } if ac != js.Undefined() { opt.Set("signal", ac.Get("signal")) } -- GitLab From 4c3f26076b6a9853bcc3c7d7e43726c044ac028a Mon Sep 17 00:00:00 2001 From: Carlo Alberto Ferraris Date: Sat, 10 Nov 2018 08:28:44 +0900 Subject: [PATCH 0280/1679] sync: allow inlining the Mutex.Unlock fast path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make use of the newly-enabled limited midstack inlining. Similar changes will be done in followup CLs. name old time/op new time/op delta MutexUncontended 19.3ns ± 1% 18.9ns ± 0% -1.92% (p=0.000 n=20+19) MutexUncontended-4 5.24ns ± 0% 4.75ns ± 1% -9.25% (p=0.000 n=20+20) MutexUncontended-16 2.10ns ± 0% 2.05ns ± 0% -2.38% (p=0.000 n=15+19) Mutex 19.6ns ± 0% 19.3ns ± 1% -1.92% (p=0.000 n=20+17) Mutex-4 54.6ns ± 5% 52.4ns ± 4% -4.09% (p=0.000 n=20+20) Mutex-16 133ns ± 5% 139ns ± 2% +4.23% (p=0.000 n=20+16) MutexSlack 33.4ns ± 2% 18.9ns ± 1% -43.56% (p=0.000 n=19+20) MutexSlack-4 206ns ± 5% 225ns ± 8% +9.12% (p=0.000 n=20+18) MutexSlack-16 89.4ns ± 1% 98.4ns ± 1% +10.10% (p=0.000 n=18+17) MutexWork 60.5ns ± 0% 58.2ns ± 3% -3.75% (p=0.000 n=12+20) MutexWork-4 105ns ± 5% 103ns ± 7% -1.68% (p=0.007 n=20+20) MutexWork-16 157ns ± 1% 163ns ± 2% +3.90% (p=0.000 n=18+18) MutexWorkSlack 70.2ns ± 5% 57.7ns ± 1% -17.81% (p=0.000 n=19+20) MutexWorkSlack-4 277ns ±13% 276ns ±13% ~ (p=0.682 n=20+19) MutexWorkSlack-16 156ns ± 0% 147ns ± 0% -5.62% (p=0.000 n=16+14) MutexNoSpin 966ns ± 0% 968ns ± 0% +0.11% (p=0.029 n=15+20) MutexNoSpin-4 269ns ± 4% 270ns ± 2% ~ (p=0.807 n=20+19) MutexNoSpin-16 122ns ± 0% 120ns ± 4% -1.63% (p=0.000 n=19+19) MutexSpin 3.13µs ± 0% 3.13µs ± 1% +0.16% (p=0.004 n=18+20) MutexSpin-4 826ns ± 1% 832ns ± 2% +0.74% (p=0.000 n=19+16) MutexSpin-16 397ns ± 1% 395ns ± 0% -0.50% (p=0.000 n=19+17) RWMutexUncontended 71.4ns ± 0% 69.5ns ± 0% -2.72% (p=0.000 n=16+20) RWMutexUncontended-4 18.4ns ± 4% 17.5ns ± 0% -4.92% (p=0.000 n=20+18) RWMutexUncontended-16 8.01ns ± 0% 7.92ns ± 0% -1.15% (p=0.000 n=18+18) RWMutexWrite100 24.9ns ± 0% 24.9ns ± 1% ~ (p=0.099 n=19+20) RWMutexWrite100-4 46.5ns ± 3% 46.2ns ± 4% ~ (p=0.253 n=17+19) RWMutexWrite100-16 68.9ns ± 3% 69.9ns ± 5% +1.46% (p=0.012 n=18+20) RWMutexWrite10 27.1ns ± 0% 27.0ns ± 2% ~ (p=0.128 n=17+20) RWMutexWrite10-4 34.8ns ± 1% 34.7ns ± 2% ~ (p=0.180 n=20+18) RWMutexWrite10-16 37.5ns ± 2% 37.2ns ± 4% -0.89% (p=0.023 n=20+20) RWMutexWorkWrite100 164ns ± 0% 164ns ± 0% ~ (p=0.106 n=12+20) RWMutexWorkWrite100-4 186ns ± 3% 193ns ± 3% +3.46% (p=0.000 n=20+20) RWMutexWorkWrite100-16 204ns ± 2% 210ns ± 3% +2.96% (p=0.000 n=18+20) RWMutexWorkWrite10 153ns ± 0% 153ns ± 0% -0.20% (p=0.017 n=20+19) RWMutexWorkWrite10-4 179ns ± 1% 178ns ± 2% ~ (p=0.215 n=19+20) RWMutexWorkWrite10-16 191ns ± 1% 192ns ± 2% ~ (p=0.166 n=15+19) linux/amd64 bin/go 14630572 (previous commit 14605947, +24625/+0.17%) Change-Id: I3f9d1765801fe0b8deb1bc2728b8bba8a7508e23 Reviewed-on: https://go-review.googlesource.com/c/go/+/148958 Reviewed-by: Brad Fitzpatrick --- src/runtime/sema.go | 12 ++++++------ src/sync/mutex.go | 12 ++++++++++-- src/sync/mutex_test.go | 2 +- src/sync/runtime.go | 4 +++- src/sync/runtime_sema_test.go | 6 +++--- src/sync/rwmutex.go | 4 ++-- src/sync/waitgroup.go | 2 +- test/inline_sync.go | 24 ++++++++++++++++++++++++ 8 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 test/inline_sync.go diff --git a/src/runtime/sema.go b/src/runtime/sema.go index 18e0a398ba..f848515ae2 100644 --- a/src/runtime/sema.go +++ b/src/runtime/sema.go @@ -62,8 +62,8 @@ func poll_runtime_Semacquire(addr *uint32) { } //go:linkname sync_runtime_Semrelease sync.runtime_Semrelease -func sync_runtime_Semrelease(addr *uint32, handoff bool) { - semrelease1(addr, handoff) +func sync_runtime_Semrelease(addr *uint32, handoff bool, skipframes int) { + semrelease1(addr, handoff, skipframes) } //go:linkname sync_runtime_SemacquireMutex sync.runtime_SemacquireMutex @@ -153,10 +153,10 @@ func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags) { } func semrelease(addr *uint32) { - semrelease1(addr, false) + semrelease1(addr, false, 0) } -func semrelease1(addr *uint32, handoff bool) { +func semrelease1(addr *uint32, handoff bool, skipframes int) { root := semroot(addr) atomic.Xadd(addr, 1) @@ -183,7 +183,7 @@ func semrelease1(addr *uint32, handoff bool) { if s != nil { // May be slow, so unlock first acquiretime := s.acquiretime if acquiretime != 0 { - mutexevent(t0-acquiretime, 3) + mutexevent(t0-acquiretime, 3+skipframes) } if s.ticket != 0 { throw("corrupted semaphore ticket") @@ -191,7 +191,7 @@ func semrelease1(addr *uint32, handoff bool) { if handoff && cansemacquire(addr) { s.ticket = 1 } - readyWithTime(s, 5) + readyWithTime(s, 5+skipframes) } } diff --git a/src/sync/mutex.go b/src/sync/mutex.go index 4c5582c809..a809993fe0 100644 --- a/src/sync/mutex.go +++ b/src/sync/mutex.go @@ -180,6 +180,14 @@ func (m *Mutex) Unlock() { // Fast path: drop lock bit. new := atomic.AddInt32(&m.state, -mutexLocked) + if new != 0 { + // Outlined slow path to allow inlining the fast path. + // To hide unlockSlow during tracing we skip one extra frame when tracing GoUnblock. + m.unlockSlow(new) + } +} + +func (m *Mutex) unlockSlow(new int32) { if (new+mutexLocked)&mutexLocked == 0 { throw("sync: unlock of unlocked mutex") } @@ -198,7 +206,7 @@ func (m *Mutex) Unlock() { // Grab the right to wake someone. new = (old - 1< Date: Tue, 5 Mar 2019 16:05:07 +0100 Subject: [PATCH 0281/1679] net: fix fd leak with interfaces on aix/ppc64 To retrieve MTU on aix/ppc64, a socket must be created. Previously, this socket was recreated for each interface and not close at all, causing a fd leak on software using interface API. Change-Id: Ib573e234bfce58964935831b68d007bfbd923476 Reviewed-on: https://go-review.googlesource.com/c/go/+/165397 Reviewed-by: Brad Fitzpatrick --- src/net/interface_aix.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/net/interface_aix.go b/src/net/interface_aix.go index 9a8b5bbdb1..49f78c2abb 100644 --- a/src/net/interface_aix.go +++ b/src/net/interface_aix.go @@ -5,6 +5,7 @@ package net import ( + "internal/poll" "internal/syscall/unix" "syscall" "unsafe" @@ -54,6 +55,12 @@ func interfaceTable(ifindex int) ([]Interface, error) { return nil, err } + sock, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, 0) + if err != nil { + return nil, err + } + defer poll.CloseFunc(sock) + var ift []Interface for len(tab) > 0 { ifm := (*syscall.IfMsgHdr)(unsafe.Pointer(&tab[0])) @@ -71,10 +78,6 @@ func interfaceTable(ifindex int) ([]Interface, error) { // Retrieve MTU ifr := &ifreq{} copy(ifr.Name[:], ifi.Name) - sock, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0) - if err != nil { - return nil, err - } err = unix.Ioctl(sock, syscall.SIOCGIFMTU, uintptr(unsafe.Pointer(ifr))) if err != nil { return nil, err -- GitLab From ebdc24c3d334132542daa7c57246389e0b259227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 2 Feb 2019 11:40:55 +0000 Subject: [PATCH 0282/1679] os: add UserConfigDir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After UserCacheDir and UserHomeDir, the only remaining piece which is commonly needed and portable is a per-user directory to store persistent files. For that purpose, UserCacheDir is wrong, as it's meant only for temporary files. UserHomeDir is also far from ideal, as that clutters the user's home directory. Add UserConfigDir, which is implemented in a similar manner to UserConfigDir. Fixes #29960. Change-Id: I7d7a56615103cf76e2b5e2bab2029a6b09d19f0b Reviewed-on: https://go-review.googlesource.com/c/go/+/160877 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/file.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/os/file.go b/src/os/file.go index 8c25cc0a3b..d880a37569 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -382,6 +382,57 @@ func UserCacheDir() (string, error) { return dir, nil } +// UserConfigDir returns the default root directory to use for user-specific +// configuration data. Users should create their own application-specific +// subdirectory within this one and use that. +// +// On Unix systems, it returns $XDG_CONFIG_HOME as specified by +// https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html if +// non-empty, else $HOME/.config. +// On Darwin, it returns $HOME/Library/Preferences. +// On Windows, it returns %AppData%. +// On Plan 9, it returns $home/lib. +// +// If the location cannot be determined (for example, $HOME is not defined), +// then it will return an error. +func UserConfigDir() (string, error) { + var dir string + + switch runtime.GOOS { + case "windows": + dir = Getenv("AppData") + if dir == "" { + return "", errors.New("%AppData% is not defined") + } + + case "darwin": + dir = Getenv("HOME") + if dir == "" { + return "", errors.New("$HOME is not defined") + } + dir += "/Library/Preferences" + + case "plan9": + dir = Getenv("home") + if dir == "" { + return "", errors.New("$home is not defined") + } + dir += "/lib" + + default: // Unix + dir = Getenv("XDG_CONFIG_HOME") + if dir == "" { + dir = Getenv("HOME") + if dir == "" { + return "", errors.New("neither $XDG_CONFIG_HOME nor $HOME are defined") + } + dir += "/.config" + } + } + + return dir, nil +} + // UserHomeDir returns the current user's home directory. // // On Unix, including macOS, it returns the $HOME environment variable. -- GitLab From a563f2f4177e6b3b897ae0a1c452e53ffc245638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 25 Nov 2018 23:02:28 +0000 Subject: [PATCH 0283/1679] encoding/hex: simplify encoder arithmetic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two additions are faster than two multiplications and one addition. The code seems simpler to me too, as it's more obvious that we advance two destination bytes for each source byte. name old time/op new time/op delta Encode/256-8 374ns ± 0% 331ns ± 0% -11.44% (p=0.008 n=5+5) Encode/1024-8 1.47µs ± 0% 1.29µs ± 0% -11.89% (p=0.004 n=6+5) Encode/4096-8 5.85µs ± 1% 5.15µs ± 0% -11.89% (p=0.004 n=6+5) Encode/16384-8 23.3µs ± 0% 20.6µs ± 0% -11.68% (p=0.004 n=6+5) Change-Id: Iabc63616c1d9fded55fa668ff41dd49efeaa2ea4 Reviewed-on: https://go-review.googlesource.com/c/go/+/151198 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: roger peppe --- src/encoding/hex/hex.go | 9 +++++---- src/encoding/hex/hex_test.go | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/encoding/hex/hex.go b/src/encoding/hex/hex.go index 7675de9bd9..fbba78ffd2 100644 --- a/src/encoding/hex/hex.go +++ b/src/encoding/hex/hex.go @@ -23,11 +23,12 @@ func EncodedLen(n int) int { return n * 2 } // of bytes written to dst, but this value is always EncodedLen(len(src)). // Encode implements hexadecimal encoding. func Encode(dst, src []byte) int { - for i, v := range src { - dst[i*2] = hextable[v>>4] - dst[i*2+1] = hextable[v&0x0f] + j := 0 + for _, v := range src { + dst[j] = hextable[v>>4] + dst[j+1] = hextable[v&0x0f] + j += 2 } - return len(src) * 2 } diff --git a/src/encoding/hex/hex_test.go b/src/encoding/hex/hex_test.go index ba703cf1c1..dbb00b94ca 100644 --- a/src/encoding/hex/hex_test.go +++ b/src/encoding/hex/hex_test.go @@ -242,6 +242,7 @@ func BenchmarkEncode(b *testing.B) { sink = make([]byte, 2*size) b.Run(fmt.Sprintf("%v", size), func(b *testing.B) { + b.SetBytes(int64(size)) for i := 0; i < b.N; i++ { Encode(sink, src) } @@ -269,6 +270,7 @@ func BenchmarkDump(b *testing.B) { sink = make([]byte, 2*size) b.Run(fmt.Sprintf("%v", size), func(b *testing.B) { + b.SetBytes(int64(size)) for i := 0; i < b.N; i++ { Dump(src) } -- GitLab From e44a031651d042107d446b4038a70c6da763e2d5 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 09:28:50 -0500 Subject: [PATCH 0284/1679] cmd/go/internal/modload: do not fetch modules in searchPackages if -mod=vendor is set Updates #30228 Updates #30241 Change-Id: I6b5f842d00ba273ed241abe55a1ea71c105ec284 Reviewed-on: https://go-review.googlesource.com/c/go/+/165377 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/search.go | 5 +++++ src/cmd/go/testdata/script/mod_vendor_build.txt | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 7d8852d01d..45e7ee2674 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -112,6 +112,11 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] walkPkgs(cfg.GOROOTsrc, "") } + if cfg.BuildMod == "vendor" { + walkPkgs(filepath.Join(ModRoot(), "vendor"), "") + return pkgs + } + for _, mod := range modules { if !treeCanMatch(mod.Path) { continue diff --git a/src/cmd/go/testdata/script/mod_vendor_build.txt b/src/cmd/go/testdata/script/mod_vendor_build.txt index 7b304dbb70..01ee2d202a 100644 --- a/src/cmd/go/testdata/script/mod_vendor_build.txt +++ b/src/cmd/go/testdata/script/mod_vendor_build.txt @@ -19,6 +19,12 @@ cmp go.mod go.mod.good go list -mod=vendor cmp go.mod go.mod.good +# With a clean (and empty) module cache, 'go list -mod=vendor' should not download modules. +go clean -modcache +env GOPROXY=off +! go list ... +go list -mod=vendor ... + -- go.mod -- module m -- GitLab From 9670e81c2e776b4781bc4cecddf45052ebf0afe6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 08:51:44 -0500 Subject: [PATCH 0285/1679] all: add -mod=vendor to GOFLAGS in tests that execute 'go' commands within std or cmd Updates #30228 Updates #30240 Updates #30241 Change-Id: Idc311ba77e99909318b5b86f8ef82d4878f73e47 Reviewed-on: https://go-review.googlesource.com/c/go/+/165378 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/addr2line/addr2line_test.go | 2 ++ src/cmd/compile/internal/gc/scope_test.go | 2 ++ src/cmd/cover/cover_test.go | 2 ++ src/cmd/go/go_test.go | 4 ++- src/cmd/internal/obj/x86/obj6_test.go | 2 ++ src/cmd/link/internal/ld/ld_test.go | 2 ++ src/cmd/link/link_test.go | 2 ++ src/cmd/nm/nm_test.go | 2 ++ src/cmd/objdump/objdump_test.go | 2 ++ src/cmd/vet/all/main.go | 1 + src/cmd/vet/vet_test.go | 2 ++ src/crypto/x509/x509_test.go | 2 ++ src/debug/gosym/pclntab_test.go | 2 ++ src/go/importer/importer_test.go | 2 ++ .../internal/srcimporter/srcimporter_test.go | 18 +------------ src/internal/testenv/testenv.go | 26 +++++++++++++++++++ src/runtime/crash_test.go | 2 ++ src/runtime/pprof/proto_test.go | 2 ++ 18 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/cmd/addr2line/addr2line_test.go b/src/cmd/addr2line/addr2line_test.go index 22bf1379bb..183a22f8f3 100644 --- a/src/cmd/addr2line/addr2line_test.go +++ b/src/cmd/addr2line/addr2line_test.go @@ -115,3 +115,5 @@ func TestAddr2Line(t *testing.T) { testAddr2Line(t, exepath, syms[symName]) testAddr2Line(t, exepath, "0x"+syms[symName]) } + +func init() { testenv.SetModVendor() } diff --git a/src/cmd/compile/internal/gc/scope_test.go b/src/cmd/compile/internal/gc/scope_test.go index e327dc02af..e4861c686c 100644 --- a/src/cmd/compile/internal/gc/scope_test.go +++ b/src/cmd/compile/internal/gc/scope_test.go @@ -202,6 +202,8 @@ var testfile = []testline{ const detailOutput = false +func init() { testenv.SetModVendor() } + // Compiles testfile checks that the description of lexical blocks emitted // by the linker in debug_info, for each function in the main package, // corresponds to what we expect it to be. diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index f002442b63..d7e6ca99b7 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -77,6 +77,8 @@ var debug = flag.Bool("debug", false, "keep rewritten files for debugging") // We use TestMain to set up a temporary directory and remove it when // the tests are done. func TestMain(m *testing.M) { + testenv.SetModVendor() + dir, err := ioutil.TempDir("", "gotestcover") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index dfada6c806..9ba52e609e 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -212,7 +212,9 @@ func TestMain(m *testing.M) { return } - out, err := exec.Command(gotool, args...).CombinedOutput() + buildCmd := exec.Command(gotool, args...) + buildCmd.Env = append(os.Environ(), "GOFLAGS=-mod=vendor") + out, err := buildCmd.CombinedOutput() if err != nil { fmt.Fprintf(os.Stderr, "building testgo failed: %v\n%s", err, out) os.Exit(2) diff --git a/src/cmd/internal/obj/x86/obj6_test.go b/src/cmd/internal/obj/x86/obj6_test.go index c5399744f2..2b1a729c8f 100644 --- a/src/cmd/internal/obj/x86/obj6_test.go +++ b/src/cmd/internal/obj/x86/obj6_test.go @@ -134,6 +134,8 @@ func parseOutput(t *testing.T, td *ParsedTestData, asmout []byte) { } } +func init() { testenv.SetModVendor() } + func TestDynlink(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/internal/ld/ld_test.go b/src/cmd/link/internal/ld/ld_test.go index 0816429316..219b2a63ca 100644 --- a/src/cmd/link/internal/ld/ld_test.go +++ b/src/cmd/link/internal/ld/ld_test.go @@ -13,6 +13,8 @@ import ( "testing" ) +func init() { testenv.SetModVendor() } + func TestUndefinedRelocErrors(t *testing.T) { t.Parallel() testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 5200c3a6f0..5043a778ca 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -38,6 +38,8 @@ func TestLargeSymName(t *testing.T) { _ = AuthorPaidByTheColumnInch } +func init() { testenv.SetModVendor() } + func TestIssue21703(t *testing.T) { t.Parallel() diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 8176ddd7f4..82f4235510 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -30,6 +30,8 @@ func testMain(m *testing.M) int { return 0 } + testenv.SetModVendor() + tmpDir, err := ioutil.TempDir("", "TestNM") if err != nil { fmt.Println("TempDir failed:", err) diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index a2ca329609..7c874e853b 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -24,6 +24,8 @@ func TestMain(m *testing.M) { if !testenv.HasGoBuild() { return } + testenv.SetModVendor() + var exitcode int if err := buildObjdump(); err == nil { exitcode = m.Run() diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index 2500c690bf..8cc4140e6e 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -44,6 +44,7 @@ func main() { log.SetPrefix("vet/all: ") log.SetFlags(0) + testenv.SetModVendor() var err error cmdGoPath, err = testenv.GoTool() if err != nil { diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 5d8139d977..62c28fb9a2 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -32,6 +32,8 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { + testenv.SetModVendor() + dir, err := ioutil.TempDir("", "vet_test") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index f5851f1f11..fbcdb7b58e 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -1146,6 +1146,8 @@ func TestParsePEMCRL(t *testing.T) { // Can't check the signature here without a package cycle. } +func init() { testenv.SetModVendor() } + func TestImports(t *testing.T) { testenv.MustHaveGoRun(t) diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go index d21f0e24a8..c67fb66f0d 100644 --- a/src/debug/gosym/pclntab_test.go +++ b/src/debug/gosym/pclntab_test.go @@ -21,6 +21,8 @@ var ( pclinetestBinary string ) +func init() { testenv.SetModVendor() } + func dotest(t *testing.T) { testenv.MustHaveGoBuild(t) // For now, only works on amd64 platforms. diff --git a/src/go/importer/importer_test.go b/src/go/importer/importer_test.go index ff6e12c0da..2887ec6ea5 100644 --- a/src/go/importer/importer_test.go +++ b/src/go/importer/importer_test.go @@ -16,6 +16,8 @@ import ( "testing" ) +func init() { testenv.SetModVendor() } + func TestForCompiler(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go index f8e1c323b3..06472447a6 100644 --- a/src/go/internal/srcimporter/srcimporter_test.go +++ b/src/go/internal/srcimporter/srcimporter_test.go @@ -10,7 +10,6 @@ import ( "go/types" "internal/testenv" "io/ioutil" - "os" "path" "path/filepath" "runtime" @@ -19,22 +18,7 @@ import ( "time" ) -func TestMain(m *testing.M) { - // Add -mod=vendor to GOFLAGS to ensure that we don't fetch modules while importing std or cmd. - // - // TODO(golang.org/issue/30240): If we load go.mod files from vendor/ - // automatically, this will probably no longer be necessary. - var goflags []string - for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { - if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { - goflags = append(goflags, f) - } - } - goflags = append(goflags, "-mod=vendor") - os.Setenv("GOFLAGS", strings.Join(goflags, " ")) - - os.Exit(m.Run()) -} +func init() { testenv.SetModVendor() } const maxTime = 2 * time.Second diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go index 8f69fe0da5..72e4d803cb 100644 --- a/src/internal/testenv/testenv.go +++ b/src/internal/testenv/testenv.go @@ -19,6 +19,7 @@ import ( "runtime" "strconv" "strings" + "sync" "testing" ) @@ -77,6 +78,31 @@ func MustHaveGoRun(t testing.TB) { } } +var modVendorOnce sync.Once + +// SetModVendor adds the "-mod=vendor" flag to the GOFLAGS environment variable. +// This allows tests whose working directories are within the cmd and std +// modules to run ``go'' commands without accessing the network to load +// dependencies modules. +// +// SetModVendor must be called before any test may read the GOFLAGS environment +// variable. +// +// TODO(golang.org/issue/30240): If we load go.mod files from vendor/ +// automatically, this will probably no longer be necessary. +func SetModVendor() { + modVendorOnce.Do(func() { + var goflags []string + for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { + if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { + goflags = append(goflags, f) + } + } + goflags = append(goflags, "-mod=vendor") + os.Setenv("GOFLAGS", strings.Join(goflags, " ")) + }) +} + // GoToolPath reports the path to the Go tool. // It is a convenience wrapper around GoTool. // If the tool is unavailable GoToolPath calls t.Skip. diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 03ebf022a6..3a27b269a1 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -25,6 +25,8 @@ import ( var toRemove []string func TestMain(m *testing.M) { + testenv.SetModVendor() + status := m.Run() for _, file := range toRemove { os.RemoveAll(file) diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index 4452d51231..a276d81c49 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -301,6 +301,8 @@ func TestProcSelfMaps(t *testing.T) { }) } +func init() { testenv.SetModVendor() } + // TestMapping checkes the mapping section of CPU profiles // has the HasFunctions field set correctly. If all PCs included // in the samples are successfully symbolized, the corresponding -- GitLab From 2f8d2427d9751ab5ebdc64ec68ee8e2c0252d8d4 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Tue, 5 Mar 2019 18:21:08 +0100 Subject: [PATCH 0286/1679] test: skip mutex Unlock inlining tests on a few builders Fix builder breakage from CL 148958. This is an inlining test that should be skipped on -N -l. The inlining also doesn't happen on arm and wasm, so skip the test there too. Fixes the noopt builder, the linux-arm builder, and the wasm builder. Updates #30605 Change-Id: I06b90d595be7185df61db039dd225dc90d6f678f Reviewed-on: https://go-review.googlesource.com/c/go/+/165339 Reviewed-by: Brad Fitzpatrick --- test/inline_sync.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/inline_sync.go b/test/inline_sync.go index 271414d5f0..b25e56447b 100644 --- a/test/inline_sync.go +++ b/test/inline_sync.go @@ -1,4 +1,4 @@ -// +build !nacl,!386 +// +build !nacl,!386,!wasm,!arm,!gcflags_noopt // errorcheck -0 -m // Copyright 2019 The Go Authors. All rights reserved. -- GitLab From a125bdb49b9aa96f3185ae4dfcc0f6d13b998724 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 1 Mar 2019 12:03:41 -0500 Subject: [PATCH 0287/1679] encoding/base64: do not slice past output unnecessarily Base64-encoding 32 bytes results in a 44-byte string. While in general a 44-byte string might decode to 33 bytes, if you take a 44-byte string that actually only encodes 32 bytes, and you try to decode it into 32 bytes, that should succeed. Instead it fails trying to do a useless dst[33:] slice operation. Delete that slice operation. Noticed while preparing CL 156322. Change-Id: I8024bf28a65e2638675b980732b2ff91c66c62cf Reviewed-on: https://go-review.googlesource.com/c/go/+/164628 Reviewed-by: Ian Lance Taylor --- src/encoding/base64/base64.go | 7 +++---- src/encoding/base64/base64_test.go | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/encoding/base64/base64.go b/src/encoding/base64/base64.go index a90e4dfa12..a7da7747ef 100644 --- a/src/encoding/base64/base64.go +++ b/src/encoding/base64/base64.go @@ -282,7 +282,7 @@ func (e CorruptInputError) Error() string { func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err error) { // Decode quantum using the base64 alphabet var dbuf [4]byte - dinc, dlen := 3, 4 + dlen := 4 for j := 0; j < len(dbuf); j++ { if len(src) == si { @@ -292,7 +292,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err case j == 1, enc.padChar != NoPadding: return si, 0, CorruptInputError(si - j) } - dinc, dlen = j-1, j + dlen = j break } in := src[si] @@ -344,7 +344,7 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err // trailing garbage err = CorruptInputError(si) } - dinc, dlen = 3, j + dlen = j break } @@ -369,7 +369,6 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err return si, 0, CorruptInputError(si - 2) } } - dst = dst[dinc:] return si, dlen - 1, err } diff --git a/src/encoding/base64/base64_test.go b/src/encoding/base64/base64_test.go index beb63d7c5a..bc67036f5b 100644 --- a/src/encoding/base64/base64_test.go +++ b/src/encoding/base64/base64_test.go @@ -11,6 +11,7 @@ import ( "io" "io/ioutil" "reflect" + "runtime/debug" "strings" "testing" "time" @@ -247,6 +248,20 @@ func TestDecodeCorrupt(t *testing.T) { } } +func TestDecodeBounds(t *testing.T) { + var buf [32]byte + s := StdEncoding.EncodeToString(buf[:]) + defer func() { + if err := recover(); err != nil { + t.Fatalf("Decode panicked unexpectedly: %v\n%s", err, debug.Stack()) + } + }() + n, err := StdEncoding.Decode(buf[:], []byte(s)) + if n != len(buf) || err != nil { + t.Fatalf("StdEncoding.Decode = %d, %v, want %d, nil", n, err, len(buf)) + } +} + func TestEncodedLen(t *testing.T) { for _, tt := range []struct { enc *Encoding -- GitLab From 340129e4c8c56a371859b7434de89478610cab81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 5 Mar 2019 20:21:17 +0000 Subject: [PATCH 0288/1679] all: join a few chained ifs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I had been finding these over a year or so, but none were big enough changes to warrant CLs. They're a handful now, so clean them all up in a single commit. The smaller bodies get a bit simpler, but most importantly, the larger bodies get unindented. Change-Id: I5707a6fee27d4c9ff9efd3d363af575d7a4bf2aa Reviewed-on: https://go-review.googlesource.com/c/go/+/165340 Run-TryBot: Daniel Martí Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/encoding/json/encode.go | 12 ++++-------- src/net/http/server.go | 6 ++---- src/runtime/chan.go | 6 ++---- src/runtime/signal_amd64x.go | 28 +++++++++++++--------------- src/runtime/signal_unix.go | 18 ++++++++---------- src/testing/testing.go | 26 ++++++++++++-------------- 6 files changed, 41 insertions(+), 55 deletions(-) diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index dea63f1850..de6d2632f4 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -392,19 +392,15 @@ func newTypeEncoder(t reflect.Type, allowAddr bool) encoderFunc { if t.Implements(marshalerType) { return marshalerEncoder } - if t.Kind() != reflect.Ptr && allowAddr { - if reflect.PtrTo(t).Implements(marshalerType) { - return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false)) - } + if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(marshalerType) { + return newCondAddrEncoder(addrMarshalerEncoder, newTypeEncoder(t, false)) } if t.Implements(textMarshalerType) { return textMarshalerEncoder } - if t.Kind() != reflect.Ptr && allowAddr { - if reflect.PtrTo(t).Implements(textMarshalerType) { - return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false)) - } + if t.Kind() != reflect.Ptr && allowAddr && reflect.PtrTo(t).Implements(textMarshalerType) { + return newCondAddrEncoder(addrTextMarshalerEncoder, newTypeEncoder(t, false)) } switch t.Kind() { diff --git a/src/net/http/server.go b/src/net/http/server.go index 9ae0bbff14..a19934e469 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -749,10 +749,8 @@ func (cr *connReader) handleReadError(_ error) { // may be called from multiple goroutines. func (cr *connReader) closeNotify() { res, _ := cr.conn.curReq.Load().(*response) - if res != nil { - if atomic.CompareAndSwapInt32(&res.didCloseNotify, 0, 1) { - res.closeNotifyCh <- true - } + if res != nil && atomic.CompareAndSwapInt32(&res.didCloseNotify, 0, 1) { + res.closeNotifyCh <- true } } diff --git a/src/runtime/chan.go b/src/runtime/chan.go index 8662f00e13..389bf799e2 100644 --- a/src/runtime/chan.go +++ b/src/runtime/chan.go @@ -729,10 +729,8 @@ func (q *waitq) dequeue() *sudog { // We use a flag in the G struct to tell us when someone // else has won the race to signal this goroutine but the goroutine // hasn't removed itself from the queue yet. - if sgp.isSelect { - if !atomic.Cas(&sgp.g.selectDone, 0, 1) { - continue - } + if sgp.isSelect && !atomic.Cas(&sgp.g.selectDone, 0, 1) { + continue } return sgp diff --git a/src/runtime/signal_amd64x.go b/src/runtime/signal_amd64x.go index 823fd295ae..9d59e262de 100644 --- a/src/runtime/signal_amd64x.go +++ b/src/runtime/signal_amd64x.go @@ -46,21 +46,19 @@ func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) } // preparePanic sets up the stack to look like a call to sigpanic. func (c *sigctxt) preparePanic(sig uint32, gp *g) { - if GOOS == "darwin" { - // Work around Leopard bug that doesn't set FPE_INTDIV. - // Look at instruction to see if it is a divide. - // Not necessary in Snow Leopard (si_code will be != 0). - if sig == _SIGFPE && gp.sigcode0 == 0 { - pc := (*[4]byte)(unsafe.Pointer(gp.sigpc)) - i := 0 - if pc[i]&0xF0 == 0x40 { // 64-bit REX prefix - i++ - } else if pc[i] == 0x66 { // 16-bit instruction prefix - i++ - } - if pc[i] == 0xF6 || pc[i] == 0xF7 { - gp.sigcode0 = _FPE_INTDIV - } + // Work around Leopard bug that doesn't set FPE_INTDIV. + // Look at instruction to see if it is a divide. + // Not necessary in Snow Leopard (si_code will be != 0). + if GOOS == "darwin" && sig == _SIGFPE && gp.sigcode0 == 0 { + pc := (*[4]byte)(unsafe.Pointer(gp.sigpc)) + i := 0 + if pc[i]&0xF0 == 0x40 { // 64-bit REX prefix + i++ + } else if pc[i] == 0x66 { // 16-bit instruction prefix + i++ + } + if pc[i] == 0xF6 || pc[i] == 0xF7 { + gp.sigcode0 = _FPE_INTDIV } } diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 15f1799801..8814f7836d 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -503,16 +503,14 @@ func raisebadsignal(sig uint32, c *sigctxt) { //go:nosplit func crash() { - if GOOS == "darwin" { - // OS X core dumps are linear dumps of the mapped memory, - // from the first virtual byte to the last, with zeros in the gaps. - // Because of the way we arrange the address space on 64-bit systems, - // this means the OS X core file will be >128 GB and even on a zippy - // workstation can take OS X well over an hour to write (uninterruptible). - // Save users from making that mistake. - if GOARCH == "amd64" { - return - } + // OS X core dumps are linear dumps of the mapped memory, + // from the first virtual byte to the last, with zeros in the gaps. + // Because of the way we arrange the address space on 64-bit systems, + // this means the OS X core file will be >128 GB and even on a zippy + // workstation can take OS X well over an hour to write (uninterruptible). + // Save users from making that mistake. + if GOOS == "darwin" && GOARCH == "amd64" { + return } dieFromSignal(_SIGABRT) diff --git a/src/testing/testing.go b/src/testing/testing.go index 79dcf76908..8cbb4318fc 100644 --- a/src/testing/testing.go +++ b/src/testing/testing.go @@ -1303,20 +1303,18 @@ func toOutputDir(path string) string { if *outputDir == "" || path == "" { return path } - if runtime.GOOS == "windows" { - // On Windows, it's clumsy, but we can be almost always correct - // by just looking for a drive letter and a colon. - // Absolute paths always have a drive letter (ignoring UNC). - // Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear - // what to do, but even then path/filepath doesn't help. - // TODO: Worth doing better? Probably not, because we're here only - // under the management of go test. - if len(path) >= 2 { - letter, colon := path[0], path[1] - if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' { - // If path starts with a drive letter we're stuck with it regardless. - return path - } + // On Windows, it's clumsy, but we can be almost always correct + // by just looking for a drive letter and a colon. + // Absolute paths always have a drive letter (ignoring UNC). + // Problem: if path == "C:A" and outputdir == "C:\Go" it's unclear + // what to do, but even then path/filepath doesn't help. + // TODO: Worth doing better? Probably not, because we're here only + // under the management of go test. + if runtime.GOOS == "windows" && len(path) >= 2 { + letter, colon := path[0], path[1] + if ('a' <= letter && letter <= 'z' || 'A' <= letter && letter <= 'Z') && colon == ':' { + // If path starts with a drive letter we're stuck with it regardless. + return path } } if os.IsPathSeparator(path[0]) { -- GitLab From 8bad008cf50e64a7615d9dbd7aaa236eb727301e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:01:22 +0100 Subject: [PATCH 0289/1679] runtime: handle syscalls without g or m for aix/ppc64 With cgo, some syscalls will be called with g == nil or m == nil. SyscallX functions cannot handle them so they call an equivalent function in sys_aix_ppc64.s which will directly call this syscall. Change-Id: I6508ec772b304111330e6833e7db729200af547c Reviewed-on: https://go-review.googlesource.com/c/go/+/164001 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os2_aix.go | 132 ++++++++++++++++++++---------------- src/runtime/sys_aix_ppc64.s | 32 +++++++++ 2 files changed, 104 insertions(+), 60 deletions(-) diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go index d0349191c6..e2ae04a55d 100644 --- a/src/runtime/os2_aix.go +++ b/src/runtime/os2_aix.go @@ -148,32 +148,35 @@ type libFunc uintptr // It's defined in sys_aix_ppc64.go. var asmsyscall6 libFunc +// syscallX functions must always be called with g != nil and m != nil, +// as it relies on g.m.libcall to pass arguments to asmcgocall. +// The few cases where syscalls haven't a g or a m must call their equivalent +// function in sys_aix_ppc64.s to handle them. + //go:nowritebarrier //go:nosplit func syscall0(fn *libFunc) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall + c := &mp.libcall c.fn = uintptr(unsafe.Pointer(fn)) c.n = 0 c.args = uintptr(noescape(unsafe.Pointer(&fn))) // it's unused but must be non-nil, otherwise crashes asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -184,18 +187,16 @@ func syscall0(fn *libFunc) (r, err uintptr) { //go:nosplit func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -205,7 +206,7 @@ func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -216,18 +217,16 @@ func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) { //go:nosplit func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -237,7 +236,7 @@ func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -248,18 +247,16 @@ func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { //go:nosplit func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -269,7 +266,7 @@ func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -280,18 +277,16 @@ func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { //go:nosplit func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -301,7 +296,7 @@ func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -312,18 +307,16 @@ func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { //go:nosplit func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -333,7 +326,7 @@ func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -344,18 +337,16 @@ func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { //go:nosplit func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) { gp := getg() - var mp *m - if gp != nil { - mp = gp.m - } - if mp != nil && mp.libcallsp == 0 { + mp := gp.m + resetLibcall := true + if mp.libcallsp == 0 { mp.libcallg.set(gp) mp.libcallpc = getcallerpc() // sp must be the last, because once async cpu profiler finds // all three values to be non-zero, it will use them mp.libcallsp = getcallersp() } else { - mp = nil // See comment in sys_darwin.go:libcCall + resetLibcall = false // See comment in sys_darwin.go:libcCall } c := &gp.m.libcall @@ -365,7 +356,7 @@ func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) { asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) - if mp != nil { + if resetLibcall { mp.libcallsp = 0 } @@ -461,13 +452,23 @@ func getsystemcfg(label uint) uintptr { return r } +func usleep1(us uint32) + //go:nosplit func usleep(us uint32) { - r, err := syscall1(&libc_usleep, uintptr(us)) - if int32(r) == -1 { - println("syscall usleep failed: ", hex(err)) - throw("syscall usleep") + _g_ := getg() + + // Check the validity of m because we might be called in cgo callback + // path early enough where there isn't a g or a m available yet. + if _g_ != nil && _g_.m != nil { + r, err := syscall1(&libc_usleep, uintptr(us)) + if int32(r) == -1 { + println("syscall usleep failed: ", hex(err)) + throw("syscall usleep") + } + return } + usleep1(us) } //go:nosplit @@ -541,8 +542,8 @@ func osyield1() func osyield() { _g_ := getg() - // Check the validity of m because we might be called in cgo callback - // path early enough where there isn't a m available yet. + // Check the validity of m because it might be called during a cgo + // callback early enough where m isn't available yet. if _g_ != nil && _g_.m != nil { r, err := syscall0(&libc_sched_yield) if int32(r) == -1 { @@ -611,11 +612,22 @@ func pthread_create(tid *pthread, attr *pthread_attr, fn *funcDescriptor, arg un // On multi-thread program, sigprocmask must not be called. // It's replaced by sigthreadmask. +func sigprocmask1(how, new, old uintptr) + //go:nosplit func sigprocmask(how int32, new, old *sigset) { - r, err := syscall3(&libpthread_sigthreadmask, uintptr(how), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) - if int32(r) != 0 { - println("syscall sigthreadmask failed: ", hex(err)) - throw("syscall sigthreadmask") + _g_ := getg() + + // Check the validity of m because it might be called during a cgo + // callback early enough where m isn't available yet. + if _g_ != nil && _g_.m != nil { + r, err := syscall3(&libpthread_sigthreadmask, uintptr(how), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) + if int32(r) != 0 { + println("syscall sigthreadmask failed: ", hex(err)) + throw("syscall sigthreadmask") + } + return } + sigprocmask1(uintptr(how), uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) + } diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index ea7fae0ce7..d691b76cc7 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -204,4 +204,36 @@ TEXT runtime·osyield1(SB),NOSPLIT,$0 MOVD R0, CTR BL (CTR) MOVD 40(R1), R2 + BL runtime·reginit(SB) + RET + + +// Runs on OS stack, called from runtime·sigprocmask. +TEXT runtime·sigprocmask1(SB),NOSPLIT,$0-24 + MOVD how+0(FP), R3 + MOVD new+8(FP), R4 + MOVD old+16(FP), R5 + MOVD $libpthread_sigthreadmask(SB), R12 + MOVD 0(R12), R12 + MOVD R2, 40(R1) + MOVD 0(R12), R0 + MOVD 8(R12), R2 + MOVD R0, CTR + BL (CTR) + MOVD 40(R1), R2 + BL runtime·reginit(SB) + RET + +// Runs on OS stack, called from runtime·usleep. +TEXT runtime·usleep1(SB),NOSPLIT,$0-8 + MOVW us+0(FP), R3 + MOVD $libc_usleep(SB), R12 + MOVD 0(R12), R12 + MOVD R2, 40(R1) + MOVD 0(R12), R0 + MOVD 8(R12), R2 + MOVD R0, CTR + BL (CTR) + MOVD 40(R1), R2 + BL runtime·reginit(SB) RET -- GitLab From a0c227af734669e0b73483ce03c31268c1134339 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 5 Mar 2019 12:37:25 -0800 Subject: [PATCH 0290/1679] cmd/compile: regenerate op_string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I missed regenerating op_string.go in CL 152537 (adding OINLMARK op). Change-Id: I929540087b817b6a1b0256c1e65341615e61ef40 Reviewed-on: https://go-review.googlesource.com/c/go/+/165359 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí --- src/cmd/compile/internal/gc/op_string.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/op_string.go b/src/cmd/compile/internal/gc/op_string.go index fe80e39064..54fce2409e 100644 --- a/src/cmd/compile/internal/gc/op_string.go +++ b/src/cmd/compile/internal/gc/op_string.go @@ -4,9 +4,9 @@ package gc import "strconv" -const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVEINDREGSPRETJMPGETGEND" +const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVEINDREGSPINLMARKRETJMPGETGEND" -var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 466, 472, 476, 479, 483, 488, 493, 499, 504, 508, 513, 521, 529, 535, 544, 555, 562, 566, 573, 580, 588, 592, 596, 600, 607, 614, 622, 628, 633, 638, 642, 647, 655, 660, 665, 669, 672, 680, 684, 686, 691, 693, 698, 704, 710, 716, 722, 727, 731, 738, 744, 749, 755, 758, 764, 771, 776, 780, 785, 789, 799, 804, 812, 818, 825, 832, 840, 846, 850, 853} +var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 466, 472, 476, 479, 483, 488, 493, 499, 504, 508, 513, 521, 529, 535, 544, 555, 562, 566, 573, 580, 588, 592, 596, 600, 607, 614, 622, 628, 633, 638, 642, 647, 655, 660, 665, 669, 672, 680, 684, 686, 691, 693, 698, 704, 710, 716, 722, 727, 731, 738, 744, 749, 755, 758, 764, 771, 776, 780, 785, 789, 799, 804, 812, 818, 825, 832, 840, 847, 853, 857, 860} func (i Op) String() string { if i >= Op(len(_Op_index)-1) { -- GitLab From 4b142806fa070bfbd26126c75b109f6aefc3b738 Mon Sep 17 00:00:00 2001 From: sergey Date: Sun, 3 Mar 2019 16:38:04 +0300 Subject: [PATCH 0291/1679] net/http: add corner cases for readCookiesTests The following corner cases for readCookiesTests are tested now: - An extra cookie delimiter ";" at the end of a Cookie header - An empty Cookie header Change-Id: Id8028b448e4182613fb261bf0903efc98cbf4997 Reviewed-on: https://go-review.googlesource.com/c/go/+/164702 Reviewed-by: Volker Dobler Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/net/http/cookie_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/net/http/cookie_test.go b/src/net/http/cookie_test.go index 022adaa90d..9536a69c20 100644 --- a/src/net/http/cookie_test.go +++ b/src/net/http/cookie_test.go @@ -385,6 +385,19 @@ var readCookiesTests = []struct { {Name: "c2", Value: "v2"}, }, }, + { + Header{"Cookie": {`Cookie-1="v$1"; c2=v2;`}}, + "", + []*Cookie{ + {Name: "Cookie-1", Value: "v$1"}, + {Name: "c2", Value: "v2"}, + }, + }, + { + Header{"Cookie": {``}}, + "", + []*Cookie{}, + }, } func TestReadCookies(t *testing.T) { -- GitLab From 7ac0a8bc3919e3d22c7492792873a341c9687b5c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 25 Sep 2017 15:01:29 -0400 Subject: [PATCH 0292/1679] runtime: remove unused gcTriggerAlways This was used during the implementation of concurrent runtime.GC() but now there's nothing that triggers GC unconditionally. Remove this trigger type and simplify (gcTrigger).test() accordingly. Change-Id: I17a893c2ed1f661b8146d7783d529f71735c9105 Reviewed-on: https://go-review.googlesource.com/c/go/+/66090 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 4d4cdc14ca..5b974d466b 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -1136,15 +1136,10 @@ type gcTrigger struct { type gcTriggerKind int const ( - // gcTriggerAlways indicates that a cycle should be started - // unconditionally, even if GOGC is off or we're in a cycle - // right now. This cannot be consolidated with other cycles. - gcTriggerAlways gcTriggerKind = iota - // gcTriggerHeap indicates that a cycle should be started when // the heap size reaches the trigger heap size computed by the // controller. - gcTriggerHeap + gcTriggerHeap gcTriggerKind = iota // gcTriggerTime indicates that a cycle should be started when // it's been more than forcegcperiod nanoseconds since the @@ -1161,13 +1156,7 @@ const ( // that the exit condition for the _GCoff phase has been met. The exit // condition should be tested when allocating. func (t gcTrigger) test() bool { - if !memstats.enablegc || panicking != 0 { - return false - } - if t.kind == gcTriggerAlways { - return true - } - if gcphase != _GCoff { + if !memstats.enablegc || panicking != 0 || gcphase != _GCoff { return false } switch t.kind { @@ -1233,7 +1222,7 @@ func gcStart(trigger gcTrigger) { } // For stats, check if this GC was forced by the user. - work.userForced = trigger.kind == gcTriggerAlways || trigger.kind == gcTriggerCycle + work.userForced = trigger.kind == gcTriggerCycle // In gcstoptheworld debug mode, upgrade the mode accordingly. // We do this after re-checking the transition condition so -- GitLab From 7da03b9fbb5c0f8b771a90be3c3777ffbdde283a Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 21 Jun 2017 12:11:52 -0400 Subject: [PATCH 0293/1679] runtime: compute goal first in gcSetTriggerRatio This slightly rearranges gcSetTriggerRatio to compute the goal before computing the other controls. This will simplify implementing the heap limit, which needs to control the absolute goal and flow the rest of the control parameters from this. For #16843. Change-Id: I46b7c1f8b6e4edbee78930fb093b60bd1a03d75e Reviewed-on: https://go-review.googlesource.com/c/go/+/46750 Run-TryBot: Austin Clements Reviewed-by: Michael Knyszek Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 5b974d466b..730b64cd19 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -765,6 +765,14 @@ func pollFractionalWorkerExit() bool { // // mheap_.lock must be held or the world must be stopped. func gcSetTriggerRatio(triggerRatio float64) { + // Compute the next GC goal, which is when the allocated heap + // has grown by GOGC/100 over the heap marked by the last + // cycle. + goal := ^uint64(0) + if gcpercent >= 0 { + goal = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100 + } + // Set the trigger ratio, capped to reasonable bounds. if triggerRatio < 0 { // This can happen if the mutator is allocating very @@ -807,22 +815,16 @@ func gcSetTriggerRatio(triggerRatio float64) { print("runtime: next_gc=", memstats.next_gc, " heap_marked=", memstats.heap_marked, " heap_live=", memstats.heap_live, " initialHeapLive=", work.initialHeapLive, "triggerRatio=", triggerRatio, " minTrigger=", minTrigger, "\n") throw("gc_trigger underflow") } - } - memstats.gc_trigger = trigger - - // Compute the next GC goal, which is when the allocated heap - // has grown by GOGC/100 over the heap marked by the last - // cycle. - goal := ^uint64(0) - if gcpercent >= 0 { - goal = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100 - if goal < trigger { + if trigger > goal { // The trigger ratio is always less than GOGC/100, but // other bounds on the trigger may have raised it. // Push up the goal, too. goal = trigger } } + + // Commit to the trigger and goal. + memstats.gc_trigger = trigger memstats.next_gc = goal if trace.enabled { traceNextGC() -- GitLab From 4a7d5aa30bab454f546d8f3b6d4b4a27585f1433 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 25 Sep 2017 15:17:28 -0400 Subject: [PATCH 0294/1679] runtime: don't use GOGC in minimum sweep distance Currently, the minimum sweep distance is 1MB * GOGC/100. It's been this way since it was introduced in CL 13043 with no justification. Since there seems to be no good reason to scale the minimum sweep distance by GOGC, make the minimum sweep distance just 1MB. Change-Id: I5320574a23c0eec641e346282aab08a3bbb057da Reviewed-on: https://go-review.googlesource.com/c/go/+/66091 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 730b64cd19..023ab2f6ea 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -141,7 +141,7 @@ const ( // sweepMinHeapDistance is a lower bound on the heap distance // (in bytes) reserved for concurrent sweeping between GC - // cycles. This will be scaled by gcpercent/100. + // cycles. sweepMinHeapDistance = 1024 * 1024 ) @@ -803,7 +803,7 @@ func gcSetTriggerRatio(triggerRatio float64) { // that concurrent sweep has some heap growth // in which to perform sweeping before we // start the next GC cycle. - sweepMin := atomic.Load64(&memstats.heap_live) + sweepMinHeapDistance*uint64(gcpercent)/100 + sweepMin := atomic.Load64(&memstats.heap_live) + sweepMinHeapDistance if sweepMin > minTrigger { minTrigger = sweepMin } -- GitLab From 5c22842cf2761811058f6b2477cf074e544c629c Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 25 Sep 2017 15:29:08 -0400 Subject: [PATCH 0295/1679] runtime: introduce effective GOGC, eliminate heap_marked hacks Currently, the pacer assumes the goal growth ratio is always exactly GOGC/100. But sometimes this isn't the case, like when the heap is very small (limited by heapminimum). So to placate the pacer, we lie about the value of heap_marked in such situations. Right now, these two lies make a truth, but GOGC is about to get more complicated with the introduction of heap limits. Rather than introduce more lies into the system to handle this, introduce the concept of an "effective GOGC", which is the GOGC we're actually using for pacing (we'll need this concept anyway with heap limits). This commit changes the pacer to use the effective GOGC rather than the user-set GOGC. This way, we no longer need to lie about heap_marked because its true value is incorporated into the effective GOGC. Change-Id: I5b005258f937ab184ffcb5e76053abd798d542bd Reviewed-on: https://go-review.googlesource.com/c/go/+/66092 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek Reviewed-by: Rick Hudson --- src/runtime/mgc.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/runtime/mgc.go b/src/runtime/mgc.go index 023ab2f6ea..c83241959b 100644 --- a/src/runtime/mgc.go +++ b/src/runtime/mgc.go @@ -404,23 +404,6 @@ func (c *gcControllerState) startCycle() { c.fractionalMarkTime = 0 c.idleMarkTime = 0 - // If this is the first GC cycle or we're operating on a very - // small heap, fake heap_marked so it looks like gc_trigger is - // the appropriate growth from heap_marked, even though the - // real heap_marked may not have a meaningful value (on the - // first cycle) or may be much smaller (resulting in a large - // error response). - if memstats.gc_trigger <= heapminimum { - memstats.heap_marked = uint64(float64(memstats.gc_trigger) / (1 + memstats.triggerRatio)) - } - - // Re-compute the heap goal for this cycle in case something - // changed. This is the same calculation we use elsewhere. - memstats.next_gc = memstats.heap_marked + memstats.heap_marked*uint64(gcpercent)/100 - if gcpercent < 0 { - memstats.next_gc = ^uint64(0) - } - // Ensure that the heap goal is at least a little larger than // the current live heap size. This may not be the case if GC // start is delayed or if the allocation that pushed heap_live @@ -585,7 +568,7 @@ func (c *gcControllerState) endCycle() float64 { // growth if we had the desired CPU utilization). The // difference between this estimate and the GOGC-based goal // heap growth is the error. - goalGrowthRatio := float64(gcpercent) / 100 + goalGrowthRatio := gcEffectiveGrowthRatio() actualGrowthRatio := float64(memstats.heap_live)/float64(memstats.heap_marked) - 1 assistDuration := nanotime() - c.markStartTime @@ -869,6 +852,24 @@ func gcSetTriggerRatio(triggerRatio float64) { } } +// gcEffectiveGrowthRatio returns the current effective heap growth +// ratio (GOGC/100) based on heap_marked from the previous GC and +// next_gc for the current GC. +// +// This may differ from gcpercent/100 because of various upper and +// lower bounds on gcpercent. For example, if the heap is smaller than +// heapminimum, this can be higher than gcpercent/100. +// +// mheap_.lock must be held or the world must be stopped. +func gcEffectiveGrowthRatio() float64 { + egogc := float64(memstats.next_gc-memstats.heap_marked) / float64(memstats.heap_marked) + if egogc < 0 { + // Shouldn't happen, but just in case. + egogc = 0 + } + return egogc +} + // gcGoalUtilization is the goal CPU utilization for // marking as a fraction of GOMAXPROCS. const gcGoalUtilization = 0.30 -- GitLab From e90f572cd68adf11337faf30d1db0231d0c9d870 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Wed, 20 Feb 2019 13:33:30 +0530 Subject: [PATCH 0296/1679] go/doc: add // while wrapping a line comment in ToText Currently, lineWrapper does not detect if it is printing a line comment or not. Hence, while wrapping a comment, the new line does not get prefixed with a //. We add logic to lineWrapper to detect this case and add // accordingly. Block comments do not need any such handling. Added tests for both cases. Fixes #20929 Change-Id: I656037c2d865f31dd853cf9195f43ab7c6e6fc53 Reviewed-on: https://go-review.googlesource.com/c/go/+/163578 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/doc/comment.go | 8 ++++++++ src/go/doc/comment_test.go | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/go/doc/comment.go b/src/go/doc/comment.go index 31ee93e44f..88be45bb8f 100644 --- a/src/go/doc/comment.go +++ b/src/go/doc/comment.go @@ -464,6 +464,7 @@ type lineWrapper struct { var nl = []byte("\n") var space = []byte(" ") +var prefix = []byte("// ") func (l *lineWrapper) write(text string) { if l.n == 0 && l.printed { @@ -471,6 +472,8 @@ func (l *lineWrapper) write(text string) { } l.printed = true + needsPrefix := false + isComment := strings.HasPrefix(text, "//") for _, f := range strings.Fields(text) { w := utf8.RuneCountInString(f) // wrap if line is too long @@ -478,10 +481,15 @@ func (l *lineWrapper) write(text string) { l.out.Write(nl) l.n = 0 l.pendSpace = 0 + needsPrefix = isComment } if l.n == 0 { l.out.Write([]byte(l.indent)) } + if needsPrefix { + l.out.Write(prefix) + needsPrefix = false + } l.out.Write(space[:l.pendSpace]) l.out.Write([]byte(f)) l.n += l.pendSpace + w diff --git a/src/go/doc/comment_test.go b/src/go/doc/comment_test.go index 0687f3a62b..101f446287 100644 --- a/src/go/doc/comment_test.go +++ b/src/go/doc/comment_test.go @@ -134,6 +134,26 @@ $ pre2 }, text: ". Para.\n\n$ should not be ``escaped''", }, + { + in: "// A very long line of 46 char for line wrapping.", + out: []block{ + {opPara, []string{"// A very long line of 46 char for line wrapping."}}, + }, + text: `. // A very long line of 46 char for line +. // wrapping. +`, + }, + { + in: `/* A very long line of 46 char for line wrapping. +A very long line of 46 char for line wrapping. */`, + out: []block{ + {opPara, []string{"/* A very long line of 46 char for line wrapping.\n", "A very long line of 46 char for line wrapping. */"}}, + }, + text: `. /* A very long line of 46 char for line +. wrapping. A very long line of 46 char +. for line wrapping. */ +`, + }, } func TestBlocks(t *testing.T) { -- GitLab From c7408a87757f94ed72e3e2b7886880dcca946b28 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Wed, 6 Mar 2019 11:56:06 +1100 Subject: [PATCH 0297/1679] doc: sort map output in Effective Go And explain that it does this. A minor change probably worth mentioning, although (#28782) I'd still like to freeze this document against any substantial changes. Fix #30568. Change-Id: I74c56744871cfaf00dc52a9b480ca61d3ed19a6b Reviewed-on: https://go-review.googlesource.com/c/go/+/165597 Reviewed-by: Brad Fitzpatrick --- doc/effective_go.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/effective_go.html b/doc/effective_go.html index 34131868a4..b98235931c 100644 --- a/doc/effective_go.html +++ b/doc/effective_go.html @@ -1680,13 +1680,13 @@ maps. Here is a print statement for the time zone map defined in the previous s fmt.Printf("%v\n", timeZone) // or just fmt.Println(timeZone)

-which gives output +which gives output:

-map[CST:-21600 PST:-28800 EST:-18000 UTC:0 MST:-25200]
+map[CST:-21600 EST:-18000 MST:-25200 PST:-28800 UTC:0]
 

-For maps the keys may be output in any order, of course. +For maps, Printf and friends sort the output lexicographically by key. When printing a struct, the modified format %+v annotates the fields of the structure with their names, and for any value the alternate format %#v prints the value in full Go syntax. @@ -1710,7 +1710,7 @@ prints &{7 -2.35 abc def} &{a:7 b:-2.35 c:abc def} &main.T{a:7, b:-2.35, c:"abc\tdef"} -map[string]int{"CST":-21600, "PST":-28800, "EST":-18000, "UTC":0, "MST":-25200} +map[string]int{"CST":-21600, "EST":-18000, "MST":-25200, "PST":-28800, "UTC":0}

(Note the ampersands.) -- GitLab From 312bfc5d55994aaef5910716e096a675aa3bce39 Mon Sep 17 00:00:00 2001 From: Chris Marchesi Date: Wed, 6 Mar 2019 03:44:48 +0000 Subject: [PATCH 0298/1679] net/http: add request file upload benchmarks This adds benchmarks to test file uploads using PUT requests. It's designed to complement changes https://golang.org/cl/163599 and https://golang.org/cl/163737, allowing an easy comparison of performance before and after these changes are applied. Updates #30377. Co-authored-by: Emmanuel Odeke Change-Id: Ib8e692c61e1f7957d88c7101669d4f7fb8110c65 GitHub-Last-Rev: 242622b4fca9f289defa2f268efc31208743e5dd GitHub-Pull-Request: golang/go#30424 Reviewed-on: https://go-review.googlesource.com/c/go/+/163862 Run-TryBot: Emmanuel Odeke Reviewed-by: Emmanuel Odeke --- src/net/http/request_test.go | 91 ++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/net/http/request_test.go b/src/net/http/request_test.go index e8005571df..4e826fad15 100644 --- a/src/net/http/request_test.go +++ b/src/net/http/request_test.go @@ -8,12 +8,14 @@ import ( "bufio" "bytes" "context" + "crypto/rand" "encoding/base64" "fmt" "io" "io/ioutil" "mime/multipart" . "net/http" + "net/http/httptest" "net/url" "os" "reflect" @@ -1046,3 +1048,92 @@ func BenchmarkReadRequestWrk(b *testing.B) { Host: localhost:8080 `) } + +const ( + withTLS = true + noTLS = false +) + +func BenchmarkFileAndServer_1KB(b *testing.B) { + benchmarkFileAndServer(b, 1<<10) +} + +func BenchmarkFileAndServer_16MB(b *testing.B) { + benchmarkFileAndServer(b, 1<<24) +} + +func BenchmarkFileAndServer_64MB(b *testing.B) { + benchmarkFileAndServer(b, 1<<26) +} + +func benchmarkFileAndServer(b *testing.B, n int64) { + f, err := ioutil.TempFile(os.TempDir(), "go-bench-http-file-and-server") + if err != nil { + b.Fatalf("Failed to create temp file: %v", err) + } + + defer func() { + f.Close() + os.RemoveAll(f.Name()) + }() + + if _, err := io.CopyN(f, rand.Reader, n); err != nil { + b.Fatalf("Failed to copy %d bytes: %v", n, err) + } + + b.Run("NoTLS", func(b *testing.B) { + runFileAndServerBenchmarks(b, noTLS, f, n) + }) + + b.Run("TLS", func(b *testing.B) { + runFileAndServerBenchmarks(b, withTLS, f, n) + }) +} + +func runFileAndServerBenchmarks(b *testing.B, tlsOption bool, f *os.File, n int64) { + handler := HandlerFunc(func(rw ResponseWriter, req *Request) { + defer req.Body.Close() + nc, err := io.Copy(ioutil.Discard, req.Body) + if err != nil { + panic(err) + } + + if nc != n { + panic(fmt.Errorf("Copied %d Wanted %d bytes", nc, n)) + } + }) + + var cst *httptest.Server + if tlsOption == withTLS { + cst = httptest.NewTLSServer(handler) + } else { + cst = httptest.NewServer(handler) + } + + defer cst.Close() + b.ResetTimer() + for i := 0; i < b.N; i++ { + // Perform some setup. + b.StopTimer() + if _, err := f.Seek(0, 0); err != nil { + b.Fatalf("Failed to seek back to file: %v", err) + } + + b.StartTimer() + req, err := NewRequest("PUT", cst.URL, ioutil.NopCloser(f)) + if err != nil { + b.Fatal(err) + } + + req.ContentLength = n + // Prevent mime sniffing by setting the Content-Type. + req.Header.Set("Content-Type", "application/octet-stream") + res, err := cst.Client().Do(req) + if err != nil { + b.Fatalf("Failed to make request to backend: %v", err) + } + + res.Body.Close() + b.SetBytes(n) + } +} -- GitLab From 53d859bdf570699c7d581f6ba3cdc45d0ad102f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:05:23 +0100 Subject: [PATCH 0299/1679] runtime/cgo: add port for aix/ppc64 This commit add port of runtime/cgo for aix/ppc64. AIX assembly is different from Linux assembly, therefore gcc_ppc64.S must be redone for AIX. Change-Id: I780ebab4ef9c4ce912f4c4d521d8c135b1eebf6e Reviewed-on: https://go-review.googlesource.com/c/go/+/164002 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/cgo/asm_ppc64x.s | 13 +- src/runtime/cgo/gcc_aix_ppc64.S | 133 ++++++++++++++++++ src/runtime/cgo/gcc_context.c | 2 +- src/runtime/cgo/gcc_fatalf.c | 2 +- src/runtime/cgo/gcc_libinit.c | 2 +- .../cgo/{gcc_ppc64x.S => gcc_linux_ppc64x.S} | 1 + .../cgo/{gcc_linux_ppc64x.c => gcc_ppc64x.c} | 0 src/runtime/cgo/gcc_setenv.c | 2 +- src/runtime/cgo/setenv.go | 2 +- 9 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 src/runtime/cgo/gcc_aix_ppc64.S rename src/runtime/cgo/{gcc_ppc64x.S => gcc_linux_ppc64x.S} (99%) rename src/runtime/cgo/{gcc_linux_ppc64x.c => gcc_ppc64x.c} (100%) diff --git a/src/runtime/cgo/asm_ppc64x.s b/src/runtime/cgo/asm_ppc64x.s index 1cf27ddc96..3876f9389c 100644 --- a/src/runtime/cgo/asm_ppc64x.s +++ b/src/runtime/cgo/asm_ppc64x.s @@ -11,8 +11,6 @@ // func crosscall2(fn func(a unsafe.Pointer, n int32, ctxt uintptr), a unsafe.Pointer, n int32, ctxt uintptr) // Saves C callee-saved registers and calls fn with three arguments. TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 - // TODO(austin): ABI v1 (fn is probably a function descriptor) - // Start with standard C stack frame layout and linkage MOVD LR, R0 MOVD R0, 16(R1) // Save LR in caller's frame @@ -29,9 +27,16 @@ TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0 BL runtime·load_g(SB) MOVD R3, R12 - MOVD R3, CTR +#ifdef GOARCH_ppc64 + // ppc64 use elf ABI v1. we must get the real entry address from + // first slot of the function descriptor before call. + // Same for AIX. + MOVD 8(R12), R2 + MOVD (R12), R12 +#endif + MOVD R12, CTR MOVD R4, FIXED_FRAME+0(R1) - MOVD R5, FIXED_FRAME+8(R1) + MOVW R5, FIXED_FRAME+8(R1) MOVD R6, FIXED_FRAME+16(R1) BL (CTR) diff --git a/src/runtime/cgo/gcc_aix_ppc64.S b/src/runtime/cgo/gcc_aix_ppc64.S new file mode 100644 index 0000000000..bff6dd1999 --- /dev/null +++ b/src/runtime/cgo/gcc_aix_ppc64.S @@ -0,0 +1,133 @@ +// Copyright 2019 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. + +// +build ppc64 +// +build aix + +/* + * void crosscall_ppc64(void (*fn)(void), void *g) + * + * Calling into the gc tool chain, where all registers are caller save. + * Called from standard ppc64 C ABI, where r2, r14-r31, f14-f31 are + * callee-save, so they must be saved explicitly. + * AIX has a special assembly syntax and keywords that can be mixed with + * Linux assembly. + */ + .toc + .csect .text[PR] + .globl crosscall_ppc64 + .globl .crosscall_ppc64 + .csect crosscall_ppc64[DS] +crosscall_ppc64: + .llong .crosscall_ppc64, TOC[tc0], 0 + .csect .text[PR] +.crosscall_ppc64: + // Start with standard C stack frame layout and linkage + mflr 0 + std 0, 16(1) // Save LR in caller's frame + std 2, 40(1) // Save TOC in caller's frame + bl saveregs + stdu 1, -296(1) + + // Set up Go ABI constant registers + bl ._cgo_reginit + nop + + // Restore g pointer (r30 in Go ABI, which may have been clobbered by C) + mr 30, 4 + + // Call fn + mr 12, 3 + mtctr 12 + bctrl + + addi 1, 1, 296 + bl restoreregs + ld 2, 40(1) + ld 0, 16(1) + mtlr 0 + blr + +saveregs: + // Save callee-save registers + // O=-288; for R in {14..31}; do echo "\tstd\t$R, $O(1)"; ((O+=8)); done; for F in f{14..31}; do echo "\tstfd\t$F, $O(1)"; ((O+=8)); done + std 14, -288(1) + std 15, -280(1) + std 16, -272(1) + std 17, -264(1) + std 18, -256(1) + std 19, -248(1) + std 20, -240(1) + std 21, -232(1) + std 22, -224(1) + std 23, -216(1) + std 24, -208(1) + std 25, -200(1) + std 26, -192(1) + std 27, -184(1) + std 28, -176(1) + std 29, -168(1) + std 30, -160(1) + std 31, -152(1) + stfd 14, -144(1) + stfd 15, -136(1) + stfd 16, -128(1) + stfd 17, -120(1) + stfd 18, -112(1) + stfd 19, -104(1) + stfd 20, -96(1) + stfd 21, -88(1) + stfd 22, -80(1) + stfd 23, -72(1) + stfd 24, -64(1) + stfd 25, -56(1) + stfd 26, -48(1) + stfd 27, -40(1) + stfd 28, -32(1) + stfd 29, -24(1) + stfd 30, -16(1) + stfd 31, -8(1) + + blr + +restoreregs: + // O=-288; for R in {14..31}; do echo "\tld\t$R, $O(1)"; ((O+=8)); done; for F in {14..31}; do echo "\tlfd\t$F, $O(1)"; ((O+=8)); done + ld 14, -288(1) + ld 15, -280(1) + ld 16, -272(1) + ld 17, -264(1) + ld 18, -256(1) + ld 19, -248(1) + ld 20, -240(1) + ld 21, -232(1) + ld 22, -224(1) + ld 23, -216(1) + ld 24, -208(1) + ld 25, -200(1) + ld 26, -192(1) + ld 27, -184(1) + ld 28, -176(1) + ld 29, -168(1) + ld 30, -160(1) + ld 31, -152(1) + lfd 14, -144(1) + lfd 15, -136(1) + lfd 16, -128(1) + lfd 17, -120(1) + lfd 18, -112(1) + lfd 19, -104(1) + lfd 20, -96(1) + lfd 21, -88(1) + lfd 22, -80(1) + lfd 23, -72(1) + lfd 24, -64(1) + lfd 25, -56(1) + lfd 26, -48(1) + lfd 27, -40(1) + lfd 28, -32(1) + lfd 29, -24(1) + lfd 30, -16(1) + lfd 31, -8(1) + + blr diff --git a/src/runtime/cgo/gcc_context.c b/src/runtime/cgo/gcc_context.c index b46b6040d2..5fc0abb8bc 100644 --- a/src/runtime/cgo/gcc_context.c +++ b/src/runtime/cgo/gcc_context.c @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo -// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows #include "libcgo.h" diff --git a/src/runtime/cgo/gcc_fatalf.c b/src/runtime/cgo/gcc_fatalf.c index fdcf6f5e52..597e750f12 100644 --- a/src/runtime/cgo/gcc_fatalf.c +++ b/src/runtime/cgo/gcc_fatalf.c @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !android,linux freebsd +// +build aix !android,linux freebsd #include #include diff --git a/src/runtime/cgo/gcc_libinit.c b/src/runtime/cgo/gcc_libinit.c index 3dafd10b7b..d35726d953 100644 --- a/src/runtime/cgo/gcc_libinit.c +++ b/src/runtime/cgo/gcc_libinit.c @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris #include #include diff --git a/src/runtime/cgo/gcc_ppc64x.S b/src/runtime/cgo/gcc_linux_ppc64x.S similarity index 99% rename from src/runtime/cgo/gcc_ppc64x.S rename to src/runtime/cgo/gcc_linux_ppc64x.S index 5f37a8bfc1..595eb38460 100644 --- a/src/runtime/cgo/gcc_ppc64x.S +++ b/src/runtime/cgo/gcc_linux_ppc64x.S @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // +build ppc64 ppc64le +// +build linux /* * Apple still insists on underscore prefixes for C function names. diff --git a/src/runtime/cgo/gcc_linux_ppc64x.c b/src/runtime/cgo/gcc_ppc64x.c similarity index 100% rename from src/runtime/cgo/gcc_linux_ppc64x.c rename to src/runtime/cgo/gcc_ppc64x.c diff --git a/src/runtime/cgo/gcc_setenv.c b/src/runtime/cgo/gcc_setenv.c index ed5d203fb0..88e92bfd8a 100644 --- a/src/runtime/cgo/gcc_setenv.c +++ b/src/runtime/cgo/gcc_setenv.c @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris #include "libcgo.h" diff --git a/src/runtime/cgo/setenv.go b/src/runtime/cgo/setenv.go index fab43399e2..6495fcb5f8 100644 --- a/src/runtime/cgo/setenv.go +++ b/src/runtime/cgo/setenv.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package cgo -- GitLab From ed2fce2d87ea9aae2e6fcc11610fb64f72e5377e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 7 Jan 2019 10:22:42 +0100 Subject: [PATCH 0300/1679] cmd/link: support dwarf64 when writing .debug_frame Fixes #28558 Change-Id: I0ecd9c47fb017cf4bd44725a83a0016c7bb94633 Reviewed-on: https://go-review.googlesource.com/c/go/+/156478 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/dwarf.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index a150306df9..c226886557 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1391,13 +1391,22 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { fs.Type = sym.SDWARFSECT syms = append(syms, fs) + // Length field is 4 bytes on Dwarf32 and 12 bytes on Dwarf64 + lengthFieldSize := int64(4) + if isDwarf64(ctxt) { + lengthFieldSize += 8 + } + // Emit the CIE, Section 6.4.1 cieReserve := uint32(16) if haslinkregister(ctxt) { cieReserve = 32 } + if isDwarf64(ctxt) { + cieReserve += 4 // 4 bytes added for cid + } createUnitLength(ctxt, fs, uint64(cieReserve)) // initial length, must be multiple of thearch.ptrsize - addDwarfAddrField(ctxt, fs, 0xffffffff) // cid. + addDwarfAddrField(ctxt, fs, ^uint64(0)) // cid fs.AddUint8(3) // dwarf version (appendix F) fs.AddUint8(0) // augmentation "" dwarf.Uleb128put(dwarfctxt, fs, 1) // code_alignment_factor @@ -1423,8 +1432,7 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { dwarf.Uleb128put(dwarfctxt, fs, int64(-ctxt.Arch.PtrSize)/dataAlignmentFactor) // ...is saved at [CFA - (PtrSize/4)]. } - // 4 is to exclude the length field. - pad := int64(cieReserve) + 4 - fs.Size + pad := int64(cieReserve) + lengthFieldSize - fs.Size if pad < 0 { Exitf("dwarf: cieReserve too small by %d bytes.", -pad) @@ -1480,10 +1488,16 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { // Emit the FDE header, Section 6.4.1. // 4 bytes: length, must be multiple of thearch.ptrsize - // 4 bytes: Pointer to the CIE above, at offset 0 + // 4/8 bytes: Pointer to the CIE above, at offset 0 // ptrsize: initial location // ptrsize: address range - fs.AddUint32(ctxt.Arch, uint32(4+2*ctxt.Arch.PtrSize+len(deltaBuf))) // length (excludes itself) + + fdeLength := uint64(4 + 2*ctxt.Arch.PtrSize + len(deltaBuf)) + if isDwarf64(ctxt) { + fdeLength += 4 // 4 bytes added for CIE pointer + } + createUnitLength(ctxt, fs, fdeLength) + if ctxt.LinkMode == LinkExternal { addDwarfAddrRef(ctxt, fs, fs) } else { -- GitLab From 6dde1fd792ba4ce41fcce50fc1c66b38666d6924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 28 Feb 2019 09:13:56 +0100 Subject: [PATCH 0301/1679] runtime: disable TestGdbAutotmpTypes in short mode on aix/ppc64 TestGdbAutotmpTypes takes more than one minute due to gdb performances. Therefore, it must be skipped in short mode. Change-Id: I253ebce62264cc7367c9b0f6ce9c5088a9994641 Reviewed-on: https://go-review.googlesource.com/c/go/+/164339 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/runtime/runtime-gdb_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index d0f905e4d7..d47c7c2262 100644 --- a/src/runtime/runtime-gdb_test.go +++ b/src/runtime/runtime-gdb_test.go @@ -36,8 +36,6 @@ func checkGdbEnvironment(t *testing.T) { if runtime.GOARCH == "mips" { t.Skip("skipping gdb tests on linux/mips; see https://golang.org/issue/25939") } - case "aix": - t.Skip("gdb does not work on AIX; see https://golang.org/issue/28558") case "freebsd": t.Skip("skipping gdb tests on FreeBSD; see https://golang.org/issue/29508") } @@ -396,6 +394,10 @@ func TestGdbAutotmpTypes(t *testing.T) { t.Parallel() checkGdbVersion(t) + if runtime.GOOS == "aix" && testing.Short() { + t.Skip("TestGdbAutotmpTypes is too slow on aix/ppc64") + } + dir, err := ioutil.TempDir("", "go-build") if err != nil { t.Fatalf("failed to create temp directory: %v", err) -- GitLab From 43e8fd4ef1ae24f1505bd34708fc30aa2b736c52 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Mon, 4 Feb 2019 13:01:11 +0530 Subject: [PATCH 0302/1679] go/parser: include more comments in a struct or interface While parsing inside a struct or an interface, skipping over empty lines too to collect the next group of comments. We do not need to skip over more than 1 empty line since gofmt already removes multiple empty consecutive lines. Fixes #10858 Change-Id: I0c97b65b5fc44e225e5dc7871ace24f43419ce08 Reviewed-on: https://go-review.googlesource.com/c/go/+/161177 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/go/doc/testdata/issue10858.0.golden | 79 ++++++++++++++++++ src/go/doc/testdata/issue10858.1.golden | 79 ++++++++++++++++++ src/go/doc/testdata/issue10858.2.golden | 79 ++++++++++++++++++ src/go/doc/testdata/issue10858.go | 102 ++++++++++++++++++++++++ src/go/parser/parser.go | 15 +++- 5 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 src/go/doc/testdata/issue10858.0.golden create mode 100644 src/go/doc/testdata/issue10858.1.golden create mode 100644 src/go/doc/testdata/issue10858.2.golden create mode 100644 src/go/doc/testdata/issue10858.go diff --git a/src/go/doc/testdata/issue10858.0.golden b/src/go/doc/testdata/issue10858.0.golden new file mode 100644 index 0000000000..51f8f1e0d3 --- /dev/null +++ b/src/go/doc/testdata/issue10858.0.golden @@ -0,0 +1,79 @@ +// +PACKAGE issue10858 + +IMPORTPATH + testdata/issue10858 + +IMPORTS + unsafe + +FILENAMES + testdata/issue10858.go + +CONSTANTS + // First line Second line + const ( + + // C1 comment + C1 int = 1 << 0 + + C2 int = 1 << 1 + + // C3 comment + // + // with a line gap + C3 int = 1 << 2 + ) + + +TYPES + // StructTag is a comment with 2 connecting lines + type StructTag string // adjacent comment + + // Get returns the value associated with key in the tag string. + func (tag StructTag) Get(key string) string + + // First line Second line + type Type interface { + // Should be present + + // Align returns the alignment in bytes of a value of + // this type when allocated in memory. + Align() int + + // FieldAlign returns the alignment in bytes of a value of + // this type when used as a field in a struct. + FieldAlign() int // adjacent comment + + // Ptr: Elem + // Slice: Elem + + // Bits returns the size of the type in bits. + + // + // It panics if the type's Kind is not one of the + // sized or unsized Int, Uint, Float, or Complex kinds. + Bits() int + } + + // NewType is a comment ending with this line. + func NewType() Type + + // TypeAlg is a copy of runtime.typeAlg + type TypeAlg struct { + // function for hashing objects of this type + // + // + // (ptr to object, seed) -> hash + Hash func(unsafe.Pointer, uintptr) uintptr + + // include + // include + + // include + + // function for comparing objects of this type + // (ptr to object A, ptr to object B) -> ==? + Equal func(unsafe.Pointer, unsafe.Pointer) bool + } + diff --git a/src/go/doc/testdata/issue10858.1.golden b/src/go/doc/testdata/issue10858.1.golden new file mode 100644 index 0000000000..51f8f1e0d3 --- /dev/null +++ b/src/go/doc/testdata/issue10858.1.golden @@ -0,0 +1,79 @@ +// +PACKAGE issue10858 + +IMPORTPATH + testdata/issue10858 + +IMPORTS + unsafe + +FILENAMES + testdata/issue10858.go + +CONSTANTS + // First line Second line + const ( + + // C1 comment + C1 int = 1 << 0 + + C2 int = 1 << 1 + + // C3 comment + // + // with a line gap + C3 int = 1 << 2 + ) + + +TYPES + // StructTag is a comment with 2 connecting lines + type StructTag string // adjacent comment + + // Get returns the value associated with key in the tag string. + func (tag StructTag) Get(key string) string + + // First line Second line + type Type interface { + // Should be present + + // Align returns the alignment in bytes of a value of + // this type when allocated in memory. + Align() int + + // FieldAlign returns the alignment in bytes of a value of + // this type when used as a field in a struct. + FieldAlign() int // adjacent comment + + // Ptr: Elem + // Slice: Elem + + // Bits returns the size of the type in bits. + + // + // It panics if the type's Kind is not one of the + // sized or unsized Int, Uint, Float, or Complex kinds. + Bits() int + } + + // NewType is a comment ending with this line. + func NewType() Type + + // TypeAlg is a copy of runtime.typeAlg + type TypeAlg struct { + // function for hashing objects of this type + // + // + // (ptr to object, seed) -> hash + Hash func(unsafe.Pointer, uintptr) uintptr + + // include + // include + + // include + + // function for comparing objects of this type + // (ptr to object A, ptr to object B) -> ==? + Equal func(unsafe.Pointer, unsafe.Pointer) bool + } + diff --git a/src/go/doc/testdata/issue10858.2.golden b/src/go/doc/testdata/issue10858.2.golden new file mode 100644 index 0000000000..51f8f1e0d3 --- /dev/null +++ b/src/go/doc/testdata/issue10858.2.golden @@ -0,0 +1,79 @@ +// +PACKAGE issue10858 + +IMPORTPATH + testdata/issue10858 + +IMPORTS + unsafe + +FILENAMES + testdata/issue10858.go + +CONSTANTS + // First line Second line + const ( + + // C1 comment + C1 int = 1 << 0 + + C2 int = 1 << 1 + + // C3 comment + // + // with a line gap + C3 int = 1 << 2 + ) + + +TYPES + // StructTag is a comment with 2 connecting lines + type StructTag string // adjacent comment + + // Get returns the value associated with key in the tag string. + func (tag StructTag) Get(key string) string + + // First line Second line + type Type interface { + // Should be present + + // Align returns the alignment in bytes of a value of + // this type when allocated in memory. + Align() int + + // FieldAlign returns the alignment in bytes of a value of + // this type when used as a field in a struct. + FieldAlign() int // adjacent comment + + // Ptr: Elem + // Slice: Elem + + // Bits returns the size of the type in bits. + + // + // It panics if the type's Kind is not one of the + // sized or unsized Int, Uint, Float, or Complex kinds. + Bits() int + } + + // NewType is a comment ending with this line. + func NewType() Type + + // TypeAlg is a copy of runtime.typeAlg + type TypeAlg struct { + // function for hashing objects of this type + // + // + // (ptr to object, seed) -> hash + Hash func(unsafe.Pointer, uintptr) uintptr + + // include + // include + + // include + + // function for comparing objects of this type + // (ptr to object A, ptr to object B) -> ==? + Equal func(unsafe.Pointer, unsafe.Pointer) bool + } + diff --git a/src/go/doc/testdata/issue10858.go b/src/go/doc/testdata/issue10858.go new file mode 100644 index 0000000000..aebea50651 --- /dev/null +++ b/src/go/doc/testdata/issue10858.go @@ -0,0 +1,102 @@ +package issue10858 + +import "unsafe" + +// Should be ignored + +// First line +// +// Second line +type Type interface { + // Should be present + + // Align returns the alignment in bytes of a value of + // this type when allocated in memory. + Align() int + + // FieldAlign returns the alignment in bytes of a value of + // this type when used as a field in a struct. + FieldAlign() int // adjacent comment + + // Ptr: Elem + // Slice: Elem + + // Bits returns the size of the type in bits. + + // + // It panics if the type's Kind is not one of the + // sized or unsized Int, Uint, Float, or Complex kinds. + Bits() int + + // Should be ignored +} + +// Should be ignored + +// NewType is a comment +// +// ending with this line. +func NewType() Type {} + +// Ignore + +// First line +// +// Second line +const ( + // Should be ignored + + // C1 comment + C1 int = 1 << 0 + + // Should + // + // be ignored + + C2 int = 1 << 1 + + // C3 comment + // + // with a line gap + C3 int = 1 << 2 + + // Should be ignored +) + +// Should be ignored + +// Should be ignored + +// TypeAlg is a +// copy of runtime.typeAlg +type TypeAlg struct { + // function for hashing objects of this type + // + // + // (ptr to object, seed) -> hash + Hash func(unsafe.Pointer, uintptr) uintptr + + // include + // include + + // include + + // function for comparing objects of this type + // (ptr to object A, ptr to object B) -> ==? + Equal func(unsafe.Pointer, unsafe.Pointer) bool + // Should be ignored +} + +// Should be ignored + +// StructTag is a comment +// +// +// with 2 connecting lines +type StructTag string // adjacent comment + +// Should be ignored + +// Get returns the value associated with key in the tag string. +func (tag StructTag) Get(key string) string { +} diff --git a/src/go/parser/parser.go b/src/go/parser/parser.go index ba16b65224..9294bb6b3e 100644 --- a/src/go/parser/parser.go +++ b/src/go/parser/parser.go @@ -63,6 +63,7 @@ type parser struct { topScope *ast.Scope // top-most scope; may be pkgScope unresolved []*ast.Ident // unresolved identifiers imports []*ast.ImportSpec // list of imports + inStruct bool // if set, parser is parsing a struct or interface (for comment collection) // Label scopes // (maintained by open/close LabelScope) @@ -337,7 +338,15 @@ func (p *parser) next() { // consume successor comments, if any endline = -1 for p.tok == token.COMMENT { - comment, endline = p.consumeCommentGroup(1) + n := 1 + // When inside a struct (or interface), we don't want to lose comments + // separated from individual field (or method) documentation by empty + // lines. Allow for some white space in this case and collect those + // comments as a group. See issue #10858 for details. + if p.inStruct { + n = 2 + } + comment, endline = p.consumeCommentGroup(n) } if endline+1 == p.file.Line(p.pos) { @@ -748,6 +757,7 @@ func (p *parser) parseStructType() *ast.StructType { } pos := p.expect(token.STRUCT) + p.inStruct = true lbrace := p.expect(token.LBRACE) scope := ast.NewScope(nil) // struct scope var list []*ast.Field @@ -758,6 +768,7 @@ func (p *parser) parseStructType() *ast.StructType { list = append(list, p.parseFieldDecl(scope)) } rbrace := p.expect(token.RBRACE) + p.inStruct = false return &ast.StructType{ Struct: pos, @@ -959,6 +970,7 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType { } pos := p.expect(token.INTERFACE) + p.inStruct = true lbrace := p.expect(token.LBRACE) scope := ast.NewScope(nil) // interface scope var list []*ast.Field @@ -966,6 +978,7 @@ func (p *parser) parseInterfaceType() *ast.InterfaceType { list = append(list, p.parseMethodSpec(scope)) } rbrace := p.expect(token.RBRACE) + p.inStruct = false return &ast.InterfaceType{ Interface: pos, -- GitLab From 583fddf3bc85802869ce2d286fe8b32cc6728bc8 Mon Sep 17 00:00:00 2001 From: Kshitij Saraogi Date: Mon, 4 Mar 2019 16:29:25 +0530 Subject: [PATCH 0303/1679] net/http: remove discrepancies between the MIME Sniffing Spec and its implementation The change fixes the following deviations between the existing implementation and the Spec: 1. Using pattern instead of "mask" for assertion and iteration in the Pattern Matching Algorithm. 2. Rename "image/vnd.microsoft.icon" to "image/x-icon" and add another signature for the same. 3. Using named strings instead of hexadecimal representation in "application/zip" and "application/x-rar-compressed". 4. Reordering "sniffSignatures" in accordance with the Spec section "Identifying a resource with an unknown MIME type". In addition to the above fixes, unit tests for Image MIME type group are added. Fixes #30570 Change-Id: I97d2ae22b426c3c57bf8efd2ed9396c0be983688 Reviewed-on: https://go-review.googlesource.com/c/go/+/165277 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/net/http/sniff.go | 110 +++++++++++++++++++++++++------------ src/net/http/sniff_test.go | 6 ++ 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/src/net/http/sniff.go b/src/net/http/sniff.go index c1494abb4c..f03f723542 100644 --- a/src/net/http/sniff.go +++ b/src/net/http/sniff.go @@ -37,6 +37,8 @@ func DetectContentType(data []byte) string { return "application/octet-stream" // fallback } +// isWS reports whether the provided byte is a whitespace byte (0xWS) +// as defined in https://mimesniff.spec.whatwg.org/#terminology. func isWS(b byte) bool { switch b { case '\t', '\n', '\x0c', '\r', ' ': @@ -45,6 +47,16 @@ func isWS(b byte) bool { return false } +// isTT reports whether the provided byte is a tag-terminating byte (0xTT) +// as defined in https://mimesniff.spec.whatwg.org/#terminology. +func isTT(b byte) bool { + switch b { + case ' ', '>': + return true + } + return false +} + type sniffSig interface { // match returns the MIME type of the data, or "" if unknown. match(data []byte, firstNonWS int) string @@ -69,33 +81,57 @@ var sniffSignatures = []sniffSig{ htmlSig(" Date: Tue, 5 Mar 2019 22:31:37 +0000 Subject: [PATCH 0304/1679] net/mail: better error in ParseAddress when missing "@domain" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the input was "John Doe", we're definitely missing "", as "John Doe@domain" isn't a valid email address. However, if the input was "john.doe", it's possible that the user meant "john.doe@domain", and not just "john.doe ". Make it clear in the error that either could be the source of the problem. Fixes #27064. Change-Id: I1b8f1342775d711823dffc3db974898ee62d3a34 Reviewed-on: https://go-review.googlesource.com/c/go/+/165517 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/mail/message.go | 15 +++++++++++++++ src/net/mail/message_test.go | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/net/mail/message.go b/src/net/mail/message.go index 554377aa1d..e0907806ca 100644 --- a/src/net/mail/message.go +++ b/src/net/mail/message.go @@ -342,6 +342,21 @@ func (p *addrParser) parseAddress(handleGroup bool) ([]*Address, error) { } // angle-addr = "<" addr-spec ">" if !p.consume('<') { + atext := true + for _, r := range displayName { + if !isAtext(r, true, false) { + atext = false + break + } + } + if atext { + // The input is like "foo.bar"; it's possible the input + // meant to be "foo.bar@domain", or "foo.bar <...>". + return nil, errors.New("mail: missing '@' or angle-addr") + } + // The input is like "Full Name", which couldn't possibly be a + // valid email address if followed by "@domain"; the input + // likely meant to be "Full Name <...>". return nil, errors.New("mail: no angle-addr") } spec, err = p.consumeAddrSpec() diff --git a/src/net/mail/message_test.go b/src/net/mail/message_test.go index 14ac9192a4..2950bc4de9 100644 --- a/src/net/mail/message_test.go +++ b/src/net/mail/message_test.go @@ -144,6 +144,9 @@ func TestAddressParsingError(t *testing.T) { 12: {"root group: embed group: null@example.com;", "no angle-addr"}, 13: {"group not closed: null@example.com", "expected comma"}, 14: {"group: first@example.com, second@example.com;", "group with multiple addresses"}, + 15: {"john.doe", "missing '@' or angle-addr"}, + 16: {"john.doe@", "no angle-addr"}, + 17: {"John Doe@foo.bar", "no angle-addr"}, } for i, tc := range mustErrTestCases { -- GitLab From 958e212db799e609b2a8df51cdd85c9341e7a404 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 17 Jan 2019 16:20:51 +0100 Subject: [PATCH 0305/1679] syscall: fix hang when using Unshareflags: CLONE_NEWUSER with uid/gid mapping (linux) Note that this particular combination of properties still fails (EPERM), but it no longer hangs. Updates #29789 Change-Id: I29b15b85a25a7acd7ae89ffc5fed074bcdfe0a12 Reviewed-on: https://go-review.googlesource.com/c/go/+/158297 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/syscall/exec_linux.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index 6c761f85c4..79c0d77422 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -154,7 +154,7 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att runtime_BeforeFork() locked = true switch { - case runtime.GOARCH == "amd64" && sys.Cloneflags&CLONE_NEWUSER == 0: + case runtime.GOARCH == "amd64" && (sys.Cloneflags&CLONE_NEWUSER == 0 && sys.Unshareflags&CLONE_NEWUSER == 0): r1, err1 = rawVforkSyscall(SYS_CLONE, uintptr(SIGCHLD|CLONE_VFORK|CLONE_VM)|sys.Cloneflags) case runtime.GOARCH == "s390x": r1, _, err1 = RawSyscall6(SYS_CLONE, 0, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0) -- GitLab From 0ff0df8be3b2e532de6a18ba4040d2a7ebaee37f Mon Sep 17 00:00:00 2001 From: "Motkov.Kirill" Date: Wed, 6 Mar 2019 11:16:14 +0000 Subject: [PATCH 0306/1679] fmt: rewrite if-else-if-else chain to switch statement This commit rewrites if-else-if-else chain in scanBasePrefix function as a switch. Based on Go style guide https://golang.org/doc/effective_go.html#switch Change-Id: I6392bfd4ad0384f3dc8896de4763bb2164c3eead GitHub-Last-Rev: 9bd8dfdac03c466bf8cacf3119f6245dfb61c009 GitHub-Pull-Request: golang/go#30621 Reviewed-on: https://go-review.googlesource.com/c/go/+/165619 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/fmt/scan.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/fmt/scan.go b/src/fmt/scan.go index d42703cb71..fe6cbd477f 100644 --- a/src/fmt/scan.go +++ b/src/fmt/scan.go @@ -612,25 +612,25 @@ func (s *ss) scanRune(bitSize int) int64 { // scanBasePrefix reports whether the integer begins with a bas prefix // and returns the base, digit string, and whether a zero was found. // It is called only if the verb is %v. -func (s *ss) scanBasePrefix() (base int, digits string, found bool) { +func (s *ss) scanBasePrefix() (int, string, bool) { if !s.peek("0") { return 0, decimalDigits + "_", false } s.accept("0") - found = true // We've put a digit into the token buffer. // Special cases for 0, 0b, 0o, 0x. - base, digits = 0, octalDigits+"_" - if s.peek("bB") { + switch { + case s.peek("bB"): s.consume("bB", true) - base, digits = 0, binaryDigits+"_" - } else if s.peek("oO") { + return 0, binaryDigits + "_", true + case s.peek("oO"): s.consume("oO", true) - base, digits = 0, octalDigits+"_" - } else if s.peek("xX") { + return 0, octalDigits + "_", true + case s.peek("xX"): s.consume("xX", true) - base, digits = 0, hexadecimalDigits+"_" + return 0, hexadecimalDigits + "_", true + default: + return 0, octalDigits + "_", true } - return } // scanInt returns the value of the integer represented by the next -- GitLab From 80f10965ee9f6063f587baffce9c1fa8fc80a5ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:16:38 +0100 Subject: [PATCH 0307/1679] cmd/link, runtime: allow external linking for aix/ppc64 This commit adds external linking in cmd/link for aix/ppc64. As relocations on .text data aren't possible on AIX, Segrelrodata is used to move all these datas to .data section. Change-Id: I4d1361c1fc9290e11e6f5560864460c76551dbeb Reviewed-on: https://go-review.googlesource.com/c/go/+/164003 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/config.go | 6 +- src/cmd/link/internal/ld/data.go | 17 ++- src/cmd/link/internal/ld/dwarf.go | 1 + src/cmd/link/internal/ld/lib.go | 19 ++- src/cmd/link/internal/ld/xcoff.go | 208 +++++++++++++++++++++++++++-- src/cmd/link/internal/ppc64/asm.go | 53 +++++++- src/cmd/link/internal/ppc64/obj.go | 1 + src/runtime/asm_ppc64x.s | 7 + src/runtime/rt0_aix_ppc64.s | 9 ++ 9 files changed, 297 insertions(+), 24 deletions(-) diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 60b6491859..40be3a553c 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -247,7 +247,7 @@ func determineLinkMode(ctxt *Link) { } ctxt.LinkMode = LinkInternal case "1": - if objabi.GOARCH == "ppc64" { + if objabi.GOARCH == "ppc64" && objabi.GOOS != "aix" { Exitf("external linking requested via GO_EXTLINK_ENABLED but not supported for %s/ppc64", objabi.GOOS) } ctxt.LinkMode = LinkExternal @@ -261,7 +261,7 @@ func determineLinkMode(ctxt *Link) { } else { ctxt.LinkMode = LinkInternal } - if objabi.GOARCH == "ppc64" && ctxt.LinkMode == LinkExternal { + if objabi.GOARCH == "ppc64" && objabi.GOOS != "aix" && ctxt.LinkMode == LinkExternal { Exitf("external linking is not supported for %s/ppc64", objabi.GOOS) } } @@ -270,7 +270,7 @@ func determineLinkMode(ctxt *Link) { Exitf("internal linking requested but external linking required: %s", reason) } case LinkExternal: - if objabi.GOARCH == "ppc64" { + if objabi.GOARCH == "ppc64" && objabi.GOOS != "aix" { Exitf("external linking not supported for %s/ppc64", objabi.GOOS) } } diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 46d85f003d..2f9940455e 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -308,6 +308,8 @@ func relocsym(ctxt *Link, s *sym.Symbol) { } } else if ctxt.HeadType == objabi.Hwindows { // nothing to do + } else if ctxt.HeadType == objabi.Haix { + o = Symaddr(r.Sym) + r.Add } else { Errorf(s, "unhandled pcrel relocation to %s on %v", rs.Name, ctxt.HeadType) } @@ -1400,7 +1402,7 @@ func (ctxt *Link) dodata() { if len(data[sym.STLSBSS]) > 0 { var sect *sym.Section - if ctxt.IsELF && (ctxt.LinkMode == LinkExternal || !*FlagD) { + if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && (ctxt.LinkMode == LinkExternal || !*FlagD) { sect = addsection(ctxt.Arch, &Segdata, ".tbss", 06) sect.Align = int32(ctxt.Arch.PtrSize) sect.Vaddr = 0 @@ -1538,7 +1540,7 @@ func (ctxt *Link) dodata() { if ctxt.UseRelro() { addrelrosection = func(suffix string) *sym.Section { seg := &Segrelrodata - if ctxt.LinkMode == LinkExternal { + if ctxt.LinkMode == LinkExternal && ctxt.HeadType != objabi.Haix { // Using a separate segment with an external // linker results in some programs moving // their data sections unexpectedly, which @@ -2046,6 +2048,10 @@ func (ctxt *Link) address() []*sym.Segment { // align to page boundary so as not to mix // rodata, rel-ro data, and executable text. va = uint64(Rnd(int64(va), int64(*FlagRound))) + if ctxt.HeadType == objabi.Haix { + // Relro data are inside data segment on AIX. + va += uint64(XCOFFDATABASE) - uint64(XCOFFTEXTBASE) + } order = append(order, &Segrelrodata) Segrelrodata.Rwx = 06 @@ -2060,9 +2066,10 @@ func (ctxt *Link) address() []*sym.Segment { } va = uint64(Rnd(int64(va), int64(*FlagRound))) - if ctxt.HeadType == objabi.Haix { + if ctxt.HeadType == objabi.Haix && len(Segrelrodata.Sections) == 0 { // Data sections are moved to an unreachable segment // to ensure that they are position-independent. + // Already done if relro sections exist. va += uint64(XCOFFDATABASE) - uint64(XCOFFTEXTBASE) } order = append(order, &Segdata) @@ -2073,11 +2080,11 @@ func (ctxt *Link) address() []*sym.Segment { var bss *sym.Section var noptrbss *sym.Section for i, s := range Segdata.Sections { - if ctxt.IsELF && s.Name == ".tbss" { + if (ctxt.IsELF || ctxt.HeadType == objabi.Haix) && s.Name == ".tbss" { continue } vlen := int64(s.Length) - if i+1 < len(Segdata.Sections) && !(ctxt.IsELF && Segdata.Sections[i+1].Name == ".tbss") { + if i+1 < len(Segdata.Sections) && !((ctxt.IsELF || ctxt.HeadType == objabi.Haix) && Segdata.Sections[i+1].Name == ".tbss") { vlen = int64(Segdata.Sections[i+1].Vaddr - s.Vaddr) } s.Vaddr = va diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index c226886557..0b17985da5 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1683,6 +1683,7 @@ func dwarfEnabled(ctxt *Link) bool { } if ctxt.LinkMode == LinkExternal { + // TODO(aix): enable DWARF switch { case ctxt.IsELF: case ctxt.HeadType == objabi.Hdarwin: diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 2cb7ae72e4..06fa071101 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -133,6 +133,7 @@ type Arch struct { Gentext func(*Link) Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool PEreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool + Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. @@ -179,7 +180,7 @@ func (ctxt *Link) UseRelro() bool { case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin: return ctxt.IsELF default: - return ctxt.linkShared + return ctxt.linkShared || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) } } @@ -405,7 +406,7 @@ func (ctxt *Link) loadlib() { *FlagTextAddr = 0 } - if ctxt.LinkMode == LinkExternal && ctxt.Arch.Family == sys.PPC64 { + if ctxt.LinkMode == LinkExternal && ctxt.Arch.Family == sys.PPC64 && objabi.GOOS != "aix" { toc := ctxt.Syms.Lookup(".TOC.", 0) toc.Type = sym.SDYNIMPORT } @@ -1145,6 +1146,11 @@ func (ctxt *Link) hostlink() { } else { argv = append(argv, "-mconsole") } + case objabi.Haix: + argv = append(argv, "-pthread") + // prevent ld to reorder .text functions to keep the same + // first/last functions for moduledata. + argv = append(argv, "-Wl,-bnoobjreorder") } switch ctxt.BuildMode { @@ -1493,7 +1499,7 @@ func hostlinkArchArgs(arch *sys.Arch) []string { switch arch.Family { case sys.I386: return []string{"-m32"} - case sys.AMD64, sys.PPC64, sys.S390X: + case sys.AMD64, sys.S390X: return []string{"-m64"} case sys.ARM: return []string{"-marm"} @@ -1503,6 +1509,13 @@ func hostlinkArchArgs(arch *sys.Arch) []string { return []string{"-mabi=64"} case sys.MIPS: return []string{"-mabi=32"} + case sys.PPC64: + if objabi.GOOS == "aix" { + return []string{"-maix64"} + } else { + return []string{"-m64"} + } + } return nil } diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 4535b1ad60..7826e1b7a5 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -10,6 +10,7 @@ import ( "cmd/link/internal/sym" "encoding/binary" "math/bits" + "sort" "strings" ) @@ -153,6 +154,7 @@ const ( LDHDRSZ_32 = 32 LDHDRSZ_64 = 56 LDSYMSZ_64 = 24 + RELSZ_64 = 14 ) // Type representing all XCOFF symbols. @@ -362,6 +364,31 @@ type xcoffLoaderReloc struct { const ( XCOFF_R_POS = 0x00 // A(sym) Positive Relocation + XCOFF_R_NEG = 0x01 // -A(sym) Negative Relocation + XCOFF_R_REL = 0x02 // A(sym-*) Relative to self + XCOFF_R_TOC = 0x03 // A(sym-TOC) Relative to TOC + XCOFF_R_TRL = 0x12 // A(sym-TOC) TOC Relative indirect load. + + XCOFF_R_TRLA = 0x13 // A(sym-TOC) TOC Rel load address. modifiable inst + XCOFF_R_GL = 0x05 // A(external TOC of sym) Global Linkage + XCOFF_R_TCL = 0x06 // A(local TOC of sym) Local object TOC address + XCOFF_R_RL = 0x0C // A(sym) Pos indirect load. modifiable instruction + XCOFF_R_RLA = 0x0D // A(sym) Pos Load Address. modifiable instruction + XCOFF_R_REF = 0x0F // AL0(sym) Non relocating ref. No garbage collect + XCOFF_R_BA = 0x08 // A(sym) Branch absolute. Cannot modify instruction + XCOFF_R_RBA = 0x18 // A(sym) Branch absolute. modifiable instruction + XCOFF_R_BR = 0x0A // A(sym-*) Branch rel to self. non modifiable + XCOFF_R_RBR = 0x1A // A(sym-*) Branch rel to self. modifiable instr + + XCOFF_R_TLS = 0x20 // General-dynamic reference to TLS symbol + XCOFF_R_TLS_IE = 0x21 // Initial-exec reference to TLS symbol + XCOFF_R_TLS_LD = 0x22 // Local-dynamic reference to TLS symbol + XCOFF_R_TLS_LE = 0x23 // Local-exec reference to TLS symbol + XCOFF_R_TLSM = 0x24 // Module reference to TLS symbol + XCOFF_R_TLSML = 0x25 // Module reference to local (own) module + + XCOFF_R_TOCU = 0x30 // Relative to TOC - high order bits + XCOFF_R_TOCL = 0x31 // Relative to TOC - low order bits ) type XcoffLdStr64 struct { @@ -374,6 +401,9 @@ type xcoffFile struct { xfhdr XcoffFileHdr64 xahdr XcoffAoutHdr64 sections []*XcoffScnHdr64 + sectText *XcoffScnHdr64 + sectData *XcoffScnHdr64 + sectBss *XcoffScnHdr64 stringTable xcoffStringTable sectNameToScnum map[string]int16 loaderSize uint64 @@ -487,10 +517,15 @@ func (f *xcoffFile) getXCOFFscnum(sect *sym.Section) int16 { if sect.Name == ".noptrbss" || sect.Name == ".bss" { return f.sectNameToScnum[".bss"] } + if sect.Name == ".tbss" { + return f.sectNameToScnum[".tbss"] + } Errorf(nil, "unknown XCOFF segment data section: %s", sect.Name) case &Segdwarf: name, _ := xcoffGetDwarfSubtype(sect.Name) return f.sectNameToScnum[name] + case &Segrelrodata: + return f.sectNameToScnum[".data"] } Errorf(nil, "getXCOFFscnum not implemented for section %s", sect.Name) return -1 @@ -746,6 +781,7 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { s.Nsclass = C_HIDEXT } + x.Dynid = int32(xfile.symbolCount) syms = append(syms, s) // Update current csect size @@ -801,6 +837,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, Ntype: SYM_TYPE_FUNC, Nnumaux: 1, } + x.Dynid = int32(xfile.symbolCount) syms = append(syms, s) size := uint64(x.Size) @@ -835,6 +872,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, s.Nsclass = C_HIDEXT } + x.Dynid = int32(xfile.symbolCount) syms = append(syms, s) // Create auxiliary entry @@ -849,9 +887,18 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, Xscnlenlo: uint32(size & 0xFFFFFFFF), Xscnlenhi: uint32(size >> 32), } - // Read only data + if x.Type >= sym.STYPE && x.Type <= sym.SPCLNTAB { - a4.Xsmclas = XMC_RO + if ctxt.LinkMode == LinkExternal && strings.HasPrefix(x.Sect.Name, ".data.rel.ro") { + // During external linking, read-only datas with relocation + // must be in .data. + a4.Xsmclas = XMC_RW + } else { + // Read only data + a4.Xsmclas = XMC_RO + } + } else if x.Type == sym.SDATA && strings.HasPrefix(x.Name, "TOC.") && ctxt.LinkMode == LinkExternal { + a4.Xsmclas = XMC_TC } else if x.Name == "TOC" { a4.Xsmclas = XMC_TC0 } else { @@ -876,6 +923,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, Noffset: uint32(xfile.stringTable.add(str)), Nnumaux: 1, } + x.Dynid = int32(xfile.symbolCount) syms = append(syms, s) a4 := &XcoffAuxCSect64{ @@ -971,7 +1019,7 @@ func (f *xcoffFile) genDynSym(ctxt *Link) { func (f *xcoffFile) adddynimpsym(ctxt *Link, s *sym.Symbol) { // Check that library name is given. // Pattern is already checked when compiling. - if s.Dynimplib() == "" { + if ctxt.LinkMode == LinkInternal && s.Dynimplib() == "" { Errorf(s, "imported symbol must have a given library") } @@ -1008,6 +1056,9 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s *sym.Symbol) { // Xcoffadddynrel adds a dynamic relocation in a XCOFF file. // This relocation will be made by the loader. func Xcoffadddynrel(ctxt *Link, s *sym.Symbol, r *sym.Reloc) bool { + if ctxt.LinkMode == LinkExternal { + return true + } if s.Type <= sym.SPCLNTAB { Errorf(s, "cannot have a relocation to %s in a text section symbol", r.Sym.Name) return false @@ -1072,6 +1123,7 @@ func (ctxt *Link) doxcoff() { toc := ctxt.Syms.Lookup("TOC", 0) toc.Type = sym.SXCOFFTOC toc.Attr |= sym.AttrReachable + toc.Attr |= sym.AttrVisibilityHidden // XCOFF does not allow relocations of data symbol address to a text symbol. // Such case occurs when a RODATA symbol retrieves a data symbol address. @@ -1110,6 +1162,7 @@ func (ctxt *Link) doxcoff() { if !ep.Attr.Reachable() { Exitf("wrong entry point") } + xfile.loaderSymbols = append(xfile.loaderSymbols, &xcoffLoaderSymbol{ sym: ep, smtype: XTY_ENT | XTY_SD, @@ -1123,6 +1176,12 @@ func (ctxt *Link) doxcoff() { s.Type = sym.SXCOFFTOC } } + + if ctxt.LinkMode == LinkExternal { + // Change main name to match __start code. + main := ctxt.Syms.ROLookup("_main", 0) + main.Name = ".main" + } } // Loader section @@ -1337,7 +1396,7 @@ func (f *xcoffFile) writeFileHeader(ctxt *Link) { f.xfhdr.Fnsyms = int32(f.symbolCount) } - if ctxt.BuildMode == BuildModeExe { + if ctxt.BuildMode == BuildModeExe && ctxt.LinkMode == LinkInternal { f.xfhdr.Fopthdr = AOUTHSZ_EXEC64 f.xfhdr.Fflags = F_EXEC @@ -1383,15 +1442,41 @@ func Asmbxcoff(ctxt *Link, fileoff int64) { xfile.xahdr.Otextstart = s.Svaddr xfile.xahdr.Osntext = xfile.sectNameToScnum[".text"] xfile.xahdr.Otsize = s.Ssize + xfile.sectText = s + + segdataVaddr := Segdata.Vaddr + segdataFilelen := Segdata.Filelen + segdataFileoff := Segdata.Fileoff + segbssFilelen := Segdata.Length - Segdata.Filelen + if len(Segrelrodata.Sections) > 0 { + // Merge relro segment to data segment as + // relro data are inside data segment on AIX. + segdataVaddr = Segrelrodata.Vaddr + segdataFileoff = Segrelrodata.Fileoff + segdataFilelen = Segdata.Vaddr + Segdata.Filelen - Segrelrodata.Vaddr + } - s = xfile.addSection(".data", Segdata.Vaddr, Segdata.Filelen, Segdata.Fileoff, STYP_DATA) + s = xfile.addSection(".data", segdataVaddr, segdataFilelen, segdataFileoff, STYP_DATA) xfile.xahdr.Odatastart = s.Svaddr xfile.xahdr.Osndata = xfile.sectNameToScnum[".data"] xfile.xahdr.Odsize = s.Ssize + xfile.sectData = s - s = xfile.addSection(".bss", Segdata.Vaddr+Segdata.Filelen, Segdata.Length-Segdata.Filelen, 0, STYP_BSS) + s = xfile.addSection(".bss", segdataVaddr+segdataFilelen, segbssFilelen, 0, STYP_BSS) xfile.xahdr.Osnbss = xfile.sectNameToScnum[".bss"] xfile.xahdr.Obsize = s.Ssize + xfile.sectBss = s + + if ctxt.LinkMode == LinkExternal { + var tbss *sym.Section + for _, s := range Segdata.Sections { + if s.Name == ".tbss" { + tbss = s + break + } + } + s = xfile.addSection(".tbss", tbss.Vaddr, tbss.Length, 0, STYP_TBSS) + } // add dwarf sections for _, sect := range Segdwarf.Sections { @@ -1405,13 +1490,20 @@ func Asmbxcoff(ctxt *Link, fileoff int64) { Loaderblk(ctxt, uint64(fileoff)) s = xfile.addSection(".loader", 0, xfile.loaderSize, uint64(fileoff), STYP_LOADER) xfile.xahdr.Osnloader = xfile.sectNameToScnum[".loader"] + + // Update fileoff for symbol table + fileoff += int64(xfile.loaderSize) } - } else { - // TODO: Relocation } - // Write symtab + // Create Symbol table xfile.asmaixsym(ctxt) + + if ctxt.LinkMode == LinkExternal { + xfile.emitRelocations(ctxt, fileoff) + } + + // Write Symbol table xfile.symtabOffset = ctxt.Out.Offset() for _, s := range xfile.symtabSym { binary.Write(ctxt.Out, ctxt.Arch.ByteOrder, s) @@ -1424,3 +1516,101 @@ func Asmbxcoff(ctxt *Link, fileoff int64) { // write headers xcoffwrite(ctxt) } + +// byOffset is used to sort relocations by offset +type byOffset []sym.Reloc + +func (x byOffset) Len() int { return len(x) } + +func (x byOffset) Swap(i, j int) { + x[i], x[j] = x[j], x[i] +} + +func (x byOffset) Less(i, j int) bool { + return x[i].Off < x[j].Off +} + +// emitRelocations emits relocation entries for go.o in external linking. +func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { + ctxt.Out.SeekSet(fileoff) + for ctxt.Out.Offset()&7 != 0 { + ctxt.Out.Write8(0) + } + + // relocsect relocates symbols from first in section sect, and returns + // the total number of relocations emitted. + relocsect := func(sect *sym.Section, syms []*sym.Symbol, base uint64) uint32 { + // ctxt.Logf("%s 0x%x\n", sect.Name, sect.Vaddr) + // If main section has no bits, nothing to relocate. + if sect.Vaddr >= sect.Seg.Vaddr+sect.Seg.Filelen { + return 0 + } + sect.Reloff = uint64(ctxt.Out.Offset()) + for i, s := range syms { + if !s.Attr.Reachable() { + continue + } + if uint64(s.Value) >= sect.Vaddr { + syms = syms[i:] + break + } + } + eaddr := int64(sect.Vaddr + sect.Length) + for _, s := range syms { + if !s.Attr.Reachable() { + continue + } + if s.Value >= int64(eaddr) { + break + } + + // Relocation must be ordered by address, so s.R is ordered by Off. + sort.Sort(byOffset(s.R)) + + for ri := range s.R { + + r := &s.R[ri] + + // ctxt.Logf("%s reloc %d(%s)/%d to %s\n", s, r.Type, r.Type.String(), r.Siz, r.Sym.Name) + if r.Done { + continue + } + if r.Xsym == nil { + Errorf(s, "missing xsym in relocation") + continue + } + if r.Xsym.Dynid < 0 { + Errorf(s, "reloc %s to non-coff symbol %s (outer=%s) %d %d", r.Type.String(), r.Sym.Name, r.Xsym.Name, r.Sym.Type, r.Xsym.Dynid) + } + if !thearch.Xcoffreloc1(ctxt.Arch, ctxt.Out, s, r, int64(uint64(s.Value+int64(r.Off))-base)) { + Errorf(s, "unsupported obj reloc %d(%s)/%d to %s", r.Type, r.Type.String(), r.Siz, r.Sym.Name) + } + } + } + sect.Rellen = uint64(ctxt.Out.Offset()) - sect.Reloff + return uint32(sect.Rellen) / RELSZ_64 + } + sects := []struct { + xcoffSect *XcoffScnHdr64 + segs []*sym.Segment + }{ + {f.sectText, []*sym.Segment{&Segtext}}, + {f.sectData, []*sym.Segment{&Segrelrodata, &Segdata}}, + } + for _, s := range sects { + s.xcoffSect.Srelptr = uint64(ctxt.Out.Offset()) + n := uint32(0) + for _, seg := range s.segs { + for _, sect := range seg.Sections { + if sect.Name == ".text" { + n += relocsect(sect, ctxt.Textp, 0) + } else { + n += relocsect(sect, datap, 0) + } + } + } + s.xcoffSect.Snreloc += n + } + + // TODO(aix): DWARF relocations +} diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 6e31668e28..000a838e1b 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -382,6 +382,43 @@ func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return false } +func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, sectoff int64) bool { + rs := r.Xsym + + emitReloc := func(v uint16, off uint64) { + out.Write64(uint64(sectoff) + off) + out.Write32(uint32(rs.Dynid)) + out.Write16(v) + } + + var v uint16 + switch r.Type { + default: + return false + case objabi.R_ADDR: + v = ld.XCOFF_R_POS + if r.Siz == 4 { + v |= 0x1F << 8 + } else { + v |= 0x3F << 8 + } + emitReloc(v, 0) + case objabi.R_ADDRPOWER_TOCREL: + case objabi.R_ADDRPOWER_TOCREL_DS: + emitReloc(ld.XCOFF_R_TOCU|(0x0F<<8), 2) + emitReloc(ld.XCOFF_R_TOCL|(0x0F<<8), 6) + case objabi.R_POWER_TLS_LE: + emitReloc(ld.XCOFF_R_TLS_LE|0x0F<<8, 2) + case objabi.R_CALLPOWER: + if r.Siz != 4 { + return false + } + emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) + } + return true + +} + func elfreloc1(ctxt *ld.Link, r *sym.Reloc, sectoff int64) bool { // Beware that bit0~bit15 start from the third byte of a instruction in Big-Endian machines. if r.Type == objabi.R_ADDR || r.Type == objabi.R_POWER_TLS || r.Type == objabi.R_CALLPOWER { @@ -514,7 +551,7 @@ func archreloctoc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) int64 { ld.Errorf(s, "archreloctoc called for a symbol without TOC anchor") } - if tarSym != nil && tarSym.Attr.Reachable() && (tarSym.Sect.Seg == &ld.Segdata) { + if ctxt.LinkMode == ld.LinkInternal && tarSym != nil && tarSym.Attr.Reachable() && (tarSym.Sect.Seg == &ld.Segdata) { t = ld.Symaddr(tarSym) + r.Add - ctxt.Syms.ROLookup("TOC", 0).Value // change ld to addi in the second instruction o2 = (o2 & 0x03FF0000) | 0xE<<26 @@ -704,9 +741,13 @@ func gentramp(arch *sys.Arch, linkmode ld.LinkMode, tramp, target *sym.Symbol, o func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { if ctxt.LinkMode == ld.LinkExternal { + // On AIX, relocations (except TLS ones) must be also done to the + // value with the current addresses. switch r.Type { default: - return val, false + if ctxt.HeadType != objabi.Haix { + return val, false + } case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE: r.Done = false // check Outer is nil, Type is TLSBSS? @@ -734,12 +775,16 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo } r.Xsym = rs - return val, true + if ctxt.HeadType != objabi.Haix { + return val, true + } case objabi.R_CALLPOWER: r.Done = false r.Xsym = r.Sym r.Xadd = r.Add - return val, true + if ctxt.HeadType != objabi.Haix { + return val, true + } } } diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index ef84031739..bd85856c97 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -59,6 +59,7 @@ func Init() (*sys.Arch, ld.Arch) { Gentext: gentext, Trampoline: trampoline, Machoreloc1: machoreloc1, + Xcoffreloc1: xcoffreloc1, // TODO(austin): ABI v1 uses /usr/lib/ld.so.1, Linuxdynld: "/lib64/ld64.so.1", diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index a1d7ce103c..9b5da3db99 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -784,11 +784,18 @@ TEXT runtime·setg(SB), NOSPLIT, $0-8 RET #ifdef GOARCH_ppc64 +#ifdef GOOS_aix +DATA setg_gcc<>+0(SB)/8, $_setg_gcc<>(SB) +DATA setg_gcc<>+8(SB)/8, $TOC(SB) +DATA setg_gcc<>+16(SB)/8, $0 +GLOBL setg_gcc<>(SB), NOPTR, $24 +#else TEXT setg_gcc<>(SB),NOSPLIT|NOFRAME,$0-0 DWORD $_setg_gcc<>(SB) DWORD $0 DWORD $0 #endif +#endif // void setg_gcc(G*); set g in C TLS. // Must obey the gcc calling convention. diff --git a/src/runtime/rt0_aix_ppc64.s b/src/runtime/rt0_aix_ppc64.s index 0e3d582809..843494b202 100644 --- a/src/runtime/rt0_aix_ppc64.s +++ b/src/runtime/rt0_aix_ppc64.s @@ -34,6 +34,15 @@ TEXT __start<>(SB),NOSPLIT,$-8 MOVD 40(R1), R2 MOVD R14, R3 // argc MOVD R15, R4 // argv + BL _main(SB) + + +DATA main+0(SB)/8, $_main(SB) +DATA main+8(SB)/8, $TOC(SB) +DATA main+16(SB)/8, $0 +GLOBL main(SB), NOPTR, $24 + +TEXT _main(SB),NOSPLIT,$-8 MOVD $runtime·rt0_go(SB), R12 MOVD R12, CTR BR (CTR) -- GitLab From f0749c74fd5c32b8981065c24cc593328ccf5591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:20:56 +0100 Subject: [PATCH 0308/1679] cmd/link: fix moduledata symbols for aix/ppc64 and external linking Moduledata symbols like runtime.data or runtime.text must have the same position in the final executable (as some symbol accesses are made by offset from them). ld on AIX might move them randomly if there are nil size symbols. ld will also remove unreachable symbols like runtime.epclntab or runtime.rodata. In order to keep them, R_REF relocations are created between firstmoduledata and these symbols. This relocation tells ld to keep these symbols even if there aren't reachable. Change-Id: Ie5a28cf406977131cec6442f7f5b6fd89fb775a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/164004 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/internal/objabi/reloctype.go | 5 ++ src/cmd/link/internal/ld/data.go | 78 +++++++++++++++++++++++++--- src/cmd/link/internal/ld/lib.go | 10 ++-- src/cmd/link/internal/ld/symtab.go | 14 +++++ src/cmd/link/internal/ld/xcoff.go | 4 +- src/cmd/link/internal/ppc64/asm.go | 3 ++ 6 files changed, 101 insertions(+), 13 deletions(-) diff --git a/src/cmd/internal/objabi/reloctype.go b/src/cmd/internal/objabi/reloctype.go index 355882c638..f619e017d8 100644 --- a/src/cmd/internal/objabi/reloctype.go +++ b/src/cmd/internal/objabi/reloctype.go @@ -196,6 +196,11 @@ const ( // R_WASMIMPORT resolves to the index of the WebAssembly function import. R_WASMIMPORT + + // R_XCOFFREF (only used on aix/ppc64) prevents garbage collection by ld + // of a symbol. This isn't a real relocation, it can be placed in anywhere + // in a symbol and target any symbols. + R_XCOFFREF ) // IsDirectJump reports whether r is a relocation for a direct jump. diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 2f9940455e..a48db2aeeb 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -478,6 +478,21 @@ func relocsym(ctxt *Link, s *sym.Symbol) { o += r.Add - (s.Value + int64(r.Off) + int64(r.Siz)) case objabi.R_SIZE: o = r.Sym.Size + r.Add + + case objabi.R_XCOFFREF: + if ctxt.HeadType != objabi.Haix { + Errorf(s, "find XCOFF R_REF on non-XCOFF files") + } + if ctxt.LinkMode != LinkExternal { + Errorf(s, "find XCOFF R_REF with internal linking") + } + r.Xsym = r.Sym + r.Xadd = r.Add + r.Done = false + + // This isn't a real relocation so it must not update + // its offset value. + continue } if r.Variant != sym.RV_NONE { @@ -1115,7 +1130,7 @@ func (ctxt *Link) dodata() { ctxt.Logf("%5.2f dodata\n", Cputime()) } - if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin { + if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { // The values in moduledata are filled out by relocations // pointing to the addresses of these special symbols. // Typically these symbols have no size and are not laid @@ -1133,6 +1148,12 @@ func (ctxt *Link) dodata() { // To work around this we lay out the symbls whose // addresses are vital for multi-module programs to work // as normal symbols, and give them a little size. + // + // On AIX, as all DATA sections are merged together, ld might not put + // these symbols at the beginning of their respective section if there + // aren't real symbols, their alignment might not match the + // first symbol alignment. Therefore, there are explicitly put at the + // beginning of their section with the same alignment. bss := ctxt.Syms.Lookup("runtime.bss", 0) bss.Size = 8 bss.Attr.Set(sym.AttrSpecial, false) @@ -1143,7 +1164,12 @@ func (ctxt *Link) dodata() { data.Size = 8 data.Attr.Set(sym.AttrSpecial, false) - ctxt.Syms.Lookup("runtime.edata", 0).Attr.Set(sym.AttrSpecial, false) + edata := ctxt.Syms.Lookup("runtime.edata", 0) + edata.Attr.Set(sym.AttrSpecial, false) + if ctxt.HeadType == objabi.Haix { + // XCOFFTOC symbols are part of .data section. + edata.Type = sym.SXCOFFTOC + } types := ctxt.Syms.Lookup("runtime.types", 0) types.Type = sym.STYPE @@ -1153,6 +1179,16 @@ func (ctxt *Link) dodata() { etypes := ctxt.Syms.Lookup("runtime.etypes", 0) etypes.Type = sym.SFUNCTAB etypes.Attr.Set(sym.AttrSpecial, false) + + if ctxt.HeadType == objabi.Haix { + rodata := ctxt.Syms.Lookup("runtime.rodata", 0) + rodata.Type = sym.SSTRING + rodata.Size = 8 + rodata.Attr.Set(sym.AttrSpecial, false) + + ctxt.Syms.Lookup("runtime.erodata", 0).Attr.Set(sym.AttrSpecial, false) + + } } // Collect data symbols by type into data. @@ -1196,6 +1232,12 @@ func (ctxt *Link) dodata() { // that an Outer symbol has been changed to a // relro Type before it reaches here. isRelro = true + case sym.SFUNCTAB: + if ctxt.HeadType == objabi.Haix && s.Name == "runtime.etypes" { + // runtime.etypes must be at the end of + // the relro datas. + isRelro = true + } } if isRelro { s.Type = symnrelro @@ -1237,6 +1279,13 @@ func (ctxt *Link) dodata() { } wg.Wait() + if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { + // These symbols must have the same alignment as their section. + // Otherwize, ld might change the layout of Go sections. + ctxt.Syms.ROLookup("runtime.data", 0).Align = dataMaxAlign[sym.SDATA] + ctxt.Syms.ROLookup("runtime.bss", 0).Align = dataMaxAlign[sym.SBSS] + } + // Allocate sections. // Data is processed before segtext, because we need // to see all symbols in the .data and .bss sections in order @@ -1350,7 +1399,9 @@ func (ctxt *Link) dodata() { gc.AddSym(s) datsize += s.Size } + gc.End(datsize - int64(sect.Vaddr)) // On AIX, TOC entries must be the last of .data + // These aren't part of gc as they won't change during the runtime. for _, s := range data[sym.SXCOFFTOC] { s.Sect = sect s.Type = sym.SDATA @@ -1360,7 +1411,6 @@ func (ctxt *Link) dodata() { } checkdatsize(ctxt, datsize, sym.SDATA) sect.Length = uint64(datsize) - sect.Vaddr - gc.End(int64(sect.Length)) /* bss */ sect = addsection(ctxt.Arch, &Segdata, ".bss", 06) @@ -1555,8 +1605,15 @@ func (ctxt *Link) dodata() { sect = addrelrosection("") sect.Vaddr = 0 + if ctxt.HeadType == objabi.Haix { + // datsize must be reset because relro datas will end up + // in data segment. + datsize = 0 + } + ctxt.Syms.Lookup("runtime.types", 0).Sect = sect ctxt.Syms.Lookup("runtime.etypes", 0).Sect = sect + for _, symnro := range sym.ReadOnly { symn := sym.RelROMap[symnro] align := dataMaxAlign[symn] @@ -1778,12 +1835,12 @@ func dodataSect(ctxt *Link, symn sym.SymKind, syms []*sym.Symbol) (result []*sym // If the usually-special section-marker symbols are being laid // out as regular symbols, put them either at the beginning or // end of their section. - if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin { + if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { switch s.Name { - case "runtime.text", "runtime.bss", "runtime.data", "runtime.types": + case "runtime.text", "runtime.bss", "runtime.data", "runtime.types", "runtime.rodata": head = s continue - case "runtime.etext", "runtime.ebss", "runtime.edata", "runtime.etypes": + case "runtime.etext", "runtime.ebss", "runtime.edata", "runtime.etypes", "runtime.erodata": tail = s continue } @@ -1898,8 +1955,15 @@ func (ctxt *Link) textaddress() { text := ctxt.Syms.Lookup("runtime.text", 0) text.Sect = sect + if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { + // Setting runtime.text has a real symbol prevents ld to + // change its base address resulting in wrong offsets for + // reflect methods. + text.Align = sect.Align + text.Size = 0x8 + } - if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin { + if (ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { etext := ctxt.Syms.Lookup("runtime.etext", 0) etext.Sect = sect diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 06fa071101..e99c81aeb7 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2137,9 +2137,10 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6 s := ctxt.Syms.Lookup("runtime.text", 0) if s.Type == sym.STEXT { // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin. + // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or + // on AIX with external linker. // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) { + if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { put(ctxt, s, s.Name, TextSym, s.Value, nil) } } @@ -2168,9 +2169,10 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6 s = ctxt.Syms.Lookup("runtime.etext", 0) if s.Type == sym.STEXT { // We've already included this symbol in ctxt.Textp - // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin. + // if ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin or + // on AIX with external linker. // See data.go:/textaddress - if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) { + if !(ctxt.DynlinkingGo() && ctxt.HeadType == objabi.Hdarwin) && !(ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { put(ctxt, s, s.Name, TextSym, s.Value, nil) } } diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 7c296d766c..3add7197b8 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -562,6 +562,20 @@ func (ctxt *Link) symtab() { moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.types", 0)) moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.etypes", 0)) + if ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal { + // Add R_REF relocation to prevent ld's garbage collection of + // runtime.rodata, runtime.erodata and runtime.epclntab. + addRef := func(name string) { + r := moduledata.AddRel() + r.Sym = ctxt.Syms.Lookup(name, 0) + r.Type = objabi.R_XCOFFREF + r.Siz = uint8(ctxt.Arch.PtrSize) + } + addRef("runtime.rodata") + addRef("runtime.erodata") + addRef("runtime.epclntab") + } + // text section information moduledata.AddAddr(ctxt.Arch, ctxt.Syms.Lookup("runtime.textsectionmap", 0)) moduledata.AddUint(ctxt.Arch, uint64(nsections)) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 7826e1b7a5..30a27d2b18 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -585,7 +585,8 @@ func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) { fallthrough case sym.STYPE: if !ctxt.DynlinkingGo() { - outerSymSize["type.*"] = size + // runtime.types size must be removed. + outerSymSize["type.*"] = size - ctxt.Syms.ROLookup("runtime.types", 0).Size } case sym.SGOSTRING: outerSymSize["go.string.*"] = size @@ -1571,7 +1572,6 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { r := &s.R[ri] - // ctxt.Logf("%s reloc %d(%s)/%d to %s\n", s, r.Type, r.Type.String(), r.Siz, r.Sym.Name) if r.Done { continue } diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 000a838e1b..70b3d2bd6d 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -414,6 +414,9 @@ func xcoffreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se return false } emitReloc(ld.XCOFF_R_RBR|0x19<<8, 0) + case objabi.R_XCOFFREF: + emitReloc(ld.XCOFF_R_REF|0x3F<<8, 0) + } return true -- GitLab From 029a5af6a1f517a0863ad6067e50e6040663c416 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 5 Mar 2019 12:09:12 +0100 Subject: [PATCH 0309/1679] internal/bytealg: use word-wise comparison for Compare on arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use word-wise comparison for aligned buffers, otherwise fall back to the current byte-wise comparison. name old time/op new time/op delta BytesCompare/1-4 41.3ns ± 0% 36.4ns ± 1% -11.73% (p=0.008 n=5+5) BytesCompare/2-4 39.5ns ± 0% 39.5ns ± 1% ~ (p=0.960 n=5+5) BytesCompare/4-4 45.3ns ± 0% 41.0ns ± 1% -9.40% (p=0.008 n=5+5) BytesCompare/8-4 64.8ns ± 1% 44.7ns ± 0% -31.12% (p=0.008 n=5+5) BytesCompare/16-4 86.3ns ± 0% 55.1ns ± 0% -36.21% (p=0.008 n=5+5) BytesCompare/32-4 135ns ± 0% 70ns ± 1% -47.73% (p=0.008 n=5+5) BytesCompare/64-4 231ns ± 1% 99ns ± 0% -57.27% (p=0.016 n=5+4) BytesCompare/128-4 424ns ± 0% 147ns ± 0% -65.31% (p=0.000 n=4+5) BytesCompare/256-4 810ns ± 0% 243ns ± 0% -69.96% (p=0.008 n=5+5) BytesCompare/512-4 1.59µs ± 0% 0.44µs ± 0% -72.43% (p=0.008 n=5+5) BytesCompare/1024-4 3.14µs ± 1% 0.83µs ± 1% -73.56% (p=0.008 n=5+5) BytesCompare/2048-4 6.23µs ± 0% 1.61µs ± 1% -74.21% (p=0.008 n=5+5) CompareBytesEqual-4 79.4ns ± 0% 52.2ns ± 0% -34.23% (p=0.008 n=5+5) CompareBytesToNil-4 31.0ns ± 0% 30.3ns ± 0% -2.32% (p=0.008 n=5+5) CompareBytesEmpty-4 25.7ns ± 0% 25.7ns ± 0% ~ (p=0.556 n=4+5) CompareBytesIdentical-4 25.7ns ± 0% 25.7ns ± 0% ~ (p=1.000 n=5+5) CompareBytesSameLength-4 49.1ns ± 0% 48.5ns ± 0% -1.26% (p=0.008 n=5+5) CompareBytesDifferentLength-4 49.8ns ± 1% 49.3ns ± 0% -1.08% (p=0.008 n=5+5) CompareBytesBigUnaligned-4 5.71ms ± 1% 5.68ms ± 1% ~ (p=0.222 n=5+5) CompareBytesBig-4 4.95ms ± 0% 2.28ms ± 1% -53.81% (p=0.008 n=5+5) CompareBytesBigIdentical-4 27.2ns ± 1% 27.3ns ± 1% ~ (p=0.310 n=5+5) name old speed new speed delta CompareBytesBigUnaligned-4 184MB/s ± 1% 185MB/s ± 1% ~ (p=0.222 n=5+5) CompareBytesBig-4 212MB/s ± 0% 459MB/s ± 1% +116.51% (p=0.008 n=5+5) CompareBytesBigIdentical-4 38.5TB/s ± 0% 38.4TB/s ± 1% ~ (p=0.421 n=5+5) Also, this reduces time for TestCompareBytes by about 20 sec on a linux-arm builder via gomote. Updates #29001 Change-Id: I25f148739b9ccb7cb1fc97b3d8763549b0a66c16 Reviewed-on: https://go-review.googlesource.com/c/go/+/165338 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/internal/bytealg/compare_arm.s | 47 +++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/src/internal/bytealg/compare_arm.s b/src/internal/bytealg/compare_arm.s index c5bfdda33f..80d01a217f 100644 --- a/src/internal/bytealg/compare_arm.s +++ b/src/internal/bytealg/compare_arm.s @@ -29,31 +29,58 @@ TEXT runtime·cmpstring(SB),NOSPLIT|NOFRAME,$0-20 // R7 points to return value (-1/0/1 will be written here) // // On exit: -// R4, R5, and R6 are clobbered +// R4, R5, R6 and R8 are clobbered TEXT cmpbody<>(SB),NOSPLIT|NOFRAME,$0-0 CMP R2, R3 BEQ samebytes CMP R0, R1 MOVW R0, R6 - MOVW.LT R1, R6 // R6 is min(R0, R1) + MOVW.LT R1, R6 // R6 is min(R0, R1) - ADD R2, R6 // R2 is current byte in a, R6 is last byte in a to compare -loop: + CMP $0, R6 + BEQ samebytes + CMP $4, R6 + ADD R2, R6 // R2 is current byte in a, R6 is the end of the range to compare + BLT byte_loop // length < 4 + AND $3, R2, R8 + CMP $0, R8 + BNE byte_loop // unaligned a, use byte-wise compare (TODO: try to align a) +aligned_a: + AND $3, R3, R8 + CMP $0, R8 + BNE byte_loop // unaligned b, use byte-wise compare + AND $0xfffffffc, R6, R8 + // length >= 4 +chunk4_loop: + MOVW.P 4(R2), R4 + MOVW.P 4(R3), R5 + CMP R4, R5 + BNE cmp + CMP R2, R8 + BNE chunk4_loop CMP R2, R6 - BEQ samebytes // all compared bytes were the same; compare lengths + BEQ samebytes // all compared bytes were the same; compare lengths +byte_loop: MOVBU.P 1(R2), R4 MOVBU.P 1(R3), R5 CMP R4, R5 - BEQ loop - // bytes differed + BNE ret + CMP R2, R6 + BNE byte_loop +samebytes: + CMP R0, R1 MOVW.LT $1, R0 MOVW.GT $-1, R0 + MOVW.EQ $0, R0 MOVW R0, (R7) RET -samebytes: - CMP R0, R1 +ret: + // bytes differed MOVW.LT $1, R0 MOVW.GT $-1, R0 - MOVW.EQ $0, R0 MOVW R0, (R7) RET +cmp: + SUB $4, R2, R2 + SUB $4, R3, R3 + B byte_loop -- GitLab From a60b56adbeb80bb8b05b88ae89ac832c69ec5995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C3=A8i=20C=C5=8Dngru=C3=AC?= Date: Wed, 6 Mar 2019 08:43:27 +0000 Subject: [PATCH 0310/1679] internal/poll: make FD.isFile mean whether it isn't socket on Windows Before this change, if a directory was closed twice on Windows, the returning error would be "use of closed network connection". Some code assumes FD.isFile means whether the fd isn't a network socket, which is true on Unix. But isFile reports whether the fd is a normal file rather than directory or console on Windows. With this change, isFile will have the same meaning on different platforms. And the change adds a new field kind to replace isConsole and isDir. Change-Id: Ib12265f1e12fa3d0239ae925291128a84be59cc2 GitHub-Last-Rev: 3f031756de6ce0b96c1f102ad280950f4adbf6c2 GitHub-Pull-Request: golang/go#30589 Reviewed-on: https://go-review.googlesource.com/c/go/+/165257 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/fd_windows.go | 58 ++++++++++++++++++++------------- src/os/os_test.go | 8 +++-- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index 19d9a12dad..eeef5a78d3 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -309,7 +309,6 @@ type FD struct { l sync.Mutex // For console I/O. - isConsole bool lastbits []byte // first few bytes of the last incomplete rune in last write readuint16 []uint16 // buffer to hold uint16s obtained with ReadConsole readbyte []byte // buffer to hold decoding of readuint16 from utf16 to utf8 @@ -328,13 +327,23 @@ type FD struct { // message based socket connection. ZeroReadIsEOF bool - // Whether this is a normal file. + // Whether this is a file rather than a network socket. isFile bool - // Whether this is a directory. - isDir bool + // The kind of this file. + kind fileKind } +// fileKind describes the kind of file. +type fileKind byte + +const ( + kindNet fileKind = iota + kindFile + kindConsole + kindDir +) + // logInitFD is set by tests to enable file descriptor initialization logging. var logInitFD func(net string, fd *FD, err error) @@ -350,18 +359,20 @@ func (fd *FD) Init(net string, pollable bool) (string, error) { switch net { case "file": - fd.isFile = true + fd.kind = kindFile case "console": - fd.isConsole = true + fd.kind = kindConsole case "dir": - fd.isDir = true - case "tcp", "tcp4", "tcp6": - case "udp", "udp4", "udp6": - case "ip", "ip4", "ip6": - case "unix", "unixgram", "unixpacket": + fd.kind = kindDir + case "tcp", "tcp4", "tcp6", + "udp", "udp4", "udp6", + "ip", "ip4", "ip6", + "unix", "unixgram", "unixpacket": + fd.kind = kindNet default: return "", errors.New("internal error: unknown network type " + net) } + fd.isFile = fd.kind != kindNet var err error if pollable { @@ -430,13 +441,14 @@ func (fd *FD) destroy() error { // so this must be executed before fd.CloseFunc. fd.pd.close() var err error - if fd.isFile || fd.isConsole { - err = syscall.CloseHandle(fd.Sysfd) - } else if fd.isDir { - err = syscall.FindClose(fd.Sysfd) - } else { + switch fd.kind { + case kindNet: // The net package uses the CloseFunc variable for testing. err = CloseFunc(fd.Sysfd) + case kindDir: + err = syscall.FindClose(fd.Sysfd) + default: + err = syscall.CloseHandle(fd.Sysfd) } fd.Sysfd = syscall.InvalidHandle runtime_Semrelease(&fd.csema) @@ -485,12 +497,13 @@ func (fd *FD) Read(buf []byte) (int, error) { var n int var err error - if fd.isFile || fd.isDir || fd.isConsole { + if fd.isFile { fd.l.Lock() defer fd.l.Unlock() - if fd.isConsole { + switch fd.kind { + case kindConsole: n, err = fd.readConsole(buf) - } else { + default: n, err = syscall.Read(fd.Sysfd, buf) } if err != nil { @@ -669,12 +682,13 @@ func (fd *FD) Write(buf []byte) (int, error) { } var n int var err error - if fd.isFile || fd.isDir || fd.isConsole { + if fd.isFile { fd.l.Lock() defer fd.l.Unlock() - if fd.isConsole { + switch fd.kind { + case kindConsole: n, err = fd.writeConsole(b) - } else { + default: n, err = syscall.Write(fd.Sysfd, b) } if err != nil { diff --git a/src/os/os_test.go b/src/os/os_test.go index 9c4d5dada9..c5c6b49e8f 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -2279,8 +2279,7 @@ func TestPipeThreads(t *testing.T) { } } -func TestDoubleCloseError(t *testing.T) { - path := sfdir + "/" + sfname +func testDoubleCloseError(t *testing.T, path string) { file, err := Open(path) if err != nil { t.Fatal(err) @@ -2299,6 +2298,11 @@ func TestDoubleCloseError(t *testing.T) { } } +func TestDoubleCloseError(t *testing.T) { + testDoubleCloseError(t, filepath.Join(sfdir, sfname)) + testDoubleCloseError(t, sfdir) +} + func TestUserHomeDir(t *testing.T) { dir, err := UserHomeDir() if dir == "" && err == nil { -- GitLab From 40d8c3d3e81769550bcaf96ec0a3e3308abb8862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C3=A8i=20C=C5=8Dngru=C3=AC?= Date: Wed, 6 Mar 2019 03:23:46 +0000 Subject: [PATCH 0311/1679] internal/poll: fix deadlock in Write if len(buf) > maxRW fd.l.Lock shouldn't be called in a loop. Change-Id: I3afbc184aa06a60175c9a39319985b5810ecb144 Reviewed-on: https://go-review.googlesource.com/c/go/+/165598 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/fd_windows.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index eeef5a78d3..f666b061e2 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -673,6 +673,10 @@ func (fd *FD) Write(buf []byte) (int, error) { return 0, err } defer fd.writeUnlock() + if fd.isFile { + fd.l.Lock() + defer fd.l.Unlock() + } ntotal := 0 for len(buf) > 0 { @@ -683,8 +687,6 @@ func (fd *FD) Write(buf []byte) (int, error) { var n int var err error if fd.isFile { - fd.l.Lock() - defer fd.l.Unlock() switch fd.kind { case kindConsole: n, err = fd.writeConsole(b) -- GitLab From 448089854a971274db839a1cacea008b48134a19 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Wed, 12 Dec 2018 08:29:51 +0000 Subject: [PATCH 0312/1679] cmd/asm: add arm64 v8.1 atomic instructions This change adds several arm64 v8.1 atomic instructions and test cases. They are LDADDAx, LDADDLx, LDANDAx, LDANDALx, LDANDLx, LDEORAx, LDEORALx, LDEORLx, LDORAx, LDORALx, LDORLx, SWPAx and SWPLx. Their form is consistent with the form of the existing atomic instructions. For instructions STXRx, STLXRx, STXPx and STLXPx, the second destination register can't be RSP. This CL also adds a check for this. LDADDx Rs, (Rb), Rt: *Rb -> Rt, Rs + *Rb -> *Rb LDANDx Rs, (Rb), Rt: *Rb -> Rt, Rs AND NOT(*Rb) -> *Rb LDEORx Rs, (Rb), Rt: *Rb -> Rt, Rs EOR *Rb -> *Rb LDORx Rs, (Rb), Rt: *Rb -> Rt, Rs OR *Rb -> *Rb Change-Id: I9f9b0245958cb57ab7d88c66fb9159b23b9017fd Reviewed-on: https://go-review.googlesource.com/c/go/+/157001 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/asm/internal/arch/arm64.go | 13 +- src/cmd/asm/internal/asm/testdata/arm64.s | 133 +++++++++++++-- .../asm/internal/asm/testdata/arm64error.s | 120 +++++++++++++ src/cmd/internal/obj/arm64/a.out.go | 70 +++++++- src/cmd/internal/obj/arm64/anames.go | 70 +++++++- src/cmd/internal/obj/arm64/asm7.go | 158 +++++++++++------- 6 files changed, 469 insertions(+), 95 deletions(-) diff --git a/src/cmd/asm/internal/arch/arm64.go b/src/cmd/asm/internal/arch/arm64.go index 98858bd181..3817fcd5c2 100644 --- a/src/cmd/asm/internal/arch/arm64.go +++ b/src/cmd/asm/internal/arch/arm64.go @@ -72,14 +72,11 @@ func IsARM64STLXR(op obj.As) bool { switch op { case arm64.ASTLXRB, arm64.ASTLXRH, arm64.ASTLXRW, arm64.ASTLXR, arm64.ASTXRB, arm64.ASTXRH, arm64.ASTXRW, arm64.ASTXR, - arm64.ASTXP, arm64.ASTXPW, arm64.ASTLXP, arm64.ASTLXPW, - arm64.ASWPB, arm64.ASWPH, arm64.ASWPW, arm64.ASWPD, - arm64.ASWPALB, arm64.ASWPALH, arm64.ASWPALW, arm64.ASWPALD, - arm64.ALDADDB, arm64.ALDADDH, arm64.ALDADDW, arm64.ALDADDD, - arm64.ALDANDB, arm64.ALDANDH, arm64.ALDANDW, arm64.ALDANDD, - arm64.ALDEORB, arm64.ALDEORH, arm64.ALDEORW, arm64.ALDEORD, - arm64.ALDORB, arm64.ALDORH, arm64.ALDORW, arm64.ALDORD, - arm64.ALDADDALD, arm64.ALDADDALW, arm64.ALDADDALH, arm64.ALDADDALB: + arm64.ASTXP, arm64.ASTXPW, arm64.ASTLXP, arm64.ASTLXPW: + return true + } + // atomic instructions + if arm64.IsAtomicInstruction(op) { return true } return false diff --git a/src/cmd/asm/internal/asm/testdata/arm64.s b/src/cmd/asm/internal/asm/testdata/arm64.s index b54fd86045..77671223c9 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64.s +++ b/src/cmd/asm/internal/asm/testdata/arm64.s @@ -659,14 +659,14 @@ again: STXP (R1, R2), (RSP), R10 // e10b2ac8 STXPW (R1, R2), (R3), R10 // 61082a88 STXPW (R1, R2), (RSP), R10 // e10b2a88 - SWPD R5, (R6), R7 // c78025f8 - SWPD R5, (RSP), R7 // e78325f8 - SWPW R5, (R6), R7 // c78025b8 - SWPW R5, (RSP), R7 // e78325b8 - SWPH R5, (R6), R7 // c7802578 - SWPH R5, (RSP), R7 // e7832578 - SWPB R5, (R6), R7 // c7802538 - SWPB R5, (RSP), R7 // e7832538 + SWPAD R5, (R6), R7 // c780a5f8 + SWPAD R5, (RSP), R7 // e783a5f8 + SWPAW R5, (R6), R7 // c780a5b8 + SWPAW R5, (RSP), R7 // e783a5b8 + SWPAH R5, (R6), R7 // c780a578 + SWPAH R5, (RSP), R7 // e783a578 + SWPAB R5, (R6), R7 // c780a538 + SWPAB R5, (RSP), R7 // e783a538 SWPALD R5, (R6), R7 // c780e5f8 SWPALD R5, (RSP), R7 // e783e5f8 SWPALW R5, (R6), R7 // c780e5b8 @@ -675,6 +675,38 @@ again: SWPALH R5, (RSP), R7 // e783e578 SWPALB R5, (R6), R7 // c780e538 SWPALB R5, (RSP), R7 // e783e538 + SWPD R5, (R6), R7 // c78025f8 + SWPD R5, (RSP), R7 // e78325f8 + SWPW R5, (R6), R7 // c78025b8 + SWPW R5, (RSP), R7 // e78325b8 + SWPH R5, (R6), R7 // c7802578 + SWPH R5, (RSP), R7 // e7832578 + SWPB R5, (R6), R7 // c7802538 + SWPB R5, (RSP), R7 // e7832538 + SWPLD R5, (R6), R7 // c78065f8 + SWPLD R5, (RSP), R7 // e78365f8 + SWPLW R5, (R6), R7 // c78065b8 + SWPLW R5, (RSP), R7 // e78365b8 + SWPLH R5, (R6), R7 // c7806578 + SWPLH R5, (RSP), R7 // e7836578 + SWPLB R5, (R6), R7 // c7806538 + SWPLB R5, (RSP), R7 // e7836538 + LDADDAD R5, (R6), R7 // c700a5f8 + LDADDAD R5, (RSP), R7 // e703a5f8 + LDADDAW R5, (R6), R7 // c700a5b8 + LDADDAW R5, (RSP), R7 // e703a5b8 + LDADDAH R5, (R6), R7 // c700a578 + LDADDAH R5, (RSP), R7 // e703a578 + LDADDAB R5, (R6), R7 // c700a538 + LDADDAB R5, (RSP), R7 // e703a538 + LDADDALD R5, (R6), R7 // c700e5f8 + LDADDALD R5, (RSP), R7 // e703e5f8 + LDADDALW R5, (R6), R7 // c700e5b8 + LDADDALW R5, (RSP), R7 // e703e5b8 + LDADDALH R5, (R6), R7 // c700e578 + LDADDALH R5, (RSP), R7 // e703e578 + LDADDALB R5, (R6), R7 // c700e538 + LDADDALB R5, (RSP), R7 // e703e538 LDADDD R5, (R6), R7 // c70025f8 LDADDD R5, (RSP), R7 // e70325f8 LDADDW R5, (R6), R7 // c70025b8 @@ -683,6 +715,30 @@ again: LDADDH R5, (RSP), R7 // e7032578 LDADDB R5, (R6), R7 // c7002538 LDADDB R5, (RSP), R7 // e7032538 + LDADDLD R5, (R6), R7 // c70065f8 + LDADDLD R5, (RSP), R7 // e70365f8 + LDADDLW R5, (R6), R7 // c70065b8 + LDADDLW R5, (RSP), R7 // e70365b8 + LDADDLH R5, (R6), R7 // c7006578 + LDADDLH R5, (RSP), R7 // e7036578 + LDADDLB R5, (R6), R7 // c7006538 + LDADDLB R5, (RSP), R7 // e7036538 + LDANDAD R5, (R6), R7 // c710a5f8 + LDANDAD R5, (RSP), R7 // e713a5f8 + LDANDAW R5, (R6), R7 // c710a5b8 + LDANDAW R5, (RSP), R7 // e713a5b8 + LDANDAH R5, (R6), R7 // c710a578 + LDANDAH R5, (RSP), R7 // e713a578 + LDANDAB R5, (R6), R7 // c710a538 + LDANDAB R5, (RSP), R7 // e713a538 + LDANDALD R5, (R6), R7 // c710e5f8 + LDANDALD R5, (RSP), R7 // e713e5f8 + LDANDALW R5, (R6), R7 // c710e5b8 + LDANDALW R5, (RSP), R7 // e713e5b8 + LDANDALH R5, (R6), R7 // c710e578 + LDANDALH R5, (RSP), R7 // e713e578 + LDANDALB R5, (R6), R7 // c710e538 + LDANDALB R5, (RSP), R7 // e713e538 LDANDD R5, (R6), R7 // c71025f8 LDANDD R5, (RSP), R7 // e71325f8 LDANDW R5, (R6), R7 // c71025b8 @@ -691,6 +747,30 @@ again: LDANDH R5, (RSP), R7 // e7132578 LDANDB R5, (R6), R7 // c7102538 LDANDB R5, (RSP), R7 // e7132538 + LDANDLD R5, (R6), R7 // c71065f8 + LDANDLD R5, (RSP), R7 // e71365f8 + LDANDLW R5, (R6), R7 // c71065b8 + LDANDLW R5, (RSP), R7 // e71365b8 + LDANDLH R5, (R6), R7 // c7106578 + LDANDLH R5, (RSP), R7 // e7136578 + LDANDLB R5, (R6), R7 // c7106538 + LDANDLB R5, (RSP), R7 // e7136538 + LDEORAD R5, (R6), R7 // c720a5f8 + LDEORAD R5, (RSP), R7 // e723a5f8 + LDEORAW R5, (R6), R7 // c720a5b8 + LDEORAW R5, (RSP), R7 // e723a5b8 + LDEORAH R5, (R6), R7 // c720a578 + LDEORAH R5, (RSP), R7 // e723a578 + LDEORAB R5, (R6), R7 // c720a538 + LDEORAB R5, (RSP), R7 // e723a538 + LDEORALD R5, (R6), R7 // c720e5f8 + LDEORALD R5, (RSP), R7 // e723e5f8 + LDEORALW R5, (R6), R7 // c720e5b8 + LDEORALW R5, (RSP), R7 // e723e5b8 + LDEORALH R5, (R6), R7 // c720e578 + LDEORALH R5, (RSP), R7 // e723e578 + LDEORALB R5, (R6), R7 // c720e538 + LDEORALB R5, (RSP), R7 // e723e538 LDEORD R5, (R6), R7 // c72025f8 LDEORD R5, (RSP), R7 // e72325f8 LDEORW R5, (R6), R7 // c72025b8 @@ -699,6 +779,30 @@ again: LDEORH R5, (RSP), R7 // e7232578 LDEORB R5, (R6), R7 // c7202538 LDEORB R5, (RSP), R7 // e7232538 + LDEORLD R5, (R6), R7 // c72065f8 + LDEORLD R5, (RSP), R7 // e72365f8 + LDEORLW R5, (R6), R7 // c72065b8 + LDEORLW R5, (RSP), R7 // e72365b8 + LDEORLH R5, (R6), R7 // c7206578 + LDEORLH R5, (RSP), R7 // e7236578 + LDEORLB R5, (R6), R7 // c7206538 + LDEORLB R5, (RSP), R7 // e7236538 + LDORAD R5, (R6), R7 // c730a5f8 + LDORAD R5, (RSP), R7 // e733a5f8 + LDORAW R5, (R6), R7 // c730a5b8 + LDORAW R5, (RSP), R7 // e733a5b8 + LDORAH R5, (R6), R7 // c730a578 + LDORAH R5, (RSP), R7 // e733a578 + LDORAB R5, (R6), R7 // c730a538 + LDORAB R5, (RSP), R7 // e733a538 + LDORALD R5, (R6), R7 // c730e5f8 + LDORALD R5, (RSP), R7 // e733e5f8 + LDORALW R5, (R6), R7 // c730e5b8 + LDORALW R5, (RSP), R7 // e733e5b8 + LDORALH R5, (R6), R7 // c730e578 + LDORALH R5, (RSP), R7 // e733e578 + LDORALB R5, (R6), R7 // c730e538 + LDORALB R5, (RSP), R7 // e733e538 LDORD R5, (R6), R7 // c73025f8 LDORD R5, (RSP), R7 // e73325f8 LDORW R5, (R6), R7 // c73025b8 @@ -707,11 +811,14 @@ again: LDORH R5, (RSP), R7 // e7332578 LDORB R5, (R6), R7 // c7302538 LDORB R5, (RSP), R7 // e7332538 - LDADDALD R2, (R1), R3 // 2300e2f8 - LDADDALW R2, (R1), R3 // 2300e2b8 - LDADDALH R2, (R1), R3 // 2300e278 - LDADDALB R2, (R1), R3 // 2300e238 - + LDORLD R5, (R6), R7 // c73065f8 + LDORLD R5, (RSP), R7 // e73365f8 + LDORLW R5, (R6), R7 // c73065b8 + LDORLW R5, (RSP), R7 // e73365b8 + LDORLH R5, (R6), R7 // c7306578 + LDORLH R5, (RSP), R7 // e7336578 + LDORLB R5, (R6), R7 // c7306538 + LDORLB R5, (RSP), R7 // e7336538 // RET // // LTYPEA comma diff --git a/src/cmd/asm/internal/asm/testdata/arm64error.s b/src/cmd/asm/internal/asm/testdata/arm64error.s index 357db80222..387836dcbe 100644 --- a/src/cmd/asm/internal/asm/testdata/arm64error.s +++ b/src/cmd/asm/internal/asm/testdata/arm64error.s @@ -112,4 +112,124 @@ TEXT errors(SB),$0 FSTPD (R1, R2), (R0) // ERROR "invalid register pair" FMOVS (F2), F0 // ERROR "illegal combination" FMOVD F0, (F1) // ERROR "illegal combination" + LDADDD R5, (R6), ZR // ERROR "illegal destination register" + LDADDW R5, (R6), ZR // ERROR "illegal destination register" + LDADDH R5, (R6), ZR // ERROR "illegal destination register" + LDADDB R5, (R6), ZR // ERROR "illegal destination register" + LDADDLD R5, (R6), ZR // ERROR "illegal destination register" + LDADDLW R5, (R6), ZR // ERROR "illegal destination register" + LDADDLH R5, (R6), ZR // ERROR "illegal destination register" + LDADDLB R5, (R6), ZR // ERROR "illegal destination register" + LDANDD R5, (R6), ZR // ERROR "illegal destination register" + LDANDW R5, (R6), ZR // ERROR "illegal destination register" + LDANDH R5, (R6), ZR // ERROR "illegal destination register" + LDANDB R5, (R6), ZR // ERROR "illegal destination register" + LDANDLD R5, (R6), ZR // ERROR "illegal destination register" + LDANDLW R5, (R6), ZR // ERROR "illegal destination register" + LDANDLH R5, (R6), ZR // ERROR "illegal destination register" + LDANDLB R5, (R6), ZR // ERROR "illegal destination register" + LDEORD R5, (R6), ZR // ERROR "illegal destination register" + LDEORW R5, (R6), ZR // ERROR "illegal destination register" + LDEORH R5, (R6), ZR // ERROR "illegal destination register" + LDEORB R5, (R6), ZR // ERROR "illegal destination register" + LDEORLD R5, (R6), ZR // ERROR "illegal destination register" + LDEORLW R5, (R6), ZR // ERROR "illegal destination register" + LDEORLH R5, (R6), ZR // ERROR "illegal destination register" + LDEORLB R5, (R6), ZR // ERROR "illegal destination register" + LDORD R5, (R6), ZR // ERROR "illegal destination register" + LDORW R5, (R6), ZR // ERROR "illegal destination register" + LDORH R5, (R6), ZR // ERROR "illegal destination register" + LDORB R5, (R6), ZR // ERROR "illegal destination register" + LDORLD R5, (R6), ZR // ERROR "illegal destination register" + LDORLW R5, (R6), ZR // ERROR "illegal destination register" + LDORLH R5, (R6), ZR // ERROR "illegal destination register" + LDORLB R5, (R6), ZR // ERROR "illegal destination register" + LDADDAD R5, (R6), RSP // ERROR "illegal destination register" + LDADDAW R5, (R6), RSP // ERROR "illegal destination register" + LDADDAH R5, (R6), RSP // ERROR "illegal destination register" + LDADDAB R5, (R6), RSP // ERROR "illegal destination register" + LDADDALD R5, (R6), RSP // ERROR "illegal destination register" + LDADDALW R5, (R6), RSP // ERROR "illegal destination register" + LDADDALH R5, (R6), RSP // ERROR "illegal destination register" + LDADDALB R5, (R6), RSP // ERROR "illegal destination register" + LDADDD R5, (R6), RSP // ERROR "illegal destination register" + LDADDW R5, (R6), RSP // ERROR "illegal destination register" + LDADDH R5, (R6), RSP // ERROR "illegal destination register" + LDADDB R5, (R6), RSP // ERROR "illegal destination register" + LDADDLD R5, (R6), RSP // ERROR "illegal destination register" + LDADDLW R5, (R6), RSP // ERROR "illegal destination register" + LDADDLH R5, (R6), RSP // ERROR "illegal destination register" + LDADDLB R5, (R6), RSP // ERROR "illegal destination register" + LDANDAD R5, (R6), RSP // ERROR "illegal destination register" + LDANDAW R5, (R6), RSP // ERROR "illegal destination register" + LDANDAH R5, (R6), RSP // ERROR "illegal destination register" + LDANDAB R5, (R6), RSP // ERROR "illegal destination register" + LDANDALD R5, (R6), RSP // ERROR "illegal destination register" + LDANDALW R5, (R6), RSP // ERROR "illegal destination register" + LDANDALH R5, (R6), RSP // ERROR "illegal destination register" + LDANDALB R5, (R6), RSP // ERROR "illegal destination register" + LDANDD R5, (R6), RSP // ERROR "illegal destination register" + LDANDW R5, (R6), RSP // ERROR "illegal destination register" + LDANDH R5, (R6), RSP // ERROR "illegal destination register" + LDANDB R5, (R6), RSP // ERROR "illegal destination register" + LDANDLD R5, (R6), RSP // ERROR "illegal destination register" + LDANDLW R5, (R6), RSP // ERROR "illegal destination register" + LDANDLH R5, (R6), RSP // ERROR "illegal destination register" + LDANDLB R5, (R6), RSP // ERROR "illegal destination register" + LDEORAD R5, (R6), RSP // ERROR "illegal destination register" + LDEORAW R5, (R6), RSP // ERROR "illegal destination register" + LDEORAH R5, (R6), RSP // ERROR "illegal destination register" + LDEORAB R5, (R6), RSP // ERROR "illegal destination register" + LDEORALD R5, (R6), RSP // ERROR "illegal destination register" + LDEORALW R5, (R6), RSP // ERROR "illegal destination register" + LDEORALH R5, (R6), RSP // ERROR "illegal destination register" + LDEORALB R5, (R6), RSP // ERROR "illegal destination register" + LDEORD R5, (R6), RSP // ERROR "illegal destination register" + LDEORW R5, (R6), RSP // ERROR "illegal destination register" + LDEORH R5, (R6), RSP // ERROR "illegal destination register" + LDEORB R5, (R6), RSP // ERROR "illegal destination register" + LDEORLD R5, (R6), RSP // ERROR "illegal destination register" + LDEORLW R5, (R6), RSP // ERROR "illegal destination register" + LDEORLH R5, (R6), RSP // ERROR "illegal destination register" + LDEORLB R5, (R6), RSP // ERROR "illegal destination register" + LDORAD R5, (R6), RSP // ERROR "illegal destination register" + LDORAW R5, (R6), RSP // ERROR "illegal destination register" + LDORAH R5, (R6), RSP // ERROR "illegal destination register" + LDORAB R5, (R6), RSP // ERROR "illegal destination register" + LDORALD R5, (R6), RSP // ERROR "illegal destination register" + LDORALW R5, (R6), RSP // ERROR "illegal destination register" + LDORALH R5, (R6), RSP // ERROR "illegal destination register" + LDORALB R5, (R6), RSP // ERROR "illegal destination register" + LDORD R5, (R6), RSP // ERROR "illegal destination register" + LDORW R5, (R6), RSP // ERROR "illegal destination register" + LDORH R5, (R6), RSP // ERROR "illegal destination register" + LDORB R5, (R6), RSP // ERROR "illegal destination register" + LDORLD R5, (R6), RSP // ERROR "illegal destination register" + LDORLW R5, (R6), RSP // ERROR "illegal destination register" + LDORLH R5, (R6), RSP // ERROR "illegal destination register" + LDORLB R5, (R6), RSP // ERROR "illegal destination register" + SWPAD R5, (R6), RSP // ERROR "illegal destination register" + SWPAW R5, (R6), RSP // ERROR "illegal destination register" + SWPAH R5, (R6), RSP // ERROR "illegal destination register" + SWPAB R5, (R6), RSP // ERROR "illegal destination register" + SWPALD R5, (R6), RSP // ERROR "illegal destination register" + SWPALW R5, (R6), RSP // ERROR "illegal destination register" + SWPALH R5, (R6), RSP // ERROR "illegal destination register" + SWPALB R5, (R6), RSP // ERROR "illegal destination register" + SWPD R5, (R6), RSP // ERROR "illegal destination register" + SWPW R5, (R6), RSP // ERROR "illegal destination register" + SWPH R5, (R6), RSP // ERROR "illegal destination register" + SWPB R5, (R6), RSP // ERROR "illegal destination register" + SWPLD R5, (R6), RSP // ERROR "illegal destination register" + SWPLW R5, (R6), RSP // ERROR "illegal destination register" + SWPLH R5, (R6), RSP // ERROR "illegal destination register" + SWPLB R5, (R6), RSP // ERROR "illegal destination register" + STXR R5, (R6), RSP // ERROR "illegal destination register" + STXRW R5, (R6), RSP // ERROR "illegal destination register" + STLXR R5, (R6), RSP // ERROR "illegal destination register" + STLXRW R5, (R6), RSP // ERROR "illegal destination register" + STXP (R5, R7), (R6), RSP // ERROR "illegal destination register" + STXPW (R5, R7), (R6), RSP // ERROR "illegal destination register" + STLXP (R5, R7), (R6), RSP // ERROR "illegal destination register" + STLXP (R5, R7), (R6), RSP // ERROR "illegal destination register" RET diff --git a/src/cmd/internal/obj/arm64/a.out.go b/src/cmd/internal/obj/arm64/a.out.go index 18cdd10f9b..944eab1955 100644 --- a/src/cmd/internal/obj/arm64/a.out.go +++ b/src/cmd/internal/obj/arm64/a.out.go @@ -598,18 +598,38 @@ const ( AHVC AIC AISB + ALDADDAB + ALDADDAD + ALDADDAH + ALDADDAW ALDADDALB + ALDADDALD ALDADDALH ALDADDALW - ALDADDALD ALDADDB + ALDADDD ALDADDH ALDADDW - ALDADDD + ALDADDLB + ALDADDLD + ALDADDLH + ALDADDLW + ALDANDAB + ALDANDAD + ALDANDAH + ALDANDAW + ALDANDALB + ALDANDALD + ALDANDALH + ALDANDALW ALDANDB + ALDANDD ALDANDH ALDANDW - ALDANDD + ALDANDLB + ALDANDLD + ALDANDLH + ALDANDLW ALDAR ALDARB ALDARH @@ -620,14 +640,38 @@ const ( ALDAXRB ALDAXRH ALDAXRW + ALDEORAB + ALDEORAD + ALDEORAH + ALDEORAW + ALDEORALB + ALDEORALD + ALDEORALH + ALDEORALW ALDEORB + ALDEORD ALDEORH ALDEORW - ALDEORD + ALDEORLB + ALDEORLD + ALDEORLH + ALDEORLW + ALDORAB + ALDORAD + ALDORAH + ALDORAW + ALDORALB + ALDORALD + ALDORALH + ALDORALW ALDORB + ALDORD ALDORH ALDORW - ALDORD + ALDORLB + ALDORLD + ALDORLH + ALDORLW ALDP ALDPW ALDPSW @@ -779,14 +823,22 @@ const ( AMOVPS AMOVPSW AMOVPW - ASWPD + ASWPAD + ASWPAW + ASWPAH + ASWPAB ASWPALD - ASWPW ASWPALW - ASWPH ASWPALH - ASWPB ASWPALB + ASWPD + ASWPW + ASWPH + ASWPB + ASWPLD + ASWPLW + ASWPLH + ASWPLB ABEQ ABNE ABCS diff --git a/src/cmd/internal/obj/arm64/anames.go b/src/cmd/internal/obj/arm64/anames.go index 55e2b5bafb..5af6fdc8de 100644 --- a/src/cmd/internal/obj/arm64/anames.go +++ b/src/cmd/internal/obj/arm64/anames.go @@ -95,18 +95,38 @@ var Anames = []string{ "HVC", "IC", "ISB", + "LDADDAB", + "LDADDAD", + "LDADDAH", + "LDADDAW", "LDADDALB", + "LDADDALD", "LDADDALH", "LDADDALW", - "LDADDALD", "LDADDB", + "LDADDD", "LDADDH", "LDADDW", - "LDADDD", + "LDADDLB", + "LDADDLD", + "LDADDLH", + "LDADDLW", + "LDANDAB", + "LDANDAD", + "LDANDAH", + "LDANDAW", + "LDANDALB", + "LDANDALD", + "LDANDALH", + "LDANDALW", "LDANDB", + "LDANDD", "LDANDH", "LDANDW", - "LDANDD", + "LDANDLB", + "LDANDLD", + "LDANDLH", + "LDANDLW", "LDAR", "LDARB", "LDARH", @@ -117,14 +137,38 @@ var Anames = []string{ "LDAXRB", "LDAXRH", "LDAXRW", + "LDEORAB", + "LDEORAD", + "LDEORAH", + "LDEORAW", + "LDEORALB", + "LDEORALD", + "LDEORALH", + "LDEORALW", "LDEORB", + "LDEORD", "LDEORH", "LDEORW", - "LDEORD", + "LDEORLB", + "LDEORLD", + "LDEORLH", + "LDEORLW", + "LDORAB", + "LDORAD", + "LDORAH", + "LDORAW", + "LDORALB", + "LDORALD", + "LDORALH", + "LDORALW", "LDORB", + "LDORD", "LDORH", "LDORW", - "LDORD", + "LDORLB", + "LDORLD", + "LDORLH", + "LDORLW", "LDP", "LDPW", "LDPSW", @@ -276,14 +320,22 @@ var Anames = []string{ "MOVPS", "MOVPSW", "MOVPW", - "SWPD", + "SWPAD", + "SWPAW", + "SWPAH", + "SWPAB", "SWPALD", - "SWPW", "SWPALW", - "SWPH", "SWPALH", - "SWPB", "SWPALB", + "SWPD", + "SWPW", + "SWPH", + "SWPB", + "SWPLD", + "SWPLW", + "SWPLH", + "SWPLB", "BEQ", "BNE", "BCS", diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index cbe5796234..ef9991a36b 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -79,6 +79,95 @@ type Optab struct { scond uint16 } +func IsAtomicInstruction(as obj.As) bool { + _, ok := atomicInstructions[as] + return ok +} + +// known field values of an instruction. +var atomicInstructions = map[obj.As]uint32{ + ALDADDAD: 3<<30 | 0x1c5<<21 | 0x00<<10, + ALDADDAW: 2<<30 | 0x1c5<<21 | 0x00<<10, + ALDADDAH: 1<<30 | 0x1c5<<21 | 0x00<<10, + ALDADDAB: 0<<30 | 0x1c5<<21 | 0x00<<10, + ALDADDALD: 3<<30 | 0x1c7<<21 | 0x00<<10, + ALDADDALW: 2<<30 | 0x1c7<<21 | 0x00<<10, + ALDADDALH: 1<<30 | 0x1c7<<21 | 0x00<<10, + ALDADDALB: 0<<30 | 0x1c7<<21 | 0x00<<10, + ALDADDD: 3<<30 | 0x1c1<<21 | 0x00<<10, + ALDADDW: 2<<30 | 0x1c1<<21 | 0x00<<10, + ALDADDH: 1<<30 | 0x1c1<<21 | 0x00<<10, + ALDADDB: 0<<30 | 0x1c1<<21 | 0x00<<10, + ALDADDLD: 3<<30 | 0x1c3<<21 | 0x00<<10, + ALDADDLW: 2<<30 | 0x1c3<<21 | 0x00<<10, + ALDADDLH: 1<<30 | 0x1c3<<21 | 0x00<<10, + ALDADDLB: 0<<30 | 0x1c3<<21 | 0x00<<10, + ALDANDAD: 3<<30 | 0x1c5<<21 | 0x04<<10, + ALDANDAW: 2<<30 | 0x1c5<<21 | 0x04<<10, + ALDANDAH: 1<<30 | 0x1c5<<21 | 0x04<<10, + ALDANDAB: 0<<30 | 0x1c5<<21 | 0x04<<10, + ALDANDALD: 3<<30 | 0x1c7<<21 | 0x04<<10, + ALDANDALW: 2<<30 | 0x1c7<<21 | 0x04<<10, + ALDANDALH: 1<<30 | 0x1c7<<21 | 0x04<<10, + ALDANDALB: 0<<30 | 0x1c7<<21 | 0x04<<10, + ALDANDD: 3<<30 | 0x1c1<<21 | 0x04<<10, + ALDANDW: 2<<30 | 0x1c1<<21 | 0x04<<10, + ALDANDH: 1<<30 | 0x1c1<<21 | 0x04<<10, + ALDANDB: 0<<30 | 0x1c1<<21 | 0x04<<10, + ALDANDLD: 3<<30 | 0x1c3<<21 | 0x04<<10, + ALDANDLW: 2<<30 | 0x1c3<<21 | 0x04<<10, + ALDANDLH: 1<<30 | 0x1c3<<21 | 0x04<<10, + ALDANDLB: 0<<30 | 0x1c3<<21 | 0x04<<10, + ALDEORAD: 3<<30 | 0x1c5<<21 | 0x08<<10, + ALDEORAW: 2<<30 | 0x1c5<<21 | 0x08<<10, + ALDEORAH: 1<<30 | 0x1c5<<21 | 0x08<<10, + ALDEORAB: 0<<30 | 0x1c5<<21 | 0x08<<10, + ALDEORALD: 3<<30 | 0x1c7<<21 | 0x08<<10, + ALDEORALW: 2<<30 | 0x1c7<<21 | 0x08<<10, + ALDEORALH: 1<<30 | 0x1c7<<21 | 0x08<<10, + ALDEORALB: 0<<30 | 0x1c7<<21 | 0x08<<10, + ALDEORD: 3<<30 | 0x1c1<<21 | 0x08<<10, + ALDEORW: 2<<30 | 0x1c1<<21 | 0x08<<10, + ALDEORH: 1<<30 | 0x1c1<<21 | 0x08<<10, + ALDEORB: 0<<30 | 0x1c1<<21 | 0x08<<10, + ALDEORLD: 3<<30 | 0x1c3<<21 | 0x08<<10, + ALDEORLW: 2<<30 | 0x1c3<<21 | 0x08<<10, + ALDEORLH: 1<<30 | 0x1c3<<21 | 0x08<<10, + ALDEORLB: 0<<30 | 0x1c3<<21 | 0x08<<10, + ALDORAD: 3<<30 | 0x1c5<<21 | 0x0c<<10, + ALDORAW: 2<<30 | 0x1c5<<21 | 0x0c<<10, + ALDORAH: 1<<30 | 0x1c5<<21 | 0x0c<<10, + ALDORAB: 0<<30 | 0x1c5<<21 | 0x0c<<10, + ALDORALD: 3<<30 | 0x1c7<<21 | 0x0c<<10, + ALDORALW: 2<<30 | 0x1c7<<21 | 0x0c<<10, + ALDORALH: 1<<30 | 0x1c7<<21 | 0x0c<<10, + ALDORALB: 0<<30 | 0x1c7<<21 | 0x0c<<10, + ALDORD: 3<<30 | 0x1c1<<21 | 0x0c<<10, + ALDORW: 2<<30 | 0x1c1<<21 | 0x0c<<10, + ALDORH: 1<<30 | 0x1c1<<21 | 0x0c<<10, + ALDORB: 0<<30 | 0x1c1<<21 | 0x0c<<10, + ALDORLD: 3<<30 | 0x1c3<<21 | 0x0c<<10, + ALDORLW: 2<<30 | 0x1c3<<21 | 0x0c<<10, + ALDORLH: 1<<30 | 0x1c3<<21 | 0x0c<<10, + ALDORLB: 0<<30 | 0x1c3<<21 | 0x0c<<10, + ASWPAD: 3<<30 | 0x1c5<<21 | 0x20<<10, + ASWPAW: 2<<30 | 0x1c5<<21 | 0x20<<10, + ASWPAH: 1<<30 | 0x1c5<<21 | 0x20<<10, + ASWPAB: 0<<30 | 0x1c5<<21 | 0x20<<10, + ASWPALD: 3<<30 | 0x1c7<<21 | 0x20<<10, + ASWPALW: 2<<30 | 0x1c7<<21 | 0x20<<10, + ASWPALH: 1<<30 | 0x1c7<<21 | 0x20<<10, + ASWPALB: 0<<30 | 0x1c7<<21 | 0x20<<10, + ASWPD: 3<<30 | 0x1c1<<21 | 0x20<<10, + ASWPW: 2<<30 | 0x1c1<<21 | 0x20<<10, + ASWPH: 1<<30 | 0x1c1<<21 | 0x20<<10, + ASWPB: 0<<30 | 0x1c1<<21 | 0x20<<10, + ASWPLD: 3<<30 | 0x1c3<<21 | 0x20<<10, + ASWPLW: 2<<30 | 0x1c3<<21 | 0x20<<10, + ASWPLH: 1<<30 | 0x1c3<<21 | 0x20<<10, + ASWPLB: 0<<30 | 0x1c3<<21 | 0x20<<10, +} + var oprange [ALAST & obj.AMask][]Optab var xcmp [C_NCLASS][C_NCLASS]bool @@ -2213,33 +2302,9 @@ func buildop(ctxt *obj.Link) { oprangeset(AMOVZW, t) case ASWPD: - oprangeset(ASWPALD, t) - oprangeset(ASWPB, t) - oprangeset(ASWPH, t) - oprangeset(ASWPW, t) - oprangeset(ASWPALB, t) - oprangeset(ASWPALH, t) - oprangeset(ASWPALW, t) - oprangeset(ALDADDALB, t) - oprangeset(ALDADDALH, t) - oprangeset(ALDADDALW, t) - oprangeset(ALDADDALD, t) - oprangeset(ALDADDB, t) - oprangeset(ALDADDH, t) - oprangeset(ALDADDW, t) - oprangeset(ALDADDD, t) - oprangeset(ALDANDB, t) - oprangeset(ALDANDH, t) - oprangeset(ALDANDW, t) - oprangeset(ALDANDD, t) - oprangeset(ALDEORB, t) - oprangeset(ALDEORH, t) - oprangeset(ALDEORW, t) - oprangeset(ALDEORD, t) - oprangeset(ALDORB, t) - oprangeset(ALDORH, t) - oprangeset(ALDORW, t) - oprangeset(ALDORD, t) + for i := range atomicInstructions { + oprangeset(i, t) + } case ABEQ: oprangeset(ABNE, t) @@ -3659,39 +3724,17 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { o1 |= uint32(p.From.Reg&31) << 5 o1 |= uint32(p.To.Reg & 31) - case 47: /* SWPx Rs, (Rb), Rt: Rs -> (Rb) -> Rt */ + case 47: /* SWPx/LDADDx/LDANDx/LDEORx/LDORx Rs, (Rb), Rt */ rs := p.From.Reg rt := p.RegTo2 rb := p.To.Reg - switch p.As { - case ASWPD, ASWPALD, ALDADDALD, ALDADDD, ALDANDD, ALDEORD, ALDORD: // 64-bit - o1 = 3 << 30 - case ASWPW, ASWPALW, ALDADDALW, ALDADDW, ALDANDW, ALDEORW, ALDORW: // 32-bit - o1 = 2 << 30 - case ASWPH, ASWPALH, ALDADDALH, ALDADDH, ALDANDH, ALDEORH, ALDORH: // 16-bit - o1 = 1 << 30 - case ASWPB, ASWPALB, ALDADDALB, ALDADDB, ALDANDB, ALDEORB, ALDORB: // 8-bit - o1 = 0 << 30 - default: - c.ctxt.Diag("illegal instruction: %v\n", p) - } - switch p.As { - case ASWPD, ASWPW, ASWPH, ASWPB, ASWPALD, ASWPALW, ASWPALH, ASWPALB: - o1 |= 0x20 << 10 - case ALDADDALD, ALDADDALW, ALDADDALH, ALDADDALB, ALDADDD, ALDADDW, ALDADDH, ALDADDB: - o1 |= 0x00 << 10 - case ALDANDD, ALDANDW, ALDANDH, ALDANDB: - o1 |= 0x04 << 10 - case ALDEORD, ALDEORW, ALDEORH, ALDEORB: - o1 |= 0x08 << 10 - case ALDORD, ALDORW, ALDORH, ALDORB: - o1 |= 0x0c << 10 - } - switch p.As { - case ALDADDALD, ALDADDALW, ALDADDALH, ALDADDALB, ASWPALD, ASWPALW, ASWPALH, ASWPALB: - o1 |= 3 << 22 + + fields := atomicInstructions[p.As] + // rt can't be sp. rt can't be r31 when field A is 0, A bit is the 23rd bit. + if rt == REG_RSP || (rt == REGZERO && (fields&(1<<23) == 0)) { + c.ctxt.Diag("illegal destination register: %v\n", p) } - o1 |= 0x1c1<<21 | uint32(rs&31)<<16 | uint32(rb&31)<<5 | uint32(rt&31) + o1 |= fields | uint32(rs&31)<<16 | uint32(rb&31)<<5 | uint32(rt&31) case 48: /* ADD $C_ADDCON2, Rm, Rd */ op := c.opirr(p, p.As) @@ -3846,6 +3889,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) { c.ctxt.Diag("constrained unpredictable behavior: %v", p) } } + if s == REG_RSP { + c.ctxt.Diag("illegal destination register: %v\n", p) + } o1 = c.opstore(p, p.As) if p.RegTo2 != obj.REG_NONE { -- GitLab From b1a783df87069e395f0fb1a033a685b35d34b2ee Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 12:01:18 -0500 Subject: [PATCH 0313/1679] test/bench/go1: add go.mod file cmd/dist executes 'go test' within this directory, so it needs a go.mod file to tell the compiler what package path to use in diagnostic and debug information. Updates #30228 Change-Id: Ia313ac06bc0ec4631d415faa20c56cce2ac8dbc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/165498 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- test/bench/go1/go.mod | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/bench/go1/go.mod diff --git a/test/bench/go1/go.mod b/test/bench/go1/go.mod new file mode 100644 index 0000000000..41f75c4031 --- /dev/null +++ b/test/bench/go1/go.mod @@ -0,0 +1,3 @@ +module test/bench/go1 + +go 1.12 -- GitLab From 52e2126a5ee7c1123ded51874ec0fe0394eabd0a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 17:45:39 -0500 Subject: [PATCH 0314/1679] runtime: do not use a relative import in testdata Relative imports do not work in module mode. Use a fully-qualified import path instead. Updates #30228 Change-Id: I0a42ffa521a7b513395e7e1788022d24cbb1f31a Reviewed-on: https://go-review.googlesource.com/c/go/+/165817 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/runtime/testdata/testprogcgo/dll_windows.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/testdata/testprogcgo/dll_windows.go b/src/runtime/testdata/testprogcgo/dll_windows.go index aed2410a45..25380fb217 100644 --- a/src/runtime/testdata/testprogcgo/dll_windows.go +++ b/src/runtime/testdata/testprogcgo/dll_windows.go @@ -12,7 +12,7 @@ DWORD getthread() { } */ import "C" -import "./windows" +import "runtime/testdata/testprogcgo/windows" func init() { register("CgoDLLImportsMain", CgoDLLImportsMain) -- GitLab From 7778b5ab5a2215668ad1ad4d174d58b3363c9de8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 17:01:19 -0500 Subject: [PATCH 0315/1679] cmd/go: clear GOPROXY in TestGoGetInsecure TestGoGetInsecure verifies that 'go get -insecure' can fetch a particular package. However, the GOPROXY protocol does not provide a means for proxies to indicate packages as insecure; thus, proxies cannot safely serve those packages. Updates #30571 Change-Id: I447776dff98bd8ee6eb5055b897b9c7d293e3423 Reviewed-on: https://go-review.googlesource.com/c/go/+/165745 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/go/go_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 9ba52e609e..c6fb046b32 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -3670,6 +3670,7 @@ func TestGoGetInsecure(t *testing.T) { tg.tempFile("go.mod", "module m") tg.cd(tg.path(".")) tg.setenv("GO111MODULE", "on") + tg.setenv("GO111PROXY", "") } else { tg.setenv("GOPATH", tg.path(".")) tg.setenv("GO111MODULE", "off") -- GitLab From 4a9064ef41ccc65454564536f40cf7d5a00db8ad Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 5 Mar 2019 17:42:48 -0800 Subject: [PATCH 0316/1679] cmd/compile: fix ordering for short-circuiting ops Make sure the side effects inside short-circuited operations (&& and ||) happen correctly. Before this CL, we attached the side effects to the node itself using exprInPlace. That caused other side effects in sibling expressions to get reordered with respect to the short circuit side effect. Instead, rewrite a && b like: r := a if r { r = b } That code we can keep correctly ordered with respect to other side-effects extracted from part of a big expression. exprInPlace seems generally unsafe. But this was the only case where exprInPlace is called not at the top level of an expression, so I don't think the other uses can actually trigger an issue (there can't be a sibling expression). TODO: maybe those cases don't need "in place", and we can retire that function generally. This CL needed a small tweak to the SSA generation of OIF so that the short circuit optimization still triggers. The short circuit optimization looks for triangle but not diamonds, so don't bother allocating a block if it will be empty. Go 1 benchmarks are in the noise. Fixes #30566 Change-Id: I19c04296bea63cbd6ad05f87a63b005029123610 Reviewed-on: https://go-review.googlesource.com/c/go/+/165617 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/order.go | 40 +++++++++++++++++++++++----- src/cmd/compile/internal/gc/ssa.go | 24 ++++++++++------- test/checkbce.go | 4 +-- test/fixedbugs/issue30566a.go | 23 ++++++++++++++++ test/fixedbugs/issue30566b.go | 27 +++++++++++++++++++ test/live.go | 9 ++++--- 6 files changed, 104 insertions(+), 23 deletions(-) create mode 100644 test/fixedbugs/issue30566a.go create mode 100644 test/fixedbugs/issue30566b.go diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 4848a02bb6..0098242c79 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -1130,14 +1130,40 @@ func (o *Order) expr(n, lhs *Node) *Node { } case OANDAND, OOROR: - mark := o.markTemp() - n.Left = o.expr(n.Left, nil) + // ... = LHS && RHS + // + // var r bool + // r = LHS + // if r { // or !r, for OROR + // r = RHS + // } + // ... = r + + r := o.newTemp(n.Type, false) + + // Evaluate left-hand side. + lhs := o.expr(n.Left, nil) + o.out = append(o.out, typecheck(nod(OAS, r, lhs), ctxStmt)) + + // Evaluate right-hand side, save generated code. + saveout := o.out + o.out = nil + t := o.markTemp() + rhs := o.expr(n.Right, nil) + o.out = append(o.out, typecheck(nod(OAS, r, rhs), ctxStmt)) + o.cleanTemp(t) + gen := o.out + o.out = saveout - // Clean temporaries from first branch at beginning of second. - // Leave them on the stack so that they can be killed in the outer - // context in case the short circuit is taken. - n.Right = addinit(n.Right, o.cleanTempNoPop(mark)) - n.Right = o.exprInPlace(n.Right) + // If left-hand side doesn't cause a short-circuit, issue right-hand side. + nif := nod(OIF, r, nil) + if n.Op == OANDAND { + nif.Nbody.Set(gen) + } else { + nif.Rlist.Set(gen) + } + o.out = append(o.out, nif) + n = r case OCALLFUNC, OCALLINTER, diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 95904edd6a..e03988dac2 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -994,26 +994,32 @@ func (s *state) stmt(n *Node) { s.assign(n.Left, r, deref, skip) case OIF: - bThen := s.f.NewBlock(ssa.BlockPlain) bEnd := s.f.NewBlock(ssa.BlockPlain) - var bElse *ssa.Block var likely int8 if n.Likely() { likely = 1 } + var bThen *ssa.Block + if n.Nbody.Len() != 0 { + bThen = s.f.NewBlock(ssa.BlockPlain) + } else { + bThen = bEnd + } + var bElse *ssa.Block if n.Rlist.Len() != 0 { bElse = s.f.NewBlock(ssa.BlockPlain) - s.condBranch(n.Left, bThen, bElse, likely) } else { - s.condBranch(n.Left, bThen, bEnd, likely) + bElse = bEnd } + s.condBranch(n.Left, bThen, bElse, likely) - s.startBlock(bThen) - s.stmtList(n.Nbody) - if b := s.endBlock(); b != nil { - b.AddEdgeTo(bEnd) + if n.Nbody.Len() != 0 { + s.startBlock(bThen) + s.stmtList(n.Nbody) + if b := s.endBlock(); b != nil { + b.AddEdgeTo(bEnd) + } } - if n.Rlist.Len() != 0 { s.startBlock(bElse) s.stmtList(n.Rlist) diff --git a/test/checkbce.go b/test/checkbce.go index a8f060aa72..6a126099bc 100644 --- a/test/checkbce.go +++ b/test/checkbce.go @@ -33,9 +33,7 @@ func f1(a [256]int, i int) { if 4 <= i && i < len(a) { useInt(a[i]) - useInt(a[i-1]) // ERROR "Found IsInBounds$" - // TODO: 'if 4 <= i && i < len(a)' gets rewritten to 'if uint(i - 4) < 256 - 4', - // which the bounds checker cannot yet use to infer that the next line doesn't need a bounds check. + useInt(a[i-1]) useInt(a[i-4]) } } diff --git a/test/fixedbugs/issue30566a.go b/test/fixedbugs/issue30566a.go new file mode 100644 index 0000000000..5d736ccd0d --- /dev/null +++ b/test/fixedbugs/issue30566a.go @@ -0,0 +1,23 @@ +// run + +// Copyright 2019 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 main + +import "fmt" + +//go:noinline +func ident(s string) string { return s } + +func returnSecond(x bool, s string) string { return s } + +func identWrapper(s string) string { return ident(s) } + +func main() { + got := returnSecond((false || identWrapper("bad") != ""), ident("good")) + if got != "good" { + panic(fmt.Sprintf("wanted \"good\", got \"%s\"", got)) + } +} diff --git a/test/fixedbugs/issue30566b.go b/test/fixedbugs/issue30566b.go new file mode 100644 index 0000000000..92e064436d --- /dev/null +++ b/test/fixedbugs/issue30566b.go @@ -0,0 +1,27 @@ +// run + +// Copyright 2019 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 main + +import ( + "bytes" + "fmt" +) + +func main() { + _, _ = false || g(1), g(2) + if !bytes.Equal(x, []byte{1, 2}) { + panic(fmt.Sprintf("wanted [1,2], got %v", x)) + } +} + +var x []byte + +//go:noinline +func g(b byte) bool { + x = append(x, b) + return false +} diff --git a/test/live.go b/test/live.go index a508947afc..e7134eca0c 100644 --- a/test/live.go +++ b/test/live.go @@ -572,7 +572,7 @@ func f36() { func f37() { if (m33[byteptr()] == 0 || // ERROR "stack object .autotmp_[0-9]+ interface \{\}" m33[byteptr()] == 0) && // ERROR "stack object .autotmp_[0-9]+ interface \{\}" - m33[byteptr()] == 0 { // ERROR "stack object .autotmp_[0-9]+ interface \{\}" + m33[byteptr()] == 0 { printnl() return } @@ -697,9 +697,10 @@ func f41(p, q *int) (r *int) { // ERROR "live at entry to f41: p q$" func f42() { var p, q, r int - f43([]*int{&p,&q,&r}) // ERROR "stack object .autotmp_[0-9]+ \[3\]\*int$" - f43([]*int{&p,&r,&q}) - f43([]*int{&q,&p,&r}) + f43([]*int{&p, &q, &r}) // ERROR "stack object .autotmp_[0-9]+ \[3\]\*int$" + f43([]*int{&p, &r, &q}) + f43([]*int{&q, &p, &r}) } + //go:noescape func f43(a []*int) -- GitLab From a30421a39480efd766eb07518fb2edc4c9e0a8b8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 6 Mar 2019 11:06:14 -0500 Subject: [PATCH 0317/1679] cmd/vet/all: build the vet tool within the golang.org/x/tools repository When running cmd/vet/all on multiple builders, the coordinator places a copy of golang.org/x/tools at a consistent revision in the builders' GOPATHs. Keep using the consistent revision in module mode by executing the build from a working directory within that repository. When not running on a builder, use 'go vet' directly instead of building an arbitrarily stale vet tool from the user's GOPATH. Updates #30228 Change-Id: I19bc809247378da98f3e6ac8572f61bda4518143 Reviewed-on: https://go-review.googlesource.com/c/go/+/165740 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/vet/all/main.go | 90 +++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index 8cc4140e6e..018eba4d6e 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -42,7 +42,7 @@ var failed uint32 // updated atomically func main() { log.SetPrefix("vet/all: ") - log.SetFlags(0) + log.SetFlags(log.Lshortfile) testenv.SetModVendor() var err error @@ -78,9 +78,10 @@ var hostPlatform = platform{os: build.Default.GOOS, arch: build.Default.GOARCH} func allPlatforms() []platform { var pp []platform cmd := exec.Command(cmdGoPath, "tool", "dist", "list") + cmd.Stderr = new(strings.Builder) out, err := cmd.Output() if err != nil { - log.Fatal(err) + log.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) } lines := bytes.Split(out, []byte{'\n'}) for _, line := range lines { @@ -222,22 +223,61 @@ func (p platform) vet() { w := make(whitelist) w.load(p.os, p.arch) - tmpdir, err := ioutil.TempDir("", "cmd-vet-all") - if err != nil { - log.Fatal(err) - } - defer os.RemoveAll(tmpdir) + var vetCmd []string - // Build the go/packages-based vet command from the x/tools - // repo. It is considerably faster than "go vet", which rebuilds - // the standard library. - vetTool := filepath.Join(tmpdir, "vet") - cmd := exec.Command(cmdGoPath, "build", "-o", vetTool, "golang.org/x/tools/go/analysis/cmd/vet") - cmd.Dir = filepath.Join(runtime.GOROOT(), "src") - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stderr - if err := cmd.Run(); err != nil { - log.Fatal(err) + if os.Getenv("GO_BUILDER_NAME") == "" { + vetCmd = []string{cmdGoPath, "vet"} + } else { + // Build the go/packages-based vet command from the x/tools + // repo. It is considerably faster than "go vet", which rebuilds + // the standard library. + tmpdir, err := ioutil.TempDir("", "cmd-vet-all") + if err != nil { + log.Fatal(err) + } + defer os.RemoveAll(tmpdir) + + vetTool := filepath.Join(tmpdir, "vet") + vetCmd = []string{ + vetTool, + "-nilness=0", // expensive, uses SSA + } + + cmd := exec.Command(cmdGoPath, "build", "-o", vetTool, "golang.org/x/tools/go/analysis/cmd/vet") + cmd.Env = os.Environ() + + // golang.org/x/tools does not have a vendor directory, so don't try to use + // one in module mode. + for i, v := range cmd.Env { + if strings.HasPrefix(v, "GOFLAGS=") { + var goflags []string + for _, f := range strings.Fields(strings.TrimPrefix(v, "GOFLAGS=")) { + if f != "-mod=vendor" && f != "--mod=vendor" { + goflags = append(goflags, f) + } + } + cmd.Env[i] = strings.Join(goflags, " ") + } + } + + // The coordinator places a copy of golang.org/x/tools in GOPATH. + // If we can find it there, use that specific version. + for _, gp := range filepath.SplitList(os.Getenv("GOPATH")) { + gopathDir := filepath.Join(gp, "src", "golang.org", "x", "tools", "go", "analysis", "cmd", "vet") + if _, err := os.Stat(gopathDir); err == nil { + cmd.Dir = gopathDir + } + } + if cmd.Dir == "" { + // Otherwise, move to tmpdir and let the module loader resolve the latest version. + cmd.Dir = tmpdir + } + + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalf("%s: %v", strings.Join(cmd.Args, " "), err) + } } // TODO: The unsafeptr checks are disabled for now, @@ -245,13 +285,13 @@ func (p platform) vet() { // and no clear way to improve vet to eliminate large chunks of them. // And having them in the whitelists will just cause annoyance // and churn when working on the runtime. - cmd = exec.Command(vetTool, - "-unsafeptr=0", - "-nilness=0", // expensive, uses SSA - "std", - "cmd/...", - "cmd/compile/internal/gc/testdata", - ) + cmd := exec.Command(vetCmd[0], + append(vetCmd[1:], + "-unsafeptr=0", + "std", + "cmd/...", + "cmd/compile/internal/gc/testdata", + )...) cmd.Dir = filepath.Join(runtime.GOROOT(), "src") cmd.Env = append(os.Environ(), "GOOS="+p.os, "GOARCH="+p.arch, "CGO_ENABLED=0") stderr, err := cmd.StderrPipe() @@ -321,7 +361,7 @@ NextLine: if file == "" { if !parseFailed { parseFailed = true - fmt.Fprintf(os.Stderr, "failed to parse %s vet output:\n", p) + fmt.Fprintf(os.Stderr, "failed to parse %s output:\n# %s\n", p, strings.Join(cmd.Args, " ")) } fmt.Fprintln(os.Stderr, line) continue -- GitLab From 1650f1ba0b964a06a242c3318e85b3b46f010614 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 6 Mar 2019 14:24:29 -0500 Subject: [PATCH 0318/1679] cmd/go: drop support for binary-only packages Fixes #28152 Change-Id: I98db923bdf8de7acf2df452313427bfea43b63c9 Reviewed-on: https://go-review.googlesource.com/c/go/+/165746 Run-TryBot: Jay Conrod Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/go/alldocs.go | 11 +---- src/cmd/go/go_test.go | 51 ++++------------------ src/cmd/go/internal/help/helpdoc.go | 9 ---- src/cmd/go/internal/list/list.go | 2 +- src/cmd/go/internal/work/exec.go | 18 ++------ src/cmd/go/testdata/script/binary_only.txt | 12 ----- src/go/build/doc.go | 24 +++++----- 7 files changed, 27 insertions(+), 100 deletions(-) delete mode 100644 src/cmd/go/testdata/script/binary_only.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 186f42156a..6445a6b5e8 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -648,7 +648,7 @@ // StaleReason string // explanation for Stale==true // Root string // Go root or Go path dir containing this package // ConflictDir string // this directory shadows Dir in $GOPATH -// BinaryOnly bool // binary-only package: cannot be recompiled from sources +// BinaryOnly bool // binary-only package (no longer supported) // ForTest string // package is only for use in named test // Export string // file containing export data (when using -export) // Module *Module // info about package's containing module, if any (can be nil) @@ -1598,15 +1598,6 @@ // line comment. See the go/build package documentation for // more details. // -// Through the Go 1.12 release, non-test Go source files can also include -// a //go:binary-only-package comment, indicating that the package -// sources are included for documentation only and must not be used to -// build the package binary. This enables distribution of Go packages in -// their compiled form alone. Even binary-only packages require accurate -// import blocks listing required dependencies, so that those -// dependencies can be supplied when linking the resulting command. -// Note that this feature is scheduled to be removed after the Go 1.12 release. -// // // The go.mod file // diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index c6fb046b32..19fbf6d718 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4206,9 +4206,9 @@ func TestBinaryOnlyPackages(t *testing.T) { package p1 `) - tg.wantStale("p1", "missing or invalid binary-only package", "p1 is binary-only but has no binary, should be stale") + tg.wantStale("p1", "binary-only packages are no longer supported", "p1 is binary-only, and this message should always be printed") tg.runFail("install", "p1") - tg.grepStderr("missing or invalid binary-only package", "did not report attempt to compile binary-only package") + tg.grepStderr("binary-only packages are no longer supported", "did not report attempt to compile binary-only package") tg.tempFile("src/p1/p1.go", ` package p1 @@ -4234,48 +4234,13 @@ func TestBinaryOnlyPackages(t *testing.T) { import _ "fmt" func G() `) - tg.wantNotStale("p1", "binary-only package", "should NOT want to rebuild p1 (first)") - tg.run("install", "-x", "p1") // no-op, up to date - tg.grepBothNot(`[\\/]compile`, "should not have run compiler") - tg.run("install", "p2") // does not rebuild p1 (or else p2 will fail) - tg.wantNotStale("p2", "", "should NOT want to rebuild p2") - - // changes to the non-source-code do not matter, - // and only one file needs the special comment. - tg.tempFile("src/p1/missing2.go", ` - package p1 - func H() - `) - tg.wantNotStale("p1", "binary-only package", "should NOT want to rebuild p1 (second)") - tg.wantNotStale("p2", "", "should NOT want to rebuild p2") - - tg.tempFile("src/p3/p3.go", ` - package main - import ( - "p1" - "p2" - ) - func main() { - p1.F(false) - p2.F() - } - `) - tg.run("install", "p3") - - tg.run("run", tg.path("src/p3/p3.go")) - tg.grepStdout("hello from p1", "did not see message from p1") - - tg.tempFile("src/p4/p4.go", `package main`) - // The odd string split below avoids vet complaining about - // a // +build line appearing too late in this source file. - tg.tempFile("src/p4/p4not.go", `//go:binary-only-package - - /`+`/ +build asdf + tg.wantStale("p1", "binary-only package", "should NOT want to rebuild p1 (first)") + tg.runFail("install", "p2") + tg.grepStderr("p1: binary-only packages are no longer supported", "did not report error for binary-only p1") - package main - `) - tg.run("list", "-f", "{{.BinaryOnly}}", "p4") - tg.grepStdout("false", "did not see BinaryOnly=false for p4") + tg.run("list", "-deps", "-f", "{{.ImportPath}}: {{.BinaryOnly}}", "p2") + tg.grepStdout("p1: true", "p1 not listed as BinaryOnly") + tg.grepStdout("p2: false", "p2 listed as BinaryOnly") } // Issue 16050. diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index c219a45d74..916b91efa7 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -635,15 +635,6 @@ constraints, but the go command stops scanning for build constraints at the first item in the file that is not a blank line or //-style line comment. See the go/build package documentation for more details. - -Through the Go 1.12 release, non-test Go source files can also include -a //go:binary-only-package comment, indicating that the package -sources are included for documentation only and must not be used to -build the package binary. This enables distribution of Go packages in -their compiled form alone. Even binary-only packages require accurate -import blocks listing required dependencies, so that those -dependencies can be supplied when linking the resulting command. -Note that this feature is scheduled to be removed after the Go 1.12 release. `, } diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index f3cb4e47ec..0c576b6128 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -60,7 +60,7 @@ to -f '{{.ImportPath}}'. The struct being passed to the template is: StaleReason string // explanation for Stale==true Root string // Go root or Go path dir containing this package ConflictDir string // this directory shadows Dir in $GOPATH - BinaryOnly bool // binary-only package: cannot be recompiled from sources + BinaryOnly bool // binary-only package (no longer supported) ForTest string // package is only for use in named test Export string // file containing export data (when using -export) Module *Module // info about package's containing module, if any (can be nil) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 62651cc683..3a7d3fe767 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -422,24 +422,12 @@ func (b *Builder) build(a *Action) (err error) { } if a.Package.BinaryOnly { - _, err := os.Stat(a.Package.Target) - if err == nil { - a.built = a.Package.Target - a.Target = a.Package.Target - if b.NeedExport { - a.Package.Export = a.Package.Target - } - a.buildID = b.fileHash(a.Package.Target) - a.Package.Stale = false - a.Package.StaleReason = "binary-only package" - return nil - } - a.Package.Stale = true - a.Package.StaleReason = "missing or invalid binary-only package" + p.Stale = true + p.StaleReason = "binary-only packages are no longer supported" if b.IsCmdList { return nil } - return fmt.Errorf("missing or invalid binary-only package; expected file %q", a.Package.Target) + return errors.New("binary-only packages are no longer supported") } if err := b.Mkdir(a.Objdir); err != nil { diff --git a/src/cmd/go/testdata/script/binary_only.txt b/src/cmd/go/testdata/script/binary_only.txt deleted file mode 100644 index 1842d8cea3..0000000000 --- a/src/cmd/go/testdata/script/binary_only.txt +++ /dev/null @@ -1,12 +0,0 @@ -env GO111MODULE=off - -# check that error for missing binary-only says where it should be -! go build b -stderr pkg[\\/].*a\.a - --- a/a.go -- -//go:binary-only-package - -package a --- b/b.go -- -package b; import "a" diff --git a/src/go/build/doc.go b/src/go/build/doc.go index f6444c7e05..7b044bc838 100644 --- a/src/go/build/doc.go +++ b/src/go/build/doc.go @@ -149,24 +149,28 @@ // // Binary-Only Packages // -// It is possible to distribute packages in binary form without including the -// source code used for compiling the package. To do this, the package must -// be distributed with a source file not excluded by build constraints and -// containing a "//go:binary-only-package" comment. -// Like a build constraint, this comment must appear near the top of the file, -// preceded only by blank lines and other line comments and with a blank line +// In Go 1.12 and earlier, it was possible to distribute packages in binary +// form without including the source code used for compiling the package. +// The package was distributed with a source file not excluded by build +// constraints and containing a "//go:binary-only-package" comment. Like a +// build constraint, this comment appeared at the top of a file, preceded +// only by blank lines and other line comments and with a blank line // following the comment, to separate it from the package documentation. // Unlike build constraints, this comment is only recognized in non-test // Go source files. // -// The minimal source code for a binary-only package is therefore: +// The minimal source code for a binary-only package was therefore: // // //go:binary-only-package // // package mypkg // -// The source code may include additional Go code. That code is never compiled -// but will be processed by tools like godoc and might be useful as end-user -// documentation. +// The source code could include additional Go code. That code was never +// compiled but would be processed by tools like godoc and might be useful +// as end-user documentation. +// +// "go build" and other commands no longer support binary-only-packages. +// Import and ImportDir will still set the BinaryOnly flag in packages +// containing these comments for use in tools and error messages. // package build -- GitLab From 05b3db24c1a48e995ac1f3103a2be9463fac0f96 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 6 Mar 2019 10:39:08 -0800 Subject: [PATCH 0319/1679] reflect: fix StructOf GC programs They are missing a stop byte at the end. Normally this doesn't matter, but when including a GC program in another GC program, we strip the last byte. If that last byte wasn't a stop byte, then we've thrown away part of the program we actually need. Fixes #30606 Change-Id: Ie9604beeb84f7f9442e77d31fe64c374ca132cce Reviewed-on: https://go-review.googlesource.com/c/go/+/165857 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/reflect/type.go | 1 + test/fixedbugs/issue30606.go | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/fixedbugs/issue30606.go diff --git a/src/reflect/type.go b/src/reflect/type.go index 5ce80c61dc..531417ea93 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2712,6 +2712,7 @@ func StructOf(fields []StructField) Type { } } } + prog = append(prog, 0) *(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4) typ.kind |= kindGCProg typ.gcdata = &prog[0] diff --git a/test/fixedbugs/issue30606.go b/test/fixedbugs/issue30606.go new file mode 100644 index 0000000000..bc31982e10 --- /dev/null +++ b/test/fixedbugs/issue30606.go @@ -0,0 +1,20 @@ +// run + +// Copyright 2019 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 main + +import "reflect" + +func main() {} + +func typ(x interface{}) reflect.Type { return reflect.ValueOf(x).Type() } + +var x = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F5", Type: reflect.StructOf([]reflect.StructField{ + {Name: "F4", Type: reflect.ArrayOf(5462, + reflect.SliceOf(typ(uint64(0))))}, + })}, +})) -- GitLab From 88d719f8092c250f3575cc8e136090b3db65ee15 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Wed, 6 Mar 2019 09:56:03 -0500 Subject: [PATCH 0320/1679] go/internal/gccgoimporter: test case for issue 30628 Test case for a panic/crash in gccgoimporter caused by incorrect gccgo export data emission. Note that the *.gox file checked in contains the correct export data; the main intent of the test is to make sure that gccgo produces the right export data when run on the Go source. Updates #30628 Change-Id: I29c0c17b81a43f92ff64fbfcdc58fdb46a5be370 Reviewed-on: https://go-review.googlesource.com/c/go/+/165739 Run-TryBot: Than McIntosh Reviewed-by: Robert Griesemer Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- .../internal/gccgoimporter/importer_test.go | 1 + .../gccgoimporter/testdata/issue30628.go | 18 ++++++++++++ .../gccgoimporter/testdata/issue30628.gox | 28 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 src/go/internal/gccgoimporter/testdata/issue30628.go create mode 100644 src/go/internal/gccgoimporter/testdata/issue30628.gox diff --git a/src/go/internal/gccgoimporter/importer_test.go b/src/go/internal/gccgoimporter/importer_test.go index 58fa8c8cf5..ee01883203 100644 --- a/src/go/internal/gccgoimporter/importer_test.go +++ b/src/go/internal/gccgoimporter/importer_test.go @@ -91,6 +91,7 @@ var importerTests = [...]importerTest{ {pkgpath: "v1reflect", name: "Type", want: "type Type interface{Align() int; AssignableTo(u Type) bool; Bits() int; ChanDir() ChanDir; Elem() Type; Field(i int) StructField; FieldAlign() int; FieldByIndex(index []int) StructField; FieldByName(name string) (StructField, bool); FieldByNameFunc(match func(string) bool) (StructField, bool); Implements(u Type) bool; In(i int) Type; IsVariadic() bool; Key() Type; Kind() Kind; Len() int; Method(int) Method; MethodByName(string) (Method, bool); Name() string; NumField() int; NumIn() int; NumMethod() int; NumOut() int; Out(i int) Type; PkgPath() string; Size() uintptr; String() string; common() *commonType; rawString() string; runtimeType() *runtimeType; uncommon() *uncommonType}"}, {pkgpath: "nointerface", name: "I", want: "type I int"}, {pkgpath: "issue29198", name: "FooServer", want: "type FooServer struct{FooServer *FooServer; user string; ctx context.Context}"}, + {pkgpath: "issue30628", name: "Apple", want: "type Apple struct{hey sync.RWMutex; x int; RQ [517]struct{Count uintptr; NumBytes uintptr; Last uintptr}}"}, } func TestGoxImporter(t *testing.T) { diff --git a/src/go/internal/gccgoimporter/testdata/issue30628.go b/src/go/internal/gccgoimporter/testdata/issue30628.go new file mode 100644 index 0000000000..8fd7c13d7b --- /dev/null +++ b/src/go/internal/gccgoimporter/testdata/issue30628.go @@ -0,0 +1,18 @@ +package issue30628 + +import ( + "os" + "sync" +) + +const numR = int32(os.O_TRUNC + 5) + +type Apple struct { + hey sync.RWMutex + x int + RQ [numR]struct { + Count uintptr + NumBytes uintptr + Last uintptr + } +} diff --git a/src/go/internal/gccgoimporter/testdata/issue30628.gox b/src/go/internal/gccgoimporter/testdata/issue30628.gox new file mode 100644 index 0000000000..0ff6259dd0 --- /dev/null +++ b/src/go/internal/gccgoimporter/testdata/issue30628.gox @@ -0,0 +1,28 @@ +v3; +package issue30628 +pkgpath issue30628 +import os os "os" +import sync sync "sync" +init cpu internal..z2fcpu..import poll internal..z2fpoll..import testlog internal..z2ftestlog..import io io..import os os..import runtime runtime..import sys runtime..z2finternal..z2fsys..import sync sync..import syscall syscall..import time time..import +init_graph 1 0 1 3 1 5 1 6 1 7 1 8 1 9 3 0 3 5 3 6 3 7 4 0 4 1 4 2 4 3 4 5 4 6 4 7 4 8 4 9 5 0 5 6 7 0 7 5 7 6 8 0 8 5 8 6 8 7 9 0 9 5 9 6 9 7 9 8 +types 13 2 24 84 208 17 30 41 147 86 17 64 25 75 +type 1 "Apple" +type 2 struct { .issue30628.hey ; .issue30628.x ; RQ ; } +type 3 "sync.RWMutex" + func (rw ) Lock () + func (rw ) RLocker () ($ret8 ) + func (rw ) RUnlock () + func (rw ) Unlock () + func (rw ) RLock () +type 4 * +type 5 "sync.Locker" +type 6 interface { Lock (); Unlock (); } +type 7 struct { .sync.w ; .sync.writerSem ; .sync.readerSem ; .sync.readerCount ; .sync.readerWait ; } +type 8 "sync.Mutex" + func (m ) Unlock () + func (m ) Lock () +type 9 * +type 10 struct { .sync.state ; .sync.sema ; } +type 11 [517 ] +type 12 struct { Count ; NumBytes ; Last ; } +checksum 199DCF6D3EE2FCF39F715B4E42B5F87F5B15D3AF -- GitLab From edf8539fad89c22a7846196ae2f8920a480c1230 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 6 Mar 2019 13:34:47 -0500 Subject: [PATCH 0321/1679] cmd/go: run the 'go build' command in TestACL in the temp directory Otherwise, when the 'cmd' module is added the test will run as if in module 'cmd'. While we're here, remove an unnecessary os.Chdir in TestAbsolutePath: we can instead set the Dir on the 'go build' command instead. Then we can run the tests in this file in parallel with everything else. Updates #30228 Change-Id: I13ecd7ec93bc1041010daec14d76bac10e0c89be Reviewed-on: https://go-review.googlesource.com/c/go/+/165744 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod TryBot-Result: Gobot Gobot --- src/cmd/go/go_windows_test.go | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/cmd/go/go_windows_test.go b/src/cmd/go/go_windows_test.go index 99af3d43dc..a8cfffea79 100644 --- a/src/cmd/go/go_windows_test.go +++ b/src/cmd/go/go_windows_test.go @@ -16,6 +16,8 @@ import ( ) func TestAbsolutePath(t *testing.T) { + t.Parallel() + tmp, err := ioutil.TempDir("", "TestAbsolutePath") if err != nil { t.Fatal(err) @@ -33,21 +35,11 @@ func TestAbsolutePath(t *testing.T) { t.Fatal(err) } - wd, err := os.Getwd() - if err != nil { - t.Fatal(err) - } - defer os.Chdir(wd) - - // Chdir so current directory and a.go reside on the same drive. - err = os.Chdir(dir) - if err != nil { - t.Fatal(err) - } - noVolume := file[len(filepath.VolumeName(file)):] wrongPath := filepath.Join(dir, noVolume) - output, err := exec.Command(testenv.GoToolPath(t), "build", noVolume).CombinedOutput() + cmd := exec.Command(testenv.GoToolPath(t), "build", noVolume) + cmd.Dir = dir + output, err := cmd.CombinedOutput() if err == nil { t.Fatal("build should fail") } @@ -79,6 +71,8 @@ func runGetACL(t *testing.T, path string) string { // has discretionary access control list (DACL) set as if the file // was created in the destination directory. func TestACL(t *testing.T) { + t.Parallel() + tmpdir, err := ioutil.TempDir("", "TestACL") if err != nil { t.Fatal(err) @@ -102,11 +96,16 @@ func TestACL(t *testing.T) { src := filepath.Join(tmpdir, "main.go") err = ioutil.WriteFile(src, []byte("package main; func main() { }\n"), 0644) + if err == nil { + err = ioutil.WriteFile(filepath.Join(tmpdir, "go.mod"), []byte("module TestACL\n"), 0644) + } if err != nil { t.Fatal(err) } + exe := filepath.Join(tmpdir, "main.exe") cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, src) + cmd.Dir = tmpdir cmd.Env = append(os.Environ(), "TMP="+newtmpdir, "TEMP="+newtmpdir, -- GitLab From 711ea1e716b0c620cd9bcdd405eccae230d6dcbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Oudompheng?= Date: Fri, 1 Mar 2019 23:12:19 +0100 Subject: [PATCH 0322/1679] cmd/cgo: simplify and fix handling of untyped constants Instead of trying to guess type of constants in the AST, which is hard, use the "var cgo%d Type = Constant" so that typechecking is left to the Go compiler. The previous code could still fail in some cases for constants imported from other modules or defined in other, non-cgo files. Fixes #30527 Change-Id: I2120cd90e90a74b9d765eeec53f6a3d2cfc1b642 Reviewed-on: https://go-review.googlesource.com/c/go/+/164897 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/testdata/issue30527.go | 14 ++++++ misc/cgo/test/testdata/issue30527/a.go | 19 ++++++++ misc/cgo/test/testdata/issue30527/b.go | 11 +++++ src/cmd/cgo/ast.go | 12 ------ src/cmd/cgo/gcc.go | 60 +++----------------------- src/cmd/cgo/main.go | 3 -- 6 files changed, 51 insertions(+), 68 deletions(-) create mode 100644 misc/cgo/test/testdata/issue30527.go create mode 100644 misc/cgo/test/testdata/issue30527/a.go create mode 100644 misc/cgo/test/testdata/issue30527/b.go diff --git a/misc/cgo/test/testdata/issue30527.go b/misc/cgo/test/testdata/issue30527.go new file mode 100644 index 0000000000..4ea7d3177a --- /dev/null +++ b/misc/cgo/test/testdata/issue30527.go @@ -0,0 +1,14 @@ +// Copyright 2019 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. + +// Issue 30527: function call rewriting casts untyped +// constants to int because of ":=" usage. + +package cgotest + +import "cgotest/issue30527" + +func issue30527G() { + issue30527.G(nil) +} diff --git a/misc/cgo/test/testdata/issue30527/a.go b/misc/cgo/test/testdata/issue30527/a.go new file mode 100644 index 0000000000..eb50147b39 --- /dev/null +++ b/misc/cgo/test/testdata/issue30527/a.go @@ -0,0 +1,19 @@ +// Copyright 2019 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 issue30527 + +import "math" + +/* +#include + +static void issue30527F(char **p, uint64_t mod, uint32_t unused) {} +*/ +import "C" + +func G(p **C.char) { + C.issue30527F(p, math.MaxUint64, 1) + C.issue30527F(p, 1<<64-1, Z) +} diff --git a/misc/cgo/test/testdata/issue30527/b.go b/misc/cgo/test/testdata/issue30527/b.go new file mode 100644 index 0000000000..87e8255bd8 --- /dev/null +++ b/misc/cgo/test/testdata/issue30527/b.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 issue30527 + +const ( + X = 1 << iota + Y + Z +) diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index 83d727a8a5..54d6bc2559 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -200,18 +200,6 @@ func (f *File) saveExprs(x interface{}, context astContext) { } case *ast.CallExpr: f.saveCall(x, context) - case *ast.GenDecl: - if x.Tok == token.CONST { - for _, spec := range x.Specs { - vs := spec.(*ast.ValueSpec) - if vs.Type == nil { - for _, name := range spec.(*ast.ValueSpec).Names { - consts[name.Name] = true - } - } - } - } - } } diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index b5cf04cf4c..11a5472786 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -897,21 +897,16 @@ func (p *Package) rewriteCall(f *File, call *Call) (string, bool) { needsUnsafe = true } - // Explicitly convert untyped constants to the - // parameter type, to avoid a type mismatch. - if p.isConst(f, arg) { - ptype := p.rewriteUnsafe(param.Go) + // Use "var x T = ..." syntax to explicitly convert untyped + // constants to the parameter type, to avoid a type mismatch. + ptype := p.rewriteUnsafe(param.Go) + + if !p.needsPointerCheck(f, param.Go, args[i]) { if ptype != param.Go { needsUnsafe = true } - arg = &ast.CallExpr{ - Fun: ptype, - Args: []ast.Expr{arg}, - } - } - - if !p.needsPointerCheck(f, param.Go, args[i]) { - fmt.Fprintf(&sb, "_cgo%d := %s; ", i, gofmtPos(arg, origArg.Pos())) + fmt.Fprintf(&sb, "var _cgo%d %s = %s; ", i, + gofmtLine(ptype), gofmtPos(arg, origArg.Pos())) continue } @@ -1254,47 +1249,6 @@ func (p *Package) isType(t ast.Expr) bool { return false } -// isConst reports whether x is an untyped constant expression. -func (p *Package) isConst(f *File, x ast.Expr) bool { - switch x := x.(type) { - case *ast.BasicLit: - return true - case *ast.SelectorExpr: - id, ok := x.X.(*ast.Ident) - if !ok || id.Name != "C" { - return false - } - name := f.Name[x.Sel.Name] - if name != nil { - return name.IsConst() - } - case *ast.Ident: - return x.Name == "nil" || - strings.HasPrefix(x.Name, "_Ciconst_") || - strings.HasPrefix(x.Name, "_Cfconst_") || - strings.HasPrefix(x.Name, "_Csconst_") || - consts[x.Name] - case *ast.UnaryExpr: - return p.isConst(f, x.X) - case *ast.BinaryExpr: - return p.isConst(f, x.X) && p.isConst(f, x.Y) - case *ast.ParenExpr: - return p.isConst(f, x.X) - case *ast.CallExpr: - // Calling the builtin function complex on two untyped - // constants returns an untyped constant. - // TODO: It's possible to construct a case that will - // erroneously succeed if there is a local function - // named "complex", shadowing the builtin, that returns - // a numeric type. I can't think of any cases that will - // erroneously fail. - if id, ok := x.Fun.(*ast.Ident); ok && id.Name == "complex" && len(x.Args) == 2 { - return p.isConst(f, x.Args[0]) && p.isConst(f, x.Args[1]) - } - } - return false -} - // isVariable reports whether x is a variable, possibly with field references. func (p *Package) isVariable(x ast.Expr) bool { switch x := x.(type) { diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index 80435b0634..11aeee4aab 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -71,9 +71,6 @@ type File struct { Edit *edit.Buffer } -// Untyped constants in the current package. -var consts = make(map[string]bool) - func (f *File) offset(p token.Pos) int { return fset.Position(p).Offset } -- GitLab From c5babcc4852397b49ec43778d517ab59f5b10ef7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 26 Feb 2019 15:52:23 -0800 Subject: [PATCH 0323/1679] runtime: align first persistentalloc chunk as requested Change-Id: Ib391e019b1a7513d234fb1c8ff802efe8fa7c950 Reviewed-on: https://go-review.googlesource.com/c/go/+/163859 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/malloc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index 6695372a3f..be3a9bd26f 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -1248,7 +1248,7 @@ func persistentalloc1(size, align uintptr, sysStat *uint64) *notInHeap { break } } - persistent.off = sys.PtrSize + persistent.off = round(sys.PtrSize, align) } p := persistent.base.add(persistent.off) persistent.off += size -- GitLab From 1a6c0c6baf658fd64ecbd87a6d94aa75f4ae23b6 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Mon, 4 Mar 2019 09:07:29 -0500 Subject: [PATCH 0324/1679] cmd/go: document GoVersion field in Module struct The 'go version' statement was added during Go 1.11 development in CL 125940. That CL added the GoVersion field to modinfo.ModulePublic struct, but did not document it in cmd/go documentation. This was consistent with the CL description, which stated "We aren't planning to use this or advertise it much yet". CL 147281, applied during Go 1.12 development, was a change to start adding the 'go version' statement when initializing go.mod. The 'go version' statement is now being used, and it has been documented in the Go 1.12 release notes at https://golang.org/doc/go1.12#modules. It's now due time to documement the GoVersion field in cmd/go as well. Keep the Error field bottom-most, both because it makes sense not to place it in the middle of other fields, and for consistency with the field order in struct Package, where the Error information is located at the very bottom. Regenerate alldocs.go by running mkalldocs.sh. Updates #28221 Updates #23969 Change-Id: Iaf43a0da4f6a2489d861092a1d4e002a532952cb Reviewed-on: https://go-review.googlesource.com/c/go/+/164878 Run-TryBot: Dmitri Shuralyov TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 23 ++++++++++++----------- src/cmd/go/internal/list/list.go | 23 ++++++++++++----------- src/cmd/go/internal/modinfo/info.go | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 6445a6b5e8..6ceeef0f47 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -790,17 +790,18 @@ // applied to a Go struct, but now a Module struct: // // type Module struct { -// Path string // module path -// Version string // module version -// Versions []string // available module versions (with -versions) -// Replace *Module // replaced by this module -// Time *time.Time // time version was created -// Update *Module // available update, if any (with -u) -// Main bool // is this the main module? -// Indirect bool // is this module only an indirect dependency of main module? -// Dir string // directory holding files for this module, if any -// GoMod string // path to go.mod file for this module, if any -// Error *ModuleError // error loading module +// Path string // module path +// Version string // module version +// Versions []string // available module versions (with -versions) +// Replace *Module // replaced by this module +// Time *time.Time // time version was created +// Update *Module // available update, if any (with -u) +// Main bool // is this the main module? +// Indirect bool // is this module only an indirect dependency of main module? +// Dir string // directory holding files for this module, if any +// GoMod string // path to go.mod file for this module, if any +// GoVersion string // go version used in module +// Error *ModuleError // error loading module // } // // type ModuleError struct { diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index 0c576b6128..e482c393b6 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -202,17 +202,18 @@ When listing modules, the -f flag still specifies a format template applied to a Go struct, but now a Module struct: type Module struct { - Path string // module path - Version string // module version - Versions []string // available module versions (with -versions) - Replace *Module // replaced by this module - Time *time.Time // time version was created - Update *Module // available update, if any (with -u) - Main bool // is this the main module? - Indirect bool // is this module only an indirect dependency of main module? - Dir string // directory holding files for this module, if any - GoMod string // path to go.mod file for this module, if any - Error *ModuleError // error loading module + Path string // module path + Version string // module version + Versions []string // available module versions (with -versions) + Replace *Module // replaced by this module + Time *time.Time // time version was created + Update *Module // available update, if any (with -u) + Main bool // is this the main module? + Indirect bool // is this module only an indirect dependency of main module? + Dir string // directory holding files for this module, if any + GoMod string // path to go.mod file for this module, if any + GoVersion string // go version used in module + Error *ModuleError // error loading module } type ModuleError struct { diff --git a/src/cmd/go/internal/modinfo/info.go b/src/cmd/go/internal/modinfo/info.go index 7341ce44d2..07248d1a61 100644 --- a/src/cmd/go/internal/modinfo/info.go +++ b/src/cmd/go/internal/modinfo/info.go @@ -20,8 +20,8 @@ type ModulePublic struct { Indirect bool `json:",omitempty"` // module is only indirectly needed by main module Dir string `json:",omitempty"` // directory holding local copy of files, if any GoMod string `json:",omitempty"` // path to go.mod file describing module, if any - Error *ModuleError `json:",omitempty"` // error loading module GoVersion string `json:",omitempty"` // go version used in module + Error *ModuleError `json:",omitempty"` // error loading module } type ModuleError struct { -- GitLab From 4d8a37a6d98e9524300ce669affa3f820965bc41 Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Tue, 5 Mar 2019 09:58:58 +0100 Subject: [PATCH 0325/1679] cmd/link: fix contents of debug_pubnames/debug_pubtypes The contents of debug_pubnames and debug_pubtypes have been wrong since Go 1.12. CL golang.org/cl/137235 moved global variables DIE to their respective compilation unit, unfortunately writepub can't emit correct sections for anything but the first compilation unit. This commit moves the code generating debug_pubnames and debug_pubtypes inside writeinfo and fixes it. Gets rid of a number of unnecessary relocations as well as a hack that writeinfo used to communicate to writepub the size of each compilation unit. Fixes #30573 Change-Id: Ibdaa80c02746ae81661c2cfe1d218092c5ae9236 Reviewed-on: https://go-review.googlesource.com/c/go/+/165337 Run-TryBot: Alessandro Arzilli TryBot-Result: Gobot Gobot Reviewed-by: Heschi Kreinick --- src/cmd/link/internal/ld/dwarf.go | 137 +++++++++++++++++------------- 1 file changed, 80 insertions(+), 57 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 0b17985da5..995a7e77b9 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -264,15 +264,6 @@ func newrefattr(die *dwarf.DWDie, attr uint16, ref *sym.Symbol) *dwarf.DWAttr { return newattr(die, attr, dwarf.DW_CLS_REFERENCE, 0, ref) } -func putdies(linkctxt *Link, ctxt dwarf.Context, syms []*sym.Symbol, die *dwarf.DWDie) []*sym.Symbol { - for ; die != nil; die = die.Link { - syms = putdie(linkctxt, ctxt, syms, die) - } - syms[len(syms)-1].AddUint8(0) - - return syms -} - func dtolsym(s dwarf.Sym) *sym.Symbol { if s == nil { return nil @@ -294,7 +285,10 @@ func putdie(linkctxt *Link, ctxt dwarf.Context, syms []*sym.Symbol, die *dwarf.D dwarf.Uleb128put(ctxt, s, int64(die.Abbrev)) dwarf.PutAttrs(ctxt, s, die.Abbrev, die.Attr) if dwarf.HasChildren(die) { - return putdies(linkctxt, ctxt, syms, die.Child) + for die := die.Child; die != nil; die = die.Link { + syms = putdie(linkctxt, ctxt, syms, die) + } + syms[len(syms)-1].AddUint8(0) } return syms } @@ -1517,7 +1511,7 @@ const ( COMPUNITHEADERSIZE = 4 + 2 + 4 + 1 ) -func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*compilationUnit, abbrevsym *sym.Symbol) []*sym.Symbol { +func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*compilationUnit, abbrevsym *sym.Symbol, pubNames, pubTypes *pubWriter) []*sym.Symbol { infosec := ctxt.Syms.Lookup(".debug_info", 0) infosec.Type = sym.SDWARFINFO infosec.Attr |= sym.AttrReachable @@ -1533,6 +1527,9 @@ func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*compilationUnit, abbrevs continue } + pubNames.beginCompUnit(compunit) + pubTypes.beginCompUnit(compunit) + // Write .debug_info Compilation Unit Header (sec 7.5.1) // Fields marked with (*) must be changed for 64-bit dwarf // This must match COMPUNITHEADERSIZE above. @@ -1553,11 +1550,32 @@ func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*compilationUnit, abbrevs if u.consts != nil { cu = append(cu, u.consts) } - cu = putdies(ctxt, dwarfctxt, cu, compunit.Child) var cusize int64 for _, child := range cu { cusize += child.Size } + + for die := compunit.Child; die != nil; die = die.Link { + l := len(cu) + lastSymSz := cu[l-1].Size + cu = putdie(ctxt, dwarfctxt, cu, die) + if ispubname(die) { + pubNames.add(die, cusize) + } + if ispubtype(die) { + pubTypes.add(die, cusize) + } + if lastSymSz != cu[l-1].Size { + // putdie will sometimes append directly to the last symbol of the list + cusize = cusize - lastSymSz + cu[l-1].Size + } + for _, child := range cu[l:] { + cusize += child.Size + } + } + cu[len(cu)-1].AddUint8(0) // closes compilation unit DIE + cusize++ + // Save size for AIX symbol table. if ctxt.HeadType == objabi.Haix { saveDwsectCUSize(".debug_info", getPkgFromCUSym(s), uint64(cusize)) @@ -1569,9 +1587,8 @@ func writeinfo(ctxt *Link, syms []*sym.Symbol, units []*compilationUnit, abbrevs cusize -= 4 // exclude the length field. s.SetUint32(ctxt.Arch, 0, uint32(cusize)) } - // Leave a breadcrumb for writepub. This does not - // appear in the DWARF output. - newattr(compunit, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, cusize, 0) + pubNames.endCompUnit(compunit, uint32(cusize)+4) + pubTypes.endCompUnit(compunit, uint32(cusize)+4) syms = append(syms, cu...) } return syms @@ -1595,52 +1612,57 @@ func ispubtype(die *dwarf.DWDie) bool { return die.Abbrev >= dwarf.DW_ABRV_NULLTYPE } -func writepub(ctxt *Link, sname string, ispub func(*dwarf.DWDie) bool, syms []*sym.Symbol) []*sym.Symbol { +type pubWriter struct { + ctxt *Link + s *sym.Symbol + sname string + + sectionstart int64 + culengthOff int64 +} + +func newPubWriter(ctxt *Link, sname string) *pubWriter { s := ctxt.Syms.Lookup(sname, 0) s.Type = sym.SDWARFSECT - syms = append(syms, s) - - for _, u := range ctxt.compUnits { - if len(u.lib.Textp) == 0 && u.dwinfo.Child == nil { - continue - } - compunit := u.dwinfo - sectionstart := s.Size - culength := uint32(getattr(compunit, dwarf.DW_AT_byte_size).Value) + 4 + return &pubWriter{ctxt: ctxt, s: s, sname: sname} +} - // Write .debug_pubnames/types Header (sec 6.1.1) - createUnitLength(ctxt, s, 0) // unit_length (*), will be filled in later. - s.AddUint16(ctxt.Arch, 2) // dwarf version (appendix F) - addDwarfAddrRef(ctxt, s, dtolsym(compunit.Sym)) // debug_info_offset (of the Comp unit Header) - addDwarfAddrField(ctxt, s, uint64(culength)) // debug_info_length +func (pw *pubWriter) beginCompUnit(compunit *dwarf.DWDie) { + pw.sectionstart = pw.s.Size - for die := compunit.Child; die != nil; die = die.Link { - if !ispub(die) { - continue - } - dwa := getattr(die, dwarf.DW_AT_name) - name := dwa.Data.(string) - if die.Sym == nil { - fmt.Println("Missing sym for ", name) - } - addDwarfAddrRef(ctxt, s, dtolsym(die.Sym)) - Addstring(s, name) - } + // Write .debug_pubnames/types Header (sec 6.1.1) + createUnitLength(pw.ctxt, pw.s, 0) // unit_length (*), will be filled in later. + pw.s.AddUint16(pw.ctxt.Arch, 2) // dwarf version (appendix F) + addDwarfAddrRef(pw.ctxt, pw.s, dtolsym(compunit.Sym)) // debug_info_offset (of the Comp unit Header) + pw.culengthOff = pw.s.Size + addDwarfAddrField(pw.ctxt, pw.s, uint64(0)) // debug_info_length, will be filled in later. - addDwarfAddrField(ctxt, s, 0) // Null offset +} - // On AIX, save the current size of this compilation unit. - if ctxt.HeadType == objabi.Haix { - saveDwsectCUSize(sname, getPkgFromCUSym(dtolsym(compunit.Sym)), uint64(s.Size-sectionstart)) - } - if isDwarf64(ctxt) { - s.SetUint(ctxt.Arch, sectionstart+4, uint64(s.Size-sectionstart)-12) // exclude the length field. - } else { - s.SetUint32(ctxt.Arch, sectionstart, uint32(s.Size-sectionstart)-4) // exclude the length field. - } +func (pw *pubWriter) add(die *dwarf.DWDie, offset int64) { + dwa := getattr(die, dwarf.DW_AT_name) + name := dwa.Data.(string) + if die.Sym == nil { + fmt.Println("Missing sym for ", name) } + addDwarfAddrField(pw.ctxt, pw.s, uint64(offset)) + Addstring(pw.s, name) +} - return syms +func (pw *pubWriter) endCompUnit(compunit *dwarf.DWDie, culength uint32) { + addDwarfAddrField(pw.ctxt, pw.s, 0) // Null offset + + // On AIX, save the current size of this compilation unit. + if pw.ctxt.HeadType == objabi.Haix { + saveDwsectCUSize(pw.sname, getPkgFromCUSym(dtolsym(compunit.Sym)), uint64(pw.s.Size-pw.sectionstart)) + } + if isDwarf64(pw.ctxt) { + pw.s.SetUint(pw.ctxt.Arch, pw.sectionstart+4, uint64(pw.s.Size-pw.sectionstart)-12) // exclude the length field. + pw.s.SetUint(pw.ctxt.Arch, pw.culengthOff, uint64(culength)) + } else { + pw.s.SetUint32(pw.ctxt.Arch, pw.sectionstart, uint32(pw.s.Size-pw.sectionstart)-4) // exclude the length field. + pw.s.SetUint32(pw.ctxt.Arch, pw.culengthOff, culength) + } } func writegdbscript(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { @@ -1878,13 +1900,14 @@ func dwarfGenerateDebugSyms(ctxt *Link) { reversetree(&dwtypes.Child) movetomodule(ctxt, &dwtypes) + pubNames := newPubWriter(ctxt, ".debug_pubnames") + pubTypes := newPubWriter(ctxt, ".debug_pubtypes") + // Need to reorder symbols so sym.SDWARFINFO is after all sym.SDWARFSECT - // (but we need to generate dies before writepub) - infosyms := writeinfo(ctxt, nil, ctxt.compUnits, abbrev) + infosyms := writeinfo(ctxt, nil, ctxt.compUnits, abbrev, pubNames, pubTypes) syms = writeframes(ctxt, syms) - syms = writepub(ctxt, ".debug_pubnames", ispubname, syms) - syms = writepub(ctxt, ".debug_pubtypes", ispubtype, syms) + syms = append(syms, pubNames.s, pubTypes.s) syms = writegdbscript(ctxt, syms) // Now we're done writing SDWARFSECT symbols, so we can write // other SDWARF* symbols. -- GitLab From e269f4ce01c458b53975fe666261b4be13160773 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Wed, 27 Feb 2019 14:10:07 -0500 Subject: [PATCH 0326/1679] go/constant: add Val accessor and Make constructor to handle varied types This change adds a Val accessor that returns the underlying type for a given constant.Value. This change also adds a Make constructor that builds a constant.Value given a value of a specific type. Fixes #29820 Change-Id: I4fc3f5221408e24af42ffecd21ce4099ee75b47a Reviewed-on: https://go-review.googlesource.com/c/go/+/164538 Reviewed-by: Robert Griesemer --- src/go/constant/example_test.go | 22 ++++++++++++ src/go/constant/value.go | 62 +++++++++++++++++++++++++++++++++ src/go/constant/value_test.go | 17 +++++++++ 3 files changed, 101 insertions(+) diff --git a/src/go/constant/example_test.go b/src/go/constant/example_test.go index ed20d6bf09..6443ee6db8 100644 --- a/src/go/constant/example_test.go +++ b/src/go/constant/example_test.go @@ -8,6 +8,7 @@ import ( "fmt" "go/constant" "go/token" + "math" "sort" ) @@ -156,3 +157,24 @@ func ExampleSign() { // 1 (0 + 1i) // 1 (1 + 1i) } + +func ExampleVal() { + maxint := constant.MakeInt64(math.MaxInt64) + fmt.Printf("%v\n", constant.Val(maxint)) + + e := constant.MakeFloat64(math.E) + fmt.Printf("%v\n", constant.Val(e)) + + b := constant.MakeBool(true) + fmt.Printf("%v\n", constant.Val(b)) + + b = constant.Make(false) + fmt.Printf("%v\n", constant.Val(b)) + + // Output: + // + // 9223372036854775807 + // 6121026514868073/2251799813685248 + // true + // false +} diff --git a/src/go/constant/value.go b/src/go/constant/value.go index f7efa95404..cd77b376d1 100644 --- a/src/go/constant/value.go +++ b/src/go/constant/value.go @@ -562,6 +562,68 @@ func Float64Val(x Value) (float64, bool) { } } +// Val returns the underlying value for a given constant. Since it returns an +// interface, it is up to the caller to type assert the result to the expected +// type. The possible dynamic return types are: +// +// x Kind type of result +// ----------------------------------------- +// Bool bool +// String string +// Int int64 or *big.Int +// Float *big.Float or *big.Rat +// everything else nil +// +func Val(x Value) interface{} { + switch x := x.(type) { + case boolVal: + return bool(x) + case *stringVal: + return x.string() + case int64Val: + return int64(x) + case intVal: + return x.val + case ratVal: + return x.val + case floatVal: + return x.val + default: + return nil + } +} + +// Make returns the Value for x. +// +// type of x result Kind +// ---------------------------- +// bool Bool +// string String +// int64 Int +// *big.Int Int +// *big.Float Float +// *big.Rat Float +// anything else Unknown +// +func Make(x interface{}) Value { + switch x := x.(type) { + case bool: + return boolVal(x) + case string: + return &stringVal{s: x} + case int64: + return int64Val(x) + case *big.Int: + return intVal{x} + case *big.Rat: + return ratVal{x} + case *big.Float: + return floatVal{x} + default: + return unknownVal{} + } +} + // BitLen returns the number of bits required to represent // the absolute value x in binary representation; x must be an Int or an Unknown. // If x is Unknown, the result is 0. diff --git a/src/go/constant/value_test.go b/src/go/constant/value_test.go index 560712a8f5..a319039fc6 100644 --- a/src/go/constant/value_test.go +++ b/src/go/constant/value_test.go @@ -7,6 +7,7 @@ package constant import ( "fmt" "go/token" + "math/big" "strings" "testing" ) @@ -596,6 +597,22 @@ func TestUnknown(t *testing.T) { } } +func TestMake(t *testing.T) { + for _, want := range []interface{}{ + false, + "hello", + int64(1), + big.NewInt(10), + big.NewFloat(2.0), + big.NewRat(1, 3), + } { + got := Val(Make(want)) + if got != want { + t.Errorf("got %v; want %v", got, want) + } + } +} + func BenchmarkStringAdd(b *testing.B) { for size := 1; size <= 65536; size *= 4 { b.Run(fmt.Sprint(size), func(b *testing.B) { -- GitLab From 9dc3b8b722ec93a3cd16742764a29cb3f908edbe Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 6 Mar 2019 14:45:47 -0800 Subject: [PATCH 0327/1679] reflect: fix more issues with StructOf GC programs First the insidious bug: var n uintptr for n := elemPtrs; n > 120; n -= 120 { prog = append(prog, 120) prog = append(prog, mask[:15]...) mask = mask[15:] } prog = append(prog, byte(n)) prog = append(prog, mask[:(n+7)/8]...) The := breaks this code, because the n after the loop is always 0! We also do need to handle field padding correctly. In particular the old padding code doesn't correctly handle fields that are not a multiple of a pointer in size. Fixes #30606. Change-Id: Ifcab9494dc25c20116753c5d7e0145d6c2053ed8 Reviewed-on: https://go-review.googlesource.com/c/go/+/165860 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/reflect/type.go | 35 +++++++++++++----------- test/fixedbugs/issue30606b.go | 51 +++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 test/fixedbugs/issue30606b.go diff --git a/src/reflect/type.go b/src/reflect/type.go index 531417ea93..5c7ed243d5 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2674,43 +2674,48 @@ func StructOf(fields []StructField) Type { } } prog := []byte{0, 0, 0, 0} // will be length of prog + var off uintptr for i, ft := range fs { if i > lastPtrField { // gcprog should not include anything for any field after // the last field that contains pointer data break } - // FIXME(sbinet) handle padding, fields smaller than a word + if !ft.typ.pointers() { + // Ignore pointerless fields. + continue + } + // Pad to start of this field with zeros. + if ft.offset() > off { + n := (ft.offset() - off) / ptrSize + prog = append(prog, 0x01, 0x00) // emit a 0 bit + if n > 1 { + prog = append(prog, 0x81) // repeat previous bit + prog = appendVarint(prog, n-1) // n-1 times + } + off = ft.offset() + } + elemGC := (*[1 << 30]byte)(unsafe.Pointer(ft.typ.gcdata))[:] elemPtrs := ft.typ.ptrdata / ptrSize - switch { - case ft.typ.kind&kindGCProg == 0 && ft.typ.ptrdata != 0: + if ft.typ.kind&kindGCProg == 0 { // Element is small with pointer mask; use as literal bits. mask := elemGC // Emit 120-bit chunks of full bytes (max is 127 but we avoid using partial bytes). var n uintptr - for n := elemPtrs; n > 120; n -= 120 { + for n = elemPtrs; n > 120; n -= 120 { prog = append(prog, 120) prog = append(prog, mask[:15]...) mask = mask[15:] } prog = append(prog, byte(n)) prog = append(prog, mask[:(n+7)/8]...) - case ft.typ.kind&kindGCProg != 0: + } else { // Element has GC program; emit one element. elemProg := elemGC[4 : 4+*(*uint32)(unsafe.Pointer(&elemGC[0]))-1] prog = append(prog, elemProg...) } - // Pad from ptrdata to size. - elemWords := ft.typ.size / ptrSize - if elemPtrs < elemWords { - // Emit literal 0 bit, then repeat as needed. - prog = append(prog, 0x01, 0x00) - if elemPtrs+1 < elemWords { - prog = append(prog, 0x81) - prog = appendVarint(prog, elemWords-elemPtrs-1) - } - } + off += ft.typ.ptrdata } prog = append(prog, 0) *(*uint32)(unsafe.Pointer(&prog[0])) = uint32(len(prog) - 4) diff --git a/test/fixedbugs/issue30606b.go b/test/fixedbugs/issue30606b.go new file mode 100644 index 0000000000..2ce2804ad8 --- /dev/null +++ b/test/fixedbugs/issue30606b.go @@ -0,0 +1,51 @@ +// run + +// Copyright 2019 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 main + +import "reflect" + +func main() {} + +func typ(x interface{}) reflect.Type { return reflect.ValueOf(x).Type() } + +var byteType = typ((byte)(0)) +var ptrType = typ((*byte)(nil)) + +// Arrays of pointers. There are two size thresholds. +// Bit masks are chunked in groups of 120 pointers. +// Array types with >16384 pointers have a GC program instead of a bitmask. +var smallPtrType = reflect.ArrayOf(100, ptrType) +var mediumPtrType = reflect.ArrayOf(1000, ptrType) +var bigPtrType = reflect.ArrayOf(16385, ptrType) + +var x0 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: byteType}, + {Name: "F2", Type: bigPtrType}, +})) +var x1 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: smallPtrType}, + {Name: "F2", Type: bigPtrType}, +})) +var x2 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: mediumPtrType}, + {Name: "F2", Type: bigPtrType}, +})) +var x3 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: ptrType}, + {Name: "F2", Type: byteType}, + {Name: "F3", Type: bigPtrType}, +})) +var x4 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: ptrType}, + {Name: "F2", Type: smallPtrType}, + {Name: "F3", Type: bigPtrType}, +})) +var x5 = reflect.New(reflect.StructOf([]reflect.StructField{ + {Name: "F1", Type: ptrType}, + {Name: "F2", Type: mediumPtrType}, + {Name: "F3", Type: bigPtrType}, +})) -- GitLab From a6436a5655f56bb904871fece7db43a3ad3bf415 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 6 Mar 2019 17:31:04 -0800 Subject: [PATCH 0328/1679] cmd/cgo: use explicit type for arg with bad pointer typedef Fixes #30646 Change-Id: I5b7e986b0588e87b9781cce01445e3c55c06b6fc Reviewed-on: https://go-review.googlesource.com/c/go/+/165897 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/cgo/gcc.go | 6 +++++- src/cmd/cgo/main.go | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 11a5472786..915ad66111 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -901,7 +901,7 @@ func (p *Package) rewriteCall(f *File, call *Call) (string, bool) { // constants to the parameter type, to avoid a type mismatch. ptype := p.rewriteUnsafe(param.Go) - if !p.needsPointerCheck(f, param.Go, args[i]) { + if !p.needsPointerCheck(f, param.Go, args[i]) || param.BadPointer { if ptype != param.Go { needsUnsafe = true } @@ -2465,13 +2465,16 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { // Treat this typedef as a uintptr. s := *sub s.Go = c.uintptr + s.BadPointer = true sub = &s // Make sure we update any previously computed type. if oldType := typedef[name.Name]; oldType != nil { oldType.Go = sub.Go + oldType.BadPointer = true } } t.Go = name + t.BadPointer = sub.BadPointer if unionWithPointer[sub.Go] { unionWithPointer[t.Go] = true } @@ -2481,6 +2484,7 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { if oldType == nil { tt := *t tt.Go = sub.Go + tt.BadPointer = sub.BadPointer typedef[name.Name] = &tt } diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index 11aeee4aab..5a7bb3f87b 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -151,6 +151,7 @@ type Type struct { Go ast.Expr EnumValues map[string]int64 Typedef string + BadPointer bool } // A FuncType collects information about a function type in both the C and Go worlds. -- GitLab From fe954ea1e28f8ece95ce00d51312ac095071b2d8 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 26 Feb 2019 00:16:07 -0500 Subject: [PATCH 0329/1679] cmd/go: add notary simulation and GONOVERIFY support As an experiment to better understand the impact of having an authoritative source of truth for module hashes before the real notary is available, this CL adds the basic notary authorization checks using a partial whitelist of known go.sum values for popular modules. In addition to the temporary whitelist, this CL adds code implementing $GONOVERIFY, a new 'go help modules-auth', and clearer error messages for verification mismatches. See #25530 for notary proposal. Filed #30601 to remove whitelist when notary lands. Change-Id: Ibcb6ac39c5e60455edf003d8c20af6932aeb7e88 Reviewed-on: https://go-review.googlesource.com/c/go/+/165380 Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 98 +- src/cmd/go/internal/modfetch/fetch.go | 163 +- src/cmd/go/internal/modfetch/notary.go | 156 + src/cmd/go/internal/modfetch/notary_test.go | 47 + src/cmd/go/internal/modfetch/pin.go | 3487 +++++++++++++++++ src/cmd/go/internal/modload/help.go | 16 +- src/cmd/go/main.go | 1 + src/cmd/go/script_test.go | 1 + .../go/testdata/mod/rsc.io_badsum_v1.0.0.txt | 14 + .../go/testdata/mod/rsc.io_badsum_v1.0.1.txt | 14 + src/cmd/go/testdata/script/mod_notary.txt | 73 + 11 files changed, 4038 insertions(+), 32 deletions(-) create mode 100644 src/cmd/go/internal/modfetch/notary.go create mode 100644 src/cmd/go/internal/modfetch/notary_test.go create mode 100644 src/cmd/go/internal/modfetch/pin.go create mode 100644 src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt create mode 100644 src/cmd/go/testdata/script/mod_notary.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 6ceeef0f47..33f6126ada 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -48,6 +48,7 @@ // modules modules, module versions, and more // module-get module-aware go get // packages package lists and patterns +// module-auth module authentication using go.sum // testflag testing flags // testfunc testing functions // @@ -2414,19 +2415,9 @@ // // Module downloading and verification // -// The go command maintains, in the main module's root directory alongside -// go.mod, a file named go.sum containing the expected cryptographic checksums -// of the content of specific module versions. Each time a dependency is -// used, its checksum is added to go.sum if missing or else required to match -// the existing entry in go.sum. -// -// The go command maintains a cache of downloaded packages and computes -// and records the cryptographic checksum of each package at download time. -// In normal operation, the go command checks these pre-computed checksums -// against the main module's go.sum file, instead of recomputing them on -// each command invocation. The 'go mod verify' command checks that -// the cached copies of module downloads still match both their recorded -// checksums and the entries in go.sum. +// The go command checks downloads against known checksums, +// to detect unexpected changes in the content of any specific module +// version from one day to the next. See 'go help module-auth' for details. // // The go command can fetch modules from a proxy instead of connecting // to source control systems directly, according to the setting of the GOPROXY @@ -2643,6 +2634,87 @@ // by the go tool, as are directories named "testdata". // // +// Module authentication using go.sum +// +// The go command tries to authenticate every downloaded module, +// checking that the bits downloaded for a specific module version today +// match bits downloaded yesterday. This ensures repeatable builds +// and detects introduction of unexpected changes, malicious or not. +// +// In each module's root, alongside go.mod, the go command maintains +// a file named go.sum containing the cryptographic checksums of the +// module's dependencies. +// +// The form of each line in go.sum is three fields: +// +// [/go.mod] +// +// Each known module version results in two lines in the go.sum file. +// The first line gives the hash of the module version's file tree. +// The second line appends "/go.mod" to the version and gives the hash +// of only the module version's (possibly synthesized) go.mod file. +// The go.mod-only hash allows downloading and authenticating a +// module version's go.mod file, which is needed to compute the +// dependency graph, without also downloading all the module's source code. +// +// The hash begins with an algorithm prefix of the form "h:". +// The only defined algorithm prefix is "h1:", which uses SHA-256. +// +// Module authentication failures +// +// The go command maintains a cache of downloaded packages and computes +// and records the cryptographic checksum of each package at download time. +// In normal operation, the go command checks the main module's go.sum file +// against these precomputed checksums instead of recomputing them on +// each command invocation. The 'go mod verify' command checks that +// the cached copies of module downloads still match both their recorded +// checksums and the entries in go.sum. +// +// In day-to-day development, the checksum of a given module version +// should never change. Each time a dependency is used by a given main +// module, the go command checks its local cached copy, freshly +// downloaded or not, against the main module's go.sum. If the checksums +// don't match, the go command reports the mismatch as a security error +// and refuses to run the build. When this happens, proceed with caution: +// code changing unexpectedly means today's build will not match +// yesterday's, and the unexpected change may not be beneficial. +// +// If the go command reports a mismatch in go.sum, the downloaded code +// for the reported module version does not match the one used in a +// previous build of the main module. It is important at that point +// to find out what the right checksum should be, to decide whether +// go.sum is wrong or the downloaded code is wrong. Usually go.sum is right: +// you want to use the same code you used yesterday. +// +// If a downloaded module is not yet included in go.sum and it is a publicly +// available module, the go command consults the Go notary server to fetch +// the expected go.sum lines. If the downloaded code does not match those +// lines, the go command reports the mismatch and exits. Note that the +// notary is not consulted for module versions already listed in go.sum. +// +// The GONOVERIFY environment variable is a comma-separated list of +// patterns (in the syntax of Go's path.Match) of module path prefixes +// that should not be verified using the notary. For example, +// +// GONOVERIFY=*.corp.example.com,rsc.io/private +// +// disables notary verification for modules with path prefixes matching +// either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private", +// and "rsc.io/private/quux". +// +// As a special case, if GONOVERIFY is set to "off", or if "go get" was invoked +// with the -insecure flag, the notary is never consulted, but note that this +// defeats the security provided by the notary. A better course of action is +// to set a narrower GONOVERIFY and, in the case of go.sum mismatches, +// investigate why the code downloaded code differs from what was +// downloaded yesterday. +// +// NOTE: Early in the Go 1.13 dev cycle, the notary is being simulated by +// a whitelist of known hashes for popular Go modules, to expose any +// problems arising from knowing the expected hashes. +// TODO(rsc): This note should be removed once the real notary is used instead. See #30601. +// +// // Testing flags // // The 'go test' command takes both flags that apply to 'go test' itself diff --git a/src/cmd/go/internal/modfetch/fetch.go b/src/cmd/go/internal/modfetch/fetch.go index 81a6c843ab..1d6969ea3e 100644 --- a/src/cmd/go/internal/modfetch/fetch.go +++ b/src/cmd/go/internal/modfetch/fetch.go @@ -400,27 +400,64 @@ func checkOneSum(mod module.Version, h string) { defer goSum.mu.Unlock() if initGoSum() { checkOneSumLocked(mod, h) + } else if useNotary(mod) { + checkNotarySum(mod, h) } } func checkOneSumLocked(mod module.Version, h string) { goSum.checked[modSum{mod, h}] = true - for _, vh := range goSum.m[mod] { - if h == vh { - return + checkGoSum := func() bool { + for _, vh := range goSum.m[mod] { + if h == vh { + return true + } + if strings.HasPrefix(vh, "h1:") { + base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\tgo.sum: %v"+goSumMismatch, mod.Path, mod.Version, h, vh) + } } - if strings.HasPrefix(vh, "h1:") { - base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\tgo.sum: %v", mod.Path, mod.Version, h, vh) + return false + } + + if checkGoSum() { + return + } + + if useNotary(mod) { + goSum.mu.Unlock() + checkNotarySum(mod, h) // dies if h is wrong + goSum.mu.Lock() + + // Because we dropped the lock, a racing goroutine + // may have already added this entry to go.sum. + // Check again. + if checkGoSum() { + return } } + if len(goSum.m[mod]) > 0 { - fmt.Fprintf(os.Stderr, "warning: verifying %s@%s: unknown hashes in go.sum: %v; adding %v", mod.Path, mod.Version, strings.Join(goSum.m[mod], ", "), h) + fmt.Fprintf(os.Stderr, "warning: verifying %s@%s: unknown hashes in go.sum: %v; adding %v"+hashVersionMismatch, mod.Path, mod.Version, strings.Join(goSum.m[mod], ", "), h) } goSum.m[mod] = append(goSum.m[mod], h) goSum.dirty = true } +// checkNotarySum checks the mod, h pair against the Go notary. +// It calls base.Fatalf if the hash is to be rejected. +func checkNotarySum(mod module.Version, h string) { + hashes := notaryHashes(mod) + for _, vh := range hashes { + if h == vh { + return + } + if strings.HasPrefix(vh, "h1:") { + base.Fatalf("verifying %s@%s: checksum mismatch\n\tdownloaded: %v\n\tnotary: %v"+notarySumMismatch, mod.Path, mod.Version, h, vh) + } + } +} + // Sum returns the checksum for the downloaded copy of the given module, // if present in the download cache. func Sum(mod module.Version) string { @@ -539,3 +576,117 @@ func TrimGoSum(keep map[module.Version]bool) { } } } + +const goSumMismatch = ` + +SECURITY ERROR +This download does NOT match an earlier download recorded in go.sum. +The bits may have been replaced on the origin server, or an attacker may +have intercepted the download attempt. + +For more information, see 'go help module-auth'. +` + +const notarySumMismatch = ` + +SECURITY ERROR +This download does NOT match the expected download known to the notary. +The bits may have been replaced on the origin server, or an attacker may +have intercepted the download attempt. + +For more information, see 'go help module-auth'. +` + +const hashVersionMismatch = ` + +SECURITY WARNING +This download is listed in go.sum, but using an unknown hash algorithm. +The download cannot be verified. + +For more information, see 'go help module-auth'. + +` + +var HelpSum = &base.Command{ + UsageLine: "module-auth", + Short: "module authentication using go.sum", + Long: ` +The go command tries to authenticate every downloaded module, +checking that the bits downloaded for a specific module version today +match bits downloaded yesterday. This ensures repeatable builds +and detects introduction of unexpected changes, malicious or not. + +In each module's root, alongside go.mod, the go command maintains +a file named go.sum containing the cryptographic checksums of the +module's dependencies. + +The form of each line in go.sum is three fields: + + [/go.mod] + +Each known module version results in two lines in the go.sum file. +The first line gives the hash of the module version's file tree. +The second line appends "/go.mod" to the version and gives the hash +of only the module version's (possibly synthesized) go.mod file. +The go.mod-only hash allows downloading and authenticating a +module version's go.mod file, which is needed to compute the +dependency graph, without also downloading all the module's source code. + +The hash begins with an algorithm prefix of the form "h:". +The only defined algorithm prefix is "h1:", which uses SHA-256. + +Module authentication failures + +The go command maintains a cache of downloaded packages and computes +and records the cryptographic checksum of each package at download time. +In normal operation, the go command checks the main module's go.sum file +against these precomputed checksums instead of recomputing them on +each command invocation. The 'go mod verify' command checks that +the cached copies of module downloads still match both their recorded +checksums and the entries in go.sum. + +In day-to-day development, the checksum of a given module version +should never change. Each time a dependency is used by a given main +module, the go command checks its local cached copy, freshly +downloaded or not, against the main module's go.sum. If the checksums +don't match, the go command reports the mismatch as a security error +and refuses to run the build. When this happens, proceed with caution: +code changing unexpectedly means today's build will not match +yesterday's, and the unexpected change may not be beneficial. + +If the go command reports a mismatch in go.sum, the downloaded code +for the reported module version does not match the one used in a +previous build of the main module. It is important at that point +to find out what the right checksum should be, to decide whether +go.sum is wrong or the downloaded code is wrong. Usually go.sum is right: +you want to use the same code you used yesterday. + +If a downloaded module is not yet included in go.sum and it is a publicly +available module, the go command consults the Go notary server to fetch +the expected go.sum lines. If the downloaded code does not match those +lines, the go command reports the mismatch and exits. Note that the +notary is not consulted for module versions already listed in go.sum. + +The GONOVERIFY environment variable is a comma-separated list of +patterns (in the syntax of Go's path.Match) of module path prefixes +that should not be verified using the notary. For example, + + GONOVERIFY=*.corp.example.com,rsc.io/private + +disables notary verification for modules with path prefixes matching +either pattern, including "git.corp.example.com/xyzzy", "rsc.io/private", +and "rsc.io/private/quux". + +As a special case, if GONOVERIFY is set to "off", or if "go get" was invoked +with the -insecure flag, the notary is never consulted, but note that this +defeats the security provided by the notary. A better course of action is +to set a narrower GONOVERIFY and, in the case of go.sum mismatches, +investigate why the code downloaded code differs from what was +downloaded yesterday. + +NOTE: Early in the Go 1.13 dev cycle, the notary is being simulated by +a whitelist of known hashes for popular Go modules, to expose any +problems arising from knowing the expected hashes. +TODO(rsc): This note should be removed once the real notary is used instead. See #30601. +`, +} diff --git a/src/cmd/go/internal/modfetch/notary.go b/src/cmd/go/internal/modfetch/notary.go new file mode 100644 index 0000000000..9514958817 --- /dev/null +++ b/src/cmd/go/internal/modfetch/notary.go @@ -0,0 +1,156 @@ +// Copyright 2019 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 modfetch + +import ( + "fmt" + "os" + pathpkg "path" + "strings" + + "cmd/go/internal/base" + "cmd/go/internal/get" + "cmd/go/internal/module" +) + +// notaryShouldVerify reports whether the notary should be used for path, +// given the GONOVERIFY setting. +func notaryShouldVerify(path, GONOVERIFY string) (bool, error) { + if GONOVERIFY == "off" { + return false, nil + } + for GONOVERIFY != "" { + var pattern string + i := strings.Index(GONOVERIFY, ",") + if i < 0 { + pattern, GONOVERIFY = GONOVERIFY, "" + } else { + pattern, GONOVERIFY = GONOVERIFY[:i], GONOVERIFY[i+1:] + } + if pattern == "" { + continue + } + n := strings.Count(pattern, "/") + 1 + prefix := path + for i := 0; i < len(prefix); i++ { + if prefix[i] == '/' { + n-- + if n == 0 { + prefix = prefix[:i] + break + } + } + } + if n > 1 { + continue + } + matched, err := pathpkg.Match(pattern, prefix) + if err != nil { + // Note that path.Match does not guarantee to detect + // pattern errors. It usually depends on whether the + // given text (prefix in this case) matches enough of + // the pattern to reach the error. So this will only + // trigger on malformed patterns that are "close enough" to prefix. + return false, fmt.Errorf("malformed GONOVERIFY pattern: %s", pattern) + } + if matched { + return false, nil + } + } + return true, nil +} + +// useNotary reports whether to use the notary for the given module. +func useNotary(mod module.Version) bool { + if get.Insecure { + return false + } + wantNotary, err := notaryShouldVerify(mod.Path, os.Getenv("GONOVERIFY")) + if err != nil { + base.Fatalf("%v", err) + } + + // TODO(rsc): return wantNotary. See #30601. + // + // This code must be deleted when goSumPin is deleted. + // goSumPin is only a partial notary simulation, so we don't return true from + // useNotary when we don't have an entry for that module. + // This differs from the real notary, which will be authoritative + // for everything it is asked for. When goSumPin is removed, + // this function body should end here with "return wantNotary". + + _ = goSumPin // read TODO above if goSumPin is gone + return wantNotary && notaryHashes(mod) != nil +} + +// notaryHashes fetches hashes for mod from the notary. +// The caller must have checked that useNotary(mod) is true. +func notaryHashes(mod module.Version) []string { + // For testing, hard-code this result. + if mod.Path == "rsc.io/badsum" { + switch mod.Version { + case "v1.0.0": + return []string{"h1:6/o+QJfe6mFSNuegDihphabcvR94anXQk/qq7Enr19U="} + case "v1.0.0/go.mod": + return []string{"h1:avOsLUJaHavllihBU9qCTW37z64ypkZjqZg8O16JLVY="} + case "v1.0.1": + return []string{"h1:S7G9Ikksx7htnFivDrUOv8xI0kIdAf15gLt97Gy//Zk="} + case "v1.0.1/go.mod": + return []string{"h1:avOsLUJaHavllihBU9qCTW37z64ypkZjqZg8O16JLVY="} + } + } + + // Until the notary is ready, simulate contacting the notary by + // looking in the known hash list goSumPin in pin.go. + // Entries not listed in goSumPin are treated as "not for the notary", + // but once the real notary is added, they should be treated as + // "failed to verify". + // + // TODO(rsc): Once the notary is ready, this function should be + // rewritten to use it. See #30601. + i := strings.Index(goSumPin, "\n"+mod.Path+"\n") + if i < 0 { + return nil + } + wantGoSum := false + if strings.HasSuffix(mod.Version, "/go.mod") { + wantGoSum = true + mod.Version = strings.TrimSuffix(mod.Version, "/go.mod") + } + versions := goSumPin[i+1+len(mod.Path)+1:] + var lastSum, lastGoSum string + for { + i := strings.Index(versions, "\n") + if i < 0 { + break + } + line := versions[:i] + versions = versions[i+1:] + if !strings.HasPrefix(line, " ") { + break + } + f := strings.Fields(line) + if len(f) < 3 { + break + } + if f[1] == "-" { + f[1] = lastSum + } else { + lastSum = f[1] + } + if f[2] == "-" { + f[2] = lastGoSum + } else { + lastGoSum = f[2] + } + if f[0] == mod.Version { + if wantGoSum { + return []string{f[2]} + } + return []string{f[1]} + } + } + return nil +} diff --git a/src/cmd/go/internal/modfetch/notary_test.go b/src/cmd/go/internal/modfetch/notary_test.go new file mode 100644 index 0000000000..6199ba3b7c --- /dev/null +++ b/src/cmd/go/internal/modfetch/notary_test.go @@ -0,0 +1,47 @@ +// Copyright 2019 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 modfetch + +import ( + "testing" +) + +var notaryShouldVerifyTests = []struct { + modPath string + GONOVERIFY string + result int // -1 = bad GONOVERIFY, 0 = wantNotary=false, 1 = wantNotary=true +}{ + {"anything", "off", 0}, + {"anything", "", 1}, + {"anything", ",", 1}, + {"anything", ",foo,", 1}, + {"anything", "[malformed", -1}, + {"anything", "malformed[", 1}, + {"my.corp.example.com", "*.[c]orp.*", 0}, + {"my.corp.example.com/foo", "*.c[^a]rp.*", 0}, + {"my.corp.example.com", "*.corp.*,bar.com", 0}, + {"my.corp.example.com/foo", "*.corp.*,bar.com", 0}, + {"my.corp.example.com", "bar.com,*.corp.*", 0}, + {"my.corp.example.com/foo", "bar.com,*.corp.*", 0}, + {"bar.com", "*.corp.*", 1}, + {"bar.com/foo", "*.corp.*", 1}, + {"bar.com", "*.corp.*,bar.com", 0}, + {"bar.com/foo", "*.corp.*,bar.com", 0}, + {"bar.com", "bar.com,*.corp.*", 0}, + {"bar.com/foo", "bar.com,*.corp.*", 0}, +} + +func TestNotaryShouldVerify(t *testing.T) { + for _, tt := range notaryShouldVerifyTests { + wantNotary, err := notaryShouldVerify(tt.modPath, tt.GONOVERIFY) + if wantNotary != (tt.result > 0) || (err != nil) != (tt.result < 0) { + wantErr := "nil" + if tt.result < 0 { + wantErr = "non-nil error" + } + t.Errorf("notaryShouldVerify(%q, %q) = %v, %v, want %v, %s", tt.modPath, tt.GONOVERIFY, wantNotary, err, tt.result > 0, wantErr) + } + } +} diff --git a/src/cmd/go/internal/modfetch/pin.go b/src/cmd/go/internal/modfetch/pin.go new file mode 100644 index 0000000000..e068f4f371 --- /dev/null +++ b/src/cmd/go/internal/modfetch/pin.go @@ -0,0 +1,3487 @@ +// Copyright 2019 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. + +// TODO(rsc): Delete this file once notary is available. See #30601. + +package modfetch + +var goSumPin = ` +cloud.google.com/go + v0.29.0 h1:gv/9Wwq5WPVIGaROMQg8tw4jLFFiyacODxEIrlz0wTw= h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= + v0.30.0 h1:xKvyLgk56d0nksWq49J0UyGEeUIicTl4+UBiX1NPX9g= - + v0.31.0 h1:o9K5MWWt2wk+d9jkGn2DAZ7Q9nUdnFLOpK9eIkDwONQ= - + v0.32.0 h1:DSt59WoyNcfAInilEpfvm2ugq8zvNyaHAm9MkzOwRQ4= - + v0.33.0 h1:1kNZapR5iXMPsPEca6Rqg+EN4/8/ZukNjMdwNQEllWk= - + v0.33.1 h1:fmJQWZ1w9PGkHR1YL/P7HloDvqlmKQ4Vpb7PC2e+aCk= - + v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= - + v0.35.0 h1:+ZrbIJ3Qm81r3IU2+/ueWMpAMXLF3Nwy2dF7NkBdEXk= h1:UE4juzxiHpKLbqrOrwVrKuaZvUtLA9CSnaYO+y53jxA= + v0.35.1 h1:LMe/Btq0Eijsc97JyBwMc0KMXOe0orqAMdg7/EkywN8= h1:wfjPZNvXCBYESy3fIynybskMP48KVPrjSPCnXiK7Prg= + v0.36.0 h1:+aCSj7tOo2LODWVEuZDZeGCckdt6MlSF+X/rB3wUiS8= h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40= +code.cloudfoundry.org/lager + v1.0.0 h1:ZW/aJB8upEKcCxUexFLoVjT32Iex3eWdkjw0F7wHbpE= h1:O2sS7gKP3HM2iemG+EnwvyNQK7pTSC6Foi4QiMp9sSk= + v1.1.0 h1:v0RELJ2jqTeF2DW7PNjZaaGlrXbVxJBVz3uLxdP3fuY= - + v2.0.0+incompatible h1:WZwDKDB2PLd/oL+USK4b4aEjUymIej9My2nUQ9oWEwQ= - +collectd.org + v0.1.0 h1:zWj1YPi6zkzxTsu/j1pGJgjhghXx0pO2pSefsOf4B1k= h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= + v0.2.0 h1:49s4ZrBFMn32+doAe5Y+GMFZH0L0P9Z+65roMnMmE1g= - + v0.3.0 h1:iNBHGw1VvPJxH2B6RiFWFZ+vsjo1lCdRszBeOuwGi00= - +git.apache.org/thrift.git + v0.12.0 h1:CMxsZlAmxKs+VAZMlDDL0wXciMblJcutQbEe3A9CYUM= h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +github.com/ActiveState/tail + v1.0.0 h1:awEa/oIeyIkiGmgtK/pn9UssITMOh4jcx2hcOkmZtgk= h1:8bqcJf9F0fOp1g3E3BKmY49fyWF549IlCWHQx5OTrtY= +github.com/Azure/azure-sdk-for-go + v22.1.0+incompatible h1:9DQsYsbAliwUGtAXF4i/u517yPlGKW2VLJEa3R/asck= h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= + v22.1.1+incompatible h1:Nm5K4x9E1lbBWAol0ROVwcmrc0vOC+8wyEuJAFTum4g= - + v22.2.2+incompatible h1:dnM65i68vx79S5ugocLMoJB6As2U1IXxa995LdjIQ28= - + v23.0.0+incompatible h1:eFpwpmS1ZEEOd7X3q9GTFqrXAspzirOUPtrzxnzfWBA= - + v23.1.0+incompatible h1:g0myUjVaQlg8xQ0T5ucdiw8PDxMF3UJBiLm0grc4e0E= - + v23.2.0+incompatible h1:bch1RS060vGpHpY3zvQDV4rOiRw25J1zmR/B9a76aSA= - + v24.0.0+incompatible h1:GdF0ozHojCPSZH1LPWA2+XHQ3G/mapn0G+PCIlMVZg4= - + v24.1.0+incompatible h1:P7GocB7bhkyGbRL1tCy0m9FDqb1V/dqssch3jZieUHk= - + v25.0.0+incompatible h1:kVuVjZDTvVc1bj6RWhB/08kTrEgz3xDDzZq5sWYb5d4= - + v25.1.0+incompatible h1:bA8mqsHUc9RbzHG64A6r7KnpvLFHJdxrpI75FrFln2M= - +github.com/Azure/go-autorest + v11.2.4+incompatible h1:Xh0rJxHAuwtFOaMTA3sDAZkHM+2vWyKR4UhwLo6WOfg= h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= + v11.2.5+incompatible h1:PplSl6LVDNWUb/BLfhYsUA5unZ6qULiW2KB/v2Qw8tI= - + v11.2.6+incompatible h1:YIFRvuc6ECAtClY0I91zGjnv4y8Nf+1XwwjGNsbUJ/k= - + v11.2.7+incompatible h1:DQRVSOFe2EiYoS/FZgwtjdRnHwuk+HvEXp8PEBmFH7w= - + v11.2.8+incompatible h1:Q2feRPMlcfVcqz3pF87PJzkm5lZrL+x6BDtzhODzNJM= - + v11.3.0+incompatible h1:oPIb2R8fwU91NsavCEqDYBLTUTcxckx5kIRHY7zBi/E= - + v11.3.1+incompatible h1:Pzn7+3iKqV1UAbwKarPKc4asZMJe9fQvs0csgYl6p4A= - + v11.3.2+incompatible h1:2bRmoaLvtIXW5uWpZVoIkc0C1z7c84rVGnP+3mpyCRg= - + v11.4.0+incompatible h1:z3Yr6KYqs0nhSNwqGXEBpWK977hxVqsLv2n9PVYcixY= - + v11.5.0+incompatible h1:zp9GQJhEX+EBqEYC2MEGQ+gjKFEPRAWtfwcmstS2hGk= - +github.com/BurntSushi/toml + v0.1.0 h1:o5kUUOTNGTDgVf5Cmj6EkHCBf1pZ/OUs+wdQruDOSAI= h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= + v0.2.0 h1:OthAm9ZSUx4uAmn3WbPwc06nowWrByRwBsYRhbmFjBs= - + v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY= - + v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= - +github.com/ChimeraCoder/anaconda + v1.0.0 h1:B7KZV+CE2iwbC15sh+rh5vaWs4+XJx1XC4iHvHtsZrQ= h1:TCt3MijIq3Qqo9SBtuW/rrM4x7rDfWqYWHj8T7hLcLg= + v2.0.0+incompatible h1:F0eD7CHXieZ+VLboCD5UAqCeAzJZxcr90zSCcuJopJs= - +github.com/Jeffail/gabs + v0.9.0 h1:WY/QB2yjqNneqvu5WX0bVgq0WvKFHCzqJYcfv/ZDRkY= h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= + v1.0.0 h1:yGg0yih4Q4ZSbiixE3C7a2wCXbc8scritLhs19duATw= - + v1.1.0 h1:kw5zCcl9tlJNHTDme7qbi21fDHZmXrnjMoXos3Jw/NI= - + v1.1.1 h1:V0uzR08Hj22EX8+8QMhyI9sX2hwRu+/RJhJUmnwda/E= - + v1.2.0 h1:uFhoIVTtsX7hV2RxNgWad8gMU+8OJdzFbOathJdhD3o= - +github.com/Masterminds/cookoo + v1.0.0 h1:KcHRuuRx3qy6ejolMDOCUSNSC4s690NFky8Z3lcQIgU= h1:oXuAk0dniDrcAwWZQYMWYzJnpnAZqQFcR7CkHsEIBHc= + v1.1.0 h1:gdXvuBqtCtrZKbwhRLQQCBZ+fzZvo7/fNuCoewPcLGc= - + v1.2.0 h1:3/dKnvddvxmuJgSPOWbefSIKauVdiDWfGx8sv0YnK6o= - + v1.3.0 h1:zwplWkfGEd4NxiL0iZHh5Jh1o25SUJTKWLfv2FkXh6o= - +github.com/Masterminds/glide + v0.11.0 h1:IJUPyi5o1aB9l6udviKVnR0FiQTT+MpZfFMvyOjl8fg= h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic= + v0.11.1 h1:L9cLkidcHlrJLw5AFnSzFQ+tyylhQAihJ47NclXIPqU= - + v0.12.0 h1:WYiatWlWzzeAJMvr1Js5aiH26OgOtwAhCCJDSX0eIUA= - + v0.12.1 h1:zKYH5xKi2dSc1reJhXFBVKiMpznAY3r20sVO2/zrC0A= - + v0.12.2 h1:szgrhFbKtri+N+c/xfN4JbKYPG3mKTKElg3CWXS8Mjs= - + v0.12.3 h1:QkcpAwXPCoYq9a9C3U6UtivvYz/RXSvUY/Ob+ikKOBQ= - + v0.13.0 h1:X5U6GJXcFQ2HgCZeCHIlCMJUfEUzFf5DhHd7lJ7gWJI= - + v0.13.1 h1:NhvMmo3LUDtFB4d27wz0PCtgtHpyllDeqqog4KEXy3E= - + v0.13.2 h1:M5MOH04TyRiMBVeWHbifqTpnauxWINIubTCOkhXh+2g= - +github.com/Masterminds/semver + v1.1.1 h1:zaTaSIIZiw2DIR1ZvGd3Drz9UMzMxkPrIwOvOdJddFw= h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= + v1.2.0 h1:Jo7YVdCWcBIefBe13vUNwemam8K3vwuNJfLa1oRnZps= - + v1.2.1 h1:voGDv5f8R16RnjK9BrMTmvYIqQCs6Jvcsfqzh2lNHzE= - + v1.2.2 h1:ptelpryog9A0pR4TGFvIAvw2c8SaNrYkFtfrxhSviss= - + v1.2.3 h1:FZV+FKRA+7mSfv17UZNtqT4oRSrv2LMDi8MDlkDI8lM= - + v1.3.0 h1:7H8mLwaeisxNSFxW39uQ9UHGv7HOevcDtjFjgbPDE/4= - + v1.3.1 h1:4CEBDLZtuloRJFiIzzlR/VcQOCiFzhaaa7hE4DEB97Y= - + v1.4.0 h1:h9TTGlRMRjil1wsQTRj3+COyXMngVsuK6HMph+Ma7ds= - + v1.4.1 h1:CaDA1wAoM3rj9sAFyyZP37LloExUzxFGYt+DqJ870JA= - + v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= - +github.com/Masterminds/sprig + v2.13.0+incompatible h1:bpkP6O4TFdP4u0qL/7B2LWe6uobYLUgP6Hfh2b8AdGg= h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= + v2.14.0+incompatible h1:nC0fgY6y1UohQeh3PIaXh2IY54dS8JaW2JZwvJM+3ts= - + v2.14.1+incompatible h1:rTHERm50Xp1Cbb8x7xBCeDp//jMMqqR44EWw7KwSXUQ= - + v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= - + v2.16.0+incompatible h1:QZbMUPxRQ50EKAq3LFMnxddMu88/EUUG3qmxwtDmPsY= - + v2.17.0+incompatible h1:GZlRWk/aIMk27GWitLvMubJT9qpx5r9Y3312igRSnNo= - + v2.17.1+incompatible h1:PChbxFGKTWsg9IWh+pSZRCSj3zQkVpL6Hd9uWsFwxtc= - + v2.18.0+incompatible h1:QoGhlbC6pter1jxKnjMFxT8EqsLuDE6FEcNbWEpw+lI= - +github.com/Masterminds/squirrel + v1.1.0 h1:baP1qLdoQCeTw3ifCdOq2dkYc6vGcmRdaociKLbEJXs= h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= +github.com/Masterminds/vcs + v1.8.0 h1:/n3MgEhtRfZQ/6yw651aAlYFrxV5RS+BYm0bL0R8isE= h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= + v1.9.0 h1:I+px62qwzoQwQW/sZF6MbwXDFPebpNer8OFTrrkeEHY= - + v1.10.0 h1:jkK5Cc7D15F+IeYxzaLLnwjIJktoVWmop57/MW4Ofqg= - + v1.10.1 h1:qfaxFNhilVumtLivRl3XwEdvXhb5fBzRh2RcsNJZMQg= - + v1.10.2 h1:hTQV/PE/IuJK+ZmaI3DX0tqVHirXAZ/6S5BHSAQAuHo= - + v1.11.0 h1:wvFGFdyFW2AviPigHWPbRsUJBn8pZWiAGSNVqiX84IE= - + v1.11.1 h1:JWGoxi1Ex/YnNqXE8IWCabkKGihSkFxwDKcM8ojzY7w= - + v1.12.0 h1:bt9Hb4XlfmEfLnVA0MVz2NO0GFuMN5vX8iOWW38Xde4= - +github.com/Microsoft/go-winio + v0.4.2 h1:ZJbCAgklAxf91aYmsiUHS7dIGCqw+EjpOg/oq/Groaw= h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= + v0.4.3 h1:M3NHMuPgMSUPdE5epwNUHlRPSVzHs8HpRTrVXhR0myo= - + v0.4.4 h1:O2b99gLN+3goL4SB45jFjq0reF0AVDt9d5wU/kInBt4= - + v0.4.5 h1:U2XsGR5dBg1yzwSEJoP2dE2/aAXpmad+CNG2hE9Pd5k= - + v0.4.6 h1:Tu8dlnF1wvUKKqr011GFneCoyIn7D+Q2uq6AKmQnGrA= - + v0.4.7 h1:vOvDiY/F1avSWlCWiKJjdYKz2jVjTK3pWPHndeG4OAY= - + v0.4.8 h1:1TfLnrRLKLEVn9t+5FpZqiEJkzpm1QDVs4rZZlUpFOk= - + v0.4.9 h1:3RbgqgGVqmcpbOiwrjbVtDHLlJBGF6aE+yHmNtBNsFQ= - + v0.4.10 h1:NrhPZI+cp3Fjmm5t/PZkVuir43JIRLZG/PSKK7atSfw= - + v0.4.11 h1:zoIOcVf0xPN1tnMVbTtEdI+P8OofVk3NObnwOQ6nK2Q= - +github.com/Microsoft/hcsshim + v0.7.12 h1:VCjS2UYlYyMfRnCus+yhbJZBi9DeFSMBKrggG/PAeHk= h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= + v0.7.13 h1:GHTF675XCwX4e6eezaNXE643Tiqn8ulQtSmWXP1r5pw= - + v0.7.14 h1:T/ZNh+dsrD5XMH6dI94hapFiz2JYEu8WDW1d6zZvHBI= - + v0.8.0 h1:4octbSGAQCm/By5owYT5RUGzg/tWZwTaFDeWM1eW7q4= - + v0.8.1 h1:0RKPd1pQB/4YRjdw0jFwq3A5nWFN4n1ojNzcm4B+8ZI= - + v0.8.2 h1:kfFBcPjZvdu+4yP1KBHszFKyM7uk86FujV3bq7UlIxk= - + v0.8.3 h1:KWCdVGOju81E0RL4ndn9/E6I4qMBi6kuPw1W4yBYlCw= - + v0.8.4 h1:BxoCMvp9PlnwkqrgJC4wN7Y0b4TeuK1DZTOmubzFvz4= - + v0.8.5 h1:kg/pore5Yyf4DXQ5nelSqfaYQG54YIdNeFRKJaPnFiM= - + v0.8.6 h1:ZfF0+zZeYdzMIVMZHKtDKJvLHj76XCuVae/jNkjj0IA= - +github.com/NYTimes/gziphandler + v1.0.0 h1:OswZCvpiFsNRCbeapdJxDuikAqVXTgV7XAht8S9olZo= h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= + v1.0.1 h1:iLrQrdwjDd52kHDA5op2UBJFjmOb9g+7scBan4RN8F0= - + v1.1.0 h1:wkMjq4kSz11Zer+ncYWNBQDlj9Y5RLloY/Tb8yOj6gA= h1:EwmLXLwj3Rvq6vawd3hKEPUcQRyz2CDE1bov6dy8HNQ= +github.com/Pallinder/go-randomdata + v1.1.0 h1:gUubB1IEUliFmzjqjhf+bgkg1o6uoFIkRsP3VrhEcx8= h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= +github.com/PuerkitoBio/goquery + v0.3.2 h1:DFIz6qk2ErBE+73SrW6YaiGywIaScwhk+hnRJeuQTBg= h1:T9ezsOHcCrDCgA8aF1Cqr3sSYbO/xgdy8/R/XiIMAhA= + v1.0.0 h1:jZDjai9V7bAxImA/boIynYuY1tbp/rysh4Xsr/L4uiw= - + v1.0.1 h1:pb5HCQuIF/QWUtO3ZivkPuN0kC+DE8YbO0/+kSRy8Qk= - + v1.0.2 h1:6eVgli+CgrpInQgyW5Unj3aqfzqFk/ALcKm6m0w7hgA= - + v1.1.0 h1:QUDKATbrxlrC/VtTGXPgSF28dtBbniZz0X2sp/Twom4= - + v1.2.0 h1:Ej6nIAQZhMyRPNV5jOVZlE3XY4YsPYrppZXL6G9jza0= - + v1.3.0 h1:2LzdaeRwZjIMW7iKEei51jiCPB33mou4AI7QCzS4NgE= - + v1.4.0 h1:13fV4AYmaSopdNp8KWDUlLyU5INklBkYk0tsTfxRO2U= - + v1.4.1 h1:smcIRGdYm/w7JSbcdeLHEMzxmsBQvl8lhf0dSw2nzMI= - + v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk= h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= +github.com/PuerkitoBio/purell + v0.1.0 h1:N8Bcc53nei5frgNYgAKo93qMUVdU5LUGHCBv8efdVcM= h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= + v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs= - + v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4= - + v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= - +github.com/RangelReale/osin + v1.0.0 h1:mkPOQ2FdespabcwRi3/1X5/a/7FwOgfguWFR+1PA9L8= h1:k/PH1SjZDitJDtK3zHm/XZRi+bRz6i3rhx9qE9p54CY= + v1.0.1 h1:JcqBe8ljQq9WQJPtioXGxBWyIcfuVMw0BX6yJ9E4HKw= - +github.com/SeanDolphin/bqschema + v1.0.0 h1:iCYFd5Qsw6caM2k5/SsITSL9+3kQCr+oz6pnNjWTq90= h1:TYInVncsPIZH7kybQoIUNJ4pFX1cUc8LoP9RSOxIs6c= +github.com/SermoDigital/jose + v0.9.1 h1:atYaHPD3lPICcbK1owly3aPm0iaJGSGPi0WD4vLznv8= h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= +github.com/Shopify/sarama + v1.12.0 h1:SGfRgQ8Qq7DfnoAzGEQDssnqz5ZHl7cmpzpJKLj3UwQ= h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= + v1.13.0 h1:R+4WFsmMzUxN2uiGzWXoY9apBAQnARC+B+wYvy/kC3k= - + v1.14.0 h1:ybE26/v5eppjkQZmMAttQK8lFiNYnk/aWYVU/IgmWpg= - + v1.15.0 h1:v/Q3THMtunYfvKhbFfhegInfoW70HoNgsOdmuvFN5Qg= - + v1.16.0 h1:9pI5+ZN06jB3bu5kHXqzzaErMC5rimcIZBQL9IOiEQ0= - + v1.17.0 h1:Y2/FBwElFVwt7aLKL3fDG6hh+rrlywR6uLgTgKObwTc= - + v1.18.0 h1:Ha2FAOngREft7C44ouUXDxSZ/Y/77IDCMV1YS4AnUkI= - + v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= - + v1.20.0 h1:wAMHhl1lGRlobeoV/xOKpbqD2OQsOvY4A/vIOGroIe8= - + v1.20.1 h1:Bb0h3I++r4eX333Y0uZV2vwUXepJbt6ig05TUU1qt9I= - +github.com/Terry-Mao/gopush-cluster + v1.0.0 h1:hVyXf8fLoQ3a5fOykdIyCcUbmUs4kdKDa97hwrCQw3o= h1:qU0tnOO1fIrsB1jbQSY/YfeS25dl6q3Bb8ucul3spuc= + v1.0.1 h1:7d5fQgFxOI1ej0eL2b1TuuPu7nNdmi4xD434/zfqXt0= - + v1.0.2 h1:O8yRpflCTtqiMR/VNYmrElTo2U8m2dqHLVQ/wOzLc70= - + v1.0.3 h1:ryRDuFPra6L04k/UJkuxqlCpsnWw4SrBGeOv8X0WxYo= - + v1.0.4 h1:Wc+VxOXW8wtJjYWCcLneNqNuaUP/HcYjZm5JeMLmCBE= - +github.com/VividCortex/ewma + v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/Workiva/go-datastructures + v1.0.41 h1:DsFvBLOojxUVOXpxMaFRMgrszuLN6+O/J96O3rTaQt8= h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= + v1.0.42 h1:yf94hF8U/DGDH/J4I5iYKvYQusHB9OZpNVJjU4jROKM= - + v1.0.43 h1:PAzvm/sZzqX50iy+LF+sNKgDCIFZPDPDNMOha7nY7Po= - + v1.0.44 h1:zNyQ5b0vc5aqzudAxCD2HFeNNpZLKCQCqP/D4HA54GA= - + v1.0.45 h1:vq8+9mcimFV5UXJCTMxOoaPMcaE9gztoc5x1UbaRJUc= - + v1.0.46 h1:85Vm9guMMJ+/+Ns23WrjK7bDE67uos7xmWHThvxaru4= - + v1.0.47 h1:5dcz+D13KFP0F46P5xoa4xmmcUcbimzJm7ryCI8MFsE= - + v1.0.48 h1:e/we+zYmL9Bro7bAAnS5xWmjg5qc0y5G+TOS2ZctW0o= - + v1.0.49 h1:cKU4n0/psXU6GDjK4kpJU2koN7BZ0klqotTMJ1Rbj2s= - + v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo= - +github.com/abbot/go-http-auth + v0.4.0 h1:QjmvZ5gSC7jm3Zg54DqWE/T5m1t2AfDu6QlXJT0EVT0= h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM= +github.com/aerospike/aerospike-client-go + v1.32.0 h1:0PE+aQUqQ1ATb3k1y0UvEC8scCwg9ksq9LKXvoYA2uY= h1:zj8LBEnWBDOVEIJt8LvaRvDG5ARAoa5dBeHaB472NRc= + v1.33.0 h1:xZ1sTMKizie136jqs86fpOJ/P9IJSQt9H2YmxyOi0lk= - + v1.34.0 h1:sn6zvlwDls/NdIf1wCu1kVoYZ2iOHcwwqwcHP8Puef8= - + v1.34.1 h1:QjKc40tj/4RBvgFuWOb0aF0WE/E4MEnaGO/CahG2o90= - + v1.34.2 h1:zrlhAi7/HQbpde4undhtDt89rx9OJcyEi5KuDjnfIlg= - + v1.35.0 h1:h507B7Z7SWjkL9Isb330BBxHD7YWN2EwXtb7ZtcFU3M= - + v1.35.1 h1:iZhuKj6AKDFB4CZKLZk5YnkKWwCsdR2H8dK+FuU7uFg= - + v1.35.2 h1:TWV2Bn59Ig7SM4Zue84fFsPGlfFJX/6xbuGHyYFS/ag= - + v1.36.0 h1:EePkIW4FtF09vNJZqOSz7mx23069wOkPm4LmDF8CPB4= - + v1.37.0 h1:+hbk5t1mtBfErFTxicGfRJVwxKjupzbgogaiR1iq/xY= - +github.com/agtorre/gocolorize + v1.0.0 h1:TvGQd+fAqWQlDjQxSKe//Y6RaxK+RHpEU9X/zPmHW50= h1:cH6imfTkHVBRJhSOeSeEZhB4zqEYSq0sXuIyehgZMIY= +github.com/alecthomas/kingpin + v2.1.9+incompatible h1:ZTeAUKWQRJHTb4dfsSD3Btl6FkY0kankelUrGpLoP2k= h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= + v2.1.10+incompatible h1:UuHmdc/3On+EqxEqwqDPGMGxnDoVF7obItol51l7Ir8= - + v2.1.11+incompatible h1:R7E1WEE7GddTW3qAhFWpGvNLgpRxM2cd8sQ7W+lRsJs= - + v2.2.0+incompatible h1:9Pmf4VXakLfUqrRh76V27GNBHFUtEtSy5DaR3YqYbRE= - + v2.2.1+incompatible h1:PjbMdYIZp9VKeasxWfpE4PX4QAatdbxldB5AOuAkSp0= - + v2.2.2+incompatible h1:BvD/akJsxNMaKFmrFB3qsUs5sZSkdpIhSLWk88q40gQ= - + v2.2.3+incompatible h1:4Wohd7Da/I0OWc3cvR93azRPNGwV5YaIax/kS0ttbgE= - + v2.2.4+incompatible h1:NbnCKzqpYim2hHnyWx9RxeUwqN4L9OZrRsSFkykSzVg= - + v2.2.5+incompatible h1:umWl1NNd72+ZvRti3T9C0SYean2hPZ7ZhxU8bsgc9BQ= - + v2.2.6+incompatible h1:5svnBTFgJjZvGKyYBtMB0+m5wvrbUHiqye8wRJMlnYI= - +github.com/alexflint/go-arg + v1.0.0 h1:VWNnY3DyBHiq5lcwY2FlCE5t5qyHNV0o5i1bkCIHprU= h1:Cto8k5VtkP4pp0EXiWD4ZJMFOOinZ38ggVcQ/6CGuRI= +github.com/anacrolix/torrent + v1.0.0 h1:MxNBr5lKDK/fRtvAYPOzGGQrpj+70Lh7E5EVjzIIbXg= h1:N6lCILah/qQCk/gVjHsOnqaug7a5DqQyryCbZD1L188= + v1.0.1 h1:YsjmBdyIUGDmbFEovln/NOiU+elyG92lcb2KyAiTcgE= h1:ZYV1Z2Wx3jXYSh26mDvneAbk8XIUxfvoVil2GW962zY= +github.com/andybalholm/cascadia + v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/ant0ine/go-json-rest + v2.0.4+incompatible h1:s+BBj3hMrPcnQ5IR/JqtHSyKMBx22RtpdcBhs+sqfjc= h1:q6aCt0GfU6LhpBsnZ/2U+mwe+0XB5WStbmwyoPfc+sk= + v2.0.5+incompatible h1:rWfQkmeWC4q4asLRGCKrUX94l7cpT0x3Yd6yG3qc7uc= - + v2.0.6+incompatible h1:W6jOYA9XWzg1YbZuso0tX4LqvrvM2BpJ4m/g9gQYbRc= - + v2.1.0+incompatible h1:EqS+heLqxXPmunoL3cZHhGhYG/+eaVwhWlrhr+NKpYs= - + v3.0.0+incompatible h1:+peIEe3YSRJqj7/TtqVVvkwXSzlgku2wsv29S/mb4F4= - + v3.1.0+incompatible h1:grVLbQyVuPtQTP53i3qoE5eUBoE35CQe4EXKKP7Pn7c= - + v3.2.0+incompatible h1:GiVzVzckqQwfSkJkt7YFKR+oBcjeCTvu824nD1xIEPg= - + v3.3.0+incompatible h1:87hhMna0tJf0poWLrQMmu+EAjRsAmV6ZDXpzdTNKZX8= - + v3.3.1+incompatible h1:SjCeJsKsU2vVk6Dx7IX+85/dp+mmivw38c+P21aiS4M= - + v3.3.2+incompatible h1:nBixrkLFiDNAW0hauKDLc8yJI6XfrQumWvytE1Hk14E= - +github.com/antonholmquist/jason + v1.0.0 h1:Ytg94Bcf1Bfi965K2q0s22mig/n4eGqEij/atENBhA0= h1:+GxMEKI0Va2U8h3os6oiUAetHAlGMvxjdpAH/9uvUMA= +github.com/apache/thrift + v0.12.0 h1:pODnxUFNcjP9UTLZGTdeh+j16A8lJbRvD3rOtrk/7bs= h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apcera/nats + v1.0.9 h1:EQkYBlS/flQLLLK5RQHom10zPwJdkpCvvGhKIRfkJ74= h1:EVgYOJsx6L49WUJRKtQ++1ALZYo1IKwVEcChTBIzEEQ= + v1.1.2 h1:MNBsB1FHjZjHYczQqlp8g9BtKSAEkZT4Q/5gFrwUkiY= - + v1.1.6 h1:Jk98/6ON9hljPsrlDAOKe7hJuuhKM9z8WTifuQoeWvY= - + v1.2.0 h1:dVP26kUrGEoXIFCPZma/CYC0k8nXX5Sxoxw/08oHK+k= - + v1.2.2 h1:gtb+n9B8VfxJ7rNYRCEkAeXddU2NvNV1u82qGZv5W5U= - + v1.3.0 h1:QVEklKiLJ2QfKpBR6ou4/TgesXtnYLylZ/f0dOpvqI8= - + v1.4.0 h1:GE7lrGfiRIK1HzMr8nXvpMdNzeXQCYx4D3bVYPAcOwQ= - + v1.5.0 h1:ZhkjtgZ39OU8pxENsZ5lHTPjUDqifLMA3nVzF8bf9T0= - + v1.6.0 h1:z9XGt8apN1127Hn3BoQqvTb7whzLem0NzCfjL8oZxiQ= - + v1.7.0 h1:2u2xXtXdg9C+wiELz5rtheY1Djwukjsk6ePoIKL9gm0= - +github.com/apex/apex + v0.11.0 h1:5e83w49hAYZ5TWu9bBCi0E9cJIW27tnkRXpGsNX9++w= h1:kof13vptkdeeeQe+P1xgCKzHCq2L7/Il8QM1HfjI7qY= + v0.12.0 h1:SHitRgxR3QlaRwVRNGkPR4yb3gFY1899ri09ErGorjw= - + v0.13.0 h1:3CB6fXl5USHtBME0X9GjwpBwY0H0UFplMhyNxGLqbuw= - + v0.13.1 h1:URS3EYZwkBzJxvjKkN/h21n2rJ22bUthBAcuBnQRXDs= - + v0.14.0 h1:/ENBKpIhCdCCLTIQs+2H3up6em1XEpWYYY4pjLMtnRM= - + v0.15.0 h1:UhejXfxrJjnpTBeH3fjoNtyNR1hWOi50v89BtAFInqs= - + v0.16.0 h1:tpByjslO1YQw7VxGFAGgnGjVFxdda9aT3GucB0j4rwc= - + v1.0.0-rc1 h1:UKSrvT5J+MYPoxxWd/GSESU9K+DcBj2RyHGs7OQxxIg= - + v1.0.0-rc2 h1:Xy536Df23zqGZjns/pI6KdqJ5JsJvVOB2I83Z9AR/EQ= - + v1.0.0-rc3 h1:s/qSTZ5niFriVO8T7aD8FGtF8WTxwGRoqdbR3QavGIM= - +github.com/apex/log + v1.0.0 h1:5UWeZC54mWVtOGSCjtuvDPgY/o0QxmjQgvYZ27pLVGQ= h1:yA770aXIDQrhVOIGurT/pVdfCpSq1GQV/auzMN5fzvY= + v1.1.0 h1:J5rld6WVFi6NxA6m8GJ1LJqu3+GiTFIt3mYv27gdQWI= - +github.com/apparentlymart/go-cidr + v1.0.0 h1:lGDvXx8Lv9QHjrAVP7jyzleG4F9+FkRhJcEsDFxeb8w= h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= +github.com/apparentlymart/go-rundeck-api + v0.0.1 h1:U3B4JDw4McLlsZ/1UlTjTMnM0SjqO03svfvu7qRPA7g= h1:U6OjNHcY3edY04ILn+KNrWZm3j15cPzW7PyjtIQOh1Y= +github.com/appc/cni + v0.4.0 h1:5jSFAp0e3pMhFCqKq6uwJUbTvpONtyjc1vZsHEispzs= h1:+JvcwZORvjAIdTtOBUNnR7Ry5kSqPwtibBlXdzxGQYg= + v0.5.0-rc1 h1:Abe2XAxQvxB0kOU7iZcOB3M7sbDPKDANo+LUartxD/8= - + v0.5.0 h1:WZMajbGq20Tl/0YqV1H/w6hsNYBNxGLMfmGfZXuz11U= - + v0.5.1 h1:Zcq7lwXhKlK0YvX1NFoe9/S6HmSnUOf2NtPLIaEWt6w= - + v0.5.2 h1:WVfxD2Vz56jN3cNrn7quw8VhvlIJN2J0weJ8430Byvw= - + v0.6.0-rc1 h1:+YmNvtO3xCtj1J4RTVSpLvBs8lF6zt8YwbfroVjOLus= - + v0.6.0-rc2 h1:Br5NU59nHYN3cGnyMqXiGi6FgQ+vTnVApBu50kQOm+E= - + v0.6.0 h1:64tEiKTViakF5Qr84DJBsiU4nn0RbzYyGDgzgM2ZdxM= - + v0.7.0-alpha0 h1:bniZFfNgKpSCemyzkN96FgmOAE2QwqEtVUHzwNaMJyg= - + v0.7.0-alpha1 h1:QIGrZ0975kLCXO8ajYIWnki5VWv63kLnZTErG90mla0= - +github.com/appc/spec + v0.8.2 h1:S6m0fAPENQhZtqKj9pIUQOtiQotORSDCGPBXXd+uzEQ= h1:2F+EK25qCkHIzwA7HQjWIK7r2LOL1gQlou8mm2Fdif0= + v0.8.3 h1:E7jmK2XvAfx/iZqoBktJhNN5pkj2PPeglEJR4I7D4mY= - + v0.8.4 h1:GSpyz7DJkRyIiT8Hs1uVXh6cI+NktlKBK8ZC0bEWRRc= - + v0.8.5 h1:OiSWM9BSw23A8jfqQgzzR1S8NzUVg2kBfKDBx5Vurzs= - + v0.8.6 h1:b4weYOUBjwN4iGvIQNp/WHhK44Kwx39Y9i+6Jr+5kt4= - + v0.8.7 h1:5W/+DzI8oifyDN8D0VZ1f5RAISxSwzP+JxbqEDIwNPg= - + v0.8.8 h1:B/Mpno+onKj2194aU9EXZFH/7SL+9MZx3vVHeaf6MH0= - + v0.8.9 h1:AkT6bEI+KxGuy1cpbWeKLvtzQ0dVg2D/f0woPE8MvJ4= - + v0.8.10 h1:I9eyBoOeIZ/y6RQPTrn4ar+dmu44Na/ddQl7xjjboIU= - + v0.8.11 h1:BFwMCTHSDwanDlAA3ONbsLllTw4pCW85kVm290dNrV4= - +github.com/armon/go-radix + v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asdine/storm + v1.0.0 h1:1lzwUG5Rh4VToqwwetiednC9DP7lhxjxDQViZcMp0yI= h1:RarYDc9hq1UPLImuiXK3BIWPJLdIygvV3PsInK0FbVQ= + v1.0.1 h1:95fBmWeTocU/faZg7hxvmAM+tuNxrZEu6Bm4IrWnOy0= - + v1.1.0 h1:lwDLqMMPhokfYk8EuU1RRHTi54T68EI+QnCqK5t4TCM= - + v2.0.0-rc.1+incompatible h1:TqYwZ9gXnjud1dF7DMHbtJepW20qFIILn8ACcD9DmTs= - + v2.0.0+incompatible h1:iG+Anu3d190WehVdyXGZ+VTWYOYTn8+pYuNORlCwwic= - + v2.0.1+incompatible h1:TmurTbZAH+/kAwVfYOPQSQSzr7CATXgqwVaGinGA49E= - + v2.0.2+incompatible h1:k4ApXZdCe5zYf9865+0zuvGAyMsXu1hbSXV1l4ez1P8= - + v2.1.0+incompatible h1:8kbvyrzhTtb7TiwGGjsNSKuCsKqJsyvJeZslh9W3YN0= - + v2.1.1+incompatible h1:j/IqbSqHVmrU908a11QGf+2Iv7pr7NXiyDE+P35Bp80= - + v2.1.2+incompatible h1:dczuIkyqwY2LrtXPz8ixMrU/OFgZp71kbKTHGrXYt/Q= - +github.com/astaxie/beego + v1.8.0 h1:Rc5qRXMy5fpxq3FEi+4nmykYIMtANthRJ8hcoY+1VWM= h1:0R4++1tUqERR0WYFWdfkcrsyoVBCG4DgpDGokT3yb+U= + v1.8.1 h1:nVKkVtLNuoqESIj08jU5ZZVTWt5zuMf3ZRZK/It3GyQ= - + v1.8.2 h1:Xq+l4k5xlGtMC3obQPvIy5pEqkKZy8pTyp0PHWb0JDc= - + v1.8.3 h1:6SwgDPBxYSs+E2cwIL7BzQn4nWgY8xwYE8wO6YpNa9k= - + v1.9.0 h1:tPzS+D1oCLi+SEb/TLNRNYpCjaMVfAGoy9OTLwS5ul4= - + v1.9.2 h1:Jw8glCLKrXd7BL65WjsYsfquxO+dF0TvhBhSOP19mN4= - + v1.10.0 h1:s0OZ1iUO0rl8+lwWZfPK/0GhQi1tFUcIClTevyz48Pg= - + v1.10.1 h1:M2ciUnyiZycuTpGEA+idJF0gX24h58EbPvGqjnO/DCg= - + v1.11.0 h1:5Ke/j7NfQQJ9/sKDgZMQkhTHm18k5dApQwqkAJwPfMk= h1:mBKqEBdFFvQNfhHLZeQKH3BTDVSCbJs5zGoFOU97i5A= + v1.11.1 h1:6DESefxW5oMcRLFRKi53/6exzup/IR6N4EzzS1n6CnQ= h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= +github.com/atotto/clipboard + v0.1.0 h1:pw3q0vqdkRc2qob0PLEZo3NFSQehzW2dgSdbMI75kEs= h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= + v0.1.1 h1:WSoEbAS70E5gw8FbiqFlp69MGsB6dUb4l+0AGGLiVGw= - +github.com/aws/aws-lambda-go + v1.2.0 h1:2f0pbAKMNNhvOkjI9BCrwoeIiduSTlYpD0iKEN1neuQ= h1:zUsUQhAUjYzR8AuduJPCfhBuKWUaDbQiPOG+ouzmE1A= + v1.3.0 h1:ZlUgCFoY5Eebf7mDuOvjCfTzSwBvYPa2gR9O4cAxXow= - + v1.4.0 h1:utQd5PalMe5a7bLjfcf6dmXInYmyTCAZG+1iOO0P8o4= - + v1.5.0 h1:WY+2xr0O7ycu4pKCRZrrtq09b7s0HxEKlaI8LdD/vmg= - + v1.5.1 h1:82HrN4zjDClq9EVmU4mhQxdVu4dQMPBZyy88T5j+Xw4= - + v1.6.0 h1:T+u/g79zPKw1oJM7xYhvpq7i4Sjc0iVsXZUaqRVVSOg= - + v1.7.0 h1:g3Ad7aw27B2lhQLIuK7Aha+cWSaHr7ZNlngveHkhZyo= - + v1.8.0 h1:YMCzi9FP7MNVVj9AkGpYyaqh/mvFOjhqiDtnNlWtKTg= - + v1.8.1 h1:nHBpP6XC30bwF6qWKrw/BrK2A8i4GKmSZzajTBIJS4A= - + v1.8.2 h1:wC8KcAG9HyVkFjbKQ9uhp87UGZutlPn9IJPq9fYM2BQ= - +github.com/aws/aws-sdk-go + v1.16.30 h1:8QLugp2+gbixFN85sGSR97qvaXsjTOVUrA2bbsLCDOA= h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= + v1.16.31 h1:bE4FW2uulhXiAaF4Guw0OzX9gBZ4iWvXWe6VT8Jxr28= - + v1.16.32 h1:/grHp+bt3OAVWkdCQv2YtXkWuu58SuTlH1U8tp25n1c= - + v1.16.33 h1:jXrsqeNbpLkM4TrnZbtr+4k4x7frwcLP3DiWMa7NOtE= - + v1.16.34 h1:kZj0biNt+YfvqC11/NtMGqB6YpHXd9bVEzmcTT4CmJg= - + v1.16.35 h1:qz1h7uxswkVaE6kJPoPWwt3F76HlCLrg/UyDJq3cavc= - + v1.16.36 h1:POeH34ZME++pr7GBGh+ZO6Y5kOwSMQpqp5BGUgooJ6k= - + v1.17.0 h1:+pbWEdKxH1qlLb07as1+auEVvx+IxkaDzQLwMzbK1tI= - + v1.17.1 h1:RoOo57SetcPFGQ6vesLfWIpfnsbpEiuwiHq6aCvjrZw= - + v1.17.2 h1:92HvIn2MROLHcidibvnzy7D0iHCygmonkNQKACbAvuA= - +github.com/aymerick/raymond + v1.0.0 h1:jgij7LYInsgEGnvnlPILiGn8xgyfyfQU+iKZK0VAwNU= h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= + v1.1.0 h1:phuNN2s67eI/HtO8CrvqFcdR2JP+BtkGJZ9n692Hr2Y= - + v2.0.0+incompatible h1:oDFxJCwQshTjA7YcdZJJMthIG1f3zDCVrLiCi9p11EI= - + v2.0.1+incompatible h1:ZhYb+Bw5DNBMAl/UpvbxXP7pALGiMzCAE56QwHPqjjk= - + v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0= - +github.com/beevik/etree + v1.0.0 h1:gQ0/0GdWwIZONSQVL/btX2rZ/OwMSV7twGyq42D+KUg= h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= + v1.0.1 h1:lWzdj5v/Pj1X360EV7bUudox5SRipy4qZLjY0rhb0ck= - + v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= - +github.com/bgentry/speakeasy + v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-nsq + v0.3.6 h1:mZGagnVsEMN02ciyD64Rh6+tThqKAZPq4bPq7kspgrw= h1:uRcXTyAr/ggVrYpmvkE4jkJNSWov99Gg4fwhhypc/P8= + v0.3.7 h1:p7Ul2pL+elqkWC4NRbU8A/KoL3b6aX33fdX0NMNXtHE= - + v1.0.0 h1:KrtGIL9MmHO2ae6OVA4MwydLk+moX9LZXdbBRxBivFk= - + v1.0.1 h1:EOOQyoNbBuOJ1dpoYWmAqL+Xdu+8r+KjwrqJ3RK6jFs= - + v1.0.2 h1:kUNcpLB49+sgN+9NoVNXdkeyDnzGuw4b/dPstbIGdjo= - + v1.0.3 h1:HMVQuDxXhbd5w3ONX68VKsByESU5v7qac4U5koZRHqc= - + v1.0.4 h1:mZgOcsNi1JC/TP8NmuiQ4BSmmjnBIcSYAZrFejgPRHg= - + v1.0.5 h1:AoRjCf5NTjRC0MWdTEG5zYJlNuCZhhFrtrgLXfsK7zI= - + v1.0.6 h1:RVVHxsteQEZ9iC9v5/RUWrcehXDJSmCVYtzsQ2jtr9I= - + v1.0.7 h1:o6nk7C1LyG9wAEsD7AfPExMpLwfbc0oYwBhzQxqefQM= - +github.com/bitly/go-simplejson + v0.4.1 h1:TGpmk+yOfSuvI75kj5haORCr+WL+I5zqTbHnZRvxSS4= h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= + v0.4.2 h1:FMBg8cDyjr0EDQUGi4Qcy4vyqEUb/yhoqpVyWbAUgjQ= - + v0.4.3 h1:F3lPub5ZygB4mLWK0UsYd5T7JI5fSmTyGdkJEGFegno= - + v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= - +github.com/bitly/nsq + v0.3.2 h1:Z1ODLjmJgdX53aS1/2us6av+fhqLB0HzhLNZBnD1wgE= h1:iscvdoiQoaXC4V7XCMmZOxr3PZGYZvMcRsQf8uTt/PM= + v0.3.3 h1:AdzY1brGnQGBQa1LrAthBjFaLEl52MfT5t2XqGRlurc= - + v0.3.4 h1:sielleZKJAqfm/mUWx1/yg0lhdVx7SB1yojmPL34QVM= - + v0.3.5 h1:A6rC4frCmc0uEcjMpHnPhV/FKu+DX7MOr8o1Oe5scHA= - + v0.3.6 h1:NPJzvj2y0asyv91epTzhZpiaJstvdB1QvvCMF/zQTz4= - + v0.3.7 h1:XiBOFohN5AnQUM4xjd2yvLFuJn0xaHcitLtoRds7svs= - + v0.3.8 h1:rqEmrDKjLDP9zWzyV62Ea1FNVUHgfAUeI9RhR8zm5xk= - + v1.0.0-compat h1:MxyHntD0McEkAEWrLa8C+E345HG2DdVOuH9tq8+WXXs= - + v1.1.0-rc1 h1:0Acse3L7stpf/MnFqLtn9Aw9VbxCm/+2mYu5+eSxy1s= - + v1.1.0 h1:oEQihaX5y1E4UE8nWKXDzSq0PQVEyj0SMTZPV3jxOmo= - +github.com/blang/semver + v2.1.0+incompatible h1:TtbN5kU/oDXfHg4iuCEQ+vUTdr8ED02yUWG0f5VPVs8= h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= + v2.2.0+incompatible h1:DIb+hEi/XKX6t9Cvy5+oSlANqmc0eenMxbNBvLqpV2A= - + v3.0.0+incompatible h1:N7yr3lQBIWoA+v1DXf5skCrTH62zKbkHmWDy+p0pYAY= - + v3.0.1+incompatible h1:HSK4fJAkncdAqOFSWJBP6JslojPJ4G0Jn1uKwxzWJ1o= - + v3.1.0+incompatible h1:7hqmJYuaEK3qwVjWubYiht3j93YI0WQBuysxHIfUriU= - + v3.2.0+incompatible h1:HfFKH+psVkEzPzfJC0gUWrirRa4ERIzwAiGBNQNWMO8= - + v3.3.0+incompatible h1:BRtK3PUrMsESEGZwVNZa3sYPGIoNRla1Uhy+oHXiXrE= - + v3.4.0+incompatible h1:9A/N25tshFofYIu1794iWJshVXtvliOyciudY5/cfpo= - + v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= - + v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= - +github.com/blevesearch/bleve + v0.1.0 h1:BfNXayKYKM9fzUp5YL6m8qIqv2DstRyRj2sk8PXalaQ= h1:Y2lmIkzV6mcNfAnAdOd+ZxHkHchhBfU/xroGIp61wfw= + v0.2.0 h1:vJUXB7ZTkrcu0uBx4duWimnEZ7VDdDqBow1HX1lRkDM= - + v0.3.0 h1:5qRvr9qP/5IMyJBh64SVFmnbc0cbSfSRQ5on3GYiEFk= - + v0.4.0 h1:dErdGEYlXMMVJCDJAf/Lqu1DAKC0RsKgty+WJrxFHyc= - + v0.5.0 h1:gak5LhWxIJjGz3wTisxKLcXfxcx+0l7Sk2gEGsnTyu4= - + v0.6.0 h1:lPg4qruuvBQWQpAPmHgvcIs1ibsbWC/dbca6e1fc8Mk= - + v0.7.0 h1:znyZ3zjsh2Scr60vszs7rbF29TU6i1q9bfnZf1vh0Ac= - +github.com/boltdb/bolt + v1.1.0 h1:o7Lse6JSBiorjJqUfn/SHYKJ4tKfmzVmO3tgnkEizFI= h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= + v1.2.0 h1:4FPRe2N+UvvrhrU7U+A60z9qaK75Q0wDmxjxZrMntTQ= - + v1.2.1 h1:dqty3m0dX4pwSiqpaNlLlaVw33YmC0NWCVpo4PJmxyA= - + v1.3.0 h1:am1Tz34FiDO8OP+gvSpAeYb6Iy1lME5KHxZoFXbfbLs= - + v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= - +github.com/boombuler/barcode + v1.0.0 h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc= h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bsm/sarama-cluster + v2.1.5+incompatible h1:qBhKDZ3LO4u1jqs53HAWJZ/P6AFf/DbaGupjETps0os= h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= + v2.1.6+incompatible h1:9taGDgI818Tx4ynNFIOr6vfu3ZmC3dyWD1zhx8e46kk= - + v2.1.7+incompatible h1:VJcuQ/oU29WnXwj3vk4gM+O/46qqg4Yd0Xxh5yL0p9Y= - + v2.1.8+incompatible h1:/Qfd5p1pXhSXzafAayTPMa/d1fMzZgZbeFqszsAe5Io= - + v2.1.9+incompatible h1:EdayzygiBrKtrj2exJtHHpWrN96nKvnLizN7aNWlpcc= - + v2.1.10+incompatible h1:+8EWPWOItwlMNEi5bqy7HgO8x5DO97CEyS3AWiw9MiQ= - + v2.1.11+incompatible h1:eBCnGwJcydiX4g9yabG/TfKvOMb3UeuAwBVuTE+2hN8= - + v2.1.12+incompatible h1:7NakmL2HnNvCCy685HlJbhYDU390nanFpwoonmhDJlw= - + v2.1.13+incompatible h1:bqU3gMJbWZVxLZ9PGWVKP05yOmFXUlfw61RBwuE3PYU= - + v2.1.15+incompatible h1:RkV6WiNRnqEEbp81druK8zYhmnIgdOjqSVi0+9Cnl2A= - +github.com/btcsuite/goleveldb + v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/bugsnag/bugsnag-go + v1.0.5 h1:NIoY2u+am1/GRgUZa+ata8UUrRBuCK4pLq0/lcvMF7M= h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= + v1.1.0 h1:0jF7rytU+6wd0X26evrxXzrRQF2/wYndVYcTsmKyeYw= - + v1.1.1 h1:FH9mZaDrqDMX9FydxWZXM+ypVc5G4dKGxk7nxhpnt+g= - + v1.2.0 h1:zGZiV73MHmlrWR9dj5yMj0FaZGMpaQC9sMrB/0P9DwQ= - + v1.2.1 h1:d0SjXdWdFOK224Bbhfna6xsgClo1hKDtRsekbgHBlL8= - + v1.2.2 h1:u0nv8EHnaZ8Eenc+d0nfGvNO/YIjNTlHXB2dKr9S75E= - + v1.3.0 h1:vIHdYCVDBtzRcj5wvxljvbnFduWpYGPt3esulAsX/Vk= - + v1.3.1 h1:NFDoCNG9B2lx1+zQqJgayvO1prIdXwMmHLZn8zMT6ZI= - + v1.3.2 h1:8bcRylldQKQiAx9/KPu9+1iLZwgK1eN1Ib3SROSXfIY= - + v1.4.0 h1:CLCt5wO6/P0GelBEMRrlF52XveQMnnXHoCoxGZ+8a5g= - +github.com/bwmarrin/discordgo + v0.10.0 h1:sDDvLPcuCVHA+KzbwO4WKQ2vH8lKKxmYGoJCIXqVkDg= h1:5NIvFv5Z7HddYuXbuQegZ684DleQaCFqChP2iuBivJ8= + v0.11.0 h1:hi1bjS/WuHgWxdkZO0WR2WVsjLXnJVFv0iM69RZkW4Y= - + v0.12.0 h1:QdNqxQyACMk+nPRAfKSYoMYyRUuWyBU8MXU1BLUeI+8= - + v0.12.1 h1:2rbWXqbzc1XUUnbmBLp3lor2Uhe/xa1igR5YnvWnCH0= - + v0.13.0 h1:Dz2Oa+uMm9kFKMPWZ/LEtW2+20SkNa0fA5/fi0c9Z2w= - + v0.15.0 h1:WXViLKrvxaMG5K1X03qgO03mSCqemiA1xFEv1EezurM= - + v0.16.0 h1:/HhaLf7VXwJe/zcN+i/tKIbhKa1Y9Xy0uFXHyiDm7TU= - + v0.17.0 h1:VUZc9ppGi0j9xKsRBYctJqFEFl8u0FSMzDBObw705cM= - + v0.18.0 h1:XopVQXCIFy7Cr2eT7NcYcm4k0l2PYX+AP5RUbIWX2/8= - + v0.19.0 h1:kMED/DB0NR1QhRcalb85w0Cu3Ep2OrGAqZH1R5awQiY= h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/caarlos0/env + v3.1.1+incompatible h1:DfTWQ5cr8n51wmIGYJKAHeWJx5dryHk9N3fgRhItS4A= h1:tdCsowwCzMLdkqRYDlHpZCp2UooDD3MspDBjZ2AD02Y= + v3.2.0+incompatible h1:47SrI1EMf4OwTL8DaHmjVU/A/hmoUeu8L9FQQRXknsQ= - + v3.3.0+incompatible h1:jCfY0ilpzC2FFViyZyDKCxKybDESTwaR+ebh8zm6AOE= - + v3.4.0+incompatible h1:FRwBdvENjLHZoUbFnULnFss9wKtcapdaM35DfxiTjeM= - + v3.5.0+incompatible h1:Yy0UN8o9Wtr/jGHZDpCBLpNrzcFLLM2yixi/rBrKyJs= - +github.com/cactus/go-statsd-client + v1.0.1 h1:R58kYEe8CS4Dg7zNgGi8J0nFhYIGaBvIC7SHJ1l08is= h1:cMRcwZDklk7hXp+Law83urTHUiHMzCev/r4JMYr/zU0= + v2.0.0+incompatible h1:sxAVNmd64vydbUsHgVIzR4zmXgnJezfZJUORu1/cgu4= - + v2.0.1+incompatible h1:i67s5+3NqhEdmVtGIUZJdQotCMgYUQ//5nR1YxdIKp4= - + v2.0.2+incompatible h1:fq6u7pZGQh45DMCKGzLPL4VUY6YOpQbySJE6yLsIedk= - + v3.0.0+incompatible h1:RkB08vazVUSx0MRnt824Ohv7GYXffZ16piKf3m3W/sI= - + v3.0.1+incompatible h1:Fk6etBCheGhbrRmfHuaetxZ6H9/Mp2xl4D+Dcxo19zo= - + v3.0.2+incompatible h1:vjpspf/8TEt85VK6/pVEEP1Blxhl7rE1puzib/gh6Zs= - + v3.0.3+incompatible h1:Kipzu5qAaQ1Sipag8JNCeyWayxBufo19Xont/KXHTfE= - + v3.1.0+incompatible h1:jtloShmaP/MkAW68aaWwQZrzlOUXVLudFmBQsskTs7A= - + v3.1.1+incompatible h1:p97okCU2aaeSxQ6KzMdGEwQkiGBMys71/J0XWoirbJY= - +github.com/casbin/casbin + v1.0.0 h1:DyIqMSuwLkClTBDndMogDOrT8RT60rAltOVg6EHPFP4= h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= + v1.1.0 h1:jXVs+Zf2QdV1fLP0Yu0N/aS/OhU19wMAyl1U260pF3w= - + v1.2.0 h1:NNSzEev1OtggZDIVz68PnCC+AaPkG+obxGLS184L/Po= - + v1.3.0 h1:EQmPGgOo8/veRZbg+w2aspCFHducIoq6a4wEYRcD3RM= - + v1.4.0 h1:TCykTIM1VrxrEsglLtp4cbDHF0GwPU/pjMKxRpRmnJQ= - + v1.5.0 h1:mu575Bh7CW6JrjAjnQz0sTtHJvhpf3Gm5r2+tsWn6AY= - + v1.6.0 h1:uIhuV5I0ilXGUm3y+xJ8nG7VOnYDeZZQiNsFOTF2QmI= - + v1.7.0 h1:PuzlE8w0JBg/DhIqnkF1Dewf3z+qmUZMVN07PonvVUQ= - + v1.8.0 h1:eEDIzfiSg6aR5lqeQQ+YUhVLccsxykq1zcpWFOI4Kxo= h1:z8uPsfBJGUsnkagrt3G8QvjgTKFMBJ32UP8HpZllfog= + v1.8.1 h1:BVvL6H0nc+1y68nwIe8ZxwMIOEVUgg9y00yeD3GTDCc= - +github.com/cayleygraph/cayley + v0.5.0 h1:0vUVlZXasya23TrU7EYkMuC/MKYYOISf67r1VbSWCkQ= h1:8bQ/gpnJrp0qT1pSNE6eLN/f57dfAIFaVieI4vngp/A= + v0.6.0 h1:/ymlPTlkFE4FTLUl8uXNZM65JY+a3OcB/WB2XIaEH2Q= - + v0.6.1 h1:1FDMG/UfXk25dqnckxCACl9YecKqGQGmsMBMAogyZ7g= - + v0.7.0 h1:H8S4MEYZkO9IWEXfzpTJ8P3swqn9DbGlkiIKoF616wE= - + v0.7.1 h1:dQj+0jIlGV/cxIiWjO0ZmEnJS9PH35cFtTE3v6CAWI4= - + v0.7.2 h1:65zvSjK6VNGF92z5QhIcXLSo4v7q0IOc4V6hkDh77gQ= - + v0.7.3 h1:k7EdGsh+eRkL16stnozfJXCQOPy9ZOMKJ3B+bpXpOQI= - + v0.7.4-2 h1:UZ6aPfbNWCNx3kYXCqpxLWSuwJ5zraT+E9Bn8HdV6hc= - + v0.7.4 h1:ND1LuXaAk53ARjR9GxYHpO8NcTqgCvuckCTZHVbTYRw= - + v0.7.5 h1:eUDWKF/Xg/N95ihuAdUKVPQ+pgaOvuvQ9h0XE3ZAPic= - +github.com/cenk/backoff + v1.0.0 h1:G5x+fd8E4lParOjah6AuRY161LFjd2hAWyx6jI22b9s= h1:7FtoeaSnHoZnmZzz47cM35Y9nSW7tNyaidugnHTaFDE= + v1.1.0 h1:Smh2SqufUB51+RcyQ7/2tkPCGazvVSrqT96C80dFtr0= - + v2.0.0+incompatible h1:7vXVw3g7XE+Vnj0A9TmFGtMeP4oZQ5ZzpPvKhLFa80E= - + v2.1.0+incompatible h1:WZ2V3Qku5F7D7FC7l7/M9LV2i7fmIpVtpMUr3GiGU7k= - + v2.1.1+incompatible h1:gaShhlJc32b7ht9cwld/ti0z7tJOf69oUEA8jJNYV48= - +github.com/cenkalti/backoff + v1.0.0 h1:2XeuDgvPv/6QDyzIuxb6n36ADVocyqTLlOSpYBGYtvM= h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= + v1.1.0 h1:QnvVp8ikKCDWOsFheytRCoYWYPO/ObCTBGxT19Hc+yE= - + v2.0.0+incompatible h1:5IIPUHhlnUZbcHQsQou5k1Tn58nJkeJL9U+ig5CHJbY= - + v2.1.0+incompatible h1:FIRvWBZrzS4YC7NT5cOuZjexzFvIr+Dbi6aD1cZaNBk= - + v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY= - +github.com/cheggaaa/pb + v1.0.25 h1:tFpebHTkI7QZx1q1rWGOKhbunhZ3fMaxTvHDWn1bH/4= h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= + v1.0.26 h1:cxVZXxXCTNW7yYwnrTAhJ42LcWrLjp676j+y1AmmLKA= - + v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= - + v2.0.0+incompatible h1:Y3hEZw6ljXSjE0YQ3LueJMaedMkzrnfqV4fL6yGAzO0= - + v2.0.1+incompatible h1:Mud6xcHpxgb7qm2tWQFyQnIe6nTfBtDxFiRQ2IHSahM= - + v2.0.2+incompatible h1:09likKXoFogpRXyRLk+Goj1i6nACYJQn3T7pN3T0wcw= - + v2.0.3+incompatible h1:re76+eCsiyHF+4mmVDJVHYq3UMiDAbIASryJyPEnvkI= - + v2.0.4+incompatible h1:WAfRRtSHyWSGAHdcgsfeli9rh65YLinhaOzwuwg5LoQ= - + v2.0.5+incompatible h1:zJxULLIJRvO2VkqeRT1mX7e3oxuPnaFz9AXpEPNJ04s= - + v2.0.6+incompatible h1:sutSx+mRaNbeJUMCAtyqNWU/tQ0B/xBm+hyb1JQmQYs= - +github.com/clbanning/mxj + v1.6.1 h1:o+OW3m8R6L1hsUHBKGNmYChs8GDIFSPFtmeXT7fKW5c= h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= + v1.6.2 h1:BofqUYikgGcG/5OURYR5IF2LM4dPGZ93swoA80uxEBQ= - + v1.8.1 h1:5LCSILVRHt5NJKN04xonqopYq3l/vQm6oqBeC2oXYGc= - + v1.8.2 h1:KBWvavOh0B3laROMyum5QODKHVA8RkTZGyO1SrgJkRI= - + v1.8.3 h1:2r/KCJi52w2MRz+K+UMa/1d7DdCjnLqYJfnbr7dYNWI= - + v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= - +github.com/cloudfoundry-community/go-cfenv + v1.14.0 h1:rgK31f+7xrYkdfBGNDRqmXifmQgp4xKNu3uiFAnATOM= h1:2UgWvQTRXUuIZ/x3KnW6fk6CgPBhcV4UQb/UGIrUyyI= + v1.15.0 h1:KbnZgqqLp4O77PpZxkO/N7qY2dyWwzXLUHkGFYe5Heg= - + v1.16.0 h1:GRWTi7YruQRzHK4Xfe3iGnmkVQCe1ECirsv454NXUoo= - + v1.17.0 h1:qfxEfn8qKkaHY3ZEk/Y2noY79HBASvNgmtHK9x4+6GY= - +github.com/cloudfoundry/bosh-agent + v2.189.0+incompatible h1:Yh36in52BqIAqA5lc6pmHne6mA0ry1Bdc021WVp1WrQ= h1:7UvVn5vc/d6icLrBx6GhBlpSMwe2+x1C2A7x4TbPhiU= + v2.190.0+incompatible h1:SUns8ndwpkcKqyYcfoI9xDBzL/qPaqKOk5FCHZRh3no= - + v2.191.0+incompatible h1:IDnTYBeFGR+VWbsRmYiGtgMbQoQCceDtlWomOHjZVic= - + v2.192.0+incompatible h1:Fxwt9m7MEH8g2vJ1zW8Hp44v5MyUbIfI0LtbBEcR0/U= - + v2.193.0+incompatible h1:ExQHIDdP+hx6ZZtVXXvFzJrfgP3EJmLdJqTSKGl/Edc= - + v2.193.1+incompatible h1:N+c+2E52Rp89ZFoL7maQssJx6bsKLASx0VM+nXnJ2FE= - + v2.194.0+incompatible h1:18EIhDBQgwAM8uLGhK88HdQsIQRpQOQJDhiv7my6tSI= - + v2.195.0+incompatible h1:9NSLZq5VrflA18SGcPpdKTca6VvzzhBT4K1x7dJeaXQ= - + v2.196.0+incompatible h1:mr1/+uLzVG24S2Pnz79WbKYUf6rHxInUsAa+bnqf134= - + v2.197.0+incompatible h1:kquzwyJL1Vd1K5L6+1QL87DmAzqxB+6KG4VyF0iDd8c= - +github.com/cloudfoundry/cli + v6.36.2+incompatible h1:m8zsB/Y4TFagyzwaI5cOnf/obYyCzQixrLwB9GjTnZo= h1:uUVSLzSuwWNhis5+tY5XRUp66kLbHhBktg8b3ZfcJHI= + v6.37.0+incompatible h1:+qmgK5qS6lp0H9p/3SuyaBGwb+OW0YcM+5iCdhfUA2Y= - + v6.38.0+incompatible h1:K/T6wDlaQwafLTfXeR/xpo2Wy1KkYBgU4Me8nR2xPH8= - + v6.39.0+incompatible h1:UepfMeLAD2BvwZ1EfP9FhOuqQKbH5AjQwwIZaZwQs04= - + v6.39.1+incompatible h1:jqoGunW7txeJN3rRms/cO3QSJsQAJgfauP1nmhGZE70= - + v6.40.0+incompatible h1:AlWpueUXdvQmD9DO6Evt5X5O1hNmJXfwRUZD6k4yWqQ= - + v6.40.1+incompatible h1:0SOgAFaxL3xX7GJ+ZvsY2ivAsqQ1tcY1aMoI2L/D3P4= - + v6.41.0+incompatible h1:q3TUA3szij8K4opC2UXrqmvXBdDytPy/tYmtXWYVfy4= - + v6.42.0+incompatible h1:wccca2Nl23Ulk/fzZmrNNu/ETYxmVlIPvwdWJK1SkGg= - + v6.43.0+incompatible h1:ek6RenuwsD2GxOtkBY4206Oqh45OEUinMsXQ02cW/iE= - +github.com/cloudfoundry/dropsonde + v1.0.0 h1:9MT6WFmhU96fQjhTiglx4b1X3ObNjk/Sze7KPntNitE= h1:6zwvrWK5TpxBVYi1cdkE5WDsIO8E0n7qAJg3wR9B67c= +github.com/cloudfoundry/gosigar + v1.1.0 h1:V/dVCzhKOdIU3WRB5inQU20s4yIgL9Dxx/Mhi0SF8eM= h1:3qLfc2GlfmwOx2+ZDaRGH3Y9fwQ0sQeaAleo2GV5pH0= +github.com/cloudfoundry/noaa + v2.0.0+incompatible h1:+CeKb9WVomnhrFSQAvYuKgKjflElt6//aDlpIyAnNVk= h1:5LmacnptvxzrTvMfL9+EJhgkUfIgcwI61BVSTh47ECo= + v2.1.0+incompatible h1:hr6VnM5VlYRN3YD+NmAedQLW8686sUMknOSe0mFS2vo= - +github.com/cockroachdb/cockroach + v2.1.0+incompatible h1:snoi1AnyS2ol1MH5Kap7ELcw1JpyWUygo2kORSyWWd0= h1:xeT/CQ0qZHangbYbWShlCGAx31aV4AjGswDUjhKS6HQ= + v2.1.1+incompatible h1:zqb5A7qOXZ6apceiziiog51YNmxTHz/NoZOZl5EopMY= - + v2.1.2+incompatible h1:/HKe0BNF8zcdMXbYcg+vFlIEVw2WfJ0U+oWkQ79WORM= - + v2.1.3+incompatible h1:niMEggd4J7fImJIHAlMC0q0nnylF+SMZ2K1mqdoY8jQ= - + v2.1.4+incompatible h1:4al/4oL8KCbd28jly4RgFZnUakYrEDIByyeA/RrqXhQ= - + v2.1.5+incompatible h1:6UVgk4e1koeJduE1LaxCJzVHGo6qtGO4FyeFdD0S/KU= - + v2.2.0-alpha.20181119+incompatible h1:yrctfZSVelQcXI2KVEFgBn+Xuwu/8uggGFqvuev7fPg= - + v2.2.0-alpha.20181217+incompatible h1:qmakWkQz9zaD3cl3q+EmsdwzjfjWu5TjJLyDAdMbUmM= - + v2.2.0-alpha.20190114+incompatible h1:nzgynLMrd812xj166mUqG2e8RjUhC3XiHLigJ1AIK0Q= - + v2.2.0-alpha.20190211+incompatible h1:Kk5g/ndezayIj7F3LQCFeTNe+yGGJsj3TWsybhytgsA= - +github.com/codegangsta/cli + v1.15.0 h1:XQ8cvKGFCHeHZsqkyyjsKG2i4v7xoEuEbLqiIFQZ5RY= h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA= + v1.16.0 h1:A4v+152JTrkyHhedr4bIuZMVMS3ydNfvpXCq6Uxj4W0= - + v1.16.1 h1:aZvyIKV0pjB812U6tD71U7m0bbTxDBHggFNagvTfyhE= - + v1.17.0 h1:K1LmHEkqORKbkRnb0YacGC+dR2+xeN6v+f/pFniQwJU= - + v1.17.1 h1:aBmEKUaSVLD8WP1d4E9JSiR0pbOc/fNQB4PI7vVdFyY= - + v1.18.0 h1:K+szYvi2B28coQzhPZGac9o/JS0QZkvYAjjVi0+O2cA= - + v1.18.1 h1:VohEUscvOrgFKLWz3iq/OkBayUY3yG/wVUYQtj5RPes= - + v1.19.0 h1:UJrnqaJr2Qy3WHi9T2jZmubjk4JudCdTcrnkAm5IDzk= - + v1.19.1 h1:+wkU9+nidApJ051CVhVGnj5li64qOfLPz7eZMn2DPXw= - + v1.20.0 h1:iX1FXEgwzd5+XN6wk5cVHOGQj6Q3Dcp20lUeS4lHNTw= - +github.com/codegangsta/negroni + v0.1.0 h1:VapIFHO0LpzRe15N2GqEVsAy5EaUs6HpzE5Wag450+4= h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= + v0.2.0 h1:MqNkcR831ZSHwZmP9IdlZWGMxc1T8briBhBW649DkXs= - + v0.3.0 h1:ByBtJaE0u71x6Ebli7lm95c8oCkrmF88+s5qB2o6j8I= - + v1.0.0 h1:+aYywywx4bnKXWvoWtRfJ91vC59NbEhEY03sZjQhbVY= - +github.com/colinmarc/hdfs + v0.1.4 h1:7inMUiDV79eSDV2NNp+/9nq5w3vP6E197l7CiYlaNLQ= h1:0DumPviB681UcSuJErAbDIOx6SIaJWj463TymfZG02I= + v1.0.0 h1:WF4obl7LEXYuVnv9PKI6sKpH9fEmyg5yGByOlo25/vE= - + v1.0.1 h1:L7hzAmmaf4m0WYagoW+HIi+kN3D439ihmd7kEpN3aos= - + v1.0.2 h1:KH25/yu1lNPE/KU3IZDnB2IZ23hPuQrj76ZBz+JQ4Fk= - + v1.0.3 h1:nC283+++Nyrl2RznLQAVprB7T+myovSgqq64kosP0Ek= - + v1.0.4 h1:ig284slxQJI6PfRKpytNMFSmC4MFW8h7YlcowDXHzsM= - + v1.1.0 h1:eUpeUxFxahhQ4kGhagKuHzwURmMwYOJ7WtCAMpfblzk= - + v1.1.1 h1:/CIwLFhGUOiC9q3E4/H2RPHiS7fD9sU776puryFlLq0= - + v1.1.2 h1:mLSI9XCNEbhylIuNRtEtN92lLJ4Qvdyoj0a6FsgxX8E= - + v1.1.3 h1:662salalXLFmp+ctD+x0aG+xOg62lnVnOJHksXYpFBw= - +github.com/containerd/containerd + v1.2.0-beta.2 h1:IYGcR47Wxj8k8+jIF7882PaG4VcIK8cBtXHKULsw3Bs= h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= + v1.2.0-rc.0 h1:OafxxFaCdxGzzaqmsJIdu1QLDI4OnG1natz3h4Wp0Ao= - + v1.2.0-rc.1 h1:gNCIPosHSxnfW3JGo007/hdHLp2KRBYBC7Se6nzJwlc= - + v1.2.0-rc.2 h1:h0zfrUgy5Xb9zjwqlCVOtmUDswFebXC9TBj1Ynx2Hy8= - + v1.2.0 h1:0NP+uCCcSf7IHOEw/WE1vgcKh6DKIlTqqfh+dtoxDhw= - + v1.2.1-rc.0 h1:YDXzJFhpqcsrXEQvk3VXBh+CFDff0lbYUbWSbt+9tdc= - + v1.2.1 h1:rG4/dK9V2qa5a9ly/E3CtG6/FBXfmSkDo8An3ea2Yt8= - + v1.2.2 h1:N3tAHxrX+byqfAsENdDWLSMtFD4thUxK7kFElUl+8z8= - + v1.2.3 h1:6TvLXAk7vuAF72J3p6Fcw6c7Z8CDZFbZrHl+XIovyqk= - + v1.2.4 h1:qN8LCvw+KA5wVCOnHspD/n2K9cJ34+YOs05qBBWhHiw= - +github.com/containernetworking/cni + v0.4.0 h1:oWucloJfoPBFrFUGJ1JB69DI5Y6gL7GWIBEU69fzSvo= h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= + v0.5.0-rc1 h1:70TFSlNcsSxNp0i2K6NeXcsgx9/x3juCXRDBNBIrNCw= - + v0.5.0 h1:nyWKaB+/FIk5B4t1msH8yoZCZU5Z+H1bl9nOoC7kU4g= - + v0.5.1 h1:0L9JEX+A/WfDG1kp5PXrdD8uWtlJlNJuLnhizJzrDWo= - + v0.5.2 h1:/nFPNGJQu4yiNvXxH31qL05FIyGG5Y/p0YxuUutl+PE= - + v0.6.0-rc1 h1:BQ2TcgoQbdbk5SLaUTY+N282hMhoI89QZd+9CIhvA84= - + v0.6.0-rc2 h1:re+FKi1FMnMMy3nY3iYuMdtyJR2kk2KTAVteyZnxEQ8= - + v0.6.0 h1:FXICGBZNMtdHlW65trpoHviHctQD3seWhRRcqp2hMOU= - + v0.7.0-alpha0 h1:jNUuiQA/JPwq2IcIdwxbJ6kGsXvLs2ziOtJMBAu53Ms= - + v0.7.0-alpha1 h1:a3TVZWNd0f5Ml+l8CQC/KzzbGBVP96wXHIft1QgvWuQ= - +github.com/coopernurse/gorp + v1.2.1 h1:xpP6tTdvqeKvKEEKy3dj1r1+ubwYiwGRpYeXDe1Mgno= h1:wkfIkQktc4uuBo0kLNE8tMMN9okbsTa2orfZvBaL9F8= + v1.6.1 h1:U51KxtIsUzG3mRR5QXNIfvSTyw9tUlZOjwsvgnLft+w= - +github.com/coreos/bbolt + v1.3.1-coreos.0 h1:1OdDLDNDDBL667hjU02PnF6erC/bdeXAtz9IQwp29vE= h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= + v1.3.1-coreos.1 h1:crb2YOmpHMVsND8Ug24uvqgL8rUmJlQc+UVfUlMHalc= - + v1.3.1-coreos.2 h1:E6ftWB6kbWjgCS2eQojRIAUsmCnoWPiYVKDu4GBsvtE= - + v1.3.1-coreos.3 h1:sP70znHBV8469pbVsmR2G6wvd2oQwgxtgWyZvV3KVBo= - + v1.3.1-coreos.4 h1:8bk3J1/F3lXGhVLhWkFutY4DTJeD7GOPBHt1rChv+QI= - + v1.3.1-coreos.5 h1:e1dvLp11PaS48015lANrxa1aest1AkpEi4Hx/eLQQ3U= - + v1.3.1-coreos.6 h1:uTXKg9gY70s9jMAKdfljFQcuh4e/BXOM+V+d00KFj3A= - + v1.3.1-etcd.7 h1:QC4+fs/lXHXgUdHy3y4FPhky0OSvgsSPlNsxkLbX/C8= - + v1.3.1-etcd.8 h1:xTcsP8rG1dLB1VRhYSyf6sFQnIU39vC7OkbtEU8bWIA= - + v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= - +github.com/coreos/etcd + v3.3.3+incompatible h1:moXyafqr1NI/E1v3IVz8BovXBjQKa1Oqwtsz7Lg38sM= h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= + v3.3.4+incompatible h1:jkDvc1ZyHw2mY2UsX66y+GHKPIIN7RhdBRDsr8m94Xg= - + v3.3.5+incompatible h1:0qcOHgI5inKvd8lfaOD3KDC8QH2JQC86a1n81KXkRS4= - + v3.3.6+incompatible h1:4tm4wgWV5rLFlAV4K6kj2zhSBH3bWvzQUyn88VgN3fE= - + v3.3.7+incompatible h1:2uTvFq+hQI6TPmBUJMBbqeBy0RcEkKFw67tmK56xD7w= - + v3.3.8+incompatible h1:uDjs0KvLk1mjTf7Ykd42tRsm9EkjCQX37DAmNwb4Kxs= - + v3.3.9+incompatible h1:iKSVPXGNGqroBx4+RmUXv8emeU7y+ucRZSzTYgzLZwM= - + v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= - + v3.3.11+incompatible h1:0gCnqKsq7XxMi69JsnbmMc1o+RJH3XH64sV9aiTTYko= - + v3.3.12+incompatible h1:pAWNwdf7QiT1zfaWyqCtNZQWCLByQyA3JrSQyuYAqnQ= - +github.com/coreos/fleet + v0.11.2 h1:OpO15BcPsSYYusarRQVd8Fl2eLKq1OgnxEfFF0dyvSo= h1:dcu9wb9bWRsaZDUDBAyl/qApKloFe+yoeC3M8dV6FYA= + v0.11.3 h1:j5Tqk2KF1KQ4qeR87eZ1xIwr1DP69wyMeANiiISlDyY= - + v0.11.4 h1:zDBez56EEqyAHx/f5AJMZexwSqOG0nObI9rYkFjMGkE= - + v0.11.5 h1:Qu1zVN5dOKmzpDn40CzF4nXk+bRpQuc6CJ4MnuIsJkA= - + v0.11.6 h1:NFx0oBUAZmhwfnsFG9el7Xc3DytgpQ78vhuwU5HmH+4= - + v0.11.7 h1:BlugR/bvv8T8o0uW9wZZvQ4Z6ZkK7PnxaNYJzTFgHEI= - + v0.11.8 h1:xzEWEiTUhsbu2Zk7oHmvLFIC9spf3o2MSqFSW18bQK4= - + v0.12.0 h1:Df7DI3LOW26dh/6nyX8dnCA7BBFFkO0q2jFM5fa/ScI= - + v0.13.0 h1:hQFVk/fbltdhFTPR0lMqwn++J5VKUCURv1+2Va+prGw= - + v1.0.0 h1:xyIHQvFdFW3G36HL3qMWsQLQ0OWbh7KvcRrwqF0dNeg= - +github.com/coreos/go-etcd + v0.2.0-rc1 h1:fGMM9WvZ0vZe5mRiPLMkAII4h8XSPYcldd2d/Gja6Oc= h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= + v0.4.6 h1:v7gkaX+WwHRnP4Bl4Sc6NaYNa5U7VMDpFqwPMbXWXOE= - + v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= - +github.com/coreos/go-iptables + v0.1.0 h1:Vb3SuBct2T4LtfA1VASiDhE4rVMvwRnEhlKSqFb0YvQ= h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= + v0.2.0 h1:RmVRALeVCicZcF3rF05e0ooU9x9TmalN0HcT4hkhG5s= - + v0.3.0 h1:UTQkjHl9rPwwtXZhXbY3T932cV9aUnKlSsZ7YGfJVXM= - + v0.4.0 h1:wh4UbVs8DhLUbpyq97GLJDKrQMjEDD63T1xE4CrsKzQ= - +github.com/coreos/go-oidc + v2.0.0+incompatible h1:+RStIopZ8wooMx+Vs5Bt8zMXxV1ABl5LbakNExNmZIg= h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver + v0.1.0 h1:/7eIWhjNpsljQCSU+5NaZzu7HmMvoWnMqOmNZljz1f0= h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= + v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= - +github.com/coreos/rkt + v1.22.0 h1:MiJBjcLSRJgB86SfyqD+LpCynNuBenCquj11xi5IKd4= h1:O634mlH6U7qk87poQifK6M2rsFNt+FyUTWNMnP1hF1U= + v1.23.0 h1:ehH3hL6aqgFiAuDGVBrFVNtBf/6khdjhDPoCRbAmUlY= - + v1.24.0 h1:v6JVSfu8X3r9pJX6tYwdIs2LS0o76E9aisXkrQcuNEY= - + v1.25.0 h1:4rDjbXDtLwReumvn9/fH0D4aTXWXk2kpUcpjJNH2F/g= - + v1.26.0 h1:W8o+Yq/nKrqDOgtAfhusAosi11C5EHSFwIho02Qq4E4= - + v1.27.0 h1:OPLnOwaV46mif6IjKGjL80HYq96pfqyLfUeJKTYjGRE= - + v1.28.0 h1:EUsbk1zTx5jF3uEQzkWK/gAfOv0xyRDsKhIbtmJPHgI= - + v1.28.1 h1:v2Nd8Zn5GQen/F+GCTn7cWRsdB/HBMOSpEO35f4zwog= - + v1.29.0 h1:YEVlrEX/ZW8n8tHHSuPbDOPWewpSCIF1DcHw0nHPEXM= - + v1.30.0 h1:Kkt6sYeEGKxA3Y7SCrY+nHoXkWed6Jr2BBY42GqMymM= - +github.com/cpuguy83/go-md2man + v1.0.1 h1:5hPj0PAocb2UrJ9Zhr36Qw+Bd+D/YdcwKFj2pT9ENkU= h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY= + v1.0.2 h1:VVmqbsnngY4dm7hPLp+fLYx5M3B2NgBp+7oQNVuNAv4= - + v1.0.3 h1:IPx6io3Yvb5JMk49BHkvmTMNYid+Z9YsYL/V8ROC418= - + v1.0.4 h1:OwjhDpK9YGCcI5CDf8HcdfsXqr6znFyAJfuZ27ixJsc= - + v1.0.5 h1:1T5gaHeuXe4gAhG/ZKRPd4WbbdEFOVYkNGTZ13+fktU= - + v1.0.6 h1:oNbTgn74tKz6PzZM2Zpmm04rMdAleoj9GrYC3SCKiU0= - + v1.0.7 h1:DVS0EPFHUiaJSaX2EKlaf65HUmk9PXhOl/Xa3Go242Q= - + v1.0.8 h1:DwoNytLphI8hzS2Af4D0dfaEaiSq2bN05mEm4R6vf8M= - +github.com/cznic/ql + v1.0.0 h1:W2I+yOLLPgrUh0knGBsvnc/d2V4TeWp9xBbI8xFLVdM= h1:YhViR8X3dW5uRADlFXxbh3suMUVYoCeAdyhweCWukWk= + v1.0.1 h1:9R6NwTYlIfpon+LNndB3eRZ5HuMczHlpgF/l5VxqfLA= - + v1.0.2 h1:2N2Vdj48/tMjBymxTXVKa2XsAWsZREifAnHKxdUiY7U= - + v1.0.3 h1:fGNAaW9MolJmMjDm/3EUqdTmM/PPvrSNLt8qJh0zpNA= - + v1.0.4 h1:LgBptPUTTk0mtWi+NZjNuQSbizMc2e88hUGoAjpy31U= - + v1.0.5 h1:nh3G9w4iAqx71/h2XfQWM/IMj+I9Lw479phJ/e/Fcpw= - + v1.0.6 h1:97U34dzh5uJAUmbkgt06M0tQH52//PRvl0q3n2HDpwY= - + v1.1.0 h1:/ByVHV7ADDnAVCNzYvJGBnCYF+YR16qGPX4Q+tBRK4c= - + v1.2.0 h1:lcKp95ZtdF0XkWhGnVIXGF8dVD2X+ClS08tglKtf+ak= h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE= +github.com/dancannon/gorethink + v2.2.0+incompatible h1:f96+JZnNpTm/cD3wz7f+IIdlXJlRRTU2Tq6Pu9RIDds= h1:BLvkat9KmZc1efyYwhz3WnybhRZtgF1K929FD8z1avU= + v2.2.1+incompatible h1:Fj5UJxnECayN88GJ4nLcrsW2fORBJU7h8rG2l/o+CnA= - + v2.2.2+incompatible h1:pNxbnZHZfuxsCXajrhfBTLVz7Psu3j1BDZGGa2moLho= - + v3.0.0+incompatible h1:OOGAzliummoaEOFAiZTYH6EvNO5O/m6X8AjpfyfNht8= - + v3.0.1+incompatible h1:O2gbvj46lA3g43hN2raM2aUGBgBOWGZnkN4vV45oaaA= - + v3.0.2+incompatible h1:YkK7LB7m/CLigNDSLFZaWSmnRzf4GDpXDrEpuBFqpy8= - + v3.0.3+incompatible h1:VFL9GPZ5DMdj34nviX7RG5PSxOtbA3XiAz+XuYcAnm0= - + v3.0.4+incompatible h1:CbiS/bFQunLtttIgPO7U9miUBwlBp8PbqWIqbuFPD4U= - + v3.0.5+incompatible h1:AenyUfDNo7CUhNsA9qGVDIO/b5GzrnwjBRLZvlkb7jk= - + v4.0.0+incompatible h1:KFV7Gha3AuqT+gr0B/eKvGhbjmUv0qGF43aKCIKVE9A= - +github.com/davecgh/go-spew + v1.0.0 h1:TJ+L3B1N2zmDTa+nwZ1QMI4Dn2H85x5QbmgUlksLY7Y= h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= + v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= - + v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= - +github.com/dchest/siphash + v1.0.0 h1:8nHH2JstXfT60brTp2MOmeYHgLesIB7f85o6XBKllGU= h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= + v1.1.0 h1:1Rs9eTUlZLPBEvV+2sTaM8O0NWn0ppbgqS7p11aWawI= - + v1.2.0 h1:YWOShuhvg0GqbQpMa60QlCGtEyf7O7HC1Jf0VjdQ60M= - + v1.2.1 h1:4cLinnzVJDKxTCl9B01807Yiy+W7ZzVHj/KIroQRvT4= - +github.com/deckarep/golang-set + v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/deis/deis + v1.11.2 h1:YfAeyyIj8WC/W1LqYgQSiqe6Ne9WxbXqOhtcYB33EHk= h1:8wwLzvV6ikTNSIAIj8CTdkloCRGy7C3wMrkB3U00Nx8= + v1.12.0 h1:4F1oOQak+ysbLH6eCqqYL7eey1c041QZJaGvB0/v4oE= - + v1.12.1 h1:fxE7grqHynY2UDF9v/AtdhMcYRWGKwnM070mh+n7/UM= - + v1.12.2 h1:e2r+XiCn/X9t7EtmJIny5itFPdrB7oM1e35i3gOf5g4= - + v1.12.3 h1:EbDDhEYYRMEvyeSOgO+kzPjistPvrfpDiGHTW++wLMc= - + v1.13.0 h1:/+S+PoBhd1KYot8BhrWaP60z17jDqnNHGxyxK1LAvG0= - + v1.13.1 h1:WphZ3nF5n6oa27mRZoyRpdHLN7ztGqzNcSwRlNKOON8= - + v1.13.2 h1:s/13DAN0CO6vJG7FiuzwdRjtnwC3lozaoLlZSBameek= - + v1.13.3 h1:an/Fac3S2yc6ai8I7v6/f7qoFkjoBIaZMdOwwOrCXwo= - + v1.13.4 h1:RApXfuncu0isEEIshdGQd2jmaBRRMSE7nLQVKK62zgg= - +github.com/dghubble/oauth1 + v0.1.0 h1:SsG7ISiFFawNGiUDr3+1FGoEvCxu/EBo0fkPM4H32OE= h1:8V8BMV9DJRREZx/lUaHtrs7GUMXpzbMqJxINCasxYug= + v0.2.0 h1:QolJrVUMbkm4KqE/izyfcGDUjs0EqXz+BLeuz/wVQ6c= - + v0.3.0 h1:tEj05GFDD47m1ZD7XPwBTcKi4KgKxhwNImmoREbxAbg= - + v0.4.0 h1:+MpOsgByu02lzT4pRGei5d2p6nAgj8yDwF3RASrgNPQ= - + v0.5.0 h1:uJqX7Rzr3QRmp2slUWqI9Sm8NoP65AMiyXiijOWWLvQ= - +github.com/dghubble/sling + v1.1.0 h1:DLu20Bq2qsB9cI5Hldaxj+TMPEaPpPE8IR2kvD22Atg= h1:ZcPRuLm0qrcULW2gOrjXrAWgf76sahqSyxXyVOvkunE= + v1.2.0 h1:PYGS9ofwbV9nfhB1kYjB1vtXshMxlp2oQxTMMXVJ5pE= - +github.com/dgraph-io/badger + v1.1.0 h1:NB8GzptcU1D5Lf3KNYIchxtDPaduDg/5LYO7TnnC74A= h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= + v1.1.1 h1:P5UKapWWkEE/3A7fnJ5AX2AAEViIjlHjbgR/PgqXmNs= - + v1.2.0 h1:FpzZXaTZEP0EtRtxrSNVHpK7G7Rep6N5JAvBkLOWrcM= - + v1.3.0 h1:C85TWgcBeo91E85jbWwz2tM/UgcH0F/aQJL8svIccCU= - + v1.4.0 h1:3W68dJQBX97hQNZk5IO4gN8fDMOSCy6MD2F0EXzeIPw= - + v1.5.0 h1:Iq6peB6gz+ABCQQuxa7lOj9j+knLvMYjyhydw8fiSxo= - + v1.5.1 h1:B2S9OJ4JNKBLcc/0rzklp7wS6yjytvsTekWE/7YZRa0= - + v1.5.2 h1:nIdKlAGfMD8n1hU0/7CK9KhtuJt16BVmlGSDBNOLCQw= - + v1.5.3 h1:5oWIuRvwn93cie+OSt1zSnkaIQ1JFQM8bGlIv6O6Sts= - + v1.5.4 h1:gVTrpUTbbr/T24uvoCaqY2KSHfNLVGm0w+hbee2HMeg= - +github.com/dgrijalva/jwt-go + v2.1.0+incompatible h1:S8T+eIrll7F0MrbgOO7jWvVmP1B2CsLwFvjXPOVM8Jc= h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= + v2.2.0+incompatible h1:uxMuTjjks/pNHqM+CN0IGKK9ZSs3j4NWZFnEm/5yGoY= - + v2.3.0+incompatible h1:GS7vCh4X6j+n3crClgYSu5RjPBjd9iHeQ/Se3i2q7h0= - + v2.4.0+incompatible h1:5PCcRjlXqAvUY9W5yoWUyUp3i+h07i8RCn2s0V959Ic= - + v2.5.0+incompatible h1:k57pRbmSsdonRfxM9oTC2fR40mlKHsuKNZ3UlrY7u24= - + v2.6.0+incompatible h1:1O2NahKrpPnTN8Jy7ffR7S31wnTZIM4PEzrF8br1R4g= - + v2.7.0+incompatible h1:54T2qn/iIwjg7JGrMsKD3WID0+CaYUrJgyXDM5ckYLk= - + v3.0.0+incompatible h1:nfVqwkkhaRUethVJaQf5TUFdFr3YUF4lJBTf/F2XwVI= - + v3.1.0+incompatible h1:FFziAwDQQ2dz1XClWMkwvukur3evtZx7x/wMHKM1i20= - + v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= - +github.com/digitalocean/godo + v1.3.0 h1:skAw84H7ScMEoFJk9ASHlJz6A0Bk48Us7K04e7uXwOo= h1:h6faOIcZ8lWIwNQ+DN7b3CgX4Kwby5T+nbpNqkUIozU= + v1.4.0 h1:W0WhkDf627pKcsjdAJ7kmViGoQePnLdqyXJwO2OxN3A= - + v1.4.1 h1:mm4PBdiicsWxrywnCNmoBGV90CEqHcb+j994FGQ4NVE= - + v1.4.2 h1:AOsEb4Sa2OpfIAZluAvA5LGp61uq53tCNs+BZte1I28= - + v1.5.0 h1:S2HcGAP6RQ46tXUmQ6lTJP+HzOGB9XvCxA85eccb3Fw= - + v1.6.0 h1:BjFbURUz1LDimGfApIWqzZiSrJFbtyGYOHfSRq/Voi8= - + v1.7.0 h1:JIh+VoKGbK83feLAsgx5IPMG2VHK5/YjFVK14yDXEPA= - + v1.7.1 h1:bc4MQyL5ou0bsIx3PcVRDO15xQyyXFbJjE9aE6H0QPc= - + v1.7.2 h1:n11Hu42Gz2jG+IOAELoQS8zlZfPG0N/lo/k0DtdYp+4= - + v1.7.3 h1:0tFPilFBDsVSiAKF8hyzj/MAmRYxNc5MGhAiYZYVrpo= - +github.com/dimfeld/httptreemux + v3.5.1+incompatible h1:Sfytas3Oljs5RAkfdWG6jDFSBjtfI1fDhFxib/2iqOg= h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= + v3.6.0+incompatible h1:jteMiDNtk9+Cp+WmdLaQ9OUw0lF/EFhwi/imunkcDmY= - + v3.7.0+incompatible h1:cuOxlKQM3w56FmqBmgECAiDT/yTiCBftcGbCGEZODWg= - + v3.8.0+incompatible h1:GkWWdeNjnUXeTXPMqNyC8VLXrZbHLVRB1+kpI2viEtw= - + v3.9.0+incompatible h1:RLjwORnEXePoxnZsEbSdOW1MnogylIzckiBIOAjx3gY= - + v4.0.0+incompatible h1:e+RyY+i9Z77Ww015gYKYJhWIQXvPHJOFgzj5XnWcVY8= - + v4.0.1+incompatible h1:q52LJ/5vhen7pnv/LmpyTZuALCQuyyNrl1MWpuI2yiU= - + v4.1.0+incompatible h1:atId6gcRAedcZnVuaNuyTOMu/L+U2MCRaqH3kn6yNkg= - + v5.0.0+incompatible h1:WnFKlZjOBy5nNALaVfT/yG4XCzxpHPQ96C/u8AP+x6s= - + v5.0.1+incompatible h1:Qj3gVcDNoOthBAqftuD596rm4wg/adLLz5xh5CmpiCA= - +github.com/disintegration/gift + v1.0.0 h1:whtptdjB6gheQRwEQ8K9a88IGELuyxYuJFojBfQLpRI= h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= + v1.0.1 h1:CnLD4dFNei6R+1bGbtR9r4z1HO7rqIi7+EgZWQY/gC0= - + v1.1.0 h1:q2eJmb3SWqnFH9GonP+K9P06Jk+861UKol5/5juXxz0= - + v1.1.1 h1:T0hwEROfntxovpHD7rokgRNx18see5mwdx4PagQ4oZQ= - + v1.1.2 h1:9ZyHJr+kPamiH10FX3Pynt1AxFUob812bU9Wt4GMzhs= - + v1.2.0 h1:VMQeei2F+ZtsHjMgP6Sdt1kFjRhs2lGz8ljEOPeIR50= - +github.com/disintegration/imaging + v1.2.1 h1:2sSJ9O5zdLUbo1H5ul1hxEi/s7uMfCBVXRzzVXp3Gwo= h1:9B/deIUIrliYkyMTuXJd6OUFLcrZ2tf+3Qlwnaf/CjU= + v1.2.2 h1:Vm71h4WNvlNbmZSerkAD0Qqg2sV5Ojedd8+0u+cjbO4= - + v1.2.3 h1:OjtUcbVpC/wqPdyUzOdFFF0Ewj1+5hsdYxwGiE68BKg= - + v1.2.4 h1:eJRPGef+mQ4WZ8cED/pqElxW4+79zBjJYTjYv48GZOM= - + v1.3.0 h1:AihaBC+K3RHP7JL8scqq2GgNQhVzMcCYh7gJbAjAvpo= - + v1.4.0 h1:iQR5SpN9kQx8/8Cs33yDQUCRY4aEtBX8en6o6IYS/oY= - + v1.4.1 h1:cwtUiS5AYdPT0/GRE3EFHnT+ajKBaYsqzPKOMmqqudk= - + v1.4.2 h1:BSVxoYQ2NfLdvIGCDD8GHgBV5K0FCEsc0d/6FxQII3I= - + v1.5.0 h1:uYqUhwNmLU4K1FN44vhqS4TZJRAA4RhBINgbQlKyGi0= - + v1.6.0 h1:nVPXRUUQ36Z7MNf0O77UzgnOb1mkMMor7lmJMJXc/mA= h1:xuIt+sRxDFrHS0drzXUlCJthkJ8k7lkkUojDSR247MQ= +github.com/docker/containerd + v0.1.0 h1:TMb+CQk29b9dAOwux0UQhgP85/tC5Mm6OrI5itCD7+4= h1:yNozov3Y4G0QO25BR7CwoSEGPvBQLXitaauXtxebl+Y= + v0.2.0 h1:uWiAs1d94h7pJ8hGxilTP4NSWvcpsSQhII6zcNMNkog= - + v0.2.1 h1:Cnev0G9QmUUXrBnMtYaWEmI8ulRro2Q2GCFyxGq3WPE= - + v0.2.2 h1:oq/n4rFTtQ0YTY3incyeMhvPo2e2XxoLKDfIbLAA3yw= - + v0.2.3 h1:h9L1a6cCk+3wOeNeBt+DJxziJnRBpj/27Ja9yUY6g2E= - + v0.2.4 h1:kcPq4DBVt6mSf7YOKwo+g/oyLVZ5+CjAPzfvDWaWz88= - + v0.2.5 h1:QhtWftJ75KdmBMJ4/0ctPGfPr1Gfs5vOk7QXRX0v3p8= - + v0.2.6 h1:bCcR9drrwxWpOXWO5peqo6gm5LiKNy78WOW/g2gwuUs= - + v0.2.7 h1:FjHCZfjUmFkO5xLl/xDqu4Uaq0CYXZ1KkZKuUHyMRrk= - + v0.2.8 h1:Uh3MiqAr3PUVT12rgBQpwZLfV/lvu8D7hVkrJ/evuWA= - +github.com/docker/distribution + v2.6.0-rc.1+incompatible h1:DdOu8ihP6OokkRb9mcR6zfrs7qZFQYMQubUkRNwxaCY= h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= + v2.6.0-rc.2+incompatible h1:EamBfeQ+My8FWfOANNc/JdV7LAyU256HbBoO2hLo04w= - + v2.6.0+incompatible h1:8hxvSzNSatS/Ik5y595JXjKnUjd/Si3lMM8irrl34PU= - + v2.6.1-rc.1+incompatible h1:8b9G8zGEzX0X7ddZWJBta+LPx0P3FOmUyzeD2LU0MQc= - + v2.6.1-rc.2+incompatible h1:/XKDQO2mXt96NI7anU/cGhLbir5zJif/vD1WQXGZUTI= - + v2.6.1+incompatible h1:nWLG5KfUJK1PBt7i7iLBE8KpgWVF4uXwNfK1YOi1K/I= - + v2.6.2+incompatible h1:4FI6af79dfCS/CYb+RRtkSHw3q1L/bnDjG1PcPZtQhM= - + v2.7.0-rc.0+incompatible h1:Nw9tozLpkMnG3IA1zLzsCuwKizII6havt4iIXWWzU2s= - + v2.7.0+incompatible h1:neUDAlf3wX6Ml4HdqTrbcOHXtfRN0TFIwt6YFL7N9RU= - + v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= - +github.com/docker/docker + v1.13.0-rc2 h1:816gJHhXHI2MMuvNI0oUtA4tOxqcTWYjtYwqSr7a9Fo= h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= + v1.13.0-rc3 h1:p9v49W4qKQmWR6vZl8jfvAYRyjzVLv0z3dHgA7RNO88= - + v1.13.0-rc4 h1:mxHN7wjGO/ogV1HaNZsaYWzed+NLlPSPfKhup/xqpho= - + v1.13.0-rc5 h1:J5Ztzo7583rNEXBaavIyz1tcNB7oP9md7OuNUvUEV3U= - + v1.13.0-rc6 h1:G/yPCx94tZqlP+5eguVY2ieDFWQvfMoHCRjyl+RIkCs= - + v1.13.0-rc7 h1:DRywiGPrXjuceK3YyB0sxreg9TduviYZvSSh5G1jS2Q= - + v1.13.0 h1:A5bSnWdwEvPOZ72/0cMjcYIyuvLCHk/KVrT8qOwdKkw= - + v1.13.1-rc1 h1:TRvGNDqqo/e7CArgPblEI+pvUFHM4in1UPtuwuwO2N8= - + v1.13.1-rc2 h1:4cP9ZpIRaTsEECeg+lOpR0Txm93gixo49VjuI+E+v/s= - + v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo= - +github.com/docker/docker-credential-helpers + v0.2.0 h1:KtTV34fmVBrwF2H96c9/MmxRhMneVDxlNbwlrH0aN1k= h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= + v0.3.0 h1:FOPAhzCCjbiZTs7B1m5REioFVT/srLnFXiSeLO128c8= - + v0.4.0 h1:6vP4fWW/rUUyyBlT+DeZi5ueMWp1n4YRkT1kzYC7Ls8= - + v0.4.1 h1:ctHYuzQopMGaPgNpgBn0xiY/TqVcWjjdprR8SSsF1PE= - + v0.4.2 h1:SADvzUM5kYy7P38edX2cFkri5UnKyS6HCrzfC0V0xUA= - + v0.5.0 h1:2B+Y8H9kp4G1UGRWWxxNz0D0aXVHUA3RCnI2/Pm4xNI= - + v0.5.1 h1:57nLGp6DCMQTz4Otl2bWX7MY0wcuQDk9EQrX0+OpF6M= - + v0.5.2 h1:Zz3b++zosJsPIy1Rnus+4LO2T1Ot5BjC3eT1Qk9XFjE= - + v0.6.0 h1:5bhDRLn1roGiNjz8IezRngHxMfoeaXGyr0BeMHq4rD8= - + v0.6.1 h1:Dq4iIfcM7cNtddhLVWe9h4QDjsi4OER3Z8voPu/I52g= - +github.com/docker/engine-api + v0.1.3 h1:jklhkNWOIpdm33EDXZbS5lK2iffmxkyB0GL7ipQPxGw= h1:xtQCpzf4YysNZCVFfIGIm7qfLvYbxtLkEVVfKhTVOvw= + v0.2.0 h1:QAxolvM0QMlJK1RawCNNAAdFTpZBb7hE2Ep2fpdm2S8= - + v0.2.1 h1:fnDU2LrRVcZvaaFws95ekr/i3NRH3bFPEgDSXhV7oLM= - + v0.2.2 h1:49f9D03xUALK02A7iS0mnYd5F0oJ5AynQFzyESdY9tQ= - + v0.2.3 h1:eRUM6H5g52nZqFrrXFRPRKNbz/UmcLM2EgqUD8Zwe/Q= - + v0.3.0 h1:jeex4VYn27z2DFCnL8vcWld/o46IgcT3bIj3DlOAqJk= - + v0.3.1 h1:d50wl50my0c35Acjdm2AidAW7XU7dbWC79Ue9r0aNU8= - + v0.3.2 h1:gRSoZwtRdgDtOOK1mRfYNGoq+LaUTSAMN6FylqhMZyA= - + v0.3.3 h1:+qfDCFf8WGX2s5UgerD5BZtxMC8LySq4c6nH/mrwyn0= - + v0.4.0 h1:D0Osr6+45yAlQqLyoczv5qJtAu+P0HB0rLCddck03wY= - +github.com/docker/go-connections + v0.1.0 h1:CYk/56klHjBmLlbozTT8SPTZc/Wetw1IKu168WUZi5w= h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= + v0.1.1 h1:90BpDo1ETO0J9w7hKZkCDRrjbHniqjsy+VaP7MbLEN0= - + v0.1.2 h1:X2kEYuCRBYv9hH68gobBRGZhMGcEBMDgGHtavCfwUyE= - + v0.1.3 h1:1B+oHEtDXzSjbetalX+YNkw6qV1/uOybnv27B7FQDTY= - + v0.2.0 h1:tV+S3i76CmPRYmR3NMDUFyr2HTP+3gL+xEPy146TPig= - + v0.2.1 h1:XB0Pr+bR+RGw8D0C/ADeRiiPVyMftTtKFblUw3sNFXQ= - + v0.3.0 h1:3lOnM9cSzgGwx8VfK/NGOW5fLQ0GjIlCkaktF+n1M6o= - + v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= - +github.com/docker/go-units + v0.1.0 h1:LBCjdXuTJjjlJU5Lg59URp4ubf693pHgo2Dvm/P035o= h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= + v0.2.0 h1:TtZVwKVMsN8COBXUhH/x17NFxEFfIIK2i9DL/nz4zfE= - + v0.3.0 h1:69LhctGQbg0wZ2bTvwFsuPXPnhe6T2+0UMsxh+rBYZg= - + v0.3.1 h1:QAFdsA6jLCnglbqE6mUsHuPcJlntY94DkxHf4deHKIU= - + v0.3.2 h1:Kjm80apys7gTtfVmCvVY8gwu10uofaFSrmAKOVrtueE= - + v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk= - +github.com/docker/libcompose + v0.1.0 h1:iDj0n0W2Zw8+hIE4ftGYMQvnulxzmmvBIUzrieffLT0= h1:EyqDS+Iyca0hS44T7qIMTeO1EOYWWWNOGpufHu9R8cs= + v0.2.0 h1:qC7yKsuR+ihYQdqSbBM80rT426kHZ1XIWFOPOyaStxM= - + v0.3.0 h1:iFImvNns7hpqM2Wtdv3gn68t/ojorjreIAJNHs/pOms= - + v0.4.0 h1:zK7Ug0lCxPB8FDFNdCvR2ZjJjeJZ/607lfAYkp1hrtc= - +github.com/docker/libcontainer + v1.0.1 h1:qym49STGNmOFO+8lA0PXgJFbscoZElKFeGE0BPAjFKA= h1:osvj61pYsqhNCMLGX31xr7klUBhHb/ZBuXS0o1Fvwbw= + v1.1.0 h1:HLZTmM3/fVeR4V5S8NAF2t44zCCIzJ/ZL/jRe9wPBOU= - + v1.2.0 h1:Gvq1FDdzhLhC2TIJ7jtP4k2ba9J7dXd+Yron9QMNy8c= - + v1.4.0 h1:mrCCYnQU1lnp43y/1ViKbGjucA+Txbmf7hPIdC8+r7A= - + v2.0.0+incompatible h1:Tyr3weHr7zERwvkOgDnB4346Wrn72bePTI5TspHLpf4= - + v2.0.1+incompatible h1:r4m0Ya1uFdkFg4dcRbFCzBBOr8bC7j/J0ZLCtJR3UNA= - + v2.1.0+incompatible h1:0gatB5yQLIq7gywAS0HmXOY22/DyMIkW7HVhc/jOOsY= - + v2.1.1+incompatible h1:gXUagKm91lZouHqeObbFBZJJNjZWFB3NJ+eaTAjlOaI= - + v2.2.0+incompatible h1:0FYWwtMBwDN0lMTugJBZWc4sG25prVGIO1Sc7XmHXGY= - + v2.2.1+incompatible h1:++SbbkCw+X8vAd4j2gOCzZ2Nn7s2xFALTf7LZKmM1/0= - +github.com/docker/libkv + v0.1.0 h1:3drKYG6raiVY90exyMbehg9WGVXfLPyUeVmNphkMw3o= h1:r5hEwHwW8dr0TFBYGCarMNbrQOiwL1xoqDYZ/JqoTK0= + v0.2.0 h1:Jvz/q3IEbCsr7rWVXUTN/riH7wMBWJxZLvW3yyc5eJA= - + v0.2.1 h1:PNXYaftMVCFS5CmnDtDWTg3wbBO61Q/cEo3KX1oKxto= - +github.com/docker/libnetwork + v0.7.0-rc.1 h1:Uisi0o6s3hEY8l8khJMamp++4LK/iMKhwpxvtP8dspw= h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= + v0.7.0-rc.2 h1:Ig+jZrXXIZDzdPOTQ4wv/48kNA+vq+/BhSi+93hAkto= - + v0.7.0-rc.3 h1:b/ngW6LcjkX1JZUbXx40Za1seXfEKlZ7xQsTqOK6gbs= - + v0.7.0-rc.4 h1:jleug9AP1rbzblwowJ7bH+JMyJoS7bPYUSUTTQ1308Y= - + v0.7.0-rc.5 h1:lXCsgiubX4bYnXwtEcaJqYtuy8nEvRTVStvOTbxFWKQ= - + v0.7.0-rc.6 h1:IzRM9DwL+4TZK5wrAXEfy+4ZbarMZ2EiT3skD3DJNuw= - + v0.7.0-rc.7 h1:goL5cAJK0qwO2mI8J17S+V+YUcdw6aHyz9lXqhitBXI= - + v0.7.2-rc.1 h1:9QhbopyfyT9fjlYtB8+knmX9o3mQdoQ7jQ/guDUaaUM= - + v0.8.0-dev.1 h1:fTxjpWMDedJgM3ohvKqVAk9HW6FulRPIvSiPS3Hgljw= - + v0.8.0-dev.2 h1:1N717njYC/nF66PoDUPAykdeCGFXCUkB6SHXtEYTKpE= - +github.com/docker/machine + v0.12.0 h1:vJc/Lcw/cNeS8kRyPXQ73qlZftP77nn4wahg58FXdwQ= h1:I8mPNDeK1uH+JTcUU7X0ZW8KiYz0jyAgNaeSJ1rCfDI= + v0.12.1 h1:uo7xAesXJTkkreEIOCBhVirPsvkhaVxxOFHWuIoaxqw= - + v0.12.2 h1:hnEiFuJKxmals/98skBZ5Oq7aWU1Ah3YKMUluQHvtLA= - + v0.13.0-rc1 h1:0ylLk7OT4oelNuBWQzp6DCo+w8rOq2jL8sNGtHolMAU= - + v0.13.0 h1:qXOQLfafxknrwNNa9PNOLcFFqjb/rid9susqEsl6Xs4= - + v0.14.0-rc1 h1:kwk4/a9cP/kcuXw10nd4/inCLOLcFSBl7q/KnVSlcvY= - + v0.14.0 h1:7zMwMAz0XbL27Q4NPqtW7I0wuhOaGFpq5WfvrUfZROM= - + v0.15.0 h1:4KK/T1Pyb40vYI1ugMayMAEhkaNfqZekLaHPLF4lFvg= - + v0.16.0 h1:nLI3xyw6MD6qgw1e3Cv/oyW6qTpioU+SSDxoQQ5Mw+Q= - + v0.16.1 h1:zrgroZounGVkxLmBqMyc1uT2GgapXVjIWHCfBf0udrA= - +github.com/docker/notary + v0.3.0 h1:ly6/JWRw7Edho8YTNi6KSr9RJRXVRaSn8vtbJ8aD9X8= h1:3/NLyxebcX4foXQ9v90i88wEj1B3rsq6aVhtQIvYFe4= + v0.4.0 h1:sIPZtvPFtkEo+y3krh4CO7IQPCbNhV2BXw6BxrkoCWI= - + v0.4.1 h1:uyRDPTOcsy8Esd194cuxq4KQz2v/YaevNi41Pw6Zv7o= - + v0.4.2 h1:9UGXtaXyuU7r+TjRtgBdRJWtEhdrsn39vmRXulK0JXc= - + v0.4.3 h1:pbU2M0r4F5lcku1CCsw+pvBU/1EMUktM0kBqVl1+irs= - + v0.4.4 h1:Acz6MeXhCHJk2D47zXn+ol0rn1keC8KMxcxPspH0JnE= - + v0.5.0 h1:pu/2hwX8VBwy0ABV8n35AESUN1GCIcf9laD/8elq8wg= - + v0.5.1 h1:L+2sox5zXEfpITxZLZJyW8gw2M+XNnggoSr959pR4lE= - + v0.6.0 h1:bpHW1Bh7O8XZXvDSnybuiu971oWTNXsaygbJt1qlcS0= - + v0.6.1 h1:6BO5SNujR+CIuj2jwT2/yD6LdD+N9f5VbzR+nfzB5ZA= - +github.com/docker/swarm + v1.2.4-rc2 h1:Vm3E9Az2DRBlhp7fdCOMPYwZ3OZwcioPJt98GvcauPo= h1:rcMN9vZajPn8s2MgNl/C9G2nUaJrCMHIWvliOrQ4SJ8= + v1.2.4 h1:ng7K7fBoFBOfemhQkBHQGIgya9ADXoiQdv5aJtEr5c8= - + v1.2.5 h1:7ZUm1hpv9DuD/2a8v0mC+ZX3QN0U7ToPQzhxKQk4HVo= - + v1.2.6-rc1 h1:Fo2L3vz/JmIE2OtSEhJkklxaSPira6cyvuycktsSCV4= - + v1.2.6-rc2 h1:wzLmvtXo6O75LIsEAozXPKw4kkRZW9GkDciFnAnXqPI= - + v1.2.6 h1:5AGZMVjRoPyS/b1FTZe7Wfk3dvdnDBDlvQg323K8mpg= - + v1.2.7 h1:Qd1HrDvjVJWcFZOv+XjUaNNMa24CzwaSTSH2RiWQcd8= - + v1.2.8-rc1 h1:TB9kfEiJgfb+ixAqeNH8Wj7VsqpSkHIOJfbpUwVf2xM= - + v1.2.8 h1:hOFUs++dYeZPxWL9rqW0g/ZtfZ+gbghQ/ZOh6q7jCfI= - + v1.2.9 h1:qol0zAuyJDGW18amWhFCjAkjYnihLWeE8Csnr7JfiYk= - +github.com/docker/swarmkit + v1.12.0 h1:vcbNXevt9xOod0miQxkp9WZ70IsOCe8geXkmFnXP2e0= h1:n3Z4lIEl7g261ptkGDBcYi/3qBMDl9csaAhwi2MPejs= +github.com/drone/drone + v0.8.1 h1:idqB65J6E7DRMfV98eN7G6VNHKOLbCq3HTjgWHXfbpo= h1:jhrjj+lR3aY8E5LI+jXxFj4OuXAbdiAIyX0jIwa3OWk= + v0.8.2 h1:goaJ14Fd24eZR7lCO4gkw9w67PH0hDgYg+CNd0RWI6E= - + v0.8.3 h1:s/rwzK553WUcjzNu09tO1UM3PdNXxrb+sQw/vOeGtq0= - + v0.8.4 h1:XfUGVQ72ddm2Z0DDF/2hDZXOFKyS+kNve60DPP4IT4o= - + v0.8.5 h1:64KbfCmKzxa2Pbq48R8cOXZF5h2NA6yeof544+WUX5w= - + v0.8.6 h1:3NBcfWTULqVQt28/pRfScRS61Ig7Qtj7b3LGSMWoFDE= - + v0.8.7 h1:6nNMMXIveNDq89aqhvg1RgCiQmz+EbshGqEmnD6qasw= - + v0.8.8 h1:tlsAcy+qyp/WG2rp6KOoOGkD0PslGBbA/GIm8Hry8Ck= - + v0.8.9 h1:Dpl9ewGDujigkHEqtmebCWtVWGo0QzNDSlAmhDnHNT4= - + v0.8.10 h1:Izqna0P844IYlKp+TrRsSO2BDfCotq3vFtkE9youo+Y= - +github.com/dustin/go-humanize + v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency + v1.0.0 h1:XPZo5qMI0LGzIqT9wRq6dPv2vEuo9MWCar1wHY8Kuf4= h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= + v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= - +github.com/eclipse/paho.mqtt.golang + v0.9.0 h1:7qED2/aWTIBpT72LzH1PkDOqIlwNSq0C7l5cR89s4Gc= h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= + v0.9.1 h1:d6QTqiGbtCSf8Hz0VCYSZJsXyahZlApicYqoKfgqjog= - + v1.0.0 h1:SIqh8vC6gWMF+bNWzWh3QUMu+uNlLFkjo2PN9LkJXCE= - + v1.1.0 h1:Em29HD1CwLHdRFnX7yfg+kBjHHw6DSDok9I+ia4znT4= - + v1.1.1 h1:iPJYXJLaViCshRTW/PSqImSS6HJ2Rf671WR0bXZ2GIU= - +github.com/edsrzf/mmap-go + v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/beats + v6.4.3+incompatible h1:ZblBvbfOBBpce539Mk4AKgg02DX74t9nVeQR5RyVhxY= h1:7cX7zGsOwJ01FLkZs9Tg5nBdnQi6XB3hYAyWekpKgeY= + v6.5.0+incompatible h1:AJymh34qIXCcdX12U6hJ0SoSaJ9uYEOLGhN8LJN56dk= - + v6.5.1+incompatible h1:7/7d+aAyme30L2ri7X3LlYZrxeGQQ8Mxm+vPzEz9BC4= - + v6.5.2+incompatible h1:KrLUpOtv7PbhSQ0Z36KWmYbv1JocX5RD02AeD2mhQj8= - + v6.5.3+incompatible h1:TDvV9ARzatDxKl01L44ONWXSr7fnVJ93BtDQIArN5kk= - + v6.5.4+incompatible h1:pH/LOYaQD+dFFD8D/ZE61jSQtS5tWvMtwNyl4x4M0Ts= - + v6.6.0+incompatible h1:oqeYovU4JX6EI2d9P3hVEGIidGUYciScqJxaaunJe9o= - + v7.0.0-alpha1+incompatible h1:Zac+ZSQ1lyLLTgm/gJ2lQqB74xDMLKIM5+NnWVBQMK4= - + v7.0.0-alpha2+incompatible h1:M26bOoRo2jtyr2ENgryzZdne42wLoXrhq2vWQ6VgNFc= - + v7.0.0-beta1+incompatible h1:YmWgpJC4Q79/kdJ2gQKtHV7sBjhDxes4PLD5XrJ5v/o= - +github.com/elastic/gosigar + v0.2.0 h1:GXcDQslFT0IILh6C/G5+rZvP8rMoMLc4+OlG89vtdy8= h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= + v0.2.1 h1:gsatFyJqe5r+updsdxbh43wLE5moI5aEw99oZ82tB78= - + v0.3.0 h1:Bw/YCniPJwFUcOp3gL0VFySG9QC6lDEvAinGJx0/sWw= - + v0.4.0 h1:wGh8Gq7uEIE3uXnz4i6O6W0c6yTsUMF1geDp50YLhno= - + v0.5.0 h1:mKJ5EXxZ417DGxcBoLd5mDavkeg0bQJw4U6c4D4xLeo= - + v0.6.0 h1:9KSX3V4Mr15SKb6l6NzTMAYPdoViWQjzCvTRhC9Bgqs= - + v0.7.0 h1:jct5pZZeiIpv8VWTdFer8jCg7LBhWbsipyCzQOyznC4= - + v0.8.0 h1:UwJ02o1X/fkWqrEdHbsbjfW3sLfx24/k/QRXqUD7Uz4= - + v0.9.0 h1:ehdJWCzrtTHhYDmUAO6Zpu+uez4UB/dhH0oJSQ/o1Pk= - + v0.10.0 h1:bPIzW1Qkut7n9uwvPAXbnLDVEd45TV5ZwxYZAVX/zEQ= - +github.com/elazarl/go-bindata-assetfs + v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= +github.com/emicklei/go-restful + v2.2.1+incompatible h1:yreWt49MQDL5ac0Dau9EKE22or+LrHikXVhAqUAXnfk= h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= + v2.3.0+incompatible h1:LMJeogUahy5QhG+/aiNAz8ZSA/2pSPzlwMpiaxRDMOM= - + v2.4.0+incompatible h1:p9u+CKd2OEI+kUmFLDwuf0LtmBtDhcok4UjQDs0rDDk= - + v2.5.0+incompatible h1:C6LOcwNPrNImeYfAr02vGeM0Mpd7mE2CqSR2mpPd4p4= - + v2.6.0+incompatible h1:luAX89wpjId5gV+GJV11MFD56GpAJTG2eUqCeDDgB98= - + v2.6.1+incompatible h1:wgryk4OPtwC4O5lLa33ldKjliZhL/iVZHK8egL/p5rM= - + v2.7.0+incompatible h1:DLOt75KPGt7LnFiqlmQGKImiR+updEs3F5/wrYO9P5k= - + v2.8.0+incompatible h1:wN8GCRDPGHguIynsnBartv5GUgGUg1LAU7+xnSn1j7Q= - + v2.8.1+incompatible h1:AyDqLHbJ1quqbWr/OWDw+PlIP8ZFoTmYrGYaxzrLbNg= - + v2.9.0+incompatible h1:YKhDcF/NL19iSAQcyCATL1MkFXCzxfdaTiuJKr18Ank= - +github.com/emirpasic/gods + v1.5.1 h1:rL1Ty4inU7bNBfAJtKfFPkH6hrNql//WDd2E/OC6yjI= h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= + v1.5.2 h1:tXv4AzGxjsFEHAcuh0XidoM7nGgqAoKH2mkT5X7qKJI= - + v1.6.0 h1:19k4VMJEPwdKPi7YOmv8Y+BdVpH4vqdPFm2ATm1w6x8= - + v1.7.0 h1:rhvbuJ3/m4qDAc2eJYrDpkzbRx5UbnWuz0t5erFC2oc= - + v1.8.0 h1:YHvS59P0319zAckH7tphI0U7h+3fdxaMelCpzMFYZqo= - + v1.8.1 h1:PnIAh9bXmZhRh4UaoNXB+UtJIOCIRYvWx8k/h+V4ilU= - + v1.9.0 h1:rUF4PuzEjMChMiNsVjdI+SyLu7rEqpQ5reNFnhC7oFo= - + v1.10.0 h1:bWdjTVTw8eMGzGzvpg03dqalNduWpWVfleguQlxt9+0= - + v1.11.0 h1:8KhjokrJy1+REZkLeSlnJvLKI4tRR8g65a4C07oQQ50= - + v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= - +github.com/ethereum/go-ethereum + v1.8.14 h1:q+r1V2aNLAlE3+5FsRM5d2hQF4Wc7h7PfhSeSoq6zUo= h1:PwpWDrCLZrV+tfrhqqF6kPknbISMHaJv9Ln3kPCZLwY= + v1.8.15 h1:95jix4Qx65CpTBLjzrh8Jb8UR/3TaolQE82qFQZCJJY= - + v1.8.16 h1:mWSfeuH5G3WDvHcY/aXDgSjy+mXQ6UyL7w0hrMbE/ds= - + v1.8.17 h1:aoqWfGFYsSxCdFZfQ6h0pnojtoBOcYI+6Yg8JXhGuXs= - + v1.8.18 h1:ihTGGzBE6umIZsjR7Iijvlx0Ri0TqazhxRvdkIyBBok= - + v1.8.19 h1:H3m/wLo1hx3gpduVMQWb9ertqkmuTXvqjQNcxiA6XNI= - + v1.8.20 h1:Sr6DLbdc7Fl2IMDC0sjF2wO1jTO5nALFC1SoQnyAQEk= - + v1.8.21 h1:ofzsxFj+zKhj1k3uVa8/MJCCptqKEh/6DXq4LwdUM4E= - + v1.8.22 h1:y8RPBpBOF0/Gm8tV4Ut0WMa6RvY0e4XFIT6zASAOT0I= - + v1.8.23 h1:xVKYpRpe3cbkaWN8gsRgStsyTvz3s82PcQsbEofjhEQ= - +github.com/evanphx/json-patch + v3.0.0+incompatible h1:l91aby7TzBXBdmF8heZqjskeH9f3g7ZOL8/sSe+vTlU= h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= + v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc= - + v4.1.0+incompatible h1:K1MDoo4AZ4wU0GIU/fPmtZg7VpzLjCxu+UwBD1FvwOc= - +github.com/fatih/camelcase + v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color + v0.2.0 h1:Xr6X9g4H4m79h2IHRx6o2V0NFOUbGwQZdptjcetM9nA= h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= + v1.0.0 h1:4zdNjpoprR9fed2QRCPb2VTPU4UFXEtJc9Vc+sgXkaQ= - + v1.1.0 h1:4RQHlUrrLRssqNPpcM+ZLy+alwucmC4mkIGTbiVdCeY= - + v1.3.0 h1:YehCCcyeQ6Km0D6+IapqPinWBK6y+0eB5umvZXK9WPs= - + v1.4.0 h1:zw+qNRz7futKZsgbBmT5ffigcBJLFNu0TZAxbTxFr8U= - + v1.4.1 h1:YJhD/SoQqn7ev9zwhIm7lHTAqsOAF2AN4xlAVZzNZnU= - + v1.5.0 h1:vBh+kQp8lg9XPr56u1CPrWjFXtdphMoGWVHr9/1c+A0= - + v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= - + v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= - +github.com/fatih/structs + v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU= h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= + v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= - +github.com/fluent/fluent-logger-golang + v0.4.3 h1:wj4AQt4A4po5vyZ8VaYR0muRsbiYJECiL+y8KCvt/To= h1:2/HCT/jTy78yGyeNGQLGQsjF3zzzAuy6Xlk6FCMV5eU= + v0.4.4 h1:f+o4uPhTfeRZ+TjuB/vgvV57UV1tnPle/p7AGO+cQzo= - + v0.5.0 h1:WH9AKTauVdti3T9xu0fol/oTUzXsnmHpYHi3bqLU6ug= - + v0.5.1 h1:NEM0cyfUc51PRtZgPqRbN7R3YabR9v3oA2loOseoP34= - + v1.0.0 h1:hkXcdtGofeByowrIO47wiK2ETGq43UG7VZWWLO+Y3Eg= - + v1.1.0 h1:etYzQE058bvZu6Iy8MRft9eW0Xq4AxwkEZGlVPNeeEk= - + v1.2.0 h1:FmTE6OWpD+sFivPK91k6yeh2Oia/T0wImmpY5LkGNjA= - + v1.2.1 h1:CMA+mw2zMiOGEOarZtaqM3GBWT1IVLNncNi0nKELtmU= - + v1.3.0 h1:oBolFKS9fY9HReChzaX1RQF5GkdNdByrledPTfUWoGA= - + v1.4.0 h1:uT1Lzz5yFV16YvDwWbjX6s3AYngnJz8byTCsMTIS0tU= - +github.com/fluffle/goirc + v1.0.0 h1:4ejJt3nRw65AXzSYmHbMWYrlPHqc+ycoJQ0saZ/F4ZY= h1:XSqSOq5nTMabnZQgLQMKdkleBiUntueKLNTb0PpSOZw= + v1.0.1 h1:YHBfWIXSFgABz8dbijvOIKucFejnbHdk78+r2z/6B/Q= h1:bm91JNJ5r070PbWm8uG9UDcy9GJxvB6fmVuHDttWwR4= +github.com/fsnotify/fsnotify + v1.2.8 h1:izx5kyspXf0br68OpIhHsLlY2e27kdAdP44+UOBxPoM= h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= + v1.2.9 h1:q+f2SvddJCJUSZ2be2WshDfu4y08zDzn3EgNWoaU9Nw= - + v1.2.10 h1:rtNmYN+rpP0715msYFFD9UXCWMdxXqXub9G4RdR/Kck= - + v1.2.11 h1:yvKD8fnPUn9IDsfDnesbiAnEaI5WMA9/sUxIy6vltDc= - + v1.3.0 h1:XyNoRE4PlEAzjaHYBqJuJC18jNWyfDVJ2jwD5kCuwXs= - + v1.3.1 h1:Ls7eCFzutKKUlbY8E5wXfcRWGH4qLQxkDoydIPh94X4= - + v1.4.0 h1:WphdbukyYaFeCBwYjXl+GdYBLBrC754TP7DNLI8Qyfs= - + v1.4.1 h1:eFkOCdozfhibgldtd1nfPgoQJDlDwJt4n6DRqtIZ0z0= - + v1.4.2 h1:v5tKwtf2hNhBV24eNYfQ5UmvFOGlOCmRqk7/P1olxtk= - + v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= - +github.com/fsouza/go-dockerclient + v1.2.0 h1:lmjnUbZFR+De5PfuXCk62hAIlkokNtD9CaGPR8Iu5UU= h1:KpcjM623fQYE9MZiTGzKhjfxXAV9wbyX2C1cyRHfhl0= + v1.2.1 h1:ZcSDAjMR2wkfuAOOaoCOML8NZKuXRi8L0aib5ZtGPoc= - + v1.2.2 h1:rFDrkgZUIlruULXD2gRhT8JhqbjA6vHszAIStg/juEY= - + v1.3.0 h1:tOXkq/5++XihrAvH5YNwCTdPeQg3XVcC6WI2FVy4ZS0= h1:IN9UPc4/w7cXiARH2Yg99XxUHbAM+6rAi9hzBVbkWRU= + v1.3.1 h1:h0SaeiAGihssk+aZeKohbubHYKroCBlC7uuUyNhORI4= - + v1.3.2 h1:FrEqffNYbNeH35BB+UdeJszz53nMqADuXsNAUt7m11o= h1:yKgNDnynLAmC24gq8gnW2Yu3QQMeMz1tWYdWWl1S04w= + v1.3.3 h1:HaGPJlgBFwCy3W7K/FD5IobA7uuy0RPcAcfa3azv+b4= h1:wqOJeWHV3Mep81Dx04uGm0ovCSZxtubD4at6XGfEPh0= + v1.3.4 h1:X5OplZ137gPE1dzOTFsy7sxDiz73JVh6JZwjQovFka4= h1:6VxxpLZHol+SXg45PuAgkYwQCjo5KL0A7VoWkQOWAqU= + v1.3.5 h1:0/nSVi1SRCW7VQ2kRLn56Uw2YybNRdY/iGrnWjFycXI= - + v1.3.6 h1:oL0e3fpCjF+AHuUUBnwbkVcelFhxQifgTPQKipJPtnI= h1:ptN6nXBwrXuiHAz2TYGOFCBB1aKGr371sGjMFdJEr1A= +github.com/fzzy/radix + v0.4.6 h1:WT0tffvXEMvi+WE1i8b0IBi4Oh/8Yqt4qBCPgjfEoF8= h1:KhtJfdbo4PD2LEOYO7QCVSIH0pOcZEZ/SpNsXgwQtkk= + v0.4.7 h1:UUneQwfdGF5n8G9ZpOCTavs2cUUY1itsjfBPT/BNAow= - + v0.4.8 h1:/Boc+Pf4DpvhBdSMtkAlMHtdz/bZSDJRAKe8V+956Mk= - + v0.5.0 h1:gHh2VDUKGMPQaNGF9VIfcaHhPIcdzl8Q4XuDbtmcD/4= - + v0.5.1 h1:MkuP8PECSAZQva1Vdh6DvS6gYr6A3Phrd2jKZJgLdSw= - + v0.5.2 h1:wfFq00/ff8+SSw8IDen7MS0q9k3yAsmWSdSXDvzJ+Tw= - + v0.5.3 h1:T9TZ6MaNkR8BvqyjvmYnxOTtbleSdHCyimHEd9+Aep0= - + v0.5.4 h1:1fLdjfVd/eM6QK8d+di+njsoUFhgyf021kDqjXBlLQU= - + v0.5.5 h1:GYvT/gqJBruVcBBybBBWvcL9miq5MxwNqFoZmRsITRM= - + v0.5.6 h1:cbj4zksFVtUo5ST6gW5NsUlW6C6x7eAiqajgCe6e2Ys= - +github.com/gambol99/go-marathon + v0.1.0 h1:lK8p8xRbeTyMzjtBXsTp8Wo3zlcEO9NNLjii/VF/wTQ= h1:GLyXJD41gBO/NPKVPGQbhyyC06eugGy15QEZyUkE2/s= + v0.1.1 h1:bvvsPzbxJ3cYxIE7kGOkG5DeQxJn4UmCQWMwwEl04eE= - + v0.2.0 h1:A/THKKbD31WtqSyHCIv+KseL5Ovl7E0PuR90dH4ZxuI= - + v0.3.0 h1:PRTm+aaTMFDR94wzEhjkzGndbrVaraUdGYkDLdcjwv4= - + v0.4.0 h1:wvV2zI++OmhFkdmiZYtvVssIqTeKXDowoqA0yE+vkvU= - + v0.5.0 h1:hS239GBgu76JGsHc4bproQuj4dhLgPtMZlTyoRAekHs= - + v0.5.1 h1:9zeoAC/8n7aWScFgeY5u9miLuKPbGm6xLvVI3n5GSIc= - + v0.6.0 h1:uxJ3FduoL67JwV+O4FhUmQs1QK/fJZ0HOXXQT6UBWas= - + v0.7.0 h1:T7klmdocOKUtshucgKrqipH1YA71AGXETL6DX8jjdZA= - + v0.7.1 h1:/dnwXQ0W0UDScpvmcdjzRz3ssnJ/5ieX/q4Xi/QHOn4= - +github.com/garyburd/redigo + v1.0.0 h1:W6d6zr96WMrMxQws1I4sc7rrJ1dbQK5KrC+NwH0ReTM= h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= + v1.1.0 h1:kTY6M1SUxdOiFU4rbXWTtDBsTnfsXo4vDhXzhGMjdwk= - + v1.2.0 h1:l2RL1LG+FC1gM5pm6nZUtWBYuALPJ+Bc6qEgWdCVeYQ= - + v1.3.0 h1:gjl0wbI1VZoOZvwJge1tGXZX8rdbwo91iVRPV13wDu0= - + v1.4.0 h1:PlMIyh8f7og1DRVAZiU1I6VR8R5vFbWch3ddfv1ICvY= - + v1.5.0 h1:OcZhiwwjKtBe7TO4TlXpj/1E3I2RVg1uLxwMT4VFF5w= - + v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc= - +github.com/gdamore/tcell + v1.0.0 h1:oaly4AkxvDT5ffKHV/n4L8iy6FxG2QkAVl0M6cjryuE= h1:tqyG50u7+Ctv1w5VX67kLzKcj9YXR/JSBZQq/+mLl1A= + v1.1.0 h1:RbQgl7jukmdqROeNcKps7R2YfDCQbWkOd1BwdXrxfr4= - + v1.1.1 h1:U73YL+jMem2XfhvaIUfPO6MpJawaG92B2funXVb9qLs= h1:K1udHkiR3cOtlpKG5tZPD5XxrF7v2y7lDq7Whcj+xkQ= +github.com/gengo/grpc-gateway + v1.4.0 h1:dFHVf5i6z1HqoLVTZxKwuMccH+slBVN7sRY3pzFgTcE= h1:96Q3MwP4ORaK7X4PLNhexJ67u+39FMqYtFT13kAdQcU= + v1.4.1 h1:T5yx4HlW1/vwKV84f2UZOv4nGrF1rZTgC7ULSbFEhCQ= - + v1.5.0 h1:nB/ochpeZ16sWKWYh2TTnxzNJwrFlAH5VCSQVQp/4Zk= - + v1.5.1 h1:8oHtTCae6X65dEoplT9NXM55eJr3CSrzMGSWzcWd9Hs= - + v1.6.0 h1:cJWEMz8E5vNZkqMjUTuRl3llRT5ao+WCwF4RCk/Jjus= - + v1.6.1 h1:04qlHOgsm5e6ExdBbgMlp/uDl8HgNAPkUucE/yacu68= - + v1.6.2 h1:iz2cj8mbdvToKMeUIpJZ5Ma38fyWjb5uhMQ4fPHnigg= - + v1.6.3 h1:YX3k6oQBxABuBQNzM0DcnAzKOMRPR4plpcAO+VHy9Z0= - + v1.6.4 h1:ERYqE5SsnCwlE6WjFa22lPcQQWriDGvb3mB3uBKJrLs= - + v1.7.0 h1:RdBowFlRqkvwBlQxwg/DqDRY5eINKNIfeheMpDhAxZg= - +github.com/getsentry/raven-go + v0.1.0 h1:lc5jnN9D+q3panDpihwShgaOVvP6esoMEKbID2yhLoQ= h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= + v0.1.1 h1:Q59NpKCRMFKdZWk2H5mzc5N9IEe+Hx/kZKd8w4dCvs4= - + v0.1.2 h1:4V0z512S5mZXiBvmW2RbuZBSIY1sEdMNsPjpx2zwtSE= - + v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= - +github.com/ghodss/yaml + v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-gonic/gin + v1.1.1 h1:RsFHhz6Sl1rRi1bjR0zrynA9WUMxOHywfoDP1+UpoJE= h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= + v1.1.2 h1:F26LJETbvvzxGkpOWRHyOXF/s3sdNnv4EIVbBMMDrXo= - + v1.1.3 h1:A2cKDURjNpMkEJ7ts+gD+T/jVHeo+fgDB1aRIUXAo5U= - + v1.1.4 h1:XLaCFbU39SSGRQrEeP7Z7mM3lvRqC4vE5tEaVdLDdSE= - + v1.3.0 h1:kCmZyPklC0gVdL728E6Aj20uYBJV93nj/TkwBTKhFbs= - +github.com/gizak/termui + v2.1.1+incompatible h1:pvS3JLIPOBD/fTHn8po0eImr5QsoaIIuJ3Fnn34zBiA= h1:PkJoWUt/zacQKysNfQtcw1RW+eK2SxkieVBtl+4ovLA= + v2.2.0+incompatible h1:qvZU9Xll/Xd/Xr/YO+HfBKXhy8a8/94ao6vV9DSXzUE= - + v2.3.0+incompatible h1:S8wJoNumYfc/rR5UezUM4HsPEo3RJh0LKdiuDWQpjqw= - +github.com/gliderlabs/logspout + v3.2.1+incompatible h1:qVUKq8Yc+QuxpUziJ0l/vT2+Vh9YZIwDihVLdcTf9Is= h1:fBo/Nq8zbRI0AUwYxcIDPEOG/J4reIVOAHUbmohj2yk= + v3.2.2+incompatible h1:rSDcVw4uiCZ2zc/0yOw5JP/98gzvW3hwiHJ3cQvKqB8= - + v3.2.3+incompatible h1:aogICzHq/SUblF3Y5/V7oI93IW3LGjsZdcRpCn3v9oo= - + v3.2.4+incompatible h1:K2ijThhXN7DzUCULuE3yRGbWAcSt1Xji/Sv1v0G/XZM= - + v3.2.5+incompatible h1:fuWjCJJcIPG6JlKwSHg8d56l8pSUXIsOysZOh1dXIvA= - + v3.2.6+incompatible h1:/9k8CrainVIA+kmP8GHREWRo4ug7+Fx45A7+0jikTs4= - +github.com/go-chi/chi + v3.2.0+incompatible h1:J6iWCmCXnsUtK7kBKiY+YS2Oq5+LJJ0g71bUjSewvXk= h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= + v3.2.1+incompatible h1:f/Wdc+ueut4zFR+OXY2zBjlLR7FiCSCPia7W0YHI60o= - + v3.3.0+incompatible h1:19pl0NEHtjUmuCdXZpZ4RP3dJWdf05Fg8DDTFLnq++8= - + v3.3.1+incompatible h1:ib+xvnkWGS9Dt+qDnW03Sr7j2vrUjaTu3hDiR4Phd+Q= - + v3.3.2+incompatible h1:uQNcQN3NsV1j4ANsPh42P4ew4t6rnRbJb8frvpp31qQ= - + v3.3.3+incompatible h1:KHkmBEMNkwKuK4FdQL7N2wOeB9jnIx7jR5wsuSBEFI8= - + v3.3.4+incompatible h1:X+OApYAmoQS6jr1WoUgW+t5Ry5RYGXq2A//WAL5xdAU= - + v4.0.0-rc2+incompatible h1:A7EBPJSnKP0u77IKYE/fS8s4zngJirbJvxIDl37bOn0= - + v4.0.0+incompatible h1:SiLLEDyAkqNnw+T/uDTf3aFB9T4FTrwMpuYrgaRcnW4= - + v4.0.1+incompatible h1:RSRC5qmFPtO90t7pTL0DBMNpZFsb/sHF3RXVlDgFisA= - +github.com/go-errors/errors + v1.0.0 h1:2G1gYpeHw4GhLet4Ebp5q9wpnSCAOJNTiJq+I3wJV5I= h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= + v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= - +github.com/go-gorp/gorp + v1.2.1 h1:cyvKaN0GZxHM23au9yjuMKiBDarCbXWkpVZsOR4M8Lw= h1:7IfkAQnO7jfT/9IQ3R9wL1dFhukN6aQxzKTHnkxzA/E= + v1.6.1 h1:gmMbEEupmbMu7tPNZic1tNmTrCpnbfrdeaqisMto7lk= - + v1.7.1 h1:iah1rpKL35iFU2EFgJ595LG03h6jrbl1WIEWvPmzjo4= - + v1.7.2 h1:C5uGH8zK2qjMJZGC308ZegdGXMrMjYmA++IIMeKSKnc= - + v2.0.0+incompatible h1:dIQPsBtl6/H1MjVseWuWPXa7ET4p6Dve4j3Hg+UjqYw= - +github.com/go-ini/ini + v1.38.1 h1:hbtfM8emWUVo9GnXSloXYyFbXxZ+tG6sbepSStoe1FY= h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= + v1.38.2 h1:6Hl/z3p3iFkA0dlDfzYxuFuUGD+kaweypF6btsR2/Q4= - + v1.38.3 h1:CclkQtfmOJadMVMYepq1DkVSYw2jf/0BTvjNBHth5xY= - + v1.39.0 h1:/CyW/jTlZLjuzy52jc1XnhJm6IUKEuunpJFpecywNeI= - + v1.39.1 h1:tCmZ4eaQ/68aQjBmdycPGDhhfHsu8f/O3kM/nt6JZGg= - + v1.39.2 h1:mznOicgW6rGbX0ZaiSfOgrYoEq+H/bHUJsTfEBbGhWI= - + v1.39.3 h1:y2UyknTfDmqZcBqdAHMt3zib4YT33TVtM6ABVrRVXQ0= - + v1.40.0 h1:/pbZah2UXAjMCtUlVRASCb6nX+0A8aCXjmYouBEXu0c= - + v1.41.0 h1:526aoxDtxRHFQKMZfcX2OG9oOI8TJ5yPLM0Mkno/uTY= - + v1.42.0 h1:TWr1wGj35+UiWHlBA8er89seFXxzwFn11spilrrj+38= - +github.com/go-kit/kit + v0.1.0 h1:M3u0OQMyt/4O3npZa1iK0/zGSKTfSvPDDHcG1LAnY8w= h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= + v0.2.0 h1:96r99Qs3P4+3BJ9DTG79dapahoHO/0+q9v0xsifBFck= - + v0.3.0 h1:QZEva+odUF/G+yz7yjQLwUQxnSAS4S45V9+4O02yJ1Q= - + v0.4.0 h1:KeVK+Emj3c3S4eRztFuzbFYb2BAgf2jmwDwyXEri7Lo= - + v0.5.0 h1:SI25KgiIaNiy8GCcvstnkBVXPISD0rJ7LrAwt1PJ8zA= - + v0.6.0 h1:wTifptAGIyIuir4bRyN4h7+kAa2a4eepLYVmRe5qqQ8= - + v0.7.0 h1:ApufNmWF1H6/wUbAG81hZOHmqwd0zRf8mNfLjYj/064= - + v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= - +github.com/go-ldap/ldap + v2.2.1+incompatible h1:xiQNn/mDyO2c0O/3+dJJBn3M63u0eJV0AWyXbW4DSEg= h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= + v2.2.2+incompatible h1:z1iMOfXVEARpVjU9RFBoHGERz/ZZlNsq/eLyzzNll/g= - + v2.3.0+incompatible h1:qpbRTQISA20SoOhwzpkj4DuWDbsv9Z0Rgc88hpSPwvg= - + v2.4.0+incompatible h1:272V7fzoTx3z7o75WQSHL6bjm8sJuMa2oUQzh2S1xEY= - + v2.4.1+incompatible h1:MuJc8IOP4tcuWQreeSoiLD/GXZhV5vJaAbL7o17Bqug= - + v2.5.0+incompatible h1:q4gje9ELj+aiS1Y120Mm8J533cwz70m6qMdDo86Ztng= - + v2.5.1+incompatible h1:Opaoft5zMW8IU/VRULB0eGMBQ9P5buRvCW6sFTRmMn8= - + v3.0.0+incompatible h1:Q5Cni6EaH1FBILu1vuwwPd3Bosl3XYEdSoDKgyO/Uis= - + v3.0.1+incompatible h1:HZ4m1DxAjmIXb/0JzRu9YXxdlEIhzfhQnKtSsjMgoUE= - +github.com/go-logfmt/logfmt + v0.1.0 h1:7paswH2J8PJSBWgCVBz4+eagiCOnMzVJ1CGUd414+MY= h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= + v0.2.0 h1:2e4QP7mYUCi0P4yP/sfHF6unrAXvTCLLaU5tFV9oWJE= - + v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic= - + v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/errors + v0.17.0 h1:g5DzIh94VpuR/dd6Ff8KqyHNnw7yBa2xSHIPPzjRDUo= h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= + v0.17.1 h1:5Fq3wlwS3oF+a3ogdmAovUBiGFa2cvL88gK++KzzkpA= - + v0.17.2 h1:azEQ8Fnx0jmtFF2fxsnmd6I0x6rsweUF63qqSO1NmKk= - + v0.18.0 h1:+RnmJ5MQccF7jwWAoMzwOpzJEspZ18ZIWfg9Z2eiXq8= - +github.com/go-openapi/loads + v0.17.0 h1:H22nMs3GDQk4SwAaFQ+jLNw+0xoFeCueawhZlv8MBYs= h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= + v0.17.1 h1:yTcHtvNp8szdZ6UXm4h+c+xU4Qp30NWMYNP39cHnWmQ= - + v0.17.2 h1:tEXYu6Xc0pevpzzQx5ghrMN9F7IVpN/+u4iD3rkYE5o= - + v0.18.0 h1:2A3goxrC4KuN8ZrMKHCqAAugtq6A6WfXVfOIKUbZ4n0= - +github.com/go-openapi/runtime + v0.17.0 h1:NUysn+2kDjI+GbS5usELZM8bfOyntKKOGY4uwDEeCq0= h1:QO936ZXeisByFmZEO1IS1Dqhtf4QV1sYYFtIq6Ld86Q= + v0.17.1 h1:STQHpGAn63Ij0sI57fEHKIvtBI3v+RBozFJuEOE1Ps4= - + v0.17.2 h1:/ZK67ikFhQAMFFH/aPu2MaGH7QjP4wHBvHYOVIzDAw0= - + v0.18.0 h1:ddoL4Uo/729XbNAS9UIsG7Oqa8R8l2edBe6Pq/i8AHM= h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= +github.com/go-openapi/spec + v0.17.0 h1:XNvrt8FlSVP8T1WuhbAFF6QDhJc0zsoWzX4wXARhhpE= h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= + v0.17.1 h1:ZfZ1w1bBW6QC7EXXz3DXQDlFLCaPo4Nhszx5uOTjT2Q= - + v0.17.2 h1:eb2NbuCnoe8cWAxhtK6CfMWUYmiFEZJ9Hx3Z2WRwJ5M= - + v0.18.0 h1:aIjeyG5mo5/FrvDkpKKEGZPmF9MPHahS72mzfVqeQXQ= - +github.com/go-openapi/strfmt + v0.17.0 h1:1isAxYf//QDTnVzbLAMrUK++0k1EjeLJU/gTOR0o3Mc= h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= + v0.17.1 h1:o/yBocNZGzjYbJYu6ApCD9SWj8WRNWtg2apipkZEtk8= - + v0.17.2 h1:2KDns36DMHXG9/iYkOjiX+/8fKK9GCU5ELZ+J6qcRVA= - + v0.18.0 h1:FqqmmVCKn3di+ilU/+1m957T1CnMz3IteVUcV3aGXWA= - +github.com/go-openapi/swag + v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880= h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= + v0.17.1 h1:05rL2ATPnpCFQxLDBrCQ91n/bJxkxKRfghvuk+d6fLI= - + v0.17.2 h1:K/ycE/XTUDFltNHSO32cGRUhrVGJD64o8WgAIZNyc3k= - + v0.18.0 h1:1DU8Km1MRGv9Pj7BNLmkA+umwTStwDHttXvx3NhJA70= - +github.com/go-openapi/validate + v0.17.0 h1:pqoViQz3YLOGIhAmD0N4Lt6pa/3Gnj3ymKqQwq8iS6U= h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= + v0.17.1 h1:RfQTLHm/gEu0oSUmbTOy0PMufjkE5/pPfnqYpor3WLc= - + v0.17.2 h1:lwFfiS4sv5DvOrsYDsYq4N7UU8ghXiYtPJ+VcQnC3Xg= - + v0.18.0 h1:PVXYcP1GkTl+XIAJnyJxOmK6CSG5Q1UcvoCvNO++5Kg= - +github.com/go-redis/redis + v6.11.0+incompatible h1:HVwqrD0lHOxaZ/S6T8ScWo8JS4UHnZxMqg+LPEVKWxo= h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= + v6.12.0+incompatible h1:s+64XI+z/RXqGHz2fQSgRJOEwqqSXeX3dliF7iVkMbE= - + v6.13.0+incompatible h1:ogn3rdRIVfT9NmMdLgB+B3MoHbsm9JsYmvYbwCi5IgM= - + v6.13.1+incompatible h1:7EyNTuE9zwllLsn73pNTUwVTlrgs4vgNWZ9yx1nCTvQ= - + v6.13.2+incompatible h1:kfEWSpgBs4XmuzGg7nYPqhQejjzU9eKdIL0PmE2TtRY= - + v6.14.0+incompatible h1:AMPZkM7PbsJbilelrJUAyC4xQbGROTOLSuDd7fnMXCI= - + v6.14.1+incompatible h1:kSJohAREGMr344uMa8PzuIg5OU6ylCbyDkWkkNOfEik= - + v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0= - + v6.15.0+incompatible h1:/Wib9cA7CF3SQxBZRMHyQvqzlwzc8PJGDMkRfqQebSE= - + v6.15.1+incompatible h1:BZ9s4/vHrIqwOb0OPtTQ5uABxETJ3NRuUNoSUurnkew= - +github.com/go-sql-driver/mysql + v1.0.0 h1:UhERwrakx3lDloHVJA0uKtkiCVovXzcGLwz6XuNt6ks= h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= + v1.0.1 h1:3V2p1zqhZ2bY30jTD3lLL6ipcE9ARatt/P+u6Z38FLE= - + v1.0.2 h1:1tKe25AbTHPop81Rx2y5qnt3L7p+2fvuf4Qc9ZSOt2A= - + v1.0.3 h1:rpz2dLylQZCdCT+t3aBXK1IFdfv1ttTkuFqaAYoy2BA= - + v1.1.0 h1:9+YfHL3eyxobwWIChLZyZ20UeNW5HM8/IOcl3OWBOpk= - + v1.2.0 h1:C5cl8DzJiobQuZhND5+a3cOrrRhyaJBPHxZjLgdN8kk= - + v1.3.0 h1:pgwjLi/dvffoP9aabwkT3AKpXQM93QARkjFhDDqC1UE= - + v1.4.0 h1:7LxgVwFb2hIQtMm87NdgAVfXjnt4OePseqT1tKx+opk= - + v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= - +github.com/go-stack/stack + v1.4.0 h1:OT8w0Jz6Dzuc6zZd8ExJJ+8B+sgrmUHUogPAPm3XsJ0= h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= + v1.5.0 h1:NnuewVnme84IpkOVfD33YeVxeYCEadBkpqvLtp4ze3M= - + v1.5.1 h1:LIG9n/P1KDjrzWjeMtiau4ltqU4NdHn4PCluFXMubRY= - + v1.5.2 h1:5sTB/0oZM2O31k/N1IRwxxVXzLIt5NF2Aqx/2gWI9OY= - + v1.5.3 h1:JxU+OTZ+vcOqLFrCTritv2agi57iNoCkA14tYsEVfNs= - + v1.5.4 h1:ACUuwAbOuCKT3mK+Az9UrqaSheA8lDWOfm0+ZT62NHY= - + v1.6.0 h1:MmJCxYVKTJ0SplGKqFVX3SBnmaUhODHZrrFF6jMbpZk= - + v1.7.0 h1:S04+lLfST9FvL8dl4R31wVUC/paZp/WQZbLmUgWboGw= - + v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= - +github.com/go-swagger/go-swagger + v0.1.0 h1:6eT+4V5fXHB9w1WNuXFlHC4E3Rj9v6SiXw7knQzRNa0= h1:fOcXeMI1KPNv3uk4u7cR4VSyq0NyrYx4SS1/ajuTWDg= + v0.2.0 h1:Aa9r3gBPNYHNsmUqBwFPCZ5kPU85gM6MYliecEGihbY= - + v0.17.0 h1:VXtAcbBmNFxyDYIKp1udAscwbr9Y+/ZP+woNivlsHEY= - + v0.17.1 h1:vXic4XJ4kMnmt6hfPzHhkfCHd6khpY81oyPLdUEpksQ= - + v0.17.2 h1:eizwRyO8THHMA4kXyM5Z1UTPslZGE8VsfJC0jJqsRI8= - + v0.18.0 h1:oVUUoMY2DMfDjjWqBdDaGbdxBfHllH3xt2DSJr7IHOI= - +github.com/go-xorm/core + v0.5.1 h1:uJNJQxMtdaRSIUcbNz468H0ZtbkNUhZbqnYGHqqU3+0= h1:i7QESCABdFcvhgc8pdINtzlJf/6LC29if6ZJgHt9SHI= + v0.5.2 h1:+4sNEcNClhkVxyWNIqyzcI+Q7V8c5k62xR3CGYmgJiQ= - + v0.5.3 h1:LqogwV7BJBq/hj4GHlsv9s7wgTKLPiiqlnhZ1rOn05A= - + v0.5.4 h1:ebpCY/N1i7a/EkVEYvmQOZreiDNQyTl0BsmplCm0whQ= - + v0.5.6 h1:SsxP4wBowrZPLhGBDCZtKmVoKhXL1f2NcePPO4NpKss= - + v0.5.7 h1:ClaJQDjHDre5Yco2MmkWKniM8NNdC/OXmoy2HfxxECw= - + v0.5.8 h1:vQ0ghlVGnlnFmm4SpHY+xNnPlH810paMcw+Hwz9BCqE= h1:d8FJ9Br8OGyQl12MCclmYBuBqqxsyeedpXciV5Myih8= + v0.6.0 h1:tp6hX+ku4OD9khFZS8VGBDRY3kfVCtelPfmkgCyHxL0= - + v0.6.1 h1:ha61NwbKJjPgoLgU+6ajaX1lIQPzeljHkz8c2qrVzxQ= - + v0.6.2 h1:EJLcSxf336POJr670wKB55Mah9f93xzvGYzNRgnT8/Y= h1:bwPIfLdm/FzWgVUH8WPVlr+uJhscvNGFcaZKXsI3n2c= +github.com/go-xorm/xorm + v0.5.6 h1:YYSBWOMcnpA7TA7vg8DXBv7zPzMcMBIR67fW3OqM3io= h1:i7qRPD38xj/v75UV+a9pEzr5tfRaH2ndJfwt/fGbQhs= + v0.5.7 h1:RNgftPrivAioB7+WzY/WDDg8cuvFfqJPdIrGvTxwQXI= - + v0.5.8 h1:zXgNdrbVaPBjChNxy6qEa0FhIwsyNttEsJ6PhZQXu8A= - + v0.6.2 h1:G3uSG7i/cjK4FkCLdtyoPxd5cXrUwBl4WhvxA1piOqE= - + v0.6.3 h1:UxllS2puvBE+0/8o8QvMwRWp6LAXKDo7PP8pA49eonw= - + v0.6.4 h1:J0X2FjXl6voshSZj91iYPuLsXfvrKJ9NB+Bpq0/kDBc= - + v0.6.5 h1:42tuMFoEf4/DiDWfRhGzn94TaBtm4SQTfiQdU9D86rw= h1:xkHEPeHG0ckC95t/J9vR4tr4gE4944G/kGnDCGLAxlA= + v0.6.6 h1:h+5b4/ozenzhEiLMFYeCQO0MGfO9dE+PD1ljPCLIzH4= - + v0.7.0 h1:u3X44NiN3ggNeeJO3f1xmHIFGAqh3qmCWS3ROuIBWmU= - + v0.7.1 h1:Kj7mfuqctPdX60zuxP6EoEut0f3E6K66H6hcoxiHUMc= h1:EHS1htMQFptzMaIHKyzqpHGw6C9Rtug75nsq6DA9unI= +github.com/go-yaml/yaml + v2.0.0+incompatible h1:ColVRwfZI9RI+9BfBZi2plxqB/Mu4ZZzi8RnO15WxXM= h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= + v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= - +github.com/goadesign/goa + v1.0.0 h1:hZrjUA2VbU3NjVEZzLHj7KXW9hCBJXw4wKQHy9KCD+4= h1:d/9lpuZBK7HFi/7O0oXfwvdoIl+nx2bwKqctZe/lQao= + v1.1.0 h1:mNn6R9jZpAvKADf7diAwrN8H+O6CJtDltxK5o+0Y6ek= - + v1.2.0 h1:m/B5mwezep9X4c7p0bURPmqD/glmLeP7iZtGUl6FXwg= - + v1.2.1 h1:nTQaBoILw06uorLsrwhD2DJYz+aGJ35jHTe+tgtvYzo= - + v1.3.0 h1:7GUDe4L8MBfRw+Rm2F6NWWJm6lRtG8lpxhyNwhoLtaY= - + v1.3.1 h1:J7gZm0xlJhdQEZ4LWOJUvrwBHM2PA+6ZvMkUq0j0Zms= - + v1.4.0 h1:2K0k+KtwGcErmWUoarsItuV9cPKG/7KBG86Oh89kHqs= - + v1.4.1 h1:7klkZZ3eCXewU3E1//C2spxle0dzRRUVdeny/vdKrz4= - +github.com/gobuffalo/packr + v1.21.1 h1:z+0ev0daZkqrfRrtkT78FntrpxPC+CsSEnT614feV44= h1:1bviu6xjcPv2D1fAyMz1VCESu69O5V3JJXLW9xGDI38= + v1.21.2 h1:p7n74ZN0vEgueluoe1myi23NoUjztixVQWfkGQ61W6U= h1:IODzKNHqDtRH8Re8hDrLJeOZGJmY+66vmqb1kMgM69k= + v1.21.3 h1:TJCUm5Kl/Ykl13kZ7KiJHATMtqEiOtQEubywPsAzt0U= - + v1.21.4 h1:mXkGAx/KDhOerg8z9onddL3E6f90Thevf7QODhpL4ZQ= h1:zCvDxrZzFmq5Xd7Jw4vaGe/OYwzuXnma31D2EbTHMWk= + v1.21.5 h1:wPOC4Cg5tGYDImw601x94a2d2PEa4KgVHzXMFR2WlBk= - + v1.21.6 h1:6z9Jk0SD5aAibQn9B+YHkPOuFwvPffhuIk1y5ki3HRE= h1:CxQkdRbcu0aO5mV/Y0hte5jCAFX/4S+cyO5pKCtezG4= + v1.21.7 h1:2zLx48rSNB4ZmoxyqT1vVOnpo0xoJoGfZWfm/U7xXAs= h1:73tmYjwi4Cvb1eNiAwpmrzZ0gxVA4KBqVSZ2FNeJodM= + v1.21.8 h1:qvCD8cQzb0MEDTM1xI6l+9R+HNzQ3hNcllUQdCXzcC0= h1:aRZXyERYmMgohDp5wDWnbgn5KiWuCKG19WnWZcAqeII= + v1.21.9 h1:zBaEhCmJpYy/UdHGAGIC3vO5Uh7RW091le41+Ydcg4E= h1:GC76q6nMzRtR+AEN/VV4w0z2/4q7SOaEmXh3Ooa8sOE= + v1.22.0 h1:/YVd/GRGsu0QuoCJtlcWSVllobs4q3Xvx3nqxTvPyN0= h1:Qr3Wtxr3+HuQEwWqlLnNW4t1oTvK+7Gc/Rnoi/lDFvA= +github.com/gobwas/glob + v0.2.1 h1:afOyqqg+bzqIrh0EwMWCGQjQm85wFdVbDlAUAseIPL4= h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= + v0.2.2 h1:czsC5u90AkrSujyGY0l7ST7QVLEPrdoMoXxRx/hXgq0= - + v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= - +github.com/godbus/dbus + v4.0.0+incompatible h1:iNJ3QcnEtQA2va/vj1d2Ng5Ld6tWno5HscHoVw9Bk/I= h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= + v4.1.0+incompatible h1:WqqLRTsQic3apZUK9qC5sGNfXthmPXzUZ7nQPrNITa4= - +github.com/gogits/gogs + v0.11.4 h1:75gzrF+kE02MRahaOukwUB2fMgqiO9zzjp5bbLiveWA= h1:H8FMbPPb+o/TgI6YnmQmT8nmEIHypXDau+f2CChYoCk= + v0.11.19 h1:y4zFMpYzKBKBJ8DeuCnsAE/EStue8Qb2sP9/IZ455PE= - + v0.11.29 h1:nDoHeBc4s3ukwgDUthar107l/HMa6+NkhR8+ulqkmts= - + v0.11.33 h1:M7wkG/hQpAPbD1U6T3q3P/lNEMpmPzPP94Rwr7C2rb0= - + v0.11.34 h1:X7I71Pr7I2qfRyQACifH6mKAFCQq67417l/FI5cA7Cc= - + v0.11.43 h1:7buYNxrBzyOsJtTABAIda+rJrFPesS7l+JFmGZi1J+Q= - + v0.11.53 h1:6MRuZiYgKpVtBLFSA+NkvrT1jPVNTwoYfzpqEASQVHU= - + v0.11.66 h1:FdgJCjMrSk0qudJIeYKNa4sMZKyyy9Fy8GMSa5frtfo= - + v0.11.79 h1:dKGlDSSSYtW0R3Y3X/ItenIBrDh48kNB//JPv7+C3mY= - + v0.11.86 h1:IujCpA+F/mYDXTcqdy593rl2donWakAWoL2HYZn7spw= - +github.com/gogo/protobuf + v1.0.0 h1:2jyBKDKU/8v3v2xVR2PtiWQviFUyiaGk2rpfyFT8rTM= h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= + v1.1.0 h1:mWrvyIHj8iy7uu+K0BDUbVkUTljYA/az5ziGfhs3ZMA= - + v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= - + v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI= - + v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gographics/imagick + v2.2.2+incompatible h1:B8EFzGrE9Am1wgl17UFE8cIvu3Kwxr9w6OAhYXfsWr4= h1:gk55mrttmUSR+Vt6dxnxuD7EKU/3e5Ehe8HRGVCI8mw= + v2.3.0+incompatible h1:5EM+wqPJjRmxdwRqi5QG9S6+A59mr3GrPvZDd/YvuMg= - + v2.3.1+incompatible h1:XK+4KGXfwkLMahKcWF6OhsJyS2BNjJapnlamxzJX/PY= - + v2.4.0+incompatible h1:newMrcrBRmV17WH8szw16BnurCIX2gymiqYu4ulvg4E= - + v2.4.1+incompatible h1:4VdqQLSuIlMLoib2yI9h62Wz3io7dGoZ9vwC9hUxtto= - + v2.5.0+incompatible h1:F/ivAAjWwKZ5/xN+AbGbV+ZhJTj6ShDx+Sf3GMp9txQ= - + v3.0.0+incompatible h1:CUysrDKv8/Qk88GClTz7nQx0Qt9lhjGkEgGz9u1Z4dg= - + v3.1.0+incompatible h1:YohQp5Wlp1dpRJo7/JsXIk0EEtQBc5VGagtECQaGjFE= - + v3.1.1+incompatible h1:dGE75aK4kfLLmMBeuWHVqClXYTkVsA+dEYZObCrJ6Q4= - + v3.2.0+incompatible h1:KeoHcmV7bVRKnj6tXTIcEGnyDg8kO0vPNUTC/5HzwOI= - +github.com/golang/mock + v1.0.0 h1:HzcpUG60pfl43n9d2qbdi/3l1uKpAmxlfWEPWtV/QxM= h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= + v1.0.1 h1:l3aoPzuNMWzLwKntc8zNn3mykKJKCUWVFlxOUGui3/E= - + v1.1.0 h1:VUon3XjHfsmT+ixZLEDmaSytI4aS3Swyli3SzKxaqKc= - + v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= - + v1.2.0 h1:28o5sBqPkBsMGnC6b4MvE2TzSr5/AT4c/1fLqVGIwlk= - +github.com/golang/protobuf + v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ= h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= + v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= - + v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= - +github.com/golang/snappy + v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/cadvisor + v0.28.4 h1:5KeHrntd17Bjg7eUUo+8LMSefn1WtUSftEgLxoUAkXE= h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48= + v0.28.5 h1:aNE2bzEZ/gl0z0OYAbqJu2HhZsozab0uhsGWlj806bI= - + v0.29.0 h1:V5QsHLEF1cgF+gIj4hvKs5dsbxEZbq/6Hi21vD3jRlo= - + v0.29.1 h1:uHkr9/ieyRszJ9IYt9zL3M82Bimu/Gn+Z6mexQFkyFQ= - + v0.29.2 h1:RgZwByLZ7eUEcNpaDojYRvYnkC2EbDpc49vRwvcfBDQ= - + v0.30.0 h1:kiZsBEUoj11nQul9QiYuScMdS++c//Rgn/KczqowKsE= - + v0.30.1 h1:e5wsh7JIwXVQ9vhf76h2gtpHk6yp3KID2Z9udXYgY6Q= - + v0.30.2 h1:f9JTPxuV3OKKG8jPhhH1h6j2xIh/tqAj88xeG69Dr+U= - + v0.31.0 h1:7IEpDDIrh2bpOVyICb2iItyNVnMKaXN37HSDOTqzv/k= - + v0.32.0 h1:eMoAOoZmuRMZ/yryNW1Fyu4wUsUWyp3UQ59s+A+qrPI= - +github.com/google/flatbuffers + v1.2.0 h1:uVbD0DOKYVqou9kovj8SnSsqt1HXM1Ez2DQRrlJljII= h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= + v1.3.0 h1:TKXcb2mXp+B3azt0ZYuWPmLBFgIDGAH7WEhZn50m4q4= - + v1.4.0 h1:QkMronN85wKgNpCxjbh3jE+24g1llgcJdMqsLw3Iq+k= - + v1.5.0 h1:rjr1PsU/1It22AJQxqGD4MEAgbT1je80Vy2L5YMhOmw= - + v1.6.0 h1:gtMr1neQZSJ7c5cN+hYjAbD+GaDUd/7Gdug1rZdr+uM= - + v1.7.0 h1:7+nRbfwRQZKgfSjUyqBzYsv43tHo6NMRIw78i1q+pMI= - + v1.7.1 h1:A+4GKBJCIyGRlrxA2Pl7qG7qr7JiBZghSsK+rzw6QNQ= - + v1.8.0 h1:CdnRsHiH1T8RQa9ytSGmiVRyEXr9LbqCkMx210bAueM= - + v1.9.0 h1:ZncsT6mBICwWsuCMmJ0OOasV1qpUWIGBWX5e66qIW38= - + v1.10.0 h1:wHCM5N1xsJ3VwePcIpVqnmjAqRXlR44gv4hpGi+/LIw= - +github.com/google/go-github + v8.0.0+incompatible h1:f9cxKuLChkifpGhFZhTWXcUXssIVeK/b+9BsS4RGe5U= h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= + v9.0.0+incompatible h1:US9GklxPFtBOBUz+pdGJ5Gy6zKkUc+/bDc0ZD/7cSDk= - + v10.0.0+incompatible h1:3+5U8RmC69FMl2NDNBQVITYxfPgCC8adS/9UcEXrOhY= - + v11.0.0+incompatible h1:2E2ox5VD0L/xIOFzpo7+fJzWFL5H0J8gmbBsDF23vWs= - + v12.0.0+incompatible h1:CORPvYkD1fpIoiZ7wkRk+m+WhN7Yhx+6CWG2zFYPn2k= - + v13.0.0+incompatible h1:fBlwo+i9Kp/7PQvRin1IVtHidPs+tLT3rVVFhrrK1+o= - + v14.0.0+incompatible h1:IH7XxuaXbLVh4iwPks5+jmKZXElyvAf+5K1108Ku8fU= - + v15.0.0+incompatible h1:jlPg2Cpsxb/FyEV/MFiIE9tW/2RAevQNZDPeHbf5a94= - + v16.0.0+incompatible h1:omSHCJqM3CNG6RFFfGmIqGVbdQS2U3QVQSqACgwV1PY= - + v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= - +github.com/google/go-querystring + v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gopacket + v1.1.7 h1:pVZ9hBdPwoTjkupZ1S2XZB2qwDqbhO/AAw/BvF9u2qE= h1:UCLx9mCmAwsVbn6qQl1WIEt2SO7Nd2fD0th1TBAsqBw= + v1.1.8 h1:lzrpxBfEQwmhufpcDwAaXZrpocxrYPt47xv/iEpMBCo= - + v1.1.9 h1:ML//DCFcH2W9Oe1ALVJEXFYu2KDjYJs3+h6+L3RPRws= - + v1.1.10 h1:FgixKO2r2AJYhYFKNgDGV4Kv7Gr9+BP24oUOPoOR4K0= - + v1.1.11 h1:aqsawFLqw0XKVA6Zbmk5dhcpS7Qz/aIrsH4Og1osvNA= - + v1.1.12 h1:iO4CXvFUmDaulbkZcejmXgrZNobyLkgBtYwgvA2hD6Y= - + v1.1.13 h1:MftQ/BkkVd5AlHcMnraUVErj9zZe2IN2IuHq6q+7TCU= - + v1.1.14 h1:1+TEhSu8Mh154ZBVjyd1Nt2Bb7cnyOeE3GQyb1WGLqI= - + v1.1.15 h1:M6W3hwQXo5rq1wyhRByGhqOw0m9p+HWtUJ3Bj4/fT6E= - + v1.1.16 h1:u6Afvia5C5srlLcbTwpHaFW918asLYPxieziOaWwz8M= - +github.com/google/gops + v0.0.1 h1:Zu4mP3q+A3CTzFeEnZdB/O8G2N+qYAG9X/m7MDs7eyw= h1:pMQgrscwEK/aUSW1IFSaBPbJX82FPHWaSoJw1axQfD0= + v0.1.0 h1:eq78BpQ7Tn+T8ppwm/ww7zzpq8aR/Cpghdo/mntT3x8= - + v0.2.0 h1:Ehgp7wk/6UkgtRbpHue/YDgGwbISiwJFbk83J+8Y64k= - + v0.3.0 h1:6iywf8lJB4yD8w1s4iOPm/GND76QDUex3Y9CkOh0YaI= - + v0.3.1 h1:kfHLNJKQ3awjI8K8Zwkqf0KdVLxiJKAAVR6sAibslRo= - + v0.3.2 h1:n9jMkrye8dh3WQ0IxG5dzLRIhQeZDZoGaj0D7T7x7hQ= - + v0.3.3 h1:QTgQ3WE0hSRQmU6aAyeePI+l9BI60qvr6xp4J2oKsGs= - + v0.3.4 h1:RpHu+onj/uS84Xry+4n8W6UMwkLBOvysUAlDsF3rflo= - + v0.3.5 h1:SIWvPLiYvy5vMwjxB3rVFTE4QBhUFj2KKWr3Xm7CKhw= - + v0.3.6 h1:6akvbMlpZrEYOuoebn2kR+ZJekbZqJ28fJXTs84+8to= h1:RZ1rH95wsAGX4vMWKmqBOIWynmWisBf4QFdgT/k/xOI= +github.com/google/subcommands + v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid + v1.0.0 h1:b4Gk+7WdP/d3HZH8EJsZpvV7EtDOgaZLtnaNGIu1adA= h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= + v1.1.0 h1:Jf4mxPC/ziBnoPIdpQdPJ9OeiomAUHLvxmPRSPH9m4s= - +github.com/googollee/go-engine.io + v1.0.1 h1:Q0H6NyghLSleyzQa5pN7N0ZZw15MLcgd+kqgXM2eAcA= h1:ZcJSV0EqRvvcCXN7h7d8/EncnShfx85kv0SUsTIKTsg= + v1.4.1 h1:m3WlZAug1SODuWT++UX2nbzk9IUCn9T1SnmHoqppdqo= h1:26oFqHsnuWIzNOM0T08x21eQOydBosKOCgK3tyhzPPI= +github.com/googollee/go-socket.io + v0.9.1 h1:KYsu63c3H5SaeQ3MDlHSTE/LJnwok2SH1M5wy4ZaYD0= h1:Q0CvnKmaZNgDXIi85at4eLadAOS1hWDLaDATQpuH3i4= + v1.0.1 h1:uWBxm1BBV7XSFHOr0vZMYC6TMHMPsI3YcQPXMWzwjUw= h1:I46rLznx5OmtL5sPHp9GQJK/z0+lkLOBIx1NO8Mp5io= + v1.4.1 h1:lnMJhKTvXKsmSssVjJPzuglU5y6Bf9SizA7s9XZvyqw= h1:yjlQxKcAZXZjpGwQVW/y1sgyL1ou+DdCpkswURDCRrU= +github.com/gorilla/context + v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/csrf + v1.0.1 h1:QxBz2bWSKSPdjFolloK8iS/bXkq30/mMR6KTEdRUvvk= h1:hxGa+qNn35co03vt75oDkIVPid4opvgJdE8E7yK0qKs= + v1.0.2 h1:LPPcehmb1zu82xln/wQN8/bVZwlEojv3J2ENGKgf8N0= - + v1.5.1 h1:UASc2+EB0T51tvl6/2ls2ciA8/qC7KdTO7DsOEKbttQ= h1:HTDW7xFOO1aHddQUmghe9/2zTvg7AYCnRCs7MxTGu/0= +github.com/gorilla/feeds + v1.0.0 h1:EbkEvaYf+PXhYNHS20heBG7Rl2X6Zy8l11ZBWAHkWqE= h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA= + v1.1.0 h1:pcgLJhbdYgaUESnj3AmXPcB7cS3vy63+jC/TI14AGXk= - +github.com/gorilla/handlers + v1.2.1 h1:IW0s9JrxTVsutEp77dGDlBv+PZnW6HKse4TrzJ0b+8g= h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= + v1.3.0 h1:tsg9qP3mjt1h4Roxp+M1paRjrVBfPSOpBuVclh6YluI= - + v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZsA= - +github.com/gorilla/mux + v1.2.0 h1:3XN1wbFJAJzEqzeUqlVF0qgpqZFHfV1YNHYPU+odUnw= h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= + v1.3.0 h1:HwSEKGN6U5T2aAQTfu5pW8fiwjSp3IgwdRbkICydk/c= - + v1.4.0 h1:N6R8isjoRv7IcVVlf0cTBbo0UDc9V6ZXWEm0HQoQmLo= - + v1.5.0 h1:mq8bRov+5x+pZNR/uAHyUEgovR9gLgYFwDQIeuYi9TM= - + v1.6.0 h1:UykbtMB/w5No2LmE16gINgLj+r/vbziTgaoERQv6U+0= - + v1.6.1 h1:KOwqsTYZdeuMacU7CxjMNYEKeBvLbxW+psodrbcEa3A= - + v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= - + v1.7.0 h1:tOSd0UKHQd6urX6ApfOn4XdBMY6Sh1MfxV3kmaazO+U= - +github.com/gorilla/rpc + v1.1.0 h1:marKfvVP0Gpd/jHlVBKCQ8RAoUPdX7K1Nuh6l1BNh7A= h1:V4h9r+4sF5HnzqbwIez0fKSpANP0zlYd3qR7p36jkTQ= +github.com/gorilla/schema + v1.0.0 h1:RhePNm5bGqvwu58UVVa/sjPOc5C60aOhZgBHWQTh4p4= h1:hJqhTosYf3R5XsKxm+0dOSxCiNiJOQB/7ajkOstcQRQ= + v1.0.1 h1:SRdkNFH8S7c3v2UCiVUUNhnBsJmWwiKboYbyODLYPX8= h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= + v1.0.2 h1:sAgNfOcNYvdDSrzGHVy9nzCQahG+qmsg+nE8dK85QRA= - +github.com/gorilla/securecookie + v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions + v1.1.1 h1:YMDmfaK68mUixINzY/XjscuJ47uXFWSSHzFbBQM0PrE= h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= + v1.1.2 h1:4esMHhwKLQ9Odtku/p+onvH+eRJFWjV4y3iTDVWrZNU= - + v1.1.3 h1:uXoZdcdA5XdXF3QzuSlheVRUvjl+1rKY7zBXL68L9RU= - +github.com/gorilla/websocket + v1.0.0 h1:J/mA+d2LqcDKjAEhQjXDHt9/e7Cnm+oBUwgHp5C6XDg= h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= + v1.1.0 h1:IhvMPOB8GxycsyOkvML1FrwAFiKgfHlS9KWKa6EqE6Q= - + v1.2.0 h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ= - + v1.3.0 h1:r/LXc0VJIMd0rCMsc6DxgczaQtoCwCLatnfXmSYcXx8= - + v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= - +github.com/gosimple/slug + v1.0.1 h1:dThmvIXq3immCGopPdm7WfY7p4eV8snrFOknZTEH0qw= h1:ER78kgg1Mv0NQGlXiDe57DpCyfbNywXXZ9mIorhxAf0= + v1.0.2 h1:cgDNdhrOlWqSdXN0wdyVJHRFSy73A6HfCcoI6tuGbW0= - + v1.0.3 h1:xW8VbiBa1X4dOJYeXDjhAJWcjvm+lxn3QLT8OGbuJfo= - + v1.1.0 h1:qazuiO8Pq90VbYCUh8/iNY8ShifnkXhRY6LOT8ZtNa4= - + v1.1.1 h1:fRu/digW+NMwBIP+RmviTK97Ho/bEj/C9swrCspN3D4= - + v1.2.0 h1:DqQXHQLprYBsiO4ZtdadqBeKh7CFnl5qoVNkKkVI7No= - + v1.3.0 h1:NKQyQMjKkgCpD/Vd+wKtFc7N60bJNCLDubKU/UDKMFI= - + v1.4.0 h1:CorzyNkphIu/RJawagGblB7M+aXakjt/MhuXvlKEb98= - + v1.4.1 h1:h29PRcKc8dPN//lJ9Ib6EKP50kG5AmpJ0yRjn7ksY/8= - + v1.4.2 h1:jDmprx3q/9Lfk4FkGZtvzDQ9Cj9eAmsjzeQGp24PeiQ= - +github.com/grafana/grafana + v5.3.3+incompatible h1:rpxeRqGiz/D4sXCQS4iqiUzpbh6KOClIzNKpjGY90U8= h1:U8QyUclJHj254BFcuw45p6sg7eeGYX44qn1ShYo5rGE= + v5.3.4+incompatible h1:Ue+crTJrQOgINdZ0yGt42UAjynBe2ReUf269R8W/RRA= - + v5.4.0-beta1+incompatible h1:VceOjZ2qjLd+YttyhQPItoqCXyEr9kL3zHtQn0wTVoA= - + v5.4.0+incompatible h1:1xxt2e94UZGGBB9pvt9R84VwY1pQbkk5r6rKLyOdo/U= - + v5.4.1+incompatible h1:eXUNXv61BVoydxcIfuRRbEAAMunTYoTpy0a3EtyFWdw= - + v5.4.2+incompatible h1:IBmlh0FKISC6Pj6F6zwJsvP+XkBWZevBDqprhGLwYnY= - + v5.4.3+incompatible h1:+nT+ADXgOsP9YC3uT1ydiFC7fTKkDxOPpPEcqVlGoyI= - + v6.0.0-beta1+incompatible h1:8VPhbr1F231OGses3HS8mZqsoqeHmAzQ1/0AVaTfBcI= - + v6.0.0-beta2+incompatible h1:EiZRU+yoarswnYONeXl/FNCyGg2HZqBYPqMLR1fKP1Q= - + v6.0.0-beta3+incompatible h1:o1pF4HDWk0kpO6s70m2fIVG3rVtWotphPabrUW2A5eQ= - +github.com/graphql-go/graphql + v0.5.0 h1:ssPB6Byi+mfBm6zI6yRQhbgHQQJJMh7qgBf+B1aBu/o= h1:k6yrAYQaSP59DC5UVxbgxESlmVyojThKdORUqGDGmrI= + v0.6.0 h1:GfvaRDnzkyp160/2WebwvLiXCaAJci87G/FSsFwe4zY= - + v0.7.0 h1:d8FJNktjN7z252InPq3Esq30EjP3Wo1DFxiGSyMS90k= - + v0.7.1 h1:hRcwvLRSINzgwLp8SqHtzUlAjUvIkN6SqJJvIrPMQKk= - + v0.7.2 h1:taAtizI+aQQE8b5DVhylo/KvBVm2KfAgfjxv48loamA= - + v0.7.3 h1:+nNk2hSYiJeEEzZFwlEuX78iPyRrLXuw2tANQo0ATn8= - + v0.7.4 h1:mXfK88XYicw3O0bfPAgiWb50iHGgXatlcxVbr2p3AY8= - + v0.7.5 h1:/JYC+NCUsSAfP/bVn1/ij8zvc7kzLwXUMyctSXdsE6o= - + v0.7.6 h1:3Bn1IFB5OvPoANEfu03azF8aMyks0G/H6G1XeTfYbM4= - + v0.7.7 h1:nwEsJGwPq9N6cElOO+NYyoWuELAQZ4GuJks0Rlco5og= - +github.com/grpc-ecosystem/go-grpc-middleware + v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus + v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway + v1.4.0 h1:imhhuBJyLcvIi1OHmWDyrOMJP/A7mgmhf7GszdyhDpY= h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= + v1.4.1 h1:pX7cnDwSSmG0dR9yNjCQSSpmsJOqFdT7SzVp5Yl9uVw= - + v1.5.0 h1:WcmKMm43DR7RdtlkEXQJyo5ws8iTp98CyhCCbOHMvNI= - + v1.5.1 h1:3scN4iuXkNOyP98jF55Lv8a9j1o/IwvnDIZ0LHJK1nk= - + v1.6.0 h1:MQ2oj/ms4WsaAC1GT9BG1DFsxcyV5N1b9FdWunXAT0o= - + v1.6.1 h1:N6Z6yCkj/XfYGhTRfxEhInVcslxlfw4Bw+Di3GqW5aM= - + v1.6.2 h1:8KyC64BiO8ndiGHY5DlFWWdangUPC9QHPakFRre/Ud0= - + v1.6.3 h1:oQ+8y59SMDn8Ita1Sh4f94XCUVp8AB84sppXP8Qgiow= - + v1.6.4 h1:xlu6C2WU6gvXt3XLyVpsgweaIL4VCmTjEsEAIt7qFqQ= - + v1.7.0 h1:tPFY/SM+d656aSgLWO2Eckc3ExwpwwybwdN5Ph20h1A= - +github.com/guregu/null + v2.0.1+incompatible h1:DQCDBQ7g9VnyH1cuOHIoEUDCIWdJ/FoHAd2GsqM0ppk= h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= + v2.1.1+incompatible h1:R9lg8cS85qvWsfz3RW1P0M8AwXRUae+FywE974nNzuU= - + v2.1.2+incompatible h1:6wQTdgkdM4H49tC7s1OA9qQJAEc1WH4idfoPJJEHCNQ= - + v3.0.1+incompatible h1:pGw2Be81Bkw9RjMSLSuTZaTLaODKbCl9hOmT7ioSlLI= - + v3.2.0+incompatible h1:wNkiGfCmoZzsCAX/NQ+1eWe7CdkpEJA8fQUiBPjGZqU= - + v3.2.1+incompatible h1:Nfu8DCXnfcMAPGaLwWn/qgoBeAuqeBEEybfG2OkAemU= - + v3.3.0+incompatible h1:egMb2dwXrFlTRgp6z4LBgmXOEvaUVqYWTbL2J4EX4g0= - + v3.4.0+incompatible h1:a4mw37gBO7ypcBlTJeZGuMpSxxFTV9qFfFKgWxQSGaM= - +github.com/ha/doozer + v0.3.1 h1:n37/6LjN+T5T8JAaNb5gZ/dNBEP+GGody0qG/cTJNwk= h1:6eul7yLUgIgrt0BdZFIqPh67Y8VWa3m0gQOgOORTsDE= +github.com/ha/doozerd + v0.3.1 h1:PYEbLNXslJmWJYltOxFoZXp5SK1ld7EWQfjjC+6pV1Q= h1:8U6Qw56qVXVVZAh3HRPVDWST0TILRtlBys3CvXM0wCQ= +github.com/hashicorp/consul + v1.2.1 h1:66MuuTfV4aOXTQM7cjAIKUWFOITSk4XZlMhE09ymVbg= h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= + v1.2.2 h1:C5FurAZWLQ+XAjmL9g6rXbPlwxyyz8DvTL0WCAxTLAo= - + v1.2.3 h1:ekX+fXQ7NYzD2quCCgmDekCCIp0Fsi1NE0ViC2CJm+8= - + v1.2.4 h1:QgwJnJBs9zuhZN8cCsxrFgT+8HS7TSv49XlwFI5UGVU= - + v1.3.0 h1:0ihJs1J8ejURfAbwhwv+USnf4oyqfAddv/3xXXv4ltg= - + v1.3.1 h1:bY7/Uo29Uq7+mHce4wgSHtAJSbeRl+4F7M+OHTuEeXI= - + v1.4.0-rc1 h1:vEYtR3Y6ENrcl3nMeb38JU0Kj8gnnIs9vhVufAKlUAQ= - + v1.4.0 h1:PQTW4xCuAExEiSbhrsFsikzbW5gVBoi74BjUvYFyKHw= - + v1.4.1 h1:yC/A2RW0kWJIlr/VUPwHI7UASngT178VTTIo15S4Wj4= - + v1.4.2 h1:D9iJoJb8Ehe/Zmr+UEE3U3FjOLZ4LUxqFMl4O43BM1U= - +github.com/hashicorp/errwrap + v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-checkpoint + v0.5.0 h1:MFYpPZCnQqQTE18jFwSII6eUQrD/oxMFp3mlgcqk5mU= h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= +github.com/hashicorp/go-cleanhttp + v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-getter + v1.0.0 h1:J4JXDg6kELIskI+qk1MRrlV7qBpa3UDmvo58Z3VcdEM= h1:eLvWiwRFYGj6M4qeM/PP6Fd0ANDRRxv+xrAiBROanoQ= + v1.0.1 h1:WlFPjyPrd34KmTQMzSPA0pn9JpRsuHjHaRTx0VPzxYw= h1:tkKN/c6I/LRSXLOWZ8wa/VB0LfVrryHzk/B0aZLKZI0= + v1.0.2 h1:ba+UwCRuxJ7+rS+cO6JnQZUrweQjmEAkwKu9r7+HCpM= h1:q+PoBhh16brIKwJS9kt18jEtXHTg2EGkmrA9P7HVS+U= + v1.0.3 h1:CelOrh4nPI/kzBsweEXM8f1dZFNSf1jH4ReJZXWHymY= - + v1.1.0 h1:iGVeg7L4V5FTFV3D6w+1NAyvth7BIWWSzD60pWloe2Q= - +github.com/hashicorp/go-immutable-radix + v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack + v0.5.0 h1:rKqhU6VO42cMi9LhhAreNOAUzQa5zdqFl+TUjG7kkUo= h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= + v0.5.1 h1:hwMd9IlnlQ6jGCBjyhgHZwPy3u95IIGFjejq79Lltus= - + v0.5.2 h1:VPpzMUjr5KSqptUv4i3bt7VCZH2xOyc3TUiEtkgL7oc= - + v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= - +github.com/hashicorp/go-multierror + v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-retryablehttp + v0.5.0 h1:aVN0FYnPwAgZI/hVzqwfMiM86ttcHTlQKbBVeVmXPIs= h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= + v0.5.1 h1:Vsx5XKPqPs3M6sM4U4GWyUqFS8aBiL9U5gkgvpkg4SE= - + v0.5.2 h1:AoISa4P4IsW0/m4T6St8Yw38gTl5GtBAgfkhYh1xAz4= - +github.com/hashicorp/go-rootcerts + v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-syslog + v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid + v1.0.0 h1:RS8zrF7PhGwyNPOtxSClXXj9HA8feRnJzgnI1RJCSnM= h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= + v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= - +github.com/hashicorp/go-version + v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8= h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= + v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= - +github.com/hashicorp/golang-lru + v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl + v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils + v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/memberlist + v0.1.0 h1:qSsCiC0WYD39lbSitKNt40e30uorm2Ss/d4JGU1hzH8= h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE= + v0.1.1 h1:JCBIrGIyaWQDNTHJlCNCUCOvJ08T4JPKc0Uc9xcovvM= h1:IsMNiIwroSErOGvihcN8kglKKIvAJNzJ5P7H9/XVPH0= + v0.1.2 h1:q7yR+4E1wvgjjAveOPdwxgEQd60Z5jCCF8pz6Zb6rJ8= h1:n8uF7k+gpteS2BrOQVk2qkAKdCDc7YdEaD6nLpNFBVo= + v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/nomad + v0.8.2 h1:xNAxQopnKjh1N/9IxS961n1emXl8XYz3LLxrR5TGZ1c= h1:WRaKjdO1G2iqi86TvTjIYtKTyxg4pl7NLr9InxtWaI0= + v0.8.3 h1:5iQUQh3TtTrpSdQwYOgkYjI+Uvky8cjAzRlKIbbUvOQ= - + v0.8.4-rc1 h1:15NnM82R4304YeJs9QQtxY9eVOAKJ8Ih+zGu+iIg7b0= - + v0.8.4 h1:KKJjP24Q0hR+JFsFEmegPolmBdRuYy1OfSyfkuWJm7w= - + v0.8.5 h1:TKPulZ7YCnTOGKMZUgoQ0f0aeV0ZT95gygr1hAGA+jw= - + v0.8.6 h1:z+gocir324zUa88k9bIXkf0RpSgjVa9Izut+iV8T2qg= - + v0.8.7-rc1 h1:vI/JMQMxVn+55fcKJFqH8RJlxvreKuAzl2wdj780M08= - + v0.8.7 h1:jOrmJdAoWcyhKgoG4OxHQhG5SU6RniXFjfwKg6a492U= - + v0.9.0-beta1 h1:3u4LxFJNYSd4QR5sPvMRzmYEjfSRKI5VF2wHLcSUDMw= - + v0.9.0-beta2 h1:haKHe9AyERzoRmiliggz/MBhy9STxlGRIQAhgnFVJEA= - +github.com/hashicorp/raft + v0.1.0 h1:OC+j7LWkv7x8s9c5wnXCEgtP1J0LDw2fKNxUiYCZFNo= h1:DVSAWItjLjTOkVbSpWQ0j0kUADIvDaCtBxIcbNAQLkI= + v1.0.0 h1:htBVktAOtGs4Le5Z7K8SF5H2+oWsQFYVmOgH5loro7Y= - +github.com/hashicorp/serf + v0.5.0 h1:pm/nZuf8B94zAdyG7jFurIBBBzJFj/pCl+A/KYBB3mY= h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= + v0.6.0 h1:wZ0XaY2sDuq3henygf39+1Q+QK9A/4E69rfW6mceYX4= - + v0.6.1 h1:1bDcTHYMxgFP73W40g3TRb/hx9zEgTMpfs+6ZhzafUc= - + v0.6.2 h1:U8rjNQjMNrq/Zo+MbOVENu0diY3ilumB6kS2zyPCjZY= - + v0.6.3 h1:e8/w+e1zWM48MmJQDtktZNYCi5DA8vFVtPJWpPrEOoY= - + v0.6.4 h1:j5zxUB+BLvSuEkKOg70qstcmlusStXSPQ2gbm/+2F0Q= - + v0.7.0 h1:9NBx0ZSoEtMrWrNf2ByXsmoKcpJyHIU7xGU/itMCtkg= - + v0.8.0 h1:mRqNot7hGnOdAkmxvrN9U0tpdQ5Shlb5uPt4hdJou2U= - + v0.8.1 h1:mYs6SMzu72+90OcPa5wr3nfznA4Dw9UyR791ZFNOIf4= - + v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/terraform + v0.11.8 h1:fxt+ihK6GZA8Qj2OSNW/j5hn8sE7pFMFS6/HTseTBJI= h1:uN1KUiT7Wdg61fPwsGXQwK3c8PmpIVZrt5Vcb1VrSoM= + v0.11.9-beta1 h1:LIGWX0BoPCruLMLddpG1u8cKWx0DdvsHHWN/oOjZf8w= - + v0.11.9 h1:dL0cB5xsIg/rjySx1TVEnVg/FWdB03+jcKJ0O48FqPI= - + v0.11.10 h1:XYZ/V+teSckRfZdwxsoP+66v0slHixe5Ai8wxqY/lfo= - + v0.11.11 h1:5q1y/a0RB1QmKc1n6E9tnWQqPMb+nEb7Bfol74N2grw= - + v0.11.12-beta1 h1:fJPJO6oahPiYKYXnTBYQsnCJxCILwv8ok6up5nL2+s8= - + v0.12.0-alpha1 h1:jEDfX7EB2yx2wpxZS9n5O+hYbLQsBmQJkoIQT8/cQPw= h1:YvER8PBvJQTIG75o/uecN8Rs11kIqhwgJotgIMnVZJ4= + v0.12.0-alpha2 h1:shMRFOzg0jaFskaG6emxbR1M7AjQlFYDPrfxZvc9tcA= h1:c16IVVdhvB0IRH1YiqIQMLnyip/wAgzirH6UMkWJruE= + v0.12.0-alpha3 h1:lNsnXZ2luEf4DnmLw7pXoXGzazXkp1US97+PZYn1x3o= h1:9NILwib32l2sWRwP3V8sApI0naotwyv1yA+Ecl895MQ= + v0.12.0-alpha4 h1:/coDhm1r/9fNaOoyssPoOzg4ZFatrn/00fy3J+6KlT4= h1:/NPUSmdWTeKONyjGU/WorQ6BZEPkaAs4yC+LVKL7wy8= +github.com/hashicorp/vault + v0.11.5 h1:6G3922BuHAxy3icIgSTJiv6GQCqFgdmXBvn3L9bNrZA= h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0= + v0.11.6 h1:+gCdza4h7JiQB3OhQdy1SEp/itCjZASx5pJjKjpxvjM= - + v1.0.0-beta1 h1:fqH+uqY8IhVqggArFOAHdwQH++ktzXE1p8WMn4psFMQ= - + v1.0.0-beta2 h1:wZS5jlCwUGWtOtKvQ6JY/8EzYyWLIRPY+qN1uIq9bfo= - + v1.0.0-rc1 h1:T5ZCugyl03wKpc2blVQ9qU5wxn/oFuRcqMsr3g6kHz4= - + v1.0.0 h1:TWu6XtmCchkhdsZ2SdMyt5mBKPS/SpTjIQ3Zaubgu2I= - + v1.0.1 h1:x3hcjkJLd5L4ehPhZcraokFO7dq8MJ3oKvQtrkIiIU8= - + v1.0.2 h1:CpHnQQKqhquAfC862BiwhksW5Fqhhv0BKlxXpoMlZsA= - + v1.0.3 h1:8qfP7xbldsLHnTktm1BoxOwlHWLjqr9t7QNbkE4Wbyw= - + v1.1.0-beta1 h1:96PSGlz5ziWsyWj6Hf1p0TBK1mSGyEG2jvfzKEgNUsk= - +github.com/hawkular/hawkular-client-go + v0.3.4 h1:s+6IAPZymlvz8R0naNX13zQmF4ua+TWHQZ5xDr3aAyQ= h1:S66kdEKTztNu/GH+yD/+5medwu3yMhSNVaJQuiauls4= + v0.4.0 h1:jiWZ0AmS0Cpr/fS76bBeFOaSB4lY9ELtvI0LWsZ16do= - + v0.5.0 h1:mLpRulqBOYyrgO8jKpdR+wDHqKt35nqP6tHa8xUktj4= - + v0.5.1 h1:T16y8qIBIDHj9Z1vdvx70K8dVb2vO8Ur78p0VMzAaK8= - + v0.5.2 h1:K4znjMHJ9VndLKTxITuFsc94T6g0aPTLfK0uxjxbRRU= - + v0.6.0 h1:WCJpLe9e2i4D7nZGbfX2gwdjprSNU+TtkggW9yx88ho= - + v0.6.1 h1:GIPNWhGSOFpKlse4RR3uQtK9hxX/2pCetZ0gInEmhIw= - +github.com/hmrc/vmware-govcd + v0.0.1 h1:iuRm76TP4ZvEPZ1RruR71M4I6AmKk8rAX4UGqJL1kCU= h1:SuBoA+q0Lqs2ZSa0rtZFFoRu7MW6TAfBNQPUsR60eB0= + v0.0.2 h1:hkXDTN2S35vvbzv6vwr3cpRl04H6sC1WJNFCVO8ynS4= - +github.com/hoisie/web + v0.1.0 h1:oCXxaS9BnWgJZsubx4X+NuOyKPc9y4kB8Eg0jof6SUc= h1:9rKIjxNOF05p21HiYMbaQy+ijn3nHaWi2mV3l/KnoIE= +github.com/howeyc/fsnotify + v0.8.10 h1:b7UvwW7veKj1Kyu95L89sV596C/LI0e1zisxjkLjyoI= h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA= + v0.8.11 h1:otVM78zDupDGJDP90DTTUwGu3nv/nfUNxkYLTwiJ42w= - + v0.8.12 h1:QgKKMaSzmjRFr5btlOw1c8hTxeE1UB8OSSG47SbdDlw= - + v0.8.13 h1:C9U4sJxJfjwqs2LNyXIoRkSeTf9h3c2IgnQjKAGXXNY= - + v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY= - +github.com/hpcloud/tail + v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/facebook + v1.7.1 h1:/0+2cI4nHTcQePY+kTPacy9/XfGsVNxmDAcR301UoH4= h1:wJogp9rhXUUjDuhx6ZaR5Eylx3dsJmy0zyFRaPYUq5g= + v1.8.0 h1:6lQakJHWBaD/MBrbKAelGFMwWBcqZo1B4/2Y8KzRIBA= - + v1.8.1 h1:MXHiGR+O3+dxzxCHnwrx5K7RreOXWaHaV2Jp8ryQ+g0= - + v2.0.0+incompatible h1:AzYpEnwEg5EiElbOY+Vi1Rv317B4yRTcBAF0jrzW9Y0= - + v2.1.0+incompatible h1:y6it6LIu75DATA5SjuWJTFbZteFEhafLDVbqy4tNypc= - + v2.1.1+incompatible h1:0JXO5taJnV1yF1flECS+bLN3/0J0dabd8jKCJk8LWfA= - + v2.1.2+incompatible h1:APtODfdBm89WyxkAhP2rZlDvPFJv21fQccS1dRFkTdU= - + v2.2.0+incompatible h1:glMVeJO7RddaTlV8ex5M99DjBkZSqur9L1+8pdOmHSI= - + v2.3.0+incompatible h1:+PTxegxsqAiwo1pkMQuQC3OH+zXdrvwHrWgp53kCf6g= - + v2.3.1+incompatible h1:+F6kUqKx5TifzMg2fXYZFdA/3VVNphdNK8G4PF2ui74= - +github.com/huin/goupnp + v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= +github.com/hybridgroup/gobot + v1.3.0 h1:yrNNyboEkKhaSZIBvOS7Clzn0iyJ+pO7Jw4a/1aWlc4= h1:ip2cePa6yP93BtAH/QfssMOG49owi6UGhdxjIfYhQC4= + v1.4.0 h1:3oaMMLMBNS99aoWz2iDKA2g8xhEY4Eo+s9UdMuc4dz0= - + v1.5.0 h1:IEx5VrXU44rZWeGO/EERUT0MopYBqvPO0RxQSiKBDWg= - + v1.6.0 h1:GYPCZaArlB99MnGDlnc+l6HPJGINKgD5mGgu8PC7VrM= - + v1.6.1 h1:pQvUHEQFTtAXUFe2n/jvJz+cS977VcEozzwPirfzHEc= - + v1.7.0 h1:+burqp8KIRWQtw0q/+DcMZpVs+yJ6HuaTPD0i/hY4Wo= - + v1.7.1 h1:Klt/y/kUOfrkwK7A3ZTH8/TR9hup1e3B43HevGBQyfk= - + v1.8.0 h1:PblnXxsxtbOexL2msWFvmb1eLfZAnnnCFSY/kcDzZGE= - + v1.9.0 h1:iYUxjcubjlKJC9MLjXD0+UfU+raKXBVhlXWyaKIvUWo= - + v1.12.0 h1:OKKoqn67HSaluBjtLYqW0m0PhvXt51QsYofBxVbOtRY= - +github.com/hyperledger/fabric + v1.1.0 h1:qEakQEoN5fnw7LDsRnnbC2hDne1takFL3yMedAgObow= h1:tGFAOCT696D3rG0Vofd2dyWYLySHlh0aQjf7Q1HAju0= + v1.1.1 h1:i8ZTQmgH7WXFPx+Y41krnDdF4h/pGRx+VbQXN9700sI= - + v1.2.0-rc1 h1:SNjW7/U1PtvfLqGhhndyXh2MtLu0sDo6Rq1hxU7oRgw= - + v1.2.0 h1:2JzOymSYZaeKv0+DyQr7eMUpc0g3Z2lwjBmMu92tdP4= - + v1.2.1 h1:tLVSNuzjn8+UYs9NVXo43fnguCC1Ix4Vj3h9iHZrbHc= - + v1.3.0-rc1 h1:/gNtaIjByh28GrIIjc+KhEs+342HaReFZhKKFZd3TYc= - + v1.3.0 h1:ijLQL3y0NZcVxfAlMUbeMUpR2Ci+ldiRHim02ohYUwI= - + v1.4.0-rc1 h1:Cc2eKGKOrr4Brij8/Plg+5Lb5dK0m2WnkDytZNV5GcY= - + v1.4.0-rc2 h1:4EzlHtIhvPWE5RfDsbnRqwGfv3v1TmWQ+2hX9YLWVTE= - + v1.4.0 h1:AiOUXysOwh4BmSLZaNzw6ZocZl0uByekPcc+g3PiXH4= - +github.com/imdario/mergo + v0.3.3 h1:ykJmnl1fiDtSWG6pvkGdccTS4PnsrCN9lPkuzSCA25w= h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= + v0.3.4 h1:mKkfHkZWD8dC7WxKx3N9WCF0Y+dLau45704YQmY6H94= - + v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= - + v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= - + v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= - +github.com/influxdata/influxdb + v1.6.1 h1:OseoBlzI5ftNI/bczyxSWq6PKRCNEeiXvyWP/wS5fB0= h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= + v1.6.2 h1:Cvl0/3n7/T6RkCefitJtEHWKJznmOA+9tT8gVx3vVS0= - + v1.6.3 h1:TioHM/BpNNH25J89jnL2tk45ww8e2CF+3Q/ih0CMw1I= - + v1.6.4 h1:K8wPlkrP02HzHTJbbUQQ1CZ2Hw6LtpG4xbNEgnlhMZU= - + v1.6.5 h1:o/AmF9wd1nq1mpTastR85EVUxL+bwKf83CxfVJHlA1U= - + v1.7.0 h1:K5PJo6Qla4DtGCY2pjmyMReSvN5DUWosS0cns1O7CnI= - + v1.7.1 h1:kkc04cz95zGSz1sKSzaP/+7X2r72894aWRCszbimfTc= - + v1.7.2 h1:+sveWfe1MVK3a7ZkwzB+gJx7th4af+nTANPzIY5L2k4= - + v1.7.3 h1:9BaicfUiqcYtQfquxpKX8BBlaluDqx7BG1LfMCRsleg= - + v1.7.4 h1:Ufqfn5xFixUXXj5Fgmhfa9RSke2R2AOvUOXfxgp9SCA= - +github.com/influxdata/telegraf + v0.1.9 h1:WcrSkAmL37i8TaujLY3JPWD2fWmbIRLq7V/btpklDJY= h1:HIOhVICa+3kYiBmzfDt9LEnDA++FNzRzf9eP0o365us= + v0.2.0 h1:74mQw5OT1/CIBPmQu5b37hSX4Tdj3FLb11fBwV9puBU= - + v0.2.1 h1:9Y+YNrtoPs1VdLaau5iq9v0/iplyv70jbSrP8XH6kS0= - + v0.2.2 h1:Z+SjixSbkF+NV8bXeatE6h5NrJtFabrHnTWcieJMcjo= - + v0.2.3 h1:wvTgweGUiTG/GkJTb8NzpRXk0uFI86/73bq4lGkn/pQ= - + v0.2.4 h1:ASVNC9VxMRTMWnSVzzOBWuX6Mht+JO/S9O4xh4DQwac= - + v0.3.0-beta1 h1:yIZgQ8xVMdqM88SL2IEw2uAlRYest2WguER+M/d3tuQ= - + v0.3.0-beta2 h1:j8MURhEzLGmzXErhxrcWXjUmiztSqkMDPNRp2C0xLII= - + v0.10.0 h1:8JjbYOH4YKnZba4BWdiKjj3m8KnTJjE1bgvCBwCaANs= - + v0.10.1 h1:24IsNJ+yVAvbXiJjIV50taNDPW37b85P6a83LkPDT4c= - +github.com/influxdb/influxdb + v1.6.1 h1:DP3MPrdfuXLsaRrYBHzJa1M2QeUm/DzBxlfZPc0Xu0E= h1:GpjLgHRqWhDGlPAg7+Rj6NAYuzPojBM8XLG5Ouvvq+Q= + v1.6.2 h1:CHkLDuW9fDgcckktJMsRAk3zimM0YdBkgKwWJfQhnYM= - + v1.6.3 h1:6ehQTt1twV88tyoazY6hT8EZX3SZsHG1EIrk5w6UunU= - + v1.6.4 h1:UWOUH2bH0UPNdcY3YnxWa5SakgEsKqoCaB6egTjeNXI= - + v1.6.5 h1:UQiAQ8EBtmtorkX82SHRGDAfLUadLqB3+dCRAHCP1tc= - + v1.7.0 h1:Uz8b9o7xP4r+VF10MUEZpSz+7hUZwu8HvN5IMFsTtvM= - + v1.7.1 h1:7TcKLR0rwwujjCbGN2t1sEw7TOQ1om6TPpDk/d6wrIg= - + v1.7.2 h1:XlOFSjNr/j01EdU526tiyBSyvFP3BDGL11COJREttX0= - + v1.7.3 h1:1/nGRGcqPLnFimlt3aBqr2p1VopehoH5dJ0p4a6ET4w= - + v1.7.4 h1:4rxgCRO04iRyBmKgE44nM9ebYZ+txkPj2BUWQLx8AyE= - +github.com/intelsdi-x/snap + v0.8.0-beta h1:zNTsbsM2vaHmo+om4B+yJUd9d3ElLmeTEKZVN75XAPI= h1:PBRZX6nRv10viScFwn4Zn0OY0UX9lIHCTp2+vOW7CpE= + v0.9.0-beta h1:sT10Fs1QJsBHiiYFdwuV3RfycV6NXF9znens7boy6Ks= - + v0.10.0-beta h1:rIS/kpBugi7j1nMG2Dip6SpQFMmc1mpIVumRlZbUtxY= - + v0.11.0-beta h1:M/OYWrV2jHCBTpYikgqSDnIS/sTbBmX1/iDjaE13uSQ= - + v0.12.0-beta h1:P5FOilgW55l8X/mVmOJQEoEJ7pQcg4dCKxM5vy74NtE= - + v0.13.0-beta h1:2xLbZ0jYC5Kmf2/Uy2ga3PFfrYnJDMQf7EwTF+0FrbY= - + v0.14.0-beta h1:MZKCS7p3RE0w0Xxh9MGgGJbe7lui2QP73ArR/SclKDE= - + v0.15.0-beta h1:DBeME1XfsoWuq2xnhtkDsWzaiEQLR7dgXOFrkvEk73E= - + v0.16.0-beta h1:iwJCL7CUR7jKiiCWbZHl12diTzh4RtkCjRNfCr2flrI= - + v0.16.1-beta h1:AtmO3dQzbcEkBnop7HGJI5w379i1QTY5xllsPreJ1MM= - +github.com/ipfs/go-log + v1.4.0 h1:uBUiTHoQSKYtqzFd1umNcTvi71afSg5avA3c+2tAVNg= h1:AKYS9u+ECLT8t30brTaoVwu3f1FpGx6C0352oI1zQ0Q= + v1.4.1 h1:T2ifaSU0YQsVOP87eo8NDmav2Coba5uJtsF8DaXG9AU= - + v1.5.0 h1:4Oauuiq1Pluu3MPGaHpLQ6uOmwINh8eOZUe5SK31+yA= - + v1.5.1 h1:Pax6qpQ+vqKAZWY8szhGqE2cp3YpGzdfH4kd14r68Vk= - + v1.5.2 h1:zrE2rC8WYT0HNq65RIHmmFE5uzNhddDSI/azLVNPpZ4= - + v1.5.3 h1:sZHI8SmguogIAJ10boCjbzumn1hloQF0YM1c0nypQFA= - + v1.5.4 h1:pXtzlhG8Q8Vj4+6jrEHxvCyn/ceZzr8AWpgGaKltLDE= - + v1.5.5 h1:QByTOBK2V8X7hY4MQWhv2m7GQarcL35MN9OXvIrmZZA= - + v1.5.6 h1:ENA6oMqszTahgH9tr9I7DJYI4tcaUk3VfXaDcKW91E8= - + v1.5.7 h1:8ef7XW41hzAnvVNkK5009/bOA9/MFr7fhdzkfAqvolI= - +github.com/issue9/identicon + v1.0.0 h1:pnvVMNlWfl+dgTT4rXjG/RFJe7+Ro3fXxcxN92T3Hqk= h1:3AzYqZwDvuBUW/MU1r70SzWmgxZzuj2SyTTUGrZAyT8= +github.com/jackc/pgx + v2.8.0+incompatible h1:QfXNG0rwud497zBF8IvzN6HfE/BhpBbR9100408ZdgQ= h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= + v2.8.1+incompatible h1:DUpuh8MiDYDJtw5Xkkwc4i9JsyriVKGvdq9vUxIY7Hg= - + v2.9.0+incompatible h1:m72b4cJA7tYXe7z58O5plnF89pQn7qW3Z4pVYND/UYg= - + v2.10.0+incompatible h1:iTC3HUC9HbeFu+JgxZ5iMj+ZZySfxa3TB3d2hMRQ5z8= - + v2.11.0+incompatible h1:IgFLUrzrhJj8mxbK44ZYExGVnjtfV4+TOkerb/XERV8= - + v3.0.0+incompatible h1:ktFg77nZ3QRecqx4KNyuyoxXJCgZMjJWHe8TI1M/jNw= - + v3.0.1+incompatible h1:svZ2XNsChlQeu4BSOB4ui4X4Bpzss/XY5TKnsS1kkIw= - + v3.1.0+incompatible h1:G6xyq9OLi10XNimlx3LFe3e+zkYhbYND9nitiMrJx48= - + v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= - + v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90= - +github.com/jackpal/go-nat-pmp + v1.0.1 h1:i0LektDkO1QlrTm/cSuP+PyBCDnYvjPLGl4LdWEMiaA= h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jawher/mow.cli + v1.0.0 h1:jbDHWiSHRJlNixLY9Tg91dd3cx7pi43w/WT0SlTuF5U= h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= + v1.0.1 h1:H47gmvfl3DlNEHfGmEK+Txm/yxyOzNE86CcSH4DOaec= - + v1.0.2 h1:CiBs8K6bKCrt6SdVttb+davPTqkBHmaEyhd8gPhcGWU= - + v1.0.3 h1:Gzeyd6chWE6QOMMcWh/A6mZ/szC5hpkYkqkzj4DakgU= - + v1.0.4 h1:hKjm95J7foZ2ngT8tGb15Aq9rj751R7IUDjG+5e3cGA= - +github.com/jessevdk/go-flags + v1.1.0 h1:Geou1o2RJhW9nUu+puVL2ASZMWjfj6+uy97+byGKL98= h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= + v1.2.0 h1:hzF3gGPUyvR8CkohvbuReyJykgogDQ5bCuNB7LIzgD4= - + v1.3.0 h1:QmKsgik/Z5fJ11ZtlcA8F+XW9dNybBNFQ1rngF3MmdU= - + v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= - +github.com/jinzhu/gorm + v1.9.1 h1:lDSDtsCt5AGGSKTs8AHlSDbbgif4G4+CKJ8ETBDVHTA= h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= + v1.9.2 h1:lCvgEaqe/HVE+tjAR2mt4HbbHAZsQOv3XAZiEZV37iw= - +github.com/jinzhu/now + v1.0.0 h1:6WV8LvwPpDhKjo5U9O6b4+xdG/jTXNPwlDme/MTo8Ns= h1:oHTiXerJ20+SfYcrdlBO7rzZRJWGwSTQ0iUY2jI6Gfc= +github.com/jmcvetta/napping + v2.1.0+incompatible h1:bq99tPkOEqJsTbBkT31te6X38y+3P/FvXVjnxgCqQIs= h1:dlR6SvwNgFr2ASHFGDIO2fhkZM2rU/9B6NB6xUciyv4= + v2.1.1+incompatible h1:U8vNF2RLEaOZkH8s2jSKZrffOTnnLq5Z0B+8wWDSJIE= - + v3.0.0+incompatible h1:dunlgXcg5SUnsaStWyjQTxHh9nOsj5/hMM9yiV7U990= - + v3.0.1+incompatible h1:w0yQ8wSEGS3X+uvpIvOl3YnX9vj2VUhBmz8i6V5rEJg= - + v3.0.2+incompatible h1:rL9o9EJHwskQkjvBxAveDAYMGS7EcsyDNvZgmUmATK8= - + v3.0.3+incompatible h1:nVCkMX2j74Ida0AgyO0UtqNa0GJnMdpk8TuF7fKPm5s= - + v3.0.5+incompatible h1:J3qNDMUA6EhET28WBtCKQn7xamFuAORtDUdoQKK5lSc= - + v3.1.0+incompatible h1:UIPzx/RBcgct9C8i/cTIL0R0v3O+o/h8PMT87BquqSU= - + v3.1.1+incompatible h1:2naMYrevDKiVSiPxd1XbUu5m8dtIqmiCMMRPMQUXezc= - + v3.2.0+incompatible h1:shS22lJu18MtyRV7IqWenMmrRXCjADcUcxONAnp5zxY= - +github.com/jmcvetta/neoism + v1.1.0 h1:btwSE803uhTVaYN1XShS6udb/xBhcUDt8sMeajRrgp4= h1:oo187spiW9p7dZGW+sMS+rOICd2fqFT9Oc/LdrFz7Kg= + v1.1.1 h1:zc3iignYGf3AquVhja3MVd/6IJTnBrQJyeBc+7dFf+E= - + v1.1.2 h1:CpQ9L2b4U9ToxR3QmC0SAmhQBjdp2WFQJtXQjsKHDPQ= - + v1.2.0 h1:mGkctG9ozbTE255PK7faBEXIm4TE4JRVBJnUqMl2fvY= - + v1.3.0 h1:H7WeoBC7Q9AtHZJBNYYO98i0xJMx7zoQ099sSRbv2V0= - + v1.3.1 h1:GCFSl/90OYwEQH5LML/Vy6UlwK4SZ2OIO278UI4K7DE= - +github.com/jmoiron/sqlx + v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joho/godotenv + v1.2.0 h1:vGTvz69FzUFp+X4/bAkb0j5BoLC+9bpqTWY8mjhA9pc= h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= + v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= - +github.com/jonboulle/clockwork + v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jrick/logrotate + v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/jroimartin/gocui + v0.1.0 h1:D96Qxb4ofKJiIwEQmN9+/Z+vARRiuoStBVIYcxYZ28s= h1:7i7bbj99OgFHzo7kB2zPb8pXLqMBSQegY7azfqXMkyY= + v0.2.0 h1:4UtxqVXvWJRDX0FS13wzV2vafPscxKoslOHEBrN8g9E= - + v0.3.0 h1:qinwev3/gShLSz/IhB7kMQGO7SbqXFM4TKU3Zv8d8DU= - + v0.4.0 h1:52jnalstgmc25FmtGcWqa0tcbMEWS6RpFLsOIO+I+E8= - +github.com/json-iterator/go + v1.1.5 h1:gL2yXlmiIo4+t+y32d4WGwOjKGYcGOuyrg46vadswDE= h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jteeuwen/go-bindata + v2.0.1+incompatible h1:BoGQq4qbBRvnem5UFhMX6D69u5ELAjTgH/NtP+JQp+o= h1:JVvhzYOiGBnFSYRyV00iY8q7/0PThjIYav1p9h5dmKs= + v2.0.2+incompatible h1:8paF6mFmP9mE4JJeo873RMnjrsRew/fjRj5VtZIf8vk= - + v2.0.3+incompatible h1:TeMRZ8Crz7V9qbqutwNwPj5St9HY0PaiMOEKoEuXoGA= - + v3.0.1+incompatible h1:azHsZPvV7BHDiQdSIDzLkRoaD/HqfEq6wYiDAa1AhUA= - + v3.0.2+incompatible h1:G2uCPkgOyO6AkNoTBrYBZSB5aliRvodELG/gSxNM2a0= - + v3.0.3+incompatible h1:G88+zfeFn6v0NsBXkC5TJOcGbvLyEgJDTNfTPJo48io= - + v3.0.4+incompatible h1:f18t1uRj1HCVd6z4TEIay0sadVEZ5lJ5AOA+zRsjLts= - + v3.0.5+incompatible h1:uHsqlPpK6LxFmX6lGK/Y2C+Yz54fOTuI8ccwsQhvmLU= - + v3.0.6+incompatible h1:bL6Q+9Fu99+Js4uXLfL1nHdUVSVcvmcofTlt1FNdksk= - + v3.0.7+incompatible h1:91Uy4d9SYVr1kyTJ15wJsog+esAZZl7JmEfTkwmhJts= - +github.com/juju/httprequest + v1.0.0 h1:WyZyLnwnhjVOGCIw9qwyRLlftIN7jKbjZmN7yvnX/W0= h1:ogcnuLPnijli/VAQT3/CU+2EdSTVsGRfpWTV/VY457I= + v1.0.1 h1:p7XMlMkx0A8gW6sws2+uHcRr38f9BvF8MQOfKfJihq4= h1:K+CyYVHU/NcfbMpK7YIVobh4U4Fci3EUB2AqIRtl+xs= + v2.0.0+incompatible h1:+WtiSbRkEwdqKRBi+4JH8PTdNxBa/h8U8RIzdYaMENI= h1:ogcnuLPnijli/VAQT3/CU+2EdSTVsGRfpWTV/VY457I= +github.com/juju/ratelimit + v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY= h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/julienschmidt/httprouter + v1.0.0 h1:wqU8SDF8HdYSM+My1MRVV+Er1dDqGTH93dqI6J2wL0E= h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= + v1.1.0 h1:7wLdtIiIpzOkC9u6sXOozpBauPdskj3ru4EI5MABq68= - + v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= - +github.com/jung-kurt/gofpdf + v1.0.0 h1:EroSdlP9BOoL5ssLYf3uLJXhCQMMM2fFxCJDKA3RhnA= h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/k0kubun/pp + v0.0.1 h1:HNWb4RHQrpinW/NN6di95NoAxq8sQUwuuTu/UZB7buk= h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= + v1.0.0 h1:ElO1Z7a1Oh30+EgHmYNESZ5fl7GNqy4glrw7PE0oCBI= - + v1.1.0 h1:/3l1Fra7N1wGzPPGzdnUZ0yxeaEe7c1bs34wBr6VS6o= - + v1.2.0 h1:QOSAufLQqUuqmtdjYiy7FOb7R5TPxsmhvr6xlxFH6e0= - + v1.3.0 h1:r9td75hcmetrcVbmsZRjnxcIbI9mhm+/N6iWyG4TWe0= - + v2.0.0+incompatible h1:N11dO6yXFa+gfbCQqytSQ3z0yB2afnxzr5LiOsjHCiw= - + v2.0.1+incompatible h1:SN82mMRx22WOazm72mkv4rqU+68AScRQ8i6aSDI1pEE= - + v2.1.0+incompatible h1:Q1znRhsEpan5denzKeCIOUCyLWQTlopZYpHFHZLu9Ig= - + v2.2.0+incompatible h1:CJdCM8D10voAW/MDCZwD7b90vL3CUHjq0konQ4uDMZ8= - + v2.3.0+incompatible h1:EKhKbi34VQDWJtq+zpsKSEhkHHs9w2P8Izbq8IhLVSo= - +github.com/kardianos/service + v1.0.0 h1:HgQS3mFfOlyntWX8Oke98JcJLqt1DBcHR4kxShpYef0= h1:8CzDhVuCuugtsHyZoTvsOBuvonN/UDBvl0kH+BUxvbo= +github.com/kataras/iris + v10.4.0+incompatible h1:oVbhEAmn+OXJSWtECeUtVFQTPoSSTl4GTkfylGr+yBE= h1:ki9XPua5SyAJbIxDdsssxevgGrbpBmmvoQmo/A0IodY= + v10.5.0+incompatible h1:rOhBFECXXhq99uPgmh67pMzrx1j2OO93Y3rwiDgeECo= - + v10.6.0+incompatible h1:KIXJR6MKynqS9feOURFX+DvT547S127u9IpLJOo1+DE= - + v10.6.3+incompatible h1:LnUDdsVGZWTD8zSy2IZ5LO3ZClQOWRGPcw0kcldzG0k= - + v10.6.4+incompatible h1:FJvOvPsr+u6ei8Vbv8/A4v67E8+YMUlRqHegbxVAcVY= - + v10.6.5+incompatible h1:Vq3qX3JTxM/6RfvMJXZQjTrfvsGVn9DjR7/KveQAbhY= - + v10.6.6+incompatible h1:SREtCfMe1MQLxZCJmDY7C4dfeFhAec///KC9V5wKQPc= - + v10.6.7+incompatible h1:K0K2vh7wJTkMCjCbWmuPDP7YpPAOj9L2AtU7AN79pdM= - + v11.1.0+incompatible h1:hRCQxJTg2+sOmgK7+TUJKy27qL1L+UYWqMbbfjVCKnA= - + v11.1.1+incompatible h1:c2iRKvKLpTYMXKdVB8YP/+A67NtZFt9kFFy+ZwBhWD0= - +github.com/kellydunn/golang-geo + v0.4.0 h1:Y7zhjG1d30csXnl/nxHgmXJCSn0+mwVCbU9iFHkqNJY= h1:YYlQPJ+DPEzrHx8kT3oPHC/NjyvCCXE+IuKGKdrjrcU= + v0.4.1 h1:nzmLSHd08rwAV15WDxV10/Pivn4Xa1UQCG51NHlNsk4= - + v0.5.0 h1:Fecln6rTLKoeKWM91FndEkyu7tJo9Q/vNyj+jZE9OmA= - + v0.5.1 h1:wP/9GnjyKmpx5tojzcjrUbhnUP7DEfHxUHsiAmd3xv8= - + v0.5.2 h1:jk9dLXxhXwhJV38KqODWFMSiuTpuu6VTgSFdNZwh67U= - + v0.5.3 h1:8jvZQlhTUG4urcyFF4c03oxSW0ProbZR1lKXmJDJl9w= - + v0.5.4 h1:67+WUWOM+z7Xo5+5e25YUwy+kieY+NZJ68BUloDhPrg= - + v0.6.0 h1:mLV0mYhczeAz2Af2XTr8DSaKastU8EvUrnbYIXymVBE= - + v0.6.1 h1:946ajyqiazGjybq1C7fSOM16A4XraEW4djDceo9tmxw= - + v0.7.0 h1:A5j0/BvNgGwY6Yb6inXQxzYwlPHc6WVZR+MrarZYNNg= - +github.com/kelseyhightower/confd + v0.9.0 h1:587MZULGb7NXQ5wsi5q/4tsOfDwCvuvKOMvYpJUxgFE= h1:0Q8d8BLyi6OehU2uYJZjOpDnEDouV7LE3bswmPZ7co0= + v0.10.0 h1:CTpRg4nqjxyJYTW9YtXumtwjMgyOUxjEQnia+vZGhZI= - + v0.11.0 h1:yGJ+HyMym7VXXHcZ4Bpi7NCNQ5ZVzvZV2N8YKgEcHa0= - + v0.12.0-alpha2 h1:hPrHdZAozAVktNaWxHHdwKym1YHU6B9/aWpEos5wsCM= - + v0.12.0-alpha3 h1:i7GV+neZr0KXW+gTB/CMIsBQXx1Sl7DIz5fD6z98BEA= - + v0.12.0 h1:ETy2fW3MQjnhyioiDzjdF4aXveR3aPFSBONkztVWSKs= - + v0.13.0 h1:tMyCRWjnhqsOtnVyB7iyTTjFhQxk0dd7kSUge1xibNE= - + v0.14.0 h1:UXLvu1FPYEvQ4+JKGlsexOcYuFHBf2uQohziJiuhYyM= - + v0.15.0 h1:PyJAujS2c9yWlbzRlFc3aLAaho8EOHNuXMlyN7VbXmg= - + v0.16.0 h1:cZTibejsLOJ+FsyXQNmwbnq+arQJooKh1NH/+VqN40o= - +github.com/kelseyhightower/envconfig + v1.0.0 h1:QbKqpTSIs8IIUPfjr7PmESZaW1CGmXC3VWz6Ijj4Stw= h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= + v1.1.0 h1:4htXR8ameS6KBfrNBoqEgpg0IK2D6rozN9ATOPwRfM0= - + v1.2.0 h1:ShuWkCxhdgKvpbfMMuCPjAKfdMDS/iClYwdQDByknVk= - + v1.3.0 h1:IvRS4f2VcIQy6j4ORGIf9145T/AsUB+oY8LyvN8BXNM= - +github.com/kennygrant/sanitize + v1.2.1 h1:mMPRXg9eiv6j5N1p1ml3CaGnXHfFi0Doqk8Q/KurQAs= h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= + v1.2.2 h1:cVuA2JWFyBOPkrbapO9IfyYFRmOisrtWBNLJirdUgNI= - + v1.2.3 h1:lMTHgebyLyRtvNyIAnsKyp0CO/zAS8+YmyWRDJ94WBw= - + v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= - +github.com/kimor79/gollectd + v1.0.0 h1:6APoEersLJ2W0iwWj8C7COlienQ8XTWh8np4w0ggI8k= h1:lDxzEAixH34FPZ0nBIpjCu2vR3ZdIKZbbnf2rc+b2ao= +github.com/kisielk/gotool + v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress + v1.2.1 h1:z1Ra6IKoPtIeVA8GV0SCQhuo6T4EBjlL9VwonZ8NYBo= h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= + v1.3.0 h1:kKeUSEWOEaY7o6tEo81HGkvA90Q+qCd1WIkOjr7HgvQ= - + v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8= - + v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= - +github.com/klauspost/pgzip + v1.0.1 h1:J1UvIV7CrOZlEMyfAfnqIzTmoPHEX0ODZsLATb71mkk= h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= + v1.2.0 h1:SPtjjC68wy5g65KwQS4TcYtm6x/O8H4jSxtKZfhN4s0= - + v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= - +github.com/kr/binarydist + v0.1.0 h1:6kAoLA9FMMnNGSehX0s1PdjbEaACznAv/W219j2uvyo= h1:DY7S//GCoz1BCd0B0EVrinCKAZN3pXe+MDaIZbXQVgM= +github.com/kr/fs + v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty + v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty + v1.0.0 h1:jR04h3bskdxb8xt+5B6MoxPwDhMCe0oEgxug4Ca1YSA= h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= + v1.0.1 h1:7MGdCiqXstfzw4RmqNk5bW7ZuKFFZT9SkCUUGc9SWDM= - + v1.1.0 h1:T6yjk/ScS0c7co+9lVJEIuPfU3FldAB16dvESPaoDoc= - + v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= - + v1.1.2 h1:Q7kfkJVHag8Gix8Z5+eTo09NFHV8MXL9K66sv9qDaVI= - + v1.1.3 h1:/Um6a/ZmD5tF7peoOJ5oN5KMQ0DrGVQSXLNwyckutPk= - +github.com/kr/text + v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kyokomi/emoji + v0.0.1 h1:7VhY4Nk1cR70WvgkdsxSORwHlW7xB7N/D6qajzkbrPQ= h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA= + v0.0.2 h1:iU96v4m7YzOpCq6G4OlN4PTCbCtEpQm6KjObXrjq+J4= - + v1.5.1 h1:qp9dub1mW7C4MlvoRENH6EAENb9skEFOvIEbp1Waj38= - + v2.0.0+incompatible h1:ftqSD1PzBkSr3I4/0ZZ7Cluaxv6sNi8CkhYE56Son6A= - + v2.0.1+incompatible h1:FhAFYCGqEJSsh4g/D+QAhousxF8ajJ0LdUf0Xjm+gKc= - + v2.1.0+incompatible h1:+DYU2RgpI6OHG4oQkM5KlqD3Wd3UPEsX8jamTo1Mp6o= - +github.com/labstack/echo + v3.2.5+incompatible h1:gRoNZHgcubt9mWO5vW5MDlADiQt8GVHH2EJDvImDYAw= h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= + v3.2.6+incompatible h1:28U/uXFFKBIP+VQIqq641LuYhMS7Br9ZlwEXERaohCc= - + v3.3.0+incompatible h1:gv5qUy/eIlbc+jM13CE6O2ezbkN1e6S7y1XKSzHZ0dg= - + v3.3.1+incompatible h1:bjU/fJR5CPNijPkd4k2U6tKVVc+R6T/xXZQd03G75sQ= - + v3.3.2+incompatible h1:w0jtWDcIVMCu2IpCvcj6WbJ+xg4D+0Py/uin+zN9j5k= - + v3.3.3+incompatible h1:ukZRJMwpJrfcFhdiyow9V1/kPCvaFAaGi8a8uwU/8xE= - + v3.3.4+incompatible h1:83oKvzg2Fa6PN1pQfsUxlfR4MiSjsFzyxbEXKzsE0cQ= - + v3.3.5-retag+incompatible h1:BpR2lD7yrxczR2+x7mEvd5ykyUHtj/PCqq6CKMrahWw= - + v3.3.5+incompatible h1:9PfxPUmasKzeJor9uQTaXLT6WUG/r+vSTmvXxvv3JO4= - + v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= - +github.com/labstack/gommon + v0.0.1 h1:DrrX8TJy2HZN5dfLJA9c3QQEAi+Qqu93K2TuAJ+STfg= h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= + v0.0.2 h1:Uk+AyGUXbI6Im8xBUXLzeMcswMYDeW2A+sbqoSY0EUQ= - + v0.0.3 h1:BpbH1uyyKVcVhVMbiodV+vTQv2OHatlZy/SV9mlFyJM= - + v0.1.0 h1:8M8zN5f8sUWXU5mj0xAR+C+t0zjUKmkx5sXyih93zsc= - + v0.2.0 h1:CmGHRiCIUd9wa6FfDsQ6zCKFdqVXIr6MMFipRmkLdh4= - + v0.2.1 h1:C+I4NYknueQncqKYZQ34kHsLZJVeB5KwPUhnO0nmbpU= - + v0.2.7 h1:2qOPq/twXDrQ6ooBGrn3mrmVOC+biLlatwgIu8lbzRM= - + v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0= - +github.com/lann/squirrel + v1.1.0 h1:kaqNksjVyUngjYKceeSGXPdJFnCGmILgnKJxIESk52g= h1:yaPeOnPG5ZRwL9oKdTsO/prlkPbXWZlRVMQ/gGlzIuA= +github.com/lib/pq + v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/libp2p/go-libp2p-peer + v2.3.0+incompatible h1:ba3gtfQixgq1Rytl2muUpZNuKId2rehuCQCW+58PKrc= h1:fS2eFKRO1IomwBAf+SuE8P1XOT/AAiqSgVPNIFA7Jc0= + v2.3.1+incompatible h1:4tutj9cUPVwn97AaxDoWjLr+acZ9G2FUltnCYEVipZU= - + v2.3.2+incompatible h1:PnOl+l5B8Bbs+CbZJI0A7XCwIKKRJYvDNYYH+H7WkgI= - + v2.3.3+incompatible h1:jgrgSO6tgm8O/o03Jq/SBoB+n2eKg2TBZsT48G/0I7Q= - + v2.3.4+incompatible h1:YgsaA3a5nL0NANtXzhIpQSbyFXmVuxbYMgXl9TcG/uA= - + v2.3.5+incompatible h1:zgwcWNo8+/Tuy7l7V+HT63bgbOZmXGGcAf1viMhK0pw= - + v2.3.6+incompatible h1:M7IFxOGTGbNa8BPSvr1nqCf6is3Nb9VhSp1hkL7Aglk= - + v2.3.7+incompatible h1:AhkW2YVjTfC8u7lnQqT/jZdTt3p2eyShY0dyF6Jyepc= - + v2.3.8+incompatible h1:ZMYXJdcX/38UBDjrl5BEYRGRgDkc+r+oMSfysyPM/MQ= - + v2.4.0+incompatible h1:1THIuO/h7GuITklYS7RgGCyoVl8aP9XH4NcokcdhDZc= - +github.com/looplab/fsm + v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= +github.com/lucas-clemente/quic-go + v0.5.0 h1:Q2eV3gF1uoPxxVx1+/R4qnKPlilFWIWjasC85oHZ2QY= h1:wuD+2XqEx8G9jtwx5ou2BEYBsE+whgQmlj0Vz/77PrY= + v0.6.0 h1:tPo/vfiSbHVSZsSvHNd9MDlUG6A6etSmlIluGcPLWvQ= - + v0.7.0 h1:yc+wZPOA6Lut71NIDqD8XLT+OZKPlseu8V1+jL/LxJ8= - + v0.8.0 h1:35pBTXknOhbz5V+cgXuBDFrmxcgHW6ESbVyoGuXhgFM= - + v0.9.0 h1:yQlTpNitV317oQntYwe1I3wtuI+8MFYLhbB6qVqoo/k= - + v0.10.0-no-integrationtests h1:K9YrKQNB9OSMOkX+PhQ30YzuYpgt7FfgFYITvIPrk7o= - + v0.10.0 h1:xEF+pSHYAOcu+U10Meunf+DTtc8vhQDRqlA0BJ6hufc= - + v0.10.1-no-integrationtests h1:iiJHgXPEepBV40kt8qRWycOxrUGS9XA6RX/ShO9pKzw= - + v0.10.1 h1:ipcMmYP9RT+b1YytOKGUY1qndxPGOczVEQkAVz3CZrs= - +github.com/lunny/tango + v0.3.1 h1:XYpre/m3wZ7KMbT9XGNChMkW2d3rQgtyLsMvYHEec/k= h1:UYYNJtWM9e9sa0/tuwCZrgmWQu6H5S9/dF2VvgVLchA= + v0.4.0 h1:SQv1/uK03FQ/bhCwDwMSxFmryqJXbPkiOY+g2wO+4ZM= - + v0.4.2 h1:VNInWo2t9b2wgb3p+XBSH6O4k/EeR6EjddX6sR/Cerg= - + v0.4.3 h1:OIhU6+8VwCmwx3xe4wMU/cPdHFWrZvzDSi5WQl6lIzE= - + v0.4.4 h1:/A5sDVFif0kNGVvPOJjCrHh09cjuhroTKjHNmggCUl4= - + v0.4.5 h1:dMjlJvRYn6HmXCCllZV/ZPQJsn+sW1vm3s4LZ0zPZjk= - + v0.4.6 h1:B2tKMgVvqjGs0ZbdLTiKd/P3A+FlbGcRb9ShLDBHHi4= - + v0.4.8 h1:HSZYRoq9jwwdQBUs08Cu9iJjFb7c9C6wRlg3zqO8FDE= - + v0.5.0 h1:ThYFWPh6tVFjf6s6jKcTe86DadgWRjF4PoDeaSA4zhY= - + v0.5.5 h1:A2m5hRiRyVZtbR9BkrgB8Bswi8L1s97vQglM7DfAtt8= - +github.com/lunny/xorm + v0.2.1 h1:BxnqMdmntk6PI5NpEJ3EYMzIZAcDmKp+RDiDbGL2Jgw= h1:dF05xwM+wPY9LVFW4VulsTHZAW1TZZwISDk2SGCd9Ao= + v0.2.2 h1:fOyQ61XXRdlWVl06aKmmGNhfXk6MLSo/LXP85gcLSxM= - + v0.2.3 h1:nE+XvUokH3hqpR8zgULm5+9SHNK2n12V2Q8dAE4IsB4= - + v0.3.1 h1:cd1S/u9UswQxuT3xykQoSp+RXJADX3nokTv9A0pm4Aw= - +github.com/magiconair/properties + v1.5.6 h1:C09pD/B3qhKWsYNwGcgotqsPMZPlF5YQoJ2bfNsrSwY= h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= + v1.6.0 h1:HtUzhdcKHtHmlTXBzD3oM3pyFYFdR+fzzgPwJAzcAes= - + v1.7.0 h1:8Oygzd+nhiSWfp2XOwattyfEt36Q/F/99zQJy4axKdg= - + v1.7.1 h1:y1yaj5GXa4mhCIWT/DKBLFWvT01Wy+nbRRri/vLvq5o= - + v1.7.2 h1:de14gtQSJmD380aERiT7g/BPsA0iDosrVRaU+EhZAio= - + v1.7.3 h1:6AOjgCKyZFMG/1yfReDPDz3CJZPxnYk7DGmj2HtyF24= - + v1.7.4 h1:UVo0TkHGd4lQSN1dVDzs9URCIgReuSIcCXpAVB9nZ80= - + v1.7.5 h1:yaOSImqiEHqVrOCCwSkX72kfRXuEEzkzOU4SevKv24M= - + v1.7.6 h1:U+1DqNen04MdEPgFiIwdOUiqZ8qPa37xgogX/sd3+54= - + v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= - +github.com/mailgun/mailgun-go + v1.0.0 h1:fUIiAHYwFwFziTBNtIssejCHOXPvdEJaseKg2JSPfG0= h1:NWTyU+O4aczg/nsGhQnvHL6v2n5Gy6Sv5tNDVvC6FbU= + v1.0.1 h1:qjObNIt6loI1P6Rfmxn9tJz1xTvrvy6Ed39in8tqhcQ= - + v1.0.2 h1:YrlCHTyA+CAoxWDPihdY0jY1NxsdXE0AvIAe/Py38vk= - + v1.1.0 h1:nWaeVwj8F+KFtyMHxjhlQUt1zBK0OhbHjLeVA8u2o8I= - + v1.1.1 h1:mjMcm4qz+SbjAYbGJ6DKROViKtO5S0YjpuOUxQfdr2A= - + v2.0.0+incompatible h1:0FoRHWwMUctnd8KIR3vtZbqdfjpIMxOZgcSa51s8F8o= - +github.com/markbates/goth + v1.45.7 h1:Zv0cMyxjdPcJqWlVcuVTSCLrnkxi7Fe3pPCKJYzZVtE= h1:ERjpUjiHOcJUNTBjgUhpKzkay5qNGcMdjRHYOIpF5Uk= + v1.45.8 h1:Msgjd4ulbjEPfjKCW3Vlks+HfxmHhNF6e1pmziNFyHE= h1:vOvF9V44wREdp5qcvaht/jnZcNFgpFd0ljcErYRECcM= + v1.45.9 h1:c1y5Tw6hYkrzrtJTfHTwEcA+0G4DgS6/Pp1tsOae5Tw= - + v1.46.0 h1:UCPxdYdkmG/SpA/QQY6cLzRjHdvwdRVAoFHgxyPsFvg= - + v1.46.1 h1:SUPPgc+fCOs33qo4J3IbU+5Y8hmi4khnydm6AgH38LQ= - + v1.47.0 h1:LWduf3MLIKHqj4NqUxxCm2WQK3cIZNJwKbBaquP3rJw= h1:ehX90HlYXaqutZBYjI7wGP2PT5g06Yd1sdzKSLJfveY= + v1.47.1 h1:NTC7OB+G5GiNGJvxDndd6koHbiPgYnaA6Tk4zZJ8+dU= - + v1.47.2 h1:SWjRkpI8PsSAT1cxa0DwBpki2WmkeAbBIOl6IVlg1YY= - + v1.48.0 h1:5udgvaLO9qyQLAUGT5SJW8WYB+ahQgN3TISjzONrAUE= h1:zZmAw0Es0Dpm7TT/4AdN14QrkiWLMrrU9Xei1o+/mdA= + v1.49.0 h1:qQ4Ti4WaqAxNAggOC+4s5M85sMVfMJwQn/Xkp73wfgI= - +github.com/mattermost/platform + v5.7.0+incompatible h1:Ns4MWYHDtL0HU5Ld75ILHjT+xiaoLWKq50hhY8jNh7c= h1:HjGKtkQNu3HXTOykPMQckMnH11WHvNvQqDBNnVXVbfM= + v5.7.1-rc1+incompatible h1:5Ab3GAKBIEDuhLQBGMboE1JpCs34MeE+HAs8quyYhp0= - + v5.7.1+incompatible h1:ClP1OFZS2iOrmWqDHAY0XfhrZw3v+5cYD6/NU+h3JVY= - + v5.7.2-rc1+incompatible h1:kIDoPGlGUb6192InXazldyWe6BzE56IFtWjQ7XKuPyk= - + v5.7.2+incompatible h1:YvzZ2yHBHqOhs4s03ZojoQCuK3l2j6KsO6vhKJ0aQXs= - + v5.8.0-rc1+incompatible h1:pI6DZHHnToetB7BWPoWRBxspyn2JRO6gYbaGe5FvehU= - + v5.8.0-rc2+incompatible h1:2jvP9rPI5oYdfrBF3pFYjLRtcfixP15tods6ac+3A/k= - + v5.8.0-rc3+incompatible h1:ZhpwGSfOB1qVGnB9oQVZSG915OuG93AornRTXXSVVHY= - + v5.8.0-rc4+incompatible h1:qYSA6PgZCR4ZYrl3nxNI6dSj3gy6payvG2KnB7D4KMg= - + v5.8.0+incompatible h1:6dRdGAaaavG/vaKq7uxh5o7lSf7pdVD6N1ONqbcAnm0= - +github.com/mattes/migrate + v1.3.1 h1:kaUHjsvvmhGIkt9WVaEn36Z08+CaHAcXWcnZj3JpSaY= h1:LJcqgpj1jQoxv3m2VXd3drv0suK5CbN/RCX7MXwgnVI= + v1.3.2 h1:cZkxdp0Zhlk3nycFyk6gmVuvyGcwjta5k2uTL/hJK6M= - + v3.0.0-prev0+incompatible h1:7XGrukAv7JA7A9W9T+2qNP9Scf8CKv0Xio/y65oWM8I= - + v3.0.0-prev1+incompatible h1:a6DTJl+bc8UkJqCPyNugst6+n6Vb+jOtE4QecINzxs8= - + v3.0.0-prev2+incompatible h1:q3sabHVLuqNGNCf3aHpn+C5Hc9F6/wlbR9ZqRhC97as= - + v3.0.0-rc0+incompatible h1:pymKM+uohHrm5ThaTLQmmmE4i/MUbMtgN5lq1uIFkp4= - + v3.0.0-rc1+incompatible h1:Oar9mtZ7NZwmcfnR0BPjcScKBlIPkoPG0DHT5+tDeXM= - + v3.0.0-rc2+incompatible h1:lRefEWXzEnbUQoF1qb2laFNxF791JU4iaecZKZLk2CI= - + v3.0.0+incompatible h1:/2dVkDQPZf83+dRtTbTLzy0xfq6VwJvLD356y3kpr4Y= - + v3.0.1+incompatible h1:PhAZP82Vqejw8JZLF4U5UkLGzEVaCnbtJpB6DONcDow= - +github.com/mattn/go-colorable + v0.0.1 h1:hdWOZaNIZTn/k1zbq9P7SuyHbKLKvGs0vVL1qQvj5sA= h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= + v0.0.2 h1:L6EoMpDAuxkwGgsSzzMx2FFJE1/FRISbx4TcsaOwZ0k= - + v0.0.3 h1:i8hcMpE5C7qWI8b1++M/4RzoJ6pA5TEjloaAm2oCRP4= - + v0.0.4 h1:g1xCGgHkuL4Ec7in+UFw1PUz/35aWcj1NnEFW0wiiQE= - + v0.0.5 h1:X1IeP+MaFWC+vpbhw3y426rQftzXSj+N7eJFnBEMBfE= - + v0.0.6 h1:jGqlOoCjqVR4hfTO9H1qrR2xi0xZNYmX2T1xlw7P79c= - + v0.0.7 h1:zh4kz16dcPG+l666m12h0+dO2HGnQ1ngy7crMErE2UU= - + v0.0.8 h1:KatiXbcoFpoKmM5pL0yhug+tx/POfZO+0aVsuGhUhgo= - + v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= - + v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= - +github.com/mattn/go-isatty + v0.0.1 h1:CUzGjDU3sTrdhXv9lYvVXq04SYzwkvgm46qjB0T7jGM= h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= + v0.0.2 h1:F+DnWktyadxnOrohKLNUC9/GjFii5RJgY4GFG6ilggw= - + v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= - + v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= - +github.com/mattn/go-runewidth + v0.0.1 h1:+EiaBVXhogb1Klb4tRJ7hYnuGK6PkKOZlK04D/GMOqk= h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= + v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= - + v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= - + v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= - +github.com/mattn/go-shellwords + v1.0.0 h1:xlTU5yhz4gG9QkPtaLZeDXCbsEkX+Ve2rxmVmG5PdSs= h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= + v1.0.1 h1:2/mQs/EosKUge1MHnAavnrNwa0wLnWDjG4dTYMGf/kI= - + v1.0.2 h1:5FJ7APbaUYdUTxxP/XXltfy/mICrGqugUEClfnj+D3Y= - + v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= - +github.com/mattn/go-sqlite3 + v1.1.0 h1:uggQm4+cc4c0du7NMV5XaXTnHRd0Zx9KMCT6csVT6ZI= h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= + v1.2.0 h1:h2FYSp18EBpSL2XOLiU2jIvYcJpx5NxGmT2EFlaUesw= - + v1.3.0 h1:NDrHgbss6o+4wsrCRAJbPLDTrVdsowaYSkhB16RHZy8= - + v1.4.0 h1:uBR791wsGR0MwOn2qBSbln4BRuv1/sN7jP0wQ8D6RVs= - + v1.5.0 h1:cD1JkMVOQgN+75Jni3VEkSwLkElfpfS194KbtOH9jX8= - + v1.6.0 h1:TDwTWbeII+88Qy55nWlof0DclgAtI4LqGujkYMzmQII= - + v1.7.0 h1:CiYZ8slwBLIMkDbDJCF+Zd2M8bZ1Gz02TMsm1V33Lk0= - + v1.8.0 h1:n4Yp7m+83/fCZWiO7nnf6WZAB41luGNFae+GMQPPe50= - + v1.9.0 h1:pDRiWfl+++eC2FEFRy6jXmQlvp4Yh3z1MJKg4UeYM/4= - + v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= - +github.com/mattn/go-zglob + v0.0.1 h1:xsEx/XUoVlI6yXjqBK062zYhRTZltCNmYPx6v+8DNaY= h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/matttproud/golang_protobuf_extensions + v1.0.0 h1:YNOwxxSJzSUARoD9KRZLzM9Y858MNGCOACTvCW9TSAc= h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= + v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= - +github.com/mesos/mesos-go + v0.0.1 h1:TZ7qdkDAcYu40pTNt/2LscEd3rOnaQfBC3UFlCPqH1g= h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= + v0.0.2 h1:gLQdBLR7dVXf6TRWpUrrtJcjdTL/exPAsWShUmEyrZc= - + v0.0.3 h1:3saQcA0BT72yo68KgNsCP3q1bc0GZmMTi5f6sVPUlUM= - + v0.0.4 h1:hlWy3Efmn8uF6D0hYRk8BZ2tId5azBTkx3AjOtg4ae8= - + v0.0.5 h1:prwQ9OgQHK9WynDEXU71qxcdP0QK3s5/jIzSfz5J/6g= - + v0.0.6 h1:OJZFaPVAjfaT1+wrKmB7LIwv6WOXMwANHcKXaPmzPEA= - + v0.0.7 h1:jQuDrBofpRbVZ+cq/VpMipKQFHNMqXc2arGSR6sVY30= - + v0.0.8 h1:hiAUHba+ycyZLxDiBUqKs91a0LbHZaAca988LzN19xM= - +github.com/mgutz/str + v1.1.0 h1:nwAiHNDx58Ps8MY+1bpZArKVcJcKUqdTw8JptE/pdP8= h1:w1v0ofgLaJdoD0HpQ3fycxKD1WtxpjSo151pK/31q6w= + v1.2.0 h1:4IzWSdIz9qPQWLfKZ0rJcV0jcUDpxvP4JVZ4GXQyvSw= - +github.com/mholt/archiver + v1.1.1 h1:H/dlJxc+8p3XZhe0BW/t6PDuk3OsV7pl+10ws+1oGHQ= h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= + v1.1.2 h1:xukR55YIrnhDHp10lrNtRSsAK5THpWrOCuviweNSBw4= - + v2.0.0+incompatible h1:KGdPVnP9sU8V6bvSr9v3B97yxKskJUm8U3okpC8WYmk= - + v2.1.0+incompatible h1:1ivm7KAHPtPere1YDOdrY6xGdbMNGRWThZbYh5lWZT0= - + v3.0.0+incompatible h1:iylGhvHjW96mpipixw7zQq/DitJiHcY8/a7EOBWDx54= - + v3.0.1+incompatible h1:y4NDwY7mZ+KILVeb8+E5glIkleoOomYY40qomAvp/Jw= - + v3.1.0+incompatible h1:S1rFZ7umHtN6cG+6cusrfoXTMPqp6u/R89iKxBYJd4w= - + v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= - +github.com/mholt/binding + v0.1.0 h1:rIR/c66hEh/SuxbVeRzF9IJP7f0OsRtDGljkjxcyKns= h1:fdTUY9qwc5FrbACIVqskE2Yjb3O/Kt9cPJ6TauRzkjw= + v0.2.0 h1:YiMIiIJJE2EuJo+lNtrLtcIKgdRQHA7E3H2JBM4xmsk= - + v0.3.0 h1:gGLnN9XAbyi5st4t1vDfmhOkHUbMwUGegVdnAnCRYvk= - +github.com/mholt/caddy + v0.10.10 h1:8EawDo3o02ZMQrNtN8t2ygWBGgOas//r/ckrnd0HpxY= h1:Wb1PlT4DAYSqOEd03MsqkdkXnTxA8v9pKjdpxbqM1kY= + v0.10.11 h1:s8X+R8DuBbrrMuUTcWSxlDe567B0s5EDmiDBKSYsioY= - + v0.10.12 h1:B/3/91ABQih4n9Vm9RLMzw9L26lKJY4IqVltg9erpB4= - + v0.10.13 h1:j7YQBPn9WNhvcAkXvNNm1Z6DRYBVX2wZepCbHnvIdYc= - + v0.10.14 h1:DQbK1E8/gOmRdAymJagUMFuW/8L7+D/XtPifpBw5/HM= - + v0.11.0 h1:cuhEyR7So/SBBRiAaiRBe9BoccDu6uveIPuM9FMMavg= - + v0.11.1 h1:oNfejqftVesLoFxw53Gh17aBPNbTxQ9xJw1pn4IiAPk= - + v0.11.2 h1:9EPjXWMDwpQlmSb57WA4/GBmTbYewJ04e0qWX+nbHXE= - + v0.11.3 h1:znIxClGweLx4sX0MxNEb/4QjGmOYAiWZAHFR5Qixr70= - + v0.11.4 h1:he7Ej5Jf9CXjETtfQQBr5KJ1b5ZWdPaBOJjiQs6LAIk= - +github.com/micro/cli + v0.1.0 h1:5DT+QdbAPPQvB3gYTgwze7tFO1m+7DU1sz9XfQczbsc= h1:jRT9gmfVKWSS6pkKcXQ8YhUyj6bzwxK8Fp5b0Y7qNnk= +github.com/micro/go-micro + v0.20.0 h1:SBxHxy37fbnyo+jLeP+4l+BLa8eh+rOckgB1iwWDTZI= h1:3z3lfMkNU9Sr1L/CxL++8pVJmQapRo0N6kNjwYDtOVs= + v0.21.0 h1:lmvZcLMokoGExbLY9ug/VcvMyjOnEqMeSj9IFTf6BNA= - + v0.22.0 h1:b2gMeqa5YHmSIBS7WEGro+ZxooF7YmIsEWs2UUzo2VY= - + v0.22.1 h1:U4gZPakGOhG1ypJw+kgQ1+O0JkDePntGjcdc7WSoR0E= - + v0.23.0 h1:1/nCg4j2IogYRXHu0BJOi0qltbGaEXcq0UCrumx3YcM= - + v0.24.0 h1:NxyVp/lQOqngxUrYZk/7rw+T3SE0f28JHBhAJqVZI94= h1:G/2AWGXaoz2RoiT8xNNzE9Jn46MAI3GiRvSw6QsCDwI= + v0.24.1 h1:rNAAPrIdlO5gcb+F/4eUMr9BGdoSu8mkKSjH3kmOggg= - + v0.25.0 h1:1PZWjxV216ZTU1fRl8s+nkY3eazpnkXYZA9GneRdPJw= - + v0.26.0 h1:WfLYCJWAuTY1f8qSu33MwWx4S7JctMVQAuUwWnxOLiE= h1:CweCFO/pq8dCSIOdzVZ4ooIpUrKlyJ0AcFB269M7PgU= + v0.26.1 h1:MJIwdZE5Bi+ptayIwV2f26rjBQdcAj4EUzXhrTSc9wA= h1:Jgc5gPEmDiG1TWE5Qnzzx5qyXnU9VTXKT1FkXkfvt8g= +github.com/microcosm-cc/bluemonday + v1.0.0 h1:dr58SIfmOwOVr+m4Ye1xLWv8Dk9OFwXAtYnbJSmJ65k= h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= + v1.0.1 h1:SIYunPjnlXcW+gVfvm0IlSeR5U3WZUOLfVmqg85Go44= - + v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/miekg/dns + v1.0.11 h1:spHZYYgVtr7q1o9F/AtZuJTVCTml7JkuLSccay9QdP4= h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= + v1.0.12 h1:814rTNaw7Q7pGncpSEDT06YS8rdGmpUEnKgpQzctJsk= - + v1.0.13 h1:Y72t3Ody/fSEkLQOC49kG0ALF7b8ax2TouzPFgIT40E= - + v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= - + v1.0.15 h1:9+UupePBQCG6zf1q/bGmTO1vumoG13jsrbWOSX1W6Tw= - + v1.1.0 h1:yv9O9RJbvVFkvW8PKYqp4x7HQkc5RWwmUY/L8MdUaIg= - + v1.1.1 h1:DVkblRdiScEnEr0LR9nTnEQqHYycjkXW9bOjd+2EL2o= - + v1.1.2 h1:Y/HbdlkFiiRU3Njr3hRk0KFKinYX90x7wtQMZvxShJo= - + v1.1.3 h1:1g0r1IvskvgL8rR+AcHzUA+oFmGcQlaIm4IqakufeMM= - + v1.1.4 h1:rCMZsU2ScVSYcAsOXgmC6+AKOK+6pmQTOcw03nfwYV0= - +github.com/miekg/mmark + v1.3.1 h1:SlJjKN8nYTIX0y/LUGVamAVSUDS4e5HxOBa7AjyUVxg= h1:w7r9mkTvpS55jlfyn22qJ618itLryxXBhA7Jp3FIlkw= + v1.3.3 h1:e45DOWDDnd6pZxDPtcB4ALhbnSI1EmL47EtdEic5qo4= - + v1.3.4 h1:Hhn9fLi13jo58UsyPQMbs8q9WHAU8m+3lYbrhBkvBUk= - + v1.3.5 h1:W9AlYy3snMQVnE5AIY8tbUdL8iMb9vLwnQOS/IASi4U= - + v1.3.6 h1:t47x5vThdwgLJzofNsbsAl7gmIiJ7kbDQN5BxwBmwvY= - +github.com/minio/minio-go + v6.0.5+incompatible h1:qxQQW40lV2vuE9i6yYmt90GSJlT1YrMenWrjM6nZh0Q= h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8= + v6.0.6+incompatible h1:AOPYom8W/kjdsjlsCVYwfb5BELGmkMP7EXhocAm5iME= - + v6.0.7+incompatible h1:nWABqotkiT/3aLgFnG30doQiwFkDMM9xnGGQnS+Ao6M= - + v6.0.8+incompatible h1:RBJrzsmxk259C1CvZ9clro73HBPA3zBwFwVePlkom78= - + v6.0.9+incompatible h1:1GBagCy3VtWteFBwjjNyajSf0JJ/iT0hYVlK8xipsds= - + v6.0.10+incompatible h1:cAdZRAXBaqI0hU06emlG+6S3wAh52Wr3xRtCK3R7EHc= - + v6.0.11+incompatible h1:ue0S9ZVNhy88iS+GM4y99k3oSSeKIF+OKEe6HRMWLRw= - + v6.0.12+incompatible h1:wA5F3AVAzW47K06l3WgXjBPY/Z3QdasUp+cDd6RzUnM= - + v6.0.13+incompatible h1:SQmjauWGQx5/x2TX47GBeX9xFVEuGB+RJGAVuZzNPtM= - + v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o= - +github.com/mistifyio/go-zfs + v1.0.0 h1:F7aMMlUou4K65tJvBjoTNkcL2RdCScCrkuSjMO2Do4U= h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= + v2.0.0+incompatible h1:Wz3ho59IuAHiXy6nRto18MIxaff+RgoL89TZmh4+1Gw= - + v2.1.0+incompatible h1:4QqBc+v+FSw2DloZ8IrPXAx/svvK1Rzcwy/SE1azeS4= - + v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8= - +github.com/mitchellh/cli + v1.0.0 h1:iGBIsUe3+HZ/AD/Vd7DErOt5sU9fa8Uj7A2s1aggv1Y= h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure + v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir + v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= + v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= - +github.com/mitchellh/go-wordwrap + v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/hashstructure + v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/iochan + v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure + v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I= h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= + v1.1.0 h1:PoCJ/Ct9du6caE+91v8ov4CLjO4XEBgkPk/dF1v43eo= - + v1.1.1 h1:0fcGQkeJPHl7DauilpdNG27ZxXHDSg+rbbTpfpniZd8= - + v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= - +github.com/mitchellh/reflectwalk + v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/montanaflynn/stats + v0.4.0 h1:Ug//pM6DXionEL5D5a8C0PJIXhojyxTFErfBVEEhqDM= h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= + v0.5.0 h1:2EkzeTSqBB4V4bJwWrt5gIIrZmpJBcoIRGS2kWLgzmk= - +github.com/mozilla-services/heka + v0.7.2 h1:Y8ZiWOXYY26GGEw/KOrvdL1XDp6OOazFZfFZX/LpPu4= h1:fBVzlne8jq4zln3gmLzN2ReVpb6guLvIyau8HeC0iVM= + v0.7.3 h1:WvxQZRIf3CVZuvu9Ci4NoZmudWmXIQ1N1J9P4E8jne4= - + v0.8.0 h1:tM6kKrD7FeQrAU9WoW4FQInwqCLcuPdOfU7ysXhl/5s= - + v0.8.1 h1:kbIb5Uo/0klLO2A2S671JXivka6GVXLrSYzKiAjWJkg= - + v0.8.2 h1:VkU9fz51ZGya1QNRGqHwXZS8qRlK5JAOxkEHjYXM+Yc= - + v0.8.3 h1:L41mndagpnvuUDCt1+3cBRY7z5zF8KH+5IK6UOb0vXU= - + v0.9.0 h1:CWHWSWwd4lKhuNv7CY5oysdja59gCdlQyASVWIXnHg8= - + v0.9.1 h1:tf8CPDjF83xbAAqGevjR/Mro6QUkkqAtbh8TZw91ha8= - + v0.9.2 h1:tgowoPYv96S/PmtqrZxA3gIuFWCgvdzOnKgFhZJ4gis= - + v0.10.0 h1:w+y6RPJkU6ZKeNbG1VvK9aSqJm0sru5TYcwOj6ejv8U= - +github.com/mreiferson/go-snappystream + v0.1.0 h1:FI3WCXQN8tcYKgcord7MsQqRM6kfErt++51rTP6nam0= h1:hPB+SkMcb49n7i7BErAtgT4jFQcaCVp6Vyu7aZ46qQo= + v0.1.1 h1:pVI3VGpn9432hLMKVKGnS6nKcktgp2ZNnwpwCetJdH0= - + v0.2.0 h1:qO4LxPBCB3LJeF4AhaY/b+QhO/vhhXg9aMHz24DaebI= - + v0.2.1 h1:Uj9xUTVpZheXybiuHaXWqrGqF45zM9nHQMg1rSKkcLA= - + v0.2.2 h1:Rb9OcmL9D939c3r0+EusuD1jEhPpRTh04WxJWwi6fag= - + v0.2.3 h1:ETSjz9NhUz13J3Aq0NisB/8h0nb2QG8DAcQNEw1T8cw= - +github.com/mssola/user_agent + v0.1.1 h1:nGq7GHiNaiNu1atYf+KpnxLT65NUoosjNugye0s7zGw= h1:UFiKPVaShrJGW93n4uo8dpPdg1BSVpw2P9bneo0Mtp8= + v0.1.2 h1:n0RH+xhRoaQUiEx82tBIvgWdFtWEu4pdtkbRSRuLZhw= - + v0.1.3 h1:6yX2D9nfI/RZdGTLLlqhKOypDM9Kv/G6M6O/kHGuQv4= - + v0.1.4 h1:rwKJRhpHLGJenKaUVsprqXa0JxDtfaO7UCI0GuMAAy8= - + v0.2.1 h1:PMEBN38DRFY1tGZr+BqwNegdkTtqSiAr046Tk6R6nKY= - + v0.4.1 h1:iTUaMpVrb2qWyvUw8UvK3ygWMd2lB1NGuZ1xhpBf1eg= - + v0.5.0 h1:gRF7/x8cKt8qzAosYGsBNyirta+F8fvYDlJrgXws9AQ= - +github.com/multiformats/go-multiaddr + v1.2.6 h1:o81W9MkbRtlO4/9ITFx5iLlzgnLEw/iDPD5jiSbNtFw= h1:1JAWc2R8uiQTLrCHI/lmOkXYu5B8025fQbZjq8//YgY= + v1.2.7 h1:EBphZlqqUCuRjGcaS479YewwDbk+fqyd1E+cg4TllrY= - + v1.3.0 h1:qv23SBIX9ayNNoGuPFp26xW9cFl3gR4iRXEGFt86aRc= - + v1.3.1 h1:li9hL2AOm3p+nWbiI5XoOuoQNX+0+nH7pAXNqmXnwZc= - + v1.3.2 h1:ujjFnBzoBei9JVY8qqxvnSOYlsMPsrNQE+3SSpTK9N8= - + v1.3.3 h1:6D/tX9e65hCW2mI/jfmre/bVkOQISow/DO3tVtkNL3o= - + v1.3.4 h1:KeGMWIBvuNcmt8NDxFOQn45mtI262QD6XedFtNxMlyQ= - + v1.3.5 h1:5R3nGEVlR2Cnd70x4w14uiRfHQHwspZcIN6Yld+oEuM= - + v1.3.6 h1:U6TYgF6rxYTW/yJMdh3fmSQhL9YBPlSCHOXmnFkCXNw= - + v1.4.0 h1:xt9fCCmSyTosXSvEhEqYnC75LiaDSdXycwOLJaDGPic= - +github.com/namsral/flag + v1.7.4-alpha h1:Mo7Jb27IFSrW2WKmU55iw8A9UXagVyv5zcyjAmIFEQ4= h1:OXldTctbM6SWH1K899kPZcf65KxJiD7MsceFUpB5yDo= + v1.7.4-pre h1:b2ScHhoCUkbsq0d2C15Mv+VU8bl8hAXV8arnWiOHNZs= - +github.com/naoina/toml + v0.1.0 h1:uDhVQf3Qmc81pKY1PnFOMgAhaAFxZODLxNt4qy1YQkw= h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= + v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= - +github.com/nats-io/gnatsd + v0.9.6 h1:xILwwT4b+o5xV4mJ3ptfrJFQ0WX99vZpwMgjiIAZ20E= h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ= + v1.0.0 h1:sxHtHzWb9GSziIUToe8IdpA5BJMZfkbGJNKACXfcP6g= - + v1.0.2 h1:DnLxkTZS2JHlBgt/7KJZQRZO83L7OxrXjKxlHxflEOg= - + v1.0.4 h1:99kZdSPRfdW75pT3GqVA4b7RXBRFjkMdUOAn8fYHO+4= - + v1.0.6 h1:E/tfJB32QoEt/IJUNwTqAGMHNKjrKr52b4yvy0gu7dA= - + v1.1.0 h1:Yo5uA2vay3xMMDysJruJrzogJyv3MBSCYfj+pR2zTD0= - + v1.2.0 h1:WKLzmB8LyP4CiVJuAoZMxdYBurENVX4piS358tjcBhw= - + v1.3.0 h1:+5d80klu3QaJgNbdavVBjWJP7cHd11U2CLnRTFM9ICI= - + v1.4.0 h1:/02WfGM2p1WU8xEapi44bH0Hdh71oEfrHiKiiqetdHM= - + v1.4.1 h1:RconcfDeWpKCD6QIIwiVFcvForlXpWeJP7i5/lDLy44= - +github.com/nats-io/go-nats + v1.0.9 h1:B6Z8g23jLAFpbTe3iZhg+errQ/4A61vnrEZFICWgujM= h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0= + v1.1.2 h1:sIFxvIp8KBUZRK25BGBHNTPMelOUTbpAPtb83755ivI= - + v1.1.6 h1:w42rQ9qyt6IyUXtp9l57KyYIn/1Gl8hCJSNBKg6NAIA= - + v1.2.0 h1:0YZp58mwYJE1C2WbECmBQjlGzkyjL+UmDYG+Y4efWmE= - + v1.2.2 h1:CE9FdkrxbV9xqXsnTHW7q8syEdwMaonYX5UsvE0ypKE= - + v1.3.0 h1:CrvnAwoB2A2Yma+PcM+5tC++3/wswhcy8OvzqbsUXZQ= - + v1.4.0 h1:HorYtzWLSxkmcEzAFmY6vJ20lFfeAPbrnkoAYgk8GSg= - + v1.5.0 h1:OrEQSvQQrP+A+9EBBxY86Z4Es6uaUdObZ5UhWHn9b08= - + v1.6.0 h1:FznPwMfrVwGnSCh7JTXyJDRW0TIkD4Tr+M1LPJt9T70= - + v1.7.0 h1:oQOfHcLr8hb43QG8yeVyY2jtarIaTjOv41CGdF3tTvQ= - +github.com/nats-io/nats + v1.0.9 h1:bljCKxqASHpMbrSyWnBsgSA9Aw8AE7OkfAWlLPwGVwA= h1:PpmYZwlgTfBI56QypJLfIMOfLnMRuVs+VL6r8mQ2SoQ= + v1.1.2 h1:jFFPWU96XpArKDaMbiuf9NiupknTiOlQy26zldaRl7w= - + v1.1.6 h1:dCWhg0ozPbL1CrXnoIPHjUig8CqccTctbN4wJTpZdMI= - + v1.2.0 h1:GWpGjidVhfjRJHHaS50xVc8evbjwnfpc/VyROnuMSb8= - + v1.2.2 h1:silCOicRPZNfnbWpivpCyGWPp3Tpz3kLgN2hNPLDeY0= - + v1.3.0 h1:SuCyvufVFktz8MEjAO3uykvrV/4k08Kc1NJ2xA7+Op8= - + v1.4.0 h1:BWGx6P9wCOAljM42Ci9iJMePfLR0/iEo6NZ/jWxatxw= - + v1.5.0 h1:kyKX8yDb+dYiYuLuRg/3nU7JSfMsDW/nVoimJ9kW5dw= - + v1.6.0 h1:U5b2apHOTZlUou+NGfCRWG4ZEeivbt2hpsZO4kHKIVU= - + v1.7.0 h1:1Mw9uuYUx5gs67Rvam3T7Pgn/KiGIrHmVetFAzaUg00= - +github.com/nats-io/nuid + v1.0.0 h1:44QGdhbiANq8ZCbUkdn6W5bqtg+mHuDE4wOUuxxndFs= h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/ncw/swift + v1.0.35 h1:1Bg5icot4nkYls4Y5Gu4FxX2d8hzlWi8KTYNOFGn0OU= h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= + v1.0.36 h1:U3hGIdY3KHHjXy1TIiSG330H0UiNP/9u58fTTHYj1Iw= - + v1.0.37 h1:YRISjBl7JO3a3Ojzrr/kJWVFaNW2bj2fy5UwDFZCbFE= - + v1.0.38 h1:ESdGbt1tXkVhONhnxb78E0dBpykDMalBW69LtAT00/I= - + v1.0.39 h1:kKWP/n50ohzUiB5m8/Inh0Pi5ftslc1UIyFSmTstSrM= - + v1.0.40 h1:0c+kzSF82qgP2TvDHwC534eoAMYTRS1jmr6KIMftTk0= - + v1.0.41 h1:kfoTVQKt1A4n0m1Q3YWku9OoXfpo06biqVfi73yseBs= - + v1.0.42 h1:ztvRb6hs52IHOcaYt73f9lXYLIeIuWgdooRDhdyllGI= - + v1.0.43 h1:TZn2l/bPV0CqG+/G5BFh/ROWnyX7dL2D0URaOjNQRsw= - + v1.0.44 h1:EKvOTvUxElbpDWqxsyVaVGvc2IfuOqQnRmjnR2AGhQ4= - +github.com/nesv/go-dynect + v0.2.0 h1:6SDjRLQOcZoUdCbkgMANl5LuV772hshhDxLtqAiHLS4= h1:GHRBRKzTwjAMhosHJQq/KrZaFkXIFyJ5zRE7thGXXrs= + v0.3.0 h1:BIkTLCTNvpYYUFSu83VEScrKIE3hru3DJtYK3M5Li70= - + v0.3.1 h1:8+yAgl12AZBnJdQjFyAKUreb5Gx46cY0YKKqh1Imri8= - + v0.4.0 h1:ap1c8ROQzx/egF8tPjJJ7PZrrtbp1gX7dHI45Ds71cw= - + v0.4.1 h1:SN4bDkQrc75sR15HCr4ugQnu2jX4ZEVrrb2tfzBAcPo= - + v0.5.0 h1:wXrNmBraO47p8VjEKQp/F4K/PwwOjYSUzBwNlF0tHek= - + v0.5.1 h1:NcOS6+40wb/ehm5N7LDLuq+bfc6QfC+RQmCK8k87sNA= - + v0.5.2 h1:X6IJ0frmoDyzhBdyl6vceXJ7Me4PX3ai8/pj6cZhUvE= - + v0.5.3 h1:ZjwT5DEJG64VZ3Cx+bunLMwJaAM80LjM9wwND1Av2eA= - + v0.6.0 h1:Ow/DiSm4LAISwnFku/FITSQHnU6pBvhQMsUE5Gu6Oq4= - +github.com/newrelic/go-agent + v1.8.0 h1:jr/XH0bzGqwf8bxPGdyf+CSi9PRIjMoCsGJDtteLNo0= h1:a8Fv1b/fYhFSReoTU6HDkTYIMZeSVNffmoS726Y0LzQ= + v1.9.0 h1:DEDLnB+UsGDCcZvMZce3DdyZHL7t400+f2G8eDAZdy0= - + v1.10.0 h1:bBzikxWb/BvAS013UqiJAvOKN9jqMI0DpCIcqkGjSBM= - + v1.11.0 h1:jnd8+H6dB+93UTJHFT1wJoij5spKNN/xZ0nkw0kvt7o= - + v2.0.0+incompatible h1:2LLCGB8HMKZwCAxugdZM1Yy8Neizj4Kq7wS2rFZWoZw= - + v2.1.0+incompatible h1:fCuxXeM4eeIKPbzffOWW6y2Dj+eYfc3yylgNZACZqkM= - + v2.2.0+incompatible h1:h7uU1vi+U6Z8TW4az5yewM68QMScsArxezuHvDFgSvU= - + v2.3.0+incompatible h1:UcQ3vOg6rP5TZbyJ4niqD2Mhwu7HZpNKu+9OzlSHIKU= - + v2.4.0+incompatible h1:vkvrQxNCtTfZ+KK15zSiOchOVg4B/jrC7bJiXiCk1K4= - + v2.5.0+incompatible h1:umBF/DtNZEO1ASmD0C8jMaQKD20nZS6os0l/upoLLfo= - +github.com/nicksnyder/go-i18n + v1.2.0 h1:X6x+iqwFGbtZEtyVJ/s2t3FGO3r4emSUHB/z6Gc3WMk= h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= + v1.3.0 h1:jAmCijPKtYQy43WmfxnVj4fu2xaaIl/JtW3JmVwfZKQ= - + v1.4.0 h1:AgLl+Yq7kg5OYlzCgu9cKTZOyI4tD/NgukKqLqC8E+I= - + v1.5.0 h1:nMTX+o1sp4o7lwnH3FkNswdWEtkzaGRs/DV9NlICNuU= - + v1.6.0 h1:mNvFF+Tn+2VXDvZcv7Ui/kzwfO6z/2XcJ2ChUHEB3hk= - + v1.7.0 h1:LomIyLNR8j+q+M0buXFTIqfTCKQ9akx8bmfXnoTN374= - + v1.8.0 h1:oCz3S6vDjk2an780yCNQc4VhWsPqJrweM0y8V2fzWaw= - + v1.8.1 h1:omZfCSJYIaw1kTZWSLAUTJ1m6C7HSwhXuYrbDf3Yeo0= - + v1.9.0 h1:p6IgYlHtynxFjBJsriZWoldnpU/ibnYNwzmYz0jakxU= - + v1.10.0 h1:5AzlPKvXBH4qBzmZ09Ua9Gipyruv6uApMcrNZdo96+Q= - +github.com/nlopes/slack + v0.0.1 h1:TyFfv41qapa3DVcEVsvff3wuOcbKaK8T9UU4JMoOa88= h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= + v0.1.0 h1:YnVhdQvWT/m0TDh3VNpSoCBDlD7Y4pz1qUqb/NrNyUs= - + v0.2.0 h1:ygNVH3HWrOPFbzFoAmRKPcMcmYMmsLf+vPV9DhJdqJI= - + v0.3.0 h1:jCxvaS8wC4Bb1jnbqZMjCDkOOgy4spvQWcrw/TF0L0E= - + v0.4.0 h1:OVnHm7lv5gGT5gkcHsZAyw++oHVFihbjWbL3UceUpiA= - + v0.5.0 h1:NbIae8Kd0NpqaEI3iUrsuS0KbcEDhzhc939jLW5fNm0= - +github.com/nsqio/go-nsq + v0.3.6 h1:4nqoL5hJtyGADYVxego+TzDsLGBgf+02D0sK/ig7/rg= h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN+Ito= + v0.3.7 h1:FgKbkpO5qmpsgxbHNgAugYm9un4FCNQp/zXoG4qq65Y= - + v1.0.0 h1:twXxb4R9kkSxUM1IIdpqLm0GT7B6n3GI2vqlxcSv0Cw= - + v1.0.1 h1:5uQyCSip18qDK4j10TOWEVHkoEHS4srfizDSRhmNSRQ= - + v1.0.2 h1:CyjU1jbfEarq+1+LDW1NsxHjRp5VtFrr3Em2eIiaP58= - + v1.0.3 h1:GXn2Qky0n8ynpIkpQcfIcbacjVUpjLayX2YPBUwHPKY= - + v1.0.4 h1:3e0R+UeSffho3OFQQQGSzCXIbaSb6SRz2j5j16BuIbE= - + v1.0.5 h1:jsXRL8a5q83ui9GQ5uZeoAx5DU4X3hEf045EJr6oU8E= - + v1.0.6 h1:h1AmKn7BbrNjUDPJPbWBOQW00ffdWhmvtbbMy1x/FNg= - + v1.0.7 h1:O0pIZJYTf+x7cZBA0UMY8WxFG79lYTURmWzAAh48ljY= - +github.com/ogier/pflag + v0.0.1 h1:RW6JSWSu/RkSatfcLtogGfFgpim5p7ARQ10ECk5O750= h1:zkFki7tvTa0tafRvTBIZTvzYyAu6kQhPZFnshFFPE+g= +github.com/oleiade/reflections + v1.0.0 h1:0ir4pc6v8/PJ0yw5AEtMddfXpWBXg9cnG7SgSoJuCgY= h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= +github.com/olekukonko/tablewriter + v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88= h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olivere/elastic + v6.2.6+incompatible h1:DABh8qMNCjk+X7O4nbX6A7GA8Aa7K6Z98U8rnUlq81Q= h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= + v6.2.7+incompatible h1:T2g3tZHKopnW1WKgkFCXp71MzPSTFVSgZLO+2gzhzNs= - + v6.2.8+incompatible h1:DOvOz8+bJZpp63gpeBd9LBo+mqFCoIZlOCE0dcbOC8g= - + v6.2.10+incompatible h1:O0l73yD32hMuwJ7hYONlQCqBrR2cCZGkWP7dBtdA8Qs= - + v6.2.11+incompatible h1:XpUEQm7v1YkDgZcG2Bc67oxreOm05T4dD7LWMTclwXo= - + v6.2.12+incompatible h1:JJ9FxBH/CkfeAXQbyUI8FqzC2vPivNiAXseD2ClQv5Y= - + v6.2.13+incompatible h1:CtRJjRENblXPfJ1F9T4D+NTvr/oqvbm/U58HXshhp1M= - + v6.2.14+incompatible h1:k+KadwNP/dkXE0/eu+T6otk1+5fe0tEpPyQJ4XVm5i8= - + v6.2.15+incompatible h1:j3rfMOkDbo53vnD8mb1Aa89O13RawD/l0W2xSji9FwU= - + v6.2.16+incompatible h1:+mQIHbkADkOgq9tFqnbyg7uNFVV6swGU07EoK1u0nEQ= - +github.com/onsi/ginkgo + v1.1.0 h1:9Dna3pyFNjgbQbFqOeXVgGmjymViv1/r/ArPw4+LgO8= h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= + v1.1.1 h1:x3juN0zCSyGMynu6Q/HH/sYrK010QanOlQe8cZS6WHU= - + v1.2.0-beta h1:3Teuu5bbLA4FDE2CLKvLXUlj+jrdNydde2AvoY4ssys= - + v1.2.0 h1:PpLjPPi/pzx5+cUQ5bMEOa+Dd10mtqsg67lj9lQlqMA= - + v1.3.0 h1:dIq/ph1T87+3AyCQgKFCIBlBWKqOd/livesOgD0g2wA= - + v1.3.1 h1:mUZgagGdExHOcJ05DSUfZ0B1EBAzzbWSqpZZuZYuoIo= - + v1.4.0 h1:n60/4GZK0Sr9O2iuGKq876Aoa0ER2ydgpMOBwzJ8e2c= - + v1.5.0 h1:uZr+v/TFDdYkdA+j02sPO1kA5owrfjBGCJAogfIyThE= - + v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= - + v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= - +github.com/onsi/gomega + v1.1.0 h1:e3YP4dN/HYPpGh29X1ZkcxcEICsOls9huyVCRBaxjq8= h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= + v1.2.0 h1:tQjc4uvqBp0z424R9V/S2L18penoUiwZftoY0t48IZ4= - + v1.3.0 h1:yPHEatyQC4jN3vdfvqJXG7O9vfC6LhaAV1NEdYpP+h0= - + v1.4.0 h1:p/ZBjQI9G/VwoPrslo/sqS6R5vHU9Od60+axIiP6WuQ= - + v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U= - + v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= + v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= - +github.com/opencontainers/go-digest + v1.0.0-rc0 h1:YHPGfp+qlmg7loi376Jk5jNEgjgUUIdXGFsel8aFHnA= h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= + v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= - +github.com/opencontainers/image-spec + v0.5.0 h1:G+GQNhpdujEqYujthmwRpwOZ3qR67gFsxbEEDKGEUrE= h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= + v1.0.0-rc1 h1:Y7Jr+W0poic7uVRFhKrz8G+UI0KawnlTo/cChNeFrbI= - + v1.0.0-rc2 h1:JrMI3ko8qAmUZJyWh+gjYMNMB7Hv2PRtZdEM9+QOUTo= - + v1.0.0-rc3 h1:+2+5sWYeOlm9MRDkl3TnjeFdcvyXXWJDr4JIwoLmDkI= - + v1.0.0-rc4 h1:bKYlqR9xbFIyaZVEdlWaG/YM5C5Ookv3hnDrkHCa8Cs= - + v1.0.0-rc5 h1:y+6Q6y07kBaYhJGp5cBj1vEvqrY79H4qG1mYWz2WksU= - + v1.0.0-rc6 h1:tHxPFsxnoBiEZ4QxNJLNWjqUwfhYZohA+7tGM7UVlU0= - + v1.0.0-rc7 h1:S9oZRiHHH05dPLkqlz6XmCa08yv9onZ2nhW8QNvowLo= - + v1.0.0 h1:jcw3cCH887bLKETGYpv8afogdYchbShR0eH6oD9d5PQ= - + v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= - +github.com/opencontainers/runc + v0.0.8 h1:L2gGxjY2hIGCuOuyP/cGULA5Du+jyOc84qZqIKzejPI= h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= + v0.0.9 h1:F6BWLZMIW7go74TNRTOTnr6OGUVWDot6IuqK+Uvn1EQ= - + v0.1.0 h1:mR2cOsbXtJDflXhd/x/j3l0wX9tEUkXTnJLzRkREN0g= - + v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= - + v1.0.0-rc1 h1:hpHvA48EjpIWvGtjbZSC2HlRIAUyBN1Yd0ho0tOIFNg= - + v1.0.0-rc2 h1:IVJPLY0O+EBbCthvT8/aXkNxlTrFIFF+3B0TkjLmOF0= - + v1.0.0-rc3 h1:tGkPg19g46ZCB9eiKd4Jd0uJ0K17lpsA3ya26UiQFLE= - + v1.0.0-rc4 h1:kLjrToDU56drfmwQvCTfSafs5zCgUetJEond5bQ0zc8= - + v1.0.0-rc5 h1:rYjdzMDXVly2Av0RLs3nf/iVkaWh2UrDhuTdTT2KggQ= - + v1.0.0-rc6 h1:7AoN22rYxxkmsJS48wFaziH/n0OvrZVqL/TglgHKbKQ= - +github.com/opencontainers/runtime-spec + v0.4.0 h1:Z1hvldJAMZ+FKLtLBn6y52P/lZ6v+XKll5poyC53KQA= h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= + v0.5.0 h1:uu1JuCsXy0gP4iEZ+QpNhBFEfagkcX/TH2QgHdI6lpE= - + v1.0.0-rc1 h1:C6il5v2hYYjGoItb3OUGHu7Xkmm/1s4VDjobMDLPvvk= - + v1.0.0-rc2 h1:YVNPxQJsF1eEGlXJC9zaej2RjClDs3xOJsApZR4NheQ= - + v1.0.0-rc3 h1:sNAphflMIFtEYwISVM+lBUB/a7yaHTFpIh3/SfNWXIY= - + v1.0.0-rc4 h1:bEUYhLQnVORR+WFacuOZIcjfHCDTpNwve8E6pOLIKGA= - + v1.0.0-rc5 h1:gUJ82jaA7l+A8tWYQL9Pzr5kh4IbzOP6Qe50sKUzgP0= - + v1.0.0-rc6 h1:ykBFWOhOawNNCcEes+pUD+QHlU60GTaNgytlxS+OYxo= - + v1.0.0 h1:O6L965K88AilqnxeYPks/75HLpp4IG+FjeSCI3cVdRg= - + v1.0.1 h1:wY4pOY8fBdSIvs9+IDHC55thBuEulhzfSgKeC1yFvzQ= - +github.com/opencontainers/selinux + v1.0.0-rc1 h1:Q70KvmpJSrYzryl/d0tC3vWUiTn23cSdStKodlokEPs= h1:+BLncwf63G4dgOzykXAxcmnFlUaOlkDdmw/CqsW6pjs= + v1.0.0 h1:AYFJmdZd1xjz5UIb8YpDHthdwAzlM5FVY6PzoNMgAMk= - +github.com/opencontainers/specs + v0.4.0 h1:xGjEWSfREvjPuK70uK3trtpvB8PsLKaAGbFx1hG3UHA= h1:bfATBL+Vm2NxrM/Y/nmJaR+k3fR3SRg9kgbrzBbCYpI= + v0.5.0 h1:itG9vYtqBf/NxQi/44EGw7w6FQ+bQZkcKxQ0GaH7Cdo= - + v1.0.0-rc1 h1:IcoiDMqzj0vxNWZTVYasrBTtaMh879zK8Smx4xRXsXU= - + v1.0.0-rc2 h1:QKN/tIiRRpth8dZuhnvc+0BaoiPU1goxgZq1n2izr94= - + v1.0.0-rc3 h1:EuulC3OCfNPMFIwHKrUuV0rTlIFwhOPNkGWVlkj4aS0= - + v1.0.0-rc4 h1:sw+dZp4BwFXGwwvZiFfFG7eWTM504SMdoh6BxCmFe9I= - + v1.0.0-rc5 h1:ppqkki/5lcjrcosFMyV7MhHZoR/YqEJTzxrdaM9dCkU= - + v1.0.0-rc6 h1:lQ5g1z6HbuzP1M/Be3JkPl9qEC0q8+QEahpDHi3d19I= - + v1.0.0 h1:Bo78vwItQ4jOgGYAzUqjS9Jiwvbc9OVyntawqvc9KDc= - + v1.0.1 h1:1KLfitICRlMQJ/mT0k5E/gHLvo5yBZd6nS2yLsWHzDI= - +github.com/openshift/origin + v3.9.0-alpha.2+incompatible h1:RevTsWonVYTP3ITkJo7rDnwiqdc/Z/VJYo9DhFLxzR0= h1:0Rox5r9C8aQn6j1oAOQ0c1uC86mYbUFObzjBRvUKHII= + v3.9.0-alpha.3+incompatible h1:se/67e+1pLPWTcZvePR7QHdIrZe3w9p8HxIy4NJzwdU= - + v3.9.0-alpha.4+incompatible h1:J12bNwtGINYEt5aO96k3h2K/ECCCyFhZITMZYAaS0fg= - + v3.9.0+incompatible h1:vHw2kUaRmyDBU7eglWwnR3dEaWUpthak8ZoaER+BTkg= - + v3.10.0-alpha.0+incompatible h1:j/cz3HW9LwSH4QTD8wLKOkkrDCqEc3ZhVxA7QCmYMlI= - + v3.10.0-rc.0+incompatible h1:LhQ3GY32QhsMbGn0VYatZHOrv99zRKsTJCIVl8UrWbg= - + v3.10.0+incompatible h1:eYdMR5UVG1pMxqrgBdRQcTgDWokb2NVSgroJZWsRsPA= - + v3.11.0-alpha.0+incompatible h1:8RqgnP1x7+1Ar3NJHNJWX3W6tDsb7V1kt2OYss9qheI= - + v3.11.0+incompatible h1:DsJmCxDgQzGkW+r+h7rzXSx2HI7HHiIMuYKSOjxVleg= - + v4.0.0-alpha.0+incompatible h1:MhrqdCD3DadgEz7LGviuIgjWJZ66ggqQJK7dQgYsVq8= - +github.com/openshift/source-to-image + v1.1.4 h1:AsHVXoUK89of3QO0BdWhP9YGRrPupJmIJymZeKhFuTQ= h1:LR3Zbcy5zfRjqLEftlfYqxirrDYkhrR9VLo+hs76/PI= + v1.1.5 h1:qiWRlq5Py1MNOe35VwMOECN0xBBfMYCbzKWalGnSH9E= - + v1.1.6 h1:4+AitFB6lrNP1V9mqoaEGGVsRJXIdmAm8hbeg2BiGJY= - + v1.1.7 h1:nuCsYqvdKyBVogA21JgWk3NifZ7iTggLeay0RPW6ybI= - + v1.1.8 h1:R5CkG6b8IOAFM4Ut5kJ/U/VxzV34BfJE9v3aDMBoiUY= - + v1.1.9 h1:GLHlBULW3SWuEbtLn0jwFAt3iei0i7Re2pMrW3WksTs= - + v1.1.10 h1:UvEkO45l2JOxQdygB4Jl+hHeLtgjUl6Yry0ogTT63uI= - + v1.1.11 h1:XrMg3CGmVFwzjUmMTJMTkqZziRKcXCbaL4S6KR9amhk= - + v1.1.12 h1:mLxuVx5oN4agwNNgYVmw9e9roq4DeIY0oCtMrFibMgc= - + v1.1.13 h1:kKf1wzAaDrI4Ch2UhBGO0aW8dtDMPIDCZ3ZaTnerxR4= - +github.com/opentracing/basictracer-go + v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go + v0.9.0 h1:4DQ5HRAp5evcmDqWInLpZeANKBXIKQxHTXxclfMwFek= h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= + v0.10.0 h1:XN6nZRjbLE+GkEuO3rti6ZcnDqpaIF0yKJ1z6rLA63k= - + v1.0.0 h1:fDGaqxLymyQ1cyyVYBrR6p4MPwKZA7clqxUleobb2VA= - + v1.0.1 h1:IYN/cK5AaULfeMAlgFZSIBLSpsZ5MRHDy1fKBEqqJfQ= - + v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= - +github.com/openzipkin/zipkin-go-opentracing + v0.2.1 h1:pAArtgscP0jFG9lf4gv0JBqGqOSCXmGJCyxQGBkgnhI= h1:js2AbwmHW0YD9DwIw2JhQWmbfFi/UnWyYwdVhqbCDOE= + v0.2.2 h1:2PLiliCVlagg3bi13LIEfABAoNCJ9vrXxY2HLbPKztk= - + v0.2.3 h1:6hxV9HayqBXV6FXYqPDdZQsJFA376pNuZfsOfEX7c0s= - + v0.2.4 h1:yqgP6E5SqRqfpTikIQ48T1qOptmrp6f9HydXRbwjdwE= - + v0.3.0 h1:Y0pgC50ZAww7r/q1PSnlXrT68DR4hjsign+4Ixz+Tbg= - + v0.3.1 h1:QjUuBG9au4XDpsf4BFhWJJoPEARHLl0/cLpqktWhAHE= - + v0.3.2 h1:29bHr4whILL23QNcqpW5AvhI42bXDGy5a2tPDOa7QqM= - + v0.3.3 h1:EbvYHyxNeJCm2LonvlIKb9Pg3LxsVAbpZI3iEFTr078= - + v0.3.4 h1:x/pBv/5VJNWkcHF1G9xqhug8Iw7X1y1zOMzDmyuvP2g= - + v0.3.5 h1:nZPvd2EmRKP+NzFdSuxZF/FG4Y4W2gn6ugXliTAu9o0= - +github.com/ory-am/common + v0.0.1 h1:GwAs3QSTunR9c9nQ5s4i6LhrV9SoUDULmnRxnTDm+48= h1:oCYGuwwM8FyYMKqh9vrhBaeUoyz/edx0bgJN6uS6/+k= + v0.1.0 h1:A9oPp2PRPRpWRVCmqUPaPYMXb24U/nX9plxpLoiz+0E= - + v0.2.0 h1:Wzb6AXy+RFk5w2pv0mFrXVVETLRI71QgKD2YVEpk7uI= - + v0.2.1 h1:MAffe/ebupYZ1MswaqdGuZqWTXYjwm8ioS3XzkLHsVU= - + v0.2.2 h1:qynTwak3lattD3RI89uPqdrzCs1hJInaqiMrqDj/VBg= - + v0.3.0 h1:CiAAZJ2oCa0Sp1D+TOAO7xw++GhOAt8hpoLMKDBE7lg= - + v0.4.0 h1:edGPoxYX4hno0IJHXh9TCMUPR6ZcJp+y6aClFYxeuUE= - +github.com/oschwald/geoip2-golang + v0.1.0 h1:KD3+PHmbJn5yoK5IK9U1o0a9BMeRezQLUKXlGIYUuzs= h1:0LTTzix/Ao1uMvOhAV4iLU0Lz7eCrP94qZWBTDKf0iE= + v1.0.0 h1:zCPPwfexroPmnABwxzJfHBkdl8bF08Cym4GO90hJpCw= - + v1.1.0 h1:ACVPz5YqH4/jZkQdsp/PZc9shQVZmreCzAVNss5y3bo= - + v1.2.0 h1:uPmjb3XMGAHZu7oEX44sf9foBGvmLy4R99OQUjXzStE= - + v1.2.1 h1:3iz+jmeJc6fuCyWeKgtXSXu7+zvkxJbHFXkMT5FVebU= - +github.com/oschwald/maxminddb-golang + v0.1.0 h1:NcvxeapDUYTtHv1zehpp+9G3YDYuWMX4Q4Dns8Qbwpg= h1:3jhIUymTJ5VREKyIhWm66LJiQt04F0UCDdodShpjWsY= + v0.2.0 h1:cdvE3VUWCRdu+tYIBtwbcPWj1A83jZc5CSdGSuhnqO8= - + v1.0.0 h1:J2B9uC7QU/ySxtQi8UkPyry1JzNGfPyY6YjIHmgTLno= - + v1.1.0 h1:WoRFEb51Ahbd6PfUNtIjIokFoYqKQJYdWLHRTSiw2D8= - + v1.2.0 h1:GMRJq8+Qmb4fuybkd3aMJhBx07Bqu0fE3y3pcKcItKw= - + v1.2.1 h1:1wUyw1BYyCY7E0bbG8lD7P5aPDFIsRr611otw6LOJtM= - + v1.3.0 h1:oTh8IBSj10S5JNlUDg5WjJ1QdBMdeaZIkPEVfESSWgE= - +github.com/packethost/packngo + v0.1.0 h1:G/5zumXb2fbPm5MAM3y8MmugE66Ehpio5qx0IhdhTPc= h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= +github.com/parnurzeal/gorequest + v0.2.6 h1:6O0X3Tis+5b6XSYHB3shqD2+MEvzPIrjtQQ5xagww5g= h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= + v0.2.7 h1:GUjRVflL738No32Qu+OvRNdKyxGhpe2ExRb5DvSxJY8= - + v0.2.8 h1:5tqfNpdewuJroyhasrtBu11Y86fiu4HmDTII4Ecllz8= - + v0.2.9 h1:abFRy8OmE8Rs9MOZEgx0MWV4rQkyszgFSF+/vNGo4no= - + v0.2.10 h1:OOT1XNRaJ/DfE0zqwvMIhBxCAx/QyHBk+8956yKtD7c= - + v0.2.11 h1:7weAk3u0O/4VdIyVyOVjXQxYyr4M7XhDqIjMTQrcQrk= - + v0.2.12 h1:ub6AicO4LWdlKjoJG45NmX0W/5wSfj+cXlBobrXE/Sw= - + v0.2.13 h1:p5XL6G+4eOh5ifLB1SBPTqFyTiqHmDpq3gDquVULa2k= - + v0.2.14 h1:9VG0N3uWBo1xxs4Fk/EHzGhrRp4UFnksDcX/DYpyZs8= - + v0.2.15 h1:oPjDCsF5IkD4gUk6vIgsxYNaSgvAnIh1EJeROn3HdJU= - +github.com/patrickmn/go-cache + v1.0.0 h1:3gD5McaYs9CxjyK5AXGcq8gdeCARtd/9gJDUvVeaZ0Y= h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= + v2.0.0+incompatible h1:1G02Ver4lZNbrWBHtot9O0Z2Piky5+/ilrJaTIwL/w0= - + v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= - +github.com/paulbellamy/ratecounter + v0.1.0 h1:FLljiU2IX0ugjoNr1V85RkPMH/od1Rnj/9vnzmTZTfs= h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= + v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= - +github.com/pborman/uuid + v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pebbe/zmq4 + v1.0.0 h1:D+MSmPpqkL5PSSmnh8g51ogirUCyemThuZzLW7Nrt78= h1:7N4y5R18zBiu3l0vajMUWQgZyjv464prE8RCyBcmnZM= +github.com/pelletier/go-toml + v0.3.2 h1:cVBP3JbBPviw5hB/hOXp7YqtoOndpAEOb7CiCVof/NY= h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= + v0.3.3 h1:H3CcHWqJhLImSTzDMfBfNyEV4MNxd4lVkeHX2I9iXIA= - + v0.3.4 h1:odJeysv0AIeTOBFqnN3Ad+ahpfT/Sj557a4E9jLPG7g= - + v0.3.5 h1:vtEp5CVqyTzO3Qvi3fU5uv+rm9pdq+2YpdWAPrGL26A= - + v0.4.0 h1:vQTrQ6pGYOySEPMpdOyUcWbmZfqDuoyYzVjy1zNthPg= - + v0.5.0 h1:4JciwWR3v6XGcQibYe+58htiJN9TzM6P18uLetto3gw= - + v1.0.0 h1:QFDlmAXZrfPXEF6c9+15fMqhQIS3O0pxszhnk936vg4= - + v1.0.1 h1:0nx4vKBl23+hEaCOV1mFhKS9vhhBtFYWC7rQY0vJAyE= - + v1.1.0 h1:cmiOvKzEunMsAxyhXSzpL5Q1CRKpVv0KQsnAIcSEVYM= - + v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= - +github.com/peterbourgon/diskv + v1.0.0 h1:bRU92KzrX3TQ6IYobfie/PnZkFC+1opBfHpf/PHPDoo= h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= + v2.0.0+incompatible h1:WM3au3ZA2yuY/ByeDAbOPEsl0HTVfB3v5oBUOyKWnlk= - + v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= - +github.com/peterh/liner + v1.0.0 h1:HmYbuOWNntSzDEbCLX29yAdt/jAaG2V6lTeDXbniOEs= h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= + v1.1.0 h1:f+aAedNJA6uk7+6rXsYBnhdo4Xux7ESLe+kcuVUF5os= h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pierrec/lz4 + v1.0.1 h1:w6GMGWSsCI04fTM8wQRdnW74MuJISakuUU0onU0TYB4= h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= + v2.0.1+incompatible h1:goKmVq5xV/0uAnq7ldSRSHSkc3yIZaSNQry66C/sE/4= - + v2.0.2+incompatible h1:6spEXYEkGG74KeVRPzvSU0Fa3xO9DGO0bJcA6uIfwo8= - + v2.0.3+incompatible h1:h0ipQUMRrnr+/HHhxhceftyXk4QcZsmxSNliSG75Bi0= - + v2.0.4+incompatible h1:ugy0aRlLvrxupbCD6xnVilNrEOM89+ftxz+4FsUX0BU= - + v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= - +github.com/pilu/traffic + v0.2.0 h1:guerUOB3OtcJb0pEJ/RK2BCrdduWUtpV362rdjyfBDA= h1:pPbakW2fofyQaXrh319Xb9TJpM8gjs/vp+71CztjeK0= + v0.3.0 h1:e57u2e42EqcmXqoDtBZNgS3VY4qVdcWgA4c5qg/dHmI= - + v0.4.0 h1:OAyV2JDz0k99twFfjlmLuFlPiwk394BCx0hMc8j8Wm0= - + v0.5.0 h1:hm7c02s5gzbHdmZirbDCSJPeZYsm9DMejdyaztJfxLs= - + v0.5.1 h1:aKL6eyVR+fI7ERMgMcujX2DeUYgXPKjNVk7HO8/8xAk= - + v0.5.2 h1:T5szRLz2IeBgTa94TJnYzIPpzeja0O/wOEbeG/m9ODE= - + v0.5.3 h1:gzDC+/uF1JQNnpcjUhVnw3z9xTBKx9y9FLtdLkHrIbQ= - +github.com/pkg/errors + v0.2.0 h1:eqJNyK4um6+PDsjJ/fQtIa5T6A2TPq4g2rV/YfKxiNQ= h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= + v0.3.0 h1:vGTT2whb6g8by61YzK2lWzUOI5Ii8A/J6BpAF8EL35g= - + v0.4.0 h1:WGkfvLuWDIBfhb2zl49//ybqmEN9P3OcOrPYUGJrPIo= - + v0.5.0 h1:kOgBq3ZvaGheGMUHLjQpZwRq5jNrauDRNA735/cpzo8= - + v0.5.1 h1:IHiy+E7QjmNYS4wzsr+PbDPot3/5g3LddPReiKtiOKM= - + v0.6.0 h1:O89Tl73EiJ8Lvu4nVRs7uW10mpZnajMT+y5a0NIjLgA= - + v0.7.0 h1:WLW8U1O88/efNaH7+8C+KBNkZRGD+WCmNlC0b06x/Ig= - + v0.7.1 h1:0XSZhzhcAUrs2vsv1y5jaxWejlCCgvxI/kBpbRFMZ+o= - + v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= - + v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= - +github.com/pkg/profile + v1.0.0 h1:o++U+8vy+VZt0fK9G2vjGmvh+Zknftwbl/TyP787onA= h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= + v1.1.0 h1:TbomchXmJaOHG1UPkn11R6MStSYlI0AH/HRoRS0Wmpw= - + v1.2.0 h1:rtDCCNu0JSILFwbaxmdUzkrwUNetI++CY5pEIhv6WB4= - + v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= - +github.com/pkg/sftp + v1.8.0 h1:SJ2EX5aeifvl4zzbci3urQbr5p7Xc/A7/Ia9T8ahhNM= h1:NxmoDg/QLVWluQDUYG7XBZTLUpKeFa8e3aMf1BfjyHk= + v1.8.1 h1:lBNmfMtetdLwsQv4Bh+DAWADK2yYljdc0qmjMQUb4qc= - + v1.8.2 h1:3upwlsK5/USEeM5gzIe9eWdzU4sV+kG3gKKg3RLBuWE= - + v1.8.3 h1:9jSe2SxTM8/3bXZjtqnkgTBW+lA8db0knZJyns7gpBA= - + v1.9.0 h1:ljQo4ePyIKAOXeUeoFXiZQV81QsI+dqErOJ7369VC4w= - + v1.9.1 h1:dfh6lpPQzEP8ZRaRZww2DL074+Ov+DwaFy7bdncZpiM= - + v1.10.0 h1:DGA1KlA9esU6WcicH+P8PxFZOl15O6GYtab1cIJdOlE= - +github.com/pmezard/go-difflib + v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmylund/go-cache + v1.0.0 h1:jbJMNhn4LhBfb3dRejPlnjxSiokDt4qO5NWt8mMi+UE= h1:hmz95dGvINpbRZGsqPcd7B5xXY5+EKb5PpGhQY3NTHk= + v2.0.0+incompatible h1:5ZNJ3XnuQrCjvRXItcjhbD27dVFEk7lVqJHbuI696qc= - + v2.1.0+incompatible h1:n+7K51jLz6a3sCvff3BppuCAkixuDHuJ/C57Vw/XjTE= - +github.com/pquerna/otp + v1.0.0 h1:TBZrpfnzVbgmpYhiYBK+bJ4Ig0+ye+GGNMe2pTrvxCo= h1:Zad1CMQfSQZI5KLpahDiSUX4tMMREnXw98IvL1nhgMk= + v1.1.0 h1:q2gMsMuMl3JzneUaAX1MRGxLvOG6bzXV51hivBaStf0= - +github.com/pressly/chi + v3.2.0+incompatible h1:XbMUwNtES9qOkJtA5ynrxmOjAAFEEvxrZCTnEojlxiw= h1:s/kslmeFE633XtTPvfX2olbs4ymzIHxGGXmEJ/AvPT8= + v3.2.1+incompatible h1:SZM6/GYakwRbHrP9dnvKNOlxQ9vRA63ARZcP0FNgbek= - + v3.3.0+incompatible h1:9ptvP/vLACB8IJkNfwzwQwyK38MONUVoK9Bzy6YtxQ8= - + v3.3.1+incompatible h1:0flC4nrZV9ojesPGYq31Sg5dZSDBp/P7PfcpfnBy3KA= - + v3.3.2+incompatible h1:OR1IvWoy2hmGsEw7OFB9nt0f4eet9vimbWIp0qL1dSA= - + v3.3.3+incompatible h1:fc66b0mPg4Dx5Pr86WSsXv0x37dSX6pH0p38GZsvCtU= - + v3.3.4+incompatible h1:l6iaLk5QzcVz0kwZM9Fvg9W+sJdIvjukKPZQOmn/ywI= - + v4.0.0-rc2+incompatible h1:VlXJulAN3RV329W+zhMJ1ydUeaSrpjeUYa2Mg4GOSEY= - + v4.0.0+incompatible h1:yoa5lMe/USUYUY+EW0YNyQwEB/SKm8FRSLBsMJ4DKJA= - + v4.0.1+incompatible h1:goCMOEqf5UxDSWHd2iZ/R4PvYixQ+S+LXT4yz6ZKi/s= - +github.com/prometheus/client_golang + v0.8.0 h1:1921Yw9Gc3iSc4VQh3PIoOqgPCZS7G/4xQNVUp8Mda8= h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= + v0.9.0-pre1 h1:AWTOhsOI9qxeirTuA0A4By/1Es1+y9EcCGY6bBZ2fhM= - + v0.9.0 h1:tXuTFVHC03mW0D+Ua1Q2d1EAVqLTuggX50V0VLICCzY= - + v0.9.1 h1:K47Rk0v/fkEfwfQet2KWhscE0cJzjgCCDBG2KHZoVno= - + v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/common + v0.1.0 h1:IxU7wGikQPAcoOd3/f4Ol7+vIKS1Sgu08tzjktR4nJE= h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= + v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU= - +github.com/prometheus/prometheus + v2.3.2+incompatible h1:EekL1S9WPoPtJL2NZvL+xo38iMpraOnyEHOiyZygMDY= h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= + v2.4.0-rc.0+incompatible h1:y2TC7cQXVpmBhDAsux3vaIQeEHQyojzxkOiPeyEPPs8= - + v2.4.0+incompatible h1:GFdMJQKpo7lM4pvnzJAeXZeGdwTlh4PNO6VYFd+XKHY= - + v2.4.1+incompatible h1:d/sYPIIWAzSzPfIQk/lrQKNFGrO4dGUO1iO3rCqUWU8= - + v2.4.2+incompatible h1:IpbpeZAXsg39pqRThfPHoNRYjIyInnUFS26rPVkUXYk= - + v2.4.3+incompatible h1:hQEvPnUF8oiGkiQMllJiOkzSyoQev1v2nQZaf6/z/4g= - + v2.5.0-rc.0+incompatible h1:c2H9Meo2yAv+u13Vbin+qjnBX5Bd1F+tQ4eqDS71GUk= - + v2.5.0-rc.1+incompatible h1:z3LQlpePfz4R3obamJZpK0EBDHj69kx69W5fS+PIScM= - + v2.5.0-rc.2+incompatible h1:5VQ4aEgo94P1NYFgcSGBLYJp55weNrkWukrP22Xne/U= - + v2.5.0+incompatible h1:7QPitgO2kOFG8ecuRn9O/4L9+10He72rVRJvMXrE9Hg= - +github.com/rackspace/gophercloud + v0.0.0 h1:9gsnUzbPadIuEDlHeD+0bPceCUeef4CgD2uOJIDYqoU= h1:4bJ1FwuaBZ6dt1VcDX5/O662mwR8GWqS4l68H6hkoYQ= + v0.1.0 h1:kNU6XTEI+99Qt8LEgcn1LQqw6SVK2dy0rQ8LuXagD2Y= - + v1.0.0 h1:dI8jqEOOanEOgOSYcfvBRnETdeScNtlWg3KlJ4guUVQ= - +github.com/rakyll/statik + v0.1.0 h1:KpbIQtEGvwoA9scoyXPXa3ywkGd8XdpA3OuUcgMVVRk= h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= + v0.1.1 h1:fCLHsIMajHqD5RKigbFXpvX3dN7c80Pm12+NCrI3kvg= - + v0.1.2 h1:ckeqyWXP9hT/2u8Xfi4L02B2RFlqr6fdedIPgohOAHM= - + v0.1.3 h1:H/5HK3yNM7sDzOiMQtC2Q1N69hl+KxzomBBWus662LU= - + v0.1.4 h1:zCS/YQCxfo/fQjCtGVGIyWGFnRbQ18Y55mhS3XPE+Oo= - + v0.1.5 h1:Ly2UjURzxnsSYS0zI50fZ+srA+Fu7EbpV5hglvJvJG0= - +github.com/rancher/go-rancher + v0.1.0 h1:YIKWwe5giu2WICfyCcGqX+m4XTRbMpA8vzLxl1Kwb7w= h1:7oQvGNiJsGvrUgB+7AH8bmdzuR0uhULfwKb43Ht0hUk= +github.com/revel/revel + v0.13.1 h1:kZ3SI4QSR02D4WPQ1NhiIY12L7ltmjcpNj1q+u4SGvM= h1:VZWJnHjpDEtuGUuZJ2NO42XryitrtwsdVaJxfDeo5yc= + v0.14.0 h1:uLTHZ9pnJ7Xc0eR7BsG7LojTei2HYUPn4fEkX2PDiXk= - + v0.15.0 h1:ajBOsYPmfgcNYwbYAw8J/AlqZ4TxMxjOh7aMiPM7eq4= - + v0.16.0 h1:8+VeZkYB5VU04yZHh0QR3gByFv5Qy1ro3zuUPmvhlDc= - + v0.17.1 h1:4SMsZvP71mw/7XiDzMxPnTCodXPBtS+BZe+9j1VpKZw= - + v0.18.0 h1:KplMZj+V5ENVbXMkR3dSEuv4KSuyWx6DcJHgWX9C7lE= - + v0.19.0 h1:lnmpTIHvMudr+d4wPpT2pM6Pryicloh7fzPZl2hB5Tc= - + v0.19.1 h1:q9AaxiuiCA87fjFSlb0UGYqRaIOdasn0EyCXvbQw+F0= - + v0.20.0 h1:P6t74V9Mar6k9C4lW1M280hZBW4sLCNs9r/taKZD4wc= - + v0.21.0 h1:E6kDJmpJSDb0F8XwbyG5h4ayzpZ+8Wcw2IiPZW/2qSc= - +github.com/rjeczalik/notify + v0.9.0 h1:xJX3IQ09+O0qLAv4YdYe03EwYRyM7NPuC5O7Mc6/Jv4= h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= + v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= - + v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rlmcpherson/s3gof3r + v0.4.0 h1:uJxvaFN1H3MAVH1EAPR9xG4lik4JqczJO+KLEd87YCw= h1:s7vv7SMDPInkitQMuZzH615G7yWHdrU2r/Go7Bo71Rs= + v0.4.1 h1:qK/Lu3Jc+0EqDCDZjMV3PW480LbKBYlbW1xV1cnLPws= - + v0.4.2 h1:XqZhnGh6yE1ejCfildCo7LlmmxYYHuhI4RA+ib52AII= - + v0.4.3 h1:DiT5JvRyTijNCoRQ+SwHSz5xQ/ROUEsGg7cHL/Ch4/I= - + v0.4.6 h1:KajchGdkn6HkJ9Ju+yWxFobnxHAGXZ5CWj9liBqs4CI= - + v0.4.7 h1:UVFyVf9Is6a07FN4O4OCj4M1w0QKynVAo0YkSmWlqiQ= - + v0.4.8 h1:3OWuvS9ZNS90ZVk1QhLXqR5M9eGwh7R4llpUiMFvZQM= - + v0.4.9 h1:WXDLlYDUjZih/f5EyVfjSK5vousoE/a/b0d/hjNkqPU= - + v0.4.10 h1:yISvRaERms9AbHNh7p7TIRv3UcsURoNANiuGAdj1kQo= - + v0.5.0 h1:1izOJpTiohSibfOHuNyEA/yQnAirh05enzEdmhez43k= - +github.com/rogpeppe/fastuuid + v1.0.0 h1:f5eq2L8Y87sP63CaPojeD05ON4/AEe/wejW/jp8N6QQ= h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rs/cors + v1.3.0 h1:R0sy4XekGcOFoby9D76NXXg2birJ3WFkzGvXF9Kn3xE= h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= + v1.4.0 h1:98SZukVonBOdXatRLa6GSAtp+IeOjY+nmdEZAxImXXc= - + v1.5.0 h1:dgSHE6+ia18arGOTIYQKKGWLvEbGvmbNE6NfxhoNHUY= - + v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= - +github.com/rs/xid + v1.1.0 h1:9Z322kTPrDR5GpxTH+1yl7As6tEHIH9aGsRccl20ELk= h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= + v1.2.0 h1:qRPemPiF/Pl06j+Pp5kjRpgRmUJCsfdPcFo/LZlsobA= - + v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= - +github.com/rs/zerolog + v1.7.0 h1:mVEg9/3WVlGTfXcwDp7iuspAsvVzq5k15RiGAZbBgwQ= h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= + v1.7.1 h1:zWBba9nquCvfHc7shNsnucF/E5ZzDnK5h5PPiuh9Waw= - + v1.8.0 h1:Oglcb4i6h42uWacEjomB2MI8gfkwCwTMFaDY3+Vgj5k= - + v1.9.0 h1:h+fPIJoX2FeL8y0m9EZdm5UN/Zn9uxl/gaNKBlco9qg= - + v1.9.1 h1:AjV/SFRF0+gEa6rSjkh0Eji/DnkrJKVpPho6SW5g4mU= - + v1.10.0 h1:roFDW4AgYGbHnTOAMZ2K8mHJZ/7bSj7txPfvbABIj88= - + v1.10.1 h1:/oNUEYN/Fmd9vIlqptUkYgz2yB1oL8x4AExTjN6/wj8= - + v1.10.2 h1:t4oASYf49zTOqUIx+nfDaC0pRnLeupbWTYfGy0CCPpg= - + v1.10.3 h1:Gbm4pmo3YF7QxRwoNAKvf33oB/bGMIVunAVNJRxQvdg= - + v1.11.0 h1:DRuq/S+4k52uJzBQciUcofXx45GrMC6yrEbb/CoK6+M= - +github.com/russross/blackfriday + v1.5.1 h1:B8ZN6pD4PVofmlDCDUdELeYrbsVIDM/bpjW3v3zgcRc= h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= + v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= - + v2.0.0+incompatible h1:cBXrhZNUf9C+La9/YpS+UHpUT8YD6Td9ZMSU9APFcsk= - +github.com/ryanuber/columnize + v0.1.0 h1:AhdWuWqFv/eKkWx5Z9c34o52PhVO2OmzsGdA64GCDQY= h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= + v1.1.0 h1:9t+qOsBdd6Vx3XbIXrusfA/k0cp2yDw5kJ/PGJOmAJY= - + v1.1.1 h1:kaLR0w/IEQSUuivlqIGTq3RXnF7Xi5PfA2ekiHVsvQc= - + v2.0.0+incompatible h1:2FyQ5ZqsIAhAkEzkLk1ucHyBHuIfquuJMX3XHviwtv0= - + v2.0.1+incompatible h1:sbS5KRxW9y3/yehqmCOkFyrtZi3Aa3CMLPHvv1RJUso= - + v2.1.0+incompatible h1:j1Wcmh8OrK4Q7GXY+V7SVSY8nUWQxHW5TkBe7YUl+2s= - +github.com/ryanuber/go-glob + v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/satori/go.uuid + v1.0.0 h1:6QDKTa2a+CpXmqIFypEOKZUreVG3iCcrb8vbCkHTDsY= h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= + v1.1.0 h1:B9KXyj+GzIpJbV7gmr873NsY6zpbxNy24CBtGrk7jHo= - + v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= - +github.com/sendgrid/sendgrid-go + v3.0.6+incompatible h1:UPOeYa3p9xTiRf1DL5Xwxdxh/VAbD2SP9VdXiiAsTpo= h1:QRQt+LX/NmgVEvmdRw0VT/QgUn499+iza2FnDca9fg8= + v3.1.0+incompatible h1:VDsGe6hquojHW/R/xMaaBvuoVkeLBm3yfQtt1yAruHA= - + v3.2.0+incompatible h1:sRV2pLy3ylKn7EwwhwWubgvsGBJN1wxJmRJpGjtLXJE= - + v3.2.1+incompatible h1:QM6Bh7E6CFJ+lSEHrq15zOyLiHgc3l8Mx8viTWus/v8= - + v3.2.2+incompatible h1:nzw0p6dRxw0Xt2GGLKhnyIVFjkGlo0pqB9wFmeQnDTo= - + v3.2.3+incompatible h1:TtqqdzcZfIWOXaXjEZLvz7Gui+4dASQkDcRG1lHf4tA= - + v3.3.0+incompatible h1:vOAGOjJlc3w+PK6BNJyovQ1QxotdHwqlKg7OHWUmqx4= - + v3.3.1+incompatible h1:LlSVhn3AwBL2SPmQ861Aw5clO9hfxkUMUCO28FN5PPU= - + v3.4.0+incompatible h1:rPF2cldF1XQ9ubiSBWhxSuoyBPNlPOUMafzv73QzBEE= - + v3.4.1+incompatible h1:jkXet0CDmdaMZctaF5qELIAFM7eeUx1nh3kMvLejAXk= - +github.com/sergi/go-diff + v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sevlyar/go-daemon + v0.1.0 h1:doVC2jeM2huo2NWnnBOu1W/JYTEvAI/T+6QkkizDjHQ= h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE= + v0.1.1 h1:2/2BKMKPWOdNxTId0dGweFB22w4I38HV1s4AQZTzJE0= - + v0.1.2 h1:y0/6ymtNDw2yFHz9071ScpoEp6lRb3nF6FDwd6lMd2Q= - + v0.1.3 h1:4yJ+cJwCwzoXwdhX1tJQ07ojr6Rdi8T2W4Rwel/85OI= - + v0.1.4 h1:Ayxp/9SNHwPBjV+kKbnHl2ch6rhxTu08jfkGkoxgULQ= - +github.com/shirou/gopsutil + v2.0.0+incompatible h1:dzbyDFOvUY4Mj7CyAz78DfKYUIL2KKHsm8BNs0koeqU= h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= + v2.16.10+incompatible h1:mgdmRYXgaBhMkqUwB8qbNw43NFuG6TvKLeNTqUUXB3M= - + v2.16.11+incompatible h1:HGn85JG7+nt9NuQwbxd2zk1MVMJL+AFn2OhDpBhcTng= - + v2.16.12+incompatible h1:9UOkm3qI9KvgTCLcays9oYepttUvJytUwSJIN2hkFkg= - + v2.17.10+incompatible h1:kxelzrE1tvEmUMqHp2uP7LFmkDoViSwFEK2ebrO/SS0= - + v2.17.11+incompatible h1:4L8jVLIf9tewjdy906qwjwUr3M9/ErnFv2qnznuH1E0= - + v2.17.12+incompatible h1:FNbznluSK3DQggqiVw3wK/tFKJrKlLPBuQ+V8XkkCOc= - + v2.18.10+incompatible h1:cy84jW6EVRPa5g9HAHrlbxMSIjBhDSX0OFYyMYminYs= - + v2.18.11+incompatible h1:PMFTKnFTr/YTRW5rbLK4vWALV3a+IGXse5nvhSjztmg= - + v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= - +github.com/sirupsen/logrus + v1.0.0 h1:XM8X4m/9ACaclZMs946FQNEZBZafvToJLTR4007drwo= h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= + v1.0.1 h1:k86xHae/+DCqiP5ac5Gf0AQtH+4mg0m6vE1os/WzmJ4= - + v1.0.3 h1:B5C/igNWoiULof20pKfY4VntcIPqKuwEmoLZrabbUrc= - + v1.0.4 h1:gzbtLsZC3Ic5PptoRG+kQj4L60qjK7H7XszrU163JNQ= - + v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= - + v1.0.6 h1:hcP1GmhGigz/O7h1WVUM5KklBp1JoNS9FggWKdj/j3s= - + v1.1.0 h1:65VZabgUiV9ktjGM5nTq0+YurgTyX+YI2lSSfDjI+qU= h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= + v1.1.1 h1:VzGj7lhU7KEB9e9gMpAV/v5XT2NVSvLJhJLCWbnkgXg= - + v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= + v1.3.0 h1:hI/7Q+DtNZ2kINb6qt/lS+IyXnHQe9e90POfeewL/ME= - +github.com/sorcix/irc + v1.0.0 h1:0uuxV8z/P6un0I0B0qr93zTjPhbeQcmfRRV4hUAjXNw= h1:MhzbySH63tDknqfvAAFK3ps/942g4z9EeJ/4lGgHyZc= + v1.1.0 h1:YgP/7XL6gjGPxSScSjW5lv6/aYOA6HqlKlU57PFjwI4= - + v1.1.1 h1:5JPmJFC/SxZl4OKFA9tnRRONCLI23vUYH9jsoYowK/Y= - + v1.1.2 h1:aqNJ+9KmdjYarJHct96cLjSpFQovV/FQ8IfCVMNo2YY= - + v1.1.3 h1:+ejCOdjCkSrRrekt+Ap28pa3XH1MwzmNluDu8UylWjY= - + v1.1.4 h1:KDmVMPPzK4kbf3TQw1RsZAqTsh2JL9Zw69hYduX9Ykw= - +github.com/spf13/afero + v1.0.0 h1:Z005C09nPzwTTsDRJCQBVnpTU0bjTr/NhyWLj1nSPP4= h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= + v1.0.1 h1:iJfkwkEeXGckEoQWD8dLaygZWLXMolnndesiNuXfmKI= - + v1.0.2 h1:5bRmqmInNmNFkI9NG9O0Xc/Lgl9wOWWUUA/O8XZqTCo= - + v1.1.0 h1:bopulORc2JeYaxfHLvJa5NzxviA9PoWhpiiJkru7Ji4= - + v1.1.1 h1:Lt3ihYMlE+lreX1GS4Qw4ZsNpYQLxIXKBTEOXm3nt6I= - + v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= - + v1.2.0 h1:O9FblXGxoTc51M+cqr74Bm2Tmt4PvkA5iu/j8HrkNuY= h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= + v1.2.1 h1:qgMbHoJbPbw579P+1zVY+6n4nIFuIchaIjzZ/I/Yq8M= - +github.com/spf13/cast + v1.0.0 h1:GNbxZJxRIvehsqPCmvpb/fnBMMyMoF7lojcquQccV4k= h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= + v1.1.0 h1:0Rhw4d6C8J9VPu6cjZLIhZ8+aAOHcDvGeKn+cq5Aq3k= - + v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= - + v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra + v0.0.1 h1:zZh3X5aZbdnoj+4XkaBxKfhO4ot82icYdhhREIAXIj8= h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= + v0.0.2 h1:NfkwRbgViGoyjBKsLI0QMDcuMnhM+SBg3T0cGfpvKDE= - + v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= - +github.com/spf13/jWalterWeatherman + v1.0.0 h1:rJjb5zrWwg5oWAneAydR1Gb11NYrTejW67H8K/Hkes4= h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag + v1.0.0 h1:oaPbdDe/x0UncahuwiPxW1GYJyilRAdsPnq3e1yaPcI= h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= + v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= - + v1.0.2 h1:Fy0orTDgHdbnzHcsOgfCN4LtHf0ec3wwtiwJqwvf3Gc= - + v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= - +github.com/spf13/viper + v1.0.0 h1:RUA/ghS2i64rlnn4ydTfblY8Og8QzcPtCcHvgMn+w/I= h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= + v1.0.1 h1:PkHLMQpuZ5I2RwtH1PhsAYIsP/oHy/8DXVSXKL2dLs4= - + v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso= - + v1.0.3 h1:z5LPUc2iz8VLT5Cw1UyrESG6FUUnOGecYGY08BLKSuc= - + v1.1.0 h1:V7OZpY8i3C1x/pDmU0zNNlfVoDz112fSYvtWMjjS3f4= - + v1.1.1 h1:/8JBRFO4eoHu1TmpsLgNBq1CQgRUg4GolYlEFieqJgo= - + v1.2.0 h1:M4Rzxlu+RgU4pyBRKhKaVN1VeYOm8h2jgyXnAseDgCc= h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= + v1.2.1 h1:bIcUwXqLseLF3BDAZduuNfekWG87ibtFxi59Bq+oI9M= - + v1.3.0 h1:cO6QlTTeK9RQDhFAbGLV5e3fHXbRpin/Gi8qfL4rdLk= h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= + v1.3.1 h1:5+8j8FTpnFV4nEImW/ofkzEt8VoOiLXxdYIDsB73T38= - +github.com/square/go-jose + v2.1.3+incompatible h1:54TSMwbLPKeEqy9wyz7sc1kOQNysg4RYZtXS4ZTh2Fc= h1:7MxpAF/1WTVUu8Am+T5kNy+t0902CaLWM4Z745MkOa8= + v2.1.4+incompatible h1:ZMsS/lf1Yn7rwimhyaOTRYxLSZ8gqpMSZSNcstWyitw= - + v2.1.5+incompatible h1:GR1DwlwenN17GOUzNJweLrufd32vF8h0+TALg//Sfjk= - + v2.1.6+incompatible h1:vlXeaqoFPTA+Q4bWegkZ8PhPq6Ke9np2Bkyi09tMdQc= - + v2.1.7+incompatible h1:4aqiRzL9x3yAPDY1mlY41VU+doHAKo2rAZ/rYNNmIN0= - + v2.1.8+incompatible h1:Hbk1mGTCxbgWzS+/OT1NHGClCniCOA+enqqU81T9VOY= - + v2.1.9+incompatible h1:Tbc5JPjizorD+Jd9tLz8PSUJHPAbmwn6qpmDQa9/eFs= - + v2.2.0+incompatible h1:lzRTcrPIXvZGaBDawhPNSJx/ornyZDLgIzVii63HY6Y= - + v2.2.1+incompatible h1:waq0gPzpxNDCKOAsTHDbCaCk3cqAlsZG6q6F2Gr6ri8= - + v2.2.2+incompatible h1:HbXcU3MDamCIs1i4/HHqgf7v94SlKqRtZBD7CZ2xkbA= - +github.com/stathat/go + v1.0.0 h1:HFIS5YkyaI6tXu7JXIRRZBLRvYstdNZm034zcCeaybI= h1:+9Eg2szqkcOGWv6gfheJmBBsmq9Qf5KDbzy8/aYYR0c= +github.com/stianeikeland/go-rpio + v1.0.0 h1:9a5DDConuUBSBR4mYsr9dV0uAxGypybCumg0KR2o3fc= h1:Sh81rdJwD96E2wja2Gd7rrKM+XZ9LrwvN2w4IXrqLR8= + v2.0.0+incompatible h1:8uxUOyN1L8TSNowMYnn42xbF8xdPtYZ5DgCyJNuuLzc= - + v3.0.0+incompatible h1:AWDcfdnPPZ7Jikis6HNj0EgujMfB4t7oi4nZd5cIqko= - + v4.2.0+incompatible h1:CUOlIxdJdT+H1obJPsmg8byu7jMSECLfAN9zynm5QGo= - +github.com/stretchr/graceful + v1.2.6 h1:3LHHE/B32UcsQeVFe/8wd/21Id7EbgkhrPsGJyAHhXs= h1:IxdGAOTZueMKoBr3oJIzdeg5CCCXbHXfV44sLhfAXXI= + v1.2.7 h1:MAu7w+pY1dovqNWPW7KlqnewhIJeF40dkf+J9VjBuQs= - + v1.2.8 h1:q50eQeVoROi4Wnwd58DCESHM/LLdcz47wRpdfQ7NEQg= - + v1.2.9 h1:phSl/mM1Zln2lPIgZrDT4df9YcfjFh3X5wJeTNmpDF0= - + v1.2.10 h1:ZJbjeY1xHrdEDTzblLI0+2a5whh4lnnDwNEt2sinWmU= - + v1.2.11 h1:UteEM/teV7C1EzabEs8oQwIfOemeC3wHawSKCT8YfIU= - + v1.2.12 h1:HAPBO/FgGnDwcwBYzSGZtsWbkAmB3wTSpMm2VbmX9yc= - + v1.2.13 h1:E60ISijhFt1izPcDoG0TZ7VljR2JM/pTBdqJYhzu+us= - + v1.2.14 h1:x7EoVKCkYLJKjZqsi1uhi60rBz29xeEDbENV3pV/h2U= - + v1.2.15 h1:vmXbwPGfe8bI6KkgmHry/P1Pk63bM3TDcfi+5mh+VHg= - +github.com/stretchr/objx + v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= + v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= - +github.com/stretchr/testify + v1.1.1 h1:/Box+ZZJaXnWRh0iQMXTpvCvCp4jJBdkbAUOqWmg/qI= h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= + v1.1.2 h1:QFDOepAvHBWiCBkOcExyHwJmxDzp/jJvBL3X9KaAdRI= - + v1.1.3 h1:76sIvNG1I8oBerx/MvuVHh5HBWBW7oxfsi3snKIsz5w= - + v1.1.4 h1:ToftOQTytwshuOSj6bDSolVUa3GINfJP/fg3OkkOzQQ= - + v1.2.0 h1:LThGCOvhuJic9Gyd1VBCkhyUXmO8vKaBFvBsJ2k03rg= - + v1.2.1 h1:52QO5WkIUcHGIR7EnGagH88x1bUzqGXTC5/1bDTUQ7U= - + v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= - + v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stripe/stripe-go + v46.0.0+incompatible h1:FeS6R4IM5UKP8AinLCsw4on0PDlIKekx3/0vNjskiII= h1:A1dQZmO/QypXmsL0T8axYZkSN/uA/T/A64pfKdBAMiY= + v55.10.0+incompatible h1:trgrjJsFbzXlFXteZSHa5hKXCeWCbqQhaBPubhTVhCM= - + v55.11.0+incompatible h1:1IB40Daw/FDlWJHW/TSbyWcWlqR06UOmK580dfatqAU= - + v55.12.0+incompatible h1:L+dbKPjwkg0oIa06wWWL4jAM7BRIMsV7JEBGktyfVVo= - + v55.13.0+incompatible h1:s0FoTKpEPN1WtDYytmoeaJhQ5m9V2WPdhk2o8S7r9+0= - + v55.14.0+incompatible h1:5+JWn2dKhB6Ee7V3AKZgB7kR48Lb9hbfkFIlzCLbYIo= - + v55.15.0+incompatible h1:b2B5jgYWngtN5itn97gOV0oMR2zv6+uHmo0dqXbjC7g= - + v56.0.0+incompatible h1:Z4pwj/CTNBbcuOvCmMxPV6iuQmFjqlfpFfnG/Lo0oCw= - + v56.1.0+incompatible h1:UnP4XYnamOiBxSEk2jozw/zshI1OiOeHV4cOPYBR8O0= - + v57.0.1+incompatible h1:vi1rMn1PoX2I1A6LClIUP7yuqgXnLt7lCnLalS/XFrs= - +github.com/tchap/go-patricia + v2.0.0+incompatible h1:s7Y2vY0mGk1u/IErHsUivFRhkb1jSWP09JyaSbnb92o= h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= + v2.1.0+incompatible h1:QYlSsoKB8eZ/WNANRnx6b+F13HMTCpPw3WMym3LZ4WM= - + v2.2.0+incompatible h1:ak63y+w/aM8O4hlbxFx5PgHvyNn0YwMupPzZ21RPdfI= - + v2.2.1+incompatible h1:8cGLPH4wLZBD60bSEeviBryfbiOjVWZZWWAkPuM3RKg= - + v2.2.2+incompatible h1:4RD9WWPHfkjwFbXOa+XMIdY2KewZgsKOOwHBxfB3+uA= - + v2.2.3+incompatible h1:MitC8FhU/PCgkw5ZWu/LgLYS/waSdOt3xF86soUwXJ0= - + v2.2.4+incompatible h1:z74O1VZTf7PHImUDArMqC2IiZlsGRZnkUjLwzucXZo4= - + v2.2.5+incompatible h1:3N7XRawYGEWcnymqXHvED3gn+/G46E+djx5co1/XZ/Y= - + v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= - + v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs= - +github.com/tcnksm/go-gitconfig + v0.1.1 h1:VC+UGqwt8FUGsp3Gz/Z7mgY4gbNVAhNRdocj/ALgci0= h1:/8EhP4H7oJZdIPyT+/UIsG87kTzrzM4UsLGSItWYCpE= + v0.1.2 h1:iiDhRitByXAEyjgBqsKi9QU4o2TNtv9kPP3RgPgXBPw= - +github.com/tdewolff/minify + v2.0.0+incompatible h1:QkVWcRNKCZqBCyQmi2eJOQYZabRCot3TIsJCyWm9NEo= h1:9Ov578KJUmAWpS6NeZwRZyT56Uf6o3Mcz9CEsg8USYs= + v2.1.0+incompatible h1:NE/tjyBKNwfd3BzrkrFt2aRLTMjqcyT4ys6cJcZxU+g= - + v2.2.0+incompatible h1:13L/LpBCvmlmsfgrARlJUhLyJ/2LnHUPTfNqDq8do4Y= - + v2.3.0+incompatible h1:Tr6ipbiX6tZqFZDif2e/y3UGZqnGVxpflLeDKj+dAqw= - + v2.3.1+incompatible h1:HW0RtdgW4ZBtx4RIbJiFrsYt8sWAPksAMPJeMP+Ocac= - + v2.3.2+incompatible h1:fDO06OlGbj/J1xGMM4wqfkwmIt9RSunjda2Uyuw9RUg= - + v2.3.3+incompatible h1:PE7SIX0z/lKHnNxWBiWbtd4hnYE6Wxk14nXpCRhYGOo= - + v2.3.4+incompatible h1:kinygdLIU2uv48NlOtMTtlVOVgoPAt61MgPfxKHAK5s= - + v2.3.5+incompatible h1:oFxBKxTIY1F/1DEJhLeh/T507W56JqZtWVrawFcdadI= - + v2.3.6+incompatible h1:2hw5/9ZvxhWLvBUnHE06gElGYz+Jv9R4Eys0XUzItYo= - +github.com/tealeg/xlsx + v1.0.0 h1:h90Zg7jJK4UcmuvrHBPe0Gsc+kKPc6qvKf0bdktVRbk= h1:uxu5UY2ovkuRPWKQ8Q7JG0JbSivrISjdPzZQKeo74mA= + v1.0.1 h1:pwK27zRp12IRTFGGz/Vng4lyeEltxf1wVe33dR4bwFg= - + v1.0.2 h1:BhIi9z8dVAhNbFb+4CNKZLQNoq8JLTxtwoicSAwqbTo= - + v1.0.3 h1:BXsDIQYBPq2HgbwUxrsVXIrnO0BDxmsdUfHSfvwfBuQ= - +github.com/tedsuo/rata + v1.0.0 h1:Sf9aZrYy6ElSTncjnGkyC2yuVvz5YJetBIUKJ4CmeKE= h1:X47ELzhOoLbfFIY0Cql9P6yo3Cdwf2CMX3FVZxRzJPc= +github.com/tidwall/gjson + v1.0.6 h1:HYH2srVkCC53232wJXWptchlbF1n2JxJBmM8i1/bLXU= h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= + v1.1.0 h1:/7OBSUzFP8NhuzLlHg0vETJrRL02C++0ql5uSY3DITs= - + v1.1.1 h1:XSn7wxSH2Us55nigCfI8WrNfe2gihrwOSJU39w7Ot2w= - + v1.1.2 h1:2cScOmQ0oRDK1idscWbg9Va8xvQ88Lqb73rkgg8scEo= - + v1.1.3 h1:u4mspaByxY+Qk4U1QYYVzGFI8qxN/3jtEV0ZDb2vRic= - + v1.1.4 h1:lonRDhK9sFzw7ogkERBgx5wF6lRP2bpjr6jiwVzYjYc= - + v1.1.5 h1:QysILxBeUEY3GTLA0fQVgkQG1zme8NxGvhh2SSqWNwI= - + v1.1.6 h1:2USkZlXVqQJQpbUVkozothVPA9M/U7X7j42u9V8o6kA= - + v1.2.0 h1:pSOXpbajgrqYACThJdSVg1XwMv/xUV8CfQHd3Ti6gQw= - + v1.2.1 h1:j0efZLrZUvNerEf6xqoi0NjWMK5YlLrR7Guo/dxY174= - +github.com/tinylib/msgp + v1.0.1 h1:iF+TMfZ81pSM9FEl47U+sg1cE6x7TZC+mPwqkXrIMSE= h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= + v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= - + v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU= - +github.com/toqueteos/webbrowser + v1.0.0 h1:RuypZ2eTUNrYG5WKWj4eU1ZEbxDPOuImkSADGfdsdNE= h1:Hqqqmzj8AHn+VlZyVjaRWY20i25hoOZGAABCcg2el4A= + v1.1.0 h1:Prj1okiysRgHPoe3B1bOIVxcv+UuSt525BDQmR5W0x0= - +github.com/twinj/uuid + v0.1.0 h1:m4NyLH5MReF8zWQegEXvSTpnV6A7svVLG5FbZql6OAA= h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY= + v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk= - +github.com/tylerb/graceful + v1.2.6 h1:zAEMFDuukWHFPIa4EW2pcQfXfUhXC868lWH37njzYVk= h1:LPYTbOYmUTdabwRt0TGhLllQ0MUNbs0Y5q1WXJOI9II= + v1.2.7 h1:zEMOuHRwei9u0s8MoZoP9ghxsLS88bUnrI1KWZydKS0= - + v1.2.8 h1:grDNUs6WOQUa14aJT24nl3BZr1DQACw/9k/PDRTkjcE= - + v1.2.9 h1:DOgh8k6CAtzRgteq4mh4HUOLrBJBLRh8txtlJOmMccE= - + v1.2.10 h1:/7izbl8iDZiY8xt74IWoH9xBP6sb+3wG4z+QvPbbjCM= - + v1.2.11 h1:mLjyFVXDHsDZqOv6Y8+CtjHzGUcE7wNnYU6RwOS5HdY= - + v1.2.12 h1:NQ2YbMiJEFNuYoqiXr4VffRGjuKePwGQkgYA/rjXcZg= - + v1.2.13 h1:yKdTh6eHcWdD8Jm3wxgJ6pNf8Lb3wwbV4Ip8fHbeMLE= - + v1.2.14 h1:QRmtSwCR4sMTRSfXPx+P08QdrdED91nyJqOieBOuYuc= - + v1.2.15 h1:B0x01Y8fsJpogzZTkDg6BDi6eMf03s01lEKGdrv83oA= - +github.com/uber-go/zap + v1.3.0 h1:RRVQvokMHcJTzc6dkeCp5op1ciD8xPp/2C4QOJkOC6I= h1:GY+83l3yxBcBw2kmHu/sAWwItnTn+ynxHCRo+WiIQOY= + v1.4.0 h1:X8dxy6V7E4ET+6Wd+ZVfAAimB59jZDq9FBZhP+RsUjE= - + v1.4.1 h1:vhSW6UUNKbKI+nxkFOf56RzwpmIFpJryQDpKLeEN7jU= - + v1.5.0 h1:EmvaEjplILc2Vl1CuES8hUX3SHCtWhkbseSpLdDI8lE= - + v1.6.0 h1:eqi3eQ2sY6ysJMmF7pvs7iyq0Dp4yTSw+6Jj+5tSGOE= - + v1.7.0 h1:BYRQpyYN6nFkUkexxDiSViXs27cT+Uukqr18NY7aRxw= - + v1.7.1 h1:LvIn2hjGWsKJ4khx5Ornjo1pj5HDkAsAf17a+uIoD9g= - + v1.8.0 h1:XZzjHgXBPsLh1Ndfv0QZnPskh54Z8ZD641b+Ka0Ey9c= - + v1.9.0 h1:HSDaxzxZlbVzACpHSNfxOga0D/vTBAuE7vUarwRGeGg= - + v1.9.1 h1:CZN7Pmty0PLtqZEi3N8VSI0Us8b0RL5ah6l1jOH3ZJ0= - +github.com/uber/jaeger-client-go + v2.8.0+incompatible h1:7DGH8Hqk6PirD+GE+bvCf0cLnspLuae7N1NcwMeQcyg= h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= + v2.9.0+incompatible h1:40VHY+zJx7cq8hZNvlgfCkGaWO06oipmsZ4M1C0Qsfs= - + v2.10.0+incompatible h1:P5Svqhsg48/Hpa0syPMD8hy6QS8eRZfXEbJDqHw4b6U= - + v2.11.0+incompatible h1:NEBBje7vFQeIfc529syQaeYUrlNQ6EzoiZlbw2SDkEw= - + v2.11.1+incompatible h1:hDP5AohdNCS0V8Qt9UOHl1hRthg7wE4y4lpwXB2/DPc= - + v2.11.2+incompatible h1:D2idO5gYBl+40qnsowJaqtwCV6z1rxYy2yhYBh3mVvI= - + v2.12.0+incompatible h1:byY6dnhKNNpznX1J2JbAYIQpXJqhWM0pt2opp/7Ug1s= - + v2.13.0+incompatible h1:BQ7GxyS54wK+5kfRNoMVOhgQ7VAjhYlFq4rAhV7pnHc= - + v2.14.0+incompatible h1:1KGTNRby0tDiVDDhvzL0pz0N26M9DobVCfSqz4Z/UPc= - + v2.15.0+incompatible h1:NP3qsSqNxh8VYr956ur1N/1C1PjvOJnJykCzcD5QHbk= - +github.com/ugorji/go + v1.1.1 h1:gmervu+jDMvXTbcHQ0pd2wee85nEoE0BsVyEuzkfK8w= h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= + v1.1.2 h1:JON3E2/GPW2iDNGoSAusl1KDf5TRQ8k8q7Tp097pZGs= - +github.com/unrolled/render + v1.0.0 h1:XYtvhA3UkpB7PqkvhUFYmpKD55OudoIeygcfus4vcd4= h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/unrolled/secure + v1.0.0 h1:2p4MlT30bNNjaFxA+gtDuLT/73fnXblTC+W/lCzOaZc= h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= +github.com/urfave/cli + v1.15.0 h1:mPJ+IrlccdnKDrlo72DWcMcbjAHVt9bGwI8Cx8wsxO4= h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= + v1.16.0 h1:0MZKChuQWAfo0FuyKUMdR3kCdTrCANLMuo5SXd3xV2k= - + v1.16.1 h1:NP9yyLRSRvF1/+CeEs9A0U2vzJb4JvQ3GIid09BgdDk= - + v1.17.0 h1:pxxCYHgqkpprfAbC/5DlBd/n5TQkQpEY/qwERAr4vkE= - + v1.17.1 h1:QSJ6c7oou2nXchu1zV0ZSwC2YI0o3i20OvvQyl2yfwE= - + v1.18.0 h1:m9MfmZWX7bwr9kUcs/Asr95j0IVXzGNNc+/5ku2m26Q= - + v1.18.1 h1:IFc93MpteseEF1dvLEwx5Zn+K7xkbIcBGp36OwYlFx8= - + v1.19.0 h1:dBWCicHK8GorrWSPcMemx1MwzvW2m4rSVEAvUrCtKpw= - + v1.19.1 h1:0mKm4ZoB74PxYmZVua162y1dGt1qc10MyymYRBf3lb8= - + v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= - +github.com/urfave/negroni + v0.1.0 h1:I0ouxPWkMNjhNUCCxaS2xMCcM1sbwMcNmAkBjYBNRhk= h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= + v0.2.0 h1:cadBY8/+9L/dTagBqV7N0l/SJiB4Wg+os5QdmaFY5Wg= - + v0.3.0 h1:PaXOb61mWeZJxc1Ji2xJjpVg9QfPo0rrB+lHyBxGNSU= - + v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= - +github.com/valyala/bytebufferpool + v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp + v1.0.0 h1:BwIoZQbBsTo3v2F5lz5Oy3TlTq4wLKTLV260EVTEWco= h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= + v1.1.0 h1:3BohG7mqwj4lq7PTX//7gLbUlzNvZSPmuHFnloXT0lw= - + v1.2.0 h1:dzZJf2IuMiclVjdw0kkT+f9u4YdrapbNyGAN47E/qnk= - +github.com/vbatts/tar-split + v0.9.9 h1:Gudkuvaj/F5kpyLskuy6dFopZvPyLqAf/BG/3dznhGw= h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g= + v0.9.10 h1:ekzO3fGq/l9APJgmGtPHV9Kf8FJMASoupdFMCtEoxLs= - + v0.9.11 h1:zKLOYouE7iQtZjf96FTrxyw/F2+2UxautE3z7ylfs8E= - + v0.9.12 h1:1CsW7Z93nGZtrM0Jyi1nbrNMx6QizAXIhWqOfc/XlTo= - + v0.9.13 h1:g/A49fgfpiRpav/tNBaDFF2X1q2OLKUzxp+08eThd0w= - + v0.10.0 h1:YNiiibPBopDxqMmwpHl9MF+qHr79G+ktuHR769gCtcU= - + v0.10.1 h1:eSmfbYDBO+qCIvHPMNgmkIXbf5HUO2UYSd/+Z11zHs0= - + v0.10.2 h1:CXd7HEKGkTLjBMinpObcJZU5Hm8EKlor2a1JtX6msXQ= - + v0.11.0 h1:Vdj/+9462ZtnhhfQylOpk4xC4IqMui1JSgdIbucTOLw= - + v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE= - +github.com/vdemeester/shakers + v0.1.0 h1:K+n9sSyUCg2ywmZkv+3c7vsYZfivcfKhMh8kRxCrONM= h1:IZ1HHynUOQt32iQ3rvAeVddXLd19h/6LWiKsh9RZtAQ= +github.com/veandco/go-sdl2 + v0.1.0 h1:+mM3KPG4mVsogWe3JRVCFg2B4TemV24U4tAN0IwsGYs= h1:FB+kTpX9YTE+urhYiClnRzpOXbiWgaU3+5F2AB78DPg= + v0.2.0 h1:+T0uGDteCqkfSGMlvjKPW60vt1IOyFGX549WHK7HX9U= - + v0.3.0 h1:IWYkHMp8V3v37NsKjszln8FFnX2+ab0538J371t+rss= - +github.com/vishvananda/netlink + v1.0.0 h1:bqNY2lgheFIu1meHUFSH3d7vG93AFyqg3oGbJCOJgSM= h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vmihailenco/msgpack + v3.2.7+incompatible h1:XKm+r81VgMa2OFKG02gtj5fJQT8u8XV7GoITscnjXA0= h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= + v3.2.8+incompatible h1:RTze2mAXYgUzv/I3Aa4294R7Ou2sR2yv+V1rd0MzjSs= - + v3.2.9+incompatible h1:mRCad8j+rpoOgFYpWT2az2f9KOCohRwgc4qaLZKhIwo= - + v3.3.0+incompatible h1:VOLxk/ZoLVBhRSLNJLGyf+okTQNz/8D7G115oshWw4w= - + v3.3.1+incompatible h1:ibe+d1lqocBmxbJ+gwcDO8LpAHFr3PGDYovoURuTVGk= - + v3.3.2+incompatible h1:6Y7b3m/E53cNMOoEPeq5QeXdzc4IThHxPXt3jJM0EQk= - + v3.3.3+incompatible h1:wapg9xDUZDzGCNFlwc5SqI1rvcciqcxEHac4CYj89xI= - + v4.0.0+incompatible h1:R/ftCULcY/r0SLpalySUSd8QV4fVABi/h0D/IjlYJzg= - + v4.0.1+incompatible h1:RMF1enSPeKTlXrXdOcqjFUElywVZjjC6pqse21bKbEU= - + v4.0.2+incompatible h1:6ujmmycMfB62Mwv2N4atpnf8CKLSzhgodqMenpELKIQ= - +github.com/vmware/govcloudair + v0.0.1 h1:7Y+0Lhjokx2t4x44lm0mGZC7tR5NSOpi5nEB37Hf3qw= h1:Vxktpba+eP4dX5YzYP869DRPSm5ChQ2A/GUrmKSLvlo= + v0.0.2 h1:ki01OjlgpEWyEc7iZTTaWW9tISSWafiqj/PHLPB4Iwc= - +github.com/vmware/govmomi + v0.12.1 h1:AjQ70q+b3j8YVuxkaEWSHpoybZyFLN/Kmvs6wUJBzdU= h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= + v0.13.0 h1:1KhlQeH2rSlYcIQJKY2GGd7HW4np1N2HHHPuOsCBS6w= - + v0.14.0 h1:OzYabeN/Ex4PkqhQf+HXUnRoRsNBpjmSJO/cusWkeNw= - + v0.15.0 h1:fVMjwFASkUIGenwURwP0ruAzTjka0l2AV9wtARwkJLI= - + v0.16.0 h1:4tGQtzkzcA/4JIcZ0OpqBnz+q8TFA5FeYCzaJyZJH38= - + v0.17.0 h1:AxhHt5FCuWjaiBg+Yh77wN2DxcO7y09NbqZ8sACCS0o= - + v0.17.1 h1:ZaFC7mIp7W5VZaTQPklLn7cJVEP4EX3XUYP0ler5l80= - + v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo= - + v0.19.0 h1:CR6tEByWCPOnRoRyhLzuHaU+6o2ybF3qufNRWS/MGrY= - + v0.20.0 h1:+1IyhvoVb5JET2Wvgw9J3ZDv6CK4sxzUunpH8LhQqm4= - +github.com/vulcand/vulcand + v0.8.0-alpha h1:QpVjeMrMNPA8g+eB7sLXStZpKUNVhftEs+iY9Az/mJM= h1:VPQyjgDrzUJfiBz1sLRYBrlkXsGW8VxIDhGrMeGNUXE= + v0.8.0-alpha.1 h1:wlwF2NTTgZDlE0bmm+wZxCe07YPpg9h8FQWVzj3VM48= - + v0.8.0-alpha.2 h1:Zd4gRQcTFzwLyyuIYsTmCs/CRr6IwyOQcFj9ACFxD+k= - + v0.8.0-alpha.3 h1:c5Oxy7OM/KDzqB7UJaCUHIe/Y5DT4gjg3KfyZqArEoU= - + v0.8.0-alpha.4 h1:/ukypwpt4vPs7qsucUQ0xLCFQtQgIIZOR/pOuD7o4jM= - + v0.8.0-beta.1 h1:82W1bUtCYQweZncsCfnvdYEZLNI4u1/K8Tcpk+nzz74= - + v0.8.0-beta.2 h1:8EVUgb3ITiCySftJGt2CAnCl3OepBiobdEGmzvk4dm4= - + v0.8.0-beta.3 h1:PSWnGcpVCmNKy02GQDTdJUxJlE2AmxJ+ndKogSQrpAY= - +github.com/willf/bitset + v1.0.0 h1:sahTKpJ5zuV/IIwoWOTMyXru5uMFdujTzqURICXBI+g= h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= + v1.1.2 h1:qRQzojujJ9p4JrdmSxeu3hn348shKWovBYAQth9NoTg= - + v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= - + v1.1.4 h1:G66e8XEJ38EupTBD2OJy1/0YJnM5txRThGM6BERYgpw= - + v1.1.5 h1:YacgXd1Q7p+U4L65olNx/aHZvDH/LENZdxJFlTXZHX4= - + v1.1.6 h1:z+P76zpmyqQwYPRnR4Cpmd0EHNlZjpbFMg4CyvS5WOs= - + v1.1.7 h1:Ox3YCFMSJlmHyn6nTVi5Xo6u4ayVEGKq1UyHnBEeFFs= - + v1.1.8 h1:dkYSYYvk7YN94DtrGQEp8CZOb/jNlMnH9+FkgFRSDek= - + v1.1.9 h1:GBtFynGY9ZWZmEC9sWuu41/7VBXPFCOAbCbqTflOg9c= - + v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc= - +github.com/willf/bloom + v1.0.0 h1:D857mzMaGe1NU89jxegrN7Feh44FOQqbwzkMbMBdNz0= h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= + v2.0.0+incompatible h1:MfZ2AYvCUeCeJI1/UZ32xGxB/WHEvIZXZVwtki+J618= - + v2.0.1+incompatible h1:Px+FzUVwNJIDZZuL6qhTqsEtRCbLvSN7+ePQIrhr0EI= - + v2.0.2+incompatible h1:bbvr/JeHpMxAFKmODoHMayEx6hBjNwO5nu12oWiiJOI= - + v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX8Wdm2/JPA= - +github.com/x-cray/logrus-prefixed-formatter + v0.1.0 h1:vO0zTDdZpdndAWlW827FTo5Wj/Ve+oksPzVBujy9gZw= h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= + v0.2.0 h1:fKTfWYeL7NYB25WG5gLylnow2oFJFTd+hagnLTcG8dI= - + v0.3.0 h1:kVa69uBpEeq88pPVvbVmXn5ryPTHnWICNigQBfn2ax4= - + v0.3.1 h1:jZQgJCBN4Yigi9Q649z5rjZmmG/UMjuCK2gYLMR9IX8= - + v0.3.2 h1:kgW77M6M5sKr3Ux8ypddC11Rpwzr28nfR2GPZq+6EZU= - + v0.4.0 h1:c13Xj1qeaujIEJdini0xFd6fepU8xsAnY3346+/5CMQ= - + v0.5.0 h1:WLnhI5ksPAxJmGY/KmlymY3MmRY9xVJ6JLQU2PzitYg= - + v0.5.1 h1:eG49gUCQh30PLZrITtyuetb6PJK49Fr3kIT2wvmYWIw= - + v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= - +github.com/xanzy/go-cloudstack + v2.1.7+incompatible h1:PHybkWJkFodL0bCEl3Jq7cj5jROGPgza7HYoVbGWPe4= h1:s3eL3z5pNXF5FVybcT+LIVdId8pYn709yv6v5mrkrQE= + v2.2.0+incompatible h1:aVsJ0WcCW3kAPpSTuXUZI3Ka918G2FIr0VzxyrCykRc= - + v2.2.1+incompatible h1:pyYD8gqHH5z+xf7/Qrw33DQPbuQ6P9g0KTetc9+4OV4= - + v2.3.0+incompatible h1:n6LDLHAWaYlGb+cxgOtmFSDi9Df5iQ6nNE2s9u8KKnQ= - + v2.3.1+incompatible h1:7pHGnNozkulIsB1D8oQ/4Hqb3NVO/3iCIixBt3YJW94= - + v2.3.2+incompatible h1:Al0eyKWmKzPCIiXbnE7lj18RN1HQTyhoLU8MId/UJh4= - + v2.3.3+incompatible h1:bvQueLtgVICiSHLJyGbqYTcH5vdFgsZoItxgd+tAyK8= - + v2.3.4+incompatible h1:37K+uzJT6GshLkBhgbDEfMnn/0ww+Fy+kIOBn0zN9ZI= - + v2.4.0+incompatible h1:unsedy0PbzPl3k1F7ZEV2fONdtpAdDxyIjJhSbhzUmM= - + v2.4.1+incompatible h1:Oc4xa2+I94h1g/QJ+nHoq597nJz2KXzxuQx/weOx0AU= - +github.com/xanzy/ssh-agent + v0.1.0 h1:lOhdXLxtmYjaHc76ZtNmJWPg948y/RnT+3N3cvKWFzY= h1:0NyE30eGUDliuLEHJgYte/zncp2zdTStcOnWhgSqHD8= + v0.2.0 h1:Adglfbi5p9Z0BmK2oKU9nTG+zKfniSfnaMYB+ULd+Ro= - +github.com/xeipuuv/gojsonschema + v1.1.0 h1:ngVtJC9TY/lg0AA/1k48FYhBrhRoFlEmWzsehpNAaZg= h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xenolf/lego + v0.5.0 h1:TmqIS0KL2EM61cH1oJkHy2WOA966yBCpMlAoGfGZx6A= h1:fwiGnfsIjG7OHPfOvgK7Y/Qo6+2Ox0iozjNTkZICKbY= + v1.0.0 h1:NGBQjovPXKQKlVIvBkHSZ8CWryqokHohSpeaU0U89ss= - + v1.0.1 h1:Rr9iqO8MoNxY6OvqdIZTnNZ8bwt0RNz00nGXfoTq4Bc= - + v1.1.0 h1:Ias1pE9hO98/fI23RLza0T3461YiM720d96oxTRPyuM= - + v1.2.0 h1:oeYRLMzAESnUzbQQFx+ma17Cnd3Vv05s+jAwFhmm6lo= - + v1.2.1 h1:wAsBCIaTDlgYbR/yVuP0gzcnZrA94NVc84K6vfOIyyA= - + v2.0.0+incompatible h1:zAuEuejarWN0l2DJUqQj5qtuhwdvw3a5gH9g0nmOaIY= - + v2.0.1+incompatible h1:5x9Zy8MXq0zVvssH5Jk4b3kbDUe5voX1qGTfKA72HAk= - + v2.1.0+incompatible h1:zZErna+4KHeBsUC3mw6gthaXncPDoBuFJOHKCRl64Wg= - + v2.2.0+incompatible h1:r4UAcpgPmX3j0aThoVrRM1FFLcvyy08UyGbIwFU4zoQ= - +github.com/xordataexchange/crypt + v0.0.1 h1:x1PDSf0nqx2pbejrf5Iy6Dli1MVt++YbvScg0tCtPq4= h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= + v0.0.2 h1:VBfFXTpEwLq2hzs42qCHOyKw5AqEm9DYGqBuINmzUZY= - +github.com/yosssi/ace + v0.0.1 h1:yYB7ieTnrxWWtwXC/MyHMd9HbpWptXYEYzek8nnrvEQ= h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= + v0.0.2 h1:IL7wOYswDn5VvzrBemHhn8AyQXzkuSMX4XR0vO503c4= - + v0.0.3 h1:HTUFLROktpQdsdvjw4brIkQoBN115DA7aF2qRt8b0e4= - + v0.0.4 h1:7Mp+sPgLVDHF3w7lDPpfj4ZCTeij6XKFGwGjUwW4mAs= - + v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= - +github.com/youtube/vitess + v2.0.0+incompatible h1:uYXSuBGF6jKqICshaTvE8qLKYK6HUjRLlWF1ofa2Ttw= h1:hpMim5/30F1r+0P8GGtB29d0gWHr0IZ5unS+CG0zMx8= + v2.1.0-alpha.1+incompatible h1:A1S51tG+yZ4etVTr/Jm6E79iVuIMxhSV5Vs108dHDXE= - + v2.1.0-alpha.2+incompatible h1:BoehBgBa/N8lJpNxEopdssbx44VERvbqfGw0CEJR8F8= - + v2.1.0-rc.1+incompatible h1:IOx7u+NfFJCX/eO9opZ0YnoM4q3EtRfM0NlTbiZ7JI8= - + v2.1.0+incompatible h1:yNlNxqFSbes4v+CVlFrW8PV/qt4LlMGR4IqWcNN6DMY= - + v2.1.1+incompatible h1:SE+P7DNX/jw5RHFs5CHRhZQjq402EJFCD33JhzQMdDw= - + v2.2.0-rc.1+incompatible h1:3v09CMupxKooCj60rwxVrSDYnWy+Vrm++Vr3AX4R/5M= - + v3.0.0-rc.1+incompatible h1:BXgQz4Q1DxL5t0V69nJyIf6lLstae0IDePOR9XdwKAM= - + v3.0.0-rc.2+incompatible h1:ni30FAc3SPToUdH6fPX6+bKLe6gZETioFtWvRIbVhQM= - + v3.0.0-rc.3+incompatible h1:+mxAImN50PmcSt39GwG08nmjVvFL+arNbv1pxUxaG0s= - +github.com/yvasiyarov/gorelic + v0.0.1 h1:tQfsTzdBJh7SACDKgBj2DomO0BsNGPu4bnSQayou5GU= h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= + v0.0.2 h1:vkBwl2sn50/KY9cgiJ0qiew4RTtlE4lQ1wtxY5aEKW0= - + v0.0.4 h1:WxTLIZSxJ4bin7nwHPDClEJODZjBnr7yKupw2Mi/9rE= - + v0.0.5 h1:Kx2Uz/YBHKb0HUxw4x1jGf+vdo2VOlRS+2v8N6zjVIw= - + v0.0.6 h1:qMJQYPNdtJ7UNYHjX38KXZtltKTqimMuoQjNnSVIuJg= - +github.com/zeebo/bencode + v1.0.0 h1:zgop0Wu1nu4IexAZeCZ5qbsjU4O1vMrfCrVgUjbHVuA= h1:Ct7CkrWIQuLWAy9M3atFHYq4kG9Ao/SsY5cdtCXmp9Y= +github.com/zenazn/goji + v0.8.1 h1:EeiWCsQlqFKM3hC3uL7Ioyq7x/vOLeICCN05fb/pH0k= h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= + v0.8.2 h1:V4HdnCeaGbFHQUPHJBclcjUtaQkCtXyA3dDNq9WlsLU= - + v0.8.3 h1:SuHHrKes0cOhSd5ZsPmqqQqCYUYEsMqzl+auGuv9C0Q= - + v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= - +github.com/ziutek/mymysql + v1.4.3 h1:aErmESH5tFoJlyNce76H+xzdKCz3rWTOR4PTGQIFcoE= h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= + v1.4.4 h1:aVSVBCAGPqR3gUckDZ1W/qK+1UtMkxhzyJPRBXonuuw= - + v1.4.5 h1:55GbxxhfFEq+HT7ZLsC624KrMdqHjdyFOCyH4hgI9pY= - + v1.4.6 h1:QLpBKr62dLaA+y5u3DsloyfokSMUdhBrcARwPOnYjaU= - + v1.4.7 h1:uydWD6PsRks2JqJsUgEv4utZX4YoWRkpls8YbOWglLw= - + v1.4.8 h1:a4yEDRBRmPyaJ7LbcQWzz+EbGjCTxFlGoEAaJ2DKrOM= - + v1.5.1 h1:BKYujXJ/dWauorDmll1Ef969gaItF+yt88KVsTeOG9k= - + v1.5.2 h1:VJ39XrU6PCCxSAzJjABMsCZ+xFNz6BbAmhgeiRwaeu0= - + v1.5.3 h1:CWmvOapD0QgYi7EQnJmZzdQkvwW4dmWtC0xB++zHqQ8= - + v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= - +github.com/zorkian/go-datadog-api + v2.10.0+incompatible h1:Hyuuz5M/9/H0bYMbhtAYgXPmkZBs7jWXE4h0wPiTAak= h1:PkXwHX9CUQa/FpB9ZwAD45N1uhCW4MT/Wj7m36PbKss= + v2.11.0+incompatible h1:vey15hqOtFsxHLJZ+pWlm7JcOB6I1eFztbdJ8JnkD04= - + v2.12.0+incompatible h1:WJpBRnfeRv7NXxOjoW+QzPTPOZFi0DF06drMNi4Uufw= - + v2.13.0+incompatible h1:+FaPrQvjLyVIxg79q+QmjKSTvJj7MOU1CGPTzG2GzPo= - + v2.14.0+incompatible h1:nbZXx4ZFpTZpz3JFA9davqIvHeF4HCkt+rYk6QPGh70= - + v2.15.0+incompatible h1:uesfvHD7kO5iWAb4AcHoRPlU8qIj+tqGZFfc+YNBQic= - + v2.16.0+incompatible h1:6ErDLNs84H0tfapGzxw5s4tTndaQWpezM8XGWaBD0Fs= - + v2.17.0+incompatible h1:saadvbg3EfLHIJWr6P+6cY3nv3a9xOp8/Py0bD8Dq/o= - + v2.18.0+incompatible h1:7JZOVDO8qDaXDKPAzTgiJahU3IoDyzxbLDwoT0U9n0w= - + v2.19.0+incompatible h1:G17NtfeHwrsQ2degevkwiVEirZENSOjbGOjLLT/kwa4= - +go.uber.org/zap + v1.3.0 h1:aS854BDNgXguGUPznjhF3oE3OEAFULOOjhsZdTnUNsk= h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= + v1.4.0 h1:1NCAUAdWsNejrjT3CHBdCbC20Ztt9AfByBV0NMX6Sao= - + v1.4.1 h1:SNpwY112Mv6x3CAt0P9fKKXYIec9Ocx34g5+iP/uzas= - + v1.5.0 h1:0cMK/D2qNl7WS9EJOjIlMhOqqQdp2ol6yZHqS5ny/vw= - + v1.6.0 h1:8sEbWqRDmX8SVFnlnV2itfOmd0Q6fUXlBcQNbss6RCE= - + v1.7.0 h1:a/j0E3H61zEkGCIRXd5Ympunuf8BoNDpro1w04oAT1w= - + v1.7.1 h1:wKPciimwkIgV4Aag/wpSDzvtO5JrfwdHKHO7blTHx7Q= - + v1.8.0 h1:r6Za1Rii8+EGOYRDLvpooNOF6kP3iyDnkpzbw67gCQ8= - + v1.9.0 h1:WciNIN5xKjsLnAkg/+UngCXim8pdyhP/4QwycrDzQlQ= - + v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= - +goji.io + v1.0.0 h1:0MrfABbPhQ6s+zi9Qq80zOw5gqJIIX1jrjGiop49erA= h1:sbqFwrtqZACxLBTQcdgVjFh54yGVCvwq8+w49MVMMIk= + v1.1.0 h1:7QNQWwPiGPyOlpH9UDNh+F9BdGMLXr60lfvPSnigA8o= - + v2.0.0+incompatible h1:QY6NuzeDeRk+8Iby4IfuN/k0d82K+fDFslQF2I2f6AM= - + v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= - +golang.org/x/text + v0.1.0 h1:LEnmSFmpuy9xPmlp2JeGQQOYbPv3TkQbuGJU3A0HegU= h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= + v0.2.0 h1:WtDSLEtcB5GqbjSlyn8XcYtxjw+SgFMc2RILOvq7CuE= - + v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= - +google.golang.org/api + v0.1.0 h1:K6z2u68e86TPdSdefXdzvXgR1zEMa+459vBSfWYAZkI= h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= +google.golang.org/appengine + v1.0.0 h1:dN4LljjBKVChsv0XCSI+zbyzdqrkEwX5LQFUMRSGqOc= h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= + v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= - + v1.2.0 h1:S0iUepdCWODXRvtE+gcRDd15L+k+k1AiHlMiMjefH24= h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= + v1.3.0 h1:FBSsiFRMz3LBeXIomRnVzrQwSDj4ibvcRexLG0LZGQk= - + v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= - +google.golang.org/cloud + v0.29.0 h1:rRGVXkmZfWZdNdpGVX1wLul3svXC6GJH9WEF1bxHbJo= h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= + v0.30.0 h1:ZsPgUufmWaDqeFDnVJex3CAukBTXBQzuju5JmGbr/Yg= - + v0.31.0 h1:DGMTB5kXUzCbsSIzpyWx+gBxkJjF948r0+8jjEyFAdY= - + v0.32.0 h1:emDKeqwANbquAQQ5ib/ZEyJOZG7ZVoGcM73blWc4o9I= - + v0.33.0 h1:TI5c/hhJxDVfa9SmQbJ5AaG3ZLaxyPt4ekeSrBxFtcY= - + v0.33.1 h1:oGKfwbLysKBV9P5j7vO87xLeQ5v8YZBKl3nTq7qgG4A= - + v0.34.0 h1:RcDvK+lZ4C9TgF3jLRYPbmr7wVf7h2+Eop65v38SWKQ= - + v0.35.0 h1:9fXA4nVWICgKfuf5xLPxv2HrqhZUADiPBeozpS6iECo= h1:UE4juzxiHpKLbqrOrwVrKuaZvUtLA9CSnaYO+y53jxA= + v0.35.1 h1:rOKGx+qJQGpyiSdmIDZ53PU+YS2Qo4BY1yTSCgAh1Lo= h1:wfjPZNvXCBYESy3fIynybskMP48KVPrjSPCnXiK7Prg= + v0.36.0 h1:+fAUIrmx61hOm16RB316xZrdCb+ibzAlQkaKhbgeB+E= h1:RUoy9p/M4ge0HzT8L+SDZ8jg+Q6fth0CiBuhFJpSV40= +google.golang.org/grpc + v1.11.3 h1:yy64MFk0j8qZbdXVA0MaSE+s/+6nCUdiyf1uNSjAz0c= h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= + v1.12.0 h1:Mm8atZtkT+P6R43n/dqNDWkPPu5BwRVu/1rJnJCeZH8= - + v1.12.1 h1:KwYoZQdVL6qeXTAa00oUFpVwXn54zQF6Bw5RGKdJZfs= - + v1.12.2 h1:FDcj+1t3wSAWho63301gD11L6ysvOl7XPJ0r/ClqNm0= - + v1.13.0 h1:bHIbVsCwmvbArgCJmLdgOdHFXlKqTOVjbibbS19cXHc= - + v1.14.0 h1:ArxJuB1NWfPY6r9Gp9gqwplT0Ge7nqv9msgu03lHLmo= - + v1.15.0 h1:Az/KuahOM4NAidTEuJCv/RonAA7rYsTPkqXVjr+8OOw= h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= + v1.16.0 h1:dz5IJGuC2BB7qXR5AyHNwAUBhZscK2xVez7mznh72sY= - + v1.17.0 h1:TRJYBgMclJvGYn2rIMjj+h9KtMt5r1Ij7ODVRIZkwhk= h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= + v1.18.0 h1:IZl7mfBGfbhYx2p2rKRtYgDFw6SBz+kclmxYrCksPPA= - +gopkg.in/alecthomas/kingpin.v1 + v1.2.5 h1:adWKhcoHnJMNx5JS81STHGL/PHN9OR0JF8dd5zxotD0= h1:vs0oy7ub8knYaut5kITUTmx/WeE4xRuEeOR34yEAWEA= + v1.2.6 h1:irP8y6OKhYcvY0fZNJW24FCyfGuy5PrqVuoSuktmtqY= - + v1.3.0 h1:dOcwoQwS3AJK0MGT2ztWl24OGzc0a/XRAjSMdSRhMO0= - + v1.3.1 h1:To7zDWiMUHcnjk//o4K8/wgKcDEvIU8MOh1Y6QTaER8= - + v1.3.2 h1:GvXF1sXhyYdWbouLRrQuMtJUnP8oXns4lLgXTdTZU2U= - + v1.3.3 h1:1RqPtOxG4sqUZfPoUoWruJOZdAw8DJ1wXRpz1ZMj7FU= - + v1.3.4 h1:80/ePhY+TzDoIGQOYu4ND2/YqVl3OiQFdpHx5+z2XIo= - + v1.3.5 h1:9FRYLl899BwNDjiQ/Dd7a0tQOE9qmObfrrdxAAwtgAA= - + v1.3.6 h1:KgvpV2bWEsmd9HgHaChiRGUMS6l44SEYt2MKQie22rM= - + v1.3.7 h1:Wu7NdOktFr6uMMaXIkZ1eDz7z6KMbpVoDCrTbYCUtiA= - +gopkg.in/alecthomas/kingpin.v2 + v2.1.9 h1:7+1JAx2MMOemIxjkXbbaFgZDT4qoLbryecW1rRlRFwA= h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= + v2.1.10 h1:ALcNBHARUALDg20tS9QjwLk1ePLpeRHA9iqAikXtp0k= - + v2.1.11 h1:XkypDUTQATD111Q6hJPVuyjVynaJV9DW27v01t91IbM= - + v2.2.0 h1:12WvoFfGYArkTPMkyiaqzPOZIXkE3Msmkm+waOiHE/c= - + v2.2.1 h1:CNrHXE2HWCsh6qo/qa4VlJc+xKLtEtPhYDdWNLWyKJI= - + v2.2.2 h1:VBV8OzdyP4EuRQy9lkr5gkIGaGt5FRC0JH/+TmQVfd8= - + v2.2.3 h1:/L3oK40poPRwke0Ipa6qqf8n+awu60Vl3DMe+3jLDt4= - + v2.2.4 h1:CC8tJ/xljioKrK6ii3IeWVXU4Tw7VB+LbjZBJaBxN50= - + v2.2.5 h1:qskSCq465uEvC3oGocwvZNsO3RF3SpLVLumOAhL0bXo= - + v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= - +gopkg.in/bluesuncorp/validator.v5 + v5.0.2 h1:WSpZKVkKjqEZVGvy3HyGIbtKNfDRCFGMZ9js7NTUhKk= h1:ScQmud/GM3iSR85jRE+8BI8E8oFv5oj4qyd5Xaw7hgE= + v5.5.1 h1:CQJGYfrkmhivpiAjjlRsd0d6d7S6uQu0wwrEaMGhpqU= - + v5.6.1 h1:jcgu6U1NgGpL3dtHypAtAeyeXuoYdL2u/8pNepFjc7A= - + v5.7.1 h1:uo+dcug2WYWrciowmsEpdLoDah/EyDlCA/+4Sdn6qJo= - + v5.8.1 h1:7zi68O6o6JHkGxcdWG5fHKvMAOT3VwNFoD9JbEoq9JA= - + v5.9.1 h1:XEU2HtMj0Rki3kmHh+uilvENyWgDEaR5LDLtYsjiumM= - + v5.9.2 h1:MUpsHxMu0up3jcb8nhJ8Ihag3p8I8M5S/fvMqLSm49c= - + v5.10.1 h1:Vhq9Q92k5VrG+5MFiB58q4MAywVvnPbyWnHK+HHnYrQ= - + v5.10.2 h1:JuA9iBB5gBt3QoTCE812ZDA1U0wZE/0EBfeqPnFUiMI= - + v5.10.3 h1:clgxLhQVQIE5krWHyYuqJralvQ9SkkTh3AdZGeQL2D4= - +gopkg.in/cheggaaa/pb.v1 + v1.0.17 h1:jUdPXsaaO29NA7hH5A6vKQbHsudTgI9yUDYY3TkwKHU= h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= + v1.0.18 h1:h5Qflf8N54NDtm3lWfBuCD4rslDjkXDoGkEMZCH4R80= - + v1.0.19 h1:FiMbj8xLGIsj8TLj3O+0GkiydM2OLJhyerwuyNozYug= - + v1.0.20 h1:kgQVoCjFPiI1fNjdWthabnG1rOAb+/7Z6KeGk2aeZ/w= - + v1.0.21 h1:vuB0AoAvfgI2z41QOfHeoANHRbfcs6T2l0jOLUnOYkI= - + v1.0.22 h1:c9uUtBcJbskglPcslP+bFq43Y9mR+Hja6qPRW0bsOJ0= - + v1.0.24 h1:+chXvORlyxoK9A04q/RTEMg+wxhyPbUW3Q17mDXthsU= - + v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= - + v1.0.26 h1:KbH37VyQGNNrLEz+fflXwuLLxnPNoWwUwBF783VJWUg= - + v1.0.27 h1:kJdccidYzt3CaHD1crCFTS1hxyhSi059NhOFUf03YFo= - +gopkg.in/dancannon/gorethink.v1 + v1.1.1 h1:Ugc3iyikMWkIHmyyPvvkIgBTj9T4Bs+13XO+rRkBkxQ= h1:iqcWmPUmevjldiIysDCQUzcdoDVi9heinXOgm1hkg8Q= + v1.1.2 h1:P5b5fvspQiQZwom/12kccUVqDji+glv0JsCMQ+547BQ= - + v1.1.3 h1:DDW/KU9buolgsQ5uNsuDXY0ypGMxtT0tJ5Nmu6Xwoj4= - + v1.1.4 h1:zH3I7kmh2jzOeNVHWOBUNFw8UHAFc05OgpHGg2O9SWc= - + v1.2.0 h1:39YMqRInTt1GyxfGsBqEl3YrKWAukRLeDLwOeW5VGkE= - + v1.3.0 h1:Yn2ERpLuOsP/N1bWd4UWH9T+oYf6HXxYBfNMkyPAo6M= - + v1.3.1 h1:Mb1tTMIjZMOnD5kawrcByDTiwI8mw6lu4aCHaXO0TQk= - + v1.3.2 h1:bniPMUXfzXpHxEDJhSPOnZiYHdk9Vi+sM7OnlztZt08= - + v1.4.0 h1:UV5U7W7wtdvCovPZUhXWCyy/rC9uoOTdYzV2A5x4W6A= - + v1.4.1 h1:6yZEtwHMaDOBcI2OBAQwpVZoHt9RYg5RcPFnNEHbS9I= - +gopkg.in/errgo.v1 + v1.0.0 h1:n+7XfCyygBFb8sEjg6692xjC6Us50TFRO54+xYUEwjE= h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/fatih/pool.v2 + v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg= h1:8xVGeu1/2jr2wm5V9SPuMht2H5AEmf5aFMGSQixtjTY= +gopkg.in/fatih/set.v0 + v0.1.0 h1:aaCY9PUgkH430Tl9sN6N5FqNeEfGgmPnGlY0r9WYZAE= h1:5eLWEndGL4zGGemXWrKuts+wTJR0y+w+auqUJZbmyBg= + v0.2.0 h1:xGc8mJVI7FVlSeDeURbfEHv/QLTsBYD+pbVE9KAwRmI= - + v0.2.1 h1:Xvyyp7LXu34P0ROhCyfXkmQCAoOUKb1E2JS9I7SE5CY= - +gopkg.in/fsnotify.v0 + v0.8.10 h1:Rap3u6YAElWRx0HGdGJPY9bSfkG+xgO0fch5elhrdsA= h1:ggSdmL/M3iqOa30tRdm4ctSkKd0e3Gsn8BE1lanSKk8= + v0.8.11 h1:x+65ylSNqSECOrTu0lo4GBgytbQp4QDEVoNS/ggd6r8= - + v0.8.12 h1:V5QBxu7lrI4mkdZbbF6cnJr7OyeZENzxWGAGMHt0t9Q= - + v0.8.13 h1:sGk4jA+Tyy95K5yPiEwvJAQfDHfygsPfxvf1TCQlNMA= - + v0.9.0 h1:TRsGdVL6CM/HXMefUTFQn9OsCJdEJ+w9reTUqEnTLK4= - + v0.9.1 h1:m9KEXc/B7HfQ8bprjSWJ323b8lnPW1lwlUxjvGWe7+o= - + v0.9.2 h1:2yd5kioi95SaVx+WbkTaFnfuYFcwOW+tXnjOBJPCSIY= - + v0.9.3 h1:EE38OZZkLmA44BsS+DCgO8BjptBMi3IbwTAUuKwU16k= - +gopkg.in/fsnotify.v1 + v1.2.8 h1:BHtBmcj32Obn0a1gQtl294WlsVxsJk8BaiACmPRxHIg= h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= + v1.2.9 h1:sQ4u2nqc93srqGq6uKE2mzSxC2XJF34qBut5caJJUQw= - + v1.2.10 h1:YUf875DvHA1ayPYGVkHsX7ImtrltD4OpV6C97Lxyk4g= - + v1.2.11 h1:56IABVxiq+71VfokWUEs8epu6/TyEVWEvzBTmY3B4EE= - + v1.3.0 h1:JOfhQrGyc8jb766XEc2vcjohQoQW9pGaFr8b1Kj2az0= - + v1.3.1 h1:MT8ythqog2cHQggwIrobAxM9m6sRB/uT37DrtskBpSg= - + v1.4.0 h1:Hf3cBkm0mI2PqJw9kjz/T5JF5MeHLfgWpPVTd4GPgP8= - + v1.4.1 h1:NKzHGradUToAhPGR9Ff1ODW7igWcNHUw/Jaf1aCwJco= - + v1.4.2 h1:AwZiD/bIUttYJ+n/k1UwlSUsM+VSE6id7UAnSKqQ+Tc= - + v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= - +gopkg.in/gcfg.v1 + v1.0.0 h1:7cD+2eVCvV3sE7pinuyCwpvP+BZnaoPrLk9nfQJbzBk= h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= + v1.1.0 h1:I1iRlVxpuOHvE5s8Pw1mqGeQ2DJJ7YFUCg+JgoxiGeI= - + v1.2.0 h1:0HIbH907iBTAntm+88IJV2qmJALDAh8sPekI9Vc1fm0= - + v1.2.1 h1:wJld/fq1ChPq0K12xrOWpH9E0708XZpQK05DUY0tZmk= - + v1.2.2 h1:Hzbgbvi2etJFuJvwqC1N+mMGTzojZ9niWXv3dmTEwEA= - + v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= - +gopkg.in/go-playground/validator.v8 + v8.0.1 h1:FppjEo03eWfk56wLARtuKd8gxth8YdsOcCIxoYInmR8= h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= + v8.8.1 h1:M8YWdxbqGCu6nT3HKsYZJb2BILSRmnARwGFika2a1nI= - + v8.15.1 h1:IrBBTcgklCPw+7tjCGdAErvsk+44VaIeS/4T1utPQ+I= - + v8.17.1 h1:W1Q1z7rfiJiNhoBkHYqb9TJAdOqPXsyNeZ+8cAzP+kg= - + v8.17.2 h1:4R86dnE4UskypytrvcWswEtRQ3krktX1mLp7QjCO93o= - + v8.17.3 h1:4VWLMak6xEPpotvt6qEzKeYxg7sSlEclqtdTmkCiHck= - + v8.18.0 h1:Vq7TLtmeTm6WYaeH3vtJLuf5Y99IStzJhhcrzZ8TovE= - + v8.18.1 h1:F8SLY5Vqesjs1nI1EL4qmF1PQZ1sitsmq0rPYXLyfGU= - + v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= - +gopkg.in/go-playground/validator.v9 + v9.20.1 h1:FgbLL8fWdzeNaZgYGlmEcmXkXZVadKzllL6e1lVHECY= h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= + v9.20.2 h1:6AVDyt8bk0FDiSYSeWivUfzqEjHyVSCMRkpTr6ZCIgk= - + v9.21.0 h1:wSDJGBpQBYC1wLpVnGHLmshm2JicoSNdrb38Zj+8yHI= - + v9.21.1 h1:5TmeijDXOo30RkyYzQKgnm8h04beTpbW66crEqGUHOk= - + v9.22.0 h1:voA791S2rJ6IWnusR9SL0Z/2e+DrfKlLXaEr+jRHf5Y= - + v9.23.0 h1:oq297iqu7qsywIbeW5DBUTtV1nV750Y4q+H8MnDh0Yc= - + v9.24.0 h1:4pXadp8xZVW4WR1Ygw8zDqeCMVHxTGI9tPWyzD2XSzY= - + v9.25.0 h1:Q3c4LgUofOEtz0wCE18Q2qwDkATLHLBUOmTvqjNCWkM= - + v9.26.0 h1:2NPPsBpD0ZoxshmLWewQru8rWmbT5JqSzz9D1ZrAjYQ= - + v9.27.0 h1:wCg/0hk9RzcB0CYw8pYV6FiBYug1on0cpco9YZF8jqA= - +gopkg.in/godo.v2 + v2.0.0 h1:mt97ITWHUj992Vlz+k1qJcwhr/lgOvvRFnkMmSicZeA= h1:wgvPPKLsWN0hPIJ4JyxvFGGbIW3fJMSrXhdvSuZ1z/8= + v2.0.1 h1:gSerkUE04EIE/2a7A63LXZJ/gMPa8E/HREtS8PZmCT0= - + v2.0.2 h1:Kph1KeQYhMuLtT99y1Ro4j9hvY+s+lqSamdNvPCM7ww= - + v2.0.3 h1:T1XOiT9CO9W6VS99qVPtWUD7TJpSoMvXvAAhN2jbdxg= - + v2.0.4 h1:lOhtfzkbJ45vN4ihMHVlLDXKqQ7y9Z4oU3A6uOO9BPY= - + v2.0.5 h1:1KIx7P29P4M7XhyO7+i65koUxJ2FbLMZJJnhR/dbthY= - + v2.0.6 h1:ZQyUuVDn20EyxuH1dCDb9Ue1XTWt+vooVmIbSIBw0tQ= - + v2.0.7 h1:nUsEBDOFEqd0XhXNsKW4S93VgpsJulT6EwYvD5kCoDI= - + v2.0.9 h1:jnbznTzXVk0JDKOxN3/LJLDPYJzIl0734y+Z0cEJb4A= - +gopkg.in/gorp.v1 + v1.2.1 h1:t50MTR1csu5McYtgirTr/v/SksNgcZ3+AE24OX3BXZk= h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= + v1.6.1 h1:eDPq0qHmO9DwOsXA8NXDQLKckmtjEWAlpOcUoEI6s2Q= - + v1.7.1 h1:GBB9KrWRATQZh95HJyVGUZrWwOPswitEYEyqlK8JbAA= - + v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= - +gopkg.in/guregu/null.v3 + v3.0.1 h1:bPjE2K6nWBZ/FwopjdG4K6DEF02ltwZw5oPT1wOipfg= h1:E4tX2Qe3h7QdL+uZ3a0vqvYwKQsRSQKM5V4YltdgH9Y= + v3.2.0 h1:qHvBLdOZhlFfEsCxdGDE0cJH2F0TU8YXb5IrFHBpsoU= - + v3.2.1 h1:XwY4n+l1y+DQXgbkJSgcsg3UMsJTCNrDkNLnXpZ9FpU= - + v3.3.0 h1:8j3ggqq+NgKt/O7mbFVUFKUMWN+l1AmT5jQmJ6nPh2c= - + v3.4.0 h1:AOpMtZ85uElRhQjEDsFx21BkXqFPwA7uoJukd4KErIs= - +gopkg.in/igm/sockjs-go.v2 + v2.0.0 h1:NfDyi1jrF9v2VOPESefhKH1NRqpoE9tp4v6kxVR3ubs= h1:xvdpHZ3OpjP0TzQzl+174DglrrnYZKVd6qHPIX20Z1Q= +gopkg.in/inf.v0 + v0.9.0 h1:3zYtXIO92bvsdS3ggAdA8Gb4Azj0YU+TVY1uGYNFA8o= h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= + v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= - +gopkg.in/ini.v1 + v1.38.1 h1:8E3nEICVJ6kxl6aTXYp77xYyObhw7YG9/avdj0r3vME= h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= + v1.38.2 h1:dGcbywv4RufeGeiMycPT/plKB5FtmLKLnWKwBiLhUA4= - + v1.38.3 h1:ourkRZgR6qjJYoec9lYhX4+nuN1tEbV34dQEQ3IRk9U= - + v1.39.0 h1:Jf2sFGT+sAd7i+4ftUN1Jz90uw8XNH8NXbbOY16taA8= - + v1.39.1 h1:rLTmwleNumItfQvoOzEoMVnxhExiFsc1AVT/R99UOCA= - + v1.39.2 h1:TWzeigUv2RIRCp+09pwfJemxPXRn8AI7P4Ow5NYxIYc= - + v1.39.3 h1:+LGDwGPQXrK1zLmDY5GMdgX7uNvs4iS+9fIRAGaDBbg= - + v1.40.0 h1:JOoHKRa3vZxx47SL6sOY0gj0hfmA24l+BkQ4CftFizc= - + v1.41.0 h1:Ka3ViY6gNYSKiVy71zXBEqKplnV35ImDLVG+8uoIklE= - + v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk= - +gopkg.in/ldap.v2 + v2.2.1 h1:uEGgNMi/p26RvB/tgI+Mcp0iU2sk7gActz6JUQlr0zM= h1:oI0cpe/D7HRtBQl8aTg+ZmzFUAvu4lsv3eLXMLGFxWk= + v2.2.2 h1:5qrQsQnMAMaiw7RiKL5BdJ8voqgj9IAHO4PdhC7uvu8= - + v2.3.0 h1:vwU7LAjFERkhFo+UiiJ70sMaE6KEgCrB6KTWjP4ZhO0= - + v2.4.0 h1:vXIxs+LA+6RKbdWYwAUaHZB3WH45V3HhRpNjGJBRXCw= - + v2.4.1 h1:hpjvxi3mgMuQoUY5tEC4/y+bo8IkS/5auzmZqiAtIeU= - + v2.5.0 h1:1rO3ojzsHUk+gq4ZYhC4Pg+EzWaaKIV8+DJwExS5/QQ= - + v2.5.1 h1:wiu0okdNfjlBzg6UWvd1Hn8Y+Ux17/u/4nlk4CQr6tU= - +gopkg.in/macaron.v1 + v1.1.11 h1:PBBsp2LefPe+XIoRMrxR0l4Ef+d7qLcmO0Jk23o3rF8= h1:PrsiawTWAGZs6wFbT5hlr7SQ2Ns9h7cUVtcUu4lQOVo= + v1.1.12 h1:VNgwUqv5EPXTryXMcnU+kq9eCuojFL3RCjKekMNbbds= - + v1.2.0 h1:REcIkgUoaYbcfwH/Q7w6ndSAwuhXdRGPpcGUXj4amUs= - + v1.2.1 h1:V5mrRgXNCxnUDBwydwrDf/Prr6rnT50P0el2MY4o8LY= - + v1.2.2 h1:KpY9I5T9SyYZaE16kSDVi1hTWRGp9vQL71+2tTdP9ys= - + v1.2.3 h1:nrePeGPQ/xxQwAtPs9arowkWhjIs0pqUyGTowPJDTHU= - + v1.2.4 h1:hBOy4AsYKd4lC59YjpDl7MGXEss+JYhH8aF/fXf/Cc4= - + v1.3.0 h1:WzPx4dAD2r4X83porPurl0kfLZ4pt8ItQnr3Paasjuk= - + v1.3.1 h1:IdmGJaqXWUdEeN7fmhHF3voSAMzSthjZmTV4SkdSW/s= - + v1.3.2 h1:AvWIaPmwBUA87/OWzePkoxeaw6YJWDfBt1pDFPBnLf8= - +gopkg.in/natefinch/lumberjack.v2 + v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/olivere/elastic.v2 + v2.0.52 h1:MZd8vVO0DEHBOmqpC738Tpht4Hk7p95Yr1byR8uTWW0= h1:CTVyl1gckiFw1aLZYxC00g3f9jnHmhoOKcWF7W3c6n4= + v2.0.53 h1:OCejIubg8xLFxnMGwxlGypMTlvnjPQjEna0Ll90eKx8= - + v2.0.54 h1:BYI8OA86IwbCj7ITT8XMJPUEgzxaKDX+ZKZDcrVMmtY= - + v2.0.55 h1:WAhhomC40XjwYRI93VAHSKvU8g2vixqPQBToJIyLScg= - + v2.0.56 h1:ua1qYYbwPAFVTDGrHJ0aa0G9H4JZhcBUkn9q8L4bJ/0= - + v2.0.57 h1:zdyq4es731u3oGAJHKW8vt5OIEeIeyseTug4i+urfSc= - + v2.0.58 h1:MQ0JYVkpm2vFzeb5Iq6qeIJwEpk2SXm7N8So4fFdaAY= - + v2.0.59 h1:ykPi80ghvr1cLBLD8wM+80Wq7bQJPUFBhn8exaMYNs0= - + v2.0.60 h1:XHzS/ypiAZAcEKjbKrgTZ93/68izI9cEIiZDij+7xrA= - + v2.0.61 h1:7cpl3MW8ysa4GYFBXklpo5mspe4NK0rpZTdyZ+QcD4U= - +gopkg.in/olivere/elastic.v3 + v3.0.66 h1:jspimEBZgOP4T7zvChuHIG8rTCObchzXiVYKN9XlUD0= h1:yDEuSnrM51Pc8dM5ov7U8aI/ToR3PG0llA8aRv2qmw0= + v3.0.67 h1:1IP8Q7sEuOvh+MCIO2diQKUyp/ROCtEgJnylZHrDTiU= - + v3.0.68 h1:OsczWb4iM2WlB1+iyAbKz07GsMdb0V3COUZJxOXEV4Q= - + v3.0.69 h1:Sya2Bzgtd9TymDanrKi5xT6Egs27DytfQjGk2l5qK2Y= - + v3.0.70 h1:h/hscpZxZt8wmx6J9n+U4aMAQ0pcgT2dyrVbo7k19Qw= - + v3.0.71 h1:HwBpAOj8XGnPUfgdO3ozJiLBYu/cBi6/4RZ+QMMw6zc= - + v3.0.72 h1:6B82T8fxH7ODdwjrxVrxvHeiVdpXxtMIHAChJDyBfyI= - + v3.0.73 h1:faw+mH0ObCIFjrZFxLrtpfy9+WkM2/HLRGs/3AqgGgE= - + v3.0.74 h1:55PbM2ONjZ2lQX4EO1/iJzw2CPPNmmlBtwKxuRBPGFI= - + v3.0.75 h1:u3B8p1VlHF3yNLVOlhIWFT3F1ICcHfM5V6FFJe6pPSo= - +gopkg.in/olivere/elastic.v5 + v5.0.69 h1:SILXLfQjYYG8BkkhEPHgYW9UARDvYmPNiCTu0ZaBAJE= h1:FylZT6jQWtfHsicejzOm3jIMVPOAksa80i3o+6qtQRk= + v5.0.70 h1:DqFG2Odzs74JCz6SssgJjd6qpGnsOAzNc7+l5EnvsnE= - + v5.0.71 h1:HLydL4YNSbE7XokUf7B5XxaznoVrDaRaUZ3fRdhBndI= - + v5.0.73 h1:JsgYVgCE5yLUVwhO9+YjI10/uKGQfrD1Z6Q8W9fCNsI= h1:vZXWaUsyb5y7tXaKN6wwNr89UXvu9pX2QObsJh43kFo= + v5.0.74 h1:gYU5Ou+i/SlIg5Y99wS6fVCr7qv6SPUHI39t+WCBWcs= h1:uhHoB4o3bvX5sorxBU29rPcmBQdV2Qfg0FBrx5D6pV0= + v5.0.75 h1:l2+tYJLseGgWpcQXMpGFcV2T3JUBIYmP+PZE/K3XbvU= - + v5.0.76 h1:A6W7X4yLPQDINHiYAqIwqev+rD5hIQ4G0e1d5H//VXk= - + v5.0.77 h1:u5NMYGdddkoWl5+5qWqBmqWgCaYrCftNoTiUkWcqs/w= - + v5.0.78 h1:SI2vT16LLRqLw+ckMSn3RuFYPFg+I6eUMprH3yz855w= - + v5.0.79 h1:q+FQfSQxl+xIHoEwq8RGBsb5pRB9f8rfaLh4D9jx18A= - +gopkg.in/redis.v2 + v2.3.1 h1:7rf3dKtDXiNLld8rsy3ePEIBRHV+/qt2oOnRfjTqrHs= h1:4wl9PJ/CqzeHk3LVq1hNLHH8krm3+AXEgut4jVc++LU= + v2.3.2 h1:GPVIIB/JnL1wvfULefy3qXmPu1nfNu2d0yA09FHgwfs= - +gopkg.in/redis.v3 + v3.5.0 h1:PwukUTFZ+z5z/1susHf3C95Damu/yaFXJOfHM9pGlKI= h1:6XeGv/CrsUFDU9aVbUdNykN7k1zVmoeg83KC9RbQfiU= + v3.5.1 h1:EdMcdTJBsnOL4Cui4dwgHKfRsVERbdFA/zYna9329mo= - + v3.5.2 h1:7rJ90fIkMvXJw4feZJ8D6DhaASOe/5fwCSZeFff8itQ= - + v3.5.3 h1:sks8GNNLYWsSceBYj5flEW/UrFe8En1yovF2+/j0BaI= - + v3.5.4 h1:4r1j1QRGqRuqeWjEvLy6VzyEsF6otx6rC/yiFSkHkRU= - + v3.6.0 h1:OF0Dl0A94NUG3EIfIX9SByjsZaKuQ4fZkBTDhbqziVk= - + v3.6.1 h1:WeAQhMHxdLnS+z/axTJwsilXmF1nmerzU8/BCFqCLWA= - + v3.6.2 h1:VYqbkiS2m8OFS6YO49USaeklXVXbZPGChqf2i7o21cE= - + v3.6.3 h1:2+KxEZazco1bqNJ+vsMbs2MnSiSf0ck8AF8HOqDo3OU= - + v3.6.4 h1:u7XgPH1rWwsdZnR+azldXC6x9qDU2luydOIeU/l52fE= - +gopkg.in/redis.v4 + v4.1.8 h1:jjqbmgEkaissIv7weyr6c0YAdJrVF9EtZaVdwRn312o= h1:8KREHdypkCEojGKQcjMqAODMICIVwZAONWq8RowTITA= + v4.1.9 h1:HRLu1932aeDU7u0HIWLSqQLYFGwly+sUKYLh8N9WwoY= - + v4.1.10 h1:rkS6GO9nB8YUriCOKbLgg50qUA51zJu9R+nxnyY1TV4= - + v4.1.11 h1:nuA8xUx2S4J1qQHIZwXH92fHB9SquYLvvOHl8/5UOpU= - + v4.1.12 h1:PzZR13P1qKQ9rkQyV0QBOT4/OBmRKED/ZxDOL/vrihI= - + v4.2.0 h1:mQXuDqI+j+Iq544Yo+PA8GdY81vTpS+Da3antVsSfOs= - + v4.2.1 h1:OmsloTtfG2PO9RHN5+essTITBjdJyi5paxJZxYSpqIQ= - + v4.2.2 h1:/VNmyVvFYHWdxn6JrG8gFmIqg7jADwA95aXTLjj1cQM= - + v4.2.3 h1:0s27sbgN3FDHgaBtOme2JBab/AormYY7wQpFR1z8JMw= - + v4.2.4 h1:y3XbwQAiHwgNLUng56mgWYK39vsPqo8sT84XTEcxjr0= - +gopkg.in/redis.v5 + v5.2.0 h1:65WtsP4bUKiJRzNoG6rvlBuJdiUBnbQz/1gaSFMb0e0= h1:6gtv0/+A4iM08kdRfocWYB3bLX2tebpNtfKlFT6H4mY= + v5.2.1 h1:FAJ2+937QQWp5jECvq7X4Qs2Hf04nML5w5Ql44kgz/s= - + v5.2.2 h1:uDAK+ci8pHLmeSD4qfiPG9jFUWMIZr79PU95h+rVr44= - + v5.2.3 h1:W27CZnhjz4AxBC4x2x2u+C5GqFcYym2e9JUPQx13ZC4= - + v5.2.4 h1:XpIcn07AdbjbLZOqa6ipEm9aUhLwpgsm3yi0liZMycc= - + v5.2.5 h1:5rRADpaSVEga31nAvS34KrgrXGFZPgeQSle5CJ9dPdQ= - + v5.2.6 h1:IfFCluQuDoA4oT/6RjF90XPGSJnWwgcrJQ3RldDJuxs= - + v5.2.7 h1:uSF0VCKekjBAxSHRMVGgS8gyRsumywOLeud8f/eSDg0= - + v5.2.8 h1:CurB5zpl0Mg91TGdRUiRuQNShq4M3kL/oOT95oN3xIM= - + v5.2.9 h1:MNZYOLPomQzZMfpN3ZtD1uyJ2IDonTTlxYiV/pEApiw= - +gopkg.in/russross/blackfriday.v2 + v2.0.0 h1:+FlnIV8DSQnT7NZ43hcVKcdJdzZoeCmJj4Ql8gq5keA= h1:6sSBNz/GtOm/pJTuh5UmBK2ZHfmnxGbl2NZg1UliSOI= +gopkg.in/square/go-jose.v1 + v1.0.0 h1:nwaqj4pUTyiyO9A2teeBt3m+nPD+gjOhgLEHOZWbUeg= h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= + v1.0.1 h1:jVeiLyj8z2C00p+KFfRmVWhqXQEnwoMDLt3fJEodlPY= - + v1.0.2 h1:K8g79YTjmCjOzz9rWgHs4ZiQkH8XLJIoQBYJ7IDoHfo= - + v1.0.3 h1:3epMv0BDtfRLoRULAg1TT2WcP/hA3BFJgbJBPnlgTIw= - + v1.0.4 h1:xh1t8LKyh647lM6QqZGZpwTnN+kkqhcTPqjrDhWTn9Y= - + v1.0.5 h1:BNd6CxBN6s7x00GjOvsJcz1H7RDAh3Czn8NSBlJSqPg= - + v1.1.0 h1:T/KcERvxOFKL2QzwvOsP0l5xRvvhTlwcTxw5qad61pQ= - + v1.1.1 h1:pA7KxQLcwADLRJ3lpUC+vIe4LCO8oRBMoq1HJoJhA3U= - + v1.1.2 h1:/5jmADZB+RiKtZGr4HxsEFOEfbfsjTKsVnqpThUpE30= - +gopkg.in/square/go-jose.v2 + v2.1.3 h1:/FoFBTvlJN6MTTVCe9plTOG+YydzkjvDGxiSPzIyoDM= h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= + v2.1.4 h1:2F80z1AzUrkIpMSw+HIa5WJBzPTFEzQiTTPLES3hbfI= - + v2.1.5 h1:xrxLbb+CJOyjQQaau6hz83i+KLufbDAlIX4Y6sejEsM= - + v2.1.6 h1:oB3Nsrhs3CNwP1t2WZ/eGtjH8BQhmcGx3zD8Lla+NjA= - + v2.1.7 h1:4m8fIwX7Xdw2WlFiPJtcVCDX6ELrIdpHnRmE6Uqmktk= - + v2.1.8 h1:yECBkTX7ypNaRFILw4trAAYXRLvcGxTeHCBKj/fc8gU= - + v2.1.9 h1:YCFbL5T2gbmC2sMG12s1x2PAlTK5TZNte3hjZEIcCAg= - + v2.2.0 h1:0kdiskBe/uJirf0T5GGmZlS8bWRYUszavQpx91WycKs= - + v2.2.1 h1:uRIz/V7RfMsMgGnCp+YybIdstDIz8wc0H283wHQfwic= - + v2.2.2 h1:orlkJ3myw8CN1nVQHBFfloD+L3egixIa4FvUP6RosSA= - +gopkg.in/src-d/go-git.v4 + v4.4.1 h1:acuY71VVmQUSFZSfcO1V3Gt0kajuvL26Up8ZBdB6CI8= h1:CzbUWqMn4pvmvndg3gnh5iZFmSsbhyhUWdI0IQ60AQo= + v4.5.0 h1:6VjUh+5ATbfmlCAhV/Fb+1uQ7GnwLIuBPkwcRtxHZkk= - + v4.6.0 h1:3XrA9Qxiwfj7Iusd7dVYUqxMjJYPsLuBdUeQbwnL/NQ= - + v4.7.0 h1:WXB+2gCoRhQiAr//IMHpIpoDsTrDgvjDORxt57e8XTA= - + v4.7.1 h1:phAV/kNULxfYEvyInGdPuq3U2MtPpJdgmtOUF3cghkQ= h1:xrJH/YX8uSWewT6evfocf8qsivF18JgCN7/IMitOptY= + v4.8.0 h1:dDEbgvfNG9vUDM54uhCYPExiGa8uYgXpQ/MR8YvxcAM= h1:Vtut8izDyrM8BUVQnzJ+YvmNcem2J89EmfZYCkLokZk= + v4.8.1 h1:aAyBmkdE1QUUEHcP4YFCGKmsMQRAuRmUcPEQR7lOAa0= - + v4.9.0 h1:Khe+oTSklf4aZ1037ayWhx1bwolheNTG6mj0Ss1zrfQ= - + v4.9.1 h1:0oKHJZY8tM7B71378cfTg2c5jmWyNlXvestTT6WfY+4= - + v4.10.0 h1:NWjTJTQnk8UpIGlssuefyDZ6JruEjo5s88vm88uASbw= - +gopkg.in/telegram-bot-api.v4 + v4.2.0 h1:IHqSfGmsospUSY9Ln07udR7ru2/swRaaPRnYqKsCRig= h1:5DpGO5dbumb40px+dXcwCpcjmeHNYLpk0bp3XRNvWDM= + v4.2.1 h1:TDknppPv/X8IcXalSEB8+lUGICaR5qrtgxE4azOUsEU= - + v4.3.0 h1:F4b2bbhN0K3q69WOj61X55z8JA4Lnce7fnOdk2zn++E= - + v4.4.0 h1:6a24pbShYp5rbKf6kS2JWa9+0YPm8OxcBbqhL28fWd0= - + v4.5.0 h1:8jZJyG3auCfkAPcAVr5jZ+ecL7ryPxIXgG0eWyJ8GME= - + v4.5.1 h1:ESWxojO4ZfhAkZwKhqUN+y/ZMq247jKjlcQAH3YTTTw= - + v4.6.1 h1:dv01Nt/N1XQHtKYXCw0IvwLZ61G+dTa9sradBjyAqU4= - + v4.6.2 h1:oUu8dyT/KzUWusD3OiPWTLoFM6n9uskQlW1GLoxjQcE= - + v4.6.3 h1:f4hJ3ITtvfOj9jr1i1/7GqqMEO9vpfJqbXIsgMUvIs8= - + v4.6.4 h1:hpHWhzn4jTCsAJZZ2loNKfy2QWyPDRJVl3aTFXeMW8g= - +gopkg.in/tylerb/graceful.v1 + v1.2.6 h1:ckW3yVSRHtWGFJJUSlAv6kG8KIyW6M2P7Vlv9HSVV1A= h1:yBhekWvR20ACXVObSSdD3u6S9DeSylanL2PAbAC/uJ8= + v1.2.7 h1:qO24UH8UijdTFYyGfno4FylsUqceXtdD7qmZYz/q4kk= - + v1.2.8 h1:NCopaPkEh50x1Zksp2cyh6wcJ4cjpihHKwn838r6F+8= - + v1.2.9 h1:JEqK2MKfstLJ/Ck1xRU3ZbyPxXtlyMb659qx3SD1NyA= - + v1.2.10 h1:b2KKG/98fpUz8cTAyk9VsirN/DB/aG4t3YYMiP9xUBE= - + v1.2.11 h1:gG4yKasbCr2M5PmKDcSD8QvAAEBw3bLzvA+ZSnzndTk= - + v1.2.12 h1:fyiwgP14Pt2zcG52YE7jGpmI+Z19EPBr0iPTl1LwJzg= - + v1.2.13 h1:UWJlWJHZepntB0PJ9RTgW3X+zVLjfmWbx/V1X/V/XoA= - + v1.2.14 h1:oiz4kQ+TpHevusS0Rj4bHh9P9wL9RhiNaGII/C9W0QU= - + v1.2.15 h1:1JmOyhKqAyX3BgTXMI84LwT6FOJ4tP2N9e2kwTCM0nQ= - +gopkg.in/unrolled/render.v1 + v1.0.0 h1:f/6S5YVJqWYcqYtvfsv+Eb+A1CWhuA7n+ILks5qv9gw= h1:D8ZfMFuggVdNUNlNz/R8zVjPPHGyMxLuJPA+MSx8na0= +gopkg.in/urfave/cli.v1 + v1.15.0 h1:rI0RRRs5LRJpLe6EkPUCrcACRDwseawCxh3XscivV80= h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= + v1.16.0 h1:/F2aUks+U8n2RyLUx+2TdxAcnT90mdhawpW/EAnt0e0= - + v1.16.1 h1:o+4cPmtQWNZpx++xZl7DnR8CBVUEXGKPH9vsNmGO9aQ= - + v1.17.0 h1:PuvzS+NtlnLBSZ6tKY6us1aeLkCZGlpg1bEIsSmIqxk= - + v1.17.1 h1:hVHy931pfJxrhG/3zYuTCdzkPM2yjGT72OleI/pL8fk= - + v1.18.0 h1:8UwKRHJhJXVZiD1knmUd7r2GxeJOkeHW7YEI1u0xIDk= - + v1.18.1 h1:Z65+UJjxGDZHRdsnYU+Q+KCFrjSwc/VVB0X6jvGBd2U= - + v1.19.0 h1:mf+2mvYi0FaeObyhdxSudZaT2SbDKTI4oJFTfciGzsI= - + v1.19.1 h1:pkwzWQSFerxgLtkdWlnjwOS+Vd7VCp/Kwdn3kmeflXQ= - + v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= - +gopkg.in/vmihailenco/msgpack.v2 + v2.7.3 h1:2R71q9j9HMo3qg3fqSPBq7oyVuSq6n+bWoV+OgtFnms= h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= + v2.7.4 h1:wAy0oc6rFtax+qrPl+UrOyDw9yrTIGFi3Q9cicDZ9l0= - + v2.8.0 h1:LB/RzJrvbZ78O0ETDVMZo+WcJmYVT51U/iJ1YPeTTvg= - + v2.8.1 h1:vwNyqK+a1cxU2pyWau1ohPbG9WtLDPXnh6EGsF3K5Ns= - + v2.8.2 h1:dSHRUEFGQtymjUv7dFZ8nGVPamzUSW79Zr+7JHNs8ps= - + v2.8.3 h1:jMY6Wf1VPCyOvzD8dcnmL/HCkC7y60+0x6SQE7qJvvc= - + v2.8.4 h1:z5FtZ+GB3FcM/lZtyIEZlhaUkfIfOZFN9bHOu6qB2RA= - + v2.8.5 h1:wT+qv7QaQWrm1Li6CbRzw+zqHsNZzy9V/cNOMXwdU4I= - + v2.9.0 h1:tmB/gene3e/xkXSpFk5xCNwDAtwcDUqMs9oDDudyEF4= - + v2.9.1 h1:kb0VV7NuIojvRfzwslQeP3yArBqJHW9tOl4t38VS1jM= - +gopkg.in/yaml.v2 + v2.0.0 h1:uUkhRGrsEyx/laRdeS6YIQKIys8pg+lRSRdVMTYjivs= h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= + v2.1.0 h1:o2qA7KtU0UqgG4G8I4Hw5iXppmCcmuISiLweMFO22M0= - + v2.1.1 h1:fxK3tv8mQPVEgxu/S2LJ040LyqiajHt+syP0CdDS/Sc= h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= + v2.2.0 h1:ucE2Go3MGv/WipgucyA7X3+4pRLSbl5sd8WaEs60obQ= - + v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= - + v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= - +k8s.io/client-go + v4.0.0-beta.0+incompatible h1:P+YnxLM0z74ESopTIZpD7gCg1A9wgE++vMIpa0v8JDI= h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= + v4.0.0+incompatible h1:G0T/bjcZWkHyAv3FRcXwTnaEV2IhCwuYhDx/m3JuxUY= - + v5.0.0+incompatible h1:GRNZwjeW9HjYCAY0+EwNf6Tvp+mXx/uBVVcT8ixJz+s= - + v5.0.1+incompatible h1:IPZ0cnux5ui8+X8r1HdeFPXucpQ4HyJQigjo1clq1QM= - + v6.0.0+incompatible h1:QVR0YsL5jUAs8IB2sHb7IANUK6FYv6CpNLpSPke7R2Q= - + v7.0.0+incompatible h1:kiH+Y6hn+pc78QS/mtBfMJAMIIaWevHi++JvOGEEQp4= - + v8.0.0+incompatible h1:tTI4hRmb1DRMl4fG6Vclfdi6nTM82oIrTT7HfitmxC4= - + v9.0.0-invalid+incompatible h1:PAQ787PYfegRAYGYH3E5bgZS7plC4i8Z2Og1iLCCgV4= - + v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A= - + v10.0.0+incompatible h1:F1IqCqw7oMBzDkqlcBymRq1450wD0eNqLE9jzUrIi34= - +k8s.io/heapster + v1.5.0-beta.0 h1:QLmWHYNeI0Y2SH2+ywX9pvrl17Krp9aSsZLVkKn8rC4= h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= + v1.5.0-beta.1 h1:eYRpxHJihz1PX8rr6cwKdETr+st5DI4kjfVUpJosppY= - + v1.5.0-beta.2 h1:JMdMJY62NiCvpTvulKT5WxXmZ/ZAsEFA4B2pgRZYE6g= - + v1.5.0-beta.3 h1:LQSpxHpKWeGoVsRBP0N26tXQPPzGEFTaPca3ed44vLQ= - + v1.5.0 h1:Tunw4N48Ys4seXluU9Nle0XBZdCPKYuli115MRwdnic= - + v1.5.1 h1:gQNVK6c7mB7nhfrAIr2qZcnELENq7WxYJFJEpYQYrXc= - + v1.5.2 h1:P61v06rdxOdUm8s+31D0oheeCPCH2upMWweCUulzSkg= - + v1.5.3 h1:JGhFcTE91wr2HQ8jsUIMiHUhIjKBRgU91G+bgtnzOc4= - + v1.5.4 h1:lH2GCZdqRmUKDoyqRgiXbRmIcevaPYTvkguOuYUl8gQ= - + v1.6.0-beta.1 h1:+ibnpUBhNjN80vvze2ok3Mza0s7nMa1NVZlKtDPvGMQ= - +` diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index d9c8ae40d8..63657a448f 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -337,19 +337,9 @@ module file trees. Module downloading and verification -The go command maintains, in the main module's root directory alongside -go.mod, a file named go.sum containing the expected cryptographic checksums -of the content of specific module versions. Each time a dependency is -used, its checksum is added to go.sum if missing or else required to match -the existing entry in go.sum. - -The go command maintains a cache of downloaded packages and computes -and records the cryptographic checksum of each package at download time. -In normal operation, the go command checks these pre-computed checksums -against the main module's go.sum file, instead of recomputing them on -each command invocation. The 'go mod verify' command checks that -the cached copies of module downloads still match both their recorded -checksums and the entries in go.sum. +The go command checks downloads against known checksums, +to detect unexpected changes in the content of any specific module +version from one day to the next. See 'go help module-auth' for details. The go command can fetch modules from a proxy instead of connecting to source control systems directly, according to the setting of the GOPROXY diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index 4f8ab7f55a..acca4fd3c1 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -72,6 +72,7 @@ func init() { modload.HelpModules, modget.HelpModuleGet, help.HelpPackages, + modfetch.HelpSum, test.HelpTestflag, test.HelpTestfunc, } diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index 48420daa1f..9cb5b49d29 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -109,6 +109,7 @@ func (ts *testScript) setup() { "GOPATH=" + filepath.Join(ts.workdir, "gopath"), "GOPROXY=" + proxyURL, "GOROOT=" + testGOROOT, + "GONOVERIFY=*", tempEnvName() + "=" + filepath.Join(ts.workdir, "tmp"), "devnull=" + os.DevNull, "goversion=" + goVersion(ts), diff --git a/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt new file mode 100644 index 0000000000..d62db2627a --- /dev/null +++ b/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.0.txt @@ -0,0 +1,14 @@ +rsc.io/badsum@v1.0.0 + +This module would match the hard-coded hash for rsc.io/badsum v1.0.0 +in modfetch/notary.go if not for the "break hash" line. + +-- .mod -- +module "rsc.io/badsum" +-- .info -- +{"Version":"v1.0.0","Time":"2018-02-14T00:45:20Z"} +-- go.mod -- +module "rsc.io/badsum" +-- badsum.go -- +package badsum +// break hash diff --git a/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt b/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt new file mode 100644 index 0000000000..5fea50a01d --- /dev/null +++ b/src/cmd/go/testdata/mod/rsc.io_badsum_v1.0.1.txt @@ -0,0 +1,14 @@ +rsc.io/badsum@v1.0.1 + +This module would match the hard-coded hash for rsc.io/badsum v1.0.1/go.mod +in modfetch/notary.go if not for the "break hash" line. + +-- .mod -- +module "rsc.io/badsum" +# break hash +-- .info -- +{"Version":"v1.0.1","Time":"2018-02-14T00:45:20Z"} +-- go.mod -- +module "rsc.io/badsum" +-- badsum.go -- +package badsum diff --git a/src/cmd/go/testdata/script/mod_notary.txt b/src/cmd/go/testdata/script/mod_notary.txt new file mode 100644 index 0000000000..4e526da80f --- /dev/null +++ b/src/cmd/go/testdata/script/mod_notary.txt @@ -0,0 +1,73 @@ +env GO111MODULE=on +env GONOVERIFY= # default in test scripts is * + +# notary should reject rsc.io/badsum v1.0.0 with good go.mod, bad tree +cp go.mod.orig go.mod +! go get rsc.io/badsum@v1.0.0 +stderr 'verifying rsc.io/badsum@v1.0.0: checksum mismatch' +stderr 'notary: +h1:6/o\+QJfe6mFSNuegDihphabcvR94anXQk/qq7Enr19U=' +stderr 'SECURITY ERROR' +stderr 'NOT match the expected download known to the notary' +stderr 'go help module-auth' +grep 'rsc.io/badsum v1.0.0/go.mod' go.sum +! grep 'rsc.io/badsum v1.0.0 ' go.sum +rm go.sum + +# notary should reject rsc.io/badsum v1.0.1 with bad go.mod, good tree +cp go.mod.orig go.mod +! go get rsc.io/badsum@v1.0.1 +stderr 'verifying rsc.io/badsum@v1.0.1/go.mod: checksum mismatch' +stderr 'notary: +h1:avOsLUJaHavllihBU9qCTW37z64ypkZjqZg8O16JLVY=' +stderr 'SECURITY ERROR' +stderr 'NOT match the expected download known to the notary' +stderr 'go help module-auth' +! exists go.sum # failed at go.mod, did not get to the tree + +# notary checks should run even without explicit go.mod +rm go.mod +rm go.sum +! go get rsc.io/badsum@v1.0.0 +stderr 'verifying rsc.io/badsum@v1.0.0: checksum mismatch' +stderr 'notary: +h1:6/o\+QJfe6mFSNuegDihphabcvR94anXQk/qq7Enr19U=' +stderr 'SECURITY ERROR' +stderr 'NOT match the expected download known to the notary' +stderr 'go help module-auth' +! go get rsc.io/badsum@v1.0.1 +stderr 'verifying rsc.io/badsum@v1.0.1/go.mod: checksum mismatch' +stderr 'notary: +h1:avOsLUJaHavllihBU9qCTW37z64ypkZjqZg8O16JLVY=' +stderr 'SECURITY ERROR' +stderr 'NOT match the expected download known to the notary' +stderr 'go help module-auth' +! exists go.mod +! exists go.sum + +# go get -insecure should skip notary without go.mod +go get -insecure rsc.io/badsum@v1.0.0 +go get -insecure rsc.io/badsum@v1.0.1 +! exists go.mod +! exists go.sum + +# GONOVERIFY should skip notary too +env GONOVERIFY=rsc.i[aeiou] +go get rsc.io/badsum@v1.0.0 +go get rsc.io/badsum@v1.0.1 +! exists go.mod +! exists go.sum +env GONOVERIFY= + +# go get -insecure should skip notary with go.mod and update go.sum +cp go.mod.orig go.mod +go get -insecure rsc.io/badsum@v1.0.0 +go get -insecure rsc.io/badsum@v1.0.1 + +# go.sum should override notary +cp go.mod.orig go.mod +cp go.sum.wrong go.sum +go get rsc.io/badsum@v1.0.0 +go get rsc.io/badsum@v1.0.1 + +-- go.mod.orig -- +module m +-- go.sum.wrong -- +rsc.io/badsum v1.0.0 h1:kZaLRhqz4LgsHPQddRMr+124lTgJfm28AxghGw3vLB0= +rsc.io/badsum v1.0.1/go.mod h1:xwKWaN8OFR80Kg5/vdt+V2b+2P5kaLH+wWo5CL+pwHs= -- GitLab From fd19bc64de61e33537b90a7d7ed489fd83412ced Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Thu, 7 Mar 2019 15:05:43 +1100 Subject: [PATCH 0330/1679] doc: add missing paragraph break in Effective Go A recent edit broke the flow; add a paragraph break when the subject switches from maps to structs. No changes in wording. Change-Id: I5df88ec36b9d81931cfdbc684424440d01ac06d1 Reviewed-on: https://go-review.googlesource.com/c/go/+/165917 Reviewed-by: Brad Fitzpatrick --- doc/effective_go.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/effective_go.html b/doc/effective_go.html index b98235931c..7bb60a0786 100644 --- a/doc/effective_go.html +++ b/doc/effective_go.html @@ -1687,6 +1687,8 @@ map[CST:-21600 EST:-18000 MST:-25200 PST:-28800 UTC:0]

For maps, Printf and friends sort the output lexicographically by key. +

+

When printing a struct, the modified format %+v annotates the fields of the structure with their names, and for any value the alternate format %#v prints the value in full Go syntax. -- GitLab From 9e72e604a647c5e782308a91fdc6a6fd099346c4 Mon Sep 17 00:00:00 2001 From: Andrei Matei Date: Mon, 4 Mar 2019 00:44:58 +0000 Subject: [PATCH 0331/1679] database/sql: fix comment grammar Change-Id: I92d8c93967c5ec57f07151affd0041f00e405057 GitHub-Last-Rev: 2dea977d938a504604aed6a9ae87986001f96acd GitHub-Pull-Request: golang/go#30551 Reviewed-on: https://go-review.googlesource.com/c/go/+/164970 Reviewed-by: Brad Fitzpatrick --- src/database/sql/driver/driver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/database/sql/driver/driver.go b/src/database/sql/driver/driver.go index ecc6547bf3..316e7cea37 100644 --- a/src/database/sql/driver/driver.go +++ b/src/database/sql/driver/driver.go @@ -26,7 +26,7 @@ import ( // time.Time // // If the driver supports cursors, a returned Value may also implement the Rows interface -// in this package. This is used when, for example, when a user selects a cursor +// in this package. This is used, for example, when a user selects a cursor // such as "select cursor(select * from my_table) from dual". If the Rows // from the select is closed, the cursor Rows will also be closed. type Value interface{} -- GitLab From 3b6216ed0601c81fe42c2a4738d419afccb62163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Wed, 6 Mar 2019 19:45:41 +0100 Subject: [PATCH 0332/1679] runtime: remove CPU capability workarounds for unsupported FreeBSD versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL removes runtime code working around missing ARM processor capability information in the auxiliary vector in older FreeBSD versions. As announced in the Go 1.12 release notes Go 1.13 will require FreeBSD 11.2+ or FreeBSD 12.0+. These FreeBSD versions support CPU capability detection through AT_HWCAP and AT_HWCAP2 values stored in the auxiliary vector. Updates #27619 Change-Id: I2a457b578d35101a7a5fd56ae9b81b300ad17da4 Reviewed-on: https://go-review.googlesource.com/c/go/+/165799 Reviewed-by: Brad Fitzpatrick Reviewed-by: Yuval Pavel Zholkover Reviewed-by: Tobias Klauser Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot --- src/runtime/os_freebsd_arm.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/runtime/os_freebsd_arm.go b/src/runtime/os_freebsd_arm.go index eb4de9bc21..3edd381302 100644 --- a/src/runtime/os_freebsd_arm.go +++ b/src/runtime/os_freebsd_arm.go @@ -11,16 +11,7 @@ const ( _HWCAP_VFPv3 = 1 << 13 ) -// AT_HWCAP is not available on FreeBSD-11.1-RELEASE or earlier. -// Default to mandatory VFP hardware support for arm being available. -// If AT_HWCAP is available goarmHWCap will be updated in archauxv. -// TODO(moehrmann) remove once all go supported FreeBSD versions support _AT_HWCAP. -var goarmHWCap uint = (_HWCAP_VFP | _HWCAP_VFPv3) - func checkgoarm() { - // Update cpu.HWCap to match goarmHWCap in case they were not updated in archauxv. - cpu.HWCap = goarmHWCap - if goarm > 5 && cpu.HWCap&_HWCAP_VFP == 0 { print("runtime: this CPU has no floating point hardware, so it cannot run\n") print("this GOARM=", goarm, " binary. Recompile using GOARM=5.\n") @@ -44,7 +35,6 @@ func archauxv(tag, val uintptr) { switch tag { case _AT_HWCAP: cpu.HWCap = uint(val) - goarmHWCap = cpu.HWCap case _AT_HWCAP2: cpu.HWCap2 = uint(val) } -- GitLab From c7f69a2897b8fdc16c07aaa0a152060e60449f89 Mon Sep 17 00:00:00 2001 From: alkesh26 Date: Thu, 7 Mar 2019 07:29:34 +0000 Subject: [PATCH 0333/1679] misc: fix typos in various docs Change-Id: Ib03d7e5686e510152042e403b00fb2d65572f393 GitHub-Last-Rev: 57aeedf077cb4f82af68cc5cb2de5d53a447565e GitHub-Pull-Request: golang/go#30156 Reviewed-on: https://go-review.googlesource.com/c/go/+/161723 Reviewed-by: Emmanuel Odeke --- misc/cgo/test/env.go | 4 ++-- misc/cgo/testcarchive/testdata/main4.c | 4 ++-- misc/cgo/testcarchive/testdata/main5.c | 2 +- misc/nacl/testdata/mime.types | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/misc/cgo/test/env.go b/misc/cgo/test/env.go index b2081b7283..e0703e1452 100644 --- a/misc/cgo/test/env.go +++ b/misc/cgo/test/env.go @@ -18,8 +18,8 @@ import ( // This is really an os package test but here for convenience. func testSetEnv(t *testing.T) { if runtime.GOOS == "windows" { - // Go uses SetEnvironmentVariable on windows. Howerver, - // C runtime takes a *copy* at process startup of thei + // Go uses SetEnvironmentVariable on windows. However, + // C runtime takes a *copy* at process startup of the // OS environment, and stores it in environ/envp. // It is this copy that getenv/putenv manipulate. t.Logf("skipping test") diff --git a/misc/cgo/testcarchive/testdata/main4.c b/misc/cgo/testcarchive/testdata/main4.c index 4fd55e753d..a74763dd70 100644 --- a/misc/cgo/testcarchive/testdata/main4.c +++ b/misc/cgo/testcarchive/testdata/main4.c @@ -93,7 +93,7 @@ static void* thread1(void* arg __attribute__ ((unused))) { fprintf(stderr, "sigaltstack disabled on return from Go\n"); ok = 0; } else if (nss.ss_sp != ss.ss_sp) { - fprintf(stderr, "sigalstack changed on return from Go\n"); + fprintf(stderr, "sigaltstack changed on return from Go\n"); ok = 0; } @@ -150,7 +150,7 @@ static void* thread2(void* arg __attribute__ ((unused))) { fprintf(stderr, "sigaltstack disabled on return from Go\n"); ok = 0; } else if (nss.ss_sp != ss.ss_sp) { - fprintf(stderr, "sigalstack changed on return from Go\n"); + fprintf(stderr, "sigaltstack changed on return from Go\n"); ok = 0; } diff --git a/misc/cgo/testcarchive/testdata/main5.c b/misc/cgo/testcarchive/testdata/main5.c index 897b70d2fa..9d0da33652 100644 --- a/misc/cgo/testcarchive/testdata/main5.c +++ b/misc/cgo/testcarchive/testdata/main5.c @@ -85,7 +85,7 @@ int main(int argc, char** argv) { printf("write(2) unexpectedly succeeded\n"); return 0; } - printf("did not receieve SIGPIPE\n"); + printf("did not receive SIGPIPE\n"); return 0; } default: diff --git a/misc/nacl/testdata/mime.types b/misc/nacl/testdata/mime.types index 81a415e9e6..ba678d5a4e 100644 --- a/misc/nacl/testdata/mime.types +++ b/misc/nacl/testdata/mime.types @@ -1,6 +1,6 @@ # This file maps Internet media types to unique file extension(s). # Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. +# and has been placed in the public domain for unlimited redistribution. # # The table below contains both registered and (common) unregistered types. # A type that has no unique extension can be ignored -- they are listed -- GitLab From a2ace8ec18a833e5d286e4e9af6fc5de41ca9a31 Mon Sep 17 00:00:00 2001 From: Chris Marchesi Date: Thu, 7 Mar 2019 07:36:05 +0000 Subject: [PATCH 0334/1679] net/http: unfurl persistConnWriter's underlying writer Make persistConnWriter implement io.ReaderFrom, via an io.Copy on the underlying net.Conn. This in turn enables it to use OS level optimizations such as sendfile. This has been observed giving performance gains even in the absence of ReaderFrom, more than likely due to the difference in io's default buffer (32 KB) versus bufio's (4 KB). Speedups on linux/amd64: benchmark old MB/s new MB/s speedup BenchmarkFileAndServer_16MB/NoTLS-4 662.96 2703.74 4.08x BenchmarkFileAndServer_16MB/TLS-4 552.76 1420.72 2.57x Speedups on darwin/amd64: benchmark old MB/s new MB/s speedup BenchmarkFileAndServer_16MB/NoTLS-8 357.58 1972.86 5.52x BenchmarkFileAndServer_16MB/TLS-8 346.20 1067.41 3.08x Updates #30377. Change-Id: Ic88d4ac254f665223536fcba4d551fc32ae105b6 GitHub-Last-Rev: a6f67cda2ed63ac61a1dffc87f0ea396363f72c6 GitHub-Pull-Request: golang/go#30390 Reviewed-on: https://go-review.googlesource.com/c/go/+/163737 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/transport.go | 11 +++ src/net/http/transport_test.go | 143 +++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index bb9657f4ee..f0ae6ef0b9 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1375,6 +1375,17 @@ func (w persistConnWriter) Write(p []byte) (n int, err error) { return } +// ReadFrom exposes persistConnWriter's underlying Conn to io.Copy and if +// the Conn implements io.ReaderFrom, it can take advantage of optimizations +// such as sendfile. +func (w persistConnWriter) ReadFrom(r io.Reader) (n int64, err error) { + n, err = io.Copy(w.pc.conn, r) + w.pc.nwrite += n + return +} + +var _ io.ReaderFrom = (*persistConnWriter)(nil) + // connectMethod is the map key (in its String form) for keeping persistent // TCP connections alive for subsequent HTTP requests. // diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 6e075847dd..74767f8499 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -5059,3 +5059,146 @@ func TestTransportRequestReplayable(t *testing.T) { }) } } + +// testMockTCPConn is a mock TCP connection used to test that +// ReadFrom is called when sending the request body. +type testMockTCPConn struct { + *net.TCPConn + + ReadFromCalled bool +} + +func (c *testMockTCPConn) ReadFrom(r io.Reader) (int64, error) { + c.ReadFromCalled = true + return c.TCPConn.ReadFrom(r) +} + +func TestTransportRequestWriteRoundTrip(t *testing.T) { + nBytes := int64(1 << 10) + newFileFunc := func() (r io.Reader, done func(), err error) { + f, err := ioutil.TempFile("", "net-http-newfilefunc") + if err != nil { + return nil, nil, err + } + + // Write some bytes to the file to enable reading. + if _, err := io.CopyN(f, rand.Reader, nBytes); err != nil { + return nil, nil, fmt.Errorf("failed to write data to file: %v", err) + } + if _, err := f.Seek(0, 0); err != nil { + return nil, nil, fmt.Errorf("failed to seek to front: %v", err) + } + + done = func() { + f.Close() + os.Remove(f.Name()) + } + + return f, done, nil + } + + newBufferFunc := func() (io.Reader, func(), error) { + return bytes.NewBuffer(make([]byte, nBytes)), func() {}, nil + } + + cases := []struct { + name string + readerFunc func() (io.Reader, func(), error) + contentLength int64 + expectedReadFrom bool + }{ + { + name: "file, length", + readerFunc: newFileFunc, + contentLength: nBytes, + expectedReadFrom: true, + }, + { + name: "file, no length", + readerFunc: newFileFunc, + }, + { + name: "file, negative length", + readerFunc: newFileFunc, + contentLength: -1, + }, + { + name: "buffer", + contentLength: nBytes, + readerFunc: newBufferFunc, + }, + { + name: "buffer, no length", + readerFunc: newBufferFunc, + }, + { + name: "buffer, length -1", + contentLength: -1, + readerFunc: newBufferFunc, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + r, cleanup, err := tc.readerFunc() + if err != nil { + t.Fatal(err) + } + defer cleanup() + + tConn := &testMockTCPConn{} + trFunc := func(tr *Transport) { + tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) { + var d net.Dialer + conn, err := d.DialContext(ctx, network, addr) + if err != nil { + return nil, err + } + + tcpConn, ok := conn.(*net.TCPConn) + if !ok { + return nil, fmt.Errorf("%s/%s does not provide a *net.TCPConn", network, addr) + } + + tConn.TCPConn = tcpConn + return tConn, nil + } + } + + cst := newClientServerTest( + t, + h1Mode, + HandlerFunc(func(w ResponseWriter, r *Request) { + io.Copy(ioutil.Discard, r.Body) + r.Body.Close() + w.WriteHeader(200) + }), + trFunc, + ) + defer cst.close() + + req, err := NewRequest("PUT", cst.ts.URL, r) + if err != nil { + t.Fatal(err) + } + req.ContentLength = tc.contentLength + req.Header.Set("Content-Type", "application/octet-stream") + resp, err := cst.c.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + t.Fatalf("status code = %d; want 200", resp.StatusCode) + } + + if !tConn.ReadFromCalled && tc.expectedReadFrom { + t.Fatalf("did not call ReadFrom") + } + + if tConn.ReadFromCalled && !tc.expectedReadFrom { + t.Fatalf("ReadFrom was unexpectedly invoked") + } + }) + } +} -- GitLab From fee84cc90542884edda60d3eec2cd47f72d67118 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Mon, 11 Feb 2019 09:40:02 +0000 Subject: [PATCH 0335/1679] cmd/compile: add an optimization rule for math/bits.ReverseBytes16 on arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds two rules to turn patterns like ((x<<8) | (x>>8)) (the type of x is uint16, "|" can also be "+" or "^") to a REV16 instruction on arm v6+. This optimization rule can be used for math/bits.ReverseBytes16. Benchmarks on arm v6: name old time/op new time/op delta ReverseBytes-32 2.86ns ± 0% 2.86ns ± 0% ~ (all equal) ReverseBytes16-32 2.86ns ± 0% 2.86ns ± 0% ~ (all equal) ReverseBytes32-32 1.29ns ± 0% 1.29ns ± 0% ~ (all equal) ReverseBytes64-32 1.43ns ± 0% 1.43ns ± 0% ~ (all equal) Change-Id: I819e633c9a9d308f8e476fb0c82d73fb73dd019f Reviewed-on: https://go-review.googlesource.com/c/go/+/159019 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/arm/ssa.go | 1 + src/cmd/compile/internal/ssa/gen/ARM.rules | 6 + src/cmd/compile/internal/ssa/gen/ARM64.rules | 138 +++++----- src/cmd/compile/internal/ssa/gen/ARMOps.go | 7 +- src/cmd/compile/internal/ssa/opGen.go | 14 + src/cmd/compile/internal/ssa/rewrite.go | 8 +- src/cmd/compile/internal/ssa/rewriteARM.go | 210 +++++++++++++++ src/cmd/compile/internal/ssa/rewriteARM64.go | 268 +++++++++---------- test/codegen/mathbits.go | 3 + 9 files changed, 445 insertions(+), 210 deletions(-) diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index 9a8fabf622..320fe98707 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -659,6 +659,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { case ssa.OpARMMVN, ssa.OpARMCLZ, ssa.OpARMREV, + ssa.OpARMREV16, ssa.OpARMRBIT, ssa.OpARMSQRTD, ssa.OpARMNEGF, diff --git a/src/cmd/compile/internal/ssa/gen/ARM.rules b/src/cmd/compile/internal/ssa/gen/ARM.rules index 8b0e82f154..db418b76a6 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM.rules @@ -1216,6 +1216,12 @@ ( ORshiftRL [c] (SLLconst x [32-c]) x) -> (SRRconst [ c] x) (XORshiftRL [c] (SLLconst x [32-c]) x) -> (SRRconst [ c] x) +// ((x>>8) | (x<<8)) -> (REV16 x), the type of x is uint16, "|" can also be "^" or "+". +// UBFX instruction is supported by ARMv6T2, ARMv7 and above versions, REV16 is supported by +// ARMv6 and above versions. So for ARMv6, we need to match SLLconst, SRLconst and ORshiftLL. +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (BFXU [armBFAuxInt(8, 8)] x) x) -> (REV16 x) +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (SRLconst [24] (SLLconst [16] x)) x) && objabi.GOARM>=6 -> (REV16 x) + // use indexed loads and stores (MOVWload [0] {sym} (ADD ptr idx) mem) && sym == nil && !config.nacl -> (MOVWloadidx ptr idx mem) (MOVWstore [0] {sym} (ADD ptr idx) val mem) && sym == nil && !config.nacl -> (MOVWstoreidx ptr idx val mem) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 133a893610..ca123d7375 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -1751,11 +1751,11 @@ ( ORshiftRL [c] (SLLconst x [64-c]) x) -> (RORconst [ c] x) (XORshiftRL [c] (SLLconst x [64-c]) x) -> (RORconst [ c] x) -(ADDshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +(ADDshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (RORWconst [32-c] x) -( ORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +( ORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (RORWconst [32-c] x) -(XORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +(XORshiftLL [c] (UBFX [bfc] x) x) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (RORWconst [32-c] x) (ADDshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 -> (RORWconst [c] x) ( ORshiftRL [c] (SLLconst x [32-c]) (MOVWUreg x)) && c < 32 && t.Size() == 4 -> (RORWconst [c] x) @@ -1794,18 +1794,18 @@ -> (RORW x y) // ((x>>8) | (x<<8)) -> (REV16W x), the type of x is uint16, "|" can also be "^" or "+". -((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) -> (REV16W x) +((ADDshiftLL|ORshiftLL|XORshiftLL) [8] (UBFX [armBFAuxInt(8, 8)] x) x) -> (REV16W x) // Extract from reg pair (ADDshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) ( ORshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) (XORshiftLL [c] (SRLconst x [64-c]) x2) -> (EXTRconst [64-c] x2 x) -(ADDshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +(ADDshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (EXTRWconst [32-c] x2 x) -( ORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +( ORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (EXTRWconst [32-c] x2 x) -(XORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) +(XORshiftLL [c] (UBFX [bfc] x) x2) && c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) -> (EXTRWconst [32-c] x2 x) // Generic rules rewrite certain AND to a pair of shifts. @@ -1821,88 +1821,88 @@ // sbfiz // (x << lc) >> rc -(SRAconst [rc] (SLLconst [lc] x)) && lc > rc -> (SBFIZ [arm64BFAuxInt(lc-rc, 64-lc)] x) -(MOVWreg (SLLconst [lc] x)) && lc < 32 -> (SBFIZ [arm64BFAuxInt(lc, 32-lc)] x) -(MOVHreg (SLLconst [lc] x)) && lc < 16 -> (SBFIZ [arm64BFAuxInt(lc, 16-lc)] x) -(MOVBreg (SLLconst [lc] x)) && lc < 8 -> (SBFIZ [arm64BFAuxInt(lc, 8-lc)] x) +(SRAconst [rc] (SLLconst [lc] x)) && lc > rc -> (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) +(MOVWreg (SLLconst [lc] x)) && lc < 32 -> (SBFIZ [armBFAuxInt(lc, 32-lc)] x) +(MOVHreg (SLLconst [lc] x)) && lc < 16 -> (SBFIZ [armBFAuxInt(lc, 16-lc)] x) +(MOVBreg (SLLconst [lc] x)) && lc < 8 -> (SBFIZ [armBFAuxInt(lc, 8-lc)] x) // sbfx // (x << lc) >> rc -(SRAconst [rc] (SLLconst [lc] x)) && lc <= rc -> (SBFX [arm64BFAuxInt(rc-lc, 64-rc)] x) -(SRAconst [rc] (MOVWreg x)) && rc < 32 -> (SBFX [arm64BFAuxInt(rc, 32-rc)] x) -(SRAconst [rc] (MOVHreg x)) && rc < 16 -> (SBFX [arm64BFAuxInt(rc, 16-rc)] x) -(SRAconst [rc] (MOVBreg x)) && rc < 8 -> (SBFX [arm64BFAuxInt(rc, 8-rc)] x) +(SRAconst [rc] (SLLconst [lc] x)) && lc <= rc -> (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) +(SRAconst [rc] (MOVWreg x)) && rc < 32 -> (SBFX [armBFAuxInt(rc, 32-rc)] x) +(SRAconst [rc] (MOVHreg x)) && rc < 16 -> (SBFX [armBFAuxInt(rc, 16-rc)] x) +(SRAconst [rc] (MOVBreg x)) && rc < 8 -> (SBFX [armBFAuxInt(rc, 8-rc)] x) // sbfiz/sbfx combinations: merge shifts into bitfield ops (SRAconst [sc] (SBFIZ [bfc] x)) && sc < getARM64BFlsb(bfc) - -> (SBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + -> (SBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) (SRAconst [sc] (SBFIZ [bfc] x)) && sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (SBFX [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + -> (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) // ubfiz // (x & ac) << sc (SLLconst [sc] (ANDconst [ac] x)) && isARM64BFMask(sc, ac, 0) - -> (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(ac, 0))] x) -(SLLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFIZ [arm64BFAuxInt(sc, 32)] x) -(SLLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFIZ [arm64BFAuxInt(sc, 16)] x) -(SLLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFIZ [arm64BFAuxInt(sc, 8)] x) + -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) +(SLLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFIZ [armBFAuxInt(sc, 32)] x) +(SLLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFIZ [armBFAuxInt(sc, 16)] x) +(SLLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFIZ [armBFAuxInt(sc, 8)] x) // (x << sc) & ac (ANDconst [ac] (SLLconst [sc] x)) && isARM64BFMask(sc, ac, sc) - -> (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(ac, sc))] x) + -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) (MOVWUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, sc) - -> (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) (MOVHUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, sc) - -> (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) (MOVBUreg (SLLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, sc) - -> (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + -> (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) // (x << lc) >> rc -(SRLconst [rc] (SLLconst [lc] x)) && lc > rc -> (UBFIZ [arm64BFAuxInt(lc-rc, 64-lc)] x) +(SRLconst [rc] (SLLconst [lc] x)) && lc > rc -> (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) // ubfx // (x >> sc) & ac (ANDconst [ac] (SRLconst [sc] x)) && isARM64BFMask(sc, ac, 0) - -> (UBFX [arm64BFAuxInt(sc, arm64BFWidth(ac, 0))] x) -(MOVWUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFX [arm64BFAuxInt(sc, 32)] x) -(MOVHUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFX [arm64BFAuxInt(sc, 16)] x) -(MOVBUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFX [arm64BFAuxInt(sc, 8)] x) + -> (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) +(MOVWUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<32-1, 0) -> (UBFX [armBFAuxInt(sc, 32)] x) +(MOVHUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<16-1, 0) -> (UBFX [armBFAuxInt(sc, 16)] x) +(MOVBUreg (SRLconst [sc] x)) && isARM64BFMask(sc, 1<<8-1, 0) -> (UBFX [armBFAuxInt(sc, 8)] x) // (x & ac) >> sc (SRLconst [sc] (ANDconst [ac] x)) && isARM64BFMask(sc, ac, sc) - -> (UBFX [arm64BFAuxInt(sc, arm64BFWidth(ac, sc))] x) + -> (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) (SRLconst [sc] (MOVWUreg x)) && isARM64BFMask(sc, 1<<32-1, sc) - -> (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) (SRLconst [sc] (MOVHUreg x)) && isARM64BFMask(sc, 1<<16-1, sc) - -> (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) (SRLconst [sc] (MOVBUreg x)) && isARM64BFMask(sc, 1<<8-1, sc) - -> (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + -> (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) // (x << lc) >> rc -(SRLconst [rc] (SLLconst [lc] x)) && lc < rc -> (UBFX [arm64BFAuxInt(rc-lc, 64-rc)] x) +(SRLconst [rc] (SLLconst [lc] x)) && lc < rc -> (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) // ubfiz/ubfx combinations: merge shifts into bitfield ops (SRLconst [sc] (UBFX [bfc] x)) && sc < getARM64BFwidth(bfc) - -> (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + -> (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) (UBFX [bfc] (SRLconst [sc] x)) && sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - -> (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) + -> (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) (SLLconst [sc] (UBFIZ [bfc] x)) && sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - -> (UBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) + -> (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) (UBFIZ [bfc] (SLLconst [sc] x)) && sc < getARM64BFwidth(bfc) - -> (UBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + -> (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) // ((x << c1) >> c2) >> c3 (SRLconst [sc] (UBFIZ [bfc] x)) && sc == getARM64BFlsb(bfc) -> (ANDconst [1< (UBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + -> (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) (SRLconst [sc] (UBFIZ [bfc] x)) && sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (UBFX [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + -> (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) // ((x << c1) << c2) >> c3 (UBFX [bfc] (SLLconst [sc] x)) && sc == getARM64BFlsb(bfc) -> (ANDconst [1< (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + -> (UBFX [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) (UBFX [bfc] (SLLconst [sc] x)) && sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - -> (UBFIZ [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + -> (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) // bfi (OR (UBFIZ [bfc] x) (ANDconst [ac] y)) @@ -1910,7 +1910,7 @@ -> (BFI [bfc] y x) (ORshiftRL [rc] (ANDconst [ac] x) (SLLconst [lc] y)) && lc > rc && ac == ^((1< (BFI [arm64BFAuxInt(lc-rc, 64-lc)] x y) + -> (BFI [armBFAuxInt(lc-rc, 64-lc)] x y) // bfxil (OR (UBFX [bfc] x) (ANDconst [ac] y)) && ac == ^(1< (BFXIL [bfc] y x) @@ -2560,23 +2560,23 @@ && x.Uses == 1 && clobber(x) -> (MOVHstoreidx ptr idx w mem) -(MOVBstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) +(MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) && x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) -> (MOVHstore [i-1] {s} ptr0 w mem) -(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) +(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) && x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) -> (MOVHstoreidx ptr1 idx1 w mem) -(MOVBstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) +(MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) && x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) -> (MOVHstore [i-1] {s} ptr0 w mem) -(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) +(MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) && x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) @@ -2653,18 +2653,18 @@ && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) -> (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) -(MOVHstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) +(MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) && x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) -> (MOVWstore [i-2] {s} ptr0 w mem) -(MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) +(MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) && x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) -> (MOVWstoreidx ptr1 idx1 w mem) -(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) +(MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) && x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) @@ -2792,9 +2792,9 @@ && clobber(x6) -> (MOVDstoreidx ptr0 idx0 (REV w) mem) (MOVBstore [i] {s} ptr w - x0:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 24)] w) - x1:(MOVBstore [i-2] {s} ptr (UBFX [arm64BFAuxInt(16, 16)] w) - x2:(MOVBstore [i-3] {s} ptr (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) + x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w) + x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem)))) && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 @@ -2803,9 +2803,9 @@ && clobber(x2) -> (MOVWstore [i-3] {s} ptr (REVW w) mem) (MOVBstore [3] {s} p w - x0:(MOVBstore [2] {s} p (UBFX [arm64BFAuxInt(8, 24)] w) - x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [arm64BFAuxInt(16, 16)] w) - x2:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) + x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w) + x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem)))) && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 @@ -2817,9 +2817,9 @@ && clobber(x2) -> (MOVWstoreidx ptr0 idx0 (REVW w) mem) (MOVBstoreidx ptr (ADDconst [3] idx) w - x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [arm64BFAuxInt(8, 24)] w) - x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(16, 16)] w) - x2:(MOVBstoreidx ptr idx (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) + x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) + x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem)))) && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 @@ -2828,9 +2828,9 @@ && clobber(x2) -> (MOVWstoreidx ptr idx (REVW w) mem) (MOVBstoreidx ptr idx w - x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(8, 24)] w) - x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [arm64BFAuxInt(16, 16)] w) - x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w) + x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w) + x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem)))) && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 @@ -2898,21 +2898,21 @@ && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) -> (MOVHstoreidx ptr0 idx0 (REV16W w) mem) -(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 8)] w) mem)) +(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem)) && x.Uses == 1 && clobber(x) -> (MOVHstore [i-1] {s} ptr (REV16W w) mem) -(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(8, 8)] w) mem)) +(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem)) && x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) -> (MOVHstoreidx ptr0 idx0 (REV16W w) mem) -(MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [arm64BFAuxInt(8, 8)] w) mem)) +(MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem)) && x.Uses == 1 && clobber(x) -> (MOVHstoreidx ptr idx (REV16W w) mem) -(MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(8, 8)] w) mem)) +(MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem)) && x.Uses == 1 && clobber(x) -> (MOVHstoreidx ptr idx w mem) @@ -2926,11 +2926,11 @@ && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) -> (MOVHstoreidx ptr0 idx0 (REV16W w) mem) -(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 24)] w) mem)) +(MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem)) && x.Uses == 1 && clobber(x) -> (MOVHstore [i-1] {s} ptr (REV16W w) mem) -(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(8, 24)] w) mem)) +(MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem)) && x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) diff --git a/src/cmd/compile/internal/ssa/gen/ARMOps.go b/src/cmd/compile/internal/ssa/gen/ARMOps.go index 4e2b0c5a5d..86d7e5f8ec 100644 --- a/src/cmd/compile/internal/ssa/gen/ARMOps.go +++ b/src/cmd/compile/internal/ssa/gen/ARMOps.go @@ -207,9 +207,10 @@ func init() { {name: "NEGD", argLength: 1, reg: fp11, asm: "NEGD"}, // -arg0, float64 {name: "SQRTD", argLength: 1, reg: fp11, asm: "SQRTD"}, // sqrt(arg0), float64 - {name: "CLZ", argLength: 1, reg: gp11, asm: "CLZ"}, // count leading zero - {name: "REV", argLength: 1, reg: gp11, asm: "REV"}, // reverse byte order - {name: "RBIT", argLength: 1, reg: gp11, asm: "RBIT"}, // reverse bit order + {name: "CLZ", argLength: 1, reg: gp11, asm: "CLZ"}, // count leading zero + {name: "REV", argLength: 1, reg: gp11, asm: "REV"}, // reverse byte order + {name: "REV16", argLength: 1, reg: gp11, asm: "REV16"}, // reverse byte order in 16-bit halfwords + {name: "RBIT", argLength: 1, reg: gp11, asm: "RBIT"}, // reverse bit order // shifts {name: "SLL", argLength: 2, reg: gp21, asm: "SLL"}, // arg0 << arg1, shift amount is mod 256 diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 948bbdc32a..5fcc64f460 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -907,6 +907,7 @@ const ( OpARMSQRTD OpARMCLZ OpARMREV + OpARMREV16 OpARMRBIT OpARMSLL OpARMSLLconst @@ -12036,6 +12037,19 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "REV16", + argLen: 1, + asm: arm.AREV16, + reg: regInfo{ + inputs: []inputInfo{ + {0, 22527}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 g R12 R14 + }, + outputs: []outputInfo{ + {0, 21503}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R12 R14 + }, + }, + }, { name: "RBIT", argLen: 1, diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 9c9de750b2..dbbb33c171 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1037,13 +1037,13 @@ func isInlinableMemmove(dst, src *Value, sz int64, c *Config) bool { return false } -// encodes the lsb and width for arm64 bitfield ops into the expected auxInt format. -func arm64BFAuxInt(lsb, width int64) int64 { +// encodes the lsb and width for arm(64) bitfield ops into the expected auxInt format. +func armBFAuxInt(lsb, width int64) int64 { if lsb < 0 || lsb > 63 { - panic("ARM64 bit field lsb constant out of range") + panic("ARM(64) bit field lsb constant out of range") } if width < 1 || width > 64 { - panic("ARM64 bit field width constant out of range") + panic("ARM(64) bit field width constant out of range") } return width | lsb<<8 } diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 4fc7fdfbe1..c190ef779c 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -2933,6 +2933,8 @@ func rewriteValueARM_OpARMADDconst_0(v *Value) bool { func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (ADDshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ADDconst [c] (SLLconst x [d])) @@ -2992,6 +2994,74 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (ADDshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMBFXU { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != armBFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } + // match: (ADDshiftLL [8] (SRLconst [24] (SLLconst [16] x)) x) + // cond: objabi.GOARM>=6 + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMSRLconst { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != 24 { + break + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARMSLLconst { + break + } + if v_0_0.AuxInt != 16 { + break + } + x := v_0_0.Args[0] + if x != v.Args[1] { + break + } + if !(objabi.GOARM >= 6) { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } return false } func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { @@ -11952,6 +12022,8 @@ func rewriteValueARM_OpARMORconst_0(v *Value) bool { func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (ORshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ORconst [c] (SLLconst x [d])) @@ -12011,6 +12083,74 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (ORshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMBFXU { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != armBFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } + // match: (ORshiftLL [8] (SRLconst [24] (SLLconst [16] x)) x) + // cond: objabi.GOARM>=6 + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMSRLconst { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != 24 { + break + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARMSLLconst { + break + } + if v_0_0.AuxInt != 16 { + break + } + x := v_0_0.Args[0] + if x != v.Args[1] { + break + } + if !(objabi.GOARM >= 6) { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } // match: (ORshiftLL x y:(SLLconst x [c]) [d]) // cond: c==d // result: y @@ -17230,6 +17370,8 @@ func rewriteValueARM_OpARMXORconst_0(v *Value) bool { func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { b := v.Block _ = b + typ := &b.Func.Config.Types + _ = typ // match: (XORshiftLL (MOVWconst [c]) x [d]) // cond: // result: (XORconst [c] (SLLconst x [d])) @@ -17289,6 +17431,74 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { v.AddArg(x) return true } + // match: (XORshiftLL [8] (BFXU [armBFAuxInt(8, 8)] x) x) + // cond: + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMBFXU { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != armBFAuxInt(8, 8) { + break + } + x := v_0.Args[0] + if x != v.Args[1] { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } + // match: (XORshiftLL [8] (SRLconst [24] (SLLconst [16] x)) x) + // cond: objabi.GOARM>=6 + // result: (REV16 x) + for { + if v.Type != typ.UInt16 { + break + } + if v.AuxInt != 8 { + break + } + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpARMSRLconst { + break + } + if v_0.Type != typ.UInt16 { + break + } + if v_0.AuxInt != 24 { + break + } + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpARMSLLconst { + break + } + if v_0_0.AuxInt != 16 { + break + } + x := v_0_0.Args[0] + if x != v.Args[1] { + break + } + if !(objabi.GOARM >= 6) { + break + } + v.reset(OpARMREV16) + v.AddArg(x) + return true + } // match: (XORshiftLL x (SLLconst x [c]) [d]) // cond: c==d // result: (MOVWconst [0]) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 45801a4003..25246ce5e5 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -2366,7 +2366,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { return true } // match: (ADDshiftLL [c] (UBFX [bfc] x) x) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (RORWconst [32-c] x) for { t := v.Type @@ -2381,7 +2381,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { if x != v.Args[1] { break } - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64RORWconst) @@ -2389,7 +2389,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { v.AddArg(x) return true } - // match: (ADDshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // match: (ADDshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) // cond: // result: (REV16W x) for { @@ -2407,7 +2407,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { if v_0.Type != typ.UInt16 { break } - if v_0.AuxInt != arm64BFAuxInt(8, 8) { + if v_0.AuxInt != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -2440,7 +2440,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { return true } // match: (ADDshiftLL [c] (UBFX [bfc] x) x2) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (EXTRWconst [32-c] x2 x) for { t := v.Type @@ -2453,7 +2453,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { bfc := v_0.AuxInt x := v_0.Args[0] x2 := v.Args[1] - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) @@ -2912,7 +2912,7 @@ func rewriteValueARM64_OpARM64ANDconst_0(v *Value) bool { } // match: (ANDconst [ac] (SLLconst [sc] x)) // cond: isARM64BFMask(sc, ac, sc) - // result: (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(ac, sc))] x) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { ac := v.AuxInt v_0 := v.Args[0] @@ -2925,13 +2925,13 @@ func rewriteValueARM64_OpARM64ANDconst_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(ac, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) v.AddArg(x) return true } // match: (ANDconst [ac] (SRLconst [sc] x)) // cond: isARM64BFMask(sc, ac, 0) - // result: (UBFX [arm64BFAuxInt(sc, arm64BFWidth(ac, 0))] x) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, 0))] x) for { ac := v.AuxInt v_0 := v.Args[0] @@ -2944,7 +2944,7 @@ func rewriteValueARM64_OpARM64ANDconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(ac, 0)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, 0)) v.AddArg(x) return true } @@ -9130,7 +9130,7 @@ func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { } // match: (MOVBUreg (SLLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<8-1, sc) - // result: (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -9142,13 +9142,13 @@ func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) v.AddArg(x) return true } // match: (MOVBUreg (SRLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<8-1, 0) - // result: (UBFX [arm64BFAuxInt(sc, 8)] x) + // result: (UBFX [armBFAuxInt(sc, 8)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { @@ -9160,7 +9160,7 @@ func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, 8) + v.AuxInt = armBFAuxInt(sc, 8) v.AddArg(x) return true } @@ -9383,7 +9383,7 @@ func rewriteValueARM64_OpARM64MOVBreg_0(v *Value) bool { } // match: (MOVBreg (SLLconst [lc] x)) // cond: lc < 8 - // result: (SBFIZ [arm64BFAuxInt(lc, 8-lc)] x) + // result: (SBFIZ [armBFAuxInt(lc, 8-lc)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -9395,7 +9395,7 @@ func rewriteValueARM64_OpARM64MOVBreg_0(v *Value) bool { break } v.reset(OpARM64SBFIZ) - v.AuxInt = arm64BFAuxInt(lc, 8-lc) + v.AuxInt = armBFAuxInt(lc, 8-lc) v.AddArg(x) return true } @@ -9731,7 +9731,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { @@ -9743,7 +9743,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(8, 8) { + if v_1.AuxInt != armBFAuxInt(8, 8) { break } w := v_1.Args[0] @@ -9774,7 +9774,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 8)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVHstoreidx ptr1 idx1 w mem) for { @@ -9794,7 +9794,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(8, 8) { + if v_1.AuxInt != armBFAuxInt(8, 8) { break } w := v_1.Args[0] @@ -9819,7 +9819,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) + // match: (MOVBstore [i] {s} ptr0 (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstore [i-1] {s} ptr1 w mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w mem) for { @@ -9831,7 +9831,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(8, 24) { + if v_1.AuxInt != armBFAuxInt(8, 24) { break } w := v_1.Args[0] @@ -9862,7 +9862,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) + // match: (MOVBstore [1] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(8, 24)] w) x:(MOVBstoreidx ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVHstoreidx ptr1 idx1 w mem) for { @@ -9882,7 +9882,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(8, 24) { + if v_1.AuxInt != armBFAuxInt(8, 24) { break } w := v_1.Args[0] @@ -10694,7 +10694,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 24)] w) x1:(MOVBstore [i-2] {s} ptr (UBFX [arm64BFAuxInt(16, 16)] w) x2:(MOVBstore [i-3] {s} ptr (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [i-2] {s} ptr (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstore [i-3] {s} ptr (UBFX [armBFAuxInt(24, 8)] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) for { @@ -10721,7 +10721,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x0_1.Op != OpARM64UBFX { break } - if x0_1.AuxInt != arm64BFAuxInt(8, 24) { + if x0_1.AuxInt != armBFAuxInt(8, 24) { break } if w != x0_1.Args[0] { @@ -10745,7 +10745,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x1_1.Op != OpARM64UBFX { break } - if x1_1.AuxInt != arm64BFAuxInt(16, 16) { + if x1_1.AuxInt != armBFAuxInt(16, 16) { break } if w != x1_1.Args[0] { @@ -10769,7 +10769,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2_1.Op != OpARM64UBFX { break } - if x2_1.AuxInt != arm64BFAuxInt(24, 8) { + if x2_1.AuxInt != armBFAuxInt(24, 8) { break } if w != x2_1.Args[0] { @@ -10789,7 +10789,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [arm64BFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [arm64BFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + // match: (MOVBstore [3] {s} p w x0:(MOVBstore [2] {s} p (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstore [1] {s} p1:(ADD ptr1 idx1) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(24, 8)] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstoreidx ptr0 idx0 (REVW w) mem) for { @@ -10818,7 +10818,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x0_1.Op != OpARM64UBFX { break } - if x0_1.AuxInt != arm64BFAuxInt(8, 24) { + if x0_1.AuxInt != armBFAuxInt(8, 24) { break } if w != x0_1.Args[0] { @@ -10846,7 +10846,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x1_1.Op != OpARM64UBFX { break } - if x1_1.AuxInt != arm64BFAuxInt(16, 16) { + if x1_1.AuxInt != armBFAuxInt(16, 16) { break } if w != x1_1.Args[0] { @@ -10863,7 +10863,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2_2.Op != OpARM64UBFX { break } - if x2_2.AuxInt != arm64BFAuxInt(24, 8) { + if x2_2.AuxInt != armBFAuxInt(24, 8) { break } if w != x2_2.Args[0] { @@ -11381,7 +11381,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 8)] w) mem)) + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 8)] w) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { @@ -11408,7 +11408,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x_1.Op != OpARM64UBFX { break } - if x_1.AuxInt != arm64BFAuxInt(8, 8) { + if x_1.AuxInt != armBFAuxInt(8, 8) { break } if w != x_1.Args[0] { @@ -11428,7 +11428,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(8, 8)] w) mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 8)] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { @@ -11456,7 +11456,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x_2.Op != OpARM64UBFX { break } - if x_2.AuxInt != arm64BFAuxInt(8, 8) { + if x_2.AuxInt != armBFAuxInt(8, 8) { break } if w != x_2.Args[0] { @@ -11577,7 +11577,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [arm64BFAuxInt(8, 24)] w) mem)) + // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (UBFX [armBFAuxInt(8, 24)] w) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) for { @@ -11604,7 +11604,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x_1.Op != OpARM64UBFX { break } - if x_1.AuxInt != arm64BFAuxInt(8, 24) { + if x_1.AuxInt != armBFAuxInt(8, 24) { break } if w != x_1.Args[0] { @@ -11624,7 +11624,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [arm64BFAuxInt(8, 24)] w) mem)) + // match: (MOVBstore [1] {s} (ADD ptr1 idx1) w x:(MOVBstoreidx ptr0 idx0 (UBFX [armBFAuxInt(8, 24)] w) mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVHstoreidx ptr0 idx0 (REV16W w) mem) for { @@ -11652,7 +11652,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x_2.Op != OpARM64UBFX { break } - if x_2.AuxInt != arm64BFAuxInt(8, 24) { + if x_2.AuxInt != armBFAuxInt(8, 24) { break } if w != x_2.Args[0] { @@ -12014,7 +12014,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { b := v.Block _ = b - // match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [arm64BFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + // match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstoreidx ptr idx (REVW w) mem) for { @@ -12051,7 +12051,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x0_2.Op != OpARM64UBFX { break } - if x0_2.AuxInt != arm64BFAuxInt(8, 24) { + if x0_2.AuxInt != armBFAuxInt(8, 24) { break } if w != x0_2.Args[0] { @@ -12079,7 +12079,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x1_2.Op != OpARM64UBFX { break } - if x1_2.AuxInt != arm64BFAuxInt(16, 16) { + if x1_2.AuxInt != armBFAuxInt(16, 16) { break } if w != x1_2.Args[0] { @@ -12100,7 +12100,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x2_2.Op != OpARM64UBFX { break } - if x2_2.AuxInt != arm64BFAuxInt(24, 8) { + if x2_2.AuxInt != armBFAuxInt(24, 8) { break } if w != x2_2.Args[0] { @@ -12119,7 +12119,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx w x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [arm64BFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [arm64BFAuxInt(24, 8)] w) mem)))) + // match: (MOVBstoreidx ptr idx w x0:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr (ADDconst [3] idx) (UBFX [armBFAuxInt(24, 8)] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstoreidx ptr idx w mem) for { @@ -12149,7 +12149,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x0_2.Op != OpARM64UBFX { break } - if x0_2.AuxInt != arm64BFAuxInt(8, 24) { + if x0_2.AuxInt != armBFAuxInt(8, 24) { break } if w != x0_2.Args[0] { @@ -12177,7 +12177,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x1_2.Op != OpARM64UBFX { break } - if x1_2.AuxInt != arm64BFAuxInt(16, 16) { + if x1_2.AuxInt != armBFAuxInt(16, 16) { break } if w != x1_2.Args[0] { @@ -12205,7 +12205,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x2_2.Op != OpARM64UBFX { break } - if x2_2.AuxInt != arm64BFAuxInt(24, 8) { + if x2_2.AuxInt != armBFAuxInt(24, 8) { break } if w != x2_2.Args[0] { @@ -12222,7 +12222,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [arm64BFAuxInt(8, 8)] w) mem)) + // match: (MOVBstoreidx ptr (ADDconst [1] idx) w x:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(8, 8)] w) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx ptr idx (REV16W w) mem) for { @@ -12252,7 +12252,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x_2.Op != OpARM64UBFX { break } - if x_2.AuxInt != arm64BFAuxInt(8, 8) { + if x_2.AuxInt != armBFAuxInt(8, 8) { break } if w != x_2.Args[0] { @@ -12271,7 +12271,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [arm64BFAuxInt(8, 8)] w) mem)) + // match: (MOVBstoreidx ptr idx w x:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(8, 8)] w) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstoreidx ptr idx w mem) for { @@ -12301,7 +12301,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x_2.Op != OpARM64UBFX { break } - if x_2.AuxInt != arm64BFAuxInt(8, 8) { + if x_2.AuxInt != armBFAuxInt(8, 8) { break } if w != x_2.Args[0] { @@ -13941,7 +13941,7 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { } // match: (MOVHUreg (SLLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<16-1, sc) - // result: (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -13953,7 +13953,7 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) v.AddArg(x) return true } @@ -13962,7 +13962,7 @@ func rewriteValueARM64_OpARM64MOVHUreg_0(v *Value) bool { func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { // match: (MOVHUreg (SRLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<16-1, 0) - // result: (UBFX [arm64BFAuxInt(sc, 16)] x) + // result: (UBFX [armBFAuxInt(sc, 16)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { @@ -13974,7 +13974,7 @@ func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, 16) + v.AuxInt = armBFAuxInt(sc, 16) v.AddArg(x) return true } @@ -14423,7 +14423,7 @@ func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { } // match: (MOVHreg (SLLconst [lc] x)) // cond: lc < 16 - // result: (SBFIZ [arm64BFAuxInt(lc, 16-lc)] x) + // result: (SBFIZ [armBFAuxInt(lc, 16-lc)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -14435,7 +14435,7 @@ func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { break } v.reset(OpARM64SBFIZ) - v.AuxInt = arm64BFAuxInt(lc, 16-lc) + v.AuxInt = armBFAuxInt(lc, 16-lc) v.AddArg(x) return true } @@ -14809,7 +14809,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [i] {s} ptr0 (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) + // match: (MOVHstore [i] {s} ptr0 (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstore [i-2] {s} ptr1 w mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x) // result: (MOVWstore [i-2] {s} ptr0 w mem) for { @@ -14821,7 +14821,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(16, 16) { + if v_1.AuxInt != armBFAuxInt(16, 16) { break } w := v_1.Args[0] @@ -14852,7 +14852,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) + // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVWstoreidx ptr1 idx1 w mem) for { @@ -14872,7 +14872,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(16, 16) { + if v_1.AuxInt != armBFAuxInt(16, 16) { break } w := v_1.Args[0] @@ -14897,7 +14897,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { v.AddArg(mem) return true } - // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [arm64BFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) + // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (UBFX [armBFAuxInt(16, 16)] w) x:(MOVHstoreidx2 ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w mem) for { @@ -14920,7 +14920,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_1.Op != OpARM64UBFX { break } - if v_1.AuxInt != arm64BFAuxInt(16, 16) { + if v_1.AuxInt != armBFAuxInt(16, 16) { break } w := v_1.Args[0] @@ -16610,7 +16610,7 @@ func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { } // match: (MOVWUreg (SLLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<32-1, sc) - // result: (UBFIZ [arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + // result: (UBFIZ [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -16622,13 +16622,13 @@ func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) v.AddArg(x) return true } // match: (MOVWUreg (SRLconst [sc] x)) // cond: isARM64BFMask(sc, 1<<32-1, 0) - // result: (UBFX [arm64BFAuxInt(sc, 32)] x) + // result: (UBFX [armBFAuxInt(sc, 32)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { @@ -16640,7 +16640,7 @@ func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, 32) + v.AuxInt = armBFAuxInt(sc, 32) v.AddArg(x) return true } @@ -17168,7 +17168,7 @@ func rewriteValueARM64_OpARM64MOVWreg_10(v *Value) bool { } // match: (MOVWreg (SLLconst [lc] x)) // cond: lc < 32 - // result: (SBFIZ [arm64BFAuxInt(lc, 32-lc)] x) + // result: (SBFIZ [armBFAuxInt(lc, 32-lc)] x) for { v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { @@ -17180,7 +17180,7 @@ func rewriteValueARM64_OpARM64MOVWreg_10(v *Value) bool { break } v.reset(OpARM64SBFIZ) - v.AuxInt = arm64BFAuxInt(lc, 32-lc) + v.AuxInt = armBFAuxInt(lc, 32-lc) v.AddArg(x) return true } @@ -26620,7 +26620,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { return true } // match: (ORshiftLL [c] (UBFX [bfc] x) x) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (RORWconst [32-c] x) for { t := v.Type @@ -26635,7 +26635,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { if x != v.Args[1] { break } - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64RORWconst) @@ -26643,7 +26643,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { v.AddArg(x) return true } - // match: (ORshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // match: (ORshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) // cond: // result: (REV16W x) for { @@ -26661,7 +26661,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { if v_0.Type != typ.UInt16 { break } - if v_0.AuxInt != arm64BFAuxInt(8, 8) { + if v_0.AuxInt != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -26694,7 +26694,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { return true } // match: (ORshiftLL [c] (UBFX [bfc] x) x2) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (EXTRWconst [32-c] x2 x) for { t := v.Type @@ -26707,7 +26707,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { bfc := v_0.AuxInt x := v_0.Args[0] x2 := v.Args[1] - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) @@ -28883,7 +28883,7 @@ func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { } // match: (ORshiftRL [rc] (ANDconst [ac] x) (SLLconst [lc] y)) // cond: lc > rc && ac == ^((1< rc - // result: (SBFIZ [arm64BFAuxInt(lc-rc, 64-lc)] x) + // result: (SBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29146,13 +29146,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFIZ) - v.AuxInt = arm64BFAuxInt(lc-rc, 64-lc) + v.AuxInt = armBFAuxInt(lc-rc, 64-lc) v.AddArg(x) return true } // match: (SRAconst [rc] (SLLconst [lc] x)) // cond: lc <= rc - // result: (SBFX [arm64BFAuxInt(rc-lc, 64-rc)] x) + // result: (SBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29165,13 +29165,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = arm64BFAuxInt(rc-lc, 64-rc) + v.AuxInt = armBFAuxInt(rc-lc, 64-rc) v.AddArg(x) return true } // match: (SRAconst [rc] (MOVWreg x)) // cond: rc < 32 - // result: (SBFX [arm64BFAuxInt(rc, 32-rc)] x) + // result: (SBFX [armBFAuxInt(rc, 32-rc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29183,13 +29183,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = arm64BFAuxInt(rc, 32-rc) + v.AuxInt = armBFAuxInt(rc, 32-rc) v.AddArg(x) return true } // match: (SRAconst [rc] (MOVHreg x)) // cond: rc < 16 - // result: (SBFX [arm64BFAuxInt(rc, 16-rc)] x) + // result: (SBFX [armBFAuxInt(rc, 16-rc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29201,13 +29201,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = arm64BFAuxInt(rc, 16-rc) + v.AuxInt = armBFAuxInt(rc, 16-rc) v.AddArg(x) return true } // match: (SRAconst [rc] (MOVBreg x)) // cond: rc < 8 - // result: (SBFX [arm64BFAuxInt(rc, 8-rc)] x) + // result: (SBFX [armBFAuxInt(rc, 8-rc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29219,13 +29219,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = arm64BFAuxInt(rc, 8-rc) + v.AuxInt = armBFAuxInt(rc, 8-rc) v.AddArg(x) return true } // match: (SRAconst [sc] (SBFIZ [bfc] x)) // cond: sc < getARM64BFlsb(bfc) - // result: (SBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + // result: (SBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29238,13 +29238,13 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFIZ) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) v.AddArg(x) return true } // match: (SRAconst [sc] (SBFIZ [bfc] x)) // cond: sc >= getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (SBFX [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // result: (SBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29257,7 +29257,7 @@ func rewriteValueARM64_OpARM64SRAconst_0(v *Value) bool { break } v.reset(OpARM64SBFX) - v.AuxInt = arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } @@ -29320,7 +29320,7 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { } // match: (SRLconst [rc] (SLLconst [lc] x)) // cond: lc > rc - // result: (UBFIZ [arm64BFAuxInt(lc-rc, 64-lc)] x) + // result: (UBFIZ [armBFAuxInt(lc-rc, 64-lc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29333,13 +29333,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(lc-rc, 64-lc) + v.AuxInt = armBFAuxInt(lc-rc, 64-lc) v.AddArg(x) return true } // match: (SRLconst [sc] (ANDconst [ac] x)) // cond: isARM64BFMask(sc, ac, sc) - // result: (UBFX [arm64BFAuxInt(sc, arm64BFWidth(ac, sc))] x) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(ac, sc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29352,13 +29352,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(ac, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(ac, sc)) v.AddArg(x) return true } // match: (SRLconst [sc] (MOVWUreg x)) // cond: isARM64BFMask(sc, 1<<32-1, sc) - // result: (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29370,13 +29370,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<32-1, sc)) v.AddArg(x) return true } // match: (SRLconst [sc] (MOVHUreg x)) // cond: isARM64BFMask(sc, 1<<16-1, sc) - // result: (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29388,13 +29388,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<16-1, sc)) v.AddArg(x) return true } // match: (SRLconst [sc] (MOVBUreg x)) // cond: isARM64BFMask(sc, 1<<8-1, sc) - // result: (UBFX [arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) + // result: (UBFX [armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29406,13 +29406,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) + v.AuxInt = armBFAuxInt(sc, arm64BFWidth(1<<8-1, sc)) v.AddArg(x) return true } // match: (SRLconst [rc] (SLLconst [lc] x)) // cond: lc < rc - // result: (UBFX [arm64BFAuxInt(rc-lc, 64-rc)] x) + // result: (UBFX [armBFAuxInt(rc-lc, 64-rc)] x) for { rc := v.AuxInt v_0 := v.Args[0] @@ -29425,13 +29425,13 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(rc-lc, 64-rc) + v.AuxInt = armBFAuxInt(rc-lc, 64-rc) v.AddArg(x) return true } // match: (SRLconst [sc] (UBFX [bfc] x)) // cond: sc < getARM64BFwidth(bfc) - // result: (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29444,7 +29444,7 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } @@ -29472,7 +29472,7 @@ func rewriteValueARM64_OpARM64SRLconst_0(v *Value) bool { func rewriteValueARM64_OpARM64SRLconst_10(v *Value) bool { // match: (SRLconst [sc] (UBFIZ [bfc] x)) // cond: sc < getARM64BFlsb(bfc) - // result: (UBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29485,13 +29485,13 @@ func rewriteValueARM64_OpARM64SRLconst_10(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) v.AddArg(x) return true } // match: (SRLconst [sc] (UBFIZ [bfc] x)) // cond: sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFX [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // result: (UBFX [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { sc := v.AuxInt v_0 := v.Args[0] @@ -29504,7 +29504,7 @@ func rewriteValueARM64_OpARM64SRLconst_10(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } @@ -30449,7 +30449,7 @@ func rewriteValueARM64_OpARM64TSTshiftRL_0(v *Value) bool { func rewriteValueARM64_OpARM64UBFIZ_0(v *Value) bool { // match: (UBFIZ [bfc] (SLLconst [sc] x)) // cond: sc < getARM64BFwidth(bfc) - // result: (UBFIZ [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) + // result: (UBFIZ [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc)] x) for { bfc := v.AuxInt v_0 := v.Args[0] @@ -30462,7 +30462,7 @@ func rewriteValueARM64_OpARM64UBFIZ_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } @@ -30471,7 +30471,7 @@ func rewriteValueARM64_OpARM64UBFIZ_0(v *Value) bool { func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { // match: (UBFX [bfc] (SRLconst [sc] x)) // cond: sc+getARM64BFwidth(bfc)+getARM64BFlsb(bfc) < 64 - // result: (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) + // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc))] x) for { bfc := v.AuxInt v_0 := v.Args[0] @@ -30484,7 +30484,7 @@ func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)+sc, getARM64BFwidth(bfc)) v.AddArg(x) return true } @@ -30509,7 +30509,7 @@ func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { } // match: (UBFX [bfc] (SLLconst [sc] x)) // cond: sc < getARM64BFlsb(bfc) - // result: (UBFX [arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) + // result: (UBFX [armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc))] x) for { bfc := v.AuxInt v_0 := v.Args[0] @@ -30522,13 +30522,13 @@ func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { break } v.reset(OpARM64UBFX) - v.AuxInt = arm64BFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) + v.AuxInt = armBFAuxInt(getARM64BFlsb(bfc)-sc, getARM64BFwidth(bfc)) v.AddArg(x) return true } // match: (UBFX [bfc] (SLLconst [sc] x)) // cond: sc > getARM64BFlsb(bfc) && sc < getARM64BFlsb(bfc)+getARM64BFwidth(bfc) - // result: (UBFIZ [arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) + // result: (UBFIZ [armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc)] x) for { bfc := v.AuxInt v_0 := v.Args[0] @@ -30541,7 +30541,7 @@ func rewriteValueARM64_OpARM64UBFX_0(v *Value) bool { break } v.reset(OpARM64UBFIZ) - v.AuxInt = arm64BFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) + v.AuxInt = armBFAuxInt(sc-getARM64BFlsb(bfc), getARM64BFlsb(bfc)+getARM64BFwidth(bfc)-sc) v.AddArg(x) return true } @@ -32099,7 +32099,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { return true } // match: (XORshiftLL [c] (UBFX [bfc] x) x) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (RORWconst [32-c] x) for { t := v.Type @@ -32114,7 +32114,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { if x != v.Args[1] { break } - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64RORWconst) @@ -32122,7 +32122,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { v.AddArg(x) return true } - // match: (XORshiftLL [8] (UBFX [arm64BFAuxInt(8, 8)] x) x) + // match: (XORshiftLL [8] (UBFX [armBFAuxInt(8, 8)] x) x) // cond: // result: (REV16W x) for { @@ -32140,7 +32140,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { if v_0.Type != typ.UInt16 { break } - if v_0.AuxInt != arm64BFAuxInt(8, 8) { + if v_0.AuxInt != armBFAuxInt(8, 8) { break } x := v_0.Args[0] @@ -32173,7 +32173,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { return true } // match: (XORshiftLL [c] (UBFX [bfc] x) x2) - // cond: c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c) + // cond: c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c) // result: (EXTRWconst [32-c] x2 x) for { t := v.Type @@ -32186,7 +32186,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { bfc := v_0.AuxInt x := v_0.Args[0] x2 := v.Args[1] - if !(c < 32 && t.Size() == 4 && bfc == arm64BFAuxInt(32-c, c)) { + if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } v.reset(OpARM64EXTRWconst) diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index cc3c91eb0d..09939bb6be 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -171,6 +171,9 @@ func ReverseBytes32(n uint32) uint32 { func ReverseBytes16(n uint16) uint16 { // amd64:"ROLW" // arm64:"REV16W",-"UBFX",-"ORR" + // arm/5:"SLL","SRL","ORR" + // arm/6:"REV16" + // arm/7:"REV16" return bits.ReverseBytes16(n) } -- GitLab From 4e2b0dda8cbab104635d59ef5a68e4342250094b Mon Sep 17 00:00:00 2001 From: erifan01 Date: Thu, 3 Jan 2019 09:25:06 +0000 Subject: [PATCH 0336/1679] cmd/compile: eliminate unnecessary type conversions in TrailingZeros(16|8) for arm64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL eliminates unnecessary type conversion operations: OpZeroExt16to64 and OpZeroExt8to64. If the input argrument is a nonzero value, then ORconst operation can also be eliminated. Benchmarks: name old time/op new time/op delta TrailingZeros-8 2.75ns ± 0% 2.75ns ± 0% ~ (all equal) TrailingZeros8-8 3.49ns ± 1% 2.93ns ± 0% -16.00% (p=0.000 n=10+10) TrailingZeros16-8 3.49ns ± 1% 2.93ns ± 0% -16.05% (p=0.000 n=9+10) TrailingZeros32-8 2.67ns ± 1% 2.68ns ± 1% ~ (p=0.468 n=10+10) TrailingZeros64-8 2.67ns ± 1% 2.65ns ± 0% -0.62% (p=0.022 n=10+9) code: func f16(x uint) { z = bits.TrailingZeros16(uint16(x)) } Before: "".f16 STEXT size=48 args=0x8 locals=0x0 leaf 0x0000 00000 (test.go:7) TEXT "".f16(SB), LEAF|NOFRAME|ABIInternal, $0-8 0x0000 00000 (test.go:7) FUNCDATA ZR, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) PCDATA $2, ZR 0x0000 00000 (test.go:7) PCDATA ZR, ZR 0x0000 00000 (test.go:7) MOVD "".x(FP), R0 0x0004 00004 (test.go:7) MOVHU R0, R0 0x0008 00008 (test.go:7) ORR $65536, R0, R0 0x000c 00012 (test.go:7) RBIT R0, R0 0x0010 00016 (test.go:7) CLZ R0, R0 0x0014 00020 (test.go:7) MOVD R0, "".z(SB) 0x0020 00032 (test.go:7) RET (R30) This line of code is unnecessary: 0x0004 00004 (test.go:7) MOVHU R0, R0 After: "".f16 STEXT size=32 args=0x8 locals=0x0 leaf 0x0000 00000 (test.go:7) TEXT "".f16(SB), LEAF|NOFRAME|ABIInternal, $0-8 0x0000 00000 (test.go:7) FUNCDATA ZR, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB) 0x0000 00000 (test.go:7) PCDATA $2, ZR 0x0000 00000 (test.go:7) PCDATA ZR, ZR 0x0000 00000 (test.go:7) MOVD "".x(FP), R0 0x0004 00004 (test.go:7) ORR $65536, R0, R0 0x0008 00008 (test.go:7) RBITW R0, R0 0x000c 00012 (test.go:7) CLZW R0, R0 0x0010 00016 (test.go:7) MOVD R0, "".z(SB) 0x001c 00028 (test.go:7) RET (R30) The situation of TrailingZeros8 is similar to TrailingZeros16. Change-Id: I473bdca06be8460a0be87abbae6fe640017e4c9d Reviewed-on: https://go-review.googlesource.com/c/go/+/156999 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/ssa.go | 8 +-- src/cmd/compile/internal/ssa/gen/ARM64.rules | 4 ++ src/cmd/compile/internal/ssa/rewriteARM64.go | 74 ++++++++++++++++++++ test/codegen/mathbits.go | 7 ++ 4 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index e03988dac2..3f4355c387 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3290,7 +3290,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz16, types.Types[TINT], args[0]) }, - sys.AMD64) + sys.AMD64, sys.ARM64) addF("math/bits", "TrailingZeros16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt16to64, types.Types[TUINT64], args[0]) @@ -3298,7 +3298,7 @@ func init() { y := s.newValue2(ssa.OpOr64, types.Types[TUINT64], x, c) return s.newValue1(ssa.OpCtz64, types.Types[TINT], y) }, - sys.ARM64, sys.S390X, sys.PPC64) + sys.S390X, sys.PPC64) addF("math/bits", "TrailingZeros8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt8to32, types.Types[TUINT32], args[0]) @@ -3311,7 +3311,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz8, types.Types[TINT], args[0]) }, - sys.AMD64) + sys.AMD64, sys.ARM64) addF("math/bits", "TrailingZeros8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt8to64, types.Types[TUINT64], args[0]) @@ -3319,7 +3319,7 @@ func init() { y := s.newValue2(ssa.OpOr64, types.Types[TUINT64], x, c) return s.newValue1(ssa.OpCtz64, types.Types[TINT], y) }, - sys.ARM64, sys.S390X) + sys.S390X) alias("math/bits", "ReverseBytes64", "runtime/internal/sys", "Bswap64", all...) alias("math/bits", "ReverseBytes32", "runtime/internal/sys", "Bswap32", all...) // ReverseBytes inlines correctly, no need to intrinsify it. diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index ca123d7375..6e0420983a 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -97,9 +97,13 @@ (Ctz64NonZero x) -> (Ctz64 x) (Ctz32NonZero x) -> (Ctz32 x) +(Ctz16NonZero x) -> (Ctz32 x) +(Ctz8NonZero x) -> (Ctz32 x) (Ctz64 x) -> (CLZ (RBIT x)) (Ctz32 x) -> (CLZW (RBITW x)) +(Ctz16 x) -> (CLZW (RBITW (ORconst [0x10000] x))) +(Ctz8 x) -> (CLZW (RBITW (ORconst [0x100] x))) (PopCount64 x) -> (FMOVDfpgp (VUADDLV (VCNT (FMOVDgpfp x)))) (PopCount32 x) -> (FMOVDfpgp (VUADDLV (VCNT (FMOVDgpfp (ZeroExt32to64 x))))) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 25246ce5e5..24f392a43e 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -473,6 +473,10 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpConstBool_0(v) case OpConstNil: return rewriteValueARM64_OpConstNil_0(v) + case OpCtz16: + return rewriteValueARM64_OpCtz16_0(v) + case OpCtz16NonZero: + return rewriteValueARM64_OpCtz16NonZero_0(v) case OpCtz32: return rewriteValueARM64_OpCtz32_0(v) case OpCtz32NonZero: @@ -481,6 +485,10 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpCtz64_0(v) case OpCtz64NonZero: return rewriteValueARM64_OpCtz64NonZero_0(v) + case OpCtz8: + return rewriteValueARM64_OpCtz8_0(v) + case OpCtz8NonZero: + return rewriteValueARM64_OpCtz8NonZero_0(v) case OpCvt32Fto32: return rewriteValueARM64_OpCvt32Fto32_0(v) case OpCvt32Fto32U: @@ -33182,6 +33190,39 @@ func rewriteValueARM64_OpConstNil_0(v *Value) bool { return true } } +func rewriteValueARM64_OpCtz16_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (Ctz16 x) + // cond: + // result: (CLZW (RBITW (ORconst [0x10000] x))) + for { + t := v.Type + x := v.Args[0] + v.reset(OpARM64CLZW) + v.Type = t + v0 := b.NewValue0(v.Pos, OpARM64RBITW, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpARM64ORconst, typ.UInt32) + v1.AuxInt = 0x10000 + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true + } +} +func rewriteValueARM64_OpCtz16NonZero_0(v *Value) bool { + // match: (Ctz16NonZero x) + // cond: + // result: (Ctz32 x) + for { + x := v.Args[0] + v.reset(OpCtz32) + v.AddArg(x) + return true + } +} func rewriteValueARM64_OpCtz32_0(v *Value) bool { b := v.Block _ = b @@ -33236,6 +33277,39 @@ func rewriteValueARM64_OpCtz64NonZero_0(v *Value) bool { return true } } +func rewriteValueARM64_OpCtz8_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (Ctz8 x) + // cond: + // result: (CLZW (RBITW (ORconst [0x100] x))) + for { + t := v.Type + x := v.Args[0] + v.reset(OpARM64CLZW) + v.Type = t + v0 := b.NewValue0(v.Pos, OpARM64RBITW, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpARM64ORconst, typ.UInt32) + v1.AuxInt = 0x100 + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true + } +} +func rewriteValueARM64_OpCtz8NonZero_0(v *Value) bool { + // match: (Ctz8NonZero x) + // cond: + // result: (Ctz32 x) + for { + x := v.Args[0] + v.reset(OpCtz32) + v.AddArg(x) + return true + } +} func rewriteValueARM64_OpCvt32Fto32_0(v *Value) bool { // match: (Cvt32Fto32 x) // cond: diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 09939bb6be..c77b66c3f7 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -242,6 +242,7 @@ func RotateLeftVariable32(n uint32, m int) uint32 { func TrailingZeros(n uint) int { // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" + // arm64:"RBIT","CLZ" // s390x:"FLOGR" // ppc64:"ANDN","POPCNTD" // ppc64le:"ANDN","POPCNTD" @@ -250,6 +251,7 @@ func TrailingZeros(n uint) int { func TrailingZeros64(n uint64) int { // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" + // arm64:"RBIT","CLZ" // s390x:"FLOGR" // ppc64:"ANDN","POPCNTD" // ppc64le:"ANDN","POPCNTD" @@ -258,6 +260,7 @@ func TrailingZeros64(n uint64) int { func TrailingZeros32(n uint32) int { // amd64:"BTSQ\\t\\$32","BSFQ" + // arm64:"RBITW","CLZW" // s390x:"FLOGR","MOVWZ" // ppc64:"ANDN","POPCNTW" // ppc64le:"ANDN","POPCNTW" @@ -266,6 +269,7 @@ func TrailingZeros32(n uint32) int { func TrailingZeros16(n uint16) int { // amd64:"BSFL","BTSL\\t\\$16" + // arm64:"ORR\t\\$65536","RBITW","CLZW",-"MOVHU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$65536" // ppc64:"POPCNTD","OR\\t\\$65536" // ppc64le:"POPCNTD","OR\\t\\$65536" @@ -274,6 +278,7 @@ func TrailingZeros16(n uint16) int { func TrailingZeros8(n uint8) int { // amd64:"BSFL","BTSL\\t\\$8" + // arm64:"ORR\t\\$256","RBITW","CLZW",-"MOVBU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$256" return bits.TrailingZeros8(n) } @@ -314,6 +319,7 @@ func IterateBits16(n uint16) int { i := 0 for n != 0 { // amd64:"BSFL",-"BTSL" + // arm64:"RBITW","CLZW",-"ORR" i += bits.TrailingZeros16(n) n &= n - 1 } @@ -324,6 +330,7 @@ func IterateBits8(n uint8) int { i := 0 for n != 0 { // amd64:"BSFL",-"BTSL" + // arm64:"RBITW","CLZW",-"ORR" i += bits.TrailingZeros8(n) n &= n - 1 } -- GitLab From 91170d7201253616620c78ce961a89a55fb9e732 Mon Sep 17 00:00:00 2001 From: royeo Date: Fri, 25 Jan 2019 05:51:25 +0000 Subject: [PATCH 0337/1679] log: make the name of error clearer Change-Id: Id0398b51336cc74f2172d9b8e18cb1dcb520b9a0 GitHub-Last-Rev: b5cf80bf9d7f79eab1a398ad3c03f3b424aafdf1 GitHub-Pull-Request: golang/go#29931 Reviewed-on: https://go-review.googlesource.com/c/go/+/159537 Reviewed-by: Emmanuel Odeke Reviewed-by: Brad Fitzpatrick Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/log/log_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/log/log_test.go b/src/log/log_test.go index adc15e7e8e..b79251877e 100644 --- a/src/log/log_test.go +++ b/src/log/log_test.go @@ -61,9 +61,9 @@ func testPrint(t *testing.T, flag int, prefix string, pattern string, useFormat line := buf.String() line = line[0 : len(line)-1] pattern = "^" + pattern + "hello 23 world$" - matched, err4 := regexp.MatchString(pattern, line) - if err4 != nil { - t.Fatal("pattern did not compile:", err4) + matched, err := regexp.MatchString(pattern, line) + if err != nil { + t.Fatal("pattern did not compile:", err) } if !matched { t.Errorf("log output should match %q is %q", pattern, line) -- GitLab From 9a7101586041a5ad69d65d845db78fb0e249cac6 Mon Sep 17 00:00:00 2001 From: Komu Wairagu Date: Thu, 7 Mar 2019 17:53:18 +0000 Subject: [PATCH 0338/1679] runtime/pprof: document labels bug Currently only CPU profile utilizes tag information. This change documents that fact Updates #23458 Change-Id: Ic893e85f63af0da9100d8cba7d3328c294e8c810 GitHub-Last-Rev: be99a126296493b3085aa5ade91895b36fb1de73 GitHub-Pull-Request: golang/go#27198 Reviewed-on: https://go-review.googlesource.com/c/go/+/131275 Reviewed-by: Hyang-Ah Hana Kim --- src/runtime/pprof/label.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/runtime/pprof/label.go b/src/runtime/pprof/label.go index 35647ee3ce..20f9cdbae6 100644 --- a/src/runtime/pprof/label.go +++ b/src/runtime/pprof/label.go @@ -54,6 +54,8 @@ func WithLabels(ctx context.Context, labels LabelSet) context.Context { // Labels takes an even number of strings representing key-value pairs // and makes a LabelSet containing them. // A label overwrites a prior label with the same key. +// Currently only CPU profile utilizes labels information. +// See https://golang.org/issue/23458 for details. func Labels(args ...string) LabelSet { if len(args)%2 != 0 { panic("uneven number of arguments to pprof.Labels") -- GitLab From 6ebfbbaadf391048ffe987404497d5d6409ff1ef Mon Sep 17 00:00:00 2001 From: Chris Marchesi Date: Thu, 7 Mar 2019 20:01:21 +0000 Subject: [PATCH 0339/1679] net/http: let Transport request body writes use sendfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit net.TCPConn has the ability to send data out using system calls such as sendfile when the source data comes from an *os.File. However, the way that I/O has been laid out in the transport means that the File is actually wrapped behind two outer io.Readers, and as such the TCP stack cannot properly type-assert the reader, ensuring that it falls back to genericReadFrom. This commit does the following: * Removes transferBodyReader and moves its functionality to a new doBodyCopy helper. This is not an io.Reader implementation, but no functionality is lost this way, and it allows us to unwrap one layer from the body. * The second layer of the body is unwrapped if the original reader was wrapped with ioutil.NopCloser, which is what NewRequest wraps the body in if it's not a ReadCloser on its own. The unwrap operation passes through the existing body if there's no nopCloser. Note that this depends on change https://golang.org/cl/163737 to properly function, as the lack of ReaderFrom implementation otherwise means that this functionality is essentially walled off. Benchmarks between this commit and https://golang.org/cl/163862, incorporating https://golang.org/cl/163737: linux/amd64: name old time/op new time/op delta FileAndServer_1KB/NoTLS-4 53.2µs ± 0% 53.3µs ± 0% ~ (p=0.075 n=10+9) FileAndServer_1KB/TLS-4 61.2µs ± 0% 60.7µs ± 0% -0.77% (p=0.000 n=10+9) FileAndServer_16MB/NoTLS-4 25.3ms ± 5% 3.8ms ± 6% -84.95% (p=0.000 n=10+10) FileAndServer_16MB/TLS-4 33.2ms ± 2% 13.4ms ± 2% -59.57% (p=0.000 n=10+10) FileAndServer_64MB/NoTLS-4 106ms ± 4% 16ms ± 2% -84.45% (p=0.000 n=10+10) FileAndServer_64MB/TLS-4 129ms ± 1% 54ms ± 3% -58.32% (p=0.000 n=8+10) name old speed new speed delta FileAndServer_1KB/NoTLS-4 19.2MB/s ± 0% 19.2MB/s ± 0% ~ (p=0.095 n=10+9) FileAndServer_1KB/TLS-4 16.7MB/s ± 0% 16.9MB/s ± 0% +0.78% (p=0.000 n=10+9) FileAndServer_16MB/NoTLS-4 664MB/s ± 5% 4415MB/s ± 6% +565.27% (p=0.000 n=10+10) FileAndServer_16MB/TLS-4 505MB/s ± 2% 1250MB/s ± 2% +147.32% (p=0.000 n=10+10) FileAndServer_64MB/NoTLS-4 636MB/s ± 4% 4090MB/s ± 2% +542.81% (p=0.000 n=10+10) FileAndServer_64MB/TLS-4 522MB/s ± 1% 1251MB/s ± 3% +139.95% (p=0.000 n=8+10) darwin/amd64: name old time/op new time/op delta FileAndServer_1KB/NoTLS-8 93.0µs ± 5% 96.6µs ±11% ~ (p=0.190 n=10+10) FileAndServer_1KB/TLS-8 105µs ± 7% 100µs ± 5% -5.14% (p=0.002 n=10+9) FileAndServer_16MB/NoTLS-8 87.5ms ±19% 10.0ms ± 6% -88.57% (p=0.000 n=10+10) FileAndServer_16MB/TLS-8 52.7ms ±11% 17.4ms ± 5% -66.92% (p=0.000 n=10+10) FileAndServer_64MB/NoTLS-8 363ms ±54% 39ms ± 7% -89.24% (p=0.000 n=10+10) FileAndServer_64MB/TLS-8 209ms ±13% 73ms ± 5% -65.37% (p=0.000 n=9+10) name old speed new speed delta FileAndServer_1KB/NoTLS-8 11.0MB/s ± 5% 10.6MB/s ±10% ~ (p=0.184 n=10+10) FileAndServer_1KB/TLS-8 9.75MB/s ± 7% 10.27MB/s ± 5% +5.26% (p=0.003 n=10+9) FileAndServer_16MB/NoTLS-8 194MB/s ±16% 1680MB/s ± 6% +767.83% (p=0.000 n=10+10) FileAndServer_16MB/TLS-8 319MB/s ±10% 963MB/s ± 4% +201.36% (p=0.000 n=10+10) FileAndServer_64MB/NoTLS-8 180MB/s ±31% 1719MB/s ± 7% +853.61% (p=0.000 n=9+10) FileAndServer_64MB/TLS-8 321MB/s ±12% 926MB/s ± 5% +188.24% (p=0.000 n=9+10) Updates #30377. Change-Id: I631a73cea75371dfbb418c9cd487c4aa35e73fcd GitHub-Last-Rev: 4a77dd1b80140274bf3ed20ad7465ff3cc06febf GitHub-Pull-Request: golang/go#30378 Reviewed-on: https://go-review.googlesource.com/c/go/+/163599 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Emmanuel Odeke --- src/net/http/transfer.go | 53 ++++++---- src/net/http/transfer_test.go | 188 ++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+), 19 deletions(-) diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go index e8a93e9137..7d73dc4fc0 100644 --- a/src/net/http/transfer.go +++ b/src/net/http/transfer.go @@ -53,19 +53,6 @@ func (br *byteReader) Read(p []byte) (n int, err error) { return 1, io.EOF } -// transferBodyReader is an io.Reader that reads from tw.Body -// and records any non-EOF error in tw.bodyReadError. -// It is exactly 1 pointer wide to avoid allocations into interfaces. -type transferBodyReader struct{ tw *transferWriter } - -func (br transferBodyReader) Read(p []byte) (n int, err error) { - n, err = br.tw.Body.Read(p) - if err != nil && err != io.EOF { - br.tw.bodyReadError = err - } - return -} - // transferWriter inspects the fields of a user-supplied Request or Response, // sanitizes them without changing the user object and provides methods for // writing the respective header, body and trailer in wire format. @@ -347,15 +334,18 @@ func (t *transferWriter) writeBody(w io.Writer) error { var err error var ncopy int64 - // Write body + // Write body. We "unwrap" the body first if it was wrapped in a + // nopCloser. This is to ensure that we can take advantage of + // OS-level optimizations in the event that the body is an + // *os.File. if t.Body != nil { - var body = transferBodyReader{t} + var body = t.unwrapBody() if chunked(t.TransferEncoding) { if bw, ok := w.(*bufio.Writer); ok && !t.IsResponse { w = &internal.FlushAfterChunkWriter{Writer: bw} } cw := internal.NewChunkedWriter(w) - _, err = io.Copy(cw, body) + _, err = t.doBodyCopy(cw, body) if err == nil { err = cw.Close() } @@ -364,14 +354,14 @@ func (t *transferWriter) writeBody(w io.Writer) error { if t.Method == "CONNECT" { dst = bufioFlushWriter{dst} } - ncopy, err = io.Copy(dst, body) + ncopy, err = t.doBodyCopy(dst, body) } else { - ncopy, err = io.Copy(w, io.LimitReader(body, t.ContentLength)) + ncopy, err = t.doBodyCopy(w, io.LimitReader(body, t.ContentLength)) if err != nil { return err } var nextra int64 - nextra, err = io.Copy(ioutil.Discard, body) + nextra, err = t.doBodyCopy(ioutil.Discard, body) ncopy += nextra } if err != nil { @@ -402,6 +392,31 @@ func (t *transferWriter) writeBody(w io.Writer) error { return err } +// doBodyCopy wraps a copy operation, with any resulting error also +// being saved in bodyReadError. +// +// This function is only intended for use in writeBody. +func (t *transferWriter) doBodyCopy(dst io.Writer, src io.Reader) (n int64, err error) { + n, err = io.Copy(dst, src) + if err != nil && err != io.EOF { + t.bodyReadError = err + } + return +} + +// unwrapBodyReader unwraps the body's inner reader if it's a +// nopCloser. This is to ensure that body writes sourced from local +// files (*os.File types) are properly optimized. +// +// This function is only intended for use in writeBody. +func (t *transferWriter) unwrapBody() io.Reader { + if reflect.TypeOf(t.Body) == nopCloserType { + return reflect.ValueOf(t.Body).Field(0).Interface().(io.Reader) + } + + return t.Body +} + type transferReader struct { // Input Header Header diff --git a/src/net/http/transfer_test.go b/src/net/http/transfer_test.go index 993ea4ef18..aa465d0600 100644 --- a/src/net/http/transfer_test.go +++ b/src/net/http/transfer_test.go @@ -7,8 +7,12 @@ package http import ( "bufio" "bytes" + "crypto/rand" + "fmt" "io" "io/ioutil" + "os" + "reflect" "strings" "testing" ) @@ -90,3 +94,187 @@ func TestDetectInMemoryReaders(t *testing.T) { } } } + +type mockTransferWriter struct { + CalledReader io.Reader + WriteCalled bool +} + +var _ io.ReaderFrom = (*mockTransferWriter)(nil) + +func (w *mockTransferWriter) ReadFrom(r io.Reader) (int64, error) { + w.CalledReader = r + return io.Copy(ioutil.Discard, r) +} + +func (w *mockTransferWriter) Write(p []byte) (int, error) { + w.WriteCalled = true + return ioutil.Discard.Write(p) +} + +func TestTransferWriterWriteBodyReaderTypes(t *testing.T) { + fileType := reflect.TypeOf(&os.File{}) + bufferType := reflect.TypeOf(&bytes.Buffer{}) + + nBytes := int64(1 << 10) + newFileFunc := func() (r io.Reader, done func(), err error) { + f, err := ioutil.TempFile("", "net-http-newfilefunc") + if err != nil { + return nil, nil, err + } + + // Write some bytes to the file to enable reading. + if _, err := io.CopyN(f, rand.Reader, nBytes); err != nil { + return nil, nil, fmt.Errorf("failed to write data to file: %v", err) + } + if _, err := f.Seek(0, 0); err != nil { + return nil, nil, fmt.Errorf("failed to seek to front: %v", err) + } + + done = func() { + f.Close() + os.Remove(f.Name()) + } + + return f, done, nil + } + + newBufferFunc := func() (io.Reader, func(), error) { + return bytes.NewBuffer(make([]byte, nBytes)), func() {}, nil + } + + cases := []struct { + name string + bodyFunc func() (io.Reader, func(), error) + method string + contentLength int64 + transferEncoding []string + limitedReader bool + expectedReader reflect.Type + expectedWrite bool + }{ + { + name: "file, non-chunked, size set", + bodyFunc: newFileFunc, + method: "PUT", + contentLength: nBytes, + limitedReader: true, + expectedReader: fileType, + }, + { + name: "file, non-chunked, size set, nopCloser wrapped", + method: "PUT", + bodyFunc: func() (io.Reader, func(), error) { + r, cleanup, err := newFileFunc() + return ioutil.NopCloser(r), cleanup, err + }, + contentLength: nBytes, + limitedReader: true, + expectedReader: fileType, + }, + { + name: "file, non-chunked, negative size", + method: "PUT", + bodyFunc: newFileFunc, + contentLength: -1, + expectedReader: fileType, + }, + { + name: "file, non-chunked, CONNECT, negative size", + method: "CONNECT", + bodyFunc: newFileFunc, + contentLength: -1, + expectedReader: fileType, + }, + { + name: "file, chunked", + method: "PUT", + bodyFunc: newFileFunc, + transferEncoding: []string{"chunked"}, + expectedWrite: true, + }, + { + name: "buffer, non-chunked, size set", + bodyFunc: newBufferFunc, + method: "PUT", + contentLength: nBytes, + limitedReader: true, + expectedReader: bufferType, + }, + { + name: "buffer, non-chunked, size set, nopCloser wrapped", + method: "PUT", + bodyFunc: func() (io.Reader, func(), error) { + r, cleanup, err := newBufferFunc() + return ioutil.NopCloser(r), cleanup, err + }, + contentLength: nBytes, + limitedReader: true, + expectedReader: bufferType, + }, + { + name: "buffer, non-chunked, negative size", + method: "PUT", + bodyFunc: newBufferFunc, + contentLength: -1, + expectedWrite: true, + }, + { + name: "buffer, non-chunked, CONNECT, negative size", + method: "CONNECT", + bodyFunc: newBufferFunc, + contentLength: -1, + expectedWrite: true, + }, + { + name: "buffer, chunked", + method: "PUT", + bodyFunc: newBufferFunc, + transferEncoding: []string{"chunked"}, + expectedWrite: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + body, cleanup, err := tc.bodyFunc() + if err != nil { + t.Fatal(err) + } + defer cleanup() + + mw := &mockTransferWriter{} + tw := &transferWriter{ + Body: body, + ContentLength: tc.contentLength, + TransferEncoding: tc.transferEncoding, + } + + if err := tw.writeBody(mw); err != nil { + t.Fatal(err) + } + + if tc.expectedReader != nil { + if mw.CalledReader == nil { + t.Fatal("did not call ReadFrom") + } + + var actualReader reflect.Type + lr, ok := mw.CalledReader.(*io.LimitedReader) + if ok && tc.limitedReader { + actualReader = reflect.TypeOf(lr.R) + } else { + actualReader = reflect.TypeOf(mw.CalledReader) + } + + if tc.expectedReader != actualReader { + t.Fatalf("got reader %T want %T", actualReader, tc.expectedReader) + } + } + + if tc.expectedWrite && !mw.WriteCalled { + t.Fatal("did not invoke Write") + } + }) + } +} -- GitLab From 2dd066d4a7ab6eb7828cbba8cb29158dcaedcc78 Mon Sep 17 00:00:00 2001 From: Raul Silvera Date: Fri, 18 Jan 2019 19:06:16 +0000 Subject: [PATCH 0340/1679] test: improve test coverage for heap sampling Update the test in test/heapsampling.go to more thoroughly validate heap sampling. Lower the sampling rate on the test to ensure allocations both smaller and larger than the sampling rate are tested. Tighten up the validation check to a 10% difference between the unsampled and correct value. Because of the nature of random sampling, it is possible that the unsampled value fluctuates over that range. To avoid flakes, run the experiment three times and only report an issue if the same location consistently falls out of range on all experiments. This tests the sampling fix in cl/158337. Change-Id: I54a709e5c75827b8b1c2d87cdfb425ab09759677 GitHub-Last-Rev: 7c04f126034f9e323efc220c896d75e7984ffd39 GitHub-Pull-Request: golang/go#26944 Reviewed-on: https://go-review.googlesource.com/c/go/+/129117 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- test/heapsampling.go | 228 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 182 insertions(+), 46 deletions(-) diff --git a/test/heapsampling.go b/test/heapsampling.go index c00b866680..cc72832ab4 100644 --- a/test/heapsampling.go +++ b/test/heapsampling.go @@ -18,38 +18,113 @@ var a16 *[16]byte var a512 *[512]byte var a256 *[256]byte var a1k *[1024]byte -var a64k *[64 * 1024]byte +var a16k *[16 * 1024]byte +var a17k *[17 * 1024]byte +var a18k *[18 * 1024]byte -// This test checks that heap sampling produces reasonable -// results. Note that heap sampling uses randomization, so the results -// vary for run to run. This test only checks that the resulting -// values appear reasonable. +// This test checks that heap sampling produces reasonable results. +// Note that heap sampling uses randomization, so the results vary for +// run to run. To avoid flakes, this test performs multiple +// experiments and only complains if all of them consistently fail. func main() { - const countInterleaved = 10000 - allocInterleaved(countInterleaved) - checkAllocations(getMemProfileRecords(), "main.allocInterleaved", countInterleaved, []int64{256 * 1024, 1024, 256 * 1024, 512, 256 * 1024, 256}) + // Sample at 16K instead of default 512K to exercise sampling more heavily. + runtime.MemProfileRate = 16 * 1024 - const count = 100000 - alloc(count) - checkAllocations(getMemProfileRecords(), "main.alloc", count, []int64{1024, 512, 256}) + if err := testInterleavedAllocations(); err != nil { + panic(err.Error()) + } + if err := testSmallAllocations(); err != nil { + panic(err.Error()) + } +} + +// Repeatedly exercise a set of allocations and check that the heap +// profile collected by the runtime unsamples to a reasonable +// value. Because sampling is based on randomization, there can be +// significant variability on the unsampled data. To account for that, +// the testcase allows for a 10% margin of error, but only fails if it +// consistently fails across three experiments, avoiding flakes. +func testInterleavedAllocations() error { + const iters = 100000 + // Sizes of the allocations performed by each experiment. + frames := []string{"main.allocInterleaved1", "main.allocInterleaved2", "main.allocInterleaved3"} + + // Pass if at least one of three experiments has no errors. Use a separate + // function for each experiment to identify each experiment in the profile. + allocInterleaved1(iters) + if checkAllocations(getMemProfileRecords(), frames[0:1], iters, allocInterleavedSizes) == nil { + // Passed on first try, report no error. + return nil + } + allocInterleaved2(iters) + if checkAllocations(getMemProfileRecords(), frames[0:2], iters, allocInterleavedSizes) == nil { + // Passed on second try, report no error. + return nil + } + allocInterleaved3(iters) + // If it fails a third time, we may be onto something. + return checkAllocations(getMemProfileRecords(), frames[0:3], iters, allocInterleavedSizes) } -// allocInterleaved stress-tests the heap sampling logic by -// interleaving large and small allocations. +var allocInterleavedSizes = []int64{17 * 1024, 1024, 18 * 1024, 512, 16 * 1024, 256} + +// allocInterleaved stress-tests the heap sampling logic by interleaving large and small allocations. func allocInterleaved(n int) { for i := 0; i < n; i++ { // Test verification depends on these lines being contiguous. - a64k = new([64 * 1024]byte) + a17k = new([17 * 1024]byte) a1k = new([1024]byte) - a64k = new([64 * 1024]byte) + a18k = new([18 * 1024]byte) a512 = new([512]byte) - a64k = new([64 * 1024]byte) + a16k = new([16 * 1024]byte) a256 = new([256]byte) + // Test verification depends on these lines being contiguous. + } +} + +func allocInterleaved1(n int) { + allocInterleaved(n) +} + +func allocInterleaved2(n int) { + allocInterleaved(n) +} + +func allocInterleaved3(n int) { + allocInterleaved(n) +} + +// Repeatedly exercise a set of allocations and check that the heap +// profile collected by the runtime unsamples to a reasonable +// value. Because sampling is based on randomization, there can be +// significant variability on the unsampled data. To account for that, +// the testcase allows for a 10% margin of error, but only fails if it +// consistently fails across three experiments, avoiding flakes. +func testSmallAllocations() error { + const iters = 100000 + // Sizes of the allocations performed by each experiment. + sizes := []int64{1024, 512, 256} + frames := []string{"main.allocSmall1", "main.allocSmall2", "main.allocSmall3"} + + // Pass if at least one of three experiments has no errors. Use a separate + // function for each experiment to identify each experiment in the profile. + allocSmall1(iters) + if checkAllocations(getMemProfileRecords(), frames[0:1], iters, sizes) == nil { + // Passed on first try, report no error. + return nil + } + allocSmall2(iters) + if checkAllocations(getMemProfileRecords(), frames[0:2], iters, sizes) == nil { + // Passed on second try, report no error. + return nil } + allocSmall3(iters) + // If it fails a third time, we may be onto something. + return checkAllocations(getMemProfileRecords(), frames[0:3], iters, sizes) } -// alloc performs only small allocations for sanity testing. -func alloc(n int) { +// allocSmall performs only small allocations for sanity testing. +func allocSmall(n int) { for i := 0; i < n; i++ { // Test verification depends on these lines being contiguous. a1k = new([1024]byte) @@ -58,36 +133,86 @@ func alloc(n int) { } } +// Three separate instances of testing to avoid flakes. Will report an error +// only if they all consistently report failures. +func allocSmall1(n int) { + allocSmall(n) +} + +func allocSmall2(n int) { + allocSmall(n) +} + +func allocSmall3(n int) { + allocSmall(n) +} + // checkAllocations validates that the profile records collected for // the named function are consistent with count contiguous allocations // of the specified sizes. -func checkAllocations(records []runtime.MemProfileRecord, fname string, count int64, size []int64) { - a := allocObjects(records, fname) - firstLine := 0 - for ln := range a { +// Check multiple functions and only report consistent failures across +// multiple tests. +// Look only at samples that include the named frames, and group the +// allocations by their line number. All these allocations are done from +// the same leaf function, so their line numbers are the same. +func checkAllocations(records []runtime.MemProfileRecord, frames []string, count int64, size []int64) error { + objectsPerLine := map[int][]int64{} + bytesPerLine := map[int][]int64{} + totalCount := []int64{} + // Compute the line number of the first allocation. All the + // allocations are from the same leaf, so pick the first one. + var firstLine int + for ln := range allocObjects(records, frames[0]) { if firstLine == 0 || firstLine > ln { firstLine = ln } } - var totalcount int64 + for _, frame := range frames { + var objectCount int64 + a := allocObjects(records, frame) + for s := range size { + // Allocations of size size[s] should be on line firstLine + s. + ln := firstLine + s + objectsPerLine[ln] = append(objectsPerLine[ln], a[ln].objects) + bytesPerLine[ln] = append(bytesPerLine[ln], a[ln].bytes) + objectCount += a[ln].objects + } + totalCount = append(totalCount, objectCount) + } for i, w := range size { ln := firstLine + i - s := a[ln] - checkValue(fname, ln, "objects", count, s.objects) - checkValue(fname, ln, "bytes", count*w, s.bytes) - totalcount += s.objects - } - // Check the total number of allocations, to ensure some sampling occurred. - if totalwant := count * int64(len(size)); totalcount <= 0 || totalcount > totalwant*1024 { - panic(fmt.Sprintf("%s want total count > 0 && <= %d, got %d", fname, totalwant*1024, totalcount)) + if err := checkValue(frames[0], ln, "objects", count, objectsPerLine[ln]); err != nil { + return err + } + if err := checkValue(frames[0], ln, "bytes", count*w, bytesPerLine[ln]); err != nil { + return err + } } + return checkValue(frames[0], 0, "total", count*int64(len(size)), totalCount) } -// checkValue checks an unsampled value against a range. -func checkValue(fname string, ln int, name string, want, got int64) { - if got < 0 || got > 1024*want { - panic(fmt.Sprintf("%s:%d want %s >= 0 && <= %d, got %d", fname, ln, name, 1024*want, got)) +// checkValue checks an unsampled value against its expected value. +// Given that this is a sampled value, it will be unexact and will change +// from run to run. Only report it as a failure if all the values land +// consistently far from the expected value. +func checkValue(fname string, ln int, testName string, want int64, got []int64) error { + if got == nil { + return fmt.Errorf("Unexpected empty result") + } + min, max := got[0], got[0] + for _, g := range got[1:] { + if g < min { + min = g + } + if g > max { + max = g + } + } + margin := want / 10 // 10% margin. + if min > want+margin || max < want-margin { + return fmt.Errorf("%s:%d want %s in [%d: %d], got %v", fname, ln, testName, want-margin, want+margin, got) } + return nil } func getMemProfileRecords() []runtime.MemProfileRecord { @@ -124,24 +249,35 @@ type allocStat struct { bytes, objects int64 } -// allocObjects examines the profile records for the named function -// and returns the allocation stats aggregated by source line number. +// allocObjects examines the profile records for samples including the +// named function and returns the allocation stats aggregated by +// source line number of the allocation (at the leaf frame). func allocObjects(records []runtime.MemProfileRecord, function string) map[int]allocStat { a := make(map[int]allocStat) for _, r := range records { + var pcs []uintptr for _, s := range r.Stack0 { if s == 0 { break } - if f := runtime.FuncForPC(s); f != nil { - name := f.Name() - _, line := f.FileLine(s) - if name == function { - allocStat := a[line] - allocStat.bytes += r.AllocBytes - allocStat.objects += r.AllocObjects - a[line] = allocStat - } + pcs = append(pcs, s) + } + frames := runtime.CallersFrames(pcs) + line := 0 + for { + frame, more := frames.Next() + name := frame.Function + if line == 0 { + line = frame.Line + } + if name == function { + allocStat := a[line] + allocStat.bytes += r.AllocBytes + allocStat.objects += r.AllocObjects + a[line] = allocStat + } + if !more { + break } } } -- GitLab From 129c6e449694f14fd27dfed03f7a0c95847ec366 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 6 Mar 2019 17:14:27 -0800 Subject: [PATCH 0341/1679] math/big: support new octal prefixes 0o and 0O This CL extends the various SetString and Parse methods for Ints, Rats, and Floats to accept the new octal prefixes. The main change is in natconv.go, all other changes are documentation and test updates. Finally, this CL also fixes TestRatSetString which silently dropped certain failures. Updates #12711. Change-Id: I5ee5879e25013ba1e6eda93ff280915f25ab5d55 Reviewed-on: https://go-review.googlesource.com/c/go/+/165898 Reviewed-by: Emmanuel Odeke --- src/math/big/floatconv.go | 14 ++++--- src/math/big/floatconv_test.go | 21 ++++++++++ src/math/big/intconv.go | 5 ++- src/math/big/intconv_test.go | 7 ++++ src/math/big/natconv.go | 76 ++++++++++++++++------------------ src/math/big/natconv_test.go | 33 ++++++++++++--- src/math/big/ratconv_test.go | 14 +++++-- 7 files changed, 112 insertions(+), 58 deletions(-) diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go index 5cc9e24f4c..b685b2a288 100644 --- a/src/math/big/floatconv.go +++ b/src/math/big/floatconv.go @@ -97,6 +97,8 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) { fallthrough // 10**e == 5**e * 2**e case 2: exp2 += d + case 8: + exp2 += d * 3 // octal digits are 3 bits each case 16: exp2 += d * 4 // hexadecimal digits are 4 bits each default: @@ -222,21 +224,21 @@ func (z *Float) pow5(n uint64) *Float { // // number = [ sign ] [ prefix ] mantissa [ exponent ] | infinity . // sign = "+" | "-" . -// prefix = "0" ( "x" | "X" | "b" | "B" ) . +// prefix = "0" ( "b" | "B" | "o" | "O" | "x" | "X" ) . // mantissa = digits | digits "." [ digits ] | "." digits . // exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // digits = digit { digit } . // digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // infinity = [ sign ] ( "inf" | "Inf" ) . // -// The base argument must be 0, 2, 10, or 16. Providing an invalid base +// The base argument must be 0, 2, 8, 10, or 16. Providing an invalid base // argument will lead to a run-time panic. // // For base 0, the number prefix determines the actual base: A prefix of -// "0x" or "0X" selects base 16, and a "0b" or "0B" prefix selects -// base 2; otherwise, the actual base is 10 and no prefix is accepted. -// The octal prefix "0" is not supported (a leading "0" is simply -// considered a "0"). +// ``0b'' or ``0B'' selects base 2, ``0o'' or ``0O'' selects base 8, and +// ``0x'' or ``0X'' selects base 16. Otherwise, the actual base is 10 and +// no prefix is accepted. The octal prefix "0" is not supported (a leading +// "0" is simply considered a "0"). // // A "p" or "P" exponent indicates a binary (rather then decimal) exponent; // for instance "0x1.fffffffffffffp1023" (using base 0) represents the diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index 768943b902..f32dd8928b 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -110,6 +110,27 @@ func TestFloatSetFloat64String(t *testing.T) { {"0b0.01p2", 1}, {"0b0.01P+2", 1}, + // octal mantissa, decimal exponent + {"0o0", 0}, + {"-0o0", -zero_}, + {"0o0e+10", 0}, + {"-0o0e-10", -zero_}, + {"0o12", 10}, + {"0O12E2", 1000}, + {"0o.4", 0.5}, + {"0o.01", 0.015625}, + {"0o.01e3", 15.625}, + + // octal mantissa, binary exponent + {"0o0p+10", 0}, + {"-0o0p-10", -zero_}, + {"0o.12p6", 10}, + {"0o4p-3", 0.5}, + {"0o0014p-6", 0.1875}, + {"0o.001p9", 1}, + {"0o0.01p7", 2}, + {"0O0.01P+2", 0.0625}, + // hexadecimal mantissa and exponent {"0x0", 0}, {"-0x0", -zero_}, diff --git a/src/math/big/intconv.go b/src/math/big/intconv.go index 65174c5018..d37d077920 100644 --- a/src/math/big/intconv.go +++ b/src/math/big/intconv.go @@ -172,8 +172,9 @@ func (x *Int) Format(s fmt.State, ch rune) { // // The base argument must be 0 or a value from 2 through MaxBase. If the base // is 0, the string prefix determines the actual conversion base. A prefix of -// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a -// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10. +// ``0b'' or ``0B'' selects base 2; a ``0'', ``0o'', or ``0O'' prefix selects +// base 8, and a ``0x'' or ``0X'' prefix selects base 16. Otherwise the selected +// base is 10. // func (z *Int) scan(r io.ByteScanner, base int) (*Int, int, error) { // determine sign diff --git a/src/math/big/intconv_test.go b/src/math/big/intconv_test.go index d23a3e2beb..d625b6aa3d 100644 --- a/src/math/big/intconv_test.go +++ b/src/math/big/intconv_test.go @@ -17,19 +17,24 @@ var stringTests = []struct { val int64 ok bool }{ + // invalid inputs {in: ""}, {in: "a"}, {in: "z"}, {in: "+"}, {in: "-"}, {in: "0b"}, + {in: "0o"}, {in: "0x"}, + {in: "0y"}, {in: "2", base: 2}, {in: "0b2", base: 0}, {in: "08"}, {in: "8", base: 8}, {in: "0xg", base: 0}, {in: "g", base: 16}, + + // valid inputs {"0", "0", 0, 0, true}, {"0", "0", 10, 0, true}, {"0", "0", 16, 0, true}, @@ -40,6 +45,8 @@ var stringTests = []struct { {"10", "10", 16, 16, true}, {"-10", "-10", 16, -16, true}, {"+10", "10", 16, 16, true}, + {"0b10", "2", 0, 2, true}, + {"0o10", "8", 0, 8, true}, {"0x10", "16", 0, 16, true}, {in: "0x10", base: 16}, {"-0x10", "-16", 0, -16, true}, diff --git a/src/math/big/natconv.go b/src/math/big/natconv.go index 21ccbd6cfa..c3c4115097 100644 --- a/src/math/big/natconv.go +++ b/src/math/big/natconv.go @@ -61,25 +61,25 @@ func pow(x Word, n int) (p Word) { // a digit count, and a read or syntax error err, if any. // // number = [ prefix ] mantissa . -// prefix = "0" [ "x" | "X" | "b" | "B" ] . +// prefix = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] . // mantissa = digits | digits "." [ digits ] | "." digits . // digits = digit { digit } . // digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // // Unless fracOk is set, the base argument must be 0 or a value between // 2 and MaxBase. If fracOk is set, the base argument must be one of -// 0, 2, 10, or 16. Providing an invalid base argument leads to a run- +// 0, 2, 8, 10, or 16. Providing an invalid base argument leads to a run- // time panic. // // For base 0, the number prefix determines the actual base: A prefix of -// ``0x'' or ``0X'' selects base 16; if fracOk is not set, the ``0'' prefix -// selects base 8, and a ``0b'' or ``0B'' prefix selects base 2. Otherwise +// ``0b'' or ``0B'' selects base 2, ``0o'' or ``0O'' selects base 8, and +// ``0x'' or ``0X'' selects base 16. If fracOk is false, a ``0'' prefix +// (immediately followed by digits) selects base 8 as well. Otherwise, // the selected base is 10 and no prefix is accepted. // -// If fracOk is set, an octal prefix is ignored (a leading ``0'' simply -// stands for a zero digit), and a period followed by a fractional part -// is permitted. The result value is computed as if there were no period -// present; and the count value is used to determine the fractional part. +// If fracOk is set, a period followed by a fractional part is permitted. +// The result value is computed as if there were no period present; and +// the count value is used to determine the fractional part. // // For bases <= 36, lower and upper case letters are considered the same: // The letters 'a' to 'z' and 'A' to 'Z' represent digit values 10 to 35. @@ -95,7 +95,7 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in // reject illegal bases baseOk := base == 0 || !fracOk && 2 <= base && base <= MaxBase || - fracOk && (base == 2 || base == 10 || base == 16) + fracOk && (base == 2 || base == 8 || base == 10 || base == 16) if !baseOk { panic(fmt.Sprintf("illegal number base %d", base)) } @@ -103,46 +103,44 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in // one char look-ahead ch, err := r.ReadByte() if err != nil { - return + return // io.EOF is also an error in this case } // determine actual base - b = base + b, prefix := base, 0 if base == 0 { // actual base is 10 unless there's a base prefix b = 10 if ch == '0' { count = 1 - switch ch, err = r.ReadByte(); err { - case nil: - // possibly one of 0x, 0X, 0b, 0B - if !fracOk { - b = 8 + ch, err = r.ReadByte() + if err != nil { + if err == io.EOF { + err = nil // not an error; input is "0" + res = z[:0] } - switch ch { - case 'x', 'X': - b = 16 - case 'b', 'B': - b = 2 + return + } + // possibly one of 0b, 0B, 0o, 0O, 0x, 0X + switch ch { + case 'b', 'B': + b, prefix = 2, 'b' + case 'o', 'O': + b, prefix = 8, 'o' + case 'x', 'X': + b, prefix = 16, 'x' + default: + if !fracOk { + b, prefix = 8, '0' } - switch b { - case 16, 2: - count = 0 // prefix is not counted + } + if prefix != 0 { + count = 0 // prefix is not counted + if prefix != '0' { if ch, err = r.ReadByte(); err != nil { - // io.EOF is also an error in this case - return + return // io.EOF is also an error in this case } - case 8: - count = 0 // prefix is not counted } - case io.EOF: - // input is "0" - res = z[:0] - err = nil - return - default: - // read error - return } } } @@ -216,14 +214,12 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in if count == 0 { // no digits found - switch { - case base == 0 && b == 8: + if prefix == '0' { // there was only the octal prefix 0 (possibly followed by digits > 7); // count as one digit and return base 10, not 8 count = 1 b = 10 - case base != 0 || b != 8: - // there was neither a mantissa digit nor the octal prefix 0 + } else { err = errors.New("syntax error scanning number") } return diff --git a/src/math/big/natconv_test.go b/src/math/big/natconv_test.go index 9f38bd94bb..645e2b8434 100644 --- a/src/math/big/natconv_test.go +++ b/src/math/big/natconv_test.go @@ -112,23 +112,31 @@ var natScanTests = []struct { ok bool // expected success next rune // next character (or 0, if at EOF) }{ - // error: no mantissa + // invalid: no mantissa {}, {s: "?"}, {base: 10}, {base: 36}, {base: 62}, {s: "?", base: 10}, + {s: "0b"}, + {s: "0o"}, {s: "0x"}, + {s: "0b2"}, + {s: "0B2"}, + {s: "0o8"}, + {s: "0O8"}, + {s: "0xg"}, + {s: "0Xg"}, {s: "345", base: 2}, - // error: incorrect use of decimal point + // invalid: incorrect use of decimal point {s: ".0"}, {s: ".0", base: 10}, {s: ".", base: 0}, {s: "0x.0"}, - // no errors + // valid, no decimal point {"0", 0, false, nil, 10, 1, true, 0}, {"0", 10, false, nil, 10, 1, true, 0}, {"0", 36, false, nil, 36, 1, true, 0}, @@ -136,11 +144,17 @@ var natScanTests = []struct { {"1", 0, false, nat{1}, 10, 1, true, 0}, {"1", 10, false, nat{1}, 10, 1, true, 0}, {"0 ", 0, false, nil, 10, 1, true, ' '}, + {"00 ", 0, false, nil, 8, 1, true, ' '}, // octal 0 + {"0b1", 0, false, nat{1}, 2, 1, true, 0}, + {"0B11000101", 0, false, nat{0xc5}, 2, 8, true, 0}, + {"0B110001012", 0, false, nat{0xc5}, 2, 8, true, '2'}, + {"07", 0, false, nat{7}, 8, 1, true, 0}, {"08", 0, false, nil, 10, 1, true, '8'}, {"08", 10, false, nat{8}, 10, 2, true, 0}, {"018", 0, false, nat{1}, 8, 1, true, '8'}, - {"0b1", 0, false, nat{1}, 2, 1, true, 0}, - {"0b11000101", 0, false, nat{0xc5}, 2, 8, true, 0}, + {"0o7", 0, false, nat{7}, 8, 1, true, 0}, + {"0o18", 0, false, nat{1}, 8, 1, true, '8'}, + {"0O17", 0, false, nat{017}, 8, 2, true, 0}, {"03271", 0, false, nat{03271}, 8, 4, true, 0}, {"10ab", 0, false, nat{10}, 10, 2, true, 'a'}, {"1234567890", 0, false, nat{1234567890}, 10, 10, true, 0}, @@ -153,13 +167,20 @@ var natScanTests = []struct { {"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, true, 0}, {"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, true, 0}, - // no errors, decimal point + // valid, with decimal point {"0.", 0, false, nil, 10, 1, true, '.'}, {"0.", 10, true, nil, 10, 0, true, 0}, {"0.1.2", 10, true, nat{1}, 10, -1, true, '.'}, {".000", 10, true, nil, 10, -3, true, 0}, {"12.3", 10, true, nat{123}, 10, -1, true, 0}, {"012.345", 10, true, nat{12345}, 10, -3, true, 0}, + {"0.1", 0, true, nat{1}, 10, -1, true, 0}, + {"0.1", 2, true, nat{1}, 2, -1, true, 0}, + {"0.12", 2, true, nat{1}, 2, -1, true, '2'}, + {"0b0.1", 0, true, nat{1}, 2, -1, true, 0}, + {"0B0.12", 0, true, nat{1}, 2, -1, true, '2'}, + {"0o0.7", 0, true, nat{7}, 8, -1, true, 0}, + {"0O0.78", 0, true, nat{7}, 8, -1, true, '8'}, } func TestScanBase(t *testing.T) { diff --git a/src/math/big/ratconv_test.go b/src/math/big/ratconv_test.go index fe8b8b60af..bdc6a3e1b0 100644 --- a/src/math/big/ratconv_test.go +++ b/src/math/big/ratconv_test.go @@ -58,11 +58,13 @@ var setStringTests = []StringTest{ // These are not supported by fmt.Fscanf. var setStringTests2 = []StringTest{ - {"0x10", "16", true}, + {"0b1000/3", "8/3", true}, + {"0B1000/0x8", "1", true}, {"-010/1", "-8", true}, // TODO(gri) should we even permit octal here? {"-010.", "-10", true}, + {"-0o10/1", "-8", true}, + {"0x10/1", "16", true}, {"0x10/0x20", "1/2", true}, - {"0b1000/3", "8/3", true}, {in: "4/3x"}, // TODO(gri) add more tests } @@ -81,8 +83,12 @@ func TestRatSetString(t *testing.T) { } else if x.RatString() != test.out { t.Errorf("#%d SetString(%q) got %s want %s", i, test.in, x.RatString(), test.out) } - } else if x != nil { - t.Errorf("#%d SetString(%q) got %p want nil", i, test.in, x) + } else { + if test.ok { + t.Errorf("#%d SetString(%q) expected success", i, test.in) + } else if x != nil { + t.Errorf("#%d SetString(%q) got %p want nil", i, test.in, x) + } } } } -- GitLab From a77f85a61874c05097a60f08d9dda71512d9dcc3 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 6 Mar 2019 17:23:56 -0800 Subject: [PATCH 0342/1679] cmd/compile: remove work-arounds for 0o/0O octals With math/big supporting the new octal prefixes directly, the compiler doesn't have to manually convert such numbers into old-style 0-prefix octals anymore. Updates #12711. Change-Id: I300bdd095836595426a1478d68da179f39e5531a Reviewed-on: https://go-review.googlesource.com/c/go/+/165861 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/mpfloat.go | 27 +++++--------------------- src/cmd/compile/internal/gc/mpint.go | 5 +---- 2 files changed, 6 insertions(+), 26 deletions(-) diff --git a/src/cmd/compile/internal/gc/mpfloat.go b/src/cmd/compile/internal/gc/mpfloat.go index c1bbd3c1b4..0379075406 100644 --- a/src/cmd/compile/internal/gc/mpfloat.go +++ b/src/cmd/compile/internal/gc/mpfloat.go @@ -188,28 +188,11 @@ func (a *Mpflt) SetString(as string) { as = as[1:] } - // Currently, Val.Parse below (== math/big.Float.Parse) does not - // handle the 0o-octal prefix which can appear with octal integers - // with 'i' suffix, which end up here as imaginary components of - // complex numbers. Handle explicitly for now. - // TODO(gri) remove once Float.Parse can handle octals (it handles 0b/0B) - var f *big.Float - if strings.HasPrefix(as, "0o") || strings.HasPrefix(as, "0O") { - x, ok := new(big.Int).SetString(as[2:], 8) - if !ok { - yyerror("malformed constant: %s", as) - a.Val.SetFloat64(0) - return - } - f = a.Val.SetInt(x) - } else { - var err error - f, _, err = a.Val.Parse(as, 0) - if err != nil { - yyerror("malformed constant: %s (%v)", as, err) - a.Val.SetFloat64(0) - return - } + f, _, err := a.Val.Parse(as, 0) + if err != nil { + yyerror("malformed constant: %s (%v)", as, err) + a.Val.SetFloat64(0) + return } if f.IsInf() { diff --git a/src/cmd/compile/internal/gc/mpint.go b/src/cmd/compile/internal/gc/mpint.go index e06f39f8d9..81b60dd278 100644 --- a/src/cmd/compile/internal/gc/mpint.go +++ b/src/cmd/compile/internal/gc/mpint.go @@ -282,11 +282,8 @@ func (a *Mpint) SetInt64(c int64) { } func (a *Mpint) SetString(as string) { - // TODO(gri) remove this code once math/big.Int.SetString can handle 0o-octals and separators + // TODO(gri) remove this code once math/big.Int.SetString can handle separators as = strings.Replace(as, "_", "", -1) // strip separators - if len(as) >= 2 && as[0] == '0' && (as[1] == 'o' || as[1] == 'O') { - as = "0" + as[2:] - } _, ok := a.Val.SetString(as, 0) if !ok { -- GitLab From 6efd51c6b768ecb55cd39b0dcb8a43d9a6c8e1b2 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Wed, 20 Feb 2019 11:38:16 +0000 Subject: [PATCH 0343/1679] cmd/compile: change the condition flags of floating-point comparisons in arm64 backend Current compiler reverses operands to work around NaN in "less than" and "less equal than" comparisons. But if we want to use "FCMPD/FCMPS $(0.0), Fn" to do some optimization, the workaround way does not work. Because assembler does not support instruction "FCMPD/FCMPS Fn, $(0.0)". This CL sets condition flags for floating-point comparisons to resolve this problem. Change-Id: Ia48076a1da95da64596d6e68304018cb301ebe33 Reviewed-on: https://go-review.googlesource.com/c/go/+/164718 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/arm64/ssa.go | 18 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 36 +++- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 9 +- src/cmd/compile/internal/ssa/opGen.go | 48 +++++ src/cmd/compile/internal/ssa/rewriteARM64.go | 212 +++++++++++++++++-- test/codegen/condmove.go | 2 +- 6 files changed, 293 insertions(+), 32 deletions(-) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 87703dd80d..0bc8f3a5ab 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -860,7 +860,11 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { ssa.OpARM64LessThanU, ssa.OpARM64LessEqualU, ssa.OpARM64GreaterThanU, - ssa.OpARM64GreaterEqualU: + ssa.OpARM64GreaterEqualU, + ssa.OpARM64LessThanF, + ssa.OpARM64LessEqualF, + ssa.OpARM64GreaterThanF, + ssa.OpARM64GreaterEqualF: // generate boolean values using CSET p := s.Prog(arm64.ACSET) p.From.Type = obj.TYPE_REG // assembler encodes conditional bits in Reg @@ -908,6 +912,10 @@ var condBits = map[ssa.Op]int16{ ssa.OpARM64GreaterThanU: arm64.COND_HI, ssa.OpARM64GreaterEqual: arm64.COND_GE, ssa.OpARM64GreaterEqualU: arm64.COND_HS, + ssa.OpARM64LessThanF: arm64.COND_MI, + ssa.OpARM64LessEqualF: arm64.COND_LS, + ssa.OpARM64GreaterThanF: arm64.COND_GT, + ssa.OpARM64GreaterEqualF: arm64.COND_GE, } var blockJump = map[ssa.BlockKind]struct { @@ -929,6 +937,10 @@ var blockJump = map[ssa.BlockKind]struct { ssa.BlockARM64NZW: {arm64.ACBNZW, arm64.ACBZW}, ssa.BlockARM64TBZ: {arm64.ATBZ, arm64.ATBNZ}, ssa.BlockARM64TBNZ: {arm64.ATBNZ, arm64.ATBZ}, + ssa.BlockARM64FLT: {arm64.ABMI, arm64.ABPL}, + ssa.BlockARM64FGE: {arm64.ABGE, arm64.ABLT}, + ssa.BlockARM64FLE: {arm64.ABLS, arm64.ABHI}, + ssa.BlockARM64FGT: {arm64.ABGT, arm64.ABLE}, } func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { @@ -975,7 +987,9 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { ssa.BlockARM64ULT, ssa.BlockARM64UGT, ssa.BlockARM64ULE, ssa.BlockARM64UGE, ssa.BlockARM64Z, ssa.BlockARM64NZ, - ssa.BlockARM64ZW, ssa.BlockARM64NZW: + ssa.BlockARM64ZW, ssa.BlockARM64NZW, + ssa.BlockARM64FLT, ssa.BlockARM64FGE, + ssa.BlockARM64FLE, ssa.BlockARM64FGT: jmp := blockJump[b.Kind] var p *obj.Prog switch next { diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 6e0420983a..8b263a092f 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -296,8 +296,14 @@ (Less16 x y) -> (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) (Less32 x y) -> (LessThan (CMPW x y)) (Less64 x y) -> (LessThan (CMP x y)) -(Less32F x y) -> (GreaterThan (FCMPS y x)) // reverse operands to work around NaN -(Less64F x y) -> (GreaterThan (FCMPD y x)) // reverse operands to work around NaN + +// Set condition flags for floating-point comparisons "x < y" +// and "x <= y". Because if either or both of the operands are +// NaNs, all three of (x < y), (x == y) and (x > y) are false, +// and ARM Manual says FCMP instruction sets PSTATE. +// of this case to (0, 0, 1, 1). +(Less32F x y) -> (LessThanF (FCMPS x y)) +(Less64F x y) -> (LessThanF (FCMPD x y)) (Less8U x y) -> (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) (Less16U x y) -> (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -308,8 +314,10 @@ (Leq16 x y) -> (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) (Leq32 x y) -> (LessEqual (CMPW x y)) (Leq64 x y) -> (LessEqual (CMP x y)) -(Leq32F x y) -> (GreaterEqual (FCMPS y x)) // reverse operands to work around NaN -(Leq64F x y) -> (GreaterEqual (FCMPD y x)) // reverse operands to work around NaN + +// Refer to the comments for op Less64F above. +(Leq32F x y) -> (LessEqualF (FCMPS x y)) +(Leq64F x y) -> (LessEqualF (FCMPD x y)) (Leq8U x y) -> (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) (Leq16U x y) -> (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -320,8 +328,8 @@ (Greater16 x y) -> (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) (Greater32 x y) -> (GreaterThan (CMPW x y)) (Greater64 x y) -> (GreaterThan (CMP x y)) -(Greater32F x y) -> (GreaterThan (FCMPS x y)) -(Greater64F x y) -> (GreaterThan (FCMPD x y)) +(Greater32F x y) -> (GreaterThanF (FCMPS x y)) +(Greater64F x y) -> (GreaterThanF (FCMPD x y)) (Greater8U x y) -> (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) (Greater16U x y) -> (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -332,8 +340,8 @@ (Geq16 x y) -> (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) (Geq32 x y) -> (GreaterEqual (CMPW x y)) (Geq64 x y) -> (GreaterEqual (CMP x y)) -(Geq32F x y) -> (GreaterEqual (FCMPS x y)) -(Geq64F x y) -> (GreaterEqual (FCMPD x y)) +(Geq32F x y) -> (GreaterEqualF (FCMPS x y)) +(Geq64F x y) -> (GreaterEqualF (FCMPD x y)) (Geq8U x y) -> (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) (Geq16U x y) -> (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -550,6 +558,10 @@ (If (GreaterThanU cc) yes no) -> (UGT cc yes no) (If (GreaterEqual cc) yes no) -> (GE cc yes no) (If (GreaterEqualU cc) yes no) -> (UGE cc yes no) +(If (LessThanF cc) yes no) -> (FLT cc yes no) +(If (LessEqualF cc) yes no) -> (FLE cc yes no) +(If (GreaterThanF cc) yes no) -> (FGT cc yes no) +(If (GreaterEqualF cc) yes no) -> (FGE cc yes no) (If cond yes no) -> (NZ cond yes no) @@ -595,6 +607,10 @@ (NZ (GreaterThanU cc) yes no) -> (UGT cc yes no) (NZ (GreaterEqual cc) yes no) -> (GE cc yes no) (NZ (GreaterEqualU cc) yes no) -> (UGE cc yes no) +(NZ (LessThanF cc) yes no) -> (FLT cc yes no) +(NZ (LessEqualF cc) yes no) -> (FLE cc yes no) +(NZ (GreaterThan cc) yes no) -> (FGT cc yes no) +(NZ (GreaterEqual cc) yes no) -> (FGE cc yes no) (EQ (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 -> (EQ (TSTWconst [c] y) yes no) (NE (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 -> (NE (TSTWconst [c] y) yes no) @@ -1518,6 +1534,10 @@ (UGE (InvertFlags cmp) yes no) -> (ULE cmp yes no) (EQ (InvertFlags cmp) yes no) -> (EQ cmp yes no) (NE (InvertFlags cmp) yes no) -> (NE cmp yes no) +(FLT (InvertFlags cmp) yes no) -> (FGT cmp yes no) +(FGT (InvertFlags cmp) yes no) -> (FLT cmp yes no) +(FLE (InvertFlags cmp) yes no) -> (FGE cmp yes no) +(FGE (InvertFlags cmp) yes no) -> (FLE cmp yes no) // absorb InvertFlags into CSEL(0) (CSEL {cc} x y (InvertFlags cmp)) -> (CSEL {arm64Invert(cc.(Op))} x y cmp) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index fc0a41527b..2a65d547bd 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -466,7 +466,10 @@ func init() { {name: "LessEqualU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned x<=y false otherwise. {name: "GreaterThanU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned x>y false otherwise. {name: "GreaterEqualU", argLength: 1, reg: readflags}, // bool, true flags encode unsigned x>=y false otherwise. - + {name: "LessThanF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point xy false otherwise. + {name: "GreaterEqualF", argLength: 1, reg: readflags}, // bool, true flags encode floating-point x>=y false otherwise. // duffzero // arg0 = address of memory to zero // arg1 = mem @@ -663,6 +666,10 @@ func init() { {name: "NZW"}, // Control != 0, 32-bit {name: "TBZ"}, // Control & (1 << Aux.(int64)) == 0 {name: "TBNZ"}, // Control & (1 << Aux.(int64)) != 0 + {name: "FLT"}, + {name: "FLE"}, + {name: "FGT"}, + {name: "FGE"}, } archs = append(archs, arch{ diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 5fcc64f460..b50532fb69 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -77,6 +77,10 @@ const ( BlockARM64NZW BlockARM64TBZ BlockARM64TBNZ + BlockARM64FLT + BlockARM64FLE + BlockARM64FGT + BlockARM64FGE BlockMIPSEQ BlockMIPSNE @@ -189,6 +193,10 @@ var blockString = [...]string{ BlockARM64NZW: "NZW", BlockARM64TBZ: "TBZ", BlockARM64TBNZ: "TBNZ", + BlockARM64FLT: "FLT", + BlockARM64FLE: "FLE", + BlockARM64FGT: "FGT", + BlockARM64FGE: "FGE", BlockMIPSEQ: "EQ", BlockMIPSNE: "NE", @@ -1361,6 +1369,10 @@ const ( OpARM64LessEqualU OpARM64GreaterThanU OpARM64GreaterEqualU + OpARM64LessThanF + OpARM64LessEqualF + OpARM64GreaterThanF + OpARM64GreaterEqualF OpARM64DUFFZERO OpARM64LoweredZero OpARM64DUFFCOPY @@ -18138,6 +18150,42 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "LessThanF", + argLen: 1, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "LessEqualF", + argLen: 1, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "GreaterThanF", + argLen: 1, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "GreaterEqualF", + argLen: 1, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, { name: "DUFFZERO", auxType: auxInt64, diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 24f392a43e..7ad04ead93 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -33923,12 +33923,12 @@ func rewriteValueARM64_OpGeq32F_0(v *Value) bool { _ = b // match: (Geq32F x y) // cond: - // result: (GreaterEqual (FCMPS x y)) + // result: (GreaterEqualF (FCMPS x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterEqual) + v.reset(OpARM64GreaterEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) v0.AddArg(y) @@ -33977,12 +33977,12 @@ func rewriteValueARM64_OpGeq64F_0(v *Value) bool { _ = b // match: (Geq64F x y) // cond: - // result: (GreaterEqual (FCMPD x y)) + // result: (GreaterEqualF (FCMPD x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterEqual) + v.reset(OpARM64GreaterEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) v0.AddArg(y) @@ -34154,12 +34154,12 @@ func rewriteValueARM64_OpGreater32F_0(v *Value) bool { _ = b // match: (Greater32F x y) // cond: - // result: (GreaterThan (FCMPS x y)) + // result: (GreaterThanF (FCMPS x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterThan) + v.reset(OpARM64GreaterThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) v0.AddArg(y) @@ -34208,12 +34208,12 @@ func rewriteValueARM64_OpGreater64F_0(v *Value) bool { _ = b // match: (Greater64F x y) // cond: - // result: (GreaterThan (FCMPD x y)) + // result: (GreaterThanF (FCMPD x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterThan) + v.reset(OpARM64GreaterThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) v0.AddArg(y) @@ -34496,15 +34496,15 @@ func rewriteValueARM64_OpLeq32F_0(v *Value) bool { _ = b // match: (Leq32F x y) // cond: - // result: (GreaterEqual (FCMPS y x)) + // result: (LessEqualF (FCMPS x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterEqual) + v.reset(OpARM64LessEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) - v0.AddArg(y) v0.AddArg(x) + v0.AddArg(y) v.AddArg(v0) return true } @@ -34550,15 +34550,15 @@ func rewriteValueARM64_OpLeq64F_0(v *Value) bool { _ = b // match: (Leq64F x y) // cond: - // result: (GreaterEqual (FCMPD y x)) + // result: (LessEqualF (FCMPD x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterEqual) + v.reset(OpARM64LessEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) - v0.AddArg(y) v0.AddArg(x) + v0.AddArg(y) v.AddArg(v0) return true } @@ -34700,15 +34700,15 @@ func rewriteValueARM64_OpLess32F_0(v *Value) bool { _ = b // match: (Less32F x y) // cond: - // result: (GreaterThan (FCMPS y x)) + // result: (LessThanF (FCMPS x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterThan) + v.reset(OpARM64LessThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) - v0.AddArg(y) v0.AddArg(x) + v0.AddArg(y) v.AddArg(v0) return true } @@ -34754,15 +34754,15 @@ func rewriteValueARM64_OpLess64F_0(v *Value) bool { _ = b // match: (Less64F x y) // cond: - // result: (GreaterThan (FCMPD y x)) + // result: (LessThanF (FCMPD x y)) for { _ = v.Args[1] x := v.Args[0] y := v.Args[1] - v.reset(OpARM64GreaterThan) + v.reset(OpARM64LessThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) - v0.AddArg(y) v0.AddArg(x) + v0.AddArg(y) v.AddArg(v0) return true } @@ -39510,6 +39510,66 @@ func rewriteBlockARM64(b *Block) bool { b.Aux = nil return true } + case BlockARM64FGE: + // match: (FGE (InvertFlags cmp) yes no) + // cond: + // result: (FLE cmp yes no) + for { + v := b.Control + if v.Op != OpARM64InvertFlags { + break + } + cmp := v.Args[0] + b.Kind = BlockARM64FLE + b.SetControl(cmp) + b.Aux = nil + return true + } + case BlockARM64FGT: + // match: (FGT (InvertFlags cmp) yes no) + // cond: + // result: (FLT cmp yes no) + for { + v := b.Control + if v.Op != OpARM64InvertFlags { + break + } + cmp := v.Args[0] + b.Kind = BlockARM64FLT + b.SetControl(cmp) + b.Aux = nil + return true + } + case BlockARM64FLE: + // match: (FLE (InvertFlags cmp) yes no) + // cond: + // result: (FGE cmp yes no) + for { + v := b.Control + if v.Op != OpARM64InvertFlags { + break + } + cmp := v.Args[0] + b.Kind = BlockARM64FGE + b.SetControl(cmp) + b.Aux = nil + return true + } + case BlockARM64FLT: + // match: (FLT (InvertFlags cmp) yes no) + // cond: + // result: (FGT cmp yes no) + for { + v := b.Control + if v.Op != OpARM64InvertFlags { + break + } + cmp := v.Args[0] + b.Kind = BlockARM64FGT + b.SetControl(cmp) + b.Aux = nil + return true + } case BlockARM64GE: // match: (GE (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 @@ -40674,6 +40734,62 @@ func rewriteBlockARM64(b *Block) bool { b.Aux = nil return true } + // match: (If (LessThanF cc) yes no) + // cond: + // result: (FLT cc yes no) + for { + v := b.Control + if v.Op != OpARM64LessThanF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FLT + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (If (LessEqualF cc) yes no) + // cond: + // result: (FLE cc yes no) + for { + v := b.Control + if v.Op != OpARM64LessEqualF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FLE + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (If (GreaterThanF cc) yes no) + // cond: + // result: (FGT cc yes no) + for { + v := b.Control + if v.Op != OpARM64GreaterThanF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FGT + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (If (GreaterEqualF cc) yes no) + // cond: + // result: (FGE cc yes no) + for { + v := b.Control + if v.Op != OpARM64GreaterEqualF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FGE + b.SetControl(cc) + b.Aux = nil + return true + } // match: (If cond yes no) // cond: // result: (NZ cond yes no) @@ -42413,6 +42529,62 @@ func rewriteBlockARM64(b *Block) bool { b.Aux = nil return true } + // match: (NZ (LessThanF cc) yes no) + // cond: + // result: (FLT cc yes no) + for { + v := b.Control + if v.Op != OpARM64LessThanF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FLT + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (NZ (LessEqualF cc) yes no) + // cond: + // result: (FLE cc yes no) + for { + v := b.Control + if v.Op != OpARM64LessEqualF { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FLE + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (NZ (GreaterThan cc) yes no) + // cond: + // result: (FGT cc yes no) + for { + v := b.Control + if v.Op != OpARM64GreaterThan { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FGT + b.SetControl(cc) + b.Aux = nil + return true + } + // match: (NZ (GreaterEqual cc) yes no) + // cond: + // result: (FGE cc yes no) + for { + v := b.Control + if v.Op != OpARM64GreaterEqual { + break + } + cc := v.Args[0] + b.Kind = BlockARM64FGE + b.SetControl(cc) + b.Aux = nil + return true + } // match: (NZ (ANDconst [c] x) yes no) // cond: oneBit(c) // result: (TBNZ {ntz(c)} x yes no) diff --git a/test/codegen/condmove.go b/test/codegen/condmove.go index aa82d43f49..3690a54618 100644 --- a/test/codegen/condmove.go +++ b/test/codegen/condmove.go @@ -95,7 +95,7 @@ func cmovfloatint2(x, y float64) float64 { rexp = rexp - 1 } // amd64:"CMOVQHI" - // arm64:"CSEL\tGT" + // arm64:"CSEL\tMI" r = r - ldexp(y, (rexp-yexp)) } return r -- GitLab From 27cce773d3338d282039fd250c0f9bff3ecab3b0 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Fri, 15 Feb 2019 11:21:46 +0000 Subject: [PATCH 0344/1679] cmd/compile: optimize arm64 comparison of x and 0.0 with "FCMP $(0.0), Fn" Code: func comp(x float64) bool {return x < 0} Previous version: FMOVD "".x(FP), F0 FMOVD ZR, F1 FCMPD F1, F0 CSET MI, R0 MOVB R0, "".~r1+8(FP) RET (R30) Optimized version: FMOVD "".x(FP), F0 FCMPD $(0.0), F0 CSET MI, R0 MOVB R0, "".~r1+8(FP) RET (R30) Math package benchmark results: name old time/op new time/op delta Acos-8 77.500000ns +- 0% 77.400000ns +- 0% -0.13% (p=0.000 n=9+10) Acosh-8 98.600000ns +- 0% 98.100000ns +- 0% -0.51% (p=0.000 n=10+9) Asin-8 67.600000ns +- 0% 66.600000ns +- 0% -1.48% (p=0.000 n=9+10) Asinh-8 108.000000ns +- 0% 109.000000ns +- 0% +0.93% (p=0.000 n=10+10) Atan-8 36.788889ns +- 0% 36.000000ns +- 0% -2.14% (p=0.000 n=9+10) Atanh-8 104.000000ns +- 0% 105.000000ns +- 0% +0.96% (p=0.000 n=10+10) Atan2-8 67.100000ns +- 0% 66.600000ns +- 0% -0.75% (p=0.000 n=10+10) Cbrt-8 89.100000ns +- 0% 82.000000ns +- 0% -7.97% (p=0.000 n=10+10) Erf-8 43.500000ns +- 0% 43.000000ns +- 0% -1.15% (p=0.000 n=10+10) Erfc-8 49.000000ns +- 0% 48.220000ns +- 0% -1.59% (p=0.000 n=9+10) Erfinv-8 59.100000ns +- 0% 58.600000ns +- 0% -0.85% (p=0.000 n=10+10) Erfcinv-8 59.100000ns +- 0% 58.600000ns +- 0% -0.85% (p=0.000 n=10+10) Expm1-8 56.600000ns +- 0% 56.040000ns +- 0% -0.99% (p=0.000 n=8+10) Exp2Go-8 97.600000ns +- 0% 99.400000ns +- 0% +1.84% (p=0.000 n=10+10) Dim-8 2.500000ns +- 0% 2.250000ns +- 0% -10.00% (p=0.000 n=10+10) Mod-8 108.000000ns +- 0% 106.000000ns +- 0% -1.85% (p=0.000 n=8+8) Frexp-8 12.000000ns +- 0% 12.500000ns +- 0% +4.17% (p=0.000 n=10+10) Gamma-8 67.100000ns +- 0% 67.600000ns +- 0% +0.75% (p=0.000 n=10+10) Hypot-8 17.100000ns +- 0% 17.000000ns +- 0% -0.58% (p=0.002 n=8+10) Ilogb-8 9.010000ns +- 0% 8.510000ns +- 0% -5.55% (p=0.000 n=10+9) J1-8 288.000000ns +- 0% 287.000000ns +- 0% -0.35% (p=0.000 n=10+10) Jn-8 605.000000ns +- 0% 604.000000ns +- 0% -0.17% (p=0.001 n=8+9) Logb-8 10.600000ns +- 0% 10.500000ns +- 0% -0.94% (p=0.000 n=9+10) Log2-8 16.500000ns +- 0% 17.000000ns +- 0% +3.03% (p=0.000 n=10+10) PowFrac-8 232.000000ns +- 0% 233.000000ns +- 0% +0.43% (p=0.000 n=10+10) Remainder-8 70.600000ns +- 0% 69.600000ns +- 0% -1.42% (p=0.000 n=10+10) SqrtGoLatency-8 77.600000ns +- 0% 76.600000ns +- 0% -1.29% (p=0.000 n=10+10) Tanh-8 97.600000ns +- 0% 94.100000ns +- 0% -3.59% (p=0.000 n=10+10) Y1-8 289.000000ns +- 0% 288.000000ns +- 0% -0.35% (p=0.000 n=10+10) Yn-8 603.000000ns +- 0% 589.000000ns +- 0% -2.32% (p=0.000 n=10+10) Change-Id: I6920734f8662b329aa58f5b8e4eeae73b409984d Reviewed-on: https://go-review.googlesource.com/c/go/+/164719 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/arm64/ssa.go | 6 + src/cmd/compile/internal/ssa/gen/ARM64.rules | 10 ++ src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 3 + src/cmd/compile/internal/ssa/opGen.go | 22 +++ src/cmd/compile/internal/ssa/rewriteARM64.go | 158 +++++++++++++++++++ 5 files changed, 199 insertions(+) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 0bc8f3a5ab..0ea3c191ac 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -301,6 +301,12 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.From.Val = math.Float64frombits(uint64(v.AuxInt)) p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() + case ssa.OpARM64FCMPS0, + ssa.OpARM64FCMPD0: + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_FCONST + p.From.Val = math.Float64frombits(0) + p.Reg = v.Args[0].Reg() case ssa.OpARM64CMP, ssa.OpARM64CMPW, ssa.OpARM64CMN, diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 8b263a092f..3adb7895a2 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -348,6 +348,12 @@ (Geq32U x y) -> (GreaterEqualU (CMPW x y)) (Geq64U x y) -> (GreaterEqualU (CMP x y)) +// Optimize comparision between a floating-point value and 0.0 with "FCMP $(0.0), Fn" +(FCMPS x (FMOVSconst [0])) -> (FCMPS0 x) +(FCMPS (FMOVSconst [0]) x) -> (InvertFlags (FCMPS0 x)) +(FCMPD x (FMOVDconst [0])) -> (FCMPD0 x) +(FCMPD (FMOVDconst [0]) x) -> (InvertFlags (FCMPD0 x)) + // CSEL needs a flag-generating argument. Synthesize a CMPW if necessary. (CondSelect x y bool) && flagArg(bool) != nil -> (CSEL {bool.Op} x y flagArg(bool)) (CondSelect x y bool) && flagArg(bool) == nil -> (CSEL {OpARM64NotEqual} x y (CMPWconst [0] bool)) @@ -1615,6 +1621,10 @@ (LessEqualU (InvertFlags x)) -> (GreaterEqualU x) (GreaterEqual (InvertFlags x)) -> (LessEqual x) (GreaterEqualU (InvertFlags x)) -> (LessEqualU x) +(LessThanF (InvertFlags x)) -> (GreaterThanF x) +(LessEqualF (InvertFlags x)) -> (GreaterEqualF x) +(GreaterThanF (InvertFlags x)) -> (LessThanF x) +(GreaterEqualF (InvertFlags x)) -> (LessEqualF x) // Boolean-generating instructions always // zero upper bit of the register; no need to zero-extend diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 2a65d547bd..b6bf10315e 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -158,6 +158,7 @@ func init() { fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}} fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}} fp2flags = regInfo{inputs: []regMask{fp, fp}} + fp1flags = regInfo{inputs: []regMask{fp}} fpload = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{fp}} fp2load = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{fp}} fpstore = regInfo{inputs: []regMask{gpspsbg, fp}} @@ -271,6 +272,8 @@ func init() { {name: "TSTWconst", argLength: 1, reg: gp1flags, asm: "TSTW", aux: "Int32", typ: "Flags"}, // arg0 & auxInt compare to 0, 32 bit {name: "FCMPS", argLength: 2, reg: fp2flags, asm: "FCMPS", typ: "Flags"}, // arg0 compare to arg1, float32 {name: "FCMPD", argLength: 2, reg: fp2flags, asm: "FCMPD", typ: "Flags"}, // arg0 compare to arg1, float64 + {name: "FCMPS0", argLength: 1, reg: fp1flags, asm: "FCMPS", typ: "Flags"}, // arg0 compare to 0, float32 + {name: "FCMPD0", argLength: 1, reg: fp1flags, asm: "FCMPD", typ: "Flags"}, // arg0 compare to 0, float64 // shifted ops {name: "MVNshiftLL", argLength: 1, reg: gp11, asm: "MVN", aux: "Int64"}, // ^(arg0< Date: Mon, 18 Feb 2019 11:09:03 +0000 Subject: [PATCH 0345/1679] cmd/compile/internal/ssa: set OFOR bBody.Pos to AST Pos Assign SSA OFOR's bBody.Pos to AST (*Node).Pos as it is created. An empty for loop has no other information which may be used to give correct position information in the resulting executable. Such a for loop may compile to a single `JMP *self` and it is important that the location of this is in the right place. Fixes #30167. Change-Id: Iec44f0281c462c33fac6b7b8ccfc2ef37434c247 Reviewed-on: https://go-review.googlesource.com/c/go/+/163019 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/ssa.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 3f4355c387..84b9207481 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -1077,6 +1077,9 @@ func (s *state) stmt(n *Node) { bIncr := s.f.NewBlock(ssa.BlockPlain) bEnd := s.f.NewBlock(ssa.BlockPlain) + // ensure empty for loops have correct position; issue #30167 + bBody.Pos = n.Pos + // first, jump to condition test (OFOR) or body (OFORUNTIL) b := s.endBlock() if n.Op == OFOR { -- GitLab From 3a62f4ee40212c363ae7ebf5e28954efb7ff7ee6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 6 Mar 2019 17:57:35 -0500 Subject: [PATCH 0346/1679] cmd/link: fix suspicious code in emitPcln In cmd/link/internal/ld/pcln.go:emitPcln, the code and the comment don't match. I think the comment is right. Fix the code. As a consequence, on Linux/AMD64, internal linking with PIE buildmode with cgo (at least the cgo packages in the standard library) now works. Add a test. Change-Id: I091cf81ba89571052bc0ec1fa0a6a688dec07b04 Reviewed-on: https://go-review.googlesource.com/c/go/+/166017 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/dist/test.go | 11 +++++++++++ src/cmd/link/internal/ld/pcln.go | 5 +---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 8084e474a8..a58cee7518 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -579,6 +579,17 @@ func (t *tester) registerTests() { return nil }, }) + // Also test a cgo package. + if t.cgoEnabled { + t.tests = append(t.tests, distTest{ + name: "pie_internal_cgo", + heading: "internal linking of -buildmode=pie", + fn: func(dt *distTest) error { + t.addCmd(dt, "src", t.goTest(), "os/user", "-buildmode=pie", "-ldflags=-linkmode=internal", t.timeout(60)) + return nil + }, + }) + } } // sync tests diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index e4db834622..e32f9e7110 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -182,10 +182,7 @@ func emitPcln(ctxt *Link, s *sym.Symbol) bool { } // We want to generate func table entries only for the "lowest level" symbols, // not containers of subsymbols. - if s.Attr.Container() { - return true - } - return true + return !s.Attr.Container() } // pclntab initializes the pclntab symbol with -- GitLab From 9586c093a2e65cb8edd73a4dd0a6a18823249cf4 Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Wed, 23 Jan 2019 20:14:30 +0000 Subject: [PATCH 0347/1679] cmd/cgo: add missing parameter list for function _cgo_wait_runtime_init_done Fixes #29879 Change-Id: Id2061a5eab67bb90a8116dc4f16073be1c9a09a9 GitHub-Last-Rev: 186863ab6aa9481744f276a7afbd87bd53c9f863 GitHub-Pull-Request: golang/go#29900 Reviewed-on: https://go-review.googlesource.com/c/go/+/159178 Reviewed-by: Philipp Stephani Reviewed-by: Emmanuel Odeke Reviewed-by: Ian Lance Taylor Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/cmd/cgo/doc.go | 2 +- src/cmd/cgo/out.go | 8 ++++---- src/runtime/cgo/gcc_libinit.c | 2 +- src/runtime/cgo/gcc_libinit_windows.c | 2 +- src/runtime/cgo/libcgo.h | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go index cceb33edbd..73ad4ba079 100644 --- a/src/cmd/cgo/doc.go +++ b/src/cmd/cgo/doc.go @@ -710,7 +710,7 @@ _cgo_main.c: int main() { return 0; } void crosscall2(void(*fn)(void*, int, uintptr_t), void *a, int c, uintptr_t ctxt) { } - uintptr_t _cgo_wait_runtime_init_done() { return 0; } + uintptr_t _cgo_wait_runtime_init_done(void) { return 0; } void _cgo_release_context(uintptr_t ctxt) { } char* _cgo_topofstack(void) { return (char*)0; } void _cgo_allocate(void *a, int c) { } diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 0cf8b174f8..bb0d016fa5 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -59,14 +59,14 @@ func (p *Package) writeDefs() { fmt.Fprintf(fm, "int main() { return 0; }\n") if *importRuntimeCgo { fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int, __SIZE_TYPE__), void *a, int c, __SIZE_TYPE__ ctxt) { }\n") - fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done() { return 0; }\n") + fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void) { return 0; }\n") fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__ ctxt) { }\n") fmt.Fprintf(fm, "char* _cgo_topofstack(void) { return (char*)0; }\n") } else { // If we're not importing runtime/cgo, we *are* runtime/cgo, // which provides these functions. We just need a prototype. fmt.Fprintf(fm, "void crosscall2(void(*fn)(void*, int, __SIZE_TYPE__), void *a, int c, __SIZE_TYPE__ ctxt);\n") - fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done();\n") + fmt.Fprintf(fm, "__SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n") fmt.Fprintf(fm, "void _cgo_release_context(__SIZE_TYPE__);\n") } fmt.Fprintf(fm, "void _cgo_allocate(void *a, int c) { }\n") @@ -784,7 +784,7 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) { fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Waddress-of-packed-member\"\n") fmt.Fprintf(fgcc, "extern void crosscall2(void (*fn)(void *, int, __SIZE_TYPE__), void *, int, __SIZE_TYPE__);\n") - fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done();\n") + fmt.Fprintf(fgcc, "extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void);\n") fmt.Fprintf(fgcc, "extern void _cgo_release_context(__SIZE_TYPE__);\n\n") fmt.Fprintf(fgcc, "extern char* _cgo_topofstack(void);") fmt.Fprintf(fgcc, "%s\n", tsanProlog) @@ -1924,5 +1924,5 @@ static void GoInit(void) { runtime_iscgo = 1; } -extern __SIZE_TYPE__ _cgo_wait_runtime_init_done() __attribute__ ((weak)); +extern __SIZE_TYPE__ _cgo_wait_runtime_init_done(void) __attribute__ ((weak)); ` diff --git a/src/runtime/cgo/gcc_libinit.c b/src/runtime/cgo/gcc_libinit.c index d35726d953..3304d95fdf 100644 --- a/src/runtime/cgo/gcc_libinit.c +++ b/src/runtime/cgo/gcc_libinit.c @@ -32,7 +32,7 @@ x_cgo_sys_thread_create(void* (*func)(void*), void* arg) { } uintptr_t -_cgo_wait_runtime_init_done() { +_cgo_wait_runtime_init_done(void) { void (*pfn)(struct context_arg*); pthread_mutex_lock(&runtime_init_mu); diff --git a/src/runtime/cgo/gcc_libinit_windows.c b/src/runtime/cgo/gcc_libinit_windows.c index 248d59fd69..9fd7d36bfb 100644 --- a/src/runtime/cgo/gcc_libinit_windows.c +++ b/src/runtime/cgo/gcc_libinit_windows.c @@ -70,7 +70,7 @@ _cgo_is_runtime_initialized() { } uintptr_t -_cgo_wait_runtime_init_done() { +_cgo_wait_runtime_init_done(void) { void (*pfn)(struct context_arg*); _cgo_maybe_run_preinit(); diff --git a/src/runtime/cgo/libcgo.h b/src/runtime/cgo/libcgo.h index 60326720a7..aba500a301 100644 --- a/src/runtime/cgo/libcgo.h +++ b/src/runtime/cgo/libcgo.h @@ -61,7 +61,7 @@ void _cgo_sys_thread_start(ThreadStart *ts); * If runtime.SetCgoTraceback is used to set a context function, * calls the context function and returns the context value. */ -uintptr_t _cgo_wait_runtime_init_done(); +uintptr_t _cgo_wait_runtime_init_done(void); /* * Call fn in the 6c world. -- GitLab From 6a9da69147a3b32e48f8dfea8c82f5975af9cc62 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 9 Jul 2018 22:52:22 -0400 Subject: [PATCH 0348/1679] time: add support for day-of-year in Format and Parse Day of year is 002 or __2, in contrast to day-in-month 2 or 02 or _2. This means there is no way to print a variable-width day-of-year, but that's probably OK. Fixes #25689. Change-Id: I1425d412cb7d2d360e9b3bf74e89566714e2477a Reviewed-on: https://go-review.googlesource.com/c/go/+/122876 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/time/export_test.go | 57 ++++++++++++++++++++++ src/time/format.go | 105 ++++++++++++++++++++++++++++++++++++---- src/time/format_test.go | 66 +++++++++++++++++++++++++ src/time/time_test.go | 21 ++++++-- 4 files changed, 237 insertions(+), 12 deletions(-) diff --git a/src/time/export_test.go b/src/time/export_test.go index ae24ceb99a..442c8da4a6 100644 --- a/src/time/export_test.go +++ b/src/time/export_test.go @@ -35,4 +35,61 @@ var ( ErrLocation = errLocation ReadFile = readFile LoadTzinfo = loadTzinfo + NextStdChunk = nextStdChunk ) + +// StdChunkNames maps from nextStdChunk results to the matched strings. +var StdChunkNames = map[int]string{ + 0: "", + stdLongMonth: "January", + stdMonth: "Jan", + stdNumMonth: "1", + stdZeroMonth: "01", + stdLongWeekDay: "Monday", + stdWeekDay: "Mon", + stdDay: "2", + stdUnderDay: "_2", + stdZeroDay: "02", + stdUnderYearDay: "__2", + stdZeroYearDay: "002", + stdHour: "15", + stdHour12: "3", + stdZeroHour12: "03", + stdMinute: "4", + stdZeroMinute: "04", + stdSecond: "5", + stdZeroSecond: "05", + stdLongYear: "2006", + stdYear: "06", + stdPM: "PM", + stdpm: "pm", + stdTZ: "MST", + stdISO8601TZ: "Z0700", + stdISO8601SecondsTZ: "Z070000", + stdISO8601ShortTZ: "Z07", + stdISO8601ColonTZ: "Z07:00", + stdISO8601ColonSecondsTZ: "Z07:00:00", + stdNumTZ: "-0700", + stdNumSecondsTz: "-070000", + stdNumShortTZ: "-07", + stdNumColonTZ: "-07:00", + stdNumColonSecondsTZ: "-07:00:00", + stdFracSecond0 | 1<= i+2 && '1' <= layout[i+1] && layout[i+1] <= '6' { return layout[0:i], std0x[layout[i+1]-'1'], layout[i+2:] } + if len(layout) >= i+3 && layout[i+1] == '0' && layout[i+2] == '2' { + return layout[0:i], stdZeroYearDay, layout[i+3:] + } case '1': // 15, 1 if len(layout) >= i+2 && layout[i+1] == '5' { @@ -187,7 +196,7 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) { } return layout[0:i], stdDay, layout[i+1:] - case '_': // _2, _2006 + case '_': // _2, _2006, __2 if len(layout) >= i+2 && layout[i+1] == '2' { //_2006 is really a literal _, followed by stdLongYear if len(layout) >= i+5 && layout[i+1:i+5] == "2006" { @@ -195,6 +204,9 @@ func nextStdChunk(layout string) (prefix string, std int, suffix string) { } return layout[0:i], stdUnderDay, layout[i+2:] } + if len(layout) >= i+3 && layout[i+1] == '_' && layout[i+2] == '2' { + return layout[0:i], stdUnderYearDay, layout[i+3:] + } case '3': return layout[0:i], stdHour12, layout[i+1:] @@ -503,6 +515,7 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { year int = -1 month Month day int + yday int hour int = -1 min int sec int @@ -520,7 +533,8 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { // Compute year, month, day if needed. if year < 0 && std&stdNeedDate != 0 { - year, month, day, _ = absDate(abs, true) + year, month, day, yday = absDate(abs, true) + yday++ } // Compute hour, minute, second if needed. @@ -560,6 +574,16 @@ func (t Time) AppendFormat(b []byte, layout string) []byte { b = appendInt(b, day, 0) case stdZeroDay: b = appendInt(b, day, 2) + case stdUnderYearDay: + if yday < 100 { + b = append(b, ' ') + if yday < 10 { + b = append(b, ' ') + } + } + b = appendInt(b, yday, 0) + case stdZeroYearDay: + b = appendInt(b, yday, 3) case stdHour: b = appendInt(b, hour, 2) case stdHour12: @@ -688,7 +712,7 @@ func isDigit(s string, i int) bool { return '0' <= c && c <= '9' } -// getnum parses s[0:1] or s[0:2] (fixed forces the latter) +// getnum parses s[0:1] or s[0:2] (fixed forces s[0:2]) // as a decimal integer and returns the integer and the // remainder of the string. func getnum(s string, fixed bool) (int, string, error) { @@ -704,6 +728,20 @@ func getnum(s string, fixed bool) (int, string, error) { return int(s[0]-'0')*10 + int(s[1]-'0'), s[2:], nil } +// getnum3 parses s[0:1], s[0:2], or s[0:3] (fixed forces s[0:3]) +// as a decimal integer and returns the integer and the remainder +// of the string. +func getnum3(s string, fixed bool) (int, string, error) { + var n, i int + for i = 0; i < 3 && isDigit(s, i); i++ { + n = n*10 + int(s[i]-'0') + } + if i == 0 || fixed && i != 3 { + return 0, s, errBad + } + return n, s[i:], nil +} + func cutspace(s string) string { for len(s) > 0 && s[0] == ' ' { s = s[1:] @@ -792,8 +830,9 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) // Time being constructed. var ( year int - month int = 1 // January - day int = 1 + month int = -1 + day int = -1 + yday int = -1 hour int min int sec int @@ -861,10 +900,17 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) value = value[1:] } day, value, err = getnum(value, std == stdZeroDay) - if day < 0 { - // Note that we allow any one- or two-digit day here. - rangeErrString = "day" + // Note that we allow any one- or two-digit day here. + // The month, day, year combination is validated after we've completed parsing. + case stdUnderYearDay, stdZeroYearDay: + for i := 0; i < 2; i++ { + if std == stdUnderYearDay && len(value) > 0 && value[0] == ' ' { + value = value[1:] + } } + yday, value, err = getnum3(value, std == stdZeroYearDay) + // Note that we allow any one-, two-, or three-digit year-day here. + // The year-day, year combination is validated after we've completed parsing. case stdHour: hour, value, err = getnum(value, false) if hour < 0 || 24 <= hour { @@ -1044,6 +1090,47 @@ func parse(layout, value string, defaultLocation, local *Location) (Time, error) hour = 0 } + // Convert yday to day, month. + if yday >= 0 { + var d int + var m int + if isLeap(year) { + if yday == 31+29 { + m = int(February) + d = 29 + } else if yday > 31+29 { + yday-- + } + } + if yday < 1 || yday > 365 { + return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year out of range"} + } + if m == 0 { + m = yday/31 + 1 + if int(daysBefore[m]) < yday { + m++ + } + d = yday - int(daysBefore[m-1]) + } + // If month, day already seen, yday's m, d must match. + // Otherwise, set them from m, d. + if month >= 0 && month != m { + return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year does not match month"} + } + month = m + if day >= 0 && day != d { + return Time{}, &ParseError{alayout, avalue, "", value, ": day-of-year does not match day"} + } + day = d + } else { + if month < 0 { + month = int(January) + } + if day < 0 { + day = 1 + } + } + // Validate the day of the month. if day < 1 || day > daysIn(Month(month), year) { return Time{}, &ParseError{alayout, avalue, "", value, ": day out of range"} diff --git a/src/time/format_test.go b/src/time/format_test.go index db9d4f495a..516099266c 100644 --- a/src/time/format_test.go +++ b/src/time/format_test.go @@ -13,6 +13,60 @@ import ( . "time" ) +var nextStdChunkTests = []string{ + "(2006)-(01)-(02)T(15):(04):(05)(Z07:00)", + "(2006)-(01)-(02) (002) (15):(04):(05)", + "(2006)-(01) (002) (15):(04):(05)", + "(2006)-(002) (15):(04):(05)", + "(2006)(002)(01) (15):(04):(05)", + "(2006)(002)(04) (15):(04):(05)", +} + +func TestNextStdChunk(t *testing.T) { + // Most bugs in Parse or Format boil down to problems with + // the exact detection of format chunk boundaries in the + // helper function nextStdChunk (here called as NextStdChunk). + // This test checks nextStdChunk's behavior directly, + // instead of needing to test it only indirectly through Parse/Format. + + // markChunks returns format with each detected + // 'format chunk' parenthesized. + // For example showChunks("2006-01-02") == "(2006)-(01)-(02)". + markChunks := func(format string) string { + // Note that NextStdChunk and StdChunkNames + // are not part of time's public API. + // They are exported in export_test for this test. + out := "" + for s := format; s != ""; { + prefix, std, suffix := NextStdChunk(s) + out += prefix + if std > 0 { + out += "(" + StdChunkNames[std] + ")" + } + s = suffix + } + return out + } + + noParens := func(r rune) rune { + if r == '(' || r == ')' { + return -1 + } + return r + } + + for _, marked := range nextStdChunkTests { + // marked is an expected output from markChunks. + // If we delete the parens and pass it through markChunks, + // we should get the original back. + format := strings.Map(noParens, marked) + out := markChunks(format) + if out != marked { + t.Errorf("nextStdChunk parses %q as %q, want %q", format, out, marked) + } + } +} + type TimeFormatTest struct { time Time formattedValue string @@ -61,6 +115,7 @@ var formatTests = []FormatTest{ {"StampMilli", StampMilli, "Feb 4 21:00:57.012"}, {"StampMicro", StampMicro, "Feb 4 21:00:57.012345"}, {"StampNano", StampNano, "Feb 4 21:00:57.012345600"}, + {"YearDay", "Jan 2 002 __2 2", "Feb 4 035 35 4"}, } func TestFormat(t *testing.T) { @@ -180,6 +235,13 @@ var parseTests = []ParseTest{ {"", "Jan _2 15:04:05.999", "Feb 4 21:00:57.012345678", false, false, -1, 9}, {"", "Jan _2 15:04:05.999999999", "Feb 4 21:00:57.0123", false, false, -1, 4}, {"", "Jan _2 15:04:05.999999999", "Feb 4 21:00:57.012345678", false, false, -1, 9}, + + // Day of year. + {"", "2006-01-02 002 15:04:05", "2010-02-04 035 21:00:57", false, false, 1, 0}, + {"", "2006-01 002 15:04:05", "2010-02 035 21:00:57", false, false, 1, 0}, + {"", "2006-002 15:04:05", "2010-035 21:00:57", false, false, 1, 0}, + {"", "200600201 15:04:05", "201003502 21:00:57", false, false, 1, 0}, + {"", "200600204 15:04:05", "201003504 21:00:57", false, false, 1, 0}, } func TestParse(t *testing.T) { @@ -485,6 +547,10 @@ var parseErrorTests = []ParseErrorTest{ // issue 21113 {"_2 Jan 06 15:04 MST", "4 --- 00 00:00 GMT", "cannot parse"}, {"_2 January 06 15:04 MST", "4 --- 00 00:00 GMT", "cannot parse"}, + + // invalid or mismatched day-of-year + {"Jan _2 002 2006", "Feb 4 034 2006", "day-of-year does not match day"}, + {"Jan _2 002 2006", "Feb 4 004 2006", "day-of-year does not match month"}, } func TestParseErrors(t *testing.T) { diff --git a/src/time/time_test.go b/src/time/time_test.go index 432a67dec3..76924e36f3 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -522,13 +522,28 @@ var yearDayLocations = []*Location{ } func TestYearDay(t *testing.T) { - for _, loc := range yearDayLocations { + for i, loc := range yearDayLocations { for _, ydt := range yearDayTests { dt := Date(ydt.year, Month(ydt.month), ydt.day, 0, 0, 0, 0, loc) yday := dt.YearDay() if yday != ydt.yday { - t.Errorf("got %d, expected %d for %d-%02d-%02d in %v", - yday, ydt.yday, ydt.year, ydt.month, ydt.day, loc) + t.Errorf("Date(%d-%02d-%02d in %v).YearDay() = %d, want %d", + ydt.year, ydt.month, ydt.day, loc, yday, ydt.yday) + continue + } + + if ydt.year < 0 || ydt.year > 9999 { + continue + } + f := fmt.Sprintf("%04d-%02d-%02d %03d %+.2d00", + ydt.year, ydt.month, ydt.day, ydt.yday, (i-2)*4) + dt1, err := Parse("2006-01-02 002 -0700", f) + if err != nil { + t.Errorf(`Parse("2006-01-02 002 -0700", %q): %v`, f, err) + continue + } + if !dt1.Equal(dt) { + t.Errorf(`Parse("2006-01-02 002 -0700", %q) = %v, want %v`, f, dt1, dt) } } } -- GitLab From e341bae08d75611adea6566c1d01c1e3a0de57f9 Mon Sep 17 00:00:00 2001 From: Cezar Sa Espinola Date: Thu, 7 Mar 2019 12:52:16 -0300 Subject: [PATCH 0349/1679] net: use network and host as singleflight key during lookupIP In CL 120215 the cgo resolver was changed to have different logic based on the network being queried. However, the singleflight cache key wasn't updated to also include the network. This way it was possible for concurrent queries to return the result for the wrong network. This CL changes the key to include both network and host, fixing the problem. Fixes #30521 Change-Id: I8b41b0ce1d9a02d18876c43e347654312eba22fc Reviewed-on: https://go-review.googlesource.com/c/go/+/166037 Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor Run-TryBot: Brad Fitzpatrick --- src/net/lookup.go | 5 ++-- src/net/lookup_test.go | 64 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/net/lookup.go b/src/net/lookup.go index e10889331e..08e8d01385 100644 --- a/src/net/lookup.go +++ b/src/net/lookup.go @@ -262,8 +262,9 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP // only the values in context. See Issue 28600. lookupGroupCtx, lookupGroupCancel := context.WithCancel(withUnexpiredValuesPreserved(ctx)) + lookupKey := network + "\000" + host dnsWaitGroup.Add(1) - ch, called := r.getLookupGroup().DoChan(host, func() (interface{}, error) { + ch, called := r.getLookupGroup().DoChan(lookupKey, func() (interface{}, error) { defer dnsWaitGroup.Done() return testHookLookupIP(lookupGroupCtx, resolverFunc, network, host) }) @@ -280,7 +281,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP // let the lookup continue uncanceled, and let later // lookups with the same key share the result. // See issues 8602, 20703, 22724. - if r.getLookupGroup().ForgetUnshared(host) { + if r.getLookupGroup().ForgetUnshared(lookupKey) { lookupGroupCancel() } else { go func() { diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index 85bcb2b896..1c0a4509c8 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -16,6 +16,7 @@ import ( "sort" "strings" "sync" + "sync/atomic" "testing" "time" ) @@ -1096,6 +1097,69 @@ func TestLookupIPAddrPreservesContextValues(t *testing.T) { } } +// Issue 30521: The lookup group should call the resolver for each network. +func TestLookupIPAddrConcurrentCallsForNetworks(t *testing.T) { + origTestHookLookupIP := testHookLookupIP + defer func() { testHookLookupIP = origTestHookLookupIP }() + + queries := [][]string{ + {"udp", "golang.org"}, + {"udp4", "golang.org"}, + {"udp6", "golang.org"}, + {"udp", "golang.org"}, + {"udp", "golang.org"}, + } + results := map[[2]string][]IPAddr{ + {"udp", "golang.org"}: { + {IP: IPv4(127, 0, 0, 1)}, + {IP: IPv6loopback}, + }, + {"udp4", "golang.org"}: { + {IP: IPv4(127, 0, 0, 1)}, + }, + {"udp6", "golang.org"}: { + {IP: IPv6loopback}, + }, + } + calls := int32(0) + waitCh := make(chan struct{}) + testHookLookupIP = func(ctx context.Context, fn func(context.Context, string, string) ([]IPAddr, error), network, host string) ([]IPAddr, error) { + // We'll block until this is called one time for each different + // expected result. This will ensure that the lookup group would wait + // for the existing call if it was to be reused. + if atomic.AddInt32(&calls, 1) == int32(len(results)) { + close(waitCh) + } + select { + case <-waitCh: + case <-ctx.Done(): + return nil, ctx.Err() + } + return results[[2]string{network, host}], nil + } + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + wg := sync.WaitGroup{} + for _, q := range queries { + network := q[0] + host := q[1] + wg.Add(1) + go func() { + defer wg.Done() + gotIPs, err := DefaultResolver.lookupIPAddr(ctx, network, host) + if err != nil { + t.Errorf("lookupIPAddr(%v, %v): unexpected error: %v", network, host, err) + } + wantIPs := results[[2]string{network, host}] + if !reflect.DeepEqual(gotIPs, wantIPs) { + t.Errorf("lookupIPAddr(%v, %v): mismatched IPAddr results\n\tGot: %v\n\tWant: %v", network, host, gotIPs, wantIPs) + } + }() + } + wg.Wait() +} + func TestWithUnexpiredValuesPreserved(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) -- GitLab From 6c6a0a1f2a30b78f8584e4aeff48b7c1bcc6dc6b Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Fri, 8 Mar 2019 13:48:00 +1100 Subject: [PATCH 0350/1679] encoding/gob: update documentation in doc.go for wireType It was just out of date. Fixes #30656 Change-Id: I1fab7dd93091865a8240769eca5dd19cdbc78b81 Reviewed-on: https://go-review.googlesource.com/c/go/+/166177 Reviewed-by: Brad Fitzpatrick --- src/encoding/gob/doc.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/encoding/gob/doc.go b/src/encoding/gob/doc.go index fa534313cc..c765707139 100644 --- a/src/encoding/gob/doc.go +++ b/src/encoding/gob/doc.go @@ -193,10 +193,14 @@ pair (-type id, encoded-type) where encoded-type is the gob encoding of a wireTy description, constructed from these types: type wireType struct { - ArrayT *ArrayType - SliceT *SliceType - StructT *StructType - MapT *MapType + ArrayT *ArrayType + SliceT *SliceType + StructT *StructType + MapT *MapType + GobEncoderT *gobEncoderType + BinaryMarshalerT *gobEncoderType + TextMarshalerT *gobEncoderType + } type arrayType struct { CommonType @@ -224,6 +228,9 @@ description, constructed from these types: Key typeId Elem typeId } + type gobEncoderType struct { + CommonType + } If there are nested type ids, the types for all inner type ids must be defined before the top-level type id is used to describe an encoded-v. -- GitLab From 055f16a9e9fb7ba7e1360b40e5924cc7ba95317c Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Fri, 8 Mar 2019 11:56:16 +0530 Subject: [PATCH 0351/1679] cmd/doc: add a line gap after a method with no comment Fixes #30492 Change-Id: Iec658bdf8bfac21e1bcc3eed900722cc535ec00a Reviewed-on: https://go-review.googlesource.com/c/go/+/166178 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/doc/doc_test.go | 1 + src/cmd/doc/pkg.go | 3 +++ src/cmd/doc/testdata/pkg.go | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/src/cmd/doc/doc_test.go b/src/cmd/doc/doc_test.go index 0761c6ddb3..5532cf537d 100644 --- a/src/cmd/doc/doc_test.go +++ b/src/cmd/doc/doc_test.go @@ -496,6 +496,7 @@ var tests = []test{ `func ReturnExported\(\) ExportedType`, `func \(ExportedType\) ExportedMethod\(a int\) bool`, `Comment about exported method.`, + `func \(ExportedType\) Uncommented\(a int\) bool\n\n`, // Ensure line gap after method with no comment }, []string{ `unexportedType`, diff --git a/src/cmd/doc/pkg.go b/src/cmd/doc/pkg.go index 7c4e00767d..e3a44c4283 100644 --- a/src/cmd/doc/pkg.go +++ b/src/cmd/doc/pkg.go @@ -808,6 +808,9 @@ func (pkg *Package) typeDoc(typ *doc.Type) { for _, fun := range funcs { if isExported(fun.Name) { pkg.emit(fun.Doc, fun.Decl) + if fun.Doc == "" { + pkg.newlines(2) + } } } } else { diff --git a/src/cmd/doc/testdata/pkg.go b/src/cmd/doc/testdata/pkg.go index 50105b5fcc..88e8c215d0 100644 --- a/src/cmd/doc/testdata/pkg.go +++ b/src/cmd/doc/testdata/pkg.go @@ -80,6 +80,10 @@ func (ExportedType) ExportedMethod(a int) bool { return true != true } +func (ExportedType) Uncommented(a int) bool { + return true != true +} + // Comment about unexported method. func (ExportedType) unexportedMethod(a int) bool { return true -- GitLab From 9153a3ef059a37796dceea555785b695ecbd4189 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 7 Mar 2019 08:33:01 +0100 Subject: [PATCH 0352/1679] cmd/cgo: adjust comment about ignored pragma warnings The warnings are not strictly tied to FreeBSD but to the clang version. People could still be building with an old version of clang even if not on FreeBSD. The -Wpragmas and -Waddress-of-packed-member warnings were introduced in clang 4.0, so also adjust the comment accordingly. This was discussed as part of CL 160777 which introduced these comments. Updates #27619 Change-Id: I4988ffd08797dcc72cdc264d4abd20a114f70473 Reviewed-on: https://go-review.googlesource.com/c/go/+/165800 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Yuval Pavel Zholkover Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/out.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index bb0d016fa5..d00c990d63 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -777,8 +777,8 @@ func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) { fmt.Fprintf(fgcc, "#include \"_cgo_export.h\"\n\n") // We use packed structs, but they are always aligned. - // The pragmas and address-of-packed-member are not recognized as warning groups in clang 3.4.1, so ignore unknown pragmas first. - // remove as part of #27619 (all: drop support for FreeBSD 10). + // The pragmas and address-of-packed-member are only recognized as + // warning groups in clang 4.0+, so ignore unknown pragmas first. fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n") fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Wpragmas\"\n") fmt.Fprintf(fgcc, "#pragma GCC diagnostic ignored \"-Waddress-of-packed-member\"\n") @@ -1480,10 +1480,11 @@ __cgo_size_assert(double, 8) extern char* _cgo_topofstack(void); -/* We use packed structs, but they are always aligned. */ -/* The pragmas and address-of-packed-member are not recognized as warning groups in clang 3.4.1, so ignore unknown pragmas first. */ -/* remove as part of #27619 (all: drop support for FreeBSD 10). */ - +/* + We use packed structs, but they are always aligned. + The pragmas and address-of-packed-member are only recognized as warning + groups in clang 4.0+, so ignore unknown pragmas first. +*/ #pragma GCC diagnostic ignored "-Wunknown-pragmas" #pragma GCC diagnostic ignored "-Wpragmas" #pragma GCC diagnostic ignored "-Waddress-of-packed-member" -- GitLab From d5e0b898a5df047ce010540767bd7bdd7d9a3fae Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 6 Mar 2019 13:51:43 -0500 Subject: [PATCH 0353/1679] cmd/go: convert TestACL to a script test Change-Id: Id25db146a317f2c5f5425cfabf4c3ca84066d5c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/165752 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Alex Brainman --- src/cmd/go/go_windows_test.go | 74 ------------------- .../go/testdata/script/build_acl_windows.txt | 44 +++++++++++ 2 files changed, 44 insertions(+), 74 deletions(-) create mode 100644 src/cmd/go/testdata/script/build_acl_windows.txt diff --git a/src/cmd/go/go_windows_test.go b/src/cmd/go/go_windows_test.go index a8cfffea79..d65d91f712 100644 --- a/src/cmd/go/go_windows_test.go +++ b/src/cmd/go/go_windows_test.go @@ -5,7 +5,6 @@ package main import ( - "fmt" "internal/testenv" "io/ioutil" "os" @@ -47,76 +46,3 @@ func TestAbsolutePath(t *testing.T) { t.Fatalf("wrong output found: %v %v", err, string(output)) } } - -func runIcacls(t *testing.T, args ...string) string { - t.Helper() - out, err := exec.Command("icacls", args...).CombinedOutput() - if err != nil { - t.Fatalf("icacls failed: %v\n%v", err, string(out)) - } - return string(out) -} - -func runGetACL(t *testing.T, path string) string { - t.Helper() - cmd := fmt.Sprintf(`Get-Acl "%s" | Select -expand AccessToString`, path) - out, err := exec.Command("powershell", "-Command", cmd).CombinedOutput() - if err != nil { - t.Fatalf("Get-Acl failed: %v\n%v", err, string(out)) - } - return string(out) -} - -// For issue 22343: verify that executable file created by "go build" command -// has discretionary access control list (DACL) set as if the file -// was created in the destination directory. -func TestACL(t *testing.T) { - t.Parallel() - - tmpdir, err := ioutil.TempDir("", "TestACL") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpdir) - - newtmpdir := filepath.Join(tmpdir, "tmp") - err = os.Mkdir(newtmpdir, 0777) - if err != nil { - t.Fatal(err) - } - - // When TestACL/tmp directory is created, it will have - // the same security attributes as TestACL. - // Add Guest account full access to TestACL/tmp - this - // will make all files created in TestACL/tmp have different - // security attributes to the files created in TestACL. - runIcacls(t, newtmpdir, - "/grant", "*S-1-5-32-546:(oi)(ci)f", // add Guests group to have full access - ) - - src := filepath.Join(tmpdir, "main.go") - err = ioutil.WriteFile(src, []byte("package main; func main() { }\n"), 0644) - if err == nil { - err = ioutil.WriteFile(filepath.Join(tmpdir, "go.mod"), []byte("module TestACL\n"), 0644) - } - if err != nil { - t.Fatal(err) - } - - exe := filepath.Join(tmpdir, "main.exe") - cmd := exec.Command(testenv.GoToolPath(t), "build", "-o", exe, src) - cmd.Dir = tmpdir - cmd.Env = append(os.Environ(), - "TMP="+newtmpdir, - "TEMP="+newtmpdir, - ) - out, err := cmd.CombinedOutput() - if err != nil { - t.Fatalf("go command failed: %v\n%v", err, string(out)) - } - - // exe file is expected to have the same security attributes as the src. - if got, expected := runGetACL(t, exe), runGetACL(t, src); got != expected { - t.Fatalf("expected Get-Acl output of \n%v\n, got \n%v\n", expected, got) - } -} diff --git a/src/cmd/go/testdata/script/build_acl_windows.txt b/src/cmd/go/testdata/script/build_acl_windows.txt new file mode 100644 index 0000000000..13a3ba226a --- /dev/null +++ b/src/cmd/go/testdata/script/build_acl_windows.txt @@ -0,0 +1,44 @@ +[!windows] stop +[!exec:icacls] skip +[!exec:powershell] skip + +# Create $WORK\guest and give the Guests group full access. +# Files created within that directory will have different security attributes by default. +mkdir $WORK\guest +exec icacls $WORK\guest /grant '*S-1-5-32-546:(oi)(ci)f' + +env TMP=$WORK\guest +env TEMP=$WORK\guest + +# Build a binary using the guest directory as an intermediate +cd TestACL +go build -o main.exe main.go +# Build the same binary, but write it to the guest directory. +go build -o $TMP\main.exe main.go + +# Read ACLs for the files. +exec powershell -Command 'Get-Acl main.exe | Select -expand AccessToString' +cp stdout $WORK\exe-acl.txt +exec powershell -Command 'Get-Acl main.go | Select -expand AccessToString' +cp stdout $WORK\src-acl.txt +cd $TMP +exec powershell -Command 'Get-Acl main.exe | Select -expand AccessToString' +cp stdout $WORK\guest-acl.txt + +cd $WORK + +# The executable written to the source directory should have the same ACL as the source file. +cmp $WORK\exe-acl.txt $WORK\src-acl.txt + +# The file written to the guest-allowed directory should give Guests control. +grep 'BUILTIN\\Guests\s+Allow' $WORK\guest-acl.txt + +# The file written to the ordinary directory should not. +! grep 'BUILTIN\\Guests\s+Allow' $WORK\exe-acl.txt + + +-- TestACL/go.mod -- +module TestACL +-- TestACL/main.go -- +package main +func main() {} -- GitLab From 3f3d604a7aa2194ac25ce74c686ad6da3a25cb63 Mon Sep 17 00:00:00 2001 From: Marat Khabibullin Date: Fri, 15 Feb 2019 13:22:36 +0000 Subject: [PATCH 0354/1679] go/cmd, crypto/x509, net/textproto, html/template: fix minor issues with nil values Remove redundant checks for nil value, add missing nil checks to prevent tests from failing with 'nil pointer dereference'. Fixes #30208. Change-Id: I59091ba4014afcb5300567fd7e73fea43c6bb2ee GitHub-Last-Rev: 20501470bbb8ad8fd60f6f87b4594ab64fcfdff1 GitHub-Pull-Request: golang/go#30226 Reviewed-on: https://go-review.googlesource.com/c/go/+/162657 Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/exec.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 3a7d3fe767..62ae01e555 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -104,9 +104,7 @@ func (b *Builder) Do(root *Action) { var err error if a.Func != nil && (!a.Failed || a.IgnoreFail) { - if err == nil { - err = a.Func(b, a) - } + err = a.Func(b, a) } // The actions run in parallel but all the updates to the -- GitLab From b4baa8dd1d8bc1d65e80e88c294729554bab72b8 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 8 Mar 2019 11:36:31 +0100 Subject: [PATCH 0355/1679] bytes: add benchmark for LastIndex Add BenchmarkLastIndexHard[1-3] in preparation for implementing LastIndex using Rabin-Karp akin to strings.LastIndex BenchmarkLastIndexHard1-8 500 3162694 ns/op BenchmarkLastIndexHard2-8 500 3170475 ns/op BenchmarkLastIndexHard3-8 500 3051127 ns/op Change-Id: Id99f85f9640e248958f2b4be4dfd8c974e3b50e7 Reviewed-on: https://go-review.googlesource.com/c/go/+/166257 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/bytes/bytes_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index f4c0ffd2a9..80a54f6118 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -1642,6 +1642,16 @@ func makeBenchInputHard() []byte { var benchInputHard = makeBenchInputHard() +func benchmarkLastIndexHard(b *testing.B, sep []byte) { + for i := 0; i < b.N; i++ { + LastIndex(benchInputHard, sep) + } +} + +func BenchmarkLastIndexHard1(b *testing.B) { benchmarkLastIndexHard(b, []byte("<>")) } +func BenchmarkLastIndexHard2(b *testing.B) { benchmarkLastIndexHard(b, []byte("")) } +func BenchmarkLastIndexHard3(b *testing.B) { benchmarkLastIndexHard(b, []byte("hello world")) } + func BenchmarkSplitEmptySeparator(b *testing.B) { for i := 0; i < b.N; i++ { Split(benchInputHard, nil) -- GitLab From ce7534ff06df5b3148aa325deedcb94ac5b30ec0 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 8 Mar 2019 11:39:08 +0100 Subject: [PATCH 0356/1679] bytes: use Rabin-Karp algorithm for LastIndex MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement LastIndex using the Rabin-Karp algorithm akin to strings.LastIndex name old time/op new time/op delta LastIndexHard1-8 3.16ms ± 1% 1.44ms ± 0% -54.35% (p=0.008 n=5+5) LastIndexHard2-8 3.17ms ± 1% 1.45ms ± 0% -54.27% (p=0.008 n=5+5) LastIndexHard3-8 3.05ms ± 1% 1.44ms ± 1% -52.58% (p=0.008 n=5+5) Change-Id: Ie8ddd179cd84dfa00e3e4e2327ef932975c88670 Reviewed-on: https://go-review.googlesource.com/c/go/+/166258 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/bytes/bytes.go | 47 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index daf4a32f26..f65bf214cc 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -114,12 +114,34 @@ func indexBytePortable(s []byte, c byte) int { // LastIndex returns the index of the last instance of sep in s, or -1 if sep is not present in s. func LastIndex(s, sep []byte) int { n := len(sep) - if n == 0 { + switch { + case n == 0: return len(s) + case n == 1: + return LastIndexByte(s, sep[0]) + case n == len(s): + if Equal(s, sep) { + return 0 + } + return -1 + case n > len(s): + return -1 } - c := sep[0] - for i := len(s) - n; i >= 0; i-- { - if s[i] == c && (n == 1 || Equal(s[i:i+n], sep)) { + // Rabin-Karp search from the end of the string + hashss, pow := hashStrRev(sep) + last := len(s) - n + var h uint32 + for i := len(s) - 1; i >= last; i-- { + h = h*primeRK + uint32(s[i]) + } + if h == hashss && Equal(s[last:], sep) { + return last + } + for i := last - 1; i >= 0; i-- { + h *= primeRK + h += uint32(s[i]) + h -= pow * uint32(s[i+n]) + if h == hashss && Equal(s[i:i+n], sep) { return i } } @@ -987,3 +1009,20 @@ func hashStr(sep []byte) (uint32, uint32) { } return hash, pow } + +// hashStrRev returns the hash of the reverse of sep and the +// appropriate multiplicative factor for use in Rabin-Karp algorithm. +func hashStrRev(sep []byte) (uint32, uint32) { + hash := uint32(0) + for i := len(sep) - 1; i >= 0; i-- { + hash = hash*primeRK + uint32(sep[i]) + } + var pow, sq uint32 = 1, primeRK + for i := len(sep); i > 0; i >>= 1 { + if i&1 != 0 { + pow *= sq + } + sq *= sq + } + return hash, pow +} -- GitLab From 49662bc6b02810389c66b6b24576f6a5b217d471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 5 Mar 2019 20:44:29 +0000 Subject: [PATCH 0357/1679] all: simplify multiple for loops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If a for loop has a simple condition and begins with a simple "if x { break; }"; we can simply add "!x" to the loop's condition. While at it, simplify a few assignments to use the common pattern "x := staticDefault; if cond { x = otherValue(); }". Finally, simplify a couple of var declarations. Change-Id: I413982c6abd32905adc85a9a666cb3819139c19f Reviewed-on: https://go-review.googlesource.com/c/go/+/165342 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/compile/internal/gc/pgen.go | 4 +--- src/cmd/compile/internal/gc/reflect.go | 4 +--- src/cmd/compile/internal/gc/walk.go | 4 +--- src/cmd/compile/internal/ssa/schedule.go | 6 +----- src/cmd/internal/obj/pass.go | 5 +---- src/cmd/link/internal/ld/elf.go | 4 +--- src/encoding/json/encode.go | 3 +-- src/encoding/json/stream_test.go | 2 +- src/internal/reflectlite/type.go | 5 +---- src/reflect/type.go | 5 +---- src/runtime/traceback.go | 5 +---- src/runtime/type.go | 5 +---- src/text/template/funcs.go | 4 +--- 13 files changed, 13 insertions(+), 43 deletions(-) diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 6914e3c5f8..5b9b6ce45e 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -553,11 +553,9 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, [] decls, vars, selected = createSimpleVars(automDecls) } - var dcl []*Node + dcl := automDecls if fnsym.WasInlined() { dcl = preInliningDcls(fnsym) - } else { - dcl = automDecls } // If optimization is enabled, the list above will typically be diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 8b058330dd..03fbbb123d 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -477,12 +477,10 @@ func dimportpath(p *types.Pkg) { return } - var str string + str := p.Path if p == localpkg { // Note: myimportpath != "", or else dgopkgpath won't call dimportpath. str = myimportpath - } else { - str = p.Path } s := Ctxt.Lookup("type..importpath." + p.Prefix + ".") diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 41a9d8e9dc..77f578197c 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -3116,11 +3116,9 @@ func walkcompare(n *Node, init *Nodes) *Node { if l != nil { // Handle both == and !=. eq := n.Op - var andor Op + andor := OOROR if eq == OEQ { andor = OANDAND - } else { - andor = OOROR } // Check for types equal. // For empty interface, this is: diff --git a/src/cmd/compile/internal/ssa/schedule.go b/src/cmd/compile/internal/ssa/schedule.go index c5b4c53843..ca0e82953e 100644 --- a/src/cmd/compile/internal/ssa/schedule.go +++ b/src/cmd/compile/internal/ssa/schedule.go @@ -233,14 +233,10 @@ func schedule(f *Func) { // Schedule highest priority value, update use counts, repeat. order = order[:0] tuples := make(map[ID][]*Value) - for { + for priq.Len() > 0 { // Find highest priority schedulable value. // Note that schedule is assembled backwards. - if priq.Len() == 0 { - break - } - v := heap.Pop(priq).(*Value) // Add it to the schedule. diff --git a/src/cmd/internal/obj/pass.go b/src/cmd/internal/obj/pass.go index 87de6a5fd1..0c401710f6 100644 --- a/src/cmd/internal/obj/pass.go +++ b/src/cmd/internal/obj/pass.go @@ -141,10 +141,7 @@ func linkpatch(ctxt *Link, sym *LSym, newprog ProgAlloc) { continue } q := sym.Func.Text - for q != nil { - if p.To.Offset == q.Pc { - break - } + for q != nil && p.To.Offset != q.Pc { if q.Forwd != nil && p.To.Offset >= q.Forwd.Pc { q = q.Forwd } else { diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 19bcbbb87a..3995a9423d 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -1290,11 +1290,9 @@ func elfshreloc(arch *sys.Arch, sect *sym.Section) *ElfShdr { return nil } - var typ int + typ := SHT_REL if elfRelType == ".rela" { typ = SHT_RELA - } else { - typ = SHT_REL } sh := elfshname(elfRelType + sect.Name) diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index de6d2632f4..e3c5ffc9cb 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -1069,8 +1069,7 @@ func typeFields(t reflect.Type) []field { next := []field{{typ: t}} // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} + var count, nextCount map[reflect.Type]int // Types already visited at an earlier level. visited := map[reflect.Type]bool{} diff --git a/src/encoding/json/stream_test.go b/src/encoding/json/stream_test.go index aaf32e0a24..8dc74e5466 100644 --- a/src/encoding/json/stream_test.go +++ b/src/encoding/json/stream_test.go @@ -296,7 +296,7 @@ type decodeThis struct { v interface{} } -var tokenStreamCases []tokenStreamCase = []tokenStreamCase{ +var tokenStreamCases = []tokenStreamCase{ // streaming token cases {json: `10`, expTokens: []interface{}{float64(10)}}, {json: ` [10] `, expTokens: []interface{}{ diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go index 35bc0db2c7..70c3723de7 100644 --- a/src/internal/reflectlite/type.go +++ b/src/internal/reflectlite/type.go @@ -510,10 +510,7 @@ func (t *rtype) Name() string { } s := t.String() i := len(s) - 1 - for i >= 0 { - if s[i] == '.' { - break - } + for i >= 0 && s[i] != '.' { i-- } return s[i+1:] diff --git a/src/reflect/type.go b/src/reflect/type.go index 5c7ed243d5..b1df4f22fc 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -875,10 +875,7 @@ func (t *rtype) Name() string { } s := t.String() i := len(s) - 1 - for i >= 0 { - if s[i] == '.' { - break - } + for i >= 0 && s[i] != '.' { i-- } return s[i+1:] diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index a536fb2a71..0bb7fc2831 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -1289,10 +1289,7 @@ func printCgoTraceback(callers *cgoCallers) { func printOneCgoTraceback(pc uintptr, max int, arg *cgoSymbolizerArg) int { c := 0 arg.pc = pc - for { - if c > max { - break - } + for c <= max { callCgoSymbolizer(arg) if arg.funcName != nil { // Note that we don't print any argument diff --git a/src/runtime/type.go b/src/runtime/type.go index f7f99924ea..dc7f62eff7 100644 --- a/src/runtime/type.go +++ b/src/runtime/type.go @@ -118,10 +118,7 @@ func (t *_type) name() string { } s := t.string() i := len(s) - 1 - for i >= 0 { - if s[i] == '.' { - break - } + for i >= 0 && s[i] != '.' { i-- } return s[i+1:] diff --git a/src/text/template/funcs.go b/src/text/template/funcs.go index 72d3f66691..a626247c2c 100644 --- a/src/text/template/funcs.go +++ b/src/text/template/funcs.go @@ -263,11 +263,9 @@ func call(fn reflect.Value, args ...reflect.Value) (reflect.Value, error) { for i, arg := range args { value := indirectInterface(arg) // Compute the expected type. Clumsy because of variadics. - var argType reflect.Type + argType := dddType if !typ.IsVariadic() || i < numIn-1 { argType = typ.In(i) - } else { - argType = dddType } var err error -- GitLab From 361a01983f01790694d5c7773d56a560c01b96cb Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 5 Mar 2019 16:52:48 -0500 Subject: [PATCH 0358/1679] cmd/api: use 'go list' to locate transitive dependencies of std With standard-library modules and vendoring, the mapping from import path to directory within the standard library is no longer entirely trivial. Fortunately, 'go list' makes that mapping straightforward to compute. Updates #30241 Updates #30228 Change-Id: Iddd77c21a527b7acdb30c17bec8b4bbd43e23756 Reviewed-on: https://go-review.googlesource.com/c/go/+/165497 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/api/goapi.go | 84 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 60359229de..1a0242f60c 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -8,6 +8,7 @@ package main import ( "bufio" "bytes" + "encoding/json" "flag" "fmt" "go/ast" @@ -153,6 +154,7 @@ func main() { var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true for _, context := range contexts { w := NewWalker(context, filepath.Join(build.Default.GOROOT, "src")) + w.loadImports(pkgNames, w.context) for _, name := range pkgNames { // Vendored packages do not contribute to our @@ -349,12 +351,14 @@ func fileFeatures(filename string) []string { var fset = token.NewFileSet() type Walker struct { - context *build.Context - root string - scope []string - current *types.Package - features map[string]bool // set - imported map[string]*types.Package // packages already imported + context *build.Context + root string + scope []string + current *types.Package + features map[string]bool // set + imported map[string]*types.Package // packages already imported + importMap map[string]map[string]string // importer dir -> import path -> canonical path + importDir map[string]string // canonical import path -> dir } func NewWalker(context *build.Context, root string) *Walker { @@ -434,11 +438,74 @@ func tagKey(dir string, context *build.Context, tags []string) string { return key } +func (w *Walker) loadImports(paths []string, context *build.Context) { + if context == nil { + context = &build.Default + } + + var ( + tags = context.BuildTags + cgoEnabled = "0" + ) + if context.CgoEnabled { + tags = append(tags[:len(tags):len(tags)], "cgo") + cgoEnabled = "1" + } + + // TODO(golang.org/issue/29666): Request only the fields that we need. + cmd := exec.Command(goCmd(), "list", "-e", "-deps", "-json") + if len(tags) > 0 { + cmd.Args = append(cmd.Args, "-tags", strings.Join(tags, " ")) + } + cmd.Args = append(cmd.Args, paths...) + + cmd.Env = append(os.Environ(), + "GOOS="+context.GOOS, + "GOARCH="+context.GOARCH, + "CGO_ENABLED="+cgoEnabled, + ) + + stdout := new(bytes.Buffer) + cmd.Stdout = stdout + cmd.Stderr = new(strings.Builder) + err := cmd.Run() + if err != nil { + log.Fatalf("%s failed: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr) + } + + w.importDir = make(map[string]string) + w.importMap = make(map[string]map[string]string) + dec := json.NewDecoder(stdout) + for { + var pkg struct { + ImportPath, Dir string + ImportMap map[string]string + } + if err := dec.Decode(&pkg); err == io.EOF { + break + } else if err != nil { + log.Fatalf("%s: invalid output: %v", strings.Join(cmd.Args, " "), err) + } + + w.importDir[pkg.ImportPath] = pkg.Dir + w.importMap[pkg.Dir] = pkg.ImportMap + } +} + // Importing is a sentinel taking the place in Walker.imported // for a package that is in the process of being imported. var importing types.Package func (w *Walker) Import(name string) (*types.Package, error) { + return w.ImportFrom(name, "", 0) +} + +func (w *Walker) ImportFrom(fromPath, fromDir string, mode types.ImportMode) (*types.Package, error) { + name := fromPath + if canonical, ok := w.importMap[fromDir][fromPath]; ok { + name = canonical + } + pkg := w.imported[name] if pkg != nil { if pkg == &importing { @@ -449,7 +516,10 @@ func (w *Walker) Import(name string) (*types.Package, error) { w.imported[name] = &importing // Determine package files. - dir := filepath.Join(w.root, filepath.FromSlash(name)) + dir := w.importDir[name] + if dir == "" { + dir = filepath.Join(w.root, filepath.FromSlash(name)) + } if fi, err := os.Stat(dir); err != nil || !fi.IsDir() { log.Fatalf("no source in tree for import %q: %v", name, err) } -- GitLab From 10156b678336f7628a7f1fdd84ffe2a28d66969a Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 1 Mar 2019 17:20:28 -0500 Subject: [PATCH 0359/1679] cmd/go: avoid link errors when -coverpkg covers main packages The -coverpkg lets users specify a list of packages that should have coverage instrumentation. This may include packages not transitively imported by tests. For each tested package, the synthetic main package imports all covered packages so they can be registered with testing.RegisterCover. This makes it possible for a main package to import another main package. When we compile a package with p.Internal.BuildInfo set (set on main packages by Package.load in module mode), we set runtime/debug.modinfo. Multiple main packages may be passed to the linker because of the above scenario, so this causes duplicate symbol errors. This change copies p.Internal.BuildInfo to the synthetic main package instead of the internal test package. Additionally, it forces main packages imported by the synthetic test main package to be recompiled for testing. Recompiled packages won't have p.Internal.BuildInfo set. Fixes #30374 Change-Id: I06f028d55905039907940ec89d2835f5a1040203 Reviewed-on: https://go-review.googlesource.com/c/go/+/164877 Run-TryBot: Jay Conrod Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/test.go | 10 +++++ .../script/cover_pkgall_multiple_mains.txt | 37 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 0a9548e5c8..99a2247ede 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -129,6 +129,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag ptest.Internal.Imports = append(imports, p.Internal.Imports...) ptest.Internal.RawImports = str.StringList(rawTestImports, p.Internal.RawImports) ptest.Internal.ForceLibrary = true + ptest.Internal.BuildInfo = "" ptest.Internal.Build = new(build.Package) *ptest.Internal.Build = *p.Internal.Build m := map[string][]token.Position{} @@ -186,6 +187,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag }, Internal: PackageInternal{ Build: &build.Package{Name: "main"}, + BuildInfo: p.Internal.BuildInfo, Asmflags: p.Internal.Asmflags, Gcflags: p.Internal.Gcflags, Ldflags: p.Internal.Ldflags, @@ -352,6 +354,7 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) { copy(p1.Imports, p.Imports) p = p1 p.Target = "" + p.Internal.BuildInfo = "" } // Update p.Internal.Imports to use test copies. @@ -361,6 +364,13 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) { p.Internal.Imports[i] = p1 } } + + // Don't compile build info from a main package. This can happen + // if -coverpkg patterns include main packages, since those packages + // are imported by pmain. + if p.Internal.BuildInfo != "" && p != pmain { + split() + } } } diff --git a/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt b/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt new file mode 100644 index 0000000000..8ee4848d0a --- /dev/null +++ b/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt @@ -0,0 +1,37 @@ +# This test checks that multiple main packages can be tested +# with -coverpkg=all without duplicate symbol errors. +# Verifies golang.org/issue/30374. + +env GO111MODULE=on + +[short] skip + +go test -coverpkg=all ./main1 ./main2 + +-- go.mod -- +module example.com/cov + +-- main1/main1.go -- +package main + +func main() {} + +-- main1/main1_test.go -- +package main + +import "testing" + +func TestMain1(t *testing.T) {} + +-- main2/main2.go -- +package main + +func main() {} + +-- main2/main2_test.go -- +package main + +import "testing" + +func TestMain2(t *testing.T) {} + -- GitLab From 514c5593f0a76ffb86a44b9a5a839ed806d9c7fe Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 28 Feb 2019 16:04:43 -0500 Subject: [PATCH 0360/1679] go/build: change the search order for "vendor/" paths based on srcDir If srcDir is within GOROOT, prefer GOROOT. Otherwise, prefer GOPATH. The attached tests may seem a bit strange; they will make more sense in a followup CL. Updates #16333 Updates #30241 Updates #30228 Change-Id: Ic5f1334cce5e242d7f49080aba083bcf2080dee3 Reviewed-on: https://go-review.googlesource.com/c/go/+/164619 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- .../go/testdata/script/gopath_std_vendor.txt | 41 ++++++++++++++++ src/go/build/build.go | 48 +++++++++++++++---- 2 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 src/cmd/go/testdata/script/gopath_std_vendor.txt diff --git a/src/cmd/go/testdata/script/gopath_std_vendor.txt b/src/cmd/go/testdata/script/gopath_std_vendor.txt new file mode 100644 index 0000000000..d53744b9fa --- /dev/null +++ b/src/cmd/go/testdata/script/gopath_std_vendor.txt @@ -0,0 +1,41 @@ +env GO111MODULE=off + +[!gc] skip + +# A package importing 'net/http' should resolve its dependencies +# to the package 'vendor/golang.org/x/net/http2/hpack' within GOROOT. +cd importnethttp +go list -deps -f '{{.ImportPath}} {{.Dir}}' +stdout ^internal/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]internal[/\\]x[/\\]net[/\\]http2[/\\]hpack +! stdout $GOPATH[/\\]src[/\\]vendor + +# In the presence of $GOPATH/src/vendor/golang.org/x/net/http2/hpack, +# a package in GOPATH importing 'golang.org/x/net/http2/hpack' should +# resolve its dependencies in GOPATH/src. +cd ../issue16333 +go build . + +go list -deps -f '{{.ImportPath}} {{.Dir}}' . +stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack +! stdout $GOROOT[/\\]src[/\\]vendor + +go list -test -deps -f '{{.ImportPath}} {{.Dir}}' . +stdout $GOPATH[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack +! stdout $GOROOT[/\\]src[/\\]vendor + +-- issue16333/issue16333.go -- +package vendoring17 + +import _ "golang.org/x/net/http2/hpack" +-- issue16333/issue16333_test.go -- +package vendoring17 + +import _ "testing" +import _ "golang.org/x/net/http2/hpack" +-- importnethttp/http.go -- +package importnethttp + +import _ "net/http" +-- $GOPATH/src/vendor/golang.org/x/net/http2/hpack/hpack.go -- +package hpack diff --git a/src/go/build/build.go b/src/go/build/build.go index 94db198764..c8aa872bd2 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -647,18 +647,28 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa // Determine directory from import path. if ctxt.GOROOT != "" { - dir := ctxt.joinPath(ctxt.GOROOT, "src", path) - if ctxt.Compiler != "gccgo" { - isDir := ctxt.isDir(dir) - binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga)) - if isDir || binaryOnly { - p.Dir = dir - p.Goroot = true - p.Root = ctxt.GOROOT - goto Found + // If the package path starts with "vendor/", only search GOROOT before + // GOPATH if the importer is also within GOROOT. That way, if the user has + // vendored in a package that is subsequently included in the standard + // distribution, they'll continue to pick up their own vendored copy. + gorootFirst := srcDir == "" || !strings.HasPrefix(path, "vendor/") + if !gorootFirst { + _, gorootFirst = ctxt.hasSubdir(ctxt.GOROOT, srcDir) + } + if gorootFirst { + dir := ctxt.joinPath(ctxt.GOROOT, "src", path) + if ctxt.Compiler != "gccgo" { + isDir := ctxt.isDir(dir) + binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga)) + if isDir || binaryOnly { + p.Dir = dir + p.Goroot = true + p.Root = ctxt.GOROOT + goto Found + } } + tried.goroot = dir } - tried.goroot = dir } if ctxt.Compiler == "gccgo" && goroot.IsStandardPackage(ctxt.GOROOT, ctxt.Compiler, path) { p.Dir = ctxt.joinPath(ctxt.GOROOT, "src", path) @@ -678,6 +688,24 @@ func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Packa tried.gopath = append(tried.gopath, dir) } + // If we tried GOPATH first due to a "vendor/" prefix, fall back to GOPATH. + // That way, the user can still get useful results from 'go list' for + // standard-vendored paths passed on the command line. + if ctxt.GOROOT != "" && tried.goroot == "" { + dir := ctxt.joinPath(ctxt.GOROOT, "src", path) + if ctxt.Compiler != "gccgo" { + isDir := ctxt.isDir(dir) + binaryOnly = !isDir && mode&AllowBinary != 0 && pkga != "" && ctxt.isFile(ctxt.joinPath(ctxt.GOROOT, pkga)) + if isDir || binaryOnly { + p.Dir = dir + p.Goroot = true + p.Root = ctxt.GOROOT + goto Found + } + } + tried.goroot = dir + } + // package was not found var paths []string format := "\t%s (vendor tree)" -- GitLab From 1ab9f6837d6da80dad41657a913e47fa13a4fee8 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 7 Mar 2019 17:29:24 -0500 Subject: [PATCH 0361/1679] cmd/go/internal/modfetch: handle codeRoot == path for paths with major-version suffixes Fixes #30647 Change-Id: Icbcfdb3907bc003ac17a8c7df17ecb41daf82eb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/166117 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modfetch/coderepo.go | 100 +++++++++++++----- src/cmd/go/internal/modfetch/coderepo_test.go | 9 ++ 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index 54baaaa909..7aedf1d861 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -23,55 +23,99 @@ import ( type codeRepo struct { modPath string - code codehost.Repo + // code is the repository containing this module. + code codehost.Repo + // codeRoot is the import path at the root of code. codeRoot string - codeDir string + // codeDir is the directory (relative to root) at which we expect to find the module. + // If pathMajor is non-empty and codeRoot is not the full modPath, + // then we look in both codeDir and codeDir+modPath + codeDir string - path string - pathPrefix string - pathMajor string + // pathMajor is the suffix of modPath that indicates its major version, + // or the empty string if modPath is at major version 0 or 1. + // + // pathMajor is typically of the form "/vN", but possibly ".vN", or + // ".vN-unstable" for modules resolved using gopkg.in. + pathMajor string + // pathPrefix is the prefix of modPath that excludes pathMajor. + // It is used only for logging. + pathPrefix string + + // pseudoMajor is the major version prefix to use when generating + // pseudo-versions for this module, derived from the module path. + // + // TODO(golang.org/issue/29262): We can't distinguish v0 from v1 using the + // path alone: we have to compute it by examining the tags at a particular + // revision. pseudoMajor string } -func newCodeRepo(code codehost.Repo, root, path string) (Repo, error) { - if !hasPathPrefix(path, root) { - return nil, fmt.Errorf("mismatched repo: found %s for %s", root, path) +// newCodeRepo returns a Repo that reads the source code for the module with the +// given path, from the repo stored in code, with the root of the repo +// containing the path given by codeRoot. +func newCodeRepo(code codehost.Repo, codeRoot, path string) (Repo, error) { + if !hasPathPrefix(path, codeRoot) { + return nil, fmt.Errorf("mismatched repo: found %s for %s", codeRoot, path) } pathPrefix, pathMajor, ok := module.SplitPathVersion(path) if !ok { return nil, fmt.Errorf("invalid module path %q", path) } + if codeRoot == path { + pathPrefix = path + } pseudoMajor := "v0" if pathMajor != "" { pseudoMajor = pathMajor[1:] } + // Compute codeDir = bar, the subdirectory within the repo + // corresponding to the module root. + // // At this point we might have: - // codeRoot = github.com/rsc/foo // path = github.com/rsc/foo/bar/v2 + // codeRoot = github.com/rsc/foo // pathPrefix = github.com/rsc/foo/bar // pathMajor = /v2 // pseudoMajor = v2 // - // Compute codeDir = bar, the subdirectory within the repo - // corresponding to the module root. - codeDir := strings.Trim(strings.TrimPrefix(pathPrefix, root), "/") - if strings.HasPrefix(path, "gopkg.in/") { - // But gopkg.in is a special legacy case, in which pathPrefix does not start with codeRoot. - // For example we might have: - // codeRoot = gopkg.in/yaml.v2 - // pathPrefix = gopkg.in/yaml - // pathMajor = .v2 - // pseudoMajor = v2 - // codeDir = pathPrefix (because codeRoot is not a prefix of pathPrefix) - // Clear codeDir - the module root is the repo root for gopkg.in repos. - codeDir = "" + // which gives + // codeDir = bar + // + // We know that pathPrefix is a prefix of path, and codeRoot is a prefix of + // path, but codeRoot may or may not be a prefix of pathPrefix, because + // codeRoot may be the entire path (in which case codeDir should be empty). + // That occurs in two situations. + // + // One is when a go-import meta tag resolves the complete module path, + // including the pathMajor suffix: + // path = nanomsg.org/go/mangos/v2 + // codeRoot = nanomsg.org/go/mangos/v2 + // pathPrefix = nanomsg.org/go/mangos + // pathMajor = /v2 + // pseudoMajor = v2 + // + // The other is similar: for gopkg.in only, the major version is encoded + // with a dot rather than a slash, and thus can't be in a subdirectory. + // path = gopkg.in/yaml.v2 + // codeRoot = gopkg.in/yaml.v2 + // pathPrefix = gopkg.in/yaml + // pathMajor = .v2 + // pseudoMajor = v2 + // + codeDir := "" + if codeRoot != path { + if !hasPathPrefix(pathPrefix, codeRoot) { + return nil, fmt.Errorf("repository rooted at %s cannot contain module %s", codeRoot, path) + } + codeDir = strings.Trim(pathPrefix[len(codeRoot):], "/") } r := &codeRepo{ modPath: path, code: code, - codeRoot: root, + codeRoot: codeRoot, codeDir: codeDir, pathPrefix: pathPrefix, pathMajor: pathMajor, @@ -149,9 +193,6 @@ func (r *codeRepo) Stat(rev string) (*RevInfo, error) { return r.Latest() } codeRev := r.revToRev(rev) - if semver.IsValid(codeRev) && r.codeDir != "" { - codeRev = r.codeDir + "/" + codeRev - } info, err := r.code.Stat(codeRev) if err != nil { return nil, err @@ -290,7 +331,7 @@ func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err e found1 := err1 == nil && isMajor(mpath1, r.pathMajor) var file2 string - if r.pathMajor != "" && !strings.HasPrefix(r.pathMajor, ".") { + if r.pathMajor != "" && r.codeRoot != r.modPath && !strings.HasPrefix(r.pathMajor, ".") { // Suppose pathMajor is "/v2". // Either go.mod should claim v2 and v2/go.mod should not exist, // or v2/go.mod should exist and claim v2. Not both. @@ -298,6 +339,9 @@ func (r *codeRepo) findDir(version string) (rev, dir string, gomod []byte, err e // because of replacement modules. This might be a fork of // the real module, found at a different path, usable only in // a replace directive. + // + // TODO(bcmills): This doesn't seem right. Investigate futher. + // (Notably: why can't we replace foo/v2 with fork-of-foo/v3?) dir2 := path.Join(r.codeDir, r.pathMajor[1:]) file2 = path.Join(dir2, "go.mod") gomod2, err2 := r.code.ReadFile(rev, file2, codehost.MaxGoMod) @@ -418,7 +462,7 @@ func (r *codeRepo) Zip(dst io.Writer, version string) error { } defer dl.Close() if actualDir != "" && !hasPathPrefix(dir, actualDir) { - return fmt.Errorf("internal error: downloading %v %v: dir=%q but actualDir=%q", r.path, rev, dir, actualDir) + return fmt.Errorf("internal error: downloading %v %v: dir=%q but actualDir=%q", r.modPath, rev, dir, actualDir) } subdir := strings.Trim(strings.TrimPrefix(dir, actualDir), "/") diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index c93d8dbe44..7a419576ce 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -323,6 +323,15 @@ var codeRepoTests = []struct { time: time.Date(2017, 5, 31, 16, 3, 50, 0, time.UTC), gomod: "module gopkg.in/natefinch/lumberjack.v2\n", }, + { + path: "nanomsg.org/go/mangos/v2", + rev: "v2.0.2", + version: "v2.0.2", + name: "63f66a65137b9a648ac9f7bf0160b4a4d17d7999", + short: "63f66a65137b", + time: time.Date(2018, 12, 1, 15, 7, 40, 0, time.UTC), + gomod: "module nanomsg.org/go/mangos/v2\n\nrequire (\n\tgithub.com/Microsoft/go-winio v0.4.11\n\tgithub.com/droundy/goopt v0.0.0-20170604162106-0b8effe182da\n\tgithub.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect\n\tgithub.com/gorilla/websocket v1.4.0\n\tgithub.com/jtolds/gls v4.2.1+incompatible // indirect\n\tgithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect\n\tgithub.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c\n\tgolang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect\n)\n", + }, } func TestCodeRepo(t *testing.T) { -- GitLab From f1d5ce0185fe184c016016d55f1718778b799f6d Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 13 Feb 2019 18:35:19 -0500 Subject: [PATCH 0362/1679] cmd/go: make go list error behavior consistent in tests "go list -test" constructs a package graph, then creates test packages for the target. If it encounters an error (for example, a syntax error in a test file or a test function with the wrong signature), it reports the error and exits without printing the test packages or their dependencies, even if the -e flag is given. This is a problem for tools that operate on test files while users are editing them. For example, autocomplete may not work while the user is typing. With this change, a new function, load.TestPackagesAndErrors replaces TestPackagesFor. The new function attaches errors to the returned test packages instead of returning immediately. "go list -test" calls this when the -e flag is set. TestPackagesFor now returns the same error as before, but it returns non-nil packages so that "go list -test" without -e can print partial results. Fixes #28491 Change-Id: I141765c4574eae424d872eb9bf7dd63fdfb85efb Reviewed-on: https://go-review.googlesource.com/c/go/+/164357 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/list/list.go | 45 ++++--- src/cmd/go/internal/load/pkg.go | 78 ++++++------ src/cmd/go/internal/load/test.go | 99 +++++++++------ src/cmd/go/testdata/script/list_test_e.txt | 2 +- src/cmd/go/testdata/script/list_test_err.txt | 124 +++++++++++++++++++ 5 files changed, 253 insertions(+), 95 deletions(-) create mode 100644 src/cmd/go/testdata/script/list_test_err.txt diff --git a/src/cmd/go/internal/list/list.go b/src/cmd/go/internal/list/list.go index e482c393b6..4a6633d9a1 100644 --- a/src/cmd/go/internal/list/list.go +++ b/src/cmd/go/internal/list/list.go @@ -447,37 +447,34 @@ func runList(cmd *base.Command, args []string) { continue } if len(p.TestGoFiles)+len(p.XTestGoFiles) > 0 { - pmain, ptest, pxtest, err := load.TestPackagesFor(p, nil) - if err != nil { - if *listE { - pkgs = append(pkgs, &load.Package{ - PackagePublic: load.PackagePublic{ - ImportPath: p.ImportPath + ".test", - Error: &load.PackageError{Err: err.Error()}, - }, - }) - continue + var pmain, ptest, pxtest *load.Package + var err error + if *listE { + pmain, ptest, pxtest = load.TestPackagesAndErrors(p, nil) + } else { + pmain, ptest, pxtest, err = load.TestPackagesFor(p, nil) + if err != nil { + base.Errorf("can't load test package: %s", err) } - base.Errorf("can't load test package: %s", err) - continue } - pkgs = append(pkgs, pmain) - if ptest != nil { + if pmain != nil { + pkgs = append(pkgs, pmain) + data := *pmain.Internal.TestmainGo + h := cache.NewHash("testmain") + h.Write([]byte("testmain\n")) + h.Write(data) + out, _, err := c.Put(h.Sum(), bytes.NewReader(data)) + if err != nil { + base.Fatalf("%s", err) + } + pmain.GoFiles[0] = c.OutputFile(out) + } + if ptest != nil && ptest != p { pkgs = append(pkgs, ptest) } if pxtest != nil { pkgs = append(pkgs, pxtest) } - - data := *pmain.Internal.TestmainGo - h := cache.NewHash("testmain") - h.Write([]byte("testmain\n")) - h.Write(data) - out, _, err := c.Put(h.Sum(), bytes.NewReader(data)) - if err != nil { - base.Fatalf("%s", err) - } - pmain.GoFiles[0] = c.OutputFile(out) } } } diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 228be07f24..e6c893c257 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1424,41 +1424,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { } } p.Internal.Imports = imports - - deps := make(map[string]*Package) - var q []*Package - q = append(q, imports...) - for i := 0; i < len(q); i++ { - p1 := q[i] - path := p1.ImportPath - // The same import path could produce an error or not, - // depending on what tries to import it. - // Prefer to record entries with errors, so we can report them. - p0 := deps[path] - if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) { - deps[path] = p1 - for _, p2 := range p1.Internal.Imports { - if deps[p2.ImportPath] != p2 { - q = append(q, p2) - } - } - } - } - - p.Deps = make([]string, 0, len(deps)) - for dep := range deps { - p.Deps = append(p.Deps, dep) - } - sort.Strings(p.Deps) - for _, dep := range p.Deps { - p1 := deps[dep] - if p1 == nil { - panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath) - } - if p1.Error != nil { - p.DepsErrors = append(p.DepsErrors, p1.Error) - } - } + p.collectDeps() // unsafe is a fake package. if p.Standard && (p.ImportPath == "unsafe" || cfg.BuildContext.Compiler == "gccgo") { @@ -1528,6 +1494,48 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { } } +// collectDeps populates p.Deps and p.DepsErrors by iterating over +// p.Internal.Imports. +// +// TODO(jayconrod): collectDeps iterates over transitive imports for every +// package. We should only need to visit direct imports. +func (p *Package) collectDeps() { + deps := make(map[string]*Package) + var q []*Package + q = append(q, p.Internal.Imports...) + for i := 0; i < len(q); i++ { + p1 := q[i] + path := p1.ImportPath + // The same import path could produce an error or not, + // depending on what tries to import it. + // Prefer to record entries with errors, so we can report them. + p0 := deps[path] + if p0 == nil || p1.Error != nil && (p0.Error == nil || len(p0.Error.ImportStack) > len(p1.Error.ImportStack)) { + deps[path] = p1 + for _, p2 := range p1.Internal.Imports { + if deps[p2.ImportPath] != p2 { + q = append(q, p2) + } + } + } + } + + p.Deps = make([]string, 0, len(deps)) + for dep := range deps { + p.Deps = append(p.Deps, dep) + } + sort.Strings(p.Deps) + for _, dep := range p.Deps { + p1 := deps[dep] + if p1 == nil { + panic("impossible: missing entry in package cache for " + dep + " imported by " + p.ImportPath) + } + if p1.Error != nil { + p.DepsErrors = append(p.DepsErrors, p1.Error) + } + } +} + // SafeArg reports whether arg is a "safe" command-line argument, // meaning that when it appears in a command-line, it probably // doesn't have some special meaning other than its own name. diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 99a2247ede..5142b16e06 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -39,10 +39,43 @@ type TestCover struct { DeclVars func(*Package, ...string) map[string]*CoverVar } -// TestPackagesFor returns three packages: +// TestPackagesFor is like TestPackagesAndErrors but it returns +// an error if the test packages or their dependencies have errors. +// Only test packages without errors are returned. +func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) { + pmain, ptest, pxtest = TestPackagesAndErrors(p, cover) + for _, p1 := range []*Package{ptest, pxtest, pmain} { + if p1 == nil { + // pxtest may be nil + continue + } + if p1.Error != nil { + err = p1.Error + break + } + if len(p1.DepsErrors) > 0 { + perr := p1.DepsErrors[0] + perr.Pos = "" // show full import stack + err = perr + break + } + } + if pmain.Error != nil || len(pmain.DepsErrors) > 0 { + pmain = nil + } + if ptest.Error != nil || len(ptest.DepsErrors) > 0 { + ptest = nil + } + if pxtest != nil && (pxtest.Error != nil || len(pxtest.DepsErrors) > 0) { + pxtest = nil + } + return pmain, ptest, pxtest, err +} + +// TestPackagesAndErrors returns three packages: +// - pmain, the package main corresponding to the test binary (running tests in ptest and pxtest). // - ptest, the package p compiled with added "package p" test files. // - pxtest, the result of compiling any "package p_test" (external) test files. -// - pmain, the package main corresponding to the test binary (running tests in ptest and pxtest). // // If the package has no "package p_test" test files, pxtest will be nil. // If the non-test compilation of package p can be reused @@ -50,33 +83,30 @@ type TestCover struct { // package p need not be instrumented for coverage or any other reason), // then the returned ptest == p. // +// An error is returned if the testmain source cannot be completely generated +// (for example, due to a syntax error in a test file). No error will be +// returned for errors loading packages, but the Error or DepsError fields +// of the returned packages may be set. +// // The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0, // or else there's no point in any of this. -func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package, err error) { +func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) { + var ptestErr, pxtestErr *PackageError var imports, ximports []*Package var stk ImportStack stk.Push(p.ImportPath + " (test)") rawTestImports := str.StringList(p.TestImports) for i, path := range p.TestImports { p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) - if p1.Error != nil { - return nil, nil, nil, p1.Error - } - if len(p1.DepsErrors) > 0 { - err := p1.DepsErrors[0] - err.Pos = "" // show full import stack - return nil, nil, nil, err - } if str.Contains(p1.Deps, p.ImportPath) || p1.ImportPath == p.ImportPath { // Same error that loadPackage returns (via reusePackage) in pkg.go. // Can't change that code, because that code is only for loading the // non-test copy of a package. - err := &PackageError{ + ptestErr = &PackageError{ ImportStack: testImportStack(stk[0], p1, p.ImportPath), Err: "import cycle not allowed in test", IsImportCycle: true, } - return nil, nil, nil, err } p.TestImports[i] = p1.ImportPath imports = append(imports, p1) @@ -87,14 +117,6 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag rawXTestImports := str.StringList(p.XTestImports) for i, path := range p.XTestImports { p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) - if p1.Error != nil { - return nil, nil, nil, p1.Error - } - if len(p1.DepsErrors) > 0 { - err := p1.DepsErrors[0] - err.Pos = "" // show full import stack - return nil, nil, nil, err - } if p1.ImportPath == p.ImportPath { pxtestNeedsPtest = true } else { @@ -108,6 +130,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag if len(p.TestGoFiles) > 0 || p.Name == "main" || cover != nil && cover.Local { ptest = new(Package) *ptest = *p + ptest.Error = ptestErr ptest.ForTest = p.ImportPath ptest.GoFiles = nil ptest.GoFiles = append(ptest.GoFiles, p.GoFiles...) @@ -140,6 +163,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag m[k] = append(m[k], v...) } ptest.Internal.Build.ImportPos = m + ptest.collectDeps() } else { ptest = p } @@ -155,6 +179,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag GoFiles: p.XTestGoFiles, Imports: p.XTestImports, ForTest: p.ImportPath, + Error: pxtestErr, }, Internal: PackageInternal{ LocalPrefix: p.Internal.LocalPrefix, @@ -173,6 +198,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag if pxtestNeedsPtest { pxtest.Internal.Imports = append(pxtest.Internal.Imports, ptest) } + pxtest.collectDeps() } // Build main package. @@ -207,9 +233,6 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag pmain.Internal.Imports = append(pmain.Internal.Imports, ptest) } else { p1 := LoadImport(dep, "", nil, &stk, nil, 0) - if p1.Error != nil { - return nil, nil, nil, p1.Error - } pmain.Internal.Imports = append(pmain.Internal.Imports, p1) } } @@ -240,8 +263,8 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag // The list of imports is used by recompileForTest and by the loop // afterward that gathers t.Cover information. t, err := loadTestFuncs(ptest) - if err != nil { - return nil, nil, nil, err + if err != nil && pmain.Error == nil { + pmain.Error = &PackageError{Err: err.Error()} } t.Cover = cover if len(ptest.GoFiles)+len(ptest.CgoFiles) > 0 { @@ -254,6 +277,7 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag pmain.Imports = append(pmain.Imports, pxtest.ImportPath) t.ImportXtest = true } + pmain.collectDeps() // Sort and dedup pmain.Imports. // Only matters for go list -test output. @@ -299,12 +323,14 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag } data, err := formatTestmain(t) - if err != nil { - return nil, nil, nil, err + if err != nil && pmain.Error == nil { + pmain.Error = &PackageError{Err: err.Error()} + } + if data != nil { + pmain.Internal.TestmainGo = &data } - pmain.Internal.TestmainGo = &data - return pmain, ptest, pxtest, nil + return pmain, ptest, pxtest } func testImportStack(top string, p *Package, target string) []string { @@ -420,21 +446,24 @@ type coverInfo struct { } // loadTestFuncs returns the testFuncs describing the tests that will be run. +// The returned testFuncs is always non-nil, even if an error occurred while +// processing test files. func loadTestFuncs(ptest *Package) (*testFuncs, error) { t := &testFuncs{ Package: ptest, } + var err error for _, file := range ptest.TestGoFiles { - if err := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); err != nil { - return nil, err + if lerr := t.load(filepath.Join(ptest.Dir, file), "_test", &t.ImportTest, &t.NeedTest); lerr != nil && err == nil { + err = lerr } } for _, file := range ptest.XTestGoFiles { - if err := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); err != nil { - return nil, err + if lerr := t.load(filepath.Join(ptest.Dir, file), "_xtest", &t.ImportXtest, &t.NeedXtest); lerr != nil && err == nil { + err = lerr } } - return t, nil + return t, err } // formatTestmain returns the content of the _testmain.go file for t. diff --git a/src/cmd/go/testdata/script/list_test_e.txt b/src/cmd/go/testdata/script/list_test_e.txt index 4e36b88e85..263892ba63 100644 --- a/src/cmd/go/testdata/script/list_test_e.txt +++ b/src/cmd/go/testdata/script/list_test_e.txt @@ -1,7 +1,7 @@ env GO111MODULE=off # issue 25980: crash in go list -e -test -go list -e -test -f '{{.Error}}' p +go list -e -test -deps -f '{{.Error}}' p stdout '^p[/\\]d_test.go:2:8: cannot find package "d" in any of:' -- p/d.go -- diff --git a/src/cmd/go/testdata/script/list_test_err.txt b/src/cmd/go/testdata/script/list_test_err.txt new file mode 100644 index 0000000000..42805c9882 --- /dev/null +++ b/src/cmd/go/testdata/script/list_test_err.txt @@ -0,0 +1,124 @@ +# issue 28491: errors in test source files should not prevent +# "go list -test" from returning useful information. + +# go list prints information for package, internal test, +# external test, but not testmain package when there is a +# syntax error in test sources. +! go list -test -deps syntaxerr +stdout pkgdep +stdout testdep_a +stdout testdep_b +stdout ^syntaxerr$ +stdout '^syntaxerr \[syntaxerr.test\]' +stdout '^syntaxerr_test \[syntaxerr.test\]' +! stdout '^syntaxerr\.test' +stderr 'expected declaration' + +# go list -e prints information for all test packages. +# The syntax error is shown in the package error field. +go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' syntaxerr +stdout 'pkgdep ' +stdout 'testdep_a ' +stdout 'testdep_b ' +stdout 'syntaxerr\.test "[^"]*expected declaration' +! stderr 'expected declaration' + +[short] stop + +# go list prints partial information with test naming error +! go list -test -deps nameerr +stdout pkgdep +stdout testdep_a +stdout testdep_b +stderr 'wrong signature for TestBad' + +go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' nameerr +stdout 'pkgdep ' +stdout 'testdep_a ' +stdout 'testdep_b ' +stdout 'nameerr\.test "[^"]*wrong signature for TestBad' +! stderr 'wrong signature for TestBad' + +# go list prints partial information with error if test has cyclic import +! go list -test -deps cycleerr +stdout cycleerr +stderr 'import cycle not allowed in test' + +go list -e -test -deps -f '{{.ImportPath}} {{.Error | printf "%q"}}' cycleerr +stdout 'cycleerr ' +stdout 'testdep_a ' +stdout 'testdep_cycle ' +stdout 'cycleerr \[cycleerr.test\] "[^"]*import cycle not allowed in test' +! stderr 'import cycle not allowed in test' + +-- syntaxerr/syntaxerr.go -- +package syntaxerr + +import _ "pkgdep" + +-- syntaxerr/syntaxerr_ie_test.go -- +package syntaxerr + +!!!syntax error + +-- syntaxerr/syntaxerr_xe_test.go -- +package syntaxerr_test + +!!!syntax error + +-- syntaxerr/syntaxerr_i_test.go -- +package syntaxerr + +import _ "testdep_a" + +-- syntaxerr/syntaxerr_x_test.go -- +package syntaxerr + +import _ "testdep_b" + +-- nameerr/nameerr.go -- +package nameerr + +import _ "pkgdep" + +-- nameerr/nameerr_i_test.go -- +package nameerr + +import ( + _ "testdep_a" + "testing" +) + +func TestBad(t *testing.B) {} + +-- nameerr/nameerr_x_test.go -- +package nameerr_test + +import ( + _ "testdep_b" + "testing" +) + +func TestBad(t *testing.B) {} + +-- cycleerr/cycleerr_test.go -- +package cycleerr + +import ( + _ "testdep_a" + _ "testdep_cycle" +) + +-- pkgdep/pkgdep.go -- +package pkgdep + +-- testdep_a/testdep_a.go -- +package testdep_a + +-- testdep_b/testdep_b.go -- +package testdep_b + +-- testdep_cycle/testdep_cycle.go -- +package testdep_cycle + +import _ "cycleerr" -- GitLab From 5930c7de933c4d826926396f715bae63333143a2 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Mon, 7 Jan 2019 10:18:42 -0800 Subject: [PATCH 0363/1679] syscall: add all ambient capabilities into permitted and inheritable sets According to the prctl man page, each capability from the ambient set must already be present in both the permitted and the inheritable sets of the process. exec_linux_test suggests configuring the capabilities in the parent process. This doesn't look nice, because: * Capabilities are a per-thread attribute, so we need to use LockOSThread. * Need to restore capabilities after creating a process. * Doesn't work with user namespaces, because a process gets capabilities when a namespace is created. Fixes #23152 Change-Id: Iba23e530fc7b9f5182d602fe855f82218f354219 Reviewed-on: https://go-review.googlesource.com/c/go/+/156577 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/syscall/exec_linux.go | 51 +++++++++++++++++++++++++++++-- src/syscall/exec_linux_test.go | 56 +++++++++++++++++++++++----------- 2 files changed, 87 insertions(+), 20 deletions(-) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index 79c0d77422..ec8f296bca 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -94,6 +94,29 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr return pid, 0 } +const _LINUX_CAPABILITY_VERSION_3 = 0x20080522 + +type capHeader struct { + version uint32 + pid int32 +} + +type capData struct { + effective uint32 + permitted uint32 + inheritable uint32 +} +type caps struct { + hdr capHeader + data [2]capData +} + +// See CAP_TO_INDEX in linux/capability.h: +func capToIndex(cap uintptr) uintptr { return cap >> 5 } + +// See CAP_TO_MASK in linux/capability.h: +func capToMask(cap uintptr) uint32 { return 1 << uint(cap&31) } + // forkAndExecInChild1 implements the body of forkAndExecInChild up to // the parent's post-fork path. This is a separate function so we can // separate the child's and parent's stack frames if we're using @@ -122,6 +145,7 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att err2 Errno nextfd int i int + caps caps ) // Record parent PID so child can test if it has died. @@ -286,11 +310,32 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att } } - for _, c := range sys.AmbientCaps { - _, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0) - if err1 != 0 { + if len(sys.AmbientCaps) != 0 { + // Ambient capabilities were added in the 4.3 kernel, + // so it is safe to always use _LINUX_CAPABILITY_VERSION_3. + caps.hdr.version = _LINUX_CAPABILITY_VERSION_3 + + if _, _, err1 := RawSyscall(SYS_CAPGET, uintptr(unsafe.Pointer(&caps.hdr)), uintptr(unsafe.Pointer(&caps.data[0])), 0); err1 != 0 { goto childerror } + + for _, c := range sys.AmbientCaps { + // Add the c capability to the permitted and inheritable capability mask, + // otherwise we will not be able to add it to the ambient capability mask. + caps.data[capToIndex(c)].permitted |= capToMask(c) + caps.data[capToIndex(c)].inheritable |= capToMask(c) + } + + if _, _, err1 := RawSyscall(SYS_CAPSET, uintptr(unsafe.Pointer(&caps.hdr)), uintptr(unsafe.Pointer(&caps.data[0])), 0); err1 != 0 { + goto childerror + } + + for _, c := range sys.AmbientCaps { + _, _, err1 = RawSyscall6(SYS_PRCTL, PR_CAP_AMBIENT, uintptr(PR_CAP_AMBIENT_RAISE), c, 0, 0, 0) + if err1 != 0 { + goto childerror + } + } } // Chdir diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go index ac5745bc80..dc16a9d9fe 100644 --- a/src/syscall/exec_linux_test.go +++ b/src/syscall/exec_linux_test.go @@ -436,7 +436,7 @@ func TestUnshareMountNameSpaceChroot(t *testing.T) { type capHeader struct { version uint32 - pid int + pid int32 } type capData struct { @@ -446,6 +446,7 @@ type capData struct { } const CAP_SYS_TIME = 25 +const CAP_SYSLOG = 34 type caps struct { hdr capHeader @@ -506,15 +507,28 @@ func TestAmbientCapsHelper(*testing.T) { fmt.Fprintln(os.Stderr, "CAP_SYS_TIME unexpectedly not in the effective capability mask") os.Exit(2) } + if caps.data[1].effective&(1< Date: Wed, 20 Feb 2019 16:26:54 +0100 Subject: [PATCH 0364/1679] cmd/link: on AIX generate export file for host linker Change-Id: I6638cb0f9ed751c76a29cae62a93a923f18f14f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/164005 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/lib.go | 4 +++ src/cmd/link/internal/ld/xcoff.go | 57 ++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index e99c81aeb7..44befc9637 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1266,6 +1266,10 @@ func (ctxt *Link) hostlink() { if ctxt.IsELF { argv = append(argv, "-rdynamic") } + if ctxt.HeadType == objabi.Haix { + fileName := xcoffCreateExportFile(ctxt) + argv = append(argv, "-Wl,-bE:"+fileName) + } if strings.Contains(argv[0], "clang") { argv = append(argv, "-Qunused-arguments") diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 30a27d2b18..ee375bfe03 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -9,7 +9,9 @@ import ( "cmd/internal/objabi" "cmd/link/internal/sym" "encoding/binary" + "io/ioutil" "math/bits" + "path/filepath" "sort" "strings" ) @@ -771,7 +773,7 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { s := &XcoffSymEnt64{ Nsclass: C_EXT, - Noffset: uint32(xfile.stringTable.add(x.Name)), + Noffset: uint32(xfile.stringTable.add(x.Extname())), Nvalue: uint64(x.Value), Nscnum: f.getXCOFFscnum(x.Sect), Ntype: SYM_TYPE_FUNC, @@ -1182,6 +1184,26 @@ func (ctxt *Link) doxcoff() { // Change main name to match __start code. main := ctxt.Syms.ROLookup("_main", 0) main.Name = ".main" + + for _, s := range ctxt.Syms.Allsym { + if !s.Attr.CgoExport() { + continue + } + + name := s.Extname() + if s.Type == sym.STEXT { + // On AIX, a exported function must have two symbols: + // - a .text symbol which must start with a ".". + // - a .data symbol which is a function descriptor. + ctxt.Syms.Rename(s.Name, "."+name, 0, ctxt.Reachparent) + + desc := ctxt.Syms.Lookup(name, 0) + desc.Type = sym.SNOPTRDATA + desc.AddAddr(ctxt.Arch, s) + desc.AddAddr(ctxt.Arch, toc) + desc.AddUint64(ctxt.Arch, 0) + } + } } } @@ -1614,3 +1636,36 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { // TODO(aix): DWARF relocations } + +// xcoffCreateExportFile creates a file with exported symbols for +// -Wl,-bE option. +// ld won't export symbols unless they are listed in an export file. +func xcoffCreateExportFile(ctxt *Link) (fname string) { + fname = filepath.Join(*flagTmpdir, "export_file.exp") + var buf bytes.Buffer + + for _, s := range ctxt.Syms.Allsym { + if !s.Attr.CgoExport() { + continue + } + if !strings.HasPrefix(s.String(), "_cgoexp_") { + continue + } + + // Retrieve the name of the initial symbol + // exported by cgo. + // The corresponding Go symbol is: + // _cgoexp_hashcode_symname. + name := strings.SplitN(s.Extname(), "_", 4)[3] + + buf.Write([]byte(name + "\n")) + } + + err := ioutil.WriteFile(fname, buf.Bytes(), 0666) + if err != nil { + Errorf(nil, "WriteFile %s failed: %v", fname, err) + } + + return fname + +} -- GitLab From 8782fd04319e16b372852ae8572b8c90f56e01ae Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Sat, 2 Mar 2019 09:51:44 +0300 Subject: [PATCH 0365/1679] crypto/cipher: fix duplicated arguments to bytes.Equal in test Args were duplicated by a mistake. Found using static analysis tools. Change-Id: I2f61e09844bc409b1f687d654767332d93dd39a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/164937 Reviewed-by: Emmanuel Odeke --- src/crypto/cipher/cfb_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crypto/cipher/cfb_test.go b/src/crypto/cipher/cfb_test.go index ecb716df01..72f62e69d3 100644 --- a/src/crypto/cipher/cfb_test.go +++ b/src/crypto/cipher/cfb_test.go @@ -81,7 +81,7 @@ func TestCFBVectors(t *testing.T) { plaintextCopy := make([]byte, len(ciphertext)) cfbdec.XORKeyStream(plaintextCopy, ciphertext) - if !bytes.Equal(plaintextCopy, plaintextCopy) { + if !bytes.Equal(plaintextCopy, plaintext) { t.Errorf("#%d: wrong plaintext: got %x, expected %x", i, plaintextCopy, plaintext) } } -- GitLab From d3dd2588ebebd7c3a166069a8f572ce7e4b364ef Mon Sep 17 00:00:00 2001 From: karthik nayak Date: Sat, 5 Jan 2019 08:44:30 -0500 Subject: [PATCH 0366/1679] gosym/pclntab: mark LineTable.LineToPC and LineTable.PCToLine as deprecated Currently they aren't marked as deprecated as Godoc, but the comments mention that they are deprecated. Mark them as officially deprecated. Fixes #29576 Change-Id: I795c698ac715476023d80579d60932fba4c5edde Reviewed-on: https://go-review.googlesource.com/c/go/+/156331 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/debug/gosym/pclntab.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/debug/gosym/pclntab.go b/src/debug/gosym/pclntab.go index ad99b4dc5a..7e54a94351 100644 --- a/src/debug/gosym/pclntab.go +++ b/src/debug/gosym/pclntab.go @@ -93,7 +93,8 @@ func (t *LineTable) slice(pc uint64) *LineTable { } // PCToLine returns the line number for the given program counter. -// Callers should use Table's PCToLine method instead. +// +// Deprecated: Use Table's PCToLine method instead. func (t *LineTable) PCToLine(pc uint64) int { if t.isGo12() { return t.go12PCToLine(pc) @@ -104,7 +105,8 @@ func (t *LineTable) PCToLine(pc uint64) int { // LineToPC returns the program counter for the given line number, // considering only program counters before maxpc. -// Callers should use Table's LineToPC method instead. +// +// Deprecated: Use Table's LineToPC method instead. func (t *LineTable) LineToPC(line int, maxpc uint64) uint64 { if t.isGo12() { return 0 -- GitLab From 632162ccbc61a7321f322b1b99c04aefc414802b Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 6 Mar 2019 12:53:56 +0100 Subject: [PATCH 0367/1679] misc/android: enable many more tests on GOOS=android Android tests are built on the host and run on the device. To do that, the exec wrapper copies the test binary and testdata to the device. To enable many more tests, make the copied environment more like the host: - Copy all of pkg from GOROOT, not just the android pkg directory. - Copy any parent testdata directories as well as the package's own. - Copy *.go files from the package directory. This enables misc/cgo/stdio and misc/cgo/life tests that were invisible before so disable them explicitly. - Always copy the GOROOT, even for tests outside GOROOT. This is expensive but only done once per make.bash. - Build the go tool for the device and put it in PATH. Set GOCACHE to a writable directory and disable cgo. While here, use a single directory for all the exec wrapper files and delete that once per make.bash as well. In total, this CL enables many tests in the subrepos that would need skips without it, in particular the x/tools tests. Fixes #11452 Updates #23824 Updates #11811 Change-Id: I2e50d8b57db9bc4637f25272a5360c8b2cf4e627 Reviewed-on: https://go-review.googlesource.com/c/go/+/165797 Reviewed-by: Bryan C. Mills Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 107 ++++++++++++++++++++++---------- misc/cgo/life/life_test.go | 3 + misc/cgo/stdio/stdio_test.go | 3 + 3 files changed, 80 insertions(+), 33 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 166ced8d0f..73530f0dd2 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -51,8 +51,8 @@ func run(args ...string) string { } const ( - deviceGoroot = "/data/local/tmp/goroot" - deviceGopath = "/data/local/tmp/gopath" + deviceRoot = "/data/local/tmp/go_exec_android" + deviceGoroot = deviceRoot + "/goroot" ) func main() { @@ -77,10 +77,16 @@ func main() { // wait for sys.boot_completed. run("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") + // Done once per make.bash. + adbCopyGoroot() + // Prepare a temporary directory that will be cleaned up at the end. - deviceGotmp := fmt.Sprintf("/data/local/tmp/%s-%d", - filepath.Base(os.Args[1]), os.Getpid()) - run("exec-out", "mkdir", "-p", deviceGotmp) + // Binary names can conflict. + // E.g. template.test from the {html,text}/template packages. + binName := filepath.Base(os.Args[1]) + deviceGotmp := fmt.Sprintf(deviceRoot+"/%s-%d", binName, os.Getpid()) + deviceGopath := deviceGotmp + "/gopath" + defer run("exec-out", "rm", "-rf", deviceGotmp) // Clean up. // Determine the package by examining the current working // directory, which will look something like @@ -88,24 +94,27 @@ func main() { // We extract everything after the $GOROOT or $GOPATH to run on the // same relative directory on the target device. subdir, inGoRoot := subdir() - deviceCwd := filepath.Join(deviceGoroot, subdir) - if !inGoRoot { - deviceCwd = filepath.Join(deviceGopath, subdir) + deviceCwd := filepath.Join(deviceGopath, subdir) + if inGoRoot { + deviceCwd = filepath.Join(deviceGoroot, subdir) } else { - adbSyncGoroot() + run("exec-out", "mkdir", "-p", deviceCwd) + adbCopyTestdata(deviceCwd, subdir) + + // Copy .go files from the package. + goFiles, err := filepath.Glob("*.go") + if err != nil { + log.Fatal(err) + } + if len(goFiles) > 0 { + args := append(append([]string{"push"}, goFiles...), deviceCwd) + run(args...) + } } - run("exec-out", "mkdir", "-p", deviceCwd) - // Binary names can conflict. - // E.g. template.test from the {html,text}/template packages. - binName := fmt.Sprintf("%s-%d", filepath.Base(os.Args[1]), os.Getpid()) deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName) run("push", os.Args[1], deviceBin) - if _, err := os.Stat("testdata"); err == nil { - run("push", "--sync", "testdata", deviceCwd) - } - // Forward SIGQUIT from the go command to show backtraces from // the binary instead of from this wrapper. quit := make(chan os.Signal, 1) @@ -125,6 +134,9 @@ func main() { cmd := `export TMPDIR="` + deviceGotmp + `"` + `; export GOROOT="` + deviceGoroot + `"` + `; export GOPATH="` + deviceGopath + `"` + + `; export CGO_ENABLED=0` + + `; export GOCACHE="` + deviceRoot + `/gocache"` + + `; export PATH=$PATH:"` + deviceGoroot + `/bin"` + `; cd "` + deviceCwd + `"` + "; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") + "; echo -n " + exitstr + "$?" @@ -132,8 +144,6 @@ func main() { signal.Reset(syscall.SIGQUIT) close(quit) - run("exec-out", "rm", "-rf", deviceGotmp) // Clean up. - exitIdx := strings.LastIndex(output, exitstr) if exitIdx == -1 { log.Fatalf("no exit code: %q", output) @@ -186,9 +196,34 @@ func subdir() (pkgpath string, underGoRoot bool) { return "", false } -// adbSyncGoroot ensures that files necessary for testing the Go standard -// packages are present on the attached device. -func adbSyncGoroot() { +// adbCopyTestdata copies testdata directories from subdir to deviceCwd +// on the device. +// It is common for tests to reach out into testdata from parent +// packages, so copy testdata directories all the way up to the root +// of subdir. +func adbCopyTestdata(deviceCwd, subdir string) { + dir := "" + for { + testdata := filepath.Join(dir, "testdata") + if _, err := os.Stat(testdata); err == nil { + devicePath := filepath.Join(deviceCwd, dir) + run("exec-out", "mkdir", "-p", devicePath) + run("push", testdata, devicePath) + } + if subdir == "." { + break + } + subdir = filepath.Dir(subdir) + dir = filepath.Join(dir, "..") + } +} + +// adbCopyGoroot clears deviceRoot for previous versions of GOROOT, GOPATH +// and temporary data. Then, it copies relevant parts of GOROOT to the device, +// including the go tool built for android. +// A lock file ensures this only happens once, even with concurrent exec +// wrappers. +func adbCopyGoroot() { // Also known by cmd/dist. The bootstrap command deletes the file. statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status") stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666) @@ -196,7 +231,7 @@ func adbSyncGoroot() { log.Fatal(err) } defer stat.Close() - // Serialize check and syncing. + // Serialize check and copying. if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil { log.Fatal(err) } @@ -207,23 +242,29 @@ func adbSyncGoroot() { if string(s) == "done" { return } - devRoot := "/data/local/tmp/goroot" - run("exec-out", "rm", "-rf", devRoot) - run("exec-out", "mkdir", "-p", devRoot+"/pkg") + // Delete GOROOT, GOPATH and any leftover test data. + run("exec-out", "rm", "-rf", deviceRoot) + deviceBin := filepath.Join(deviceGoroot, "bin") + run("exec-out", "mkdir", "-p", deviceBin) goroot := runtime.GOROOT() + // Build go for android. goCmd := filepath.Join(goroot, "bin", "go") - runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output() + tmpGo, err := ioutil.TempFile("", "go_android_exec-cmd-go-*") if err != nil { log.Fatal(err) } - pkgdir := filepath.Dir(string(runtimea)) - if pkgdir == "" { - log.Fatal("could not find android pkg dir") + tmpGo.Close() + defer os.Remove(tmpGo.Name()) + + if out, err := exec.Command(goCmd, "build", "-o", tmpGo.Name(), "cmd/go").CombinedOutput(); err != nil { + log.Fatalf("failed to build go tool for device: %s\n%v", out, err) } - for _, dir := range []string{"src", "test", "lib"} { - run("push", filepath.Join(goroot, dir), filepath.Join(devRoot)) + deviceGo := filepath.Join(deviceBin, "go") + run("push", tmpGo.Name(), deviceGo) + for _, dir := range []string{"pkg", "src", "test", "lib", "api"} { + run("push", filepath.Join(goroot, dir), filepath.Join(deviceGoroot)) } - run("push", filepath.Join(pkgdir), filepath.Join(devRoot, "pkg/")) + if _, err := stat.Write([]byte("done")); err != nil { log.Fatal(err) } diff --git a/misc/cgo/life/life_test.go b/misc/cgo/life/life_test.go index 0f024c9d1d..3c95d87d8a 100644 --- a/misc/cgo/life/life_test.go +++ b/misc/cgo/life/life_test.go @@ -46,6 +46,9 @@ func testMain(m *testing.M) int { } func TestTestRun(t *testing.T) { + if os.Getenv("GOOS") == "android" { + t.Skip("the go tool runs with CGO_ENABLED=0 on the android device") + } out, err := exec.Command("go", "env", "GOROOT").Output() if err != nil { t.Fatal(err) diff --git a/misc/cgo/stdio/stdio_test.go b/misc/cgo/stdio/stdio_test.go index 85ab6ae3e5..ab5d328f67 100644 --- a/misc/cgo/stdio/stdio_test.go +++ b/misc/cgo/stdio/stdio_test.go @@ -46,6 +46,9 @@ func testMain(m *testing.M) int { } func TestTestRun(t *testing.T) { + if os.Getenv("GOOS") == "android" { + t.Skip("subpackage stdio is not available on android") + } out, err := exec.Command("go", "env", "GOROOT").Output() if err != nil { t.Fatal(err) -- GitLab From 0271d41ed63cacd1d79716161d0797790e930dfa Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 8 Mar 2019 13:26:04 -0500 Subject: [PATCH 0368/1679] internal/testenv: remove SetModVendor It turns out not to be necessary. Russ expressed a preference for avoiding module fetches over making 'go mod tidy' work within std and cmd right away, so for now we will make the loader use the vendor directory for the standard library even if '-mod=vendor' is not set explicitly. Updates #30228 Change-Id: Idf7208e63da8cb7bfe281b93ec21b61d40334947 Reviewed-on: https://go-review.googlesource.com/c/go/+/166357 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/addr2line/addr2line_test.go | 2 -- src/cmd/compile/internal/gc/scope_test.go | 2 -- src/cmd/cover/cover_test.go | 2 -- src/cmd/internal/obj/x86/obj6_test.go | 2 -- src/cmd/link/internal/ld/ld_test.go | 2 -- src/cmd/link/link_test.go | 2 -- src/cmd/nm/nm_test.go | 2 -- src/cmd/objdump/objdump_test.go | 1 - src/cmd/vet/all/main.go | 1 - src/cmd/vet/vet_test.go | 2 -- src/crypto/x509/x509_test.go | 2 -- src/debug/gosym/pclntab_test.go | 2 -- src/go/importer/importer_test.go | 2 -- .../internal/srcimporter/srcimporter_test.go | 2 -- src/internal/testenv/testenv.go | 26 ------------------- src/runtime/crash_test.go | 2 -- src/runtime/pprof/proto_test.go | 2 -- 17 files changed, 56 deletions(-) diff --git a/src/cmd/addr2line/addr2line_test.go b/src/cmd/addr2line/addr2line_test.go index 183a22f8f3..22bf1379bb 100644 --- a/src/cmd/addr2line/addr2line_test.go +++ b/src/cmd/addr2line/addr2line_test.go @@ -115,5 +115,3 @@ func TestAddr2Line(t *testing.T) { testAddr2Line(t, exepath, syms[symName]) testAddr2Line(t, exepath, "0x"+syms[symName]) } - -func init() { testenv.SetModVendor() } diff --git a/src/cmd/compile/internal/gc/scope_test.go b/src/cmd/compile/internal/gc/scope_test.go index e4861c686c..e327dc02af 100644 --- a/src/cmd/compile/internal/gc/scope_test.go +++ b/src/cmd/compile/internal/gc/scope_test.go @@ -202,8 +202,6 @@ var testfile = []testline{ const detailOutput = false -func init() { testenv.SetModVendor() } - // Compiles testfile checks that the description of lexical blocks emitted // by the linker in debug_info, for each function in the main package, // corresponds to what we expect it to be. diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index d7e6ca99b7..f002442b63 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -77,8 +77,6 @@ var debug = flag.Bool("debug", false, "keep rewritten files for debugging") // We use TestMain to set up a temporary directory and remove it when // the tests are done. func TestMain(m *testing.M) { - testenv.SetModVendor() - dir, err := ioutil.TempDir("", "gotestcover") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/cmd/internal/obj/x86/obj6_test.go b/src/cmd/internal/obj/x86/obj6_test.go index 2b1a729c8f..c5399744f2 100644 --- a/src/cmd/internal/obj/x86/obj6_test.go +++ b/src/cmd/internal/obj/x86/obj6_test.go @@ -134,8 +134,6 @@ func parseOutput(t *testing.T, td *ParsedTestData, asmout []byte) { } } -func init() { testenv.SetModVendor() } - func TestDynlink(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/internal/ld/ld_test.go b/src/cmd/link/internal/ld/ld_test.go index 219b2a63ca..0816429316 100644 --- a/src/cmd/link/internal/ld/ld_test.go +++ b/src/cmd/link/internal/ld/ld_test.go @@ -13,8 +13,6 @@ import ( "testing" ) -func init() { testenv.SetModVendor() } - func TestUndefinedRelocErrors(t *testing.T) { t.Parallel() testenv.MustHaveGoBuild(t) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 5043a778ca..5200c3a6f0 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -38,8 +38,6 @@ func TestLargeSymName(t *testing.T) { _ = AuthorPaidByTheColumnInch } -func init() { testenv.SetModVendor() } - func TestIssue21703(t *testing.T) { t.Parallel() diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 82f4235510..8176ddd7f4 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -30,8 +30,6 @@ func testMain(m *testing.M) int { return 0 } - testenv.SetModVendor() - tmpDir, err := ioutil.TempDir("", "TestNM") if err != nil { fmt.Println("TempDir failed:", err) diff --git a/src/cmd/objdump/objdump_test.go b/src/cmd/objdump/objdump_test.go index 7c874e853b..be9fe5274a 100644 --- a/src/cmd/objdump/objdump_test.go +++ b/src/cmd/objdump/objdump_test.go @@ -24,7 +24,6 @@ func TestMain(m *testing.M) { if !testenv.HasGoBuild() { return } - testenv.SetModVendor() var exitcode int if err := buildObjdump(); err == nil { diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index 018eba4d6e..6e4a4e297e 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -44,7 +44,6 @@ func main() { log.SetPrefix("vet/all: ") log.SetFlags(log.Lshortfile) - testenv.SetModVendor() var err error cmdGoPath, err = testenv.GoTool() if err != nil { diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 62c28fb9a2..5d8139d977 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -32,8 +32,6 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { - testenv.SetModVendor() - dir, err := ioutil.TempDir("", "vet_test") if err != nil { fmt.Fprintln(os.Stderr, err) diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index fbcdb7b58e..f5851f1f11 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -1146,8 +1146,6 @@ func TestParsePEMCRL(t *testing.T) { // Can't check the signature here without a package cycle. } -func init() { testenv.SetModVendor() } - func TestImports(t *testing.T) { testenv.MustHaveGoRun(t) diff --git a/src/debug/gosym/pclntab_test.go b/src/debug/gosym/pclntab_test.go index c67fb66f0d..d21f0e24a8 100644 --- a/src/debug/gosym/pclntab_test.go +++ b/src/debug/gosym/pclntab_test.go @@ -21,8 +21,6 @@ var ( pclinetestBinary string ) -func init() { testenv.SetModVendor() } - func dotest(t *testing.T) { testenv.MustHaveGoBuild(t) // For now, only works on amd64 platforms. diff --git a/src/go/importer/importer_test.go b/src/go/importer/importer_test.go index 2887ec6ea5..ff6e12c0da 100644 --- a/src/go/importer/importer_test.go +++ b/src/go/importer/importer_test.go @@ -16,8 +16,6 @@ import ( "testing" ) -func init() { testenv.SetModVendor() } - func TestForCompiler(t *testing.T) { testenv.MustHaveGoBuild(t) diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go index 06472447a6..b84672610c 100644 --- a/src/go/internal/srcimporter/srcimporter_test.go +++ b/src/go/internal/srcimporter/srcimporter_test.go @@ -18,8 +18,6 @@ import ( "time" ) -func init() { testenv.SetModVendor() } - const maxTime = 2 * time.Second var importer = New(&build.Default, token.NewFileSet(), make(map[string]*types.Package)) diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go index 72e4d803cb..8f69fe0da5 100644 --- a/src/internal/testenv/testenv.go +++ b/src/internal/testenv/testenv.go @@ -19,7 +19,6 @@ import ( "runtime" "strconv" "strings" - "sync" "testing" ) @@ -78,31 +77,6 @@ func MustHaveGoRun(t testing.TB) { } } -var modVendorOnce sync.Once - -// SetModVendor adds the "-mod=vendor" flag to the GOFLAGS environment variable. -// This allows tests whose working directories are within the cmd and std -// modules to run ``go'' commands without accessing the network to load -// dependencies modules. -// -// SetModVendor must be called before any test may read the GOFLAGS environment -// variable. -// -// TODO(golang.org/issue/30240): If we load go.mod files from vendor/ -// automatically, this will probably no longer be necessary. -func SetModVendor() { - modVendorOnce.Do(func() { - var goflags []string - for _, f := range strings.Fields(os.Getenv("GOFLAGS")) { - if !strings.HasPrefix(f, "-mod=") && !strings.HasPrefix(f, "--mod=") { - goflags = append(goflags, f) - } - } - goflags = append(goflags, "-mod=vendor") - os.Setenv("GOFLAGS", strings.Join(goflags, " ")) - }) -} - // GoToolPath reports the path to the Go tool. // It is a convenience wrapper around GoTool. // If the tool is unavailable GoToolPath calls t.Skip. diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 3a27b269a1..03ebf022a6 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -25,8 +25,6 @@ import ( var toRemove []string func TestMain(m *testing.M) { - testenv.SetModVendor() - status := m.Run() for _, file := range toRemove { os.RemoveAll(file) diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index a276d81c49..4452d51231 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -301,8 +301,6 @@ func TestProcSelfMaps(t *testing.T) { }) } -func init() { testenv.SetModVendor() } - // TestMapping checkes the mapping section of CPU profiles // has the HasFunctions field set correctly. If all PCs included // in the samples are successfully symbolized, the corresponding -- GitLab From 91c9ed084096b105858ab13a3c26925d82592d56 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 8 Mar 2019 15:25:11 -0500 Subject: [PATCH 0369/1679] cmd/go: improve wording of 'go mod init' error When 'go mod init' is run without a module path, it tries to infer a module path, based on the current directory (if in GOPATH), import comments, and vendor configuration files. It's common for this command to fail the first time a user tries to create a module in a new project outside GOPATH. This change improves the wording of the error message to hint that the user should specify a module path. Fixes #30678 Change-Id: Iec0352e919dbc8b426ab71eed236fad3929ec671 Reviewed-on: https://go-review.googlesource.com/c/go/+/166319 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modload/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 20f7389f55..940f0a8e45 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -565,7 +565,7 @@ func findModulePath(dir string) (string, error) { return "github.com/" + string(m[1]), nil } - return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, no import comments)", dir) + return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, module path not specified)", dir) } var ( -- GitLab From b37b35edd75af0c175079029bfa3d302637a9c8e Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sat, 5 Jan 2019 01:42:44 +0700 Subject: [PATCH 0370/1679] debug/gosym: simplify parsing symbol name rule Symbol name with linker prefix like "type." and "go." is not parsed correctly and returns the prefix as parts of package name. So just returns empty string for symbol name start with linker prefix. Fixes #29551 Change-Id: Idb4ce872345e5781a5a5da2b2146faeeebd9e63b Reviewed-on: https://go-review.googlesource.com/c/go/+/156397 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/debug/gosym/symtab.go | 14 +++++++++++--- src/debug/gosym/symtab_test.go | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/debug/gosym/symtab.go b/src/debug/gosym/symtab.go index a84b7f6def..3be612e1df 100644 --- a/src/debug/gosym/symtab.go +++ b/src/debug/gosym/symtab.go @@ -35,13 +35,21 @@ func (s *Sym) Static() bool { return s.Type >= 'a' } // PackageName returns the package part of the symbol name, // or the empty string if there is none. func (s *Sym) PackageName() string { - pathend := strings.LastIndex(s.Name, "/") + name := s.Name + + // A prefix of "type." and "go." is a compiler-generated symbol that doesn't belong to any package. + // See variable reservedimports in cmd/compile/internal/gc/subr.go + if strings.HasPrefix(name, "go.") || strings.HasPrefix(name, "type.") { + return "" + } + + pathend := strings.LastIndex(name, "/") if pathend < 0 { pathend = 0 } - if i := strings.Index(s.Name[pathend:], "."); i != -1 { - return s.Name[:pathend+i] + if i := strings.Index(name[pathend:], "."); i != -1 { + return name[:pathend+i] } return "" } diff --git a/src/debug/gosym/symtab_test.go b/src/debug/gosym/symtab_test.go index 08e86336b8..b6ed8f554c 100644 --- a/src/debug/gosym/symtab_test.go +++ b/src/debug/gosym/symtab_test.go @@ -41,3 +41,18 @@ func TestRemotePackage(t *testing.T) { assertString(t, fmt.Sprintf("receiver of %q", s1.Name), s1.ReceiverName(), "(*FlagSet)") assertString(t, fmt.Sprintf("receiver of %q", s2.Name), s2.ReceiverName(), "") } + +func TestIssue29551(t *testing.T) { + symNames := []string{ + "type..eq.[9]debug/elf.intName", + "type..hash.debug/elf.ProgHeader", + "type..eq.runtime._panic", + "type..hash.struct { runtime.gList; runtime.n int32 }", + "go.(*struct { sync.Mutex; math/big.table [64]math/big", + } + + for _, symName := range symNames { + s := Sym{Name: symName} + assertString(t, fmt.Sprintf("package of %q", s.Name), s.PackageName(), "") + } +} -- GitLab From 3cf89e509b21d0f469c4e0a78179b9d2d961c864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:29:00 +0100 Subject: [PATCH 0371/1679] cmd/link: enable DWARF with external linker on aix/ppc64 In order to allow DWARF with ld, the symbol table is adapted. In internal linkmode, each package is considered as a .FILE. However, current version of ld is crashing on a few programs because of relocations between DWARF symbols. Considering all packages as part of one .FILE seems to bypass this bug. As it might be fixed in a future release, the size of each package in DWARF sections is still retrieved and can be used when it's fixed. Moreover, it's improving internal linkmode which should have done it anyway. Change-Id: If3d023fe118b24b9f0f46d201a4849eee8d5e333 Reviewed-on: https://go-review.googlesource.com/c/go/+/164006 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/data.go | 6 +++ src/cmd/link/internal/ld/dwarf.go | 34 ++++++++++++-- src/cmd/link/internal/ld/xcoff.go | 76 ++++++++++++++++++++++++------- 3 files changed, 95 insertions(+), 21 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index a48db2aeeb..9d160ca49b 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1773,6 +1773,12 @@ func (ctxt *Link) dodata() { s.Value = int64(uint64(datsize) - sect.Vaddr) s.Attr |= sym.AttrLocal datsize += s.Size + + if ctxt.HeadType == objabi.Haix && curType == sym.SDWARFLOC { + // Update the size of .debug_loc for this symbol's + // package. + addDwsectCUSize(".debug_loc", s.File, uint64(s.Size)) + } } sect.Length = uint64(datsize) - sect.Vaddr checkdatsize(ctxt, datsize, curType) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 995a7e77b9..446fd572ac 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1342,13 +1342,20 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { } // writepcranges generates the DW_AT_ranges table for compilation unit cu. -func writepcranges(ctxt *Link, cu *dwarf.DWDie, base *sym.Symbol, pcs []dwarf.Range, ranges *sym.Symbol) { +func writepcranges(ctxt *Link, unit *compilationUnit, base *sym.Symbol, pcs []dwarf.Range, ranges *sym.Symbol) { var dwarfctxt dwarf.Context = dwctxt{ctxt} + unitLengthOffset := ranges.Size + // Create PC ranges for this CU. - newattr(cu, dwarf.DW_AT_ranges, dwarf.DW_CLS_PTR, ranges.Size, ranges) - newattr(cu, dwarf.DW_AT_low_pc, dwarf.DW_CLS_ADDRESS, base.Value, base) + newattr(unit.dwinfo, dwarf.DW_AT_ranges, dwarf.DW_CLS_PTR, ranges.Size, ranges) + newattr(unit.dwinfo, dwarf.DW_AT_low_pc, dwarf.DW_CLS_ADDRESS, base.Value, base) dwarf.PutRanges(dwarfctxt, ranges, nil, pcs) + + if ctxt.HeadType == objabi.Haix { + addDwsectCUSize(".debug_ranges", unit.lib.String(), uint64(ranges.Size-unitLengthOffset)) + } + } /* @@ -1500,6 +1507,10 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { fs.AddAddr(ctxt.Arch, s) fs.AddUintXX(ctxt.Arch, uint64(s.Size), ctxt.Arch.PtrSize) // address range fs.AddBytes(deltaBuf) + + if ctxt.HeadType == objabi.Haix { + addDwsectCUSize(".debug_frame", s.File, fdeLength+uint64(lengthFieldSize)) + } } return syms } @@ -1705,11 +1716,11 @@ func dwarfEnabled(ctxt *Link) bool { } if ctxt.LinkMode == LinkExternal { - // TODO(aix): enable DWARF switch { case ctxt.IsELF: case ctxt.HeadType == objabi.Hdarwin: case ctxt.HeadType == objabi.Hwindows: + case ctxt.HeadType == objabi.Haix: default: return false } @@ -1730,6 +1741,11 @@ func dwarfGenerateDebugInfo(ctxt *Link) { return } + if ctxt.HeadType == objabi.Haix { + // Initial map used to store package size for each DWARF section. + dwsectCUSize = make(map[string]uint64) + } + ctxt.compUnitByPackage = make(map[*sym.Library]*compilationUnit) // Forctxt.Diagnostic messages. @@ -1829,6 +1845,10 @@ func dwarfGenerateDebugInfo(ctxt *Link) { if ctxt.HeadType == objabi.Hdarwin { removeDwarfAddrListBaseAddress(ctxt, dsym, rangeSym, false) } + if ctxt.HeadType == objabi.Haix { + addDwsectCUSize(".debug_ranges", unit.lib.String(), uint64(rangeSym.Size)) + + } unit.rangeSyms = append(unit.rangeSyms, rangeSym) } @@ -1891,7 +1911,7 @@ func dwarfGenerateDebugSyms(ctxt *Link) { continue } writelines(ctxt, u, debugLine) - writepcranges(ctxt, u.dwinfo, u.lib.Textp[0], u.pcs, debugRanges) + writepcranges(ctxt, u, u.lib.Textp[0], u.pcs, debugRanges) } // newdie adds DIEs to the *beginning* of the parent's DIE list. @@ -2162,6 +2182,10 @@ func saveDwsectCUSize(sname string, pkgname string, size uint64) { dwsectCUSize[sname+"."+pkgname] = size } +func addDwsectCUSize(sname string, pkgname string, size uint64) { + dwsectCUSize[sname+"."+pkgname] += size +} + // getPkgFromCUSym returns the package name for the compilation unit // represented by s. // The prefix dwarf.InfoPrefix+".pkg." needs to be removed in order to get diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index ee375bfe03..70be67420b 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -501,7 +501,7 @@ func xcoffGetDwarfSubtype(str string) (string, uint32) { case ".debug_pubtypes": return ".dwpbtyp", SSUBTYP_DWPBTYP case ".debug_ranges": - return ".dwrnge", SSUBTYP_DWRNGES + return ".dwrnges", SSUBTYP_DWRNGES } // never used return "", 0 @@ -661,13 +661,20 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 /* Dwarf */ for _, sect := range Segdwarf.Sections { - // Find the size of this corresponding package DWARF compilation unit. - // This size is set during DWARF generation (see dwarf.go). - dwsize := getDwsectCUSize(sect.Name, name) - // .debug_abbrev is commun to all packages and not found with the previous function - if sect.Name == ".debug_abbrev" { - s := ctxt.Syms.Lookup(sect.Name, 0) - dwsize = uint64(s.Size) + var dwsize uint64 + if ctxt.LinkMode == LinkInternal { + // Find the size of this corresponding package DWARF compilation unit. + // This size is set during DWARF generation (see dwarf.go). + dwsize = getDwsectCUSize(sect.Name, name) + // .debug_abbrev is commun to all packages and not found with the previous function + if sect.Name == ".debug_abbrev" { + s := ctxt.Syms.ROLookup(sect.Name, 0) + dwsize = uint64(s.Size) + + } + } else { + // There is only one .FILE with external linking. + dwsize = sect.Length } // get XCOFF name @@ -679,6 +686,20 @@ func (f *xcoffFile) writeSymbolNewFile(ctxt *Link, name string, firstEntry uint6 Nscnum: f.getXCOFFscnum(sect), Nnumaux: 1, } + + if currSymSrcFile.csectAux == nil { + // Dwarf relocations need the symbol number of .dw* symbols. + // It doesn't need to know it for each package, one is enough. + // currSymSrcFile.csectAux == nil means first package. + dws := ctxt.Syms.Lookup(sect.Name, 0) + dws.Dynid = int32(f.symbolCount) + + if sect.Name == ".debug_frame" && ctxt.LinkMode != LinkExternal { + // CIE size must be added to the first package. + dwsize += 48 + } + } + f.addSymbol(s) // update the DWARF section offset in this file @@ -764,10 +785,25 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { } else { // Current file has changed. New C_FILE, C_DWARF, etc must be generated. if currSymSrcFile.name != x.File { - // update previous file values - xfile.updatePreviousFile(ctxt, false) - currSymSrcFile.name = x.File - f.writeSymbolNewFile(ctxt, x.File, uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) + if ctxt.LinkMode == LinkInternal { + // update previous file values + xfile.updatePreviousFile(ctxt, false) + currSymSrcFile.name = x.File + f.writeSymbolNewFile(ctxt, x.File, uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) + } else { + // With external linking, ld will crash if there is several + // .FILE and DWARF debugging enable, somewhere during + // the relocation phase. + // Therefore, all packages are merged under a fake .FILE + // "go_functions". + // TODO(aix); remove once ld has been fixed or the triggering + // relocation has been found and fixed. + if currSymSrcFile.name == "" { + currSymSrcFile.name = x.File + f.writeSymbolNewFile(ctxt, "go_functions", uint64(x.Value), xfile.getXCOFFscnum(x.Sect)) + } + } + } } @@ -1119,9 +1155,6 @@ func (ctxt *Link) doxcoff() { Exitf("-d is not available on AIX") } - // Initial map used to store compilation unit size for each DWARF section (see dwarf.go). - dwsectCUSize = make(map[string]uint64) - // TOC toc := ctxt.Syms.Lookup("TOC", 0) toc.Type = sym.SXCOFFTOC @@ -1634,7 +1667,18 @@ func (f *xcoffFile) emitRelocations(ctxt *Link, fileoff int64) { s.xcoffSect.Snreloc += n } - // TODO(aix): DWARF relocations +dwarfLoop: + for _, sect := range Segdwarf.Sections { + for _, xcoffSect := range f.sections { + _, subtyp := xcoffGetDwarfSubtype(sect.Name) + if xcoffSect.Sflags&0xF0000 == subtyp { + xcoffSect.Srelptr = uint64(ctxt.Out.Offset()) + xcoffSect.Snreloc = relocsect(sect, dwarfp, sect.Vaddr) + continue dwarfLoop + } + } + Errorf(nil, "emitRelocations: could not find %q section", sect.Name) + } } // xcoffCreateExportFile creates a file with exported symbols for -- GitLab From 83a33d3855e257b383b2a3a10dfd9748ad17cfb4 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 8 Mar 2019 15:01:32 -0800 Subject: [PATCH 0372/1679] cmd/compile: reverse order of slice bounds checks Turns out this makes the fix for 28797 unnecessary, because this order ensures that the RHS of IsSliceInBounds ops are always nonnegative. The real reason for this change is that it also makes dealing with <0 values easier for reporting values in bounds check panics (issue #30116). Makes cmd/go negligibly smaller. Update #28797 Change-Id: I1f25ba6d2b3b3d4a72df3105828aa0a4b629ce85 Reviewed-on: https://go-review.googlesource.com/c/go/+/166377 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/ssa.go | 33 ++++++++---------------------- test/loopbce.go | 6 +++--- test/prove.go | 4 ++-- 3 files changed, 13 insertions(+), 30 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 84b9207481..d6b2bd3137 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4029,6 +4029,7 @@ func (s *state) nilCheck(ptr *ssa.Value) { } // boundsCheck generates bounds checking code. Checks if 0 <= idx < len, branches to exit if not. +// len must be known to be nonnegative. // Starts a new block on return. // idx is already converted to full int width. func (s *state) boundsCheck(idx, len *ssa.Value) { @@ -4041,34 +4042,14 @@ func (s *state) boundsCheck(idx, len *ssa.Value) { s.check(cmp, panicindex) } -func couldBeNegative(v *ssa.Value) bool { - switch v.Op { - case ssa.OpSliceLen, ssa.OpSliceCap, ssa.OpStringLen: - return false - case ssa.OpConst64: - return v.AuxInt < 0 - case ssa.OpConst32: - return int32(v.AuxInt) < 0 - } - return true -} - // sliceBoundsCheck generates slice bounds checking code. Checks if 0 <= idx <= len, branches to exit if not. +// len must be known to be nonnegative. // Starts a new block on return. // idx and len are already converted to full int width. func (s *state) sliceBoundsCheck(idx, len *ssa.Value) { if Debug['B'] != 0 { return } - if couldBeNegative(len) { - // OpIsSliceInBounds requires second arg not negative; if it's not obviously true, must check. - cmpop := ssa.OpGeq64 - if len.Type.Size() == 4 { - cmpop = ssa.OpGeq32 - } - cmp := s.newValue2(cmpop, types.Types[TBOOL], len, s.zeroVal(len.Type)) - s.check(cmp, panicslice) - } // bounds check cmp := s.newValue2(ssa.OpIsSliceInBounds, types.Types[TBOOL], idx, len) @@ -4332,13 +4313,15 @@ func (s *state) slice(t *types.Type, v, i, j, k *ssa.Value, bounded bool) (p, l, if !bounded { // Panic if slice indices are not in bounds. - s.sliceBoundsCheck(i, j) - if j != k { - s.sliceBoundsCheck(j, k) - } + // Make sure we check these in reverse order so that we're always + // comparing against a value known to be nonnegative. See issue 28797. if k != cap { s.sliceBoundsCheck(k, cap) } + if j != k { + s.sliceBoundsCheck(j, k) + } + s.sliceBoundsCheck(i, j) } // Generate the following code assuming that indexes are in bounds. diff --git a/test/loopbce.go b/test/loopbce.go index 81f2524e95..e0a6463c5e 100644 --- a/test/loopbce.go +++ b/test/loopbce.go @@ -63,7 +63,7 @@ func f5(a [10]int) int { func f6(a []int) { for i := range a { // ERROR "Induction variable: limits \[0,\?\), increment 1$" - b := a[0:i] // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" "(\([0-9]+\) )?Proved Geq64$" + b := a[0:i] // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" f6(b) } } @@ -186,10 +186,10 @@ func k0(a [100]int) [100]int { func k1(a [100]int) [100]int { for i := 10; i < 90; i++ { // ERROR "Induction variable: limits \[10,90\), increment 1$" - useSlice(a[:i-11]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" + useSlice(a[:i-11]) useSlice(a[:i-10]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" useSlice(a[:i-5]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" - useSlice(a[:i]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" "(\([0-9]+\) )?Proved Geq64$" + useSlice(a[:i]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" useSlice(a[:i+5]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" useSlice(a[:i+10]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" useSlice(a[:i+11]) // ERROR "(\([0-9]+\) )?Proved IsSliceInBounds$" diff --git a/test/prove.go b/test/prove.go index eb0fb2a15e..2db0a841e2 100644 --- a/test/prove.go +++ b/test/prove.go @@ -269,7 +269,7 @@ func f11b(a []int, i int) { func f11c(a []int, i int) { useSlice(a[:i]) - useSlice(a[:i]) // ERROR "Proved Geq64$" "Proved IsSliceInBounds$" + useSlice(a[:i]) // ERROR "Proved IsSliceInBounds$" } func f11d(a []int, i int) { @@ -469,7 +469,7 @@ func f17(b []int) { // using the derived relation between len and cap. // This depends on finding the contradiction, since we // don't query this condition directly. - useSlice(b[:i]) // ERROR "Proved Geq64$" "Proved IsSliceInBounds$" + useSlice(b[:i]) // ERROR "Proved IsSliceInBounds$" } } -- GitLab From 41cb0aedffdf4c5087de82710c4d016a3634b4ac Mon Sep 17 00:00:00 2001 From: Carlo Alberto Ferraris Date: Fri, 9 Nov 2018 22:49:38 +0900 Subject: [PATCH 0373/1679] sync: allow inlining the Mutex.Lock fast path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit name old time/op new time/op delta MutexUncontended 18.9ns ± 0% 16.2ns ± 0% -14.29% (p=0.000 n=19+19) MutexUncontended-4 4.75ns ± 1% 4.08ns ± 0% -14.20% (p=0.000 n=20+19) MutexUncontended-16 2.05ns ± 0% 2.11ns ± 0% +2.93% (p=0.000 n=19+16) Mutex 19.3ns ± 1% 16.2ns ± 0% -15.86% (p=0.000 n=17+19) Mutex-4 52.4ns ± 4% 48.6ns ± 9% -7.22% (p=0.000 n=20+20) Mutex-16 139ns ± 2% 140ns ± 3% +1.03% (p=0.011 n=16+20) MutexSlack 18.9ns ± 1% 16.2ns ± 1% -13.96% (p=0.000 n=20+20) MutexSlack-4 225ns ± 8% 211ns ±10% -5.94% (p=0.000 n=18+19) MutexSlack-16 98.4ns ± 1% 90.9ns ± 1% -7.60% (p=0.000 n=17+18) MutexWork 58.2ns ± 3% 55.4ns ± 0% -4.82% (p=0.000 n=20+17) MutexWork-4 103ns ± 7% 95ns ±18% -8.03% (p=0.000 n=20+20) MutexWork-16 163ns ± 2% 155ns ± 2% -4.47% (p=0.000 n=18+18) MutexWorkSlack 57.7ns ± 1% 55.4ns ± 0% -3.99% (p=0.000 n=20+13) MutexWorkSlack-4 276ns ±13% 260ns ±10% -5.64% (p=0.001 n=19+19) MutexWorkSlack-16 147ns ± 0% 156ns ± 1% +5.87% (p=0.000 n=14+19) MutexNoSpin 968ns ± 0% 900ns ± 1% -6.98% (p=0.000 n=20+18) MutexNoSpin-4 270ns ± 2% 255ns ± 2% -5.74% (p=0.000 n=19+20) MutexNoSpin-16 120ns ± 4% 112ns ± 0% -6.99% (p=0.000 n=19+14) MutexSpin 3.13µs ± 1% 3.19µs ± 6% ~ (p=0.401 n=20+20) MutexSpin-4 832ns ± 2% 831ns ± 1% -0.17% (p=0.023 n=16+18) MutexSpin-16 395ns ± 0% 399ns ± 0% +0.94% (p=0.000 n=17+19) RWMutexUncontended 69.5ns ± 0% 68.4ns ± 0% -1.59% (p=0.000 n=20+20) RWMutexUncontended-4 17.5ns ± 0% 16.7ns ± 0% -4.30% (p=0.000 n=18+17) RWMutexUncontended-16 7.92ns ± 0% 7.87ns ± 0% -0.61% (p=0.000 n=18+17) RWMutexWrite100 24.9ns ± 1% 25.0ns ± 1% +0.32% (p=0.000 n=20+20) RWMutexWrite100-4 46.2ns ± 4% 46.2ns ± 5% ~ (p=0.840 n=19+20) RWMutexWrite100-16 69.9ns ± 5% 69.9ns ± 3% ~ (p=0.545 n=20+19) RWMutexWrite10 27.0ns ± 2% 26.8ns ± 2% -0.98% (p=0.001 n=20+20) RWMutexWrite10-4 34.7ns ± 2% 35.0ns ± 4% ~ (p=0.191 n=18+20) RWMutexWrite10-16 37.2ns ± 4% 37.3ns ± 2% ~ (p=0.438 n=20+19) RWMutexWorkWrite100 164ns ± 0% 163ns ± 0% -0.24% (p=0.025 n=20+20) RWMutexWorkWrite100-4 193ns ± 3% 191ns ± 2% -1.06% (p=0.027 n=20+20) RWMutexWorkWrite100-16 210ns ± 3% 207ns ± 3% -1.22% (p=0.038 n=20+20) RWMutexWorkWrite10 153ns ± 0% 153ns ± 0% ~ (all equal) RWMutexWorkWrite10-4 178ns ± 2% 179ns ± 2% ~ (p=0.186 n=20+20) RWMutexWorkWrite10-16 192ns ± 2% 192ns ± 2% ~ (p=0.731 n=19+20) linux/amd64 bin/go 14663387 (previous commit 14630572, +32815/+0.22%) Change-Id: I98171006dce14069b1a62da07c3d165455a7906b Reviewed-on: https://go-review.googlesource.com/c/go/+/148959 Reviewed-by: Brad Fitzpatrick --- src/runtime/sema.go | 16 ++++++++-------- src/sync/mutex.go | 6 +++++- src/sync/runtime.go | 4 +++- src/sync/rwmutex.go | 4 ++-- test/inline_sync.go | 11 ++++++++++- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/runtime/sema.go b/src/runtime/sema.go index f848515ae2..30c8959473 100644 --- a/src/runtime/sema.go +++ b/src/runtime/sema.go @@ -53,12 +53,12 @@ var semtable [semTabSize]struct { //go:linkname sync_runtime_Semacquire sync.runtime_Semacquire func sync_runtime_Semacquire(addr *uint32) { - semacquire1(addr, false, semaBlockProfile) + semacquire1(addr, false, semaBlockProfile, 0) } //go:linkname poll_runtime_Semacquire internal/poll.runtime_Semacquire func poll_runtime_Semacquire(addr *uint32) { - semacquire1(addr, false, semaBlockProfile) + semacquire1(addr, false, semaBlockProfile, 0) } //go:linkname sync_runtime_Semrelease sync.runtime_Semrelease @@ -67,8 +67,8 @@ func sync_runtime_Semrelease(addr *uint32, handoff bool, skipframes int) { } //go:linkname sync_runtime_SemacquireMutex sync.runtime_SemacquireMutex -func sync_runtime_SemacquireMutex(addr *uint32, lifo bool) { - semacquire1(addr, lifo, semaBlockProfile|semaMutexProfile) +func sync_runtime_SemacquireMutex(addr *uint32, lifo bool, skipframes int) { + semacquire1(addr, lifo, semaBlockProfile|semaMutexProfile, skipframes) } //go:linkname poll_runtime_Semrelease internal/poll.runtime_Semrelease @@ -92,10 +92,10 @@ const ( // Called from runtime. func semacquire(addr *uint32) { - semacquire1(addr, false, 0) + semacquire1(addr, false, 0, 0) } -func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags) { +func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags, skipframes int) { gp := getg() if gp != gp.m.curg { throw("semacquire not on the G stack") @@ -141,13 +141,13 @@ func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags) { // Any semrelease after the cansemacquire knows we're waiting // (we set nwait above), so go to sleep. root.queue(addr, s, lifo) - goparkunlock(&root.lock, waitReasonSemacquire, traceEvGoBlockSync, 4) + goparkunlock(&root.lock, waitReasonSemacquire, traceEvGoBlockSync, 4+skipframes) if s.ticket != 0 || cansemacquire(addr) { break } } if s.releasetime > 0 { - blockevent(s.releasetime-t0, 3) + blockevent(s.releasetime-t0, 3+skipframes) } releaseSudog(s) } diff --git a/src/sync/mutex.go b/src/sync/mutex.go index a809993fe0..11ad20c975 100644 --- a/src/sync/mutex.go +++ b/src/sync/mutex.go @@ -77,7 +77,11 @@ func (m *Mutex) Lock() { } return } + // Slow path (outlined so that the fast path can be inlined) + m.lockSlow() +} +func (m *Mutex) lockSlow() { var waitStartTime int64 starving := false awoke := false @@ -131,7 +135,7 @@ func (m *Mutex) Lock() { if waitStartTime == 0 { waitStartTime = runtime_nanotime() } - runtime_SemacquireMutex(&m.sema, queueLifo) + runtime_SemacquireMutex(&m.sema, queueLifo, 1) starving = starving || runtime_nanotime()-waitStartTime > starvationThresholdNs old = m.state if old&mutexStarving != 0 { diff --git a/src/sync/runtime.go b/src/sync/runtime.go index 8b20b0f6f7..3ad44e786f 100644 --- a/src/sync/runtime.go +++ b/src/sync/runtime.go @@ -15,7 +15,9 @@ func runtime_Semacquire(s *uint32) // SemacquireMutex is like Semacquire, but for profiling contended Mutexes. // If lifo is true, queue waiter at the head of wait queue. -func runtime_SemacquireMutex(s *uint32, lifo bool) +// skipframes is the number of frames to omit during tracing, counting from +// runtime_SemacquireMutex's caller. +func runtime_SemacquireMutex(s *uint32, lifo bool, skipframes int) // Semrelease atomically increments *s and notifies a waiting goroutine // if one is blocked in Semacquire. diff --git a/src/sync/rwmutex.go b/src/sync/rwmutex.go index 24dd78cbe7..aafd6a7010 100644 --- a/src/sync/rwmutex.go +++ b/src/sync/rwmutex.go @@ -47,7 +47,7 @@ func (rw *RWMutex) RLock() { } if atomic.AddInt32(&rw.readerCount, 1) < 0 { // A writer is pending, wait for it. - runtime_SemacquireMutex(&rw.readerSem, false) + runtime_SemacquireMutex(&rw.readerSem, false, 0) } if race.Enabled { race.Enable() @@ -95,7 +95,7 @@ func (rw *RWMutex) Lock() { r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders // Wait for active readers. if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 { - runtime_SemacquireMutex(&rw.writerSem, false) + runtime_SemacquireMutex(&rw.writerSem, false, 0) } if race.Enabled { race.Enable() diff --git a/test/inline_sync.go b/test/inline_sync.go index b25e56447b..a14f58c432 100644 --- a/test/inline_sync.go +++ b/test/inline_sync.go @@ -8,7 +8,11 @@ // Test, using compiler diagnostic flags, that inlining of functions // imported from the sync package is working. // Compiles but does not run. -// FIXME: nacl-386 is excluded as inlining currently does not work there. + +// FIXME: This test is disabled on architectures where atomic operations +// are function calls rather than intrinsics, since this prevents inlining +// of the sync fast paths. This test should be re-enabled once the problem +// is solved. package foo @@ -22,3 +26,8 @@ func small5() { // ERROR "can inline small5" // the Unlock fast path should be inlined mutex.Unlock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Unlock" "&sync\.m\.state escapes to heap" } + +func small6() { // ERROR "can inline small6" + // the Lock fast path should be inlined + mutex.Lock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Lock" "&sync\.m\.state escapes to heap" +} -- GitLab From ca8354843ef9f30207efd0a40bb6c53e7ba86892 Mon Sep 17 00:00:00 2001 From: Carlo Alberto Ferraris Date: Tue, 13 Nov 2018 15:34:22 +0900 Subject: [PATCH 0374/1679] sync: allow inlining the Once.Do fast path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using Once.Do is now extremely cheap because the fast path is just an inlined atomic load of a variable that is written only once and a conditional jump. This is very beneficial for Once.Do because, due to its nature, the fast path will be used for every call after the first one. In a attempt to mimize code size increase, reorder the fields so that the pointer to Once is also the pointer to Once.done, that is the only field used in the hot path. This allows to use more compact instruction encodings or less instructions in the hot path (that is inlined at every callsite). name old time/op new time/op delta Once 4.54ns ± 0% 2.06ns ± 0% -54.59% (p=0.000 n=19+16) Once-4 1.18ns ± 0% 0.55ns ± 0% -53.39% (p=0.000 n=15+16) Once-16 0.53ns ± 0% 0.17ns ± 0% -67.92% (p=0.000 n=18+17) linux/amd64 bin/go 14675861 (previous commit 14663387, +12474/+0.09%) Change-Id: Ie2708103ab473787875d66746d2f20f1d90a6916 Reviewed-on: https://go-review.googlesource.com/c/go/+/152697 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Austin Clements --- src/sync/once.go | 16 ++++++++++++---- test/inline_sync.go | 7 +++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/sync/once.go b/src/sync/once.go index d8ef952ea5..84761970dd 100644 --- a/src/sync/once.go +++ b/src/sync/once.go @@ -10,8 +10,13 @@ import ( // Once is an object that will perform exactly one action. type Once struct { - m Mutex + // done indicates whether the action has been performed. + // It is first in the struct because it is used in the hot path. + // The hot path is inlined at every call site. + // Placing done first allows more compact instructions on some architectures (amd64/x86), + // and fewer instructions (to calculate offset) on other architectures. done uint32 + m Mutex } // Do calls the function f if and only if Do is being called for the @@ -33,10 +38,13 @@ type Once struct { // without calling f. // func (o *Once) Do(f func()) { - if atomic.LoadUint32(&o.done) == 1 { - return + if atomic.LoadUint32(&o.done) == 0 { + // Outlined slow-path to allow inlining of the fast-path. + o.doSlow(f) } - // Slow-path. +} + +func (o *Once) doSlow(f func()) { o.m.Lock() defer o.m.Unlock() if o.done == 0 { diff --git a/test/inline_sync.go b/test/inline_sync.go index a14f58c432..3473b92b4a 100644 --- a/test/inline_sync.go +++ b/test/inline_sync.go @@ -31,3 +31,10 @@ func small6() { // ERROR "can inline small6" // the Lock fast path should be inlined mutex.Lock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Lock" "&sync\.m\.state escapes to heap" } + +var once *sync.Once + +func small7() { // ERROR "can inline small7" + // the Do fast path should be inlined + once.Do(small5) // ERROR "inlining call to sync\.\(\*Once\)\.Do" "&sync\.o\.done escapes to heap" +} -- GitLab From 0e9d7d430b1aa74a58054a6a69aa3fb37353168d Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sat, 9 Mar 2019 14:11:40 +0100 Subject: [PATCH 0375/1679] bytes: return early in Repeat if count is 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This matches the implementation of strings.Repeat and slightly increases performance: name old time/op new time/op delta Repeat-8 145ns ±12% 125ns ±29% -13.35% (p=0.009 n=10+10) Change-Id: Ic0a0e2ea9e36591286a49def320ddb67fe0b2c50 Reviewed-on: https://go-review.googlesource.com/c/go/+/166399 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/bytes/bytes.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index f65bf214cc..6fcebe6593 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -499,13 +499,16 @@ func Map(mapping func(r rune) rune, s []byte) []byte { // It panics if count is negative or if // the result of (len(b) * count) overflows. func Repeat(b []byte, count int) []byte { + if count == 0 { + return []byte{} + } // Since we cannot return an error on overflow, // we should panic if the repeat will generate // an overflow. // See Issue golang.org/issue/16237. if count < 0 { panic("bytes: negative Repeat count") - } else if count > 0 && len(b)*count/count != len(b) { + } else if len(b)*count/count != len(b) { panic("bytes: Repeat count causes overflow") } -- GitLab From 05051b56a0184d8dfdb857e8ee10c99bfbf4646b Mon Sep 17 00:00:00 2001 From: Carlo Alberto Ferraris Date: Tue, 13 Nov 2018 17:08:17 +0900 Subject: [PATCH 0376/1679] sync: allow inlining the RWMutex.RUnlock fast path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RWMutex.RLock is already inlineable, so add a test for it as well. name old time/op new time/op delta RWMutexUncontended 66.5ns ± 0% 60.3ns ± 1% -9.38% (p=0.000 n=12+20) RWMutexUncontended-4 16.7ns ± 0% 15.3ns ± 1% -8.49% (p=0.000 n=17+20) RWMutexUncontended-16 7.86ns ± 0% 7.69ns ± 0% -2.08% (p=0.000 n=18+15) RWMutexWrite100 25.1ns ± 0% 24.0ns ± 1% -4.28% (p=0.000 n=20+18) RWMutexWrite100-4 46.7ns ± 5% 44.1ns ± 4% -5.53% (p=0.000 n=20+20) RWMutexWrite100-16 68.3ns ±11% 65.7ns ± 8% -3.81% (p=0.003 n=20+20) RWMutexWrite10 26.7ns ± 1% 25.7ns ± 0% -3.75% (p=0.000 n=17+14) RWMutexWrite10-4 34.9ns ± 2% 33.8ns ± 2% -3.15% (p=0.000 n=20+20) RWMutexWrite10-16 37.4ns ± 2% 36.1ns ± 2% -3.51% (p=0.000 n=18+20) RWMutexWorkWrite100 163ns ± 0% 162ns ± 0% -0.89% (p=0.000 n=18+20) RWMutexWorkWrite100-4 189ns ± 4% 184ns ± 4% -2.89% (p=0.000 n=19+20) RWMutexWorkWrite100-16 207ns ± 4% 200ns ± 2% -3.07% (p=0.000 n=19+20) RWMutexWorkWrite10 153ns ± 0% 151ns ± 1% -0.75% (p=0.000 n=20+20) RWMutexWorkWrite10-4 177ns ± 1% 176ns ± 2% -0.63% (p=0.004 n=17+20) RWMutexWorkWrite10-16 191ns ± 2% 189ns ± 1% -0.83% (p=0.015 n=20+17) linux/amd64 bin/go 14688201 (previous commit 14675861, +12340/+0.08%) The cumulative effect of this and the previous 3 commits is: name old time/op new time/op delta MutexUncontended 19.3ns ± 1% 16.4ns ± 1% -15.13% (p=0.000 n=20+20) MutexUncontended-4 5.24ns ± 0% 4.09ns ± 0% -21.95% (p=0.000 n=20+18) MutexUncontended-16 2.10ns ± 0% 2.12ns ± 0% +0.95% (p=0.000 n=15+17) Mutex 19.6ns ± 0% 16.3ns ± 1% -17.12% (p=0.000 n=20+20) Mutex-4 54.6ns ± 5% 45.6ns ±10% -16.51% (p=0.000 n=20+19) Mutex-16 133ns ± 5% 130ns ± 3% -1.99% (p=0.002 n=20+20) MutexSlack 33.4ns ± 2% 16.2ns ± 0% -51.44% (p=0.000 n=19+20) MutexSlack-4 206ns ± 5% 209ns ± 9% ~ (p=0.154 n=20+20) MutexSlack-16 89.4ns ± 1% 90.9ns ± 2% +1.70% (p=0.000 n=18+17) MutexWork 60.5ns ± 0% 55.3ns ± 1% -8.59% (p=0.000 n=12+20) MutexWork-4 105ns ± 5% 97ns ±11% -7.95% (p=0.000 n=20+20) MutexWork-16 157ns ± 1% 158ns ± 1% +0.66% (p=0.001 n=18+17) MutexWorkSlack 70.2ns ± 5% 55.3ns ± 0% -21.30% (p=0.000 n=19+18) MutexWorkSlack-4 277ns ±13% 260ns ±15% -6.35% (p=0.002 n=20+18) MutexWorkSlack-16 156ns ± 0% 146ns ± 1% -6.40% (p=0.000 n=16+19) MutexNoSpin 966ns ± 0% 976ns ± 1% +0.97% (p=0.000 n=15+17) MutexNoSpin-4 269ns ± 4% 272ns ± 4% +1.15% (p=0.048 n=20+18) MutexNoSpin-16 122ns ± 0% 119ns ± 1% -2.63% (p=0.000 n=19+15) MutexSpin 3.13µs ± 0% 3.12µs ± 0% -0.17% (p=0.000 n=18+18) MutexSpin-4 826ns ± 1% 833ns ± 1% +0.84% (p=0.000 n=19+17) MutexSpin-16 397ns ± 1% 394ns ± 1% -0.78% (p=0.000 n=19+19) Once 5.67ns ± 0% 2.07ns ± 2% -63.43% (p=0.000 n=20+20) Once-4 1.47ns ± 2% 0.54ns ± 3% -63.49% (p=0.000 n=19+20) Once-16 0.58ns ± 0% 0.17ns ± 5% -70.49% (p=0.000 n=17+17) RWMutexUncontended 71.4ns ± 0% 60.3ns ± 1% -15.60% (p=0.000 n=16+20) RWMutexUncontended-4 18.4ns ± 4% 15.3ns ± 1% -17.14% (p=0.000 n=20+20) RWMutexUncontended-16 8.01ns ± 0% 7.69ns ± 0% -3.91% (p=0.000 n=18+15) RWMutexWrite100 24.9ns ± 0% 24.0ns ± 1% -3.57% (p=0.000 n=19+18) RWMutexWrite100-4 46.5ns ± 3% 44.1ns ± 4% -5.09% (p=0.000 n=17+20) RWMutexWrite100-16 68.9ns ± 3% 65.7ns ± 8% -4.65% (p=0.000 n=18+20) RWMutexWrite10 27.1ns ± 0% 25.7ns ± 0% -5.25% (p=0.000 n=17+14) RWMutexWrite10-4 34.8ns ± 1% 33.8ns ± 2% -2.96% (p=0.000 n=20+20) RWMutexWrite10-16 37.5ns ± 2% 36.1ns ± 2% -3.72% (p=0.000 n=20+20) RWMutexWorkWrite100 164ns ± 0% 162ns ± 0% -1.49% (p=0.000 n=12+20) RWMutexWorkWrite100-4 186ns ± 3% 184ns ± 4% ~ (p=0.097 n=20+20) RWMutexWorkWrite100-16 204ns ± 2% 200ns ± 2% -1.58% (p=0.000 n=18+20) RWMutexWorkWrite10 153ns ± 0% 151ns ± 1% -1.21% (p=0.000 n=20+20) RWMutexWorkWrite10-4 179ns ± 1% 176ns ± 2% -1.25% (p=0.000 n=19+20) RWMutexWorkWrite10-16 191ns ± 1% 189ns ± 1% -0.94% (p=0.000 n=15+17) Change-Id: I9269bf2ac42a04c610624f707d3268dcb17390f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/152698 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/sync/rwmutex.go | 23 ++++++++++++++--------- test/inline_sync.go | 13 +++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/sync/rwmutex.go b/src/sync/rwmutex.go index aafd6a7010..dc0faf6a60 100644 --- a/src/sync/rwmutex.go +++ b/src/sync/rwmutex.go @@ -66,21 +66,26 @@ func (rw *RWMutex) RUnlock() { race.Disable() } if r := atomic.AddInt32(&rw.readerCount, -1); r < 0 { - if r+1 == 0 || r+1 == -rwmutexMaxReaders { - race.Enable() - throw("sync: RUnlock of unlocked RWMutex") - } - // A writer is pending. - if atomic.AddInt32(&rw.readerWait, -1) == 0 { - // The last reader unblocks the writer. - runtime_Semrelease(&rw.writerSem, false, 0) - } + // Outlined slow-path to allow the fast-path to be inlined + rw.rUnlockSlow(r) } if race.Enabled { race.Enable() } } +func (rw *RWMutex) rUnlockSlow(r int32) { + if r+1 == 0 || r+1 == -rwmutexMaxReaders { + race.Enable() + throw("sync: RUnlock of unlocked RWMutex") + } + // A writer is pending. + if atomic.AddInt32(&rw.readerWait, -1) == 0 { + // The last reader unblocks the writer. + runtime_Semrelease(&rw.writerSem, false, 1) + } +} + // Lock locks rw for writing. // If the lock is already locked for reading or writing, // Lock blocks until the lock is available. diff --git a/test/inline_sync.go b/test/inline_sync.go index 3473b92b4a..46ee4c62ed 100644 --- a/test/inline_sync.go +++ b/test/inline_sync.go @@ -38,3 +38,16 @@ func small7() { // ERROR "can inline small7" // the Do fast path should be inlined once.Do(small5) // ERROR "inlining call to sync\.\(\*Once\)\.Do" "&sync\.o\.done escapes to heap" } + +var rwmutex *sync.RWMutex + +func small8() { // ERROR "can inline small8" + // the RUnlock fast path should be inlined + rwmutex.RUnlock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RUnlock" "&sync\.rw\.readerCount escapes to heap" +} + +func small9() { // ERROR "can inline small9" + // the RLock fast path should be inlined + rwmutex.RLock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RLock" "&sync\.rw\.readerCount escapes to heap" "&sync\.rw\.readerSem escapes to heap" +} + -- GitLab From cc5dc00150725fec3933f7d4c571da94978b7978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 9 Mar 2019 17:48:23 +0000 Subject: [PATCH 0377/1679] cmd/compile: update TestIntendedInlining MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Value.CanInterface and Value.pointer are now inlinable, since we have a limited form of mid-stack inlining. Their calls to panic were preventing that in previous Go releases. The other three methods still go over budget, so update that comment. In recent commits, sync.Once.Do and multiple lock/unlock methods have also been made inlinable, so add those as well. They have standalone tests like test/inline_sync.go already, but it's best if the funcs are in this global test table too. They aren't inlinable on every platform yet, though. Finally, use math/bits.UintSize to check if GOARCH is 64-bit, now that we can. Change-Id: I65cc681b77015f7746dba3126637e236dcd494e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/166461 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/inl_test.go | 28 +++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index c29c1755f3..1ad6ca3421 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -8,6 +8,7 @@ import ( "bufio" "internal/testenv" "io" + "math/bits" "os/exec" "regexp" "runtime" @@ -127,16 +128,16 @@ func TestIntendedInlining(t *testing.T) { "reflect": { "Value.CanAddr", "Value.CanSet", + "Value.CanInterface", "Value.IsValid", + "Value.pointer", "add", "align", "flag.kind", "flag.ro", - // TODO: these use panic, need mid-stack - // inlining - // "Value.CanInterface", - // "Value.pointer", + // TODO: these use panic, which gets their budgets + // slightly over the limit // "flag.mustBe", // "flag.mustBeAssignable", // "flag.mustBeExported", @@ -163,12 +164,27 @@ func TestIntendedInlining(t *testing.T) { want["runtime/internal/sys"] = append(want["runtime/internal/sys"], "Ctz32") want["runtime/internal/sys"] = append(want["runtime/internal/sys"], "Bswap32") } - switch runtime.GOARCH { - case "amd64", "amd64p32", "arm64", "mips64", "mips64le", "ppc64", "ppc64le", "s390x": + if bits.UintSize == 64 { // rotl_31 is only defined on 64-bit architectures want["runtime"] = append(want["runtime"], "rotl_31") } + switch runtime.GOARCH { + case "nacl", "386", "wasm", "arm": + default: + // TODO(mvdan): As explained in /test/inline_sync.go, some + // architectures don't have atomic intrinsics, so these go over + // the inlining budget. Move back to the main table once that + // problem is solved. + want["sync"] = []string{ + "(*Mutex).Lock", + "(*Mutex).Unlock", + "(*RWMutex).RLock", + "(*RWMutex).RUnlock", + "(*Once).Do", + } + } + // Functions that must actually be inlined; they must have actual callers. must := map[string]bool{ "compress/flate.byLiteral.Len": true, -- GitLab From 788e038e5d5fcdc1cc44ec9af1885db55a19977c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 9 Mar 2019 18:09:10 +0000 Subject: [PATCH 0378/1679] reflect: make all flag.mustBe* methods inlinable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mustBe was barely over budget, so manually inlining the first flag.kind call is enough. Add a TODO to reverse that in the future, once the compiler gets better. mustBeExported and mustBeAssignable were over budget by a larger amount, so add slow path functions instead. This is the same strategy used in the sync package for common methods like Once.Do, for example. Lots of exported reflect.Value methods call these assert-like unexported methods, so avoiding the function call overhead in the common case does shave off a percent from most exported APIs. Finally, add the methods to TestIntendedInlining. While at it, replace a couple of uses of the 0 Kind with its descriptive name, Invalid. name old time/op new time/op delta Call-8 68.0ns ± 1% 66.8ns ± 1% -1.81% (p=0.000 n=10+9) PtrTo-8 8.00ns ± 2% 7.83ns ± 0% -2.19% (p=0.000 n=10+9) Updates #7818. Change-Id: Ic1603b640519393f6b50dd91ec3767753eb9e761 Reviewed-on: https://go-review.googlesource.com/c/go/+/166462 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/inl_test.go | 9 +++------ src/reflect/value.go | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index 1ad6ca3421..0dfd252372 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -133,14 +133,11 @@ func TestIntendedInlining(t *testing.T) { "Value.pointer", "add", "align", + "flag.mustBe", + "flag.mustBeAssignable", + "flag.mustBeExported", "flag.kind", "flag.ro", - - // TODO: these use panic, which gets their budgets - // slightly over the limit - // "flag.mustBe", - // "flag.mustBeAssignable", - // "flag.mustBeExported", }, "regexp": { "(*bitState).push", diff --git a/src/reflect/value.go b/src/reflect/value.go index 372b7a6dc8..5951b18b8c 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -203,7 +203,8 @@ type nonEmptyInterface struct { // v.flag.mustBe(Bool), which will only bother to copy the // single important word for the receiver. func (f flag) mustBe(expected Kind) { - if f.kind() != expected { + // TODO(mvdan): use f.kind() again once mid-stack inlining gets better + if Kind(f&flagKindMask) != expected { panic(&ValueError{methodName(), f.kind()}) } } @@ -211,8 +212,14 @@ func (f flag) mustBe(expected Kind) { // mustBeExported panics if f records that the value was obtained using // an unexported field. func (f flag) mustBeExported() { + if f == 0 || f&flagRO != 0 { + f.mustBeExportedSlow() + } +} + +func (f flag) mustBeExportedSlow() { if f == 0 { - panic(&ValueError{methodName(), 0}) + panic(&ValueError{methodName(), Invalid}) } if f&flagRO != 0 { panic("reflect: " + methodName() + " using value obtained using unexported field") @@ -223,6 +230,12 @@ func (f flag) mustBeExported() { // which is to say that either it was obtained using an unexported field // or it is not addressable. func (f flag) mustBeAssignable() { + if f&flagRO != 0 || f&flagAddr == 0 { + f.mustBeAssignableSlow() + } +} + +func (f flag) mustBeAssignableSlow() { if f == 0 { panic(&ValueError{methodName(), Invalid}) } @@ -981,7 +994,7 @@ func (v Value) Interface() (i interface{}) { func valueInterface(v Value, safe bool) interface{} { if v.flag == 0 { - panic(&ValueError{"reflect.Value.Interface", 0}) + panic(&ValueError{"reflect.Value.Interface", Invalid}) } if safe && v.flag&flagRO != 0 { // Do not allow access to unexported values via Interface, -- GitLab From 4c227a091e9200ed9757dedd8efbc6e254750c2c Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 3 Mar 2019 12:54:01 -0800 Subject: [PATCH 0379/1679] math/big: remove bounds checks in pure Go implementations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These routines are quite sensitive to BCE. This change eliminates bounds checks from loops. It does so at the cost of a bit of safety: malformed input will now return incorrect answers instead of panicking. This isn't as bad as it sounds: math/big has very good test coverage, and the alternative implementations are in assembly, which could do much worse things with malformed input. If the compiler's BCE improves, so could these routines. Notable BCE improvements for these routines would be: * Allowing and propagating more cross-slice length hints. Then hints like _ = y[:len(z)] would eliminate bounds checks for y[i]. * Propagating enough information so that we could do n := len(x) if len(z) < n { n = len(z) } and then have i < n eliminate the same bounds checks as i < len(x) && i < len(z) currently does. * Providing some way to do BCE for unrolled loops. Now that we have math/bits implementations, it is possible to write things like ADC chains in pure Go, if you can reasonably unroll loops. Benchmarks below are for amd64, using -tags=math_big_pure_go. name old time/op new time/op delta AddVV/1-8 5.15ns ± 3% 4.65ns ± 4% -9.81% (p=0.000 n=93+86) AddVV/2-8 6.40ns ± 2% 5.58ns ± 4% -12.78% (p=0.000 n=90+95) AddVV/3-8 7.07ns ± 2% 6.66ns ± 2% -5.88% (p=0.000 n=87+83) AddVV/4-8 7.94ns ± 5% 7.41ns ± 4% -6.65% (p=0.000 n=94+98) AddVV/5-8 8.55ns ± 1% 8.80ns ± 0% +2.92% (p=0.000 n=87+92) AddVV/10-8 12.7ns ± 1% 12.3ns ± 1% -3.12% (p=0.000 n=83+71) AddVV/100-8 119ns ± 5% 117ns ± 4% -1.60% (p=0.000 n=93+90) AddVV/1000-8 1.14µs ± 4% 1.14µs ± 5% ~ (p=0.812 n=95+91) AddVV/10000-8 11.4µs ± 5% 11.3µs ± 5% ~ (p=0.503 n=97+96) AddVV/100000-8 114µs ± 4% 113µs ± 5% -0.98% (p=0.002 n=97+90) name old time/op new time/op delta SubVV/1-8 5.23ns ± 5% 4.65ns ± 3% -11.18% (p=0.000 n=89+91) SubVV/2-8 6.49ns ± 5% 5.58ns ± 3% -14.04% (p=0.000 n=92+94) SubVV/3-8 7.10ns ± 3% 6.65ns ± 2% -6.28% (p=0.000 n=87+80) SubVV/4-8 8.04ns ± 1% 7.44ns ± 5% -7.49% (p=0.000 n=83+98) SubVV/5-8 8.55ns ± 2% 8.32ns ± 1% -2.75% (p=0.000 n=84+92) SubVV/10-8 12.7ns ± 1% 12.3ns ± 1% -3.09% (p=0.000 n=80+75) SubVV/100-8 119ns ± 0% 116ns ± 3% -1.83% (p=0.000 n=87+98) SubVV/1000-8 1.13µs ± 5% 1.13µs ± 3% ~ (p=0.082 n=96+98) SubVV/10000-8 11.2µs ± 1% 11.3µs ± 3% +0.76% (p=0.000 n=87+97) SubVV/100000-8 112µs ± 2% 113µs ± 3% +0.55% (p=0.000 n=76+88) name old time/op new time/op delta AddVW/1-8 4.30ns ± 4% 3.96ns ± 6% -8.02% (p=0.000 n=89+97) AddVW/2-8 5.15ns ± 2% 4.91ns ± 1% -4.56% (p=0.000 n=87+80) AddVW/3-8 5.59ns ± 3% 5.75ns ± 2% +2.91% (p=0.000 n=91+88) AddVW/4-8 6.20ns ± 1% 6.03ns ± 1% -2.71% (p=0.000 n=75+90) AddVW/5-8 6.93ns ± 3% 6.49ns ± 2% -6.35% (p=0.000 n=100+82) AddVW/10-8 10.0ns ± 7% 9.6ns ± 0% -4.02% (p=0.000 n=98+74) AddVW/100-8 91.1ns ± 1% 90.6ns ± 1% -0.55% (p=0.000 n=84+80) AddVW/1000-8 866ns ± 1% 856ns ± 4% -1.06% (p=0.000 n=69+96) AddVW/10000-8 8.64µs ± 1% 8.53µs ± 4% -1.25% (p=0.000 n=67+99) AddVW/100000-8 84.3µs ± 2% 85.4µs ± 4% +1.22% (p=0.000 n=89+99) name old time/op new time/op delta SubVW/1-8 4.28ns ± 2% 3.82ns ± 3% -10.63% (p=0.000 n=91+89) SubVW/2-8 4.61ns ± 1% 4.48ns ± 3% -2.67% (p=0.000 n=94+96) SubVW/3-8 5.54ns ± 1% 5.81ns ± 4% +4.87% (p=0.000 n=92+97) SubVW/4-8 6.20ns ± 1% 6.08ns ± 2% -1.99% (p=0.000 n=71+88) SubVW/5-8 6.91ns ± 3% 6.64ns ± 1% -3.90% (p=0.000 n=97+70) SubVW/10-8 9.85ns ± 2% 9.62ns ± 0% -2.31% (p=0.000 n=82+62) SubVW/100-8 91.1ns ± 1% 90.9ns ± 3% -0.14% (p=0.010 n=71+93) SubVW/1000-8 859ns ± 3% 867ns ± 1% +0.98% (p=0.000 n=99+78) SubVW/10000-8 8.54µs ± 5% 8.57µs ± 2% +0.38% (p=0.007 n=98+92) SubVW/100000-8 84.5µs ± 3% 84.6µs ± 3% ~ (p=0.334 n=95+94) name old time/op new time/op delta AddMulVVW/1-8 5.43ns ± 3% 4.36ns ± 2% -19.67% (p=0.000 n=95+94) AddMulVVW/2-8 6.56ns ± 4% 6.11ns ± 1% -6.90% (p=0.000 n=91+91) AddMulVVW/3-8 8.00ns ± 1% 7.80ns ± 4% -2.52% (p=0.000 n=83+95) AddMulVVW/4-8 9.81ns ± 2% 9.53ns ± 1% -2.86% (p=0.000 n=77+64) AddMulVVW/5-8 11.4ns ± 3% 11.3ns ± 5% -0.89% (p=0.000 n=95+97) AddMulVVW/10-8 18.9ns ± 5% 19.1ns ± 5% +0.89% (p=0.000 n=91+94) AddMulVVW/100-8 165ns ± 5% 165ns ± 4% ~ (p=0.427 n=97+98) AddMulVVW/1000-8 1.56µs ± 3% 1.56µs ± 4% ~ (p=0.167 n=98+96) AddMulVVW/10000-8 15.7µs ± 5% 15.6µs ± 5% -0.31% (p=0.044 n=95+97) AddMulVVW/100000-8 156µs ± 3% 157µs ± 8% ~ (p=0.373 n=72+99) Change-Id: Ibc720785d5b95f6a797103b1363843205f4d56bf Reviewed-on: https://go-review.googlesource.com/c/go/+/164966 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Robert Griesemer --- src/math/big/arith.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/math/big/arith.go b/src/math/big/arith.go index 541694c670..c291f74db6 100644 --- a/src/math/big/arith.go +++ b/src/math/big/arith.go @@ -21,6 +21,18 @@ const ( _M = _B - 1 // digit mask ) +// Many of the loops in this file are of the form +// for i := 0; i < len(z) && i < len(x) && i < len(y); i++ +// i < len(z) is the real condition. +// However, checking i < len(x) && i < len(y) as well is faster than +// having the compiler do a bounds check in the body of the loop; +// remarkably it is even faster than hoisting the bounds check +// out of the loop, by doing something like +// _, _ = x[len(z)-1], y[len(z)-1] +// There are other ways to hoist the bounds check out of the loop, +// but the compiler's BCE isn't powerful enough for them (yet?). +// See the discussion in CL 164966. + // ---------------------------------------------------------------------------- // Elementary operations on words // @@ -54,7 +66,8 @@ func divWW_g(u1, u0, v Word) (q, r Word) { // The resulting carry c is either 0 or 1. func addVV_g(z, x, y []Word) (c Word) { - for i := range x[:len(z)] { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x) && i < len(y); i++ { zi, cc := bits.Add(uint(x[i]), uint(y[i]), uint(c)) z[i] = Word(zi) c = Word(cc) @@ -64,7 +77,8 @@ func addVV_g(z, x, y []Word) (c Word) { // The resulting carry c is either 0 or 1. func subVV_g(z, x, y []Word) (c Word) { - for i := range x[:len(z)] { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x) && i < len(y); i++ { zi, cc := bits.Sub(uint(x[i]), uint(y[i]), uint(c)) z[i] = Word(zi) c = Word(cc) @@ -75,7 +89,8 @@ func subVV_g(z, x, y []Word) (c Word) { // The resulting carry c is either 0 or 1. func addVW_g(z, x []Word, y Word) (c Word) { c = y - for i := range x[:len(z)] { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { zi, cc := bits.Add(uint(x[i]), uint(c), 0) z[i] = Word(zi) c = Word(cc) @@ -85,7 +100,8 @@ func addVW_g(z, x []Word, y Word) (c Word) { func subVW_g(z, x []Word, y Word) (c Word) { c = y - for i := range x[:len(z)] { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { zi, cc := bits.Sub(uint(x[i]), uint(c), 0) z[i] = Word(zi) c = Word(cc) @@ -139,14 +155,16 @@ func shrVU_g(z, x []Word, s uint) (c Word) { func mulAddVWW_g(z, x []Word, y, r Word) (c Word) { c = r - for i := range z { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { c, z[i] = mulAddWWW_g(x[i], y, c) } return } func addMulVVW_g(z, x []Word, y Word) (c Word) { - for i := range z { + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { z1, z0 := mulAddWWW_g(x[i], y, z[i]) lo, cc := bits.Add(uint(z0), uint(c), 0) c, z[i] = Word(cc), Word(lo) -- GitLab From fe24837c4de6dac36f3496e6bac85f72209ee841 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 3 Mar 2019 14:47:20 -0800 Subject: [PATCH 0380/1679] math/big: add fast path for pure Go addVW for large z MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the normal case, only a few words have to be updated when adding a word to a vector. When that happens, we can simply copy the rest of the words, which is much faster. However, the overhead of that makes it prohibitive for small vectors, so we check the size at the beginning. The implementation is a bit weird to allow addVW to continued to be inlined; see #30548. The AddVW benchmarks are surprising, but fully repeatable. The SubVW benchmarks are more or less as expected. I expect that removing the indirect function call will help both and make them a bit more normal. name old time/op new time/op delta AddVW/1-8 4.27ns ± 2% 3.81ns ± 3% -10.83% (p=0.000 n=89+90) AddVW/2-8 4.91ns ± 2% 4.34ns ± 1% -11.60% (p=0.000 n=83+90) AddVW/3-8 5.77ns ± 4% 5.76ns ± 2% ~ (p=0.365 n=91+87) AddVW/4-8 6.03ns ± 1% 6.03ns ± 1% ~ (p=0.392 n=80+76) AddVW/5-8 6.48ns ± 2% 6.63ns ± 1% +2.27% (p=0.000 n=76+74) AddVW/10-8 9.56ns ± 2% 9.56ns ± 1% -0.02% (p=0.002 n=69+76) AddVW/100-8 90.6ns ± 0% 18.1ns ± 4% -79.99% (p=0.000 n=72+94) AddVW/1000-8 865ns ± 0% 85ns ± 6% -90.14% (p=0.000 n=66+96) AddVW/10000-8 8.57µs ± 2% 1.82µs ± 3% -78.73% (p=0.000 n=99+94) AddVW/100000-8 84.4µs ± 2% 31.8µs ± 4% -62.29% (p=0.000 n=93+98) name old time/op new time/op delta SubVW/1-8 3.90ns ± 2% 4.13ns ± 4% +6.02% (p=0.000 n=92+95) SubVW/2-8 4.15ns ± 1% 5.20ns ± 1% +25.22% (p=0.000 n=83+85) SubVW/3-8 5.50ns ± 2% 6.22ns ± 6% +13.21% (p=0.000 n=91+97) SubVW/4-8 5.99ns ± 1% 6.63ns ± 1% +10.63% (p=0.000 n=79+61) SubVW/5-8 6.75ns ± 4% 6.88ns ± 2% +1.82% (p=0.000 n=98+73) SubVW/10-8 9.57ns ± 1% 9.56ns ± 1% -0.13% (p=0.000 n=77+64) SubVW/100-8 90.3ns ± 1% 18.1ns ± 2% -80.00% (p=0.000 n=75+94) SubVW/1000-8 860ns ± 4% 85ns ± 7% -90.14% (p=0.000 n=97+99) SubVW/10000-8 8.51µs ± 3% 1.77µs ± 6% -79.21% (p=0.000 n=100+97) SubVW/100000-8 84.4µs ± 3% 31.5µs ± 3% -62.66% (p=0.000 n=92+92) Change-Id: I721d7031d40f245b4a284f5bdd93e7bb85e7e937 Reviewed-on: https://go-review.googlesource.com/c/go/+/164968 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith.go | 44 +++++++++++++++++++++++++++++++-- src/math/big/arith_decl_pure.go | 14 +++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/src/math/big/arith.go b/src/math/big/arith.go index c291f74db6..ed51f38836 100644 --- a/src/math/big/arith.go +++ b/src/math/big/arith.go @@ -3,8 +3,10 @@ // license that can be found in the LICENSE file. // This file provides Go implementations of elementary multi-precision -// arithmetic operations on word vectors. Needed for platforms without -// assembly implementations of these routines. +// arithmetic operations on word vectors. These have the suffix _g. +// These are needed for platforms without assembly implementations of these routines. +// This file also contains elementary operations that can be implemented +// sufficiently efficiently in Go. package big @@ -98,6 +100,28 @@ func addVW_g(z, x []Word, y Word) (c Word) { return } +// addVWlarge is addVW, but intended for large z. +// The only difference is that we check on every iteration +// whether we are done with carries, +// and if so, switch to a much faster copy instead. +// This is only a good idea for large z, +// because the overhead of the check and the function call +// outweigh the benefits when z is small. +func addVWlarge(z, x []Word, y Word) (c Word) { + c = y + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { + if c == 0 { + copy(z[i:], x[i:]) + return + } + zi, cc := bits.Add(uint(x[i]), uint(c), 0) + z[i] = Word(zi) + c = Word(cc) + } + return +} + func subVW_g(z, x []Word, y Word) (c Word) { c = y // The comment near the top of this file discusses this for loop condition. @@ -109,6 +133,22 @@ func subVW_g(z, x []Word, y Word) (c Word) { return } +// subVWlarge is to subVW as addVWlarge is to addVW. +func subVWlarge(z, x []Word, y Word) (c Word) { + c = y + // The comment near the top of this file discusses this for loop condition. + for i := 0; i < len(z) && i < len(x); i++ { + if c == 0 { + copy(z[i:], x[i:]) + return + } + zi, cc := bits.Sub(uint(x[i]), uint(c), 0) + z[i] = Word(zi) + c = Word(cc) + } + return +} + func shlVU_g(z, x []Word, s uint) (c Word) { if s == 0 { copy(z, x) diff --git a/src/math/big/arith_decl_pure.go b/src/math/big/arith_decl_pure.go index 4ae49c123d..305f7ee03b 100644 --- a/src/math/big/arith_decl_pure.go +++ b/src/math/big/arith_decl_pure.go @@ -23,11 +23,21 @@ func subVV(z, x, y []Word) (c Word) { } func addVW(z, x []Word, y Word) (c Word) { - return addVW_g(z, x, y) + // TODO: remove indirect function call when golang.org/issue/30548 is fixed + fn := addVW_g + if len(z) > 32 { + fn = addVWlarge + } + return fn(z, x, y) } func subVW(z, x []Word, y Word) (c Word) { - return subVW_g(z, x, y) + // TODO: remove indirect function call when golang.org/issue/30548 is fixed + fn := subVW_g + if len(z) > 32 { + fn = subVWlarge + } + return fn(z, x, y) } func shlVU(z, x []Word, s uint) (c Word) { -- GitLab From 4d10aba35eebe9cb4a0b6627815dc1fbddc97100 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 3 Mar 2019 14:48:50 -0800 Subject: [PATCH 0381/1679] math/big: add fast path for amd64 addVW for large z MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This matches the pure Go fast path added in the previous commit. I will leave other architectures to those with ready access to hardware. name old time/op new time/op delta AddVW/1-8 3.60ns ± 3% 3.59ns ± 1% ~ (p=0.147 n=91+86) AddVW/2-8 3.92ns ± 1% 3.91ns ± 2% -0.36% (p=0.000 n=86+92) AddVW/3-8 4.33ns ± 5% 4.46ns ± 5% +2.94% (p=0.000 n=96+97) AddVW/4-8 4.76ns ± 5% 4.82ns ± 5% +1.28% (p=0.000 n=95+92) AddVW/5-8 5.40ns ± 1% 5.42ns ± 0% +0.47% (p=0.000 n=76+71) AddVW/10-8 8.03ns ± 1% 7.80ns ± 5% -2.90% (p=0.000 n=73+96) AddVW/100-8 43.8ns ± 5% 17.9ns ± 1% -59.12% (p=0.000 n=94+81) AddVW/1000-8 428ns ± 4% 85ns ± 6% -80.20% (p=0.000 n=96+99) AddVW/10000-8 4.22µs ± 2% 1.80µs ± 3% -57.32% (p=0.000 n=69+92) AddVW/100000-8 44.8µs ± 8% 31.5µs ± 3% -29.76% (p=0.000 n=99+90) name old time/op new time/op delta SubVW/1-8 3.53ns ± 2% 3.63ns ± 5% +2.97% (p=0.000 n=94+93) SubVW/2-8 4.33ns ± 5% 4.01ns ± 2% -7.36% (p=0.000 n=90+85) SubVW/3-8 4.32ns ± 2% 4.32ns ± 5% ~ (p=0.084 n=87+97) SubVW/4-8 4.70ns ± 2% 4.83ns ± 6% +2.77% (p=0.000 n=85+96) SubVW/5-8 5.84ns ± 1% 5.35ns ± 1% -8.35% (p=0.000 n=87+87) SubVW/10-8 8.01ns ± 4% 7.54ns ± 4% -5.84% (p=0.000 n=98+97) SubVW/100-8 43.9ns ± 5% 17.9ns ± 1% -59.20% (p=0.000 n=98+76) SubVW/1000-8 426ns ± 2% 85ns ± 3% -80.13% (p=0.000 n=90+98) SubVW/10000-8 4.24µs ± 2% 1.81µs ± 3% -57.28% (p=0.000 n=74+91) SubVW/100000-8 44.5µs ± 4% 31.5µs ± 2% -29.33% (p=0.000 n=84+91) Change-Id: I10dd361cbaca22197c27e7734c0f50065292afbb Reviewed-on: https://go-review.googlesource.com/c/go/+/164969 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith_amd64.s | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/math/big/arith_amd64.s b/src/math/big/arith_amd64.s index e9c8887523..a0d1660f51 100644 --- a/src/math/big/arith_amd64.s +++ b/src/math/big/arith_amd64.s @@ -143,6 +143,8 @@ E2: NEGQ CX // func addVW(z, x []Word, y Word) (c Word) TEXT ·addVW(SB),NOSPLIT,$0 MOVQ z_len+8(FP), DI + CMPQ DI, $32 + JG large MOVQ x+24(FP), R8 MOVQ y+48(FP), CX // c = y MOVQ z+0(FP), R10 @@ -189,12 +191,16 @@ L3: // n > 0 E3: MOVQ CX, c+56(FP) // return c RET +large: + JMP ·addVWlarge(SB) // func subVW(z, x []Word, y Word) (c Word) // (same as addVW except for SUBQ/SBBQ instead of ADDQ/ADCQ and label names) TEXT ·subVW(SB),NOSPLIT,$0 MOVQ z_len+8(FP), DI + CMPQ DI, $32 + JG large MOVQ x+24(FP), R8 MOVQ y+48(FP), CX // c = y MOVQ z+0(FP), R10 @@ -242,6 +248,8 @@ L4: // n > 0 E4: MOVQ CX, c+56(FP) // return c RET +large: + JMP ·subVWlarge(SB) // func shlVU(z, x []Word, s uint) (c Word) -- GitLab From 243c8eb8c290ebbf2e2811da2dd7538200dde6b3 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 4 Mar 2019 16:48:28 -0800 Subject: [PATCH 0382/1679] cmd/compile: add pure Go math/big functions to TestIntendedInlining Change-Id: Id29a9e48a09965e457f923a0ff023722b38b27ef Reviewed-on: https://go-review.googlesource.com/c/go/+/165157 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/inl_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index 0dfd252372..7868c14aa6 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -144,6 +144,9 @@ func TestIntendedInlining(t *testing.T) { }, "math/big": { "bigEndianWord", + // The following functions require the math_big_pure_go build tag. + "addVW", + "subVW", }, } @@ -202,7 +205,7 @@ func TestIntendedInlining(t *testing.T) { } } - args := append([]string{"build", "-a", "-gcflags=all=-m -m"}, pkgs...) + args := append([]string{"build", "-a", "-gcflags=all=-m -m", "-tags=math_big_pure_go"}, pkgs...) cmd := testenv.CleanCmdEnv(exec.Command(testenv.GoToolPath(t), args...)) pr, pw := io.Pipe() cmd.Stdout = pw -- GitLab From 9b6e9f0c8c66355c0f0575d808b32f52c8c6d21c Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Wed, 6 Mar 2019 19:26:29 +0100 Subject: [PATCH 0383/1679] runtime: safely load DLLs While many other call sites have been moved to using the proper higher-level system loading, these areas were left out. This prevents DLL directory injection attacks. This includes both the runtime load calls (using LoadLibrary prior) and the implicitly linked ones via cgo_import_dynamic, which we move to our LoadLibraryEx. The goal is to only loosely load kernel32.dll and strictly load all others. Meanwhile we make sure that we never fallback to insecure loading on older or unpatched systems. This is CVE-2019-9634. Fixes #14959 Fixes #28978 Fixes #30642 Change-Id: I401a13ed8db248ab1bb5039bf2d31915cac72b93 Reviewed-on: https://go-review.googlesource.com/c/go/+/165798 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman --- src/runtime/os_windows.go | 64 +++++++++++++++++++++++++++------ src/runtime/syscall_windows.go | 14 ++++---- src/syscall/dll_windows.go | 28 +++++++++++++-- src/syscall/security_windows.go | 1 + src/syscall/zsyscall_windows.go | 14 ++++++++ 5 files changed, 101 insertions(+), 20 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 2e1ec58a0d..d3e84fe3dc 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -29,6 +29,7 @@ const ( //go:cgo_import_dynamic runtime._GetProcessAffinityMask GetProcessAffinityMask%3 "kernel32.dll" //go:cgo_import_dynamic runtime._GetQueuedCompletionStatus GetQueuedCompletionStatus%5 "kernel32.dll" //go:cgo_import_dynamic runtime._GetStdHandle GetStdHandle%1 "kernel32.dll" +//go:cgo_import_dynamic runtime._GetSystemDirectoryA GetSystemDirectoryA%2 "kernel32.dll" //go:cgo_import_dynamic runtime._GetSystemInfo GetSystemInfo%1 "kernel32.dll" //go:cgo_import_dynamic runtime._GetThreadContext GetThreadContext%2 "kernel32.dll" //go:cgo_import_dynamic runtime._LoadLibraryW LoadLibraryW%1 "kernel32.dll" @@ -47,12 +48,9 @@ const ( //go:cgo_import_dynamic runtime._VirtualAlloc VirtualAlloc%4 "kernel32.dll" //go:cgo_import_dynamic runtime._VirtualFree VirtualFree%3 "kernel32.dll" //go:cgo_import_dynamic runtime._VirtualQuery VirtualQuery%3 "kernel32.dll" -//go:cgo_import_dynamic runtime._WSAGetOverlappedResult WSAGetOverlappedResult%5 "ws2_32.dll" //go:cgo_import_dynamic runtime._WaitForSingleObject WaitForSingleObject%2 "kernel32.dll" //go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 "kernel32.dll" //go:cgo_import_dynamic runtime._WriteFile WriteFile%5 "kernel32.dll" -//go:cgo_import_dynamic runtime._timeBeginPeriod timeBeginPeriod%1 "winmm.dll" -//go:cgo_import_dynamic runtime._timeEndPeriod timeEndPeriod%1 "winmm.dll" type stdFunction unsafe.Pointer @@ -75,6 +73,7 @@ var ( _GetProcessAffinityMask, _GetQueuedCompletionStatus, _GetStdHandle, + _GetSystemDirectoryA, _GetSystemInfo, _GetSystemTimeAsFileTime, _GetThreadContext, @@ -96,12 +95,9 @@ var ( _VirtualAlloc, _VirtualFree, _VirtualQuery, - _WSAGetOverlappedResult, _WaitForSingleObject, _WriteConsoleW, _WriteFile, - _timeBeginPeriod, - _timeEndPeriod, _ stdFunction // Following syscalls are only available on some Windows PCs. @@ -109,6 +105,7 @@ var ( _AddDllDirectory, _AddVectoredContinueHandler, _GetQueuedCompletionStatusEx, + _LoadLibraryExA, _LoadLibraryExW, _ stdFunction @@ -126,6 +123,12 @@ var ( // links wrong printf function to cgo executable (see issue // 12030 for details). _NtWaitForSingleObject stdFunction + + // These are from non-kernel32.dll, so we prefer to LoadLibraryEx them. + _timeBeginPeriod, + _timeEndPeriod, + _WSAGetOverlappedResult, + _ stdFunction ) // Function to be called by windows CreateThread @@ -173,6 +176,26 @@ func windowsFindfunc(lib uintptr, name []byte) stdFunction { return stdFunction(unsafe.Pointer(f)) } +var sysDirectory [521]byte +var sysDirectoryLen uintptr + +func windowsLoadSystemLib(name []byte) uintptr { + if useLoadLibraryEx { + return stdcall3(_LoadLibraryExA, uintptr(unsafe.Pointer(&name[0])), 0, _LOAD_LIBRARY_SEARCH_SYSTEM32) + } else { + if sysDirectoryLen == 0 { + l := stdcall2(_GetSystemDirectoryA, uintptr(unsafe.Pointer(&sysDirectory[0])), uintptr(len(sysDirectory)-1)) + if l == 0 || l > uintptr(len(sysDirectory)-1) { + throw("Unable to determine system directory") + } + sysDirectory[l] = '\\' + sysDirectoryLen = l + 1 + } + absName := append(sysDirectory[:sysDirectoryLen], name...) + return stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&absName[0]))) + } +} + func loadOptionalSyscalls() { var kernel32dll = []byte("kernel32.dll\000") k32 := stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&kernel32dll[0]))) @@ -182,17 +205,19 @@ func loadOptionalSyscalls() { _AddDllDirectory = windowsFindfunc(k32, []byte("AddDllDirectory\000")) _AddVectoredContinueHandler = windowsFindfunc(k32, []byte("AddVectoredContinueHandler\000")) _GetQueuedCompletionStatusEx = windowsFindfunc(k32, []byte("GetQueuedCompletionStatusEx\000")) + _LoadLibraryExA = windowsFindfunc(k32, []byte("LoadLibraryExA\000")) _LoadLibraryExW = windowsFindfunc(k32, []byte("LoadLibraryExW\000")) + useLoadLibraryEx = (_LoadLibraryExW != nil && _LoadLibraryExA != nil && _AddDllDirectory != nil) var advapi32dll = []byte("advapi32.dll\000") - a32 := stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&advapi32dll[0]))) + a32 := windowsLoadSystemLib(advapi32dll) if a32 == 0 { throw("advapi32.dll not found") } _RtlGenRandom = windowsFindfunc(a32, []byte("SystemFunction036\000")) var ntdll = []byte("ntdll.dll\000") - n32 := stdcall1(_LoadLibraryA, uintptr(unsafe.Pointer(&ntdll[0]))) + n32 := windowsLoadSystemLib(ntdll) if n32 == 0 { throw("ntdll.dll not found") } @@ -205,6 +230,27 @@ func loadOptionalSyscalls() { } } + var winmmdll = []byte("winmm.dll\000") + m32 := windowsLoadSystemLib(winmmdll) + if m32 == 0 { + throw("winmm.dll not found") + } + _timeBeginPeriod = windowsFindfunc(m32, []byte("timeBeginPeriod\000")) + _timeEndPeriod = windowsFindfunc(m32, []byte("timeEndPeriod\000")) + if _timeBeginPeriod == nil || _timeEndPeriod == nil { + throw("timeBegin/EndPeriod not found") + } + + var ws232dll = []byte("ws2_32.dll\000") + ws232 := windowsLoadSystemLib(ws232dll) + if ws232 == 0 { + throw("ws2_32.dll not found") + } + _WSAGetOverlappedResult = windowsFindfunc(ws232, []byte("WSAGetOverlappedResult\000")) + if _WSAGetOverlappedResult == nil { + throw("WSAGetOverlappedResult not found") + } + if windowsFindfunc(n32, []byte("wine_get_version\000")) != nil { // running on Wine initWine(k32) @@ -311,8 +357,6 @@ func osinit() { loadOptionalSyscalls() - useLoadLibraryEx = (_LoadLibraryExW != nil && _AddDllDirectory != nil) - disableWER() initExceptionHandler() diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go index 8cfc71124a..36ad7511af 100644 --- a/src/runtime/syscall_windows.go +++ b/src/runtime/syscall_windows.go @@ -104,9 +104,13 @@ func compileCallback(fn eface, cleanstack bool) (code uintptr) { const _LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 +// When available, this function will use LoadLibraryEx with the filename +// parameter and the important SEARCH_SYSTEM32 argument. But on systems that +// do not have that option, absoluteFilepath should contain a fallback +// to the full path inside of system32 for use with vanilla LoadLibrary. //go:linkname syscall_loadsystemlibrary syscall.loadsystemlibrary //go:nosplit -func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) { +func syscall_loadsystemlibrary(filename *uint16, absoluteFilepath *uint16) (handle, err uintptr) { lockOSThread() defer unlockOSThread() c := &getg().m.syscall @@ -121,15 +125,9 @@ func syscall_loadsystemlibrary(filename *uint16) (handle, err uintptr) { }{filename, 0, _LOAD_LIBRARY_SEARCH_SYSTEM32} c.args = uintptr(noescape(unsafe.Pointer(&args))) } else { - // User doesn't have KB2533623 installed. The caller - // wanted to only load the filename DLL from the - // System32 directory but that facility doesn't exist, - // so just load it the normal way. This is a potential - // security risk, but so is not installing security - // updates. c.fn = getLoadLibrary() c.n = 1 - c.args = uintptr(noescape(unsafe.Pointer(&filename))) + c.args = uintptr(noescape(unsafe.Pointer(&absoluteFilepath))) } cgocall(asmstdcallAddr, unsafe.Pointer(c)) diff --git a/src/syscall/dll_windows.go b/src/syscall/dll_windows.go index c57cd34f82..34925f74a4 100644 --- a/src/syscall/dll_windows.go +++ b/src/syscall/dll_windows.go @@ -28,7 +28,7 @@ func Syscall12(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 ui func Syscall15(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15 uintptr) (r1, r2 uintptr, err Errno) func Syscall18(trap, nargs, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18 uintptr) (r1, r2 uintptr, err Errno) func loadlibrary(filename *uint16) (handle uintptr, err Errno) -func loadsystemlibrary(filename *uint16) (handle uintptr, err Errno) +func loadsystemlibrary(filename *uint16, absoluteFilepath *uint16) (handle uintptr, err Errno) func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err Errno) // A DLL implements access to a single DLL. @@ -37,6 +37,26 @@ type DLL struct { Handle Handle } +// We use this for computing the absolute path for system DLLs on systems +// where SEARCH_SYSTEM32 is not available. +var systemDirectoryPrefix string + +func init() { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getSystemDirectory(&b[0], n) + if e != nil { + panic("Unable to determine system directory: " + e.Error()) + } + if l <= n { + systemDirectoryPrefix = UTF16ToString(b[:l]) + "\\" + break + } + n = l + } +} + // LoadDLL loads the named DLL file into memory. // // If name is not an absolute path and is not a known system DLL used by @@ -53,7 +73,11 @@ func LoadDLL(name string) (*DLL, error) { var h uintptr var e Errno if sysdll.IsSystemDLL[name] { - h, e = loadsystemlibrary(namep) + absoluteFilepathp, err := UTF16PtrFromString(systemDirectoryPrefix + name) + if err != nil { + return nil, err + } + h, e = loadsystemlibrary(namep, absoluteFilepathp) } else { h, e = loadlibrary(namep) } diff --git a/src/syscall/security_windows.go b/src/syscall/security_windows.go index ae8b3a17bf..db80d98a08 100644 --- a/src/syscall/security_windows.go +++ b/src/syscall/security_windows.go @@ -290,6 +290,7 @@ type Tokenprimarygroup struct { //sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken //sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW +//sys getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW // An access token contains the security information for a logon session. // The system creates an access token when a user logs on, and every diff --git a/src/syscall/zsyscall_windows.go b/src/syscall/zsyscall_windows.go index de2d4f3adb..2348f6534f 100644 --- a/src/syscall/zsyscall_windows.go +++ b/src/syscall/zsyscall_windows.go @@ -190,6 +190,7 @@ var ( procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") + procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") ) func GetLastError() (lasterr error) { @@ -1916,3 +1917,16 @@ func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { } return } + +func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := Syscall(procGetSystemDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = EINVAL + } + } + return +} -- GitLab From e2dc41b4909400341ec12058261206bb842cc2e0 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sat, 9 Mar 2019 15:32:31 +0100 Subject: [PATCH 0384/1679] strings: remove unnecessary strings.s There are no empty function declarations in package strings anymore, so strings.s is no longer needed. Change-Id: I16fe161a9c06804811e98af0ca074f8f46e2f49d Reviewed-on: https://go-review.googlesource.com/c/go/+/166458 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/strings/strings.s | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/strings/strings.s diff --git a/src/strings/strings.s b/src/strings/strings.s deleted file mode 100644 index 55103bae05..0000000000 --- a/src/strings/strings.s +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2013 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. - -// This file is here just to make the go tool happy. -- GitLab From 1c2d4da10f6edf9a83fb0cffaaf9f631f462d26b Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Sat, 9 Mar 2019 18:01:26 +0100 Subject: [PATCH 0385/1679] syscall: skip non-root user namespace test if kernel forbids The unprivileged_userns_clone sysctl prevents unpriviledged users from creating namespaces, which the AmbientCaps test does. It's set to 0 by default in a few Linux distributions (Debian and Arch, possibly others), so we need to check it before running the test. I've verified that setting echo 1 > /proc/sys/kernel/unprivileged_userns_clone and then running the test *without this patch* makes it pass, which proves that checking unprivileged_userns_clone is indeed sufficient. Fixes #30698 Change-Id: Ib2079b5e714d7f2440ddf979c3e7cfda9a9c5005 Reviewed-on: https://go-review.googlesource.com/c/go/+/166460 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/syscall/exec_linux_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go index dc16a9d9fe..826487b676 100644 --- a/src/syscall/exec_linux_test.go +++ b/src/syscall/exec_linux_test.go @@ -539,6 +539,13 @@ func testAmbientCaps(t *testing.T, userns bool) { t.Skip("skipping test on Kubernetes-based builders; see Issue 12815") } + // Skip the test if the sysctl that prevents unprivileged user + // from creating user namespaces is enabled. + data, errRead := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone") + if errRead == nil && data[0] == '0' { + t.Skip("kernel prohibits user namespace in unprivileged process") + } + // skip on android, due to lack of lookup support if runtime.GOOS == "android" { t.Skip("skipping test on android; see Issue 27327") -- GitLab From fd080ea3bcc2b170b787b38ab7920d170ca65682 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Feb 2019 17:06:57 -0500 Subject: [PATCH 0386/1679] cmd/go: resolve non-standard imports from within GOROOT/src using vendor directories Updates #30228 Fixes #26924 Change-Id: Ie625c64721559c7633396342320536396cd1fcf5 Reviewed-on: https://go-review.googlesource.com/c/go/+/164621 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/cfg/cfg.go | 2 +- src/cmd/go/internal/load/pkg.go | 38 ++++---- src/cmd/go/internal/modload/build.go | 3 - src/cmd/go/internal/modload/import.go | 13 +++ src/cmd/go/internal/modload/init.go | 6 ++ src/cmd/go/internal/modload/load.go | 93 ++++++++++++++++--- src/cmd/go/internal/modload/query.go | 5 + src/cmd/go/internal/modload/search.go | 30 +++--- .../go/testdata/script/gopath_std_vendor.txt | 3 + src/cmd/go/testdata/script/mod_list_std.txt | 57 ++++++++++++ src/cmd/go/testdata/script/mod_patterns.txt | 3 +- src/cmd/go/testdata/script/mod_std_vendor.txt | 60 +++++++++++- src/cmd/go/testdata/script/std_vendor.txt | 19 ++++ 13 files changed, 276 insertions(+), 56 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_list_std.txt diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 8dc4d1fbd2..325e7d50af 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -38,7 +38,7 @@ var ( BuildWork bool // -work flag BuildX bool // -x flag - CmdName string // "build", "install", "list", etc. + CmdName string // "build", "install", "list", "mod tidy", etc. DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable) ) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index e6c893c257..a0333bd522 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -32,14 +32,14 @@ var ( ModInit func() // module hooks; nil if module use is disabled - ModBinDir func() string // return effective bin directory - ModLookup func(path string) (dir, realPath string, err error) // lookup effective meaning of import - ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct - ModImportPaths func(args []string) []*search.Match // expand import paths - ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary - ModInfoProg func(info string) []byte // wrap module info in .go code for binary - ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files - ModDirImportPath func(string) string // return effective import path for directory + ModBinDir func() string // return effective bin directory + ModLookup func(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) // lookup effective meaning of import + ModPackageModuleInfo func(path string) *modinfo.ModulePublic // return module info for Package struct + ModImportPaths func(args []string) []*search.Match // expand import paths + ModPackageBuildInfo func(main string, deps []string) string // return module info to embed in binary + ModInfoProg func(info string) []byte // wrap module info in .go code for binary + ModImportFromFiles func([]string) // update go.mod to add modules for imports in these files + ModDirImportPath func(string) string // return effective import path for directory ) var IgnoreImports bool // control whether we ignore imports in packages @@ -483,8 +483,10 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo } parentPath := "" + parentIsStd := false if parent != nil { parentPath = parent.ImportPath + parentIsStd = parent.Standard } // Determine canonical identifier for this package. @@ -501,7 +503,7 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo importPath = dirToImportPath(filepath.Join(srcDir, path)) } else if cfg.ModulesEnabled { var p string - modDir, p, modErr = ModLookup(path) + modDir, p, modErr = ModLookup(parentPath, parentIsStd, path) if modErr == nil { importPath = p } @@ -641,7 +643,13 @@ func isDir(path string) bool { // Go 1.11 module legacy conversion (golang.org/issue/25069). func ResolveImportPath(parent *Package, path string) (found string) { if cfg.ModulesEnabled { - if _, p, e := ModLookup(path); e == nil { + parentPath := "" + parentIsStd := false + if parent != nil { + parentPath = parent.ImportPath + parentIsStd = parent.Standard + } + if _, p, e := ModLookup(parentPath, parentIsStd, path); e == nil { return p } return path @@ -1401,16 +1409,6 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { continue } p1 := LoadImport(path, p.Dir, p, stk, p.Internal.Build.ImportPos[path], ResolveImport) - if p.Standard && p.Error == nil && !p1.Standard && p1.Error == nil { - p.Error = &PackageError{ - ImportStack: stk.Copy(), - Err: fmt.Sprintf("non-standard import %q in standard package %q", path, p.ImportPath), - } - pos := p.Internal.Build.ImportPos[path] - if len(pos) > 0 { - p.Error.Pos = pos[0].String() - } - } path = p1.ImportPath importPaths[i] = path diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 4d4e512ef5..25303ce59a 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -38,9 +38,6 @@ func findStandardImportPath(path string) string { if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) { return filepath.Join(cfg.GOROOT, "src", path) } - if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, "vendor/"+path) { - return filepath.Join(cfg.GOROOT, "src/vendor", path) - } } return "" } diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 3210e16c25..fdce9d43e0 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -64,6 +64,19 @@ func Import(path string) (m module.Version, dir string, err error) { if search.IsStandardImportPath(path) { if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) { dir := filepath.Join(cfg.GOROOT, "src", path) + + // If the main module is in the standard library, attribute its packages + // to that module. + switch Target.Path { + case "cmd": + if strings.HasPrefix(path, "cmd") { + return Target, dir, nil + } + case "std": + if !strings.HasPrefix(path, "cmd") { + return Target, dir, nil + } + } return module.Version{}, dir, nil } } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 940f0a8e45..0970ccf2d6 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -18,6 +18,7 @@ import ( "cmd/go/internal/mvs" "cmd/go/internal/renameio" "cmd/go/internal/search" + "cmd/go/internal/str" "encoding/json" "fmt" "go/build" @@ -380,6 +381,11 @@ func InitMod() { // modFileToBuildList initializes buildList from the modFile. func modFileToBuildList() { Target = modFile.Module.Mod + if (str.HasPathPrefix(Target.Path, "std") || str.HasPathPrefix(Target.Path, "cmd")) && + search.InDir(cwd, cfg.GOROOTsrc) == "" { + base.Fatalf("go: reserved module path %s not allow outside of GOROOT/src", Target.Path) + } + list := []module.Version{Target} for _, r := range modFile.Require { list = append(list, r.Mod) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 6d6c037af2..205754546c 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -12,6 +12,7 @@ import ( "io/ioutil" "os" "path" + pathpkg "path" "path/filepath" "sort" "strings" @@ -90,7 +91,9 @@ func ImportPaths(patterns []string) []*search.Match { // the exact version of a particular module increases during // the loader iterations. m.Pkgs = str.StringList(fsDirs[i]) - for j, pkg := range m.Pkgs { + pkgs := m.Pkgs + m.Pkgs = m.Pkgs[:0] + for _, pkg := range pkgs { dir := pkg if !filepath.IsAbs(dir) { dir = filepath.Join(cwd, pkg) @@ -108,6 +111,16 @@ func ImportPaths(patterns []string) []*search.Match { if strings.HasPrefix(suffix, "/vendor/") { // TODO getmode vendor check pkg = strings.TrimPrefix(suffix, "/vendor/") + } else if Target.Path == "std" { + // Don't add the prefix "std/" to packages in the "std" module. + // It's the one module path that isn't a prefix of its packages. + pkg = strings.TrimPrefix(suffix, "/") + if pkg == "builtin" { + // "builtin" is a pseudo-package with a real source file. + // It's not included in "std", so it shouldn't be included in + // "./..." within module "std" either. + continue + } } else { pkg = Target.Path + suffix } @@ -129,10 +142,10 @@ func ImportPaths(patterns []string) []*search.Match { // After loader is done iterating, we still need to return the // path, so that "go list -e" produces valid output. if iterating { - pkg = "" + continue } } - m.Pkgs[j] = pkg + m.Pkgs = append(m.Pkgs, pkg) } case strings.Contains(m.Pattern, "..."): @@ -163,9 +176,7 @@ func ImportPaths(patterns []string) []*search.Match { updateMatches(true) for _, m := range matches { for _, pkg := range m.Pkgs { - if pkg != "" { - roots = append(roots, pkg) - } + roots = append(roots, pkg) } } return roots @@ -394,13 +405,17 @@ func ModuleUsedDirectly(path string) bool { } // Lookup returns the source directory, import path, and any loading error for -// the package at path. +// the package at path as imported from the package in parentDir. // Lookup requires that one of the Load functions in this package has already // been called. -func Lookup(path string) (dir, realPath string, err error) { +func Lookup(parentPath string, parentIsStd bool, path string) (dir, realPath string, err error) { if path == "" { panic("Lookup called with empty package path") } + + if parentIsStd { + path = loaded.stdVendor(parentPath, path) + } pkg, ok := loaded.pkgCache.Get(path).(*loadPkg) if !ok { // The loader should have found all the relevant paths. @@ -434,10 +449,11 @@ func Lookup(path string) (dir, realPath string, err error) { // TODO(rsc): It might be nice to make the loader take and return // a buildList rather than hard-coding use of the global. type loader struct { - tags map[string]bool // tags for scanDir - testRoots bool // include tests for roots - isALL bool // created with LoadALL - testAll bool // include tests for all packages + tags map[string]bool // tags for scanDir + testRoots bool // include tests for roots + isALL bool // created with LoadALL + testAll bool // include tests for all packages + forceStdVendor bool // if true, load standard-library dependencies from the vendor subtree // reset on each iteration roots []*loadPkg @@ -457,6 +473,17 @@ func newLoader() *loader { ld := new(loader) ld.tags = imports.Tags() ld.testRoots = LoadTests + + switch Target.Path { + case "std", "cmd": + // Inside the "std" and "cmd" modules, we prefer to use the vendor directory + // unless the command explicitly changes the module graph. + // TODO(golang.org/issue/30240): Remove this special case. + if cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ") { + ld.forceStdVendor = true + } + } + return ld } @@ -631,7 +658,11 @@ func (ld *loader) doPkg(item interface{}) { } } + inStd := (search.IsStandardImportPath(pkg.path) && search.InDir(pkg.dir, cfg.GOROOTsrc) != "") for _, path := range imports { + if inStd { + path = ld.stdVendor(pkg.path, path) + } pkg.imports = append(pkg.imports, ld.pkg(path, false)) } @@ -642,6 +673,30 @@ func (ld *loader) doPkg(item interface{}) { } } +// stdVendor returns the canonical import path for the package with the given +// path when imported from the standard-library package at parentPath. +func (ld *loader) stdVendor(parentPath, path string) string { + if search.IsStandardImportPath(path) { + return path + } + + if str.HasPathPrefix(parentPath, "cmd") && (Target.Path != "cmd" || ld.forceStdVendor) { + vendorPath := pathpkg.Join("cmd", "vendor", path) + if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { + return vendorPath + } + } + if Target.Path != "std" || ld.forceStdVendor { + vendorPath := pathpkg.Join("vendor", path) + if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { + return vendorPath + } + } + + // Not vendored: resolve from modules. + return path +} + // computePatternAll returns the list of packages matching pattern "all", // starting with a list of the import paths for the packages in the main module. func (ld *loader) computePatternAll(paths []string) []string { @@ -932,6 +987,20 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { return vendorList, nil } + switch Target.Path { + case "std", "cmd": + // When inside "std" or "cmd", only fetch and read go.mod files if we're + // explicitly running a command that can change the module graph. If we have + // to resolve a new dependency, we might pick the wrong version, but 'go mod + // tidy' will fix it — and new standard-library dependencies should be rare + // anyway. + // + // TODO(golang.org/issue/30240): Drop this special-case. + if cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ") { + return nil, nil + } + } + origPath := mod.Path if repl := Replacement(mod); repl.Path != "" { if repl.Version == "" { diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 0856486c21..3a1ea863b0 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -9,6 +9,7 @@ import ( "cmd/go/internal/modfetch/codehost" "cmd/go/internal/module" "cmd/go/internal/semver" + "cmd/go/internal/str" "fmt" pathpkg "path" "strings" @@ -131,6 +132,10 @@ func Query(path, query string, allowed func(module.Version) bool) (*modfetch.Rev return &modfetch.RevInfo{Version: Target.Version}, nil } + if str.HasPathPrefix(path, "std") || str.HasPathPrefix(path, "cmd") { + return nil, fmt.Errorf("explicit requirement on standard-library module %s not allowed", path) + } + // Load versions and execute query. repo, err := modfetch.Lookup(path) if err != nil { diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 45e7ee2674..2e82b92cc5 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -35,12 +35,8 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } var pkgs []string - walkPkgs := func(root, importPathRoot string) { + walkPkgs := func(root, importPathRoot string, includeVendor bool) { root = filepath.Clean(root) - var cmd string - if root == cfg.GOROOTsrc { - cmd = filepath.Join(root, "cmd") - } filepath.Walk(root, func(path string, fi os.FileInfo, err error) error { if err != nil { return nil @@ -51,14 +47,6 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] return nil } - // GOROOT/src/cmd makes use of GOROOT/src/cmd/vendor, - // which module mode can't deal with. Eventually we'll stop using - // that vendor directory, and then we can remove this exclusion. - // golang.org/issue/26924. - if path == cmd { - return filepath.SkipDir - } - want := true // Avoid .foo, _foo, and testdata directory trees. _, elem := filepath.Split(path) @@ -86,6 +74,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] if !want { return filepath.SkipDir } + // Stop at module boundaries. if path != root { if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil { return filepath.SkipDir @@ -101,7 +90,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } } - if elem == "vendor" { + if elem == "vendor" && !includeVendor { return filepath.SkipDir } return nil @@ -109,11 +98,14 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } if useStd { - walkPkgs(cfg.GOROOTsrc, "") + walkPkgs(cfg.GOROOTsrc, "", true) + if treeCanMatch("cmd") { + walkPkgs(filepath.Join(cfg.GOROOTsrc, "cmd"), "cmd", true) + } } if cfg.BuildMod == "vendor" { - walkPkgs(filepath.Join(ModRoot(), "vendor"), "") + walkPkgs(filepath.Join(ModRoot(), "vendor"), "", false) return pkgs } @@ -135,7 +127,11 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] continue } } - walkPkgs(root, mod.Path) + modPrefix := mod.Path + if mod.Path == "std" { + modPrefix = "" + } + walkPkgs(root, modPrefix, false) } return pkgs diff --git a/src/cmd/go/testdata/script/gopath_std_vendor.txt b/src/cmd/go/testdata/script/gopath_std_vendor.txt index d53744b9fa..8bb1dc4430 100644 --- a/src/cmd/go/testdata/script/gopath_std_vendor.txt +++ b/src/cmd/go/testdata/script/gopath_std_vendor.txt @@ -2,6 +2,9 @@ env GO111MODULE=off [!gc] skip +go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack +stdout $GOPATH[/\\]src[/\\]vendor + # A package importing 'net/http' should resolve its dependencies # to the package 'vendor/golang.org/x/net/http2/hpack' within GOROOT. cd importnethttp diff --git a/src/cmd/go/testdata/script/mod_list_std.txt b/src/cmd/go/testdata/script/mod_list_std.txt new file mode 100644 index 0000000000..4af0898ff7 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_list_std.txt @@ -0,0 +1,57 @@ +env GO111MODULE=on +env GOPROXY=off + +[!gc] skip + +# Outside of GOROOT, our vendored packages should be reported as part of the standard library. +go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd +stdout ^internal/x/net/http2/hpack +stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm + +# cmd/... should match the same packages it used to match in GOPATH mode. +go list cmd/... +stdout ^cmd/compile +! stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm + + +# Within the std module, listing ./... should omit the 'std' prefix: +# the package paths should be the same via ./... or the 'std' meta-pattern. +# TODO(golang.org/issue/30241): Make that work. +# Today, they are listed in 'std' but not './...'. +cd $GOROOT/src +go list ./... +stdout ^internal/x + +cp stdout $WORK/listdot.txt +go list std +stdout ^internal/x # TODO +# TODO: cmp stdout $WORK/listdot.txt + +go list all +! stdout ^internal/x # TODO: this will exist when src/go.mod is added +! stdout ^std/ + + +# Within the std module, the vendored dependencies of std should appear +# to come from the actual modules. +# TODO(golang.org/issue/30241): Make that work. +# Today, they still have the vendor/ prefix. +go list std +stdout ^internal/x/net/http2/hpack # TODO +! stdout ^golang.org/x/net/http2/hpack # TODO + +go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' std +# ! stdout ^internal/x/net/http2/hpack # TODO +! stdout ^golang.org/x/net/http2/hpack # TODO + + +# Within std, the vendored dependencies of cmd should still appear to be part of cmd. +go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' cmd +stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm + +go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}' cmd +! stdout . + +go list cmd/... +stdout ^cmd/compile +! stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm diff --git a/src/cmd/go/testdata/script/mod_patterns.txt b/src/cmd/go/testdata/script/mod_patterns.txt index 5f9ab62704..ab936a9ba4 100644 --- a/src/cmd/go/testdata/script/mod_patterns.txt +++ b/src/cmd/go/testdata/script/mod_patterns.txt @@ -7,7 +7,6 @@ cd m # library or active modules. # # 'go list ...' should list packages in all active modules and the standard library. -# But not cmd/* - see golang.org/issue/26924. # # 'go list example.com/m/...' should list packages in all modules that begin with 'example.com/m/'. # @@ -26,7 +25,7 @@ stdout 'example.com/m/nested/useencoding: \[\.\.\. example.com/m/...\]' # but NO stdout '^unicode: \[all \.\.\.\]' stdout '^unsafe: \[all \.\.\.\]' stdout 'index/suffixarray: \[\.\.\.\]' -! stdout cmd/pprof # golang.org/issue/26924 +stdout 'cmd/pprof: \[\.\.\.\]' stderr -count=1 '^go: warning: "./xyz..." matched no packages$' diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt index 7aa1bc353b..17818c4536 100644 --- a/src/cmd/go/testdata/script/mod_std_vendor.txt +++ b/src/cmd/go/testdata/script/mod_std_vendor.txt @@ -1,11 +1,46 @@ env GO111MODULE=on +env GOPROXY=off go list -f '{{.TestImports}}' stdout net/http # from .TestImports -go list -test -f '{{.Deps}}' +# 'go list' should find standard-vendored packages. +go list -f '{{.Dir}}' internal/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]internal + +# 'go list -test' should report vendored transitive dependencies of _test.go +# imports in the Deps field. +go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' stdout internal/x/crypto # dep of .TestImports + +# Modules outside the standard library should not use the packages vendored there... +cd broken +! go build -mod=readonly +stderr 'updates to go.mod needed' +! go build -mod=vendor +stderr 'cannot find package' +stderr 'hpack' + +# ...even if they explicitly use the "cmd/vendor/" or "vendor/" prefix. +cd ../importcmd +! go build . +stderr 'use of vendored package' + +cd ../importstd +! go build . +stderr 'use of internal package' + + +# When run within the 'std' module, 'go list -test' should report vendored +# transitive dependencies at their original module paths. +# TODO(golang.org/issue/30241): Make that work. +# Today, they're standard packages as long as they exist. +cd $GOROOT/src +go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' net/http +! stdout ^vendor/golang.org/x/net/http2/hpack # TODO: this will exist later +stdout ^internal/x/net/http2/hpack + -- go.mod -- module m @@ -17,3 +52,26 @@ package x import "testing" import _ "net/http" func Test(t *testing.T) {} + +-- broken/go.mod -- +module broken +-- broken/http.go -- +package broken + +import ( + _ "net/http" + _ "golang.org/x/net/http2/hpack" +) + +-- importcmd/go.mod -- +module importcmd +-- importcmd/x.go -- +package importcmd + +import _ "cmd/vendor/golang.org/x/tools/go/analysis" +-- importstd/go.mod -- +module importvendor +-- importstd/x.go -- +package importstd + +import _ "internal/x/net/http2/hpack" diff --git a/src/cmd/go/testdata/script/std_vendor.txt b/src/cmd/go/testdata/script/std_vendor.txt index f781519973..e769dff481 100644 --- a/src/cmd/go/testdata/script/std_vendor.txt +++ b/src/cmd/go/testdata/script/std_vendor.txt @@ -6,11 +6,20 @@ env GO111MODULE=off go list -f '{{.TestImports}}' stdout net/http # from .TestImports +# 'go list' should report standard-vendored packages by path. +go list -f '{{.Dir}}' internal/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]internal + # 'go list -test' should report vendored transitive dependencies of _test.go # imports in the Deps field, with a 'vendor' prefix on their import paths. go list -test -f '{{.Deps}}' stdout internal/x/crypto # dep of .TestImports +# Packages outside the standard library should not use its copy of vendored packages. +cd broken +! go build +stderr 'cannot find package' + -- go.mod -- module m @@ -22,3 +31,13 @@ package x import "testing" import _ "net/http" func Test(t *testing.T) {} + +-- broken/go.mod -- +module broken +-- broken/http.go -- +package broken + +import ( + _ "net/http" + _ "golang.org/x/net/http/httpproxy" +) -- GitLab From 65a54aef5bedbf8035a465d12ad54783fb81e957 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Mar 2019 10:41:50 -0400 Subject: [PATCH 0387/1679] cmd/go: set GO111MODULE=off explicitly in TestScript/list_test_err This test was added after CL 162697. Updates #30228 Change-Id: Ia33ad3adc99e53b0b03e68906dc1f2e39234e2cf Reviewed-on: https://go-review.googlesource.com/c/go/+/166697 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/testdata/script/list_test_err.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cmd/go/testdata/script/list_test_err.txt b/src/cmd/go/testdata/script/list_test_err.txt index 42805c9882..a174b5e9ad 100644 --- a/src/cmd/go/testdata/script/list_test_err.txt +++ b/src/cmd/go/testdata/script/list_test_err.txt @@ -1,3 +1,5 @@ +env GO111MODULE=off + # issue 28491: errors in test source files should not prevent # "go list -test" from returning useful information. -- GitLab From b4fbd291b3872706422d39fd1140b7b929c77622 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 9 Mar 2019 19:34:58 -0800 Subject: [PATCH 0388/1679] cmd/compile: normalize more whitespace in rewrite rules If you write a rewrite rule: (something) && noteRule("X")-> (something) then rulegen will panic with an error message about commutativity. The real problem is the lack of a space between the ) and the ->. Normalize that bit of whitespace too. Change-Id: Idbd53687cd0398fe275ff2702667688cad05b4ca Reviewed-on: https://go-review.googlesource.com/c/go/+/166427 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/rulegen.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 730e768ed6..f3a54b6299 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -1019,5 +1019,6 @@ func normalizeWhitespace(x string) string { x = strings.Join(strings.Fields(x), " ") x = strings.Replace(x, "( ", "(", -1) x = strings.Replace(x, " )", ")", -1) + x = strings.Replace(x, ")->", ") ->", -1) return x } -- GitLab From 07b4b4a1a87a74d600d483d155ec1744e08df9c3 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 9 Mar 2019 12:41:34 -0800 Subject: [PATCH 0389/1679] cmd/compile: add scale field to SSA Ops Refactoring only. This makes it easier to add ops that do indexed memory loads/stores. Passes toolstash-check. Change-Id: I82df0d4154718577ec42106fa1bc76571bf65096 Reviewed-on: https://go-review.googlesource.com/c/go/+/166425 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/amd64/ssa.go | 93 +++++--------------- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 92 +++++++++---------- src/cmd/compile/internal/ssa/gen/main.go | 5 ++ src/cmd/compile/internal/ssa/op.go | 1 + src/cmd/compile/internal/ssa/opGen.go | 44 +++++++++ 5 files changed, 116 insertions(+), 119 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index a2c7d5d8d8..b9fca18d4f 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -117,6 +117,21 @@ func opregreg(s *gc.SSAGenState, op obj.As, dest, src int16) *obj.Prog { return p } +// memIdx fills out a as an indexed memory reference for v. +// It assumes that the base register and the index register +// are v.Args[0].Reg() and v.Args[1].Reg(), respectively. +// The caller must still use gc.AddAux/gc.AddAux2 to handle v.Aux as necessary. +func memIdx(a *obj.Addr, v *ssa.Value) { + r, i := v.Args[0].Reg(), v.Args[1].Reg() + a.Type = obj.TYPE_MEM + a.Scale = v.Op.Scale() + if a.Scale == 1 && i == x86.REG_SP { + r, i = i, r + } + a.Reg = r + a.Index = i +} + // DUFFZERO consists of repeated blocks of 4 MOVUPSs + LEAQ, // See runtime/mkduff.go. func duffStart(size int64) int64 { @@ -571,26 +586,9 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { case ssa.OpAMD64LEAQ1, ssa.OpAMD64LEAQ2, ssa.OpAMD64LEAQ4, ssa.OpAMD64LEAQ8, ssa.OpAMD64LEAL1, ssa.OpAMD64LEAL2, ssa.OpAMD64LEAL4, ssa.OpAMD64LEAL8, ssa.OpAMD64LEAW1, ssa.OpAMD64LEAW2, ssa.OpAMD64LEAW4, ssa.OpAMD64LEAW8: - o := v.Reg() - r := v.Args[0].Reg() - i := v.Args[1].Reg() p := s.Prog(v.Op.Asm()) - switch v.Op { - case ssa.OpAMD64LEAQ1, ssa.OpAMD64LEAL1, ssa.OpAMD64LEAW1: - p.From.Scale = 1 - if i == x86.REG_SP { - r, i = i, r - } - case ssa.OpAMD64LEAQ2, ssa.OpAMD64LEAL2, ssa.OpAMD64LEAW2: - p.From.Scale = 2 - case ssa.OpAMD64LEAQ4, ssa.OpAMD64LEAL4, ssa.OpAMD64LEAW4: - p.From.Scale = 4 - case ssa.OpAMD64LEAQ8, ssa.OpAMD64LEAL8, ssa.OpAMD64LEAW8: - p.From.Scale = 8 - } - p.From.Type = obj.TYPE_MEM - p.From.Reg = r - p.From.Index = i + memIdx(&p.From, v) + o := v.Reg() p.To.Type = obj.TYPE_REG p.To.Reg = o if v.AuxInt != 0 && v.Aux == nil { @@ -702,25 +700,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Reg = v.Reg() case ssa.OpAMD64MOVBloadidx1, ssa.OpAMD64MOVWloadidx1, ssa.OpAMD64MOVLloadidx1, ssa.OpAMD64MOVQloadidx1, ssa.OpAMD64MOVSSloadidx1, ssa.OpAMD64MOVSDloadidx1, ssa.OpAMD64MOVQloadidx8, ssa.OpAMD64MOVSDloadidx8, ssa.OpAMD64MOVLloadidx8, ssa.OpAMD64MOVLloadidx4, ssa.OpAMD64MOVSSloadidx4, ssa.OpAMD64MOVWloadidx2: - r := v.Args[0].Reg() - i := v.Args[1].Reg() p := s.Prog(v.Op.Asm()) - p.From.Type = obj.TYPE_MEM - switch v.Op { - case ssa.OpAMD64MOVBloadidx1, ssa.OpAMD64MOVWloadidx1, ssa.OpAMD64MOVLloadidx1, ssa.OpAMD64MOVQloadidx1, ssa.OpAMD64MOVSSloadidx1, ssa.OpAMD64MOVSDloadidx1: - if i == x86.REG_SP { - r, i = i, r - } - p.From.Scale = 1 - case ssa.OpAMD64MOVQloadidx8, ssa.OpAMD64MOVSDloadidx8, ssa.OpAMD64MOVLloadidx8: - p.From.Scale = 8 - case ssa.OpAMD64MOVLloadidx4, ssa.OpAMD64MOVSSloadidx4: - p.From.Scale = 4 - case ssa.OpAMD64MOVWloadidx2: - p.From.Scale = 2 - } - p.From.Reg = r - p.From.Index = i + memIdx(&p.From, v) gc.AddAux(&p.From, v) p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() @@ -736,27 +717,10 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { gc.AddAux(&p.To, v) case ssa.OpAMD64MOVBstoreidx1, ssa.OpAMD64MOVWstoreidx1, ssa.OpAMD64MOVLstoreidx1, ssa.OpAMD64MOVQstoreidx1, ssa.OpAMD64MOVSSstoreidx1, ssa.OpAMD64MOVSDstoreidx1, ssa.OpAMD64MOVQstoreidx8, ssa.OpAMD64MOVSDstoreidx8, ssa.OpAMD64MOVLstoreidx8, ssa.OpAMD64MOVSSstoreidx4, ssa.OpAMD64MOVLstoreidx4, ssa.OpAMD64MOVWstoreidx2: - r := v.Args[0].Reg() - i := v.Args[1].Reg() p := s.Prog(v.Op.Asm()) p.From.Type = obj.TYPE_REG p.From.Reg = v.Args[2].Reg() - p.To.Type = obj.TYPE_MEM - switch v.Op { - case ssa.OpAMD64MOVBstoreidx1, ssa.OpAMD64MOVWstoreidx1, ssa.OpAMD64MOVLstoreidx1, ssa.OpAMD64MOVQstoreidx1, ssa.OpAMD64MOVSSstoreidx1, ssa.OpAMD64MOVSDstoreidx1: - if i == x86.REG_SP { - r, i = i, r - } - p.To.Scale = 1 - case ssa.OpAMD64MOVQstoreidx8, ssa.OpAMD64MOVSDstoreidx8, ssa.OpAMD64MOVLstoreidx8: - p.To.Scale = 8 - case ssa.OpAMD64MOVSSstoreidx4, ssa.OpAMD64MOVLstoreidx4: - p.To.Scale = 4 - case ssa.OpAMD64MOVWstoreidx2: - p.To.Scale = 2 - } - p.To.Reg = r - p.To.Index = i + memIdx(&p.To, v) gc.AddAux(&p.To, v) case ssa.OpAMD64ADDQconstmodify, ssa.OpAMD64ADDLconstmodify: sc := v.AuxValAndOff() @@ -809,24 +773,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.From.Type = obj.TYPE_CONST sc := v.AuxValAndOff() p.From.Offset = sc.Val() - r := v.Args[0].Reg() - i := v.Args[1].Reg() - switch v.Op { - case ssa.OpAMD64MOVBstoreconstidx1, ssa.OpAMD64MOVWstoreconstidx1, ssa.OpAMD64MOVLstoreconstidx1, ssa.OpAMD64MOVQstoreconstidx1: - p.To.Scale = 1 - if i == x86.REG_SP { - r, i = i, r - } - case ssa.OpAMD64MOVWstoreconstidx2: - p.To.Scale = 2 - case ssa.OpAMD64MOVLstoreconstidx4: - p.To.Scale = 4 - case ssa.OpAMD64MOVQstoreconstidx8: - p.To.Scale = 8 - } - p.To.Type = obj.TYPE_MEM - p.To.Reg = r - p.To.Index = i + memIdx(&p.To, v) gc.AddAux2(&p.To, v, sc.Off()) case ssa.OpAMD64MOVLQSX, ssa.OpAMD64MOVWQSX, ssa.OpAMD64MOVBQSX, ssa.OpAMD64MOVLQZX, ssa.OpAMD64MOVWQZX, ssa.OpAMD64MOVBQZX, ssa.OpAMD64CVTTSS2SL, ssa.OpAMD64CVTTSD2SL, ssa.OpAMD64CVTTSS2SQ, ssa.OpAMD64CVTTSD2SQ, diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index c2ed0ea1d9..a7880430ae 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -174,17 +174,17 @@ func init() { {name: "MOVSDload", argLength: 2, reg: fpload, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Read"}, // fp64 load {name: "MOVSSconst", reg: fp01, asm: "MOVSS", aux: "Float32", rematerializeable: true}, // fp32 constant {name: "MOVSDconst", reg: fp01, asm: "MOVSD", aux: "Float64", rematerializeable: true}, // fp64 constant - {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"}, // fp32 load indexed by i - {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", aux: "SymOff", symEffect: "Read"}, // fp32 load indexed by 4*i - {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"}, // fp64 load indexed by i - {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", aux: "SymOff", symEffect: "Read"}, // fp64 load indexed by 8*i + {name: "MOVSSloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSS", scale: 1, aux: "SymOff", symEffect: "Read"}, // fp32 load indexed by i + {name: "MOVSSloadidx4", argLength: 3, reg: fploadidx, asm: "MOVSS", scale: 4, aux: "SymOff", symEffect: "Read"}, // fp32 load indexed by 4*i + {name: "MOVSDloadidx1", argLength: 3, reg: fploadidx, asm: "MOVSD", scale: 1, aux: "SymOff", symEffect: "Read"}, // fp64 load indexed by i + {name: "MOVSDloadidx8", argLength: 3, reg: fploadidx, asm: "MOVSD", scale: 8, aux: "SymOff", symEffect: "Read"}, // fp64 load indexed by 8*i {name: "MOVSSstore", argLength: 3, reg: fpstore, asm: "MOVSS", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp32 store {name: "MOVSDstore", argLength: 3, reg: fpstore, asm: "MOVSD", aux: "SymOff", faultOnNilArg0: true, symEffect: "Write"}, // fp64 store - {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"}, // fp32 indexed by i store - {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", aux: "SymOff", symEffect: "Write"}, // fp32 indexed by 4i store - {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"}, // fp64 indexed by i store - {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", aux: "SymOff", symEffect: "Write"}, // fp64 indexed by 8i store + {name: "MOVSSstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSS", scale: 1, aux: "SymOff", symEffect: "Write"}, // fp32 indexed by i store + {name: "MOVSSstoreidx4", argLength: 4, reg: fpstoreidx, asm: "MOVSS", scale: 4, aux: "SymOff", symEffect: "Write"}, // fp32 indexed by 4i store + {name: "MOVSDstoreidx1", argLength: 4, reg: fpstoreidx, asm: "MOVSD", scale: 1, aux: "SymOff", symEffect: "Write"}, // fp64 indexed by i store + {name: "MOVSDstoreidx8", argLength: 4, reg: fpstoreidx, asm: "MOVSD", scale: 8, aux: "SymOff", symEffect: "Write"}, // fp64 indexed by 8i store {name: "ADDSSload", argLength: 3, reg: fp21load, asm: "ADDSS", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp32 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem {name: "ADDSDload", argLength: 3, reg: fp21load, asm: "ADDSD", aux: "SymOff", resultInArg0: true, faultOnNilArg1: true, symEffect: "Read"}, // fp64 arg0 + tmp, tmp loaded from arg1+auxint+aux, arg2 = mem @@ -544,21 +544,21 @@ func init() { {name: "PXOR", argLength: 2, reg: fp21, asm: "PXOR", commutative: true, resultInArg0: true}, // exclusive or, applied to X regs for float negation. - {name: "LEAQ", argLength: 1, reg: gp11sb, asm: "LEAQ", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux - {name: "LEAL", argLength: 1, reg: gp11sb, asm: "LEAL", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux - {name: "LEAW", argLength: 1, reg: gp11sb, asm: "LEAW", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux - {name: "LEAQ1", argLength: 2, reg: gp21sb, asm: "LEAQ", commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux - {name: "LEAL1", argLength: 2, reg: gp21sb, asm: "LEAL", commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux - {name: "LEAW1", argLength: 2, reg: gp21sb, asm: "LEAW", commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux - {name: "LEAQ2", argLength: 2, reg: gp21sb, asm: "LEAQ", aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux - {name: "LEAL2", argLength: 2, reg: gp21sb, asm: "LEAL", aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux - {name: "LEAW2", argLength: 2, reg: gp21sb, asm: "LEAW", aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux - {name: "LEAQ4", argLength: 2, reg: gp21sb, asm: "LEAQ", aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux - {name: "LEAL4", argLength: 2, reg: gp21sb, asm: "LEAL", aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux - {name: "LEAW4", argLength: 2, reg: gp21sb, asm: "LEAW", aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux - {name: "LEAQ8", argLength: 2, reg: gp21sb, asm: "LEAQ", aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux - {name: "LEAL8", argLength: 2, reg: gp21sb, asm: "LEAL", aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux - {name: "LEAW8", argLength: 2, reg: gp21sb, asm: "LEAW", aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux + {name: "LEAQ", argLength: 1, reg: gp11sb, asm: "LEAQ", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux + {name: "LEAL", argLength: 1, reg: gp11sb, asm: "LEAL", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux + {name: "LEAW", argLength: 1, reg: gp11sb, asm: "LEAW", aux: "SymOff", rematerializeable: true, symEffect: "Addr"}, // arg0 + auxint + offset encoded in aux + {name: "LEAQ1", argLength: 2, reg: gp21sb, asm: "LEAQ", scale: 1, commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux + {name: "LEAL1", argLength: 2, reg: gp21sb, asm: "LEAL", scale: 1, commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux + {name: "LEAW1", argLength: 2, reg: gp21sb, asm: "LEAW", scale: 1, commutative: true, aux: "SymOff", symEffect: "Addr"}, // arg0 + arg1 + auxint + aux + {name: "LEAQ2", argLength: 2, reg: gp21sb, asm: "LEAQ", scale: 2, aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux + {name: "LEAL2", argLength: 2, reg: gp21sb, asm: "LEAL", scale: 2, aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux + {name: "LEAW2", argLength: 2, reg: gp21sb, asm: "LEAW", scale: 2, aux: "SymOff", symEffect: "Addr"}, // arg0 + 2*arg1 + auxint + aux + {name: "LEAQ4", argLength: 2, reg: gp21sb, asm: "LEAQ", scale: 4, aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux + {name: "LEAL4", argLength: 2, reg: gp21sb, asm: "LEAL", scale: 4, aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux + {name: "LEAW4", argLength: 2, reg: gp21sb, asm: "LEAW", scale: 4, aux: "SymOff", symEffect: "Addr"}, // arg0 + 4*arg1 + auxint + aux + {name: "LEAQ8", argLength: 2, reg: gp21sb, asm: "LEAQ", scale: 8, aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux + {name: "LEAL8", argLength: 2, reg: gp21sb, asm: "LEAL", scale: 8, aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux + {name: "LEAW8", argLength: 2, reg: gp21sb, asm: "LEAW", scale: 8, aux: "SymOff", symEffect: "Addr"}, // arg0 + 8*arg1 + auxint + aux // Note: LEAx{1,2,4,8} must not have OpSB as either argument. // auxint+aux == add auxint and the offset of the symbol in aux (if any) to the effective address @@ -577,24 +577,24 @@ func init() { {name: "MOVOstore", argLength: 3, reg: fpstore, asm: "MOVUPS", aux: "SymOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 16 bytes in arg1 to arg0+auxint+aux. arg2=mem // indexed loads/stores - {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVBLZX", aux: "SymOff", typ: "UInt8", symEffect: "Read"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem - {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", symEffect: "Read"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem - {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", aux: "SymOff", typ: "UInt16", symEffect: "Read"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem - {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVL", aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem - {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem - {name: "MOVLloadidx8", argLength: 3, reg: gploadidx, asm: "MOVL", aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+8*arg1+auxint+aux. arg2=mem - {name: "MOVQloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVQ", aux: "SymOff", typ: "UInt64", symEffect: "Read"}, // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem - {name: "MOVQloadidx8", argLength: 3, reg: gploadidx, asm: "MOVQ", aux: "SymOff", typ: "UInt64", symEffect: "Read"}, // load 8 bytes from arg0+8*arg1+auxint+aux. arg2=mem + {name: "MOVBloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVBLZX", scale: 1, aux: "SymOff", typ: "UInt8", symEffect: "Read"}, // load a byte from arg0+arg1+auxint+aux. arg2=mem + {name: "MOVWloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVWLZX", scale: 1, aux: "SymOff", typ: "UInt16", symEffect: "Read"}, // load 2 bytes from arg0+arg1+auxint+aux. arg2=mem + {name: "MOVWloadidx2", argLength: 3, reg: gploadidx, asm: "MOVWLZX", scale: 2, aux: "SymOff", typ: "UInt16", symEffect: "Read"}, // load 2 bytes from arg0+2*arg1+auxint+aux. arg2=mem + {name: "MOVLloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVL", scale: 1, aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+arg1+auxint+aux. arg2=mem + {name: "MOVLloadidx4", argLength: 3, reg: gploadidx, asm: "MOVL", scale: 4, aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+4*arg1+auxint+aux. arg2=mem + {name: "MOVLloadidx8", argLength: 3, reg: gploadidx, asm: "MOVL", scale: 8, aux: "SymOff", typ: "UInt32", symEffect: "Read"}, // load 4 bytes from arg0+8*arg1+auxint+aux. arg2=mem + {name: "MOVQloadidx1", argLength: 3, reg: gploadidx, commutative: true, asm: "MOVQ", scale: 1, aux: "SymOff", typ: "UInt64", symEffect: "Read"}, // load 8 bytes from arg0+arg1+auxint+aux. arg2=mem + {name: "MOVQloadidx8", argLength: 3, reg: gploadidx, asm: "MOVQ", scale: 8, aux: "SymOff", typ: "UInt64", symEffect: "Read"}, // load 8 bytes from arg0+8*arg1+auxint+aux. arg2=mem // TODO: sign-extending indexed loads // TODO: mark the MOVXstoreidx1 ops as commutative. Generates too many rewrite rules at the moment. - {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", aux: "SymOff", symEffect: "Write"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem - {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem - {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem - {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem - {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem - {name: "MOVLstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVL", aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem - {name: "MOVQstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem - {name: "MOVQstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVQ", aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem + {name: "MOVBstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVB", scale: 1, aux: "SymOff", symEffect: "Write"}, // store byte in arg2 to arg0+arg1+auxint+aux. arg3=mem + {name: "MOVWstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVW", scale: 1, aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem + {name: "MOVWstoreidx2", argLength: 4, reg: gpstoreidx, asm: "MOVW", scale: 2, aux: "SymOff", symEffect: "Write"}, // store 2 bytes in arg2 to arg0+2*arg1+auxint+aux. arg3=mem + {name: "MOVLstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVL", scale: 1, aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem + {name: "MOVLstoreidx4", argLength: 4, reg: gpstoreidx, asm: "MOVL", scale: 4, aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+4*arg1+auxint+aux. arg3=mem + {name: "MOVLstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVL", scale: 8, aux: "SymOff", symEffect: "Write"}, // store 4 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem + {name: "MOVQstoreidx1", argLength: 4, reg: gpstoreidx, asm: "MOVQ", scale: 1, aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+arg1+auxint+aux. arg3=mem + {name: "MOVQstoreidx8", argLength: 4, reg: gpstoreidx, asm: "MOVQ", scale: 8, aux: "SymOff", symEffect: "Write"}, // store 8 bytes in arg2 to arg0+8*arg1+auxint+aux. arg3=mem // TODO: add size-mismatched indexed loads, like MOVBstoreidx4. // For storeconst ops, the AuxInt field encodes both @@ -605,13 +605,13 @@ func init() { {name: "MOVLstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store low 4 bytes of ... {name: "MOVQstoreconst", argLength: 2, reg: gpstoreconst, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", faultOnNilArg0: true, symEffect: "Write"}, // store 8 bytes of ... - {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux. arg2=mem - {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... arg1 ... - {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... 2*arg1 ... - {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... arg1 ... - {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... 4*arg1 ... - {name: "MOVQstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... arg1 ... - {name: "MOVQstoreconstidx8", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... 8*arg1 ... + {name: "MOVBstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVB", scale: 1, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low byte of ValAndOff(AuxInt).Val() to arg0+1*arg1+ValAndOff(AuxInt).Off()+aux. arg2=mem + {name: "MOVWstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", scale: 1, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... arg1 ... + {name: "MOVWstoreconstidx2", argLength: 3, reg: gpstoreconstidx, asm: "MOVW", scale: 2, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 2 bytes of ... 2*arg1 ... + {name: "MOVLstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", scale: 1, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... arg1 ... + {name: "MOVLstoreconstidx4", argLength: 3, reg: gpstoreconstidx, asm: "MOVL", scale: 4, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store low 4 bytes of ... 4*arg1 ... + {name: "MOVQstoreconstidx1", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", scale: 1, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... arg1 ... + {name: "MOVQstoreconstidx8", argLength: 3, reg: gpstoreconstidx, asm: "MOVQ", scale: 8, aux: "SymValAndOff", typ: "Mem", symEffect: "Write"}, // store 8 bytes of ... 8*arg1 ... // arg0 = pointer to start of memory to zero // arg1 = value to store (will always be zero) diff --git a/src/cmd/compile/internal/ssa/gen/main.go b/src/cmd/compile/internal/ssa/gen/main.go index f7195bf536..0903f77dbb 100644 --- a/src/cmd/compile/internal/ssa/gen/main.go +++ b/src/cmd/compile/internal/ssa/gen/main.go @@ -56,6 +56,7 @@ type opData struct { hasSideEffects bool // for "reasons", not to be eliminated. E.g., atomic store, #19182. zeroWidth bool // op never translates into any machine code. example: copy, which may sometimes translate to machine code, is not zero-width. symEffect string // effect this op has on symbol in aux + scale uint8 // amd64/386 indexed load scale } type blockData struct { @@ -245,6 +246,9 @@ func genOp() { if v.asm != "" { fmt.Fprintf(w, "asm: %s.A%s,\n", pkg, v.asm) } + if v.scale != 0 { + fmt.Fprintf(w, "scale: %d,\n", v.scale) + } fmt.Fprintln(w, "reg:regInfo{") // Compute input allocation order. We allocate from the @@ -291,6 +295,7 @@ func genOp() { fmt.Fprintln(w, "}") fmt.Fprintln(w, "func (o Op) Asm() obj.As {return opcodeTable[o].asm}") + fmt.Fprintln(w, "func (o Op) Scale() int16 {return int16(opcodeTable[o].scale)}") // generate op string method fmt.Fprintln(w, "func (o Op) String() string {return opcodeTable[o].name }") diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index 43f5c59591..a3cebce43b 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -37,6 +37,7 @@ type opInfo struct { hasSideEffects bool // for "reasons", not to be eliminated. E.g., atomic store, #19182. zeroWidth bool // op never translates into any machine code. example: copy, which may sometimes translate to machine code, is not zero-width. symEffect SymEffect // effect this op has on symbol in aux + scale uint8 // amd64/386 indexed load scale } type inputInfo struct { diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 9222f52b58..ae1a2b47e6 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -5847,6 +5847,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVSS, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5863,6 +5864,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVSS, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5879,6 +5881,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVSD, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5895,6 +5898,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVSD, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5939,6 +5943,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVSS, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5953,6 +5958,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVSS, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5967,6 +5973,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVSD, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -5981,6 +5988,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVSD, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10112,6 +10120,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymAddr, asm: x86.ALEAQ, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10129,6 +10138,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymAddr, asm: x86.ALEAL, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10146,6 +10156,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymAddr, asm: x86.ALEAW, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10162,6 +10173,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAQ, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10178,6 +10190,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAL, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10194,6 +10207,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAW, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10210,6 +10224,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAQ, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10226,6 +10241,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAL, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10242,6 +10258,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAW, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10258,6 +10275,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAQ, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10274,6 +10292,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAL, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10290,6 +10309,7 @@ var opcodeTable = [...]opInfo{ argLen: 2, symEffect: SymAddr, asm: x86.ALEAW, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10505,6 +10525,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymRead, asm: x86.AMOVBLZX, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10522,6 +10543,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymRead, asm: x86.AMOVWLZX, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10538,6 +10560,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVWLZX, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10555,6 +10578,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymRead, asm: x86.AMOVL, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10571,6 +10595,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVL, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10587,6 +10612,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVL, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10604,6 +10630,7 @@ var opcodeTable = [...]opInfo{ commutative: true, symEffect: SymRead, asm: x86.AMOVQ, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10620,6 +10647,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymRead, asm: x86.AMOVQ, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10636,6 +10664,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVB, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10650,6 +10679,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVW, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10664,6 +10694,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVW, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10678,6 +10709,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVL, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10692,6 +10724,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVL, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10706,6 +10739,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVL, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10720,6 +10754,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVQ, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10734,6 +10769,7 @@ var opcodeTable = [...]opInfo{ argLen: 4, symEffect: SymWrite, asm: x86.AMOVQ, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10800,6 +10836,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVB, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10813,6 +10850,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVW, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10826,6 +10864,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVW, + scale: 2, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10839,6 +10878,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVL, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10852,6 +10892,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVL, + scale: 4, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10865,6 +10906,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVQ, + scale: 1, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -10878,6 +10920,7 @@ var opcodeTable = [...]opInfo{ argLen: 3, symEffect: SymWrite, asm: x86.AMOVQ, + scale: 8, reg: regInfo{ inputs: []inputInfo{ {1, 65535}, // AX CX DX BX SP BP SI DI R8 R9 R10 R11 R12 R13 R14 R15 @@ -30122,6 +30165,7 @@ var opcodeTable = [...]opInfo{ } func (o Op) Asm() obj.As { return opcodeTable[o].asm } +func (o Op) Scale() int16 { return int16(opcodeTable[o].scale) } func (o Op) String() string { return opcodeTable[o].name } func (o Op) UsesScratch() bool { return opcodeTable[o].usesScratch } func (o Op) SymEffect() SymEffect { return opcodeTable[o].symEffect } -- GitLab From 48d3c32ba9c2cbe4cfded44a150540f15fdf517c Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 10 Mar 2019 11:55:49 -0700 Subject: [PATCH 0390/1679] cmd/compile: teach rulegen to |-expand multiple |s in a single op I want to be able to write MOV(Q|Q|L|L|L|W|W|B)loadidx(1|8|1|4|8|1|2|1) instead of MOV(Qloadidx1|Qloadidx8|Lloadidx1|Lloadidx4|Lloadidx8|Wloadidx1|Wloadidx2|Bloadidx1) in rewrite rules. Both are fairly cryptic and hard to review, but the former is at least compact, which helps to not obscure the structure of the rest of the rule. Support that by adjusting rulegen's expansion. Instead of looking for an op that begins with "(", ends with " ", and has exactly one set of parens in it, look for everything of the form "(...|...)". That has false positives: Go code in the && conditions and AuxInt expressions. Those are easily checked for syntactically: && conditions are between && and ->, and AuxInt expressions are inside square brackets. After ruling out those false positives, we can keep everything else, regardless of where it is. No change to the generated code for existing rules. Change-Id: I5b70a190e268989504f53cb2cce2f9a50170d8a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/166737 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/rulegen.go | 53 +++++++++++++++------ 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index f3a54b6299..d280688a0a 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -815,20 +815,39 @@ func isVariable(s string) bool { } // opRegexp is a regular expression to find the opcode portion of s-expressions. -var opRegexp = regexp.MustCompile(`[(]\w*[(](\w+[|])+\w+[)]\w* `) +var opRegexp = regexp.MustCompile(`[(](\w+[|])+\w+[)]`) + +// excludeFromExpansion reports whether the substring s[idx[0]:idx[1]] in a rule +// should be disregarded as a candidate for | expansion. +// It uses simple syntactic checks to see whether the substring +// is inside an AuxInt expression or inside the && conditions. +func excludeFromExpansion(s string, idx []int) bool { + left := s[:idx[0]] + if strings.LastIndexByte(left, '[') > strings.LastIndexByte(left, ']') { + // Inside an AuxInt expression. + return true + } + right := s[idx[1]:] + if strings.Contains(left, "&&") && strings.Contains(right, "->") { + // Inside && conditions. + return true + } + return false +} // expandOr converts a rule into multiple rules by expanding | ops. func expandOr(r string) []string { - // Find every occurrence of |-separated things at the opcode position. - // They look like (MOV(B|W|L|Q|SS|SD)load - // Note: there might be false positives in parts of rules that are Go code - // (e.g. && conditions, AuxInt expressions, etc.). There are currently no - // such false positives, so I'm not too worried about it. + // Find every occurrence of |-separated things. + // They look like MOV(B|W|L|Q|SS|SD)load or MOV(Q|L)loadidx(1|8). // Generate rules selecting one case from each |-form. // Count width of |-forms. They must match. n := 1 - for _, s := range opRegexp.FindAllString(r, -1) { + for _, idx := range opRegexp.FindAllStringIndex(r, -1) { + if excludeFromExpansion(r, idx) { + continue + } + s := r[idx[0]:idx[1]] c := strings.Count(s, "|") + 1 if c == 1 { continue @@ -842,16 +861,22 @@ func expandOr(r string) []string { // No |-form in this rule. return []string{r} } + // Build each new rule. res := make([]string, n) for i := 0; i < n; i++ { - res[i] = opRegexp.ReplaceAllStringFunc(r, func(s string) string { - if strings.Count(s, "|") == 0 { - return s + buf := new(strings.Builder) + x := 0 + for _, idx := range opRegexp.FindAllStringIndex(r, -1) { + if excludeFromExpansion(r, idx) { + continue } - s = s[1 : len(s)-1] // remove leading "(" and trailing " " - x, y := strings.Index(s, "("), strings.Index(s, ")") - return "(" + s[:x] + strings.Split(s[x+1:y], "|")[i] + s[y+1:] + " " - }) + buf.WriteString(r[x:idx[0]]) // write bytes we've skipped over so far + s := r[idx[0]+1 : idx[1]-1] // remove leading "(" and trailing ")" + buf.WriteString(strings.Split(s, "|")[i]) // write the op component for this rule + x = idx[1] // note that we've written more bytes + } + buf.WriteString(r[x:]) + res[i] = buf.String() } return res } -- GitLab From ac56baa09f789ab93dd97b31c4f033da7c85a6a4 Mon Sep 17 00:00:00 2001 From: Emmanuel T Odeke Date: Tue, 5 Mar 2019 03:58:37 -0800 Subject: [PATCH 0391/1679] testing: enable examples on js/wasm with non os.Pipe runExample os.Pipe is not implemented on wasm/js so for that purpose use a temporary file for js/wasm. This change creates two versions of runExample: * runExample verbatim that still uses os.Pipe for non js/wasm * runExample that uses a temporary file Also added a TODO to re-unify these function versions back into example.go wasm/js gets an os.Pipe implementation. Change-Id: I9f418a49b2c397e1667724c7442b7bbe8942225e Reviewed-on: https://go-review.googlesource.com/c/go/+/165357 Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/testing/example.go | 92 ++++++++++++----------------------- src/testing/run_example.go | 64 ++++++++++++++++++++++++ src/testing/run_example_js.go | 74 ++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+), 61 deletions(-) create mode 100644 src/testing/run_example.go create mode 100644 src/testing/run_example_js.go diff --git a/src/testing/example.go b/src/testing/example.go index f4beb76f5f..c122121289 100644 --- a/src/testing/example.go +++ b/src/testing/example.go @@ -6,7 +6,6 @@ package testing import ( "fmt" - "io" "os" "sort" "strings" @@ -56,68 +55,39 @@ func sortLines(output string) string { return strings.Join(lines, "\n") } -func runExample(eg InternalExample) (ok bool) { - if *chatty { - fmt.Printf("=== RUN %s\n", eg.Name) - } - - // Capture stdout. - stdout := os.Stdout - r, w, err := os.Pipe() - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - os.Stdout = w - outC := make(chan string) - go func() { - var buf strings.Builder - _, err := io.Copy(&buf, r) - r.Close() - if err != nil { - fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err) - os.Exit(1) +// processRunResult computes a summary and status of the result of running an example test. +// stdout is the captured output from stdout of the test. +// recovered is the result of invoking recover after running the test, in case it panicked. +// +// If stdout doesn't match the expected output or if recovered is non-nil, it'll print the cause of failure to stdout. +// If the test is chatty/verbose, it'll print a success message to stdout. +// If recovered is non-nil, it'll panic with that value. +func (eg *InternalExample) processRunResult(stdout string, timeSpent time.Duration, recovered interface{}) (passed bool) { + passed = true + + dstr := fmtDuration(timeSpent) + var fail string + got := strings.TrimSpace(stdout) + want := strings.TrimSpace(eg.Output) + if eg.Unordered { + if sortLines(got) != sortLines(want) && recovered == nil { + fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", stdout, eg.Output) } - outC <- buf.String() - }() - - start := time.Now() - ok = true - - // Clean up in a deferred call so we can recover if the example panics. - defer func() { - dstr := fmtDuration(time.Since(start)) - - // Close pipe, restore stdout, get output. - w.Close() - os.Stdout = stdout - out := <-outC - - var fail string - err := recover() - got := strings.TrimSpace(out) - want := strings.TrimSpace(eg.Output) - if eg.Unordered { - if sortLines(got) != sortLines(want) && err == nil { - fail = fmt.Sprintf("got:\n%s\nwant (unordered):\n%s\n", out, eg.Output) - } - } else { - if got != want && err == nil { - fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want) - } - } - if fail != "" || err != nil { - fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail) - ok = false - } else if *chatty { - fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr) - } - if err != nil { - panic(err) + } else { + if got != want && recovered == nil { + fail = fmt.Sprintf("got:\n%s\nwant:\n%s\n", got, want) } - }() + } + if fail != "" || recovered != nil { + fmt.Printf("--- FAIL: %s (%s)\n%s", eg.Name, dstr, fail) + passed = false + } else if *chatty { + fmt.Printf("--- PASS: %s (%s)\n", eg.Name, dstr) + } + if recovered != nil { + // Propagate the previously recovered result, by panicking. + panic(recovered) + } - // Run example. - eg.F() return } diff --git a/src/testing/run_example.go b/src/testing/run_example.go new file mode 100644 index 0000000000..10bde49e5b --- /dev/null +++ b/src/testing/run_example.go @@ -0,0 +1,64 @@ +// Copyright 2019 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. + +// +build !js + +// TODO(@musiol, @odeke-em): re-unify this entire file back into +// example.go when js/wasm gets an os.Pipe implementation +// and no longer needs this separation. + +package testing + +import ( + "fmt" + "io" + "os" + "strings" + "time" +) + +func runExample(eg InternalExample) (ok bool) { + if *chatty { + fmt.Printf("=== RUN %s\n", eg.Name) + } + + // Capture stdout. + stdout := os.Stdout + r, w, err := os.Pipe() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Stdout = w + outC := make(chan string) + go func() { + var buf strings.Builder + _, err := io.Copy(&buf, r) + r.Close() + if err != nil { + fmt.Fprintf(os.Stderr, "testing: copying pipe: %v\n", err) + os.Exit(1) + } + outC <- buf.String() + }() + + start := time.Now() + + // Clean up in a deferred call so we can recover if the example panics. + defer func() { + timeSpent := time.Since(start) + + // Close pipe, restore stdout, get output. + w.Close() + os.Stdout = stdout + out := <-outC + + err := recover() + ok = eg.processRunResult(out, timeSpent, err) + }() + + // Run example. + eg.F() + return +} diff --git a/src/testing/run_example_js.go b/src/testing/run_example_js.go new file mode 100644 index 0000000000..472e0c57fa --- /dev/null +++ b/src/testing/run_example_js.go @@ -0,0 +1,74 @@ +// Copyright 2019 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. + +// +build js + +package testing + +import ( + "fmt" + "io" + "os" + "strings" + "time" +) + +// TODO(@musiol, @odeke-em): unify this code back into +// example.go when js/wasm gets an os.Pipe implementation. +func runExample(eg InternalExample) (ok bool) { + if *chatty { + fmt.Printf("=== RUN %s\n", eg.Name) + } + + // Capture stdout to temporary file. We're not using + // os.Pipe because it is not supported on js/wasm. + stdout := os.Stdout + f := createTempFile(eg.Name) + os.Stdout = f + start := time.Now() + + // Clean up in a deferred call so we can recover if the example panics. + defer func() { + timeSpent := time.Since(start) + + // Restore stdout, get output and remove temporary file. + os.Stdout = stdout + var buf strings.Builder + _, seekErr := f.Seek(0, os.SEEK_SET) + _, readErr := io.Copy(&buf, f) + out := buf.String() + f.Close() + os.Remove(f.Name()) + if seekErr != nil { + fmt.Fprintf(os.Stderr, "testing: seek temp file: %v\n", seekErr) + os.Exit(1) + } + if readErr != nil { + fmt.Fprintf(os.Stderr, "testing: read temp file: %v\n", readErr) + os.Exit(1) + } + + err := recover() + ok = eg.processRunResult(out, timeSpent, err) + }() + + // Run example. + eg.F() + return +} + +func createTempFile(exampleName string) *os.File { + for i := 0; ; i++ { + name := fmt.Sprintf("%s/go-example-stdout-%s-%d.txt", os.TempDir(), exampleName, i) + f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + if err != nil { + if os.IsExist(err) { + continue + } + fmt.Fprintf(os.Stderr, "testing: open temp file: %v\n", err) + os.Exit(1) + } + return f + } +} -- GitLab From 486ca37b14f56b2e125fc3afbd900a5369532043 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 11 Mar 2019 10:57:44 -0700 Subject: [PATCH 0392/1679] test: fix memcombine tests Two tests (load_le_byte8_uint64_inv and load_be_byte8_uint64) pass but the generated code isn't actually correct. The test regexp provides a false negative, as it matches the MOVQ (SP), BP instruction in the epilogue. Combined loads never worked for these cases - the test was added in error as part of a batch and not noticed because of the above false match. Normalize the amd64/386 tests to always negative match on narrower loads and OR. Change-Id: I256861924774d39db0e65723866c81df5ab5076f Reviewed-on: https://go-review.googlesource.com/c/go/+/166837 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- test/codegen/memcombine.go | 62 +++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/test/codegen/memcombine.go b/test/codegen/memcombine.go index b3d2cb2067..2b4422ebd2 100644 --- a/test/codegen/memcombine.go +++ b/test/codegen/memcombine.go @@ -20,7 +20,7 @@ var sink16 uint16 // ------------- // func load_le64(b []byte) { - // amd64:`MOVQ\s\(.*\),` + // amd64:`MOVQ\s\(.*\),`,-`MOV[BWL]`,-`OR` // s390x:`MOVDBR\s\(.*\),` // arm64:`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]` // ppc64le:`MOVD\s`,-`MOV[BHW]Z` @@ -28,7 +28,7 @@ func load_le64(b []byte) { } func load_le64_idx(b []byte, idx int) { - // amd64:`MOVQ\s\(.*\)\(.*\*1\),` + // amd64:`MOVQ\s\(.*\)\(.*\*1\),`,-`MOV[BWL]`,-`OR` // s390x:`MOVDBR\s\(.*\)\(.*\*1\),` // arm64:`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[BHW]` // ppc64le:`MOVD\s`,-`MOV[BHW]Z\s` @@ -36,7 +36,8 @@ func load_le64_idx(b []byte, idx int) { } func load_le32(b []byte) { - // amd64:`MOVL\s\(.*\),` 386:`MOVL\s\(.*\),` + // amd64:`MOVL\s\(.*\),`,-`MOV[BW]`,-`OR` + // 386:`MOVL\s\(.*\),`,-`MOV[BW]`,-`OR` // s390x:`MOVWBR\s\(.*\),` // arm64:`MOVWU\s\(R[0-9]+\),`,-`MOV[BH]` // ppc64le:`MOVWZ\s` @@ -44,7 +45,8 @@ func load_le32(b []byte) { } func load_le32_idx(b []byte, idx int) { - // amd64:`MOVL\s\(.*\)\(.*\*1\),` 386:`MOVL\s\(.*\)\(.*\*1\),` + // amd64:`MOVL\s\(.*\)\(.*\*1\),`,-`MOV[BW]`,-`OR` + // 386:`MOVL\s\(.*\)\(.*\*1\),`,-`MOV[BW]`,-`OR` // s390x:`MOVWBR\s\(.*\)\(.*\*1\),` // arm64:`MOVWU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[BH]` // ppc64le:`MOVWZ\s` @@ -52,21 +54,21 @@ func load_le32_idx(b []byte, idx int) { } func load_le16(b []byte) { - // amd64:`MOVWLZX\s\(.*\),` + // amd64:`MOVWLZX\s\(.*\),`,-`MOVB`,-`OR` // ppc64le:`MOVHZ\s` // arm64:`MOVHU\s\(R[0-9]+\),`,-`MOVB` sink16 = binary.LittleEndian.Uint16(b) } func load_le16_idx(b []byte, idx int) { - // amd64:`MOVWLZX\s\(.*\),` + // amd64:`MOVWLZX\s\(.*\),`,-`MOVB`,-`OR` // ppc64le:`MOVHZ\s` // arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOVB` sink16 = binary.LittleEndian.Uint16(b[idx:]) } func load_be64(b []byte) { - // amd64:`BSWAPQ` + // amd64:`BSWAPQ`,-`MOV[BWL]`,-`OR` // s390x:`MOVD\s\(.*\),` // arm64:`REV`,`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]`,-`REVW`,-`REV16W` // ppc64le:`MOVDBR` @@ -74,7 +76,7 @@ func load_be64(b []byte) { } func load_be64_idx(b []byte, idx int) { - // amd64:`BSWAPQ` + // amd64:`BSWAPQ`,-`MOV[BWL]`,-`OR` // s390x:`MOVD\s\(.*\)\(.*\*1\),` // arm64:`REV`,`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[WHB]`,-`REVW`,-`REV16W` // ppc64le:`MOVDBR` @@ -82,7 +84,7 @@ func load_be64_idx(b []byte, idx int) { } func load_be32(b []byte) { - // amd64:`BSWAPL` + // amd64:`BSWAPL`,-`MOV[BW]`,-`OR` // s390x:`MOVWZ\s\(.*\),` // arm64:`REVW`,`MOVWU\s\(R[0-9]+\),`,-`MOV[BH]`,-`REV16W` // ppc64le:`MOVWBR` @@ -90,7 +92,7 @@ func load_be32(b []byte) { } func load_be32_idx(b []byte, idx int) { - // amd64:`BSWAPL` + // amd64:`BSWAPL`,-`MOV[BW]`,-`OR` // s390x:`MOVWZ\s\(.*\)\(.*\*1\),` // arm64:`REVW`,`MOVWU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[HB]`,-`REV16W` // ppc64le:`MOVWBR` @@ -98,14 +100,14 @@ func load_be32_idx(b []byte, idx int) { } func load_be16(b []byte) { - // amd64:`ROLW\s\$8` + // amd64:`ROLW\s\$8`,-`MOVB`,-`OR` // arm64:`REV16W`,`MOVHU\s\(R[0-9]+\),`,-`MOVB` // ppc64le:`MOVHBR` sink16 = binary.BigEndian.Uint16(b) } func load_be16_idx(b []byte, idx int) { - // amd64:`ROLW\s\$8` + // amd64:`ROLW\s\$8`,-`MOVB`,-`OR` // arm64:`REV16W`,`MOVHU\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOVB` // ppc64le:`MOVHBR` sink16 = binary.BigEndian.Uint16(b[idx:]) @@ -113,22 +115,22 @@ func load_be16_idx(b []byte, idx int) { func load_le_byte2_uint16(s []byte) uint16 { // arm64:`MOVHU\t\(R[0-9]+\)`,-`ORR`,-`MOVB` - // 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` - // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` + // 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` + // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` return uint16(s[0]) | uint16(s[1])<<8 } func load_le_byte2_uint16_inv(s []byte) uint16 { // arm64:`MOVHU\t\(R[0-9]+\)`,-`ORR`,-`MOVB` - // 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` - // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` + // 386:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` + // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` return uint16(s[1])<<8 | uint16(s[0]) } func load_le_byte4_uint32(s []byte) uint32 { // arm64:`MOVWU\t\(R[0-9]+\)`,-`ORR`,-`MOV[BH]` - // 386:`MOVL\s\([A-Z]+\)`,-`MOVB`,-`OR`-`MOVW` - // amd64:`MOVL\s\([A-Z]+\)`,-`MOVB`,-`OR`-`MOVW` + // 386:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR` + // amd64:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR` return uint32(s[0]) | uint32(s[1])<<8 | uint32(s[2])<<16 | uint32(s[3])<<24 } @@ -139,25 +141,24 @@ func load_le_byte4_uint32_inv(s []byte) uint32 { func load_le_byte8_uint64(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+` + // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]`,-`OR` return uint64(s[0]) | uint64(s[1])<<8 | uint64(s[2])<<16 | uint64(s[3])<<24 | uint64(s[4])<<32 | uint64(s[5])<<40 | uint64(s[6])<<48 | uint64(s[7])<<56 } func load_le_byte8_uint64_inv(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+` return uint64(s[7])<<56 | uint64(s[6])<<48 | uint64(s[5])<<40 | uint64(s[4])<<32 | uint64(s[3])<<24 | uint64(s[2])<<16 | uint64(s[1])<<8 | uint64(s[0]) } func load_be_byte2_uint16(s []byte) uint16 { // arm64:`MOVHU\t\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` + // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` return uint16(s[0])<<8 | uint16(s[1]) } func load_be_byte2_uint16_inv(s []byte) uint16 { // arm64:`MOVHU\t\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`ORL` + // amd64:`MOVWLZX\s\([A-Z]+\)`,-`MOVB`,-`OR` return uint16(s[1]) | uint16(s[0])<<8 } @@ -168,39 +169,38 @@ func load_be_byte4_uint32(s []byte) uint32 { func load_be_byte4_uint32_inv(s []byte) uint32 { // arm64:`MOVWU\t\(R[0-9]+\)`,`REVW`,-`ORR`,-`REV16W`,-`MOV[BH]` - // amd64:`MOVL\s\([A-Z]+\)`,-`MOVB`,-`OR`,-`MOVW` + // amd64:`MOVL\s\([A-Z]+\)`,-`MOV[BW]`,-`OR` return uint32(s[3]) | uint32(s[2])<<8 | uint32(s[1])<<16 | uint32(s[0])<<24 } func load_be_byte8_uint64(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,`REV`,-`ORR`,-`REVW`,-`REV16W`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+` return uint64(s[0])<<56 | uint64(s[1])<<48 | uint64(s[2])<<40 | uint64(s[3])<<32 | uint64(s[4])<<24 | uint64(s[5])<<16 | uint64(s[6])<<8 | uint64(s[7]) } func load_be_byte8_uint64_inv(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,`REV`,-`ORR`,-`REVW`,-`REV16W`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+` + // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]`,-`OR` return uint64(s[7]) | uint64(s[6])<<8 | uint64(s[5])<<16 | uint64(s[4])<<24 | uint64(s[3])<<32 | uint64(s[2])<<40 | uint64(s[1])<<48 | uint64(s[0])<<56 } func load_le_byte2_uint16_idx(s []byte, idx int) uint16 { // arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOVB` // 386:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`ORL`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`OR`,-`MOVB` + // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR` return uint16(s[idx]) | uint16(s[idx+1])<<8 } func load_le_byte2_uint16_idx_inv(s []byte, idx int) uint16 { // arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOVB` // 386:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`ORL`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`OR`,-`MOVB` + // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR` return uint16(s[idx+1])<<8 | uint16(s[idx]) } func load_le_byte4_uint32_idx(s []byte, idx int) uint32 { // arm64:`MOVWU\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOV[BH]` - // amd64:`MOVL\s\([A-Z]+\)\([A-Z]+`,-`OR`,-`MOVB`,-`MOVW` + // amd64:`MOVL\s\([A-Z]+\)\([A-Z]+`,-`MOV[BW]`,-`OR` return uint32(s[idx]) | uint32(s[idx+1])<<8 | uint32(s[idx+2])<<16 | uint32(s[idx+3])<<24 } @@ -211,7 +211,7 @@ func load_le_byte4_uint32_idx_inv(s []byte, idx int) uint32 { func load_le_byte8_uint64_idx(s []byte, idx int) uint64 { // arm64:`MOVD\s\(R[0-9]+\)\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\)\([A-Z]+` + // amd64:`MOVQ\s\([A-Z]+\)\([A-Z]+`,-`MOV[BWL]`,-`OR` return uint64(s[idx]) | uint64(s[idx+1])<<8 | uint64(s[idx+2])<<16 | uint64(s[idx+3])<<24 | uint64(s[idx+4])<<32 | uint64(s[idx+5])<<40 | uint64(s[idx+6])<<48 | uint64(s[idx+7])<<56 } @@ -222,13 +222,13 @@ func load_le_byte8_uint64_idx_inv(s []byte, idx int) uint64 { func load_be_byte2_uint16_idx(s []byte, idx int) uint16 { // arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`OR`,-`MOVB` + // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR` return uint16(s[idx])<<8 | uint16(s[idx+1]) } func load_be_byte2_uint16_idx_inv(s []byte, idx int) uint16 { // arm64:`MOVHU\s\(R[0-9]+\)\(R[0-9]+\)`,`REV16W`,-`ORR`,-`MOVB` - // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`OR`,-`MOVB` + // amd64:`MOVWLZX\s\([A-Z]+\)\([A-Z]+`,-`MOVB`,-`OR` return uint16(s[idx+1]) | uint16(s[idx])<<8 } -- GitLab From 756a69c6c9d4c7d203e3c38d865240d5e5720efb Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 28 Feb 2019 16:21:48 -0500 Subject: [PATCH 0393/1679] cmd: refresh cmd/vendor to match 'go mod vendor' This change preserves the maximum versions from cmd/vendor/vendor.json where feasible, but bumps the versions of x/sys (for CL 162987) and x/tools (for CL 162989 and CL 160837) so that 'go test all' passes in module mode when run from a working directory in src/cmd. A small change to cmd/vet (not vendored) was necessary to preserve its flag behavior given a pristine copy of x/tools; see CL 162989 for more detail. This change was generated by running 'go mod vendor' at CL 164622. (Welcoooome to the fuuuuuture!) Updates #30228 Updates #30241 Change-Id: I889590318dc857d4a6e20c3023d09a27128d8255 Reviewed-on: https://go-review.googlesource.com/c/go/+/164618 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- misc/nacl/testzip.proto | 30 +- src/cmd/go.sum | 13 + src/cmd/vendor/README | 25 - .../vendor/github.com/google/pprof/AUTHORS | 7 + .../github.com/google/pprof/CONTRIBUTORS | 15 + .../pprof/internal/binutils/binutils_test.go | 392 - .../pprof/internal/binutils/disasm_test.go | 152 - .../internal/binutils/testdata/build_mac.sh | 31 - .../internal/binutils/testdata/exe_linux_64 | Bin 9503 -> 0 bytes .../internal/binutils/testdata/exe_mac_64 | Bin 8648 -> 0 bytes .../exe_mac_64.dSYM/Contents/Info.plist | 20 - .../Contents/Resources/DWARF/exe_mac_64 | Bin 8840 -> 0 bytes .../binutils/testdata/fake-llvm-symbolizer | 34 - .../internal/binutils/testdata/lib_mac_64 | Bin 4496 -> 0 bytes .../lib_mac_64.dSYM/Contents/Info.plist | 20 - .../Contents/Resources/DWARF/lib_mac_64 | Bin 8934 -> 0 bytes .../internal/binutils/testdata/malformed_elf | 1 - .../binutils/testdata/malformed_macho | 1 - .../pprof/internal/driver/driver_focus.go | 2 +- .../pprof/internal/driver/driver_test.go | 1606 ---- .../pprof/internal/driver/fetch_test.go | 758 -- .../google/pprof/internal/driver/flags.go | 14 + .../pprof/internal/driver/interactive_test.go | 316 - .../driver/testdata/cppbench.contention | 24 - .../internal/driver/testdata/cppbench.cpu | Bin 24405 -> 0 bytes .../driver/testdata/cppbench.small.contention | 19 - .../internal/driver/testdata/file1000.src | 17 - .../internal/driver/testdata/file2000.src | 17 - .../internal/driver/testdata/file3000.src | 17 - .../internal/driver/testdata/go.crc32.cpu | Bin 5032 -> 0 bytes .../driver/testdata/go.nomappings.crash | Bin 232 -> 0 bytes .../testdata/pprof.contention.cum.files.dot | 10 - ...contention.flat.addresses.dot.focus.ignore | 9 - .../testdata/pprof.cpu.call_tree.callgrind | 99 - .../driver/testdata/pprof.cpu.callgrind | 88 - .../driver/testdata/pprof.cpu.comments | 1 - .../pprof.cpu.cum.lines.text.focus.hide | 8 - .../testdata/pprof.cpu.cum.lines.text.hide | 7 - .../testdata/pprof.cpu.cum.lines.text.show | 7 - .../pprof.cpu.cum.lines.topproto.hide | 5 - .../pprof.cpu.cum.lines.tree.show_from | 16 - .../testdata/pprof.cpu.flat.addresses.disasm | 14 - .../pprof.cpu.flat.addresses.noinlines.text | 7 - .../testdata/pprof.cpu.flat.addresses.weblist | 106 - ...prof.cpu.flat.filefunctions.noinlines.text | 5 - .../pprof.cpu.flat.functions.call_tree.dot | 21 - .../testdata/pprof.cpu.flat.functions.dot | 20 - .../pprof.cpu.flat.functions.noinlines.text | 5 - .../testdata/pprof.cpu.flat.functions.text | 8 - .../driver/testdata/pprof.cpu.lines.topproto | 3 - .../internal/driver/testdata/pprof.cpu.peek | 13 - .../internal/driver/testdata/pprof.cpu.tags | 13 - .../testdata/pprof.cpu.tags.focus.ignore | 6 - .../internal/driver/testdata/pprof.cpu.traces | 32 - .../pprof.cpusmall.flat.addresses.tree | 17 - .../driver/testdata/pprof.heap.callgrind | 88 - .../driver/testdata/pprof.heap.comments | 2 - .../testdata/pprof.heap.cum.lines.tree.focus | 21 - ...f.heap.cum.relative_percentages.tree.focus | 21 - .../pprof.heap.flat.files.seconds.text | 2 - .../testdata/pprof.heap.flat.files.text | 5 - .../testdata/pprof.heap.flat.files.text.focus | 8 - .../pprof.heap.flat.inuse_objects.text | 8 - .../pprof.heap.flat.inuse_space.dot.focus | 13 - ...rof.heap.flat.inuse_space.dot.focus.ignore | 16 - .../testdata/pprof.heap.flat.lines.dot.focus | 21 - .../internal/driver/testdata/pprof.heap.tags | 6 - .../driver/testdata/pprof.heap.tags.unit | 6 - .../pprof.heap_alloc.flat.alloc_objects.text | 8 - .../pprof.heap_alloc.flat.alloc_space.dot | 14 - ...prof.heap_alloc.flat.alloc_space.dot.focus | 18 - ...pprof.heap_alloc.flat.alloc_space.dot.hide | 11 - .../testdata/pprof.heap_request.tags.focus | 8 - .../driver/testdata/pprof.heap_sizetags.dot | 30 - .../driver/testdata/pprof.heap_tags.traces | 32 - .../driver/testdata/pprof.longNameFuncs.dot | 9 - .../driver/testdata/pprof.longNameFuncs.text | 5 - ...prof.unknown.flat.functions.call_tree.text | 8 - .../google/pprof/internal/driver/webui.go | 9 +- .../pprof/internal/driver/webui_test.go | 285 - .../pprof/internal/elfexec/elfexec_test.go | 102 - .../pprof/internal/graph/dotgraph_test.go | 335 - .../google/pprof/internal/graph/graph.go | 2 +- .../google/pprof/internal/graph/graph_test.go | 471 -- .../internal/graph/testdata/compose1.dot | 7 - .../internal/graph/testdata/compose2.dot | 7 - .../internal/graph/testdata/compose3.dot | 11 - .../internal/graph/testdata/compose4.dot | 4 - .../internal/graph/testdata/compose5.dot | 11 - .../internal/graph/testdata/compose6.dot | 7 - .../internal/measurement/measurement_test.go | 47 - .../pprof/internal/proftest/proftest.go | 140 - .../pprof/internal/report/report_test.go | 414 - .../pprof/internal/report/source_test.go | 185 - .../pprof/internal/report/testdata/README.md | 10 - .../pprof/internal/report/testdata/sample.bin | Bin 2342380 -> 0 bytes .../pprof/internal/report/testdata/sample.cpu | Bin 1836 -> 0 bytes .../internal/report/testdata/sample/sample.go | 41 - .../pprof/internal/report/testdata/source.dot | 17 - .../pprof/internal/report/testdata/source.rpt | 49 - .../pprof/internal/report/testdata/source1 | 19 - .../pprof/internal/report/testdata/source2 | 19 - .../internal/symbolizer/symbolizer_test.go | 300 - .../pprof/internal/symbolz/symbolz_test.go | 169 - .../google/pprof/profile/filter_test.go | 599 -- .../google/pprof/profile/index_test.go | 114 - .../pprof/profile/legacy_profile_test.go | 321 - .../google/pprof/profile/merge_test.go | 167 - .../google/pprof/profile/profile_test.go | 1381 ---- .../google/pprof/profile/proto_test.go | 171 - .../google/pprof/profile/prune_test.go | 230 - .../profile/testdata/cppbench.contention | 24 - .../testdata/cppbench.contention.string | 65 - .../pprof/profile/testdata/cppbench.cpu | Bin 23631 -> 0 bytes .../profile/testdata/cppbench.cpu.string | 179 - .../pprof/profile/testdata/cppbench.growth | 99 - .../profile/testdata/cppbench.growth.string | 248 - .../pprof/profile/testdata/cppbench.heap | 47 - .../profile/testdata/cppbench.heap.string | 237 - .../pprof/profile/testdata/cppbench.thread | 29 - .../profile/testdata/cppbench.thread.all | 33 - .../testdata/cppbench.thread.all.string | 28 - .../profile/testdata/cppbench.thread.none | 27 - .../testdata/cppbench.thread.none.string | 50 - .../profile/testdata/cppbench.thread.string | 33 - .../pprof/profile/testdata/go.crc32.cpu | Bin 5032 -> 0 bytes .../profile/testdata/go.crc32.cpu.string | 87 - .../pprof/profile/testdata/go.godoc.thread | 8 - .../profile/testdata/go.godoc.thread.string | 37 - .../google/pprof/profile/testdata/gobench.cpu | Bin 8248 -> 0 bytes .../pprof/profile/testdata/gobench.cpu.string | 415 - .../pprof/profile/testdata/gobench.heap | 16 - .../profile/testdata/gobench.heap.string | 137 - .../pprof/profile/testdata/java.contention | 43 - .../profile/testdata/java.contention.string | 43 - .../google/pprof/profile/testdata/java.cpu | Bin 3537 -> 0 bytes .../pprof/profile/testdata/java.cpu.string | 78 - .../google/pprof/profile/testdata/java.heap | 133 - .../pprof/profile/testdata/java.heap.string | 139 - .../ianlancetaylor/demangle/.gitignore | 13 + .../ianlancetaylor/demangle/ast_test.go | 42 - .../ianlancetaylor/demangle/c++filt.go | 144 + .../ianlancetaylor/demangle/demangle_test.go | 420 - .../ianlancetaylor/demangle/expected_test.go | 183 - .../demangle/testdata/demangle-expected | 4594 ----------- src/cmd/vendor/golang.org/x/arch/AUTHORS | 3 + src/cmd/vendor/golang.org/x/arch/CONTRIBUTORS | 3 + src/cmd/vendor/golang.org/x/arch/LICENSE | 27 + src/cmd/vendor/golang.org/x/arch/PATENTS | 22 + .../x/arch/arm/armasm/decode_test.go | 69 - .../golang.org/x/arch/arm/armasm/ext_test.go | 615 -- .../x/arch/arm/armasm/objdump_test.go | 268 - .../x/arch/arm/armasm/objdumpext_test.go | 259 - .../x/arch/arm/armasm/testdata/Makefile | 5 - .../x/arch/arm/armasm/testdata/decode.txt | 1600 ---- .../x/arch/arm64/arm64asm/decode_test.go | 88 - .../x/arch/arm64/arm64asm/ext_test.go | 604 -- .../x/arch/arm64/arm64asm/objdump_test.go | 150 - .../x/arch/arm64/arm64asm/objdumpext_test.go | 299 - .../x/arch/arm64/arm64asm/testdata/Makefile | 9 - .../arch/arm64/arm64asm/testdata/gnucases.txt | 4651 ----------- .../arm64/arm64asm/testdata/plan9cases.txt | 4564 ----------- .../x/arch/ppc64/ppc64asm/decode_test.go | 64 - .../x/arch/ppc64/ppc64asm/ext_test.go | 536 -- .../x/arch/ppc64/ppc64asm/field_test.go | 60 - .../x/arch/ppc64/ppc64asm/objdump_test.go | 133 - .../x/arch/ppc64/ppc64asm/objdumpext_test.go | 255 - .../x/arch/ppc64/ppc64asm/testdata/decode.txt | 56 - .../x/arch/x86/x86asm/decode_test.go | 71 - .../golang.org/x/arch/x86/x86asm/ext_test.go | 811 -- .../x/arch/x86/x86asm/format_test.go | 68 - .../golang.org/x/arch/x86/x86asm/inst_test.go | 20 - .../x/arch/x86/x86asm/objdump_test.go | 385 - .../x/arch/x86/x86asm/objdumpext_test.go | 313 - .../x/arch/x86/x86asm/plan9ext_test.go | 119 - .../x/arch/x86/x86asm/plan9x_test.go | 54 - .../x/arch/x86/x86asm/testdata/Makefile | 12 - .../x/arch/x86/x86asm/testdata/decode.txt | 6771 ----------------- .../x/arch/x86/x86asm/testdata/libmach8db.c | 2075 ----- .../golang.org/x/arch/x86/x86asm/xed_test.go | 211 - .../x/arch/x86/x86asm/xedext_test.go | 205 - src/cmd/vendor/golang.org/x/crypto/AUTHORS | 3 + .../vendor/golang.org/x/crypto/CONTRIBUTORS | 3 + .../x/crypto/ssh/terminal/terminal.go | 4 + .../x/crypto/ssh/terminal/terminal_test.go | 358 - .../golang.org/x/crypto/ssh/terminal/util.go | 4 +- .../x/crypto/ssh/terminal/util_aix.go | 12 + .../x/crypto/ssh/terminal/util_plan9.go | 2 +- .../x/crypto/ssh/terminal/util_solaris.go | 2 +- .../x/crypto/ssh/terminal/util_windows.go | 2 +- src/cmd/vendor/golang.org/x/sys/AUTHORS | 3 + src/cmd/vendor/golang.org/x/sys/CONTRIBUTORS | 3 + .../vendor/golang.org/x/sys/unix/.gitignore | 2 + .../golang.org/x/sys/unix/creds_test.go | 134 - .../golang.org/x/sys/unix/darwin_test.go | 210 - .../golang.org/x/sys/unix/dev_linux_test.go | 56 - .../x/sys/unix/example_exec_test.go | 19 - .../x/sys/unix/example_flock_test.go | 25 - .../golang.org/x/sys/unix/export_test.go | 9 - src/cmd/vendor/golang.org/x/sys/unix/mkall.sh | 0 .../golang.org/x/sys/unix/mkasm_darwin.go | 61 + .../vendor/golang.org/x/sys/unix/mkerrors.sh | 0 .../vendor/golang.org/x/sys/unix/mkpost.go | 106 + .../vendor/golang.org/x/sys/unix/mksyscall.go | 402 + .../x/sys/unix/mksyscall_aix_ppc.go | 404 + .../x/sys/unix/mksyscall_aix_ppc64.go | 602 ++ .../x/sys/unix/mksyscall_solaris.go | 335 + .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 0 .../vendor/golang.org/x/sys/unix/mksysnum.go | 190 + .../golang.org/x/sys/unix/mmap_unix_test.go | 41 - .../golang.org/x/sys/unix/openbsd_test.go | 113 - .../golang.org/x/sys/unix/sendfile_test.go | 98 - .../golang.org/x/sys/unix/sockcmsg_unix.go | 4 +- .../golang.org/x/sys/unix/syscall_aix_test.go | 162 - .../golang.org/x/sys/unix/syscall_bsd_test.go | 89 - .../x/sys/unix/syscall_darwin_test.go | 63 - .../x/sys/unix/syscall_freebsd_test.go | 312 - .../x/sys/unix/syscall_linux_test.go | 533 -- .../x/sys/unix/syscall_netbsd_test.go | 51 - .../x/sys/unix/syscall_openbsd_test.go | 49 - .../x/sys/unix/syscall_solaris_test.go | 55 - .../golang.org/x/sys/unix/syscall_test.go | 60 - .../x/sys/unix/syscall_unix_test.go | 711 -- .../golang.org/x/sys/unix/timestruct_test.go | 54 - .../vendor/golang.org/x/sys/unix/types_aix.go | 236 + .../golang.org/x/sys/unix/types_darwin.go | 277 + .../golang.org/x/sys/unix/types_dragonfly.go | 263 + .../golang.org/x/sys/unix/types_freebsd.go | 356 + .../golang.org/x/sys/unix/types_netbsd.go | 289 + .../golang.org/x/sys/unix/types_openbsd.go | 276 + .../golang.org/x/sys/unix/types_solaris.go | 266 + .../golang.org/x/sys/unix/xattr_test.go | 207 - .../x/sys/windows/registry/export_test.go | 11 - .../golang.org/x/sys/windows/registry/key.go | 198 - .../x/sys/windows/registry/mksyscall.go | 7 - .../x/sys/windows/registry/registry_test.go | 756 -- .../x/sys/windows/registry/syscall.go | 32 - .../x/sys/windows/registry/value.go | 384 - .../sys/windows/registry/zsyscall_windows.go | 120 - .../golang.org/x/sys/windows/svc/debug/log.go | 56 - .../x/sys/windows/svc/debug/service.go | 45 - .../golang.org/x/sys/windows/svc/event.go | 48 - .../x/sys/windows/svc/eventlog/install.go | 80 - .../x/sys/windows/svc/eventlog/log.go | 70 - .../x/sys/windows/svc/eventlog/log_test.go | 51 - .../x/sys/windows/svc/example/beep.go | 22 - .../x/sys/windows/svc/example/install.go | 92 - .../x/sys/windows/svc/example/main.go | 76 - .../x/sys/windows/svc/example/manage.go | 62 - .../x/sys/windows/svc/example/service.go | 84 - .../golang.org/x/sys/windows/svc/go12.c | 24 - .../golang.org/x/sys/windows/svc/go12.go | 11 - .../golang.org/x/sys/windows/svc/go13.go | 31 - .../x/sys/windows/svc/mgr/config.go | 145 - .../golang.org/x/sys/windows/svc/mgr/mgr.go | 162 - .../x/sys/windows/svc/mgr/mgr_test.go | 282 - .../x/sys/windows/svc/mgr/recovery.go | 135 - .../x/sys/windows/svc/mgr/service.go | 72 - .../golang.org/x/sys/windows/svc/security.go | 62 - .../golang.org/x/sys/windows/svc/service.go | 363 - .../golang.org/x/sys/windows/svc/svc_test.go | 131 - .../golang.org/x/sys/windows/svc/sys_386.s | 68 - .../golang.org/x/sys/windows/svc/sys_amd64.s | 42 - .../golang.org/x/sys/windows/svc/sys_arm.s | 38 - .../golang.org/x/sys/windows/syscall_test.go | 53 - .../x/sys/windows/syscall_windows_test.go | 92 - src/cmd/vendor/golang.org/x/tools/AUTHORS | 3 + .../vendor/golang.org/x/tools/CONTRIBUTORS | 3 + .../x/tools/go/analysis/analysis.go | 1 + .../golang.org/x/tools/go/analysis/doc.go | 2 +- .../analysis/internal/analysisflags/flags.go | 13 +- .../analysis/internal/analysisflags/patch.go | 7 - .../go/analysis/passes/asmdecl/asmdecl.go | 3 +- .../go/analysis/passes/cgocall/cgocall.go | 8 +- .../go/analysis/passes/composite/composite.go | 11 +- .../go/analysis/passes/inspect/inspect.go | 6 +- .../go/analysis/passes/pkgfact/pkgfact.go | 127 - .../tools/go/analysis/passes/printf/printf.go | 28 +- .../tools/go/analysis/passes/printf/types.go | 5 +- .../x/tools/go/analysis/passes/shift/shift.go | 31 +- .../go/analysis/unitchecker/unitchecker.go | 1 + .../x/tools/go/ast/inspector/inspector.go | 2 +- src/cmd/vendor/modules.txt | 62 + src/cmd/vendor/update-xtools.sh | 31 - src/cmd/vendor/vendor.json | 385 - src/cmd/vet/main.go | 4 + 286 files changed, 4504 insertions(+), 50791 deletions(-) create mode 100644 src/cmd/go.sum delete mode 100644 src/cmd/vendor/README create mode 100644 src/cmd/vendor/github.com/google/pprof/AUTHORS create mode 100644 src/cmd/vendor/github.com/google/pprof/CONTRIBUTORS delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_linux_64 delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/fake-llvm-symbolizer delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64 delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/malformed_elf delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/malformed_macho delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/driver_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/interactive_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.contention delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.small.contention delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file1000.src delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file2000.src delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file3000.src delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/go.crc32.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/go.nomappings.crash delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.contention.cum.files.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.call_tree.callgrind delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.callgrind delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.comments delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.hide delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.show delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.disasm delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.weblist delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.lines.topproto delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags.focus.ignore delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.callgrind delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.comments delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.lines.tree.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.seconds.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_objects.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.lines.dot.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_request.tags.focus delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_sizetags.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_tags.traces delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/driver/webui_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/graph_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose1.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose2.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose3.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose4.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose5.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose6.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/report_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/source_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/README.md delete mode 100755 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample.bin delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample/sample.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.dot delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.rpt delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source1 delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source2 delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/internal/symbolz/symbolz_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/filter_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/index_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/legacy_profile_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/merge_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/profile_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/proto_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/prune_test.go delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.cpu.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.growth delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.growth.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.heap delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.heap.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread.all delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread.all.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread.none delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread.none.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.thread.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/go.crc32.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/go.crc32.cpu.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/go.godoc.thread delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/go.godoc.thread.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.cpu.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu.string delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap delete mode 100644 src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap.string create mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/.gitignore delete mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/ast_test.go create mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go delete mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/demangle_test.go delete mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/expected_test.go delete mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/testdata/demangle-expected create mode 100644 src/cmd/vendor/golang.org/x/arch/AUTHORS create mode 100644 src/cmd/vendor/golang.org/x/arch/CONTRIBUTORS create mode 100644 src/cmd/vendor/golang.org/x/arch/LICENSE create mode 100644 src/cmd/vendor/golang.org/x/arch/PATENTS delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/decode_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/ext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/objdump_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/objdumpext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/Makefile delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/decode.txt delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/decode_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/ext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdump_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdumpext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/Makefile delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/gnucases.txt delete mode 100644 src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/plan9cases.txt delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/decode_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/ext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdump_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdumpext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/testdata/decode.txt delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/ext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/format_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/inst_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdump_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdumpext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9ext_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/Makefile delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/decode.txt delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/libmach8db.c delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/xed_test.go delete mode 100644 src/cmd/vendor/golang.org/x/arch/x86/x86asm/xedext_test.go create mode 100644 src/cmd/vendor/golang.org/x/crypto/AUTHORS create mode 100644 src/cmd/vendor/golang.org/x/crypto/CONTRIBUTORS delete mode 100644 src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go create mode 100644 src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go create mode 100644 src/cmd/vendor/golang.org/x/sys/AUTHORS create mode 100644 src/cmd/vendor/golang.org/x/sys/CONTRIBUTORS create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/.gitignore delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/creds_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/darwin_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/dev_linux_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/example_exec_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/example_flock_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/export_test.go mode change 100755 => 100644 src/cmd/vendor/golang.org/x/sys/unix/mkall.sh create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go mode change 100755 => 100644 src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mkpost.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go mode change 100755 => 100644 src/cmd/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mmap_unix_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/openbsd_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/sendfile_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/timestruct_test.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_aix.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go create mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/xattr_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/export_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/key.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/mksyscall.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/registry_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/syscall.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/value.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/debug/log.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/debug/service.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/event.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/install.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/example/beep.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/example/install.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/example/main.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/example/manage.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/example/service.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/go12.c delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/go12.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/go13.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/config.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/service.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/security.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/service.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/svc_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/sys_386.s delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/sys_amd64.s delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/svc/sys_arm.s delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/syscall_test.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/windows/syscall_windows_test.go create mode 100644 src/cmd/vendor/golang.org/x/tools/AUTHORS create mode 100644 src/cmd/vendor/golang.org/x/tools/CONTRIBUTORS delete mode 100644 src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go delete mode 100644 src/cmd/vendor/golang.org/x/tools/go/analysis/passes/pkgfact/pkgfact.go create mode 100644 src/cmd/vendor/modules.txt delete mode 100755 src/cmd/vendor/update-xtools.sh delete mode 100644 src/cmd/vendor/vendor.json diff --git a/misc/nacl/testzip.proto b/misc/nacl/testzip.proto index d05219364d..19b8ceae69 100644 --- a/misc/nacl/testzip.proto +++ b/misc/nacl/testzip.proto @@ -48,43 +48,33 @@ go src=.. pprof internal binutils - testdata - + + + driver - testdata - + + + graph - testdata - + + + report - testdata - + - profile - testdata + + profile + + ianlancetaylor demangle - testdata - + + + golang.org x arch arm armasm - testdata - + + + arm64 arm64asm - testdata - + + + x86 x86asm - testdata - + + + ppc64 ppc64asm - testdata - + + + archive tar testdata diff --git a/src/cmd/go.sum b/src/cmd/go.sum new file mode 100644 index 0000000000..4492808399 --- /dev/null +++ b/src/cmd/go.sum @@ -0,0 +1,13 @@ +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 h1:eqyIo2HjKhKe/mJzTG8n4VqvLXIOEG+SLdDqX7xGtkY= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 h1:pKqc8lAAA6rcwpvsephnRuZp4VHbfszZRClvqAE6Sq8= +github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 h1:Pn8fQdvx+z1avAi7fdM2kRYWQNxGlavNDSyzrQg2SsU= +golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 h1:Zw7eRv6INHGfu15LVRN1vrrwusJbnfJjAZn3D1VkQIE= +golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 h1:2oZsfYnKfYzL4I57uYiRFsUf0bqlLkiuw8nnj3+voUA= +golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= diff --git a/src/cmd/vendor/README b/src/cmd/vendor/README deleted file mode 100644 index 7eb97a1b9b..0000000000 --- a/src/cmd/vendor/README +++ /dev/null @@ -1,25 +0,0 @@ -How to update the vendored packages: - -Assuming the govendor tool is available -run the govendor tool from src/cmd directory - - $ go get -u github.com/kardianos/govendor - -To update packages used by cmd/pprof: - - $ cd $GOROOT/src/cmd - $ GOPATH=$GOROOT govendor fetch github.com/google/pprof/... - -To update packages used by internal/objfile/*: - - $ GOPATH=$GOROOT govendor fetch golang.org/x/arch/... - -GOPATH=$GOROOT in the above commands is a hack to -make govendor work and will create the .cache folder in -$GOROOT as a side-effect. Please make sure to delete -the directory and not to include the directory in the -commit by accident. - -The vendored copy of golang.org/x/tools is maintained by -running the update-xtools.sh script in this directory, -not by govendor. \ No newline at end of file diff --git a/src/cmd/vendor/github.com/google/pprof/AUTHORS b/src/cmd/vendor/github.com/google/pprof/AUTHORS new file mode 100644 index 0000000000..fd736cb1cf --- /dev/null +++ b/src/cmd/vendor/github.com/google/pprof/AUTHORS @@ -0,0 +1,7 @@ +# This is the official list of pprof authors for copyright purposes. +# This file is distinct from the CONTRIBUTORS files. +# See the latter for an explanation. +# Names should be added to this file as: +# Name or Organization +# The email address is not required for organizations. +Google Inc. \ No newline at end of file diff --git a/src/cmd/vendor/github.com/google/pprof/CONTRIBUTORS b/src/cmd/vendor/github.com/google/pprof/CONTRIBUTORS new file mode 100644 index 0000000000..0ef5e2f240 --- /dev/null +++ b/src/cmd/vendor/github.com/google/pprof/CONTRIBUTORS @@ -0,0 +1,15 @@ +# People who have agreed to one of the CLAs and can contribute patches. +# The AUTHORS file lists the copyright holders; this file +# lists people. For example, Google employees are listed here +# but not in AUTHORS, because Google holds the copyright. +# +# https://developers.google.com/open-source/cla/individual +# https://developers.google.com/open-source/cla/corporate +# +# Names should be added to this file as: +# Name +Raul Silvera +Tipp Moseley +Hyoun Kyu Cho +Martin Spier +Taco de Wolff diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils_test.go b/src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils_test.go deleted file mode 100644 index 17d4225a87..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils_test.go +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package binutils - -import ( - "bytes" - "fmt" - "math" - "path/filepath" - "reflect" - "regexp" - "runtime" - "strings" - "testing" - - "github.com/google/pprof/internal/plugin" -) - -var testAddrMap = map[int]string{ - 1000: "_Z3fooid.clone2", - 2000: "_ZNSaIiEC1Ev.clone18", - 3000: "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", -} - -func functionName(level int) (name string) { - if name = testAddrMap[level]; name != "" { - return name - } - return fmt.Sprintf("fun%d", level) -} - -func TestAddr2Liner(t *testing.T) { - const offset = 0x500 - - a := addr2Liner{rw: &mockAddr2liner{}, base: offset} - for i := 1; i < 8; i++ { - addr := i*0x1000 + offset - s, err := a.addrInfo(uint64(addr)) - if err != nil { - t.Fatalf("addrInfo(%#x): %v", addr, err) - } - if len(s) != i { - t.Fatalf("addrInfo(%#x): got len==%d, want %d", addr, len(s), i) - } - for l, f := range s { - level := (len(s) - l) * 1000 - want := plugin.Frame{Func: functionName(level), File: fmt.Sprintf("file%d", level), Line: level} - - if f != want { - t.Errorf("AddrInfo(%#x)[%d]: = %+v, want %+v", addr, l, f, want) - } - } - } - s, err := a.addrInfo(0xFFFF) - if err != nil { - t.Fatalf("addrInfo(0xFFFF): %v", err) - } - if len(s) != 0 { - t.Fatalf("AddrInfo(0xFFFF): got len==%d, want 0", len(s)) - } - a.rw.close() -} - -type mockAddr2liner struct { - output []string -} - -func (a *mockAddr2liner) write(s string) error { - var lines []string - switch s { - case "1000": - lines = []string{"_Z3fooid.clone2", "file1000:1000"} - case "2000": - lines = []string{"_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "3000": - lines = []string{"_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "4000": - lines = []string{"fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "5000": - lines = []string{"fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "6000": - lines = []string{"fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "7000": - lines = []string{"fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "8000": - lines = []string{"fun8000", "file8000:8000", "fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - case "9000": - lines = []string{"fun9000", "file9000:9000", "fun8000", "file8000:8000", "fun7000", "file7000:7000", "fun6000", "file6000:6000", "fun5000", "file5000:5000", "fun4000", "file4000:4000", "_ZNSt6vectorIS_IS_IiSaIiEESaIS1_EESaIS3_EEixEm", "file3000:3000", "_ZNSaIiEC1Ev.clone18", "file2000:2000", "_Z3fooid.clone2", "file1000:1000"} - default: - lines = []string{"??", "??:0"} - } - a.output = append(a.output, "0x"+s) - a.output = append(a.output, lines...) - return nil -} - -func (a *mockAddr2liner) readLine() (string, error) { - if len(a.output) == 0 { - return "", fmt.Errorf("end of file") - } - next := a.output[0] - a.output = a.output[1:] - return next, nil -} - -func (a *mockAddr2liner) close() { -} - -func TestAddr2LinerLookup(t *testing.T) { - const oddSizedData = ` -00001000 T 0x1000 -00002000 T 0x2000 -00003000 T 0x3000 -` - const evenSizedData = ` -0000000000001000 T 0x1000 -0000000000002000 T 0x2000 -0000000000003000 T 0x3000 -0000000000004000 T 0x4000 -` - for _, d := range []string{oddSizedData, evenSizedData} { - a, err := parseAddr2LinerNM(0, bytes.NewBufferString(d)) - if err != nil { - t.Errorf("nm parse error: %v", err) - continue - } - for address, want := range map[uint64]string{ - 0x1000: "0x1000", - 0x1001: "0x1000", - 0x1FFF: "0x1000", - 0x2000: "0x2000", - 0x2001: "0x2000", - } { - if got, _ := a.addrInfo(address); !checkAddress(got, address, want) { - t.Errorf("%x: got %v, want %s", address, got, want) - } - } - for _, unknown := range []uint64{0x0fff, 0x4001} { - if got, _ := a.addrInfo(unknown); got != nil { - t.Errorf("%x: got %v, want nil", unknown, got) - } - } - } -} - -func checkAddress(got []plugin.Frame, address uint64, want string) bool { - if len(got) != 1 { - return false - } - return got[0].Func == want -} - -func TestSetTools(t *testing.T) { - // Test that multiple calls work. - bu := &Binutils{} - bu.SetTools("") - bu.SetTools("") -} - -func TestSetFastSymbolization(t *testing.T) { - // Test that multiple calls work. - bu := &Binutils{} - bu.SetFastSymbolization(true) - bu.SetFastSymbolization(false) -} - -func skipUnlessLinuxAmd64(t *testing.T) { - if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { - t.Skip("This test only works on x86-64 Linux") - } -} - -func skipUnlessDarwinAmd64(t *testing.T) { - if runtime.GOOS != "darwin" || runtime.GOARCH != "amd64" { - t.Skip("This test only works on x86-64 Mac") - } -} - -func TestDisasm(t *testing.T) { - skipUnlessLinuxAmd64(t) - bu := &Binutils{} - insts, err := bu.Disasm(filepath.Join("testdata", "exe_linux_64"), 0, math.MaxUint64) - if err != nil { - t.Fatalf("Disasm: unexpected error %v", err) - } - mainCount := 0 - for _, x := range insts { - if x.Function == "main" { - mainCount++ - } - } - if mainCount == 0 { - t.Error("Disasm: found no main instructions") - } -} - -func findSymbol(syms []*plugin.Sym, name string) *plugin.Sym { - for _, s := range syms { - for _, n := range s.Name { - if n == name { - return s - } - } - } - return nil -} - -func TestObjFile(t *testing.T) { - skipUnlessLinuxAmd64(t) - for _, tc := range []struct { - desc string - start, limit, offset uint64 - addr uint64 - }{ - {"fake mapping", 0, math.MaxUint64, 0, 0x40052d}, - {"fixed load address", 0x400000, 0x4006fc, 0, 0x40052d}, - // True user-mode ASLR binaries are ET_DYN rather than ET_EXEC so this case - // is a bit artificial except that it approximates the - // vmlinux-with-kernel-ASLR case where the binary *is* ET_EXEC. - {"simulated ASLR address", 0x500000, 0x5006fc, 0, 0x50052d}, - } { - t.Run(tc.desc, func(t *testing.T) { - bu := &Binutils{} - f, err := bu.Open(filepath.Join("testdata", "exe_linux_64"), tc.start, tc.limit, tc.offset) - if err != nil { - t.Fatalf("Open: unexpected error %v", err) - } - defer f.Close() - syms, err := f.Symbols(regexp.MustCompile("main"), 0) - if err != nil { - t.Fatalf("Symbols: unexpected error %v", err) - } - - m := findSymbol(syms, "main") - if m == nil { - t.Fatalf("Symbols: did not find main") - } - for _, addr := range []uint64{m.Start + f.Base(), tc.addr} { - gotFrames, err := f.SourceLine(addr) - if err != nil { - t.Fatalf("SourceLine: unexpected error %v", err) - } - wantFrames := []plugin.Frame{ - {Func: "main", File: "/tmp/hello.c", Line: 3}, - } - if !reflect.DeepEqual(gotFrames, wantFrames) { - t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, wantFrames) - } - } - }) - } -} - -func TestMachoFiles(t *testing.T) { - skipUnlessDarwinAmd64(t) - - // Load `file`, pretending it was mapped at `start`. Then get the symbol - // table. Check that it contains the symbol `sym` and that the address - // `addr` gives the `expected` stack trace. - for _, tc := range []struct { - desc string - file string - start, limit, offset uint64 - addr uint64 - sym string - expected []plugin.Frame - }{ - {"normal mapping", "exe_mac_64", 0x100000000, math.MaxUint64, 0, - 0x100000f50, "_main", - []plugin.Frame{ - {Func: "main", File: "/tmp/hello.c", Line: 3}, - }}, - {"other mapping", "exe_mac_64", 0x200000000, math.MaxUint64, 0, - 0x200000f50, "_main", - []plugin.Frame{ - {Func: "main", File: "/tmp/hello.c", Line: 3}, - }}, - {"lib normal mapping", "lib_mac_64", 0, math.MaxUint64, 0, - 0xfa0, "_bar", - []plugin.Frame{ - {Func: "bar", File: "/tmp/lib.c", Line: 5}, - }}, - } { - t.Run(tc.desc, func(t *testing.T) { - bu := &Binutils{} - f, err := bu.Open(filepath.Join("testdata", tc.file), tc.start, tc.limit, tc.offset) - if err != nil { - t.Fatalf("Open: unexpected error %v", err) - } - t.Logf("binutils: %v", bu) - if runtime.GOOS == "darwin" && !bu.rep.addr2lineFound && !bu.rep.llvmSymbolizerFound { - // On OSX user needs to install gaddr2line or llvm-symbolizer with - // Homebrew, skip the test when the environment doesn't have it - // installed. - t.Skip("couldn't find addr2line or gaddr2line") - } - defer f.Close() - syms, err := f.Symbols(nil, 0) - if err != nil { - t.Fatalf("Symbols: unexpected error %v", err) - } - - m := findSymbol(syms, tc.sym) - if m == nil { - t.Fatalf("Symbols: could not find symbol %v", tc.sym) - } - gotFrames, err := f.SourceLine(tc.addr) - if err != nil { - t.Fatalf("SourceLine: unexpected error %v", err) - } - if !reflect.DeepEqual(gotFrames, tc.expected) { - t.Fatalf("SourceLine for main: got %v; want %v\n", gotFrames, tc.expected) - } - }) - } -} - -func TestLLVMSymbolizer(t *testing.T) { - if runtime.GOOS != "linux" { - t.Skip("testtdata/llvm-symbolizer has only been tested on linux") - } - - cmd := filepath.Join("testdata", "fake-llvm-symbolizer") - symbolizer, err := newLLVMSymbolizer(cmd, "foo", 0) - if err != nil { - t.Fatalf("newLLVMSymbolizer: unexpected error %v", err) - } - defer symbolizer.rw.close() - - for _, c := range []struct { - addr uint64 - frames []plugin.Frame - }{ - {0x10, []plugin.Frame{ - {Func: "Inlined_0x10", File: "foo.h", Line: 0}, - {Func: "Func_0x10", File: "foo.c", Line: 2}, - }}, - {0x20, []plugin.Frame{ - {Func: "Inlined_0x20", File: "foo.h", Line: 0}, - {Func: "Func_0x20", File: "foo.c", Line: 2}, - }}, - } { - frames, err := symbolizer.addrInfo(c.addr) - if err != nil { - t.Errorf("LLVM: unexpected error %v", err) - continue - } - if !reflect.DeepEqual(frames, c.frames) { - t.Errorf("LLVM: expect %v; got %v\n", c.frames, frames) - } - } -} - -func TestOpenMalformedELF(t *testing.T) { - // Test that opening a malformed ELF file will report an error containing - // the word "ELF". - bu := &Binutils{} - _, err := bu.Open(filepath.Join("testdata", "malformed_elf"), 0, 0, 0) - if err == nil { - t.Fatalf("Open: unexpected success") - } - - if !strings.Contains(err.Error(), "ELF") { - t.Errorf("Open: got %v, want error containing 'ELF'", err) - } -} - -func TestOpenMalformedMachO(t *testing.T) { - // Test that opening a malformed Mach-O file will report an error containing - // the word "Mach-O". - bu := &Binutils{} - _, err := bu.Open(filepath.Join("testdata", "malformed_macho"), 0, 0, 0) - if err == nil { - t.Fatalf("Open: unexpected success") - } - - if !strings.Contains(err.Error(), "Mach-O") { - t.Errorf("Open: got %v, want error containing 'Mach-O'", err) - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go b/src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go deleted file mode 100644 index 3563198f48..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package binutils - -import ( - "fmt" - "regexp" - "testing" - - "github.com/google/pprof/internal/plugin" -) - -// TestFindSymbols tests the FindSymbols routine using a hardcoded nm output. -func TestFindSymbols(t *testing.T) { - type testcase struct { - query, syms string - want []plugin.Sym - } - - testsyms := `0000000000001000 t lineA001 -0000000000001000 t lineA002 -0000000000001000 t line1000 -0000000000002000 t line200A -0000000000002000 t line2000 -0000000000002000 t line200B -0000000000003000 t line3000 -0000000000003000 t _ZNK4DumbclEPKc -0000000000003000 t lineB00C -0000000000003000 t line300D -0000000000004000 t _the_end - ` - testcases := []testcase{ - { - "line.*[AC]", - testsyms, - []plugin.Sym{ - {Name: []string{"lineA001"}, File: "object.o", Start: 0x1000, End: 0x1FFF}, - {Name: []string{"line200A"}, File: "object.o", Start: 0x2000, End: 0x2FFF}, - {Name: []string{"lineB00C"}, File: "object.o", Start: 0x3000, End: 0x3FFF}, - }, - }, - { - "Dumb::operator", - testsyms, - []plugin.Sym{ - {Name: []string{"Dumb::operator()(char const*) const"}, File: "object.o", Start: 0x3000, End: 0x3FFF}, - }, - }, - } - - for _, tc := range testcases { - syms, err := findSymbols([]byte(tc.syms), "object.o", regexp.MustCompile(tc.query), 0) - if err != nil { - t.Fatalf("%q: findSymbols: %v", tc.query, err) - } - if err := checkSymbol(syms, tc.want); err != nil { - t.Errorf("%q: %v", tc.query, err) - } - } -} - -func checkSymbol(got []*plugin.Sym, want []plugin.Sym) error { - if len(got) != len(want) { - return fmt.Errorf("unexpected number of symbols %d (want %d)", len(got), len(want)) - } - - for i, g := range got { - w := want[i] - if len(g.Name) != len(w.Name) { - return fmt.Errorf("names, got %d, want %d", len(g.Name), len(w.Name)) - } - for n := range g.Name { - if g.Name[n] != w.Name[n] { - return fmt.Errorf("name %d, got %q, want %q", n, g.Name[n], w.Name[n]) - } - } - if g.File != w.File { - return fmt.Errorf("filename, got %q, want %q", g.File, w.File) - } - if g.Start != w.Start { - return fmt.Errorf("start address, got %#x, want %#x", g.Start, w.Start) - } - if g.End != w.End { - return fmt.Errorf("end address, got %#x, want %#x", g.End, w.End) - } - } - return nil -} - -// TestFunctionAssembly tests the FunctionAssembly routine by using a -// fake objdump script. -func TestFunctionAssembly(t *testing.T) { - type testcase struct { - s plugin.Sym - asm string - want []plugin.Inst - } - testcases := []testcase{ - { - plugin.Sym{Name: []string{"symbol1"}, Start: 0x1000, End: 0x1FFF}, - ` 1000: instruction one - 1001: instruction two - 1002: instruction three - 1003: instruction four -`, - []plugin.Inst{ - {Addr: 0x1000, Text: "instruction one"}, - {Addr: 0x1001, Text: "instruction two"}, - {Addr: 0x1002, Text: "instruction three"}, - {Addr: 0x1003, Text: "instruction four"}, - }, - }, - { - plugin.Sym{Name: []string{"symbol2"}, Start: 0x2000, End: 0x2FFF}, - ` 2000: instruction one - 2001: instruction two -`, - []plugin.Inst{ - {Addr: 0x2000, Text: "instruction one"}, - {Addr: 0x2001, Text: "instruction two"}, - }, - }, - } - - for _, tc := range testcases { - insts, err := disassemble([]byte(tc.asm)) - if err != nil { - t.Fatalf("FunctionAssembly: %v", err) - } - - if len(insts) != len(tc.want) { - t.Errorf("Unexpected number of assembly instructions %d (want %d)\n", len(insts), len(tc.want)) - } - for i := range insts { - if insts[i] != tc.want[i] { - t.Errorf("Expected symbol %v, got %v\n", tc.want[i], insts[i]) - } - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh deleted file mode 100755 index 5ec98f39b5..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -x - -# This is a script that generates the test MacOS executables in this directory. -# It should be needed very rarely to run this script. It is mostly provided -# as a future reference on how the original binary set was created. - -set -o errexit - -cat </tmp/hello.cc -#include - -int main() { - printf("Hello, world!\n"); - return 0; -} -EOF - -cat </tmp/lib.c -int foo() { - return 1; -} - -int bar() { - return 2; -} -EOF - -cd $(dirname $0) -rm -rf exe_mac_64* lib_mac_64* -clang -g -o exe_mac_64 /tmp/hello.c -clang -g -o lib_mac_64 -dynamiclib /tmp/lib.c diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_linux_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_linux_64 deleted file mode 100755 index d86dc7cdfca8275e13d6ff5c3f2f6568eb935a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9503 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 X1uf+W@pXm;B*>?**hcXuIP4ezIthTS diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 deleted file mode 100755 index dba1ae15817595eb443322f6ae4ce9e67e400b90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8648 zcmX^A>+L^w1_nlE28ISE1_lOx1_p)=EDQ{-3lZ*3V}SD685kH?p%|nhKE5Qiq6EZ(;P`k{^8)x8 z7(nJ}L8KW#d=@AhOtCODfN3ZZA75Njnp6zsVY;shY91R@1&j~nGH^i6gULh8i_b{S zDM&2>ha0N<8ldJ$K@9-$LE#SNGB7~RgYo0zlZ#7=GV{`*0_gso1vL*8Zy+TgK8S{4 z6tltZDa|X-%u9*S%uCA$^HJTm25KHC&Ov5?_~>SU#9ps@dYJC4Ds>U&4U>OG6$p|Y&HV}11S8# z_CW>W<8u=6nI|9sNhcgo^&md7c`)}ur5Ql}1cga_ypN}!x2uaMEDb9_%mKLvtQL}O z7*0SP12PB71WPM1Ff00$j|fdT^qNF6AAK=K(13=BLB z3=9^E3=9((7#O%27#ISedcfvD!;%Y1L!~e%4Mk8A!w_cRV_*R1c#s|XrNu@1IhjfN zDU~@XP^Hog5O)S#KBHvpV86e6(X5>RhF+X1kf>&0;N=2iP`-o55d#B*1_MI_$o-&v z2sH{!f$Xt>nhEkF1H%&*P)Ne<&dE#)t}HG|&DC?#OR3DsOag0TP=nf+01ZD)C?6C) z5EY~3Xb6mkz-S1JhQMeDjE2By2#kinXb8|R1VTMJpL#UE5%B1>wPs*oIPUrfWcLP! z7rYD%42CB=U4L|*@Mu0F5PSH)DySXr(<|G^z`)=b{9m<@fq`K{21xnKXaE2I_ejmj z$=6XR&o9bJQ3N&X!TnkpkURqe12PS2KZDxWCJYP=AY2XY41(C8J`E28BZB}~H&`=r zcLXeeOiY0G|B%H-*`pya8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OLpuZn zl>`DoJ`i*OP4q=Dxh85rXkSQ(h&b2H*o zD^in7OH$)AQWHVS6>}3a^B7b?gAvRO7vw;OGBCgyrVI=Wu(?E#6lib+neWWNz>vnw z$nfV$a}-D(G)SSx$N-+d2eF$O7#LKL_#iRR+#_hd5vJack%0l3p8`?@l7!BQ@-sqa zCPBhtptTN2=7Gjj7(o+|Q1u|Qk@=tj7|@(60|SEth^@d7k0lJ^!C?RkFN_e?FUc*? zXUG5z?C2#k=$9oH>8IuAq@)%V>t`G2=Vn`47*!e<8zm(fmc^Ik8CO^o=T?|z7#Nrp a8JO#b=z}%t8k(7z7#Zv3Ge9hZx)%Wd#M-F< diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist deleted file mode 100644 index 41ce537f5d..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.exe_mac_64 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 deleted file mode 100644 index 2cb0e3bf31e384571a684c72d0b942ba195c969c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8840 zcmX^A>+L^w1_nlE1_lN$1_lOp1_lNT5WxTe(hLj?5)2Fs0hiAx89UhT?_M-3=f9yB zClgehL4bh)#8wbsV31*8V31^BVDMmIV2F|;e0*_9X;Lwm4I9z?g47~#xS_hQ0cxHU z%m4;Rc*D6+^I-h=_~hb}qRhN>r~tbAWbJiO1=t)H#}G%52owuI;sKPNpdu&~C|*Hn6lQjOd|pm`ab<2& zeolNrNfASQJa+StlL<&a%urDHBgad8d`==h^8}#of#AY!wP8rggVd$su5%kvb#X$>|h4v1D9~eAUCKg1_lNLG;yy9VVHRZrAc{-xv9nI=D9%K2P!{6 z`dx@OucWd7)4X`7d9ZvCPo#N?MTvRosl}l5ff9a|Q1c8xj$>e8s3g)nXg0twZza?` zZ>V`Ii8L=UDXA#63^RVeK+Q9On)iiB^NLGAr3j{Z8itVc(hD_DLlMfrLB+=>78K;9 z#)Bgll3!86Z!6S1Si0Rxig^Wz$>{0jBh)+PJ)wYA_B8 z=HL9JtYnZ9boZq|&4alwg@Ab=Ge+@f2#kinXb6mkz-S1JhQMeD48{-ubr<*D~I6Eev2`U=(CjUwIVSuML#`Xzqlw_KRvS~qclk`IX_oFJwHD^ zCsn_opeR30KQpf+wJ0w!M?Wbuue2mHr&zxvwYVfDu_TcJ9IBx3^9XkIfW{IyUU;A( z0TBaDZ8I=r)z7K{g)!Ls3=9mQzyK*j)(hgJ>;3=#|9@mPATvP=KtO6i;m^px#=y+L z%D~FN&A`S0vCE*LgWH0EfdLf0AoZZYR$*XRqG1I#9oaaLF+L^w1_nlE1_lN;1_lNm1_p)(CI*I91_1^TkYr$Bc)`HH5Fa1n8W92#LBkMb z2tg>Hoq>UYm4ShQ2`UpGUy@o;0_9*aZvsC=P8vcnfcPv>Hke{zXaLhtB0jz}uRJp^ zB|bAREgy?{YoO+NK-GizFt6Fv4BQM13;|FRKye4cAb;|q*$-7hkOGB2$eu~3W!!ZO%vg3ldv8DK{&ocw z2B_D0xfmFDxfrxye5i>ado7^;2HDTR@Pq{v0{W%JMfy3JNgy0tSzMButLLPbQkj#P z1ktDlHAg{!fq{d8fk6|>2l*4CVw4;Wfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4T0eq z0-+wAPj`SijsnYKx|OIo`->v zK>*Pk1(^<#hG52c237{9wETPq!KB0@1~F!a3Gxig3=8BT(i7w%9bj1o28I-f5SUa( zovg597o1gZjT9^Fe%&eq??MNDw3m?LYG~GBCjOgZk|tJ}BHkN5f2KOl**ix_~Me%r1+%Fyp+@;2K|!U0)2*@%p|>J2K}0*WAd$!oWl?p8;$>*e0mG E07)NqLI3~& diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist deleted file mode 100644 index 409e4cf0c9..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.lib_mac_64 - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 deleted file mode 100644 index e466c1342e3f5be57c4aa21e2745bcdd21b1e817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8934 zcmX^A>+L^w1_nlE1_lN$1_lOJ1_lNR5WxTe(jYzq1H+`#GVZzsW-L3Oy|xQsOi7((O9ctV$744y6eJ14Q1d`cY&bq1VqQUMQeI+i zYB9Qbp-}xwP|Ywtl#4+jnO9O-fN5Si)I2GuP8c7`#h_s3B^D*-rKc7%pu2A()I0~M zP8c7`#h_s3L6ZlDc^9GPr9gGU_)sne1v4)(DXA#63=}`8@nNb6(P9Fj7+`!T7lVSC zS6osAmP7Y%Ce*w>uq*=uj1T2vQ1S7J1qC^&@!-e>=Lb~xeTSMC0o4iPL%A3fig^Wz z$>{F$hb9yis7@Fk%Eh2y=7AFn7WWlH&GU!qgz=$V3<_pmeo|I4ND|$BhoI)c+y~=> z)Q;lO5Eu=C(GVC7fzc2c4S~@R7!85Z5Ew2Y0P0TiGcqtNfcAeu{YnrY*1u+8h)+r^ zVu(-62lbkVi?2uhF&YA+Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0wXH~0>Sg# zpvgW)#@~Fr42+D7py_Ew1_nm`lH39YhMdeKy<`TE7y~C0Y*c`em6>ZI6B7d?BLgQB zZ0JA?E+_{!6cmu4=~68Q1_sdZfinXG186J(Brb-cB8Gv1Au|s$+iwGx;Q%RQfLRHf z=!V$_ig#a92pYSl~LS-!&7~rOXmJPst12T#+tcihvfsqm96u6Hd5^W#} zR*(d97ig6N3j?Ddqbi>;D>I*fxHO+2qYxVd1Ct&Dh~Xf?%xA@I&Fv{{FUi2btir&| zXUEMAGKawtG~cS=;}hnqP?lO$oSC1eV5w)IXP}^woRgTBu4`#vpl6_GY^i6Y$p8v^ zeMrdbhZd(673(J^=A>36=B4PT=j#_2CF`eWmSmJB=_Tjq>Zj-Dr{|>V7Zeobr|Dm!uY#q$HLkg5v-b{-BWd2zK-U#VKg`2ZTXOH$cGz5@Tdw z12MsIzAK@FyR*218x(e+ .. pairs from its input -func removeScripts(in []byte) []byte { - beginMarker := []byte("") - - if begin := bytes.Index(in, beginMarker); begin > 0 { - if end := bytes.Index(in[begin:], endMarker); end > 0 { - in = append(in[:begin], removeScripts(in[begin+end+len(endMarker):])...) - } - } - return in -} - -// addFlags parses flag descriptions and adds them to the testFlags -func addFlags(f *testFlags, flags []string) { - for _, flag := range flags { - fields := strings.SplitN(flag, "=", 2) - switch len(fields) { - case 1: - f.bools[fields[0]] = true - case 2: - if i, err := strconv.Atoi(fields[1]); err == nil { - f.ints[fields[0]] = i - } else { - f.strings[fields[0]] = fields[1] - } - } - } -} - -func testSourceURL(port int) string { - return fmt.Sprintf("http://%s/", net.JoinHostPort(testSourceAddress, strconv.Itoa(port))) -} - -// solutionFilename returns the name of the solution file for the test -func solutionFilename(source string, f *testFlags) string { - name := []string{"pprof", strings.TrimPrefix(source, testSourceURL(8000))} - name = addString(name, f, []string{"flat", "cum"}) - name = addString(name, f, []string{"functions", "filefunctions", "files", "lines", "addresses"}) - name = addString(name, f, []string{"noinlines"}) - name = addString(name, f, []string{"inuse_space", "inuse_objects", "alloc_space", "alloc_objects"}) - name = addString(name, f, []string{"relative_percentages"}) - name = addString(name, f, []string{"seconds"}) - name = addString(name, f, []string{"call_tree"}) - name = addString(name, f, []string{"text", "tree", "callgrind", "dot", "svg", "tags", "dot", "traces", "disasm", "peek", "weblist", "topproto", "comments"}) - if f.strings["focus"] != "" || f.strings["tagfocus"] != "" { - name = append(name, "focus") - } - if f.strings["ignore"] != "" || f.strings["tagignore"] != "" { - name = append(name, "ignore") - } - if f.strings["show_from"] != "" { - name = append(name, "show_from") - } - name = addString(name, f, []string{"hide", "show"}) - if f.strings["unit"] != "minimum" { - name = addString(name, f, []string{"unit"}) - } - return strings.Join(name, ".") -} - -func addString(name []string, f *testFlags, components []string) []string { - for _, c := range components { - if f.bools[c] || f.strings[c] != "" || f.ints[c] != 0 { - return append(name, c) - } - } - return name -} - -// testFlags implements the plugin.FlagSet interface. -type testFlags struct { - bools map[string]bool - ints map[string]int - floats map[string]float64 - strings map[string]string - args []string - stringLists map[string][]string -} - -func (testFlags) ExtraUsage() string { return "" } - -func (testFlags) AddExtraUsage(eu string) {} - -func (f testFlags) Bool(s string, d bool, c string) *bool { - if b, ok := f.bools[s]; ok { - return &b - } - return &d -} - -func (f testFlags) Int(s string, d int, c string) *int { - if i, ok := f.ints[s]; ok { - return &i - } - return &d -} - -func (f testFlags) Float64(s string, d float64, c string) *float64 { - if g, ok := f.floats[s]; ok { - return &g - } - return &d -} - -func (f testFlags) String(s, d, c string) *string { - if t, ok := f.strings[s]; ok { - return &t - } - return &d -} - -func (f testFlags) BoolVar(p *bool, s string, d bool, c string) { - if b, ok := f.bools[s]; ok { - *p = b - } else { - *p = d - } -} - -func (f testFlags) IntVar(p *int, s string, d int, c string) { - if i, ok := f.ints[s]; ok { - *p = i - } else { - *p = d - } -} - -func (f testFlags) Float64Var(p *float64, s string, d float64, c string) { - if g, ok := f.floats[s]; ok { - *p = g - } else { - *p = d - } -} - -func (f testFlags) StringVar(p *string, s, d, c string) { - if t, ok := f.strings[s]; ok { - *p = t - } else { - *p = d - } -} - -func (f testFlags) StringList(s, d, c string) *[]*string { - if t, ok := f.stringLists[s]; ok { - // convert slice of strings to slice of string pointers before returning. - tp := make([]*string, len(t)) - for i, v := range t { - tp[i] = &v - } - return &tp - } - return &[]*string{} -} - -func (f testFlags) Parse(func()) []string { - return f.args -} - -func baseFlags() testFlags { - return testFlags{ - bools: map[string]bool{ - "proto": true, - "trim": true, - "compact_labels": true, - }, - ints: map[string]int{ - "nodecount": 20, - }, - floats: map[string]float64{ - "nodefraction": 0.05, - "edgefraction": 0.01, - "divide_by": 1.0, - }, - strings: map[string]string{ - "unit": "minimum", - }, - } -} - -const testStart = 0x1000 -const testOffset = 0x5000 - -type testFetcher struct{} - -func (testFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) { - var p *profile.Profile - switch s { - case "cpu", "unknown": - p = cpuProfile() - case "cpusmall": - p = cpuProfileSmall() - case "heap": - p = heapProfile() - case "heap_alloc": - p = heapProfile() - p.SampleType = []*profile.ValueType{ - {Type: "alloc_objects", Unit: "count"}, - {Type: "alloc_space", Unit: "bytes"}, - } - case "heap_request": - p = heapProfile() - for _, s := range p.Sample { - s.NumLabel["request"] = s.NumLabel["bytes"] - } - case "heap_sizetags": - p = heapProfile() - tags := []int64{2, 4, 8, 16, 32, 64, 128, 256} - for _, s := range p.Sample { - numValues := append(s.NumLabel["bytes"], tags...) - s.NumLabel["bytes"] = numValues - } - case "heap_tags": - p = heapProfile() - for i := 0; i < len(p.Sample); i += 2 { - s := p.Sample[i] - if s.Label == nil { - s.Label = make(map[string][]string) - } - s.NumLabel["request"] = s.NumLabel["bytes"] - s.Label["key1"] = []string{"tag"} - } - case "contention": - p = contentionProfile() - case "symbolz": - p = symzProfile() - case "longNameFuncs": - p = longNameFuncsProfile() - default: - return nil, "", fmt.Errorf("unexpected source: %s", s) - } - return p, testSourceURL(8000) + s, nil -} - -type testSymbolizer struct{} - -func (testSymbolizer) Symbolize(_ string, _ plugin.MappingSources, _ *profile.Profile) error { - return nil -} - -type testSymbolizeDemangler struct{} - -func (testSymbolizeDemangler) Symbolize(_ string, _ plugin.MappingSources, p *profile.Profile) error { - for _, fn := range p.Function { - if fn.Name == "" || fn.SystemName == fn.Name { - fn.Name = fakeDemangler(fn.SystemName) - } - } - return nil -} - -func testFetchSymbols(source, post string) ([]byte, error) { - var buf bytes.Buffer - - switch source { - case testSourceURL(8000) + "symbolz": - for _, address := range strings.Split(post, "+") { - a, _ := strconv.ParseInt(address, 0, 64) - fmt.Fprintf(&buf, "%v\t", address) - if a-testStart > testOffset { - fmt.Fprintf(&buf, "wrong_source_%v_", address) - continue - } - fmt.Fprintf(&buf, "%#x\n", a-testStart) - } - return buf.Bytes(), nil - case testSourceURL(8001) + "symbolz": - for _, address := range strings.Split(post, "+") { - a, _ := strconv.ParseInt(address, 0, 64) - fmt.Fprintf(&buf, "%v\t", address) - if a-testStart < testOffset { - fmt.Fprintf(&buf, "wrong_source_%v_", address) - continue - } - fmt.Fprintf(&buf, "%#x\n", a-testStart-testOffset) - } - return buf.Bytes(), nil - default: - return nil, fmt.Errorf("unexpected source: %s", source) - } -} - -type testSymbolzSymbolizer struct{} - -func (testSymbolzSymbolizer) Symbolize(variables string, sources plugin.MappingSources, p *profile.Profile) error { - return symbolz.Symbolize(p, false, sources, testFetchSymbols, nil) -} - -func fakeDemangler(name string) string { - switch name { - case "mangled1000": - return "line1000" - case "mangled2000": - return "line2000" - case "mangled2001": - return "line2001" - case "mangled3000": - return "line3000" - case "mangled3001": - return "line3001" - case "mangled3002": - return "line3002" - case "mangledNEW": - return "operator new" - case "mangledMALLOC": - return "malloc" - default: - return name - } -} - -// Returns a profile with function names which should be shortened in -// graph and flame views. -func longNameFuncsProfile() *profile.Profile { - var longNameFuncsM = []*profile.Mapping{ - { - ID: 1, - Start: 0x1000, - Limit: 0x4000, - File: "/path/to/testbinary", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - } - - var longNameFuncsF = []*profile.Function{ - {ID: 1, Name: "path/to/package1.object.function1", SystemName: "path/to/package1.object.function1", Filename: "path/to/package1.go"}, - {ID: 2, Name: "(anonymous namespace)::Bar::Foo", SystemName: "(anonymous namespace)::Bar::Foo", Filename: "a/long/path/to/package2.cc"}, - {ID: 3, Name: "java.bar.foo.FooBar.run(java.lang.Runnable)", SystemName: "java.bar.foo.FooBar.run(java.lang.Runnable)", Filename: "FooBar.java"}, - } - - var longNameFuncsL = []*profile.Location{ - { - ID: 1000, - Mapping: longNameFuncsM[0], - Address: 0x1000, - Line: []profile.Line{ - {Function: longNameFuncsF[0], Line: 1}, - }, - }, - { - ID: 2000, - Mapping: longNameFuncsM[0], - Address: 0x2000, - Line: []profile.Line{ - {Function: longNameFuncsF[1], Line: 4}, - }, - }, - { - ID: 3000, - Mapping: longNameFuncsM[0], - Address: 0x3000, - Line: []profile.Line{ - {Function: longNameFuncsF[2], Line: 9}, - }, - }, - } - - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{longNameFuncsL[0], longNameFuncsL[1], longNameFuncsL[2]}, - Value: []int64{1000, 1000}, - }, - { - Location: []*profile.Location{longNameFuncsL[0], longNameFuncsL[1]}, - Value: []int64{100, 100}, - }, - { - Location: []*profile.Location{longNameFuncsL[2]}, - Value: []int64{10, 10}, - }, - }, - Location: longNameFuncsL, - Function: longNameFuncsF, - Mapping: longNameFuncsM, - } -} - -func cpuProfile() *profile.Profile { - var cpuM = []*profile.Mapping{ - { - ID: 1, - Start: 0x1000, - Limit: 0x4000, - File: "/path/to/testbinary", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - } - - var cpuF = []*profile.Function{ - {ID: 1, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, - {ID: 2, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, - {ID: 3, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, - {ID: 4, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, - {ID: 5, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, - {ID: 6, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, - } - - var cpuL = []*profile.Location{ - { - ID: 1000, - Mapping: cpuM[0], - Address: 0x1000, - Line: []profile.Line{ - {Function: cpuF[0], Line: 1}, - }, - }, - { - ID: 2000, - Mapping: cpuM[0], - Address: 0x2000, - Line: []profile.Line{ - {Function: cpuF[2], Line: 9}, - {Function: cpuF[1], Line: 4}, - }, - }, - { - ID: 3000, - Mapping: cpuM[0], - Address: 0x3000, - Line: []profile.Line{ - {Function: cpuF[5], Line: 2}, - {Function: cpuF[4], Line: 5}, - {Function: cpuF[3], Line: 6}, - }, - }, - { - ID: 3001, - Mapping: cpuM[0], - Address: 0x3001, - Line: []profile.Line{ - {Function: cpuF[4], Line: 8}, - {Function: cpuF[3], Line: 9}, - }, - }, - { - ID: 3002, - Mapping: cpuM[0], - Address: 0x3002, - Line: []profile.Line{ - {Function: cpuF[5], Line: 5}, - {Function: cpuF[3], Line: 9}, - }, - }, - } - - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]}, - Value: []int64{1000, 1000}, - Label: map[string][]string{ - "key1": {"tag1"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*profile.Location{cpuL[0], cpuL[3]}, - Value: []int64{100, 100}, - Label: map[string][]string{ - "key1": {"tag2"}, - "key3": {"tag2"}, - }, - }, - { - Location: []*profile.Location{cpuL[1], cpuL[4]}, - Value: []int64{10, 10}, - Label: map[string][]string{ - "key1": {"tag3"}, - "key2": {"tag2"}, - }, - }, - { - Location: []*profile.Location{cpuL[2]}, - Value: []int64{10, 10}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, - } -} - -func cpuProfileSmall() *profile.Profile { - var cpuM = []*profile.Mapping{ - { - ID: 1, - Start: 0x1000, - Limit: 0x4000, - File: "/path/to/testbinary", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - } - - var cpuL = []*profile.Location{ - { - ID: 1000, - Mapping: cpuM[0], - Address: 0x1000, - }, - { - ID: 2000, - Mapping: cpuM[0], - Address: 0x2000, - }, - { - ID: 3000, - Mapping: cpuM[0], - Address: 0x3000, - }, - { - ID: 4000, - Mapping: cpuM[0], - Address: 0x4000, - }, - { - ID: 5000, - Mapping: cpuM[0], - Address: 0x5000, - }, - } - - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]}, - Value: []int64{1000, 1000}, - }, - { - Location: []*profile.Location{cpuL[3], cpuL[1], cpuL[4]}, - Value: []int64{1000, 1000}, - }, - { - Location: []*profile.Location{cpuL[2]}, - Value: []int64{1000, 1000}, - }, - { - Location: []*profile.Location{cpuL[4]}, - Value: []int64{1000, 1000}, - }, - }, - Location: cpuL, - Function: nil, - Mapping: cpuM, - } -} - -func heapProfile() *profile.Profile { - var heapM = []*profile.Mapping{ - { - ID: 1, - BuildID: "buildid", - Start: 0x1000, - Limit: 0x4000, - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - } - - var heapF = []*profile.Function{ - {ID: 1, Name: "pruneme", SystemName: "pruneme", Filename: "prune.h"}, - {ID: 2, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, - {ID: 3, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, - {ID: 4, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, - {ID: 5, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, - {ID: 6, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, - {ID: 7, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, - {ID: 8, Name: "mangledMALLOC", SystemName: "mangledMALLOC", Filename: "malloc.h"}, - {ID: 9, Name: "mangledNEW", SystemName: "mangledNEW", Filename: "new.h"}, - } - - var heapL = []*profile.Location{ - { - ID: 1000, - Mapping: heapM[0], - Address: 0x1000, - Line: []profile.Line{ - {Function: heapF[0], Line: 100}, - {Function: heapF[7], Line: 100}, - {Function: heapF[1], Line: 1}, - }, - }, - { - ID: 2000, - Mapping: heapM[0], - Address: 0x2000, - Line: []profile.Line{ - {Function: heapF[8], Line: 100}, - {Function: heapF[3], Line: 2}, - {Function: heapF[2], Line: 3}, - }, - }, - { - ID: 3000, - Mapping: heapM[0], - Address: 0x3000, - Line: []profile.Line{ - {Function: heapF[8], Line: 100}, - {Function: heapF[6], Line: 3}, - {Function: heapF[5], Line: 2}, - {Function: heapF[4], Line: 4}, - }, - }, - { - ID: 3001, - Mapping: heapM[0], - Address: 0x3001, - Line: []profile.Line{ - {Function: heapF[0], Line: 100}, - {Function: heapF[8], Line: 100}, - {Function: heapF[5], Line: 2}, - {Function: heapF[4], Line: 4}, - }, - }, - { - ID: 3002, - Mapping: heapM[0], - Address: 0x3002, - Line: []profile.Line{ - {Function: heapF[6], Line: 3}, - {Function: heapF[4], Line: 4}, - }, - }, - } - - return &profile.Profile{ - Comments: []string{"comment", "#hidden comment"}, - PeriodType: &profile.ValueType{Type: "allocations", Unit: "bytes"}, - Period: 524288, - SampleType: []*profile.ValueType{ - {Type: "inuse_objects", Unit: "count"}, - {Type: "inuse_space", Unit: "bytes"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{heapL[0], heapL[1], heapL[2]}, - Value: []int64{10, 1024000}, - NumLabel: map[string][]int64{"bytes": {102400}}, - }, - { - Location: []*profile.Location{heapL[0], heapL[3]}, - Value: []int64{20, 4096000}, - NumLabel: map[string][]int64{"bytes": {204800}}, - }, - { - Location: []*profile.Location{heapL[1], heapL[4]}, - Value: []int64{40, 65536000}, - NumLabel: map[string][]int64{"bytes": {1638400}}, - }, - { - Location: []*profile.Location{heapL[2]}, - Value: []int64{80, 32768000}, - NumLabel: map[string][]int64{"bytes": {409600}}, - }, - }, - DropFrames: ".*operator new.*|malloc", - Location: heapL, - Function: heapF, - Mapping: heapM, - } -} - -func contentionProfile() *profile.Profile { - var contentionM = []*profile.Mapping{ - { - ID: 1, - BuildID: "buildid-contention", - Start: 0x1000, - Limit: 0x4000, - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - } - - var contentionF = []*profile.Function{ - {ID: 1, Name: "mangled1000", SystemName: "mangled1000", Filename: "testdata/file1000.src"}, - {ID: 2, Name: "mangled2000", SystemName: "mangled2000", Filename: "testdata/file2000.src"}, - {ID: 3, Name: "mangled2001", SystemName: "mangled2001", Filename: "testdata/file2000.src"}, - {ID: 4, Name: "mangled3000", SystemName: "mangled3000", Filename: "testdata/file3000.src"}, - {ID: 5, Name: "mangled3001", SystemName: "mangled3001", Filename: "testdata/file3000.src"}, - {ID: 6, Name: "mangled3002", SystemName: "mangled3002", Filename: "testdata/file3000.src"}, - } - - var contentionL = []*profile.Location{ - { - ID: 1000, - Mapping: contentionM[0], - Address: 0x1000, - Line: []profile.Line{ - {Function: contentionF[0], Line: 1}, - }, - }, - { - ID: 2000, - Mapping: contentionM[0], - Address: 0x2000, - Line: []profile.Line{ - {Function: contentionF[2], Line: 2}, - {Function: contentionF[1], Line: 3}, - }, - }, - { - ID: 3000, - Mapping: contentionM[0], - Address: 0x3000, - Line: []profile.Line{ - {Function: contentionF[5], Line: 2}, - {Function: contentionF[4], Line: 3}, - {Function: contentionF[3], Line: 5}, - }, - }, - { - ID: 3001, - Mapping: contentionM[0], - Address: 0x3001, - Line: []profile.Line{ - {Function: contentionF[4], Line: 3}, - {Function: contentionF[3], Line: 5}, - }, - }, - { - ID: 3002, - Mapping: contentionM[0], - Address: 0x3002, - Line: []profile.Line{ - {Function: contentionF[5], Line: 4}, - {Function: contentionF[3], Line: 3}, - }, - }, - } - - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "contentions", Unit: "count"}, - Period: 524288, - SampleType: []*profile.ValueType{ - {Type: "contentions", Unit: "count"}, - {Type: "delay", Unit: "nanoseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{contentionL[0], contentionL[1], contentionL[2]}, - Value: []int64{10, 10240000}, - }, - { - Location: []*profile.Location{contentionL[0], contentionL[3]}, - Value: []int64{20, 40960000}, - }, - { - Location: []*profile.Location{contentionL[1], contentionL[4]}, - Value: []int64{40, 65536000}, - }, - { - Location: []*profile.Location{contentionL[2]}, - Value: []int64{80, 32768000}, - }, - }, - Location: contentionL, - Function: contentionF, - Mapping: contentionM, - Comments: []string{"Comment #1", "Comment #2"}, - } -} - -func symzProfile() *profile.Profile { - var symzM = []*profile.Mapping{ - { - ID: 1, - Start: testStart, - Limit: 0x4000, - File: "/path/to/testbinary", - }, - } - - var symzL = []*profile.Location{ - {ID: 1, Mapping: symzM[0], Address: testStart}, - {ID: 2, Mapping: symzM[0], Address: testStart + 0x1000}, - {ID: 3, Mapping: symzM[0], Address: testStart + 0x2000}, - } - - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{symzL[0], symzL[1], symzL[2]}, - Value: []int64{1, 1}, - }, - }, - Location: symzL, - Mapping: symzM, - } -} - -var autoCompleteTests = []struct { - in string - out string -}{ - {"", ""}, - {"xyz", "xyz"}, // no match - {"dis", "disasm"}, // single match - {"t", "t"}, // many matches - {"top abc", "top abc"}, // no function name match - {"top mangledM", "top mangledMALLOC"}, // single function name match - {"top cmd cmd mangledM", "top cmd cmd mangledMALLOC"}, - {"top mangled", "top mangled"}, // many function name matches - {"cmd mangledM", "cmd mangledM"}, // invalid command - {"top mangledM cmd", "top mangledM cmd"}, // cursor misplaced - {"top edMA", "top mangledMALLOC"}, // single infix function name match - {"top -mangledM", "top -mangledMALLOC"}, // ignore sign handled - {"lin", "lines"}, // single variable match - {"EdGeF", "edgefraction"}, // single capitalized match - {"help dis", "help disasm"}, // help command match - {"help relative_perc", "help relative_percentages"}, // help variable match - {"help coMpa", "help compact_labels"}, // help variable capitalized match -} - -func TestAutoComplete(t *testing.T) { - complete := newCompleter(functionNames(heapProfile())) - - for _, test := range autoCompleteTests { - if out := complete(test.in); out != test.out { - t.Errorf("autoComplete(%s) = %s; want %s", test.in, out, test.out) - } - } -} - -func TestTagFilter(t *testing.T) { - var tagFilterTests = []struct { - desc, value string - tags map[string][]string - want bool - }{ - { - "1 key with 1 matching value", - "tag2", - map[string][]string{"value1": {"tag1", "tag2"}}, - true, - }, - { - "1 key with no matching values", - "tag3", - map[string][]string{"value1": {"tag1", "tag2"}}, - false, - }, - { - "two keys, each with value matching different one value in list", - "tag1,tag3", - map[string][]string{"value1": {"tag1", "tag2"}, "value2": {"tag3"}}, - true, - }, - {"two keys, all value matching different regex value in list", - "t..[12],t..3", - map[string][]string{"value1": {"tag1", "tag2"}, "value2": {"tag3"}}, - true, - }, - { - "one key, not all values in list matched", - "tag2,tag3", - map[string][]string{"value1": {"tag1", "tag2"}}, - false, - }, - { - "key specified, list of tags where all tags in list matched", - "key1=tag1,tag2", - map[string][]string{"key1": {"tag1", "tag2"}}, - true, - }, - {"key specified, list of tag values where not all are matched", - "key1=tag1,tag2", - map[string][]string{"key1": {"tag1"}}, - true, - }, - { - "key included for regex matching, list of values where all values in list matched", - "key1:tag1,tag2", - map[string][]string{"key1": {"tag1", "tag2"}}, - true, - }, - { - "key included for regex matching, list of values where not only second value matched", - "key1:tag1,tag2", - map[string][]string{"key1": {"tag2"}}, - false, - }, - { - "key included for regex matching, list of values where not only first value matched", - "key1:tag1,tag2", - map[string][]string{"key1": {"tag1"}}, - false, - }, - } - for _, test := range tagFilterTests { - t.Run(test.desc, func(*testing.T) { - filter, err := compileTagFilter(test.desc, test.value, nil, &proftest.TestUI{T: t}, nil) - if err != nil { - t.Fatalf("tagFilter %s:%v", test.desc, err) - } - s := profile.Sample{ - Label: test.tags, - } - if got := filter(&s); got != test.want { - t.Errorf("tagFilter %s: got %v, want %v", test.desc, got, test.want) - } - }) - } -} - -func TestIdentifyNumLabelUnits(t *testing.T) { - var tagFilterTests = []struct { - desc string - tagVals []map[string][]int64 - tagUnits []map[string][]string - wantUnits map[string]string - allowedRx string - wantIgnoreErrCount int - }{ - { - "Multiple keys, no units for all keys", - []map[string][]int64{{"keyA": {131072}, "keyB": {128}}}, - []map[string][]string{{"keyA": {}, "keyB": {""}}}, - map[string]string{"keyA": "keyA", "keyB": "keyB"}, - "", - 0, - }, - { - "Multiple keys, different units for each key", - []map[string][]int64{{"keyA": {131072}, "keyB": {128}}}, - []map[string][]string{{"keyA": {"bytes"}, "keyB": {"kilobytes"}}}, - map[string]string{"keyA": "bytes", "keyB": "kilobytes"}, - "", - 0, - }, - { - "Multiple keys with multiple values, different units for each key", - []map[string][]int64{{"keyC": {131072, 1}, "keyD": {128, 252}}}, - []map[string][]string{{"keyC": {"bytes", "bytes"}, "keyD": {"kilobytes", "kilobytes"}}}, - map[string]string{"keyC": "bytes", "keyD": "kilobytes"}, - "", - 0, - }, - { - "Multiple keys with multiple values, some units missing", - []map[string][]int64{{"key1": {131072, 1}, "A": {128, 252}, "key3": {128}, "key4": {1}}, {"key3": {128}, "key4": {1}}}, - []map[string][]string{{"key1": {"", "bytes"}, "A": {"kilobytes", ""}, "key3": {""}, "key4": {"hour"}}, {"key3": {"seconds"}, "key4": {""}}}, - map[string]string{"key1": "bytes", "A": "kilobytes", "key3": "seconds", "key4": "hour"}, - "", - 0, - }, - { - "One key with three units in same sample", - []map[string][]int64{{"key": {8, 8, 16}}}, - []map[string][]string{{"key": {"bytes", "megabytes", "kilobytes"}}}, - map[string]string{"key": "bytes"}, - `(For tag key used unit bytes, also encountered unit\(s\) kilobytes, megabytes)`, - 1, - }, - { - "One key with four units in same sample", - []map[string][]int64{{"key": {8, 8, 16, 32}}}, - []map[string][]string{{"key": {"bytes", "kilobytes", "a", "megabytes"}}}, - map[string]string{"key": "bytes"}, - `(For tag key used unit bytes, also encountered unit\(s\) a, kilobytes, megabytes)`, - 1, - }, - { - "One key with two units in same sample", - []map[string][]int64{{"key": {8, 8}}}, - []map[string][]string{{"key": {"bytes", "seconds"}}}, - map[string]string{"key": "bytes"}, - `(For tag key used unit bytes, also encountered unit\(s\) seconds)`, - 1, - }, - { - "One key with different units in different samples", - []map[string][]int64{{"key1": {8}}, {"key1": {8}}, {"key1": {8}}}, - []map[string][]string{{"key1": {"bytes"}}, {"key1": {"kilobytes"}}, {"key1": {"megabytes"}}}, - map[string]string{"key1": "bytes"}, - `(For tag key1 used unit bytes, also encountered unit\(s\) kilobytes, megabytes)`, - 1, - }, - { - "Key alignment, unit not specified", - []map[string][]int64{{"alignment": {8}}}, - []map[string][]string{nil}, - map[string]string{"alignment": "bytes"}, - "", - 0, - }, - { - "Key request, unit not specified", - []map[string][]int64{{"request": {8}}, {"request": {8, 8}}}, - []map[string][]string{nil, nil}, - map[string]string{"request": "bytes"}, - "", - 0, - }, - { - "Check units not over-written for keys with default units", - []map[string][]int64{{ - "alignment": {8}, - "request": {8}, - "bytes": {8}, - }}, - []map[string][]string{{ - "alignment": {"seconds"}, - "request": {"minutes"}, - "bytes": {"hours"}, - }}, - map[string]string{ - "alignment": "seconds", - "request": "minutes", - "bytes": "hours", - }, - "", - 0, - }, - } - for _, test := range tagFilterTests { - t.Run(test.desc, func(*testing.T) { - p := profile.Profile{Sample: make([]*profile.Sample, len(test.tagVals))} - for i, numLabel := range test.tagVals { - s := profile.Sample{ - NumLabel: numLabel, - NumUnit: test.tagUnits[i], - } - p.Sample[i] = &s - } - testUI := &proftest.TestUI{T: t, AllowRx: test.allowedRx} - units := identifyNumLabelUnits(&p, testUI) - if !reflect.DeepEqual(test.wantUnits, units) { - t.Errorf("got %v units, want %v", units, test.wantUnits) - } - if got, want := testUI.NumAllowRxMatches, test.wantIgnoreErrCount; want != got { - t.Errorf("got %d errors logged, want %d errors logged", got, want) - } - }) - } -} - -func TestNumericTagFilter(t *testing.T) { - var tagFilterTests = []struct { - desc, value string - tags map[string][]int64 - identifiedUnits map[string]string - want bool - }{ - { - "Match when unit conversion required", - "128kb", - map[string][]int64{"key1": {131072}, "key2": {128}}, - map[string]string{"key1": "bytes", "key2": "kilobytes"}, - true, - }, - { - "Match only when values equal after unit conversion", - "512kb", - map[string][]int64{"key1": {512}, "key2": {128}}, - map[string]string{"key1": "bytes", "key2": "kilobytes"}, - false, - }, - { - "Match when values and units initially equal", - "10bytes", - map[string][]int64{"key1": {10}, "key2": {128}}, - map[string]string{"key1": "bytes", "key2": "kilobytes"}, - true, - }, - { - "Match range without lower bound, no unit conversion required", - ":10bytes", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "bytes"}, - true, - }, - { - "Match range without lower bound, unit conversion required", - ":10kb", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "bytes"}, - true, - }, - { - "Match range without upper bound, unit conversion required", - "10b:", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "kilobytes"}, - true, - }, - { - "Match range without upper bound, no unit conversion required", - "10b:", - map[string][]int64{"key1": {12}}, - map[string]string{"key1": "bytes"}, - true, - }, - { - "Don't match range without upper bound, no unit conversion required", - "10b:", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "bytes"}, - false, - }, - { - "Multiple keys with different units, don't match range without upper bound", - "10kb:", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "bytes", "key2": "kilobytes"}, - false, - }, - { - "Match range without upper bound, unit conversion required", - "10b:", - map[string][]int64{"key1": {8}}, - map[string]string{"key1": "kilobytes"}, - true, - }, - { - "Don't match range without lower bound, no unit conversion required", - ":10b", - map[string][]int64{"key1": {12}}, - map[string]string{"key1": "bytes"}, - false, - }, - { - "Match specific key, key present, one of two values match", - "bytes=5b", - map[string][]int64{"bytes": {10, 5}}, - map[string]string{"bytes": "bytes"}, - true, - }, - { - "Match specific key, key present and value matches", - "bytes=1024b", - map[string][]int64{"bytes": {1024}}, - map[string]string{"bytes": "kilobytes"}, - false, - }, - { - "Match specific key, matching key present and value matches, also non-matching key", - "bytes=1024b", - map[string][]int64{"bytes": {1024}, "key2": {5}}, - map[string]string{"bytes": "bytes", "key2": "bytes"}, - true, - }, - { - "Match specific key and range of values, value matches", - "bytes=512b:1024b", - map[string][]int64{"bytes": {780}}, - map[string]string{"bytes": "bytes"}, - true, - }, - { - "Match specific key and range of values, value too large", - "key1=1kb:2kb", - map[string][]int64{"key1": {4096}}, - map[string]string{"key1": "bytes"}, - false, - }, - { - "Match specific key and range of values, value too small", - "key1=1kb:2kb", - map[string][]int64{"key1": {256}}, - map[string]string{"key1": "bytes"}, - false, - }, - { - "Match specific key and value, unit conversion required", - "bytes=1024b", - map[string][]int64{"bytes": {1}}, - map[string]string{"bytes": "kilobytes"}, - true, - }, - { - "Match specific key and value, key does not appear", - "key2=256bytes", - map[string][]int64{"key1": {256}}, - map[string]string{"key1": "bytes"}, - false, - }, - } - for _, test := range tagFilterTests { - t.Run(test.desc, func(*testing.T) { - wantErrMsg := strings.Join([]string{"(", test.desc, ":Interpreted '", test.value[strings.Index(test.value, "=")+1:], "' as range, not regexp", ")"}, "") - filter, err := compileTagFilter(test.desc, test.value, test.identifiedUnits, &proftest.TestUI{T: t, - AllowRx: wantErrMsg}, nil) - if err != nil { - t.Fatalf("%v", err) - } - s := profile.Sample{ - NumLabel: test.tags, - } - if got := filter(&s); got != test.want { - t.Fatalf("got %v, want %v", got, test.want) - } - }) - } -} - -type testSymbolzMergeFetcher struct{} - -func (testSymbolzMergeFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) { - var p *profile.Profile - switch s { - case testSourceURL(8000) + "symbolz": - p = symzProfile() - case testSourceURL(8001) + "symbolz": - p = symzProfile() - p.Mapping[0].Start += testOffset - p.Mapping[0].Limit += testOffset - for i := range p.Location { - p.Location[i].Address += testOffset - } - default: - return nil, "", fmt.Errorf("unexpected source: %s", s) - } - return p, s, nil -} - -func TestSymbolzAfterMerge(t *testing.T) { - baseVars := pprofVariables - pprofVariables = baseVars.makeCopy() - defer func() { pprofVariables = baseVars }() - - f := baseFlags() - f.args = []string{ - testSourceURL(8000) + "symbolz", - testSourceURL(8001) + "symbolz", - } - - o := setDefaults(nil) - o.Flagset = f - o.Obj = new(mockObjTool) - src, cmd, err := parseFlags(o) - if err != nil { - t.Fatalf("parseFlags: %v", err) - } - - if len(cmd) != 1 || cmd[0] != "proto" { - t.Fatalf("parseFlags returned command %v, want [proto]", cmd) - } - - o.Fetch = testSymbolzMergeFetcher{} - o.Sym = testSymbolzSymbolizer{} - p, err := fetchProfiles(src, o) - if err != nil { - t.Fatalf("fetchProfiles: %v", err) - } - if len(p.Location) != 3 { - t.Errorf("Got %d locations after merge, want %d", len(p.Location), 3) - } - for i, l := range p.Location { - if len(l.Line) != 1 { - t.Errorf("Number of lines for symbolz %#x in iteration %d, got %d, want %d", l.Address, i, len(l.Line), 1) - continue - } - address := l.Address - l.Mapping.Start - if got, want := l.Line[0].Function.Name, fmt.Sprintf("%#x", address); got != want { - t.Errorf("symbolz %#x, got %s, want %s", address, got, want) - } - } -} - -type mockObjTool struct{} - -func (*mockObjTool) Open(file string, start, limit, offset uint64) (plugin.ObjFile, error) { - return &mockFile{file, "abcdef", 0}, nil -} - -func (m *mockObjTool) Disasm(file string, start, end uint64) ([]plugin.Inst, error) { - switch start { - case 0x1000: - return []plugin.Inst{ - {Addr: 0x1000, Text: "instruction one", File: "file1000.src", Line: 1}, - {Addr: 0x1001, Text: "instruction two", File: "file1000.src", Line: 1}, - {Addr: 0x1002, Text: "instruction three", File: "file1000.src", Line: 2}, - {Addr: 0x1003, Text: "instruction four", File: "file1000.src", Line: 1}, - }, nil - case 0x3000: - return []plugin.Inst{ - {Addr: 0x3000, Text: "instruction one"}, - {Addr: 0x3001, Text: "instruction two"}, - {Addr: 0x3002, Text: "instruction three"}, - {Addr: 0x3003, Text: "instruction four"}, - {Addr: 0x3004, Text: "instruction five"}, - }, nil - } - return nil, fmt.Errorf("unimplemented") -} - -type mockFile struct { - name, buildID string - base uint64 -} - -// Name returns the underlyinf file name, if available -func (m *mockFile) Name() string { - return m.name -} - -// Base returns the base address to use when looking up symbols in the file. -func (m *mockFile) Base() uint64 { - return m.base -} - -// BuildID returns the GNU build ID of the file, or an empty string. -func (m *mockFile) BuildID() string { - return m.buildID -} - -// SourceLine reports the source line information for a given -// address in the file. Due to inlining, the source line information -// is in general a list of positions representing a call stack, -// with the leaf function first. -func (*mockFile) SourceLine(addr uint64) ([]plugin.Frame, error) { - return nil, fmt.Errorf("unimplemented") -} - -// Symbols returns a list of symbols in the object file. -// If r is not nil, Symbols restricts the list to symbols -// with names matching the regular expression. -// If addr is not zero, Symbols restricts the list to symbols -// containing that address. -func (m *mockFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { - switch r.String() { - case "line[13]": - return []*plugin.Sym{ - { - Name: []string{"line1000"}, File: m.name, - Start: 0x1000, End: 0x1003, - }, - { - Name: []string{"line3000"}, File: m.name, - Start: 0x3000, End: 0x3004, - }, - }, nil - } - return nil, fmt.Errorf("unimplemented") -} - -// Close closes the file, releasing associated resources. -func (*mockFile) Close() error { - return nil -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go deleted file mode 100644 index b9e9dfe8f4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go +++ /dev/null @@ -1,758 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package driver - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/tls" - "crypto/x509" - "encoding/pem" - "fmt" - "io/ioutil" - "math/big" - "net" - "net/http" - "os" - "path/filepath" - "reflect" - "regexp" - "runtime" - "strings" - "testing" - "time" - - "github.com/google/pprof/internal/binutils" - "github.com/google/pprof/internal/plugin" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/internal/symbolizer" - "github.com/google/pprof/internal/transport" - "github.com/google/pprof/profile" -) - -func TestSymbolizationPath(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("test assumes Unix paths") - } - - // Save environment variables to restore after test - saveHome := os.Getenv(homeEnv()) - savePath := os.Getenv("PPROF_BINARY_PATH") - - tempdir, err := ioutil.TempDir("", "home") - if err != nil { - t.Fatal("creating temp dir: ", err) - } - defer os.RemoveAll(tempdir) - os.MkdirAll(filepath.Join(tempdir, "pprof", "binaries", "abcde10001"), 0700) - os.Create(filepath.Join(tempdir, "pprof", "binaries", "abcde10001", "binary")) - - obj := testObj{tempdir} - os.Setenv(homeEnv(), tempdir) - for _, tc := range []struct { - env, file, buildID, want string - msgCount int - }{ - {"", "/usr/bin/binary", "", "/usr/bin/binary", 0}, - {"", "/usr/bin/binary", "fedcb10000", "/usr/bin/binary", 0}, - {"/usr", "/bin/binary", "", "/usr/bin/binary", 0}, - {"", "/prod/path/binary", "abcde10001", filepath.Join(tempdir, "pprof/binaries/abcde10001/binary"), 0}, - {"/alternate/architecture", "/usr/bin/binary", "", "/alternate/architecture/binary", 0}, - {"/alternate/architecture", "/usr/bin/binary", "abcde10001", "/alternate/architecture/binary", 0}, - {"/nowhere:/alternate/architecture", "/usr/bin/binary", "fedcb10000", "/usr/bin/binary", 1}, - {"/nowhere:/alternate/architecture", "/usr/bin/binary", "abcde10002", "/usr/bin/binary", 1}, - } { - os.Setenv("PPROF_BINARY_PATH", tc.env) - p := &profile.Profile{ - Mapping: []*profile.Mapping{ - { - File: tc.file, - BuildID: tc.buildID, - }, - }, - } - s := &source{} - locateBinaries(p, s, obj, &proftest.TestUI{T: t, Ignore: tc.msgCount}) - if file := p.Mapping[0].File; file != tc.want { - t.Errorf("%s:%s:%s, want %s, got %s", tc.env, tc.file, tc.buildID, tc.want, file) - } - } - os.Setenv(homeEnv(), saveHome) - os.Setenv("PPROF_BINARY_PATH", savePath) -} - -func TestCollectMappingSources(t *testing.T) { - const startAddress uint64 = 0x40000 - const url = "http://example.com" - for _, tc := range []struct { - file, buildID string - want plugin.MappingSources - }{ - {"/usr/bin/binary", "buildId", mappingSources("buildId", url, startAddress)}, - {"/usr/bin/binary", "", mappingSources("/usr/bin/binary", url, startAddress)}, - {"", "", mappingSources(url, url, startAddress)}, - } { - p := &profile.Profile{ - Mapping: []*profile.Mapping{ - { - File: tc.file, - BuildID: tc.buildID, - Start: startAddress, - }, - }, - } - got := collectMappingSources(p, url) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s:%s, want %v, got %v", tc.file, tc.buildID, tc.want, got) - } - } -} - -func TestUnsourceMappings(t *testing.T) { - for _, tc := range []struct { - file, buildID, want string - }{ - {"/usr/bin/binary", "buildId", "/usr/bin/binary"}, - {"http://example.com", "", ""}, - } { - p := &profile.Profile{ - Mapping: []*profile.Mapping{ - { - File: tc.file, - BuildID: tc.buildID, - }, - }, - } - unsourceMappings(p) - if got := p.Mapping[0].File; got != tc.want { - t.Errorf("%s:%s, want %s, got %s", tc.file, tc.buildID, tc.want, got) - } - } -} - -type testObj struct { - home string -} - -func (o testObj) Open(file string, start, limit, offset uint64) (plugin.ObjFile, error) { - switch file { - case "/alternate/architecture/binary": - return testFile{file, "abcde10001"}, nil - case "/usr/bin/binary": - return testFile{file, "fedcb10000"}, nil - case filepath.Join(o.home, "pprof/binaries/abcde10001/binary"): - return testFile{file, "abcde10001"}, nil - } - return nil, fmt.Errorf("not found: %s", file) -} -func (testObj) Demangler(_ string) func(names []string) (map[string]string, error) { - return func(names []string) (map[string]string, error) { return nil, nil } -} -func (testObj) Disasm(file string, start, end uint64) ([]plugin.Inst, error) { return nil, nil } - -type testFile struct{ name, buildID string } - -func (f testFile) Name() string { return f.name } -func (testFile) Base() uint64 { return 0 } -func (f testFile) BuildID() string { return f.buildID } -func (testFile) SourceLine(addr uint64) ([]plugin.Frame, error) { return nil, nil } -func (testFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { return nil, nil } -func (testFile) Close() error { return nil } - -func TestFetch(t *testing.T) { - const path = "testdata/" - type testcase struct { - source, execName string - } - - for _, tc := range []testcase{ - {path + "go.crc32.cpu", ""}, - {path + "go.nomappings.crash", "/bin/gotest.exe"}, - {"http://localhost/profile?file=cppbench.cpu", ""}, - } { - p, _, _, err := grabProfile(&source{ExecName: tc.execName}, tc.source, nil, testObj{}, &proftest.TestUI{T: t}, &httpTransport{}) - if err != nil { - t.Fatalf("%s: %s", tc.source, err) - } - if len(p.Sample) == 0 { - t.Errorf("%s: want non-zero samples", tc.source) - } - if e := tc.execName; e != "" { - switch { - case len(p.Mapping) == 0 || p.Mapping[0] == nil: - t.Errorf("%s: want mapping[0].execName == %s, got no mappings", tc.source, e) - case p.Mapping[0].File != e: - t.Errorf("%s: want mapping[0].execName == %s, got %s", tc.source, e, p.Mapping[0].File) - } - } - } -} - -func TestFetchWithBase(t *testing.T) { - baseVars := pprofVariables - defer func() { pprofVariables = baseVars }() - - type WantSample struct { - values []int64 - labels map[string][]string - } - - const path = "testdata/" - type testcase struct { - desc string - sources []string - bases []string - diffBases []string - normalize bool - wantSamples []WantSample - wantErrorMsg string - } - - testcases := []testcase{ - { - "not normalized base is same as source", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention"}, - nil, - false, - nil, - "", - }, - { - "not normalized base is same as source", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention"}, - nil, - false, - nil, - "", - }, - { - "not normalized single source, multiple base (all profiles same)", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention", path + "cppbench.contention"}, - nil, - false, - []WantSample{ - { - values: []int64{-2700, -608881724}, - labels: map[string][]string{}, - }, - { - values: []int64{-100, -23992}, - labels: map[string][]string{}, - }, - { - values: []int64{-200, -179943}, - labels: map[string][]string{}, - }, - { - values: []int64{-100, -17778444}, - labels: map[string][]string{}, - }, - { - values: []int64{-100, -75976}, - labels: map[string][]string{}, - }, - { - values: []int64{-300, -63568134}, - labels: map[string][]string{}, - }, - }, - "", - }, - { - "not normalized, different base and source", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.small.contention"}, - nil, - false, - []WantSample{ - { - values: []int64{1700, 608878600}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 23992}, - labels: map[string][]string{}, - }, - { - values: []int64{200, 179943}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 17778444}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 75976}, - labels: map[string][]string{}, - }, - { - values: []int64{300, 63568134}, - labels: map[string][]string{}, - }, - }, - "", - }, - { - "normalized base is same as source", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention"}, - nil, - true, - nil, - "", - }, - { - "normalized single source, multiple base (all profiles same)", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention", path + "cppbench.contention"}, - nil, - true, - nil, - "", - }, - { - "normalized different base and source", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.small.contention"}, - nil, - true, - []WantSample{ - { - values: []int64{-229, -370}, - labels: map[string][]string{}, - }, - { - values: []int64{28, 0}, - labels: map[string][]string{}, - }, - { - values: []int64{57, 0}, - labels: map[string][]string{}, - }, - { - values: []int64{28, 80}, - labels: map[string][]string{}, - }, - { - values: []int64{28, 0}, - labels: map[string][]string{}, - }, - { - values: []int64{85, 287}, - labels: map[string][]string{}, - }, - }, - "", - }, - { - "not normalized diff base is same as source", - []string{path + "cppbench.contention"}, - nil, - []string{path + "cppbench.contention"}, - false, - []WantSample{ - { - values: []int64{2700, 608881724}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 23992}, - labels: map[string][]string{}, - }, - { - values: []int64{200, 179943}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 17778444}, - labels: map[string][]string{}, - }, - { - values: []int64{100, 75976}, - labels: map[string][]string{}, - }, - { - values: []int64{300, 63568134}, - labels: map[string][]string{}, - }, - { - values: []int64{-2700, -608881724}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - { - values: []int64{-100, -23992}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - { - values: []int64{-200, -179943}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - { - values: []int64{-100, -17778444}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - { - values: []int64{-100, -75976}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - { - values: []int64{-300, -63568134}, - labels: map[string][]string{"pprof::base": {"true"}}, - }, - }, - "", - }, - { - "diff_base and base both specified", - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention"}, - []string{path + "cppbench.contention"}, - false, - nil, - "-base and -diff_base flags cannot both be specified", - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - pprofVariables = baseVars.makeCopy() - f := testFlags{ - stringLists: map[string][]string{ - "base": tc.bases, - "diff_base": tc.diffBases, - }, - bools: map[string]bool{ - "normalize": tc.normalize, - }, - } - f.args = tc.sources - - o := setDefaults(&plugin.Options{ - UI: &proftest.TestUI{T: t, AllowRx: "Local symbolization failed|Some binary filenames not available"}, - Flagset: f, - HTTPTransport: transport.New(nil), - }) - src, _, err := parseFlags(o) - - if tc.wantErrorMsg != "" { - if err == nil { - t.Fatalf("got nil, want error %q", tc.wantErrorMsg) - } - - if gotErrMsg := err.Error(); gotErrMsg != tc.wantErrorMsg { - t.Fatalf("got error %q, want error %q", gotErrMsg, tc.wantErrorMsg) - } - return - } - - if err != nil { - t.Fatalf("got error %q, want no error", err) - } - - p, err := fetchProfiles(src, o) - - if err != nil { - t.Fatalf("got error %q, want no error", err) - } - - if got, want := len(p.Sample), len(tc.wantSamples); got != want { - t.Fatalf("got %d samples want %d", got, want) - } - - for i, sample := range p.Sample { - if !reflect.DeepEqual(tc.wantSamples[i].values, sample.Value) { - t.Errorf("for sample %d got values %v, want %v", i, sample.Value, tc.wantSamples[i]) - } - if !reflect.DeepEqual(tc.wantSamples[i].labels, sample.Label) { - t.Errorf("for sample %d got labels %v, want %v", i, sample.Label, tc.wantSamples[i].labels) - } - } - }) - } -} - -// mappingSources creates MappingSources map with a single item. -func mappingSources(key, source string, start uint64) plugin.MappingSources { - return plugin.MappingSources{ - key: []struct { - Source string - Start uint64 - }{ - {Source: source, Start: start}, - }, - } -} - -type httpTransport struct{} - -func (tr *httpTransport) RoundTrip(req *http.Request) (*http.Response, error) { - values := req.URL.Query() - file := values.Get("file") - - if file == "" { - return nil, fmt.Errorf("want .../file?profile, got %s", req.URL.String()) - } - - t := &http.Transport{} - t.RegisterProtocol("file", http.NewFileTransport(http.Dir("testdata/"))) - - c := &http.Client{Transport: t} - return c.Get("file:///" + file) -} - -func closedError() string { - if runtime.GOOS == "plan9" { - return "listen hungup" - } - return "use of closed" -} - -func TestHTTPSInsecure(t *testing.T) { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { - t.Skip("test assumes tcp available") - } - saveHome := os.Getenv(homeEnv()) - tempdir, err := ioutil.TempDir("", "home") - if err != nil { - t.Fatal("creating temp dir: ", err) - } - defer os.RemoveAll(tempdir) - - // pprof writes to $HOME/pprof by default which is not necessarily - // writeable (e.g. on a Debian buildd) so set $HOME to something we - // know we can write to for the duration of the test. - os.Setenv(homeEnv(), tempdir) - defer os.Setenv(homeEnv(), saveHome) - - baseVars := pprofVariables - pprofVariables = baseVars.makeCopy() - defer func() { pprofVariables = baseVars }() - - tlsCert, _, _ := selfSignedCert(t, "") - tlsConfig := &tls.Config{Certificates: []tls.Certificate{tlsCert}} - - l, err := tls.Listen("tcp", "localhost:0", tlsConfig) - if err != nil { - t.Fatalf("net.Listen: got error %v, want no error", err) - } - - donec := make(chan error, 1) - go func(donec chan<- error) { - donec <- http.Serve(l, nil) - }(donec) - defer func() { - if got, want := <-donec, closedError(); !strings.Contains(got.Error(), want) { - t.Fatalf("Serve got error %v, want %q", got, want) - } - }() - defer l.Close() - - outputTempFile, err := ioutil.TempFile("", "profile_output") - if err != nil { - t.Fatalf("Failed to create tempfile: %v", err) - } - defer os.Remove(outputTempFile.Name()) - defer outputTempFile.Close() - - address := "https+insecure://" + l.Addr().String() + "/debug/pprof/goroutine" - s := &source{ - Sources: []string{address}, - Seconds: 10, - Timeout: 10, - Symbolize: "remote", - } - o := &plugin.Options{ - Obj: &binutils.Binutils{}, - UI: &proftest.TestUI{T: t, AllowRx: "Saved profile in"}, - HTTPTransport: transport.New(nil), - } - o.Sym = &symbolizer.Symbolizer{Obj: o.Obj, UI: o.UI} - p, err := fetchProfiles(s, o) - if err != nil { - t.Fatal(err) - } - if len(p.SampleType) == 0 { - t.Fatalf("fetchProfiles(%s) got empty profile: len(p.SampleType)==0", address) - } - if len(p.Function) == 0 { - t.Fatalf("fetchProfiles(%s) got non-symbolized profile: len(p.Function)==0", address) - } - if err := checkProfileHasFunction(p, "TestHTTPSInsecure"); err != nil { - t.Fatalf("fetchProfiles(%s) %v", address, err) - } -} - -func TestHTTPSWithServerCertFetch(t *testing.T) { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { - t.Skip("test assumes tcp available") - } - saveHome := os.Getenv(homeEnv()) - tempdir, err := ioutil.TempDir("", "home") - if err != nil { - t.Fatal("creating temp dir: ", err) - } - defer os.RemoveAll(tempdir) - - // pprof writes to $HOME/pprof by default which is not necessarily - // writeable (e.g. on a Debian buildd) so set $HOME to something we - // know we can write to for the duration of the test. - os.Setenv(homeEnv(), tempdir) - defer os.Setenv(homeEnv(), saveHome) - - baseVars := pprofVariables - pprofVariables = baseVars.makeCopy() - defer func() { pprofVariables = baseVars }() - - cert, certBytes, keyBytes := selfSignedCert(t, "localhost") - cas := x509.NewCertPool() - cas.AppendCertsFromPEM(certBytes) - - tlsConfig := &tls.Config{ - RootCAs: cas, - Certificates: []tls.Certificate{cert}, - ClientAuth: tls.RequireAndVerifyClientCert, - ClientCAs: cas, - } - - l, err := tls.Listen("tcp", "localhost:0", tlsConfig) - if err != nil { - t.Fatalf("net.Listen: got error %v, want no error", err) - } - - donec := make(chan error, 1) - go func(donec chan<- error) { - donec <- http.Serve(l, nil) - }(donec) - defer func() { - if got, want := <-donec, closedError(); !strings.Contains(got.Error(), want) { - t.Fatalf("Serve got error %v, want %q", got, want) - } - }() - defer l.Close() - - outputTempFile, err := ioutil.TempFile("", "profile_output") - if err != nil { - t.Fatalf("Failed to create tempfile: %v", err) - } - defer os.Remove(outputTempFile.Name()) - defer outputTempFile.Close() - - // Get port from the address, so request to the server can be made using - // the host name specified in certificates. - _, portStr, err := net.SplitHostPort(l.Addr().String()) - if err != nil { - t.Fatalf("cannot get port from URL: %v", err) - } - address := "https://" + "localhost:" + portStr + "/debug/pprof/goroutine" - s := &source{ - Sources: []string{address}, - Seconds: 10, - Timeout: 10, - Symbolize: "remote", - } - - certTempFile, err := ioutil.TempFile("", "cert_output") - if err != nil { - t.Errorf("cannot create cert tempfile: %v", err) - } - defer os.Remove(certTempFile.Name()) - defer certTempFile.Close() - certTempFile.Write(certBytes) - - keyTempFile, err := ioutil.TempFile("", "key_output") - if err != nil { - t.Errorf("cannot create key tempfile: %v", err) - } - defer os.Remove(keyTempFile.Name()) - defer keyTempFile.Close() - keyTempFile.Write(keyBytes) - - f := &testFlags{ - strings: map[string]string{ - "tls_cert": certTempFile.Name(), - "tls_key": keyTempFile.Name(), - "tls_ca": certTempFile.Name(), - }, - } - o := &plugin.Options{ - Obj: &binutils.Binutils{}, - UI: &proftest.TestUI{T: t, AllowRx: "Saved profile in"}, - Flagset: f, - HTTPTransport: transport.New(f), - } - - o.Sym = &symbolizer.Symbolizer{Obj: o.Obj, UI: o.UI, Transport: o.HTTPTransport} - p, err := fetchProfiles(s, o) - if err != nil { - t.Fatal(err) - } - if len(p.SampleType) == 0 { - t.Fatalf("fetchProfiles(%s) got empty profile: len(p.SampleType)==0", address) - } - if len(p.Function) == 0 { - t.Fatalf("fetchProfiles(%s) got non-symbolized profile: len(p.Function)==0", address) - } - if err := checkProfileHasFunction(p, "TestHTTPSWithServerCertFetch"); err != nil { - t.Fatalf("fetchProfiles(%s) %v", address, err) - } -} - -func checkProfileHasFunction(p *profile.Profile, fname string) error { - for _, f := range p.Function { - if strings.Contains(f.Name, fname) { - return nil - } - } - return fmt.Errorf("got %s, want function %q", p.String(), fname) -} - -// selfSignedCert generates a self-signed certificate, and returns the -// generated certificate, and byte arrays containing the certificate and -// key associated with the certificate. -func selfSignedCert(t *testing.T, host string) (tls.Certificate, []byte, []byte) { - privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatalf("failed to generate private key: %v", err) - } - b, err := x509.MarshalECPrivateKey(privKey) - if err != nil { - t.Fatalf("failed to marshal private key: %v", err) - } - bk := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: b}) - - tmpl := x509.Certificate{ - SerialNumber: big.NewInt(1), - NotBefore: time.Now(), - NotAfter: time.Now().Add(10 * time.Minute), - IsCA: true, - DNSNames: []string{host}, - } - - b, err = x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, privKey.Public(), privKey) - if err != nil { - t.Fatalf("failed to create cert: %v", err) - } - bc := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: b}) - - cert, err := tls.X509KeyPair(bc, bk) - if err != nil { - t.Fatalf("failed to create TLS key pair: %v", err) - } - return cert, bc, bk -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/flags.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/flags.go index c48fb5cd2e..6ef1397852 100644 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/flags.go +++ b/src/cmd/vendor/github.com/google/pprof/internal/driver/flags.go @@ -1,3 +1,17 @@ +// Copyright 2018 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package driver import ( diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/interactive_test.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/interactive_test.go deleted file mode 100644 index 758adf9bdc..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/interactive_test.go +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package driver - -import ( - "fmt" - "math/rand" - "strings" - "testing" - - "github.com/google/pprof/internal/plugin" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/internal/report" - "github.com/google/pprof/internal/transport" - "github.com/google/pprof/profile" -) - -func TestShell(t *testing.T) { - p := &profile.Profile{} - generateReportWrapper = checkValue - defer func() { generateReportWrapper = generateReport }() - - // Use test commands and variables to exercise interactive processing - var savedCommands commands - savedCommands, pprofCommands = pprofCommands, testCommands - defer func() { pprofCommands = savedCommands }() - - savedVariables := pprofVariables - defer func() { pprofVariables = savedVariables }() - - // Random interleave of independent scripts - pprofVariables = testVariables(savedVariables) - - // pass in HTTPTransport when setting defaults, because otherwise default - // transport will try to add flags to the default flag set. - o := setDefaults(&plugin.Options{HTTPTransport: transport.New(nil)}) - o.UI = newUI(t, interleave(script, 0)) - if err := interactive(p, o); err != nil { - t.Error("first attempt:", err) - } - // Random interleave of independent scripts - pprofVariables = testVariables(savedVariables) - o.UI = newUI(t, interleave(script, 1)) - if err := interactive(p, o); err != nil { - t.Error("second attempt:", err) - } - - // Random interleave of independent scripts with shortcuts - pprofVariables = testVariables(savedVariables) - var scScript []string - pprofShortcuts, scScript = makeShortcuts(interleave(script, 2), 1) - o.UI = newUI(t, scScript) - if err := interactive(p, o); err != nil { - t.Error("first shortcut attempt:", err) - } - - // Random interleave of independent scripts with shortcuts - pprofVariables = testVariables(savedVariables) - pprofShortcuts, scScript = makeShortcuts(interleave(script, 1), 2) - o.UI = newUI(t, scScript) - if err := interactive(p, o); err != nil { - t.Error("second shortcut attempt:", err) - } - - // Group with invalid value - pprofVariables = testVariables(savedVariables) - ui := &proftest.TestUI{ - T: t, - Input: []string{"cumulative=this"}, - AllowRx: `Unrecognized value for cumulative: "this". Use one of cum, flat`, - } - o.UI = ui - if err := interactive(p, o); err != nil { - t.Error("invalid group value:", err) - } - // Confirm error message written out once. - if ui.NumAllowRxMatches != 1 { - t.Errorf("want error message to be printed 1 time, got %v", ui.NumAllowRxMatches) - } - // Verify propagation of IO errors - pprofVariables = testVariables(savedVariables) - o.UI = newUI(t, []string{"**error**"}) - if err := interactive(p, o); err == nil { - t.Error("expected IO error, got nil") - } - -} - -var testCommands = commands{ - "check": &command{report.Raw, nil, nil, true, "", ""}, -} - -func testVariables(base variables) variables { - v := base.makeCopy() - - v["b"] = &variable{boolKind, "f", "", ""} - v["bb"] = &variable{boolKind, "f", "", ""} - v["i"] = &variable{intKind, "0", "", ""} - v["ii"] = &variable{intKind, "0", "", ""} - v["f"] = &variable{floatKind, "0", "", ""} - v["ff"] = &variable{floatKind, "0", "", ""} - v["s"] = &variable{stringKind, "", "", ""} - v["ss"] = &variable{stringKind, "", "", ""} - - v["ta"] = &variable{boolKind, "f", "radio", ""} - v["tb"] = &variable{boolKind, "f", "radio", ""} - v["tc"] = &variable{boolKind, "t", "radio", ""} - - return v -} - -// script contains sequences of commands to be executed for testing. Commands -// are split by semicolon and interleaved randomly, so they must be -// independent from each other. -var script = []string{ - "bb=true;bb=false;check bb=false;bb=yes;check bb=true", - "b=1;check b=true;b=n;check b=false", - "i=-1;i=-2;check i=-2;i=999999;check i=999999", - "check ii=0;ii=-1;check ii=-1;ii=100;check ii=100", - "f=-1;f=-2.5;check f=-2.5;f=0.0001;check f=0.0001", - "check ff=0;ff=-1.01;check ff=-1.01;ff=100;check ff=100", - "s=one;s=two;check s=two", - "ss=tree;check ss=tree;ss=;check ss;ss=forest;check ss=forest", - "ta=true;check ta=true;check tb=false;check tc=false;tb=1;check tb=true;check ta=false;check tc=false;tc=yes;check tb=false;check ta=false;check tc=true", -} - -func makeShortcuts(input []string, seed int) (shortcuts, []string) { - rand.Seed(int64(seed)) - - s := shortcuts{} - var output, chunk []string - for _, l := range input { - chunk = append(chunk, l) - switch rand.Intn(3) { - case 0: - // Create a macro for commands in 'chunk'. - macro := fmt.Sprintf("alias%d", len(s)) - s[macro] = chunk - output = append(output, macro) - chunk = nil - case 1: - // Append commands in 'chunk' by themselves. - output = append(output, chunk...) - chunk = nil - case 2: - // Accumulate commands into 'chunk' - } - } - output = append(output, chunk...) - return s, output -} - -func newUI(t *testing.T, input []string) plugin.UI { - return &proftest.TestUI{ - T: t, - Input: input, - } -} - -func checkValue(p *profile.Profile, cmd []string, vars variables, o *plugin.Options) error { - if len(cmd) != 2 { - return fmt.Errorf("expected len(cmd)==2, got %v", cmd) - } - - input := cmd[1] - args := strings.SplitN(input, "=", 2) - if len(args) == 0 { - return fmt.Errorf("unexpected empty input") - } - name, value := args[0], "" - if len(args) == 2 { - value = args[1] - } - - gotv := vars[name] - if gotv == nil { - return fmt.Errorf("Could not find variable named %s", name) - } - - if got := gotv.stringValue(); got != value { - return fmt.Errorf("Variable %s, want %s, got %s", name, value, got) - } - return nil -} - -func interleave(input []string, seed int) []string { - var inputs [][]string - for _, s := range input { - inputs = append(inputs, strings.Split(s, ";")) - } - rand.Seed(int64(seed)) - var output []string - for len(inputs) > 0 { - next := rand.Intn(len(inputs)) - output = append(output, inputs[next][0]) - if tail := inputs[next][1:]; len(tail) > 0 { - inputs[next] = tail - } else { - inputs = append(inputs[:next], inputs[next+1:]...) - } - } - return output -} - -func TestInteractiveCommands(t *testing.T) { - type interactiveTestcase struct { - input string - want map[string]string - } - - testcases := []interactiveTestcase{ - { - "top 10 --cum focus1 -ignore focus2", - map[string]string{ - "functions": "true", - "nodecount": "10", - "cum": "true", - "focus": "focus1|focus2", - "ignore": "ignore", - }, - }, - { - "top10 --cum focus1 -ignore focus2", - map[string]string{ - "functions": "true", - "nodecount": "10", - "cum": "true", - "focus": "focus1|focus2", - "ignore": "ignore", - }, - }, - { - "dot", - map[string]string{ - "functions": "true", - "nodecount": "80", - "cum": "false", - }, - }, - { - "tags -ignore1 -ignore2 focus1 >out", - map[string]string{ - "functions": "true", - "nodecount": "80", - "cum": "false", - "output": "out", - "tagfocus": "focus1", - "tagignore": "ignore1|ignore2", - }, - }, - { - "weblist find -test", - map[string]string{ - "functions": "false", - "addresses": "true", - "noinlines": "true", - "nodecount": "0", - "cum": "false", - "flat": "true", - "ignore": "test", - }, - }, - { - "callgrind fun -ignore >out", - map[string]string{ - "functions": "false", - "addresses": "true", - "nodecount": "0", - "cum": "false", - "flat": "true", - "output": "out", - }, - }, - { - "999", - nil, // Error - }, - } - - for _, tc := range testcases { - cmd, vars, err := parseCommandLine(strings.Fields(tc.input)) - if tc.want == nil && err != nil { - // Error expected - continue - } - if err != nil { - t.Errorf("failed on %q: %v", tc.input, err) - continue - } - - // Get report output format - c := pprofCommands[cmd[0]] - if c == nil { - t.Errorf("unexpected nil command") - } - vars = applyCommandOverrides(cmd[0], c.format, vars) - - for n, want := range tc.want { - if got := vars[n].stringValue(); got != want { - t.Errorf("failed on %q, cmd=%q, %s got %s, want %s", tc.input, cmd, n, got, want) - } - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.contention b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.contention deleted file mode 100644 index 66a64c950c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.contention +++ /dev/null @@ -1,24 +0,0 @@ ---- contentionz 1 --- -cycles/second = 3201000000 -sampling period = 100 -ms since reset = 16502830 -discarded samples = 0 - 19490304 27 @ 0xbccc97 0xc61202 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 768 1 @ 0xbccc97 0xa42dc7 0xa456e4 0x7fcdc2ff214e - 5760 2 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x4e969d 0x4faa17 0x4fc5f6 0x4fd028 0x4fd230 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 569088 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87f08 0xb8814c 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 2432 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x7aa74c 0x7ab844 0x7ab914 0x79e9e9 0x79e326 0x4d299e 0x4d4b7b 0x4b7be8 0x4b7ff1 0x4d2dae 0x79e80a - 2034816 3 @ 0xbccc97 0xb82f0f 0xb83003 0xb87d50 0xc635f0 0x42ecc3 0x42e14c 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e ---- Memory map: --- - 00400000-00fcb000: cppbench_server_main - 7fcdc231e000-7fcdc2321000: /libnss_cache-2.15.so - 7fcdc2522000-7fcdc252e000: /libnss_files-2.15.so - 7fcdc272f000-7fcdc28dd000: /libc-2.15.so - 7fcdc2ae7000-7fcdc2be2000: /libm-2.15.so - 7fcdc2de3000-7fcdc2dea000: /librt-2.15.so - 7fcdc2feb000-7fcdc3003000: /libpthread-2.15.so - 7fcdc3208000-7fcdc320a000: /libdl-2.15.so - 7fcdc340c000-7fcdc3415000: /libcrypt-2.15.so - 7fcdc3645000-7fcdc3669000: /ld-2.15.so - 7fff86bff000-7fff86c00000: [vdso] - ffffffffff600000-ffffffffff601000: [vsyscall] diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.cpu b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.cpu deleted file mode 100644 index 95c22e1e8d8beb46c3823c3a21ee20d0eadedb4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24405 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 Nt}ISY%*l!60swy2(M13N diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.small.contention b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.small.contention deleted file mode 100644 index 230cd90200..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/cppbench.small.contention +++ /dev/null @@ -1,19 +0,0 @@ ---- contentionz 1 --- -cycles/second = 3201000000 -sampling period = 100 -ms since reset = 16502830 -discarded samples = 0 - 100 10 @ 0xbccc97 0xc61202 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e ---- Memory map: --- - 00400000-00fcb000: cppbench_server_main - 7fcdc231e000-7fcdc2321000: /libnss_cache-2.15.so - 7fcdc2522000-7fcdc252e000: /libnss_files-2.15.so - 7fcdc272f000-7fcdc28dd000: /libc-2.15.so - 7fcdc2ae7000-7fcdc2be2000: /libm-2.15.so - 7fcdc2de3000-7fcdc2dea000: /librt-2.15.so - 7fcdc2feb000-7fcdc3003000: /libpthread-2.15.so - 7fcdc3208000-7fcdc320a000: /libdl-2.15.so - 7fcdc340c000-7fcdc3415000: /libcrypt-2.15.so - 7fcdc3645000-7fcdc3669000: /ld-2.15.so - 7fff86bff000-7fff86c00000: [vdso] - ffffffffff600000-ffffffffff601000: [vsyscall] diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file1000.src b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file1000.src deleted file mode 100644 index b53eeca5ec..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file1000.src +++ /dev/null @@ -1,17 +0,0 @@ -line1 -line2 -line3 -line4 -line5 -line6 -line7 -line8 -line9 -line0 -line1 -line2 -line3 -line4 -line5 - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file2000.src b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file2000.src deleted file mode 100644 index b53eeca5ec..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file2000.src +++ /dev/null @@ -1,17 +0,0 @@ -line1 -line2 -line3 -line4 -line5 -line6 -line7 -line8 -line9 -line0 -line1 -line2 -line3 -line4 -line5 - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file3000.src b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file3000.src deleted file mode 100644 index b53eeca5ec..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/file3000.src +++ /dev/null @@ -1,17 +0,0 @@ -line1 -line2 -line3 -line4 -line5 -line6 -line7 -line8 -line9 -line0 -line1 -line2 -line3 -line4 -line5 - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/go.crc32.cpu b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/go.crc32.cpu deleted file mode 100644 index ce08313de056dce699cfdd9f7c51809edafb4647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5032 zcmZR80%j-;qXg7pEC|gAp%~bq^ki;lFw2JrLLY(BZ^R+|v;|IJd6~r!S|HXD%x40V z3~+N+k!cRK+=Fh;Rx;g#?yqHJnnNx3pqoRja3(i=(A`6=@S&E!$W70K-CqM8Uo2?( zeW2Zg9$)0T2R*-2D;-iRUr;MOlN&zh;XGXYMXPwHRyb2D9g>@V(8GsX@lLJqp_Y5d z4IlJ;K`nn#%RSUeKZ7ltspTGO#TU8ZjGn)!74OvY7rEgK>wm!d7u0eOwZey7e^D#G z(9NM%_>k)_T9sqe$`{lMA9CG;9zN7chvfPTJ^c(ee^JXl)Jo5z?m->5p;mehMe7f) iA#fPH{WE5XmQzbLt^HP$cURP60F<)o3%`EN{W$r zBQq!Fj=;xx)29gpbm@IjumPHA?tW(ggk{btRQYlQaiD{qp> z5n}iEWiz~?y6=7rS5kpT%wC?f0xy#|X5$?yY5$@ak_x N3 [label=" 75.78ms" weight=51 penwidth=3 color="#b22000" tooltip="testdata/file3000.src -> testdata/file2000.src (75.78ms)" labeltooltip="testdata/file3000.src -> testdata/file2000.src (75.78ms)"] -N1 -> N2 [label=" 40.96ms" weight=28 penwidth=2 color="#b23900" tooltip="testdata/file3000.src -> testdata/file1000.src (40.96ms)" labeltooltip="testdata/file3000.src -> testdata/file1000.src (40.96ms)"] -N3 -> N2 [label=" 10.24ms" weight=7 color="#b29775" tooltip="testdata/file2000.src -> testdata/file1000.src (10.24ms)" labeltooltip="testdata/file2000.src -> testdata/file1000.src (10.24ms)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore deleted file mode 100644 index 03fbbb5296..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.contention.flat.addresses.dot.focus.ignore +++ /dev/null @@ -1,9 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid-contention" [shape=box fontsize=16 label="Build ID: buildid-contention\lComment #1\lComment #2\lType: delay\lActive filters:\l focus=[X1]000\l ignore=[X3]002\lShowing nodes accounting for 40.96ms, 27.40% of 149.50ms total\l"] } -N1 [label="0000000000001000\nline1000\nfile1000.src:1\n40.96ms (27.40%)" id="node1" fontsize=24 shape=box tooltip="0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)" color="#b23900" fillcolor="#edddd5"] -N2 [label="0000000000003001\nline3000\nfile3000.src:5\n0 of 40.96ms (27.40%)" id="node2" fontsize=8 shape=box tooltip="0000000000003001 line3000 testdata/file3000.src:5 (40.96ms)" color="#b23900" fillcolor="#edddd5"] -N3 [label="0000000000003001\nline3001\nfile3000.src:3\n0 of 40.96ms (27.40%)" id="node3" fontsize=8 shape=box tooltip="0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)" color="#b23900" fillcolor="#edddd5"] -N2 -> N3 [label=" 40.96ms\n (inline)" weight=28 penwidth=2 color="#b23900" tooltip="0000000000003001 line3000 testdata/file3000.src:5 -> 0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)" labeltooltip="0000000000003001 line3000 testdata/file3000.src:5 -> 0000000000003001 line3001 testdata/file3000.src:3 (40.96ms)"] -N3 -> N1 [label=" 40.96ms" weight=28 penwidth=2 color="#b23900" tooltip="0000000000003001 line3001 testdata/file3000.src:3 -> 0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)" labeltooltip="0000000000003001 line3001 testdata/file3000.src:3 -> 0000000000001000 line1000 testdata/file1000.src:1 (40.96ms)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.call_tree.callgrind b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.call_tree.callgrind deleted file mode 100644 index e2286f631a..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.call_tree.callgrind +++ /dev/null @@ -1,99 +0,0 @@ -positions: instr line -events: cpu(ms) - -ob=(1) /path/to/testbinary -fl=(1) testdata/file1000.src -fn=(1) line1000 -0x1000 1 1000 -* 1 100 - -ob=(1) -fl=(2) testdata/file2000.src -fn=(2) line2001 -+4096 9 10 - -ob=(1) -fl=(3) testdata/file3000.src -fn=(3) line3002 -+4096 2 10 -cfl=(2) -cfn=(4) line2000 [1/2] -calls=0 * 4 -* * 1000 - -ob=(1) -fl=(2) -fn=(5) line2000 --4096 4 0 -cfl=(2) -cfn=(6) line2001 [2/2] -calls=0 -4096 9 -* * 1000 -* 4 0 -cfl=(2) -cfn=(7) line2001 [1/2] -calls=0 * 9 -* * 10 - -ob=(1) -fl=(2) -fn=(2) -* 9 0 -cfl=(1) -cfn=(8) line1000 [1/2] -calls=0 -4096 1 -* * 1000 - -ob=(1) -fl=(3) -fn=(9) line3000 -+4096 6 0 -cfl=(3) -cfn=(10) line3001 [1/2] -calls=0 +4096 5 -* * 1010 - -ob=(1) -fl=(3) -fn=(11) line3001 -* 5 0 -cfl=(3) -cfn=(12) line3002 [1/2] -calls=0 * 2 -* * 1010 - -ob=(1) -fl=(3) -fn=(9) -+1 9 0 -cfl=(3) -cfn=(13) line3001 [2/2] -calls=0 +1 8 -* * 100 - -ob=(1) -fl=(3) -fn=(11) -* 8 0 -cfl=(1) -cfn=(14) line1000 [2/2] -calls=0 -8193 1 -* * 100 - -ob=(1) -fl=(3) -fn=(9) -+1 9 0 -cfl=(3) -cfn=(15) line3002 [2/2] -calls=0 +1 5 -* * 10 - -ob=(1) -fl=(3) -fn=(3) -* 5 0 -cfl=(2) -cfn=(16) line2000 [2/2] -calls=0 -4098 4 -* * 10 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.callgrind b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.callgrind deleted file mode 100644 index 0b0499638c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.callgrind +++ /dev/null @@ -1,88 +0,0 @@ -positions: instr line -events: cpu(ms) - -ob=(1) /path/to/testbinary -fl=(1) testdata/file1000.src -fn=(1) line1000 -0x1000 1 1100 - -ob=(1) -fl=(2) testdata/file2000.src -fn=(2) line2001 -+4096 9 10 -cfl=(1) -cfn=(1) -calls=0 * 1 -* * 1000 - -ob=(1) -fl=(3) testdata/file3000.src -fn=(3) line3002 -+4096 2 10 -cfl=(2) -cfn=(4) line2000 -calls=0 * 4 -* * 1000 - -ob=(1) -fl=(2) -fn=(4) --4096 4 0 -cfl=(2) -cfn=(2) -calls=0 -4096 9 -* * 1010 - -ob=(1) -fl=(3) -fn=(5) line3000 -+4096 6 0 -cfl=(3) -cfn=(6) line3001 -calls=0 +4096 5 -* * 1010 - -ob=(1) -fl=(3) -fn=(6) -* 5 0 -cfl=(3) -cfn=(3) -calls=0 * 2 -* * 1010 - -ob=(1) -fl=(3) -fn=(5) -+1 9 0 -cfl=(3) -cfn=(6) -calls=0 +1 8 -* * 100 - -ob=(1) -fl=(3) -fn=(6) -* 8 0 -cfl=(1) -cfn=(1) -calls=0 -8193 1 -* * 100 - -ob=(1) -fl=(3) -fn=(5) -+1 9 0 -cfl=(3) -cfn=(3) -calls=0 +1 5 -* * 10 - -ob=(1) -fl=(3) -fn=(3) -* 5 0 -cfl=(2) -cfn=(4) -calls=0 -4098 4 -* * 10 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.comments b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.comments deleted file mode 100644 index e6d9824e1b..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.comments +++ /dev/null @@ -1 +0,0 @@ -some-comment diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide deleted file mode 100644 index f0d928d76f..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.focus.hide +++ /dev/null @@ -1,8 +0,0 @@ -Active filters: - focus=[12]00 - hide=line[X3]0 -Showing nodes accounting for 1.11s, 99.11% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 - 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 - 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.hide b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.hide deleted file mode 100644 index bf503a57db..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.hide +++ /dev/null @@ -1,7 +0,0 @@ -Active filters: - hide=line[X3]0 -Showing nodes accounting for 1.11s, 99.11% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 - 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 - 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.show b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.show deleted file mode 100644 index 7604cb8d7b..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.text.show +++ /dev/null @@ -1,7 +0,0 @@ -Active filters: - show=[12]00 -Showing nodes accounting for 1.11s, 99.11% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src:1 - 0 0% 98.21% 1.01s 90.18% line2000 testdata/file2000.src:4 - 0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src:9 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide deleted file mode 100644 index 94b9be83df..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.topproto.hide +++ /dev/null @@ -1,5 +0,0 @@ -Active filters: - hide=mangled[X3]0 -Showing nodes accounting for 1s, 100% of 1s total - flat flat% sum% cum cum% - 1s 100% 100% 1s 100% mangled1000 testdata/file1000.src:1 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from deleted file mode 100644 index 112b49b383..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.cum.lines.tree.show_from +++ /dev/null @@ -1,16 +0,0 @@ -Active filters: - show_from=line2 -Showing nodes accounting for 1.01s, 90.18% of 1.12s total -----------------------------------------------------------+------------- - flat flat% sum% cum cum% calls calls% + context -----------------------------------------------------------+------------- - 0 0% 0% 1.01s 90.18% | line2000 testdata/file2000.src:4 - 1.01s 100% | line2001 testdata/file2000.src:9 (inline) -----------------------------------------------------------+------------- - 1.01s 100% | line2000 testdata/file2000.src:4 (inline) - 0.01s 0.89% 0.89% 1.01s 90.18% | line2001 testdata/file2000.src:9 - 1s 99.01% | line1000 testdata/file1000.src:1 -----------------------------------------------------------+------------- - 1s 100% | line2001 testdata/file2000.src:9 - 1s 89.29% 90.18% 1s 89.29% | line1000 testdata/file1000.src:1 -----------------------------------------------------------+------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.disasm b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.disasm deleted file mode 100644 index e1df7b1b64..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.disasm +++ /dev/null @@ -1,14 +0,0 @@ -Total: 1.12s -ROUTINE ======================== line1000 - 1.10s 1.10s (flat, cum) 98.21% of Total - 1.10s 1.10s 1000: instruction one ;line1000 file1000.src:1 - . . 1001: instruction two ;file1000.src:1 - . . 1002: instruction three ;file1000.src:2 - . . 1003: instruction four ;file1000.src:1 -ROUTINE ======================== line3000 - 10ms 1.12s (flat, cum) 100% of Total - 10ms 1.01s 3000: instruction one ;line3000 file3000.src:6 - . 100ms 3001: instruction two ;line3000 file3000.src:9 - . 10ms 3002: instruction three - . . 3003: instruction four - . . 3004: instruction five diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text deleted file mode 100644 index d53c44dad9..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.noinlines.text +++ /dev/null @@ -1,7 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total -Dropped 1 node (cum <= 0.06s) - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% 0000000000001000 line1000 testdata/file1000.src:1 - 0.01s 0.89% 99.11% 1.01s 90.18% 0000000000002000 line2000 testdata/file2000.src:4 - 0.01s 0.89% 100% 1.01s 90.18% 0000000000003000 line3000 testdata/file3000.src:6 - 0 0% 100% 0.10s 8.93% 0000000000003001 line3000 testdata/file3000.src:9 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.weblist b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.weblist deleted file mode 100644 index 0284292745..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.addresses.weblist +++ /dev/null @@ -1,106 +0,0 @@ - - - - - -Pprof listing - - - - - -

File: testbinary
-Type: cpu
-Duration: 10s, Total samples = 1.12s (11.20%)
Total: 1.12s

line1000

testdata/file1000.src

-
-  Total:       1.10s      1.10s (flat, cum) 98.21%
-      1        1.10s      1.10s           line1                1.10s      1.10s     1000:     instruction one                                                              file1000.src:1
-                   .          .     1001:     instruction two                                                              file1000.src:1
-                                     ⋮
-                   .          .     1003:     instruction four                                                             file1000.src:1
-
-      2            .          .           line2                    .          .     1002:     instruction three                                                            file1000.src:2
-
-      3            .          .           line3 
-      4            .          .           line4 
-      5            .          .           line5 
-      6            .          .           line6 
-      7            .          .           line7 
-
-

line3000

testdata/file3000.src

-
-  Total:        10ms      1.12s (flat, cum)   100%
-      1            .          .           line1 
-      2            .          .           line2 
-      3            .          .           line3 
-      4            .          .           line4 
-      5            .          .           line5 
-      6         10ms      1.01s           line6                 10ms      1.01s     3000:     instruction one                                                              file3000.src:6
-
-      7            .          .           line7 
-      8            .          .           line8 
-      9            .      110ms           line9                    .      100ms     3001:     instruction two                                                              file3000.src:9
-                   .       10ms     3002:     instruction three                                                            file3000.src:9
-                   .          .     3003:     instruction four                                                             
-                   .          .     3004:     instruction five                                                             
-
-     10            .          .           line0 
-     11            .          .           line1 
-     12            .          .           line2 
-     13            .          .           line3 
-     14            .          .           line4 
-
- - - - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text deleted file mode 100644 index 88fb760759..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.filefunctions.noinlines.text +++ /dev/null @@ -1,5 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src - 0.01s 0.89% 99.11% 1.01s 90.18% line2000 testdata/file2000.src - 0.01s 0.89% 100% 1.12s 100% line3000 testdata/file3000.src diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot deleted file mode 100644 index e854b5d6fa..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.call_tree.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph "testbinary" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.11s, 99.11% of 1.12s total\lDropped 3 nodes (cum <= 0.06s)\l" tooltip="testbinary"] } -N1 [label="line1000\n1s (89.29%)" id="node1" fontsize=24 shape=box tooltip="line1000 (1s)" color="#b20500" fillcolor="#edd6d5"] -N1_0 [label = "key1:tag1\nkey2:tag1" id="N1_0" fontsize=8 shape=box3d tooltip="1s"] -N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"] -N2 [label="line3000\n0 of 1.12s (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="line3001\n0 of 1.11s (99.11%)" id="node3" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"] -N4 [label="line1000\n0.10s (8.93%)" id="node4" fontsize=14 shape=box tooltip="line1000 (0.10s)" color="#b28b62" fillcolor="#ede8e2"] -N4_0 [label = "key1:tag2\nkey3:tag2" id="N4_0" fontsize=8 shape=box3d tooltip="0.10s"] -N4 -> N4_0 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"] -N5 [label="line3002\n0.01s (0.89%)\nof 1.01s (90.18%)" id="node5" fontsize=10 shape=box tooltip="line3002 (1.01s)" color="#b20500" fillcolor="#edd6d5"] -N6 [label="line2000\n0 of 1s (89.29%)" id="node6" fontsize=8 shape=box tooltip="line2000 (1s)" color="#b20500" fillcolor="#edd6d5"] -N7 [label="line2001\n0 of 1s (89.29%)" id="node7" fontsize=8 shape=box tooltip="line2001 (1s)" color="#b20500" fillcolor="#edd6d5"] -N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"] -N3 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"] -N6 -> N7 [label=" 1s\n (inline)" weight=90 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1s)" labeltooltip="line2000 -> line2001 (1s)"] -N7 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"] -N5 -> N6 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1s)" labeltooltip="line3002 -> line2000 (1s)"] -N3 -> N4 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.dot b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.dot deleted file mode 100644 index f0a5226b89..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.dot +++ /dev/null @@ -1,20 +0,0 @@ -digraph "testbinary" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.12s, 100% of 1.12s total\l" tooltip="testbinary"] } -N1 [label="line1000\n1.10s (98.21%)" id="node1" fontsize=24 shape=box tooltip="line1000 (1.10s)" color="#b20000" fillcolor="#edd5d5"] -N1_0 [label = "key1:tag1\nkey2:tag1" id="N1_0" fontsize=8 shape=box3d tooltip="1s"] -N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"] -N1_1 [label = "key1:tag2\nkey3:tag2" id="N1_1" fontsize=8 shape=box3d tooltip="0.10s"] -N1 -> N1_1 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"] -N2 [label="line3000\n0 of 1.12s (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="line3001\n0 of 1.11s (99.11%)" id="node3" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"] -N4 [label="line3002\n0.01s (0.89%)\nof 1.02s (91.07%)" id="node4" fontsize=10 shape=box tooltip="line3002 (1.02s)" color="#b20400" fillcolor="#edd6d5"] -N5 [label="line2001\n0.01s (0.89%)\nof 1.01s (90.18%)" id="node5" fontsize=10 shape=box tooltip="line2001 (1.01s)" color="#b20500" fillcolor="#edd6d5"] -N6 [label="line2000\n0 of 1.01s (90.18%)" id="node6" fontsize=8 shape=box tooltip="line2000 (1.01s)" color="#b20500" fillcolor="#edd6d5"] -N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"] -N6 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1.01s)" labeltooltip="line2000 -> line2001 (1.01s)"] -N3 -> N4 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"] -N4 -> N6 [label=" 1.01s" weight=91 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1.01s)" labeltooltip="line3002 -> line2000 (1.01s)"] -N5 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"] -N3 -> N1 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text deleted file mode 100644 index 493b4912de..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.noinlines.text +++ /dev/null @@ -1,5 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 - 0.01s 0.89% 99.11% 1.01s 90.18% line2000 - 0.01s 0.89% 100% 1.12s 100% line3000 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.text deleted file mode 100644 index 66e4189e0a..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.flat.functions.text +++ /dev/null @@ -1,8 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 - 0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline) - 0.01s 0.89% 100% 1.02s 91.07% line3002 (inline) - 0 0% 100% 1.01s 90.18% line2000 - 0 0% 100% 1.12s 100% line3000 - 0 0% 100% 1.11s 99.11% line3001 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.lines.topproto b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.lines.topproto deleted file mode 100644 index 33bf6814a4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.lines.topproto +++ /dev/null @@ -1,3 +0,0 @@ -Showing nodes accounting for 1s, 100% of 1s total - flat flat% sum% cum cum% - 1s 100% 100% 1s 100% mangled1000 testdata/file1000.src:1 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek deleted file mode 100644 index 3b8a3537b4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek +++ /dev/null @@ -1,13 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total -----------------------------------------------------------+------------- - flat flat% sum% cum cum% calls calls% + context -----------------------------------------------------------+------------- - 1.01s 100% | line2000 (inline) - 0.01s 0.89% 0.89% 1.01s 90.18% | line2001 - 1s 99.01% | line1000 -----------------------------------------------------------+------------- - 1.11s 100% | line3000 (inline) - 0 0% 0.89% 1.11s 99.11% | line3001 - 1.01s 90.99% | line3002 (inline) - 0.10s 9.01% | line1000 -----------------------------------------------------------+------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags deleted file mode 100644 index 5998b5ba5b..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags +++ /dev/null @@ -1,13 +0,0 @@ - key1: Total 1.1s - 1.0s (89.29%): tag1 - 100.0ms ( 8.93%): tag2 - 10.0ms ( 0.89%): tag3 - 10.0ms ( 0.89%): tag4 - - key2: Total 1.0s - 1.0s (99.02%): tag1 - 10.0ms ( 0.98%): tag2 - - key3: Total 100.0ms - 100.0ms ( 100%): tag2 - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags.focus.ignore b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags.focus.ignore deleted file mode 100644 index 9b99d4368c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags.focus.ignore +++ /dev/null @@ -1,6 +0,0 @@ - key1: Total 100.0ms - 100.0ms ( 100%): tag2 - - key3: Total 100.0ms - 100.0ms ( 100%): tag2 - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces deleted file mode 100644 index d9637c0e42..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces +++ /dev/null @@ -1,32 +0,0 @@ -File: testbinary -Type: cpu -Duration: 10s, Total samples = 1.12s (11.20%) ------------+------------------------------------------------------- - key1: tag1 - key2: tag1 - 1s line1000 - line2001 - line2000 - line3002 - line3001 - line3000 ------------+------------------------------------------------------- - key1: tag2 - key3: tag2 - 100ms line1000 - line3001 - line3000 ------------+------------------------------------------------------- - key1: tag3 - key2: tag2 - 10ms line2001 - line2000 - line3002 - line3000 ------------+------------------------------------------------------- - key1: tag4 - key2: tag1 - 10ms line3002 - line3001 - line3000 ------------+------------------------------------------------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree deleted file mode 100644 index 606db2b887..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpusmall.flat.addresses.tree +++ /dev/null @@ -1,17 +0,0 @@ -Showing nodes accounting for 4s, 100% of 4s total -Showing top 4 nodes out of 5 -----------------------------------------------------------+------------- - flat flat% sum% cum cum% calls calls% + context -----------------------------------------------------------+------------- - 1s 100% | 0000000000003000 [testbinary] - 1s 25.00% 25.00% 1s 25.00% | 0000000000001000 [testbinary] -----------------------------------------------------------+------------- - 1s 25.00% 50.00% 2s 50.00% | 0000000000003000 [testbinary] - 1s 50.00% | 0000000000001000 [testbinary] -----------------------------------------------------------+------------- - 1s 100% | 0000000000005000 [testbinary] - 1s 25.00% 75.00% 1s 25.00% | 0000000000004000 [testbinary] -----------------------------------------------------------+------------- - 1s 25.00% 100% 2s 50.00% | 0000000000005000 [testbinary] - 1s 50.00% | 0000000000004000 [testbinary] -----------------------------------------------------------+------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.callgrind b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.callgrind deleted file mode 100644 index bfd96cb7de..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.callgrind +++ /dev/null @@ -1,88 +0,0 @@ -positions: instr line -events: inuse_space(MB) - -ob= -fl=(1) testdata/file2000.src -fn=(1) line2001 -0x2000 2 62 -cfl=(2) testdata/file1000.src -cfn=(2) line1000 -calls=0 0x1000 1 -* * 0 - -ob= -fl=(3) testdata/file3000.src -fn=(3) line3002 -+4096 3 31 -cfl=(1) -cfn=(4) line2000 -calls=0 * 3 -* * 0 - -ob= -fl=(2) -fn=(2) --8192 1 4 - -ob= -fl=(1) -fn=(4) -+4096 3 0 -cfl=(1) -cfn=(1) -calls=0 +4096 2 -* * 63 - -ob= -fl=(3) -fn=(5) line3000 -+4096 4 0 -cfl=(3) -cfn=(6) line3001 -calls=0 +4096 2 -* * 32 - -ob= -fl=(3) -fn=(6) -* 2 0 -cfl=(3) -cfn=(3) -calls=0 * 3 -* * 32 - -ob= -fl=(3) -fn=(5) -+1 4 0 -cfl=(3) -cfn=(6) -calls=0 +1 2 -* * 3 - -ob= -fl=(3) -fn=(6) -* 2 0 -cfl=(2) -cfn=(2) -calls=0 -8193 1 -* * 3 - -ob= -fl=(3) -fn=(5) -+1 4 0 -cfl=(3) -cfn=(3) -calls=0 +1 3 -* * 62 - -ob= -fl=(3) -fn=(3) -* 3 0 -cfl=(1) -cfn=(4) -calls=0 -4098 3 -* * 62 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.comments b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.comments deleted file mode 100644 index 6eca2fb794..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.comments +++ /dev/null @@ -1,2 +0,0 @@ -comment -#hidden comment diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.lines.tree.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.lines.tree.focus deleted file mode 100644 index 9d4ba72b1f..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.lines.tree.focus +++ /dev/null @@ -1,21 +0,0 @@ -Active filters: - focus=[24]00 -Showing nodes accounting for 62.50MB, 63.37% of 98.63MB total -Dropped 2 nodes (cum <= 4.93MB) -----------------------------------------------------------+------------- - flat flat% sum% cum cum% calls calls% + context -----------------------------------------------------------+------------- - 63.48MB 100% | line3002 testdata/file3000.src:3 - 0 0% 0% 63.48MB 64.36% | line2000 testdata/file2000.src:3 - 63.48MB 100% | line2001 testdata/file2000.src:2 (inline) -----------------------------------------------------------+------------- - 63.48MB 100% | line2000 testdata/file2000.src:3 (inline) - 62.50MB 63.37% 63.37% 63.48MB 64.36% | line2001 testdata/file2000.src:2 -----------------------------------------------------------+------------- - 0 0% 63.37% 63.48MB 64.36% | line3000 testdata/file3000.src:4 - 63.48MB 100% | line3002 testdata/file3000.src:3 (inline) -----------------------------------------------------------+------------- - 63.48MB 100% | line3000 testdata/file3000.src:4 (inline) - 0 0% 63.37% 63.48MB 64.36% | line3002 testdata/file3000.src:3 - 63.48MB 100% | line2000 testdata/file2000.src:3 -----------------------------------------------------------+------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus deleted file mode 100644 index c2d11838fe..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.cum.relative_percentages.tree.focus +++ /dev/null @@ -1,21 +0,0 @@ -Active filters: - focus=[24]00 -Showing nodes accounting for 62.50MB, 98.46% of 63.48MB total -Dropped 2 nodes (cum <= 3.17MB) -----------------------------------------------------------+------------- - flat flat% sum% cum cum% calls calls% + context -----------------------------------------------------------+------------- - 63.48MB 100% | line3002 - 0 0% 0% 63.48MB 100% | line2000 - 63.48MB 100% | line2001 (inline) -----------------------------------------------------------+------------- - 63.48MB 100% | line2000 (inline) - 62.50MB 98.46% 98.46% 63.48MB 100% | line2001 -----------------------------------------------------------+------------- - 0 0% 98.46% 63.48MB 100% | line3000 - 63.48MB 100% | line3002 (inline) -----------------------------------------------------------+------------- - 63.48MB 100% | line3000 (inline) - 0 0% 98.46% 63.48MB 100% | line3002 - 63.48MB 100% | line2000 -----------------------------------------------------------+------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.seconds.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.seconds.text deleted file mode 100644 index b9571ef4ec..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.seconds.text +++ /dev/null @@ -1,2 +0,0 @@ -Showing nodes accounting for 0, 0% of 0 total - flat flat% sum% cum cum% diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text deleted file mode 100644 index fd536df573..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text +++ /dev/null @@ -1,5 +0,0 @@ -Showing nodes accounting for 93.75MB, 95.05% of 98.63MB total -Dropped 1 node (cum <= 4.93MB) - flat flat% sum% cum cum% - 62.50MB 63.37% 63.37% 63.48MB 64.36% testdata/file2000.src - 31.25MB 31.68% 95.05% 98.63MB 100% testdata/file3000.src diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text.focus deleted file mode 100644 index 20a503f9b4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.files.text.focus +++ /dev/null @@ -1,8 +0,0 @@ -Active filters: - focus=[12]00 - taghide=[X3]00 -Showing nodes accounting for 67.38MB, 68.32% of 98.63MB total - flat flat% sum% cum cum% - 62.50MB 63.37% 63.37% 63.48MB 64.36% testdata/file2000.src - 4.88MB 4.95% 68.32% 4.88MB 4.95% testdata/file1000.src - 0 0% 68.32% 67.38MB 68.32% testdata/file3000.src diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_objects.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_objects.text deleted file mode 100644 index 929461a3c1..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_objects.text +++ /dev/null @@ -1,8 +0,0 @@ -Showing nodes accounting for 150, 100% of 150 total - flat flat% sum% cum cum% - 80 53.33% 53.33% 130 86.67% line3002 (inline) - 40 26.67% 80.00% 50 33.33% line2001 (inline) - 30 20.00% 100% 30 20.00% line1000 - 0 0% 100% 50 33.33% line2000 - 0 0% 100% 150 100% line3000 - 0 0% 100% 110 73.33% line3001 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus deleted file mode 100644 index 909a824f1e..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus +++ /dev/null @@ -1,13 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l tagfocus=1mb:2gb\lShowing nodes accounting for 62.50MB, 63.37% of 98.63MB total\l"] } -N1 [label="line2001\n62.50MB (63.37%)" id="node1" fontsize=24 shape=box tooltip="line2001 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] -NN1_0 [label = "1.56MB" id="NN1_0" fontsize=8 shape=box3d tooltip="62.50MB"] -N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] -N2 [label="line3000\n0 of 62.50MB (63.37%)" id="node2" fontsize=8 shape=box tooltip="line3000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] -N3 [label="line2000\n0 of 62.50MB (63.37%)" id="node3" fontsize=8 shape=box tooltip="line2000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] -N4 [label="line3002\n0 of 62.50MB (63.37%)" id="node4" fontsize=8 shape=box tooltip="line3002 (62.50MB)" color="#b21600" fillcolor="#edd8d5"] -N3 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (62.50MB)" labeltooltip="line2000 -> line2001 (62.50MB)"] -N2 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] -N4 -> N3 [label=" 62.50MB" weight=64 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (62.50MB)" labeltooltip="line3002 -> line2000 (62.50MB)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore deleted file mode 100644 index b2929ae667..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.inuse_space.dot.focus.ignore +++ /dev/null @@ -1,16 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l tagfocus=30kb:\l tagignore=1mb:2mb\lShowing nodes accounting for 36.13MB, 36.63% of 98.63MB total\lDropped 2 nodes (cum <= 4.93MB)\l"] } -N1 [label="line3002\n31.25MB (31.68%)\nof 32.23MB (32.67%)" id="node1" fontsize=24 shape=box tooltip="line3002 (32.23MB)" color="#b23200" fillcolor="#eddcd5"] -NN1_0 [label = "400kB" id="NN1_0" fontsize=8 shape=box3d tooltip="31.25MB"] -N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] -N2 [label="line3000\n0 of 36.13MB (36.63%)" id="node2" fontsize=8 shape=box tooltip="line3000 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -N3 [label="line3001\n0 of 36.13MB (36.63%)" id="node3" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -N4 [label="line1000\n4.88MB (4.95%)" id="node4" fontsize=15 shape=box tooltip="line1000 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] -NN4_0 [label = "200kB" id="NN4_0" fontsize=8 shape=box3d tooltip="3.91MB"] -N4 -> NN4_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"] -N2 -> N3 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] -N3 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] -N3 -> N4 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 -> line1000 (3.91MB)" labeltooltip="line3001 -> line1000 (3.91MB)"] -N1 -> N4 [label=" 0.98MB" color="#b2b0a9" tooltip="line3002 ... line1000 (0.98MB)" labeltooltip="line3002 ... line1000 (0.98MB)" style="dotted" minlen=2] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.lines.dot.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.lines.dot.focus deleted file mode 100644 index 9af0341076..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.flat.lines.dot.focus +++ /dev/null @@ -1,21 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lActive filters:\l focus=[12]00\lShowing nodes accounting for 67.38MB, 68.32% of 98.63MB total\l"] } -N1 [label="line3000\nfile3000.src:4\n0 of 67.38MB (68.32%)" id="node1" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src:4 (67.38MB)" color="#b21300" fillcolor="#edd7d5"] -N2 [label="line2001\nfile2000.src:2\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node2" fontsize=24 shape=box tooltip="line2001 testdata/file2000.src:2 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -NN2_0 [label = "1.56MB" id="NN2_0" fontsize=8 shape=box3d tooltip="62.50MB"] -N2 -> NN2_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] -N3 [label="line1000\nfile1000.src:1\n4.88MB (4.95%)" id="node3" fontsize=13 shape=box tooltip="line1000 testdata/file1000.src:1 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] -NN3_0 [label = "200kB" id="NN3_0" fontsize=8 shape=box3d tooltip="3.91MB"] -N3 -> NN3_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"] -N4 [label="line3002\nfile3000.src:3\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line3002 testdata/file3000.src:3 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N5 [label="line3001\nfile3000.src:2\n0 of 4.88MB (4.95%)" id="node5" fontsize=8 shape=box tooltip="line3001 testdata/file3000.src:2 (4.88MB)" color="#b2a086" fillcolor="#edeae7"] -N6 [label="line2000\nfile2000.src:3\n0 of 63.48MB (64.36%)" id="node6" fontsize=8 shape=box tooltip="line2000 testdata/file2000.src:3 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N6 -> N2 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 testdata/file2000.src:3 -> line2001 testdata/file2000.src:2 (63.48MB)" labeltooltip="line2000 testdata/file2000.src:3 -> line2001 testdata/file2000.src:2 (63.48MB)"] -N4 -> N6 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 testdata/file3000.src:3 -> line2000 testdata/file2000.src:3 (63.48MB)" labeltooltip="line3002 testdata/file3000.src:3 -> line2000 testdata/file2000.src:3 (63.48MB)"] -N1 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 testdata/file3000.src:4 -> line3002 testdata/file3000.src:3 (62.50MB)" labeltooltip="line3000 testdata/file3000.src:4 -> line3002 testdata/file3000.src:3 (62.50MB)"] -N1 -> N5 [label=" 4.88MB\n (inline)" weight=5 color="#b2a086" tooltip="line3000 testdata/file3000.src:4 -> line3001 testdata/file3000.src:2 (4.88MB)" labeltooltip="line3000 testdata/file3000.src:4 -> line3001 testdata/file3000.src:2 (4.88MB)"] -N5 -> N3 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 testdata/file3000.src:2 -> line1000 testdata/file1000.src:1 (3.91MB)" labeltooltip="line3001 testdata/file3000.src:2 -> line1000 testdata/file1000.src:1 (3.91MB)"] -N2 -> N3 [label=" 0.98MB" color="#b2b0a9" tooltip="line2001 testdata/file2000.src:2 -> line1000 testdata/file1000.src:1 (0.98MB)" labeltooltip="line2001 testdata/file2000.src:2 -> line1000 testdata/file1000.src:1 (0.98MB)" minlen=2] -N5 -> N4 [label=" 0.98MB\n (inline)" color="#b2b0a9" tooltip="line3001 testdata/file3000.src:2 -> line3002 testdata/file3000.src:3 (0.98MB)" labeltooltip="line3001 testdata/file3000.src:2 -> line3002 testdata/file3000.src:3 (0.98MB)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags deleted file mode 100644 index 630e452a9f..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags +++ /dev/null @@ -1,6 +0,0 @@ - bytes: Total 98.6MB - 62.5MB (63.37%): 1.56MB - 31.2MB (31.68%): 400kB - 3.9MB ( 3.96%): 200kB - 1000.0kB ( 0.99%): 100kB - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit deleted file mode 100644 index 5e565fc019..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit +++ /dev/null @@ -1,6 +0,0 @@ - bytes: Total 103424000.0B - 65536000.0B (63.37%): 1638400B - 32768000.0B (31.68%): 409600B - 4096000.0B ( 3.96%): 204800B - 1024000.0B ( 0.99%): 102400B - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text deleted file mode 100644 index 929461a3c1..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_objects.text +++ /dev/null @@ -1,8 +0,0 @@ -Showing nodes accounting for 150, 100% of 150 total - flat flat% sum% cum cum% - 80 53.33% 53.33% 130 86.67% line3002 (inline) - 40 26.67% 80.00% 50 33.33% line2001 (inline) - 30 20.00% 100% 30 20.00% line1000 - 0 0% 100% 50 33.33% line2000 - 0 0% 100% 150 100% line3000 - 0 0% 100% 110 73.33% line3001 (inline) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot deleted file mode 100644 index f0621a0e3c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l tagshow=[2]00\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] } -N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] -N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] -N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)"] -N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] -N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] -N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus deleted file mode 100644 index e412ff4813..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.focus +++ /dev/null @@ -1,18 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l focus=[234]00\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] } -N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] -NN1_0 [label = "400kB" id="NN1_0" fontsize=8 shape=box3d tooltip="31.25MB"] -N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] -N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -NN3_0 [label = "1.56MB" id="NN3_0" fontsize=8 shape=box3d tooltip="62.50MB"] -N3 -> NN3_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] -N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] -N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)" minlen=2] -N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] -N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] -N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide deleted file mode 100644 index 6110b114b9..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_alloc.flat.alloc_space.dot.hide +++ /dev/null @@ -1,11 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lActive filters:\l hide=line.*1?23?\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] } -N1 [label="line3000\n62.50MB (63.37%)\nof 98.63MB (100%)" id="node1" fontsize=24 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] -NN1_0 [label = "1.56MB" id="NN1_0" fontsize=8 shape=box3d tooltip="62.50MB"] -N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] -N2 [label="line3001\n31.25MB (31.68%)\nof 36.13MB (36.63%)" id="node2" fontsize=20 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -NN2_0 [label = "400kB" id="NN2_0" fontsize=8 shape=box3d tooltip="31.25MB"] -N2 -> NN2_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] -N1 -> N2 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)" minlen=2] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_request.tags.focus b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_request.tags.focus deleted file mode 100644 index b1a5f444d8..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_request.tags.focus +++ /dev/null @@ -1,8 +0,0 @@ - bytes: Total 93.8MB - 62.5MB (66.67%): 1.56MB - 31.2MB (33.33%): 400kB - - request: Total 93.8MB - 62.5MB (66.67%): 1.56MB - 31.2MB (33.33%): 400kB - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_sizetags.dot b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_sizetags.dot deleted file mode 100644 index 6be6112fd4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_sizetags.dot +++ /dev/null @@ -1,30 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] } -N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" id="node1" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"] -NN1_0 [label = "16B..64B" id="NN1_0" fontsize=8 shape=box3d tooltip="93.75MB"] -N1 -> NN1_0 [label=" 93.75MB" weight=100 tooltip="93.75MB" labeltooltip="93.75MB"] -NN1_1 [label = "2B..8B" id="NN1_1" fontsize=8 shape=box3d tooltip="93.75MB"] -N1 -> NN1_1 [label=" 93.75MB" weight=100 tooltip="93.75MB" labeltooltip="93.75MB"] -NN1_2 [label = "256B..1.56MB" id="NN1_2" fontsize=8 shape=box3d tooltip="62.50MB"] -N1 -> NN1_2 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"] -NN1_3 [label = "128B" id="NN1_3" fontsize=8 shape=box3d tooltip="31.25MB"] -N1 -> NN1_3 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"] -N2 [label="line3000\n0 of 98.63MB (100%)" id="node2" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" id="node3" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -NN3_0 [label = "16B..64B" id="NN3_0" fontsize=8 shape=box3d tooltip="190.43MB"] -N3 -> NN3_0 [label=" 190.43MB" weight=100 tooltip="190.43MB" labeltooltip="190.43MB" style="dotted"] -NN3_1 [label = "2B..8B" id="NN3_1" fontsize=8 shape=box3d tooltip="190.43MB"] -N3 -> NN3_1 [label=" 190.43MB" weight=100 tooltip="190.43MB" labeltooltip="190.43MB" style="dotted"] -NN3_2 [label = "256B..1.56MB" id="NN3_2" fontsize=8 shape=box3d tooltip="125.98MB"] -N3 -> NN3_2 [label=" 125.98MB" weight=100 tooltip="125.98MB" labeltooltip="125.98MB" style="dotted"] -NN3_3 [label = "128B" id="NN3_3" fontsize=8 shape=box3d tooltip="63.48MB"] -N3 -> NN3_3 [label=" 63.48MB" weight=100 tooltip="63.48MB" labeltooltip="63.48MB" style="dotted"] -N4 [label="line2000\n0 of 63.48MB (64.36%)" id="node4" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"] -N5 [label="line3001\n0 of 36.13MB (36.63%)" id="node5" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"] -N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"] -N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)" minlen=2] -N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"] -N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"] -N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_tags.traces b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_tags.traces deleted file mode 100644 index 547aea74c3..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap_tags.traces +++ /dev/null @@ -1,32 +0,0 @@ -Build ID: buildid -comment -Type: inuse_space ------------+------------------------------------------------------- - key1: tag - bytes: 100kB - request: 100kB - 1000kB line1000 - line2001 - line2000 - line3002 - line3001 - line3000 ------------+------------------------------------------------------- - bytes: 200kB - 3.91MB line1000 - line3001 - line3000 ------------+------------------------------------------------------- - key1: tag - bytes: 1.56MB - request: 1.56MB - 62.50MB line2001 - line2000 - line3002 - line3000 ------------+------------------------------------------------------- - bytes: 400kB - 31.25MB line3002 - line3001 - line3000 ------------+------------------------------------------------------- diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.dot b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.dot deleted file mode 100644 index 474a5108ba..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "testbinary" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.11s (11.10%)\lShowing nodes accounting for 1.11s, 100% of 1.11s total\l" tooltip="testbinary"] } -N1 [label="package1\nobject\nfunction1\n1.10s (99.10%)" id="node1" fontsize=24 shape=box tooltip="path/to/package1.object.function1 (1.10s)" color="#b20000" fillcolor="#edd5d5"] -N2 [label="FooBar\nrun\n0.01s (0.9%)\nof 1.01s (90.99%)" id="node2" fontsize=10 shape=box tooltip="java.bar.foo.FooBar.run(java.lang.Runnable) (1.01s)" color="#b20400" fillcolor="#edd6d5"] -N3 [label="Bar\nFoo\n0 of 1.10s (99.10%)" id="node3" fontsize=8 shape=box tooltip="(anonymous namespace)::Bar::Foo (1.10s)" color="#b20000" fillcolor="#edd5d5"] -N3 -> N1 [label=" 1.10s" weight=100 penwidth=5 color="#b20000" tooltip="(anonymous namespace)::Bar::Foo -> path/to/package1.object.function1 (1.10s)" labeltooltip="(anonymous namespace)::Bar::Foo -> path/to/package1.object.function1 (1.10s)"] -N2 -> N3 [label=" 1s" weight=91 penwidth=5 color="#b20500" tooltip="java.bar.foo.FooBar.run(java.lang.Runnable) -> (anonymous namespace)::Bar::Foo (1s)" labeltooltip="java.bar.foo.FooBar.run(java.lang.Runnable) -> (anonymous namespace)::Bar::Foo (1s)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.text deleted file mode 100644 index 39cb24ed6a..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.longNameFuncs.text +++ /dev/null @@ -1,5 +0,0 @@ -Showing nodes accounting for 1.11s, 100% of 1.11s total - flat flat% sum% cum cum% - 1.10s 99.10% 99.10% 1.10s 99.10% path/to/package1.object.function1 - 0.01s 0.9% 100% 1.01s 90.99% java.bar.foo.FooBar.run(java.lang.Runnable) - 0 0% 100% 1.10s 99.10% (anonymous namespace)::Bar::Foo diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text b/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text deleted file mode 100644 index 78a2298f95..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.call_tree.text +++ /dev/null @@ -1,8 +0,0 @@ -Showing nodes accounting for 1.12s, 100% of 1.12s total -Showing top 5 nodes out of 6 - flat flat% sum% cum cum% - 1.10s 98.21% 98.21% 1.10s 98.21% line1000 - 0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline) - 0.01s 0.89% 100% 1.02s 91.07% line3002 (inline) - 0 0% 100% 1.01s 90.18% line2000 - 0 0% 100% 1.12s 100% line3000 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/webui.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/webui.go index 7becacd202..9bf1d70f16 100644 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/webui.go +++ b/src/cmd/vendor/github.com/google/pprof/internal/driver/webui.go @@ -179,11 +179,18 @@ func defaultWebServer(args *plugin.HTTPServerArgs) error { // https://github.com/google/pprof/pull/348 mux := http.NewServeMux() mux.Handle("/ui/", http.StripPrefix("/ui", handler)) - mux.Handle("/", http.RedirectHandler("/ui/", http.StatusTemporaryRedirect)) + mux.Handle("/", redirectWithQuery("/ui")) s := &http.Server{Handler: mux} return s.Serve(ln) } +func redirectWithQuery(path string) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + pathWithQuery := &gourl.URL{Path: path, RawQuery: r.URL.RawQuery} + http.Redirect(w, r, pathWithQuery.String(), http.StatusTemporaryRedirect) + } +} + func isLocalhost(host string) bool { for _, v := range []string{"localhost", "127.0.0.1", "[::1]", "::1"} { if host == v { diff --git a/src/cmd/vendor/github.com/google/pprof/internal/driver/webui_test.go b/src/cmd/vendor/github.com/google/pprof/internal/driver/webui_test.go deleted file mode 100644 index 58681bea8f..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/driver/webui_test.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package driver - -import ( - "fmt" - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "net/url" - "os/exec" - "regexp" - "runtime" - "sync" - "testing" - - "github.com/google/pprof/internal/plugin" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/profile" -) - -func TestWebInterface(t *testing.T) { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { - t.Skip("test assumes tcp available") - } - - prof := makeFakeProfile() - - // Custom http server creator - var server *httptest.Server - serverCreated := make(chan bool) - creator := func(a *plugin.HTTPServerArgs) error { - server = httptest.NewServer(http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - if h := a.Handlers[r.URL.Path]; h != nil { - h.ServeHTTP(w, r) - } - })) - serverCreated <- true - return nil - } - - // Start server and wait for it to be initialized - go serveWebInterface("unused:1234", prof, &plugin.Options{ - Obj: fakeObjTool{}, - UI: &proftest.TestUI{}, - HTTPServer: creator, - }) - <-serverCreated - defer server.Close() - - haveDot := false - if _, err := exec.LookPath("dot"); err == nil { - haveDot = true - } - - type testCase struct { - path string - want []string - needDot bool - } - testcases := []testCase{ - {"/", []string{"F1", "F2", "F3", "testbin", "cpu"}, true}, - {"/top", []string{`"Name":"F2","InlineLabel":"","Flat":200,"Cum":300,"FlatFormat":"200ms","CumFormat":"300ms"}`}, false}, - {"/source?f=" + url.QueryEscape("F[12]"), - []string{"F1", "F2", "300ms +line1"}, false}, - {"/peek?f=" + url.QueryEscape("F[12]"), - []string{"300ms.*F1", "200ms.*300ms.*F2"}, false}, - {"/disasm?f=" + url.QueryEscape("F[12]"), - []string{"f1:asm", "f2:asm"}, false}, - {"/flamegraph", []string{"File: testbin", "\"n\":\"root\"", "\"n\":\"F1\"", "var flamegraph = function", "function hierarchy"}, false}, - } - for _, c := range testcases { - if c.needDot && !haveDot { - t.Log("skipping", c.path, "since dot (graphviz) does not seem to be installed") - continue - } - - res, err := http.Get(server.URL + c.path) - if err != nil { - t.Error("could not fetch", c.path, err) - continue - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Error("could not read response", c.path, err) - continue - } - result := string(data) - for _, w := range c.want { - if match, _ := regexp.MatchString(w, result); !match { - t.Errorf("response for %s does not match "+ - "expected pattern '%s'; "+ - "actual result:\n%s", c.path, w, result) - } - } - } - - // Also fetch all the test case URLs in parallel to test thread - // safety when run under the race detector. - var wg sync.WaitGroup - for _, c := range testcases { - if c.needDot && !haveDot { - continue - } - path := server.URL + c.path - for count := 0; count < 2; count++ { - wg.Add(1) - go func() { - defer wg.Done() - res, err := http.Get(path) - if err != nil { - t.Error("could not fetch", c.path, err) - return - } - if _, err = ioutil.ReadAll(res.Body); err != nil { - t.Error("could not read response", c.path, err) - } - }() - } - } - wg.Wait() -} - -// Implement fake object file support. - -const addrBase = 0x1000 -const fakeSource = "testdata/file1000.src" - -type fakeObj struct{} - -func (f fakeObj) Close() error { return nil } -func (f fakeObj) Name() string { return "testbin" } -func (f fakeObj) Base() uint64 { return 0 } -func (f fakeObj) BuildID() string { return "" } -func (f fakeObj) SourceLine(addr uint64) ([]plugin.Frame, error) { - return nil, fmt.Errorf("SourceLine unimplemented") -} -func (f fakeObj) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { - return []*plugin.Sym{ - { - Name: []string{"F1"}, File: fakeSource, - Start: addrBase, End: addrBase + 10, - }, - { - Name: []string{"F2"}, File: fakeSource, - Start: addrBase + 10, End: addrBase + 20, - }, - { - Name: []string{"F3"}, File: fakeSource, - Start: addrBase + 20, End: addrBase + 30, - }, - }, nil -} - -type fakeObjTool struct{} - -func (obj fakeObjTool) Open(file string, start, limit, offset uint64) (plugin.ObjFile, error) { - return fakeObj{}, nil -} - -func (obj fakeObjTool) Disasm(file string, start, end uint64) ([]plugin.Inst, error) { - return []plugin.Inst{ - {Addr: addrBase + 0, Text: "f1:asm", Function: "F1"}, - {Addr: addrBase + 10, Text: "f2:asm", Function: "F2"}, - {Addr: addrBase + 20, Text: "d3:asm", Function: "F3"}, - }, nil -} - -func makeFakeProfile() *profile.Profile { - // Three functions: F1, F2, F3 with three lines, 11, 22, 33. - funcs := []*profile.Function{ - {ID: 1, Name: "F1", Filename: fakeSource, StartLine: 3}, - {ID: 2, Name: "F2", Filename: fakeSource, StartLine: 5}, - {ID: 3, Name: "F3", Filename: fakeSource, StartLine: 7}, - } - lines := []profile.Line{ - {Function: funcs[0], Line: 11}, - {Function: funcs[1], Line: 22}, - {Function: funcs[2], Line: 33}, - } - mapping := []*profile.Mapping{ - { - ID: 1, - Start: addrBase, - Limit: addrBase + 10, - Offset: 0, - File: "testbin", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - }, - } - - // Three interesting addresses: base+{10,20,30} - locs := []*profile.Location{ - {ID: 1, Address: addrBase + 10, Line: lines[0:1], Mapping: mapping[0]}, - {ID: 2, Address: addrBase + 20, Line: lines[1:2], Mapping: mapping[0]}, - {ID: 3, Address: addrBase + 30, Line: lines[2:3], Mapping: mapping[0]}, - } - - // Two stack traces. - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{locs[2], locs[1], locs[0]}, - Value: []int64{100}, - }, - { - Location: []*profile.Location{locs[1], locs[0]}, - Value: []int64{200}, - }, - }, - Location: locs, - Function: funcs, - Mapping: mapping, - } -} - -func TestGetHostAndPort(t *testing.T) { - if runtime.GOOS == "nacl" || runtime.GOOS == "js" { - t.Skip("test assumes tcp available") - } - - type testCase struct { - hostport string - wantHost string - wantPort int - wantRandomPort bool - } - - testCases := []testCase{ - {":", "localhost", 0, true}, - {":4681", "localhost", 4681, false}, - {"localhost:4681", "localhost", 4681, false}, - } - for _, tc := range testCases { - host, port, err := getHostAndPort(tc.hostport) - if err != nil { - t.Errorf("could not get host and port for %q: %v", tc.hostport, err) - } - if got, want := host, tc.wantHost; got != want { - t.Errorf("for %s, got host %s, want %s", tc.hostport, got, want) - continue - } - if !tc.wantRandomPort { - if got, want := port, tc.wantPort; got != want { - t.Errorf("for %s, got port %d, want %d", tc.hostport, got, want) - continue - } - } - } -} - -func TestIsLocalHost(t *testing.T) { - for _, s := range []string{"localhost:10000", "[::1]:10000", "127.0.0.1:10000"} { - host, _, err := net.SplitHostPort(s) - if err != nil { - t.Error("unexpected error when splitting", s) - continue - } - if !isLocalhost(host) { - t.Errorf("host %s from %s not considered local", host, s) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go b/src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go deleted file mode 100644 index ff95c36add..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package elfexec - -import ( - "debug/elf" - "testing" -) - -func TestGetBase(t *testing.T) { - - fhExec := &elf.FileHeader{ - Type: elf.ET_EXEC, - } - fhRel := &elf.FileHeader{ - Type: elf.ET_REL, - } - fhDyn := &elf.FileHeader{ - Type: elf.ET_DYN, - } - lsOffset := &elf.ProgHeader{ - Vaddr: 0x400000, - Off: 0x200000, - } - kernelHeader := &elf.ProgHeader{ - Vaddr: 0xffffffff81000000, - } - kernelAslrHeader := &elf.ProgHeader{ - Vaddr: 0xffffffff80200000, - Off: 0x1000, - } - ppc64KernelHeader := &elf.ProgHeader{ - Vaddr: 0xc000000000000000, - } - - testcases := []struct { - label string - fh *elf.FileHeader - loadSegment *elf.ProgHeader - stextOffset *uint64 - start, limit, offset uint64 - want uint64 - wanterr bool - }{ - {"exec", fhExec, nil, nil, 0x400000, 0, 0, 0, false}, - {"exec offset", fhExec, lsOffset, nil, 0x400000, 0x800000, 0, 0x200000, false}, - {"exec offset 2", fhExec, lsOffset, nil, 0x200000, 0x600000, 0, 0, false}, - {"exec nomap", fhExec, nil, nil, 0, 0, 0, 0, false}, - {"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0xffffffff82000198, 0xffffffff83000198, 0, 0x1000000, false}, - {"exec kernel", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0x0, 0x0, false}, - {"exec kernel ASLR", fhExec, kernelHeader, uint64p(0xffffffff810002b8), 0xffffffff81000000, 0xffffffffa0000000, 0xffffffff81000000, 0x0, false}, - // TODO(aalexand): Figure out where this test case exactly comes from and - // whether it's still relevant. - {"exec kernel ASLR 2", fhExec, kernelAslrHeader, nil, 0xffffffff83e00000, 0xfffffffffc3fffff, 0x3c00000, 0x3c00000, false}, - {"exec PPC64 kernel", fhExec, ppc64KernelHeader, uint64p(0xc000000000000000), 0xc000000000000000, 0xd00000001a730000, 0x0, 0x0, false}, - {"exec chromeos kernel", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10197, 0, 0x7efffe68, false}, - {"exec chromeos kernel 2", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0, 0x10198, 0, 0x7efffe68, false}, - {"exec chromeos kernel 3", fhExec, kernelHeader, uint64p(0xffffffff81000198), 0x198, 0x100000, 0, 0x7f000000, false}, - {"exec chromeos kernel 4", fhExec, kernelHeader, uint64p(0xffffffff81200198), 0x198, 0x100000, 0, 0x7ee00000, false}, - {"exec chromeos kernel unremapped", fhExec, kernelHeader, uint64p(0xffffffff810001c8), 0xffffffff834001c8, 0xffffffffc0000000, 0xffffffff834001c8, 0x2400000, false}, - {"dyn", fhDyn, nil, nil, 0x200000, 0x300000, 0, 0x200000, false}, - {"dyn map", fhDyn, lsOffset, nil, 0x0, 0x300000, 0, 0xFFFFFFFFFFE00000, false}, - {"dyn nomap", fhDyn, nil, nil, 0x0, 0x0, 0, 0, false}, - {"dyn map+offset", fhDyn, lsOffset, nil, 0x900000, 0xa00000, 0x200000, 0x500000, false}, - {"rel", fhRel, nil, nil, 0x2000000, 0x3000000, 0, 0x2000000, false}, - {"rel nomap", fhRel, nil, nil, 0x0, ^uint64(0), 0, 0, false}, - {"rel offset", fhRel, nil, nil, 0x100000, 0x200000, 0x1, 0, true}, - } - - for _, tc := range testcases { - base, err := GetBase(tc.fh, tc.loadSegment, tc.stextOffset, tc.start, tc.limit, tc.offset) - if err != nil { - if !tc.wanterr { - t.Errorf("%s: want no error, got %v", tc.label, err) - } - continue - } - if tc.wanterr { - t.Errorf("%s: want error, got nil", tc.label) - continue - } - if base != tc.want { - t.Errorf("%s: want 0x%x, got 0x%x", tc.label, tc.want, base) - } - } -} - -func uint64p(n uint64) *uint64 { - return &n -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go b/src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go deleted file mode 100644 index b8368b8fa4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package graph - -import ( - "bytes" - "flag" - "fmt" - "io/ioutil" - "path/filepath" - "reflect" - "strconv" - "strings" - "testing" - - "github.com/google/pprof/internal/proftest" -) - -var updateFlag = flag.Bool("update", false, "Update the golden files") - -func TestComposeWithStandardGraph(t *testing.T) { - g := baseGraph() - a, c := baseAttrsAndConfig() - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose1.dot") -} - -func TestComposeWithNodeAttributesAndZeroFlat(t *testing.T) { - g := baseGraph() - a, c := baseAttrsAndConfig() - - // Set NodeAttributes for Node 1. - a.Nodes[g.Nodes[0]] = &DotNodeAttributes{ - Shape: "folder", - Bold: true, - Peripheries: 2, - URL: "www.google.com", - Formatter: func(ni *NodeInfo) string { - return strings.ToUpper(ni.Name) - }, - } - - // Set Flat value to zero on Node 2. - g.Nodes[1].Flat = 0 - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose2.dot") -} - -func TestComposeWithTagsAndResidualEdge(t *testing.T) { - g := baseGraph() - a, c := baseAttrsAndConfig() - - // Add tags to Node 1. - g.Nodes[0].LabelTags["a"] = &Tag{ - Name: "tag1", - Cum: 10, - Flat: 10, - } - g.Nodes[0].NumericTags[""] = TagMap{ - "b": &Tag{ - Name: "tag2", - Cum: 20, - Flat: 20, - Unit: "ms", - }, - } - - // Set edge to be Residual. - g.Nodes[0].Out[g.Nodes[1]].Residual = true - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose3.dot") -} - -func TestComposeWithNestedTags(t *testing.T) { - g := baseGraph() - a, c := baseAttrsAndConfig() - - // Add tags to Node 1. - g.Nodes[0].LabelTags["tag1"] = &Tag{ - Name: "tag1", - Cum: 10, - Flat: 10, - } - g.Nodes[0].NumericTags["tag1"] = TagMap{ - "tag2": &Tag{ - Name: "tag2", - Cum: 20, - Flat: 20, - Unit: "ms", - }, - } - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose5.dot") -} - -func TestComposeWithEmptyGraph(t *testing.T) { - g := &Graph{} - a, c := baseAttrsAndConfig() - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose4.dot") -} - -func TestComposeWithStandardGraphAndURL(t *testing.T) { - g := baseGraph() - a, c := baseAttrsAndConfig() - c.LegendURL = "http://example.com" - - var buf bytes.Buffer - ComposeDot(&buf, g, a, c) - - compareGraphs(t, buf.Bytes(), "compose6.dot") -} - -func baseGraph() *Graph { - src := &Node{ - Info: NodeInfo{Name: "src"}, - Flat: 10, - Cum: 25, - In: make(EdgeMap), - Out: make(EdgeMap), - LabelTags: make(TagMap), - NumericTags: make(map[string]TagMap), - } - dest := &Node{ - Info: NodeInfo{Name: "dest"}, - Flat: 15, - Cum: 25, - In: make(EdgeMap), - Out: make(EdgeMap), - LabelTags: make(TagMap), - NumericTags: make(map[string]TagMap), - } - edge := &Edge{ - Src: src, - Dest: dest, - Weight: 10, - } - src.Out[dest] = edge - src.In[src] = edge - return &Graph{ - Nodes: Nodes{ - src, - dest, - }, - } -} - -func baseAttrsAndConfig() (*DotAttributes, *DotConfig) { - a := &DotAttributes{ - Nodes: make(map[*Node]*DotNodeAttributes), - } - c := &DotConfig{ - Title: "testtitle", - Labels: []string{"label1", "label2"}, - Total: 100, - FormatValue: func(v int64) string { - return strconv.FormatInt(v, 10) - }, - } - return a, c -} - -func compareGraphs(t *testing.T, got []byte, wantFile string) { - wantFile = filepath.Join("testdata", wantFile) - want, err := ioutil.ReadFile(wantFile) - if err != nil { - t.Fatalf("error reading test file %s: %v", wantFile, err) - } - - if string(got) != string(want) { - d, err := proftest.Diff(got, want) - if err != nil { - t.Fatalf("error finding diff: %v", err) - } - t.Errorf("Compose incorrectly wrote %s", string(d)) - if *updateFlag { - err := ioutil.WriteFile(wantFile, got, 0644) - if err != nil { - t.Errorf("failed to update the golden file %q: %v", wantFile, err) - } - } - } -} - -func TestNodeletCountCapping(t *testing.T) { - labelTags := make(TagMap) - for i := 0; i < 10; i++ { - name := fmt.Sprintf("tag-%d", i) - labelTags[name] = &Tag{ - Name: name, - Flat: 10, - Cum: 10, - } - } - numTags := make(TagMap) - for i := 0; i < 10; i++ { - name := fmt.Sprintf("num-tag-%d", i) - numTags[name] = &Tag{ - Name: name, - Unit: "mb", - Value: 16, - Flat: 10, - Cum: 10, - } - } - node1 := &Node{ - Info: NodeInfo{Name: "node1-with-tags"}, - Flat: 10, - Cum: 10, - NumericTags: map[string]TagMap{"": numTags}, - LabelTags: labelTags, - } - node2 := &Node{ - Info: NodeInfo{Name: "node2"}, - Flat: 15, - Cum: 15, - } - node3 := &Node{ - Info: NodeInfo{Name: "node3"}, - Flat: 15, - Cum: 15, - } - g := &Graph{ - Nodes: Nodes{ - node1, - node2, - node3, - }, - } - for n := 1; n <= 3; n++ { - input := maxNodelets + n - if got, want := len(g.SelectTopNodes(input, true)), n; got != want { - t.Errorf("SelectTopNodes(%d): got %d nodes, want %d", input, got, want) - } - } -} - -func TestMultilinePrintableName(t *testing.T) { - ni := &NodeInfo{ - Name: "test1.test2::test3", - File: "src/file.cc", - Address: 123, - Lineno: 999, - } - - want := fmt.Sprintf(`%016x\ntest1\ntest2\ntest3\nfile.cc:999\n`, 123) - if got := multilinePrintableName(ni); got != want { - t.Errorf("multilinePrintableName(%#v) == %q, want %q", ni, got, want) - } -} - -func TestTagCollapse(t *testing.T) { - - makeTag := func(name, unit string, value, flat, cum int64) *Tag { - return &Tag{name, unit, value, flat, 0, cum, 0} - } - - tagSource := []*Tag{ - makeTag("12mb", "mb", 12, 100, 100), - makeTag("1kb", "kb", 1, 1, 1), - makeTag("1mb", "mb", 1, 1000, 1000), - makeTag("2048mb", "mb", 2048, 1000, 1000), - makeTag("1b", "b", 1, 100, 100), - makeTag("2b", "b", 2, 100, 100), - makeTag("7b", "b", 7, 100, 100), - } - - tagWant := [][]*Tag{ - { - makeTag("1B..2GB", "", 0, 2401, 2401), - }, - { - makeTag("2GB", "", 0, 1000, 1000), - makeTag("1B..12MB", "", 0, 1401, 1401), - }, - { - makeTag("2GB", "", 0, 1000, 1000), - makeTag("12MB", "", 0, 100, 100), - makeTag("1B..1MB", "", 0, 1301, 1301), - }, - { - makeTag("2GB", "", 0, 1000, 1000), - makeTag("1MB", "", 0, 1000, 1000), - makeTag("2B..1kB", "", 0, 201, 201), - makeTag("1B", "", 0, 100, 100), - makeTag("12MB", "", 0, 100, 100), - }, - } - - for _, tc := range tagWant { - var got, want []*Tag - b := builder{nil, &DotAttributes{}, &DotConfig{}} - got = b.collapsedTags(tagSource, len(tc), true) - want = SortTags(tc, true) - - if !reflect.DeepEqual(got, want) { - t.Errorf("collapse to %d, got:\n%v\nwant:\n%v", len(tc), tagString(got), tagString(want)) - } - } -} - -func tagString(t []*Tag) string { - var ret []string - for _, s := range t { - ret = append(ret, fmt.Sprintln(s)) - } - return strings.Join(ret, ":") -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go b/src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go index aebd1bf0e8..757be02947 100644 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go +++ b/src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go @@ -28,7 +28,7 @@ import ( ) var ( - javaRegExp = regexp.MustCompile(`^(?:[a-z]\w*\.)*([A-Z][\w\$]*\.(?:|[a-z]\w*(?:\$\d+)?))(?:(?:\()|$)`) + javaRegExp = regexp.MustCompile(`^(?:[a-z]\w*\.)*([A-Z][\w\$]*\.(?:|[a-z][\w\$]*(?:\$\d+)?))(?:(?:\()|$)`) goRegExp = regexp.MustCompile(`^(?:[\w\-\.]+\/)+(.+)`) cppRegExp = regexp.MustCompile(`^(?:(?:\(anonymous namespace\)::)(\w+$))|(?:(?:\(anonymous namespace\)::)?(?:[_a-zA-Z]\w*\::|)*(_*[A-Z]\w*::~?[_a-zA-Z]\w*)$)`) ) diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/graph_test.go b/src/cmd/vendor/github.com/google/pprof/internal/graph/graph_test.go deleted file mode 100644 index ef1171a14d..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/graph_test.go +++ /dev/null @@ -1,471 +0,0 @@ -package graph - -import ( - "fmt" - "testing" - - "github.com/google/pprof/profile" -) - -func edgeDebugString(edge *Edge) string { - debug := "" - debug += fmt.Sprintf("\t\tSrc: %p\n", edge.Src) - debug += fmt.Sprintf("\t\tDest: %p\n", edge.Dest) - debug += fmt.Sprintf("\t\tWeight: %d\n", edge.Weight) - debug += fmt.Sprintf("\t\tResidual: %t\n", edge.Residual) - debug += fmt.Sprintf("\t\tInline: %t\n", edge.Inline) - return debug -} - -func edgeMapsDebugString(in, out EdgeMap) string { - debug := "" - debug += "In Edges:\n" - for parent, edge := range in { - debug += fmt.Sprintf("\tParent: %p\n", parent) - debug += edgeDebugString(edge) - } - debug += "Out Edges:\n" - for child, edge := range out { - debug += fmt.Sprintf("\tChild: %p\n", child) - debug += edgeDebugString(edge) - } - return debug -} - -func graphDebugString(graph *Graph) string { - debug := "" - for i, node := range graph.Nodes { - debug += fmt.Sprintf("Node %d: %p\n", i, node) - } - - for i, node := range graph.Nodes { - debug += "\n" - debug += fmt.Sprintf("=== Node %d: %p ===\n", i, node) - debug += edgeMapsDebugString(node.In, node.Out) - } - return debug -} - -func expectedNodesDebugString(expected []expectedNode) string { - debug := "" - for i, node := range expected { - debug += fmt.Sprintf("Node %d: %p\n", i, node.node) - } - - for i, node := range expected { - debug += "\n" - debug += fmt.Sprintf("=== Node %d: %p ===\n", i, node.node) - debug += edgeMapsDebugString(node.in, node.out) - } - return debug -} - -// edgeMapsEqual checks if all the edges in this equal all the edges in that. -func edgeMapsEqual(this, that EdgeMap) bool { - if len(this) != len(that) { - return false - } - for node, thisEdge := range this { - if *thisEdge != *that[node] { - return false - } - } - return true -} - -// nodesEqual checks if node is equal to expected. -func nodesEqual(node *Node, expected expectedNode) bool { - return node == expected.node && edgeMapsEqual(node.In, expected.in) && - edgeMapsEqual(node.Out, expected.out) -} - -// graphsEqual checks if graph is equivalent to the graph templated by expected. -func graphsEqual(graph *Graph, expected []expectedNode) bool { - if len(graph.Nodes) != len(expected) { - return false - } - expectedSet := make(map[*Node]expectedNode) - for i := range expected { - expectedSet[expected[i].node] = expected[i] - } - - for _, node := range graph.Nodes { - expectedNode, found := expectedSet[node] - if !found || !nodesEqual(node, expectedNode) { - return false - } - } - return true -} - -type expectedNode struct { - node *Node - in, out EdgeMap -} - -type trimTreeTestcase struct { - initial *Graph - expected []expectedNode - keep NodePtrSet -} - -// makeExpectedEdgeResidual makes the edge from parent to child residual. -func makeExpectedEdgeResidual(parent, child expectedNode) { - parent.out[child.node].Residual = true - child.in[parent.node].Residual = true -} - -func makeEdgeInline(edgeMap EdgeMap, node *Node) { - edgeMap[node].Inline = true -} - -func setEdgeWeight(edgeMap EdgeMap, node *Node, weight int64) { - edgeMap[node].Weight = weight -} - -// createEdges creates directed edges from the parent to each of the children. -func createEdges(parent *Node, children ...*Node) { - for _, child := range children { - edge := &Edge{ - Src: parent, - Dest: child, - } - parent.Out[child] = edge - child.In[parent] = edge - } -} - -// createEmptyNode creates a node without any edges. -func createEmptyNode() *Node { - return &Node{ - In: make(EdgeMap), - Out: make(EdgeMap), - } -} - -// createExpectedNodes creates a slice of expectedNodes from nodes. -func createExpectedNodes(nodes ...*Node) ([]expectedNode, NodePtrSet) { - expected := make([]expectedNode, len(nodes)) - keep := make(NodePtrSet, len(nodes)) - - for i, node := range nodes { - expected[i] = expectedNode{ - node: node, - in: make(EdgeMap), - out: make(EdgeMap), - } - keep[node] = true - } - - return expected, keep -} - -// createExpectedEdges creates directed edges from the parent to each of the -// children. -func createExpectedEdges(parent expectedNode, children ...expectedNode) { - for _, child := range children { - edge := &Edge{ - Src: parent.node, - Dest: child.node, - } - parent.out[child.node] = edge - child.in[parent.node] = edge - } -} - -// createTestCase1 creates a test case that initially looks like: -// 0 -// |(5) -// 1 -// (3)/ \(4) -// 2 3. -// -// After keeping 0, 2, and 3, it expects the graph: -// 0 -// (3)/ \(4) -// 2 3. -func createTestCase1() trimTreeTestcase { - // Create initial graph - graph := &Graph{make(Nodes, 4)} - nodes := graph.Nodes - for i := range nodes { - nodes[i] = createEmptyNode() - } - createEdges(nodes[0], nodes[1]) - createEdges(nodes[1], nodes[2], nodes[3]) - makeEdgeInline(nodes[0].Out, nodes[1]) - makeEdgeInline(nodes[1].Out, nodes[2]) - setEdgeWeight(nodes[0].Out, nodes[1], 5) - setEdgeWeight(nodes[1].Out, nodes[2], 3) - setEdgeWeight(nodes[1].Out, nodes[3], 4) - - // Create expected graph - expected, keep := createExpectedNodes(nodes[0], nodes[2], nodes[3]) - createExpectedEdges(expected[0], expected[1], expected[2]) - makeEdgeInline(expected[0].out, expected[1].node) - makeExpectedEdgeResidual(expected[0], expected[1]) - makeExpectedEdgeResidual(expected[0], expected[2]) - setEdgeWeight(expected[0].out, expected[1].node, 3) - setEdgeWeight(expected[0].out, expected[2].node, 4) - return trimTreeTestcase{ - initial: graph, - expected: expected, - keep: keep, - } -} - -// createTestCase2 creates a test case that initially looks like: -// 3 -// | (12) -// 1 -// | (8) -// 2 -// | (15) -// 0 -// | (10) -// 4. -// -// After keeping 3 and 4, it expects the graph: -// 3 -// | (10) -// 4. -func createTestCase2() trimTreeTestcase { - // Create initial graph - graph := &Graph{make(Nodes, 5)} - nodes := graph.Nodes - for i := range nodes { - nodes[i] = createEmptyNode() - } - createEdges(nodes[3], nodes[1]) - createEdges(nodes[1], nodes[2]) - createEdges(nodes[2], nodes[0]) - createEdges(nodes[0], nodes[4]) - setEdgeWeight(nodes[3].Out, nodes[1], 12) - setEdgeWeight(nodes[1].Out, nodes[2], 8) - setEdgeWeight(nodes[2].Out, nodes[0], 15) - setEdgeWeight(nodes[0].Out, nodes[4], 10) - - // Create expected graph - expected, keep := createExpectedNodes(nodes[3], nodes[4]) - createExpectedEdges(expected[0], expected[1]) - makeExpectedEdgeResidual(expected[0], expected[1]) - setEdgeWeight(expected[0].out, expected[1].node, 10) - return trimTreeTestcase{ - initial: graph, - expected: expected, - keep: keep, - } -} - -// createTestCase3 creates an initially empty graph and expects an empty graph -// after trimming. -func createTestCase3() trimTreeTestcase { - graph := &Graph{make(Nodes, 0)} - expected, keep := createExpectedNodes() - return trimTreeTestcase{ - initial: graph, - expected: expected, - keep: keep, - } -} - -// createTestCase4 creates a test case that initially looks like: -// 0. -// -// After keeping 0, it expects the graph: -// 0. -func createTestCase4() trimTreeTestcase { - graph := &Graph{make(Nodes, 1)} - nodes := graph.Nodes - for i := range nodes { - nodes[i] = createEmptyNode() - } - expected, keep := createExpectedNodes(nodes[0]) - return trimTreeTestcase{ - initial: graph, - expected: expected, - keep: keep, - } -} - -func createTrimTreeTestCases() []trimTreeTestcase { - caseGenerators := []func() trimTreeTestcase{ - createTestCase1, - createTestCase2, - createTestCase3, - createTestCase4, - } - cases := make([]trimTreeTestcase, len(caseGenerators)) - for i, gen := range caseGenerators { - cases[i] = gen() - } - return cases -} - -func TestTrimTree(t *testing.T) { - tests := createTrimTreeTestCases() - for _, test := range tests { - graph := test.initial - graph.TrimTree(test.keep) - if !graphsEqual(graph, test.expected) { - t.Fatalf("Graphs do not match.\nExpected: %s\nFound: %s\n", - expectedNodesDebugString(test.expected), - graphDebugString(graph)) - } - } -} - -func nodeTestProfile() *profile.Profile { - mappings := []*profile.Mapping{ - { - ID: 1, - File: "symbolized_binary", - }, - { - ID: 2, - File: "unsymbolized_library_1", - }, - { - ID: 3, - File: "unsymbolized_library_2", - }, - } - functions := []*profile.Function{ - {ID: 1, Name: "symname"}, - {ID: 2}, - } - locations := []*profile.Location{ - { - ID: 1, - Mapping: mappings[0], - Line: []profile.Line{ - {Function: functions[0]}, - }, - }, - { - ID: 2, - Mapping: mappings[1], - Line: []profile.Line{ - {Function: functions[1]}, - }, - }, - { - ID: 3, - Mapping: mappings[2], - }, - } - return &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - SampleType: []*profile.ValueType{ - {Type: "type", Unit: "unit"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{locations[0]}, - Value: []int64{1}, - }, - { - Location: []*profile.Location{locations[1]}, - Value: []int64{1}, - }, - { - Location: []*profile.Location{locations[2]}, - Value: []int64{1}, - }, - }, - Location: locations, - Function: functions, - Mapping: mappings, - } -} - -// Check that nodes are properly created for a simple profile. -func TestCreateNodes(t *testing.T) { - testProfile := nodeTestProfile() - wantNodeSet := NodeSet{ - {Name: "symname"}: true, - {Objfile: "unsymbolized_library_1"}: true, - {Objfile: "unsymbolized_library_2"}: true, - } - - nodes, _ := CreateNodes(testProfile, &Options{}) - if len(nodes) != len(wantNodeSet) { - t.Errorf("got %d nodes, want %d", len(nodes), len(wantNodeSet)) - } - for _, node := range nodes { - if !wantNodeSet[node.Info] { - t.Errorf("unexpected node %v", node.Info) - } - } -} - -func TestShortenFunctionName(t *testing.T) { - type testCase struct { - name string - want string - } - testcases := []testCase{ - { - "root", - "root", - }, - { - "syscall.Syscall", - "syscall.Syscall", - }, - { - "net/http.(*conn).serve", - "http.(*conn).serve", - }, - { - "github.com/blahBlah/foo.Foo", - "foo.Foo", - }, - { - "github.com/BlahBlah/foo.Foo", - "foo.Foo", - }, - { - "github.com/blah-blah/foo_bar.(*FooBar).Foo", - "foo_bar.(*FooBar).Foo", - }, - { - "encoding/json.(*structEncoder).(encoding/json.encode)-fm", - "json.(*structEncoder).(encoding/json.encode)-fm", - }, - { - "github.com/blah/blah/vendor/gopkg.in/redis.v3.(*baseClient).(github.com/blah/blah/vendor/gopkg.in/redis.v3.process)-fm", - "redis.v3.(*baseClient).(github.com/blah/blah/vendor/gopkg.in/redis.v3.process)-fm", - }, - { - "java.util.concurrent.ThreadPoolExecutor$Worker.run", - "ThreadPoolExecutor$Worker.run", - }, - { - "java.bar.foo.FooBar.run(java.lang.Runnable)", - "FooBar.run", - }, - { - "(anonymous namespace)::Bar::Foo", - "Bar::Foo", - }, - { - "(anonymous namespace)::foo", - "foo", - }, - { - "foo_bar::Foo::bar", - "Foo::bar", - }, - { - "foo", - "foo", - }, - } - for _, tc := range testcases { - name := ShortenFunctionName(tc.name) - if got, want := name, tc.want; got != want { - t.Errorf("ShortenFunctionName(%q) = %q, want %q", tc.name, got, want) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose1.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose1.dot deleted file mode 100644 index da349a40a8..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose1.dot +++ /dev/null @@ -1,7 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" tooltip="testtitle"] } -N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] -N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] -N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose2.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose2.dot deleted file mode 100644 index 0c1a6ebaf1..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose2.dot +++ /dev/null @@ -1,7 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" tooltip="testtitle"] } -N1 [label="SRC10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=24 shape=folder tooltip="src (25)" color="#b23c00" fillcolor="#edddd5" style="bold,filled" peripheries=2 URL="www.google.com" target="_blank"] -N2 [label="dest\n0 of 25 (25.00%)" id="node2" fontsize=8 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] -N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose3.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose3.dot deleted file mode 100644 index 1b878b79df..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose3.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" tooltip="testtitle"] } -N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] -N1_0 [label = "tag1" id="N1_0" fontsize=8 shape=box3d tooltip="10"] -N1 -> N1_0 [label=" 10" weight=100 tooltip="10" labeltooltip="10"] -NN1_0 [label = "tag2" id="NN1_0" fontsize=8 shape=box3d tooltip="20"] -N1 -> NN1_0 [label=" 20" weight=100 tooltip="20" labeltooltip="20"] -N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] -N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src ... dest (10)" labeltooltip="src ... dest (10)" style="dotted" minlen=2] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose4.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose4.dot deleted file mode 100644 index 302da8ce94..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose4.dot +++ /dev/null @@ -1,4 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" tooltip="testtitle"] } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose5.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose5.dot deleted file mode 100644 index 8876e337e6..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose5.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" tooltip="testtitle"] } -N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] -N1_0 [label = "tag1" id="N1_0" fontsize=8 shape=box3d tooltip="10"] -N1 -> N1_0 [label=" 10" weight=100 tooltip="10" labeltooltip="10"] -NN1_0_0 [label = "tag2" id="NN1_0_0" fontsize=8 shape=box3d tooltip="20"] -N1_0 -> NN1_0_0 [label=" 20" weight=100 tooltip="20" labeltooltip="20"] -N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] -N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)" minlen=2] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose6.dot b/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose6.dot deleted file mode 100644 index cf884394c7..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/graph/testdata/compose6.dot +++ /dev/null @@ -1,7 +0,0 @@ -digraph "testtitle" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "label1" [shape=box fontsize=16 label="label1\llabel2\l" URL="http://example.com" target="_blank" tooltip="testtitle"] } -N1 [label="src\n10 (10.00%)\nof 25 (25.00%)" id="node1" fontsize=22 shape=box tooltip="src (25)" color="#b23c00" fillcolor="#edddd5"] -N2 [label="dest\n15 (15.00%)\nof 25 (25.00%)" id="node2" fontsize=24 shape=box tooltip="dest (25)" color="#b23c00" fillcolor="#edddd5"] -N1 -> N2 [label=" 10" weight=11 color="#b28559" tooltip="src -> dest (10)" labeltooltip="src -> dest (10)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go b/src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go deleted file mode 100644 index 155cafa198..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package measurement - -import ( - "testing" -) - -func TestScale(t *testing.T) { - for _, tc := range []struct { - value int64 - fromUnit, toUnit string - wantValue float64 - wantUnit string - }{ - {1, "s", "ms", 1000, "ms"}, - {1, "kb", "b", 1024, "B"}, - {1, "kbyte", "b", 1024, "B"}, - {1, "kilobyte", "b", 1024, "B"}, - {1, "mb", "kb", 1024, "kB"}, - {1, "gb", "mb", 1024, "MB"}, - {1024, "gb", "tb", 1, "TB"}, - {1024, "tb", "pb", 1, "PB"}, - {2048, "mb", "auto", 2, "GB"}, - {3.1536e7, "s", "auto", 1, "yrs"}, - {-1, "s", "ms", -1000, "ms"}, - {1, "foo", "count", 1, ""}, - {1, "foo", "bar", 1, "bar"}, - } { - if gotValue, gotUnit := Scale(tc.value, tc.fromUnit, tc.toUnit); gotValue != tc.wantValue || gotUnit != tc.wantUnit { - t.Errorf("Scale(%d, %q, %q) = (%f, %q), want (%f, %q)", - tc.value, tc.fromUnit, tc.toUnit, gotValue, gotUnit, tc.wantValue, tc.wantUnit) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go b/src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go deleted file mode 100644 index 5d3a19b4a1..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package proftest provides some utility routines to test other -// packages related to profiles. -package proftest - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "os" - "os/exec" - "regexp" - "testing" -) - -// Diff compares two byte arrays using the diff tool to highlight the -// differences. It is meant for testing purposes to display the -// differences between expected and actual output. -func Diff(b1, b2 []byte) (data []byte, err error) { - f1, err := ioutil.TempFile("", "proto_test") - if err != nil { - return nil, err - } - defer os.Remove(f1.Name()) - defer f1.Close() - - f2, err := ioutil.TempFile("", "proto_test") - if err != nil { - return nil, err - } - defer os.Remove(f2.Name()) - defer f2.Close() - - f1.Write(b1) - f2.Write(b2) - - data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput() - if len(data) > 0 { - // diff exits with a non-zero status when the files don't match. - // Ignore that failure as long as we get output. - err = nil - } - if err != nil { - data = []byte(fmt.Sprintf("diff failed: %v\nb1: %q\nb2: %q\n", err, b1, b2)) - err = nil - } - return -} - -// EncodeJSON encodes a value into a byte array. This is intended for -// testing purposes. -func EncodeJSON(x interface{}) []byte { - data, err := json.MarshalIndent(x, "", " ") - if err != nil { - panic(err) - } - data = append(data, '\n') - return data -} - -// TestUI implements the plugin.UI interface, triggering test failures -// if more than Ignore errors not matching AllowRx are printed. -// Also tracks the number of times the error matches AllowRx in -// NumAllowRxMatches. -type TestUI struct { - T *testing.T - Ignore int - AllowRx string - NumAllowRxMatches int - Input []string - index int -} - -// ReadLine returns no input, as no input is expected during testing. -func (ui *TestUI) ReadLine(_ string) (string, error) { - if ui.index >= len(ui.Input) { - return "", io.EOF - } - input := ui.Input[ui.index] - ui.index++ - if input == "**error**" { - return "", fmt.Errorf("Error: %s", input) - } - return input, nil -} - -// Print messages are discarded by the test UI. -func (ui *TestUI) Print(args ...interface{}) { -} - -// PrintErr messages may trigger an error failure. A fixed number of -// error messages are permitted when appropriate. -func (ui *TestUI) PrintErr(args ...interface{}) { - if ui.AllowRx != "" { - if matched, err := regexp.MatchString(ui.AllowRx, fmt.Sprint(args...)); matched || err != nil { - if err != nil { - ui.T.Errorf("failed to match against regex %q: %v", ui.AllowRx, err) - } - ui.NumAllowRxMatches++ - return - } - } - if ui.Ignore > 0 { - ui.Ignore-- - return - } - // Stringify arguments with fmt.Sprint() to match what default UI - // implementation does. Without this Error() calls fmt.Sprintln() which - // _always_ adds spaces between arguments, unlike fmt.Sprint() which only - // adds them between arguments if neither is string. - ui.T.Error("unexpected error: " + fmt.Sprint(args...)) -} - -// IsTerminal indicates if the UI is an interactive terminal. -func (ui *TestUI) IsTerminal() bool { - return false -} - -// WantBrowser indicates whether a browser should be opened with the -http option. -func (ui *TestUI) WantBrowser() bool { - return false -} - -// SetAutoComplete is not supported by the test UI. -func (ui *TestUI) SetAutoComplete(_ func(string) string) { -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/report_test.go b/src/cmd/vendor/github.com/google/pprof/internal/report/report_test.go deleted file mode 100644 index 7c4363fadd..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/report_test.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package report - -import ( - "bytes" - "io/ioutil" - "regexp" - "runtime" - "testing" - - "github.com/google/pprof/internal/binutils" - "github.com/google/pprof/internal/graph" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/profile" -) - -type testcase struct { - rpt *Report - want string -} - -func TestSource(t *testing.T) { - const path = "testdata/" - - sampleValue1 := func(v []int64) int64 { - return v[1] - } - - for _, tc := range []testcase{ - { - rpt: New( - testProfile.Copy(), - &Options{ - OutputFormat: List, - Symbol: regexp.MustCompile(`.`), - TrimPath: "/some/path", - - SampleValue: sampleValue1, - SampleUnit: testProfile.SampleType[1].Unit, - }, - ), - want: path + "source.rpt", - }, - { - rpt: New( - testProfile.Copy(), - &Options{ - OutputFormat: Dot, - CallTree: true, - Symbol: regexp.MustCompile(`.`), - TrimPath: "/some/path", - - SampleValue: sampleValue1, - SampleUnit: testProfile.SampleType[1].Unit, - }, - ), - want: path + "source.dot", - }, - } { - var b bytes.Buffer - if err := Generate(&b, tc.rpt, &binutils.Binutils{}); err != nil { - t.Fatalf("%s: %v", tc.want, err) - } - - gold, err := ioutil.ReadFile(tc.want) - if err != nil { - t.Fatalf("%s: %v", tc.want, err) - } - if runtime.GOOS == "windows" { - gold = bytes.Replace(gold, []byte("testdata/"), []byte("testdata\\"), -1) - } - if string(b.String()) != string(gold) { - d, err := proftest.Diff(gold, b.Bytes()) - if err != nil { - t.Fatalf("%s: %v", "source", err) - } - t.Error("source" + "\n" + string(d) + "\n" + "gold:\n" + tc.want) - } - } -} - -var testM = []*profile.Mapping{ - { - ID: 1, - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, -} - -var testF = []*profile.Function{ - { - ID: 1, - Name: "main", - Filename: "testdata/source1", - }, - { - ID: 2, - Name: "foo", - Filename: "testdata/source1", - }, - { - ID: 3, - Name: "bar", - Filename: "testdata/source1", - }, - { - ID: 4, - Name: "tee", - Filename: "/some/path/testdata/source2", - }, -} - -var testL = []*profile.Location{ - { - ID: 1, - Mapping: testM[0], - Line: []profile.Line{ - { - Function: testF[0], - Line: 2, - }, - }, - }, - { - ID: 2, - Mapping: testM[0], - Line: []profile.Line{ - { - Function: testF[1], - Line: 4, - }, - }, - }, - { - ID: 3, - Mapping: testM[0], - Line: []profile.Line{ - { - Function: testF[2], - Line: 10, - }, - }, - }, - { - ID: 4, - Mapping: testM[0], - Line: []profile.Line{ - { - Function: testF[3], - Line: 2, - }, - }, - }, - { - ID: 5, - Mapping: testM[0], - Line: []profile.Line{ - { - Function: testF[3], - Line: 8, - }, - }, - }, -} - -var testProfile = &profile.Profile{ - PeriodType: &profile.ValueType{Type: "cpu", Unit: "millisecond"}, - Period: 10, - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "cycles"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{testL[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{1, 10}, - }, - { - Location: []*profile.Location{testL[4], testL[2], testL[0]}, - Value: []int64{1, 100}, - }, - { - Location: []*profile.Location{testL[3], testL[0]}, - Value: []int64{1, 1000}, - }, - { - Location: []*profile.Location{testL[4], testL[3], testL[0]}, - Value: []int64{1, 10000}, - }, - }, - Location: testL, - Function: testF, - Mapping: testM, -} - -func TestDisambiguation(t *testing.T) { - parent1 := &graph.Node{Info: graph.NodeInfo{Name: "parent1"}} - parent2 := &graph.Node{Info: graph.NodeInfo{Name: "parent2"}} - child1 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent1} - child2 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent2} - child3 := &graph.Node{Info: graph.NodeInfo{Name: "child"}, Function: parent1} - sibling := &graph.Node{Info: graph.NodeInfo{Name: "sibling"}, Function: parent1} - - n := []*graph.Node{parent1, parent2, child1, child2, child3, sibling} - - wanted := map[*graph.Node]string{ - parent1: "parent1", - parent2: "parent2", - child1: "child [1/2]", - child2: "child [2/2]", - child3: "child [1/2]", - sibling: "sibling", - } - - g := &graph.Graph{Nodes: n} - - names := getDisambiguatedNames(g) - - for node, want := range wanted { - if got := names[node]; got != want { - t.Errorf("name %s, got %s, want %s", node.Info.Name, got, want) - } - } -} - -func TestFunctionMap(t *testing.T) { - - fm := make(functionMap) - nodes := []graph.NodeInfo{ - {Name: "fun1"}, - {Name: "fun2", File: "filename"}, - {Name: "fun1"}, - {Name: "fun2", File: "filename2"}, - } - - want := []struct { - wantFunction profile.Function - wantAdded bool - }{ - {profile.Function{ID: 1, Name: "fun1"}, true}, - {profile.Function{ID: 2, Name: "fun2", Filename: "filename"}, true}, - {profile.Function{ID: 1, Name: "fun1"}, false}, - {profile.Function{ID: 3, Name: "fun2", Filename: "filename2"}, true}, - } - - for i, tc := range nodes { - gotFunc, gotAdded := fm.findOrAdd(tc) - if got, want := gotFunc, want[i].wantFunction; *got != want { - t.Errorf("%d: got %v, want %v", i, got, want) - } - if got, want := gotAdded, want[i].wantAdded; got != want { - t.Errorf("%d: got %v, want %v", i, got, want) - } - } -} - -func TestLegendActiveFilters(t *testing.T) { - activeFilterInput := []string{ - "focus=123|456|789|101112|131415|161718|192021|222324|252627|282930|313233|343536|363738|acbdefghijklmnop", - "show=short filter", - } - expectedLegendActiveFilter := []string{ - "Active filters:", - " focus=123|456|789|101112|131415|161718|192021|222324|252627|282930|313233|343536…", - " show=short filter", - } - legendActiveFilter := legendActiveFilters(activeFilterInput) - if len(legendActiveFilter) != len(expectedLegendActiveFilter) { - t.Errorf("wanted length %v got length %v", len(expectedLegendActiveFilter), len(legendActiveFilter)) - } - for i := range legendActiveFilter { - if legendActiveFilter[i] != expectedLegendActiveFilter[i] { - t.Errorf("%d: want \"%v\", got \"%v\"", i, expectedLegendActiveFilter[i], legendActiveFilter[i]) - } - } -} - -func TestComputeTotal(t *testing.T) { - p1 := testProfile.Copy() - p1.Sample = []*profile.Sample{ - { - Location: []*profile.Location{testL[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{1, 10}, - }, - { - Location: []*profile.Location{testL[4], testL[2], testL[0]}, - Value: []int64{1, 100}, - }, - } - - p2 := testProfile.Copy() - p2.Sample = []*profile.Sample{ - { - Location: []*profile.Location{testL[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{1, -10}, - }, - { - Location: []*profile.Location{testL[4], testL[2], testL[0]}, - Value: []int64{1, 100}, - }, - } - - p3 := testProfile.Copy() - p3.Sample = []*profile.Sample{ - { - Location: []*profile.Location{testL[0]}, - Value: []int64{10000, 1}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{-10, 3}, - Label: map[string][]string{"pprof::base": {"true"}}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{1000, -10}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{-9000, 3}, - Label: map[string][]string{"pprof::base": {"true"}}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{-1, 3}, - Label: map[string][]string{"pprof::base": {"true"}}, - }, - { - Location: []*profile.Location{testL[4], testL[2], testL[0]}, - Value: []int64{100, 100}, - }, - { - Location: []*profile.Location{testL[2], testL[1], testL[0]}, - Value: []int64{100, 3}, - Label: map[string][]string{"pprof::base": {"true"}}, - }, - } - - testcases := []struct { - desc string - prof *profile.Profile - value, meanDiv func(v []int64) int64 - wantTotal int64 - }{ - { - desc: "no diff base, all positive values, index 1", - prof: p1, - value: func(v []int64) int64 { - return v[0] - }, - wantTotal: 3, - }, - { - desc: "no diff base, all positive values, index 2", - prof: p1, - value: func(v []int64) int64 { - return v[1] - }, - wantTotal: 111, - }, - { - desc: "no diff base, some negative values", - prof: p2, - value: func(v []int64) int64 { - return v[1] - }, - wantTotal: 111, - }, - { - desc: "diff base, some negative values", - prof: p3, - value: func(v []int64) int64 { - return v[0] - }, - wantTotal: 9111, - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - if gotTotal := computeTotal(tc.prof, tc.value, tc.meanDiv); gotTotal != tc.wantTotal { - t.Errorf("got total %d, want %v", gotTotal, tc.wantTotal) - } - }) - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/source_test.go b/src/cmd/vendor/github.com/google/pprof/internal/report/source_test.go deleted file mode 100644 index f1dd5c70dd..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/source_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package report - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "runtime" - "strings" - "testing" - - "github.com/google/pprof/internal/binutils" - "github.com/google/pprof/profile" -) - -func TestWebList(t *testing.T) { - if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { - t.Skip("weblist only tested on x86-64 linux") - } - - cpu := readProfile(filepath.Join("testdata", "sample.cpu"), t) - rpt := New(cpu, &Options{ - OutputFormat: WebList, - Symbol: regexp.MustCompile("busyLoop"), - SampleValue: func(v []int64) int64 { return v[1] }, - SampleUnit: cpu.SampleType[1].Unit, - }) - var buf bytes.Buffer - if err := Generate(&buf, rpt, &binutils.Binutils{}); err != nil { - t.Fatalf("could not generate weblist: %v", err) - } - output := buf.String() - - for _, expect := range []string{"func busyLoop", "callq", "math.Abs"} { - if !strings.Contains(output, expect) { - t.Errorf("weblist output does not contain '%s':\n%s", expect, output) - } - } -} - -func TestOpenSourceFile(t *testing.T) { - tempdir, err := ioutil.TempDir("", "") - if err != nil { - t.Fatalf("failed to create temp dir: %v", err) - } - const lsep = string(filepath.ListSeparator) - for _, tc := range []struct { - desc string - searchPath string - trimPath string - fs []string - path string - wantPath string // If empty, error is wanted. - }{ - { - desc: "exact absolute path is found", - fs: []string{"foo/bar.cc"}, - path: "$dir/foo/bar.cc", - wantPath: "$dir/foo/bar.cc", - }, - { - desc: "exact relative path is found", - searchPath: "$dir", - fs: []string{"foo/bar.cc"}, - path: "foo/bar.cc", - wantPath: "$dir/foo/bar.cc", - }, - { - desc: "multiple search path", - searchPath: "some/path" + lsep + "$dir", - fs: []string{"foo/bar.cc"}, - path: "foo/bar.cc", - wantPath: "$dir/foo/bar.cc", - }, - { - desc: "relative path is found in parent dir", - searchPath: "$dir/foo/bar", - fs: []string{"bar.cc", "foo/bar/baz.cc"}, - path: "bar.cc", - wantPath: "$dir/bar.cc", - }, - { - desc: "trims configured prefix", - searchPath: "$dir", - trimPath: "some-path" + lsep + "/some/remote/path", - fs: []string{"my-project/foo/bar.cc"}, - path: "/some/remote/path/my-project/foo/bar.cc", - wantPath: "$dir/my-project/foo/bar.cc", - }, - { - desc: "trims heuristically", - searchPath: "$dir/my-project", - fs: []string{"my-project/foo/bar.cc"}, - path: "/some/remote/path/my-project/foo/bar.cc", - wantPath: "$dir/my-project/foo/bar.cc", - }, - { - desc: "error when not found", - path: "foo.cc", - }, - } { - t.Run(tc.desc, func(t *testing.T) { - defer func() { - if err := os.RemoveAll(tempdir); err != nil { - t.Fatalf("failed to remove dir %q: %v", tempdir, err) - } - }() - for _, f := range tc.fs { - path := filepath.Join(tempdir, filepath.FromSlash(f)) - dir := filepath.Dir(path) - if err := os.MkdirAll(dir, 0755); err != nil { - t.Fatalf("failed to create dir %q: %v", dir, err) - } - if err := ioutil.WriteFile(path, nil, 0644); err != nil { - t.Fatalf("failed to create file %q: %v", path, err) - } - } - tc.searchPath = filepath.FromSlash(strings.Replace(tc.searchPath, "$dir", tempdir, -1)) - tc.path = filepath.FromSlash(strings.Replace(tc.path, "$dir", tempdir, 1)) - tc.wantPath = filepath.FromSlash(strings.Replace(tc.wantPath, "$dir", tempdir, 1)) - if file, err := openSourceFile(tc.path, tc.searchPath, tc.trimPath); err != nil && tc.wantPath != "" { - t.Errorf("openSourceFile(%q, %q, %q) = err %v, want path %q", tc.path, tc.searchPath, tc.trimPath, err, tc.wantPath) - } else if err == nil { - defer file.Close() - gotPath := file.Name() - if tc.wantPath == "" { - t.Errorf("openSourceFile(%q, %q, %q) = %q, want error", tc.path, tc.searchPath, tc.trimPath, gotPath) - } else if gotPath != tc.wantPath { - t.Errorf("openSourceFile(%q, %q, %q) = %q, want path %q", tc.path, tc.searchPath, tc.trimPath, gotPath, tc.wantPath) - } - } - }) - } -} - -func TestIndentation(t *testing.T) { - for _, c := range []struct { - str string - wantIndent int - }{ - {"", 0}, - {"foobar", 0}, - {" foo", 2}, - {"\tfoo", 8}, - {"\t foo", 9}, - {" \tfoo", 8}, - {" \tfoo", 8}, - {" \tfoo", 16}, - } { - if n := indentation(c.str); n != c.wantIndent { - t.Errorf("indentation(%v): got %d, want %d", c.str, n, c.wantIndent) - } - } -} - -func readProfile(fname string, t *testing.T) *profile.Profile { - file, err := os.Open(fname) - if err != nil { - t.Fatalf("%s: could not open profile: %v", fname, err) - } - defer file.Close() - p, err := profile.Parse(file) - if err != nil { - t.Fatalf("%s: could not parse profile: %v", fname, err) - } - - // Fix file names so they do not include absolute path names. - fix := func(s string) string { - const testdir = "/internal/report/" - pos := strings.Index(s, testdir) - if pos == -1 { - return s - } - return s[pos+len(testdir):] - } - for _, m := range p.Mapping { - m.File = fix(m.File) - } - for _, f := range p.Function { - f.Filename = fix(f.Filename) - } - - return p -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/README.md b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/README.md deleted file mode 100644 index 2b60fcca6c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/README.md +++ /dev/null @@ -1,10 +0,0 @@ -sample/ contains a sample program that can be profiled. -sample.bin is its x86-64 binary. -sample.cpu is a profile generated by sample.bin. - -To update the binary and profile: - -```shell -go build -o sample.bin ./sample -./sample.bin -cpuprofile sample.cpu -``` diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample.bin b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample.bin deleted file mode 100755 index 25929e64601bc73834a7e2244803cc9d595bb32b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2342380 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
02!ls2D?ouc0 zWGSehx+j9;4z!QSqgV7A)D7J+(6|@<0SQlu7KUzKk9VM?%ilU3lv6-!JV7+*veqq- zQ^b11SirMa9=&nk#8m)F@Nf2ULK9x0}K6(#z?fBniz$khxe; zE_&?v=l{z{P*&+~0SDR3A0TzGwJ_bV^av^Kpd}O}Wxmt{)gYZFDjwk4Wu_x2^FdQ2 z)E;mW1It!}Wg(&Z@&-s_FKfFyC`wr%nHQ8HA#Ds$CRKQ0#RJNfE}&cq>gR!TWvA#9 zcF_I7_uhywv|cKe^5|qe%noYXL+%fT9C!873uJmH^!&I^(DIR9-Z@}p(2Vioodd+F zpj9iNH6#I`Gb^CgRO1m)?RD7jw&6*`OE2I41i1oL>c#w}pl09;4qpa_m!E%tSJflh zKfNs~4xr!!*N0a?M`bj=f$U;h16|n+r9r0$fRlWS3TWyUlo$fQ{2mq1-GQL>Om3j? z0d2sYqXJ&K2fDk@qjw8LJtz^p*s|yMf6%d93ZNmxBYdDLu|);EcdD~R1+>B$*;sH* z*eklh6=v)dsIj1o(K`pC9$coqJpfHZpmP?W26p$TfZb<#g1^Oy540R5K)myE^CNlw zZH3~^&*U8}KJm8-@-Z-U#Hi?ZgsA9&#|etTN5X;@#dWqoj#cZ1?g#;=SkS&&u%|^- zUU)#2LYMV+L(hn_yig)>tVIR1E{_3pq8DhO)T8kTC`=E7if8ayZJ@(4z?l?W)qy9E zEwe#xgskt~52|t@!NQ{Q0(9OisH_L?1_Nh6nBPFNYlTo}aDajiEZcgLzttZ!ApjcQ zapr*-tJmxCzu_l8f14B!1A~nyfBQ9d1_m1;{P2SYGFEzs3z(CGMS_%hSRShl^60kt=mEM~ISy=LiAsh?H_K;m_<`@wMhU;2zY*a#4_Ej>#Tn5v z!fsGc1iboiCz!SD-~a#n!K|Bq|Nq|yW^MWV|36eeMnEO-VHlp7X< z_i=;!3@s{0$Q03sMe(=c!U_F)>Ny@`u>wHusUX-Ro zGMhrnff7U>?)GqiWhRgACW6_z*A5i0`?QMQtF19&>f;u(JjLTF4nu} zfcq03y(Tw7xfxPJo2a}HLe>pxih`0GxZ(mu4-5DP46xbY1&e5L16JQDqVnR-dzc%* zoxSc5l>*SPT5Be#@CBW)0iv-KqF++s5y0PK15(rt^+P9%$_vmQcu+wKo}e!P)uiBk zmEaP&8*;)dXkEyQd2m;v+77uQZ4M+UVX?go*>=#e0H9(V6y_kSD!N@5S-^n|ZMlH! zn_%z}*5CkvHbqbZ+lPwP=IUchMqA6D%)TtLn>ZS0VnYTo9BY`6{fT0K#3{H1CU^I0GHWNA3Atg zp5UK?D_9Hfq}tBtkfUL5Cf!O!sYZQU!hLN>2p}o1PTFY3k!5oIyjX= zThWM6pGv?u8;Md_TL~jI*+}xYCZZPcn8hgg=!Z^7F==@FwIZm)k^t$jz#IyZga_JRt0&}d34 zczXzDxeIbWXo>%engk?QLGGG`th)oHIdFh=haBVpH8voDP;!_9)NSGbITRE%kR%hL zBJd*VGc*N)`noT{ZbUZ;>OTv32ofLakaGe+&PERP(j1V>z(ItiR9_Ge_gjfGC_kZw zw$DLuy8+@amqP;J`&~<@U)*A}fp8VKP;rb51r^6I$3}|3rTowT|1WD985p37Ff@C# zo-ASYXgvVWuNcOFhCx6Bf!&O-st8b;*v<`%|+dzkWSzavF1;r!SAVfTZA{(4WZ^Xjmk-zojC)|xo zXc%Dl5GsxlHn_xJs7(WRyyYR31cVZVP+SnI7()G-3RZb^CwRh0FbHY7Mi#VUqUZ46 z|1ZozOUSmlsOUF8kO!AL+YbKy|Dtiv-~TUUc7ZkCKt7HEtnu)Au)#dG3=A*XKY;uG zp!pB<`y-(@MS@PH1?`yPZ=VG!Su_uVu5^VCB`Y2TEq-hRuj=fMQ4!$ZX2RWD=it!r zU!ge212k(Y%fHQso3S^rq2ZT(xj^$X`Ge2cnjhM8o@@SBUoQ#T5BK*!1LV#)&`>|@ zrpQjvP-gQ1CQv`a0DhrlZ=Hfe!+(L|6p!X#Om&C&w}o&s_Et4GH2k+O-vY9TsW-Br z;kSMH^5$p!2cPjYKe9jgh>i0T$ih>Nzy7l`Fx2(*b}?xD|KIo%#N%(P`v3nwXyJfI z^8xS_5wc~VOTjt#o5MjvAo8t_=pc zg&E=&{&w;I|Nl2XV?X#z2<#pn&TGxj?GHX@$83=IGOH~#wnpPzxh{S|0G zfRBoXNAm#|RL|oKs~49igX7a?3Wx&5Bm^VJCumBs`A2=ZIw)&Nc(k76Zv)+R4&n)P zFoMP-LE|+H@Q}6zg-*F8NFH?70V99gM+OFl&VvVkur;4J0O}>F#(^rF<2F-7f))Rrc6$!^c<5}SQX-|1{25@+E zM=E$Q-ZH#x_|5SDYo`B)UHG>Tz+`6pB9M&E810S+H#2M(Xk zyQ8%DKP*I8d-z19e02%jy>)GnU_8806m@GAptZdZ+Ozx@Z@Vw&;N%!J5Ty_g03!w z9M289rrrm%%g?j(l*hq`EI!>b{NPj2n?ZXyz_W+lK9(FF%pL-s&A(aelRcY%vy?Ku z-U{NC`nq(>ZodwimAPHY>Cx$-;L~~X^(=7n0MxX6@md=+1PVI7q8q$LBSysm)Yh{A z4Q*(E=9~;bgGLHI-JmO&5BqeUd>I8gx2X9yTWNqxw`>g5XdaJF4+)Sgcw;KKlJHUC zc+pFW=?6R;e}DM@KObx`Gm^m(AcG%+hNHoQ%pikJNHzG+|Nr^?tsvLAbjvQg1_=<5 zs}n$mxBUYhaR?fL1{r=`i-a&a;L+`&04fYxAk8xmaLLeO2bzQforn%Od%`0DtOV3& zb?oMJ><(nAE^zkRpqm#d)E zR^i~=>&U@)vGrSNl~1RGL-RqV&XXRNr}^7KbAI5H^%xxZ+rb?g&6^&b9tIx0-3$y2 z2SC%7ogNn5qHDnB6lj11K=YUfA2WFd1>yh9VVwhA<=4+@jR zn$R$LeXr98w7V`wMFKQ-1xn)_FP6e&yFqf@F)9+^RP!?W|NsBpyyjOy6C$O&9?&HJ z@+T}VK^sLtiT_0k%m9eK8z2SUh!tK)(>*UNp-RCENkN4Vcoyh|5>(g%RD&agxuL?4 zEqQSJzGy(b11jk}Ji0NH{mX3d+9{YDUMTf}%QR^SwWJr!<27Yqcxmw)Uj3u5HqM9_or7ATv) zh_r?@@H`;%yWlA|0g$mA9+tOC1i=mhRRQ2FRUWVBfd>x2%|y`50;p7zc=0tD-oyi4 z9|0OM?FLn_-6bj>FEc@PJE(Hx-|oPo3L0pIEE9&^^aQfYz~{|6 zc8g2~?Z$fuDk-}IB^+CrIxqS3$^`j#-t|2AnAx3wTZt5lYv*^z=4bql4gZ)*gnYUK z4Sc#IHGC{D6&-kaf{}s2@xXf)$A zQ>XPdXsLUNiUt36k)p;&ps2FERift6`3aN*JU|hJ-3g#=aG;!G08*0R(H(M)!-F{x zoQeWGI>kVu86Lf13Lu7qN3RXw)TjY1YXPG+sB0RJfE;-kG^7W1C6xan&47X7r6Op53BrG%`!roVn$g!bS%3~APz99- z(4nm3EGnQ@DR{nIF9qag*y5%a^E<#H$zj02@Ol}fNr!5F659RP-A>>|7aAVjUIHH7 zQ4-xn3f)yIF5ONV-9b8#awkTG161sE)~JZMfTr&{LsVp5sAYic1#Q#jXOs;vbLhAO(+ZPPk7%C4<0=ic|&$@P0SYqBV%yp$E9=f$W2e_~Q|D;DJm~|M%J^XFUK^Yz`4k2MI01jht|NO)%a36M$GE(PP7}WXg-}3kW z3#+w|eHjAa@=9m(-~TVvK|;N(Go_F;fL2(%hy!Wh1j&N^0~&((z3K1&7h!Av{(tci zV$Hr#BwZ>XYi29}Clg0q1_toCB{08&XcYgHIiROUCl0VTx}zk(K?{pFP^AP}x%1+; z4`_xOo+R(+FfhDc1u_|eQO(yxOAo!Q0vN7+H6QF+V_gP@*9TGS^D<2R7edf|y9%QJ zGsq$6`n5fp-w1%p01i-FfCH3%S{OW<4@7{&Ug0mqD;yrpM+6SP5Coa9AL0!-iRvHx z=3V%MV%|Y*28P%8&BGb~K@uPrg3BRLxduuM44}j<@nSXjAa;28$AB!s8UDKH`%j!W z__uk1Q(gzCk=f@BYL(@vKzGOSgACgX_dAGz>VHsvL|K~&N&6C@M8m%=N`ik|kR&ue zcEqS~bcCpIzSt!KvI8`D1@2Nq@*`xOqyKf>ky{D1xMg@6_V!^>(=sSWZu1f#fz zzwId`|4V?3h{XtMCxRpQ#UE)<=)ej@(BR}9k8WAL6k!Gr%bP_PJi1M_!0eC3M?AVs%@RRN z#%#?Kg&90MPk3nF^f>sE*TeE>v7Sda&pD88PLJ+L2~W!##jHM^2VYO{=$;9xm_P#W z`L}tdH2h>NefFCDMQ9T!(|Po=PRT&ZPllkIJhV1H;RI@OC03G|{v12K?Je+NeWR(=is`~Yiq7a}@j_zP4V_Oh=2iKGlP$^h2?;ts^FL<=OlKx=njG|vWmOGkr&;iWkuj#1(lOL-%K zVUQKXpk@us@`}H0FQom9GM)m-BM#t10$wHpDqTB4-8oS0)d_Bo8hCVDdUpQsu{_4# zTnM@&tDDQWo71!NmM8!En;wjxeJl_2w}FPWyJe$}i!gZh7XA0(Uw_Vr@qFuT{#Ij9 zucy<}qg$%m*7`UoxuTkN6u}lV(DnS+PfABe>5}>KN-r1nYhE%^`M@w~^o;?P!ts8t! z2D_)`jn;3aK|Y=AAh(#Vhsc6PH5`1qIXpFQwtg$+@a^PySqxs)$)W;kXL7u_E(Nm= zTttAEoIy-P;iV@cccYb8;QWo&9snI%3#w~h zEOG!9M(_>O%qp1qyQ~yT`x?}~1?A}OA_b4`APum2-JakB6TqPW%4h;dWdV4eiFe%r5r&t4z-LJ@ z@lQDjKGE#Omsx-Qzp#G_iX*VwI6!^47x$+A`Ts)m8C3M;RM7DsRSFCYFI`~`5l}fU z;L$CZ;?XUm3c6^udlP7yw72em=PnSV`5zxRX zUC^eXlO>`ay%RygEli-Tah+iH>vifVaP~{{PR+ z;BoMU5Xc>%ZGGUl1`%lS%@2wol=0;hk8T!lLIfS9=+W)P;n5u=-~l-<477rx^(tsM za0Y153N-gH1$;=dLPv~>c+2fl2T-a9RSO(1f)x4Ec@L+){c2LddvJkY{w@u|Q6 zUtb3$FmSyBJ}A#)CnzjIVG0uGcu{`}6rP}F+;Q-ceW2sqyLlz|f~GbmfO;yeCrf2L zdU@UCK!t7xNCcE2z>NrvmkHpuiinCwFRLn80chKTjvyorD!jgGc>ARRsKszohJoSb z6=()U2`_Mcf!EeYlJpl0jf_xZJQUVPeATO6v?1^8(Lc5l4f9d zy#r<-s(Hb<`mepb%FduB3=d>m4LHhrd6%CQ0gpWjya<(m#2omfO$84~rx`kkl?k$N zI@CfG`}o_ofrX3bfB`A_xlN$ds!7A?o|Nom<6>_G(e}W$a^&Za;TMVISK9qgNv-& zr92+pvj0G(MC^#lQf*qXp_S2!-OmvQS*%2})Gmpz((y1^#V8ijZs- zqr&0PQKBNy5uzgaqF4yxLTn)_F2%s`dMemL6#MwwQX%=>1JvJl0QL7B!2NyD&UH|m z6*QFMqoUCrB+(h70y?1(QYU$IM}rqeg6F_qNWO%Wga#hn9gqzto*W*`yjk}^fybK+ zqM#DT9l=v;2z3e`y`oAW1cRrznCfq34QQn;fv+q5J6mAaq;zp7n3Cz7{I&tz|jCFP~wAd zc{0}&WDmSNv6H}Go{%yArVT!a9zOndM;zbyCmH6SUId!Jf}3B1&wTziaF-nGc(jB^ zG9+~hys(%8&cgdxL8UzO;34pJEC1($LJKHEukOX}Eg=-Gj zH0>8i%0P`?u>Kb@AiLn(v0v;JV_`=~g0 z^olOH3To_#sJz(!6q2(dKzR`)*Zh-}zxg{T&-RLVdUVHJ$nfYcxsc$|TXP}86SS@1 zx4p-~*Y-Y)hdnO-_OQIi-@6K|Sa$0b(0t~W)1cM=KD{kq8hm?27f8OdMx_AMgUbMw zlL0Q>yw|pZI_6;-KD}`ouAqjS2x!8ya|%S?aX0WbdY^8W3mHD$J{J;vx*_H%-29nkFn z-5}rf%JN+iVtB~~s+W6Nos8JQJsr@LCJtDO&;XV8_cFRg1-F7X^J#i?y4;KK=)C38E4%J8C>TmqGCVs^dP2@gi~zL=V1qEA zWh;;&EFVyaz_#^?L*1DGQVX8khgkG_CCD`uKAoU}o)8s|7w)1XEnsImFt zI#d{97ib70z@t}I5#|`sBy9nB%F&~jbuma3)WA#vM?UIA+>6>=aP!Vhgn{AZM9?4x zBE5mvJDG!`6Marez$4iUbl@U?J0qwEX8@{0!NXjQKN%Vr82FoygG3sC{$OTc;BRjQ zaheaZdmMbp?9uqMkpZLv)b;S_746$A$iTmiN6@4Br!#-^VUWsR(VhDQ8ThyJc!4XW zZq`dDL8;e8g#+9(e{uWE@BiJbt(!$i7_VN=4jQlaXgpXCnv6X7lHH^6=T8O(hGJij zUQw;H2saelc=U=|LhT0+ZF}@iWKdvW09|U)lnqKqjR*hBgU$|k$nfC*|CiwLspf+Q zkdqhnbHJgg0iiw$F)+Mb18wI)ax+?goWBix&otV4GDr@F%t3;hW`>tMIxoLw_UXI? znu`JDSa2_@6SNr)d{RlTiKj<*&4&n|ZkG=UKHWYaGJHEvc^>>}?|Ja0y)WZM&x=2O zEl=?Gfm+tSy&nI4Ef4ZHgN~T?>kc{o1C$>e{CZ=K|8VJ6)!hVIc=V(+)9bj)anR-= z29U`ao|ZrP+x5YD*5^ZlN9*kphZd%8)BhVmE#oSU)^DYpKAk}tkl^UFQ309B@xp)& zl6t|JN&u9fz=MenFAc#1a+hCff@$#i@Fgk|KA=@u@HGCJ6;*SHiUHUJP>zHw-T{p> zI=qYlMM^L0o(rHMcAvTfl-Iy{uU<6Ez=!OoXko0Tmh^kogGE$gdC7nI7OA3aQya?S2#1KmT9v ze9@Z)P7z`diXTGV5CHAR1?4uh^ibxF)?V+0_6J{VZGzN19H5oh;IR)#6CHH!Ch~ze zpcQ;CPBeop6%=G(cs(DM@SrqG{w^~|vk%mM2R99o=hHet(?m0%86LY`CH-N|JNU0sDO;Y81FL1;XhF03)G*26e&A4p!m&_pMl}^cBqR`!i&Fc z6{v_pX+MC1473iQ+lvR(i4=J8s~cS3mn$N*9>6my2d9FpfwdlzK^1>5E9Y~hW&x-* z`(hSU8F<$51!%pmM=$H!`$)>bt%u^Npz{xVz;+$bK(Y&b`^V8na1zMlV_3e#h~zjb>3gNP6jJuMfNtRul}M2sths(CI?Zr=N@|KghG`;0`dDK zuxY9ors+-j`~SsFh?5R~Kr#e;SW`m-I1n{?ao?9=52+s=K>oJ?`QO5$+eraDtN~gP z3p@K4v^oGh>>%LLZ2)Q+L596Sr?9>_)d_Z-74p$f;5eKJ@*F%wj3ItFa~H{#;DnF` zRR#$W9*DA~7|NWX${-=~bRyVN6lLJ>m4PY)kB_|A2T>M-VcJ)aHSiOurbCn+MOFqj z?cAil|6f!>Jm`x&PYG^LE7XI-_arw1!^itGpac2AwFyraO82jplYs%;3V{~iXyqMfJPc(%2DE+$w4t#9JeCJ) zCa(q=c$@{aFo@yBx=e`a&=oK8oD2-F@r{Q$;RuUvFM&=Tl^6WbUIxrlA)qD7Odg$} zK~Q)P7IbC!>lN7D?}KGL2V7r6*B^B=bW4NI#Q--(Ko#6^7ZuPwk7XcE7-1G4`Qy2|mzshc2UArp0=7Kg|229N?!YI{B5g$z4s z>mjBh-wHV;9OY@3Kg{VSMc$P3{ZWN0IE+CAoVG1`5tJ_v`WJRbZfPffk$_c zg-7e9vLw(bd<3XrssZjZfw$>{MwCEq2Guqapb2~MMi2wgbO7j(1qKkq0jvOi2@^vB zD7Axcm;xVj1s)1c@Mu1gari|@JlNH;Y&gd!!2Lz=Eea^-m-BC9OmfGKX)r9H z;r09A-EN>}_TKrBHkE)!C+p6|V0Bgqb?f2krXs29Tr9%yVv9AXd;u+cV69vt!tlbx z`S<@9=O6s}|H8`V@BbH~sek{!cmOJ0rC0y^e~fj}A`u2A(BLbi+5KWGD+9wzhX4Qn zPZ;6Aqw|MH=Vy=RH|ieEPdqcdK@qf_3a zGo8cm0RN)SW6eJp_*)nm85kOWyQk)rmdZ8$%FIjkEEQ|~nOBmUQ_6RYRePZb1LHAP z4G;yMU*%ua$y%{cgyH)k1_lNe{;8}IAkIMsCI$xnsjPeu4g&{>^M8Q|!}o*WJxWtq zKSMbUAeqNd4g(YaRMzt_4hR2K))O#}0RL3hZ3{#gn*Xua*zN#b8)SHrf6@2Dpe8#1 zRMxp5b%#N{E&i#j{a_C0FdF`;tSt}@#61-YL>L-uix!A5FqZNfp5$k|(ENa{`3GAG z-!azk1tJU#$5;bFlt(w~>FuED!vmnj?msG3@>VI85mMLjzgx@ltHc0Zq^ycg%~_+L7WoyP8L;gChz4{IwZu9 z;?cWuTkMZniB$hz`+CJp$H3)P6rQ<&WsF%yFpVK-Nqi4$4WUp zdRc8}|NZ~}L5fGG3Dg;B76BfezdX9_|6h;r=w*!s%OeFE5)-Ta5e6RJ!2zHH16o=@ zebH`V56cTBH9ptpg@P{^yn;>@aP5=)ou#AQHH0~gYFo8v8@gvl*fJGt%5F#945ivo8hyYmR3X%vUvL*>3)Ij1ZKo~62 z%W6IYlncSJjMkt9pGaE+I*bN%QXzOZf);d%9AwEgqFD(V--<-j4%+A2db`vUG$`rN z4LYi<^ZDl`paFS{|3VWKXrFH3Ak4|M!F96eil)2SN1<>MYu>A?(%R^xHM?mZc@0J3~bjPUVpxFNj zyqW_xsrcgYADI0C*zJeSKb6&b;F^1axF#KRq!nm{wYvv;Rwy`3Ajd3$oHa!Sw7LUy zfE$vk?l~&p#nH$? zO`rn7qwxsH(!(#>fB*mg5_AIy=n!GBL2xG{;uqvzkbmLs1L~67$>4DBkN^KcTjn6?fdh25-WnB9Aq);*5Ff?891!<{#NqA* z6{isQf`mctMW_O~7bJ@8-X8Fk8&F#sk8p5++*|$=IebA{u(-FoP{5<{A80Kee+xLj z^tPyg+kl!MJZygmF)%=UAprFShz5l^h(_^+0K^v{akwu)1uVoDAYqU%5UN1F0Er^| z;uv^E;2ISMkVNAV4gruaHvahk|D_Koi}mhN5dg`+eE}|N!2}|GPy|hxdGApbo4j_e#KMaiEQWhi*_YVUjEWLq* zLHgMkU|ACU4rDhdcyVE=#=Beh+&fi?ky;s<0p$UjUBhhHrG zg5n=022eW!UNM791LXNV{N(`?3(P+(Q2($%{lkLp9~OvzKu(EDWGpn}LPl@QaI}J51r_8v_ev{^5Z62Q-QWvWWxg9}aZ?a6tS6 zQU~`B2i!j(yuzx^`k^BR>Ul$Z=0ucWQFdTki_z5Mw2~g%A1(<&np#D*S z`bPoXKMD~4fYibLqX730NIA$qa8+RcfD|M7r|dHgDI^-lx3e;OeE0jY!grvdICkaCcJ;Htp>0VziE&o%Jrz##uLK>X9d zaQMZ+_bC2ppv*rEjF9#l0|O(Z{$XH*l-Ho+ZIC)r3JeU4pjJLu9o#<*jL`NDNElrI zz*T|$12PoJKWuRSFffA4HwMPTFFw9Q@eczdMddXE6U;wMQ2#JN{lkP-|1dB?{KMpd zs81P~;QnC(_p%t^sv!PhLg~AjfzRm$#Sa4$#6L`jUnrvahlw)(u)zGo0`(6I)ITif z{$YXmhXvU`EO7s@K>Y(#1@R9Hiht6;ryhg-!vgUS%i$M+Z&Blig);we!2H7j^$!Qs zKOE@(;ehyu1KB?uaQ|>X{R2}4@ec=zf2O^Im2V6j5dUx-e$n^_)ju4R`3KsoXJ8P3 z`bPlj9|3g#2tfQJfb1UuxPJto{(-52_(uT6KgZs}{UZSJkHFy<8(*XPM}RW_D8S-J z0qP$GsDBjD{i6W!j{>rP6yW|*fcgif3gRCH6#smC1NV;t#6Jp$Up#z;>K_Hl{Nn)g zj|0>{4p9F%p!>%G;vWZO|2V+?;{f#!OclgG4k-RnL-@x5;va{@F9gy2KB_;z|Y z`1JayaQJq5Sa?DY6Z7oM$nfp<2=E0Rr23+!Fe^KAaXP*UvM z?O@>9ZII&8Z3CG-u>4mN=hc%B-FFp;6>g4|Nl`Y7d$|FS-=xG`K8lEMdC1AKm77D@VS|A&7c!I zp-MrabLI@{{0w6Bzxg*q38zPQw1H>mjn|s6;Dxl?p z-3~uM6RQd!OCc*!;MSdKu;pn1%`UR?uY2*DnSb2}enXFgj}*Yid%37^fFcy-unF+_ ztDu#`pq+Q1**@@M0njqz7mi-gg%2Rh96**qhNcmgojG#`nqEPRC3-_t6kh5uFfbr1 zfXaie%3|>74N;MJ3EC2YQ1O|+&P7EajsM6&me2eJ2N=@$^G~Glzh`A>7hy=_x43h_ zqxq*mkxEHDXcDFjL^|-d?FP+sL8e{!+x!_B7+zik4NA72Eb;SbJ|K{`@&kW~&S(C7 zj}IP#|;u_cC&;0p591kFhPqBd%TQKmPczpq+>_8g- zH71Y>j@Jj$_}}wZwLx5V@-u(Fz-Rva7>*BV{O>QM@xQ+bQho_U+y)VttoN7G_^$~a zPUFwNn8u%f6J(kW*tGYeCJh`0tK?t_R!AmTKLIGE-FN^^*Gf*B28 znjz8f2SUrTw1D}lpxmFv|6W%F!Z($H(6%aIny6@S;b;H_v=7Gw5Ea6)07S)bYyeS| z#s%m`!hnC1p+{sA;KWd1stm&5)}UycR&fi;?C{Q{P_tE zpzIRxnLocE;WK}JMFChXC|OwC0i_FzJD`MNap%7WD`@7{v|pvnhaUzDhDfEpbFphgQn zsCtwD*U2x77#J9ixu_^09kzj?p3kE@3S5OtymW>rmq1m11~l^uHeUj6K6nX%#!DfH z1`SjV9?icw_?te1DwO8m4*X5q85kHEY|qq)Fff*6cz}hLFfcHD=FeyQ%%9KynLj@a zlnCQNL>ee1g3IPIgU|f=^#*DDB?r^^OD?DJmpo15FZrIvfBR4x|LtdK{I`#!@n65- z(R|FoqxralNAqh3(AnP%3?*}pF)$nk*;8bD^j|*P(SP~;NB`xADIEQmAFpuqZ^^@> zPfK1My?Xo0(ZAQPq3i$uzvRf#ALSq;j{YbId8JI+qnpp8Tim1h7>7smaSrfu4$F%r zk3niYx_#t+cyx!z{{UU(Fa>NcLy5UZFV9`@nxOAD9UA`qC};KPHhT>^$5rl!$K`hp z4gbMH_8_4e`5zva-+O3&_qhC=e+uYq2WWW5s0e@}6}qJflhdrBraPT+nVPIhJZ2n7JUbb|t|;U7=w|ci=J&8XQOfVt?ZWoMtJ{bD zhlk~fl4=kB6CV60Jq!rs;)fJ&Ufm^Zpm6iJ{0u4R zyt-@H!9jQVxd;C_5B~EWhTluXJ^1&Y_qhDdqxl)g=u()|JPZ$b7@h=Ov^oC(|CECs zy)KUbK~BaVApEVO|NsC0%%ATDN|XKqsKLeG`u-n87L-{170_jmLuEk;*dLUDk%F4P z6?AA5EYW#3zi{wu{^7vi7W?o2|CgXsOOO7`7d!edU;gO7{4`LC%~v@3wB*pyzt<0# zg8WjdeDrDwDB&K1aAnYqDiV6V=je~}mm&ZD{|C`lQ2GyKFBGU?LZq)Q7Zn8`&<3cN zpxvP$IS@vXmjKBtyacWN0?C1Jng@U0fi(UEC@wg_;L-eBpeDql^Sej$Zw3DLUQpKW zb&>nhQ5@~F1r#L<8G;z!?>+&uEAR{VCU8Ys2kKKy^Y(Gq^2U&;FUe-dzAhD1Zn95a9qK0zgCph$#5XU*8Tg4n%|23xR0R`Z^E| zx*ZlogN~E|(H9`bwu3I{0`WoDK6o^~206f^@i>G6JEyqmCHw#X|BwECe*ok_1_q{L zx1;~+*^mCKcUJ%r4j>}IqwzJ!YLCX_5DM(C;%i6$)w{?)0Fwv6%V_>}Kfq?;FujAl!$to8;lpX2>}j1Y z^8XHZvUj@3|2gc@$qvFEoi6e}4u9qc2dsi6y9H|8H2-Gd zZ@UL!aqu_20d>b(pgkS|{x)!2gPKBZplfJBT@n5^CgjuzTHy$aY*0#W%VK0;_{O>| zACwwf6+v4NEdP~RfuuPY82H<`m_Xg92_WfG!OjnyKURXaN|dm9bl&{D-^}!c+++HN-@)GD1BzOY=HDzutley#?1$63*}D9g(mL5Y{Fx4SvvvE({pn=y z^Z~_pHyb$0LCtW}**czP1 zrh&#c@<8JoWuWnmx&qM1jEfv()J6_6Y9j|3wUL92+Q>mh(BvQ^XmSrg8gM!#9h64% zK_y8!s3fTe8D9@dq%QpRKJp;r>qF#0#@ENlgN&~Sx!r}o9^`lz{(6w>UHI!k&W9Eu z(0&Uz91($o)fa7`@&e?#K5&uc!k<44TxPlO=g$KdS}y$g%fO|U3xEDPaIxjWpT7-U zZn^O1?*k=fXbgg52ob!H@wZ--h}zaL~B zDD8u?OYb&tIoZ1(MDh26ItMRvL90_ce|l(s^sv0i-?Rp#4s>sh00ZoF6COFw&R?JT z^D`Sh^XC^%@Hl<|6awH9u=zMBAytAxI^S`FXXkHU&C8&m@dQU^-~}Je+aPWvI5rbM z9Q~KC=EHc;L-R0nAi)pRB@1&n`Y%5&!GrPG(ZBWVNB`FQD;)h>AMSAUZ+(0MXyQZj zaQS%;#={^}eKx2>Dh3ru)gbHZox$v-6j)<{=-=%RY?PJbHQLp>+qpMB4#S zi6hb0z{J3S%}b5PKtTnqB0%1H4)WIX_yl;h1FnS1xAL$10rHyy#BZRGt}g`n4eZc* zN3h?(4y_La`wi^S`os^1Jvx7U=Fivr%%5K-;K6wRGk<;^cwE}ez^6C-foJD$khlCC zKx9~eXY*ru5GyVLM5Yz^7=l*zgSy5Kd^GR*Xx;`T6b1o?@@l9LkN(SddvNq$zTW}R zh|dC0JT-VUzJqwG-u(e6vJQYEYXK;-8ax``gQTFE%MXIQ1dT3@&;0cTpaQ7^(iMEEn|NrB4$a9cGp8Fp-`uBPG zf}?+*$D=!BGcVz|)v;;RppfN7ut*lMt$AoJkL4G-W|3(|l(KWcahbV9&R2Pb}p?;k;1UBSo7eSZX+ zapN%jZ}`pdlB?k*&&~&~h9`IMfwBWDXdVt}rg6tEuwOujEP@>c;~(!XQQ_Ee0xSuZ z09k(K%$XhPV4+Tkyd9W>ED!e&XrfzUhZ?#9MEF1yNP`uCPJ4owg6cnyZr0D~A`Bj& z>1!3k{~o<2DxfK6(2oBQ&?Xxf6$S8oayRV6Igef&6~k{H-K;upf}s75-7G5IAeEVy zz~}9O>_O9jcK9%BGt55S{h-K0w=(kp!>L);(CJX{3@Rir;TCUp#bz-sZQ%3-j(>1) zxO9i8DD2<^hY2)!aieaCL<>LAnMDdaK*zE2vw{wj1kKMPAHdLE1KQsRnq}_>A9%!i zr51Fq(PPl&+W!|kI`4o^QbbM?;PII58qjcTi3(&mHq@i@DNOyFSV%NMQv-OuJ^-}2 z+yk_^+yiuE2ITA#(4|HOpgW>8d^$^16nr{sKxY$#sDMx6<^Y|D?$OKIU-S<=cV7d# zJ`JR*J4ZzWbO)3H$VuQ6)4=n_9v;m{0w5N9bhC2SL3Xz0dvvqjt%0zU5%b`!2TG#A zXTi1}DDmm;0M(|gCrg|>x;sEq|DZb>%sje13qTBApY8_GjvC+A10{;x9W0Ct46P?i z#XY)tm(~g~`1JD1fm)c|tmQRA4F4az6ad}H`Cq#9o8bZQ8I3-@vaYEj3?Cf%H*%Lg z^yucz2kT<($Pxi*PP`A=OU`Nq)(i_UkK+fx^BJsXnZZJc_yiqx0E&MZ7f_yd>Gn}k z*};jN64*SxU-0;U0F<{iAb|mz-#|;hu=oZ=cejs<3CJ)DkYP3+-K_ho;gJto)d0#$ zDk>oJz@ZFD$Y56?2!#7QjvoN+ZG@LlXbBUl1wH@5+~d*B>WS5Mc-Dm&fUpk~9v;UJ zfQ~xihm_SI6<~Q-c@0Ya5};)n3Lqb9>^KDuF3>4B@bH0`N8pkWq!xDASBi?p4$y{E zepYbt0?IxHhdnyKfL3Od=y*2&WGGRCmWH044j!Jp6$vlm7#J9QI~@&De4zWDU)0?D z|KIWdmHqjk1Hf&-_P_oFawrso-3!U!#}9yd--N>td3^;^7R1P+7wpsn9X{O%GJ zp6(D80dVl|09~yOmIT*oAoXD5L8gO~^A6C3)^G)2`QyhxlRF;A4}nV99UfpOK&(Gw z_w#TV zBwinSG57HQ|1Uw?4xz~j^}LfZBEtiG^7ke+wD15Q`3`Xi=x`6v8OSes;fm10L*y_d zJU~9+=;i>`Rs!8pmN!ck`L}zp@NbV|Nwd6JD$wn~(e1@yd4him$mbG=4G+BjZg}AJ zXPEQR++U3up5POTK*0%#&ll2%e*Fho3cgU#z@s-%0CHF!_&kAwD00mQ6;PuXG?DXS zmnzKPXkKzW^#A|M9OT2yQ1*L*&mRFz(V?G_!C~yxweh^7VRbifu3zzsvxg5*~c;|Nobu z`V1ZwU~O#|Tkj9%oS<}bAU{)XVooh)AKf>M%%N3VzjXg!O8N3Y0bNZJG4 z5%&wUiMtzo92RKt=Klj8%|C2w&VnKW+-!r?`Y($2g7({k*YALfN)E$IubDmmAM$Aa zWm{|M(JK?=(Rt6~;A7@)8}4oyX3P7favt3=A3U9N_C~P?pG`_=mr3C3sjE{Z37^G8~-$P6#kCywFoXiId)mAW?`{LD_8nUeqi& z@dBvT13ps$behL;7ZuPhbcPqt>!Rfld%7jbHCz zX-riV|F#JrU-56738E}+mAde6n{ZJ8bgAu35M^>l20tULSdpvHSo3m&y=tqWP~65?>0SE}I0X%O(Nxp9W~?095B1 zfKnC5i{-nJ;z0wo&h18*Ln{+N5)F^;00ockVhxY( zY6VbL?FW)Bae)++!4{xJ=N{b-7NB!+ATfhfXM?&?paUa0KmjKJ&c-ix-h?Cyh1Zu2 z54=7P?(24fMyWst--6UhyqE@70 z$NfSUZU9>OyJW}z|1aZVsRCXdptc|R+vb4c5Q}>uEmR9g{aFgC4?*|ua(HwX2zYc? zaClhWFR=kdGnOWLua^WUk~ln?55P}@5&%24;W{K@C0?IF3UnV8ffvUPfExXvMeLyb z4{97+KIIbWCbm8UU#jy-3MH&D>NC))rWa@7iqOI{WILojL$yB* zOWO$=bl}Fl6aO|37XEEfEEYGhluEr`;A9U9DacK0paL4~jIe9)kOGxTFRpF-|NnIh zCi^TFirpRp-BALTH^D6d(3MjXSXu&x2VTDi`5lB&{9lG~9ww+m z2=+Uu5eV<9g2r85e3F3q9nHm+TmS#Zeja8S#`&ReW5MYZWD_XPz~(Qy0*$i{)Jjtd zWIT@ZLy7D!fQGSN7{T2S?Jo$RmIvTy;e{(g^W>B*kn{_V4-ZHh6@X@MW&Uj*9Q@m& zI4mIX0Bwi+hEF8_htE+zo>r88I+w25E=Y9biCo@RLR^`sX&*Z=?j(gj-Mpt!#*9y7n7 zwZ&fiUWe3H2Mu##D^|A&;Rrq3_5c6B?#7uPs)!x?`dES(;1clY_7=c3q5x?hf2Y#0?iF&%WSIcQQ46oa727*M=|+k6TybeBL5pax$tVgQl|05t|9K%;cfd(xs< zfB)y_e!&cKULI(EsJBMN1GE*m3v^~&E8L|J2C93BEMLIGz)XU$ID^(VXzk|{{0s~) z?h3#Zp=FDdwG@;uVEZSX0mTZqZ;Pds3~oQbTFBsWNiYYNXTgpOfSK_6(2FZ;h$vr( zZ4ZIn_lO^d*E82p+8zR%Kj}2o|7h(YE|Brq+e7?q`>~ccXn7V~^nuRGejx|<12~R* z105jw1Jt{pv<4+(_Xa|5i2=!#q00pz^hKe{H68>{d!kHzfSX#2_;7@u=Ia0dU#dVe z9!mPfc3%l7t6{6d!T$3*1r5WN10{JNl?I>q1suSafm?jy7w~jQYNP}RY5p>XyrQw0s&kPT|e)J-4)&Kwa z?kgd({S7+2|3wimj_~@qlG5}BHecx^G_26l+bodr*wY(H`DGIi4)iMQG*ok>%LR=VHwI9$Vf5+yChpG`w35l$e9O zZQ#-E5ddmfSa@_t1;EDlBRsmjBH*1;EScqn z^9R^`CYXQG@<$cOcpUkI$odxCR-MENb3Zgb(Hc_VfsI_aBDDDYvJ_iUt+8Ud&g!r{^D1iqvKTy=n5^7#lf`XK|qFN#49XhciTgytI>u*^5y z0-w!^I^V#AIp4qxvTq`qeTAt0H9YW|6Ev(W;nC~J=+XRxsn!wX8wrnIo(51tHSp+_ zIRzd&h~ASlU2~_P>kqwx2=aPhhMaWIsP>5WfX zf;P}#GuScRo`{(_3s4gjGGq>_=3X>|Y(@|NDD?0Lg}%jW9Z0Aje82{YZ^j$ojv(kl zmlvnOlO@Q}ZQI7cz)*7r6ctEG@r4k`!U<^Y0dP%>GCps3;59eMRtb;)2R%AZcz{i- zO+mN-wAKU^`4%3%G6Jy3ckt*nkpNvS!tr9)A9&=K$brf=3y^UN9^D~~kiLOOw~wTS zhvlh~8OK~yJQzUX0+~PualuIg!hMmj=>Pwh-teRWF7Z*^Pi%P)8UJC0r2%lWBItZ<)HDnVFl_B-(45+f zd(0?tfh)3q#O&0xKjqp)0AtA$fi;)O)Xw8yl?q#U$H72LZ8&EA5SZ5UpH%(q>F%(uZM4KIPaNiTlP{r~@EF=SE=5g*NO zkZziUj7w;Pf>!`EE+GXQmjEp<2bHu6h#M$>e);vEpBr>?KllW=)1YC6W02TJuiuDl z-+7rr*X}&su=LcQDm-2N7 zad>ot)*(4?cvzl>PFkQ$l7r4X17Fz#%3R=EF{bQ-ga&ky{Kb}8*wPosezdX-TU`L| zA71(k@uLK&xqxdRbS+#FTKYD@YJU=DU4*Sa2DU$GC&Wh*u!fw0N4EobDUO9lw)?+rMZ#)PF4pN(?~-wL!Os z2)Loz9VKFUvsAL%L89AB!tx+wZ7W(df`*-5yr2I6|H~?r1}92*^S2STzT$=Ybcip( zsRwnmY0nqxw zr7tE-`~UxCG)nNI^*@PBZ{YHH(N7}6uNJNdE&N!fVJok)h)Zu^`;E4O{0OcOOZ33$ z&7<1^9GRf1|JssI1KZa_(2#P(;v<<+7eX#PhV?+{>MWOz{v zSA_0=knQOCjlT`Lz6`C*MxSp>@Al&8j^MDoSsLll?EzYuBj90qy3_-*qBTmw!}2u$ zl!GlNvCKR4dO_BBHy==dG!;N?SN6$*Ow79 zJ}`SSB$%LivH2icFoEmdu7;T5UlktuZloLO{rVP$olHCph-QEJQv2V2O1nHB2 z8pDXmHEnRPAhHr@_4u|Iu9N@&e^~%N?G<@{1!%kiDej0`pX&7(G=PFUfYAJd53@gc zc@lViDoT3gZ(9o~Um$zNK%kULFTfK^)-GEpy7FyW|vT z(W;7vPq)i?4xetG^PZL;NQGuS^3NBDUYv@%sK@x{T%K^xsf&r+N z;Nj67auB?VFu@Dl9#nvEUvN+Q|No^Kybwb14>9Q} z8hn)k(s&bEu?-&FWBZCDJ@rn+o1U<=#|@xmHEb;$bVd}ke(7eZ1FWcqHrkLXHTd$k zUMFy>hU}~XyRKpbBrqi)Lyw@G_TtL~V%pywe{ zFG%_Va0+3kjbumB>EbsNuz-l>A+723_0;es=2o;D6PFoP}i}n5Z z*C&@npw=(2{0Sf5W5FEXyWIy$N~qbBspcHW;YhLl!leKI|JRey`j_za9u}bW!UmxH zX#fj94fvRDEF|<;Kv~oS8dfIYK-L5a% z*FnNaq2)m7;$to<0pKt)@Mu0_aTvq}hY^JPqPq|GdXKVD?BSycDjdL@SwSPthrol5 z;K5J5e$2p8thoqsD01M4_x=C>dMdby4yvdj*KH%#*DKaaeBu{ix$uc!fafB3wvws( zDfZ>_Xzdk3@yUuApR2*;2WosWW5#DnFV^@xhON8>kJlPN$7`E^F!T3J>KSm2cs8b}2%JZjghfk!Q*mE!>_cs0617$N0ucZsBc#mVZls)PrAqq9~LTv zkNGO%!^gUdy5W=Ei5WhunBjAzlg#j8r9$|KuOvQvq&xA14>|2cDe&DFs0ElKW_xjQ z2e$U&TuAwaCx1EC=7QUcou@nwK4b=!pAOw7lAvwa9^E{amgh?CJ-U6agN~=YF5uJc za#_HmJLED4s0pbCswFf)ZD?ry1ac#I2j=tTi13;Ws*u3N5~M-`alyqBg!|%k`~Uwh z-QdL%YWt9k{3hLwnV#4%(^E-1ndym*3hC+iGDP?gs=rUS;Ym+qgwO9*%<$pF44;rT zGQ)?H3gNSSDe>X6x)o3O5IG(Q-Y;_K1t?%ZTL#g(?w+kkkdPQr$5INog-hXZccMo)Y4{iNCc)W@it_aQ1Q(CZ%w-7l#3%38z zVn`&QjL(9ba-i`R4)}sqq=p}8tmTCi$Y$*0v;1w%Sm)cYjZs&C)(q)Ahs6mv40p$;7Uedy{wV5kF+9i^eG z1D&!0Dmg(#D5R$d9y7K>R|meV7{wppmHJ|+>KYG5fWj3tRSBNB1dZ_ofc)|9Da^lU z$)mLC|NoZ>|3J6bAdP46w;6!$^}yI)gl!BT96$3G!qW(U>uyE{2Ezj_2l!hn;4D)Z zt3?XrLeNxTcLz8yyF*kgx@UoymZ$k!zcMf|ba#MGzUZC>B0*x{!xX!_z(LwQ15AO0 zK?j+4cYr2VyJvw&kQnI5cn`?gH6Gowz=3OdlfShSJnz~8I$>5H@t}IyidT!D^vv*9|~D0_b){ z!;`O@4NtzTfo$V0g;3x{(V&n4D>OX$G8VK-8axf%+W|?SAd8?m03slw0v^}~Css+Y zZ7wPjFQo_xB8 z!#$PNl!hnR{6({{ho=Pyr0hqm-}~CQR;rM`HyB|cYhSfcpUC0vi%Bf^Az2M zg+I9F!k7pGH=umsiqIM;S1KXxS8VA;vD<^AI|?)%hIF0?O6wbOgc54{0gd+~uP^Oo z)mg~S09xGnf;k1U+y~skHSp;4;OOR^FChXt;7%D-g=%!B3? zq=Oy2HzY+E_;)>E0CUbjIE-M<9tejM%-Ia#2!lDxAsi7fXEuZ*4(4=1IFeva34|jJ z=HyC>Fcj4pp5)*4K!$(P0mTy?tf7)3Aor*=|6niXLM%z`@KKQmxfyhd^$SpwuiHh1 zhkw@tX0SO*5JOq{CmrP97NR1rc&bB`7b3<1R=@<|aPm(&(82mmLIgbS0GTWREu($0 z57f+LQQ_b9fU#JJf7b&h{z(Tq4}#7Qe3<}hj2(FW5#g2>0p0~282L5d_at*&f@Hdx&veUf- zuUYuF-S%ky&C1^l%59zBo1d|JTzu@)%NqJofWei2n~wyeBmXuTiRS0*9+p4&d%#OX zK^B1T8{pqo$>?BlzgX(Hi;BYE{|pSEh|mCKPk2&rwD?){(4pZU6MqY2>fr|yf13yB zAlhw_OfJ374UP>z?D^Y4^9>FS|Cmb>JwWphZSr6hj?BFt4Gll-%kWsx{D}SFBcbN! z_6MKyaQw&v&doWD9lR3LVM4>au7QSoR#!f_b4R{m{=4?d7T_(Pt5 z+o{e&-!CYhXnX_;InG0HlTgAB#U$``Q7}7R2%Q0?n-|;=iUmUbJq;3sB@VRo0oq*9 z{G+~H9aR2Hc(k76Z&Qb*lMY5uP#K_DZu_5|fuY;QQXW(X61+foJw29O~<%_kl}4e2~_@FyGG zq~-_q%_kZSpgAlR0mDlkotHt!Zyolq zJjCDo0Mu`91|2WUzs*F@q2XUcF{{V_L$B{U@NfI((QEr%50p1e%pDs3eJlmb9Chsc z(EN)SZt%?ffp>U{M!zAHveGdZ(aww0PW%fpI+V-Zv`0K`L~5|FuL<^ zW8v`Wjbik)Jj~zR%D}+j!oMv>kkQrRa53*baO5(6dYStF|9@ADTSf0Yn*TACy!GjI zV)C>+P#omKzs-e<$+7tWI9HajgEhQ9>(Ts=x#YM{uM;y!l`2>jGhEd=h^pnF)8RDW znde2xNpJ|}LZ~zd6%U~zz!WI-z~={}m0zGzi^TBTu1it)WxN50p9qIL|27v6My%m? z86*5|P(S>T7J-|b0EeG0gi?c0@(@Y_OyLPX4bbAT1W+DO08M}h7=8n##bX|p$7*f( zx7irG^t$hNZ1^Er&fI()bmUdBlMDYg79-bQkNu7fKPAgq9Ged)xL6!7Id#lM#ee}G zs~{dD3J)RoqUkuu#VGY3f7=Gg_#5&O(cLa82_CHn_*-f~a@{^E5&YW(8-986xBp~h zU}*TI&EFCaX6W*_fR5h;NwtCp#NgwBy`tg{kWKsopv)@)Dk5Hd0@s`_Dxf7kS{|Tb zB?bnD5A~o%sKzIL0T&gGPyB)|DjCOIR0_ZoHjq=LL76rJ)M5rP5pe@`k zDh4Dt=%O3Q!?3^vJIEDbe(8dj>;C=!-|)+?Gzux0SZ(c)b%CRpAEArCr4ls82VNk_ z!0-d?GSHrJ7ZnSvE^GLe$=|Z;FUX#}k{RF|198RG3yqxr|6dwI#{baEcY(Cy4F({` zFo0?u1yCj07Yt6wAu1C5+oT$PYxB3NGBGfKMvoZ`zZw1qWxd0o6^*^1G|Ar_#sn^v zS)?2re(05IIJEpP74_)ep#ZuIr*j9W4FW!R{`JXYE-D&`{N>u~alx_SCue!7W5W-F zQWcNx4PY&;-%2HXx*I_HJpZ5Y=>)SNWpX=AP2)e1(pnu42!p@*G$R9pO9zVqOu_$S z9-Uz0z#74O=0LWTd^px%$jrdN`1-j+%QyZOdqxHZhnD~RE#NDCEKl?It_Ig^pynk1 zHWMj_hJUI2t>9~bdW#u7EYI=x-T^D{1-IvFgc%(g{%i9?a&z-xCa`VbpaHFm=5K~H z`)s5f8vYv;l{hr~w=B;?1YoT`fAcp;l?DzxgCaS{h98#Y5+05J1=JZBYHxV-+Uy5c zki9h(7ha$A;9vjUgLwleXgoS0l;!CXKGbjp@leV%q%e1A_^(?k;L&`T$>aDj&}9(N zD~CRV9sbhk|Ns9W?TAQnX!z&K-}3+8|NpP2z`_=8^UJfKz7k5LHvHBt6+8w`P>kRN z^YYZ+|NjkdzdZaG-RKuehd|})3uy=?0-<;z6dQ#4e-NYuQZYbD^z1H;>(H0x@3z}4`iE9lJh+pdOBKuP!zxFrKRZVe zoaKRz4Sx+v`F&dtlyZ6gKMfAq*AqOOe+kzrd-s}jy7F&3=hO?7mrTRngRL=sgFg`&-{rkWF|A{mQlo{rNmEU}+1v10(kZ<%Zym$biZbGO_5b89Tg60;q@dy4k6Huw#{03=#GN_s00ouk0l4-rf-|_>TmnLX{ z_>I3n16BO}w?JZzzqWy@^`6~Kpc6-5YkIp#xk8aa65M}wPhJ6?4-jvsCJ-S6Mzg`Y946;?OGem{s zg(uilQ1Etx#sf5=rh;>2H^iN-mufXVzTfibmK6b+*lo%RqAYL04d!n)26>@dmpnNy^KS!}vn>ZoggrWMLQV9LJm9H#(3kVHPiKrughNM(N&;xW z46?+~qq9cEz@wWRyfP9rf!N8S^5V4`B+fiQZN?XKH6c9kC~JU6x1dMoX^+l}`@sER zNCvN#QVF21$uK{u}D2Bj^L^V*Z7|NmdE|MUMpJZC`|sPz%=+s6XX9ME|P zd`b3C2M@{H9<4X{TVp`!s`V0o4`|LE)K>H0*E$3`DFM{L=lR4hz$;P01-c6poW8;J zS_`Oo;L+>x-=q1b3V-`_P-<)bAy%jB(ar091eAkBZ9r6S#4Av%qgjrTf#DOsK+hr2 zIpm-CBMudOtp+{>G8AC~Bisa!UJo&k=AUB4#va|gD?r-1MOT8T?>9UwFBDgSG#~uLA9oO& zW`r1`K1GNjS<-pIqxlh|$Hf;OoEM-Wc;FL%#DSMvK?M`E3xnpj7rSS_7sa zaR(yN;*a+c&iD(5#UE%;i9h_nXO#H+%rC%urw|m#?~&pUG`<9lKLP&sNs##Cs?+l5 z=FL6?4&oRP)f@2*9DkCG3=E(71$>%rd{;0vU-g04Y>^J-9rYe{zAN?(9LZtImNaXw-o; zH-6@iJBUp)LJZkOf-WjxS0Y)07ImP&JMbA4b-N%@hs~fD|F?sq?gxbW2&O=hhJ+FQ z^WGMf1EA{#tsMpU+s?8wFnBb+IRL7}I@hS|0MWfry1PZ?1c(nhEw;Ny*?Mal>+|o10K!CKY;cV zeDLVaQTgy9tOc}xD3`&b*F_}*Tt;>GKrIB7x!qHsHioDOyvX|m9eW3zSC9ZoU~o;n ztc~{tz*9~fFU)^{jC27tZ+%oGI$cyuK7$4TOj=Hs>KYy}Jo%Ylutntt*dHw_55RPf z3iyJsZm6FdkAQ;WFgTQLJbGEL{)SGgt?_`&fpK_rwy3NCX+7@10ZMq?ypDf`8Cp;B zw=M%E+g{$))}a0?hX*{!JS4h#W&a8@c=QGcw4N+Y0?9xE)8No zdMI@Be*6Pc8==v9vQ*BaGe86E2asbtUV}1S57_#b2B3CTr;G}yoacDK8whe9#ATqe zUqr{3vSo(yvppDzmb`UDWw8KBTD`t3K=>z7K+Jvu!!K*a|<&U$&> zUx8w}2O4!PSfdWH$>XO#$lVYpzupR7rG^qFH<9FDf)_7=QhG1%D@%|sK*6#dS%n%X zz~KgfuA)QE6Fr}xNe@(?N`Pkd6!^Ers3`JpD^XDb_e|dW`TxHKcJK3X&}J7&!bK-@B+Nyzo~8l{zJ<4HIU-B7fN@-%1TIDhm@C~U=nzRQT~TQ%m2%e^8W_3{0A+rWbo+S zqXJrchgk&#*MTw(qzb42hirEbw0wqE0T4?;L7n{usR~GhRsj%Ay{z+YLb3+O3lmsA z1gCk>Kq}}kNf(s>Sfc*~Do?;=erJoy2T;oG>{0mvqPwB~Zae}Cj>F)VRfI<`>&36o zM8CoblzO0v9#l_w!0Q0p?~p_ftpk>uf|3+C(L;OysskjygAy`0(Sz#%NJRv$1L_38 ziM}30f$M;`-#}^+bpW`!1v$p$DWnbnS&vo+aC(EB*P;TFLev2eTR?TdOD`mOSRL@! z1msdste!%WhSdSrzCgXc))Ax^>UGpQ!08*r>(Dx24cI_5ugihG1NJ(&4uCic?Dg6F zV6XRpC~$uN^cCuLL>+*LvtC~3C!nbAfks^m)~G|&0be~q?nbWzAl8GzkyXIz0EhwT`J&?uC^>`1ySsfrgTf&y=ykvgXdSQ;lzxx9s3d^%J*=SwnxO#K z0SP$kfUVa+z6aF--U>){zywf+?gdS-fU7XpKBzK|7c4T!bpR+oc!1NA2bTPRKTzTM z;ov7|qL^V13S4NS05=`s`9b#!BvC*sf$2t|;6zIloL@i@4Ner`N&ph5;6zcz3r-a2 zAPSr)?tTWTMN|S{KSX%+@|rxts00|nO|=$qV-`^fKuib4`9pAf1}YD$1il)ATnNes zhmfSqosI){!B74wc56*F*A1+N4YKSGN`a3uiR%L=Xpz{l4)fGPoVP$gjYlKUS> zogk#Z_c#tIeIN+{l8nJ@%u{|Nno2RR zyIWL17qLT*nFxUF(gqKJDCa>l1jx%Fha@$bT(2aXaJ=%L?r?=BWnR_s26}(1|U|2 zM`w=;X!#4MKLK9Sew+n#95A>$1YL&&THp@a!U7uTlmIba9CLvjQ?3ANU}%7}g65V$ zMu9J|>V|s0@dzkP4!;Nw{Qn<3FoYa_;P^LYVPNoRep3PRMFFTkRseE5*d48x_*?%m zGcfFM0EKJ!6cxx>Fuxf2doF>i$vF^r_ZI*2X#S_f-`)=%=k#d)&Bfp92&(w^&6)`Y zk{+GsJvt8}jne&a01vz!@a%Q?@6+7^ZWb7xe9h+Z|F}=*Ne|2G{JmE}1MJPM%nYD) zNIVvL5}FgRM=;%`m{MZ4uk{$>XdgMa;LSN?6MJQ+`VTAnOo^|U-# zw$Y=T)r1pNg7B(>sN;u0b2y;n2}@=%Dh?jKqCeh(3NjIu7w4_u1sSL>dfb776STmN zH~l@N6axoxFYj?JP#FO(#lT_G398kd--Ajfa4A*-YRZCIIv$;%Qp^X`BnNfq6d+1K z9XfMR#6^Ibu^@&6DCQu^mN)w@sATU^0mU3BVj-zFN2S1{`AEfKNK@8DB?6RcIbO&) zLmZs(dIv-X5|j{0MwsMF&;_F4eB8^+4R$-Ie0v0K#bmrR2DNazSvfhtLG_DWh`|FA zR4*@p$M{(PgM_+yKd=ii7~X!l```cnuDyZt9UFd0mUFuH2CjSwTD9id8@L}Xbn;~+ zMC%cV)~yh&4IshJ9!M5F-U9X{xU@SC$);d-H{7$$zXeM9JwStLAPIq&TR_A9t+)AG zKogE0oyR4e(>o0<k~Uc;{b-=UhfA^4!Z{8GOc*zFxOed^m(Cwq*0kV$c#T^HTDG9GHdvvpkv4N8SJH)S- zK&^?+3orlw{{R2Q;-%oRrJ7}6iq-f3|CbwnW9+v&3h75c5`T_L1*k}=01ZKaQ+Mlu zQdVej0xk4fPx7~zcD3Es8qq9XA^@HeP9c2NNz6a)>#ZqUIppjjI(P?^yy`xn$< zu)NIQ`VwSer;kbjs8G)E=q^<7=&sc8>1KV+BE;Zhd5phhBd8cW?#Ka(@NU+S*TM{~ z2TH3wdRhBaK*a$g$d{0U+)<*N)#Np(IEWNzJy2>2l7SQyjsl?i9+b5~3EHC*TGe#+ zsDO)>ZcvCd9sz~kVNmKpXarTghTvuv$cfz{DjA@W3?3DaURHjv^&kZTC<}9Qg0ZPj(DlfuJA*ql9WK{sDI|UA9-ghrS>6yQEFDUGLc~z7_Aq_5gAt4Pacu&0q zg*3R}tppXkkdOuyyu9YjpyVv70iwXo$9Z72;N~MJ$ABk49FQH}%lrB|r2GZBAC$_l zM+~UZ_hNx9#MJ?>x5G+bh~=QjXog9?EC$B|=MPA9s&0(dLT`uPDm7kX3i=+kkc=?rB!JIadiT= zV2XiBA_tQV*aM(ovV}{-f(hJo%6M7y=l_4u>Ir!dY^4NvF~ZABpaP)toJZ$n!~ZXj zf;hdbJkOwE`Pc~JDsWgvAi}cxIV3E1LXzA@1uS71{u~~brD#d+3<+pw8om2~y8oNM?HV(<{g?o1KSqEG z`v_1gIm4s71GM7Eqc@Ptqk9HqHv2YzUld4nua6{GEwhK_O^;sId)wH+yH&t-5r`0Y zVa)=m`k+l)&^7X)Dd!B2?#*B$TfgzQdw+L#+AF-){^mn_3U> zw}I9!9b+=^X#T;--zLk~f4e&)1A}MdPY|EK-HMTc!B_L3Z|{T$fBygX z{C*3B4*s(DRlMNCc+AK0WSx#rr;myQxZ(uG6o@DALK@kD;GkoCdEnpw|DK&EL3gtr ze+e4P0r?obMvlMz49KIFANcz~r{II;&7s%sfPGw|BJko=0mR3kL=JK=DE2)(7%zHg zL(;tEDgJg)4Gzi(79N%d%ga18FMt}W(DbBu0h9;=JQ#m~)08Iov?&gdO#(0Gfh-3n zD{wWyc;clfs0!#j_Ob|+ZF^bOL_j&(MWq1L7X)of2d_PaM50IM#g~i!{Qv(VV-C2D zmI$GuAXG4fx-%Or=L+H3K`3(wbpRr_6GACDgT@cgXYfJ3f^>onFTG|z#v*9o@gKC( zspbnPNhusgogW6>P0a4mIRO-duri_bWStavAxYyekZ`dw|F#&${|&zlO0Iddo-F0| zI1XOI2x%`sH&nb(1-l7-{|fH$Lnn)F}>==^B#icQe@f&w1B zg$52CB{Ccyz0Qmtofkb?PnKzVbRP29aTYpN>d|@GJo^XMv+k2|{%{{{R2-8+;QN`gjf~ zmo>i;0F}oapz;`emNxk4GX=wwhPPi!c=Q%Cf>wJod-U4u_XI7J1TB*3{Okd$C@*?+ ze)qWi4zi5qfM@Fm{#I>}iO{vCmY-|+JQ{z4d|9;pr5;G8^*?{hX9fm_*IXXGHrqTd zKKJ;4*rW5G$L05)tv^a$dvt?WwEFaV|M$^6?}4)H7Uv>FMnyjGw%%%l03fm4SGhi7jg zeC6y)}XaN@}N#sca92&NAnSZ!yd;QKp_E60tms*e=php z|NsA@cm_Duav)SHgo=Yu$L&GmS>QNC&oAI}DK$W43iy0938ba_#vYdUY88sD__x^@ zfnv}Qv_k(eXltMg=+r`JRypRPVu4sk0OBE58oanS9porz8V6Ho>E|CPPSMu8v0hjR zTI9fc5KMvU7t2HZ&1XR>ds%`!x@8V}beE`jcy#Xr1qZz9SPD|m83S5D1wLfcVZ@>*#$|F(&sWYKb|1Ul9X>I+^66-nJNA9=JMsMGi84fqeO1&Z}Rd$;~KAG+}E z5F`K8LoJs|kH9xVywC;}u7?aSy?)W~+mwIuq1O*yNK668mmq|yvi|@7r7FaCXz^9% z>w!@hD8T&&EyX}{R49JygjPsADlhcF3u#~l-V1)~|Nmdl1(zEz0=@hKt;4Iy2L+e_ zlA&=P|4)Dxk%Q|)O=#!^@oy7hZ1`na{QUo+4iQF={|7vvR(He7GDbsaJqup**bS*7 z!Ro+?9;ObytnS6%NuZ#CISy_ABPf{&cyxDw^)~+$;qN~JzMRDH_G=jr&?@j=o7td( z6|@EJ0%RY7Oa&-YTb`@=ra`a-j6a>v@I;UVj6b!$0}J>$jlRpagg*6c!{eK2HRN#EUmz3K1Y^ z>AwY3&SIp01yE*uu@Ka+0PQ6Q-&N8ZXb{um3@h?>9X=Kfv1-Cw&ypdGz`p^7wue+X~;-6D7=`^~Ie( z9e041(!!Vap7d2b0XnOX&Ew)bkN<}t3u!O;XdZ&C1O_h@_q_ZV;+7}AijRGJlmGiz zKB~#`?hRr7Z}<(e))ut17^c=&@wDgv)1Hc-eKZgGC_VzO7(V60d5eFWgFwrH5*-i5 zo2Y|gw>=bZcyNNp#SC0Jz-I=-Gk52O*UvpVe}WhELQL{#{ZuOM(|O3F^QNoeCErd^ zZ_B6i7P#W@={)4ydExbw7hBB#|9=?|ZW16O3zU9Aha7+ka1M`7CTIj0gE|lro}E8D zG{1XvR&jvV7AZJ%6oKwN=kRDf$=?s@t(^x4`a$TrT3^XaK8hDSEFJowJS<2!hx4@mqmhez|l9}x96$m&@Pj4dD#{|#Dj4)QDGPmj*)9tU43crae8oDxCn%|N@}c7S#- zf(m=^y^|guom_}`jZsPHhypiaBRqOHgI9BReh2sY55BYYX#Bn8-~a!${E)Q{-SDPL z?;K;W(u2R5J(_=q*WL$}q~H;J4UdD5nLRY`LssQC{}<-(%>>`mLDGc>ra4O+bN>*Vkfx0 z0h%Xh{t*uHj0S&mEl3k+$BjoXi-Sim@6{qu6F3CaggxwW@BuTZKo;=m=D7)Kns9*Q zv;#bm4bBTJDlZ_b<3Y`w)&q6S&};%8fbjs;?Jr!QmTGu3A7BAl$^jp8Kk1o$YXz0YK2%v_J7~J>09xR|N ztl-i7Bm8B{zyJRY54>Fc_y7MF#@*ohO9w)!LMS;1)o%3v|H~k76BRAJegL(!(AG16 zh6uX@IXrr!^gszE`?ie74mPofghp1e2#?Nd9^YSs=a&xtV)f9x<tpBO+5GcJEgR?t zgV(1$n}0s21F`?V-VaJB3SQkJhxxa;FbjZq9H8V32^~<^|1Y#zs{ral9DKm+!3xSI z9^Y?(Mpqm_!RY}SwS%mzc){NV4xy2 ze?eRBJ(_=p^Eb~1c?>+V+RFmHQlXdkMn1@kh{O+aivs_)5)J{6ZkwAR4?uDNsQd>H zHGqfAUKm3CqT$iYI~8n%2xzJQK@L!QR^Z>}!wm}o7ZrgH=;?ys)vGVQf%`Au0bbCQ zCA@feA=?S|aht*a|1SkWZC*70P6v%JH^0FgkA_qZPe8?4w~tB%sFrN;0VxLc>$m^> z58m|xUVi>!B{Xq@Cssk3kORC`iW5}Qc3uP(#g|`$nit@WJ-;10Z}@_Gmk&G@fB0w~ zb2U5wX<)qO^8A0mzgJ|E=fy{!%|Ar=d*hiH7Ii$L}9H4>|I$KcIOSR5gMtOArIJ zL<2m|<*m=cqFKEQe zmw){m&x3E3eLLT{X20cf(R}68oAKYX`L9CJ;g^D-FoW!b3Q;NW>^${>N3Y2? zkBiSdJ3oP%p^E=}x|2A3y0v^P9~3Qq`5(0Q8nSu3`*{Ucb9oc9D`U6E{h@Kxlj=#=RktuCFpQ`-_AqeL~#qUs>bm4%h!MZ|93S! z@NynF`GTg2k2^w!J&!wr(g6dgIosi=0W}uMq8GzZE&qbcTD1NM zxcml{1t@dU;F)~OL;UUBpsKnXJn( z`W8qPIEEprKwNOlK)5e-TfpI~2BGA^lt(XX+AMf5-*$yX5F>c}#-o?j10lN>F8dfV zTHvGo|NqN&NL>MHK%<5KHx}@GUIu77AzLV;bD1;zg3w9v@|tNz=eOCqkyBu4gOXZ76t~;dN0s4xo@wak)KQ?r8I(yuD;&T{A;F{hNXB6wP({TDU402EUN}H2^*{mX(G9-Lr%n#k z+t$1ZDjvb@zS|y(_dGfcz|x%&9I$0jpdGp%-9;Q8mLEY{tU)sym!Cr_v~M1Y-#t35 z!P1?@9FVCrPz#|GwDf+#cStoU0iW~k76i|B2!fmfne&qJ_-~xpyCzg2y zAH`#iogYCv`7b~8RXpg~`P)bHyl>}CPtDt)ra^&Ex3aJ1Ls!Emj(b5x_-k&@|400L zbJj9=UVQ4={6~bpcME7P(DG{8Gf-*l0GjBt@aYawsch_Cgw~%kQ7l*IqS^j3wo`08K4+FOj9xX@y^+z<1fvS>6K8lAt7=QU#-YRYdRf?XS zP7+}IeHcG@b~-8WZ*vxK>~PZX0Z*KQ7JR`Dt`h)lI+pOf{KQxBh)-t<(n(@3T0x6! zwz;SnbhJQLS$5~BK+=J4XOe^u;{#-q!Gja8**rUMgQjnKW%heqd<_6)MCR}ybN)lS9TgtO9iVlZ12nsM3Uqj2$u2KG*MUpU zHxTM*J(zb7!n+QkEXN48pzws$C7|2J zx=U0fUW>T$Z*vj+@A&_OTZaqRe-Flg9-Y5H-SdmDe0o`oJQ+`TS{^8t^yn7$>2~Ju z>GqcJ?G60zYk8>X*vlS}d5qsdgZ_*sJS>lwMSEDDD+V1};((aQ0i`bu56u%EmdDDU zf{U5vAB?5S9^K9yp#AEt2g)4zw=vonlnQtpcZLQSqKJfCXUe>QupcNKq9)JPl zMbJ9E7k-caf*ao8jxp$pcNGaxHxtyd0#6nRfY&HXyi)=5 z4#ZxFk0AL0q+A2E>JL=-gE$5+tU)$_OAMI5JV49RAZs0=D``8YfLGEYT>c_e`Tzfy zpk3{V`08y@c>(J2ftSqh;a~vm_XRK2=v<>R0Tg(>P`bNC3dIT&_=&Se5sMJvE!GF%>= zbD#mUMP&m>%<^-2xkvXNl?4zEe|tYW=qC3)Dvw?Gy_GX8=jLU6_BqayI)x*w?G zYk{h2Q2}*uK(Pc~>)6?%@&IHUYzbv&i^>Zy9~zvEM?j%`7!+w9Ao0!~NQt>J784B%A|%x(hw+j>+EfR0}KnZ)06 z0=$z?R(6g618BFZ5olp==N6R!&}lXuAu81%|3DHUbZ0>C9u?4zY|Pz#k?x?-18s|# zqjCb|&DPtF{BsVtbhxNg@%LmfF)%dzOyh5f05jbA+ik!MSN>KJaBtX~(X;s{KYt%+ zLf7y=`1q-*;5^X+iAK;;x9%25D1c9c1#S5NSpzz77G#M8Xoy}Cv}Z%Xqjw9~k)YxV zy8YbH3+g)1E{zT!m53KJIU!573qVcZ4A9tn0%)Z!IMO?NAd!tLl3{79(?$i9&cIRA z37Y2a-UCU2kc&BER3tilR1`oCQv{6yf!BG1PwB9DVFe0ll!7b(R5U@Xho-g8DLB#? zBo%`111LB^XIgr6^MNWMP+)-8WOPgcOMCRTsDNcbG1J=u4R9CGS~gH-@_Gl_ zz*(ar0m?z36a-6lpqvXSfT6zVh9)=AkaLv_|F#g7>X(21{{P?b)4f#4qxE(vE4T^b z*?IHj&A*@(T{mA|1WTv#w;Ta8(o0`?wBCMw&G0|?L@kiNK(||f`~qTwyKIn-Kj=g= z29Mqz6_7k=gccMnkU9tyOA?^pRT1&peO>ZIsg6&f}oPQ{63)<@nHb z{V!eq{Qqxw>Ge5K+;PE-dA%RR0+k7`w>JDtEm_d;GYzzJdWs6z674A}4WNwNdZ~Vz z;icD;8h)mi9C>{Ply1NUI4FJL%=sWyAd^A0s09DE7I4W1s%t^1sk*~OMG>R|oZcWU z38;g?gP+|k;DQdM*Wv|ulO|}v38*{(T^S2nV>ks;2@os~=0FQ685L0f3sN3{mJ)W) zftCm0MkBOf?8H|tD1m~4Txaw^ox!65>bpUl0osq!-2-)okBR^^or6v^28T#ziHgAs zA8|-w2wiy!ZdP>?=XoE_Pad5&UM>O+t~UR0DAh%3M+idqe{@5;H@&=%XA3aA-0=PX z{}(HZLG4bDUe<{CD*2?MUmBds|e%+hM`&oz0-m zdE*<%KJPV<10#B&^l?Z#43fR}fcqtwmDmP*P|nX~02OZFo-R1?^{6O-20XyaR+6rR zRJ5oVfJ8u}LsL{VKupM#9|tJoK{WEHyjXVU|9{YS_#L2ufN=B^Q8XMtCV?u<78L=I z5v>RK=N#l&eAE0Gb?r@feytzyns`TDt&LNLqlc=}~b2(^FJDKy)`W<{OWI62#$# zU+(;^k3mhOR?r3|P_YZr3J!W`a6xJW&@kxk+aMP}0uy?0X)1q9Gx!A4v=Y9CU+Mg< z(;;TP-URX}_>dUJgW#w@j-MBW$R?$LwDdw!BBb}w0!>?>Heq)QBrSoOG@xP&oW?pq zo1ET&`~%h30zP5^6k?d^_lhmZ*`R=fYty z8jX;aevS&X(f9|JLqO+LfU53JAC&-bGSmTeD7rzrN4tGMXUTv)pr9V>%S=!{?uOQGy@5=i zS|98#%UkuPpym=N^pCOdsdl*VF?w`vfu;;-%eiw7mcZ#{-QEnX2%*DfpmqrdDC8mc zXM>um3NM&0K{|>Wpn(T)v(&<)H-HJ0M8K_asH0vt*`)HfeEakNzfD>RuT46COXuJJ z|6h85yZ|?zg1~)f15F&DV`D%u*6E@W@Zu>Kd4c?5j?n-AFWC_V03!c`dKsXm1-O1+ z0x1U;fD&Nm8kHF!x)(}=`hy@oXfo9sq^`S1Z#0X^-sNDV~-$_c2Pn?LEeViy zAOl{+TtQI}TXqH+P&w(LcnVZRZ2j{di*~D@)if^NH_5E-xpgigH*Ms zfLsE)p$FtDP!Pi|QSY7!3S!W#Q7`yRpYAy-9-yeQyv5(^2rBF#8z%UhK_ma5>nZ<7&nu{h4(a+rYuayYlE z#bN#y&@Boe2k|#GGB7ZJ_YJn(E@1~9X&l&cyHp!I-T=wppxw4kj9`zwV7&_R4>W-_ z9s#Ah!=U&8E%|_`CevjTNMi0y1{8J9U)CI}i1`hziJngvKfPsPGB`YXz_m-$=><4qf zM~QZ$+6(H+B4vVG{4H0(6?X}!6&Cj2Yz>|4VbM`PoI~hX*(_uLUL7#y6mn(xYB1Xjmyo|WJ2QuW+4Qg+6m#751o(#^SmN)tPL5p7a zw?S$ehYk|~aJvgsRDrfuY=JZ?TECSt8D8>ey~N)O-oyC));?X367Z=dU_agG?+2|` z@#x$G?$|qYm~ePB|Kj5Bg{+10XY#PTS#Nxd#loQZkU>X?1tX%l0~=_X10IO-=!QmV z;}K8{ANJ@KyrInO_vd%F*Z=``nuht`Bw^mFL<86 z*PjWr-LCV3CwvCjv-6_o_ZL2lr+hn4cpm&|?{V-KvybK}pI)9xo);hbf+kXK){B80 zE@J1{8(`28Vh1`&0(z=kh)RJ^C#Xr+%c=`@DT@jy#vn_#K%=zalVcQKG@Jstv;;It z3tFzw4UQbh_Rs>DOF=tVGG0&h==EoYIgxs7%?IL8AI($9zPJSP zMYoGegb(8(s2^PTx1Dm$JUI(AaenY6k8AcxF3--(E}EzOdwFIfJSXqk>t*25!D9#V zWQZLj)R#;iogZEXfo9}7LsSYnLR8#gK6S1J#R(3dPCJRsr_7)sI(HPGf@Wn4UN?h! zgrIl=tq^nb=oNid1u`5S;h>=?a7_fdiRpzU*l?_A9ApNlsEPm$xVgQ||NH;{KF|h< zm%*UIsdEZAX?paUwt>wzfh8#Lh?~37@agpt`|r~UIdH=B{|V3UH#`siu=i|!!05wx+|%-Ad7P)^ zP5$=lpo*(=4rEfH6H*p=^zsORD+=(aaIYV@0WI*N6kNx`GI0rLHx<+~-BA6|k&>5( zK&$FHLqJER)_~5};GIQx|RuyIq+;7#`wNYb&q$lvb>mV_L+bc}^r7nY;I9c@ra z-Fkq(AKZcLb!7CgyujaI!U(FGxD8M$FVNu~(7j6h{oplkEX;a_2VQeIbl4bs{6FB+ zc?`6NyBBmRH7Fy4hOj*tk9)NK=kEdas6ZJ4RL}WX9_Q}`?X(05fHsAJ(hz8_*T?ca zfAe1^1_np|Z8jD@y>5)2mKW+4f-18B(8(?CptvpY=w*Fe28w!6`2rda?F6T*5EThf z@uTp<>?kOHV&Eldh>8XHa39FK$!^a8qmRHogttCqeMmF#fl>st^tQ3q?-?M&CAW8j$h}o*R3AC zrtDzTK*bN(G;r|-HVt%OUlbP8{vQCv5;*CBmPdd(AfQkNUrPa+=>)|xD3n1_0xFL@ zEdTMh&jS}Ppt7RZh7Ys~HvzP`s2w7IoxdG)@dPLwAR`>mw8VH5Qu=^Kl|X_1;I6eUs- z9tQ+A#RRDJ`7#N# z1-~=~TrS*$P}iCN|9|=DH)yaL(SHSxU&({&l;$@`>+L}Obx^wqR3f|r#c(&sU(n(J z)C2}CNbK(d%fzS@K*|Ep@z0Qg;hPab2D&<2lH zLW)>$Eel%44YQMf&Vdfd$>y4jFD`=%FmSsFZZYTxZBW_O32lmZPJuMV;ftL-K({i$ zi@ILkbw!}`0LrG|^b49hL1a_LgP>SL)a#%`0ZOH?G|_qzG*=h#(iPMl>b&>T5ln*? zgZG+-f(-`cSg^r}gc}3O{|B%b9LWe8FRFNX8j`L=zy^TQRS9Us4|F0Gc(4}YJW!%a z0-J(Trh$j(LGk<26l6;G6i8pEJ4OXO_gwK(33Q{vOveBJUxMZ{v8=y&3JN|f>)o4w zr0_TI0!em*RsuKwoQMH1`kGX&%OdQLIzHZ-8m|d)ynY2Ht-cbu&qs?vLDhy zh9p9U7stV=7j#rL_?U}MP#nNk;UEkIx%~Bt7qcS4S!puE|Nk%lAr`KJ0t53r2+&No z2bSp!zA7fq&Z^a2FS}7{wl> zr+bSExHkHJ58MxJ{m;a}u)`6w9+fmIGmnF>SV4P$vM;50XkG*@7Y7X_H2wl-gl6#MQE&KvpI+9LZk(WlD1A5>J(_kBD(%}S^ z%qMn%%6D-82)x7!bl7b-=+w^cDbTr?5*3e^3ZUu&99p2|!SF2I>#-kvfZQn%2^v~Z zJmG=lPjICeq9XBP^JkDH;MI$u3)MmAy@OIb$d{lafRWgsxgii2l;gqWS!a(5Xw?pA z-~=@G zP>bHg2$ZIa4!rygayMAfD-f&K{l7;qZ;lct1OGN2Lr9Xl2$l#@i3ep6kQ)!aO#A!) zKO~FtIdqip#CddH^XWVQ9uB)!WDgpBYMBDk)p-znj3@Y1&+njI%fJ4(hbGun#rZzH zj{kjndH*XyTx96k{KK(m!|QO6n~S|b+mt6y6xj7KtR0!1vq1qu-1B9xCP(@(MqnCAO z1~d)!vigZ|fv2uHUW6or?b!SC-~X38kQN;y%2ROr5IpMG{08Ix)LtIY@^%kUdOP^i z9(4ND#h;+;D&Wz}+nEWnk4FVGt`FX0{o?sHq_hX#p{D`PkBH0w8dC!08Su(=@GYnc zpmj2!<+d6iMrMbLiYADW)#0L|^&$)uOK7b~*a>71Lt!nb7rQ?o*{uPxqX6Vk@Zn<~ z9?eGr4!_v(#xj2B=UJU|D>9tPzE z*c#2&|NMP7!NnPL^aeWm>B7H_!LjiN$Q}H>>7d>&_?j}%n2U#J^G`CS-3Evq!IK#X}BIhU5cv8zJHJo42!-t8C*5At4fi=1AT!ILV-`Sx3|V0g8bf^XtN#Cg7tkpYAnU=4 zDnb4R_2Iyw3Oa}n)bB~)--hbsmwup*He|G@Ud^Gygc~$i0Ip!*ixm<5u?&yqBL#;& zdQG)cLD2&0DPbAgsM`z*G;nxq#EHvX4_h=0G}36`(pBve*(d z;Q>uNhFA;(XL`sgnU^A30Oy>gmxd0TaD2;pvkLDvDhe63Q!lT!8OEM_9K*5f( zmjR?p;RX99P_ToJHb#`mpmP^H!RH7>yq?;-gF)f{|Hl9SgP}Y{=e)a)IXcU2i{*;0SbS}dGp6z zR9rx<9Z=Q)oupTV2^|jVWif;n-~SF_6yJSv z|Nrmc0jCM*5)sf*&ae{jHJ?idi?B!Yfj{6Q`9Oz>@%MnPmIYnM0J@^n}Y#5q5_?$ zfNe&B4eB6{bMIw+mjJaK7L1UQBXDB@JU;^(oVNr!0z8ctqhbN|C#XCFS7D$4ds+MM z|Nq9H3=E76wd|cIUfP0+T-f53-T)?$uQNcQ3N8sjQ3bl&7u4hfB^YpI?&k)@9W>55 zp>fFg0UC9t2Qi}VvdsVgJ7mC72VUC*t!SYMOO+5SSBUj${BrnMbF%X z$J@QSO`tjyym`n27H^y5p+N^Z+!ZlL3W_(jb)a}d6ab*U4Cq8MaQ~^hMkNCy-ePZZ zFhCalbYAf2Jmt}O)1&k7OLI^__VT)e?Ex6 zc;E#K|F#1j%|8VAn_q$VaX_0^kOoou4N!xKg$>jof~1Y#{QaOb0h-1D(M}yMpf-^+ zWAj6P{%t&b9+p4qg&aG0BtX58&YwP=hhGYVs?E+h;AM0jJ}S;0y}aUapt#||Yy*MD z`?Jk1R{6qYJ!pLixRmWOduC#fJVU~0ei7L2IM_Zpn@vZ z_CgL&hMNMNlY=xNL5I+Q))V!zUf2tYSJ2oiJYJI|K}}t#LQt*;6#*c#Urq!~B=*WK zi~$7}sMdlif;8j6sT4fh0_xkpSq1V4xZ(meMqr5%v_A1=3aA+f69Jv$+zHLuAX_{v z(S2|lw6wDmW*5{aj5nY~1{0SZy95`mcK7_iL zoajjgjho{1!SY=gKCl*LGw>8{?El=;ScWr3Q7#1njU5hsPcpCQHM9N^p}7_ z7SY54X@zxBKsDk^XOtQ&0K5beQhD9t?*~ugK^xk~SlD8~Yf~+6)T?&zh=Du`b~Sto zb`E;%!v>{#c`d+h1F_y6@QuvK6J#XkNv(4u4yjPYOa`E8(q3vkyCe7*p3=DzYr*xgr_uafy^?2vK(yWTcF!T zB>^;)0}3x0bx;h-F}&FO7UCZ0Q4!!1$-zs8U{^(f$FU)2C%*Xb@ZbNJ)sS&)aAac4 zzmo4BQ259(ywD}ZJqd)|!{2rvRIQ`lp8y|1dd=nm>Kon!O(69_3JXvUhfE2B1`t3; zY}aJ}{|_2`1f?hNsIdjOwGU2Epq-DGK_@F6{AKR}+KEu2V&K8}$)ouvW1X1o|9=b& zrE{TYj=(NEumufEm8duWP^e{X{=r$w*Zd=)gtPfaJ%1}`9u-YB7B2Y2B{X~q-w1|bHtjTJUcIVfP8T9l|5+L z?Zsc*i@hvivC2^1YxDJOlXQ(=R~F?fJPumZPUf{x&{P zD+hi59JEVh3tAsoAKB~ip!sK9nN4p;{Qv*|n}5cY%h;|34S`QR&;c71&ryNj`*aK< z20qgaT@V~Oa6wzp_zizEWN3z0+fk4KRK*&2bc>3E+29K^Wu-yvZqq9cAn6j&!dTlK zV0Mj4hEF%^76(BF(A0wkfAR! z_y=0~*!&edA`zn!!M~lwxqAz^o1bQRtmv3W^C?CT%TxT#pgVE+x3dJNS$-(m04jyS z$3}uO0Qh!T4p3t905vuQ(m=;}ya4U50x1KRA)qUJY9x1n_LyP|J^toAu>C$N8KATU z-94XXd69qWf!F6ex_MQ=eh1AUcZ&*u*&(29hO#0ccDLzKdq^-jcy!xt1hZ>Y3Vga* zx7tI3DF8K?z@Y>=Zyy>;8XiQ2(m_zU(H*0b(9O~e4J6BBMJM241e)aNW|?gHp=e9v zKL!RShT1Yv5EMWPU+`glpr`^*PJm|Pd#5ol{QnPaa-@M4O}z*LFS3I=%K_vp+`(3? z3kv=M%pki2jc?SH_u`rfC_lb951~##sDltn>(0ObFR#LOsG!xy(?I@4X#;?c=CS?% zpMjx1-J_eA*A8@4s^~vk5GDH_M1kiDV1xFMbXg7>z<`_?#d{j0rd#w3h_bv;D_5+~ zzn#Sqv^X!#@*w{d&&T!0UJLQV-gM;Dorl==Q(=FMXlK95lCM)Yq8zk+d&I(auu7G&_~Wjz8OQiW>e18Frx*E#{L z^;acWtAs}$Y5}J0XBX1&7a^Ss=yx9@aPQ`fMg-i zUhsNUx#oik;NAjg2K>e0J1~8nphjXh$oS?X3Wr~uy7}+_%Tic8p`|bI{$P~!1LQKWrHJC4U-1vw6 z{Ngg4>(xNH4z!kl1C$a4jF=f1UR<*N1&%226{_GY14%D0B5z<_uV$SnQ0C-;(e|-` z7z=I%fl>l!JQ8ev(|3?xT~s8%r_*=CS}ZSqUH|w0^$J*qLy1pf-7g5r4nnxxKNDmD z=6X94+z&SY&^PSvw*ncD!~OA?;bQmiTrv8OPQ*l9dl8UU^omS86gMvgLR{o_hm%6_YlIpa^QGEb+0(4 zd)e{3SG-o@6TbkS=?+*tX^@D2|cCIQYuH|F0(^?au+PubK%eHk;pAfa(APP#s`kc;GcB zs4=180a_Z-{KK|3(*v~HsvERYzFX!Lbla58IS2^5I^G*wSNot&K;oOpr&n$qmo}@SdGFz*jR^{wtO9 z>Ml9J;niJpki*0BUnxKTwi0Fm{%tYb0uC1UN)BR41C;xx3pAI47XKWW{t3Q>(?1+E z@lUUd$_Eeder9P%Cks3<*SQAVqX6w^1`UjX2BbkttXjaQx1*is-s{29!syZM0Xnqto@#yBg*(S)~VR^7r*YJShNyAH^0cOy`T+lcZXopw_Y*8&VBpQ!^0_Lzs zH|U6B4v)?oyFi_z*C#+H)PVGX7Keb?AiW^=u@>;6Tn5l`Sa1+R4FGLE)dO8no%oGY|m`+R)K!df@~tbU}TeUeIJCXu$Wy3ww;vEztvqET|MQ=}(ef||A-y}Wi{7l95o z@KJ%Rta}lS;uwhC;8lnQC~h#}M{z?i=J`2Y0yxz&Fo=JHY`j4})&?0LfK> zOKOOm1t?)TymSLy^|9mJzyB`}Lwa0@@}Sp6Wdj3 z)?J%Hp~|B2LU1P}7{P<|0ifAp4p3jZlcSq=SuXg(W{%dA{H?D+Q&ZirgZ@0g*JOj5 z-7Souwqyb*iGdgyU`B5sM++0^cvFwo+n_9X&!hR@fBx1fATy4;sGz9^Us(j|6@w~? z43A#hdDft0@|(Xk2Be`|4iq7v<=vpX0N%U+Iu#4-Na!(vy`rm+fxH9S8Vzc#^v;27 zasZ8Kyf|PB@t_1!E^NI7DqOlD2Qz}2W-oRLLQ;DH*aOF1R4Tv>m=cWQqz+`jaTgVI z^`K2T;Nt{(Wv_!SiUytN4qmO=Ey%yklLMSGI-ygZFh7C!9(F_b`FBDOEb2AAeiY;< zc(JkvoPj}0Tm)XcvBC6H3;6hc@U9b3_63~@2I_}^rn@Xb^-%yQTYyKs9l$=000%Bo z5V#A2PMd+Il*S{VgmV}<=t0E_h!0s^-vZegfCwP)`a=$nUS4^yyFu9lwm}VafaOUC zsFPb5x_N!FLDz+Y4!i;nYH+-a29-Xbjstv3;6=rLkOm(W2k=?KAd6w)1K_I{{#a1J!+=GD&v2Tl&CJrx1Ia|#+sNJY@@!ywI&Fb0nrgNwve zSSbVw;}@A=V|YQv7r@~ElX@b=3E;C5Xhc$<3yXb3n1y5n9%1(f6< z=bD0o;N>2O(*s^Ig7!XGo&5LzWh-n80;2o{w~t#uv5e72HUQs#A^M>XRMDR*2?m8B zsJ#vDxPbeG0xuR{gN`1w8~`0m4w^Xtb=*XELo}71h7V&wy6GS;c$5yo1-FbL+!s?$ z{QLhBGyo0l=fEfw_m;V#_8&lzVbB7(VZNKy5o9xHYz9=kgKvg@@$V|sksZ)68mMh* zC;t6^y#!9aG@qhnc?*N$v!U*$vT~svR}OyN_RstE2w=4nJ5Mq=Eotkp#Vr5i{c3OP#;RHs7H5%fg6UfDnULD?6y z{}?pH**gVNJA;OFUkI8*(iuv1wGdiXLyBG&l^5KgtcRugf%qGF0>PiFb zja&S!po0qex4{}`W}qbMfb1to6+8!eQtliT@JYSBrW#;BfvPKTJ8ciN3a(KRcwuXX z>8BRZp}n9|0g~^t{z8t?svuv1 z#t1+~Idq*k`0O3f>1iE4D(0ZJBqYpaR9>X>fa*6;G2ID04j3|v2{}I)R9BjJw5Wj2 z4+b@o!KGZ|5m531*MhJZg;dtCbAnqS2LVCT8~FMnaFNx^E4dF8#gGyjtOr!iy*O+M z4GB;Q?UsTlp*=t)GzU^G2;Pjx@uFx4NP~}x$II8?La_z1sSUnD0@fnyfmX*;pr-{P zYQYJ6K@Ne`g5W9~Tnnx;0h#Nff|ATYt!Gd;n1KpRCul7Q^EkK^??!kW+_3ItEnEpQ zo<-%wiFFVY!PQs>DA7Y=jiXyMHW^d{MsT!V;%|kdo+&DjSPTHwgnFN#MzkUuVbRU2 znhXjc{#I~#3R)Wmtqs9Zic}k}-2*ZJ64qd6g2Ou80^%SEP*~qe0vS~bzB0iAY7EE; zh9^M{bcjnYgJ!fkZ@ksAi@p{{@|F2JjOKgZcKw~J^w*C75G6x)Ip!Jk3 zP(Oi6v)v#mMUWIMX>_uvyl{o4SMcfqP>bXkyT^57;V9 z@NSkD8~6VF|1t!WHt^?_pU^x7UQiJMY7~GQYyqG?kVZ!cT3+b}^_D@|1C+DOK^^3P zm$yMZl1qjsUp@oZnJBd{Xxj)RbWk#D4>U+X4M0$X8kD#+Kt^hUj8p)POG$vn;T1q8 zcFqAG>J8c?4=NjQ%i6vSl*(9CUff#^i4<^32hUGBcyw}f zi!Pv((jM{v zW!c6z;M%xz4W#z%h0@)ymWYRhM{j@xXl+U>_+T!K4Mc6VxsTuiOINYtP?O4i=U4=w22q+tX z!U1%30>g_ujbHz}Sv6vX89>F9LhAwkR>(2#P+xR{d{LuPzz;qH`~heb8hXO8=o8Q# zHK0Q`S!cp5>4wFkM=$754{+76#^Tri*LG_u4?E%FA$21_KxEpbhrm$|!Ebum9lFn?UUpaDCc%1QhLu zK~{sCQ=meEGRteErY=KWd-T4w>O40fOV z`5#mnNVFU%IeE-Q#R6RFK>86L-K=Lo3N4`%`4*te0Fioec=x~m-~)sqd3$A0TX`{=(bIl&O?sPCm6pUVr5`pC}DAIKETm(yM&8>*CU2v z7RTljEDkN-O87w<82Ouzg0?g_Kltm}d9d@s2N(X0jE?+M4!E`)C}rsueBB2zguew` zkG1~iZvpRI>-+&4=aKN}4P*gN*|Z+up9-3G=6LbQbUpq;xyphk=WXd|x(C@H)UWr8>!lw*`Zi3MDfSnzL) zQ4s{~>l6Yz+NIk?MdW4AKTwCjM@6XRWQlHvkBab%bS98vTvQZ%!0V)aR6xFlX%z-* zeQEs^Fs3}@ICMrANV&4gCoCWHK?`A@OlX-bwPaX z(aY+r0WF$(S$|yS1drfyyttR(KJXvp>W%!*zw04GaW4O^$4td6uRXh^I&U2O&D?ss#AGEq0|P^;Zm-9W z=95ex_&0L#PdV6fvgEEuuM-O>P>;E&a4@{6HUfnWtoID^667jOWL1nWLQz%qvWBR` zy(Y)fIhynZNBWs1ilVU!cge01cA%25^9O@-mRuK+qO`!q-zbU+m-eqJ1aHu}LehzF=;*Lsq_B^s;- zx^@`0(Y_PP?}UsoyeRz#@;+n)19aadc&!n1PdT*Zp#duD6F}|B7vI6nV(^)C9s=M7 zPfq2OqJ3deY!Rr;|mnn{{_6sOcIb$kBSB6ugHX zJhsv4A_yKZhV(Sl|Nj5~vI<-sLApCoH7Xo0&aC|P|MgYS@EPblyExc&wxG5Xs1*Pn zU6TM6X$mhUmViuvtlPoVsE+yRtn z7+xg&0VN7hncI4x#0KPP1<)L#2*}+5pwtinaxkos2@2WnU;&TTOC|TfnZctQQk-*u z7Dj?x(CYzCL*TulFE)dAKy`zJyP;{QH|oDf>+PB}&{=oQkRZL~aquyVN4JTjN4Jk8 z2l)11(6OnY=m)Q$2QPMc@dKJ1L6^CfaDm?{AOWhRG<D1AT< zkpay$zkc@OFBdpOuW^H^_)Y)*zgz|FX+RP=O8Hk7jXIwDV%|?^D1t)>bcb!Xq=)5& zVlj_{57@!GRlx}gUORzyHfe!^4jlK8Yygvd@o?k6|F8QY*1|~?`}x~qKzXS74bpiC zps8+9wgx8^JCJ*NS?dFY!GqW@?tKL>!^{WsT~rYD59^Wtpp}`RxWB~%s(<)fK^Nk@ zIQs+UA?Su;xS#l&7K73jXnYZLyG9H6oIB_lJ}=yUg4Qj8=QKc3(93Ho2kl9M(#VVH zd61G%0-P5>eXzD3sA1rE0r$hf6RVJH#-sAWWgo;u2T-vE7HtQ0wLv9eH|U5v%M<*~ zjvzBY0S!Kh6m-%cWSD!xi)o@DZ{(;zH>P!qnr4F+*s6gkQ*jX0Tg~WUdA;7rqc@n* zqf?X{EGBZV+jgbDFhlGAQcjOfo_jAPL1_PG00Ufe}c-;URG8$ zkbgnh3B2VAanK~_;L#aS?}LZn3_v-?!lP4kQI;S>x2O%svP-4%9-XX>S)e|`Y0xp> z;O!>Rqhp{mgrM`pJ3)QUUfu|>LeTyyQ2cp8-2}dmB;xg6c+!IfMyCjJU`%*XiNb&J ziyfTyKSQXP_5c3AY)6#yXz6b%B>kb>-^zL-6BM|-CqY!FkBWxjrI)FU3=E#&69uY4 zD|`5RO+ax48h-^XMeVFnu>c($cJLWHDEBJ(^zxWHg67j%%t6W6r`N}v!=+nP!B3dM z6*O|X7nEg=yO@Kk0iSLka|xgB5OV>a-WYQM-`10*F&@WV%)vcq5Ce3d9fM0Z??YdZ z_LHT2AVE-LiQ#1?=zfGw8KlCMXAvYuJwQnlJdiE{8k;i!9jPPm(h{sbM#TYirLpJ1 zhb%teWRMQ4BGEK~if;u_NoN7p?$aHk;_xy7YzFf2S~C`6w-ZhKOQHY&|96{8`3f_% zek)D)I1cK}FnAny1_y&j^8pTz|A#<340^%mOm<6nbep`HKZ0BiDhw4JT0jUyE9Q?SS;fd{h)5=AURiP;1=$pI8abT60N3SCX$VrgC*?o|^9)XSz+F!Ev^^q6rR*=5SwPwP80&ObQ2c^#m+58g>_keF z+@LfmqYqlV2kH}mTGAe!yxs|d4Bfm>-9eGg-&zT(uR2-nK+)REdZrsmJLp)Y7kBm0 zwEu|*XgJ|4U!Wl<%Pc2HsbVjfgGY;>Hp7o?pv9i;sLe=B(CxRbX5qWxVz zl6LTpmUwjS^T66QpxVJ(yE=I%LbSKsL(&eq#Nvelx^{iA_Lpv;VR-&lQBd0KfLOy9g-g9_m8;4tKl*SoZ<46cX$XF+%J)S(Dl zfP~vTdRfa+gcWD~`v1}p)Sl~QEk~s^SN$ur5iXt-~Bm){Ld+~MYzyB{E{Q3VMt^5OBr;T*YcXji^L;zCYDRlF`bb+M(U~v4iHbsMKQC4SA7U<@60a2YkDh`I1UV?UI zdi+1`VR@gwR|I+^mYrk658Kk0pgx-gXxPF4)Ijs_=w(%gIij1_0AwO40zh(*Lxx@~ z@q`v@pb2#F5z5`H7eGm;oA)A^0*!Wnc0+>N8Xlb&!2>bJT?D{wnQmEA7tlb3i9qY^ zQX`M!Ea27}s2vvI(d#VW(F?jF1T_9(d8)PyRICL+R{t6p{(or)icpmPvgHg=Q23}= zyxt2szid7<@Va>`qCgP{TB8B(LV)H&K$WWjsB0+kq9_!k4Z432G*J%TnhiQCw-{sv z;+*kbUVX4Zu=qYX{n!7Ovq1gx^?!c<=jVPQvE<+Xm&%Zm5G{UBf#L*Z{{X0Z4FH$f z$6Zt+Kn(D_rAIF-qcfxz=h4e*_X(7RK&}0p*N{x>0iLh%1sT`N$_`ceVjZX}-OKvj z38WLHzjx;&%!F6}e*XteEHOg#de4J}4{JmuD11P@IM^&H_<#U#6(;fGkUKPdK(p8y z9^K$I-JlI+9^Jg}K*_vY^gf6J^~~;o%8r8%SUkFYm^eJTS(sp(Q!G!_+VO9b5oq{r zTlyZw($? z(Bc1}wH}=yHLyMY9PlPdujsTwP#OfS`vNtW!EIa6IV>Q@E4+9-4bnORJ09H3KsXT6 z!T_}^U+6#$2RD%fKw8n2y_mV+-+%DHDJVwJ^4}Yf_U1Rp{nz85S#Xdr<`xO~ntsp# z!wz}SS@8lMy@du29VIdb9=*>0K?Pa!Pp%?O(E1tp?O~w%%)dYMIQWX$qt|4T$HiwJ znjbxye=8Inew_h2nz1#{n6J067pc@&-EpjvrL!fTn_>S5AY{ zs=$ka7>MVfE!|Gg9(+i17gTwG*U4MntcwLjI(U#0luMxPW$=3UgwvooaL@o0xP1&B z|Lb%C-HidAf2jZsmVq1xDrP}!*uWW*>pD-rp7$bb-oO7ZFM{$lTKWN}Z7k^@)Fc59 z+JFbK|Z_oIE%_0aAgJ>M*}(41GLf! zfDR_=1Rd400o3{huX652jtb~`-0MZNyNc4b#wmx2M+?l0}L&G!Kd|N ziC7*u3Uo+H@aR1Fy6eUA+5i5(Gy<30DE=u+!nRfj zC9Q&j865OT3E+h}Xn`?!$`L8z!2^&Xpv!8&OJ`vT^@Y~#fB#>1zyg#i_FsqE4?fjL z0W@F=?x1FX@&Y&|AfKYMY8FoW`P(Lf8ae3am4GGy!3hH#5|EYqpp?(?0zqB>tH*f z>t8!z+vJeWRskh1(6l7G2B=&HZAk!~2nNdcFTNyzT65rCouIQXL1owL)gH}1xl08+ zx_QMwHgt=M{}f<&J=LT6r&#G0k8WN8h^XLC0S55CXHdj|tBQ=5;5~H5Tfk?6feTlB z&U*2E#=rmITO={s7b`#^N_>2QZu0|$8?*}xX)vASZv`)9M#NY59LS|It+)C61VJ`* zLytBG*AB;7RJg%{(3%PqJ|IKEDNO);vjk{-0cGhNBI=@{jV=OF_vAY`>YjqAPUsGz zPUzL`ol~G|sj)6_}{!ryplg0k?WVNe-OrKw$}P|AH9cQT!Lv zz(?_d_JDv^6+jLR`@vN1U#jHM%{ucNC@6Vnfhh3lc#z!*uxbcorUhtSgeoHBz^l?Y zUi^;*g&ZtE`~#fcS=B&hb@Qr!6JP-4f*)d~J3YEt6(FLDAknFyDf1Jr`(9X2 z`}hB)7`Utjc^jp?<8ONg@h|fI8^>8xKpROxDGFTBA`Qub#2|ItizVQ8J*ad57rCH0 z*2y5Vz=wf=N`RPBEst*AxnDtk7o7*9z=;=f7ZzmI1ad0|)I;cHvc5+KnI&<@>;uNz+&P5t-(prRC<+PXnUI6=;<200LX+E6#>3|d581PYjGC;<~+ zs_W6s+wuh*Fs&e}6LbR}>`D&k89|s~^GOLKZ0<*6hRsHJ*f4_3?iOYGBEax^Hau*8 ze+FCp=d%FA>sD~sK*kMvc{z=RA%`fxV4w2uKX_>vMtMhc_<(y$*up0pT33R{Xbr$s z2e$A@fjBc2L=hK0mlQF=XMYsF@Ok(N91@Q{p@h$Ei0B=VC~Ek;G=zoE^GUeE=Nu@i zG0G3n$gc;Y{6Mr}L93%cDd|NhctaA70we4^3WxxJ79jf~ zK>>iJ0D1ZmJ4=N@NK0ZpEPs$lR)Ja{n;xIc`z(gW0p2bHNBpdbM;AdQWc&}CUjH5T|-3wUEA zsno!uo7V{Jcu`{z1-tK{vj=+l))YvEigfWJcxsw;t~?^lAf?@lt_V<=f$}r>)H+bK zy9*aQx7f9I(TY1b2aVQ^%BBDI5lS2d#v^>rZM-Lw4 z^0@asIC%Qrqm;+(5YY~hD7-vg)K5ftEQy)EjEh5l0Ircr+i$ zfZb}sYA1^bKS<=g&<;ZnzW}7<5DKnnTv$-^Qw_jhMfJ%Y^WGW!47GUx_~c|Nlim`@jD$UcUs5 zWpq^wW>v|8+42q^MX#S?Oz@t;N4WBiQVX(0LR&kbR(D5vUS= z@uA_@|JMyKJbRJ$U%bd}1-Tz|okVwu3V3Wo!PW4RtKk7x(1tP>6%Kw@4_n3$|NoaM zfQlT@E}8!z2Dt124-vYkSiDH>{PX`XC?#ot`g8^$1>oaJUig3{V2z10XU@F%-GX5s z=#qHwoks?sD~v2a`4`Pr2k^x9aTjpQivenDz>D`CP+J{9wt9eU4FCn_i)$bWu&pTZ zT^59X-dm)CN9*lUCygPvR7L&oL7JrQtW3?91!ui%&P03YNQ2s$5) z`^B&BfB#?4@aP3y9cXD?y2YbY`Sp6R-5>(h{wUP_2GF(quXR8nCjlOX=#BxMkqWs~ z05m1@Lb@B24#34NsMqrUfCqT&qUH>!Gl+b^Q4z=;6Hx5qZ|et@1SsRxsOKAj&8m&{ zfR2HHHbQxH#|UtEbejl(7QQ(6bh}u9M*J;2EpL>nf$Y=(joX4&`$2AT1Px_Lyg0h* zA9xlVbgI!p0;d|C?E3frWeBvwL~(Cf1nJ@PyAwTpnt!m@oCCQOIdnq0{{4SF38TFR z9st4JhUMwh;g43e}d?@!6fA4P|&`B&Z z0v^r3P5Aq_ff`E9zYX~NAAoAS=HI&ftwEp?yf=#7!}4a01^D)x0MN}vmZ$mK-FX=p zx=olG|LGc-8fdOdk7n4a}_!46F=1EWbkx;D8w557N^c#R_tP4%h_;KwFqWF4)e4>;kZ@ zED%kgYf3$Oqu4;2G{Kr$V4A9tG+CAMAe>!N<^j6t#quV9&mGWQF36qkFkN<_klJp- zlm_xHf9r1WzKjwkCWnT9=KQVTn{UBQtj-V>4NzHP0GizP(7Xv+zWx0s__9UC)6i9* zkn?NchwOqfumY$Mf@qWjWjk^-N|UP*G?_u9Q{k}$y;2U;NrihEe8UlOE^q#=2i*h> zT8wXby4Ih+c_aAP{t_lea1^$J?=kMY|C-t3|6vcy)3pNp%^h3}pnGmvm>n%Xl)Uh; zyjiF2VR@RrITJ44eBgp(!w=4KenfhD$^ZBNe}{&DmZbsvKuecAJ8yVs{`NTdSipnx zo~Pvr{&r>Xy+LrVbe5JMeG&29B5W zp!p!seVvM@J$iX0JevQp@i&WtT-_^cE(vNo$$SPm51NWPLG?f<`1a)*6$eB*Lqy&m z&`#s#-$wlXE}-1i{M(Sf6+FlYb#oNl%_}%TB?Kf=OiP_W!QI{q8j(Rw?OdQ@g1D$h z)yNF8|NkM-1+|%G@l1L zWefN0GP(_@t^*Gc66dYv-^QirR&#?wg=o*ATFpz6-sa!F{QY-8TAF{G^0!Qbu)O$N z!F&2)#Ts~p8mL%fh6UX((A64{V$Ca&zZG;PJpVRGv6jc*3cmHcw}{=t@?(vOhvg^! z_QRkN7|V0~?Yr0+7`knk8vlDG=9QL;^KY*K75@Jdi%Plqx7C0O|NoUG2_Bv2uqNQv z|0Qz#+hin~56^G-EmM#?Zs^7k~R?u*UQJ?OkjP3@+U)Opc8|eDm{CN`+kbx4SU0 zq&YVJNUY?CZVfx{p?TA@^8`G9-}LF_;qYxeP?7<<1ibm+{Dz;Bx%jvF zFfld!3@H%;-SLOW&3d5iDyShL3Mzm!?}OBRzwdGIzrBazZ$#|_8W4n?FOQa6KuN?0 z6wshn8dAY=oWK*x-Mi$(z!Xi*e}uT69t6nwBY(S8sIl;qBW8eJeKLgq6;ZK5a~ZK5EM9+Wmw zCron#GqMYi+eA-5X#%B9k_5S)xJW{^QH)%TQp9WA4~wXmX`q%PssqG{H>de` zJbx?r3R#S#4XR;5B`c#t!+#@`P}T?C-qc&g3MzxlJS_k5w_gV(56koX?dL#SFFJpC zXnyzX{OJKJ3BG$a|70oU?zXXL{12`&A=UaUkSWp!5Qu(C~#37Ekb;DhG+yGjR0~qsQV9UyMsp` zKnw@42&|-h;d2!6Z}>JEfTg;1#W1waIMLa0p;${IqMK&ZJ8N)1BwL#Pf2)d-=gz!Ye#0fZ6#>0TF= zACU7jZh!)_@eO3KZ;c9g^tl&GcSDEhT2J!#)`8S@PXS*M<^gKc!=_a&KlAs4+cMB= zt&Xt>=z^-d<1Q*G;NU&(qJp}LXcuTj@@rwA-Vl`(=MEpi|309}@{6F0RY2>jOgwt4 z{(E*F@PMze^6b3m0bOI&e9*wBS7egs#YaAx7d@K)ixlm6$p>;;Z`FSgm%sTZIF;9c zt|tPibx}zH-DUpYqu1*-$XTG}upXVKUUMB|kudQ1f6%A%v`6P0u(v?>e1i6{`&b^V z&GhN@X7sfDSa$<7SPxNm15^isHzW#xR>Vqx>QaRli!4wUbaa=fSorjM zGJaH{&76G+|BS06*e7^<0Q%3Q+hvnz; zR1eF~{O#bwc{)oVYeFhK7!QJ-((7ZB0&*V*s4^FL;j;{~CJKC2H0VfN56El@jWrEbwlI0@dzmD4}+Hf26*&}X1)aZ5;RT;S{e#oH4D0@1mrY@7kkX%zAORV zHP8bNHqdIP2+(*?fDdT7<4YeI%^QcK8N2MEVDx zk5mgvH>msDkGrUZ!xAlceJ*H6B53S;2WZ&*wTMrzqk&Jak4m^(hYRubnw_26RQw_h+D`fj+$~lRPgz02P?c|2d0xzWfbJq|l3L zJ(_=T*0F*u;NJ$Bb7?tQ%JCB1ZspHJ~*xB`OXcy*%>ZLUQbB z|1Z<9q)){8;QgQ`T;m&18uY+%J~(L16_ifFnF5^4x}j5cpo4cjdPRRNhOEVv0M&U4 z>Y!a2fgoccJK(_?4_dGvd}Z%(@R7a8_d}pTb^aC}P!@qqA%iyJc29v!3ASG1?|llA z`hIJ-E+{>9hNuK|#HhG?^s=fyg+?l9y)rB>q0V1`odH@G@*>L^6eZvViU&O|z5uVR zow0O_nPYrGr^ok4pgYD6zLEj0vCX{1aB7w{Xc*z(3t0?xU_}=^V2Un-%3KZ57E23{ z=6}rmO->-kLeHB3C9eQb@dKVzDgc$@8Q|k*dRb??f&vOu@_`mDgI)Mz0i;aL@BrN# z*)toIC!kqt7icv$=u{W?j!0%uDOlj~{V+J(TCErv7z}TtW*1QT3$_w`a<9S*@HMPR zQ2<)^3M%_7FZ1_r0iD>z!l4I_TFBMKpnFw7^QoY$2Z=~fk@P|X)Hg&k1-1$iytoNc zhJ)4<`({G|8$8Xa0Wqf&bPxedJtVnwjj0B&J0rEI#c?kG460~sZ1l=cj+(iX67{~C! z9MqD8Etxj}1**kvP)NM&17|qi<&QvCgKm<9E|dY6SFrem_!?vwDDqysG5|RR)INkP zF9pTH{{x`()_KUI^TtcLfB*mQ2JOFkDG91%v`>RGu}aau|1bR^XOct9dN75kUwU0s z9zfbx`k(~U_y&?U*FY-FUMSrSJy)~WgUh4&rvra4xMuFHQHcPZ`PG@D0zL1`a0Vz1 z<}&OAwO0)N0wq~PEGm+MicX3@j9MTG&>%m81ZP^iSf z;L-S|0Tj}mYg8&gbT5SF4?n;!*rEbDsRTr4fTTccI6*XM>a)8?WdfKDTD%KtY=AkS z3yui=?|je(9V8Jydmz3TP`Y=oWd<1~1R!2S7!F zZ|6bq%;|04&O5%HPklhGXGR7FpYA;>pkU}!j`F1|^0lA2Q zfx)-)k56}wN`+_VJ>Smz9-VtsHh|pO4YRRECBvtC4&-Q5(BWDPiVO@sojEEMKAlUz z1-4HoMAoMhQqKEyZc&KL$_e7>zuC*%xsP%|P z0jTiIfRwJC(9=!9zV9wk5da+((ONGL3b#36<3ULgd?au;)Wx6$er6yAopV$IKwjwF z0zK$;5BNY=Py;f;xAg#j?{7H<2L4?SIQX09%7KCj($oY62q_dblj zd^&%4f`;4<{$lmf{N>qs-6Q*wjfdt1P;i5s1uA4Jd^-0)!`?+D0Tl3Hhj&6e;>f@K zvPa`DQ1_d^|EUlt{r&xQlX2A!C2o`HeEv-!6ef9qTZ1_qzrI7Uy)-}RiwSd61yE(JB5ds!#lh2}&^T>^?M z&;f8hpmnYZpfwSoT7(JIm|F4ylutnOG2lC3yJJAhWJ*8>lKhk8Zw0rZz-LpP=kH&~ z2y&RPl}GbG*%B^~=6@3Wt>9*R^FQ&D6p!YAG9_^y&Hv;}B0QS^NrA3T0Y?HPw#f>2 z&(7Z-o##QBH{<1W@U+lBdHz=L;Xb|Lpi3+33y-l_TY;Lh;NaK?OY7k7%R5kC6(sJ% zc*wW&py$CK;K29MJOoPfo|+eZAiKIi0RwKtgBBye1Ew3iPy!q;suXh)*rV}QYI)|Atr{XD7^62L`|6>lfV}~L$tpHUvb_1Pl~_A0Bq{7m!=>Z zc3VUC0UJ8@u2-NYE@Bkfm0V>%*rI-M?6$*~OC+|S<2aYw64c%b3mZ%g!2m7Gs zmiMyypt=>*B7?XUbnwf34J>Z0U<8%u4?s=iZjgbDpf*bLKRNyu(8&a#DCTc@0Lr4x z|K#~wu7Oyc*I(ZM`~N?vhz1|d-OGCQCQ1;&GB3zW3NJL!tgTV8@Bjx9q(TM9J1FUc ziW(g0CkAv2C}!pb*$&UV>;L@!@6%hx=xO<{Ug;Q%u{Ov|aCYjv=F|DfvlE`bUd{u} zw{%WX0iD(9(aS21-Swb6sPH079W~HuK;tF_jG)8_Dm$RAhnj`I^ug*2ND=(f8=NX2 znaH#A^UHp4qZwLzgHDRH233Z=GDe_^5>y|1TK?v5p93maL5#za3=HsEw{wol0#Mb} z%VG>}op(bIQ-?H`Kuw3EQ$Wo%aJ~gy;{z=`aRfeQxPv?n3wKZ_7i1f#!UMSr)T#j0 z{V&ggTEV@nyRKtR8jy0GR}B=npacOak&s;kYGi<-5Kpq018$jss!&j!hO=0|_3!_G zaHR_`H=rISy5t6rOT$X;U*Mh(O34jMDglIxX;3Kz$`jCRj#*6q1>bKD&f(zGZowIT ziwam@_BR_)#TVeA`5iPA1~mh;eHGMXMHCe~!DfJxDR?m!X262-1X)r2^4C|CTz~&6 z)~E&fP~nA<3Mgv99smzzfFhaXTwj4LZc%c5@jpba7Xs&cSZ;rr4l2nyr$D*@y{v}V zT?>jjg%>T#7_RjJpBIHvMnTOYl*_TW8k);Nx9j-y7CrE6{>RAQHW$?8Z~Vmwn$K+k z&!;tln^+~hpvD9!lf8WT8x-O^DldffK#f-TI?d)E%=}HfVjwZ-MFhP8%%JuLBnv{X zFtWVG-ws|=(Y*!Im<0)37X=j+b07`$&MlCl0yIMn8s!2dNmxhp#rz4hFC~_PW>GqO zRKO#7y}Uh_K}ibKHHNwva$_sV-|&9oi|dM@$O6stbjN@Od7&ZD4K)Qcv;?}Oh7Wqu z)r;#opl|}20p0=GJq6OD@0Ae%jr2i6Yzw$`4;p@Kha6wE2O46Z`P=7#E?@(-l|hAS z=N3rFG5!LN$bbj4z{3!Q{j?9Q%1{6QgL-@5E^%j%iUY_+y{uuEK%oX1$cA)UK=BA3 zT0;ztFI0epngys7(E!z7U{kuGroci4v^fnFdQ9L7sYRs&WJM>Wg9_@LLpq~9Dxi)k zsO2>SR4;Y5s1$(c?jCSQ7Sf6-0gaf}s0esAKK%dxzrAPjP0-+qgy+HE0^ri$qxqL2 z|CB==Au1X#SYCqKH#I5_phLzI0Uym<9?iel`I}Qg{Uy-ZuDz_cehD!6fYzk?_L>-jnoN-NCL-Vo znkJnBuE78Cx2uA5z`D)o6*y>o2oz)jFL-)spU6Z$fXbXXkcqa=DUiD$dRaf7hbA)g z4qAzd!V4EUP~rlY_TYk^^)YyJCbV&(0ZK#oOHGJ%*ou2lc)=PQFE4=0bWl?smbxIV zdw6?(_hU#xvH&F{15iQ&_Zg{?kp6($;NbQ-rrn@X5{e^Pq$cPF#;3&@5pqzX2c1DsTpCctM(T$x`s}LT%0=n(UN} zynr@tdUSqz2|m9REsudVgu{d3_I;WKgAC{_qsCvL!4Urb>!7ik#$TWVN%;Fuf?})j z7bm!)0N1&Vzd*}N_*=Gv`pr;ftu~+j|MzV@P|NK3{f5U5?(2&SY`Ly4_Wb_BvzJG} zr}GeGXyPXuXp%MiWQvF8DNxu#8}hI+1(an#=e#kz_;8PAUNr>u5zvAev^@h9%-~sv z5}4iK5)@jfA)*@6PbIG?+X|}c(d>prF?g)w$6cEF+Y)4V<1g?+rWWuheB&?B3R(UZ z@bPlc$ZstMjh5|Ly$S+6zrXQeeB^QP7qd_21JD4hkLDwfUXdV=gO8XzG%tWo+F;!Q zI=&B*f8h}c-lYZ#QLwL+?$WGsNPhAEzXzIgp-u(6nndSe2S&q2jBY8{@U z0+}!b2i5o6G_%_RWOw5)(3(&FK5o!3b>lAq&?VC?O`t`YjlVz(G5K2@AuU7DGA{ns z)OVn<;6FV4J@%k-pf`*O-q8ZBwgtDMK@4Beie_B3VK3_;b>x{_ut)8hL6u?)qzl&F z1L;^myDwyAE|1Q`pvEg`Fcm$szO;P?F6Fh3;VI>7ML?xIxZMJ7%OM*As_qDk#}KFs zuYu}9)ZibA#4&;|{u7HH@HRZo(aOFAsn%Vzobt$E%ZsY3Wrp@LU1mG@}k$ zs*T&@UaA-#=W2v_91rLI>&X$Ef_+$-Y;YBF#-~XVHvjFe?21N{b?Lh`;Dh(EL;FWjXTU5a2c0*S& zfR5e*jjpMHN7o=O@#*~R)AK3Zdd4R5*kRfKZ+g$_YZ9UIx}+0^#XG zC^ZNr?*}^H{4VV7IM4zWT>EhiZ-X{DLXPhTox{t&%|xKL?t(+Ze@^~(@OcUQLE6up zIm6>&`MciFqgQ4&cyC~DOxy*J*4wp*Ji1x0vw;qv<2?bQKoRsoe2s0V(4W;Vg+ zmmqEJ>1Le`($vk{1ENUNYk8{N7BsM^09tv6WdolEND{H7ALJm=A|(d+ro_6P$^NC-8RW6Q`!SEX_q-sO?x7i4|^twa#d%CpTE`8<+yD6K;$MRSm`)<%VIj=AH z^zv+T;NSM&tGCAgf=BEBTByYKPy7PBFJn0wKJiB$^yvKedYOmisd7WmA}NJW{DPpf zEU+I)YXI_-1;PiWFdrbT?`l!803|Z;`lAz|Q^6YFc!0Cy8tAYwlaH~%)lhF`k;Qx5aD27rXY%ZIOdKv#Y@KVtM?Jmt~+kFk`Of18yB9;tl`5%mmr_|A2?(iCSU)Z6-_(4gd5?IGc}MaA^3)S^gBfDtH#C zAr8vvk|2w~r)73dflR-5_JFVC{sdYZ1)i?$+@k`j<~(|N8{9z0P=MwNWK9`CM+L`# z2AsiD-YzNwuMmHGXK2WW|a;t5dk2A<+)ya8H=sldMtyzth{ zq2)h+3nQp?0rE;c$WNUIJ-{~&{Qv*I9<=nX`5*LRp?|Q8g}Osj5i~cFNf3SR6Tbjt*7y^D+$m53_~gN_a{zSWaO(m7 zp4FgW>xLe4#t7rrf#kx! zjmfd$haP`xA-IXX1+oOIQ$z)n$T(iS0WG(Ht<3}NItX^ct&_!uWs z&@RMnOg4J_EeApI)p^43o8f;@wqTFuWB^SCfR+z=S{~qU*~r4cV0hpq2dEhiTdCK} zYT$$1A_H$p>TUriHAu}4ONgKyF)xzA*HeIUKqu@fb?D+Y(CDK_uP9R?DE38EUfeVW zowx#8#0g#Q_9C_ zs5e0qo1h5~1CXo0)8D=cBPLc&JCxm))<`vSt z2{8%e&1!3qwQz5CUH~r!NAhlz7YW|&wMFtSq+*1|DmZQTit6M;y~~X3U9cqByK|l) zybIQk;oVi2N%t4O-IS(JN}73-zWLvNyph!QNc|1mR7v77TChy-2z@Atr&mIo|@=n+`4C_*>mT z4PkWMk`nn?BD&55&i}1 z$MEmj3#9uOViL%|>&-#d!lSjb2f8%E5j>|1UINy67<4)jsD5mIzzC{~KueH86Mioq zeFJs3!0XU!R0KZp3xLLpA*-XIb*$w<2mYzYKuP@qIQ_?{B)ohI-bW9wDei`FGQ7M9 z5<`Tsq#Frg>|+TDV{n=RkGz4`W_LpGx9=5wodpf!L%JZ(LcRc-UF-0@LtzB(!B>U3FN&TQ;?l7 z@3q`6VFqpK?c4*I_CMaD0;){G70+?Vk^nHf8`{)tgjTAEaFB5UMLv#jh=*>y1BU~+ zg9Q!;P{+}uSClam8q+tlL2iPELjk1rFL{6n2e5jKaA-P9dN@E#0)<103CK=ZIH1(H zLQ;BT7&;x@jSAplwc zv_@qDi0*~bpu>{ETcAMqpS7s$Kw=+2VxK@_Ux2Z@TT~W+%mS4aply+0HfRM3C~boh z0Q?-xw+lgq2&lOOxuFuY$PIM)$68RM8GM}}Xf4}u78URw{a)6yy`ba)x@hF^EXXw> zxgeFjH7Xf9L05(w9{B9B8gzH2;icD{9-Rk0IzNH#{pjq!sTB72>54m%) z^(24mJdlFMe+&!@82I~2LA@?`khG{Yfb0PE`$2SPi%JKGCMLLhS>?cK6m(EF)ELkT z&KD7EptJ{F&LjbMJ9Y!e;?6DLxCJeI0>vvx z7ex0I6^QOvi?Han1qBp;JE)%lYO4o;v=xAjo1#(yqCr;+di0twgMu~zw7|&2!}4Ew zCa6~cjs(zJ7tmZPXs`z?&{?D6;R!lO2y|~qFKEySGR^|J8B9G3GLRGC(Ru*XdM6vIee24BSAh03|`tO$^ZGlAv`ebAJE%4;m%c0J#x-R3G^6OjH|U zKqnTJs3g1ut@xkt;>JQOAwo<9cDAUXhHW1flU`I#1!wLen}7db>Z0%1Lga7oeqf^R zdw`^D1_lOj!UnDWFPn!YVV^9K1*wGWAqH=X>kLsry43*`(RlBKc(LD_z!@mRbM%|N01M00zy!puGqlsORm1&joEgz~9@# z$iT1@G>ryYKpy~Ej0dU&KqbhFmQ^4NK<8!xKKB)3ZT+{%-Is z2%ypJy}}d(aUO_1ggzgR9>#p{EhA-D?ABqq4+iO_f4MWq5%UV9ve7zt)0q#?U(p<9sQ!iFbbR)Mw;Z=3{9 z$Ez&={eNi++ZhKM8s+fl<^T;_9DHf-aqywN$M=Jv?Pev}9-S9GE;V-$_)N}& z^PI;{kjohu7#ch{KYDa>90ptP`rMf_Q1^g3ZJmca6i;{@d|~f#@PWO@N|43;t<%9V ze8B^CmvKoBXyEAL1CN6*OGP~zAAuG_Lfvb5ihurr*G~)&ynX<3qJ~H3$Jb{-gHZw?3lTPTet10vGr1m8WR0MdZzAJFk7kS)rnyQU9<{dw2}>Zg4OKYajg#XFX1J8pm zS-gvzOG~%w| z+4;k#^E~8G^KS57oWmXn=Xd^iX#=i*q17WetmZ(%3RJ!j3a>tJxM0M8GAMMRVTFhl zMr`q~haUf>5*Tql1>zvX1Fye>y$g!=tJtG`F381*XouL8Q1&<<-Bgt zgb3tZ25$Z~@I~pzT~vHP83a`PgAbeqF(CCouaAlkcyBXkYdq)>6p)kvm;qYO@;AQe{mVS;}3Lb8sv5{(BvBI41L5g-v=MEc=WPPzW_RaFoc7{ zqnm{TWH3tE2060%g-{>3c;Ytw_y6TFSn-5<-z|UJA5ipTy&s^2$D^0`9O&?I%M+!1 zpqZx^kVXTj$^lm>ou@p|v&~|VanK?Tr6}9Qz?s+a5tLASWw<s7Nrr-~r7>fb$=?T?1}az#1e4pzH*`iU@iEmb}rw z|F3(&z zGeO&nU0B?8J(_O2G@L1TT22R(XSc)%BHBH!+}AH4MuT6lm* zHNox0PUtvwcMkl#oP)1tc-T5P@iP>OfPx@*7w9%Ia45X|3Yr80o#Wuq>!OkhPFcOI z`xqbvK4csj)QEp!6a(q>fvmx9`-pwV!UMo@Bq z9NPnl7I;{LYB2B!H6qkNLzbY)Wlm71s1X!*XkiYT^8r=$h`rsNmm#T}6_mLgKs$;- z=^H#&2e%0&R$qWm_ks;?I6zxQ{B58nsYh?*f6&c~{LP@L%wsM*?zt$N1|b_wh_|W_ z>;+I`7JT6xK1T>C8iRk4v&=z0t2}P}! zJUUOjT!zM<2I6-feEI6n|Nk%cw1I0?R|sVXq0AxF0tht|LQR5D-MXOj!QtIp)cJPk z9pKyAkcLO+3B&)ch6i2?fo=u{ZS6bg(|O6U^MFt12@lKbwf>%<0t9xPm1pNA z57=>5GLt+nKK9YP=h||hL=oHqZ#hsR?9=P`-`Da)v1ju!(6yP8|6ecn>^$*$5oqFc z>VemHz^XlZ1OIzi9x9eS<|6rD4;1khpm7bP^$MM*UcYz|&RA5}^84)TP(cz^%iF8Fo5X=VzbJL!f&Ybv$~D|AXdskkZvbBc0IG*2z}esOV6hn3!ecH1{|!7kPrttUVrdK5sq?@T z)Tv+!tv;{>r3RGy?mc##35uG%K!1k|s7|v0mFJzO!Dopd{3Qck!F~~TrcviT4^8l~ zMhc*P`H+4N)$OrdS#eAS})Z`dRQK=3-q}7(Bt4sd5;~4-pmP5 zAq(CCqyX)3fTpHE27oW~1DgUqvf2UECkB^*0iY5^z@zzy#9@!tOLeRsmWOMWf&yFP z_3_qAwfvym)!PN~)Jro^3$F7-=f#&gpvKdBt$+Vtu7Xwd*uvKtR19N`X9R$PHUm`d zpm*R(@<2|F0Ld4CS};CUxGpj z9E#wh48gbONPr>~9JLxR*gpLSU+-Yha)7@Te0>}Em@06y6f_P5u9YC;kDxARH*}Dw z0F;fuSI;0D*7*T$ScweT0S&m~->BK*6-E!B@NkAo_`?h?=-(;=i0ht3Z#J3wPC zt{VUTzg+Ma?Y{Q1N)ME~AV8r4y_ps~APy@1!5#+%*$YO{&Ra-Zjzxukn~O?B2WX(( z3)Cb;xhz%zRC0k2<4OR9DeT(I7*MR{s6cOP-mL!b|I0k&rWiQ=qm+m6LvKLoSpZV5 z33%+-(*02Rv(%cWpz)yZpz$C<&=Q->OW>WRnYTAuF)@IT>pksp@ukO(lTmyOzZyZR zuYpYHyy$W86`#k!mjckjDEm^12jeG?%#&;S7#KV>PkZc`c(FxEpZ#_k*!;&HjJG^4 z-tsv3ip!&yXQD^urLCaFETBD|=JN~15b&N0@D+#0!FOC9nx8-&iOfs6 zpxmH&*<+XE#CM-|gYti`2^VPPkOX+yP%=om^Sj5vfA*f8A3P4ev-4m)=fQZ*M3+FB|Ffc%C zH2#*op!jP3ZOz};0%G-g{|7a;cX2AV2sm*lws?Gh1zM-oc^+D3vw(uB*Nf4k`6n-b zGkDIomv!52eg>CrmkBJs$p?HakJo5`syhXbUPnf7@#&*^+@seW%tl*y=F$9%m%kZw z6ID0M1fS#s9-S9oA1>kW=)C!|3=}q-xeo=5s4b-^@HR(WwDPr*&NUo3;V zf@{4MU<#ZZ(fhOD&G9H>)GxZgM~JbgK(>m9s0i$CD1R^?JQRG-jK@4IkMTEyHpzn}pRss!o5*=sey=&`+j+yc^RiFpx!2o3 zi{_d^C5z|52P{tf+gzAAJS;EpH%Ecod+-6PM>lwI%Y?(DyM{x6f13-3gl9L81Spq6 zQ(0$?ibDsukoQpu@Bz=H!Xpk8*pMIs7dhZW(hUuwZqS-Z%gg-D;5p8Nk6AssMYuh> zOSnN+aSQNo^Wm2800)bM0jR-Y;?d0vO4kM;yDdNsH-`>T=N8nv0cFJoPz`~&6&jLq z5Nju2ANJ^W=J4p|_UH~4;NKPvu2;d+`;asHJ3y1GpfiL)%dEjYeW(eb16E(gfMU3p z_2?&dZ~}s?=>>HZK?MMKP46+#6f_@|;~&8%g}bP5w18GXg31ACNE>)`2Y~tkbrBxmV2_aC-xkCHI?KL! z2}l{JmU+a=zb%AIqUBPFu}5#%|JN)a(xdfKjf#imt>Q`#6g8!fK%uXJl&8VwI)Ls~ zV)5t=X7sQ;R4WgvL=VEvEqx9ub&>Ueie(0n{qO(*1tVmwHeBdMb_F<$QXte>`G5ak zzCdc>!ZNjiN4JB9;icE?9?b^?Kv$huo~q^J-xk5qa=Y}+F&7m9#={_z;V?XBLl`LG zTUL&FA3NBEy{uZ`-ajaFgL?C@3pb%>m4bHELlSu}D=RakKtn9Vd(j~ZSu+G4SpW}Y zWq?v?0Vw=DJerRL9Deat?%)5H1^?07Q~YhhpbUsoKY%=}0f|QekM0N#kLKSj{Jo%K z96^%tt~~h1qtip6TQ+*H5CdpH9yA)){E)?i@nY-kQUTCxTIWUZ zX|XS3!SySs9SoX51htA^l)+2{HHZaXUwLs<_TPW-Sqv!g$KSRJl%6o!pdO(1o&)^S zuS2!&{M%#%TW*(rfUhG3SpzCpz~wo({E&Fz0F5{3atxHal_9N8H0|IyA5e}5cN!R> z+QG-dDu7}foLmw>!3NR(;-AdF|1T|(8?6Zc^tPz{0F^i3_4AWK!|07~AZMYhQ335? z@#uxn(DOS%E5JZ&)Im#0K{RL)F^C2)nZUUus0DhqCuChRXz3iNrU3QXK@n_*+%^KzF1twj3zou`w#) zurcOu6#^O7y9azeBj{+^=Hnkgl|1x#*{hDA!NFVx!vn9SL3?aKgMX0njoG8KM+Ce+ zxYwD{qxlD0Z2~CxzzTYy!3t`DDF1=<+IT?ix|Rdr3$@v=faZ;Oe_R$|0F5Yub_aoS zBWQ68=may6IiO}XXiYdc#v6}-62M_l@PpRYdmMbg1PU3@T5FJ_AW=y?ML^yk!c^?wkWYs1vk33nUL(vH;3p#~=&u7(gxqjie$w2@)H7AWpNq&fnVv znld5XN!`$WCI_E0gH|ztd<;6Z1r(y7&1oQOJS~6n_dW#8h>~DDXzLqjbOvN7#4t#7 zAq@S&-|J4Iq2Mu6kn=z}0b~-yxsbF7+A;`ouCL{3{$B9K?j$(Z)$pXN;UyRTZF9h7 zk88_q{#G^c1{3H(>z#AJr)h!q=YdulgHA0e0JRG%Kuf(K+a;Nr)fn5Om?F#6URZ#B(ypj(*m=3-b1AJw3C*-tC!`q;;V2cWPO7QcI{lW(oW@+kl!VWZC=`bdDh;CxP7qwiz^| z&%f;?$d}-aHkKdxdnbWvbYWbl#; zG^o()_8*i~!EyTkJm?TjP!R)K)(kp8x%oMx2P0S%6!{Qspj*B@x>*l^Chfa<4}vIi zY!?C_T}ZO+N5O-ktWF?nyLp{K6bZJ&D=*L(phqvS^<(6WS9=kX@xZG}KY-&1G`j@p zPlB!$?F>;#FuV=AWh99awAKecgzD4z7@Xt4x7T$-PV@5Uh1FOrDlZm&LC0JM)5bFVq*YrM*|f;uKe3X1YBD#Ir2|Etp}==4zN=GERP z#Ng2zAON!c5U8l>hHS_L^(H{dB0M@h3_#t21dq-Di*C{18$jwKG(e|*mxI+q&*SP0 z(0HL22I`4{&Y5&k$uK+#>g9Sff;2~XSYG7ss_jcRxc~~Cj@4o{+ zH{6-g$MO(=>pBppy9exO&(2B*$g)Aul!j+#rH7~Gg<2v0=5;I#450B8zit*b-%dvl z{%t;d9KPL-0>0gW5HZ@HqI8)raw*YwM*_PR~xyfR}OL zp3ofdCGb9-&?TNPGFd}(o{jdQdP<0I2Fz`|wbQTC`I7gXGjFfHTTu5QUQ5A-nxS2@_i*+t>0Uf4e9%1B0*S zP5yRP5JU4c=oC6oo5@%66zI5mP$S3l`z_CdzwCV#Px<%CD1j7!n>wARd^;b$bp8JS zzYpjVx-(1+44{#`_B~9XF4Ht+(H$4yjwD(l}>C1Q#BnUC*!po)K zK!zOWZ*K=1a-P4v9Bc?!C&Uo2c@RTxfDZZcQ9SO$cpX%gfDC!b3EDaZI(pR=lw(0h z1(|{vnqU%8Hk~I4b)5q83(>z_%djTKgdn+Ma`FedU@nwKJx&bxqi*3^U%wB(6$rM=IiAk zQ!Fp=w}aNWfDa^xb}K;_5%)ly2E9l6phvF=H>f!daoWw7*Fm#MAkB$jQ*Q9L2Z9)& zWz~>YD5$#zTEQ~~Y7q1Su|pocCW0V`LkzkF-uQCDqx0j-FQBtdyIGTtfzwYgh$12V zc=Seo0EGZ3JUn_Mz-;8uXnriHyZdi?RQJjmY;=5!tc zFStT9>kfK=hPPV7Kq^6N(zAF!Gn(B*$e0uF=hjesn1 z>O2JDEC)^SrX+(?LM+$6|1UL=##<5b+uNeT0df#{eCi5l^rZ0(_(Z$THIN+E3#E@k z&KCpM63A&8xhCmufsAQ^eAnFrJ@Xf|X`tpTQY1pp2k4vvZfS!&1#V@7PNxSojy<}a zzzaD3UjTUoyeeG)K0?ueN~C*P8I+OfF~Wg|9i#zW zw*q#}amWeRFgB=F0cIl|>*LYeqXJUz0Uk*Og|HYXgh5+?U<`#{1rZ)KpZWzYs7D1-%G z1RsHT9=t3PG6n_iDM9yC!v-qA!@u2gz*qc0PSOHp0MHgCP!S{1U7`{L>L)9_V1|~K z;Am;x%n3R`1C%%+2EY!UpQ8e@>NT6k{{udqxB0i1s6=^Ke&Fu~ANkSzi-o_p2&D7B zN8|qhZ$>8mR`8jGpc7}CR)L1WdaJ(q^g4g@{0?rWcs4)a@@W3g#NR8!!N6en-=q1L z1bFAS^ItvwrbbQ%22abo{OuKBZP}MRzu)yd_}AXE`Kg{K z<5^$EQ~tdn!g`*Tm-yTLKuR<(`DkAD?7R(aKKUqK2JJNhUGNDyecAFRe``6YrQ8WU z<)w2E_+%AOYYnv795e-+fw*jG3b>C6YMnxQw~%prpH3YWkU|bnryRW61ynMC`fCy| zj8*=DmnO}9PG0~I*1OfCb>=8TzFA!P!jAO^KrK!$?{#K8qJQkmfJqURSR zTY!(Y01v5jLyxuqk0$ksdTT?=1f_SNYzcA&%CRlG7a__7uzrj(;bcFyGQl{5aG3xx z4^$>B{RXleRwj7#vWgUgayaOW7tmJJ-at7}GY&MK32HJx)y4=*&p6Kdcx6mb)t!V8|`cuHf*50H?Dtdb^B8XNt9xDH$z zgU3X{I|Mp=AfuGMq8BxxA;01c$n(&U2de~^#*PaSArBq_!w7l*K5QYsGmUV_L(Bt( zy!Ka+Bl&tzM5Gpz(fi!1qS| zfaXh&=Eoc!-~xvOq8oP094LowfS4e~-;@h6;h9Ho)H8%mDTvO!OkjJvV^lIcK-wxn z+PZtddDf%(ryPHiI!HUHM=A$m^m;u)Orgqwdj8-;PZ&Rf#`eKk$MQFSt1-wF@bD#Q zjRk0A8Ptk~~$h|~<$f{~gVyRoI_*U5xaGsHYlYK{drY>-nk zxV{EA1Q8P);PM?D=%CntF#~i^B5dOUqD>8I_JAS;Gz|%ADuUY96JA7Pb5Hja@R4o& z+gSu({s#}UKrTz<-_B$F(ga=LC3w>gL`yf<%Q=7k|99(FQG9v-$N&Fs{M%(DU#^C* zL?mC9Ls&e5FP%ZGZWhj$0zdx$cjDh}!}#(JXc!++k3>E|j!^Ic*hr}yqaF!-2vH8H zN5GqUk=mBvBa%SVtDtJf;f2c=Nc@AB0)UVH@BoDkXja{$SCmZ^8u@ph!z14Zw8aZ_ z@K@y=M9hQLW5j%WC$^aXm`FJ0A?AT%KKTR4W?0O3TfXcB4e}rYC-xP@w?viQWuG9v z1+Roc9QXnr0PPi(P=WgP{WFlA;G_=T_YLxG_iTi3!Rj%5JF^3uZ<&ekEyO&KZ%d(P z>4CaAujfyAaWnxltX^yg0ry!~La0R$YBq$L0-<^#R2zhl(0V`%k6u>YGoYY{-suYJIKE&Dhs-^ISCW8- zA_PE-w7!9wKCLH9)IFMiGV`~9x8s9P#shiz5~!R(tb=YnS>o++ob|$X0S3^Dvu;+Q zSwal02TCP8dRa}t7P4;G4jMGdQL*r7KH>nnTy{Q408|$AvI>HgfabBZ-u?Xl`bG;w zH}8d+;HWbKZEEl2EdnX-E#UCzwao`H5qIkvsX!J#fEKR6%;t6e0ZJ4+DjvPO7GUMz zF%r<}8Jh2Z{(pU$e>+o}ZD_Yokq|?))(tQ7ivIOv4MJapg920ni!Ddg&~eFhB$ufHUS0?h~qbbmxRpcbjz{1|0|hxtaPW=rqV) zRZuGG1f4+B2|7oy6MXs%DD!qZa(HwLg2&>)BU7M~6J#N%h5$8lz|CdQ4InQxLAP@t zA_2VRv-M<2G-!||!K3v+2^Xj?&j4Ru3fgUC?$I5|;n8c#D8$C#VR^4q*`r&^qxm-z z|CGZmw_%FyK|@EKCqP4CMI9RVjH(0~$%0rEySG#nd`fP(cfs8EOQZ0&(e#)FzBFXUcB3bcUN z>p<&sTR{uk5hF&dyI(+3B%}-#0-M_c)ede+x4;(`D7-Lw3n@dv8x_DiW(+_*bqkMP z(d%-c)FPttV%2*EE>#z(;yOhJj$-=;e)WhL)Zn+dH9Gi(~O!0eB4_ zXaWReE5{4xR}iZTUateKZUF@r$WYLbG^l?F8u11{j{r~?L3f}+!zleVS z_rFIktJ`}}&_c^d(DwcpNj0F13JzA#1*x697uN|ebn|LY1qBa(>u&H$3f3d*KpCBN zEjVVN+ChgQzEDQjz6q@T%@m0CB#8E<5bgKDO#!HO&|=9KPpZ*uZw6~$3)RjE(Ow48 z-u?m9&V_0RkD`G_tH8kvD!M?77n|cD;SatT8gz0>5LgqB3MeUZc=U=I9s`8{s8#C8XsFDxrEs z%}{Iw)g&)EF|{tkru83+tzfNwm|C;3X>~@?3ihiol2*{hU5{Q?18iD5k0ARMG*tfL z#u7v@fwyn4K@Ij8bMJ6 zwmSyNfCW1Y+`#FAqnov55~xPuZw2o%1h=g_Srt}-)2cfoXt)EKTBJccf6FT&i48h4 z(aEZ|Mu4H4)d6fqX_iMPuk0GIRzvW47ErCAy~HnU(6#Pf4bsXA(JJB5$-8N_0K+lX zdHq5ROo$BW(aSn(HK-l|&3%Jf7b?#nH5uz>6k%SFa2sg<#R{luh+jaJ-^Zsv|AY4# zdi3(xip*Y+OgBV^6Gdh*NX7`Xh4<&jzyDuO`3-4eA?io# zM1is(^z)k{6+BvRmpXx}9?(E#iIxXwF9(atiNmeJ z0JSeQK@h=U*fR;|Pe@Vcj+d%-*b^{gbpf=l!M->nkffvt!YaQs8;_e(3 zNPNGz?+SKN$GgA(U$=pBfCVTAECS_#xzGSX32*+kNs#o1a^4EqO^9u*5uheu8aPEd za3C5_qCd_-3T{Z_2^8g^TnWwrpi$ks7eUgX!WOg%0aOsbNO%HiK_T`@K=*sXCsSX@ zLVR%S?ce_|13^v5-Wrt%4@+zQ)BsN@sO4($S_hOZB_Qj+ zVpI$~K<6sK3d-AWK=~U~2Y{!2{~z#Z{=rjo4&)c)jBN7u@Bi16(Cp)H>xG1$1t|X- zfby?_;epqjAX_!SyBnK-@YKeF&W$|yfCV%|?co8ssnes|L;%#fcktc(^WZ`Lf zqf`xKC;0d}A8=0U1npr4odNx#od=TCL1XockGZG>fcJ7hnqnX>c&7%0`=a{|sC@?y zB#&NJ-m{RH0N?g50g5Q3O)@Cyp{&HC`3=h6H*f(V$iM3mLy@*eZxn~e_rpK_*E5vp zdURg+;K9F9l7GsfmP;kKkGZI5fL#IEP6gtE-3Z}&^s-)wf>z+Ytd@+N44??%c#$6p zYD2!b@%r!om&Fh#qqv8^4Rm!XYMgp>gU&qe2D^#B34A?X=LL`EQ;Z(Xhd4aG9|Ad# zzXh~_3uK3c$L|0C>p=~+1`ox{NG{$B%5oB~l|YIFJbE2DK+WqH`%)n(RKSCkfuZ3) z#I9W+=6}!s6USUsEWlv| zDX2hPa2P?j9=)s^BH>}A$^Z)^Z^$^smREoOzXUDVg63lwg%Vzv`!yl)2Mv}IeGkyM zHcHGr^k{ti^M5^qNAqt+NCkqtg{zlU2H~cK|3U2>P)lKZFgV^6KyIpr#2Z%k@VEJZ zx~FLU2_F@YmXrJ~XFyp8bktD`qepKb2k7ElhTRMd4GbRp-~rwVUVl-dA^{ry6#xai z!fR&G$sFC5{JWkr6xDdN9xqMy?EK-udEBGgCD5}8+J%KFg2Gxw+B`Ol2b)O2aXQO2+&^uKuFF5MY#jmFFfFdHy*n|$&LZElpV5u^2h)Bm!QECk6zYe;qaKw{s#-y z#2`?pdi1icK*-v{Wu3vYFV?*H`~T&1#DWc!_~&nf?jKYDl}C^>G5NRos2G648+^$M zsH*^WBP6^*Zfy7uO530?X8?um0grA=kJjV-E#RsF7M`u(@I2u0{ep+$4N$dR* zW>3wJ9-Tiv`0#J!bmX6M$hGBC$v%(P`=v6TjSoSI%Cq?=G*Kb7(|kbl1>h(MNcsc5 zUky4ST6)Ubx{J@@ElwFXIb^V-aX z1sYDbZhZRp|H~L8w}PCE;@&bhoZ$y?>p3L1f`>C8!2pVCaK-!LEjt6l>t`?Ap8oy+ zdI^U4M1%*!i(k-0gf%>D=YYe*4n$!O4{eZCH?Phdg5k0735DUo@M7O@NTLF{6>E6h zWdnzY*%KV$aTAh0P{+q5n&I33P4!?Ibg?$1`5FLe+Onv;I4B1i;|KMlxCBGAYf=x}Oq!U0u0daEIQ3UFr(+|-N!sRnPkgpORpvL<9hdaV+~ z4oK|w%Y%46DhjV>g9;oEk4{EV?tq+3i8!1MHcI@${_)@c;5{6mlmNk~>CMHX`HcXm ztmOc;{lIJXBtR|Y){~{+;No52(4 z&~wbN+b2NCKK?fFWH?$M5adTl9OQcRvUYQT#*$f7UL>7{q;>E)&5Gc2n*Y~>20Ket zJ$iXP!Q0S5gIH3zplkwO1Oq*N0OEacYY7xV9=*KMVAY^;A)YG`Qx#qx0n2rRI?tf) z#tS28c7#W&2l%)iZcqyjB~rmtrr@&^AQrulc<}fCOJPW)k`TVA@p+kW_-?pQ#rRAn zY@Y)m`}o_yGkj=$CQuq_Jy4SA(fot4)EbmMG@wlg`)T0P-vLCSl>YE0gf2*`n^$id zxb$!S!34TrinZJptgiw@Vbce1VIbG=5Hnxgj`|H6kAHX=)Cq*meE%m>f=2!J~J8Xm`;1VB4=Ku(8F6v3N4FP`1` z`~P(dD8$gh3w&M&uJ+c8`_PlY;O$f7rq-j$AXo7|22m)91lGo3y#SKx=Dj!>oVdUP zzc8P*f_(<^5-1&{gEoM`4%P*CyD)s9a_8^=m!L^LkSCBZnt!H)ssz;Y=#IOn6o6Zy z*bjpTAFsfo@}d~k4WI+|RX~Qp&lf{1a6SOO#28e%{WF6saDD|Xv_R9B{4L-^{z3Zq zw|QuFfCkjS-UhWqJ9$)IR6_j@ZB&44g6&5L;NRw<0qQ(igAMdiN$_a=$-uziP{#`D z?Slv45?*tGq8@xYT!Ke;fB>j(14;rB(4~E##tnGs7kDhk+aA&m0xuN+9}j2%zWwer zsJ4L|wgsBH?Uh~hg_Xg>@-TnvLQs0{X7XtM!Oh>=1LnA>ShO&J&aVvc=&qCSX#HQ3 z&%ezN;x|wPmi>ZQg78vH1ZWoal1J;MQdZD_o)XA$;9Ujq%>xr&_}ha@gB%se@xGwN zSONUoqBUD?mt6GdW?eWDoWK@M6kq_I@DG~XeZ3ZR7Fg%S*Gr-FTqr%&qw};!=S9#y z=gu3iJ3+0jgqP<)MJ_!0kq`Ty@ZyRciq&vc*b>Qv7t2soPk1p6g%4`UK#~}$9R(<= zUL@Z9`~Rg6+7v!o`URg}+WaN~)W(YdweccAah(CGI$taVZ{Uk~uNf~y12Rux#f z0bl6Q4VsTfO*cr%1bnJ8xaS7m0uJ7606zW|v`+#Q+nqit3NMbhL1GlTBM#iQ>JCu> zpK25Unw4iVJOCJH%`7!QK@w^*~LrF8s5hthi8KgMz-WQ#1gPLD9FKa;tSr>1zKYQ zI)($3v07h3OAW|o8bqlvNfA_`fl7@NMvzitJxnEfIS~L3&x6ns2|NHV05&@iw6OEQ zYi8(9S{T}$-FU4b^wIBtcQ@_C15`*@;fo7ONmu9~xv_?uI z;AMZ{lBI7lxa&*UCC+&magFN>1Eabz{=oh`Gda|d@ND7 zl}Gb`ZvNKqphVbRqY}`<4jLTG0BvveZM{^Q14>u+;Bfc@%GsUJtB$)_&-a3o3hx0B z)d^dV0g0{&FJ4(eaym4X!E|*((hn#df>wr1cyS0#9cZYoGe*V3k$;<`7N}|J(P^Xd z;tzVHlxTy>Ef0uCL9X`cWetDN$^dq{N9Q3>0Rsz?6b_ zMS%wC1Hd|8@`IJvs6e@(eH{?lUe+J)pvJ#^g&YnTKKfvZ;`8np6^obIU>&z!z6CF; zj8Un0{SmaB1GK0GoU$>3Z#9Y`6JE?l;p5kvkD~TPf-blr7kTCH|Cc4u6O+;MBRK9+ z#&1D|E2L!w?=T;CQON*17SfquQF+k@T~Y+De>lKN1U%CTQQ)E?0Kb8Y_qQx88#?NP zvSBHBGRy%sN&qTu!5uqr=NjDg5O~4vjGofL$DBjQ0y!Ei((W$ z!WWQ>iNIO{P?WrIy!`k7%Qr}66{wkm7CzAX95g`n1LS;r{%x#R@)7H0Annpp_7}=} zpuj%Hx-B2HUgoR%|Nk#0xcvYBqWTW#{x!}2pho)ik4TMl&^hccbR*GL67Y0^mIHh% z1g%B@uOwjZ0AC$_Cn^;U)=XOlo2^!tPNT;VPp#FnSzIPkf+{uUZixs z7;OHd4}ZZMUeM=@qd>-EpD*Tb+XE{5P|x=VpWWZ>p#VN~uiH}r)ZBx#{wqL3KivTw z9^Db330w(K83aB!LI5;<0bVy|0G~hwg)OKJCg9P_n!XSe@8Gc^7w{1>pp`+rP(ce& zT6F-esR3=|@&HZW2fScC0h+x4_xC}KQrJ1a7$@hysJZa>|4VgPZwG!q5rap!hlNMC z19%aI0B8(N0x~IxmcFw=^$`~TgDMUiP~~?LbddsR-6jV}C1^b*d>bUFp^emr0k>{I zRUg>47s(Q!?FZnVCwKq^wEh#c^%B(V0G~MtYOL_LKu(~SRc!|yHhP-BB^q2?$$o8v z^4UQAPS80CouDC*URLfH==h1!E=YO;U)YiWIy?`wwWynSR~~2(g})Va3%y4#?_+Q< zgF9{&9^ITC-GK%k-JTYpQ!2W7`|`ktO$fA}EY0!g3;-8r0g!VmiosF=8m%Ww%|UIe z2#-z=&@!;@7=8wjA1q)s8E9EKxD^CCVF8q!kghclQ2~{2;A7)BUKAdJI5^?;4sgxi z8KT1RA_gwl3~Jzb^zs^k9Smx>IKbo}bs4B53ew}z&3dmDl!HNwb$f37fTViR;q)He zyfL7F>lTe|6JU6G1XTBQgD!voSBRiHL_iH4P^#qc=w{ssH^d#u5Pp!0A?F~y6am+X z(CBjj`P$=UJjhVwwpk~%5eVAVi|YMu-gh7?x<%i&3NV1L1$c4x?BD+{E0EgcXz8&I zv_7%%4WyBrqf!BCl2?GXi-9Uk@Ln`0(AD6eLl8k*$9X`?K{rN%EN(r?-?I>uO1q~( zmUVW|fvolH-U4o>8vcLn3~H=FxgMIwKqo9CwY(rL8P8rBL(tJ1pjDQhj0a(s`*a@j z=sfS!c@mUC9Y9CJ_GyDG>x5bcJ0z+TVi_n^fJ^{KD)@efPH;mGJl6?o@E;b1-LogEGkp{+2{gCh2B9 z0ONx;qk>{N0hARZJbGELML;vn+ij3E2+lMGh)mO(4aqc{K>^vzyKWw+z~TTc*aZhX zdcFzEhUc4nSiS*e5QT1DYp@hJ-&leCk^s#&!I6-B;{eJx;FYVLJ>VUWpryc&y@{as zZae~t`@^6@7nBgeC$V$9FxwAtcERhdh^(Us7i<8Baxd@qxgckQvJNXu?xh7N4I^cp z#Z9oR6L=Lh>nMVPuUk~9S%Bf?K2R#}1_!f`ipR_KATE+2b#Oy?kPHE59q>4T2l%*Y zkoP@6xhCLc+`s?-4Nn>#c=;1#QZH-kC&<9tiuL=Cit=j z9ABVWA>KXUR0xVrGq^Npu{kuhr)>iH3?wbS_vinY4?rP{?6l4)(Dc=#f|Qyyaa9(SA zD@|C{2+mcYE)Xbl3V@dCLuwDuWh!<;kU{}v@aRA-wC`^L+7$}cX?cUcMGRzix2$#p z$Q!0QAgU95_{fHT@oN`N6xO9#ozjSUwr9=^x7c(|NVicT)!8I{>mj7cbD78GMF4 zDE?lCfXxG+Cgr12@bVp~pt)`M4YUaJKd83|3KekYtrHe9&}@McGTpq+AUnH7T|jPh z`1}9=3#DU!|G)eT?KXnCMqrFqUvB^RKSI|NDmM8dIz$ct{ zvmS-hEQ}9SBOLEGjQPtw&0w0ico=(q8OJfuzzkkg9M0bWn7I+lv_( z?ZvnhP&$kNwHLF&g(awA1!*rjgQdVp)C^Qqf{s4}CDG_0eg;rHfT}fEJb;rwZ1|u% zM+G)i0%ng4CaAd> zdk!UK^6G-Zty@&DMu6evQE*BEuf7XWv3R)+#6_y}y5NRLAQ=Kql;8!Q1}{ZHMRzyc zfK;#n(Bt`Vjq)LU4<17AHumT)a{!;8&kWKIN=LsyLnpnwLZE=`6}7&~!SM1qNC^3k zS=g~Xu;COWV?{GT4)5m8suo~)SpZ7e9*6(_e`yS9grcQq=z34&@!(!i`xl&YL02S# zrcyyU7ksOWz>C;DkbW9?%n&>#rvVzC%7DZeXzUo2z(H*>i5DB8^AN~|J9@{ia|*P{ z3QH6(W*2l3g@-v&N5wfRj2Xndvs)LAIl0m^8v znLRE(fDD)S@>Uvx+FCr&jXU7A*4OG_(FWf64q7z_D#gK#H3d*D3o-;8huzQvrNG0n zAidzY1SwW{@j)3fOoceD$pUnV9+Tlo(8y^eD495b&c^D^2WJe>?FyiivMNDE6m0(_ zo5~q{y{J4>-3Q5=1q$Sm3yE=982p#odQVk zfUbZ5b;`l#JUT;^fcnc$pz;q=MdKRK@8xy&g)|!>jUUJ^K+xm_%nOjR5L#86ZHBl# z12iE8l7W^gpcMW>5+?aF7ZlE*tlG<4IRoSkP_g(6+B(U2sR25^$Xf#3%5&NO_y5cF zkTL*Vu|Wyc{N;&jy$Y!61*I?Ws3o|-2H&sA@B(rg3Ut^5d=nUS5yj6J`E%l;n5iYK7rAog{fP%HdctC^)`R&Mo?ntWP;Q& ztkn}hfe9+jK&1(&+61k7$mnoUk$Ca?J|q(;fMy*%L22FqG)&ej+O!Ik?O>N|_3{dJ zgZQAy(q3LM4#=Re#EUsUA)W#cRDo|)fJ{z;EoeDVvJPY-c;_c%gXaN(Fe9dMRkRJE9T*&554`om%ChQqg%(^*E1Ip!LoCyB>;xm@HsX5fBq(Z8vyi5_DQf2&l&aD#O6Hk2RiV0AIEdqax4= zN+FhVkSGI>bb#wf&`mJ>E$pE54W0`F?{Ds9HShqXXBL$g?#m!C1WxH5h^E^8C`eHS zUj5(8%hCr*me8gexSZM-1xn!HateIr18DF8Jg5g6?^EdJod=Nz6;j|v8tAZE4V2bd zFYhW3NWp~ONDJ_2J`w>Rm;he`!trA6I*3a>K#ep|!2~);1)Kz%VKT@)+Mr&Li$SGQ z3S8P2oI*jt2-6FSLU3mpT&6I-IPn`2fC`{q4Y=sV)0%=h6Qywk>jFXsxIm>WMAZws zU4Q?-T!~x?qNJ}f(0(SQwdNp)p>Esr1(g$cSCW9nsR}_|RNjXm3et!NHK`D*Wp?ZY z?Pr1{a1{Ib+gLye4dXs-(3U0smSf=b!=mzH#vMrbfKvjfVBl|=4U+2?T~`3=(O%$h z0UvUXST)ltdc+l!)hPJW5|&f z9-R>q-LhU0pfpz?04g@YYw*G2$l!ap0u;JMwZYP$^NdU5LFKK5M`wVBN3W=}8z`B9 zSLA@tE0hgd3MwCA$31}xT2LhqnjDY-FL;1mcRa@pGr@+K&O9)_uT2|gtf5q6;Z z6;i5*hUbI&6`&q3>mihW1?yFiOgHbfd;x}+Eue-x?D9p6m!)8?k4gk+LBpY!pz|O= zM_@pMBf+DWHQ^+vb^v#2VaHs)n6mxvfAGO%kYoZUQPN9Ux(Di69^m$HH%AL2xHkkj zNetTc1WzV{%Lec$sl*GV+mKWQZFPZvG`>c|aqm;L-_ES(R@4 zi{<_yio(O`9>f(yg~!*eSi=K!Ke+{{Zi4Kc1C<{R9?0PV8$1CwBYji^Uc_KK+X&Q> zh0o)H(mQ0*_eDL(Ry_BUmnEXE_j?g11gd92{UdNH0FTJ?Hs*m+v1n5s=(vKK5Ky)+ z74+z2O$3RXn@wcWiGC(es2U!S`2G=X#1PD%S0`T$$!~ji6Gk_S7jV;|$|1X2|fcrO~?W?6q zpt=&2^gtyNhz%Ol1hWwx?oRNEW6)q>FKe6wsFY<ZJ^=@<~&f(<4q8#bOqPwDWLWmXapLZYd}@ELO1Ujh&-r9*8<7I zhFzXGfQnaG9|pSi1j&(*x*FVa=Xh})+TI9weH7e=1P@_>%h0`WnQm|h_VV_(f}98{ zAs52rUiyFv(B_ArJ24qcxxhQ!UUvWc{~vTNIm63F(0RO9HvRqoQXjoFiMBqKzl{%4 z-;sFVJg6i+_?itA^PL|+`&;>Yr-7?2QMIY;4E)<PeB+6}dC9=!#O9?b_Hf-Y|F zJnzwY&=KrL$IA~u_kBwqa8W$q0-6AKY&}pS;?ewHfxo$gk%6Hj#>NA5gXilx9-Tj4 zPY3mUz-uE7z`+GN0|F|Lg&~oeSaiLPn3~gFigJ-`o#6%i;2K(AD&= zk_Q|We{|QVRJgPrFA)HFgTEQHc(Wsh#pCq~2!9dirVe$8!?v&a?C<_Q>2%%G2heB+xC{obya6xzhnB6%8~*-(JrT9P!`~(Z zns7x~FT}r%^|TLSJq$#5DfG?3bjQXzu#ZYOUw zNDpr=NY6?BR>-M@tZ^VKJ4Mq$a;$+MxdZ&IQeg9Bqd;=qthasOo5N(mjY&|U4{FVF zfffPHg(gOcZeAgf_LI;PS2|fQCxJQ%ta~&; z^F2CQ7eKUDBD5~W)T)foIs>9r)}xa(G)aKr#fk6#{~u#z@q(_Cf+S(kxo9AB;r0Ed z1)yWmJbHNzQG{oMgd072d4*7fTNc0%TVZub1vM~02NJ}naJ^! z^0I){KnE#bxGexxm!N5o?idw?mz|&{b1&PHD=jx|Ik4@HIpB=ZOqv%Rb> zC^GNn|NQ^56C&ec zidsHZW804g>OgdZ3t^BqR^Nm)Gr@_~z@s-1Qm24xU-{Lbvm2nReL-ilIDp&nAURNB zD*!6EU)2;B03?+1C22y#>oVrdk(jfUbr{^b!IVp#xc``4ozeD+7F1IQF`M_!|w0lc38 zbTB90UB)kx8Np|d@T~g#|Me`;*(2c7cea7f9@z-99K-%1bo)VdA~bBlTTVD$Sg%Bi zV-1hqK*;_IP#nLIN0nPV=TKV_?%Tidhqs2Gqd~3`x zT?hE7ETC1?-NhUp-PRtKANgCRGB7ZJ&g9{50dJJ<2Hk7~S|wI2;n7_!;9+^L#1kZ4 zV(-!I4P7wkpy1IRt>IyLutdP{0Qg2_`1vi6#0xsi7d*FnaTB!9{Q8FBf!9|+%bh_h z03nA(gL;AzFY-?O{SVqM1#3ses93z7V0iL%4>rY)n2KLIf`+^!R{Z_{@-w9Ei54E& z2@DJ#DE$fkZLBJ;i258dHCf93!kHOTpR>6NF)(`cvNkUQ4Oc*GY|!!l;2a6=3&5wE z@`WH-6Fg)Q;L**S#sDh8zp*ATaIb&bYyc+IYYu>Lo|wejgic~J`YPcC}Nsx zk8Exc)LaKtb3gw>MF&7-Z?a1cta)g9~0IIo<|03e;_#7 zx%+2h35Roq$nFJ)uR5~1QBZROP|fW|GB+KYxd&0q1&8nXK%{VBf|~mv48^_HNapfm zGdCO4+;U`dSJ^|tp#as~*MAV{Vf!pB;UJ1>t~|22K~QrUP|clNbY?<4O=*%m$E4rVCkg4esTmIZ=G)SgcTg#)y2(h2I~g9e~b z`zDuJp>73rCmlSxd96N!5)`Ok(JQ(PYyhHfVvG{!pb6p^!pLrNgSx59AH}clKY@&d z^dW-5Mnd`~;9*w|k6zhBD1HS^iM-hD4Rsf&t@O?k;#VnDbLS(O`+Ew=uW05bO+gMr zQP9X+GP1eTpysafLvgP^lDUhqnHzx;4xs%8FSwD-wS$^#g=+5qkBD&a#%Athl)47A zF73r;FQjmIW&sI@Q@$wfU5{k$=gC;Yfg7bPWCw*qG_tvUP;;YD&5cJgcQ!V2U!&9s zVD~a3n`;I&_mvNdd-;*fb;f4y)okQ=1E;gqo=D+v&m0mCRjB6f|9}YJ*ORb>Lmx_8 z2|R2TjBIWj)Lbr9bMukRos7*~Ell_R_CRv49@N}f-YDT9k7TYjHgls;$`)|EEk-u? zni(VrWOM7F=I-)Bac?`4x!u^zeTx6@8Y;qcD@;@(}(DDK^lWG**0bKNlATa0Y(GN`#;sOIJ)nY$UhJQ=MW)r(TD zgJ&?MkKyIxznKLu5v&Lhxth6F2-i=M3npnP7mD3 z=GsBcwL&%5AIV&AY~~syW0X6a?UBOanJy$8PT8Zl_y2Q5IDGEF5)RHO$mW9MEgIR} zKB&1-sOGLmGIusMb8Qll%>~!T%*f`NLCt+-hvMFNBy*jynfn?goq^NCYCEKGxTgaN zhbmNa`H{?h-Hs(3W@DNgjBIWj)Lbr9bN4?(gzsc*<|fA>hXeRZo!_=d?$v{uJIfX& z9P*LOwZ>+y8cO(r>!HQS=3di=go75Ux$;QnK5oMj4pvFX?ggg@Z)9`ppyuwfL2>W- zr-*Rq#%69!0bU1f<94#yuO!a*6ExsOru1vuWiksYAlyl{t!g`;p8&+=L|@CS#hbjcjfl)Z8jmbM2AL&BkVKGD`Xd*PE9ukivlt zYAzS5x$hq$!a*3DxjUnf;|*L7RU@0bP7M+cv&>M!VLp<%yBo2D!;xrYbHU}AGP1d0 zP;<3V&GknzHyN9`;V9`BoR3eNBZb31Rfv0cnWDIt9m!m7Z06nzM|Ll`9x6sQcNx@N zFI024KR|@<<_0X`5EqGTE;xLpkkN?sOFX< znH!AFTw_dgcbg)G!#ib2I7p$ItBz#u?>a2*Z3;sU2XMbT8QI)vP;*xqp@aiFlDUhq znY#lee8KU?jcl$R)Lbi6bGP3^gs(R?bJH-*-E4vs4$qVz;c&_j#l87R=6ygZTU4tbY-o_)R2XOftjBIWj)Lbr9bM=wTos7*~UQGA?HbQc* z9@N}f`Y7S>{thA>tg)H98>M{)+FS5qF|xVW6d>WCg=+46By%5EV+n^g)q&1ZGaRGa!_-B z>7ck*9LZd5Z01^_)ED6VHW}I6V{(vi=t4F3_$@^EUarIv4r>CC!vS1xS|gjA2Q^m; z)!cFqtdA59Vo-BeX`_ULI+D4{*vwsxX>K>Nx%*@x;b4Vo?){sH za5!CoB^(~3M-E?b`fWxwcbg0(9A0UnxcB=FL^vES#}W>U{E*EBrw46hbK{`qR-u}^AIaQo zZ02gAq%&|k>as3UIIuy@r95 zZZfjD)1c8zhrQ89R>)goZ+Cj~=LN(VN$y{%2=3Ylh58(FBW=*7U zcqR@Bhf~TZ?)`oR5x$>`u!Mt1FmgD6%k^kvbNis?MxmO!9m(9;*vy@ak{-b6ml@ey zGpM<*lu+E;j%2PgHgmmE%1Ll}wps%z9PWuh!l4S)TyrFIUl(Et2Thc65}ba6kL+hI=S=3Z*?U1>Osw&rHB#^$1fw|%^I7zN#4lu2JUAqMmG1F zC?p)TP|YnzGWT%-mT=hUiEJ)7zj-5@TL(3Fmja4=^^wf&#%At5lz0QDv(IWs;h+XJ z*9+C$`mV2sV&YLxT~j9IQ~yy?+4_zNd4sgo6M|yAPaxjgiewgPMCv2F1PoNahw}Gglnb zy|36z9XUOK%ZFxUbGHdX!r_%PihJLmM}))S94z6`<$-K2 zIGt%Dn;Qo;w+hwV`AFtwV>7oIB|U)4^~*{~;lKtpmkZTgehU{K&I8-B> zyG{TS4zr|C!r}ipL^$lu#u5&nahpM+{ezy;Q%hzi;>M;1~u0U)m(lgb2n#U35N-o=1L=*>jyRW7WlA# z(Art>p1l2M5#bw+&D;ep$nFKl+hGNyaQMat35P6HbMukRWyWT%AEvq4$mY(2n)^!} zC4AM9%w3&{B^>^sgag>U!pP>jLCx(#HTU`%L^uRvGxwDPayWqdvAgAw!r>h+Bpjqr z&22|A_jd*s_nt%v2XH=4MmBdE)ZA5KDB)m^WbR^Y=H5ohZ{U2vjcl$R)Lbi6bDy6^ zgo8IWa}_Y%yIBq?9G>w&!r>J7(0q70n~r4e=X5OLV2tVBXk>Hypyo!Qn(L2b?rd!4 zw%H-a8+e?68QEMjsJX91P{NlT$y{e_=BA|XGi`e0;p+o0xt5Jq+{_#huvCnfNj`pIB(p=;`uu&=4FzXsWp4c_l-;nB@| z?=Z+=p!n()4FVg0SW|C=GL{8yJMWi4^6Muqh+kb$+{F4BY$Rk&{r^;iU%@w}f!5SV zqx31kZG?1Wb7w)#y#hXK9ppA}ndN;1;LQYHIGJqY~Tq~%#BBDbJbM44LxuO0p`iR4}*sJTbLhnvIG+2%utbY_pu z+zBXa2Eb$f%aP5!#SRIF5L9!Mk<5Lbge4qKptKpmWs5(uxlK@WpYWlCuQign{n*U? zj?$(9=eO??Na3IbHMa!S+-4+m&9Rv)i!zoa4%)jhAKBbXY>;qZK{Zz!Dc>bJ+iq)P;*^S&Gkkyw;r3h zx+r~0@EGKCF{Jb$1vU2y_zDVmzW99*kuTJ-nR^?hZw)@$svp_hLoASRNI^AsHIljK zcmCGb9{DP|dx301>{&|QUZxm&>Z8o=XC7|GmlZ06>n#2a`o&wfFq^ziAwAOq;)Jr`7SPwzvdv;R?8 z+^dVyrv!&@IF0`!=YB6Cs+h_7Aq_)0+ zM>lU3*kK_5_ll;04M4Q@%MFm@9K5&rvH+4_*`RLXLva(UKG;Y|n_L)dBxHXE`2Ijp zTR#-VTyVdp8rj@+{~%#F4|Log+^?+n_aee@cO)VV;pQ@9nyZX#ZWz>DJydi1k<3lT zX6{;jsp!w{4@U$jGyfCIO)cKv~bp#+MXSWoXp`1N==!mk>jBQQZ}DFY?W z!R4Jkvbjl6b3qp>K~I_moj+BLWNtp(Th{wMZt%pvF;KA-QGI=ryv6p=*VNpL0sTNXu+pigAYiP106)s%i1plI#vsG ziX&Jn=yYP1fS>Y1&JGBipPS)4}lIBL{;w!5)Z-@*9D0`0-cACs$LXy z5=Ad-pCBS2z-MN2y!h?+^Z!c?OdXFw;%k2W|Bn_%r$OR2nBtp3;%7it_@LT68zdfs zDc%ecfAa&w{A`eT4W@W7NSp^#+!`c42XsCks=dk}aUD!?Zjkt%Zy5G|_Wk+)r4Od~ zZIJjK&@J1j<{t)$=U|Gj28sXqf?@t-ka!QKcr{2|22(s4B);Y|hB@9KaT`o=W03e6 z(Dm=A?vw_J$6$&xgT&u_#4!K0&(HraYcRzxgT#3-#dm|m=X}60XE8`z2UENoB);c8 zhWcWVxDTdyG)Vjo=x|b0e>sE1b1=oVLE?YjVwev)kK$zyruc8~pZ{OVV2VEmiLU|O ztZ8F$EVjAHqQi!mtl%Gg2dS{#WO+T(_Uei69^Jl!xXm! ziEn#}p^rub=;4reTWT1c`rpj-mb_NW2YGd?iR+3{!j}NPO8d z409?$;%1oQi6HS~PchVcg2clx#SKB?&z@kYmjsEIVTv#UnxD-yUF??+6la!xYy9iHl*1 z3xdR#fvzJ$wfCpT&;KvYFvTB&#E*e)IY3o^5+ojmDZUXT{tR?C1FHI&An`Ix@kWq1 z8>VG0zu+xnBtZo@ok{nDNxlbg2df0#W_LZ*KT2i=SO!?`o|Q%2@?MX zI))e3{DUCzHcauAAaOBF@rfYuWj8SFtptgiVTvb$#E)IaQ11y655p8U1c^VphM`^( zBwmIo&Il4`!xVq%21@@|G0eFL5?8|%-w6`mb_GNILXfx{rg$ev{Muy<^@SkuG)(bG zkodPt80sBC;%%7Xnjmp8OmRVw__B)_=KOR8rGHHEhamA|7ckVH1c`@Xif;soKRb`1 zekMq~3{$)jB+iB@o(U44b`HawK#;f^rnn_YeA`(J^@<>IH%xI(kodJT80tT|fYLvv z_)U=bx6>Hv4}!$oFvVAb#KkbhCxXP6ox(7u5+rVhDV_)tKXwvBy(dUK3{%_?B>wCK zhI&bmcp0WRBS@SLQ~aefDE%MDFy|sjTn$rvCrEtTF%0z!LE>(h;+-JzYezBE7lOpo zFvTN5;@^&7sCNX3w_%EFg2crz#RWm)%MN3h^V12G{xQWLg2ay>!5vnIQ2pOz}pLI2)#TCP;kR0St2jLE>td;+7!sZTm6QD}uz`FvU4R;@9?JsQ>5) zO8=PRH$mdx_F||%2oi6@6kiDv7sC{v2ohhm2g967khmG9cp^yr*lrBLo$qWtifOAaOQK@s|#u^uH6soQoiFHB9lHAn|QGFw`#uiMwHncY?&PZO2ew z2og`j6psXnf7^zk-Vr3;hAFNI5*Nc17X*nf+lpb%PkT`M#}t1E581Q11>BFTfPn2Z=Laii?B9C#=CR=fCaG|1T9V#h-)3H>}1`e;y?6fGNHmBz|EP zhWhy+@dQlqc98gol^E*tLE;UV;^8210ZegwkobZX80M&h#0@aT`9b0bmSd>@Zu9g1 z%K%LA`ylZL%P`a*2ZKuieXMYNL&F^JRKyyVF`wMe~`EXrnoss z{K8@k_3|L`1Wa*ukobp180z0!|NQ^50aN@sNL&C@d_PEh!9omkmV?9%Fva^p;s+LB zs4oYJ2Q2vi|HWDNzyDuW%>Vx%c4Y+OK7w8sl@A`)jspB`m7r1T#y6n5#XLIKsDSPp z^XP@r-7P9R7(n-sKH%hUHUcT^?oj~^$?|Ut6z>R8@dsbB&^xx8js40 zJm@A%u%j|SqsS2+ogARqDVAq~3?97!9H1E=X^_Q`+f_X{K-VpUeC%=XCznSj;>u-> zZr%$|L3$z-JbDWxK>B8bybKKvk515C6+O^k@Bm#-A>q*-q2bY8AON~$Lc^nbi^>d; zhE5X|5F2t2a|tNCKx5UNJ}MF(oiQp3FSMqCd;<-E&K8veAWe`P(ppqbfH}}$ZGMp8 z(R@M}bW7<4usAf%8jpaY@-WD_3h*VA-O%fv!Gq6H&;uqaz=7D^0(CNI5ZfLql>rI_ zP=vlT1rJ_BE^kW!o!rXtLJFqnJFYD9Ypb!UNEWx_75yBRD5zh&_!^ESP zRc#9k1K7G=R_|!YWs@8)4zBz4pP&1Mmh0dDFH>RnZGn;o2mdyXZwHx5x!_Y5hj)VJ zSopW`a2$Ndu?sXW!oN*Kfb$~%_LCl+hdg>?1era0eFRxNdIK0+m^_*fFtsr7Z)4`) z#(D4o2j>a??FT?^7dVV@{~I_)n%_u(?o1Q_-RBFwpbv5#-*Fce15o+`IY|NJ`WNw_ z&;Z}Q+IpZ=2IM+)l{qQ`9?eH24ug`Kf=6#4$ThuzOf5{iARZ7AJot!XH^c)nlAO2r zw_oz;_2FU#T|WZ8Ueo|I_W&{Dg@DW7|1Z5^H>*H$Fe3k2CkpVl8G({6%Kcy<*E)di zhK7V93&fosV2>PkQ3(Jux^q-uw=Q`wwlI41dN8#x!oxVN(?>-L9?EH*A)utmqVgi) z-~a#o+g((o4nE-E-|nL#0SVb&4`$Fss~jG!m-zd@H?sD+FtHwYQ30(HU;u@Lg9qb@ z76y;r5EU8l1$Llx2nsy`@T$I-`G5aIT;0i{((R%m1CoAWyd82oBRE1px4a=;l-PQp zM9c$ZZKscl0{?ag#S-2%zQw*UV#F!1-UMJf?J8h=6rWk7lFgKrLap)*fvG?d@wb}&D zE0Dr8Mn&Mo^#72sfcmT(6d|n#_}kWii`5tv`wl6O<{ymwZBsy&b+$`z$HCwB9?g%LJs2;0^j7@!u>8*7_XSj_ zbb{{khTi80iWpE~Ch)>E4-{w6Vx{!}e;@c_r*0n=2T)S*@UXnd-~JP%UGo&EoDcBO zJnhkW4`z?zX;7+&@aVPS1|^y{P^sqGdBEe~4~`BNNss1VjQnkD85kH`I$R_fJ$l{# zfv!(H_`}`K&d+@ zRYZV_NsvVz-Owm)JOYa0!=9ZNUT*`L0#*L{yhrE1mn@*H-gy}oX)irNWnC|8?0RVA z^s*L(!wRw=E5QZX#~EPi6@&_&3Fh5_@UB9rb6^T_pCRkl7*PENDmOtVW`mMB$R#lU zNPvn3g%=!Vkn0V>mm_L`#K1*yhDR^!*>y1Yz%H|XaSM9THtZrl*u7#wU{@mS=2ZnR zNCVxb2(nud6kFZU8>=C;k&BALiyl*Sy9+=?X@y5GYao){U_p)-aZtO#my1b&qX%?# z@r!FKz=2_J|M&mPu0M#@2u67figolmg;^iW=V$Qf=Di4}LR36FEDzNx7uR_le8l3> z%_8X0?IQ@z{Q;n$0pF7JO&N& zsU{F_gD-Ie&%vS_{(@;b*iYGZfB(NUgBQ|>^29n(piIvLwQd3501vtV?CYlA|3MW= zC#coZ4XZU?$l3k<|9TIkq=%5G=2_sl-wSlxGbnSuSi2EYQV4+jVgag4Bs`jrC>(xq z#P;w1*PGD7yNrDEN~mm}3e-GMR^{N|<{|R!AR~XvbWqcCn}>MwLwS$ppCaX69?d_6 z%C$V2e+rgJf!HNn9?b{9@gs29qxk@M<_ydN-!uzi{S+<*sR7SUgZKx)eN7PSr&u}2 z3{kLr1Sr5jq6gqAe~Om~cr^c%ES=-gjL-#_2c;TNWqKGAQBV>kzWCd=fpQh*eRtg+ z8lZdu${;VKKqU+KE;!J71(1oLsu5HaFo3FYctt0HT+x9qC-r#wI!Aos_wLypXY|2&$1 z@|BB$j5_#$8Dv}n$X&3T)mc#v7a;_@KN<@Km+WFbDrO2T_oZ1P;UbVrYEv<_GdnA%td_ek2J*dg^sixd3UOJcqPTKn-+I ze+|?d1GP^eG;7pX(83$gjh?*z8$c~_Pzm2X1=7|4Uxare{ojB7ZQzmz)a&RDQBi0) zz~3qaG8Wq31EGlCR z0(851+&4&Zh{!1#hPOcu1J(Sm#XY)fR0=$L%LPD;1dsp6JvwiAbp8hMGCVAQ^Y?pLM$b{`dm7ct-vh*1HzjG=ei zgROK?33xpfVqZ77ksP8D@$xmOEb4@{_IjZ0$R0=otCv;26_$Yz?F5b&n*SiH$zXX1 zd^ITO8qHqTbKnauKxvWn@LEt>1hsVFNz4Uw|9n2AdWKfCy`sBYSQtDkFYvb>0tXSJ zM|U8HN4KW{sQCu&3U^L{^nyEkRA9YcaLR8y0?H7FLG33{?1EaD887w!!)^sX1zHSs z9MYWzr;_84-ZYF2G7HS^UIQNA@PL`u%c=o((!tU&k8UQ9ZZ8gx?jR)R^gx|61-o-V zbG(q75m_6gL9qq$b=i*}psufeKe&{EU3u%#%Nh$;5)4toWA^v|%kQ9@ULnNYzHxs~pjx{PBAR08J1g7_>tN?Xf!Vh>f zAHM*qDL#N|iVrWQMuXbzxeTBvoB>jS@JVSV$h9De1t259rNTteX5iiu6#r-LV~3gnqQ%<#_lO9V0&9H@%Q9{)?Ztm z;_poXF%CXr>5dWL0hJNmB?2s+B`PW1ECQes4CDh)3l!{DQ_w;%a4;WlQPBX61%Oib z@fH;W7`ydAi43Gq+XGgBsO=$&Kz;`)1`W-C3;-3EpkM^$iwz*pgL+{YP0D7(5O>Wbx=V4gA5!;L&Nq<Q!IJPjj z@Nf4t@Ps+_5i0|OPiGIfPIEQ9^qR}F`2dIK|3f~Vk3Bl)fP3t|peO>R3ZKp?;2|!b z&K4EW8dcwJ37_6%Mo-Hl{QZ+av2gG)i$|x4luvJt6o*T<>8pz%XMQVX_vwt0;&{E( zqjQSN0|t6I!hxDQouHHEJ6%*Hd^%H9 z6karZ0L26N)@sla;BFrk3!mNuMvrbt2zd0Gp8H0O)ll0yPrw}i^2NXZ|B)i2ff*w* z9E}_sAN;RpfJBTd|MrWnj3-?Aw;%AeJjCB_4O&;;3G0|oQ4xS7srk7e-ykI^U(E}U zF8kJZAg@51B+w+)JqMf=`L`8|ID9+C$lvmwiGg7sC`ouQ-fLmw-(GFh_#Em4X9HLM z?I&CqkMnQ;?`ipyzkMe&1A~v|d5_K-l?>m`6P^bjGJ7^2U|{(0-}Czo5IXq7-dFL2 z592Xc!vn9mJerSjc>X`&(|Hk;#0xwvfAIH8GJ+z#1)Rt{I=85BfcV{fKD~jAo|cFB z`@yx$!G|n9y|QUv`51gUWw>0rRac)EWbo5yl^dWu3rg#t5)f2tgXj}br(6Khy`p9FK@AlV zl^40t9hV%SV)6%AXAiX8;ZXq%`Gbo|^N;`kce8#xD+nH~6lgtAnhq*%!RkQ^#Gx&X zUeUVGd<>wmtyXi8J>5MJ$8`3n+yL=ATU0<39UjM9R9-MLFo3pRfs6sy9GxvHA3$o* zE1T{X6^J#U>*_&iVK?}^2Z-qFmVKZ)`z6oc|Nk9#fSJ{Q;LOLMI;wMu3Z#(=&GVhG z@q8NU|2x61ZwIg2<^jzZY+ej96x1Hk3^ zlhXJG5*%w(Kovcx%LJnN!w>KaLYut3dsKFS8Xg!;lV3s5_5^6O5u^gqG~sX20(C?> zSyW!wgO(e^J4`njkvmKQEFO)&AU&p|VD%xO7CW@kfOdThZ@-rF>2^^m@C1cmH&haq zf4W0dDqKK4FCS39$q|&AEHCpn7l2KRQ7P~^_?V?zL=seXK$4t{3aH`vVkc-ZGN|nV zo>pPxZvhX?9*1}t+$1~>8Po=|!Ncm1<~?!~1XSR_GbX6g0$YEGztsm^7=UUhP+Wp$ znm{t3aad3RB=JJp8+4^QXix5eQeIHP12tA&ih*=N!xGZ6a{=Xk&?M9<&>DDHvkp>L zz?*e9LZHzAjVMsF4o%5csFGtXDjZA<42+=RUQjf9G#&xP{$aQiCW9KQaC1x_yMxjd z+@?HKV;C@uLFn{E)oDV6PH^T!ZT!v%fO-woVL%E-4p24*g&8Ot3%sZS?egy}QIP;O zdcnqY!riJAk61cMG(HfUBDXRR>Z6O75Ug1S>@tl@C?Y0SQHP-@jmO z0_VLv2$in+_y5Z#@VG7_|AFVH&V!0v%<(TsbCiX@Wim(}lyz7@E90SArzEAD0n};+ z4Hj5{QpbyLpjGOiBn;}tNPyGnaTgV0#>l`^Cg4F`aCgQ7G{yuS`#SET;s7%W)T&@0 zPVPme#^3)hMWEdvH2*FI`KS4f0;pFb0qWIAfIOiA^>0Z$*f%#oYxKds=?0C>^alKY z&Fu02lt=5O8a@xpL&Y)t+hhbAe(ROK^7wzq!}3tMi-+a~kIuueSrElT9=$Arp!8q> zDucmYG{`V7D0m=qmd9OGKqW5NPY}5m2OGd~<^`cPtN;D~(hlkiNZ%4fqWGsQ5X<;A zqJJq=D(uni03J!x0EHc7+R~$!)qEPfxQ?+0Wh+p=zBB=By|wz^|F36)tO8?H`@-?s zCtNDYzumzoZ6!kk|I`B=;MO8+=-i{1_25*vt!!{xV<5I3Rr~w@_2e^XmU?n6(F}&pK@`D)+Qq&1? z3#b?bwe3O0Ae#CpxO%8J8jpZ{b=aeqHFz>Scsi_L!Sk*coW{dd{{DaY2s|*1NZ-9K zDjksUkpUIUjc*{1Ujr$fd!h7kNdFraKA@gHX82@y!Mp+S0ZRBl>O;`x#1?Syg31YS zB?4)XgMtX!2?fbWyyya-YvQ7!0BRzG`!u~JDjJ|bfi%M5f#>UsuobKhK31>?JYoR~ zKQt{;a4k^pH68)^8WeuQli=Z3VF?Srbv@wl6IcHG|K%a{@M}>~0JR#x<4ZM=AWQ&J zooiGgKy)vZKHj3z02@{5-2)zb!VE%HPlRVOP#ScS{H@?l$#F>Y3lVOP4@iTpsRnnVWa9j&_uEa z(pl);q5^gfqQ2e;)e35&fpQF}PXr1CkS&nGw=EE@2rYF`Egdc3-U_IS2M1&05m2at zqNrd3Jc^#0!=i}08yrO?ihuvVj0Z;%xEzNONa?*rMFSpRIiS#Jd;_+ibB#&>h}#RL zkGH6RLJk(tpn$`SuTpntSa-LmfZT_Y%C$X7*@21RBHi_k)Qxj z?)w*)B=>496*Dw86e{eAfrYlaiEBV%%gX^FtR|JIW8*TrPwc)!EI|jP@?D2%Nu$R zl=NWD7syZ($bbY;BNH+NnWF;nl_97DbQ#<+mIrMHMRbfieIP?*;5xSTKxq)jgb0sr z4+Bt2L0fv;dJ?oIG>{qOW)1%Bo^VfrSIvQEzQIS2RDh~pkcls~L9LT+7nO*Yil8;2 zizNR3e`$*rosjh#9?;29fx}4Yz1Kx$1*AQH3lzzXZ@>f7oogV|z`YO}8rub+dLGpB z#fYb`QCCU$#3V!`mzYYEUqeS*h-@a#6Y9|c+CaLWTU%cTrf9pT{7 zU0~s1d5gc<2_(=NqLSco@DX#jh!|)X5FEhkK)Z;+0esv=r2w3Zj=QK-fEmcCq5v`U z2kIzwg9*_1eD@Sc3kNhop8*O#&;UOqEwn(|K!}k)MRT-~KTrebr4dM1H`K4-h8QTJ zgN%4_0JPo&Hu49GB2Xy;?GoOD<%?cK8yHQ=Zm5!DEh-+2(2+mz{6OOoP}CfTii3yp zh!KCGkPj~NI>r9}f5`$(7-;$195ncfJ%1l}QON)YY;TQ90VLj$I}b~2VDS#}f9nDM zp0l7>L(Ag)y^!_8G7cWyCAT;{TEFqP%mJzEwf%Gpl*RTyTbj@wLAS{*P~Je#@ZUgr zqmCIg8)m`3y^JyK;4u!+LKX+m_>lxC%P4@B=s1ApnJhr6GC;BgAUg&4cRgcp;GcBN zp<@eVr9-#LE&gqG4&RP5^0)MZ3i582Tj12S0JMi0oVvi{TCE341VEV$Jai134D1H= zgStVhL%LlK3V2+60V)u{>ofnJU zT0l!e!0c{Vc>>z;@Zu_}Q_xEiUua3N=coA*|$W7oh2wFh} z%Apc3K`S5({~LaLnFJnPX4P$mc*&!eHAx#*m!7Bvrz=B|zyDvZfo*(%cAyaHtJg*4 z2Bds>2a52L30;KLE$IPTW?ld)Jvw7l zDnO2cI0RO?z&rr0bh;J(A=e-UC_H+TlK0b&b}3M3#vwn&!F0@(uYId(e)fPxI77orF>u5;Jv3SwQ3Fcnf%y3t08>7Vsh+7#lPJ0cLl% zsKDl0LDMN7y{ugvpjAysllq_n2y`4P1Bd}0tbcK>8j_*GV@%-Dm0rj+EO=XtN9SeG zkVu8$e^Oj_xVoVIIfMgPxsd zJUYL7cHZ^qyaoz+um!L+hTU_(V2S1WoGCfewa1`s+TOYoK-47Vxl* zPv;WwN)eY1AC-Dg2?p+|cLxf9rtu*eK9U2p&O`td{N0AI#Q`3@wzce_z_3vPwL`%r ztiX#`Yao7?;NQm3a-c*DG;~l8N)({QD4>J|?*Df~7h!ZmW@}#l1x0l)t1j3)&|qE< zc-$1!EaL!a0uNY%S9AW_12z8`XtE1B<_B&&^ne=_hL`xa#i-PSRy{&&+yn7sH>AP_ ztwaG;%&&Do>k2^W(DVNxkIws^ofkYiKl*fD>OAbxc@7k;U@N;JhJxE2rW~MX3UKi0 zjpG`E*V^n+fsE2@0gw8C*6@HzmW~*eI?(zbP?6))y#zd;>jRxy z_wO#bEZ_*LwfLL6*%=u8yF)H>xbkm{5_fEVEbrO;Ta3Tu4I3yGOaYG@LY85qsDOhN zyndjY>Hh^#ED3;CnZ~g|)-=?$94Ju*MH^`J2^0e$cYx+v!S3tc0xpJM?f^wwcMsTL zkJghV=lHipiZ?%&_h|ktS$fc;mvs*-D1m??bPCu(?o7C?fU zU7#gzpkM;$4bbWeSocKW1p~Mmf*J;1gbH2CX?c;qe=;~P%>g&vKzR!^@(oI}pcLuR zX>u5}f(jJmKE3XYpfn4LdSA;E{QcKJYqPqiK+?&<=d7NcK2`#rogr2d-Mn&Z1Q~pL zWvqOAQ>-{zPnPO{Tm~9G^X%lY^6ZSU;sC{S9Y_>3B35T0h@%;_&%L92LsS<9GUxu^${8Nk8Njhq7>Z%5<+(0xFs-od!yu=iy5NO+ zDMYWr%RX?Igq01Zsk;Z7YoU1u68E6IQ;cRGJYnH2FFHUgZF*UkF(Ui}s@$*?^NW{3 z+#~@i9l&|>9(dZqMWqf@OkD(LA86?h?pF1H6ByW}7jB^Q{XmTlP?HtZA^_F5;3Wj0 zCIM1AEz=m$7Ek~M8z}jKmaHPN4Pb2Ka)FBxsa#k9Dm6NZE*D;yf-Hsf+CUBjSq#dO z;KbV5qoM&at{YlbbWTwLIRLWY^m4r`XrD`OC8I~@9;muKP=DK;0JVk~KnCHB0#?wP zq+Zj*1)x+8TI2*;$I=OE+(A+|Xiv7-aZu_8joNhksDQ^3EI@4mutPwzU{D8w9Q-m5 z)OPIUEe4xML`vUv3}iM&O5Y61Fx{+Y)Ihxk=oCQj9>@Z-Uemo`VfeJfCPPpN<}w^> zQE>pp4ya`b^1Vmn5l|EHFsR4^^`1agE@%<4Pp62=i;tiq-N1ddqAl&j%wSHmZ+hHqbjOmyk!0S5+pSiIO75AJ?#f>72F zY6;ul|1bN$Kv$7LJ7Xy81$tXl3P5oJZhzN-YU0K>0-%WRT%!V7X#{G2gJ@{`8(eRJ z7I=f=1C)zEi`1DI7%H@>thTmR` zc>F)?59&WV^6z@U;K)DefD7j_4^Z<|ZN!74}@tZnE6J?X*I@-TmE z87QT9&H+aUsB#4LWk8iBsJ8!d=~&%<+3jvgW+AS>uvpk>V-6;QheG)af1#S*IJSc}RG*lIISBJgND0!kZ) z9a_Hew}8jzj$?MzJy547Cuu>gKaR9BrC0RVTm}YE?1P#fpmrxD5T`(v`*uQ3K|1V>~i_Q?)6*^wqdZ0weqnG#manQ&HXmN3;i;BWw!vh|j2VcKKQjNSGsMkg1 z0c5=87bx#Fz5%5!(Ed75wgY8uFb!In#{gQ_sRKFzBnYIkmscHpZaQdLtLU8y(2N0S zN}?0Ao;B70X{#M%T|20@{sKy;ssNqg;;;a;U>h9PQ@~5iK~Yi# z%HZ7`9-Uksy#*W|y;U4YiFOMti-8u|f&v~ilmp%>%z@bq1c^YF7#?>~0nauZ1Dy!+ z;w0!Owr&>{$kIgaL;wGS*DXSq>2^A59Cy?K6|4N)SYrh_7&=^3+(CsKDBQaP1Uf;n z8lvJ3>Zd_01;;69?=Oh)q8qeo7_=G(Zk|9lYuJ3y$uofltp`erU}kxAIvRNNimnEq zhYm7SG@%R>HQ?|7HO_lk*B65Xz;OlI3;4kt5?30aX&#W?evmw9D1QqB149cVsEWlJ zS0FdTQ!8k-mDp!cG(eAkfI9SLKBzkA<&6q}#1+JY;9TJT<;VY*9iT$GmsJ{U=b_RX z-1dPR^PMazFZ@A=`GIon#K+$<3nbUw0m>er zDL4yIPZ~DZ*!)AJG#<1*;t*(=KBx_9d7@Ms8zG?46zl)r!ezvM@n7>1Uzi1ACX|M!6Wh{ONjN#R~zDUcT}50(alJO%X~ zv|QtOq00psjS*-$P$Ikolwr`k3Cout&Cn3>g!YpJUV~>DLF-dNX%N&l@aSdbwuFVk zMsW0l=Kr(dp>P*eMuAkm5Qg}(=Fgx1FVzwLMDyP?oc=3G@aW~WI|$l8aDwuq4Bpb3+{4bxXU9` z!7+5`_n-eSeGx8)L=ea!93I^c5}<`U{2tv79B|tO4jUeL{T-qVP9pr<+oECs%JJa# za6M$dCuk4_RAqt(f_m40hYLUr-rhZssUyVdrg@5xW(TM=19hSi>$ybuTfc#JR)U5w zTTk-0Tm*9<{cg~qW6h7`J(_=s@VBmJW?(S9WO)0v3}o)AH;fU~Q~>u%I>9rgAcH-+ z3mrTxKk@gbfa>b*0tb)o3JcJAW6eiE26u+2IDq<&pg|bWq(%UEl|^TaN=CPcHMsNu z6+~sA(=@>a5o`be)FkhYw1C)bd5yn0A8Zf_>37ek(SUcA_p;xN9BbU z+$_*OAy7pDN;Ah>z!R$=E+{78TR}mK#Sl~U&^eCdkS-5c@o~s-6PVo%9oT6-3EE2v znhT!-?i=xM4`fU`c!&ekj0CsIx~D*zb!el`pphSNTh8)R2^T131iV}bDz#y?GHAdH zvcjN7MF3R3OT4g=gty^K&VnKn>~GM{D#R)Q$cjBsb^D?gbj&C?AmJrCbaPpEh)PDc z4;Kr#@Q00{cJipa@PcdUh90kGd4j(+4wUpjTVBD3N^pET$XH?ucCiO&HVHZa3yLJm z3;aEI{{H`etOYzm2;L6@PM(cNK&ch7-FF%2^i8m{z(qZ1ld3Mb9nk_A$ptStfXs}6 z0~&c1Gjd>qW~2~n51>Q#-93=mhHlu7IdB6l1Tv}x>MMamMj7e^@SLXr=;)}{xuApr z8~=qm0n{OfIRP}p3T7ia0i*!g2_QwFYyqL6qrKfRDi$7=H(`;y2Qhb7221T*tu8_=Mq7vZ&%dk$}JfLG8 zI6OLSR9;lb^?PV5P8*iE7C@A(1ZkrX6HFdLg+V zq!2mxgA{{00T3E7?h7`!dk=Wp%LA7CBVK~{NI~~IgMtE7m~nuLNoel36NRS@NbZLe zzAT`vl{%oD{GtbR{w_FYVaf0bSTlSiTnloB&xU4r&=?zZNfJ22M_|kFw+UtVt)OFR z!Ontbctb219<&!19Ja{4cjVj#Qh=P>z@6uA=*VaH6!4@FC>vFPGL!)*d4i{fL3N4| z)CuqmUjjZm&A`L*A|zi%yc7WqS$BhGyTK(dyk!p>>VI)a7#{Zgt)Kq=|Nr_F$b3-p z@8$r7Jt)^h;)6%!#TL+c#9$8}Z&3ja0l>TkT1^CIBd0r%0>sJ(=wh92h(?gHAWbj* zKrzyJ=%vhmc2VbXP;rdX7%Glo&WkDD;6_X@g!%@d>LFAGgnIbt&;OS(u#KS5 z77L=i0&agomLR^-0QCtKKAu1N2 zxkS*Mp5@IF{$rp`WT0jm^wOv!w67MF9YN;VZ#F*(2@#ir3`2y z3AFqO)cypi2Or}m@M8Jz@8AQ1Bwn8eiAH#IcYuq?ZqSl4_!0>4zH)HTfhRD*sW-!; zdlp1#31~m3iOT=WAQQkPCkLqHH1M!IR3dZ?;uP@iG{`DI(7Fo;4@5EtkH3Qk32zI) zlX=MrkXaztz{>mt$ zJAy6X=mhobA;v&P#JfX4UV$zA0JqvfvCHrRG&lenHj}^z*%zT7{``L#@DFAEhKtGq z$oSGZ$l?u9CIU5OLHuXmR_h|mj&)>!X;x+%0;BWZ`x~sJLmlS`?8wg97 zzdaLF=QjTm3P81Qe8Gyn^L z4x==@^cr*=pNfM=Zywv(kZNSU8U`r6egAy^I)_aT!#|ssx4*03Ipn3w_BL?lJ0kz9IK*t&G{qrB3 zvNb@Xa6yoQ3o=38y#`z?dNdvZ#S5tG!wE_n9v;1pj39G7K;aE>C6CIBP-LHYc;NQQ z9jHR^3MsIgy20a-prx&7KJfrmtQ;>^fptJK2&gmyCDsa%3ph}G^7%KBJ~;;2BL*&N zK}iheL#Q~os3k@mlt*6NJql?Gfz~-O^S4}r#vV8wcCx6v*bA5M1f2xd4c!<6YR4~v zOMx?&<-rn3aG3-Oe$eP3vK!!O9Au^^=*kOls==EWUMND{Tx02Mso8W>zq zfy*rkl)zl}3mTX&Va*IkOtYxGI1P0+N(6$<0iV_Z@wte~i^Xtt;1&gFvp&RXm@~k& zH>_Agv0VdZd&>d-7SIqkG-@!S43r#Rbb)SQfdmJr==rtwA6u(1K>r2??M+w*}-dImi+wP|gI$1Gs(yO@ncP)Fb!xLqIE4dQGBH=Ef{Q ztAM&$zJprSppq5b3_@z@`L-Sa&5H#vgJ!`%3S7Z$BFBRVI6%`}pthcGH_Jzmc2I#0 z(+;YfKx`E4AO)z}LCQe0rXXWL(`z6LK+|gw@g?AKPG8Hz{H>~>;!s|@_mS^C(2GB}<*pkQYkb@kcl}lh_x=Rjo zc=XyXSqGXb0e9;`hYNIqmav7WaPV)N0`9zafDVso_zsOiP&zFKk26C0#Gt|yw2}{0 zU`Bwt7vM&2cg!gPQ2z&FP0cw0P>-w?GCnVIihrBbx5JG5t$LsyC1^TY33P5hI1Pf+ z7N`&I25pjqGb6ME45|`Ap$iIi&|o!~joc&$DL`(LgA{>M2uK{{HZZ>v+6M5V`H z1`A|7U>fL7093cELN4l{ZUI%xVEd8Jl|yz5NCC22AWb9KhzImc#_kvu0}soarN*F= zz5tZR!4(0h#{lhuUuTEMX9+K?=y>_%54hb8DnBs_anP!W&V!(06qGSu&jxkQLC5w$ zOBPJ^pnVXaP=dsq$U#uq_2N9}iUM#jbb_|Xfa3*vR0*g^MG7~Q%iv|#^WYl5YP&(x zSe6$`%|HPRuKchx@P4sj^V~*A4-Tv6aCw4&I7V@bOFbwGUR(xU^aJrbv@QmF3B3vO zVl`A9v>S(`+y~9afO>7P$OAV<48B0~QwOAq#;66Ge~FYjfj6JD9w_DX=yn7j>@I=J z-B581e?t5NuO0Ch@vEWg$na0XXQ+Q#4wMpEx95VcM_X;vHF!**}_tpFa zs_j74mFK}<_MQh{*@H4Ki0{LA+2i7Gzg`hzU&~kg&EG&POFBzb3Vb^EfGaDIOF?Bl z=%ld<=WdqC9?1uM7$1OB-&4>fF5q|u#~*BZ8dN}m3-?Y?27xzad{iV}1har92tX5| ztp{rOK}BN)sCp@Q$pjj90QbqDOS?UKeT2cC4Ui*WKK}RrKd3qdaeP5jb&!&+L?r=h zaCm@LI-l_Dya+1%K!E`YeFu=2L4gjM835PMpy_p=P9K#3U(0v=z4oBKPcvv+hEL}f zu-~1#SvJGG3pryH?Cp1`bsDU}51MlQ4XRJDhXZKc*^9@F@M4j_L|x+V@b%MNRkLJkRoCq1q57TAOBh3I~{3}jTV?5}Xpv=d}GD9Cc?m>?(uK@JCvb}77gIvs3EPj?`PPq(Cp<+b8Uko^guG?xKd zz646|n6U;LLk8LA)2;FuwieE}^Qx=ix0nAxW8a;S{RN;_9jL|uwXq;$1E`(C7krlB z+|CZ67$8*UgFpXYvOpK2AjW5UTT~K2NfkUlmICT}H@*Q6vv#h5472t^>En?35m-Y4 zw5%7z22~ZH2`o_K>J=wwYLNH(M|K8}UeOs=pjkfXP=05R3S?-%2fC0OdRlMy6!7dD zD2W(=no+$b!XC~4Sor&@L1s1o|CbclPFt~KH&Zz^Prg?zB z)f}`ppqtsJlfk36g2SV?m;*Eh2i@H#!wJglxeSKj!DA8rcb;RcD~!^szk6-wV1Q!>2op z!>3!$r&l#;F&~4kj(xWxl-;jGmU4>%Blp5|r^k zE%pRZX`kWOt8>t$+cc{d6k^{>IsH0C4!-;cD$c+sjfSXjyqI_K2gvCzpxgs$$G*G| z&XcTZA#9NQbwK03AcsQ6=RsyGyoj6w%8Q^WbkH>cAir4np!gItz}&qByuYNoM#Tl} zWw=K{XT5>e@%5@UF5+W&=?Y5HozNMr&JdLX{%v!>vnwsP`CFygK%-EsneW&^t6rR- z5#fZ02+)K*Xju(tUW4Jqf_vblGYW<$LG5zL#AJ+00;qpi0Gf&fjoQ4fhh19Z*zGBB z@TEkDk4gZ9DbV4g5(r^(boi(QftVdWD#4&3*j`Y36+Eg5S~UfVcCfV|#tTiTwV)Co z)H?R)4FnGvRCxS92pWb2J0Jt(08spNx`09ivN+iXG|uxD6dK)L96sGbKE1Lz3qi4d zi@)_Js59A#Sae+hnrsCb@6#L1=xO;06ytkTKqi99ssvD}mEqH?a^Iy}x1t&p<8Mnj zeL8vWzvKZQ=c%Fss%|)5tU3SVe>d0(5ThY$9YMzpgU+W2f<=3c3T#@Y1avwqsJE6h z3l!}&@RPqwK&Qh7FoFyNRiuc~i|!au-3av|^g1h_UfD?t_!wS#fTFwkw-JB;Z%|(y zx=Z1hqXrx4iW8(>ihX4P;;+-xkJ|4Zi9n(Q4 z(}S1EUG)MLVW1(A-WU}hP%aU8VaN$to&-6vjelE+ibl&N{+8{aI;dB4u`K9Z@QeJd zVPJ=Nz(yw+3~#?y1XX$9c0{im2PFA`&zc7fvh|8)f_0v*Ed*Ip04k@zNIExBs0|e;21r5+eB%tcI z-}KjiP``IC=%{@c6&Fye!=sls0IUZTZoG3nLE#44e9-Ho;sL5_1z!AQ$F|0>1ynwG z^s;8lfWqw%e=8GsOvDjcsH*HWO`0o*L@_2vL2{Q{5PVDK6J6`(s-3PHtE z0jQt?tLbJ0`4&_pqXw9Z3I`;>1YRNnY^g^tYrs6z00V37gv`TFcwuCRHNb9jL#vog zhhbGrCv@Vemp85$v=)}5+egKv6SRR8a=<8fWKtOHJ#Z_;1$0URD2!m6M`6vZ7ja)8 z!EG04x~5O&M&#z~9>nN`auV4ipq%b&#L{S9|cA6`(81AVIaSfodIa(Zc~U88TM~3m#!xEWra^@BnICg7ktfErC>Vpc)cf#K9P# z$qDf88l;tr{8J&`2hU-=2%HHne!*w*f|5UCiM_p(;QEc$c+*&(RmalpvvjxR*;hJ9`K$C&?1l)9&qC= z@IPqBWizNogj{qFR%HFL1GR`jgODD* ztoOY^^%2DI&4LiNz>CP4Aj84C<$787ASsyuS7HWM0$Shb47X#^8<-t4z;?Wts0*^n zqnGstLQyVUQ87f(ohyI-zbr@W<3MSTSAc3WaC>|fsKML#2HeQ+Tmx?UfTrL;Ei}+k z9iWm5v~CTtUXAfL=royJ2GA;dkSsV0_OgntfcO%U30WB!7+y#*g4(hz;8r>Gm>>R@ zha9NK?gtovPXh)WyUzh~N++a8W_TO4#{gvheo)GE+yOH2wIQf628w#m=7Sud&QgSD zZxkbFxl8ADPtZBb5X(S07F5jmbe;q?0Uf{_Le_!C9y(({=d?f?Z9d(cpzaO07;C-F z-&fDfz~I{(zyxZQRCrqc;&10>W?%p_(m_3d&KgiX16ls>)yu*L^|<*GWRHXPxV%tg zfOs5IYJjRI$S@7G^zHHH{8 zX9mSt+J8{&LUw3?j|l5zQF&oF4N_WyOK1m=-VjFc;W7oFiW1z)@bIwwRPGCED1yCg z`H8<>4bxs9OJ;C+3R?aHD((bc{P+j44XmphG!oq%qT=yV4AhnfPn&hl0WSvh=w;P) zg60SKS>vF3tsB&^f$XCJ57vX4d&Lvr&Ak%P(lYS$8z{73LnWZLDEQt`HLE66`+2M$ID0H-aGj0Xn2_Ybby7~92JP? zz_-$Z2M6K7<+Ev;r04gxR zw|V^L@88PAz;KL(Pr>ly>mX2%#RD|70uED*2vYt7i6C&>x;KCW)ILdo+-?Nwi*KdkP~;?k$?aHzkCfEvITEuLFDZ~J0jBQoE}i>0_SLGR}S24 zbpSaT6cDha`g*cQFYA9>sEMF-3JP6VItA_i2m+f_11cLp=evS0p8`)4cSC|45VF z2AKwRzX50+s0DcaUyO>wOUQP_8!wAMwR|t@CmWQ&0B3)&IiRx56^l9GF%fWD1s9uB zz^7-t{0mw!(svBh1?Y`r0*!Hl!o|b#cRBcquy%QnFVNB+A2jX#n}d<|{``Ps6G-BM z-i!e%{yjRcdvu-#RqBwKfm#nbRo$bPRTZCSD!M>{f)TUeGy=}p(0m8JOW33HgGcAD z*AsSu&WL)s8Fc+qFY7UDq_9F1aG4KCDP2LFcL@gVj6|Nj@E zDxkL73qJ_u4xt<%lqG~Rf>7EJN(Dm6LMXA*fBwI8{PzDp@_B15Dh{CJ2X4RZfQ+Yt zHaml+R3N)E*Fbh@cDJZ_fG4M6_eKiyw`PIVclW3SfbwDM$r3^2odhj=K%<+TkcIT1 z6bfFp+$(ya71VbJZLN}hDg|n?gX)pqEs&-2oh2#)FY10k2I;{&su0`z_(4s&URD87 zkR}$D7tgoAx&okUKtM?e;S~Os>)=~c0>!@_Qs8gh$-%(TE%5yi=rF@lO^@yX&@JKu z9^Ig=Y!w_nz0QoDmKXT@AA#B#puT!%fWR>pIR=mJ00EEg2##)p&hH1`F?)b^Bpl`h zjmC)>H$P|h>^#x=(-C~Zv*YE5j+_@=I(Uq`1^yrE6aZPs04hx&VHPCFEa3G{0F%vDi!28=(LC7|Cdui-syzw)duAb@cw~rVNd}Is{i=66^Vj# zL+5#q?>GOSbKu|h%|r2=M=y^#D0PAF)B`sV1YUdu8Qcxo+ThU}0p5QO9%JdP08j6L zi~}8h0B-#-!Y8+3ZU>D4fhK)GMHo1mEx+^kB>n&Yzgq%yfX(-t9?cKgJs3aoZ>th< z03Tk~$;QC2AL7aDE$lA*+r5k&A*Y7A@NW+S-6(X+mGPo0|Mru$rsfSd`c zNkM~W9^K-gumV+j{M(|SVRa4^R;T&5-S$vC?a|942TGLSVh1!j1satRcySoiIPZqu z4F(!fhmH-vhIT;)fbJO-KnERKy%}5CxATKpY9ac@!Ml7d;^N=YU#M-GZRw2t7IjIJyN}FY&j10JTv- zrz&+vg6|G*`^(0_&@Gyk2Aaw$P-wlx-#QPQ3L4&rEKtehIqJAu##Tr`6r+*aj&S)a**dh?O@Q5F*hh#cTa&F zi~^q5>W1z|2i>FO(JN{+9im(VH0lC62!a8WF2I)|IDl@fnFf*uT|o{SzXpwazgV~z zR7``{Y=O@41b4PUePxh!uu&WEaakY}L8A`n!#4rV5T8PZZzi=PhHpSo(CMh*(aSn# zGPKMo-hdQEpwUQ=Uf%kjpkkg!1o=?=>0x4}fVS8v;6CQwi^evF% z#(VcbE=1}z4Fn6rcZtir2i1_d44^a*x<(0PFsMfi8hrc!s%*PKr%{5AYXfs2`=&sW z3?LVGPJtfAz-k07eL+2T&`uvv-;3jgPA4Q-BtSYq6HTC2KlqqJaI>UW^!GAQ0D=nr zIS_|}`fV@1cEGg37NUZO5EVRnSy$DAY6(zZ3bLUCY!ArMVADYp+b_!hfO^KDZQ9@^ z$e`6ipcDa0V#iy+=cz&BzeNRf{uGQ2I;RE31|8D^X7`FlfgA|hU=7~F(hVLu1Re6> z0p9Ms2W%YD)Y|#C(BSNDQ2{Fh-AXs;8LN8zW2g2u`xgS9|qq3QHxI7kb${s+}MFLK); zSq9vP=kVx-9h(4(U(ri*L3tFG<2gam0a~L2ia=1rDo+MUgIcb~UBKgU3@_g8fMj9F zLAft2z@0bHnK7Ux$c$hYO@XBP)=Quy0LquJX{MJ>;1#gOM}ZP97+pz~|0@&LM#&ddLxVEh-V9MBPbR zqKAxYfD&CVYyMJDq=E)uQ=33zq%YPzLd^sVf+{dj$^`BFHHYid1?vNu z`JxG0J3tq1Ax_D*{sBtIAR9q74d`eBkU7v(ve#@yNjja->8;Kl70|R6X#PkKl+E8lQDh`2g7;F%`5}xA6_Q?bo>me7p>3a28w%K#w8d-xeSaN^Py)Yzz#r9l`BO zK;uZ@EewtzRibc0&m4jewcUW}fWH|rHWz(cPQ0>@ay!L9CYiO%~6Uo(4HUM`yZ@(TD~ zQs~G+FKa$55IVv0vmu~OvoR_Xpa!GDi$gUiArIPE1acF|bspeMn-~kuv{K+q+r0&{ z(yQ~7MX#+prWv>@1dW@(Hvhp|6)%c6LShI!T#x`W`Sms=4{~^PM}WE(5}*|s zkgmmt`Vf!aVn&b70)b;JQeY2)yA>Rr=MKJP293iugPLvp+eEmVpRsqI@BHYv15}kc zUVh-hd8k9g8q%o%O@xA@tMLdZ77v38GH}zdmo-`!nw}s-j^GkYi4hcw+4o@AYp<8l6{(~II0U30{nnVKDV@)C(p-BYP`-J+k06B^9_q&5CeJsfY z)CB3~=sXWgDo4THa1rk2=j@IsJx~|UQ%)Ts%#g$awN4Q=%Q-Q6THdJlM9*&MsWAy= z1)kLSG8fb==-dK6BL*~oqy-Cjv}_4Vg4&e?0{&DaIN+g45SAT72qeKLYawBckpw&U zz?|g>cNVCu22E>%hFm2;!!Zgkrc@AcmNCRx;*gwyk`4kv!zPf41@KMp&>kT?dw4+I zmH}!D2f&MporWi0yMuC+gGYCOfk(F#xZ??`4?(F5Tp#hTzX|GggUeCI&!7=Uju%>> zBMrMjhmSx9i9o$xkL~~m56g=+8(uyHk2poW_Gtdi%-@y+Qr!GYvV`9Qyd5p(*Z==7 z_komvj(_O%QAseo1R8n{QStETWeM`=_BjR`Sw03{7!STc7UC8j70^-Q(4}V{j5k0v z9LJ0Kpvhy%vPsY#x3KeSK$*ev6n}3R*dF+~`9(8c3!oQVFJuHk71|3?2vxV^&;OU6 zKaoy}OY!LDQT+jme9-+f6)0?w===3Pc%RQ z4PLMVW<`LKO9E*Bs)0xI5evv>3eQE5qz_(s0=_}Q0n}gtPvC%))QjiPBa*?*YKhm& z;C2@CgP0y3-JBqUHC|7Ia6t#{yl(aAWj&_~50S&?U?GyJ01lB$+y49qAEOKl3NVcp z9@?Oitocm=C_FMi;gJFIeT7H22j~cf(j1R&&@vMSkS`$(CipOSFRRv4P`e7&gBJuf zOnX_mp+mlqVF5nSg08V4|Fl2ulBz=xK{Z1=O~Gu}l!21XxsF z{I~(J4Ri=Zi8{ESW_lAQ1nFOciVyIFaW^Q5f|F7&>u+e-I)EJR0Sa40N_+8m%b)+? zvo~QbgV1R44PH!!n*PB>Rr3RRQ0#bkSe_^a-?#!xzo0G15}@qe4Qk?oI)mV$Bk)vd zuV~*tQ2G;5dBHj#?mN<&Xi1f4OX=CLvXl%v6yS@Z9Dz`@@PKE9|MsnW1 z2&zYVMf?APoGGI6f^8ne6W}ZkPDCCaognYe4MKQ7zysO);LCV8UYvm*Ya8Kl+yS(V z26Q6ajRhcMLDqme4YOpxzMl-L!$FY%4u5zK5Vh(9rDjkj0rhSmop{)ZXCA$*e7ix? zpm+my;-x_OQFA3Et-p_VQ2_w=U_^17-)v>K9qiL0M?OwHwQg3LK!B5b*FB zs5BPv=ym|FZw6nF13tYk08|i2cr+hT0Ij*)ArA{K*1acSwL-8IIAHc{`1AjzJ0cU2 z!NZ2lK*`{L*tEa zzzaY-*Fd&@^g?OS{SBZ@k92=|EBL~VZVwA^BdvQ5c-|AVc&PaqcwQZpH9%L7b;hU! zbel**=66|CUL+PmJTAb$jbQ~Ne~TDMHEbnFH{^;D@Ngiw4u#BTdNlr8(8kEX-wYZ6 z1f}EzP{kers&oTDg<=NssZpSbXmAp72ipWYh6L1n>vcH@ZgmKNS`iVj2^7$fF=(a% zRL4SQi=e)4JOT;~NONQs*f3DF4LWCc7HBKab`KW*?H54}U+{n(=vMV6&@qew93G4p zS{V4ZpY*Ui&EK33YAk>*S@)3u9kAll9U{Tf8KUCR%_0HP3vsTD3V1}*r2sW>z!&B8 zvfhP8?TafjAo&+uVithL2qD^eRJub{Kx?r$UMwv5|G%3x+E2TH-0sTF{y zRAA@6f{)q(g(1faMX;4VD&Te5VADWHIzhGwfLNfQgs2Q(_~ZZU-AGNDuN{!$2(pX~ zT!@0kc0rlB6I7Uj#*U#J(8wqkc&Y@H0YHVSC@4=~Sqv$?z)d&{kTr`E@1^x9=)uurQw;u;V3LKw?P!uLlnU)16Ezq{4xDB z#M_XDk|M|-JWzkYDhJp>!qAoCy{yr2_rRn;zDX^D_y$~y3xHa3pv2Ab;;tyz8weM6 zL)&IVhV%kx8x!I}a7bq@LJeu?AS~!?V^9?JvhI|Eg&1@`44fbj7eZW!9^Tdv7xuC? z!L_k&KMV_KS+MMjw$*?Bznlm<5))Bg_PVINfRs1jjNkYM(i2;w0vhoFjn{$c?nng> z&@|B>&`@c23uF+h+XLK~PVnds&;T_}Jv_Q26hO_>43F*t0Z^}3!=u+Uuoe_MCMw{H z1Ja5GCGO4`708WMFBqWZF!&4_*tK=g1v&7}?e6=~j0lPlaPJ#zcLb>5PyksT09yD0 zzDT_Sydp8{D`c_;TAufcYJy@Mv}I2S1!|;QN`tD-J;uHoc&0azKkFy5~S@A@HCEXd@PAIW#Cj6kb?^^+E#m zhdbhaf}ifl^+O zT!u#{zDFlk*XF z!92J6^z@zgZG)P4FTR<1WfG+zgEdvc( z6la1Q=>f_ltp`fXLD}BHqdUj|bch!y`-AsTBzQDGOaL9}#d*`C@g#V<2izk-^gcn? zgF@z|TvR~4Ch*)m}m$mQ%G@xHhKo4jk&?$ku4X)sT=J)93 zWd^S%;CKmYra;5`19$}iD6Ch^{PF)Kq-zH57qh6m_?izX)j(b7(sZZ~LFc%Fw?%>iD$z`gs{OC>y@vM<1+`Eh~==PghUhlU1t!v)-5 zhL;Qv7@mB64#k?*lOMeaxfzq{3_Ps#=g|yWc@P`+}(-J(h*Ru{_He9Lu2WG+_oLJ3&_Y^zt@< z`JgC1Ivt`JB^)nIgcuD8$4R`PaP;V9y(t70?q#*x1FNV@z_KsyF8=fXf$1=m!d@`M4Li9JBQD`;Rq3z4aBA#QlV(+6=lxE(9uaom9e z;_D?&a9^*5r0v%x(1bk~%m?}U{InncU(15hkHu$x0S0)ffovgqsj(Y&DLuH{#ehPfMDTX!>f zbc^zYgI1-04hnz_hJ(%YXgmq7y+PyZNN$D3>A}~~IJM}(9;X)^;Boq9Dr!o;1LlL` z^!F5qW|Wl7)(3=Wpkk!?2UAIbNAnNnQVB>%^X~(X z10yHSUe=yh5J$dX?uPgqkr6H-m*h;dXfP zkN>apAvSemSk(N3rNqjk`3Gx>tViZy{>*h_f0|y$Y%w%7Qn$o_5cU*y7Hxb%?0qKJc9nJ;cG!Gj(jOPHm|HQmM|6e+T zN(Z#__{)OP#;d_&!JwD{)#RXD51MRJ2>`JKj=88vFuni{)q%nuTDx|FSMq@d3*oip zi^zF@{=c3Mt>)0u-x)~yL%I(fWLO5ML(rlK8j9HFqf*dvvV;d3c&)V{!CenH`J2E; z=R+3kgSJF<9)`7eN(({R3VakMhymFM{z4hFrWt&MV(Wnta6>HtHkr|Spo9f{(mP~s z7&;w@I2N=U>>qe*0@0C2C;_$ZK?N|VxDt3V{VAk10v?h9cdxMN>E+#D4vI@2NRJLO z$^Z^OP`3{3Gx+kW7a^e_BcZoqflukOcnP|9-lLaQ@;Nm1OlU{Sat@%>0~%iJ=GCx) zr=Eg&AR9Se!)n|FFdvk9f}xEvkUm)Ii3i_&4@*6YY@pQR(aV~_4YAOpmz8%bte9d3 z%f85&^XLCdaYTiS7T>av_{PnYpYcpQFx(Y+Tlpk_OG^hSVB?*MB9Us?`Q4DyEqXab{m5jb6ghu~RMUMz%a z1C1f@x3q!fd_aSmkgZ59km3n+7+0@M5Gd-qK|6E1A;*q-be7x~aOq~4V-^Mk|z z@^JMQuq zFAsS4vIpqWap*uuH)IctM`y@6fo{=P#-L3QHs^eLUCwc|UMiIag*>Qrbq=(x6O<1; zI&02xysQDA%mi~k=p;2zvk8>hUwj8QOkh%wtpN~?pt*vZU|G;e4*0yV%i- zpaDg2!QBmN8CjkH?JtL2csT{S6&1GGx<>`Fi*OC3NQB-Z4@xZ=pltu*f)2>jppnUL zAC-)kNq_(Uf3fGy&;R_~FSbtp^Z(_7Kgj15g8R!yK*bS8dtL*yT)-NX(k(zOlVV{| zA?pCk#n5JbCyUC9xL8nT0mlW{fAHI-MmFc;HneU z=D#=vls6Eqwu4|kDACM?Hda9TV6C>54Iq|3e6JHIxS=Lx9F_K?w>Jr2;P|-h?;>yz>M+8erkke8l0f zNAnNi(qvG?6j_2waIBg`;F?%VaS9#{_ZZ`%*Bf8Y1v_itGdj{N=NDAZGk)i0o(cQ4LCa|w7B z8`SXS=w`j8i*T|9G>QZ~nvY0;7wmx|&H_|bbG%>#JNZQv$Wf)RNI(n!f1oKul>0hB z24uj>15k&h6?72||E`A|{LPy{sv+l>B1XEw$I}&fw0`672?NX5s8o1Ze&_E2@4mCV z&fjkj67B>Yz6ma0IzjsmdRdiTKmzhbBy>d+xRnT==LR39Q2?4x1aI^Mb;mU?dUS%< zK-Lw3%6$co?nr}f({nnYSu$x4{`HqZgYFt0jJI09m6~~U3P5gigj8~{HauwJt@%NM z2k&%HE`wbnhBSx(8fO9>Yk0f?QkZ}pqwsojH*cyAxEKL1|I`34c<@nCcs&c03e-2)Ke-I1Dyzy;L$DT(H#ap(lO%Yc~FJg{6m7jbrZ-D;Q7|p1N=Rfpn@5E zK8@ue{vPl$P|!Je9^J(ppxfg5B|-ANtY_~*%9a-@(DhacprRAJ0~tKasd*6;4jdkx z-W=V$8?*%(JQy#uo-Eb(=wt>(EV!8s2^7dJ#vs8AP}>{agFp%j@I@A&(|$oMgzexa zO^k}e>s_FvB>~$1bq(r}*=3Nh0>>V>;Drph8*76@3{-uVHb4qq*q}!$m=7v={pbJ7r+=VpsL}EVCn(r)=a26P0=l?S)iL5(TUIz!M} zIY`uW`lx`G#GH-?g*j|V3~2ZMi-XWzdEiv-08$NI(1&nbFKaLKLdOD7ld6IrnbF?3_$gl2B`kh06E?R+_hwd4IMV$1{r(s2Nx*oSb+LH&5%13 zOWi!W11%u8EZpF4&H@>B@BwqT3lj^d(g8OjPkTcOd;!q@VL#A;exS9Vu%QMGkLDu= zhe3Xm0IRn3fvAS`DL`i&^TQTbftGE6R#t(Qpo1nYkXKfn20QREOSg*z3)qn$!$3}W z;e%v711{@(S)clXTn270fSPD%&g*4;dI^%oU&KI{9f7lt0;t^rnT!3R4$nTFm7u6Z zv_31rd{Fk0hckDwgz;@JZb1v)PzBc|4>kr;h)doDC@J!2{=r!a z-hg1iza3*LmH4Cpm99t@F@C}VnzwXtB?Xv>jNn6UQBNL^B+7M0Sa{lMhpKZAb(+mKjc2& z#h{{U8}BN6eukEl{4L-~rB2qx_WTUpysfI>zzc&WcHXJ>py@i$eoF8VIM{`)2TJt# zw*`n}&fFs%Qv{mfgNK>nCBu`32VURz=w)>Q8wl!pLh}R1i^NJu%>h|1^?Cx>?$@25 zf(O!Anna>(8?nVaCrnClI`vQ zZ)gU0>ftwuae#K4be?K{DF5w{LTR{1uc)XO=$_*k&@Gj>N|Qn53wRU++&Tvj;lB8s z5AhASpax6ARsw^nH|Q7^bU+kQNYVnnemnqS z3%r=_0b0!C(aRe58J?XV&w^#=pKrklCaLAmfAHzNh{S?9Uv?G}J{q9%8nK=Sl3pN3 zD)CBrLhcAo0hQ$7w)hKnxL?65b-;CZH~exk3(!`q{}(~ZIY14h7aEPQLKvJ-z>`4W z%ms>9@X#nc#emd%^s=h`f_N3Qx%k(92wULA0(Ypl(?7wz{bwf3+e{E|XE*=(|56Or z+(k+cy)G&bAnOAsK*sC9bA_GI3%q-wG<2CMKX{4@yj2@^=_72!x3dL0GzY!?wQ~w& zEm`**@O1~EHG7~jH;xyA6Cg(k3V=>bF9j8hu*JxrA_;o1F(i+hwIh_ayoM?T52k?D z1j~U0V294a^?|x$FeiWy;p>6A%SQz~H^}fp06c;XY6E~L*1AD018|cBei5XI$_s0x z8nUzk6lvhqzhKKd8M|4t6+y#KfgG&|N^L>16&{_A;H7<_Gvh!lNAMEmPUyv2&})Ms zx2Qpb6n;0l2zXr>1Cn)7;dpr*)YygwIw(uSo!bo^d+mf>*aVGJRqz4|=wK@B zKms&xbVCke2ek-5gX5s_V{m+fM##bI9l(nUK}S-6@)l%uC}<<6kR>D+fSX_7LlHDy zt_N=-fs8eSlKu-{7lNVDz@?1^uojyRaKJJ_qh^ ziFRj!nh_x?kQoV3a{=Uhu*sd^c}?)4wxE?Dy`uZNAZjhZg|Rf)BcS;T(2Wx>GRq-L zIl-g4;LTZ(QC;|w=@TJ)nFTwXdfVA8L&tikB_0|KBOI35-kTnyU$!yEMA@jWzSw##S@qT0rJR8dr$+b zmz5EVd@rjsR?)x5G0o~_{fA`H!2_Bw$`m|6iK6v2D5v(a-o<7T z>wc`FJF$p1AN=gm{FAX9JQ)V>`aqH-OPPyDZ`4nZ=HIMkDjv;;K7*&Q+Y2E!3u7^@ zm-Xv0Z2rBDMYP*T#p0zZ*sQ>hAd|}>?JiihXg&lM?KONd!iUT8y;7_?;SZh&ln;ZcFyXDR?1x(8pM10K_|csU8A5ft5^4D{k{ z2wL)kRMIReu=WIK$&t1PsKB!7W8(8fDXQg&$%@JVk$iin!GYd>lAo>5L7&aE)fe+G3XR{ zy~(5b7f0zDu(U^~!0SaX7FGWF|56v;kb~9;X!XG?GX3Y8g6Th&Qrl1b0xl{BpZKE= zeC8KqAl-u;rKe#=2r|6h|KeT+Xn#JkAJE*t1*`iVkmAP!)X>0)pVnkd_j8o`z$}Nj zAI!6W`o@6;<{j|zu?Xz(mEh5h6kh_!-hr7W=)m!M%L^8e&-9Uf28kdv|DA#O4{d!J z=kRPqVp7I5)^)ytEhHwaVWWzb-70cgHm%{}4tU1|cmYb{2lgmoAu&o)3jh3n2|6wo zQZ2zrwDb?He~FGC-j|T{jOu=m){`|sM0moUw3zYeJmGQirAPAvMi0(|2;(CTyq^7{ zrQpy1mxSwI@E|V<@e_Ln$$v=s1+;e$d&FdeFNlFIfgqwpI-URL|I09ViG&s((DNER zK;w}Pp!p*QP%#()YLkK(;O$^Y?syS<9OB*tQ27aVufivO0r0^zEGpo=e;nXMg;a)u z%mE)-q3|Lf>UQwrdGL@7cM#Ub4*l^Z%s@G)Bl0QX#&|0A(;pf!!Sfx~mer zoCCCA0<07?#0Y6^gBv4Y1HrN6qN4HQ2GoC$0S8c{1@qJ?=yFU@_rt@Z`AERw7mKq0 z{C_D6O_sRIZ&KrP?k=L^Qz#wcbJFAU2efTZLVRw`qE39;LRWl)9gQtM=Ri{_CGp8Y zR(xK{BqBb+1Lzpzy8%f3VekraSbw0)4h@RWQg_(3Br!whXlH7Bm_SSw#%WZJ^b& z;GzYz1&rZ^<|$a3hAan#PV;~Zk^+zJS>Sn-?h?@AY!j9LmqC>UcsWEXqT>e{&t>dp zt!0PL_C$jeT0mxdK$#jbWK@ANBmrCG3|<tgE=jz&Z2SY#1_zgQy{wP# zLZ%HtQ;6F^r!|A>&lj=Upee)`Zs~vizXTmai9TKix^>*68Ats9jtQ{+A)uRqKuKio zDfp;%Nf5~G8DQ(d%ep`{z>6Gc0Sk7jghwy5>`Vafap#r-_3DtC8?Z%Lu;vEHMBI&^ zg8h()2e%Tyl@oYPBq(V>hD|`)!38~do*LRhhyso8l2)UNr~Uc=@)CHm9VLC2g?OOl zRVNOQZZGg5NDdyBr%D72L7Oc-kg{JlXbv5*Sq3x}0a{@Ip3mps=AxqT`rHeS)Ia}U zPlFWs2>TH8w|b!UgpF??1FF#3Iq3Xtw-X2Gf?V+Iaxd?4MbIh+&_$)9U#@`Wq(C)x zFKB%`XpZhhz+|M`QXpe6pj+QS8}vPTSr08|W&m9V)w&pzhr78vx}!Kex`PC|OH^Ds zOF$RM7BhnGHR)Fd$@kjabm?ZbV*%Zqdw{~mar_D`7ixRfBAF}@vt1Z$6;(!0}?aCMZ9E!v<7|LXNZsO^Wu4>VRAY+U?j2?dyYf{k$;KhG~GP1r<`z zg5&H_qqkjnDCYZ_#{cttYl}2 zioy$9B~YacI+_qX8V5dvy0?JQqnFiq88ZWDI4j`g1kkX3FRRirW(LFCh9^BbZ@mPa zngS}6z`^Iy%eu@1w1NgSz%oY_oZ+`7{rUfL1L5=MoFFR})cinx0F}YLyt^)gQVzIK z1r2X^!&loUCJ{b=4s$&Y|2EdS{{g|93zi`|2@BfR1Z~pw}-^Mzl7e?u0nQqn9^D9F$yO z%g6SG{`mj;1~_DUSts5AMI1O#SX1Xg*a9!O)xZJ#C6Um2oaQ$YpkAE-s8=W80Xc`M zR2EeGdGvxq7qmD_cN@s{upsv61zn47X{_41zH^nK2vqmVaPU8aBX4W(R`2t z9IxOK0i+0YqScFDxFSg71Gf6@g$T%1O=r%4LY4z^;FCbNl;zD*MaY86D3&zKo23HX z4jkQH9F`{_JA)+-8y;2A2grt%A;FH#iRKM$Ke-uw}Ija6gdK*$T<&+oKs+fp#;KwQ2K~M4 z1lfZQJ;G5$1zLB4N)DkTkQjrFKf{9}66}T-O!0sIzn%bciUG(eYd}s}j@q6mqs0DC z&}JQm{WrIQ!r(kus;R8eEG-d$?V;fTI{dD?NWr7KO2fnQb4eUXx+KJ-+snYCJHo)j@^q=QN4J-S zM|Xq;h-2i@?d9On9Rc3cIptu>$r2flZU+yKZZFXB#gLM~1LRLg56tku>vx7HU*9l1 z`TC0Cf!B{93+6!0>dqP!ffu_|zyAmAX$3b~A&2O_ZZJIgvJ$iyq!W6#4JeyJ?vi}r zT@9)gK@|vSNe;O8_EPWv|Nn+3U#f$(fa)^vx%%LiMv02V3kfV*Zh$uW>PP?i|FR3* z&V?o))bKBhM=wu6vt}se?ThRvNc2L}PV+&;>5HJnR05!r=3c1ngDApC18bxH{D0jI zvmAYXt*iM@WJu5MCaWfvraXm9!k_@}PhK?Qddu z87m7@2=y~o^)JQbV9Kz|vk{R0MnL`<0r_i`$}7R$-&><10lLb&`S=A;bLa!8IrQO$ zRz2u2#asqt@4Ylo23-|jqoRPR{#PBQ`eQCC1q?5{wP99)LloISP_Tp6{ejPlgM|NG zJrvc@`W<(C&DAGH{Yy6km@;Jh!3)7&&VtK<9EdEB&3!0}&tSR_>0fv`RQONSB?JZ}V*Y}Y zp_=c6X+C5K3FJ-45)e>R7Hs~d5>P4Tq9Or1?g`SzdEo^zeg)Kc9OW0A1k8^hgYlGK zbKwf124YqJGE5S$c`w}v$eT&w*RMuEUW`(CMEQrk{K~4rERS9m$l)x%tgxtulwYUS zU|t1>DAw=WAbzQhAAUiZ*`VAlz1G4_R6@V2!qT6M+L|{EdKGuZXRfMmEmPPdg+cCe-N{egGx3A28Nes z4dEdHvK>=BTKMN05u^U)F}O0U@%d8B7-kH1`7{FZ+i=RG`Onq_W)Z}DDCHBR{I&{0 zR)Xvvh`dxVe)(JYpLjNyUTCkzj~KJwz7ANqPvkfj*) z$IE4curS6d5ApywVZ5{zf+@t39ze>#>HXz5xH7Efy?jPM{+ck%8tnRy5s=?Tsk}Jc ze(d!NR|%G4O+W%?{c@`qQ$3`9$yR__1rAZH{sjdrB>eX(qo^iW-qflPqyD9uDoh!& z{gC>l3N8n7AhJBjS>X5vF`({4Q4DJD5~yGH7GVa=%j1YT7i2WP`lS||{^ja0@0DT%>nrxghA$ky^5oLd0U9-pJR|INrspIH8ITtT^xkezk!$yuU~Re zDtAzLqNzs@>X>es&RZgGL42esSZ5g)wscf$|bs`n?NRh$TJ1)xVs^gV(&5Z3N`Yc=78`BOo6} zsXU^-#a_Rx%Ec^3UTzS?S-(_aQ4gtKxZzzbaEKBJf8xf!KoJ4X$S-B#9Wk)!IO?O9 z$KcA4?T6GaQu46402zTS53&X=eZ-X+CYECHF0sB=Mf;HzI`vFUeLggY6e zA7A})HyhJ_c>Q7zABF>Y9gIQdfrA!D{nCrwJWvj0csU=vb$}Tk5VPU+3ok}}jjg_b zJL=_HqSU`+gIC~K5HW+T-v zdQQaEFV9$Daey_wA<}OxD@-9IIiREmkTP(2^U{nBrVOijFVzUhi?QR^&qhH08v*kP z%5%Z($6mj9rDGOLF9W!7)-O_6)I;i*)$pzsI7G3A7bsxC8S~{|F_^=^sxiwaaQGwC z?}c~7@Tq^91|RlBwjWZz?1IaIj6jwLS%YTZUlhfl@_<17@;4PrK(Zt1T#z03>X*IP z^gl<{kFS2I#iAcxzucEb3+*%D{t!4SaMUll*v*5~FZSrOW0>&=F&kdLtc6$npuh)( zCsO$e3LCWW_r<8+v8jK#46Y1oe7^ifK;8}B0Kl$)8cumM|H&d+0uT=(n+K^sr0kI+ z0aN}L0r_1Hc=UtjKOB+eNv>Z`Kf_+Ut$H%~a2!ff7 zRKJ|FCa!*I`}glZX8dAFzq0>f3L(mI)GycI%8=6o+`N~^2*__^fW{mTf*Poq>G zQQu;(UtT3(DHcDl;H+PEVNnmMU%cU6EpUip^)D#kz!~%9Tme|XfK_9bPiW;$EW9Iz zPyI_atmBoC`Xvf32Qq??`%n~v%0mM6%iMS@0l6Ge=YqVBuYQTeroUYT9!ennpzOf_ zst>TtzsO?I53gV9Md9Xv{0_n(^T1I7G7roA%h@w`?xVL3FyjwmHoSiE#i*~b z)faF_y?jfQdV=$x(+JFuJ|iHHd;S#7e|r%v0Z{0oh6kj6*#)2L2dO|#e-Qau@VR{K z@=+*L_-OhC7+(HDktex+$$o&peqmr@V0f`?CXV_=*Nm$5i(e>B>KCvdK7~NdMyg-( zOo^*s)PBIK4dn0#C0n%eYA;+NC^A9i2e$P7vg{{b^IoPAkPrKXU%wjxc{57o5%n$h z`lTxhvlw|f;oraiNW~8FdZs8W>LK;ZYj{@+9HIom-xl7n0;@*Nk67aCFH!1WE`twy zBHItCUw*;mKvp8lW3kT`KJW=r3`!pa>KEHcECK0`sB=Mf;HzK$Mqtse&Ihj-K>G33 zFMF}*hu1Ii{BU!i-XYk3$;ECSr2kTn-a5dHKeY1qEm7?QkSD#u( zvrv{8kX*lTLr<#5H9iJ9y7h(IWE}O&S$(S3FQEB$(5^8F>h@p2ewgHkS-#LV+1mwRFkbg!%{u-t7-{J1Z zUcYFCU@6uNe&DQMeg$Kyhtx0K@U9j(M6re!DBvLBf0r4p#3P`7F1#ZKHXXA(gT#j$ zeApA&JV^aA3oZvT0$Cp9EUh3c((GY5NwY z5abv%|A3T1%=-pchTXnr1mv&1gIR-J|1kpc+bEL2KK~-r^P-k^nCTx9 zKG?^vAmtGkBXXw1>VJfNz9@=8@j;+G^7X?~9)&Z(tppj3uRP+#rr#VEHlRl2} z=&UcM{qXWgAH6guTprb8HxE)C^`n>8nDGIQX1JqY{za6`kO(Ib{&Nu}F&_0VzrmGZ zHSeVxydcIdKaGI=Go12h{>$Zr$26vUA>~aL%9Js(dm!>&D2u`{<+)H6d7;S*FuYua zQyvrzko+O`0&o5YDFl1$bVCYu?K+0`hLJ@as1tAg@NLJfb|q-d?Nn z!pv4L8{Xk;uX$ln4{5L6{s!|ZI7E@-4;1X+_yI8>;jarH=m4w6%wK5g-x8(%<+R^0 zM;<%Y&SSW}ogKm_Z=LM3j%Zo>&6X{4d-TkRABS$G09>^ozrXa|pKA z)?(2QFCY2QYa_ztV=Q*_Amw8|dToUnf8b~ac^X`(zr2f4-{5aA)FNsYNCaSwub0>0 z%CO6;!7CW-@?`|%kKvR@^Pewz4TNkTwERO^w1g?Ig|Y|#u(T_{VIk@bV3 z0i3>HetQHC;e`l)-mkEL0jtK$U*Pyes6R`T`j=(!LK@kA zNcngQE(fv_Ssr8!nti_{` zet7x#9zLuO^$p?j(H6UTkn+(VrK$m&i5{NdYzFc)*wHWdV$?VI%g0zm%>p(aNB-Of zSB7psI6hyp!7CW-@?iwzm*JF0^Pety4TNkTqm2U;&+=WZ=Pg1AIyu=(O|~yCp%+0$s5QzL)9$0gvV%(lzHmCoCZC zgL)wXa^xh8^NpeB%UXbTFdBID=BOAL9(c{^(G5Dmsn?MaWL9k~=r&QX-61L-9^Ekl z93I^!0v_EpDh@u~E*2af-7FTKmN!b(Kz4#pF!KTL6z(ih5da+;CGjHN5;7F4&~l)3 z@i7;b00z);5(Xa4M=TD5xZrDQA>0?)lDN;8CF1-BP}ULv-KO}WsRk4zfH>GW~seLw+HAn8V--{C;^Y| zAPx`93s|SM^_52F3|G{UMSl%pkfgB(g#Np8$0SO4p)6f7wI=TXq zeq&Ui=iGshkaIMLrjpl}4G+9N{~}TR&;OS-Xa`oHga?0HJmfr;2vGVB0HxmmP@H6V zv>xE^GXlwhPhIR5Y+;1N2k2}SA&*`g0}spl{QaO(+l7CdBcE%_fs#DO9iTmj9+v<3 z+ZjPxE${QU|6pKX@a(+lq50Y4`)!YdzwJE~?|Jmf7#V(h&F<2{V(jt%n1|)DnlB#R zj2@j896p^M0^PhnwhAz`o-F0{=oA2@^8kj@s6 zH7W+6b2}_NdU^ZWV26V7M1XP=^ls7Tmw)~D0N*zXIk^dZV}b*yERX=*P^;k4UCH6m z&FNwJug)5jqCC*fWV!AHszgE8=R$&`M8yJ>eZdXJeAq~WM>pu$lPN0TD++pL1VQc&fShb&;bHl?yw=0=Gk?1|$o$S4l>$%* zd3f})@Pos#8+xw;q?`dA7?^*_8l0_0j`$rFS=L`W69()&r%YpfD`(fZU2* z;n8>mW)zf0H4eZ3K8&WouGW*-2?G7IRAG~QGuL;2=YY!B9JE_yS2fA zrtPC5!M`nltK|}ZiyA0RcKWC|cytSZ4n>WC9B8-&Vpy+@9LS9UKHW?{-ChDdmgo7~ zL2dvuJ~A>e_;mWHcz_D#0?%F+@FDsLM}f|S1C`b<);WM20KWDVd{`#vrZ~_ISDm1{ z#T7S$L(u>cicpt=Jq14A33Ps76zKk)?i>|d0j$OT zji(!?4V>^Y&=MXO$Wr8lR{>6V`#?#xvqZ%ML$a(3D9ie&fU>M4mV&QDMc~D68;}EVWZAs+;D95PWtW35XTY6h%bAh0?8|yc zn1V7YEX#tLS)Da13NLKVL9(m{D9c)aiWpE$04kKhcl|_wDlHEWJXuy6>=syn(j?2C zuto|p^ek(=4jg27vurvOT9&<52MH3aSyuBbdNRYAW%JU(SvH*ybRP*g%cA7hvP{(T zGC@lx3|bD9=z`KNxaAEx_x1tgXivy-Uf@$9*`Y&9y#hmIQV{~rHOc^-Vl;?sHEr}MN&^M8RNMW0^p|DK({Jer^L`}E4b z`N_)Q$iL0T+Sl@6(V3TrnHU&A3VeD+FF|Fjd@T?1H!o&lV1SwUn#b{&3+I0Wkl~#- zJz6i-@p<+}{`avwT=eW^F%tuWXK&ztAIn4h&GAeO3}Cg|p1pzpz(TH2p?{(L+amZn zVpPnJIe-r0Wl{0ayynsQ-Q)W`kAwg0Jru8bFn$EJC^$SdFMujK=+So@zCjM3HV0*o ziVjCUP}?iRqxnd|VNfe008}%1fb=DR>U)b$8^NRf7aQq)7+5SD_nR z8x!})ja3f`2p^!a~_P>JU|EfX+ln}1$zv1hrkPu8Ib(t-~qC= z8`NvGyvX0|05T2a+G8#p|J6NuBmQ}S?r&FOWMDYv!tqZ5>K%|xQ1^RwUH}~kXz`Nw z-~a#3zw7I{_JO)~FJu1y|KIrgKRW|MJ=Z=a(77^R|NsB*-OQlz|9|5@ka#(d2gEBc z4Ipa&gVi#F)XG6c1VFk$`2*5ufU0Kz`5$Wk%R10m+u&>PdRaeJ!SXn`+Y+N9@WTHD zC}+oju2TSAS<+nss!Bk|G=mx^FXjLK{|`>(;Pk!=Y!f$3%%k%&MC9k6|NmdGC4=+* z|0FQ=144a-P_H1=V+eHzLb*aToP+Spxv-ZP{B3Vo7#L8`LkFGBm;pLb(iJ4t4Ql4K zp5&i%sO3@#v&Z+Fpz=AuqqkV2g^hn(H3v9z{s&d!-PIBv%+(4W&BvKNn*Y1-_b+B< zVAui5#QQ;n3;#A}PFK+J+jh(h3_jh?3cjreN;yHz{+92coCu0|&*q;T{QVZ7Y}Nde ziNEzNBdB-v>$Rk3=NXUYhm1bGnFcN$Ip+U8FTU~VeCX48-=p~_QxTs}Z~T8>%gaSK zUOoaF9-~s>V|kOm`7DUnoBrRYJ4dC!k$;;HFN3e;75?U}%nS@2KIZ?yx!dHwfoJC_ z&(1%-txx#-ioi|bi@utVd@V23@q6~xsQmY^JYRI}WhFBM1OK*aNO|N4av8|At*=0Z zkmVWv<{)MU1}FY)HfjzH{|)$CK=%g2bn`dsF@sA7lm7-Smr8Oydc*&FSf1i@`RirU|NsA6F8Opmf9dl7|9{Wsp8}<}p3T1n_}hX(@dOGVSN?6T0v?v<`I{Y> z7#LhTTulCheEttCqy{MjP5v3QTzbg}H|+aAn6YpF{r~UNdGY0fe_-P|_**SO26z5? zEd_~oc0{xve8UWncMkq0A&^#R++ThPPA$zpxk`gPJAb_v07bA*=L3(TR zH2>t{Z@T~Y|9?<&@$5X}vEwXw2<6Nf$Ih!B-yeD$e8ue1e9*wB*JP6C#b-X6A35H*WsdK3Xc13ZwXM8 za)6@!h4Fiktc!{%W{iUJ5_m|$8pPrN4NhqKbURD5Tq@!4{D0!*hCl!RyYO%G=5}p4 zS^5sd;svpuyqx~$|9@A*126lbbo-zG|2sld%t5wVc=WRBm%)lK@PVqJ<63(TgNiWl z!RRF_5};85@YN$0{M$hKxNg4Qp;|Nlqi`j@QWmW7W>gyE%^yMF)w z|6)xXxCk?aP1G^m*3{Sph_UQZws(d0m zEHBpPfr~}{Z6@4}|3LL+t*S?FA*09t6CSMxYOi@%UM$Z6Rn`fhfX)Eb;uapwM;s1= zxCS1bpwLBJnc$-$@S^QF=$QNxP{jd~>;|1?4yrT2*1TR0stLije1a=}WCKBpUO#x@ z1`diB_AGz?zm!55Awz91#$X$-19#U!;|P!e2vDaJbPLjpi_pdbc)$>R9fgGl=%xZt zFBRkyffxJ1mpH|JQxcJO-su?B{Pw0^RqGt$zs~^k_Z6-y#4~(cJ^N zX`vf(85IAvD9)DK{4LjZqd-8ekD&0P4mdGWY{QpRymRRg^`9$Z+oHLx%+`1S@c`E<_#U$o%L zzb#q7)AAR8zXGVHIL5+e;MS4C#^`Ez;5ENnhmM$AM~N7t=l=t~oxeOSZ}9hagQ~?& z7nJ}P{%uLTt}RdaTMC#M7<@rvm!Q_BZ*LN#r{y31{=19}3{J;b#1vfkw*~RIf|}T% z+s+}*_{0oyMu-ZNEC04^i2d@QhF0qVr(-N?25ucWYK;6X4;es}@)B?;`&vHWZ{EVp zz~IKeO^3m?^PS^?w=Ayw+ur(Gp5<@uWoBS-=ijEI?b!T`-`DaSe{(h1hAJj^{%t14 zo|gal`#|S2`+%B7E*&{4?k*iADsCRVtQQNR*|M`lg##oFsk?l@{X&%kpmGMLr1NnyyrVV@ns!wN%N(R{V9=)s*s18p7O1FLNz!8Ee zDhe+i?Ze`b1V$1+@7RA+ayObAH&LIZ*puGT4iSZ)*#sB}WAAkoeKxyHH z`Df5{1E`>ZX7JamTsl%z+(BK22#;RY>G>%B2Ho<|36FqRd$IT%DFU#joCrk9frP#b z|F#qr_m`=E{{Kgp^6fnIG8|NoX`TahyEwpJnDQL74X*_MVpZ`}h0*%SKSGhf@BQfyN7ny(JWh{8}RY)3NJb&|AMD)knfZ0jse~0C8GlJ3T%)!L`CAo9Psf1IV!MW02#Ef zLNmHof_S4HpZ)*;dNJtkY=}=`-Ul794;r{%Cmk>Qv#7iX1mD#P3yK#(zkmOKDGQy3g0?m==Cdb*qNn){(tI{3VR?Aif<~0eSaFhbd;LJPq*YE!?12FGP*uaLSi6bR5aMREL$xu-K0S7`SC;X<4poYJNNApic{x%K{knK^79=%134Zn5yTbHskFnIhw32OXzPk}lvinrxDQ~m>C*{mczJdn_0aqQAItdR!T7<~@=ke?ujL*7_El`4Nyr$L1fNdGoTqoM2$u(H z2SZN<5(@>OrXVQZK{EwlpLN%O%FCZFpds%-*s!G!boLZfqk|_qyJJ)mUV^Sw1*H#A z%MVoAf$vZ3Wi?8NG%`TVIu4NM1$;oGm7tcO!i(0eplOQ`6%A0&A3SXV*45nuZa*Si z0}ZWiXn2EM1#uE+nlb{^#DusbN2TB;+keo&#}t(d3=9meEeA^ZU%Im}FdSpyGw}F- z+N1L)C?jTgwBD{O^60H(^sqc$_ZS`>y`s%&Am@T^G%5kDk^n960cAzd41>apYg<5t zC!#eCx-F`=f)U-FP)9+W0J@DDbo1oPD$qDjuM8*1GLUOMED!UyhlBb)AjThX&j~y` z3H4+z3m>Q{hX}V9?Mk3%g55U_L3Ja4%PJ;NsxIaOcgjj398mX* zza;}a;$JKQx`MAS8q6{FXuZVWmJ4$-(wG2DY669 zFYIgqN3uuf9&mE;>}3%Eg%~J;IXrru|AVSNffs>_kWhn|)dO)yCuoWtwweJn%f5Ru zc>YNmQ~`rhjt6MD0<O4teQPWQ6frhrlriwdZv z4O?qdqap!n=PJCIunCmt!2=LApcNsopn>Y{hMLw5x{MV%WA~CB)B@<-qH=(N0W^uC z66Dd#dLtQTNeHOp=c6J3vQ7e&y%b((ZvrJ%uqDt@4hvBB1?l(b3>N4XJvB*yq4iR! zvPUN~sMyW$=)A|jtwtrtv-6~9=OK_W->gb*WcIN99kh%|?BtWb3z^jdn!3hH`U_t5c3nM7W8aOok)8=n=0CkK&w){T{ zYU?AV7U+F_9=%SG=mk|H5-;xF0VOvyQ+q|XC4oW+OJ}CN9WI%>p=a6PSCZDy`t{8tOL!^&f0)v9k`WX z;X!QK@p@wO?{xl_%AcU=m@@vBf}j8Y8{U3d18RwPo&v2C?ELWZJJ=;K-b--bC<-(^ z7I4go4^+XpF*-K<@GIqV;os)O>)LXl1Uk-yQqaAabQ{#E0#9uBfD0Ays5ffRf=u8B zm96_gdHMedkIsLuHy>kDc-i;k|Nn;H+Waj+KmPwe#-#1hdF`bycxJgr1++ZyWDiuP-L8#*&e*b@I^c}P{3eldiP88s8;{p|ADE*CY z$YIvDphhu&j~1vu((R*C;n5ukxehz(J(@ac76ggO9}t|~x< zS^#M9#o_g2@Opz_Q2A+jfxq1gTRGU#I!Yqw})I_gfwZf7yE|{_N)_2EH#GG^EIQ0%Q;P-mrE^0uE8B@aP0x%jqT1&3dm7T(}8= z8s!llo#3l0VLctljl$qQAjb>V$KU_Ieh4zF!lPTzqdQW-qq~s9qqmOH!}5N;s7G%c zqeo{XM+b`$XcPi!L@%pfJS==bH^qXMG=V}6x|(R=T2T0)l|(Th=YfhLXOPn_m5PFj zq0Vz2orhrI)_D`ONDq7~wU0^wyeN5*^axbsfW*5&;-C)Q>!UB$xPz0_QV2Eg-S7V| zZ~g@(6j0+AeZ4P#+bU424fQ^|URDWz$Sm>;eM?BQ8+=v+hexldpD!zehvmi6sI=n^ zn?Q{`29I73hZe?e-j-eg29MqVht`vzlGMS$Ak})K?K!E65uEW z4MDt^_7LJ1iPy)$of~jJp_f%2e03`5GDXo1;G6o+z5V_FC1`OG)HfLYug94F0bc}r z+yUC%cK{DDbn{;60lQZLv@CEENYil#(0WJ)kK+y&Aoq6jZi1-L@aT;&XgyhK?Qz@z zG8l2(0klq&!K0V=y)P)Bz;~#c_<(w%u%5_^tEQlkL-;lZROcaeZ(b~U0QE7rq6VdF zkgYFzp~42Q7l1QxLco_v+TXpo!@Bc3$Q^lZarQ0Kdf13k%u3n(SMMdH;JbXYY zox`KsBY}ULgD0p#fJI)wqxpw&y{$*{4}}s<5W7?stc`!0hfmAN5-xB%9BeHAHiv-M zU%}UggO_n|@NaYQ1wEiQ)qc=w-0%Q_&O&ut!LsxQoAXaknw}WR@K&v_LgCe@K zM8yHriVZ+4sspz+LE+d5S_P>o0Vz_zU9k+(+FRMT_tn>g+kAa)q zph>Y#P%WLj5>$HBfM)o?tM5P~Vz7mX;BwXDr35Httab($083u|{{M16`e+44et8cH z5tQ(J0a}0K(G4o&p@Sn8Aoqbss6cfHh$8?RWq~w+!0Qg6y%g|`(a@nokTQ)Ie3hX7 zBG{=8;CVd68)^a1Gk{D90Cm8?t!j7_yy$%S`~S-?(4av}Uq>O~ z5dcbG9-#E)@!}MCoDnHJpev(63kpCk0~d}NAQpJy3OvgL_A5BtG+uC3K*GQQyek9L zu#XS`sfIO&K}ExH78OuBd2#LmD3U?7StsbiGuRjpc%ifdC~RKvAbS}cAK>y0mH@kR zR6IPIj|3ckvG~RB|1UvHO+dK_fzkYX8scBH_3H`XLJ2nL$^i;U@aU%ihy@<~lmK-P zz}9zys{U=D#xZz}Eaci>P)oZL+$j{j%@4XtTSVo>rc00#j{{VzT6lDNaCGzfwS!lx zYl4IvJUTf%dU>-;co`7wYe;?q)v>Tu?BECnT}KY8?m^>UFCuS44EA_^;KkbKzyE{t z0nEo}{)LWrA(bC5UV)osNbw7fH$3V6MMW1RMl(FRDNNM?@Kg<11`kfvnxNJ!ELDRC z5xT(z2BbUzMS%w>RYRt&U_zg|D^@eC?4VXltT9p!T8)k+xUzGI|%Ge zSaK#JJ|90J9G_(c=<^$_S7!2oS|(2mLAeMzvJMJa@N_;n|AJe%NV6O-R>CuHHz?nB zgO>7jg34^z;0HKDAd7uo_<)>Mj))Mn_yDa|@@RfTdU^8VupOx93M%@*rCxUkXjjT* zkLE}69?ic*N|ZoJ9#Y`IW=iI$Kr%;;3ZiUq0F|sBphh?3+AUB40pba~Fm{J@=Rik& z34%hz0aWOKvz^83MGyhdqyl)gBB*i(34!nI5_sWm192O;fCmp}YrM<>Rkn7IfB%2^ z6IzvkiyRM>Ysul>u{^=w+YZWm-Jk)0?idvb!*7QFUrTuWKj72Lv){4#zy(+SZ3n!2 zZ9KqB3_UDQ)H-=s-Y70~;oru>At@|&Qs zy2dw<2EZD~U~n&#?uORAprsXCL7h?f5GJS>1*!LYs~JJJOZPK@)5Jvs|Hjn4#WnRaNw>0XmtO@#c)V0fGbxCkM2&$=sAnZ|BIlw0@o`7AbpTz5yj!r zYr+j`T10qsR|)uZGl56W^g%61(8w7Nc;pP+daF?h@az>q^hZE}DDXm&57G{d0JV0& zW`YOHz<)YM^2!E+ntZT)3hLE@nmEw$v4Z)K5)@_L4w~x0Ls$GD7hEdk1NRwEd34_N=)C;8 z7u2@`w?aHX)d`5l@xt^9q>e0rCVGe|uTO$|TaXzq&@dJsR9OYg%P+OT<83jZjwh(A z30{ob%bFGdayEQe4?GS4AJ*GB59I6`6${W33h>k^cw2)5B5FX!b(g3_yetM4J-w{r zP~$*;M{W^4fat0XM)nUL;-m z{{QuDP*Mer%v|w<#0V(8!{&2AEz8aj6@?e-b3ri@0~%um5A(sQA@I0Ch)M)_k@AZ| zb5Op2k#+C)fAG3Ga0!4Y-+NtDHbC;f0caAe@eO2jcnxGkv=>72hacbM>aq!Rvwo@p1t)(iAIR8l*myo8D8+ZTfG7DtrTmNCZ$PCA#Ho;a-q)z(qpqN&Xhl zCIF9KQL#n53?AK0kOGTG1=7O-cN{oCxdQC^Zg7DG&iVz&1(p)X4p4!$2|R%X^GJ*Maz5j${xLuj2@j49LHF=G$HAM0aO@*$I=^* zfD+PSQ2*BlmWIKjXW;%XI1QJmD7;9X1xmvh#Q-?yz=a_b$ZMBMxxvN2A&<@*uRB3) zh7};6bo!_yAhNy2c~G{8l@TDR?m6J3`udnhFK?GO$Q3w>&_6Kqq4Q>uqAW|d9xb6~_f|m_{|Nl2U>Ct)W zr4^_c?e?$$%`>-t1BEMS4=uEOM9I_rAW2Z3{s(F*bV4^sc7n`A1P&;dv!GCg22dhc33zUTb+soXSg;n9|E7bY z7hFbyOG{Xa25IdMQ7L$-4yq2j0}MR6BQzihDg-(^`ohQ`RFFVhe3;D>B6E8-C}VvK@2pYD@acs33rlXVXT={}@5@2K#oziG6dm0VW55+lAP0CzySIqZ!}4Cen@4XH zcsTnQivTF6TX=K_8hCU^YJghKuwe@D4m)s`R{&*sPzw?~9Qs1bkb&VPcqFEm*UtkK zxbVCKYU_gLxItm9@M7UKP~hUp!44qjA~$DVCWC^z6IxxNW}D>Gpa_Oap=2BAARElP zpmvQJR53Wsz_JZw%Q+}bc7g{LpbL$9Sv%Z8zQB=lZcjy>v;=8|uTh!;&XAx1stnMc z&VrYQpsd-;Y6dkCIY2=pXPuyut#c}YaM36OmnmZ4GUb#<=V4It2Nx^JprHcT*iR>@ zItR@af-`{gDMz^`Ypok3C_piY(X6;I z1>|sWMgeCTjNGF7?K|Nqx_UrfFF`~U07=<^?CB_3GU;`?;?sF;IxAVhQo_<&|LJV47txhd?D+h>8L@R|tY?#4o2H-A(Y`I*$%VAJCu%WS!Fsj;p`_ zzbuCIp;7$L-}WAq>rvK^b-Sp9H2+BE?-yibU}*jk!QT%$Go|@QXh}x%kBAZ(kaxi= z!oc43{RRmS$m%apusI-t4aD^T_Xj}k6ae`E6p{g;QFo7CR-J<&Uw{g*<1Q*1U|;B+ z`v3p+dXPS>#=M9-_W%Fu{^lP^B|0ECw&sKKYqyIEcGVYd{Qv(l4xbXRyFjfwWOpq+ zfZ?ubC;$I{Df0jS|K=b0{QZj&;+|@IvSKr~m(7&j-bV1tRyMx(gc20-z>z8mM|c?xF&5 zTh#Uc|6j&~({@_Dc=L}W{+3kG?oyB0;1ztJC5^8qH2+BFZ}9^wDl2Uw+NN}vO<<>g zxc2`)_~4ZnWfwr}w?X4rXyp-jUo`r90#Gdqa#z0}69Yr9$8OMG%64!!1+=n&e_Nn; zM~I5MN4F$+mZ!Ut!>8As(bMt+e}4%mI(x&RBO=xspynpHquqHKJkx*hmAwb!Esu-8 zK>dsW5Fr2xRPahl(BK~=RzY$3;xaT5RvdHiW&{O)0H`YrUiSo64yyMc%Aqq-ojxiO zFXqB@A$LauJh~;o^M#h5_}jZcK?GuSfZPf>fg?sG!K0Uj8&vgp^s<&LfFx$f26s?t z_2S!a(0(e=$Pg$5U>#BD=`WdipjH@YNi%o^g%MQrxOX^ugK7lm$^mfm6)X#?)H)7< zs%{^Ziq}^_egYj+^3@Jj4}&-Vg1biGsX(4}%8zx?@1|gP@@($d-W+m4KJ} zpaQp-bu+37HK0ut({dFY37}p|C$w;z_Wu9>mv8?4|KAHrsK zm4E;Le|_o2RW)!U;@sKa|6fMpSXxRzGb%0cxu)$%07a|w_|9^c3B!!g4L0oi|9=)uWcR~`31h@bKSFBgh{r~^E zxA{jgf6Gd6IaXF03DRu=Ez{MIi*j@$Uray$|Nl!LP`pALL?EpgstQ2`yBfHRsNiqq z1}O*4Dj`ZFY`Q#pSxqsWt9I`H|ChHx5lz^H7e7HI`?`Ps|G$tw^ZWnHC{VEiZS5hK z@4YT64UqAqC@%2&Ysl!x8t{^7k6sAf-J+raZub=O_xo~!s`&{1mNy(AMhbuH0qD>U zXk9fV;9z_9AZI&SfKmf=ML+>Khj)X{cH(a@1+DP}tq8cm$-n?wHVJANgW9+mh(!S{ zDxi%5ka!2L3lRJP$>iVxCyAkJbZq3qdD#`SiLoffh;@_;hpnbO#Ffg4SVy zatWBRj{~$^It0}J>;Vt)dG@kcLQ6od*^mT{R04kahCgspGC_d@>A8c4eL5Mz^Ry6u zLKjYg^J3RtP`S|qUVRR(oj{Wq86Lf?A1xtepbw~-1QHYgEeVzYc|qZYO9!Z123m3k znLYxqU4R$@s$@VzOrQ=BIC#2CR1!do&@w;+)CDhj!8yZGz@r<~EtZ6g{2c=g-8(UY zqWBn#a4l%G3bd5pqwxqRnSzGylfcda^>x8TGPth`?j(cybX(g&MKW4}3RzJP8MF?` z0GFxAL-&V4L-#F^F+|k9ZuuTikU*tieO*wDzXmzvrUfWmKn?*7H=`{&(;?)L)9GM` zfIFAn(3A>Ve|Ga_Ca9S1gbwDSb}paohByd3&Iu{rA)b4^8yt$gQLLb@ZUMLf0Lo{e zWCcFgDjhVO+6l`XB`O&ny*%JL-lLcI%Pdf`0*z&YI#}QVp}Al1Co5i%>kpKIS1UvE zFe64(fh$*-jiCBfV>e{AatO$F-dW}-!3T~(4H)>Bz$ZaKN~m5|Rx?nfz=vRJKufxPK&=%}dncj=9x3n%Yv^_r zNap&U0#4Hgpax4f#2Ii$f-`^TdC$%RpivZv`+ZbAUKW5#flg>1gUo!xMreQRfW#(v z&3HFxM*!5e*9$Rc4C)0v5FsD?@-QfhdRa|PA^rj73fPDms7D4K0P1Ka;2(8}e*{7P z0WEVr=Fxe>qx19Ysh|OFa2^CFEBM%tJJi8oDbSt^kncfWeSN^AmvyBH9=H5yBH)(U z$>6XBmlq(nfCr;MX20x$mKWf%7PSD|wjC0JU@4RWY zq6b`Dcebd2wjF@@3ZUAp6S|wCm-W63)F-`AE#L|yvkPPyXcKQYIEX>H40ITupe-mN zyMRua0JWdHLE|;hh=dH~f=V9HOf#t8Apvc9fR;CbatUOt(@utg;pGR=pj$U2Q?@X8 z^gVmx5g%rXH5Y=E?p+>@5elIp2{r~@EGpc3q z_8u&(Kt+Cc3#8hInF6s3; zz_b4v&}JD}6~wjhV5`~-Y8-<`9v4V~I}I}r{{H{6!R`j(*CRm)k%$S zCV&!Q=Nc7I&k@xA1k><2vV$JY59B?11KxQw|6=5CX8`HxhORmUuN#@70-0(84G@BN z@gCHJrnhd$UYq8hDfOYvKO;)@L8URM6Ad0#1f^L}`;MX0M@8hto7W&sP)9T#0lDdL z^UtJ`GtEC!N{)l_07N5;3aAzIBKFb$|F6$C|17B2ZT^{GvaI=MLFp|}N(8Cm-xlc8 z{E4vxT%|$V2QPlV`v3p++~%KU{H=P>qc5Op13(8mTmZFaz$s2N(5+T1T-puWo9Jx4W!+W01FFHLk`qlj({xVy&4BIsx8zi32GDwPO6iHiI`QKz3CiHC{gTgEAVZ2mv)-z@q{WUgLK} z0MrqeL8Th9BSKUhK)r?5Szw7kkdv5Eon!`*0Xb<8C{!T(CNP|2Hv!p6ptHwb_!4l^ z-dISufTrw0kq8Q2@Qe{g^H|WM7v4P9eCY`)`+Ir)^gsnND5+s-6ECcR{_+YH{V2h!XP z(hT2w2{HuKym}c5-XO;605uNeJB(#LldIrCjNFI=#UrE?$PTAo;&jBWnIt*$`_z$2W3@oKO=SJ z|Nk#reu3s}u#}m{pZ@>_SF979stY!I&o5rZcH@G@E z46Y8Fe~9t7*n)~6sF(S-b!=i_U}!nX-|7M?EW15CJ-P!tKq(*|RKq8Lx*si!7`uZY z3kkrBg94Bj2TcbTy|?(=1wf{CZhTG)jgpWvc5^%@(YR^+rVY192x4s$Jdnz>OD$o9a~9y`h$tx# zGP-h$za6~%8b=CT)rp)-z@?u3WBe&_eJCiGKt@;KEdkWFDQ2vkS_v6lfkcIk8lI@= zFCh>*kmWYug`1GM$pT0k36lpGn)~^{)Q+vc|G&HpI(-POyo9b-?go_|*w-r`gS6lo zK&2n3the0w_SiqdP*vqxE*F9Lz-%UObcp72oJ< zKtY?_I%8A{JbGCbPJo;Q>fXXyTQ7VYK&cee_3QRgQ2;Gr&;YgSw}87g;4KI~DjrZP zzymlSPs5iqg3eC?mD1q7R{~J?g3c;A&Y}X^9qG|4`sXhw6@jji*u?+yf9ru#H&7vD z0ow`V0ZI>`<&DsVIglC%ePZ z1zyC}L%a*_6iUFoy91nqK|{cuJ}L&3c$XLM-NSqc?;60o3!ZSs?cMmNAn!_I@z{hH z%veN0Nu%Z6-~az#egn;a{Ve8hc>rdV@wZ$DGb;F7&Vl5wfeIi*;uJd$N(m^5)42{? z;%os=fI{vgLV-vuR?dARM4caXODuAIY#zB@MrGN0g zj|_;1CcN;(;>rmxjIoN!ViA48vGMo+m%+cmZ9T+z1bDr}dC+`R^P39LdWQngdIxa3 z4BTRaEi&tLl;{=}4FGLlj#L2E#}TcU_*>&Z8eu19bOtJT9Cw85V>W%|4^mpG;nVAA z(E5$P^$BS8_Hjq>fR@K`NAT7W(0w&6^&AWg&|@~5|AmzLf{I$$0id9{>DB`!#vZ+* zUZtS5%w3>q5YTiGX!8ZMM+1xEAFDyFrW}<5kLDv4hYb%HUV445`CkEl%Q;Y!r1d~a zUU!8+q_FtI4l^xUq>Xj|v zV`cyy7Ss9`yzEAbzvUbQND)Xwsgy^rY`+jx!8!&8hEMzgO#Cg);F6C=1vJ|I;{H!a z%_`7xpo9xF{SI*a3OFz@Fm#rvNW9>^`~UyTqW}N@^M@aJ30ltq zQrHor!qHix!t>%jXem(0|NsAYgNyDyx)H?h2Hol4#o^N}#NUzy4oYwkw|)Q>jlH(2C7_M`$N5_!lL=KEK41-8{H^Ez z{r?X-I$I0m66C2i7ZnN6Xf??F;I#9?kez|yC1~d-Xa>##G$H2!Qt#jc>VkIGfR17T zZQY;62MKhEmII{B0a0)|d-o&;}51MSS_ z=Z8cGI6o?YM$tfKd2~8Sbh9%1g4-&79-UqapavDR%><6d=iebt0G%wSjNb__SwUk2 zp!2-Ji5KLa2v9Nyl?WU!-Yo#tH&ej9kk>OELF4NT`$2KzxD!Oa+zSfbP97D|#3byD zCs?@kvi@mg1>YwDIfV|q5b5m$Q2hV>{~uxCk2V8fjM{r?Zi882PH%pNAyO8$0G z`=s%IypvrTe=B%rd#~(u&^Wl|VgA-8NX96MYy1yZ+{y^5CwgVK@qjZ%soiIO0jAIV z0$wcqtdeVNd}9o|*=wWsw(#poL4z{=iZzXposgEmGtP9eIX5Y4Sy>r z&^)@O_*uP=ZSHmKYLJDst!L`CF98E7Tc>)%kPzwU=v z_qrcNDa4oFAf*RjN?$sFy=MEu>jHm!12~^CIj-H!-wx_ZH~!BJk=o4P+5;+sdSyRy zL3~sJDw#g<3wUvqxHbL4nk|4SQ~ z8$hdscvQd<$MK0@5Y*cNbpk=*2+FW8G;jU?|B?@M3=SmvIw6+6?ri)&>AKfmaFkq? z0$a@A3hG;eqXe|dwDG_C0k$)xwI02)B~X`T@o$qVac%q$_HpZ?U;qDm^vYhB1nVwU z139}7BnDd8a|11X2!dSQ_6rusSHXeHzYpDWudaaBzrmGFg4p$X5?Fa>j0!l~AaSuD zq|^ka^rbsEF1Ez{f56{96`Z1k%6DAlZ*7Ex|3(RjEAv1p%D3@9SYa!uPVnfJ4S`B( zg2$h`t@vAyfktvb!4E3RKpqBmAo^Ux z)i>ZkPY?tVh2B zEBixF|^Qb z{t;5DgEV0Gz6w%sLe`sryRKWNf~ALVq@>_y#T0134Rhwu%H;793UWIn+z$yF1gIOTs z@aZf2_W%D2$>qQQzZCffZtfwS2jAPG;sL5Iz(-KN&;>7n0$okv(YZ#&0Msk&h0@(E zD&WKFK<9F=0jcZmQHcO40G(a4RtL26YKjWzW(1GpPLR`WWWTwB+I&R{t+)AGV?Zj7 zJAn#A29HiJi*DH)5Lpe6-YNr-ii_agTXR%AK!$ckX@Cwr1a(+FI*SZEI?sDFKa>Yu zJiyjXm+TxMFr9v0Z-fZK-OP%2L^!Z-~X3DRWWoVv%3LQ zyn^Bz)b|3l!J2&t z3hvf}8Z41q5C=(k^zzn2BJa&)S!V(tWN>Er-OwHvfu6kNCteGX*YCZisfbgo;+~2g}N5z zg-)n~?m5sy&B|n{zsccY>2@>|8l#I(cFZkIZp$$%=pvE%jR;S)epe)gPlD`i!y4M16 zS$BYdM|T8=N4J3o_=lAuqA6Cq_UQsDLjqjj;oDQ~6t8fJc{MhJuG; z!Rv*<)mAxp1Q~QPE9lS+0gv7S&^}H6e(-9A-U#SkO{QwY126kPnF*z6!WA;02nJ1T zfijK6izUC23JF+Q2T9A2bONppL465=g@h*fd>iP#^#2Dy$qsA}&RQ0^$a?V_TG4^a z2(UiOgZ#bVbKXE@1o$xJZg?31S_;7gIye{-TLl6h&=uXFffw)s)9EUpR>&S`Y;6I@ zmPap(IJoxgW%bWv1^2-rO-b-vq2(!JB5tt_DB>Usm?0^F@ntipOae8!L8qR8QwJy+ zpPT?n#*hT?5_G)=s5t=6fW54`yrA|3XviMC?h`zfS^_#75VY8|AsUpiz!Ut?b)S$l z+5}w+2af@PG6h5tMyZ3m4zc!SE2t#zWnBvz2*8!G8Nl{~XZVq)kVE`q~PN?TQ zp<~INJt`5P1l7y>ixZM%K>az`DiZivGrnL~AkHy>>IU_YK)So39V6H>&+aYYC8jS` ze*ORN2UPl(tk~UE02H&CGE#zx?g1>z~8v_HFu}2ji z0bM2WBJLc?zI{AKWhkt@1Ox^b&lQ zVy`#!V;uJtR3Lp+-iDik3#*5^CkO~ZZM5F_# zC2s&K8NrDVoYxV>31ny<)E$MjazQ~1YGY}<$oT+reTxd{>OGHM5AeB$;C0^M{WXx; zVGqkg{Jm2^b#mtv==O{rh=%S+4p3zTb|UBu-vok_u>=p?eN=p=*qa zME4d*udW2t&)5U*Jb?Ck!c#Hm>bV!3;LUZgDjZZ#L0bCYvu4im_uT+B3VT_F*dX~F z)SidsbMQa_s3J%W0hKm*DgqXeUoMqG+MJNpVh|f&R)UNNZDRrXvJ<_2lIaAML@n6s zr>&qN22d3X$q}HE>rDqpJ+$Py1im{9k|8~MSp!%hJ^)?m02}>}fo)n?91L1Mmx6S| z10=8XKvU8bNXqJ-qXG`kM zI=U59kbv^}%OFtHLPG|Wty)gPh_85C&K%Gf=AFTFe`6tl0HS2t4NMJwN*q$l?B4*9P$yShgE-tURpLdc6yCJOIVnu`dsR?mz5h zeZhps+17-deanz!XMbuijc#Bs2CXeQYT9+`$`5^bpC!Bb?QGFSjKX$alLR~G=v zBq5+o0y;ewHu4Eg^q_JG6z`xA16L&7TOh+Q-Fv`eAfQYF&J^cB^(;8hOF*adfJPao zAci8qgCY&!hG-||SzHhcU}teb+6&0XaZLaX(15yydJ>>g8P=-7*)6=imzbj1)c{fy zgLiHr6~)B0M#I0rTciA~2f-NtQuq-_QPnRcKq1x3I*kEOihAisAR~0>gHsgb%q!UW zG@x(<&3m_~On_zu@FpH`tbnrk;$}#i0?T&yK)3indZ4d&fC^oZ35X?ccv{g*#PGJF z=O!W7kKk6c+a6*fWrH3lQXtFUATBlP2VA>`-9pb;8r*MD4-sd1W>5=vhMi@u^nscnco+b-N3af zcu6;6Dg&$=SL^vNsG9?hNO<;AeGX}j!A4y`V~(I@DLtT86KVi8N;x%s?$(FP5izfjsqOj!14gTj)(l^bL_a=``OwZaNYnV=#W zzLy3Pxu5yl-wS~v7dk%E2`xqudx2lXfg%?)Hv(UyKXC^!4*IPHauDh`O~NgV*)#c1$K23cz7S)?+pbz1-ah~ z)(Se11LPh^T7c#pSf}?txU~c+VIgCDpx_0~X@Q#Dpw&x=E)sOg5j2|TqN4G_?eYKr zFP%X5AvXUM=Wmw<)q%}F#rRu!KsWfc9^h|%0P07fmI(*HL&^jR(9Q!@WM^TkykE`( znShcfaCSMjKZ2MH9_NS7HFv^xB#832r-OpA`G+8Xs~(62Eq@>fKvaNtA@}+-dRl(0 z5Af(MXY}YS0PjFngOt+Xej}`uM(W>#swD6{EG$qAAA!1#Xp>i+&?6W+d%y=*fQJ6S z+cA4tjedfX7Cb%?2eA04D7Tg z=rD0;_kmE#?*aE>J>XMd-VZ=VK@X?^Ij6R4#xxojEEWJbH6f zKD=149^~>|@IrmCRCkXGSUu>V@kb!F@YD*f0+FV4tiWp_=}hoZ z;8riyK!tHHuk2S)p#ZOMz=eDWXg&Zm=uzNIpitlk*?g%~08}V+f)ASo75uNKfdUge z;Eplep<4mT`(Ro0DK_}QkPsh$TIqkwA?m>*uv$wA)OvxQN(xH$9-!cd)ndJ@o?k$I zg3ob)hZw-iB|v_f;{<7PT7Z^*f;SL@2g5;gMIck)k%(4zxq%88nEkInYuUCr2DBXD zZ!P}&|NqOI;1Oids3No-0UEV>;Rtp+q>_GV4+`&2SUu0W^fSzj;3h1%o(EU1pm~@d zj-YS{w}{aiap07TJ`Ym>Y7S#gUyDGFeuqq7dvqRrxd)`KmsJbZYDAQSF2}0{TMaF^ zu+3o0D1qw%>@(OP=e_O##Xk0775y?uY=ULchgCL!su587c_|EXD6~)_(1Wafsq+v# zloIj@7NA&WjF&rr0u+z0+!VpSB4sEgxfJ3T978F+tcN~ATm%|k-~e@hz_;#5fW{pZ zUWgKM(G~@;iwwb8>lUbX0T*{@g}!I!3D3@hu$I9~Tkudviwd}A#i(~TmOxw#mPN03 zXF=*EaB2kA8&AGLN>12PXQIa|z(pC-G&cBX4N$YcjvdnMhn#D-2i)PtGL5ah7E692uHbsf0vc|BHjN?LK!wbVVo<<9 zta`lz)MbDS6~Oio^{51Z%7$Ln_wQj*3aZsQ!C42KYe6N8lN~6LAvcM^eGO2H0i+wL zWC5Gr4e5Hkd;lt0ntw|1x5z&G|No@}XgwloJ601~g~KW_=$sOGk_T2*Aliu%FETg& z|Nm0-9;j{flZU@u5ma4+j&5wP1XY~hkIRErd$#I>IG~m@6WDc593H(M;-JzL(p{4B z=q?iQu>8p14%yuIk-vQ}XhA|J#Mz)g0+-2*H=wn>cpY+WFAiE;nXnoXl@Jpl;R}mO zaP)$s@{}w%Dp7jF;h@V&q45N^23(+iDE$8ar43jLx}>33H0B*BNAde4#BLZ89fZ8J9V6U9_|NqOQw?SQ4l&0m!Q_xXASiueI z;(|^^hK6OQiwe(+Im`b4f7t=j-0S$yqxlC*S)fO+<4=#~AFTZC!H+Qv&4DI%aC;S0 z8-NT2FOLJAa=?HvTI7Y}^8f!|>Vk|$%`cI+;YAlL%|RPDAR|EcfkOM4A}{`dT=(i0 zIIHmSw}YDk%|CfdJ<&=-wj2NcgU?R|&(A@e#i9aP@(xod6!!?9_9SqoB*(#1!f z1qP2g<=lcM>Xrkgq9Au88}w2L!vI|U!55Ej!BZhPVjyJ=WUtV53DENBD1}zg_Ep4w zA!xGXc(MI3V!sfkBYH1^dW7ixeo)o~ZH7FZ0}23$ZLgPsvLzx3lj zKlclc%HRKAe!d7^5RSJ0FB()CV4O(~zCS0x19XX$D(H6TW?hi7&VwEYAFzOCzCAp; zWtcp=U6??3w4Qpv#Nc6hnSaV5e(**)k8Xof%N>lM&Pney$jwo|z&A(98y+ycuLgMn&Mo*Y~j4YCXU| z_h5}6XfLlm=S7dsL!dQ17hfL&tv)t*{Q^zj+iM_wJ}MGm55ArQ>Vq+WH_91aGCTmW zP6l*Sm&yfj(D#=A{{ONA=|obr@Mi-BZ1Wor(EdvYP|wo=WN(B=^ABeJ9#HcdWMsfD zP-wnp_V|AYyfgq*L-TKw5p4J!TlyLlnn-JkL0xZ!FPUPZ_SY#yLXra`+gk>weYV2#5t(`fSfXN%tfUF>>J3*+o1Kp&FevCbcd*T@NbjhYWN*pdKz?rg2l0B&}u+N z56u&xb-LegcpUs;@1c0YgYg2meh1B_ya3;P(haI&L2FJxX-1*tQVG9D>wy|BkRb^k zmN#k)K~Azb*02#AuApEl~ko zRSP@pq{S7vRRbQ?saObV)xgi=0k1g)Z+-{eQubOH)R^IK{S6Lf@ZJ~j3J=hBdT@2H zs~M6eVUFSgB~>IxmDhr=ypjjG44Z>;1CbpBI!yA#^96Vu6a{urDfkX<$PKzVDiI!7 zF2`+52j9UBy>jgHV^FgSG^zk@R)I<$$T~sLVl+1+)Mgdv#0c2sxE?QUz~dF5;Q_Gs zL1ma~I;fQPQOS4--Vh75qaU9gj|}nI;SM_QSpN(-RcI80%6G^q)ih5JCC?B zf^cZ~U&h}$n*r=P47JrL0A7}>DLW6GZ0fi+f zMnQF_#*44uHUFSJMxd!%aMj|YVu3vj)ObN*@J#@;Q4zAA3=sy&+}OilYZtySNa*nP z1g-TF;RdBn7f_f(JP(?lSO+>yz7xU+IT{iWhxmJinHU)O+tWer=nPRw@X)*fx=IPw zu($wE4A21t&;s5UcfbGs4{u+9n%W5-j2A(xmJ*tOsPea71p6G4DLpWUfT6d4f`@>? z6QJPK(s|)!0%$b4msS2QN*M+o&jPomK|{es+Mx0UW6%_m41xu^MFn}lLzEKWAxhY0 zCa^T<_`BE5pmAXE=t5_Y3V5v{IA%e$pLznQw1bXVfL7#zy#d+!2fE8-3V0JB|F&76 zl+|*ZzXe2t(lyxqpw1sSGkvZtZT?YKn$5qh%EzIjD&Uxt4+H%L{;UgpS!8s8Y{Ge>#Jq4TzUQP$8?F1Xk@gf7Xin|+|vI3B@Zf6dU-T*GpR4q7| zx{C!ox~)AxcYv^iW-vjFXpk>D_dvEJ!S1tT`~hx>_Od2;AlJd*CeV}Vpehfs=n?D< zaLWvOnjCoS&5sLG8P|a4L|dT7gNIT1r9v0x5_yo-Vy>?)Q#jVaJvlQiS{#~ zc{t5OprD7CI0v%oU-PiX_uC!^f7^q5xQaJGX%C!u7;hNfeys{hOW0@ad)6Yr zw(B7fWJ&<*`t+)C6K&MdnbUSkR z_Ifb+Kr;>KVg#RVNngv0{Ovp}poRDs`P+SYK;bq8e7q!RK{hD-yn9)gq2c!05;@$! zO|q*~iAfIj9FTBp01X)ZAfQ!LX5 zZ>A9A(J*$1N8f-89*AM!9S5jWrZ$i%H1L$EEx7034GjrU&jnPtgQF3&gavfs1^C#* z)!RT4>tzPGfdD;& zyt4;#2|2uIJre~fTEXjnVW&w!cU6PtHbA`)n14Y<@f@gnaQr}1@XIftVyP2yd?~2D z4FHXTgGvIAUe?#wKz@QRBLUYL@Hr4WRmkkB255HG0@T$6AAkwg+6^hyL1_d$&e{!$ z?3Z%?{{J`pW_bH0Ska48E(x5ZnWt4vH*L-_#Fu)>P*fXlVs?CbZV< zWpzSH{orBu>ywB{6ppN*L;+d31rCl*#+O2%sYvLsJ46f=Xz7ulK!#-Zm+!%oztB>( zm-qBlQ22o29NbR?jSV3BiE=8SI7c3ShXe)0DA3vjkf&dYfuk5bsy;>_*_!d^|9{ZR z0kHmF)=;pmpje54wwyroj1oTJX^<7lpje3kt!f4xWz-ETi4e9z3O`UW)x8Chqq`yH z5~v*wvI4a3AMCUmkZ-#&PGgoqK8+c))eF2psPPD>Ljk%YWa|}JsDP(w!1LYkIe89c zP^jQ(X)I?3=L9U5m4F+Uojs5<)8U!mcsMAep!0>@P+3?e*bB?Zi1?fiR*zaafJRQi z`Ry8bQgsfbWa?#oeHr8vP)LKim}ql=c1j?hAm#wUMk0b4+;u2hBP?fKvRj`&=W8~B^pQzxa|tMxC~Tofe*X_d!aK#MdL*gXjy7EXk4`$oT?zr zx0j5dOM;F&gU9xcIeRj`y!{07pX>BK0Mx zC5AFk2`V^15#rJ53~GOSbUTBt5~}6#Kv>4Wzs=dR+CCp##{A@Oe+90%_kd5@0@c^xV=Ulh%r6Jz z8kQS0#!%b`DPtfeLLv?}*$J8?ft>q(mjPVHfHy{hjRdXJfjX=6^h+0{j1Q3p6*oUZ zK*zP1pg(U(wy{VCwXtzipeh={X|-~-5U#TlsI*mAN&*Q47x!lU&-Ex*V28y=m`5yzap7>_yo zF9SkM6>KH%9nxo%=2spBs=k{mz{ zGVnn(phyDEQGlimL5{V&-~n1C1HLqA4rF8k8h#)xphD$k%3Dw=1*vi&W`J^DT_7kj z(Tsw&l3uR{wb8+m3p@2-kwwyj`F9>QAz z;Vpzvvmn%D2-O3jzCx&X5ULzPJ&5`J|K;h|;CVvu|`+4x-!9y37 z3ea2_WE8;g(raf>sDo=I&^Q*bOUMK}$x8I6S(oe0tp&JuPp5)?mgldUQr{9Ahz8 zfLt!u%R2KkB)Ndx33jvqsH*_ok@iLsR4`z)jUb^18incp#m~@ssT48_bISvCb=q;z z_?$Z^I6YqXf!gojxi6&aE0+5~l63}14dVKW{jP=wTn$gY{0(Z6AAp|kfO_2ai!)Kb z|G)eWnOgv*3B>$DuZs%wylX{J&ky@~*N}7oa{X%^@Y!gfX*7^`5pkZi5>oY7ctGPE za>XFD-2xhV08f&F?}+IH-F*ZaY3Mfe03A?tc1yg>1Umwh#8I!f zWA=r_Q2{)TKsLQz>H#$fa@Hs8JUH-%Q{-*UphJJWVO!t1KrM1mdiQ8N0y=2+utzVe z@=1taK`lFs?apQ51pF%c1MF8wi~JDyIjOazUhui};3g%g2(|Ws_ye5QJV4nN z?2nT#nj(Jxf4LWtl0c~m`TTUyee8Cq_py8QvaZQs0qp7{o@yRtkwd3W;hF?jT{ zDuEB(fNGTmX+3clO=~$=>qLlF36DP-K-~T!CG7YA*G*{Yfxiv3)B&3tx;a3D z;}#y>QXZB!OKc2Jwwx>#Fa(v@4#)xGB>}1(I6RsUK*ktBGlXDwq?Z1MoTu{oj7P5r z2iT>(Uf@{~$Volm(MNl*D$ovXu*X6Dp4Zb}>@WKar2Nnd5P9w=)QK&2mO zc?73NC*-V{iyoFIYCS;4j$b`|F40HbdHt-B|M-o zhpYsBy%V&=K*0la#06-M;Ppz7K^`FgLRSgMgIt#NAGrcYaUXvhXuXOD#(JL!&{=CQ zTfl`WsLt*7051hMfRq*8pv{$#qZndTz_kkK3~tb3hHlWbMt2P8Fb2@_63c^irl9aP z0J+)2qdPzY#N+Vjjr{ zuHeym`t=f!Cn2kZURZ_v{{K=H=1DaFftD+IV63M}c&!U^Qh*24V;XReS%6pqAp0Xg zqx=w$DS%p!7aw?lX9QwYGC-qIz2I%m%?Fr3D?GqAg@e!P3-IWU&;WI13P3Gk(A5PX zH*_Ls9-#8l0~CC z1xh~}Ap0Xcx&sWL0d2w!50C^%fIw7$NKMH#9LzfDFz6nW*q$2Wa%R z8`S3NjR2p;nBmcSyLKWd&3Sk<9|<`8;#lDC|1Tec0t+p@8G>4vSjxz55AZ~)1IYIr zAgeq;R)M3<0_@6*@RR^fSYVGsHGxwXSd#+|O{GXx709;+u!IfM3cAn@mSZhI;SNdI zAaz8#t7Im%GqbngKPXTlK!gCO#R)OoMg>twuL7A0UKr{Cs>EE7JZ%87i^JppNs!wj zKm@7-!6&(bZsG#pAP#ZaOF?jP1ered&^+bQ{EL-;&SC!ECPoGZ@Onp(IS!!9WU@hd z476VFrXJP!V2^053=!`^uda>^j0FQNhR8YG2+T+t1x zGcm#iQsQ;EsOW=MO^AXc734SYS~$2_pwtfPL-iJeQ)B@s&Nx6R5@I~)VrJ-}-QWrp z64;=HEBehJ8Tq%J1epyw-W(L4;JfU>fnfo1AS7{sj+-t4jR=71({9KdG$`W>fJW6o z$sTMjtfDRfFDM0{`BeZql#PErxFH8x>-RDmTx~!%4MAHL6`+y`+%_%n_jr+6s$F4&c_?7ErO(c>P$3 z6=~qndEZ0xGsv|P9v7c^Xnuz{r5YZz)2_rB&2!5qxlC9e;*6TnAS`DE$2Zc5@gUC z)F1{252#TL&W)fUO|Tzch=Ie4tT4GKPR?F+u!2;?sC^*FHJJ9rAnMMdF-1UT7%7Ds_D3x8=1;&zsRN=Y9Ts8&#x z0vCm#RsndB1LQG<7k5FarW@3Y2PbI;kXCRT9PAU&Kq$DdL-^zlXu796M+MR_0%wUn z@FYsFBin0XkQ*()Q-hG3Izjh_S>C9P2U!NrL=hgKx(94#Z^SQ9;2_#K(B>Pori9dH z5wMmGxS@{HC<1#)M&Xp#ZlnJEuc=UM|TVphetOH6R4Pv@UT2rZ0B+C z8H-0ZkC8`rh!MCO3~d{M(g7&pykO3N3`!_~2Hxg?dfEw~1~RngX*wS?TJmC^+wcG2 z5iW3F0z{yMFMr!DP;g;{aRjK;0#&s9&EWe$pxaCwpzbtb^60f;0`;O2JS|V~H-pX~ z_B{B2#k1Q-fWx<&2ei?aiKCmh;3+?YZ?A|z>&a3>pH3boug(}Ij&9b-r{EzMKCey_ z@MsAn)O|q3BB&$sqSNyG|JTnzX%W0qLjyDrr~t|%0-zB~@YvvsR7=q46R26;4O*Pp zT>_e1cTo}W0p05UdfE%qc@Y1*{{H`x6B3gk-=oJ5XgtLMl)fxL=?lDI!UG(ckeC8@ z03q2Al$(25&)wkxkA8Xdg0{bavds%_K9EZg<4T|v>Y#l<#?Ukc?Inx2Vi`{l^ znxKkaYlW8BXGW8 zfaVJUug($%j&5GZNBkfmKCez0@D>?J%7NqyP)HP-!SaOxs1*j@$*utkGW5*hVFpQ( z3ZS~o092+(fHEsMb7;Jt_(EbfIM6Q61jYA@Dko6+3#xZ|Yg9ZuK!L^z3c^n1mw&-s zLU6i*5h&qTmW(-e1-`8Vln%iC3Zya@v_cEC1@Z;wS6Ga8gNk9$CMb|YJwW63;Qm%8 zs3Qm8hW6s7(xK4>EZz)MN;SYCc*1)BHl3|9(2)^q(8nu~xAEKx4QZ;H9RP4iJxm z2YSKT#{!fpkOp2~Oaoc51mr_1`0wXC()=e0vK)K-5#>KmJA(e(X8-&DYijvVl0^Sm zf-I-Nf0?!f{ddg{yZ_?R=4T+IKH!NMM~-gR_jkcHtqLSxbTWd{4ER<^5CfDK!R3sA zNAnSh!;q#DXwVH@t+5z=|Nr{@i&&7w-Jpa6#UP_NUI~R3}*Yy z1J*7K03}jL`2cdti$$+~!}oZDYFAj{;P8oGkO`y~Jdy!!sFAmuL{{OlUWGe!r z+8>5#zr!bf0ftZff-EY>TvRyHK_MaVA5`AK%cn>QNPIv~7Xyzib%J(|b;DbTZXlbd zfNVvzFA%f62ffV@RF8lI_Vx#e>EL2X0#rYOi)jmJ=?5M$i~yBU(3ae7o8SLm&jeWo z#;Eq;EB}hP{}L?!KxX4A|9V|i7I=U+CxH)qYJ3A(5VZ!f)}|LqcSBeCf$B&X(7bau zhet0f+iKY4CTLX~sJHTB@lVj*uAqp8%rt>!aXNieGC&~!9{=|MwLB{L!w+~gAAbNU z)1fCnc_)F2n_LEuUfK7ipkqp9R6xURkd=p^L4#iKf&$Q?DfhR1`)_#QwHT;*Rsl+9 zFXrxs%x^_Nd-oL{ttU$&L8C|D>DX>gk8VMaZck`O#_|S#b1$eX*$L`Af?K^cDxk@G zb`FnT9(I>**15O%8C+Wrl(Knrim<<)4$d^7zU7N6df)%QZU^O#43Nd31~hDp7Ti?< zU0>M%>Z|p#a=JkS2euUz+z=CZ(f9)rLf|?b+&fbMbu++2xZvX@6AW*ID)Wrj(%_z{ zNAqz3@I_DH!FljHJCDwPASnmXIbpq^8~i}6=m1b_p}?ctjl-jx&!bm#r3ok$MN~jz zAdpZ5uL%Y3s06M3n|TWoW(uI1wA)7|02D!RW3JwsPQcS93X;}K9AJ8XFJC1?uZ zMZqL+J0%lBU9$ZB|79$!p9szjDC=QB^VOjKB1&5hlcK&7;L#14cX%n)323*uYyatXRi!Go{^PsEtx-^S7K)1br*G|F5m)XmZOGc7TvxRir`n*)nYY6(AlvpQs01H=XI zzQ)Q0oA`PQnj%n>G66Ka2Z~>C^AFrjmv|8s4w-6JXgL6yw+T_ncp3Zu|9=ea;HnTb zwGIk(aJW6#h!QHGa072j0`0>*@iGFm16bGm_y3nakP<0cdQboj`!~NS0F`eUpf+m; z$n_P_Q??`wZ-X{q9tLk+c?3EpXq$(pTWq@;kqSq>p)6UgPgQ43cg>$pqd| z$ztf(@FSu0v4`b%{`PgCVz~2zhvq-e&JP~n?}5jR75{lKo&yzvmKXTjTbV%nS3p%- zCusWbI16Zn1gLicS}q6PQBVRpwjLC>pv^g#J-*-aIQYxnL-CMDFN+|kE(XsX8@yPj z16ij6p4b4-btZsz4nWFQP%i460$myo+b02CMBSaElHt*Oq~I`QzSaRWicxB|1GHPf zqgVDgCuq6o9PsKy&=@(mYYE?K0Ubt17|{tHWCD+^g{TB{dq{NpsQ7sFiav;iC0fvU z5NH7Wh3x-t;B^KXEeA@#i8KOKxCIy>5~bq-br@C~H4jC-qbn>3Rr5t1%NJ;5Vk6u=nV>}EVmKRFbf@&&A zAnX90;NsCMo5st^@Uj+UJV-Uf@YA-L(_cO)_3-HB^+GZg#j&6pM?89EkAb`fI+(%M z#{2dg{#NijcP}eA{46h&oO=mcxCb%y?u)-Y;3EDTgsO*7FN}Zxe|h*1c-aI>{wZ@r z>ksv^{*eJ~AO#P|a6&3A(84-JpzHv*u% z$pOln93I`QIxj$1!?UQo0G02cGM~ev`G~;b7cL-U4xx=F@wb7N0efKF-ww$S9s(Y% zCrisbx;+9sx&tC0EfLT(D5wG9(aV|%PW3J-klUBpK?wzPO)7Z6^0id#`CGs{c{)QtgVCT` z8s#Vuuywr=;6ZH;k6u~pg`n1ojLM6kACP7NINL~o3IXt9QE&l<-s$gU-696c!Z6S9 zf;`g;&ZeM31>_s>p(w{)z&lMDUZlE%&XNK(!@ETpA?{Y%&%^LC3^YA`!|?b2my;o5 z5h&?_zYV+1{PK2Qv(oXzlntW1XVL3&y3kASLHaNz)I{lG^0 zz~czu$tv)gk_wPt!ADhs;}KK~zW{HGgAY-Fs#>V|pe1)FR6sSOk4nJnNiSqTZUE-s&x?T9 zCRKo%5*qMkZYOw`2y`C~XhF-1t>D50WN0UBdJ8s(@FLRy=X$C_^tC*!JWnC{1LS>Z zj}8`$0w6JPFoFX#0~Czl04)HqzzavfL2K~hIn*^4pu!#;$ncdoFK+Aq{{ONJI(mnk z-+EhADnJPa+(kJ7IvcO?4P?9X8pzJHUMLN_5f;3hV+!PK1<)MqMUeZzZEx`O4|wFn z!=qO;^DU&>c)=ir6#N;W&;%`2_vrNC=oX!F4zvK1zf}direO;7uxIdWAY{`{ghaP& z{yBaIkKO_S&?UR4K{bE(9O!+j5nz?zJ)4~o3f;1<5S1Drm4#51;4NI8pyf<4pvjI1 zi*8vth%)f4y-HwZF`%i_2m{a*G)Rj~7I^fs^201U z?xF&!j2J-0odCE*0`<;8j2F=}zWwiJ6+H{;hWMy}j_?wJd%n{{19Z?T_c12sUj#UA-iT@-}V4)paY$~co*z#n9rblOW~e_9{PN|1-v~1WV^@l78TGo6fnD& zRela6qk8oAKz0#>?b7@V2@i1YlmI1Z$cBaDg<&uFT@H^zJQee zu+kBf1{hw1JA=x4P=mA^oReX9VMGOZbO%LvfD+9aaQk2M=tEGMFZ*mK55voyU?GI( zKy4aOP(czgbg{wl7VsUtU=JOK^yOh}P*)Ac2JN;6vwI!EIR@0pSDX#;{R@jv=pF`j z<3QVmz}?GU*6*_*Dna1{b_F<`7%{YgYy@co+2+y9I#(4boJ67F1Th+v2ti2#w7D9T zNEASf7y3@f;q>w{s8|6Xe+QcB1*bP%c~CllY~=#2K>+QKe7PSqI}cXZ0xcatr8pB< zDJZ2vH=MxLXCtWx9i{<_HjWpUI)y zJDNLSb7u9E!L7j;n!o?Q6#j+T{^M_x0;TEZHyNNdS^}tzmH;Zm!DBt3qz$(M!~r`2 z)Kvv>z>7^l#TAGHS@{8)`F-mE@c?+N4?NOR;L#1rRz=`!1#KyT`~(`{Y6PXh?h0^k z(gT$20>Ht2+(jh<%;>BEt;YrR48Y6p!GlxaFoh*o)NE}4&DI5=a_U78*l>_lozOt< z28~|8&sWJ&N$_Ysl5yCh^EhPZM7QbnyWrgZV=Jtsv`*vq|Cc8rEhR{U1EsxDW{Tdv z1?>Uu765h6`8~RsK*I$&Dv%Z~*iCX@|Nnpe`bD_L@Bgp2f(=BN2daNT84O(ivVo4G zZ+yc6?s~3KVF1yf`WHlZx2On!X%7dF?f?sq?g#^q-U0&;(0YyOpaUSft$n(kIl$Y1 z!g;{`S$@ZcpSt|5o;(Z;p3OfP`CIHE;{J>f2~~&$6MxG_ZUzR&ouJ(BYk82ry_|=E z!MF2}ujUEg&cmMHZ+IU3VehMW(6^Vx(ie0n!Wu3H23P)VDwd87e{}g<=5jGGI5zyT zDj`1_VHr+Kp6!2iY3A*e? z0BnYb0jS_*0QJ-l`hd;=dd11W;KaX8gt6h5EvO?O$mpqg*{Aci=l9#52Y=i9DBkj6 zJmd&nV;7=Q02;FcuR#lN=?DSscq-8F=(YW<0IJPxAa@J+fRi<76E+0S0){a`O)s{#H*=t^v0mK}%}7Ww;uDXQbv7l)8g512}FvSyWzJ1dorgP68#W zZrcSSBiQgWqhuARaRCXs z9>`|D&KAhVa<#-GDs1Go^m-XrtL^%OzKY@zi`>!E>1GgpwK&}AyuR0-G zksS}}(RzYv3s7Sjw76Ial$&}X_JK+-2~c(g*QOu_sMu$Cu>e%gf(K8#eN+sH_AERg zU$TJOpRj}Q!OhD61&?0Y3|~-GK^k7*vO?g+(s%HN7ie|{bY>=~*;UK}Il#yrv`p?S zxIyQmQUK~4dw@i4fU->|NTd@qhzwn5=g}RZ;L%;6;n5up9w6obHJ=2)OHaWoJHep^ z8c^YHDFH=1{46AJ+L{8c@4;4phHAhyboUhKP|Fl>O9vzw0FneXbztL@(8f{k9`JpI zkYV}{pkf$0OuyL+HcZdUF&Pw@JSrZ&P|H9a+!sQxAd!h^7J={F1i236%3juslR(-a zbp@ow1WE(9U!rS+9F5omy|NMNuFe(}$hqo}Y7mrC!Pi5;3LntAnO@cdD2L@KLemJu z9iXBR)ZYe=(13cVAjXRt@aO?(XaTf*ACX2{R3I6mM+Iw!fLYt^q2SRQpy1JZlD`FX zybO5I7gPs&^s*|-f|3cSx`p-PLDd8}*Mcgl7auP}d=73`s~iHitF1wK3sQY?Kpn#f zYLtQ;1I|jvTfhziv(a-YC=6g}2;_zr@?zirgAOH`0$F(4%i1RcbrPNi_^lpL1ANLs zL<3w9krO=>z@u6q0q|N@kd@%Z-WE|%>j+X4y!-~LH@acIh90E?@i_EsjN_1*0kAiY zLk_9}vwK-rPe7y+NP7{KO13_SgcTxjfjb?YJ&?PMVbK9{PA}^Z9psWi8k!0q8epja zR#QVtiZakC4Y0{o3uwSIfD#!f;6Viw_EgXVt@#2iJh~$dJh}@(TPOJY#6S(gZf1|} zY7X$K)IbZ5-mw23oq-PBrq%~QRSRUiwfT{N2ji{QZ>1t0oq-0RT`--$c7R;=@*b$@ z0;PG7<2ylUJijG0ka$eT?2zz4r#l=%b|uoP*Q=ELtx9m z;nMXKl2pLX16L{_gFtb41LVzKR!^`tNI3*{1~{(-V`zH-Qr_93@&ZJ|4<>3+0iXHW z-2%C^y|YE-2UH$b(R%c9Ecxba)>$hJhA0$6LT>i-R-l z@fH=(MGr7G=(a}~8+3CAnBB{Jtp^rUJ>WakK*LuYFCIKbk15E3<`5%6WehlNgGR8R zK@926w5WiL2FW7@dA=rcki#-P#6Vb(gWEcwq94R~(Fi(uf#e|f>AdM`c**dR;q8}t z-#}*sf!D=?PI&}%`qm0SG9}ny@UwnuR4PEL-9h2&18QCPfVM5a+zOg5?%V^u$q{sz z1Nds`<1OI(fx+Q+yhWt~R2qQFfL_)~-JmdpBwO(Hjo@TE=Mf|f5d|aodg0CQb1{Jqp zHbxx>3u$Nm@Bd#Pa0Iu-Uq1N!|3AFcCekQU)xR(-0ry_Dq<{Z^dG!;x_li7T30^n9v+<@4&A(ZyFdeo0S2un`CI3Lq65?j0fh@>Q;`9< zla~1jbdm_D;R~P6Z8=bSAJnM>@5wRn=#KF4XuVyc=h6I|u|&k9`8QMP0g!Z-N4FD) zN9Uo}i5|yURKSV8CKa-3#NhQjP_Z5W%8B6RD3E=@paKc4(+l4-3|fy3>Wza}pK-i6 z#0yI5E-D7#L42?zxFs;F85~T^QosMdyocOXMeARJ=3_wP%_!@?S$QsljiS}V(WzW;xH{{@5O@BgpofxQhU5dCYAeTvBIgFU)M*A;+#5ALVK*8c96`2GL& zN$mRh+rV4eP}5s4>j`yGHNc|sLY^5CMc^Sla0y}I(di-3&AV+oINfo8(j90OD=2Lm zfCj!n3{WBkO$0W2f*OlFDlcw8R|0^J0(b*D$+D9J6eNXkLrSGV`UJoRbTWdHlm{qu zph*hU*aasK&?ah7{BXQz(R@q z)dneNUpU@HEn2}NJ)ps#ZdSW9pn)0Q_$8qECD1`(pxoKZI{!B);6bf?(AXtxQVcw8 zq5#TSpmq*;%p25NVR#Xs^Z);gXwV%k-LS!*7cu$ZRC-kG_y3m)|Ns9-_^;PRWd>xu z78hhP1l+ajTm$Lv^+IWIh6fFYf+}fH2@3KVsFH@Up|_H^fTIa?pM+H_$iE^gF9PqN z`WM!Iht4bYvR-%r@*Z?t8#0v-Qv>resJa6A6x6O_cu}td8-42p9l!zVg@Y1D0I0D6 zY1@mayx0Z0NeQ;21H3gHyci0+6IlT=R?>Qszkd(7_Y5^Az@zym3x9tuNDRKZ0Tc(I zrDz_#toqMDE`?S5AV<9@=7ua~05@(8K;!2aJ3^qHL!kC=1!Oo9GRoib z3=~`7!;3pXhXulyL_k+n9EWs&7jC-Q2~w2LwW?D zR!TZ_1sJ$U0MB4R8d^P&vk7}y)xg@IlNPK`XMv*~P z4LBKq7%w8g$pD%_8;^j}?O~5@(Vr(knMhV@ArHe#cF;&mx1)kbFK^c}(8`5_{Hp8>4Yc0u1urK`DuW$E@lp^}7afO; z`-0t%Je&{p%f?2iUryXW_Y0)m3mwMqWtGI{7l<0{8S$G28Gdo(K=#W^&^b(4vP~~5 z_j6Flf`R}vyaHO%@`4RjYagh4h%W$pMN=Mu3<*&|8prDdO^AV}wqK}2jRQBGz?+f5 zrGv-IufPBQfALe`_y3nyAkzt`>pl3})Ib>yrGDh!#;UgtybFg5QAd@szi7?@6}-n- z1=fMK;h66H|Nn(S#-IN$q!a)Cf8n<7-~ShiXa4_xamMt|{};!l{(=sniQ)h?r=dwo z1a#a=9r*ZUP*8M(794c)%AVk5=;n3b0B$@~dvvmjfD(N-tLiCm1*8U|T2Gc$gO(4^?)Lv0VpI-nq zFIiMxTmxN^)(x9lc#+Qk`~T~s;5G}2e*QMlRx)gRIyynaWT3fEP$m4rogXO!fYxOS zfLjCL4v#jvoB~2FUkF8C^Fi<;Nl*soc=4GJCf5l%L!&!K1-eNjivRcjm!Yr)2x#tg zgQOpn{ZODOoNf;ek8bcDTnmrxVh-?m;ve~2UNbN-fX>F@Zvk(->-LaoOd za3RabkrqILaz1#*AW{#y0P^)^!vn9+LxKmq^s_`o;6=3rXrvmnIvcz^xjRP1;`Ic> zldpR~o9{p?iDARdJ}MF~_`pViN3_Adj#06A>G=Quf5Ve6tw1F_mXldJvPrSeXznqIdeMO+I|AL+8qXUXU3CMQJ7!?B#=%t9@wDMaJ6tAG% z)(y&c{||UH|6r;)2XYMZ4w(|(-~V4v!sxGo=Md4(5Q3aapa4FVp!o+=Z3Jjw4!l?# zd=6`j0Eb7ni2!&VwokW<1&2pBi-m{fu~J2loeH3FdT?_9Jcsk*j3_9$T~t8l?yNZG zqT&JGk^zZ45Es1c6~cXSf#>)Cm(j442+lsJOgpcM}Au}?=1P^%TRU{Ii& zb=L~;f=SoOx4O(P^ zS5<@01_m7xJ?%JXt4EEB1!zA9cqN<%A^X0WU!(TE4iJ2(E(TAyfo} zI>_<+|I0r}Yt2DXf|MRwR2)EMFnE667BW8%nOa=~S%lULp}|LlLZ(>w1zS`=OCi6rOYLBOZmi^B(WwYoLvZUhkHFlcHY zdSwP^G97d-ghww6Kd4I&3NG*pQ-K$|O+e8BZEC|V>xJGZ0oDS(Q9^Y&C{p-acY$sp zK)o3Oe57@EfP}~QL!dRY{4MuDE8}-PV&!kn2dka}o@fS5GJsZ~f%=w^;ZfK?_7w01 zc_4X^-$C+Vb)dtuUfFvbd}QzO{Sat}Sc$R6#m628U(0*!YN+3M9o$D?yamz+UP%YL z7QFG%|NsB(LBe2TjzfYJlEYwDLawSc{00g{@UU*@6!0)F=vv9c}ZpAqUIvW~%-QERIT?)#Q zy)t4T$3bEodX>m;{`P9nq>|-t{`Lc0pe+TESv!x;J>a9&J$pe%0YKZCpnM?k;;a!d zv2DH-65F4^K>;(A(W4vXdItCqL;+h1^k7M3F}IRK}{UKZFjeEioy{Si=A0cweZ zyRjb)iSb+X5|H0OBVtJYg5*Sx#v`B%3f+nclLieKmi_ql|Md;fv>n75tWQf&N*7S` z26V(RsJv8oVR0B#x**?j0LjGA{$V%7*Dpmur9&_8EU;1VSOOPRpng^-=u+*shd@Sw zI$GVJ);Hv^iaFp_93J39S9=zN*1?tvgSRh&FUbJe^)e0Ap9Rf*fs1756cTt*6v#Wv zzk{kg=u|Jf+JP7gnvVt*u*lvohpGop(L&3Jm+wH!RXSnQ6VOv@I=4XPHF{YO7ehh_ z)Xai4S;6IRjEcewu|q%q`#^R}feT@%DNv(9MF2RQyXQdD2gKBuLSQS8d34@*`5e?` z?S|=t%3lHrf_(|<|966#(>xa;+dZMvYTz?wVFx%mfOg=4f(z10M@dX7;BFms{R;SW z*#HiYZVB-1UY6(h`@yS!d%d71%nDn9N>xzH13X|4nco8^$~)gdJ$tx0kX}iIfJbj3 zqle`^{(f&z2JVey^yrM>IL5*SHwU_T5uUiGK+S=awjL7vyB;#}H=P7UFFe!&IXt>0 zJ-Q18JbJ4bJuJV2j$1Bb^yn<)IL0EZ@X`%5o!HB&RRoC`a3dI$UE@nU;;qd6KWAw1R&fgE-OW7L+EoqGPKuH8#P%lfbYB_K;wU`ND&ZVxlrPaq&K&j$yj7&su$fdjG!oUdPsfXW5Xyf!Fu z;X{m|h_es}8^4SL zXFA9-Wl#wS?vlZyGzRJ%@Umc}t42T(`FgKMFYE4nlu!Z>$ANmc;Np#skaO0~LkcBW zas!$DvL2k*A5o!%7`7{iEg+#0^pI02oCU;Lr_`62g+Wc zQ*JvwIF7MM!Oa10$VW1#0IxaqmL9#;j2@j8ATty|bulP0gOU&^JV6-*+$@9LMbfqt2uYkl2 zD5W!ggp?LwDbQKru&8*w+oP8?8J~l;?Iz%$P@E0|?Q;T^V33=wd_c=VVOg&LylfgW zt`92f3s4+%DF-ElQ1hKCAqO3q4Gtlse0K<%?;u0}pq={g)cyQDBxJx+kdwur1;Am@ z)_ib_7FHlaFXzFg^+8=NFh=Tcxv1QL%)e=Y_5?M)0XHE!*Ff(3>4nm` zHj}{C3xS3NzaIp5WLmc{gGLKMOG%(96SN2vas@Ms$_pWTP^kg!IDys!A7=q?n(^r6 z{SLm55Hyp+8}{QrXroIosO67p2e|vtx{V2L$8iV9*&v{`*{~}PK?ia{ij5l3Rn(xP zp}Ik*1a*R%Qr)1H(VaCa;8m!Q9l@ab+~P$!=;|1RZQ#=$!RfhIMi5l(7kG3RICykd z7=UhwY<~zUUMxTJx4#CpMLJ7BCob%PtR;hX7eR#uIIV%(^q{fC7cFX_#x{7m54xdDHh*g%$Z+^!hmHoIat7=a(1L9quq1eKo&%(1b+10tqc@7t zqchUt7>fXx2WZL(bV6RYg93B~pM^)arvu0nu=zZ2DFi#x6Fewn0Ls7MQlk^H=V!tT z(YPP~L0h4~lQ4}(KuH61Etgy-C{@GT-r&j!be7 z%pCBhCjM<9QvVx%aq+ia{P!Pn+c_vcAclg5#7qh3_C$f@(eG%UN_-|O$=tlz7W3zG6_@ycY|uHZqSJ( zkc|4$=+FQEFQ)s0OBRLzF!l4>um3N%{Dv$TLX;<<`4rH37AWgqK%?y7xe)Ny5KxZ+ zJX;LP{x1XtKuvwtO{+muN1#**It$MOq#CrE7t|X76(f*F;tLm0WBfRa3V05w-4V3t z2fh*}1LPpkerNRaHTc_(f!c&9=LPa_V`ZO=m@k7I%~Q($A~+D_xnry^CxPb6Sm*u! z|AN8y&;J*%UH|@n5%&Jq{}+PZfBwIi^B)vcth^vc_wwpBBQKZ$wSE~u7J^nwz!;zt z6c}Epz5@BxMMa~Vmuo6`@=U^`lXd$lUWQ|=<&&TjUJ$o<^zzPMg*>yR`4ZHbe$n*x z*Z-HYsH5p;&Y&*10nHdR|6nW=1C0*~@NZ{G15Y}_PUm}Z&KKlKa76$muGnZ*W`nohEQJbQO811$22B;<%|Z9=)tvpo=*mEm6>@HL^U)F^I7Elmdq*C_WD!;6RJhU*3fL z&sZh}j?c7%kdt8q(vbbIi=cjHX!vzA@Si{pzd97XxWbRQObisC{NTfd1(5BwBT7Ge znIzc%p!nlI0U8?DKt%sw@Q@by897l>6Jy{rK% zK*bBFP6Jher=Ea|7v+z?{=c+CFJ6%5>rfIV_{_;tTS&CD9w^ZPu@pf2s>;A=RRSrk z8XzLe&l40`FW5amCpm)7&l2#kv@YEVI=OQTDD@!EXA*56C~X_S(zXOj+P>!jwr{#S zdG=X?d<8y#6g=kv@*gxWNI>%flHZCTc4?#9wHM^K9T2~PNJRR;;y>*6f%b7gQmzDY z-eH2+x7!WHZzS1g1NWachz0T=G_Ob?@*0vC``y98>49qHE|3=?yDbUCA8z{$pm|dQ zC2z_@?7QKL;zi=^(+Bwq9Di~iy{z3QAo&)uBnOnQ5ec&t)r#XFFC8KnU#RBax`Avy zs9ZppFG`mASkeQuZU^Tt(8(SMD?Yh`BWJY>N??(c9_-=ar3Yex(gR}|xGexaMqC0* zTc8GFt0}6j+d<*CiD3AdgKPoEj~a*tvJcvJkN~$GkdmGV#GbRxD8AbdvS$~_9vH@( zzkETqfb9dPM2LM_p!@|Io{%8i*64Eqhp{`VD^`MB0Y1%>K>EiLpU}1mIKQFBrxL`j z+fFDxCMiB~+XsnHl+3ot8SJ-g3hYD6572rPlHWk>AVgwiMYV;j{FZYUIlqD0Q3&&w zI--Oc!hDZz){pZb9S#l;%M&FQ9^I@TKmwL0O2s^SS#Lre4O#aIay01jI~8b?4I&CU z+5sf`AMSOHh9Z^L(ZnkX@kN%f%9)jvsu9*^-yP{=ddNpQ#qqu|;n` z*tB73KTHNEmt(AQZJ_pp>%{;6UnI2s`~M=^?$7@h&p!PDH6kLefE)~6;0G$8Ud+u$ zYedK_05u}gIzWvG{?;d;=1V6p{{qm;R@MYhNMHEHbm&e`j&5EXkjj(%t>A%zPS&Y& z!79yQDsvGkg}^FHlRY|F>mjNFJRs(QW<9~jr@YAH0tJeTia;v`d9a_Hew;lzh`0fA!kM05vk8TU_ zJ*@E{u}&Wq1)p9PZqNj&g=gnQ@CknhU)lRGp7OZ(%hU2geL2`kmY?|Bmw`2W_RzfM zsd>@!`%TY-Kka=KPkAu@^053|=LK0B2nufSoaYN6NG6DYyBs`$30fUzd5XW?8*CWJ z51^Rn1fQ4!JABHc^WN)?UcD^dpmB>A`D_dfp!f$*o`RSDgAZzr@aQfU0BxT2>1Oun z_LlGjT|oT@lybl&KIqmrAIgNNlu{`PK=0?l)v%cNlEM_%+`JmFz^ug)1X-Um6T555o%BqZ=+jQ}L= zKo`xyk5+-7QHQkM>@#Ss0H}lkosK^lG&~1hRSju>#HcvD1Refwc+&6^_<+wB6K%lZ z)CHlMAOHIQ@*VneQ`Gu~zm59gV*ozx6?9e!Bz#Vwh0jM1%Ny|U0Zo^HRwF~ky<=1a zUi9!Ig%7qfXpq9^Fmm`5g9iNYhEJh2IDE1oRPrNY!eCZk;n8j2(Rm#-9p3m0be;@OjZsLP@xW9^kR9DzkM%Q3+Q&z0D*4aNe!S1mA@6dsu6rl zGAJ8Ei)wIz2P)zuKo>={*MM|_7AAqRM0bILhvr3(&hxMnWE4+%^zsOU^E$}M0w4ms zH3&RJ589c14U#LtwHA0(w;Ocs8+c)PwSWiXHBb%E4qk=U30iDkqT&Hsk=bp^H-i_H z7fZCk2T*`Zqs}RisTKI*2*{=rP{9H{krm}QRR?fU2M(TY(c{xWbvh`NLSKCapQ8#| zwhSH|1>ZymK1UREON>gz>t2wP9Y90w;1vSLAzPHd^%wF!7o<~ML30V9%D59WiqZmY z=v2I10V+c~Z@u&f(HEb4^tOXi1E_R-;SUZ@@Kh9NLb$s`1-y_Ge4L*L_)ei0b1cA# zdMbqKgHY`ds^R{x|1Y&cr6Q=NhG4Yv5legIIB1bJ$YN0Q0OB9$`A@JNEWNC48lcf7 zP}R_51)6{>_4VjwHS~uz&%g`o!9fZhx9^+-X_bI$Ip`%+pv%-j2?BB){Dc=*ok7zK zuo3zRFOH({Uu?SvYmcD0AH4PiZ}|@0fe-=CZK$Qb{MXm)X;z1z; zT|QdF1<9@k9-x_1(78Guj2AsRJtRC@FV%5?>M_vLO;Ft#0CG0uoGvV`?Y#VY_KSQo zaAL{0`|JP9&5){re;e!WI(`Q5&A-Q4XI1et*fTIN9QHWQ+E>NTAkVW3 z@GlET+so1mngsy$R!aRq@d=v0X*~csg&MZo#G{*a*JN<0?FLbZq(%p z1LlpT=Ry677yoYm`v1}rd5{z({P^2;f#$8z{nJr_#Xpb1ad(V0s{-Vor=Y{QCm4Zy zX$!xD8uU=FfLhQmz9&Kw4LHXMcy#h!n+V#5b)X7TqHBXJ?PNVU5#0A`!qC10UHfvd z_C~1oOQ1TjlXVtE`|DFkwuAb#FDjwh;RDSUAnmM9AngbETPwlZd9@+h9l?_yP{)Hh z$}gnT^|&UzY`#Shuf|N)_$ZC6pj3?$3Zn!C$B6- z`(9-2pmT>`>_ON5djcpGv_iG#LA1Y{01i5vw@7}M1=(JUu6+(zyBkzH_!i1e-hPPo zBhsK!6zX_$kajzC?Y3a;>`?7{K&iiz*8rmZ74k8g)*$Ww$16BQu8mxAtq zU)m3L_}ZOF4(A4GJ%X-vGFWRbL@VeH_^y7??7-_%^n_moG7>Zk3$EAJoB_=ac=WPb zqXv*?$C*k%q|3Ly7TW>1RP1QS;va&zy80T25}!s`BUbFW}gQZ`?8?+ zX@l*{`St(*3vs-7JrXB*eaL`uvB+P21rHk zM34%P&Iw>%<1YpV21foq@aoydga7Lp7(i7#RJJ=H0n7_X@aUb8!N9@L!en^+HM>Xi zAr_DShdmm9gN&+G=r;1OJXgo#p?R)z%M6gR*LRP%fEl31*Xs)&y#W~*IvJQ4YNa4L zIYBy0W@Nm6aNK1ExR3q%nn!mBBnT%!0u&OG-5bE3wLDi|>7n@%bm1v%Jn1uNJPEWX z$HVewojas40=lmdt@HYx5fQXtqu}ikNT5QNoWOVDcAkE{#p8GbDE$8a|6l)dJE+on ztqV%NFP=cCyH|ewe|Z9_iHeqf_(3tz{Kf-xCW!;+OcL<@AqAj2A^XmPN<&b`q=nI= zdm_jd56eUR{op1-_e_Y#H-eH7e>?cjbIT9>?Vu%b9-YTMG%tY0dXTP<_yh`p&YfUW zKu4K@)&hc-#el*BJSYQhqJek3g73wZIOd|FzyNA@LGD%o^{^~n$azBsbOJoOK^s>) zz$adHH-Hb`>hu8}Weq(r0)GCtN9S?FONIwr4G+9-05#w$K#>kQ@eZ_*2h4^meX&6Y z9CRx$|N8&(3Z(gl-k+Za$!}=q#}Y~W>&gO4~odN(nHc$UZb`@n}xbRGk(l`Qb-ZU;HTr@J4N5J2gp9hA9!EKl&a zgLl_xUhves=-YV;I_T%Ac+r>fgio)>U*Fb~b(4I0=YL?}VsLC>_H6vg2p)k1ks!wh zfKrBs59l^&AMjxn-QgCXtDHg04LCqodJ2GqB|r+GXPo`)wA&ds8n(3j@g;v);XsUR6h80H-btZU&aeA zoh~~wJerTOc>F))(s|y)@=(p5&Yc%P1ywhAI}7Mw^={~Tvx1igKviSs2hg58i;YYD}bbfs43(^5PQ}v||m<2zkMO6!&6y+e4IGFP2WqoH4?E?0) z9)1dH+<>}>omODApDz6R|I!yJtAi^fM1JpeQ8@uwUwQ=8K5cvh$*XI?%UL~op>#KN zp}Z{8bvm4BOv5O@Sa3}hRmg9lzD zIt9G;6_oYChuQ{scHRM%s-Pvko}G8$nc}kt<7Lq1GSI3>pWbbt+Q_G~1av0a9`Jdj zu7>|zI%-thL4ygP3}tu#!~!iq^y!AE04+!a$-L(E{D0D=!$rj%w7aLkxAi1{pF0x+ zgMTlJyr<<4{^ndJ@cF+i0W`w#~r%+T7EAH@N9ezN=RQ@h=B5nkLG{SSP*QbDR^b5 zi;99zXO4;nC?6TT@CAi9xE6wKX0<%Q-zNmhN}!W}`__W%0O+|b-BZ9;dUT!!jX!ml zs1$fueyFYS=(Pdg59;A#d7Qr)RA_(}M}sDyocOod@Iy}~?w$kQ(+67L4O%}7+MJr< z)19Ic-~-ALKHViM6`q~fT{|y;Hba0y%CqyZ2ly(8Zbe%@URP=bfZ29;9 zKS)vM2}j7GmJ7gn2)5314%D&W8_XMjF$gd)@b?*j+QOZ;JUTyva%ll5mOWsu<=u|atM&;0uTQVO|wj9y=D1jQd_`w)B!H)xU$ za>=!i3db=Q6#<49c}|e}6*L-R;L$x1Qoqgw*RQRYN<`oVGxCvcohYNsu)!(tfk)tD zjwD{Bo5796R&9efJ|mg8a4@@Yp7XT4QFQvX5PSw3&UhiE0*)792*m@Yz(p;XKzA?r zW-A2`%M;~6AU9ipSdJi;255_pfZ^@eY@qG4{||du9CU~6CeQwF&OY%!ETl=tBI&=OGoMm?_#bg>1ve*mtP8h`%(&%nUn8wx7! zw*>^WT;gvL0%>ae32Gtn_u7EU0?_fpnjl8=PXYdZ$U(#?O<&8K{Oyb&ZQzb7cqR|D zd>OQ-^hGA9j|W~e6ql!v+Dr^7ehC1Zzkwqgjp{bxIkAIYkG7xftVi0n?R0( zG|!yCr$N0)HUOm|SOtmLWixv(Xo@;SrQr2Rk8TV%rGc7K-311qQ!_yKb%I-zkjqR! z;j8dsO)$t<@IC+!P>Kg9_3ln^!td;WIPygX$dNNZE^9prS}s2U#PsMq^fDM!EP$G_ zpd*%E2!Ng9qEhhsF=#j(dfa~ZgcaZh!;Bpus&@l~w*yp>`gAvdDpDWNY|d6t@OGA{ zM0j);M1Y(N%4^_xJNL$Gl3OqWSH-Ieb zoD8zFn^ipnG(f@M3NF_>yCE)U2FZDJPX?>(-V6$G$oUH_o}E8DG{1w6MCbz*#2($v zAXj>HcZ1vvs@&TdL5}SXHULe8LW32tqXu*@LTC`gWd-1prh6i`V4awb9IP@PoseKX z-T-n6B<@k8J4A)!#Tw{^oCUA1d30}vxNA4WT_4KRe7e02K;Z-1uhxQ!A)1 zQKJG0H_(m&ix*5T3=A(Lz!3-(*&qJ2HvsK z4LKwYkzu^;iBv-8hEx-9SUx8DOXkb4{5Jc9fuGf#rc&6oV09iXP~%a@=!1#0sD zLmr(F2SEiuRzVIPngMo!<*nMw9`L>jIKFzTSU_p3-4jk2d~daA08IZ{Y_Q9?)Tp37}Nz zVR@0ie->zGzvd~A#$VvT7v;YY+pz+Q38cV>gc^MzA+N1a(=uV>&WA?|F0{ZGfsdK1d`W}H-JPS`3z!I?>2^r)(QW{Rtf%FV z8go!7q2bX8nii=q5%g&O#mwI?1zKnU5h@k(usl`A3t3n4lfUOb=rGCd01c1E zU!Xw>{+3CgYNC4s*j3H{SonLYKmst?9B`P!icCnXYyg*3y*ofr<QzVQ5i%JJYsF;~Wmo|Yf@`@u&P_ZBmHbZ!8d;Mfal203(^%<|}-0Jax&%a!FV z{(kT&T8+OU4g-(=Li_HF7d@Z}8lJ*mN`mV#NKk<`SRu_M!8TsKnEMX8uLM-rfj5gm z_Hi|VYZBIZNuVMRQr#UWHS_4~0@oznU}=xm1Esw~M zn?Vup(hV}V6SnyltQ0gj^-}mBXz&p_3*8CoaCbxZZGsx6plQ+<+%1z5cpkRm0x`zO5ME2!jkv-Q;g}1MO$+hLo+{uyBS1 zFg%?3w~26hTHfUE{{*UCdgB;9I%j}FxKm`iNB0C!qk(@ z{~&w>+C#$wQsncu+Wz|gA5!cyzBK#=N+_T?e$Z8}pym~11rbOmC`ul}_Jm>2yN}{X z%)3dTwnaCty!&_)C`w>?w=+b=1r&GSYlA=|5gxs)jn`r62fWo0oPJ_p>1RqU;q+q= z2Tnh7u=E4A;~Z#sw(|zaj}hQYF+n2{pr$^^`UKE+da(8Iq+<ccXolwd5_KuAcqHlTDcxCmxAwBfd=6d{%sS$uDDbZ z=K-JL0GDpPh5tcU9yi|tH-Vs4J)~0UhE^)jbm+y%zs*PTzo+F#{(kUjVBo#H;B?o? zGaZtUKvOG_^awR+1}G_ev|g$g0PWBPx7uJOHMEXK)E3~I(!sR_==j6@7ZAULSAQdU z8QM82h(V;dlcff*&Jm)v;6Rb4(^zMMhMF{Af>hapu@C4V@%M3TIwoFG6Opf ze0?)0Pv}+?PG%>g!O2V#n#{mEiI019-T)QYFL!~`LMLSNDkz0jfKnL9cJSm9xOBd` z9^^Wx64*Hjptyg%1>H+8=8Aw@-fW^^>OX|{141=|DUV*(6IxIo^|G$L02?JuhK!t? z0V{fOboa0SFAKgPpMMSRFE0m`KA7Vr;N~~DJnNnSt|{RyT1cz#TzM9F#^;j&y5LTIh>FCEDbQ>SzAhF#mf_&h32w%8 zv+jsQq}v0fGO$(-a;F})5(&|kxx5yX3PMyIUSH#fj6<{*{{R2~_2n0m!r;gj+J$Yu zEt-GtgM5H;-X_Su76|{M`mP%~d-AcClYd)5fJ4i-5?0UxYVgs$kW({3P5$;qkg=%4 z2%rUHpyNFT&HurmA`Wx?JJ|oACa6a@*nZG*zE<#r4yXwQ8i@iA97Me42DL6g zgQK7+6wv55B&+&>#*3k+M?`pZ2S6@B?&kUrz5^F@EuRB8k#vLBUxL;tfKopALRD8ntYH@0$2!q#6V{Z z=mIrZ`g}1*037C1xBvS8a>764@}jpz#RB94@cD?~!wMVUfR733Tm!kat`|nLewT+9 zNT7}Ma-b*zZA}L;UYsd`6|k@q;K8S1WPsvC!lM&<8dR_B7O)XADj?T#$bph0*a*m_;__E1*VzhUr0O34jnicoMH%$a_|61 z2 z0!Yf{05w3s%~j~-B;bQj9UvD;bnopa20e zUQ`q#g()7VJeUM^N;tApU~Odh8LUvJJPLt0WeR8r0mUgh{(?dU>J-$td0PZ=3OH`S zApl;33!2pg#jpaX^sw;gl?{bC<;;AfPyx5Zu!KrD)G6;k0|zKh(Pe`yJbKZBY!0}2 z*WCj>$C9I)S1bfn6a|3q=V*f(0zN&d6SQ6*d{$2f=xQKPW2?ZUvjcR^Q8({{V34i} zpx!lTE?Wz#5q#2TX9q|aq&~r;vjcQZ6Nnw*(b)mIOR1Z82}CdGE+>%Q(;T4kvIlbZ zS!V}G7^L3AqqAcLD2l>7s;5{M?T74?BLVu4O++1x)v0Aos%I=VOH-ypcLW^ zI%3uU!u0UyWxc9|&ntBS!y&xM90ald{2{7>DOmKi{AO#qxPwCMK8Dik&2U|CJ z1!VR?AJ%}ybw^e=v_Nk>0xIVZg9g7rg&oHW@ulDXzdivf$3PR5pi&!r(j@dsXmFT; zTe|O;fIhhB-?Teo@5s*AjJS^1sOO7K#UhZa`D9gB*{+hfXx5+gCZQ9HbKQg7C5OkgOlp< zX3(%BXdjwKFKg)u6x$dWz_u|uFfhF6!fP8!e9J>@gTyy~>qAgA3K?DUINl8EW`et= z$D2W2O;9E{)(q-VGI$(s1`V}>M2pfOO7UQk~0_UINp=m+vku|?~p zQZ6V%!3Pk6QcN%F0k9fSl-G5O(fpI0zwI{I4A61a$6HiD+W{b+ZvmeH4QBVUP8Wm5PA^Cu*u*ErAeV#AOX&vp z8K76DcS7`e^s+wx0ty~zr3u>42D-rzWIo8TkR80>xCh<&0b;ypI{NQFsPzag2*F2W zfomN2O>}6PvzL`o4(cjUs|&S^2+M|~P_S9xG6H9z`q~E+tKdS_qqo?>qqiC~POIbr zFHnDhFG~R>0@m*krpL>jpv_X9TfmE6K&Kgldb5aJ`~uwEXo1RtBW^2LCn(BKLnR?v zz>*8#lIs?H`~NZqWOy&Dk}OW|m1iM&4|0eVq6nM}$$-#0g9q$Aa0W#69@NLI(qPNM z-cx`uJzm}dkEB5^y9Rj=JmvvTOrTL|PN)w+gVoSN>e^ROWP`l-2HY-z-RA@L-buLR z`T5`ezpMot4okFq!0I7&^UHG3p|+i{gZ&`K5Q7Ry@WLO^_)<6IuxwBg;&{;r)`~dW z3$~;NBAX1Ag&f}nDT~2PKXCGOh020V2Kxbadns5}9V!cISG_z0I@uQF`R*2Ia|Yy3 z7Gx!gNJ=2BC6JPb^FUbyGP3sa5a^gns40+^7)Z%JWF^U9B_Nj~UvfEn-naiRnXpPV zfTUu;=O&`-N(D)6`||()3vXs{2ge0MtzGr&|4WI_kh8?F^e+uStsK<*4|kb3HvLjZ%v@di-O5u~Y` zR~Bq2c%m6p-+&g~cpPs4btysepk=Q0Jhb*Df^wWGq!hmO9=5s$C!&9U!X| z_VP0@ygu!5+yPoQcw~UHJ*Wg?VBlbQQF|HWFwicZ-VX4D9cY{tBFn_^A|5V#96aX+ zD)&5&H^3?%RJ%b-X+d_wMkSG4gLRhgcmty9Y5>gwfi%CAfz<;LM=&tF@R|ckmM$t9 zFW-VH0?Ji5UvH4uXvrS;%(7)0PQFn|^~F}~=P1@${X z;ol8j?g2_}9^K$X2HG<(0&2_}fM%;KK*I>oi0|Z4d9j5Lt`XZ3Ch(0LD0)EaLp#A| zsKfVWb%O4e0WZ)++zw>3{MY}N&!LNrG52FF1T|5b-#CD}4Hh1~IVzy$#EN&2lK;j0 ziIAuQ-@gdH%o7wZ(BpX_T_{lH3%U{(H1;a-!tOm}z!^FM(|Vvp7Sxb}4u61l(nBWD zK=w2raR4vC1A7g}2#SRVNY#t-WxxKvbONu}LW$q9EDuz-cY}^a0AB{d-~m1o6LdNv zc!IDSbZZ4@e*vgloB)aj2~f`Ye*skGL!H|lq5^hI2FNo7AT<@BSb{p@)6!r6UpJuI zpMu5y76wRx4!&*?w5tKK@&hzQ(e0v=0ID4%UMzis5>WVUt^nEG1}ZI)&zk|AH)4af ze-BhvLhOI>88o2=zOk|!e0LH!y@2*=BhrQf$lP@hb73Tk|M=U!LDC1>{ZY_SNYHue zoF2Wh5{94~?{4z9?gMSSZ=DI!16laT)y>Q80xGAAKv&O1KvRzw2RMW}!6Uw)-MZhw z6D?rJb#Sn9F?e)OU;tAyez0(XmnOj$+<=aa>|{}Sar6Qx{6Nc0n~xYA21OO*;v#SY z02dUGr$f>%cz{R&)PFSKVR+pJwiz@;4T=ZwZd~vhLV*{>KmY%Ky=E7<&;pISyp!@Nf&~qjMhl-a;GX)M3Q+zj0Og+oP%8jbZ?`aXcYwO5jXxO}7##TfLqIBFGsn$8 z1^Ihcf%`#$A3?590JWb$ox5)1&hM~=ghH-{2V6T3`gB7syaBCp28}5AbT0vKk$$wwXU5%TsrTA?rqL+?R@8W@Gq--uZ@N)<5x$}>GAxm z3=ECW{@XJ!cpQAj?9yGr#^TZ~!seU&+_g8J#W(r3ujL*7_M5B>44$Cb`wOfL48EF= zeKa3JcZho`p7CwH&EK{Gq@wvZBY)d62#bloZ4QLR%-=SNl>r(iZrw7PoLz2phdv#4y>TX z-;m>5eL>^A`m78Loh2$UouHFbyTJtws7V5wv<7EG$mBUF-UU20fBJNugzp*n>D4R3 z4T=T{Pt6~oL0<6CqQ;B=;E83>P&Igv43tZ|V^ku#OH^WB^MKC-_~6oc&7<=dNN)yc zVKJnI2eGLWyg2}}j9Pm;C@p}_A#v$-W^w6sQHcQ&9L>jAI!jbQtI2s_%Y=PEw*Z0S z57agUZA6d&MLeh(3EGgL@FI(qfdQ1yK?6)+>v{tjdm|V@j_R&a@zMNu@Ua-x2VbI+#oihEP!kh6#uLlcg5In*1CVwwzNX@0!f!R0tfJ?6j zw{P-EaKN4iFSCc-Uf~NmWMCgNDDn^bc3$??JmmTPmgm7=_P&Z2Kug)%W-~J|csBoJ zKv?YjZGK=YA$M~4ce611b{=xg zJOElF=6LXhkYnQmP(t-Q_<$Ld5kOhZwR?>UD0tmFMOYjek2*FVWp?k(VPWy@yx@88 z6^C!O{G8v?l z^61&{Ur z@Mu0#aoD5tCuo+w^V3WJ|NsAYx~PP7#;C-2^s;W+25Gf`QZ#sr7kJYVWK|F-e=58< z5CiJA)~J9FcQgP^99eku1~7KJsDyxm8I+m2V^m^ZUiu@yz}8|E2g(cn1xwz60G|<e@+ z{bt~+WxHckGC)CF@tW7AlV`HW|AQX?5BPK*0wpGJ5Ly1Ht@P=2Vszo(#_4JKq3$Ng z^B$lWDuAr*0^dQ?%lc>wG(O?&1n?{$xOjf?H3}4!G00Kr)9b(p3Ox@{D3L{C)SqdEr)fiHc0?H~t>*Zqnpq9+nsQ+nK?64BW1~2F{(=;WPLbKu%Qf z03G*olfV5k$PCaS^QS-z&`}ex)1f>RKZ1^ou>8&6zMPSP!SE93zN|wYmbXC5`AxX^ zx7jc`So|w_-3jXdc0>0JLwW{K4#*;b7ABAGU7+;p)7=Elncb5>nVIn)$jRV?=0R)h zL3`>zTW1V>Kovb`xXiQjmWSqP-_FyXnkRib&p_);AH|a(WePrwCq0tCfj3uyyIPvx zJv5OPDR}mZfVXb-Ee0KpWBHiB{XFRU&~G3w9P_ZeS1ZlG&4$l~e;bRKqs5PsSDoO! zZct}4-tb61;A45AB!<6zA_D`1r{*D_&YPZ^hdsaF_B{C8-be9<590|>%Twj~h9^NL z9`v!iSS!cBO@z^rf13%XgT=LySG_Efko!`hhC21K2%`v~hE(To@KvhET~r`<4Zy+^ zbd4Z*ThB`|P>=K3Cvbkc520>AsEZKl6ofhqq4q$itzZhh|5fIXejhF9qD|0<0w|(D z1q-BY)OZlo9O^`BPu7E15O8=j9}zeVDs*0euJ3*Q`i1YzU;kgv2B%yIfs%jA+&r4! zNPzOL04VQ*x6mlGFd*hpkc%|Xco(E&&cyIS^)RTw&QTHYXg(rw_{Fmszy7}lpMZ&C zK7Skd071<4Egs#Ft+b#q5pb8Yy8|>P1CBKCA#SagO60IO{N#ZkuP(R}EKM`wV<>;14J++J@5om&P9GLPN>g%&0ch(YC$l?31} zAgEmh>WxZ(YGZs`XK+aKq@#zCN&Z{BRlj*Iob8?|LbQ6nHLfu zzc_=t*XaAZ7(t~Gw)mU?vK4e`Un^)EH~0vug0IyZogKtwAj zQG?fyfDQsgBnCIoKojU(Hp6ePPk}-P8t4Dsf#dx9)L;K!J_1KJT6zz{6+W=|y+JfJBhAfkvKtS^L3qpn+%Cj&J{8 z-$y8TG36~dq-7yg+mv7bUrq!CI9hl|f!6Y4E5kf`JHYEoI(bw;(aPZiTDg+H4^(P_ zPI2spPWw*)&-i!GfXv^QsAzx|Znpmg*U~jA7NBkXqQ0GnJP$r#a_8Uf!@=a%!6WS3 z>%{13`JqoWJDkJU@XjxU8E)xR-|2ARp37Y#sBe)<(Gkg3$*6`~;e+#II;9+@=zxh8S1A`0yHXdU~ zi;JbK9{-QOz608O_a9V|f@Wbs5#-b%!tBDo?UHBnFJb;>kYR4!b0&bo(eeLbw@wJt z^Zx;l|L0$;`1HpAb?b;>W_0PE0lHew@&93$PB6=}`2drr<}aVl>mJSjnQQbtn*X!a z%6oSH@&s9w$Ov)0fNyUEqo?KRqHQlhTlhUYf9(fN5Wl_!GF=jj#UB69gY0hoUn2uH z=p6$C1G0;u`M{;~6v*WaFMs~~|KF!K{wvIpplJ?>BS9<_M{?H~c{Kj-VqjoExN|kg z_+u>0LNIr3ehF@MbpF~8Quz87*mL%tmM4l!L9rp|+Z({>X?dzR!K3;3U&oFb3C8Xn zF^mih|BrWqY0usYCRf7)o}IsZI*{cOld@2z4Gpoq$jWA=EAir3^7_4TJ}? zZ{n~2FFTQUm7(Ro#h}8h`Ar0<4G{opLj-_|iiDk@by2UGJvu*vhE6>|Oa1H2K!fa} zYd-KWcy!CI1ySI2()akA!$Iq8Lc0EVfRmjkh&KhC>RKFxq8M)K*N1e);$4Y@$BVg_|Jz&p<~K%3oPBtmVo0Cg}NJbGEc z`)mz7dU-rS$A&@{UY!CBiS_b;4-#btl{}rGG8J--(L~TvCD7pppg`>I1dX_WoCoWt zf;#Bn%_E@sfG-LVuQ_;tO#v@k?sZ`l1a*iTK&3pSglU~U6#?eFI8cLp83#G~>e z4C*=sP~Q#Q8gcOGo(NfGH52Tw?oP00Aq_A1TGnpf5SS6dP$M+p9`x|&bzx)%nFzj& z9J0ppMRnh=|1ZrTjT7|tGk+T^C@Ar_PcDK6rMHKuSnzMh-9X{r9-?9eQZRViD2qT7 zt)TiFt&I}(3>@RZy}$myya%c>VNFpmjh25Of@&tL@egUwo#b!r0@p7-DhZ$spT$fJ z3_HPROn0)VfE!Mrbz7iiEH5rW-Gj6;xA7pTMGRL4()VIDy0QR||0hwEbf7DV@aPTv z15P?1+rW28rhNVX-|)a|9Z>R+@HqIKiGRC`9TTW<0JmH~>cFnDftn@Z@&5oQpGJ6C zo~Q+nr8szW&w?z>Gxq3?=J4pYm3YI$;M2{@`35w7@q@n^bbhL1w@rhG<^7`RFV}-Q z+Xp~}8u%U?Py&Z69h?bnJXl`fZ*B!|Y8PSV-*(HR@i(Yyj$hh4su%o&+ft_gik-r(#Ea%_mBf$s`Yf$?O z6h@$n`(8+Z?lJ5JxuMsC2{J>A!;pSZ-oY>g9MG4+mubQbxejhXgBtnWv%pU1-UN1# z<;~(y{%t-6sIFiFHO?lX7%&ZN0Bl+GPEee`>;MM?OzZ{YV{k(M^$1LThEQ)H)Kds` z4??+j{rdls2|OW;mj0K3L-36PsQ!`w)nDL4J3$k?(DYvd?pVVnW?5ADxA~}8@NYw; zSg_}>eF9BCfu?yulTklDAn`zn&HxH28jjfBOM=!UZd81}lQi z<-Ta?{PiDvTOK$UBM21#l*M70|3mb(OHDzpH)uIoq6)qd4m3~zcNy3pd?=Rg1jWni zo1oSRBmiFg>-hEmbq~UJbg{&H5(L{{S)$hg`X@Z1z=e>r406S@KsX#ijc zc(4*OdE?O=$OxMH0*`TmcFekiC82|IoiG|Yyxlnme39O9mOju(ILJGoDjhaA7^5Qb zVl8-?E+|!ktK)9yVJ)Ct(|15!hi=H;GEi;>9ZS&(DI+Zr3E}I0r8FFPEJM!23NyNucdu^6B*t4x2@3xm3+SZ``-HUuYc{! z_{z8Qp{M1+T3g@l8K6dmZ}$RF6T{c?A%8PyO2xldrrS4J+NWFf@^erjqDkJ z!y%9jmJf?Iy>th8r87jO!lRpYk2R=DhczR3w}QEl@mx@&2izEXu^qI&2t1bzK6@E{ zBl<+}!s+gr2S8t>7W8P7xLUZIIcE z4p0|22sD8MTh;{{>;Mn)Fo04!qyYyy3AVN0i+px7(IBczXr(L1}~n0vjH?KHXZ@xOvrL#(BUkgBo3bW&H%9> zhm|0?T;auu@BbmUM}VqVP=G_$3c9Fp@Na`mLv;A42)tPM3smeuqZ2%k0G*ov7i`^- zgC!tVbi)=Sx~NFJ*!d2m57lw7PzP0S2}^_5Rj`$|1WR;g3q2HmzUu7_kT$H3-f$G@OTQS zf8Po|o)>n#C$xA3H}XNnV>(Db=qxKxa;X5#Vt~_9CnTWo6pT~A8bJjk`1~_)=?I=^ zflS&U=Kzq=3gD;*MW$2?~@InJz2f|K+K{yyx z27q!PsA2`@KzV4n4D}Ce$`m^92u{3^(L6-zmv~|I8kGHDrh{|K1#sgFGC2(v*bfru zWsRQ+%RX>Vz*7UrhYBxp?Q!HCP%42Y;+Fx?b{youq8BS0e*J&>1Ukro(w^aOlK@rH zSjWpjwJ7KSCQv+s)@$~F6Et)u&;(Eo2+lo`U}5kokPwvsA=DFVjhkELCp^S z=2RvI2A}Q*h+c5V*{4@jcs37%W4Fz&#^a2P3=EzBeJs!OH=8gqFt~Q}>~Q>l(6y6i zN9Xs(XaE1(Gc^7K8C2{BIwsPd0d6j6$j+nJ^yEAqhHjgEKHUwV3f-q0yn6{`;Bo$D z(DB!<-7GsD{~vJeWZC&r9yAC3{op%xsF8{u5C(rU=(J9sUe=mm_gvRVw1q`i;Ns zF#`j`anL?d2JkH{pfm+)i$kho$RI@b22kWcqY6|%qMSC!qXH^m_(A=NM`Dly#shRD z4Jeg#PXG@=bkBgeu>qV$AVnH@Kms)0(uriiLZ|`IHGtqXHjqt|@a2l2Zq&htOdv0C zybxRg8C~{x*$qnIppoZ;kC;Gy;CS(MIZQ6%@BjZV+^&IZ33~`-0ig^bloo_ihEOsP zN)$rzK`3?zRZ#ou|I5?Rj00_yqvfAppyZEn-fjS*Pr%>W0KQQjROUsz7Khe$!Qgd3 z1|GfM;3;(Q`3DIepk+be17q9{E%kaEo-uVsGJgNZA{5IEtEIs&)3DoW?;NKo% z$i%;0#xM<3T!A{aT%gkSh4Z`r|6fnQ%uH6G%+$+zWjZ*W?r`m$2+BXMotHq1)hc`~ zZ}B$^Fo73$Nr09ID0J4SsCa_H88lSp#J@d6kjaUEyNn>3byvXq$60glfQBD=^X~94 zfbJ#fyaYOUwi%SZ__whLc<}E#;L&=Z%-o}!R~f8QRs}?XEbRpiOY%$vg;M~iGVG2~ zQPDgN@)M{LA@JhzlmGug3j#V1s)Dk#EhtCxH-o0PK_@AJa`jJ$5NHFeN3ZDTSv(Bg zJYAh9LCrf*2@VS0W^Pbf;i4h~N>LgfprqA31>C&k-yXxo#J`<~D-G0R19^@M6ubf8 z@qzE))uXH*Zi7Ad5ln$L;#!{KZ{7s%vcvtx-zEtv%e#3OgH_2c0Z}0Tf%f8eqxw$< z*?*rO|NsB;?%)6aI}aXw!4CFbv785lPV?v$RR;M-rm6WbU+0O=n=e&B1<{FvFZnzg z!Tv6`_UIM;Ka+={Tc)emTL!$J9MrLN@Mu2baTvjRp?w*gHB=y!EQAt+Q2Y>z141!E zs9%@B8a_j)HxTM6gz~HU_5bBd26R1 zp}Ryy0%XqxP>%>?PwyU;8|(}W5LZ1wGJXNf_|7dVAl0D8B1k3ZB-;m|{z0#3JhHW* z5p}S&AjXR+W)N#7KqZ6*XhDwx$XX2~YYnhks|mMuiV8@zN9Pt5kV=rX77%M+96dOl?u>a+2-TOfg}UdcDw~F4UVqkEh-J*o9!4FJbI^q69XvlUV!!^A8%3lz{$V> ziW*RO{D850L1SN?Q&b=az_qAwa4|4|d<0S?0Au$~0jCd;VG^Jecf3VKfs26wTtXag zQPF_0d#Au-%mAdW7Z#LLR2-muP>6ucu>kSAr-1DPl`LTUTQBjqNi)K#R*zoRvi+bC zhi-<0ILk#v0K|B)+5{BQ;8tjhN(CsSVB2rOqo&~Pw+0@)vce(I?YCWtkcHLYZS?R> z>;{ni^s-{0P3)zKp!IZM!#X)UI$6`TK|4TOAc51}19j{a6;Qx{N>f;uEJQ`Zqnp(d zq`H#@QL}UKgKBnY?rb~)%Cv_;^B@Hv*Md8qJrI|Jipm$SGQWZDzWl5O8rXoWK7=R) zb;{3Xe*6CtbneHC&F8?yh)mh9|1YoqhWFSIKm);`v|j;|6nL>0Y`6>P)J_zm8h?Q+ zm$n{e28QE}3@i*FF8JgiNXrM@vg@7!v33Kfr3&iRLGC01wNSvDAK*==<-DK(hS;(L zWB|m8(DVYTkHG~4XtLR(n|G!rC}csMqxc7)t^`OQ8683+ES5qx26Xe9L9Kx7(*$M8 z7sZbub|FS`GQhn-a08_qG~@(2XODq_zaKO~jxwf)tt+?<zqthgtvR?**;2 zbK&2{23ld@#=o71349}5=V_nLi=LMsf>zG>N?!6+yy(O2A>hWp-GzzCr_)2ghuJ~G zr_({gv-yWX(Q2P=2La#CgPsRp82EHL2>5h^Bo15vDe&oaP;hKv@aYX^^Rc|l-yX-v zz~I^V3$$>CzdaCi$an8z(Bc`-?{`4x;2(P*#m8wbojwu@o(EqFfEY@ijlaOlXE=O1 zFTb?@4?1@ays-$hHm{RK1=PQV9FPx66p*zgY_}2N106^&l?FAP96;e<0ct81fZB5g zhPPk71h+>J7ixk7jDLF<6AJ?a|Mp3svkftNY6Oid}9q?EKHO63ZB=ABA zde{|sqnrn14*<9)4C;zPy1~$1ti%hmJIE%2yS&#yZFo>R0`pFScqpxXty zzs;!IX2bvEoi-ah{vQI}F=BbT<`v>l<^r(U(1t&hLMyMp86I_hzL&LPCvxczN~+-c zmXU$s#acah=?~sI1)V}iE&3(=phbUwG@hbgNdQ#z^S2%c)zjUe^IST?_aqvgd@T%0 z?P*S(CQNBgoi$8Mj=f%tX^lVS82Ot)ODobEe@jbm{f~;Q0Nf zW9KQC&Xbp)HT+a?l|1R9c+Ro&W7@%Y9Q@nA`Si*z(BfeLt@Jc@<==MFoqrpTq~pPd z9MHqHdtPUxftsSlyuBMih2wrs&|PSY(;9zDFoMPY|Np-q)S7wS-&?o>Z1L+>P-T<= zYMer5(?MLM=}mC;(wz(m1Mn&XkC#&a|NnoHegd2XF696E|1ukO3KlJXK-u2|J$`O% zM~)v*@PXq8)T!mwg~Shdq8+^O05ZZ0%3Bhkg51NSSGK|j8b9wNA#TH3H8=5r;-@qX z)Q#`}UFq5#z+rg%wUbBZJ&%KrnLIkbAAH8`*!ck-zPt{aJPc0!+f4Xe`L`W#=ikP{ z;dt-?hYRPiv`!PrwBs(4OsotZz4445mX~XGg2IYG&;=wxoCjXt?(wo36m)a)K=m&o z%#hbxgR%&?xCd|hl`y>R(RuGRAL#xa&)!N#kh?p7gN`*f>9%V9U!vyI&FItZ$>C#p zy4b)Y`M+o9O_0AF`M1YNFnRE=|LxH$WB&ReNVxO!>z$zb5b3`8CC5Nfh&*1~+oEy< zG{Oz;FPsFm0~+6~0L^rDu2ES4qI)4UXrP;wfuZ?_0Do@_NEzrp0agYE(9kVtN#q=r z6Cl-=xA@!RK+?%KLHBz$dxO{qA2WmYXzXBRU`RX8BKQCQaThrj&}p%~k^e1k@b@hP zRsX#;DhZ(GeP@o!2hfz|hZi#@gUTY%$u4_Tz|*V6NZ zN`NE3pab~e?}N|TJbL%ofSm1goTVK!;VeZ zW)@H=fNNLK%5CsGQ?E?}Xc2&C=ZT9Cn-Bi!^sy=Eyy=nr8{(cb;4uZB{m_MWZrw3c zavVX;ga7rV7H-`sQ!*SI|A2zIR10Kf0jPoT|1ey88)!VE*JeM+hT|?aU>Ch!1k#t{ z)}1pY!`1RGe{Tq=X6^j#f#e^zZjSYGFE)&m)M@HumL zjU9_qXAMt=Q+Lgj0+-(S|8AWzJO$1F86k&-fP@n)f0k(fKkkwI->utcN{TDvLx`WQ zg34{Eqg*mR(d{`VgoA}KDt(f@suZ+kZX z7T|9Nod*t@hcs~MOi_{X0bQTn8Ka`&(fI=s_&wmn1R5CeJouQ+tG7o66cC^h6%LPs z512p&lfa8F(?I#cMa7`orzPS4Nsr`{9$-(kg523_(+Q310#JGccYr`EB0yt4u>9%M z-J)^;yzS6OMZ>f6kV|)piVUcPvUsWY@BjbK!!LtDmutiv0+k~#j)EzVUe-A`7$N(C zds#QufmX(XdLibJkqiT{q8FMFN(n+qLnsjl#S5X>Ak_bZV8eevsE-ip6@+>Wp?tt9 zJ$hM{5f*E}E#3ziCQ;A)_5Y<1xYL7HKXrnV4N8B<5WI{g!SE8OcL|!m0NsFgkOjQF z1~k2E`GLRJ8Z=gBdGV1)>w%I-t^Z5zd4P)F8y=d!eJl_2x9fro?F6rufNU=VweQqG z5d^*sETVVxC=+n$|gTtGYe?p}TjZj0P@QM~Qgc{}ak zYYzVHw|#m|MU=pGr3|Poa@(DMn~bsJ!N(jfoVR@~PZjmPRs-!>1Mi6j&53v3f(7Qw z4JfVQ7qSPyG28~B>eGMye;I|S95L6w^@2(k%=8#53?8#T_?S8EIExem!*LfWunC@) zC;8jUKt*ozPo{cX!;`PYKsh$;xQiVVBSTszkDW*JAr6oK2YoD0){1y^gRcwb-);q3 z%609f88`%BQ(lmS2fFJHRF-&n^v(be$AV_tLA`H~AY>x&#d>hyfcp=ifdtTLg`hSd zsPP5fum;|o;Q&gA65U(C>s~-Jc`tTAr{%!yHSjhK@NiZEWD5p-Wj=W74|as40;nhf zZ$$_1PILg3S_UuTpj{2f%o(V?2RfY0V;xd^Q6A(sPggc5RGX)!7VukXF+*$YmP zUm;W-ger$n1rRC|LS2GTr&E6Ye;Ec|dj;yEpp-9V1(^Gfz-JRHcyu~~mn2wtbUF%j zvtDBcJ5n7KC>kD}j2^wLn}2gd3Q|xEyeO4{bl@PXrXfWKxPSo_uP?$u?)OnqczyhZ z4ahm=@a3atKqd-+0$1TM$a!bb+ndlXndOOMBaed*m_bo3z`vaZ9Mc9KmZyuQL1hvD zb{?rT%M<*Q4s?LJbg*4wFXHxqLJMp#l)!Di6Wsjn7$z3}?Iuj1ZnA-g<@sWD4^U&l z$BM;;e>;m+noB1OQ>PCTOIoLiRcDM93!+E(Za2Dph>{Wu{>QW&A*)mG$~?)CG7dS#w2s8D4OJ*KUAh_#iT}9-XYwAep>p|NkFj&HT&9 zzy$IE#Bz^bUOQ3HkRlKCAUTbYZ~tFk_UPr6M-dhT2`_q)mGJBTOVD``U@s%W8)cv+ zQo*D3cBwKbOa(x#5+RRn2M$oSmq28m!tG!G^K*mdbObystxGR^bSl3-hu6F?xOuMN zU3(7Tr6Up^mWPUUJq|u%=HD(N2pYUq@UT1#D=1jF(<~1`3JMK`-KIN0iSxy~Z75Dy z0CEEI?oH(WC>H;v!QB&z?jBo^d%9x;K?RE-s9;g>usjYeSX}tQ1q(l@U=i$e5d;-1 zmYp${NCnH(?O^x$p}KDZ$bH@5aEB3i!wY}-f82`Vc_P9;9q!*S57;R`pg9A}Q^j@= z{|c~x3JwKO!Jz{wI1Hc#2M?$iH%PNQh#nXGa}Kd_7!jTz z_hxuBztI5AVJd(II>2or__0$KAd4WofIywJ7l-zL1)tXlK8Mx7qxm2UxETOm-~nt&S#D*?5g*7$+$e?QKm zqR_nK?TdM!L8@*S6^?FRXOMv>OT|4pS#R)zFQNaq1Z?gteqM&x%RG8{4}ye2t6)G; z@FLj{JPo%8EC@b_@gP_|$P#zIZ~tEw{0Hsm03Yl1Vp`O%|1TLqtu!?MgKv~W+poeJ z05TJN6ujjL{+2bMAnIn-1_@f8D2?~%Wp)3_2WczzvWCDdeY6mC`L!rW9cZ5`$m6ia zH@N8;;Q^Z@NC2@UJV1B-f_6!Cf{qh{ALkC!3u=afvJtqV2JfT?8vw4n!3HS2Pymgl zxu|HM8sO0_I-idhbcBxsxo&uo7WwP{%Zs3nAzFBWhcnRY`}x1XNyCqS8|zF6(-{`Q zd!aoXj&9zhAAF!Y5(PavS)cQwCKcXmAOU#PcKCb)ZQku=-G3ZDxWSSK8{CKjk3hUQ z9P#V_%Q#S!g3~pOKyxp+XNJ;7;@`&l{wK)2{4Kx1OIcW-Lb-3i5e=GcZ2sZE-vc_X z&!h98NAm-I56}t!ptIFL7af9f1*oVn0L?*szXY1Z>4qNz2U)%dT7~?Xg#i=?3ZO9s za33wg!}4Nz?e`0yJKwuwR1!QiPlJY-VOOk!2Ok1F7;k#CUMl5-MJc4r1IHulMjlWj z1~laau?18!f%}6TOkk_v=>Vb$WN`rKI)v^Ll?2dkzSm1%^lkVKI<=)8OnLOO#vOwP z@a7y?0RMyx4kU&D`u}n*C=I~E7DS_jZ~yV zwnJHH7=yb=2B0!%mry?zL41qrk;gARb{^T^!Z?o1^9~Xm37fdI@wpVhcmJNXKr_?D*?PAVZPEZBOX0|1ZN4*#ISe_}eT% zy?3~J_(RH2VqKNKuSEC5C8D!ybrr3yZJGP z2je}D<^w-GI)8gK|KQ;7kNp4t|M!ca^NjhxM@7L4(H6)uNpOh*-W~#8e-fjj@Z!y1 z@Ul91UV-caMe~2RkBYY#<7kbN)kt!U4JfBku^pil=55q;**=ljf`A13gbKR-_4 zGk<=XK^p)26CTaS96Xv|I)D}=@Hc^OQAy*^XT6`n%8DEQU0GkQyto6O5qY zb5OB~mfk=k@2KZ-f!ZV$9=#q+9?d_w`P;x(9Dt_HK;sM^;K7IEE-H}uzg||mov``^ zG>ipqw{?p_%1Cgt8axgP9+U|1=w&r52Q~Ph%Vm^7C2cQg(EzyF1lqU(Dgi;(fF_C< zUKnMdoTm<2R0pyiq^%RS`2n)g0#waF4&UKM@Z_&LsE}@a1K9<&Mg@ExT`!b|?QH7yr~vOjI0$mYaTgWP8GhjPqR`W$ zkry4Zm4W7>azRH17yJk9c!Hd;58jYBMFnye{}dIl54xv7Z)kw53I-i93EIrn&Aa6t zxI8cc`CkDvo8Mc(;n54)#Dtg&zET0P2XxCB*wKwgKz=yv(aW3K4hm&xS>e$O+Ghib z#uvOU-~PWo4{APvSBQc3tUw$GE;L|{1D)A=c_nB>5W24mRFb@81qGH7M3WC@G^;|?64)Yi?r|1H?lsvf<(O(meT z$l=k;d+Qcxpb~uh2WWjyca92ljWIaYgPLZ&ydhxKpt0>U&}NUt>m#6`3-IWj*a@yo zI~qZB+QAnb9gUzxDIVR92_D^r5gy%T;GK1do+l`YgO+cCyBPnkfifI;5L?5e^(5#D zdn`@?cQm>^5KI6BJWD&;$4&+xS3vA9k=KsGkLiugl<)1{7a1&?Z~P>wO(QD$Yn#C@v}jFXH%r z{Rgjz2KCcGOTnDs{(*YqrThQ?|65M-w}3Ba>}B=Y11<3&N1HJ~E^L3XloM%O1Kbjo z0PP)e>0sgV0WH~w%d*tPgnae++2p zC)D=tJ>abYF5NDm%RIrS5_r4>wXs0$7w`tQ1P}1Jpd~7hm7Xu`_Rx zuq|#q;Dc0=5)af84{#=nh=8OM(81T;J>Wot1~}+y!I$$v0|C%r)&SpR{6f_0*Z-FX z{vhAK1}?9*fR-3Hz5zuoXjrNOG%QuYAAW#e&_yKyL}Y-9NKhr?(cJ;@_XJP@?a?~} z%meLIa|fBx8KV-xzs;inloS;~?fQ-uP^NNj5J1=-1X%VReKXI{rgP{)<=R>wr}v7?=r55D5)nAitW z(Ru6OYk`iLplvJ%UrBUK1gC=TzzmP(U!44{^~?+m#~MK=Tru%)3k>L(I0;k@GI(?c zCU|s5MtF2bgV!8FawQkYJdnr1j7|}i|Cd3z5}N-(JF7sY8a(zqU}09 zGodCL&>H#WAmMIj0grBP36Jh#1@LuZ4?#_YZf6INZf_58lS&0F!0gfO%>lYQv&^I0 zxx%B@y8<+R%>kOi-T>+*L9V=WPVngVj_~LX28XEtBAKzw|Np<6weBe&_;xS}@DYiy z&H0_6#V3bBx50wWY68_jpuxQt3&9N#NK^IoJx~IM727f@FQ$O5iUHL+pz>4#RO>); zN*5%jh&}~*ywugBvk8(@z~Uh1b9i)KerXAcH1MH`osgroiO4&UTNa>Awihg5$ARt` zfNmIjJsZu1pP;J{zzul?gbSO%E@Ul!0v;gt_vq|`xDYH3>Z=Q(TR}UTI%QN|T>J_tfxu-wl7qoP*UfwA zF*r#5F@qG%!TZ508c-Yz*})I0o4^N+pgI^Fh@hoHpmG=72U-qo&;-Cj4dh@lBPtqU z7RX7kX31Ajngy-7Y_0qA|34%nvb-z;iFSvmWW1CIvq0S|Xa)At5hQXPvXdKJ{&d1l zMS)&egzT#qF3!LHztl&Z;|y&cqMz^S3(A2g>%Bnv8nn#;luA6hCxFuitTH>v-wGPb zt=oP z5R?r0TO~mn(32v6E9lHWkKQJ5i-DoL3sjYKbb)xCrw_j5=;#8q)H`p2%DGvfO5xy3 ziHCS>n8EaEW<^V6bk9d6$lrs`Q3Nt{h z8{GPsQS`k$4$7sVq6^-x1j`r@?1um9l7=O8H#t^Wtw?}|Fd$G?p=`YvL8 z407;lDf^4fvmxVSws%3}W34Iw|G!YU|NsAsZomKkU$njX|Nlkc^xywq{PFzr|AqUD zf1oX2rM94+26TKv477ZH-7!!P7~IwYEr;r4<^9gX(9K$YAC%}yvphO^S-$gtF37xX zj-(ZImhy{YbghrRfwbB{v`Tn%^4|Q$!*Gms?j7hj9K_`wy{renf!YkvvuIvK8-vE- zJbGDYp$NNxgxg-swg2`199npR57kDQ6XoB=YI6rmcs0+0gqPeMPqW36T0M&p4DC{0QfQlgjbk`V3D|m-!5W3bt zuvTe^R!{(Wd&iyAvz_ZRiLs62p-&wvjc zYkUJv(w%D{-OFAmjl2!_IOKd9P+kBH2Z6>yVC)+p2Dp*aq5>N50C7EfS>@J&`fSh? z1s3auwr#vvI2O?to2GsT&26o=0iEXvPw^<}y)4fI zV{9k@(uo00ih$~7Q22t*t!H@g30%#C`lGP*+Tc}|(0d&arEh15N&%=3UIE&P45~mt z94PSx#Ui)~p5W2R*v-1|79WF0Zy-nOfl^_R6lg6a2gtLq%}gRH zP+?GlI;{8YKWLr~c5*043Q{e>W<)q%^e+KN*$=B<|6e|aL>X#)f!1qqcy#Khc=YP1 z@NZ+Ca~)hVp{{=b$NMqX`s<*A=}qka|1YLb1g#(I`t$!q@7I6-U##f={r?5?@BjZ_ z=*9p3|3cH{&;Mhr0oTFB25gB$i4|nM2EzW{7L^K6Ga5WZ`xUgAwDAoGxD~NR1srX? zP#Uz$8Z@i`3Tn_UYa}-4f&*}7J>G)2Z?v2BJSeJ&(E@R=L3bGO0+G$-El9Hgxq+8zWo zXJH56ffhD{vkvGS1CUcCKs@ju^^3@Ch#SB?a|3XfD-LRG0jNjT)&(^cHxLRCqw=S_d*V z{BkW_=+XRxiN8${BE;12%cr!@qxlCjf7?H9uqx(;UvB)ZpmnAm%|BTA+a5rKSsQ*a z^0zvJ_Qdy!F1!sIZk(b5D!ll&MY4GG7P5fK08qK#@SBmpH5Ggwzz+rfrdeSBMtOMj z7AkkYYaf9gRHp#V!*Ar0JG-DRj3!B*1&Eh>xOkG zz?(P0Jt7zI8A=kMP{;sJenUpGL2{tw6&{v{`Fq!FU-|IxD=ml!1{9-?4&HH{>75oEJPKt_Vhegk5_Bkv8&Y-=>Lp(1=i{NNAhtaJX>Hc&8w3aHi^5DR?F zV)G9k{vO@Y9{YH4LPx`3En5+i5oNIsKlzjtxKk_*-ou5`6q^ zo1hYWjtxIU`CC;W68!vaGocdvuAm+`4@lhdIDbEQ>o>f43hjP?JO^IcPytFF5+1!F z!aShdqwpd*6%xDP280D@EX@vQncmp~zL^`;5(F(+negJ-bS$NKH>7zDiec~^CVY6U zMFn)804PmXfFwbO5rC`$HArEVFH)O(RX4PYxRpC{1cmZ3nv70KEGZTyMQtzi;pi1uAd01Wm#TvK|0V=^1_?xsqhIT?`bU;N4wE96d99DxC;;2C@(G7G(d;mr$hG~5MI7-or+X4V9dA>F)XFPatI z(CVrivcBQv1kjKat~l>zReKJOHE|Gy5z>j1F+&3@2B&d5v=(G)H*X$@!f@!0NhCNFLw6Mx-4kAqT@cxX*Y5LhXf6+aT0>2(Ku z9x}WQT5#&oZQ;>;fCIGT^x!cLpI(;zUcENQJsAIaSe~wV1S;!5%}LOT<8JUu9Vt+= zmBXV~)=~r1$Cpv@ICzZ11GJUAm*=Mk<44fo4tRt|;6?Zec;&?ao23P{Wg+f>+(>Bn z?KLOJ37yA48{1nC@V8ij3XJXw3D9vr9+p2#ANq8AXn0!QEWP0hy6?{O|3Od7leH3_ zmOuHMpRh78_;-t(@avX2rk(^Fm&_&KM9_~kph)5VEvtldHf8I<|75*yX>H* zgKB*_InbzykBY_XD^O8ryXFOp+_(QPYd{V7P7}zIiWeVczx{uy0Tw#=dI?BrG4fWK`q3j+ga4Mu|J{}Vo)4hkOs&v|qf zXt;E<2A(nX6$0T*@(szY{?IW(S$n z4W76c^5~7w0L6hB*cbs&a)6{O&<1TE(3$Lk79PEk;7j5oKua`0^C}*epZI%PK*e!) zpo2$ur2+Wbs)t}B3P6{tDRhf2I>E=_)9WArT5_NdQrcM|-~mx?;nVGC06MC(eK|;r z=68?IN(<0Mjh%rG-L{!0K>obt+4&K)W6I;;FMAKgPdiv==?O|60;-^3 zLP;KLuR?-J0u)RSj)Rg1f9q*bq6J@>(+S?0QQ-kPI=wdnJY$~%n(+snXb~aMZMyC_ zXvnLIqxD;mP9qi6gfh8)?P0ZkxF`y+yC#6A&3N-5n?h1j2^FWDh zBUs!=CE@j+ZqX31$pr$fmrA)jIz7N9zg_~WS zgLj2+yzqicDu5(=S$`@+g9Xpj4eKOOKHPr{l!bj%6j~3I!dmql9-RkYP6u@Yz?l)` zB~W&L@mLDt%L>rcwG1?ioP!D`fO233=*DSK>Ut>$I#(U6vqpvE#Yz-KppFkb9ll%* z8g%Vtb(;=tql29c%2wb3F%|}f7tv2317hH|3ixa*@UU!!N2jxeM`y4@H|x)%;K>C! zk4|p`P%cgI=)8$)ix|ijaK{|%C{Uz{fE^X1Qt|o>sN98|tqtmRzW5~x@hC(Hes3@+ zM(;zV5?(F@O`d{NK#2;+i{nu7ikIeK@fsBe(DGJ6(3(hS4+2~?gFFRdyl8t2@f2(> z9lTI0My0}|(;Kp_o>v9rsgtFe9-YphZS|mR4GLOVz5%tp!P&gKM#bS}IjE%zTEq?? zc2VY3kfh)L12vr54m?6}kTCiNI>aYJV1%6_zSLz4lSCsuUpq@_zq?_fU zk^pA(vM#$1nWB1;oB10wF*FU#cTqu_dI&BC^`}6gnArdsYg7iA-OXABQVXh|jzYHQ zB;Ds>XgN>1a9ffQl{V#9_6nv@`c+Gvngclv1 zpmqi9(B)&S|L^fIFnSzkQAq*K>1icFiVX0wWNYp=w+Qy1abz*>FYFp z{0G^H8UPbssG->4(aUPujGUlB)?9W4(A|9`@Z6CKFzf3Z{f*Z-Fxkl}Om`S&fLFhyTq25M`76Avi$!!O1L z`NvKLG$sX_asbV57@qX#JOw&(`yj{(;Ps>dpkQKn_?7iVapcecFV1B`rV9)@TvYr$ zx*=6Nc;pP+RF?p64E6zSZ~z_MlmHqZ0~v*MqY9|RQvkK*H9!Mt1}|dNAua$97CV53 z4H7`hMFK#Jsr*2>IRdl{(;u|VEd>-zt(Qu@LBa{3VZaxD+92Jm=69hX*UP%z7`CnH zksBypQI?Dy^5{JAdOgH^P;u~ju}8O;0>~uDJ*XU@VoU(+Wl&=46}9sO#XM|K3$$n$ zRQEu~vkWCbYb-&hM0A7Cvj#6W1r7K0vVNNYjs9M+ASkGrUx1tg3Tn`V4aiP#$h@fT z24}!0ilFrs&`5<$b%RN?_UAf~yU_O|X@Jg{2F)P7PX*^b2{0ce_g&2gc?9H+*EOKr zR~o^;jrGTEa89#5#`^X)Xh-MXrl2YQTQ*oKt3~t&55D-r_2O(FRDi`>!1CgJ|v5ZM=vWQ+|A_~pcR&|ttl^d zDE#{WdK)-+(9=KoPArV_3T>alaTgWT3=GQB;I#-ZVnJ!FmsJnyiWhTJz#%FJ=A(pY za~>>2XI6tkl)v=|C~mr0nXW+-BP`fJrh`fnh8OQ6A!B6Vx=aI<*iAu_xSR*dlb}SB zG2zA07D$-Gw)(Noxe8imz`J%0XikC$deFiDN03Qc@azw`t^{8J3_fldeAt5r$T;xI zUhrkW3837VG2ulzis=(xgro3Zc*y_y|8g=UZKB4X6!L!M7Y{&z2S2++NdDLV*B4OL zSD^172Tg5ucYym3ttU(6Ji0p|g98)53qZRei(VUlf%cU_uBe6uzy@&b2b%K&4L^eS zl}LDWny9?!z5)pY50B#wAVWa4#p|OlTI7EH2e+Oe$p%g$+}G=(@&hve?+t2zG`@ip znQI^$CwieYtoZDOtj_HO-D}6_(LDj|h5v^uAeMuh1fW<4 zZ&w1Zxu^g~6KFBR3p=ngK?h8Mx3hQ80Vj#q+mQkvWRXYr1aNSI&aCq2o&mNB7Wh?+ z9+u}}fq&7Xw}{aL7Wj|Afe%TiCBmS<7k24pt=feY_>dHBBaD^`pNWD3A5=`i1E2W} zmcW+=HPoSj4>1ZVyS8Xx0a`x&c(!K?7g(CgH%}xDz$- zJ5PCZA|+cNl>m6)gLjRAj~zt{{DZt8XM!qxa8n!}_%Ar5K;;e zOCX9D1JKR}NTGtQc+mhyK0J?hgYr=)c*+d4(*tzP5~wQ#UKXzKLf#aVFTrCe&_*@5 z4Cw}~&;xG<01x(qj;aRb2=F#Ig%@6iAWe|*RnT5_OHlI*a*77RT2LzpQa)IMRD+6j zP=n;(Pf%eDYk7lDKzM!N#Se*J|6hJauTK!=Z!Rs%-)Lb_Qp8*S-q-_8n#kpEG@kM| z-5BI)NCrhq`EP_k*5NIGGcm0zDFsCUw(|Fn5y&c7`3s5w(8Y_O?jd;Q1Qd%eZlI_^ z?!khh4q8Sxn}ZC(Sw<6COn~pd?8H_~K+9-hj&9qCZJ?1P7U9 zCG@@H(3k)P2dspC2pe5MDWRRYK)DYV2e?Y;*j7A+#D^<{3yGes1Ph7xpurRHML&?8 zA)rAx(ApVr2|b4slnK!J}^LMK9p9Ko$sSm6Hz4{+G1fNB&(34M$M zTbK(6$C}E*8>9Rsh+D3~I`NE(rpeEb!t0xY)^2(eP+KVsQAyLg8Qk zU)sPrTF@3Q!as=e^$vB*S5Vpp6-1D_1aj*exbgF1zAnTI;LbWY5Fmc+fnJ{IqayI4 z8bb}NK!Y^oKx)D<)PN3S0u_3YQU;{P7_0`C1X0?+8NAT6-3?j11!|Om+rZ#PJE)F) z@pK!spg}J3%`u96&<)g(urI-F-A^8bb>OBIIHh;bQGv9%Kuzv4OzY5_+@Kq3AXagL zt%4Q#IEwQv;944IaSnC|;U+hvILFrHhPb^%lB3(Ua|5_ImxLAPV6!nB+@H8X!GKbn z^TRqe$i+D;_(ljwX98jrsLfZxf?A@0?eE^B0#bo!^YzukigQqJ2i)!f-3$w9a4ViC zT%znj8$&d)M~oJrf_9Fj^A4Q|f$NX0p%*2idYmvVsuAEh{-bO4&fkpo{A zslg2~3KaO?nLxgR<)tm)#YUjs4oC$e@CEB&fsduZz2q$6z;{@O8u+9(xC6k>#8RA3 z=L6l>4Jyu&+S|P?D&UQM;Pt&0peukH-&_DqE_JR^IRTKA8MK>}66qniP=wzc&DA9#gt=zK`nyjb%CqJRTbT0!)2w19W| zgUds3nF$)y1~Fc&7ln){N`TfOfi3UdqvF8?xt|Jg4uh!)Y|TH5%8P2TpZ`GzHE@8I zErQk`gKh@{=>b()(DVKC%^?~{mX}MVx&t{Hf2HTAR+RGdZ};R$Yy6p6!r#&dR@i3HikGFH05yv6yV*Pz(LabjlV@2Y?_@% zCu|ugXoq?)Ydj|?)q{#0P>rx~CnV@4K;8joqW=d$lX;-w2vBDq7SFwqO=+D|R6r}q zT9`b#XFyaR_UMGLx@UkJG@WxGIRSJ87`(y**VWt9KowmJ*Z}a*E=U?ykAb`i>WT`y z=vM)P8k-K-5sDX1o;+pl*W5jP<%l03|K?=9Ebs+yaQ??NW73)4T&TLSO$6y zTJMWyTW7L;Tmm4T0n#EY4`;Z{J`h(gi< zWaNbdw8{l^z&~i95X1)U{(-SKfU+g133$9k1$+YrlnuJr8>|Mj-~eP>cMH_^DUgr> zZEXdKgVyGP=p5Hh=$Y&}!OlwCn-4svEMB6=aLRiw_zM44~@)AZhP) zEZ7a85Qnue!CJt>3}2P8WH@l^40KxxSP!TOn5O|z23o@9(F-aw5ufZH1fED%hDB7+x=h8RpU50rn+qFdI6-fqguCAvi`b2dY3u&ofz@a{TCEaDDkmkGswB1 zp%vKjV9>3hCte!=M#KliG*JHFf_e@TE+wD|J481VoS zWG2`HmKXSYS$_Qg&)*DL_XoOJip8Vbgc+3N!94-XfBfx_Kx?+UU6?sMERXXyUjg&b z+6v$r2Xyc&sA=-TLmE`<_kfe%%OxQ7om-$=JD_DiCu9w*M=$G{IiTVbddnne3kRsF z2N_o>goYxxV(Nx&&w=e(>xP){@&xFL=U(1curZ*PEVM<|3F>ixDj{$)7Br%y@M6P0 zP%;3WnFqNpC`QEs(xwBC4?rw;Gr?xj0OX(vP}Xd^bbXADgzFV2U9*Q!|j z|M~yr;t${@(unaz@OWt@D7~Pqk9GmAYXg;nkbN28qyuWsfOfDlyr^CaawurqHRwe3 z7iVsQmU@7e$$(csbc4rrd{itvx<$Zi4nbE3&j@;Q>@hDr=T zwJYcVHPEunZr*ONjsWnwXEUhs1n@f1URL`)NFniJ8+5S`hetQBk_7m~DPa)R>A}&> z>p2&)EcG@xPYHkybMjH~@HpNGssunC4v*uFpo$H|>=u;<+cy(bUV&EPP6lgg1aUoj zS^IuKECdB7DC2>*BZ1eNfJ8vMd>LLyWk3Q6eEd>`M=x(ASQDtk1ce-E@By4AU@Pig zWUhm00A0Pwz|hS)eGX*Rnuka4L{M%4EnEHsE}6jF=o>*|9=)s&ej>RBW+s|zdeTA5 z;M|}Ff_Er;c=XN!_3S~Wf{tSG=v}V@8C%^ zju+=Z;!I$1kbY2gvKu6n2(DIP3wgoIN*9C8bx{d;$qkl-m;+tI+Xm9K8`RnajV-{( z`d{QhHF>-&f=fd8N`c!FesFpHzyJTgnE(6d|Cd?F*VQA9e}VHSE2uq>l0Tt`&qaWe zdIkTsKm*V*0_(vE8#Vw4YwFH{oP5{41+s?{Is*^tkbs6qUZ;afK?{#wNAR|PAJEoZ zpUxB&0iVts73i^q>&`(kJ9rI*g$J_-=$dcvg3St07Z|(~2s}Ik-OmHsCmaB(EI?CD zFpEH4%D&g2e9-)xnZKtKbPI7em#5`T{`OkPjb6wo^Xy`ZZgyZOM2`yrdAJ-^@ZJov-jv-tss592Y9|L5WE>?~0U09{iL z@{vzx38++oMIL1F0%%V$DCm4!FO>#(HveZS_44W#k@D#kEe&C00Nqg-;nOS2>A}L_ z(;1_Z;Ml_K)2;f;odulD!K=nV0qo(p2UJuz?gf!PpxZHC7XADG-?umZuW#pjpUz9Z zolku`@4Srt_y51E;mMcab(FoVlb(Z0QRq4V@b!uqMFFS~fh?}wDgdeJ!4YQwYDj>Z zkD$>s@C*zhAN8_Yz97NeSYpjR4%r9~DODgF!NF{V&CqkpJeq$o^Y?%c?S~&dY3$Mb zkGV9|qq|rDlqP(3Fr1oY?a_JNqxs+e5_XT79^e1HX7%`f!|;+vr=!I&M*~LCs2Zq_ z@aT2>>j6&}9?cIVJbFc#J$mE+dUSqx`4QCN>SgtKMuLyC`H2q6_oSFBOr*IlxB|eH zc=7k2|6kq%kC8*C3c(bjKJRr=S>XX5EME)SHsAOLR6Tigu7M0I^g?KG=>drjenH6A z&=;JSU{yG{_6Aklpm9G?ebE^#0b1hT&FeZ1R67TQcdi(NjPG>T@aSgt==K)y=nm!p zB`{Ey2Q@`O83dHjzzMD!ddh3(L63tk>^%-Xu=iLAIo0qMsATIr;c@Yy$HA8<2OD1W z=$#BR3|y&$%2?1~7w86OkIa+c#Gv~B|9^XrmCFi6?HX5O?A!~wPOUbG2< zTAYxheE7F{7=SiPb1*Y7@C&eN3$QXk5AO8v0J#&?!Z18(cHmle0xJw7(IGrizPu51zVt_2%tj-x?NNfJUdT&bY2AC;sCJ?RHlNB1*Jw`%R~IV zCmBE+jAB$AAmu|RWZRiN}$_?yJJ*5JS=b3OTklrC(AjH&KqDCeR^pCuIE6NS}&_;Dzs*X-ctx# z0S7zHFh&J@leEH%1)FiUhr!3jI=r3-a;rx#=yV70ngCD<1a9kt8Y5r^=qOB3;imx# z2m{c>p2dqDw?N*47Ny{OxL|B(n86$Kpo1r1r9kU#{+3ywMA#h--VBui8eRiMmIp|n zyTHPOfBijBYrX(ULc^o=c1egwuj~0pD0y?Y??o#5z% zILf!%L%_G&K>{>hm*8r6$<^@oOLb5SpjWm4WG2)s!~d^OcyxDw^H}!;aPtm2w1m|6 zk5N$o_1qze7&;gSnkRmtCX7g*9^KHUD`W{ObPa9y25|lXhcd)O(0Li4)AXXC2XBL# zoF3f`5W_*|rEmEEA2c2gYTSW~+T)NJ2r#=FlKnjzkAPeZ*=7gIQlKixqn9_~6sSZ5 z4K0Eq5_BuNM=$TRV-P_FP_?1~8mxU$2VSfTjWyUh2&fs+M zAu13vxIv53t&q)tTuZ9p(H$Y-(Otmd(QN_V?Fc&V0hB})K(U|!Y1e^P^@F>UCyztQ zD+7$Mg`7?b+IH9qo^V2QD9Cz`UfxZIL2iP17UEFelb0ZZNDiHN8Io)v0qp@kmI>T* zh6Fh@K6yZX5<{}?<@DbmeN&)oCcvFMEszkX7z4KgJ)VM^taHGFdM~&A`v3pMw2wdk zzcl>y|37N`uPhFA{q>7|7eGdX`evYhR(FVsfJd)vB&cNSj8Osav+@At2*_$b@I)v$ z?es#I`$@cz1!aS7*aE*7avy*Gf87JFNT38teR2R&pBx7j)s1f;(>QA&S*90CABPn1 z;6!#D(!heTK?xYl?qzio1?5I)`?MFL1ypB%LlQK31a?-B3V0r`dkVP9dMyDSIK(0Y z+FRJi3vyH^Y@iORwG*Nhyv7pLiU$uI9CJ~T;CgXc7&OTS8f0ocz~5U8>h~fYSOKnY zKsULAtV23o2b5bt4h8uIbaFbV#eu_4==xEQ-YMWkypR)e!Iu|gfOpT zbe|2lkOs#-sC))>=)hSLboA4UJ9A;d09Fa=L{9~kZs2uH|H0!M86K7w`P)GaXHf7t zz_-_c4>i#|0a|1WX?A-ko&eQ6U*EY&iV)LL4i7~ z@HPC-vC+K*umc^iUFzoCI(3S{zig__-6R3m% zjpu;3J#~kGdO@JRFKA~3I7>l}Ed~`muudO%2~Rip>`+ii54x%Z6sq7&!;r$0>Hme7 zdLT=?q0>y3C(3g@dLzK?c5vls`MEp>)Nurt0G*KT7AWJPv?ew0d1&4QjhlVH=>fVJ zT=Av{<4=#yPcPHKWhKFkS8&7G3PKq}D4jPy|GyMRG@}va9k{=p4eq9* zo)-Wb59{s#jedD_PXLYDcy!MI5100CfKbpS__IM}2YAr41FY&GX#G8G42?$^o>f4@ zY28WaT{oxuX#q9&cN za9{@AR1eyC08S@9Dg`eSK!rFg96TVc7tl~sz+I#u0AJ@-@cIyF9H+peJCFn7J^_zj zP;&ZSFAABAEad255e6ON2)zQlm$fSr#nGUQ2tH{G?C878@j1G_1MFyFk4|RrJl{=F zSq|DZ{(2Iq^afw$>40$Wf;$lRLK^>|imTxD@fWXN{QUni6c%MD@l_Upwm%SjN*5@N zgDabZ51BohPcnhZ296iPpu~cZ2XAr!1=4R&A=nMyJ6QAL=l|EUz)1s4pxWm{&^}N# z_+mNOOi=X*b_?9Dey}*)E&-5T^T5`?2^9PI+loO0Z5Zce7l4l|>;tb90Uy&2iq6gu z6$8WDpb@c**EXQc20rlL!K0fE(mVlqmJjRzP{!>AHGVKcr;;=ki zv)`lJ5nSOz_K$$?Cj=*2%?qHI1CJF8yvT=!X@p0whXiPybAW(HcLaw=w*hFQuZD-^ zeg5`Upd4j+nZJD@h@tr#R|XFN?XSY1_obHTL*M9w5R4r&+j)q5B{|GRQ%|}cp9Wk!N>AYT|FeoVpKRl z9Rh(DYM3ry0Hsd@50KAxf(l~ITcElEVyg$Jq5$8QA_2Oti@$w3NQLF8Iwf$$*A2V; z3Y0PhUYryHRqpTuusbilzUkR{;U(yp*xjJU)XNwD{{J^T3942zUOR&H7=UVE2aj$h zP-ceQZGng(@PLFXBBBGpJMRoUz}LHgBHHp`%`Q+5hn)5OqRS3kZ8bxv8VFVT^ymMV z1%J`@`0#Wut`03C8uNR{A zKddm#*MJ2Xc!Mg~FBYIADDWZ?)xbkfe*S;G0VV%X2tQn~M*~X9I0_x>YO|aqA&7Z8q=g(JG;QaX*LfwH- zS07@_pZslVpdz&SO#-O>5&>$zM1a~a8IU{#YM6lPC(t+ssKEj%N(5f4`TFz+QXx}Kmc@1l;!90a?o{D?R!B*8Dz4eMkTxOd}#%`GH#|NI6x;o`1$|k zURb*VRso}yANi>Fd4d)n`ltlFb^#SY;B%KXK*tS%YTxb{P{#$dZLmbe12mKbu00|9 zdtZb@>q!ldUQh)FY8XHk7)E$lUZ~jw@;~I>(HDR3gW9J^dvs9T!{2ri62A_h__YAV zFZg-~4{+3V`lvt)OZfG}-Jo8S=0#9MgPkkzVh?!r0BDXARwQtEbVmpvs_g6h?Xe(B zEN}6*hkzKGzd*H(gooyD*v+eozdaZ~do=$N;O~_Jspte3^q>i2*jl6)U%BD&5Ardn z4gy!%;1fV1;8iy0ie(?XRrYcIcF-&{xXK1i+IVXIgjd-=k*aL|zIJfJgt`J!ZRg`~ zMTCdtwelR$fmE6wp$!EO#g870;A4R#K#h@dKM%`Wbw;rC2(5cSYldG)AsMRS@&BYp zCurR$Y>3OF^YZJHpz6Eu|NsBHz}5GifB*l#P%-}wI*ncyLWw~r{(C?Fzm!5rf@ty0 z2?}4-{M^eb4IU_k&dl+H#skfyAqPhw9qiC8%UH|D(0ZG{6%sJ4U6XkjKouN}L zE6D;k^NzcyfF}zE~&z`MVDS#L3b4zhsSrUVLPe7A6}`SKThz&Nx+*LtAD z(xcmf`u7hm}LAJlfR0JU=*UIu|`Ur_5ARA9X* za|4Io{X0MZzr2MKUdRVbcyv2)cyxOScyvzy_Z7Pv!2M$I5RB#FVi^zc@c=GT93GY@ z_@^J}04*wkA4ef<3bF#JJ<{unTOZ;grr=5-8xOrU&`%iz%~`sp*MI0LO(0X30&!HY^jYm&9Xzy5z63JMAj zNL!b|qdSrVWMns}c!RCPhVqXMsK7>C2=U_JAoR_|G^zjP?Vw39kKPJKaNi*hqzXJ7(FqSk50kYJHSN& z$WJeRLXU+2C-DeSH^2eZ8wq$l1yt@Afa-<{(6m0ditWx(f%c?feVP|Lap->;2ukyy zbBDmic{ivpCE#(~0ki{z!Q;3Cs4!vZHr1-+V`%+Ws_X$O7eT|^;QJ=POPioeYLV;& zm&~A9u1?TmGf;j4&BB02$zK?OodHtN4N}k@qhj%T(~BA-P&Rl`3Zc&3`1$|k&%fZ6 zT#y8TmL6J4p3CQ4MtbApB42&;Kpa1*+f}!!>{}-<{ z{``OOP5<}*7lD_4{(mv&(eM8+!r%Y<|AOi7zyB|E|NQ&^;>P5E|6edO{{R2to$l}d zFET+aks1I0zqmj5|Nj?Re}DadaW&}|=v=Ws7eKQr(6S1At&U7QD8qrW33z<5lht}6 z=vtkp<=`d==tdr+i9Dbic?#K(ia9kney=(1kPX6G0cw*pz~Aj>u7g z_|>DA_5B1;$p%^s3OY*efU*GWPWj%o+ya^=S_JSJ}#LM7i8cO(L-cJI`YoMWA zSQ811~vX*SJ=L| zckSnYaK{r8+35GXmQ|zPr3A7aGWP>n{{||^KvMvq6#HV56{NrcpJ8VJx+ug0J|i{l z+81yw0j{qMJem(ewn2j%eN}Kd(1Jfu+Xxb_FCKy%2fBV6?l^S!@waUU71hm{`?0&h z7vDN~bW3?y-sEou@23LS6j2I=SaKf(K86kcC8Jn;HF>g}kY%1`3O>#raspwb%L zc?J!5zwS0X`MUiDBglU`NNqomKT*>|Bx?9W+M^b)bwRNWT6xj{Dvb<0dPOcn!WxwP ztiX*=(DWmCXZZgE9?d^EYR-aO;{fsvG<2J<{`~)XB2xVa9-saU2~VW_8|D=ssNAf zlEa`j5;5S>Bk%}ojf%vJQiMVLt+xOF|33yg;|t_{$bnHHF1Q~8 z;l3!n^7H@85C71|KS1}-Xn@+@3ZS+($W9e(=^wOkET#1Fydu9(euP@WAW$pri!GDCvp6tqW3qSAhIf0P<78i>{rZ1xT#T z9iZc@Jvc!7?m+bhxEAB1*qr+pGO0_IHEH|CBvf^G-wa1GC}nfc%=uZU;!~+yu1y*eN89&@U_C-p!AOFC<9Qf2MT!$7y~px$p8|8w0?U<*2|3Rq^as~B-7rf?> zbK4;N7ymB){Qoi%UKya2Z@n!lpo`leP0~itxNzf}6`<(rTm#Lgz_yKByff}DRp!?{LUqF(3_8lh2DtQVNHPA{F99F$OU=u+_h5#sLB0wyO z7Z0o?GaRyojVtDekHAu?9qgV9uNsuX^<}G+o0MxQIsDr47*9cr5odO=9Nnq&B z3ynV=ocI}P_86Yz4?pk{bPM<=enHUM=iU|-@QwpeL-tm{*Z-gR1zc1dKJg3qsCazh zj{xr<0xM`eP-6QDwA{)8G-(CimC((=AAa(a2fx+{{_sm_{CXG5_&)Iq$Z9`gVMybD zfBN;DG=9BPrPHdW@Q0s#-480mEIdH7YTZyrHUCVhjRN_~0&FmNe>BK0NccWL3d4=x zU}4C6^#sWG(7p|5W)`Fa)Q=W;;pGi=zsF10|NsAk4GjP-qya5z1_$?X$nFLh8`PJ9 zu|XXgFuRv^lO4zk$eJ6EUe?7=K}imx)1#MliV;W_bWS2DkAW*z#i>ZaF92GK1~M5G zcOX+idmlh90GFPa>3hm6P`?hE(i)F|65in#{^x)Ge;I|`JVdWQ&V#B3l=G|jx3Rv+ zMzjwhHp2-J2j)py8I|E-D&Qphlg|JW%Q8qGHg^`!E-@&c0N_ zqmy-7GpHfwpABuuK^*1L%UjnBYREyO@dd*nP($uTfj7?T(n7?T+o7*iM+7*iP- z7}FRS7}FUT7&90c7&93d7;_mI81ony7z-E}7>gJf7>gMg7)ux!7|R$K7|R(L7%LbU z7??8i!R}(pFJ@q1(sN^EU~iSGB5== zGcYhErGtn91_q{Nklqv!D=meAfhjEyM1Z*_Dd}Xk)^qe49xzeAlU#g8Dwb2$iN(AY{baG91PYQT$%)8R~9oeFoz_9YzYl< zW@KOvODtkwV2)3Z2ayFJGBK%`fq^+OB?Uz0q=U&E5DD@wb7B!leNrMwHmMk-GO09; zfq^+Wu>eehM3U3rj3FU6TvAdv!) z?ZpKk+lvc8wig$G)fa)ul5CI~u$zl3L19&rn8d)qT#^Vfp#&VZB{^VmP%dFEsRY?x zmIw;5^2`(l29~rOkWvPg;(SoDXJ9F=1Vse{3+UW21_lvxUkdjbHNQCBPRxmQKM5ZQ!oEw#& zm&(Avl9-%a0-{nxU}XtNdvan9NJ(;j3Yb>{%3v(XrJ#Jwl9E`G$iM)iKyoRW zU?-(O9GFrBO5!Xj#bEnVNYMSZf0H?0|QGg#7Vi3K+Xl1AS}80c_5eN<`;q7nG11JUSckYmzM-~ZXUSYWXS^; zmMnRxVB7OjLDd9H9=I%I$;(UzYXFx`EO`(c^76rPn^y$N{49Ck@_;3;7?ibH@^e6S zBuhbJiU9)yOF?20$hif{Ie8#nGN}AuDaa`WrJjN!P&vX;qsY)#ZMMo7ld4nolh5&mv zFnvMY9ZXN?gz!HUx`O!zO%R&F0U|!31;YRE3p{AeFoE3*td5}oB7UJ2LVsw3&>J`) z@(bD_e1=X4tXLHHZ` zAnG3MfY`f%6+$oA=Lu0a42$Qz86@W(aKnO`ige5cewxfoF9X1XLjDNkJ7tKY+SF0h-Sg zp!uu;YVHAOI81=%M+Im;Yk>I|n$IRc<1GQ2&l;fl%mJFu450aJLI=cs8=(2^0xZ8l z^O*uPpM8MlzXGT~6rlOc0h-SWp!rMyn$H}d`OE>D&k~^di~*X@6rlMm0GiJ}I6?d` z0L^Ct(0sOFJ0!dx?1az^(0umb2!!td&1VZPLih~Oe3k&sX9u1@#0#MLtN@yCK0y7o zAQIw#186==fabFU(Gc+i!4UcZH2nrZ^O*uPpE*GD83Qz*ZODSCFM#H=1<-tC0L^Cy zp!5e={($DU3DERz0L^C(B~Wvq`D_9-p9MhkSpYPj89>bmfabFU(0nZb&1VYGd}aX6 zXAN}_a~q)f?E);{L-W}NX#SgE3rVLNtf2V`n$HBF`RoFe{_qnLz6+rFVgWSWCqVO= z0yLjJfYJ+~`ON^D&ptru4bc3S0L^C$enZSnfabFgFdCNMp!LXuDG>iKK=av#A_#wi z1H}Cc1R?osf-)q19f0OH1_suo%97M#1_oBGByh`+71S8F0P#z~ZBbUow35^!Mg~^L zoXqq*FrAa1%*ep%1k%UI!0Mclk_nP`&dAMA0rT_ALF$}AZ6OdpCm+<1XLZdhDXL^- zV0A4lP0Rt&MMe1_eXbQHMTv|ItZs=VU~#w1)EtmGpay&~NIWMW)Lv$F%PB3+0P%}b zQ^De(`X9sxbtV`YSlyk2LA_K~P#Yg4@0pj9TEWP`>X}z!W&)y%UBK@2EcVL;+3%B| z47SfVKM&N7XZ0;D0ju`|SQ|cU?hK(pBMqzpiFuhIe+MKMf&CKzYT+<4um%)C z!YRlH++|=5O3X`7Wn^FtN-YNUpjm_ROF^9g*5HiHv=T-J*5I7XWRQGtNq!NSt}IRi z`8TvU5v(sPF{czH9+p`Q>ZP!TXQqJN7haSJYQeF_L%KAq@oA-?P84f=No7GQ0|RR! zD1N|n4yY%~npjknSP6>Xba0=RH3<|SAbx2ksGkas_W}?f6psuHtjUSV86b0#GZI1l zRn}xse1gO?N)?`pTg82C<;PjH5UkYm7vL;t1gId+BDe>U`AZtoIxaY?T>M4NC zPf5)Ibs1PwGK)$;?n$Z4%u8orU`+)n0MWSxVDVH?`T+4k=>tTA(g%o!G}~BH%fOut z)>Ke>VPIfQOU%qk1Jk8BB_JBo$z)B-ECRKOSwUP-x=sV78<2c%NqjPtE`-uxc~E)+ z@k{fP4Tkx#Kp!@~mXQqP&>{yF4 z)4}0VoS6>l!LSw=B!ap{AR08@!&+Pb?#Hnf7so^7OA znOjl{8s%XvE>8t@I9N-3!TluGlEfr%`Y!<`I0gn*(3l1&zDtTyL7h(4k|Ibx1!YrE ze3XLnIRgW0St7V2&svt41M0?tXmGfdL&L2+sWc6gzCbi6eU(G=e>o(4*iu3HqnLq# zO)EMU++}9d0tdh*4Y&F4)$3euz`{kSg~JeE_nQs%|9&-T->txmzETO#xmK!5L3) z;1a!zfq^YPB{dCHMzF;ffGQaV2DZfHlFYJH2%{7&_E5GGq%Zb^J$G6MscQCtCHfYMJ6 zh*6Z73n~KG(uz{S!vSChXh@zdt+b>RG)BUfo*WM@#@N!6A@vDcdKxHr85r0yQgaGG zB^g_0o)37ChAlG>>aWZ^P-)JB5?})j9D&_a0BRzE(pW(f zXjB!XCK)o;$5xP9lnG8Y1>npGk}Aqi1{Hv81>nrcz`#}r3l>n#0?rp8wV)wCwxZPB zd~m)fN-fI-Ri|u4pkf!~_@Z)XycegI_<(9MHc-s~b`OYA5XQj32CgGOCbL{OWNfq|_oB|fnfl;+D);*-H) zSe6o>2O7v{D@!d(0q4Q8)S}|bTm}ZV^2EFnusP+Kc`2YlPBw6W6@dq87}%5Z^B^rH zD8DE*EhiN;JPYGPuK9rQ7#P@#ONx^7K|_%c5%%KBV#vTRlwX>c3CYInT98VEfq`8s z+7MFLuxmw|!C4k?mL;4O3+YX;Yk?~#3$Wf;P}qQ2X}KkOpeZtTEl?X)LlYzhiwJhG zWuV#%!U9!a5EiKLWOqzSaRHC|vpePI=YZ=FcIU)A$kYM5b4FqwxRuZDoS&PU3Yt{_ zu?liPEqiw7{JgSM&=5SkOKMVSI;a9+2Ulo0d5jF~ZlHb!*bY#=6&7K{$iVKASnTBM zX$WUQ#ax4YgCSzU!LCrT;9yr{kXUMB0k|K+?iuVK4xR;I_bd(r)$xoB?2x*xn2~|q z7o2+_tOD;;P|t-OQqO_K@>4=GL30i4;93mqzJSEi;#5D7Y(RE8WbT1IAU`t?+&g0j zS7~5%;C=|Gl4TEq)imruiRGXgj*)>KMEMq{Ls{US8#}m%5?a8>zz(VOKz0PDmVg2n zELH-l%orKiK~BmC)vfFyMU{|=4iF16$-xd%1c?ujw^Kl~knG?Z4pgr~SRwh04D6su z4Hr<)ggr4SzX+V7*%MRB62Wx`JGd7E8t-OL%*lbYTtO_zU^|EfYQ{1!fLQs-@wp&Y zZfYL57-UZ@N(VJu7#P@-5>vubi;}>s9H`0Q{tqbsu!EAOe?bXI7F;V9gIQ^ib{Bh6 zWjtimnH`iJQj0*c$)L^&s2XNZPS1A+Pl&LCDpGLK!4AqM>7XJ5kq6n6i&7IIeoHPb zf|QT!DWFsbs*%`JQqyu0L9I*nlvHSYnLQ=7xTGk*l7WFeC9?=JMZunuSzM40D(2Wz z^1(68z`&jw4{{7hU1~hE>|;-j&rAWA!R)E=1sQpzpl|`P!1X$NYJ4$VtT+QImIrFK zrhv@LgSh}?ZYHSqVNb0nNXi6N*zBNU8(c23gZok7@Jq`rF{l8QaqMZi;8eoE0Aj@# zgDQ0PwEUv-#3GQ%ppHf`Xo7(~tthpk05s3Z4$ANl7o;bb6oFgh?CGf`!8xD;jU63JZDHhlsz*KTCK8Y=H-NdD{A)4VpmA- zk{vX!1D;D@&&f;zMJxjYdroFaY7y9EP|cB=k`5BfPtHzF0fk>~Vu2GR3?Q{LC>?+% zX27ijcF?2@xS9a7{6RefFbm>0P$G2%RaopGRy;V)^I-KqdtNR$^D{88=M_L(E$jv0 z+#Sroz+RB#18QD?Sebdya4CS~c#v3jdO;$nrNLeR$@?I&qSVw}aC$B%N-anPwTsvb ziZaU}DXgHR2+}fQFDNa}0M|0?1*Ii!;HfQkP!uGCRvWN`Dm(CeJD3GY_aHGyEEJ_C z=Oku=!lejSv9TAG=7GEis!I~%A(LF}#i=E};7KeHD;_)#4Pk-$SYQ^onq)7|jED4p zKrB!O0-2JT4i`&Dh`~(GFDe1g-Ln@LB<6Xif^q<;?*@t0;*xl1o+&Pg2SpCZyb@SW z2G`Qy^a5sq`h}qSFEbA`O9ZON)-~npq?FgdWpRxAC^B# z@(UnMN%oSmc*v|8h*b*lC8+%i)mvGR3T}zBgDOEY6Hsa@&C9F+x9Qo-QsSYefa-tn zG!;9j-p>Rz(Ahy9aY!tb7bO>cDLJCw*bAZeQwIvxDI6&iHPzCP!!Ql2ABLjy=VsUV=tBE0k zX#`_}Yi16Q)WibM6wulL4)Bm5xUS;xEDi>B)N>gbI6wn}P;-5Q3lj6d)i{T5VgYm{ zk;At%rzEo=r;?F@!>=?KI!?*qUy_kp1W^mFqFq6~MvkDwa&YCx$iM-razTToP^Mc^ zKFBtZXizC=$pHtbt_2OkF*1Odpy9`27!y47$q}4UT9N|pTyq42Mkye+g@6VYz-=K8 z(0T#C#Jqe)1`hDBp(ALO1P9mwzQySb3>=9mDd2Hd2-7b=&pjW+%*g@erD6~hJPH6B zz~KNbBJc%IS%aC7EXk3SSpqF-Ig(0?D2e@wo&g5Vw zC`*A9fRhHOVC6{7OAanb1?6sz)VvgD$Z#Y_YJQq4XoLi$7DR(H5Jy^KaY<1kXo{Ev zRCj?woq++w1cy3|nGc#+<^WY+P;Y{mpdGa(&Z z4$yK1s2ei#a=>Ylfq?_uZv{7II5LYtBU0dS$SeU3!h-s19H1o(Zs64uU?wQpF))Cc zpgaj;Lh3_MD#^)DcFQjUt)b%pEnR>#0XT9K3qbaQQb}%NNpc3b+T#EXLl%JtA~2EaDe-y{-Bi` z9N@Y(9@LTJC`bxU%q;+o-*G_eQ;;`7Ap>e2F)(lxIK7K6&O5YTcmj^dK+ zlKcWtJAtFPB)HUf9Yp=?;i4iX1< z#3ACw=3ow3y)lv+W3Vtpjfn|J0?I}bHw6iU+5((f(O@>HF#u*G+yEXMfT{trp=vCU z%&|mb$AY{65W8YwV*;F7(O@N@Q2`hmY9?45VrFtiVx9tcE{;6n+F zSDBk%TFl7630gh~9<*g-;Bal@j14Mc z7#KLgeHTd2h%>P$H7_w9JPOU3Sd{Kpnwta~uj5QgOmPHr85lT|Qj1HV^)n}|5m5{h z&n)qQj+$~N<>!}xD&_)^cxiDZbS{h&+@=6kJ`4;HHe@LzXL4d`dPWI&1uG|bz7kT2 za)R0w&=+mz>;mxoHYcpXVFVI~^r}G%-8fU@a}$#@z;i;JsqygEH)m>I zKCHswOv}v4fo610&~imzP<_b2z?qg=k(vS-d*B2&i=p9@mRkY|c95Ffl6bHjhz%Oq z4uH4^)V6@m8FGTyFu#MAJc9ktz`zNfi-h!pIMb6sr2@FP;so`VVQN4P2$*|7Er@u? zJRK*PodcdtfUrT;2?GOXW-)a12*d_WVrAxm<`+4^_JbV4z`zM=JcML|=N&nr{bo>! z31frGYR;Ve#1v>>juSNKodXRAP|*9A=Yi8hPJVF-w5H~SbbcZ3&rPg=je&FKf|{a` zwhm{WQ*dw)C`~XhaOS0!B_@}Gi(F1nI|1bTT#z`Z%>{~Z5E~Rla5lWs=LFAf7K8hW zoOz|WP9Qgd(jK@@g4zXZBN#9+aKhMz3=EtFi7D{7D@aU;mR zkqL4qs2Kq+uNW9OLG09`V9+vJ&Z5+0kW)czJ52ph5xl@rtn0R=56tUz_0nF++5kP&`xXN41#PQhg; z0|S^{oCzM`8|SR9fb zKqK~CphTvhT$Bu|7`e2f4dAsWmsYf)0l1#DU|;}o!1X*-nV|`?40uc*CS!&yV-Bn9 zK?Z=^6)xIvRFu)2oeUd;M@w60dt@RfK3K3_UF<9w~#=i z-ynx3=Yu*v6`*znmlkLsSr60)W@O;f0*&T?2EDm@L6bqnAWku8 zS_A4+(8NqpW?~9xT^AR4%m>=2;{pw)6hl`4a0MlnJLl(>6oGc2aDf8DB@;BF&&UAg zKq?7F1}@M-0Z5oaIMC`9!~u13U`B_4$`@!uk}EV1RIEc0qCx<(5FB5hPQTn(CXF2VRfC1!^J1gNDC~85p?IljBQ@ zGSeY?(!pc;kk%SkdU9@JQ8uI~=SoiowY?y96c>0H2s!}51=_;`YcYdMa#%Iam62GM z8UUR%=K{CoU||jBWP*Aj3=CY5g$z#Ms){Q!54@-dlIt^zT`LNp6K!1J#vRN6aBD3d z*0ylTIK`YGMjxY8A>!EeZg)o47!k zIkgDXivr7leFGl);esq&@B>%lP!1@FK+5t<5=&Bjz`-uX4%{ALVBjiF1x@Wk6H;+zI;eO8&l+%n26Pg0K+y$K1{%K!%_{+Ig5d(U(ZHD% zBm*juilGq<9#oZ{U4Jjj>@S8*kX z18HnRIiRKx0|Qq{FvtW*lZy*H=u%ve16t$A1yWrMiyzSb9B>i^84cnp?q zAaTGE3=SAjZv|B4fCltot5dijOEn;~U0k3&KW_O&$>5}1mV)TzaefQSq0)j z+H#=r69f;`S^)7N+F(3H8v`VVXgzSl8+4$C1&C*YY`c*O#2AQMj7%XGLV1WL5lEi} zyp;*!L9{__hcy3SzBM*92ip%Z1=5&<$(cZ!X;6I-4ouF}5MmBQAG8ezRS9jxK|=z{ zgZc>KW|%1!2FPJ;0WlJ)&jQi-;s!P4K#ftTK2QaglUiYDWWmV54M_yhLWCRKuu3XT z1F!YthOT{qj977N<>aU9`Q$^Y5N^;cT1sXSXhs2K3OGrC*QbNx9n1sG)mMV#z)dCS z8g_1{(qwQg4IXvkhRvjb+eF;p){;{tsDx)^;PyyOEbvdtN=*jsuI2VgEXmA+R5^?c z+@LM6{zc$%4n_uU$T$|X^}_9&SX7*mnBx`f?+22D@It^FV!08Grea10ZqO7NIIDr? z@3{S;opMjmnjG%n)DpzxABcyTW#a}nFd>a91_tiL(hBPQ(@t%j=BH+#g zSN!0S0R{%{ywcn>aEb&?8*;-8bSh0_VBjuD0_Rf5Y#ldfn=8Bq0P#R=)lBd@Zx|2K zYy$B>D=t8ZiGhI|RR6=<=3riG5wtzd4P8M2nNj41Hg%xsx(M6`2!gDH=Z4l5pbk9) z19x#^d{HX6RxSeb(o(@KQa4a405=L!QXx|W+@QIiV%QoA7%v&z2^ztH=LfJe;Heza0Dw-raYM&eKvg+NA7mv3WSof`w1%QM zH5sxNnHxO95)X^9Qpma;Xj&@G%g)O$&x6JTWa%Vy4>DT@iof#2 z?9|c%=olk6xSEESAz&UnU4wbB<{Ni;QGQ7(X!ID=$YNjs-2usafV;7&ftBAe0W_|{ z1IlGZd5Jmt$pxhh3=BNbe5PMol4ilcz@r7}#)8XZ5I5S;05QD5qZMsvi0GSxxWTTH4k+B0cdU-lzn*8z`+8E z6b1&K^kheHy$c!D;Ym*h?Z7Dl=U|X5sB`C+4=(jV-2BWGa8Cm~n$836+~z|XC=3id zpt%fCJq$Gp)Y6YnPmTwzpkiR)0S(215*ElC3=BM=3Jo-%0U2xtb3q3WfP|p3Ag)(F zXn8(d7PO@VBnx&!JhW2cf%I@e=7PrWc|hy`z@=|0Xjv#vo;$SA^UDulVBi7OOU@aI zMUbiw%!Nf8R5lVAp2K8L_p{SDE|kPp8@4FL_*{XpnMJ} zzXHk^fbtuldK=~`6d&4iZi?pnMJ}e*u&)0OhZM@+F}B4N$%Ul)nSY*MRa5 zK=}qx{s}1G0?NMtP{1s5X1eCu4%2$B$cR=|XQ2qfZ-vG)#0p(jj`4^yk2Ppprl0JE zd;=(d0hDh6<*$J99iaRTP`(G0zXQq-fbtDCLBfB-N(k)$JE@+Uy~3Q+z6DBl3e-vH%1K=}ut`~WEb0+gQs5>}`PZ1)%&1P`(0`zW~ZNfbus$ z`3_M20VqEJ%D({RCqVfRp!@1Snqt%3lEG8$kIRpnL}?{{WO90OenR z@)Mx^2T*Y(BZ-DX{)JE@)tn)3Q+zADBl3eKLF)BK=~J-`~WEb0hFHr z<$r+k3!r?4?GSq#pnL%+e*%=R0Oc=$@(rN;4N$%Vlz#xq4}kJ7K=}z!{sSn#0LuRW zoN%6|amCqVfhp!@ z3!r=hD1QT#?*Qc=fbs*N{0mTi0+jy%$}fQOKS22nP(H&(h&v`g`2tY>0w`Yr%HIIx z8$kI7pnL}?{{oaB0Odb`@)Mx^4^Vyql+UmWVs8VKF979Ffbtcf`~^_H0hGT1%6EYB z4?y_=Q2qrdKLN^r0Oc1z`5&PC1}L8aS}#w4@&%y$1yH^MjBf%t7Ye#Pj9~$kp91M_ z!}$y>5CNDx3mP9JE5X13SI>ba&xgjBK;tW*@eR=UIUoy=%&$O`2OoiqB+rAc9*tjz z#s^)g1`>k#kAW4$L-?l=!iD>ffdO=v5kkHNO}-6{--X8KL*xJWAqp0O**^`;Lzw>p z%{?>FUKteEi6%YqWz68y_Dl~o%8eaoV|0Fc| z6QFx=k<4cR- zrXHFd5#<4-IDqp_(9GjNlV^Y?SeSbx(B#d~^y{I?gD*ita-RvByaO5^ntkE!vq3XI z4o!Uu8b1q-4>>&$5kD_}LkxuZ#}UGX+t-Jt{{!^)C760>@dH=ygr?sajlTfRJQp_4jqihI{x39n255$Z`Nt1Uy#$&(_=-KG_)|cWcaVn|05gxl z6jGzX_zGzJ4s`X<3=LDyfyNJk7!MC`5EtYnnEC`X_vE1QBS0FE+|P-|k3!?mLDLVO zN@ZYR_@Im0{($je?GG3q*8YI;VeJnXA7mY<%!ct{?GG3q*8YI;VeJnXAJ+bW@nP)` z7$4UDfbn7N4;UZT{($izv4!wo1;~L&{)M$aVCrG*4;UZT{($je?GG3q*8YI;VeJnX zAJ+bW@nP)`7$4UDfbn7N4;UZT{($je?GG3q*8YI;VeJnXAJ+bW@nP)`7$4UDfbn7N z4;UZT{($je?GG3q*8YI;VeJnXAJ+bW@nP)`7$4UDfbn7N4;UZT{($je?GG3q*8YI; zp~X2oJ;T}`FnL(}1ICB7KVW=V`vb-YrDaf(f$?GO4;UZT{($je?GG3q*8YI;VeJnX zAJ+bW@nP)`7$4UDfbn7N4;UZT{($je?GG3qn%&{y0c(H28n1ICB7KVW=V`vb;@wLf5dSo;IUhqXUo zd{A71nh-EPto;Gw!`dG(KCJx#m8n(_Fyu^uD zE855uX)zVAR-_DQlRUVd9}a+sh69Y3*L{Z+KLfj2m{q&Po0JHMdB6SP*EH#9F7vdS8=<{H6=th(j} zou3O@|K(Zi>hH$DzzaF@H9i+~JZuVxUs;msSeBTX16rj9O8@EkpkokHi;BS;Wq84B zh4bL&tMGyk5%vJ>I{~l7;RT@W7 z1+sh%%m=U0L#PL@?1CU`4c!lLe?FF_tJv+#m=DJVxUD`prt~*nZ=-` zqMmusJ+!=#T}<%P)p$V)!COfnOR0E4+m|x)(jg9FVBiIvK$D$XSz3?+-c!yCTD1i_ zdj`BpkAZ;~zJM6AgNqlm4G+BL%MW~m4uTI_`NY7$3tl6I*ii)H7nNk@r9;=b@q$)5 zf!UC~!+h}a2b>QX82G?jMUZkRpB6j`Ly|O-03=N#2|yAxA85ZXWZ@#H)BqV8ZD;`9 zzyL0`_&}RSpbJys0%pjIHTkrnjg8FBAO#s{T__)DX9J=%0UH_%u>`u>l}{@=7G(`5 zNC50D*eXth0CXKEAFMcoEU*L_3d-ktpkYFms$=fHedpvLLOW$@xjX_a6t<)16J@9 zfwp@i3xJRMW@O-l$CDfAJO{7}Xjue3oFAbAdPp)tAQe=CB5O&{2QRTisK@|q*F{#5 z0XnY`Ss)YLj9gIWLROIrS{jKW0NT!vA^gB!Lp}u0kXM(5`!AGr-}2 zB9NI2i6~fE4ax+CAQj-k6m8M$%%QOGAlJGH8~%2nk8RyeqM4>YDp?=SvenM0|=}*XJFt1SpX`VU<>5= z(vzLQyK7+!WckvQL8~zn^T1_BF#`i%dUA0|enCk_YI%MU=vD?kP-&Q&=9rh_47qNB zFBiPw6jVU@fDf_e%T28C%mXZ1UuTY_|X(VgoM1`M|p%;vviKLC0S4 zfsRosN(F801qChx17A^TUT`AP&H}#T)Do0pm#?_87`!_e9D*qf418dQQ)wD(xi3T@ zC>4B8BsfeH_a$L=ge`y9gu_ZD?$0U=CUD4l4Ed!KEHJnLO8zmxE8(;D?rp zpj+HPWe>#GnGDP2uygGB;RPe?KzoD;Xt_CPZxuo$ zB`F*0NSqysUH25k*9F!009Jp>(K0zR3IAGDJ!GZA!#Vu26% zR3d(OhXPi#@u$Mol{~l=tLd17})@5K2W05&}2Gzz0ggH9{J5NtHgJrU&RmN&!$IR+6fh1G=RK zv_BQB5!Ctumq*~v14t+{Uk_6HfGg1=kWg-7fnG*R5o})$R45u+(t!dFBn0tJZgDzn zJE{P@2!fvO4pIg4VJ4(lLKXsb>%eF3A~Y716hR7Qgb-*)8k#Cl&Eg2UxEM)QWkD)T z6|~d?mA&AOqyW5-0||lmJ|cvW-38T{lLjs{z)pn;L5|);7RpU50J#HM2-!nWji6R5 zc;6zz#)1-PWr+|fDu><$gb*suObT0XhNXV^aO%aAqU(cicF9Ytiv7PTa;SJ$bcl|lbHwJVk-dawq@q$ z`GC?s1A{<%GH6Q@s2WNwf>cie>B+?zMWBP!Ky7C5IT8Y(Ye-UyT#6Di^T16X1_lAx z_NBZ;kf%VW-3vgbGH{A+AuGs(=j9_sF27!{IN>{Yv5p<$LQGU5oWl$=# zuOI+!*nzjV!CHe5A@CmZ6sWgBtv%2*KXiYkfMY^q10(p{NY2X zgXa?@F?g;(7K3FABr)h&rVI>%;7+kAqM$7Ri&;P$cknV*5bQk2eHwbuYz7g7rf6vI z4n+*w3PllvwnI_GKzXJJY;P>ARD%_2Aa$^U8`erf7K62uKw=1l#$Ok3{x-J@4AHc-G$K-+U1_ap)ifRprO`y>LO@tUM9MZ9f z6@bM+^$Vz)LR2tssm{@8>33z-KWFBavw_YOnx-@Xr!pIQ$v!oVP;6>VZ3;iNDyW>ybT5xgz5%mDsb}+SrDsAcvA^kC8!(#w`R}< z!L3A)AX+N~;v*D6&?titq>O_e)CVn2!Ga~JdeGZpAZHfA1fg9b$O%$HkYNHy3mY~H zAcS1nf$|~fXg?vybPOn+<(HO#(>Wu95IoX?!H4sOB&LJh2@ANS%#yIw$%qq|j2|_SEIRtj-8nPg0$P-*dA_Ox*z$ph(A|nKIQqw@AcA(1_g^-J=GBZ%SmVrSCQXYW{B2ZxgDwh}-gkU3`A?5iH zuNQ*^L5K386+c3-etlvNqU;iapCRj)p9dLIU|P&c57Le&}@VYAH`s|jeLP!rG!W2kK=SWQ3^g_?lW>V*}v z!k}Z^vH92()m*3vW+vEtVTP&}>M}G@s0rp+)uM?))mp%#4O9k$i(6q(RfEmF7O3Vz zO|V22g}N*jrEUQ?NrbhcW22F3A&`X(3?NZReS_R&1&P8kDxy({EDA2qz|BGoQEmy-E zEu*QRk(pPb13r006J#!^4%L9wJzqM+tCq;5tuz=c6o5_r%Dq8u{F0~U>j9Q2Pk zNKF{DkN|WdHn`OB$j{FP9dRU#7^F_~O)LPHtsq~(>MF2P!M*{x0VWEmmmqbJFubyZ zjK#x6q4iB-N>*uc31qxO7+&E(e1fhP`9xEM+T?=L0Pq3csbDui%}oW>8sLjhkww#! z!RHr(2X7E2fU6=<#{8_|Q$zktE3GA|GmrP+O3bn3;zN9jMDd{bX24 zjZh1^7AHT~6?}OdLKJkKR5IuSloDjyiYs%I@^j+B2aF)8MLPKrAqt)+0*@&mn*bJt zp8bMQ3mpamSN_6~Q-DD!0(4#p*cYIfN6GNuvx68Jgdrmvpn>tyl2j+qjqAmX48llt zU|wp83FI(cVNgFIGcgAg3Yj^n;AT5$Xab5wpt)HeJSq)3_X&KztO#a31u8&9w6LU4 z1_lvCO@$nZBA`mi0BO(|GKvcp#w?sb!iLy|jVv&VUXW_AFf@{(Lk(bI?1mVF%5SJ@ z=wJm%HClxO@ny6jnlPwL1*t~Vrl3+1+%$#=qeK(T5VVQ}hcL`+vsg%Zi`2dcnT=ML zzzjhXh8cpTHUSxeRz*M!0UcQmx%Lz`iU^9!Xd~>=06Nngn`$hTz6khiFKl6Aggs1* za5xZ4btR$|ZH(Q4=)%x20XILO5f7{TL585Y8yY5{lf$t15?vT(Hkx-}!q{U6bo&ez zvq49-6Cn&W+XO9XLfs8IArzY-*b@ZkFjHjJP_s?Zq5&oxi&@`_XhnmLO~Yb{8FmMP zj#a~^+7#Z>fpZZ5Yt!TVMvn%sv6ub z15dnx)=z;{gIZyrNj6abzo4WD)Zk)d5P>&=ApL#t)G|ml%uvXHGq^2=OYaYAPmXO16>rE0$R9; ztQyj0fsSM&R72biPAkZ&!EFww(zJk*B4lCcRX>o{j0ot^)u7Tm@b!Z3&Y&)GY7r9y zD`X&x7aCwzN(CiFN(>C5h&Jl7Pc&RPa(@A&9@-AoL+&vki$fZgkbVHNIC9%u6j}sj zl%}QSCPG$ofX2{7A%zXB$EB$N&ZHpsfXgO$-UY8o)P#$}7Fa5PN*74{g4LslL*ffl z95neNilsjY5r<6sgF+`WC)KGmGY5P;zbL%mg7hC@qecjE*mZl5Vo?I;&=>yV+Ne+Y4idmzOrvNlqltKw~Y4m`3CSumsf8pee@E~)~oK@(&-D8e*QB#e!4NSK*`B|tScWV9g~ zlBhs+HpnQD1gI*9ib5zX5}?co%0yzI%mp(8l<{F(PQ>8u2lr_~i-uvL3s3&Ap>#;A zLkyme;5r})8X*Cm!9y&2N0R_8VE`Qs3vw>Z4si7g&S2mQSPXQj4e0LnV(@C$)Wjli zri5n#erRM_DS_HmsY(nC;-K2o0KBXnZF&kUV+c=g@N5FnV}uwxL`v}D;4&XuN)ZQ* zD`M@}Lu8;1LrJI*8Egqs926Bu6XJ*kBrq9h=5>PJy;uZtH8>qrxYkcdS~Ecr#6AOk_6hA34a#S1vn zp}Jt93kq}Cbf5%s+(M!VRI-3d3JL5H1**|;NP#MK98ypNp}tB^&kq63yC)?kXM-;Z zl7L4Ra#iXIx>^NE3Vl^3l2lQCnp0^SXqhWyjTJ%)5rWXNUs5X?(Y!+odP%KlXf(oB zrXVsRNDfv?p(i#;NW7qA9>@|{1_ntiK@16L>~f$S1_~~)KF}yR=*)Jsq6{L3IxP;0 zH&6^n;)pjR3y^&5xKhGoXj46jCO@NE1?!;D&@EY~}&nI@M%g zkU|b`^l}LziBw^NvJ$KcltKyt&}B(Q`Jj8rpd;>5C`&RRUA|&J(4|!=@Pb1an#HV? z;5DKW1A{au5O5|dX^3AS+0_EwGtywsAeW;E2QxBA!yOFD(~jWXDVh1Ov3!IqI1hkF z*TKs@z%{EhBHBRnv?v~8V35%QozM?UEEo|WqZMsoXlVp5!N3+EiYXb0pWuO@P+bdY z{}hyfiYgh9r=sD>6jI27d;m(qAiF^evOw9u*a&3=2-3Qc1qCN+nnG!i$)d~^!@K}a zcHpTrS%~A18f>uUILHYM3{ZK9{W=Qph=B;8$QP6pA^ZjF9?61y2dge2Nfc#oFGL=c z1T*tWu;guoJofwzmd6@;kl`JOJaX8h?#Giuout4FAUQ|?p%iA2J`A)iEC)|^d8uWo zMWFGPkc`Y?&;|t1BoG6GJSYfY6+h~dTWBGy0I>sZ5UB1dOUyxpCIbUh33yu#qK$*% z5CxDuu%N~snkY)J2Pi}dC_->1NrVzeD!`H~!AhcGp$YHSgStMDn=L^;f+cKF3kqx7 zQ4#DTTyB9xFhULPNLB)y11>l4DS~7@g=z&iaQCF3q{vzUG*|%U85=3oGB7BCR+E5z zfUF3#+*|>YxX~0Pfv1426)I4MF3}W$_qu@hPFpMFDnNLN1t3MrV249mNmvtkCa6(> zq6%k}KvaPO6XMcXtVt293LbHwGR8kG4P#I# zP=IIYbVz_;OJbm5S_Lg=$qG`Ysudjz${R43;fe)SNce*4K%~x6ei2eJ4Nf0Wb*TAW zM*)?u$-tnB)fe&U@o3&qgW3yoUpj_a;8f4R09A-;5u#KB=PU5CGd1M6g(L**$x{uh z6N3~$VE}2k1gDmO!VtT{G`tFvE0c3l!HzOEvQ|g~U51^S0`>~XM0I30!n}?((V(cr zn{FT~ky9bAxK_vN@nl5IfcJDl+=(rbr6N>sw zZAirqQk@Dfd!TBeaS2bsm<&w@1}%uW7>ORG(*o;pYGF%MxYB?Y)^I2)M?@`j`x3}| zx)5i;3n181aa?&7svhJ;GZTo%kZDLT=|F2aO$G)%td0p%K&r?Q!_puJVb_qDl2Qbz zG(dR{RD*z9E+7s15FdbCWNf5^@MLjjI%w$;hDR6}3?MpS6$p58P6s|91ZvPCnoeLz zkQQtyJEa&=lUXYi7bSz!CA3;I!0Ph?q{6VV69M)n4%C3np(=tE3p7+F~sVy;sTiCtralKawDYs#uSLP$OvH(%vs=VbJlQI zqU{+4xy~4&38{UBQb$@VfV)nhQ$IktAGfajoRqS}9I(GY$tEwg9Kl7?l?&aj0e2cq z02+Xh!#lv?X97t+pw>5htsbaRL7;FjA;x3z1xU3hxNS$2Hqe!cpw1{LILu5yUc;`f zI1^f4S}UX=6?TxNDj;pprCJQIQ_T=`+movy3>+M01slV`ik^r(P zg7Bfo1jCN=W7r&Ipo~rb^FE0B1_Jt9Uq5cbrr*8;qW=H^{fn<=Bw^F<0zE+TfCPT` zyY@bf!KU9aA7Z~lurGuGCDHxw)aiHtoBmL!`xQd*>p#;ka~_-i+Sw2b4-nA*WB1-% zZ2HA)A^I5<@cZAM^)fFu{Xx(JI~%%TC#6BmL-&8JdeKsB`Y%Bb^mH)9Z~vTpBWrB> zpF;H?AfW%Mw3r<>{V7oQGt9*w{_MNl+_32ng2q3C41WFUAGK~^)BhKCK&Tmh|G)Ey z=fkEy0-Ams%<=0NdVEz9n|>8&{2w5oU&3ymA~yYH(C|xO#qa-3PyA0~)1M3tzXNCS z>;G|V{d;WsOQ8B4tnvFld8HH9_%nj~-@yjI{@khaRk7K>rx}vo8Eo0K!kHvMa$`WxKw>wogZQw5v;Y-s)AV2MBc-k8Mw!KVKowEkuA#&7?Gy-i z|AQ|4_Mel8Nq|6vDyUcj%vd@=t&Z2DI#L(+dkFn;%^TF=K?{yvh1=w}GQuV2t= z-XU!E|5yys-_VO+|9ob9C2abAmO=DCAfW%>P3{_O`lrL0b*C{|7Vi>))c!8;DK+HE8%N%*U_4aHX6fHvQihK;n;K zA%6Wom0Gcu-)ErVzhE(b{W*GyPq5kl7v}z@`1La%oq@IdxCpI36PDxGuMoQnYx(H~ zjsJvI`1NZ$wx(cn{|;8rY0?Y~4r}o1_gg#>Yx?q9 z{%F>e0&Myf>>%;KU_E~Q`-*i7vFVqqgzDdfUw`@UKXKUfpMd#)Gk*O%Y4SGM^xHuX z*iImz|2$X1Uu^nQq52(m;J5$y#e3e^^iPF`|AC$O^>2{)w-cLwLumLt*o$Aklgxv! z*z`YyhTnpH`1NyXzvRKDzaHv;hW+^UtKF(`#HK$7TK^~<#;-q5)o(sF{l%S-^wU5< zztVxzAF%0v2F?Eu2?mVpFCszQ`uMm%4 zzqDac2R8c~A=l+GC?w$5A5)i$b^P`qwEvYrK>uf!SSc%_Fc%trvExL{uJ`?>(?)IU5!ouTv+)*K>xKOKCI=(3|Rij$8Z0| z54>3G57>P(3ySgU*X!D_1)KXDvLW&RfPnt%+Dovee?EJt{u2E53uYa}+JD{-4L^la z{QA?oRk6086z4MEFf0-LZ{{sTF!{G9_##F64d<<2*lrX+qje1 z{BKhViN6F*{Qj30c;${w|3zs09dN;~-9{VC5G9`{y_EnPAg@0jmFiBmVN^ zvG&1sZ2CPGLj1p=3V-}%XbRoOs(%es{}=rFcV$~*oxgg&6srFPe*JI6g~GAfZv`zs z61ee)zunF!SkpiAREYft2<@=saJd`5ey#sCF4*+5_dwi#fPns^Ygw_Df3eW;YuJO|{>3LIV;w)(wiaT)!(ROQ z7ripWI{v{8yTEfFe*H}Kebce|{|$8f?*IY)E)DCjt{)MCy1!vRe)~`EJ2MBH{q}RA z{y%_U|CIxOw`0>k6I%Z;9K^4GS&2w0HvNAVLF_+3K>w<9&#?ACBw+J@hw$6)xKJ9a z`vai)$Kf!3{ncrlSnIC`(C}wCf?t2n&6UR3{J$64e>gxu|KsTgu+G0#LGxe3QT+CI zPb$Hh{xqQF7lS_j^7mfK3v+Dl_gx8zKL-Q+`Y&7XeZi)`6I%W-nBdpnxa-&+Z2BXh z>6gJ0zkXq9c}{HlbD-e;3sK3jFx(cR$mO zb^Im-+JA6ZgkS%*na&B=?DvG0zYhr1UwpUPu(sdNK-=F9-|*Ytzx!VgHv5-A+iwn1 z_~S1*?Kal_lLPcZ>x4l3`q$m$*oe*kd(i%KLIQsGcQx5#9ltJt=AQ#8`1M!qw!j*H zpJDc=;@5wINv0N?`@5m>m+&3G{)CK2p4jx?gT>z!{Q7fz@}scn-wlhutN8VQFt~*^ z|FuKIFM&Y&lkb=t*7>j4S0Mz~m1l)glwIbH}%ga#x3ibHg-+|LYk6`ovZ>akjc<|>RCw3XE_1_Wb_|bv& z`1LnTIlKg${Y+&H3rSlej~_$zHwfXk|Ga<>*745{So==~fBf&V z-G;UO#R_eIHeAPVe-GCzeQe=p4_p7U48Q&r_9j@z|8KzZ4*~tNHKwFvv)=-genD9v z8^8Sv+k`G-)Bgr)zrzju`tv^M?Zc*D51RiL5U~IJ(|1nT^fNSq9M8bukb~d;U**nE zvFUe*rvC>y_~U=tcD>oy^ov04XW+xH|3KhWtn$jm+5e$3Xqh@C$$V33|`LTK;Q5{r`Y~{y%G(u+E?MLhIj#<@oJ?pB;p?{(1(j zzZ!D!>o>TlVTR5BKSBC;Ffbgj$FINqF#BU{`hS=*FgWaBU{E-VKmH;PGh-e9S_<|5 z0|MnAQ#?D?@!uuT@=KusfBpUDrV7^jGX|Rf6A0+%U)YRw{A~}k|FM98{)-JUoSgwe5{@=Blf#Cqi|B3kh zzbwQ9>-f)6X#6)6;kTdb$PcXjmnpFP=YU_o&(j#J-wDtX!>73ApKlAfA=Le z_n(7~za1cueor1zz&d|-091Z3Ffbe-;Qm8CmtC>hFJ#8R(6EbvL17pE@Y8r|gth*@ z15N)5#rVT7{FWxx@uREI`pdxyzy2)tj1}12uK?@6tirF~d#_6@HvQI6{RarRU(3-4 z>-_fzsQ(?3@rR$glp8lT`@^92D>UIRf1aqsVy%Bz+9CBHLn(g$Gl(h}V6(ptlzw+J zFf1UT|M}`-to}a%&3_B_;`e`4OGFSh`wu|de+dNqFH&cZwg0~azu_)^{hJtlvCco=f`;D%0{#E;pb)J6hvU%li(w6Z z`;C_tV(mZNt!7|w*v-IjfPntYUD*3CH=y<_RN%M&#_yZr*utNE9whx9AfTVe=mysP z4?0Z{{SNE!+uxj(jdlIc8)*1D+{3TmLL<-@oBJK0_Al_mpZ+z@t-(6}^A=kEB~;?K zfAe!)tn24Op!O%|;MXtmXBpP^@5@34h6Yglr{H)0+6Nt2+kbkn@<#x_{y!(@VJ*L3 z!}8yH{O-STqz`NQWrXb?y^mi%|FKA{^FJS;`F8<<@+X+{5Z3-n1~mK|HsH6v>g5cq z<8Qy9`R4%v`>XT+_hL(b+(nS|&mf3D{Flt$ZHi6*KUn$~#_#?~sc*6FUn+)<{~aI@ z{-3Tb!@7Q6tOnx#h8q0#%OB^$I)0-G)vwTuzy3TRZm5IJ|E#e6FaPk{uXvUN>-=W~ zEd6`n5C0bLCD`}>LHnNywfODd#URv&&Hc`>^k0u(zuEnCtn0__!}?DI!f(3L5=LzH zuYk^l zItF8lzg%egb=ZPm|D=mER$|lN1k>MuU;o=Eajf&FZZZ)6KOhi)yW{P!uHUeRu0L^b z!*BoGP2QWaxqljT{l)=z{QA>Mys(Zx?S|@i@W8MCLO?mz^^3K_7noX{+_Hu3yqMhv+|W9KU|Pb0@H_A8dv0e`lDC zU;l~HPgvXU9kB58#;?EVt_Rln56cG-_dBrR&%YC9Lz89)--{2xz#7-~EMCzFfl= zeo33b+8GW6;J05Qu>foPd&g&p`x(UX+dn~q+ZLPss+*wp2jaJXztwH5`%f-F(~rVz z{Q6g3ZLP*;e-gC)b$|)K`2Oy(Ek1d zCm0ye&qqYpFL#&gIyU_&(DMZxOi}YEx_+lK8{T8nZvc%y^z#kT^=rEq?8c@)3%WlR z{d_@m{mFN3oWQ0Zd_KWR1_lPS^ZC&AtN26-V$%;gpTOZH0|WZ`eCYZERdSzV)9(QD zKic_x==yu}A`W8H4?5qV0c1bg`F7~~m*1W95u1J!=>A&t^X<^}KYs0?gH683QTrnZ2Bia?SHTxzy9bf1qW>U zO`zvnpq~$d?tanE7oV}|zYHzE6VT2FLD!$YZ5!6|Clk8A4*h%zbp3O`)?zI`%Aoqu z&qqMlzwv3~b8PMxfwu3^&nH0FFH|g1h)w?r==>!5{(f}*oKa$&*!1(l#@EpH=cDV7 zYWT7roBm2@`HOx&0J?sq`7Vjr^n=bfIdGDJ0sVXcbp1PKPG5sf|4V56qn{6eu7C9l zsejn?gU?4f#lVn&w!a-+|A+mTtFY;BhQ>eo{&aNx2FB)du<4%w)sMbE9bNyCJ!)~- z^#6gDKj{0D(e?MG{glS0A9TKp!zl&^^!>%?`o*+-i?Qhko$u0cih%)re=xfKX?1VT{=H zD?sbi9G&cQx(EN|SzX)Bwl;w}#*z|kA>i;YF+i#J5ckQt0UkR;$8kXSKuc2Ib z2b=!I(C|awUxM!bQ0?a#*z{LI!w-Fb1-gE=%^ZiZ>5qZ>p8;)sI=X(AO|svy>HiNc z|IpXRqwDuvu8lSQibBs9L0{jFuAhCv8Lah(HdH_Q`gC;t^IuK=fX)53(DRkh*O#N~ z=luDw4x9c7(C|lJUyiOn?!eq7*z_-kreE~+-RSzy*c`~jroR9he+$soSEK7+KV`iO zHvOSc{~!2`KmCT@?4O8DzaupK5B$d8{)&iQrio4e4ygap*XN?UU+#EvB{uzsVEGSi zeJ;BGTYMT=^Y3zK{5hbl&qUWBvUBE1Z1x|4wtpOM;}1Xo`Xn!G`g397kG8%M-Ts9l zuT8M&H-hdDZa`b#hOXa4)emd^vk&Tj^z~ur`cKwQ*@4aev(WfMUtfi;pMPpK*7mm$ zbbmbh`W|%stM1%M!)AXgEd18v5C4fjF7ad29}Z2w=<74k?PvO5z7d;#U8wsP{KcRC z|D7q=hfV(@X!xP8Z$P*IX0pi-Z2G@L^`ozEK-XWt;UCuW3w%D^X$A)L`E_*thTGP0 zVY9y$T7RL>kE83)i&m4urXO^^ox^F&`Ehjpzjhcb$EH6Q7Jr-Z$A7tphZ;8hSE1?O z0d0O7-TuofK4bMi=zP6~(+mvg^V8`1r%$=I5}W;k(D_aD`8jm`jgh~xhTjM1`OxU| zOX&JLV?Op^v%d$&{1Cc+3Egwz*z|it-H$#$gsy+rnWe4R^vgi|{|x`|=O1bP&NtZf zgU%;BaGHUEp#^{Zd*-O!#-?8zYX1SW`5|=o*MEFrg-w48wEjh(A41pv%^|KHn|=*g z{{d}&1zrF1zQ+pK^rt|_Z_ww5(Dh%LC@YUmKlpscGnn&3==$xqW@5F!25SEU0`9+G zr)Po9e$e@j4reguhtTccZG0dWn|{#wjtyrR7|`d3(DmEP@nm7s&jUSQ0DXQ4UH_fr zy_>P=SA^1giU`lwERM!-$B>!X7e0t{~2^X+ywvh^#7%qY)(YS&;lT#O@8z@5iZ(PhfnVjT zK*Efc1>}Y`_@#v4ODoYY@`K*GsGtG5dkxBAV6fDRHba_wBPoB&eJIHo6u=NDyz(u5V(_$g38pZQBdL>J_q zU^LCxX7a%EaM4DHYv^->3lj5uGK;}ir&>dN3<)5@_bwu-NY`Xwu)*r?B<%M>S}QJ9Xkg{6Z-vnpz~=R&N46@fUa{u*AFXyc6i*s z%f!K9gsy)Tbo>!E{tQ`dgRmc_e`4rq(D*Zk{tjsU0~V>?|z(576|3&euIag#IY;%A452|4Kar zLxUL;LkIMpAeg&h;RbX6-|#gI*z|+WcRg^Pfk6d&&Lb}Uvm9+6vvY8?p~v6RZUzR2 zhl~XE|GN-X&CbEmcLB}+W~~ei2Z+!=nlX=B#Ju;AltJ zuT{#x;P3>~erR;UqMzZi-JuQaEG)eT(A*C?-}b--xH1NGf5T*c*Dun;7JuOLZ7;%9 zF<|J2r9+-0w>z=5KW;Ut^jkpB7lY}Cl|wLnFj{$w3~2rtqy1$FJzoZvU}T{b1!cH2uK(0Wf_qn!)BK*7yUR z58QAGW;+8zgBN5T1Evo~KT?VWjUQlyzYp|$7)a`6V1TW|f$4+Maere#{bvmQ326FZ z>p)=oVDtp>84TF`e-=9a1+(A564H-`>4VWRQ!Q+<=`TUIAG!_$rVmChuYS87oBkGP z{K4#p%|pZV!RWGEr$Fn6F#QjWKbZam=sEQ;eK7jx+y8CY?0*1VKLOLf0D4Y8OdpK) zpLh5nHvOH@`~%akP>ntOj!g2zYX1x9`Gzq4uzlJvdtoKxufpK(*yKk?@rj`J-@*8}<@)fWWFaayS(aV1($F;lJSy);V(DZ}OS9ZXnAKm@` zXWLK1R{w&|S8l+f9~K^9M=>xks2^ZE!_LUqjNbkPov(ZVi+*(X$8G$!4V(Kx=i@ot zXJD9t*8V})UnV589Gia7`F01e=tp~e$e?o2Z+!=zkR7Lw)Pw7 ze4GO>3H$$Q$b%4U`sG3AdpyGofAsj1o^w(HTl|5}Cpqv2(|+{y|G7GMAGY)dKA++} zrhfGJV`X@8ADjDE_A)RWc#i3Qbo~yzC6BO$Kj?e|hmVBqukwxN$EF{2K7hj~O#SHo z&yFs;j?Mp|{k;diVd_T@|J<8QC$NP-Xn(H5cTD~0_PaiaGs9*-Xn$(M4@~{&;nyGJ zx))pcgZ5`0_{qR<0lLl{R{o>wk29>^fi3(%`y(5EF)&=nf|S%S{V*D4&X$<}p#Bp^ z|Hn;+fx+PqL@$U$*9Q^%BO0*ihxr@ib`aLE)84y z0qu`qU_q#c`5)c>N!PtV@!x~q{{!uhaKNJ6^e_H#?exWOBA%AE&-X~fYlB8*$P^qVOeX1 z{G1dd(+aE=;?v_1rl*69a6%YS1b1dGWHUiIxI{Tc zxf!X61=b41NFt!1uvSP+PA&ljxv>$*98eTt#jSI*o-lE6Of*1i-?c*5=fTz&D?~%u zw^$9qBj^>W3F<#gM4vwpoet3iTfe1{M4tJ_EVg=LbN^K6{k^b$A^JUL5Zeipi}Tw- z^M@GW69c_p7}jr0K)WZ5u*nb=Y}*dpU}9pzFuxIc|1xZTX#uh3oAN*mhSHq9??Cg% zffrVIgT)()A#^tMd=%LJo&;$BXF(gHOaW^^BOK&W1^OCNLGx1+4?xX-A{qczFb$f1 z(8K2iY@igZ3X|x7nh&Ere;%99#K9r>0cw7NB*c83eu!S!{)GhSJ%=9&n4bdC1}D$t zORz98GEQ_@2niRM`?H|&3)_DN>z|_QhZ_WCfXBrd7#Lu51ev3(fp%ANiU=<_Dme zAB)5MbaVqT`6wCu%pwkEaQV3yHT-`pW?*R8i#R`60h&G$BMq1aLq$-`|B__8fr*7> zq5+!uKFb&w4(w%MfSr$-kOoQrM3@g9v4hz5UUX?M$b5lisP3N*DnIuj)+Zp{Bk2Iq ziJk023;%}2E&8DFpMVzrr8vSr7rU`=QRuM%a6a!!%Y~ru4?uJOU+DTg*#3wIv5@fL zg6qW2K$mYWTUi0hzXoXecabpzgTp?=`UzP1hOQso78^7HzskeLpzu*Z3m<1_`HWuv z5Hf!OTKF%ydovhh{sT1gdvSz6bXXD1l?d)WH1qdo7WIJ47l76;u<~;$4)dYIjtB$M zSkP%jxTwna1)iYvnJ^1AeagBrFf@SDXE`KZ6QK9pa>I3EXE>n=zxZlZ0&@QWwD5_- z5&neCzlIh*3{3Mkg3LES3!l9>!Uwvn56zVb?k_a+SCxND0-2wHX8u(i=0lfFAq+%k z!OCwa&FyVF7gYYk>MsRxNc~#~3!iStxc!1~NIXD?wb4yQ@S*0y>Y)W%hM@JCg6QUV zK+Qh@-Cqd1N134cYzV7BtiM4b>7exUVG(NjIS4%;3%34z0knK3Xg;iC2c=7k)j{(U zf*+vevjVhzG9TJLfvs;|04<*hnU5~dcGcG#T>hZBzXC`53SB=a3{WsE{Go!!U0+-Q zm!D|m+XLvh1bX|Ekog=?^I^36`+Cs+Nx=rF`2o=M^P>XdfCJ``bfW-me?pJ#gh*l` z(d9WUA72KAPXJo@wBZOJbp7a79DoY!fYMCH?QWp-UjQwC;=~~7e~K*w!-0K>^{24@ z5w!OJ)s0Dcpb5!||Gf;#zY1vicRn=zqnH1L%tx%?fLL_xQcnsf{VzbPANRrT$A+#S zMAYwS1q{R(I2iy<_a0E%`<1U4D0~{A;o|^J|2m-d?S9PgfiByFn}^OYfTkZ9eM_!) zHOTw}(DYLPO+VY9;RD9xQVCzQ{p!ak`mnA|RiG?&l z6N`yB(F2O#2DJEH5ADCh_UFO&x$>gvN9RIHbA;&3rU_F)?r%U#pJ$=rkDfjWnGauf z0JXy7#lupN`x&6+C#?PO1ZqBPedhyc|DBNe6WE{zL#bm=nU{jh4?r{jEwp|_Hy?WK z3sg5Im4ntljw)kZ4+@_EX#WW2e%2Wfz3AaH2_lS>41lH|7=1ft1Gs)%08O7epykin z4hDvX{R|AS{bLJ~A?cG3r^yhB2M~$@M&GEt4qD$O2peDOfSUgs8vd~T5ek{anU8M& zwC%IiLFMxTwDNfmG<~A?f6?_roeQTz;4BDZU5keeDEt-B!e3|tL>@i-37H=S(FP~u zChqJ6ncskBz9tUyq08~$`q3HCW5wXYVp@|nfzoFKTKaT=nvb4737OBpfLeYB#pl$4 z%uhfI|2xq34{ZPRgE&b1GT`mqF)+aDe;92Xmk!!rAZP$J-vyd}4ukrS3=9mgbw#lD zA!3{x9t5ZiX!#El?6Hb10J$I5K7{439nkR&*!cwtF%b6?GT#B3zhLI4ip2(l%y)o} zFTuf5Td|7rp#uh#s zpytEQ&w{m22$_#AzrEJf9aR1_ppDO8GiG2ouphJkj;y1ZevTmi}dN z)L+nJ0b$O=pcT-}ulK3|_fI#VnQw~2eCV;680NwRe*A!3EDocYmMxvk#K94`0b2e{ zfR4|92bFIJ7#LvZ13iGA6C%GKwS0t`3!_t@?OGVWr}*ezQ1}a=1Pg(^h3ye=&`_XTWSmn z>Okq|0$TiThMJF_{)ON=u`?j06hf{oHXB?&2B5V+Ki~)-VT4w!EOhhra%|^;!Ux^_ zeK^V=Lgu6IANs{P<1MIv0c&5u^4A$#1_p-%3=FV#xdL>260Lf|@B>=%WLUd(QwXU4 zjy}Kq2D&Z@wk}p70pfE)=EKSl7#%P%8Z^HkxB*&zK7-CraYF~HVC!ZT5{WY(R=>c^ z-yz4e9yxqq=BGmQ7yA4rvF?Y3(~%uXp#5`#=)3My9sL_LeGbU&Ce1tAAS7e(Hiw`Q2u3rmjAH)^&VN=P(eu~EW(I}>2N)R8=YI*A52}_BvBAL5W!VK9U!5p`RzAOg zhCh1x5kc0Bg^eyRP`9ELlztANnJ*4apXliaT|c@N&|y2caJSP$aQ{dEE&Na6DE|qW z51m$on}0Bf?IbAuD4?1D5Qq7Y)&X2Q215)@`X^*QY}^x~n}OkJdo$?# zjfoqe;}5X>^8PJHKiHbpAygrV$4XJ+=le`|I?fU!d@rfEGS#Q1_#^9|)QM z18y>eAz<=*A}D?n(8A{%G=HI|e{}s2QxN1&1QX1f;M6 zeuydr32Q&VL>6D@ss)+vfM&iSj`WGHA7&1WJ^*#s1SoByQg;DV{~mzGFM|wZ{Bs8@ zBZI?128ILB^Q#v?$3K6=48lRbU`Lh6uxhmg)h`#&%AXH7<`@2=YRBZk3TCK`fl}fv zkomCr7g+k7Hk*N=0pxz@zM2QAkoF0B{~2lwfXEDHk3<`$y>dp~k=|=(HJ}zxLpsdQkX$KnoumSoolo4}{Ez^^0J% zar55*Q27iSzk>CTvZ3JvJHJ{1I{%J;bOUpB(3;EHp#ITBnE9~sa|twj9zf%F0W^FF znGfsV!DyYxC7|(1!3WUv{{h;6lmqP_K7=@b5!QbsWIm*JVqma<#z1zPWgsYgK0wW9 zgXXUjpz{9^0|V@QwFS`fpOE=5cf;z@fQY9rLFO~ehRol+fV$t#gn{7zmi$Y|d|13f zozKwz!wj^(4kP@%q4hg@`A^7vbooV%zuiFTAASA)259`Em;dPcVeW*{=yrAhHz5htaeDwaEl}7;3*|Sb*{`dizQm zYCd}VnUMMD{Uf2avrZuM(fdac(D+3k|CfU~3GSeifkg7cBoqK*JwB ze$n-#TeAyIpg`DJ3Kaem(8}i~X!(O4{?O&eXr>^zC1~#7&E9$m6g~-P?w<)YA3gjD znU6mIl`vTaJpYS6|8){Je}q;(!zZ{9PDW+H+z+L<99IXO?=1*xU-dxCA46#RL7)GE zl`p7!<_X>}z~v8G z{oV#`KckmFgv>{ufB6^wPac&1(dS=|L&G0E{Sz`Dz5mYC!2>!UbD{vWeu0JmR96ND zhr^itYv{5SsP8c;bn}I0dmaac5Bm7P5**<}$oykyR$gU2UI7Z94QS=VJsjaf$ow9( z_)To|HUy>52DI|wE7W}S@_~@~acKRo@;O2NAonw%rJt!d+Rv$I?n4U>h9zk7H*Xo9 z2D$$On)`X63qjD`4?Pwe-B>su*1v!WoSMp)1TtR%ZT*ij4)dYc`oOef&@Wg~h4lTx zPl3$8fY$%o3{5}i^RrcG{zo;9fk6XJUiGk@IVgR8Knwppu=WYGd{%&tpR1x9h{nH% z#;=X|RRfA&12prkpy7j_e+ik7-hPmI-{u5zKYIJ&1l0ZL?Ps**LujsLU@(A+z-ZaK z=Wl}Ap9;|OffZK2R5CC$9L8)v6EYut{`!opCFp$TiRkm!qR{p8u=8~vK-aGlYd*}L z`!+LXg4}Nab-xAF{SRj|FdR6{z;FP1er!Spq#h$=J}g``pyA|vGZPg4f(}sgKSSH+ z^`QFY2xkA9kooBC&$B#?=AiVC-u~uG?F_mLs(%^K%AYIH^oia+MAr`uW;liJe*FXdkFllyG-&%1z5XR+KKlId z<(fHBp!{2aR=>Ez+E-}vM}*8rFaI>c)N?`c8-Nx*u~75T%V$F7!w+JDhM2JQ0tHa` zA3!tz5VZV64}Wz1P-EZ}EZxHd9;FOe(W)qr5DG@_1HPW32M!+twDmv5oeT^OM=;m-f(#;LKC=8PixWpc z@r%Ac>ltYN@d)PnB|_#iAsY_5Uy!rlF(`f~pv7-JH2l%)M`*DDvIZ+g-@kKMb{2U3 zl>u7(K7bkoyT1cA{)Vm}-4gWmLC@B#3X4lVxB!^Z?UaWXJ4{Ilw31clEBwD4aG zbw7Ik(nmKCjqiYF{=2*tCqd>jpv~_e!C^kE{zfwv&V}`#V6>ybFHrp`2#t(lt zL$sjxuhE9DA&QVl*!n{lT{eXQbiTMCY<(s_w0*J`+Wtr1zeB9~Fe^J8f;d3s56pa6 z|E^~dLkA--wZ1Mk7Ble2$_#A-{K@811f*e z&+mAn&A{Mr6tnz6*AMX}f`r8@OeDuf40Jx-L|FX7!lwzEf6?0ygv>`S`$2Z7PpT*e zfdIQwIaDettH$e9X?S$^XgWXS;09_vr)rM&(C|56!objgrTigeKDzwH zY46%W=|2H2{R=?dkDmU~^~1seMx&3fZ{Ap(2r3^0(Av+Zq3IL7d>~{#`u^@iJYR}H z@r%B{`yteP^zwm_`RMz<%UU?kfWilTfBGj_{)OIOtN=Zqgpm0=pb9oX>G!i+)`HT1 z0W^LuK=aoxQ2+fX1A_zf{*DD%kp4S#Sq&_>F=&|iFo_lQv7q}gCN@CLhow(bMMegO zV+;(i`#BV#>rV)o{{pRi`<}xJ&R-5_#A)j;k?Z~vSHwNJ2&|D)?iG8)2!x*Nh_V7PbH z8npjtB6|J!0M>qn&M&~u7b0jrTKoKGO5Pn%{w+XDKjzT*MNdD3%>VEo=5h$V`R`v{ zQ1~oBi(g^rMoHNHVhPasYjph(QxK#CbOEjals;0C5CMwc3DErY0h)jPCNnTN9AjXB z-5>P;x2MA@e7p^)EwBkAc@`E*W$JQ2M`smj0jPNdM^i zVc`s;(cRCKrUklR8pHknaHM}i=A-X#>a9Ff19Ct5{-!UW^)sOOg_h5-`CoMXFn7af z^!}Gx7BlF4?1||8uW!(Wbm;qE(2^g_SU3%vw}^m>G+I3a-QOm-0h&Hlp!Fjo=>Cl3 znEh))=A*m+<)Jvx{nQxlKLJfY=>1=TCiZ8iD8U(C1GlL(4aG_rtFhfH@G2PCzR^trPXY z^Ro_U<8P~==A*kG-T!FDGoX*}nO@!`4XPi}$M+86FduS@0=lUPKJ0uZSpW1sZ`fH- z{eA$NKGmSUm_<9BSe5VI!<-a8~e$m69kooBQ_Z9u0 zfX5Hf_wV~d%|{P^Lgp)=#jlR&R`B|_4QTb_HE8}qZ$G2!hlK--hV_48e2ZvN@ch~W zH1nlFm>KY@l1di@v#(u4>tmkQA(a4Wn%qse$TWjPY9m=tdm${tKG(Kt`fq*!ch!&}g`wCl8uG5_|x4 z{|spUx=_c!aNsxt1ML3I2hj5|2$_$*zDTD!f*lk-AE4&L!sk7xd^mv_K7`Cim$&845<7> zU!O1$YCd}TK*)SOwD#LM&RaV{?!SQ6eq)2)Pm1pTSeV0b(CG6cfe$Oe>+{j)M`UrB zkM4hTYtZW-{f<{2p!9=Y|8hYW%A>b`IMEG6<3qQlF+jIZGF++2;Q`ez409mspQE7Z zKL%94oWN}V5HcTK-qS#a5u85J>R$&O=@VT)n)4aV&;(BGUAGt%zX#CbcR4iupvNyE z^I`J~uym%d^~V!-4i0hH_%JO0YS}X|B(O2T_kR^Y%M3Ag*U%Xn>vr2W#)5n+xN^%!Se7PWKmJ3m+4x`Hawow6Oi}4pQhR zT)|9+&@gjhw1lD{=zJs$_di7oA6WkdR$oF)!z5wm!srPJQK0kFFwFmp!+h9y3Z}^r z5tz9!`uUN0uGqpybQVNCJba+%Yr*=f5LrwTW-g4DK3Vz?oB7Gm`?+E93kx6EIw?$( zAtEqyVf5OwT%h~sF~a8ybbJimd{V>zrRFQp{0@fsymKM$K{ub&@b5ZvMH^fAsNpc5 z)bMXr+W_kSVz@sadcP9P{Rdni`4%>x1o0gv2@7`^U0sy00h{}apa;3a(+_N)P%&g4 z0MlfM2+UjqXkuuw_r2B1scDw z^aHD3U^J%55D}QUFnaBzg*&jB{~pwTxs2GY0Xs*8)bc-cVm#LHse_h3u<(I}3#s*^ z)_2ARZ0;|G9%KnKA9hayspfY%P07G!{zqv2j&44w=|A|~(q-7pFIWSKFIfD-&ar^e z5LrwT*6)JRzRf})_ruQ*gsq>s1>Ii*yO%Ekx<3(?E-+1oh``K+(VgNdrJ(jFtbGDA z|1ETW|G)%Deg1$<^Vu0q!2L&b^Hrh!M~1nO@*n|veiW(h-#%d#H#YZQhPt1@8&Y0A zfS#XEs`&-?7(n$SM)+TVZB)GgbwBj}5mL=BUwafZ{(xb=26TLbAq3+71!S7fqx*3a zw(wzxmTwH95c3}pX+Erf4O=JpabJ-=viV`q{>u$e{~C1uDl}dnK-X^&3LkXyUtgQ9 zkIno~(D4&kyC(s9z7rwy(dCO5n@WQEN3iq>>tAexZWMu)Hw%a~AC|8mxs8Eg+RUr0 z;Qk}@d?%Rs3^@9a=oM-v;&H(cLct?cc%LBe4Btgv>{G|JEfFj$m`Y z2Go4?^(}j#Ld7mw0IL@tK*#q8xgVB} zV6$eaxA3c5EyBG&L zKMmvlCV!~;u=YOed@xeY@9f$ygDw3tKo^?8+EcLg55$@e^M|U#bI|z!@c4z*zgE!t z5!POS-G78I-wo^4Td4|KS_PmBy7WMVZ(@OKUP)1r(R)lX6m16d;$S6(pu8L>tF~ zOt7$4$V*L4flDQ)=R*}G=47Vl<)(t&Yi0s650-^cXxR7@ES|dWG1+3fUtMY{Xm1uH zgF!yzj%JuX3jqcO1uaH~4a>P03>KrWMnjxF4>Ny%+#S&VAdLQz#~KEP1D8PUf5`X} z?EYt1eTl1|0W%jyZxL{ugspvh0N%cZn128|z649JuzC|Ea2PP%pRlB78aDG&p$!Zs z==c%?^qvY*&2RBD!8-mX4eB2;fWjWqLPrl5T>Su8xWH%=nT=TcFEgMAl`=vX3@5yV zl%KHvDY4 z2oe@9F#47ImQUEs_lHiD!NLbtkHOqeZ1^h$@5g$7IR9#ho6yaNjXw|@K9BzRpTXw- zw)NP}CpCU^r=C#3X1+Q!{9)6ruzHfg8Iq1*`2gYy1PKdw82#)<2WWo;M)|O28AJ~} zexds;Vfg@VA4D0PgqaJYCv2Y@xf@0o6^nuTzZmASW1A3*J^t58QV zFfdH`1&LRL2zD0C-7s0!laITx-G7@18sFQ*2);iYR6@ht!z&J{UkVm;Fid!fIopqJ z{=!MO?_j&%)*y$0Apwv19~N^kTsTVD{1vH3rPw(*Fz$bC11&V$3b}t7+5IN43;_!O zG#cIgJzoqfu$iCI$iUzLy`P#A^J`vy0o|XC;r z=Fe7|A&<@cQc(SPnR4?#H2?gC&HRO+gXpeMZvNy)rB|?-uP~2+!C^b;=A$Ji2I)25 zK=*6RM8AJl9y$@aA{#Pq8}N_3{A<6NPZV4Jt+Qufc(9X^!G;CYMnRk_2Ft$_UeDk{w@$;?gF%Y|GKT%1{z3cvLj(lD<| zErK=3^YV+66Z62WbC9XfkbwCcMo<1#Jcp5k!wh|W2B`fF(&F$15^wn0;h?rSNG%A% z%!SeSwtbMtX1)rvBky1X8DBs*KSPj#;lNTxh6!<8U<@)Fgkk2w=pc>ix!BD2gf7H$ zh{bOHCLHA?%v=~P^5sH1HuGmf$Hxyq-CrS!nhs&?wke$cuM8h{sv=q1`r0B4Z<*UVRW^))qZT|OF|cF9=MF%{1?!J_yfGz z89*3hHVDJah0%?CDQmHr53XN9=TkuI?HSUj;RDO3pn4XBL1u$6%v?CV&+`p7^Fj41 zNIe7ed{tcLgX&oj2CK!=zv^V>OT}h>DfA*Hg?LE#pqmd1e+NGf1`x(&{xRmYx!BA< z37x+=fW!Ps90v`8BJrzwYn@yZaxZ4@5!DLpOi>0@Fp<-2VYOKi7}} zF@FVG{CGAn17S1RX|(4L)pO3^E&p(aryOPG16>`4^z= zhX)ea&A-ONz_37`aQ-?J%kvGJ`TDT%mxP$lVT&66#G3C@RGf{?eE%YlZy6XES|H}1 zKnwp*I1b`R51&BgIReuvj7#uERo^K8t4(>397yujBfbc*Y z0^lq#W8njbE|B>QXzO2@r!p`!TxMWM;D)512hjT!VE)HtK1?1)Ge1ZZX5!#5MV~+O zfv!)2t)GC67aiCEv5!FuQm=6^Ffv5IJcXtHy(D)YG`@ymJ|A>^4Q4)U+_YgQ#C!*B znE4zG6Y!WH?xHXcoBNHS?L*l51K7Br!!C&V4LUIMB^U&d4xNXE3yjt~Bprm!e3QlC z=wX1(Ps7I57W%NZCB+-6{at*c^yt^;Y<1988D0mOU(1`dV`kfIOlVOY4p=;dX5USo6r zW9a%?*!(nX9@b$m#QX+BnE4EN@HOu(9d=Rn5?VCKWt zQ7{~Yn18^WIP({9sn=o)pDt+s3vNDie81rk#C!)U;>`cCSMfVG^L3%+53F8+t>1Du z3^BjK8e%>Rg9O6|Jo)#*zBthR5E$Xlwi29O7-01XY#kTF5s3K*Y#`>L~z_m4jAVPJ50%m5D`*!lxlw-?l&1{r`}Kf>}ANDhQs);1mi)sN`o zW4Fo}7#u!h*1xcB5iav#_Jhm@;jG-(^Vu00G0va*SH{3_;5+8|RxtgT=7(V&HY`xk zD$OfSOiR@Z$j{6xNiDKg01q32Ci4qQimVmD^Y-9bdoZ`SvN*UTu>>-#2${!^z-n+> z9@2nhT4^3={e!haVo`d50u~Duv@-KbjE$@n3X)-Vfd(b98(mUafLJ{dUs73+YOPRQ zl#F3+ep(vLFjQZGjE=?X>f)kgEFqFoT!KY3Pa!j}#99ID8u-vF*f}8cL6L_A!_p6o zelL@;2V48_mja~y$qbwSW`(4CSUnGG524dAb78bZ@ov!l+!*cKwV?BB7#J8>pcy6s zhxxGb17;7*To`@aFy|dM_fLhcKY$+7!vJ4L1T9D5eCYZvSUHOxWEQ(WWw0|cV$2`R zZ)IRO@Pv`!z%I!A!2&Tz_@L`Q0P5&5Ajbb;`5ET^S26Q`V;kS!(#pWla0)X22gC*w)k4HBHG%f)WgM|x-jf}OLg8pJN zA2dFou#=I2qZeZS0vzUp#tlH`ADN-Y6v0TuJbndy)!1YD`)r6MhdE6z+$OfJdH2bHb)IVp&e z9w9+O`MPD|z@LEugb9^HAfrGS zW-p9BBzdj{oBa(r3=9q185kVwvD-ff?V!MAgbsEAS&pUu?-F&U0Gs`w@)xWHS}x-9 zKd2lAVRHR{#J182oBaWx^$no;i(}aRUjUt71G^EVP82mgz{JsMSh&Mz*$Oc>Z1#JV zL3F~-??U(gLRiHOQO2+X%{@?I3<_p1jBc;DG{a^;czp+GxakjM{uteU^zmz4^Reg- zfY}S99kS(qVza*%RKI}cAJrlK2z2{*vO!E15Mp5f;cnO2M(( zp$xnKEuix=7krr+z!=I$u?!0bW-pBX{A|)JZ1#iOA0YqZh<{SsAuy-F?1j;>?{3Oq zv;Q4*e{aKD?EZ(Pf0((j^sm6r!T`cBadaAHFO0r5L$3^*{WZ|}9|olPH{|-K4{iQU zM+w~~?0lHLFuLoU1J?N`ap?SL&4u`o0W-p9>Bk|G&oBzS< z!$9ZTlaT&lcHpC7_QL25hfm63vws3K{2$=(|7o=H-xzvcnL{uO0|?`C1I%6+z3ri2 zAU6BK>(@Z_+F#n1|JJuOE@HFa20H(nP=`JKO)Mbso$!>A0fZ0aLih|%85zJBM*zV5 z4WnIzLL#u)&k7np2F-s4LF@+^hn)V==l2Z7q4t9m;=wR`VRYrnnSZd^e*-!F@P|xAb|NBMw_Ysvc_h=QaQu~ zg(isqaoG=1#lQfwAI8T;!|a98>-DaD!DfFibo~UwR@&NMH`N4d`cD9@p9YQJHbd+O z^%If9|2zu=gMucazO{h12N3>FMRfA8t!vCnttbHvkb!!8xeB?71<~LUzF73Zzue5c zGO#qNL@Zb}W=9X!kA=~v;{^EFIXFZXK>PQw`)9jE85kPQBV2m`dM*siM=%@2K(hY;k@nZ9K-RZo+6)na`5Q*(ZM)Ep&He+R^mPfz|60WP zAGYofVjCt2vlm9IYOH*K&Hj6)3=9od85kl0AmM)ihyAc~G-2V-&I(yqifJ=M1ZFRc zR^04%9-IBIO&J&tAldJrjots~_QTe-LTtk%VfMo4PdZzyu-PvPnxDCbmsvW*Q z8|MGzmp4~p^M6Pa14F}C#Q5X^9qi!`>UV+6hQ&Xj^at}djNW%ubRIjF^$RON^Pj&E z^S3a69)QkIGFU?TodOI3p!t7B(E2KnJ7E3-v9V#aqQX+xs>K28S1r z@m*y9Tf)w@0BL4mVCd0%5XhMg~u-}o)0eX?#9-B1LZG}rUYF`x(4k}K#pf}^BK%u7#%)Mb_F*3 zk3#nsJSc_qpFsHt*?!RYHFEn6mah&R=VSn3SpG6N!N~x^Aisbx%w8Dn+h?zj&3-fJ z`Ur(G((J!*jFSO`VfF_c=VSn3kli2*vlm7)?pa%p&Hj_n^DPocw12{3P6iN$*)MQ} zlL3T5c7rg?UKoAmpT`1h_6I`OXD%So{tbsX89*3jzrkTn1`r0>4Z<*cVe~`A`@Pug ze^C!o4Z0tJwD31L#>oJ}F#9(g<75C~h-sMn%QL6He1OgVKT!J>%1N_7;3y{p2*d2Z zaFmk)gmKw#<9!?J{thir{R-;8kZ6Cw5l#jWhS~q&2qyyw(*6mMmtgG@7gz%Wq=;f;?nf z7#Iwo>%UP&G2_2dkS7jX_{%`|4;-k)?teRZh{+Ee7#KkKtviGdBM(63VSE^k?*F|B zPl~bG4{Be7^gMvZKfZQ0sI5(I`MY#M{a$SL2b+Ox2d(de_#d>t0hGmI<&hJ!2&3=PW|848whF$65)Vz6LkU~rhh$RMzsi{Zc`#5p+__8;W&!e;*+(EaW# zgzaCjgp1+A0)+h^mT)mVSb(s>M1D=;M2!{lN+w7#R%q zL&kR&K=;|gMlN79s9g>UTv&GVhmHq5fQ|=&=qe1(ALFU8kcZS&yUH1l(L&h-sVf3$Bp;&DFYli{`h6bem^#Z8< zpfmt74@QIf1t31m{&i-MdI{DafVG1_YCss~Zy4R+chd^n`o0II5FfI^)+a*O>B80v z!p3*dY1le#m^$?F9+~BE3zwhcS z1_p-@Nd70%{!{r7|1-?P9{#X$7e=o+y7VWu@>igofx+Q71A`89d{e<0;(u7V3!`Yd{G8<;UH8lUh z){%qcAh-rG=9iaWf;f`|#IaV$O)Soa9r6d7(koBQD@lbP`v(%qOwY?NLKP}XO)f*$ zR9uo+0vV=CTSG`dOLgN-f&!-I*83<-h|8aD3((+719gKvOT1Ur`T{l%dDdF)IKpmRS!dSK~w zg#e^}hw0}*8((ICwo761u=;;O6gz`M5Ielz1(R=6@&Ar(d^;eAfnfnV6Zm{AWc#mz z`aMYV#_>q=4F&-m3`=Vv{Z5ei0)ZS1jl~E)SPVoUt=BhndJ8&VPqG2p{(1_%pWAvZ z14F|f#QeepH%R!yy8SSk9h%(id1H=BK(ESY;p!*L5 z+{v?_K?1-1+jc!Q$7X-ZT1Y^_=2s@*us;>*Pjvq)L&b6VA7VNKL$tZ`OePMFnFr=W z%1zk((zKNf3 z?Qi>wuzv!H_9sH?;Rn!mILtnD+O2pxX#Xch{NGu}z~F#nzknxc{tt$Qe>eX4uZqhI z2l*d8{m+1&-v`^@F@Z$;|3KFz9Dwd$NB1|3-)DU^3Y+~V>mVrvX1{-N(EeDA@Hc?&pNH8$flT`y%pvYZw-?4&bY_Xi=KnZ!|9eBsft5Qj8dv(4 zhx(tv6w(fX*@sSVXPW7T&HhW!^Eu)EC(-`>Q2TMkKO}Y;7`(QnrGfIl!U9Nsh2{T_ zbqov*{}Amj0Uy%*|7a4#JlMW6bbrJ6*($G%u=)QGbp0IM|0LSq7YwoA0eU|G%szBF zX8y8HZ1!6~%YT^t0=}gA-v*lh8X_V3(Cvls#aFY%V6#6OJ^hntKWrSrfeU~7yR_LL z5u5#+(9^#k#2>J952JCVf0HIi_&2EFw_lAr^B6Y!e?rqgtp1%qqWvGC^^b!Ls{OF~ z2S$5dUktkcS+W3{{$E1d9}htF-+x5?BjAtS|H9CG221C#d<852Vdo#f;v3fPhp7v> zSAT_xg=J;~)P7k0>s`yh;K0BLAAgvD!+wS&NI1jlS(v#mp#312yI}UNfOa5Y^dvI| z(D|;C4AA@OZa~k^PlBG00#E+|*!|B7t!Eve{Zp9zaj@`Tj~f24aDb`1*zXNG-*+ag z{)72{1{=hoF#9KvX#ZTO{jm8Xn7y!bf+i0j0kU(C}x0`5$yXH6tSY1p=}A zpQ!>G{(m6yFn@_b%OBV{3}`qDBnL}(F!$W@J_|a(TG9d9|An=G4sHUeMwGu3aM(W~ z8Dc*y{2`&nz_9KFMEpQ8#9grEoiP8y?C;36G6wno0@VL7`&BnFFf<_hAG(eimhWM- zP6Wgrht&{!Ag*R$fcc-{5G4L#;SEcNFm*=lv+Y3XAAS6X4ZZxsVSgWVybnG7pM&K~ z=)GVtdtvT?^_RE*nUw_cKkR&(U(oyyUcY^n5z+n)hWHQWZy0?d0pfqyI%in;8$<19 zcm&Z03vZY^VD$10Q?c&fTL4;L3EICD1JMr}=SJ>_DL@UJ5YNQ`!WmFLELWsY9n>?t;;?L%Xr=Zvf3tfb=?8V|O2H90W8!0m88H5YYSt2*buj zK=TtIoDH>b!$K|w5C)lz4MUZ|`>`GZ6R@722AaPB=|4cgeW3XZ5Qe!AG=BlYF!zDx zFF+XPK8FQd3?K|L8yiMD`_YEbu2n9Icg!Vukb-fcM#!Z0AbL&ScEKY7P|Xtqu!mw=05QF4QT%hblixV z<2azP99%9$cb}epgCsWhfyQ@0W*mUJ541lSIsEXA^MLdrkMn@|=;J&fF>Dy!eP2r+ zdth_lPw4qt4la=XGiaUx*?q9{CktE|7(jTbDkS|IcrY-4@FwW~511P^s6to*?hFhd z4B=st=!l0{0miKzM}#WWE+=BW%40jL!+RIN&ZL z0|>*!(P^kMc=;DDyIK{S`zAuyuRM^)9)7&+knn<;?;!%=FQ{Q=0O1dc5WYbzGXn@q zNJIEA^|)ws_pvTz!MeUp0=hp9)^0!#KiK*Lh8|`H5Eg*0Ct1+S%mBg;)({sQn8?fk z!YcmLDm8`s^j&0p}TFfbfYXJ$x%wu2I&?HE}52u6d-MGzYrTnyIGc0268 zXOJAonXvPyL2P_jfEBvd080CRTwcS@!4U~--x-{PwAVoGD+gvK`1%3{=sF8nyADQ! z+Fc;~VC`mUsDBt5A^8d<2f}|sA?Cu)0sO!TO|T$IB#agf4C_xEGhk<8nu)%?A9Q|s z1M>O@BHecr>JIdKh_}J!1)=Bjpt}R+L|FQR@vm@XiL$e>%oKp$zYgo4C4kP)ImZAG zKZiI-I)sHAj7AT?T?LSELU&&(EZ))D>o9k~Xmt1Wm6tSu+=t$OuxMalIDq872SmD0 z0y^J^-k-Pvo!5t*Q-F|w-;PoYF;RiZj`~c{F5a{@N1N0nlSh&Gx zP`wN?8{!}eQ%dNb}lH$P7oG=_M>6eg0^?TwqO!Fph7Tuh34D8Aom@Bx-ShnzOiK?1H%Ik zg!>qhAoju19gIegUqbF{n1kPa7ElktXgA05gCO@^fVyu1)P3g{GB7OgM!0VQwcNKI zzx!bO^ZcT3<`k=_dTGJ`y4LdcOUFtP8coPFwF!MehhOV>DmnHKGg*b3=e`4?rTV) zPWUn0#qU1!a@*|1=BwE1j}p-S%6o|NMIn_q_rc~J6Y3!DfM!PqSh=H64-rRq2TUET z+=0=)$_>Xs;RhQZg_VDwTNxM}klc5GNcXuz%jX8@yd>P-2uS?E#9{WsM^-4p{qT8Y~`vLh=Df4uk`s^B51H;xPL`a>y8ZEHHRo3`jhMF+9Wv}Z9oRTBSPqGRxf@0| zT%F?ravv;yVc{nWI-ltgVtl^=de1U?_@TSc8yb)B^QfVA2cU_=?1xIjDVR8n7M)%R zIv-QA0a`x8+J8oE3=9oO?o-IZor_xcy(cJ-42W#KMXwgFDY*73zfQH`- z==^~NX#MIFMEoXX6BmB4`UAav?*Uua3Y|}dwUc4)g3&N{!{{!L(;GnULr;Htg$xV~ zPZ928$RW;s4bbpIPk*rXJ*?b;*$;CUj7AsdRakHzTl_MB?jJ;Q-vT1t#{nxx(9)j( zOdQ((MRy0xeLOG*l(v>%R1Rt%Ff4+k4_Nx+?`2?cc!mf+hg{;qPbC9l4$l4&bloo-~(D^+W>s#)C!VhVG zLj!c32BG#JY+Zo@^jtxhy;Gp>Zh(rTy91^UCJxKrn>IV{0L3qQ{;*!ez;FP`eG1TX zLfX+8<0G%HW9X~xlr2BBKSAyjm21iKz z!omsWei#i4HyHojwKET}mCr2g3=9n)k;=bPNV+Bzez?kK`1k>IJu|vHVD5qSdttN+ z=Z+Lm_@VdD>#7+T4j{RY0eVg{fchU_5aHKQL0tIVg^pjr$`P2o zC(*>w-2qdFF8)=mrU;w+*g^MWBe_qZk~sJMhlXDQ^xO)Vy|K{oHJH26-2qbv6Nlw* zU89Ad{Ymik@v!#GThRVEjP*z02VI9*1w3I%@CdQTeq@-+_zylB>Z9N4|Kk8 z!(~MHIn)rBKYkpBm~-GhL_K_b7dk)v;5?*!Hh^USh%?|MEPi3M>Mf;sQ27U|KVapb zSPcV%!w*FH@_et3P1QpLzG^9FY4Gp!=I(;kRQN1B1g)g!>wx=WGy4e-W^B z25kqx0!FnO60Wd%4_42@e<`4znL752s-P2Nhs)*Xh5~^F3?TQx`bRMLIrlLzG$6%q0@OZ2;kN*~o_+zezYMcy zCR7|&J`;*xm_9T0S%M(BPb&~uv6-3L3j64u|jkOB!mSUm=_ zCj%OOFmYV*3kyG({Mj>d;PLwn(EI^wUp0Zwzxl(!umf5jEWqJD(7nPSH^AJd0Bv8v z!U-e?!Uv)KBSP&fwB*NNEXn49t$hzZ-})NT{Xfuqh|$9jwm%!@z8lc+LvR0iK-&kf z{EO}mkRL!8eSC6frrAG``_RWHLH8pkAl*;&fJpbj`j@cv>>xWqm>Jrxfw>PBe;_$z z4C|l6;&~0vB+&WI@b*1y`~Y-5cLP%RH9*hlCKP@-mm%p7cCI$8{($W_Xt)i@zqtAz zFn7bk_qwanEKvCet3P1*Ll<CkNcfjOf zG)x>u?>(?;5y*WE3nBi7)o-Bly&JA0?uR;n!+oH0zd>fh(%*9EIwth{s=T4?XV`uv zkREIp<}O(H$txO91Gx{qd;#4*-LR99;RH1QCP43@Mh`#GxL;lmV2yf47vz7H-S zQ$TygAT+FhqyQbKhlnyT!1_lpafCZ2A`WK2cFucRQ7Y0|wCTxCnI*-JMX7m-)(YSw z;NdqTqDUo|78Ru;pGS)#TTql*mYH8#j5y~NNgC;}2AJcKXjr_$XgLep`PkOSUV)xp znE*XMwL_W#d^7?q-B_t08Op%G&;(uA1rtR-q8)aQ!T~8R1`rN_uJ4AahtV*1!Dvg< zN6y&XCjdI%hk=3N0CfMyfh<(_T^5I&^N=9L&H%!zB_R9-66_2h><2nmL4%ROK$0Dd zJD}(PeUM^j0AU~K{VEAE>fEn5Q7 zwIB~N4u$T%9yN%3Ll7ea2>)@1tY0?>XJi23^Pu@B(Eh3jMur6uj0|N`5P66$28Kh> z^Ai{NF*1NKOdRGe7=2uRVJ9~CEdY)0f;4ercb|(Ks(p7HQ2CwekoX1}0m6F>QRNvr z(D)!lSnfx&?lj$r&3#*-?ppxew}>8oG0^=x57ZbLK==tXJSXTdGJtSDbiKQR9wP$? zgU%y_Isr^MK+B~9ZAJzV1`A?w-_`0zv$45v33PwJfgVV?3_52AIsL)*mjxW)WB_5< z{;dTEI2l0r9NPMJEzo^?NbB`s`@0Gbax#E0F894torCp$BTMM{fCr%a`#|kHWcR_& zXTIRi#sI>{pjl;uFB=00J1Ic!-v|g~V*p_#Xnxob#Kr)^QHl^383eO2fG~uId440K z&mR+P;dcRAzC2)rq(5}`U1LE_KOBM(zCa`!0|-x$h1m$9XMxTwmuF-sh-3p}T>AxJ zbC}HJj0F=h0zWr5c@qK6oUuoT%9S53?aG< z3=UHn84^I}-%LfECod+>z>qMRkwIRZf#JYpMg|RW1_p&G(71QjU@s^9{6$dOyRes&0blwn*w4v;lK%E_LVbsDA1wS%_4mPmFz`)S(7cqXYp%;=*pvi~?sS;A&!^ZJ(g&!>a&HUl*jLm)D z(9TELKqdFRfSy|d8$TlCK8+1&njrTHpq-!4s=&zLfOLLNz+}?GuLU~ZcL4qTCaC*x zmCvwngTx*KLwu9jL(us?=>2mYwEXdbMEBi=jw7It2lb$d!}2N2Jup6u7PP&i4+=l@ z@=q1*{E-P$NDDt$KOMdPfSuRkUa%R=Y|$eF!!OKdxk51Vd;-=zjp{W_kBW(UxDeQ zxevV_gSijA-oxcSnEK)gzY6-OVZgyjpEKl#=Br-8x`mVaU4*R>eceFn2gb02J; z8vT5xIna3!m^ga)!Q2O<;~YcQfx-{wK3Mtk!VJ}Y7jU@G9yaccc77G?9C_HeO0e)d z2W|f)e1P~Dm-}Ghw?3*w85DjG(9+)pHb#a6NargRK<{aV)f+Gxwr&JH{TV^mo1%}0 zZ-DM&g^A;GA1wTewx0vVujB`)`(WV*x<9tzDkFS;P+$(kzc6>fXk6zXximuZ2W&hX z7JjgKB!v=4zDBrj7XESQ^a7;OVrzxuqSQpt0mVuA`8n1K#W|^|1(|v2;A_9E6^c@e zlQU9NN^=lGU=^WxC7C&(%gM}4tQE==GfO~cAH(ku197YsN))1F;bYn*nYpP&C_zP%!jSXpkRU$juJ)F?-o(aoX7(jTR6hwZ)LKX%P zegM56d&4Rg1`w7}hNQ5BRV)l3%&!gMJ1k;h0AUCZlZ3e&M(6l>Z^Gt&(E4MLZdf^i z?tajCAL#rckQxx)3r$c4;!F%6+-3<9Wnc)9U;^Vg3aI0mxzO?I22myk5WWWWUx6eO z0|-NOW0Ej;!|2jDW32bjgU*i!>2`pg8;|aOn0pVjGBSWL%sm2Kj0_;G20LG*gOTAt z2P198lW$*Vd27=W8@T*P(#Uw^Cq5oUf4po#%j+8!#GnJ_KyP zH3M{?lLB-fIn3@a(Ebo&-VHKg69z4hVeM1{_{rQbov1Xd9D<47sE;~^ZG8l2en!C@ zasPzELhR)qXx;{77R>#y`F&XV3z7rj0NA`gv|RvmM*-Bou<{+6jX+wkVpx3*qkW>% z|FLs$NG3q{e=|b&KQe&UcWh*YpTF_|hx=jk z@?q%*x-SeCetV(qAy|K(ko#fls$u@{uamt13jYPr@c#yFzint>U`TLA>@QA$p638d z_b?iEz5*=#eP2WBP4xZGb+G+c(DVcI_eAJ^3fOrnDG=}CBq66$Am)qpS_@}_+z%W7 z=7px8#d8@L9Lx~zS6G5Q{L$V2;0t#5r$E~)3>=X14CekvFn=XM+5@n2GI4nTmOo(m zC-Ad*0LcBY_8)A0#HFbW3=F3c=a)Pn(*3Y?*f4j(+yPtn-T>V<53@hH3*ui~{Uw-w z7>yqOhn6LQ_P4^*KP>zgg6>y#K!pE-rNo8*@(&RApr;>P;jatb*YbeG@Q202ZuZ6{ z$l(v`|Jg5KU|>Mr|GEsj`$6?GC~RQqUmaThz}o*HIS^)pmOls3<|| z4>k`iAe4{+*d??8T==xUJ`2{x`7#JLo+^?{lIQPTS39%s_yKWu$5EdRvcpYR9de%ShA znEUlW>tnYd)^{#gL0tI5`n|C5grx!4zC8yPh&eF(S3t}E0~aCX4xeue!(?72ClLsq5xlqebO<28_25~>3^aHE6V05SN`LCex zPk`=k`3$YU(n0&1k?tQ-SVf%se|JL4A6Pp97XHmMP{m>495fjs?%)G)KP-R3^r6$R zc!PR(vi=+Y&}HkgF`wX_ruB`J81ju-CPEShKq>u^8u0W-w18bEKrA( zGf?Xo(xLr2*mw@~dIW|P=y)A0{13o1;GoghFSFX&g7>#yKns7JCI*HEr2SV5))5!} zu=N43{0MVK2DF@niNoR_c5c9frI7Lm7B4V;=rk<-!_*l+P+$dxKP>&j+Miw17#I|g z_7^3rC(ixw_9wKQhuIIS7hwA6|=T0iz3;r<6i zy59oYA4f0$S)ucqFmYJ;-+`WM0~3dZE6jc9G_2l*sXKN@It>*51<>$+3l0Be1q=)a zej)Z}EZB%W{9*euVD0D2(DpO>_ya6m!QutxeiLZ<0~03{{xEr1{&9RNZvk>Yto(t6 z|E^L{{mTR&KTg<0ocm$tWT5xod7$;I!hA?Rg}I{^ny+Ey53GHL9_}zcOdpIsx9ZG# zkoy~;;SU=>*#SyFI~d{nPZTy|cRy_Z2`v2QLEQ-pPnf;CpyMPkaajD5I(~wl{@1<# z%Lz*V3!v_Yh5wl*28ILEnBeYzK&1Pnq2Y<1eyY&wSy=jc0~LqW3ow7d{EbedyZ_$r zX3+lhndtd9x1E9Ez;C4eKU;_k|7*~5LKL9mBryB0K<`6=iNoAK8QT7br5{4>hou{s zKUB=>9)QvhEd9gwxAcPgzt<7_M-sMTcRy%dCdiGj^fL|G&PU&eF)ItwE>%c`q<@$@ z(dSi*dL*=4ZHh6g>`Y8E1)%+RnEN|w7#JE@7#VIr_n$n# z;r<)a5Yu4puY;DKuyz_mmVu!JO&l`%%)r0`-B$)v4+~eAK6Dzr{qyw0adB+>w`SKc zFdRT~|AOtD^VD;)Nh(BQAss&4rZz19n zpyt5N#c@!Bh=Ym`s1ynXQxBu#7S54Ec7GPs{aULS7#fh=e}T&GcX$VJC(Io%_cuV@ zF94Z-M{zrd0~3eQC%;YljO_jmQ1|C7VPH6bK z_a~fQB==`x8Dv`~_?8z`~zF9U^`K z+0jUBSbV{RHfy}y4O*W7OaHL)lf8$5!2!wr0(;1FKP;V~yB{VFa}Uh@uy!;oeZbra zqhbDn(c6NTav_I*3pD&=S2Hj)Ai4hnneI<`4+&3n_cOrK6*Qg0+}{8V{|QiWn7d&# z%)c;N;g)$MvitL(?%%eSf#Cp>`zP!rFZ>VSaQ}l3P=7()33LAesQYn+KP=tD==>e} zfynNMrGIYF0KpBU^uLch_bb5M2@OD4`RVW);(mLI(o z0UG{qmN76mAh};)KY8wNz~TM|SiOK2{ti(0<4Qj;cf;uD6=k6HZSeUcnEQo5_a`H{ z{{ofWe*jndC(-?}8Oepn;a>v{fBU%%3p9;|S4|@4|0P6k=(0GAr zgHy123r4&0^1elOzZ=y34?y>q-$F|NN62$O1GJrkUjHtDmj5t!z`~zF3pHNg4u>*e z>Y-c)&iRv{VQc^FozKAFfaHFGqttajto(tw2j+f4?H^dZ3!_haPF;^2{!Y;FuUf&t z(17Ir3uL+<*3QHTe`vcD-Te*F@Q3A3SUAIIm^m<7}F!iwUtK{#Al_2*sK-d4m)^F&VGcqtB?Ozf&L7Mxuq3&16hRh?u!V7jU zHS8Q(n0qpz<8ZL~8A9%d=`-=m?FP9Y7XGmD^JMh(-z2*KIn@0QHmK{S!`-7XII$?q`rib^l@L_%3YU5zPJQ`(}uB|Jt={ZIIpn z8tVRN^z?s9V|bK@a@lH=iq2VKOa1yh=Jii0}}&i zd=|8q9%lap7z1j67ur65E?7Ydl~+J3AJ3qvhpj^v5N2n%aG8yv5_-=jR67O*b3csk zlkv#Jw*I-*4WiY-7gBy~$YNkX_6O|#;|mA57(f`;{l^ef7#KkJ!5&!3$naqo7Z`)q zuY=@1Y~f-6;a@f&9s`5JHZCxp;=;giU?wBOhV5Kn43Wh=f5GjT;bd&?Pk^4k09!{0 zS|^F@{&%3mB4CDs&LOcxt#{D(2Yge2tk;HVNl}FC4}kH1F{AP?NTI5Sse^?(j6RmR z@-Q~{Psm|lIIx3(;eZQZCD5xvoV11C3}d3fh`*Y2n(R)V+$xhz>JLngxMS+@#Wyg#sI<(LFrMRk-@-~ z4U8eCVTS)sWA-c9(oX@@eg|hrc?O#2LU#Wh==nx4bJ;+WFb)F)!yD**t`BV37(n=5 zEhIf`@L*#AVJYajAO+5B3?R$`-T!jInvDU34^%+ZH`uT-fH2HxSh|PNCk#G?V{<>K z`~>M~fR_98EJs0QDXwx9)@}p24TPsQi=PF}|9*h3|AdX-7Pc`kEI?X6`QRcX9$@Rn zU^FOSfNDC}d*c2^TPJ+!>SSZdK>6`E37_S%mE31kX~dATfYPg zf2&oeLG!=x@hh17L1l!35;Mbrc*y+Df=dwhLz6jtm&XBqi0QEY5U%zAu=RVe`A1m& zx(Yg9`~W)t2&?{F>Y(;Q@4JKblVS3(d9d?GPg;ZeFAC80|J>02*AY_&28Ig^3@Xs| z0120|yI%$BA(;DLL)AY(JKxm<+OL6$!@@ZLCaw!HALc&S5{Ua@>S6O@Fn_?-k7+%v z2Hl?^Spapv0@VGIDhvz@koJ!#T!EMmbuK*oVdlczF9TiAqaX>XHz2XYz<@q44AU0` zotJOWfuuLs`H@l3eGRa61+ac5EZxD(txjQ`37S8J^&esB=UyoT!vUoG@gCrCKd4>? znFVt{%$?}>_eH_lXK45LErI5X1LQBTO8YZ(->UwhkyX*?JWy{Ww7H&-(#w zf9?kDUqHV9?JD;0M|VGLJv^*`2=W^UpMdT^QecLd19PVfbX^lHU%=9p0CZj7f?JSy zgt;4*zF_Hps>o*+u=}Cq4+k{;gfC@aXgH1Nzb9OS*o&TiK;;j}eX#I%I)R#QL2@Ac z;t;Ah%$>*3#9{7Run$!|EWIg!3OkU2P~72qkrz~cURVNA4@*DWLGxco_lqf9C(iv` zu=Ec-&mL+G1MFN{SiHd84?m~J31U7hoWr2u4^wXd8suPLV1Vg^r6;zIh%=z@hxLD- zL(>l{=>Cq!NbBE-bUzO?Kf>&VxxcX+58nST+st`8~> ztFK`GgZcl5r4Ts%!@?gnew7Eh|7|{E{dU4l;@lqrU4Pi10#OeQCWZtwahUxFCP3l^ zwq6V7KJ;^TVBrrdcVOn)v@fUwrGMD@1F-bJ7j*w5(*0Ztw;=9;g%6BI&%f|;1}*&` zg0Az2r3aWhFQAFT-02BjFA7r+%hxb}!`yGas_PxL@;_!81H*w=Na>$Q_cKD%39R1^ zvj?_L5+)8y4ctZ15o$C!V~7sDrowFiNoCYy#tc2VB)ZNf$4*p8@yXb5nK50?`2>( z@B-ofggeB!UmrSd1zV2FrAB9#Q{p5FZA`F zZ$S66A+P_xM_l+HfR_L0=SK@c%M)~WK52la^AnKvC(L~{Q1`>qKg|6w8Wt`}+!_s_ z{40RA{+1DR{y)xzJSs{Z2TEk{>#p0U}!*I|NIbp_`}wp z!`jcV^SRL1&wqrLtFUl}xnm)kILw{s>$+k6Mp*j+=FcVF*JmKRA2xph8ozR=XJRmc z_Jb0j<5;ld2ctpbLZCDPbN?Htd(iJ65Qnvgq37Jg!e0YguffjShxyAFtzQH47c76n z=oP7bTaeukyT2E7zV8Dog!>g9V-J6H_ruQDe*iuI6XZ7#PJpd*Myr>3VC4@~9Okbr z(0M+EN=W*Lg*Q4qTTbaOvio7-Us}V!kig9ZKY#xL4)?>(--m@i`g(F$ZiC&6_<#oz z4ls9`L;J-CY$4(>_l3d2A9|lREM8#xKw$#H#tz&1K>1ezt^6@5XJ9yhwEld-6Nve+ zbOWP7<8mN#VD7&HO((E&4?X!cq!vZP}8)py#DP~|`a6l7>?aPDZTNrJb z6LJ*W_~8NQ`SS~yA^m62ImRG8FneoMAmjBP#JCth7kB3uk03_AyTgD4jR2t&PzL4n)|5`@v; zR-A9d=D#;nK&n7%?D6|AL5hn3gkkZYu=(!{X#Wob149FJ-wddn z1?hpsUn^*RI|Bnl!dX@@egK_sxNx480fe>OA$B)hVPyc}SJ3nE1J1KDfUt@#RQ?<* zL&G^%hQ4wL|G-UF1`rm|hwwL?W@P|j6==q4xWvi;!VpS8@4{-!*fXff=x@oXk6^w;a=>6re@&J9F z7gkPV`V1lh^B;`LtpnnDE?sng3%XdPGCp&-xsL=mLEY)p8;=3^Is9P9!JlAg3$g2 zOdRGv*gO<^`xdru+JPOC4v6(1EPc*vZ33UK3yVM4`Y0bX{~5d`&3`a=q3`F0tuKO| ze*p6zZ2k%s->~?DrDvEpA^*YB2`m9ST7M1$t$&;V&3~}|$IZoz3=Is3@f(46*!{N+ zI$jLRA24%a_i-s4fP_12ytN7~KY{90kRC5+`2sVC3na+Ez~BeHHw(Sr2$ja5VCfP@ z&+=Iv)ch>PI$9}fTF>JP%snL$5K2Da`8CJu`~1!y?I#9{IG1zPUF#0kY8 zEWBWJ6R+=kZ0#4&_%k?gpySRfq!}1Mw@kp|e;)My8HXo~3?LjM51Ic@c+AKE!VW^H z^S7Y$1VQ)x6g*;N0AbMj8Swd!4;UF39xyUkK_`?89xyV1@D}KKmS8t9Ffe?Pf~@ao zc*w{A!t-q)e3(3phWQId*Tz;eWAk4&=zNY{3=9rYkoG6K|E?D?FeFT4WcU!w48{jR z_i-;{WLOZw48|{@_nmx*WM%;2b)fYR8jvyz}lHBcSU`&&TmPvrPJ z05!kh5Gw-+!`5kSIKj#Q!WGc=<%E;03?O_6wr=YbD+9wRR)!|%`H~Axu`+3qnBPuR;B*!hqhQ1d=O+gS>6ka7ho%n$(`Us?bahvl#5 z(0QB#3nA)Z^MHq-<;?+Wh`q4&_vux;v%>6|4_&7K8^44mM+UB$5c6T;u>7roCJw95 z;N>sWd|3Gevj?^g1hzgvW!s}o$m0tJ(D*9@t4uw+AvC7Jt)n zAnIZ35;OGC8#ZnQb5{uTob3f`Ao(0N4u!r>0=90T89IIh>*s@pF+t|TFl?Lv z7Je5a9)j*)mNbB_e}L70%;5eSGeZGv9Of%_{}n)s44D65^Pvf05cM#74@2*tKi~-Q z2Q<4e$U(=)(AzC1ZI3?Cg4hf5 zA1wS}=>V2rVg7^p7p7i|tMwTueKtVjj}Pj?^r|Io#^K@@I%7`CJsBF!4;bS(8v2>>S5xrauwzuSiHf)sm&rw3lx6^ zQ2%{^#-9jie(ND(e!Af&cK?CeH6XKL=@Wf?1tbT;3b1CHx}Jf3R_- z2I#&Qu%)1NFHrx%`b9ARt%JrBdio52mOHTi70llZ(DLqpBP5(){)XA}0J@$KMlaUi z1eza{+yITg0}_xDNTZQ~;Q*5V9DWn$za(h*9x#L053?86Z-9xz{1*W8H`@FjJRL&I z5ml{)6pbQtf46c))>JzoG!WClZ$LU^IIA z`~gi@uzM4r)-vpX&dZ|5-yi6_GJ5=dL=%Vk12&Ei%YW$c2dnpB>Sc;1Ed!;`0On1`hD~mkMa}pSpbv3=fdbpL;;0|6t|C0<`(tY0&%xizk@>VCRj&;sfSC zT;nmYdEEsakn{=jH_SgUb7A}`%ueB;`XK<#f2^|^7!DxKPapV4T>Qb#QC-jou^(m+ zz3K<__F1UE)Fe>)gtgDuq3Lsb0RzK=?TGs~7W~KVKiK(iu=)WWPl6EjF#kzG%LN8+ zh`(Xsd!iH(td)KD=-?}fBw+?1amLUeWqW<^;6#3F^N)EJU2YmH_R?!~6xKLH&A=S+Mwn&)-AW4S?i8 z7=8ZU0lJV9ef~ZGDvmyXp8yqCfUYBi)$d7AagZG#jNYDMRG+pSl>gAz=YZ~)ZLmhn zk2^47k3ZP_ILv?k(DoMk{C-68VWc`*#^wAn}K8 z2EKV~24ODveY~JK>ji>b@OybdbJhw%T=4sOL37p%gt!=B<4T}8>jy$y46u1!(42LG zAQ$}JUeKKN13@nM{k@<$>jWX#s4&8nf$Fz)u=x)(Km7p7e-B9XA85|nK@j0T(46%J zeuV!(bJhU@2>*fRtRDy<{0Ew|RuDw^4>V^zfgj;N(44h^0K$KuIqL-iTnw=IgwYwl z6~X(PVfzD^p!Gw*eMrX~Hh#T<6%v22>k|FR48bC-T*rP0GnU2e89+X0BQgE1UAzAhim>1eP24v ze+QuBZm@g^^B;P<4(2}(sCrmA3hO5+m_mAxFnY!TMOh{ej>rcqpygXJgf{;Iia$jE zwtyYG|BgfJXY~F$Z2kx)4vRl{`weaWT?bnK!^%aN{}iF)BQSAT{XGe)KA{tmK4AWa zm0K{{h}HNzI|qj)#{Of_dWc#k`1nf#^xhAUuR*yNMuYnApsjzfba4PWzKgzolWO}l z53(~b9AsyJ?U!{pz|H`|u>GKG%-NMrI9S6vK1k4Ye>ZtQM zdkj(K89LDTFpX$5%-=9NN%%Bq{WM1WgZAGx)FJv;3DAAGuy}{jApcV{{u|b@Fn}acbE3KWw}dW=|uu9Ds?#;{P$4I4u4r!O{zKd;sR|3()ihGY6Kh ze;tREOE7U*c@484M#I#@^6TTnLia%FUjaIP0Gt2+4LZO20n+#n4|e~9;vZx-%>TX6 z`UjStL2@7r8&5sZ4(Zpx{9lN+&k^ST3D9wM*my0>-6x>pFn_|@_ZrY~S(v@Bc><8# z$QTxmF#Au){hAK)KP>)X`+wBR7#JL$BIeH%c!~2rY#a!7KQYYi9O$?aOdMuEtR6^! z?n{LEAKnjy)&nqi<61AU2bx}B{>K&nu<{S)u5F9o9R;US?dH;g|asG$(htS6laos<} z1)X<-wZmZUTLO(wm^k!$Nd^h%_yH_^!OF2Ylf1z}4HJij7g!L9fVGcc@;tLDH-r2S z8^2+Ow$HhX7#JFm?jJ}HB+mb^{ZFv+31&6=x@K7T>p}ew8?S)*AJ&dv@B-3)gSi)d zo&XmAu>B3N^a3jvVfMplm^rX;6Pok<63G7!(D9G2(D5DTb_NEAmq_KG5OMx@fQ}P8 zSVGEqn7yx{^&Ctb=6~3JJ(xJm|8vmR)x+Ff1WgyP^QU0`=Yozm!{Q%T`iHgCVD!ve zdKw`A!{T288vmgCJ01L)7;K>RO#<{DPguPVqhagUVf7zu|2eGQg8BauY+NA+5}z=C zhC=i61E@I6-Jjbb=^2(TVDsY~(0OQ>IBfng1A5*;LlDG#n0sLM!)RE!3!@JPRHR{B zzcLkCfjZbh;t_ODCO6Xkx3Kj$7ZlkUKsW=m-bkL2!9a-}jCVo<=z;<}0|;N%KyAPF zK-U*FD6unu@IPn=OhK8Q0fdV^AugVv%+3J9$6yXtVP{}aVP`OduHS*EVqh?Uo*(i- zg`EL}C5$05399T2APnJQuHOkb7JeL?|0_W4e+C8y2Tw@42eosM{l5Y>fCM%88mPR4 zvO$ypEP_EC1_p)*=z1h5mmxzP#)8lZc@P>#?$AdKuQwj3{BBUA8>X0nf#D@6eC1)S zat4NL#YmD!O!V>VBlQ{Kp#D27{lnH5EI0`<3pPFxAO;Bsn6)q(*Z2f%{@{QzBt63N zJNkNYSTLcV3kJ*Y=;wmL@;mI_BAEHGeDea@uZN8nqnCp){jebUn#0xwT0eOJI(`AG z|95<5WN<*b-#b7YyZ@I%+g%6H?jMKs_Y(G_`acueUx$gq%Ha~&xI9!n%$;)3as#Fw zR&K%WsfCqy(Co^f0rfwu-mHLm6iUOg5sc=4uQd-_`gaB0Kghtq@E{%HZ_qeCXk-Ky zk16I50}D9089=zuoPpuNQAUOb65L?C0lGkD0WUWL7(>g44^O!mK=?E?{TF=WVgTU) zXn7#;hKm7&WuW&%Ub%=c`0AGaP`fpK5@fmjcTd zFd9^Df^6FXA{ZDLbfNX&0qA|oP+nTX#5Cd7c6|JwSMOnG~5=5LFzA9Inb5{2?tm^30AMd*YzYo!V^}nE~tU1 zhlLNJ`_W+W1EYgri0n4K`ls09~H~OBWzFVZ*TYH!OW;x?C>> zh0g`7I*qw700%-p30NVOghG`583`px&803fx zpPfCB^bG4)!|a!W-VX>92aRchE{vJ_y8>ZOh*$Zlzw386z1-a_3KW8#y1+E{d-vZ zW@0r1LjxybeAhvNxbTsH_3zNyJC~sI_X>X?;Q$Mt|FHWgq3H(}J^|2qY}hyf%-z+{ zbOJL67C!L#VyHQ=@PW@4L&ah3BL+rpt>TiR(&Q3_YK6p{oc!dpqSVxqqQvA>h0MGX zVFH4h=1o(z`EO)P>dNKYtFT1!TF*!Rw zEe&Q^dU8=}adKiFSiBe^T3nJ}P?C{ao?n!cf)GV9GBd9%F()&npri< zLDB~-|HEip?SEK0hwamYrH2Bvd;v=ju>Jz9oP?!^-_UXuR^P$W!whIS3=@a-YnDOt z3rrlAPGI}5VC4@yogjh+%z~K@v%kD!9(eyBtbOwrIzAHNgS!8yKpA`Z;2IA@@7KV> zM+~~p2-eA%!p@tAos+mA zAL0&})#&3Yu<#Owj-SE83+B%_XnRG0AJYDV`7;pO-i3+7{0SR}eE?lA1@qqpSi89t z;vQJL@IAEM09*eK8*hQNV`1rW!QL=EQ2Pd!e)OQ>V-2RdGS0J`r3)(&oft=EC3rv%6_0D~*^UT|1A zCqczOK*#A|;wez^MbL37n0Ojg9M-Rbl|K(o*K7ra&xECrb_wkM#RWMG3=T;5uRl=3 z9zL-4F)Vx(p#5J4Yt-;*fcCFo>xp6M2i|^#s)yybY0!Qeth|7QCwv|r8a}Z0$QEe2 zg8A198Zof>d4(+y_dt)SW`NDlJ1m2U!_p_LT!N*a&lb%2pzwjEA3JFJsqJN8XgG%$ zpJmV>E_`6^RG2%V&Sb#VzKMeROCcHJPFVP`Lfgj<(0d(V>1q;m9OD2lL_KU=0@nV9 zjf=w4+ecV9L+3eR`KTCbKCB#v?Ms8zJ23iWN#P-E;}=Uo?Y~_N3=5V)!UdF0_>jgg zInc)AdRS5SGe%oL&fnf3$jAV~cA))*@{9}$7a@3&1nPL)PUv_iEIePq5;#=g4;sG< zZD6Jzsg4F|IRHIR8?=WPgxg>l2PDbBz;GI>K7oOe0faxmIu4f@85lqqst%okrDGVq z(QrvL^7tPEG<|8VgzALWrvX}!a0KmP1j)c?*m_I!`3_k944c=39Q8u-h|!52=iwG%zWtl7%acR?rnj!(_!ft z+pLa$OAs#09HT1@-NSFP~ai%ZxYZOoZ$z%?-D)yVB)k6KO4;r zrr6S-Mim3Y0i^qv0`v!G_&GrDdqfXEm^iJ&Z;RQb3E0BV7gT@TMx?(927@#FVE28Z zhaXIw*5S9t_yZ%h@M~F(ntv}C4$km{-8YIJelT%bhhN)Th1b}^k82%j_z4&f&hTS^ z-dBkpelT%bhhNuPu3y-~uX70lg9B3j4KNv;;Rm~K6+Qf5;2HGR;0(V89O(}xPV4Y9b(<-KE&a)Y_LqTz5Z3-P8=T>H07v-2#AzLVmFHhS#1?+K z(D{1?X!r?O49@U_-FJ(ge_`UZ4!`rcIT_f(FJdkOLj!X8XE`{-4|d-!dicS_X&ru2 zK7k$B!mn^HDDxt<|EvaQ_`&Y`MGrriIIY9)tP0;0Y~gnRZT#SZ_23LY*nPw3;Rh3^ zb@)|spTRo*vKp=ZEMPl0!;b-a-!6Li!Nh4De(|NR4`EAxy`cMxKv@`Ce+1YK&hT@< z5q>anT8H1s?CBq|g`W=E_{#+Q!5MzA`<~I$A55Iu;RhSHhtcsZueh;|-|qsQ{{%{Z zn;`Rdp!J8Kqg`O*$m`M8-)@ovDMsK@=){bGDmMcNO9(^cKFD)3fN&jj{h@;bHvpL!FGcY(@VnCdK=7c@{!R8lVfDB_`V7LrjAA~+XbOpA*0y^&nnf+#9 z=zz|*!PLXn4LyU++e6jErbil}>qlVfVd-E6nmBA9&~51YSD1R(I-?(G_JZbiKwemk zHXjU2FCaM(Mw>=qSn7PQ9<)9t0lGd97JfX13=9oO>+=$vv4dhk@ik zm~KI)7+^3vuCxYrVv8 zXgvf=2e9xv2c5@G_y8#!^EK>Tb=W*HdVYt^6T|!ga|etre{+2nDEwgSmtgZB;QNnj5$oF& z+=&anfu7Gqj|bR%CQKaWZ(Q?nu=L6RjW<|4z`_rwsY5u=JDwU1!(;HD?3Vq2W+*2I%>2=EA9T6E_>CTf@8HSB0KzLl>pip?84?V+ z!1xDLUcrQm0fb@eI|_Wc7(nAB)!3e@< z@aAFw;VEeCMbLTEp!@9^e7G1u_$_pykbwag0|<-PL2MGR;9>w_2oIBlg)5A{AX}}1 zEqp=e$AWY(fS!vBIwuwswjc}=_kb}#90mr4x6t#dpn{p#^;7MbOQcxGJr5l9XbsgmVwdzwK5Mu`5#t(CPB;3RyPI)hZ-jM`N|7?A?X;_ zu7%OC^Oa%OqUk{Qr#yh3Hw|4j#{fTf3wquzth_=$ZvwUsZXfjiI9NO90n{UY(0d^r zf+6iC*tywHVdW%roej)Au=WJ3+~I&aXgy3lw44`!io@0?CiFwfVIinEe1EzI#9jla zIMi8i3by_YMrXvI6b6NF0LEGkI!0Li1gn41*XzT|Z}j~GuzF|%wA~3a2i6YS4{Zm*#9{3q*g3H#*P-y z@(gNl2DE%#@Qs53gw3EGnE-Z91`u8WUFdaylam32HK6w+6>xJhfN&X9|Ak*13?RG# zs{R5yCj$uEL(MDT;$#5f9WZ$YPKFB%oD6Kx2n%53WB_3gsQL?RoD3k`0ySUZI|l;@ z!^(50^BKgL85kaDGcp*w=K$jy(1`xLaxj1}M3#X8 z7CtcgtW?Mjb`B1a1<>=`VCRcCECL=>9NM4hXAwYnEp(-|4U-5D4bEN5hR%>pU6zp5}WJkVfdcmS;z40Iv6E`jJ8P0JB=; zA_7eh3?*C)Aj|?yj|WP*7(jRdbib-X4i^Im%R$#`HWY9%fbc1({)84T1`vkT|FCp$ z-WtY&(4hJqoW63o7z}c`7($@qKOb_r7(f_S-wV`mF@W$C==xNLMlJ>r)-HjV^P!K6 z0fc|qK+>x~J{JQBCqT`cP{zdo!dlP+8xNFoF@P`&wEZxlnu`I1S3u1_P{qXn!i!uW z<}YaHVgO+X50ivu3kKM@gF?>4PEh#_>wkTN_Wy4dFfcS&GsDjhTMz>rbKCnxP+B zFT%uiK$bEvFkFT9gJI&(W+8(Jblkzg0AfBYT-u@QrD5%NSiSH9dR{5)Tyt2x5CC0o zuK+#&2UhPvt;e8X_Q3q(bkJ`hw(yrNWME+MMf5)u!mx)wtbU|f_%}hq2j*T};XjAm z@b`e24+|GU;SW1E7$f|l`|${cKdjz{scT4g3S5uZ za~3jw0TYLX^91O)+JkA3^bGL@1H%gFc*la{5b+JrimzcGsyPPG1^H;^#S1L_ zVf(iqK*yC}>3k|I-l6-{VCh)_n$8pSAn6}AezXIcu3+ZC`f0H9hGF~hVEr!iaEI|> z_QTxWD*pTe^86z|H2gbY9R_H43dBItKWzR4MsI+I2kaabm^~8EbB|!+u<(ZM6NJ@o zu<(YR%X$Dh9}5d__&yEjI%SxuxVe3)R!yhI-RKtH~YYfWzO<4K!5!(NPtv{TQKxX(u zW(ru!lda z{)LUl!OkN+5DHNb%MY-60@gl+m4j-~{t-+ZRxZQJS(rGiTwa2v9$qd(>t9$u3sx@Q zmf;~K{gE(#!RiC_b0T5+!3cU@63iS}`Z9-#GeFP3gvGlqR2+7`0IWR| z4;6=*0~>cvfr`V-fsH#yLB(O_!1kN(fVQt-?KIH%BPc9j_QPnUPHq8E`hNgz|BFDw z|79Tq!vUo6VTDxU!XJK~3)=lvCD3+wLolQqfrUTpyx#+^5OG-ee}S&MfQiGxAC_NW z?HgG5$3fd4uyBBdzZtZB0~3e&`w_IC2oE1n;4m;Sz|PZz*$c~e*06IQpzeg_yBIWa zSiTd7wp$WdA?;XLdkA!0EXXPtz1AV?GbsFF>Hh^Z{6XVy2bh@Q_h&AEj>GYSG&3+T zz-Z9897xCmI{pJY{{?og0!R*oS3ui~u=YGGoM%AS0m1sGuyBT*L$9zJ5-+fDegzBX zMG$cV=tOJ=bo~NsJ;w#8xB#@>o&Y@;>;Y7~0J_f@CN2Oy5S|Hoeh2LSLkFmM2(({z zAQTdw1yJ!xhau$~OuPXqehqq_H%xp2R2+RCWdT$i6hjCP3o{ ze7@faCWZ^p^XnWkAo&9pFEARk?ha%wEPgIP+tsl9JVA0GoB{1ez{Fwk5D)D)!^$C8 z`b9tY7FKT~*fSM1h=V19~ z2AVj`pKH*>Vfmp7Dh@LrmhMBL8JNbbKFX4(NI=koo8s)?S2(Yc$-*1jXM4==xGv{4HC;z>r{p7+++_CocYy zpydRtJq5F8<8(;+fQiHM@g``$0VWQMSA)x_>S6Kp`Z}sOES^%KQi*}u=*4helQy5ewe?H%uetEw?ClmbJ+MmBB=a)h3Fq0C?GEWVEs^7`x$00{G2Q3 zcpohOVB?hz(Djh8_=AsEo`tp>pa#LlD`Dot`~e#;V~~NUhs7U!{COiJ9AW;)H7
>uDxI-GhE!&J?IP{GI`*IiTY}K~k`OH?02!i*I7bH(~W2j4s=q z{2W{TSC9>|4YbDq5*`Qm85lrq23WZN0BzQQC;^jQp!t5JdHki&`5Uk#0|R_L!2ww= z1`z&)CeO~wzyMkw7of()0K$rB^!|Lk?vRn)x90NTM8z%n|dL9&vkBf%ID~vwS+24*We!=I{F)%PBK+mNE^}j() z09gD^XJKGSn8wJ^Ai)X7HlXz#6B!v2Bsd{hkb&XBL`DV&2~IGEg@=M9Cj$s`Kqt~S z^l>tPun3fYp`Vihgr`9Lzd((X0fc#>?HdIzP6iN8gD#LUSi#8v!d}q!&WFjI3?RG* zYM#R?P6iPE1XW+4&&dG7f1rE@eNF}t-T~8Z!O8H!f|KDe)V>KOoD3j*4k|BT%*g=4 z7ohSCpoupFPKLWset|P50|?7N*ONGyb25N%92+EkIf!#IfUp4cy#D}yP6iNuX9+6Lctpl)td}h0zb7_Dq2GZ_w)jm_<_1b&Ifm9;{wcMiU1u z+XLyjlmn?}VCq{yf(#4{chJP!pyJQa#9{N0AJD|Rpz5czp_&gnPQVgc&%^A6h1VUl zbG~8a@-H;=VdXMQE~@#ka(OP=`RlN9xgAY>2GpIC(8OWe_R+(64pcoX-@<5@t)Gpt zjL!gF z@6F)H&H%!m(EWfgd2tR%`QPBn&H%zEp#2}1d=s>P1LHeFBUHejodJY%VEX}~3P9_} zK=t1QKXwKXW?&LWoNt_ypPa2wRGL?knVYJYTUwG@VXXiX^Doa!EmF{e$)sB=q~;|i z<)o%4B<1JlSSu7~l$NCAm*+vb8L5dWsYT&MnI$EuFtN1!{1S9An6}{5+(d;^=xNHu zsfEEMiA5z~0W%Y8g_6wV>|%&eW?l(g#5E6m?lFX)n~J6&Hx)^~IJMB-8E#%tYGO)e zUOL>L-~*1GO49;LimVk<{`q9N>9kZzE_A>829Lb%^Rr%Z?E z7iFgw`6MQ#<`gSL8^cv6m8SV%iQlBsG*rtWL4kbMGc@U-P|#$?0Hb#VoUX)HeryNb zf5yPT&`=I3KS2Fp(3VzcF~9&Tk6?y32%(;zxeZz$!sNHY7*P5Ml!j3$u>7!ynSo&u zGXreg6ejP6HqPmT#t%Z{N1*ZJ(D=%TtPZvUsc8!4XQ8Qwjn{%D85kJK(Bx~-_)Td1 z4m7?hECQeg)}xglQ_$4ULgQnM`+_0|Y8Hr6LgRNq$6G*hAUp$&?}es51dTsI1T}tV zpz#-=@j-TA!!U2dXq^R753r>_(D~6I{SMG`qe16HgNj60`fEXpzd*G9LK+&s0#x}S zfdE+j2o;+JS_chfgQyc|>f6!!3!Bl*UxenK1u%z#3}awm*oN;3qY@t=U! zZ6hVh3($4cF!djx=0AAJ$pFF&#USgxVe$^SkoKm+MNS3~zJcaG^!+fP{tig*hs&G{ zAiM(FKQXw>$pFH>X!WgzI7l@DAAqWdiEyCRx8I=l8(igN0O1I<`n4b0zj8Ru$pFIV zLF>uo85s^-ps`2J<$IhRt7DK*#x?pMkUs z8KC#YLcI;&zjGi6(#{68$3Sj+1|45&cmf$efQ|DwLFdUAe1V9=+S3iN@$V{#IINx8 z4ikrtAHe$k3ea&z1?apJY@DY7CJr6vfz4~%K+j!PfUZM?&Fi|u#J5B2y#Q@M20_Q^ z;qzwDh7s&uW0?2@sCZE}Bz$1=V;`X69R$(_ z_-p9As6sr%odHmB)=a3qQ1ct0;_&epsQ3h^IQqKs1yJz<=sX6@JsY6n=<{+1pyD0% z5PKWeLEQ5IDh`T!Z1@Cp0pJWMt&-BNguK3qK^8LdbV3tSA;9K`J~Ttp6=)0wWG;+G zUpD}f17Qj1db$J9d2VQN!mtfGehcd#!N$v$K*vpC;;`yL0XlvO6NeRZAJF0l+I?m? z3tMjiU4IPCwhR?e^U=q>U7+h|VdJB)@wl_FdtjmQ1_>1gh9j_fJg7JoA|95`VEdRh+~!~a zVc34AfcqQ_APn2rG~qS}0|>+RH%++1!2rUreNGeZb1;A~Y`;^%eGUc?hV6U0aEF5d zgkk%i818Z~fG}(y)P>s|3?K~K59M%|g8_tL`=T1|axj1}Y=6{+yBrK44BIDVaG!$# zgkk%o6z*{_fG}*|)P_483?K~KKNWC~g8_tL`=~zL=3oF}*nX;pdmIcP4BJ<=;1xRq z2*dVQHN0VG0AbiZtAslo3?K~KZ?)ha2LlMh_FWyg$H4%?u>DsBZ`c_?7`6}V!95NJ z5Qgo?Vz|%20K%|+Sq67F7(f`dKdaz22LlL$+6xL=j0_I9IlvgUUrXQ)2LlMdfX-*a z(+*ny_XOy^N~HD;hX@0BzZXpX16TnA6_5cn{-A6S1=|;_VTIs_r zOKjqVd=Br2?qlR!_ue10}cidhNaI94>=e>7?wUaJmFvf zVOaW{@PvZ_gkkCP!$S@R5Qe2sg-09=APh^N2@g0JKp2)j6CQCefG{k5E_lSj0K%~J z`QZ@<0|>*?XTTE<1`vj&Plv}G3?K|kpBEl-Fn};DeHJ|CU;trQ`fPZ>!2rUr^ts?M z2LlMh(&vK*91I`~OP>M{IT%0~mOdLEaxj1}EPWn$%)tP{u=M%hF$V((!_w!02OJC_ z3`?I3PdFGr7?wU2o^UXLFf4rrJmg>iVOaWPc)-B`!m#vt;XVfg2*c9nf(IN7AWX0H zx#2zs0|-M?8@%5QOP|+H8b8LCK0*8EKzbaY`{r1X2*c9nhllJ8APh^N3m&sGfG{k5ZeZhJ0AYCge9F$?@RS|C@ASf5b_NiJ zrB8up>c$u`_@$EPYOR#?Ao3u=F|MJUasj!_ue14R!_)hNaI5ci0&~7?wU6 zp0hK6Ff4r*JZEPBVOaWPIM2=i!m#xD;5j=32*c9ngcs}#APh^N3vRPBfG{k5Hk@Q< z0AX1ATyTP&0fb@c^T8>01`vj&&kv{A89 zFs%G^IL^)h!m#r5!Ets55C)|+5Qe2o7`=XL>=|t7lLI<1zkopbnedc@0fb@cbHYmw z1`vj&Plu-*3?K|kpBJ8SFn};DeO`FU!2rUr^ts_B2LlMh%1?pk91I`~OP>zUIT%0~ zmOdMvaxj1}EPXaS=U@O~So%EhoPz;`Vd+!g1qTBN!_sHLOAZDQhNaJh7aR;A3@blB zJmX*hVOaW{@PdN@gkkA(!BY+f5Qe4C11~rjKp2)j8J=-4fG{k58a(4*0AX1AT=0y8 z0fb@c^T7)a1~3+Y?4xFQ$-w}^u=M%hDF*`x!_ue1OAZDQhNVx3mmCZr3`?H{&o~%B z7?wU2o^mjNFf4t3c*4N|!m#vt;3)?K2*c7RD9wN|G<|~E3=9mo(kDzFmOf#8So(zV zVd?Y26AlIthKa+{C5$%AcksiOJ{LkKd>oeIuiq!E=3oF}So&PBj)MV&Vd=AAH3tI- z!_p_iS`G#fhNaI3>o^!d7?wT{tm9w+VOaWfSj)ix!m#w&@Q$4UgkkA(!)gu&5Qe4C z2OroOKp2)j3;wY)fG{k5e)z=B0K%~J*|3g-0fb@cvtTU;0|>*?r@~qe1`vj&&jo8a z7(f`7J}<21U;trQ`n<4~g8_tL>C<2h2LlMh(r3aN4h9g0rOyj%I2b?}mOekM}V!_ue0It~U9hNaJdbsP*J3`?I2)^IR@Ff4rrtma?2-7QlGOXrc0ApwZg{4av?fXVl23z{v0PAQX^^ZVH=Fs~`0UJ0N zKp2)j8@6yTfG{k58f@TT0AX1AJg||20fb@c^S~Ak1`vj&&jnjJ7(f`7J{dM~Fn};D zeHv`yU;trQ`YhPM!2rUr^jWZpg8_tL>2t#-4h9g0rB8;<91I`~OP>i_I2b?}mOcYE zb1;A~EPX!M$iV=@u=LrmnS%j@Vd-iRj7?wUiY~Wx3VOaW9*vP>E z!m#u?VIv0v2*c9nh0PocAPh^NA2xF^fG{k5Uf96F0K%~JDX@iu0fb@c(_jk+0|>*? zXTnAf1`vj&Pk{{_3?K|kpAXh^Fn};DeQwym!2rVO>GK9O{lF=-@)Ui%lUn8Lf%O~= zAPln?mTqBm#3cDi*wSy#VyKQpMEQy>{chOC!2rUr^!s2J2LlMh((ib1;A~Ed4U<=3oF}So%%a!NCB+u=G1&2L}TP!_x1CZ5#|B3`@Tkc5pC& zFf9EF?BrkoVOaW2*vY{F!m#vvU>64i2*c9vhMgP?APh^t4m&s)Kp2*OAME5{0AX1A z{jiOL0fb@cS6~+h0|>*?Z@_jA1`vj&--hiR3?K|kzaO@9Fn};D{Tl4zU;trQ`VH8{ z!2rUr^lPx4g8_tL>9=4P2LlMh((i;_91I`~OTP!Ub1;A~Ed3U2<6r<`So(F?#=!u> zu=Fdior3{{2TS@@*v7#C!qC)+(Z4#CoO~Bs`rWb+qGJJp^eeEJg8_tL>DS>P2LlMh z((i{o91I`~OTP{KI2b?}mVO%!axj1}Ed3@N91I`~OTQlua4>){Ed46%<6r<`So*!N zhl2rxVd;0l9u5W&hNa(vy&Mc6JXq3i!yXO>5Qd~i28{H(x98DUZ0YwrH2pdx;V*v+ z4s$SoFf9EpIL^TU!m#ukaF~MugkkCT!4VDy5Qe4S2gf-WKp2*O4;<%U0AX1ARXEDQ z0K%~J8*r3^0fb@ccfw%~1`vj&-w8)K7(f`7elHy5U;trQ`c*i_!2rUr^xJTpg8_tL z>9^n*2LlMh(l5hN4h9g0rQZd|I2b?}mVP%J=3oF}So*zijDrD$Vd+=k2nPcQ!_u$A z5e^0rhNa&PM>rTj7?yrN9OGaBVOaVVIL^TU!m#xF;V=gS2*c8^!Ep`-5Qe4Sfa4qt zAPh^t4M#W_Kp2*O4GwcKfG{lmG92b$0AX1Ay>OU=0fYxj`h9SSg8_tbrC+YonNHZ! zFE@1J*?FT*(w1`vj&-wh`@7(f`7ejQG8Fn};D{W_fEU;trQ`c*i` z!2rUr^xJTng8_tL>373v4h9g0rQZ)HIT%0~mVQ5+=3oF}So$?M!@&T;u=Lw-hJyiw zVd?k5Sq=sehNa&NXE+!@7?yq$PIEATFf9EtoaJBuVOaVVIK{yL!m#vfaF&AsgkkBo z;1mY~2*c9vf>Rs}APh^t0;f3`Kp2*O1I}_VfG{lm7M$f^0AX1A4LHTY0K%~JJK-z` z0|>*??}oD+3?K|kzYk7vFn};D{Z2T^!2rUr^qX*!g8_tL>DS;C2LlKXmh|gzl7j(+ zai!n9W3#qkOTVw60|>*?ufr7%1`vj&UxUjW3?K|kzXvXIFn};D{U%)IU;trQ`YpJ?!2rUr z^gH1)2LlMh((i=}91I`~OTP>kIT%0~mVOH^axj1}Ed6e{%)tP{u=IQ3G6w?)!_x1D z3mgm}3`@TsE^{z|Ff9EFT;X5TI;7?yq~+~i;YVOaWAxWT~y!m#vv;3fwH z2*c9vg=-uPAPh^tA8v9mfG{lm8eHdK0AX1AO}Ng%0K%~Jd*M0<0|>*?ufQ!11`vj& zUxQm53}6h}KcT_MAaI=njA7|F;1&l12*c8E!7UC35Qe4S1=l$kKp2*O1Fmr}fG{lm zDqQ1W0AX1A{cw$g0fYxj`enGr!2rh41Pogj52NEU>}x^$#~v(#tfTRR?q3Jp?|$G0 z(*D2Yko7OnYf~6tG-%x_$mki6OpcK3_q^{Dh?ZmgWrQN7m`n4>tSS| z>n>pXtYG{94nfx$!NeUvhBGiQ#6#B&B|z7Ez}BlcK-UMs)Wg=RG^3dVTdz_FT@Qu6 zUgbkABzziVA?}2&SCNCR&w`0VvpqvMbe#!oe<*Cd$~)*e!mxdsJD~2rSPC&8CcXzM z-VJpROdPhpTsFR9p{s&jxg#+bO8H zJ#<}-0#y7ARD1($T^m&V98?^B9wJm6w%#TNy50}Az6iG7#uIkF15`ciypjm$c@wbs zf-ciy*aF>W4qI0PJD=bgbY0T{XUIAt1=xZ>sJqZ9*ti>vzNr6WGq&)tPzN`l@pr%uOohtB*2jKO zV`l*2A5irhwAmRzcn_NSkI>fFEcpaK~u>B<)4A>b!*aVhQL5dj|7;4bgudGAcuspd4st`&YM3esl+vo(9pANcD z1Ih+bvtb*LKpfC9Ww}rWl)8duUa~3!!+~jt#B&C1y)A6Ni-ImY0|?JT3orEjgjTQx ztWf(dL-`7F>|q23eN_pz_~g38ega4n1Gk z&5VITA(@%M26|2*!&*o_fUJsSV1Us!EDQ`Fr^C*JI161T3oAcCc7bpM^xO_uIRH(r z3@4!C4)Y=97_9uSLqr7w!%a4ZJhb)V50Li1emKp>@D6ldH^?GTTu)(RIEj?s4xC|Q zkbqgpz`*d~5*tG`()#j(OKc3F{db`Aw4p{Y7$B=Z%f=vxl%GCKVq>^~mLJ!kttXd2 z%MYOT5zK55ZHKm=do%11w%1=Twj|1BN04u-1#_$zM{=gkJ2652lTCgMogTh5NC<~LCfE3Rl+4Dyy zn}g0rFhDyW;RtAc5$XOig$&7H9J#RD{Z zVeJbEX!{Ok4y=9AgQgzVzUV*;PuMvQ3~26zo#Rjf-KPsPKLDCP+|k5g=b)6Lg&Syp zI4GPmpz(5GEu_8E05yjjYA;+InxAh#-3e=lHbCb+C7|bY!NfbD;tbGrjw}Yxqblg@zoC?dF1*5#6N;oKaAx10#s)p z*B7Ahp|rkOfYyFYK&u}M(D+oXUl>v_>x1#Zv z!5UOhB@@y1EApYO*DiqFcLh~%g|>bhDvUwxfR-09T73Vsm!S3^Y=71XX#YR3mw|!d z9pd~LhV7904VsN%%Ox3L^_vFN{UXqQDQy1{%mF#j{ZJ-%kbF&tH%MiQf&-boK={ zjsrX25h{KJHZBthQ7-^(zcE4MYe70h+yN@S4?14(0D6x^0aRQ8mfoQ1CqTu2L&s%c z>JLE0??TUsQh=(5oi`~6RevB8(hq^P*HWPFgoztK)43Y-JfQ=85cL62aoG45gB`^E z2~crR*n#i~=swE=D6P72hXr!}V~~Wj%!EMw?e~cM*RYGY{D*5l+GXgukFfLjVD;!$ z=sqb}I{?-%gq@Sy@CV`#Si5rxG`wNzVfmN?7XQ$FQn2mm0?_?s4EG`71Z$7N&Y@I* znh$G78bQb99Lyo=VflU^biWuZJ;L(+5?DSs4RI$d-`|6_pBSLxuyk4jjZauRYytG5 z1b1k`ruy9xa75@d@ z*Q?L~asLLW_zY-y$#4^5{sE}?QK&hvcwvC{C&i%m04;!?yT$<(2jx8whMnIEE5Co< z43tC8e*me0`hF)W`|KEYA?*4u>Rl&s5q>gfaT-UF!Q110W2TeK+AEMIk0&MSU!WN3s9gjFfhRK8B83O zzs+Fz59%*iy*>e2Kf%U{VfDHNtbB*%GpP9%(C~-lKUlh$3Ufcyd|16+1Fg?s=ELfB zSiXdv3k|E+XF$s*n0i>f4lB17oPwlxSiN2VEuUcF1FLuAq4^jVFEgO^Xb4mscE1U% zoRfv-W0*Ox`j{Ci4pR@B_W}h)9&~(tK{doZu=9C8!1f@)B}JvlB?{FFpd)7Bhq2_Ofe(j4Ka&P7 zT#%Szpb%|l0zTly!djs`sWdIPATh5PbYu*~JkZ%aaPy$&`J@%4rXs{Z8hkQ~ORN== zN{bN(-{iu?6>6;&;=#wu7#mqDBvqEA7W*a^Wv8Zq#XyJ9fR3Cg%Fi$HORa#M*#lAt z6ZFbYDh8_r3FZ|Pl3GL{wP7_GWJGdha!x8D zZ4{T3gHi`LxHZhq;q4!QnSkcQM;p!1&u ziBEuvzl63288$=wbpR?3Ki>{o|0X~??p@IO7uF6bfQnB?6Nilx&Vin*4^s~t4-~xt zX%E80VdH@fXy@m`#{Jep>tC4q15kS#py&U?#4kX_FF@l3CjI~_u8-!<4^Z(isCdIw zNH{P+$4lnI=G&qDRRhpu6$1mq1n4*?tUc=h6`uwj7lnxjK*g6r$E9K72~hD4H1!2g z@juYQ^!SC41H^Ctz+^NC^SV{R*BU}!)ZUrIO$@ds#+3rH`FhUM=a(0(-h9zSTh2B`&M zBWV8g^9@Z{Chh{IVU3>-2{jhfN0cbxQW)7@fTnBBZ!^C0j;w@CY?uF&9ZCH7!1snf_mItu;lMB#%f8Yuv-^0pLW9YdvuyAwGgCvwd zX#R$Y2SCNuXF>8YY(6IeD$aryUj zpy9sdX8Q}|`u_m5|NX<1f#JY&ME|?tETnvZUQ@sTqhaL(19U$B1hk%1sDRYZFc%zx z_HSV2F{~W8fF=$r2YjIQ#sNb}_`}KpXQ;RXR2)_gz{ay2Y#{1k7O43!ao73d!S}(!+>#+E4g63aX`iG4(heFFMn0OO3U3`G$ zFKE7iokyq*O}8-hZBX?Kpy?1M-T@Uihq@Cc4mu|tlqQ}++Y1WN`>T7P>Yqc)4Vd~q zs5mDqA3^)IuzvYtXuQDFKU94y)Lz)Q2(15o4mv&rODC}Y_YP=11&bG0|GNl!e-vy! z1=jyQ3LXD|r3cvf`2{p_Sbus3G#$d!!|rA3fW|va95&v*4tgFIOgsSEFGnATO@N9g z!N$X(_g}%r=ifogv4lKGzG#4|{|qhvVfO%RfQk!1=N%f{A?jh{_6)Fk5E}l_>w7>^ ziGo4vj6njhdodac^%6kmyDeA%DF+3h<%>rlGs6J}#Qnt=E<*ArXpJ98Ka4JhhK~Yt z-6Tj3gkk5D!Ng(hjZ@J3j9}xBuyV!*nvWc2LdqprJ&xY)gXQ-F&~_y(UBUAEerSCM zODC}Wz5z`fHqLnhRz5)ML0CEP7dq|_%h#~{egjQCEWa;66NlYb6#9KxoiBl@ht0>iLF)^c_y?%H zOQ7)%6NfEC`~aOtf#nz2{M`>UaRq2Uf&rSIVd`P?dO=YC!o<4i3?Q6^wtmF`&HZYy1}D_OG_>>kYh+Q+i{?XG?+DT&gT_ZcpZFS@f1Feq7#?UN z!t(*zI!I2m`&S}h18^YA7#J8{qN)Fc#&<&Vj~JSHbI{gXKR|Pz0kl5`wT|I8n)$Hx zsRGM67(n<7n*M)id^gbgQl#{Qe*SW}IcoSGL-X$?wD7$Ox_<=8ym+MbrXV*jt%a<| z2C+f7u^5$K0UgHz$$_vOtbhS=K;tTq<9eYy1_pmL`DW<)aJT{-4A}fWEPL&d;t2rt zzhLXXpF!7ugUYW5t;`HFpyvrQ+=i56u;LR&!^$<-ydvy=20AVP8z+L5&)?D7>#*@+2U!0N+8=<87bn2Xfv$6a^)ut3{rLw%ka89_Ud#sF z-*ezPw7(5<4Cwx7=s4+ue26%#-}oFlF9vfztlwAyofm_R`@s5*)=>Y##zA2H!xhl> zH%uJXKSW=r2J0UhK>LBPenl|SH#+k5j4QM|W)^B8oxf9y|gtf<3K>N?Ie&8*rzYaj_MVR;< zsCXE(e+v_bt*h37x*s;41?!h`!2Aof_Yu^bwXpGMX!>~p6<3DFJFNc$>&KQs`?0Wa zfc0ZHKZbZ4xvbVB=!2{w-`g5x(9D+7Cou zCkPv#I)aw|VdGOjp#5Zqoe=lH`olTU_&P8TDh};uC8LRdfQom((gQTy3ZVH~0k&QU zDqaB<&w-{}*f<)j98iL$Pgp!ofU3U(?I*+b-A;mvS3u{tVB=*ApyF=O@j;mQ2B>%z zR6Wd`15j~={g81m*!ai=sJH-B9Oj+}P;vBioiCu`H=*SZ%wHd%;v1mh&%h5U4;k1X z1AU~iu zI5{{wI5#*yBq}m9DkrKSsyHSzCNU-{CM_l}rYNQ)rZlE3rh-c$mMbwgy&zLFw>Yo3 zAh%edw78b*&{hQncLfDs1%&_wEe!=51qE9Lg=|}eTw7Hu1wB1ILnBi&BU5{Odslxq zkHkEm#C+exO5dVww*S#m~VUP@|WN?K-4YFcSt za(aGdN@hw{DRax(9L4SNk!Sk$z|!qsj1l|MWv~r`@s|x zbXAK%;mM`o5g%f!;1Qn)BGN&DprfD=4&o-}r6?#Q=atwhWPrFC@#!E|iLF9rN`;C z*g2-;B<4C66lLZ(CFYjqIwh7QW;>N;WTvyv)Pmxi%;Z$?qApPIS(GK_l%|#!WtOBWX!ts5aw&v?1QZfeQi^O9 zlJiqiZ55JBDoU&rl1q!yZ547di%V=3a&_$rY!wQ0?Q(4u3W`$8K&dG)&sL!UnqFF5;#8EFk(=q9Sd^KV=bVw4otx;K zpPQSX=bT?ql9}vQl$nxP>7HMbk(um~n3rCf79|Em7VF6T9BNP=u?@TnV9EOnUa~9=bN9Gl2{p(nw6NB9_;Ml>Y@-_3K9vfEXqtw z4oS?6_el)_nOqW*np2uy8j_Kin3otGn^akn%B7&7puovlQdy8%405-PZfaU;UUF(` zQBhvLLMm81KPf9UxdfCZ6HAIS)AJH@ic1npN{b;k)j`%df)|g07f>0Rfr8rD2t=Bh zC}JBenT};Epg3BN-R#ybN6>~bqaNNFG|cS$w>4_%qz{y&-e6K0IgE=O3W)wEUNTQ z%*#tmN%T$3OG(U32B+WDJm1oslEl1B-^#?i+{7aP70#5c;3PpwnAdN+ah7igKLK#CS69{DrrYu0DLXjneN~{3UMM(t^3c^c#g;2dwOkeiuTT9R6v>ke6CsmY8F! zkOx}rnqsR^keHmE3ZnBf^GZ^S6u>KMZKG8cee?55GBk7)K*g(-f{BHN5vUMzEXqyI z%S_C3O3ca3OD#@y$}h;z%}>jBDoqFToikF4^0QM@ohyqnb8<41T~d=%bCXhwTuKXa z@+%YbTuU-C^9wSQT`Njb^HNfa+)|T@KxxK3HNPl5GcnJ-G%K+vu_V*Iv?#YUJ0sI0 zvnVk=F)z_8u`Cf}pEsz$Ow3F4POMDKi1*3#$;?YlEQ)u8(oVjK8Hrhmd6|CsWng># zbK;#dGP5%S5{rscJ@ZNeG7{5^;{y_d6H7{qQW7ge64R3s^U4!J89XE-F&9LKWu}&d zWRw-fMT4r8idPZn^Vo_#EW^yzn?<#QVf&dp6Cp5g0)AN%vQj@b&Ng4;?RSSr&|$j?auB{xvp04!x>Vq$0l zD&egZGV@A{Q>_%NKuNBowAj`uvA8%fJ}fcADI+m6ySOwv(mPQ9;pG!2ne8CKja^Yk;#H$f+Wxe3y2UM08r6%W>r50H!6s4x+ zq$ZbGDHN4gKv1z>UTRKiZm}&iEgBoa7{)M$35;P1W0=7h<}ii@jA037m>9qqhA;-q zWD}UlCNPstU?!WuOg4d;Yyvac1ZJ`+%w$uT$)+%qO<^XR!b~=WnQRI(*%W57Da>S3 zn8{`^lg(fzo54&rgPCk*0;)1W1*MLHLSk}BDWt?q2bF-}HeNwudTKGa`CF7)Qd*Rk zngY%og`jL=3(6*ipoQX~>;Y<{YG{HQFPY#H+E$^sB) zQ%gXN=aP(~{Bm$j4Z1`)2h^ZeRn+kF4|5H2($sKrbn*0aagET_Pf0D)FD^;R%ri7H zGB7s)Rn=yO2F9k~cBGX;L1IxcsMvQ&EhtJ&PAo}HaY-#p%u56nPwxJ{ju8Pt{?5Vf zIflnwJS`ECnZ)79|#EloTb#`+~LxxTGegKv-@?si~0ckeHWZ zk(^kZ4k}AZi=p|z(8waWptPVUAKY{Y8ER~lmzW2wk@FJs(vv}r9ME=#^!%dy(vr-) zR0UX_TvC)@4!UPKB{MYzT5?(`q!%Y=q^5wY@Z!|m#N@)#%%ardjQpY!1yGp~QbCRWoK#TeEC% z^V5qG3oW?sBUVkxLi6%Hy!^U{O!(@Nr9@=Hom zQ^FIA67$mIoij@^!!t5VQsaXQ5|dLo!S1!KE=ab5#It8!XmM(Md|66yemrQa1*qf$ zwf$3zi$ToX)M8LO48#P4}?6_P3y(h@U4 z7iO1dmSlhuheB#aW^qX|sNT&{D9O)Gg(MPia)Gtr@)Gk55lIJ0)HppETn~eGoIp|( zxK)>_pRWLNPJU@gPJVHT0wm&cQ%f@PQ@|y0USb}&mz0-M4EAtJDrk!bBsGEiIw0Lv z3Sjqv(-XKkrBMp%WhQ5U?xP0Pi+bRVJhl)fC{fueL_-Vm)Rb5SupVbnPfS4}Ex$A` z1ytr}X@F8vI;6w}x7R|7GSkyji$HC&^weT~NDrf+C>3-AcYazLs2l>9|Cv>wnpzK5 z?!eO%q$)2+%mb%okebTk+B`CJoR|k{1f^x>r6_;~6HK5f4_svzr6#9lmZc`==ar;Zl<0-{ zyZEOh=7jjT6a<&1CxaTR3gCE8Pv%MmH87x!^7Ld-CMg0-Wq?vvX0Zb3zIRYJDm^hr z0W|OcEyWaybMi}|d(`v_N{ch{OG`kFF;K2cg@$;6l|rs9qJ%53g`~iw(zLYHq7uD4 zuy?&vD{U1tQXoBf1=T`LBu<$osIG&Wmcpd~>NupPD5MqT=PD?G_V2`lat5ds32N8F zTX&gx3b2-|0;qFYm018u>)`%GW{wWH`3T~a*;M3K-pTs-5DGsItuBCk`Q8M0i@pnNoU|Du7ZZKg`tU=rMVHfhwAPOsZYT@ zOkYr^A>KPPJ2AU76I8f)l;(k|zQnv>Pj_!mA0I1)?97~;U{CkJP|px6g~HOz5^%o| z6ws>0R$QF9`9-NorD@;-4U}jyauW+c!#Lm+1ZI~cmZYXufD%P|DtO;vT4G6JjzVft zQGOAq)e0_96hMAe$Vn|r%~3E`C`v6(Ey>AGOfiF{sl3b_P%2H%2B`z3y2P@?%$&re zoK$G6=ceZ77gZMPA<6{X;-Xw|*#NewxFjL{39cF-EfG(bc<`3A zfW(rL)S|rj;L5y`#EQVu{1Q+APRJ{O54hL6?;BCC1E)cjp zfq6n9T1TNo50n%2KuvB1Tcp&Kn^;h6Vs2((Y;I_3VPpVm58J>395Mpt80_rn84vFV zLQ;)SetBw9a$<2Rgd18=0O1A{gMz*&J|Hn82Q+r*Tz)S{Bi;#5dr zf_s<>>B$Njp!}ip(8>&&03aT)0(D+M*%R7kQ~)JmP+eM_nxc@X0BWHZmE>9}rgK3R3R3$6R$72dg<=Ir0iOtWxPhUO zv5BdfxrJq7QgTXanvt=EiJ^t5xuu~2w08q3!1B|;c>q*tfC4GC2payLxdo|3nTa{^ zjzx*NppivT2L!Z5JKi&|IJKw*+#vz;gHm(z%Tj$)i}FEZHu27-Ma7wA(4^p)Q;?CE zlv(=L%r7kg@rw&mlQR=@6hM;= zV18w8Qhp9-3LqynDKjszs8SC;YLT2+T#}y-3UWvz3);3&NKVX4PR&V8Nl&&?D9tM_ zPc0}>0F_DU$;BB(nR(e@>+{npxK~&1yDyTRiPwb0n~PZ3{iv9WKn8ven~30Wn-n_5uY0m z96=vu~VmEZ~cLcD1x?h!ELkDiqvG#z*}x& z3B(;~r6s8q<%!v;r3H`~pv=6K)CvVVh4Re2l>BnnycAHWnV6HAo(E2cNtx-ni8-L5 zywns>lMqzrf`UasR{`W4NJaq(IAxX;!&81G(QL(So2FQ2hZ0*Rak)=&7cM&JVEBA zR+Pl2CnHiYwABhOPodc+Pr=q!!Jq`(DE3aRgtpafAxTRiwIU<2v=~%;gGTVd12-`5 z!zxX1Q@u!`AQ_x^6>=dJ0x0b(B&8;UcIqpniNez<|HM82JM5~f)&68SXyQ>B>KWY^JySg#RsQ?Mj7*qK(UYu z?skC&bU>wPQfXRdJ}Bvd`XJy2adLiMUTQK(8)$U0v^X^dTD0joB_?O57lFFApomof zWpr?~gNmQDoWyj6qSTbsw9GtE*HX1OEx*V$F*zduR05YMfQNn(i;@!4Qx%f)b3o3? z%+E_tcFF-wQRD>_<>wZZD=00|&o3=0 zD1|1}+|rzq%#8d31yD0Gx1c07B`;qgIU_R%oD7pwi;Gi>^YX#LT8v0%`30$v@qBop z4NWA_WaOHYnu{tDQdy9SDgqiyhKg7zM5PwxLlPTk7%(>#)S&>?T?!?(#h}^2++y%R z2_$xkD~n4~a}_|HK1hYD0ZS{OqEMjWg%4-$eF2Zy%jf+xd4LXfad%P&$$%S_ElfwlmU2R>j!UZr{P!VA)h2e*I|L8p(T zCg#HX3t&-jZIzN)oUKp@>gFhl|f1)vf@K?4*8U{!D- zO^^^Y^FXtl8z`XBgh0c|s6w8gY6wlJ*e^2&RVWy=vH=>cRtg2lpuQH!UkD+{sGCB% z0lX_!1nPLE`lP0n6lZ4^D3oM?Mtor1J=7L7*pHwT3To$pXKfWq^D;}oB_g;(1zu!-B>EMw_PO;7 zfae)OD}G$lD+@|86Z7IdGE0uO<#Jb$SP7^m&ja`EgHuzpK?Nja#0AoGLKQ2|0IjotwQ%ACO7lR| zJD{2gT0|s+;vgPcP=InQ)Kj1dQ1H+dNGvTsuLN9lLYp=qG4!$*BnB;OlS-4bQ%m%c z3NXcTLCZ?=!1I3!pkiJDG>oJP&Z?kj0~Ng>k-XF#q&gIoLQ)j+OG`i{lNER-U!f?q zur#%}BsB#*$_>g_;P{5r3*de!sP|BikqGOnrYFajK*o&~NXIYeN6rY@9Xl80;VrFP;nVw&eSdtJM-Bqo7t zO7PMlNbKb5+JS;PHAMk5NdggrdIG#C2s|tTY7eA9I(MK{4{92MI-W_Xsd)-Tsb%@u zsVRuop{tLZ0;E8N6e+L*1~O6(YWai9NzmwEK?!)75vTxzvO@Y~xmS2<&D=cyovs2wl^OA#0N|WG417d~?(aBE9FHOox z1rKb&)xoOlf@Fj`P|rjUT(;Vxl`BD+=^5Zk4H5QvrJw~A;IS+#P$~h%DWt;#G6veg z0hPp%;7BjfLz?)o1+9AH0%-w{)Z`a|$^*#o40s(@W`1cgWXKIXJZ7s}tN==dsO>aE z3o|1#6H`MIOCw_gOH;_Kq@}T;v5}Ffxrv#fsfoD-WP;K$FR>&aG_Q_QROCUb-^~2H z#2nbji+>4dn$aCJW0jhl8V^|y0ocq%19l1p z>B*o`7|`ikpb3)9;*!+7y}9YdO#ukcJm1VHyM+&6~GG`LDffaNPv|>c4}o(eqvDycw!zpF9~lm zWr7#Xz{XF&Wd^uv1$9pni;GiplX5B*z^SMhI-CY7;?rT1w~)q2VoD`+CJ8(M2=X{2 zJAztQ;C2V72?0t4;8HLh(k4wxP0KGzRRA?lK_lI$#Vf?h(p*sI9W>&Tl3A9Sk_w7J z(8xSUvLoA-A-+L?J0v0oh44@3o}bIBgphCdkY8M!nUn(>f(niV z4M8P>+o+&Y6EtE0U3XCcYRrMkHP9%VLV7-E+PGNH2|RCUh44J6@uL8pYQ@$-LX84w zM=2lF(J#&~ElN%W4S-dG=i{stKr?xeLJizi;Y!O%ECKhYLDNKt3A=QRAqDWLO?oo; zfJ_BQ6Dl(gH1-7=(*Vuwf`-o^EpeDHL2Y92Xp{mmZCC?kT$w?L~jP=(<+ z5!`Kp#WJ*glb@Cbs=JC(i!-ah0Rt`}Ky!I0sRlGSmI^LkP=)9 z{vu|c1f51&3`qs)Mfv3=848JMpk=I}<{PAs4{0)kitYl?&`(hwD6=AJCHS;AxP1hf z$%3>nA?@YTJWvG)%HO=+2%nHg9b8k?Azn;4iIK_8n7gRxS` zv;_~&DnN=mXqgEf2ZJns02O-*`K3h)`Q>?_iO=M0q}~U3?iy6p6r`pWK^w5(lFQv0 zJTe2Ge1+z%+{6m-xGZ=^0aTcQ`W2uO23#U$f)+f2(m!Zw1Dw13(6d)YVsQo}EI}+# zBLUJIfJ}uNfsHAy%uCKF%FoNJN=*Sbv>**&Sko8mFQ^}3LuN&(km8}Z5VTMaF>{+z zS_JAkxjPq?<`ou~q$cKoTZV<;tPJWQ!BZt@VYUK%@D?%9n+i(8pb2151(AkWd zq$Yw^fYC33?J3kFnA>|oa8X6c|7#o1*)r^hJ4UEkUA(QUlrZi+|I37G) z1sfGZ6xgsTw*ZtTK!KB!o|uvXDa#;@H3fIj#3v}xLHU_^3P^KQNU1A58MFW$wtgH` zCW2~JD}~~M(jsslqZ~X(0B-0&TIirTPf&jwye_K_FaM@d0lnPItpk+}- ziMh}b#bQ{G^w4%tA!h|H*%ZKCDe#^jg(T2OelbeUE6xWEen4_9sA7WGK;T4{Yo$;C zZZyIAQ3~nBpl$%jcyK2Iqy;92RN{i$@bDHRbfCI44;tFwasoWmYG`6=YG`R_YGh<# zY-VO*YG`3#23b~OZe(t1X=-j}Xkut#Y+__;X<%#&SuPL^>M-~RfVvC$1v(0)dEmkl zWG1N2F9l5nfEP*>WPlpzphZid7CYzwXUH-p1(YO+n6n5_NXbkAmsmxmc?xOZ4Hcjn zX@&I6veY~U@XF5=P>KS}KuUA)VyG0ov^>x{@Vv|%P*(t?2Q)wkD>rgd^U_N)V96Uc zhJqNw1`VQstu4*VEG$h06->}pe_pm02`*;}67xVS%Rq~;5T!7K(l9+1*rVM4hXdZI}N3b3iS1ctHV*^76!Dg`!l@9yrix?Uf3}sYRex zE_5j&DAqyKUj+(?;dMmg8r;@_CP#4f50b*+cqFNu)I1b_fm5AAgsY!t1bAi=X(SR< zE{5cTyFaN#zKO-zR){77WEdnJlttldogmd=5u`~7%2E(kYKlTpIrugKc%nwC*g)e; z3hA&i*9tPw0IdwcEAkKt9-hV&Kvf<%@5AN`q0MSg$pJ3j;XUg^+aZoXDaMl%^T113 zptU;EY87ZB7up#^8TTyCOo!CoC?y}r&!DhK&W7Z7NN^%L!QeazN^7vCPI^lsklNUw)Pvm41|@UQ`TB{;+2BzH!w6eH?lOcFful`G&D7UEZlI*tVm4> z26ZSvxg6v>u-|m^({zn|JyH`3;z2Xwpwik0R0pOg=z;%AOHv^d8?Z%-9-*LVO~`~t4rqB@szL^6k7+@$r+c`kpRn;BDk$wng`mjkyr$(AHfv_xSWDyYEUT%n`?v&rKO}6mt;cx1h2heB|X+|IwaL` zf!j^sWDTB{1vQkw1t_TO1Z5Lg6TwOWn%p7FhznrNOmJF*r0HB;J5bXzJsGkn6MF)L z6;9A>sZflR5pWbi;E{M(lM!6`fn15y`UMra3I&NNDWG7<%u|3&3n^%1r&em_rIrU2 z<)=B7rok6Z!23*jso)D83_*S?S4f8?7e7KD9xmsdS_zW` zji7@@HK5@Lsykr&e5_!5{orz-Mh9XID>!e$pT#JAE=;#7r)?D z&7dX?XnUlU!nv&qcA(|%c{Vo18JTG%n)*hidGI!<0x0c*THBx^1XRzNn3|ZIm>ZiK zSXh{un3)(FT3DKzn?koh2Yb2)cm}wFhWbI9*-P>jkhZFTB*TNOpo4s%raGuWRRk&k zi%O7pBq*e$mOzFLl2S{`Q&T~WR`4R5#2ir543_f1(|4&w;CTzZV9)?EXmcNUdkbWE z47AiGzcdHZq6DXJ1?PZJP^^M7ixp@YDrj;Sya+Qr88U38XsZzK?wp^NmY!BnS^~)r zpwKHVR?q+yVBj>R33CFZVF`*#a1Tf!wG6b7CLc8Sm6)OrDJ$~xK-00H<)NVcI=P9- z8Q^_b#o$zv4;ivVv^F7iDQF4{+;~P>IFnbJn_2`Kiv+EWFU=`IsfZDsB&5;=R0V^g z4xU`oK&Kj1f-QzeFg#6y7T$n-0`nU~&82{c|6$Yh@U3v*kb_2a zuFBfT$lTc6*v#D2#KhRh*vP=t(!|`t+!T5`0i@b>1Z}Q^*SVnhgY1I=WzisiH*m?9 z2I@14GuE2QUI+}*M+V+18r;uwQLQ8J>5ftgN(4t8U=g0hlMzTmnf8F7J)X5 zBAX29K!66iKwS<{(*ry}2a22A!~&!SA4>BH(ydO0XK}~|IMh52DrQnsK&GarmcZsF z;mf~3=?0G?reK#lP<@Pb|NAtm7a1sawsC@m?@ z$u9@()dAhclnE(nKpO?%=^Pa0FsEhaLAF04avo$TE;CO7nk5rU6tpxTwkse?ntaft zQ=TqF95loT8Ult->6R#fTkW7+Qj!Xhg*2u?WekLsngUUyr>6(1^Fe`_m;-T3u|jGN zX#7P_PmfD4Co@T*7&McRp9jhziF%-p3%osVXlQI^0ou)AZe(a?Xl7t!X>M$3Y;FlX zUcuDN!o=9b(89vZz{0@7z|aIV=VM`M3Eeag8p?2W53^DzPE7};KS*z|EHgg`%mURa z`6b}(HR+%Q70@Llu$CEO#R8Wz)WiaKmlM4ANkJFX@`28k zfEJq|7KMO{X~@Dy&Nt85A{U^|tj!2<>|5eAnoF2JlntiU6upow6}#uM<;GUSbX;2PZt zbTJ*I0s+rLft!R1Ntq?ZMiwSUhUNyACdLLP1||ju<|f7_7A7W^=Fn~D!Jh7JpwWaD*<>y){lq9CZYfDh83ATQ` zG#6`&1H1_ZcT*5Pj9ZeLTaaIrSd^Jli98tqk9_bP1hl$<))1g^M7TUu4BQVzT73tX z&jroX!gt{)z|J^;%flCkfYgB|Em@4JyQnzC~Jbl z8=P4)^Atb}n?Zv!pz;`0)Pg2Af>TRC^BSOP0x^&V>cqjCAK-dOLA6i;)O7<7YwAMA z7IRV))4=P~ild=Zkg;$ExcP&bS3$WJTV{oxZ3U{=K?MjX93f2+Smyz}z8K3?D%1)q z1&9LBL`{C4E@Z+E)dWcU26HkNZUT7d5}OsUJ_`EIF^sM?VyOuv)FCUx;qy6G;PFk+ z`o`i^)UFpi(}DI_;a30}7>BI6Md`eOEkqf70<|1Kll9QUqd?gcGWwMZ%63R?ERZPZ zSgXpsWGjWBP|TV2pm6Zi9=x*wo)#_!#TBHvnwbn5B+CX*`xYob+7zJe$|;~dx6sZz zco-Q>fX_{WRDGbfIVdTDhBDGXlUkrDT~MM0r8MLL1W;ca9Gk|brbgz5#%7>d0RvM5 z14|=IV^dQzBST|j=n)9mIw#;V7@P+{xdP0Kcg-splxAMcr-mk%CzLtTv%8su)JP+F7@ngLDD&r8V!wLQVDbI>?s3AFex$p^J|^Aynb z&Vq*K!C9%GC?B+_ECoD(04heIT_W&A0b*7Q9GQBcjl1B{aL`qzpd4lZ%fxQ^MW7*2 zP>BQDc>?KagUeHB^40^bl=V-8EcyX=8DZ6LF;oRC3!&r?$W$X-1!Uz3wmbsMr_jDE ziXjkpKyr~@aB7JgXyXZJCp*0TRghSWluN*aZ?L8XXm@J?bTkg0O_1g&A@wHc>=;m@ z0f$p*PAaH#57|TrNok-F>>Til5Kwwk02QT>#0V;TL1#mNQwMneq&+;H7lDqf1Fd8) zhC38g-6p3Rnwy&$o0?e|TbdXc7@2~08k(7#TNoOcnOQ(j->|T-Ff_L?F|;%{FfcSS zH8M6bHny-dFf}$dF@YYT07%r97x_2#QzGHln-~5D&D@8`{53sQ@Vf zg%zlw1sc1AtnLA|MBvTg^rF;CNN>Rk)EfhP72Ik}Ez*TfZ-N#+>V<<2>atRBttcr< zgzW6gEQS=;phYDhC7_Z6(r!c^(gT+VRtl;qxtYb_U1p$d%#ao}Xv8lwPXV%295gus z9i>u8DatP>NJVKLtvGayS>L6g4V z$7iZeD&tVNr2OX<2ziWtEAE ziGc-Z7psM-fq|Kk8K@s>X<}+*W@c_=3_Y>|X@3d$WB}0NX6V~(eS=F9ONtfBiWPiQ zbHVHoP?Z5n=b-KzIEh2X!$1XXq5`}RtN`AIlA@54nN*ZmR0&Il(2*uc+X>bRfHnX? zGl*b=LB35?$OUcYE64%wd;>{=;|thON zaW-UB0+imtB|lt^UuiDEx*nv<2fRBRR7-(U2S@~B4x}7{eErO-kg zTw@@$;XylS;E4woPzA}lsd=E|`BEVJ&K1%SZFQI$&@c?B&E-^@lkEhVIER}9=?_2~ z`=C|0x_0RXprH?>fzV>iHa)1y1Wg&i&4I3@0M$gGMlvXtF=i_vgF=Yr3es{M$W)L5 z$Z=(<@cGB&^n3--F5^;ACC7z*OcGQiAj?*-20$o({ED1%q-frq5s^YhblQe7)DOF&Hxa5~`vmFAGM5ze_l6=s1YS6xCJy7NZFK~t=Rzr6u&;h`p*oBm+3W?waf}q)3lyrl(*#&eB zJtR~??GSjEEP9WnW4rI3^Z-eC>OLLe(r!HZ*3Kr1Og-6N!`I3qC+v_1vYy9YH! zK_QWsuizIF@9q~G?-c6k;}Y-b0v$fg%u_(@;DW~?cFy6m$*D4Ga`~ zgF}qW%}q^B%}vcfCy-cJ8XB7#8kkxdm|Gf}8yFdx8$eHa0GG?Koywr$XmC*j>W`;F z7aW5}6JU*GXiwMOIiM&%-AVym@F0yZ;B37>8fw9n#o#Fq_|gpUBn~JQLzd2Xr6_(s+}tR5_7>7BPeGhcTeHf5v1z@9jnU+ji;xkV#YyoVln8{uy}XqI7~?? zY)=fzSstJ?fL75!TnUl@4Tk0+wSn{UQ&JTmlQ#+}pwl}*d$LNBGr;~(04+%>$pAMR zLFGYtDyY=~n*{;o2<#0Y*c>9f5oBm=VQy}2VQv9h^I-y78Ea~4WNB(_X=-6=XlQI| z1U;$4%+lDx!qV6hwEn{!w4%`5+|0z>%+lP_$kf!#+{_4ikOHg(!!{uaUN{Xsfhh@5 z*9H`&Lfg2YeYlzFpd&@$-5_Ye4^H}^F{Px^v|ghr(ST&9qfo=&@q zy$^U<8>k+K7XZ*&0y2~i?>T|e4rqE4+K>d-C!k^twb=+M=D`g|V-qt=6B9E_@VWr- z0#XYL(Ah*5mS#rg7RDBa#?XTfAlVaVKMEYG;4*=b!V=KX7%1o=`&&VCzMuhU_}nmP zIK#|DHz~6OytyJBbaoZ!979khfUob#2aU3Uf)LylNG*aK;Fg{YUbU}~lnN@&K_wx$ z!w*?603CY(FByP_B3fue+sm-DiWJ;>p!xtj$&EZ-0;*F$EpSk7hnfhgPe20`DGJ~s z3%a5JNkqL5jPECL$$PcKSM1&ui&Dt1t8 zgG4~xJ`E59)N}=BDNX1(+lZB!j-ZnvL1#wmyXAwXlRWc4BizNQhUUg5=0?UQ;JIk< z!cY?v(BVHOCKiUqmWGxFX6DedE-cK2niBNGENOH)fzV`DSu z-g@ZL`(RMp+6r1t7VCj(Q;_38V^o>Yb;G!OrXas1LRY2arzsd=1Uh)o7F4z3Y?I@t zrAqQa#~gxYhCmab`jE3hz^kT6$0oMC4;WmbXPH8{M2WH=}ffv4WVQ;e89 zyA(j@aOR|dHr_!O_oSx4yO%+rRthN7f!3~;losWIjtT?KCxF)cgQqH?WhF}G3u={O zE8buuSD=UnrEUe#U=(D!AJlW!^Mvi6DTam~THZwLYk^gH#i_6fMhvCsg=StRV#5}; zsvXp*fgIM3QoTd>8iSK8q+SP=I3ORS7w8ov7A5Aw7NNj~hLE;FLeoN0ett=DNl{_} zbX`BB=*>?mNdz4P1Qi5F8F*7EI0JTs4P?45B_C9rfLB_8RKX(w z)NX|K#=*54IL^U4XQ6du5u#s$d=e|{plR@J2$^~5plRNeR9ndE7D(d+lnP*TV_>&J z)_lQxdC*E7v~CvKBE-^KDb6S@0iE{;O3Tn=wX8r59FXCVr39b?7kms+9%vshcmxbB zjf3jB9N2lu;Pn)+@*k9@;6VZQI%ug2IGG~a@Q_V>kbzaWVo-d7bfc$8$6|11smU37daF8zaW$YUlhs@CY1MXP4wFK&MjkQp*+mgQ3S~DQILQmZc(62gqTt>5(MR zAsetj231Y@X^_J=;XwlSt^%~E0*x}{Cxdz`pec&XlFY;$&{j6YYB1!f7s6(P!wEVM zgHtuAlEYd5fv%YWRWR`ZkR`I3kfBV_s7Y!H=y*C%BNVhIA~i1sRBnN?lmgN*ETC*VWOi+T#SBPUu z^U`ukL910k<4`5w!}xKy25LOGnj>I5xCsuABxnu=wOBw)sz66NfJSEW5@G9OKq)vG zu~!PQ=mfSnBMH2nSwR(lxbO0dz2#F9#mcY_p03EV`I2Hr4W)HME6f{f)?gD|TV$2~NQ0uiA zQp+b*g62okLAw#b?X%P(*vJlATLzY3L3%+e3n247pj||ufeg5JpvyJfGAqD?C-Gns zRwlzmJ@Yb4xUi?j63|d8G1X3fo-R0%fg2X!;u&W{juYNK097sE(aZcih5V8X@Gvx} zh_nV}+~jOf9)O(?&Xt}FIv1q~bOvG(XksN*4>b1{1id;4)W5JM5P1wA(oy5t&Z5Yp5D-V2A6@rY&Y z!Jy@7AQPaAi;5AYePT)(=(tIn*5XkiInln9=C1cf5<8781Lm7pV7 zVMhjl+WoNQcA!-yrJ!T;LHF2!wk)OOq=M>*67Zb{!H)6%e!(G*&fehtfv_A3YNLRX z9C#lvc;+3Hqv6#Ys7nPNYlPK%T;Q4>Um`%ksf(70^a* zi2bmdQ3KqAP*5+0EQ!+1QPSo9O@yo+0{5R1!5t#dp;iTnB^j{12`w5@Q@|@} z!0Q2FWprj9>_8g@4UoT!ic*tHK-PmY59B;}P&_B6=i6(-oeeHbk-92~b5cOj1>1nC z4_Sr{KbuoCaDI zTLfCD3@T@G5NE}K+QJ|?(7AoE9cDI~0XiJq z%+Sop%-9Tk#F?47nS~i>fwiGIXy1#8xv9Asc&ftE!ob4N!pOqd!oOR<5LzJ$LQmKOp`q7+GeEC%hF$Z`zzo*Kz`zZqd7v~OlxBm{&}*_80`@@c z+i(Cv7wm-43VQBfl?nO~y1)QJFYtE)i+{KQQFkE53GgIAE4q4%OHG)1rWMmC4_ER0igp{L1=+B5PHL62z>#nZv#}H!e)s0 zhYv1b_ZX-!_&~%1bRe|DGl={KHHbMM+#vJV>K}+e=nGK(2T=$=VId^`64)U2efSKa4O$@nN%#oiZ-CMc-ynPg zC_jM>Vvm3o#NG`;5Zb^OqOO1yBL4vz4iBK=U;quj02YY)1yK5cE99Q@1V;$%upHtJ z17V1|2T~As7eM_X0HqC}bO4n8097|Z2%=sA>VF1d2tNTzAAr&eVCv36!XtneVqby? zlzs#ePq+Y~6~ZBO!7T`#APY5D5<)NVhv-|t0P%kSl%Bv05ufl6;;(`Zi2eWph`7Nu z2>*aLMBZRCME`@s5V~L=gf{SnsAqts8-57i0qXt(oe*;rPDAJhX!tik!@;hqs8jyNW zISXQg+y%lQHb^}PgV-Q*VB#=+AaP_2QUl||)PndhH-gw8ahRDf8YT{N8^}E%Hb^bV zOnwFiaQ(mm5)^~5L3$V&A#9L37zViwqzuFdnZwKsQ3DbO)hQrxkeLjU5OI(jVCq3? z*x8W8nILSiT~IfG^a?=PAiXg4AiEg&AnHN>)qtu2u|euU_JYi3hPoLn4rPPnU~T}} z1!IHsf$RgxgE7=Spl|@$2NDCZIiYre)H6c;3(^OQQ;-^vIH;n9v0-iixknhP7i12| zZjc&~*)TT999C9{zd&jj{zKRxz3l7|HpnmBTo5)$JuDnRYCwFDnIIa3L2QtEQK-Ej zw}CK79E4%^g4_U#bPyjDZ-P+uAUA;2fiTD%kUWSD!XWh^8YB+03*-i7VI;SSLf9bl zSy&)!kXl%nfZT$dW*CtCB?)x{NIlG6kb7Y91u_%a98kswxd-G1SR8@aAiW?AO4lG7 zqy}Urhz4PhnIJw$4itwV8YB)9gT*7r91sSHgX{%ikUCJ>1o;6Z4#KcJ0#XYT2eDz{ z2{IF8A4o08447X)d}P1C%mJAJ3SW>s$Q%Y$NEm|bhWQs{4oDt^L1u&WfY>0rU~G^Y zkQ_)HCI(`I)F7J=QU?+TiNV4UB*wr7DOW*aFgJtDVSuJdkQxvlq!(mQ2DH2dwIgBT zATvSoAPf=%`3J-X>4nLG#6gWxkT}R3ZD<+*@nQZ2u|euUG)N6B+(3MoUXVN}j6h-_ zHUl*6f$RarF-RO_FHAki9BHUspfCaD0gxJyUUo(XkTM348ev98FdJkJI|DPA4K{}b zq6VZMM6 zRu3|t0jd||SD0NOcY@?V`aqbS72-Bfc!S~*BnFaag!%=d7orAaJ}UzY*nChpu(Pv* z*&uO{9*|xTW?+Q40i=e3Q2?w4Y(4|R98Rd4A?hLKfZQgJGr4KfF&4rC4kBg8!*HK6hb zqz24}nhEDa{R85IFi0;mKM&Xrka`AYh?_xvXJ&w~L3V-UK>iMMn14ZRkZV9@g4_rT6RIRTF$ZQaXmfu>1?s%OENO4ik`>4A684G6UI6 zS!1nWG;-&49&A3y)gHH)Wgyz$UVqv zVDSYuA2|&(LGm5g9B4TM(#yaD@h?c6ffo{AAoD?OA&?tD;SVaeL2QtESY89EVP}TK z3rL)S6XIWxIfBr92XO<$e2^M;21q#!5=RaF9J<%YTwBn~QOKx#qeFfcNKiWgAv!~hC^xHtnlSTBgr$_ggSp0&- znVA{D;vn@P3{nFMA9glKyny%&4E$g>fczWC5Euv&1F2zV1jQZ$sEG+GV!>_(naRk= z2zCQV9RmYD4~Pbt4N5{FHb@O9#lzSjcZ1j0@AG0ow&(GlRn%#AauJxB+ArGb1FvK;oeG1IRp(IH>IbqG4@dxHtnOErIw9yj&b0 z8tQ%|yV$^C0@4rj7f2lgCqFlc2Du+ZgD_YP6C;R$jBs15?Dg}4(rzyC-0mz@oqPC)jGi$mfCYz{QqWG+7kL_J6i%#R>(SlR=H6$1l1IGjOdGB7fN;}Imz%nXS;usfmU5-6+~7#P9n z3Zx!XFM!Mgsb^|0c)O-NR zgY<&(DadS4Sb;|4VB(;*F^CP)3(Jon^`LA45(l$cAms^|&j@ipC|=kZL9IVXdShS% zl_Ct_eg~+I1E~es$G`vyHz*sNPC(%dvJZykL79pHQnoXG>t|)*0=W~! z2Vn*dg#SS58AL_2Kx0xMIgtAqnAt(bBkbp30Y?Z(9)uYfdD&&5?guFZwTWT=1)Imn z!~!a3L25zr3=B+g{ZKxrx&oUIa+fkFBS6gq+s^_jts(vaxgV6iVdjJMBlAJ_f$B$? zJjmamau!5`><8)R1U15;=7aS!Gc$qg0m*~Zf%Jkfh!4V`JcP_=;NX!5nFEpoVRm*< zPZQ!kko^qeJPI)NU~{1f0HhX#LFo--4~PxI47~hoB2f2$)Pwv3lLy(uz{}4ADnmeO z!R9j>8=6DagZUhMAm!lj1La0NZgUn-KW&sU1g5|*;WoO_AiG%D1 z(V#LNH^5faM|ng(v{o2XYSs9}hT%g3JP$&k6}{uzHYrpn3(Q z111kM1Ee1$4|X3T!o7S9Y%Dw+5I#r`EPO!f!S-?Sfzv;T57G~6Yl6%N@j;k@!Hki? z0HPlhQlcWD+zjD^?1tqJkXn%WATgMJQ1~%0G6*s8LDYlvPoCHa_a7)-gUaVsTo8G% zdzd*GKn((rc_8%+1}26^29P=%){jRqpH+^JiwUA1|+K8IK+Ige|ZFCWSAj* zkUXfk0~rA_3lyJV&qM78iG#F*Xqb7R)Q`#si9pN)sbSDzWMC42@Im&$^n=U?^)o@? z3DOVZgZgWrFaz;HdO_+Lm^lSN2^qu(sbOP-m<8g4}08-{NFmv(AG4O!L7eVq2j11B;60%@ENDsKaW@H5O!ERz_ z2N?n8gVi%Iaxk#7f%#zj7&ur!4Q-HK5T707UPjQ!83Z#VLoxtJ9^@YeCMFgZsQDm1 zNIA&=AbC*!F&Djg60m6(SE(&+z(DLre2-gnO8|8CWf_p!5l9(t+4u`&by5Ik>sO`oVlwCME`67BC;| zJ`qtdIWdTRV0mtSW>B1h^n;@c)Zk!%m=Cg#0pxooCa`{x8U_y!7cNg9Fdvj2VCe-U z2R4rZ62KrnL>}Q@uzyTVKme>CP=j2bCcpIY@m45{0zoLFR*7_$=Te8r-J^sbys31h@4;D%shvaQ_OF-nqakA@+mRGcbTG z;{`VYki!Qg2Xe0_0|9CN4H1 zVGtkWUQqmi>Nt>jkopSjV^9&u0O9iq@C)z=fYgJ`0~-$Q*MZ6>anK+o1H}Dc^VtN% z#26v|2lJU37`O#kz`g|80dfn-PLO#Z%y8(@r&rBQ%Rq9V@bG2;_1GYNS5SG+$Z(bU z3iDNXcnLFrW@;h!f#L&{wn1(J=?A$7Bo7J;5Fb)MFoMGiWEVL6L5iX72iYghAk84b zAOUtCC_ET=IG7m)1i*Zd`RuF=prKCicmYT~Xsits4*&oE|38a?fkB^jO zVqo~Q93l^L+hIlq2J@W=J|7b*e+m+R5d#B*9wP%o^-+lWRSXOag$xV~FDjV9{)fB2 z1tJgQKWIedzi2|`e`rSK7oh1+K+~UrroRA9|BD7x^B&Zq@?X@U@)^+7H=ywo(DY}Z z>944Vm^T#^w~P!7^Rf{99ZU=i)!7KX1T(6lhdqPBJhsz|@2IchLCnkoffs3=F|Y?g8;Z=>ewSjDdjxWS`*-MzH-`7#Kj) zQOsMXCz{0?A-WlPa3RVQakAZ>V5EBD~Zz@C{ z#CK#y<=3I{FQf54q49s9@gK3EnpeVx%HNL0ujD|uALO1e1_p+!@d)>wU_jL`$%(3- z8;$=L$-Ev=T4F#|pT@wzumoy8sQiDz$iQ%Z0RuR_fb3s~;v(YnHU(#&O*!w)#nEo7#MzVF@gOD z;)B}$M`|H_nEPKq-4Du77a0-$1Fh%-x#{G5hg44nNCKFGXAB=db47#Qv` zF)(z@fS3=OBizWqz|gT9p*{kQ@5#i#0CNv$1>jmH28N|65dEP3!&XKHhDH~N|3Q2Y zRt5$O3kctUfdMqV&G1+s!Uy$B&oD7CEM5!YTQe{)d}BiB2i4c%Nbv`X{~t(v&#Bt9s7 zTbU5?p#@FPu=E0wmtsbZUnMlYAQB&xJ}cQ67`B;0!pDe#fngal14E}jf)6T>koo+q zi1Y~3Z_k17pFRTvLnb3a9yIWy14_e>A>joYmj#8f(sl?R6hENm94tOT?b}Vv3=Fpq zL*&8jO=boL?Ij3)5hDY`6KMVeh0h11_yEP14I=}?{xU>-f$9TTe1Y6Eg#nSjLHXB` zk%2+F7vf(~-#!#6{z3ghT?Ph*&rtV(!sj;wBK?5)@<{mu#BW9NzYPNe!!;%bhQM%$ zdqDi7ObiTWz7RerzRoc+Fi32L_z#qRq6HWj63ig(0r3~GAi@_kZjj2rz_4WvL_H{f z<}xxc!0J0t-V9w+T!9pxAotlbBhnkl zyn_M^43$v#f#R==36b7F{qFY+3=Fl0A@+gFp98Fj@(iS32r0jU_+^3&44jgX@Bs0r z2_pOl3Qv6&28MG>A^ruK=fr|YU!d}*gn@y<)Dof}#9x5K2Zc8%zOH#g9xBhmwizZ;Fe9*zH)84;c!^-)X=47Z`> zHz@vgB9(`r{I-k<5#FHrokvLZA;|x$m>3vZLLvSG`F}kqL$g8n{tOHZTaoh5CQy5w zk%6J*1EhTj;vWUo=PwZa4M==g{o@b=k%#eDpz#%AA@WHK3=Cz`)>#)V>6@4M64pvXv0^AoEs&+LTc9K>Qd+ z28Mf!5b|AU{M$(C(-{~TQW+T-PVI!K&jPhQK<(qB2>xC)KB)a&2bBkvS0|C`Taf-I zNa{iH@kYI=(RXR5LIzfbyvKFNphK>0!f92)}}Xfx&@^f#Jg=1pgW{ z14G+a2)~knfdRDZ3DjQ%^`$}O8v_Re3mXF~xN8m)1NXtR^YfCJfOgLU%>=qHZva~WWkhNgFAoG}+K%=mbi5UOkBA7Gvb(Wnu&S2y7lm475ZZ@b6i6LNJ-Qtr7of)_ zXl#aoftlU?{(1lZQ1ifI0un-#6jT&JGjL2YfOK+FS$A3G>KLH4pk#6aeQoCZz{Q1^lLHZTZC6c~K}`URp6kU9nf2@xSdMkW>x1+W-M7uatQ zgOkVcj10n{sS{>lVQ}FFvKQnI7zU{Whl`s_f|H1-fgl41 z4@e9YZy_xEK`_7(m-{Kv56I5ECFINIfXL^z}Iz7&sXjIr%|7D9GFbBrHIK|MM8-8R{57 z>v%wFL17No&CJEX%3#0%>d%A3A?hbE%x9aBP=0SHyDufZUnQkid|@pv<5FHh}?bFUU8bcwq#sV}hm+ zP&xqF%UW7kP*6}%T3S$APzYjziVSF7EDtL47#SEL^E;689u!6(%nME-JmB;Q2?hoR zA?TbTH#aB57Dh%+Zf-;!2y&kzqa(D~1StXWAoU|ij)6g)L7izigCYZHzJL?7Ee>2y zLgXN8jzM84z~BIyAOWXwkev(+3;_%bfeZ{G3=Clm3<03=6OcGat+6p^v7?f)va&G* zFhJZ1O7kEWfH6`k1eGZRGcYJH*fN4v;7c-0WDsUZfYt$^xMW~3 zU|?hb%~dHdxUh18>qdk=Q0@YiM$(MdjQ<(y8SNQC>vBN(5|k1ltExaYL0kpW2T210 zoI)IvID$BgIK()FIixrkI6!dLezuiCw`;NPy9vWw=gm=EC>Smlz{;>9*;ae4Vs@2U}9jXGlZB2;tMgM z&QC05W?+!hfXIX9Czhk}^H>o2LGndt{5g!M@(USJ&0CFT-dZ$1s6t$41qnaUcrj=^ z{FD{KJsk`T3^zcXDh37yko!UH!d_XnYSg9|Gbxf%5wk@j*pd$oM&k5897sfyCd#z`%eke}sX70a?BiO&&C! z29s}v_Ft!}K;jQHzXBR#TdD%F51c<37#KDbLgZoL1DkIE#rJcx`Hk1ii1`VSyfvD< zEod#f9mIT)d?qUcL#`i!pT>%q4*}Vy!Gb#8ugQWK?+3}-qRIQC$p<6NAAr<{a3J)9 z>^Eman2*i}^?gC(J+Se95MKgmybx3#g2qH(<9{IjW~A{s(0l=?Qwq}$;)8bS!}y^2 z1JGW@jnMf65MKsqJ^@s|Ftai+q~{>U<9Lzyp!tS=1_p*8JBU1p56UC3@qEzO2WX6W zKXm>A#0RBki79#`0XJyFv28a*J&oXKdK4`uIG-d)DPX+NoW2mt4 zZV(?d-UAyC1MxxgmtMM%@Bo$5r;+9#K>X`y{Euk-Pe^=_-IEv@7{2sD+z;Zj*V z`7aY`ybZ+9L*j$l;h^~jSbT%{Uy#PvK;?ffs0}k0RJud@CH*`M4C-?s!lTc zVL;|Pure_G42S3k$vYyAZ-estVg?3=C;uSv19D##()<7@Jk|;z#%DqNjYxb@9S=H< z#&aygq2$UQY^@eks|;vZBO#emX}7bL%c_@FUQ zSa}3;Pdi8+Px`WEM7SShpA#bk!))mM1W11mD+2>8Kf(C0`3R7E4};bpAjR)7Q2hg) z&jYDXLYiL!@zX%%?`ueSgZMZ385qoTA^r#PU-KjE1NrA5BkK75C8YTlP`^NpiGe`| zG^h*mCv-gnEPO%cE$2g|R}g;%AHsYP|2Q7|LGrF>^BVz3^BW-f-vX%fADn`S@B^h6 z(8eTKegN^)k>)=@{(FX0Ux4_pLH>ZoCn!II%3IDnNO*zxp!FUwKFEGYr1=jJ--87) z{{Z4oK$;%}@n^6h!UHtl8ppuE@F*G*{-F8^)P6w@zW{#3`~^sVDL(_lly8vo2{a$! z%f!F{n@}FfbG|LE1+kKB&J4 z8V?7hC6If;ol8*vnFVyni30;@F>?b010!hD1xO7DGcYvqFXI2i|A_w;e=|Q5Kd9pm z+EoW?)q(nmpnL==;o9FZwr^ql@sx4L7RLQsKz(qKIA~rM)WczC2aVW*M;I9)9V$k4 zP=6cDW`K+*fa*YIhHIRdkO?dbG7l8bptcf-&A@0S$Y?FdC@sh+FUZ&^$ap}Ikx`J5 z0Thp*`Vv%Tf>P&IW=sfL=La$aG|vllAJ{1%M?v~rAXyL#)WL(e59D74h6RiY;1GJq z_>=JuHxAYf3MB9<8wOBQiGhJ(!742d5CIvlfW!f)JIloQ zn1PX@kzp~zZ^qAzj~S0Mwlg+^hDljKYM^0Uz`!8Ez#szF+x&pB;Q^zB1cQJCg9ICc z0LTmAwTB?}V7ozUxfmE&m_U6*(C#qM$O&Tug9C#C$U^WK2B?l?U{GYJG^jODG*GnA zG|)E41Z8ZN1O^8t2j&Kb0}KZk6TxahaRVBQVVDFS9Gb{5fkA*_Lc;_H0R;g80S*Bc z0VYs(0;`3X3z}`=G2<~}Fyb-hHDWMhFlaDf0NXDB9xY%n0QFx$VamzS$%qOY7?B}J z4ivVacnA4!1>*{kZx}!{HVpGWNIfJCGk{j+GBB~Qu(UEOFeoxAGPE*YWk1T^%6=A1 zva+$VFbKfbRpv7=FnA!XqbvfotC9GixiZ)~OHjWVw2Cx-DWo3;;)Ci{P`?_K_P~5b z1_oHa8pH?9RU)eg%}wG`4{C#e%!94V1MxxiG%`OK6xYyodm#Bd21Gv=#0QlnuzoU# z4{|?@4{Gzrv*7NBgXELY`puwrDz1JzNc}t}1_pZ@NO*wwpmru~-5`jc$jrb1>NkVJ z2h^`Z?l*(_si5&l!yy}l`UWNj24wYBObiSvnc&RK08$?UU1tYMXCQtA6QW-T z>L-EbWnujw5dSR$V%-9W4_dbZTh|3jpM}hbeh-M>#>~KwR0^rLLHu@Rgnm#x_?C%* zp>rmr-onOzkF@RzlwS;y>PZmah!IiGg7~0%6xI&{@n`d)wgcwyp|`*?TUv; z{RR*pv@Q*{ZVSYJj3f^#%RucgTYtKLM%T0OA*;@vD*AtswvMA+5s#@deQMB3y`dWT3Lm9ckSLi0^~O_e0`?>VgiW zbzmU=5_SfL1$vP91@W8M5$z;UI~vpvg{?yb@j?AmWIiarCp#nbUu9)r5Hv*aAEWV~ zqVWZo8Q|;WK=xZAts4aKLE|j2b#x&6W0_Ff`Eg8$b}C3d9*GYMzce0%dJsQ@2caIs z&qm{Oqoq$?v~_-8lIs12y(v%I|IW`X!wHat=CMb z>&QU;b{&3D^$M;_8SXMNFvvjr#US;aNc}VrAJhedApSch z#JWNdAG8hwHqHZzKhU~TfUX z3=9lskotKbe&Sh3>k~A$1)A%GxgYF*Hq`LRVM9$nd2EPvSD^3!t&4{F2gGk-W?(S+ z12G@8{~9z$;`Rp;9w75iu_E+?_-|QJ%eVJP>*hfD`y|pjHxT~;XdR|5B)&kSzo7aS zWQk{eh`Q+jFg^0d;_F$7!coI0I}{3#7{+9*9PKeqVcnl_@MIrDAKw%5dRb-1A}@T zq<#YN&miR|5dR7&-y+H1U_f0r2igY!TQ>(9mjSK2#x)KClD~k|uLISGpmAPU_<;DJ zbxE*wiy*!p3!_Fr0uyxmp}I1_oq4Xk8hy`b%i?m(lp3b)m@WK|?0U=7HvZV0_RV5NKWe zy*5Zc7Q_d+519|@$9{s!gVx1?+Ox2AaUedZz4sKlP7cHeg%`5?83x2UI*|NTH2zZt z1_tTf5c@&$pmA$t{h&4*G9R=qAEqAERtDAIqK_f^LHrnI1_n?+9TZ<6K5{?39J|Bz?RxHB`B~lEMk{vVP|MyXPCjx(8A8PsGYGvp5cHzL!&&yB6fxa>I@C)ASqCL3F^ih z39c_nA@Wlt62EPa^eYq*)Ms6OefzdE`Al z{77?JAbDXH1_oSxA(%X}etBj{UkDWTAbI4z5Qwh~YC9tN2ehXQ*?($Cb8sN_8fbHL z+N`Mlb3)>S@}&z014CmqB)mX;Hx34dGg*+n8Hf+s#{=r?f#Mv*2iXDJ!vkVVa4;}{ z!VBhp^zc&QfP@FAbO)(N?i+&m57-zOo<~FadLaH8Hq`Kb1C@vAN0tY*JsY8I1Cafo zw29m{0LgcP_5kQY4&ngSt;l26Ao)2=#J6oh>YpIB%|UtI1hi)Y$DA2R-U2EQazChV zi9DwU;xA%F)NLUCVx&0@5PvNzqV5Fow;;{AfaZTeV;i8h3n)K=_@KUe;uA>Q3&aPN zpUCo{__T!X5dr0SGbRRx3CW1I187eWtnLKKyMp@WNb+u=@P_UQ0gd^A_9eph41oB{ zk=h0zK4_jCS$-RmJSaXw(fWQ<(fHA5`~)=qeKh_9F4VT=Lp1rfNPN(mjWvu63{B86 zau6RhhXLz*fcT)c6>Mw)#6OKRrwnS#gUUZxTM)$efTkxbrr`ABc}G zzZ$Ktx&bLYg4D~iA^Mgeej*zpJ%Ze4gVy(SMeA$YqsjXq@j>IopfPh?ZB39oXwMi( z9^`%yA9+p=)VBhSMcJMPg%$$?h!0xR9&;Mf7Xk5qGBYsb9EIcu5T6Uw7CjE(gYqY6 zjukdX2jX7>%~2usO>ZzUFz6%k?;y#8`aYmF6Kg;dr_lN_g^_{bFf=`Z?i4-E7#NED+xvX$~922hFj-_DF%s1AR6IhNG>Ju?P^~5{>VS z#`ieL?((NMkLa_&Ti;%t^Nc}(P*aRqtfcXERd{Fua@x9RWgT{u4)el-D0GiWF25lr^U|<08 zk;^9#|04qf14tf}{y=WhHZ_#n@@ zgXR#C`|cnf5L?Bi0Cj_(n+K0pkaLgQO1-ACz8UV+)`?H6S;{&V#h2 zLHsJDJv1ObXdVl;rw7CbnUN1w52{;UF)%P7&yj)VM3MP#K>NUv+V<#t(BufRdTe~; zz5z%cnP19`YCkqUx_S^FG#3KGprL#QwgyJ_1B~nk7}y&c*cu$!7C5pkaA0d-U~5qT z9Wm4-z}CRQ*1^Hn$-~yb1fKc<7dW8$4Zc~6j*?pioK*I{5AH+viZ^p*JU;ynyfb0X+>B#b+J{q!rjF}L9 zD3E$*CP*Iz6kedPLXIDhybF?g(0EK5()i=QCppM&H<^IypRHAULD z3sUch)P@J~t(h1YKy40C{s8e|Z59|Gxy=F!@25!Sf%u?xfH41n_@Ma`Wd0j8_0N#_ zAp6#$t=l?*#y^P0Ka9rTjl>64S)lnCgB6fA1Bee=QVCn92I5aZTGs{QgVtRl%TGa) z2elVK#)V(76Y&@oEqsv@ai-UxBpF z5hUM+l>b3|FQoY#5Puh_+D6((4jNB|wb?=PpnX5c=7ZMFA@f1q4;UX5AE0wqEG{F` zAM*SXNd7ER{sr+@fyO*;Led|IkKASim6xE6dhC-S{s-|{nHU(5`Je;K&LGLlFflN^ zK;rWt@j>I)wTui5%RfTe2cR}wFbf02vfGf;IzfEUc=7v6RC&cJ$QU0;enWS#<&JZO#EHAV)86VUN$5dQ{fpEnX86tuAM zY>+%?pEk03P#+yO{tc1`?Ss&6gtT!%d{BNwmjA`bz<_KXs5_3V9#oXT)Pu&G`H}WP zgZS-C3=IDtfo{2gtQ!N(&w|>Rp!NYsUY&`7K?B+b2Juy)d{Fxnw5A+X4l%TFF)6fh zF&Thx3m20?BNvlE0~Zrx0~ZrR0~gZ)odpa>bQUn20b$Jr3@0=eFdWiYz;Hlg0RsaF zgA8flVgjwfftkqyI)3{AGYi8ZW|k+Hm|4DDVrKbsiJ9fiC1#elAo>Kw%r0q+=KX_xT-_quSAmv%~ef7 zl7E3Ff1Htl0a+fj$DG`@E66>d@s&pC+8_`=oQZ*90hAA#HvuiLEx(OO+uvCj7@Cmw z+K>4zXyfhYSQr>!ZDEl6KnMTB+Ug)aXf47H=owHTel8CK z12Vq|jbDPsFGb@w^C0X4&0T=bL_yx809yNl%>N8p`=|mbOF`*l+YbjBTMJO`v7#0SL>YR#mWR8ZZFZ2nWE z@o|v;S7`i?c+3Zd=Voq1Uk1eA$Bo+8c)*RimgEsP149w?J~mKW&60(Ip_363-yr=j zxEUB=<6ofskbsuIGSKo@Hd_7y73Hw>2-06qAb%;K?Kv<&+G7B6kEtL7!&6Dnif%~X zqz^it59=#TLgP<>@Pyh%OOg1X`VzEf3wb<|96qe=1~U)D2d!HNt(yY*i$MXj8=Jv`fx(7@!GeRqhKIp| zhrxyqBm!DG2_92q1RWRP09FVY&*K4SDrV5&-FpUxbOr`x5R-wQfrFnxf*+(8G_qI= zwg3w;fdRBV2`bUR;xGxpS7De0=7aPzG^og{q48DG_#pRy*2O{%1C2y7@PImU3~Znw zZUz>x2rGmHbx0XlLE9A>7(Rf`2x|BQB3;2EDquAtU=lRy2{jS4MgzLW0IUou+`#HN zNrlmL2ADFO1EC;1QwUFS5?C;CE|}7U$SKYQ^AsUGWrz~R31Gp+5FVs`3L2{f?O_J3 zbp}}p8k<61>kN_yZ6AT{2?p`ynGkEYL443fHn6cu5FgZ5hwX_5@deS;KWBujt;S^^ zsPBNR|1;WH=@&HqH#9z|ZvxW~YA*#Kt)&L>1JU@?*bsYiLGtK)&{}NRSSCn*DVq9~ zX#78n3=E~li23;kj0_Cj#*p;^ApM~7AGCHGt0%2#n_#2!TuA2h!MYrlZ_!ORQ{$Y*j|APsS-2iivg+an8_KL+hdoTmzD-+}lb z`Ms);u_@4ga?sjNSa}DM2kl|KstOq!0Lg>K8jgGn1hYI zfcWc?)-Qngp!rW^`D18ffydGKpff&UV`Cuw=aA$x>myKp z0P$h+p!@*h!{kBv0mKKjzd-sy`2oa7m%qTsz(7s=u0q|5%RW$lotpN6`uDi}2P#iN z>n)JW+hd^d0q7YNAbHT(4zm1NG`k5@p=2bDjd^W&&l zzJbQtaFuT$`#@)~!}`OZdKfhJHIp4u9)S3u`&(9mw(fx&5ey6>NMn~Ec_l^$h9m5d z@&LpKoe}<=9df2VsQmlG3faRCieC^Pw%!Po9zlFi`uY#G50rmnSP*Btg7~p43=GKf zX-IouLGn4E{2K&uFNj~k!oaW&iQmJ*z#sxWLlz|8&%(g)cQNE#BanMR{Rh|?vo;J2 zpeteEXMBSApz_ZQdgdpH4_XfaJ5w0M4`gIu@JEt&U__kp3X%t%0kOaha+;PK0|Nu7 zP5ICXa^@9ip9koSg(OEvc@N5OVN47Rpz;?KJ|I5GepvYm;=|-YX= z*!Uet{}KiUhFM7Rpz$(f{h+nY$b8V;7>p0fAHTR!*DL--P}XP|@RLG3$G`2Z@fL445oB`AM`>JJbfx%~p- z!{k9R3gW}$LFo&`hqaGD`4hy)B@a4630WRwKd3(qTDuSGpM%T;@zML|_Zb+#;|DPH zptac{NPAPBgZ3yR@j>f1K;sP{_khfUjW>YY58{KyS73WBK>S-s>-RwWmO*Du!}1G= z59$ga^FbX7WIiZ8g4_=?AKCpN{h)ppvU-phY`g))2Avg$EU(JIzyKS60Lg>e{K)c? z(A*0eV?~yq!2lWWz~vs$IYG$kL3{3z-P49JCMQ$R35H_wr@b`6~tc;ZJ&Vh7l;q4uVDH?e3(2azCe7KJSaba_^|dCC_RJt zxa2|k3t1jyKWJ{ojTLd{35X9ma|E{c6~s43lLs9)g)Fa&Ca;Lb7e?cQ&Im%*&j^(V zmUph6g?h7rKQ3daxt3jQ~~ykpUHZ;JFJB0ZO~jt~eVgyg+LW8Q4HOz}Y~- z1C|DjnSs_+fj1O@4u}UGU`k&^B_AC17z#UmH|5xuMNPfY!Od+BP8h z5YXB}I~I^rz~_yjm&IXFd61()>e1yRnems^QBZl%whoYf#@j+|Nk@=wf0n4i(c~DycnGZVu3U;3WNFLNa2el1Bc@M+~onHlNJA(2i zD5)X06+!Z#+wx%Mf$9m+_#A939mEHf#jv%pAU>#UM^=x{2kp%V$%DcleJmZMA2b#R zG9T1dz$Oo>3qbOq^oJ}D+6M$`w}H$BU2g`GhqA#GDBc(#%S}}wa-dp_fq|hRgaNe4 z2XyM>0e;XZBS^UlsOibT0IK*vT=4mr(8b0KpcK!*z+ek8g@M(9k>LX~0|S_HU=d&d zwTKzO6dP0t18D0L$Q;l@WCloH2E_yDY$4=+lr3663)IdAok0L{3@EQ5pB)I&50XdL z?}(-!wB`c2ALh)6dS(G=O%$?z7qoFOS0wX5{g^w93=HpcA^i{#AGD_!nST#W{yrKX z)DA;d{}!~)8hUmQ$h>!Ge9*iF>?|LUJZKzGC65tQN-}`PQbFgzf#gBK4B~^L3&aPd zZP2*HeLmE2ibs5?SfS432Yn%CJ!4&0o5}gdGv7< z5pMkM72}5ZAC&h&_QCuQxPc05!oYyce~L6N399SOk@nSq_!ek<8#KN< z8sCcv(vAhyr6B#t?J^KQ6m%B_bl(Gk?pm zP%{BEE`!Vm-L-Ru2Z zq#ove5FeDkk?jNJZ)84boFADF3J+wy7E*YF%meLnM3y(i6aFCep!h>}KbVi?e$d@8 z=<>+!2kpZ`whwt97RdZMH22k`@te{3-Dvzi0`8xQlzu?=f%!=82d&9Pc0Wk|3sQV6 zLbDHab|uU|pt|0O337HHD1CwWpf#1Swg-q0T5}2FgUTCF{sfJq!}2po9+duJZ3_?| zbk^BXE=KUF>LC7C&>A!7zBLd(kO?wQ1u9QKeB`zUh!4syApM}$GKi0^A9S}1sI3Aj zt3dL|`axoXoT%lyIF-kxL3go%_KktsCLsG@N4lo1lD+9#` zD7~ZaD+Aqi1xx>+^4JtlOC1gJ6{z_y%sO^r-2lXA0`CVw{gVy;~|7HfC8xL|1 zXk9bxI_4?7DOBtI8v%`=F98f{0ovGcX{p8vsp-Bll;tSWwpyfYyy7tM^8e_e0}@)?kDBS0Mj^;s?Ed1(HYZ zABCWu5f_MNUId!FB$_9n)-i(ggXZxzYCy&= zKzz`;2H3tw5FfO!8rgi%nr&qLp!Ov4ygX=J9X5{+(hus7A@ezzQ0L{b@sZ63t@HQ< zou>!&)j{i6LGx;$_64ZEfX%Cc`a7WV7dEd3>Mw!#uz595`T*$%t#iE+0_ksn_}5q% z7~UiCZ?Z5j@P{JgZ=uQmLYqee)t?4P>YuYPFd&=%4muA9YoG8lGBAMV0YQ7DLGFXO z7sLi(WcNlfFo5sCxLXNX6A$8p){Gt$^miK=BO2p!kNf1;Fd_ zmQD%s(gdB`#Ld6}VS^^-kk~MB1yF|{Dy{(PyujI@nj4~5kp;n4LSlpZhzwBmDxi!H zV}m;NP__~qLhm9Zy^2WUiAds5e}LVr09i2xW?P{8O9SS9Q2GU}iv^8E!p06ke9+h< zG9Pr`BQhT}UWm+hM>-oBq#tB8vOMT+IAlI(tPzYrd2FN@+C_F*wgOu_Bq#tx9B`m*!_@I5y5^<3H z58{KyPhjmg5FfNo+!jfmkCA~PJ`OUz1hOBrZvd3PLGcArFU!cl(2S%Wbfy`yeV{!! z$nu~wdXeozSFa4Z%N2U}0LXmMo?X};JP;pr1{zF1C~qU5l@H>B_R+)Ib09uwA2>1} zw9X!x54zg~nGd?R3m+deua7J*iL}lcWFIIzkmW&pj$rLgkh}(TT@EPxKztoEKFGhw z`aye~LE{miGo(OeA9DK`r2h}vydNn3koAMgV`RQBntg$2{4g{=Xq_3d{v%bX_!z-vZ@>;uj>Z0o4yGl0kf!dKe#Fy)M*zn0^V+ z_$l<97La};==dzCz6J4N{cRW@*58KdH|2x0M`7~l{ck@s^OMo|Ss?ypM)0&8$UgM( zTaY}gy$X`gMmt0HDmw#%AJW+B)}b>3D*q50>i8h&3}s~VpP}gojh7&g7lO`=Mdp7+ zQ~w{0&y8k3=^2{Iqlzd+`L(ik!ylqQkw1GPDk`Jg^EG9Q#*koll>kjU-> z-EV|!K4>2bG9Q%xkolneh0F(~e`NDP`3>28PIAnQH{zR4s z^@ox9p!sB&dQkflG(QQG2l2&N7#Kj~ub}Y>5FdT~RRXjR7ir%gXguBO0(c7&_?$EW z7RVXdpz;!=Ul2__Xx}ojeW1Q7GG7&{A5@-!^cxc3gU;oIwLd}XL3aZpn^%mcKN*dm zg2wMe<9DI)tI+tM`2l46KxYzz+N+@Q5#%1^_C1IXn$JL1Z-8dr1T_8>H2yR+K4?Ay z**wr0$;f=rd@_s=8gJZ;cBjK0CdfV`P<(^dGNJEl0*%lA^MI`51?jhAM!jp%5smMP z#y3D3{{!g<%_ks_Z-V9zkjD!_`)ZKoLHlZu zwDA0i=H9<(?ggC@g={|Pt~6x#|3}l$g=YSDH1qbO@j>%PF!MoWEvOFh0!^YaFff41 zTF@FLC>)UGLG6&$j)=8ppfiz?hRA5eP>)L#e5 zgT^P3Yc7n98K=PpRN@RJEf2^FC!1w8ZEAp$dSV%f3c?tzE zhBAh-hKh!U7W0%cRWi0RPGO(HKBImn=MClu_D>l9vHny1|DWL>GXo=^3+dc;0e0kD5wNvV`yloD8oOHVgKbBz|?NKw=_H>(J*~58q{V4iNo*%m;{UlO)kPD zp=$|YQZO1xnqiWPCpH9Ef=v>n0~EG!MMw;o9k}RFLI6Dgkjw@#tKaYaevf>D@izH- zLH6=8cuo3)#c$wb3UVI~?C=v!Q#+_JjYTn9nKqUgzqiJ-a!+AOax7TTMQfX3(ICAjdLFW47`#m^iB?K4@YB>%Fb~rEwpZNgM#BhMQQ9}dV zvTQVxWoBUDY<$U%X&^)~oUEsdiVC{eLX2PJQL9*Dw7|m(!l+mH|6j$aF`}Ly4b;n_ zfqL}TMtubus7I@!3+f-Dg2ej6sKB|t9Tl)c-O;b?-X~+Jq@bWs?|=sC8&Cm5J?KVW zWL%G4FW0l6fqD)!P%nT6>J`wy0J*~-;f%(92X>SuA>L&8{?-50S@rUQf`NiCP~qxS z-+~HQ>N(Lsy$~9xS3v{y9%!I`0xA%wS40E#PH2Fp?g$8Vni&}y7%E!7YSpTL|Nrj? zb$Fv!ty-m39~v6!f!vL&M|Alnf|*DHpsw8{mHJ64o}dmi41>);>A0zaq_`Luw952A zH~n33XqYAeS}xSkFiiq<^e(i3+yI*LU|?Xl0PVIufYNX5)4<>zl>Y%r|AW#3ps5N5 z1_lu*tpcU3pmd}I1A~d$*K8ip6b1tW!viSI(D2^!*FPt{XZxY@he2alAjg2lsz9_# z;@M9~~#m1rJm}s6kQhh~gh6Z&2C+f%pxgxG zgKWUZ2hDp!Mu#EhgT`4wdO;Xu9%y_Q#74#eL7-K63=E*TH<0*0CI}xi)(qlz8bJ7< zu}cvDiUfoY8mk5IgH0iP(AXr1zv3xq)*pOo9*E2EO%Eau(=YT3A`e>c3Q~a1_mhUG z2aWZDAnIWQI#;w^LO^L@n&=bI z@@a+((PtdM87#mGXn#|b+quQ^@GTR#%4iE(D{Py5P8rYtswaV z7YH9THwog4utE5sv3?ML1v7*Xi?6rd5I$&b6ePb!4Z;VFNrU(&(D=N%5P6vY57AWz5W(c-8Z&5#32TbM zBp_#xfOw$kOArmJra<&49u0v34}m}-NP32qN9YbZ0C%PPnPe^_ew7mpc`v6jpj<*tsA9VGgdsL9c{-X)}M-u>zFrlhPRRNMm)&k)p z42AOH0x&*I0M3UBAovggBtBRGnGX^`;s3{&e@1pXm<^u*hic?Q6W~P?;6W4MMibyd z6W~M>;6M`qtwKQ70$!GYBmh~bfDnK#T!0I}Rx-c@;7c2z0*JK^5CO2K8Q8dZ_yq)o zg+;_<6_k{~b6<>1tZW<{oSfV|JUo1S0-&{y42+D7Ow7zIEG%qb06I64fq{_;F2Kgd z4zBl^m{?d@+1S`Qzy@%G_DwM`Fe1k1SXo&?YZn+m2C}fSa&U5Ta&d8SfzFPCxQCIE ziHR8u51P=NCB3xLj<1v?nzH>k~^J#8R$%*>#00i_rY4t=nB zAYU*uv#_#*!v?hX0HhA&3{a$TbMx?l?xkg5WMpPx0VOt&C=XvaNG}5@{jsuv5-%@5 zzW`|6KPbI`Ok?BV=HcZR6b9Wt1&TM2t!!+d^vBHu+J6KJ8U_Xi7Es~^jhce?Ac5l? z6hT}(y!--!f}r~?7#P9H1)Rb;IXQW@fb3;tVgmUclyN}m8MHqcWG^TwgWSl@&dv!s ziumBeiFX+B5n0cT~4DvS@xY7hg1`{Zyfm1o?Y+#T&P<8+% zW=>uK0R@mcMyL)*a$U&^^oLt+RNJ+`Zw;gN;D06{g43rW$I6&u{ zGcbZ8oDEdm@CgVBi-OM10OmV^E7D(U;3JHrzO3Q-I4q#wpVddcD;sWJoQE^FW5l|zSk(rf^gA42yQ85WA z(3)^?o?&6<$smpwz<320D`(WCb+XLBY&Y167BJ4rbF045B)~V$3XTplr_tD#L_C=7YqTSimU&l)yoC^=gn9$RnUk4)Pv52geq$7+8RX zg^dH0+_(>b#6Z@vfHD@?8~hiL#Mn8xdHMMG_&{d>z|spSjezpRLy$TU2jnm)ehd*q zC}m(^KoVnwRS(Z#>Oj#B$~x>EoS^%a7(j(AxNrv-v|PVI>Oh)6B{3*Pb8>RBfHqRW zY=DLj_!Lo?7$_q%F)@SA>jw!jv9NQ1ifmBRMh>KxiJ29Y0eSiP`2_?71@%EoLrV5F|b=ebv!6_@$hatkvH8z&bJ zXxdK*bbk=s8KA_)%*vJzQU`8Dv4C?csI5{576Zi~G}4%um>WT244~4436v5*$%vy9 zCI(8iP}~C&1IHO$FH;{(3?vRUb^=HY>=>{hIE76GiGj)uP+<&Ct(=_mL1Lf`!py=3 zO4D3i+}x`mV$9G=A6zMK1Brpn20H}gMo!Q^Fi6=BYds4HUIM9OU}RziCtQ9(2{{!V zMo_1ggHK3YPF_vN(A3t!#XB$*B*xCeFD9d)s;g&W<>2D&58AiHz`-jhE(=lT;_Vm8 z44TMc=M@x}Q`6QrwXt__a&ZCe2L)#>kguRcf-guN*nQykBe($*3K9c_0Z1LR0iOgC zV*=IikhT@5wU`AG0~rV^%fYoT3rikM3=(|cz%E1;1H~{?F;om>4Ga?_269q4ST8gK zfo))7ssxKcO#(@=u&_0P#6TJ#ZewL-<>cxGi7|l^A2*+XkdTmwh^XiykQf7~1p;aY zu!CC&YrtYq^FWOoRyOv{P%%)84b&0^6-4`>Vi1*JPct6|iLr3<2?&XZOG?WrC@HI| zz5t1ViZD>(0CyO8dA~x$z`21L)S_nR;P?v?gBS)1Sy0=Ml?iol0_-DBuo&1ru&JP$ zS_mWt4qZ@d0G$6hKzoouMI9)LL8UvWh>{1X16{HNigHjyvaz$Pfy9_u!R3vhFn9^M zj5A1#5tN*vj^p6q@CJ#2DrHbwfHqBn!D3KHL!87I3Kj!3Zb2CaR3>tA#(~5@4uSX> zoFNiHVqmQxjiAV6W=?^Mfq0;<2@5+rdoD-}oX%L;z`Y!99^M*|7|4An1uNJv1ff@w zT2aEFmzQ5qQk0TdlE|P3A(M)Wp`uV$Nvd9YzFtykW==|G3WHv1P8vjEQ9gt&sVqp% z$;``U(90}IOoFh|^NTBUOA?b9^wRSSl5_IFOqft{NfDTzlA2VS9-o+$RFqoApaFDOmQOUy-RDkx0?xe0DadP-7!adJ^+K?z(4 zW=nAf)G>%~fwCI5Ffbh0!oa|=m4U$lgtsv;G;C#HIIxw0fngg1gTo#MhK6kn3M;I6wjxsPf9A#i=ILg3q0Cb_~F$M;QV+;%p#~2t6fG#UO&cNVsoPnX? zI0M50&;jo!7#JK*FfcTnU|=|Kf`NhIBm;xPNd|_7lMD<8KnK2`VqkDM#lX;Tih<$4 zDFz0H(+ms_rx_R;PBSnZIL*MoaE5`w;S2*q!x;vK10ec3BZIS6;2LO>mVv?HIs-$) zbq0n5*BKZXZZI%7++bj6xWT}10CbtdO$G*sn+yyMHyIcXfCd(BF)%pXVqj>v#lUa? zblJjf1_p=Q3=9po85j3=JR*vhM){!vhcv^20+=x?^N;0MQQ_7!EvSU|;|p z?)iv;!Ql}DL&GBmh6A91mNSeD4xq~?A2TpGJZ4~Mc+9|X0Cb4Y69xtc5awWFXn4ZF zZ~$~L&r=2lho=k-4Nn;u4uCGmc*els@C=lm85tU$F)$neVUSs%%QDU~GB`YEU}$*G zz;FOWgZNt*84^GT^uAzVaCpJM(C~tR;Qyk=lH0K(5085rI$ zFgUznU}$*5z;M8qiQxc<4eGGJWngf4%fP^3$;9CBoRMLHB@;u#TTt1@$ehfDQt>$jER2M1KM0K}H4#5dDRL;Q;8e z#;*(v4qq7<8on|xC~RY7H~<)T2dqF%8wLkPMurAPMur2R#Wz3xjfZY6wk)dHHBSQi=6T^W9CI$z8CWZ$)85tCknHdhe zVq|dG#mLYAQVTl7gc($JGBPwUGcp`tW@KPsVPtS%VPt4vVPrVK!pOkD%E-{b%E;gV zqRkl@9+)#SI9M<;EC3AxS~4;uSTZskuw-OVuwrCrumZV{k-@>5kzoPoz!4iph6Ec% zh66T?3<|c43=Ou73=eD>864~w85Y=q4t!^1NU&#QIAG7npy0sB(BQzx@W6qQ!NHM{ zVFBpCcqc}N1Sdv@15S(#3eJoS4bF@V51bhp99$R~7Jv?fcV%QqaAjmT;L6CL;Ks<% z;Ks=Cz>Sf?!JUy|0cb$dgOMS@gOTBY2P1=mCnH0HCnLiHPeuj@FGhw1pabZ=85t71 z85s_EGcqXnFfugwFfu&wVPtUdWn@?YI-tpqks-m4k>P+JBZGoJBSV8fBf|rKMh1rf zMur6ej0_Bcj0_2Zj0^_?85tCU7#SLZ7#SV}F)}y=Gcqg)W@KOpVPr@MVPrTE!pNWy z%E-_V%E<5_l##(9jFDjh=zyniMuvoNMur37j0_49j0_DCj0_JV7#SQQ85tIU4p@m| zWJri&WH=DT$e<9-$j}hY$nYSVk-;H`kzoPofR&dc#zJ>;E=({umCiW zo5{$Kkjcn!Ad`_nA&ZfrA&ZgWK^7x}LpCGBf^5)%T#O6}IgAVkau^vDav2#Kav2#O zNoZBZEUZBg2An zMh1ooMuvn6Mur0wj0_5uj0_Exj0_Jd85ta^7#S9T4w$NDWJsuHWH?aG$e>We$k0&3 z$ncapdiY~kRZy)ut1cN;ejY4gMt_%LxLD1!vZlzh6iGd z3<~0m3<=_l3=6~=86Jo;GAKweG9*YaGAxi_WOyLK$elNcEkv>6!~mNGIVXfrY>9A#u^ zILgSdK%0>vVJRa6!(>K=2ilAb2SDkMM!^p5ehmk>H86!i&G)9I4(-;{PrZX}$OlM?xFrAUXVFn{Z!!kyO1v3~K z7-ljuJXpra@IZ%=!C^Tg!vfGHPAeE05@s?o9GJ<-kg$T0VZkm&h65`Y86F&EWKdYi z$Z!BO`LdglpgTgFEh6fS*-Q)#IZO-=pu_3&m>3S^ zF)=jcGch=TF0C$PVmMI9#L!U0#NbfO#K2I(#BiX5iJ_sCiGkr36NAHTCWeMPObiF^ zGBGgRXJT-8z{Jq-kcr{IBhW$hObiZBnHU)IMWkV0g#G z;P9S_;Q%)?g99%!!vQ{K1_uFV28BJ03=Ml286NCmWN_Ha$gp59BLl-eMuvoaj0^|% zF)}FZXJlyD&&cp#KO=*~0Y-)e2N)R`4l*(%9AsoTaFCHf;SeK(!#75T1K$`K9DXt~ zB-k=BFxW9MB)Bs%9Qet|;P4An&oVJM*fTLauxDam@L*y%@C(%LWMXjm&d9J}IunD# zZ&1C<#Gn8=3!;Q;8uf;mhK2mUfLJOI%@7#S9LFflYpGBX_b$H?IDpON9fTqcHwMrHh67AY39iZY3P3=HBBJ_G2YCk6(F0w})# z%6|amzku=+Bq8cIfDV`enJ)$5XMipdWME+U0OcQm@&%+J@)DqnsTdd-450i1C_ezo zKLOpnL`yi1`LnA?h8V{0=C;0m^>><$r+k1Hg+V7#I>{ zA^J~1`4^yk2hgRRpu6MbA@U!f`~U?Ae*x&CERg>dA$*IO5c?IBAp8wbegTxP0J^w~ zfq~%wls^N?S5StiSC|dap8(xjvjEEf0Od=}fyi%AgQ(vDLId<)Q}rwj}X3!wZJP=10VM1I36 zi2emm5Wd4|2;aaN!ao4zAAs^5)NGOEx4M5|$3=9koB@n&>XiOKRAIhHr zT#(qKGnE>VQ0F42I@)MM=0U84a*F~{xJyO05rx3 zGVe5m{{S?;2(te?gwFvQLj=iRgYYXrV~8OCUx)BDK!;(2%)1HU?|||PpnMC^xFX04 zw;=Kxp!^0X-{1vEl7WHYHdG$UKLF($fW{9&{<{N}hw=sPLih%tu|!aQf%11i`4jFz zoDLj-6sEr`znkyn5$1Y{`Sgzz^&`3zhTz6WS55o8{ee*(%E z;D*YB#sNX)Cl7@G1IqsZ6kv{CYR&KLO<*fbtzwAnG3kK;#`%q5KF4KSCYC4~T;BEkK9+gVJj> zg#QA{Ul0S~XJ|syC&WVdFQEJnP(Elp1Qc8g;-K1%S%yxe$JU6U4j+P(Fh*gm16_BCi0N8vxa}iy?dt&}Fd< z3=9*NLHGu45cLkrA^Zza{)80}{sz$80mwnCA^Zl=WwfC3Vl9MU;0e*cU?YUz0h&ty zrH4%rzJfPIe#2%6U&05%Z`caugXR`M{@DfLTlhibFC2jI4g4Ye2}dCO8KAiako%88 z_zi&&d4&@YzC{p(f8aEPe*-l40E&+@5Pk)C7cm3Ff{PITj4+7$57(f4$U<#~1J@z^ z1khpcAphTl@PEMgw;=otpt%W<{A~z719bR1sC@wCKY;Qt+=0kUn3F17kCfh3xMV_KMwxiPC)792ZZmD2{CU1l)nSYXZQ(`x5$FXJN$w0e?a*Re$c4xoa6tH=`4>=hZh-PV3Lx?mI3e;3pt%@O z_;Nw`JD~gpJP>|C5k$R#0EEAw7|Iuf@FPHTHK6<`1mXXH@)g7&e9*iN$o>W>p8+&? z14-%taQZ%~Es z6F_r4p!iUS@Hy%r@&OtU{t76+Koi3EsE5cufbw5J`3gD^d5uPhyn`Nu@6iO|e=vaX zD?oEYp!hO`@FhT(v4GN_5rn@2%Ku;t;b*i$^j|Q8@OOabjzHmK4&iIGL*ySo`JnkE zP&{Q3qW&BAosXJ_yQ9k`UBh` z{2fsK2M-88VWG6o`5S zKL~#Ul>Y$A=a>qSU*HdsZ-DY2K=~ZgAo2=<5cv&IK0^?M?*Y0z2UK1{`6rIgUD+vfSC6n9>V8X z2;ny*K=>1&`~`^+zQH1hd_ppW{{hOskP6{5fH(OtFfgP;_!FRf2PhvjM+Nf#gbaxM z0?_;vsQiWU1(rd~FUW+*Pk{0dK=}-y`6W{yT4-}pal@R`hjS%?* zP`(CeeHchV6-0gplwVK{;a6;isBfr+@D;!tvKSa9)IsN7xV)93Uw88)icI6AnW3e}M7@4ng<~vmx>; zpnL}?U*RxB{sEMK0?OYo2cq8L2t*!s9@POTpJ5?H{=`v;ya1H10Y06Efgu6Pp8@4> zSOih80p4iG!0-Udp8(}ASOSrcH~}?pDTMz3$}fQOBTho(KdgkvM}RI11+@p(LHHG? zA@Uob`~y(_2Pog*3`E{wJw*KiD8B*9mjGQZ3Mwz4{0=CeVFN@x1L*R4Q27VtXF&N2 zHbUe%Kx^Va{gurS{thUgVGD$BaRFlgg{=_&11NvO4ha9mMToq@P6$5$v~CUL9w`3- zl&`QGB7Xq1o()u9LHQn6Ao>>^fXF*sh4K$V_$Q!zg(DDt0cgD#sQf<;;a6OTsDE%0 z!Z)}9;WwOu@OMD@3a24_i<=O6g>w*o#w`fn0m?rBw;VV3Zs1LXc2NxuEtSlppa4BENwNBA@XY!Y^Qj@Eg8B z_y?eThOZF502@>u%1?mue?a*YxFGTY&`q!pp!^e1z5y>pegkM-0jPX~@)dqU%>Mx8 zuYmFSAnFr-LF5?(A$*J95Pkuae*?;YAPkYe09ua#>VJqr_ziy{>Mua~2LB-Z17Z;Q zA27ZIgs%ZwTL5yOB!s^L$`_D=@Ff^Q8$KBr4#-3J7nmS?1tkdo1v7-7paS7v0Ig96 zpnL;Ih2>%6?KLN_mP=c8M0Lp&><$p+qsP9mQ z$S+8N@Mow%_zkHLet{~4{~;5?*HDM>6S5%u6;S>KC_g|0BLATPBCi16(9XahPz2#G zfbtEBA$$pKi24ms{sbuhLkUFQKnEh9PzK@ufbtD0A^Z)xQ29Ct|AZcd|DX}V@6dUvg4h9guLkonz0m{G70pV8|LgW=XA^Z07A{0mTih8aX&p&z3D1(aU^c>+rzdb|Q2{1ed-zQRoiKOqLfcYyK_K=}%{A@V0;A@U3EK=?c2Ap8k;A^ePZ2!F#p z2wx!q!k=&-!oL9JUw8!J3nW40A3TNd4U!@JfEN(HM+$`h-~)s|Ar-<8_z2-Eq(S%& zpCJ4jQ2queKLdQQ1_Oh_XNdd-D8Jwfgx`<>(SP7OgkO*e;eUYgFF^SZSU|TnGB6}$ zL*x_KAbg7)2w#8$!hZqfJ3#pnp!Kn!_9{0-J|GXGz5vPxt(yf&KY;QL@*(mGJP`E@ zp!^3=z65A}Ehzo-LgZIK`3ZawzD6NLe*iy(zXQtuAOPWK6hY)42toJ)p!K<+@LscndH5GD1QT#?~n|UpD-ON59KS&fbvrz@(ME{{DL$H zpJ5h+e*wzxfbu`2L*ysShR7FWK=`mjem+3?9neF69%Mq~1Li{2XF>QUp!^F^zQa6- zyg@cZeg~940m?T3?Y{)IcXJ@}7ohwLP=3Jzi2eh)5P6A(5WYelgg*nyZ-DY87D41E z!QDBoZi zME*i4R36GdPzK>QEQiQDltcJGpnQP}2)_bySQ5jBY6zbJd|Mp@gF+pI{{hP1FayF@ zSO+n0!7K>>0+eqs7s8*g9x6W{!VlO0;R`H)@Gn654N!i-MyUK^h`hiiD1QlrzX8g> z0Of0dEl*d^iA+ zzX3k<3be-?!vAm(s{aOrf8Yp&f8i#CUvU(|H@FSqYaD~{86H6R1;-(Lhldcp#R&-i zz+(vC;Ut8=;0c6(0?KE23gJ7Pg2*>O`5U183sAnoX^6bTGl=>bP<{fG&u|7JZ}1!< z-vQ-Mfbu!cLgX(%`5jQczzc|ahI0`41Sr1%%HIIxKY;QDUP9C-oQJB1@*hC?7ohxz z3sCu25cLnB{DRjI{)&qbd51R;zQ!d8zX8f$0p%yWhsbZZ43Ss(0O1E*f$$Tc{1Z_A z2Pog;Dn#DkBSifLC_e$p_kbL5#;^g(KLF)_fbuP_L-l`x=-&b5fA|dHuebq`FZcrC zC)|Ya9lk;M8KBE|LGvF_{skz1!gq*#2k7!k(0DVH&j7lN7gYcJfXG)s`4gc04^TeC zPl$X5XwMZ$Ka|gK4`P47FNk~tl>gv2gdYLA{1?>!`vc)$fbu6m`5q4-`aeMV2cY~7 zeI(+YE$0jj51{-8MhJfgXwMg@{m2aAXTT1IV}bBrK=}bse!>%oeG8!c z3sC+8DBt5LMBacEqW=Jt&%g%ZJ3NEPJ3#q6V0?Cnyai~_8K}L-0pWx9pn(cNE(qV_ z1ynzje*nt=0Obd~gvbYQL)5>3@;5;F5w9Tf3Oo?`3s8Ool<)8wA|JpDk^ceZPk{0Z z-azH~pz<(2KZIWax(pgLe@-~09{@UiXTM?{|1z= zpakIu{DSEJ0Og;6@((CO=_&cEd1XT#%;15LJKn=p*0Od2NL-+=u%d$b^ zn1t^~Za^o(80hAvB;MNFoD60hE6M%5Q-31)vwPEP(Pep!^F^{sAce z1C%cTx*Qx7pL!7UCqVfLQ2qlbzX8fOV1?L!!5E^xf*ryaFoEzdK=}bsz6J+Gz5vQ^ zfbthW`8S~a3sAlVCqzAiDa5=9P`-m1gx>+WoE%giK>0VI`~?;ec@G|l{sU0{3@HBr zl>Y+CXRv~(zX7_e9W;Ii%A?a(Gbt$`Qi15P{g=-~r)#h(q`bp!^w7{st)j29$pQ%GZ#9 zsQ&=vH$eFUo)GhHK=}?(zJVk}eF2o;0p%Zn@_#`27odC(DTw+HQ2q=kU%(4u{s$=E z0Lpg&A27WgvjrJ@*hC?7FH1X4OvimC|@8O!Z)yn$QMBQE1>)fP`-iqj4x-*54aE0(6 zK=~)2e1{T<`V2RSd_yUO{{YGtD2MP9+#&J>Q2qlb{{xgC;Q^7KPytbY0m}aX<$HKS z{EQfg`h43noC+UxA^ZuG zAo2;R5dMQH5WYk{D2yWdV%>6{Rg1@1}NX479zi3Aw*uF4#Hy_y!FS^#aQv{1Z_AgB1`yM-xPT!D(KrSm_NVp5(YfOd6 zH{65p4?y_=_aXd*X%P7fQ2q@lzu^%?{={^M{Dj94e!>h0zu^gl{{qT)cmd%{%!0@t zcnRTOfbt)_gYXsRK;%EXhwx9p_#Ytrg1Hd+1s@@NhItVFgkKQ;g82}B!9NIp!U8Ct z$qig>H7tbi9oQiJjzti@0560;VKIbnAPC`SEP?O~gdu#6r4W9D2!y`_%3mM~;U_GE z$TNsR_$Q$J0BH!HVFg4!KnB9^fbth8K==+TA@T}J5Wc`F2>*crgkP{4!VfTn@E<_= zAE5k4k0m>HuUkt*)Am9vY$AH`oi2H}HkZL-_^45Wc{EsC+1dzXQs52!rqg4nX8LL_qio2O<1`NCZ@()1y1*ahLAF?6x zKcIYpd2w$NI!ao7!3p7Lc9pFoD7#I>-AbgJ- z5cLJE5I)CE2!BHxgnt9dKhO^0XWW9w8+1VU51{-7P=3U1h`d54ME(MlKLN^jxC4=Q z=z_>^fbus$`3iR-@(JA#`3X?|gqaZji~A7y33DL)84nfba#LLHHM-{25UGfh!RC9WNmA3vNL86)z$DfSVBh2Pl66 zl%MblBA;*@B5&{-!v6r}zku=&+=0kBSNH;v zkN5%6@9-7EXZQ)>H$eFXP`qe1aB)FTe%ie}M8AK=}ze5cvphhQ2qxfze5-zpI{1+7XV)d#=vj^%AWz{e=vi{dx%2RFEEGj zZ$SA977%`f7)1U9l>YNi07C!l->cZmE6S%~}tZwUW|9EAVD55m7758)pO zgzz^gK==hg5WayTg#Q7`p8@3;1ViLGlpyjKLLvMUP`*JJgm0k?k^c}5;h%u=3nCzV z2Nj6?g(wJLLlwdgh=%YNK=}=^5Wa&NM4llI!ao4zPk{10)FJW$@euhFQ2qoc-$4T^ zp8%2H0Ocn@`3jm4d50vZJd|IM0^uiULF6Am`4^ykflP>ehc-lh1C;**%Ab%0kpA^Z^VgJOlK?M+RjG ze+87kK?TD1h=izLU;yEFL__%|5PkvVa!3XP2MGT~EJXf;Cxq`258+=3h4LX6M>0%^ zf$%3JLF5f$A$)^m2;U(N!hZnePl$)`3sNBR1_==U2Pj`45yGF53YAZW@Ga6H{0UJ0 z1}Hxu1tM>d4v`l~h442(`3;#6{)r5T{DT|_|3W5&{~;H`FUW%MFXTh`4cQRBK_P@+ zkOSc>6hZg`xe&fV350Ku2jMrALijJBe1|d!zaSqXzX8hs0Oc>JfXHtsfXF|ngzz(< zmvDZ7@*hC?3#uXVGm0SUKh#3_6~z#KKqHi20^vI}LHG=%5dH!vzXHm4Xo1K(ltJVT zS|R)kP`*MNgr86jk>3F2zku>DbVB4mfG-GTU|{Hm@F!G4)HC!#_!(6YenTIGuTc%* zPw0p6KS22#CP4TTpqGm-mK=}?!A$)^&h&;nG2!98Ze*wyO0AHZWz_4IBME(Sn->?G0 z59oyGFIWlT-+=N1Rzdg)T@ZPP)e!y*C|_U=gkR7Nkw35&!sqCL@IS1B@Ml2z3F{$z zg6NGQj2a#9U4B_v9@(ZARjedyy2Pl65lwYs~qF!PGR36Ho0OcEO zg~)$^@+Uy~6%!%q1-3!tUqJa2p!|eMQ2Ff;`5RFF0w_OVGDJRM2Sok^l>cBSgzqo~ zD!&WD-vQ+_?1u0Srb6Tup!^w7egKsJ1IjOe@*}1})K7r&cR=|YpnQqx5cvyGegl;M z0m^>>eEue*(&X0OcEOgUAbVV<$r+kUqJZ= z=ON|?9D=AXfbtJO`3InUgToMcfeR4z3!r=lD4*d7M7{vZ&w%nLK=~J-{0&gP#Zid* z3sC+7DE|YL&v6VQuW%7!UjdZw0Oj9+@)MwZkK+*a4N(3LD1QNzuW$k)uW$)s-U2B9 z0hF(B5+cuV86w{S30hB)j%0B?*b6kbUKY;QppnQfK5c?iL`3+Eh z!ZnC`hnrA&C_e$p_qYy`p8(}=fbus$`4TrE@)w}|1}Ognl>Y+C7q|s6Kj0=ry#bWJ z1IiD8@)d4DY(Be*ont+=i$ZxD7G?1eEUp7L+%0B?*zku>TK=}brA?gJlK-BMm@(rMTg=Y}?04To$$}fQOKS22t zp!|sE5cM0N`~y(_1t?$R1w@|VA;i83P`(3{&+rl=UjXH2K=})x{0mV20Vv<%6-505 zD1QNzFYpLrKF4c_d;pYR0Oe1B@*hC?51{;jHxTs(k0JUGK=}z!zQS9G`~)b!1Iph3 z<$r+kFF^Sb?;z?wK=}ute1Rtr^EKW>Yho=zp4?y`0&meqi24F3{{)o30m?V{36cK*7oz?Els^N?e*ook{Da6dyoT6U z0p%+|`46Cc2Pog;KSX^2l)nMWp8(|xFtCEhr8hwN1yKG4DE|hO{{hN(V1%d_cmuJ2 z0hDh5<#RAWk6QKMTP<{iH@4*96zW~Z#0p%Zn@;P`R@(-Z=3@BgVBh-EHRQP1!NVqOE3uK?vgfbs*NdQ2quee*u&) zApwy;0OeOe`46D{8&E#OH;8=>k`VOKT zQ7`ZvV*Ugu-vP@10OdD8`2jKz^#`E*9Z4FF^STiV*c5 zp!^e1e!wq?{SitK`35Ne0+jy&%6CwP$S?Q}QNIDoSNH?rd#FI=q5KC>zQSLKe1R%N zegl-xpa$U^{D;Wzfbu^ud4lVK1L_d@1#A%h1q}#afgQq+(1h?Wa6$MRv>^Nk{1Co{ z4upR}0K&fjIhs6;7 z0Vv;K2ZX;N7$Wbm3&O7mf$%5nf$%LtA^Zgu^M1DmEL|)+`gzu3F;Wt3}C!qWTP`*VLMBd;rM7=~d zg#Q7`zX0Vgcmk2n$brZkJcaN-K=}%2@Ag+d5_0hB)h$`|+pk!L7^$Ol0A6;OV{Ux@qAUtvB(euFQBFR%c@cZh`WGZsPk0#OkD4=A4@8p5Bj z7$VOQ1K}Gif$$4rA^ZzaenJ+6KVdmUenSp~zhVW1e<2sb_gD$xPsoGtZ$SA1`4E1> zDyTe^{{qVY0Oe<_hR6#PLew*?f$$kBAp9F^q5Mh+KVcn&A5ab9d#s1>4?y`hpnQcI zhLKz4n;`NH4G_M?W(c351;Ve`0^uKMh43x5LiiKf zAp8qZ{(*J~f5JA1{DCeAzhXOtKcO4KSJ(mJ3-mzv2cUe1i4eZTE{J@>6bPSTH-x`n zI)uMt4}^bU7KHy}FNFVL9)$m5AB69)7{Zr00O2oy@@GK#4oe~O8xBI`3zk9n6^9`F z4^TeGVF>@hYKXkT5eR?6S_q%xD1`5@0m9cf2H{_T@^?V_51@R7;}Cg=jS%%Sp!^L` zzQ75n{3eL}0w_NK%4awUkv{{EAZ$^$WH@#;y%4^^Wr)1MJ_vsUl%D|QYg~cI zFM#rAK=}dtA?h`*LgY6bfbcIs`3eUi{D^B1`3q3~11NvOVTk;T>k#=5MQH;8<~3y3_!ZwUXuO9)@! z4}?GC6@On>gzyDEK==z}A$*IE z5PpF&gumbug#Q7`xA+X2ZGiEXcfS6$G7#sv4 z?v&_cV335m)4G#^!LE~m!Lbvf26UrSg=PSlgX}Kn{M>@XqEyGcl;HBjg3!#ol7f;V z1_mZp1~yg(XumxGYJLTh`LjA180K~|Ff2eaKZ7Xq%}f{=n4}rlq#5#9nLv;cLNYKE zK<#|$Vu>0)4r?*c0U$LR}v=7XKj&%nmd&;fQg3&Q*fQ1cfcnZK)x zfnjeK1H%C%^MBwoA1U~!K-(h1z>04V%5Gg*a?A^Jff@@@Hq@$Yx;4W?+b5;epya0c!6DBzu{97#LW4 z7#KKuz)l0-IA)LnvF`vhzZI3{m1O3o>gA^9f;?-$z`(@Kz{SmwzzQh<7C_An=s|>I zQV#<|W)A~HP7fj+%b|9lha;N#7T~b6^XFjTieyMrVq#%rWm0EkXJD{ofrg+kB>WB_ z*>|~zf#FsU1H)Y;`(6-dpP?DDg*liOCP3{o=tcO?xtD>#tCxYnw-@2Rh+aq-67U~5 zCkY2YJy?Wk-vOw73y|#F+{?hQtCxXcFOq#Hh_erzv*7ksVA`i30trunK7{{N`WP6r z`xqGX`VjuJ>?6v5hDIncSchR@1Ju3-B>N`zF)+;NV_=w#WZ!ZE_7#^Dfzl&5_8dXU zC5GV;qY{e%Gb@W6D9PJE)5`;>eLs-wlkR6=(C%koFz#mnr+H=u1_u9r28Qr{1_t!_ zi|B#m2Ut2yGd6v&i=4B@WRfxB)C)OAp`pd=s;ai7Bk zg!=*~Ffc?+U|@)zfJiUt6F`bF!xI*4$#8cGI|SQvFmUBDv@t2Muraf;Sb^fth)D)q zW)?v0+kj->p$QBOCnqp4oI$eh1|jj#oQ_$DzhXiZ{ZFq(w$hyNr7hR8{n z{W{q493-zWi7#NR1iKT9o1GwT-UoFvI}_(;M)qG27YmATv@`N^F)-x9UF-yP zF(d*WNI~4aU=kwyH&0?<*fxoQVdo@>8c;hCPkohISelpvs<7A?xY!sTLF%gyP;-AE znae$yfq`!_1B2jXgt-a0>p`%&pkhvnflG?v851j$C&SppJS$(Ff4$YzXQqqQ&Sii&Q4)qxIl#YX~st2_+wyTQexmzVrXGzWs(J*Qw%j% zU@9U!l%_H;s7_^I(3lFb9hBa1rHeE(6PUTm3|z_#UCgXZav*IokaUrOWNy_|28P47qARo`p zz*WF7hgpfq9n_$Ug)~h+K<%4=WZ#l$3=He1F)(aGvTq*&`@n?~+{OS{JD4k*VG*+u z6Au$RlRhguQiC`_77{NU(-HoZpU%LbHJyP$cRIqKmecY36ILE#wR#Pv)fb@lc1&kr zP=NNAW=>~d*gBnoVefQAd3<9!1H+@~3=DhF>XjeesO51gsPafH1hqaEFb0E*Vl6Pq z2PUD_hXo58^AARbZOm#+tZW=itk0R)-Z8N=sj+Aa@^iE^a&s{-gt2UgRvi{hY>d#` zk{K8T*v5|So%%ONzcs7ECGe9!(2vtMu#(u_S_6yJVHqRS9Y#hjkWCL1A?~V}iRdTy&17JhI+KB629mp$ zLfy3mNBsjC`X~kscoZ-&FtHd|>obDJRP=t zEQCL+W-%}{&SGF_L9%Zm)V>b1el>Du8a)0GkPpt9*n9abT0nOievl$rbW-~A}A-Q7`)E#f2`TIZ?YQE0RO$3Fv_yxv2 zjOQ5{FEB=(XXIuO+R4OVpvWY^$H~;p$R@)QCe6jbu!E5$nn?!K=mXt{p#ri0!E8kM zf0)g{@Ow4`!+#|E`Q|{v!6ye|?*%9gOaHm0c@P%}C-}xQCMd>pGYIuEG6cyo@i6Hz z@v{gsae+#WAQmMievs84p!P=0LGt$;28QZ63=H*i5aGWBYVV3%h`o2v>@6yZFV0L) zOfJdH&jZEz0mhR3jEn~ucQ7%CY-DE8;uGUw5oa=w67}R`VrJoF!z(_&?1UDSOTG8;gg)6pPZPJ!@vL&$jML6_74upC`wICL5Qa0qlz=J6s%^- zXDrBO5YuK#XPn2#WW%V>u#b_CNrZ#*nt_ZWCzBGB!a@TfCP7f~!p5f{$Ry3gBgM+X z$s}}1UxHC(vw<|b2m`}?Miwh31!f604Mrsf25lx8CU53>j4U?H`VbEXXh8h?VlD#% z2Q(f2n9IQMdoBaRzqyF`;F>fi%k=*h7%31qS>Gsz2Z zN^-LDDoXlr3(K)9a)FvA`mnOM14I9a%unwXdxnb<|R zelT(}@iPgqaC~LtXXj&NQs)83wAtWv!!7t9l#39DU%f-!fmRW&Ak%@CB zBg-yEP=}tIiE9%x8xtEl+jh|S$6O{Bb_NDPCQc?%W_dOtRsjxvb}kMUMo>^QF?w;Z zuq!bNF|jik=t08m!a_v2y<5n@z`BTmfpZZey{jyO1T-w%c0lVtShyso=R0SlCTE8i zWtOBmB^DKBrh=v{SQ296853mU857Lo851}mm_gw*BZH1GlN_564<{236Bi>V4;K>` zn;r+3Iv1!ikYeg%WKxD$s1I>p!6HPx(7A|#Va_53h6PCO+YEJI2{a$xKpTICxz9H> zH#ffw6z(hm{{D;srv8ipoDj^QFprU;K$wY-O`J`LiJwIsR7HWDqsk=CWDj-E0;qd9 z7Bet_Tn1_%8Z2gDa9Pa2;IkN!&TVdUcA;^krm zhodHwG?N2U5Cg+JMkY2!BT#@g7=T>Oz;I$QqMc*6gn=Pz2?N8tB?$LxEM;IYTgt$Y z1FgSKltA)F#ajrC9`7NQ1*s`cIr+$$A|o}iz$vq&*e$=vF(su4;WLkCGbng5iZf|(ig5{W z@^gs@vxum3GI0rkX;v;*CK*OiCN4&9CJsg>CRRoPVHS~ICWb?d!Yra}A{>05SlF33 z+1TH*$T0Cu;Sih5!NkSa#lhdn!NekTo{{AOBMT!llQ0u+3kOp_htN?*mSZrHJ`UF3 z?7U1YOwvq}mzY_YBsMaOu3_a`&dU9Vg_Vi` zxL7#VSy-7}d1San`M7ww1-L*yVPO$I!pOwR2)QS+!59+XJC-8i`_57ZhNnvz7``n< z#JB!31_sk*3=A^Re7yil&)JVXzCrPdh@!-llq68C+rapUv7V7Z!HkJRlt)CGiJ4JF zm_;O<;RKTy6FUKqSQweuBu_K3oMU2R(uV{I zFQ|LT#lSF&k;RvR!HkK6iHBL5jhR)2gM~eufq|jG1mdp=%Mkury^Mk3)-nc$7t0X- za$C;85WJj$A*2lAk0pf=Is>yk1}?usi!<}mL5UeuXFp(E&3K=Y@d0BTn2ZOLGa*8P zU=Amkl)lf%#h|d5QJ7g|4~Y1|$S{dnjfs~Fl$JO-nAwC`SY?={d6{_F*q1UhuVUt4 zV`gGzVr3HGmSi_!WOCtB`V7R!Pf#KG2MEFRr zU|`T&!N8DF0|}RkdI)_3t>2xSn4OxOkqBy2i#IU-W2|RvV7$gu&&8l}k5QaOVhS@u zof;Dhn*f^-n-LcekDe&Agg6sVHzP|ABZmk(sFvpv;g%AW=dk5u5@+V(m6KqymSJrfs$$}w(n7Ku;H3{6btOoEI|b_z^vj7%&N9O4{OEZkhmd=j}#6ByZYj5}34^)-o|Q zFf!}2DKdpKDKSYfNibzHgGf6@Jtl7^aVCAHY$j{*3@KUJP?o)npql*(GZPD=6q7IG zb0(&CCPpnL3&!<~EF4TMtgz#<6C5Gw?!ziXI{3GWfq`o^0|Vb`M7q;i4M}$uRgie! z0i|K_4@z^OA|;_No-tuIV>}mw%5ElxZ_J7sVjR3oTukyzoNQuDT&&`ZOpKbGGEBDG zTnr5EEDlWkjFBwHO#Gny0kUC%6U03Ys}cEn%4!CN*{c~C<|DahBh)=xpyL82X#FLS zdmz(CpefLV!gy{5m3~HsGb~Cxd`u#|tb9UD3QSy}IiWxnRY(^dWIcm{GsJ#|H3<7f z)-W(guVG-2UxNq_!!=;#47ltsN=+`qV*eu+B@R9&9!^#+DUki3VLDX%4?ykjScB-# zoLa-caBB?%!<#jTeCe~6fgy7(1B1s@NPJv@(hJb@WlnxEv|xipm4;S&DP+x!re1L> zQbPnLtOr>SBEEsKfptA2;|500^^9B$DsfDFj4ez|e2h;()o%+U!xt7sCO!^cCIK-{ zE+!@RxlDY27+IMlnfTavIXKyvnH*U~8QEFInVjU9WY`Zg@vUHj$ciz6WL;QA8JQR* zB_!FHSlDkevEE_gW)f#-<>9IoVUptpuR1bk@?=V8;%CxhGG?@A$!FqcvS&76Q{;C9 z_5Q+{L>d1wvWPO@Wn|-FZDEAO#|Ae@{2f?}C`T`^Wnj3qmVx2!T15Q4Tnka(0c{6h zD@Q?b2rfqh4Ez}xR7@E<*dXIt{Gf7FjfJ0qf#CzxK8tmTdfICp14H9F28OP6i1_MW z&%khEJp+TyTu6LvSPP*Y(Bms3F%M)fsBpZ%w3+EV6XOM@EHL?y8BG0P1yiR1Lg8WPtY<%JzvMj=4%0fIWEN59cwlnffU}t5Mf|fv_ zE|jXE3L|ejBhw;AE+$SU1@xkmQ3Or5=SK+PSb z!jt1E6QuCuW#eHI1<&g9va@l>u!=K@GqSVFGx9R3-C_b2pe7gvs0lOwbFh>+lQfg~ zEhg)SOuWo;OfrnD-T_P+l7dXEY#Pi$j7-9UjI6xUOl*v7EUe6IY#O#qLQG8RhZsfn zGCDAcNOCbSl(SSa*)iEL=`$L$Y-VCAVsc~>XHsPH1{a+vkfM`GpUIQShe?Vlp2<+v zosFG!1tVKDsL^qX5!@#G%EZRPYRDGAdWDItiHWs@&6*W_a^43&NIEmvfG9WZHZU-F zZ(v{u*?@@m$r~6LmTX{Pu&9Q__YP?LA~I*N=;pklTNT+F(% zq%wIi34-dAT}+@TVQyt)U^ox}@yCk|i2U+%0|UdK4GawbH$d_TXkKp)`nY#$T25+m zi5{pf&q)O}n`9YOWEmE5u`;o;ae{_1AbKA_%@5d!Fh6S}14H>n28Qa5i2S&IBSd{l z5hPqJp#3pe_`q8eDXGxb1e16|BPgs+GlI(Y_e>1WxD=UKnV6aQ*f^LtImDQlnK(E& zStPh5B|%lN3^OY$8xsq-N2CZ!P3*#;Xx_lc0;--p7{!^?LHvLqNO=5!x+mRLnUP}? z0|WOa1_r)O5I2It12!K5qham@O^WD&Ce;%eG!hvkxLLTFc(_EEm>HSaK_he=j3CXR zdyJv>WNbo|^Ua$W7`iqwF!XLhgv&IjoiCCh;eu{oaB7KjKxjZwep+TuYEWVcsOK*n z;Ofu8pq0Q-qQs=j#045I@nYf!O)4@lCibLxR3qy?>3p<-62Pg>GnY5TVnfO^bczBqk z*qE8Dn1q>9m^ftF%{ZC(@W>gczZ44b*N)AI{CIgY1HdH*+Ozn(J8BE|+ObiSH;Sl#lY(a#3#TEvJrY#H%ZCeoGz5?pL893Va8d_-X^UKe3 z2aP|oIJ^W+!>KW7O<`h~#>B@3ah@EDGE)$f1Ush?6B92l6PqA66B|1yDF`rqV`SoE zFo=M->&F&EI@H+8z+kzRfx&Gnq8w}7%D^yjD+7Z=DI^_oK>L{ zBBEE2R+^U_;0&tW9xxqczR$$?faxRCeI_mjt)(o2f2hKL7)ZIE_SuwFQiL&vs$*?FhN-+5`>Tn1%YB6~;DsZa@(u=uX*&?^UJ7-01lqVhEZ?Pq92#6wl$ngMlbR9mF;^hzSe~1yFk;b|U!5Z@;II$0 zuDlrRO;Eqi!PK6E!61O4k5QII2jn9)CS{QS7#I#f?K`m((eAjllY!y&P6meeNcM&8 zg1Atk9Fh(?Dj+m0Tnmaa^GXu)DnZ%%1Je%1_e_i*m=+4YXX0WoXclIe!)VUr%Hb0r z9=?S!WC3F^pNp)spny34WJV7?cR?L#?OsL|31txrY4a(JK5E{=4s!N07;U7j1r(&@ z8yHO_jRhoR#Ah)EsQQa(NT@Gj6p;`XG?3O8l#!9v;ql>SWl?5k1$A~(m=u^~nB*Ak z8TT==nX{TR9pz$^W}VHvO2IgohV0rd~4-Ew*t1H;u_3=B7SA;MQ|H^jfN z`dkG%o&)!9VqRu)c@cPWUFiY)L(co`Tnq-iTnueYmP|HGicErRN=#WyvK$iNL6KB8 z(3l4&n=P9Jivy!D(_BVoc2;(#Xx1QZcBU|9e&$GF5l}++XR>87W}MH+vXc=s3uewF z&pCw|f85s8NW?(qA8&S?M?_prz-^0Kl0-cAgXoAF(1=@Ur zb7D>oXl4fH9}TTy&`g$VML}X-N@|g&9;kr^%E=4Z-Z9T-V_d-I1|}=#vvD&R9cC2P z7J0=atSb`EaEZx?Lxr7#%bZPbF(U^P7n9^7Mh*@=CSJBiP}e|!iG#_W+kGJ;2NN?B zFAE1V?<7W6Ru53~x{;BogOTYZGbmyXGcp-7K4M}rVhjQYyh91ZzX^K~?Ucej3=B1U z7#QmJAmXWe4_GL4sO5V}eyY2ZK=!X!#fiE0Y9^8815nLkx6{ zH^`&|P|tPd548)F&vDf!X*v0cC1xgRMftgqNew1m1`}R}EMAb| zpz&C!`4)Q-?TCoI3=C;|85pwmBK+057os5pT3?7jX;^%L77e)P=cnhSx>jVCxRvI? zRyv3`Fq(h{WmhoPb1|6xV`OksWa8oD6yjmw5>^J!ehahcF)8!1f>zBsFgY^0F|jgh zfRY&4!V9I4aKC}%zR!CZ7})kPFmUZdxX*MSSUJNB9PRCNu-oF(a!QLc;`8$$3zH2j z^cf9&^cf8T^%)JU^|=|$wlXo4C^B)f2r%)maWN}1GBI-Sa6#F8T-;C=I}ZmFmo66r zLjcolXtgU)4smD0K14Y7?PFk=xsQQi4w5_95O8N|1$c3mu!Ffhql2P7JA+v6h2a3BEE6XqD+>n`7ifJUsOJUV=<@(-U&ek!ecidAfnmyi28QWK z_N|24cK}Cy0J0R4UYv^(i!+cCjIe{eJ)?sa$m=Bx9~fnsc(}OO`I-2cq*%e8&tzg@ zWM@dIfQ0vt{fK(W_y7Zg!vO|{>H~=K$MzrtgX=*C2K4&Zgcq_e43>VO`+yM598eQ6 zG%qnHGd(Xg1+*F%rm`r%Bq!b&G`=Jr@PgT&F`${rpPRuVNSj5ESr>xY7&Vz#80Dc@ zSer#BSzAz#nQ4wE*AP6H!o;S)cbEEB6F3llRV1hYl(GO?KP znQ}$4#4$6m81U(H#j~U^GqGs#X>z5qWHB?bsIVxru&@-eL~zM*hI2A;adB~Qaj}VU zGl3vexF8d=4KEW*5MLk*6E72sAD=I1dmD=vizk?NV{v7%U}hC$VrOD!;%^2OhDN+h zEHQl1VCe{!a28o6X$~D$CSfL)B)&uzVGa&vWfm1CWez1aCT=DXCYCI|Ocrh~c0*8U z`I?nQ5<~}qH_?HOU}9!s<`op+wVP+TN6XfDxVP_ZN6XxP!;bs?O5#^9z5l@x^ zFM?!ZmKRjwQxsL-%gHZCqzMhJB(NlInc~zEY?2T&GxL&*@^DKh7o{ear24~c zWfK3uc#H|W9%ln9XhDuml0JvQIYxa}gE`Fl`k*B&%m$SV%a}D;Ok7zHGjSYYV)Ns4 z6%A9c0!%#yn_NmOw)0mxw)Mdeq-{(v$qD&S{(M*a=QA`euWh|>0nN&c7 z@Uh^D8a75wHc?gu4jFb{E?G`<9$qF^Mt*J~9#QU{j9hCO+4R}9*$vqYS=oh{1uMbP z#xS8C5^p;WBkEI*BMc0ZM;I8ik09dh>JbKpw?`Nl3ZU_}V=^SZ?i_;9uy_N_1A-U! z!2~jka}x`)Q<2s!fI{9UKQYBEF}WlkY1ThCu>!Kn0o-^J-@y2d1>BwKU<37MY?iX< zYZx>#GYK-vF>y1_U}pHmti~k9#m&L;fRF1w9~+ke6FVat2y>V*aWJxhFdr`)ADc3p z8jmoW01x{uF8`ZcYyy%Zd~EDY%uHfTEXSGQo01MOGc$29u`qIgdc;g@EaIG?IX@;= zC3a;-R(^3NNmelqJ|=l)b{5$KTMvvUZt%W;UXL$9M}FldFuPsC9~{LDSdz_9fw1H-YSi1@KP#=zixjDg_+bUa1| zI?kYT9X);u5|fiti;InrvlAp=6es4U24_~Kx)&j5w$!r3p~Wm!%VD4m{^yv@F=pX$Z2zMva&KWvkEJ*iGbFsf;T9AVq{_mHJW!b zGO;rXvT!r|uyL@aaIms#aB+hAaGWiS3=`TNz!_k}F+{i?ImWlg#Wt7C|84LQ!h z5PzJ3;RAG@%mzyL;0jl7(0IWF#_7!cjEoZ)ZNa2=KO;AT&2&&8W$UvVXzH^Xq%llm zS7VZ5<7HB2Qe+Zg;ylE`xu1iLgZnBAI}_VA7EtJb>mX?8a4@l~W#?GO&dS8h$i-&D z&n_g&#JQcFbq6~rbYxhWK0`x>xrr4NGV-S2aN(5!RR<|7j~JOQgJ(3?F*0#73bODr zJF#)FW^=Hzt8%e0u`)7qCWC{6;Xo%OTuvNEl;a{N7#LJfFfcftK!l6zNd^YTlMD^)?5`9S%-#Kn60gvI(%MzUN^5#K957%f`ke zz{JcVk*dPT!OJSev5^g0o^N5}Fyv-p{l><=k&Um1Eu@=`iAg$9aS}UwKRX+nIB52o ziJ6g`kJXKJ5gR{~$YM55E@2@NE&&ch&`>N37q1W#6C*2=5Hk~t6gPye&dkLkDyYE3 z!ooA3Q+ygH>pV8D1H%tSCT=D^W*s&T)`g55tnB4nyr80xQ-Y73 zmro#s-%f~K&{jlQ_$8AVE0d5otB4S@4u3nS?*d8z1{0w1e-hEIynB*?;p<5T2BuSp z_+NI4f#Jw028J8Z_-B|7iT4FtAT(0^XO^TEL3@qj2N(}Qmfg;01`h}yW&w=|+e~EE z*D&DG*D<)p%Fx5D#sb;K3R;TG2?|(acoTNQ@FTTM znzKkSSuu4nGKn*3fTG|c6O$sNJc|Z151S6_9Y&^AjEomx0X!8Fz8a?y{gcYm3=9)a zGcc?^jR@ZbXBZd`o?&3v(Fh686Achr+e}Q+`fL5;zm(CKe+tMukb| z!R0~yVEF}1n^?h_>@GW)at3F$!;Jd82JblZISl49>a!S#>2n)I>2n)QU}Wgv(P!e} z5@zG%Vqs@tVqpTE+`!4g>c9(Hq{Pb2B*4VW#Ce{F_X3YR6W2E;_ODEALOe_?EPQMt zOd(7{a-uRqOw262JW5PDOsp)@ObSwhOtMUTEJC35*X#na5{yd1T1twbB_}MFtW1nj z>RjT2psD~Y;>OCvsLslzEiISK#33)k$|1oB$bK zXJD8ENgp0(5#?{|Sq6qFXBikapGBk({&NfrGUpf=JfQUvY~1+FHT3k6oeC*P9gB(* zky>Fz`K5U&r3J;ARY)s~z=EI(tbuV06R39I3>q!4DPRd?j?m{YVAE$Y2w^c|W@X`L zX4U62kYwRw=3-dDr_ChD!NqI`I34E-beEeN}tlv5LesJ<~vkI_J=3{4O{|6f0 z|G>zU&(zJxBnld@E?^2|j9_7AVP#}uW#M9B=4F**lVRm$^5){>6E5jW=H7@ob??5gNP9|AK7A7thP9`=`Lxw{Tywnray<%gLVi9B$ zVv=TIW#VL$;Ns#GXI5imXA)&sW7H9r0F5wUjo+ndcGy+xnVM4;%4SzU{GUWVPa=wXBJ@LVdP{K;$UajVqpPEFfc4w2yw5*1%!Kp zFEB8qTwq{WbphdC=1U9=@|PGGa-jV~fz^=sVc|y|FMzd95v>SFiRX&cYL)-Myq4)b zGvf#5%fj!OxfpDs^;rzML8aMR5TULwWFVk#V6cZtpWEO$v%bB-az=d-gU`(RJ_a8_ zZ8lAPDFan~Q173`z($|NKv-YVz=2_vfH{*&w*bo}eo*PcX2Wuom-!kmixX!#&wO51 zCe~}bY#mIXvXGsLkAt0&b2$@lqX5e;&}PGT{7h`DEJ7TdOkyltYyzAzoT~h+e;HZW zSXK+LoZx3kQ(h||v`>JQjr*{G!4Uy|@S!zaOiV079K1}-j5hs@oHG~&Z8(`&nYj4$ znfRDQIe3|*I6&nK>v2KuIf63btQ9FN1+1*>F)SIZth@>wEGq@=7YMTIa4~W5=`!&# zfmW5taGD={hr0Et4jw#}o~&XgC?!m{~ZO*?C!bSh(07xOkaZn0R>?Fbc46val)( zu`=-r3y3i@>54ZqN^weVV3c8I;*fpLtiZ}-rMR3?g_%iE^)s^u3zLWDTP7VACJsgk zZ9xMTCNV=*6Bc7WGZs@D3l?)>D^P$+*s`*4FdIWk6$XY2Yar?O!6iib{P_|C!@o-m z42+i%<9yirun)A(G=U|aoxvuZp+#5;ywegi*CfWo#39Je z1e%z!Vo?K83=V4{_9t9MZ3=B1w85ru3?C*!#58FQt+pmLUKT^9)I3UEIgTW@B zVV$rFlLQlJ*C9WX2x!1jgGn8HPR0hPy*Dl++AVJ{GcbI)%)sy+$zH}Q5PxSt=NaJR z?g)Q_?1i*fn1mG+@H4YBe1O{La0O9*hg@M`2*1L>5CydZ z)TF|-t|m9J0Avq%;DL#c!G@3Fm@q37Cj-MeNchb_GIzxl28PvF7#P+OXD)2Hj*TqC zC1EZ;PSBJEg96lChO3BlA$^sB!Qd(bL)cYBxwi8v1H+N43=9*{<|XE!jeo(@hhcnL zVsQ!hcm;8X9?%j6LwiPttssW9Jr{#hvMGldmnn;xxGAfd2rG*|s{t!p3!^EE87nJ0 z8>cCY0T-J;gOnPVC>t*a4+{%3lNzTvhZPeOhc$~68xso~uP3V)KMU(OMrgpM5Dm69>B{%PuB1CYF9CR!I&iCRS!>W)CLy(lq2n9K;WiNzTxRx+4!b}MjBt~L zhFd3UxP>s(poH5@Mvgg*OiUbe8CjMvg2Qe#BkLMQ5f;`du+Wak`kBNi5n-LO#YZ(y%s00bX7AB_ESOQQ48i1Xs0T=?wXA3q$!mr{wBHc~C&cLwZ zIs?PG>xl5PxWT~Sd;>Gx>EH@KNV)?JxHE}6^n-#8Gu`nLN_Y1dQ3CKcBga2RW+txx zj4W-SRK&*H%f#Bp#LvQN1WkSV7>VyOBg+#;)+fB|4|$n5*xy2f&l?eX(B$_QHTm(f zurL#m{1_58L&9&z4Mh68e1n1E#SI1qzMF{ftGLO)(0mg!{rSAaoBp8THw6@anCTA| zemK+L0Vb62yUWD!0JH)BArs3BNcg>HV*S7*!osQ#4L>7L_@N}fqf9Kvm{^;5+5ht} zaj>6ff+RmNMEF5dUps2*gM}ad)W^VJuoV)1KW-wzPvjN@ga0iChMBhz;a7E=fuZ*{ z1A_r{pA8Rm|ML`P)b<=&xmR2Q+9fEyfblOQ_$&ueF!_oZOj&|SYcMGdCX>JH06MoqCTb^W+q^5 z9A;h&i_irpNi3|}xY;*zvvIJ` zW&uYO>mx?cNFZpi3Or7_o`q!-3)tG7EF61SK-OA-tUb)aafF4RjkT2tnh-jec%)h7 zBvql~qn5lknK^DT^DD6NNOQ9MX6E?EtimMzpP8e9g})G*gU&LtOlD$y3Cf#{X)NsQ zTnr4gOe~CoEF8=!Y#glC94zcYTpXPGJRD4{ylspEEc~oO?1H=^EKJ;@Iub16f>Iok znKB&G{BqzDU)D#7L(xQqL)lu51A3@D0|P_DPDpyuxPw@);Btq7q5cj7!^t~{^s?$M z1H<0C3=9jP>kMJ(

Lo^kM`q@8RjCl?j{_WWnSoNP2MubDY7XGMLN)lMqFi>BXD4 z^dbYTJwi-5%v_-9C5qt(3rc$V$-?pn5^>F}9BrTpKS+A%W##B&6=zfB;GfOPGLIFU zUY4?QtYC$wm+h>)`&hB0m*=c3FIZV0aI)X!WaD7}$O=g>J5a~fTiIAT*ud$fpN(S@ z8$7+tWaF5{CeFrsn;Dv3?lFVXiy|VutY_uez$&i5#-q&1a*>te3abi}_*GVpYpmjh zs*w8XEF;TeaC%wB#8`%zUc8A-FXGVj5~9SR=mJeIQIOh=fk9v&B)vr3L)33Y_ZS$O z?=diJzlTUKA@>;=((f}c7(n-%tn6%jtRZaHtn6%NtjcUnjHX;>Ost%29IV=GUl|$Bv8gd} z^6|2nvcbok**O2QiTz+>`p(AD#?HdT#m3Rg&U%3zG{($-ot@(d6Z0h&4rOL0)>9np zlR5a_v4^~6XJV2FR(!_6{+NS}O$0RZ$;8aa!N+RB(!#;dB+|;k%f&CG4LTu#g;i9R ziDf4{*A{lB1`f_n4vu&1+HcvpeAOAbIBglZm}Ht5r6)2<^MZ$s6PTv5FxfCJXJoNr zR$y}gUMF%DLCB_0k&W=;X<5V5royP%nfvTzfl7%LO2IFpDVvo`-% z@CcQ_AxM0@xQ~brrUwiR!Vef2+#ev~fgx^85ov4WMH`c5D_1pj~Eyh zJz`*psDy-n29#F$3gIKSpAq>3TAY4hJOeqKVj~-9{@dv(D1&gCa+obQzCWdvKnxH(wVTZ^gEFw(2_c_IGakBEU zJm=(i#VNwX#gfLv$|m)llj9dBhXW{fgq%5cvO`C9_pozlb1<>KU}ay)%Gbgg(#*=l zBpt2T!p7dnhB6Q1z&eYSpGjmkD<>DLkRlTc6AueNyE?A|6U$;Qsd-$i(^$FYvvRbs z>NK-*g~I1rx)`Nr!!k`K(>q3{jZBOm8Cgu2k2113uqtynaB?v)JcVQ(P~Kn6$icy` z3z}oEg^ z!AwZ}oPn;h)j%7UOiwMzEJ;j441a-mputMeg3AR=$06&fUowG5^u@ts7MSd21`Y4K zyyRf8GiQ?I;uYm&(a>Y%0L`li7&DnMaWnI$i# zF{?8&8CfxLFtIR7GqHdcH8OE9$*{=sN;AnZ^2RdpF)_)oC^DU3lH$`A0d)w!GqOlA zB{0utWXorgW^`ed=2B%+Vp3tMXA)(SVp0**1dVLQG8r=71}|=6U|?8q9uiIgPZ0h8 zswWH#-A@=8<~%`!lg?8HhNPzq3>%>Hk7uCkF=f#9r6;DOfI zsWJ&ONwcwvX>jT=@|rRQ@bR!Pal|sEaNlPXWKnv;Xu!n6#K$DTs*%kU#Lc#ciJ6m; zS5uskmz&2PlR*! zGjcJw7^;e^?PO$F#-zc-IS+D>!eSOqCVn0fCOt+bUP&f7F-|5vN$^CQ4pT5w0;2?I zVBe5Qj&U()>m=yFGl%OC_hvjpjDyubV_@if#=y|~3^5Kj?-|5DGSG2kg{hGI1S{_f zKe+*5*Me+sgDJV9fF4tDm84lMTU z3@)(@PneWgSeaN@WSMv%qk_&X!r)Os28IHt{T0s<6{3@$y43{#k8`Lx*hgjq$nm{?gPL0bbYnADk+K{=b@ z7R28lknClC!N9=xf`LKs1;XFTFChNLwJsfMFStP_9AM(l7@*_N&frqbaEn<<2eMgu%x<>VfR9 zXJ}wi65xm0&jztS5wr;t;vEKt+fe@_+0XuxfkEgc1B2L0g#XoELNpKvclgqLaqxjS zaq(OXF54Lyma(V_2!I`-#bhGR#lVooWX{9`3jYI8`wLzo{NMJHfnnlH28O9f_Ae#U ze$X*9plkp>Q!@=@{XWpHZ#8HbXffGS0PF);AGVqg$@h2;NN z5dY(ke@|%m+xs&HX!>(8xU?}c{9%=4;)7bR$i&7DUO1J?Bn~PP7#IZZLhLVih46p- zD+Y#1uNWAnA=$qIYCrz)_e2VRhj_+>5KsVYV`NyurpUwxjR6HF6HpGwgv9{FUl*Y6 z_<`gOzSj&4lCK#UWM3n~LH{*GJt23%vmya6j`cmW*`x&hrk0xOpx?r;U&&dMa-z~~8@j6MOHjCR?~#PEq-jfIOtf<=z~ zFe9ilW5=S$q{0-#WCocc1)03y0mL00ZxG=z=M4kH>NgAw>yg}X5b6&6;o%Akk6>_E zK*M7@BSQy=8VeVj1QRQd9H$~XI5g~7@|n395*|YA=Xi@qmr`#T7}Vb~FlfI;goE>2 zkZTzjN}%iZI-uhnuz8wH(0QitV2B0UYi)csPeapb`@+||y$G3=jo%kUkJp~mGNJKv22`U(xR{$1f5>H5uXH0krI^MzqbWGbkCI%BVCT28Ql; z3=EUrA^ZhWzxW*k1NuCXM;B^4Ktl`aR!zNve9+05<_sPJOdO2z3?Zy6%%J5*Y|KnN zOl+V=07M*QG6TZ_s5?HqL(Gf)d&j^a{honA{yid|quxW*W6X;|^Bv@5EKpK!1)rT0 z4vOh~5Fr2}K&vc$W-~LyDKc@g2(byVF)?u{NV0LTfmU1avk7ubihx#8g4R)Tam$J@ zF|lxHnzFI5>hPGd$_ny=_YkdQWO@jlUtnNJcnS%>74H%5-tnG+;qZF~hT}-?eonyM zrFk%y8zk#98hGk+G5DMV-ASOq#KgqH#>xRY!H0r z3~fx>Ah&P`GV!qoF@b}^mZcJ8Iq3WesQnv|>_7a0f#LiI28PQ>_J4)iKLffy6aBmt zkp0Cusi|P=6E=W0)~m;JG5GvsWSGIE$i&Gcz#+%M&LhAL+7=+j#1C4w#w94u!wL?K zX^bpEOyK1mAD%hKo(hlAB<;xOG?kTM3$s3xAO|}eXyG9zmjDM32d@BU zm^_~#i#ii4kFcu58b&TYE>SiqE+)`U6K)o19&sj+e?%uTN{MN**@>{1^VLXK^K~$? z^K$Y@GVyUph;oRt#)=$aJjBQ(Z7%YWF_=k&vyw@gU0M>{r*~j_!^C9Bc#n}Kka;!> zs5Lf)iAjQSCld=FvosqYE9Amcg%6PUk@$j$ALB0!3|?Ot7{b0F!e#y!28MNC7%=Wf z@mP#rPUmK%f;NT}R~9>hf(X=DoxnH=(!VSQ_cC`gfx4M~ZjO9TbC?}@oYEPVu&MDW zd}ieP!^pyKR`JS>M;#rLza zaLKZ(GcuiFjR52BbT%?Bdetx zn>G_K2M-fFBP$P|CYKx&2RlDIJ5#tguLL8jBIjRLj(@DIEL@Fj>`iQ}HoQ!V97?-c zSr4!>?Pp~!WGP}kz^cH+$Hc?N(ayxw#UwbFk#7N`0wX)CA|n&G3M;D$CrdROFB3Nt z>v=YoOKg%m8Mzp_l=;{>c-dK5rR6^{vNMAq-%LhnR%u^w(bvYva)Ozug%Pwst%NCy zNtg8yBjZs8bDnw1M$4xYcP^&&A-E zY$#x4V#sO4WyoSw%W#87jZK&hvQ>wJPiQ5(z&ds_n~Snwa>eu-a*a#8yi1B1~o1_sk#i1vZ)FHp&d zdHymiuYvXhCS|22gL0K{fQ3H?gI_Si1YRX3EzppVG1880N3cO1NcPS7#lW!m7X!mG zB>UFkvJbjmtu(JVF)cOTFSQ)h9x>3?=V0)2W0=LO#3T!{Pz`2b00YE6hTn+z5&F%* zAp4tvLE|?few=6n0kOkY&TPIEZxfuM6`2_`R`8fo%7?$v=G4Vd+ z;bmfZz{ARB@sNk(4iEU`Oa_K%7C%tpGiDNGv}F=xR0M~E03*bGGmzZ3?l%L&*53>a zJANa=|J-k|a-8?BfR1g+%t-~8mf#R^1cgWp!yaB)(AFv@9!6Fc(DFep$bMy6CQT;L zaz2IvsQn6m5bgZvKMV|+e;63*{~*F=&mRVcLw_*$M^D&_T3&+|5C$ja7UUqUUI#6d z%gIki+Svx(br0Qf&!Vt~NuE)`T%J*ZoxxAdQNu}?g;kbau7i=;kwt=8nuVR=0xzEc zJD1>M9{9e%T|AsjT#tEKE!g!r*aX>ySVUR4nQX7{vNLgV=(96j<(1gM%gH3P8+2g6 zOC~0E1_m`I4Mt%$9!4Z%85kZgLBe0+FQUFO{L8>#^_PLc?k^(z!~R0Tp99*iZ-COU z^k0x#RGe8{lA2cnivsZm#;J_;+zfu(85wTyfm*80%&aV|P%O*_?n+N#WC3psW>~-s zamNZIcO3f5z;N>~1H;?Dh2Xo#lj@OWWvPB!@pyPF7(?PGJEi zPDXxaSw?Agc~(|V9dRBTX+vpNX?F0&jkk;}yBV1bnRJ+BnT(nAnEM$)jfxB=6-I3q zKIU9D1tw-jRn|q&_Qe4{1(Z2mJaxctW~uQZmShEsZS zZeme(c~U&mLHL<@pr$M+#1wqx85Q#7xfnwH&3P=i%>6AS&Dkxu80Il4G6~4=F!6G+ zE@9@G&CE52nTJD>iFG<7%M3=z)y$lXOzfPDtlOB`uY$7t4n`L6em{RE9!4%EBPJF` zNk&N~a8qglJH$T={v-Tz_&)=~`Tq& zg3oa;C@G3BC`ttjff4{qL4H1CK|5nUBSQ$ErJ@zLrGZt1rGXU}!#gIv4WOGQnAp~{ zaPNXO7WT4mG4pd+@Ubs}i7aQ~Vqn$jxHF9KmJ)>h&$)fcPT;>`n#- zP(Q1Zfsvt&fsvt$ff0NcET}`e49sF+P=My27-)S6%ST|xBHRz|8^^~pCb-2jCde{` zoM2>_#>~gW&nCbj#3KP(bH}U4$ivFa#Lq6w$jZRr!Q{YX2CC)?I3e!&faD$_Mn(pC zMn(o@MudB;86h<}?0kIK{231Sz{3;dFatk*Mgs+XMgu8^kUmC+Bg}kE+~AXx`IrP* z`52j)`B{ZQ=i<4rNHK!WfB}~vTo8A4FfzjTh0J4QWLVC~$gmp8UHhT#!ZjZSniosS zMI4Hs;1kc7kjfCUjgjFAvoI5_@8LY#uELac(ULR?H- z!t4wTR^Wx>V9zr!2yjFEKLKPP^jw^^OpFXWnHU)kGBLvM<$TP<$nchlk>Lt7oxtqZ zfQ@@%aYsR7QAs9vJViWVCuk@oA)bpNq|lwmV;^X$Mv=*oO`MHmG7HZP7Fm8)F4Czyoow1v4Z3-mXAqMusS6Mus?MM0n*e zL()+Tbld+ft86E5yLgp|s++*Qm(q)ri;%8N66lY-YW6@=T zG!Ga)K<(eb%m}}?-~uxv!%JpHhPO!e^RhtfXMozD0KK;WWs(r}`*KrrlXE}|OIaL1 z$Gd1UgrqVYV-toRv8)ctOS&vNjG+6h4frAUUO=+}^bZ%}lIJ{A{*N>`Yv;;N#et6hO(@9<%|8IS1n21OZ5R zaj+rW>%zv!;LgU#;Khb;FGzI^8>V|RFx?Be4W%eGEi)$v++%SD4Ll&a4!O ztAW?{akBAou(0qlu?w*V zGV!u7@tg9qNrSdVW-%6^sl@f~@>(ysRv2JgnSoS*$K>tgP$|2UrAuF>>E# zWHDxDVwYgvCd{%@jO7~>#};Ak&B8*$oGcQ2Oq>Q>tlt$()P~+c_B-jv~3wgo}~Em5Y&~ z1=^m2jSD>3j2iDq?(>KBv&9!MMuHbgcR?26yMQ?-S;160_yS?2<&3N>Y)hF~IoS@g zGBmI$GVw66GTAfovoSNVut_tqZe?WI#>m6O#bM3GW#B5y%4EjG%cRW6$|d@ek@FSf z5k@9XrV1uCW>!{ZR#r`QA5J!2CINQlUPfjnkqwMo8yQ)cST-;!^7F80GO@FA3Ui4t zDM~YmID*&ToMvL_V`Tim#I&1<5xfU@IcTVGDH97P^9yD+aqtqvO^|&2K>`w9E4UEx z`H+i|ftQ<+L6aL1pNF{_87^=$GAx14_rS*KpP;RmOe)REhF)hBP?QS3-3XD2VS%Za z2`lzN&AA1P&miHL2M$0^Few2hyCI{ebzqJXgOVdFCz~F#I7XKPOe5~ z1r7~p2ZG}R6YF~>31t>0u_MgvOx&j#x#UUOD;OCV6l5Xpmf%H{%ci`H z44%A<48FVwcQ^AgGEC!TWY__n|A*ZRcw+);{sgsOK;?%MBHcmK)DcLUf~2NJ%nV9j zSs0daf!Z{J9K0O-Y#c1$8+CqjFt>3^vT!o8u&96z`(|g7;8NsbZwF1e-(X|{-~G3c zk;RNjlF5wGhgpryjBz<5149lIGh-VIXxv>M;-441i2P&A$H?Hz$H)-Lhw#sQK1PO> ze2feapz#1}SI3}@Ln5+BUSGpgo$WXyD=V8SLj$+kOg7LVAUsU0bJ##fiGcRxbAT2{vT?A1PJ-ar%gK3w zlW8?4^EysuCRQ#k7S4;DY?nCsn0PL-v2J3MmgZt$sATG5WCEYHrpBbsSjWQ2%*4jb zD$T*hF2%&ksLJp_0TMnO{D^ew#?Q#$#m~s#$BzgfP^vEHXJnXwRu6B$Q67WO-E;=k zhM>w6HK5>On3i8uo>-K^z`!(%kwIw|Bf}AHRu&;1CMFI>mff7pdpKD+1X-9sN7%Bk ztYqP0;<(Jp|AUj2gOPzjm5G_rn?;C;pOp>dG=>I6h(9hM`Qs};Bf}4VMuy*L{@@qD z^hXAcdQUGoCpEDM%_B^D3`%+oUl5Lc&B^?Rla&kVE|7~hK;4rdfM{3N3NSJ>3NSLX z3ZRDTdI8LK<(z$}`3T-NNzO0LD*-nv85o#485xv185th&u(I%j)(p(#W|_s!%*etb z#>~ON%fzyfn`IF<=-6i_CP5ZXZYBl>a52Gb#KywJ!fpt%xC#5!16^vNPyLq7qt6aOp*ztR{W;`%MSrgb5;iq zb|ztdCIKcE7GYj)Hf}@Ka2`GmHWn^6Cbql$ERXmFc|d13@&|H=vhwTla&QY8vTE?N zaJTX+E#p(>WKGxD%*(QcmrIFjH6y2jC<~VeGZPyZ7ifzO==i;O!F|jkikVCzob1-@ zouJ-%3m3~eMkX^x3lPVSNrf?kg^hVRBO3?nBt{Mvc1|v4PJ12>ZV5gyUKartejyB8MPpeP@_a^V2uCKm9~N{5(0M=L3^9;v+*&paPTuRv#>Jpz{Nl}m9T*hngEM% zKvXeFvYGJ-um~`5t`^}x&dBmjRFH{3lAW7ZUKey(Y8E>)J1aXo7<00-vTO6O7c)uo zf|t5HWM+wC@?cbEdImm^Yz`>lu`#i*K8J*pfDR;_97GWLCt8G&AzOrzAzuX1FY6V7 zwC7;w-=MF@DJaTM56Opiwtd0JA2EqfU_1>Okv0I0NGr`{Vpt@m#w5t3$IQwi#Kg;F z$Hd7d#Vo?i&Imfago}Y8k|~PGg$Z=`v4JkcT@OSM<@#q4MuvYPj0{Yoi1^zk#>lWo z40AlGg&TF>Vo_-xJkD4Ielzkj3iNO@DE06%JQ33nVq)V09UsHO(k{x}B+AOg&BXjs zgyokA8#4>&sx%gszalKpM3|J=Sy+~fGOrTlX5nRF=iszw{ld%!O3O^(T*=1rQ-b-6 z1gjjMAn4)~R!~M~X5nCYFTwUgf_*PDI}_`1QRWk(tV|*-Y)s57ESE)@&p~Y4E6Q?A zlpSmvD+|j>QI<`jta7|eA}lN)MVa4-@_^2{5fT6$qQoNAD#qL)#v{PV#Lgl$SB!aq z7&`}x7#9!MS~0FoVoXddOzbQyJH?nciLq*MGKq0<@ku*?%Z97s%;&^G^`-z5OFc^y zBfAhEsK_`j&UQeYLxhh>43yPb`MEeaS>suScv+B&DIO&zVL>)|J_QbK)~{k*_rTV0 zv#>lBW4!$1EG7z$_oC#HRR$QH4ucRE=3xO@mY2UW-*zSBII2O}Eg1 zMc>1S)zIFAnTgXhgW-U&BegU(55pQ+ z;8`TtLI);shZfK^^kK^w8Rjr*FbOb8F$pk%uB_r=<7eUroeZtRq{ZaM%*9Y(0X0@U6F2}Jv|N`jH0O@fi33(4LcPvngM9B)eB!@$sgNsRsNsLpPU0PU#m7SA| zfnh!)ODdBKXo>q@4)((V)53)PK*CspW zfEMzJJM@AhYCR*v6eeXRAtpX1(1Z^wGdmBcY0CxL9hAvr0~($KJBQ%`)IAF%5$z{N zDMkh{DMki$DMa~oL5h*#trR1}4d^-kFQDsxUckn~q3cya?n=!oDN4-I)B`UBLT!?Q z#&5vOVe~);j3wuwEQ|pS*g5Ctl@#TJ&YBM{Ni0bPMMGI8_`YND2FAlIpf#_@nLy-Y z(4y}MEo&y5c4qcO4li~ljtwjfL297=)J(rwl$gX>I9d4FxR_X31exUdxVXfbWS9h) zSQCWVK+6SHxj^^e@H6pqaD8LtW8#$(WCCs0;+YR>v9YnRvM{l*@NoDXn$E_> z%qq^s$XX3DgO5p+iB*b^NnV9ZK$wG%4Ky3X$0Wlf%)!bp%+JNhr7OcC0a`l=x}AiB zmyOk((}sx?9GlEWF zV`E{>fRqOT_7MN9kVTZE2V@x;PRlYfoR>wUvj?(}bcXBv_{5ZyqT+(YBD%OrYU&7#3z@ zaSW5FcQw0Kk(6GIgr=vF``T_yo0HV!rpVOC`(9%d$1 zWhOypb`fFFIGQDs9g`tb5;(#PoFMLrkVmAyY*F1A^WpQX; zX)z?Y64rvIC=P?X*;*wNnx3OF z?HL{9?AaNjiWpWgDM<-~4tL|=VwGWJQeLW(EQ>1;U4JBeMVN$S?ny}c{xQEqy}uW176OS;1bWl5Eakxf(dd2oH7#^Xm_V4qV>bT@BwOX zf+C{aEm34-Xjf!p=ti=4J=ESOxcwWHTAW%0zUp2)p+255!7-jO!9SicK@604Pcbok zU^3w116{kt#KR^Gx-pVVoQau9l1+z+he?8knTa2C^F|7j1Ct1&2a5x=<>TN6i4O)P zg!=@P7#S3m7#UQR5aAN21PK?8N@#pQ_kkhBhi@WyGetoo=zjaKe8z%D;Ea8TnPCYt zBxiH+u!0VSk}zZvVq<0FR|eA@f&$X4lKd5*u}si3nF-4UMkaL-WR8S7l7WFi!2{yX z6-tQm=YSF;!$l=VhO0>KR9A+$Qv!Nl?+d7VVeSN9rkIwQmza}T1-dr})XCfjS^czx z5!B0!X<=oU!>Gt4D#FPm!6d+>2RaX$i5IlPnNgfc6SU->CP9`yKHc+@~FgY+O!kobn;0}>rFm(Yd4-@;6gDuu;{;uv9W$Ma;Rus4 zk07Yq3tBJC#K|Pc#K&aD#KS7XCBea+B9zF%Bn@g}2ubkqGx2c#U3@E`yZ?j5R# z{P#|kkwH?8k-k+i&d4wWy1p+2dO!J@dyxDH3y0v;5;sKZhKXuuf$kv$ z%|&SHrR0}D5Mtg7SvnKt!kJ%XBu;?@K z@o+G4vI%gAa*45U8cDLLgZKgxrJQwaY>|tSD#wg0dIhRrBI1BRy7A8h6 zCaWWiJWQ-s=A$# zwTIDwO+uDcS6)JhNtB6;kqLxZxR{whn2n2-34}QWtRObBaCcJBH!6q{;)~2GKnfkuuHQuFkE9|;bUOnVG?6(2eoJ2*f?0F zI9S-d85jbhApWb+K-9;RH5eHdYcMh_*FcmvH#H#nUI4nk^$hf!D5R8~Spgmt(bNM| zpeAjBPd;NoVm@QRTu==Z_m+vFiBXM-hl`Vior#-?gH424jFE|pgNucUlMS@LkDEz^ zQ-+a=6LfhjtE3iW`o5GUjY)%9i4DA+mEk}%#Jw7t5chz}DGNzUH?LHlNy!~^pD83P2tn42MB z3nRlMW<@4tCP_AF(5dd6LZDj0l&KW#goId#{Tf;b|66G>GB|26GPr6X{2vOHhs__N zk6)!Hr{*OlfmVSt2?yl(b29{VF*2-UR$-E1l4TMCEmZ;y&KNQ&F^MyZF>*0{fZDr2 z3z1ItXfZMz(PCscfn@JJsJ%GubJI^rO)5csL#z1u#S;o zAF~D%C#d>nV`EZckpykJ0gcJ%FjauP&#)j4;(r5eMEFN)GcsgpGcx39Bl6>QZAOL% z+Kdda@iSOBXkhf8(~~jAREkRyi%Og;lfl6wK7sKuq+xQ78PqTdxXjLQicO7)9kjU_ zf(3+`oVkpdxR|&_q?p*bK&}=6@fbPzm^irEg_u|)xWGdwd_pozoTXd>T)f;&JYdMl z#KY+W+HJYdlRld*2Oo$&}eEwNq!#Eu87>y%)F9h&s^3*&|J)d$y~(3l;H}epcrTk0Vk6h8!Hq4 zZVujk9BjKeAh&d|ZR22G%E7aOgM*2gMVg7@lqn07`eS;O_{Elvh(mh zG-c&w72}lWWanh(RA6Udc+3PEGB04^WoBcMW@cvMVbtSbVU%PQWHV$nU|5g=3D*EU zM8EE`9wWmCJw^r=eMGp1=rb}T>oYR^fcC#(;{!3oge#~L3o6Y67a;D==;525?3-AW z4H9)MOU%rHlrpfu2cWY6dT!k|-q zKpUF_d zG}yRP*jIC~uH%qk;%1X%7Gh*iR`C#JVPVqb;!fm>;bao_7uFQzl>W)e|AkeG8$7ag znUTqgDVp&+BMW$sxf_cmBO41Bvpk~%2M_xcCMIbner5|$Ze(B($cBXb34KI*{-Mvv zz-hq9AZ~yN_n8Ka42ujH8PMy61DjCW3F*n8nQO?l$)LoN%zQ*EF+IPyJTf9zG^b zCLTU^CVnoiw=8^2d{Tl;d?Lb(JWM>3**I=-F)?x2aOtu$F>|mn@p7<(J5?NvOl&et zd>qXDtc|Q(Cs=qHx%v5-xusb-b(jQ&9T-_CDf6U83M#KguT93oQAmBE_G zlf;?`mJeX{1KoXpHDqRawp z(yYoH((HSfxb&GsxGTBDIlCD-RxvWJW#mxj1+O%_Py&g^6Go8w2GlOQW5met)`*ee zmk}Z!ql_6Dl8hM{VC^v&Epre(9zhZ00!`xvSDEw~4W5ExM-bFd3t{KtxWmZK#j%Qs z;h%^icnzQOR1rva@8^&d5o2Oy;TI6*;N}ou;Zzf36J!!(VPoQI7v)+Y!^9>!mz^Vk z$Db24_sYZ$n!e@{;9%n5;S%8BXX9GT$eJhD%E-yY!^{tA1nDsC0H@y&7A{74#=VRj zT#VwZB5a(jcNv-ZK|uv70UXMq{x?SC|HsCR3}1{H8JJ8E{{Lgb$Y5Z~$S?(Zu9^e% z{Jj{g{trnl%FWCJW&b?z-NEc@#OAXzE@0o!IG>%1Az(J6sixUs5mO7Zn~V(S#H`tv zn1mM#fm75nAwDL){rsTR%6Ew0j0v<_MVLu}Nsmug%+y7gNrFY3ONB+8i;E33RKm)n zz{Jih!p6(Q3>x2O5@nNP6J-)-Vq@ZClVOtK;AY`w;$vjz0wqELCLtzHE*?-i<^UBX zVoZW8Dom^_!Hj%No{Sxg?5rH>Z0t-K9CH}iK{saTGP3e0Gc9D~o5#p&$i&8?%*@Tk z$z;LE%Eiy5%ft^JlG0*gVFY6q7Un<>el}$$R%doE&WS>TOyI=1KuADQnUVJ-qdYq+ zBWtb{r_@>@9!8-Z!Xk4)5zx!Xw4RYEnMs$)m??(o4l7e4;{!$(KPEZGdgdn(Mh6q~ zV`fGvRw*`9cJRio049A#85T|E`D|?LtaJG|EZFBVGRZ-2hhbnyXoke+3{ymUK55Fx zaM6^J;if4fK0lf=GW;-QgrDmNYiFP6K~K++A}1JBI)N&{)FPxU@1WB=zze)UMNz^U z#&~XqfO(9};w+L34MlL4p>B5{$EVG1}W(xB$u^eV* zz9+`=R!rib7$*xmhn<7KPjS{?;+#K)K`EZ)Ff+#)abXTo7B(hfF2gu}E=eYKCIKcv zCRSD+DK;iP0k)^okix>AceAAM0ZHcVqM$)30TzxeqO2!Hp@sKgT7lsX;koeWGK*X<~1tUYW1tUYQ1tNamSTHjDvtVREAD=Y9XkUQJ zS48x|A`jZy6?d4!V$bOC4>a2u(8?^J#jh*C$v=ycnU`e)Bf}b5MJ7H_2bqnPjhl&& z#Z-lzi=Ts^i_LQH%tylgz6D?C|1YeD!qSeb;lSeaOv1VN`ead0wmv9mMDF>_i<3xk`R zR!kqkgH)gh-_QqfuYeWAJ)rtj%Zib~$cmA{%nIS&0H{2y9)-~e_kyM?NIgP zCqS0b7UbvWfHsne7ql|xGZtv%b1?**XJ(kEpvWRFz{vu-A<>9Mfk}Xan~4>46CIN) zix|HshZKi83n!DHqPQe0BP*!vwPA8$GGGj3$!87)g%!x56DC5!>jKmrpm=*^&B*Z1 znvvm?H6ov?*)TGg+AzY;Gx`9Xr{(BHFNZTya|%G+S0?d*i=cHj=Kfp^0jro8UMVOt z@qvcZS@^jGm}Hr_nS>Zwxj5OlIfR%5*|?bmSwXv;Ss9r)g;<%mSs7VDZ5b<;NG3kU zJkZ`|kO$(JxEYz4SQvLh0+oS*;lLz_`#WqPLLm3gw_#*hWy8p@&IS?A2cYt>^ai70 z;hdffaW{A<1$^Lvu|A`L8L08r&d9JrQI-j``h8t%>+LFB49Gaehyp2 zz8pzgMh0bDMh10Tg#Dhj5cm0@-OC2EKeHr1(IvACG%qP|0JKU_lp)|2Bf|kjK_(t1 zUM6WKIq-#8Tudy??5wOpJWR%n?4Tu=3=BsZSwtBa45mQbF~JtG?sTy&Bg1}MMux*k z?sy1w2Lp6{7Hpge=8m-762D-_V&7m;#+$&n9kPzn3VhyDHkf1w_uAT-86GLBG4XPV zF!6DL#@|?&xjDl51)21@lepMHE%W(|EcX~ekp@a;3=+p|p!f5wfYK*0*CmA%fe(nv%qvbULfSQ;p;ZEs@XJq0)da7m2l=Fd zu?Kvg@lmFFE{2pZjNuv)*O?ifFsdv49d4Co>a=1TzyC8xt41u$u68M#P92 z&n8BWX!ubPVa!aRJ4TsVq?iP`IN3PZgt?iRgc+HH1UV)73z=FOnWPOxQZx=#r<{tEZwB02}CJjb!aI7;h2+V@`Ps0J>KPLx9hCl~KhENAY{wQ{U|y;LjK!1UEap7mEK;SE{O#3byHX3x!#(!$7aiWzj{88pQ( zGJ#VX6AK3uGmOo_2iazu&B6~lPjogUydoSC;|uwYj11L|j12XTi13;UbyozA@}xL9 zu`D$&Jr$f6K!KI85wr$GD4v@kvEX*@8mMy_9zfme;S32sP`%aS%*ZgwnUP_UGa}!AcV=W@c0ts;bD;HZ z0@n6%P=0<1e2@r{b<&f;jX@Mz+=PvH? z4>U~R%#f$Z#LvVh!VNmrU$=Q8JSpV>*i*^Fu~9RaR*h zPDWNnDQL05V6XrZpBXNQ@R{bq$gtRjkzs=iB79!DFfx2|!R*hzSc={*0W~Q>;RD{2 zgeVfh6I;b4i6y1r5CKj7F&4~V$>(B7>tpm~^NaW8^1H>%(8Z+4B+bRiCJwqbkx6VD z2isN-J_$}H9)3Y4X(oXc99&a5cv!fZcvxGRI0TqPWclS2A@hL_Ob-~DbQl|%8Mzo3 z`WTtm7~@&Em~Vkge+CAD#Sni6xFXVRk}D%au`44(t1H5v|6LgwMBEq|c0l{V9`z9a zT|nC}0@^iJl%EeuvQiC9Ell94kdrL`8MzqJD&56BRx`Sbdpu?GW%Jw0$ncCwg@X%R zmvJ%)aPaaniwGQI2FLVqW+^5&Mx|Mdf-@Oeg_&gpc0k1Ug2fFuSlIa4_?Vc%ofs8n zUM^NPF*Z(CR(ob29zKq6<_HcZ`3`or?`(ohd|W#DtSS7`Lhh_Ae9WvNd@LflTnr4) z7+DT6GW9VsnSrLk)fnwTt-VSnCB_cW$^XJEO3V$QneD5LY;3Gs85tNREQ5qog&SfW zPrn-@!z?#OhJ|j3aN6(2$Z*V!kwFHnT;xDIcMBFy;Jg4TAHkEF0{+|#X(5r!QC#!W+J_&b3dNp-t zWN>w7WC(RfxUbutkzo!?I=#gI0Q(Vo>o&7R4D-Jac{j^P1|1`8(>=sZ3?CVn1vQ1yM2k@Xg%AP*lC`$I;i zM~v(b8QGsOf)-2*GK)$IvWkQ1MI9znCKV=aCMQ-;CN7Y#`Wcyc80A?wnb}#`nd?B_ zW0Y#j6@Lw0Zv$KvA5V))KN@d=FEA=4Wv;MTGk znB?qdGO@)hxi;GE=Nr**Ch#hoGG>aNDGao+-GYh8(cN|kJKaVC4 zACo8}GYb<3j{r9lKNG8j7#|B{{K1}!k)2UZRD_u|jwu^-GczkAlb|4{fHbQp7b_Pi zKF=|+crseBurtfCNwTW5ID*RBhP4p??(js!-vv)bhUcD)44*s^@#p8o$dK&C$dCeE zH{k;H?;NysAt?R^9R?-7fH4HTHSs9q61K<8pp!w~=#t=(WzyqNVUlGN;gA(D=U`*v<71l70U73M6=C7yV&Z0EVq{|EVF4W$$;!md z!X;?LDWc2C$jUEeteLT#kxj<6lu1ONi-92rw4dFKv4xRw86%S~%NZt6IJ|-lvMgt0 z<6@L&=HuW7HR;()SwxtZL(AU<8zJFx!3z@4pnCX~7bC+*FGhwRUWjnv@@8ZZ^v0YA z_<&IlhbLx(4qSvJ3sBM)R>+X&W=M0fS9OqO*ukm7#K|N+olSKf8z&PNXqZidDFjqC z=rXZ03b2SW39!mCFfbTwg19Tg8<9Tiycrq#ycrqRdL!KR)0>fj(Fb#W&fzqAIt@rH z%7!=!RNN(812qRhOF=E;xf#;Z?0Fp6!I;lM-kurEPK45W3|BZcm^eB3Aj9d$*?3N{ zu^(sSxx&VNnT_uO8xQ!XVb<4d%uizhRqOvC-@-zUFpNf(CWj;Fw+O& z@7F$z4Bve)#|>>T=GWYEN{cg`(w&P^Q!+u-qIkg_rhLW%pL}kHw01^&R)->c83#^# z9tR(LZU`d%D+$`(|LHD^S$_laZ%dzu;&I9CT;(N(1^MIX6 zfc-r?&kuH14ptT!CRSF^go9u=2lo$lR&j1)8GcqKE|8DIncSIjomGTGk%^O&lZS`fhmV`r6;vuQG;D?X-xrZji+vdxCipTktoB9t|GzIIgOnd5 zLku*3GC=E*3ujQ{y*N2B4}6Y4cs_>hJJWnN#szFHV3Hq9&Sjm?#>J54>C5KF<;&)G zjMe9wn1`QBnn{NvjY%CeQY|jX$g0cC z!_LOT$;l)jDQ+UoE;5smtA}wtBNJ$(xe3f@X5=aZ34p@nJQIsQV=9XUlNRW%A1Kia zZWeknu`zP7urVKFX5(T#%*esTewdMqi}NfvgDUKTginPZqCYv&kC9=eA0xwBKSa6x z-w&*uA)*Bm9y6LDG^~CFg-cpdVs2`Aeo;1fxJrHl(_6;%OpF_tPB4L~lN_McplK_4 z8J6*wv#>L8EB@?~-GvT~|3vR>roVB$N+&BLtD z$jZ)VD{aHU&AO4B?*|uny!t#NODW?*MyAEgOiG|SaXmAWG~+HNCMCusCO+s)+JqyJ zaDEVgNMD}<7#aQtFfs@PBEmT-kdYxbkdXm>-{A}F;p_)0a|0Tg{22r8fKC8Po5{#3 z&32oSRg6s!9E`{K6`A-2gqT4kq6v$@dmeB|{Ndr`VC9lwVqpU9LuAzulNM$Z0d?onTLak?*k7Hzbqr`T^_zuJYesBVPv__2=VDmMkZ;-+l)*~j7m_S zPB;ef=ZQeXIK%BgMuw+>j0|s){HYwo$e ziFRgjS;NF|LO_v^hl!6xgoUS{pJf6+C@+C}^sJx@EJTHw_*vMQWSL?aSy^lu+1WYx zS+%%qxfmEOfu>18g=RDp3*#C{%T3_~#N7=+h_ub5F-O`Fd}{?2QxA(3}$3l z0WBAGpyg!DV@!AFLk~cLmkqEpzV-6*LFELZvxry?R8R`bA@T>9ezAg&_jUr4hM+^f z(>$CdSe3j~JUP7hJXyRvSY_BkS!LPOow;1(oTXi6F*&ojxU%xGiFmSmaWPC2)E8lA z5&|WE(JCd-X{f>+yf1k;KJakzu>R*}Y2Z;1(|E|w%*4qeaF3sp$(@n)DnB=q&=r0* zAucBI&7iXu_VI|aaDL|EVq($ay~8EQ#?Hgeq0JJ_%*y7#$i)R(ttzlrfUQY@gPDVw zm77IPdL~Im@WoLXOd^cTOiYX=Ah&_=fin>I9SA{;*L#LCG9-mEGAs&3xX(9? zks&OMkwF9Pyvme+sOcxYD76wj{eb#zptF1QGK)cj4xl|)u%wld3OSBXFSFPgcE}4> z`Qp?PtO^i2B#S{^Lr};BbbyMLVt>Yf3V+4`PJhOL-K_px3~6@GJgib|EG`_*TrOPB zS}vT<(k?8{5-z-~;%suP(rj$bA}&nMaxNmyDlYua!Y*8%%wF2gLM|+<>})Go8JdLE zSa`U24)XD=5tdph#&STAV=W)o20k_!mW|x}Owt>;IX7~%$Z<3A%;IL*$<4+jw1b;> zxgaxWCCej0P-lgYk?E!&HYcW5k2iH43 zCJq)hmS#TY7Cz7_Q!ak4jr=UvgrtuLVTf|^TNopQa5y7_OgJKa zl!Y@g^oBDsynyzT7@+%_eqfgWrMU(074+g47@Ii2-Q2B=U@8wxvV*(4vza_Oz1DCr zw1_A&X>hQxa51SeRWNaK$Q|V8Jj8#5kx7lsmz9-|g-I54DhUrihcXL0ivY(WMkZD^ zb9q)7Wkx1;4MuhmP^VCtkxQSIH;9pyU73kXIF*SDGAUET@|=ZnI}?j1lLWH{lPsoXy0<$+(6CH1B*3>i=*={U;j1$RHoV$eu^a!K2aJ;;)!SAkhIyh|OcG3@Y%EMlY{o3Q zjG)fCs3?~NCnFOFmpm5(!(>L5cqR=dK~TX2a@$RayBs1B?uv+HWJro+WGIY8gzxl7 zMur8Eh;d(m97wsd0xf(q^D+?y1=w{97|%1#2UWh=o-AJCo^oF1o=jdM44*_n%g(fz zBxee;%n=lyEXcvc!o`nOdl9Q_g*kCd;qO(EoZoJ2NFIPklgt? zhLJ%%2I0>77)FNf7|i;bV4*IG!@HykKN!;$`9RXXO`SQczmL$Rr}l z4$78unOHtCGwug3#;IiTW_$s<^^Jv5k?|EHXt4pqh6j*vc@Tq$zb`S248LO-8UDo} z(hXNEBwbyBp1Z;WomYp&8+7qAI7FC)1HAk>7?M&M`j|jNuqtdKoa_t?uCTi$K*fW? zLx{Z*u?Tz1Vi_4aV;LEGV-fbQh1!e0eg$SPyq%DmS6o_@8eE=Q03Q4ZsP<}*`Td`w)Nf}G$5OeIVjOeUa_VFrdr5ce^} zA?k+(af}Qb;}{t}$05>-bOIxTSpp+NM*}2%+?fTTOPEm4M}oT(oNy2=ZOrPyFF((* zBtJJ3>FOT1W|(TX{30immD6w);5}ZTMwwfF5ysiHFzuRpi791?dC8y#r~Cxw7u@~K zj1!pOu=g`_F(hqbvS(*yVdHjSaTR9caImrGagcXqaa#!5`X*z~;-FwJ?4V%J=D=p( z$mk&H%Ho!4&*mWG%H(#C#g)Zv4m-mOCNDNlCKWazCQU8@4gnq(HFhQ@eJ)UsSA(5N zghi~2k$nyLK-)>o?6VnJwulH%7v`AG$mGK8%*4UQq{76#ijij_BPWMg1xq0_6Tb+v zFgqIu6El+=r?4_R7mpL46N|OXTt=1!jB-p&^B9Hag0{Oju-UUsVB}>IX5!!w<_6Qu ztQ?%|Ak5UyD9FTN#bU|KB+O*R$jU6>z-G^`BHF{q)X6Bt#L33TB+SLaq{76(#LZ;J z#la-UCeA0orpCuC%qqnf$`Z!Mq|M~$%;v&p#lj`etk236&ZNYq#Kpv&&5|d~%)ukb zB(2Y*CC1L8$g0RB#U-g?EpwPri;;B!Xcw>WYDOk`%NvYLA`=L|WfYj?>y<;cp@%!vpC0G1xqD2FAJ>`Y>0sDPHUu=Pt880%n={RtnL zfNY*L(C1>vaExY&>1SkE$E3z4&c!kp)c0j(<6vT8VP#@xWEGHLljUdP{4LNncP=&-CN9wWJ63iE23aOsPzwg+2nL1%s5@RHBhughWJU(=6h;RA z6ofnMQy~7ww{I^zzbG4Yoh-N_GH7SiXEcb?=VC}`W@0$SsK&y~#K{3#_Rq{DARxuW z&BMr++FV zLtH8&LsBXtJbO|h;Yrw?>8arG#BgLEvl#mI08ylRV= ziIb6)i=72@P9%uM!6LxL%EZAUzyu<>Qfw;3H4dKqk zX^ae;(ij=GA-VG!)SbB7OR#uPO3Z;a0mKa=^cfAL^%)J+^tl-l_A)X|V^L$`VB=-u zViM!x1}9G@RxVCXCLv}fX7J3pCzBDAD5El{u?=z^0|UcXi2F3s5$^L!XJiOXXJm*- zM}%WaIwTx%yAL!`kpx=713oK1FFy~q?NHc25$sHMhJw zGn0`)Cle9R7Mb|txu6v8FJS{)eGZ0%2!>CrN=$rA;*gux)R<%-H?4uAmBHW##NG}h zduL`cGAzhsWLS)3?|Q=arj>$^9E4lj!iL4#2~hifAlb*0#mFF@#mFF)h480V7Q~;h zei3Y+5v<-TDXL6QErD6-;A+q4z-Q0FkdV(Xg-r!~${{C{2n#_D z{1f8eiY!DpcV;m%%*$eAScGK%D+2Z-EEg|0$C%GpP?gVEpqS5Cu$eiZiy`3v8^b;} z4bX)rTx?7N9O6toN(yXjENo1yj7)4itW1nNj7-cDifl}x9DGcI9BfSd;#>lpOp>ac zOfov9OfsUSOfvkXOd`Tu3=BF8~ z8xnpc(0Pj^&~Zjs_+=#KrR1ljfvTr~ZqS$+yFV90!WKq`Y3zzDpd$@Ib1dedBk|b5 zNmY?4nu(7|5_(%a0|Ucfh&v8I?E$r0?q)MGyvSx`c!T5)h8&1HVC@zd4Rc39Q7ULl zDrhVkRJ|varh&(D4AQ_w5*I_lVn&8-?4UCeczA@EWI#vh@PmhJb(nHNrQ`;vI|6bL z;nAAI$S@&?kzsxgqFgwf!^m(Zhmqj~w4V)2PabIN{6MRkgY$D!!yzt#Ia5O`7qrp{ zbf}=FUS_c?WG^?9cz}~XBltLpghXc^7gc9r7d~e;7YT+d?4XrYpr(=74Q`&>+)NzG zSGa|Db8|AW?&40lT{i`Dcu{I{eo;zsK_X~FrThk_xy<0X>Ca4{xoMeQ zYz*I6+}TuF)Y%kSl$iwCM3_K*G*KoCCQc4hCUM3-MpiXONk%PJZ$>Ur9zGFqE(V4Z zj4U6Sn2Z?pS>l-u*uaOHGB8|VbOJm4MlPaXZ=NQ*;@K(0u>(ZU<>uvJ zX9Df9sRK`rkIFJ@_GGQ>_fTS0O0z`U|FJNR)D_~^MEI_1h>jFsn#&xbFJe?G$mN*ur z<|T$gPX#mx)8}B2DP-v5P~v0ZW#!{%li=fH;!e$JfJ?K0d7u&&G_%GBN^kc3d;;B! z4Es3L*qB&BtAtpX*gIMHdRSPP_?TEh>!H}0IgFUN*tyu)8QDR{!7OKFQ3n+i7EGdy z-QWP3zzGRIheE_WQ(PeHIEsOUn*i`xL?G`@TLfn zPO6F-8TyJD8BSC{%CjHPa{xIo?<<3ZJ9uCbJS8Arum-d{Z!f3;A+wdqB+1y^gxz=> zGs8DdMJ7%rDK-HPE&)&{QG`d9Ntj8NNrFX_iPMj(kr{HF1(%RK6VDAM0Vz%<5lL1? z*4IqzbC@`pw3t{x2fBY|VfqFh>t|tN1KpRv$*Le-$W+3_B*-MhB*-Md!pkJZ$ZE^# zBFf4nFUbVj6UfQL!Ne)fstP)Qfs2vVjxQ2i^LnwIWMrJd$Rf$q#LO(orUY7fy_Jb6 ziP4;iozazriTOPf1A~D8B)nb}Bf^WJgpom@gpom{1QA|NC5#L{C5#NP^Z8St>yA2b zrL z8y_PRs9iOOktGPSpXVWHX)k2!fPo;y-7`uM?%r0y$gr=3k>OAYB7MFofuv6h=zb$u zJ%*95!0z=;%qxXn1i25i*OJ0Who;=UnwKQq*6qMA zR(5t4VHI9BaW-BaUL{@@rtKUoJ2-fmKm&IiOp0v0OoG=~+0V1Gv58p9GjUGmV41N=hBg6ADL^}Cg21zGt(AI%q4}TxfZR?;xHV0dK4hESBh7-I> zEIiDtEOMa!iv`j|PXp9`k8*_l@#TyRW#x)b3aKD_9;X^s*IMn#qKzgNf-p zBeM+TFe1?5)CDXG%q%RCOq{HsB8CA36eJ<>;8B4HhvW)IhO7!khTIB7JTzB8;^9ad zB>n$@-s6f958w^}q`54d;2F=sAd|vyk586~hmjS0aXBj^3zLu@mp(h_T2%0r|gj;6ViM)xV&mlGV`UQHl;>k*RpWH#W9JqYV`k+RVq|S#U>YqIn6Sc|^p;(W*T0W@_bEhHkz#lY~Ck?AWV(+wsjD@J!lR~8EU znpkFIk!ChwV_{v%$idF8$z{Shk&%auTa!B#+%fhmfhh-HHGm{7p=&m4E9%d#kS#|{;HW3yM zCNUO%USV!AQFc}~kYBGdviO7AyP$=e=fN4~g960;7BvX>`_(WqMAa}d#ML0&KdXk3 zVNngj{jh$1#tPK*Tnu%84)mIUgw;&(j0vFatuhao7!C-kePd+%%*eqd%%sP{@|lO_ z3*6ycJj^Uy^6W|iV24XHGwTa6a&WM+vRm;xgEztcVPuH{IbMy4jnS8dh50ea0|819 z_kTcgKX)x7gG?BUL5nyLBV`OIHWfWoq9WNup%*?^Z#L0G>iG`oNoRJl@p23G@DI-$> z(>7*MEy%#Y(4Y!&?}A!HJAH30Bg4sBMuxLU?)?UJZv}LmRRg-O5Gn72vO6eWgZdbt zE#)8=C&a`vCTs+)Ly=j}%+MvQ#>B_P!NkVF$;80{sY$pvxmlT*xmelRK^@({S!rFDpKom2-2*Avij;S4B^)t#^- z0hq)SLgN_|mV*wymzl@Jut!*pNri(Aw5tzvW-k*LI}0}xdoT3f)mBCp9VTHg)B?K= zR51i-K-~8N$$gylj0~dnj0}?X2=|%Qlk7gH#N=#nSVqJ%CM*NHaRC#<1F#!8m^fLO zxmZ98zuB2N5pHZpcVmGj#C;R$5#hJ4o{?c=JtM=GdPKeg`Q;i&3~e3v3XJ(-q+ys6 z$W|r>2Bt&?nM8&*5mtY;Aa*Wr8!(zJjR}0HIU5^46Qdv>Ba1)-8?!aY zJ`jEYb)P{4qJB?mU}Pw3U}R`-K)CN?10%!#21W)BXuMiL`(JOapyvC;l$7Fv)Z|Q1 zYaA)=AyrpSetvdofp21E5@-d7cmv};@YOPbpk8DXV?7sxj3=WC(^5u8QzltPQ>NLB z3=c%qrn8C8VdFc>3pzuI^Aax~3+qe)mRSP4OdKpyY@pdEW+qlPQ7$1qP{)gdiL;Rp zv>i==g`I)m;WrA0GlEc>qkzOPn_(N*jOjBDNbV(na;*O2{aH>$YQ~i z!qm^i#0TndsWFK%^0BBe3xm&4yOEJ$O(P=w_?j3QlP^;^(?LciK2Y964xTIyQ+6dTQ%+&b z&|zS3(1V1}geFD?0|v-_@ynVR8TK|YGF)pygpXY_BSUmEBSX)0NO+_`={soWhbE?^ zpq%o*fbk}z{d|E5y!<={+>HLu$jHmY$|%mn$;iYM&gjmhvHI|7oPP=YL=6Ea%H%^(xyWa6mK@J&pONtj8H zO<+I7H~U06nYcK?%UtwXQD-i2EX15an4>3nN2q3nN2g3!=Q8 z+X5+XuVh2w6SmI@RwfjumJ}4_r)B1(CY2^o~T5St*g2xyrRD0o$wj9IxD3XCA``Ot#Mf2^&H3_`7p46?0=@bYbCWQb~IWKe;I z7pz~(ZHx>d(D8-~(EEvH4x_q1FSQ)BS{t;I4!H{ex!v6nG=K}< zK<1c}lb;N#+!`1+f{T}YQ1OxrBK$!_6sR!1&B|~^LXnG|6Lc2_i=woa6b~l{yRC{H zCx{MI3E~VC&jOt;1e(8XK%E`p-!D`RUBxJ`GDCoe+ zBxA|R#BIW=&CJB7#bwK?Bc#m9#HYY2&dekz#^WRs&JNn=Qp&U&)KjVYtU}&_vbKTw`22URb{bc7GknNE{`vmLBjJ#8zMaU+8G%{+Zh=o+7anf zp&gPwajh52ODzY75hNg)gblPo!`*HSMB-S$cpD;ka@<)Fhxp{MNo(v)aT=1=MYonWRhbN zWaH!JpUaFF(x%8P7XFuxhg!NLw2eKKHTWi(_Eu!6Yf0FryIbuuzM>||tkf#jZF zos0~OU6}6q(TQ3fXlTLQlLT=O=;jt_eRhT{Gq8KQn3b3W*jPR?v3`NMCl2BsGq8Ia zpzZ-3=MOrX8kD}Px)>Q|bTKk4>q3MNXu?IYn~|XfdJY4uUlnr%)jh=}*$@XImrf87 zO}*k0aD#gT<3Gr1$4iXhMUUQKvXK$A_A#rQDV8N}J!33O+&?CUIn0Voib6b0Y@n-q zSXpKG_}Q4anAlm^nZ#K{m^7Ib)-tnPU=odsW|B8%vf<_uJ_zDVmFR;Lg(#B{M5lld zFW3ZTCeRXVPF8+aPBBY;CP_vCefAhWb#Tw6&hOnhv7ynJlz3=9P8&nj6sxyWIQ2Q&O=7a3-?O|k?(Zk3v8_E9lPL#fZbqV5Ai=kFT{T!`>lEz8Jv0<8Qgji z={2R7ks+s-5%Zi~v~^67Z~(gl%fNkVZV-6>AAGw3XmvX1&Uf*EW1zvrtQU+7PgoS0 zxIi;N95Nr7Ktp4^OuQeMG?anK+p|!IxnvGx35}fbcl52`GXOs4ryN37&lxMJ!7ZaDuomq7UJ|oIXZ|l0HU; ziavz<`k?N^HNOZA*P>K#Ptai^=oZzi&5R5;SV0vWKNBC55)&_zB&ccw9agBrB*Byl zYK2~a+W!E_ey)B-2C;rd2E~3v{QCDZGKBRrGN9M*8fg2Rz$=ea%fR=Bz`_nJR-Bky zkOP{hVG?(+uxE6b1UkAlt1MP2PBxY;&X8dqn;H|J5IYk)FK8>JJR=hy>suD+5ri*T zWS_FIJ!28&<=|r#2A`{y1-Wpf3lhOj#!%Xv885giR&j-c)W@d&1Y(`9+ zEYeJhOj?XQTzpJ^O!7>sOq@&tyymQ|JnW#kyXlNfWlZvnweWhf!4=}ZhzW>zPnp2T zkUxQup=tsm+!st>WLPl)Gu$gCLCQJs`K>Uwi91xmx#cQS*wL+t?XgUXuB%J7N@ zlu-GYxLH{_INA1t_610SZlPt-G9ny8CNnZbPiAC@n~VsD zBB(sBZ~))<3p&0Iv`|IZA=aLQA*TYgRDwx_iIt57w9J*CNd&wzF^mP=90Xg>umNiS zfys#W`_;*e3@;`#GQ2^upAEFVmVto**E-HL(CIpmE4D%Ps6nVcqX8!rgVvUV%I*`K zN=(9F*KmPP@8@FYV&{T1*nL>|7_~rw;@}Gj505Db_aseWWJsIB$dCnf1861$*E;ip z(xUWKaA2gsLgNM_L(UCGhF_elY(h*NOdu@E#LWc3pxZ3un0S~uIUwP$;0Lk)!W2Y4 zc{+uW;r$dwhR;(F@xeG1q8?|x6I@vgI=I?157hl-anQAAbZBQ}$l1xru!~EYibOoN2`66ku3FVOXexZUAjkP2EeDV}f_)OjHYVmI&-1py{LHen`JN$B~`paP?S$)6c~$}Po z3^LOh85E`?+-Wf#;!gB+{J7oeoCDnzVE{T|G*F+5A@2?&LlgLRYkoFX?p5KZ~a`GOU`;$gmd4UHhT#!hMb{DDIpSlQU8^ z^`Pavu!5sJ2SZ*A!#pM>(B0uIJfKl2CN9vXRShON@G|rSsQm&n5b@_VgOR~^1|vhj z3`D&Ra&5^BMur1u{p}g;kopF9_<+xYNA%|MQcFNC1#f~#Eh=JQV5(%ut7KTm#Cn2> z_b?L|8ygb`2Nx?F69*#`JNF4D;nPe^XTT(Ac7m7DmPrfbmIqLGpFnc=iy4dzzh^Kq z{6})P;Y>yb%bA$&&R9Um-QkI#HLOhH4te&B4vygU?Tikl_FN2k)0h}eF{!O#5?s#2 z$)`GtiFYa!E0f49CgHhEO!L5`fUvB{8YbcOOspHgB&dW8V%h~Bc~N5$WYlBfWtL>o zVpeA|07-#76aq;H6J{dP=jNG=42NbiG8~(UNT2^^Lel3G=zT6cQwjMaG!NX~gVg(t z;K96Spt+R1P8NnqENV=WOgwC$6>6ZNB2^|;CP5Af(3Jvgpw^TSBNOQ6Dt2Bb2Toql zt+6Z$!r(P%rYsIjjf_kNOd^aTEM`pNjJ7NaOzeVO3<6;gevwCQ{vwCp3 zvw9>kTwqaT5@KXw;bW5C$jG{Zk%f(mNqRfz?oO_QjI2i(xtKUuxR^jBKR**IC#wJ` z4~8-6F_nQB2~4bvnk=l$Tx_hY;ETK!!Xf^Un2qp<$!taj>)DJ9cC#UI0IJUtp!orI ze*>Dk!9ky#pPLI#ODqa*@{A05-V7bA!b}oOd>kyGYcfHx&rkrhZ^CRuIj~|jBg6XH zj0~G*BjW!E)NWk$7c{)m^I;(-Y+$F)!H^fpFppIeyl{nunU#eXvKPe}abxubsQnUi z5dPJh!^q$`hmpZ`4kF$f=P)w#%wc3eKj*sx?R-$EJHY-2#ajd8c1F;^aRi7ktLI|K zd%?u8hEhE4a$#o@ zQ4w6@;Lel_75$Bf}?F$nDQ8jI3NB7qf~oiLnU@GjXu-3k!3K@iH+m zJb=2RU@jwr0Cawq^XDSM_3&IqhBI>!<8`q1@(YadLs01nE$89=kA&5r zT)_&;71fC>Nx=*~?4ZSsyaIYmOiUcj>@02UTudyioIIRN?4aW-m6f=z++<`hQDhQhVqpVKu5mDNaq{uGF@fj4G?Dvj2x#Gu3~eL`7ewT9FccIsq=D=g zWM*Yi2aQezLnaGA=VwCgU4Ufo#`%m4C+0IUoSBbEFMGxcJ!wnOH^Gn53CFIC$AWw?uL<39?ABvaqtS zav3st2{5smtAkn)984_SOsrb+uB@ywD(t+KOyK-@ossDR_+Ze>OiZkdHzC2o@F5No zjs*)4@wk5hBg44`j10FHApG-r0VBiD1&j>n>oiZG&%c$Hq*fH?q^1@iniLvZC7HRY zpjkQaRZ#K8pf)rt0?;M%z_Ls%6ByIM3*1Wj85tRh+Ce>BE+$?^I|eU4(8VSKTujDH zA|iq@tdU$vyx}HHTnr4cETBnCh*B0_W;;;9{U9FVKaYiobP~Ieks)UxBSXPLL^^3% z2ni5axg7%?pMg0u4dk!##Oze?6*Vji7=yvn)i(1%uA9op(7`Co#KXwK1d0GI9$gML zkb@kVte7CnrWqO%Anv%Z5Yc{kwvds5X%Qm>+aiQJG!{YJ0jsaj^KE)+NkLJ5a&mqt z_@-Qo3k{6x7|%B_GG1t4l!Maj=NlNg7>cGdF|1(p5E5aMXJX?}VPRupV`gRKXJX>w zWRqlN5|n0R2OZ;F#55a}p%)}V+*h#(5l-EU7#Zd)Vq{pc2$2r1E@EW3zlf0`2AZE2 zK-cZ=z)08S`NbfYf=ZVIjHejE!!KvS!!Jddk(^P?k?c`>nHUx^DT;71DKW{OW9B@| z%zTcS{VX$&IIDyTlQIhn9~XBkBNHo=1|vJ02xv!`J5wxEH@Ix{0nOEew}-Mb?qy4o#VniZN zEJ`nn&&*3ntpMfK34-m+{ep}W1o^?_1V%6g;js4$axoOShcolC@Uca3rLv@Tu`qNo zTY_#rVPcxk#2m~L!ZweIm5YguxsjQrg;|?Jmx+VRgh`e|oe8v}l81wbiJOswO^8WA zT0}t_)Kg(%;Syw$W)a{OFlSffVqmCZxyH!k%6Jw$2IbDg%*4XT#>mCS!rH|GO7#p3 z7g8bN;jjd;9x!kTBSY*GMux;Ci1b#!1d`rx-g8k|oLE``x;IBWp#ii6kT0H#p=bjW z!#8GS7A6T{aTO+UJ~k$HUM40swgLeKNzejvE(QiYrdNzie4ttk;vR-{hcHJE+rsU<;)c`5n1E{P?HptRh;SP5z(Ed;lg zKwD>uPBSsAU{Pd}0I#~^WoF_qVv=X!W8`I02eslD!RzS5m~@yd7_*pUVIeXh0}>t& zp!S2pXfuNP{-)fWku> zbV5BO{0~6w3s{CIf0C9lGUP5}WGGyQ2#;2%eRH7Wl(75(voE)xC>0t5;tqlKj1Kzt zTnt5v7#Z%dD1z63OEQTtaWRTAN`X2~8cbeHqD+FIbsm`z|6YKa5AyH*WsD5ZmN7EC zM6&-YR37F}7!9`{YPqn2At?HN7(TGbGO@BrLVC@zprQio;R8_n9F{}E4`g59az=)b z<%|sB%Mt#Kh04S1fzdGgO7n7|HnK4ku`#r;vNAC;FtIUQfSSKxIU;>+UCzj`XE`Io zekAkHL(TVrmXol46wLhM%ydvGnVVP)nmT0(u=ZzUC~{!7DCefEU}TuJ0`54 z%$%HJ@QNPx1x(wR<})!aU@~GT@@3&>mWULHQjZji(v1|1N{Hl(VrS@MQ(=;3;#<$k zy@ypoR6vZCMM+Xjij#?(Nm5o&gNI3-Nq|#Ukxzz|k%@s}B@>G~1A{LUH1~V*d)WAxR2W%UbU^!0Sp=9=L4g~~6bVi=pnU;35O-9pM1*h0N=Ak$D;XJP zAh}~1)E&6mmFZx2fUX-`z*quqDo8UFO<`oX0<~YCO@vt*G}>eXvH1bi-VaFja;;)y z5M9N{Ah`YTp5x@~ zvv4qTv#~HTv2d`8SceGzC+ip)zOG|r;9HLfkJ$B$3~B2z z@AJ5Www|aYwYUWA*W%2oRHWuMSS&dwu^36LB)=pv2P^?n3~G!`V0;fbJpV2uXp?J2 zGo!h;g{rx|1(Ugy1#7lU&T~d{J_{~TFM~;zg_Vhik%x^{o7;d(pILzWGb3n{%5(-3 zKNIM%bl%xa_LG>Hx|yVUm{{AGWLlY6p!^YHUQb7pyljGI(xeWC+}d@L$J9Mur(185w>+ z_dCph-j|etK5kKznhNtE`vj){jNpr^Pcbo6qz1AEJ!fWkz%0+i%f`#b{F;&b9U~W$ zh$gEJ$a`u=8cfzK0?gYP8I{znIayybay(;XW#)xo28J0-ENV<~OxlbVEPCuJ3=B4) z6vHA3_Rl7ee^kK!X{dzw=fg%sI^o#F$iTmekwIt^BArNWg2=n279p3RI5GMf?c7PXm?A!9S*oGK3JzNrP+%G09MlF}lOy(|+L zcSAP4&xcT)pwXiW!))f9YoIbyF`FgFoZ$%z=#G01CQc5{<&4ZL7$roQm^k=&nM9aG zm_TC@T&$vu2HdQ#Sy3@>>U#hJ`2S+@GS% zyb^FUg8Fyj4;Zg8-)Cfez{n4}`k|tOh2bBoB9kf?=vHY?rXZFWW-b;PW-E>ub}kN4 z4gqNaPzTI}DVj-vNt?-rNt-#8%?5OL8E82c14BbC#GRlcjX>v;gW|n(3nN407Dk5F zEeLlmgt`-bz7^q46h|6N2Aw(>rq9Jt(aprLh)s=&mqPVKx;mnwkt3TW=QKORJ~n+OP9_mCJ}zM%0U9G7}#o zCkHQ^7!wDR7#HXoS577wCKeWHHbEvmMrJlPCN4%UZYfbEW^qvMaFm^82RkdPZ~z|< zFX-NH7G5TP&<#Ip8Fd;Md6@W^1em1FMdG!Y#F(_0M8rWfXq}B6oTtSk!VfxsN<&v@V>NLztbHiG@iRWCsXefZAiR9pY9{y7t-5$Pm1pks)k5B3;Kp}=JpcRb_43bQc?l=QOJ0!eTY)9nxo!c214s2&+ zIE-Z9MW}tSbv}2X{c)ImDe&~lQjnI<$WW2ZFo{!`3A95+n~fdR<`8GHVUl1dfZ8Xq z0}($eI~WkIy8^s^58U_#*9|J5hOZsN3Qi@^+#~45Fa`z# z$og?mXfiNtfZErAWZ(21j12R4FfuGgvhN@c`(XZqS;=CshEbo9p<*K=1L&*+IYw5n z#TwvSGWnReSXh}r`GJdpfse_MsfeMV0}{R*I}zb4wUd!SZ6_mx)=q?f-FHI#i>sU} zN(HAL$Q*TcJY&Kh(1y^8lS~Y+IMrC#nb_GB1VF834kivJUM4Q_6^u+GppvqLG6b|bliaTmlLu<(ZU17P8RNLP?EZ5&R6wuIN%GdipU zEl{nP%)&5*3v`jY0GkL07ZV2)7n2K8=NY*eDomJo8T*-HZQ_oCb_0B3jFpHpXOd-P1#ixL!==W=caV$s7?&`UH6tt6 z9>(=toJ?#i;!ONZ%#17>xHv(F^04u6a58ByX|f1$iL&tB=3;rr#l*qG#Kq3a$jL6i z#L3O0%q_+Rnp0(FWfx}!9XP1T%D$P4nU$4MU>TPYE9-tP*?nBBd%4(mfp#v1uoyBP zV`51MZC|Kkj)WX43vnll4f9b(78d4Dj4Tq&=1iKJBwRP_M&!psyBQgd?Pg>+ zyBiU%pxpFwHzUIw=z0WLd9wrU9)je=JXpmAT9KU@&z2z1aE+UjiIYo^iH${oiH%XK zpOI|_BNr1JBPS0V14AYg8>2jf!vu&s4E7-6*JBSOL&zRRhKN0gd{Vmyl0I>bcZ2dt zQHooBQ2=Nl3Dn0*_z0T2W{>A$sF}sY5TMA!$|AtR$0WwW&cw>d#-zl|%*@54&dAJU z%E!vY#Sb3tR%E)#$Rq~JHwhCV?m7Xr7nE;q?_p$kwuh176_UFc_Cnl+E8i4=8bi?i zOTq>L`iurL`dkb(U5pGZjIvC;;EI!ljgLu;m5&j8Ib{h856J!xQ2RZg=7a2y-OI?3 zv6qn{doNPBK;>ca0;6Gx8*G0mYzLLFf+={R0XsuY62lCz0|b~@p$FEoGcbg}#}5)F zLH)lM5id9PGBUi`%gFEn$$p7_5dQ~2&l!R3zk%7GUS5=00$yvMa1Rt8p7D$cy77z& zpy`;JHfDx3jA~4LY!Xa-Ov(bDOlnNL%rvWw8H}^7A1!+UqldyHz#y z3=bG(Sy;jQfR#D8n3Y+XKps_N3Ib7}bqZ4<{yl+Y|DFAe3?KJ1GJHj{zxV(V_QS^G z#1sC3rs7tC5`s=VV}eOMH$%-@R)!CZifn9*!fdK+d^|!-tSl0s)jNz#j7&~Upi`ci znb|~`SU{IZGJ#IjV`X7wWM<^$Qe|RhVrEog0-ct_70<-N%gDmW#KQ!dRAd$ao#VhP z!3V0P+1Nlk^jVl#nAwauOqiUNnYh@MnRuC5nL#Wr28MQKra9mh2B3AP(;@yoZ~##* zUOT|ZaQ6Ts!@~oJaQ_VTH?H<1INX!-L3=qs6R*Ms`TE=pHNA`s4a~Aka*UwXH5-!# zGSiXVGBe1sycb$-yMa z#Kr|$xd_5KOajd8%%oS89fM^aQHF!eAa!_32o zdVAwxMuwe-5$nD_K<`D6K-;Gew!gTfC^HXfGA*gH1T?0}BtC($wx5xkp=LfK!#!p- z@Htru+nGVj9l5qJ%R*9b8zT!psK$aw+c6q~LWki2)SVnh5cP-55k>};Ba93hM-bs- zdISI4sKGB9kI1BsW0BZ%;s za)gm#&Jjk21xWU8g4&C7J_=NCr=}%>w?c{=v@n9Q?=nV)Pt1x;pvJ!vBP(d09OQ9D zCO;-!5Ci1#gt-v=IgUd71*#{+jxsXn9%W=OJc@{)g-00~HXTLWhm`?c*YN^vJRlc* z87t@}j@hi>89_}jxgESIRbn1H!!<@lCO!@!9&R3S7S2TmGK!#)Al29UA{?x2TwJW| z3OqdENkah+0X7g8;t*gG09~5EBF7^j!UMV#kDZ%|iwAT@CJz%63mY>NrzInkwz#D* zzrY=R2}b#~`qH3f=IqkSBKBMi3_dIi7#V*tGf6NhGZ%vjiX0{xrU2$v78Y~nE{LZ= z0kIGg4h+X2LZEOEKgP%)b&Qcg7AgknkHhLm7@c1X-!zbvnwDRb>RJI_;>yS%!N_oc z8Dba%1A_q6{0yjBAoDAZF*4L2V`OMLhDcvMP$KsgV*(_X@j;TW?l zlLVytH(=t2l|%_p`))wZ1KIcf7$d{?V~h;Hk?fN^4sjyP9vBU?FD<_)IW;{wBQ>W0 ze7mrC!cx#_NfO7H7|t;(GAT&uh=W#AN`Y>#V&P-bVB`^$;sD=%?PUj0|5ucAP+@XUh|e4DKfw84{r9RkuLtfX$F`E|`6w@vS1zk^%96c})I{ z0VV!i3=)b=ij1omnamj{g050f>|h2RC&Sjx%)XC}Z6}*Fnrvg0Xiyh~eiOEZg7gG*EL(-|0;*f%h}X9b@?-oVTtAeIK({3gv(18got}L=l987IY%)(6aj658IECO7r zOrlKUOuX|z=N>W%uyD*}QsOq?oWUf{qagySjTsm!SY9$Rr8DUbNdcR9_- z5O=`7I5cd7(6Dq+l$w*8Sd8%h0;cDz;1wr}m>DG6K-Vfm0^kQTlPTjS zW`=pJkZBmuR164nG6~#b6k_7M%*fu#1PYGJj7&@#Y<4U%V864ng|c!n`v~zdserm< zES$<58tz*dLB{|IuyAZ=6kuM($S%qx%*ZOp&detWE}&UKdx4}`MHm>mnOQuToS7V$ zRxvWEF-EZ{F-fsOtknhSQ7; zn@=+`Yy;_JU|;~1*RXvFuyTY+jzL0>p^c4;33M4G1H%TWISgkI;Vg89kwNkdBZJHt zMEX`a14-Yw`YlO`DY>B8WpK$1n&y_UXPCf-G0n~J0cu|Xl6}o*7#X_GFf#Na**BF) z`#@VZA+tad_6##HEi_mU38x28^FZPB;|wFi|1*pXOlJ}P% zscAW>$>2G3urD?A*%>697#6UpFo}bz9TQN@gW?8+8=&?^K+Of&TX2?}3vNyS;q6FkY162kIO@?!9d`!{|3`$Jk=>i4=s689bA=2r=bBqj^ z&M`7vJBKI_K7#By&&YtjuCM}a{3|ghCp|F*RF8^pV4MOuKV%)Gk@kd%;T4XmgCBRlvyc6+8cCTB)(77a#l#RWQDat9N`f{l=H@PHhX$p8w6=<|#W z>E{_4vd<&JVI@=^R!?D!+k$F$P$LI4Bvx<&bi%WJJ{N<;N@j*R?22rBT%eI_RwhtI z#mfYuS(&(4gqZk2EkqEXMSw|=$(oIaO^AbsO_@cISz3~lPsEdpfx(g`fw2wNZDt7A z3~}!dsCz)}<-NejAaQ|_LFNL&y;>I_@d}GC7!8Xz@czAA*fMc(2W5LkhirQ;28j)f z3~d~WECL*Stih0N)Amg1pynqi(J(MDY=PKcaRCvZy%!i6W?f)pn1^Kl1*rYF`eV7E zO;!1Mun$tJ*|z{JkP#mLS98q5W)834`8@^NW#h%#}q zf$o2@6_i!ghwQ(%Vp_?>B*5qab?Sw!5O-=^MD&Y%E;2GiUu0y6zlcb8GcPhStO2Qk z&L3CQLh7G}GY}dUUeN7WFm6g|Zb3R|qjM>E?zMsO4S2op2IhJ$28n&F439VznMA%Y zvOQ%4RmPwL=hc}c*@T!RLA%(vSsB^og&A4X`R*`r-DFzDc#DbaI@21)DiLum28LP| z9i~!dJvMcwEsRXPjG)u_OqtjieOS1er!lheF>x`jVr1cBUc<;L2bve%0r4ltB}9Bk zUSecWxx~nzaS4$goGwAq1Fm`?J-MJLKN;j1VS`kCMgtywE(VEyMur)jDr}rgY)o8i zTx{at>uf;VNti%KC~7dpLIWFgp7&0OJ0>8xWBDaUhE10k8MYz0;}QXPlXTQ-ulQ8a_7A#zki{xec@3P8slz!E?%^xC(Csi1_b8PCNa5y8jA z%fiRb`B+J%LBT(f`^Gqm5YJF3KH5EpzfG(1<}r4dxeo<_Z3El{Z|m- z%y^ZNLFOtW!wP8rdQk%jU!SWG8s?tl#NxD~{M>l=;^f3UUylQ1HmF|K3eK;p84vK_;M1Ca1VbxVc`0u(3i630^ zDanb&CHd*7o;7gMXEf+z1f}^ej0~H&Rav+=M3^MmsvukJVp#g1lXeUY3=0lI+`(}T z5&kmQ7#Xy#F*4{~L%1XT8pIv2eh#c2Lkf39dB(DUu@`c9{ZmE;iSH~7x44CvxR}%! zS@;y?*wq9X)s&5x1f;mwM41FQSeYcbS(ybG`NS0%S&dkk*jf0)IeEn;)-Zyask97fGA;3j5K2{eJG0=I43aof)f^~X=IJ&@&_j&?k>22NM~&~ z7#SwsU}Ttj1Ch>F-oT&Eic9hfLNZdr;iV1e&;?OYQeVKxaDxvt&(F)u%AyS#bzl|+ zjrQpF2i?F3EAL=5EWLy0*-;#l zuFq&70&>V)Muum68cYIgoJ=N6T#Vol(t)*s6i!3zZ-AN)vVX%(Muvko85vIAM8u!% zEk*|aTZ{}0@sRlPfR5A5K~Kj>;Sru$k`bJmn~0bpFUU;ENrl!l3m6x&fHw;4Wt`8* z#UQbo)r8mBgJBiFA`>Tv90w$hvhyaQy(MqR7N&^)=E$nRm#NA_=S;;ol%*&lZk_u z-2)t33=9hAAmOzD6c*6^(;IIwGHkiU$gmwM2I}v^;s-{<;wcwa@iIv;NJuc85dhsr z%gDgs05zB6HYB});z9j3BZKj6Mh1u5h3Pe@#L1|_!pZy-;#&rWgbR>xWw-+o0r_9x4kLs3 z9YzMJJBWN>29<|}D~yJRFE}HBx^D`Z@{9};c?{PC`ItCaIM_HqQ-X{vY%ENI9H8@* zSwVf)cu=1e6tx$i_IE(d2iZUK4kN?TJB$n~?;yhe=^aLf?{_fI;mbhV51I>h2k0VZ zafef&B`^8*TnrMonHc^FDl&1hi1LXr@q>C#90Dv-9Gu*&LIND3Y^)rh6)&Pp{GjV! znOK>@fyvFz#LCPg3qJA5lckH1QHn{Gk&8)>ksXvyA2BkqGZry07+ivcpT}K9IUIGD zks5* znWWf^K{sqMGI6j9@Sf#oKF80`BnG+^lNpq6`Pc+FAUR!!iJL=&g@s9+pNoZ$iI16` zkyDh(fK5sOoTnwZKr0S8Z}LD#wXX39vWiHv3bJ!4-52D&BFGb~(!wah%*QHX$!^KV z4bI@1ET}Qy{OgV#j zc)3AGn;2Y!gzJKPh;+H*9wWn%dyEVx?jgeU#XUxb_xCW@|6BA!%1c=KEGo?lPE1P; z0L|RFftK)!E3|?R%$1hsW{^0{$go62kx7JuiJg;!pG}+zG-}Pm#>pfIx=Wjr3*_Kf zrWjDXD>8{NGBI&7Hbb1nz;GSnPLKPD_FKe#Muyb;j0}1A5$;@epOInveMW{o(DhC` zp!IME=D0+DGH7>-c)%Lac>88X(1807P>IpP#PCK0v}8+&Nt#WV2~=G3Gih?juyCIg zWIZJaIvqayY++&$ zxCwDT#{)$A)p@|kVD^BK!Ri6R{do@<8Ok3Z`ZqPueTEts>-SSrauF2|WZ*ruqNE74 zsgi3tmV?uKHY!OY*z%*n*X#{;^m7qqIMjg^UuO&fGG7ZX>a zCKC@kE9m%A9VRcPQpN%Xh8QMxCVu9ZuvlOyxCQaYg$EEJP&xAW0VBh^2aF7#ko+O= zkdZ}^ zprIGYZDtlsUZ8Z6!X(5f1}flgL)?||5aF)6hl~t;4;dL|KSYG@_lJxOT#pzTPQ*dd z?Fs04g9p&g!O71{^-C>x1qG-tq>R`FXu+K9 z1`)n1jQr;r`PGG)K*!e0GAikEF)$c0i7`!OWSYjvl*=T+><8*Mhcjs~PG@4_WM*Yy zXXaz$X9XS29B>!v|3?V_mp@`;sDH%B(EbSF|Fw@88MZ${l<%~PBsMYfaq>DdOp#FJ5P~EZ9?(64tSo#?!c6SSA)_&FN+AX5-5@w7y|A=+{y76(JqyK%*defn2|x_F`^y}0N*0RfN@?Z%zdDx zW8j1XstOHC^cfAjz~##a2>}ik&?poamnf5%pco&AC=(OAkSGhEAQK-u3p?moZc!#y z28KAMRFI1l?nB(O0LeY;9y2l=dCbUg@Z1CLz6LRFCVnPqCeig` zOxwhmw~Ddu5aVQ0x+=_fO&GK+Qjv+1NsNULbRsO1pu7m^*nJb0J&a7AOj1n7Ozfbt z(~e1$(TjzNnVE%^nUl?c6|`>o0mOd|PY~&%{|O_*>?e#2OP(P7ck2lw!;>e7bO9SL zeSy*Lf~E_HRZRAb4uPOr|0|;jukma~hJTWvs$Yl=wA7V}j|)6Y#m~ep%*Q0c#K$Df z#Jy00cZq}$pC}VQlb|waRt8+@C$W5CWV8ik=C7c0g@jnxnL#K0fntY&A>k3k{RU4F z?stC5$l&&rk--xxhPORhT#%WU2VTX&B+4Km%CJvLgo%-Xp#f^{jHifnxZ)`z!=9&% z3@4r%HNSwHL*STCxXc*Om=GJ!n2-a;TnrN4e5|}B ze0;pOm>4cdX)tjzva;~~P-FjW%lgfh6;u#2v)@+ZyQ9W@Q;kiCpH0S^$%%=B?X)=G z1#x~R5ndffCJjywVJ03RUM4I3v_*kpC*cp}Cw?aabfnmcFNcb*zhNzb|J!53J{)~~~^)o~` zgg$3vD0t4ufIdFlfHsc}y=NP=VL;r#U7yjQi%Fl+pdGY}L`R>|0EEN!84bks84b)p zowp(j9swhMHg+x!dGlY)9wP4i46CHoz$>P?*o4n9@|>11IwQe0Q-*7S3>%x|O-2qL zGY(L*ft`t;3D$IA=TYP1;*;YN09}{O4Z4M1P!L3N2?{XrGjXxK1Y;apP}-w_B)J*m0zHvXF!1jIxY-! z0w@QAL^8t+8EqDBHX$Z1RxZ%7kIwK@iWnFaUO?>ic!97t_5~vY=v3?C7l?S;`ht<+ zC`b*o|D*t2f68+cJ-y}^fXh%&D}qV9;6CV1_j{nLSS99wvhy|;hBY#v?5xQqz$M5c z%fx+LiuaTh_eVjtFM`}$lAv&vWo2SzWffDtD1tVScS%GV(w@&^c>x(@VO;@UqcI1R z!MR!3n7P@wStC(K=`11no#8dap9U`x>Cx>aBSX+jMuymz2!A%eWMt@hiMVg&3Ur-N z!~}GICKi<-c@%Q_yBVmBQ3M|U<>8HIcp?Mp9I`WUvdMy0o3E8*S|`b}R+49vBR zgxw3H(SsU}sTHZor6u46%MRZ`{kh6zbGZO2y{v^>lh#u2(3M4SVu*vHJr!P~;SkOp+@#mDyQY1s}_TcEN%6T(SLgV`JiD6k$?csHrH%ngcp2(VB_#krMk^ zdyWhCtW2P>C-(bFf)A9K?<%oL@jaA>6vlg)`I$HmD1p{xfs`=sRg&WX&-l4Bd2xev zad5FNWt7;@#Ex2uZ(-sW<786i;Nuc!6JX*~;0GNs%fn^Gx>la!ki4Q1S2r^Y6B{F_ zDb2;i#Uj8a#U;!o!^JmMmSc;okQ5t}n2<1=CWb#LcF~EX2s<$j!*JPl^4o62CZ~ERzB|*s1*fpoOJ6+GcvIXG4kAEl4ce0=i`>v7I~$?zFL!gh9(~)`%Wz`28NZ4EPI)l3K$cZ zLYZDNG6gdKVPxFO$i&Z<%_Pmv$JN5fS;j0SV9IU7cb$=6S*T3VSR`J!h_MM=mO3#B zF>x_RF)1@zvS~1RvrlE@;b&Cm6y##&6cONJl;@QYVP{kqoWLjnt;R$TGs5Ad` zkd$jrdr3t@(I(dH8sEGZ;FQ z)R;Kg_?Xy13u`{hv3`-`;SgZq{3*wC!A|(9yaWq-vpj2?yzC))(3P<4N9}ly*zp_& zlY8YM+JxA+RKWusfh=l_*(@n}yfC8(J3o^+Gb^(gCl_eMhl!P!i%E`| z$4@#KTnUG>EMjDoU=d?{!pP*rsLW!+9M7l(N(K2$+>D@mAonn`a5KBG@v=H`aI^bz z32}ag_&98E`}`pkP}2e(ZX;5YQMu*g#Dpk85t73GBPB8 zMc7~bm5}`fMX9N|1tpj+c!kde0&GzKL(K=(Cl|jmGTiyf$Z#LY{`XLMSUm!x5&loD z$SeWPn+PlD!F(UU@JmIOLx_!&3G92&3T0y^G0<8^h6Jd+4&M;|&iTg3Q2ULMVbV85 zdKCZ8$YA`PkwF5wE_p>0Bpu2;fY7M+8z361nZ?1C#U-h^?)gRer6rl5RxXqH0>%}P zxyyUZ^Fec$foYbh=a|6hm7DhqQ<_g|0mB4UaKrztI6G+2iiPQgI3E)W3l|eRqW}{( zBP)vzCP^k%CP_tcCJ>Zi zWo1-@oUy1oe* zNP5DxpAB@s4+8^}GlPUP!xL3L78X`k4(I?d2PYdNGx(f58|dOn&^|h-y#hZF_G6Yy$BLiqIR^TThd?lbWr0DHLSb9bGoq?r3BZGt;!x?qZ%nTQ3 zQM)>*fGB|4mjE>nls{{KGBR}hWMt?@vTr_A9+od*G&cLZK}cK2F|Y^pzinpwFl%5-d~IilD`-k6n`P&*ZUVE zL)b6O@m3D>em7F=#-}HjLoZ1%SOFSQGXOP1P5F3ucQP_OQwKFgxfiPNEK}iRQU$Li zP~cz@W|!b(66EG&WMT)+G%|sPiCtN87*(01KsBHilQ<*z1cVQKkoa2h3lU$3LGJs- z$Z!+M-J-u48I*rBGSoolL@OgV2hT4i zhDjQH;E8$Ad<7VGyv2$)7Rc5a@#8G6sn-K33iqCNRM;K@$@0LPFe3+>cdRpQ(yDaWe^Ua4|~r ziLyzu@v(@Aa4?B7u`}`7vO9{faWk>MS7rU6DgYY3<`U(R`Yv&e4I>* zvf_N~JPnM}sUi#v(JWz1Q<*`NKHf|MjO!R#c$uBpcv$5)c-bKfaUKXm;zi;w!rz8} z85vyvGBSAnMff}aFC#SRkCwSfG>7 z$RM$tiD8=-9}_2=keHDQs3PKL;!)#QW@XZo;$-62XJz8o=V#&vt(iE<$Rf+=$iNWI z#LWoWQY;_}aqo%0h;;PkFC)XZzl;ojk=!f(kC8$4A0l6CK+lDdIRJ4tJb$3NH@+wp zx^oD$rjsS085CpM3=$4}Y`nP)d$d8rDq>8+kJZ_psY@_%i;1%E3#za)F)%D=WZ?l7 zg4~SUERsyztP&i&?6wRH3>Tp8t@wus-|7Dt8J7QJWLW(V5x&>|F)}>)hZMfh{aqSp z^MR>o?gg)O0!@q>OaqlfpdPy-s5AmyvZ$@W#JNEnHc`Q`R$Q2aZ<#prVsSn$7Es5X zMM9F7i4(N?gMmSZ$(u=;(Uu9k#@~>Iol%2Pk%^fRyk-`ZKMsgN!rkFN!XIJ(85xrQ zGcr{FNBHCAe@2GC{}~w)pz|~`rI7G0`3Rx0gga=Lhj_pQPzE{92pSMB12=Glc)OXv zEpi@SDNs+DVTz6-lN1*VH>-feSq`K|i%^Ru=Q}aDH(!gfu?TYTJrHBQE5^!q{1Y^D$K^s zY`|0rYRSYvJ1Rn)oP6wz8r-Tp%-p?<0+3ca4>KP>j~EXt6X<-K0}_z%%3xrE-+xiY zz{JqVz{JqXz{CJby`Z9THh9+(1H6540$Q%X!YMZ~2fRkHz%-w+APlscYAqu}lb!~X z5EF}l2rmzlE*l@{c2-a&qQj)gq{E~HawtQAB*gv~NcR6^U}9imWMW`rMA$C?IzO0! z0e-&b6lgwy*`JqM4qD(2n%!++oWNMm$RIJ5kztjdFbf}378|(U&j;mG0V#-m35-k( z8qoD>^B9>J)-y6OoMU7H`x3O5tA~k+VKoyIg9~*3S_G7Sa~(B(K1$LnA<=rNlr3mh%zxV8l-!sS*BiQO7lpS%}_|+ z#LRF=PlZX4g_A>piHV7gN0ftmzBcP3P$uW%ovXsOOht%;okduHLrIkhG?y*0Q&V7< zCOZ?)e0}f+{5=B9y9GdlqwGv_lk`CoVFFCbOO>GQ@I^|Xb~rneEQ>q`E2yo_BFrSn z!Otelq6*#6AjQqf$iyzs$a+!<)}Urxq9i+AU*Vaa8lOHtuaFp%G>bHoHYdNe7?Ug$ zA1jZDG`qB@h`1;dcp{{qk)?p?G!tkAZ670J6C;ZS(>X>?B_2bjG(j!~hH54OMimw| z<`gy!R$(qtMrI}hPEQ_7?#oO(9^A5A3Y?pm84k!p;!T1Xkxtc_nHY?jnHU0?5%IQx znTg>rGZVuXXnVt@5E5S#PD5x|dPz@%4tfQgX7*aEM%Rud*D%%lNP7YocUIF&Wy6jVQAtVnIXp#jqmB=KYyyKaSr$uee! z7Y2$Veu8>WMWn4W0Ga!WMXCJ*J20V zro_Y{$1kbE#>>gXEM>^Wz_62%MTIGdNuJe`shmxTNf6Z33}9ksRA=D?dpVDdopmuI z2Rl3H>h%N_h(9G*nHXT_6>73FF&MHkF}SfJ{8`1y#L&jd1Rr;T&GRXs%{znQzbG9% zKNWD6$)6ikTtH*n6iT-;G8{1kEm#J{E2w!1I&zC+wI0(tJ@&PF>>Kn<*XuED(PQ7N z$G%O^9u%)kT=HC?Dyj_>k^G?Yt$>M-QJjSd>>pD$CRTPfcGgx)Ohk=0$QYh~a7YGdCljLBNy$f- zVPXl0^k)p{Wn_?e&B$=Y2-H*%W)s%sWa2a6(v)GcWK>n+V`K$26__NMWI%9S?m>76D5dIS6fP^>99vBU`&nLgQ1ecv_5Oz+0+7|&e4`g2| z2NOdM2NOd+l6}Qcd6+#g8g8GvGjbTNL)ZXng)uN3fZB6{15wZ3z`?}ug#(ek zV>p=@@;R9p1fb&c^`#{{NC*K=_(NbKNb zIAH9{#Al@3!6?tB%woZ(!^FhI%qYxe$t28C!o?{i!K8gyU+{=NGYc}Vf*15TSS8uHbh+4BMK~3?RPq^_w3D|p3ansacV*{fzYQ9k zf5F5wiJ55v6JtLkXcilk(dV)-*)S@w7%=xUvKg>mfJ7Dp14DxjB;B6igb0Dc`yM9~ z!*fn1hS!{k_+{pT$iu=JM#I7z>VLodJokK1BPSrwpD{pyL86(Fq0fwuiH8N`S1C4C zPEG+PCP7{%(4x#pCM^a5U5NbwT!?ZrgNuowl#7X>k_!67FAAG28OweEL@;n z!v>6@-~@62>aG`Dh>P|tf;>#T%uJw-dSNW<89}XTaIi8o=tJD;z=H_aTplKdIvys5jXa2O zy~WGKz{tnMATk}2-z=s<=r63O>mUk>@{@~FA?K~b(qcMd+At$E5gfQ57*F$oj|9KS z_#V`p-OkF#%PY*s#j6aZce8-|NSwUFe8S+_#9}^XP(zE2mxYg;_Y@Pu33EjzHYP1L zelAWX5hiICPBvjCWhPb;J|+$(SvD4SCLRrLL1ECo7j`CFCLX3_7EOLu4mmT{N1S}8 zIfYobn0WSZir%;5ePSp4*pBOo9n*GBo-Ifsuk84Ca&mKsi^#FrGD$FLuqm)|uo<&} zt}W(c;^X2@7h_Uk5@1qtQ4*J65@_Q@>2`5muoFISC%nUyXS*rS5j*x)P9a8CbuK0q zcGfIDCXuVA%-2l0S=g1tm_UQsEKH(o>`X#`*g>5=P+yMqJ3GsFQ?_5GES+ZDO=eQu zTzq_toC4A;OibeL%v?-N94w%51kjikcy)v{s~jsM=WRw-P7X%aFO2Nd8TnL2r1@mQ z^TY{ETN#;bnbtEhDKqP_EMQ_f!pyXqk#RpGOAV7WQz4VNU??c%zF}eFW0YaxVH9QI zWfo@RVr63F;Sy!yWfW%NV&>!I7U1LWVipn+j1Ylz3ptsE*@Pu|WO&%wg>&SXWi1rA z!q85q=<%$e9hqoxcD1{M(e75EYM z8}lzL#Okcf%@PI>Ps1!L_oU*8W@?{ znV8NoGTvci5o5jtK80cxBa;#6<_~5WCJ#n;HfiWgFCPaxqcS&}5Ids^Ka+@nu%Z|b zKP&5U=yh`p29A()utNwD4=03}7%mAhF}xH)#6!I>6GM+M69cR~fYpy0D^cSCK9wTX zz%+#uJVf%I$wb7slhH!j{5X>Zk2$M_i}_bZhBY=STzo77%&a^@JR(d=T!L&IOv+50 zOj4lb8f>!QN}XLrltYM#bH266Gb;fXA$LwcVGbT9VJ1-(@$1^sPqgI)RJrt7beP51 z60bX88qel!4(o- zFN6{G^bcVs1{M(}1`ZKKc$JATF|>&=F`R&wqpDlv z!F^(3SY@ZmA_Usg#m2(K%*4sY#K^|P$;83L!X&^I%EZbe4yv%YK%2|>*qJ$5#RRQ| zd08z$35uPOho4mgq=OZz19YG$s}Bp4)Lcf^C5-G$yd3O29I5Q0?5?aye5vf9X7B<= zmL-gg_DuH}A=~kOfzFnfVq|5~V$=qg7X=;=e?I{E6WWjaBErP*59DW2guhipnHaQ0 znK0Iab)c1d(AoLK9MEzJ7J-?J{EPzZ3=&Hj8J5`#uz>E&=G9_hl9Xi_X9PY58*~-H1*TTv^Gu8vnB>7^FVlI@vduf93{4LDOngi{ z;FWWnOtYAInFKg^K=H=O#=^wK#G}ci!^XnN#Ky?N_MVATn4e38l~0|Cg-xDGfJvQ^ z6?C(LJyQr9m!!f}R(T%KdFIUQ9IQ;tY@pM$IXOV21UoxBrwlg}=Xx`)6K1QJ#Ko9E z2cEODurjeRf|Rf^im-DEfd;a~{W+NgTpO7fS^28~#F)`c`L&WbpF(!tuVwm-F z1loSDT*xq;uz)8&2ZID??oydyi=#A?)OA~)JGP)LMVz4PR-B0;SDcBVOdR2kRpLwxTf~_dzCin*uyslvXy-@5+Pu)wv4q#4l}AeP zj0x88(DM!jVG)5sp$4Obn_LObj{_2=_Zk zFfn*aV20xlv~Vl{)vnO6G>Fw_G>``MHoW;Hc#Ro;IVmv-v59ZCm)K#?!XyY8k5prd zhfK0~Gf6NSGX#V|+|wa}D6eKqFfq)NU}9J(0V(rAB>MU0uzD4=%n-DU26WP%DT9P5 z!zyQ19yTU6CUzz+CSeAK2~hKYNFd@%Ns@`dOp=MgQ4-`gxdv4CI$s)dG}wEi9u9~i9uHi;ja!UCWc8;Obh|gc@>4-kos`V z4G0bM1}Gd0N=u4!K)1oc1YwD@ptK|@u_QSIG)i(opoRIo0OJJ#O)zP2UVw{1;tpsO z7qksAhmRAyhRmLilQ)E6or@6@KO-Lp6B84Y7#nCCEgO>}ix``d2on?gUPq>Vj;wnf z+4nfIFd1|3GI3pG0{4x6+HwA{WB+c)*N z$kS&u5Y*>pkT}c8$H(iQ6^S4HYQ#+HYR>veokQ_X-O^yh9H(sMo4j(%p}TK0uASa7>Ii%WD(_| zy(|-hlPnX1t1QC3AmxFwnC%7*=siK;`%j?xCcdC3KRF;1X_5{uz@)<+p0q9&FsC!n(f=WHe`2A&BCWdRWObj>C-1AVD3FG|26_X(8 z0K+|@c?IY$f(kLoFi6NSEOX~%5|UzMV3KA8btVr$-C-by2p3;DCWZhxCWc@+)NqNH z!weSFvDR7QaE6< zAJgwfaKD41LLe5BE)3)m^^%)B6GNyx6GNmt!vC4_ObmJQnB#~uknD$hJUKBh7#s^s zEC$N@j0WN0{RNB+paavMxC`^JG4V4hv#GK1GxIYrBs1wSFnBYGFdBf|vjFOz9rB3q zI4jS@a7CVp;krDcKYSl54=V>?G)j6%$%i>ZK^|0AsW7y8fLe)M3=E>6c^S~U4XAw@ z3P}D}U}6YRU}6YSK-ib70CCS5==>3^{|n6uda&I~&>c$PZ496?=mO(Xrt^&43=+qg z7&dumF)=amGD$JXF@ZLSwlgxaa&UoG5kxViG6gW{v2rme#6#j^1Co38Dljn|P+(#> z40Qv@CAii{rYD1X|FR4cvJ4+QI6%c5BMTcV1A_z9TmePIe1ei96N8Q-6N8~5!k^)a zAk!Hb9-yr|hxs!pJr{m2?ghqMj3B?YF#cg=Xkh{$>Bc0)%F4zH!c6Y$92~4r4C?EF zkDIUpt+tQ{RcD~sW?*ngfcSTXA|n6oP-J2_q{zf@9LZg`q3*&p{*japI;jm5;s+SF zG45yNW@ur&!N@R$Ndt7;FEeQ0d@2(s6Bnp&sRP=6$_24sArWG~f)b*hbW~zu@KR!8 z@Kb_>1&BniA7SC4p#>U?b}CKN)B|-O{Si0KvM40TGb*q!v@vEf9AXj%)iq2^A}mZ? zqAV=zToOEz;1QPzQ2Q4sA=2M5B_@WGN=yuAk?hCSE=00FGcUO)H8(Y{1j!Mu3~h|A z3~!iNSy(t&L|EBGIM`%an1q=?UIGWe1E~EP%7}W*MwyAhN12HsP#KXfN|hm60-)=a zVC_a&IOL_42NdO}IhBH@n8X(_wnI*DNCpj{wK4XvFf3wLV-gZj;oxVJ=8$0GW(s6- zV+vs6XB1_WU=-8j5dv?e?qXyzV%pCH>HC7+_aPY)KNpk{@nfsP#Ne&M#1No@D4(iS zm>3#Vm>AH{k<+;XsV89WL<+Cu#Jq6Or7%IM$@xVoh^Y^V5=U@ZuBn%k4;rC|X$M8N zXI@Hbg2T+}z-a zp9Lw9@OYqth%a_kCI(SeCI%^0M0kX#GBHG{GBHFz*ZIK5iwK8DNO?XaNI;Ez7J-8x zp9n#H@_>Z~lQr6C`@UIW{A)7?D?C@`xx-Oi2Mpaj|1wigQkC zVv$=;Vmi`&x)76K2?f$Al4@XD$qHVW6ayw7F@mW?&%Jc=t0->| zBReZQ=+JV|CJ#<_c6M%dX7)g7Pv-7U5>+WangO<}+t!gr;|Gc4qJ}+$BaPN2W_mj4f;|YZ*aF+=7XjQGf+B zipRt*%pt&D%f-y8$|KIi&cw~nDa0nIEy5$LAjT~^i$wxd4D(3OVU&}RZ2(Q)d?f#L%Y2#L%sUNca6(kaX{YHvSA%cCWimoi2Ng|!^EJdgV|5Y zKp&6Hhq^$#f$=+d_o`w&7lYI+MqU=aIgAW#j2axFOv2L4a_ogHA#8GqEQ0L9EZ{?b zT$tW~CnY8@GI24nFtRaD1N9?6lt99zLI)DwAoum^Ffq*5VPaUJgK*z99VUi*Slo99 zeH~#wC`H7V=4FDe?GkTbT*_3>*uV&Oq%|)KUnkU|vlx}Rn3$Ltx%8P0*qa$yLf8xh zIJ}rdnYgT(ZP@!k0ya>`i*hkAq%r*fJKhlL_DVLeA6UVD041!1GKfDcbP@jW(`90a z)@5Rd*F~hO`A~V-xn3U7^Jro53%ZvcQV5xWZnY6FmR5OWfNoLU=w2#WCkC!1G-WIboURdG`ln__;g|~7Kql( zOzgivJ~F6;xcdjxU7+x1*JEOk&|_jy)I)^-3Oy!E0$ ztl$hehXs@)rJ9*}IrtW^Gt6RAFfkosVm!|R8a#c?#KgtO$Hc+70CK$mLqZ)STsZU* z@u{HC#9*M$#9*S2h|dzJJUl+3=d{7%vmmjkI5j0TsWiPTv8Wg{7c+rr7aRDJcRtYV zWm2Em7>=>(vv4s9vRJcdFsX5AF!8bJak+9CGi5TVGBGjgGO}{YfbJ$`loYjK<+0LY z;^6=v*Ty1X$3M838A5vf#{V~7Nq86=4FGU`UCSsj`z%rAD9E)GjlOW>9a^P zALL*-!LHxP2s*@vyGD}9kwubOgvpPofXR;OC==s-Mm7&lX+}lRZM2}UNoUDpdc?$3 z%aqPk#k7`@Nt#m@a&oIalL_M_4klJcK?X3m&;jws4nst}dcly1;kqFc!!1KZdVOXH z3Oxpl{vOQzMXAO4Ic2GSiMgr%X`nu-u!FHZ2ZNL!!y|SjCKg5(CRtF$qQ@c$s%RJ( z6gnaH8W=!5ERR%#E2CoQ;_n+>H_bEi{Js7b9OmE{)MkOi2lXFd^28 z7v$$N7Tf@r^DmhhIygXs?c!XzOl&-?OhVjTOae@nOzP~cY>NDjOje+?!dS!^1wf54 zMJ9hHS4Jx)RmRhx0v((h7#KEmL*nIxF(Mz`GiG9VWz59z4#}M&CJ=X`_jh6WDYc>` zH7_M7F)t+_eCSibUeMeXUp^Ou+FM433tVbU>}*T|%#6(79uGGY7e7Cn09zmv2RoAp z7biP2JLveb0;W_ZK2UOIU|7%taaV>3QoqN9iJ{koiD9Y5g6Mbfq(k!A zk1hxebDxG*QF(4@Nos|rUJ+;!52(lC;A+q4plHv<(8Va5uU_E5;39jAjgv`;iRU64 zw+5H8JTrKEX)z0UGnXurI->)FK`+Ez45kQo$(S-RXqYlF7?>j56>iGJkZOu>7p#4D z0;4~Ka91hp`d)E^2GGn(h(5?^>G|pf84PvWOx#S89NZ$j6WI7ccV$gx;}QfPi_FH! z%fuzh$iyoRisd15PabM6O;gEa5z`>|*&%w~c=*3W=#3T;62F(P1A6Wy`UJWxuczKyIF$9`1 zF@%~S?2R+SZZG)4%)G=LebB)=@YXyI2UKA?-~!bC6=sNhc+iZA;e;6z!x<#|Z$a%x z&xh##hOT1+`P)ECALMUWh89Lpi3eJR0=`UGAMSb3y(ImRaMv(L*zab}#Ncbr#1LqX z@PE8H#Q%ishptQX1tn#WBfzC@52GJLAJh?`LzLJV7%ZTUD1h3(!W7&nS>3@!N)GLGxRWKGAsaD%qGUf#VQIpY{Q0ypAmey zmcj%`_^+@)_2g584zgeu1%t z#mFPh$;8RTBrd_o%Ff3m#mpls2ss7Ho#_)J zlP;45qalkOlM0g-Q$90zl}HW~Gov_@1)~F#B;yfghJeYCa96NGgu96q6N9xC6N9}K zBHlf%An}eT+>uh6ff_i=IWp{E0-a9=&TiV^l)eCJ-wZ26I$LYS#BkDziQ$|TBHV?n znHbcpnHY9J$A4B-L&ALqX1GJ`1+Tnaz_)qM))Kc)E*#X8E z%;3IX3p<#)$O!5J_Ap-Ktk-B@e8j}Cfmw}7kO{QOnv+!kau78uD-R23-<}@_6AL2~ z8w)FcJd+q33uL#VGLt-$JosE;P9`xnG0;LwHqa<72NQ=Fmo(@Y7I7vaRwiaoW@|UN$~% zCQz?Mh)YtQQN0#)V4paX8Y|BPMsaYTv6qDfVwWi3vLAbScDt5%viGRoXK#blEd8^xGr+cikS64pu<-eIJ1O6Sx0@GSf4_ z9^Ak<4U!g)Ft2CiV(4M~!^*IZ4dg-4f=)p;RwfA+G*9C89@uM!%v{Xw8eq?DM|ci2 zfMmwx%?tLLzzT@J3>*;kfu92tLzDv(L%ajRU%3ttf1%GqqqM{F@=G$)Dt$7GOPoQ= z;X%Vl26Fn02Hl`Lt9lquGcs)9RAXY};9@Oj0&ht%W9o+Xc^*LBu>;8+=N*_Bt~oF< z+(L54Bcj}q2yzLeJpyk89pRK^k^uF6p%f@{GcYKug!tdW5#j$xXC{VZXC{W-&WQ5V z$%To*#|5+B;3AB=?+J7PU{Pv1%4}J2W;*CDOijI_#0uo;R)jcC4M{jOB;ycI!6lxF z-Qr>#;zd9yRaeBxnLSvh+r^8YD=Mr8{sg=7>BqC4slcL;+Z&nm6n4x z?+JG*=te}OEDej`H0<#XN)Al&512Ly-e=-w=wmczl4cBL5@QU4V`0W1CK#4v4282{ zVq#$R2yvKRkXi^%XHYQb;$Q=fkn!_|a&U0)@dmMRaPjd5v2gJ4@dhz*@Nx4-32^fU zF>(lT^9C_yH6 z!N{!`q`|?+ts11m!N{!{WWd45ts7**!N_MAYQe$CXBuk5!N_eH9VqRu4*7Q}JS`uGWj6IEk~hYpiAlMcH$djzWp zD;EnBTQ?(z180!Z85ZultQ>Ys3s{-wv$BVYsPkRoV7|zq4<^-(xfmGsF*2or#%k4| zk;Bfy&MLyi!N|#?3ld>uW@6_R5fT)X77-UVWH8ta3AYG0MEi%!or%HHor$5%9T9FN z9!v~VJ(w6IpzZb@&~fx9oT%kvab`N`Agi3zBJ4qxnVt;Z_zuflkSmMhGt=|(i$EK^ zVB$!{189pgj)2ch#}VvliKRJ6CuyUamY9-K1gg6}FrHuoZ%)0$0;Uwfq$rpy1C!BU zQuI9|7sDjRYDP{bGw{8xa*Q_FA~|i0pw+dEqD=o7%T+5_%2_IU85t#+LMqv+wlS7- zR4ip;w`&7h?7@Zg^fv6oKs2Y z0FyKm^Fbyq4lWLU4n8LCHYSlqCca?i7&fLfMphn{ZbnWWCLY!ho_HP}&XBo`Om-Z~ z#hgrREG$g?Ow0u=r7V*enV9&P1msxRc$m2Om6>>$cqI8`Ip;ER>Trs)_b{q38T4?n zb#roa@N@8rvI=lADKj%MOET%RiWD-lvZiS;aWl)a`?0dJ@`MV6uyS*;3p28^3WDz3 zWfm7?W9DRI2Vr|o9ZoSG79l1vWmaVt9VS5*A$DnE$WWuP(6vR4@iKPL2@n$s>C!-k)C$kWn9IGLRJbN1>A15Od3oAbl z4-X3`|35|{RY4XZ7QtRd2~I{%Hg@R{IX2mCj6xiOOPLfn<=Is@mD#m889CK04OkeN zbXoM++1QP(*w|U2qwfq10=ppT+`<#m&H>G%xp*=$czZH2_<17QLE%t&*t`Xd&M(#j zrNhjERM0qtg0egZLzNwa5@`P+xHqi9#1CqFFa$vDnE^EiWX}puCWh6XObqLwVjvg5 z%!Sdgbf1}*S)ymkz`(@FP{qhl2bzKf7jX$ta~Zr4?HD~TCI)*iCI$~LL_VG1#l$e( z3v<8z3AA})kUhnj>4;2PoSE(kx_C7w$35R8F)sz2gF*4Lf*CYH%LyVh8LE~tCGsb& zVPxoIlx1S$#lpXnMM7QBhufUh zMbeqyg-@Hykc$zdi_#pgY zJr_gO zY(`dgHhxwPHYlL|p`FfeyCou8%GjU8};%AcQW&(L5oe6SK z{A@-hc1C_C4n`}`xd;0o{_5}nrDn)F_nAIS3`=~N7?%4W^3ztRJS?5VXqbzUGL?ab zKBIxCJ_kcpBtr*_ENHHug@=g?w2eyzbd4W4A6$Ui%i)Wt=W~3S7&?8K80PyT!ZXT` zi6PgIi9wJ2c|u&@0l1sFim6uQz~GR|2-&oZv~z6#LUjYv63;DIqwjw z7_X=w!vYo~CN4(Mydeh@=-O>Q30)QeMrI~KCK&-MCjJRbO#MvE6PP&KSUFiFnFN^x znMBw)7&(}jnZ%idnRu47b4+Grp2Em3%F4*%A;u!eA;qE$+W7H>4Wt${w8-<7O+Z+L zkyTfPNs393hZnREi3zltj`b58HZuhq*~P6{^(47LD*2gM*;y4uB&C>mnps$MIBzj? zG6}GVG6@I^FffEMZDD5eW8!1VVD?~J&CKM*z_1mxgoBxhgJ~fnGY1Bp_q^DPYOblQAm>7QeA<~nZKSUn3-y{UOZXGE; z3m^?OCh-Z3i&;U3R8<{eW!S|Ex`|I3+<=zl;AdiGWCh*8sm2M~XvV_E#%j)L$IlTj z$jZ*d!ph7l%E=_d!3|ot$jZeipvT87DILosDH_WpEeY<}8iOh{dB!BhmEgV63=A8N zLEJyXACb@3`!g|Y^Jik%>5p*#S*ZKb``Iw}r(~wO73Jqb(jVwR7lUYhMuw^chB<6P zOrlIYOdOzd0GU`p)j9)%924a9djvqg!S#i>b&DUbvWDku|9f;R7P#xo{ZK({wmRf(~SnkI@QWiuRO zQ)S}h5s=|w5)zVI$i}{ijgy0ei$_3WE~CgiMqVZ^MJ`4`O-WW(b}l~fl%pe)50fiX z5F>byqKb)~QIvtUQ6yuy9N+ zN-WL*Rn-pW;K@dIhN@zQHSDrX5(+#_T=MeJ=?W$TaIMY2Z~L?9ym@&lO|$^w}f zssa)Ac0ldL6@Pj8kf?)}4@}|)_4-^4RSOsy)^R8@DKoM#SuugnbyH+21yvaZCn5g5 zfMoCUKqiKFflLgaknCj$g7_Dgy~Ua7e)%Q-d6@R@!)mXqRhN>H`x6fFfU)iYBe~=Z-Cl=A_$RQZwE0kJPBfAc#dTMPpJL4 z*4rT`Q5Nvrlq5q{D8m!b1u~4REP`CDO#G}upu^NagKQcM0;i$=4o38MqJo(iYJ!;< zT7wb!@}j7;qO zy!?#(qKZuX!u-OlOdK5i%!;f`g8ZN*^dA^m0+=co7&<_=122c9iwkEU{*nkm#HUsW z6N6z06N50)gm7$1qvM-d0;czHsyX^6`!m>3Mg5aD72m4}4~jE03vE~rBQDY`&Qql5*d_&FG= zOc@?=NrUc6W#R-KtpYyt104Mf0Z@A%wy_&f+>Vt5gTIM?F> z^d4FZw0-DE_QQ*?f}NoJq?gadP}RxA@CSUEpEPKxLk_0^2O}#JGm{9DFq2?8Hw!i1QP>K1R`Fg zA|U>Pt#g?JU55jU*U~(skOjpoOM-ShV}cDsRSv@eZayXn4lY&=CLv}f28L8n*|Gs@ zZ$<r_Uud?%IV!)EAtQ zObm*VOblv~i13JrgoFodTn{~+gNnD*JkVZ3af2P8#XdfeJ)GdXqLlQx7^W~jXJTk! zRAiCkPyt_X%*n*VCMLkfCd9-o!_P0wBp}Ku!O6tL&92DL%g-*RC!!8sKHb2?6wAoP zFyRu!ohu>{>lJrLGBF&FWMViSi3qNIPtf0I)CQ(L3hGmS3LXsjp;IlJWnM4>_g}BZ#f=<0N zy}-yR!+DZXkcs64qc9hbfD#ig8#@!{L?)I=Ok5C>QJzPKUx|^2Uy(`uH|Qi?X-=WD zjI2i(S)VgnoMB`=$|x|2h3_;ID+?DJ%U#fI?M$Y(7@3*bnb=uagjo+WT3lmfI?u>6 ziG}YV6DxSr8q0IAGV>>loJ=CJtcMw`9xyW91S{Fj#9=7FDk{v%W$GjTl98R6Zx*9C zX!>*u6O%L31V%=6mV>NJ#-L)Vhmk3Qk&{J~IgX8mm5YOg{WK#N3#Tp%7o#s1A15m# zADu*_A0vlg88}QB7!KTk#G^nAB)x;mU*#Ak2DKO_2BR26 zJc439AO^EsTY)}40_x9#>Hr1?rWl4MMxj)}G?`SPG;W4KG=5buml~o1kt5xfo~u z1i2$8Ki!Cdfk~R7iBX#21QR>x5KAUzW;PBs1_!A59I*)V&10Du++vv+B4QE#UKGp3 zus)Uvel9s|J$wS@eY?ro1^M|oi8(p>NTbZ@$)Huj1tmp#1ts9Y;s(Zf;GGK78SA+i zni%&prn00lYcuQEXfx}aXJoj?q{gHOIz5R+nF+K~L7Yv9iRl4o+>`kyBl9279fYh> zT*53YtxU`v;FQG0#K|GaEX>Sm%&8+SF3l>7KGm>6Q?5aG}t$HXu<4)dHShwZ5O z7(CPg3Wv0!RFn%Ub2CyC3qadN^Rr9Ar^p4o02M-6{-97$Of^iC*Jjpv&zQ=d#>KFL zS+Rp#h)KScTZoN!H52m|CeZdGZYEI$Jtlr8DHeW117=n|c1=EZkrrU2rc!K0!o&+Wau>?%_THtYSPHG}}Bcb>N#xIclZtS38jwZ%RZDyT?j0_7{)Hs;f zSvi!!?IWh;%*?BpIhbTvWY{HnB*05+xWw5(g-`})Ljt%5UdhDFxDe#@4fi1K&PYJi z|4j)@41Ebq4AT-2;k+k-iQ!lRqW*`~UlKUo9iN<&nh4HH32PalBM425aoWr}r3}Yd zG&nffnYftPIG7YKGBclJX652x;^F6JQeff~;AG+w2G_AVOkIpjV$58iTi2NxOF<>h zg!>TpN+cr219cLa7@QNC7~&EU?!A%7#PBYWiD619B;DIU??V*8Rvtjh0w(bXjMo_N zGcrD4Jjx8Fs_rv_lKn&`ZDt)-ZDyTijHw)H%Bd`Axutw%XBZj2u_$tIGKsKp^YKaX zvoV1HGdCAIlLQwZlOz*ggmNmEkmP9==5s8pXIYr9v2Zg<$nuDZgEl{i2rx;p@i9pq z;pI5YE5O0W!aARkWdkE~JWmMd+$a`qc6MQA)@aUfz9>Z|RyNHv5n*nT?$_2^4w^ z3>O|j!Y?8Tk*~6om>8Oqm>6azA;OO}nTbIvnTa6;+77q@y&ppWTR8$LLzu)5FoIT= zF&<$24q4f=1ia3yiE$bz{GwAe(=ITka;ABwvZuK->|g^8&~Y;{Gx4(V^6`lYfrF2k znU9N`NrDL!e4KV%&Rkr||5=&a*tnTEn1qD|d6XELR@Zc#Vd@7O==S!?hW@6Z%%*1du84*5WDNGD%DNGD2py}#F z6(pU-pxvvJn37dmTvCvq3BHdB(S1nIPbx$33QCHSGC|!!@e7P=n7|86Co_Rom^Lx4 zU`%FCsVQYC+s4H3hC_{sMU+X5NmP-MSwew{8N5V_i$|P^iH{?UIar2|OP*PSiA7YC zQ&Cro?KKC>2M$&>4sIqf5mgbU%ZyAS*6f_@B3uj%pP5)BnG6}#S#p@bE9A7mXELcU zhOsa+d$Q@WvT?Am&tqa^hiq;Eop1C45-t-`5czIT3KPSv6efoIDTr_hOl4wdNo8VS znFR@tE6{QH477EMkZ?&WN(8Oyfi*56g3!PM?ag|?)Wv+CiSYr`S_mZ$=1k(c&jiYr zJ%S9!IGtEnm^eAuIfQvwK`Ud~w3vjsI0QI#M49+in71==a|kkVZDZnO5@+IM5>+x} zkyTV+lIIZMGL_^t1RZm)z$DKlz@^G0!r`mTswyEYyN0ooiAj?C6(f^~r8cMll9UGt z@V;bZ67l5%U%vZAvBa<5AOFmEzeDDDhjyF;f`R`3C6T|ydCWg< z2{O=fBnAeiWQHcjWQJ+ntV}GQ!9M4H!^ADd(#_1qA;`qt!ptbj$iTqKq|V6Cq6F#z zg5vcf#61~l2=~;bF)_5IF)?(fA>6Y&jfvqf7WW9C-QNXqPfBW9DtLFDxWf@fdv1m% z#%GKS+ql(0=X0{~bBHjp%!jyX1~bb-2x}HI%VG$Nk!b-l7bw^qnC5^BwIn7bMiv$& zW)?OTRuNFZFfcGUe1f=JAsyjvvvei~%XB6N+jNAxLCT}kF~gB#2_$`@CcWa)lzi~w zo@|CD#%zW=+^lTkOf35$?%Ki3auC8|WZK8f$iScgc9#l>$*=+Ho(1WMamG#QOblDo znHYAagId6l^};-8@d>jZbkBHkdPXJ#15*Y=6JrL$FK$*AInbR_Y#dDD>`VfX<-!aK zpCSGh$UxYmmBGYdmchheoq^~V=Vw6d?17#uaRyp`!|VgC^Mk|{+|S|#_dw$>zWJc| zI>*E?k4KG3NQ8}pot+g_9y2oWN$^Mr@gw*={IWbu>?}Nt98CP|th&OWiaLo!o-vfg zhe-+4-T=)Teu236LQ-3ls*^_hE^85jntV)&n!fEa%3|x*k&^^m_WWGZGE7WDY`jdo>>L6-Y%FY?ESy||?(89aOag3D912Vl zOqzWBBJ51;ObRRtOngkd`WzMtOq|{vA?!@dOrm@W910u?OuS42fuP0w{7hU-!ffpP zygZzYJocPS>P&LXubCNH<;{Gx?=c25Ne4=^inOwF{a~qOYG7oNmK6zyI7N_2ok^Yf z9y5nMlcMHCCMH8BdnRda@EO)8m_Tb}+L)Pam<*WX*>*ECO=DzT&dAux$aIp4V>dHX z7^e$QAd?mt_A?4wgA%Yc6EEXh(CHUUEKJN>S=rcGZ!&Ulv0vlj;^52xMF+zJ78fwR zA{!AOd$XAs9%eH!yvjzzhguF3gFy~v`}qd?_*q6#W?nWdO2i$E?HL^wGTJjb$k;PF zaH3%|dr&N?WpZR4VPa?yR9nu*u?Eys;^Sfm9sa<<$t1+X#>K(MCd|Xj#LUJiB+kRh z#3dpOnw}Hn;^*QN1Z_hHEeeldTFl6l3rfqNoe)Qu7!ueZ{;J3UrB=v%|AZVShFLjG z4D)jk<;-QMJZ!(U2HO64P}2}Rz#CkUmm_rbu>v zP+N{cfCJ)Qja-C#ZE~3yoO78N+;b7`^@qyC>QfjED;IO~L9-Ky$=RTV6f6qL@{9~k zj2aC4ghZJ**|-=OB%xCV4p93R~ah8NIqk$}=K z(Aq=E`FY8SCB-G6c{QX(rw{>`#F9kBRG<6;rl-vFnHU!^8G=a%FljKKiHl(x<0e)H ztxygj7FIT14o*QP2~Ix88dfF&CgFNEHftsk7Gq{zCUqu3MkY1|UXwbGdVX#V33g6) zMs`VQVJ-%SRwkBxjG%i3_?VPH`(h3cvDs$~nkOy@0o#|)P^JXAg4KydjhUU{ z0o1;Nd?tnnsQ=pYnHc)=nHVM^**6nv-x_HD5}$pbgCm3s!ol_xG1MtBc|!cB2|D+O z2NIqS@|hSwB?@Ry-l&*HNWw44lKUmGKeh0thx0JS%w z0Fi!+3z!({3YZw0k?frdwO0jg+!_|H;IZJO%97NQd`MaaEgcBR_Gb*R^yg-n#(12O zVG^S;Xi7;*fQyxhi%FJ=i&KV`Nm2$h8dSpK2`Y0K7#KG2Lc-xi0U}-fD_~;aEM#Kf zD@25YLLnp^7;w0!D6t&kj*?vP=v9GVK4XDVJ}7H|PA_9rV-jHEGBL}tbAlYv!^mRB1i23}fFI(XA4u*IE@EO(E@EQP zC_;osND(AFPC(mvZ=f_*_Y{@FuIWAm*=1({+F3V^aSAiTJ|;B|P=7d>ON>dFk%dKo zSy%wHn~s@Tnu(v$mP3YLmYr3Iofo{mGmdE^Ba=Uq91|a?k_4xy4+0SPt|&r;-{B%A zhRa1v3^$P6%TNq)?;Kb@h2|f)dqHy_Aa^3AC;0_TYas<5AEc0b%FOVNNneCRm{&rK zNu800iI-7`Es{lq%Z!tkOPy1cg_Vt)MTeOkw0gaS#h0;>k)@jv;@Ag55O)R?Bihf& z#Y_yv#Y_wp#fWh2fx6QJy50yqo-^~Hg*7OCConcZ#^sDa<8sp&uP`zkVpd~Q}(mTi< z0rlWKw~&$H6>~6?3=0<%D+@mh_+-vh79&s!V<-@T*c(xT@PA$j6GL?g6T|EhM7?#f zgo)v92@^vEG@Va?o-d<-cCLLeTb=y;2h@|>Ko?Q$;i^hs1#}t z#u~~W#@flq*Tu*h$`{7P(8S{Sn3;!(hspF2Gb@uC6D#NxnvcvZub34WnI1A5++$|F z&dh&7n=F$KlN`GY8+dS5 ziz$N19&$i4X#Io)#626znBe!RUMgc^cv!~7@T?3G?hNHj3>@W540q7Zi^#aTIo zdBGjh#f(hBpcY~w6DOk>lQp9$xVU1NAPI4AL^;B}S>;R&h2=~PrR9k5>nw+a-x}QQ zn3BZIJW$J4IKeL-)P%`o=wO8$RKUu}$^^p7p!(j01$-8m6vW;W<%slot(=MBRyh;H zeW+a^8*z;jB$niZ#t0TNF-&7z$i%RMm6eH)i-$#$nT3a!iG@jojg^B7blD~gKQ})+ zzZ?sjAgJ}n#LULcFUiiyBx%UX4qnq^APsRxLCOJ&A`s^ z0cxK^CBmN(l}rrrl}rrDl?Z?4Rzmy*|?oLDhyelO3ZSlOd=m z07cOSSxEduR5LMvb~J(Fr=XgNp`n_Ip`{uTUQ??f;k5>Y({8xtFXA9~fO&gjobR6q%HmSe~#mKW0~E1Z}Pd zZNJxJ<6u!{krCjO=9Q6P3giqI=U`;zWML|2XO#obh}JMwF*P$X-DhF~&oY9hM;W(6 zFN6|Mg81)54I=+NsbOOHQ^Ul-P>b-NS1l7mSS=Gn2J~F!1<-Y4JGxNEX*IM8k`bPR zE?^Mfz<3?9)p`mec=!EGM$nFHx#g@3znIiOGh%FJOf1jXn4hw-i7_+rFtIRkDKn|C zafPrcGqEy>Gud!)af`A^GqH0ramez^uyZi7O7igWvzjyUa58boa~psfZAMH-SePUj z!Q%}nOzez%Kwdnc0`cF9T15Z!PAwAyLmd+XOC7?0L3KYbD;MtmO%H(pTO%s zNaVrN8vHKHc(>9#(D;PX1eTAC{Va?VSY9%LsUHxYA(+G0&%(tZcaWXo7;^*@H-{*T zG?Nn(50f#o1Q$1pDTfNHI+F~W5a_T{787`( z1QQPvKew^9krX>GJ7}fRTqc$j#z~AUa~PR^F*5Oih6(1fGI27_2IZ6q8j$eVP=_c7 zPS!Co+^S<@xL1eBSN!!L)eHhMszayQe_i4XY>6 z%WDlSP~2$h!Qu)u)L>wt&%q!U%+SKB1U~DRL6ZsGA^=;g1F`o7)Lc+G^tYagfwzH) zL8<|fenK0V7_u9f7=A$Se~ze!gqH{Udd2*d(wx*{XvUDAz;unZpNVk-lMm={L%EwQ ztlVtutQ>4N85w@CnK4N*i8GloDKU94g)_6VNHIzQ{>Dw7@~I2CMXVbWz}XX0SI$;c3(5AoNI z21q=E{B@~;iQ#4g6T_VbM0mb}%EQJpVD$kk&F6yslag4HSe9CpnFhKxNZ7y{6rN!W zAJ|nu#Xlnt8yBdFq0gcKsf$42x&dmxMI&NdHn@?AA*GRtA)^st|D8sN``$qFB?~lP z;<6ufN{!M3jy=5hIT#;sEM&RQ!NnlgCB)FcVa3JF$jsu%!@?xT$i*Va;vvH+APG8; zh6!}DHV2a$mn~BeQ@AFF46CUGlNO5-+h!&vS*96`j518^jO-eWtZs@-5{ztID;SxQ zxdhlRGBSzqvNQ6rh{&_EvP<%@h_HhP>KNGtH#0JcfO6tIX3#BbQy5vwn1UDsnXNby z*{?HlU1DO&VzOa!WO~K~8qx!W1_Q$Z3rKtfG$Gmt$xTcQSxrm~xlM?4R@%hGP}78Y zKSl&vJp)SRZuv#vtAB+ZwCy<<Gy&n8HG;A(He@|PcY;+RP|AjqFFK-!<1L9U09VGgGf6DylNvka)h z*JcT4=3-a?wb!B<;qSm^CWeq^CWi24h+QBO*4{(U&!BcDA`OCulx!H}Y#2^)@-Xo+ z2{EyO#)LsWd;qm)Lo>pEhnkrfE;TbT+-gRIuRseEgG37xg8{T10kf~72a=y*=?-Ks zs0;!1sSTch7OsNM;j+``Vvvg#WD%On#PE$1)G6cS5@KRu<9N-<@`96_O_+y=iG@Xq zhlx>!jYY(iUCLg@19aV+G$`o^vWs&uFlaHI0B>Q6W@2HS%fygi4T+bG7R0z)WeXF- z;ua=`4J`;y_|zf!156eBnHUc+T?5^O zaDeFuE0|{hCe^{@T*m!OTnuu5nFKY2SOmF*8aWsqahWj*hzK+B^RO@pGAS=)WM0F_ zCm_$n!NkEV#wN_-&&0+iWy|cr^pg{QX3#fImZzLt&o~wNqP!lt><4n`0;oGZ+7SKR)HWuDk~SuWiZ+Bh zd)k;7Cbuy$Y=E}EVD8+3o-RxCl0ohSZCV56!F=eUq@nhV4$}6F4(y-?`ZPv{1w2aI znV9!5v9XCWsk6$kfLEEgvABV9rV)}2? z-BZzy$PeA^ObpB0nHW|hx#x5{6T{VZCWa+w=Yp@m;+~w$yi`!VA-;g|9Atn6a=Mug zVwgp)lbPWVk0KlEeJ196Ol)kfO!iD{EV|6%96C%&g1Q3WVb=tvU5rerpb!K(_W`Kb zVrX!Igr7nOVjR(^gNebagNebm15vK}c7T;L=%B?fEVY3W8_1oY_DTa|SUm@WTp_~) z9!M`9G=^acN>TPK+MrYhN?5KCduMbY($(4yCWgHoObiE+?7auIcTEu_y^BESFOcmm zE=WnuDM_X` zns@`FGH7RYbUinNoSz`8kRQVj9#tk5CUHh~Hun2GtPgmYn4CbRMgt>@ILLv1OstHc zJ+BS!5O-bZM3fhgI+++gb}}(AbRpcO(Z$4I)WyUg0Ud9>0i_u>LBbC?+(0e^1)773 zJ)?t{J)=VaDDwpfatQGYvIsE?vIylfbnvP&fqE_6Y%K42I6m>PF>!w8Vfn|y{1-$@ zvAZy`GBSZ2+{4JC!vwz2D1eEBksrJQnT0hU9H^jm93Bw&cXT28%hS4;7?yW2F|6)F zq_daM3pL(A;~7?tz}#J2k_xIs#S315#)(&h2$_5?2DwYj49j@c*aVq4*_k-lIQZGr zK_|O&@v?BUaWe@qu`r9Uv9dC=8FA_{f-hiT)na62HBe#a1a(Tlmu4z-Y)1o%(BFyOwa{6Oe_LH;QM3b;us$B z%CIo;v2k-Vfi7xi;}YU$XJ7~i?Wlo-*aoQm2axQ)*3HE5u$zhDMK>b8e}UZ6gBTBi zg_j4mb+x&P1<*JbHgJaCDI(`A$SP#W(8H(5#Lp)DnV0noFF&(1D3@kKF7R+>Vr4XB zFz|+iher>hJsi@*#E{s-#E{m52#<+9knp$yE!SY}anLyfdcirV(AZnVl+ReOo-v=B zVFu$DW`-2d4I2VXd>p1sQcSW;x}c*-m~@yxcZsMmOR@4XX)<%Mh;nm*azqm&OBtg# zlQ*LqWN9xXybOFH?t9ULXg@LZGBI%XGBNP?BHSn43vu5Ow0sLoU+MWp`K2Y9d8t9E zi7DXTf`c`9^#nV^48|gc4UC#hGN2tspwi3%QJOJqfZCtYiwK{FUM7Z#y-W<#knBGS zwSNwDUT6X|f5PlfOi2L+Rgq6V^a6A74UF3$gA%{MgAy|sFEKNmVpL-jW@2ICVsd5@ zWa41q=HTYy=HOywXOduMVrOTPWM*RJW8!3HVxPwd8pWE($P~`x&Dg@oA_y9Z0FAf% zL&8g<57DmG>SJQC?qgzb=tG28T^}U8Fvj~z^FZ#@1C_j)xuDZ~n8XvJ;u#aJg4Sv` zGRAW;%wW9C%+SQ7#>UCQ$HB}5x^Rw@iJz5)NtJ_@Nr6d@MW0EWlbMH;gOiD$9qd|W zWmY8)@O34O?3~~#%a}=<={4w7iGo0gdoMuU1L_Yx?qgzj+sDN4tq+kOlKPn#iuw`v z8f<}vZw6X^06D&>peP?S3?lx4aVs0>%$^yH=UBZ(d`cJ&F)1=ByMT_E1|>>OCO%hj z4rV4UCO$S^9!@4!CV3`BsOy>7*yUMe#2J~GHCWZTRYBLjS%5BC(_vzd2Avha$HM9( z$j8nkxSCO91ETaq^nE)ObieEnHZk+BjSl?0wkW$^BpW*f&80Q3YpV3$kJy79TQ+6r4Pz~%}flt zm=&4CIXIbAnK+q*IY4K0g32X!W*#n1CNXXnW+q|qT!;-*CnJ*yC=)U~2!*&SVgkZl zxf7TeY9}x;G)+LbYZ=sC8PNM^H$dl+VD2i;Oe-lZ038+#Uh2PqaTjD}SrjyRG=uRY z6Zq5-VJ1};CIL2n(1Dk7Y)VYbOy11aJY3xDtnBRI{Rp=iS*)3Cm_rEY?hQ%vx~wFNlP=f5${bd3I3LG00(gosDmNlXkrlb9GnCn54x z`6MQWhDnHXb719q#!A$71^9|`P}vD762ND)gz7UI1nP4$%wgQZSSnto&hU**k%@;% zm{E?6lSvqqh(d#(15(RosnT0yBZTG6E~9}8{cgf=2tB2Ogv2N9DJgjOkAM#E5cl$ z6%YO_aUicnvM@7hFbcD=GqZxOj0gMg0@QyyCL`L#OjDQ`B&RSj$W1}`Z`KqhhRsu$ z7;Zq%qy7OM&to``B|cosQbFwxm?t!}kh}pt`3EskijdRP15M0>22Lk1U0?oW<7$Z|06XJtOZD$B%ol$C>t`4B5Bmk<*d6E6=Biy#v-2QLTz z3??}y?x{?IToRx?MvRJz%o=Pg>})(t{A{c&Y|Jbi989939*kU!LX2FzpdO!qDAy_` z4kqsHOj1nptQ@?o-26-&OyV&jlI(p<>@PuEe)XBcn539iFf!>dWiYui1+Z^pWU~Ve z$i^|TG0L)tF)_1dacHvlF>?uX_A_#Udyotc@sRW*Fcs0hSDVVjU^-3tBUCF`6*4O0dgwF)&PJWO0F=Yr??5(2xLe-;Sw>e1Bys6T|(fObjolBI5u5 zR3-+tX-o|0_i1@x%a4wbO8}fo)6$^XGEAS*zy_Qp6&o4ln;1(OW^pS11|L?(@`sU! zNson-Ndpv?bu7A|q^igy&&1B0$H3r_2ytJ;G(>q(GL4C$ei{=)=QM=-7EWVgSTPOr zoP!{FO{I@y`~*trCmezS2f zG0$TM9qP`+Ce6&p$RsGo#3jzk$21*u>Bkf%K1MD^9w`x7E(V4Npdlkr4Uovf%&5x9 z!^X_Y!@^9;vk8Fr3vsftgN}AcX8~_VVK@MFPsR*H zd9`!~6T|TtOblmcAi|qzCKH3eOeTg1Xg~f4blsK)+PE;(UErJ*l9-f}s;O5{igGd| zBIjx9f#)hg*>3@3FXW5?FPIbrlkA|D#2m(7%nVbw)tLC$v{-C81elz-I6$Y9 zGjTJq7)qJ3f-c@+V`t)J5@zCKl2YVk65{6L6yjwE9k$@bv%CoRBi?a!_YJr9X!Szu=8pMANvk>J`>MSOPoLNi^1+x(8 zt!5S^z2P2rM>rfBuX(BE;AjRlQ5>A@IT+?J#xeZhR$}5}WMxtVWo_6t0q zVe-&OLQw&&N14PO7JwESgxQ0t0lj`k-U*C%85z#-si$;!mbCdb6Z#w^Ju z$H4-+V1Si{Us_Uvk6W4@ywM<$sQ|L#K#z%+(TatciJ6I+or8;+vmZRZm=1}L3$qdB z@5|Xt3?F7QF?^Ygh!3VYkodrLjtpp6{nOza?WaHaH(jZ2V=fnfq8O8}(KRAXdkVPY0!VQ02uGk|P8dyokUzX@|8 z@dFCKWpkMr*3M;O*fbXre*2*EuyBLXDBdi9ur?!d@e&Jj^~Ajb^V)K6oXtaDqcTD9uDO?BJ7S(uG8t zD?HK|7#J=Z#?Hjg8q3JUEDdtyUPcxL$UW?e(6HPJDu)l`Lc%d(A;O&% z3z-<|7cwz4FGQrTUZ^}QUBPIy^yQmal zq4wiyhl0yt_k8D~)Wj0-nMDnZ4I?0EHzW4#gdyxBw_b`GEC7Qz+ zSjt@Xf{Eb(IHhni3I63~Zr~AOYGdT%;^tv;W@KVxXNq8FWdwIKpEEK+F7FFu;$Z~e z2NX~Uac{?BNPK|YJ7+Ny!{WtE49gcI;%g&R9u`k98a2N1UGq{v%_evnxq}`_8=&_6 zfSL!gk8cSRgXj__2FWD|`_z{}+yk=*Mx)smoSXqVZJkLtAsSrZmoYrymjzw24l49P zi)Rv`g}y-%#GeIFb3yiYEMa2kU&6#N8Oh#-P0B-XKY&LIz z+WTS&B0c_H!oIpi^fE+vs4jzq2Q2(yG+I0aR~Ca-)S{%h1p-*gr3X-Z3zi}3myTsj43m~I zF-%9YcO}$b0`1e_%3{|F$jKHH7|$^FGlCj9?-&_Y2&gd$ONcOm)|X|0wxcpITxDbe zFRcW7pW#9&#QzM-5$=#&&cvX!oQc6|Iih?>SN}J}?6p_{Ngp74 zeOE9sM6F>wk<8v#WoUKT43E@o$T zaE?l53IXRRfeMKI2cYJI?7zN(iQ(Z2CI*d_i1-7=_V$&C@|^>^z9@wev??2|+YGwy z7`n1iX#>j&_Vp~>40W-of@!*`f@vzLd|)h{%9o~=DhS6QIoVXcG!O=MCe`68+3ZlQT z2!009pI8Jxg7kf05q!_W&LsAZh3_qhe#64|8l?Xf3*So+{{;)*a}fU-3*S?a`X?-c zk3sq$u?Rk7VP{jj!y_$&f7;cL;70=*!o?dcz_@AA^(8s6C?OsmPHUM zA9OlP-6p1Z<^(}j4z|ETmZEM(hHZ@CrMfJ#pljw>K=}%^DT+sepGliZRGfoJcm@aa zR1PK%{yL6o0VW%H*13!2Z z7@3$mL2WuvT2iQk_}5}JV*hT^Y9@xp)l3YFS0ntpWGxfJhqX)$4QnC(G`R?&d9Fcd zSo%*-%>!2{ATJ}O#{7c(G}z#k(gNM7Gf zp)mzSyp~B7PJ6%-&zx|JHCZ6#G&@5dlPi-Hn*f_2ljM0u(3Kv7p!@OOG0HIUGO@_% zf!48ciGc>XSeTet87+Buxwx4`IHb?9F`s5*;}c+UVPk#8$ik>#$ZW*H!M7f?>WYbp zlSyJf6Z14?wj5?Q873hf*7;1#3z*orxUMiUpJig>5?~Tw;sIkGN#6U+f_wr@)&hci zIGLH$IG7i6vM~wyaj@}lNip#-N{9%5Wn})w$R;Pi#K9!T#KXusor(Dg3tN^p%LPUj zL8gO@j6&?pBI-O6@$Az&|wyA z(tB8$ce47M^Ez?g;Q(Ee2f_;bIR%)4z;`1`vWjvUv4uzqa=8f$i}H$ca>y9+D6%lI z@Cz`CK4)ZR<=w+5b%JdNBhxcR(D4%&8QBBbwb{AZh1s?FD^D{riOgn9VUkXlR+MH1 zZ}mID%yN;9=@KK;878JPj7%O(Ax!a1(u}Sw-Hgn&tlwC8vYBLRb#AGZ~rG8K*O`Ff&hKVq<2#!pNb+zF&&V zp7Q|<4>NZ9Op^X!?jEjjyz(&SgmPweAnVE^r zkb_l5fP;mJL!VuNg^5|5huxNyRi}xONdz>lo(tM!Y{UdQrpgY~k%PE*!7PY-1=b_R zYjxK%G1#tWVsKoKaBt&!h&eOYd(P7x`By-V*{dmGTgw# z;IV;;VFq-5a7P2AT;f1GFQfppG$|R}`$|ayt#^@XU~>A;$k@R2hxtDv7ek$QJafWS z7KT199TpxYVQpqTCMj`AXQl>F#${pAVJc+eWm6XA60&4uSET3~M(a!vF9FNciu;vEC3K{-CBz zf=4_DLtQe%7B0kkL(rN-VaR}#FZkwJNc;;dfY>jv5n;djMkWTmjZ6%N8xi)qZzR(G zlA=V=_@OY&4JYusp#f_DjE#u-k~JHd81`;tVmP`H5r027GBL1iVq$PX^ZyBK{Z>%r z0$L!dbbxgY(|%UQ1FRdE_Oo&^)YYc4rM0mzT;MWd@n&I@;b&n1ZC+xR5C~@yX5(Yy zWD;OiX5?bdW|S4=5@cgiWfEc%WDyh>0(B$0nV9sML>V`Ln`O03Y>aK7{YnChA>kLX z3E}?CO-u~Mo0u4?HzC|VdlM7G(oIYZXVM|*?f~@ss1<1QJ;{)LdZ0}IfbkaNeMWAE zI<-QMqH~N4Gq}~xvU6MlEe&GgWQySA;9`YhVK(rQ#YUjxD8UQ%)R;IJ&w;COfh7?4 zeb|J^-%OjC7=$)6F^FwO#IO8jNc=9qwGIr)VFwtyAY%dSprL@e&5R7|xHXv?z>9U- z7+I7-p>+XjZ^33nxXjzk#ISoa6T|h*h;WhL!o;Axg^6Jbbe#!oUirXTNI1dD!{Utm za$D}{?;8@D18CzA>jKO@g;E>N3+pNW}~^BtEgpMxZm6c>m3dq(CDi~>j5 zxQ?+g9c5#=!luQ`bd=5I7@HfbBqQrrE>>37N1(~EIgBiyL3K2!aEfJOXJlnjWuCyu z#>^_f!NtzR!NR1)$;9Epp27lNyT`!5upAOUGqxbguZ>%n7!GVBTEFM z2}=-jIa3v6w>l`Xy$9t5P>Hf&CB#1&TM_iJtgPQaqi?N@EISyPDwyOLb(rFqM3_R^ zYakx7%WlaYm;nT^edHIjpky_zkUwULpD3)GRDum%!74cidmGkY5o!&r~ z^5dm#ko+hEogWrKJBI{ZPdTUOhk(`#fXX{i;{U+7l@Wa7UO(e|P{Hw>iQ$rfB9nlK z0h0iSBD*LPE9g=LCLv`}4u3EYe3V58=#&&4reaVxfPrBh#C;0e5%q!Hb|wbj?Mw`T z+Y#=o*$#1^4YWLijW@&cE7*Phd8z15Y+&30PK?JHL5Xo83qy;bHVd-^lPEtE9~&PN zFNX_<1`{WnKNANNF9$z=FC!x>s|Gg*D=TPCbs&=olLX^E&{cRX;L?VH!C(W#y%)A4 z!t?cZCWdd@nHYW|xtDzh#J#xg?En>T&guEVmAOgzIhj@9oFnYuXwT@NWY5k}SI2Nb zP?kkdK$eM1P>GqHfx(kS4@5C+fZ89h0})>7JD3jEofvw8$_^!!s-$u!yQ3ICIJpHK2~N47FH%!E?FinX(d)J5%5N& zPDU0BNQMOE!wDN9;qqb!qMypRlZioKCliCnPK3LZcS6Di_dIocNo7GQXlViHC@oMb zb11TBbP$Ga194l=$PlB(q|3y~q{kw{3|_ov$dt2WD@adRoM za&g&k#j|>`a&cL6@v$nia&f6}fiCrA_yBds52&4>@e{#aObimcm>8sYA;Lp-7sxdX z824Df;;9I-uirl{tr)Z<8PwVWUuNiL$FPk_g^7~`eBT=EHbVvmgUt~C7eLJg+1tH~ ziDA+%CWfg<_RfdO!^VqXG!}b9^FWjE$TlBgQsLl)-1G*sxd3YK3y>e7;m)v|i9vQZ z6NBPzgnvVJL;R}%Eng-;&)-GZTb!R$mI~UM2zxE|FfqjJVPZ(wg9x{odm!O91G;Z-2lN~| zv~UZlEJ%geD!zen7i8T!A9%U!bjYe%NigR=cqzNvA2x<*%;4Z-5n__y;*v6A6J!$L z5aJb)_voQ(_SWqS$mln z<{{a8A8IeI^as!XpdKZ}UhxHtYarXcRzTJ`yxnW#_)_;jfou`cC30*Ok7MH zOrXE(V5Mpvn*&hO0nf2&&IP#VLcrK1et^ z>_g0F)a_$pXxzud(6bNGt^p}tvX6-Yy*#_~6180eN{)IZiRnJ6d5B>!upo%Q6ou|n ziDPgxv=p>rvShImW4Ok~%EZCM&ndc|O>hGn(|R_R4QxyTA`A>NOrk6tEUYXn+)M&2 z{7j4@3=9oW_cQEA#E0;HCI+$nObn{~QQhypA924ktQ_ijfW`eFr!p`w)iAipSh9c} zWn#%3y|EmX+IOg-u+ArXOP_YZa)*l*ZoWk0%-k|oQGK4SCW_xs;~_F^%)JE^|=|` za-hzXv1GN9V`yTxVB%w9Wm0^O}pKBOfr8F&Xx<|3+4@CVFH~{#@orx+{3QSB*vu04c>}Y&6LSx z2J(hK)Ejb)d`!HI3Vh7G@cn2X4nV?R;UJ_O0M%3G2bmar4>B=?9YpwN%RwfF2M3uL zK0wb+IB**h?k~{$;gtocpc_Dn;qwa|`*_!LFmB+G0+a0PIk*_y_A#nUYi!|R*u`$d zB*0cv&CbNh#$6@Cq%0xK#48-ZA^^I~lgEmQm8*wIP>YpSPFUTTOd5aSEf7SU4-Y02e!GtYr%$OCJ+cC6haoFq0Xp zJ>vnB#{Sclwm}3tntH9(%RxkyTz$8P!vejU679*I71CxGWQW{L&z;6b!sVZO% zieU02#5`na2)m2%KMNOw+Z`55W-AFxW~&2?mdsXxmdsW!Bp8lxSg~+0bFc_AbFirJ zC9-g`aWYA;c{3?6YO={Oi7|s7}>no`WV@ynIu@DP)rqBN zJ0>|M4JHdlITj5j3npVGVY}FdkxJaba@O zEK=xV1YMkRl7&eaw1%DqL@KfNFmi#G)Z2p>)<^TsWaQ&w20>QF2clf;oLQiniGhLP z1|&T*97T-Fh#X~N&_Bw=U~&}E9>_fkDF-T`{X5t`N?1BhNd?_Q4?4;Zbat0OJ7~SF zC_ke>4nLznKZqj%UVJ-`@fb5hh8P&gCv@x3@lqhIV)&j=J$&4&h7+-TRT!Wn6#KO+P%frvaahi$c91}Ye8xt2Z6Ne}> z6Bip34?k#cu!sOZ6DJ6=f~KfAm^fHjIm}o%nb^44I6?P{2s1OWSTnP-u`vm=vvOE~ zwk`3q3Rr;Fiwm=gSa2wF@N$99aJOP&V&q^7VPj_EVwYo7)g@Bk8yJB}mj*~`b77#<&IV)$|# z5sq>vm>ASgFfoKc(<^K|V#P`<;Rsqm9$%JPRGbO!Pl^{LmxYIhkKo-nI1adWURF^MrfWoEv_3_2!_`zkZbHD(qrb{=ujIwl!bR!;CB@gzo; zdEowwB@;8FEDHkpZrV<|RVh$J>_WSlS&lHPvxPEoG3s*pF!8eq zGO;SFF?maHaq{r8YH;auaqxlS?mQz)4>J=VsQ*#U#KI`S!oqxq8I*}Z?WV`ja5#ww zhe;=y7#5vmVpx6>QU2^c3CYJNp!=q4p!*|W`600=IU}*Oq71ShYbhgmBNl%@6Da!b zgHG5qXW?UF<p4GdWwlb^Ay4z zCZ{0oz|}7*FUl-Qbu9vALg4@l&=sWq>6cCVq%zwWbbmQJgnS>rDvG`b8{05^gxG9faW=b3u5y*7=$VqoUB2+ z#6fn2vdDlah6bp8AE4%e>|;C4#K3!+i9z5r!k@yYA^wE5_hB^LzS2At8x1t|IT(ao z7{Xi_81$fP-9X;E0JSdxY97eGn$t`S&8L|d+K}w)hsxvfUr|YXab|jAa!F=>9>Sjq zp79(EA}I`YMofy3xh!WEDX>2sozo3?EK2F?@#F1@d7F+Brcm|0SpA zgN6V>BdO_za0?X}#1t5|Ftf6-GYK<+b8-UI9)~j^(-;^){!2N-#E^4_iJ{;OB0MXh z^007((Ma|=XQU=)hlA3OQ({q3W@-`KTJeCzjQ(5<3P%_j!t|IbAQxU6GqppEiQ(fJCWbFa?)V3lhuIIK(cJ+Ws7L`X<$}9HIKbMUgFzvTVFHsb zlLREV9bi#C0cyX;SwuKwon>MuJj=vTauyK|HBfn&y)c@9{YIeSEdy13b_NA|hBZvG zOwyqJFNTnOdE+#Sv#{2g(Qi6Q;B*1ue;=qkuJS7vyoD+~8DVRHr#}aS zUkbw#Zg}D4$O0*(LHk0W_RfHs3-b5&3rq}$E-*11L$dc0R34YT1)x?l1?F852a~xfuLf85!>I88K-w@iPj5rlcHLOdt#TLHR1-6(syME+YINc#(-A_97EQ z#zjOsrSBpW!!%G!88!|8rC*@6Q^56O5~O@9C@G3BC`ttjA<9^B1JLH%E=GMWhLAjS ze+wpaRSP+WUrf48N^I<)W3rzy$#N(%u})`XnZd~MlZojUlQ<*aS4g24&omQUDCRLa zgBE!)GBK$#%7Oe*@EYQe7fAkKzr@7Ae~F1f_!1%>WiLVei7Pz8jzzd19-iU>D?mkb z$VoGi9!A{6NB|-L_Bt1W@4Cf8L@9f0D7+4 z8T5U>l?ACO;8WW{=QYD^7vI467jjbUZYEG)Bc#rq*+bf$*&`oH&u4OH_Kjm3a{>Hl8b>skEMVSydXP`$%IiB zltw{V;RD2d6RsfKx8@2H!{#eY4BM_C(&+)HJS=^{XjnQ4PAzfE%u57MUBX=^te_&# z!4PB5@Q76rR?=xgO1cE7y&P8&_NrWEV$i?J#9(|CVXr+@9%dhm#%V9O<_7P0lFsL1 zi0NZwIKpPgq{qg^EDegPKqg~Q)G>U3+TU;$(GS>pm5E``RVIf0P&+{`Lmx+n*{h+I zo(x)NR+JAq*E+Z)u_RSf57e&@DURJ0@pycLE3Zb*O(aet}!tfUPFX~HB=tve;5sOPkJ(Vs|+IO1w{Ed7y=9! z?g&dWu`+Rj8mZDue4thgDB2kkp!RlLL$p_yTw`KbeT|7>9g@8}p!VXLw@yz6ZIuFT zQi52m2ks9jXv%Xi1h_C<5>;Xngw$|)kVRh`p!PCcNBCFjIunE9btVRt>j?kqLFHlo zgwY89qS^~;uYo5*1MC=%iK_5$vT+HrGcdrWBN;wG?X7^C3(AKxuQM?$xX#3|7|GtX zPf*h<&g5AO(F`+5KqSJ+$m?W5ZX9x>Ov;G$1WaMDtWaMVzVdQ=##LC3Q#KXkJ z%L>Xqos29MjBSieS|E-;lRl#livhDJn>wo~n;@eIqd21pICU{FeE1CU?}rrA%Mfwz>HUuLyJ?BPm7P? zh7>Co^HyQdQ9lAK90!DXmx?p7GO@9266d@u&UZx|G>pc^zyP|R%z&8}G?v83!otqU z#Kp%6K0u-13&h_dz9nTRv&ck5xttzK9tBQ~=tCa*37dIOV8L|yOyW$k?0Oug?BJWq*D|tjGV(D>Fp0AWGjp=>uyQi40rxT)7#zMq!ePNJMEQ8| z78ApfTTBecZ$ZKaMB>`F1xcSl`S~RQMX3deMX8YDfq{WZlp#%&p^lYF02K8M2~c|^ zZi7sNlz#@dnHX$tGcmZ_Mx>L1+e{4Aw-M)v*+AE?{6JfOmYZ0VU6h|+0=G`QAS0i# zU=d?J7ektxFPq;3M$idXT)dp1^>CaI*x2r~2{JKB2um`_F|qM8OEB_C$}*WSv$Dvs zvVsPaGFS{4RanwMgGp{oY>W?};WOboBz#UFx%=sDCWbe+nHb*RMwDYeq4KbD1V$su z6Ua7G@HQa0qlLl48)+^KE7(<;_#nq&Lq<6sK<#z7gUDBrcbFIw?l3VV-$B@0cn1=m zxW#e4 zObj>gFfrUgviBKO9#?xdJ--;Vbvi!}ksyQ(boDtHk~|nDF{#073pEz-k%tTn6QK4Q z+=ciDWUt3vCI^h`yXGR zdx-FeyT`HiU(4t zFa-R9gv$x2`Jixld5?+V=RGC{*87P3YJH!H!TmlWzrKKuC(r0YEg#|T00&e-B4V&j zd;;TbCh%HXR?zBMnM;f&iN?+*OvYRc5BRiLn3x5agh2P$GVwFXFbVUqFbT47{RS=J zlM-a&5|U@)ImN~bTFb}8`;v`mALv}~AeI&;CO&2nPy_H1BU2)yGZT0*H7H~s{D$~z z#(hM%Zn@9Iu=_p}!@m27a6JK)hvj1!4U6yGfTH}gcwe;6FE~4AxiFkzRR#4ZL5(p; zc4jd61F=^Ca{MoNJWuNZ6NBLcCI*uS2z%|I@-X{gG|XP`I#o1V!DAd*VGJ$2;6pM& zw!()xCP3}&fSL=6$Au4=7*;%BVpxr2?^dWh%sv>6VlOD}5J?DT?HVlBGJJsA%kU5p z&e9K=7?d9}F{nR8_}36Bk1PGAm6oJdlqY7VmLi6s#RH}>`g1cB?O#i+$p#ROjC zY|Nt02-(93isub~A>rKsH6P^f84sBlRy<^4Sc7E$NvJ%mevd#~UzL|y4&E^b_qO~5 zrhP2nSpas>acmXuSs11dW6VdGafN9EP905PBcI}za7P$;Fd?i zI?$O}Eub^ADs0UCEdtC9ELhD2jQMi-%=s+181^u$GO?^?TA9CSfLj<^UE~CO$@1 zMouR1&29~h5P$tZ@|WOaCI-dFObn`z5%C`U7~*eOxX-9WEiXVx4K?7!H!!Y*tYvco zjQ~{ivM~H(wqWsKkzo>L5@up$b7tjdb`;`cGG*dmWM=^#c`D2#%*Z6j4stul>8}}C zY?&;Wf>>oaB-o)bF@YK4-W5>yfYQma$4m?tA2TsrL2~Z{s5~rRz-Up^?DSRnRmJb{D<$bS1LObl*Mm>4{t zAcYrH9%e6$hS{Hz54IV}Vk3JFh6-PXS)8DF0`D?5hjhuo=`H|j?*gc~AbYnwVPe?* zgo$AvlD#LO@-X{gG|b-I#7sm{E^MHq&%q$!&hUp(g-HlftALUeI|IW4sC@!Y5&ck= zr%Vj`Pnj5uo+A9|@DvgbxcZ@R`#@=2SU?7Jt}{P7gM=N!5+(&Eb~a9CR><*m29Q&f zA3*KxfSL>P=lrKk49lJ}F|0(gcQaHT=06w>^JjWK=tOCxW`%>EJqLq?C&MuoRVL_u zCu5}WHDHCrE5kF0e?az1J!4`}dd9?{_6*@)L#RB=J{S$NH#xC5y|^T?q!g)95wHw2 zBq(v5k>MVpfmd{I+n+6nc$J=12W-yPT?{;q(U53+yeb0&sG&zTsO zA=$qXDi5<4M#Jn!wmk{74jSQv2FBf>9WD}gm>70xI57Q#x*?FM5#GvRU|7HbaRT85U?_Bm@Vjy$mlA{+EBr#Gw9? zi9!1%!vFSAd04xeBM-G6NJZG2mRO9`-3w>~wE-knFfuf0+b{_+2{EyAa50K;@Un1$ z&at&&(Pq+M29JY+GsFj|duBlG1BJt(mrM*NUotVAdC9~8awTZ(z>Swo4EJ9m&NYCA zg9qC9ESkIGi&7IIhkYW?v{}e=Fh~S5oYPih5nAq%A;KvDDvzt3l$)574o{-O0k-}e3=$CxU3!{Ka*%RZheZ|C zFx&vOZwAynP&llA#l*1f6%)fwB>N6S1pYyh*TgPU0W}Zg&lRtk7&gCVV%Yy05#JA9GcmjcsfmZAyA0_5gcXY+e3*YVw2I1e zL2Xe@y&}}&Ai&X|F(A#Ki=m6LDw#7y!&biQzVq zz0aZYxZ(#?TBjBvRaO@m`x(JkgRq|mZEN1a$gqgplqmzeWQB`?p_`FK1~Dthz!1O( z_5WLh|J~j)F$BG3Vu*W-@P95;9_DWt4f8)}2^#|glQ{Sunf;9R+zcE6I&uY`+yecK zmJBQb0&;#DOp1Lh0&iI?85k^>_Cf290Dg%53!vtM!r{nUCWaGlnHbJO#XtoL%%0-x z%z^;$DY~J>si32JkT1V%U}9Lt*ucc#(*W@d0|P^V0K|NTcVM9gkof}dm>6W} zCT5VEA()Mw33N^#D-$CVBO5CVH)Qb(=v*fuNH}S{2Zs~5zij!QiNWSQ6N3X(3=~kX za7rxBg+@6e!wN=5hDpqj0lWgJIR)<#?aqexObpHMnHbu!n3JAgoLB}r5Y3ih1*0v) z5@yg&0?-me7Elm_9nZwX%EHOS0&(gFsQDL=%)j@ZiQ(~kCWhx&%?HOOi$OWV3dU-N zQ_Or!tZbkl0bSb80=fYh!e`+GpZW`mR8ZuC&M{_TVq#!05Qc<{!v}GFb@=~OiZ8{2FWpk4nJiA zooxsb0fpoOsJ%O&c7W3Dl@Ck|*FP{Z+=hxF+gpsd{5HP0JhLPjwA%m@HP=`e85lM| z&Exop@Q3V2CI-ciOblutG5vvL9s>i@8jwkA7#Z%dfTIE&EucLIkaWq+1WJueT0Nn;pHbLhIdeNK8=&@Bd_mab@r8*Yr+#217;F<&6Q z$$*A0HhauWK(nP27(@CQIVLbdtonzr3LFpy5|D6Pfn?v#FH8(azc4YJLbC5X)IJY9 z{xUSOU|?X9p1@Sv&%`}}Nr+(u<61_B29C9i3=9EGj*Ou7>JOmyNqj~4PxC7igXvc$ z2CJ_K|Ji?q_-_Xu`;1J@7#Nu3Ca{$Dvv5yf0ok{Kk)erW10w@NFx0*Yk`VuOAlWzb zD-*-guS^W9knCFzwa)@ic$yl5`dxApI7<6DxF>Kx?Q21?&p`@e-w!1FxV|wlh<#&X zkp717pTakY|0MAE&(OdK6oYaT1WNk_xF-leEo?)!@B`GojBkkWtop{p(Dsdqp&QA* z2~hiH;IYrhzyuV5auXCv`xUq+C_wG&K(=pzG{k>5knDT)jfvsgHztPPNcJ&&hx!js zc$yekf+Emlf|#1Q`j z;op=WknsJ1$6jM2b2CtcnoMY5DeZ4y;hxX{&Lqbe8783H`v7Y11|)kA|6pRc^n;1v zI+DG2p!Qba31>4?Q)5WPHgJ^oH*j!IXaHxHV~h-w(CytI5AmDBUqudzd?a}LIXJS9AjjdhGuVoBE(*aUkLx|{98-L z@C)Hz*Iy9-df*9XQzH{23upv8l=e3`a8GD}Wuh5q_9`er?45vQ@6umP4BLM(G3-II z_aM|>4LtreG%&F+HHXG9I4^-S6FfJ~LbCe<)LxF?2>;6dW@6C)&BS2x8{uEe-w^+< zz+E z{sK*i{U4C*XaCQ{AoHJzLGeG5|Nle$AAu+QO^wYg%ndBTtu3(qpxUbelIP%=ZVjsa z4q6cV3;rYg-|?S`VeWq>hDAvBFNfN1fye)b2Ij`*CWaQ^))&|TplYlElKJ4dZykyQ z1hgUc-+-DA>Q}w~&&2TVKNG_zs2C`#!1@88!PCmj)SMIs1|}Yc6^uL#TR2!)n3zDL zFQ9&t0@OSM2GFQ9WL(&XftkUdfteu~Dh5*b0osp&n_HTclbH-&u?XGm!@$4<>eeta zoZ?_)U@(B1+rYrg09u&^a_1xlW`?N@%nUQ3<|4Z@E4KhV4a>m5B+IaZQI_Er2dG;F z=^im7x?cfMb8kS*0QXZLFfcPbW?*J`4iN(x%K#r=F=bf6Xv*+`1Jq3hnFi{Jvw%DD zpl&kAYhd*gpypaIGBb!k&zJFGWM&9pWM&9ugoF)9v4tk2zXc12#Nu4&Rx1Vurd^-_ z*u}^&jgys$m4%rHWG8661=QsR1vq&8g$*<;#mU6N1?rT8y5t}}cwhk9W#?pKW?^As zlmf|fGJ#eWg7kuD=vWZQ!2vpubntSULGc91`#G^21zD}dqFv12d?yw*dG?3 zo)6l12io^+@P|0Nn3x$3 zGBGn8h585NZ&CT3;^R%T`fPG(5B zfXo5uk55kqT@MNxuHs^N!vi*<0jl2usuq-PeVCaU{F#{y zFe)(2;sp)8fd;ggSs-bZ73AU%P;&!Vm>DFX@sYv8%#hE*%uoz97nHstp!orPTp%|! zHzTn)Bfc!LCO$9eCKonPC?%ANW8LP$~eW83=}WhrvM)k`8vTAky_o7G{Ps zEX)iSp!R}14)af9YB9(j1_mY(h82t=47Ye8#=!=V5}@XBup;~+!^+Gc&&tf8%!(O4 zQ1gmQKs#W?7*;TfF+Af1rDsqsWo2M!fSMNp)e8#mTvld=LRMymGN>39_a)_nFB?7z zN^3{C82<3Gfybpmg%N0^8a&|51PXpO@cwmHHc*6s0*DE8w;*Ws9(<&Tg^7`ejR`as z&c+0iWnp4uV_{5jE+$auLEH)xhwxy20=bTvi4ENk5SQa7VWA2MA<&UQ z3>S3jh@B3*7~XJ**O&djij9cQ`(H&%@qRxlbfbO}RT#R)psfQb#1X+ir9O(5p} zKr)w`gPDPkgPB2y1E;x=MkvDyMiYj4U~@smI>=<0xdBjfBRH5DK=mLf-DhzyGvsnG zGZaG21&Mn=%L7>c1Q(5t!M^Z%{g*H(T0m1c;Buw_YVHaSW(G-UIkSs{nPD#nGs8is zxybn`H#IjEdfJQ%!wN z;Q%uiQD7-EtYB1T_y9K^lw(*~pvE&?fSRAc$;<#cSO*jyMV!nGrJT$Rl~~MAEi5j9 z9ykbb_asrQ?q)EB#NQ6686a~{b22lW=VWHM0u{pu4`}JKkBMOg<31*aO`B^5eL}~#S95h^BA}xdO_hR$j!_k%FWCm1r1sXejPvVOYVq zlZD}gI4F_Ad>;(^M0Q21bDgTz3XjfoZ7Fa=e5pfmvSD=QP&PvDs@Ca}9%IhdKi7!-^Q z3oIbv`s-q*gdpf^US9U|7K@!SG2A;xbmy z-Db@d4C40ba0M!0keHUSpu9DmiD8aBG+aQPD9}kiOrY>(;$Q&-aIMV(iC0i)f>Hoz zj*yWL5;ve3Kv3Mm(g|1|RQZF_2OB8Qg3<^mk3jPi8|X9}kUv1J1Xyf9~8Y%{IAS@nIO4HJ+ zQj0(DiZ#nAl; z+QAK)7H4Nz#n{NsaDx%#J!U3|H%IA_7Y?BDCwoXbVh~33x8;PH8I**X8PtU#X$v_W z<)-E)=M?$ngRamD$j=0?2?nJpR)#fFXh z$im11Y6mcasu@sQjS0pFxswsxlLYC2ut27Pcp!`r0f~YzNE8`^@+c_W4md)>H$eo^ ze<>7UW+)Y5W~dUu8os&t-~~^+c^TF*?&f810U6IK268^gSuhL=P6UPqCa46vR=7B;7gh8Spze6x14=B7) z#XyM|5?dg>Ad}cZOZ?#31>r-GOF>-+P^}L#1Jd1vn#=}j6hmY{sRfjZKr~2}nFZt* zko!T|iyhqj1?gvpcYnYpgPPXhB~qy7f?b285~LG^!Fs?;3PElLiGb{aU`7Up1`kMn zC=dsyeQ^7-Nt~IXRh*fj6Cwu6HVpBgg_eoADP|_|IhlE-6$}haLJS)ig&2fD?MlQt zqXkg&4nXvR%{wN}%y3einc*x%3~U}~p9;9auz``2VG1MMfDKUn3=+%?EYSXxpae66 zhy*i(gap`)VEwT6LUCm=wBg3Xu!)g}K@JqxkR~8l-2te10U$G==EX@cGbBndGo)fM zFTVgh>ZiuAiBXNg4CFV6fuNiV;=#(14^VSgNH8<-K+WAL!OXBnf|=m}7ITwx@{3c` zK(iUL44W8b8T_yt%OKzhi4O)zW(LrDAW%DkUy_+YNRpXBOcK-o;B#ph7?{)B7GQ0F*6uTF*BG;VTMn7YDq~ZDA*y%;|wFnG!}UGo#6u1 zyaI?`u>0$!m>HU+m>Jq2Vkqt}O3W+jA9Ib7(syxN+6)@VE{ERLmH9JDy5kjYNVMN8nBp`o0*rKUj*{GG{YuF zX@(wnQ3LWlBSQexyd4m|V1J*IW@fl5&CGBUA_npXydP4Yn3Dr?A9(i0N}tid0Gt{M z80InYffuHN;vbacAdY5X;sSMCK?6hJ`VdqmvVfKz9)Q|wAOj8qu)R()%nZIV%nX4L zF%*0A67%xm_B!h`8km9Yt!KE##K#6I!$GraPQPp!m*BEC$`=tH-d3QIBB;GsK&a*a77+*h=pLsQCi2%nT~f zaz;&-nL$&QnL$?;>}Rk;VEL=KvN#xaULykolLEsgMg@iq;8ofn!$HXuocbp~&CP(A z0S>n&S!RY#S!RY_h!~2wph+Fjy(~y(vlv){!_JQ32xyfyI6;6y3>12xx(1wQFF@_N zAd46ec_7Qo@LZOe;WZX}iZj#G%0c;6M1YqcR6Zy%++zk6ydc+umR&<=e7W(IFLW(I$V7>YlNGt*0o5_7>N&;rJ^`HUbtvKhWH^TF#|(1rn!ZJ-6w zkO40c4}`fG7z&{FEr6H}wr{H(Gs8|fW`=zbF%B z7ig*xl#4*)BcQkkjn{$Lpe6^54HoAERp#tWOl+*6MkQ#$G81Tj01LQ*36%re&cI;c z3keqwc|^EG%QG{?$ulz~LBzl+;prwb9Ws={z`(@Ku!)hI;S4LN83LLs11WTXnl}TY z7wqqq^2`itZK*T`G;Q70_ve-8ld;^^Y!zM-xhHI>#0EDJ;7Em$-`3O|NLq?_> zpyvO8m<2YUSAm&9M1h$>LILat6!W3!5o!mEfe$z-1~U9&1#0*|U0h+Y{jXHu&2REESEG9Nk>R|z?Xu#L4HDw;Q*+)GazPw{k1}gnPI&WGs9+x z7^=CcB_%na*=m*mTYpflcVhU%&c_ED(*R{u$i^dXPz?sw#;^ct{tt**VDmYZnHhML znHdC>!F~ZNgyq-#V%X{!4u(yP91M#%K%v6OumNh014IwloM>fchB#$rh9rm>iaEu} z8L27p>8T}&X=$JhLZGWQAvOFONF0E=tDt#Qur3CM3sCbHK+FQ0zg3x;VTUp^!ybqj zSS8GzsRj8tIgooi85o!Z7&b8qFdX0j~m0KX7E;HX7E=-*cYq@38N!u_t8M?OD)7=o0UIffPp_314joV z14{>J?2XBZi3fBL1_J{_K_H|YS%75kK{aNE6Kc#1r;+SE2ep?7f0jaTP6Ig!wDAO+ zcNsoF?G;c*_*Y+@nZZb%nZZ;Y;zv;UCZs_2-@^8Ff(+HuL-Hq@ZRQLd<_s+63|4oB=scc$P#i91VqjU!#K3TrkqLHUQ9>BRUIQ(Je+#vk87j1x8LG7q{;ks@ z=-=X!qSE9Ng=&T1%&Js{(#*UPVYx)GK&gd+VFJ{B50Koati#Npro+sj zsY68gP~fUC297WWmN2kGK0w`3po0`nI?N1Hb(k4u>L9{tF4Rp#vk+pf#Z(67tPFd50-=}>!#@Gt0U0>|Rw)FRMv zudYQ!-~v$Gp%Z*~z-mSYmeq_53?@t=V4nv>LF|8kWIwAOGlP&GGlQ5O!rxMQMEV=M z?FrLCg~oc&nKv9Sm>5`IFflM3Vq{TftOT9F1zL|04RJ??9wHo?^_UsD^q3j?klZl| z>JB2pAs&2^6zK4TfO=3lxsZ{8Wg$4|p>-W7!4oYS{=`%CbBH7yjwU-$G z!WOvWtn3&V7&budy?|uzOMPaBFZ#?3-;wP71+|x8I*&)#3c7+%%b%TrqlST{hJhiK zMF4bC3n-Ks7!2Yd{`D|G_&42vnIYeRnW5MK5zgfXkZ>l#zr~fsx%qjZ)yCjB?f~cP zRg4TQtH6=$1y0`&p!V)SviGV1Gs6u7W`^5PyYQC#u+}e%Z5|999t7I=W>7am_)p7- zX#atZymiVf0hPzNQ))p1BwP!S?CmyUX6Q3wW|#=Ii>P=*vdxBp!-j#y2Am)_K+V5_ zWd3I(W`u>%nWak?0pZl zmx%nAk(`kTx?UQqcNLN#{3fNca-;C&D&oSbuOLBLmAs zM$m}^i2mRKsJ$DI>^)_|%y7|!nc)hOz1N}k65-F{(v*DAUJ$JQbV!EyQ^6GBPYY9K z24_=d26t10KfO(f^e4hLy#9OuwRZ-Rz1vNh8TOkpGaN>;_c+vEBK(HZup5 zhQ$N0m!}g_ApR9FL-<$MjG4j0jG4j44B=k~Ga~(qW~+lgV?Y$B&fLSuz_N#tfuV>+ z4OVA@5^_K)#Qq6L_OCW$X4quL%&-;7{vA;JiSTzyQhHb-q>~s0Dga9vSV|cf445DT z8z4(T_su}<H;a^QlW(EUGW(H$Rgn!K}iT7`QQF3Z} zGU!xHP>vG@p8eE}3~E-)3|dwQ|LR#0?O%)wNWjguU5uc%`5i_EmOJ2PTMf9`#_#}Ye}xqyyysXk zGpw*;W>|w{{|2c21oInq+oys$W&)t{<~Sn*%W<#^8bC*=ZODT9AIW}kYi0&HYi0&T zYlQz*tV!^HFz6_Gr_wZV3J0C|haTGu3g~N+M8g5@NbO` zGefftGeaAay`4~diSRG7tr*@l$bp3K1tk04+AuSGv0-NTj%432sC`6~TcC64;q6)M zvC6)8I%_}K_b}X?(DX7$E5Xgu4^8=E-+z!kPVh+pNud-08r8pXnz6ljGXw!zN=h<_g-*~{R_ z%)sr)%)sx6@UO5V#J@PxaWqa_WBnNe_&}9h7b62p7b62h2$K#xJx_qzpWuk__j*TW zhHZ|_3_FqR-vhNDPdvlNgkipi1-$~gfHhpCATdQD+9DP-xNZR*J;&Y#7AS;-6NeMR zouN+53<*xm49QN2a7uF`5Kh!_r9*%{qXUaQI|Bz~EZcy|0y37}0CndEBzLknGc#~I zGc)ixBit$I3~?vEbYy63f*5E=4?}nm!a^BupoW4v76l9}1q=)hOqz`B3?HEGjBrMT z=PGArhHcKw47-rrxew}2-06;Lt`tvb0S(gf#d9-oY-MC%*~-YkkjUf(Nva!)pz-g5 zaBrduGed?8GefouB3$!aAmK_%IxR+?-+_g59^^()_&g6>9CV`sR1}(Gv6W>8#Sr&y zKyoj;D>DO^D>DPHE5wa>>syR;N|`HR^FReqcLlg2!f~xDGs6~FW`^yqh;ZBmbtAs? zX=aX@JSlS}?)jkyP1A9#>^1s#>|lDMnrfJHyA;R@C)U9~ZCoHAqf_i44QA+WE$xNW~dn*$I%T^}PMC(;XNH2wfp`jFFuYx-w zTrAz08Qk2N8NA#P_WHR)!iZqI0Lj*;pw3Af=#B)AUSRuLGc%lXXJ)wQju;=f;?B%)(;ahs;0DI{KtWDoW*&H405LqkD`3LUC?Lkb z0T~>2Vi5yfRmje$$xr~bU%><6e;W^G24@du1~(6c|2;h*{wE^bp$C+MJ4x8GHn^Sg z0c!6IBzre`Ff;7+U}iXoWbaX^y#&J@*;d@c01Oi`;{BPK9+H?80`?|SBg2wO2E2j@9IXr&p!ODcA;P!Ii}Bz0X5jW_X5jNi_*c-I z6#r)CrGa+HVjVe#`WI?%f;YmyRo=`Dt=`NG9Z2?eL+!=c4uF+f#hK}FTO<7$16V*4 z0u>A_6`*l)Xd?-9etR{7j#q+WGyky?moi?sJ#I` z2>)jLFf$bSFf)|;Ai}u`c zXcQ+U5xkKaXUtB3+H2v9@MnlGGef*DGefd3!k_8BknklOuPC-A!1~B-j0`Mo;6Ac5 zxK2>0h4^;^lD+4BnHjG6GBeylviBa;USj-PnVXcK6Q7+5T5~FnI+t$31es=KxB#_R z!w=zKS3hQk06%7i5I=-}Bm9W|3W8_O28CaGwGBC6LC7IfMoA} zKW2twe#{Ifk?cJKwU-G0g0H3v1|=(SQH7%ls)yJs;g9gIsXsG=gFiEai$B7@9{xo7 z7tK~sr;!7cbsHENSQ@|)>;UTFG(hd0fMo9$e`bc={>%*fknBAOwU;FShJY@D#^-4U z28ITRzXbvi{x%9=X0Q!lW^fEZ_}euA;%|ca7vXQ1?cxF9{)_=epb;S0YL!k#7SLiD z(E0_a{S%Pv-w?peuswj8VHcA9d!hCd;s3JKqTWgx`g1oJbRtqHEMNuUXg3@j5E85jz{>H7fG-UcLl=La$~EDL02 zSczos8mPVa`U{38@PQG;>=TX^VFpbQ|NcO-S2T#3K{<$-K|KiJU+o|Q{*A_Ft9S$B zOh(Xr6JI?y1IH;w29{Hd3=Czk&L*g8Y=+oh5rhcuBSFjzr-PUo&LP=<5o$l4c*f|- zf$rOdci&;{Ahhngi2)IVBB1O5b*Dlw!kt;c%nYT$%nX&mh;XV6hJ+K&{6Gy?y81H) zfLEEpX2y$IL_mvr85kH8S|H(h0?D0{Ag+SbiFC7_~A}v6KwL8cN zRE$9p1_p)+Po*oU>Zm>C+wm>F82 zcHkYiiAJ%-l!3#PfyI=8!Jr-Dj}u7dz6xVz_!!2_@CC^q-=TKkOaI33Vzd~!ks=&` zCC(N=?R5x8gkM59GecfDGec20BK*q2A>oHRzHrzo-oUsCQItMrWMFyB$iPs~6a{V$ zGEC@z`1=5o{nx^o8SaKNGdw`D|1s2l{QicVh6QdRVDT%c*kKp)Ff$xLvhOg|K79TIkM-@qnH_lqY(ZRk0RthB-`-#?*r7ngeXLKHbgNqv_~;BbRpT- z3$+iQ|IADg857a#$KJq6=z;k229mwsqL>+&qL~@kq7nY&iYDYwthS05bTYz<)Lo1W zEV~#P7+R334F-i?i2V`K2!H2AGc%M%Gc!~m*2?Fu zz7F@Mx@!fJyI#aHGrW#vW_Sm63*Pz@ zqa8}5Ycv=*G#FSkKxGIBe}KBfA`THgJL8xc4#Y7t9F9YT&#^et!zVQl)K7(k1X{D* z7}9D-h~}lHra%J?A()(=4-Q6zNMcTAdR{Ih(9KMs!HccuUoZg@?*j1%fAz;RGt7!- zW|$j~@YjNPh`(^AGmLPim#?r73Vwk4>jjd(98#GXJW`n%d{Pnq3P^?ciW^oBZKB=@A;TX8QLantzJb2O(v;_^O9dvwWv2S8gc4`V(4zwK&CI?z} z4(by5rB;-HC6P74B)#&JAY0dvCG$Y1j$mj3ZGA5)QOL|ILAE6iv||}VZC*-#9waFv zo12)E0~Uw5FfYF(72)rU)SQCUBA24X%seM>_<@QUgmj)8sPu6LEpP`-RTP69f+Xvb zSOT8HKo@rk4#uV&6zo{VL4$5sBw*p?0`eEC!-`81i%No1a}zN_0i+3}0jp$EIw;

COA^6H>43rxITAtJ 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:QH;(W?*12_zww326aUFt*Xw-V5`o` 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

eKud1=gT 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%0Df?*4G8Dk@c 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

1=e-XOG*cu0PBqBfm0qt2(ruw z(W(cFg00eM1-0hQ%;D{3(BTP*>6yt4=USN=CNV=Asm_RIGhCiclA{=W;sJPbF$08S z#J~tyi=A7V!@vYtLI;{^0-wLY0_G!J0XGU{6={hAl-iI+W~Wy$eKi|N*D~}Kx-m7ic%O}K!;Mw)8Shc%S#x3 zFhCTPgH|X&>M~F*&aeYgzax?!+<72Z3#JwoSK zF@R zq$zlMmO~M=k_TZ0OfkqTzGzcJ$cl1E4<0_og|wy}JRg>x3|jk{ie3l7%W=@S5p*Xs z!X^}*Z;`{Js2p4kf!3lIfyRYl)eK}fvzUPcvMLn94FDZt106dl2djo|vj%TwEQ0N` zhA4&{f&)Fa0U`wIzA)&3haVAcgSo)58!4JV+miBg!56TB)}cXHSc7$PBZF9oLQ2FNswT!$E=2m2aPpqJySm2>jb5oI%I&z4hZ8f5yY2o_Z3usi@d zGeH1+W&)^Yj>R%l1zqt68qETqbZY@Vm{1I9Wk5<&dRSr+gM>JDFJfiFv{#@q3HzD| z_?RqAC+vJkaAJcTe99mIUR8kzDX3bI9l~0WRT!WqDwc^fP-%iIY(QlvsNaQLg5`o| zF2F{j1pp$jb2IbGz{*fV2(lbRp%xV3AZuaa3$g~b?m3r1fUge}7$7qkBuqhU2JlcX zHY*ual2{l-K|TX*FaRsVW+lVY1QrHSkP?tm(3GEHEN0Tl&o6-oL~&|vBB+;x@Dun5 z7!$~e2^I>q3>*8H84lD!>Zjk>&VT`R?MN`sL6QTcgMopkALM<|ieHIX5EH5FfjSDk zXaJw`16|C|0qG+`@-QMj!2AO?oi7^Z4{+-Xy0BdXOLG=9NCWo+h=T|Z&`K-V^b>OW zC{N5QNrfM&i7W%zi;YzZwEF>@Vc?PwqY?$Lr2vojDAY1IfR=xjq%tr-b|ZqE#lX=q z0ThN1r!a^>cu?yZ6d+uXl?*x%HrN{2h7+*q3^w4(4YU#xJn9PFF#@d*z^z`$a4c;3 zX9sl3!jS=7n}CLYpn6)M>n|M{;K#jyt1ak-vpCOt0iDtbtGK}jVS$ED89@CaX!D;1 zON4>46+FVwia=0%Pa)a}u^1X|Ds<=rq#2ecL5dkTdMAR~6?|AVft|7d+SHRmq*6D~ zO<|yD32=tBEokN0!0dl4PM&;UAF|jg;4=gmVs}$Gk}anKo)SJpJWX&eA7ha zRt?BR2D3@XEgG;8gCs|OL1JNPDg#40$ZAAx084{(!21ogpp8^;9y|m=Ap+;11!sBz zqTWE7(N6~NX2qD%&q+-M-I)hYwTMgvI%qQ^HKjBMG~tal)C$rOnpXljC=_{w60}PP zlo#O+191>$mM9>t%Lk2s7C~|e$S<(iO)r4;3Zc$rfKBOwYy~y$pi{cY4us9<7K7A) zUB&>N?BpOBghcPX?tNpj>(z|i?Sc+Dyr z9SfQ}hh+`WIx{RQ&m_b_Yd&H282-R*4^rJ+T$!7cpA!!{Ku1D+^%O+?-1-lCjxMgujR$u)AjLB14gv-V@J=d3nncnKvKek_8E9ibejdb8k{nPj19T-|S!xlo z$q3`1>cH9`m=_?)QIM9x zz~DR$6z1S|wE@VVnAh+rnv@k|D2d)_8dtt5USm-7oJx@?LF!W7l zW&kx`QAH)hPfkbVjwF2RYEd-`NOCwO7K2J;Gf-HA&i#X|=VXvTRR}U4oI+AEi#$P* zESIS63~?z3M?~0eo4zO%1z8+(17s3 zn|uwxcVuyZt9y^cycAF|&v1fa9aw#SX-Pq83Bv`3qaZGW1d1a-?gBSwp$i-ku4d4P zhc0r^m!GJ+S(2cKUD_a-X`lVE1P9%!{%Y7qleA3^}+X>ssnJOQ8+sKA?e zobwAR85k^QfkG3!O&zxT3Csxwoqh^kfbN%C&L9v4QV2>ndC7WUL!QoLW`LNPmk%*Z z5-JVlgN%l36x9TEYarJEfDVNb=IjR<2H6UOCI_+x+=oIa2kjePV8Kr0%P%cqP`Cz;1yBMu0Pjm-kU%mB zWHQ84kOG4Pe7qE>!3*lkFmQm22o`Y18R}VxI*`qXav`~(RIkFqjG>QFk|Ul0x~jt? zvDncym;rjGA_s^Y7Qt{3QkX)yMhu4#d?#N|Lx#gBd?SV<2)=8OZ!p7A1m8b6BG@s^ zmEjmdD8SjrH`FK4C6M7blAwQpvtI}Uv=|53931Rw#BdU!A~@L9nBf#MA0%)ZS-{oA zkl_rffDyx4s6af!If$o`ia%JGxXor};Dwbwu0=(8`JkP70?@j|8FZMvM}B^`TONZj zC#X>21m!1AP}b%=GKZM~T*QECE@YKWb3l0$obegdx|kUlgtb8JA3dM^Wbis0hG%m? z2?kXx0=3mpm7kZ&Adoy4l!8hs7&PvIS;?R?jv-S(2cY9>U?I@7(FtUMD3JCG3?=hG z4KWE+n?SaUM#q8$!PZEK&zg%U(7}3eZE-Rwz2nF%b_ot)fRvOB5bMD< zf$TxHI;046gt~;d)I5a!xng*>*ud?F=mhN}1nnb-dL43HEC*yBA+xx+B!z(!TrG2C z7MGSJGjM@9NDhLS0RfNC$&JnJp;NAlcp@biy-_Bu6ep4+95S38aMp z&GBF*tn-<{qf(F>1Kd7@9sE`YXkqD_SOA)a05yz2j$+^djpZ?L zY?=>Bcqy4hC6x>kstZ7z+|1(Q)M9wm3JI0O0*18t(1KS#5qzSY9;C7WZL5S9#NWV% zl`$}Yi%y8MQ5A!%1A7=I3@x)k2V8(GLK6lV2(BQ(tvt|}uR?WgtQJV69_ZNjN`}+1 zEDWL`>jD;l@*?;R)d1+V zI?#F*JRhL&2^?DBUZ#P>LQu#-PU}1YIrxA<0?o{>17(4K@KZRg*F>OeHQSX zAG8KW?#@8&C==0L1oA2PE)$e{(;UG!so}ae%^s`^vY(Fu`QEe{Upg*b1Vw7m5)I}98~|oI@QKs zLC(S6c}EPTfb$)=%(GU2*_aExhB2`~p%&CD14~1SH%5+J29715(t-h=)^ido^Gi#> z`9edIqlAG0lH3!E(vjPQMX4pwpnS$awhoxdT=XI;VMV~5xq#Jvn)Z* z8cCTYVUXQ%lb0YT9)vik0)$Q7K{5xl{RZ zP}-@G3M2`3wNM2E2dI1lT^M9!4jRyg_3k%7N9Cl!BZSHMd1ZRw9pT`P6lh~iVqQs7 zW=Syv^hlf3iUKefcA`yYVle}x8fTCwE-6AYz+)+Rmn_&sGZO|0anOz_SfU8V(-#zt zhHOj+?`-8-hN$md@MwY@?QU$uz{0{S8V&L#*g2rX@|`nM6H6E*#6yvcI?sov=>YQ! zl4ePcl+>J(L@<9hzDIUBfKGz!z-+jtH<5 zQ!7f`a`F>P7;Z0PW>^8Obi)x*0+)xz2yC-sYDED9^k%fY)O6^`9KtPdZ6ISohqS|d z1(y(7&dhKC>L$>xd}DL)7&bVvS3t*gR6)DzL8H`$W(*SIptTjS7(9q41VN_`WagEC z1Iq(4_W?R_zzFrkfgMo0#X;>6LwKBnVq6EJi5oOZ4xWPnhZG`s+m5;0h&V4~4hzyY z14)~iFgV6QJMy5(Z_ptku@Gr+(+w7XJm4t^BnhYkKmlMHTbh>%I#O1@v?R?!FEKee zwV)&@F)uxp!FMGy1N@W}ah%GSKx>5I5mLG1r6$gOLcHTCLswF^iUgTQ|XyEG4U=zzrP)u1*!d{_&lq#(73 zpBrQPZhhw1!Z!o-wWML2mZMX(iA&@}|Q1&b+DS{tlr30!A&21`XE0k4<4>kibv?(g)g*0xq^8%SE7>8MF=xnmP5rIUQn= z$y!hY1&f4*Bu9{;83RMlT2L|#0@b`C>p)DO#FETBXnP4V;|9<5=mvw%qkxn%5E*cd zadIu9`qsr$eZ$HgxK=hv4xfAm@F6e^93Gjlb$+1P(3DgL*eX91uNay!fUHAz2gozx zf$I?N5F^?h#zqW05O;v$0_+aR5E=*69kA{-iaU&r7(mt`mt$He3LueD5dkgNq}GB8 z8Dmp(SUC+3g#T-q8SX(#o2Q^U$%)xuS1Pl0<}pQWQ-A-RZ!Rbf*Ml~aTW*Vw(J1u+H`H--jiUV^&!6*R@B zgHFuCp6(Aol_Y??gyvwVTOL3YEXdb}=GblOgXY4uVE3Xq7-|lz{pt&f12iR22j7DR zuqr6cqA7uzat5kI5FEs)kpMMi1yqR)$Re~<2{q*lw7o13G6gMFK}~6anj!|ugIMiR zfy4mlJTgNAv?2^@NFOxa<$|1o76VYH!1}8yAg7>Z5vVECpiYql1q*i9LOUd&7PArd zDC&Y50_vEUU{}%v4Ha!nFGC#*wFcs4w4jAL_8v4vrGg433)Fyvnz92LDpm}9(P(K7 zY6t@)XhFSuG^aw1fQCJ&jzMzL7NAf}#f1nNS5n5CtGRu$Q0E zf(Mk_Ezz6_HDVn!Fk%__qRr7_4(iYc(DKa#)Pct84rrkQ?#-f^0ksC!VNw7k5VSM| zwPp)6`uRcL#qQW+P$i%e5Om5ja=8Sx2)gJ2)GfrG;LRXm2JRSRkJ<`|3h;OVs&}C- zh1vn~t|40bfx03GVuTRLE7;?97t|}D{B4Ncw|)>qctJsiBZXXprqfE08tlG-)?Qp7 z71;APEN(zyW@v(@2I`?V&@?a!lw3{FJPi#NSV?UFvI;GZp~gf(yabA3bL`HAH9p)x zIUFrfL+xpRy2SxhBcLgP+5YEfQd4y4etU zn2rLg2ib<{mYmFz)S|>3@I|K*;`fnUi;zv>0PR5m8wzt8D0E?0$e||9L!d|l4&b2$wD5p&;l;$ioy-idW-q8{H?jl; zs|5qd0kV)#l?9c3kTF=OB_#+66BC4b=%_EKtTcg~9Sc>z0b2fnWDHSE@`0En3_Y|K zG%#gsq@w^GEz^Xq31<-I1a;s!L1Si|;PWvdOL%Z8=h_Dv?a4?i&VY{76z60nXXd3_ zKzi=g`#=Y6;FNx|hMA!Ox^j{OW!MJO7|2`?Y|Brw)~tFYziQ|O%VYGj#2QwA<)%y3<8kI%}Xt3knlJFs2ulPO7bSyJ5lSjfDMqAi^tdZ7N`@XP#gS560(A;v zO93c*fj7h@78NB{!dC@?ZjS&r7?5u=fuH#e(ZqTPv@``g=dMtVEz6ZuBCX>GU-^az zNU%RpZfixz!Ey?UA3-}wVLnF>ZqVja4#*imAn!u23<2c{=#4%g&Cs2c$mtgB_B8N% z0ZS`p2Bb?%KnsgNYYrG(%|QtoU%`@$ND$z=LLl4D5osZrfdg`93SuWQc)J7m@I*0T zE%@1mVBO&RRggs?N9Kdhya$Pb5{j`A1E@SkaxG|+Kq2@R6ObBM?gK4=0$s)n+Es_7 z80lu=xu83QK?|5b#)8rxXf6RdEXsrwP@wezj>W~PMWEd!kVc^Q5m30mtiqzeL6QT$ zekiyEbTA)mVSRFbUUE@tNh(wny1XY5Y<_AAR1~^x1+*+GGcO&wKnS*o7LTTTO_Vvy|bk6p-YI2XPn}+Kz#i-hmcu6fkh0odyn40rnKg zPl(I_(K-7Va(aS@X-INF7Lh^Eeg`cK0%d9rNbQ#hy6lMu!j5Nv&Q2C27Z<=zCM!q= ztsP~MfG7bSQO_U)VdoVjgWL$KRP#Vi0}DVZRz#>l90GEjuvWC8fr*8wIbxGnW*#W) zQ=AiXau}kIgW5NEm2@8moxcZfEH*eGk|DB50+OJ$@Tqwv43H?~0DFQ3;&70Ku>G7M zN5?Zj0s!G+WTQYf!p`c0WpC)H5`m(-081@XTmUP75k)o1PA$mxQ$)#!NZrK+u=+f` zfI$L$;w4h?k^!33opS;?0f2=JK;5WPP(VPcB4}FyvH;bIffK^W1KnB*zTKP)wAO-w z1JuYgV1Q0wL(UQ?hPA2kb5dX;(3|%1Qp*yPOA|{{q4fg?_&P%d4f~VeIc8W<19lL| zjfjMsn^*u*8-5bm>2P5QN%%$U3=GRa#&LkQ1HR_#0_7+%(Lz1H;zW@}# z3=GYlD6R*~gR~$_$xSQ(*P+uvhwLF$ba0P?!Wg;60-FJHEmC!r0qRRK>_Tx1L@Ys) z1GJqCe2g&zbh9>ejb;ghKmypK84MB~CqP9eEY_jdr6qx~g9gYd21FzoKq3izev4CS za&~G718gZEbOH7W=z5OwqQruN)D-wKdMAccP?=1I(@++~M);i;$)LsVP*ZO}3N%Ef zg?I?$Nu*!`CpnPok%I^prXcTu#L?3LD2af?VMzeo>;hl3ixj4%dCB>?x%qkE*bzO0 z9L*?FprR-{9el3@^rU|1o$ipiWR7?SHb|Ds1sBVp{vrcMJT&Vee1~Et$T~z4$;^c; z{S~tYH^1O*A^7>#$bLaO+a6T4AbALK-~?!8FOpym=*TCAhfbjIA+iMsIWHbjJ{A`w!}pRF7bNC6=Oh*vqc_o$88{#ph82UZ zCw}e<%2#+hG{p*tRwMXudn5}pt5UIcY*JIIQj78xP#|1ARGqnD#CL=xX?n6Ly&E-Xat$fAOMNdJlOCz zs28a4_%tZ`;9Gn_r{Fn(mg7oDa)3?`EMNei8Ui{`t~i?kwwEO@CA9+DKtYsRaIH@+ zAhqQ|MFQAB0ZGtlPH^)eM{dE^w!lgixN6gj1R7jOy+}wIf~6Y?E+mlJO}WXS=5b;U zL#`*dEQ5z1>~veuVYv9yYAT}h3chh25hH0hWkAR8V&=fKOymQ*z%ht0EFbACFR0_t z2fV6IG04uM{LAtA|; zotc-yz_9-^$j^EC<*);=^Dqt|Lg*^G%#3_)AJi~!kU=O1WnmjPDoHE?AFHhZIl;BgD4;vv4CL-DDaUKgZ9f8fG31@fMoF2062m#JsD|;6LPyCdR2f3 z!}R2G27x@#U6S}~0vvXM8W$i>gUWhvlEV>IFm=#7YVq3zo(x1v0m)^FIi;!KBis;) zga}`P&0*kBxDLvINFGJRSOJpJ3^vzMQU$V90~2JRA~Us^fuSB`9#VQhRtPc!e8n}a zKtQ&^HLrwW)pceD*fl9gmtLbQ6OiO6Ni0fFEh$Kb4W)w{;E*wbvcw#WQ2}%lKo%i9 zT3nJ19)Ds`yn*aVxNrpIAoc?ASQMy@3T_;5fY$JW@9l$*vgQ=Q`q0G%u+!?&V0YGY zlqD7wFhCBS;Ych>FM#*05{uG7Go-Mq027PSL4Dl|3`cK($|1y{GqNKQZb#gl1-h9| z41S1UdNTM7aL{Q4#i)myVksTLGX&7KCVG_s9?J(0;3F4c#RaL!nTa_Ja-e*Oa7}tL z_#kJ{u&cNSC@k?+Mi|X_bgN-)aQqpfpePlzxH>Z_Cl%I`M=9EoHdWni#9u+{>|EU@Ve3gF%p2iPPA$c0w;0~5DTkj@zehZw@0iOI>(NkQ~Z zR0abF#CgRG0-(+i0|!VgbVL$4If2IVK=~GQ*8y@hkeVBmnw(#h!m#@`D0*Oll?xYd zV3gzlO}>?-GBB{-0fj_bX-R2ODuY4|h=(YM5L!S+AsWaqlbkD)b5cQjF~E(TVpzEX zI;^S~Hh~0|iU+l$i=oYB4v;)l1X2oMu@Pc4$aSE>NDMzfq!aF-9C`y&1-`8U8V39C zAcq06i~xM35VQ${fdhQVtF7LZ|h>(2t5^Q1|L)D9WsL9ajyV3Vau3tMI<`GSr$hp2&Fz6TZpse#?S=L@dB zA&OuJyF@7nV#&4t{O;O@)-yKB$g z**PH84gID)*Sy4}oK$yb_)U8*pquvGof%*^?KxF~H{IS)+AT9^Eh(Q!8a2=u#3H0$n%P1gYbD-FQm2jZ82Y7J;dMN@@&cFeh>IIz} zQ39Ref~-}9EcF2mVuPAuu$40n;8m?gko}o(N$BGF2GGf=FiVRw(?L7kMWYa%JLs}5 z5yEXge??rJS)~9D7KG_3NW-3x zZWFpK#hF#G*|8J`ffjJb1+=~b-qwL=V>ptGI$#oC0G{DJ6AVgw_?m1uIy(5L%g|c| zi2fC#EnQpyZM=Zu7ZSUWIcq*heDE>wg4U7cq*fRjSuijQ2!K|aLAFXm)TKbwr9fA8 z!F`;rgI14ef?HG!!knOKI8M;Xt(?)IQyC!3y9nxg@R&d<#}P!}yU0LO=b%_ck2ge! zz?DH4xS}>yp^G6>m>I+%TNx3~1#Qg)`G^7CADRrupMaL8A(S$J)Zrg{$j?bBOUwb6 zO2~ONFSQ&YjNV#@=z(peg(!v1g}}Qd8L1VZyC9JI^tlY6L0&O9N18BSgVHxDCXxF^b zTu_0R2`gG5XGTN!?G@w~!#tIlmkjd}ykCZ71j{p!mGFQDm5fCUphGF~2X=fq(uhtv zda%Z)$3sulBv4=!KyIf&>t{eNr$G}m2FEOlAciAQI~)auutsokff20nTU=la&9xjL zS1N$g6$2qx5@9vUFiCL%%w~`s0z}x6pRJ&UI?t1zlY+g##_%=D3`Bl50|&Tl-~br_ z9Zds!6*`BHXhdMCBl1$qk!}!dI)G*2~-q-mqVg>7^Dvx;~a3Mu-Xr=jcIvE zH3X=UQI?p4s6If04rpZ|LK0NnXra|Nh*BMWE+Q?Dfurj-sJ8_&6q*w`K(&tqWYu3m zGIS^esTq`>4?2hLNF+&h40>*Wmz2;g7MXb^@QNO~RROfM!q5omR)}wh8!f%+XJpKA&Z2KjTk`3$BTg$DS-5X27qmmmL|YU zJLnQL(5arF%f&$BFrc%SL3$vy7SzcsNWp}3QYz?lOvFw1N3s#?lT=@W0v|MN1U=3p zIk5n##sF>GDNamF)eFc6H!~R)LY;3I3p0=BHMr@65C9nu9jXS05NN>L*oXlnjMO8C zow$Fvn@}_sA&s*_b)iRQQ8@#L3CJgiQGL*vg8@bPpfx}6p({j;fMh{ur!%ErLL8pJi)+!Ze#;1ah`Gc-kD$a}t?{I)F*(%PA2e)dWw^qaJkYXfz;Lgtk z*B_u!5d}$(%#wI;OoF%!AHe>|EQtpX{W1tBzD4OTAv7*{gEVyqG7h92G`J zIrazQQ4Yv3yF@BzSe&CcJtLE01{0{y!hi?@B$Gf^z=JwHA2GPAAjy#j8!o z!P*r0jFSLJ3!D|yWHmN|79Yi68>8WTQ0i!aZp}~tsf4xlL8%1ME`wMHIadtSGAk}A z!d#n;2tgF(bKWES9K5=-nBh0b9q^Ea3W5d?lM_Lg^cFKPfYzQfKq_4L5?Bd8&=OdL zJy3lh!;lIIP_lt*0qH-yKCxKFR6%!QdmWGpkaI9E;K!EF?J)(;1-hkAVYp zW(#D2YhFGqt%Is{@Y%Z(5LwU^cqKHIbL8e1rNU+&z$wH4EvaGHTK54XuoyrKVZ~6o zjYunxTs}fhZHBjUk>n)ALF4cdZE=;Q$PIv@w7ae(fPlDPK}t0hq5K+fTdHZw7?fDC>>S{E;BT%QcOZyT~271n^yOo2}B zbHEp^fc&Pg@iV61Aclc#0qkmVjc8XR#0V}fMpBxcS%6_;QfV4=2U|f2=vD>~5 zIMNFkARRZz!hQ{yN>F3n09+_CfY(BR7yKh76^x?f%Ln8Xk({0%Qk0mSnv|HF4JzIg zKvNXpqmW?LSaD{$Gvsh2So#2230-NIn^*y@$`Sb&-N?AFNXtP$hb%!)$P~}ZPs~Zz z%S|lMgUnAvgBsk%MzKhXMZpVn7(Ot97xaQpD1Q3BZ$gfZ1Q(n{TnYlZ5=0Dqd=sv;b~}uPK@_w^7!-A2m9Q!h93=sX znMI)16nI{vmcc!gg+X-l4`%TFGVn?St`gKHDludLFKlMuC^2GyZ2v;!6@*HVA&8Q) zETuR<9^9Jc{RxUQm>Uq{8Iqv2Mv@EqKB{hxV z0fXjma2~^SAjsjuTG1v(mL`^F=0=u?4JoNPX=WzDmAMQrL4M=It3>t}csEKz12d%A z+R)I@fVAWUZWO4KR}v4}dIK9AECzMO(()NtKn-V5i!nYQH0{Q~3g;JRav7@sKuOAiVc#!M;~m*k5OI*TVAmsi1k(V}S#7_u znE*YL5@ZClI07*RkcK3{P78xXj0?yNc!ETh5s~C5ONocx4g=d@UzP&x7eWpI0I2|l z4Ris0SxS6zUI{Fu%2FT~&Ola?f|MqfRzSyFK|Ijz5oiMfkk!`ho7M0Yy4W&Vr}_Wn$1q1mv^_ z%a`C#2IV1&IbDCGO)QWm3a(X|AG@OPWeZF!5JAk zy4Qfbtqg94fFwssd`V(DY%VheG;#u+wM7ddkd+`K!Ta6Jjm=FAEugD8jg1%_|3Te? zE&+;BaIQh*LF6$#XsQ8UnPdUFk_eGXkuGNf-FqY^tOcKc1I;vpN6SG|Fwm)HFdxU{ zHYga$og4>Exg$01;8X4^@1t}8iYtpj`(`qevl%)ebBM4wg)bMEzlfp(d{!rPQ|r|U zC{idli>iYL6cNFKSoFK%GKwbnlJaDTJ<&$+>20LNXA?oIxsZYq?n>yAarmYb*cx&~ z^BQ~`BczcAx{PrxXc-$QF&KkyxdKR2NcW?wey`@jbZ}ED>#J0*^xI;CCh@k6?rn=o(9SSi=T`(ZU*Z=3i!B z2`KJB7ioerg^?-Jk`b79NHi;^58_xOP$La=ppX%0L`hgH+8A*{wN*Mq4c1%Dx*>jw zhMx<}y%M4toUTA720~T9N7cNbR+yQ>0|*wVxsX7OHiJ2b6Kc05Oh6GLfDwk^wP6aN zk{LOvL9d4f&y6e8GHd|dfQ=>pq=MJ*pkF}<&N9Z3BV`e>k(Zj90=M!@0%2iAC9|DPTF| zoDM2gK?xPKjteY_9A_{|ul%H949UELqI}3|6l5(W;7N7Ryd$zL;EP=`O#s~ngCUxj zlLHoqc^=+q%>_a;MbKE@^kng=byem^tlMr3SSKrISLN=1$)@HNTcWUo-mPzssp zg_q7)7FvL&RPnDXjD3jee=LSzY(PW=1+GoZre_J7O7U`fM$o!31e%R%c!5G%6r zt~2p@LD0oWyCq;zu;nH}T^L(A5TS=V2*7(5z$qQ2K!NXGfTv852)?}$GPfvkAh?N) zc{CcR`BFt_%lIR>COI1%co+1->FBB{ew{biJq?FUT6$l`k;S9c+>uDGUsa zyr3f&^HLZVuz~h`GH|36Fsy(wL08FaU<2=g=O`&E%}Zw32;m`amVucDvV$+$!T@>Y z<^t%Es0-K_5RL+00R-BS$k4eI94;_-`IY8EdK+g^oC_B=kmLa0js~8pX5jDxt?UC| zxx?XFRK%bFzA+KuF1R+3X$ad$&rI9I0tmj!1iTHfHlHZ7V(1yQ9z^b;I%K?=4Knc5qK>#wHp1~mT5-b84r7mVrcr6H0068!P!iLQy z7%&)sCllZ&s2DO>Km@?eNzir;q$5;{OG?wy7+|~nAjacA9R)F;g5Ot{!NCN%0Sq!6 z3A&e1OjrvxyMZ%21O-7!7-0`+-Ug>)s!rTMLlWsYB8Uj76E`?r3-THy1Rz0;J5h)U zp#}mW^%rnW8m<=tr4;C-VF%-TFc+3s7)~&PeTY2sM93zP%Mf#b$X*3sb_rWYgFJhP zq6p+5gnsk{f;eszk^rJDVv&`AoDVr_R1b1J5$Fa_P;mpg+!A~(s0QfJQP4UO6iZWu zSr|YI7f}Qy#6j1|!R8ww*$>ys5O5h#ke{Cey3sa=VJpZyND+b%1g+eG^I*p_GcYiU zurM%k6eOlF7$kwNi-KOw1Xl?*49zUKZUaeWy7;Xs21)vHJG8h6r3JJO{DgdHOkAnFjeku6#Q9{x5$uDzlAWk3hcLr&R+)K;93+KQ7w9Mo3@-qW6+F1%1w9c6>U_8!q>Fzcw*e>2g9IVuqBw{n#2{fM#sF0f_ugJ4 zXF!5r9g+yDpU*>Nq7C5#lpjH{h1C25Z6yOo1pERkU(h8|=ql1uAPHS~IyjYpvoZXF zD>oO0J=3s=gUohGEly^LhUm&K)(c21$$&&hxi~2BP=pL5Is6NtO;-+(N(SgLn8=MZ z6dfQ#c=L<(+%j`gK|>`B>?~ZuTF3&sLDmRs!S1_+oU8>o9{DFo3V!J)vWx*_Yd?6I z9Axny0|(?O1s`F;&cO~BKw8a$@Dc1BG0|&_Hzxz%C?*IuLYt5exVlUXD!A?t(cI zAhSx+@)&r)Oho8G4FFk;2pXv1c1du)g{J|?MZTarT|skOP`87F4|Mmf7(BS0GZOP$ zGK)YZ3}opTWc>nss~D&QfxJr$MOt18RKmhy0-Rq!Emg2JMN-JIgen&x$pLX6gB0j8 zWsU;qea{A!V827WRLo#;Ns5I5w8$6gd{jd~79hn7>^wOMaeiq;#P~~t0+T?*z_fCp z#tb525K#bA3bF$c2QX19X>cUK0t7O00}hP_kPJK}AW0Ai3h)ud#S9iVLHZqnn0U#p;3>JSAgEmodyaK4(QGF;Cq@8 zjzFjenTBuzLi_>90pO)b@EikiA1Jm!3%D7U1+y@Sf-C`b`h~T?n@1Qx_CVG;Vbca0 z@n;ARg6ac}3V;@HVtNr|IeaN6_H9j2Z-dH9(2#Xz9%yqM>RzeD+*Ae*Q1%3$as<@? zy4kz3AeG^REOPFHiCUoLyVRW2Tm}PhoFW1brWj-dc=;UEXh@Eg5CY<|TuL(L*sa4|*#Jc-aX@ekt^p5+g7l5wIxc!pj24 zP1)Y5;L!p2HQeAz7n0i$1|XF7$b$-Ae7>$wfTvJ!#3|G=uqc4ML!u^>@Ty>dIti2? zK+_=>44{S}QVj!c5kT5L#bE1Tp@$?PA;|$f)f+le1#SZfbc4!%glCa7fJ{P46EGt) z!AA$ecwk>5?)b(h2U?_!xg8K1`$>u5i45?lJXEL@bj$^YXj*BWLbRa)2*je^BcV{s zP@sqs)-Xp7W+yLrWdPc2RapSL3LdGz2Zb1{&y|#z0zJlt0}?Q>qqWmY^B5Gelt5KB zc#FCLXsi?Epnvdzy$!FR_l_;-WdmKU1PdE*gfmEpgIb!fQsNxQG@Q$GQFVg!A*Dn} zL&YOC5p=x!eu^KLpUW#BXi^10|z>R@4&|p@8!%Ig2#s#U;g!90X48okCK;Za zS}hK%SRhj#*!zVNNV-7Ah=cfW=W$AMlxL;{6r~n}7f*v)`3xK&7s7-XAws#JxqJpD z2&W*Yw3vYz!Uhek7BH|tIR%NysSKi0u*3kkRU23U=YxP#Y8~?xGVz&DuX&GP(epDGDv_1tzk#& zYk+DI1`bdR9$>fxj;*59{Gyap&=BzksDDA%6gn2AgJvB!LWRIb>tusc+$N|9c)$=O zuo)u201j)Ydmz;t_!fF_PYQZNJ@^<3NX3Pao3F*fAXuDVRH6qSe+DH{2GAk!A`B8} zqUW_(7(~HhkU3?@ETe=tsOJPr4Z=2{74SGx1BTw8TA*?VL)cUs-1!GxRiT%eR|2kF z87e@6yr^QV98AJmFd;J&h{A;^3SpwG9Bfdfpw>1-7BF}}s z1zQ1`rz&PpxTOcO5i%DFVZ)}k=sXvS>78dfp!A63KTt>^&4FU-;L`);e#qPxY^D@b z6;)?Fp<#wJ>j@Ddb=DKpnIO-gOm|```G@9TNUTOO#xv@aB2zqp(bez9Fa3XTh~A%d+@oP#~%T>r7 zAJ|$dK^UHpH3Ve`;?xRAa=>qI41)O=)Vf0TQo8}TGKfZV?jeY9YF=`FN@iZVeo|&$ zVo{}DQf9hqUP@+S9>WT-Q*g^ONHR#^mIdh+)H@EC)F0Jr>) zP7TnGZODbs@T*%HKzFw?a+EU|Ts8r_x-=&nbR=nN5raj98Av28Gbe}P0K+UWr?@1w zfZ+rKuQ^BtGzZOafdSH(OG+&+2`)%YO<}mf5CfJ5?-2!!R4_pAmIGg81r~V0P+$Qv z0W?w>P?TE6@S;IsB3#5jEe&**Bm;o27EJ<}NOU%px9a_q;pb@fMi=!kzJ2kJEVMU|HMz8~NQuESFG8hiP zv_U2X7*4?WASW|iXw(305Ch%1QQ?^fxeBxf*u zXw={VUA~NQZ89v{pz(<7;%TSMlJFwX+98HtCRkz{dLuMK)dOZpj&g_whHEoHtwHe4 zc*to*;4?Og86+&@!4j1vsl^Nms^Dk_9dVSNng_m9cm|ULSS$~mSQ%b0fo2XshnSRr zE^`Je`M?A^R0^CMic?F#LLJNyA*e|V3z#911-*kAe1kTqMBBj}wF_iDB$(mC2cW`G z?QroEP;pTBUSI|XFGg5mgaRn6Kvy^*cP4&7$0UA$3T{L2eZ|o8LeXv$h8z%P0lQAv z*a%e3fc(M<-uw({!DCSb$~@2-3KqF&SEJ__!3?#~1a(OnggIXuu`oa`C z5^|Vv82Uk3l#rDm*Mn?!iLC>4Pa0!w&kQIE;_-6~m#AYO@pujOm3_dy)sTu$mVxR>SpsT#i z!Aq5(7Pmm{Z3HzzqK!=9lAv-3w4@XxJi$%@m4#v$kq@y3B!#um&4m^T;9>++x9$SF5@s7T z?L$k}5GyRH8Y(xTO9Q+Rcni3$Ovy|xVffJrsfI984O9!rIE;V<>4eH3#%3LoynrM} zIRm8d#;^iO8ORvEXd??VP=gIxlKp_j{XEdgUdD!ysE4dj+6x`~+zXa6K+;qJ8D)_J z9ouUb8*K85hVl#WNk9x7 z$<{ zGjRCkr+`=aX@HjbF>ruSQ-j?m>>tc<0X%%jfRq4`%?5=DXgfG;4J635ptB8NK1VGb zKtTYS4=T+AtsT@a038Ub2O>a=jpBhbHGC32p~6FfiGJ0ui)qlEVVb1f^~U z0SFtk4V6LSHdq|Q4lc=NfS%a|J68nFT#%jM6(68cvx1VMSlBsksOlg!isG=tREgT^N47BsQBsI>A*T)|i9X1&R`^ z@t&EJ>QtJU1DcNQbHE;ENJ?ffNrDz77L_nCK++o71q>396It>=g$JachQ)k{Zjd)n5;f?4Iz@kI z;std;Fj7WtYA(ow65{4gh%|A@6%-uU(*&B!q545Pus}Dx9k{qBzpCCuofF`h@>#894Z%cs7QFKosX$M(@eH9l`lam<8$IfdbIXL!c8I#6E^6#JYA0uYc^%0aiFx3a4GOgkt)NXP=re?wc_pBJ9Xy$Xhm;_DBq2=XWd70?VzL$lcQ>)hK2!BqK1f&ny6up134TeIm09_ zq4@}!kYUmjaBWre^ae#3Gzp(zNC9(UamLWW2x|1B9FmDpb(zQj-}@P6rD@D=@u+lEfrPFQG68MWQ6NqNF%Axr8Av z8$}${;07J9xjl=Sfq^eNHaoS_CNrtFUUwN&R{?}^>)7xN~*X4<|3sEM_))~jBemZkV0{gc?e4k7@&POuqzojKvSp1 zup7sn7&t-ekQg}f;HGnd*NKBWy#}x|A0hS>GYEh!MmgpcB7%{hQo;Rv4f~Uz88l%n zR3}A%oDU5@P)nwuq{xl|6nOA3gas8;mOya*2bl*dAwkpOCm1k-tH2K>xKIq00m(sv z3`Lx(!3K5!O0Yphhzd3oXLW;|%NGq!VR%Li?7&@noWY4#C(cxf7R*-uphOB!Hyw=E zK>`fIT9DLY19LZC%d$awP=g<@da6bX*uf~#0udo8TJSoTD}V)FQot9ELfR3a71DML zpe;S{XoAKosOew_9>?Q=l_{|NfW-_Qi1G*=MafH$3lMojC=eymE->_f1Q3yi+X5Ys zLP$*ERz%h40Xq#PdLSZ1MGtN_ZUK7)nn;gb2kX3u)%3TEl3^i@B}-8 zs=*0%7)o$LM929S* z&Rhuc4pN0{Y-Gm(ngvjRg*-H3&=0M*V*s6zegGbSum}Pb?Z!qrn94ukYS9#gg329e zJ6EFz%!9|x3r3+Zl(@lZ{$`LyNW9=wL)AC|I}9aGARkL?wK#bABs^J2zSYZf9ij@vVSuhtKEhiXPf&>ti13o+4 zKuRGogHIV%BM0m}l*oaI5EVK2TzMJf8EE`~4|%e%V*vGi;GquBFQ6#4umg{lV`dYG zRvqZLnjOOgCLERYf(WE|IKi+7%!S882a{nWO7=iE_ZCP!B<#_ps2bj2XP|^PM1-jD zMt7M%$WLgg7hIzdn_AIo-V==BQ7EAVjbN~uEFdXJ2q6noHFUt%ql6Abgs9L#c2yzB zvCtHjnO9MvAvW0LqCsg5p14jh_JIU2GC9;@OOPabz=5ozYS4k5 zfD&{N5fXzAdS28^Z%(m_jh44~7xFhUvG5FHfdI72)-1{B25 z%C3X44$MUgafVowgo@jS`5>K;(8sNasxbj}8cIw+M2LzB+-}qW`52m{5sS9%7(na3 zF+v=g7m(HA3~IC*>?6n?_%Uz{Cm6HiP=XqZ(SjfqkTAv~OVz*yI|e0iAtFQtE*8i2 zfSe9Z>!^Fa?ZA7R;UNnRdGNv?JMhXMc*_q~n4szh4Y+_Bi3K<+EcbY%6n=ss8_b2L z@D~h^Kmv#|1-s#GAVrXn$F6{?fe&^PO5j68hzfk{?qf?p^nI{}Ei~9sHKRohEd0Ux zbJHBc2nY+>S-1WM%aU_HUO10;Y*)o8{hfn*`!i6%qUfCM`N zB_JUpL)py3@t!l9mtZ(f>i&sG&_b4GiC;OF#!!`*kG3)xQlNGzV-?uxY10~ zLDz&UQFkPR!W&v`YODqG;GzG5!7K$OQ4_M|B1k_ZItVGHYW#qmi4s2$5u)OUkV{iQ zVIW>ynv$Om8sWENNMPVdX8>QT&A?Hdnv6G#H!!w@e(1(F$VFrIko1A|-| zDC)s0>Nvn`&cvvG6$+@3FdZ5t>8F!~7CLyZ@2PP&Vu17@Tf=omt zg4ys$gs9w^fyjaokpYalaxDJJSZu|gOWl#C@nB> zGVeGA@lqMsvoLpoC+2;_6G7|hK(WZP2@+(W+7J7djG4X`d0Gjc(fpu~fu zts}sRO~e5?nLut5FNPd#!O46A>JCWI!rXzH(HQg~$sTlb8NwCd?Vyk)RjEawPZV-MLzKotueoF3WY&O27HX1)D041KEY3hOas|}L&~#)YOJLWV z$0sKyXMhqf#{`I9AZDth85`-D7^Hyx!obNag4GYXi50Fnskxw3&~O!^y$;11(0NE< ziJ)BeU@s(j&qR?&#G4_ggi$~#8DM!H)Dej<$&XLYNh~e~#ht=Fh+SJz%mPb;)PdB4 zB4 z9a!B3tm;60+agej3RZIftBcZ;oxpd$8OyOisz$p(-M9`vy zH3K=Vg8RFW3KG<11!eFLkQlQ?QJ0$vz2%dW`N2U*YI~Q9Y)~fXkSU-1MoW$hp)I8Tb(57%uYe@pDLf_O}XyZKy z(i%7b&F7$z41~uK2Yqoe+h8>)J-HyY2y_E211GZ#R0V2PlaiX2S_E361!~|yOC8Vv z0m2qgagdZ)4D!|mLSX|c>=RJ33b=eVF)&U97fMiqfs?rcrECJLN=i#LGfFivN=r>k zG`36ywHX$msDg)MPJU8ij$;n!5(iFZh4YYD7d~=22SQ%I2C|8kx)m@ z3qUvCxhNHqa|ECP^cCD)1*bFPwA5s1LIhKwOpi64fm;8$nR%JHrJ(lI1E^mhEpn(y zX{lf%paiJZg<=v|m5DKmB2YVd0*WeFx-QQz0)=bBbx2AC-Ju9;prk=6b*MccBMh(_ zk(iTH0P4?6LsB4nD=1(ft}rmQglPxSp!O1q5l~f-qm@A_Kp2!UFjX0&dK=^%3#_VA z&5!^CC$k5NDww~))gPz?zX0*L2H4dwS?HzR(7mRd%r{{1;0E#=OjUV)QBDfzf@TIz zW*(>tNSwn|q$fj5-+-e0+=7xEP(S$&*3<>n;hC3N0^YXG$y@*}_&~$Ph@=j#At5zW z1~i$W=0ngmK*>3&iFu`GR#1UZ@BpiVB!q$ttO`JVI%u&P0gZ3e=mb~Fpy4#AEa=W^L}~zE z*bFiwGY8g*H-IXH6dBNDr3bDipcb8gsz9{})ZWcci+7Iq1w|;x&kPeGfsYz$d8s9! zdvHJr6+A3t01aEzgr8cF25M@sK$8t>{SVR)>rG5J3yD0oPUL`vT7no!F~Mp}ab|jP zYDqlk+yGAIA5gnQQMyE+mZ@WD1*mUX08N{q^AQk12)@Oxv>+%kFC{-0d^|WOa{{z_ zM^#x`1XdHDk_s|y1Bz*|;Y(O}gHJz&oILGGYGBiSFjWp%Re?A8z?2AJRg#;Un_pB3 zQ)7Tt4N{i31T|jOA&u7!A;=ypg7i`X67w>XT|kXOP_lEu8r9%-XAY>UvcQ^rQ!-QX zOEOZ6KqlP4TArn(CZ<4hzyhch=s6%Ae5w(sHMI*851dqACxTHt}l0iiBhf#M=)wP<7lst#e8fs?raT5v*A5LA^R zx~dEmRj?G9n^;i{x-uM;&q3W9Xl_Bx+_|7?RpBPY^U;x@xB`#8lw^R;Mg- z7<~MTF9Rp@b*zB}8JvdPU&6`Efz=?e8c@S?2UHq0d88&5G|pT;IW4nP-#@p6;~FQfCmPWv%#tsKqCxQRW8Wy zV0j7b^01@?R-=Gb4LBQt#!W!o38)IxR$fv%q~US^I?kcigB*CUf;=P2i0*2P@@l`7+sQDToPYp1{$K;0dqad z6b4v91z5obtO`<+(#sOTMfHbLNJcx4Y6E=G5i%<519c>7d_vE%2c2vHDzc#^KtwNc zP!*@36{dWCvs<=B4Ch=A}c_EZ6~2vl~SXq^v3S_h#T^eu6b~Bb9WZ zv7!x7Z(Kz+2H{swD7Nvu_ z!u~fR$8WR{{?w zW6*%Y0_ecoCUl2EhkcDfbxQ(N5&tA)4<@JQ2Uq4M<%0(&KqFAl423$qfrva~P#RP) zgtV1VjY3icio66uia=x053o84$s|x(S%B3fQ1JxLp$DKbSBm1Xw8U)45++XO1JG2D zT7rSgIKRX^&;;xRXeeW-fCV6^Q^)~rAu>-v4#4#M)QZd!a9llr+JhRMS-Az^;Y6?! z4yZ+_NG`0Y>R{_Su(~LP!B!6EU_pjHBS#zseu}yppgquh(>5a zatfq93~O6J>jh9njiKX&1~wg-@r$8x2Ud**rAaxN$>3{xp$kATG=9L^8c!_Fg<6WC z!2+wNK)x|H!chDInrl!)0HoN=1VeEKRzH9g8yZ<)sP@2Vw2`S9hUy(SRht@OI@a3cc~Oqb8VsT_1MGKSM7a5~1q&=S+_GjJ*gpT&z|d<9O|fKSB5Q2zs` zdNWf~W6Y4R!0jIJk-QidMBuc*$jr#l1T*+g;M8DhWMX82837)+on&BQVQP-)2@RZ9 z7#Uca8=7K9!wQ@_Objhej14fop@Gv?7RDA9W(Ju4Sb=pi%h=e| z)Wif!9_GMliqTLc=Ub`18#NWvai%SgTSeDHbfdY}eU!xU_zZEz)^ zmQMkGC7}9`VF|J+;E@hc<;TFuoPjc`0hR%kq>vG)1WZZTgzyX$DOjBaX_J9n4;m@F z2(cA)>JXv^w0zP8)Z%nl2Wck+qEyXDia=gm03Dpe)e$fOd2$0GMWD810U<@8rfUNs zMWC3OKu8g&(Vc)*Q98)u3RfT=ZwW?jlOTB<)SP741W}ZU5;{3)sd>q%PN`}6MX5n4 zCB>k|$zy2y1$8!#@W9z? zyy^<_3zG9n7&w{V;8j*!oCvdE9Jem;W;3utR6P!O^gy;=VbOE| zk0#j7ZK&2X;L(9{aT%(%1Iuvx2(mX0i|ZIx;Masjivx-laG<&t6?vqBr{ERNKngub zTFEcgb1X^+B|Zm~5kRn}(Bee!sLKQB`XtB%F<1(bNkOHp0Lq$pumVsG2=D$KgBA#o z?jJmT<`?S)B$i~Lrp*SFvxa!yN#gbt~2bQ;^OzJc~3e#2)Nm`*c9g0`hA`c%Rz}NkZ@5^XkKbXL27bIY6?Wn0TeYLhk^E7fWwr5 zli2`67If-g4q`UZ0Yd>w%pFIGxt#oTz2Xwkq%8;3Z;NMvf*K@_qU}72w%o*$3_TS2 zizxEo_4Rp)Ir_;3rFsz-pyq}GbQO}@Y>@e214@figM(ecyA>`$wL_}o{9;gH=$TiR zn3D-|n*i3*5OxxwYf({NJ|db?=35~qxmIKrgAxq`ia8KDzx)!Iv;r3CfYhSg%wo`b zaZuQ!D@ZLWa?8xiEQairaKMnRNKGyUk3>Ur1!$2Aenp_IBv2KQ(P(&3g67Xb!2(KZ z&N=zTkkRJ=l-P!N2_y@irT>5;2}y0i8Tmz!tCJWwnKz&)$S>AIrsWqYo{CE`p`Wxh`}`*Pr0j10Z1k`}jqymAc0B@NHAfyNsVF`p3f#PEVAw{6TUO-3@C?q!!QUr>U z1B4WT!utXtMW6tGKu8fN#6J*F1YSuZKp-g@fpUlfAw{4NKLFi=ba4@Kf-5K~0$tp} z$$S8su9x6Q*WgL(3(ztay2k(`(HemwgdeI1x`Go^5h$!32ss%PYX*cAfg&V;kRnio zBoI(!406*AsKX&W6wK@f9t;zNDnj)gXr|65KR>&)09H;oKxZ=#EJhA)M7}fzB>@4f zh9M~exqSg4w}V1q0wG19@NB@UC?~NpzqADIZUX7R43w4>pwqo9OR#&+43sJlV6_e5 zIWtfezd%S4C`COWqzDvy9|$P|1rq~-QqBTY^EwbvWDbft1ptnCMvqA+Rba9?I#8fejn!8C{!9$=@TsVT@W2e({4K$jOR04stl zXf-xSHcLt~H8L{>FKh+v5km>M#w6l$ikeMUr>^nn^^^Fw=+Tqt|7f8m;%?L zBJh0;pc5!ix_K}Kh-3jOC=;Mf3dqi9n3|l_w36hE)I{*G^9E=HiY)`B8<-MM320^l z^Jv2%NCeJBQB#m#o?2AwpB9n|+Oc&Y7?KdSqo^s)P0Yy&Kv9@*0%DlPa%2k;?gkZ0 z4$!U@q(=dB6haNClrSKm22|uG5KsduaRUgb0cEZN>}p^`_X@WmUh>A_B~ba;fYpf1 z;sDS}azl`c0%%MmqnMIe?3Z7HP-K8Z5m<#WDC{OcRe^biB9=gPhr>ol&`d}16haNC{q*1%M9mr;YCyGl19VXRI1V-7 zGDKl3Bn>{qr3jR67&IY@*j8Xqe}w?Ubf(F1=LEO3vp*OXt$R{;1B{MJG z6FkYNfa$K%yv!0vKZfBnB-Ac}^}{MEusxumLeM^Fum|9Sw+B!LZ@~(4^YcnFKpsih z05R+%*f6kM4rnmZCm%GQ%K+U}i{ursEOeB~0XoX00q#+OHG_PT4_UQJj5II<%2X5ZDFEe_4VVhRHA8+*F?b;F1s{SwejhZ@*OiaUVD5(lvA&R??Ld}GX zDY$&%DhWBj6|^)TRAxh!%tF!c zoS2uKngeb_FrYXWW&w&bkDxd+sWc5T(dCz#o>-DumI_)X0h)e>whtlk4^ib>R0NqT zb1TgOoebrGT@B16=loJ|J9GkeWzaPQp?RR4te{C&&|D3 zlvx7mz#qV(43yCG^L_I3K%2-GU{?S$$1$Z06uO`mId+9m1tIzQZi%2pT?W{dxq(hZ z3CYg}_tFEfs6mM%Sn`AhIz$oFYtS8B7f|h~EJ;P1 z%s+^d79fkZiZN|^0BsCFY=S96aq)K)lRzn7za%lK925&hs0#>wp{NAyCecqWN;Wpq z^K^A}g`LlK1Den`Llb�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 P|NkdsA67B*GcW)Ec0-S0 diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample/sample.go b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample/sample.go deleted file mode 100644 index 3c812dd5fd..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/sample/sample.go +++ /dev/null @@ -1,41 +0,0 @@ -// sample program that is used to produce some of the files in -// pprof/internal/report/testdata. -package main - -import ( - "flag" - "fmt" - "log" - "math" - "os" - "runtime/pprof" -) - -var cpuProfile = flag.String("cpuprofile", "", "where to write cpu profile") - -func main() { - flag.Parse() - f, err := os.Create(*cpuProfile) - if err != nil { - log.Fatal("could not create CPU profile: ", err) - } - if err := pprof.StartCPUProfile(f); err != nil { - log.Fatal("could not start CPU profile: ", err) - } - defer pprof.StopCPUProfile() - busyLoop() -} - -func busyLoop() { - m := make(map[int]int) - for i := 0; i < 1000000; i++ { - m[i] = i + 10 - } - var sum float64 - for i := 0; i < 100; i++ { - for _, v := range m { - sum += math.Abs(float64(v)) - } - } - fmt.Println("Sum", sum) -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.dot b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.dot deleted file mode 100644 index b67ca168c5..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.dot +++ /dev/null @@ -1,17 +0,0 @@ -digraph "unnamed" { -node [style=filled fillcolor="#f8f8f8"] -subgraph cluster_L { "Duration: 10s, Total samples = 11111 " [shape=box fontsize=16 label="Duration: 10s, Total samples = 11111 \lShowing nodes accounting for 11111, 100% of 11111 total\l"] } -N1 [label="tee\nsource2:8\n10000 (90.00%)" id="node1" fontsize=24 shape=box tooltip="tee testdata/source2:8 (10000)" color="#b20500" fillcolor="#edd6d5"] -N2 [label="main\nsource1:2\n1 (0.009%)\nof 11111 (100%)" id="node2" fontsize=9 shape=box tooltip="main testdata/source1:2 (11111)" color="#b20000" fillcolor="#edd5d5"] -N3 [label="tee\nsource2:2\n1000 (9.00%)\nof 11000 (99.00%)" id="node3" fontsize=14 shape=box tooltip="tee testdata/source2:2 (11000)" color="#b20000" fillcolor="#edd5d5"] -N4 [label="tee\nsource2:8\n100 (0.9%)" id="node4" fontsize=10 shape=box tooltip="tee testdata/source2:8 (100)" color="#b2b0aa" fillcolor="#edecec"] -N5 [label="bar\nsource1:10\n10 (0.09%)" id="node5" fontsize=9 shape=box tooltip="bar testdata/source1:10 (10)" color="#b2b2b1" fillcolor="#ededed"] -N6 [label="bar\nsource1:10\n0 of 100 (0.9%)" id="node6" fontsize=8 shape=box tooltip="bar testdata/source1:10 (100)" color="#b2b0aa" fillcolor="#edecec"] -N7 [label="foo\nsource1:4\n0 of 10 (0.09%)" id="node7" fontsize=8 shape=box tooltip="foo testdata/source1:4 (10)" color="#b2b2b1" fillcolor="#ededed"] -N2 -> N3 [label=" 11000" weight=100 penwidth=5 color="#b20000" tooltip="main testdata/source1:2 -> tee testdata/source2:2 (11000)" labeltooltip="main testdata/source1:2 -> tee testdata/source2:2 (11000)"] -N3 -> N1 [label=" 10000" weight=91 penwidth=5 color="#b20500" tooltip="tee testdata/source2:2 -> tee testdata/source2:8 (10000)" labeltooltip="tee testdata/source2:2 -> tee testdata/source2:8 (10000)"] -N6 -> N4 [label=" 100" color="#b2b0aa" tooltip="bar testdata/source1:10 -> tee testdata/source2:8 (100)" labeltooltip="bar testdata/source1:10 -> tee testdata/source2:8 (100)"] -N2 -> N6 [label=" 100" color="#b2b0aa" tooltip="main testdata/source1:2 -> bar testdata/source1:10 (100)" labeltooltip="main testdata/source1:2 -> bar testdata/source1:10 (100)"] -N7 -> N5 [label=" 10" color="#b2b2b1" tooltip="foo testdata/source1:4 -> bar testdata/source1:10 (10)" labeltooltip="foo testdata/source1:4 -> bar testdata/source1:10 (10)"] -N2 -> N7 [label=" 10" color="#b2b2b1" tooltip="main testdata/source1:2 -> foo testdata/source1:4 (10)" labeltooltip="main testdata/source1:2 -> foo testdata/source1:4 (10)"] -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.rpt b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.rpt deleted file mode 100644 index 9ec7b3b086..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source.rpt +++ /dev/null @@ -1,49 +0,0 @@ -Total: 11111 -ROUTINE ======================== bar in testdata/source1 - 10 110 (flat, cum) 0.99% of Total - . . 5:source1 line 5; - . . 6:source1 line 6; - . . 7:source1 line 7; - . . 8:source1 line 8; - . . 9:source1 line 9; - 10 110 10:source1 line 10; - . . 11:source1 line 11; - . . 12:source1 line 12; - . . 13:source1 line 13; - . . 14:source1 line 14; - . . 15:source1 line 15; -ROUTINE ======================== foo in testdata/source1 - 0 10 (flat, cum) 0.09% of Total - . . 1:source1 line 1; - . . 2:source1 line 2; - . . 3:source1 line 3; - . 10 4:source1 line 4; - . . 5:source1 line 5; - . . 6:source1 line 6; - . . 7:source1 line 7; - . . 8:source1 line 8; - . . 9:source1 line 9; -ROUTINE ======================== main in testdata/source1 - 1 11111 (flat, cum) 100% of Total - . . 1:source1 line 1; - 1 11111 2:source1 line 2; - . . 3:source1 line 3; - . . 4:source1 line 4; - . . 5:source1 line 5; - . . 6:source1 line 6; - . . 7:source1 line 7; -ROUTINE ======================== tee in testdata/source2 - 11100 21100 (flat, cum) 189.90% of Total - . . 1:source2 line 1; - 1000 11000 2:source2 line 2; - . . 3:source2 line 3; - . . 4:source2 line 4; - . . 5:source2 line 5; - . . 6:source2 line 6; - . . 7:source2 line 7; - 10100 10100 8:source2 line 8; - . . 9:source2 line 9; - . . 10:source2 line 10; - . . 11:source2 line 11; - . . 12:source2 line 12; - . . 13:source2 line 13; diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source1 b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source1 deleted file mode 100644 index 70e3fc3397..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source1 +++ /dev/null @@ -1,19 +0,0 @@ -source1 line 1; -source1 line 2; -source1 line 3; -source1 line 4; -source1 line 5; -source1 line 6; -source1 line 7; -source1 line 8; -source1 line 9; -source1 line 10; -source1 line 11; -source1 line 12; -source1 line 13; -source1 line 14; -source1 line 15; -source1 line 16; -source1 line 17; -source1 line 18; - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source2 b/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source2 deleted file mode 100644 index 54f99ccac6..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/report/testdata/source2 +++ /dev/null @@ -1,19 +0,0 @@ -source2 line 1; -source2 line 2; -source2 line 3; -source2 line 4; -source2 line 5; -source2 line 6; -source2 line 7; -source2 line 8; -source2 line 9; -source2 line 10; -source2 line 11; -source2 line 12; -source2 line 13; -source2 line 14; -source2 line 15; -source2 line 16; -source2 line 17; -source2 line 18; - diff --git a/src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go b/src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go deleted file mode 100644 index 2d26b51e87..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package symbolizer - -import ( - "fmt" - "regexp" - "sort" - "strings" - "testing" - - "github.com/google/pprof/internal/plugin" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/profile" -) - -var testM = []*profile.Mapping{ - { - ID: 1, - Start: 0x1000, - Limit: 0x5000, - File: "mapping", - }, -} - -var testL = []*profile.Location{ - { - ID: 1, - Mapping: testM[0], - Address: 1000, - }, - { - ID: 2, - Mapping: testM[0], - Address: 2000, - }, - { - ID: 3, - Mapping: testM[0], - Address: 3000, - }, - { - ID: 4, - Mapping: testM[0], - Address: 4000, - }, - { - ID: 5, - Mapping: testM[0], - Address: 5000, - }, -} - -var testProfile = profile.Profile{ - DurationNanos: 10e9, - SampleType: []*profile.ValueType{ - {Type: "cpu", Unit: "cycles"}, - }, - Sample: []*profile.Sample{ - { - Location: []*profile.Location{testL[0]}, - Value: []int64{1}, - }, - { - Location: []*profile.Location{testL[1], testL[0]}, - Value: []int64{10}, - }, - { - Location: []*profile.Location{testL[2], testL[0]}, - Value: []int64{100}, - }, - { - Location: []*profile.Location{testL[3], testL[0]}, - Value: []int64{1}, - }, - { - Location: []*profile.Location{testL[4], testL[3], testL[0]}, - Value: []int64{10000}, - }, - }, - Location: testL, - Mapping: testM, - PeriodType: &profile.ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 10, -} - -func TestSymbolization(t *testing.T) { - sSym := symbolzSymbolize - lSym := localSymbolize - defer func() { - symbolzSymbolize = sSym - localSymbolize = lSym - demangleFunction = Demangle - }() - symbolzSymbolize = symbolzMock - localSymbolize = localMock - demangleFunction = demangleMock - - type testcase struct { - mode string - wantComment string - } - - s := Symbolizer{ - Obj: mockObjTool{}, - UI: &proftest.TestUI{T: t}, - } - for i, tc := range []testcase{ - { - "local", - "local=[]", - }, - { - "fastlocal", - "local=[fast]", - }, - { - "remote", - "symbolz=[]", - }, - { - "", - "local=[]:symbolz=[]", - }, - { - "demangle=none", - "demangle=[none]:force:local=[force]:symbolz=[force]", - }, - { - "remote:demangle=full", - "demangle=[full]:force:symbolz=[force]", - }, - { - "local:demangle=templates", - "demangle=[templates]:force:local=[force]", - }, - { - "force:remote", - "force:symbolz=[force]", - }, - } { - prof := testProfile.Copy() - if err := s.Symbolize(tc.mode, nil, prof); err != nil { - t.Errorf("symbolize #%d: %v", i, err) - continue - } - sort.Strings(prof.Comments) - if got, want := strings.Join(prof.Comments, ":"), tc.wantComment; got != want { - t.Errorf("%q: got %s, want %s", tc.mode, got, want) - continue - } - } -} - -func symbolzMock(p *profile.Profile, force bool, sources plugin.MappingSources, syms func(string, string) ([]byte, error), ui plugin.UI) error { - var args []string - if force { - args = append(args, "force") - } - p.Comments = append(p.Comments, "symbolz=["+strings.Join(args, ",")+"]") - return nil -} - -func localMock(p *profile.Profile, fast, force bool, obj plugin.ObjTool, ui plugin.UI) error { - var args []string - if fast { - args = append(args, "fast") - } - if force { - args = append(args, "force") - } - p.Comments = append(p.Comments, "local=["+strings.Join(args, ",")+"]") - return nil -} - -func demangleMock(p *profile.Profile, force bool, mode string) { - if force { - p.Comments = append(p.Comments, "force") - } - if mode != "" { - p.Comments = append(p.Comments, "demangle=["+mode+"]") - } -} - -func TestLocalSymbolization(t *testing.T) { - prof := testProfile.Copy() - - if prof.HasFunctions() { - t.Error("unexpected function names") - } - if prof.HasFileLines() { - t.Error("unexpected filenames or line numbers") - } - - b := mockObjTool{} - if err := localSymbolize(prof, false, false, b, &proftest.TestUI{T: t}); err != nil { - t.Fatalf("localSymbolize(): %v", err) - } - - for _, loc := range prof.Location { - if err := checkSymbolizedLocation(loc.Address, loc.Line); err != nil { - t.Errorf("location %d: %v", loc.Address, err) - } - } - if !prof.HasFunctions() { - t.Error("missing function names") - } - if !prof.HasFileLines() { - t.Error("missing filenames or line numbers") - } -} - -func checkSymbolizedLocation(a uint64, got []profile.Line) error { - want, ok := mockAddresses[a] - if !ok { - return fmt.Errorf("unexpected address") - } - if len(want) != len(got) { - return fmt.Errorf("want len %d, got %d", len(want), len(got)) - } - - for i, w := range want { - g := got[i] - if g.Function.Name != w.Func { - return fmt.Errorf("want function: %q, got %q", w.Func, g.Function.Name) - } - if g.Function.Filename != w.File { - return fmt.Errorf("want filename: %q, got %q", w.File, g.Function.Filename) - } - if g.Line != int64(w.Line) { - return fmt.Errorf("want lineno: %d, got %d", w.Line, g.Line) - } - } - return nil -} - -var mockAddresses = map[uint64][]plugin.Frame{ - 1000: {frame("fun11", "file11.src", 10)}, - 2000: {frame("fun21", "file21.src", 20), frame("fun22", "file22.src", 20)}, - 3000: {frame("fun31", "file31.src", 30), frame("fun32", "file32.src", 30), frame("fun33", "file33.src", 30)}, - 4000: {frame("fun41", "file41.src", 40), frame("fun42", "file42.src", 40), frame("fun43", "file43.src", 40), frame("fun44", "file44.src", 40)}, - 5000: {frame("fun51", "file51.src", 50), frame("fun52", "file52.src", 50), frame("fun53", "file53.src", 50), frame("fun54", "file54.src", 50), frame("fun55", "file55.src", 50)}, -} - -func frame(fname, file string, line int) plugin.Frame { - return plugin.Frame{ - Func: fname, - File: file, - Line: line} -} - -type mockObjTool struct{} - -func (mockObjTool) Open(file string, start, limit, offset uint64) (plugin.ObjFile, error) { - return mockObjFile{frames: mockAddresses}, nil -} - -func (mockObjTool) Disasm(file string, start, end uint64) ([]plugin.Inst, error) { - return nil, fmt.Errorf("disassembly not supported") -} - -type mockObjFile struct { - frames map[uint64][]plugin.Frame -} - -func (mockObjFile) Name() string { - return "" -} - -func (mockObjFile) Base() uint64 { - return 0 -} - -func (mockObjFile) BuildID() string { - return "" -} - -func (mf mockObjFile) SourceLine(addr uint64) ([]plugin.Frame, error) { - return mf.frames[addr], nil -} - -func (mockObjFile) Symbols(r *regexp.Regexp, addr uint64) ([]*plugin.Sym, error) { - return []*plugin.Sym{}, nil -} - -func (mockObjFile) Close() error { - return nil -} diff --git a/src/cmd/vendor/github.com/google/pprof/internal/symbolz/symbolz_test.go b/src/cmd/vendor/github.com/google/pprof/internal/symbolz/symbolz_test.go deleted file mode 100644 index e71811f3c4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/internal/symbolz/symbolz_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package symbolz - -import ( - "fmt" - "math" - "strings" - "testing" - - "github.com/google/pprof/internal/plugin" - "github.com/google/pprof/internal/proftest" - "github.com/google/pprof/profile" -) - -func TestSymbolzURL(t *testing.T) { - for try, want := range map[string]string{ - "http://host:8000/profilez": "http://host:8000/symbolz", - "http://host:8000/profilez?seconds=5": "http://host:8000/symbolz", - "http://host:8000/profilez?seconds=5&format=proto": "http://host:8000/symbolz", - "http://host:8000/heapz?format=legacy": "http://host:8000/symbolz", - "http://host:8000/debug/pprof/profile": "http://host:8000/debug/pprof/symbol", - "http://host:8000/debug/pprof/profile?seconds=10": "http://host:8000/debug/pprof/symbol", - "http://host:8000/debug/pprof/heap": "http://host:8000/debug/pprof/symbol", - "http://some.host:8080/some/deeper/path/debug/pprof/endpoint?param=value": "http://some.host:8080/some/deeper/path/debug/pprof/symbol", - "http://host:8000/pprof/profile": "http://host:8000/pprof/symbol", - "http://host:8000/pprof/profile?seconds=15": "http://host:8000/pprof/symbol", - "http://host:8000/pprof/heap": "http://host:8000/pprof/symbol", - "http://host:8000/debug/pprof/block": "http://host:8000/debug/pprof/symbol", - "http://host:8000/debug/pprof/trace?seconds=5": "http://host:8000/debug/pprof/symbol", - "http://host:8000/debug/pprof/mutex": "http://host:8000/debug/pprof/symbol", - "http://host/whatever/pprof/heap": "http://host/whatever/pprof/symbol", - "http://host/whatever/pprof/growth": "http://host/whatever/pprof/symbol", - "http://host/whatever/pprof/profile": "http://host/whatever/pprof/symbol", - "http://host/whatever/pprof/pmuprofile": "http://host/whatever/pprof/symbol", - "http://host/whatever/pprof/contention": "http://host/whatever/pprof/symbol", - } { - if got := symbolz(try); got != want { - t.Errorf(`symbolz(%s)=%s, want "%s"`, try, got, want) - } - } -} - -func TestSymbolize(t *testing.T) { - s := plugin.MappingSources{ - "buildid": []struct { - Source string - Start uint64 - }{ - {Source: "http://localhost:80/profilez"}, - }, - } - - for _, hasFunctions := range []bool{false, true} { - for _, force := range []bool{false, true} { - p := testProfile(hasFunctions) - - if err := Symbolize(p, force, s, fetchSymbols, &proftest.TestUI{T: t}); err != nil { - t.Errorf("symbolz: %v", err) - continue - } - var wantSym, wantNoSym []*profile.Location - if force || !hasFunctions { - wantNoSym = p.Location[:1] - wantSym = p.Location[1:] - } else { - wantNoSym = p.Location - } - - if err := checkSymbolized(wantSym, true); err != nil { - t.Errorf("symbolz hasFns=%v force=%v: %v", hasFunctions, force, err) - } - if err := checkSymbolized(wantNoSym, false); err != nil { - t.Errorf("symbolz hasFns=%v force=%v: %v", hasFunctions, force, err) - } - } - } -} - -func testProfile(hasFunctions bool) *profile.Profile { - m := []*profile.Mapping{ - { - ID: 1, - Start: 0x1000, - Limit: 0x5000, - BuildID: "buildid", - HasFunctions: hasFunctions, - }, - } - p := &profile.Profile{ - Location: []*profile.Location{ - {ID: 1, Mapping: m[0], Address: 0x1000}, - {ID: 2, Mapping: m[0], Address: 0x2000}, - {ID: 3, Mapping: m[0], Address: 0x3000}, - {ID: 4, Mapping: m[0], Address: 0x4000}, - }, - Mapping: m, - } - - return p -} - -func checkSymbolized(locs []*profile.Location, wantSymbolized bool) error { - for _, loc := range locs { - if !wantSymbolized && len(loc.Line) != 0 { - return fmt.Errorf("unexpected symbolization for %#x: %v", loc.Address, loc.Line) - } - if wantSymbolized { - if len(loc.Line) != 1 { - return fmt.Errorf("expected symbolization for %#x: %v", loc.Address, loc.Line) - } - address := loc.Address - loc.Mapping.Start - if got, want := loc.Line[0].Function.Name, fmt.Sprintf("%#x", address); got != want { - return fmt.Errorf("symbolz %#x, got %s, want %s", address, got, want) - } - } - } - return nil -} - -func fetchSymbols(source, post string) ([]byte, error) { - var symbolz string - - addresses := strings.Split(post, "+") - // Do not symbolize the first symbol. - for _, address := range addresses[1:] { - symbolz += fmt.Sprintf("%s\t%s\n", address, address) - } - return []byte(symbolz), nil -} - -func TestAdjust(t *testing.T) { - for _, tc := range []struct { - addr uint64 - offset int64 - wantAdj uint64 - wantOverflow bool - }{{math.MaxUint64, 0, math.MaxUint64, false}, - {math.MaxUint64, 1, 0, true}, - {math.MaxUint64 - 1, 1, math.MaxUint64, false}, - {math.MaxUint64 - 1, 2, 0, true}, - {math.MaxInt64 + 1, math.MaxInt64, math.MaxUint64, false}, - {0, 0, 0, false}, - {0, -1, 0, true}, - {1, -1, 0, false}, - {2, -1, 1, false}, - {2, -2, 0, false}, - {2, -3, 0, true}, - {-math.MinInt64, math.MinInt64, 0, false}, - {-math.MinInt64 + 1, math.MinInt64, 1, false}, - {-math.MinInt64 - 1, math.MinInt64, 0, true}, - } { - if adj, overflow := adjust(tc.addr, tc.offset); adj != tc.wantAdj || overflow != tc.wantOverflow { - t.Errorf("adjust(%d, %d) = (%d, %t), want (%d, %t)", tc.addr, tc.offset, adj, overflow, tc.wantAdj, tc.wantOverflow) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/filter_test.go b/src/cmd/vendor/github.com/google/pprof/profile/filter_test.go deleted file mode 100644 index 3fd1787e8b..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/filter_test.go +++ /dev/null @@ -1,599 +0,0 @@ -// Copyright 2018 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "fmt" - "regexp" - "strings" - "testing" - - "github.com/google/pprof/internal/proftest" -) - -var mappings = []*Mapping{ - {ID: 1, Start: 0x10000, Limit: 0x40000, File: "map0", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true}, - {ID: 2, Start: 0x50000, Limit: 0x70000, File: "map1", HasFunctions: true, HasFilenames: true, HasLineNumbers: true, HasInlineFrames: true}, -} - -var functions = []*Function{ - {ID: 1, Name: "fun0", SystemName: "fun0", Filename: "file0"}, - {ID: 2, Name: "fun1", SystemName: "fun1", Filename: "file1"}, - {ID: 3, Name: "fun2", SystemName: "fun2", Filename: "file2"}, - {ID: 4, Name: "fun3", SystemName: "fun3", Filename: "file3"}, - {ID: 5, Name: "fun4", SystemName: "fun4", Filename: "file4"}, - {ID: 6, Name: "fun5", SystemName: "fun5", Filename: "file5"}, - {ID: 7, Name: "fun6", SystemName: "fun6", Filename: "file6"}, - {ID: 8, Name: "fun7", SystemName: "fun7", Filename: "file7"}, - {ID: 9, Name: "fun8", SystemName: "fun8", Filename: "file8"}, - {ID: 10, Name: "fun9", SystemName: "fun9", Filename: "file9"}, - {ID: 11, Name: "fun10", SystemName: "fun10", Filename: "file10"}, -} - -var noInlinesLocs = []*Location{ - {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}}}, - {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{{Function: functions[1], Line: 1}}}, - {ID: 3, Mapping: mappings[0], Address: 0x3000, Line: []Line{{Function: functions[2], Line: 1}}}, - {ID: 4, Mapping: mappings[0], Address: 0x4000, Line: []Line{{Function: functions[3], Line: 1}}}, - {ID: 5, Mapping: mappings[0], Address: 0x5000, Line: []Line{{Function: functions[4], Line: 1}}}, - {ID: 6, Mapping: mappings[0], Address: 0x6000, Line: []Line{{Function: functions[5], Line: 1}}}, - {ID: 7, Mapping: mappings[0], Address: 0x7000, Line: []Line{{Function: functions[6], Line: 1}}}, - {ID: 8, Mapping: mappings[0], Address: 0x8000, Line: []Line{{Function: functions[7], Line: 1}}}, - {ID: 9, Mapping: mappings[0], Address: 0x9000, Line: []Line{{Function: functions[8], Line: 1}}}, - {ID: 10, Mapping: mappings[0], Address: 0x10000, Line: []Line{{Function: functions[9], Line: 1}}}, - {ID: 11, Mapping: mappings[1], Address: 0x11000, Line: []Line{{Function: functions[10], Line: 1}}}, -} - -var noInlinesProfile = &Profile{ - TimeNanos: 10000, - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, - Mapping: mappings, - Function: functions, - Location: noInlinesLocs, - Sample: []*Sample{ - {Value: []int64{1}, Location: []*Location{noInlinesLocs[0], noInlinesLocs[1], noInlinesLocs[2], noInlinesLocs[3]}}, - {Value: []int64{2}, Location: []*Location{noInlinesLocs[4], noInlinesLocs[5], noInlinesLocs[1], noInlinesLocs[6]}}, - {Value: []int64{3}, Location: []*Location{noInlinesLocs[7], noInlinesLocs[8]}}, - {Value: []int64{4}, Location: []*Location{noInlinesLocs[9], noInlinesLocs[4], noInlinesLocs[10], noInlinesLocs[7]}}, - }, -} - -var allNoInlinesSampleFuncs = []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun1 fun6: 2", - "fun7 fun8: 3", - "fun9 fun4 fun10 fun7: 4", -} - -var inlinesLocs = []*Location{ - {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}, {Function: functions[1], Line: 1}}}, - {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{{Function: functions[2], Line: 1}, {Function: functions[3], Line: 1}}}, - {ID: 3, Mapping: mappings[0], Address: 0x3000, Line: []Line{{Function: functions[4], Line: 1}, {Function: functions[5], Line: 1}, {Function: functions[6], Line: 1}}}, -} - -var inlinesProfile = &Profile{ - TimeNanos: 10000, - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, - Mapping: mappings, - Function: functions, - Location: inlinesLocs, - Sample: []*Sample{ - {Value: []int64{1}, Location: []*Location{inlinesLocs[0], inlinesLocs[1]}}, - {Value: []int64{2}, Location: []*Location{inlinesLocs[2]}}, - }, -} - -var emptyLinesLocs = []*Location{ - {ID: 1, Mapping: mappings[0], Address: 0x1000, Line: []Line{{Function: functions[0], Line: 1}, {Function: functions[1], Line: 1}}}, - {ID: 2, Mapping: mappings[0], Address: 0x2000, Line: []Line{}}, - {ID: 3, Mapping: mappings[1], Address: 0x2000, Line: []Line{}}, -} - -var emptyLinesProfile = &Profile{ - TimeNanos: 10000, - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{{Type: "samples", Unit: "count"}}, - Mapping: mappings, - Function: functions, - Location: emptyLinesLocs, - Sample: []*Sample{ - {Value: []int64{1}, Location: []*Location{emptyLinesLocs[0], emptyLinesLocs[1]}}, - {Value: []int64{2}, Location: []*Location{emptyLinesLocs[2]}}, - {Value: []int64{3}, Location: []*Location{}}, - }, -} - -func TestFilterSamplesByName(t *testing.T) { - for _, tc := range []struct { - // name is the name of the test case. - name string - // profile is the profile that gets filtered. - profile *Profile - // These are the inputs to FilterSamplesByName(). - focus, ignore, hide, show *regexp.Regexp - // want{F,I,S,H}m are expected return values from FilterSamplesByName. - wantFm, wantIm, wantSm, wantHm bool - // wantSampleFuncs contains expected stack functions and sample value after - // filtering, in the same order as in the profile. The format is as - // returned by sampleFuncs function below, which is "callee caller: ". - wantSampleFuncs []string - }{ - // No Filters - { - name: "empty filters keep all frames", - profile: noInlinesProfile, - wantFm: true, - wantSampleFuncs: allNoInlinesSampleFuncs, - }, - // Focus - { - name: "focus with no matches", - profile: noInlinesProfile, - focus: regexp.MustCompile("unknown"), - }, - { - name: "focus matches function names", - profile: noInlinesProfile, - focus: regexp.MustCompile("fun1"), - wantFm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun1 fun6: 2", - "fun9 fun4 fun10 fun7: 4", - }, - }, - { - name: "focus matches file names", - profile: noInlinesProfile, - focus: regexp.MustCompile("file1"), - wantFm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun1 fun6: 2", - "fun9 fun4 fun10 fun7: 4", - }, - }, - { - name: "focus matches mapping names", - profile: noInlinesProfile, - focus: regexp.MustCompile("map1"), - wantFm: true, - wantSampleFuncs: []string{ - "fun9 fun4 fun10 fun7: 4", - }, - }, - { - name: "focus matches inline functions", - profile: inlinesProfile, - focus: regexp.MustCompile("fun5"), - wantFm: true, - wantSampleFuncs: []string{ - "fun4 fun5 fun6: 2", - }, - }, - // Ignore - { - name: "ignore with no matches matches all samples", - profile: noInlinesProfile, - ignore: regexp.MustCompile("unknown"), - wantFm: true, - wantSampleFuncs: allNoInlinesSampleFuncs, - }, - { - name: "ignore matches function names", - profile: noInlinesProfile, - ignore: regexp.MustCompile("fun1"), - wantFm: true, - wantIm: true, - wantSampleFuncs: []string{ - "fun7 fun8: 3", - }, - }, - { - name: "ignore matches file names", - profile: noInlinesProfile, - ignore: regexp.MustCompile("file1"), - wantFm: true, - wantIm: true, - wantSampleFuncs: []string{ - "fun7 fun8: 3", - }, - }, - { - name: "ignore matches mapping names", - profile: noInlinesProfile, - ignore: regexp.MustCompile("map1"), - wantFm: true, - wantIm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun1 fun6: 2", - "fun7 fun8: 3", - }, - }, - { - name: "ignore matches inline functions", - profile: inlinesProfile, - ignore: regexp.MustCompile("fun5"), - wantFm: true, - wantIm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - }, - }, - // Show - { - name: "show with no matches", - profile: noInlinesProfile, - show: regexp.MustCompile("unknown"), - wantFm: true, - }, - { - name: "show matches function names", - profile: noInlinesProfile, - show: regexp.MustCompile("fun1|fun2"), - wantFm: true, - wantSm: true, - wantSampleFuncs: []string{ - "fun1 fun2: 1", - "fun1: 2", - "fun10: 4", - }, - }, - { - name: "show matches file names", - profile: noInlinesProfile, - show: regexp.MustCompile("file1|file3"), - wantFm: true, - wantSm: true, - wantSampleFuncs: []string{ - "fun1 fun3: 1", - "fun1: 2", - "fun10: 4", - }, - }, - { - name: "show matches mapping names", - profile: noInlinesProfile, - show: regexp.MustCompile("map1"), - wantFm: true, - wantSm: true, - wantSampleFuncs: []string{ - "fun10: 4", - }, - }, - { - name: "show matches inline functions", - profile: inlinesProfile, - show: regexp.MustCompile("fun[03]"), - wantFm: true, - wantSm: true, - wantSampleFuncs: []string{ - "fun0 fun3: 1", - }, - }, - { - name: "show keeps all lines when matching both mapping and function", - profile: inlinesProfile, - show: regexp.MustCompile("map0|fun5"), - wantFm: true, - wantSm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun6: 2", - }, - }, - // Hide - { - name: "hide with no matches", - profile: noInlinesProfile, - hide: regexp.MustCompile("unknown"), - wantFm: true, - wantSampleFuncs: allNoInlinesSampleFuncs, - }, - { - name: "hide matches function names", - profile: noInlinesProfile, - hide: regexp.MustCompile("fun1|fun2"), - wantFm: true, - wantHm: true, - wantSampleFuncs: []string{ - "fun0 fun3: 1", - "fun4 fun5 fun6: 2", - "fun7 fun8: 3", - "fun9 fun4 fun7: 4", - }, - }, - { - name: "hide matches file names", - profile: noInlinesProfile, - hide: regexp.MustCompile("file1|file3"), - wantFm: true, - wantHm: true, - wantSampleFuncs: []string{ - "fun0 fun2: 1", - "fun4 fun5 fun6: 2", - "fun7 fun8: 3", - "fun9 fun4 fun7: 4", - }, - }, - { - name: "hide matches mapping names", - profile: noInlinesProfile, - hide: regexp.MustCompile("map1"), - wantFm: true, - wantHm: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun1 fun6: 2", - "fun7 fun8: 3", - "fun9 fun4 fun7: 4", - }, - }, - { - name: "hide matches inline functions", - profile: inlinesProfile, - hide: regexp.MustCompile("fun[125]"), - wantFm: true, - wantHm: true, - wantSampleFuncs: []string{ - "fun0 fun3: 1", - "fun4 fun6: 2", - }, - }, - { - name: "hide drops all lines when matching both mapping and function", - profile: inlinesProfile, - hide: regexp.MustCompile("map0|fun5"), - wantFm: true, - wantHm: true, - }, - // Compound filters - { - name: "hides a stack matched by both focus and ignore", - profile: noInlinesProfile, - focus: regexp.MustCompile("fun1|fun7"), - ignore: regexp.MustCompile("fun1"), - wantFm: true, - wantIm: true, - wantSampleFuncs: []string{ - "fun7 fun8: 3", - }, - }, - { - name: "hides a function if both show and hide match it", - profile: noInlinesProfile, - show: regexp.MustCompile("fun1"), - hide: regexp.MustCompile("fun10"), - wantFm: true, - wantSm: true, - wantHm: true, - wantSampleFuncs: []string{ - "fun1: 1", - "fun1: 2", - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - p := tc.profile.Copy() - fm, im, hm, sm := p.FilterSamplesByName(tc.focus, tc.ignore, tc.hide, tc.show) - - type match struct{ fm, im, hm, sm bool } - if got, want := (match{fm: fm, im: im, hm: hm, sm: sm}), (match{fm: tc.wantFm, im: tc.wantIm, hm: tc.wantHm, sm: tc.wantSm}); got != want { - t.Errorf("match got %+v want %+v", got, want) - } - - if got, want := strings.Join(sampleFuncs(p), "\n")+"\n", strings.Join(tc.wantSampleFuncs, "\n")+"\n"; got != want { - diff, err := proftest.Diff([]byte(want), []byte(got)) - if err != nil { - t.Fatalf("failed to get diff: %v", err) - } - t.Errorf("FilterSamplesByName: got diff(want->got):\n%s", diff) - } - }) - } -} - -func TestShowFrom(t *testing.T) { - for _, tc := range []struct { - name string - profile *Profile - showFrom *regexp.Regexp - // wantMatch is the expected return value. - wantMatch bool - // wantSampleFuncs contains expected stack functions and sample value after - // filtering, in the same order as in the profile. The format is as - // returned by sampleFuncs function below, which is "callee caller: ". - wantSampleFuncs []string - }{ - { - name: "nil showFrom keeps all frames", - profile: noInlinesProfile, - wantMatch: false, - wantSampleFuncs: allNoInlinesSampleFuncs, - }, - { - name: "showFrom with no matches drops all samples", - profile: noInlinesProfile, - showFrom: regexp.MustCompile("unknown"), - wantMatch: false, - }, - { - name: "showFrom matches function names", - profile: noInlinesProfile, - showFrom: regexp.MustCompile("fun1"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0 fun1: 1", - "fun4 fun5 fun1: 2", - "fun9 fun4 fun10: 4", - }, - }, - { - name: "showFrom matches file names", - profile: noInlinesProfile, - showFrom: regexp.MustCompile("file1"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0 fun1: 1", - "fun4 fun5 fun1: 2", - "fun9 fun4 fun10: 4", - }, - }, - { - name: "showFrom matches mapping names", - profile: noInlinesProfile, - showFrom: regexp.MustCompile("map1"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun9 fun4 fun10: 4", - }, - }, - { - name: "showFrom drops frames above highest of multiple matches", - profile: noInlinesProfile, - showFrom: regexp.MustCompile("fun[12]"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2: 1", - "fun4 fun5 fun1: 2", - "fun9 fun4 fun10: 4", - }, - }, - { - name: "showFrom matches inline functions", - profile: inlinesProfile, - showFrom: regexp.MustCompile("fun0|fun5"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0: 1", - "fun4 fun5: 2", - }, - }, - { - name: "showFrom drops frames above highest of multiple inline matches", - profile: inlinesProfile, - showFrom: regexp.MustCompile("fun[1245]"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2: 1", - "fun4 fun5: 2", - }, - }, - { - name: "showFrom keeps all lines when matching mapping and function", - profile: inlinesProfile, - showFrom: regexp.MustCompile("map0|fun5"), - wantMatch: true, - wantSampleFuncs: []string{ - "fun0 fun1 fun2 fun3: 1", - "fun4 fun5 fun6: 2", - }, - }, - { - name: "showFrom matches location with empty lines", - profile: emptyLinesProfile, - showFrom: regexp.MustCompile("map1"), - wantMatch: true, - wantSampleFuncs: []string{ - ": 2", - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - p := tc.profile.Copy() - - if gotMatch := p.ShowFrom(tc.showFrom); gotMatch != tc.wantMatch { - t.Errorf("match got %+v, want %+v", gotMatch, tc.wantMatch) - } - - if got, want := strings.Join(sampleFuncs(p), "\n")+"\n", strings.Join(tc.wantSampleFuncs, "\n")+"\n"; got != want { - diff, err := proftest.Diff([]byte(want), []byte(got)) - if err != nil { - t.Fatalf("failed to get diff: %v", err) - } - t.Errorf("profile samples got diff(want->got):\n%s", diff) - } - }) - } -} - -// sampleFuncs returns a slice of strings where each string represents one -// profile sample in the format " : ". This allows -// the expected values for test cases to be specifed in human-readable strings. -func sampleFuncs(p *Profile) []string { - var ret []string - for _, s := range p.Sample { - var funcs []string - for _, loc := range s.Location { - for _, line := range loc.Line { - funcs = append(funcs, line.Function.Name) - } - } - ret = append(ret, fmt.Sprintf("%s: %d", strings.Join(funcs, " "), s.Value[0])) - } - return ret -} - -func TestTagFilter(t *testing.T) { - // Perform several forms of tag filtering on the test profile. - - type filterTestcase struct { - include, exclude *regexp.Regexp - im, em bool - count int - } - - countTags := func(p *Profile) map[string]bool { - tags := make(map[string]bool) - - for _, s := range p.Sample { - for l := range s.Label { - tags[l] = true - } - for l := range s.NumLabel { - tags[l] = true - } - } - return tags - } - - for tx, tc := range []filterTestcase{ - {nil, nil, true, false, 3}, - {regexp.MustCompile("notfound"), nil, false, false, 0}, - {regexp.MustCompile("key1"), nil, true, false, 1}, - {nil, regexp.MustCompile("key[12]"), true, true, 1}, - } { - prof := testProfile1.Copy() - gim, gem := prof.FilterTagsByName(tc.include, tc.exclude) - if gim != tc.im { - t.Errorf("Filter #%d, got include match=%v, want %v", tx, gim, tc.im) - } - if gem != tc.em { - t.Errorf("Filter #%d, got exclude match=%v, want %v", tx, gem, tc.em) - } - if tags := countTags(prof); len(tags) != tc.count { - t.Errorf("Filter #%d, got %d tags[%v], want %d", tx, len(tags), tags, tc.count) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/index_test.go b/src/cmd/vendor/github.com/google/pprof/profile/index_test.go deleted file mode 100644 index f846b59273..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/index_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2016 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "testing" -) - -func TestSampleIndexByName(t *testing.T) { - for _, c := range []struct { - desc string - sampleTypes []string - defaultSampleType string - index string - want int - wantError bool - }{ - { - desc: "use last by default", - index: "", - want: 1, - sampleTypes: []string{"zero", "default"}, - }, - { - desc: "honour specified default", - index: "", - want: 1, - defaultSampleType: "default", - sampleTypes: []string{"zero", "default", "two"}, - }, - { - desc: "invalid default is ignored", - index: "", - want: 2, - defaultSampleType: "non-existent", - sampleTypes: []string{"zero", "one", "default"}, - }, - { - desc: "index by int", - index: "0", - want: 0, - sampleTypes: []string{"zero", "one", "two"}, - }, - { - desc: "index by int ignores default", - index: "0", - want: 0, - defaultSampleType: "default", - sampleTypes: []string{"zero", "default", "two"}, - }, - { - desc: "index by name", - index: "two", - want: 2, - sampleTypes: []string{"zero", "one", "two", "three"}, - }, - { - desc: "index by name ignores default", - index: "zero", - want: 0, - defaultSampleType: "default", - sampleTypes: []string{"zero", "default", "two"}, - }, - { - desc: "out of bound int causes error", - index: "100", - wantError: true, - sampleTypes: []string{"zero", "default"}, - }, - { - desc: "unknown name causes error", - index: "does not exist", - wantError: true, - sampleTypes: []string{"zero", "default"}, - }, - { - desc: "'inused_{x}' recognized for legacy '{x}'", - index: "inuse_zero", - want: 0, - sampleTypes: []string{"zero", "default"}, - }, - } { - p := &Profile{ - DefaultSampleType: c.defaultSampleType, - SampleType: []*ValueType{}, - } - for _, st := range c.sampleTypes { - p.SampleType = append(p.SampleType, &ValueType{Type: st, Unit: "milliseconds"}) - } - - got, err := p.SampleIndexByName(c.index) - - switch { - case c.wantError && err == nil: - t.Errorf("%s: error should have been returned not index=%d, err=%v", c.desc, got, err) - case !c.wantError && err != nil: - t.Errorf("%s: unexpected got index=%d, err=%v; wanted index=%d, err=nil", c.desc, got, err, c.want) - case !c.wantError && got != c.want: - t.Errorf("%s: got index=%d, want index=%d", c.desc, got, c.want) - } - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/legacy_profile_test.go b/src/cmd/vendor/github.com/google/pprof/profile/legacy_profile_test.go deleted file mode 100644 index 6ba0e338c9..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/legacy_profile_test.go +++ /dev/null @@ -1,321 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "bytes" - "fmt" - "reflect" - "strconv" - "strings" - "testing" -) - -func TestLegacyProfileType(t *testing.T) { - type testcase struct { - sampleTypes []string - typeSet [][]string - want bool - setName string - } - - heap := heapzSampleTypes - cont := contentionzSampleTypes - testcases := []testcase{ - // True cases - {[]string{"allocations", "size"}, heap, true, "heapzSampleTypes"}, - {[]string{"objects", "space"}, heap, true, "heapzSampleTypes"}, - {[]string{"inuse_objects", "inuse_space"}, heap, true, "heapzSampleTypes"}, - {[]string{"alloc_objects", "alloc_space"}, heap, true, "heapzSampleTypes"}, - {[]string{"alloc_objects", "alloc_space", "inuse_objects", "inuse_space"}, heap, true, "heapzSampleTypes"}, - {[]string{"contentions", "delay"}, cont, true, "contentionzSampleTypes"}, - // False cases - {[]string{"objects"}, heap, false, "heapzSampleTypes"}, - {[]string{"objects", "unknown"}, heap, false, "heapzSampleTypes"}, - {[]string{"inuse_objects", "inuse_space", "alloc_objects", "alloc_space"}, heap, false, "heapzSampleTypes"}, - {[]string{"contentions", "delay"}, heap, false, "heapzSampleTypes"}, - {[]string{"samples", "cpu"}, heap, false, "heapzSampleTypes"}, - {[]string{"samples", "cpu"}, cont, false, "contentionzSampleTypes"}, - } - - for _, tc := range testcases { - p := profileOfType(tc.sampleTypes) - if got := isProfileType(p, tc.typeSet); got != tc.want { - t.Error("isProfileType({"+strings.Join(tc.sampleTypes, ",")+"},", tc.setName, "), got", got, "want", tc.want) - } - } -} - -func TestCpuParse(t *testing.T) { - // profileString is a legacy encoded profile, represnted by words separated by ":" - // Each sample has the form value : N : stack1..stackN - // EOF is represented as "0:1:0" - profileString := "1:3:100:999:100:" // sample with bogus 999 and duplicate leaf - profileString += "1:5:200:999:200:501:502:" // sample with bogus 999 and duplicate leaf - profileString += "1:12:300:999:300:601:602:603:604:605:606:607:608:609:" // sample with bogus 999 and duplicate leaf - profileString += "0:1:0000" // EOF -- must use 4 bytes for the final zero - - p, err := cpuProfile([]byte(profileString), 1, parseString) - if err != nil { - t.Fatal(err) - } - - if err := checkTestSample(p, []uint64{100}); err != nil { - t.Error(err) - } - if err := checkTestSample(p, []uint64{200, 500, 501}); err != nil { - t.Error(err) - } - if err := checkTestSample(p, []uint64{300, 600, 601, 602, 603, 604, 605, 606, 607, 608}); err != nil { - t.Error(err) - } -} - -func parseString(b []byte) (uint64, []byte) { - slices := bytes.SplitN(b, []byte(":"), 2) - var value, remainder []byte - if len(slices) > 0 { - value = slices[0] - } - if len(slices) > 1 { - remainder = slices[1] - } - v, _ := strconv.ParseUint(string(value), 10, 64) - return v, remainder -} - -func checkTestSample(p *Profile, want []uint64) error { - for _, s := range p.Sample { - got := []uint64{} - for _, l := range s.Location { - got = append(got, l.Address) - } - if reflect.DeepEqual(got, want) { - return nil - } - } - return fmt.Errorf("Could not find sample : %v", want) -} - -// profileOfType creates an empty profile with only sample types set, -// for testing purposes only. -func profileOfType(sampleTypes []string) *Profile { - p := new(Profile) - p.SampleType = make([]*ValueType, len(sampleTypes)) - for i, t := range sampleTypes { - p.SampleType[i] = new(ValueType) - p.SampleType[i].Type = t - } - return p -} - -func TestParseMappingEntry(t *testing.T) { - for _, test := range []*struct { - entry string - want *Mapping - }{ - { - entry: "00400000-02e00000 r-xp 00000000 00:00 0", - want: &Mapping{ - Start: 0x400000, - Limit: 0x2e00000, - }, - }, - { - entry: "02e00000-02e8a000 r-xp 02a00000 00:00 15953927 /foo/bin", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - Offset: 0x2a00000, - File: "/foo/bin", - }, - }, - { - entry: "02e00000-02e8a000 r-xp 000000 00:00 15953927 [vdso]", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - File: "[vdso]", - }, - }, - { - entry: " 02e00000-02e8a000: /foo/bin (@2a00000)", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - Offset: 0x2a00000, - File: "/foo/bin", - }, - }, - { - entry: " 02e00000-02e8a000: /foo/bin (deleted)", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - File: "/foo/bin", - }, - }, - { - entry: " 02e00000-02e8a000: /foo/bin", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - File: "/foo/bin", - }, - }, - { - entry: " 02e00000-02e8a000: [vdso]", - want: &Mapping{ - Start: 0x2e00000, - Limit: 0x2e8a000, - File: "[vdso]", - }, - }, - {entry: "0xff6810563000 0xff6810565000 r-xp abc_exe 87c4d547f895cfd6a370e08dc5c5ee7bd4199d5b", - want: &Mapping{ - Start: 0xff6810563000, - Limit: 0xff6810565000, - File: "abc_exe", - BuildID: "87c4d547f895cfd6a370e08dc5c5ee7bd4199d5b", - }, - }, - {entry: "7f5e5435e000-7f5e5455e000 --xp 00002000 00:00 1531 myprogram", - want: &Mapping{ - Start: 0x7f5e5435e000, - Limit: 0x7f5e5455e000, - Offset: 0x2000, - File: "myprogram", - }, - }, - {entry: "7f7472710000-7f7472722000 r-xp 00000000 fc:00 790190 /usr/lib/libfantastic-1.2.so", - want: &Mapping{ - Start: 0x7f7472710000, - Limit: 0x7f7472722000, - File: "/usr/lib/libfantastic-1.2.so", - }, - }, - {entry: "7f47a542f000-7f47a5447000: /lib/libpthread-2.15.so", - want: &Mapping{ - Start: 0x7f47a542f000, - Limit: 0x7f47a5447000, - File: "/lib/libpthread-2.15.so", - }, - }, - {entry: "0x40000-0x80000 /path/to/binary (@FF00) abc123456", - want: &Mapping{ - Start: 0x40000, - Limit: 0x80000, - File: "/path/to/binary", - Offset: 0xFF00, - BuildID: "abc123456", - }, - }, - {entry: "W1220 15:07:15.201776 8272 logger.cc:12033] --- Memory map: ---\n" + - "0x40000-0x80000 /path/to/binary (@FF00) abc123456", - want: &Mapping{ - Start: 0x40000, - Limit: 0x80000, - File: "/path/to/binary", - Offset: 0xFF00, - BuildID: "abc123456", - }, - }, - {entry: "W1220 15:07:15.201776 8272 logger.cc:12033] --- Memory map: ---\n" + - "W1220 15:07:15.202776 8272 logger.cc:12036] 0x40000-0x80000 /path/to/binary (@FF00) abc123456", - want: &Mapping{ - Start: 0x40000, - Limit: 0x80000, - File: "/path/to/binary", - Offset: 0xFF00, - BuildID: "abc123456", - }, - }, - {entry: "7f5e5435e000-7f5e5455e000 ---p 00002000 00:00 1531 myprogram", - want: nil, - }, - } { - got, err := ParseProcMaps(strings.NewReader(test.entry)) - if err != nil { - t.Errorf("%s: %v", test.entry, err) - continue - } - if test.want == nil { - if got, want := len(got), 0; got != want { - t.Errorf("%s: got %d mappings, want %d", test.entry, got, want) - } - continue - } - if got, want := len(got), 1; got != want { - t.Errorf("%s: got %d mappings, want %d", test.entry, got, want) - continue - } - if !reflect.DeepEqual(test.want, got[0]) { - t.Errorf("%s want=%v got=%v", test.entry, test.want, got[0]) - } - } -} - -func TestParseThreadProfileWithInvalidAddress(t *testing.T) { - profile := ` ---- threadz 1 --- - ---- Thread 7eff063d9940 (name: main/25376) stack: --- - PC: 0x40b688 0x4d5f51 0x40be31 0x473add693e639c6f0 ---- Memory map: --- - 00400000-00fcb000: /home/rsilvera/cppbench/cppbench_server_main.unstripped - ` - wantErr := "failed to parse as hex 64-bit number: 0x473add693e639c6f0" - if _, gotErr := parseThread([]byte(profile)); !strings.Contains(gotErr.Error(), wantErr) { - t.Errorf("parseThread(): got error %q, want error containing %q", gotErr, wantErr) - } -} - -func TestParseGoCount(t *testing.T) { - for _, test := range []struct { - in string - typ string - }{ - { - in: `# ignored comment - -threadcreate profile: total 123 -`, - typ: "threadcreate", - }, - { - in: ` -# ignored comment -goroutine profile: total 123456 -`, - typ: "goroutine", - }, - { - in: ` -sub/dir-ect_o.ry profile: total 999 -`, - typ: "sub/dir-ect_o.ry", - }, - } { - t.Run(test.typ, func(t *testing.T) { - p, err := parseGoCount([]byte(test.in)) - if err != nil { - t.Fatalf("parseGoCount(%q) = %v", test.in, err) - } - if typ := p.PeriodType.Type; typ != test.typ { - t.Fatalf("parseGoCount(%q).PeriodType.Type = %q want %q", test.in, typ, test.typ) - } - }) - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/merge_test.go b/src/cmd/vendor/github.com/google/pprof/profile/merge_test.go deleted file mode 100644 index 6a04db2f34..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/merge_test.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2018 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "testing" -) - -func TestMapMapping(t *testing.T) { - pm := &profileMerger{ - p: &Profile{}, - mappings: make(map[mappingKey]*Mapping), - mappingsByID: make(map[uint64]mapInfo), - } - for _, tc := range []struct { - desc string - m1 Mapping - m2 Mapping - wantMerged bool - }{ - { - desc: "same file name", - m1: Mapping{ - ID: 1, - File: "test-file-1", - }, - m2: Mapping{ - ID: 2, - File: "test-file-1", - }, - wantMerged: true, - }, - { - desc: "same build ID", - m1: Mapping{ - ID: 3, - BuildID: "test-build-id-1", - }, - m2: Mapping{ - ID: 4, - BuildID: "test-build-id-1", - }, - wantMerged: true, - }, - { - desc: "same fake mapping", - m1: Mapping{ - ID: 5, - }, - m2: Mapping{ - ID: 6, - }, - wantMerged: true, - }, - { - desc: "different start", - m1: Mapping{ - ID: 7, - Start: 0x1000, - Limit: 0x2000, - BuildID: "test-build-id-2", - }, - m2: Mapping{ - ID: 8, - Start: 0x3000, - Limit: 0x4000, - BuildID: "test-build-id-2", - }, - wantMerged: true, - }, - { - desc: "different file name", - m1: Mapping{ - ID: 9, - File: "test-file-2", - }, - m2: Mapping{ - ID: 10, - File: "test-file-3", - }, - }, - { - desc: "different build id", - m1: Mapping{ - ID: 11, - BuildID: "test-build-id-3", - }, - m2: Mapping{ - ID: 12, - BuildID: "test-build-id-4", - }, - }, - { - desc: "different size", - m1: Mapping{ - ID: 13, - Start: 0x1000, - Limit: 0x3000, - BuildID: "test-build-id-5", - }, - m2: Mapping{ - ID: 14, - Start: 0x1000, - Limit: 0x5000, - BuildID: "test-build-id-5", - }, - }, - { - desc: "different offset", - m1: Mapping{ - ID: 15, - Offset: 1, - BuildID: "test-build-id-6", - }, - m2: Mapping{ - ID: 16, - Offset: 2, - BuildID: "test-build-id-6", - }, - }, - } { - t.Run(tc.desc, func(t *testing.T) { - info1 := pm.mapMapping(&tc.m1) - info2 := pm.mapMapping(&tc.m2) - gotM1, gotM2 := *info1.m, *info2.m - - wantM1 := tc.m1 - wantM1.ID = gotM1.ID - if gotM1 != wantM1 { - t.Errorf("first mapping got %v, want %v", gotM1, wantM1) - } - - if tc.wantMerged { - if gotM1 != gotM2 { - t.Errorf("first mapping got %v, second mapping got %v, want equal", gotM1, gotM2) - } - if info1.offset != 0 { - t.Errorf("first mapping info got offset %d, want 0", info1.offset) - } - if wantOffset := int64(tc.m1.Start) - int64(tc.m2.Start); wantOffset != info2.offset { - t.Errorf("second mapping info got offset %d, want %d", info2.offset, wantOffset) - } - } else { - if gotM1.ID == gotM2.ID { - t.Errorf("first mapping got %v, second mapping got %v, want different IDs", gotM1, gotM2) - } - wantM2 := tc.m2 - wantM2.ID = gotM2.ID - if gotM2 != wantM2 { - t.Errorf("second mapping got %v, want %v", gotM2, wantM2) - } - } - }) - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/profile_test.go b/src/cmd/vendor/github.com/google/pprof/profile/profile_test.go deleted file mode 100644 index 43db1806bf..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/profile_test.go +++ /dev/null @@ -1,1381 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "bytes" - "fmt" - "io/ioutil" - "path/filepath" - "reflect" - "strings" - "sync" - "testing" - - "github.com/google/pprof/internal/proftest" -) - -func TestParse(t *testing.T) { - const path = "testdata/" - - for _, source := range []string{ - "go.crc32.cpu", - "go.godoc.thread", - "gobench.cpu", - "gobench.heap", - "cppbench.cpu", - "cppbench.heap", - "cppbench.contention", - "cppbench.growth", - "cppbench.thread", - "cppbench.thread.all", - "cppbench.thread.none", - "java.cpu", - "java.heap", - "java.contention", - } { - inbytes, err := ioutil.ReadFile(filepath.Join(path, source)) - if err != nil { - t.Fatal(err) - } - p, err := Parse(bytes.NewBuffer(inbytes)) - if err != nil { - t.Fatalf("%s: %s", source, err) - } - - js := p.String() - goldFilename := path + source + ".string" - gold, err := ioutil.ReadFile(goldFilename) - if err != nil { - t.Fatalf("%s: %v", source, err) - } - - if js != string(gold) { - t.Errorf("diff %s %s", source, goldFilename) - d, err := proftest.Diff(gold, []byte(js)) - if err != nil { - t.Fatalf("%s: %v", source, err) - } - t.Error(source + "\n" + string(d) + "\n" + "new profile at:\n" + leaveTempfile([]byte(js))) - } - - // Reencode and decode. - var bw bytes.Buffer - if err := p.Write(&bw); err != nil { - t.Fatalf("%s: %v", source, err) - } - if p, err = Parse(&bw); err != nil { - t.Fatalf("%s: %v", source, err) - } - js2 := p.String() - if js2 != string(gold) { - d, err := proftest.Diff(gold, []byte(js2)) - if err != nil { - t.Fatalf("%s: %v", source, err) - } - t.Error(source + "\n" + string(d) + "\n" + "gold:\n" + goldFilename + - "\nnew profile at:\n" + leaveTempfile([]byte(js))) - } - } -} - -func TestParseError(t *testing.T) { - testcases := []string{ - "", - "garbage text", - "\x1f\x8b", // truncated gzip header - "\x1f\x8b\x08\x08\xbe\xe9\x20\x58\x00\x03\x65\x6d\x70\x74\x79\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", // empty gzipped file - } - - for i, input := range testcases { - _, err := Parse(strings.NewReader(input)) - if err == nil { - t.Errorf("got nil, want error for input #%d", i) - } - } -} - -func TestParseConcatentated(t *testing.T) { - prof := testProfile1.Copy() - // Write the profile twice to buffer to create concatented profile. - var buf bytes.Buffer - prof.Write(&buf) - prof.Write(&buf) - _, err := Parse(&buf) - if err == nil { - t.Fatalf("got nil, want error") - } - if got, want := err.Error(), "parsing profile: concatenated profiles detected"; want != got { - t.Fatalf("got error %q, want error %q", got, want) - } -} - -func TestCheckValid(t *testing.T) { - const path = "testdata/java.cpu" - - inbytes, err := ioutil.ReadFile(path) - if err != nil { - t.Fatalf("failed to read profile file %q: %v", path, err) - } - p, err := Parse(bytes.NewBuffer(inbytes)) - if err != nil { - t.Fatalf("failed to parse profile %q: %s", path, err) - } - - for _, tc := range []struct { - mutateFn func(*Profile) - wantErr string - }{ - { - mutateFn: func(p *Profile) { p.SampleType = nil }, - wantErr: "missing sample type information", - }, - { - mutateFn: func(p *Profile) { p.Sample[0] = nil }, - wantErr: "profile has nil sample", - }, - { - mutateFn: func(p *Profile) { p.Sample[0].Value = append(p.Sample[0].Value, 0) }, - wantErr: "sample has 3 values vs. 2 types", - }, - { - mutateFn: func(p *Profile) { p.Sample[0].Location[0] = nil }, - wantErr: "sample has nil location", - }, - { - mutateFn: func(p *Profile) { p.Location[0] = nil }, - wantErr: "profile has nil location", - }, - { - mutateFn: func(p *Profile) { p.Mapping = append(p.Mapping, nil) }, - wantErr: "profile has nil mapping", - }, - { - mutateFn: func(p *Profile) { p.Function[0] = nil }, - wantErr: "profile has nil function", - }, - } { - t.Run(tc.wantErr, func(t *testing.T) { - p := p.Copy() - tc.mutateFn(p) - if err := p.CheckValid(); err == nil { - t.Errorf("CheckValid(): got no error, want error %q", tc.wantErr) - } else if !strings.Contains(err.Error(), tc.wantErr) { - t.Errorf("CheckValid(): got error %v, want error %q", err, tc.wantErr) - } - }) - } -} - -// leaveTempfile leaves |b| in a temporary file on disk and returns the -// temp filename. This is useful to recover a profile when the test -// fails. -func leaveTempfile(b []byte) string { - f1, err := ioutil.TempFile("", "profile_test") - if err != nil { - panic(err) - } - if _, err := f1.Write(b); err != nil { - panic(err) - } - return f1.Name() -} - -const mainBinary = "/bin/main" - -var cpuM = []*Mapping{ - { - ID: 1, - Start: 0x10000, - Limit: 0x40000, - File: mainBinary, - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - { - ID: 2, - Start: 0x1000, - Limit: 0x4000, - File: "/lib/lib.so", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - { - ID: 3, - Start: 0x4000, - Limit: 0x5000, - File: "/lib/lib2_c.so.6", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - { - ID: 4, - Start: 0x5000, - Limit: 0x9000, - File: "/lib/lib.so_6 (deleted)", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, -} - -var cpuF = []*Function{ - {ID: 1, Name: "main", SystemName: "main", Filename: "main.c"}, - {ID: 2, Name: "foo", SystemName: "foo", Filename: "foo.c"}, - {ID: 3, Name: "foo_caller", SystemName: "foo_caller", Filename: "foo.c"}, -} - -var cpuL = []*Location{ - { - ID: 1000, - Mapping: cpuM[1], - Address: 0x1000, - Line: []Line{ - {Function: cpuF[0], Line: 1}, - }, - }, - { - ID: 2000, - Mapping: cpuM[0], - Address: 0x2000, - Line: []Line{ - {Function: cpuF[1], Line: 2}, - {Function: cpuF[2], Line: 1}, - }, - }, - { - ID: 3000, - Mapping: cpuM[0], - Address: 0x3000, - Line: []Line{ - {Function: cpuF[1], Line: 2}, - {Function: cpuF[2], Line: 1}, - }, - }, - { - ID: 3001, - Mapping: cpuM[0], - Address: 0x3001, - Line: []Line{ - {Function: cpuF[2], Line: 2}, - }, - }, - { - ID: 3002, - Mapping: cpuM[0], - Address: 0x3002, - Line: []Line{ - {Function: cpuF[2], Line: 3}, - }, - }, -} - -var testProfile1 = &Profile{ - TimeNanos: 10000, - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000, 1000}, - Label: map[string][]string{ - "key1": {"tag1"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[1], cpuL[0]}, - Value: []int64{100, 100}, - Label: map[string][]string{ - "key1": {"tag2"}, - "key3": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[2], cpuL[0]}, - Value: []int64{10, 10}, - Label: map[string][]string{ - "key1": {"tag3"}, - "key2": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[3], cpuL[0]}, - Value: []int64{10000, 10000}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[4], cpuL[0]}, - Value: []int64{1, 1}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, -} - -var testProfile1NoMapping = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000, 1000}, - Label: map[string][]string{ - "key1": {"tag1"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[1], cpuL[0]}, - Value: []int64{100, 100}, - Label: map[string][]string{ - "key1": {"tag2"}, - "key3": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[2], cpuL[0]}, - Value: []int64{10, 10}, - Label: map[string][]string{ - "key1": {"tag3"}, - "key2": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[3], cpuL[0]}, - Value: []int64{10000, 10000}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[4], cpuL[0]}, - Value: []int64{1, 1}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, -} - -var testProfile2 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{70, 1000}, - Label: map[string][]string{ - "key1": {"tag1"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[1], cpuL[0]}, - Value: []int64{60, 100}, - Label: map[string][]string{ - "key1": {"tag2"}, - "key3": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[2], cpuL[0]}, - Value: []int64{50, 10}, - Label: map[string][]string{ - "key1": {"tag3"}, - "key2": {"tag2"}, - }, - }, - { - Location: []*Location{cpuL[3], cpuL[0]}, - Value: []int64{40, 10000}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - { - Location: []*Location{cpuL[4], cpuL[0]}, - Value: []int64{1, 1}, - Label: map[string][]string{ - "key1": {"tag4"}, - "key2": {"tag1"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, -} - -var testProfile3 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"tag1"}, - "key2": {"tag1"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, -} - -var testProfile4 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - NumLabel: map[string][]int64{ - "key1": {10}, - "key2": {30}, - }, - NumUnit: map[string][]string{ - "key1": {"bytes"}, - "key2": {"bytes"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, -} - -var testProfile5 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - }, - Sample: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - NumLabel: map[string][]int64{ - "key1": {10}, - "key2": {30}, - }, - NumUnit: map[string][]string{ - "key1": {"bytes"}, - "key2": {"bytes"}, - }, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - NumLabel: map[string][]int64{ - "key1": {10}, - "key2": {30}, - }, - NumUnit: map[string][]string{ - "key1": {"kilobytes"}, - "key2": {"kilobytes"}, - }, - }, - }, - Location: cpuL, - Function: cpuF, - Mapping: cpuM, -} - -var aggTests = map[string]aggTest{ - "precise": {true, true, true, true, 5}, - "fileline": {false, true, true, true, 4}, - "inline_function": {false, true, false, true, 3}, - "function": {false, true, false, false, 2}, -} - -type aggTest struct { - precise, function, fileline, inlineFrame bool - rows int -} - -const totalSamples = int64(11111) - -func TestAggregation(t *testing.T) { - prof := testProfile1.Copy() - for _, resolution := range []string{"precise", "fileline", "inline_function", "function"} { - a := aggTests[resolution] - if !a.precise { - if err := prof.Aggregate(a.inlineFrame, a.function, a.fileline, a.fileline, false); err != nil { - t.Error("aggregating to " + resolution + ":" + err.Error()) - } - } - if err := checkAggregation(prof, &a); err != nil { - t.Error("failed aggregation to " + resolution + ": " + err.Error()) - } - } -} - -// checkAggregation verifies that the profile remained consistent -// with its aggregation. -func checkAggregation(prof *Profile, a *aggTest) error { - // Check that the total number of samples for the rows was preserved. - total := int64(0) - - samples := make(map[string]bool) - for _, sample := range prof.Sample { - tb := locationHash(sample) - samples[tb] = true - total += sample.Value[0] - } - - if total != totalSamples { - return fmt.Errorf("sample total %d, want %d", total, totalSamples) - } - - // Check the number of unique sample locations - if a.rows != len(samples) { - return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows) - } - - // Check that all mappings have the right detail flags. - for _, m := range prof.Mapping { - if m.HasFunctions != a.function { - return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function) - } - if m.HasFilenames != a.fileline { - return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline) - } - if m.HasLineNumbers != a.fileline { - return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline) - } - if m.HasInlineFrames != a.inlineFrame { - return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame) - } - } - - // Check that aggregation has removed finer resolution data. - for _, l := range prof.Location { - if !a.inlineFrame && len(l.Line) > 1 { - return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID) - } - - for _, ln := range l.Line { - if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) { - return fmt.Errorf("found line %s:%d on location %d, want :0", - ln.Function.Filename, ln.Line, l.ID) - } - if !a.function && (ln.Function.Name != "") { - return fmt.Errorf(`found file %s location %d, want ""`, - ln.Function.Name, l.ID) - } - } - } - - return nil -} - -// Test merge leaves the main binary in place. -func TestMergeMain(t *testing.T) { - prof := testProfile1.Copy() - p1, err := Merge([]*Profile{prof}) - if err != nil { - t.Fatalf("merge error: %v", err) - } - if cpuM[0].File != p1.Mapping[0].File { - t.Errorf("want Mapping[0]=%s got %s", cpuM[0].File, p1.Mapping[0].File) - } -} - -func TestMerge(t *testing.T) { - // Aggregate a profile with itself and once again with a factor of - // -2. Should end up with an empty profile (all samples for a - // location should add up to 0). - - prof := testProfile1.Copy() - prof.Comments = []string{"comment1"} - p1, err := Merge([]*Profile{prof, prof}) - if err != nil { - t.Errorf("merge error: %v", err) - } - prof.Scale(-2) - prof, err = Merge([]*Profile{p1, prof}) - if err != nil { - t.Errorf("merge error: %v", err) - } - if got, want := len(prof.Comments), 1; got != want { - t.Errorf("len(prof.Comments) = %d, want %d", got, want) - } - - // Use aggregation to merge locations at function granularity. - if err := prof.Aggregate(false, true, false, false, false); err != nil { - t.Errorf("aggregating after merge: %v", err) - } - - samples := make(map[string]int64) - for _, s := range prof.Sample { - tb := locationHash(s) - samples[tb] = samples[tb] + s.Value[0] - } - for s, v := range samples { - if v != 0 { - t.Errorf("nonzero value for sample %s: %d", s, v) - } - } -} - -func TestMergeAll(t *testing.T) { - // Aggregate 10 copies of the profile. - profs := make([]*Profile, 10) - for i := 0; i < 10; i++ { - profs[i] = testProfile1.Copy() - } - prof, err := Merge(profs) - if err != nil { - t.Errorf("merge error: %v", err) - } - samples := make(map[string]int64) - for _, s := range prof.Sample { - tb := locationHash(s) - samples[tb] = samples[tb] + s.Value[0] - } - for _, s := range testProfile1.Sample { - tb := locationHash(s) - if samples[tb] != s.Value[0]*10 { - t.Errorf("merge got wrong value at %s : %d instead of %d", tb, samples[tb], s.Value[0]*10) - } - } -} - -func TestIsFoldedMerge(t *testing.T) { - testProfile1Folded := testProfile1.Copy() - testProfile1Folded.Location[0].IsFolded = true - testProfile1Folded.Location[1].IsFolded = true - - for _, tc := range []struct { - name string - profs []*Profile - wantLocationLen int - }{ - { - name: "folded and non-folded locations not merged", - profs: []*Profile{testProfile1.Copy(), testProfile1Folded.Copy()}, - wantLocationLen: 7, - }, - { - name: "identical folded locations are merged", - profs: []*Profile{testProfile1Folded.Copy(), testProfile1Folded.Copy()}, - wantLocationLen: 5, - }, - } { - t.Run(tc.name, func(t *testing.T) { - prof, err := Merge(tc.profs) - if err != nil { - t.Fatalf("merge error: %v", err) - } - if got, want := len(prof.Location), tc.wantLocationLen; got != want { - t.Fatalf("got %d locations, want %d locations", got, want) - } - }) - } -} - -func TestNumLabelMerge(t *testing.T) { - for _, tc := range []struct { - name string - profs []*Profile - wantNumLabels []map[string][]int64 - wantNumUnits []map[string][]string - }{ - { - name: "different label units not merged", - profs: []*Profile{testProfile4.Copy(), testProfile5.Copy()}, - wantNumLabels: []map[string][]int64{ - { - "key1": {10}, - "key2": {30}, - }, - { - "key1": {10}, - "key2": {30}, - }, - }, - wantNumUnits: []map[string][]string{ - { - "key1": {"bytes"}, - "key2": {"bytes"}, - }, - { - "key1": {"kilobytes"}, - "key2": {"kilobytes"}, - }, - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - prof, err := Merge(tc.profs) - if err != nil { - t.Errorf("merge error: %v", err) - } - - if want, got := len(tc.wantNumLabels), len(prof.Sample); want != got { - t.Fatalf("got %d samples, want %d samples", got, want) - } - for i, wantLabels := range tc.wantNumLabels { - numLabels := prof.Sample[i].NumLabel - if !reflect.DeepEqual(wantLabels, numLabels) { - t.Errorf("got numeric labels %v, want %v", numLabels, wantLabels) - } - - wantUnits := tc.wantNumUnits[i] - numUnits := prof.Sample[i].NumUnit - if !reflect.DeepEqual(wantUnits, numUnits) { - t.Errorf("got numeric labels %v, want %v", numUnits, wantUnits) - } - } - }) - } -} - -func TestEmptyMappingMerge(t *testing.T) { - // Aggregate a profile with itself and once again with a factor of - // -2. Should end up with an empty profile (all samples for a - // location should add up to 0). - - prof1 := testProfile1.Copy() - prof2 := testProfile1NoMapping.Copy() - p1, err := Merge([]*Profile{prof2, prof1}) - if err != nil { - t.Errorf("merge error: %v", err) - } - prof2.Scale(-2) - prof, err := Merge([]*Profile{p1, prof2}) - if err != nil { - t.Errorf("merge error: %v", err) - } - - // Use aggregation to merge locations at function granularity. - if err := prof.Aggregate(false, true, false, false, false); err != nil { - t.Errorf("aggregating after merge: %v", err) - } - - samples := make(map[string]int64) - for _, s := range prof.Sample { - tb := locationHash(s) - samples[tb] = samples[tb] + s.Value[0] - } - for s, v := range samples { - if v != 0 { - t.Errorf("nonzero value for sample %s: %d", s, v) - } - } -} - -func TestNormalizeBySameProfile(t *testing.T) { - pb := testProfile1.Copy() - p := testProfile1.Copy() - - if err := p.Normalize(pb); err != nil { - t.Fatal(err) - } - - for i, s := range p.Sample { - for j, v := range s.Value { - expectedSampleValue := testProfile1.Sample[i].Value[j] - if v != expectedSampleValue { - t.Errorf("For sample %d, value %d want %d got %d", i, j, expectedSampleValue, v) - } - } - } -} - -func TestNormalizeByDifferentProfile(t *testing.T) { - p := testProfile1.Copy() - pb := testProfile2.Copy() - - if err := p.Normalize(pb); err != nil { - t.Fatal(err) - } - - expectedSampleValues := [][]int64{ - {19, 1000}, - {1, 100}, - {0, 10}, - {198, 10000}, - {0, 1}, - } - - for i, s := range p.Sample { - for j, v := range s.Value { - if v != expectedSampleValues[i][j] { - t.Errorf("For sample %d, value %d want %d got %d", i, j, expectedSampleValues[i][j], v) - } - } - } -} - -func TestNormalizeByMultipleOfSameProfile(t *testing.T) { - pb := testProfile1.Copy() - for i, s := range pb.Sample { - for j, v := range s.Value { - pb.Sample[i].Value[j] = 10 * v - } - } - - p := testProfile1.Copy() - - err := p.Normalize(pb) - if err != nil { - t.Fatal(err) - } - - for i, s := range p.Sample { - for j, v := range s.Value { - expectedSampleValue := 10 * testProfile1.Sample[i].Value[j] - if v != expectedSampleValue { - t.Errorf("For sample %d, value %d, want %d got %d", i, j, expectedSampleValue, v) - } - } - } -} - -func TestNormalizeIncompatibleProfiles(t *testing.T) { - p := testProfile1.Copy() - pb := testProfile3.Copy() - - if err := p.Normalize(pb); err == nil { - t.Errorf("Expected an error") - } -} - -// locationHash constructs a string to use as a hashkey for a sample, based on its locations -func locationHash(s *Sample) string { - var tb string - for _, l := range s.Location { - for _, ln := range l.Line { - tb = tb + fmt.Sprintf("%s:%d@%d ", ln.Function.Name, ln.Line, l.Address) - } - } - return tb -} - -func TestHasLabel(t *testing.T) { - var testcases = []struct { - desc string - labels map[string][]string - key string - value string - wantHasLabel bool - }{ - { - desc: "empty label does not have label", - labels: map[string][]string{}, - key: "key", - value: "value", - wantHasLabel: false, - }, - { - desc: "label with one key and value has label", - labels: map[string][]string{"key": {"value"}}, - key: "key", - value: "value", - wantHasLabel: true, - }, - { - desc: "label with one key and value does not have label", - labels: map[string][]string{"key": {"value"}}, - key: "key1", - value: "value1", - wantHasLabel: false, - }, - { - desc: "label with many keys and values has label", - labels: map[string][]string{ - "key1": {"value2", "value1"}, - "key2": {"value1", "value2", "value2"}, - "key3": {"value1", "value2", "value2"}, - }, - key: "key1", - value: "value1", - wantHasLabel: true, - }, - { - desc: "label with many keys and values does not have label", - labels: map[string][]string{ - "key1": {"value2", "value1"}, - "key2": {"value1", "value2", "value2"}, - "key3": {"value1", "value2", "value2"}, - }, - key: "key5", - value: "value5", - wantHasLabel: false, - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - sample := &Sample{ - Label: tc.labels, - } - if gotHasLabel := sample.HasLabel(tc.key, tc.value); gotHasLabel != tc.wantHasLabel { - t.Errorf("sample.HasLabel(%q, %q) got %v, want %v", tc.key, tc.value, gotHasLabel, tc.wantHasLabel) - } - }) - } -} - -func TestDiffBaseSample(t *testing.T) { - var testcases = []struct { - desc string - labels map[string][]string - wantDiffBaseSample bool - }{ - { - desc: "empty label does not have label", - labels: map[string][]string{}, - wantDiffBaseSample: false, - }, - { - desc: "label with one key and value, including diff base label", - labels: map[string][]string{"pprof::base": {"true"}}, - wantDiffBaseSample: true, - }, - { - desc: "label with one key and value, not including diff base label", - labels: map[string][]string{"key": {"value"}}, - wantDiffBaseSample: false, - }, - { - desc: "label with many keys and values, including diff base label", - labels: map[string][]string{ - "pprof::base": {"value2", "true"}, - "key2": {"true", "value2", "value2"}, - "key3": {"true", "value2", "value2"}, - }, - wantDiffBaseSample: true, - }, - { - desc: "label with many keys and values, not including diff base label", - labels: map[string][]string{ - "key1": {"value2", "value1"}, - "key2": {"value1", "value2", "value2"}, - "key3": {"value1", "value2", "value2"}, - }, - wantDiffBaseSample: false, - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - sample := &Sample{ - Label: tc.labels, - } - if gotHasLabel := sample.DiffBaseSample(); gotHasLabel != tc.wantDiffBaseSample { - t.Errorf("sample.DiffBaseSample() got %v, want %v", gotHasLabel, tc.wantDiffBaseSample) - } - }) - } -} - -func TestRemove(t *testing.T) { - var testcases = []struct { - desc string - samples []*Sample - removeKey string - wantLabels []map[string][]string - }{ - { - desc: "some samples have label already", - samples: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value1", "value2", "value3"}, - "key2": {"value1"}, - }, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value2"}, - }, - }, - }, - removeKey: "key1", - wantLabels: []map[string][]string{ - {}, - {"key2": {"value1"}}, - {}, - }, - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - profile := testProfile1.Copy() - profile.Sample = tc.samples - profile.RemoveLabel(tc.removeKey) - if got, want := len(profile.Sample), len(tc.wantLabels); got != want { - t.Fatalf("got %v samples, want %v samples", got, want) - } - for i, sample := range profile.Sample { - wantLabels := tc.wantLabels[i] - if got, want := len(sample.Label), len(wantLabels); got != want { - t.Errorf("got %v label keys for sample %v, want %v", got, i, want) - continue - } - for wantKey, wantValues := range wantLabels { - if gotValues, ok := sample.Label[wantKey]; ok { - if !reflect.DeepEqual(gotValues, wantValues) { - t.Errorf("for key %s, got values %v, want values %v", wantKey, gotValues, wantValues) - } - } else { - t.Errorf("for key %s got no values, want %v", wantKey, wantValues) - } - } - } - }) - } -} - -func TestSetLabel(t *testing.T) { - var testcases = []struct { - desc string - samples []*Sample - setKey string - setVal []string - wantLabels []map[string][]string - }{ - { - desc: "some samples have label already", - samples: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value1", "value2", "value3"}, - "key2": {"value1"}, - }, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value2"}, - }, - }, - }, - setKey: "key1", - setVal: []string{"value1"}, - wantLabels: []map[string][]string{ - {"key1": {"value1"}}, - {"key1": {"value1"}, "key2": {"value1"}}, - {"key1": {"value1"}}, - }, - }, - { - desc: "no samples have labels", - samples: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - }, - }, - setKey: "key1", - setVal: []string{"value1"}, - wantLabels: []map[string][]string{ - {"key1": {"value1"}}, - }, - }, - { - desc: "all samples have some labels, but not key being added", - samples: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key2": {"value2"}, - }, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key3": {"value3"}, - }, - }, - }, - setKey: "key1", - setVal: []string{"value1"}, - wantLabels: []map[string][]string{ - {"key1": {"value1"}, "key2": {"value2"}}, - {"key1": {"value1"}, "key3": {"value3"}}, - }, - }, - { - desc: "all samples have key being added", - samples: []*Sample{ - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value1"}, - }, - }, - { - Location: []*Location{cpuL[0]}, - Value: []int64{1000}, - Label: map[string][]string{ - "key1": {"value1"}, - }, - }, - }, - setKey: "key1", - setVal: []string{"value1"}, - wantLabels: []map[string][]string{ - {"key1": {"value1"}}, - {"key1": {"value1"}}, - }, - }, - } - - for _, tc := range testcases { - t.Run(tc.desc, func(t *testing.T) { - profile := testProfile1.Copy() - profile.Sample = tc.samples - profile.SetLabel(tc.setKey, tc.setVal) - if got, want := len(profile.Sample), len(tc.wantLabels); got != want { - t.Fatalf("got %v samples, want %v samples", got, want) - } - for i, sample := range profile.Sample { - wantLabels := tc.wantLabels[i] - if got, want := len(sample.Label), len(wantLabels); got != want { - t.Errorf("got %v label keys for sample %v, want %v", got, i, want) - continue - } - for wantKey, wantValues := range wantLabels { - if gotValues, ok := sample.Label[wantKey]; ok { - if !reflect.DeepEqual(gotValues, wantValues) { - t.Errorf("for key %s, got values %v, want values %v", wantKey, gotValues, wantValues) - } - } else { - t.Errorf("for key %s got no values, want %v", wantKey, wantValues) - } - } - } - }) - } -} - -func TestNumLabelUnits(t *testing.T) { - var tagFilterTests = []struct { - desc string - tagVals []map[string][]int64 - tagUnits []map[string][]string - wantUnits map[string]string - wantIgnoredUnits map[string][]string - }{ - { - "One sample, multiple keys, different specified units", - []map[string][]int64{{"key1": {131072}, "key2": {128}}}, - []map[string][]string{{"key1": {"bytes"}, "key2": {"kilobytes"}}}, - map[string]string{"key1": "bytes", "key2": "kilobytes"}, - map[string][]string{}, - }, - { - "One sample, one key with one value, unit specified", - []map[string][]int64{{"key1": {8}}}, - []map[string][]string{{"key1": {"bytes"}}}, - map[string]string{"key1": "bytes"}, - map[string][]string{}, - }, - { - "One sample, one key with one value, empty unit specified", - []map[string][]int64{{"key1": {8}}}, - []map[string][]string{{"key1": {""}}}, - map[string]string{"key1": "key1"}, - map[string][]string{}, - }, - { - "Key bytes, unit not specified", - []map[string][]int64{{"bytes": {8}}}, - []map[string][]string{nil}, - map[string]string{"bytes": "bytes"}, - map[string][]string{}, - }, - { - "One sample, one key with one value, unit not specified", - []map[string][]int64{{"kilobytes": {8}}}, - []map[string][]string{nil}, - map[string]string{"kilobytes": "kilobytes"}, - map[string][]string{}, - }, - { - "Key request, unit not specified", - []map[string][]int64{{"request": {8}}}, - []map[string][]string{nil}, - map[string]string{"request": "bytes"}, - map[string][]string{}, - }, - { - "Key alignment, unit not specified", - []map[string][]int64{{"alignment": {8}}}, - []map[string][]string{nil}, - map[string]string{"alignment": "bytes"}, - map[string][]string{}, - }, - { - "One sample, one key with multiple values and two different units", - []map[string][]int64{{"key1": {8, 8}}}, - []map[string][]string{{"key1": {"bytes", "kilobytes"}}}, - map[string]string{"key1": "bytes"}, - map[string][]string{"key1": {"kilobytes"}}, - }, - { - "One sample, one key with multiple values and three different units", - []map[string][]int64{{"key1": {8, 8}}}, - []map[string][]string{{"key1": {"bytes", "megabytes", "kilobytes"}}}, - map[string]string{"key1": "bytes"}, - map[string][]string{"key1": {"kilobytes", "megabytes"}}, - }, - { - "Two samples, one key, different units specified", - []map[string][]int64{{"key1": {8}}, {"key1": {8}}}, - []map[string][]string{{"key1": {"bytes"}}, {"key1": {"kilobytes"}}}, - map[string]string{"key1": "bytes"}, - map[string][]string{"key1": {"kilobytes"}}, - }, - { - "Keys alignment, request, and bytes have units specified", - []map[string][]int64{{ - "alignment": {8}, - "request": {8}, - "bytes": {8}, - }}, - []map[string][]string{{ - "alignment": {"seconds"}, - "request": {"minutes"}, - "bytes": {"hours"}, - }}, - map[string]string{ - "alignment": "seconds", - "request": "minutes", - "bytes": "hours", - }, - map[string][]string{}, - }, - } - for _, test := range tagFilterTests { - p := &Profile{Sample: make([]*Sample, len(test.tagVals))} - for i, numLabel := range test.tagVals { - s := Sample{ - NumLabel: numLabel, - NumUnit: test.tagUnits[i], - } - p.Sample[i] = &s - } - units, ignoredUnits := p.NumLabelUnits() - if !reflect.DeepEqual(test.wantUnits, units) { - t.Errorf("%s: got %v units, want %v", test.desc, units, test.wantUnits) - } - if !reflect.DeepEqual(test.wantIgnoredUnits, ignoredUnits) { - t.Errorf("%s: got %v ignored units, want %v", test.desc, ignoredUnits, test.wantIgnoredUnits) - } - } -} - -func TestSetMain(t *testing.T) { - testProfile1.massageMappings() - if testProfile1.Mapping[0].File != mainBinary { - t.Errorf("got %s for main", testProfile1.Mapping[0].File) - } -} - -// parallel runs n copies of fn in parallel. -func parallel(n int, fn func()) { - var wg sync.WaitGroup - wg.Add(n) - for i := 0; i < n; i++ { - go func() { - fn() - wg.Done() - }() - } - wg.Wait() -} - -func TestThreadSafety(t *testing.T) { - src := testProfile1.Copy() - parallel(4, func() { src.Copy() }) - parallel(4, func() { - var b bytes.Buffer - src.WriteUncompressed(&b) - }) - parallel(4, func() { - var b bytes.Buffer - src.Write(&b) - }) -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/proto_test.go b/src/cmd/vendor/github.com/google/pprof/profile/proto_test.go deleted file mode 100644 index 38b58c586d..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/proto_test.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "bytes" - "testing" - - "github.com/google/pprof/internal/proftest" -) - -var testM = []*Mapping{ - { - ID: 1, - Start: 1, - Limit: 10, - Offset: 0, - File: "file1", - BuildID: "buildid1", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, - { - ID: 2, - Start: 10, - Limit: 30, - Offset: 9, - File: "file1", - BuildID: "buildid2", - HasFunctions: true, - HasFilenames: true, - HasLineNumbers: true, - HasInlineFrames: true, - }, -} - -var testF = []*Function{ - {ID: 1, Name: "func1", SystemName: "func1", Filename: "file1"}, - {ID: 2, Name: "func2", SystemName: "func2", Filename: "file1"}, - {ID: 3, Name: "func3", SystemName: "func3", Filename: "file2"}, - {ID: 4, Name: "func4", SystemName: "func4", Filename: "file3"}, - {ID: 5, Name: "func5", SystemName: "func5", Filename: "file4"}, -} - -var testL = []*Location{ - { - ID: 1, - Address: 1, - Mapping: testM[0], - Line: []Line{ - { - Function: testF[0], - Line: 2, - }, - { - Function: testF[1], - Line: 2222222, - }, - }, - }, - { - ID: 2, - Mapping: testM[1], - Address: 11, - Line: []Line{ - { - Function: testF[2], - Line: 2, - }, - }, - }, - { - ID: 3, - Mapping: testM[1], - Address: 12, - }, - { - ID: 4, - Mapping: testM[1], - Address: 12, - Line: []Line{ - { - Function: testF[4], - Line: 6, - }, - { - Function: testF[4], - Line: 6, - }, - }, - IsFolded: true, - }, -} - -var all = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 10, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "cpu", Unit: "cycles"}, - {Type: "object", Unit: "count"}, - }, - Sample: []*Sample{ - { - Location: []*Location{testL[0], testL[1], testL[2], testL[1], testL[1]}, - Label: map[string][]string{ - "key1": {"value1"}, - "key2": {"value2"}, - }, - Value: []int64{10, 20}, - }, - { - Location: []*Location{testL[1], testL[2], testL[0], testL[1]}, - Value: []int64{30, 40}, - Label: map[string][]string{ - "key1": {"value1"}, - "key2": {"value2"}, - }, - NumLabel: map[string][]int64{ - "key1": {1, 2}, - "key2": {3, 4}, - "bytes": {3, 4}, - "requests": {1, 1, 3, 4, 5}, - "alignment": {3, 4}, - }, - NumUnit: map[string][]string{ - "requests": {"", "", "seconds", "", "s"}, - "alignment": {"kilobytes", "kilobytes"}, - }, - }, - }, - Function: testF, - Mapping: testM, - Location: testL, - Comments: []string{"Comment 1", "Comment 2"}, -} - -func TestMarshalUnmarshal(t *testing.T) { - // Write the profile, parse it, and ensure they're equal. - var buf bytes.Buffer - all.Write(&buf) - all2, err := Parse(&buf) - if err != nil { - t.Fatal(err) - } - - js1 := proftest.EncodeJSON(&all) - js2 := proftest.EncodeJSON(&all2) - if string(js1) != string(js2) { - t.Errorf("profiles differ") - d, err := proftest.Diff(js1, js2) - if err != nil { - t.Fatal(err) - } - t.Error("\n" + string(d)) - } -} diff --git a/src/cmd/vendor/github.com/google/pprof/profile/prune_test.go b/src/cmd/vendor/github.com/google/pprof/profile/prune_test.go deleted file mode 100644 index 75d7c6d4f7..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/prune_test.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright 2014 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package profile - -import ( - "strings" - "testing" -) - -func TestPrune(t *testing.T) { - for _, test := range []struct { - in *Profile - want string - }{ - {in1, out1}, - {in2, out2}, - } { - in := test.in.Copy() - in.RemoveUninteresting() - if err := in.CheckValid(); err != nil { - t.Error(err) - } - w := strings.Split(test.want, "\n") - for i, g := range strings.Split(in.String(), "\n") { - if i >= len(w) { - t.Fatalf("got trailing %s", g) - } - if strings.TrimSpace(g) != strings.TrimSpace(w[i]) { - t.Fatalf(`%d: got: "%s" want:"%s"`, i, g, w[i]) - } - } - } -} - -var funs = []*Function{ - {ID: 1, Name: "main", SystemName: "main", Filename: "main.c"}, - {ID: 2, Name: "fun1", SystemName: "fun1", Filename: "fun.c"}, - {ID: 3, Name: "fun2", SystemName: "fun2", Filename: "fun.c"}, - {ID: 4, Name: "fun3", SystemName: "fun3", Filename: "fun.c"}, - {ID: 5, Name: "fun4", SystemName: "fun4", Filename: "fun.c"}, - {ID: 6, Name: "fun5", SystemName: "fun5", Filename: "fun.c"}, - {ID: 7, Name: "unsimplified_fun(int)", SystemName: "unsimplified_fun(int)", Filename: "fun.c"}, - {ID: 8, Name: "Foo::(anonymous namespace)::Test::Bar", SystemName: "Foo::(anonymous namespace)::Test::Bar", Filename: "fun.c"}, - {ID: 9, Name: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", SystemName: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", Filename: "fun.c"}, - {ID: 10, Name: "Foo::operator()(::Bar)", SystemName: "Foo::operator()(::Bar)", Filename: "fun.c"}, -} - -var locs1 = []*Location{ - { - ID: 1, - Line: []Line{ - {Function: funs[0], Line: 1}, - }, - }, - { - ID: 2, - Line: []Line{ - {Function: funs[1], Line: 2}, - {Function: funs[2], Line: 1}, - }, - }, - { - ID: 3, - Line: []Line{ - {Function: funs[3], Line: 2}, - {Function: funs[1], Line: 1}, - }, - }, - { - ID: 4, - Line: []Line{ - {Function: funs[3], Line: 2}, - {Function: funs[1], Line: 2}, - {Function: funs[5], Line: 2}, - }, - }, -} - -var in1 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*Sample{ - { - Location: []*Location{locs1[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*Location{locs1[1], locs1[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*Location{locs1[2], locs1[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*Location{locs1[3], locs1[0]}, - Value: []int64{1, 1}, - }, - { - Location: []*Location{locs1[3], locs1[2], locs1[1], locs1[0]}, - Value: []int64{1, 1}, - }, - }, - Location: locs1, - Function: funs, - DropFrames: "fu.*[12]|banana", - KeepFrames: ".*[n2][n2]", -} - -const out1 = `PeriodType: cpu milliseconds -Period: 1 -Duration: 10s -Samples: -samples/count cpu/milliseconds - 1 1: 1 - 1 1: 2 1 - 1 1: 1 - 1 1: 4 1 - 1 1: 2 1 -Locations - 1: 0x0 main main.c:1 s=0 - 2: 0x0 fun2 fun.c:1 s=0 - 3: 0x0 fun3 fun.c:2 s=0 - fun1 fun.c:1 s=0 - 4: 0x0 fun5 fun.c:2 s=0 -Mappings -` - -var locs2 = []*Location{ - { - ID: 1, - Line: []Line{ - {Function: funs[0], Line: 1}, - }, - }, - { - ID: 2, - Line: []Line{ - {Function: funs[6], Line: 1}, - }, - }, - { - ID: 3, - Line: []Line{ - {Function: funs[7], Line: 1}, - }, - }, - { - ID: 4, - Line: []Line{ - {Function: funs[8], Line: 1}, - }, - }, - { - ID: 5, - Line: []Line{ - {Function: funs[9], Line: 1}, - }, - }, -} - -var in2 = &Profile{ - PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"}, - Period: 1, - DurationNanos: 10e9, - SampleType: []*ValueType{ - {Type: "samples", Unit: "count"}, - {Type: "cpu", Unit: "milliseconds"}, - }, - Sample: []*Sample{ - // Unsimplified name with parameters shouldn't match. - { - Location: []*Location{locs2[1], locs2[0]}, - Value: []int64{1, 1}, - }, - // .*Foo::.*::Bar.* should (and will be dropped) regardless of the anonymous namespace. - { - Location: []*Location{locs2[2], locs2[0]}, - Value: []int64{1, 1}, - }, - // .*Foo::.*::Bar.* shouldn't match inside the parameter list. - { - Location: []*Location{locs2[3], locs2[0]}, - Value: []int64{1, 1}, - }, - // .*operator\(\) should match, regardless of parameters. - { - Location: []*Location{locs2[4], locs2[0]}, - Value: []int64{1, 1}, - }, - }, - Location: locs2, - Function: funs, - DropFrames: `unsimplified_fun\(int\)|.*Foo::.*::Bar.*|.*operator\(\)`, -} - -const out2 = `PeriodType: cpu milliseconds -Period: 1 -Duration: 10s -Samples: -samples/count cpu/milliseconds - 1 1: 2 1 - 1 1: 1 - 1 1: 4 1 - 1 1: 1 -Locations - 1: 0x0 main main.c:1 s=0 - 2: 0x0 unsimplified_fun(int) fun.c:1 s=0 - 3: 0x0 Foo::(anonymous namespace)::Test::Bar fun.c:1 s=0 - 4: 0x0 Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar) fun.c:1 s=0 - 5: 0x0 Foo::operator()(::Bar) fun.c:1 s=0 -Mappings -` diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention b/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention deleted file mode 100644 index 66a64c950c..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention +++ /dev/null @@ -1,24 +0,0 @@ ---- contentionz 1 --- -cycles/second = 3201000000 -sampling period = 100 -ms since reset = 16502830 -discarded samples = 0 - 19490304 27 @ 0xbccc97 0xc61202 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 768 1 @ 0xbccc97 0xa42dc7 0xa456e4 0x7fcdc2ff214e - 5760 2 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x4e969d 0x4faa17 0x4fc5f6 0x4fd028 0x4fd230 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 569088 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87f08 0xb8814c 0x42ed5f 0x42edc1 0x42e15a 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e - 2432 1 @ 0xbccc97 0xb82b73 0xb82bcb 0xb87eab 0xb8814c 0x7aa74c 0x7ab844 0x7ab914 0x79e9e9 0x79e326 0x4d299e 0x4d4b7b 0x4b7be8 0x4b7ff1 0x4d2dae 0x79e80a - 2034816 3 @ 0xbccc97 0xb82f0f 0xb83003 0xb87d50 0xc635f0 0x42ecc3 0x42e14c 0x5261af 0x526edf 0x5280ab 0x79e80a 0x7a251b 0x7a296d 0xa456e4 0x7fcdc2ff214e ---- Memory map: --- - 00400000-00fcb000: cppbench_server_main - 7fcdc231e000-7fcdc2321000: /libnss_cache-2.15.so - 7fcdc2522000-7fcdc252e000: /libnss_files-2.15.so - 7fcdc272f000-7fcdc28dd000: /libc-2.15.so - 7fcdc2ae7000-7fcdc2be2000: /libm-2.15.so - 7fcdc2de3000-7fcdc2dea000: /librt-2.15.so - 7fcdc2feb000-7fcdc3003000: /libpthread-2.15.so - 7fcdc3208000-7fcdc320a000: /libdl-2.15.so - 7fcdc340c000-7fcdc3415000: /libcrypt-2.15.so - 7fcdc3645000-7fcdc3669000: /ld-2.15.so - 7fff86bff000-7fff86c00000: [vdso] - ffffffffff600000-ffffffffff601000: [vsyscall] diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention.string deleted file mode 100644 index 441f1cec7b..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.contention.string +++ /dev/null @@ -1,65 +0,0 @@ -PeriodType: contentions count -Period: 100 -Duration: 4h35 -Samples: -contentions/count delay/nanoseconds - 2700 608881724: 1 2 3 4 5 6 7 8 9 10 11 12 13 - 100 23992: 1 14 12 13 - 200 179943: 1 15 16 17 18 19 20 21 22 23 9 10 11 12 13 - 100 17778444: 1 15 16 24 18 3 4 5 6 7 8 9 10 11 12 13 - 100 75976: 1 15 16 17 18 25 26 27 28 29 30 31 32 33 34 9 - 300 63568134: 1 35 36 37 38 39 40 6 7 8 9 10 11 12 13 -Locations - 1: 0xbccc96 M=1 - 2: 0xc61201 M=1 - 3: 0x42ed5e M=1 - 4: 0x42edc0 M=1 - 5: 0x42e159 M=1 - 6: 0x5261ae M=1 - 7: 0x526ede M=1 - 8: 0x5280aa M=1 - 9: 0x79e809 M=1 - 10: 0x7a251a M=1 - 11: 0x7a296c M=1 - 12: 0xa456e3 M=1 - 13: 0x7fcdc2ff214d M=7 - 14: 0xa42dc6 M=1 - 15: 0xb82b72 M=1 - 16: 0xb82bca M=1 - 17: 0xb87eaa M=1 - 18: 0xb8814b M=1 - 19: 0x4e969c M=1 - 20: 0x4faa16 M=1 - 21: 0x4fc5f5 M=1 - 22: 0x4fd027 M=1 - 23: 0x4fd22f M=1 - 24: 0xb87f07 M=1 - 25: 0x7aa74b M=1 - 26: 0x7ab843 M=1 - 27: 0x7ab913 M=1 - 28: 0x79e9e8 M=1 - 29: 0x79e325 M=1 - 30: 0x4d299d M=1 - 31: 0x4d4b7a M=1 - 32: 0x4b7be7 M=1 - 33: 0x4b7ff0 M=1 - 34: 0x4d2dad M=1 - 35: 0xb82f0e M=1 - 36: 0xb83002 M=1 - 37: 0xb87d4f M=1 - 38: 0xc635ef M=1 - 39: 0x42ecc2 M=1 - 40: 0x42e14b M=1 -Mappings -1: 0x400000/0xfcb000/0x0 cppbench_server_main -2: 0x7fcdc231e000/0x7fcdc2321000/0x0 /libnss_cache-2.15.so -3: 0x7fcdc2522000/0x7fcdc252e000/0x0 /libnss_files-2.15.so -4: 0x7fcdc272f000/0x7fcdc28dd000/0x0 /libc-2.15.so -5: 0x7fcdc2ae7000/0x7fcdc2be2000/0x0 /libm-2.15.so -6: 0x7fcdc2de3000/0x7fcdc2dea000/0x0 /librt-2.15.so -7: 0x7fcdc2feb000/0x7fcdc3003000/0x0 /libpthread-2.15.so -8: 0x7fcdc3208000/0x7fcdc320a000/0x0 /libdl-2.15.so -9: 0x7fcdc340c000/0x7fcdc3415000/0x0 /libcrypt-2.15.so -10: 0x7fcdc3645000/0x7fcdc3669000/0x0 /ld-2.15.so -11: 0x7fff86bff000/0x7fff86c00000/0x0 [vdso] -12: 0xffffffffff600000/0xffffffffff601000/0x0 [vsyscall] diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.cpu b/src/cmd/vendor/github.com/google/pprof/profile/testdata/cppbench.cpu deleted file mode 100644 index 607015ee93f1a7171f17e62cf98cfe4b62dccbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23631 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 iA#d$|I zU;kqQ<{xjvZ+`Sg{N`_bk6)fw6%uZ^!Y`x(zx^H0@SC4VApDDd;n%PA62JUM0^v`{ zeBNgK{!>1WKYUI<$L~J3SNP>8eaA1aOdx#(yu+`bQ24JthF?FS^cP4V{=5mK&r<~A z?{X{t_*qFHeZ>=qA41_v$o_@p_}w@E1^)02A&@>+6NrC8;Xj)|{?FpYpS}s@k5B^T zTNr`zgPTD35X!&r36$Sjzww8En>zmZGb9lHbHCs>-|#bjd36Hi8=>$cRQ^X02%j(l z`R5>k^eIdr{_YdVe}wXvEdlp85GY>=<)0}8{Qr$W`cWg0KJE~Zzf2(hs|l2^gxpt7 zAbwVO;7^}~;zy5w{|M#Z9R%zrR6h~Q9~TIe&xGRdG=cQDjzIc2L?HaVzu^ymJp%fb z2-Kg1@^3nU^tF+I|1t=KPa=W(p_M@W)J?$rUIOVahCunF#Dl;7izE;}6A9R#`5J%x zMzQ0!|0MzU6Dt3w6L9})L;Ut<5@?_L5r`i`<;zt9`IAup>lA_T4d1vK>R)+&_15Yg+Kl8C1Czs0^vufd?M67Bb2@h2!tP@@=cdO|A$cid_!P- zMu0&0R1qlO(d&O$zJ$?)%3ng^KZ`*Bq>@1V6Dl8M3A7&{5~v>t^d zia!3ujwaua);@rZ@4~_t*Z7hk)Ewvcko+?pN_TyL@Do2n=>9(t`UDH4AJ3ur{X6Cbrf2Sl(EH>)!F+|u5OwI|$}VW-1}j)KB3yo; z)w_~t@=pk~dnVvWx4cku?2kg+n|NLetvbxzKd>9qLb7*$azT zSUg;ogOo?>pykocz1Yhmbbb4X)CWrs+|c-h)i3K$K=Kp!1qh9vpPLjQ@$5-rdC38_ z=OQ%SghJB`x#q#@h5r)aV3W5;L11HzseM25XAC!X7 zn?FL-8NY|n4|hVs{m~f+z5O_Z&OQgBVf6xfebJEjaE6sb^s0Z^p!UPu0gDG%`A;u*K%Kz=E5BfT05fMeyZ`_I diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.cpu.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.cpu.string deleted file mode 100644 index 7df1533ab8..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.cpu.string +++ /dev/null @@ -1,415 +0,0 @@ -PeriodType: cpu nanoseconds -Period: 10000000 -Samples: -samples/count cpu/nanoseconds - 1 10000000: 1 2 - 1 10000000: 3 2 - 1 10000000: 4 2 - 1 10000000: 5 2 - 1 10000000: 6 2 - 1 10000000: 7 2 - 1 10000000: 8 2 - 1 10000000: 9 2 - 1 10000000: 10 2 - 1 10000000: 11 2 - 1 10000000: 12 2 - 1 10000000: 13 2 - 1 10000000: 14 2 - 1 10000000: 15 2 - 1 10000000: 16 2 - 1 10000000: 17 2 - 1 10000000: 18 2 - 1 10000000: 16 2 - 1 10000000: 19 2 - 1 10000000: 20 2 - 1 10000000: 21 2 - 1 10000000: 22 2 - 1 10000000: 23 2 - 1 10000000: 24 2 - 1 10000000: 25 2 - 1 10000000: 15 2 - 1 10000000: 26 2 - 1 10000000: 9 2 - 1 10000000: 27 2 - 1 10000000: 28 2 - 1 10000000: 29 2 - 1 10000000: 30 2 - 1 10000000: 31 2 - 1 10000000: 32 2 - 1 10000000: 24 2 - 1 10000000: 30 2 - 1 10000000: 33 2 - 1 10000000: 34 2 - 1 10000000: 35 2 - 1 10000000: 36 2 - 1 10000000: 27 2 - 1 10000000: 37 2 - 1 10000000: 38 2 - 1 10000000: 19 2 - 1 10000000: 39 2 - 1 10000000: 40 2 - 1 10000000: 41 2 - 1 10000000: 16 2 - 1 10000000: 42 2 - 1 10000000: 43 2 - 1 10000000: 44 2 - 1 10000000: 45 2 - 1 10000000: 46 2 - 1 10000000: 47 2 - 1 10000000: 48 2 - 1 10000000: 40 2 - 1 10000000: 10 2 - 1 10000000: 49 2 - 1 10000000: 50 2 - 1 10000000: 51 2 - 1 10000000: 52 2 - 1 10000000: 53 2 - 1 10000000: 30 2 - 1 10000000: 54 2 - 1 10000000: 55 2 - 1 10000000: 36 2 - 1 10000000: 56 2 - 1 10000000: 57 2 - 1 10000000: 58 2 - 1 10000000: 59 2 - 1 10000000: 60 2 - 1 10000000: 61 2 - 1 10000000: 57 2 - 1 10000000: 62 2 - 1 10000000: 63 2 - 1 10000000: 30 2 - 1 10000000: 64 2 - 1 10000000: 16 2 - 1 10000000: 65 2 - 1 10000000: 26 2 - 1 10000000: 40 2 - 1 10000000: 66 2 - 1 10000000: 58 2 - 1 10000000: 67 2 - 1 10000000: 68 2 - 1 10000000: 69 2 - 1 10000000: 70 2 - 1 10000000: 71 2 - 1 10000000: 72 2 - 1 10000000: 51 2 - 1 10000000: 73 2 - 1 10000000: 74 2 - 1 10000000: 75 2 - 1 10000000: 76 2 - 1 10000000: 77 2 - 1 10000000: 78 2 - 1 10000000: 79 2 - 1 10000000: 80 2 - 1 10000000: 81 2 - 1 10000000: 82 2 - 1 10000000: 83 2 - 1 10000000: 84 2 - 1 10000000: 85 2 - 1 10000000: 86 2 - 1 10000000: 10 2 - 1 10000000: 87 2 - 1 10000000: 88 2 - 1 10000000: 89 2 - 1 10000000: 90 2 - 1 10000000: 63 2 - 1 10000000: 91 2 - 1 10000000: 5 2 - 1 10000000: 92 2 - 1 10000000: 93 2 - 1 10000000: 94 2 - 1 10000000: 19 2 - 1 10000000: 95 2 - 1 10000000: 30 2 - 1 10000000: 96 2 - 1 10000000: 10 2 - 1 10000000: 97 2 - 1 10000000: 98 2 - 1 10000000: 99 2 - 1 10000000: 62 2 - 1 10000000: 92 2 - 1 10000000: 100 2 - 1 10000000: 101 2 - 1 10000000: 39 2 - 1 10000000: 102 2 - 1 10000000: 86 2 - 1 10000000: 33 2 - 1 10000000: 103 2 - 1 10000000: 104 2 - 1 10000000: 13 2 - 2 20000000: 105 2 - 1 10000000: 106 2 - 1 10000000: 52 2 - 1 10000000: 24 2 - 1 10000000: 107 2 - 1 10000000: 108 2 - 1 10000000: 52 2 - 1 10000000: 109 2 - 1 10000000: 5 2 - 1 10000000: 82 2 - 1 10000000: 8 2 - 1 10000000: 110 2 - 1 10000000: 111 2 - 1 10000000: 112 2 - 1 10000000: 113 2 - 1 10000000: 114 2 - 1 10000000: 115 2 - 1 10000000: 116 2 - 1 10000000: 19 2 - 1 10000000: 64 2 - 1 10000000: 106 2 - 1 10000000: 117 2 - 1 10000000: 30 2 - 1 10000000: 118 2 - 1 10000000: 86 2 - 1 10000000: 119 2 - 1 10000000: 120 2 - 1 10000000: 121 2 - 1 10000000: 81 2 - 2 20000000: 10 2 - 1 10000000: 19 2 - 1 10000000: 122 2 - 1 10000000: 123 2 - 1 10000000: 105 2 - 1 10000000: 124 2 - 1 10000000: 125 2 - 1 10000000: 46 2 - 1 10000000: 8 2 - 10 100000000: 21 2 - 7 70000000: 126 2 - 3 30000000: 9 2 - 1 10000000: 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 - 1 10000000: 144 2 - 5 50000000: 145 2 - 25 250000000: 146 2 - 1 10000000: 147 2 - 1 10000000: 148 149 150 134 135 136 137 138 139 140 141 142 143 - 1 10000000: 151 152 153 154 155 135 136 137 138 139 140 141 142 143 - 1 10000000: 156 157 153 154 155 135 136 137 138 139 140 141 142 143 - 1 10000000: 158 159 132 133 134 135 136 137 138 139 140 141 142 143 - 4 40000000: 27 2 - 4 40000000: 160 2 - 1 10000000: 116 2 - 5 50000000: 161 2 - 20 200000000: 162 163 164 135 136 137 138 139 140 141 142 143 - 1 10000000: 165 166 167 164 135 136 137 138 139 140 141 142 143 - 1 10000000: 168 169 167 164 135 136 137 138 139 140 141 142 143 - 2 20000000: 170 171 172 142 143 - 2 20000000: 173 171 172 142 143 - 1 10000000: 105 174 175 154 155 176 177 140 141 142 143 - 1 10000000: 178 179 176 177 140 141 142 143 - 1 10000000: 180 181 182 181 183 184 185 186 187 188 189 190 191 192 193 194 143 - 7 70000000: 195 2 - 2 20000000: 196 2 - 8 80000000: 16 2 - 1 10000000: 197 2 - 1 10000000: 146 198 199 135 136 137 138 139 140 141 142 143 - 1 10000000: 200 199 135 136 137 138 139 140 141 142 143 - 3 30000000: 162 179 135 136 137 138 139 140 141 142 143 - 1 10000000: 201 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 - 1 10000000: 202 167 152 153 154 155 135 136 137 138 139 140 141 142 143 - 6 60000000: 162 163 152 153 154 155 135 136 137 138 139 140 141 142 143 -Locations - 1: 0x410bc0 M=1 - 2: 0x41a770 M=1 - 3: 0x410b4b M=1 - 4: 0x40f534 M=1 - 5: 0x40f018 M=1 - 6: 0x421f4f M=1 - 7: 0x40e46f M=1 - 8: 0x40f0e3 M=1 - 9: 0x4286c7 M=1 - 10: 0x40f15b M=1 - 11: 0x40efb1 M=1 - 12: 0x41250d M=1 - 13: 0x427854 M=1 - 14: 0x40e688 M=1 - 15: 0x410b61 M=1 - 16: 0x40fa72 M=1 - 17: 0x40e92a M=1 - 18: 0x421ff1 M=1 - 19: 0x42830d M=1 - 20: 0x41cf23 M=1 - 21: 0x40e7cb M=1 - 22: 0x40ea46 M=1 - 23: 0x40f792 M=1 - 24: 0x40f023 M=1 - 25: 0x40ee50 M=1 - 26: 0x40c6ab M=1 - 27: 0x40fa51 M=1 - 28: 0x40f14b M=1 - 29: 0x421fca M=1 - 30: 0x4285d3 M=1 - 31: 0x410ba9 M=1 - 32: 0x40e75f M=1 - 33: 0x4277a1 M=1 - 34: 0x40e89f M=1 - 35: 0x40ea54 M=1 - 36: 0x40f0ab M=1 - 37: 0x40ef9b M=1 - 38: 0x410d6a M=1 - 39: 0x40e455 M=1 - 40: 0x427856 M=1 - 41: 0x40e80b M=1 - 42: 0x40f5ef M=1 - 43: 0x40fb2a M=1 - 44: 0x422786 M=1 - 45: 0x40f031 M=1 - 46: 0x40f49d M=1 - 47: 0x40f331 M=1 - 48: 0x40e927 M=1 - 49: 0x40f558 M=1 - 50: 0x410b56 M=1 - 51: 0x40eac1 M=1 - 52: 0x40e813 M=1 - 53: 0x40e7df M=1 - 54: 0x40f53d M=1 - 55: 0x40f180 M=1 - 56: 0x410b94 M=1 - 57: 0x40fbf6 M=1 - 58: 0x40f026 M=1 - 59: 0x40f0dc M=1 - 60: 0x40e9d3 M=1 - 61: 0x40fa7b M=1 - 62: 0x40e877 M=1 - 63: 0x4048a8 M=1 - 64: 0x40f02e M=1 - 65: 0x4048b8 M=1 - 66: 0x4277d0 M=1 - 67: 0x40f5cb M=1 - 68: 0x40fbae M=1 - 69: 0x40e8c2 M=1 - 70: 0x40f64b M=1 - 71: 0x40e82e M=1 - 72: 0x421f22 M=1 - 73: 0x40fa67 M=1 - 74: 0x40fbb1 M=1 - 75: 0x40f568 M=1 - 76: 0x40e461 M=1 - 77: 0x40ef85 M=1 - 78: 0x40f58b M=1 - 79: 0x40f08d M=1 - 80: 0x40e75c M=1 - 81: 0x410c22 M=1 - 82: 0x40fa59 M=1 - 83: 0x40f091 M=1 - 84: 0x40eb69 M=1 - 85: 0x41075a M=1 - 86: 0x40e7e9 M=1 - 87: 0x40fa97 M=1 - 88: 0x4131eb M=1 - 89: 0x40f769 M=1 - 90: 0x40f54e M=1 - 91: 0x4277d5 M=1 - 92: 0x40f0ca M=1 - 93: 0x40f051 M=1 - 94: 0x40e94f M=1 - 95: 0x40fc11 M=1 - 96: 0x41815b M=1 - 97: 0x40f4b3 M=1 - 98: 0x421fe8 M=1 - 99: 0x40e79e M=1 - 100: 0x413f29 M=1 - 101: 0x427822 M=1 - 102: 0x40ef3d M=1 - 103: 0x40e440 M=1 - 104: 0x40e767 M=1 - 105: 0x42783b M=1 - 106: 0x40fa85 M=1 - 107: 0x40fb36 M=1 - 108: 0x410bae M=1 - 109: 0x40f0d7 M=1 - 110: 0x410ba4 M=1 - 111: 0x40e87b M=1 - 112: 0x40e7c0 M=1 - 113: 0x40eae0 M=1 - 114: 0x410a99 M=1 - 115: 0x40e7bd M=1 - 116: 0x40f09d M=1 - 117: 0x410b70 M=1 - 118: 0x40f32d M=1 - 119: 0x4283ec M=1 - 120: 0x40f010 M=1 - 121: 0x40e97a M=1 - 122: 0x40f19a M=1 - 123: 0x40e779 M=1 - 124: 0x40f61d M=1 - 125: 0x40f4e1 M=1 - 126: 0x40f58f M=1 - 127: 0x41ef43 M=1 - 128: 0x41ef96 M=1 - 129: 0x41f089 M=1 - 130: 0x41f360 M=1 - 131: 0x41fc8e M=1 - 132: 0x4204c7 M=1 - 133: 0x422b03 M=1 - 134: 0x420cee M=1 - 135: 0x422150 M=1 - 136: 0x4221d9 M=1 - 137: 0x41dc0c M=1 - 138: 0x41db47 M=1 - 139: 0x672125 M=1 - 140: 0x4ac6fd M=1 - 141: 0x4abf98 M=1 - 142: 0x491fbd M=1 - 143: 0x41931f M=1 - 144: 0x40e844 M=1 - 145: 0x421ff8 M=1 - 146: 0x4277e4 M=1 - 147: 0x40e990 M=1 - 148: 0x41c53f M=1 - 149: 0x422746 M=1 - 150: 0x422b42 M=1 - 151: 0x412b5f M=1 - 152: 0x40d47b M=1 - 153: 0x40cf5e M=1 - 154: 0x40cceb M=1 - 155: 0x420b5e M=1 - 156: 0x413ab9 M=1 - 157: 0x40d56e M=1 - 158: 0x41f5a6 M=1 - 159: 0x420149 M=1 - 160: 0x40f531 M=1 - 161: 0x410b8d M=1 - 162: 0x427ac9 M=1 - 163: 0x412b91 M=1 - 164: 0x420ee3 M=1 - 165: 0x4134a8 M=1 - 166: 0x412dc7 M=1 - 167: 0x412afa M=1 - 168: 0x413a9d M=1 - 169: 0x412bf6 M=1 - 170: 0x671ed3 M=1 - 171: 0x4ac6ad M=1 - 172: 0x4abdd8 M=1 - 173: 0x671ebe M=1 - 174: 0x40c8ae M=1 - 175: 0x40d00a M=1 - 176: 0x422081 M=1 - 177: 0x672148 M=1 - 178: 0x427ad1 M=1 - 179: 0x420e54 M=1 - 180: 0x5718ff M=1 - 181: 0x575ab6 M=1 - 182: 0x572114 M=1 - 183: 0x571257 M=1 - 184: 0x462494 M=1 - 185: 0x475ea6 M=1 - 186: 0x473682 M=1 - 187: 0x471fd7 M=1 - 188: 0x471ac0 M=1 - 189: 0x46f1b2 M=1 - 190: 0x46ef32 M=1 - 191: 0x4ab9e0 M=1 - 192: 0x4acce1 M=1 - 193: 0x4ac7b6 M=1 - 194: 0x4ace6a M=1 - 195: 0x410b8a M=1 - 196: 0x40f56e M=1 - 197: 0x428176 M=1 - 198: 0x4120f3 M=1 - 199: 0x420be8 M=1 - 200: 0x412100 M=1 - 201: 0x41ef39 M=1 - 202: 0x412e38 M=1 -Mappings -1: 0x0/0xffffffffffffffff/0x0 diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap b/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap deleted file mode 100644 index ed44903424..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap +++ /dev/null @@ -1,16 +0,0 @@ -heap profile: 13: 1595680 [47130736: 2584596557304] @ heap/1048576 -1: 524288 [3: 1572864] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x74920f 0x6295ac 0x629855 0x462769 0x419320 -1: 524288 [1: 524288] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x74920f 0x63963f 0x419320 -1: 262144 [1: 262144] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x451a39 0x451ba5 0x450683 0x450077 0x4525a4 0x58e034 0x419320 -1: 262144 [1: 262144] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x451a39 0x451ba5 0x450683 0x450077 0x4524d4 0x401090 0x4011a1 0x416dff 0x419320 -1: 10240 [642: 6574080] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x477637 0x47718b 0x477056 0x4799b2 0x46bfd7 0x419320 -1: 4096 [1: 4096] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x526126 0x5261ea 0x4683d4 0x467e09 0x419320 -1: 4096 [1: 4096] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41db48 0x53fbf3 0x53f85f 0x545f52 0x545a70 0x419320 -1: 2048 [1: 2048] @ 0x420cef 0x420fa9 0x414b22 0x414d20 0x4901be 0x419320 -1: 1280 [1: 1280] @ 0x420cef 0x422082 0x48dbe3 0x48d15c 0x48cdd0 0x4a9dc0 0x545bfe 0x543ac7 0x419320 -1: 384 [1: 384] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41dd68 0x41dcbd 0x429150 0x429add 0x42e013 0x4307e2 0x4366ff 0x42c1c2 0x653e4d 0x64bdc5 0x64c359 0x65a73d 0x64cdb1 0x64be73 0x64c359 0x64c59a 0x64c205 0x64c359 0x64b778 0x5cd55c 0x45dbc3 0x543e70 0x559166 0x55ba54 0x559691 0x559985 0x5a19ff 0x543e70 -1: 288 [1: 288] @ 0x420cef 0x420fa9 0x419e19 0x41a1a8 0x419f63 0x48f09f 0x48d991 0x48cdd0 0x4a9dc0 0x545bfe 0x543ac7 0x419320 -1: 288 [2: 296] @ -1: 96 [1: 96] @ 0x420cef 0x424f35 0x4255d1 0x6fc293 0x6f9c88 0x6f9944 0x6f96be 0x6f966b 0x59f39a 0x468318 0x467e09 0x419320 -0: 0 [1: 1024] @ 0x420cef 0x422151 0x4221da 0x41dc0d 0x41dd68 0x41dcbd 0x6d71a3 0x6da87d 0x7b2c3b 0x419320 -0: 0 [1: 16] @ 0x420cef 0x422048 0x40b517 0x40b746 0x6d9ca2 0x4761c5 0x475ea7 0x46fc4f 0x46f180 0x46ef33 0x4ab821 0x4acc32 0x4ac7b7 0x4ace36 0x419320 diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap.string deleted file mode 100644 index 01306ce68f..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/gobench.heap.string +++ /dev/null @@ -1,137 +0,0 @@ -PeriodType: space bytes -Period: 524288 -Samples: -alloc_objects/count alloc_space/bytes inuse_objects/count inuse_space/bytes - 4 2488234 1 829411: 1 2 3 4 5 6 7 8 9 10 - bytes:[524288] - 1 829411 1 829411: 1 2 3 4 5 6 11 10 - bytes:[524288] - 2 666237 2 666237: 1 2 3 4 5 12 13 14 15 16 17 10 - bytes:[262144] - 2 666237 2 666237: 1 2 3 4 5 12 13 14 15 18 19 20 21 10 - bytes:[262144] - 33192 339890635 51 529424: 1 2 3 4 5 22 23 24 25 26 10 - bytes:[10240] - 128 526338 128 526338: 1 2 3 4 5 27 28 29 30 10 - bytes:[4096] - 128 526338 128 526338: 1 2 3 4 5 31 32 33 34 10 - bytes:[4096] - 256 525312 256 525312: 1 35 36 37 38 10 - bytes:[2048] - 410 524928 410 524928: 1 39 40 41 42 43 44 45 10 - bytes:[1280] - 1365 524480 1365 524480: 1 2 3 4 46 47 48 49 50 51 52 53 54 55 56 57 58 59 56 60 61 56 62 63 64 65 66 67 68 69 70 65 - bytes:[384] - 1820 524432 1820 524432: 1 35 71 72 73 74 75 42 43 44 45 10 - bytes:[288] - 7085 1048724 1820 524432: - bytes:[288] - 5461 524336 5461 524336: 1 76 77 78 79 80 81 82 83 84 30 10 - bytes:[96] - 512 524800 0 0: 1 2 3 4 46 47 85 86 87 10 - bytes:[1024] - 32768 524296 0 0: 1 88 89 90 91 92 93 94 95 96 97 98 99 100 10 - bytes:[16] -Locations - 1: 0x420cee M=1 - 2: 0x422150 M=1 - 3: 0x4221d9 M=1 - 4: 0x41dc0c M=1 - 5: 0x41db47 M=1 - 6: 0x74920e M=1 - 7: 0x6295ab M=1 - 8: 0x629854 M=1 - 9: 0x462768 M=1 - 10: 0x41931f M=1 - 11: 0x63963e M=1 - 12: 0x451a38 M=1 - 13: 0x451ba4 M=1 - 14: 0x450682 M=1 - 15: 0x450076 M=1 - 16: 0x4525a3 M=1 - 17: 0x58e033 M=1 - 18: 0x4524d3 M=1 - 19: 0x40108f M=1 - 20: 0x4011a0 M=1 - 21: 0x416dfe M=1 - 22: 0x477636 M=1 - 23: 0x47718a M=1 - 24: 0x477055 M=1 - 25: 0x4799b1 M=1 - 26: 0x46bfd6 M=1 - 27: 0x526125 M=1 - 28: 0x5261e9 M=1 - 29: 0x4683d3 M=1 - 30: 0x467e08 M=1 - 31: 0x53fbf2 M=1 - 32: 0x53f85e M=1 - 33: 0x545f51 M=1 - 34: 0x545a6f M=1 - 35: 0x420fa8 M=1 - 36: 0x414b21 M=1 - 37: 0x414d1f M=1 - 38: 0x4901bd M=1 - 39: 0x422081 M=1 - 40: 0x48dbe2 M=1 - 41: 0x48d15b M=1 - 42: 0x48cdcf M=1 - 43: 0x4a9dbf M=1 - 44: 0x545bfd M=1 - 45: 0x543ac6 M=1 - 46: 0x41dd67 M=1 - 47: 0x41dcbc M=1 - 48: 0x42914f M=1 - 49: 0x429adc M=1 - 50: 0x42e012 M=1 - 51: 0x4307e1 M=1 - 52: 0x4366fe M=1 - 53: 0x42c1c1 M=1 - 54: 0x653e4c M=1 - 55: 0x64bdc4 M=1 - 56: 0x64c358 M=1 - 57: 0x65a73c M=1 - 58: 0x64cdb0 M=1 - 59: 0x64be72 M=1 - 60: 0x64c599 M=1 - 61: 0x64c204 M=1 - 62: 0x64b777 M=1 - 63: 0x5cd55b M=1 - 64: 0x45dbc2 M=1 - 65: 0x543e6f M=1 - 66: 0x559165 M=1 - 67: 0x55ba53 M=1 - 68: 0x559690 M=1 - 69: 0x559984 M=1 - 70: 0x5a19fe M=1 - 71: 0x419e18 M=1 - 72: 0x41a1a7 M=1 - 73: 0x419f62 M=1 - 74: 0x48f09e M=1 - 75: 0x48d990 M=1 - 76: 0x424f34 M=1 - 77: 0x4255d0 M=1 - 78: 0x6fc292 M=1 - 79: 0x6f9c87 M=1 - 80: 0x6f9943 M=1 - 81: 0x6f96bd M=1 - 82: 0x6f966a M=1 - 83: 0x59f399 M=1 - 84: 0x468317 M=1 - 85: 0x6d71a2 M=1 - 86: 0x6da87c M=1 - 87: 0x7b2c3a M=1 - 88: 0x422047 M=1 - 89: 0x40b516 M=1 - 90: 0x40b745 M=1 - 91: 0x6d9ca1 M=1 - 92: 0x4761c4 M=1 - 93: 0x475ea6 M=1 - 94: 0x46fc4e M=1 - 95: 0x46f17f M=1 - 96: 0x46ef32 M=1 - 97: 0x4ab820 M=1 - 98: 0x4acc31 M=1 - 99: 0x4ac7b6 M=1 - 100: 0x4ace35 M=1 -Mappings -1: 0x0/0xffffffffffffffff/0x0 diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention deleted file mode 100644 index fb484b70a4..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention +++ /dev/null @@ -1,43 +0,0 @@ ---- contentionz 1 --- -format = java -resolution = microseconds -sampling period = 100 -ms since reset = 6019923 - 1 1 @ 0x00000003 0x00000004 - 14 1 @ 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b 0x0000001c 0x00000014 0x00000029 0x0000002a 0x0000002b 0x0000002c 0x0000002d 0x0000002e 0x0000002f 0x00000030 0x00000031 0x00000032 0x00000033 0x00000034 0x00000035 - 2 2 @ 0x00000003 0x00000004 - 2 3 @ 0x00000036 0x00000037 0x00000038 - - - 0x0000003 com.example.function03 (source.java:03) - 0x0000004 com.example.function04 (source.java:04) - 0x000000d com.example.function0d (source.java:0) - 0x000000e com.example.function0e (source.java:0) - 0x000000f com.example.function0f (source.java:0) - 0x0000010 com.example.function10 (source.java:10) - 0x0000011 com.example.function11 (source.java:11) - 0x0000012 com.example.function12 (source.java:12) - 0x0000013 com.example.function13 (source.java:13) - 0x0000014 com.example.function14 (source.java:14) - 0x0000017 com.example.function17 (source.java:17) - 0x0000018 com.example.function18 (source.java:18) - 0x0000019 com.example.function19 (source.java:19) - 0x000001a com.example.function1a (source.java:1) - 0x000001b com.example.function1b (source.java:1) - 0x000001c com.example.function1c (source.java:1) - 0x0000029 com.example.function29 (source.java:29) - 0x000002a com.example.function2a (source.java:2) - 0x000002b com.example.function2b (source.java:2) - 0x000002c com.example.function2c (source.java:2) - 0x000002d com.example.function2d (source.java:2) - 0x000002e com.example.function2e (source.java:2) - 0x000002f com.example.function2f (source.java:2) - 0x0000030 com.example.function30 (source.java:30) - 0x0000031 com.example.function31 (source.java:31) - 0x0000032 com.example.function32 (source.java:32) - 0x0000033 com.example.function33 (source.java:33) - 0x0000034 com.example.function34 (source.java:34) - 0x0000035 com.example.function35 (source.java:35) - 0x0000036 com.example.function36 (source.java:36) - 0x0000037 com.example.function37 (source.java:37) - 0x0000038 com.example.function38 (source.java:38) diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention.string deleted file mode 100644 index 985ffe1cca..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.contention.string +++ /dev/null @@ -1,43 +0,0 @@ -PeriodType: contentions count -Period: 100 -Duration: 1h40 -Samples: -contentions/count delay/microseconds - 100 100: 1 2 - 100 1400: 3 4 5 6 7 8 9 10 11 12 13 14 15 16 10 17 18 19 20 21 22 23 24 25 26 27 28 29 - 200 200: 1 2 - 300 200: 30 31 32 -Locations - 1: 0x0 com.example.function03 source.java:3 s=0 - 2: 0x0 com.example.function04 source.java:4 s=0 - 3: 0x0 com.example.function0d source.java:0 s=0 - 4: 0x0 com.example.function0e source.java:0 s=0 - 5: 0x0 com.example.function0f source.java:0 s=0 - 6: 0x0 com.example.function10 source.java:10 s=0 - 7: 0x0 com.example.function11 source.java:11 s=0 - 8: 0x0 com.example.function12 source.java:12 s=0 - 9: 0x0 com.example.function13 source.java:13 s=0 - 10: 0x0 com.example.function14 source.java:14 s=0 - 11: 0x0 com.example.function17 source.java:17 s=0 - 12: 0x0 com.example.function18 source.java:18 s=0 - 13: 0x0 com.example.function19 source.java:19 s=0 - 14: 0x0 com.example.function1a source.java:1 s=0 - 15: 0x0 com.example.function1b source.java:1 s=0 - 16: 0x0 com.example.function1c source.java:1 s=0 - 17: 0x0 com.example.function29 source.java:29 s=0 - 18: 0x0 com.example.function2a source.java:2 s=0 - 19: 0x0 com.example.function2b source.java:2 s=0 - 20: 0x0 com.example.function2c source.java:2 s=0 - 21: 0x0 com.example.function2d source.java:2 s=0 - 22: 0x0 com.example.function2e source.java:2 s=0 - 23: 0x0 com.example.function2f source.java:2 s=0 - 24: 0x0 com.example.function30 source.java:30 s=0 - 25: 0x0 com.example.function31 source.java:31 s=0 - 26: 0x0 com.example.function32 source.java:32 s=0 - 27: 0x0 com.example.function33 source.java:33 s=0 - 28: 0x0 com.example.function34 source.java:34 s=0 - 29: 0x0 com.example.function35 source.java:35 s=0 - 30: 0x0 com.example.function36 source.java:36 s=0 - 31: 0x0 com.example.function37 source.java:37 s=0 - 32: 0x0 com.example.function38 source.java:38 s=0 -Mappings diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu deleted file mode 100644 index 593588b7d6060f3db3be4b2d2b66bfe111ff5a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3537 zcmZQzU|?WoU|?WmU|hosqaE3eNet1(`Xi zNMfc6VZI2inL=`Yu3l!rF_%cE&zKpOJUq)!fml0C&WrV%>GD0i9jF5^iBkaYO z5nAzu94*+3FC(<#3t0#D;>!rF_(Il!J*OC<=*1g#RM&< zm>}g86YM#~1TCkSAmtPj>^a2*EvJ|u}g86YM#~ X1TCkSAmtPj>^a2*EvJ}ha&Z9wIkoP8 diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu.string deleted file mode 100644 index f728cf26a8..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.cpu.string +++ /dev/null @@ -1,78 +0,0 @@ -PeriodType: cpu nanoseconds -Period: 10000000 -Samples: -samples/count cpu/nanoseconds - 0 0: 1 - 0 0: 2 - 2 20000000: 3 - 1 10000000: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 - 1 10000000: 19 20 21 22 23 16 17 18 - 1 10000000: 24 25 26 27 28 29 30 31 32 - 1 10000000: 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 29 30 31 32 - 1 10000000: 54 55 56 57 58 59 60 61 62 11 63 64 16 17 18 -Locations - 1: 0x0 GC :0 s=0 - 2: 0x0 Compile :0 s=0 - 3: 0x0 VM :0 s=0 - 4: 0x0 com.example.function06 source.java:6 s=0 - 5: 0x0 com.example.function07 source.java:7 s=0 - 6: 0x0 com.example.function08 source.java:8 s=0 - 7: 0x0 com.example.function09 source.java:9 s=0 - 8: 0x0 com.example.function0a source.java:0 s=0 - 9: 0x0 com.example.function0b source.java:0 s=0 - 10: 0x0 com.example.function0c source.java:0 s=0 - 11: 0x0 com.example.function0d source.java:0 s=0 - 12: 0x0 com.example.function0e source.java:0 s=0 - 13: 0x0 com.example.function0f source.java:0 s=0 - 14: 0x0 com.example.function10 source.java:10 s=0 - 15: 0x0 com.example.function11 source.java:11 s=0 - 16: 0x0 com.example.function12 source.java:12 s=0 - 17: 0x0 com.example.function13 source.java:13 s=0 - 18: 0x0 com.example.function14 source.java:14 s=0 - 19: 0x0 com.example.function1d source.java:1 s=0 - 20: 0x0 com.example.function1e source.java:1 s=0 - 21: 0x0 com.example.function1f source.java:1 s=0 - 22: 0x0 com.example.function20 source.java:20 s=0 - 23: 0x0 com.example.function21 source.java:21 s=0 - 24: 0x0 com.example.function22 source.java:22 s=0 - 25: 0x0 com.example.function23 source.java:23 s=0 - 26: 0x0 com.example.function24 source.java:24 s=0 - 27: 0x0 com.example.function25 source.java:25 s=0 - 28: 0x0 com.example.function26 source.java:26 s=0 - 29: 0x0 com.example.function27 source.java:27 s=0 - 30: 0x0 com.example.function28 source.java:28 s=0 - 31: 0x0 com.example.function29 source.java:29 s=0 - 32: 0x0 com.example.function2a source.java:2 s=0 - 33: 0x0 com.example.function2b source.java:2 s=0 - 34: 0x0 com.example.function2c source.java:2 s=0 - 35: 0x0 com.example.function2d source.java:2 s=0 - 36: 0x0 com.example.function2e source.java:2 s=0 - 37: 0x0 com.example.function2f source.java:2 s=0 - 38: 0x0 com.example.function30 source.java:30 s=0 - 39: 0x0 com.example.function31 source.java:31 s=0 - 40: 0x0 com.example.function32 source.java:32 s=0 - 41: 0x0 com.example.function33 source.java:33 s=0 - 42: 0x0 com.example.function34 source.java:34 s=0 - 43: 0x0 com.example.function35 source.java:35 s=0 - 44: 0x0 com.example.function36 source.java:36 s=0 - 45: 0x0 com.example.function37 source.java:37 s=0 - 46: 0x0 com.example.function38 source.java:38 s=0 - 47: 0x0 com.example.function39 source.java:39 s=0 - 48: 0x0 com.example.function3a source.java:3 s=0 - 49: 0x0 com.example.function3b source.java:3 s=0 - 50: 0x0 com.example.function3c source.java:3 s=0 - 51: 0x0 com.example.function3d source.java:3 s=0 - 52: 0x0 com.example.function3e source.java:3 s=0 - 53: 0x0 com.example.function3f source.java:3 s=0 - 54: 0x0 com.example.function40 source.java:40 s=0 - 55: 0x0 com.example.function41 source.java:41 s=0 - 56: 0x0 com.example.function42 source.java:42 s=0 - 57: 0x0 com.example.function43 source.java:43 s=0 - 58: 0x0 com.example.function44 source.java:44 s=0 - 59: 0x0 com.example.function45 source.java:45 s=0 - 60: 0x0 com.example.function46 source.java:46 s=0 - 61: 0x0 com.example.function47 source.java:47 s=0 - 62: 0x0 com.example.function48 source.java:48 s=0 - 63: 0x0 com.example.function49 source.java:49 s=0 - 64: 0x0 com.example.function4a source.java:4 s=0 -Mappings diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap deleted file mode 100644 index 95e4f6e880..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap +++ /dev/null @@ -1,133 +0,0 @@ ---- heapz 1 --- -format = java -resolution = bytes - 7048 1 @ 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000018 0x00000019 0x0000001a 0x0000001b 0x0000001c 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x00000022 0x00000023 0x00000024 0x00000025 0x00000026 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x0000002a 0x00000027 0x00000023 0x00000028 0x00000029 0x0000001d 0x0000001e 0x0000001f 0x00000020 - 4752 9 @ 0x0000002b 0x0000002c 0x0000002d 0x0000002e - 880 1 @ 0x00000035 0x00000036 0x00000037 0x00000038 0x00000039 0x0000003a 0x0000003b 0x00000011 0x0000003d 0x0000003e 0x0000003f 0x00000040 0x00000041 0x00000042 0x00000011 0x00000049 0x0000004a 0x0000004b 0x0000004c 0x0000004d 0x0000004e 0x0000004b 0x0000004f 0x0000004b 0x00000050 0x00000051 0x00000052 0x00000053 0x00000054 0x00000055 0x00000056 0x00000057 - 560 1 @ 0x00000035 0x00000036 0x00000037 0x00000038 0x00000039 0x0000003a 0x0000003b 0x00000011 0x0000003d 0x0000003e 0x0000003f 0x00000040 0x00000041 0x00000042 0x00000011 0x0000005e 0x0000005f 0x00000060 0x00000061 0x00000062 0x00000063 0x00000064 0x00000065 0x00000066 0x00000067 0x00000068 0x00000069 0x0000006a 0x0000006b 0x0000006c 0x0000006d 0x0000006e 0x0000006f 0x00000070 0x00000071 0x00000072 0x00000073 0x00000074 0x00000075 0x00000067 0x00000068 - 528 1 @ 0x00000076 0x00000077 0x00000078 0x00000079 0x0000007a 0x0000007b 0x00000011 0x00000081 0x00000011 0x00000082 0x0000004e 0x0000004b 0x0000004f 0x0000004b 0x00000050 0x00000051 0x00000052 0x00000053 0x00000054 0x00000055 0x00000056 0x00000057 - 440 1 @ 0x00000083 0x00000084 0x00000085 0x00000086 0x00000087 0x00000088 0x00000089 0x0000008a 0x0000008b 0x0000008c 0x0000008d 0x0000008e 0x0000008f 0x00000090 0x00000091 0x00000092 0x00000093 0x00000094 0x00000095 0x00000096 - 240 5 @ 0x00000097 - - - 0x00000003 com.example.function003 (Source003.java:103) - 0x00000004 com.example.function004 (Source004.java:104) - 0x00000005 com.example.function005 (Source005.java:105) - 0x00000006 com.example.function006 (Source006.java:106) - 0x00000007 com.example.function007 (Source007.java:107) - 0x00000008 com.example.function008 (Source008.java:108) - 0x00000009 com.example.function009 (Source009.java:109) - 0x0000000a com.example.function00a (Source00a.java:10) - 0x0000000b com.example.function00b (Source00b.java:10) - 0x0000000c com.example.function00c (Source00c.java:10) - 0x0000000d com.example.function00d (Source00d.java:10) - 0x0000000e com.example.function00e (Source00e.java:10) - 0x0000000f com.example.function00f (Source00f.java:10) - 0x00000010 com.example.function010 (Source010.java:110) - 0x00000011 com.example.function011 (Source011.java:111) - 0x00000018 com.example.function018 (Source018.java:118) - 0x00000019 com.example.function019 (Source019.java:119) - 0x0000001a com.example.function01a (Source01a.java:11) - 0x0000001b com.example.function01b (Source01b.java:11) - 0x0000001c com.example.function01c (Source01c.java:11) - 0x0000001d com.example.function01d (Source01d.java:11) - 0x0000001e com.example.function01e (Source01e.java:11) - 0x0000001f com.example.function01f (Source01f.java:11) - 0x00000020 com.example.function020 (Source020.java:120) - 0x00000021 com.example.function021 (Source021.java:121) - 0x00000022 com.example.function022 (Source022.java:122) - 0x00000023 com.example.function023 (Source023.java:123) - 0x00000024 com.example.function024 (Source024.java:124) - 0x00000025 com.example.function025 (Source025.java:125) - 0x00000026 com.example.function026 (Source026.java:126) - 0x00000027 com.example.function027 (Source027.java:127) - 0x00000028 com.example.function028 (Source028.java:128) - 0x00000029 com.example.function029 (Source029.java:129) - 0x0000002a com.example.function02a (Source02a.java:12) - 0x0000002b com.example.function02b (Source02b.java:12) - 0x0000002c com.example.function02c (Source02c.java:12) - 0x0000002d com.example.function02d (Source02d.java:12) - 0x0000002e com.example.function02e (Source02e.java:12) - 0x00000035 com.example.function035 (Source035.java:135) - 0x00000036 com.example.function036 (Source036.java:136) - 0x00000037 com.example.function037 (Source037.java:137) - 0x00000038 com.example.function038 (Source038.java:138) - 0x00000039 com.example.function039 (Source039.java:139) - 0x0000003a com.example.function03a (Source03a.java:13) - 0x0000003b com.example.function03b (Source03b.java:13) - 0x0000003d com.example.function03d (Source03d.java:13) - 0x0000003e com.example.function03e (Source03e.java:13) - 0x0000003f com.example.function03f (Source03f.java:13) - 0x00000040 com.example.function040 (Source040.java:140) - 0x00000041 com.example.function041 (Source041.java:141) - 0x00000042 com.example.function042 (Source042.java:142) - 0x00000049 com.example.function049 (Source049.java:149) - 0x0000004a com.example.function04a (Source04a.java:14) - 0x0000004b com.example.function04b (Source04b.java:14) - 0x0000004c com.example.function04c (Source04c.java:14) - 0x0000004d com.example.function04d (Source04d.java:14) - 0x0000004e com.example.function04e (Source04e.java:14) - 0x0000004f com.example.function04f (Source04f.java:14) - 0x00000050 com.example.function050 (Source050.java:150) - 0x00000051 com.example.function051 (Source051.java:151) - 0x00000052 com.example.function052 (Source052.java:152) - 0x00000053 com.example.function053 (Source053.java:153) - 0x00000054 com.example.function054 (Source054.java:154) - 0x00000055 com.example.function055 (Source055.java:155) - 0x00000056 com.example.function056 (Source056.java:156) - 0x00000057 com.example.function057 (Source057.java:157) - 0x0000005a com.example.function05a (Source05a.java:15) - 0x0000005e com.example.function05e (Source05e.java:15) - 0x0000005f com.example.function05f (Source05f.java:15) - 0x00000060 com.example.function060 (Source060.java:160) - 0x00000061 com.example.function061 (Source061.java:161) - 0x00000062 com.example.function062 (Source062.java:162) - 0x00000063 com.example.function063 (Source063.java:163) - 0x00000064 com.example.function064 (Source064.java:164) - 0x00000065 com.example.function065 (Source065.java:165) - 0x00000066 com.example.function066 (Source066.java:166) - 0x00000067 com.example.function067 (Source067.java:167) - 0x00000068 com.example.function068 (Source068.java:168) - 0x00000069 com.example.function069 (Source069.java:169) - 0x0000006a com.example.function06a (Source06a.java:16) - 0x0000006b com.example.function06b (Source06b.java:16) - 0x0000006c com.example.function06c (Source06c.java:16) - 0x0000006d com.example.function06d (Source06d.java:16) - 0x0000006e com.example.function06e (Source06e.java:16) - 0x0000006f com.example.function06f (Source06f.java:16) - 0x00000070 com.example.function070 (Source070.java:170) - 0x00000071 com.example.function071 (Source071.java:171) - 0x00000072 com.example.function072 (Source072.java:172) - 0x00000073 com.example.function073 (Source073.java:173) - 0x00000074 com.example.function074 (Source074.java:174) - 0x00000075 com.example.function075 (Source075.java:175) - 0x00000076 com.example.function076 (Source076.java:176) - 0x00000077 com.example.function077 (Source077.java:177) - 0x00000078 com.example.function078 (Source078.java:178) - 0x00000079 com.example.function079 (Source079.java:179) - 0x0000007a com.example.function07a (Source07a.java:17) - 0x0000007b com.example.function07b (Source07b.java:17) - 0x0000007d com.example.function07d (Source07d.java:17) - 0x00000081 com.example.function081 (Source081.java:181) - 0x00000082 com.example.function082 (Source082.java:182) - 0x00000083 com.example.function083 (Source083.java:183) - 0x00000084 com.example.function084 (Source084.java:184) - 0x00000085 com.example.function085 (Source085.java:185) - 0x00000086 com.example.function086 (Source086.java:186) - 0x00000087 com.example.function087 (Source087.java:187) - 0x00000088 com.example.function088 (Source088.java:188) - 0x00000089 com.example.function089 (Source089.java:189) - 0x0000008a com.example.function08a (Source08a.java:18) - 0x0000008b com.example.function08b (Source08b.java:18) - 0x0000008c com.example.function08c (Source08c.java:18) - 0x0000008d com.example.function08d (Source08d.java:18) - 0x0000008e com.example.function08e (Source08e.java:18) - 0x0000008f com.example.function08f (Source08f.java:18) - 0x00000090 com.example.function090 (Source090.java:190) - 0x00000091 com.example.function091 (Source091.java:191) - 0x00000092 com.example.function092 (Source092.java:192) - 0x00000093 com.example.function093 (Source093.java:193) - 0x00000094 com.example.function094 (Source094.java:194) - 0x00000095 com.example.function095 (Source095.java:195) - 0x00000096 com.example.function096 (Source096.java:196) - 0x00000097 com.example.function097 (Source097.java:197) diff --git a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap.string b/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap.string deleted file mode 100644 index 261bee13a6..0000000000 --- a/src/cmd/vendor/github.com/google/pprof/profile/testdata/java.heap.string +++ /dev/null @@ -1,139 +0,0 @@ -PeriodType: -Period: 0 -Samples: -inuse_objects/count inuse_space/bytes - 74 527819: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 27 32 33 21 22 23 24 25 31 27 32 33 21 22 23 24 25 34 31 27 32 33 21 22 23 24 - bytes:[7048] - 8941 4720968: 35 36 37 38 - bytes:[528] - 596 524728: 39 40 41 42 43 44 45 15 46 47 48 49 50 51 15 52 53 54 55 56 57 54 58 54 59 60 61 62 63 64 65 66 - bytes:[880] - 936 524568: 39 40 41 42 43 44 45 15 46 47 48 49 50 51 15 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 76 77 - bytes:[560] - 993 524552: 91 92 93 94 95 96 15 97 15 98 57 54 58 54 59 60 61 62 63 64 65 66 - bytes:[528] - 1192 524508: 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 - bytes:[440] - 54615 2621560: 119 - bytes:[48] -Locations - 1: 0x0 com.example.function003 Source003.java:103 s=0 - 2: 0x0 com.example.function004 Source004.java:104 s=0 - 3: 0x0 com.example.function005 Source005.java:105 s=0 - 4: 0x0 com.example.function006 Source006.java:106 s=0 - 5: 0x0 com.example.function007 Source007.java:107 s=0 - 6: 0x0 com.example.function008 Source008.java:108 s=0 - 7: 0x0 com.example.function009 Source009.java:109 s=0 - 8: 0x0 com.example.function00a Source00a.java:10 s=0 - 9: 0x0 com.example.function00b Source00b.java:10 s=0 - 10: 0x0 com.example.function00c Source00c.java:10 s=0 - 11: 0x0 com.example.function00d Source00d.java:10 s=0 - 12: 0x0 com.example.function00e Source00e.java:10 s=0 - 13: 0x0 com.example.function00f Source00f.java:10 s=0 - 14: 0x0 com.example.function010 Source010.java:110 s=0 - 15: 0x0 com.example.function011 Source011.java:111 s=0 - 16: 0x0 com.example.function018 Source018.java:118 s=0 - 17: 0x0 com.example.function019 Source019.java:119 s=0 - 18: 0x0 com.example.function01a Source01a.java:11 s=0 - 19: 0x0 com.example.function01b Source01b.java:11 s=0 - 20: 0x0 com.example.function01c Source01c.java:11 s=0 - 21: 0x0 com.example.function01d Source01d.java:11 s=0 - 22: 0x0 com.example.function01e Source01e.java:11 s=0 - 23: 0x0 com.example.function01f Source01f.java:11 s=0 - 24: 0x0 com.example.function020 Source020.java:120 s=0 - 25: 0x0 com.example.function021 Source021.java:121 s=0 - 26: 0x0 com.example.function022 Source022.java:122 s=0 - 27: 0x0 com.example.function023 Source023.java:123 s=0 - 28: 0x0 com.example.function024 Source024.java:124 s=0 - 29: 0x0 com.example.function025 Source025.java:125 s=0 - 30: 0x0 com.example.function026 Source026.java:126 s=0 - 31: 0x0 com.example.function027 Source027.java:127 s=0 - 32: 0x0 com.example.function028 Source028.java:128 s=0 - 33: 0x0 com.example.function029 Source029.java:129 s=0 - 34: 0x0 com.example.function02a Source02a.java:12 s=0 - 35: 0x0 com.example.function02b Source02b.java:12 s=0 - 36: 0x0 com.example.function02c Source02c.java:12 s=0 - 37: 0x0 com.example.function02d Source02d.java:12 s=0 - 38: 0x0 com.example.function02e Source02e.java:12 s=0 - 39: 0x0 com.example.function035 Source035.java:135 s=0 - 40: 0x0 com.example.function036 Source036.java:136 s=0 - 41: 0x0 com.example.function037 Source037.java:137 s=0 - 42: 0x0 com.example.function038 Source038.java:138 s=0 - 43: 0x0 com.example.function039 Source039.java:139 s=0 - 44: 0x0 com.example.function03a Source03a.java:13 s=0 - 45: 0x0 com.example.function03b Source03b.java:13 s=0 - 46: 0x0 com.example.function03d Source03d.java:13 s=0 - 47: 0x0 com.example.function03e Source03e.java:13 s=0 - 48: 0x0 com.example.function03f Source03f.java:13 s=0 - 49: 0x0 com.example.function040 Source040.java:140 s=0 - 50: 0x0 com.example.function041 Source041.java:141 s=0 - 51: 0x0 com.example.function042 Source042.java:142 s=0 - 52: 0x0 com.example.function049 Source049.java:149 s=0 - 53: 0x0 com.example.function04a Source04a.java:14 s=0 - 54: 0x0 com.example.function04b Source04b.java:14 s=0 - 55: 0x0 com.example.function04c Source04c.java:14 s=0 - 56: 0x0 com.example.function04d Source04d.java:14 s=0 - 57: 0x0 com.example.function04e Source04e.java:14 s=0 - 58: 0x0 com.example.function04f Source04f.java:14 s=0 - 59: 0x0 com.example.function050 Source050.java:150 s=0 - 60: 0x0 com.example.function051 Source051.java:151 s=0 - 61: 0x0 com.example.function052 Source052.java:152 s=0 - 62: 0x0 com.example.function053 Source053.java:153 s=0 - 63: 0x0 com.example.function054 Source054.java:154 s=0 - 64: 0x0 com.example.function055 Source055.java:155 s=0 - 65: 0x0 com.example.function056 Source056.java:156 s=0 - 66: 0x0 com.example.function057 Source057.java:157 s=0 - 67: 0x0 com.example.function05e Source05e.java:15 s=0 - 68: 0x0 com.example.function05f Source05f.java:15 s=0 - 69: 0x0 com.example.function060 Source060.java:160 s=0 - 70: 0x0 com.example.function061 Source061.java:161 s=0 - 71: 0x0 com.example.function062 Source062.java:162 s=0 - 72: 0x0 com.example.function063 Source063.java:163 s=0 - 73: 0x0 com.example.function064 Source064.java:164 s=0 - 74: 0x0 com.example.function065 Source065.java:165 s=0 - 75: 0x0 com.example.function066 Source066.java:166 s=0 - 76: 0x0 com.example.function067 Source067.java:167 s=0 - 77: 0x0 com.example.function068 Source068.java:168 s=0 - 78: 0x0 com.example.function069 Source069.java:169 s=0 - 79: 0x0 com.example.function06a Source06a.java:16 s=0 - 80: 0x0 com.example.function06b Source06b.java:16 s=0 - 81: 0x0 com.example.function06c Source06c.java:16 s=0 - 82: 0x0 com.example.function06d Source06d.java:16 s=0 - 83: 0x0 com.example.function06e Source06e.java:16 s=0 - 84: 0x0 com.example.function06f Source06f.java:16 s=0 - 85: 0x0 com.example.function070 Source070.java:170 s=0 - 86: 0x0 com.example.function071 Source071.java:171 s=0 - 87: 0x0 com.example.function072 Source072.java:172 s=0 - 88: 0x0 com.example.function073 Source073.java:173 s=0 - 89: 0x0 com.example.function074 Source074.java:174 s=0 - 90: 0x0 com.example.function075 Source075.java:175 s=0 - 91: 0x0 com.example.function076 Source076.java:176 s=0 - 92: 0x0 com.example.function077 Source077.java:177 s=0 - 93: 0x0 com.example.function078 Source078.java:178 s=0 - 94: 0x0 com.example.function079 Source079.java:179 s=0 - 95: 0x0 com.example.function07a Source07a.java:17 s=0 - 96: 0x0 com.example.function07b Source07b.java:17 s=0 - 97: 0x0 com.example.function081 Source081.java:181 s=0 - 98: 0x0 com.example.function082 Source082.java:182 s=0 - 99: 0x0 com.example.function083 Source083.java:183 s=0 - 100: 0x0 com.example.function084 Source084.java:184 s=0 - 101: 0x0 com.example.function085 Source085.java:185 s=0 - 102: 0x0 com.example.function086 Source086.java:186 s=0 - 103: 0x0 com.example.function087 Source087.java:187 s=0 - 104: 0x0 com.example.function088 Source088.java:188 s=0 - 105: 0x0 com.example.function089 Source089.java:189 s=0 - 106: 0x0 com.example.function08a Source08a.java:18 s=0 - 107: 0x0 com.example.function08b Source08b.java:18 s=0 - 108: 0x0 com.example.function08c Source08c.java:18 s=0 - 109: 0x0 com.example.function08d Source08d.java:18 s=0 - 110: 0x0 com.example.function08e Source08e.java:18 s=0 - 111: 0x0 com.example.function08f Source08f.java:18 s=0 - 112: 0x0 com.example.function090 Source090.java:190 s=0 - 113: 0x0 com.example.function091 Source091.java:191 s=0 - 114: 0x0 com.example.function092 Source092.java:192 s=0 - 115: 0x0 com.example.function093 Source093.java:193 s=0 - 116: 0x0 com.example.function094 Source094.java:194 s=0 - 117: 0x0 com.example.function095 Source095.java:195 s=0 - 118: 0x0 com.example.function096 Source096.java:196 s=0 - 119: 0x0 com.example.function097 Source097.java:197 s=0 -Mappings diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/.gitignore b/src/cmd/vendor/github.com/ianlancetaylor/demangle/.gitignore new file mode 100644 index 0000000000..4a8b38f46b --- /dev/null +++ b/src/cmd/vendor/github.com/ianlancetaylor/demangle/.gitignore @@ -0,0 +1,13 @@ +*.o +*.a +*.so +._* +.nfs.* +a.out +*~ +*.orig +*.rej +*.exe +.*.swp +core +demangle.test diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/ast_test.go b/src/cmd/vendor/github.com/ianlancetaylor/demangle/ast_test.go deleted file mode 100644 index b55406169d..0000000000 --- a/src/cmd/vendor/github.com/ianlancetaylor/demangle/ast_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 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 demangle - -import ( - "fmt" - "testing" -) - -func TestASTToString(t *testing.T) { - var tests = []struct { - input AST - want string - formatted string - }{ - { - &Qualified{Scope: &Name{Name: "s"}, Name: &Name{Name: "C"}}, - "s::C", - `Qualified: - Scope: s - Name: C`, - }, - { - &Typed{Name: &Name{Name: "v"}, Type: &BuiltinType{"int"}}, - "int v", - `Typed: - Name: v - Type: BuiltinType: int`, - }, - } - - for i, test := range tests { - if got := ASTToString(test.input); got != test.want { - t.Errorf("ASTToString of test %d == %s, want %s", i, test.input, test.want) - } - if got := fmt.Sprintf("%#v", test.input); got != test.formatted { - t.Errorf("Formatted test %d == %s, want %s", i, got, test.formatted) - } - } -} diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go b/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go new file mode 100644 index 0000000000..7ba817c9fe --- /dev/null +++ b/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go @@ -0,0 +1,144 @@ +// Copyright 2015 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. + +// +build ignore + +// This is a program that works like the GNU c++filt program. +// It's here for testing purposes and as an example. + +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "os" + "strings" + "unicode" + + "github.com/ianlancetaylor/demangle" +) + +func flagUsage() { + usage(os.Stderr, 2) +} + +func usage(w io.Writer, status int) { + fmt.Fprintf(w, "Usage: %s [options] [mangled names]\n", os.Args[0]) + flag.CommandLine.SetOutput(w) + flag.PrintDefaults() + fmt.Fprintln(w, `Demangled names are displayed to stdout +If a name cannot be demangled it is just echoed to stdout. +If no names are provided on the command line, stdin is read.`) + os.Exit(status) +} + +var stripUnderscore = flag.Bool("_", false, "Ignore first leading underscore") +var noParams = flag.Bool("p", false, "Do not display function argument types") +var noVerbose = flag.Bool("i", false, "Do not show implementation details (if any)") +var help = flag.Bool("h", false, "Display help information") +var debug = flag.Bool("d", false, "Display debugging information for strings on command line") + +// Unimplemented c++filt flags: +// -n (opposite of -_) +// -t (demangle types) +// -s (set demangling style) +// -V (print version information) + +// Characters considered to be part of a symbol. +const symbolChars = "_$." + +func main() { + flag.Usage = func() { usage(os.Stderr, 1) } + flag.Parse() + + if *help { + usage(os.Stdout, 0) + } + + out := bufio.NewWriter(os.Stdout) + + if flag.NArg() > 0 { + for _, f := range flag.Args() { + if *debug { + a, err := demangle.ToAST(f, options()...) + if err != nil { + fmt.Fprintf(os.Stderr, "%s: %v\n", f, err) + } else { + fmt.Fprintf(out, "%#v\n", a) + } + } else { + doDemangle(out, f) + } + out.WriteByte('\n') + } + if err := out.Flush(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + return + } + + scanner := bufio.NewScanner(bufio.NewReader(os.Stdin)) + for scanner.Scan() { + line := scanner.Text() + start := -1 + for i, c := range line { + if unicode.IsLetter(c) || unicode.IsNumber(c) || strings.ContainsRune(symbolChars, c) { + if start < 0 { + start = i + } + } else { + if start >= 0 { + doDemangle(out, line[start:i]) + } + out.WriteRune(c) + start = -1 + } + } + if start >= 0 { + doDemangle(out, line[start:]) + start = -1 + } + out.WriteByte('\n') + if err := out.Flush(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + } +} + +// Demangle a string just as the GNU c++filt program does. +func doDemangle(out *bufio.Writer, name string) { + skip := 0 + if name[0] == '.' || name[0] == '$' { + skip++ + } + if *stripUnderscore && name[skip] == '_' { + skip++ + } + result := demangle.Filter(name[skip:], options()...) + if result == name[skip:] { + out.WriteString(name) + } else { + if name[0] == '.' { + out.WriteByte('.') + } + out.WriteString(result) + } +} + +// options returns the demangling options to use based on the command +// line flags. +func options() []demangle.Option { + var options []demangle.Option + if *noParams { + options = append(options, demangle.NoParams) + } + if !*noVerbose { + options = append(options, demangle.Verbose) + } + return options +} diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/demangle_test.go b/src/cmd/vendor/github.com/ianlancetaylor/demangle/demangle_test.go deleted file mode 100644 index 30a326933e..0000000000 --- a/src/cmd/vendor/github.com/ianlancetaylor/demangle/demangle_test.go +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2015 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 demangle - -import ( - "strconv" - "strings" - "testing" -) - -// Check test cases discovered after the code passed the tests in -// demangle-expected (which are tested by TestExpected). Some of this -// are cases where we differ from the standard demangler, some we are -// the same but we weren't initially. -func TestDemangler(t *testing.T) { - var tests = []struct { - input string - want string - wantNoParams string - wantNoTemplateParams string - wantMinimal string - }{ - { - "_ZNSaIcEC1ERKS_", - "std::allocator::allocator(std::allocator const&)", - "std::allocator::allocator", - "std::allocator::allocator(std::allocator const&)", - "std::allocator::allocator", - }, - { - "_ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC1EP8_IO_FILESt13_Ios_Openmodem", - "__gnu_cxx::stdio_filebuf >::stdio_filebuf(_IO_FILE*, std::_Ios_Openmode, unsigned long)", - "__gnu_cxx::stdio_filebuf >::stdio_filebuf", - "__gnu_cxx::stdio_filebuf::stdio_filebuf(_IO_FILE*, std::_Ios_Openmode, unsigned long)", - "__gnu_cxx::stdio_filebuf::stdio_filebuf", - }, - { - "_ZN1n1CcvNS_1DIT_EEI1EEEv", - "n::C::operator n::D()", - "n::C::operator n::D", - "n::C::operator n::D()", - "n::C::operator n::D", - }, - { - "_Z1CIvPN1D1E1FIdJEEEdEPN1GILb0ET_T0_T1_E1HEPFS6_S7_S8_EN1H1I1JIS7_E1KENSG_IS8_E1KE", - "G*, double>::H* C*, double>(void (*)(D::E::F*, double), H::I::J*>::K, H::I::J::K)", - "C*, double>", - "G::H* C(void (*)(D::E::F*, double), H::I::J::K, H::I::J::K)", - "C", - }, - { - "_ZZNK1CI1DIcSt1EIcESaIcEEJEE1FEvE1F", - "C, std::allocator > >::F() const::F", - "C, std::allocator > >::F() const::F", - "C::F() const::F", - "C::F() const::F", - }, - { - "_ZN1CI1DSt1EIK1FN1G1HEEE1I1JIJRKS6_EEEvDpOT_", - "void C >::I::J const&>(std::E const&)", - "C >::I::J const&>", - "void C::I::J(std::E const&)", - "C::I::J", - }, - { - "_ZN1C1D1E1FIJEEEvi1GDpT_", - "void C::D::E::F<>(int, G)", - "C::D::E::F<>", - "void C::D::E::F(int, G)", - "C::D::E::F", - }, - { - "_ZN1CILj50ELb1EE1DEv", - "C<50u, true>::D()", - "C<50u, true>::D", - "C::D()", - "C::D", - }, - { - "_ZN1CUt_C2Ev", - "C::{unnamed type#1}::{unnamed type#1}()", - "C::{unnamed type#1}::{unnamed type#1}", - "C::{unnamed type#1}::{unnamed type#1}()", - "C::{unnamed type#1}::{unnamed type#1}", - }, - { - "_ZN1C12_GLOBAL__N_11DINS_1EEEEN1F1GIDTadcldtcvT__E1HEEEERKS5_NS_1I1JE", - "F::G C::(anonymous namespace)::D(C::E const&, C::I::J)", - "C::(anonymous namespace)::D", - "F::G C::(anonymous namespace)::D(C::E const&, C::I::J)", - "C::(anonymous namespace)::D", - }, - { - "_ZN1CI1DE1EIJiRiRPKcRA1_S4_S8_bS6_S3_RjRPKN1F1GERPKN1H1IEEEEvDpOT_", - "void C::E(int&&, int&, char const*&, char const (&) [1], char const (&) [1], bool&&, char const*&, int&, unsigned int&, F::G const*&, H::I const*&)", - "C::E", - "void C::E(int&&, int&, char const*&, char const (&) [1], char const (&) [1], bool&&, char const*&, int&, unsigned int&, F::G const*&, H::I const*&)", - "C::E", - }, - { - "_ZN1C12_GLOBAL__N_11DIFbPKNS_1EEEEEvPNS_1FERKT_", - "void C::(anonymous namespace)::D(C::F*, bool (&)(C::E const*) const)", - "C::(anonymous namespace)::D", - "void C::(anonymous namespace)::D(C::F*, bool (&)(C::E const*) const)", - "C::(anonymous namespace)::D", - }, - { - "_ZN1C1D1EIJRFviSt1FIFvRKN1G1H1IEEERKSt6vectorINS_1JESaISB_EEERiS9_EvEENS0_1K1LIJDpNSt1MIT_E1NEEEEDpOSM_", - "C::D::K::L, std::vector > const&)>::N, std::M::N, std::M >::N> C::D::E, std::vector > const&), int&, std::F, void>(void (&)(int, std::F, std::vector > const&), int&, std::F&&)", - "C::D::E, std::vector > const&), int&, std::F, void>", - "C::D::K::L C::D::E(void (&)(int, std::F, std::vector const&), int&, std::F&&)", - "C::D::E", - }, - { - "_ZN1C1D1E1FcvNS_1GIT_EEI1HEEv", - "C::D::E::F::operator C::G()", - "C::D::E::F::operator C::G", - "C::D::E::F::operator C::G()", - "C::D::E::F::operator C::G", - }, - { - "_ZN9__gnu_cxx17__normal_iteratorIPK1EIN1F1G1HEESt6vectorIS5_SaIS5_EEEC2IPS5_EERKNS0_IT_NS_11__enable_ifIXsr3std10__are_sameISE_SD_EE7__valueESA_E1IEEE", - "__gnu_cxx::__normal_iterator const*, std::vector, std::allocator > > >::__normal_iterator*>(__gnu_cxx::__normal_iterator*, __gnu_cxx::__enable_if*, E*>::__value, std::vector, std::allocator > > >::I> const&)", - "__gnu_cxx::__normal_iterator const*, std::vector, std::allocator > > >::__normal_iterator*>", - "__gnu_cxx::__normal_iterator::__normal_iterator(__gnu_cxx::__normal_iterator const&)", - "__gnu_cxx::__normal_iterator::__normal_iterator", - }, - { - "_ZNKSt1CIM1DKFjvEEclIJEvEEjPKS0_DpOT_", - "unsigned int std::C::operator()(D const*) const", - "std::C::operator()", - "unsigned int std::C::operator()(D const*) const", - "std::C::operator()", - }, - { - "_ZNSt10_HashtableI12basic_stringIcSt11char_traitsIcESaIcEESt4pairIKS4_N1C1D1EEESaISA_ENSt8__detail10_Select1stESt8equal_toIS4_ESt4hashIS4_ENSC_18_Mod_range_hashingENSC_20_Default_ranged_hashENSC_20_Prime_rehash_policyENSC_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_assignIZNSN_C1ERKSN_EUlPKNSC_10_Hash_nodeISA_Lb1EEEE_EEvSQ_RKT_", - "void std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >::_M_assign, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >::_Hashtable(std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits > const&)::{lambda(std::__detail::_Hash_node, std::allocator > const, C::D::E>, true> const*)#1}>(std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits > const&, std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >::_Hashtable(std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits > const&)::{lambda(std::__detail::_Hash_node, std::allocator > const, C::D::E>, true> const*)#1} const&)", - "std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >::_M_assign, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits >::_Hashtable(std::_Hashtable, std::allocator >, std::pair, std::allocator > const, C::D::E>, std::allocator, std::allocator > const, C::D::E> >, std::__detail::_Select1st, std::equal_to, std::allocator > >, std::hash, std::allocator > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits > const&)::{lambda(std::__detail::_Hash_node, std::allocator > const, C::D::E>, true> const*)#1}>", - "void std::_Hashtable::_M_assign(std::_Hashtable const&, std::_Hashtable::_Hashtable(std::_Hashtable const&)::{lambda(std::__detail::_Hash_node const*)#1} const&)", - "std::_Hashtable::_M_assign", - }, - { - "_ZSt3maxIVdERKT_S3_S3_", - "double const volatile& std::max(double const volatile&, double const volatile&)", - "std::max", - "double const volatile& std::max(double const volatile&, double const volatile&)", - "std::max", - }, - { - "_ZZN1C1D1E1F1G1HEvENUlvE_C2EOS4_", - "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}({lambda()#1}&&)", - "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}", - "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}({lambda()#1}&&)", - "C::D::E::F::G::H()::{lambda()#1}::{lambda()#1}", - }, - { - "_ZThn8_NK1C1D1EEv", - "non-virtual thunk to C::D::E() const", - "non-virtual thunk to C::D::E() const", - "non-virtual thunk to C::D::E() const", - "non-virtual thunk to C::D::E() const", - }, - { - "_ZTv0_n96_NK1C1D1E1FEv", - "virtual thunk to C::D::E::F() const", - "virtual thunk to C::D::E::F() const", - "virtual thunk to C::D::E::F() const", - "virtual thunk to C::D::E::F() const", - }, - { - "_ZTCSt9strstream16_So", - "construction vtable for std::ostream-in-std::strstream", - "construction vtable for std::ostream-in-std::strstream", - "construction vtable for std::ostream-in-std::strstream", - "construction vtable for std::ostream-in-std::strstream", - }, - { - "_ZGVZZN1C1D1EEvENK3$_0clEvE1F", - "guard variable for C::D::E()::$_0::operator()() const::F", - "guard variable for C::D::E()::$_0::operator()() const::F", - "guard variable for C::D::E()::$_0::operator()() const::F", - "guard variable for C::D::E()::$_0::operator()() const::F", - }, - { - "_Z1fICiEvT_", - "void f(int _Complex)", - "f", - "void f(int _Complex)", - "f", - }, - { - "_GLOBAL__D__Z2fnv", - "global destructors keyed to fn()", - "global destructors keyed to fn()", - "global destructors keyed to fn()", - "global destructors keyed to fn()", - }, - { - "_Z1fIXadL_Z1hvEEEvv", - "void f<&h>()", - "f<&h>", - "void f()", - "f", - }, - { - "_Z1CIP1DEiRK1EPT_N1F1GIS5_Xaasr1HIS5_E1IntsrSA_1JEE1KE", - "int C(E const&, D**, F::G::I&&(!H::J)>::K)", - "C", - "int C(E const&, D**, F::G::K)", - "C", - }, - { - "_ZNO1A1B1C1DIZN1E1F1GINS3_1HE1IEEvMNS3_1JEFvP1LPKT_PT0_P1KESD_SA_SF_SH_EUlvE_Lb0EEcvPSB_ISG_vvEEv", - "A::B::C::D(void (E::J::*)(L*, E::H const*, I*, K*), E::H const*, L*, I*, K*)::{lambda()#1}, false>::operator K*() &&", - "A::B::C::D(void (E::J::*)(L*, E::H const*, I*, K*), E::H const*, L*, I*, K*)::{lambda()#1}, false>::operator K*", - "A::B::C::D::operator K*() &&", - "A::B::C::D::operator K*", - }, - { - "_ZNSt1AIFSt1BImjEjEZN1C1DI1EEENSt1FIXeqsr1G1H1IIDTadsrT_onclEEE1JLi2EEvE1KEPKcSC_OS7_EUljE_E1KERKSt1Lj", - "std::A (unsigned int), std::F::J==(2), void>::K C::D(char const*, G::H::I, G&&)::{lambda(unsigned int)#1}>::K(std::L const&, unsigned int)", - "std::A (unsigned int), std::F::J==(2), void>::K C::D(char const*, G::H::I, G&&)::{lambda(unsigned int)#1}>::K", - "std::A::K(std::L const&, unsigned int)", - "std::A::K", - }, - { - "_ZNSt1AIFSt1BImjEjEZN1L1CIUljE_EENSt1DIXeqsrN1E1F1GIDTadsrT_clEEE1HLi2EEvE1IEPKcSG_OSA_EUljE_E1JERKSt1Kj", - "std::A (unsigned int), std::D::H==(2), void>::I L::C<{lambda(unsigned int)#1}>(char const*, char const*, {lambda(unsigned int)#1}&&)::{lambda(unsigned int)#1}>::J(std::K const&, unsigned int)", - "std::A (unsigned int), std::D::H==(2), void>::I L::C<{lambda(unsigned int)#1}>(char const*, char const*, {lambda(unsigned int)#1}&&)::{lambda(unsigned int)#1}>::J", - "std::A::J(std::K const&, unsigned int)", - "std::A::J", - }, - { - "_ZNSt1A1BIiNS_1CIiEEE1DIPiEENS_1EIXaasr1FIT_EE1Gsr1HIiNS_1IIS7_E1JEEE1KEvE1LES7_S7_", - "std::A::E::G&&H::J>::K, void>::L std::A::B >::D(F, F)", - "std::A::B >::D", - "std::A::E::L std::A::B::D(F, F)", - "std::A::B::D", - }, - { - "_ZNO1A1B1C1DIJOZZN1E1F1GINS4_1HINS4_1IINS4_1JEEEEEJNS4_1KEEEEN1L1MINS4_1OINT_1PEEEEERKSt6vectorIN1Q1RESaISL_EERKN3gtl1S1TIN1U1VEEERKNS4_1W1XERKNS4_1YERKNSQ_1ZINS4_1aEEEPSt13unordered_mapISL_NSK_9UniquePtrINS4_1bINS0_1cIJS9_NS7_INST_1dEEEEEENS4_1fEEEEENSC_1g1hIvEESt8equal_toISL_ESaISt4pairIKSL_S1J_EEEDpRKT0_ENKUlSL_mmS1G_E_clESL_mmS1G_EUlS9_E_OZZNS5_ISA_JSB_EEESI_SP_SX_S11_S14_S19_S1U_S1Y_ENKS1Z_clESL_mmS1G_EUlS1F_E0_EEclIJRS9_EEEDTclcl1iIXsrNS1_1jISt5tupleIJNS1_1kIS21_EENS29_IS23_EEEEJDpT_EEE1lEEcl1mIS2C_EEEspcl1mIS2D_EEEEDpOS2D_", - "decltype (((i)#1}>, E::F::I& >::P> > E::F::G >, E::F::K>(std::vector > const&, gtl::S::T const&, E::F::W::X const&, E::F::Y const&, gtl::Z const&, std::unordered_map, E::F::I >, E::F::f> >, L::g::h, std::equal_to, std::allocator, E::F::I >, E::F::f> > > > >*, E::F::K const&)::{lambda(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >)#1}::operator()(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >) const::{lambda(E::F::I)#1}&&> >, E::F::I&>::l>)((m)()))(((m)#1}> >)())...)) A::B::C::D >::P> > E::F::G >, E::F::K>(std::vector > const&, gtl::S::T const&, E::F::W::X const&, E::F::Y const&, gtl::Z const&, std::unordered_map, E::F::I >, E::F::f> >, L::g::h, std::equal_to, std::allocator, E::F::I >, E::F::f> > > > >*, E::F::K const&)::{lambda(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >)#1}::operator()(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >) const::{lambda(E::F::I)#1}&&, L::M >::P> > E::F::G >, E::F::K>(std::vector > const&, gtl::S::T const&, E::F::W::X const&, E::F::Y const&, gtl::Z const&, std::unordered_map, E::F::I >, E::F::f> >, L::g::h, std::equal_to, std::allocator, E::F::I >, E::F::f> > > > >*, E::F::K const&)::{lambda(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >)#1}::operator()(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >) const::{lambda(E::F::I)#2}&&>::operator()&>((A::B::C::k<{lambda(E::F::I)#1}>&&)...) &&", - "A::B::C::D >::P> > E::F::G >, E::F::K>(std::vector > const&, gtl::S::T const&, E::F::W::X const&, E::F::Y const&, gtl::Z const&, std::unordered_map, E::F::I >, E::F::f> >, L::g::h, std::equal_to, std::allocator, E::F::I >, E::F::f> > > > >*, E::F::K const&)::{lambda(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >)#1}::operator()(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >) const::{lambda(E::F::I)#1}&&, L::M >::P> > E::F::G >, E::F::K>(std::vector > const&, gtl::S::T const&, E::F::W::X const&, E::F::Y const&, gtl::Z const&, std::unordered_map, E::F::I >, E::F::f> >, L::g::h, std::equal_to, std::allocator, E::F::I >, E::F::f> > > > >*, E::F::K const&)::{lambda(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >)#1}::operator()(Q::R, unsigned long, unsigned long, A::B::c, E::F::I >) const::{lambda(E::F::I)#2}&&>::operator()&>", - "decltype (((i)((m)()))(((m)())...)) A::B::C::D::operator()((A::B::C::k&&)...) &&", - "A::B::C::D::operator()", - }, - { - "_ZcvAna_eE_e", - "operator long double [new long double]", - "operator long double [new long double]", - "operator long double [new long double]", - "operator long double [new long double]", - }, - { - "_ZZ1irFeeEES_S_", - "i(() restrict)::long double (long double)(() restrict) restrict", - "i(long double (long double) restrict)::long double (long double)", - "i(() restrict)::long double (long double)(() restrict) restrict", - "i(long double (long double) restrict)::long double (long double)", - }, - { - "_Z1_VFaeEZS_S_ES_", - "_((() volatile) volatile, signed char (long double)(() volatile) volatile::(() volatile) volatile)", - "_", - "_((() volatile) volatile, signed char (long double)(() volatile) volatile::(() volatile) volatile)", - "_", - }, - { - "_ZdsrFliEZS_GS_EcvS_", - "operator.*(( ( _Imaginary)( _Imaginary) restrict) restrict, long (int)( ( _Imaginary)( _Imaginary) restrict) restrict::operator ( ( _Imaginary)( _Imaginary) restrict) restrict)", - "operator.*", - "operator.*(( ( _Imaginary)( _Imaginary) restrict) restrict, long (int)( ( _Imaginary)( _Imaginary) restrict) restrict::operator ( ( _Imaginary)( _Imaginary) restrict) restrict)", - "operator.*", - }, - } - - for _, test := range tests { - if got, err := ToString(test.input); err != nil { - t.Errorf("demangling %s: unexpected error %v", test.input, err) - } else if got != test.want { - t.Errorf("demangling %s: got %s, want %s", test.input, got, test.want) - } - - if got, err := ToString(test.input, NoParams); err != nil { - t.Errorf("demangling NoParams %s: unexpected error %v", test.input, err) - } else if got != test.wantNoParams { - t.Errorf("demangling NoParams %s: got %s, want %s", test.input, got, test.wantNoParams) - } - - if got, err := ToString(test.input, NoTemplateParams); err != nil { - t.Errorf("demangling NoTemplateParams %s: unexpected error %v", test.input, err) - } else if got != test.wantNoTemplateParams { - t.Errorf("demangling NoTemplateParams %s: got %s, want %s", test.input, got, test.wantNoTemplateParams) - } - - if got, err := ToString(test.input, NoParams, NoTemplateParams); err != nil { - t.Errorf("demangling NoTemplateParams %s: unexpected error %v", test.input, err) - } else if got != test.wantMinimal { - t.Errorf("demangling Minimal %s: got %s, want %s", test.input, got, test.wantMinimal) - } - - // Test Filter also. - if got := Filter(test.input); got != test.want { - t.Errorf("Filter(%s) == %s, want %s", test.input, got, test.want) - } - } -} - -// Test for some failure cases. -func TestFailure(t *testing.T) { - var tests = []struct { - input string - error string - off int - }{ - { - "_Z1FE", - "unparsed characters at end of mangled name", - 4, - }, - { - "_Z1FQ", - "unrecognized type code", - 4, - }, - { - "_ZZSaIL0D", - "expected positive number", - 8, - }, - { - "_ZNKE", - "expected prefix", - 4, - }, - { - "_ZcvT_", - "not in scope of template", - 6, - }, - { - "_Z1AIXsZ1_EE", - "missing argument pack", - 8, - }, - { - "_Z1gIEDTclspilE", - "expected expression", - 15, - }, - { - "_ZNcvZN1ET_IEE", - "after local name", - 14, - }, - { - "_Zv00", - "expected positive number", - 5, - }, - { - "_ZcvT_B2T0", - "template parameter not in scope", - 10, - }, - { - "_ZStcvT_", - "template parameter not in scope", - 8, - }, - { - "_Z1aIeEU1RT_ZcvS1_", - "expected E after local name", - 18, - }, - { - "_ZNcvT_oRIEE", - "template index out of range", - 11, - }, - { - "_ZNcvT_D0IIEE", - "expected prefix", - 13, - }, - { - "_ZcvT_IAoncvT__eE", - "template parameter not in scope", - 17, - }, - } - - for _, test := range tests { - got, err := ToString(test.input) - if err == nil { - t.Errorf("unexpected success for %s: %s", test.input, got) - } else if !strings.Contains(err.Error(), test.error) { - t.Errorf("unexpected error for %s: %v", test.input, err) - } else { - s := err.Error() - i := strings.LastIndex(s, " at ") - if i < 0 { - t.Errorf("missing offset in error for %s: %v", test.input, err) - } else { - off, oerr := strconv.Atoi(s[i+4:]) - if oerr != nil { - t.Errorf("can't parse offset (%s) for %s: %v", s[i+4:], test.input, err) - } else if off != test.off { - t.Errorf("unexpected offset for %s: got %d, want %d", test.input, off, test.off) - } - } - } - - if got := Filter(test.input); got != test.input { - t.Errorf("Filter(%s) == %s, want %s", test.input, got, test.input) - } - } -} diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/expected_test.go b/src/cmd/vendor/github.com/ianlancetaylor/demangle/expected_test.go deleted file mode 100644 index 1dff860ea6..0000000000 --- a/src/cmd/vendor/github.com/ianlancetaylor/demangle/expected_test.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2015 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 demangle - -import ( - "bufio" - "flag" - "fmt" - "os" - "strings" - "testing" -) - -var verbose = flag.Bool("verbose", false, "print each demangle-expected symbol") - -const filename = "testdata/demangle-expected" - -// A list of exceptions from demangle-expected that we do not handle -// the same as the standard demangler. We keep a list of exceptions -// so that we can use an exact copy of the file. These exceptions are -// all based on different handling of a substitution that refers to a -// template parameter. The standard demangler seems to have a bug in -// which template it uses when a reference or rvalue-reference refers -// to a substitution that resolves to a template parameter. -var exceptions = map[string]bool{ - "_ZSt7forwardIRN1x14refobjiteratorINS0_3refINS0_4mime30multipart_section_processorObjIZ15get_body_parserIZZN14mime_processor21make_section_iteratorERKNS2_INS3_10sectionObjENS0_10ptrrefBaseEEEbENKUlvE_clEvEUlSB_bE_ZZNS6_21make_section_iteratorESB_bENKSC_clEvEUlSB_E0_ENS1_INS2_INS0_20outputrefiteratorObjIiEES8_EEEERKSsSB_OT_OT0_EUlmE_NS3_32make_multipart_default_discarderISP_EEEES8_EEEEEOT_RNSt16remove_referenceISW_E4typeE": true, - "_ZN3mdr16in_cached_threadIRZNK4cudr6GPUSet17parallel_for_eachIZN5tns3d20shape_representation7compute7GPUImpl7executeERKNS_1AINS_7ptr_refIKjEELl3ELl3ENS_8c_strideILl1ELl0EEEEERKNS8_INS9_IjEELl4ELl1ESD_EEEUliRKNS1_7ContextERNS7_5StateEE_JSt6vectorISO_SaISO_EEEEEvOT_DpRT0_EUlSP_E_JSt17reference_wrapperISO_EEEENS_12ScopedFutureIDTclfp_spcl7forwardISW_Efp0_EEEEESV_DpOSW_": true, - "_ZNSt9_Any_data9_M_accessIPZN3sel8Selector6SetObjI3FooJPKcMS4_FviEEEEvRT_DpT0_EUlvE_EESA_v": true, - "_ZNSt9_Any_data9_M_accessIPZN13ThreadManager7newTaskIRSt5_BindIFSt7_Mem_fnIM5DiaryFivEEPS5_EEIEEESt6futureINSt9result_ofIFT_DpT0_EE4typeEEOSF_DpOSG_EUlvE_EERSF_v": true, - "_ZNSt9_Any_data9_M_accessIPZN6cereal18polymorphic_detail15getInputBindingINS1_16JSONInputArchiveEEENS1_6detail15InputBindingMapIT_E11SerializersERS7_jEUlPvRSt10unique_ptrIvNS5_12EmptyDeleterIvEEEE0_EESA_v": true, - "_ZNSt9_Any_data9_M_accessIPZ4postISt8functionIFvvEEEvOT_EUlvE_EERS5_v": true, - "_ZNSt9_Any_data9_M_accessIPZN13ThreadManager10futureTaskISt5_BindIFSt7_Mem_fnIM6RunnerFvvEEPS5_EEEEvOT_EUlvE_EERSC_v": true, -} - -// For simplicity, this test reads an exact copy of -// libiberty/testsuite/demangle-expected from GCC. See that file for -// the syntax. We ignore all tests that are not --format=gnu-v3 or -// --format=auto with a string starting with _Z. -func TestExpected(t *testing.T) { - f, err := os.Open(filename) - if err != nil { - t.Fatal(err) - } - scanner := bufio.NewScanner(f) - lineno := 1 - for { - format, got := getOptLine(t, scanner, &lineno) - if !got { - break - } - report := lineno - input := getLine(t, scanner, &lineno) - expect := getLine(t, scanner, &lineno) - - testNoParams := false - skip := false - if len(format) > 0 && format[0] == '-' { - for _, arg := range strings.Fields(format) { - switch arg { - case "--format=gnu-v3": - case "--format=auto": - if !strings.HasPrefix(input, "_Z") { - skip = true - } - case "--no-params": - testNoParams = true - case "--ret-postfix", "--ret-drop": - skip = true - case "--is-v3-ctor", "--is-v3-dtor": - skip = true - default: - if !strings.HasPrefix(arg, "--format=") { - t.Errorf("%s:%d: unrecognized argument %s", filename, report, arg) - } - skip = true - } - } - } - - // The libiberty testsuite passes DMGL_TYPES to - // demangle type names, but that doesn't seem useful - // and we don't support it. - if !strings.HasPrefix(input, "_Z") && !strings.HasPrefix(input, "_GLOBAL_") { - skip = true - } - - var expectNoParams string - if testNoParams { - expectNoParams = getLine(t, scanner, &lineno) - } - - if skip { - continue - } - - oneTest(t, report, input, expect, true) - if testNoParams { - oneTest(t, report, input, expectNoParams, false) - } - } - if err := scanner.Err(); err != nil { - t.Error(err) - } -} - -// oneTest tests one entry from demangle-expected. -func oneTest(t *testing.T, report int, input, expect string, params bool) { - if *verbose { - fmt.Println(input) - } - - exception := exceptions[input] - - var s string - var err error - if params { - s, err = ToString(input) - } else { - s, err = ToString(input, NoParams) - } - if err != nil { - if exception { - t.Logf("%s:%d: ignore expected difference: got %q, expected %q", filename, report, err, expect) - return - } - - if err != ErrNotMangledName { - if input == expect { - return - } - t.Errorf("%s:%d: %v", filename, report, err) - return - } - s = input - } - - if s != expect { - if exception { - t.Logf("%s:%d: ignore expected difference: got %q, expected %q", filename, report, s, expect) - } else { - var a AST - if params { - a, err = ToAST(input) - } else { - a, err = ToAST(input, NoParams) - } - if err != nil { - t.Logf("ToAST error: %v", err) - } else { - t.Logf("\n%#v", a) - } - t.Errorf("%s:%d: params: %t: got %q, expected %q", filename, report, params, s, expect) - } - } else if exception && params { - t.Errorf("%s:%d: unexpected success (input listed in exceptions)", filename, report) - } -} - -// getLine reads a line from demangle-expected. -func getLine(t *testing.T, scanner *bufio.Scanner, lineno *int) string { - s, got := getOptLine(t, scanner, lineno) - if !got { - t.Fatalf("%s:%d: unexpected EOF", filename, *lineno) - } - return s -} - -// getOptLine reads an optional line from demangle-expected, returning -// false at EOF. It skips comment lines and updates *lineno. -func getOptLine(t *testing.T, scanner *bufio.Scanner, lineno *int) (string, bool) { - for { - if !scanner.Scan() { - return "", false - } - *lineno++ - line := scanner.Text() - if !strings.HasPrefix(line, "#") { - return line, true - } - } -} diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/testdata/demangle-expected b/src/cmd/vendor/github.com/ianlancetaylor/demangle/testdata/demangle-expected deleted file mode 100644 index 015454b455..0000000000 --- a/src/cmd/vendor/github.com/ianlancetaylor/demangle/testdata/demangle-expected +++ /dev/null @@ -1,4594 +0,0 @@ -# This file holds test cases for the demangler. -# Each test case looks like this: -# options -# input to be demangled -# expected output -# -# Supported options: -# --format= Sets the demangling style. -# --no-params There are two lines of expected output; the first -# is with DMGL_PARAMS, the second is without it. -# --is-v3-ctor Calls is_gnu_v3_mangled_ctor on input; expected -# output is an integer representing ctor_kind. -# --is-v3-dtor Likewise, but for dtors. -# --ret-postfix Passes the DMGL_RET_POSTFIX option -# -# For compatibility, just in case it matters, the options line may be -# empty, to mean --format=auto. If it doesn't start with --, then it -# may contain only a format name. -# -# A line starting with `#' is ignored. -# However, blank lines in this file are NOT ignored. -# ---format=gnu --no-params -AddAlignment__9ivTSolverUiP12ivInteractorP7ivTGlue -ivTSolver::AddAlignment(unsigned int, ivInteractor *, ivTGlue *) -ivTSolver::AddAlignment -# ---format=gnu --no-params -ArrowheadIntersects__9ArrowLineP9ArrowheadR6BoxObjP7Graphic -ArrowLine::ArrowheadIntersects(Arrowhead *, BoxObj &, Graphic *) -ArrowLine::ArrowheadIntersects -# ---format=gnu --no-params -ArrowheadIntersects__9ArrowLineP9ArrowheadO6BoxObjP7Graphic -ArrowLine::ArrowheadIntersects(Arrowhead *, BoxObj &&, Graphic *) -ArrowLine::ArrowheadIntersects -# ---format=gnu --no-params -AtEnd__13ivRubberGroup -ivRubberGroup::AtEnd(void) -ivRubberGroup::AtEnd -# ---format=gnu --no-params -BgFilter__9ivTSolverP12ivInteractor -ivTSolver::BgFilter(ivInteractor *) -ivTSolver::BgFilter -# ---format=gnu --no-params -Check__6UArrayi -UArray::Check(int) -UArray::Check -# ---format=gnu --no-params -CoreConstDecls__8TextCodeR7ostream -TextCode::CoreConstDecls(ostream &) -TextCode::CoreConstDecls -# ---format=gnu --no-params -CoreConstDecls__8TextCodeO7ostream -TextCode::CoreConstDecls(ostream &&) -TextCode::CoreConstDecls -# ---format=gnu --no-params -Detach__8StateVarP12StateVarView -StateVar::Detach(StateVarView *) -StateVar::Detach -# ---format=gnu --no-params -Done__9ComponentG8Iterator -Component::Done(Iterator) -Component::Done -# ---format=gnu --no-params -Effect__11RelateManipR7ivEvent -RelateManip::Effect(ivEvent &) -RelateManip::Effect -# ---format=gnu --no-params -Effect__11RelateManipO7ivEvent -RelateManip::Effect(ivEvent &&) -RelateManip::Effect -# ---format=gnu --no-params -FindFixed__FRP4CNetP4CNet -FindFixed(CNet *&, CNet *) -FindFixed -# ---format=gnu --no-params -FindFixed__FOP4CNetP4CNet -FindFixed(CNet *&&, CNet *) -FindFixed -# ---format=gnu --no-params -Fix48_abort__FR8twolongs -Fix48_abort(twolongs &) -Fix48_abort -# ---format=gnu --no-params -Fix48_abort__FO8twolongs -Fix48_abort(twolongs &&) -Fix48_abort -# ---format=gnu --no-params -GetBarInfo__15iv2_6_VScrollerP13ivPerspectiveRiT2 -iv2_6_VScroller::GetBarInfo(ivPerspective *, int &, int &) -iv2_6_VScroller::GetBarInfo -# ---format=gnu --no-params -GetBarInfo__15iv2_6_VScrollerP13ivPerspectiveOiT2 -iv2_6_VScroller::GetBarInfo(ivPerspective *, int &&, int &&) -iv2_6_VScroller::GetBarInfo -# ---format=gnu --no-params -GetBgColor__C9ivPainter -ivPainter::GetBgColor(void) const -ivPainter::GetBgColor -# ---format=gnu --no-params -InsertBody__15H_PullrightMenuii -H_PullrightMenu::InsertBody(int, int) -H_PullrightMenu::InsertBody -# ---format=gnu --no-params -InsertCharacter__9TextManipc -TextManip::InsertCharacter(char) -TextManip::InsertCharacter -# ---format=gnu --no-params -InsertToplevel__7ivWorldP12ivInteractorT1 -ivWorld::InsertToplevel(ivInteractor *, ivInteractor *) -ivWorld::InsertToplevel -# ---format=gnu --no-params -InsertToplevel__7ivWorldP12ivInteractorT1iiUi -ivWorld::InsertToplevel(ivInteractor *, ivInteractor *, int, int, unsigned int) -ivWorld::InsertToplevel -# ---format=gnu --no-params -IsAGroup__FP11GraphicViewP11GraphicComp -IsAGroup(GraphicView *, GraphicComp *) -IsAGroup -# ---format=gnu --no-params -IsA__10ButtonCodeUl -ButtonCode::IsA(unsigned long) -ButtonCode::IsA -# ---format=gnu --no-params -ReadName__FR7istreamPc -ReadName(istream &, char *) -ReadName -# ---format=gnu --no-params -Redraw__13StringBrowseriiii -StringBrowser::Redraw(int, int, int, int) -StringBrowser::Redraw -# ---format=gnu --no-params -Rotate__13ivTransformerf -ivTransformer::Rotate(float) -ivTransformer::Rotate -# ---format=gnu --no-params -Rotated__C13ivTransformerf -ivTransformer::Rotated(float) const -ivTransformer::Rotated -# ---format=gnu --no-params -Round__Ff -Round(float) -Round -# ---format=gnu --no-params -SetExport__16MemberSharedNameUi -MemberSharedName::SetExport(unsigned int) -MemberSharedName::SetExport -# ---format=gnu --no-params -Set__14ivControlState13ControlStatusUi -ivControlState::Set(ControlStatus, unsigned int) -ivControlState::Set -# ---format=gnu --no-params -Set__5DFacePcii -DFace::Set(char *, int, int) -DFace::Set -# ---format=gnu --no-params -VConvert__9ivTSolverP12ivInteractorRP8TElementT2 -ivTSolver::VConvert(ivInteractor *, TElement *&, TElement *&) -ivTSolver::VConvert -# ---format=gnu --no-params -VConvert__9ivTSolverP7ivTGlueRP8TElement -ivTSolver::VConvert(ivTGlue *, TElement *&) -ivTSolver::VConvert -# ---format=gnu --no-params -VOrder__9ivTSolverUiRP12ivInteractorT2 -ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&) -ivTSolver::VOrder -# ---format=gnu --no-params -_10PageButton$__both -PageButton::__both -PageButton::__both -# ---format=gnu --no-params -_3RNG$singleMantissa -RNG::singleMantissa -RNG::singleMantissa -# ---format=gnu --no-params -_5IComp$_release -IComp::_release -IComp::_release -# ---format=gnu --no-params -_$_10BitmapComp -BitmapComp::~BitmapComp(void) -BitmapComp::~BitmapComp -# ---format=gnu --no-params -_$_9__io_defs -__io_defs::~__io_defs(void) -__io_defs::~__io_defs -# ---format=gnu --no-params -_$_Q23foo3bar -foo::bar::~bar(void) -foo::bar::~bar -# ---format=gnu --no-params -_$_Q33foo3bar4bell -foo::bar::bell::~bell(void) -foo::bar::bell::~bell -# ---format=gnu --no-params -__10ivTelltaleiP7ivGlyph -ivTelltale::ivTelltale(int, ivGlyph *) -ivTelltale::ivTelltale -# ---format=gnu --no-params -__10ivViewportiP12ivInteractorUi -ivViewport::ivViewport(int, ivInteractor *, unsigned int) -ivViewport::ivViewport -# ---format=gnu --no-params -__10ostrstream -ostrstream::ostrstream(void) -ostrstream::ostrstream -# ---format=gnu --no-params -__10ostrstreamPcii -ostrstream::ostrstream(char *, int, int) -ostrstream::ostrstream -# ---format=gnu --no-params -__11BitmapTablei -BitmapTable::BitmapTable(int) -BitmapTable::BitmapTable -# ---format=gnu --no-params -__12ViewportCodeP12ViewportComp -ViewportCode::ViewportCode(ViewportComp *) -ViewportCode::ViewportCode -# ---format=gnu --no-params -__12iv2_6_Borderii -iv2_6_Border::iv2_6_Border(int, int) -iv2_6_Border::iv2_6_Border -# ---format=gnu --no-params -__12ivBreak_Listl -ivBreak_List::ivBreak_List(long) -ivBreak_List::ivBreak_List -# ---format=gnu --no-params -__14iv2_6_MenuItemiP12ivInteractor -iv2_6_MenuItem::iv2_6_MenuItem(int, ivInteractor *) -iv2_6_MenuItem::iv2_6_MenuItem -# ---format=gnu --no-params -__20DisplayList_IteratorR11DisplayList -DisplayList_Iterator::DisplayList_Iterator(DisplayList &) -DisplayList_Iterator::DisplayList_Iterator -# ---format=gnu --no-params -__3fooRT0 -foo::foo(foo &) -foo::foo -# ---format=gnu --no-params -__3fooiN31 -foo::foo(int, int, int, int) -foo::foo -# ---format=gnu --no-params -__3fooiRT0iT2iT2 -foo::foo(int, foo &, int, foo &, int, foo &) -foo::foo -# ---format=gnu --no-params -__6KeyMapPT0 -KeyMap::KeyMap(KeyMap *) -KeyMap::KeyMap -# ---format=gnu --no-params -__8ArrowCmdP6EditorUiUi -ArrowCmd::ArrowCmd(Editor *, unsigned int, unsigned int) -ArrowCmd::ArrowCmd -# ---format=gnu --no-params -__9F_EllipseiiiiP7Graphic -F_Ellipse::F_Ellipse(int, int, int, int, Graphic *) -F_Ellipse::F_Ellipse -# ---format=gnu --no-params -__9FrameDataP9FrameCompi -FrameData::FrameData(FrameComp *, int) -FrameData::FrameData -# ---format=gnu --no-params -__9HVGraphicP9CanvasVarP7Graphic -HVGraphic::HVGraphic(CanvasVar *, Graphic *) -HVGraphic::HVGraphic -# ---format=gnu --no-params -__Q23foo3bar -foo::bar::bar(void) -foo::bar::bar -# ---format=gnu --no-params -__Q33foo3bar4bell -foo::bar::bell::bell(void) -foo::bar::bell::bell -# ---format=gnu --no-params -__aa__3fooRT0 -foo::operator&&(foo &) -foo::operator&& -# ---format=gnu --no-params -__aad__3fooRT0 -foo::operator&=(foo &) -foo::operator&= -# ---format=gnu --no-params -__ad__3fooRT0 -foo::operator&(foo &) -foo::operator& -# ---format=gnu --no-params -__adv__3fooRT0 -foo::operator/=(foo &) -foo::operator/= -# ---format=gnu --no-params -__aer__3fooRT0 -foo::operator^=(foo &) -foo::operator^= -# ---format=gnu --no-params -__als__3fooRT0 -foo::operator<<=(foo &) -foo::operator<<= -# ---format=gnu --no-params -__amd__3fooRT0 -foo::operator%=(foo &) -foo::operator%= -# ---format=gnu --no-params -__ami__3fooRT0 -foo::operator-=(foo &) -foo::operator-= -# ---format=gnu --no-params -__aml__3FixRT0 -Fix::operator*=(Fix &) -Fix::operator*= -# ---format=gnu --no-params -__aml__5Fix16i -Fix16::operator*=(int) -Fix16::operator*= -# ---format=gnu --no-params -__aml__5Fix32RT0 -Fix32::operator*=(Fix32 &) -Fix32::operator*= -# ---format=gnu --no-params -__aor__3fooRT0 -foo::operator|=(foo &) -foo::operator|= -# ---format=gnu --no-params -__apl__3fooRT0 -foo::operator+=(foo &) -foo::operator+= -# ---format=gnu --no-params -__ars__3fooRT0 -foo::operator>>=(foo &) -foo::operator>>= -# ---format=gnu --no-params -__as__3fooRT0 -foo::operator=(foo &) -foo::operator= -# ---format=gnu --no-params -__cl__3fooRT0 -foo::operator()(foo &) -foo::operator() -# ---format=gnu --no-params -__cl__6Normal -Normal::operator()(void) -Normal::operator() -# ---format=gnu --no-params -__cl__6Stringii -String::operator()(int, int) -String::operator() -# ---format=gnu --no-params -__cm__3fooRT0 -foo::operator, (foo &) -foo::operator, -# ---format=gnu --no-params -__co__3foo -foo::operator~(void) -foo::operator~ -# ---format=gnu --no-params -__dl__3fooPv -foo::operator delete(void *) -foo::operator delete -# ---format=gnu --no-params -__dv__3fooRT0 -foo::operator/(foo &) -foo::operator/ -# ---format=gnu --no-params -__eq__3fooRT0 -foo::operator==(foo &) -foo::operator== -# ---format=gnu --no-params -__er__3fooRT0 -foo::operator^(foo &) -foo::operator^ -# ---format=gnu --no-params -__ge__3fooRT0 -foo::operator>=(foo &) -foo::operator>= -# ---format=gnu --no-params -__gt__3fooRT0 -foo::operator>(foo &) -foo::operator> -# ---format=gnu --no-params -__le__3fooRT0 -foo::operator<=(foo &) -foo::operator<= -# ---format=gnu --no-params -__ls__3fooRT0 -foo::operator<<(foo &) -foo::operator<< -# ---format=gnu --no-params -__ls__FR7ostreamPFR3ios_R3ios -operator<<(ostream &, ios &(*)(ios &)) -operator<< -# ---format=gnu --no-params -__ls__FR7ostreamR3Fix -operator<<(ostream &, Fix &) -operator<< -# ---format=gnu --no-params -__lt__3fooRT0 -foo::operator<(foo &) -foo::operator< -# ---format=gnu --no-params -__md__3fooRT0 -foo::operator%(foo &) -foo::operator% -# ---format=gnu --no-params -__mi__3fooRT0 -foo::operator-(foo &) -foo::operator- -# ---format=gnu --no-params -__ml__3fooRT0 -foo::operator*(foo &) -foo::operator* -# ---format=gnu --no-params -__mm__3fooi -foo::operator--(int) -foo::operator-- -# ---format=gnu --no-params -__ne__3fooRT0 -foo::operator!=(foo &) -foo::operator!= -# ---format=gnu --no-params -__nt__3foo -foo::operator!(void) -foo::operator! -# ---format=gnu --no-params -__nw__3fooi -foo::operator new(int) -foo::operator new -# ---format=gnu --no-params -__oo__3fooRT0 -foo::operator||(foo &) -foo::operator|| -# ---format=gnu --no-params -__opPc__3foo -foo::operator char *(void) -foo::operator char * -# ---format=gnu --no-params -__opi__3foo -foo::operator int(void) -foo::operator int -# ---format=gnu --no-params -__or__3fooRT0 -foo::operator|(foo &) -foo::operator| -# ---format=gnu --no-params -__pl__3fooRT0 -foo::operator+(foo &) -foo::operator+ -# ---format=gnu --no-params -__pp__3fooi -foo::operator++(int) -foo::operator++ -# ---format=gnu --no-params -__rf__3foo -foo::operator->(void) -foo::operator-> -# ---format=gnu --no-params -__rm__3fooRT0 -foo::operator->*(foo &) -foo::operator->* -# ---format=gnu --no-params -__rs__3fooRT0 -foo::operator>>(foo &) -foo::operator>> -# ---format=gnu --no-params -_new_Fix__FUs -_new_Fix(unsigned short) -_new_Fix -# ---format=gnu --no-params -_vt.foo -foo virtual table -foo virtual table -# ---format=gnu --no-params -_vt.foo.bar -foo::bar virtual table -foo::bar virtual table -# ---format=gnu --no-params -_vt$foo -foo virtual table -foo virtual table -# ---format=gnu --no-params -_vt$foo$bar -foo::bar virtual table -foo::bar virtual table -# ---format=gnu --no-params -append__7ivGlyphPT0 -ivGlyph::append(ivGlyph *) -ivGlyph::append -# ---format=gnu --no-params -clearok__FP7_win_sti -clearok(_win_st *, int) -clearok -# ---format=gnu --no-params -complexfunc2__FPFPc_i -complexfunc2(int (*)(char *)) -complexfunc2 -# ---format=gnu --no-params -complexfunc3__FPFPFPl_s_i -complexfunc3(int (*)(short (*)(long *))) -complexfunc3 -# ---format=gnu --no-params -complexfunc4__FPFPFPc_s_i -complexfunc4(int (*)(short (*)(char *))) -complexfunc4 -# ---format=gnu --no-params -complexfunc5__FPFPc_PFl_i -complexfunc5(int (*(*)(char *))(long)) -complexfunc5 -# ---format=gnu --no-params -complexfunc6__FPFPi_PFl_i -complexfunc6(int (*(*)(int *))(long)) -complexfunc6 -# ---format=gnu --no-params -complexfunc7__FPFPFPc_i_PFl_i -complexfunc7(int (*(*)(int (*)(char *)))(long)) -complexfunc7 -# ---format=gnu --no-params -foo__FiN30 -foo(int, int, int, int) -foo -# ---format=gnu --no-params -foo__FiR3fooiT1iT1 -foo(int, foo &, int, foo &, int, foo &) -foo -# ---format=gnu --no-params -foo___3barl -bar::foo_(long) -bar::foo_ -# ---format=gnu --no-params -insert__15ivClippingStacklRP8_XRegion -ivClippingStack::insert(long, _XRegion *&) -ivClippingStack::insert -# ---format=gnu --no-params -insert__16ChooserInfo_ListlR11ChooserInfo -ChooserInfo_List::insert(long, ChooserInfo &) -ChooserInfo_List::insert -# ---format=gnu --no-params -insert__17FontFamilyRepListlRP15ivFontFamilyRep -FontFamilyRepList::insert(long, ivFontFamilyRep *&) -FontFamilyRepList::insert -# ---format=gnu --no-params -leaveok__FP7_win_stc -leaveok(_win_st *, char) -leaveok -# ---format=gnu --no-params -left_mover__C7ivMFKitP12ivAdjustableP7ivStyle -ivMFKit::left_mover(ivAdjustable *, ivStyle *) const -ivMFKit::left_mover -# ---format=gnu --no-params -overload1arg__FSc -overload1arg(signed char) -overload1arg -# ---format=gnu --no-params -overload1arg__FUc -overload1arg(unsigned char) -overload1arg -# ---format=gnu --no-params -overload1arg__FUi -overload1arg(unsigned int) -overload1arg -# ---format=gnu --no-params -overload1arg__FUl -overload1arg(unsigned long) -overload1arg -# ---format=gnu --no-params -overload1arg__FUs -overload1arg(unsigned short) -overload1arg -# ---format=gnu --no-params -overload1arg__Fc -overload1arg(char) -overload1arg -# ---format=gnu --no-params -overload1arg__Fd -overload1arg(double) -overload1arg -# ---format=gnu --no-params -overload1arg__Ff -overload1arg(float) -overload1arg -# ---format=gnu --no-params -overload1arg__Fi -overload1arg(int) -overload1arg -# ---format=gnu --no-params -overload1arg__Fl -overload1arg(long) -overload1arg -# ---format=gnu --no-params -overload1arg__Fs -overload1arg(short) -overload1arg -# ---format=gnu --no-params -overload1arg__Fv -overload1arg(void) -overload1arg -# ---format=gnu --no-params -overloadargs__Fi -overloadargs(int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fii -overloadargs(int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiii -overloadargs(int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiii -overloadargs(int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiii -overloadargs(int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiii -overloadargs(int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiiii -overloadargs(int, int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiiiii -overloadargs(int, int, int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiiiiii -overloadargs(int, int, int, int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiiiiiii -overloadargs(int, int, int, int, int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -overloadargs__Fiiiiiiiiiii -overloadargs(int, int, int, int, int, int, int, int, int, int, int) -overloadargs -# ---format=gnu --no-params -poke__8ivRasterUlUlffff -ivRaster::poke(unsigned long, unsigned long, float, float, float, float) -ivRaster::poke -# ---format=gnu --no-params -polar__Fdd -polar(double, double) -polar -# ---format=gnu --no-params -scale__13ivTransformerff -ivTransformer::scale(float, float) -ivTransformer::scale -# ---format=gnu --no-params -sgetn__7filebufPci -filebuf::sgetn(char *, int) -filebuf::sgetn -# ---format=gnu --no-params -shift__FP5_FrepiT0 -shift(_Frep *, int, _Frep *) -shift -# ---format=gnu --no-params -test__C6BitSeti -BitSet::test(int) const -BitSet::test -# ---format=gnu --no-params -test__C6BitSetii -BitSet::test(int, int) const -BitSet::test -# ---format=gnu --no-params -text_source__8Documentl -Document::text_source(long) -Document::text_source -# ---format=gnu --no-params -variance__6Erlangd -Erlang::variance(double) -Erlang::variance -# ---format=gnu --no-params -view__14DocumentViewerP8ItemViewP11TabularItem -DocumentViewer::view(ItemView *, TabularItem *) -DocumentViewer::view -# ---format=gnu --no-params -xy_extents__11ivExtensionffff -ivExtension::xy_extents(float, float, float, float) -ivExtension::xy_extents -# ---format=gnu --no-params -zero__8osMemoryPvUi -osMemory::zero(void *, unsigned int) -osMemory::zero -# ---format=gnu --no-params -_2T4$N -T4::N -T4::N -# ---format=gnu --no-params -_Q22T42t1$N -T4::t1::N -T4::t1::N -# ---format=gnu --no-params -get__2T1 -T1::get(void) -T1::get -# ---format=gnu --no-params -get__Q22T11a -T1::a::get(void) -T1::a::get -# ---format=gnu --no-params -get__Q32T11a1b -T1::a::b::get(void) -T1::a::b::get -# ---format=gnu --no-params -get__Q42T11a1b1c -T1::a::b::c::get(void) -T1::a::b::c::get -# ---format=gnu --no-params -get__Q52T11a1b1c1d -T1::a::b::c::d::get(void) -T1::a::b::c::d::get -# ---format=gnu --no-params -put__2T1i -T1::put(int) -T1::put -# ---format=gnu --no-params -put__Q22T11ai -T1::a::put(int) -T1::a::put -# ---format=gnu --no-params -put__Q32T11a1bi -T1::a::b::put(int) -T1::a::b::put -# ---format=gnu --no-params -put__Q42T11a1b1ci -T1::a::b::c::put(int) -T1::a::b::c::put -# ---format=gnu --no-params -put__Q52T11a1b1c1di -T1::a::b::c::d::put(int) -T1::a::b::c::d::put -# ---format=gnu --no-params -bar__3fooPv -foo::bar(void *) -foo::bar -# ---format=gnu --no-params -bar__C3fooPv -foo::bar(void *) const -foo::bar -# ---format=gnu --no-params -__eq__3fooRT0 -foo::operator==(foo &) -foo::operator== -# ---format=gnu --no-params -__eq__C3fooR3foo -foo::operator==(foo &) const -foo::operator== -# ---format=gnu --no-params -elem__t6vector1Zdi -vector::elem(int) -vector::elem -# ---format=gnu --no-params -elem__t6vector1Zii -vector::elem(int) -vector::elem -# ---format=gnu --no-params -__t6vector1Zdi -vector::vector(int) -vector::vector -# ---format=gnu --no-params -__t6vector1Zii -vector::vector(int) -vector::vector -# ---format=gnu --no-params -_$_t6vector1Zdi -vector::~vector(int) -vector::~vector -# ---format=gnu --no-params -_$_t6vector1Zii -vector::~vector(int) -vector::~vector -# ---format=gnu --no-params -__nw__t2T11ZcUi -T1::operator new(unsigned int) -T1::operator new -# ---format=gnu --no-params -__nw__t2T11Z1tUi -T1::operator new(unsigned int) -T1::operator new -# ---format=gnu --no-params -__dl__t2T11ZcPv -T1::operator delete(void *) -T1::operator delete -# ---format=gnu --no-params -__dl__t2T11Z1tPv -T1::operator delete(void *) -T1::operator delete -# ---format=gnu --no-params -__t2T11Zci -T1::T1(int) -T1::T1 -# ---format=gnu --no-params -__t2T11Zc -T1::T1(void) -T1::T1 -# ---format=gnu --no-params -__t2T11Z1ti -T1::T1(int) -T1::T1 -# ---format=gnu --no-params -__t2T11Z1t -T1::T1(void) -T1::T1 -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity3Pix -List::Pix::Pix(void) -List::Pix::Pix -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity3PixPQ2t4List1Z10VHDLEntity7element -List::Pix::Pix(List::element *) -List::Pix::Pix -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity3PixRCQ2t4List1Z10VHDLEntity3Pix -List::Pix::Pix(List::Pix const &) -List::Pix::Pix -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity3PixOCQ2t4List1Z10VHDLEntity3Pix -List::Pix::Pix(List::Pix const &&) -List::Pix::Pix -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity7elementRC10VHDLEntityPT0 -List::element::element(VHDLEntity const &, List::element *) -List::element::element -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity7elementOC10VHDLEntityPT0 -List::element::element(VHDLEntity const &&, List::element *) -List::element::element -# ---format=gnu --no-params -__Q2t4List1Z10VHDLEntity7elementRCQ2t4List1Z10VHDLEntity7element -List::element::element(List::element const &) -List::element::element -# ---format=gnu --no-params -__cl__C11VHDLLibraryGt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -VHDLLibrary::operator()(PixX >) const -VHDLLibrary::operator() -# ---format=gnu --no-params -__cl__Ct4List1Z10VHDLEntityRCQ2t4List1Z10VHDLEntity3Pix -List::operator()(List::Pix const &) const -List::operator() -# ---format=gnu --no-params -__ne__FPvRCQ2t4List1Z10VHDLEntity3Pix -operator!=(void *, List::Pix const &) -operator!= -# ---format=gnu --no-params -__ne__FPvRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -operator!=(void *, PixX > const &) -operator!= -# ---format=gnu --no-params -__t4List1Z10VHDLEntityRCt4List1Z10VHDLEntity -List::List(List const &) -List::List -# ---format=gnu --no-params -__t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -PixX >::PixX(void) -PixX >::PixX -# ---format=gnu --no-params -__t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityP14VHDLLibraryRepGQ2t4List1Z10VHDLEntity3Pix -PixX >::PixX(VHDLLibraryRep *, List::Pix) -PixX >::PixX -# ---format=gnu --no-params -__t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -PixX >::PixX(PixX > const &) -PixX >::PixX -# ---format=gnu --no-params -__t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityOCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -PixX >::PixX(PixX > const &&) -PixX >::PixX -# ---format=gnu --no-params -nextE__C11VHDLLibraryRt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity -VHDLLibrary::nextE(PixX > &) const -VHDLLibrary::nextE -# ---format=gnu --no-params -next__Ct4List1Z10VHDLEntityRQ2t4List1Z10VHDLEntity3Pix -List::next(List::Pix &) const -List::next -# ---format=gnu --no-params -_GLOBAL_$D$set -global destructors keyed to set -global destructors keyed to set -# ---format=gnu --no-params -_GLOBAL_$I$set -global constructors keyed to set -global constructors keyed to set -# ---format=gnu --no-params -__as__t5ListS1ZUiRCt5ListS1ZUi -ListS::operator=(ListS const &) -ListS::operator= -# ---format=gnu --no-params -__cl__Ct5ListS1ZUiRCQ2t5ListS1ZUi3Vix -ListS::operator()(ListS::Vix const &) const -ListS::operator() -# ---format=gnu --no-params -__cl__Ct5SetLS1ZUiRCQ2t5SetLS1ZUi3Vix -SetLS::operator()(SetLS::Vix const &) const -SetLS::operator() -# ---format=gnu --no-params -__t10ListS_link1ZUiRCUiPT0 -ListS_link::ListS_link(unsigned int const &, ListS_link *) -ListS_link::ListS_link -# ---format=gnu --no-params -__t10ListS_link1ZUiRCt10ListS_link1ZUi -ListS_link::ListS_link(ListS_link const &) -ListS_link::ListS_link -# ---format=gnu --no-params -__t5ListS1ZUiRCt5ListS1ZUi -ListS::ListS(ListS const &) -ListS::ListS -# ---format=gnu --no-params -next__Ct5ListS1ZUiRQ2t5ListS1ZUi3Vix -ListS::next(ListS::Vix &) const -ListS::next -# ---format=gnu --no-params -__ne__FPvRCQ2t5SetLS1ZUi3Vix -operator!=(void *, SetLS::Vix const &) -operator!= -# ---format=gnu --no-params -__t8ListElem1Z5LabelRt4List1Z5Label -ListElem(A) ---format=gnu-v3 -_Z1hI1AEDTcldtfp_miEET_ -decltype (({parm#1}.(operator-))()) h(A) ---format=gnu-v3 -_Z1fDn -f(decltype(nullptr)) ---format=gnu-v3 -_Z1fIRiEvOT_b -void f(int&, bool) ---format=gnu-v3 -_ZN5aaaaa6bbbbbb5cccccIN23ddddddddddddddddddddddd3eeeENS2_4ffff16ggggggggggggggggENS0_9hhhhhhhhhES6_S6_S6_S6_S6_S6_S6_EE -aaaaa::bbbbbb::ccccc ---format=gnu-v3 -_Z5outerIsEcPFilE -char outer(int (*)(long)) ---format=gnu-v3 -_Z5outerPFsiEl -outer(short (*)(int), long) ---format=gnu-v3 -_Z6outer2IsEPFilES1_ -int (*outer2(int (*)(long)))(long) ---format=gnu-v3 --ret-postfix -_Z5outerIsEcPFilE -outer(int (*)(long))char ---format=gnu-v3 --ret-postfix -_Z5outerPFsiEl -outer(short (*)(int), long) ---format=gnu-v3 --ret-postfix -_Z6outer2IsEPFilES1_ -outer2(int (*)(long))int (*)(long) ---format=gnu-v3 --ret-drop -_Z5outerIsEcPFilE -outer(int (*)(long)) ---format=gnu-v3 --ret-drop -_Z5outerPFsiEl -outer(short (*)(int), long) ---format=gnu-v3 --ret-drop -_Z6outer2IsEPFilES1_ -outer2(int (*)(long)) -# ---format=gnu-v3 --no-params -_ZN1KIXadL_ZN1S1mEiEEE1fEv -K<&S::m>::f() -K<&S::m>::f ---format=gnu-v3 -_ZN1KILi1EXadL_ZN1S1mEiEEE1fEv -K<1, &S::m>::f() -# Here the `(int)' argument list of `S::m' is already removed. ---format=gnu-v3 -_ZN1KILi1EXadL_ZN1S1mEEEE1fEv -K<1, &S::m>::f() -# -# Used to crash -- binutils PR 13030. ---format=gnu-v3 -_ZSt10_ConstructI10CellBorderIS0_EEvPT_DpOT0_ -_ZSt10_ConstructI10CellBorderIS0_EEvPT_DpOT0_ -# A pack expansion is substitutable. ---format=gnu-v3 -_Z1fIJiEiEv1AIJDpT_EET0_S4_ -void f(A, int, int) -# So is decltype. ---format=gnu-v3 -_Z1fIiiEDTcvT__EET0_S2_ -decltype ((int)()) f(int, int) -# And vector. ---format=gnu-v3 -_Z1fDv4_iS_ -f(int __vector(4), int __vector(4)) ---format=gnu-v3 -_Z2f1Ii1AEDTdsfp_fp0_ET0_MS2_T_ -decltype ({parm#1}.*{parm#2}) f1(A, int A::*) ---format=gnu-v3 -_Z2f2IiEDTquL_Z1bEfp_trET_ -decltype (b?{parm#1} : (throw)) f2(int) ---format=gnu-v3 -_Z6check1IiEvP6helperIXsznw_T_EEE -void check1(helper*) ---format=gnu-v3 -_Z6check2IiEvP6helperIXszgsnw_T_piEEE -void check2(helper*) ---format=gnu-v3 -_Z6check3IiEvP6helperIXsznwadL_Z1iE_T_piLi1EEEE -void check3(helper*) ---format=gnu-v3 -_Z6check4IiEvP6helperIXszna_A1_T_EEE -void check4(helper*) ---format=gnu-v3 -_Z6check5IiEvP6helperIXszna_A1_T_piEEE -void check5(helper*) ---format=gnu-v3 -_Z1fIiEDTcmgsdlfp_psfp_EPT_ -decltype ((::delete {parm#1}),(+{parm#1})) f(int*) ---format=gnu-v3 -_Z1fIiEDTcmdafp_psfp_EPT_ -decltype ((delete[] {parm#1}),(+{parm#1})) f(int*) ---format=gnu-v3 -_ZN1AdlEPv -A::operator delete(void*) ---format=gnu-v3 -_Z2f1IiEDTppfp_ET_ -decltype ({parm#1}++) f1(int) ---format=gnu-v3 -_Z2f1IiEDTpp_fp_ET_ -decltype (++{parm#1}) f1(int) ---format=gnu-v3 -_Z2f1IiEDTcl1gfp_ilEEET_ -decltype (g({parm#1}, {})) f1(int) ---format=gnu-v3 -_Z2f1IiEDTnw_T_ilEES0_ -decltype (new int{}) f1(int) ---format=gnu-v3 -_Zli2_wPKc -operator"" _w(char const*) ---format=gnu-v3 -_Z1fIiEDTnw_Dapifp_EET_ -decltype (new auto({parm#1})) f(int) ---format=gnu-v3 -_Z1fIiERDaRKT_S1_ -auto& f(int const&, int) ---format=gnu-v3 -_Z1gILi1EEvR1AIXT_EER1BIXscbT_EE -void g<1>(A<1>&, B(1)>&) ---format=gnu-v3 -_ZNKSt7complexIiE4realB5cxx11Ev -std::complex::real[abi:cxx11]() const -# -# Some more crashes revealed by fuzz-testing: -# Check for NULL pointer when demangling trinary operators ---format=gnu-v3 -_Z1fAv32_f -_Z1fAv32_f -# Do not overflow when decoding identifier length ---format=gnu-v3 -_Z11111111111 -_Z11111111111 -# Check out-of-bounds access when decoding braced initializer list ---format=gnu-v3 -_ZDTtl -_ZDTtl -# Check for NULL pointer when demangling DEMANGLE_COMPONENT_LOCAL_NAME ---format=gnu-v3 -_ZZN1fEEd_lEv -_ZZN1fEEd_lEv -# Handle DEMANGLE_COMPONENT_FIXED_TYPE in d_find_pack ---format=gnu-v3 -_Z1fDpDFT_ -_Z1fDpDFT_ -# Likewise, DEMANGLE_COMPONENT_DEFAULT_ARG ---format=gnu-v3 -_Z1fIDpZ1fEd_E -_Z1fIDpZ1fEd_E -# Likewise, DEMANGLE_COMPONENT_NUMBER ---format=gnu-v3 -_Z1fDpDv1_c -f((char __vector(1))...) -# -# Ada (GNAT) tests. -# -# Simple test. ---format=gnat -yz__qrs -yz.qrs -# Operator ---format=gnat -oper__Oadd -oper."+" -# Overloaded subprogram. ---format=gnat -yz__qrs__2 -yz.qrs -# Nested subprogram. ---format=gnat -yz__qrs__tuv.1661 -yz.qrs.tuv -# Nested and overloaded subprograms. ---format=gnat -yz__qrs__tuv__2_1.1667 -yz.qrs.tuv ---format=gnat -yz__qrs__tuv__2_2.1670 -yz.qrs.tuv ---format=gnat -yz__qrs__tuv__2_3.1674 -yz.qrs.tuv -# Elaborated flag (not demangled) ---format=gnat -x_E - -# Nested package ---format=gnat -x__m1 -x.m1 ---format=gnat -x__m3 -x.m3 ---format=gnat -x__y__m2X -x.y.m2 ---format=gnat -x__y__z__rXb -x.y.z.r -# Child package ---format=gnat -x__y__j -x.y.j -# Library level ---format=gnat -_ada_x__m3 -x.m3 -# Package body elaborator ---format=gnat -p___elabb -p'Elab_Body -# Package spec elaborator ---format=gnat -p___elabs -p'Elab_Spec -# Task body ---format=gnat -p__taskobjTKB -p.taskobj -# Task subprogram ---format=gnat -p__taskobjTK__f1.2330 -p.taskobj.f1 -# Protected types subprograms ---format=gnat -prot__lock__getN -prot.lock.get ---format=gnat -prot__lock__getP -prot.lock.get ---format=gnat -prot__lock__get__sub.2590 -prot.lock.get.sub ---format=gnat -prot__lock__setN -prot.lock.set ---format=gnat -prot__lock__setP -prot.lock.set -# Protected type entries ---format=gnat -prot__lock__update_B7s -prot.lock.update ---format=gnat -prot__lock__update_E6s -prot.lock.update -# Controlled types ---format=gnat -gnat__sockets__sockets_library_controllerDF__2 -gnat.sockets.sockets_library_controller.Finalize ---format=gnat -system__partition_interface__racw_stub_typeDA -system.partition_interface.racw_stub_type.Adjust -# Stream operations ---format=gnat -gnat__wide_wide_string_split__slice_setSR__2 -gnat.wide_wide_string_split.slice_set'Read ---format=gnat -ada__real_time__timing_events__events__listSW__2Xnn -ada.real_time.timing_events.events.list'Write ---format=gnat -system__finalization_root__root_controlledSI -system.finalization_root.root_controlled'Input ---format=gnat -ada__finalization__limited_controlledSO__2 -ada.finalization.limited_controlled'Output -# Tagged types ---format=gnat -ada__synchronous_task_control___size__2 -ada.synchronous_task_control'Size ---format=gnat -ada__real_time__timing_events__events___alignment__2Xnn -ada.real_time.timing_events.events'Alignment ---format=gnat -system__finalization_root___assign__2 -system.finalization_root.":=" -# -# Used to crash the demangler. ---format=gnu-v3 -DFA -DFA -# -# http://sourceware.org/bugzilla/show_bug.cgi?id=11572 ---format=auto -_ZN3Psi7VariantIIcPKcEE5visitIIRZN11VariantTest9TestVisit11test_methodEvEUlS2_E0_RZNS6_11test_methodEvEUlcE1_RZNS6_11test_methodEvEUlNS_4NoneEE_EEENS_13VariantDetail19SelectVisitorResultIIDpT_EE4typeEDpOSG_ -Psi::VariantDetail::SelectVisitorResult::type Psi::Variant::visit((VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&)...) -# -# Clone suffix tests -# ---format=gnu-v3 --no-params -_Z3fo5n.clone.1 -fo5(__int128) [clone .clone.1] -fo5 -# ---format=gnu-v3 --no-params -_Z3fo5n.constprop.2 -fo5(__int128) [clone .constprop.2] -fo5 -# ---format=gnu-v3 --no-params -_Z3fo5n.isra.3 -fo5(__int128) [clone .isra.3] -fo5 -# ---format=gnu-v3 --no-params -_Z3fo5n.part.4 -fo5(__int128) [clone .part.4] -fo5 -# ---format=gnu-v3 --no-params -_Z12to_be_clonediPv.clone.0 -to_be_cloned(int, void*) [clone .clone.0] -to_be_cloned -# ---format=gnu-v3 --no-params -_Z3fooi.1988 -foo(int) [clone .1988] -foo -# ---format=gnu-v3 --no-params -_Z3fooi.part.9.165493.constprop.775.31805 -foo(int) [clone .part.9.165493] [clone .constprop.775.31805] -foo -# ---format=gnu-v3 --no-params -_Z2f1IiEvT_S0_S0_._omp_fn.2 -void f1(int, int, int) [clone ._omp_fn.2] -f1 -# ---format=gnu-v3 --no-params -_Z3fooi._omp_cpyfn.6 -foo(int) [clone ._omp_cpyfn.6] -foo -# ---format=gnu-v3 --no-params -_Z1fIKFvvES0_Evv -void f() -f -# ---format=gnu-v3 -_ZN4modc6parser8sequenceINS_9astParser13LocatedParserINS0_9ParserRefINS2_UlRNS2_16TokenParserInputEE_EEEEEINS0_14OptionalParserINS2_18ListParserTemplateILNS_6tokens5Token4TypeE4EXadL_ZNSD_Ut_13parenthesizedEEEE6ParserINS4_INS0_6ParserIS5_NS_3ast10ExpressionEEEEEEEEENSA_INS4_INS2_22OneOfKeywordsToTParserINSJ_5StyleEEEEEEENS0_14SequenceParserIS5_INS0_18ExactElementParserIS5_EENSA_ISM_EEEEENS0_14RepeatedParserINS4_INS0_15TransformParserINSU_IS5_INS4_INSP_INSJ_10Annotation12RelationshipEEEEESX_EEENS2_UlNS2_3LocES12_ONS_5MaybeISK_EEE19_EEEEELb0EEEEEENSU_INS0_17ExtractParserTypeIT_E9InputTypeEINS0_8MaybeRefIS1F_E4TypeEDpNS1I_IT0_E4TypeEEEEOS1F_DpOS1L_ -modc::parser::ParserRef::Parser::Style> > > >::InputType, modc::parser::MaybeRef&&)#21}>::Type, modc::parser::RepeatedParser::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false>::Parser > > > >::Type, modc::parser::RepeatedParser::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false> >::Parser::Style> > > >::Type, modc::parser::RepeatedParser::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false>, modc::astParser::LocatedParser > > > >::Type, modc::parser::RepeatedParser::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false>::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false> >::Type> modc::parser::sequence >, modc::parser::OptionalParser::Parser > > >, modc::astParser::LocatedParser >::Parser::Style> > >, modc::parser::SequenceParser, modc::astParser::LocatedParser > > >, modc::parser::RepeatedParser::Parser::Style> >::Parser > >::Parser::Annotation::Relationship> >, modc::parser::ExactElementParser> >, modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}> >, false> >(modc::astParser::{lambda(modc::astParser::Loc, modc::parser::RepeatedParser, modc::Maybe&&)#21}&&, (modc::parser::ExtractParserType > >&&)...) ---format=gnu-v3 -_ZNKR1A1hEv -A::h() const & ---format=gnu-v3 -_Z1lM1AKFvvRE -l(void (A::*)() const &) ---format=gnu-v3 -_Z1mIFvvOEEvM1AT_ -void m(void (A::*)() &&) ---format=gnu-v3 -_Z1nIM1AKFvvREEvT_ -void n(void (A::*)() const &) ---format=gnu-v3 -_ZL1fIiEvv -void f() -# https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c3 ---format=gnu-v3 -_ZSt7forwardIRN1x14refobjiteratorINS0_3refINS0_4mime30multipart_section_processorObjIZ15get_body_parserIZZN14mime_processor21make_section_iteratorERKNS2_INS3_10sectionObjENS0_10ptrrefBaseEEEbENKUlvE_clEvEUlSB_bE_ZZNS6_21make_section_iteratorESB_bENKSC_clEvEUlSB_E0_ENS1_INS2_INS0_20outputrefiteratorObjIiEES8_EEEERKSsSB_OT_OT0_EUlmE_NS3_32make_multipart_default_discarderISP_EEEES8_EEEEEOT_RNSt16remove_referenceISW_E4typeE -x::refobjiterator, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >& std::forward, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >&>(std::remove_reference, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> > >::type&) -# ---format=gnu-v3 --no-params -_ZNK7strings8internal8SplitterINS_9delimiter5AnyOfENS_9SkipEmptyEEcvT_ISt6vectorI12basic_stringIcSt11char_traitsIcESaIcEESaISD_EEvEEv -strings::internal::Splitter::operator std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator >, std::allocator, std::allocator > > >, void>() const -strings::internal::Splitter::operator std::vector, std::allocator >, std::allocator, std::allocator > > >, std::allocator >, std::allocator, std::allocator > > >, void> -# ---format=gnu-v3 --no-params -_ZN1AcvT_I1CEEv -A::operator C() -A::operator C -# ---format=gnu-v3 --no-params -_ZN1AcvPT_I1CEEv -A::operator C*() -A::operator C* -# ---format=gnu-v3 --no-params -_ZN1AcvT_IiEI1CEEv -A::operator C() -A::operator C -# https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c16 ---format=gnu-v3 -_ZN3mdr16in_cached_threadIRZNK4cudr6GPUSet17parallel_for_eachIZN5tns3d20shape_representation7compute7GPUImpl7executeERKNS_1AINS_7ptr_refIKjEELl3ELl3ENS_8c_strideILl1ELl0EEEEERKNS8_INS9_IjEELl4ELl1ESD_EEEUliRKNS1_7ContextERNS7_5StateEE_JSt6vectorISO_SaISO_EEEEEvOT_DpRT0_EUlSP_E_JSt17reference_wrapperISO_EEEENS_12ScopedFutureIDTclfp_spcl7forwardISW_Efp0_EEEEESV_DpOSW_ -mdr::ScopedFuture, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&>)({parm#2}))...))> mdr::in_cached_thread, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::reference_wrapper >(void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, (void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&&&)...) -# https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c18 ---format=gnu-v3 -_ZNSt9_Any_data9_M_accessIPZN13ThreadManager10futureTaskISt5_BindIFSt7_Mem_fnIM6RunnerFvvEEPS5_EEEEvOT_EUlvE_EERSC_v -void ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*& std::_Any_data::_M_access (Runner*)> >(void ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*&&)::{lambda()#1}*>() -# https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c24 -# aka https://sourceware.org/bugzilla/show_bug.cgi?id=16593 ---format=gnu-v3 -_ZNSt9_Any_data9_M_accessIPZN3sel8Selector6SetObjI3FooJPKcMS4_FviEEEEvRT_DpT0_EUlvE_EESA_v -void sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*& std::_Any_data::_M_access(void sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*&, char const*, void (Foo::*)(int))::{lambda()#1}*>() -# https://sourceware.org/bugzilla/show_bug.cgi?id=16752#c1 ---format=gnu-v3 -_ZNSt9_Any_data9_M_accessIPZN13ThreadManager7newTaskIRSt5_BindIFSt7_Mem_fnIM5DiaryFivEEPS5_EEIEEESt6futureINSt9result_ofIFT_DpT0_EE4typeEEOSF_DpOSG_EUlvE_EERSF_v -std::future (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*& std::_Any_data::_M_access (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::future (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*&&)::{lambda()#1}*>() -# https://sourceware.org/bugzilla/show_bug.cgi?id=16752#c6 ---format=gnu-v3 -_ZNSt9_Any_data9_M_accessIPZN6cereal18polymorphic_detail15getInputBindingINS1_16JSONInputArchiveEEENS1_6detail15InputBindingMapIT_E11SerializersERS7_jEUlPvRSt10unique_ptrIvNS5_12EmptyDeleterIvEEEE0_EESA_v -cereal::detail::InputBindingMap::Serializers cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*& std::_Any_data::_M_access::Serializers cereal::polymorphic_detail::getInputBinding(cereal::detail::InputBindingMap::Serializers cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*>() -# https://sourceware.org/bugzilla/show_bug.cgi?id=16845#c2 ---format=gnu-v3 -_ZNSt9_Any_data9_M_accessIPZ4postISt8functionIFvvEEEvOT_EUlvE_EERS5_v -void post >(std::function&&)::{lambda()#1}*& std::_Any_data::_M_access >(void post >(std::function&&)::{lambda()#1}*&&)::{lambda()#1}*>() -# ---format=auto --no-params -_Z3xxxDFyuVb -xxx(unsigned long long _Fract, bool volatile) -xxx -# https://sourceware.org/bugzilla/show_bug.cgi?id=16817 ---format=auto --no-params -_QueueNotification_QueueController__$4PPPPPPPM_A_INotice___Z -_QueueNotification_QueueController__$4PPPPPPPM_A_INotice___Z -_QueueNotification_QueueController__$4PPPPPPPM_A_INotice___Z ---format=gnu-v3 -_Z1fSsB3fooS_ -f(std::string[abi:foo], std::string[abi:foo]) ---format=gnu-v3 -_Z18IndirectExternCallIPU7stdcallU7regparmILi3EEFviiEiEvT_T0_S3_ -void IndirectExternCall stdcall*)(int, int), int>(void ( regparm<3> stdcall*)(int, int), int, void ( regparm<3> stdcall*)(int, int)) -# -# ABI tags used to confuse the constructor name calculation. ---format=gnu-v3 --no-params -_ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code -std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&) -std::ios_base::failure[abi:cxx11]::failure ---format=gnu-v3 -_Z1fPDxFvvES0_ -f(void (*)() transaction_safe, void (*)() transaction_safe) -# -# These two are from gcc PR61321, and gcc PR61233 / gdb PR16957 -# ---format=gnu-v3 -_Z13function_tempIiEv1AIXszcvT_Li999EEE -void function_temp(A) -# ---format=gnu-v3 -_Z7ZipWithI7QStringS0_5QListZN4oral6detail16AdaptCreateTableI7AccountEES0_RKNS3_16CachedFieldsDataEEUlRKS0_SA_E_ET1_IDTclfp1_cvT__EcvT0__EEEERKT1_ISC_ERKT1_ISD_ET2_ -QList ZipWith(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}>(QList(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}> const&, QList const&, QString oral::detail::AdaptCreateTable(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}) -# -# These three are symbols generated by g++'s testsuite, which triggered the same bug as above. ---format=gnu-v3 -_Z14int_if_addableI1YERiP1AIXszpldecvPT_Li0EdecvS4_Li0EEE -int& int_if_addable(A*) -# ---format=gnu-v3 -_Z3bazIiEvP1AIXszcl3foocvT__ELCf00000000_00000000EEEE -void baz(A*) -# ---format=gnu-v3 -_Z3fooI1FEN1XIXszdtcl1PclcvT__EEE5arrayEE4TypeEv -X::Type foo() - -_Z1fIJidEEv1AIXsZT_EE -void f(A<2>) - -_ZN1A1fIJiiEiJiiiEEEvRAsPDpT_T0_DpT1_E_iS3_S5_ -void A::f(int (&) [6], int, int, int, int) - -_Z10unary_leftIJLi1ELi2ELi3EEEv1AIXflplT_EE -void unary_left<1, 2, 3>(A<(...+(1, 2, 3))>) - -_Z11unary_rightIJLi1ELi2ELi3EEEv1AIXfrplT_EE -void unary_right<1, 2, 3>(A<((1, 2, 3)+...)>) - -_Z11binary_leftIJLi1ELi2ELi3EEEv1AIXfLplLi42ET_EE -void binary_left<1, 2, 3>(A<((42)+...+(1, 2, 3))>) - -_Z12binary_rightIJLi1ELi2ELi3EEEv1AIXfRplT_Li42EEE -void binary_right<1, 2, 3>(A<((1, 2, 3)+...+(42))>) -# -# Tests a use-after-free problem PR70481 - -_Q.__0 -::Q.(void) -# -# Tests a use-after-free problem PR70481 - -_Q10-__9cafebabe. -cafebabe.::-(void) -# -# Tests integer overflow problem PR70492 - -__vt_90000000000cafebabe -__vt_90000000000cafebabe -# -# Tests write access violation PR70498 - -_Z80800000000000000000000 -_Z80800000000000000000000 -# -# Tests write access violation PR70926 - -0__Ot2m02R5T0000500000 -0__Ot2m02R5T0000500000 -# - -0__GT50000000000_ -0__GT50000000000_ -# - -__t2m05B500000000000000000_ -__t2m05B500000000000000000_ -# -# Tests stack overflow PR71696 - -__10%0__S4_0T0T0 -%0<>::%0(%0<>) diff --git a/src/cmd/vendor/golang.org/x/arch/AUTHORS b/src/cmd/vendor/golang.org/x/arch/AUTHORS new file mode 100644 index 0000000000..2b00ddba0d --- /dev/null +++ b/src/cmd/vendor/golang.org/x/arch/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/src/cmd/vendor/golang.org/x/arch/CONTRIBUTORS b/src/cmd/vendor/golang.org/x/arch/CONTRIBUTORS new file mode 100644 index 0000000000..1fbd3e976f --- /dev/null +++ b/src/cmd/vendor/golang.org/x/arch/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/src/cmd/vendor/golang.org/x/arch/LICENSE b/src/cmd/vendor/golang.org/x/arch/LICENSE new file mode 100644 index 0000000000..d29b37261f --- /dev/null +++ b/src/cmd/vendor/golang.org/x/arch/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2015 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/cmd/vendor/golang.org/x/arch/PATENTS b/src/cmd/vendor/golang.org/x/arch/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/src/cmd/vendor/golang.org/x/arch/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/decode_test.go b/src/cmd/vendor/golang.org/x/arch/arm/armasm/decode_test.go deleted file mode 100644 index e2d9127348..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/decode_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2014 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 armasm - -import ( - "encoding/hex" - "io/ioutil" - "strconv" - "strings" - "testing" -) - -func TestDecode(t *testing.T) { - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - all := string(data) - for strings.Contains(all, "\t\t") { - all = strings.Replace(all, "\t\t", "\t", -1) - } - for _, line := range strings.Split(all, "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.SplitN(line, "\t", 4) - i := strings.Index(f[0], "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f[0]) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f[0]) - } - size := i / 2 - code, err := hex.DecodeString(f[0][:i] + f[0][i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f[0], err) - continue - } - mode, err := strconv.Atoi(f[1]) - if err != nil { - t.Errorf("invalid mode %q in: %s", f[1], line) - continue - } - syntax, asm := f[2], f[3] - inst, err := Decode(code, Mode(mode)) - var out string - if err != nil { - out = "error: " + err.Error() - } else { - switch syntax { - case "gnu": - out = GNUSyntax(inst) - case "plan9": // [sic] - out = GoSyntax(inst, 0, nil, nil) - default: - t.Errorf("unknown syntax %q", syntax) - continue - } - } - if out != asm || inst.Len != size { - t.Errorf("Decode(%s) [%s] = %s, %d, want %s, %d", f[0], syntax, out, inst.Len, asm, size) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/ext_test.go b/src/cmd/vendor/golang.org/x/arch/arm/armasm/ext_test.go deleted file mode 100644 index f0758625f9..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/ext_test.go +++ /dev/null @@ -1,615 +0,0 @@ -// Copyright 2014 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. - -// Support for testing against external disassembler program. -// Copied and simplified from ../../x86/x86asm/ext_test.go. - -package armasm - -import ( - "bufio" - "bytes" - "encoding/hex" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "math/rand" - "os" - "os/exec" - "regexp" - "runtime" - "strings" - "testing" - "time" -) - -var ( - printTests = flag.Bool("printtests", false, "print test cases that exercise new code paths") - dumpTest = flag.Bool("dump", false, "dump all encodings") - mismatch = flag.Bool("mismatch", false, "log allowed mismatches") - longTest = flag.Bool("long", false, "long test") - keep = flag.Bool("keep", false, "keep object files around") - debug = false -) - -// An ExtInst represents a single decoded instruction parsed -// from an external disassembler's output. -type ExtInst struct { - addr uint32 - enc [4]byte - nenc int - text string -} - -func (r ExtInst) String() string { - return fmt.Sprintf("%#x: % x: %s", r.addr, r.enc, r.text) -} - -// An ExtDis is a connection between an external disassembler and a test. -type ExtDis struct { - Arch Mode - Dec chan ExtInst - File *os.File - Size int - KeepFile bool - Cmd *exec.Cmd -} - -// Run runs the given command - the external disassembler - and returns -// a buffered reader of its standard output. -func (ext *ExtDis) Run(cmd ...string) (*bufio.Reader, error) { - if *keep { - log.Printf("%s\n", strings.Join(cmd, " ")) - } - ext.Cmd = exec.Command(cmd[0], cmd[1:]...) - out, err := ext.Cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("stdoutpipe: %v", err) - } - if err := ext.Cmd.Start(); err != nil { - return nil, fmt.Errorf("exec: %v", err) - } - - b := bufio.NewReaderSize(out, 1<<20) - return b, nil -} - -// Wait waits for the command started with Run to exit. -func (ext *ExtDis) Wait() error { - return ext.Cmd.Wait() -} - -// testExtDis tests a set of byte sequences against an external disassembler. -// The disassembler is expected to produce the given syntax and be run -// in the given architecture mode (16, 32, or 64-bit). -// The extdis function must start the external disassembler -// and then parse its output, sending the parsed instructions on ext.Dec. -// The generate function calls its argument f once for each byte sequence -// to be tested. The generate function itself will be called twice, and it must -// make the same sequence of calls to f each time. -// When a disassembly does not match the internal decoding, -// allowedMismatch determines whether this mismatch should be -// allowed, or else considered an error. -func testExtDis( - t *testing.T, - syntax string, - arch Mode, - extdis func(ext *ExtDis) error, - generate func(f func([]byte)), - allowedMismatch func(text string, size int, inst *Inst, dec ExtInst) bool, -) { - start := time.Now() - ext := &ExtDis{ - Dec: make(chan ExtInst), - Arch: arch, - } - errc := make(chan error) - - // First pass: write instructions to input file for external disassembler. - file, f, size, err := writeInst(generate) - if err != nil { - t.Fatal(err) - } - ext.Size = size - ext.File = f - defer func() { - f.Close() - if !*keep { - os.Remove(file) - } - }() - - // Second pass: compare disassembly against our decodings. - var ( - totalTests = 0 - totalSkips = 0 - totalErrors = 0 - - errors = make([]string, 0, 100) // sampled errors, at most cap - ) - go func() { - errc <- extdis(ext) - }() - generate(func(enc []byte) { - dec, ok := <-ext.Dec - if !ok { - t.Errorf("decoding stream ended early") - return - } - inst, text := disasm(syntax, arch, pad(enc)) - totalTests++ - if *dumpTest { - fmt.Printf("%x -> %s [%d]\n", enc[:len(enc)], dec.text, dec.nenc) - } - if text != dec.text || inst.Len != dec.nenc { - suffix := "" - if allowedMismatch(text, size, &inst, dec) { - totalSkips++ - if !*mismatch { - return - } - suffix += " (allowed mismatch)" - } - totalErrors++ - if len(errors) >= cap(errors) { - j := rand.Intn(totalErrors) - if j >= cap(errors) { - return - } - errors = append(errors[:j], errors[j+1:]...) - } - errors = append(errors, fmt.Sprintf("decode(%x) = %q, %d, want %q, %d%s", enc, text, inst.Len, dec.text, dec.nenc, suffix)) - } - }) - - if *mismatch { - totalErrors -= totalSkips - } - - for _, b := range errors { - t.Log(b) - } - - if totalErrors > 0 { - t.Fail() - } - t.Logf("%d test cases, %d expected mismatches, %d failures; %.0f cases/second", totalTests, totalSkips, totalErrors, float64(totalTests)/time.Since(start).Seconds()) - - if err := <-errc; err != nil { - t.Fatalf("external disassembler: %v", err) - } - -} - -const start = 0x8000 // start address of text - -// writeInst writes the generated byte sequences to a new file -// starting at offset start. That file is intended to be the input to -// the external disassembler. -func writeInst(generate func(func([]byte))) (file string, f *os.File, size int, err error) { - f, err = ioutil.TempFile("", "armasm") - if err != nil { - return - } - - file = f.Name() - - f.Seek(start, io.SeekStart) - w := bufio.NewWriter(f) - defer w.Flush() - size = 0 - generate(func(x []byte) { - if len(x) > 4 { - x = x[:4] - } - if debug { - fmt.Printf("%#x: %x%x\n", start+size, x, zeros[len(x):]) - } - w.Write(x) - w.Write(zeros[len(x):]) - size += len(zeros) - }) - return file, f, size, nil -} - -var zeros = []byte{0, 0, 0, 0} - -// pad pads the code sequence with pops. -func pad(enc []byte) []byte { - if len(enc) < 4 { - enc = append(enc[:len(enc):len(enc)], zeros[:4-len(enc)]...) - } - return enc -} - -// disasm returns the decoded instruction and text -// for the given source bytes, using the given syntax and mode. -func disasm(syntax string, mode Mode, src []byte) (inst Inst, text string) { - // If printTests is set, we record the coverage value - // before and after, and we write out the inputs for which - // coverage went up, in the format expected in testdata/decode.text. - // This produces a fairly small set of test cases that exercise nearly - // all the code. - var cover float64 - if *printTests { - cover -= coverage() - } - - inst, err := Decode(src, mode) - if err != nil { - text = "error: " + err.Error() - } else { - text = inst.String() - switch syntax { - //case "arm": - // text = ARMSyntax(inst) - case "gnu": - text = GNUSyntax(inst) - //case "plan9": // [sic] - // text = GoSyntax(inst, 0, nil) - default: - text = "error: unknown syntax " + syntax - } - } - - if *printTests { - cover += coverage() - if cover > 0 { - max := len(src) - if max > 4 && inst.Len <= 4 { - max = 4 - } - fmt.Printf("%x|%x\t%d\t%s\t%s\n", src[:inst.Len], src[inst.Len:max], mode, syntax, text) - } - } - - return -} - -// coverage returns a floating point number denoting the -// test coverage until now. The number increases when new code paths are exercised, -// both in the Go program and in the decoder byte code. -func coverage() float64 { - /* - testing.Coverage is not in the main distribution. - The implementation, which must go in package testing, is: - - // Coverage reports the current code coverage as a fraction in the range [0, 1]. - func Coverage() float64 { - var n, d int64 - for _, counters := range cover.Counters { - for _, c := range counters { - if c > 0 { - n++ - } - d++ - } - } - if d == 0 { - return 0 - } - return float64(n) / float64(d) - } - */ - - var f float64 - f += testing.Coverage() - f += decodeCoverage() - return f -} - -func decodeCoverage() float64 { - n := 0 - for _, t := range decoderCover { - if t { - n++ - } - } - return float64(1+n) / float64(1+len(decoderCover)) -} - -// Helpers for writing disassembler output parsers. - -// hasPrefix reports whether any of the space-separated words in the text s -// begins with any of the given prefixes. -func hasPrefix(s string, prefixes ...string) bool { - for _, prefix := range prefixes { - for s := s; s != ""; { - if strings.HasPrefix(s, prefix) { - return true - } - i := strings.Index(s, " ") - if i < 0 { - break - } - s = s[i+1:] - } - } - return false -} - -// contains reports whether the text s contains any of the given substrings. -func contains(s string, substrings ...string) bool { - for _, sub := range substrings { - if strings.Contains(s, sub) { - return true - } - } - return false -} - -// isHex reports whether b is a hexadecimal character (0-9A-Fa-f). -func isHex(b byte) bool { return b == '0' || unhex[b] > 0 } - -// parseHex parses the hexadecimal byte dump in hex, -// appending the parsed bytes to raw and returning the updated slice. -// The returned bool signals whether any invalid hex was found. -// Spaces and tabs between bytes are okay but any other non-hex is not. -func parseHex(hex []byte, raw []byte) ([]byte, bool) { - hex = trimSpace(hex) - for j := 0; j < len(hex); { - for hex[j] == ' ' || hex[j] == '\t' { - j++ - } - if j >= len(hex) { - break - } - if j+2 > len(hex) || !isHex(hex[j]) || !isHex(hex[j+1]) { - return nil, false - } - raw = append(raw, unhex[hex[j]]<<4|unhex[hex[j+1]]) - j += 2 - } - return raw, true -} - -var unhex = [256]byte{ - '0': 0, - '1': 1, - '2': 2, - '3': 3, - '4': 4, - '5': 5, - '6': 6, - '7': 7, - '8': 8, - '9': 9, - 'A': 10, - 'B': 11, - 'C': 12, - 'D': 13, - 'E': 14, - 'F': 15, - 'a': 10, - 'b': 11, - 'c': 12, - 'd': 13, - 'e': 14, - 'f': 15, -} - -// index is like bytes.Index(s, []byte(t)) but avoids the allocation. -func index(s []byte, t string) int { - i := 0 - for { - j := bytes.IndexByte(s[i:], t[0]) - if j < 0 { - return -1 - } - i = i + j - if i+len(t) > len(s) { - return -1 - } - for k := 1; k < len(t); k++ { - if s[i+k] != t[k] { - goto nomatch - } - } - return i - nomatch: - i++ - } -} - -// fixSpace rewrites runs of spaces, tabs, and newline characters into single spaces in s. -// If s must be rewritten, it is rewritten in place. -func fixSpace(s []byte) []byte { - s = trimSpace(s) - for i := 0; i < len(s); i++ { - if s[i] == '\t' || s[i] == '\n' || i > 0 && s[i] == ' ' && s[i-1] == ' ' { - goto Fix - } - } - return s - -Fix: - b := s - w := 0 - for i := 0; i < len(s); i++ { - c := s[i] - if c == '\t' || c == '\n' { - c = ' ' - } - if c == ' ' && w > 0 && b[w-1] == ' ' { - continue - } - b[w] = c - w++ - } - if w > 0 && b[w-1] == ' ' { - w-- - } - return b[:w] -} - -// trimSpace trims leading and trailing space from s, returning a subslice of s. -func trimSpace(s []byte) []byte { - j := len(s) - for j > 0 && (s[j-1] == ' ' || s[j-1] == '\t' || s[j-1] == '\n') { - j-- - } - i := 0 - for i < j && (s[i] == ' ' || s[i] == '\t') { - i++ - } - return s[i:j] -} - -// pcrel matches instructions using relative addressing mode. -var ( - pcrel = regexp.MustCompile(`^((?:.* )?(?:b|bl)x?(?:eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le)?) 0x([0-9a-f]+)$`) -) - -// Generators. -// -// The test cases are described as functions that invoke a callback repeatedly, -// with a new input sequence each time. These helpers make writing those -// a little easier. - -// condCases generates conditional instructions. -func condCases(t *testing.T) func(func([]byte)) { - return func(try func([]byte)) { - // All the strides are relatively prime to 2 and therefore to 2²⁸, - // so we will not repeat any instructions until we have tried all 2²⁸. - // Using a stride other than 1 is meant to visit the instructions in a - // pseudorandom order, which gives better variety in the set of - // test cases chosen by -printtests. - stride := uint32(10007) - n := 1 << 28 / 7 - if testing.Short() { - stride = 100003 - n = 1 << 28 / 1001 - } else if *longTest { - stride = 200000033 - n = 1 << 28 - } - x := uint32(0) - for i := 0; i < n; i++ { - enc := (x%15)<<28 | x&(1<<28-1) - try([]byte{byte(enc), byte(enc >> 8), byte(enc >> 16), byte(enc >> 24)}) - x += stride - } - } -} - -// uncondCases generates unconditional instructions. -func uncondCases(t *testing.T) func(func([]byte)) { - return func(try func([]byte)) { - condCases(t)(func(enc []byte) { - enc[3] |= 0xF0 - try(enc) - }) - } -} - -func countBits(x uint32) int { - n := 0 - for ; x != 0; x >>= 1 { - n += int(x & 1) - } - return n -} - -func expandBits(x, m uint32) uint32 { - var out uint32 - for i := uint(0); i < 32; i++ { - out >>= 1 - if m&1 != 0 { - out |= (x & 1) << 31 - x >>= 1 - } - m >>= 1 - } - return out -} - -func tryCondMask(mask, val uint32, try func([]byte)) { - n := countBits(^mask) - bits := uint32(0) - for i := 0; i < 1<> 8), byte(x >> 16), byte(x >> 24)}) - } -} - -// vfpCases generates VFP instructions. -func vfpCases(t *testing.T) func(func([]byte)) { - const ( - vfpmask uint32 = 0xFF00FE10 - vfp uint32 = 0x0E009A00 - ) - return func(try func([]byte)) { - tryCondMask(0xff00fe10, 0x0e009a00, try) // standard VFP instruction space - tryCondMask(0xffc00f7f, 0x0e000b10, try) // VFP MOV core reg to/from float64 half - tryCondMask(0xffe00f7f, 0x0e000a10, try) // VFP MOV core reg to/from float32 - tryCondMask(0xffef0fff, 0x0ee10a10, try) // VFP MOV core reg to/from cond codes - } -} - -// hexCases generates the cases written in hexadecimal in the encoded string. -// Spaces in 'encoded' separate entire test cases, not individual bytes. -func hexCases(t *testing.T, encoded string) func(func([]byte)) { - return func(try func([]byte)) { - for _, x := range strings.Fields(encoded) { - src, err := hex.DecodeString(x) - if err != nil { - t.Errorf("parsing %q: %v", x, err) - } - try(src) - } - } -} - -// testdataCases generates the test cases recorded in testdata/decode.txt. -// It only uses the inputs; it ignores the answers recorded in that file. -func testdataCases(t *testing.T) func(func([]byte)) { - var codes [][]byte - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.Fields(line)[0] - i := strings.Index(f, "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f) - } - code, err := hex.DecodeString(f[:i] + f[i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f, err) - continue - } - codes = append(codes, code) - } - - return func(try func([]byte)) { - for _, code := range codes { - try(code) - } - } -} - -func caller(skip int) string { - pc, _, _, _ := runtime.Caller(skip) - f := runtime.FuncForPC(pc) - name := "?" - if f != nil { - name = f.Name() - if i := strings.LastIndex(name, "."); i >= 0 { - name = name[i+1:] - } - } - return name -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdump_test.go b/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdump_test.go deleted file mode 100644 index db51902cc7..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdump_test.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2014 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 armasm - -import ( - "encoding/binary" - "strings" - "testing" -) - -func TestObjdumpARMTestdata(t *testing.T) { testObjdumpARM(t, testdataCases(t)) } -func TestObjdumpARMManual(t *testing.T) { testObjdumpARM(t, hexCases(t, objdumpManualTests)) } -func TestObjdumpARMCond(t *testing.T) { testObjdumpARM(t, condCases(t)) } -func TestObjdumpARMUncond(t *testing.T) { testObjdumpARM(t, uncondCases(t)) } -func TestObjdumpARMVFP(t *testing.T) { testObjdumpARM(t, vfpCases(t)) } - -// objdumpManualTests holds test cases that will be run by TestObjdumpARMManual. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=Manual, particularly with tracing enabled. -// Note that these are byte sequences, so they must be reversed from the usual -// word presentation. -var objdumpManualTests = ` -002a9b1d -001b9bed -020b8ded -003a9b1d -060b8ded -fcde1100 -b4de1100 -bc480000 -0b008de7 -0b00ade7 -fdbcfaf7 -` - -// allowedMismatchObjdump reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchObjdump(text string, size int, inst *Inst, dec ExtInst) bool { - if hasPrefix(text, "error:") { - if hasPrefix(dec.text, unsupported...) || strings.Contains(dec.text, "invalid:") || strings.HasSuffix(dec.text, "^") || strings.Contains(dec.text, "f16.f64") || strings.Contains(dec.text, "f64.f16") { - return true - } - // word 4320F02C: libopcodes says 'nopmi {44}'. - if hasPrefix(dec.text, "nop") && strings.Contains(dec.text, "{") { - return true - } - } - - if hasPrefix(dec.text, "error:") && text == "undef" && inst.Enc == 0xf7fabcfd { - return true - } - - // word 00f02053: libopcodes says 'noppl {0}'. - if hasPrefix(dec.text, "nop") && hasPrefix(text, "nop") && dec.text == text+" {0}" { - return true - } - - // word F57FF04F. we say 'dsb #15', libopcodes says 'dsb sy'. - if hasPrefix(text, "dsb") && hasPrefix(dec.text, "dsb") { - return true - } - // word F57FF06F. we say 'isb #15', libopcodes says 'isb sy'. - if hasPrefix(text, "isb") && hasPrefix(dec.text, "isb") { - return true - } - // word F57FF053. we say 'dmb #3', libopcodes says 'dmb osh'. - if hasPrefix(text, "dmb") && hasPrefix(dec.text, "dmb") { - return true - } - - // word 992D0000. push/stmdb with no registers (undefined). - // we say 'stmdbls sp!, {}', libopcodes says 'pushls {}'. - if hasPrefix(text, "stmdb") && hasPrefix(dec.text, "push") && strings.Contains(text, "{}") && strings.Contains(dec.text, "{}") { - return true - } - - // word 28BD0000. pop/ldm with no registers (undefined). - // we say 'ldmcs sp!, {}', libopcodes says 'popcs {}'. - if hasPrefix(text, "ldm") && hasPrefix(dec.text, "pop") && strings.Contains(text, "{}") && strings.Contains(dec.text, "{}") { - return true - } - - // word 014640F0. - // libopcodes emits #-0 for negative zero; we don't. - if strings.Replace(dec.text, "#-0", "#0", -1) == text || strings.Replace(dec.text, ", #-0", "", -1) == text { - return true - } - - // word 91EF90F0. we say 'strdls r9, [pc, #0]!' but libopcodes says 'strdls r9, [pc]'. - // word D16F60F0. we say 'strdle r6, [pc, #0]!' but libopcodes says 'strdle r6, [pc, #-0]'. - if strings.Replace(text, ", #0]!", "]", -1) == strings.Replace(dec.text, ", #-0]", "]", -1) { - return true - } - - // word 510F4000. we say apsr, libopcodes says CPSR. - if strings.Replace(dec.text, "CPSR", "apsr", -1) == text { - return true - } - - // word 06A4B059. - // for ssat and usat, libopcodes decodes asr #0 as asr #0 but the manual seems to say it should be asr #32. - // There is never an asr #0. - if strings.Replace(dec.text, ", asr #0", ", asr #32", -1) == text { - return true - } - - if len(dec.enc) >= 4 { - raw := binary.LittleEndian.Uint32(dec.enc[:4]) - - // word 21FFF0B5. - // the manual is clear that this is pre-indexed mode (with !) but libopcodes generates post-index (without !). - if raw&0x01200000 == 0x01200000 && strings.Replace(text, "!", "", -1) == dec.text { - return true - } - - // word C100543E: libopcodes says tst, but no evidence for that. - if strings.HasPrefix(dec.text, "tst") && raw&0x0ff00000 != 0x03100000 && raw&0x0ff00000 != 0x01100000 { - return true - } - - // word C3203CE8: libopcodes says teq, but no evidence for that. - if strings.HasPrefix(dec.text, "teq") && raw&0x0ff00000 != 0x03300000 && raw&0x0ff00000 != 0x01300000 { - return true - } - - // word D14C552E: libopcodes says cmp but no evidence for that. - if strings.HasPrefix(dec.text, "cmp") && raw&0x0ff00000 != 0x03500000 && raw&0x0ff00000 != 0x01500000 { - return true - } - - // word 2166AA4A: libopcodes says cmn but no evidence for that. - if strings.HasPrefix(dec.text, "cmn") && raw&0x0ff00000 != 0x03700000 && raw&0x0ff00000 != 0x01700000 { - return true - } - - // word E70AEEEF: libopcodes says str but no evidence for that. - if strings.HasPrefix(dec.text, "str") && len(dec.text) >= 5 && (dec.text[3] == ' ' || dec.text[5] == ' ') && raw&0x0e500018 != 0x06000000 && raw&0x0e500000 != 0x0400000 { - return true - } - - // word B0AF48F4: libopcodes says strd but P=0,W=1 which is unpredictable. - if hasPrefix(dec.text, "ldr", "str") && raw&0x01200000 == 0x00200000 { - return true - } - - // word B6CC1C76: libopcodes inexplicably says 'uxtab16lt r1, ip, r6, ROR #24' instead of 'uxtab16lt r1, ip, r6, ror #24' - if strings.ToLower(dec.text) == text { - return true - } - - // word F410FDA1: libopcodes says PLDW but the manual is clear that PLDW is F5/F7, not F4. - // word F7D0FB17: libopcodes says PLDW but the manual is clear that PLDW has 0x10 clear - if hasPrefix(dec.text, "pld") && raw&0xfd000010 != 0xf5000000 { - return true - } - - // word F650FE14: libopcodes says PLI but the manual is clear that PLI has 0x10 clear - if hasPrefix(dec.text, "pli") && raw&0xff000010 != 0xf6000000 { - return true - } - } - - return false -} - -// Instructions known to libopcodes (or xed) but not to us. -// Most of these are floating point coprocessor instructions. -var unsupported = strings.Fields(` - abs - acs - adf - aes - asn - atn - cdp - cf - cmf - cnf - cos - cps - crc32 - dvf - eret - exp - fadd - fcmp - fcpy - fcvt - fdiv - fdv - fix - fld - flt - fmac - fmd - fml - fmr - fms - fmul - fmx - fneg - fnm - frd - fsit - fsq - fst - fsu - fto - fui - hlt - hvc - lda - ldc - ldf - lfm - lgn - log - mar - mcr - mcrr - mia - mnf - mra - mrc - mrrc - mrs - msr - msr - muf - mvf - nrm - pol - pow - rdf - rfc - rfe - rfs - rmf - rnd - rpw - rsf - sdiv - sev - sfm - sha1 - sha256 - sin - smc - sqt - srs - stc - stf - stl - suf - tan - udf - udiv - urd - vfma - vfms - vfnma - vfnms - vrint - wfc - wfs -`) diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdumpext_test.go b/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdumpext_test.go deleted file mode 100644 index 033e923d1f..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/objdumpext_test.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2014 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. - -// Copied and simplified from ../../x86/x86asm/objdumpext_test.go. - -package armasm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "fmt" - "io" - "log" - "os" - "strconv" - "strings" - "testing" -) - -const objdumpPath = "/usr/local/bin/arm-linux-elf-objdump" - -func testObjdumpARM(t *testing.T, generate func(func([]byte))) { - testObjdumpArch(t, generate, ModeARM) -} - -func testObjdumpArch(t *testing.T, generate func(func([]byte)), arch Mode) { - if testing.Short() { - t.Skip("skipping objdump test in short mode") - } - if _, err := os.Stat(objdumpPath); err != nil { - t.Skip(err) - } - - testExtDis(t, "gnu", arch, objdump, generate, allowedMismatchObjdump) -} - -func objdump(ext *ExtDis) error { - // File already written with instructions; add ELF header. - if ext.Arch == ModeARM { - if err := writeELF32(ext.File, ext.Size); err != nil { - return err - } - } else { - panic("unknown arch") - } - - b, err := ext.Run(objdumpPath, "-d", "-z", ext.File.Name()) - if err != nil { - return err - } - - var ( - nmatch int - reading bool - next uint32 = start - addr uint32 - encbuf [4]byte - enc []byte - text string - ) - flush := func() { - if addr == next { - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int32(uint32(targ)-addr-uint32(len(enc)))) - } - if strings.HasPrefix(text, "stmia") { - text = "stm" + text[5:] - } - if strings.HasPrefix(text, "stmfd") { - text = "stmdb" + text[5:] - } - if strings.HasPrefix(text, "ldmfd") { - text = "ldm" + text[5:] - } - text = strings.Replace(text, "#0.0", "#0", -1) - if text == "undefined" && len(enc) == 4 { - text = "error: unknown instruction" - enc = nil - } - if len(enc) == 4 { - // prints as word but we want to record bytes - enc[0], enc[3] = enc[3], enc[0] - enc[1], enc[2] = enc[2], enc[1] - } - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [4]byte{} - enc = nil - next += 4 - } - } - var textangle = []byte("<.text>:") - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading objdump output: %v", err) - } - if bytes.Contains(line, textangle) { - reading = true - continue - } - if !reading { - continue - } - if debug { - os.Stdout.Write(line) - } - if enc1 := parseContinuation(line, encbuf[:len(enc)]); enc1 != nil { - enc = enc1 - continue - } - flush() - nmatch++ - addr, enc, text = parseLine(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - } - flush() - if next != start+uint32(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -var ( - undefined = []byte("") - unpredictable = []byte("") - illegalShifter = []byte("") -) - -func parseLine(line []byte, encstart []byte) (addr uint32, enc []byte, text string) { - oline := line - i := index(line, ":\t") - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - x, err := strconv.ParseUint(string(trimSpace(line[:i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint32(x) - line = line[i+2:] - i = bytes.IndexByte(line, '\t') - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - enc, ok := parseHex(line[:i], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", oline) - } - line = trimSpace(line[i:]) - if bytes.Contains(line, undefined) { - text = "undefined" - return - } - if bytes.Contains(line, illegalShifter) { - text = "undefined" - return - } - if false && bytes.Contains(line, unpredictable) { - text = "unpredictable" - return - } - if i := bytes.IndexByte(line, ';'); i >= 0 { - line = trimSpace(line[:i]) - } - text = string(fixSpace(line)) - return -} - -func parseContinuation(line []byte, enc []byte) []byte { - i := index(line, ":\t") - if i < 0 { - return nil - } - line = line[i+1:] - enc, _ = parseHex(line, enc) - return enc -} - -// writeELF32 writes an ELF32 header to the file, -// describing a text segment that starts at start -// and extends for size bytes. -func writeELF32(f *os.File, size int) error { - f.Seek(0, io.SeekStart) - var hdr elf.Header32 - var prog elf.Prog32 - var sect elf.Section32 - var buf bytes.Buffer - binary.Write(&buf, binary.LittleEndian, &hdr) - off1 := buf.Len() - binary.Write(&buf, binary.LittleEndian, &prog) - off2 := buf.Len() - binary.Write(&buf, binary.LittleEndian, §) - off3 := buf.Len() - buf.Reset() - data := byte(elf.ELFDATA2LSB) - hdr = elf.Header32{ - Ident: [16]byte{0x7F, 'E', 'L', 'F', 1, data, 1}, - Type: 2, - Machine: uint16(elf.EM_ARM), - Version: 1, - Entry: start, - Phoff: uint32(off1), - Shoff: uint32(off2), - Flags: 0x05000002, - Ehsize: uint16(off1), - Phentsize: uint16(off2 - off1), - Phnum: 1, - Shentsize: uint16(off3 - off2), - Shnum: 3, - Shstrndx: 2, - } - binary.Write(&buf, binary.LittleEndian, &hdr) - prog = elf.Prog32{ - Type: 1, - Off: start, - Vaddr: start, - Paddr: start, - Filesz: uint32(size), - Memsz: uint32(size), - Flags: 5, - Align: start, - } - binary.Write(&buf, binary.LittleEndian, &prog) - binary.Write(&buf, binary.LittleEndian, §) // NULL section - sect = elf.Section32{ - Name: 1, - Type: uint32(elf.SHT_PROGBITS), - Addr: start, - Off: start, - Size: uint32(size), - Flags: uint32(elf.SHF_ALLOC | elf.SHF_EXECINSTR), - Addralign: 4, - } - binary.Write(&buf, binary.LittleEndian, §) // .text - sect = elf.Section32{ - Name: uint32(len("\x00.text\x00")), - Type: uint32(elf.SHT_STRTAB), - Addr: 0, - Off: uint32(off2 + (off3-off2)*3), - Size: uint32(len("\x00.text\x00.shstrtab\x00")), - Addralign: 1, - } - binary.Write(&buf, binary.LittleEndian, §) - buf.WriteString("\x00.text\x00.shstrtab\x00") - f.Write(buf.Bytes()) - return nil -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/Makefile b/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/Makefile deleted file mode 100644 index 1adab68517..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -newdecode.txt: - cd ..; go test -cover -run 'ObjdumpARMCond' -v -timeout 10h -printtests -long 2>&1 | tee log - cd ..; go test -cover -run 'ObjdumpARMUncond' -v -timeout 10h -printtests -long 2>&1 | tee -a log - egrep ' (gnu|plan9) ' ../log |sort >newdecode.txt - diff --git a/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/decode.txt b/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/decode.txt deleted file mode 100644 index 7653ee0643..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm/armasm/testdata/decode.txt +++ /dev/null @@ -1,1600 +0,0 @@ -000001f1| 1 gnu setend le -00100f61| 1 gnu mrsvs r1, apsr -00f02053| 1 gnu noppl -00f0d4f4| 1 gnu pli [r4] -01f020d3| 1 gnu yieldle -02002d59| 1 gnu stmdbpl sp!, {r1} -021da9d8| 1 gnu stmle r9!, {r1, r8, sl, fp, ip} -02c0b071| 1 gnu movsvc ip, r2 -02f02073| 1 gnu wfevc -03f02013| 1 gnu wfine -03f05df7| 1 gnu pld [sp, -r3] -04009d34| 1 gnu popcc {r0} -043a52b1| 1 gnu cmplt r2, r4, lsl #20 -04402de5| 1 gnu push {r4} -045b148d| 1 gnu vldrhi d5, [r4, #-16] -04f02093| 1 gnu sevls -0793eab0| 1 gnu rsclt r9, sl, r7, lsl #6 -079bfb9e| 1 gnu vmovls.f64 d25, #183 -0a4fc9d3| 1 gnu bicle r4, r9, #10, 30 -0bac7ab6| 1 gnu ldrbtlt sl, [sl], -fp, lsl #24 -0c2aee44| 1 gnu strbtmi r2, [lr], #2572 -0c4bb000| 1 gnu adcseq r4, r0, ip, lsl #22 -0e26d561| 1 gnu bicsvs r2, r5, lr, lsl #12 -0f0fa011| 1 gnu lslne r0, pc, #30 -0fa448e0| 1 gnu sub sl, r8, pc, lsl #8 -101af1de| 1 gnu vmrsle r1, fpscr -108a0cee| 1 gnu vmov s24, r8 -108a1dae| 1 gnu vmovge r8, s26 -108ae14e| 1 gnu vmsrmi fpscr, r8 -10faf1ae| 1 gnu vmrsge apsr_nzcv, fpscr -10fb052e| 1 gnu vmovcs.32 d5[0], pc -11c902b7| 1 gnu smladlt r2, r1, r9, ip -11ef5b16| 1 gnu uadd16ne lr, fp, r1 -12fa87a7| 1 gnu usad8ge r7, r2, sl -135f2956| 1 gnu qadd16pl r5, r9, r3 -13de9aa1| 1 gnu orrsge sp, sl, r3, lsl lr -145c0e40| 1 gnu andmi r5, lr, r4, lsl ip -150f7fd6| 1 gnu uhadd16le r0, pc, r5 -15b9bf12| 1 gnu adcsne fp, pc, #344064 -16373391| 1 gnu teqls r3, r6, lsl r7 -19ef1966| 1 gnu sadd16vs lr, r9, r9 -1ab0b091| 1 gnu lslsls fp, sl, r0 -1b9f6fe6| 1 gnu uqadd16 r9, pc, fp -1bb58557| 1 gnu usada8pl r5, fp, r5, fp -1beff8e0| 1 gnu rscs lr, r8, fp, lsl pc -1caff0e6| 1 gnu usat sl, #16, ip, lsl #30 -1d0f3d36| 1 gnu shadd16cc r0, sp, sp -1dca1d52| 1 gnu andspl ip, sp, #118784 -1e4891d0| 1 gnu addsle r4, r1, lr, lsl r8 -1f0889e6| 1 gnu pkhbt r0, r9, pc, lsl #16 -1f1f6fe1| 1 gnu clz r1, pc -1f26d157| 1 gnu bfcpl r2, #12, #6 -1ff07ff5| 1 gnu clrex -1fff2fd1| 1 gnu bxle pc -20f153f6| 1 gnu pli [r3, -r0, lsr #2] -21047013| 1 gnu cmnne r0, #553648128 -21c2eb8b| 1 gnu blhi .-0x50f778 -21c2ebfb| 1 gnu blx .-0x50f776 -21fa62ee| 1 gnu vmul.f32 s31, s4, s3 -23005720| 1 gnu subscs r0, r7, r3, lsr #32 -236a303e| 1 gnu vaddcc.f32 s12, s0, s7 -23f055f6| 1 gnu pli [r5, -r3, lsr #32] -2430a031| 1 gnu lsrcc r3, r4, #32 -245d0803| 1 gnu movweq r5, #36132 -251a86be| 1 gnu vdivlt.f32 s2, s12, s11 -25db7b81| 1 gnu cmnhi fp, r5, lsr #22 -26bc3553| 1 gnu teqpl r5, #9728 -277c2d69| 1 gnu pushvs {r0, r1, r2, r5, sl, fp, ip, sp, lr} -29fc1cf5| 1 gnu pldw [ip, #-3113] -29ff2fc1| 1 gnu bxjgt r9 -2decd9c0| 1 gnu sbcsgt lr, r9, sp, lsr #24 -30fa5e47| 1 gnu smmulrmi lr, r0, sl -316f64d6| 1 gnu uqasxle r6, r4, r1 -323f5da6| 1 gnu uasxge r3, sp, r2 -327fe5e6| 1 gnu usat16 r7, #5, r2 -330151e3| 1 gnu cmp r1, #-1073741812 -34af2ae6| 1 gnu qasx sl, sl, r4 -35fd3710| 1 gnu eorsne pc, r7, r5, lsr sp -36def1c1| 1 gnu mvnsgt sp, r6, lsr lr -3801b061| 1 gnu lsrsvs r0, r8, r1 -38985477| 1 gnu smmlarvc r4, r8, r8, r9 -3a2fbfa6| 1 gnu revge r2, sl -3a3f1b06| 1 gnu sasxeq r3, fp, sl -3a7fa346| 1 gnu ssat16mi r7, #4, sl -3a943b94| 1 gnu ldrtls r9, [fp], #-1082 -3bf505e7| 1 gnu smuadx r5, fp, r5 -3cef7086| 1 gnu uhasxhi lr, r0, ip -3e5f3ec6| 1 gnu shasxgt r5, lr, lr -3f4fff86| 1 gnu rbithi r4, pc -3faf4717| 1 gnu smlaldxne sl, r7, pc, pc -3fff2fc1| 1 gnu blxgt pc -402bbf7e| 1 gnu vcvtvc.u16.f64 d2, d2, #16 -403ab5de| 1 gnu vcmple.f32 s6, #0 -40eb363e| 1 gnu vsubcc.f64 d14, d6, d0 -420f73d1| 1 gnu cmnle r3, r2, asr #30 -424a648e| 1 gnu vnmulhi.f32 s9, s8, s4 -4284d717| 1 gnu ldrbne r8, [r7, r2, asr #8] -42a599c3| 1 gnu orrsgt sl, r9, #276824064 -42abf0be| 1 gnu vmovlt.f64 d26, d2 -446ea031| 1 gnu asrcc r6, r4, #28 -4a953557| 1 gnu ldrpl r9, [r5, -sl, asr #10]! -4ab6f712| 1 gnu rscsne fp, r7, #77594624 -4af07ff5| 1 gnu dsb #10 -4df6def4| 1 gnu pli [lr, #1613] -4efbf52e| 1 gnu vcmpcs.f64 d31, #0 -50aaac79| 1 gnu stmibvc ip!, {r4, r6, r9, fp, sp, pc} -50caf011| 1 gnu mvnsne ip, r0, asr sl -50f04961| 1 gnu qdaddvs pc, r0, r9 -51282008| 1 gnu stmdaeq r0!, {r0, r4, r6, fp, sp} -52bf6576| 1 gnu uqsaxvc fp, r5, r2 -5345c9d0| 1 gnu sbcle r4, r9, r3, asr r5 -538f5e46| 1 gnu usaxmi r8, lr, r3 -54106d31| 1 gnu qdsubcc r1, r4, sp -56e0e557| 1 gnu ubfxpl lr, r6, #0, #6 -57073d11| 1 gnu teqne sp, r7, asr r7 -58bb0aa9| 1 gnu stmdbge sl, {r3, r4, r6, r8, r9, fp, ip, sp, pc} -58f007b1| 1 gnu qaddlt pc, r8, r7 -59fd0e77| 1 gnu smusdvc lr, r9, sp -5ab7f1c5| 1 gnu ldrbgt fp, [r1, #1882]! -5abf23c6| 1 gnu qsaxgt fp, r3, sl -5b8f1c96| 1 gnu ssaxls r8, ip, fp -5b98ab97| 1 gnu sbfxls r9, fp, #16, #12 -5bc9b041| 1 gnu asrsmi ip, fp, r9 -5bf07ff5| 1 gnu dmb #11 -5c102b81| 1 gnu qsubhi r1, ip, fp -5caa49e1| 1 gnu qdadd sl, ip, r9 -5d3f7226| 1 gnu uhsaxcs r3, r2, sp -5db55470| 1 gnu subsvc fp, r4, sp, asr r5 -5ef14387| 1 gnu smlsldhi pc, r3, lr, r1 -5f540a11| 1 gnu qaddne r5, pc, sl -5f9079d1| 1 gnu cmnle r9, pc, asr r0 -5faf3f66| 1 gnu shsaxvs sl, pc, pc -605071d7| 1 gnu ldrble r5, [r1, -r0, rrx]! -614adc76| 1 gnu ldrbvc r4, [ip], r1, ror #20 -616b9e42| 1 gnu addsmi r6, lr, #99328 -62c84f15| 1 gnu strbne ip, [pc, #-2146] -62f051f7| 1 gnu pld [r1, -r2, rrx] -6346c393| 1 gnu bicls r4, r3, #103809024 -654abbae| 1 gnu vcvtge.f32.u16 s8, s8, #5 -65a5f0e3| 1 gnu mvns sl, #423624704 -65f796f7| 1 gnu pldw [r6, r5, ror #14] -670bb12e| 1 gnu vnegcs.f64 d0, d23 -67903731| 1 gnu teqcc r7, r7, rrx -68ddc637| 1 gnu strbcc sp, [r6, r8, ror #26] -695b3ab6| 1 gnu ldrtlt r5, [sl], -r9, ror #22 -697cfc71| 1 gnu mvnsvc r7, r9, ror #24 -6a0ab3ee| 1 gnu vcvtb.f16.f32 s0, s21 -6ad9ad54| 1 gnu strtpl sp, [sp], #2410 -6af07ff5| 1 gnu isb #10 -6afa6f10| 1 gnu rsbne pc, pc, sl, ror #20 -6d5b19ee| 1 gnu vnmla.f64 d5, d9, d29 -6d60b071| 1 gnu rrxsvc r6, sp -6df754f7| 1 gnu pld [r4, -sp, ror #14] -70065821| 1 gnu cmpcs r8, r0, ror r6 -7050ed86| 1 gnu uxtabhi r5, sp, r0 -715f1186| 1 gnu ssub16hi r5, r1, r1 -716c9805| 1 gnu ldreq r6, [r8, #3185] -718d5ab1| 1 gnu cmplt sl, r1, ror sp -71c8cfb6| 1 gnu uxtb16lt ip, r1, ror #16 -7294af06| 1 gnu sxtbeq r9, r2, ror #8 -72c0bac6| 1 gnu sxtahgt ip, sl, r2 -730f6716| 1 gnu uqsub16ne r0, r7, r3 -73608f46| 1 gnu sxtb16mi r6, r3 -73687f22| 1 gnu rsbscs r6, pc, #7536640 -74308816| 1 gnu sxtab16ne r3, r8, r4 -757f3456| 1 gnu shsub16pl r7, r4, r5 -77788016| 1 gnu sxtab16ne r7, r0, r7, ror #16 -78061671| 1 gnu tstvc r6, r8, ror r6 -780a2fe1| 1 gnu bkpt 0xf0a8 -7850abd6| 1 gnu sxtable r5, fp, r8 -792cef26| 1 gnu uxtbcs r2, r9, ror #24 -799eb8e0| 1 gnu adcs r9, r8, r9, ror lr -799f5726| 1 gnu usub16cs r9, r7, r9 -79d0bf16| 1 gnu sxthne sp, r9 -7a037ba1| 1 gnu cmnge fp, sl, ror r3 -7b0f2566| 1 gnu qsub16vs r0, r5, fp -7b79dd51| 1 gnu bicspl r7, sp, fp, ror r9 -7b9a9f1d| 1 gnu vldrne s18, [pc, #492] -7c70cea6| 1 gnu uxtab16ge r7, lr, ip -7d48f966| 1 gnu uxtahvs r4, r9, sp, ror #16 -7d5c13a1| 1 gnu tstge r3, sp, ror ip -7e0001f1| 1 gnu setend le -7e1c0ba7| 1 gnu smlsdxge fp, lr, ip, r1 -7e567e40| 1 gnu rsbsmi r5, lr, lr, ror r6 -7e8f73b6| 1 gnu uhsub16lt r8, r3, lr -7ef0ffd6| 1 gnu uxthle pc, lr -7faaa011| 1 gnu rorne sl, pc, sl -81f19af7| 1 gnu pldw [sl, r1, lsl #3] -82033901| 1 gnu teqeq r9, r2, lsl #7 -82f316f5| 1 gnu pldw [r6, #-898] -830201f1| 1 gnu setend be -838a3b91| 1 gnu teqls fp, r3, lsl #21 -8408af2f| 1 gnu svccs 0x00af0884 -884201d1| 1 gnu smlabble r1, r8, r2, r4 -8aa12e31| 1 gnu smlawbcc lr, sl, r1, sl -8b9b99c0| 1 gnu addsgt r9, r9, fp, lsl #23 -8c005c81| 1 gnu cmphi ip, ip, lsl #1 -8fb429c6| 1 gnu strtgt fp, [r9], -pc, lsl #9 -907b1f9e| 1 gnu vmovls.32 r7, d31[0] -91975f25| 1 gnu ldrbcs r9, [pc, #-1937] -91b010e3| 1 gnu tst r0, #145 -927facb1| 1 gnu strexdlt r7, r2, [ip] -92904c91| 1 gnu swpbls r9, r2, [ip] -92af1226| 1 gnu sadd8cs sl, r2, r2 -92b28c70| 1 gnu umullvc fp, ip, r2, r2 -945f68a6| 1 gnu uqadd8ge r5, r8, r4 -950b2560| 1 gnu mlavs r5, r5, fp, r0 -969fcf71| 1 gnu strexbvc r9, r6, [pc] -96cf35e6| 1 gnu shadd8 ip, r5, r6 -98060eb0| 1 gnu mullt lr, r8, r6 -9843fb93| 1 gnu mvnsls r4, #152, 6 -9a3fe2b0| 1 gnu smlallt r3, r2, sl, pc -9aef58b6| 1 gnu uadd8lt lr, r8, sl -9afcdff5| 1 gnu pld [pc, #3226] -9c221810| 1 gnu mulsne r8, ip, r2 -9c3bc9dd| 1 gnu vstrle d19, [r9, #624] -9c5f2606| 1 gnu qadd8eq r5, r6, ip -9d87dac0| 1 gnu smullsgt r8, sl, sp, r7 -9e0f7c86| 1 gnu uhadd8hi r0, ip, lr -9e814560| 1 gnu umaalvs r8, r5, lr, r1 -9e9f8dc1| 1 gnu strexgt r9, lr, [sp] -9ec3c9d7| 1 gnu bfile ip, lr, #7, #3 -9ed26d90| 1 gnu mlsls sp, lr, r2, sp -9f7fd9c1| 1 gnu ldrexbgt r7, [r9] -9f7fea91| 1 gnu strexhls r7, pc, [sl] -9f9f9921| 1 gnu ldrexcs r9, [r9] -9faffd21| 1 gnu ldrexhcs sl, [sp] -9fcfbd61| 1 gnu ldrexdvs ip, [sp] -9ff7a710| 1 gnu umlalne pc, r7, pc, r7 -a05459d3| 1 gnu cmple r9, #160, 8 -a3062be1| 1 gnu smulwb fp, r3, r6 -a68a92b1| 1 gnu orrslt r8, r2, r6, lsr #21 -abff55f6| 1 gnu pli [r5, -fp, lsr #31] -addbf8ea| 1 gnu b .-0x1c9148 -ae79b021| 1 gnu lsrscs r7, lr, #19 -b590a3b1| 1 gnu strhlt r9, [r3, r5]! -b5b2e390| 1 gnu strhtls fp, [r3], #37 -b6ac4e30| 1 gnu strhcc sl, [lr], #-198 -b73fff86| 1 gnu revshhi r3, r7 -b75fbfc6| 1 gnu rev16gt r5, r7 -b80b7c80| 1 gnu ldrhthi r0, [ip], #-184 -b82035e0| 1 gnu ldrht r2, [r5], -r8 -b8877391| 1 gnu ldrhls r8, [r3, #-120]! -b9703e41| 1 gnu ldrhmi r7, [lr, -r9]! -b9cf8c16| 1 gnu selne ip, ip, r9 -bd81bd58| 1 gnu poppl {r0, r2, r3, r4, r5, r7, r8, pc} -bdfdb469| 1 gnu ldmibvs r4!, {r0, r2, r3, r4, r5, r7, r8, sl, fp, ip, sp, lr, pc} -beb02500| 1 gnu strhteq fp, [r5], -lr -bf1a5e42| 1 gnu subsmi r1, lr, #782336 -c19a4d5e| 1 gnu vmlspl.f32 s19, s27, s2 -c1aab15e| 1 gnu vsqrtpl.f32 s20, s2 -c354b003| 1 gnu movseq r5, #-1023410176 -c4091dc1| 1 gnu tstgt sp, r4, asr #19 -c50e13a9| 1 gnu ldmdbge r3, {r0, r2, r6, r7, r9, sl, fp} -c68c8637| 1 gnu strcc r8, [r6, r6, asr #25] -c6ad48e3| 1 gnu movt sl, #36294 -c6f65ff5| 1 gnu pld [pc, #-1734] -c8a92f10| 1 gnu eorne sl, pc, r8, asr #19 -c9016b61| 1 gnu smulbtvs fp, r9, r1 -cadbf49e| 1 gnu vcmpels.f64 d29, d10 -ce9de476| 1 gnu strbtvc r9, [r4], lr, asr #27 -cf3c1ab1| 1 gnu tstlt sl, pc, asr #25 -d355aab6| 1 gnu ssatlt r5, #11, r3, asr #11 -d4f4df10| 1 gnu ldrsbne pc, [pc], #68 -d6530d61| 1 gnu ldrdvs r5, [sp, -r6] -d74d7800| 1 gnu ldrsbteq r4, [r8], #-215 -d9703680| 1 gnu ldrsbthi r7, [r6], -r9 -dbe003c0| 1 gnu ldrdgt lr, [r3], -fp -dc709561| 1 gnu ldrsbvs r7, [r5, ip] -dcc3b9c8| 1 gnu ldmgt r9!, {r2, r3, r4, r6, r7, r8, r9, lr, pc} -debfa0e5| 1 gnu str fp, [r0, #4062]! -dee062a1| 1 gnu ldrdge lr, [r2, #-14]! -dfa05ab7| 1 gnu smmlslt sl, pc, r0, sl -e02ef011| 1 gnu mvnsne r2, r0, ror #29 -e4d41718| 1 gnu ldmdane r7, {r2, r5, r6, r7, sl, ip, lr, pc} -e6d0fe34| 1 gnu ldrbtcc sp, [lr], #230 -e73bf7be| 1 gnu vcvtlt.f32.f64 s7, d23 -e74e72b3| 1 gnu cmnlt r2, #3696 -e80bf07e| 1 gnu vabsvc.f64 d16, d24 -e9b5b001| 1 gnu rorseq fp, r9, #11 -ea7bbdbe| 1 gnu vcvtlt.s32.f64 s14, d26 -ec063813| 1 gnu teqne r8, #236, 12 -ec0e49e1| 1 gnu smlaltt r0, r9, ip, lr -ee4ab85e| 1 gnu vcvtpl.f32.s32 s8, s29 -ef461f25| 1 gnu ldrcs r4, [pc, #-1775] -ef5fd002| 1 gnu sbcseq r5, r0, #956 -f4cf1d36| 1 gnu ssub8cc ip, sp, r4 -f67f73b6| 1 gnu uhsub8lt r7, r3, r6 -f6e09ca0| 1 gnu ldrshge lr, [ip], r6 -f7702e32| 1 gnu eorcc r7, lr, #247 -fa4dcf20| 1 gnu strdcs r4, [pc], #218 -fac03720| 1 gnu ldrshtcs ip, [r7], -sl -fc0f64c6| 1 gnu uqsub8gt r0, r4, ip -fc28f481| 1 gnu ldrshhi r2, [r4, #140]! -fc300560| 1 gnu strdvs r3, [r5], -ip -fcacfc70| 1 gnu ldrshtvc sl, [ip], #204 -fdbcfaf7| 1 gnu undef -fddf5c86| 1 gnu usub8hi sp, ip, sp -fdf02013| 1 gnu dbgne #13 -fe0319e3| 1 gnu tst r9, #-134217725 -fe7f3116| 1 gnu shsub8ne r7, r1, lr -ff4f2ac6| 1 gnu qsub8gt r4, sl, pc -ff818c71| 1 gnu strdvc r8, [ip, pc] -|6b5721d3 1 gnu error: unknown instruction -|76452001 1 gnu error: unknown instruction -|97acd647 1 gnu error: unknown instruction -11f71507| 1 plan9 SDIV.EQ R7, R1, R5 -15f715e7| 1 plan9 SDIV R7, R5, R5 -11f93517| 1 plan9 UDIV.NE R9, R1, R5 -12fb33e7| 1 plan9 UDIV R11, R2, R3 -ed003be9| 1 plan9 LDMDB [R0,R2-R3,R5-R7], R11! -923124e0| 1 plan9 MLA R1, R2, R3, R4 -923134e0| 1 plan9 MLA.S R1, R2, R3, R4 -923164e0| 1 plan9 MLS R1, R2, R3, R4 -ff1000e2| 1 plan9 AND $255, R0, R1 -ff1400e2| 1 plan9 AND $4278190080, R0, R1 -ff1010e2| 1 plan9 AND.S $255, R0, R1 -ff1410e2| 1 plan9 AND.S $4278190080, R0, R1 -ff0000e2| 1 plan9 AND $255, R0, R0 -ff0400e2| 1 plan9 AND $4278190080, R0, R0 -ff0010e2| 1 plan9 AND.S $255, R0, R0 -ff0410e2| 1 plan9 AND.S $4278190080, R0, R0 -002001e0| 1 plan9 AND R0, R1, R2 -002011e0| 1 plan9 AND.S R0, R1, R2 -001001e0| 1 plan9 AND R0, R1, R1 -001011e0| 1 plan9 AND.S R0, R1, R1 -202e01e0| 1 plan9 AND R0>>$28, R1, R2 -002e01e0| 1 plan9 AND R0<<$28, R1, R2 -402e01e0| 1 plan9 AND R0->$28, R1, R2 -602e01e0| 1 plan9 AND R0@>$28, R1, R2 -202e11e0| 1 plan9 AND.S R0>>$28, R1, R2 -002e11e0| 1 plan9 AND.S R0<<$28, R1, R2 -402e11e0| 1 plan9 AND.S R0->$28, R1, R2 -602e11e0| 1 plan9 AND.S R0@>$28, R1, R2 -001e01e0| 1 plan9 AND R0<<$28, R1, R1 -201e01e0| 1 plan9 AND R0>>$28, R1, R1 -401e01e0| 1 plan9 AND R0->$28, R1, R1 -601e01e0| 1 plan9 AND R0@>$28, R1, R1 -001e11e0| 1 plan9 AND.S R0<<$28, R1, R1 -201e11e0| 1 plan9 AND.S R0>>$28, R1, R1 -401e11e0| 1 plan9 AND.S R0->$28, R1, R1 -601e11e0| 1 plan9 AND.S R0@>$28, R1, R1 -103102e0| 1 plan9 AND R0<>R1, R2, R3 -503102e0| 1 plan9 AND R0->R1, R2, R3 -703102e0| 1 plan9 AND R0@>R1, R2, R3 -103112e0| 1 plan9 AND.S R0<>R1, R2, R3 -503112e0| 1 plan9 AND.S R0->R1, R2, R3 -703112e0| 1 plan9 AND.S R0@>R1, R2, R3 -102102e0| 1 plan9 AND R0<>R1, R2, R2 -502102e0| 1 plan9 AND R0->R1, R2, R2 -702102e0| 1 plan9 AND R0@>R1, R2, R2 -102112e0| 1 plan9 AND.S R0<>R1, R2, R2 -502112e0| 1 plan9 AND.S R0->R1, R2, R2 -702112e0| 1 plan9 AND.S R0@>R1, R2, R2 -ff1020e2| 1 plan9 EOR $255, R0, R1 -ff1420e2| 1 plan9 EOR $4278190080, R0, R1 -ff1030e2| 1 plan9 EOR.S $255, R0, R1 -ff1430e2| 1 plan9 EOR.S $4278190080, R0, R1 -ff0020e2| 1 plan9 EOR $255, R0, R0 -ff0420e2| 1 plan9 EOR $4278190080, R0, R0 -ff0030e2| 1 plan9 EOR.S $255, R0, R0 -ff0430e2| 1 plan9 EOR.S $4278190080, R0, R0 -002021e0| 1 plan9 EOR R0, R1, R2 -002031e0| 1 plan9 EOR.S R0, R1, R2 -001021e0| 1 plan9 EOR R0, R1, R1 -001031e0| 1 plan9 EOR.S R0, R1, R1 -202e21e0| 1 plan9 EOR R0>>$28, R1, R2 -002e21e0| 1 plan9 EOR R0<<$28, R1, R2 -402e21e0| 1 plan9 EOR R0->$28, R1, R2 -602e21e0| 1 plan9 EOR R0@>$28, R1, R2 -202e31e0| 1 plan9 EOR.S R0>>$28, R1, R2 -002e31e0| 1 plan9 EOR.S R0<<$28, R1, R2 -402e31e0| 1 plan9 EOR.S R0->$28, R1, R2 -602e31e0| 1 plan9 EOR.S R0@>$28, R1, R2 -001e21e0| 1 plan9 EOR R0<<$28, R1, R1 -201e21e0| 1 plan9 EOR R0>>$28, R1, R1 -401e21e0| 1 plan9 EOR R0->$28, R1, R1 -601e21e0| 1 plan9 EOR R0@>$28, R1, R1 -001e31e0| 1 plan9 EOR.S R0<<$28, R1, R1 -201e31e0| 1 plan9 EOR.S R0>>$28, R1, R1 -401e31e0| 1 plan9 EOR.S R0->$28, R1, R1 -601e31e0| 1 plan9 EOR.S R0@>$28, R1, R1 -103122e0| 1 plan9 EOR R0<>R1, R2, R3 -503122e0| 1 plan9 EOR R0->R1, R2, R3 -703122e0| 1 plan9 EOR R0@>R1, R2, R3 -103132e0| 1 plan9 EOR.S R0<>R1, R2, R3 -503132e0| 1 plan9 EOR.S R0->R1, R2, R3 -703132e0| 1 plan9 EOR.S R0@>R1, R2, R3 -102122e0| 1 plan9 EOR R0<>R1, R2, R2 -502122e0| 1 plan9 EOR R0->R1, R2, R2 -702122e0| 1 plan9 EOR R0@>R1, R2, R2 -102132e0| 1 plan9 EOR.S R0<>R1, R2, R2 -502132e0| 1 plan9 EOR.S R0->R1, R2, R2 -702132e0| 1 plan9 EOR.S R0@>R1, R2, R2 -ff1080e3| 1 plan9 ORR $255, R0, R1 -ff1480e3| 1 plan9 ORR $4278190080, R0, R1 -ff1090e3| 1 plan9 ORR.S $255, R0, R1 -ff1490e3| 1 plan9 ORR.S $4278190080, R0, R1 -ff0080e3| 1 plan9 ORR $255, R0, R0 -ff0480e3| 1 plan9 ORR $4278190080, R0, R0 -ff0090e3| 1 plan9 ORR.S $255, R0, R0 -ff0490e3| 1 plan9 ORR.S $4278190080, R0, R0 -002081e1| 1 plan9 ORR R0, R1, R2 -002091e1| 1 plan9 ORR.S R0, R1, R2 -001081e1| 1 plan9 ORR R0, R1, R1 -001091e1| 1 plan9 ORR.S R0, R1, R1 -202e81e1| 1 plan9 ORR R0>>$28, R1, R2 -002e81e1| 1 plan9 ORR R0<<$28, R1, R2 -402e81e1| 1 plan9 ORR R0->$28, R1, R2 -602e81e1| 1 plan9 ORR R0@>$28, R1, R2 -202e91e1| 1 plan9 ORR.S R0>>$28, R1, R2 -002e91e1| 1 plan9 ORR.S R0<<$28, R1, R2 -402e91e1| 1 plan9 ORR.S R0->$28, R1, R2 -602e91e1| 1 plan9 ORR.S R0@>$28, R1, R2 -001e81e1| 1 plan9 ORR R0<<$28, R1, R1 -201e81e1| 1 plan9 ORR R0>>$28, R1, R1 -401e81e1| 1 plan9 ORR R0->$28, R1, R1 -601e81e1| 1 plan9 ORR R0@>$28, R1, R1 -001e91e1| 1 plan9 ORR.S R0<<$28, R1, R1 -201e91e1| 1 plan9 ORR.S R0>>$28, R1, R1 -401e91e1| 1 plan9 ORR.S R0->$28, R1, R1 -601e91e1| 1 plan9 ORR.S R0@>$28, R1, R1 -103182e1| 1 plan9 ORR R0<>R1, R2, R3 -503182e1| 1 plan9 ORR R0->R1, R2, R3 -703182e1| 1 plan9 ORR R0@>R1, R2, R3 -103192e1| 1 plan9 ORR.S R0<>R1, R2, R3 -503192e1| 1 plan9 ORR.S R0->R1, R2, R3 -703192e1| 1 plan9 ORR.S R0@>R1, R2, R3 -102182e1| 1 plan9 ORR R0<>R1, R2, R2 -502182e1| 1 plan9 ORR R0->R1, R2, R2 -702182e1| 1 plan9 ORR R0@>R1, R2, R2 -102192e1| 1 plan9 ORR.S R0<>R1, R2, R2 -502192e1| 1 plan9 ORR.S R0->R1, R2, R2 -702192e1| 1 plan9 ORR.S R0@>R1, R2, R2 -ff1040e2| 1 plan9 SUB $255, R0, R1 -ff1440e2| 1 plan9 SUB $4278190080, R0, R1 -ff1050e2| 1 plan9 SUB.S $255, R0, R1 -ff1450e2| 1 plan9 SUB.S $4278190080, R0, R1 -ff0040e2| 1 plan9 SUB $255, R0, R0 -ff0440e2| 1 plan9 SUB $4278190080, R0, R0 -ff0050e2| 1 plan9 SUB.S $255, R0, R0 -ff0450e2| 1 plan9 SUB.S $4278190080, R0, R0 -002041e0| 1 plan9 SUB R0, R1, R2 -002051e0| 1 plan9 SUB.S R0, R1, R2 -001041e0| 1 plan9 SUB R0, R1, R1 -001051e0| 1 plan9 SUB.S R0, R1, R1 -202e41e0| 1 plan9 SUB R0>>$28, R1, R2 -002e41e0| 1 plan9 SUB R0<<$28, R1, R2 -402e41e0| 1 plan9 SUB R0->$28, R1, R2 -602e41e0| 1 plan9 SUB R0@>$28, R1, R2 -202e51e0| 1 plan9 SUB.S R0>>$28, R1, R2 -002e51e0| 1 plan9 SUB.S R0<<$28, R1, R2 -402e51e0| 1 plan9 SUB.S R0->$28, R1, R2 -602e51e0| 1 plan9 SUB.S R0@>$28, R1, R2 -001e41e0| 1 plan9 SUB R0<<$28, R1, R1 -201e41e0| 1 plan9 SUB R0>>$28, R1, R1 -401e41e0| 1 plan9 SUB R0->$28, R1, R1 -601e41e0| 1 plan9 SUB R0@>$28, R1, R1 -001e51e0| 1 plan9 SUB.S R0<<$28, R1, R1 -201e51e0| 1 plan9 SUB.S R0>>$28, R1, R1 -401e51e0| 1 plan9 SUB.S R0->$28, R1, R1 -601e51e0| 1 plan9 SUB.S R0@>$28, R1, R1 -103142e0| 1 plan9 SUB R0<>R1, R2, R3 -503142e0| 1 plan9 SUB R0->R1, R2, R3 -703142e0| 1 plan9 SUB R0@>R1, R2, R3 -103152e0| 1 plan9 SUB.S R0<>R1, R2, R3 -503152e0| 1 plan9 SUB.S R0->R1, R2, R3 -703152e0| 1 plan9 SUB.S R0@>R1, R2, R3 -102142e0| 1 plan9 SUB R0<>R1, R2, R2 -502142e0| 1 plan9 SUB R0->R1, R2, R2 -702142e0| 1 plan9 SUB R0@>R1, R2, R2 -102152e0| 1 plan9 SUB.S R0<>R1, R2, R2 -502152e0| 1 plan9 SUB.S R0->R1, R2, R2 -702152e0| 1 plan9 SUB.S R0@>R1, R2, R2 -ff10c0e2| 1 plan9 SBC $255, R0, R1 -ff14c0e2| 1 plan9 SBC $4278190080, R0, R1 -ff10d0e2| 1 plan9 SBC.S $255, R0, R1 -ff14d0e2| 1 plan9 SBC.S $4278190080, R0, R1 -ff00c0e2| 1 plan9 SBC $255, R0, R0 -ff04c0e2| 1 plan9 SBC $4278190080, R0, R0 -ff00d0e2| 1 plan9 SBC.S $255, R0, R0 -ff04d0e2| 1 plan9 SBC.S $4278190080, R0, R0 -0020c1e0| 1 plan9 SBC R0, R1, R2 -0020d1e0| 1 plan9 SBC.S R0, R1, R2 -0010c1e0| 1 plan9 SBC R0, R1, R1 -0010d1e0| 1 plan9 SBC.S R0, R1, R1 -202ec1e0| 1 plan9 SBC R0>>$28, R1, R2 -002ec1e0| 1 plan9 SBC R0<<$28, R1, R2 -402ec1e0| 1 plan9 SBC R0->$28, R1, R2 -602ec1e0| 1 plan9 SBC R0@>$28, R1, R2 -202ed1e0| 1 plan9 SBC.S R0>>$28, R1, R2 -002ed1e0| 1 plan9 SBC.S R0<<$28, R1, R2 -402ed1e0| 1 plan9 SBC.S R0->$28, R1, R2 -602ed1e0| 1 plan9 SBC.S R0@>$28, R1, R2 -001ec1e0| 1 plan9 SBC R0<<$28, R1, R1 -201ec1e0| 1 plan9 SBC R0>>$28, R1, R1 -401ec1e0| 1 plan9 SBC R0->$28, R1, R1 -601ec1e0| 1 plan9 SBC R0@>$28, R1, R1 -001ed1e0| 1 plan9 SBC.S R0<<$28, R1, R1 -201ed1e0| 1 plan9 SBC.S R0>>$28, R1, R1 -401ed1e0| 1 plan9 SBC.S R0->$28, R1, R1 -601ed1e0| 1 plan9 SBC.S R0@>$28, R1, R1 -1031c2e0| 1 plan9 SBC R0<>R1, R2, R3 -5031c2e0| 1 plan9 SBC R0->R1, R2, R3 -7031c2e0| 1 plan9 SBC R0@>R1, R2, R3 -1031d2e0| 1 plan9 SBC.S R0<>R1, R2, R3 -5031d2e0| 1 plan9 SBC.S R0->R1, R2, R3 -7031d2e0| 1 plan9 SBC.S R0@>R1, R2, R3 -1021c2e0| 1 plan9 SBC R0<>R1, R2, R2 -5021c2e0| 1 plan9 SBC R0->R1, R2, R2 -7021c2e0| 1 plan9 SBC R0@>R1, R2, R2 -1021d2e0| 1 plan9 SBC.S R0<>R1, R2, R2 -5021d2e0| 1 plan9 SBC.S R0->R1, R2, R2 -7021d2e0| 1 plan9 SBC.S R0@>R1, R2, R2 -ff1060e2| 1 plan9 RSB $255, R0, R1 -ff1460e2| 1 plan9 RSB $4278190080, R0, R1 -ff1070e2| 1 plan9 RSB.S $255, R0, R1 -ff1470e2| 1 plan9 RSB.S $4278190080, R0, R1 -ff0060e2| 1 plan9 RSB $255, R0, R0 -ff0460e2| 1 plan9 RSB $4278190080, R0, R0 -ff0070e2| 1 plan9 RSB.S $255, R0, R0 -ff0470e2| 1 plan9 RSB.S $4278190080, R0, R0 -002061e0| 1 plan9 RSB R0, R1, R2 -002071e0| 1 plan9 RSB.S R0, R1, R2 -001061e0| 1 plan9 RSB R0, R1, R1 -001071e0| 1 plan9 RSB.S R0, R1, R1 -202e61e0| 1 plan9 RSB R0>>$28, R1, R2 -002e61e0| 1 plan9 RSB R0<<$28, R1, R2 -402e61e0| 1 plan9 RSB R0->$28, R1, R2 -602e61e0| 1 plan9 RSB R0@>$28, R1, R2 -202e71e0| 1 plan9 RSB.S R0>>$28, R1, R2 -002e71e0| 1 plan9 RSB.S R0<<$28, R1, R2 -402e71e0| 1 plan9 RSB.S R0->$28, R1, R2 -602e71e0| 1 plan9 RSB.S R0@>$28, R1, R2 -001e61e0| 1 plan9 RSB R0<<$28, R1, R1 -201e61e0| 1 plan9 RSB R0>>$28, R1, R1 -401e61e0| 1 plan9 RSB R0->$28, R1, R1 -601e61e0| 1 plan9 RSB R0@>$28, R1, R1 -001e71e0| 1 plan9 RSB.S R0<<$28, R1, R1 -201e71e0| 1 plan9 RSB.S R0>>$28, R1, R1 -401e71e0| 1 plan9 RSB.S R0->$28, R1, R1 -601e71e0| 1 plan9 RSB.S R0@>$28, R1, R1 -103162e0| 1 plan9 RSB R0<>R1, R2, R3 -503162e0| 1 plan9 RSB R0->R1, R2, R3 -703162e0| 1 plan9 RSB R0@>R1, R2, R3 -103172e0| 1 plan9 RSB.S R0<>R1, R2, R3 -503172e0| 1 plan9 RSB.S R0->R1, R2, R3 -703172e0| 1 plan9 RSB.S R0@>R1, R2, R3 -102162e0| 1 plan9 RSB R0<>R1, R2, R2 -502162e0| 1 plan9 RSB R0->R1, R2, R2 -702162e0| 1 plan9 RSB R0@>R1, R2, R2 -102172e0| 1 plan9 RSB.S R0<>R1, R2, R2 -502172e0| 1 plan9 RSB.S R0->R1, R2, R2 -702172e0| 1 plan9 RSB.S R0@>R1, R2, R2 -ff10e0e2| 1 plan9 RSC $255, R0, R1 -ff14e0e2| 1 plan9 RSC $4278190080, R0, R1 -ff10f0e2| 1 plan9 RSC.S $255, R0, R1 -ff14f0e2| 1 plan9 RSC.S $4278190080, R0, R1 -ff00e0e2| 1 plan9 RSC $255, R0, R0 -ff04e0e2| 1 plan9 RSC $4278190080, R0, R0 -ff00f0e2| 1 plan9 RSC.S $255, R0, R0 -ff04f0e2| 1 plan9 RSC.S $4278190080, R0, R0 -0020e1e0| 1 plan9 RSC R0, R1, R2 -0020f1e0| 1 plan9 RSC.S R0, R1, R2 -0010e1e0| 1 plan9 RSC R0, R1, R1 -0010f1e0| 1 plan9 RSC.S R0, R1, R1 -202ee1e0| 1 plan9 RSC R0>>$28, R1, R2 -002ee1e0| 1 plan9 RSC R0<<$28, R1, R2 -402ee1e0| 1 plan9 RSC R0->$28, R1, R2 -602ee1e0| 1 plan9 RSC R0@>$28, R1, R2 -202ef1e0| 1 plan9 RSC.S R0>>$28, R1, R2 -002ef1e0| 1 plan9 RSC.S R0<<$28, R1, R2 -402ef1e0| 1 plan9 RSC.S R0->$28, R1, R2 -602ef1e0| 1 plan9 RSC.S R0@>$28, R1, R2 -001ee1e0| 1 plan9 RSC R0<<$28, R1, R1 -201ee1e0| 1 plan9 RSC R0>>$28, R1, R1 -401ee1e0| 1 plan9 RSC R0->$28, R1, R1 -601ee1e0| 1 plan9 RSC R0@>$28, R1, R1 -001ef1e0| 1 plan9 RSC.S R0<<$28, R1, R1 -201ef1e0| 1 plan9 RSC.S R0>>$28, R1, R1 -401ef1e0| 1 plan9 RSC.S R0->$28, R1, R1 -601ef1e0| 1 plan9 RSC.S R0@>$28, R1, R1 -1031e2e0| 1 plan9 RSC R0<>R1, R2, R3 -5031e2e0| 1 plan9 RSC R0->R1, R2, R3 -7031e2e0| 1 plan9 RSC R0@>R1, R2, R3 -1031f2e0| 1 plan9 RSC.S R0<>R1, R2, R3 -5031f2e0| 1 plan9 RSC.S R0->R1, R2, R3 -7031f2e0| 1 plan9 RSC.S R0@>R1, R2, R3 -1021e2e0| 1 plan9 RSC R0<>R1, R2, R2 -5021e2e0| 1 plan9 RSC R0->R1, R2, R2 -7021e2e0| 1 plan9 RSC R0@>R1, R2, R2 -1021f2e0| 1 plan9 RSC.S R0<>R1, R2, R2 -5021f2e0| 1 plan9 RSC.S R0->R1, R2, R2 -7021f2e0| 1 plan9 RSC.S R0@>R1, R2, R2 -ff1080e2| 1 plan9 ADD $255, R0, R1 -ff1480e2| 1 plan9 ADD $4278190080, R0, R1 -ff1090e2| 1 plan9 ADD.S $255, R0, R1 -ff1490e2| 1 plan9 ADD.S $4278190080, R0, R1 -ff0080e2| 1 plan9 ADD $255, R0, R0 -ff0480e2| 1 plan9 ADD $4278190080, R0, R0 -ff0090e2| 1 plan9 ADD.S $255, R0, R0 -ff0490e2| 1 plan9 ADD.S $4278190080, R0, R0 -002081e0| 1 plan9 ADD R0, R1, R2 -002091e0| 1 plan9 ADD.S R0, R1, R2 -001081e0| 1 plan9 ADD R0, R1, R1 -001091e0| 1 plan9 ADD.S R0, R1, R1 -202e81e0| 1 plan9 ADD R0>>$28, R1, R2 -002e81e0| 1 plan9 ADD R0<<$28, R1, R2 -402e81e0| 1 plan9 ADD R0->$28, R1, R2 -602e81e0| 1 plan9 ADD R0@>$28, R1, R2 -202e91e0| 1 plan9 ADD.S R0>>$28, R1, R2 -002e91e0| 1 plan9 ADD.S R0<<$28, R1, R2 -402e91e0| 1 plan9 ADD.S R0->$28, R1, R2 -602e91e0| 1 plan9 ADD.S R0@>$28, R1, R2 -001e81e0| 1 plan9 ADD R0<<$28, R1, R1 -201e81e0| 1 plan9 ADD R0>>$28, R1, R1 -401e81e0| 1 plan9 ADD R0->$28, R1, R1 -601e81e0| 1 plan9 ADD R0@>$28, R1, R1 -001e91e0| 1 plan9 ADD.S R0<<$28, R1, R1 -201e91e0| 1 plan9 ADD.S R0>>$28, R1, R1 -401e91e0| 1 plan9 ADD.S R0->$28, R1, R1 -601e91e0| 1 plan9 ADD.S R0@>$28, R1, R1 -103182e0| 1 plan9 ADD R0<>R1, R2, R3 -503182e0| 1 plan9 ADD R0->R1, R2, R3 -703182e0| 1 plan9 ADD R0@>R1, R2, R3 -103192e0| 1 plan9 ADD.S R0<>R1, R2, R3 -503192e0| 1 plan9 ADD.S R0->R1, R2, R3 -703192e0| 1 plan9 ADD.S R0@>R1, R2, R3 -102182e0| 1 plan9 ADD R0<>R1, R2, R2 -502182e0| 1 plan9 ADD R0->R1, R2, R2 -702182e0| 1 plan9 ADD R0@>R1, R2, R2 -102192e0| 1 plan9 ADD.S R0<>R1, R2, R2 -502192e0| 1 plan9 ADD.S R0->R1, R2, R2 -702192e0| 1 plan9 ADD.S R0@>R1, R2, R2 -ff10a0e2| 1 plan9 ADC $255, R0, R1 -ff14a0e2| 1 plan9 ADC $4278190080, R0, R1 -ff10b0e2| 1 plan9 ADC.S $255, R0, R1 -ff14b0e2| 1 plan9 ADC.S $4278190080, R0, R1 -ff00a0e2| 1 plan9 ADC $255, R0, R0 -ff04a0e2| 1 plan9 ADC $4278190080, R0, R0 -ff00b0e2| 1 plan9 ADC.S $255, R0, R0 -ff04b0e2| 1 plan9 ADC.S $4278190080, R0, R0 -0020a1e0| 1 plan9 ADC R0, R1, R2 -0020b1e0| 1 plan9 ADC.S R0, R1, R2 -0010a1e0| 1 plan9 ADC R0, R1, R1 -0010b1e0| 1 plan9 ADC.S R0, R1, R1 -202ea1e0| 1 plan9 ADC R0>>$28, R1, R2 -002ea1e0| 1 plan9 ADC R0<<$28, R1, R2 -402ea1e0| 1 plan9 ADC R0->$28, R1, R2 -602ea1e0| 1 plan9 ADC R0@>$28, R1, R2 -202eb1e0| 1 plan9 ADC.S R0>>$28, R1, R2 -002eb1e0| 1 plan9 ADC.S R0<<$28, R1, R2 -402eb1e0| 1 plan9 ADC.S R0->$28, R1, R2 -602eb1e0| 1 plan9 ADC.S R0@>$28, R1, R2 -001ea1e0| 1 plan9 ADC R0<<$28, R1, R1 -201ea1e0| 1 plan9 ADC R0>>$28, R1, R1 -401ea1e0| 1 plan9 ADC R0->$28, R1, R1 -601ea1e0| 1 plan9 ADC R0@>$28, R1, R1 -001eb1e0| 1 plan9 ADC.S R0<<$28, R1, R1 -201eb1e0| 1 plan9 ADC.S R0>>$28, R1, R1 -401eb1e0| 1 plan9 ADC.S R0->$28, R1, R1 -601eb1e0| 1 plan9 ADC.S R0@>$28, R1, R1 -1031a2e0| 1 plan9 ADC R0<>R1, R2, R3 -5031a2e0| 1 plan9 ADC R0->R1, R2, R3 -7031a2e0| 1 plan9 ADC R0@>R1, R2, R3 -1031b2e0| 1 plan9 ADC.S R0<>R1, R2, R3 -5031b2e0| 1 plan9 ADC.S R0->R1, R2, R3 -7031b2e0| 1 plan9 ADC.S R0@>R1, R2, R3 -1021a2e0| 1 plan9 ADC R0<>R1, R2, R2 -5021a2e0| 1 plan9 ADC R0->R1, R2, R2 -7021a2e0| 1 plan9 ADC R0@>R1, R2, R2 -1021b2e0| 1 plan9 ADC.S R0<>R1, R2, R2 -5021b2e0| 1 plan9 ADC.S R0->R1, R2, R2 -7021b2e0| 1 plan9 ADC.S R0@>R1, R2, R2 -ff0037e3| 1 plan9 TEQ $255, R7 -ff0439e3| 1 plan9 TEQ $4278190080, R9 -090f37e1| 1 plan9 TEQ R9<<$30, R7 -290f37e1| 1 plan9 TEQ R9>>$30, R7 -490f37e1| 1 plan9 TEQ R9->$30, R7 -690f37e1| 1 plan9 TEQ R9@>$30, R7 -190837e1| 1 plan9 TEQ R9<>R8, R7 -590837e1| 1 plan9 TEQ R9->R8, R7 -790837e1| 1 plan9 TEQ R9@>R8, R7 -ff0017e3| 1 plan9 TST $255, R7 -ff0419e3| 1 plan9 TST $4278190080, R9 -090f17e1| 1 plan9 TST R9<<$30, R7 -290f17e1| 1 plan9 TST R9>>$30, R7 -490f17e1| 1 plan9 TST R9->$30, R7 -690f17e1| 1 plan9 TST R9@>$30, R7 -190817e1| 1 plan9 TST R9<>R8, R7 -590817e1| 1 plan9 TST R9->R8, R7 -790817e1| 1 plan9 TST R9@>R8, R7 -ff0057e3| 1 plan9 CMP $255, R7 -ff0459e3| 1 plan9 CMP $4278190080, R9 -090f57e1| 1 plan9 CMP R9<<$30, R7 -290f57e1| 1 plan9 CMP R9>>$30, R7 -490f57e1| 1 plan9 CMP R9->$30, R7 -690f57e1| 1 plan9 CMP R9@>$30, R7 -190857e1| 1 plan9 CMP R9<>R8, R7 -590857e1| 1 plan9 CMP R9->R8, R7 -790857e1| 1 plan9 CMP R9@>R8, R7 -ff0077e3| 1 plan9 CMN $255, R7 -ff0479e3| 1 plan9 CMN $4278190080, R9 -090f77e1| 1 plan9 CMN R9<<$30, R7 -290f77e1| 1 plan9 CMN R9>>$30, R7 -490f77e1| 1 plan9 CMN R9->$30, R7 -690f77e1| 1 plan9 CMN R9@>$30, R7 -190877e1| 1 plan9 CMN R9<>R8, R7 -590877e1| 1 plan9 CMN R9->R8, R7 -790877e1| 1 plan9 CMN R9@>R8, R7 -0c00000a| 1 plan9 B.EQ 0x38 -0b00001a| 1 plan9 B.NE 0x34 -0a00002a| 1 plan9 B.CS 0x30 -0900003a| 1 plan9 B.CC 0x2c -0800004a| 1 plan9 B.MI 0x28 -0700005a| 1 plan9 B.PL 0x24 -0600006a| 1 plan9 B.VS 0x20 -0500007a| 1 plan9 B.VC 0x1c -0400008a| 1 plan9 B.HI 0x18 -0300009a| 1 plan9 B.LS 0x14 -020000aa| 1 plan9 B.GE 0x10 -010000ba| 1 plan9 B.LT 0xc -000000ca| 1 plan9 B.GT 0x8 -ffffffda| 1 plan9 B.LE 0x4 -fdffffea| 1 plan9 B 0xfffffffc -fcffffea| 1 plan9 B 0xfffffff8 -fbffffea| 1 plan9 B 0xfffffff4 -faffffea| 1 plan9 B 0xfffffff0 -f9ffffea| 1 plan9 B 0xffffffec -feffffea| 1 plan9 B 0x0 -0c00000b| 1 plan9 BL.EQ 0x38 -0b00001b| 1 plan9 BL.NE 0x34 -0a00002b| 1 plan9 BL.CS 0x30 -0900003b| 1 plan9 BL.CC 0x2c -0800004b| 1 plan9 BL.MI 0x28 -0700005b| 1 plan9 BL.PL 0x24 -0600006b| 1 plan9 BL.VS 0x20 -0500007b| 1 plan9 BL.VC 0x1c -0400008b| 1 plan9 BL.HI 0x18 -0300009b| 1 plan9 BL.LS 0x14 -020000ab| 1 plan9 BL.GE 0x10 -010000bb| 1 plan9 BL.LT 0xc -000000cb| 1 plan9 BL.GT 0x8 -ffffffdb| 1 plan9 BL.LE 0x4 -fdffffeb| 1 plan9 BL 0xfffffffc -fcffffeb| 1 plan9 BL 0xfffffff8 -fbffffeb| 1 plan9 BL 0xfffffff4 -faffffeb| 1 plan9 BL 0xfffffff0 -f9ffffeb| 1 plan9 BL 0xffffffec -feffffeb| 1 plan9 BL 0x0 -ff10c0e3| 1 plan9 BIC $255, R0, R1 -ff14c0e3| 1 plan9 BIC $4278190080, R0, R1 -ff10d0e3| 1 plan9 BIC.S $255, R0, R1 -ff14d0e3| 1 plan9 BIC.S $4278190080, R0, R1 -ff00c0e3| 1 plan9 BIC $255, R0, R0 -ff04c0e3| 1 plan9 BIC $4278190080, R0, R0 -ff00d0e3| 1 plan9 BIC.S $255, R0, R0 -ff04d0e3| 1 plan9 BIC.S $4278190080, R0, R0 -0020c1e1| 1 plan9 BIC R0, R1, R2 -0020d1e1| 1 plan9 BIC.S R0, R1, R2 -0010c1e1| 1 plan9 BIC R0, R1, R1 -0010d1e1| 1 plan9 BIC.S R0, R1, R1 -202ec1e1| 1 plan9 BIC R0>>$28, R1, R2 -002ec1e1| 1 plan9 BIC R0<<$28, R1, R2 -402ec1e1| 1 plan9 BIC R0->$28, R1, R2 -602ec1e1| 1 plan9 BIC R0@>$28, R1, R2 -202ed1e1| 1 plan9 BIC.S R0>>$28, R1, R2 -002ed1e1| 1 plan9 BIC.S R0<<$28, R1, R2 -402ed1e1| 1 plan9 BIC.S R0->$28, R1, R2 -602ed1e1| 1 plan9 BIC.S R0@>$28, R1, R2 -001ec1e1| 1 plan9 BIC R0<<$28, R1, R1 -201ec1e1| 1 plan9 BIC R0>>$28, R1, R1 -401ec1e1| 1 plan9 BIC R0->$28, R1, R1 -601ec1e1| 1 plan9 BIC R0@>$28, R1, R1 -001ed1e1| 1 plan9 BIC.S R0<<$28, R1, R1 -201ed1e1| 1 plan9 BIC.S R0>>$28, R1, R1 -401ed1e1| 1 plan9 BIC.S R0->$28, R1, R1 -601ed1e1| 1 plan9 BIC.S R0@>$28, R1, R1 -1031c2e1| 1 plan9 BIC R0<>R1, R2, R3 -5031c2e1| 1 plan9 BIC R0->R1, R2, R3 -7031c2e1| 1 plan9 BIC R0@>R1, R2, R3 -1031d2e1| 1 plan9 BIC.S R0<>R1, R2, R3 -5031d2e1| 1 plan9 BIC.S R0->R1, R2, R3 -7031d2e1| 1 plan9 BIC.S R0@>R1, R2, R3 -1021c2e1| 1 plan9 BIC R0<>R1, R2, R2 -5021c2e1| 1 plan9 BIC R0->R1, R2, R2 -7021c2e1| 1 plan9 BIC R0@>R1, R2, R2 -1021d2e1| 1 plan9 BIC.S R0<>R1, R2, R2 -5021d2e1| 1 plan9 BIC.S R0->R1, R2, R2 -7021d2e1| 1 plan9 BIC.S R0@>R1, R2, R2 -2567a0e1| 1 plan9 LSR $14, R5, R6 -a567a0e1| 1 plan9 LSR $15, R5, R6 -256fa0e1| 1 plan9 LSR $30, R5, R6 -a56fa0e1| 1 plan9 LSR $31, R5, R6 -2567b0e1| 1 plan9 LSR.S $14, R5, R6 -a567b0e1| 1 plan9 LSR.S $15, R5, R6 -256fb0e1| 1 plan9 LSR.S $30, R5, R6 -a56fb0e1| 1 plan9 LSR.S $31, R5, R6 -2557a0e1| 1 plan9 LSR $14, R5, R5 -a557a0e1| 1 plan9 LSR $15, R5, R5 -255fa0e1| 1 plan9 LSR $30, R5, R5 -a55fa0e1| 1 plan9 LSR $31, R5, R5 -2557b0e1| 1 plan9 LSR.S $14, R5, R5 -a557b0e1| 1 plan9 LSR.S $15, R5, R5 -255fb0e1| 1 plan9 LSR.S $30, R5, R5 -a55fb0e1| 1 plan9 LSR.S $31, R5, R5 -3675a0e1| 1 plan9 LSR R5, R6, R7 -3675b0e1| 1 plan9 LSR.S R5, R6, R7 -3775a0e1| 1 plan9 LSR R5, R7, R7 -3775b0e1| 1 plan9 LSR.S R5, R7, R7 -4567a0e1| 1 plan9 ASR $14, R5, R6 -c567a0e1| 1 plan9 ASR $15, R5, R6 -456fa0e1| 1 plan9 ASR $30, R5, R6 -c56fa0e1| 1 plan9 ASR $31, R5, R6 -4567b0e1| 1 plan9 ASR.S $14, R5, R6 -c567b0e1| 1 plan9 ASR.S $15, R5, R6 -456fb0e1| 1 plan9 ASR.S $30, R5, R6 -c56fb0e1| 1 plan9 ASR.S $31, R5, R6 -4557a0e1| 1 plan9 ASR $14, R5, R5 -c557a0e1| 1 plan9 ASR $15, R5, R5 -455fa0e1| 1 plan9 ASR $30, R5, R5 -c55fa0e1| 1 plan9 ASR $31, R5, R5 -4557b0e1| 1 plan9 ASR.S $14, R5, R5 -c557b0e1| 1 plan9 ASR.S $15, R5, R5 -455fb0e1| 1 plan9 ASR.S $30, R5, R5 -c55fb0e1| 1 plan9 ASR.S $31, R5, R5 -5675a0e1| 1 plan9 ASR R5, R6, R7 -5675b0e1| 1 plan9 ASR.S R5, R6, R7 -5775a0e1| 1 plan9 ASR R5, R7, R7 -5775b0e1| 1 plan9 ASR.S R5, R7, R7 -0567a0e1| 1 plan9 LSL $14, R5, R6 -8567a0e1| 1 plan9 LSL $15, R5, R6 -056fa0e1| 1 plan9 LSL $30, R5, R6 -856fa0e1| 1 plan9 LSL $31, R5, R6 -0567b0e1| 1 plan9 LSL.S $14, R5, R6 -8567b0e1| 1 plan9 LSL.S $15, R5, R6 -056fb0e1| 1 plan9 LSL.S $30, R5, R6 -856fb0e1| 1 plan9 LSL.S $31, R5, R6 -0557a0e1| 1 plan9 LSL $14, R5, R5 -8557a0e1| 1 plan9 LSL $15, R5, R5 -055fa0e1| 1 plan9 LSL $30, R5, R5 -855fa0e1| 1 plan9 LSL $31, R5, R5 -0557b0e1| 1 plan9 LSL.S $14, R5, R5 -8557b0e1| 1 plan9 LSL.S $15, R5, R5 -055fb0e1| 1 plan9 LSL.S $30, R5, R5 -855fb0e1| 1 plan9 LSL.S $31, R5, R5 -1675a0e1| 1 plan9 LSL R5, R6, R7 -1675b0e1| 1 plan9 LSL.S R5, R6, R7 -1775a0e1| 1 plan9 LSL R5, R7, R7 -1775b0e1| 1 plan9 LSL.S R5, R7, R7 -c23124e1| 1 plan9 SMLAWT R1, R2, R3, R4 -823124e1| 1 plan9 SMLAWB R1, R2, R3, R4 -923164e0| 1 plan9 MLS R1, R2, R3, R4 -923124e0| 1 plan9 MLA R1, R2, R3, R4 -923134e0| 1 plan9 MLA.S R1, R2, R3, R4 -123154e7| 1 plan9 SMMLA R1, R2, R3, R4 -d23154e7| 1 plan9 SMMLS R1, R2, R3, R4 -823104e1| 1 plan9 SMLABB R1, R2, R3, R4 -a23104e1| 1 plan9 SMLATB R1, R2, R3, R4 -c23104e1| 1 plan9 SMLABT R1, R2, R3, R4 -e23104e1| 1 plan9 SMLATT R1, R2, R3, R4 -123104e7| 1 plan9 SMLAD R1, R2, R3, R4 -323104e7| 1 plan9 SMLAD.X R1, R2, R3, R4 -523104e7| 1 plan9 SMLSD R1, R2, R3, R4 -723104e7| 1 plan9 SMLSD.X R1, R2, R3, R4 -9231e4e0| 1 plan9 SMLAL R1, R2, R4, R3 -9231f4e0| 1 plan9 SMLAL.S R1, R2, R4, R3 -123144e7| 1 plan9 SMLALD R1, R2, R4, R3 -323144e7| 1 plan9 SMLALD.X R1, R2, R4, R3 -523144e7| 1 plan9 SMLSLD R1, R2, R4, R3 -723144e7| 1 plan9 SMLSLD.X R1, R2, R4, R3 -9231a4e0| 1 plan9 UMLAL R1, R2, R4, R3 -923144e0| 1 plan9 UMAAL R1, R2, R4, R3 -9231b4e0| 1 plan9 UMLAL.S R1, R2, R4, R3 -930204e0| 1 plan9 MUL R2, R3, R4 -920404e0| 1 plan9 MUL R4, R2, R4 -930214e0| 1 plan9 MUL.S R2, R3, R4 -920414e0| 1 plan9 MUL.S R4, R2, R4 -960507e0| 1 plan9 MUL R5, R6, R7 -950707e0| 1 plan9 MUL R7, R5, R7 -960517e0| 1 plan9 MUL.S R5, R6, R7 -950717e0| 1 plan9 MUL.S R7, R5, R7 -923184e0| 1 plan9 UMULL R1, R2, R4, R3 -923194e0| 1 plan9 UMULL.S R1, R2, R4, R3 -9231c4e0| 1 plan9 SMULL R1, R2, R4, R3 -9231d4e0| 1 plan9 SMULL.S R1, R2, R4, R3 -12f153e7| 1 plan9 SMMUL R1, R2, R3 -820163e1| 1 plan9 SMULBB R1, R2, R3 -a20163e1| 1 plan9 SMULTB R1, R2, R3 -c20163e1| 1 plan9 SMULBT R1, R2, R3 -e20163e1| 1 plan9 SMULTT R1, R2, R3 -a20123e1| 1 plan9 SMULWB R1, R2, R3 -e20123e1| 1 plan9 SMULWT R1, R2, R3 -12f103e7| 1 plan9 SMUAD R1, R2, R3 -32f103e7| 1 plan9 SMUAD.X R1, R2, R3 -52f103e7| 1 plan9 SMUSD R1, R2, R3 -72f103e7| 1 plan9 SMUSD.X R1, R2, R3 -312fbfe6| 1 plan9 REV R1, R2 -b12fbfe6| 1 plan9 REV16 R1, R2 -b12fffe6| 1 plan9 REVSH R1, R2 -312fffe6| 1 plan9 RBIT R1, R2 -112f6fe1| 1 plan9 CLZ R1, R2 -f0ffd6f5| 1 plan9 PLD 0xff0(R6) -f0ff59f5| 1 plan9 PLD -0xff0(R9) -f0ff96f5| 1 plan9 PLD.W 0xff0(R6) -f0ff19f5| 1 plan9 PLD.W -0xff0(R9) -f0ffdff5| 1 plan9 PLD 0xff0(R15) -f0ff5ff5| 1 plan9 PLD -0xff0(R15) -00f0d2f7| 1 plan9 PLD (R2)(R0) -00f052f7| 1 plan9 PLD.U (R2)(R0) -00f092f7| 1 plan9 PLD.W (R2)(R0) -00f012f7| 1 plan9 PLD.W.U (R2)(R0) -80f0d2f7| 1 plan9 PLD (R2)(R0<<1) -80f052f7| 1 plan9 PLD.U (R2)(R0<<1) -a0f0d2f7| 1 plan9 PLD (R2)(R0>>1) -a0f052f7| 1 plan9 PLD.U (R2)(R0>>1) -c0f0d2f7| 1 plan9 PLD (R2)(R0->1) -c0f052f7| 1 plan9 PLD.U (R2)(R0->1) -e0f0d2f7| 1 plan9 PLD (R2)(R0@>1) -e0f052f7| 1 plan9 PLD.U (R2)(R0@>1) -80f092f7| 1 plan9 PLD.W (R2)(R0<<1) -80f012f7| 1 plan9 PLD.W.U (R2)(R0<<1) -a0f092f7| 1 plan9 PLD.W (R2)(R0>>1) -a0f012f7| 1 plan9 PLD.W.U (R2)(R0>>1) -c0f092f7| 1 plan9 PLD.W (R2)(R0->1) -c0f012f7| 1 plan9 PLD.W.U (R2)(R0->1) -e0f092f7| 1 plan9 PLD.W (R2)(R0@>1) -e0f012f7| 1 plan9 PLD.W.U (R2)(R0@>1) -f0ffd2f4| 1 plan9 PLI 0xff0(R2) -f0ff52f4| 1 plan9 PLI -0xff0(R2) -00f0d2f6| 1 plan9 PLI (R2)(R0) -00f052f6| 1 plan9 PLI.U (R2)(R0) -82f0d3f6| 1 plan9 PLI (R3)(R2<<1) -82f053f6| 1 plan9 PLI.U (R3)(R2<<1) -a2f0d3f6| 1 plan9 PLI (R3)(R2>>1) -a2f053f6| 1 plan9 PLI.U (R3)(R2>>1) -c2f0d3f6| 1 plan9 PLI (R3)(R2->1) -c2f053f6| 1 plan9 PLI.U (R3)(R2->1) -e2f0d3f6| 1 plan9 PLI (R3)(R2@>1) -e2f053f6| 1 plan9 PLI.U (R3)(R2@>1) -939007e1| 1 plan9 SWP R3, (R7), R9 -948042e1| 1 plan9 SWP.B R4, (R2), R8 -000000ef| 1 plan9 SVC $0 -ffff00ef| 1 plan9 SVC $65535 -ff10e0e3| 1 plan9 MVN $255, R1 -ff14e0e3| 1 plan9 MVN $4278190080, R1 -ff10f0e3| 1 plan9 MVN.S $255, R1 -ff14f0e3| 1 plan9 MVN.S $4278190080, R1 -097fe0e1| 1 plan9 MVN R9<<$30, R7 -297fe0e1| 1 plan9 MVN R9>>$30, R7 -497fe0e1| 1 plan9 MVN R9->$30, R7 -697fe0e1| 1 plan9 MVN R9@>$30, R7 -097ff0e1| 1 plan9 MVN.S R9<<$30, R7 -297ff0e1| 1 plan9 MVN.S R9>>$30, R7 -497ff0e1| 1 plan9 MVN.S R9->$30, R7 -697ff0e1| 1 plan9 MVN.S R9@>$30, R7 -1978e0e1| 1 plan9 MVN R9<>R8, R7 -5978e0e1| 1 plan9 MVN R9->R8, R7 -7978e0e1| 1 plan9 MVN R9@>R8, R7 -1978f0e1| 1 plan9 MVN.S R9<>R8, R7 -5978f0e1| 1 plan9 MVN.S R9->R8, R7 -7978f0e1| 1 plan9 MVN.S R9@>R8, R7 -550081e8| 1 plan9 STM [R0,R2,R4,R6], R1 -5f0f81e8| 1 plan9 STM [R0-R4,R6,R8-R11], R1 -5500a1e8| 1 plan9 STM [R0,R2,R4,R6], R1! -5f0fa1e8| 1 plan9 STM [R0-R4,R6,R8-R11], R1! -550091e8| 1 plan9 LDM [R0,R2,R4,R6], R1 -5f0f91e8| 1 plan9 LDM [R0-R4,R6,R8-R11], R1 -5500b1e8| 1 plan9 LDM [R0,R2,R4,R6], R1! -5f0fb1e8| 1 plan9 LDM [R0-R4,R6,R8-R11], R1! -550001e8| 1 plan9 STMDA [R0,R2,R4,R6], R1 -5f0f01e8| 1 plan9 STMDA [R0-R4,R6,R8-R11], R1 -550021e8| 1 plan9 STMDA [R0,R2,R4,R6], R1! -5f0f21e8| 1 plan9 STMDA [R0-R4,R6,R8-R11], R1! -550011e8| 1 plan9 LDMDA [R0,R2,R4,R6], R1 -5f0f11e8| 1 plan9 LDMDA [R0-R4,R6,R8-R11], R1 -550031e8| 1 plan9 LDMDA [R0,R2,R4,R6], R1! -5f0f31e8| 1 plan9 LDMDA [R0-R4,R6,R8-R11], R1! -550001e9| 1 plan9 STMDB [R0,R2,R4,R6], R1 -5f0f01e9| 1 plan9 STMDB [R0-R4,R6,R8-R11], R1 -550021e9| 1 plan9 STMDB [R0,R2,R4,R6], R1! -5f0f21e9| 1 plan9 STMDB [R0-R4,R6,R8-R11], R1! -550011e9| 1 plan9 LDMDB [R0,R2,R4,R6], R1 -5f0f11e9| 1 plan9 LDMDB [R0-R4,R6,R8-R11], R1 -550031e9| 1 plan9 LDMDB [R0,R2,R4,R6], R1! -5f0f31e9| 1 plan9 LDMDB [R0-R4,R6,R8-R11], R1! -55008ae9| 1 plan9 STMIB [R0,R2,R4,R6], R10 -5f0f8ae9| 1 plan9 STMIB [R0-R4,R6,R8-R11], R10 -5500aae9| 1 plan9 STMIB [R0,R2,R4,R6], R10! -5f0faae9| 1 plan9 STMIB [R0-R4,R6,R8-R11], R10! -55009ae9| 1 plan9 LDMIB [R0,R2,R4,R6], R10 -5f0f9ae9| 1 plan9 LDMIB [R0-R4,R6,R8-R11], R10 -5500bae9| 1 plan9 LDMIB [R0,R2,R4,R6], R10! -5f0fbae9| 1 plan9 LDMIB [R0-R4,R6,R8-R11], R10! -0340a0e1| 1 plan9 MOVW R3, R4 -0920a0e1| 1 plan9 MOVW R9, R2 -ff90a0e3| 1 plan9 MOVW $255, R9 -ff94a0e3| 1 plan9 MOVW $4278190080, R9 -aaaa0a13| 1 plan9 MOVW.NE $43690, R10 -aaaa4a03| 1 plan9 MOVT.EQ $43690, R10 -5110e0e3| 1 plan9 MVN $81, R1 -001082e5| 1 plan9 MOVW R1, (R2) -001082e4| 1 plan9 MOVW.P R1, (R2) -0010a2e5| 1 plan9 MOVW.W R1, (R2) -201082e5| 1 plan9 MOVW R1, 0x20(R2) -201082e4| 1 plan9 MOVW.P R1, 0x20(R2) -2010a2e5| 1 plan9 MOVW.W R1, 0x20(R2) -201002e5| 1 plan9 MOVW R1, -0x20(R2) -201002e4| 1 plan9 MOVW.P R1, -0x20(R2) -201022e5| 1 plan9 MOVW.W R1, -0x20(R2) -001092e5| 1 plan9 MOVW (R2), R1 -001092e4| 1 plan9 MOVW.P (R2), R1 -0010b2e5| 1 plan9 MOVW.W (R2), R1 -201092e5| 1 plan9 MOVW 0x20(R2), R1 -201092e4| 1 plan9 MOVW.P 0x20(R2), R1 -2010b2e5| 1 plan9 MOVW.W 0x20(R2), R1 -201012e5| 1 plan9 MOVW -0x20(R2), R1 -201012e4| 1 plan9 MOVW.P -0x20(R2), R1 -201032e5| 1 plan9 MOVW.W -0x20(R2), R1 -00100fe1| 1 plan9 MOVW APSR, R1 -fef02ce3| 1 plan9 MOVW $254, APSR -fff42ce3| 1 plan9 MOVW $4278190080, APSR -05f02c01| 1 plan9 MOVW.EQ R5, APSR -09f02c11| 1 plan9 MOVW.NE R9, APSR -109af10e| 1 plan9 MOVW.EQ FPSCR, R9 -10aaf1ee| 1 plan9 MOVW FPSCR, R10 -109ae11e| 1 plan9 MOVW.NE R9, FPSCR -10aae1ee| 1 plan9 MOVW R10, FPSCR -202e91e7| 1 plan9 MOVW (R1)(R0>>28), R2 -002e91e7| 1 plan9 MOVW (R1)(R0<<28), R2 -402e91e7| 1 plan9 MOVW (R1)(R0->28), R2 -602e91e7| 1 plan9 MOVW (R1)(R0@>28), R2 -202e11e7| 1 plan9 MOVW.U (R1)(R0>>28), R2 -002e11e7| 1 plan9 MOVW.U (R1)(R0<<28), R2 -402e11e7| 1 plan9 MOVW.U (R1)(R0->28), R2 -602e11e7| 1 plan9 MOVW.U (R1)(R0@>28), R2 -202eb1e7| 1 plan9 MOVW.W (R1)(R0>>28), R2 -002eb1e7| 1 plan9 MOVW.W (R1)(R0<<28), R2 -402eb1e7| 1 plan9 MOVW.W (R1)(R0->28), R2 -602eb1e7| 1 plan9 MOVW.W (R1)(R0@>28), R2 -202e9ae6| 1 plan9 MOVW.P (R10)(R0>>28), R2 -002e9ae6| 1 plan9 MOVW.P (R10)(R0<<28), R2 -402e9ae6| 1 plan9 MOVW.P (R10)(R0->28), R2 -602e9ae6| 1 plan9 MOVW.P (R10)(R0@>28), R2 -202e81e7| 1 plan9 MOVW R2, (R1)(R0>>28) -002e81e7| 1 plan9 MOVW R2, (R1)(R0<<28) -402e81e7| 1 plan9 MOVW R2, (R1)(R0->28) -602e81e7| 1 plan9 MOVW R2, (R1)(R0@>28) -202e01e7| 1 plan9 MOVW.U R2, (R1)(R0>>28) -002e01e7| 1 plan9 MOVW.U R2, (R1)(R0<<28) -402e01e7| 1 plan9 MOVW.U R2, (R1)(R0->28) -602e01e7| 1 plan9 MOVW.U R2, (R1)(R0@>28) -202ea1e7| 1 plan9 MOVW.W R2, (R1)(R0>>28) -002ea1e7| 1 plan9 MOVW.W R2, (R1)(R0<<28) -402ea1e7| 1 plan9 MOVW.W R2, (R1)(R0->28) -602ea1e7| 1 plan9 MOVW.W R2, (R1)(R0@>28) -202e85e6| 1 plan9 MOVW.P R2, (R5)(R0>>28) -002e85e6| 1 plan9 MOVW.P R2, (R5)(R0<<28) -402e85e6| 1 plan9 MOVW.P R2, (R5)(R0->28) -602e85e6| 1 plan9 MOVW.P R2, (R5)(R0@>28) -0010c2e5| 1 plan9 MOVB R1, (R2) -0010c2e4| 1 plan9 MOVB.P R1, (R2) -0010e2e5| 1 plan9 MOVB.W R1, (R2) -2010c2e5| 1 plan9 MOVB R1, 0x20(R2) -2010c2e4| 1 plan9 MOVB.P R1, 0x20(R2) -2010e2e5| 1 plan9 MOVB.W R1, 0x20(R2) -201042e5| 1 plan9 MOVB R1, -0x20(R2) -201042e4| 1 plan9 MOVB.P R1, -0x20(R2) -201062e5| 1 plan9 MOVB.W R1, -0x20(R2) -d010d2e1| 1 plan9 MOVBS (R2), R1 -d010d2e0| 1 plan9 MOVBS.P (R2), R1 -d010f2e1| 1 plan9 MOVBS.W (R2), R1 -d012d2e1| 1 plan9 MOVBS 0x20(R2), R1 -d012d2e0| 1 plan9 MOVBS.P 0x20(R2), R1 -d012f2e1| 1 plan9 MOVBS.W 0x20(R2), R1 -d01252e1| 1 plan9 MOVBS -0x20(R2), R1 -d01252e0| 1 plan9 MOVBS.P -0x20(R2), R1 -d01272e1| 1 plan9 MOVBS.W -0x20(R2), R1 -0010d2e5| 1 plan9 MOVBU (R2), R1 -0010dfe5| 1 plan9 MOVBU (R15), R1 -0020dfe5| 1 plan9 MOVBU (R15), R2 -0010d2e4| 1 plan9 MOVBU.P (R2), R1 -0010f2e5| 1 plan9 MOVBU.W (R2), R1 -2010d2e5| 1 plan9 MOVBU 0x20(R2), R1 -2010d2e4| 1 plan9 MOVBU.P 0x20(R2), R1 -2010f2e5| 1 plan9 MOVBU.W 0x20(R2), R1 -201052e5| 1 plan9 MOVBU -0x20(R2), R1 -201052e4| 1 plan9 MOVBU.P -0x20(R2), R1 -201072e5| 1 plan9 MOVBU.W -0x20(R2), R1 -202ec1e7| 1 plan9 MOVB R2, (R1)(R0>>28) -002ec1e7| 1 plan9 MOVB R2, (R1)(R0<<28) -402ec1e7| 1 plan9 MOVB R2, (R1)(R0->28) -602ec1e7| 1 plan9 MOVB R2, (R1)(R0@>28) -202e41e7| 1 plan9 MOVB.U R2, (R1)(R0>>28) -002e41e7| 1 plan9 MOVB.U R2, (R1)(R0<<28) -402e41e7| 1 plan9 MOVB.U R2, (R1)(R0->28) -602e41e7| 1 plan9 MOVB.U R2, (R1)(R0@>28) -202ee1e7| 1 plan9 MOVB.W R2, (R1)(R0>>28) -002ee1e7| 1 plan9 MOVB.W R2, (R1)(R0<<28) -402ee1e7| 1 plan9 MOVB.W R2, (R1)(R0->28) -602ee1e7| 1 plan9 MOVB.W R2, (R1)(R0@>28) -202e61e7| 1 plan9 MOVB.W.U R2, (R1)(R0>>28) -002e61e7| 1 plan9 MOVB.W.U R2, (R1)(R0<<28) -402e61e7| 1 plan9 MOVB.W.U R2, (R1)(R0->28) -602e61e7| 1 plan9 MOVB.W.U R2, (R1)(R0@>28) -202ec5e6| 1 plan9 MOVB.P R2, (R5)(R0>>28) -002ec5e6| 1 plan9 MOVB.P R2, (R5)(R0<<28) -402ec5e6| 1 plan9 MOVB.P R2, (R5)(R0->28) -602ec5e6| 1 plan9 MOVB.P R2, (R5)(R0@>28) -202ed1e7| 1 plan9 MOVBU (R1)(R0>>28), R2 -002ed1e7| 1 plan9 MOVBU (R1)(R0<<28), R2 -402ed1e7| 1 plan9 MOVBU (R1)(R0->28), R2 -602ed1e7| 1 plan9 MOVBU (R1)(R0@>28), R2 -202e51e7| 1 plan9 MOVBU.U (R1)(R0>>28), R2 -002e51e7| 1 plan9 MOVBU.U (R1)(R0<<28), R2 -402e51e7| 1 plan9 MOVBU.U (R1)(R0->28), R2 -602e51e7| 1 plan9 MOVBU.U (R1)(R0@>28), R2 -202ef1e7| 1 plan9 MOVBU.W (R1)(R0>>28), R2 -002ef1e7| 1 plan9 MOVBU.W (R1)(R0<<28), R2 -402ef1e7| 1 plan9 MOVBU.W (R1)(R0->28), R2 -602ef1e7| 1 plan9 MOVBU.W (R1)(R0@>28), R2 -202e71e7| 1 plan9 MOVBU.W.U (R1)(R0>>28), R2 -002e71e7| 1 plan9 MOVBU.W.U (R1)(R0<<28), R2 -402e71e7| 1 plan9 MOVBU.W.U (R1)(R0->28), R2 -602e71e7| 1 plan9 MOVBU.W.U (R1)(R0@>28), R2 -202edae6| 1 plan9 MOVBU.P (R10)(R0>>28), R2 -002edae6| 1 plan9 MOVBU.P (R10)(R0<<28), R2 -402edae6| 1 plan9 MOVBU.P (R10)(R0->28), R2 -602edae6| 1 plan9 MOVBU.P (R10)(R0@>28), R2 -d02091e1| 1 plan9 MOVBS (R1)(R0), R2 -d02011e1| 1 plan9 MOVBS.U (R1)(R0), R2 -d020b1e1| 1 plan9 MOVBS.W (R1)(R0), R2 -d02091e0| 1 plan9 MOVBS.P (R1)(R0), R2 -b040c3e1| 1 plan9 MOVH R4, (R3) -b032c4e1| 1 plan9 MOVH R3, 0x20(R4) -b032e4e1| 1 plan9 MOVH.W R3, 0x20(R4) -b032c4e0| 1 plan9 MOVH.P R3, 0x20(R4) -b03244e1| 1 plan9 MOVH R3, -0x20(R4) -b03264e1| 1 plan9 MOVH.W R3, -0x20(R4) -b03244e0| 1 plan9 MOVH.P R3, -0x20(R4) -b080d9e1| 1 plan9 MOVHU (R9), R8 -b080f9e1| 1 plan9 MOVHU.W (R9), R8 -b080d9e0| 1 plan9 MOVHU.P (R9), R8 -f080d9e1| 1 plan9 MOVHS (R9), R8 -f080f9e1| 1 plan9 MOVHS.W (R9), R8 -f080d9e0| 1 plan9 MOVHS.P (R9), R8 -b282d9e1| 1 plan9 MOVHU 0x22(R9), R8 -b282f9e1| 1 plan9 MOVHU.W 0x22(R9), R8 -b282d9e0| 1 plan9 MOVHU.P 0x22(R9), R8 -f282d9e1| 1 plan9 MOVHS 0x22(R9), R8 -f282f9e1| 1 plan9 MOVHS.W 0x22(R9), R8 -f282d9e0| 1 plan9 MOVHS.P 0x22(R9), R8 -b48259e1| 1 plan9 MOVHU -0x24(R9), R8 -b48279e1| 1 plan9 MOVHU.W -0x24(R9), R8 -b48259e0| 1 plan9 MOVHU.P -0x24(R9), R8 -f48259e1| 1 plan9 MOVHS -0x24(R9), R8 -f48279e1| 1 plan9 MOVHS.W -0x24(R9), R8 -f48259e0| 1 plan9 MOVHS.P -0x24(R9), R8 -002a310e| 1 plan9 ADDF.EQ F0, F1, F2 -202a310e| 1 plan9 ADDF.EQ S1, F1, F2 -802a31ee| 1 plan9 ADDF F0, S3, F2 -002a71ee| 1 plan9 ADDF F0, F1, S5 -035b340e| 1 plan9 ADDD.EQ F3, F4, F5 -002a321e| 1 plan9 ADDF.NE F0, F2, F2 -035b35ee| 1 plan9 ADDD F3, F5, F5 -402a31ee| 1 plan9 SUBF F0, F1, F2 -602a31ee| 1 plan9 SUBF S1, F1, F2 -c02a31ee| 1 plan9 SUBF F0, S3, F2 -402a71ee| 1 plan9 SUBF F0, F1, S5 -435b340e| 1 plan9 SUBD.EQ F3, F4, F5 -402a321e| 1 plan9 SUBF.NE F0, F2, F2 -435b35ee| 1 plan9 SUBD F3, F5, F5 -002a21ee| 1 plan9 MULF F0, F1, F2 -202a21ee| 1 plan9 MULF S1, F1, F2 -802a21ee| 1 plan9 MULF F0, S3, F2 -002a61ee| 1 plan9 MULF F0, F1, S5 -035b240e| 1 plan9 MULD.EQ F3, F4, F5 -002a221e| 1 plan9 MULF.NE F0, F2, F2 -035b25ee| 1 plan9 MULD F3, F5, F5 -402a21ee| 1 plan9 NMULF F0, F1, F2 -602a21ee| 1 plan9 NMULF S1, F1, F2 -c02a21ee| 1 plan9 NMULF F0, S3, F2 -402a61ee| 1 plan9 NMULF F0, F1, S5 -435b240e| 1 plan9 NMULD.EQ F3, F4, F5 -402a221e| 1 plan9 NMULF.NE F0, F2, F2 -435b25ee| 1 plan9 NMULD F3, F5, F5 -002a01ee| 1 plan9 MULAF F0, F1, F2 -202a01ee| 1 plan9 MULAF S1, F1, F2 -802a01ee| 1 plan9 MULAF F0, S3, F2 -002a41ee| 1 plan9 MULAF F0, F1, S5 -035b040e| 1 plan9 MULAD.EQ F3, F4, F5 -002a021e| 1 plan9 MULAF.NE F0, F2, F2 -035b05ee| 1 plan9 MULAD F3, F5, F5 -402a01ee| 1 plan9 MULSF F0, F1, F2 -602a01ee| 1 plan9 MULSF S1, F1, F2 -c02a01ee| 1 plan9 MULSF F0, S3, F2 -402a41ee| 1 plan9 MULSF F0, F1, S5 -435b040e| 1 plan9 MULSD.EQ F3, F4, F5 -402a021e| 1 plan9 MULSF.NE F0, F2, F2 -435b05ee| 1 plan9 MULSD F3, F5, F5 -002a11ee| 1 plan9 NMULSF F0, F1, F2 -202a11ee| 1 plan9 NMULSF S1, F1, F2 -802a11ee| 1 plan9 NMULSF F0, S3, F2 -002a51ee| 1 plan9 NMULSF F0, F1, S5 -035b140e| 1 plan9 NMULSD.EQ F3, F4, F5 -002a121e| 1 plan9 NMULSF.NE F0, F2, F2 -035b15ee| 1 plan9 NMULSD F3, F5, F5 -402a11ee| 1 plan9 NMULAF F0, F1, F2 -602a11ee| 1 plan9 NMULAF S1, F1, F2 -c02a11ee| 1 plan9 NMULAF F0, S3, F2 -402a51ee| 1 plan9 NMULAF F0, F1, S5 -435b140e| 1 plan9 NMULAD.EQ F3, F4, F5 -402a121e| 1 plan9 NMULAF.NE F0, F2, F2 -435b15ee| 1 plan9 NMULAD F3, F5, F5 -002a81ee| 1 plan9 DIVF F0, F1, F2 -202a81ee| 1 plan9 DIVF S1, F1, F2 -802a81ee| 1 plan9 DIVF F0, S3, F2 -002ac1ee| 1 plan9 DIVF F0, F1, S5 -035b840e| 1 plan9 DIVD.EQ F3, F4, F5 -002a821e| 1 plan9 DIVF.NE F0, F2, F2 -035b85ee| 1 plan9 DIVD F3, F5, F5 -401ab1ee| 1 plan9 NEGF F0, F1 -601ab1ee| 1 plan9 NEGF S1, F1 -401af1ee| 1 plan9 NEGF F0, S3 -445bb1ee| 1 plan9 NEGD F4, F5 -c01ab0ee| 1 plan9 ABSF F0, F1 -e01ab0ee| 1 plan9 ABSF S1, F1 -c01af0ee| 1 plan9 ABSF F0, S3 -c45bb0ee| 1 plan9 ABSD F4, F5 -c01ab1ee| 1 plan9 SQRTF F0, F1 -e01ab1ee| 1 plan9 SQRTF S1, F1 -c01af1ee| 1 plan9 SQRTF F0, S3 -c45bb1ee| 1 plan9 SQRTD F4, F5 -c01ab7ee| 1 plan9 MOVFD F0, F1 -c45bb7ee| 1 plan9 MOVDF F4, F5 -c89ab4ee| 1 plan9 CMPF F8, F9 -c45bb42e| 1 plan9 CMPD.CS F4, F5 -c07ab56e| 1 plan9 CMPF.VS $0, F7 -c06bb5ee| 1 plan9 CMPD $0, F6 -9f9f98e1| 1 plan9 LDREX (R8), R9 -9f9fd8e1| 1 plan9 LDREXB (R8), R9 -9f9ff8e1| 1 plan9 LDREXH (R8), R9 -9fcfbbe1| 1 gnu ldrexd ip, [fp] -935f84e1| 1 plan9 STREX R3, (R4), R5 -935fc4e1| 1 plan9 STREXB R3, (R4), R5 -935fe4e1| 1 plan9 STREXH R3, (R4), R5 -98afa9e1| 1 gnu strexd sl, r8, [r9] -104b08ee| 1 plan9 MOVW R4, F8 -108b14ee| 1 plan9 MOVW F4, R8 -104a080e| 1 plan9 MOVW.EQ R4, F8 -104a181e| 1 plan9 MOVW.NE F8, R4 -904a181e| 1 plan9 MOVW.NE S17, R4 -445ab0ee| 1 plan9 MOVF F4, F5 -467bb0ee| 1 plan9 MOVD F6, F7 -c68abdee| 1 plan9 MOVFW F6, F8 -c68abcee| 1 plan9 MOVFW.U F6, F8 -c68bbdee| 1 plan9 MOVDW F6, F8 -c68bbcee| 1 plan9 MOVDW.U F6, F8 -c68ab8ee| 1 plan9 MOVWF F6, F8 -468ab8ee| 1 plan9 MOVWF.U F6, F8 -c68bb8ee| 1 plan9 MOVWD F6, F8 -468bb8ee| 1 plan9 MOVWD.U F6, F8 -000000ea| 1 plan9 B 0x8 -feffffea| 1 plan9 B 0x0 -fcffffea| 1 plan9 B 0xfffffff8 -1f90cfe7| 1 plan9 BFC $16, $0, R9 -9fb4dee7| 1 plan9 BFC $22, $9, R11 -1790cfe7| 1 plan9 BFI $16, $0, R7, R9 -98b4dee7| 1 plan9 BFI $22, $9, R8, R11 -742321e1| 1 plan9 BKPT $4660 -000000eb| 1 plan9 BL 0x8 -feffffeb| 1 plan9 BL 0x0 -fcffffeb| 1 plan9 BL 0xfffffff8 -000000fa| 1 plan9 BLX 0x8 -fefffffa| 1 plan9 BLX 0x0 -fcfffffa| 1 plan9 BLX 0xfffffff8 -33ff2fe1| 1 plan9 BLX R3 -13ff2fe1| 1 plan9 BX R3 -23ff2fe1| 1 plan9 BXJ R3 -1ff07ff5| 1 plan9 CLREX -f7f020e3| 1 gnu dbg #7 -58f07ff5| 1 gnu dmb #8 -49f07ff5| 1 gnu dsb #9 -62f07ff5| 1 gnu isb #2 -009a94ed| 1 plan9 MOVF (R4), F9 -009ad4ed| 1 plan9 MOVF (R4), S19 -009b940d| 1 plan9 MOVD.EQ (R4), F9 -003a9a1d| 1 plan9 MOVF.NE (R10), F3 -003ada1d| 1 plan9 MOVF.NE (R10), S7 -003b9aed| 1 plan9 MOVD (R10), F3 -089a93ed| 1 plan9 MOVF 0x20(R3), F9 -089ad3ed| 1 plan9 MOVF 0x20(R3), S19 -089b940d| 1 plan9 MOVD.EQ 0x20(R4), F9 -083a1a1d| 1 plan9 MOVF.NE -0x20(R10), F3 -083a5a1d| 1 plan9 MOVF.NE -0x20(R10), S7 -083b1aed| 1 plan9 MOVD -0x20(R10), F3 -009a84ed| 1 plan9 MOVF F9, (R4) -009ac4ed| 1 plan9 MOVF S19, (R4) -009b840d| 1 plan9 MOVD.EQ F9, (R4) -003a8a1d| 1 plan9 MOVF.NE F3, (R10) -003aca1d| 1 plan9 MOVF.NE S7, (R10) -003b8aed| 1 plan9 MOVD F3, (R10) -089a83ed| 1 plan9 MOVF F9, 0x20(R3) -089ac3ed| 1 plan9 MOVF S19, 0x20(R3) -089b840d| 1 plan9 MOVD.EQ F9, 0x20(R4) -083a0a1d| 1 plan9 MOVF.NE F3, -0x20(R10) -083a4a1d| 1 plan9 MOVF.NE S7, -0x20(R10) -083b0aed| 1 plan9 MOVD F3, -0x20(R10) -d060c8e1| 1 gnu ldrd r6, [r8] -d06048e1| 1 gnu ldrd r6, [r8] -d060e8e1| 1 gnu ldrd r6, [r8, #0]! -d06068e1| 1 gnu ldrd r6, [r8, #0]! -d060c8e0| 1 gnu ldrd r6, [r8], #0 -d06048e0| 1 gnu ldrd r6, [r8], #0 -d062c8e1| 1 gnu ldrd r6, [r8, #32] -d06248e1| 1 gnu ldrd r6, [r8, #-32] -d062e8e1| 1 gnu ldrd r6, [r8, #32]! -d06268e1| 1 gnu ldrd r6, [r8, #-32]! -d062c8e0| 1 gnu ldrd r6, [r8], #32 -d06248e0| 1 gnu ldrd r6, [r8], #-32 -d24089e1| 1 gnu ldrd r4, [r9, r2] -d240a9e1| 1 gnu ldrd r4, [r9, r2]! -d24009e1| 1 gnu ldrd r4, [r9, -r2] -d24029e1| 1 gnu ldrd r4, [r9, -r2]! -f060c8e1| 1 gnu strd r6, [r8] -f06048e1| 1 gnu strd r6, [r8] -f060e8e1| 1 gnu strd r6, [r8, #0]! -f06068e1| 1 gnu strd r6, [r8, #0]! -f060c8e0| 1 gnu strd r6, [r8], #0 -f06048e0| 1 gnu strd r6, [r8], #0 -f062c8e1| 1 gnu strd r6, [r8, #32] -f06248e1| 1 gnu strd r6, [r8, #-32] -f062e8e1| 1 gnu strd r6, [r8, #32]! -f06268e1| 1 gnu strd r6, [r8, #-32]! -f062c8e0| 1 gnu strd r6, [r8], #32 -f06248e0| 1 gnu strd r6, [r8], #-32 -f24089e1| 1 gnu strd r4, [r9, r2] -f240a9e1| 1 gnu strd r4, [r9, r2]! -f24009e1| 1 gnu strd r4, [r9, -r2] -f24029e1| 1 gnu strd r4, [r9, -r2]! -0010b2e4| 1 gnu ldrt r1, [r2], #0 -2010b2e4| 1 gnu ldrt r1, [r2], #32 -201032e4| 1 gnu ldrt r1, [r2], #-32 -0040bde4| 1 gnu ldrt r4, [sp], #0 -2040bde4| 1 gnu ldrt r4, [sp], #32 -20403de4| 1 gnu ldrt r4, [sp], #-32 -2314b2e6| 1 gnu ldrt r1, [r2], r3, lsr #8 -0314b2e6| 1 gnu ldrt r1, [r2], r3, lsl #8 -4314b2e6| 1 gnu ldrt r1, [r2], r3, asr #8 -6314b2e6| 1 gnu ldrt r1, [r2], r3, ror #8 -231432e6| 1 gnu ldrt r1, [r2], -r3, lsr #8 -031432e6| 1 gnu ldrt r1, [r2], -r3, lsl #8 -431432e6| 1 gnu ldrt r1, [r2], -r3, asr #8 -631432e6| 1 gnu ldrt r1, [r2], -r3, ror #8 -0010a2e4| 1 gnu strt r1, [r2], #0 -2010a2e4| 1 gnu strt r1, [r2], #32 -201022e4| 1 gnu strt r1, [r2], #-32 -0040ade4| 1 gnu strt r4, [sp], #0 -2040ade4| 1 gnu strt r4, [sp], #32 -20402de4| 1 gnu strt r4, [sp], #-32 -2314a2e6| 1 gnu strt r1, [r2], r3, lsr #8 -0314a2e6| 1 gnu strt r1, [r2], r3, lsl #8 -4314a2e6| 1 gnu strt r1, [r2], r3, asr #8 -6314a2e6| 1 gnu strt r1, [r2], r3, ror #8 -231422e6| 1 gnu strt r1, [r2], -r3, lsr #8 -031422e6| 1 gnu strt r1, [r2], -r3, lsl #8 -431422e6| 1 gnu strt r1, [r2], -r3, asr #8 -631422e6| 1 gnu strt r1, [r2], -r3, ror #8 -0010f2e4| 1 gnu ldrbt r1, [r2], #0 -2010f2e4| 1 gnu ldrbt r1, [r2], #32 -201072e4| 1 gnu ldrbt r1, [r2], #-32 -0040fde4| 1 gnu ldrbt r4, [sp], #0 -2040fde4| 1 gnu ldrbt r4, [sp], #32 -20407de4| 1 gnu ldrbt r4, [sp], #-32 -2314f2e6| 1 gnu ldrbt r1, [r2], r3, lsr #8 -0314f2e6| 1 gnu ldrbt r1, [r2], r3, lsl #8 -4314f2e6| 1 gnu ldrbt r1, [r2], r3, asr #8 -6314f2e6| 1 gnu ldrbt r1, [r2], r3, ror #8 -231472e6| 1 gnu ldrbt r1, [r2], -r3, lsr #8 -031472e6| 1 gnu ldrbt r1, [r2], -r3, lsl #8 -431472e6| 1 gnu ldrbt r1, [r2], -r3, asr #8 -631472e6| 1 gnu ldrbt r1, [r2], -r3, ror #8 -0010e2e4| 1 gnu strbt r1, [r2], #0 -2010e2e4| 1 gnu strbt r1, [r2], #32 -201062e4| 1 gnu strbt r1, [r2], #-32 -0040ede4| 1 gnu strbt r4, [sp], #0 -2040ede4| 1 gnu strbt r4, [sp], #32 -20406de4| 1 gnu strbt r4, [sp], #-32 -2314e2e6| 1 gnu strbt r1, [r2], r3, lsr #8 -0314e2e6| 1 gnu strbt r1, [r2], r3, lsl #8 -4314e2e6| 1 gnu strbt r1, [r2], r3, asr #8 -6314e2e6| 1 gnu strbt r1, [r2], r3, ror #8 -231462e6| 1 gnu strbt r1, [r2], -r3, lsr #8 -031462e6| 1 gnu strbt r1, [r2], -r3, lsl #8 -431462e6| 1 gnu strbt r1, [r2], -r3, asr #8 -631462e6| 1 gnu strbt r1, [r2], -r3, ror #8 -d010f2e0| 1 gnu ldrsbt r1, [r2], #0 -d012f2e0| 1 gnu ldrsbt r1, [r2], #32 -d01272e0| 1 gnu ldrsbt r1, [r2], #-32 -d040fde0| 1 gnu ldrsbt r4, [sp], #0 -d042fde0| 1 gnu ldrsbt r4, [sp], #32 -d0427de0| 1 gnu ldrsbt r4, [sp], #-32 -d310b2e0| 1 gnu ldrsbt r1, [r2], r3 -d640bde0| 1 gnu ldrsbt r4, [sp], r6 -d31032e0| 1 gnu ldrsbt r1, [r2], -r3 -d6403de0| 1 gnu ldrsbt r4, [sp], -r6 -b010f2e0| 1 gnu ldrht r1, [r2], #0 -b012f2e0| 1 gnu ldrht r1, [r2], #32 -b01272e0| 1 gnu ldrht r1, [r2], #-32 -b040fde0| 1 gnu ldrht r4, [sp], #0 -b042fde0| 1 gnu ldrht r4, [sp], #32 -b0427de0| 1 gnu ldrht r4, [sp], #-32 -b310b2e0| 1 gnu ldrht r1, [r2], r3 -b640bde0| 1 gnu ldrht r4, [sp], r6 -b31032e0| 1 gnu ldrht r1, [r2], -r3 -b6403de0| 1 gnu ldrht r4, [sp], -r6 -f010f2e0| 1 gnu ldrsht r1, [r2], #0 -f012f2e0| 1 gnu ldrsht r1, [r2], #32 -f01272e0| 1 gnu ldrsht r1, [r2], #-32 -f040fde0| 1 gnu ldrsht r4, [sp], #0 -f042fde0| 1 gnu ldrsht r4, [sp], #32 -f0427de0| 1 gnu ldrsht r4, [sp], #-32 -f310b2e0| 1 gnu ldrsht r1, [r2], r3 -f640bde0| 1 gnu ldrsht r4, [sp], r6 -f31032e0| 1 gnu ldrsht r1, [r2], -r3 -f6403de0| 1 gnu ldrsht r4, [sp], -r6 -b010f2e0| 1 gnu ldrht r1, [r2], #0 -b012f2e0| 1 gnu ldrht r1, [r2], #32 -b01272e0| 1 gnu ldrht r1, [r2], #-32 -b040fde0| 1 gnu ldrht r4, [sp], #0 -b042fde0| 1 gnu ldrht r4, [sp], #32 -b0427de0| 1 gnu ldrht r4, [sp], #-32 -b310b2e0| 1 gnu ldrht r1, [r2], r3 -b640bde0| 1 gnu ldrht r4, [sp], r6 -b31032e0| 1 gnu ldrht r1, [r2], -r3 -b6403de0| 1 gnu ldrht r4, [sp], -r6 -b010e2e0| 1 gnu strht r1, [r2], #0 -b012e2e0| 1 gnu strht r1, [r2], #32 -b01262e0| 1 gnu strht r1, [r2], #-32 -b040ede0| 1 gnu strht r4, [sp], #0 -b042ede0| 1 gnu strht r4, [sp], #32 -b0426de0| 1 gnu strht r4, [sp], #-32 -b310a2e0| 1 gnu strht r1, [r2], r3 -b640ade0| 1 gnu strht r4, [sp], r6 -b31022e0| 1 gnu strht r1, [r2], -r3 -b6402de0| 1 gnu strht r4, [sp], -r6 -00f020e3| 1 plan9 NOP -445ab0ee| 1 plan9 MOVF F4, F5 -645af0ee| 1 plan9 MOVF S9, S11 -467bb0ee| 1 plan9 MOVD F6, F7 -104b08ee| 1 plan9 MOVW R4, F8 -104b28ee| 1 plan9 MOVW R4, D8[1] -108b14ee| 1 plan9 MOVW F4, R8 -108b34ee| 1 plan9 MOVW D4[1], R8 -c68abdee| 1 plan9 MOVFW F6, F8 -e68afdee| 1 plan9 MOVFW S13, S17 -c68abcee| 1 plan9 MOVFW.U F6, F8 -e68afcee| 1 plan9 MOVFW.U S13, S17 -c68bbdee| 1 plan9 MOVDW F6, F8 -c68bfdee| 1 plan9 MOVDW F6, S17 -c68bbcee| 1 plan9 MOVDW.U F6, F8 -c68bfcee| 1 plan9 MOVDW.U F6, S17 -c68ab8ee| 1 plan9 MOVWF F6, F8 -e68af8ee| 1 plan9 MOVWF S13, S17 -468ab8ee| 1 plan9 MOVWF.U F6, F8 -668af8ee| 1 plan9 MOVWF.U S13, S17 -c68bb8ee| 1 plan9 MOVWD F6, F8 -e68bb8ee| 1 plan9 MOVWD S13, F8 -468bb8ee| 1 plan9 MOVWD.U F6, F8 -668bb8ee| 1 plan9 MOVWD.U S13, F8 -c01ab7ee| 1 plan9 MOVFD F0, F1 -e01ab7ee| 1 plan9 MOVFD S1, F1 -c45bb7ee| 1 plan9 MOVDF F4, F5 -c65bf7ee| 1 plan9 MOVDF F6, S11 -102083e6| 1 gnu pkhbt r2, r3, r0 -102283e6| 1 gnu pkhbt r2, r3, r0, lsl #4 -502083e6| 1 gnu pkhtb r2, r3, r0, asr #32 -d02083e6| 1 gnu pkhtb r2, r3, r0, asr #1 -502283e6| 1 gnu pkhtb r2, r3, r0, asr #4 -faaf2de9| 1 gnu push {r1, r3, r4, r5, r6, r7, r8, r9, sl, fp, sp, pc} -04202de5| 1 gnu push {r2} -faafbde8| 1 gnu pop {r1, r3, r4, r5, r6, r7, r8, r9, sl, fp, sp, pc} -04209de4| 1 gnu pop {r2} -556003e1| 1 gnu qadd r6, r5, r3 -156f28e6| 1 gnu qadd16 r6, r8, r5 -956f28e6| 1 gnu qadd8 r6, r8, r5 -550044e1| 1 gnu qdadd r0, r5, r4 -550066e1| 1 gnu qdsub r0, r5, r6 -156f68e6| 1 gnu uqadd16 r6, r8, r5 -956f68e6| 1 gnu uqadd8 r6, r8, r5 -356f28e6| 1 gnu qasx r6, r8, r5 -556f28e6| 1 gnu qsax r6, r8, r5 -356f64e6| 1 gnu uqasx r6, r4, r5 -553f64e6| 1 gnu uqsax r3, r4, r5 -556022e1| 1 gnu qsub r6, r5, r2 -774f21e6| 1 gnu qsub16 r4, r1, r7 -f74f21e6| 1 gnu qsub8 r4, r1, r7 -774f61e6| 1 gnu uqsub16 r4, r1, r7 -f74f61e6| 1 gnu uqsub8 r4, r1, r7 -6670a0e1| 1 gnu rrx r7, r6 -6670b0e1| 1 gnu rrxs r7, r6 -112f13e6| 1 gnu sadd16 r2, r3, r1 -992f13e6| 1 gnu sadd8 r2, r3, r9 -112f33e6| 1 gnu shadd16 r2, r3, r1 -992f33e6| 1 gnu shadd8 r2, r3, r9 -712f13e6| 1 gnu ssub16 r2, r3, r1 -f92f13e6| 1 gnu ssub8 r2, r3, r9 -712f33e6| 1 gnu shsub16 r2, r3, r1 -f92f33e6| 1 gnu shsub8 r2, r3, r9 -112f53e6| 1 gnu uadd16 r2, r3, r1 -992f53e6| 1 gnu uadd8 r2, r3, r9 -112f73e6| 1 gnu uhadd16 r2, r3, r1 -992f73e6| 1 gnu uhadd8 r2, r3, r9 -712f53e6| 1 gnu usub16 r2, r3, r1 -f92f53e6| 1 gnu usub8 r2, r3, r9 -712f73e6| 1 gnu uhsub16 r2, r3, r1 -f92f73e6| 1 gnu uhsub8 r2, r3, r9 -332f14e6| 1 gnu sasx r2, r4, r3 -532f14e6| 1 gnu ssax r2, r4, r3 -332f54e6| 1 gnu uasx r2, r4, r3 -532f54e6| 1 gnu usax r2, r4, r3 -332f34e6| 1 gnu shasx r2, r4, r3 -532f34e6| 1 gnu shsax r2, r4, r3 -332f74e6| 1 gnu uhasx r2, r4, r3 -532f74e6| 1 gnu uhsax r2, r4, r3 -dc51afe7| 1 plan9 SBFX $16, $3, R12, R5 -dc51efe7| 1 plan9 UBFX $16, $3, R12, R5 -b12f88e6| 1 gnu sel r2, r8, r1 -000201f1| 1 gnu setend be -000001f1| 1 gnu setend le -04f020e3| 1 gnu sev -1155aae6| 1 gnu ssat r5, #11, r1, lsl #10 -5155aae6| 1 gnu ssat r5, #11, r1, asr #10 -335faae6| 1 gnu ssat16 r5, #11, r3 -1155eae6| 1 gnu usat r5, #10, r1, lsl #10 -5155eae6| 1 gnu usat r5, #10, r1, asr #10 -335feae6| 1 gnu usat16 r5, #10, r3 -7788a9e6| 1 plan9 SXTAB R7@>$16, R9, R8 -778889e6| 1 plan9 SXTAB16 R7@>$16, R9, R8 -7788b9e6| 1 plan9 SXTAH R7@>$16, R9, R8 -7784afe6| 1 plan9 MOVBS R7@>$8, R8 -778c8fe6| 1 plan9 SXTB16 R7@>$24, R8 -7780bf16| 1 plan9 MOVHS.NE R7, R8 -7788e906| 1 plan9 UXTAB.EQ R7@>$16, R9, R8 -7788c9e6| 1 plan9 UXTAB16 R7@>$16, R9, R8 -7788f9e6| 1 plan9 UXTAH R7@>$16, R9, R8 -7784efe6| 1 plan9 MOVBU R7@>$8, R8 -778ccfe6| 1 plan9 UXTB16 R7@>$24, R8 -7780ffe6| 1 plan9 MOVHU R7, R8 -11f288e7| 1 gnu usad8 r8, r1, r2 -112388e7| 1 gnu usada8 r8, r1, r3, r2 -02f020e3| 1 gnu wfe -03f020e3| 1 gnu wfi -01f020e3| 1 gnu yield diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/decode_test.go b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/decode_test.go deleted file mode 100644 index 9c7d2b62d5..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/decode_test.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2017 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 arm64asm - -import ( - "encoding/hex" - "io/ioutil" - "path/filepath" - "strings" - "testing" -) - -func testDecode(t *testing.T, syntax string) { - input := filepath.Join("testdata", syntax+"cases.txt") - data, err := ioutil.ReadFile(input) - if err != nil { - t.Fatal(err) - } - all := string(data) - for strings.Contains(all, "\t\t") { - all = strings.Replace(all, "\t\t", "\t", -1) - } - for _, line := range strings.Split(all, "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.SplitN(line, "\t", 2) - i := strings.Index(f[0], "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f[0]) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f[0]) - } - code, err := hex.DecodeString(f[0][:i] + f[0][i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f[0], err) - continue - } - asm := f[1] - inst, decodeErr := Decode(code) - if decodeErr != nil && decodeErr != errUnknown { - // Some rarely used system instructions are not supported - // Following logicals will filter such unknown instructions - - t.Errorf("parsing %x: %s", code, decodeErr) - continue - } - var out string - switch syntax { - case "gnu": - out = GNUSyntax(inst) - case "plan9": - out = GoSyntax(inst, 0, nil, nil) - default: - t.Errorf("unknown syntax %q", syntax) - continue - } - // TODO: system instruction. - var Todo = strings.Fields(` - sys - dc - at - tlbi - ic - hvc - smc - `) - if strings.Replace(out, " ", "", -1) != strings.Replace(asm, " ", "", -1) && !hasPrefix(asm, Todo...) { - // Exclude MSR since GNU objdump result is incorrect. eg. 0xd504431f msr s0_4_c4_c3_0, xzr - if !strings.HasSuffix(asm, " nv") && !strings.HasPrefix(asm, "msr") { - t.Errorf("Decode(%s) [%s] = %s, want %s", strings.Trim(f[0], "|"), syntax, out, asm) - } - } - } -} - -func TestDecodeGNUSyntax(t *testing.T) { - testDecode(t, "gnu") -} - -func TestDecodeGoSyntax(t *testing.T) { - testDecode(t, "plan9") -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/ext_test.go b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/ext_test.go deleted file mode 100644 index f432203e15..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/ext_test.go +++ /dev/null @@ -1,604 +0,0 @@ -// Copyright 2017 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. - -// Support for testing against external disassembler program. -// Copied and simplified from ../../arm/armasm/ext_test.go. - -package arm64asm - -import ( - "bufio" - "bytes" - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "math/rand" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "strings" - "testing" - "time" -) - -var ( - dumpTest = flag.Bool("dump", false, "dump all encodings") - mismatch = flag.Bool("mismatch", false, "log allowed mismatches") - longTest = flag.Bool("long", false, "long test") - keep = flag.Bool("keep", false, "keep object files around") - debug = false -) - -// An ExtInst represents a single decoded instruction parsed -// from an external disassembler's output. -type ExtInst struct { - addr uint64 - enc [4]byte - nenc int - text string -} - -func (r ExtInst) String() string { - return fmt.Sprintf("%#x: % x: %s", r.addr, r.enc, r.text) -} - -// An ExtDis is a connection between an external disassembler and a test. -type ExtDis struct { - Arch Mode - Dec chan ExtInst - File *os.File - Size int - KeepFile bool - Cmd *exec.Cmd -} - -// InstJson describes instruction fields value got from ARMv8-A Reference Manual -type InstJson struct { - Name string - Bits string - Arch string - Syntax string - Code string - Alias string - Enc uint32 -} - -// A Mode is an instruction execution mode. -type Mode int - -const ( - _ Mode = iota - ModeARM64 -) - -// Run runs the given command - the external disassembler - and returns -// a buffered reader of its standard output. -func (ext *ExtDis) Run(cmd ...string) (*bufio.Reader, error) { - if *keep { - log.Printf("%s\n", strings.Join(cmd, " ")) - } - ext.Cmd = exec.Command(cmd[0], cmd[1:]...) - out, err := ext.Cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("stdoutpipe: %v", err) - } - if err := ext.Cmd.Start(); err != nil { - return nil, fmt.Errorf("exec: %v", err) - } - - b := bufio.NewReaderSize(out, 1<<20) - return b, nil -} - -// Wait waits for the command started with Run to exit. -func (ext *ExtDis) Wait() error { - return ext.Cmd.Wait() -} - -// testExtDis tests a set of byte sequences against an external disassembler. -// The disassembler is expected to produce the given syntax and run -// in the given architecture mode (16, 32, or 64-bit). -// The extdis function must start the external disassembler -// and then parse its output, sending the parsed instructions on ext.Dec. -// The generate function calls its argument f once for each byte sequence -// to be tested. The generate function itself will be called twice, and it must -// make the same sequence of calls to f each time. -// When a disassembly does not match the internal decoding, -// allowedMismatch determines whether this mismatch should be -// allowed, or else considered an error. -func testExtDis( - t *testing.T, - syntax string, - arch Mode, - extdis func(ext *ExtDis) error, - generate func(f func([]byte)), - allowedMismatch func(text string, inst *Inst, dec ExtInst) bool, -) { - start := time.Now() - ext := &ExtDis{ - Dec: make(chan ExtInst), - Arch: arch, - } - errc := make(chan error) - - // First pass: write instructions to input file for external disassembler. - file, f, size, err := writeInst(generate) - if err != nil { - t.Fatal(err) - } - ext.Size = size - ext.File = f - defer func() { - f.Close() - if !*keep { - os.Remove(file) - } - }() - - // Second pass: compare disassembly against our decodings. - var ( - totalTests = 0 - totalSkips = 0 - totalErrors = 0 - - errors = make([]string, 0, 100) // Sampled errors, at most cap - ) - go func() { - errc <- extdis(ext) - }() - - generate(func(enc []byte) { - dec, ok := <-ext.Dec - if !ok { - t.Errorf("decoding stream ended early") - return - } - inst, text := disasm(syntax, pad(enc)) - - totalTests++ - if *dumpTest { - fmt.Printf("%x -> %s [%d]\n", enc[:len(enc)], dec.text, dec.nenc) - } - if text != dec.text && !strings.Contains(dec.text, "unknown") && syntax == "gnu" { - suffix := "" - if allowedMismatch(text, &inst, dec) { - totalSkips++ - if !*mismatch { - return - } - suffix += " (allowed mismatch)" - } - totalErrors++ - cmp := fmt.Sprintf("decode(%x) = %q, %d, want %q, %d%s\n", enc, text, len(enc), dec.text, dec.nenc, suffix) - - if len(errors) >= cap(errors) { - j := rand.Intn(totalErrors) - if j >= cap(errors) { - return - } - errors = append(errors[:j], errors[j+1:]...) - } - errors = append(errors, cmp) - } - }) - - if *mismatch { - totalErrors -= totalSkips - } - - for _, b := range errors { - t.Log(b) - } - - if totalErrors > 0 { - t.Fail() - } - t.Logf("%d test cases, %d expected mismatches, %d failures; %.0f cases/second", totalTests, totalSkips, totalErrors, float64(totalTests)/time.Since(start).Seconds()) - t.Logf("decoder coverage: %.1f%%;\n", decodeCoverage()) - if err := <-errc; err != nil { - t.Fatalf("external disassembler: %v", err) - } - -} - -// Start address of text. -const start = 0x8000 - -// writeInst writes the generated byte sequences to a new file -// starting at offset start. That file is intended to be the input to -// the external disassembler. -func writeInst(generate func(func([]byte))) (file string, f *os.File, size int, err error) { - f, err = ioutil.TempFile("", "arm64asm") - if err != nil { - return - } - - file = f.Name() - - f.Seek(start, io.SeekStart) - w := bufio.NewWriter(f) - defer w.Flush() - size = 0 - generate(func(x []byte) { - if debug { - fmt.Printf("%#x: %x%x\n", start+size, x, zeros[len(x):]) - } - w.Write(x) - w.Write(zeros[len(x):]) - size += len(zeros) - }) - return file, f, size, nil -} - -var zeros = []byte{0, 0, 0, 0} - -// pad pads the code sequence with pops. -func pad(enc []byte) []byte { - if len(enc) < 4 { - enc = append(enc[:len(enc):len(enc)], zeros[:4-len(enc)]...) - } - return enc -} - -// disasm returns the decoded instruction and text -// for the given source bytes, using the given syntax and mode. -func disasm(syntax string, src []byte) (inst Inst, text string) { - var err error - inst, err = Decode(src) - if err != nil { - text = "error: " + err.Error() - return - } - text = inst.String() - switch syntax { - case "gnu": - text = GNUSyntax(inst) - case "plan9": // [sic] - text = GoSyntax(inst, 0, nil, nil) - default: - text = "error: unknown syntax " + syntax - } - return -} - -// decodecoverage returns a floating point number denoting the -// decoder coverage. -func decodeCoverage() float64 { - n := 0 - for _, t := range decoderCover { - if t { - n++ - } - } - return 100 * float64(1+n) / float64(1+len(decoderCover)) -} - -// Helpers for writing disassembler output parsers. - -// hasPrefix reports whether any of the space-separated words in the text s -// begins with any of the given prefixes. -func hasPrefix(s string, prefixes ...string) bool { - for _, prefix := range prefixes { - for cur_s := s; cur_s != ""; { - if strings.HasPrefix(cur_s, prefix) { - return true - } - i := strings.Index(cur_s, " ") - if i < 0 { - break - } - cur_s = cur_s[i+1:] - } - } - return false -} - -// isHex reports whether b is a hexadecimal character (0-9a-fA-F). -func isHex(b byte) bool { - return ('0' <= b && b <= '9') || ('a' <= b && b <= 'f') || ('A' <= b && b <= 'F') -} - -// parseHex parses the hexadecimal byte dump in hex, -// appending the parsed bytes to raw and returning the updated slice. -// The returned bool reports whether any invalid hex was found. -// Spaces and tabs between bytes are okay but any other non-hex is not. -func parseHex(hex []byte, raw []byte) ([]byte, bool) { - hex = bytes.TrimSpace(hex) - for j := 0; j < len(hex); { - for hex[j] == ' ' || hex[j] == '\t' { - j++ - } - if j >= len(hex) { - break - } - if j+2 > len(hex) || !isHex(hex[j]) || !isHex(hex[j+1]) { - return nil, false - } - raw = append(raw, unhex(hex[j])<<4|unhex(hex[j+1])) - j += 2 - } - return raw, true -} - -func unhex(b byte) byte { - if '0' <= b && b <= '9' { - return b - '0' - } else if 'A' <= b && b <= 'F' { - return b - 'A' + 10 - } else if 'a' <= b && b <= 'f' { - return b - 'a' + 10 - } - return 0 -} - -// index is like bytes.Index(s, []byte(t)) but avoids the allocation. -func index(s []byte, t string) int { - i := 0 - for { - j := bytes.IndexByte(s[i:], t[0]) - if j < 0 { - return -1 - } - i = i + j - if i+len(t) > len(s) { - return -1 - } - for k := 1; k < len(t); k++ { - if s[i+k] != t[k] { - goto nomatch - } - } - return i - nomatch: - i++ - } -} - -// fixSpace rewrites runs of spaces, tabs, and newline characters into single spaces in s. -// If s must be rewritten, it is rewritten in place. -func fixSpace(s []byte) []byte { - s = bytes.TrimSpace(s) - for i := 0; i < len(s); i++ { - if s[i] == '\t' || s[i] == '\n' || i > 0 && s[i] == ' ' && s[i-1] == ' ' { - goto Fix - } - } - return s - -Fix: - b := s - w := 0 - for i := 0; i < len(s); i++ { - c := s[i] - if c == '\t' || c == '\n' { - c = ' ' - } - if c == ' ' && w > 0 && b[w-1] == ' ' { - continue - } - b[w] = c - w++ - } - if w > 0 && b[w-1] == ' ' { - w-- - } - return b[:w] -} - -// Fllowing regular expressions matches instructions using relative addressing mode. -// pcrel matches B instructions and BL instructions. -// pcrelr matches instrucions which consisted of register arguments and label arguments. -// pcrelim matches instructions which consisted of register arguments, immediate -// arguments and lable arguments. -// pcrelrzr and prcelimzr matches instructions when register arguments is zero register. -// pcrelprfm matches PRFM instructions when arguments consisted of register and lable. -// pcrelprfmim matches PRFM instructions when arguments consisted of immediate and lable. -var ( - pcrel = regexp.MustCompile(`^((?:.* )?(?:b|bl)x?(?:\.)?(?:eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|nv)?) 0x([0-9a-f]+)$`) - pcrelr = regexp.MustCompile(`^((?:.*)?(?:ldr|adrp|adr|cbnz|cbz|ldrsw) (?:x|w|s|d|q)(?:[0-9]+,)) 0x([0-9a-f]+)$`) - pcrelrzr = regexp.MustCompile(`^((?:.*)?(?:ldr|adrp|adr|cbnz|cbz|ldrsw) (?:x|w)zr,) 0x([0-9a-f]+)$`) - pcrelim = regexp.MustCompile(`^((?:.*)?(?:tbnz|tbz) (?:x|w)(?:[0-9]+,) (?:#[0-9a-f]+,)) 0x([0-9a-f]+)$`) - pcrelimzr = regexp.MustCompile(`^((?:.*)?(?:tbnz|tbz) (?:x|w)zr, (?:#[0-9a-f]+,)) 0x([0-9a-f]+)$`) - pcrelprfm = regexp.MustCompile(`^((?:.*)?(?:prfm) (?:[0-9a-z]+,)) 0x([0-9a-f]+)$`) - pcrelprfmim = regexp.MustCompile(`^((?:.*)?(?:prfm) (?:#0x[0-9a-f]+,)) 0x([0-9a-f]+)$`) -) - -// Round is the multiple of the number of instructions that read from Json file. -// Round used as seed value for pseudo-random number generator provides the same sequence -// in the same round run for the external disassembler and decoder. -var Round int - -// condmark is used to mark conditional instructions when need to generate and test -// conditional instructions. -var condmark bool = false - -// Generate instruction binary according to Json file -// Encode variable field of instruction with random value -func doFuzzy(inst *InstJson, Ninst int) { - var testdata uint32 - var NonDigRE = regexp.MustCompile(`[\D]`) - rand.Seed(int64(Round + Ninst)) - off := 0 - DigBit := "" - if condmark == true && !strings.Contains(inst.Bits, "cond") { - inst.Enc = 0xffffffff - } else { - for _, f := range strings.Split(inst.Bits, "|") { - if i := strings.Index(f, ":"); i >= 0 { - // consider f contains "01:2" and "Rm:5" - DigBit = f[:i] - m := NonDigRE.FindStringSubmatch(DigBit) - if m == nil { - DigBit = strings.TrimSpace(DigBit) - s := strings.Split(DigBit, "") - for i := 0; i < len(s); i++ { - switch s[i] { - case "1", "(1)": - testdata |= 1 << uint(31-off) - } - off++ - } - } else { - // DigBit is "Rn" or "imm3" - n, _ := strconv.Atoi(f[i+1:]) - if DigBit == "cond" && condmark == true { - r := uint8(Round) - for i := n - 1; i >= 0; i-- { - switch (r >> uint(i)) & 1 { - case 1: - testdata |= 1 << uint(31-off) - } - off++ - } - } else { - for i := 0; i < n; i++ { - r := rand.Intn(2) - switch r { - case 1: - testdata |= 1 << uint(31-off) - } - off++ - } - } - } - continue - } - for _, bit := range strings.Fields(f) { - switch bit { - case "0", "(0)": - off++ - continue - case "1", "(1)": - testdata |= 1 << uint(31-off) - default: - r := rand.Intn(2) - switch r { - case 1: - testdata |= 1 << uint(31-off) - } - } - off++ - } - } - if off != 32 { - log.Printf("incorrect bit count for %s %s: have %d", inst.Name, inst.Bits, off) - } - inst.Enc = testdata - } -} - -// Generators. -// -// The test cases are described as functions that invoke a callback repeatedly, -// with a new input sequence each time. These helpers make writing those -// a little easier. - -// JSONCases generates ARM64 instructions according to inst.json. -func JSONCases(t *testing.T) func(func([]byte)) { - return func(try func([]byte)) { - data, err := ioutil.ReadFile("inst.json") - if err != nil { - t.Fatal(err) - } - var insts []InstJson - var instsN []InstJson - // Change N value to get more cases only when condmark=false. - N := 100 - if condmark == true { - N = 16 - } - if err := json.Unmarshal(data, &insts); err != nil { - t.Fatal(err) - } - // Append instructions to get more test cases. - for i := 0; i < N; { - for _, inst := range insts { - instsN = append(instsN, inst) - } - i++ - } - Round = 0 - for i := range instsN { - if i%len(insts) == 0 { - Round++ - } - doFuzzy(&instsN[i], i) - } - for _, inst := range instsN { - if condmark == true && inst.Enc == 0xffffffff { - continue - } - enc := inst.Enc - try([]byte{byte(enc), byte(enc >> 8), byte(enc >> 16), byte(enc >> 24)}) - } - } -} - -// condCases generates conditional instructions. -func condCases(t *testing.T) func(func([]byte)) { - return func(try func([]byte)) { - condmark = true - JSONCases(t)(func(enc []byte) { - try(enc) - }) - } -} - -// hexCases generates the cases written in hexadecimal in the encoded string. -// Spaces in 'encoded' separate entire test cases, not individual bytes. -func hexCases(t *testing.T, encoded string) func(func([]byte)) { - return func(try func([]byte)) { - for _, x := range strings.Fields(encoded) { - src, err := hex.DecodeString(x) - if err != nil { - t.Errorf("parsing %q: %v", x, err) - } - try(src) - } - } -} - -// testdataCases generates the test cases recorded in testdata/cases.txt. -// It only uses the inputs; it ignores the answers recorded in that file. -func testdataCases(t *testing.T, syntax string) func(func([]byte)) { - var codes [][]byte - input := filepath.Join("testdata", syntax+"cases.txt") - data, err := ioutil.ReadFile(input) - if err != nil { - t.Fatal(err) - } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.Fields(line)[0] - i := strings.Index(f, "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f) - } - code, err := hex.DecodeString(f[:i] + f[i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f, err) - continue - } - codes = append(codes, code) - } - - return func(try func([]byte)) { - for _, code := range codes { - try(code) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdump_test.go b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdump_test.go deleted file mode 100644 index 261c7cae5f..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdump_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2017 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 arm64asm - -import ( - "strings" - "testing" -) - -func TestObjdumpARM64TestDecodeGNUSyntaxdata(t *testing.T) { - testObjdumpARM64(t, testdataCases(t, "gnu")) -} -func TestObjdumpARM64TestDecodeGoSyntaxdata(t *testing.T) { - testObjdumpARM64(t, testdataCases(t, "plan9")) -} -func TestObjdumpARM64Manual(t *testing.T) { testObjdumpARM64(t, hexCases(t, objdumpManualTests)) } -func TestObjdumpARM64Cond(t *testing.T) { testObjdumpARM64(t, condCases(t)) } -func TestObjdumpARM64(t *testing.T) { testObjdumpARM64(t, JSONCases(t)) } - -// objdumpManualTests holds test cases that will be run by TestObjdumpARMManual. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=Manual, particularly with tracing enabled. -// Note that these are byte sequences, so they must be reversed from the usual -// word presentation. -var objdumpManualTests = ` -bf2003d5 -9f2003d5 -7f2003d5 -5f2003d5 -3f2003d5 -1f2003d5 -df4d03d5 -ff4d03d5 -28d91b14 -da6cb530 -15e5e514 -ff4603d5 -df4803d5 -bf4100d5 -9f3f03d5 -9f3e03d5 -9f3d03d5 -9f3b03d5 -9f3a03d5 -9f3903d5 -9f3703d5 -9f3603d5 -9f3503d5 -9f3303d5 -9f3203d5 -9f3103d5 -ff4603d5 -df4803d5 -bf4100d5 -a3681b53 -47dc78d3 -0500a012 -0500e092 -0500a052 -0500a0d2 -cd5a206e -cd5a202e -743d050e -743d0a0e -743d0c0e -743d084e -` - -// allowedMismatchObjdump reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchObjdump(text string, inst *Inst, dec ExtInst) bool { - // Skip unsupported instructions - if hasPrefix(dec.text, todo...) { - return true - } - // GNU objdump has incorrect alias conditions for following instructions - if inst.Enc&0x000003ff == 0x000003ff && hasPrefix(dec.text, "negs") && hasPrefix(text, "cmp") { - return true - } - // GNU objdump "NV" is equal to our "AL" - if strings.HasSuffix(dec.text, " nv") && strings.HasSuffix(text, " al") { - return true - } - if strings.HasPrefix(dec.text, "b.nv") && strings.HasPrefix(text, "b.al") { - return true - } - // GNU objdump recognizes invalid binaries as following instructions - if hasPrefix(dec.text, "hint", "mrs", "msr", "bfc", "orr", "mov") { - return true - } - if strings.HasPrefix(text, "hint") { - return true - } - // GNU objdump recognizes reserved valuse as valid ones - if strings.Contains(text, "unknown instruction") && hasPrefix(dec.text, "fmla", "fmul", "fmulx", "fcvtzs", "fcvtzu", "fmls", "fmov", "scvtf", "ucvtf") { - return true - } - // Some old objdump recognizes ldur*/stur*/prfum as ldr*/str*/prfm - for k, v := range oldObjdumpMismatch { - if strings.HasPrefix(dec.text, k) && strings.Replace(dec.text, k, v, 1) == text { - return true - } - } - // GNU objdump misses spaces between operands for some instructions (e.g., "ld1 {v10.2s, v11.2s}, [x23],#16") - if strings.Replace(text, " ", "", -1) == strings.Replace(dec.text, " ", "", -1) { - return true - } - return false -} - -// TODO: system instruction. -var todo = strings.Fields(` - sys - dc - at - tlbi - ic - hvc - smc -`) - -// Following instructions can't be covered because they are just aliases to another instructions which are always preferred -var Ncover = strings.Fields(` - sbfm - asrv - bfm - ubfm - lslv - lsrv - rorv - ins - dup -`) - -// Some old objdump wrongly decodes following instructions and allow their mismatches to avoid false alarm -var oldObjdumpMismatch = map[string]string{ - //oldObjValue correctValue - "ldr": "ldur", - "ldrb": "ldurb", - "ldrh": "ldurh", - "ldrsb": "ldursb", - "ldrsh": "ldursh", - "ldrsw": "ldursw", - "str": "stur", - "strb": "sturb", - "strh": "sturh", - "prfm": "prfum", -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdumpext_test.go b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdumpext_test.go deleted file mode 100644 index 3bf4fa8539..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/objdumpext_test.go +++ /dev/null @@ -1,299 +0,0 @@ -// Copyright 2017 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. - -// Copied and simplified from ../../arm/armasm/objdumpext_test.go. - -package arm64asm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "fmt" - "io" - "log" - "os" - "os/exec" - "strconv" - "strings" - "testing" -) - -const objdumpPath = "/usr/bin/objdump" - -func testObjdumpARM64(t *testing.T, generate func(func([]byte))) { - testObjdumpArch(t, generate, ModeARM64) -} - -func testObjdumpArch(t *testing.T, generate func(func([]byte)), arch Mode) { - checkObjdumpAarch64(t) - testExtDis(t, "gnu", arch, objdump, generate, allowedMismatchObjdump) - testExtDis(t, "plan9", arch, objdump, generate, allowedMismatchObjdump) -} - -func checkObjdumpAarch64(t *testing.T) { - out, err := exec.Command(objdumpPath, "-i").Output() - if err != nil { - t.Skipf("cannot run objdump: %v\n%s", err, out) - } - if !strings.Contains(string(out), "aarch64") { - t.Skip("objdump does not have aarch64 support") - } -} - -func objdump(ext *ExtDis) error { - // File already written with instructions; add ELF header. - if ext.Arch == ModeARM64 { - if err := writeELF64(ext.File, ext.Size); err != nil { - return err - } - } else { - panic("unknown arch") - } - - b, err := ext.Run(objdumpPath, "-d", "-z", ext.File.Name()) - if err != nil { - return err - } - - var ( - nmatch int - reading bool - next uint64 = start - addr uint64 - encbuf [4]byte - enc []byte - text string - ) - flush := func() { - if addr == next { - // PC-relative addresses are translated to absolute addresses based on PC by GNU objdump - // Following logical rewrites the absolute addresses back to PC-relative ones for comparing - // with our disassembler output which are PC-relative - - if m := pcrelprfmim.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - if m := pcrelprfm.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - if m := pcrelim.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - if m := pcrelimzr.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - if m := pcrelr.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - if strings.Contains(m[1], "adrp") { - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr&0xfffff000))) - } else { - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - } - if m := pcrelrzr.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - if strings.Contains(m[1], "adrp") { - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr&0xfffff000))) - } else { - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - } - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], uint64(targ-uint64(addr))) - } - if strings.HasPrefix(text, "mov") && strings.Contains(text, "//") { - s := strings.Split(text, " //") - text = s[0] - } - text = strings.Replace(text, "#0.0", "#0", -1) - if text == "undefined" && len(enc) == 4 { - text = "error: unknown instruction" - enc = nil - } - if len(enc) == 4 { - // prints as word but we want to record bytes - enc[0], enc[3] = enc[3], enc[0] - enc[1], enc[2] = enc[2], enc[1] - } - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [4]byte{} - enc = nil - next += 4 - } - } - var textangle = []byte("<.text>:") - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading objdump output: %v", err) - } - if bytes.Contains(line, textangle) { - reading = true - continue - } - if !reading { - continue - } - if debug { - os.Stdout.Write(line) - } - if enc1 := parseContinuation(line, encbuf[:len(enc)]); enc1 != nil { - enc = enc1 - continue - } - flush() - nmatch++ - addr, enc, text = parseLine(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - } - flush() - if next != start+uint64(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -var ( - undefined = []byte("undefined") - unpredictable = []byte("unpredictable") - slashslash = []byte("//") -) - -func parseLine(line []byte, encstart []byte) (addr uint64, enc []byte, text string) { - ok := false - oline := line - i := index(line, ":\t") - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - x, err := strconv.ParseUint(string(bytes.TrimSpace(line[:i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint64(x) - line = line[i+2:] - i = bytes.IndexByte(line, '\t') - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - enc, ok = parseHex(line[:i], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", oline) - } - line = bytes.TrimSpace(line[i:]) - if bytes.Contains(line, undefined) { - text = "undefined" - return - } - if false && bytes.Contains(line, unpredictable) { - text = "unpredictable" - return - } - // Strip trailing comment starting with ';' - // e.g: "csinv x23, x2, x19, cc ; xxx" - if i := bytes.IndexByte(line, ';'); i >= 0 { - line = bytes.TrimSpace(line[:i]) - } - // Strip trailing comment starting with "//" - // e.g: "fccmpe s2, s9, #0x7, ne // xxx" - if i := bytes.Index(line, slashslash); i >= 0 { - line = bytes.TrimSpace(line[:i]) - } - text = string(fixSpace(line)) - return -} - -func parseContinuation(line []byte, enc []byte) []byte { - i := index(line, ":\t") - if i < 0 { - return nil - } - line = line[i+1:] - enc, _ = parseHex(line, enc) - return enc -} - -// writeELF64 writes an ELF64 header to the file, describing a text -// segment that starts at start (0x8000) and extends for size bytes. -func writeELF64(f *os.File, size int) error { - f.Seek(0, io.SeekStart) - var hdr elf.Header64 - var prog elf.Prog64 - var sect elf.Section64 - var buf bytes.Buffer - binary.Write(&buf, binary.LittleEndian, &hdr) - off1 := buf.Len() - binary.Write(&buf, binary.LittleEndian, &prog) - off2 := buf.Len() - binary.Write(&buf, binary.LittleEndian, §) - off3 := buf.Len() - buf.Reset() - data := byte(elf.ELFDATA2LSB) - hdr = elf.Header64{ - Ident: [16]byte{0x7F, 'E', 'L', 'F', 2, data, 1}, - Type: 2, - Machine: uint16(elf.EM_AARCH64), - Version: 1, - Entry: start, - Phoff: uint64(off1), - Shoff: uint64(off2), - Flags: 0x05000002, - Ehsize: uint16(off1), - Phentsize: uint16(off2 - off1), - Phnum: 1, - Shentsize: uint16(off3 - off2), - Shnum: 3, - Shstrndx: 2, - } - binary.Write(&buf, binary.LittleEndian, &hdr) - prog = elf.Prog64{ - Type: 1, - Off: start, - Vaddr: start, - Paddr: start, - Filesz: uint64(size), - Memsz: uint64(size), - Flags: 5, - Align: start, - } - binary.Write(&buf, binary.LittleEndian, &prog) - binary.Write(&buf, binary.LittleEndian, §) // NULL section - sect = elf.Section64{ - Name: 1, - Type: uint32(elf.SHT_PROGBITS), - Addr: start, - Off: start, - Size: uint64(size), - Flags: uint64(elf.SHF_ALLOC | elf.SHF_EXECINSTR), - Addralign: 4, - } - binary.Write(&buf, binary.LittleEndian, §) // .text - sect = elf.Section64{ - Name: uint32(len("\x00.text\x00")), - Type: uint32(elf.SHT_STRTAB), - Addr: 0, - Off: uint64(off2 + (off3-off2)*3), - Size: uint64(len("\x00.text\x00.shstrtab\x00")), - Addralign: 1, - } - binary.Write(&buf, binary.LittleEndian, §) - buf.WriteString("\x00.text\x00.shstrtab\x00") - f.Write(buf.Bytes()) - return nil -} diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/Makefile b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/Makefile deleted file mode 100644 index 9ff54a6e16..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -go test command: - cd ..; go test -run 'ObjdumpARM64Cond' -v -timeout 10h -long 2>&1 | tee log - cd ..; go test -run 'ObjdumpARM64TestGUNSyntaxdata' -v -timeout 10h -long 2>&1 | tee -a log - cd ..; go test -run 'ObjdumpARM64TestGoSyntaxdata' -v -timeout 10h -long 2>&1 | tee -a log - cd ..; go test -run 'ObjdumpARM64' -v -timeout 10h -long 2>&1 | tee -a log - cd ..; go test -run 'ObjdumpARM64Manual' -v -timeout 10h -long 2>&1 | tee -a log - cd ..; go test -run 'TestDecodeGNUSyntax' - cd ..; go test -run 'TestDecodeGoSyntax' - cd ..; go test -run '.*' diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/gnucases.txt b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/gnucases.txt deleted file mode 100644 index 2154209960..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/gnucases.txt +++ /dev/null @@ -1,4651 +0,0 @@ -0a011f1a| adc w10, w8, wzr -4c00009a| adc x12, x2, x0 -a602093a| adcs w6, w21, w9 -d60217ba| adcs x22, x22, x23 -0921250b| add w9, w8, w5, uxth -ee9e288b| add x14, x23, w8, sxtb #7 -23123011| add w3, w17, #0xc04 -2ba32391| add x11, x25, #0x8e8 -67158d0b| add w7, w11, w13, asr #5 -30da198b| add x16, x17, x25, lsl #54 -a7e72c2b| adds w7, w29, w12, sxtx #1 -357338ab| adds x21, x25, x24, uxtx #4 -6b147731| adds w11, w3, #0xdc5, lsl #12 -cd59872b| adds w13, w14, w7, asr #22 -e41f4eab| adds x4, xzr, x14, lsr #7 -b7dd8470| adr x23, .+0xfffffffffff09bb7 -0f4996d0| adrp x15, .+0xffffffff2c922000 -a2432412| and w2, w29, #0xf0001fff -93910e92| and x19, x12, #0x7c007c007c007c -7a1ec98a| and x26, x19, x9, ror #7 -1ff32972| tst w24, #0xaaaaaaaa -458051f2| ands x5, x2, #0xffff80000000ffff -af629a6a| ands w15, w21, w26, asr #24 -7ab0dfea| ands x26, x3, xzr, ror #44 -792bcc1a| asr w25, w27, w12 -872bce9a| asr x7, x28, x14 -99ff4b93| asr x25, x28, #11 -1628c91a| asr w22, w0, w9 -4e2acf9a| asr x14, x18, x15 -4be5a454| b.lt .+0xfffffffffff49ca8 -53257114| b .+0x1c4954c -dbb557b3| bfxil x27, x14, #23, #23 -70e861b3| bfxil x16, x3, #33, #26 -88a75ab3| bfxil x8, x28, #26, #16 -b03ce70a| bic w16, w5, w7, ror #15 -9235ec8a| bic x18, x12, x12, ror #13 -7450b96a| bics w20, w3, w25, asr #20 -3730b3ea| bics x23, x1, x19, asr #12 -9b897797| bl .+0xfffffffffdde266c -e0013fd6| blr x15 -a0031fd6| br x29 -e08c31d4| brk #0x8c67 -027eb435| cbnz w2, .+0xfffffffffff68fc0 -c7eb42b5| cbnz x7, .+0x85d78 -8f1d4c34| cbz w15, .+0x983b0 -e1c5abb4| cbz x1, .+0xfffffffffff578bc -4bfb543a| ccmn w26, #0x14, #0xb, al -015b46ba| ccmn x24, #0x6, #0x1, pl -8602463a| ccmn w20, w6, #0x6, eq -c6d34cba| ccmn x30, x12, #0x6, le -a76b4f7a| ccmp w29, #0xf, #0x7, vs -e3d853fa| ccmp x7, #0x13, #0x3, le -4022467a| ccmp w18, w6, #0x0, cs -c7b346fa| ccmp x30, x6, #0x7, lt -ee279b1a| csinc w14, wzr, w27, cs -4174819a| csinc x1, x2, x1, vc -5100955a| csinv w17, w2, w21, eq -573093da| csinv x23, x2, x19, cc -5f3403d5| clrex #0x4 -e615c05a| cls w6, w15 -ff15c0da| cls xzr, x15 -2e10c05a| clz w14, w1 -a912c0da| clz x9, x21 -ff11352b| cmn w15, w21, uxtb #4 -1f5220ab| cmn x16, w0, uxtw #4 -ff02266b| cmp w23, w6, uxtb -5fb739eb| cmp x26, w25, sxth #5 -bfa73bf1| cmp x29, #0xee9 -7f5c47eb| cmp x3, x7, lsr #23 -2e458e5a| csneg w14, w9, w14, mi -c3559cda| csneg x3, x14, x28, pl -1041d11a| crc32b w16, w8, w17 -bb46c31a| crc32h w27, w21, w3 -c94bd61a| crc32w w9, w30, w22 -8f4cd49a| crc32x w15, w4, x20 -7653d21a| crc32cb w22, w27, w18 -1454d51a| crc32ch w20, w0, w21 -7c58c91a| crc32cw w28, w3, w9 -185ccb9a| crc32cx w24, w0, x11 -8c30941a| csel w12, w4, w20, cc -0ea08c9a| csel x14, x0, x12, ge -e3b79f1a| cset w3, ge -fea79f9a| cset x30, lt -e5639f5a| csetm w5, vc -e4739fda| csetm x4, vs -bad4981a| csinc w26, w5, w24, le -5167909a| csinc x17, x26, x16, vs -65e3955a| csinv w5, w27, w21, al -8e338bda| csinv x14, x28, x11, cc -0a269d5a| csneg w10, w16, w29, cs -ab1692da| csneg x11, x21, x18, ne -418ea5d4| dcps1 #0x2c72 -6239a5d4| dcps2 #0x29cb -e3ebabd4| dcps3 #0x5f5f -bf3a03d5| dmb ishst -e003bfd6| drps -9f3003d5| dsb #0x00 -c974354a| eon w9, w6, w21, lsl #29 -89b86eca| eon x9, x4, x14, lsr #46 -76e343d2| eor x22, x27, #0xe03fffffffffffff -536d8c4a| eor w19, w10, w12, asr #27 -d1ef1cca| eor x17, x30, x28, lsl #59 -e0039fd6| eret -591d8813| extr w25, w10, w8, #7 -888dd693| extr x8, x12, x22, #35 -bf2003d5| sevl -df2003d5| hint #0x6 -a0fc5fd4| hlt #0xffe5 -df3103d5| isb #0x1 -9dfddf88| ldar w29, [x12] -76ffdfc8| ldar x22, [x27] -36ffdf08| ldarb w22, [x25] -bcfcdf48| ldarh w28, [x5] -54c17f88| ldaxp w20, w16, [x10] -3eaf7fc8| ldaxp x30, x11, [x25] -e2fd5f88| ldaxr w2, [x15] -f5fd5fc8| ldaxr x21, [x15] -70fe5f08| ldaxrb w16, [x19] -bcfc5f48| ldaxrh w28, [x5] -ecff5928| ldnp w12, wzr, [sp,#204] -852744a8| ldnp x5, x9, [x28,#64] -1286d728| ldp w18, w1, [x16],#188 -7668e8a8| ldp x22, x26, [x3],#-384 -6d8bc729| ldp w13, w2, [x27,#60]! -1cadd1a9| ldp x28, x11, [x8,#280]! -bf4e7e29| ldp wzr, w19, [x21,#-16] -61695fa9| ldp x1, x26, [x11,#496] -4c00e668| ldpsw x12, x0, [x2],#-208 -85a0cb69| ldpsw x5, x8, [x4,#92]! -9b894d69| ldpsw x27, x2, [x12,#108] -e9955ab8| ldr w9, [x15],#-87 -5c255df8| ldr x28, [x10],#-46 -703c57b8| ldr w16, [x3,#-141]! -1dac57f8| ldr x29, [x0,#-134]! -393c50b9| ldr w25, [x1,#4156] -498d5cf9| ldr x9, [x10,#14616] -841fe218| ldr w4, .+0xfffffffffffc43f0 -cce88858| ldr x12, .+0xfffffffffff11d18 -72fa72b8| ldr w18, [x19,x18,sxtx #2] -daeb66f8| ldr x26, [x30,x6,sxtx] -8ca74238| ldrb w12, [x28],#42 -4e5c5e38| ldrb w14, [x2,#-27]! -03936d39| ldrb w3, [x24,#2916] -577a6e38| ldrb w23, [x18,x14,lsl #0] -adb54678| ldrh w13, [x13],#107 -820f4c78| ldrh w2, [x28,#192]! -92787579| ldrh w18, [x4,#6844] -4bd6c438| ldrsb w11, [x18],#77 -fb478238| ldrsb x27, [sp],#36 -4d7edc38| ldrsb w13, [x18,#-57]! -18ee9438| ldrsb x24, [x16,#-178]! -16b9c639| ldrsb w22, [x8,#430] -37958f39| ldrsb x23, [x9,#997] -af7ae238| ldrsb w15, [x21,x2,lsl #0] -1568fa38| ldrsb w21, [x0,x26] -744bbf38| ldrsb x20, [x27,wzr,uxtw] -f069a538| ldrsb x16, [x15,x5] -d9a6cd78| ldrsh w25, [x22],#218 -ff368b78| ldrsh xzr, [x23],#179 -5b8cc878| ldrsh w27, [x2,#136]! -361f9c78| ldrsh x22, [x25,#-63]! -359bec79| ldrsh w21, [x25,#5708] -4d6c8079| ldrsh x13, [x2,#54] -9deae578| ldrsh w29, [x20,x5,sxtx] -f2fab878| ldrsh x18, [x23,x24,sxtx #1] -02669cb8| ldrsw x2, [x16],#-58 -5c8e92b8| ldrsw x28, [x18,#-216]! -ea9e92b9| ldrsw x10, [x23,#4764] -6e280c98| ldrsw x14, .+0x1850c -49dabcb8| ldrsw x9, [x18,w28,sxtw #2] -64285eb8| ldtr w4, [x3,#-30] -6ab851f8| ldtr x10, [x3,#-229] -aa094f38| ldtrb w10, [x13,#240] -b7894e78| ldtrh w23, [x13,#232] -85cadd38| ldtrsb w5, [x20,#-36] -2db99838| ldtrsb x13, [x9,#-117] -7ef8ce78| ldtrsh w30, [x3,#239] -786a8978| ldtrsh x24, [x19,#150] -c5eb81b8| ldtrsw x5, [x30,#30] -a1f14bb8| ldur w1, [x13,#191] -c3425cf8| ldur x3, [x22,#-60] -2e125038| ldurb w14, [x17,#-255] -26004878| ldurh w6, [x1,#128] -c3e3cd38| ldursb w3, [x30,#222] -27618938| ldursb x7, [x9,#150] -7c71db78| ldursh w28, [x11,#-73] -1d109e78| ldursh x29, [x0,#-31] -d48084b8| ldursw x20, [x6,#72] -172f7f88| ldxp w23, w11, [x24] -10347fc8| ldxp x16, x13, [x0] -fe7f5f88| ldxr w30, [sp] -6c7f5fc8| ldxr x12, [x27] -047c5f08| ldxrb w4, [x0] -9a7d5f48| ldxrh w26, [x12] -4f21cb1a| lsl w15, w10, w11 -1523db9a| lsl x21, x24, x27 -81c74fd3| ubfx x1, x28, #15, #35 -c922c81a| lsl w9, w22, w8 -fd22dc9a| lsl x29, x23, x28 -4226dd1a| lsr w2, w18, w29 -a224ca9a| lsr x2, x5, x10 -707c0153| lsr w16, w3, #1 -34fc4cd3| lsr x20, x1, #12 -6c24c91a| lsr w12, w3, w9 -8527c89a| lsr x5, x28, x8 -ea36171b| madd w10, w23, w23, w13 -e47a0a9b| madd x4, x23, x10, x30 -35fd001b| mneg w21, w9, w0 -77ff0e9b| mneg x23, x27, x14 -38030011| add w24, w25, #0x0 -37030091| add x23, x25, #0x0 -94b8ad12| mov w20, #0x923bffff -fff29892| mov xzr, #0xffffffffffff3868 -d4adb252| mov w20, #0x956e0000 -8747e2d2| mov x7, #0x123c000000000000 -f5132d32| orr w21, wzr, #0xf80000 -eb7f34b2| mov x11, #0xffffffffffffffff -f503092a| mov w21, w9 -e7031eaa| mov x7, x30 -35e8c1f2| movk x21, #0xf41, lsl #32 -44629512| mov w4, #0xffff54ed -cc0dd392| mov x12, #0xffff6791ffffffff -cbfb9152| mov w11, #0x8fde -3d25ebd2| mov x29, #0x5929000000000000 -e67a3fd5| mrs x6, s3_7_c7_c10_7 -f9dd15d5| msr s2_5_c13_c13_7, x25 -25840c1b| msub w5, w1, w12, w1 -02ce1a9b| msub x2, x16, x26, x19 -b67c1a1b| mul w22, w5, w26 -607c049b| mul x0, x3, x4 -e97f6daa| mvn x9, x13, lsr #31 -fe071f6b| negs w30, wzr, lsl #1 -f68f14eb| negs x22, x20, lsl #35 -e8030d5a| ngc w8, w13 -fe031eda| ngc x30, x30 -e5030a7a| ngcs w5, w10 -f00318fa| ngcs x16, x24 -1f2003d5| nop -032ee42a| orn w3, w16, w4, ror #11 -634cf6aa| orn x3, x3, x22, ror #19 -f8492d32| orr w24, w15, #0xfff8003f -96f542b2| orr x22, x12, #0xcfffffffffffffff -1c110d2a| orr w28, w8, w13, lsl #4 -c65b1eaa| orr x6, x30, x30, lsl #22 -f300b2f9| prfm pstl2strm, [x7,#25600] -2aa196d8| prfm plil2keep, .+0xfffffffffff2d424 -2ad8bef8| prfm plil2keep, [x1,w30,sxtw #3] -c62184f8| prfum #0x06, [x14,#66] -3601c05a| rbit w22, w9 -6401c0da| rbit x4, x11 -e0035fd6| ret xzr -0a09c05a| rev w10, w8 -220cc0da| rev x2, x1 -b206c05a| rev16 w18, w21 -2407c0da| rev16 x4, x25 -7e0bc0da| rev32 x30, x27 -ae0ec0da| rev x14, x21 -336f8413| extr w19, w25, w4, #27 -af47ca93| extr x15, x29, x10, #17 -bc2cdb1a| ror w28, w5, w27 -e52fdd9a| ror x5, xzr, x29 -832dc31a| ror w3, w12, w3 -e22ec09a| ror x2, x23, x0 -1801045a| sbc w24, w8, w4 -5a0119da| sbc x26, x10, x25 -52021b7a| sbcs w18, w18, w27 -250105fa| sbcs x5, x9, x5 -fc430b13| sbfx w28, wzr, #11, #6 -a0574093| sbfx x0, x29, #0, #22 -8b3b7a93| sbfiz x11, x28, #6, #15 -fc310513| sbfx w28, w15, #5, #8 -fbdc4293| sbfx x27, x7, #2, #54 -c90dd61a| sdiv w9, w14, w22 -a90ecd9a| sdiv x9, x21, x13 -9f2003d5| sev -bf2003d5| sevl -d27f229b| smull x18, w30, w2 -efff3a9b| smnegl x15, wzr, w26 -7d963f9b| smsubl x29, w19, wzr, x5 -b57e519b| smulh x21, x21, x17 -a07c209b| smull x0, w5, w0 -d0fe9f88| stlr w16, [x22] -03ff9fc8| stlr x3, [x24] -8bff9f08| stlrb w11, [x28] -f0fe9f48| stlrh w16, [x23] -c6ae3588| stlxp w21, w6, w11, [x22] -c6fa22c8| stlxp w2, x6, x30, [x22] -affd0e88| stlxr w14, w15, [x13] -67ff1cc8| stlxr w28, x7, [x27] -17ff1c08| stlxrb w28, w23, [x24] -7bfe0b48| stlxrh w11, w27, [x19] -2a8c0528| stnp w10, w3, [x1,#44] -67fc10a8| stnp x7, xzr, [x3,#264] -5559bd28| stp w21, w22, [x10],#-24 -166c96a8| stp x22, x27, [x0],#352 -3d4a8729| stp w29, w18, [x17,#56]! -912f86a9| stp x17, x11, [x28,#96]! -c40d3029| stp w4, w3, [x14,#-128] -f73f39a9| stp x23, x15, [sp,#-112] -34441eb8| str w20, [x1],#-28 -11f60bf8| str x17, [x16],#191 -c15d15b8| str w1, [x14,#-171]! -ae4d12f8| str x14, [x13,#-220]! -03ef39b9| str w3, [x24,#14828] -208228f9| str x0, [x17,#20736] -734823f8| str x19, [x3,w3,uxtw] -ffb41838| strb wzr, [x7],#-117 -bb0d1a38| strb w27, [x13,#-96]! -b1612239| strb w17, [x13,#2200] -92682038| strb w18, [x4,x0] -81682638| strb w1, [x4,x6] -87841b78| strh w7, [x4],#-72 -cc3d1878| strh w12, [x14,#-125]! -53cf1c79| strh w19, [x26,#3686] -63792d78| strh w3, [x11,x13,lsl #1] -9d7803b8| sttr w29, [x4,#55] -b9c807f8| sttr x25, [x5,#124] -f04a1e38| sttrb w16, [x23,#-28] -52990078| sttrh w18, [x10,#9] -152002b8| stur w21, [x0,#34] -397217f8| stur x25, [x17,#-137] -8f320138| sturb w15, [x20,#19] -eb021b78| sturh w11, [x23,#-80] -854a3f88| stxp wzr, w5, w18, [x20] -d12620c8| stxp w0, x17, x9, [x22] -537e0288| stxr w2, w19, [x18] -af7d15c8| stxr w21, x15, [x13] -e97c1d08| stxrb w29, w9, [x7] -837d1b48| stxrh w27, w3, [x12] -f25e344b| sub w18, w23, w20, uxtw #7 -3ac825cb| sub x26, x1, w5, sxtw #2 -e8f40ccb| sub x8, x7, x12, lsl #61 -a6ad226b| subs w6, w13, w2, sxth #3 -647735eb| subs x4, x27, x21, uxtx #5 -c770566b| subs w7, w6, w22, lsr #28 -d03c1aeb| subs x16, x6, x26, lsl #15 -a17f03d4| svc #0x1bfd -991f0013| sxtb w25, w28 -a91d4093| sxtb x9, w13 -083d0013| sxth w8, w8 -393e4093| sxth x25, w17 -1b7c4093| sxtw x27, w0 -0c5b2cd5| sysl x12, #4, C5, C11, #0 -09868bb7| tbnz x9, #49, .+0x70c0 -8c2e6836| tbz w12, #13, .+0x5d0 -3f0d0172| tst w9, #0x80000007 -df6f7cf2| tst x30, #0xfffffff0 -1f2f11ea| tst x24, x17, lsl #11 -9ced71d3| ubfx x28, x12, #49, #11 -1cbb7fd3| ubfiz x28, x24, #1, #47 -25e661d3| ubfx x5, x17, #33, #25 -af0adc1a| udiv w15, w21, w28 -550ac29a| udiv x21, x18, x2 -9102b19b| umaddl x17, w20, w17, x0 -41fea39b| umnegl x1, w18, w3 -87d8a39b| umsubl x7, w4, w3, x22 -987ed89b| umulh x24, x20, x24 -d37eb29b| umull x19, w22, w18 -461c0053| uxtb w6, w2 -f43c0053| uxth w20, w7 -5f2003d5| wfe -7f2003d5| wfi -3f2003d5| yield -e5bb200e| abs v5.8b, v31.8b -c9842d0e| add v9.8b, v6.8b, v13.8b -f4bd394e| addp v20.16b, v15.16b, v25.16b -b3b8b14e| addv s19, v5.4s -cd5b284e| aesd v13.16b, v30.16b -4b4b284e| aese v11.16b, v26.16b -2879284e| aesimc v8.16b, v9.16b -fe68284e| aesmc v30.16b, v7.16b -f61e334e| and v22.16b, v23.16b, v19.16b -88a4002f| mvni v8.4h, #0x4, lsl #8 -1877076f| bic v24.4s, #0xf8, lsl #24 -0d1e6c0e| bic v13.8b, v16.8b, v12.8b -b81ce26e| bif v24.16b, v5.16b, v2.16b -381cbf2e| bit v24.8b, v1.8b, v31.8b -cd1f6c6e| bsl v13.16b, v30.16b, v12.16b -8d48a00e| cls v13.2s, v4.2s -324ba02e| clz v18.2s, v25.2s -c88f2b2e| cmeq v8.8b, v30.8b, v11.8b -a799e05e| cmeq d7, d13, #0 -dc9be04e| cmeq v28.2d, v30.2d, #0 -623f2d4e| cmge v2.16b, v27.16b, v13.16b -e889e06e| cmge v8.2d, v15.2d, #0 -cb37e55e| cmgt d11, d30, d5 -8e37b00e| cmgt v14.2s, v28.2s, v16.2s -1a8be04e| cmgt v26.2d, v24.2d, #0 -7f37eb7e| cmhi d31, d27, d11 -333d356e| cmhs v19.16b, v9.16b, v21.16b -bd9ae07e| cmle d29, d21, #0 -8999602e| cmle v9.4h, v12.4h, #0 -aca9e05e| cmlt d12, d13, #0 -7fa8204e| cmlt v31.16b, v3.16b, #0 -588db20e| cmtst v24.2s, v10.2s, v18.2s -cc051d5e| mov b12, v14.b[14] -4c06050e| dup v12.8b, v18.b[2] -790c020e| dup v25.4h, w3 -391d286e| eor v25.16b, v9.16b, v8.16b -4b30156e| ext v11.16b, v2.16b, v21.16b, #6 -44d6bf7e| fabd s4, s18, s31 -17fba00e| fabs v23.2s, v24.2s -90c2201e| fabs s16, s20 -62c2601e| fabs d2, d19 -eeef3f7e| facge s14, s31, s31 -09efa07e| facgt s9, s24, s0 -72edae6e| facgt v18.4s, v11.4s, v14.4s -61d5394e| fadd v1.4s, v11.4s, v25.4s -0d2a3d1e| fadd s13, s16, s29 -4b296f1e| fadd d11, d10, d15 -78d8307e| faddp s24, v3.2s -e7d7322e| faddp v7.2s, v31.2s, v18.2s -e8253c1e| fccmp s15, s28, #0x8, cs -e8857f1e| fccmp d15, d31, #0x8, hi -5714291e| fccmpe s2, s9, #0x7, ne -b484631e| fccmpe d5, d3, #0x4, hi -3ce5685e| fcmeq d28, d9, d8 -50e6214e| fcmeq v16.4s, v18.4s, v1.4s -9ddae05e| fcmeq d29, d20, #0 -b3e62b7e| fcmge s19, s21, s11 -0ce4396e| fcmge v12.4s, v0.4s, v25.4s -a6c9e07e| fcmge d6, d13, #0 -ede6bd7e| fcmgt s13, s23, s29 -13e6ae2e| fcmgt v19.2s, v16.2s, v14.2s -4cc9e05e| fcmgt d12, d10, #0 -41cba04e| fcmgt v1.4s, v26.4s, #0 -96d8e07e| fcmle d22, d4, #0 -0be9a05e| fcmlt s11, s8, #0 -dfe9a04e| fcmlt v31.4s, v14.4s, #0 -a023301e| fcmp s29, s16 -68213e1e| fcmp s11, #0 -20236d1e| fcmp d25, d13 -68216b1e| fcmp d11, #0 -3023351e| fcmpe s25, s21 -78203e1e| fcmpe s3, #0 -b022721e| fcmpe d21, d18 -f8226f1e| fcmpe d23, #0 -b54e271e| fcsel s21, s21, s7, mi -319f611e| fcsel d17, d25, d1, ls -2142e21e| fcvt s1, h17 -cfc3e21e| fcvt d15, h30 -01c1231e| fcvt h1, s8 -4fc0221e| fcvt d15, s2 -f9c0631e| fcvt h25, d7 -2b43621e| fcvt s11, d25 -f1c8615e| fcvtas d17, d7 -ea01241e| fcvtas w10, s15 -0c02249e| fcvtas x12, s16 -e702641e| fcvtas w7, d23 -f501649e| fcvtas x21, d15 -45ca217e| fcvtau s5, s18 -66c9212e| fcvtau v6.2s, v11.2s -b302251e| fcvtau w19, s21 -e102259e| fcvtau x1, s23 -5703651e| fcvtau w23, d26 -2c01659e| fcvtau x12, d9 -2c7b210e| fcvtl v12.4s, v25.4h -f478214e| fcvtl2 v20.4s, v7.8h -d1b8615e| fcvtms d17, d6 -a2ba614e| fcvtms v2.2d, v21.2d -ee01301e| fcvtms w14, s15 -de01309e| fcvtms x30, s14 -8401701e| fcvtms w4, d12 -c502709e| fcvtms x5, d22 -44b8617e| fcvtmu d4, d2 -5601311e| fcvtmu w22, s10 -4602319e| fcvtmu x6, s18 -1003711e| fcvtmu w16, d24 -e602719e| fcvtmu x6, d23 -c16b210e| fcvtn v1.4h, v30.4s -4d6b614e| fcvtn2 v13.4s, v26.2d -95ab215e| fcvtns s21, s28 -65a9614e| fcvtns v5.2d, v11.2d -8a02201e| fcvtns w10, s20 -bc03209e| fcvtns x28, s29 -fc01601e| fcvtns w28, d15 -9800609e| fcvtns x24, d4 -b1aa617e| fcvtnu d17, d21 -80a9216e| fcvtnu v0.4s, v12.4s -3201211e| fcvtnu w18, s9 -e101219e| fcvtnu x1, s15 -ae00611e| fcvtnu w14, d5 -9503619e| fcvtnu x21, d28 -3faae15e| fcvtps d31, d17 -c4a8e14e| fcvtps v4.2d, v6.2d -ab01281e| fcvtps w11, s13 -5800289e| fcvtps x24, s2 -9b02681e| fcvtps w27, d20 -de03689e| fcvtps x30, d30 -d8aaa17e| fcvtpu s24, s22 -e203291e| fcvtpu w2, s31 -5302299e| fcvtpu x19, s18 -5302691e| fcvtpu w19, d18 -8501699e| fcvtpu x5, d12 -93ff735f| fcvtzs d19, d28, #13 -b7fd504f| fcvtzs v23.2d, v13.2d, #48 -7ebba15e| fcvtzs s30, s27 -d49f181e| fcvtzs w20, s30, #25 -538d189e| fcvtzs x19, s10, #29 -7e74589e| fcvtzs x30, d3, #35 -4300381e| fcvtzs w3, s2 -bc03389e| fcvtzs x28, s29 -c702781e| fcvtzs w7, d22 -0401789e| fcvtzs x4, d8 -d1ff2e7f| fcvtzu s17, s30, #18 -d0fd3b2f| fcvtzu v16.2s, v14.2s, #5 -70bae17e| fcvtzu d16, d19 -3ef6191e| fcvtzu w30, s17, #3 -cae7199e| fcvtzu x10, s30, #7 -cffb599e| fcvtzu x15, d30, #2 -e402391e| fcvtzu w4, s23 -1a03399e| fcvtzu x26, s24 -0401791e| fcvtzu w4, d8 -c200799e| fcvtzu x2, d6 -ebfe346e| fdiv v11.4s, v23.4s, v20.4s -c918371e| fdiv s9, s6, s23 -911a7f1e| fdiv d17, d20, d31 -a81f0c1f| fmadd s8, s29, s12, s7 -d0404a1f| fmadd d16, d6, d10, d16 -7ff6324e| fmax v31.4s, v19.4s, v18.4s -b84b351e| fmax s24, s29, s21 -d64b621e| fmax d22, d30, d2 -016b241e| fmaxnm s1, s24, s4 -5b69781e| fmaxnm d27, d10, d24 -f1c8707e| fmaxnmp d17, v7.2d -27c5306e| fmaxnmp v7.4s, v9.4s, v16.4s -aef8707e| fmaxp d14, v5.2d -53f6202e| fmaxp v19.2s, v18.2s, v0.2s -78fb306e| fmaxv s24, v27.4s -5af4ec4e| fmin v26.2d, v2.2d, v12.2d -505a3c1e| fmin s16, s18, s28 -4858661e| fmin d8, d2, d6 -a9c6e04e| fminnm v9.2d, v21.2d, v0.2d -987b311e| fminnm s24, s28, s17 -95796f1e| fminnm d21, d12, d15 -f5cbb07e| fminnmp s21, v31.2s -b0f8f07e| fminp d16, v5.2d -8bf5a42e| fminp v11.2s, v12.2s, v4.2s -87cd384e| fmla v7.4s, v12.4s, v24.4s -fd50db5f| fmls d29, d7, v27.d[0] -d1ccb44e| fmls v17.4s, v6.4s, v20.4s -ebf5064f| fmov v11.4s, #-2.421875000000000000e-01 -49f4056f| fmov v9.2d, #-9.000000000000000000e+00 -0940201e| fmov s9, s0 -db43601e| fmov d27, d30 -a901271e| fmov s9, w13 -3702261e| fmov w23, s17 -4d02679e| fmov d13, x18 -9d02af9e| fmov v29.d[1], x20 -ef03669e| fmov x15, d31 -7101ae9e| fmov x17, v11.d[1] -0e103d1e| fmov s14, #-7.500000000000000000e-01 -1e50761e| fmov d30, #-1.800000000000000000e+01 -d2b4121f| fmsub s18, s6, s18, s13 -0a9c4c1f| fmsub d10, d0, d12, d7 -0d99b35f| fmul s13, s8, v19.s[3] -a89b9b0f| fmul v8.2s, v29.2s, v27.s[2] -75dc376e| fmul v21.4s, v3.4s, v23.4s -7909241e| fmul s25, s11, s4 -d7096b1e| fmul d23, d14, d11 -2999ab7f| fmulx s9, s9, v11.s[3] -35dd6d5e| fmulx d21, d9, d13 -c8dc284e| fmulx v8.4s, v6.4s, v8.4s -c043211e| fneg s0, s30 -4742611e| fneg d7, d18 -9c51251f| fnmadd s28, s12, s5, s20 -e407771f| fnmadd d4, d31, d23, d1 -fbfa3a1f| fnmsub s27, s23, s26, s30 -bbb0691f| fnmsub d27, d5, d9, d12 -6a8b3f1e| fnmul s10, s27, s31 -1a8b751e| fnmul d26, d24, d21 -57d8e15e| frecpe d23, d2 -62dba14e| frecpe v2.4s, v27.4s -81fd325e| frecps s1, s12, s18 -31fe224e| frecps v17.4s, v17.4s, v2.4s -ecf9e15e| frecpx d12, d15 -c18b216e| frinta v1.4s, v30.4s -0240261e| frinta s2, s0 -8041661e| frinta d0, d12 -c89ba12e| frinti v8.2s, v30.2s -2ec2271e| frinti s14, s17 -5cc0671e| frinti d28, d2 -3898210e| frintm v24.2s, v1.2s -9843251e| frintm s24, s28 -5b40651e| frintm d27, d2 -2189614e| frintn v1.2d, v9.2d -7e42241e| frintn s30, s19 -5d40641e| frintn d29, d2 -85c3241e| frintp s5, s28 -46c2641e| frintp d6, d18 -c39b216e| frintx v3.4s, v30.4s -a243271e| frintx s2, s29 -1d41671e| frintx d29, d8 -5499e14e| frintz v20.2d, v10.2d -92c2251e| frintz s18, s20 -75c2651e| frintz d21, d19 -ddd9e17e| frsqrte d29, d14 -60fff85e| frsqrts d0, d27, d24 -dafffb4e| frsqrts v26.2d, v30.2d, v27.2d -1ff9a12e| fsqrt v31.2s, v8.2s -2dc3211e| fsqrt s13, s25 -72c0611e| fsqrt d18, d3 -7d3a3e1e| fsub s29, s19, s30 -3f38771e| fsub d31, d1, d23 -185e016e| mov v24.b[0], v16.b[11] -911d0d4e| mov v17.b[6], w12 -2877400c| ld1 {v8.4h}, [x25] -8ea8404c| ld1 {v14.4s, v15.4s}, [x4] -0f62404c| ld1 {v15.16b-v17.16b}, [x16] -0f27400c| ld1 {v15.4h-v18.4h}, [x24] -4c75df0c| ld1 {v12.4h}, [x10],#8 -2f7bd04c| ld1 {v15.4s}, [x25], x16 -eaaadf0c| ld1 {v10.2s, v11.2s}, [x23],#16 -eca7cc4c| ld1 {v12.8h, v13.8h}, [sp], x12 -cd60df4c| ld1 {v13.16b-v15.16b}, [x6],#48 -9163df0c| ld1 {v17.8b-v19.8b}, [x28],#24 -152ddf4c| ld1 {v21.2d-v24.2d}, [x8],#64 -0725c04c| ld1 {v7.8h-v10.8h}, [x8], x0 -7c04404d| ld1 {v28.b}[9], [x3] -6d49404d| ld1 {v13.h}[5], [x11] -9e81400d| ld1 {v30.s}[0], [x12] -d384404d| ld1 {v19.d}[1], [x6] -b20ddf4d| ld1 {v18.b}[11], [x13],#1 -f114cd4d| ld1 {v17.b}[13], [x7], x13 -bb92df4d| ld1 {v27.s}[3], [x21],#4 -a883d64d| ld1 {v8.s}[2], [x29], x22 -f584df4d| ld1 {v21.d}[1], [x7],#8 -0284c80d| ld1 {v2.d}[0], [x0], x8 -91c3400d| ld1r {v17.8b}, [x28] -71c9df0d| ld1r {v17.2s}, [x11],#4 -e7c4db0d| ld1r {v7.4h}, [x7], x27 -b787404c| ld2 {v23.8h, v24.8h}, [x29] -1280df0c| ld2 {v18.8b, v19.8b}, [x0],#16 -2f88c10c| ld2 {v15.2s, v16.2s}, [x1], x1 -a01e604d| ld2 {v0.b, v1.b}[15], [x21] -eb82604d| ld2 {v11.s, v12.s}[2], [x23] -f985600d| ld2 {v25.d, v26.d}[0], [x15] -e315ff0d| ld2 {v3.b, v4.b}[5], [x15],#2 -1c11f24d| ld2 {v28.b, v29.b}[12], [x8], x18 -f341ef4d| ld2 {v19.h, v20.h}[4], [x15], x15 -5a80ff4d| ld2 {v26.s, v27.s}[2], [x2],#8 -d781fd0d| ld2 {v23.s, v24.s}[0], [x14], x29 -c885ff0d| ld2 {v8.d, v9.d}[0], [x14],#16 -1286f34d| ld2 {v18.d, v19.d}[1], [x16], x19 -06c2600d| ld2r {v6.8b, v7.8b}, [x16] -95c7ff4d| ld2r {v21.8h, v22.8h}, [x28],#4 -d4c1e14d| ld2r {v20.16b, v21.16b}, [x14], x1 -eb4bdf4c| ld3 {v11.4s-v13.4s}, [sp],#48 -ce4fc24c| ld3 {v14.2d-v16.2d}, [x30], x2 -db23400d| ld3 {v27.b-v29.b}[0], [x30] -26b3400d| ld3 {v6.s-v8.s}[1], [x25] -37a4400d| ld3 {v23.d-v25.d}[0], [x1] -052edf4d| ld3 {v5.b-v7.b}[11], [x16],#3 -8c3ccd0d| ld3 {v12.b-v14.b}[7], [x4], x13 -74b0df4d| ld3 {v20.s-v22.s}[3], [x3],#12 -b7b1c84d| ld3 {v23.s-v25.s}[3], [x13], x8 -e6a5df4d| ld3 {v6.d-v8.d}[1], [x15],#24 -42a5c80d| ld3 {v2.d-v4.d}[0], [x10], x8 -9ceb400d| ld3r {v28.2s-v30.2s}, [x28] -6aeadf4d| ld3r {v10.4s-v12.4s}, [x19],#12 -65ebce4d| ld3r {v5.4s-v7.4s}, [x27], x14 -ea05400c| ld4 {v10.4h-v13.4h}, [x15] -1f03df0c| ld4 {v31.8b, v0.8b, v1.8b, v2.8b}, [x24],#32 -ae09c90c| ld4 {v14.2s-v17.2s}, [x13], x9 -fd3a604d| ld4 {v29.b, v30.b, v31.b, v0.b}[14], [x23] -d8a0604d| ld4 {v24.s-v27.s}[2], [x6] -62a4604d| ld4 {v2.d-v5.d}[1], [x3] -712fff0d| ld4 {v17.b-v20.b}[3], [x27],#4 -aa27f40d| ld4 {v10.b-v13.b}[1], [x29], x20 -be71ff4d| ld4 {v30.h, v31.h, v0.h, v1.h}[6], [x13],#8 -e360ee4d| ld4 {v3.h-v6.h}[4], [x7], x14 -c0a0ff0d| ld4 {v0.s-v3.s}[0], [x6],#16 -d3a3e00d| ld4 {v19.s-v22.s}[0], [x30], x0 -95a7ff0d| ld4 {v21.d-v24.d}[0], [x28],#32 -32a6e14d| ld4 {v18.d-v21.d}[1], [x17], x1 -56e0604d| ld4r {v22.16b-v25.16b}, [x2] -dce7ff0d| ld4r {v28.4h-v31.4h}, [x30],#8 -14e8ef0d| ld4r {v20.2s-v23.2s}, [x0], x15 -7776732c| ldnp s23, s29, [x19,#-104] -23dd746c| ldnp d3, d23, [x9,#-184] -383e48ac| ldnp q24, q15, [x17,#256] -0d10c12c| ldp s13, s4, [x0],#8 -fe3ae66c| ldp d30, d14, [x23],#-416 -f627f9ac| ldp q22, q9, [sp],#-224 -918cd82d| ldp s17, s3, [x4,#196]! -986be46d| ldp d24, d26, [x28,#-448]! -ebd8f8ad| ldp q11, q22, [x7,#-240]! -3c905c2d| ldp s28, s4, [x1,#228] -5887536d| ldp d24, d1, [x26,#312] -08957cad| ldp q8, q5, [x8,#-112] -c5e5543c| ldr b5, [x14],#-178 -4ff5417c| ldr h15, [x10],#31 -72e54bbc| ldr s18, [x11],#190 -16b55dfc| ldr d22, [x8],#-37 -9e24db3c| ldr q30, [x4],#-78 -d20c503c| ldr b18, [x6,#-256]! -1f1c4d7c| ldr h31, [x0,#209]! -2fbf4dbc| ldr s15, [x25,#219]! -a06c59fc| ldr d0, [x5,#-106]! -886ddd3c| ldr q8, [x12,#-42]! -58f64e3d| ldr b24, [x18,#957] -f5c3547d| ldr h21, [sp,#2656] -8e8a7bbd| ldr s14, [x20,#15240] -8e3c7afd| ldr d14, [x4,#29816] -f2aeff3d| ldr q18, [x23,#65200] -92831b1c| ldr s18, .+0x37070 -3e01b55c| ldr d30, .+0xfffffffffff6a024 -fdee3b9c| ldr q29, .+0x77ddc -1d78793c| ldr b29, [x0,x25,lsl #0] -b8f15d3c| ldur b24, [x13,#-33] -95635c7c| ldur h21, [x28,#-58] -27d046bc| ldur s7, [x1,#109] -21624efc| ldur d1, [x17,#230] -6dd2d83c| ldur q13, [x19,#-115] -dc09be6f| mla v28.4s, v14.4s, v30.s[3] -eb97af4e| mla v11.4s, v31.4s, v15.4s -0495722e| mls v4.4h, v8.4h, v18.4h -21070a5e| mov h1, v25.h[2] -92471b6e| mov v18.b[13], v28.b[8] -7a1e134e| mov v26.b[9], w19 -761fa30e| orr v22.8b, v27.8b, v3.8b -f23d070e| umov w18, v15.b[3] -a5e6064f| movi v5.16b, #0xd5 -63c5064f| movi v3.4s, #0xcb, msl #8 -bca7014f| movi v28.8h, #0x3d, lsl #8 -95e4040f| movi v21.8b, #0x84 -fce4072f| movi d28, #0xffffff0000ffffff -24e6036f| movi v4.2d, #0xffffff000000ff -429d6a4e| mul v2.8h, v10.8h, v10.8h -e558202e| mvn v5.8b, v7.8b -fe65012f| mvni v30.2s, #0x2f, lsl #24 -2b16046f| bic v11.4s, #0x91 -7756016f| bic v23.4s, #0x33, lsl #16 -e159202e| mvn v1.8b, v15.8b -da1cf14e| orn v26.16b, v6.16b, v17.16b -ca04014f| movi v10.4s, #0x26 -14a6020f| movi v20.4h, #0x50, lsl #8 -2f1fbf0e| orr v15.8b, v25.8b, v31.8b -74e2f20e| pmull v20.1q, v19.1d, v18.1d -2740262e| raddhn v7.8b, v1.8h, v6.8h -17412e6e| raddhn2 v23.16b, v8.8h, v14.8h -da59602e| rbit v26.8b, v14.8b -230a604e| rev64 v3.8h, v17.8h -178d210f| rshrn v23.2s, v8.2d, #31 -6b8d2c4f| rshrn2 v11.4s, v11.2d, #20 -b57c2a0e| saba v21.8b, v5.8b, v10.8b -71533d0e| sabal v17.8h, v27.8b, v29.8b -1c50774e| sabal2 v28.4s, v0.8h, v23.8h -1974be4e| sabd v25.4s, v0.4s, v30.4s -6b71ad0e| sabdl v11.2d, v11.2s, v13.2s -5270324e| sabdl2 v18.8h, v2.16b, v18.16b -366b200e| sadalp v22.4h, v25.8b -1802680e| saddl v24.4s, v16.4h, v8.4h -022b604e| saddlp v2.4s, v24.8h -413ab04e| saddlv d1, v18.4s -4013750e| saddw v0.4s, v26.4s, v21.4h -4412744e| saddw2 v4.4s, v18.4s, v20.8h -2ee6255f| scvtf s14, s17, #27 -dce75f4f| scvtf v28.2d, v30.2d, #33 -5bdb615e| scvtf d27, d26 -3ad9210e| scvtf v26.2s, v9.2s -1ceb421e| scvtf d28, w24, #6 -9dde029e| scvtf s29, x20, #9 -57d1429e| scvtf d23, x10, #12 -d600221e| scvtf s22, w6 -c503621e| scvtf d5, w30 -3303229e| scvtf s19, x25 -0003629e| scvtf d0, x24 -6f01075e| sha1c q15, s11, v7.4s -9308285e| sha1h s19, s4 -b420105e| sha1m q20, s5, v16.4s -f4131f5e| sha1p q20, s31, v31.4s -dc311f5e| sha1su0 v28.4s, v14.4s, v31.4s -bb1a285e| sha1su1 v27.4s, v21.4s -2753075e| sha256h2 q7, q25, v7.4s -3141065e| sha256h q17, q9, v6.4s -172b285e| sha256su0 v23.4s, v24.4s -bb621b5e| sha256su1 v27.4s, v21.4s, v27.4s -7005644e| shadd v16.8h, v11.8h, v4.8h -2d870e0f| shrn v13.8b, v25.8h, #2 -ac86024f| movi v12.8h, #0x55 -1c26a50e| shsub v28.2s, v16.2s, v5.2s -db576b6f| sli v27.2d, v30.2d, #43 -c3652c4e| smax v3.16b, v14.16b, v12.16b -b5a7ab0e| smaxp v21.2s, v29.2s, v11.2s -f1aeb34e| sminp v17.4s, v23.4s, v19.4s -87a8b14e| sminv s7, v4.4s -1e21bc4f| smlal2 v30.2d, v8.4s, v28.s[1] -50a33a0e| smlsl v16.8h, v26.8b, v26.8b -4e2d1a0e| smov w14, v10.h[6] -9ba9b30f| smull v27.2d, v12.2s, v19.s[3] -417a205e| sqabs b1, b18 -9f78a04e| sqabs v31.4s, v4.4s -580d2e5e| sqadd b24, b10, b14 -3d30764f| sqdmlal2 v29.4s, v1.8h, v6.h[3] -9591b25e| sqdmlal d21, s12, s18 -0d92670e| sqdmlal v13.4s, v16.4h, v7.4h -90b1765e| sqdmlsl s16, h12, h22 -83c2ad5f| sqdmulh s3, s20, v13.s[1] -bbb7aa5e| sqdmulh s27, s29, s10 -c8b99a5f| sqdmull d8, s14, v26.s[2] -75b3920f| sqdmull v21.2d, v27.2s, v18.s[0] -86d1b75e| sqdmull d6, s12, s23 -edd06f4e| sqdmull2 v13.4s, v7.8h, v15.8h -0f7ae07e| sqneg d15, d16 -e87b602e| sqneg v8.4h, v31.4h -ecb5a92e| sqrdmulh v12.2s, v15.2s, v9.2s -d75fba5e| sqrshl s23, s30, s26 -f75f324e| sqrshl v23.16b, v31.16b, v18.16b -af9c114f| sqrshrn2 v15.8h, v5.4s, #15 -318d2f6f| sqrshrun2 v17.4s, v9.2d, #17 -b3757c5f| sqshl d19, d13, #60 -0c776f4f| sqshl v12.2d, v24.2d, #47 -d84c2a5e| sqshl b24, b6, b10 -ae4e704e| sqshl v14.8h, v21.8h, v16.8h -b566727f| sqshlu d21, d21, #50 -4566596f| sqshlu v5.2d, v18.2d, #25 -d595140f| sqshrn v21.4h, v14.4s, #12 -00940b4f| sqshrn2 v0.16b, v0.8h, #5 -5384352f| sqshrun v19.2s, v2.2d, #11 -1a2e3d5e| sqsub b26, b16, b29 -b02e6b4e| sqsub v16.8h, v21.8h, v11.8h -1249a15e| sqxtn s18, d8 -eb49610e| sqxtn v11.4h, v15.4s -cb4a614e| sqxtn2 v11.8h, v22.4s -102b217e| sqxtun b16, h24 -492a212e| sqxtun v9.8b, v18.8h -112a616e| sqxtun2 v17.8h, v16.4s -6c16ae4e| srhadd v12.4s, v19.4s, v14.4s -5946467f| sri d25, d18, #58 -21460a2f| sri v1.8b, v17.8b, #6 -9f56b10e| srshl v31.2s, v20.2s, v17.2s -e724635f| srshr d7, d7, #29 -e8266b4f| srshr v8.2d, v23.2d, #21 -2b37180f| srsra v11.4h, v25.4h, #8 -1644f95e| sshl d22, d0, d25 -3644fc4e| sshl v22.2d, v1.2d, v28.2d -d9a61f4f| sshll2 v25.4s, v22.8h, #15 -9b075e5f| sshr d27, d28, #34 -2c044c4f| sshr v12.2d, v1.2d, #52 -d915324f| ssra v25.4s, v14.4s, #14 -de21260e| ssubl v30.8h, v14.8b, v6.8b -c720254e| ssubl2 v7.8h, v6.16b, v5.16b -9d33b90e| ssubw v29.2d, v28.2d, v25.2s -7e71000c| st1 {v30.8b}, [x11] -cca6000c| st1 {v12.4h, v13.4h}, [x22] -5467000c| st1 {v20.4h-v22.4h}, [x26] -cc28004c| st1 {v12.4s-v15.4s}, [x6] -9e7e9f4c| st1 {v30.2d}, [x20],#16 -4b769d0c| st1 {v11.4h}, [x18], x29 -adaa9f0c| st1 {v13.2s, v14.2s}, [x21],#16 -bca7844c| st1 {v28.8h, v29.8h}, [x29], x4 -b5659f0c| st1 {v21.4h-v23.4h}, [x13],#24 -e669874c| st1 {v6.4s-v8.4s}, [x15], x7 -9b2a9f0c| st1 {v27.2s-v30.2s}, [x20],#32 -14278b0c| st1 {v20.4h-v23.4h}, [x24], x11 -d002004d| st1 {v16.b}[8], [x22] -9780004d| st1 {v23.s}[2], [x4] -7787004d| st1 {v23.d}[1], [x27] -850d9f0d| st1 {v5.b}[3], [x12],#1 -7b1f8f0d| st1 {v27.b}[7], [x27], x15 -7a5a9f4d| st1 {v26.h}[7], [x19],#2 -e14b9e4d| st1 {v1.h}[5], [sp], x30 -dd819f4d| st1 {v29.s}[2], [x14],#4 -a281910d| st1 {v2.s}[0], [x13], x17 -b2849f0d| st1 {v18.d}[0], [x5],#8 -c484964d| st1 {v4.d}[1], [x6], x22 -f686004c| st2 {v22.8h, v23.8h}, [x23] -2e869f0c| st2 {v14.4h, v15.4h}, [x17],#16 -d200200d| st2 {v18.b, v19.b}[0], [x6] -ab58200d| st2 {v11.h, v12.h}[3], [x5] -c491204d| st2 {v4.s, v5.s}[3], [x14] -5a85204d| st2 {v26.d, v27.d}[1], [x10] -f217bf0d| st2 {v18.b, v19.b}[5], [sp],#2 -2b0ea04d| st2 {v11.b, v12.b}[11], [x17], x0 -4042bf0d| st2 {v0.h, v1.h}[0], [x18],#4 -9342af4d| st2 {v19.h, v20.h}[4], [x20], x15 -9b91bf4d| st2 {v27.s, v28.s}[3], [x12],#8 -7480a10d| st2 {v20.s, v21.s}[0], [x3], x1 -c884bf0d| st2 {v8.d, v9.d}[0], [x6],#16 -ae86ac4d| st2 {v14.d, v15.d}[1], [x21], x12 -614d004c| st3 {v1.2d-v3.2d}, [x11] -324b9f4c| st3 {v18.4s-v20.4s}, [x25],#48 -7340870c| st3 {v19.8b-v21.8b}, [x3], x7 -ac24004d| st3 {v12.b-v14.b}[9], [x5] -a161004d| st3 {v1.h-v3.h}[4], [x13] -09b1004d| st3 {v9.s-v11.s}[3], [x8] -78a7004d| st3 {v24.d-v26.d}[1], [x27] -4f349f0d| st3 {v15.b-v17.b}[5], [x2],#3 -643d840d| st3 {v4.b-v6.b}[7], [x11], x4 -48699f0d| st3 {v8.h-v10.h}[1], [x10],#6 -85b19f4d| st3 {v5.s-v7.s}[3], [x12],#12 -60a18a0d| st3 {v0.s-v2.s}[0], [x11], x10 -69a49f0d| st3 {v9.d-v11.d}[0], [x3],#24 -ada7814d| st3 {v13.d-v15.d}[1], [x29], x1 -760c004c| st4 {v22.2d-v25.2d}, [x3] -ee0d9f4c| st4 {v14.2d-v17.2d}, [x15],#64 -7800970c| st4 {v24.8b-v27.8b}, [x3], x23 -a221200d| st4 {v2.b-v5.b}[0], [x13] -9a69204d| st4 {v26.h-v29.h}[5], [x12] -02a1204d| st4 {v2.s-v5.s}[2], [x8] -3fa6200d| st4 {v31.d, v0.d, v1.d, v2.d}[0], [x17] -943abf0d| st4 {v20.b-v23.b}[6], [x20],#4 -bf26a60d| st4 {v31.b, v0.b, v1.b, v2.b}[1], [x21], x6 -55b3bf4d| st4 {v21.s-v24.s}[3], [x26],#16 -dda1b04d| st4 {v29.s, v30.s, v31.s, v0.s}[2], [x14], x16 -6aa5bf0d| st4 {v10.d-v13.d}[0], [x11],#32 -e7a7ac0d| st4 {v7.d-v10.d}[0], [sp], x12 -f9c9202c| stnp s25, s18, [x15,#-252] -18b8316c| stnp d24, d14, [x0,#-232] -409c1cac| stnp q0, q7, [x2,#912] -73f0812c| stp s19, s28, [x3],#12 -28d0826c| stp d8, d20, [x1],#40 -9bf5bfac| stp q27, q29, [x12],#-16 -885ead2d| stp s8, s23, [x20,#-152]! -b0de926d| stp d16, d23, [x21,#296]! -713387ad| stp q17, q12, [x27,#224]! -52130a2d| stp s18, s4, [x26,#80] -b63a236d| stp d22, d14, [x21,#-464] -6d5424ad| stp q13, q21, [x3,#-896] -afb60f3c| str b15, [x21],#251 -81e7077c| str h1, [x28],#126 -203713bc| str s0, [x25],#-205 -60c61ffc| str d0, [x19],#-4 -d256813c| str q18, [x22],#21 -ffce083c| str b31, [x23,#140]! -6d3d017c| str h13, [x11,#19]! -52ed01bc| str s18, [x10,#30]! -fafd11fc| str d26, [x15,#-225]! -663e9b3c| str q6, [x19,#-77]! -7d0c393d| str b29, [x3,#3651] -8f50067d| str h15, [x4,#808] -94680dbd| str s20, [x4,#3432] -b7673bfd| str d23, [x29,#30408] -fed3a63d| str q30, [sp,#39744] -8a6a243c| str b10, [x20,x4] -29493fbc| str s9, [x9,wzr,uxtw] -8bd93bfc| str d11, [x12,w27,sxtw #3] -c768a93c| str q7, [x6,x9] -a7b00a3c| stur b7, [x5,#171] -40e3107c| stur h0, [x26,#-242] -18911fbc| stur s24, [x8,#-7] -fcc007fc| stur d28, [x7,#124] -db12893c| stur q27, [x22,#145] -1686716e| sub v22.8h, v16.8h, v17.8h -5362320e| subhn v19.8b, v18.8h, v18.8h -6163bf4e| subhn2 v1.4s, v27.2d, v31.2d -a73be05e| suqadd d7, d29 -21a4100f| sxtl v1.4s, v1.4h -8b23164e| tbl v11.16b, {v28.16b, v29.16b}, v22.16b -3642120e| tbl v22.8b, {v17.16b-v19.16b}, v18.8b -cf611f0e| tbl v15.8b, {v14.16b-v17.16b}, v31.8b -0b020e4e| tbl v11.16b, {v16.16b}, v14.16b -9830014e| tbx v24.16b, {v4.16b, v5.16b}, v1.16b -1452044e| tbx v20.16b, {v16.16b-v18.16b}, v4.16b -b4711a0e| tbx v20.8b, {v13.16b-v16.16b}, v26.8b -f911140e| tbx v25.8b, {v15.16b}, v20.8b -9f28500e| trn1 v31.4h, v4.4h, v16.4h -2e69c64e| trn2 v14.2d, v9.2d, v6.2d -c752756e| uabal2 v7.4s, v22.8h, v21.8h -8675696e| uabd v6.8h, v12.8h, v9.8h -a973ab6e| uabdl2 v9.2d, v29.4s, v11.4s -fa006c2e| uaddl v26.4s, v7.4h, v12.4h -da00236e| uaddl2 v26.8h, v6.16b, v3.16b -ab3a306e| uaddlv h11, v21.16b -a312746e| uaddw2 v3.4s, v21.4s, v20.8h -cee55e7f| ucvtf d14, d14, #34 -8edb617e| ucvtf d14, d28 -ab8f431e| ucvtf d11, w29, #29 -68b3039e| ucvtf s8, x27, #20 -7686439e| ucvtf d22, x19, #31 -2a03231e| ucvtf s10, w25 -9f01631e| ucvtf d31, w12 -a800239e| ucvtf s8, x5 -0302639e| ucvtf d3, x16 -df65a42e| umax v31.2s, v14.2s, v4.2s -29ab702e| umaxv h9, v25.4h -6f6e2e6e| umin v15.16b, v19.16b, v14.16b -fdada32e| uminp v29.2s, v15.2s, v3.2s -07289a6f| umlal2 v7.2d, v0.4s, v26.s[2] -aa80ad2e| umlal v10.2d, v5.2s, v13.2s -d66b462f| umlsl v22.4s, v30.4h, v6.h[4] -12a3b62e| umlsl v18.2d, v24.2s, v22.2s -583e0d0e| umov w24, v18.b[6] -20c3b52e| umull v0.2d, v25.2s, v21.2s -20c2616e| umull2 v0.4s, v17.8h, v1.8h -2f0f6d7e| uqadd h15, h25, h13 -a60c272e| uqadd v6.8b, v5.8b, v7.8b -5b5da27e| uqrshl s27, s10, s2 -195c786e| uqrshl v25.8h, v0.8h, v24.8h -209e282f| uqrshrn v0.2s, v17.2d, #24 -e89e3b6f| uqrshrn2 v8.4s, v23.2d, #5 -4f75147f| uqshl h15, h10, #4 -d2767d6f| uqshl v18.2d, v22.2d, #61 -bb4cfe7e| uqshl d27, d5, d30 -794ea42e| uqshl v25.2s, v19.2s, v4.2s -51960b7f| uqshrn b17, h18, #5 -642ce77e| uqsub d4, d3, d7 -6149617e| uqxtn h1, s11 -4e48a12e| uqxtn v14.2s, v2.2d -9cc8a14e| urecpe v28.4s, v4.4s -2f15a52e| urhadd v15.2s, v9.2s, v5.2s -5757fb7e| urshl d23, d26, d27 -2756706e| urshl v7.8h, v17.8h, v16.8h -a424487f| urshr d4, d5, #56 -b926796f| urshr v25.2d, v21.2d, #7 -1336076f| bic v19.4s, #0xf0, lsl #8 -e347e06e| ushl v3.2d, v31.2d, v0.2d -f7a5272f| ushll v23.2d, v15.2s, #7 -9ba63d6f| ushll2 v27.2d, v20.4s, #29 -d405737f| ushr d20, d14, #13 -3a05116f| ushr v26.8h, v9.8h, #15 -1d39607e| usqadd h29, h8 -0e39e06e| usqadd v14.2d, v8.2d -8022b02e| usubl v0.2d, v20.2s, v16.2s -9a20786e| usubl2 v26.4s, v4.8h, v24.8h -df33692e| usubw v31.4s, v30.4s, v9.4h -92a5102f| uxtl v18.4s, v12.4h -0e19464e| uzp1 v14.8h, v8.8h, v6.8h -7629610e| xtn v22.4h, v11.4s -7338504e| zip1 v19.8h, v3.8h, v16.8h -357bd64e| zip2 v21.2d, v25.2d, v22.2d -63020f1a| adc w3, w19, w15 -1f03159a| adc xzr, x24, x21 -d300103a| adcs w19, w6, w16 -1b0010ba| adcs x27, x0, x16 -dd133f0b| add w29, w30, wzr, uxtb #4 -89c42f8b| add x9, x4, w15, sxtw #1 -4e242a11| add w14, w2, #0xa89 -e1c12f2b| adds w1, w15, w15, sxtw -733421ab| adds x19, x3, w1, uxth #5 -0ccc5aab| adds x12, x0, x26, lsr #51 -51354470| adr x17, .+0x886ab -ef6796d0| adrp x15, .+0xffffffff2ccfe000 -2e122612| and w14, w17, #0x7c000000 -5e4c2992| and x30, x2, #0xff8007ffff8007ff -2805410a| and w8, w9, w1, lsr #1 -ede1938a| and x13, x15, x19, asr #56 -e7c10f72| ands w7, w15, #0x2020202 -23ed55f2| ands x3, x9, #0xfffff87fffffffff -e6935bea| ands x6, xzr, x27, lsr #36 -0e2ac61a| asr w14, w16, w6 -802ad59a| asr x0, x20, x21 -7cfd7793| asr x28, x11, #55 -f028cd1a| asr w16, w7, w13 -132bd29a| asr x19, x24, x18 -c2560e54| b.cs .+0x1cad8 -83516b17| b .+0xfffffffffdad460c -7a571233| bfxil w26, w27, #18, #4 -71b858b3| bfxil x17, x3, #24, #23 -c3964bb3| bfxil x3, x22, #11, #27 -eb561233| bfxil w11, w23, #18, #4 -063f5db3| bfi x6, x24, #35, #16 -0a337a0a| bic w10, w24, w26, lsr #12 -2a71e28a| bic x10, x9, x2, ror #28 -c168bf6a| bics w1, w6, wzr, asr #26 -d8bb3cea| bics x24, x30, x28, lsl #46 -82e81795| bl .+0x45fa208 -40033fd6| blr x26 -c0011fd6| br x14 -00dd31d4| brk #0x8ee8 -7267db35| cbnz w18, .+0xfffffffffffb6cec -e44c7fb5| cbnz x4, .+0xfe99c -9dc4c334| cbz w29, .+0xfffffffffff87890 -376eceb4| cbz x23, .+0xfffffffffff9cdc4 -a6cb563a| ccmn w29, #0x16, #0x6, gt -87db55ba| ccmn x28, #0x15, #0x7, le -a042493a| ccmn w21, w9, #0x0, mi -6a0040ba| ccmn x3, x0, #0xa, eq -46bb5c7a| ccmp w26, #0x1c, #0x6, lt -c72942fa| ccmp x14, #0x2, #0x7, cs -cda1427a| ccmp w14, w2, #0xd, ge -a1314dfa| ccmp x13, x13, #0x1, cc -8706931a| csinc w7, w20, w19, eq -3ae69a9a| csinc x26, x17, x26, al -9e51945a| csinv w30, w12, w20, pl -d5e386da| csinv x21, x30, x6, al -5f3503d5| clrex #0x5 -e515c05a| cls w5, w15 -a815c0da| cls x8, x13 -4a12c05a| clz w10, w18 -3c10c0da| clz x28, x1 -ff70252b| cmn w7, w5, uxtx #4 -9fa133ab| cmn x12, w19, sxth -3f3a822b| cmn w17, w2, asr #14 -df1d44ab| cmn x14, x4, lsr #7 -3f95386b| cmp w9, w24, sxtb #5 -9f653feb| cmp x12, xzr, uxtx #1 -1626915a| csneg w22, w16, w17, cs -b4d587da| csneg x20, x13, x7, le -9841d41a| crc32b w24, w12, w20 -ec45d01a| crc32h w12, w15, w16 -8048ca1a| crc32w w0, w4, w10 -d44ec19a| crc32x w20, w22, x1 -1552d31a| crc32cb w21, w16, w19 -4b54c71a| crc32ch w11, w2, w7 -245ad41a| crc32cw w4, w17, w20 -c35cc89a| crc32cx w3, w6, x8 -14219f1a| csel w20, w8, wzr, cs -9c73979a| csel x28, x28, x23, vc -e7279f1a| cset w7, cc -ec579f9a| cset x12, mi -e5f39f5a| csinv w5, wzr, wzr, al -e8639fda| csetm x8, vc -ea76971a| cinc w10, w23, vs -78a7859a| csinc x24, x27, x5, ge -b590845a| csinv w21, w5, w4, ls -b4029eda| csinv x20, x21, x30, eq -b3969b5a| csneg w19, w21, w27, ls -938591da| csneg x19, x12, x17, hi -016ea8d4| dcps1 #0x4370 -0275a4d4| dcps2 #0x23a8 -a3e9a6d4| dcps3 #0x374d -bf3903d5| dmb ishld -e003bfd6| drps -9f3e03d5| dsb st -50b1a0ca| eon x16, x10, x0, asr #44 -c0b02f52| eor w0, w6, #0x3ffe3ffe -4b0c1ed2| eor x11, x2, #0x3c0000003c -693c074a| eor w9, w3, w7, lsl #15 -113e1aca| eor x17, x16, x26, lsl #15 -e0039fd6| eret -fef8c693| extr x30, x7, x6, #62 -3f2003d5| yield -3f2403d5| hint #0x21 -c0425ad4| hlt #0xd216 -df3003d5| isb #0x0 -f7fddf88| ldar w23, [x15] -96fedfc8| ldar x22, [x20] -11fedf08| ldarb w17, [x16] -c2fedf48| ldarh w2, [x22] -2d927f88| ldaxp w13, w4, [x17] -198f7fc8| ldaxp x25, x3, [x24] -46ff5f88| ldaxr w6, [x26] -81fe5fc8| ldaxr x1, [x20] -86fe5f08| ldaxrb w6, [x20] -78ff5f48| ldaxrh w24, [x27] -35864a28| ldnp w21, w1, [x17,#84] -6da05fa8| ldnp x13, x8, [x3,#504] -a8f9f428| ldp w8, w30, [x13],#-92 -b749e3a8| ldp x23, x18, [x13],#-464 -bdedd929| ldp w29, w27, [x13,#204]! -c8e5c6a9| ldp x8, x25, [x14,#104]! -c0857f29| ldp w0, w1, [x14,#-4] -388a6ca9| ldp x24, x2, [x17,#-312] -086be468| ldpsw x8, x26, [x24],#-224 -d107d269| ldpsw x17, x1, [x30,#144]! -738e4e69| ldpsw x19, x3, [x19,#116] -6ee55fb8| ldr w14, [x11],#-2 -233459f8| ldr x3, [x1],#-109 -919f44b8| ldr w17, [x28,#73]! -acdd45f8| ldr x12, [x13,#93]! -e1cd51b9| ldr w1, [x15,#4556] -95e27bf9| ldr x21, [x20,#30656] -09c4fa18| ldr w9, .+0xffffffffffff5880 -f528ad58| ldr x21, .+0xfffffffffff5a51c -0c554b38| ldrb w12, [x8],#181 -054f5938| ldrb w5, [x24,#-108]! -1f206539| ldrb wzr, [x0,#2376] -73796a38| ldrb w19, [x11,x10,lsl #0] -a8b74f78| ldrh w8, [x29],#251 -021e5e78| ldrh w2, [x16,#-31]! -ec126b79| ldrh w12, [x23,#5512] -fc5a6178| ldrh w28, [x23,w1,uxtw #1] -eaf6c238| ldrsb w10, [x23],#47 -87679838| ldrsb x7, [x28],#-122 -567fdb38| ldrsb w22, [x26,#-73]! -3b2e8138| ldrsb x27, [x17,#18]! -7d74c039| ldrsb w29, [x3,#29] -7d1f8539| ldrsb x29, [x27,#327] -225bff38| ldrsb w2, [x25,wzr,uxtw #0] -6a7bed38| ldrsb w10, [x27,x13,lsl #0] -0f69b538| ldrsb x15, [x8,x21] -c796cc78| ldrsh w7, [x22],#201 -50268e78| ldrsh x16, [x18],#226 -229ddb78| ldrsh w2, [x9,#-71]! -0f4f9178| ldrsh x15, [x24,#-236]! -59ecc379| ldrsh w25, [x2,#502] -83d49679| ldrsh x3, [x4,#2922] -986be878| ldrsh w24, [x28,x8] -cad8bf78| ldrsh x10, [x6,wzr,sxtw #1] -6b4693b8| ldrsw x11, [x19],#-204 -cb9e81b8| ldrsw x11, [x22,#25]! -280d9eb9| ldrsw x8, [x9,#7692] -93dec198| ldrsw x19, .+0xfffffffffff83bd0 -1a68b8b8| ldrsw x26, [x0,x24] -35b955b8| ldtr w21, [x9,#-165] -658b57f8| ldtr x5, [x27,#-136] -b3594038| ldtrb w19, [x13,#5] -5ac95d78| ldtrh w26, [x10,#-36] -2c3ade38| ldtrsb w12, [x17,#-29] -4de99038| ldtrsb x13, [x10,#-242] -e178c378| ldtrsh w1, [x7,#55] -a77a8778| ldtrsh x7, [x21,#119] -cde982b8| ldtrsw x13, [x14,#46] -04d15bb8| ldur w4, [x8,#-67] -02a256f8| ldur x2, [x16,#-150] -97405438| ldurb w23, [x4,#-188] -99b14b78| ldurh w25, [x12,#187] -f9a1cf38| ldursb w25, [x15,#250] -c0218c38| ldursb x0, [x14,#194] -5790d278| ldursh w23, [x2,#-215] -a3808278| ldursh x3, [x5,#40] -a9b08fb8| ldursw x9, [x5,#251] -98217f88| ldxp w24, w8, [x12] -4d6a7fc8| ldxp x13, x26, [x18] -9c7e5f88| ldxr w28, [x20] -0e7c5fc8| ldxr x14, [x0] -507c5f08| ldxrb w16, [x2] -ea7f5f48| ldxrh w10, [sp] -5523dd1a| lsl w21, w26, w29 -9721ca9a| lsl x23, x12, x10 -75665bd3| ubfiz x21, x19, #37, #26 -0a20df1a| lsl w10, w0, wzr -5222c99a| lsl x18, x18, x9 -5124df1a| lsr w17, w2, wzr -6b26d69a| lsr x11, x19, x22 -9a7c0753| lsr w26, w4, #7 -7bfd53d3| lsr x27, x11, #19 -5f26d91a| lsr wzr, w18, w25 -3625d89a| lsr x22, x9, x24 -9d76001b| madd w29, w20, w0, w29 -822f0e9b| madd x2, x28, x14, x11 -e8fe101b| mneg w8, w23, w16 -88fc099b| mneg x8, x4, x9 -dd030011| add w29, w30, #0x0 -db010091| add x27, x14, #0x0 -0c6db012| mov w12, #0x7c97ffff -3ff5aa92| mov xzr, #0xffffffffa856ffff -87f0f6d2| mov x7, #0xb784000000000000 -f3571132| orr w19, wzr, #0xffff801f -f3bb0bb2| mov x19, #0xffefffefffefffef -f103082a| mov w17, w8 -ef031faa| mov x15, xzr -4a6bf5f2| movk x10, #0xab5a, lsl #48 -383b9312| mov w24, #0xffff6626 -f5fb9092| mov x21, #0xffffffffffff7820 -d5b4b052| mov w21, #0x85a60000 -fdc5eed2| mov x29, #0x762f000000000000 -c58435d5| mrs x5, s2_5_c8_c4_6 -1a0f13d5| msr s2_3_c0_c15_0, x26 -52d5181b| msub w18, w10, w24, w21 -c4f81d9b| msub x4, x6, x29, x30 -a57c1b1b| mul w5, w5, w27 -8f7f0a9b| mul x15, x28, x10 -e75361aa| mvn x7, x1, lsr #20 -e0cb15cb| neg x0, x21, lsl #50 -ffdb49eb| cmp xzr, x9, lsr #54 -f5031c5a| ngc w21, w28 -e6031eda| ngc x6, x30 -e103077a| ngcs w1, w7 -f20301fa| ngcs x18, x1 -1f2003d5| nop -9347722a| orn w19, w28, w18, lsr #17 -0591e1aa| orn x5, x8, x1, ror #36 -7ba82a32| orr w27, w3, #0xffc1ffc1 -ae087db2| orr x14, x5, #0x38 -9608472a| orr w22, w4, w7, lsr #2 -c40dc5aa| orr x4, x14, x5, ror #3 -9d83bcf9| prfm #0x1d, [x28,#30976] -78ab03d8| prfm #0x18, .+0x756c -6e9186f8| prfum #0x0e, [x11,#105] -c001c05a| rbit w0, w14 -4203c0da| rbit x2, x26 -c0035fd6| ret -9b08c05a| rev w27, w4 -740cc0da| rev x20, x3 -0205c05a| rev16 w2, w8 -dd07c0da| rev16 x29, x30 -020bc0da| rev32 x2, x24 -780cc0da| rev x24, x3 -9b7f9513| extr w27, w28, w21, #31 -5243dd93| extr x18, x26, x29, #16 -822eca1a| ror w2, w20, w10 -f02ddb9a| ror x16, x15, x27 -082ed81a| ror w8, w16, w24 -7b2cc39a| ror x27, x3, x3 -3b030b5a| sbc w27, w25, w11 -f2021dda| sbc x18, x23, x29 -e600127a| sbcs w6, w7, w18 -cf030ffa| sbcs x15, x30, x15 -3a797793| sbfiz x26, x9, #9, #31 -4a305193| sbfiz x10, x2, #47, #13 -a1c74493| sbfx x1, x29, #4, #46 -a00fc01a| sdiv w0, w29, w0 -f10edd9a| sdiv x17, x23, x29 -9f2003d5| sev -bf2003d5| sevl -a52d319b| smaddl x5, w13, w17, x11 -b4fc399b| smnegl x20, w5, w25 -579e369b| smsubl x23, w18, w22, x7 -ea7e429b| smulh x10, x23, x2 -eb7f219b| smull x11, wzr, w1 -f1fe9f88| stlr w17, [x23] -edff9fc8| stlr x13, [sp] -bffe9f08| stlrb wzr, [x21] -9cfd9f48| stlrh w28, [x12] -41bf2688| stlxp w6, w1, w15, [x26] -01e93cc8| stlxp w28, x1, x26, [x8] -e0fd1f88| stlxr wzr, w0, [x15] -12fe17c8| stlxr w23, x18, [x16] -d4fc1008| stlxrb w16, w20, [x6] -befc0048| stlxrh w0, w30, [x5] -76613728| stnp w22, w24, [x11,#-72] -c7523ba8| stnp x7, x20, [x22,#-80] -8e3a9f28| stp w14, w14, [x20],#248 -aa1fa6a8| stp x10, x7, [x29],#-416 -fbae8d29| stp w27, w11, [x23,#108]! -f63c80a9| stp x22, x15, [x7,#0]! -43d73629| stp w3, w21, [x26,#-76] -1ae01ba9| stp x26, x24, [x0,#440] -8f650cb8| str w15, [x12],#198 -aad503f8| str x10, [x13],#61 -ec4d00b8| str w12, [x15,#4]! -7dbc1df8| str x29, [x3,#-37]! -9b0226b9| str w27, [x20,#9728] -91691af9| str x17, [x12,#13520] -20840838| strb w0, [x1],#136 -060c1f38| strb w6, [x0,#-16]! -2b213a39| strb w11, [x9,#3720] -ab6b3438| strb w11, [x29,x20] -50e51e78| strh w16, [x10],#-18 -5d5d1878| strh w29, [x10,#-123]! -ea862379| strh w10, [x23,#4546] -d65a2778| strh w22, [x22,w7,uxtw #1] -d5ca12b8| sttr w21, [x22,#-212] -001b18f8| sttr x0, [x24,#-127] -290a1e38| sttrb w9, [x17,#-32] -0b381078| sttrh w11, [x0,#-253] -c78101b8| stur w7, [x14,#24] -c0b217f8| stur x0, [x22,#-133] -f8401e38| sturb w24, [x7,#-28] -5e911a78| sturh w30, [x10,#-87] -b7622d88| stxp w13, w23, w24, [x21] -233d37c8| stxp w23, x3, x15, [x9] -847d0088| stxr w0, w4, [x12] -a27d0bc8| stxr w11, x2, [x13] -f27f1e08| stxrb w30, w18, [sp] -3a7d1848| stxrh w24, w26, [x9] -d4dc204b| sub w20, w6, w0, sxtw #7 -874023cb| sub x7, x4, w3, uxtw -44eb4f51| sub w4, w26, #0x3fa, lsl #12 -17b012cb| sub x23, x0, x18, lsl #44 -ac1e376b| subs w12, w21, w23, uxtb #7 -b0483beb| subs x16, x5, w27, uxtw #2 -d1f994eb| subs x17, x14, x20, asr #62 -61d513d4| svc #0x9eab -591d0013| sxtb w25, w10 -9f1f4093| sxtb xzr, w28 -773f0013| sxth w23, w27 -453c4093| sxth x5, w2 -b77c4093| sxtw x23, w5 -743628d5| sysl x20, #0, C3, C6, #3 -6fd248b7| tbnz x15, #41, .+0x1a4c -5afe3036| tbz w26, #6, .+0x1fc8 -9f613672| tst w12, #0xfffffc07 -1f8d22f2| tst x8, #0xc003c003c003c003 -ff6e93ea| tst x23, x19, asr #27 -06997ed3| ubfiz x6, x8, #2, #39 -5dd054d3| ubfx x29, x2, #20, #33 -a54273d3| ubfiz x5, x21, #13, #17 -7d08d11a| udiv w29, w3, w17 -120acf9a| udiv x18, x16, x15 -1401a89b| umaddl x20, w8, w8, x0 -08feb29b| umnegl x8, w16, w18 -eeb0b99b| umsubl x14, w7, w25, x12 -967fdd9b| umulh x22, x28, x29 -947eb59b| umull x20, w20, w21 -7e1f0053| uxtb w30, w27 -983c0053| uxth w24, w4 -5f2003d5| wfe -7f2003d5| wfi -3f2003d5| yield -02bb200e| abs v2.8b, v24.8b -0686ec4e| add v6.2d, v16.2d, v12.2d -ea42ac0e| addhn v10.2s, v23.2d, v12.2d -7d43624e| addhn2 v29.8h, v27.4s, v2.4s -2cbd710e| addp v12.4h, v9.4h, v17.4h -f5bab14e| addv s21, v23.4s -8158284e| aesd v1.16b, v4.16b -ba48284e| aese v26.16b, v5.16b -0c7a284e| aesimc v12.16b, v16.16b -3e6a284e| aesmc v30.16b, v17.16b -091f384e| and v9.16b, v24.16b, v24.16b -07b6046f| bic v7.8h, #0x90, lsl #8 -00c5006f| mvni v0.4s, #0x8, msl #8 -f81e6c0e| bic v24.8b, v23.8b, v12.8b -6f1ced2e| bif v15.8b, v3.8b, v13.8b -e31da16e| bit v3.16b, v15.16b, v1.16b -6a1d7c6e| bsl v10.16b, v11.16b, v28.16b -284a600e| cls v8.4h, v17.4h -9a49202e| clz v26.8b, v12.8b -d78f706e| cmeq v23.8h, v30.8h, v16.8h -7798e05e| cmeq d23, d3, #0 -739a200e| cmeq v19.8b, v19.8b, #0 -ff3f2b4e| cmge v31.16b, v31.16b, v11.16b -5337370e| cmgt v19.8b, v26.8b, v23.8b -3489604e| cmgt v20.8h, v9.8h, #0 -083d782e| cmhs v8.4h, v8.4h, v24.4h -c899e07e| cmle d8, d14, #0 -3498a06e| cmle v20.4s, v1.4s, #0 -ebaa200e| cmlt v11.8b, v23.8b, #0 -408dfe4e| cmtst v0.2d, v10.2d, v30.2d -0e06085e| mov d14, v16.d[0] -1e0d0d0e| dup v30.8b, w8 -8e1d3a6e| eor v14.16b, v12.16b, v26.16b -632a086e| ext v3.16b, v19.16b, v8.16b, #5 -97d7e57e| fabd d23, d28, d5 -6bd4a82e| fabd v11.2s, v3.2s, v8.2s -f7faa00e| fabs v23.2s, v23.2s -54c2201e| fabs s20, s18 -3ec3601e| fabs d30, d25 -2aee317e| facge s10, s17, s17 -2fed392e| facge v15.2s, v9.2s, v25.2s -2befe97e| facgt d11, d25, d9 -65eced6e| facgt v5.2d, v3.2d, v13.2d -55d53c4e| fadd v21.4s, v10.4s, v28.4s -8b283f1e| fadd s11, s4, s31 -d828601e| fadd d24, d6, d0 -e9d8307e| faddp s9, v7.2s -4084391e| fccmp s2, s25, #0x0, hi -ef046d1e| fccmp d7, d13, #0xf, eq -d7a4241e| fccmpe s6, s4, #0x7, ge -dbf5601e| fccmpe d14, d0, #0xb, al -77e7625e| fcmeq d23, d27, d2 -2de67f4e| fcmeq v13.2d, v17.2d, v31.2d -59daa05e| fcmeq s25, s18, #0 -add9a00e| fcmeq v13.2s, v13.2s, #0 -dce42d7e| fcmge s28, s6, s13 -62e6776e| fcmge v2.2d, v19.2d, v23.2d -f9cae07e| fcmge d25, d23, #0 -18e5ab7e| fcmgt s24, s8, s11 -84e7ae6e| fcmgt v4.4s, v28.4s, v14.4s -a0c8e05e| fcmgt d0, d5, #0 -c6cae04e| fcmgt v6.2d, v22.2d, #0 -4fdaa07e| fcmle s15, s18, #0 -e1d9a02e| fcmle v1.2s, v15.2s, #0 -1ee9a05e| fcmlt s30, s8, #0 -23eaa04e| fcmlt v3.4s, v17.4s, #0 -6023321e| fcmp s27, s18 -2823391e| fcmp s25, #0 -00236d1e| fcmp d24, d13 -e820601e| fcmp d7, #0 -3022381e| fcmpe s17, s24 -f8233e1e| fcmpe s31, #0 -b0206a1e| fcmpe d5, d10 -3820691e| fcmpe d1, #0 -d85f271e| fcsel s24, s30, s7, pl -ed8f7a1e| fcsel d13, d31, d26, hi -0042e21e| fcvt s0, h16 -efc1e21e| fcvt d15, h15 -edc1231e| fcvt h13, s15 -0ac0221e| fcvt d10, s0 -39c3631e| fcvt h25, d25 -da43621e| fcvt s26, d30 -10cb615e| fcvtas d16, d24 -f400241e| fcvtas w20, s7 -2f00249e| fcvtas x15, s1 -1d02641e| fcvtas w29, d16 -9303649e| fcvtas x19, d28 -02ca217e| fcvtau s2, s16 -afc8212e| fcvtau v15.2s, v5.2s -6e02251e| fcvtau w14, s19 -fd02259e| fcvtau x29, s23 -8603651e| fcvtau w6, d28 -4001659e| fcvtau x0, d10 -1f78210e| fcvtl v31.4s, v0.4h -d179214e| fcvtl2 v17.4s, v14.8h -fdbb615e| fcvtms d29, d31 -9601301e| fcvtms w22, s12 -f403309e| fcvtms x20, s31 -6b02701e| fcvtms w11, d19 -4802709e| fcvtms x8, d18 -84ba217e| fcvtmu s4, s20 -ae01311e| fcvtmu w14, s13 -8402319e| fcvtmu x4, s20 -7403711e| fcvtmu w20, d27 -2a03719e| fcvtmu x10, d25 -a36b210e| fcvtn v3.4h, v29.4s -5c6a214e| fcvtn2 v28.8h, v18.4s -78a9215e| fcvtns s24, s11 -b1ab614e| fcvtns v17.2d, v29.2d -0c01201e| fcvtns w12, s8 -b303209e| fcvtns x19, s29 -c401601e| fcvtns w4, d14 -5200609e| fcvtns x18, d2 -c2a8617e| fcvtnu d2, d6 -daab616e| fcvtnu v26.2d, v30.2d -d001211e| fcvtnu w16, s14 -0402219e| fcvtnu x4, s16 -7800611e| fcvtnu w24, d3 -e602619e| fcvtnu x6, d23 -74aaa15e| fcvtps s20, s19 -c801281e| fcvtps w8, s14 -8f02289e| fcvtps x15, s20 -6d02681e| fcvtps w13, d19 -bc00689e| fcvtps x28, d5 -43aba17e| fcvtpu s3, s26 -cda9a12e| fcvtpu v13.2s, v14.2s -c102291e| fcvtpu w1, s22 -9103299e| fcvtpu x17, s28 -7602691e| fcvtpu w22, d19 -4501699e| fcvtpu x5, d10 -976a616e| fcvtxn2 v23.4s, v20.2d -d5fc575f| fcvtzs d21, d6, #41 -babaa15e| fcvtzs s26, s21 -7aa6181e| fcvtzs w26, s19, #23 -c410189e| fcvtzs x4, s6, #60 -4db5589e| fcvtzs x13, d10, #19 -9000381e| fcvtzs w16, s4 -1702389e| fcvtzs x23, s16 -8a03781e| fcvtzs w10, d28 -d501789e| fcvtzs x21, d14 -eefd2d7f| fcvtzu s14, s15, #19 -4dfc3c6f| fcvtzu v13.4s, v2.4s, #4 -96bbe17e| fcvtzu d22, d28 -30b8e16e| fcvtzu v16.2d, v1.2d -fdef191e| fcvtzu w29, s31, #5 -1d7b199e| fcvtzu x29, s24, #34 -b8f5591e| fcvtzu w24, d13, #3 -5080599e| fcvtzu x16, d2, #32 -d002391e| fcvtzu w16, s22 -9b03399e| fcvtzu x27, s28 -7501791e| fcvtzu w21, d11 -7603799e| fcvtzu x22, d27 -06fe3c6e| fdiv v6.4s, v16.4s, v28.4s -c41b201e| fdiv s4, s30, s0 -1618781e| fdiv d22, d0, d24 -507b0d1f| fmadd s16, s26, s13, s30 -8803491f| fmadd d8, d28, d9, d0 -75f7394e| fmax v21.4s, v27.4s, v25.4s -804b3c1e| fmax s0, s28, s28 -c1496c1e| fmax d1, d14, d12 -5b69371e| fmaxnm s27, s10, s23 -1468711e| fmaxnm d20, d0, d17 -a4c8707e| fmaxnmp d4, v5.2d -89f9707e| fmaxp d9, v12.2d -4af63e2e| fmaxp v10.2s, v18.2s, v30.2s -25fa306e| fmaxv s5, v17.4s -01f4e04e| fmin v1.2d, v0.2d, v0.2d -59592a1e| fmin s25, s10, s10 -3959611e| fmin d25, d9, d1 -73c7ba4e| fminnm v19.4s, v27.4s, v26.4s -1279391e| fminnm s18, s8, s25 -75796c1e| fminnm d21, d11, d12 -90cbb07e| fminnmp s16, v28.2s -c5c8b06e| fminnmv s5, v6.4s -cdfbf07e| fminp d13, v30.2d -edf6f66e| fminp v13.2d, v23.2d, v22.2d -6513b85f| fmla s5, s27, v24.s[1] -ee18984f| fmla v14.4s, v7.4s, v24.s[2] -b85ab75f| fmls s24, s21, v23.s[3] -a3f5030f| fmov v3.2s, #9.062500000000000000e-01 -eaf7056f| fmov v10.2d, #-3.100000000000000000e+01 -3b41201e| fmov s27, s9 -0d41601e| fmov d13, d8 -9700271e| fmov s23, w4 -ad03261e| fmov w13, s29 -2302679e| fmov d3, x17 -e101af9e| fmov v1.d[1], x15 -f301669e| fmov x19, d15 -1103ae9e| fmov x17, v24.d[1] -0230321e| fmov s2, #-4.250000000000000000e+00 -18b0751e| fmov d24, #-1.450000000000000000e+01 -92bc1b1f| fmsub s18, s4, s27, s15 -f8e14a1f| fmsub d24, d15, d10, d24 -ef91d35f| fmul d15, d15, v19.d[0] -d293c24f| fmul v18.2d, v30.2d, v2.d[0] -18dd2b2e| fmul v24.2s, v8.2s, v11.2s -a4093d1e| fmul s4, s13, s29 -94096f1e| fmul d20, d12, d15 -fe918e7f| fmulx s30, s15, v14.s[0] -7199c56f| fmulx v17.2d, v11.2d, v5.d[1] -32dc695e| fmulx d18, d1, d9 -c8f9e06e| fneg v8.2d, v14.2d -9c41211e| fneg s28, s12 -c443611e| fneg d4, d30 -e77f301f| fnmadd s7, s31, s16, s31 -9f326c1f| fnmadd d31, d20, d12, d12 -d9e92f1f| fnmsub s25, s14, s15, s26 -00ad711f| fnmsub d0, d8, d17, d11 -c889211e| fnmul s8, s14, s1 -528b761e| fnmul d18, d26, d22 -01d8e15e| frecpe d1, d0 -9aff7e5e| frecps d26, d28, d30 -78fe2a4e| frecps v24.4s, v19.4s, v10.4s -01f9e15e| frecpx d1, d8 -128b216e| frinta v18.4s, v24.4s -b241261e| frinta s18, s13 -a841661e| frinta d8, d13 -799aa16e| frinti v25.4s, v19.4s -1cc2271e| frinti s28, s16 -93c2671e| frinti d19, d20 -1a40251e| frintm s26, s0 -ac42651e| frintm d12, d21 -5889214e| frintn v24.4s, v10.4s -5740241e| frintn s23, s2 -9443641e| frintn d20, d28 -4b89a10e| frintp v11.2s, v10.2s -a0c1241e| frintp s0, s13 -93c2641e| frintp d19, d20 -d49b216e| frintx v20.4s, v30.4s -df41271e| frintx s31, s14 -8d41671e| frintx d13, d12 -3998a10e| frintz v25.2s, v1.2s -fdc2251e| frintz s29, s23 -abc2651e| frintz d11, d21 -10dba17e| frsqrte s16, s24 -edd9e16e| frsqrte v13.2d, v15.2d -75ffe35e| frsqrts d21, d27, d3 -b4fdbe4e| frsqrts v20.4s, v13.4s, v30.4s -24f8a16e| fsqrt v4.4s, v1.4s -b6c1211e| fsqrt s22, s13 -c1c3611e| fsqrt d1, d30 -ffd5b44e| fsub v31.4s, v15.4s, v20.4s -d438331e| fsub s20, s6, s19 -f038771e| fsub d16, d7, d23 -675e1a6e| mov v7.h[6], v19.h[5] -2a1c0a4e| mov v10.h[2], w1 -de7f400c| ld1 {v30.1d}, [x30] -4aa7404c| ld1 {v10.8h, v11.8h}, [x26] -5d61400c| ld1 {v29.8b-v31.8b}, [x10] -af21404c| ld1 {v15.16b-v18.16b}, [x13] -737edf0c| ld1 {v19.1d}, [x19],#8 -757dd10c| ld1 {v21.1d}, [x11], x17 -5ca3df4c| ld1 {v28.16b, v29.16b}, [x26],#32 -93a1ce0c| ld1 {v19.8b, v20.8b}, [x12], x14 -1c65df0c| ld1 {v28.4h-v30.4h}, [x8],#24 -4461d34c| ld1 {v4.16b-v6.16b}, [x10], x19 -b22edf4c| ld1 {v18.2d-v21.2d}, [x21],#64 -c12fcc4c| ld1 {v1.2d-v4.2d}, [x30], x12 -5a03400d| ld1 {v26.b}[0], [x26] -8d93404d| ld1 {v13.s}[3], [x28] -2186404d| ld1 {v1.d}[1], [x17] -9604df4d| ld1 {v22.b}[9], [x4],#1 -4a1dc94d| ld1 {v10.b}[15], [x10], x9 -4852df4d| ld1 {v8.h}[6], [x18],#2 -2582df4d| ld1 {v5.s}[2], [x17],#4 -2191c84d| ld1 {v1.s}[3], [x9], x8 -c284df4d| ld1 {v2.d}[1], [x6],#8 -8f85ce0d| ld1 {v15.d}[0], [x12], x14 -87cd400d| ld1r {v7.1d}, [x12] -3bc8df4d| ld1r {v27.4s}, [x1],#4 -77c4dd4d| ld1r {v23.8h}, [x3], x29 -5384404c| ld2 {v19.8h, v20.8h}, [x2] -ca87df0c| ld2 {v10.4h, v11.4h}, [x30],#16 -1280d70c| ld2 {v18.8b, v19.8b}, [x0], x23 -4c0a604d| ld2 {v12.b, v13.b}[10], [x18] -3080600d| ld2 {v16.s, v17.s}[0], [x1] -6686600d| ld2 {v6.d, v7.d}[0], [x19] -061eff0d| ld2 {v6.b, v7.b}[7], [x16],#2 -db05fa0d| ld2 {v27.b, v28.b}[1], [x14], x26 -8a49ff4d| ld2 {v10.h, v11.h}[5], [x12],#4 -bb59ec4d| ld2 {v27.h, v28.h}[7], [x13], x12 -5a82ff0d| ld2 {v26.s, v27.s}[0], [x18],#8 -6180e30d| ld2 {v1.s, v2.s}[0], [x3], x3 -6485ff0d| ld2 {v4.d, v5.d}[0], [x11],#16 -7c86ed4d| ld2 {v28.d, v29.d}[1], [x19], x13 -54c0604d| ld2r {v20.16b, v21.16b}, [x2] -fdcaff0d| ld2r {v29.2s, v30.2s}, [x23],#8 -7bc5e40d| ld2r {v27.4h, v28.4h}, [x11], x4 -b349404c| ld3 {v19.4s-v21.4s}, [x13] -cf46df4c| ld3 {v15.8h-v17.8h}, [x22],#48 -934acc4c| ld3 {v19.4s-v21.4s}, [x20], x12 -2c33404d| ld3 {v12.b-v14.b}[12], [x25] -897a400d| ld3 {v9.h-v11.h}[3], [x20] -f9b2400d| ld3 {v25.s-v27.s}[1], [x23] -4aa7404d| ld3 {v10.d-v12.d}[1], [x26] -4e25df4d| ld3 {v14.b-v16.b}[9], [x10],#3 -7827c40d| ld3 {v24.b-v26.b}[1], [x27], x4 -c4a3df4d| ld3 {v4.s-v6.s}[2], [x30],#12 -f0a1cf0d| ld3 {v16.s-v18.s}[0], [x15], x15 -1ba7df0d| ld3 {v27.d-v29.d}[0], [x24],#24 -f7a7d50d| ld3 {v23.d-v25.d}[0], [sp], x21 -a9ed404d| ld3r {v9.2d-v11.2d}, [x13] -5aecdf4d| ld3r {v26.2d-v28.2d}, [x2],#24 -bae9c74d| ld3r {v26.4s-v28.4s}, [x13], x7 -5904404c| ld4 {v25.8h-v28.8h}, [x2] -743b604d| ld4 {v20.b-v23.b}[14], [x27] -bda1600d| ld4 {v29.s, v30.s, v31.s, v0.s}[0], [x13] -a3a4600d| ld4 {v3.d-v6.d}[0], [x5] -2f3aff4d| ld4 {v15.b-v18.b}[14], [x17],#4 -e73bef4d| ld4 {v7.b-v10.b}[14], [sp], x15 -5d78ef0d| ld4 {v29.h, v30.h, v31.h, v0.h}[3], [x2], x15 -acb3ff0d| ld4 {v12.s-v15.s}[1], [x29],#16 -a8b2f04d| ld4 {v8.s-v11.s}[3], [x21], x16 -75a7ff4d| ld4 {v21.d-v24.d}[1], [x27],#32 -75a6ee4d| ld4 {v21.d-v24.d}[1], [x19], x14 -d8e3604d| ld4r {v24.16b-v27.16b}, [x30] -49e9ff0d| ld4r {v9.2s-v12.2s}, [x10],#16 -81effc0d| ld4r {v1.1d-v4.1d}, [x28], x28 -893e622c| ldnp s9, s15, [x20,#-240] -f90e626c| ldnp d25, d3, [x23,#-480] -b0224fac| ldnp q16, q8, [x21,#480] -9186de2c| ldp s17, s1, [x20],#244 -e820d06c| ldp d8, d8, [x7],#256 -417de8ac| ldp q1, q31, [x10],#-768 -7969ed2d| ldp s25, s26, [x11,#-152]! -70c8c36d| ldp d16, d18, [x3,#56]! -30b4c4ad| ldp q16, q13, [x1,#144]! -a1857f2d| ldp s1, s1, [x13,#-4] -f4ae786d| ldp d20, d11, [x23,#-120] -998366ad| ldp q25, q0, [x28,#-816] -7535453c| ldr b21, [x11],#83 -5465477c| ldr h20, [x10],#118 -a2b44bbc| ldr s2, [x5],#187 -ab045bfc| ldr d11, [x5],#-80 -0515d43c| ldr q5, [x8],#-191 -43ad413c| ldr b3, [x10,#26]! -22cd4f7c| ldr h2, [x9,#252]! -5fad44bc| ldr s31, [x10,#74]! -db7d5afc| ldr d27, [x14,#-89]! -15ccd63c| ldr q21, [x0,#-148]! -95c34b3d| ldr b21, [x28,#752] -f5885e7d| ldr h21, [x7,#3908] -54db66bd| ldr s20, [x26,#9944] -46ee78fd| ldr d6, [x18,#29144] -0cc4e93d| ldr q12, [x0,#42768] -e1c4211c| ldr s1, .+0x4389c -2071c35c| ldr d0, .+0xfffffffffff86e24 -4765789c| ldr q7, .+0xf0ca8 -ae79703c| ldr b14, [x13,x16,lsl #0] -38fb67bc| ldr s24, [x25,x7,sxtx #2] -3e6b6dfc| ldr d30, [x25,x13] -a278ff3c| ldr q2, [x5,xzr,lsl #4] -ed02563c| ldur b13, [x23,#-160] -01c0507c| ldur h1, [x0,#-244] -7fd24ebc| ldur s31, [x19,#237] -7a734ffc| ldur d26, [x27,#247] -d4a3dd3c| ldur q20, [x30,#-38] -1c97250e| mla v28.8b, v24.8b, v5.8b -af97a12e| mls v15.2s, v29.2s, v1.2s -2b061f5e| mov b11, v17.b[15] -805e086e| mov v0.d[0], v20.d[1] -d91fbc4e| orr v25.16b, v30.16b, v28.16b -a43f040e| mov w4, v29.s[0] -fbe6054f| movi v27.16b, #0xb7 -9b75024f| orr v27.4s, #0x4c, lsl #24 -8436020f| orr v4.2s, #0x54, lsl #8 -19f5010f| fmov v25.2s, #1.200000000000000000e+01 -02e5062f| movi d2, #0xffff0000ff000000 -d6e5066f| movi v22.2d, #0xffff0000ffffff00 -be9c240e| mul v30.8b, v5.8b, v4.8b -2659202e| mvn v6.8b, v9.8b -f394046f| bic v19.8h, #0x87 -d856056f| bic v24.4s, #0xb6, lsl #16 -2f85022f| mvni v15.4h, #0x49 -24baa02e| neg v4.2s, v17.2s -145b206e| mvn v20.16b, v24.16b -191fff4e| orn v25.16b, v24.16b, v31.16b -6f96004f| orr v15.8h, #0x13 -a564020f| movi v5.2s, #0x45, lsl #24 -ae1ead0e| orr v14.8b, v21.8b, v13.8b -f2e1e00e| pmull v18.1q, v15.1d, v0.1d -0d426e2e| raddhn v13.4h, v16.4s, v14.4s -4443246e| raddhn2 v4.16b, v26.8h, v4.8h -015b602e| rbit v1.8b, v24.8b -4209202e| rev32 v2.8b, v10.8b -d109a04e| rev64 v17.4s, v14.4s -5a8e380f| rshrn v26.2s, v18.2d, #8 -438d234f| rshrn2 v3.4s, v10.2d, #29 -a861716e| rsubhn2 v8.8h, v13.4s, v17.4s -017c2f0e| saba v1.8b, v0.8b, v15.8b -5d51a90e| sabal v29.2d, v10.2s, v9.2s -c076a04e| sabd v0.4s, v22.4s, v0.4s -2d722e0e| sabdl v13.8h, v17.8b, v14.8b -1f732e4e| sabdl2 v31.8h, v24.16b, v14.16b -c628604e| saddlp v6.4s, v6.8h -103b704e| saddlv s16, v24.8h -8f122f0e| saddw v15.8h, v20.8h, v15.8b -30e6755f| scvtf d16, d17, #11 -73e7544f| scvtf v19.2d, v27.2d, #44 -51d9615e| scvtf d17, d10 -fad9210e| scvtf v26.2s, v15.2s -96c0421e| scvtf d22, w4, #16 -76e1029e| scvtf s22, x11, #8 -a791429e| scvtf d7, x13, #28 -f100221e| scvtf s17, w7 -e101621e| scvtf d1, w15 -6e03229e| scvtf s14, x27 -0b01629e| scvtf d11, x8 -2401025e| sha1c q4, s9, v2.4s -5d08285e| sha1h s29, s2 -65210d5e| sha1m q5, s11, v13.4s -29131a5e| sha1p q9, s25, v26.4s -2b311a5e| sha1su0 v11.4s, v9.4s, v26.4s -0919285e| sha1su1 v9.4s, v8.4s -f052035e| sha256h2 q16, q23, v3.4s -fe401e5e| sha256h q30, q7, v30.4s -7529285e| sha256su0 v21.4s, v11.4s -cc60195e| sha256su1 v12.4s, v6.4s, v25.4s -8b56060f| orr v11.2s, #0xd4, lsl #16 -3f3aa16e| shll2 v31.2d, v17.4s, #32 -0986394f| shrn2 v9.4s, v16.2d, #7 -35276e4e| shsub v21.8h, v25.8h, v14.8h -e2556d7f| sli d2, d15, #45 -f7541e6f| sli v23.8h, v7.8h, #14 -3167630e| smax v17.4h, v25.4h, v3.4h -68a6230e| smaxp v8.8b, v19.8b, v3.8b -a4aa304e| smaxv b4, v21.16b -2520440f| smlal v5.4s, v1.4h, v4.h[0] -8c286f4f| smlal2 v12.4s, v4.8h, v15.h[6] -3a82660e| smlal v26.4s, v17.4h, v6.4h -d92f1f0e| smov w25, v30.b[15] -912d114e| smov x17, v12.b[8] -b87ae05e| sqabs d24, d21 -2d7b200e| sqabs v13.8b, v25.8b -560f645e| sqadd h22, h26, h4 -4f0da54e| sqadd v15.4s, v10.4s, v5.4s -5992ba5e| sqdmlal d25, s18, s26 -b892684e| sqdmlal2 v24.4s, v21.8h, v8.8h -63786e5f| sqdmlsl s3, h3, v14.h[6] -0c79a10f| sqdmlsl v12.2d, v8.2s, v1.s[3] -1d73504f| sqdmlsl2 v29.4s, v24.8h, v0.h[1] -6cb36c5e| sqdmlsl s12, h27, h12 -82b36e4e| sqdmlsl2 v2.4s, v28.8h, v14.8h -8dca5d4f| sqdmulh v13.8h, v20.8h, v13.h[5] -fcb6b64e| sqdmulh v28.4s, v23.4s, v22.4s -d6b0974f| sqdmull2 v22.2d, v6.4s, v23.s[0] -afd0b84e| sqdmull2 v15.2d, v5.4s, v24.4s -067b207e| sqneg b6, b24 -9979606e| sqneg v25.8h, v12.8h -bfdbae0f| sqrdmulh v31.2s, v29.2s, v14.s[3] -c3b7a07e| sqrdmulh s3, s30, s0 -845d3d5e| sqrshl b4, b12, b29 -495dba0e| sqrshl v9.2s, v10.2s, v26.2s -fa8e0d7f| sqrshrun b26, h23, #3 -cf75185f| sqshl h15, h14, #8 -a975250f| sqshl v9.2s, v13.2s, #5 -424da05e| sqshl s2, s10, s0 -464db90e| sqshl v6.2s, v10.2s, v25.2s -af656d7f| sqshlu d15, d13, #45 -e564436f| sqshlu v5.2d, v7.2d, #3 -c1973b5f| sqshrn s1, d30, #5 -d586036f| mvni v21.8h, #0x76 -4c2ea95e| sqsub s12, s18, s9 -df2efe4e| sqsub v31.2d, v22.2d, v30.2d -c149a10e| sqxtn v1.2s, v14.2d -712a217e| sqxtun b17, h19 -9a29a12e| sqxtun v26.2s, v12.2d -6a166e0e| srhadd v10.4h, v19.4h, v14.4h -0445647f| sri d4, d8, #28 -6f44172f| sri v15.4h, v3.4h, #9 -cd56f94e| srshl v13.2d, v22.2d, v25.2d -12345b5f| srsra d18, d0, #37 -f746fa5e| sshl d23, d23, d26 -89476c4e| sshl v9.8h, v28.8h, v12.8h -0da60e0f| sshll v13.8h, v16.8b, #6 -a504585f| sshr d5, d5, #40 -3b07544f| sshr v27.2d, v25.2d, #44 -3417350f| ssra v20.2s, v25.2s, #11 -1a213f0e| ssubl v26.8h, v8.8b, v31.8b -1322a34e| ssubl2 v19.2d, v16.4s, v3.4s -e931b84e| ssubw2 v9.2d, v15.2d, v24.4s -dd7d004c| st1 {v29.2d}, [x14] -cea4000c| st1 {v14.4h, v15.4h}, [x6] -5a64000c| st1 {v26.4h-v28.4h}, [x2] -2b2c004c| st1 {v11.2d-v14.2d}, [x1] -39719f0c| st1 {v25.8b}, [x9],#8 -b771874c| st1 {v23.16b}, [x13], x7 -1da39f0c| st1 {v29.8b, v30.8b}, [x24],#16 -20a0800c| st1 {v0.8b, v1.8b}, [x1], x0 -5a6a9f4c| st1 {v26.4s-v28.4s}, [x18],#48 -0d69994c| st1 {v13.4s-v15.4s}, [x8], x25 -7e239f0c| st1 {v30.8b, v31.8b, v0.8b, v1.8b}, [x27],#32 -9a2d8e0c| st1 {v26.1d-v29.1d}, [x12], x14 -fd0b004d| st1 {v29.b}[10], [sp] -1058004d| st1 {v16.h}[7], [x0] -0593000d| st1 {v5.s}[1], [x24] -3d87000d| st1 {v29.d}[0], [x25] -1a079f0d| st1 {v26.b}[1], [x24],#1 -421b8f4d| st1 {v2.b}[14], [x26], x15 -54489f4d| st1 {v20.h}[5], [x2],#2 -c4809f4d| st1 {v4.s}[2], [x6],#4 -0481840d| st1 {v4.s}[0], [x8], x4 -6b859f0d| st1 {v11.d}[0], [x11],#8 -f7878e4d| st1 {v23.d}[1], [sp], x14 -e788004c| st2 {v7.4s, v8.4s}, [x7] -79889f0c| st2 {v25.2s, v26.2s}, [x3],#16 -a502204d| st2 {v5.b, v6.b}[8], [x21] -0e50204d| st2 {v14.h, v15.h}[6], [x0] -6b93204d| st2 {v11.s, v12.s}[3], [x27] -0987200d| st2 {v9.d, v10.d}[0], [x24] -7003bf0d| st2 {v16.b, v17.b}[0], [x27],#2 -1a09a94d| st2 {v26.b, v27.b}[10], [x8], x9 -1e43b00d| st2 {v30.h, v31.h}[0], [x24], x16 -1a82bf0d| st2 {v26.s, v27.s}[0], [x16],#8 -9892a50d| st2 {v24.s, v25.s}[1], [x20], x5 -5884bf0d| st2 {v24.d, v25.d}[0], [x2],#16 -9e87a34d| st2 {v30.d, v31.d}[1], [x28], x3 -4e47004c| st3 {v14.8h-v16.8h}, [x26] -76489f4c| st3 {v22.4s-v24.4s}, [x3],#48 -3b48860c| st3 {v27.2s-v29.2s}, [x1], x6 -e52a000d| st3 {v5.b-v7.b}[2], [x23] -6f73004d| st3 {v15.h-v17.h}[6], [x27] -9bb1004d| st3 {v27.s-v29.s}[3], [x12] -0ca7000d| st3 {v12.d-v14.d}[0], [x24] -2a259f0d| st3 {v10.b-v12.b}[1], [x9],#3 -0524860d| st3 {v5.b-v7.b}[1], [x0], x6 -94689a4d| st3 {v20.h-v22.h}[5], [x4], x26 -c2a19f4d| st3 {v2.s-v4.s}[2], [x14],#12 -5fb38c0d| st3 {v31.s, v0.s, v1.s}[1], [x26], x12 -6da59f4d| st3 {v13.d-v15.d}[1], [x11],#24 -32a7924d| st3 {v18.d-v20.d}[1], [x25], x18 -5b03000c| st4 {v27.8b-v30.8b}, [x26] -cd059f0c| st4 {v13.4h-v16.4h}, [x14],#32 -8601820c| st4 {v6.8b-v9.8b}, [x12], x2 -7925200d| st4 {v25.b-v28.b}[1], [x11] -cd7a204d| st4 {v13.h-v16.h}[7], [x22] -dfb2204d| st4 {v31.s, v0.s, v1.s, v2.s}[3], [x22] -daa4200d| st4 {v26.d-v29.d}[0], [x6] -2135bf0d| st4 {v1.b-v4.b}[5], [x9],#4 -7727a90d| st4 {v23.b-v26.b}[1], [x27], x9 -b4a3bf0d| st4 {v20.s-v23.s}[0], [x29],#16 -1ba3ae0d| st4 {v27.s-v30.s}[0], [x24], x14 -93a4bf0d| st4 {v19.d-v22.d}[0], [x4],#32 -50a6b80d| st4 {v16.d-v19.d}[0], [x18], x24 -79b53d2c| stnp s25, s13, [x11,#-20] -d895326c| stnp d24, d5, [x14,#-216] -d1810dac| stnp q17, q0, [x14,#432] -08728c2c| stp s8, s28, [x16],#96 -ac1ba16c| stp d12, d6, [x29],#-496 -f4fab1ac| stp q20, q30, [x23],#-464 -c15bbe2d| stp s1, s22, [x30,#-16]! -2422856d| stp d4, d8, [x17,#80]! -3d5282ad| stp q29, q20, [x17,#64]! -5df5352d| stp s29, s29, [x10,#-84] -5c54286d| stp d28, d21, [x2,#-384] -753c11ad| stp q21, q15, [x3,#544] -54e4033c| str b20, [x2],#62 -aa54137c| str h10, [x5],#-203 -c9d615bc| str s9, [x22],#-163 -fc471efc| str d28, [sp],#-28 -20f78d3c| str q0, [x25],#223 -028d1b3c| str b2, [x8,#-72]! -35be037c| str h21, [x17,#59]! -b98c15bc| str s25, [x5,#-168]! -fd1e11fc| str d29, [x23,#-239]! -13ec9a3c| str q19, [x0,#-82]! -b12d123d| str b17, [x13,#1163] -d6500b7d| str h22, [x6,#1448] -d46e39bd| str s20, [x22,#14700] -b84f30fd| str d24, [x29,#24728] -3cee993d| str q28, [x17,#26544] -4348293c| str b3, [x2,w9,uxtw] -ed7b253c| str b13, [sp,x5,lsl #0] -8fc9357c| str h15, [x12,w21,sxtw] -87f832bc| str s7, [x4,x18,sxtx #2] -f1ea38fc| str d17, [x23,x24,sxtx] -1c68a43c| str q28, [x0,x4] -dcb1023c| stur b28, [x14,#43] -6701117c| stur h7, [x11,#-240] -85b11bbc| stur s5, [x12,#-69] -8ea10efc| stur d14, [x12,#234] -eab08f3c| stur q10, [x7,#251] -ca876a2e| sub v10.4h, v30.4h, v10.4h -603be05e| suqadd d0, d27 -513a600e| suqadd v17.4h, v18.4h -25231c4e| tbl v5.16b, {v25.16b, v26.16b}, v28.16b -8c40100e| tbl v12.8b, {v4.16b-v6.16b}, v16.8b -0462040e| tbl v4.8b, {v16.16b-v19.16b}, v4.8b -34000f0e| tbl v20.8b, {v1.16b}, v15.8b -eb301f4e| tbx v11.16b, {v7.16b, v8.16b}, v31.16b -bb51124e| tbx v27.16b, {v13.16b-v15.16b}, v18.16b -cf701d0e| tbx v15.8b, {v6.16b-v9.16b}, v29.8b -4213080e| tbx v2.8b, {v26.16b}, v8.8b -2b2b114e| trn1 v11.16b, v25.16b, v17.16b -766ada4e| trn2 v22.2d, v19.2d, v26.2d -4152672e| uabal v1.4s, v18.4h, v7.4h -0953296e| uabal2 v9.8h, v24.16b, v9.16b -41756c6e| uabd v1.8h, v10.8h, v12.8h -3670ae2e| uabdl v22.2d, v1.2s, v14.2s -5401312e| uaddl v20.8h, v10.8b, v17.8b -d103286e| uaddl2 v17.8h, v30.16b, v8.16b -a92a206e| uaddlp v9.8h, v21.16b -b839706e| uaddlv s24, v13.8h -ea106d2e| uaddw v10.4s, v7.4s, v13.4h -c010726e| uaddw2 v0.4s, v6.4s, v18.8h -e7e5517f| ucvtf d7, d15, #47 -49e7376f| ucvtf v9.4s, v26.4s, #9 -4ada617e| ucvtf d10, d18 -6b82431e| ucvtf d11, w19, #32 -db84039e| ucvtf s27, x6, #31 -1c72439e| ucvtf d28, x16, #36 -f301231e| ucvtf s19, w15 -3503631e| ucvtf d21, w25 -e602239e| ucvtf s6, x23 -d503639e| ucvtf d21, x30 -ec04606e| uhadd v12.8h, v7.8h, v0.8h -3f65782e| umax v31.4h, v9.4h, v24.4h -afa6232e| umaxp v15.8b, v21.8b, v3.8b -cdaa706e| umaxv h13, v22.8h -736c236e| umin v19.16b, v3.16b, v3.16b -a0afa62e| uminp v0.2s, v29.2s, v6.2s -3c229e2f| umlal v28.2d, v17.2s, v30.s[0] -9d29a56f| umlal2 v29.2d, v12.4s, v5.s[3] -6c80392e| umlal v12.8h, v3.8b, v25.8b -4f60692f| umlsl v15.4s, v2.4h, v9.h[2] -61a1606e| umlsl2 v1.4s, v11.8h, v0.8h -183e0b0e| umov w24, v16.b[5] -c0a89b6f| umull2 v0.2d, v6.4s, v27.s[2] -36c0736e| umull2 v22.4s, v1.8h, v19.8h -120d757e| uqadd h18, h8, h21 -3a0c2e2e| uqadd v26.8b, v1.8b, v14.8b -0d5d617e| uqrshl h13, h8, h1 -4d5cb16e| uqrshl v13.4s, v2.4s, v17.4s -439c382f| uqrshrn v3.2s, v2.2d, #8 -9d745c7f| uqshl d29, d4, #28 -7b76656f| uqshl v27.2d, v19.2d, #37 -774ef37e| uqshl d23, d19, d19 -124eb32e| uqshl v18.2s, v16.2s, v19.2s -bc961f6f| uqshrn2 v28.8h, v21.4s, #1 -a62ce07e| uqsub d6, d5, d0 -0f2dae2e| uqsub v15.2s, v8.2s, v14.2s -b24b217e| uqxtn b18, h29 -f148216e| uqxtn2 v17.16b, v7.8h -7d15a42e| urhadd v29.2s, v11.2s, v4.2s -9055fc6e| urshl v16.2d, v12.2d, v28.2d -eb275e7f| urshr d11, d31, #34 -c0347c7f| ursra d0, d6, #4 -fe44e97e| ushl d30, d7, d9 -fa47e86e| ushl v26.2d, v31.2d, v8.2d -95a7262f| ushll v21.2d, v28.2s, #6 -9ca7096f| ushll2 v28.8h, v28.16b, #1 -8a07527f| ushr d10, d28, #46 -c7076b6f| ushr v7.2d, v30.2d, #21 -8d39e07e| usqadd d13, d12 -f716727f| usra d23, d23, #14 -3f14066f| bic v31.4s, #0xc1 -b423ac2e| usubl v20.2d, v29.2s, v12.2s -7c22736e| usubl2 v28.4s, v19.8h, v19.8h -76317d2e| usubw v22.4s, v11.4s, v29.4h -8f302a6e| usubw2 v15.8h, v4.8h, v10.16b -c5a4286f| ushll2 v5.2d, v6.4s, #8 -d3198c0e| uzp1 v19.2s, v14.2s, v12.2s -c05bdb4e| uzp2 v0.2d, v30.2d, v27.2d -362b610e| xtn v22.4h, v25.4s -0c29214e| xtn2 v12.16b, v8.8h -2b39c64e| zip1 v11.2d, v9.2d, v6.2d -9500091a| adc w21, w4, w9 -c2001a9a| adc x2, x6, x26 -6a02163a| adcs w10, w19, w22 -0c0118ba| adcs x12, x8, x24 -b1c42b0b| add w17, w5, w11, sxtw #1 -bf15368b| add sp, x13, w22, uxtb #5 -be1f468b| add x30, x29, x6, lsr #7 -8f51352b| adds w15, w12, w21, uxtw #4 -97043eab| adds x23, x4, w30, uxtb #1 -09b00931| adds w9, w0, #0x26c -4de204ab| adds x13, x18, x4, lsl #56 -bba87030| adr x27, .+0xe1515 -a9bf40d0| adrp x9, .+0x817f6000 -f6b60912| and w22, w23, #0xff9fff9f -a6d13b92| and x6, x13, #0xe3e3e3e3e3e3e3e3 -1cc0138a| and x28, x0, x19, lsl #48 -73882072| ands w19, w3, #0x70007 -b5780af2| ands x21, x5, #0xffdfffffffdfffff -766c90ea| ands x22, x3, x16, asr #27 -a72ac31a| asr w7, w21, w3 -ff28d59a| asr xzr, x7, x21 -3e7f0913| asr w30, w25, #9 -bafd5493| asr x26, x13, #20 -302ad21a| asr w16, w17, w18 -602bd79a| asr x0, x27, x23 -4fa4df54| b.al .+0xfffffffffffbf488 -a2e9cf15| b .+0x73fa688 -eff373b3| bfxil x15, xzr, #51, #10 -9e3e7db3| bfi x30, x20, #3, #16 -87fa41b3| bfxil x7, x20, #1, #62 -b831f80a| bic w24, w13, w24, ror #12 -ffe0ae8a| bic xzr, x7, x14, asr #56 -7c2c276a| bics w28, w3, w7, lsl #11 -ccf2fbea| bics x12, x22, x27, ror #60 -722cd195| bl .+0x744b1c8 -20003fd6| blr x1 -e0021fd6| br x23 -80db37d4| brk #0xbedc -f25a4335| cbnz w18, .+0x86b5c -5d5376b5| cbnz x29, .+0xeca68 -5ce56834| cbz w28, .+0xd1ca8 -29b08cb4| cbz x9, .+0xfffffffffff19604 -e048533a| ccmn w7, #0x13, #0x0, mi -e7da4fba| ccmn x23, #0xf, #0x7, le -67f2583a| ccmn w19, w24, #0x7, al -60a05aba| ccmn x3, x26, #0x0, ge -6a3b517a| ccmp w27, #0x11, #0xa, cc -8a4b55fa| ccmp x28, #0x15, #0xa, mi -ed934b7a| ccmp wzr, w11, #0xd, ls -24414ffa| ccmp x9, x15, #0x4, mi -0e169c1a| csinc w14, w16, w28, ne -8264949a| csinc x2, x4, x20, vs -b363935a| csinv w19, w29, w19, vs -ff619dda| csinv xzr, x15, x29, vs -5f3703d5| clrex #0x7 -0017c05a| cls w0, w24 -8216c0da| cls x2, x20 -3310c05a| clz w19, w1 -6e13c0da| clz x14, x27 -7fd02b2b| cmn w3, w11, sxtw #4 -5f3928ab| cmn x10, w8, uxth #6 -1fb92cb1| cmn x8, #0xb2e -ff164eab| cmn x23, x14, lsr #5 -ff71256b| cmp w15, w5, uxtx #4 -df6034eb| cmp x6, x20, uxtx -ff776af1| cmp sp, #0xa9d, lsl #12 -80e4855a| csneg w0, w4, w5, al -da3490da| csneg x26, x6, x16, cc -af40c71a| crc32b w15, w5, w7 -c546cf1a| crc32h w5, w22, w15 -6148c01a| crc32w w1, w3, w0 -0f4eda9a| crc32x w15, w16, x26 -4950d01a| crc32cb w9, w2, w16 -8155c31a| crc32ch w1, w12, w3 -835ace1a| crc32cw w3, w20, w14 -f05fc59a| crc32cx w16, wzr, x5 -0ae3901a| csel w10, w24, w16, al -ed51969a| csel x13, x15, x22, pl -ee679f1a| cset w14, vc -ed579f9a| cset x13, mi -f2539f5a| csetm w18, mi -ffe39fda| csinv xzr, xzr, xzr, al -9d25941a| csinc w29, w12, w20, cs -afb7829a| csinc x15, x29, x2, lt -7602895a| csinv w22, w19, w9, eq -011394da| csinv x1, x24, x20, ne -68b7935a| csneg w8, w27, w19, lt -a32784da| csneg x3, x29, x4, cs -8159a6d4| dcps1 #0x32cc -c2d9aad4| dcps2 #0x56ce -63ceb7d4| dcps3 #0xbe73 -bf3903d5| dmb ishld -e003bfd6| drps -9f3603d5| dsb nshst -fc76a9ca| eon x28, x23, x9, asr #29 -540f2352| eor w20, w26, #0xe0000001 -187e1ed2| eor x24, x16, #0xffffffffffffffff -fd37004a| eor w29, wzr, w0, lsl #13 -b8c542ca| eor x24, x13, x2, lsr #49 -e0039fd6| eret -5f26c193| extr xzr, x18, x1, #9 -7f2003d5| wfi -ff2a03d5| hint #0x57 -804a59d4| hlt #0xca54 -df3003d5| isb #0x0 -10fcdf88| ldar w16, [x0] -fafcdfc8| ldar x26, [x7] -30fedf08| ldarb w16, [x17] -63fedf48| ldarh w3, [x19] -82ba7f88| ldaxp w2, w14, [x20] -d6917fc8| ldaxp x22, x4, [x14] -59ff5f88| ldaxr w25, [x26] -fefe5fc8| ldaxr x30, [x23] -a0fc5f08| ldaxrb w0, [x5] -fafd5f48| ldaxrh w26, [x15] -b8804428| ldnp w24, w0, [x5,#36] -93e969a8| ldnp x19, x26, [x12,#-360] -caccef28| ldp w10, w19, [x6],#-132 -7365c3a8| ldp x19, x25, [x11],#48 -3106ca29| ldp w17, w1, [x17,#80]! -0c02f7a9| ldp x12, x0, [x16,#-144]! -41af6529| ldp w1, w11, [x26,#-212] -706b65a9| ldp x16, x26, [x27,#-432] -746ecf68| ldpsw x20, x27, [x19],#120 -c051c669| ldpsw x0, x20, [x14,#48]! -aded5b69| ldpsw x13, x27, [x13,#220] -990457b8| ldr w25, [x4],#-144 -bbd556f8| ldr x27, [x13],#-147 -a45c51b8| ldr w4, [x5,#-235]! -344c41f8| ldr x20, [x1,#20]! -2d8755b9| ldr w13, [x25,#5508] -56e360f9| ldr x22, [x26,#16832] -1739b718| ldr w23, .+0xfffffffffff6e720 -97b91c58| ldr x23, .+0x39730 -3b264e38| ldrb w27, [x17],#226 -898f5738| ldrb w9, [x28,#-136]! -c44e6839| ldrb w4, [x22,#2579] -2d687738| ldrb w13, [x1,x23] -4d475978| ldrh w13, [x26],#-108 -39de5278| ldrh w25, [x17,#-211]! -9cc54879| ldrh w28, [x12,#1122] -87fb6978| ldrh w7, [x28,x9,sxtx #1] -3967cb38| ldrsb w25, [x25],#182 -abf69438| ldrsb x11, [x21],#-177 -159ed138| ldrsb w21, [x16,#-231]! -b63e8038| ldrsb x22, [x21,#3]! -4491c939| ldrsb w4, [x10,#612] -497e8039| ldrsb x9, [x18,#31] -7d6bf638| ldrsb w29, [x27,x22] -e578ba38| ldrsb x5, [x7,x26,lsl #0] -9f06ca78| ldrsh wzr, [x20],#160 -15c59d78| ldrsh x21, [x8],#-36 -c07fd278| ldrsh w0, [x30,#-217]! -bdec9278| ldrsh x29, [x5,#-210]! -10e2c979| ldrsh w16, [x16,#1264] -54d29d79| ldrsh x20, [x18,#3816] -eb9484b8| ldrsw x11, [x7],#73 -ba2e8ab8| ldrsw x26, [x21,#162]! -ac7f8ab9| ldrsw x12, [x29,#2684] -9466e898| ldrsw x20, .+0xfffffffffffd0cd0 -a359b3b8| ldrsw x3, [x13,w19,uxtw #2] -f8b941b8| ldtr w24, [x15,#27] -fc0a4ef8| ldtr x28, [x23,#224] -60d84638| ldtrb w0, [x3,#109] -44685978| ldtrh w4, [x2,#-106] -5379dc38| ldtrsb w19, [x10,#-57] -ade99538| ldtrsb x13, [x13,#-162] -905ac078| ldtrsh w16, [x20,#5] -10898478| ldtrsh x16, [x8,#72] -37188eb8| ldtrsw x23, [x1,#225] -992351b8| ldur w25, [x28,#-238] -c9f155f8| ldur x9, [x14,#-161] -76e14e38| ldurb w22, [x11,#238] -47b24478| ldurh w7, [x18,#75] -4020da38| ldursb w0, [x2,#-94] -0dd09e38| ldursb x13, [x0,#-19] -8f81d478| ldursh w15, [x12,#-184] -96918378| ldursh x22, [x12,#57] -b2e383b8| ldursw x18, [x29,#62] -d3717f88| ldxp w19, w28, [x14] -cb677fc8| ldxp x11, x25, [x30] -ed7c5f88| ldxr w13, [x7] -aa7d5fc8| ldxr x10, [x13] -1c7d5f08| ldxrb w28, [x8] -de7f5f48| ldxrh w30, [x30] -1622dc1a| lsl w22, w16, w28 -cd20d59a| lsl x13, x6, x21 -882957d3| ubfiz x8, x12, #41, #11 -3320cc1a| lsl w19, w1, w12 -7320de9a| lsl x19, x3, x30 -af25d31a| lsr w15, w13, w19 -e426c39a| lsr x4, x23, x3 -e87f0653| lsr w8, wzr, #6 -85fe5fd3| lsr x5, x20, #31 -0025dc1a| lsr w0, w8, w28 -6e27c79a| lsr x14, x27, x7 -6d69111b| madd w13, w11, w17, w26 -245d0d9b| madd x4, x9, x13, x23 -85fe1f1b| mneg w5, w20, wzr -9bfc199b| mneg x27, x4, x25 -13000011| add w19, w0, #0x0 -e3000091| add x3, x7, #0x0 -986c9e12| mov w24, #0xffff0c9b -cb24f092| mov x11, #0x7ed9ffffffffffff -3cbb88d2| mov x28, #0x45d9 -e4170232| mov w4, #0xc000000f -fe636bb2| mov x30, #0x3fffffe00000 -ed031b2a| mov w13, w27 -fb0308aa| mov x27, x8 -be3ed1f2| movk x30, #0x89f5, lsl #32 -e0a08312| mov w0, #0xffffe2f8 -a1a6e592| mov x1, #0xd2caffffffffffff -5260f0d2| mov x18, #0x8302000000000000 -a60739d5| mrs x6, s3_1_c0_c7_5 -281a1ed5| msr s3_6_c1_c10_1, x8 -10f31b1b| msub w16, w24, w27, w28 -46b41a9b| msub x6, x2, x26, x13 -ec7f041b| mul w12, wzr, w4 -147f009b| mul x20, x24, x0 -f67f692a| mvn w22, w9, lsr #31 -f2a3f7aa| mvn x18, x23, ror #40 -fe8b0bcb| neg x30, x11, lsl #34 -fef710eb| negs x30, x16, lsl #61 -e0031b5a| ngc w0, w27 -e0031dda| ngc x0, x29 -f003167a| ngcs w16, w22 -e60302fa| ngcs x6, x2 -1f2003d5| nop -2f51732a| orn w15, w9, w19, lsr #20 -9b0facaa| orn x27, x28, x12, asr #3 -efa40032| orr w15, w7, #0x3ff03ff -3a0b19b2| orr x26, x25, #0x38000000380 -4b9ec4aa| orr x11, x18, x4, ror #39 -f5eaa2f9| prfm pstl3strm, [x23,#17872] -731df8d8| prfm pstl2strm, .+0xffffffffffff03ac -85c194f8| prfum pldl3strm, [x12,#-180] -c303c05a| rbit w3, w30 -3000c0da| rbit x16, x1 -20025fd6| ret x17 -ec08c05a| rev w12, w7 -180cc0da| rev x24, x0 -4b07c05a| rev16 w11, w26 -7805c0da| rev16 x24, x11 -ea08c0da| rev32 x10, x7 -a90fc0da| rev x9, x29 -fd788213| extr w29, w7, w2, #30 -e1a0cc93| extr x1, x7, x12, #40 -792fdc1a| ror w25, w27, w28 -2b2cc39a| ror x11, x1, x3 -7e2ec71a| ror w30, w19, w7 -392edd9a| ror x25, x17, x29 -47020a5a| sbc w7, w18, w10 -b7021dda| sbc x23, x21, x29 -7800197a| sbcs w24, w3, w25 -1e0203fa| sbcs x30, x16, x3 -a6b07393| sbfiz x6, x5, #13, #45 -94957d93| sbfiz x20, x12, #3, #38 -ecff5e93| asr x12, xzr, #30 -a50ddb1a| sdiv w5, w13, w27 -7c0ec89a| sdiv x28, x19, x8 -9f2003d5| sev -bf2003d5| sevl -5953349b| smaddl x25, w26, w20, x20 -bafc399b| smnegl x26, w5, w25 -a5cc289b| smsubl x5, w5, w8, x19 -297c579b| smulh x9, x1, x23 -5e7e299b| smull x30, w18, w9 -29fd9f88| stlr w9, [x9] -fdff9fc8| stlr x29, [sp] -defe9f08| stlrb w30, [x22] -2ffc9f48| stlrh w15, [x1] -c1e12f88| stlxp w15, w1, w24, [x14] -62aa2ec8| stlxp w14, x2, x10, [x19] -b9fe1b88| stlxr w27, w25, [x21] -cbff14c8| stlxr w20, x11, [x30] -edfc0608| stlxrb w6, w13, [x7] -8dfe1048| stlxrh w16, w13, [x20] -1a323628| stnp w26, w12, [x16,#-80] -b3cb3da8| stnp x19, x18, [x29,#-40] -52398828| stp w18, w14, [x10],#64 -434c95a8| stp x3, x19, [x2],#336 -2badbd29| stp w11, w11, [x9,#-20]! -daeabaa9| stp x26, x26, [x22,#-88]! -9bc91529| stp w27, w18, [x12,#172] -eea024a9| stp x14, x8, [x7,#-440] -fec514b8| str w30, [x15],#-180 -d21508f8| str x18, [x14],#129 -7c5c0ab8| str w28, [x3,#165]! -6dec1ff8| str x13, [x3,#-2]! -35681eb9| str w21, [x1,#7784] -374d35f9| str x23, [x9,#27288] -1dd83df8| str x29, [x0,w29,sxtw #3] -1b441b38| strb w27, [x0],#-76 -d69c0f38| strb w22, [x6,#249]! -b7ce0d39| strb w23, [x21,#883] -2b7b3938| strb w11, [x25,x25,lsl #0] -4e771d78| strh w14, [x26],#-41 -64cc0b78| strh w4, [x3,#188]! -07b90279| strh w7, [x8,#348] -2eb91cb8| sttr w14, [x9,#-53] -373a1bf8| sttr x23, [x17,#-77] -d0881138| sttrb w16, [x6,#-232] -941a0e78| sttrh w20, [x20,#225] -da3000b8| stur w26, [x6,#3] -5e921cf8| stur x30, [x18,#-55] -09821e38| sturb w9, [x16,#-24] -67d21c78| sturh w7, [x19,#-51] -0c352188| stxp w1, w12, w13, [x8] -146d26c8| stxp w6, x20, x27, [x8] -837d1888| stxr w24, w3, [x12] -f17f1bc8| stxr w27, x17, [sp] -3b7d0f08| stxrb w15, w27, [x9] -6b7c1f48| stxrh wzr, w11, [x3] -70ab204b| sub w16, w27, w0, sxth #2 -303b20cb| sub x16, x25, w0, uxth #6 -69a909d1| sub x9, x11, #0x26a -87384e4b| sub w7, w4, w14, lsr #14 -ec720ecb| sub x12, x23, x14, lsl #28 -2b58256b| subs w11, w1, w5, uxtw #6 -59e93ceb| subs x25, x10, x28, sxtx #2 -9e7b6ff1| subs x30, x28, #0xbde, lsl #12 -3e6d196b| subs w30, w9, w25, lsl #27 -54029ceb| subs x20, x18, x28, asr #0 -c1f91cd4| svc #0xe7ce -091e0013| sxtb w9, w16 -7f1c4093| sxtb xzr, w3 -b53c0013| sxth w21, w5 -773e4093| sxth x23, w19 -707f4093| sxtw x16, w27 -df3a2dd5| sysl xzr, #5, C3, C10, #6 -607f3137| tbnz w0, #6, .+0x2fec -3b700c36| tbz w27, #1, .+0xffffffffffff8e04 -5f612972| tst w10, #0xff80ffff -bf2007f2| tst x5, #0xfe000003fe000003 -1f11136a| tst w8, w19, lsl #4 -5fd10dea| tst x10, x13, lsl #52 -5c826bd3| ubfiz x28, x18, #21, #33 -ad690c53| ubfx w13, w13, #12, #15 -3a0f41d3| ubfx x26, x25, #1, #3 -6a197dd3| ubfiz x10, x11, #3, #7 -520aca1a| udiv w18, w18, w10 -0809c89a| udiv x8, x8, x8 -4e55a69b| umaddl x14, w10, w6, x21 -99fda59b| umnegl x25, w12, w5 -1adabb9b| umsubl x26, w16, w27, x22 -177ddf9b| umulh x23, x8, xzr -1d7da49b| umull x29, w8, w4 -5a1c0053| uxtb w26, w2 -603c0053| uxth w0, w3 -5f2003d5| wfe -7f2003d5| wfi -3f2003d5| yield -02b8600e| abs v2.4h, v0.4h -c886f94e| add v8.2d, v22.2d, v25.2d -5642740e| addhn v22.4h, v18.4s, v20.4s -3743294e| addhn2 v23.16b, v25.8h, v9.8h -2abef74e| addp v10.2d, v17.2d, v23.2d -18bbb14e| addv s24, v24.4s -1a59284e| aesd v26.16b, v8.16b -cf48284e| aese v15.16b, v6.16b -557a284e| aesimc v21.16b, v18.16b -2f6b284e| aesmc v15.16b, v25.16b -cf1c324e| and v15.16b, v6.16b, v18.16b -c9c6032f| mvni v9.2s, #0x76, msl #8 -f1a7012f| mvni v17.4h, #0x3f, lsl #8 -691d600e| bic v9.8b, v11.8b, v0.8b -c31dfe6e| bif v3.16b, v14.16b, v30.16b -c81cb66e| bit v8.16b, v6.16b, v22.16b -701f6b2e| bsl v16.8b, v27.8b, v11.8b -7c4b600e| cls v28.4h, v27.4h -ce4a602e| clz v14.4h, v22.4h -d08de37e| cmeq d16, d14, d3 -e98db96e| cmeq v9.4s, v15.4s, v25.4s -6e99a00e| cmeq v14.2s, v11.2s, #0 -933d304e| cmge v19.16b, v12.16b, v16.16b -0e88e07e| cmge d14, d0, #0 -9b89202e| cmge v27.8b, v12.8b, #0 -6a372f4e| cmgt v10.16b, v27.16b, v15.16b -128be05e| cmgt d18, d24, #0 -9189a00e| cmgt v17.2s, v12.2s, #0 -f734e67e| cmhi d23, d7, d6 -4d36b82e| cmhi v13.2s, v18.2s, v24.2s -003e2b2e| cmhs v0.8b, v16.8b, v11.8b -729ae07e| cmle d18, d19, #0 -3699206e| cmle v22.16b, v9.16b, #0 -d1ab600e| cmlt v17.4h, v30.4h, #0 -ad8e244e| cmtst v13.16b, v21.16b, v4.16b -ef06035e| mov b15, v23.b[1] -5007040e| dup v16.2s, v26.s[0] -890e0b4e| dup v9.16b, w20 -951c276e| eor v21.16b, v4.16b, v7.16b -98d4bf7e| fabd s24, s4, s31 -bcd4ad6e| fabd v28.4s, v5.4s, v13.4s -78f8e04e| fabs v24.2d, v3.2d -8cc0201e| fabs s12, s4 -9ac1601e| fabs d26, d12 -3aee307e| facge s26, s17, s16 -41ed352e| facge v1.2s, v10.2s, v21.2s -35edaf7e| facgt s21, s9, s15 -02efe36e| facgt v2.2d, v24.2d, v3.2d -21d6664e| fadd v1.2d, v17.2d, v6.2d -5e282e1e| fadd s30, s2, s14 -4d2a621e| fadd d13, d18, d2 -7cd8707e| faddp d28, v3.2d -5dd4386e| faddp v29.4s, v2.4s, v24.4s -69363e1e| fccmp s19, s30, #0x9, cc -c8b56a1e| fccmp d14, d10, #0x8, lt -d1f5271e| fccmpe s14, s7, #0x1, al -3645751e| fccmpe d9, d21, #0x6, mi -21e6735e| fcmeq d1, d17, d19 -b6dba05e| fcmeq s22, s29, #0 -49d8a04e| fcmeq v9.4s, v2.4s, #0 -2ee5667e| fcmge d14, d9, d6 -4ee7766e| fcmge v14.2d, v26.2d, v22.2d -4bcba07e| fcmge s11, s26, #0 -11c9a02e| fcmge v17.2s, v8.2s, #0 -81e4a97e| fcmgt s1, s4, s9 -d3e4b56e| fcmgt v19.4s, v6.4s, v21.4s -efc8e05e| fcmgt d15, d7, #0 -3ec9e04e| fcmgt v30.2d, v9.2d, #0 -38d9a07e| fcmle s24, s9, #0 -7dd9a02e| fcmle v29.2s, v11.2s, #0 -bae8a05e| fcmlt s26, s5, #0 -a2eaa04e| fcmlt v2.4s, v21.4s, #0 -60212f1e| fcmp s11, s15 -a8233a1e| fcmp s29, #0 -a020641e| fcmp d5, d4 -e820701e| fcmp d7, #0 -b0203a1e| fcmpe s5, s26 -78203d1e| fcmpe s3, #0 -70226e1e| fcmpe d19, d14 -3821601e| fcmpe d9, #0 -06de241e| fcsel s6, s16, s4, le -51de761e| fcsel d17, d18, d22, le -5e42e21e| fcvt s30, h18 -b9c1e21e| fcvt d25, h13 -58c0231e| fcvt h24, s2 -9bc2221e| fcvt d27, s20 -2bc3631e| fcvt h11, d25 -f640621e| fcvt s22, d7 -caca215e| fcvtas s10, s22 -5ec9210e| fcvtas v30.2s, v10.2s -0302241e| fcvtas w3, s16 -c103249e| fcvtas x1, s30 -3003641e| fcvtas w16, d25 -6201649e| fcvtas x2, d11 -d3c9217e| fcvtau s19, s14 -3bc8212e| fcvtau v27.2s, v1.2s -0802251e| fcvtau w8, s16 -5f02259e| fcvtau xzr, s18 -2801651e| fcvtau w8, d9 -f200659e| fcvtau x18, d7 -d179610e| fcvtl v17.2d, v14.2s -347b614e| fcvtl2 v20.2d, v25.4s -08b9615e| fcvtms d8, d8 -f000301e| fcvtms w16, s7 -8002309e| fcvtms x0, s20 -5202701e| fcvtms w18, d18 -c803709e| fcvtms x8, d30 -1cbb217e| fcvtmu s28, s24 -d1b9212e| fcvtmu v17.2s, v14.2s -2e02311e| fcvtmu w14, s17 -d003319e| fcvtmu x16, s30 -ce03711e| fcvtmu w14, d30 -0801719e| fcvtmu x8, d8 -4c6b210e| fcvtn v12.4h, v26.4s -6869214e| fcvtn2 v8.8h, v11.4s -2faa615e| fcvtns d15, d17 -33aa614e| fcvtns v19.2d, v17.2d -d303201e| fcvtns w19, s30 -4001209e| fcvtns x0, s10 -b202601e| fcvtns w18, d21 -c603609e| fcvtns x6, d30 -8ea8217e| fcvtnu s14, s4 -cc01211e| fcvtnu w12, s14 -3a00219e| fcvtnu x26, s1 -2002611e| fcvtnu w0, d17 -ff01619e| fcvtnu xzr, d15 -1baba15e| fcvtps s27, s24 -9d00281e| fcvtps w29, s4 -eb02289e| fcvtps x11, s23 -3503681e| fcvtps w21, d25 -4301689e| fcvtps x3, d10 -63aba17e| fcvtpu s3, s27 -caa8a12e| fcvtpu v10.2s, v6.2s -7702291e| fcvtpu w23, s19 -b503299e| fcvtpu x21, s29 -2f03691e| fcvtpu w15, d25 -5b01699e| fcvtpu x27, d10 -7369617e| fcvtxn s19, d11 -6b6b612e| fcvtxn v11.2s, v27.2d -f268616e| fcvtxn2 v18.4s, v7.2d -bcff7b5f| fcvtzs d28, d29, #5 -19bbe15e| fcvtzs d25, d24 -c6b9e14e| fcvtzs v6.2d, v14.2d -e9fc189e| fcvtzs x9, s7, #1 -6661589e| fcvtzs x6, d11, #40 -9702381e| fcvtzs w23, s20 -ed00389e| fcvtzs x13, s7 -3a01781e| fcvtzs w26, d9 -8801789e| fcvtzs x8, d12 -a5ff2e2f| fcvtzu v5.2s, v29.2s, #18 -5bbbe17e| fcvtzu d27, d26 -1a74199e| fcvtzu x26, s0, #35 -e391599e| fcvtzu x3, d15, #28 -b203391e| fcvtzu w18, s29 -ed01399e| fcvtzu x13, s15 -c200791e| fcvtzu w2, d6 -5402799e| fcvtzu x20, d18 -1aff2b6e| fdiv v26.4s, v24.4s, v11.4s -171a391e| fdiv s23, s16, s25 -7d196b1e| fdiv d29, d11, d11 -f9721f1f| fmadd s25, s23, s31, s28 -7070551f| fmadd d16, d3, d21, d28 -05f7624e| fmax v5.2d, v24.2d, v2.2d -88493d1e| fmax s8, s12, s29 -4a496d1e| fmax d10, d10, d13 -5068321e| fmaxnm s16, s2, s18 -a66a761e| fmaxnm d6, d21, d22 -0ccb707e| fmaxnmp d12, v24.2d -6ec66f6e| fmaxnmp v14.2d, v19.2d, v15.2d -41f8307e| fmaxp s1, v2.2s -05f72a6e| fmaxp v5.4s, v24.4s, v10.4s -aa5b231e| fmin s10, s29, s3 -d6596a1e| fmin d22, d14, d10 -15c4b24e| fminnm v21.4s, v0.4s, v18.4s -6279281e| fminnm s2, s11, s8 -af7b6a1e| fminnm d15, d29, d10 -7dc9f07e| fminnmp d29, v11.2d -dfc6bb6e| fminnmp v31.4s, v22.4s, v27.4s -56c8b06e| fminnmv s22, v2.4s -0ff8f07e| fminp d15, v0.2d -a211c55f| fmla d2, d13, v5.d[0] -0dce224e| fmla v13.4s, v16.4s, v2.4s -4c5ba15f| fmls s12, s26, v1.s[3] -8953ba0f| fmls v9.2s, v28.2s, v26.s[1] -09cdbd4e| fmls v9.4s, v8.4s, v29.4s -97f7044f| fmov v23.4s, #-7.000000000000000000e+00 -dff4006f| fmov v31.2d, #2.750000000000000000e+00 -c543201e| fmov s5, s30 -1740601e| fmov d23, d0 -a100271e| fmov s1, w5 -f102261e| fmov w17, s23 -b302679e| fmov d19, x21 -4001af9e| fmov v0.d[1], x10 -db01669e| fmov x27, d14 -8300ae9e| fmov x3, v4.d[1] -1870331e| fmov s24, #-6.750000000000000000e+00 -08507d1e| fmov d8, #-8.125000000000000000e-01 -5cbf0c1f| fmsub s28, s26, s12, s15 -89e3501f| fmsub d9, d28, d16, d24 -3a93c95f| fmul d26, d25, v9.d[0] -5a90ae4f| fmul v26.4s, v2.4s, v14.s[1] -ba0a2f1e| fmul s26, s21, s15 -5b0a7c1e| fmul d27, d18, d28 -e991c07f| fmulx d9, d15, v0.d[0] -be989c6f| fmulx v30.4s, v5.4s, v28.s[2] -d3dc7a5e| fmulx d19, d6, d26 -d4de7f4e| fmulx v20.2d, v22.2d, v31.2d -8e41211e| fneg s14, s12 -dc42611e| fneg d28, d22 -cb362e1f| fnmadd s11, s22, s14, s13 -6441791f| fnmadd d4, d11, d25, d16 -36ed291f| fnmsub s22, s9, s9, s27 -35b27a1f| fnmsub d21, d17, d26, d12 -9388301e| fnmul s19, s4, s16 -c088711e| fnmul d0, d6, d17 -e8daa15e| frecpe s8, s23 -a9fc395e| frecps s9, s5, s25 -49fe284e| frecps v9.4s, v18.4s, v8.4s -85f8a15e| frecpx s5, s4 -ee43261e| frinta s14, s31 -7042661e| frinta d16, d19 -2b98a16e| frinti v11.4s, v1.4s -fac2271e| frinti s26, s23 -76c3671e| frinti d22, d27 -7942251e| frintm s25, s19 -8742651e| frintm d7, d20 -fc8a214e| frintn v28.4s, v23.4s -c041241e| frintn s0, s14 -b241641e| frintn d18, d13 -c588a14e| frintp v5.4s, v6.4s -6ec2241e| frintp s14, s19 -ddc0641e| frintp d29, d6 -1a9a616e| frintx v26.2d, v16.2d -7c41271e| frintx s28, s11 -d243671e| frintx d18, d30 -b49aa14e| frintz v20.4s, v21.4s -5bc0251e| frintz s27, s2 -43c1651e| frintz d3, d10 -3bdba17e| frsqrte s27, s25 -9ddba12e| frsqrte v29.2s, v28.2s -1ffee65e| frsqrts d31, d16, d6 -8bfdb54e| frsqrts v11.4s, v12.4s, v21.4s -33c1211e| fsqrt s19, s9 -a5c0611e| fsqrt d5, d5 -a2d7b74e| fsub v2.4s, v29.4s, v23.4s -a338301e| fsub s3, s5, s16 -e139681e| fsub d1, d15, d8 -96170e6e| mov v22.h[3], v28.h[1] -791c014e| mov v25.b[0], w3 -cf79404c| ld1 {v15.4s}, [x14] -75a6404c| ld1 {v21.8h, v22.8h}, [x19] -ed62404c| ld1 {v13.16b-v15.16b}, [x23] -392a400c| ld1 {v25.2s-v28.2s}, [x17] -cd7cdf4c| ld1 {v13.2d}, [x6],#16 -f677ce4c| ld1 {v22.8h}, [sp], x14 -d4a3df0c| ld1 {v20.8b, v21.8b}, [x30],#16 -8ba1d90c| ld1 {v11.8b, v12.8b}, [x12], x25 -396fdf0c| ld1 {v25.1d-v27.1d}, [x25],#24 -4c64db0c| ld1 {v12.4h-v14.4h}, [x2], x27 -3f2adf4c| ld1 {v31.4s, v0.4s, v1.4s, v2.4s}, [x17],#64 -b329ce4c| ld1 {v19.4s-v22.4s}, [x13], x14 -aa02400d| ld1 {v10.b}[0], [x21] -7980404d| ld1 {v25.s}[2], [x3] -5884404d| ld1 {v24.d}[1], [x2] -f203df4d| ld1 {v18.b}[8], [sp],#1 -3519c40d| ld1 {v21.b}[6], [x9], x4 -ed59df0d| ld1 {v13.h}[3], [x15],#2 -9e52d90d| ld1 {v30.h}[2], [x20], x25 -cd93df4d| ld1 {v13.s}[3], [x30],#4 -5982cb4d| ld1 {v25.s}[2], [x18], x11 -4f84df4d| ld1 {v15.d}[1], [x2],#8 -2d85d50d| ld1 {v13.d}[0], [x9], x21 -33c2400d| ld1r {v19.8b}, [x17] -e2c8df4d| ld1r {v2.4s}, [x7],#4 -83c2c44d| ld1r {v3.16b}, [x20], x4 -5487400c| ld2 {v20.4h, v21.4h}, [x26] -e08adf0c| ld2 {v0.2s, v1.2s}, [x23],#16 -768ac40c| ld2 {v22.2s, v23.2s}, [x19], x4 -4c0f604d| ld2 {v12.b, v13.b}[11], [x26] -e043604d| ld2 {v0.h, v1.h}[4], [sp] -c281600d| ld2 {v2.s, v3.s}[0], [x14] -e585600d| ld2 {v5.d, v6.d}[0], [x15] -2c1aff4d| ld2 {v12.b, v13.b}[14], [x17],#2 -820bfd4d| ld2 {v2.b, v3.b}[10], [x28], x29 -d593ff0d| ld2 {v21.s, v22.s}[1], [x30],#8 -6780ea0d| ld2 {v7.s, v8.s}[0], [x3], x10 -3484ff4d| ld2 {v20.d, v21.d}[1], [x1],#16 -6a86ee4d| ld2 {v10.d, v11.d}[1], [x19], x14 -e4c7604d| ld2r {v4.8h, v5.8h}, [sp] -69c8ff0d| ld2r {v9.2s, v10.2s}, [x3],#8 -52ccf30d| ld2r {v18.1d, v19.1d}, [x2], x19 -9e4b404c| ld3 {v30.4s, v31.4s, v0.4s}, [x28] -0440df4c| ld3 {v4.16b-v6.16b}, [x0],#48 -0f49cf0c| ld3 {v15.2s-v17.2s}, [x8], x15 -b22e400d| ld3 {v18.b-v20.b}[3], [x21] -9473400d| ld3 {v20.h-v22.h}[2], [x28] -1da0404d| ld3 {v29.s-v31.s}[2], [x0] -21a5404d| ld3 {v1.d-v3.d}[1], [x9] -3b23df0d| ld3 {v27.b-v29.b}[0], [x25],#3 -0937c60d| ld3 {v9.b-v11.b}[5], [x24], x6 -926bcb4d| ld3 {v18.h-v20.h}[5], [x28], x11 -f5a1df4d| ld3 {v21.s-v23.s}[2], [x15],#12 -dba3c44d| ld3 {v27.s-v29.s}[2], [x30], x4 -12a5df0d| ld3 {v18.d-v20.d}[0], [x8],#24 -daa7d30d| ld3 {v26.d-v28.d}[0], [x30], x19 -3beb400d| ld3r {v27.2s-v29.2s}, [x25] -cde4df4d| ld3r {v13.8h-v15.8h}, [x6],#6 -a4efc44d| ld3r {v4.2d-v6.2d}, [x29], x4 -fc0a400c| ld4 {v28.2s-v31.2s}, [x23] -ae05df0c| ld4 {v14.4h-v17.4h}, [x13],#32 -cb07c84c| ld4 {v11.8h-v14.8h}, [x30], x8 -1825604d| ld4 {v24.b-v27.b}[9], [x8] -2869604d| ld4 {v8.h-v11.h}[5], [x9] -07b2600d| ld4 {v7.s-v10.s}[1], [x16] -9fa4600d| ld4 {v31.d, v0.d, v1.d, v2.d}[0], [x4] -de22ff0d| ld4 {v30.b, v31.b, v0.b, v1.b}[0], [x22],#4 -6a36ed4d| ld4 {v10.b-v13.b}[13], [x19], x13 -23a2ff4d| ld4 {v3.s-v6.s}[2], [x17],#16 -22a0fe4d| ld4 {v2.s-v5.s}[2], [x1], x30 -7ca4ff4d| ld4 {v28.d-v31.d}[1], [x3],#32 -03a7ec4d| ld4 {v3.d-v6.d}[1], [x24], x12 -b9ee600d| ld4r {v25.1d-v28.1d}, [x21] -03e8ff0d| ld4r {v3.2s-v6.2s}, [x0],#16 -e7e3f24d| ld4r {v7.16b-v10.16b}, [sp], x18 -451a4e2c| ldnp s5, s6, [x18,#112] -01236f6c| ldnp d1, d8, [x24,#-272] -204041ac| ldnp q0, q16, [x1,#32] -1b21cc2c| ldp s27, s8, [x8],#96 -41ccc06c| ldp d1, d19, [x2],#8 -65b8e6ac| ldp q5, q14, [x3],#-816 -a58bed2d| ldp s5, s2, [x29,#-148]! -d8a3c46d| ldp d24, d8, [x30,#72]! -dc82c0ad| ldp q28, q0, [x22,#16]! -eda7782d| ldp s13, s9, [sp,#-60] -041b6c6d| ldp d4, d6, [x24,#-320] -17ea6bad| ldp q23, q26, [x16,#-656] -4e14433c| ldr b14, [x2],#49 -cd844e7c| ldr h13, [x6],#232 -99945dbc| ldr s25, [x4],#-39 -170556fc| ldr d23, [x8],#-160 -3115d53c| ldr q17, [x9],#-175 -3c6d403c| ldr b28, [x9,#6]! -f8fc527c| ldr h24, [x7,#-209]! -776c58bc| ldr s23, [x3,#-122]! -075f57fc| ldr d7, [x24,#-139]! -28cdc33c| ldr q8, [x9,#60]! -40a15f3d| ldr b0, [x10,#2024] -3b8c597d| ldr h27, [x1,#3270] -28f958bd| ldr s8, [x9,#6392] -852d6ffd| ldr d5, [x12,#24152] -e149ea3d| ldr q1, [x15,#43296] -807f7c1c| ldr s0, .+0xf8ff0 -e7a61c5c| ldr d7, .+0x394dc -261ec59c| ldr q6, .+0xfffffffffff8a3c4 -4bca773c| ldr b11, [x18,w23,sxtw] -8d69623c| ldr b13, [x12,x2] -cef8797c| ldr h14, [x6,x25,sxtx #1] -b7497bfc| ldr d23, [x13,w27,uxtw] -dbdbfc3c| ldr q27, [x30,w28,sxtw #4] -1a60553c| ldur b26, [x0,#-170] -74f3477c| ldur h20, [x27,#127] -f46249bc| ldur s20, [x23,#150] -b8015bfc| ldur d24, [x13,#-80] -3372de3c| ldur q19, [x17,#-25] -04972c0e| mla v4.8b, v24.8b, v12.8b -f0051b5e| mov b16, v15.b[13] -7f76146e| mov v31.s[2], v19.s[3] -6c1cb60e| orr v12.8b, v3.8b, v22.8b -ae3f1e0e| umov w14, v29.h[7] -f8e5004f| movi v24.16b, #0xf -0355010f| orr v3.2s, #0x28, lsl #16 -4825020f| movi v8.2s, #0x4a, lsl #8 -64d7040f| movi v4.2s, #0x9b, msl #16 -46e6062f| movi d6, #0xffff00ff0000ff00 -bde6056f| movi v29.2d, #0xff00ffff00ff00ff -789f350e| mul v24.8b, v27.8b, v21.8b -7b5b202e| mvn v27.8b, v27.8b -2dd4066f| mvni v13.4s, #0xc1, msl #16 -8266012f| mvni v2.2s, #0x34, lsl #24 -1025022f| mvni v16.2s, #0x48, lsl #8 -eabba06e| neg v10.4s, v31.4s -7e5a206e| mvn v30.16b, v19.16b -6a1fea0e| orn v10.8b, v27.8b, v10.8b -b406010f| movi v20.2s, #0x35 -f564040f| movi v21.2s, #0x87, lsl #24 -b21cb80e| orr v18.8b, v5.8b, v24.8b -2b437a2e| raddhn v11.4h, v25.4s, v26.4s -6d402c6e| raddhn2 v13.16b, v3.8h, v12.8h -655a606e| rbit v5.16b, v19.16b -5108202e| rev32 v17.8b, v2.8b -750a200e| rev64 v21.8b, v19.8b -f88f0b0f| rshrn v24.8b, v31.8h, #5 -8263236e| rsubhn2 v2.16b, v28.8h, v3.8h -787c320e| saba v24.8b, v3.8b, v18.8b -f551220e| sabal v21.8h, v15.8b, v2.8b -b5766d0e| sabd v21.4h, v21.4h, v13.4h -9270240e| sabdl v18.8h, v4.8b, v4.8b -4d71384e| sabdl2 v13.8h, v10.16b, v24.16b -8f6a600e| sadalp v15.2s, v20.4h -e501750e| saddl v5.4s, v15.4h, v21.4h -5202ab4e| saddl2 v18.2d, v18.4s, v11.4s -7029200e| saddlp v16.4h, v11.8b -3913710e| saddw v25.4s, v25.4s, v17.4h -d7e4575f| scvtf d23, d6, #41 -c6db215e| scvtf s6, s30 -17d8214e| scvtf v23.4s, v0.4s -62c4021e| scvtf s2, w3, #15 -f5cd421e| scvtf d21, w15, #13 -6128029e| scvtf s1, x3, #54 -9a7c429e| scvtf d26, x4, #33 -6102221e| scvtf s1, w19 -0b03621e| scvtf d11, w24 -ed01229e| scvtf s13, x15 -6f02629e| scvtf d15, x19 -ac03055e| sha1c q12, s29, v5.4s -e309285e| sha1h s3, s15 -2a221b5e| sha1m q10, s17, v27.4s -a013185e| sha1p q0, s29, v24.4s -6032005e| sha1su0 v0.4s, v19.4s, v0.4s -f918285e| sha1su1 v25.4s, v7.4s -fb50035e| sha256h2 q27, q7, v3.4s -6d421c5e| sha256h q13, q19, v28.4s -c12b285e| sha256su0 v1.4s, v30.4s -6362095e| sha256su1 v3.4s, v19.4s, v9.4s -a805bb0e| shadd v8.2s, v13.2s, v27.2s -783b616e| shll2 v24.4s, v27.8h, #16 -48841b0f| shrn v8.4h, v2.4s, #5 -a924bc4e| shsub v9.4s, v5.4s, v28.4s -1557717f| sli d21, d24, #49 -2a56456f| sli v10.2d, v17.2d, #5 -7c663b0e| smax v28.8b, v19.8b, v27.8b -b5a7694e| smaxp v21.8h, v29.8h, v9.8h -8ea8b04e| smaxv s14, v4.4s -936cb44e| smin v19.4s, v4.4s, v20.4s -15af7e4e| sminp v21.8h, v24.8h, v30.8h -3e81694e| smlal2 v30.4s, v9.8h, v9.8h -29a26d0e| smlsl v9.4s, v17.4h, v13.4h -442e0b4e| smov x4, v18.b[5] -e1a0540f| smull v1.4s, v7.4h, v4.h[1] -5eaa604f| smull2 v30.4s, v18.8h, v0.h[6] -4cc32d4e| smull2 v12.8h, v26.16b, v13.16b -1e7a205e| sqabs b30, b16 -e67ae04e| sqabs v6.2d, v23.2d -a80ded5e| sqadd d8, d13, d13 -e60dae4e| sqadd v6.4s, v15.4s, v14.4s -fe33570f| sqdmlal v30.4s, v31.4h, v7.h[1] -ee90b64e| sqdmlal2 v14.2d, v7.4s, v22.4s -ce79a05f| sqdmlsl d14, s14, v0.s[3] -d5b2a14e| sqdmlsl2 v21.2d, v22.4s, v1.4s -51cb575f| sqdmulh h17, h26, v7.h[5] -0cb5b54e| sqdmulh v12.4s, v8.4s, v21.4s -95d0760e| sqdmull v21.4s, v4.4h, v22.4h -a1d37c4e| sqdmull2 v1.4s, v29.8h, v28.8h -d679e07e| sqneg d22, d14 -3f78602e| sqneg v31.4h, v1.4h -80b4717e| sqrdmulh h0, h4, h17 -4cb76e2e| sqrdmulh v12.4h, v26.4h, v14.4h -aa5ce95e| sqrshl d10, d5, d9 -d25fb74e| sqrshl v18.4s, v30.4s, v23.4s -998c0c6f| sqrshrun2 v25.16b, v4.8h, #4 -4375605f| sqshl d3, d10, #32 -de743f0f| sqshl v30.2s, v6.2s, #31 -a84d675e| sqshl h8, h13, h7 -674dbe4e| sqshl v7.4s, v11.4s, v30.4s -5165587f| sqshlu d17, d10, #24 -b464042f| mvni v20.2s, #0x85, lsl #24 -2086207f| sqshrun s0, d17, #32 -8a851a2f| sqshrun v10.4h, v12.4s, #6 -652c255e| sqsub b5, b3, b5 -632eb30e| sqsub v3.2s, v19.2s, v19.2s -104ba15e| sqxtn s16, d24 -2249214e| sqxtn2 v2.16b, v9.8h -1c14360e| srhadd v28.8b, v0.8b, v22.8b -8044076f| mvni v0.4s, #0xe4, lsl #16 -3a57ed5e| srshl d26, d25, d13 -2c56ef4e| srshl v12.2d, v17.2d, v15.2d -9627140f| srshr v22.4h, v28.4h, #12 -bd37565f| srsra d29, d29, #42 -db34594f| srsra v27.2d, v6.2d, #39 -4546a10e| sshl v5.2s, v18.2s, v1.2s -aca7020f| movi v12.4h, #0x5d, lsl #8 -e004675f| sshr d0, d7, #25 -e5057f4f| sshr v5.2d, v15.2d, #1 -1b15595f| ssra d27, d8, #39 -ba15250f| ssra v26.2s, v13.2s, #27 -3620330e| ssubl v22.8h, v1.8b, v19.8b -c1316d4e| ssubw2 v1.4s, v14.4s, v13.8h -8a76000c| st1 {v10.4h}, [x20] -10a5004c| st1 {v16.8h, v17.8h}, [x8] -ab6b004c| st1 {v11.4s-v13.4s}, [x29] -8d2b004c| st1 {v13.4s-v16.4s}, [x28] -8d7d9f0c| st1 {v13.1d}, [x12],#8 -eb73840c| st1 {v11.8b}, [sp], x4 -48a69f4c| st1 {v8.8h, v9.8h}, [x18],#32 -dca19b4c| st1 {v28.16b, v29.16b}, [x14], x27 -7c699f4c| st1 {v28.4s-v30.4s}, [x11],#48 -da6d870c| st1 {v26.1d-v28.1d}, [x14], x7 -7f279f0c| st1 {v31.4h, v0.4h, v1.4h, v2.4h}, [x27],#32 -4421810c| st1 {v4.8b-v7.8b}, [x10], x1 -a615004d| st1 {v6.b}[13], [x13] -ce92000d| st1 {v14.s}[1], [x22] -c985000d| st1 {v9.d}[0], [x14] -380f9f0d| st1 {v24.b}[3], [x25],#1 -de0b944d| st1 {v30.b}[10], [x30], x20 -3141880d| st1 {v17.h}[0], [x9], x8 -8e939f0d| st1 {v14.s}[1], [x28],#4 -c890870d| st1 {v8.s}[1], [x6], x7 -9f869f4d| st1 {v31.d}[1], [x20],#8 -38879b4d| st1 {v24.d}[1], [x25], x27 -4181004c| st2 {v1.16b, v2.16b}, [x10] -d6819f0c| st2 {v22.8b, v23.8b}, [x14],#16 -bf808a0c| st2 {v31.8b, v0.8b}, [x5], x10 -bd0e204d| st2 {v29.b, v30.b}[11], [x21] -4551204d| st2 {v5.h, v6.h}[6], [x10] -9982204d| st2 {v25.s, v26.s}[2], [x20] -ea86200d| st2 {v10.d, v11.d}[0], [x23] -7b02bf0d| st2 {v27.b, v28.b}[0], [x19],#2 -c000a04d| st2 {v0.b, v1.b}[8], [x6], x0 -fb59a40d| st2 {v27.h, v28.h}[3], [x15], x4 -f880bf0d| st2 {v24.s, v25.s}[0], [x7],#8 -f582ac4d| st2 {v21.s, v22.s}[2], [x23], x12 -9c86bf4d| st2 {v28.d, v29.d}[1], [x20],#16 -3386b14d| st2 {v19.d, v20.d}[1], [x17], x17 -c0469f0c| st3 {v0.4h-v2.4h}, [x22],#24 -2243820c| st3 {v2.8b-v4.8b}, [x25], x2 -c629000d| st3 {v6.b-v8.b}[2], [x14] -4f6a004d| st3 {v15.h-v17.h}[5], [x18] -72a0004d| st3 {v18.s-v20.s}[2], [x3] -c1a4000d| st3 {v1.d-v3.d}[0], [x6] -312e9f0d| st3 {v17.b-v19.b}[3], [x17],#3 -9a28934d| st3 {v26.b-v28.b}[10], [x4], x19 -a1799f4d| st3 {v1.h-v3.h}[7], [x13],#6 -3ba29f0d| st3 {v27.s-v29.s}[0], [x17],#12 -80b2870d| st3 {v0.s-v2.s}[1], [x20], x7 -f6a49f4d| st3 {v22.d-v24.d}[1], [x7],#24 -8fa69a4d| st3 {v15.d-v17.d}[1], [x20], x26 -ee09000c| st4 {v14.2s-v17.2s}, [x15] -1e07880c| st4 {v30.4h, v31.4h, v0.4h, v1.4h}, [x24], x8 -6426204d| st4 {v4.b-v7.b}[9], [x19] -4ea2204d| st4 {v14.s-v17.s}[2], [x18] -05a6200d| st4 {v5.d-v8.d}[0], [x16] -5b21bf0d| st4 {v27.b-v30.b}[0], [x10],#4 -ce28a00d| st4 {v14.b-v17.b}[2], [x6], x0 -767bbf4d| st4 {v22.h-v25.h}[7], [x27],#8 -747aa24d| st4 {v20.h-v23.h}[7], [x19], x2 -24b0bf0d| st4 {v4.s-v7.s}[1], [x1],#16 -c7b1a90d| st4 {v7.s-v10.s}[1], [x14], x9 -9fa4bf4d| st4 {v31.d, v0.d, v1.d, v2.d}[1], [x4],#32 -70a4ab4d| st4 {v16.d-v19.d}[1], [x3], x11 -89fe2e2c| stnp s9, s31, [x20,#-140] -bfd31d6c| stnp d31, d20, [x29,#472] -ddf301ac| stnp q29, q28, [x30,#48] -14f6ac2c| stp s20, s29, [x16],#-156 -251db76c| stp d5, d7, [x9],#-144 -e51fb7ac| stp q5, q7, [sp],#-288 -5c90852d| stp s28, s4, [x2,#44]! -4c51a56d| stp d12, d20, [x10,#-432]! -265d8aad| stp q6, q23, [x9,#320]! -9c0c392d| stp s28, s3, [x4,#-56] -b49e1e6d| stp d20, d7, [x21,#488] -55f105ad| stp q21, q28, [x10,#176] -4dd6003c| str b13, [x18],#13 -e357067c| str h3, [sp],#101 -f6841dbc| str s22, [x7],#-40 -54b710fc| str d20, [x26],#-245 -0d07833c| str q13, [x24],#48 -393f003c| str b25, [x25,#3]! -1fac007c| str h31, [x0,#10]! -d41d13bc| str s20, [x14,#-207]! -908f0dfc| str d16, [x28,#216]! -5ded9d3c| str q29, [x10,#-34]! -6d72073d| str b13, [x19,#476] -68752d7d| str h8, [x11,#5818] -084728bd| str s8, [x24,#10308] -409503fd| str d0, [x10,#1832] -58a1963d| str q24, [x10,#23168] -51c8253c| str b17, [x2,w5,sxtw] -967b313c| str b22, [x28,x17,lsl #0] -b4683e7c| str h20, [x5,x30] -64d9a33c| str q4, [x11,w3,sxtw #4] -e5e1143c| stur b5, [x15,#-178] -99901e7c| stur h25, [x4,#-23] -bb0012bc| stur s27, [x5,#-224] -1d710cfc| stur d29, [x8,#199] -17e1873c| stur q23, [x8,#126] -ed84a26e| sub v13.4s, v7.4s, v2.4s -7761b80e| subhn v23.2s, v11.2d, v24.2d -f838205e| suqadd b24, b7 -7739600e| suqadd v23.4h, v11.4h -26a5204f| sxtl2 v6.2d, v9.4s -5a201a4e| tbl v26.16b, {v2.16b, v3.16b}, v26.16b -c2400f0e| tbl v2.8b, {v6.16b-v8.16b}, v15.8b -7263024e| tbl v18.16b, {v27.16b-v30.16b}, v2.16b -bb010b4e| tbl v27.16b, {v13.16b}, v11.16b -5f31184e| tbx v31.16b, {v10.16b, v11.16b}, v24.16b -a952100e| tbx v9.8b, {v21.16b-v23.16b}, v16.8b -4872170e| tbx v8.8b, {v18.16b-v21.16b}, v23.8b -dc110e4e| tbx v28.16b, {v14.16b}, v14.16b -d7289a4e| trn1 v23.4s, v6.4s, v26.4s -cd6a924e| trn2 v13.4s, v22.4s, v18.4s -a552392e| uabal v5.8h, v21.8b, v25.8b -a653256e| uabal2 v6.8h, v29.16b, v5.16b -fb70b42e| uabdl v27.2d, v7.2s, v20.2s -3b6a202e| uadalp v27.4h, v17.8b -8a03b22e| uaddl v10.2d, v28.2s, v18.2s -262a206e| uaddlp v6.8h, v17.16b -8410312e| uaddw v4.8h, v4.8h, v17.8b -bf11ae6e| uaddw2 v31.2d, v13.2d, v14.4s -a7e65d7f| ucvtf d7, d21, #35 -8bda617e| ucvtf d11, d20 -7fb8431e| ucvtf d31, w3, #18 -1c0f039e| ucvtf s28, x24, #61 -2241439e| ucvtf d2, x9, #48 -d701231e| ucvtf s23, w14 -9600631e| ucvtf d22, w4 -8b01239e| ucvtf s11, x12 -7202639e| ucvtf d18, x19 -3406b82e| uhadd v20.2s, v17.2s, v24.2s -9264612e| umax v18.4h, v4.4h, v1.4h -d9a5772e| umaxp v25.4h, v14.4h, v23.4h -74a8b06e| umaxv s20, v3.4s -24a8312e| uminv b4, v1.8b -c5218e2f| umlal v5.2d, v14.2s, v14.s[0] -3d20a76f| umlal2 v29.2d, v1.4s, v7.s[1] -90817e6e| umlal2 v16.4s, v12.8h, v30.8h -0f69a46f| umlsl2 v15.2d, v8.4s, v4.s[3] -4aa27c2e| umlsl v10.4s, v18.4h, v28.4h -48a27b6e| umlsl2 v8.4s, v18.8h, v27.8h -833c0d0e| umov w3, v4.b[6] -e2a1b22f| umull v2.2d, v15.2s, v18.s[1] -07c06f2e| umull v7.4s, v0.4h, v15.4h -470e367e| uqadd b7, b18, b22 -490e252e| uqadd v9.8b, v18.8b, v5.8b -bf5eaa7e| uqrshl s31, s21, s10 -c49c347f| uqrshrn s4, d6, #12 -b4757a7f| uqshl d20, d13, #58 -d14f777e| uqshl h17, h30, h23 -9e2d7a7e| uqsub h30, h12, h26 -a62c296e| uqsub v6.16b, v5.16b, v9.16b -5d4ba17e| uqxtn s29, d26 -454b212e| uqxtn v5.8b, v26.8h -1c48a16e| uqxtn2 v28.4s, v0.2d -4157736e| urshl v1.8h, v26.8h, v19.8h -2d26797f| urshr d13, d17, #7 -bd27466f| urshr v29.2d, v29.2d, #58 -bcc8a12e| ursqrte v28.2s, v5.2s -f5345d7f| ursra d21, d7, #35 -f8353a6f| ursra v24.4s, v15.4s, #6 -85a6342f| ushll v5.2d, v20.2s, #20 -e7a70e6f| ushll2 v7.8h, v31.16b, #6 -ed04787f| ushr d13, d7, #8 -8f07362f| ushr v15.2s, v28.2s, #10 -963a607e| usqadd h22, h20 -383a206e| usqadd v24.16b, v17.16b -ef16596f| usra v15.2d, v23.2d, #39 -f222ab2e| usubl v18.2d, v23.2s, v11.2s -9220696e| usubl2 v18.4s, v4.8h, v9.8h -0130312e| usubw v1.8h, v0.8h, v17.8b -a932a06e| usubw2 v9.2d, v21.2d, v0.4s -9a19910e| uzp1 v26.2s, v12.2s, v17.2s -a379ca4e| zip2 v3.2d, v13.2d, v10.2d -1202011a| adc w18, w16, w1 -6900199a| adc x9, x3, x25 -01010f3a| adcs w1, w8, w15 -13010fba| adcs x19, x8, x15 -55ed280b| add w21, w10, w8, sxtx #3 -2077268b| add x0, x25, x6, uxtx #5 -7f40560b| add wzr, w3, w22, lsr #16 -3a16282b| adds w26, w17, w8, uxtb #5 -f8a336ab| adds x24, sp, w22, sxth -000e6d31| adds w0, w16, #0xb43, lsl #12 -b48e49b1| adds x20, x21, #0x263, lsl #12 -7e174e2b| adds w30, w27, w14, lsr #5 -25e2f250| adr x5, .+0xfffffffffffe5c46 -294079f0| adrp x9, .+0xf2807000 -3aa13f12| and w26, w9, #0x3fe03fe -32a23592| and x18, x17, #0xf80ff80ff80ff80f -b478070a| and w20, w5, w7, lsl #30 -dd1f988a| and x29, x30, x24, asr #7 -a7351b72| ands w7, w13, #0x7ffe0 -1c056ef2| ands x28, x8, #0xc0000 -defd52ea| ands x30, x14, x18, lsr #63 -8c28d01a| asr w12, w4, w16 -582ac09a| asr x24, x18, x0 -647d1813| asr w4, w11, #24 -d1fe5b93| asr x17, x22, #27 -2329c31a| asr w3, w9, w3 -d929d69a| asr x25, x14, x22 -aefa5354| b.al .+0xa7f54 -76ad3917| b .+0xfffffffffce6b5d8 -de320f33| bfi w30, w22, #17, #13 -af144db3| bfi x15, x5, #51, #6 -161c7eb3| bfi x22, x0, #2, #8 -f9791733| bfxil w25, w15, #23, #8 -781577b3| bfi x24, x11, #9, #6 -0f65f98a| bic x15, x8, x25, ror #25 -2c37e16a| bics w12, w25, w1, ror #13 -a6f473ea| bics x6, x5, x19, lsr #61 -f064ad96| bl .+0xfffffffffab593c0 -80023fd6| blr x20 -00001fd6| br x0 -80de3ed4| brk #0xf6f4 -08276a35| cbnz w8, .+0xd44e0 -acd1c0b5| cbnz x12, .+0xfffffffffff81a34 -ef50bf34| cbz w15, .+0xfffffffffff7ea1c -4bd681b4| cbz x11, .+0xfffffffffff03ac8 -4e2a483a| ccmn w18, #0x8, #0xe, cs -4a3a4eba| ccmn x18, #0xe, #0xa, cc -0143553a| ccmn w24, w21, #0x1, mi -c09359ba| ccmn x30, x25, #0x0, ls -020a567a| ccmp w16, #0x16, #0x2, eq -a6985afa| ccmp x5, #0x1a, #0x6, ls -6fc0487a| ccmp w3, w8, #0xf, gt -21d14bfa| ccmp x9, x11, #0x1, le -75f5991a| csinc w21, w11, w25, al -5a25919a| csinc x26, x10, x17, cs -6a938c5a| csinv w10, w27, w12, ls -6a408eda| csinv x10, x3, x14, mi -5f3603d5| clrex #0x6 -a017c05a| cls w0, w29 -2616c0da| cls x6, x17 -9411c05a| clz w20, w12 -c611c0da| clz x6, x14 -9fc3322b| cmn w28, w18, sxtw -3f9638ab| cmn x17, w24, sxtb #5 -3f681db1| cmn x1, #0x75a -bfd15bab| cmn x13, x27, lsr #52 -ff723b6b| cmp w23, w27, uxtx #4 -1f5234eb| cmp x16, w20, uxtw #4 -9fb22a71| cmp w20, #0xaac -df2478f1| cmp x6, #0xe09, lsl #12 -bf07026b| cmp w29, w2, lsl #1 -bfc514eb| cmp x13, x20, lsl #49 -d494975a| csneg w20, w6, w23, ls -763591da| csneg x22, x11, x17, cc -b440c91a| crc32b w20, w5, w9 -5745cd1a| crc32h w23, w10, w13 -684ad01a| crc32w w8, w19, w16 -884fd59a| crc32x w8, w28, x21 -ea50c61a| crc32cb w10, w7, w6 -1357cf1a| crc32ch w19, w24, w15 -9859c21a| crc32cw w24, w12, w2 -6e5fde9a| crc32cx w14, w27, x30 -9340941a| csel w19, w4, w20, mi -dd42839a| csel x29, x22, x3, mi -fe779f1a| cset w30, vs -f1279f9a| cset x17, cc -eb839f5a| csetm w11, ls -e3139fda| csetm x3, eq -a986841a| csinc w9, w21, w4, hi -19b78b9a| csinc x25, x24, x11, lt -4643835a| csinv w6, w26, w3, mi -5ee38cda| csinv x30, x26, x12, al -d166945a| csneg w17, w22, w20, vs -55f793da| csneg x21, x26, x19, al -0158add4| dcps1 #0x6ac0 -82ceb2d4| dcps2 #0x9674 -a31eb3d4| dcps3 #0x98f5 -bf3203d5| dmb oshst -e003bfd6| drps -9f3403d5| dsb #0x04 -2e2faeca| eon x14, x25, x14, asr #11 -de6b0152| eor w30, w30, #0x83ffffff -4a7714d2| eor x10, x26, #0xfffff3fffffff3ff -2cea0dca| eor x12, x17, x13, lsl #58 -e0039fd6| eret -834cce93| extr x3, x4, x14, #19 -5f2003d5| wfe -bf2e03d5| hint #0x75 -e0f055d4| hlt #0xaf87 -df3403d5| isb #0x4 -22fcdf88| ldar w2, [x1] -78fedfc8| ldar x24, [x19] -cffcdf08| ldarb w15, [x6] -34fedf48| ldarh w20, [x17] -17bb7f88| ldaxp w23, w14, [x24] -6ffe7fc8| ldaxp x15, xzr, [x19] -acfe5f88| ldaxr w12, [x21] -cafe5fc8| ldaxr x10, [x22] -ddfd5f08| ldaxrb w29, [x14] -0efd5f48| ldaxrh w14, [x8] -66445128| ldnp w6, w17, [x3,#136] -3fa77fa8| ldnp xzr, x9, [x25,#-8] -1e04eb28| ldp w30, w1, [x0],#-168 -0da6c0a8| ldp x13, x9, [x16],#8 -7d00d429| ldp w29, w0, [x3,#160]! -d26ae1a9| ldp x18, x26, [x22,#-496]! -d0ca6829| ldp w16, w18, [x22,#-188] -a5e34fa9| ldp x5, x24, [x29,#248] -3e44d168| ldpsw x30, x17, [x1],#136 -5f08e169| ldpsw xzr, x2, [x2,#-248]! -430d6769| ldpsw x3, x3, [x10,#-200] -2c555bb8| ldr w12, [x9],#-75 -83c557f8| ldr x3, [x12],#-132 -f36e47b8| ldr w19, [x23,#118]! -6b1f48f8| ldr x11, [x27,#129]! -f5d64ab9| ldr w21, [x23,#2772] -872d7cf9| ldr x7, [x12,#30808] -f23e8c18| ldr w18, .+0xfffffffffff187dc -a7e72a58| ldr x7, .+0x55cf4 -82a75438| ldrb w2, [x28],#-182 -a7fd5738| ldrb w7, [x13,#-129]! -c83d4239| ldrb w8, [x14,#143] -58c96438| ldrb w24, [x10,w4,sxtw] -8e687e38| ldrb w14, [x4,x30] -70575378| ldrh w16, [x27],#-203 -015f5078| ldrh w1, [x24,#-251]! -7add5c79| ldrh w26, [x11,#3694] -2fcb7778| ldrh w15, [x25,w23,sxtw] -c474c338| ldrsb w4, [x6],#55 -28869638| ldrsb x8, [x17],#-152 -fe3fd438| ldrsb w30, [sp,#-189]! -da0f9938| ldrsb x26, [x30,#-112]! -5b3ac739| ldrsb w27, [x18,#462] -2c579e39| ldrsb x12, [x25,#1941] -54faf838| ldrsb w20, [x18,x24,sxtx #0] -fb68f238| ldrsb w27, [x7,x18] -f26aad38| ldrsb x18, [x23,x13] -17e4c978| ldrsh w23, [x0],#158 -a2759f78| ldrsh x2, [x13],#-9 -9c6ec478| ldrsh w28, [x20,#70]! -fd6f8278| ldrsh x29, [sp,#38]! -a82bc279| ldrsh w8, [x29,#276] -9d89b979| ldrsh x29, [x12,#7364] -962685b8| ldrsw x22, [x20],#82 -76ae8bb8| ldrsw x22, [x19,#186]! -fc2193b9| ldrsw x28, [x15,#4896] -7561fa98| ldrsw x21, .+0xffffffffffff4c2c -e34842b8| ldtr w3, [x7,#36] -4ff84df8| ldtr x15, [x2,#223] -d9e84f38| ldtrb w25, [x6,#254] -397b5378| ldtrh w25, [x25,#-201] -c4c9d138| ldtrsb w4, [x14,#-228] -02789638| ldtrsb x2, [x0,#-153] -a988cb78| ldtrsh w9, [x5,#184] -03888978| ldtrsh x3, [x0,#152] -ccb99fb8| ldtrsw x12, [x14,#-5] -efb154b8| ldur w15, [x15,#-181] -fc2051f8| ldur x28, [x7,#-238] -86d04438| ldurb w6, [x4,#77] -73405d78| ldurh w19, [x3,#-44] -7a81d538| ldursb w26, [x11,#-168] -b0b28038| ldursb x16, [x21,#11] -b4a1d278| ldursh w20, [x13,#-214] -3ed18078| ldursh x30, [x9,#13] -09628eb8| ldursw x9, [x16,#230] -c07e7f88| ldxp w0, wzr, [x22] -3e167fc8| ldxp x30, x5, [x17] -727c5f88| ldxr w18, [x3] -487c5fc8| ldxr x8, [x2] -867d5f08| ldxrb w6, [x12] -747f5f48| ldxrh w20, [x27] -d920d71a| lsl w25, w6, w23 -b920c59a| lsl x25, x5, x5 -4da947d3| ubfx x13, x10, #7, #36 -be23ca1a| lsl w30, w29, w10 -cc20d19a| lsl x12, x6, x17 -ae26c31a| lsr w14, w21, w3 -fc27cb9a| lsr x28, xzr, x11 -2b7e1053| lsr w11, w17, #16 -cefe75d3| lsr x14, x22, #53 -3b25d01a| lsr w27, w9, w16 -e826d79a| lsr x8, x23, x23 -5504031b| madd w21, w2, w3, w1 -9e5c109b| madd x30, x4, x16, x23 -00fe1f1b| mneg w0, w16, wzr -6efe179b| mneg x14, x19, x23 -31020011| add w17, w17, #0x0 -21000091| add x1, x1, #0x0 -39f1bf12| mov w25, #0x76ffff -53b3e992| mov x19, #0xb265ffffffffffff -c0fd9552| mov w0, #0xafee -f16b97d2| mov x17, #0xbb5f -e8972232| mov w8, #0xc00fc00f -e27323b2| mov x2, #0xe3ffffffe3ffffff -e9030e2a| mov w9, w14 -fb0310aa| mov x27, x16 -d0e48472| movk w16, #0x2726 -432dbcf2| movk x3, #0xe16a, lsl #16 -4b679612| mov w11, #0xffff4cc5 -9121e492| mov x17, #0xdef3ffffffffffff -00be90d2| mov x0, #0x85f0 -91d730d5| mrs x17, s2_0_c13_c7_4 -cf301fd5| msr s3_7_c3_c0_6, x15 -daea181b| msub w26, w22, w24, w26 -e1a7109b| msub x1, xzr, x16, x9 -477f0d1b| mul w7, w26, w13 -a17d1c9b| mul x1, x13, x28 -fc9b79aa| mvn x28, x25, lsr #38 -f71b904b| neg w23, w16, asr #6 -e3df4acb| neg x3, x10, lsr #55 -f0334e6b| negs w16, w14, lsr #12 -e6031f5a| ngc w6, wzr -f40302da| ngc x20, x2 -ee03137a| ngcs w14, w19 -ee0303fa| ngcs x14, x3 -1f2003d5| nop -ab14e92a| orn w11, w5, w9, ror #5 -185c3faa| orn x24, x0, xzr, lsl #23 -a8850c32| orr w8, w13, #0x300030 -cad023b2| orr x10, x6, #0xe3e3e3e3e3e3e3e3 -5487ccaa| orr x20, x26, x12, ror #33 -293783f9| prfm plil1strm, [x25,#1640] -501010d8| prfm pstl1keep, .+0x20208 -bc7389f8| prfum #0x1c, [x29,#151] -9203c05a| rbit w18, w28 -0501c0da| rbit x5, x8 -40005fd6| ret x2 -940ac05a| rev w20, w20 -ca0fc0da| rev x10, x30 -7807c05a| rev16 w24, w27 -fb06c0da| rev16 x27, x23 -dc0ac0da| rev32 x28, x22 -970dc0da| rev x23, x12 -42408813| extr w2, w2, w8, #16 -5a96db93| extr x26, x18, x27, #37 -782cc41a| ror w24, w3, w4 -8c2ec69a| ror x12, x20, x6 -372ec61a| ror w23, w17, w6 -b72ddc9a| ror x23, x13, x28 -e501185a| sbc w5, w15, w24 -ac0011da| sbc x12, x5, x17 -7a03067a| sbcs w26, w27, w6 -310008fa| sbcs x17, x1, x8 -65837f93| sbfiz x5, x27, #1, #33 -5c1b4793| sbfiz x28, x26, #57, #7 -a71f5b93| sbfiz x7, x29, #37, #8 -640ede1a| sdiv w4, w19, w30 -2a0dd99a| sdiv x10, x9, x25 -9f2003d5| sev -bf2003d5| sevl -045c389b| smaddl x4, w0, w24, x23 -6efe3e9b| smnegl x14, w19, w30 -ebac239b| smsubl x11, w7, w3, x11 -947f459b| smulh x20, x28, x5 -d67e3e9b| smull x22, w22, w30 -6dff9f88| stlr w13, [x27] -1ffd9fc8| stlr xzr, [x8] -a8fe9f08| stlrb w8, [x21] -abfd9f48| stlrh w11, [x13] -2ec02888| stlxp w8, w14, w16, [x1] -11993ec8| stlxp w30, x17, x6, [x8] -bbfe0f88| stlxr w15, w27, [x21] -e9fc09c8| stlxr w9, x9, [x7] -c6fe0708| stlxrb w7, w6, [x22] -c6fe0c48| stlxrh w12, w6, [x22] -b3283028| stnp w19, w10, [x5,#-128] -252e26a8| stnp x5, x11, [x17,#-416] -9fb18c28| stp wzr, w12, [x12],#100 -9ce5aba8| stp x28, x25, [x12],#-328 -e5d08229| stp w5, w20, [x7,#20]! -d6e79ea9| stp x22, x25, [x30,#488]! -9eef2029| stp w30, w27, [x28,#-252] -57b314a9| stp x23, x12, [x26,#328] -eda503b8| str w13, [x15],#58 -62241df8| str x2, [x3],#-46 -d2bd18b8| str w18, [x14,#-117]! -542d12f8| str x20, [x10,#-222]! -e92c3bb9| str w9, [x7,#15148] -de4804f9| str x30, [x6,#2192] -cce40b38| strb w12, [x6],#190 -eafd1238| strb w10, [x15,#-209]! -7fcb0639| strb wzr, [x27,#434] -03f82738| strb w3, [x0,x7,sxtx #0] -5c6a3e38| strb w28, [x18,x30] -a8551978| strh w8, [x13],#-107 -9e6c0c78| strh w30, [x4,#198]! -c83d0e79| strh w8, [x14,#1822] -502a1db8| sttr w16, [x18,#-46] -ae180af8| sttr x14, [x5,#161] -ea1a0138| sttrb w10, [x23,#17] -416b0278| sttrh w1, [x26,#38] -659107b8| stur w5, [x11,#121] -6b611ff8| stur x11, [x11,#-10] -99a01c38| sturb w25, [x4,#-54] -99421e78| sturh w25, [x20,#-28] -3e2a2688| stxp w6, w30, w10, [x17] -2f6a2cc8| stxp w12, x15, x26, [x17] -7d7f1b88| stxr w27, w29, [x27] -6e7e1bc8| stxr w27, x14, [x19] -ec7c0208| stxrb w2, w12, [x7] -ee7f0648| stxrh w6, w14, [sp] -2f8d204b| sub w15, w9, w0, sxtb #3 -1fbe3acb| sub sp, x16, w26, sxth #7 -5af778d1| sub x26, x26, #0xe3d, lsl #12 -6729034b| sub w7, w11, w3, lsl #10 -ae683f6b| subs w14, w5, wzr, uxtx #2 -2f993deb| subs x15, x9, w29, sxtb #6 -db0d5f71| subs w27, w14, #0x7c3, lsl #12 -3aec1ff1| subs x26, x1, #0x7fb -1f24016b| cmp w0, w1, lsl #9 -a1ae1bd4| svc #0xdd75 -a61e0013| sxtb w6, w21 -441c4093| sxtb x4, w2 -0c3c0013| sxth w12, w0 -b33f4093| sxth x19, w29 -407f4093| sxtw x0, w26 -455929d5| sysl x5, #1, C5, C9, #2 -d1005b37| tbnz w17, #11, .+0x6018 -798eaeb6| tbz x25, #53, .+0xffffffffffffd1cc -bf8c1f72| tst w5, #0x1e001e -ff10836a| tst w7, w3, asr #4 -dfc5daea| tst x14, x26, ror #49 -aa6e43d3| ubfx x10, x21, #3, #25 -46181a53| ubfiz w6, w2, #6, #7 -43294bd3| lsl x3, x10, #53 -77787dd3| ubfiz x23, x3, #3, #31 -1a0bd61a| udiv w26, w24, w22 -9308c19a| udiv x19, x4, x1 -755aa19b| umaddl x21, w19, w1, x22 -1ffdbe9b| umnegl xzr, w8, w30 -cbaaba9b| umsubl x11, w22, w26, x10 -0c7fdb9b| umulh x12, x24, x27 -cc7da79b| umull x12, w14, w7 -3d1c0053| uxtb w29, w1 -0e3f0053| uxth w14, w24 -5f2003d5| wfe -7f2003d5| wfi -3f2003d5| yield -71b9604e| abs v17.8h, v11.8h -5186f65e| add d17, d18, d22 -4986f34e| add v9.2d, v18.2d, v19.2d -1243720e| addhn v18.4h, v24.4s, v18.4s -0640354e| addhn2 v6.16b, v0.8h, v21.8h -d9bdfa4e| addp v25.2d, v14.2d, v26.2d -4c59284e| aesd v12.16b, v10.16b -8c48284e| aese v12.16b, v4.16b -f47a284e| aesimc v20.16b, v23.16b -c56b284e| aesmc v5.16b, v30.16b -bf1c3b0e| and v31.8b, v5.8b, v27.8b -6444026f| mvni v4.4s, #0x43, lsl #16 -1357032f| bic v19.2s, #0x78, lsl #16 -561d6a0e| bic v22.8b, v10.8b, v10.8b -cd1ff06e| bif v13.16b, v30.16b, v16.16b -f31ebd6e| bit v19.16b, v23.16b, v29.16b -6f1d6c2e| bsl v15.8b, v11.8b, v12.8b -1e48600e| cls v30.4h, v0.4h -6948202e| clz v9.8b, v3.8b -968efd7e| cmeq d22, d20, d29 -e58f6d6e| cmeq v5.8h, v31.8h, v13.8h -8f98600e| cmeq v15.4h, v4.4h, #0 -4f3db84e| cmge v15.4s, v10.4s, v24.4s -2788a02e| cmge v7.2s, v1.2s, #0 -bf35714e| cmgt v31.8h, v13.8h, v17.8h -4a89604e| cmgt v10.8h, v10.8h, #0 -9635252e| cmhi v22.8b, v12.8b, v5.8b -d83eff6e| cmhs v24.2d, v22.2d, v31.2d -cb99206e| cmle v11.16b, v14.16b, #0 -29a9604e| cmlt v9.8h, v9.8h, #0 -d18eea5e| cmtst d17, d22, d10 -d18ea94e| cmtst v17.4s, v22.4s, v9.4s -4a04075e| mov b10, v2.b[3] -0504040e| dup v5.2s, v0.s[0] -b20e1f4e| dup v18.16b, w21 -2a1f3e6e| eor v10.16b, v25.16b, v30.16b -0bd5aa7e| fabd s11, s8, s10 -12d7b96e| fabd v18.4s, v24.4s, v25.4s -a1f9a04e| fabs v1.4s, v13.4s -1ac3201e| fabs s26, s24 -d8c3601e| fabs d24, d30 -95ee267e| facge s21, s20, s6 -2bee262e| facge v11.2s, v17.2s, v6.2s -1aedec7e| facgt d26, d8, d12 -74effa6e| facgt v20.2d, v27.2d, v26.2d -7ed4260e| fadd v30.2s, v3.2s, v6.2s -4528251e| fadd s5, s2, s5 -262b661e| fadd d6, d25, d6 -84d8707e| faddp d4, v4.2d -71d4276e| faddp v17.4s, v3.4s, v7.4s -a5f43f1e| fccmp s5, s31, #0x5, al -20e5601e| fccmp d9, d0, #0x0, al -52d4331e| fccmpe s2, s19, #0x2, le -1e66761e| fccmpe d16, d22, #0xe, vs -d7e6695e| fcmeq d23, d22, d9 -e7d9a05e| fcmeq s7, s15, #0 -dadaa04e| fcmeq v26.4s, v22.4s, #0 -28e5737e| fcmge d8, d9, d19 -a2e73a6e| fcmge v2.4s, v29.4s, v26.4s -4fcba07e| fcmge s15, s26, #0 -43c8a02e| fcmge v3.2s, v2.2s, #0 -ffe5a67e| fcmgt s31, s15, s6 -7ee7bd2e| fcmgt v30.2s, v27.2s, v29.2s -5bc8e05e| fcmgt d27, d2, #0 -3dc9a04e| fcmgt v29.4s, v9.4s, #0 -38daa07e| fcmle s24, s17, #0 -8fdaa02e| fcmle v15.2s, v20.2s, #0 -93e8e05e| fcmlt d19, d4, #0 -9fe9a04e| fcmlt v31.4s, v12.4s, #0 -a023201e| fcmp s29, s0 -c822231e| fcmp s22, #0 -a022651e| fcmp d21, d5 -a8227d1e| fcmp d21, #0 -70203e1e| fcmpe s3, s30 -38232b1e| fcmpe s25, #0 -70206c1e| fcmpe d3, d12 -b823731e| fcmpe d29, #0 -3e6f331e| fcsel s30, s25, s19, vs -a64f6d1e| fcsel d6, d29, d13, mi -0d41e21e| fcvt s13, h8 -cbc0e21e| fcvt d11, h6 -18c0231e| fcvt h24, s0 -a7c0221e| fcvt d7, s5 -e7c3631e| fcvt h7, d31 -9f43621e| fcvt s31, d28 -a0c8215e| fcvtas s0, s5 -4dc8210e| fcvtas v13.2s, v2.2s -0300241e| fcvtas w3, s0 -fd03249e| fcvtas x29, s31 -ef01641e| fcvtas w15, d15 -4c01649e| fcvtas x12, d10 -9ac8617e| fcvtau d26, d4 -b802251e| fcvtau w24, s21 -2a03259e| fcvtau x10, s25 -ea00651e| fcvtau w10, d7 -0102659e| fcvtau x1, d16 -0d7a610e| fcvtl v13.2d, v16.2s -ed79214e| fcvtl2 v13.4s, v15.8h -43bb615e| fcvtms d3, d26 -c000301e| fcvtms w0, s6 -9202309e| fcvtms x18, s20 -0800701e| fcvtms w8, d0 -6603709e| fcvtms x6, d27 -f0b9217e| fcvtmu s16, s15 -3bba212e| fcvtmu v27.2s, v17.2s -5900311e| fcvtmu w25, s2 -9a03319e| fcvtmu x26, s28 -fa01711e| fcvtmu w26, d15 -6f01719e| fcvtmu x15, d11 -1968210e| fcvtn v25.4h, v0.4s -3d69214e| fcvtn2 v29.8h, v9.4s -87aa615e| fcvtns d7, d20 -e301201e| fcvtns w3, s15 -6002209e| fcvtns x0, s19 -1600601e| fcvtns w22, d0 -8503609e| fcvtns x5, d28 -f5ab617e| fcvtnu d21, d31 -2b02211e| fcvtnu w11, s17 -f902219e| fcvtnu x25, s23 -0702611e| fcvtnu w7, d16 -9d03619e| fcvtnu x29, d28 -dcaba15e| fcvtps s28, s30 -b4a8a10e| fcvtps v20.2s, v5.2s -5302281e| fcvtps w19, s18 -e003289e| fcvtps x0, s31 -9501681e| fcvtps w21, d12 -6703689e| fcvtps x7, d27 -68a8a17e| fcvtpu s8, s3 -dcaba12e| fcvtpu v28.2s, v30.2s -9d03291e| fcvtpu w29, s28 -5f01299e| fcvtpu xzr, s10 -e101691e| fcvtpu w1, d15 -3f00699e| fcvtpu xzr, d1 -ee6b612e| fcvtxn v14.2s, v31.2d -b1fd215f| fcvtzs s17, s13, #31 -bafd2c0f| fcvtzs v26.2s, v13.2s, #20 -47b8e15e| fcvtzs d7, d2 -dcbbe14e| fcvtzs v28.2d, v30.2d -56f8181e| fcvtzs w22, s2, #2 -9265189e| fcvtzs x18, s12, #39 -d3ad581e| fcvtzs w19, d14, #21 -3d9b589e| fcvtzs x29, d25, #26 -1a00381e| fcvtzs w26, s0 -d302389e| fcvtzs x19, s22 -5303781e| fcvtzs w19, d26 -8f01789e| fcvtzs x15, d12 -57fe537f| fcvtzu d23, d18, #45 -beff796f| fcvtzu v30.2d, v29.2d, #7 -08b9e17e| fcvtzu d8, d8 -cdbbe16e| fcvtzu v13.2d, v30.2d -2126199e| fcvtzu x1, s17, #55 -70a9591e| fcvtzu w16, d11, #22 -8c25599e| fcvtzu x12, d12, #55 -1201391e| fcvtzu w18, s8 -0800399e| fcvtzu x8, s0 -da00791e| fcvtzu w26, d6 -2903799e| fcvtzu x9, d25 -56fd3f2e| fdiv v22.2s, v10.2s, v31.2s -1f182e1e| fdiv s31, s0, s14 -ce1b741e| fdiv d14, d30, d20 -0d61021f| fmadd s13, s8, s2, s24 -03205e1f| fmadd d3, d0, d30, d8 -72f6654e| fmax v18.2d, v19.2d, v5.2d -1849281e| fmax s24, s8, s8 -8e4a6e1e| fmax d14, d20, d14 -54c7304e| fmaxnm v20.4s, v26.4s, v16.4s -91683a1e| fmaxnm s17, s4, s26 -f56a721e| fmaxnm d21, d23, d18 -c8cb307e| fmaxnmp s8, v30.2s -06c9306e| fmaxnmv s6, v8.4s -b6fb707e| fmaxp d22, v29.2d -1759341e| fmin s23, s8, s20 -675b721e| fmin d7, d27, d18 -69792d1e| fminnm s9, s11, s13 -ab786b1e| fminnm d11, d5, d11 -0fcab07e| fminnmp s15, v16.2s -d2c6b26e| fminnmp v18.4s, v22.4s, v18.4s -22fab07e| fminp s2, v17.2s -f5f5f56e| fminp v21.2d, v15.2d, v21.2d -bc13c95f| fmla d28, d29, v9.d[0] -5d51a85f| fmls s29, s10, v8.s[1] -d3ccb94e| fmls v19.4s, v6.4s, v25.4s -5bf4014f| fmov v27.4s, #9.000000000000000000e+00 -5bf5026f| fmov v27.2d, #2.031250000000000000e-01 -6541201e| fmov s5, s11 -b742601e| fmov d23, d21 -6002271e| fmov s0, w19 -5301261e| fmov w19, s10 -c103679e| fmov d1, x30 -3301af9e| fmov v19.d[1], x9 -bd00669e| fmov x29, d5 -ee02ae9e| fmov x14, v23.d[1] -0ff0251e| fmov s15, #1.550000000000000000e+01 -16506a1e| fmov d22, #2.812500000000000000e-01 -d1c20e1f| fmsub s17, s22, s14, s16 -fdae491f| fmsub d29, d23, d9, d11 -a4989d4f| fmul v4.4s, v5.4s, v29.s[2] -efde706e| fmul v15.2d, v23.2d, v16.2d -190a291e| fmul s25, s16, s9 -430a671e| fmul d3, d18, d7 -21919e7f| fmulx s1, s9, v30.s[0] -5298c76f| fmulx v18.2d, v2.2d, v7.d[1] -1ddf3c5e| fmulx s29, s24, s28 -a2fba06e| fneg v2.4s, v29.4s -7a40211e| fneg s26, s3 -f843611e| fneg d24, d31 -326b381f| fnmadd s18, s25, s24, s26 -4b636a1f| fnmadd d11, d26, d10, d24 -48fa201f| fnmsub s8, s18, s0, s30 -04d87f1f| fnmsub d4, d0, d31, d22 -0289371e| fnmul s2, s8, s23 -0e8a691e| fnmul d14, d16, d9 -05dba15e| frecpe s5, s24 -42d9a14e| frecpe v2.4s, v10.4s -2eff655e| frecps d14, d25, d5 -03fe774e| frecps v3.2d, v16.2d, v23.2d -b4fba15e| frecpx s20, s29 -9d41261e| frinta s29, s12 -ea42661e| frinta d10, d23 -e399a16e| frinti v3.4s, v15.4s -6ec3271e| frinti s14, s27 -ecc1671e| frinti d12, d15 -4543251e| frintm s5, s26 -f242651e| frintm d18, d23 -898a214e| frintn v9.4s, v20.4s -1641241e| frintn s22, s8 -5341641e| frintn d19, d10 -248be14e| frintp v4.2d, v25.2d -35c2241e| frintp s21, s17 -6fc3641e| frintp d15, d27 -0940271e| frintx s9, s0 -4643671e| frintx d6, d26 -749aa14e| frintz v20.4s, v19.4s -8bc0251e| frintz s11, s4 -7cc1651e| frintz d28, d11 -dedbe17e| frsqrte d30, d30 -04daa16e| frsqrte v4.4s, v16.4s -cdfce45e| frsqrts d13, d6, d4 -d9fda04e| frsqrts v25.4s, v14.4s, v0.4s -c5c1211e| fsqrt s5, s14 -67c1611e| fsqrt d7, d11 -a4d6b14e| fsub v4.4s, v21.4s, v17.4s -6138351e| fsub s1, s3, s21 -be3b6a1e| fsub d30, d29, d10 -4d2f016e| mov v13.b[0], v26.b[5] -741e174e| mov v20.b[11], w19 -e170404c| ld1 {v1.16b}, [x7] -7aa9404c| ld1 {v26.4s, v27.4s}, [x11] -4b6d400c| ld1 {v11.1d-v13.1d}, [x10] -582b400c| ld1 {v24.2s-v27.2s}, [x26] -8f7cdf4c| ld1 {v15.2d}, [x4],#16 -0a76ce4c| ld1 {v10.8h}, [x16], x14 -2aa6df0c| ld1 {v10.4h, v11.4h}, [x17],#16 -35a7d70c| ld1 {v21.4h, v22.4h}, [x25], x23 -ae6ddf4c| ld1 {v14.2d-v16.2d}, [x13],#48 -b362d74c| ld1 {v19.16b-v21.16b}, [x21], x23 -6d22df0c| ld1 {v13.8b-v16.8b}, [x19],#32 -6722c90c| ld1 {v7.8b-v10.8b}, [x19], x9 -c71f404d| ld1 {v7.b}[15], [x30] -f55a400d| ld1 {v21.h}[3], [x23] -f080400d| ld1 {v16.s}[0], [x7] -ed84404d| ld1 {v13.d}[1], [x7] -fd0bdf4d| ld1 {v29.b}[10], [sp],#1 -c811dc0d| ld1 {v8.b}[4], [x14], x28 -6548cb4d| ld1 {v5.h}[5], [x3], x11 -9882df4d| ld1 {v24.s}[2], [x20],#4 -f482c74d| ld1 {v20.s}[2], [x23], x7 -0d87df0d| ld1 {v13.d}[0], [x24],#8 -1b85db0d| ld1 {v27.d}[0], [x8], x27 -58c3404d| ld1r {v24.16b}, [x26] -c0c6df4d| ld1r {v0.8h}, [x22],#2 -a6cec90d| ld1r {v6.1d}, [x21], x9 -e68a400c| ld2 {v6.2s, v7.2s}, [x23] -4007604d| ld2 {v0.b, v1.b}[9], [x26] -8c49604d| ld2 {v12.h, v13.h}[5], [x12] -4f92600d| ld2 {v15.s, v16.s}[1], [x18] -b186600d| ld2 {v17.d, v18.d}[0], [x21] -631aff0d| ld2 {v3.b, v4.b}[6], [x19],#2 -330ceb4d| ld2 {v19.b, v20.b}[11], [x1], x11 -454bff4d| ld2 {v5.h, v6.h}[5], [x26],#4 -0792ff0d| ld2 {v7.s, v8.s}[1], [x16],#8 -3b91fd0d| ld2 {v27.s, v28.s}[1], [x9], x29 -b086ff4d| ld2 {v16.d, v17.d}[1], [x21],#16 -da86e30d| ld2 {v26.d, v27.d}[0], [x22], x3 -e7cf604d| ld2r {v7.2d, v8.2d}, [sp] -5ac8ff0d| ld2r {v26.2s, v27.2s}, [x2],#8 -13c1f10d| ld2r {v19.8b, v20.8b}, [x8], x17 -0947404c| ld3 {v9.8h-v11.8h}, [x24] -8043df0c| ld3 {v0.8b-v2.8b}, [x28],#24 -6344d50c| ld3 {v3.4h-v5.4h}, [x3], x21 -663d400d| ld3 {v6.b-v8.b}[7], [x11] -5b6b400d| ld3 {v27.h-v29.h}[1], [x26] -02a0404d| ld3 {v2.s-v4.s}[2], [x0] -e1a5404d| ld3 {v1.d-v3.d}[1], [x15] -b53edf0d| ld3 {v21.b-v23.b}[7], [x21],#3 -f625d10d| ld3 {v22.b-v24.b}[1], [x15], x17 -3d7bda4d| ld3 {v29.h-v31.h}[7], [x25], x26 -6ea0df0d| ld3 {v14.s-v16.s}[0], [x3],#12 -d9a0c60d| ld3 {v25.s-v27.s}[0], [x6], x6 -b6a7df0d| ld3 {v22.d-v24.d}[0], [x29],#24 -dfa6d94d| ld3 {v31.d, v0.d, v1.d}[1], [x22], x25 -7de9404d| ld3r {v29.4s-v31.4s}, [x11] -2fe6df4d| ld3r {v15.8h-v17.8h}, [x17],#6 -cae7c84d| ld3r {v10.8h-v12.8h}, [x30], x8 -9a0b400c| ld4 {v26.2s-v29.2s}, [x28] -4b03df0c| ld4 {v11.8b-v14.8b}, [x26],#32 -8e0bcc4c| ld4 {v14.4s-v17.4s}, [x28], x12 -182c604d| ld4 {v24.b-v27.b}[11], [x0] -feb2600d| ld4 {v30.s, v31.s, v0.s, v1.s}[1], [x23] -59a4604d| ld4 {v25.d-v28.d}[1], [x2] -9b25ff4d| ld4 {v27.b-v30.b}[9], [x12],#4 -1f35e84d| ld4 {v31.b, v0.b, v1.b, v2.b}[13], [x8], x8 -91b2ff4d| ld4 {v17.s-v20.s}[3], [x20],#16 -88b3ed4d| ld4 {v8.s-v11.s}[3], [x28], x13 -9aa5ff4d| ld4 {v26.d-v29.d}[1], [x12],#32 -efa5e10d| ld4 {v15.d-v18.d}[0], [x15], x1 -07ed604d| ld4r {v7.2d-v10.2d}, [x8] -0defff0d| ld4r {v13.1d-v16.1d}, [x24],#32 -43e1f14d| ld4r {v3.16b-v6.16b}, [x10], x17 -136e682c| ldnp s19, s27, [x16,#-192] -cc67676c| ldnp d12, d25, [x30,#-400] -e6dd4eac| ldnp q6, q23, [x15,#464] -b7e9c22c| ldp s23, s26, [x13],#20 -92c3fe6c| ldp d18, d16, [x28],#-24 -f281e6ac| ldp q18, q0, [x15],#-816 -4f06cd2d| ldp s15, s1, [x18,#104]! -0f6fdc6d| ldp d15, d27, [x24,#448]! -170ccbad| ldp q23, q3, [x0,#352]! -71ea7a2d| ldp s17, s26, [x19,#-44] -c8816c6d| ldp d8, d0, [x14,#-312] -da6540ad| ldp q26, q25, [x14] -92064c3c| ldr b18, [x20],#192 -94d4577c| ldr h20, [x4],#-131 -39055fbc| ldr s25, [x9],#-16 -989551fc| ldr d24, [x12],#-231 -4764c23c| ldr q7, [x2],#38 -c15e4e3c| ldr b1, [x22,#229]! -c8ce487c| ldr h8, [x22,#140]! -ca5d5bbc| ldr s10, [x14,#-75]! -34fd56fc| ldr d20, [x9,#-145]! -bd0dd53c| ldr q29, [x13,#-176]! -ab65443d| ldr b11, [x13,#281] -cb57537d| ldr h11, [x30,#2474] -f2606fbd| ldr s18, [x7,#12128] -088b67fd| ldr d8, [x24,#20240] -0173ce3d| ldr q1, [x24,#14784] -ba112c1c| ldr s26, .+0x58234 -e489c25c| ldr d4, .+0xfffffffffff8513c -42458d9c| ldr q2, .+0xfffffffffff1a8a8 -3cdb753c| ldr b28, [x25,w21,sxtw #0] -726b733c| ldr b18, [x27,x19] -395b627c| ldr h25, [x25,w2,uxtw #1] -9b486cbc| ldr s27, [x4,w12,uxtw] -1cda7efc| ldr d28, [x16,w30,sxtw #3] -365bf33c| ldr q22, [x25,w19,uxtw #4] -43a1413c| ldur b3, [x10,#26] -c7034f7c| ldur h7, [x30,#240] -ad8350bc| ldur s13, [x29,#-248] -07a350fc| ldur d7, [x24,#-246] -0212c63c| ldur q2, [x16,#97] -6f0a7a2f| mla v15.4h, v19.4h, v10.h[7] -fe95294e| mla v30.16b, v15.16b, v9.16b -f24a4f2f| mls v18.4h, v23.4h, v15.h[4] -26947e2e| mls v6.4h, v1.4h, v30.4h -6606115e| mov b6, v19.b[8] -0866116e| mov v8.b[8], v16.b[12] -6e1d0f4e| mov v14.b[7], w11 -6d1fa10e| orr v13.8b, v27.8b, v1.8b -b93f1a0e| umov w25, v29.h[6] -74e7020f| movi v20.8b, #0x5b -0ff4040f| fmov v15.2s, #-2.000000000000000000e+00 -4c47060f| movi v12.2s, #0xda, lsl #16 -aa06064f| movi v10.4s, #0xd5 -8de4042f| movi d13, #0xff00000000ff0000 -b1e6046f| movi v17.2d, #0xff0000ff00ff00ff -609f214e| mul v0.16b, v27.16b, v1.16b -9f5a206e| mvn v31.16b, v20.16b -da65032f| mvni v26.2s, #0x6e, lsl #24 -4d36036f| bic v13.4s, #0x72, lsl #8 -4d66052f| mvni v13.2s, #0xb2, lsl #24 -a4bbe06e| neg v4.2d, v29.2d -bf5a206e| mvn v31.16b, v21.16b -2b1fe24e| orn v11.16b, v25.16b, v2.16b -22e4024f| movi v2.16b, #0x41 -3086050f| movi v16.4h, #0xb1 -051db80e| orr v5.8b, v8.8b, v24.8b -48e2290e| pmull v8.8h, v18.8b, v9.8b -7341652e| raddhn v19.4h, v11.4s, v5.4s -1b417f6e| raddhn2 v27.8h, v8.4s, v31.4s -e158606e| rbit v1.16b, v7.16b -f418200e| rev16 v20.8b, v7.8b -228d2a0f| rshrn v2.2s, v9.2d, #22 -a861aa2e| rsubhn v8.2s, v13.2d, v10.2d -7160786e| rsubhn2 v17.8h, v3.4s, v24.4s -cc7f314e| saba v12.16b, v30.16b, v17.16b -1350644e| sabal2 v19.4s, v0.8h, v4.8h -a1757d4e| sabd v1.8h, v13.8h, v29.8h -0971a00e| sabdl v9.2d, v8.2s, v0.2s -af70214e| sabdl2 v15.8h, v5.16b, v1.16b -626ba04e| sadalp v2.2d, v27.4s -1503374e| saddl2 v21.8h, v24.16b, v23.16b -592b204e| saddlp v25.8h, v26.16b -d813600e| saddw v24.4s, v30.4s, v0.4h -31e5210f| scvtf v17.2s, v9.2s, #31 -aeda215e| scvtf s14, s21 -f0e9021e| scvtf s16, w15, #6 -42b4421e| scvtf d2, w2, #19 -8b10029e| scvtf s11, x4, #60 -59e6429e| scvtf d25, x18, #7 -cf01221e| scvtf s15, w14 -2d03621e| scvtf d13, w25 -af00229e| scvtf s15, x5 -bf00629e| scvtf d31, x5 -2a02025e| sha1c q10, s17, v2.4s -8b0b285e| sha1h s11, s28 -11201f5e| sha1m q17, s0, v31.4s -f110115e| sha1p q17, s7, v17.4s -b732115e| sha1su0 v23.4s, v21.4s, v17.4s -cf18285e| sha1su1 v15.4s, v6.4s -2e520f5e| sha256h2 q14, q17, v15.4s -77401a5e| sha256h q23, q3, v26.4s -b92a285e| sha256su0 v25.4s, v21.4s -7e63175e| sha256su1 v30.4s, v27.4s, v23.4s -d504ab0e| shadd v21.2s, v6.2s, v11.2s -5a54734f| shl v26.2d, v2.2d, #51 -0638212e| shll v6.8h, v0.8b, #8 -a238216e| shll2 v2.8h, v5.16b, #8 -f5863e0f| shrn v21.2s, v23.2d, #2 -f187234f| shrn2 v17.4s, v31.2d, #29 -e124b04e| shsub v1.4s, v7.4s, v16.4s -3657252f| sli v22.2s, v25.2s, #5 -c266aa4e| smax v2.4s, v22.4s, v10.4s -2c6ca74e| smin v12.4s, v1.4s, v7.4s -4aae390e| sminp v10.8b, v18.8b, v25.8b -1a82ba0e| smlal v26.2d, v16.2s, v26.2s -2381ad4e| smlal2 v3.2d, v9.4s, v13.4s -0da17a4e| smlsl2 v13.4s, v8.8h, v26.8h -4f2e0d4e| smov x15, v18.b[6] -e4a0980f| smull v4.2d, v7.2s, v24.s[0] -51c2220e| smull v17.8h, v18.8b, v2.8b -01c26d4e| smull2 v1.4s, v16.8h, v13.8h -f978205e| sqabs b25, b7 -760cef5e| sqadd d22, d3, d15 -390c224e| sqadd v25.16b, v1.16b, v2.16b -5439455f| sqdmlal s20, h10, v5.h[4] -8391765e| sqdmlal s3, h12, h22 -c9907a4e| sqdmlal2 v9.4s, v6.8h, v26.8h -0b73445f| sqdmlsl s11, h24, v4.h[0] -8e728d0f| sqdmlsl v14.2d, v20.2s, v13.s[0] -fe787d4f| sqdmlsl2 v30.4s, v7.8h, v13.h[7] -bdb2b55e| sqdmlsl d29, s21, s21 -d0c9be4f| sqdmulh v16.4s, v14.4s, v30.s[3] -89b77c5e| sqdmulh h9, h28, h28 -c9bb515f| sqdmull s9, h30, v1.h[5] -5379e07e| sqneg d19, d10 -4b7aa06e| sqneg v11.4s, v18.4s -1bd1750f| sqrdmulh v27.4h, v8.4h, v5.h[3] -f55e755e| sqrshl h21, h23, h21 -ba5fbd4e| sqrshl v26.4s, v29.4s, v29.4s -ba9d1e0f| sqrshrn v26.4h, v13.4s, #2 -3d9c284f| sqrshrn2 v29.4s, v1.2d, #24 -8a8f2c6f| sqrshrun2 v10.4s, v28.2d, #20 -eb760b5f| sqshl b11, b23, #3 -4a77220f| sqshl v10.2s, v26.2s, #2 -6c4cfb5e| sqshl d12, d3, d27 -ad4eba4e| sqshl v13.4s, v21.4s, v26.4s -9364257f| sqshlu s19, s4, #5 -b267392f| sqshlu v18.2s, v29.2s, #25 -c085042f| mvni v0.4h, #0x8e -7584326f| sqshrun2 v21.4s, v3.2d, #14 -3a2fe25e| sqsub d26, d25, d2 -2c2ca34e| sqsub v12.4s, v1.4s, v3.4s -484ba15e| sqxtn s8, d26 -824b210e| sqxtn v2.8b, v28.8h -5b48214e| sqxtn2 v27.16b, v2.8h -e228a16e| sqxtun2 v2.4s, v7.2d -1c44416f| sri v28.2d, v0.2d, #63 -1e56eb5e| srshl d30, d16, d11 -bb56fe4e| srshl v27.2d, v21.2d, v30.2d -c6262d0f| srshr v6.2s, v22.2s, #19 -0c366c5f| srsra d12, d16, #20 -13376e4f| srsra v19.2d, v24.2d, #18 -7ba5040f| movi v27.4h, #0x8b, lsl #8 -9c076f5f| sshr d28, d28, #17 -2804434f| sshr v8.2d, v1.2d, #61 -b717535f| ssra d23, d29, #45 -c2160f0f| ssra v2.8b, v22.8b, #1 -8a333a4e| ssubw2 v10.8h, v28.8h, v26.16b -3a70000c| st1 {v26.8b}, [x1] -1bab004c| st1 {v27.4s, v28.4s}, [x24] -8d69004c| st1 {v13.4s-v15.4s}, [x12] -9c26004c| st1 {v28.8h-v31.8h}, [x20] -c87a9f0c| st1 {v8.2s}, [x22],#8 -5a7f800c| st1 {v26.1d}, [x26], x0 -eea99f4c| st1 {v14.4s, v15.4s}, [x15],#32 -11af9d4c| st1 {v17.2d, v18.2d}, [x24], x29 -ec689f0c| st1 {v12.2s-v14.2s}, [x7],#24 -8662900c| st1 {v6.8b-v8.8b}, [x20], x16 -0b249f4c| st1 {v11.8h-v14.8h}, [x0],#64 -6b2d8b4c| st1 {v11.2d-v14.2d}, [x11], x11 -3212004d| st1 {v18.b}[12], [x17] -3392004d| st1 {v19.s}[3], [x17] -0284000d| st1 {v2.d}[0], [x0] -340f9f0d| st1 {v20.b}[3], [x25],#1 -0d069a4d| st1 {v13.b}[9], [x16], x26 -2e51950d| st1 {v14.h}[2], [x9], x21 -3f839f0d| st1 {v31.s}[0], [x25],#4 -1492844d| st1 {v20.s}[3], [x16], x4 -dd869f4d| st1 {v29.d}[1], [x22],#8 -2e869b4d| st1 {v14.d}[1], [x17], x27 -1e87000c| st2 {v30.4h, v31.4h}, [x24] -07829f0c| st2 {v7.8b, v8.8b}, [x16],#16 -d38a884c| st2 {v19.4s, v20.4s}, [x22], x8 -541c204d| st2 {v20.b, v21.b}[15], [x2] -9180200d| st2 {v17.s, v18.s}[0], [x4] -2585204d| st2 {v5.d, v6.d}[1], [x9] -2f06bf4d| st2 {v15.b, v16.b}[9], [x17],#2 -3b08b44d| st2 {v27.b, v28.b}[10], [x1], x20 -805bbf0d| st2 {v0.h, v1.h}[3], [x28],#4 -fb80bf0d| st2 {v27.s, v28.s}[0], [x7],#8 -6290a80d| st2 {v2.s, v3.s}[1], [x3], x8 -b587bf4d| st2 {v21.d, v22.d}[1], [x29],#16 -2c84b64d| st2 {v12.d, v13.d}[1], [x1], x22 -22469f0c| st3 {v2.4h-v4.4h}, [x17],#24 -0e30004d| st3 {v14.b-v16.b}[12], [x0] -62a1004d| st3 {v2.s-v4.s}[2], [x11] -54a4000d| st3 {v20.d-v22.d}[0], [x2] -84259f4d| st3 {v4.b-v6.b}[9], [x12],#3 -693c9d4d| st3 {v9.b-v11.b}[15], [x3], x29 -5b709f0d| st3 {v27.h-v29.h}[2], [x2],#6 -e47a960d| st3 {v4.h-v6.h}[3], [x23], x22 -a0a39f0d| st3 {v0.s-v2.s}[0], [x29],#12 -37b0890d| st3 {v23.s-v25.s}[1], [x1], x9 -9aa59f4d| st3 {v26.d-v28.d}[1], [x12],#24 -26a5924d| st3 {v6.d-v8.d}[1], [x9], x18 -3e05000c| st4 {v30.4h, v31.4h, v0.4h, v1.4h}, [x9] -a8039f0c| st4 {v8.8b-v11.8b}, [x29],#32 -4126204d| st4 {v1.b-v4.b}[9], [x18] -3b71204d| st4 {v27.h-v30.h}[6], [x9] -f2b3204d| st4 {v18.s-v21.s}[3], [sp] -7fa4200d| st4 {v31.d, v0.d, v1.d, v2.d}[0], [x3] -562ebf4d| st4 {v22.b-v25.b}[11], [x18],#4 -563cae0d| st4 {v22.b-v25.b}[7], [x2], x14 -1271bf4d| st4 {v18.h-v21.h}[6], [x8],#8 -e7a1bf0d| st4 {v7.s-v10.s}[0], [x15],#16 -f3b2a30d| st4 {v19.s-v22.s}[1], [x23], x3 -eca5bf4d| st4 {v12.d-v15.d}[1], [x15],#32 -4ca7bb0d| st4 {v12.d-v15.d}[0], [x26], x27 -4f5b182c| stnp s15, s22, [x26,#192] -e05e0b6c| stnp d0, d23, [x23,#176] -77be2eac| stnp q23, q15, [x19,#-560] -bb3fa72c| stp s27, s15, [x29],#-200 -ef18bb6c| stp d15, d6, [x7],#-80 -777d84ac| stp q23, q31, [x11],#128 -d0f9952d| stp s16, s30, [x14,#172]! -125ca26d| stp d18, d23, [x0,#-480]! -33bbbfad| stp q19, q14, [x25,#-16]! -6ebb322d| stp s14, s14, [x27,#-108] -cb92096d| stp d11, d4, [x22,#152] -f2871dad| stp q18, q1, [sp,#944] -f676003c| str b22, [x23],#7 -50f50d7c| str h16, [x10],#223 -0d251ebc| str s13, [x8],#-30 -1f3510fc| str d31, [x8],#-253 -05a4883c| str q5, [x0],#138 -800e063c| str b0, [x20,#96]! -668d157c| str h6, [x11,#-168]! -1f3d11bc| str s31, [x8,#-237]! -71bf06fc| str d17, [x27,#107]! -f50c843c| str q21, [x7,#64]! -f186013d| str b17, [x23,#97] -f0e5357d| str h16, [x15,#6898] -938d3bbd| str s19, [x12,#15244] -aeb813fd| str d14, [x5,#10096] -2cc4943d| str q12, [x1,#21264] -e2f8263c| str b2, [x7,x6,sxtx #0] -1d79373c| str b29, [x8,x23,lsl #0] -bc70003c| stur b28, [x5,#7] -7190157c| stur h17, [x3,#-167] -073309bc| stur s7, [x24,#147] -298100fc| stur d9, [x9,#8] -e8c1843c| stur q8, [x15,#76] -3384266e| sub v19.16b, v1.16b, v6.16b -9163750e| subhn v17.4h, v28.4s, v21.4s -f3627d4e| subhn2 v19.8h, v23.4s, v29.4s -1939205e| suqadd b25, b8 -0638604e| suqadd v6.8h, v0.8h -81a4284f| sshll2 v1.2d, v4.4s, #8 -f920030e| tbl v25.8b, {v7.16b, v8.16b}, v3.8b -71400e4e| tbl v17.16b, {v3.16b-v5.16b}, v14.16b -bc630d4e| tbl v28.16b, {v29.16b, v30.16b, v31.16b, v0.16b}, v13.16b -6803030e| tbl v8.8b, {v27.16b}, v3.8b -4b32124e| tbx v11.16b, {v18.16b, v19.16b}, v18.16b -8f50170e| tbx v15.8b, {v4.16b-v6.16b}, v23.8b -5673020e| tbx v22.8b, {v26.16b-v29.16b}, v2.8b -f2130f4e| tbx v18.16b, {v31.16b}, v15.16b -9e29c34e| trn1 v30.2d, v12.2d, v3.2d -9b6bcf4e| trn2 v27.2d, v28.2d, v15.2d -157cb02e| uaba v21.2s, v0.2s, v16.2s -28513c2e| uabal v8.8h, v9.8b, v28.8b -f950a26e| uabal2 v25.2d, v7.4s, v2.4s -a776b26e| uabd v7.4s, v21.4s, v18.4s -da726b2e| uabdl v26.4s, v22.4h, v11.4h -9473746e| uabdl2 v20.4s, v28.8h, v20.8h -aa6b602e| uadalp v10.2s, v29.4h -ac013d2e| uaddl v12.8h, v13.8b, v29.8b -e500a86e| uaddl2 v5.2d, v7.4s, v8.4s -9c28a02e| uaddlp v28.1d, v4.2s -4c3a302e| uaddlv h12, v18.8b -2810b62e| uaddw v8.2d, v1.2d, v22.2s -f2132d6e| uaddw2 v18.8h, v31.8h, v13.16b -b3e67f7f| ucvtf d19, d21, #1 -ece5676f| ucvtf v12.2d, v15.2d, #25 -d7d8217e| ucvtf s23, s6 -cdd9212e| ucvtf v13.2s, v14.2s -5788031e| ucvtf s23, w2, #30 -c7ac431e| ucvtf d7, w6, #21 -0777039e| ucvtf s7, x24, #35 -e4f4439e| ucvtf d4, x7, #3 -9100231e| ucvtf s17, w4 -e202631e| ucvtf d2, w23 -3903239e| ucvtf s25, x25 -2001639e| ucvtf d0, x9 -2a07b76e| uhadd v10.4s, v25.4s, v23.4s -dc25372e| uhsub v28.8b, v14.8b, v23.8b -de646f2e| umax v30.4h, v6.4h, v15.4h -4ba6766e| umaxp v11.8h, v18.8h, v22.8h -e26db42e| umin v2.2s, v15.2s, v20.2s -a7ae712e| uminp v7.4h, v21.4h, v17.4h -afaa716e| uminv h15, v21.8h -42298c2f| umlal v2.2d, v10.2s, v12.s[2] -0a826e2e| umlal v10.4s, v16.4h, v14.4h -2681a06e| umlal2 v6.2d, v9.4s, v0.4s -2860bd6f| umlsl2 v8.2d, v1.4s, v29.s[1] -19a26b6e| umlsl2 v25.4s, v16.8h, v11.8h -8a3d140e| mov w10, v12.s[2] -22a1ba6f| umull2 v2.2d, v9.4s, v26.s[1] -15c0712e| umull v21.4s, v0.4h, v17.4h -2ec0296e| umull2 v14.8h, v1.16b, v9.16b -6e0fba7e| uqadd s14, s27, s26 -db0fe06e| uqadd v27.2d, v30.2d, v0.2d -535e6c7e| uqrshl h19, h18, h12 -7c5cfe6e| uqrshl v28.2d, v3.2d, v30.2d -9a9e327f| uqrshrn s26, d20, #14 -339f0b2f| uqrshrn v19.8b, v25.8h, #5 -7e77337f| uqshl s30, s27, #19 -8b4d657e| uqshl h11, h12, h5 -414c622e| uqshl v1.4h, v2.4h, v2.4h -95942b2f| uqshrn v21.2s, v4.2d, #21 -d396246f| uqshrn2 v19.4s, v22.2d, #28 -b22ff27e| uqsub d18, d29, d18 -b32e756e| uqsub v19.8h, v21.8h, v21.8h -0e4b616e| uqxtn2 v14.8h, v24.4s -ca16236e| urhadd v10.16b, v22.16b, v3.16b -1f57a26e| urshl v31.4s, v24.4s, v2.4s -8324777f| urshr d3, d4, #9 -37caa16e| ursqrte v23.4s, v17.4s -b735517f| ursra d23, d13, #47 -0a47f67e| ushl d10, d24, d22 -e7a71c2f| ushll v7.4s, v31.4h, #12 -9c38607e| usqadd h28, h4 -dc39206e| usqadd v28.16b, v14.16b -dc145d7f| usra d28, d6, #35 -d720752e| usubl v23.4s, v6.4h, v21.4h -2c236f6e| usubl2 v12.4s, v25.8h, v15.8h -ed32222e| usubw v13.8h, v23.8h, v2.8b -72332d6e| usubw2 v18.8h, v27.8h, v13.16b -655a1c4e| uzp2 v5.16b, v19.16b, v28.16b -972a210e| xtn v23.8b, v20.8h -5f2aa14e| xtn2 v31.4s, v18.2d -9a38910e| zip1 v26.2s, v4.2s, v17.2s -d979990e| zip2 v25.2s, v14.2s, v25.2s -41e5a454| b.ne .+0xfffffffffff49ca8 -ea1b543a| ccmn wzr, #0x14, #0xa, ne -681946ba| ccmn x11, #0x6, #0x8, ne -2410463a| ccmn w1, w6, #0x4, ne -6e134cba| ccmn x27, x12, #0xe, ne -ad194f7a| ccmp w13, #0xf, #0xd, ne -471b53fa| ccmp x26, #0x13, #0x7, ne -a210467a| ccmp w5, w6, #0x2, ne -ee1246fa| ccmp x23, x6, #0xe, ne -be149b1a| csinc w30, w5, w27, ne -c415819a| csinc x4, x14, x1, ne -0510955a| csinv w5, w0, w21, ne -c51093da| csinv x5, x6, x19, ne -12158e5a| csneg w18, w8, w14, ne -5c159cda| csneg x28, x10, x28, ne -c810941a| csel w8, w6, w20, ne -80128c9a| csel x0, x20, x12, ne -f6179f1a| cset w22, eq -f5179f9a| cset x21, eq -ec139f5a| csetm w12, eq -ee139fda| csetm x14, eq -4b17981a| csinc w11, w26, w24, ne -b515909a| csinc x21, x13, x16, ne -b613955a| csinv w22, w29, w21, ne -f8108bda| csinv x24, x7, x11, ne -a0149d5a| csneg w0, w5, w29, ne -6a1492da| csneg x10, x3, x18, ne -8f143c1e| fccmp s4, s28, #0xf, ne -0f167f1e| fccmp d16, d31, #0xf, ne -5214291e| fccmpe s2, s9, #0x2, ne -1516631e| fccmpe d16, d3, #0x5, ne -2b1d271e| fcsel s11, s9, s7, ne -731e611e| fcsel d19, d19, d1, ne -c2560e54| b.cs .+0x1cad8 -2d2b563a| ccmn w25, #0x16, #0xd, cs -6c2b55ba| ccmn x27, #0x15, #0xc, cs -2521493a| ccmn w9, w9, #0x5, cs -032040ba| ccmn x0, x0, #0x3, cs -ea2a5c7a| ccmp w23, #0x1c, #0xa, cs -8e2842fa| ccmp x4, #0x2, #0xe, cs -8e22427a| ccmp w20, w2, #0xe, cs -cd204dfa| ccmp x6, x13, #0xd, cs -2824931a| csinc w8, w1, w19, cs -a3279a9a| csinc x3, x29, x26, cs -5921945a| csinv w25, w10, w20, cs -bd2386da| csinv x29, x29, x6, cs -a124915a| csneg w1, w5, w17, cs -5b2787da| csneg x27, x26, x7, cs -91209f1a| csel w17, w4, wzr, cs -f921979a| csel x25, x15, x23, cs -e4279f1a| cset w4, cc -ea279f9a| cset x10, cc -fe239f5a| csetm w30, cc -ec239fda| csetm x12, cc -ee25971a| csinc w14, w15, w23, cs -b726859a| csinc x23, x21, x5, cs -4b22845a| csinv w11, w18, w4, cs -2b209eda| csinv x11, x1, x30, cs -6b269b5a| csneg w11, w19, w27, cs -192691da| csneg x25, x16, x17, cs -0226391e| fccmp s16, s25, #0x2, cs -07246d1e| fccmp d0, d13, #0x7, cs -9626241e| fccmpe s20, s4, #0x6, cs -de27601e| fccmpe d30, d0, #0xe, cs -7d2d271e| fcsel s29, s11, s7, cs -3e2e7a1e| fcsel d30, d17, d26, cs -43a4df54| b.cc .+0xfffffffffffbf488 -0739533a| ccmn w8, #0x13, #0x7, cc -673b4fba| ccmn x27, #0xf, #0x7, cc -e333583a| ccmn wzr, w24, #0x3, cc -83325aba| ccmn x20, x26, #0x3, cc -eb38517a| ccmp w7, #0x11, #0xb, cc -2c3955fa| ccmp x9, #0x15, #0xc, cc -6f324b7a| ccmp w19, w11, #0xf, cc -09314ffa| ccmp x8, x15, #0x9, cc -60349c1a| csinc w0, w3, w28, cc -8835949a| csinc x8, x12, x20, cc -bb31935a| csinv w27, w13, w19, cc -9f319dda| csinv xzr, x12, x29, cc -8837855a| csneg w8, w28, w5, cc -cd3490da| csneg x13, x6, x16, cc -b033901a| csel w16, w29, w16, cc -5e31969a| csel x30, x10, x22, cc -ec379f1a| cset w12, cs -ea379f9a| cset x10, cs -eb339f5a| csetm w11, cs -fd339fda| csetm x29, cs -9934941a| csinc w25, w4, w20, cc -fa36829a| csinc x26, x23, x2, cc -2730895a| csinv w7, w1, w9, cc -703094da| csinv x16, x3, x20, cc -f636935a| csneg w22, w23, w19, cc -ba3484da| csneg x26, x5, x4, cc -e3343e1e| fccmp s7, s30, #0x3, cc -ce366a1e| fccmp d22, d10, #0xe, cc -de37271e| fccmpe s30, s7, #0xe, cc -1935751e| fccmpe d8, d21, #0x9, cc -603f241e| fcsel s0, s27, s4, cc -653f761e| fcsel d5, d27, d22, cc -a4fa5354| b.mi .+0xa7f54 -a248483a| ccmn w5, #0x8, #0x2, mi -e2484eba| ccmn x7, #0xe, #0x2, mi -2841553a| ccmn w9, w21, #0x8, mi -6e4259ba| ccmn x19, x25, #0xe, mi -2048567a| ccmp w1, #0x16, #0x0, mi -454a5afa| ccmp x18, #0x1a, #0x5, mi -0343487a| ccmp w24, w8, #0x3, mi -49434bfa| ccmp x26, x11, #0x9, mi -d747991a| csinc w23, w30, w25, mi -9544919a| csinc x21, x4, x17, mi -76428c5a| csinv w22, w19, w12, mi -06418eda| csinv x6, x8, x14, mi -4d46975a| csneg w13, w18, w23, mi -d74491da| csneg x23, x6, x17, mi -0941941a| csel w9, w8, w20, mi -2d41839a| csel x13, x9, x3, mi -ef479f1a| cset w15, pl -e5479f9a| cset x5, pl -f0439f5a| csetm w16, pl -e2439fda| csetm x2, pl -2a46841a| csinc w10, w17, w4, mi -f1468b9a| csinc x17, x23, x11, mi -3441835a| csinv w20, w9, w3, mi -b5438cda| csinv x21, x29, x12, mi -ad45945a| csneg w13, w13, w20, mi -f54793da| csneg x21, xzr, x19, mi -c5473f1e| fccmp s30, s31, #0x5, mi -8947601e| fccmp d28, d0, #0x9, mi -5247331e| fccmpe s26, s19, #0x2, mi -b045761e| fccmpe d13, d22, #0x0, mi -b34d331e| fcsel s19, s13, s19, mi -3a4d6d1e| fcsel d26, d9, d13, mi -a5497054| b.pl .+0xe0934 -eb5a493a| ccmn w23, #0x9, #0xb, pl -0a5941ba| ccmn x8, #0x1, #0xa, pl -0452523a| ccmn w16, w18, #0x4, pl -e55053ba| ccmn x7, x19, #0x5, pl -a45b407a| ccmp w29, #0x0, #0x4, pl -ca5b4efa| ccmp x30, #0xe, #0xa, pl -ab514e7a| ccmp w13, w14, #0xb, pl -ce5349fa| ccmp x30, x9, #0xe, pl -8555971a| csinc w5, w12, w23, pl -4b569e9a| csinc x11, x18, x30, pl -90538f5a| csinv w16, w28, w15, pl -c3508bda| csinv x3, x6, x11, pl -1f55955a| csneg wzr, w8, w21, pl -52568eda| csneg x18, x18, x14, pl -a750851a| csel w7, w5, w5, pl -b252899a| csel x18, x21, x9, pl -eb579f1a| cset w11, mi -e6579f9a| cset x6, mi -fd539f5a| csetm w29, mi -e1539fda| csetm x1, mi -33579e1a| csinc w19, w25, w30, pl -b5558c9a| csinc x21, x13, x12, pl -ec53885a| csinv w12, wzr, w8, pl -ec5196da| csinv x12, x15, x22, pl -ae57945a| csneg w14, w29, w20, pl -64578bda| csneg x4, x27, x11, pl -2657241e| fccmp s25, s4, #0x6, pl -2357761e| fccmp d25, d22, #0x3, pl -f255361e| fccmpe s15, s22, #0x2, pl -3756781e| fccmpe d17, d24, #0x7, pl -985c3f1e| fcsel s24, s4, s31, pl -5b5d621e| fcsel d27, d10, d2, pl -c6d26454| b.vs .+0xc9a58 -6c6a4f3a| ccmn w19, #0xf, #0xc, vs -2f694cba| ccmn x9, #0xc, #0xf, vs -e962583a| ccmn w23, w24, #0x9, vs -80615fba| ccmn x12, xzr, #0x0, vs -4b6b497a| ccmp w26, #0x9, #0xb, vs -cc6a48fa| ccmp x22, #0x8, #0xc, vs -4e61567a| ccmp w10, w22, #0xe, vs -476054fa| ccmp x2, x20, #0x7, vs -c965911a| csinc w9, w14, w17, vs -41668f9a| csinc x1, x18, x15, vs -db608f5a| csinv w27, w6, w15, vs -896097da| csinv x9, x4, x23, vs -1867915a| csneg w24, w24, w17, vs -49678eda| csneg x9, x26, x14, vs -3162881a| csel w17, w17, w8, vs -db608f9a| csel x27, x6, x15, vs -f9679f1a| cset w25, vc -f9679f9a| cset x25, vc -f7639f5a| csetm w23, vc -e1639fda| csetm x1, vc -f4678a1a| csinc w20, wzr, w10, vs -3e65879a| csinc x30, x9, x7, vs -6c63975a| csinv w12, w27, w23, vs -806191da| csinv x0, x12, x17, vs -7f679f5a| csneg wzr, w27, wzr, vs -3b6488da| csneg x27, x1, x8, vs -0565301e| fccmp s8, s16, #0x5, vs -e266621e| fccmp d23, d2, #0x2, vs -b7653a1e| fccmpe s13, s26, #0x7, vs -d866791e| fccmpe d22, d25, #0x8, vs -326d3d1e| fcsel s18, s9, s29, vs -f66e7b1e| fcsel d22, d23, d27, vs -e774fd54| b.vc .+0xffffffffffffae9c -0479483a| ccmn w8, #0x8, #0x4, vc -897b56ba| ccmn x28, #0x16, #0x9, vc -8b70513a| ccmn w4, w17, #0xb, vc -ca7150ba| ccmn x14, x16, #0xa, vc -46794f7a| ccmp w10, #0xf, #0x6, vc -057948fa| ccmp x8, #0x8, #0x5, vc -0373417a| ccmp w24, w1, #0x3, vc -ca705ffa| ccmp x6, xzr, #0xa, vc -d3769f1a| csinc w19, w22, wzr, vc -1076899a| csinc x16, x16, x9, vc -c8718e5a| cinv w8, w14, vs -06729eda| csinv x6, x16, x30, vc -6076895a| csneg w0, w19, w9, vc -b87589da| csneg x24, x13, x9, vc -3b72891a| csel w27, w17, w9, vc -fd70899a| csel x29, x7, x9, vc -e3779f1a| cset w3, vs -f4779f9a| cset x20, vs -fc739f5a| csetm w28, vs -ea739fda| csetm x10, vs -ab75891a| csinc w11, w13, w9, vc -6177859a| csinc x1, x27, x5, vc -3272945a| csinv w18, w17, w20, vc -7a729dda| csinv x26, x19, x29, vc -b5779e5a| csneg w21, w29, w30, vc -fe748eda| csneg x30, x7, x14, vc -ed76231e| fccmp s23, s3, #0xd, vc -cf74791e| fccmp d6, d25, #0xf, vc -b4763e1e| fccmpe s21, s30, #0x4, vc -59766e1e| fccmpe d18, d14, #0x9, vc -ce7c271e| fcsel s14, s6, s7, vc -be7c651e| fcsel d30, d5, d5, vc -88f29d54| b.hi .+0xfffffffffff3be50 -8f8b513a| ccmn w28, #0x11, #0xf, hi -6f8b5cba| ccmn x27, #0x1c, #0xf, hi -8780463a| ccmn w4, w6, #0x7, hi -4f8348ba| ccmn x26, x8, #0xf, hi -48884d7a| ccmp w2, #0xd, #0x8, hi -088957fa| ccmp x8, #0x17, #0x8, hi -0180517a| ccmp w0, w17, #0x1, hi -ce805efa| ccmp x6, x30, #0xe, hi -1d868e1a| csinc w29, w16, w14, hi -0785889a| cinc x7, x8, ls -4782935a| csinv w7, w18, w19, hi -118197da| csinv x17, x8, x23, hi -00868a5a| csneg w0, w16, w10, hi -128585da| csneg x18, x8, x5, hi -4c808f1a| csel w12, w2, w15, hi -7783909a| csel x23, x27, x16, hi -e5879f1a| cset w5, ls -f3879f9a| cset x19, ls -f9839f5a| csetm w25, ls -eb839fda| csetm x11, ls -b3869e1a| csinc w19, w21, w30, hi -f086909a| csinc x16, x23, x16, hi -34839c5a| csinv w20, w25, w28, hi -ea8294da| csinv x10, x23, x20, hi -8e84895a| csneg w14, w4, w9, hi -c48695da| csneg x4, x22, x21, hi -cc84361e| fccmp s6, s22, #0xc, hi -8086781e| fccmp d20, d24, #0x0, hi -7187341e| fccmpe s27, s20, #0x1, hi -30867e1e| fccmpe d17, d30, #0x0, hi -b98e361e| fcsel s25, s21, s22, hi -2c8c651e| fcsel d12, d1, d5, hi -69888c54| b.ls .+0xfffffffffff1910c -0e9b523a| ccmn w24, #0x12, #0xe, ls -679854ba| ccmn x3, #0x14, #0x7, ls -0492563a| ccmn w16, w22, #0x4, ls -42924dba| ccmn x18, x13, #0x2, ls -2198417a| ccmp w1, #0x1, #0x1, ls -c89a54fa| ccmp x22, #0x14, #0x8, ls -0f905e7a| ccmp w0, w30, #0xf, ls -c59342fa| ccmp x30, x2, #0x5, ls -0d958c1a| csinc w13, w8, w12, ls -7596879a| csinc x21, x19, x7, ls -1791905a| csinv w23, w8, w16, ls -5e9186da| csinv x30, x10, x6, ls -23969e5a| csneg w3, w17, w30, ls -619493da| csneg x1, x3, x19, ls -b5918e1a| csel w21, w13, w14, ls -b393819a| csel x19, x29, x1, ls -f9979f1a| cset w25, hi -ee979f9a| cset x14, hi -eb939f5a| csetm w11, hi -ea939fda| csetm x10, hi -f497871a| csinc w20, wzr, w7, ls -c4949d9a| csinc x4, x6, x29, ls -e892895a| csinv w8, w23, w9, ls -6c908eda| csinv x12, x3, x14, ls -26949f5a| csneg w6, w1, wzr, ls -329498da| csneg x18, x1, x24, ls -81952d1e| fccmp s12, s13, #0x1, ls -60967f1e| fccmp d19, d31, #0x0, ls -1794321e| fccmpe s0, s18, #0x7, ls -3f97641e| fccmpe d25, d4, #0xf, ls -089c2d1e| fcsel s8, s0, s13, ls -699f631e| fcsel d9, d27, d3, ls -8afbfe54| b.ge .+0xffffffffffffdf70 -44aa573a| ccmn w18, #0x17, #0x4, ge -00a84fba| ccmn x0, #0xf, #0x0, ge -c9a04d3a| ccmn w6, w13, #0x9, ge -88a041ba| ccmn x4, x1, #0x8, ge -caaa467a| ccmp w22, #0x6, #0xa, ge -85a85cfa| ccmp x4, #0x1c, #0x5, ge -47a35f7a| ccmp w26, wzr, #0x7, ge -0aa34dfa| ccmp x24, x13, #0xa, ge -dea7981a| csinc w30, w30, w24, ge -c6a5909a| csinc x6, x14, x16, ge -8aa1965a| csinv w10, w12, w22, ge -e3a392da| csinv x3, xzr, x18, ge -20a5845a| csneg w0, w9, w4, ge -fba694da| csneg x27, x23, x20, ge -faa1851a| csel w26, w15, w5, ge -25a3959a| csel x5, x25, x21, ge -e2a79f1a| cset w2, lt -fda79f9a| cset x29, lt -eea39f5a| csetm w14, lt -e2a39fda| csetm x2, lt -efa6951a| csinc w15, w23, w21, ge -4ca69e9a| csinc x12, x18, x30, ge -22a2885a| csinv w2, w17, w8, ge -53a089da| csinv x19, x2, x9, ge -f9a6875a| csneg w25, w23, w7, ge -c9a795da| csneg x9, x30, x21, ge -24a73e1e| fccmp s25, s30, #0x4, ge -6da5651e| fccmp d11, d5, #0xd, ge -bda52e1e| fccmpe s13, s14, #0xd, ge -f6a7651e| fccmpe d31, d5, #0x6, ge -e3ac251e| fcsel s3, s7, s5, ge -b3ae781e| fcsel d19, d21, d24, ge -ab621754| b.lt .+0x2ec54 -e1b84c3a| ccmn w7, #0xc, #0x1, lt -89ba4eba| ccmn x20, #0xe, #0x9, lt -88b14a3a| ccmn w12, w10, #0x8, lt -89b145ba| ccmn x12, x5, #0x9, lt -47b9547a| ccmp w10, #0x14, #0x7, lt -07b95bfa| ccmp x8, #0x1b, #0x7, lt -4ab2407a| ccmp w18, w0, #0xa, lt -8ab144fa| ccmp x12, x4, #0xa, lt -79b5821a| csinc w25, w11, w2, lt -8bb4919a| csinc x11, x4, x17, lt -c9b19f5a| csinv w9, w14, wzr, lt -10b28bda| csinv x16, x16, x11, lt -d8b4925a| csneg w24, w6, w18, lt -3ab69fda| csneg x26, x17, xzr, lt -2cb3841a| csel w12, w25, w4, lt -77b0969a| csel x23, x3, x22, lt -e2b79f1a| cset w2, ge -e9b79f9a| cset x9, ge -f4b39f5a| csetm w20, ge -f2b39fda| csetm x18, ge -87b59a1a| csinc w7, w12, w26, lt -70b69c9a| csinc x16, x19, x28, lt -17b08f5a| csinv w23, w0, w15, lt -cab288da| csinv x10, x22, x8, lt -bab7905a| csneg w26, w29, w16, lt -08b796da| csneg x8, x24, x22, lt -2eb73e1e| fccmp s25, s30, #0xe, lt -86b7671e| fccmp d28, d7, #0x6, lt -f0b6211e| fccmpe s23, s1, #0x0, lt -b2b76b1e| fccmpe d29, d11, #0x2, lt -e8bf241e| fcsel s8, s31, s4, lt -9ebd7d1e| fcsel d30, d12, d29, lt -cc87d354| b.gt .+0xfffffffffffa70f8 -43c8563a| ccmn w2, #0x16, #0x3, gt -c5c94dba| ccmn x14, #0xd, #0x5, gt -6fc0533a| ccmn w3, w19, #0xf, gt -06c351ba| ccmn x24, x17, #0x6, gt -c3c95c7a| ccmp w14, #0x1c, #0x3, gt -29cb52fa| ccmp x25, #0x12, #0x9, gt -8bc25a7a| ccmp w20, w26, #0xb, gt -45c14dfa| ccmp x10, x13, #0x5, gt -80c7841a| csinc w0, w28, w4, gt -40c4919a| csinc x0, x2, x17, gt -04c2805a| csinv w4, w16, w0, gt -55c086da| csinv x21, x2, x6, gt -32c7935a| csneg w18, w25, w19, gt -31c59fda| csneg x17, x9, xzr, gt -6cc2921a| csel w12, w19, w18, gt -37c08d9a| csel x23, x1, x13, gt -eec79f1a| cset w14, le -eec79f9a| cset x14, le -f4c39f5a| csetm w20, le -f6c39fda| csetm x22, le -31c5971a| csinc w17, w9, w23, gt -76c7899a| csinc x22, x27, x9, gt -bbc1805a| csinv w27, w13, w0, gt -e8c384da| csinv x8, xzr, x4, gt -83c5955a| csneg w3, w12, w21, gt -77c790da| csneg x23, x27, x16, gt -e9c5251e| fccmp s15, s5, #0x9, gt -a3c4671e| fccmp d5, d7, #0x3, gt -71c72e1e| fccmpe s27, s14, #0x1, gt -3dc4781e| fccmpe d1, d24, #0xd, gt -57cf3d1e| fcsel s23, s26, s29, gt -8fcc7e1e| fcsel d15, d4, d30, gt -8d1ec054| b.le .+0xfffffffffff803d0 -4bdb5b3a| ccmn w26, #0x1b, #0xb, le -47d94fba| ccmn x10, #0xf, #0x7, le -4dd1443a| ccmn w10, w4, #0xd, le -82d353ba| ccmn x28, x19, #0x2, le -e8d9527a| ccmp w15, #0x12, #0x8, le -00db45fa| ccmp x24, #0x5, #0x0, le -c5d1437a| ccmp w14, w3, #0x5, le -e4d041fa| ccmp x7, x1, #0x4, le -0bd6941a| csinc w11, w16, w20, le -57d6929a| cinc x23, x18, gt -3dd29a5a| csinv w29, w17, w26, le -ded085da| csinv x30, x6, x5, le -27d5985a| csneg w7, w9, w24, le -7fd59ada| csneg xzr, x11, x26, le -b7d0911a| csel w23, w5, w17, le -a4d3879a| csel x4, x29, x7, le -e6d79f1a| cset w6, gt -f1d79f9a| cset x17, gt -f3d39f5a| csetm w19, gt -f9d39fda| csetm x25, gt -42d78d1a| csinc w2, w26, w13, le -88d58a9a| csinc x8, x12, x10, le -ccd3805a| csinv w12, w30, w0, le -0fd085da| csinv x15, x0, x5, le -55d5975a| csneg w21, w10, w23, le -3fd699da| csneg xzr, x17, x25, le -60d4251e| fccmp s3, s5, #0x0, le -6dd6601e| fccmp d19, d0, #0xd, le -bdd5221e| fccmpe s13, s2, #0xd, le -f4d67d1e| fccmpe d23, d29, #0x4, le -0cdd381e| fcsel s12, s8, s24, le -70de7e1e| fcsel d16, d19, d30, le -8e585454| b.al .+0xa8b10 -41eb483a| ccmn w26, #0x8, #0x1, al -8aeb42ba| ccmn x28, #0x2, #0xa, al -c8e3473a| ccmn w30, w7, #0x8, al -ade059ba| ccmn x5, x25, #0xd, al -67eb5b7a| ccmp w27, #0x1b, #0x7, al -05e849fa| ccmp x0, #0x9, #0x5, al -42e3407a| ccmp w26, w0, #0x2, al -03e053fa| ccmp x0, x19, #0x3, al -9ce4931a| csinc w28, w4, w19, al -8ee69d9a| csinc x14, x20, x29, al -68e0835a| csinv w8, w3, w3, al -20e381da| csinv x0, x25, x1, al -e0e58d5a| csneg w0, w15, w13, al -9ae589da| csneg x26, x12, x9, al -6ee0941a| csel w14, w3, w20, al -77e38a9a| csel x23, x27, x10, al -efe79f1a| csinc w15, wzr, wzr, al -e5e79f9a| csinc x5, xzr, xzr, al -f2e39f5a| csinv w18, wzr, wzr, al -fae39fda| csinv x26, xzr, xzr, al -ede7861a| csinc w13, wzr, w6, al -0ce58a9a| csinc x12, x8, x10, al -75e2835a| csinv w21, w19, w3, al -38e391da| csinv x24, x25, x17, al -fee4845a| csneg w30, w7, w4, al -09e49bda| csneg x9, x0, x27, al -a8e6271e| fccmp s21, s7, #0x8, al -ede67d1e| fccmp d23, d29, #0xd, al -bbe53b1e| fccmpe s13, s27, #0xb, al -70e6661e| fccmpe d19, d6, #0x0, al -01ee3b1e| fcsel s1, s16, s27, al -15ec651e| fcsel d21, d0, d5, al -4f462554| b.al .+0x4a8c8 -eef9493a| ccmn w15, #0x9, #0xe, al -88fa53ba| ccmn x20, #0x13, #0x8, al -c0f25f3a| ccmn w22, wzr, #0x0, al -c6f05cba| ccmn x6, x28, #0x6, al -45f84c7a| ccmp w2, #0xc, #0x5, al -a3fa4afa| ccmp x21, #0xa, #0x3, al -caf3517a| ccmp w30, w17, #0xa, al -81f055fa| ccmp x4, x21, #0x1, al -cbf69e1a| csinc w11, w22, w30, al -01f48e9a| csinc x1, x0, x14, al -61f1845a| csinv w1, w11, w4, al -11f397da| csinv x17, x24, x23, al -7bf69f5a| csneg w27, w19, wzr, al -b1f686da| csneg x17, x21, x6, al -69f39e1a| csel w9, w27, w30, al -79f2859a| csel x25, x19, x5, al -e1f79f1a| csinc w1, wzr, wzr, al -e6f79f9a| csinc x6, xzr, xzr, al -fcf39f5a| csinv w28, wzr, wzr, al -fbf39fda| csinv x27, xzr, xzr, al -2ef4831a| csinc w14, w1, w3, al -55f6859a| csinc x21, x18, x5, al -4ff0905a| csinv w15, w2, w16, al -81f393da| csinv x1, x28, x19, al -8bf68d5a| csneg w11, w20, w13, al -c2f48fda| csneg x2, x6, x15, al -e9f6391e| fccmp s23, s25, #0x9, al -27f46f1e| fccmp d1, d15, #0x7, al -72f6301e| fccmpe s19, s16, #0x2, al -37f57a1e| fccmpe d9, d26, #0x7, al -fcfe3a1e| fcsel s28, s23, s26, al -80fd701e| fcsel d0, d12, d16, al -40946454| b.eq .+0xc9288 -8b09473a| ccmn w12, #0x7, #0xb, eq -c50a5eba| ccmn x22, #0x1e, #0x5, eq -05005a3a| ccmn w0, w26, #0x5, eq -cf024bba| ccmn x22, x11, #0xf, eq -8a084f7a| ccmp w4, #0xf, #0xa, eq -e20a41fa| ccmp x23, #0x1, #0x2, eq -8c015f7a| ccmp w12, wzr, #0xc, eq -e4015cfa| ccmp x15, x28, #0x4, eq -42078e1a| csinc w2, w26, w14, eq -2005879a| csinc x0, x9, x7, eq -f003955a| csinv w16, wzr, w21, eq -dc019dda| csinv x28, x14, x29, eq -4607885a| csneg w6, w26, w8, eq -26069eda| csneg x6, x17, x30, eq -72018a1a| csel w18, w11, w10, eq -8003849a| csel x0, x28, x4, eq -f1079f1a| cset w17, ne -fb079f9a| cset x27, ne -ef039f5a| csetm w15, ne -e1039fda| csetm x1, ne -5307881a| csinc w19, w26, w8, eq -8a06969a| csinc x10, x20, x22, eq -ab00955a| csinv w11, w5, w21, eq -c3039bda| csinv x3, x30, x27, eq -8005875a| csneg w0, w12, w7, eq -740694da| csneg x20, x19, x20, eq -e207281e| fccmp s31, s8, #0x2, eq -2b056a1e| fccmp d9, d10, #0xb, eq -7e063f1e| fccmpe s19, s31, #0xe, eq -3c05671e| fccmpe d9, d7, #0xc, eq -830f271e| fcsel s3, s28, s7, eq -4d0d621e| fcsel d13, d10, d2, eq -bf2003d5| sevl -9f2003d5| sev -7f2003d5| wfi -5f2003d5| wfe -3f2003d5| yield -1f2003d5| nop -df4d03d5| msr daifset, #0xd -ff4d03d5| msr daifclr, #0xd -28d91b14| b .+0x6f64a0 -da6cb530| adr x26, .+0xfffffffffff6ad99 -15e5e514| b .+0x3979454 -ff4603d5| msr daifclr, #0x6 -df4803d5| msr daifset, #0x8 -bf4100d5| msr spsel, #0x1 -9f3f03d5| dsb sy -9f3e03d5| dsb st -9f3d03d5| dsb ld -9f3b03d5| dsb ish -9f3a03d5| dsb ishst -9f3903d5| dsb ishld -9f3703d5| dsb nsh -9f3603d5| dsb nshst -9f3503d5| dsb nshld -9f3303d5| dsb osh -9f3203d5| dsb oshst -9f3103d5| dsb oshld -ff4603d5| msr daifclr, #0x6 -df4803d5| msr daifset, #0x8 -bf4100d5| msr spsel, #0x1 -a3681b53| lsl w3, w5, #5 -47dc78d3| lsl x7, x2, #8 -0500a012| movn w5, #0x0, lsl #16 -0500e092| movn x5, #0x0, lsl #48 -0500a052| movz w5, #0x0, lsl #16 -0500a0d2| movz x5, #0x0, lsl #16 -cd5a206e| mvn v13.16b, v22.16b -cd5a202e| mvn v13.8b, v22.8b -743d050e| umov w20, v11.b[2] -743d0a0e| umov w20, v11.h[2] -743d0c0e| mov w20, v11.s[1] -743d084e| mov x20, v11.d[0] diff --git a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/plan9cases.txt b/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/plan9cases.txt deleted file mode 100644 index 873de3db44..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/arm64/arm64asm/testdata/plan9cases.txt +++ /dev/null @@ -1,4564 +0,0 @@ -0a011f1a| ADCW ZR, R8, R10 -4c00009a| ADC R0, R2, R12 -a602093a| ADCSW R9, R21, R6 -d60217ba| ADCS R23, R22, R22 -0921250b| ADDW R5.UXTH, R8, R9 -ee9e288b| ADD R8.SXTB<<7, R23, R14 -23123011| ADDW $3076, R17, R3 -2ba32391| ADD $2280, R25, R11 -67158d0b| ADDW R13->5, R11, R7 -30da198b| ADD R25<<54, R17, R16 -a7e72c2b| ADDSW R12.SXTX<<1, R29, R7 -357338ab| ADDS R24.UXTX<<4, R25, R21 -6b147731| ADDSW $(3525<<12), R3, R11 -cd59872b| ADDSW R7->22, R14, R13 -e41f4eab| ADDS R14>>7, ZR, R4 -a2432412| ANDW $4026540031, R29, R2 -93910e92| AND $34903429696192636, R12, R19 -7a1ec98a| AND R9@>7, R19, R26 -1ff32972| TSTW $2863311530, R24 -458051f2| ANDS $-140737488289793, R2, R5 -af629a6a| ANDSW R26->24, R21, R15 -7ab0dfea| ANDS ZR@>44, R3, R26 -792bcc1a| ASRW R12, R27, R25 -872bce9a| ASR R14, R28, R7 -99ff4b93| ASR $11, R28, R25 -1628c91a| ASRW R9, R0, R22 -4e2acf9a| ASR R15, R18, R14 -4be5a454| BLT -186582(PC) -53257114| JMP 7415123(PC) -dbb557b3| BFXIL $23, R14, $23, R27 -70e861b3| BFXIL $33, R3, $26, R16 -88a75ab3| BFXIL $26, R28, $16, R8 -b03ce70a| BICW R7@>15, R5, R16 -9235ec8a| BIC R12@>13, R12, R18 -7450b96a| BICSW R25->20, R3, R20 -3730b3ea| BICS R19->12, R1, R23 -9b897797| CALL -8943205(PC) -e0013fd6| CALL (R15) -a0031fd6| JMP (R29) -e08c31d4| BRK $35943 -027eb435| CBNZW R2, -154640(PC) -c7eb42b5| CBNZ R7, 137054(PC) -8f1d4c34| CBZW R15, 155884(PC) -e1c5abb4| CBZ R1, -172497(PC) -4bfb543a| CCMNW AL, R26, $20, $11 -015b46ba| CCMN PL, R24, $6, $1 -8602463a| CCMNW EQ, R20, R6, $6 -c6d34cba| CCMN LE, R30, R12, $6 -a76b4f7a| CCMPW VS, R29, $15, $7 -e3d853fa| CCMP LE, R7, $19, $3 -4022467a| CCMPW HS, R18, R6, $0 -c7b346fa| CCMP LT, R30, R6, $7 -ee279b1a| CSINCW HS, ZR, R27, R14 -4174819a| CSINC VC, R2, R1, R1 -5100955a| CSINVW EQ, R2, R21, R17 -573093da| CSINV LO, R2, R19, R23 -5f3403d5| CLREX $4 -e615c05a| CLSW R15, R6 -ff15c0da| CLS R15, ZR -2e10c05a| CLZW R1, R14 -a912c0da| CLZ R21, R9 -ff11352b| CMNW R21.UXTB<<4, R15 -1f5220ab| CMN R0.UXTW<<4, R16 -ff02266b| CMPW R6.UXTB, R23 -5fb739eb| CMP R25.SXTH<<5, R26 -bfa73bf1| CMP $3817, R29 -7f5c47eb| CMP R7>>23, R3 -2e458e5a| CSNEGW MI, R9, R14, R14 -c3559cda| CSNEG PL, R14, R28, R3 -1041d11a| CRC32B R17, R8, R16 -bb46c31a| CRC32H R3, R21, R27 -c94bd61a| CRC32W R22, R30, R9 -8f4cd49a| CRC32X R20, R4, R15 -7653d21a| CRC32CB R18, R27, R22 -1454d51a| CRC32CH R21, R0, R20 -7c58c91a| CRC32CW R9, R3, R28 -185ccb9a| CRC32CX R11, R0, R24 -8c30941a| CSELW LO, R4, R20, R12 -0ea08c9a| CSEL GE, R0, R12, R14 -e3b79f1a| CSETW GE, R3 -fea79f9a| CSET LT, R30 -e5639f5a| CSETMW VC, R5 -e4739fda| CSETM VS, R4 -bad4981a| CSINCW LE, R5, R24, R26 -5167909a| CSINC VS, R26, R16, R17 -65e3955a| CSINVW AL, R27, R21, R5 -8e338bda| CSINV LO, R28, R11, R14 -0a269d5a| CSNEGW HS, R16, R29, R10 -ab1692da| CSNEG NE, R21, R18, R11 -418ea5d4| DCPS1 $11378 -6239a5d4| DCPS2 $10699 -e3ebabd4| DCPS3 $24415 -bf3a03d5| DMB $10 -e003bfd6| DRPS -9f3003d5| DSB $0 -c974354a| EONW R21<<29, R6, R9 -89b86eca| EON R14>>46, R4, R9 -76e343d2| EOR $-2287828610704211969, R27, R22 -536d8c4a| EORW R12->27, R10, R19 -d1ef1cca| EOR R28<<59, R30, R17 -e0039fd6| ERET -591d8813| EXTRW $7, R8, R10, R25 -888dd693| EXTR $35, R22, R12, R8 -bf2003d5| SEVL -df2003d5| HINT $6 -a0fc5fd4| HLT $65509 -df3103d5| ISB $1 -9dfddf88| LDARW (R12), R29 -76ffdfc8| LDAR (R27), R22 -36ffdf08| LDARB (R25), R22 -bcfcdf48| LDARH (R5), R28 -54c17f88| LDAXPW (R10), (R20, R16) -3eaf7fc8| LDAXP (R25), (R30, R11) -e2fd5f88| LDAXRW (R15), R2 -f5fd5fc8| LDAXR (R15), R21 -70fe5f08| LDAXRB (R19), R16 -bcfc5f48| LDAXRH (R5), R28 -ecff5928| LDNPW 204(RSP), ZR, R12 -852744a8| LDNP 64(R28), R9, R5 -1286d728| LDP.P 188(R16), (R18, R1) -7668e8a8| LDP.P -384(R3), (R22, R26) -6d8bc729| LDP.W 60(R27), (R13, R2) -1cadd1a9| LDP.W 280(R8), (R28, R11) -bf4e7e29| LDP -16(R21), (ZR, R19) -61695fa9| LDP 496(R11), (R1, R26) -4c00e668| LDPSW -208(R2), R0, R12 -85a0cb69| LDPSW 92(R4), R8, R5 -9b894d69| LDPSW 108(R12), R2, R27 -e9955ab8| MOVWU.P -87(R15), R9 -5c255df8| MOVD.P -46(R10), R28 -703c57b8| MOVWU.W -141(R3), R16 -1dac57f8| MOVD.W -134(R0), R29 -393c50b9| MOVWU 4156(R1), R25 -498d5cf9| MOVD 14616(R10), R9 -72fa72b8| MOVWU (R19)(R18.SXTX<<2), R18 -daeb66f8| MOVD (R30)(R6.SXTX), R26 -8ca74238| MOVBU.P 42(R28), R12 -4e5c5e38| MOVBU.W -27(R2), R14 -03936d39| MOVBU 2916(R24), R3 -577a6e38| MOVBU (R18)(R14), R23 -adb54678| MOVHU.P 107(R13), R13 -820f4c78| MOVHU.W 192(R28), R2 -92787579| MOVHU 6844(R4), R18 -4bd6c438| MOVBW.P 77(R18), R11 -fb478238| MOVB.P 36(RSP), R27 -4d7edc38| MOVBW.W -57(R18), R13 -18ee9438| MOVB.W -178(R16), R24 -16b9c639| MOVBW 430(R8), R22 -37958f39| MOVB 997(R9), R23 -af7ae238| MOVBW (R21)(R2), R15 -1568fa38| MOVBW (R0)(R26), R21 -744bbf38| MOVB (R27)(ZR.UXTW), R20 -f069a538| MOVB (R15)(R5), R16 -d9a6cd78| MOVHW.P 218(R22), R25 -ff368b78| MOVH.P 179(R23), ZR -5b8cc878| MOVHW.W 136(R2), R27 -361f9c78| MOVH.W -63(R25), R22 -359bec79| MOVHW 5708(R25), R21 -4d6c8079| MOVH 54(R2), R13 -9deae578| MOVHW (R20)(R5.SXTX), R29 -f2fab878| MOVH (R23)(R24.SXTX<<1), R18 -02669cb8| MOVW.P -58(R16), R2 -5c8e92b8| MOVW.W -216(R18), R28 -ea9e92b9| MOVW 4764(R23), R10 -49dabcb8| MOVW (R18)(R28.SXTW<<2), R9 -64285eb8| LDTRW -30(R3), R4 -6ab851f8| LDTR -229(R3), R10 -aa094f38| LDTRBW 240(R13), R10 -b7894e78| LDTRH 232(R13), R23 -85cadd38| LDTRSBW -36(R20), R5 -2db99838| LDTRSB -117(R9), R13 -7ef8ce78| LDTRSHW 239(R3), R30 -786a8978| LDTRSH 150(R19), R24 -c5eb81b8| LDTRSW 30(R30), R5 -a1f14bb8| LDURW 191(R13), R1 -c3425cf8| LDUR -60(R22), R3 -2e125038| LDURBW -255(R17), R14 -26004878| LDURHW 128(R1), R6 -c3e3cd38| LDURSBW 222(R30), R3 -27618938| LDURSB 150(R9), R7 -7c71db78| LDURSHW -73(R11), R28 -1d109e78| LDURSH -31(R0), R29 -d48084b8| LDURSW 72(R6), R20 -172f7f88| LDXPW (R24), (R23, R11) -10347fc8| LDXP (R0), (R16, R13) -fe7f5f88| LDXRW (RSP), R30 -6c7f5fc8| LDXR (R27), R12 -047c5f08| LDXRB (R0), R4 -9a7d5f48| LDXRH (R12), R26 -4f21cb1a| LSLW R11, R10, R15 -1523db9a| LSL R27, R24, R21 -81c74fd3| UBFX $15, R28, $35, R1 -c922c81a| LSLW R8, R22, R9 -fd22dc9a| LSL R28, R23, R29 -4226dd1a| LSRW R29, R18, R2 -a224ca9a| LSR R10, R5, R2 -707c0153| LSRW $1, R3, R16 -34fc4cd3| LSR $12, R1, R20 -6c24c91a| LSRW R9, R3, R12 -8527c89a| LSR R8, R28, R5 -ea36171b| MADDW R23, R13, R23, R10 -e47a0a9b| MADD R10, R30, R23, R4 -35fd001b| MNEGW R0, R9, R21 -77ff0e9b| MNEG R14, R27, R23 -38030011| ADDW $0, R25, R24 -37030091| ADD $0, R25, R23 -94b8ad12| MOVW $2453405695, R20 -fff29892| MOVD $-51096, ZR -d4adb252| MOVW $2507014144, R20 -8747e2d2| MOVD $1313925191285342208, R7 -f5132d32| ORRW $16252928, ZR, R21 -eb7f34b2| MOVD $-1, R11 -f503092a| MOVW R9, R21 -e7031eaa| MOVD R30, R7 -35e8c1f2| MOVK $(3905<<32), R21 -44629512| MOVW $4294923501, R4 -cc0dd392| MOVD $-167598213824513, R12 -cbfb9152| MOVW $36830, R11 -3d25ebd2| MOVD $6424666343420723200, R29 -e67a3fd5| MRS $31703, R6 -f9dd15d5| MSR R25, S2_5_C13_C13_7 -25840c1b| MSUBW R12, R1, R1, R5 -02ce1a9b| MSUB R26, R19, R16, R2 -b67c1a1b| MULW R26, R5, R22 -607c049b| MUL R4, R3, R0 -e97f6daa| MVN R13>>31, R9 -fe071f6b| NEGSW ZR<<1, R30 -f68f14eb| NEGS R20<<35, R22 -e8030d5a| NGCW R13, R8 -fe031eda| NGC R30, R30 -e5030a7a| NGCSW R10, R5 -f00318fa| NGCS R24, R16 -1f2003d5| NOP -032ee42a| ORNW R4@>11, R16, R3 -634cf6aa| ORN R22@>19, R3, R3 -f8492d32| ORRW $4294443071, R15, R24 -96f542b2| ORR $-3458764513820540929, R12, R22 -1c110d2a| ORRW R13<<4, R8, R28 -c65b1eaa| ORR R30<<22, R30, R6 -f300b2f9| PRFM 25600(R7), PSTL2STRM -2aa196d8| PRFM -215799(PC), PLIL2KEEP -2ad8bef8| PRFM (R1)(R30.SXTW<<3), PLIL2KEEP -c62184f8| PRFUM 66(R14), $6 -3601c05a| RBITW R9, R22 -6401c0da| RBIT R11, R4 -e0035fd6| RET ZR -0a09c05a| REVW R8, R10 -220cc0da| REV R1, R2 -b206c05a| REV16W R21, R18 -2407c0da| REV16 R25, R4 -7e0bc0da| REV32 R27, R30 -ae0ec0da| REV R21, R14 -336f8413| EXTRW $27, R4, R25, R19 -af47ca93| EXTR $17, R10, R29, R15 -bc2cdb1a| RORW R27, R5, R28 -e52fdd9a| ROR R29, ZR, R5 -832dc31a| RORW R3, R12, R3 -e22ec09a| ROR R0, R23, R2 -1801045a| SBCW R4, R8, R24 -5a0119da| SBC R25, R10, R26 -52021b7a| SBCSW R27, R18, R18 -250105fa| SBCS R5, R9, R5 -fc430b13| SBFXW $11, ZR, $6, R28 -a0574093| SBFX $0, R29, $22, R0 -8b3b7a93| SBFIZ $6, R28, $15, R11 -fc310513| SBFXW $5, R15, $8, R28 -fbdc4293| SBFX $2, R7, $54, R27 -c90dd61a| SDIVW R22, R14, R9 -a90ecd9a| SDIV R13, R21, R9 -9f2003d5| SEV -bf2003d5| SEVL -d27f229b| SMULL R2, R30, R18 -efff3a9b| SMNEGL R26, ZR, R15 -7d963f9b| SMSUBL ZR, R5, R19, R29 -b57e519b| SMULH R17, R21, R21 -a07c209b| SMULL R0, R5, R0 -d0fe9f88| STLRW R16, (R22) -03ff9fc8| STLR R3, (R24) -8bff9f08| STLRB R11, (R28) -f0fe9f48| STLRH R16, (R23) -c6ae3588| STLXPW (R6, R11), (R22), R21 -c6fa22c8| STLXP (R6, R30), (R22), R2 -affd0e88| STLXRW R15, (R13), R14 -67ff1cc8| STLXR R7, (R27), R28 -17ff1c08| STLXRB R23, (R24), R28 -7bfe0b48| STLXRH R27, (R19), R11 -2a8c0528| STNPW 44(R1), R3, R10 -67fc10a8| STNP 264(R3), ZR, R7 -5559bd28| STP.P (R21, R22), -24(R10) -166c96a8| STP.P (R22, R27), 352(R0) -3d4a8729| STP.W (R29, R18), 56(R17) -912f86a9| STP.W (R17, R11), 96(R28) -c40d3029| STP (R4, R3), -128(R14) -f73f39a9| STP (R23, R15), -112(RSP) -34441eb8| MOVW.P R20, -28(R1) -11f60bf8| MOVD.P R17, 191(R16) -c15d15b8| MOVW.W R1, -171(R14) -ae4d12f8| MOVD.W R14, -220(R13) -03ef39b9| MOVW R3, 14828(R24) -208228f9| MOVD R0, 20736(R17) -734823f8| MOVD R19, (R3)(R3.UXTW) -ffb41838| MOVB.P ZR, -117(R7) -bb0d1a38| MOVB.W R27, -96(R13) -b1612239| MOVB R17, 2200(R13) -92682038| MOVB R18, (R4)(R0) -81682638| MOVB R1, (R4)(R6) -87841b78| MOVH.P R7, -72(R4) -cc3d1878| MOVH.W R12, -125(R14) -53cf1c79| MOVH R19, 3686(R26) -63792d78| MOVH R3, (R11)(R13<<1) -9d7803b8| STTRW 55(R4), R29 -b9c807f8| STTR 124(R5), R25 -f04a1e38| STTRBW -28(R23), R16 -52990078| STTRHW 9(R10), R18 -152002b8| MOVW R21, 34(R0) -397217f8| MOVD R25, -137(R17) -8f320138| MOVB R15, 19(R20) -eb021b78| MOVH R11, -80(R23) -854a3f88| STXPW (R5, R18), (R20), ZR -d12620c8| STXP (R17, R9), (R22), R0 -537e0288| STXRW R19, (R18), R2 -af7d15c8| STXR R15, (R13), R21 -e97c1d08| STXRB R9, (R7), R29 -837d1b48| STXRH R3, (R12), R27 -f25e344b| SUBW R20.UXTW<<7, R23, R18 -3ac825cb| SUB R5.SXTW<<2, R1, R26 -e8f40ccb| SUB R12<<61, R7, R8 -a6ad226b| SUBSW R2.SXTH<<3, R13, R6 -647735eb| SUBS R21.UXTX<<5, R27, R4 -c770566b| SUBSW R22>>28, R6, R7 -d03c1aeb| SUBS R26<<15, R6, R16 -a17f03d4| SVC $7165 -991f0013| SXTBW R28, R25 -a91d4093| SXTB R13, R9 -083d0013| SXTHW R8, R8 -393e4093| SXTH R17, R25 -1b7c4093| SXTW R0, R27 -0c5b2cd5| SYSL $285440, R12 -3f0d0172| TSTW $2147483655, R9 -df6f7cf2| TST $4294967280, R30 -1f2f11ea| TST R17<<11, R24 -9ced71d3| UBFX $49, R12, $11, R28 -1cbb7fd3| UBFIZ $1, R24, $47, R28 -25e661d3| UBFX $33, R17, $25, R5 -af0adc1a| UDIVW R28, R21, R15 -550ac29a| UDIV R2, R18, R21 -9102b19b| UMADDL R17, R0, R20, R17 -41fea39b| UMNEGL R3, R18, R1 -87d8a39b| UMSUBL R3, R22, R4, R7 -987ed89b| UMULH R24, R20, R24 -d37eb29b| UMULL R18, R22, R19 -461c0053| UXTBW R2, R6 -f43c0053| UXTHW R7, R20 -5f2003d5| WFE -7f2003d5| WFI -3f2003d5| YIELD -e5bb200e| VABS V31.B8, V5.B8 -c9842d0e| VADD V13.B8, V6.B8, V9.B8 -f4bd394e| VADDP V25.B16, V15.B16, V20.B16 -b3b8b14e| VADDV V5.S4, V19 -cd5b284e| AESD V30.B16, V13.B16 -4b4b284e| AESE V26.B16, V11.B16 -2879284e| AESIMC V9.B16, V8.B16 -fe68284e| AESMC V7.B16, V30.B16 -f61e334e| VAND V19.B16, V23.B16, V22.B16 -88a4002f| VMVNI $(4<<8), V8.H4 -1877076f| VBIC $(248<<24), V24.S4 -0d1e6c0e| VBIC V12.B8, V16.B8, V13.B8 -b81ce26e| VBIF V2.B16, V5.B16, V24.B16 -381cbf2e| VBIT V31.B8, V1.B8, V24.B8 -cd1f6c6e| VBSL V12.B16, V30.B16, V13.B16 -8d48a00e| VCLS V4.S2, V13.S2 -324ba02e| VCLZ V25.S2, V18.S2 -c88f2b2e| VCMEQ V11.B8, V30.B8, V8.B8 -a799e05e| VCMEQ $0, V13, V7 -dc9be04e| VCMEQ $0, V30.D2, V28.D2 -623f2d4e| VCMGE V13.B16, V27.B16, V2.B16 -e889e06e| VCMGE $0, V15.D2, V8.D2 -cb37e55e| VCMGT V5, V30, V11 -8e37b00e| VCMGT V16.S2, V28.S2, V14.S2 -1a8be04e| VCMGT $0, V24.D2, V26.D2 -7f37eb7e| VCMHI V11, V27, V31 -333d356e| VCMHS V21.B16, V9.B16, V19.B16 -bd9ae07e| VCMLE $0, V21, V29 -8999602e| VCMLE $0, V12.H4, V9.H4 -aca9e05e| VCMLT $0, V13, V12 -7fa8204e| VCMLT $0, V3.B16, V31.B16 -588db20e| VCMTST V18.S2, V10.S2, V24.S2 -cc051d5e| VMOV V14.B[14], V12 -4c06050e| VDUP V18.B[2], V12.B8 -790c020e| VDUP R3, V25.H4 -391d286e| VEOR V8.B16, V9.B16, V25.B16 -4b30156e| VEXT $6, V21.B16, V2.B16, V11.B16 -44d6bf7e| FABD F31, F18, F4 -17fba00e| FABS V24.S2, V23.S2 -90c2201e| FABSS F20, F16 -62c2601e| FABSD F19, F2 -eeef3f7e| FACGE F31, F31, F14 -09efa07e| FACGT F0, F24, F9 -72edae6e| VFACGT V14.S4, V11.S4, V18.S4 -61d5394e| FADD V25.S4, V11.S4, V1.S4 -0d2a3d1e| FADDS F29, F16, F13 -4b296f1e| FADDD F15, F10, F11 -78d8307e| FADDP V3.S2, F24 -e7d7322e| VFADDP V18.S2, V31.S2, V7.S2 -e8253c1e| FCCMPS HS, F28, F15, $8 -e8857f1e| FCCMPD HI, F31, F15, $8 -5714291e| FCCMPES NE, F9, F2, $7 -b484631e| FCCMPED HI, F3, F5, $4 -3ce5685e| FCMEQ F8, F9, F28 -50e6214e| VFCMEQ V1.S4, V18.S4, V16.S4 -9ddae05e| FCMEQ $0, F20, F29 -b3e62b7e| FCMGE F11, F21, F19 -0ce4396e| VFCMGE V25.S4, V0.S4, V12.S4 -a6c9e07e| FCMGE $0, F13, F6 -ede6bd7e| FCMGT F29, F23, F13 -13e6ae2e| VFCMGT V14.S2, V16.S2, V19.S2 -4cc9e05e| FCMGT $0, F10, F12 -41cba04e| VFCMGT $0, V26.S4, V1.S4 -96d8e07e| FCMLE $0, F4, F22 -0be9a05e| FCMLT $0, F8, F11 -dfe9a04e| VFCMLT $0, V14.S4, V31.S4 -a023301e| FCMPS F16, F29 -68213e1e| FCMPS $(0.0), F11 -20236d1e| FCMPD F13, F25 -68216b1e| FCMPD $(0.0), F11 -3023351e| FCMPES F21, F25 -78203e1e| FCMPES $(0.0), F3 -b022721e| FCMPED F18, F21 -f8226f1e| FCMPED $(0.0), F23 -b54e271e| FCSELS MI, F21, F7, F21 -319f611e| FCSELD LS, F25, F1, F17 -2142e21e| FCVTHS F17, F1 -cfc3e21e| FCVTHD F30, F15 -01c1231e| FCVTSH F8, F1 -4fc0221e| FCVTSD F2, F15 -f9c0631e| FCVTDH F7, F25 -2b43621e| FCVTDS F25, F11 -f1c8615e| FCVTAS F7, F17 -ea01241e| FCVTASW F15, R10 -0c02249e| FCVTAS F16, R12 -e702641e| FCVTASW F23, R7 -f501649e| FCVTAS F15, R21 -45ca217e| FCVTAU F18, F5 -66c9212e| VFCVTAU V11.S2, V6.S2 -b302251e| FCVTAUW F21, R19 -e102259e| FCVTAU F23, R1 -5703651e| FCVTAUW F26, R23 -2c01659e| FCVTAU F9, R12 -2c7b210e| VFCVTL V25.H4, V12.S4 -f478214e| VFCVTL2 V7.H8, V20.S4 -d1b8615e| FCVTMS F6, F17 -a2ba614e| VFCVTMS V21.D2, V2.D2 -ee01301e| FCVTMSW F15, R14 -de01309e| FCVTMS F14, R30 -8401701e| FCVTMSW F12, R4 -c502709e| FCVTMS F22, R5 -44b8617e| FCVTMU F2, F4 -5601311e| FCVTMUW F10, R22 -4602319e| FCVTMU F18, R6 -1003711e| FCVTMUW F24, R16 -e602719e| FCVTMU F23, R6 -c16b210e| VFCVTN V30.S4, V1.H4 -4d6b614e| VFCVTN2 V26.D2, V13.S4 -95ab215e| FCVTNS F28, F21 -65a9614e| VFCVTNS V11.D2, V5.D2 -8a02201e| FCVTNSW F20, R10 -bc03209e| FCVTNS F29, R28 -fc01601e| FCVTNSW F15, R28 -9800609e| FCVTNS F4, R24 -b1aa617e| FCVTNU F21, F17 -80a9216e| VFCVTNU V12.S4, V0.S4 -3201211e| FCVTNUW F9, R18 -e101219e| FCVTNU F15, R1 -ae00611e| FCVTNUW F5, R14 -9503619e| FCVTNU F28, R21 -3faae15e| FCVTPS F17, F31 -c4a8e14e| VFCVTPS V6.D2, V4.D2 -ab01281e| FCVTPSW F13, R11 -5800289e| FCVTPS F2, R24 -9b02681e| FCVTPSW F20, R27 -de03689e| FCVTPS F30, R30 -d8aaa17e| FCVTPU F22, F24 -e203291e| FCVTPUW F31, R2 -5302299e| FCVTPU F18, R19 -5302691e| FCVTPUW F18, R19 -8501699e| FCVTPU F12, R5 -93ff735f| FCVTZS $13, F28, F19 -b7fd504f| FCVTZS $48, V13.D2, V23.D2 -7ebba15e| FCVTZSSS F27, F30 -d49f181e| FCVTZS $25, F30, R20 -538d189e| FCVTZS $29, F10, R19 -7e74589e| FCVTZS $35, F3, R30 -4300381e| FCVTZSSW F2, R3 -bc03389e| FCVTZSS F29, R28 -c702781e| FCVTZSDW F22, R7 -0401789e| FCVTZSD F8, R4 -d1ff2e7f| FCVTZU $18, F30, F17 -d0fd3b2f| FCVTZU $5, V14.S2, V16.S2 -70bae17e| FCVTZUDD F19, F16 -3ef6191e| FCVTZU $3, F17, R30 -cae7199e| FCVTZU $7, F30, R10 -cffb599e| FCVTZU $2, F30, R15 -e402391e| FCVTZUSW F23, R4 -1a03399e| FCVTZUS F24, R26 -0401791e| FCVTZUDW F8, R4 -c200799e| FCVTZUD F6, R2 -ebfe346e| FDIV V20.S4, V23.S4, V11.S4 -c918371e| FDIVS F23, F6, F9 -911a7f1e| FDIVD F31, F20, F17 -a81f0c1f| FMADDS F12, F7, F29, F8 -d0404a1f| FMADDD F10, F16, F6, F16 -7ff6324e| FMAX V18.S4, V19.S4, V31.S4 -b84b351e| FMAXS F21, F29, F24 -d64b621e| FMAXD F2, F30, F22 -016b241e| FMAXNMS F4, F24, F1 -5b69781e| FMAXNMD F24, F10, F27 -f1c8707e| FMAXNMP V7.D2, F17 -27c5306e| VFMAXNMP V16.S4, V9.S4, V7.S4 -aef8707e| FMAXP V5.D2, F14 -53f6202e| VFMAXP V0.S2, V18.S2, V19.S2 -78fb306e| FMAXV V27.S4, F24 -5af4ec4e| FMIN V12.D2, V2.D2, V26.D2 -505a3c1e| FMINS F28, F18, F16 -4858661e| FMIND F6, F2, F8 -a9c6e04e| FMINNM V0.D2, V21.D2, V9.D2 -987b311e| FMINNMS F17, F28, F24 -95796f1e| FMINNMD F15, F12, F21 -f5cbb07e| FMINNMP V31.S2, F21 -b0f8f07e| FMINP V5.D2, F16 -8bf5a42e| VFMINP V4.S2, V12.S2, V11.S2 -87cd384e| VFMLA V24.S4, V12.S4, V7.S4 -fd50db5f| FMLS V27.D[0], F7, F29 -d1ccb44e| VFMLS V20.S4, V6.S4, V17.S4 -ebf5064f| FMOV $-0.242188, V11.S4 -49f4056f| FMOV $-9., V9.D2 -0940201e| FMOVS F0, F9 -db43601e| FMOVD F30, F27 -a901271e| FMOVS R13, F9 -3702261e| FMOVS F17, R23 -4d02679e| FMOVD R18, F13 -9d02af9e| FMOV R20, V29.D[1] -ef03669e| FMOVD F31, R15 -7101ae9e| FMOV V11.D[1], R17 -0e103d1e| FMOVS $-0.75, F14 -1e50761e| FMOVD $-18., F30 -d2b4121f| FMSUBS F18, F13, F6, F18 -0a9c4c1f| FMSUBD F12, F7, F0, F10 -0d99b35f| FMULS V19.S[3], F8, F13 -a89b9b0f| FMUL V27.S[2], V29.S2, V8.S2 -75dc376e| FMUL V23.S4, V3.S4, V21.S4 -7909241e| FMULS F4, F11, F25 -d7096b1e| FMULD F11, F14, F23 -2999ab7f| FMULX V11.S[3], F9, F9 -35dd6d5e| FMULX F13, F9, F21 -c8dc284e| VFMULX V8.S4, V6.S4, V8.S4 -c043211e| FNEGS F30, F0 -4742611e| FNEGD F18, F7 -9c51251f| FNMADDS F5, F20, F12, F28 -e407771f| FNMADDD F23, F1, F31, F4 -fbfa3a1f| FNMSUBS F26, F30, F23, F27 -bbb0691f| FNMSUBD F9, F12, F5, F27 -6a8b3f1e| FNMULS F31, F27, F10 -1a8b751e| FNMULD F21, F24, F26 -57d8e15e| FRECPE F2, F23 -62dba14e| VFRECPE V27.S4, V2.S4 -81fd325e| FRECPS F18, F12, F1 -31fe224e| VFRECPS V2.S4, V17.S4, V17.S4 -ecf9e15e| FRECPX F15, F12 -c18b216e| FRINTA V30.S4, V1.S4 -0240261e| FRINTAS F0, F2 -8041661e| FRINTAD F12, F0 -c89ba12e| FRINTI V30.S2, V8.S2 -2ec2271e| FRINTIS F17, F14 -5cc0671e| FRINTID F2, F28 -3898210e| FRINTM V1.S2, V24.S2 -9843251e| FRINTMS F28, F24 -5b40651e| FRINTMD F2, F27 -2189614e| FRINTN V9.D2, V1.D2 -7e42241e| FRINTNS F19, F30 -5d40641e| FRINTND F2, F29 -85c3241e| FRINTPS F28, F5 -46c2641e| FRINTPD F18, F6 -c39b216e| FRINTX V30.S4, V3.S4 -a243271e| FRINTXS F29, F2 -1d41671e| FRINTXD F8, F29 -5499e14e| FRINTZ V10.D2, V20.D2 -92c2251e| FRINTZS F20, F18 -75c2651e| FRINTZD F19, F21 -ddd9e17e| FRSQRTE F14, F29 -60fff85e| FRSQRTS F24, F27, F0 -dafffb4e| VFRSQRTS V27.D2, V30.D2, V26.D2 -1ff9a12e| FSQRT V8.S2, V31.S2 -2dc3211e| FSQRTS F25, F13 -72c0611e| FSQRTD F3, F18 -7d3a3e1e| FSUBS F30, F19, F29 -3f38771e| FSUBD F23, F1, F31 -185e016e| VMOV V16.B[11], V24.B[0] -911d0d4e| VMOV R12, V17.B[6] -2877400c| VLD1 (R25), [V8.H4] -8ea8404c| VLD1 (R4), [V14.S4, V15.S4] -0f62404c| VLD1 (R16), [V15.B16, V16.B16, V17.B16] -0f27400c| VLD1 (R24), [V15.H4, V16.H4, V17.H4, V18.H4] -4c75df0c| VLD1.P 8(R10), [V12.H4] -2f7bd04c| VLD1.P (R25)(R16), [V15.S4] -eaaadf0c| VLD1.P 16(R23), [V10.S2, V11.S2] -eca7cc4c| VLD1.P (RSP)(R12), [V12.H8, V13.H8] -cd60df4c| VLD1.P 48(R6), [V13.B16, V14.B16, V15.B16] -9163df0c| VLD1.P 24(R28), [V17.B8, V18.B8, V19.B8] -152ddf4c| VLD1.P 64(R8), [V21.D2, V22.D2, V23.D2, V24.D2] -0725c04c| VLD1.P (R8)(R0), [V7.H8, V8.H8, V9.H8, V10.H8] -7c04404d| VLD1 (R3), V28.B[9] -6d49404d| VLD1 (R11), V13.H[5] -9e81400d| VLD1 (R12), V30.S[0] -d384404d| VLD1 (R6), V19.D[1] -b20ddf4d| VLD1.P 1(R13), V18.B[11] -f114cd4d| VLD1.P (R7)(R13), V17.B[13] -bb92df4d| VLD1.P 4(R21), V27.S[3] -a883d64d| VLD1.P (R29)(R22), V8.S[2] -f584df4d| VLD1.P 8(R7), V21.D[1] -0284c80d| VLD1.P (R0)(R8), V2.D[0] -91c3400d| VLD1R (R28), [V17.B8] -71c9df0d| VLD1R 4(R11), [V17.S2] -e7c4db0d| VLD1R (R7)(R27), [V7.H4] -b787404c| VLD2 (R29), [V23.H8, V24.H8] -1280df0c| VLD2 16(R0), [V18.B8, V19.B8] -2f88c10c| VLD2 (R1)(R1), [V15.S2, V16.S2] -a01e604d| LD2 (R21), [V0.B, V1.B][15] -eb82604d| LD2 (R23), [V11.S, V12.S][2] -f985600d| LD2 (R15), [V25.D, V26.D][0] -e315ff0d| LD2 2(R15), [V3.B, V4.B][5] -1c11f24d| LD2 (R8)(R18), [V28.B, V29.B][12] -f341ef4d| LD2 (R15)(R15), [V19.H, V20.H][4] -5a80ff4d| LD2 8(R2), [V26.S, V27.S][2] -d781fd0d| LD2 (R14)(R29), [V23.S, V24.S][0] -c885ff0d| LD2 16(R14), [V8.D, V9.D][0] -1286f34d| LD2 (R16)(R19), [V18.D, V19.D][1] -06c2600d| VLD2R (R16), [V6.B8, V7.B8] -95c7ff4d| VLD2R 4(R28), [V21.H8, V22.H8] -d4c1e14d| VLD2R (R14)(R1), [V20.B16, V21.B16] -eb4bdf4c| VLD3 48(RSP), [V11.S4, V12.S4, V13.S4] -ce4fc24c| VLD3 (R30)(R2), [V14.D2, V15.D2, V16.D2] -db23400d| LD3 (R30), [V27.B, V28.B, V29.B][0] -26b3400d| LD3 (R25), [V6.S, V7.S, V8.S][1] -37a4400d| LD3 (R1), [V23.D, V24.D, V25.D][0] -052edf4d| LD3 3(R16), [V5.B, V6.B, V7.B][11] -8c3ccd0d| LD3 (R4)(R13), [V12.B, V13.B, V14.B][7] -74b0df4d| LD3 12(R3), [V20.S, V21.S, V22.S][3] -b7b1c84d| LD3 (R13)(R8), [V23.S, V24.S, V25.S][3] -e6a5df4d| LD3 24(R15), [V6.D, V7.D, V8.D][1] -42a5c80d| LD3 (R10)(R8), [V2.D, V3.D, V4.D][0] -9ceb400d| VLD3R (R28), [V28.S2, V29.S2, V30.S2] -6aeadf4d| VLD3R 12(R19), [V10.S4, V11.S4, V12.S4] -65ebce4d| VLD3R (R27)(R14), [V5.S4, V6.S4, V7.S4] -ea05400c| VLD4 (R15), [V10.H4, V11.H4, V12.H4, V13.H4] -1f03df0c| VLD4 32(R24), [V31.B8, V0.B8, V1.B8, V2.B8] -ae09c90c| VLD4 (R13)(R9), [V14.S2, V15.S2, V16.S2, V17.S2] -fd3a604d| LD4 (R23), [V29.B, V30.B, V31.B, V0.B][14] -d8a0604d| LD4 (R6), [V24.S, V25.S, V26.S, V27.S][2] -62a4604d| LD4 (R3), [V2.D, V3.D, V4.D, V5.D][1] -712fff0d| LD4 4(R27), [V17.B, V18.B, V19.B, V20.B][3] -aa27f40d| LD4 (R29)(R20), [V10.B, V11.B, V12.B, V13.B][1] -be71ff4d| LD4 8(R13), [V30.H, V31.H, V0.H, V1.H][6] -e360ee4d| LD4 (R7)(R14), [V3.H, V4.H, V5.H, V6.H][4] -c0a0ff0d| LD4 16(R6), [V0.S, V1.S, V2.S, V3.S][0] -d3a3e00d| LD4 (R30)(R0), [V19.S, V20.S, V21.S, V22.S][0] -95a7ff0d| LD4 32(R28), [V21.D, V22.D, V23.D, V24.D][0] -32a6e14d| LD4 (R17)(R1), [V18.D, V19.D, V20.D, V21.D][1] -56e0604d| VLD4R (R2), [V22.B16, V23.B16, V24.B16, V25.B16] -dce7ff0d| VLD4R 8(R30), [V28.H4, V29.H4, V30.H4, V31.H4] -14e8ef0d| VLD4R (R0)(R15), [V20.S2, V21.S2, V22.S2, V23.S2] -7776732c| VLDNP -104(R19), V29, V23 -23dd746c| VLDNP -184(R9), V23, V3 -383e48ac| VLDNP 256(R17), V15, V24 -0d10c12c| LDP.P 8(R0), (V13, V4) -fe3ae66c| LDP.P -416(R23), (V30, V14) -f627f9ac| LDP.P -224(RSP), (V22, V9) -918cd82d| LDP.W 196(R4), (V17, V3) -986be46d| LDP.W -448(R28), (V24, V26) -ebd8f8ad| LDP.W -240(R7), (V11, V22) -3c905c2d| LDP 228(R1), (V28, V4) -5887536d| LDP 312(R26), (V24, V1) -08957cad| LDP -112(R8), (V8, V5) -c5e5543c| MOVD.P -178(R14), V5 -4ff5417c| MOVD.P 31(R10), V15 -72e54bbc| FMOVS.P 190(R11), F18 -16b55dfc| FMOVD.P -37(R8), F22 -9e24db3c| MOVD.P -78(R4), V30 -d20c503c| MOVD.W -256(R6), V18 -1f1c4d7c| MOVD.W 209(R0), V31 -2fbf4dbc| FMOVS.W 219(R25), F15 -a06c59fc| FMOVD.W -106(R5), F0 -886ddd3c| MOVD.W -42(R12), V8 -58f64e3d| MOVD 957(R18), V24 -f5c3547d| MOVD 2656(RSP), V21 -8e8a7bbd| FMOVS 15240(R20), F14 -8e3c7afd| FMOVD 29816(R4), F14 -f2aeff3d| MOVD 65200(R23), V18 -1d78793c| MOVD (R0)(R25), V29 -b8f15d3c| VLDUR -33(R13), V24 -95635c7c| VLDUR -58(R28), V21 -27d046bc| VLDUR 109(R1), V7 -21624efc| VLDUR 230(R17), V1 -6dd2d83c| VLDUR -115(R19), V13 -dc09be6f| VMLA V30.S[3], V14.S4, V28.S4 -eb97af4e| VMLA V15.S4, V31.S4, V11.S4 -0495722e| VMLS V18.H4, V8.H4, V4.H4 -21070a5e| VMOV V25.H[2], V1 -92471b6e| VMOV V28.B[8], V18.B[13] -7a1e134e| VMOV R19, V26.B[9] -761fa30e| VORR V3.B8, V27.B8, V22.B8 -f23d070e| VMOV V15.B[3], R18 -a5e6064f| VMOVI $213, V5.B16 -63c5064f| VMOVI $(203<<136), V3.S4 -bca7014f| VMOVI $(61<<8), V28.H8 -95e4040f| VMOVI $132, V21.B8 -fce4072f| VMOVI $-1099494850561, V28 -24e6036f| VMOVI $72057589742960895, V4.D2 -429d6a4e| VMUL V10.H8, V10.H8, V2.H8 -e558202e| VMVN V7.B8, V5.B8 -fe65012f| VMVNI $(47<<24), V30.S2 -2b16046f| VBIC $145, V11.S4 -7756016f| VBIC $(51<<16), V23.S4 -e159202e| VMVN V15.B8, V1.B8 -da1cf14e| VORN V17.B16, V6.B16, V26.B16 -ca04014f| VMOVI $38, V10.S4 -14a6020f| VMOVI $(80<<8), V20.H4 -2f1fbf0e| VORR V31.B8, V25.B8, V15.B8 -74e2f20e| VPMULL V18.D1, V19.D1, V20.Q1 -2740262e| VRADDHN V6.H8, V1.H8, V7.B8 -17412e6e| VRADDHN2 V14.H8, V8.H8, V23.B16 -da59602e| VRBIT V14.B8, V26.B8 -230a604e| VREV64 V17.H8, V3.H8 -178d210f| VRSHRN $31, V8.D2, V23.S2 -6b8d2c4f| VRSHRN2 $20, V11.D2, V11.S4 -b57c2a0e| VSABA V10.B8, V5.B8, V21.B8 -71533d0e| VSABAL V29.B8, V27.B8, V17.H8 -1c50774e| VSABAL2 V23.H8, V0.H8, V28.S4 -1974be4e| VSABD V30.S4, V0.S4, V25.S4 -6b71ad0e| VSABDL V13.S2, V11.S2, V11.D2 -5270324e| VSABDL2 V18.B16, V2.B16, V18.H8 -366b200e| VSADALP V25.B8, V22.H4 -1802680e| VSADDL V8.H4, V16.H4, V24.S4 -022b604e| VSADDLP V24.H8, V2.S4 -413ab04e| VSADDLV V18.S4, V1 -4013750e| VSADDW V21.H4, V26.S4, V0.S4 -4412744e| VSADDW2 V20.H8, V18.S4, V4.S4 -2ee6255f| SCVTF $27, F17, F14 -dce75f4f| SCVTF $33, V30.D2, V28.D2 -5bdb615e| SCVTFDD F26, F27 -3ad9210e| SCVTF V9.S2, V26.S2 -1ceb421e| SCVTF $6, R24, F28 -9dde029e| SCVTF $9, R20, F29 -57d1429e| SCVTF $12, R10, F23 -d600221e| SCVTFWS R6, F22 -c503621e| SCVTFWD R30, F5 -3303229e| SCVTFS R25, F19 -0003629e| SCVTFD R24, F0 -6f01075e| SHA1C V7.S4, V11, V15 -9308285e| SHA1H V4, V19 -b420105e| SHA1M V16.S4, V5, V20 -f4131f5e| SHA1P V31.S4, V31, V20 -dc311f5e| SHA1SU0 V31.S4, V14.S4, V28.S4 -bb1a285e| SHA1SU1 V21.S4, V27.S4 -2753075e| SHA256H2 V7.S4, V25, V7 -3141065e| SHA256H V6.S4, V9, V17 -172b285e| SHA256SU0 V24.S4, V23.S4 -bb621b5e| SHA256SU1 V27.S4, V21.S4, V27.S4 -7005644e| VSHADD V4.H8, V11.H8, V16.H8 -2d870e0f| VSHRN $2, V25.H8, V13.B8 -ac86024f| VMOVI $85, V12.H8 -1c26a50e| VSHSUB V5.S2, V16.S2, V28.S2 -db576b6f| VSLI $43, V30.D2, V27.D2 -c3652c4e| VSMAX V12.B16, V14.B16, V3.B16 -b5a7ab0e| VSMAXP V11.S2, V29.S2, V21.S2 -f1aeb34e| VSMINP V19.S4, V23.S4, V17.S4 -87a8b14e| VSMINV V4.S4, V7 -1e21bc4f| VSMLAL2 V28.S[1], V8.S4, V30.D2 -50a33a0e| VSMLSL V26.B8, V26.B8, V16.H8 -4e2d1a0e| SMOVW V10.H[6], R14 -9ba9b30f| VSMULL V19.S[3], V12.S2, V27.D2 -417a205e| VSQABS V18, V1 -9f78a04e| VSQABS V4.S4, V31.S4 -580d2e5e| VSQADD V14, V10, V24 -3d30764f| VSQDMLAL2 V6.H[3], V1.H8, V29.S4 -9591b25e| VSQDMLAL V18, V12, V21 -0d92670e| VSQDMLAL V7.H4, V16.H4, V13.S4 -90b1765e| VSQDMLSL V22, V12, V16 -83c2ad5f| VSQDMULH V13.S[1], V20, V3 -bbb7aa5e| VSQDMULH V10, V29, V27 -c8b99a5f| VSQDMULL V26.S[2], V14, V8 -75b3920f| VSQDMULL V18.S[0], V27.S2, V21.D2 -86d1b75e| VSQDMULL V23, V12, V6 -edd06f4e| VSQDMULL2 V15.H8, V7.H8, V13.S4 -0f7ae07e| VSQNEG V16, V15 -e87b602e| VSQNEG V31.H4, V8.H4 -ecb5a92e| VSQRDMULH V9.S2, V15.S2, V12.S2 -d75fba5e| VSQRSHL V26, V30, V23 -f75f324e| VSQRSHL V18.B16, V31.B16, V23.B16 -af9c114f| VSQRSHRN2 $15, V5.S4, V15.H8 -318d2f6f| VSQRSHRUN2 $17, V9.D2, V17.S4 -b3757c5f| VSQSHL $60, V13, V19 -0c776f4f| VSQSHL $47, V24.D2, V12.D2 -d84c2a5e| VSQSHL V10, V6, V24 -ae4e704e| VSQSHL V16.H8, V21.H8, V14.H8 -b566727f| VSQSHLU $50, V21, V21 -4566596f| VSQSHLU $25, V18.D2, V5.D2 -d595140f| VSQSHRN $12, V14.S4, V21.H4 -00940b4f| VSQSHRN2 $5, V0.H8, V0.B16 -5384352f| VSQSHRUN $11, V2.D2, V19.S2 -1a2e3d5e| VSQSUB V29, V16, V26 -b02e6b4e| VSQSUB V11.H8, V21.H8, V16.H8 -1249a15e| VSQXTN V8, V18 -eb49610e| VSQXTN V15.S4, V11.H4 -cb4a614e| VSQXTN2 V22.S4, V11.H8 -102b217e| VSQXTUN V24, V16 -492a212e| VSQXTUN V18.H8, V9.B8 -112a616e| VSQXTUN2 V16.S4, V17.H8 -6c16ae4e| VSRHADD V14.S4, V19.S4, V12.S4 -5946467f| VSRI $58, V18, V25 -21460a2f| VSRI $6, V17.B8, V1.B8 -9f56b10e| VSRSHL V17.S2, V20.S2, V31.S2 -e724635f| VSRSHR $29, V7, V7 -e8266b4f| VSRSHR $21, V23.D2, V8.D2 -2b37180f| VSRSRA $8, V25.H4, V11.H4 -1644f95e| VSSHL V25, V0, V22 -3644fc4e| VSSHL V28.D2, V1.D2, V22.D2 -d9a61f4f| VSSHLL2 $15, V22.H8, V25.S4 -9b075e5f| VSSHR $34, V28, V27 -2c044c4f| VSSHR $52, V1.D2, V12.D2 -d915324f| VSSRA $14, V14.S4, V25.S4 -de21260e| VSSUBL V6.B8, V14.B8, V30.H8 -c720254e| VSSUBL2 V5.B16, V6.B16, V7.H8 -9d33b90e| VSSUBW V25.S2, V28.D2, V29.D2 -7e71000c| VST1 [V30.B8], (R11) -cca6000c| VST1 [V12.H4, V13.H4], (R22) -5467000c| VST1 [V20.H4, V21.H4, V22.H4], (R26) -cc28004c| VST1 [V12.S4, V13.S4, V14.S4, V15.S4], (R6) -9e7e9f4c| VST1.P [V30.D2], 16(R20) -4b769d0c| VST1.P [V11.H4], (R18)(R29) -adaa9f0c| VST1.P [V13.S2, V14.S2], 16(R21) -bca7844c| VST1.P [V28.H8, V29.H8], (R29)(R4) -b5659f0c| VST1.P [V21.H4, V22.H4, V23.H4], 24(R13) -e669874c| VST1.P [V6.S4, V7.S4, V8.S4], (R15)(R7) -9b2a9f0c| VST1.P [V27.S2, V28.S2, V29.S2, V30.S2], 32(R20) -14278b0c| VST1.P [V20.H4, V21.H4, V22.H4, V23.H4], (R24)(R11) -d002004d| VST1 V16.B[8], (R22) -9780004d| VST1 V23.S[2], (R4) -7787004d| VST1 V23.D[1], (R27) -850d9f0d| VST1.P V5.B[3], 1(R12) -7b1f8f0d| VST1.P V27.B[7], (R27)(R15) -7a5a9f4d| VST1.P V26.H[7], 2(R19) -e14b9e4d| VST1.P V1.H[5], (RSP)(R30) -dd819f4d| VST1.P V29.S[2], 4(R14) -a281910d| VST1.P V2.S[0], (R13)(R17) -b2849f0d| VST1.P V18.D[0], 8(R5) -c484964d| VST1.P V4.D[1], (R6)(R22) -f686004c| VST2 (R23), [V22.H8, V23.H8] -2e869f0c| VST2 16(R17), [V14.H4, V15.H4] -d200200d| ST2 (R6), [V18.B, V19.B][0] -ab58200d| ST2 (R5), [V11.H, V12.H][3] -c491204d| ST2 (R14), [V4.S, V5.S][3] -5a85204d| ST2 (R10), [V26.D, V27.D][1] -f217bf0d| ST2 2(RSP), [V18.B, V19.B][5] -2b0ea04d| ST2 (R17)(R0), [V11.B, V12.B][11] -4042bf0d| ST2 4(R18), [V0.H, V1.H][0] -9342af4d| ST2 (R20)(R15), [V19.H, V20.H][4] -9b91bf4d| ST2 8(R12), [V27.S, V28.S][3] -7480a10d| ST2 (R3)(R1), [V20.S, V21.S][0] -c884bf0d| ST2 16(R6), [V8.D, V9.D][0] -ae86ac4d| ST2 (R21)(R12), [V14.D, V15.D][1] -614d004c| VST3 (R11), [V1.D2, V2.D2, V3.D2] -324b9f4c| VST3 48(R25), [V18.S4, V19.S4, V20.S4] -7340870c| VST3 (R3)(R7), [V19.B8, V20.B8, V21.B8] -ac24004d| ST3 (R5), [V12.B, V13.B, V14.B][9] -a161004d| ST3 (R13), [V1.H, V2.H, V3.H][4] -09b1004d| ST3 (R8), [V9.S, V10.S, V11.S][3] -78a7004d| ST3 (R27), [V24.D, V25.D, V26.D][1] -4f349f0d| ST3 3(R2), [V15.B, V16.B, V17.B][5] -643d840d| ST3 (R11)(R4), [V4.B, V5.B, V6.B][7] -48699f0d| ST3 6(R10), [V8.H, V9.H, V10.H][1] -85b19f4d| ST3 12(R12), [V5.S, V6.S, V7.S][3] -60a18a0d| ST3 (R11)(R10), [V0.S, V1.S, V2.S][0] -69a49f0d| ST3 24(R3), [V9.D, V10.D, V11.D][0] -ada7814d| ST3 (R29)(R1), [V13.D, V14.D, V15.D][1] -760c004c| VST4 (R3), [V22.D2, V23.D2, V24.D2, V25.D2] -ee0d9f4c| VST4 64(R15), [V14.D2, V15.D2, V16.D2, V17.D2] -7800970c| VST4 (R3)(R23), [V24.B8, V25.B8, V26.B8, V27.B8] -a221200d| ST4 (R13), [V2.B, V3.B, V4.B, V5.B][0] -9a69204d| ST4 (R12), [V26.H, V27.H, V28.H, V29.H][5] -02a1204d| ST4 (R8), [V2.S, V3.S, V4.S, V5.S][2] -3fa6200d| ST4 (R17), [V31.D, V0.D, V1.D, V2.D][0] -943abf0d| ST4 4(R20), [V20.B, V21.B, V22.B, V23.B][6] -bf26a60d| ST4 (R21)(R6), [V31.B, V0.B, V1.B, V2.B][1] -55b3bf4d| ST4 16(R26), [V21.S, V22.S, V23.S, V24.S][3] -dda1b04d| ST4 (R14)(R16), [V29.S, V30.S, V31.S, V0.S][2] -6aa5bf0d| ST4 32(R11), [V10.D, V11.D, V12.D, V13.D][0] -e7a7ac0d| ST4 (RSP)(R12), [V7.D, V8.D, V9.D, V10.D][0] -f9c9202c| VSTNP -252(R15), V18, V25 -18b8316c| VSTNP -232(R0), V14, V24 -409c1cac| VSTNP 912(R2), V7, V0 -73f0812c| STP.P (V19, V28), 12(R3) -28d0826c| STP.P (V8, V20), 40(R1) -9bf5bfac| STP.P (V27, V29), -16(R12) -885ead2d| STP.W (V8, V23), -152(R20) -b0de926d| STP.W (V16, V23), 296(R21) -713387ad| STP.W (V17, V12), 224(R27) -52130a2d| STP (V18, V4), 80(R26) -b63a236d| STP (V22, V14), -464(R21) -6d5424ad| STP (V13, V21), -896(R3) -afb60f3c| MOVD.P V15, 251(R21) -81e7077c| MOVD.P V1, 126(R28) -203713bc| FMOVS.P F0, -205(R25) -60c61ffc| FMOVD.P F0, -4(R19) -d256813c| MOVD.P V18, 21(R22) -ffce083c| MOVD.W V31, 140(R23) -6d3d017c| MOVD.W V13, 19(R11) -52ed01bc| FMOVS.W F18, 30(R10) -fafd11fc| FMOVD.W F26, -225(R15) -663e9b3c| MOVD.W V6, -77(R19) -7d0c393d| MOVD V29, 3651(R3) -8f50067d| MOVD V15, 808(R4) -94680dbd| FMOVS F20, 3432(R4) -b7673bfd| FMOVD F23, 30408(R29) -fed3a63d| MOVD V30, 39744(RSP) -8a6a243c| MOVD V10, (R20)(R4) -29493fbc| FMOVS F9, (R9)(ZR.UXTW) -8bd93bfc| FMOVD F11, (R12)(R27.SXTW<<3) -c768a93c| MOVD V7, (R6)(R9) -a7b00a3c| MOVD V7, 171(R5) -40e3107c| MOVD V0, -242(R26) -18911fbc| FMOVS F24, -7(R8) -fcc007fc| FMOVD F28, 124(R7) -db12893c| MOVD V27, 145(R22) -1686716e| VSUB V17.H8, V16.H8, V22.H8 -5362320e| VSUBHN V18.H8, V18.H8, V19.B8 -6163bf4e| VSUBHN2 V31.D2, V27.D2, V1.S4 -a73be05e| VSUQADD V29, V7 -21a4100f| VSXTL V1.H4, V1.S4 -8b23164e| VTBL V22.B16, [V28.B16, V29.B16], V11.B16 -3642120e| VTBL V18.B8, [V17.B16, V18.B16, V19.B16], V22.B8 -cf611f0e| VTBL V31.B8, [V14.B16, V15.B16, V16.B16, V17.B16], V15.B8 -0b020e4e| VTBL V14.B16, [V16.B16], V11.B16 -9830014e| VTBX V1.B16, [V4.B16, V5.B16], V24.B16 -1452044e| VTBX V4.B16, [V16.B16, V17.B16, V18.B16], V20.B16 -b4711a0e| VTBX V26.B8, [V13.B16, V14.B16, V15.B16, V16.B16], V20.B8 -f911140e| VTBX V20.B8, [V15.B16], V25.B8 -9f28500e| VTRN1 V16.H4, V4.H4, V31.H4 -2e69c64e| VTRN2 V6.D2, V9.D2, V14.D2 -c752756e| VUABAL2 V21.H8, V22.H8, V7.S4 -8675696e| VUABD V9.H8, V12.H8, V6.H8 -a973ab6e| VUABDL2 V11.S4, V29.S4, V9.D2 -fa006c2e| VUADDL V12.H4, V7.H4, V26.S4 -da00236e| VUADDL2 V3.B16, V6.B16, V26.H8 -ab3a306e| VUADDLV V21.B16, V11 -a312746e| VUADDW2 V20.H8, V21.S4, V3.S4 -cee55e7f| UCVTF $34, F14, F14 -8edb617e| UCVTFDD F28, F14 -ab8f431e| UCVTF $29, R29, F11 -68b3039e| UCVTF $20, R27, F8 -7686439e| UCVTF $31, R19, F22 -2a03231e| UCVTFWS R25, F10 -9f01631e| UCVTFWD R12, F31 -a800239e| UCVTFS R5, F8 -0302639e| UCVTFD R16, F3 -df65a42e| VUMAX V4.S2, V14.S2, V31.S2 -29ab702e| VUMAXV V25.H4, V9 -6f6e2e6e| VUMIN V14.B16, V19.B16, V15.B16 -fdada32e| VUMINP V3.S2, V15.S2, V29.S2 -07289a6f| VUMLAL2 V26.S[2], V0.S4, V7.D2 -aa80ad2e| VUMLAL V13.S2, V5.S2, V10.D2 -d66b462f| VUMLSL V6.H[4], V30.H4, V22.S4 -12a3b62e| VUMLSL V22.S2, V24.S2, V18.D2 -583e0d0e| VMOV V18.B[6], R24 -20c3b52e| VUMULL V21.S2, V25.S2, V0.D2 -20c2616e| VUMULL2 V1.H8, V17.H8, V0.S4 -2f0f6d7e| VUQADD V13, V25, V15 -a60c272e| VUQADD V7.B8, V5.B8, V6.B8 -5b5da27e| VUQRSHL V2, V10, V27 -195c786e| VUQRSHL V24.H8, V0.H8, V25.H8 -209e282f| VUQRSHRN $24, V17.D2, V0.S2 -e89e3b6f| VUQRSHRN2 $5, V23.D2, V8.S4 -4f75147f| VUQSHL $4, V10, V15 -d2767d6f| VUQSHL $61, V22.D2, V18.D2 -bb4cfe7e| VUQSHL V30, V5, V27 -794ea42e| VUQSHL V4.S2, V19.S2, V25.S2 -51960b7f| VUQSHRN $5, V18, V17 -642ce77e| VUQSUB V7, V3, V4 -6149617e| VUQXTN V11, V1 -4e48a12e| VUQXTN V2.D2, V14.S2 -9cc8a14e| VURECPE V4.S4, V28.S4 -2f15a52e| VURHADD V5.S2, V9.S2, V15.S2 -5757fb7e| VURSHL V27, V26, V23 -2756706e| VURSHL V16.H8, V17.H8, V7.H8 -a424487f| VURSHR $56, V5, V4 -b926796f| VURSHR $7, V21.D2, V25.D2 -1336076f| VBIC $(240<<8), V19.S4 -e347e06e| VUSHL V0.D2, V31.D2, V3.D2 -f7a5272f| VUSHLL $7, V15.S2, V23.D2 -9ba63d6f| VUSHLL2 $29, V20.S4, V27.D2 -d405737f| VUSHR $13, V14, V20 -3a05116f| VUSHR $15, V9.H8, V26.H8 -1d39607e| VUSQADD V8, V29 -0e39e06e| VUSQADD V8.D2, V14.D2 -8022b02e| VUSUBL V16.S2, V20.S2, V0.D2 -9a20786e| VUSUBL2 V24.H8, V4.H8, V26.S4 -df33692e| VUSUBW V9.H4, V30.S4, V31.S4 -92a5102f| VUXTL V12.H4, V18.S4 -0e19464e| VUZP1 V6.H8, V8.H8, V14.H8 -7629610e| VXTN V11.S4, V22.H4 -7338504e| VZIP1 V16.H8, V3.H8, V19.H8 -357bd64e| VZIP2 V22.D2, V25.D2, V21.D2 -63020f1a| ADCW R15, R19, R3 -1f03159a| ADC R21, R24, ZR -d300103a| ADCSW R16, R6, R19 -1b0010ba| ADCS R16, R0, R27 -dd133f0b| ADDW ZR.UXTB<<4, R30, R29 -89c42f8b| ADD R15.SXTW<<1, R4, R9 -4e242a11| ADDW $2697, R2, R14 -e1c12f2b| ADDSW R15.SXTW, R15, R1 -733421ab| ADDS R1.UXTH<<5, R3, R19 -0ccc5aab| ADDS R26>>51, R0, R12 -2e122612| ANDW $2080374784, R17, R14 -5e4c2992| AND $-36020000934328321, R2, R30 -2805410a| ANDW R1>>1, R9, R8 -ede1938a| AND R19->56, R15, R13 -e7c10f72| ANDSW $33686018, R15, R7 -23ed55f2| ANDS $-8246337208321, R9, R3 -e6935bea| ANDS R27>>36, ZR, R6 -0e2ac61a| ASRW R6, R16, R14 -802ad59a| ASR R21, R20, R0 -7cfd7793| ASR $55, R11, R28 -f028cd1a| ASRW R13, R7, R16 -132bd29a| ASR R18, R24, R19 -c2560e54| BCS 29366(PC) -83516b17| JMP -9743997(PC) -7a571233| BFXILW $18, R27, $4, R26 -71b858b3| BFXIL $24, R3, $23, R17 -c3964bb3| BFXIL $11, R22, $27, R3 -eb561233| BFXILW $18, R23, $4, R11 -063f5db3| BFI $35, R24, $16, R6 -0a337a0a| BICW R26>>12, R24, R10 -2a71e28a| BIC R2@>28, R9, R10 -c168bf6a| BICSW ZR->26, R6, R1 -d8bb3cea| BICS R28<<46, R30, R24 -82e81795| CALL 18344066(PC) -40033fd6| CALL (R26) -c0011fd6| JMP (R14) -00dd31d4| BRK $36584 -7267db35| CBNZW R18, -74949(PC) -e44c7fb5| CBNZ R4, 260711(PC) -9dc4c334| CBZW R29, -123356(PC) -376eceb4| CBZ R23, -101519(PC) -a6cb563a| CCMNW GT, R29, $22, $6 -87db55ba| CCMN LE, R28, $21, $7 -a042493a| CCMNW MI, R21, R9, $0 -6a0040ba| CCMN EQ, R3, R0, $10 -46bb5c7a| CCMPW LT, R26, $28, $6 -c72942fa| CCMP HS, R14, $2, $7 -cda1427a| CCMPW GE, R14, R2, $13 -a1314dfa| CCMP LO, R13, R13, $1 -8706931a| CSINCW EQ, R20, R19, R7 -3ae69a9a| CSINC AL, R17, R26, R26 -9e51945a| CSINVW PL, R12, R20, R30 -d5e386da| CSINV AL, R30, R6, R21 -5f3503d5| CLREX $5 -e515c05a| CLSW R15, R5 -a815c0da| CLS R13, R8 -4a12c05a| CLZW R18, R10 -3c10c0da| CLZ R1, R28 -ff70252b| CMNW R5.UXTX<<4, R7 -9fa133ab| CMN R19.SXTH, R12 -3f3a822b| CMNW R2->14, R17 -df1d44ab| CMN R4>>7, R14 -3f95386b| CMPW R24.SXTB<<5, R9 -9f653feb| CMP ZR.UXTX<<1, R12 -1626915a| CSNEGW HS, R16, R17, R22 -b4d587da| CSNEG LE, R13, R7, R20 -9841d41a| CRC32B R20, R12, R24 -ec45d01a| CRC32H R16, R15, R12 -8048ca1a| CRC32W R10, R4, R0 -d44ec19a| CRC32X R1, R22, R20 -1552d31a| CRC32CB R19, R16, R21 -4b54c71a| CRC32CH R7, R2, R11 -245ad41a| CRC32CW R20, R17, R4 -c35cc89a| CRC32CX R8, R6, R3 -14219f1a| CSELW HS, R8, ZR, R20 -9c73979a| CSEL VC, R28, R23, R28 -e7279f1a| CSETW LO, R7 -ec579f9a| CSET MI, R12 -e5f39f5a| CSINVW AL, ZR, ZR, R5 -e8639fda| CSETM VC, R8 -ea76971a| CINCW VS, R23, R10 -78a7859a| CSINC GE, R27, R5, R24 -b590845a| CSINVW LS, R5, R4, R21 -b4029eda| CSINV EQ, R21, R30, R20 -b3969b5a| CSNEGW LS, R21, R27, R19 -938591da| CSNEG HI, R12, R17, R19 -016ea8d4| DCPS1 $17264 -0275a4d4| DCPS2 $9128 -a3e9a6d4| DCPS3 $14157 -bf3903d5| DMB $9 -e003bfd6| DRPS -9f3e03d5| DSB $14 -50b1a0ca| EON R0->44, R10, R16 -c0b02f52| EORW $1073627134, R6, R0 -4b0c1ed2| EOR $257698037820, R2, R11 -693c074a| EORW R7<<15, R3, R9 -113e1aca| EOR R26<<15, R16, R17 -e0039fd6| ERET -fef8c693| EXTR $62, R6, R7, R30 -3f2003d5| YIELD -3f2403d5| HINT $33 -c0425ad4| HLT $53782 -df3003d5| ISB $0 -f7fddf88| LDARW (R15), R23 -96fedfc8| LDAR (R20), R22 -11fedf08| LDARB (R16), R17 -c2fedf48| LDARH (R22), R2 -2d927f88| LDAXPW (R17), (R13, R4) -198f7fc8| LDAXP (R24), (R25, R3) -46ff5f88| LDAXRW (R26), R6 -81fe5fc8| LDAXR (R20), R1 -86fe5f08| LDAXRB (R20), R6 -78ff5f48| LDAXRH (R27), R24 -35864a28| LDNPW 84(R17), R1, R21 -6da05fa8| LDNP 504(R3), R8, R13 -a8f9f428| LDP.P -92(R13), (R8, R30) -b749e3a8| LDP.P -464(R13), (R23, R18) -bdedd929| LDP.W 204(R13), (R29, R27) -c8e5c6a9| LDP.W 104(R14), (R8, R25) -c0857f29| LDP -4(R14), (R0, R1) -388a6ca9| LDP -312(R17), (R24, R2) -086be468| LDPSW -224(R24), R26, R8 -d107d269| LDPSW 144(R30), R1, R17 -738e4e69| LDPSW 116(R19), R3, R19 -6ee55fb8| MOVWU.P -2(R11), R14 -233459f8| MOVD.P -109(R1), R3 -919f44b8| MOVWU.W 73(R28), R17 -acdd45f8| MOVD.W 93(R13), R12 -e1cd51b9| MOVWU 4556(R15), R1 -95e27bf9| MOVD 30656(R20), R21 -0c554b38| MOVBU.P 181(R8), R12 -054f5938| MOVBU.W -108(R24), R5 -1f206539| MOVBU 2376(R0), ZR -73796a38| MOVBU (R11)(R10), R19 -a8b74f78| MOVHU.P 251(R29), R8 -021e5e78| MOVHU.W -31(R16), R2 -ec126b79| MOVHU 5512(R23), R12 -fc5a6178| MOVHU (R23)(R1.UXTW<<1), R28 -eaf6c238| MOVBW.P 47(R23), R10 -87679838| MOVB.P -122(R28), R7 -567fdb38| MOVBW.W -73(R26), R22 -3b2e8138| MOVB.W 18(R17), R27 -7d74c039| MOVBW 29(R3), R29 -7d1f8539| MOVB 327(R27), R29 -225bff38| MOVBW (R25)(ZR.UXTW), R2 -6a7bed38| MOVBW (R27)(R13), R10 -0f69b538| MOVB (R8)(R21), R15 -c796cc78| MOVHW.P 201(R22), R7 -50268e78| MOVH.P 226(R18), R16 -229ddb78| MOVHW.W -71(R9), R2 -0f4f9178| MOVH.W -236(R24), R15 -59ecc379| MOVHW 502(R2), R25 -83d49679| MOVH 2922(R4), R3 -986be878| MOVHW (R28)(R8), R24 -cad8bf78| MOVH (R6)(ZR.SXTW<<1), R10 -6b4693b8| MOVW.P -204(R19), R11 -cb9e81b8| MOVW.W 25(R22), R11 -280d9eb9| MOVW 7692(R9), R8 -1a68b8b8| MOVW (R0)(R24), R26 -35b955b8| LDTRW -165(R9), R21 -658b57f8| LDTR -136(R27), R5 -b3594038| LDTRBW 5(R13), R19 -5ac95d78| LDTRH -36(R10), R26 -2c3ade38| LDTRSBW -29(R17), R12 -4de99038| LDTRSB -242(R10), R13 -e178c378| LDTRSHW 55(R7), R1 -a77a8778| LDTRSH 119(R21), R7 -cde982b8| LDTRSW 46(R14), R13 -04d15bb8| LDURW -67(R8), R4 -02a256f8| LDUR -150(R16), R2 -97405438| LDURBW -188(R4), R23 -99b14b78| LDURHW 187(R12), R25 -f9a1cf38| LDURSBW 250(R15), R25 -c0218c38| LDURSB 194(R14), R0 -5790d278| LDURSHW -215(R2), R23 -a3808278| LDURSH 40(R5), R3 -a9b08fb8| LDURSW 251(R5), R9 -98217f88| LDXPW (R12), (R24, R8) -4d6a7fc8| LDXP (R18), (R13, R26) -9c7e5f88| LDXRW (R20), R28 -0e7c5fc8| LDXR (R0), R14 -507c5f08| LDXRB (R2), R16 -ea7f5f48| LDXRH (RSP), R10 -5523dd1a| LSLW R29, R26, R21 -9721ca9a| LSL R10, R12, R23 -75665bd3| UBFIZ $37, R19, $26, R21 -0a20df1a| LSLW ZR, R0, R10 -5222c99a| LSL R9, R18, R18 -5124df1a| LSRW ZR, R2, R17 -6b26d69a| LSR R22, R19, R11 -9a7c0753| LSRW $7, R4, R26 -7bfd53d3| LSR $19, R11, R27 -5f26d91a| LSRW R25, R18, ZR -3625d89a| LSR R24, R9, R22 -9d76001b| MADDW R0, R29, R20, R29 -822f0e9b| MADD R14, R11, R28, R2 -e8fe101b| MNEGW R16, R23, R8 -88fc099b| MNEG R9, R4, R8 -dd030011| ADDW $0, R30, R29 -db010091| ADD $0, R14, R27 -0c6db012| MOVW $2090336255, R12 -3ff5aa92| MOVD $-1470693377, ZR -87f0f6d2| MOVD $-5223049667842932736, R7 -f3571132| ORRW $4294934559, ZR, R19 -f3bb0bb2| MOVD $-4503668347895825, R19 -f103082a| MOVW R8, R17 -ef031faa| MOVD ZR, R15 -4a6bf5f2| MOVK $(43866<<48), R10 -383b9312| MOVW $4294927910, R24 -f5fb9092| MOVD $-34784, R21 -d5b4b052| MOVW $2242248704, R21 -fdc5eed2| MOVD $8516025420380897280, R29 -c58435d5| MRS $11302, R5 -1a0f13d5| MSR R26, S2_3_C0_C15_0 -52d5181b| MSUBW R24, R21, R10, R18 -c4f81d9b| MSUB R29, R30, R6, R4 -a57c1b1b| MULW R27, R5, R5 -8f7f0a9b| MUL R10, R28, R15 -e75361aa| MVN R1>>20, R7 -e0cb15cb| NEG R21<<50, R0 -ffdb49eb| CMP R9>>54, ZR -f5031c5a| NGCW R28, R21 -e6031eda| NGC R30, R6 -e103077a| NGCSW R7, R1 -f20301fa| NGCS R1, R18 -1f2003d5| NOP -9347722a| ORNW R18>>17, R28, R19 -0591e1aa| ORN R1@>36, R8, R5 -7ba82a32| ORRW $4290904001, R3, R27 -ae087db2| ORR $56, R5, R14 -9608472a| ORRW R7>>2, R4, R22 -c40dc5aa| ORR R5@>3, R14, R4 -9d83bcf9| PRFM 30976(R28), $29 -78ab03d8| PRFM 7515(PC), $24 -6e9186f8| PRFUM 105(R11), $14 -c001c05a| RBITW R14, R0 -4203c0da| RBIT R26, R2 -c0035fd6| RET -9b08c05a| REVW R4, R27 -740cc0da| REV R3, R20 -0205c05a| REV16W R8, R2 -dd07c0da| REV16 R30, R29 -020bc0da| REV32 R24, R2 -780cc0da| REV R3, R24 -9b7f9513| EXTRW $31, R21, R28, R27 -5243dd93| EXTR $16, R29, R26, R18 -822eca1a| RORW R10, R20, R2 -f02ddb9a| ROR R27, R15, R16 -082ed81a| RORW R24, R16, R8 -7b2cc39a| ROR R3, R3, R27 -3b030b5a| SBCW R11, R25, R27 -f2021dda| SBC R29, R23, R18 -e600127a| SBCSW R18, R7, R6 -cf030ffa| SBCS R15, R30, R15 -3a797793| SBFIZ $9, R9, $31, R26 -4a305193| SBFIZ $47, R2, $13, R10 -a1c74493| SBFX $4, R29, $46, R1 -a00fc01a| SDIVW R0, R29, R0 -f10edd9a| SDIV R29, R23, R17 -9f2003d5| SEV -bf2003d5| SEVL -a52d319b| SMADDL R17, R11, R13, R5 -b4fc399b| SMNEGL R25, R5, R20 -579e369b| SMSUBL R22, R7, R18, R23 -ea7e429b| SMULH R2, R23, R10 -eb7f219b| SMULL R1, ZR, R11 -f1fe9f88| STLRW R17, (R23) -edff9fc8| STLR R13, (RSP) -bffe9f08| STLRB ZR, (R21) -9cfd9f48| STLRH R28, (R12) -41bf2688| STLXPW (R1, R15), (R26), R6 -01e93cc8| STLXP (R1, R26), (R8), R28 -e0fd1f88| STLXRW R0, (R15), ZR -12fe17c8| STLXR R18, (R16), R23 -d4fc1008| STLXRB R20, (R6), R16 -befc0048| STLXRH R30, (R5), R0 -76613728| STNPW -72(R11), R24, R22 -c7523ba8| STNP -80(R22), R20, R7 -8e3a9f28| STP.P (R14, R14), 248(R20) -aa1fa6a8| STP.P (R10, R7), -416(R29) -fbae8d29| STP.W (R27, R11), 108(R23) -f63c80a9| STP.W (R22, R15), (R7) -43d73629| STP (R3, R21), -76(R26) -1ae01ba9| STP (R26, R24), 440(R0) -8f650cb8| MOVW.P R15, 198(R12) -aad503f8| MOVD.P R10, 61(R13) -ec4d00b8| MOVW.W R12, 4(R15) -7dbc1df8| MOVD.W R29, -37(R3) -9b0226b9| MOVW R27, 9728(R20) -91691af9| MOVD R17, 13520(R12) -20840838| MOVB.P R0, 136(R1) -060c1f38| MOVB.W R6, -16(R0) -2b213a39| MOVB R11, 3720(R9) -ab6b3438| MOVB R11, (R29)(R20) -50e51e78| MOVH.P R16, -18(R10) -5d5d1878| MOVH.W R29, -123(R10) -ea862379| MOVH R10, 4546(R23) -d65a2778| MOVH R22, (R22)(R7.UXTW<<1) -d5ca12b8| STTRW -212(R22), R21 -001b18f8| STTR -127(R24), R0 -290a1e38| STTRBW -32(R17), R9 -0b381078| STTRHW -253(R0), R11 -c78101b8| MOVW R7, 24(R14) -c0b217f8| MOVD R0, -133(R22) -f8401e38| MOVB R24, -28(R7) -5e911a78| MOVH R30, -87(R10) -b7622d88| STXPW (R23, R24), (R21), R13 -233d37c8| STXP (R3, R15), (R9), R23 -847d0088| STXRW R4, (R12), R0 -a27d0bc8| STXR R2, (R13), R11 -f27f1e08| STXRB R18, (RSP), R30 -3a7d1848| STXRH R26, (R9), R24 -d4dc204b| SUBW R0.SXTW<<7, R6, R20 -874023cb| SUB R3.UXTW, R4, R7 -44eb4f51| SUBW $(1018<<12), R26, R4 -17b012cb| SUB R18<<44, R0, R23 -ac1e376b| SUBSW R23.UXTB<<7, R21, R12 -b0483beb| SUBS R27.UXTW<<2, R5, R16 -d1f994eb| SUBS R20->62, R14, R17 -61d513d4| SVC $40619 -591d0013| SXTBW R10, R25 -9f1f4093| SXTB R28, ZR -773f0013| SXTHW R27, R23 -453c4093| SXTH R2, R5 -b77c4093| SXTW R5, R23 -743628d5| SYSL $13920, R20 -9f613672| TSTW $4294966279, R12 -1f8d22f2| TST $-4610630471158349821, R8 -ff6e93ea| TST R19->27, R23 -06997ed3| UBFIZ $2, R8, $39, R6 -5dd054d3| UBFX $20, R2, $33, R29 -a54273d3| UBFIZ $13, R21, $17, R5 -7d08d11a| UDIVW R17, R3, R29 -120acf9a| UDIV R15, R16, R18 -1401a89b| UMADDL R8, R0, R8, R20 -08feb29b| UMNEGL R18, R16, R8 -eeb0b99b| UMSUBL R25, R12, R7, R14 -967fdd9b| UMULH R29, R28, R22 -947eb59b| UMULL R21, R20, R20 -7e1f0053| UXTBW R27, R30 -983c0053| UXTHW R4, R24 -5f2003d5| WFE -7f2003d5| WFI -3f2003d5| YIELD -02bb200e| VABS V24.B8, V2.B8 -0686ec4e| VADD V12.D2, V16.D2, V6.D2 -ea42ac0e| VADDHN V12.D2, V23.D2, V10.S2 -7d43624e| VADDHN2 V2.S4, V27.S4, V29.H8 -2cbd710e| VADDP V17.H4, V9.H4, V12.H4 -f5bab14e| VADDV V23.S4, V21 -8158284e| AESD V4.B16, V1.B16 -ba48284e| AESE V5.B16, V26.B16 -0c7a284e| AESIMC V16.B16, V12.B16 -3e6a284e| AESMC V17.B16, V30.B16 -091f384e| VAND V24.B16, V24.B16, V9.B16 -07b6046f| VBIC $(144<<8), V7.H8 -00c5006f| VMVNI $(8<<136), V0.S4 -f81e6c0e| VBIC V12.B8, V23.B8, V24.B8 -6f1ced2e| VBIF V13.B8, V3.B8, V15.B8 -e31da16e| VBIT V1.B16, V15.B16, V3.B16 -6a1d7c6e| VBSL V28.B16, V11.B16, V10.B16 -284a600e| VCLS V17.H4, V8.H4 -9a49202e| VCLZ V12.B8, V26.B8 -d78f706e| VCMEQ V16.H8, V30.H8, V23.H8 -7798e05e| VCMEQ $0, V3, V23 -739a200e| VCMEQ $0, V19.B8, V19.B8 -ff3f2b4e| VCMGE V11.B16, V31.B16, V31.B16 -5337370e| VCMGT V23.B8, V26.B8, V19.B8 -3489604e| VCMGT $0, V9.H8, V20.H8 -083d782e| VCMHS V24.H4, V8.H4, V8.H4 -c899e07e| VCMLE $0, V14, V8 -3498a06e| VCMLE $0, V1.S4, V20.S4 -ebaa200e| VCMLT $0, V23.B8, V11.B8 -408dfe4e| VCMTST V30.D2, V10.D2, V0.D2 -0e06085e| VMOV V16.D[0], V14 -1e0d0d0e| VDUP R8, V30.B8 -8e1d3a6e| VEOR V26.B16, V12.B16, V14.B16 -632a086e| VEXT $5, V8.B16, V19.B16, V3.B16 -97d7e57e| FABD F5, F28, F23 -6bd4a82e| VFABD V8.S2, V3.S2, V11.S2 -f7faa00e| FABS V23.S2, V23.S2 -54c2201e| FABSS F18, F20 -3ec3601e| FABSD F25, F30 -2aee317e| FACGE F17, F17, F10 -2fed392e| VFACGE V25.S2, V9.S2, V15.S2 -2befe97e| FACGT F9, F25, F11 -65eced6e| VFACGT V13.D2, V3.D2, V5.D2 -55d53c4e| FADD V28.S4, V10.S4, V21.S4 -8b283f1e| FADDS F31, F4, F11 -d828601e| FADDD F0, F6, F24 -e9d8307e| FADDP V7.S2, F9 -4084391e| FCCMPS HI, F25, F2, $0 -ef046d1e| FCCMPD EQ, F13, F7, $15 -d7a4241e| FCCMPES GE, F4, F6, $7 -dbf5601e| FCCMPED AL, F0, F14, $11 -77e7625e| FCMEQ F2, F27, F23 -2de67f4e| VFCMEQ V31.D2, V17.D2, V13.D2 -59daa05e| FCMEQ $0, F18, F25 -add9a00e| VFCMEQ $0, V13.S2, V13.S2 -dce42d7e| FCMGE F13, F6, F28 -62e6776e| VFCMGE V23.D2, V19.D2, V2.D2 -f9cae07e| FCMGE $0, F23, F25 -18e5ab7e| FCMGT F11, F8, F24 -84e7ae6e| VFCMGT V14.S4, V28.S4, V4.S4 -a0c8e05e| FCMGT $0, F5, F0 -c6cae04e| VFCMGT $0, V22.D2, V6.D2 -4fdaa07e| FCMLE $0, F18, F15 -e1d9a02e| VFCMLE $0, V15.S2, V1.S2 -1ee9a05e| FCMLT $0, F8, F30 -23eaa04e| VFCMLT $0, V17.S4, V3.S4 -6023321e| FCMPS F18, F27 -2823391e| FCMPS $(0.0), F25 -00236d1e| FCMPD F13, F24 -e820601e| FCMPD $(0.0), F7 -3022381e| FCMPES F24, F17 -f8233e1e| FCMPES $(0.0), F31 -b0206a1e| FCMPED F10, F5 -3820691e| FCMPED $(0.0), F1 -d85f271e| FCSELS PL, F30, F7, F24 -ed8f7a1e| FCSELD HI, F31, F26, F13 -0042e21e| FCVTHS F16, F0 -efc1e21e| FCVTHD F15, F15 -edc1231e| FCVTSH F15, F13 -0ac0221e| FCVTSD F0, F10 -39c3631e| FCVTDH F25, F25 -da43621e| FCVTDS F30, F26 -10cb615e| FCVTAS F24, F16 -f400241e| FCVTASW F7, R20 -2f00249e| FCVTAS F1, R15 -1d02641e| FCVTASW F16, R29 -9303649e| FCVTAS F28, R19 -02ca217e| FCVTAU F16, F2 -afc8212e| VFCVTAU V5.S2, V15.S2 -6e02251e| FCVTAUW F19, R14 -fd02259e| FCVTAU F23, R29 -8603651e| FCVTAUW F28, R6 -4001659e| FCVTAU F10, R0 -1f78210e| VFCVTL V0.H4, V31.S4 -d179214e| VFCVTL2 V14.H8, V17.S4 -fdbb615e| FCVTMS F31, F29 -9601301e| FCVTMSW F12, R22 -f403309e| FCVTMS F31, R20 -6b02701e| FCVTMSW F19, R11 -4802709e| FCVTMS F18, R8 -84ba217e| FCVTMU F20, F4 -ae01311e| FCVTMUW F13, R14 -8402319e| FCVTMU F20, R4 -7403711e| FCVTMUW F27, R20 -2a03719e| FCVTMU F25, R10 -a36b210e| VFCVTN V29.S4, V3.H4 -5c6a214e| VFCVTN2 V18.S4, V28.H8 -78a9215e| FCVTNS F11, F24 -b1ab614e| VFCVTNS V29.D2, V17.D2 -0c01201e| FCVTNSW F8, R12 -b303209e| FCVTNS F29, R19 -c401601e| FCVTNSW F14, R4 -5200609e| FCVTNS F2, R18 -c2a8617e| FCVTNU F6, F2 -daab616e| VFCVTNU V30.D2, V26.D2 -d001211e| FCVTNUW F14, R16 -0402219e| FCVTNU F16, R4 -7800611e| FCVTNUW F3, R24 -e602619e| FCVTNU F23, R6 -74aaa15e| FCVTPS F19, F20 -c801281e| FCVTPSW F14, R8 -8f02289e| FCVTPS F20, R15 -6d02681e| FCVTPSW F19, R13 -bc00689e| FCVTPS F5, R28 -43aba17e| FCVTPU F26, F3 -cda9a12e| VFCVTPU V14.S2, V13.S2 -c102291e| FCVTPUW F22, R1 -9103299e| FCVTPU F28, R17 -7602691e| FCVTPUW F19, R22 -4501699e| FCVTPU F10, R5 -976a616e| VFCVTXN2 V20.D2, V23.S4 -d5fc575f| FCVTZS $41, F6, F21 -babaa15e| FCVTZSSS F21, F26 -7aa6181e| FCVTZS $23, F19, R26 -c410189e| FCVTZS $60, F6, R4 -4db5589e| FCVTZS $19, F10, R13 -9000381e| FCVTZSSW F4, R16 -1702389e| FCVTZSS F16, R23 -8a03781e| FCVTZSDW F28, R10 -d501789e| FCVTZSD F14, R21 -eefd2d7f| FCVTZU $19, F15, F14 -4dfc3c6f| FCVTZU $4, V2.S4, V13.S4 -96bbe17e| FCVTZUDD F28, F22 -30b8e16e| FCVTZU V1.D2, V16.D2 -fdef191e| FCVTZU $5, F31, R29 -1d7b199e| FCVTZU $34, F24, R29 -b8f5591e| FCVTZU $3, F13, R24 -5080599e| FCVTZU $32, F2, R16 -d002391e| FCVTZUSW F22, R16 -9b03399e| FCVTZUS F28, R27 -7501791e| FCVTZUDW F11, R21 -7603799e| FCVTZUD F27, R22 -06fe3c6e| FDIV V28.S4, V16.S4, V6.S4 -c41b201e| FDIVS F0, F30, F4 -1618781e| FDIVD F24, F0, F22 -507b0d1f| FMADDS F13, F30, F26, F16 -8803491f| FMADDD F9, F0, F28, F8 -75f7394e| FMAX V25.S4, V27.S4, V21.S4 -804b3c1e| FMAXS F28, F28, F0 -c1496c1e| FMAXD F12, F14, F1 -5b69371e| FMAXNMS F23, F10, F27 -1468711e| FMAXNMD F17, F0, F20 -a4c8707e| FMAXNMP V5.D2, F4 -89f9707e| FMAXP V12.D2, F9 -4af63e2e| VFMAXP V30.S2, V18.S2, V10.S2 -25fa306e| FMAXV V17.S4, F5 -01f4e04e| FMIN V0.D2, V0.D2, V1.D2 -59592a1e| FMINS F10, F10, F25 -3959611e| FMIND F1, F9, F25 -73c7ba4e| FMINNM V26.S4, V27.S4, V19.S4 -1279391e| FMINNMS F25, F8, F18 -75796c1e| FMINNMD F12, F11, F21 -90cbb07e| FMINNMP V28.S2, F16 -c5c8b06e| FMINNMV V6.S4, F5 -cdfbf07e| FMINP V30.D2, F13 -edf6f66e| VFMINP V22.D2, V23.D2, V13.D2 -6513b85f| FMLA V24.S[1], F27, F5 -ee18984f| VFMLA V24.S[2], V7.S4, V14.S4 -b85ab75f| FMLS V23.S[3], F21, F24 -a3f5030f| FMOV $0.90625, V3.S2 -eaf7056f| FMOV $-31., V10.D2 -3b41201e| FMOVS F9, F27 -0d41601e| FMOVD F8, F13 -9700271e| FMOVS R4, F23 -ad03261e| FMOVS F29, R13 -2302679e| FMOVD R17, F3 -e101af9e| FMOV R15, V1.D[1] -f301669e| FMOVD F15, R19 -1103ae9e| FMOV V24.D[1], R17 -0230321e| FMOVS $-4.25, F2 -18b0751e| FMOVD $-14.5, F24 -92bc1b1f| FMSUBS F27, F15, F4, F18 -f8e14a1f| FMSUBD F10, F24, F15, F24 -ef91d35f| FMULD V19.D[0], F15, F15 -d293c24f| FMUL V2.D[0], V30.D2, V18.D2 -18dd2b2e| FMUL V11.S2, V8.S2, V24.S2 -a4093d1e| FMULS F29, F13, F4 -94096f1e| FMULD F15, F12, F20 -fe918e7f| FMULX V14.S[0], F15, F30 -7199c56f| VFMULX V5.D[1], V11.D2, V17.D2 -32dc695e| FMULX F9, F1, F18 -c8f9e06e| FNEG V14.D2, V8.D2 -9c41211e| FNEGS F12, F28 -c443611e| FNEGD F30, F4 -e77f301f| FNMADDS F16, F31, F31, F7 -9f326c1f| FNMADDD F12, F12, F20, F31 -d9e92f1f| FNMSUBS F15, F26, F14, F25 -00ad711f| FNMSUBD F17, F11, F8, F0 -c889211e| FNMULS F1, F14, F8 -528b761e| FNMULD F22, F26, F18 -01d8e15e| FRECPE F0, F1 -9aff7e5e| FRECPS F30, F28, F26 -78fe2a4e| VFRECPS V10.S4, V19.S4, V24.S4 -01f9e15e| FRECPX F8, F1 -128b216e| FRINTA V24.S4, V18.S4 -b241261e| FRINTAS F13, F18 -a841661e| FRINTAD F13, F8 -799aa16e| FRINTI V19.S4, V25.S4 -1cc2271e| FRINTIS F16, F28 -93c2671e| FRINTID F20, F19 -1a40251e| FRINTMS F0, F26 -ac42651e| FRINTMD F21, F12 -5889214e| FRINTN V10.S4, V24.S4 -5740241e| FRINTNS F2, F23 -9443641e| FRINTND F28, F20 -4b89a10e| FRINTP V10.S2, V11.S2 -a0c1241e| FRINTPS F13, F0 -93c2641e| FRINTPD F20, F19 -d49b216e| FRINTX V30.S4, V20.S4 -df41271e| FRINTXS F14, F31 -8d41671e| FRINTXD F12, F13 -3998a10e| FRINTZ V1.S2, V25.S2 -fdc2251e| FRINTZS F23, F29 -abc2651e| FRINTZD F21, F11 -10dba17e| FRSQRTE F24, F16 -edd9e16e| VFRSQRTE V15.D2, V13.D2 -75ffe35e| FRSQRTS F3, F27, F21 -b4fdbe4e| VFRSQRTS V30.S4, V13.S4, V20.S4 -24f8a16e| FSQRT V1.S4, V4.S4 -b6c1211e| FSQRTS F13, F22 -c1c3611e| FSQRTD F30, F1 -ffd5b44e| FSUB V20.S4, V15.S4, V31.S4 -d438331e| FSUBS F19, F6, F20 -f038771e| FSUBD F23, F7, F16 -675e1a6e| VMOV V19.H[5], V7.H[6] -2a1c0a4e| VMOV R1, V10.H[2] -de7f400c| VLD1 (R30), [V30.D1] -4aa7404c| VLD1 (R26), [V10.H8, V11.H8] -5d61400c| VLD1 (R10), [V29.B8, V30.B8, V31.B8] -af21404c| VLD1 (R13), [V15.B16, V16.B16, V17.B16, V18.B16] -737edf0c| VLD1.P 8(R19), [V19.D1] -757dd10c| VLD1.P (R11)(R17), [V21.D1] -5ca3df4c| VLD1.P 32(R26), [V28.B16, V29.B16] -93a1ce0c| VLD1.P (R12)(R14), [V19.B8, V20.B8] -1c65df0c| VLD1.P 24(R8), [V28.H4, V29.H4, V30.H4] -4461d34c| VLD1.P (R10)(R19), [V4.B16, V5.B16, V6.B16] -b22edf4c| VLD1.P 64(R21), [V18.D2, V19.D2, V20.D2, V21.D2] -c12fcc4c| VLD1.P (R30)(R12), [V1.D2, V2.D2, V3.D2, V4.D2] -5a03400d| VLD1 (R26), V26.B[0] -8d93404d| VLD1 (R28), V13.S[3] -2186404d| VLD1 (R17), V1.D[1] -9604df4d| VLD1.P 1(R4), V22.B[9] -4a1dc94d| VLD1.P (R10)(R9), V10.B[15] -4852df4d| VLD1.P 2(R18), V8.H[6] -2582df4d| VLD1.P 4(R17), V5.S[2] -2191c84d| VLD1.P (R9)(R8), V1.S[3] -c284df4d| VLD1.P 8(R6), V2.D[1] -8f85ce0d| VLD1.P (R12)(R14), V15.D[0] -87cd400d| VLD1R (R12), [V7.D1] -3bc8df4d| VLD1R 4(R1), [V27.S4] -77c4dd4d| VLD1R (R3)(R29), [V23.H8] -5384404c| VLD2 (R2), [V19.H8, V20.H8] -ca87df0c| VLD2 16(R30), [V10.H4, V11.H4] -1280d70c| VLD2 (R0)(R23), [V18.B8, V19.B8] -4c0a604d| LD2 (R18), [V12.B, V13.B][10] -3080600d| LD2 (R1), [V16.S, V17.S][0] -6686600d| LD2 (R19), [V6.D, V7.D][0] -061eff0d| LD2 2(R16), [V6.B, V7.B][7] -db05fa0d| LD2 (R14)(R26), [V27.B, V28.B][1] -8a49ff4d| LD2 4(R12), [V10.H, V11.H][5] -bb59ec4d| LD2 (R13)(R12), [V27.H, V28.H][7] -5a82ff0d| LD2 8(R18), [V26.S, V27.S][0] -6180e30d| LD2 (R3)(R3), [V1.S, V2.S][0] -6485ff0d| LD2 16(R11), [V4.D, V5.D][0] -7c86ed4d| LD2 (R19)(R13), [V28.D, V29.D][1] -54c0604d| VLD2R (R2), [V20.B16, V21.B16] -fdcaff0d| VLD2R 8(R23), [V29.S2, V30.S2] -7bc5e40d| VLD2R (R11)(R4), [V27.H4, V28.H4] -b349404c| VLD3 (R13), [V19.S4, V20.S4, V21.S4] -cf46df4c| VLD3 48(R22), [V15.H8, V16.H8, V17.H8] -934acc4c| VLD3 (R20)(R12), [V19.S4, V20.S4, V21.S4] -2c33404d| LD3 (R25), [V12.B, V13.B, V14.B][12] -897a400d| LD3 (R20), [V9.H, V10.H, V11.H][3] -f9b2400d| LD3 (R23), [V25.S, V26.S, V27.S][1] -4aa7404d| LD3 (R26), [V10.D, V11.D, V12.D][1] -4e25df4d| LD3 3(R10), [V14.B, V15.B, V16.B][9] -7827c40d| LD3 (R27)(R4), [V24.B, V25.B, V26.B][1] -c4a3df4d| LD3 12(R30), [V4.S, V5.S, V6.S][2] -f0a1cf0d| LD3 (R15)(R15), [V16.S, V17.S, V18.S][0] -1ba7df0d| LD3 24(R24), [V27.D, V28.D, V29.D][0] -f7a7d50d| LD3 (RSP)(R21), [V23.D, V24.D, V25.D][0] -a9ed404d| VLD3R (R13), [V9.D2, V10.D2, V11.D2] -5aecdf4d| VLD3R 24(R2), [V26.D2, V27.D2, V28.D2] -bae9c74d| VLD3R (R13)(R7), [V26.S4, V27.S4, V28.S4] -5904404c| VLD4 (R2), [V25.H8, V26.H8, V27.H8, V28.H8] -743b604d| LD4 (R27), [V20.B, V21.B, V22.B, V23.B][14] -bda1600d| LD4 (R13), [V29.S, V30.S, V31.S, V0.S][0] -a3a4600d| LD4 (R5), [V3.D, V4.D, V5.D, V6.D][0] -2f3aff4d| LD4 4(R17), [V15.B, V16.B, V17.B, V18.B][14] -e73bef4d| LD4 (RSP)(R15), [V7.B, V8.B, V9.B, V10.B][14] -5d78ef0d| LD4 (R2)(R15), [V29.H, V30.H, V31.H, V0.H][3] -acb3ff0d| LD4 16(R29), [V12.S, V13.S, V14.S, V15.S][1] -a8b2f04d| LD4 (R21)(R16), [V8.S, V9.S, V10.S, V11.S][3] -75a7ff4d| LD4 32(R27), [V21.D, V22.D, V23.D, V24.D][1] -75a6ee4d| LD4 (R19)(R14), [V21.D, V22.D, V23.D, V24.D][1] -d8e3604d| VLD4R (R30), [V24.B16, V25.B16, V26.B16, V27.B16] -49e9ff0d| VLD4R 16(R10), [V9.S2, V10.S2, V11.S2, V12.S2] -81effc0d| VLD4R (R28)(R28), [V1.D1, V2.D1, V3.D1, V4.D1] -893e622c| VLDNP -240(R20), V15, V9 -f90e626c| VLDNP -480(R23), V3, V25 -b0224fac| VLDNP 480(R21), V8, V16 -9186de2c| LDP.P 244(R20), (V17, V1) -e820d06c| LDP.P 256(R7), (V8, V8) -417de8ac| LDP.P -768(R10), (V1, V31) -7969ed2d| LDP.W -152(R11), (V25, V26) -70c8c36d| LDP.W 56(R3), (V16, V18) -30b4c4ad| LDP.W 144(R1), (V16, V13) -a1857f2d| LDP -4(R13), (V1, V1) -f4ae786d| LDP -120(R23), (V20, V11) -998366ad| LDP -816(R28), (V25, V0) -7535453c| MOVD.P 83(R11), V21 -5465477c| MOVD.P 118(R10), V20 -a2b44bbc| FMOVS.P 187(R5), F2 -ab045bfc| FMOVD.P -80(R5), F11 -0515d43c| MOVD.P -191(R8), V5 -43ad413c| MOVD.W 26(R10), V3 -22cd4f7c| MOVD.W 252(R9), V2 -5fad44bc| FMOVS.W 74(R10), F31 -db7d5afc| FMOVD.W -89(R14), F27 -15ccd63c| MOVD.W -148(R0), V21 -95c34b3d| MOVD 752(R28), V21 -f5885e7d| MOVD 3908(R7), V21 -54db66bd| FMOVS 9944(R26), F20 -46ee78fd| FMOVD 29144(R18), F6 -0cc4e93d| MOVD 42768(R0), V12 -e1c4211c| FMOVS 69159(PC), F1 -2071c35c| FMOVD -124023(PC), F0 -ae79703c| MOVD (R13)(R16), V14 -38fb67bc| FMOVS (R25)(R7.SXTX<<2), F24 -3e6b6dfc| FMOVD (R25)(R13), F30 -a278ff3c| MOVD (R5)(ZR<<4), V2 -ed02563c| VLDUR -160(R23), V13 -01c0507c| VLDUR -244(R0), V1 -7fd24ebc| VLDUR 237(R19), V31 -7a734ffc| VLDUR 247(R27), V26 -d4a3dd3c| VLDUR -38(R30), V20 -1c97250e| VMLA V5.B8, V24.B8, V28.B8 -af97a12e| VMLS V1.S2, V29.S2, V15.S2 -2b061f5e| VMOV V17.B[15], V11 -805e086e| VMOV V20.D[1], V0.D[0] -d91fbc4e| VORR V28.B16, V30.B16, V25.B16 -a43f040e| VMOV V29.S[0], R4 -fbe6054f| VMOVI $183, V27.B16 -9b75024f| VORR $(76<<24), V27.S4 -8436020f| VORR $(84<<8), V4.S2 -19f5010f| FMOV $12., V25.S2 -02e5062f| VMOVI $-281470698520576, V2 -d6e5066f| VMOVI $-281470681743616, V22.D2 -be9c240e| VMUL V4.B8, V5.B8, V30.B8 -2659202e| VMVN V9.B8, V6.B8 -f394046f| VBIC $135, V19.H8 -d856056f| VBIC $(182<<16), V24.S4 -2f85022f| VMVNI $73, V15.H4 -24baa02e| VNEG V17.S2, V4.S2 -145b206e| VMVN V24.B16, V20.B16 -191fff4e| VORN V31.B16, V24.B16, V25.B16 -6f96004f| VORR $19, V15.H8 -a564020f| VMOVI $(69<<24), V5.S2 -ae1ead0e| VORR V13.B8, V21.B8, V14.B8 -f2e1e00e| VPMULL V0.D1, V15.D1, V18.Q1 -0d426e2e| VRADDHN V14.S4, V16.S4, V13.H4 -4443246e| VRADDHN2 V4.H8, V26.H8, V4.B16 -015b602e| VRBIT V24.B8, V1.B8 -4209202e| VREV32 V10.B8, V2.B8 -d109a04e| VREV64 V14.S4, V17.S4 -5a8e380f| VRSHRN $8, V18.D2, V26.S2 -438d234f| VRSHRN2 $29, V10.D2, V3.S4 -a861716e| VRSUBHN2 V17.S4, V13.S4, V8.H8 -017c2f0e| VSABA V15.B8, V0.B8, V1.B8 -5d51a90e| VSABAL V9.S2, V10.S2, V29.D2 -c076a04e| VSABD V0.S4, V22.S4, V0.S4 -2d722e0e| VSABDL V14.B8, V17.B8, V13.H8 -1f732e4e| VSABDL2 V14.B16, V24.B16, V31.H8 -c628604e| VSADDLP V6.H8, V6.S4 -103b704e| VSADDLV V24.H8, V16 -8f122f0e| VSADDW V15.B8, V20.H8, V15.H8 -30e6755f| SCVTF $11, F17, F16 -73e7544f| SCVTF $44, V27.D2, V19.D2 -51d9615e| SCVTFDD F10, F17 -fad9210e| SCVTF V15.S2, V26.S2 -96c0421e| SCVTF $16, R4, F22 -76e1029e| SCVTF $8, R11, F22 -a791429e| SCVTF $28, R13, F7 -f100221e| SCVTFWS R7, F17 -e101621e| SCVTFWD R15, F1 -6e03229e| SCVTFS R27, F14 -0b01629e| SCVTFD R8, F11 -2401025e| SHA1C V2.S4, V9, V4 -5d08285e| SHA1H V2, V29 -65210d5e| SHA1M V13.S4, V11, V5 -29131a5e| SHA1P V26.S4, V25, V9 -2b311a5e| SHA1SU0 V26.S4, V9.S4, V11.S4 -0919285e| SHA1SU1 V8.S4, V9.S4 -f052035e| SHA256H2 V3.S4, V23, V16 -fe401e5e| SHA256H V30.S4, V7, V30 -7529285e| SHA256SU0 V11.S4, V21.S4 -cc60195e| SHA256SU1 V25.S4, V6.S4, V12.S4 -8b56060f| VORR $(212<<16), V11.S2 -3f3aa16e| VSHLL2 $32, V17.S4, V31.D2 -0986394f| VSHRN2 $7, V16.D2, V9.S4 -35276e4e| VSHSUB V14.H8, V25.H8, V21.H8 -e2556d7f| VSLI $45, V15, V2 -f7541e6f| VSLI $14, V7.H8, V23.H8 -3167630e| VSMAX V3.H4, V25.H4, V17.H4 -68a6230e| VSMAXP V3.B8, V19.B8, V8.B8 -a4aa304e| VSMAXV V21.B16, V4 -2520440f| VSMLAL V4.H[0], V1.H4, V5.S4 -8c286f4f| VSMLAL2 V15.H[6], V4.H8, V12.S4 -3a82660e| VSMLAL V6.H4, V17.H4, V26.S4 -d92f1f0e| SMOVW V30.B[15], R25 -912d114e| SMOV V12.B[8], R17 -b87ae05e| VSQABS V21, V24 -2d7b200e| VSQABS V25.B8, V13.B8 -560f645e| VSQADD V4, V26, V22 -4f0da54e| VSQADD V5.S4, V10.S4, V15.S4 -5992ba5e| VSQDMLAL V26, V18, V25 -b892684e| VSQDMLAL2 V8.H8, V21.H8, V24.S4 -63786e5f| VSQDMLSL V14.H[6], V3, V3 -0c79a10f| VSQDMLSL V1.S[3], V8.S2, V12.D2 -1d73504f| VSQDMLSL2 V0.H[1], V24.H8, V29.S4 -6cb36c5e| VSQDMLSL V12, V27, V12 -82b36e4e| VSQDMLSL2 V14.H8, V28.H8, V2.S4 -8dca5d4f| VSQDMULH V13.H[5], V20.H8, V13.H8 -fcb6b64e| VSQDMULH V22.S4, V23.S4, V28.S4 -d6b0974f| VSQDMULL2 V23.S[0], V6.S4, V22.D2 -afd0b84e| VSQDMULL2 V24.S4, V5.S4, V15.D2 -067b207e| VSQNEG V24, V6 -9979606e| VSQNEG V12.H8, V25.H8 -bfdbae0f| VSQRDMULH V14.S[3], V29.S2, V31.S2 -c3b7a07e| VSQRDMULH V0, V30, V3 -845d3d5e| VSQRSHL V29, V12, V4 -495dba0e| VSQRSHL V26.S2, V10.S2, V9.S2 -fa8e0d7f| VSQRSHRUN $3, V23, V26 -cf75185f| VSQSHL $8, V14, V15 -a975250f| VSQSHL $5, V13.S2, V9.S2 -424da05e| VSQSHL V0, V10, V2 -464db90e| VSQSHL V25.S2, V10.S2, V6.S2 -af656d7f| VSQSHLU $45, V13, V15 -e564436f| VSQSHLU $3, V7.D2, V5.D2 -c1973b5f| VSQSHRN $5, V30, V1 -d586036f| VMVNI $118, V21.H8 -4c2ea95e| VSQSUB V9, V18, V12 -df2efe4e| VSQSUB V30.D2, V22.D2, V31.D2 -c149a10e| VSQXTN V14.D2, V1.S2 -712a217e| VSQXTUN V19, V17 -9a29a12e| VSQXTUN V12.D2, V26.S2 -6a166e0e| VSRHADD V14.H4, V19.H4, V10.H4 -0445647f| VSRI $28, V8, V4 -6f44172f| VSRI $9, V3.H4, V15.H4 -cd56f94e| VSRSHL V25.D2, V22.D2, V13.D2 -12345b5f| VSRSRA $37, V0, V18 -f746fa5e| VSSHL V26, V23, V23 -89476c4e| VSSHL V12.H8, V28.H8, V9.H8 -0da60e0f| VSSHLL $6, V16.B8, V13.H8 -a504585f| VSSHR $40, V5, V5 -3b07544f| VSSHR $44, V25.D2, V27.D2 -3417350f| VSSRA $11, V25.S2, V20.S2 -1a213f0e| VSSUBL V31.B8, V8.B8, V26.H8 -1322a34e| VSSUBL2 V3.S4, V16.S4, V19.D2 -e931b84e| VSSUBW2 V24.S4, V15.D2, V9.D2 -dd7d004c| VST1 [V29.D2], (R14) -cea4000c| VST1 [V14.H4, V15.H4], (R6) -5a64000c| VST1 [V26.H4, V27.H4, V28.H4], (R2) -2b2c004c| VST1 [V11.D2, V12.D2, V13.D2, V14.D2], (R1) -39719f0c| VST1.P [V25.B8], 8(R9) -b771874c| VST1.P [V23.B16], (R13)(R7) -1da39f0c| VST1.P [V29.B8, V30.B8], 16(R24) -20a0800c| VST1.P [V0.B8, V1.B8], (R1)(R0) -5a6a9f4c| VST1.P [V26.S4, V27.S4, V28.S4], 48(R18) -0d69994c| VST1.P [V13.S4, V14.S4, V15.S4], (R8)(R25) -7e239f0c| VST1.P [V30.B8, V31.B8, V0.B8, V1.B8], 32(R27) -9a2d8e0c| VST1.P [V26.D1, V27.D1, V28.D1, V29.D1], (R12)(R14) -fd0b004d| VST1 V29.B[10], (RSP) -1058004d| VST1 V16.H[7], (R0) -0593000d| VST1 V5.S[1], (R24) -3d87000d| VST1 V29.D[0], (R25) -1a079f0d| VST1.P V26.B[1], 1(R24) -421b8f4d| VST1.P V2.B[14], (R26)(R15) -54489f4d| VST1.P V20.H[5], 2(R2) -c4809f4d| VST1.P V4.S[2], 4(R6) -0481840d| VST1.P V4.S[0], (R8)(R4) -6b859f0d| VST1.P V11.D[0], 8(R11) -f7878e4d| VST1.P V23.D[1], (RSP)(R14) -e788004c| VST2 (R7), [V7.S4, V8.S4] -79889f0c| VST2 16(R3), [V25.S2, V26.S2] -a502204d| ST2 (R21), [V5.B, V6.B][8] -0e50204d| ST2 (R0), [V14.H, V15.H][6] -6b93204d| ST2 (R27), [V11.S, V12.S][3] -0987200d| ST2 (R24), [V9.D, V10.D][0] -7003bf0d| ST2 2(R27), [V16.B, V17.B][0] -1a09a94d| ST2 (R8)(R9), [V26.B, V27.B][10] -1e43b00d| ST2 (R24)(R16), [V30.H, V31.H][0] -1a82bf0d| ST2 8(R16), [V26.S, V27.S][0] -9892a50d| ST2 (R20)(R5), [V24.S, V25.S][1] -5884bf0d| ST2 16(R2), [V24.D, V25.D][0] -9e87a34d| ST2 (R28)(R3), [V30.D, V31.D][1] -4e47004c| VST3 (R26), [V14.H8, V15.H8, V16.H8] -76489f4c| VST3 48(R3), [V22.S4, V23.S4, V24.S4] -3b48860c| VST3 (R1)(R6), [V27.S2, V28.S2, V29.S2] -e52a000d| ST3 (R23), [V5.B, V6.B, V7.B][2] -6f73004d| ST3 (R27), [V15.H, V16.H, V17.H][6] -9bb1004d| ST3 (R12), [V27.S, V28.S, V29.S][3] -0ca7000d| ST3 (R24), [V12.D, V13.D, V14.D][0] -2a259f0d| ST3 3(R9), [V10.B, V11.B, V12.B][1] -0524860d| ST3 (R0)(R6), [V5.B, V6.B, V7.B][1] -94689a4d| ST3 (R4)(R26), [V20.H, V21.H, V22.H][5] -c2a19f4d| ST3 12(R14), [V2.S, V3.S, V4.S][2] -5fb38c0d| ST3 (R26)(R12), [V31.S, V0.S, V1.S][1] -6da59f4d| ST3 24(R11), [V13.D, V14.D, V15.D][1] -32a7924d| ST3 (R25)(R18), [V18.D, V19.D, V20.D][1] -5b03000c| VST4 (R26), [V27.B8, V28.B8, V29.B8, V30.B8] -cd059f0c| VST4 32(R14), [V13.H4, V14.H4, V15.H4, V16.H4] -8601820c| VST4 (R12)(R2), [V6.B8, V7.B8, V8.B8, V9.B8] -7925200d| ST4 (R11), [V25.B, V26.B, V27.B, V28.B][1] -cd7a204d| ST4 (R22), [V13.H, V14.H, V15.H, V16.H][7] -dfb2204d| ST4 (R22), [V31.S, V0.S, V1.S, V2.S][3] -daa4200d| ST4 (R6), [V26.D, V27.D, V28.D, V29.D][0] -2135bf0d| ST4 4(R9), [V1.B, V2.B, V3.B, V4.B][5] -7727a90d| ST4 (R27)(R9), [V23.B, V24.B, V25.B, V26.B][1] -b4a3bf0d| ST4 16(R29), [V20.S, V21.S, V22.S, V23.S][0] -1ba3ae0d| ST4 (R24)(R14), [V27.S, V28.S, V29.S, V30.S][0] -93a4bf0d| ST4 32(R4), [V19.D, V20.D, V21.D, V22.D][0] -50a6b80d| ST4 (R18)(R24), [V16.D, V17.D, V18.D, V19.D][0] -79b53d2c| VSTNP -20(R11), V13, V25 -d895326c| VSTNP -216(R14), V5, V24 -d1810dac| VSTNP 432(R14), V0, V17 -08728c2c| STP.P (V8, V28), 96(R16) -ac1ba16c| STP.P (V12, V6), -496(R29) -f4fab1ac| STP.P (V20, V30), -464(R23) -c15bbe2d| STP.W (V1, V22), -16(R30) -2422856d| STP.W (V4, V8), 80(R17) -3d5282ad| STP.W (V29, V20), 64(R17) -5df5352d| STP (V29, V29), -84(R10) -5c54286d| STP (V28, V21), -384(R2) -753c11ad| STP (V21, V15), 544(R3) -54e4033c| MOVD.P V20, 62(R2) -aa54137c| MOVD.P V10, -203(R5) -c9d615bc| FMOVS.P F9, -163(R22) -fc471efc| FMOVD.P F28, -28(RSP) -20f78d3c| MOVD.P V0, 223(R25) -028d1b3c| MOVD.W V2, -72(R8) -35be037c| MOVD.W V21, 59(R17) -b98c15bc| FMOVS.W F25, -168(R5) -fd1e11fc| FMOVD.W F29, -239(R23) -13ec9a3c| MOVD.W V19, -82(R0) -b12d123d| MOVD V17, 1163(R13) -d6500b7d| MOVD V22, 1448(R6) -d46e39bd| FMOVS F20, 14700(R22) -b84f30fd| FMOVD F24, 24728(R29) -3cee993d| MOVD V28, 26544(R17) -4348293c| MOVD V3, (R2)(R9.UXTW) -ed7b253c| MOVD V13, (RSP)(R5) -8fc9357c| MOVD V15, (R12)(R21.SXTW) -87f832bc| FMOVS F7, (R4)(R18.SXTX<<2) -f1ea38fc| FMOVD F17, (R23)(R24.SXTX) -1c68a43c| MOVD V28, (R0)(R4) -dcb1023c| MOVD V28, 43(R14) -6701117c| MOVD V7, -240(R11) -85b11bbc| FMOVS F5, -69(R12) -8ea10efc| FMOVD F14, 234(R12) -eab08f3c| MOVD V10, 251(R7) -ca876a2e| VSUB V10.H4, V30.H4, V10.H4 -603be05e| VSUQADD V27, V0 -513a600e| VSUQADD V18.H4, V17.H4 -25231c4e| VTBL V28.B16, [V25.B16, V26.B16], V5.B16 -8c40100e| VTBL V16.B8, [V4.B16, V5.B16, V6.B16], V12.B8 -0462040e| VTBL V4.B8, [V16.B16, V17.B16, V18.B16, V19.B16], V4.B8 -34000f0e| VTBL V15.B8, [V1.B16], V20.B8 -eb301f4e| VTBX V31.B16, [V7.B16, V8.B16], V11.B16 -bb51124e| VTBX V18.B16, [V13.B16, V14.B16, V15.B16], V27.B16 -cf701d0e| VTBX V29.B8, [V6.B16, V7.B16, V8.B16, V9.B16], V15.B8 -4213080e| VTBX V8.B8, [V26.B16], V2.B8 -2b2b114e| VTRN1 V17.B16, V25.B16, V11.B16 -766ada4e| VTRN2 V26.D2, V19.D2, V22.D2 -4152672e| VUABAL V7.H4, V18.H4, V1.S4 -0953296e| VUABAL2 V9.B16, V24.B16, V9.H8 -41756c6e| VUABD V12.H8, V10.H8, V1.H8 -3670ae2e| VUABDL V14.S2, V1.S2, V22.D2 -5401312e| VUADDL V17.B8, V10.B8, V20.H8 -d103286e| VUADDL2 V8.B16, V30.B16, V17.H8 -a92a206e| VUADDLP V21.B16, V9.H8 -b839706e| VUADDLV V13.H8, V24 -ea106d2e| VUADDW V13.H4, V7.S4, V10.S4 -c010726e| VUADDW2 V18.H8, V6.S4, V0.S4 -e7e5517f| UCVTF $47, F15, F7 -49e7376f| UCVTF $9, V26.S4, V9.S4 -4ada617e| UCVTFDD F18, F10 -6b82431e| UCVTF $32, R19, F11 -db84039e| UCVTF $31, R6, F27 -1c72439e| UCVTF $36, R16, F28 -f301231e| UCVTFWS R15, F19 -3503631e| UCVTFWD R25, F21 -e602239e| UCVTFS R23, F6 -d503639e| UCVTFD R30, F21 -ec04606e| VUHADD V0.H8, V7.H8, V12.H8 -3f65782e| VUMAX V24.H4, V9.H4, V31.H4 -afa6232e| VUMAXP V3.B8, V21.B8, V15.B8 -cdaa706e| VUMAXV V22.H8, V13 -736c236e| VUMIN V3.B16, V3.B16, V19.B16 -a0afa62e| VUMINP V6.S2, V29.S2, V0.S2 -3c229e2f| VUMLAL V30.S[0], V17.S2, V28.D2 -9d29a56f| VUMLAL2 V5.S[3], V12.S4, V29.D2 -6c80392e| VUMLAL V25.B8, V3.B8, V12.H8 -4f60692f| VUMLSL V9.H[2], V2.H4, V15.S4 -61a1606e| VUMLSL2 V0.H8, V11.H8, V1.S4 -183e0b0e| VMOV V16.B[5], R24 -c0a89b6f| VUMULL2 V27.S[2], V6.S4, V0.D2 -36c0736e| VUMULL2 V19.H8, V1.H8, V22.S4 -120d757e| VUQADD V21, V8, V18 -3a0c2e2e| VUQADD V14.B8, V1.B8, V26.B8 -0d5d617e| VUQRSHL V1, V8, V13 -4d5cb16e| VUQRSHL V17.S4, V2.S4, V13.S4 -439c382f| VUQRSHRN $8, V2.D2, V3.S2 -9d745c7f| VUQSHL $28, V4, V29 -7b76656f| VUQSHL $37, V19.D2, V27.D2 -774ef37e| VUQSHL V19, V19, V23 -124eb32e| VUQSHL V19.S2, V16.S2, V18.S2 -bc961f6f| VUQSHRN2 $1, V21.S4, V28.H8 -a62ce07e| VUQSUB V0, V5, V6 -0f2dae2e| VUQSUB V14.S2, V8.S2, V15.S2 -b24b217e| VUQXTN V29, V18 -f148216e| VUQXTN2 V7.H8, V17.B16 -7d15a42e| VURHADD V4.S2, V11.S2, V29.S2 -9055fc6e| VURSHL V28.D2, V12.D2, V16.D2 -eb275e7f| VURSHR $34, V31, V11 -c0347c7f| VURSRA $4, V6, V0 -fe44e97e| VUSHL V9, V7, V30 -fa47e86e| VUSHL V8.D2, V31.D2, V26.D2 -95a7262f| VUSHLL $6, V28.S2, V21.D2 -9ca7096f| VUSHLL2 $1, V28.B16, V28.H8 -8a07527f| VUSHR $46, V28, V10 -c7076b6f| VUSHR $21, V30.D2, V7.D2 -8d39e07e| VUSQADD V12, V13 -f716727f| VUSRA $14, V23, V23 -3f14066f| VBIC $193, V31.S4 -b423ac2e| VUSUBL V12.S2, V29.S2, V20.D2 -7c22736e| VUSUBL2 V19.H8, V19.H8, V28.S4 -76317d2e| VUSUBW V29.H4, V11.S4, V22.S4 -8f302a6e| VUSUBW2 V10.B16, V4.H8, V15.H8 -c5a4286f| VUSHLL2 $8, V6.S4, V5.D2 -d3198c0e| VUZP1 V12.S2, V14.S2, V19.S2 -c05bdb4e| VUZP2 V27.D2, V30.D2, V0.D2 -362b610e| VXTN V25.S4, V22.H4 -0c29214e| VXTN2 V8.H8, V12.B16 -2b39c64e| VZIP1 V6.D2, V9.D2, V11.D2 -9500091a| ADCW R9, R4, R21 -c2001a9a| ADC R26, R6, R2 -6a02163a| ADCSW R22, R19, R10 -0c0118ba| ADCS R24, R8, R12 -b1c42b0b| ADDW R11.SXTW<<1, R5, R17 -bf15368b| ADD R22.UXTB<<5, R13, RSP -be1f468b| ADD R6>>7, R29, R30 -8f51352b| ADDSW R21.UXTW<<4, R12, R15 -97043eab| ADDS R30.UXTB<<1, R4, R23 -09b00931| ADDSW $620, R0, R9 -4de204ab| ADDS R4<<56, R18, R13 -f6b60912| ANDW $4288675743, R23, R22 -a6d13b92| AND $-2025524839466146845, R13, R6 -1cc0138a| AND R19<<48, R0, R28 -73882072| ANDSW $458759, R3, R19 -b5780af2| ANDS $-9007199256838145, R5, R21 -766c90ea| ANDS R16->27, R3, R22 -a72ac31a| ASRW R3, R21, R7 -ff28d59a| ASR R21, R7, ZR -3e7f0913| ASRW $9, R25, R30 -bafd5493| ASR $20, R13, R26 -302ad21a| ASRW R18, R17, R16 -602bd79a| ASR R23, R27, R0 -4fa4df54| BAL -66270(PC) -a2e9cf15| JMP 30402978(PC) -eff373b3| BFXIL $51, ZR, $10, R15 -9e3e7db3| BFI $3, R20, $16, R30 -87fa41b3| BFXIL $1, R20, $62, R7 -b831f80a| BICW R24@>12, R13, R24 -ffe0ae8a| BIC R14->56, R7, ZR -7c2c276a| BICSW R7<<11, R3, R28 -ccf2fbea| BICS R27@>60, R22, R12 -722cd195| CALL 30485618(PC) -20003fd6| CALL (R1) -e0021fd6| JMP (R23) -80db37d4| BRK $48860 -f25a4335| CBNZW R18, 137943(PC) -5d5376b5| CBNZ R29, 242330(PC) -5ce56834| CBZW R28, 214826(PC) -29b08cb4| CBZ R9, -236159(PC) -e048533a| CCMNW MI, R7, $19, $0 -e7da4fba| CCMN LE, R23, $15, $7 -67f2583a| CCMNW AL, R19, R24, $7 -60a05aba| CCMN GE, R3, R26, $0 -6a3b517a| CCMPW LO, R27, $17, $10 -8a4b55fa| CCMP MI, R28, $21, $10 -ed934b7a| CCMPW LS, ZR, R11, $13 -24414ffa| CCMP MI, R9, R15, $4 -0e169c1a| CSINCW NE, R16, R28, R14 -8264949a| CSINC VS, R4, R20, R2 -b363935a| CSINVW VS, R29, R19, R19 -ff619dda| CSINV VS, R15, R29, ZR -5f3703d5| CLREX $7 -0017c05a| CLSW R24, R0 -8216c0da| CLS R20, R2 -3310c05a| CLZW R1, R19 -6e13c0da| CLZ R27, R14 -7fd02b2b| CMNW R11.SXTW<<4, R3 -5f3928ab| CMN R8.UXTH<<6, R10 -1fb92cb1| CMN $2862, R8 -ff164eab| CMN R14>>5, R23 -ff71256b| CMPW R5.UXTX<<4, R15 -df6034eb| CMP R20.UXTX, R6 -ff776af1| CMP $(2717<<12), RSP -80e4855a| CSNEGW AL, R4, R5, R0 -da3490da| CSNEG LO, R6, R16, R26 -af40c71a| CRC32B R7, R5, R15 -c546cf1a| CRC32H R15, R22, R5 -6148c01a| CRC32W R0, R3, R1 -0f4eda9a| CRC32X R26, R16, R15 -4950d01a| CRC32CB R16, R2, R9 -8155c31a| CRC32CH R3, R12, R1 -835ace1a| CRC32CW R14, R20, R3 -f05fc59a| CRC32CX R5, ZR, R16 -0ae3901a| CSELW AL, R24, R16, R10 -ed51969a| CSEL PL, R15, R22, R13 -ee679f1a| CSETW VC, R14 -ed579f9a| CSET MI, R13 -f2539f5a| CSETMW MI, R18 -ffe39fda| CSINV AL, ZR, ZR, ZR -9d25941a| CSINCW HS, R12, R20, R29 -afb7829a| CSINC LT, R29, R2, R15 -7602895a| CSINVW EQ, R19, R9, R22 -011394da| CSINV NE, R24, R20, R1 -68b7935a| CSNEGW LT, R27, R19, R8 -a32784da| CSNEG HS, R29, R4, R3 -8159a6d4| DCPS1 $13004 -c2d9aad4| DCPS2 $22222 -63ceb7d4| DCPS3 $48755 -bf3903d5| DMB $9 -e003bfd6| DRPS -9f3603d5| DSB $6 -fc76a9ca| EON R9->29, R23, R28 -540f2352| EORW $3758096385, R26, R20 -187e1ed2| EOR $-1, R16, R24 -fd37004a| EORW R0<<13, ZR, R29 -b8c542ca| EOR R2>>49, R13, R24 -e0039fd6| ERET -5f26c193| EXTR $9, R1, R18, ZR -7f2003d5| WFI -ff2a03d5| HINT $87 -804a59d4| HLT $51796 -df3003d5| ISB $0 -10fcdf88| LDARW (R0), R16 -fafcdfc8| LDAR (R7), R26 -30fedf08| LDARB (R17), R16 -63fedf48| LDARH (R19), R3 -82ba7f88| LDAXPW (R20), (R2, R14) -d6917fc8| LDAXP (R14), (R22, R4) -59ff5f88| LDAXRW (R26), R25 -fefe5fc8| LDAXR (R23), R30 -a0fc5f08| LDAXRB (R5), R0 -fafd5f48| LDAXRH (R15), R26 -b8804428| LDNPW 36(R5), R0, R24 -93e969a8| LDNP -360(R12), R26, R19 -caccef28| LDP.P -132(R6), (R10, R19) -7365c3a8| LDP.P 48(R11), (R19, R25) -3106ca29| LDP.W 80(R17), (R17, R1) -0c02f7a9| LDP.W -144(R16), (R12, R0) -41af6529| LDP -212(R26), (R1, R11) -706b65a9| LDP -432(R27), (R16, R26) -746ecf68| LDPSW 120(R19), R27, R20 -c051c669| LDPSW 48(R14), R20, R0 -aded5b69| LDPSW 220(R13), R27, R13 -990457b8| MOVWU.P -144(R4), R25 -bbd556f8| MOVD.P -147(R13), R27 -a45c51b8| MOVWU.W -235(R5), R4 -344c41f8| MOVD.W 20(R1), R20 -2d8755b9| MOVWU 5508(R25), R13 -56e360f9| MOVD 16832(R26), R22 -3b264e38| MOVBU.P 226(R17), R27 -898f5738| MOVBU.W -136(R28), R9 -c44e6839| MOVBU 2579(R22), R4 -2d687738| MOVBU (R1)(R23), R13 -4d475978| MOVHU.P -108(R26), R13 -39de5278| MOVHU.W -211(R17), R25 -9cc54879| MOVHU 1122(R12), R28 -87fb6978| MOVHU (R28)(R9.SXTX<<1), R7 -3967cb38| MOVBW.P 182(R25), R25 -abf69438| MOVB.P -177(R21), R11 -159ed138| MOVBW.W -231(R16), R21 -b63e8038| MOVB.W 3(R21), R22 -4491c939| MOVBW 612(R10), R4 -497e8039| MOVB 31(R18), R9 -7d6bf638| MOVBW (R27)(R22), R29 -e578ba38| MOVB (R7)(R26), R5 -9f06ca78| MOVHW.P 160(R20), ZR -15c59d78| MOVH.P -36(R8), R21 -c07fd278| MOVHW.W -217(R30), R0 -bdec9278| MOVH.W -210(R5), R29 -10e2c979| MOVHW 1264(R16), R16 -54d29d79| MOVH 3816(R18), R20 -eb9484b8| MOVW.P 73(R7), R11 -ba2e8ab8| MOVW.W 162(R21), R26 -ac7f8ab9| MOVW 2684(R29), R12 -a359b3b8| MOVW (R13)(R19.UXTW<<2), R3 -f8b941b8| LDTRW 27(R15), R24 -fc0a4ef8| LDTR 224(R23), R28 -60d84638| LDTRBW 109(R3), R0 -44685978| LDTRH -106(R2), R4 -5379dc38| LDTRSBW -57(R10), R19 -ade99538| LDTRSB -162(R13), R13 -905ac078| LDTRSHW 5(R20), R16 -10898478| LDTRSH 72(R8), R16 -37188eb8| LDTRSW 225(R1), R23 -992351b8| LDURW -238(R28), R25 -c9f155f8| LDUR -161(R14), R9 -76e14e38| LDURBW 238(R11), R22 -47b24478| LDURHW 75(R18), R7 -4020da38| LDURSBW -94(R2), R0 -0dd09e38| LDURSB -19(R0), R13 -8f81d478| LDURSHW -184(R12), R15 -96918378| LDURSH 57(R12), R22 -b2e383b8| LDURSW 62(R29), R18 -d3717f88| LDXPW (R14), (R19, R28) -cb677fc8| LDXP (R30), (R11, R25) -ed7c5f88| LDXRW (R7), R13 -aa7d5fc8| LDXR (R13), R10 -1c7d5f08| LDXRB (R8), R28 -de7f5f48| LDXRH (R30), R30 -1622dc1a| LSLW R28, R16, R22 -cd20d59a| LSL R21, R6, R13 -882957d3| UBFIZ $41, R12, $11, R8 -3320cc1a| LSLW R12, R1, R19 -7320de9a| LSL R30, R3, R19 -af25d31a| LSRW R19, R13, R15 -e426c39a| LSR R3, R23, R4 -e87f0653| LSRW $6, ZR, R8 -85fe5fd3| LSR $31, R20, R5 -0025dc1a| LSRW R28, R8, R0 -6e27c79a| LSR R7, R27, R14 -6d69111b| MADDW R17, R26, R11, R13 -245d0d9b| MADD R13, R23, R9, R4 -85fe1f1b| MNEGW ZR, R20, R5 -9bfc199b| MNEG R25, R4, R27 -13000011| ADDW $0, R0, R19 -e3000091| ADD $0, R7, R3 -986c9e12| MOVW $4294904987, R24 -cb24f092| MOVD $9140618393701842943, R11 -3cbb88d2| MOVD $17881, R28 -e4170232| MOVW $3221225487, R4 -fe636bb2| MOVD $70368742080512, R30 -ed031b2a| MOVW R27, R13 -fb0308aa| MOVD R8, R27 -be3ed1f2| MOVK $(35317<<32), R30 -e0a08312| MOVW $4294959864, R0 -a1a6e592| MOVD $-3257509905472421889, R1 -5260f0d2| MOVD $-9006636304787570688, R18 -a60739d5| MRS $18493, R6 -281a1ed5| MSR R8, S3_6_C1_C10_1 -10f31b1b| MSUBW R27, R28, R24, R16 -46b41a9b| MSUB R26, R13, R2, R6 -ec7f041b| MULW R4, ZR, R12 -147f009b| MUL R0, R24, R20 -f67f692a| MVNW R9>>31, R22 -f2a3f7aa| MVN R23@>40, R18 -fe8b0bcb| NEG R11<<34, R30 -fef710eb| NEGS R16<<61, R30 -e0031b5a| NGCW R27, R0 -e0031dda| NGC R29, R0 -f003167a| NGCSW R22, R16 -e60302fa| NGCS R2, R6 -1f2003d5| NOP -2f51732a| ORNW R19>>20, R9, R15 -9b0facaa| ORN R12->3, R28, R27 -efa40032| ORRW $67044351, R7, R15 -3a0b19b2| ORR $3848290698112, R25, R26 -4b9ec4aa| ORR R4@>39, R18, R11 -f5eaa2f9| PRFM 17872(R23), PSTL3STRM -731df8d8| PRFM -16149(PC), PSTL2STRM -85c194f8| PRFUM -180(R12), PLDL3STRM -c303c05a| RBITW R30, R3 -3000c0da| RBIT R1, R16 -20025fd6| RET R17 -ec08c05a| REVW R7, R12 -180cc0da| REV R0, R24 -4b07c05a| REV16W R26, R11 -7805c0da| REV16 R11, R24 -ea08c0da| REV32 R7, R10 -a90fc0da| REV R29, R9 -fd788213| EXTRW $30, R2, R7, R29 -e1a0cc93| EXTR $40, R12, R7, R1 -792fdc1a| RORW R28, R27, R25 -2b2cc39a| ROR R3, R1, R11 -7e2ec71a| RORW R7, R19, R30 -392edd9a| ROR R29, R17, R25 -47020a5a| SBCW R10, R18, R7 -b7021dda| SBC R29, R21, R23 -7800197a| SBCSW R25, R3, R24 -1e0203fa| SBCS R3, R16, R30 -a6b07393| SBFIZ $13, R5, $45, R6 -94957d93| SBFIZ $3, R12, $38, R20 -ecff5e93| ASR $30, ZR, R12 -a50ddb1a| SDIVW R27, R13, R5 -7c0ec89a| SDIV R8, R19, R28 -9f2003d5| SEV -bf2003d5| SEVL -5953349b| SMADDL R20, R20, R26, R25 -bafc399b| SMNEGL R25, R5, R26 -a5cc289b| SMSUBL R8, R19, R5, R5 -297c579b| SMULH R23, R1, R9 -5e7e299b| SMULL R9, R18, R30 -29fd9f88| STLRW R9, (R9) -fdff9fc8| STLR R29, (RSP) -defe9f08| STLRB R30, (R22) -2ffc9f48| STLRH R15, (R1) -c1e12f88| STLXPW (R1, R24), (R14), R15 -62aa2ec8| STLXP (R2, R10), (R19), R14 -b9fe1b88| STLXRW R25, (R21), R27 -cbff14c8| STLXR R11, (R30), R20 -edfc0608| STLXRB R13, (R7), R6 -8dfe1048| STLXRH R13, (R20), R16 -1a323628| STNPW -80(R16), R12, R26 -b3cb3da8| STNP -40(R29), R18, R19 -52398828| STP.P (R18, R14), 64(R10) -434c95a8| STP.P (R3, R19), 336(R2) -2badbd29| STP.W (R11, R11), -20(R9) -daeabaa9| STP.W (R26, R26), -88(R22) -9bc91529| STP (R27, R18), 172(R12) -eea024a9| STP (R14, R8), -440(R7) -fec514b8| MOVW.P R30, -180(R15) -d21508f8| MOVD.P R18, 129(R14) -7c5c0ab8| MOVW.W R28, 165(R3) -6dec1ff8| MOVD.W R13, -2(R3) -35681eb9| MOVW R21, 7784(R1) -374d35f9| MOVD R23, 27288(R9) -1dd83df8| MOVD R29, (R0)(R29.SXTW<<3) -1b441b38| MOVB.P R27, -76(R0) -d69c0f38| MOVB.W R22, 249(R6) -b7ce0d39| MOVB R23, 883(R21) -2b7b3938| MOVB R11, (R25)(R25) -4e771d78| MOVH.P R14, -41(R26) -64cc0b78| MOVH.W R4, 188(R3) -07b90279| MOVH R7, 348(R8) -2eb91cb8| STTRW -53(R9), R14 -373a1bf8| STTR -77(R17), R23 -d0881138| STTRBW -232(R6), R16 -941a0e78| STTRHW 225(R20), R20 -da3000b8| MOVW R26, 3(R6) -5e921cf8| MOVD R30, -55(R18) -09821e38| MOVB R9, -24(R16) -67d21c78| MOVH R7, -51(R19) -0c352188| STXPW (R12, R13), (R8), R1 -146d26c8| STXP (R20, R27), (R8), R6 -837d1888| STXRW R3, (R12), R24 -f17f1bc8| STXR R17, (RSP), R27 -3b7d0f08| STXRB R27, (R9), R15 -6b7c1f48| STXRH R11, (R3), ZR -70ab204b| SUBW R0.SXTH<<2, R27, R16 -303b20cb| SUB R0.UXTH<<6, R25, R16 -69a909d1| SUB $618, R11, R9 -87384e4b| SUBW R14>>14, R4, R7 -ec720ecb| SUB R14<<28, R23, R12 -2b58256b| SUBSW R5.UXTW<<6, R1, R11 -59e93ceb| SUBS R28.SXTX<<2, R10, R25 -9e7b6ff1| SUBS $(3038<<12), R28, R30 -3e6d196b| SUBSW R25<<27, R9, R30 -54029ceb| SUBS R28->0, R18, R20 -c1f91cd4| SVC $59342 -091e0013| SXTBW R16, R9 -7f1c4093| SXTB R3, ZR -b53c0013| SXTHW R5, R21 -773e4093| SXTH R19, R23 -707f4093| SXTW R27, R16 -df3a2dd5| SYSL $342720, ZR -5f612972| TSTW $4286644223, R10 -bf2007f2| TST $-144115170929541117, R5 -1f11136a| TSTW R19<<4, R8 -5fd10dea| TST R13<<52, R10 -5c826bd3| UBFIZ $21, R18, $33, R28 -ad690c53| UBFXW $12, R13, $15, R13 -3a0f41d3| UBFX $1, R25, $3, R26 -6a197dd3| UBFIZ $3, R11, $7, R10 -520aca1a| UDIVW R10, R18, R18 -0809c89a| UDIV R8, R8, R8 -4e55a69b| UMADDL R6, R21, R10, R14 -99fda59b| UMNEGL R5, R12, R25 -1adabb9b| UMSUBL R27, R22, R16, R26 -177ddf9b| UMULH ZR, R8, R23 -1d7da49b| UMULL R4, R8, R29 -5a1c0053| UXTBW R2, R26 -603c0053| UXTHW R3, R0 -5f2003d5| WFE -7f2003d5| WFI -3f2003d5| YIELD -02b8600e| VABS V0.H4, V2.H4 -c886f94e| VADD V25.D2, V22.D2, V8.D2 -5642740e| VADDHN V20.S4, V18.S4, V22.H4 -3743294e| VADDHN2 V9.H8, V25.H8, V23.B16 -2abef74e| VADDP V23.D2, V17.D2, V10.D2 -18bbb14e| VADDV V24.S4, V24 -1a59284e| AESD V8.B16, V26.B16 -cf48284e| AESE V6.B16, V15.B16 -557a284e| AESIMC V18.B16, V21.B16 -2f6b284e| AESMC V25.B16, V15.B16 -cf1c324e| VAND V18.B16, V6.B16, V15.B16 -c9c6032f| VMVNI $(118<<136), V9.S2 -f1a7012f| VMVNI $(63<<8), V17.H4 -691d600e| VBIC V0.B8, V11.B8, V9.B8 -c31dfe6e| VBIF V30.B16, V14.B16, V3.B16 -c81cb66e| VBIT V22.B16, V6.B16, V8.B16 -701f6b2e| VBSL V11.B8, V27.B8, V16.B8 -7c4b600e| VCLS V27.H4, V28.H4 -ce4a602e| VCLZ V22.H4, V14.H4 -d08de37e| VCMEQ V3, V14, V16 -e98db96e| VCMEQ V25.S4, V15.S4, V9.S4 -6e99a00e| VCMEQ $0, V11.S2, V14.S2 -933d304e| VCMGE V16.B16, V12.B16, V19.B16 -0e88e07e| VCMGE $0, V0, V14 -9b89202e| VCMGE $0, V12.B8, V27.B8 -6a372f4e| VCMGT V15.B16, V27.B16, V10.B16 -128be05e| VCMGT $0, V24, V18 -9189a00e| VCMGT $0, V12.S2, V17.S2 -f734e67e| VCMHI V6, V7, V23 -4d36b82e| VCMHI V24.S2, V18.S2, V13.S2 -003e2b2e| VCMHS V11.B8, V16.B8, V0.B8 -729ae07e| VCMLE $0, V19, V18 -3699206e| VCMLE $0, V9.B16, V22.B16 -d1ab600e| VCMLT $0, V30.H4, V17.H4 -ad8e244e| VCMTST V4.B16, V21.B16, V13.B16 -ef06035e| VMOV V23.B[1], V15 -5007040e| VDUP V26.S[0], V16.S2 -890e0b4e| VDUP R20, V9.B16 -951c276e| VEOR V7.B16, V4.B16, V21.B16 -98d4bf7e| FABD F31, F4, F24 -bcd4ad6e| VFABD V13.S4, V5.S4, V28.S4 -78f8e04e| FABS V3.D2, V24.D2 -8cc0201e| FABSS F4, F12 -9ac1601e| FABSD F12, F26 -3aee307e| FACGE F16, F17, F26 -41ed352e| VFACGE V21.S2, V10.S2, V1.S2 -35edaf7e| FACGT F15, F9, F21 -02efe36e| VFACGT V3.D2, V24.D2, V2.D2 -21d6664e| FADD V6.D2, V17.D2, V1.D2 -5e282e1e| FADDS F14, F2, F30 -4d2a621e| FADDD F2, F18, F13 -7cd8707e| FADDP V3.D2, F28 -5dd4386e| VFADDP V24.S4, V2.S4, V29.S4 -69363e1e| FCCMPS LO, F30, F19, $9 -c8b56a1e| FCCMPD LT, F10, F14, $8 -d1f5271e| FCCMPES AL, F7, F14, $1 -3645751e| FCCMPED MI, F21, F9, $6 -21e6735e| FCMEQ F19, F17, F1 -b6dba05e| FCMEQ $0, F29, F22 -49d8a04e| VFCMEQ $0, V2.S4, V9.S4 -2ee5667e| FCMGE F6, F9, F14 -4ee7766e| VFCMGE V22.D2, V26.D2, V14.D2 -4bcba07e| FCMGE $0, F26, F11 -11c9a02e| VFCMGE $0, V8.S2, V17.S2 -81e4a97e| FCMGT F9, F4, F1 -d3e4b56e| VFCMGT V21.S4, V6.S4, V19.S4 -efc8e05e| FCMGT $0, F7, F15 -3ec9e04e| VFCMGT $0, V9.D2, V30.D2 -38d9a07e| FCMLE $0, F9, F24 -7dd9a02e| VFCMLE $0, V11.S2, V29.S2 -bae8a05e| FCMLT $0, F5, F26 -a2eaa04e| VFCMLT $0, V21.S4, V2.S4 -60212f1e| FCMPS F15, F11 -a8233a1e| FCMPS $(0.0), F29 -a020641e| FCMPD F4, F5 -e820701e| FCMPD $(0.0), F7 -b0203a1e| FCMPES F26, F5 -78203d1e| FCMPES $(0.0), F3 -70226e1e| FCMPED F14, F19 -3821601e| FCMPED $(0.0), F9 -06de241e| FCSELS LE, F16, F4, F6 -51de761e| FCSELD LE, F18, F22, F17 -5e42e21e| FCVTHS F18, F30 -b9c1e21e| FCVTHD F13, F25 -58c0231e| FCVTSH F2, F24 -9bc2221e| FCVTSD F20, F27 -2bc3631e| FCVTDH F25, F11 -f640621e| FCVTDS F7, F22 -caca215e| FCVTAS F22, F10 -5ec9210e| VFCVTAS V10.S2, V30.S2 -0302241e| FCVTASW F16, R3 -c103249e| FCVTAS F30, R1 -3003641e| FCVTASW F25, R16 -6201649e| FCVTAS F11, R2 -d3c9217e| FCVTAU F14, F19 -3bc8212e| VFCVTAU V1.S2, V27.S2 -0802251e| FCVTAUW F16, R8 -5f02259e| FCVTAU F18, ZR -2801651e| FCVTAUW F9, R8 -f200659e| FCVTAU F7, R18 -d179610e| VFCVTL V14.S2, V17.D2 -347b614e| VFCVTL2 V25.S4, V20.D2 -08b9615e| FCVTMS F8, F8 -f000301e| FCVTMSW F7, R16 -8002309e| FCVTMS F20, R0 -5202701e| FCVTMSW F18, R18 -c803709e| FCVTMS F30, R8 -1cbb217e| FCVTMU F24, F28 -d1b9212e| VFCVTMU V14.S2, V17.S2 -2e02311e| FCVTMUW F17, R14 -d003319e| FCVTMU F30, R16 -ce03711e| FCVTMUW F30, R14 -0801719e| FCVTMU F8, R8 -4c6b210e| VFCVTN V26.S4, V12.H4 -6869214e| VFCVTN2 V11.S4, V8.H8 -2faa615e| FCVTNS F17, F15 -33aa614e| VFCVTNS V17.D2, V19.D2 -d303201e| FCVTNSW F30, R19 -4001209e| FCVTNS F10, R0 -b202601e| FCVTNSW F21, R18 -c603609e| FCVTNS F30, R6 -8ea8217e| FCVTNU F4, F14 -cc01211e| FCVTNUW F14, R12 -3a00219e| FCVTNU F1, R26 -2002611e| FCVTNUW F17, R0 -ff01619e| FCVTNU F15, ZR -1baba15e| FCVTPS F24, F27 -9d00281e| FCVTPSW F4, R29 -eb02289e| FCVTPS F23, R11 -3503681e| FCVTPSW F25, R21 -4301689e| FCVTPS F10, R3 -63aba17e| FCVTPU F27, F3 -caa8a12e| VFCVTPU V6.S2, V10.S2 -7702291e| FCVTPUW F19, R23 -b503299e| FCVTPU F29, R21 -2f03691e| FCVTPUW F25, R15 -5b01699e| FCVTPU F10, R27 -7369617e| FCVTXN F11, F19 -6b6b612e| VFCVTXN V27.D2, V11.S2 -f268616e| VFCVTXN2 V7.D2, V18.S4 -bcff7b5f| FCVTZS $5, F29, F28 -19bbe15e| FCVTZSDD F24, F25 -c6b9e14e| FCVTZS V14.D2, V6.D2 -e9fc189e| FCVTZS $1, F7, R9 -6661589e| FCVTZS $40, F11, R6 -9702381e| FCVTZSSW F20, R23 -ed00389e| FCVTZSS F7, R13 -3a01781e| FCVTZSDW F9, R26 -8801789e| FCVTZSD F12, R8 -a5ff2e2f| FCVTZU $18, V29.S2, V5.S2 -5bbbe17e| FCVTZUDD F26, F27 -1a74199e| FCVTZU $35, F0, R26 -e391599e| FCVTZU $28, F15, R3 -b203391e| FCVTZUSW F29, R18 -ed01399e| FCVTZUS F15, R13 -c200791e| FCVTZUDW F6, R2 -5402799e| FCVTZUD F18, R20 -1aff2b6e| FDIV V11.S4, V24.S4, V26.S4 -171a391e| FDIVS F25, F16, F23 -7d196b1e| FDIVD F11, F11, F29 -f9721f1f| FMADDS F31, F28, F23, F25 -7070551f| FMADDD F21, F28, F3, F16 -05f7624e| FMAX V2.D2, V24.D2, V5.D2 -88493d1e| FMAXS F29, F12, F8 -4a496d1e| FMAXD F13, F10, F10 -5068321e| FMAXNMS F18, F2, F16 -a66a761e| FMAXNMD F22, F21, F6 -0ccb707e| FMAXNMP V24.D2, F12 -6ec66f6e| VFMAXNMP V15.D2, V19.D2, V14.D2 -41f8307e| FMAXP V2.S2, F1 -05f72a6e| VFMAXP V10.S4, V24.S4, V5.S4 -aa5b231e| FMINS F3, F29, F10 -d6596a1e| FMIND F10, F14, F22 -15c4b24e| FMINNM V18.S4, V0.S4, V21.S4 -6279281e| FMINNMS F8, F11, F2 -af7b6a1e| FMINNMD F10, F29, F15 -7dc9f07e| FMINNMP V11.D2, F29 -dfc6bb6e| VFMINNMP V27.S4, V22.S4, V31.S4 -56c8b06e| FMINNMV V2.S4, F22 -0ff8f07e| FMINP V0.D2, F15 -a211c55f| FMLA V5.D[0], F13, F2 -0dce224e| VFMLA V2.S4, V16.S4, V13.S4 -4c5ba15f| FMLS V1.S[3], F26, F12 -8953ba0f| VFMLS V26.S[1], V28.S2, V9.S2 -09cdbd4e| VFMLS V29.S4, V8.S4, V9.S4 -97f7044f| FMOV $-7., V23.S4 -dff4006f| FMOV $2.75, V31.D2 -c543201e| FMOVS F30, F5 -1740601e| FMOVD F0, F23 -a100271e| FMOVS R5, F1 -f102261e| FMOVS F23, R17 -b302679e| FMOVD R21, F19 -4001af9e| FMOV R10, V0.D[1] -db01669e| FMOVD F14, R27 -8300ae9e| FMOV V4.D[1], R3 -1870331e| FMOVS $-6.75, F24 -08507d1e| FMOVD $-0.8125, F8 -5cbf0c1f| FMSUBS F12, F15, F26, F28 -89e3501f| FMSUBD F16, F24, F28, F9 -3a93c95f| FMULD V9.D[0], F25, F26 -5a90ae4f| FMUL V14.S[1], V2.S4, V26.S4 -ba0a2f1e| FMULS F15, F21, F26 -5b0a7c1e| FMULD F28, F18, F27 -e991c07f| FMULX V0.D[0], F15, F9 -be989c6f| VFMULX V28.S[2], V5.S4, V30.S4 -d3dc7a5e| FMULX F26, F6, F19 -d4de7f4e| VFMULX V31.D2, V22.D2, V20.D2 -8e41211e| FNEGS F12, F14 -dc42611e| FNEGD F22, F28 -cb362e1f| FNMADDS F14, F13, F22, F11 -6441791f| FNMADDD F25, F16, F11, F4 -36ed291f| FNMSUBS F9, F27, F9, F22 -35b27a1f| FNMSUBD F26, F12, F17, F21 -9388301e| FNMULS F16, F4, F19 -c088711e| FNMULD F17, F6, F0 -e8daa15e| FRECPE F23, F8 -a9fc395e| FRECPS F25, F5, F9 -49fe284e| VFRECPS V8.S4, V18.S4, V9.S4 -85f8a15e| FRECPX F4, F5 -ee43261e| FRINTAS F31, F14 -7042661e| FRINTAD F19, F16 -2b98a16e| FRINTI V1.S4, V11.S4 -fac2271e| FRINTIS F23, F26 -76c3671e| FRINTID F27, F22 -7942251e| FRINTMS F19, F25 -8742651e| FRINTMD F20, F7 -fc8a214e| FRINTN V23.S4, V28.S4 -c041241e| FRINTNS F14, F0 -b241641e| FRINTND F13, F18 -c588a14e| FRINTP V6.S4, V5.S4 -6ec2241e| FRINTPS F19, F14 -ddc0641e| FRINTPD F6, F29 -1a9a616e| FRINTX V16.D2, V26.D2 -7c41271e| FRINTXS F11, F28 -d243671e| FRINTXD F30, F18 -b49aa14e| FRINTZ V21.S4, V20.S4 -5bc0251e| FRINTZS F2, F27 -43c1651e| FRINTZD F10, F3 -3bdba17e| FRSQRTE F25, F27 -9ddba12e| VFRSQRTE V28.S2, V29.S2 -1ffee65e| FRSQRTS F6, F16, F31 -8bfdb54e| VFRSQRTS V21.S4, V12.S4, V11.S4 -33c1211e| FSQRTS F9, F19 -a5c0611e| FSQRTD F5, F5 -a2d7b74e| FSUB V23.S4, V29.S4, V2.S4 -a338301e| FSUBS F16, F5, F3 -e139681e| FSUBD F8, F15, F1 -96170e6e| VMOV V28.H[1], V22.H[3] -791c014e| VMOV R3, V25.B[0] -cf79404c| VLD1 (R14), [V15.S4] -75a6404c| VLD1 (R19), [V21.H8, V22.H8] -ed62404c| VLD1 (R23), [V13.B16, V14.B16, V15.B16] -392a400c| VLD1 (R17), [V25.S2, V26.S2, V27.S2, V28.S2] -cd7cdf4c| VLD1.P 16(R6), [V13.D2] -f677ce4c| VLD1.P (RSP)(R14), [V22.H8] -d4a3df0c| VLD1.P 16(R30), [V20.B8, V21.B8] -8ba1d90c| VLD1.P (R12)(R25), [V11.B8, V12.B8] -396fdf0c| VLD1.P 24(R25), [V25.D1, V26.D1, V27.D1] -4c64db0c| VLD1.P (R2)(R27), [V12.H4, V13.H4, V14.H4] -3f2adf4c| VLD1.P 64(R17), [V31.S4, V0.S4, V1.S4, V2.S4] -b329ce4c| VLD1.P (R13)(R14), [V19.S4, V20.S4, V21.S4, V22.S4] -aa02400d| VLD1 (R21), V10.B[0] -7980404d| VLD1 (R3), V25.S[2] -5884404d| VLD1 (R2), V24.D[1] -f203df4d| VLD1.P 1(RSP), V18.B[8] -3519c40d| VLD1.P (R9)(R4), V21.B[6] -ed59df0d| VLD1.P 2(R15), V13.H[3] -9e52d90d| VLD1.P (R20)(R25), V30.H[2] -cd93df4d| VLD1.P 4(R30), V13.S[3] -5982cb4d| VLD1.P (R18)(R11), V25.S[2] -4f84df4d| VLD1.P 8(R2), V15.D[1] -2d85d50d| VLD1.P (R9)(R21), V13.D[0] -33c2400d| VLD1R (R17), [V19.B8] -e2c8df4d| VLD1R 4(R7), [V2.S4] -83c2c44d| VLD1R (R20)(R4), [V3.B16] -5487400c| VLD2 (R26), [V20.H4, V21.H4] -e08adf0c| VLD2 16(R23), [V0.S2, V1.S2] -768ac40c| VLD2 (R19)(R4), [V22.S2, V23.S2] -4c0f604d| LD2 (R26), [V12.B, V13.B][11] -e043604d| LD2 (RSP), [V0.H, V1.H][4] -c281600d| LD2 (R14), [V2.S, V3.S][0] -e585600d| LD2 (R15), [V5.D, V6.D][0] -2c1aff4d| LD2 2(R17), [V12.B, V13.B][14] -820bfd4d| LD2 (R28)(R29), [V2.B, V3.B][10] -d593ff0d| LD2 8(R30), [V21.S, V22.S][1] -6780ea0d| LD2 (R3)(R10), [V7.S, V8.S][0] -3484ff4d| LD2 16(R1), [V20.D, V21.D][1] -6a86ee4d| LD2 (R19)(R14), [V10.D, V11.D][1] -e4c7604d| VLD2R (RSP), [V4.H8, V5.H8] -69c8ff0d| VLD2R 8(R3), [V9.S2, V10.S2] -52ccf30d| VLD2R (R2)(R19), [V18.D1, V19.D1] -9e4b404c| VLD3 (R28), [V30.S4, V31.S4, V0.S4] -0440df4c| VLD3 48(R0), [V4.B16, V5.B16, V6.B16] -0f49cf0c| VLD3 (R8)(R15), [V15.S2, V16.S2, V17.S2] -b22e400d| LD3 (R21), [V18.B, V19.B, V20.B][3] -9473400d| LD3 (R28), [V20.H, V21.H, V22.H][2] -1da0404d| LD3 (R0), [V29.S, V30.S, V31.S][2] -21a5404d| LD3 (R9), [V1.D, V2.D, V3.D][1] -3b23df0d| LD3 3(R25), [V27.B, V28.B, V29.B][0] -0937c60d| LD3 (R24)(R6), [V9.B, V10.B, V11.B][5] -926bcb4d| LD3 (R28)(R11), [V18.H, V19.H, V20.H][5] -f5a1df4d| LD3 12(R15), [V21.S, V22.S, V23.S][2] -dba3c44d| LD3 (R30)(R4), [V27.S, V28.S, V29.S][2] -12a5df0d| LD3 24(R8), [V18.D, V19.D, V20.D][0] -daa7d30d| LD3 (R30)(R19), [V26.D, V27.D, V28.D][0] -3beb400d| VLD3R (R25), [V27.S2, V28.S2, V29.S2] -cde4df4d| VLD3R 6(R6), [V13.H8, V14.H8, V15.H8] -a4efc44d| VLD3R (R29)(R4), [V4.D2, V5.D2, V6.D2] -fc0a400c| VLD4 (R23), [V28.S2, V29.S2, V30.S2, V31.S2] -ae05df0c| VLD4 32(R13), [V14.H4, V15.H4, V16.H4, V17.H4] -cb07c84c| VLD4 (R30)(R8), [V11.H8, V12.H8, V13.H8, V14.H8] -1825604d| LD4 (R8), [V24.B, V25.B, V26.B, V27.B][9] -2869604d| LD4 (R9), [V8.H, V9.H, V10.H, V11.H][5] -07b2600d| LD4 (R16), [V7.S, V8.S, V9.S, V10.S][1] -9fa4600d| LD4 (R4), [V31.D, V0.D, V1.D, V2.D][0] -de22ff0d| LD4 4(R22), [V30.B, V31.B, V0.B, V1.B][0] -6a36ed4d| LD4 (R19)(R13), [V10.B, V11.B, V12.B, V13.B][13] -23a2ff4d| LD4 16(R17), [V3.S, V4.S, V5.S, V6.S][2] -22a0fe4d| LD4 (R1)(R30), [V2.S, V3.S, V4.S, V5.S][2] -7ca4ff4d| LD4 32(R3), [V28.D, V29.D, V30.D, V31.D][1] -03a7ec4d| LD4 (R24)(R12), [V3.D, V4.D, V5.D, V6.D][1] -b9ee600d| VLD4R (R21), [V25.D1, V26.D1, V27.D1, V28.D1] -03e8ff0d| VLD4R 16(R0), [V3.S2, V4.S2, V5.S2, V6.S2] -e7e3f24d| VLD4R (RSP)(R18), [V7.B16, V8.B16, V9.B16, V10.B16] -451a4e2c| VLDNP 112(R18), V6, V5 -01236f6c| VLDNP -272(R24), V8, V1 -204041ac| VLDNP 32(R1), V16, V0 -1b21cc2c| LDP.P 96(R8), (V27, V8) -41ccc06c| LDP.P 8(R2), (V1, V19) -65b8e6ac| LDP.P -816(R3), (V5, V14) -a58bed2d| LDP.W -148(R29), (V5, V2) -d8a3c46d| LDP.W 72(R30), (V24, V8) -dc82c0ad| LDP.W 16(R22), (V28, V0) -eda7782d| LDP -60(RSP), (V13, V9) -041b6c6d| LDP -320(R24), (V4, V6) -17ea6bad| LDP -656(R16), (V23, V26) -4e14433c| MOVD.P 49(R2), V14 -cd844e7c| MOVD.P 232(R6), V13 -99945dbc| FMOVS.P -39(R4), F25 -170556fc| FMOVD.P -160(R8), F23 -3115d53c| MOVD.P -175(R9), V17 -3c6d403c| MOVD.W 6(R9), V28 -f8fc527c| MOVD.W -209(R7), V24 -776c58bc| FMOVS.W -122(R3), F23 -075f57fc| FMOVD.W -139(R24), F7 -28cdc33c| MOVD.W 60(R9), V8 -40a15f3d| MOVD 2024(R10), V0 -3b8c597d| MOVD 3270(R1), V27 -28f958bd| FMOVS 6392(R9), F8 -852d6ffd| FMOVD 24152(R12), F5 -e149ea3d| MOVD 43296(R15), V1 -807f7c1c| FMOVS 254972(PC), F0 -e7a61c5c| FMOVD 58679(PC), F7 -4bca773c| MOVD (R18)(R23.SXTW), V11 -8d69623c| MOVD (R12)(R2), V13 -cef8797c| MOVD (R6)(R25.SXTX<<1), V14 -b7497bfc| FMOVD (R13)(R27.UXTW), F23 -dbdbfc3c| MOVD (R30)(R28.SXTW<<4), V27 -1a60553c| VLDUR -170(R0), V26 -74f3477c| VLDUR 127(R27), V20 -f46249bc| VLDUR 150(R23), V20 -b8015bfc| VLDUR -80(R13), V24 -3372de3c| VLDUR -25(R17), V19 -04972c0e| VMLA V12.B8, V24.B8, V4.B8 -f0051b5e| VMOV V15.B[13], V16 -7f76146e| VMOV V19.S[3], V31.S[2] -6c1cb60e| VORR V22.B8, V3.B8, V12.B8 -ae3f1e0e| VMOV V29.H[7], R14 -f8e5004f| VMOVI $15, V24.B16 -0355010f| VORR $(40<<16), V3.S2 -4825020f| VMOVI $(74<<8), V8.S2 -64d7040f| VMOVI $(155<<144), V4.S2 -46e6062f| VMOVI $-280379759984896, V6 -bde6056f| VMOVI $-71776123339472641, V29.D2 -789f350e| VMUL V21.B8, V27.B8, V24.B8 -7b5b202e| VMVN V27.B8, V27.B8 -2dd4066f| VMVNI $(193<<144), V13.S4 -8266012f| VMVNI $(52<<24), V2.S2 -1025022f| VMVNI $(72<<8), V16.S2 -eabba06e| VNEG V31.S4, V10.S4 -7e5a206e| VMVN V19.B16, V30.B16 -6a1fea0e| VORN V10.B8, V27.B8, V10.B8 -b406010f| VMOVI $53, V20.S2 -f564040f| VMOVI $(135<<24), V21.S2 -b21cb80e| VORR V24.B8, V5.B8, V18.B8 -2b437a2e| VRADDHN V26.S4, V25.S4, V11.H4 -6d402c6e| VRADDHN2 V12.H8, V3.H8, V13.B16 -655a606e| VRBIT V19.B16, V5.B16 -5108202e| VREV32 V2.B8, V17.B8 -750a200e| VREV64 V19.B8, V21.B8 -f88f0b0f| VRSHRN $5, V31.H8, V24.B8 -8263236e| VRSUBHN2 V3.H8, V28.H8, V2.B16 -787c320e| VSABA V18.B8, V3.B8, V24.B8 -f551220e| VSABAL V2.B8, V15.B8, V21.H8 -b5766d0e| VSABD V13.H4, V21.H4, V21.H4 -9270240e| VSABDL V4.B8, V4.B8, V18.H8 -4d71384e| VSABDL2 V24.B16, V10.B16, V13.H8 -8f6a600e| VSADALP V20.H4, V15.S2 -e501750e| VSADDL V21.H4, V15.H4, V5.S4 -5202ab4e| VSADDL2 V11.S4, V18.S4, V18.D2 -7029200e| VSADDLP V11.B8, V16.H4 -3913710e| VSADDW V17.H4, V25.S4, V25.S4 -d7e4575f| SCVTF $41, F6, F23 -c6db215e| SCVTFSS F30, F6 -17d8214e| SCVTF V0.S4, V23.S4 -62c4021e| SCVTF $15, R3, F2 -f5cd421e| SCVTF $13, R15, F21 -6128029e| SCVTF $54, R3, F1 -9a7c429e| SCVTF $33, R4, F26 -6102221e| SCVTFWS R19, F1 -0b03621e| SCVTFWD R24, F11 -ed01229e| SCVTFS R15, F13 -6f02629e| SCVTFD R19, F15 -ac03055e| SHA1C V5.S4, V29, V12 -e309285e| SHA1H V15, V3 -2a221b5e| SHA1M V27.S4, V17, V10 -a013185e| SHA1P V24.S4, V29, V0 -6032005e| SHA1SU0 V0.S4, V19.S4, V0.S4 -f918285e| SHA1SU1 V7.S4, V25.S4 -fb50035e| SHA256H2 V3.S4, V7, V27 -6d421c5e| SHA256H V28.S4, V19, V13 -c12b285e| SHA256SU0 V30.S4, V1.S4 -6362095e| SHA256SU1 V9.S4, V19.S4, V3.S4 -a805bb0e| VSHADD V27.S2, V13.S2, V8.S2 -783b616e| VSHLL2 $16, V27.H8, V24.S4 -48841b0f| VSHRN $5, V2.S4, V8.H4 -a924bc4e| VSHSUB V28.S4, V5.S4, V9.S4 -1557717f| VSLI $49, V24, V21 -2a56456f| VSLI $5, V17.D2, V10.D2 -7c663b0e| VSMAX V27.B8, V19.B8, V28.B8 -b5a7694e| VSMAXP V9.H8, V29.H8, V21.H8 -8ea8b04e| VSMAXV V4.S4, V14 -936cb44e| VSMIN V20.S4, V4.S4, V19.S4 -15af7e4e| VSMINP V30.H8, V24.H8, V21.H8 -3e81694e| VSMLAL2 V9.H8, V9.H8, V30.S4 -29a26d0e| VSMLSL V13.H4, V17.H4, V9.S4 -442e0b4e| SMOV V18.B[5], R4 -e1a0540f| VSMULL V4.H[1], V7.H4, V1.S4 -5eaa604f| VSMULL2 V0.H[6], V18.H8, V30.S4 -4cc32d4e| VSMULL2 V13.B16, V26.B16, V12.H8 -1e7a205e| VSQABS V16, V30 -e67ae04e| VSQABS V23.D2, V6.D2 -a80ded5e| VSQADD V13, V13, V8 -e60dae4e| VSQADD V14.S4, V15.S4, V6.S4 -fe33570f| VSQDMLAL V7.H[1], V31.H4, V30.S4 -ee90b64e| VSQDMLAL2 V22.S4, V7.S4, V14.D2 -ce79a05f| VSQDMLSL V0.S[3], V14, V14 -d5b2a14e| VSQDMLSL2 V1.S4, V22.S4, V21.D2 -51cb575f| VSQDMULH V7.H[5], V26, V17 -0cb5b54e| VSQDMULH V21.S4, V8.S4, V12.S4 -95d0760e| VSQDMULL V22.H4, V4.H4, V21.S4 -a1d37c4e| VSQDMULL2 V28.H8, V29.H8, V1.S4 -d679e07e| VSQNEG V14, V22 -3f78602e| VSQNEG V1.H4, V31.H4 -80b4717e| VSQRDMULH V17, V4, V0 -4cb76e2e| VSQRDMULH V14.H4, V26.H4, V12.H4 -aa5ce95e| VSQRSHL V9, V5, V10 -d25fb74e| VSQRSHL V23.S4, V30.S4, V18.S4 -998c0c6f| VSQRSHRUN2 $4, V4.H8, V25.B16 -4375605f| VSQSHL $32, V10, V3 -de743f0f| VSQSHL $31, V6.S2, V30.S2 -a84d675e| VSQSHL V7, V13, V8 -674dbe4e| VSQSHL V30.S4, V11.S4, V7.S4 -5165587f| VSQSHLU $24, V10, V17 -b464042f| VMVNI $(133<<24), V20.S2 -2086207f| VSQSHRUN $32, V17, V0 -8a851a2f| VSQSHRUN $6, V12.S4, V10.H4 -652c255e| VSQSUB V5, V3, V5 -632eb30e| VSQSUB V19.S2, V19.S2, V3.S2 -104ba15e| VSQXTN V24, V16 -2249214e| VSQXTN2 V9.H8, V2.B16 -1c14360e| VSRHADD V22.B8, V0.B8, V28.B8 -8044076f| VMVNI $(228<<16), V0.S4 -3a57ed5e| VSRSHL V13, V25, V26 -2c56ef4e| VSRSHL V15.D2, V17.D2, V12.D2 -9627140f| VSRSHR $12, V28.H4, V22.H4 -bd37565f| VSRSRA $42, V29, V29 -db34594f| VSRSRA $39, V6.D2, V27.D2 -4546a10e| VSSHL V1.S2, V18.S2, V5.S2 -aca7020f| VMOVI $(93<<8), V12.H4 -e004675f| VSSHR $25, V7, V0 -e5057f4f| VSSHR $1, V15.D2, V5.D2 -1b15595f| VSSRA $39, V8, V27 -ba15250f| VSSRA $27, V13.S2, V26.S2 -3620330e| VSSUBL V19.B8, V1.B8, V22.H8 -c1316d4e| VSSUBW2 V13.H8, V14.S4, V1.S4 -8a76000c| VST1 [V10.H4], (R20) -10a5004c| VST1 [V16.H8, V17.H8], (R8) -ab6b004c| VST1 [V11.S4, V12.S4, V13.S4], (R29) -8d2b004c| VST1 [V13.S4, V14.S4, V15.S4, V16.S4], (R28) -8d7d9f0c| VST1.P [V13.D1], 8(R12) -eb73840c| VST1.P [V11.B8], (RSP)(R4) -48a69f4c| VST1.P [V8.H8, V9.H8], 32(R18) -dca19b4c| VST1.P [V28.B16, V29.B16], (R14)(R27) -7c699f4c| VST1.P [V28.S4, V29.S4, V30.S4], 48(R11) -da6d870c| VST1.P [V26.D1, V27.D1, V28.D1], (R14)(R7) -7f279f0c| VST1.P [V31.H4, V0.H4, V1.H4, V2.H4], 32(R27) -4421810c| VST1.P [V4.B8, V5.B8, V6.B8, V7.B8], (R10)(R1) -a615004d| VST1 V6.B[13], (R13) -ce92000d| VST1 V14.S[1], (R22) -c985000d| VST1 V9.D[0], (R14) -380f9f0d| VST1.P V24.B[3], 1(R25) -de0b944d| VST1.P V30.B[10], (R30)(R20) -3141880d| VST1.P V17.H[0], (R9)(R8) -8e939f0d| VST1.P V14.S[1], 4(R28) -c890870d| VST1.P V8.S[1], (R6)(R7) -9f869f4d| VST1.P V31.D[1], 8(R20) -38879b4d| VST1.P V24.D[1], (R25)(R27) -4181004c| VST2 (R10), [V1.B16, V2.B16] -d6819f0c| VST2 16(R14), [V22.B8, V23.B8] -bf808a0c| VST2 (R5)(R10), [V31.B8, V0.B8] -bd0e204d| ST2 (R21), [V29.B, V30.B][11] -4551204d| ST2 (R10), [V5.H, V6.H][6] -9982204d| ST2 (R20), [V25.S, V26.S][2] -ea86200d| ST2 (R23), [V10.D, V11.D][0] -7b02bf0d| ST2 2(R19), [V27.B, V28.B][0] -c000a04d| ST2 (R6)(R0), [V0.B, V1.B][8] -fb59a40d| ST2 (R15)(R4), [V27.H, V28.H][3] -f880bf0d| ST2 8(R7), [V24.S, V25.S][0] -f582ac4d| ST2 (R23)(R12), [V21.S, V22.S][2] -9c86bf4d| ST2 16(R20), [V28.D, V29.D][1] -3386b14d| ST2 (R17)(R17), [V19.D, V20.D][1] -c0469f0c| VST3 24(R22), [V0.H4, V1.H4, V2.H4] -2243820c| VST3 (R25)(R2), [V2.B8, V3.B8, V4.B8] -c629000d| ST3 (R14), [V6.B, V7.B, V8.B][2] -4f6a004d| ST3 (R18), [V15.H, V16.H, V17.H][5] -72a0004d| ST3 (R3), [V18.S, V19.S, V20.S][2] -c1a4000d| ST3 (R6), [V1.D, V2.D, V3.D][0] -312e9f0d| ST3 3(R17), [V17.B, V18.B, V19.B][3] -9a28934d| ST3 (R4)(R19), [V26.B, V27.B, V28.B][10] -a1799f4d| ST3 6(R13), [V1.H, V2.H, V3.H][7] -3ba29f0d| ST3 12(R17), [V27.S, V28.S, V29.S][0] -80b2870d| ST3 (R20)(R7), [V0.S, V1.S, V2.S][1] -f6a49f4d| ST3 24(R7), [V22.D, V23.D, V24.D][1] -8fa69a4d| ST3 (R20)(R26), [V15.D, V16.D, V17.D][1] -ee09000c| VST4 (R15), [V14.S2, V15.S2, V16.S2, V17.S2] -1e07880c| VST4 (R24)(R8), [V30.H4, V31.H4, V0.H4, V1.H4] -6426204d| ST4 (R19), [V4.B, V5.B, V6.B, V7.B][9] -4ea2204d| ST4 (R18), [V14.S, V15.S, V16.S, V17.S][2] -05a6200d| ST4 (R16), [V5.D, V6.D, V7.D, V8.D][0] -5b21bf0d| ST4 4(R10), [V27.B, V28.B, V29.B, V30.B][0] -ce28a00d| ST4 (R6)(R0), [V14.B, V15.B, V16.B, V17.B][2] -767bbf4d| ST4 8(R27), [V22.H, V23.H, V24.H, V25.H][7] -747aa24d| ST4 (R19)(R2), [V20.H, V21.H, V22.H, V23.H][7] -24b0bf0d| ST4 16(R1), [V4.S, V5.S, V6.S, V7.S][1] -c7b1a90d| ST4 (R14)(R9), [V7.S, V8.S, V9.S, V10.S][1] -9fa4bf4d| ST4 32(R4), [V31.D, V0.D, V1.D, V2.D][1] -70a4ab4d| ST4 (R3)(R11), [V16.D, V17.D, V18.D, V19.D][1] -89fe2e2c| VSTNP -140(R20), V31, V9 -bfd31d6c| VSTNP 472(R29), V20, V31 -ddf301ac| VSTNP 48(R30), V28, V29 -14f6ac2c| STP.P (V20, V29), -156(R16) -251db76c| STP.P (V5, V7), -144(R9) -e51fb7ac| STP.P (V5, V7), -288(RSP) -5c90852d| STP.W (V28, V4), 44(R2) -4c51a56d| STP.W (V12, V20), -432(R10) -265d8aad| STP.W (V6, V23), 320(R9) -9c0c392d| STP (V28, V3), -56(R4) -b49e1e6d| STP (V20, V7), 488(R21) -55f105ad| STP (V21, V28), 176(R10) -4dd6003c| MOVD.P V13, 13(R18) -e357067c| MOVD.P V3, 101(RSP) -f6841dbc| FMOVS.P F22, -40(R7) -54b710fc| FMOVD.P F20, -245(R26) -0d07833c| MOVD.P V13, 48(R24) -393f003c| MOVD.W V25, 3(R25) -1fac007c| MOVD.W V31, 10(R0) -d41d13bc| FMOVS.W F20, -207(R14) -908f0dfc| FMOVD.W F16, 216(R28) -5ded9d3c| MOVD.W V29, -34(R10) -6d72073d| MOVD V13, 476(R19) -68752d7d| MOVD V8, 5818(R11) -084728bd| FMOVS F8, 10308(R24) -409503fd| FMOVD F0, 1832(R10) -58a1963d| MOVD V24, 23168(R10) -51c8253c| MOVD V17, (R2)(R5.SXTW) -967b313c| MOVD V22, (R28)(R17) -b4683e7c| MOVD V20, (R5)(R30) -64d9a33c| MOVD V4, (R11)(R3.SXTW<<4) -e5e1143c| MOVD V5, -178(R15) -99901e7c| MOVD V25, -23(R4) -bb0012bc| FMOVS F27, -224(R5) -1d710cfc| FMOVD F29, 199(R8) -17e1873c| MOVD V23, 126(R8) -ed84a26e| VSUB V2.S4, V7.S4, V13.S4 -7761b80e| VSUBHN V24.D2, V11.D2, V23.S2 -f838205e| VSUQADD V7, V24 -7739600e| VSUQADD V11.H4, V23.H4 -26a5204f| VSXTL2 V9.S4, V6.D2 -5a201a4e| VTBL V26.B16, [V2.B16, V3.B16], V26.B16 -c2400f0e| VTBL V15.B8, [V6.B16, V7.B16, V8.B16], V2.B8 -7263024e| VTBL V2.B16, [V27.B16, V28.B16, V29.B16, V30.B16], V18.B16 -bb010b4e| VTBL V11.B16, [V13.B16], V27.B16 -5f31184e| VTBX V24.B16, [V10.B16, V11.B16], V31.B16 -a952100e| VTBX V16.B8, [V21.B16, V22.B16, V23.B16], V9.B8 -4872170e| VTBX V23.B8, [V18.B16, V19.B16, V20.B16, V21.B16], V8.B8 -dc110e4e| VTBX V14.B16, [V14.B16], V28.B16 -d7289a4e| VTRN1 V26.S4, V6.S4, V23.S4 -cd6a924e| VTRN2 V18.S4, V22.S4, V13.S4 -a552392e| VUABAL V25.B8, V21.B8, V5.H8 -a653256e| VUABAL2 V5.B16, V29.B16, V6.H8 -fb70b42e| VUABDL V20.S2, V7.S2, V27.D2 -3b6a202e| VUADALP V17.B8, V27.H4 -8a03b22e| VUADDL V18.S2, V28.S2, V10.D2 -262a206e| VUADDLP V17.B16, V6.H8 -8410312e| VUADDW V17.B8, V4.H8, V4.H8 -bf11ae6e| VUADDW2 V14.S4, V13.D2, V31.D2 -a7e65d7f| UCVTF $35, F21, F7 -8bda617e| UCVTFDD F20, F11 -7fb8431e| UCVTF $18, R3, F31 -1c0f039e| UCVTF $61, R24, F28 -2241439e| UCVTF $48, R9, F2 -d701231e| UCVTFWS R14, F23 -9600631e| UCVTFWD R4, F22 -8b01239e| UCVTFS R12, F11 -7202639e| UCVTFD R19, F18 -3406b82e| VUHADD V24.S2, V17.S2, V20.S2 -9264612e| VUMAX V1.H4, V4.H4, V18.H4 -d9a5772e| VUMAXP V23.H4, V14.H4, V25.H4 -74a8b06e| VUMAXV V3.S4, V20 -24a8312e| VUMINV V1.B8, V4 -c5218e2f| VUMLAL V14.S[0], V14.S2, V5.D2 -3d20a76f| VUMLAL2 V7.S[1], V1.S4, V29.D2 -90817e6e| VUMLAL2 V30.H8, V12.H8, V16.S4 -0f69a46f| VUMLSL2 V4.S[3], V8.S4, V15.D2 -4aa27c2e| VUMLSL V28.H4, V18.H4, V10.S4 -48a27b6e| VUMLSL2 V27.H8, V18.H8, V8.S4 -833c0d0e| VMOV V4.B[6], R3 -e2a1b22f| VUMULL V18.S[1], V15.S2, V2.D2 -07c06f2e| VUMULL V15.H4, V0.H4, V7.S4 -470e367e| VUQADD V22, V18, V7 -490e252e| VUQADD V5.B8, V18.B8, V9.B8 -bf5eaa7e| VUQRSHL V10, V21, V31 -c49c347f| VUQRSHRN $12, V6, V4 -b4757a7f| VUQSHL $58, V13, V20 -d14f777e| VUQSHL V23, V30, V17 -9e2d7a7e| VUQSUB V26, V12, V30 -a62c296e| VUQSUB V9.B16, V5.B16, V6.B16 -5d4ba17e| VUQXTN V26, V29 -454b212e| VUQXTN V26.H8, V5.B8 -1c48a16e| VUQXTN2 V0.D2, V28.S4 -4157736e| VURSHL V19.H8, V26.H8, V1.H8 -2d26797f| VURSHR $7, V17, V13 -bd27466f| VURSHR $58, V29.D2, V29.D2 -bcc8a12e| VURSQRTE V5.S2, V28.S2 -f5345d7f| VURSRA $35, V7, V21 -f8353a6f| VURSRA $6, V15.S4, V24.S4 -85a6342f| VUSHLL $20, V20.S2, V5.D2 -e7a70e6f| VUSHLL2 $6, V31.B16, V7.H8 -ed04787f| VUSHR $8, V7, V13 -8f07362f| VUSHR $10, V28.S2, V15.S2 -963a607e| VUSQADD V20, V22 -383a206e| VUSQADD V17.B16, V24.B16 -ef16596f| VUSRA $39, V23.D2, V15.D2 -f222ab2e| VUSUBL V11.S2, V23.S2, V18.D2 -9220696e| VUSUBL2 V9.H8, V4.H8, V18.S4 -0130312e| VUSUBW V17.B8, V0.H8, V1.H8 -a932a06e| VUSUBW2 V0.S4, V21.D2, V9.D2 -9a19910e| VUZP1 V17.S2, V12.S2, V26.S2 -a379ca4e| VZIP2 V10.D2, V13.D2, V3.D2 -1202011a| ADCW R1, R16, R18 -6900199a| ADC R25, R3, R9 -01010f3a| ADCSW R15, R8, R1 -13010fba| ADCS R15, R8, R19 -55ed280b| ADDW R8.SXTX<<3, R10, R21 -2077268b| ADD R6.UXTX<<5, R25, R0 -7f40560b| ADDW R22>>16, R3, ZR -3a16282b| ADDSW R8.UXTB<<5, R17, R26 -f8a336ab| ADDS R22.SXTH, RSP, R24 -000e6d31| ADDSW $(2883<<12), R16, R0 -b48e49b1| ADDS $(611<<12), R21, R20 -7e174e2b| ADDSW R14>>5, R27, R30 -3aa13f12| ANDW $66978814, R9, R26 -32a23592| AND $-571965880182769649, R17, R18 -b478070a| ANDW R7<<30, R5, R20 -dd1f988a| AND R24->7, R30, R29 -a7351b72| ANDSW $524256, R13, R7 -1c056ef2| ANDS $786432, R8, R28 -defd52ea| ANDS R18>>63, R14, R30 -8c28d01a| ASRW R16, R4, R12 -582ac09a| ASR R0, R18, R24 -647d1813| ASRW $24, R11, R4 -d1fe5b93| ASR $27, R22, R17 -2329c31a| ASRW R3, R9, R3 -d929d69a| ASR R22, R14, R25 -aefa5354| BAL 171989(PC) -76ad3917| JMP -12997258(PC) -de320f33| BFIW $17, R22, $13, R30 -af144db3| BFI $51, R5, $6, R15 -161c7eb3| BFI $2, R0, $8, R22 -f9791733| BFXILW $23, R15, $8, R25 -781577b3| BFI $9, R11, $6, R24 -0f65f98a| BIC R25@>25, R8, R15 -2c37e16a| BICSW R1@>13, R25, R12 -a6f473ea| BICS R19>>61, R5, R6 -f064ad96| CALL -22190864(PC) -80023fd6| CALL (R20) -00001fd6| JMP (R0) -80de3ed4| BRK $63220 -08276a35| CBNZW R8, 217400(PC) -acd1c0b5| CBNZ R12, -129395(PC) -ef50bf34| CBZW R15, -132473(PC) -4bd681b4| CBZ R11, -258382(PC) -4e2a483a| CCMNW HS, R18, $8, $14 -4a3a4eba| CCMN LO, R18, $14, $10 -0143553a| CCMNW MI, R24, R21, $1 -c09359ba| CCMN LS, R30, R25, $0 -020a567a| CCMPW EQ, R16, $22, $2 -a6985afa| CCMP LS, R5, $26, $6 -6fc0487a| CCMPW GT, R3, R8, $15 -21d14bfa| CCMP LE, R9, R11, $1 -75f5991a| CSINCW AL, R11, R25, R21 -5a25919a| CSINC HS, R10, R17, R26 -6a938c5a| CSINVW LS, R27, R12, R10 -6a408eda| CSINV MI, R3, R14, R10 -5f3603d5| CLREX $6 -a017c05a| CLSW R29, R0 -2616c0da| CLS R17, R6 -9411c05a| CLZW R12, R20 -c611c0da| CLZ R14, R6 -9fc3322b| CMNW R18.SXTW, R28 -3f9638ab| CMN R24.SXTB<<5, R17 -3f681db1| CMN $1882, R1 -bfd15bab| CMN R27>>52, R13 -ff723b6b| CMPW R27.UXTX<<4, R23 -1f5234eb| CMP R20.UXTW<<4, R16 -9fb22a71| CMPW $2732, R20 -df2478f1| CMP $(3593<<12), R6 -bf07026b| CMPW R2<<1, R29 -bfc514eb| CMP R20<<49, R13 -d494975a| CSNEGW LS, R6, R23, R20 -763591da| CSNEG LO, R11, R17, R22 -b440c91a| CRC32B R9, R5, R20 -5745cd1a| CRC32H R13, R10, R23 -684ad01a| CRC32W R16, R19, R8 -884fd59a| CRC32X R21, R28, R8 -ea50c61a| CRC32CB R6, R7, R10 -1357cf1a| CRC32CH R15, R24, R19 -9859c21a| CRC32CW R2, R12, R24 -6e5fde9a| CRC32CX R30, R27, R14 -9340941a| CSELW MI, R4, R20, R19 -dd42839a| CSEL MI, R22, R3, R29 -fe779f1a| CSETW VS, R30 -f1279f9a| CSET LO, R17 -eb839f5a| CSETMW LS, R11 -e3139fda| CSETM EQ, R3 -a986841a| CSINCW HI, R21, R4, R9 -19b78b9a| CSINC LT, R24, R11, R25 -4643835a| CSINVW MI, R26, R3, R6 -5ee38cda| CSINV AL, R26, R12, R30 -d166945a| CSNEGW VS, R22, R20, R17 -55f793da| CSNEG AL, R26, R19, R21 -0158add4| DCPS1 $27328 -82ceb2d4| DCPS2 $38516 -a31eb3d4| DCPS3 $39157 -bf3203d5| DMB $2 -e003bfd6| DRPS -9f3403d5| DSB $4 -2e2faeca| EON R14->11, R25, R14 -de6b0152| EORW $2214592511, R30, R30 -4a7714d2| EOR $-13194139536385, R26, R10 -2cea0dca| EOR R13<<58, R17, R12 -e0039fd6| ERET -834cce93| EXTR $19, R14, R4, R3 -5f2003d5| WFE -bf2e03d5| HINT $117 -e0f055d4| HLT $44935 -df3403d5| ISB $4 -22fcdf88| LDARW (R1), R2 -78fedfc8| LDAR (R19), R24 -cffcdf08| LDARB (R6), R15 -34fedf48| LDARH (R17), R20 -17bb7f88| LDAXPW (R24), (R23, R14) -6ffe7fc8| LDAXP (R19), (R15, ZR) -acfe5f88| LDAXRW (R21), R12 -cafe5fc8| LDAXR (R22), R10 -ddfd5f08| LDAXRB (R14), R29 -0efd5f48| LDAXRH (R8), R14 -66445128| LDNPW 136(R3), R17, R6 -3fa77fa8| LDNP -8(R25), R9, ZR -1e04eb28| LDP.P -168(R0), (R30, R1) -0da6c0a8| LDP.P 8(R16), (R13, R9) -7d00d429| LDP.W 160(R3), (R29, R0) -d26ae1a9| LDP.W -496(R22), (R18, R26) -d0ca6829| LDP -188(R22), (R16, R18) -a5e34fa9| LDP 248(R29), (R5, R24) -3e44d168| LDPSW 136(R1), R17, R30 -5f08e169| LDPSW -248(R2), R2, ZR -430d6769| LDPSW -200(R10), R3, R3 -2c555bb8| MOVWU.P -75(R9), R12 -83c557f8| MOVD.P -132(R12), R3 -f36e47b8| MOVWU.W 118(R23), R19 -6b1f48f8| MOVD.W 129(R27), R11 -f5d64ab9| MOVWU 2772(R23), R21 -872d7cf9| MOVD 30808(R12), R7 -82a75438| MOVBU.P -182(R28), R2 -a7fd5738| MOVBU.W -129(R13), R7 -c83d4239| MOVBU 143(R14), R8 -58c96438| MOVBU (R10)(R4.SXTW), R24 -8e687e38| MOVBU (R4)(R30), R14 -70575378| MOVHU.P -203(R27), R16 -015f5078| MOVHU.W -251(R24), R1 -7add5c79| MOVHU 3694(R11), R26 -2fcb7778| MOVHU (R25)(R23.SXTW), R15 -c474c338| MOVBW.P 55(R6), R4 -28869638| MOVB.P -152(R17), R8 -fe3fd438| MOVBW.W -189(RSP), R30 -da0f9938| MOVB.W -112(R30), R26 -5b3ac739| MOVBW 462(R18), R27 -2c579e39| MOVB 1941(R25), R12 -54faf838| MOVBW (R18)(R24.SXTX), R20 -fb68f238| MOVBW (R7)(R18), R27 -f26aad38| MOVB (R23)(R13), R18 -17e4c978| MOVHW.P 158(R0), R23 -a2759f78| MOVH.P -9(R13), R2 -9c6ec478| MOVHW.W 70(R20), R28 -fd6f8278| MOVH.W 38(RSP), R29 -a82bc279| MOVHW 276(R29), R8 -9d89b979| MOVH 7364(R12), R29 -962685b8| MOVW.P 82(R20), R22 -76ae8bb8| MOVW.W 186(R19), R22 -fc2193b9| MOVW 4896(R15), R28 -e34842b8| LDTRW 36(R7), R3 -4ff84df8| LDTR 223(R2), R15 -d9e84f38| LDTRBW 254(R6), R25 -397b5378| LDTRH -201(R25), R25 -c4c9d138| LDTRSBW -228(R14), R4 -02789638| LDTRSB -153(R0), R2 -a988cb78| LDTRSHW 184(R5), R9 -03888978| LDTRSH 152(R0), R3 -ccb99fb8| LDTRSW -5(R14), R12 -efb154b8| LDURW -181(R15), R15 -fc2051f8| LDUR -238(R7), R28 -86d04438| LDURBW 77(R4), R6 -73405d78| LDURHW -44(R3), R19 -7a81d538| LDURSBW -168(R11), R26 -b0b28038| LDURSB 11(R21), R16 -b4a1d278| LDURSHW -214(R13), R20 -3ed18078| LDURSH 13(R9), R30 -09628eb8| LDURSW 230(R16), R9 -c07e7f88| LDXPW (R22), (R0, ZR) -3e167fc8| LDXP (R17), (R30, R5) -727c5f88| LDXRW (R3), R18 -487c5fc8| LDXR (R2), R8 -867d5f08| LDXRB (R12), R6 -747f5f48| LDXRH (R27), R20 -d920d71a| LSLW R23, R6, R25 -b920c59a| LSL R5, R5, R25 -4da947d3| UBFX $7, R10, $36, R13 -be23ca1a| LSLW R10, R29, R30 -cc20d19a| LSL R17, R6, R12 -ae26c31a| LSRW R3, R21, R14 -fc27cb9a| LSR R11, ZR, R28 -2b7e1053| LSRW $16, R17, R11 -cefe75d3| LSR $53, R22, R14 -3b25d01a| LSRW R16, R9, R27 -e826d79a| LSR R23, R23, R8 -5504031b| MADDW R3, R1, R2, R21 -9e5c109b| MADD R16, R23, R4, R30 -00fe1f1b| MNEGW ZR, R16, R0 -6efe179b| MNEG R23, R19, R14 -31020011| ADDW $0, R17, R17 -21000091| ADD $0, R1, R1 -39f1bf12| MOVW $7798783, R25 -53b3e992| MOVD $-5591781887333892097, R19 -c0fd9552| MOVW $45038, R0 -f16b97d2| MOVD $47967, R17 -e8972232| MOVW $3222257679, R8 -e27323b2| MOVD $-2017612633531744257, R2 -e9030e2a| MOVW R14, R9 -fb0310aa| MOVD R16, R27 -d0e48472| MOVKW $10022, R16 -432dbcf2| MOVK $(57706<<16), R3 -4b679612| MOVW $4294921413, R11 -9121e492| MOVD $-2381278302972149761, R17 -00be90d2| MOVD $34288, R0 -91d730d5| MRS $1724, R17 -cf301fd5| MSR R15, S3_7_C3_C0_6 -daea181b| MSUBW R24, R26, R22, R26 -e1a7109b| MSUB R16, R9, ZR, R1 -477f0d1b| MULW R13, R26, R7 -a17d1c9b| MUL R28, R13, R1 -fc9b79aa| MVN R25>>38, R28 -f71b904b| NEGW R16->6, R23 -e3df4acb| NEG R10>>55, R3 -f0334e6b| NEGSW R14>>12, R16 -e6031f5a| NGCW ZR, R6 -f40302da| NGC R2, R20 -ee03137a| NGCSW R19, R14 -ee0303fa| NGCS R3, R14 -1f2003d5| NOP -ab14e92a| ORNW R9@>5, R5, R11 -185c3faa| ORN ZR<<23, R0, R24 -a8850c32| ORRW $3145776, R13, R8 -cad023b2| ORR $-2025524839466146845, R6, R10 -5487ccaa| ORR R12@>33, R26, R20 -293783f9| PRFM 1640(R25), PLIL1STRM -501010d8| PRFM 32898(PC), PSTL1KEEP -bc7389f8| PRFUM 151(R29), $28 -9203c05a| RBITW R28, R18 -0501c0da| RBIT R8, R5 -40005fd6| RET R2 -940ac05a| REVW R20, R20 -ca0fc0da| REV R30, R10 -7807c05a| REV16W R27, R24 -fb06c0da| REV16 R23, R27 -dc0ac0da| REV32 R22, R28 -970dc0da| REV R12, R23 -42408813| EXTRW $16, R8, R2, R2 -5a96db93| EXTR $37, R27, R18, R26 -782cc41a| RORW R4, R3, R24 -8c2ec69a| ROR R6, R20, R12 -372ec61a| RORW R6, R17, R23 -b72ddc9a| ROR R28, R13, R23 -e501185a| SBCW R24, R15, R5 -ac0011da| SBC R17, R5, R12 -7a03067a| SBCSW R6, R27, R26 -310008fa| SBCS R8, R1, R17 -65837f93| SBFIZ $1, R27, $33, R5 -5c1b4793| SBFIZ $57, R26, $7, R28 -a71f5b93| SBFIZ $37, R29, $8, R7 -640ede1a| SDIVW R30, R19, R4 -2a0dd99a| SDIV R25, R9, R10 -9f2003d5| SEV -bf2003d5| SEVL -045c389b| SMADDL R24, R23, R0, R4 -6efe3e9b| SMNEGL R30, R19, R14 -ebac239b| SMSUBL R3, R11, R7, R11 -947f459b| SMULH R5, R28, R20 -d67e3e9b| SMULL R30, R22, R22 -6dff9f88| STLRW R13, (R27) -1ffd9fc8| STLR ZR, (R8) -a8fe9f08| STLRB R8, (R21) -abfd9f48| STLRH R11, (R13) -2ec02888| STLXPW (R14, R16), (R1), R8 -11993ec8| STLXP (R17, R6), (R8), R30 -bbfe0f88| STLXRW R27, (R21), R15 -e9fc09c8| STLXR R9, (R7), R9 -c6fe0708| STLXRB R6, (R22), R7 -c6fe0c48| STLXRH R6, (R22), R12 -b3283028| STNPW -128(R5), R10, R19 -252e26a8| STNP -416(R17), R11, R5 -9fb18c28| STP.P (ZR, R12), 100(R12) -9ce5aba8| STP.P (R28, R25), -328(R12) -e5d08229| STP.W (R5, R20), 20(R7) -d6e79ea9| STP.W (R22, R25), 488(R30) -9eef2029| STP (R30, R27), -252(R28) -57b314a9| STP (R23, R12), 328(R26) -eda503b8| MOVW.P R13, 58(R15) -62241df8| MOVD.P R2, -46(R3) -d2bd18b8| MOVW.W R18, -117(R14) -542d12f8| MOVD.W R20, -222(R10) -e92c3bb9| MOVW R9, 15148(R7) -de4804f9| MOVD R30, 2192(R6) -cce40b38| MOVB.P R12, 190(R6) -eafd1238| MOVB.W R10, -209(R15) -7fcb0639| MOVB ZR, 434(R27) -03f82738| MOVB R3, (R0)(R7.SXTX) -5c6a3e38| MOVB R28, (R18)(R30) -a8551978| MOVH.P R8, -107(R13) -9e6c0c78| MOVH.W R30, 198(R4) -c83d0e79| MOVH R8, 1822(R14) -502a1db8| STTRW -46(R18), R16 -ae180af8| STTR 161(R5), R14 -ea1a0138| STTRBW 17(R23), R10 -416b0278| STTRHW 38(R26), R1 -659107b8| MOVW R5, 121(R11) -6b611ff8| MOVD R11, -10(R11) -99a01c38| MOVB R25, -54(R4) -99421e78| MOVH R25, -28(R20) -3e2a2688| STXPW (R30, R10), (R17), R6 -2f6a2cc8| STXP (R15, R26), (R17), R12 -7d7f1b88| STXRW R29, (R27), R27 -6e7e1bc8| STXR R14, (R19), R27 -ec7c0208| STXRB R12, (R7), R2 -ee7f0648| STXRH R14, (RSP), R6 -2f8d204b| SUBW R0.SXTB<<3, R9, R15 -1fbe3acb| SUB R26.SXTH<<7, R16, RSP -5af778d1| SUB $(3645<<12), R26, R26 -6729034b| SUBW R3<<10, R11, R7 -ae683f6b| SUBSW ZR.UXTX<<2, R5, R14 -2f993deb| SUBS R29.SXTB<<6, R9, R15 -db0d5f71| SUBSW $(1987<<12), R14, R27 -3aec1ff1| SUBS $2043, R1, R26 -1f24016b| CMPW R1<<9, R0 -a1ae1bd4| SVC $56693 -a61e0013| SXTBW R21, R6 -441c4093| SXTB R2, R4 -0c3c0013| SXTHW R0, R12 -b33f4093| SXTH R29, R19 -407f4093| SXTW R26, R0 -455929d5| SYSL $88384, R5 -bf8c1f72| TSTW $1966110, R5 -ff10836a| TSTW R3->4, R7 -dfc5daea| TST R26@>49, R14 -aa6e43d3| UBFX $3, R21, $25, R10 -46181a53| UBFIZW $6, R2, $7, R6 -43294bd3| LSL $53, R10, R3 -77787dd3| UBFIZ $3, R3, $31, R23 -1a0bd61a| UDIVW R22, R24, R26 -9308c19a| UDIV R1, R4, R19 -755aa19b| UMADDL R1, R22, R19, R21 -1ffdbe9b| UMNEGL R30, R8, ZR -cbaaba9b| UMSUBL R26, R10, R22, R11 -0c7fdb9b| UMULH R27, R24, R12 -cc7da79b| UMULL R7, R14, R12 -3d1c0053| UXTBW R1, R29 -0e3f0053| UXTHW R24, R14 -5f2003d5| WFE -7f2003d5| WFI -3f2003d5| YIELD -71b9604e| VABS V11.H8, V17.H8 -5186f65e| VADD V22, V18, V17 -4986f34e| VADD V19.D2, V18.D2, V9.D2 -1243720e| VADDHN V18.S4, V24.S4, V18.H4 -0640354e| VADDHN2 V21.H8, V0.H8, V6.B16 -d9bdfa4e| VADDP V26.D2, V14.D2, V25.D2 -4c59284e| AESD V10.B16, V12.B16 -8c48284e| AESE V4.B16, V12.B16 -f47a284e| AESIMC V23.B16, V20.B16 -c56b284e| AESMC V30.B16, V5.B16 -bf1c3b0e| VAND V27.B8, V5.B8, V31.B8 -6444026f| VMVNI $(67<<16), V4.S4 -1357032f| VBIC $(120<<16), V19.S2 -561d6a0e| VBIC V10.B8, V10.B8, V22.B8 -cd1ff06e| VBIF V16.B16, V30.B16, V13.B16 -f31ebd6e| VBIT V29.B16, V23.B16, V19.B16 -6f1d6c2e| VBSL V12.B8, V11.B8, V15.B8 -1e48600e| VCLS V0.H4, V30.H4 -6948202e| VCLZ V3.B8, V9.B8 -968efd7e| VCMEQ V29, V20, V22 -e58f6d6e| VCMEQ V13.H8, V31.H8, V5.H8 -8f98600e| VCMEQ $0, V4.H4, V15.H4 -4f3db84e| VCMGE V24.S4, V10.S4, V15.S4 -2788a02e| VCMGE $0, V1.S2, V7.S2 -bf35714e| VCMGT V17.H8, V13.H8, V31.H8 -4a89604e| VCMGT $0, V10.H8, V10.H8 -9635252e| VCMHI V5.B8, V12.B8, V22.B8 -d83eff6e| VCMHS V31.D2, V22.D2, V24.D2 -cb99206e| VCMLE $0, V14.B16, V11.B16 -29a9604e| VCMLT $0, V9.H8, V9.H8 -d18eea5e| VCMTST V10, V22, V17 -d18ea94e| VCMTST V9.S4, V22.S4, V17.S4 -4a04075e| VMOV V2.B[3], V10 -0504040e| VDUP V0.S[0], V5.S2 -b20e1f4e| VDUP R21, V18.B16 -2a1f3e6e| VEOR V30.B16, V25.B16, V10.B16 -0bd5aa7e| FABD F10, F8, F11 -12d7b96e| VFABD V25.S4, V24.S4, V18.S4 -a1f9a04e| FABS V13.S4, V1.S4 -1ac3201e| FABSS F24, F26 -d8c3601e| FABSD F30, F24 -95ee267e| FACGE F6, F20, F21 -2bee262e| VFACGE V6.S2, V17.S2, V11.S2 -1aedec7e| FACGT F12, F8, F26 -74effa6e| VFACGT V26.D2, V27.D2, V20.D2 -7ed4260e| FADD V6.S2, V3.S2, V30.S2 -4528251e| FADDS F5, F2, F5 -262b661e| FADDD F6, F25, F6 -84d8707e| FADDP V4.D2, F4 -71d4276e| VFADDP V7.S4, V3.S4, V17.S4 -a5f43f1e| FCCMPS AL, F31, F5, $5 -20e5601e| FCCMPD AL, F0, F9, $0 -52d4331e| FCCMPES LE, F19, F2, $2 -1e66761e| FCCMPED VS, F22, F16, $14 -d7e6695e| FCMEQ F9, F22, F23 -e7d9a05e| FCMEQ $0, F15, F7 -dadaa04e| VFCMEQ $0, V22.S4, V26.S4 -28e5737e| FCMGE F19, F9, F8 -a2e73a6e| VFCMGE V26.S4, V29.S4, V2.S4 -4fcba07e| FCMGE $0, F26, F15 -43c8a02e| VFCMGE $0, V2.S2, V3.S2 -ffe5a67e| FCMGT F6, F15, F31 -7ee7bd2e| VFCMGT V29.S2, V27.S2, V30.S2 -5bc8e05e| FCMGT $0, F2, F27 -3dc9a04e| VFCMGT $0, V9.S4, V29.S4 -38daa07e| FCMLE $0, F17, F24 -8fdaa02e| VFCMLE $0, V20.S2, V15.S2 -93e8e05e| FCMLT $0, F4, F19 -9fe9a04e| VFCMLT $0, V12.S4, V31.S4 -a023201e| FCMPS F0, F29 -c822231e| FCMPS $(0.0), F22 -a022651e| FCMPD F5, F21 -a8227d1e| FCMPD $(0.0), F21 -70203e1e| FCMPES F30, F3 -38232b1e| FCMPES $(0.0), F25 -70206c1e| FCMPED F12, F3 -b823731e| FCMPED $(0.0), F29 -3e6f331e| FCSELS VS, F25, F19, F30 -a64f6d1e| FCSELD MI, F29, F13, F6 -0d41e21e| FCVTHS F8, F13 -cbc0e21e| FCVTHD F6, F11 -18c0231e| FCVTSH F0, F24 -a7c0221e| FCVTSD F5, F7 -e7c3631e| FCVTDH F31, F7 -9f43621e| FCVTDS F28, F31 -a0c8215e| FCVTAS F5, F0 -4dc8210e| VFCVTAS V2.S2, V13.S2 -0300241e| FCVTASW F0, R3 -fd03249e| FCVTAS F31, R29 -ef01641e| FCVTASW F15, R15 -4c01649e| FCVTAS F10, R12 -9ac8617e| FCVTAU F4, F26 -b802251e| FCVTAUW F21, R24 -2a03259e| FCVTAU F25, R10 -ea00651e| FCVTAUW F7, R10 -0102659e| FCVTAU F16, R1 -0d7a610e| VFCVTL V16.S2, V13.D2 -ed79214e| VFCVTL2 V15.H8, V13.S4 -43bb615e| FCVTMS F26, F3 -c000301e| FCVTMSW F6, R0 -9202309e| FCVTMS F20, R18 -0800701e| FCVTMSW F0, R8 -6603709e| FCVTMS F27, R6 -f0b9217e| FCVTMU F15, F16 -3bba212e| VFCVTMU V17.S2, V27.S2 -5900311e| FCVTMUW F2, R25 -9a03319e| FCVTMU F28, R26 -fa01711e| FCVTMUW F15, R26 -6f01719e| FCVTMU F11, R15 -1968210e| VFCVTN V0.S4, V25.H4 -3d69214e| VFCVTN2 V9.S4, V29.H8 -87aa615e| FCVTNS F20, F7 -e301201e| FCVTNSW F15, R3 -6002209e| FCVTNS F19, R0 -1600601e| FCVTNSW F0, R22 -8503609e| FCVTNS F28, R5 -f5ab617e| FCVTNU F31, F21 -2b02211e| FCVTNUW F17, R11 -f902219e| FCVTNU F23, R25 -0702611e| FCVTNUW F16, R7 -9d03619e| FCVTNU F28, R29 -dcaba15e| FCVTPS F30, F28 -b4a8a10e| VFCVTPS V5.S2, V20.S2 -5302281e| FCVTPSW F18, R19 -e003289e| FCVTPS F31, R0 -9501681e| FCVTPSW F12, R21 -6703689e| FCVTPS F27, R7 -68a8a17e| FCVTPU F3, F8 -dcaba12e| VFCVTPU V30.S2, V28.S2 -9d03291e| FCVTPUW F28, R29 -5f01299e| FCVTPU F10, ZR -e101691e| FCVTPUW F15, R1 -3f00699e| FCVTPU F1, ZR -ee6b612e| VFCVTXN V31.D2, V14.S2 -b1fd215f| FCVTZS $31, F13, F17 -bafd2c0f| FCVTZS $20, V13.S2, V26.S2 -47b8e15e| FCVTZSDD F2, F7 -dcbbe14e| FCVTZS V30.D2, V28.D2 -56f8181e| FCVTZS $2, F2, R22 -9265189e| FCVTZS $39, F12, R18 -d3ad581e| FCVTZS $21, F14, R19 -3d9b589e| FCVTZS $26, F25, R29 -1a00381e| FCVTZSSW F0, R26 -d302389e| FCVTZSS F22, R19 -5303781e| FCVTZSDW F26, R19 -8f01789e| FCVTZSD F12, R15 -57fe537f| FCVTZU $45, F18, F23 -beff796f| FCVTZU $7, V29.D2, V30.D2 -08b9e17e| FCVTZUDD F8, F8 -cdbbe16e| FCVTZU V30.D2, V13.D2 -2126199e| FCVTZU $55, F17, R1 -70a9591e| FCVTZU $22, F11, R16 -8c25599e| FCVTZU $55, F12, R12 -1201391e| FCVTZUSW F8, R18 -0800399e| FCVTZUS F0, R8 -da00791e| FCVTZUDW F6, R26 -2903799e| FCVTZUD F25, R9 -56fd3f2e| FDIV V31.S2, V10.S2, V22.S2 -1f182e1e| FDIVS F14, F0, F31 -ce1b741e| FDIVD F20, F30, F14 -0d61021f| FMADDS F2, F24, F8, F13 -03205e1f| FMADDD F30, F8, F0, F3 -72f6654e| FMAX V5.D2, V19.D2, V18.D2 -1849281e| FMAXS F8, F8, F24 -8e4a6e1e| FMAXD F14, F20, F14 -54c7304e| FMAXNM V16.S4, V26.S4, V20.S4 -91683a1e| FMAXNMS F26, F4, F17 -f56a721e| FMAXNMD F18, F23, F21 -c8cb307e| FMAXNMP V30.S2, F8 -06c9306e| FMAXNMV V8.S4, F6 -b6fb707e| FMAXP V29.D2, F22 -1759341e| FMINS F20, F8, F23 -675b721e| FMIND F18, F27, F7 -69792d1e| FMINNMS F13, F11, F9 -ab786b1e| FMINNMD F11, F5, F11 -0fcab07e| FMINNMP V16.S2, F15 -d2c6b26e| VFMINNMP V18.S4, V22.S4, V18.S4 -22fab07e| FMINP V17.S2, F2 -f5f5f56e| VFMINP V21.D2, V15.D2, V21.D2 -bc13c95f| FMLA V9.D[0], F29, F28 -5d51a85f| FMLS V8.S[1], F10, F29 -d3ccb94e| VFMLS V25.S4, V6.S4, V19.S4 -5bf4014f| FMOV $9., V27.S4 -5bf5026f| FMOV $0.203125, V27.D2 -6541201e| FMOVS F11, F5 -b742601e| FMOVD F21, F23 -6002271e| FMOVS R19, F0 -5301261e| FMOVS F10, R19 -c103679e| FMOVD R30, F1 -3301af9e| FMOV R9, V19.D[1] -bd00669e| FMOVD F5, R29 -ee02ae9e| FMOV V23.D[1], R14 -0ff0251e| FMOVS $15.5, F15 -16506a1e| FMOVD $0.28125, F22 -d1c20e1f| FMSUBS F14, F16, F22, F17 -fdae491f| FMSUBD F9, F11, F23, F29 -a4989d4f| FMUL V29.S[2], V5.S4, V4.S4 -efde706e| FMUL V16.D2, V23.D2, V15.D2 -190a291e| FMULS F9, F16, F25 -430a671e| FMULD F7, F18, F3 -21919e7f| FMULX V30.S[0], F9, F1 -5298c76f| VFMULX V7.D[1], V2.D2, V18.D2 -1ddf3c5e| FMULX F28, F24, F29 -a2fba06e| FNEG V29.S4, V2.S4 -7a40211e| FNEGS F3, F26 -f843611e| FNEGD F31, F24 -326b381f| FNMADDS F24, F26, F25, F18 -4b636a1f| FNMADDD F10, F24, F26, F11 -48fa201f| FNMSUBS F0, F30, F18, F8 -04d87f1f| FNMSUBD F31, F22, F0, F4 -0289371e| FNMULS F23, F8, F2 -0e8a691e| FNMULD F9, F16, F14 -05dba15e| FRECPE F24, F5 -42d9a14e| VFRECPE V10.S4, V2.S4 -2eff655e| FRECPS F5, F25, F14 -03fe774e| VFRECPS V23.D2, V16.D2, V3.D2 -b4fba15e| FRECPX F29, F20 -9d41261e| FRINTAS F12, F29 -ea42661e| FRINTAD F23, F10 -e399a16e| FRINTI V15.S4, V3.S4 -6ec3271e| FRINTIS F27, F14 -ecc1671e| FRINTID F15, F12 -4543251e| FRINTMS F26, F5 -f242651e| FRINTMD F23, F18 -898a214e| FRINTN V20.S4, V9.S4 -1641241e| FRINTNS F8, F22 -5341641e| FRINTND F10, F19 -248be14e| FRINTP V25.D2, V4.D2 -35c2241e| FRINTPS F17, F21 -6fc3641e| FRINTPD F27, F15 -0940271e| FRINTXS F0, F9 -4643671e| FRINTXD F26, F6 -749aa14e| FRINTZ V19.S4, V20.S4 -8bc0251e| FRINTZS F4, F11 -7cc1651e| FRINTZD F11, F28 -dedbe17e| FRSQRTE F30, F30 -04daa16e| VFRSQRTE V16.S4, V4.S4 -cdfce45e| FRSQRTS F4, F6, F13 -d9fda04e| VFRSQRTS V0.S4, V14.S4, V25.S4 -c5c1211e| FSQRTS F14, F5 -67c1611e| FSQRTD F11, F7 -a4d6b14e| FSUB V17.S4, V21.S4, V4.S4 -6138351e| FSUBS F21, F3, F1 -be3b6a1e| FSUBD F10, F29, F30 -4d2f016e| VMOV V26.B[5], V13.B[0] -741e174e| VMOV R19, V20.B[11] -e170404c| VLD1 (R7), [V1.B16] -7aa9404c| VLD1 (R11), [V26.S4, V27.S4] -4b6d400c| VLD1 (R10), [V11.D1, V12.D1, V13.D1] -582b400c| VLD1 (R26), [V24.S2, V25.S2, V26.S2, V27.S2] -8f7cdf4c| VLD1.P 16(R4), [V15.D2] -0a76ce4c| VLD1.P (R16)(R14), [V10.H8] -2aa6df0c| VLD1.P 16(R17), [V10.H4, V11.H4] -35a7d70c| VLD1.P (R25)(R23), [V21.H4, V22.H4] -ae6ddf4c| VLD1.P 48(R13), [V14.D2, V15.D2, V16.D2] -b362d74c| VLD1.P (R21)(R23), [V19.B16, V20.B16, V21.B16] -6d22df0c| VLD1.P 32(R19), [V13.B8, V14.B8, V15.B8, V16.B8] -6722c90c| VLD1.P (R19)(R9), [V7.B8, V8.B8, V9.B8, V10.B8] -c71f404d| VLD1 (R30), V7.B[15] -f55a400d| VLD1 (R23), V21.H[3] -f080400d| VLD1 (R7), V16.S[0] -ed84404d| VLD1 (R7), V13.D[1] -fd0bdf4d| VLD1.P 1(RSP), V29.B[10] -c811dc0d| VLD1.P (R14)(R28), V8.B[4] -6548cb4d| VLD1.P (R3)(R11), V5.H[5] -9882df4d| VLD1.P 4(R20), V24.S[2] -f482c74d| VLD1.P (R23)(R7), V20.S[2] -0d87df0d| VLD1.P 8(R24), V13.D[0] -1b85db0d| VLD1.P (R8)(R27), V27.D[0] -58c3404d| VLD1R (R26), [V24.B16] -c0c6df4d| VLD1R 2(R22), [V0.H8] -a6cec90d| VLD1R (R21)(R9), [V6.D1] -e68a400c| VLD2 (R23), [V6.S2, V7.S2] -4007604d| LD2 (R26), [V0.B, V1.B][9] -8c49604d| LD2 (R12), [V12.H, V13.H][5] -4f92600d| LD2 (R18), [V15.S, V16.S][1] -b186600d| LD2 (R21), [V17.D, V18.D][0] -631aff0d| LD2 2(R19), [V3.B, V4.B][6] -330ceb4d| LD2 (R1)(R11), [V19.B, V20.B][11] -454bff4d| LD2 4(R26), [V5.H, V6.H][5] -0792ff0d| LD2 8(R16), [V7.S, V8.S][1] -3b91fd0d| LD2 (R9)(R29), [V27.S, V28.S][1] -b086ff4d| LD2 16(R21), [V16.D, V17.D][1] -da86e30d| LD2 (R22)(R3), [V26.D, V27.D][0] -e7cf604d| VLD2R (RSP), [V7.D2, V8.D2] -5ac8ff0d| VLD2R 8(R2), [V26.S2, V27.S2] -13c1f10d| VLD2R (R8)(R17), [V19.B8, V20.B8] -0947404c| VLD3 (R24), [V9.H8, V10.H8, V11.H8] -8043df0c| VLD3 24(R28), [V0.B8, V1.B8, V2.B8] -6344d50c| VLD3 (R3)(R21), [V3.H4, V4.H4, V5.H4] -663d400d| LD3 (R11), [V6.B, V7.B, V8.B][7] -5b6b400d| LD3 (R26), [V27.H, V28.H, V29.H][1] -02a0404d| LD3 (R0), [V2.S, V3.S, V4.S][2] -e1a5404d| LD3 (R15), [V1.D, V2.D, V3.D][1] -b53edf0d| LD3 3(R21), [V21.B, V22.B, V23.B][7] -f625d10d| LD3 (R15)(R17), [V22.B, V23.B, V24.B][1] -3d7bda4d| LD3 (R25)(R26), [V29.H, V30.H, V31.H][7] -6ea0df0d| LD3 12(R3), [V14.S, V15.S, V16.S][0] -d9a0c60d| LD3 (R6)(R6), [V25.S, V26.S, V27.S][0] -b6a7df0d| LD3 24(R29), [V22.D, V23.D, V24.D][0] -dfa6d94d| LD3 (R22)(R25), [V31.D, V0.D, V1.D][1] -7de9404d| VLD3R (R11), [V29.S4, V30.S4, V31.S4] -2fe6df4d| VLD3R 6(R17), [V15.H8, V16.H8, V17.H8] -cae7c84d| VLD3R (R30)(R8), [V10.H8, V11.H8, V12.H8] -9a0b400c| VLD4 (R28), [V26.S2, V27.S2, V28.S2, V29.S2] -4b03df0c| VLD4 32(R26), [V11.B8, V12.B8, V13.B8, V14.B8] -8e0bcc4c| VLD4 (R28)(R12), [V14.S4, V15.S4, V16.S4, V17.S4] -182c604d| LD4 (R0), [V24.B, V25.B, V26.B, V27.B][11] -feb2600d| LD4 (R23), [V30.S, V31.S, V0.S, V1.S][1] -59a4604d| LD4 (R2), [V25.D, V26.D, V27.D, V28.D][1] -9b25ff4d| LD4 4(R12), [V27.B, V28.B, V29.B, V30.B][9] -1f35e84d| LD4 (R8)(R8), [V31.B, V0.B, V1.B, V2.B][13] -91b2ff4d| LD4 16(R20), [V17.S, V18.S, V19.S, V20.S][3] -88b3ed4d| LD4 (R28)(R13), [V8.S, V9.S, V10.S, V11.S][3] -9aa5ff4d| LD4 32(R12), [V26.D, V27.D, V28.D, V29.D][1] -efa5e10d| LD4 (R15)(R1), [V15.D, V16.D, V17.D, V18.D][0] -07ed604d| VLD4R (R8), [V7.D2, V8.D2, V9.D2, V10.D2] -0defff0d| VLD4R 32(R24), [V13.D1, V14.D1, V15.D1, V16.D1] -43e1f14d| VLD4R (R10)(R17), [V3.B16, V4.B16, V5.B16, V6.B16] -136e682c| VLDNP -192(R16), V27, V19 -cc67676c| VLDNP -400(R30), V25, V12 -e6dd4eac| VLDNP 464(R15), V23, V6 -b7e9c22c| LDP.P 20(R13), (V23, V26) -92c3fe6c| LDP.P -24(R28), (V18, V16) -f281e6ac| LDP.P -816(R15), (V18, V0) -4f06cd2d| LDP.W 104(R18), (V15, V1) -0f6fdc6d| LDP.W 448(R24), (V15, V27) -170ccbad| LDP.W 352(R0), (V23, V3) -71ea7a2d| LDP -44(R19), (V17, V26) -c8816c6d| LDP -312(R14), (V8, V0) -da6540ad| LDP (R14), (V26, V25) -92064c3c| MOVD.P 192(R20), V18 -94d4577c| MOVD.P -131(R4), V20 -39055fbc| FMOVS.P -16(R9), F25 -989551fc| FMOVD.P -231(R12), F24 -4764c23c| MOVD.P 38(R2), V7 -c15e4e3c| MOVD.W 229(R22), V1 -c8ce487c| MOVD.W 140(R22), V8 -ca5d5bbc| FMOVS.W -75(R14), F10 -34fd56fc| FMOVD.W -145(R9), F20 -bd0dd53c| MOVD.W -176(R13), V29 -ab65443d| MOVD 281(R13), V11 -cb57537d| MOVD 2474(R30), V11 -f2606fbd| FMOVS 12128(R7), F18 -088b67fd| FMOVD 20240(R24), F8 -0173ce3d| MOVD 14784(R24), V1 -ba112c1c| FMOVS 90253(PC), F26 -e489c25c| FMOVD -125873(PC), F4 -3cdb753c| MOVD (R25)(R21.SXTW), V28 -726b733c| MOVD (R27)(R19), V18 -395b627c| MOVD (R25)(R2.UXTW<<1), V25 -9b486cbc| FMOVS (R4)(R12.UXTW), F27 -1cda7efc| FMOVD (R16)(R30.SXTW<<3), F28 -365bf33c| MOVD (R25)(R19.UXTW<<4), V22 -43a1413c| VLDUR 26(R10), V3 -c7034f7c| VLDUR 240(R30), V7 -ad8350bc| VLDUR -248(R29), V13 -07a350fc| VLDUR -246(R24), V7 -0212c63c| VLDUR 97(R16), V2 -6f0a7a2f| VMLA V10.H[7], V19.H4, V15.H4 -fe95294e| VMLA V9.B16, V15.B16, V30.B16 -f24a4f2f| VMLS V15.H[4], V23.H4, V18.H4 -26947e2e| VMLS V30.H4, V1.H4, V6.H4 -6606115e| VMOV V19.B[8], V6 -0866116e| VMOV V16.B[12], V8.B[8] -6e1d0f4e| VMOV R11, V14.B[7] -6d1fa10e| VORR V1.B8, V27.B8, V13.B8 -b93f1a0e| VMOV V29.H[6], R25 -74e7020f| VMOVI $91, V20.B8 -0ff4040f| FMOV $-2., V15.S2 -4c47060f| VMOVI $(218<<16), V12.S2 -aa06064f| VMOVI $213, V10.S4 -8de4042f| VMOVI $-72057594021216256, V13 -b1e6046f| VMOVI $-72056498804555521, V17.D2 -609f214e| VMUL V1.B16, V27.B16, V0.B16 -9f5a206e| VMVN V20.B16, V31.B16 -da65032f| VMVNI $(110<<24), V26.S2 -4d36036f| VBIC $(114<<8), V13.S4 -4d66052f| VMVNI $(178<<24), V13.S2 -a4bbe06e| VNEG V29.D2, V4.D2 -bf5a206e| VMVN V21.B16, V31.B16 -2b1fe24e| VORN V2.B16, V25.B16, V11.B16 -22e4024f| VMOVI $65, V2.B16 -3086050f| VMOVI $177, V16.H4 -051db80e| VORR V24.B8, V8.B8, V5.B8 -48e2290e| VPMULL V9.B8, V18.B8, V8.H8 -7341652e| VRADDHN V5.S4, V11.S4, V19.H4 -1b417f6e| VRADDHN2 V31.S4, V8.S4, V27.H8 -e158606e| VRBIT V7.B16, V1.B16 -f418200e| VREV16 V7.B8, V20.B8 -228d2a0f| VRSHRN $22, V9.D2, V2.S2 -a861aa2e| VRSUBHN V10.D2, V13.D2, V8.S2 -7160786e| VRSUBHN2 V24.S4, V3.S4, V17.H8 -cc7f314e| VSABA V17.B16, V30.B16, V12.B16 -1350644e| VSABAL2 V4.H8, V0.H8, V19.S4 -a1757d4e| VSABD V29.H8, V13.H8, V1.H8 -0971a00e| VSABDL V0.S2, V8.S2, V9.D2 -af70214e| VSABDL2 V1.B16, V5.B16, V15.H8 -626ba04e| VSADALP V27.S4, V2.D2 -1503374e| VSADDL2 V23.B16, V24.B16, V21.H8 -592b204e| VSADDLP V26.B16, V25.H8 -d813600e| VSADDW V0.H4, V30.S4, V24.S4 -31e5210f| SCVTF $31, V9.S2, V17.S2 -aeda215e| SCVTFSS F21, F14 -f0e9021e| SCVTF $6, R15, F16 -42b4421e| SCVTF $19, R2, F2 -8b10029e| SCVTF $60, R4, F11 -59e6429e| SCVTF $7, R18, F25 -cf01221e| SCVTFWS R14, F15 -2d03621e| SCVTFWD R25, F13 -af00229e| SCVTFS R5, F15 -bf00629e| SCVTFD R5, F31 -2a02025e| SHA1C V2.S4, V17, V10 -8b0b285e| SHA1H V28, V11 -11201f5e| SHA1M V31.S4, V0, V17 -f110115e| SHA1P V17.S4, V7, V17 -b732115e| SHA1SU0 V17.S4, V21.S4, V23.S4 -cf18285e| SHA1SU1 V6.S4, V15.S4 -2e520f5e| SHA256H2 V15.S4, V17, V14 -77401a5e| SHA256H V26.S4, V3, V23 -b92a285e| SHA256SU0 V21.S4, V25.S4 -7e63175e| SHA256SU1 V23.S4, V27.S4, V30.S4 -d504ab0e| VSHADD V11.S2, V6.S2, V21.S2 -5a54734f| VSHL $51, V2.D2, V26.D2 -0638212e| VSHLL $8, V0.B8, V6.H8 -a238216e| VSHLL2 $8, V5.B16, V2.H8 -f5863e0f| VSHRN $2, V23.D2, V21.S2 -f187234f| VSHRN2 $29, V31.D2, V17.S4 -e124b04e| VSHSUB V16.S4, V7.S4, V1.S4 -3657252f| VSLI $5, V25.S2, V22.S2 -c266aa4e| VSMAX V10.S4, V22.S4, V2.S4 -2c6ca74e| VSMIN V7.S4, V1.S4, V12.S4 -4aae390e| VSMINP V25.B8, V18.B8, V10.B8 -1a82ba0e| VSMLAL V26.S2, V16.S2, V26.D2 -2381ad4e| VSMLAL2 V13.S4, V9.S4, V3.D2 -0da17a4e| VSMLSL2 V26.H8, V8.H8, V13.S4 -4f2e0d4e| SMOV V18.B[6], R15 -e4a0980f| VSMULL V24.S[0], V7.S2, V4.D2 -51c2220e| VSMULL V2.B8, V18.B8, V17.H8 -01c26d4e| VSMULL2 V13.H8, V16.H8, V1.S4 -f978205e| VSQABS V7, V25 -760cef5e| VSQADD V15, V3, V22 -390c224e| VSQADD V2.B16, V1.B16, V25.B16 -5439455f| VSQDMLAL V5.H[4], V10, V20 -8391765e| VSQDMLAL V22, V12, V3 -c9907a4e| VSQDMLAL2 V26.H8, V6.H8, V9.S4 -0b73445f| VSQDMLSL V4.H[0], V24, V11 -8e728d0f| VSQDMLSL V13.S[0], V20.S2, V14.D2 -fe787d4f| VSQDMLSL2 V13.H[7], V7.H8, V30.S4 -bdb2b55e| VSQDMLSL V21, V21, V29 -d0c9be4f| VSQDMULH V30.S[3], V14.S4, V16.S4 -89b77c5e| VSQDMULH V28, V28, V9 -c9bb515f| VSQDMULL V1.H[5], V30, V9 -5379e07e| VSQNEG V10, V19 -4b7aa06e| VSQNEG V18.S4, V11.S4 -1bd1750f| VSQRDMULH V5.H[3], V8.H4, V27.H4 -f55e755e| VSQRSHL V21, V23, V21 -ba5fbd4e| VSQRSHL V29.S4, V29.S4, V26.S4 -ba9d1e0f| VSQRSHRN $2, V13.S4, V26.H4 -3d9c284f| VSQRSHRN2 $24, V1.D2, V29.S4 -8a8f2c6f| VSQRSHRUN2 $20, V28.D2, V10.S4 -eb760b5f| VSQSHL $3, V23, V11 -4a77220f| VSQSHL $2, V26.S2, V10.S2 -6c4cfb5e| VSQSHL V27, V3, V12 -ad4eba4e| VSQSHL V26.S4, V21.S4, V13.S4 -9364257f| VSQSHLU $5, V4, V19 -b267392f| VSQSHLU $25, V29.S2, V18.S2 -c085042f| VMVNI $142, V0.H4 -7584326f| VSQSHRUN2 $14, V3.D2, V21.S4 -3a2fe25e| VSQSUB V2, V25, V26 -2c2ca34e| VSQSUB V3.S4, V1.S4, V12.S4 -484ba15e| VSQXTN V26, V8 -824b210e| VSQXTN V28.H8, V2.B8 -5b48214e| VSQXTN2 V2.H8, V27.B16 -e228a16e| VSQXTUN2 V7.D2, V2.S4 -1c44416f| VSRI $63, V0.D2, V28.D2 -1e56eb5e| VSRSHL V11, V16, V30 -bb56fe4e| VSRSHL V30.D2, V21.D2, V27.D2 -c6262d0f| VSRSHR $19, V22.S2, V6.S2 -0c366c5f| VSRSRA $20, V16, V12 -13376e4f| VSRSRA $18, V24.D2, V19.D2 -7ba5040f| VMOVI $(139<<8), V27.H4 -9c076f5f| VSSHR $17, V28, V28 -2804434f| VSSHR $61, V1.D2, V8.D2 -b717535f| VSSRA $45, V29, V23 -c2160f0f| VSSRA $1, V22.B8, V2.B8 -8a333a4e| VSSUBW2 V26.B16, V28.H8, V10.H8 -3a70000c| VST1 [V26.B8], (R1) -1bab004c| VST1 [V27.S4, V28.S4], (R24) -8d69004c| VST1 [V13.S4, V14.S4, V15.S4], (R12) -9c26004c| VST1 [V28.H8, V29.H8, V30.H8, V31.H8], (R20) -c87a9f0c| VST1.P [V8.S2], 8(R22) -5a7f800c| VST1.P [V26.D1], (R26)(R0) -eea99f4c| VST1.P [V14.S4, V15.S4], 32(R15) -11af9d4c| VST1.P [V17.D2, V18.D2], (R24)(R29) -ec689f0c| VST1.P [V12.S2, V13.S2, V14.S2], 24(R7) -8662900c| VST1.P [V6.B8, V7.B8, V8.B8], (R20)(R16) -0b249f4c| VST1.P [V11.H8, V12.H8, V13.H8, V14.H8], 64(R0) -6b2d8b4c| VST1.P [V11.D2, V12.D2, V13.D2, V14.D2], (R11)(R11) -3212004d| VST1 V18.B[12], (R17) -3392004d| VST1 V19.S[3], (R17) -0284000d| VST1 V2.D[0], (R0) -340f9f0d| VST1.P V20.B[3], 1(R25) -0d069a4d| VST1.P V13.B[9], (R16)(R26) -2e51950d| VST1.P V14.H[2], (R9)(R21) -3f839f0d| VST1.P V31.S[0], 4(R25) -1492844d| VST1.P V20.S[3], (R16)(R4) -dd869f4d| VST1.P V29.D[1], 8(R22) -2e869b4d| VST1.P V14.D[1], (R17)(R27) -1e87000c| VST2 (R24), [V30.H4, V31.H4] -07829f0c| VST2 16(R16), [V7.B8, V8.B8] -d38a884c| VST2 (R22)(R8), [V19.S4, V20.S4] -541c204d| ST2 (R2), [V20.B, V21.B][15] -9180200d| ST2 (R4), [V17.S, V18.S][0] -2585204d| ST2 (R9), [V5.D, V6.D][1] -2f06bf4d| ST2 2(R17), [V15.B, V16.B][9] -3b08b44d| ST2 (R1)(R20), [V27.B, V28.B][10] -805bbf0d| ST2 4(R28), [V0.H, V1.H][3] -fb80bf0d| ST2 8(R7), [V27.S, V28.S][0] -6290a80d| ST2 (R3)(R8), [V2.S, V3.S][1] -b587bf4d| ST2 16(R29), [V21.D, V22.D][1] -2c84b64d| ST2 (R1)(R22), [V12.D, V13.D][1] -22469f0c| VST3 24(R17), [V2.H4, V3.H4, V4.H4] -0e30004d| ST3 (R0), [V14.B, V15.B, V16.B][12] -62a1004d| ST3 (R11), [V2.S, V3.S, V4.S][2] -54a4000d| ST3 (R2), [V20.D, V21.D, V22.D][0] -84259f4d| ST3 3(R12), [V4.B, V5.B, V6.B][9] -693c9d4d| ST3 (R3)(R29), [V9.B, V10.B, V11.B][15] -5b709f0d| ST3 6(R2), [V27.H, V28.H, V29.H][2] -e47a960d| ST3 (R23)(R22), [V4.H, V5.H, V6.H][3] -a0a39f0d| ST3 12(R29), [V0.S, V1.S, V2.S][0] -37b0890d| ST3 (R1)(R9), [V23.S, V24.S, V25.S][1] -9aa59f4d| ST3 24(R12), [V26.D, V27.D, V28.D][1] -26a5924d| ST3 (R9)(R18), [V6.D, V7.D, V8.D][1] -3e05000c| VST4 (R9), [V30.H4, V31.H4, V0.H4, V1.H4] -a8039f0c| VST4 32(R29), [V8.B8, V9.B8, V10.B8, V11.B8] -4126204d| ST4 (R18), [V1.B, V2.B, V3.B, V4.B][9] -3b71204d| ST4 (R9), [V27.H, V28.H, V29.H, V30.H][6] -f2b3204d| ST4 (RSP), [V18.S, V19.S, V20.S, V21.S][3] -7fa4200d| ST4 (R3), [V31.D, V0.D, V1.D, V2.D][0] -562ebf4d| ST4 4(R18), [V22.B, V23.B, V24.B, V25.B][11] -563cae0d| ST4 (R2)(R14), [V22.B, V23.B, V24.B, V25.B][7] -1271bf4d| ST4 8(R8), [V18.H, V19.H, V20.H, V21.H][6] -e7a1bf0d| ST4 16(R15), [V7.S, V8.S, V9.S, V10.S][0] -f3b2a30d| ST4 (R23)(R3), [V19.S, V20.S, V21.S, V22.S][1] -eca5bf4d| ST4 32(R15), [V12.D, V13.D, V14.D, V15.D][1] -4ca7bb0d| ST4 (R26)(R27), [V12.D, V13.D, V14.D, V15.D][0] -4f5b182c| VSTNP 192(R26), V22, V15 -e05e0b6c| VSTNP 176(R23), V23, V0 -77be2eac| VSTNP -560(R19), V15, V23 -bb3fa72c| STP.P (V27, V15), -200(R29) -ef18bb6c| STP.P (V15, V6), -80(R7) -777d84ac| STP.P (V23, V31), 128(R11) -d0f9952d| STP.W (V16, V30), 172(R14) -125ca26d| STP.W (V18, V23), -480(R0) -33bbbfad| STP.W (V19, V14), -16(R25) -6ebb322d| STP (V14, V14), -108(R27) -cb92096d| STP (V11, V4), 152(R22) -f2871dad| STP (V18, V1), 944(RSP) -f676003c| MOVD.P V22, 7(R23) -50f50d7c| MOVD.P V16, 223(R10) -0d251ebc| FMOVS.P F13, -30(R8) -1f3510fc| FMOVD.P F31, -253(R8) -05a4883c| MOVD.P V5, 138(R0) -800e063c| MOVD.W V0, 96(R20) -668d157c| MOVD.W V6, -168(R11) -1f3d11bc| FMOVS.W F31, -237(R8) -71bf06fc| FMOVD.W F17, 107(R27) -f50c843c| MOVD.W V21, 64(R7) -f186013d| MOVD V17, 97(R23) -f0e5357d| MOVD V16, 6898(R15) -938d3bbd| FMOVS F19, 15244(R12) -aeb813fd| FMOVD F14, 10096(R5) -2cc4943d| MOVD V12, 21264(R1) -e2f8263c| MOVD V2, (R7)(R6.SXTX) -1d79373c| MOVD V29, (R8)(R23) -bc70003c| MOVD V28, 7(R5) -7190157c| MOVD V17, -167(R3) -073309bc| FMOVS F7, 147(R24) -298100fc| FMOVD F9, 8(R9) -e8c1843c| MOVD V8, 76(R15) -3384266e| VSUB V6.B16, V1.B16, V19.B16 -9163750e| VSUBHN V21.S4, V28.S4, V17.H4 -f3627d4e| VSUBHN2 V29.S4, V23.S4, V19.H8 -1939205e| VSUQADD V8, V25 -0638604e| VSUQADD V0.H8, V6.H8 -81a4284f| VSSHLL2 $8, V4.S4, V1.D2 -f920030e| VTBL V3.B8, [V7.B16, V8.B16], V25.B8 -71400e4e| VTBL V14.B16, [V3.B16, V4.B16, V5.B16], V17.B16 -bc630d4e| VTBL V13.B16, [V29.B16, V30.B16, V31.B16, V0.B16], V28.B16 -6803030e| VTBL V3.B8, [V27.B16], V8.B8 -4b32124e| VTBX V18.B16, [V18.B16, V19.B16], V11.B16 -8f50170e| VTBX V23.B8, [V4.B16, V5.B16, V6.B16], V15.B8 -5673020e| VTBX V2.B8, [V26.B16, V27.B16, V28.B16, V29.B16], V22.B8 -f2130f4e| VTBX V15.B16, [V31.B16], V18.B16 -9e29c34e| VTRN1 V3.D2, V12.D2, V30.D2 -9b6bcf4e| VTRN2 V15.D2, V28.D2, V27.D2 -157cb02e| VUABA V16.S2, V0.S2, V21.S2 -28513c2e| VUABAL V28.B8, V9.B8, V8.H8 -f950a26e| VUABAL2 V2.S4, V7.S4, V25.D2 -a776b26e| VUABD V18.S4, V21.S4, V7.S4 -da726b2e| VUABDL V11.H4, V22.H4, V26.S4 -9473746e| VUABDL2 V20.H8, V28.H8, V20.S4 -aa6b602e| VUADALP V29.H4, V10.S2 -ac013d2e| VUADDL V29.B8, V13.B8, V12.H8 -e500a86e| VUADDL2 V8.S4, V7.S4, V5.D2 -9c28a02e| VUADDLP V4.S2, V28.D1 -4c3a302e| VUADDLV V18.B8, V12 -2810b62e| VUADDW V22.S2, V1.D2, V8.D2 -f2132d6e| VUADDW2 V13.B16, V31.H8, V18.H8 -b3e67f7f| UCVTF $1, F21, F19 -ece5676f| UCVTF $25, V15.D2, V12.D2 -d7d8217e| UCVTFSS F6, F23 -cdd9212e| UCVTF V14.S2, V13.S2 -5788031e| UCVTF $30, R2, F23 -c7ac431e| UCVTF $21, R6, F7 -0777039e| UCVTF $35, R24, F7 -e4f4439e| UCVTF $3, R7, F4 -9100231e| UCVTFWS R4, F17 -e202631e| UCVTFWD R23, F2 -3903239e| UCVTFS R25, F25 -2001639e| UCVTFD R9, F0 -2a07b76e| VUHADD V23.S4, V25.S4, V10.S4 -dc25372e| VUHSUB V23.B8, V14.B8, V28.B8 -de646f2e| VUMAX V15.H4, V6.H4, V30.H4 -4ba6766e| VUMAXP V22.H8, V18.H8, V11.H8 -e26db42e| VUMIN V20.S2, V15.S2, V2.S2 -a7ae712e| VUMINP V17.H4, V21.H4, V7.H4 -afaa716e| VUMINV V21.H8, V15 -42298c2f| VUMLAL V12.S[2], V10.S2, V2.D2 -0a826e2e| VUMLAL V14.H4, V16.H4, V10.S4 -2681a06e| VUMLAL2 V0.S4, V9.S4, V6.D2 -2860bd6f| VUMLSL2 V29.S[1], V1.S4, V8.D2 -19a26b6e| VUMLSL2 V11.H8, V16.H8, V25.S4 -8a3d140e| VMOV V12.S[2], R10 -22a1ba6f| VUMULL2 V26.S[1], V9.S4, V2.D2 -15c0712e| VUMULL V17.H4, V0.H4, V21.S4 -2ec0296e| VUMULL2 V9.B16, V1.B16, V14.H8 -6e0fba7e| VUQADD V26, V27, V14 -db0fe06e| VUQADD V0.D2, V30.D2, V27.D2 -535e6c7e| VUQRSHL V12, V18, V19 -7c5cfe6e| VUQRSHL V30.D2, V3.D2, V28.D2 -9a9e327f| VUQRSHRN $14, V20, V26 -339f0b2f| VUQRSHRN $5, V25.H8, V19.B8 -7e77337f| VUQSHL $19, V27, V30 -8b4d657e| VUQSHL V5, V12, V11 -414c622e| VUQSHL V2.H4, V2.H4, V1.H4 -95942b2f| VUQSHRN $21, V4.D2, V21.S2 -d396246f| VUQSHRN2 $28, V22.D2, V19.S4 -b22ff27e| VUQSUB V18, V29, V18 -b32e756e| VUQSUB V21.H8, V21.H8, V19.H8 -0e4b616e| VUQXTN2 V24.S4, V14.H8 -ca16236e| VURHADD V3.B16, V22.B16, V10.B16 -1f57a26e| VURSHL V2.S4, V24.S4, V31.S4 -8324777f| VURSHR $9, V4, V3 -37caa16e| VURSQRTE V17.S4, V23.S4 -b735517f| VURSRA $47, V13, V23 -0a47f67e| VUSHL V22, V24, V10 -e7a71c2f| VUSHLL $12, V31.H4, V7.S4 -9c38607e| VUSQADD V4, V28 -dc39206e| VUSQADD V14.B16, V28.B16 -dc145d7f| VUSRA $35, V6, V28 -d720752e| VUSUBL V21.H4, V6.H4, V23.S4 -2c236f6e| VUSUBL2 V15.H8, V25.H8, V12.S4 -ed32222e| VUSUBW V2.B8, V23.H8, V13.H8 -72332d6e| VUSUBW2 V13.B16, V27.H8, V18.H8 -655a1c4e| VUZP2 V28.B16, V19.B16, V5.B16 -972a210e| VXTN V20.H8, V23.B8 -5f2aa14e| VXTN2 V18.D2, V31.S4 -9a38910e| VZIP1 V17.S2, V4.S2, V26.S2 -d979990e| VZIP2 V25.S2, V14.S2, V25.S2 -21004192| AND $-9223372036854775808, R1, R1 -0a011f1a| ADCW ZR, R8, R10 -4c00009a| ADC R0, R2, R12 -a602093a| ADCSW R9, R21, R6 -d60217ba| ADCS R23, R22, R22 -0921250b| ADDW R5.UXTH, R8, R9 -ee8e288b| ADD R8.SXTB<<3, R23, R14 -23123011| ADDW $3076, R17, R3 -23127011| ADDW $(3076<<12), R17, R3 -2ba32391| ADD $2280, R25, R11 -2ba36391| ADD $(2280<<12), R25, R11 -67158d0b| ADDW R13->5, R11, R7 -30da198b| ADD R25<<54, R17, R16 -a7e72c2b| ADDSW R12.SXTX<<1, R29, R7 -357338ab| ADDS R24.UXTX<<4, R25, R21 -6b147731| ADDSW $(3525<<12), R3, R11 -6b1477b1| ADDS $(3525<<12), R3, R11 -cd59872b| ADDSW R7->22, R14, R13 -e41f4eab| ADDS R14>>7, ZR, R4 -21004192| AND $-9223372036854775808, R1, R1 -a2430412| ANDW $4026540031, R29, R2 -93910e92| AND $34903429696192636, R12, R19 -7a1ec90a| ANDW R9@>7, R19, R26 -7a1ec98a| AND R9@>7, R19, R26 -17f30172| ANDSW $2863311530, R24, R23 -458051f2| ANDS $-140737488289793, R2, R5 -af629a6a| ANDSW R26->24, R21, R15 -7ab0deea| ANDS R30@>44, R3, R26 -792bcc1a| ASRW R12, R27, R25 -672bce9a| ASR R14, R27, R7 -79ff4b93| ASR $11, R27, R25 -797f0b13| ASRW $11, R27, R25 -ebffff54| BLT -1(PC) -ffffff17| JMP -1(PC) -80161033| BFIW $16, R20, $6, R0 -b95265b3| BFI $27, R21, $21, R25 -6e670333| BFXILW $3, R27, $23, R14 -14a55ab3| BFXIL $26, R8, $16, R20 -b03ce70a| BICW R7@>15, R5, R16 -9235ec8a| BIC R12@>13, R12, R18 -7450b96a| BICSW R25->20, R3, R20 -3730b3ea| BICS R19->12, R1, R23 -370033ea| BICS R19, R1, R23 -370073ea| BICS R19>>0, R1, R23 -ffffff97| CALL -1(PC) -e0013fd6| CALL (R15) -a0031fd6| JMP (R29) -e08c31d4| BRK $35943 -e2ffff35| CBNZW R2, -1(PC) -e7ffffb5| CBNZ R7, -1(PC) -efffff34| CBZW R15, -1(PC) -e1ffffb4| CBZ R1, -1(PC) -e44341ba| CCMN MI, ZR, R1, $4 -4beb543a| CCMNW AL, R26, $20, $11 -015b46ba| CCMN PL, R24, $6, $1 -8602463a| CCMNW EQ, R20, R6, $6 -c6d34cba| CCMN LE, R30, R12, $6 -a76b4f7a| CCMPW VS, R29, $15, $7 -e3d853fa| CCMP LE, R7, $19, $3 -4022467a| CCMPW HS, R18, R6, $0 -c7b346fa| CCMP LT, R30, R6, $7 -e44341ba| CCMN MI, ZR, R1, $4 -ee279b1a| CSINCW HS, ZR, R27, R14 -4174819a| CSINC VC, R2, R1, R1 -5100955a| CSINVW EQ, R2, R21, R17 -573093da| CSINV LO, R2, R19, R23 -6e279b1a| CINCW LO, R27, R14 -7f379b1a| CINCW HS, R27, ZR -5110825a| CINVW EQ, R2, R17 -87718cda| CINV VS, R12, R7 -de739eda| CINV VS, R30, R30 -5f3403d5| CLREX $4 -5f3003d5| CLREX $0 -e615c05a| CLSW R15, R6 -ff15c0da| CLS R15, ZR -2e10c05a| CLZW R1, R14 -a912c0da| CLZ R21, R9 -ff11352b| CMNW R21.UXTB<<4, R15 -1f5220ab| CMN R0.UXTW<<4, R16 -3f214d2b| CMNW R13>>8, R9 -7f4486ab| CMN R6->17, R3 -bf084031| CMNW $(2<<12), R5 -9f2140b1| CMN $(8<<12), R12 -7f0086ab| CMN R6->0, R3 -7f0006ab| CMN R6, R3 -bf001e2b| CMNW R30, R5 -bf080031| CMNW $2, R5 -7f001fab| CMN ZR, R3 -7f0000ab| CMN R0, R3 -ff02266b| CMPW R6.UXTB, R23 -5fab39eb| CMP R25.SXTH<<2, R26 -bfa73bf1| CMP $3817, R29 -7f5c47eb| CMP R7>>23, R3 -2e45895a| CNEGW PL, R9, R14 -ae24895a| CSNEGW HS, R5, R9, R14 -c35595da| CSNEG PL, R14, R21, R3 -ef2487da| CNEG LO, R7, R15 -1041d11a| CRC32B R17, R8, R16 -bb46c31a| CRC32H R3, R21, R27 -c94bd61a| CRC32W R22, R30, R9 -8f4cd49a| CRC32X R20, R4, R15 -7653d21a| CRC32CB R18, R27, R22 -1454d51a| CRC32CH R21, R0, R20 -7558c91a| CRC32CW R9, R3, R21 -185ccb9a| CRC32CX R11, R0, R24 -8c30941a| CSELW LO, R4, R20, R12 -0ea08c9a| CSEL GE, R0, R12, R14 -e3b79f1a| CSETW GE, R3 -fea79f9a| CSET LT, R30 -e5639f5a| CSETMW VC, R5 -e4739fda| CSETM VS, R4 -bad4981a| CSINCW LE, R5, R24, R26 -5167909a| CSINC VS, R26, R16, R17 -e5e2955a| CSINVW AL, R23, R21, R5 -4e308bda| CSINV LO, R2, R11, R14 -0a269d5a| CSNEGW HS, R16, R29, R10 -ab1692da| CSNEG NE, R21, R18, R11 -418ea5d4| DCPS1 $11378 -6239a5d4| DCPS2 $10699 -e3ebabd4| DCPS3 $24415 -bf3103d5| DMB $1 -bf3003d5| DMB $0 -e003bfd6| DRPS -9f3103d5| DSB $1 -c974354a| EONW R21<<29, R6, R9 -89b86eca| EON R14>>46, R4, R9 -76e343d2| EOR $-2287828610704211969, R27, R22 -536d8c4a| EORW R12->27, R10, R19 -d1ef02ca| EOR R2<<59, R30, R17 -e0039fd6| ERET -591d8813| EXTRW $7, R8, R10, R25 -888dd693| EXTR $35, R22, R12, R8 -bf2003d5| SEVL -df2003d5| HINT $6 -a0fc5fd4| HLT $65509 -df3103d5| ISB $1 -df3f03d5| ISB $15 -9dfddf88| LDARW (R12), R29 -d6ffdf88| LDARW (R30), R22 -f6ffdf88| LDARW (RSP), R22 -76ffdfc8| LDAR (R27), R22 -22ffdf08| LDARB (R25), R2 -a7fcdf48| LDARH (R5), R7 -54c17f88| LDAXPW (R10), (R20, R16) -3eaf7fc8| LDAXP (R25), (R30, R11) -e2fd5f88| LDAXRW (R15), R2 -f5fd5fc8| LDAXR (R15), R21 -70fe5f08| LDAXRB (R19), R16 -a8fc5f48| LDAXRH (R5), R8 -e9c55ab8| MOVWU.P -84(R15), R9 -48255df8| MOVD.P -46(R10), R8 -480540f8| MOVD.P (R10), R8 -703c57b8| MOVWU.W -141(R3), R16 -1dac57f8| MOVD.W -134(R0), R29 -393c50b9| MOVWU 4156(R1), R25 -498d5cf9| MOVD 14616(R10), R9 -87d86cb8| MOVWU (R4)(R12.SXTW<<2), R7 -f9586bf8| MOVD (R7)(R11.UXTW<<3), R25 -447866f8| MOVD (R2)(R6<<3), R4 -727a72b8| MOVWU (R19)(R18<<2), R18 -4ca44238| MOVBU.P 42(R2), R12 -4e5c5e38| MOVBU.W -27(R2), R14 -03936d39| MOVBU 2916(R24), R3 -adb54678| MOVHU.P 107(R13), R13 -420c4c78| MOVHU.W 192(R2), R2 -92787579| MOVHU 6844(R4), R18 -fb478238| MOVB.P 36(RSP), R27 -18ee9438| MOVB.W -178(R16), R24 -37958f39| MOVB 997(R9), R23 -e5368b78| MOVH.P 179(R23), R5 -361f9c78| MOVH.W -63(R25), R22 -4d6c8079| MOVH 54(R2), R13 -02669cb8| MOVW.P -58(R16), R2 -488e92b8| MOVW.W -216(R18), R8 -ea9e92b9| MOVW 4764(R23), R10 -172f7f88| LDXPW (R24), (R23, R11) -10347fc8| LDXP (R0), (R16, R13) -fe7f5f88| LDXRW (RSP), R30 -6c7f5fc8| LDXR (R27), R12 -047c5f08| LDXRB (R0), R4 -9a7d5f48| LDXRH (R12), R26 -4f21cb1a| LSLW R11, R10, R15 -1523db9a| LSL R27, R24, R21 -f6681b53| LSLW $5, R7, R22 -221a47d3| LSL $57, R17, R2 -6c24c91a| LSRW R9, R3, R12 -a224ca9a| LSR R10, R5, R2 -707c0153| LSRW $1, R3, R16 -34fc4cd3| LSR $12, R1, R20 -6a5c0d1b| MADDW R13, R23, R3, R10 -445d059b| MADD R5, R23, R10, R4 -35fd001b| MNEGW R0, R9, R21 -77ff0e9b| MNEG R14, R27, R23 -e70302aa| MOVD R2, R7 -fff29892| MOVD $-51096, ZR -d4adb252| MOVW $2507014144, R20 -8747e2d2| MOVD $1313925191285342208, R7 -f5130d32| ORRW $16252928, ZR, R21 -eb6b16b2| MOVD $-4260607558625, R11 -e7031eaa| MOVD R30, R7 -35e88172| MOVKW $3905, R21 -35e8a172| MOVKW $(3905<<16), R21 -35e8c1f2| MOVK $(3905<<32), R21 -050080d2| MOVD $0, R5 -bf4100d5| MSR $1, SPSel -df4903d5| MSR $9, DAIFSet -ff4603d5| MSR $6, DAIFClr -8585011b| MSUBW R1, R1, R12, R5 -42c3139b| MSUB R19, R16, R26, R2 -b67c1a1b| MULW R26, R5, R22 -607c049b| MUL R4, R3, R0 -e837e32a| MVNW R3@>13, R8 -e97f6daa| MVN R13>>31, R9 -fe07176b| NEGSW R23<<1, R30 -f68f54eb| NEGS R20>>35, R22 -e8030d5a| NGCW R13, R8 -e70302da| NGC R2, R7 -e5030a7a| NGCSW R10, R5 -f00318fa| NGCS R24, R16 -032ee42a| ORNW R4@>11, R16, R3 -634cf6aa| ORN R22@>19, R3, R3 -f8490d32| ORRW $4294443071, R15, R24 -96f542b2| ORR $-3458764513820540929, R12, R22 -1a110d2a| ORRW R13<<4, R8, R26 -a65803aa| ORR R3<<22, R5, R6 -190180f9| PRFM (R8), $25 -400080f9| PRFM (R2), PLDL1KEEP -3601c05a| RBITW R9, R22 -6401c0da| RBIT R11, R4 -c0035fd6| RET -0a09c05a| REVW R8, R10 -220cc0da| REV R1, R2 -b206c05a| REV16W R21, R18 -2407c0da| REV16 R25, R4 -750bc0da| REV32 R27, R21 -336f8413| EXTRW $27, R4, R25, R19 -af47ca93| EXTR $17, R10, R29, R15 -cf39ce93| ROR $14, R14, R15 -cf718e13| RORW $28, R14, R15 -832dc31a| RORW R3, R12, R3 -e22ec09a| ROR R0, R23, R2 -1801045a| SBCW R4, R8, R24 -5a0119da| SBC R25, R10, R26 -52021b7a| SBCSW R27, R18, R18 -250105fa| SBCS R5, R9, R5 -56451713| SBFIZW $9, R10, $18, R22 -74397a93| SBFIZ $6, R11, $15, R20 -f4450813| SBFXW $8, R15, $10, R20 -67df4293| SBFX $2, R27, $54, R7 -c90dd61a| SDIVW R22, R14, R9 -a90ecd9a| SDIV R13, R21, R9 -9f2003d5| SEV -bf2003d5| SEVL -691d239b| SMADDL R3, R7, R11, R9 -7dcd259b| SMSUBL R5, R19, R11, R29 -6ffc3a9b| SMNEGL R26, R3, R15 -b57e519b| SMULH R17, R21, R21 -a07c209b| SMULL R0, R5, R0 -d0fe9f88| STLRW R16, (R22) -03ff9fc8| STLR R3, (R24) -67ff08c8| STLXR R7, (R27), R8 -edfd0e88| STLXRW R13, (R15), R14 -f8fe0808| STLXRB R24, (R23), R8 -73ff0b48| STLXRH R19, (R27), R11 -468d22c8| STLXP (R6, R3), (R10), R2 -c6ae3588| STLXPW (R6, R11), (R22), R21 -7668e8a8| LDP.P -384(R3), (R22, R26) -12add1a9| LDP.W 280(R8), (R18, R11) -166c96a8| STP.P (R22, R27), 352(R0) -112d86a9| STP.W (R17, R11), 96(R8) -34441eb8| MOVW.P R20, -28(R1) -11f60bf8| MOVD.P R17, 191(R16) -c15d15b8| MOVW.W R1, -171(R14) -ae4d12f8| MOVD.W R14, -220(R13) -03ef39b9| MOVW R3, 14828(R24) -208228f9| MOVD R0, 20736(R17) -ffb41838| MOVB.P ZR, -117(R7) -bb0d1a38| MOVB.W R27, -96(R13) -b1612239| MOVB R17, 2200(R13) -87841b78| MOVH.P R7, -72(R4) -cc3d1878| MOVH.W R12, -125(R14) -53cf1c79| MOVH R19, 3686(R26) -152002b8| MOVW R21, 34(R0) -397217f8| MOVD R25, -137(R17) -eb021b78| MOVH R11, -80(R23) -61082ac8| STXP (R1, R2), (R3), R10 -e10b2ac8| STXP (R1, R2), (RSP), R10 -61082a88| STXPW (R1, R2), (R3), R10 -e10b2a88| STXPW (R1, R2), (RSP), R10 -627e1288| STXRW R2, (R19), R18 -af7e0dc8| STXR R15, (R21), R13 -277d1808| STXRB R7, (R9), R24 -6c7c0848| STXRH R12, (R3), R8 -f24a344b| SUBW R20.UXTW<<2, R23, R18 -3ac825cb| SUB R5.SXTW<<2, R1, R26 -9b0c5ed1| SUB $(1923<<12), R4, R27 -9b0c5e51| SUBW $(1923<<12), R4, R27 -e8740c4b| SUBW R12<<29, R7, R8 -e8f40ccb| SUB R12<<61, R7, R8 -a6ad226b| SUBSW R2.SXTH<<3, R13, R6 -646b35eb| SUBS R21.UXTX<<2, R27, R4 -c9b04071| SUBSW $(44<<12), R6, R9 -a9315cf1| SUBS $(1804<<12), R13, R9 -c770966b| SUBSW R22->28, R6, R7 -c770566b| SUBSW R22>>28, R6, R7 -d03c1aeb| SUBS R26<<15, R6, R16 -010000d4| SVC $0 -a17f03d4| SVC $7165 -191d0013| SXTBW R8, R25 -a91d4093| SXTB R13, R9 -083d0013| SXTHW R8, R8 -393e4093| SXTH R17, R25 -1b7c4093| SXTW R0, R27 -0c5b2cd5| SYSL $285440, R12 -6e361d53| UBFIZW $3, R19, $14, R14 -c4367dd3| UBFIZ $3, R22, $14, R4 -ef580353| UBFXW $3, R7, $20, R15 -25e661d3| UBFX $33, R17, $25, R5 -af0ac81a| UDIVW R8, R21, R15 -550ac29a| UDIV R2, R18, R21 -3152a09b| UMADDL R0, R20, R17, R17 -6790b69b| UMSUBL R22, R4, R3, R7 -41fea39b| UMNEGL R3, R18, R1 -987ed89b| UMULH R24, R20, R24 -d37eb29b| UMULL R18, R22, R19 -461c0053| UXTBW R2, R6 -f43c0053| UXTHW R7, R20 -0058200e| VCNT V0.B8, V0.B8 -5f2003d5| WFE -7f2003d5| WFI -3f2003d5| YIELD -5cc0201e| FABSS F2, F28 -0ec0601e| FABSD F0, F14 -4a282c1e| FADDS F12, F2, F10 -cc29781e| FADDD F24, F14, F12 -8ed5311e| FCCMPS LE, F17, F12, $14 -ef856b1e| FCCMPD HI, F11, F15, $15 -bd253c1e| FCCMPES HS, F28, F13, $13 -99b4741e| FCCMPED LT, F20, F4, $9 -2022231e| FCMPS F3, F17 -0821201e| FCMPS $(0.0), F8 -60236b1e| FCMPD F11, F27 -2823601e| FCMPD $(0.0), F25 -d023301e| FCMPES F16, F30 -b823201e| FCMPES $(0.0), F29 -50216d1e| FCMPED F13, F10 -3823601e| FCMPED $(0.0), F25 -590f3b1e| FCSELS EQ, F26, F27, F25 -075d761e| FCSELD PL, F8, F22, F7 -ef00381e| FCVTZSSW F7, R15 -1f02389e| FCVTZSS F16, ZR -6302781e| FCVTZSDW F19, R3 -e700789e| FCVTZSD F7, R7 -4900391e| FCVTZUSW F2, R9 -9d01399e| FCVTZUS F12, R29 -7603791e| FCVTZUDW F27, R22 -3603799e| FCVTZUD F25, R22 -5419301e| FDIVS F16, F10, F20 -3e1b6b1e| FDIVD F11, F25, F30 -01090f1f| FMADDS F15, F2, F8, F1 -29574f1f| FMADDD F15, F21, F25, F9 -9b4b251e| FMAXS F5, F28, F27 -ff4b6c1e| FMAXD F12, F31, F31 -0c6b2b1e| FMAXNMS F11, F24, F12 -d068741e| FMAXNMD F20, F6, F16 -5e5a3a1e| FMINS F26, F18, F30 -95587d1e| FMIND F29, F4, F21 -817a371e| FMINNMS F23, F20, F1 -7878681e| FMINNMD F8, F3, F24 -8ece3d0e| VFMLA V29.S2, V20.S2, V14.S2 -71cfbd0e| VFMLS V29.S2, V27.S2, V17.S2 -4f00669e| FMOVD F2, R15 -6b00679e| FMOVD R3, F11 -9d02261e| FMOVS F20, R29 -0f01271e| FMOVS R8, F15 -4940601e| FMOVD F2, F9 -9b40201e| FMOVS F4, F27 -b3d50d1f| FMSUBS F13, F21, F13, F19 -ff9d4b1f| FMSUBD F11, F7, F15, F31 -d808201e| FMULS F0, F6, F24 -a90b651e| FMULD F5, F29, F9 -0542211e| FNEGS F16, F5 -ff43611e| FNEGD F31, F31 -d458311f| FNMADDS F17, F22, F6, F20 -54036f1f| FNMADDD F15, F0, F26, F20 -6ec32e1f| FNMSUBS F14, F16, F27, F14 -0ae57d1f| FNMSUBD F29, F25, F8, F10 -d28a381e| FNMULS F24, F22, F18 -c78b6e1e| FNMULD F14, F30, F7 -1540261e| FRINTAS F0, F21 -1641661e| FRINTAD F8, F22 -31c2271e| FRINTIS F17, F17 -2fc1671e| FRINTID F9, F15 -1043251e| FRINTMS F24, F16 -a240651e| FRINTMD F5, F2 -4e43241e| FRINTNS F26, F14 -8c43641e| FRINTND F28, F12 -64c3241e| FRINTPS F27, F4 -d6c0641e| FRINTPD F6, F22 -4a43271e| FRINTXS F26, F10 -0c42671e| FRINTXD F16, F12 -7cc0251e| FRINTZS F3, F28 -06c3651e| FRINTZD F24, F6 -09c0211e| FSQRTS F0, F9 -dbc1611e| FSQRTD F14, F27 -e03a391e| FSUBS F25, F23, F0 -b8396b1e| FSUBD F11, F13, F24 -7000221e| SCVTFWS R3, F16 -8402621e| SCVTFWD R20, F4 -0c02229e| SCVTFS R16, F12 -4e03629e| SCVTFD R26, F14 -c400231e| UCVTFWS R6, F4 -5701631e| UCVTFWD R10, F23 -1d03239e| UCVTFS R24, F29 -8b02639e| UCVTFD R20, F11 -6e86f05e| VADD V16, V19, V14 -4986654e| VADD V5.H8, V18.H8, V9.H8 -31bf674e| VADDP V7.H8, V25.H8, V17.H8 -60b8714e| VADDV V3.H8, V0 -d35a284e| AESD V22.B16, V19.B16 -fd4b284e| AESE V31.B16, V29.B16 -9b79284e| AESIMC V12.B16, V27.B16 -dc69284e| AESMC V14.B16, V28.B16 -891c244e| VAND V4.B16, V4.B16, V9.B16 -ac8db86e| VCMEQ V24.S4, V13.S4, V12.S4 -ab59200e| VCNT V13.B8, V11.B8 -f2071f5e| VMOV V31.B[15], V18 -f4071b4e| VDUP V31.B[13], V20.B16 -471e242e| VEOR V4.B8, V18.B8, V7.B8 -2320022e| VEXT $4, V2.B8, V1.B8, V3.B8 -2340026e| VEXT $8, V2.B16, V1.B16, V3.B16 -705d196e| VMOV V11.B[11], V16.B[12] -951e054e| VMOV R20, V21.B[2] -5570404c| VLD1 (R2), [V21.B16] -126f400c| VLD1 (R24), [V18.D1, V19.D1, V20.D1] -ae2f400c| VLD1 (R29), [V14.D1, V15.D1, V16.D1, V17.D1] -e172df4c| VLD1.P 16(R23), [V1.B16] -df7ccb0c| VLD1.P (R6)(R11), [V31.D1] -ffacdf0c| VLD1.P 16(R7), [V31.D1, V0.D1] -78a2c40c| VLD1.P (R19)(R4), [V24.B8, V25.B8] -8766c84c| VLD1.P (R20)(R8), [V7.H8, V8.H8, V9.H8] -c523df0c| VLD1.P 32(R30), [V5.B8, V6.B8, V7.B8, V8.B8] -4e1e404d| VLD1 (R18), V14.B[15] -a04b400d| VLD1 (R29), V0.H[1] -6283400d| VLD1 (R27), V2.S[0] -a586404d| VLD1 (R21), V5.D[1] -4a1adf4d| VLD1.P 1(R18), V10.B[14] -700cce4d| VLD1.P (R3)(R14), V16.B[11] -3c50df0d| VLD1.P 2(R1), V28.H[2] -a951d40d| VLD1.P (R13)(R20), V9.H[2] -2192df4d| VLD1.P 4(R17), V1.S[3] -d181c24d| VLD1.P (R14)(R2), V17.S[2] -be84df4d| VLD1.P 8(R5), V30.D[1] -7b87cd0d| VLD1.P (R27)(R13), V27.D[0] -e8375ebc| FMOVS.P -29(RSP), F8 -bc7f44bc| FMOVS.W 71(R29), F28 -971058bd| FMOVS 6160(R4), F23 -5b06155e| VMOV V18.B[10], V27 -9c15196e| VMOV V12.B[2], V28.B[12] -c41f1b4e| VMOV R30, V4.B[13] -441ca24e| VMOV V2.B16, V4.B16 -b43d040e| VMOV V13.S[0], R20 -b43d084e| VMOV V13.D[0], R20 -56e6044f| VMOVI $146, V22.B16 -cf1eb94e| VORR V25.B16, V22.B16, V15.B16 -23e0e20e| VPMULL V2.D1, V1.D1, V3.Q1 -24e0e24e| VPMULL2 V2.D2, V1.D2, V4.Q1 -23e0220e| VPMULL V2.B8, V1.B8, V3.H8 -24e0224e| VPMULL2 V2.B16, V1.B16, V4.H8 -5559606e| VRBIT V10.B16, V21.B16 -4108606e| VREV32 V2.H8, V1.H8 -d100221e| SCVTFWS R6, F17 -6f00621e| SCVTFWD R3, F15 -9902229e| SCVTFS R20, F25 -a901629e| SCVTFD R13, F9 -0201085e| SHA1C V8.S4, V8, V2 -390a285e| SHA1H V17, V25 -7b23005e| SHA1M V0.S4, V27, V27 -9b12035e| SHA1P V3.S4, V20, V27 -b031115e| SHA1SU0 V17.S4, V13.S4, V16.S4 -171b285e| SHA1SU1 V24.S4, V23.S4 -0b52065e| SHA256H2 V6.S4, V16, V11 -4b40045e| SHA256H V4.S4, V2, V11 -1028285e| SHA256SU0 V0.S4, V16.S4 -6f601f5e| SHA256SU1 V31.S4, V3.S4, V15.S4 -d956474f| VSHL $7, V22.D2, V25.D2 -6e67000c| VST1 [V14.H4, V15.H4, V16.H4], (R27) -c229004c| VST1 [V2.S4, V3.S4, V4.S4, V5.S4], (R14) -f9789d4c| VST1.P [V25.S4], (R7)(R29) -f9ac9f4c| VST1.P [V25.D2, V26.D2], 32(R7) -eeac970c| VST1.P [V14.D1, V15.D1], (R7)(R23) -796f9f4c| VST1.P [V25.D2, V26.D2, V27.D2], 48(R27) -6d648e4c| VST1.P [V13.H8, V14.H8, V15.H8], (R3)(R14) -d0289f4c| VST1.P [V16.S4, V17.S4, V18.S4, V19.S4], 64(R6) -9324900c| VST1.P [V19.H4, V20.H4, V21.H4, V22.H4], (R4)(R16) -2c0c000d| VST1 V12.B[3], (R1) -2c0c000d| VST1 V12.B[3], (R1) -9982004d| VST1 V25.S[2], (R20) -e987004d| VST1 V9.D[1], (RSP) -7e189f0d| VST1.P V30.B[6], 1(R3) -6800950d| VST1.P V8.B[0], (R3)(R21) -4f499f4d| VST1.P V15.H[5], 2(R10) -e15a8b4d| VST1.P V1.H[7], (R23)(R11) -7a819f0d| VST1.P V26.S[0], 4(R11) -0992950d| VST1.P V9.S[1], (R16)(R21) -30859f0d| VST1.P V16.D[0], 8(R9) -b786904d| VST1.P V23.D[1], (R21)(R16) -9785e17e| VSUB V1, V12, V23 -eb3bb06e| VUADDLV V31.S4, V11 -7301231e| UCVTFWS R11, F19 -4d03631e| UCVTFWD R26, F13 -eb02239e| UCVTFS R23, F11 -bd00639e| UCVTFD R5, F29 -0b3c030e| VMOV V0.B[1], R11 -2c3c0e0e| VMOV V1.H[3], R12 -d7061a6f| VUSHR $6, V22.H8, V23.H8 diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/decode_test.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/decode_test.go deleted file mode 100644 index 039b3edfa0..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/decode_test.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2014 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 ppc64asm - -import ( - "encoding/binary" - "encoding/hex" - "io/ioutil" - "strings" - "testing" -) - -func TestDecode(t *testing.T) { - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - all := string(data) - for strings.Contains(all, "\t\t") { - all = strings.Replace(all, "\t\t", "\t", -1) - } - for _, line := range strings.Split(all, "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.SplitN(line, "\t", 3) - i := strings.Index(f[0], "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f[0]) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f[0]) - } - size := i / 2 - code, err := hex.DecodeString(f[0][:i] + f[0][i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f[0], err) - continue - } - syntax, asm := f[1], f[2] - inst, err := Decode(code, binary.BigEndian) - var out string - if err != nil { - out = "error: " + err.Error() - } else { - switch syntax { - case "gnu": - out = GNUSyntax(inst) - case "plan9": - out = GoSyntax(inst, 0, nil) - default: - t.Errorf("unknown syntax %q", syntax) - continue - } - } - if out != asm || inst.Len != size { - t.Errorf("Decode(%s) [%s] = %s want %s", f[0], syntax, out, asm) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/ext_test.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/ext_test.go deleted file mode 100644 index cb7f3195fb..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/ext_test.go +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright 2014 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. - -// Support for testing against external disassembler program. -// Copied and simplified from rsc.io/arm/armasm/ext_test.go. - -package ppc64asm - -import ( - "bufio" - "bytes" - "encoding/binary" - "encoding/hex" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "math/rand" - "os" - "os/exec" - "regexp" - "runtime" - "strings" - "testing" - "time" -) - -var ( - printTests = flag.Bool("printtests", false, "print test cases that exercise new code paths") - dumpTest = flag.Bool("dump", false, "dump all encodings") - mismatch = flag.Bool("mismatch", false, "log allowed mismatches") - longTest = flag.Bool("long", false, "long test") - keep = flag.Bool("keep", false, "keep object files around") - debug = false -) - -// An ExtInst represents a single decoded instruction parsed -// from an external disassembler's output. -type ExtInst struct { - addr uint32 - enc [4]byte - nenc int - text string -} - -func (r ExtInst) String() string { - return fmt.Sprintf("%#x: % x: %s", r.addr, r.enc, r.text) -} - -// An ExtDis is a connection between an external disassembler and a test. -type ExtDis struct { - Dec chan ExtInst - File *os.File - Size int - KeepFile bool - Cmd *exec.Cmd -} - -// Run runs the given command - the external disassembler - and returns -// a buffered reader of its standard output. -func (ext *ExtDis) Run(cmd ...string) (*bufio.Reader, error) { - if *keep { - log.Printf("%s\n", strings.Join(cmd, " ")) - } - ext.Cmd = exec.Command(cmd[0], cmd[1:]...) - out, err := ext.Cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("stdoutpipe: %v", err) - } - if err := ext.Cmd.Start(); err != nil { - return nil, fmt.Errorf("exec: %v", err) - } - - b := bufio.NewReaderSize(out, 1<<20) - return b, nil -} - -// Wait waits for the command started with Run to exit. -func (ext *ExtDis) Wait() error { - return ext.Cmd.Wait() -} - -// testExtDis tests a set of byte sequences against an external disassembler. -// The disassembler is expected to produce the given syntax and be run -// in the given architecture mode (16, 32, or 64-bit). -// The extdis function must start the external disassembler -// and then parse its output, sending the parsed instructions on ext.Dec. -// The generate function calls its argument f once for each byte sequence -// to be tested. The generate function itself will be called twice, and it must -// make the same sequence of calls to f each time. -// When a disassembly does not match the internal decoding, -// allowedMismatch determines whether this mismatch should be -// allowed, or else considered an error. -func testExtDis( - t *testing.T, - syntax string, - extdis func(ext *ExtDis) error, - generate func(f func([]byte)), - allowedMismatch func(text string, size int, inst *Inst, dec ExtInst) bool, -) { - start := time.Now() - ext := &ExtDis{ - Dec: make(chan ExtInst), - } - errc := make(chan error) - - // First pass: write instructions to input file for external disassembler. - file, f, size, err := writeInst(generate) - if err != nil { - t.Fatal(err) - } - ext.Size = size - ext.File = f - defer func() { - f.Close() - if !*keep { - os.Remove(file) - } - }() - - // Second pass: compare disassembly against our decodings. - var ( - totalTests = 0 - totalSkips = 0 - totalErrors = 0 - - errors = make([]string, 0, 100) // sampled errors, at most cap - ) - go func() { - errc <- extdis(ext) - }() - generate(func(enc []byte) { - dec, ok := <-ext.Dec - if !ok { - t.Errorf("decoding stream ended early") - return - } - inst, text := disasm(syntax, pad(enc)) - totalTests++ - if *dumpTest { - fmt.Printf("%x -> %s [%d]\n", enc[:len(enc)], dec.text, dec.nenc) - } - if text != dec.text || inst.Len != dec.nenc { - suffix := "" - if allowedMismatch(text, size, &inst, dec) { - totalSkips++ - if !*mismatch { - return - } - suffix += " (allowed mismatch)" - } - totalErrors++ - if len(errors) >= cap(errors) { - j := rand.Intn(totalErrors) - if j >= cap(errors) { - return - } - errors = append(errors[:j], errors[j+1:]...) - } - errors = append(errors, fmt.Sprintf("decode(%x) = %q, %d, want %q, %d%s", enc, text, inst.Len, dec.text, dec.nenc, suffix)) - } - }) - - if *mismatch { - totalErrors -= totalSkips - } - - for _, b := range errors { - t.Log(b) - } - - if totalErrors > 0 { - t.Fail() - } - t.Logf("%d test cases, %d expected mismatches, %d failures; %.0f cases/second", totalTests, totalSkips, totalErrors, float64(totalTests)/time.Since(start).Seconds()) - - if err := <-errc; err != nil { - t.Fatalf("external disassembler: %v", err) - } - -} - -const start = 0x8000 // start address of text - -// writeInst writes the generated byte sequences to a new file -// starting at offset start. That file is intended to be the input to -// the external disassembler. -func writeInst(generate func(func([]byte))) (file string, f *os.File, size int, err error) { - f, err = ioutil.TempFile("", "ppc64asm") - if err != nil { - return - } - - file = f.Name() - - f.Seek(start, io.SeekStart) - w := bufio.NewWriter(f) - defer w.Flush() - size = 0 - generate(func(x []byte) { - if len(x) > 4 { - x = x[:4] - } - if debug { - fmt.Printf("%#x: %x%x\n", start+size, x, zeros[len(x):]) - } - w.Write(x) - w.Write(zeros[len(x):]) - size += len(zeros) - }) - return file, f, size, nil -} - -var zeros = []byte{0, 0, 0, 0} - -// pad pads the code sequence with pops. -func pad(enc []byte) []byte { - if len(enc) < 4 { - enc = append(enc[:len(enc):len(enc)], zeros[:4-len(enc)]...) - } - return enc -} - -// disasm returns the decoded instruction and text -// for the given source bytes, using the given syntax and mode. -func disasm(syntax string, src []byte) (inst Inst, text string) { - // If printTests is set, we record the coverage value - // before and after, and we write out the inputs for which - // coverage went up, in the format expected in testdata/decode.text. - // This produces a fairly small set of test cases that exercise nearly - // all the code. - var cover float64 - if *printTests { - cover -= coverage() - } - - inst, err := Decode(src, binary.BigEndian) - if err != nil { - text = "error: " + err.Error() - } else { - text = inst.String() - switch syntax { - //case "arm": - // text = ARMSyntax(inst) - case "gnu": - text = GNUSyntax(inst) - //case "plan9": - // text = GoSyntax(inst, 0, nil) - default: - text = "error: unknown syntax " + syntax - } - } - - if *printTests { - cover += coverage() - if cover > 0 { - max := len(src) - if max > 4 && inst.Len <= 4 { - max = 4 - } - fmt.Printf("%x|%x\t%s\t%s\n", src[:inst.Len], src[inst.Len:max], syntax, text) - } - } - - return -} - -// coverage returns a floating point number denoting the -// test coverage until now. The number increases when new code paths are exercised, -// both in the Go program and in the decoder byte code. -func coverage() float64 { - var f float64 - f += testing.Coverage() - f += decodeCoverage() - return f -} - -func decodeCoverage() float64 { - n := 0 - for _, t := range decoderCover { - if t { - n++ - } - } - return float64(1+n) / float64(1+len(decoderCover)) -} - -// Helpers for writing disassembler output parsers. - -// hasPrefix reports whether any of the space-separated words in the text s -// begins with any of the given prefixes. -func hasPrefix(s string, prefixes ...string) bool { - for _, prefix := range prefixes { - for s := s; s != ""; { - if strings.HasPrefix(s, prefix) { - return true - } - i := strings.Index(s, " ") - if i < 0 { - break - } - s = s[i+1:] - } - } - return false -} - -// contains reports whether the text s contains any of the given substrings. -func contains(s string, substrings ...string) bool { - for _, sub := range substrings { - if strings.Contains(s, sub) { - return true - } - } - return false -} - -// isHex reports whether b is a hexadecimal character (0-9A-Fa-f). -func isHex(b byte) bool { return b == '0' || unhex[b] > 0 } - -// parseHex parses the hexadecimal byte dump in hex, -// appending the parsed bytes to raw and returning the updated slice. -// The returned bool signals whether any invalid hex was found. -// Spaces and tabs between bytes are okay but any other non-hex is not. -func parseHex(hex []byte, raw []byte) ([]byte, bool) { - hex = trimSpace(hex) - for j := 0; j < len(hex); { - for hex[j] == ' ' || hex[j] == '\t' { - j++ - } - if j >= len(hex) { - break - } - if j+2 > len(hex) || !isHex(hex[j]) || !isHex(hex[j+1]) { - return nil, false - } - raw = append(raw, unhex[hex[j]]<<4|unhex[hex[j+1]]) - j += 2 - } - return raw, true -} - -var unhex = [256]byte{ - '0': 0, - '1': 1, - '2': 2, - '3': 3, - '4': 4, - '5': 5, - '6': 6, - '7': 7, - '8': 8, - '9': 9, - 'A': 10, - 'B': 11, - 'C': 12, - 'D': 13, - 'E': 14, - 'F': 15, - 'a': 10, - 'b': 11, - 'c': 12, - 'd': 13, - 'e': 14, - 'f': 15, -} - -// index is like bytes.Index(s, []byte(t)) but avoids the allocation. -func index(s []byte, t string) int { - i := 0 - for { - j := bytes.IndexByte(s[i:], t[0]) - if j < 0 { - return -1 - } - i = i + j - if i+len(t) > len(s) { - return -1 - } - for k := 1; k < len(t); k++ { - if s[i+k] != t[k] { - goto nomatch - } - } - return i - nomatch: - i++ - } -} - -// fixSpace rewrites runs of spaces, tabs, and newline characters into single spaces in s. -// If s must be rewritten, it is rewritten in place. -func fixSpace(s []byte) []byte { - s = trimSpace(s) - for i := 0; i < len(s); i++ { - if s[i] == '\t' || s[i] == '\n' || i > 0 && s[i] == ' ' && s[i-1] == ' ' { - goto Fix - } - } - return s - -Fix: - b := s - w := 0 - for i := 0; i < len(s); i++ { - c := s[i] - if c == '\t' || c == '\n' { - c = ' ' - } - if c == ' ' && w > 0 && b[w-1] == ' ' { - continue - } - b[w] = c - w++ - } - if w > 0 && b[w-1] == ' ' { - w-- - } - return b[:w] -} - -// trimSpace trims leading and trailing space from s, returning a subslice of s. -func trimSpace(s []byte) []byte { - j := len(s) - for j > 0 && (s[j-1] == ' ' || s[j-1] == '\t' || s[j-1] == '\n') { - j-- - } - i := 0 - for i < j && (s[i] == ' ' || s[i] == '\t') { - i++ - } - return s[i:j] -} - -// pcrel matches instructions using relative addressing mode. -var ( - pcrel = regexp.MustCompile(`^((?:.* )?(?:b|bc)[^ac ]* (?:(?:[0-9]{1,2},)|(?:[0-7]\*)|\+|lt|gt|eq|so|cr[0-7]|,)*)0x([0-9a-f]+)$`) -) - -// Generators. -// -// The test cases are described as functions that invoke a callback repeatedly, -// with a new input sequence each time. These helpers make writing those -// a little easier. - -// randomCases generates random instructions. -func randomCases(t *testing.T) func(func([]byte)) { - return func(try func([]byte)) { - // All the strides are relatively prime to 2 and therefore to 2²⁸, - // so we will not repeat any instructions until we have tried all 2²⁸. - // Using a stride other than 1 is meant to visit the instructions in a - // pseudorandom order, which gives better variety in the set of - // test cases chosen by -printtests. - stride := uint32(10007) - n := 1 << 28 / 7 - if testing.Short() { - stride = 100003 - n = 1 << 28 / 1001 - } else if *longTest { - stride = 2000033 - n = 1 << 29 - } - x := uint32(0) - for i := 0; i < n; i++ { - enc := (x%15)<<28 | x&(1<<28-1) - try([]byte{byte(enc), byte(enc >> 8), byte(enc >> 16), byte(enc >> 24)}) - x += stride - } - } -} - -// hexCases generates the cases written in hexadecimal in the encoded string. -// Spaces in 'encoded' separate entire test cases, not individual bytes. -func hexCases(t *testing.T, encoded string) func(func([]byte)) { - return func(try func([]byte)) { - for _, x := range strings.Fields(encoded) { - src, err := hex.DecodeString(x) - if err != nil { - t.Errorf("parsing %q: %v", x, err) - } - try(src) - } - } -} - -// testdataCases generates the test cases recorded in testdata/decode.txt. -// It only uses the inputs; it ignores the answers recorded in that file. -func testdataCases(t *testing.T) func(func([]byte)) { - var codes [][]byte - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.Fields(line)[0] - i := strings.Index(f, "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f) - } - code, err := hex.DecodeString(f[:i] + f[i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f, err) - continue - } - codes = append(codes, code) - } - - return func(try func([]byte)) { - for _, code := range codes { - try(code) - } - } -} - -func caller(skip int) string { - pc, _, _, _ := runtime.Caller(skip) - f := runtime.FuncForPC(pc) - name := "?" - if f != nil { - name = f.Name() - if i := strings.LastIndex(name, "."); i >= 0 { - name = name[i+1:] - } - } - return name -} diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field_test.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field_test.go deleted file mode 100644 index 14eb2f8e4e..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/field_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 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 ppc64asm - -import ( - "testing" -) - -func panicOrNot(f func()) (panicked bool) { - defer func() { - if err := recover(); err != nil { - panicked = true - } - }() - f() - return false -} - -func TestBitField(t *testing.T) { - var tests = []struct { - b BitField - i uint32 // input - u uint32 // unsigned output - s int32 // signed output - fail bool // if the check should panic - }{ - {BitField{0, 0}, 0, 0, 0, true}, - {BitField{31, 2}, 0, 0, 0, true}, - {BitField{31, 1}, 1, 1, -1, false}, - {BitField{29, 2}, 0 << 1, 0, 0, false}, - {BitField{29, 2}, 1 << 1, 1, 1, false}, - {BitField{29, 2}, 2 << 1, 2, -2, false}, - {BitField{29, 2}, 3 << 1, 3, -1, false}, - {BitField{0, 32}, 1<<32 - 1, 1<<32 - 1, -1, false}, - {BitField{16, 3}, 1 << 15, 4, -4, false}, - } - for i, tst := range tests { - var ( - ou uint32 - os int32 - ) - failed := panicOrNot(func() { - ou = tst.b.Parse(tst.i) - os = tst.b.ParseSigned(tst.i) - }) - if failed != tst.fail { - t.Errorf("case %d: %v: fail test failed, got %v, expected %v", i, tst.b, failed, tst.fail) - continue - } - if ou != tst.u { - t.Errorf("case %d: %v.Parse(%d) returned %d, expected %d", i, tst.b, tst.i, ou, tst.u) - continue - } - if os != tst.s { - t.Errorf("case %d: %v.ParseSigned(%d) returned %d, expected %d", i, tst.b, tst.i, os, tst.s) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdump_test.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdump_test.go deleted file mode 100644 index b886f7bad1..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdump_test.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2014 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 ppc64asm - -import ( - "encoding/binary" - "strings" - "testing" -) - -func TestObjdumpPowerTestdata(t *testing.T) { testObjdump(t, testdataCases(t)) } -func TestObjdumpPowerManual(t *testing.T) { testObjdump(t, hexCases(t, objdumpManualTests)) } - -// Disable this for now since generating all possible bit combinations within a word -// generates lots of ppc64x instructions not possible with golang so not worth supporting.. -//func TestObjdumpPowerRandom(t *testing.T) { testObjdump(t, randomCases(t)) } - -// objdumpManualTests holds test cases that will be run by TestObjdumpARMManual. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=Manual, particularly with tracing enabled. -// Note that these are byte sequences, so they must be reversed from the usual -// word presentation. -var objdumpManualTests = ` -6d746162 -4c040000 -88000017 -` - -// allowedMismatchObjdump reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchObjdump(text string, size int, inst *Inst, dec ExtInst) bool { - if hasPrefix(dec.text, deleted...) { - return true - } - - // we support more instructions than binutils - if strings.Contains(dec.text, ".long") { - return true - } - - if hasPrefix(text, "error:") { - if hasPrefix(dec.text, unsupported...) { - return true - } - } - - switch inst.Op { - case BC, BCA, BL, BLA, BCL, BCLA, TDI, TWI, TW, TD: - return true // TODO(minux): we lack the support for extended opcodes here - case RLWNM, RLWNMCC, RLDICL, RLDICLCC, RLWINM, RLWINMCC, RLDCL, RLDCLCC: - return true // TODO(minux): we lack the support for extended opcodes here - case DCBTST, DCBT: - return true // objdump uses the embedded argument order, we use the server argument order - case MTFSF, MTFSFCC: // objdump doesn't show the last two arguments - return true - case VSPLTB, VSPLTH, VSPLTW: // objdump generates unreasonable result "vspltw v6,v19,4" for 10c49a8c, the last 4 should be 0. - return true - } - if hasPrefix(text, "evm", "evl", "efs") { // objdump will disassemble them wrong (e.g. evmhoumia as vsldoi) - return true - } - - if len(dec.enc) >= 4 { - _ = binary.BigEndian.Uint32(dec.enc[:4]) - } - - return false -} - -// Instructions known to libopcodes (or xed) but not to us. -// TODO(minux): those single precision instructions are missing from ppc64.csv -// those data cache instructions are deprecated, but must be treated as no-ops, see 4.3.2.1 pg. 774. -var unsupported = strings.Fields(` -fmsubs -fmsubs. -fnmadds -fnmadds. -fnmsubs -fnmsubs. -fmuls -fmuls. -fdivs -fdivs. -fadds -fadds. -fsubs -fsubs. -dst -dstst -dssall -`) - -// Instructions explicitly dropped in Power ISA that were in POWER architecture. -// See A.30 Deleted Instructions and A.31 Discontiued Opcodes -var deleted = strings.Fields(` -abs -clcs -clf -cli -dclst -div -divs -doz -dozi -lscbx -maskg -maskir -mfsri -mul -nabs -rac -rfi -rfsvc -rlmi -rrib -sle -sleq -sliq -slliq -sllq -slq -sraiq -sraq -sre -srea -sreq -sriq -srliq -srlq -srq -maskg`) diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdumpext_test.go b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdumpext_test.go deleted file mode 100644 index d4f8fc8808..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/objdumpext_test.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2014 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. - -// Copied and simplified from rsc.io/arm/armasm/objdumpext_test.go. - -package ppc64asm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "fmt" - "io" - "log" - "os" - "runtime" - "strconv" - "strings" - "testing" -) - -const objdumpPath = "/usr/bin/objdump" - -func testObjdump(t *testing.T, generate func(func([]byte))) { - if testing.Short() { - t.Skip("skipping objdump test in short mode") - } - if runtime.GOARCH != "ppc64le" && runtime.GOARCH != "ppc64" { - t.Skip("skipping; test requires host tool objdump for ppc64 or ppc64le") - } - if _, err := os.Stat(objdumpPath); err != nil { - t.Skip(err) - } - - testExtDis(t, "gnu", objdump, generate, allowedMismatchObjdump) -} - -func objdump(ext *ExtDis) error { - // File already written with instructions; add ELF header. - if err := writeELF64(ext.File, ext.Size); err != nil { - return err - } - - b, err := ext.Run(objdumpPath, "-d", "-z", ext.File.Name()) - if err != nil { - return err - } - - var ( - nmatch int - reading bool - next uint32 = start - addr uint32 - encbuf [4]byte - enc []byte - text string - ) - flush := func() { - if addr == next { - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s.%+#x", m[1], int32(uint32(targ)-addr)) - } - if strings.HasPrefix(text, "stmia") { - text = "stm" + text[5:] - } - if strings.HasPrefix(text, "stmfd") { - text = "stmdb" + text[5:] - } - if strings.HasPrefix(text, "ldmfd") { - text = "ldm" + text[5:] - } - text = strings.Replace(text, "#0.0", "#0", -1) - if text == "undefined" && len(enc) == 4 { - text = "error: unknown instruction" - enc = nil - } - if len(enc) == 4 { - // prints as word but we want to record bytes - enc[0], enc[3] = enc[3], enc[0] - enc[1], enc[2] = enc[2], enc[1] - } - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [4]byte{} - enc = nil - next += 4 - } - } - var textangle = []byte("<.text>:") - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading objdump output: %v", err) - } - if bytes.Contains(line, textangle) { - reading = true - continue - } - if !reading { - continue - } - if debug { - os.Stdout.Write(line) - } - if enc1 := parseContinuation(line, encbuf[:len(enc)]); enc1 != nil { - enc = enc1 - continue - } - flush() - nmatch++ - addr, enc, text = parseLine(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - } - flush() - if next != start+uint32(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -var ( - undefined = []byte("") - unpredictable = []byte("") - illegalShifter = []byte("") -) - -func parseLine(line []byte, encstart []byte) (addr uint32, enc []byte, text string) { - oline := line - i := index(line, ":\t") - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - x, err := strconv.ParseUint(string(trimSpace(line[:i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint32(x) - line = line[i+2:] - i = bytes.IndexByte(line, '\t') - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - enc, ok := parseHex(line[:i], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", oline) - } - line = trimSpace(line[i:]) - if bytes.Contains(line, undefined) { - text = "undefined" - return - } - if bytes.Contains(line, illegalShifter) { - text = "undefined" - return - } - if false && bytes.Contains(line, unpredictable) { - text = "unpredictable" - return - } - if i := bytes.IndexByte(line, ';'); i >= 0 { - line = trimSpace(line[:i]) - } - text = string(fixSpace(line)) - return -} - -func parseContinuation(line []byte, enc []byte) []byte { - i := index(line, ":\t") - if i < 0 { - return nil - } - line = line[i+1:] - enc, _ = parseHex(line, enc) - return enc -} - -// writeELF64 writes an ELF64 header to the file, -// describing a text segment that starts at start -// and extends for size bytes. -func writeELF64(f *os.File, size int) error { - f.Seek(0, io.SeekStart) - var hdr elf.Header64 - var prog elf.Prog64 - var sect elf.Section64 - var buf bytes.Buffer - binary.Write(&buf, binary.BigEndian, &hdr) - off1 := buf.Len() - binary.Write(&buf, binary.BigEndian, &prog) - off2 := buf.Len() - binary.Write(&buf, binary.BigEndian, §) - off3 := buf.Len() - buf.Reset() - data := byte(elf.ELFDATA2MSB) - hdr = elf.Header64{ - Ident: [16]byte{0x7F, 'E', 'L', 'F', 2, data, 1}, - Type: 2, - Machine: uint16(elf.EM_PPC64), - Version: 1, - Entry: start, - Phoff: uint64(off1), - Shoff: uint64(off2), - Flags: 0x05000002, - Ehsize: uint16(off1), - Phentsize: uint16(off2 - off1), - Phnum: 1, - Shentsize: uint16(off3 - off2), - Shnum: 3, - Shstrndx: 2, - } - binary.Write(&buf, binary.BigEndian, &hdr) - prog = elf.Prog64{ - Type: 1, - Off: start, - Vaddr: start, - Paddr: start, - Filesz: uint64(size), - Memsz: uint64(size), - Flags: 5, - Align: start, - } - binary.Write(&buf, binary.BigEndian, &prog) - binary.Write(&buf, binary.BigEndian, §) // NULL section - sect = elf.Section64{ - Name: 1, - Type: uint32(elf.SHT_PROGBITS), - Addr: start, - Off: start, - Size: uint64(size), - Flags: uint64(elf.SHF_ALLOC | elf.SHF_EXECINSTR), - Addralign: 4, - } - binary.Write(&buf, binary.BigEndian, §) // .text - sect = elf.Section64{ - Name: uint32(len("\x00.text\x00")), - Type: uint32(elf.SHT_STRTAB), - Addr: 0, - Off: uint64(off2 + (off3-off2)*3), - Size: uint64(len("\x00.text\x00.shstrtab\x00")), - Addralign: 1, - } - binary.Write(&buf, binary.BigEndian, §) - buf.WriteString("\x00.text\x00.shstrtab\x00") - f.Write(buf.Bytes()) - return nil -} diff --git a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/testdata/decode.txt b/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/testdata/decode.txt deleted file mode 100644 index 2a89de04c9..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/ppc64/ppc64asm/testdata/decode.txt +++ /dev/null @@ -1,56 +0,0 @@ -6d746162| gnu xoris r20,r11,24930 -6d746162| plan9 XORIS R11,$24930,R20 -4c040000| gnu mcrf cr0,cr1 -88a70002| gnu lbz r5,2(r7) -88a70002| plan9 MOVBZ 2(R7),R5 -00000000| plan9 WORD $0 -00010000| plan9 error: unknown instruction -00000000| gnu .long 0x0 -00002000| gnu error: unknown instruction -a1841e80| gnu lhz r12,7808(r4) -a1841e80| plan9 MOVHZ 7808(R4),R12 -42093d10| gnu bc 16,4*cr2+gt,.+0x3d10 -e38d5b90| gnu lq r28,23440(r13) -84127a20| gnu lwzu r0,31264(r18) -84127a20| plan9 MOVWZU 31264(R18),R0 -a8630000| gnu lha r3,0(r3) -a8630000| plan9 MOVH 0(R3),R3 -ebb24fd1| gnu ldu r29,20432(r18) -ebb24fd1| plan9 MOVDU 20432(R18),R29 -b1ce0612| gnu sth r14,1554(r14) -b1ce0612| plan9 MOVH R14,1554(R14) -945c62a2| gnu stwu r2,25250(r28) -f91b9c7a| gnu stq r8,-25480(r27) -2c030001| gnu cmpwi r3,1 -2c030001| plan9 CMPW R3,$1 -e8610032| gnu lwa r3,48(r1) -e8610032| plan9 MOVW 48(R1),R3 -4320336b| gnu bcla 25,lt,0x3368 -7e40092e| gnu stwx r18,0,r1 -7e40092e| plan9 MOVW R18,(R1)(0) -7c103c2c| gnu lwbrx r0,r16,r7 -7c103c2c| plan9 MOVWBR (R7)(R16),R0 -7c441d28| gnu stdbrx r2,r4,r3 -7c441d28| plan9 MOVDBR R2,(R3)(R4) -3d220001| gnu addis r9,r2,1 -3d220001| plan9 ADDIS R2,$1,R9 -7ce628ae| gnu lbzx r7,r6,r5 -7ce628ae| plan9 MOVBZ (R5)(R6),R7 -7c0e1e99| gnu lxvd2x vs32,r14,r3 -7c0e1e99| plan9 LXVD2X (R3)(R14),VS32 -7c00422c| gnu dcbt r0,r8,0 -7c00422c| plan9 DCBT (R8) -7fab3040| gnu cmpld cr7,r11,r6 -7fab3040| plan9 CMPU CR7,R11,R6 -2c030001| gnu cmpwi r3,1 -2c030001| plan9 CMPW R3,$1 -7c2b4840| gnu cmpld r11,r9 -7c2b4840| plan9 CMPU R11,R9 -7c6521ad| gnu stdcx. r3,r5,r4 -7c6521ad| plan9 STDCXCC R3,(R4)(R5) -fbe1ffd1| gnu stdu r31,-48(r1) -fbe1ffd1| plan9 MOVDU R31,-48(R1) -7c941f19| gnu stxvw4x vs36,r20,r3 -7c941f19| plan9 STXVW4X VS36,(R3)(R20) -7c6520a8| gnu ldarx r3,r5,r4 -7c6520a8| plan9 LDAR (R4)(R5),R3 diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode_test.go deleted file mode 100644 index 127be263d7..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/decode_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "encoding/hex" - "io/ioutil" - "strconv" - "strings" - "testing" -) - -func TestDecode(t *testing.T) { - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - all := string(data) - for strings.Contains(all, "\t\t") { - all = strings.Replace(all, "\t\t", "\t", -1) - } - for _, line := range strings.Split(all, "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.SplitN(line, "\t", 4) - i := strings.Index(f[0], "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f[0]) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f[0]) - } - size := i / 2 - code, err := hex.DecodeString(f[0][:i] + f[0][i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f[0], err) - continue - } - mode, err := strconv.Atoi(f[1]) - if err != nil { - t.Errorf("invalid mode %q in: %s", f[1], line) - continue - } - syntax, asm := f[2], f[3] - inst, err := Decode(code, mode) - var out string - if err != nil { - out = "error: " + err.Error() - } else { - switch syntax { - case "gnu": - out = GNUSyntax(inst, 0, nil) - case "intel": - out = IntelSyntax(inst, 0, nil) - case "plan9": // [sic] - out = GoSyntax(inst, 0, nil) - default: - t.Errorf("unknown syntax %q", syntax) - continue - } - } - if out != asm || inst.Len != size { - t.Errorf("Decode(%s) [%s] = %s, %d, want %s, %d", f[0], syntax, out, inst.Len, asm, size) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/ext_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/ext_test.go deleted file mode 100644 index 526ef5aa26..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/ext_test.go +++ /dev/null @@ -1,811 +0,0 @@ -// Copyright 2014 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. - -// Support for testing against external disassembler program. - -package x86asm - -import ( - "bufio" - "bytes" - "encoding/hex" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "math/rand" - "os" - "os/exec" - "regexp" - "runtime" - "strings" - "testing" - "time" -) - -var ( - printTests = flag.Bool("printtests", false, "print test cases that exercise new code paths") - dumpTest = flag.Bool("dump", false, "dump all encodings") - mismatch = flag.Bool("mismatch", false, "log allowed mismatches") - longTest = flag.Bool("long", false, "long test") - keep = flag.Bool("keep", false, "keep object files around") - debug = false -) - -// An ExtInst represents a single decoded instruction parsed -// from an external disassembler's output. -type ExtInst struct { - addr uint32 - enc [32]byte - nenc int - text string -} - -func (r ExtInst) String() string { - return fmt.Sprintf("%#x: % x: %s", r.addr, r.enc, r.text) -} - -// An ExtDis is a connection between an external disassembler and a test. -type ExtDis struct { - Arch int - Dec chan ExtInst - File *os.File - Size int - KeepFile bool - Cmd *exec.Cmd -} - -// Run runs the given command - the external disassembler - and returns -// a buffered reader of its standard output. -func (ext *ExtDis) Run(cmd ...string) (*bufio.Reader, error) { - if *keep { - log.Printf("%s\n", strings.Join(cmd, " ")) - } - ext.Cmd = exec.Command(cmd[0], cmd[1:]...) - out, err := ext.Cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("stdoutpipe: %v", err) - } - if err := ext.Cmd.Start(); err != nil { - return nil, fmt.Errorf("exec: %v", err) - } - - b := bufio.NewReaderSize(out, 1<<20) - return b, nil -} - -// Wait waits for the command started with Run to exit. -func (ext *ExtDis) Wait() error { - return ext.Cmd.Wait() -} - -// testExtDis tests a set of byte sequences against an external disassembler. -// The disassembler is expected to produce the given syntax and be run -// in the given architecture mode (16, 32, or 64-bit). -// The extdis function must start the external disassembler -// and then parse its output, sending the parsed instructions on ext.Dec. -// The generate function calls its argument f once for each byte sequence -// to be tested. The generate function itself will be called twice, and it must -// make the same sequence of calls to f each time. -// When a disassembly does not match the internal decoding, -// allowedMismatch determines whether this mismatch should be -// allowed, or else considered an error. -func testExtDis( - t *testing.T, - syntax string, - arch int, - extdis func(ext *ExtDis) error, - generate func(f func([]byte)), - allowedMismatch func(text string, size int, inst *Inst, dec ExtInst) bool, -) { - start := time.Now() - ext := &ExtDis{ - Dec: make(chan ExtInst), - Arch: arch, - } - errc := make(chan error) - - // First pass: write instructions to input file for external disassembler. - file, f, size, err := writeInst(generate) - if err != nil { - t.Fatal(err) - } - ext.Size = size - ext.File = f - defer func() { - f.Close() - if !*keep { - os.Remove(file) - } - }() - - // Second pass: compare disassembly against our decodings. - var ( - totalTests = 0 - totalSkips = 0 - totalErrors = 0 - - errors = make([]string, 0, 100) // sampled errors, at most cap - ) - go func() { - errc <- extdis(ext) - }() - generate(func(enc []byte) { - dec, ok := <-ext.Dec - if !ok { - t.Errorf("decoding stream ended early") - return - } - inst, text := disasm(syntax, arch, pad(enc)) - totalTests++ - if *dumpTest { - fmt.Printf("%x -> %s [%d]\n", enc[:len(enc)], dec.text, dec.nenc) - } - if text != dec.text || inst.Len != dec.nenc { - suffix := "" - if allowedMismatch(text, size, &inst, dec) { - totalSkips++ - if !*mismatch { - return - } - suffix += " (allowed mismatch)" - } - totalErrors++ - if len(errors) >= cap(errors) { - j := rand.Intn(totalErrors) - if j >= cap(errors) { - return - } - errors = append(errors[:j], errors[j+1:]...) - } - errors = append(errors, fmt.Sprintf("decode(%x) = %q, %d, want %q, %d%s", enc, text, inst.Len, dec.text, dec.nenc, suffix)) - } - }) - - if *mismatch { - totalErrors -= totalSkips - } - - for _, b := range errors { - t.Log(b) - } - - if totalErrors > 0 { - t.Fail() - } - t.Logf("%d test cases, %d expected mismatches, %d failures; %.0f cases/second", totalTests, totalSkips, totalErrors, float64(totalTests)/time.Since(start).Seconds()) - - if err := <-errc; err != nil { - t.Fatalf("external disassembler: %v", err) - } -} - -const start = 0x8000 // start address of text - -// writeInst writes the generated byte sequences to a new file -// starting at offset start. That file is intended to be the input to -// the external disassembler. -func writeInst(generate func(func([]byte))) (file string, f *os.File, size int, err error) { - f, err = ioutil.TempFile("", "x86map") - if err != nil { - return - } - - file = f.Name() - - f.Seek(start, io.SeekStart) - w := bufio.NewWriter(f) - defer w.Flush() - size = 0 - generate(func(x []byte) { - if len(x) > 16 { - x = x[:16] - } - if debug { - fmt.Printf("%#x: %x%x\n", start+size, x, pops[len(x):]) - } - w.Write(x) - w.Write(pops[len(x):]) - size += len(pops) - }) - return file, f, size, nil -} - -// 0x5F is a single-byte pop instruction. -// We pad the bytes we want decoded with enough 0x5Fs -// that no matter what state the instruction stream is in -// after reading our bytes, the pops will get us back to -// a forced instruction boundary. -var pops = []byte{ - 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, - 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, - 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, - 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, -} - -// pad pads the code sequence with pops. -func pad(enc []byte) []byte { - return append(enc[:len(enc):len(enc)], pops...) -} - -// disasm returns the decoded instruction and text -// for the given source bytes, using the given syntax and mode. -func disasm(syntax string, mode int, src []byte) (inst Inst, text string) { - // If printTests is set, we record the coverage value - // before and after, and we write out the inputs for which - // coverage went up, in the format expected in testdata/decode.text. - // This produces a fairly small set of test cases that exercise nearly - // all the code. - var cover float64 - if *printTests { - cover -= coverage() - } - - inst, err := decode1(src, mode, syntax == "gnu") - if err != nil { - text = "error: " + err.Error() - } else { - switch syntax { - case "gnu": - text = GNUSyntax(inst, 0, nil) - case "intel": - text = IntelSyntax(inst, 0, nil) - case "plan9": // [sic] - text = GoSyntax(inst, 0, nil) - default: - text = "error: unknown syntax " + syntax - } - } - - if *printTests { - cover += coverage() - if cover > 0 { - max := len(src) - if max > 16 && inst.Len <= 16 { - max = 16 - } - fmt.Printf("%x|%x\t%d\t%s\t%s\n", src[:inst.Len], src[inst.Len:max], mode, syntax, text) - } - } - - return -} - -// coverage returns a floating point number denoting the -// test coverage until now. The number increases when new code paths are exercised, -// both in the Go program and in the decoder byte code. -func coverage() float64 { - /* - testing.Coverage is not in the main distribution. - The implementation, which must go in package testing, is: - - // Coverage reports the current code coverage as a fraction in the range [0, 1]. - func Coverage() float64 { - var n, d int64 - for _, counters := range cover.Counters { - for _, c := range counters { - if c > 0 { - n++ - } - d++ - } - } - if d == 0 { - return 0 - } - return float64(n) / float64(d) - } - */ - - var f float64 - // f += testing.Coverage() - f += decodeCoverage() - return f -} - -func decodeCoverage() float64 { - n := 0 - for _, t := range decoderCover { - if t { - n++ - } - } - return float64(1+n) / float64(1+len(decoderCover)) -} - -// Helpers for writing disassembler output parsers. - -// isPrefix reports whether text is the name of an instruction prefix. -func isPrefix(text string) bool { - return prefixByte[text] > 0 -} - -// prefixByte maps instruction prefix text to actual prefix byte values. -var prefixByte = map[string]byte{ - "es": 0x26, - "cs": 0x2e, - "ss": 0x36, - "ds": 0x3e, - "fs": 0x64, - "gs": 0x65, - "data16": 0x66, - "addr16": 0x67, - "lock": 0xf0, - "repn": 0xf2, - "repne": 0xf2, - "rep": 0xf3, - "repe": 0xf3, - "xacquire": 0xf2, - "xrelease": 0xf3, - "bnd": 0xf2, - "addr32": 0x66, - "data32": 0x67, -} - -// hasPrefix reports whether any of the space-separated words in the text s -// begins with any of the given prefixes. -func hasPrefix(s string, prefixes ...string) bool { - for _, prefix := range prefixes { - for s := s; s != ""; { - if strings.HasPrefix(s, prefix) { - return true - } - i := strings.Index(s, " ") - if i < 0 { - break - } - s = s[i+1:] - } - } - return false -} - -// contains reports whether the text s contains any of the given substrings. -func contains(s string, substrings ...string) bool { - for _, sub := range substrings { - if strings.Contains(s, sub) { - return true - } - } - return false -} - -// isHex reports whether b is a hexadecimal character (0-9A-Fa-f). -func isHex(b byte) bool { return b == '0' || unhex[b] > 0 } - -// parseHex parses the hexadecimal byte dump in hex, -// appending the parsed bytes to raw and returning the updated slice. -// The returned bool signals whether any invalid hex was found. -// Spaces and tabs between bytes are okay but any other non-hex is not. -func parseHex(hex []byte, raw []byte) ([]byte, bool) { - hex = trimSpace(hex) - for j := 0; j < len(hex); { - for hex[j] == ' ' || hex[j] == '\t' { - j++ - } - if j >= len(hex) { - break - } - if j+2 > len(hex) || !isHex(hex[j]) || !isHex(hex[j+1]) { - return nil, false - } - raw = append(raw, unhex[hex[j]]<<4|unhex[hex[j+1]]) - j += 2 - } - return raw, true -} - -var unhex = [256]byte{ - '0': 0, - '1': 1, - '2': 2, - '3': 3, - '4': 4, - '5': 5, - '6': 6, - '7': 7, - '8': 8, - '9': 9, - 'A': 10, - 'B': 11, - 'C': 12, - 'D': 13, - 'E': 14, - 'F': 15, - 'a': 10, - 'b': 11, - 'c': 12, - 'd': 13, - 'e': 14, - 'f': 15, -} - -// index is like bytes.Index(s, []byte(t)) but avoids the allocation. -func index(s []byte, t string) int { - i := 0 - for { - j := bytes.IndexByte(s[i:], t[0]) - if j < 0 { - return -1 - } - i = i + j - if i+len(t) > len(s) { - return -1 - } - for k := 1; k < len(t); k++ { - if s[i+k] != t[k] { - goto nomatch - } - } - return i - nomatch: - i++ - } -} - -// fixSpace rewrites runs of spaces, tabs, and newline characters into single spaces in s. -// If s must be rewritten, it is rewritten in place. -func fixSpace(s []byte) []byte { - s = trimSpace(s) - for i := 0; i < len(s); i++ { - if s[i] == '\t' || s[i] == '\n' || i > 0 && s[i] == ' ' && s[i-1] == ' ' { - goto Fix - } - } - return s - -Fix: - b := s - w := 0 - for i := 0; i < len(s); i++ { - c := s[i] - if c == '\t' || c == '\n' { - c = ' ' - } - if c == ' ' && w > 0 && b[w-1] == ' ' { - continue - } - b[w] = c - w++ - } - if w > 0 && b[w-1] == ' ' { - w-- - } - return b[:w] -} - -// trimSpace trims leading and trailing space from s, returning a subslice of s. -func trimSpace(s []byte) []byte { - j := len(s) - for j > 0 && (s[j-1] == ' ' || s[j-1] == '\t' || s[j-1] == '\n') { - j-- - } - i := 0 - for i < j && (s[i] == ' ' || s[i] == '\t') { - i++ - } - return s[i:j] -} - -// pcrel and pcrelw match instructions using relative addressing mode. -var ( - pcrel = regexp.MustCompile(`^((?:.* )?(?:j[a-z]+|call|ljmp|loopn?e?w?|xbegin)q?(?:,p[nt])?) 0x([0-9a-f]+)$`) - pcrelw = regexp.MustCompile(`^((?:.* )?(?:callw|jmpw|xbeginw|ljmpw)(?:,p[nt])?) 0x([0-9a-f]+)$`) -) - -// Generators. -// -// The test cases are described as functions that invoke a callback repeatedly, -// with a new input sequence each time. These helpers make writing those -// a little easier. - -// hexCases generates the cases written in hexadecimal in the encoded string. -// Spaces in 'encoded' separate entire test cases, not individual bytes. -func hexCases(t *testing.T, encoded string) func(func([]byte)) { - return func(try func([]byte)) { - for _, x := range strings.Fields(encoded) { - src, err := hex.DecodeString(x) - if err != nil { - t.Errorf("parsing %q: %v", x, err) - } - try(src) - } - } -} - -// testdataCases generates the test cases recorded in testdata/decode.txt. -// It only uses the inputs; it ignores the answers recorded in that file. -func testdataCases(t *testing.T) func(func([]byte)) { - var codes [][]byte - data, err := ioutil.ReadFile("testdata/decode.txt") - if err != nil { - t.Fatal(err) - } - for _, line := range strings.Split(string(data), "\n") { - line = strings.TrimSpace(line) - if line == "" || strings.HasPrefix(line, "#") { - continue - } - f := strings.Fields(line)[0] - i := strings.Index(f, "|") - if i < 0 { - t.Errorf("parsing %q: missing | separator", f) - continue - } - if i%2 != 0 { - t.Errorf("parsing %q: misaligned | separator", f) - } - code, err := hex.DecodeString(f[:i] + f[i+1:]) - if err != nil { - t.Errorf("parsing %q: %v", f, err) - continue - } - codes = append(codes, code) - } - - return func(try func([]byte)) { - for _, code := range codes { - try(code) - } - } -} - -// manyPrefixes generates all possible 2⁹ combinations of nine chosen prefixes. -// The relative ordering of the prefixes within the combinations varies deterministically. -func manyPrefixes(try func([]byte)) { - var prefixBytes = []byte{0x66, 0x67, 0xF0, 0xF2, 0xF3, 0x3E, 0x36, 0x66, 0x67} - var enc []byte - for i := 0; i < 1< 0 { - k := i % len(enc) - enc[0], enc[k] = enc[k], enc[0] - } - try(enc) - } -} - -// basicPrefixes geneartes 8 different possible prefix cases: no prefix -// and then one each of seven different prefix bytes. -func basicPrefixes(try func([]byte)) { - try(nil) - for _, b := range []byte{0x66, 0x67, 0xF0, 0xF2, 0xF3, 0x3E, 0x36} { - try([]byte{b}) - } -} - -func rexPrefixes(try func([]byte)) { - try(nil) - for _, b := range []byte{0x40, 0x48, 0x43, 0x4C} { - try([]byte{b}) - } -} - -// concat takes two generators and returns a generator for the -// cross product of the two, concatenating the results from each. -func concat(gen1, gen2 func(func([]byte))) func(func([]byte)) { - return func(try func([]byte)) { - gen1(func(enc1 []byte) { - gen2(func(enc2 []byte) { - try(append(enc1[:len(enc1):len(enc1)], enc2...)) - }) - }) - } -} - -// concat3 takes three generators and returns a generator for the -// cross product of the three, concatenating the results from each. -func concat3(gen1, gen2, gen3 func(func([]byte))) func(func([]byte)) { - return func(try func([]byte)) { - gen1(func(enc1 []byte) { - gen2(func(enc2 []byte) { - gen3(func(enc3 []byte) { - try(append(append(enc1[:len(enc1):len(enc1)], enc2...), enc3...)) - }) - }) - }) - } -} - -// concat4 takes four generators and returns a generator for the -// cross product of the four, concatenating the results from each. -func concat4(gen1, gen2, gen3, gen4 func(func([]byte))) func(func([]byte)) { - return func(try func([]byte)) { - gen1(func(enc1 []byte) { - gen2(func(enc2 []byte) { - gen3(func(enc3 []byte) { - gen4(func(enc4 []byte) { - try(append(append(append(enc1[:len(enc1):len(enc1)], enc2...), enc3...), enc4...)) - }) - }) - }) - }) - } -} - -// filter generates the sequences from gen that satisfy ok. -func filter(gen func(func([]byte)), ok func([]byte) bool) func(func([]byte)) { - return func(try func([]byte)) { - gen(func(enc []byte) { - if ok(enc) { - try(enc) - } - }) - } -} - -// enum8bit generates all possible 1-byte sequences, followed by distinctive padding. -func enum8bit(try func([]byte)) { - for i := 0; i < 1<<8; i++ { - try([]byte{byte(i), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) - } -} - -// enum8bit generates all possible 2-byte sequences, followed by distinctive padding. -func enum16bit(try func([]byte)) { - for i := 0; i < 1<<16; i++ { - try([]byte{byte(i), byte(i >> 8), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) - } -} - -// enum24bit generates all possible 3-byte sequences, followed by distinctive padding. -func enum24bit(try func([]byte)) { - for i := 0; i < 1<<24; i++ { - try([]byte{byte(i), byte(i >> 8), byte(i >> 16), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) - } -} - -// enumModRM generates all possible modrm bytes and, for modrm values that indicate -// a following sib byte, all possible modrm, sib combinations. -func enumModRM(try func([]byte)) { - for i := 0; i < 256; i++ { - if (i>>3)&07 == 04 && i>>6 != 3 { // has sib - for j := 0; j < 256; j++ { - try([]byte{0, byte(i), byte(j), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) // byte encodings - try([]byte{1, byte(i), byte(j), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) // word encodings - } - } else { - try([]byte{0, byte(i), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) // byte encodings - try([]byte{1, byte(i), 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}) // word encodings - } - } -} - -// fixed generates the single case b. -// It's mainly useful to prepare an argument for concat or concat3. -func fixed(b ...byte) func(func([]byte)) { - return func(try func([]byte)) { - try(b) - } -} - -// testBasic runs the given test function with cases all using opcode as the initial opcode bytes. -// It runs three phases: -// -// First, zero-or-one prefixes followed by opcode followed by all possible 1-byte values. -// If in -short mode, that's all. -// -// Second, zero-or-one prefixes followed by opcode followed by all possible 2-byte values. -// If not in -long mode, that's all. This phase and the next run in parallel with other tests -// (using t.Parallel). -// -// Finally, opcode followed by all possible 3-byte values. The test can take a very long time -// and prints progress messages to package log. -func testBasic(t *testing.T, testfn func(*testing.T, func(func([]byte))), opcode ...byte) { - testfn(t, concat3(basicPrefixes, fixed(opcode...), enum8bit)) - if testing.Short() { - return - } - - t.Parallel() - testfn(t, concat3(basicPrefixes, fixed(opcode...), enum16bit)) - if !*longTest { - return - } - - name := caller(2) - op1 := make([]byte, len(opcode)+1) - copy(op1, opcode) - for i := 0; i < 256; i++ { - log.Printf("%s 24-bit: %d/256\n", name, i) - op1[len(opcode)] = byte(i) - testfn(t, concat(fixed(op1...), enum16bit)) - } -} - -func testBasicREX(t *testing.T, testfn func(*testing.T, func(func([]byte))), opcode ...byte) { - testfn(t, filter(concat4(basicPrefixes, rexPrefixes, fixed(opcode...), enum8bit), isValidREX)) - if testing.Short() { - return - } - - t.Parallel() - testfn(t, filter(concat4(basicPrefixes, rexPrefixes, fixed(opcode...), enum16bit), isValidREX)) - if !*longTest { - return - } - - name := caller(2) - op1 := make([]byte, len(opcode)+1) - copy(op1, opcode) - for i := 0; i < 256; i++ { - log.Printf("%s 24-bit: %d/256\n", name, i) - op1[len(opcode)] = byte(i) - testfn(t, filter(concat3(rexPrefixes, fixed(op1...), enum16bit), isValidREX)) - } -} - -// testPrefix runs the given test function for all many prefix possibilities -// followed by all possible 1-byte sequences. -// -// If in -long mode, it then runs a test of all the prefix possibilities followed -// by all possible 2-byte sequences. -func testPrefix(t *testing.T, testfn func(*testing.T, func(func([]byte)))) { - t.Parallel() - testfn(t, concat(manyPrefixes, enum8bit)) - if testing.Short() || !*longTest { - return - } - - name := caller(2) - for i := 0; i < 256; i++ { - log.Printf("%s 16-bit: %d/256\n", name, i) - testfn(t, concat3(manyPrefixes, fixed(byte(i)), enum8bit)) - } -} - -func testPrefixREX(t *testing.T, testfn func(*testing.T, func(func([]byte)))) { - t.Parallel() - testfn(t, filter(concat3(manyPrefixes, rexPrefixes, enum8bit), isValidREX)) - if testing.Short() || !*longTest { - return - } - - name := caller(2) - for i := 0; i < 256; i++ { - log.Printf("%s 16-bit: %d/256\n", name, i) - testfn(t, filter(concat4(manyPrefixes, rexPrefixes, fixed(byte(i)), enum8bit), isValidREX)) - } -} - -func caller(skip int) string { - pc, _, _, _ := runtime.Caller(skip) - f := runtime.FuncForPC(pc) - name := "?" - if f != nil { - name = f.Name() - if i := strings.LastIndex(name, "."); i >= 0 { - name = name[i+1:] - } - } - return name -} - -func isValidREX(x []byte) bool { - i := 0 - for i < len(x) && isPrefixByte(x[i]) { - i++ - } - if i < len(x) && Prefix(x[i]).IsREX() { - i++ - if i < len(x) { - return !isPrefixByte(x[i]) && !Prefix(x[i]).IsREX() - } - } - return true -} - -func isPrefixByte(b byte) bool { - switch b { - case 0x26, 0x2E, 0x36, 0x3E, 0x64, 0x65, 0x66, 0x67, 0xF0, 0xF2, 0xF3: - return true - } - return false -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/format_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/format_test.go deleted file mode 100644 index 9f110f8105..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/format_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 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 x86asm - -import ( - "encoding/hex" - "testing" -) - -func testFormattingSymname(addr uint64) (string, uint64) { - switch addr { - case 0x424080: - return "runtime.printint", 0x424080 - case 0x4c8068: - return "main.A", 0x4c8068 - } - return "", 0 -} - -func TestFormatting(t *testing.T) { - testCases := []struct { - PC uint64 - bytes string - - goSyntax, intelSyntax, gnuSyntax string - }{ - {0x4816b2, "0f8677010000", - "JBE 0x48182f", - "jbe 0x48182f", - "jbe 0x48182f"}, - {0x45065b, "488b442408", - "MOVQ 0x8(SP), AX", - "mov rax, qword ptr [rsp+0x8]", - "mov 0x8(%rsp),%rax"}, - {0x450678, "488b05e9790700", - "MOVQ main.A(SB), AX", - "mov rax, qword ptr [main.A]", - "mov main.A,%rax"}, - {0x450664, "e8173afdff", - "CALL runtime.printint(SB)", - "call runtime.printint", - "callq runtime.printint"}, - {0x45069b, "488d0575d90100", - "LEAQ 0x1d975(IP), AX", - "lea rax, ptr [rip+0x1d975]", - "lea 0x1d975(%rip),%rax"}, - } - - for _, testCase := range testCases { - t.Logf("%#x %s %s", testCase.PC, testCase.bytes, testCase.goSyntax) - bs, _ := hex.DecodeString(testCase.bytes) - inst, err := Decode(bs, 64) - if err != nil { - t.Errorf("decode error %v", err) - } - if out := GoSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.goSyntax { - t.Errorf("GoSyntax: %q", out) - } - if out := IntelSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.intelSyntax { - t.Errorf("IntelSyntax: %q expected: %q", out, testCase.intelSyntax) - } - if out := GNUSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.gnuSyntax { - t.Errorf("GNUSyntax: %q expected: %q", out, testCase.gnuSyntax) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/inst_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/inst_test.go deleted file mode 100644 index 23ac523207..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/inst_test.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "strings" - "testing" -) - -func TestRegString(t *testing.T) { - for r := Reg(1); r <= regMax; r++ { - if regNames[r] == "" { - t.Errorf("regNames[%d] is missing", int(r)) - } else if s := r.String(); strings.Contains(s, "Reg(") { - t.Errorf("Reg(%d).String() = %s, want proper name", int(r), s) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdump_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdump_test.go deleted file mode 100644 index 3d4e1460f8..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdump_test.go +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "bytes" - "strings" - "testing" -) - -func TestObjdump32Manual(t *testing.T) { testObjdump32(t, hexCases(t, objdumpManualTests)) } -func TestObjdump32Testdata(t *testing.T) { testObjdump32(t, concat(basicPrefixes, testdataCases(t))) } -func TestObjdump32ModRM(t *testing.T) { testObjdump32(t, concat(basicPrefixes, enumModRM)) } -func TestObjdump32OneByte(t *testing.T) { testBasic(t, testObjdump32) } -func TestObjdump320F(t *testing.T) { testBasic(t, testObjdump32, 0x0F) } -func TestObjdump320F38(t *testing.T) { testBasic(t, testObjdump32, 0x0F, 0x38) } -func TestObjdump320F3A(t *testing.T) { testBasic(t, testObjdump32, 0x0F, 0x3A) } -func TestObjdump32Prefix(t *testing.T) { testPrefix(t, testObjdump32) } - -func TestObjdump64Manual(t *testing.T) { testObjdump64(t, hexCases(t, objdumpManualTests)) } -func TestObjdump64Testdata(t *testing.T) { testObjdump64(t, concat(basicPrefixes, testdataCases(t))) } -func TestObjdump64ModRM(t *testing.T) { testObjdump64(t, concat(basicPrefixes, enumModRM)) } -func TestObjdump64OneByte(t *testing.T) { testBasic(t, testObjdump64) } -func TestObjdump640F(t *testing.T) { testBasic(t, testObjdump64, 0x0F) } -func TestObjdump640F38(t *testing.T) { testBasic(t, testObjdump64, 0x0F, 0x38) } -func TestObjdump640F3A(t *testing.T) { testBasic(t, testObjdump64, 0x0F, 0x3A) } -func TestObjdump64Prefix(t *testing.T) { testPrefix(t, testObjdump64) } - -func TestObjdump64REXTestdata(t *testing.T) { - testObjdump64(t, filter(concat3(basicPrefixes, rexPrefixes, testdataCases(t)), isValidREX)) -} -func TestObjdump64REXModRM(t *testing.T) { - testObjdump64(t, concat3(basicPrefixes, rexPrefixes, enumModRM)) -} -func TestObjdump64REXOneByte(t *testing.T) { testBasicREX(t, testObjdump64) } -func TestObjdump64REX0F(t *testing.T) { testBasicREX(t, testObjdump64, 0x0F) } -func TestObjdump64REX0F38(t *testing.T) { testBasicREX(t, testObjdump64, 0x0F, 0x38) } -func TestObjdump64REX0F3A(t *testing.T) { testBasicREX(t, testObjdump64, 0x0F, 0x3A) } -func TestObjdump64REXPrefix(t *testing.T) { testPrefixREX(t, testObjdump64) } - -// objdumpManualTests holds test cases that will be run by TestObjdumpManual. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=ObjdumpManual, particularly with tracing enabled. -var objdumpManualTests = ` -4883FE017413 -488DFC2500000000 -488D3D00000000 -` - -// allowedMismatchObjdump reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchObjdump(text string, size int, inst *Inst, dec ExtInst) bool { - if size == 15 && dec.nenc == 15 && contains(text, "truncated") && contains(dec.text, "(bad)") { - return true - } - - if i := strings.LastIndex(dec.text, " "); isPrefix(dec.text[i+1:]) && size == 1 && isPrefix(text) { - return true - } - - if size == dec.nenc && contains(dec.text, "movupd") && contains(dec.text, "data32") { - s := strings.Replace(dec.text, "data32 ", "", -1) - if text == s { - return true - } - } - - // Simplify our invalid instruction text. - if text == "error: unrecognized instruction" { - text = "BAD" - } - - // Invalid instructions for which libopcodes prints %? register. - // FF E8 11 22 33 44: - // Invalid instructions for which libopcodes prints "internal disassembler error". - // Invalid instructions for which libopcodes prints 8087 only (e.g., DB E0) - // or prints 287 only (e.g., DB E4). - if contains(dec.text, "%?", "", "(8087 only)", "(287 only)") { - dec.text = "(bad)" - } - - // 0F 19 11, 0F 1C 11, 0F 1D 11, 0F 1E 11, 0F 1F 11: libopcodes says nop, - // but the Intel manuals say that the only NOP there is 0F 1F /0. - // Perhaps libopcodes is reporting an older encoding. - i := bytes.IndexByte(dec.enc[:], 0x0F) - if contains(dec.text, "nop") && i >= 0 && i+2 < len(dec.enc) && dec.enc[i+1]&^7 == 0x18 && (dec.enc[i+1] != 0x1F || (dec.enc[i+2]>>3)&7 != 0) { - dec.text = "(bad)" - } - - // Any invalid instruction. - if text == "BAD" && contains(dec.text, "(bad)") { - return true - } - - // Instructions libopcodes knows but we do not (e.g., 0F 19 11). - if (text == "BAD" || size == 1 && isPrefix(text)) && hasPrefix(dec.text, unsupported...) { - return true - } - - // Instructions we know but libopcodes does not (e.g., 0F D0 11). - if (contains(dec.text, "(bad)") || dec.nenc == 1 && isPrefix(dec.text)) && hasPrefix(text, libopcodesUnsupported...) { - return true - } - - // Libopcodes rejects F2 90 as NOP. Not sure why. - if (contains(dec.text, "(bad)") || dec.nenc == 1 && isPrefix(dec.text)) && inst.Opcode>>24 == 0x90 && countPrefix(inst, 0xF2) > 0 { - return true - } - - // 0F 20 11, 0F 21 11, 0F 22 11, 0F 23 11, 0F 24 11: - // Moves into and out of some control registers seem to be unsupported by libopcodes. - // TODO(rsc): Are they invalid somehow? - if (contains(dec.text, "(bad)") || dec.nenc == 1 && isPrefix(dec.text)) && contains(text, "%cr", "%db", "%tr") { - return true - } - - if contains(dec.text, "fwait") && dec.nenc == 1 && dec.enc[0] != 0x9B { - return true - } - - // 9B D9 11: libopcodes reports FSTSW instead of FWAIT + FNSTSW. - // This is correct in that FSTSW is a pseudo-op for the pair, but it really - // is a pair of instructions: execution can stop between them. - // Our decoder chooses to separate them. - if (text == "fwait" || strings.HasSuffix(text, " fwait")) && dec.nenc >= len(strings.Fields(text)) && dec.enc[len(strings.Fields(text))-1] == 0x9B { - return true - } - - // 0F 18 77 11: - // Invalid instructions for which libopcodes prints "nop/reserved". - // Perhaps libopcodes is reporting an older encoding. - if text == "BAD" && contains(dec.text, "nop/reserved") { - return true - } - - // 0F C7 B0 11 22 33 44: libopcodes says vmptrld 0x44332211(%eax); we say rdrand %eax. - // TODO(rsc): Fix, since we are probably wrong, but we don't have vmptrld in the manual. - if contains(text, "rdrand") && contains(dec.text, "vmptrld", "vmxon", "vmclear") { - return true - } - - // DD C8: libopcodes says FNOP but the Intel manual is clear FNOP is only D9 D0. - // Perhaps libopcodes is reporting an older encoding. - if text == "BAD" && contains(dec.text, "fnop") && (dec.enc[0] != 0xD9 || dec.enc[1] != 0xD0) { - return true - } - - // 66 90: libopcodes says xchg %ax,%ax; we say 'data16 nop'. - // The 16-bit swap will preserve the high bits of the register, - // so they are the same. - if contains(text, "nop") && contains(dec.text, "xchg %ax,%ax") { - return true - } - - // If there are multiple prefixes, allow libopcodes to use an alternate name. - if size == 1 && dec.nenc == 1 && prefixByte[text] > 0 && prefixByte[text] == prefixByte[dec.text] { - return true - } - - // 26 9B: libopcodes reports "fwait"/1, ignoring segment prefix. - // https://sourceware.org/bugzilla/show_bug.cgi?id=16891 - // F0 82: Decode="lock"/1 but libopcodes="lock (bad)"/2. - if size == 1 && dec.nenc >= 1 && prefixByte[text] == dec.enc[0] && contains(dec.text, "(bad)", "fwait", "fnop") { - return true - } - - // libopcodes interprets 660f801122 as taking a rel16 but - // truncating the address at 16 bits. Not sure what is correct. - if contains(text, ".+0x2211", ".+0x11") && contains(dec.text, " .-") { - return true - } - - // 66 F3 0F D6 C5, 66 F2 0F D6 C0: libopcodes reports use of XMM register instead of MMX register, - // but only when the instruction has a 66 prefix. Maybe they know something we don't. - if countPrefix(inst, 0x66) > 0 && contains(dec.text, "movdq2q", "movq2dq") && !contains(dec.text, "%mm") { - return true - } - - // 0F 01 F8, 0F 05, 0F 07: these are 64-bit instructions but libopcodes accepts them. - if (text == "BAD" || size == 1 && isPrefix(text)) && contains(dec.text, "swapgs", "syscall", "sysret", "rdfsbase", "rdgsbase", "wrfsbase", "wrgsbase") { - return true - } - - return false -} - -// Instructions known to libopcodes (or xed) but not to us. -// Most of these come from supplementary manuals of one form or another. -var unsupported = strings.Fields(` - bndc - bndl - bndm - bnds - clac - clgi - femms - fldln - fldz - getsec - invlpga - kmov - montmul - pavg - pf2i - pfacc - pfadd - pfcmp - pfmax - pfmin - pfmul - pfna - pfpnac - pfrc - pfrs - pfsub - phadd - phsub - pi2f - pmulhr - prefetch - pswap - ptest - rdseed - sha1 - sha256 - skinit - stac - stgi - vadd - vand - vcmp - vcomis - vcvt - vcvt - vdiv - vhadd - vhsub - vld - vmax - vmcall - vmfunc - vmin - vmlaunch - vmload - vmmcall - vmov - vmov - vmov - vmptrld - vmptrst - vmread - vmresume - vmrun - vmsave - vmul - vmwrite - vmxoff - vor - vpack - vpadd - vpand - vpavg - vpcmp - vpcmp - vpins - vpmadd - vpmax - vpmin - vpmul - vpmul - vpor - vpsad - vpshuf - vpsll - vpsra - vpsrad - vpsrl - vpsub - vpunp - vpxor - vrcp - vrsqrt - vshuf - vsqrt - vsub - vucomis - vunp - vxor - vzero - xcrypt - xsha1 - xsha256 - xstore-rng - insertq - extrq - vmclear - invvpid - adox - vmxon - invept - adcx - vmclear - prefetchwt1 - enclu - encls - salc - fstpnce - fdisi8087_nop - fsetpm287_nop - feni8087_nop - syscall - sysret -`) - -// Instructions known to us but not to libopcodes (at least in binutils 2.24). -var libopcodesUnsupported = strings.Fields(` - addsubps - aes - blend - cvttpd2dq - dpp - extract - haddps - hsubps - insert - invpcid - lddqu - movmsk - movnt - movq2dq - mps - pack - pblend - pclmul - pcmp - pext - phmin - pins - pmax - pmin - pmov - pmovmsk - pmul - popcnt - pslld - psllq - psllw - psrad - psraw - psrl - ptest - punpck - round - xrstor - xsavec - xsaves - comis - ucomis - movhps - movntps - rsqrt - rcpp - puncpck - bsf - movq2dq - cvttpd2dq - movq - hsubpd - movdqa - movhpd - addsubpd - movd - haddpd - cvtps2dq - bsr - cvtdq2ps - rdrand - maskmov - movq2dq - movlhps - movbe - movlpd -`) diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdumpext_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdumpext_test.go deleted file mode 100644 index d1b067d84e..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/objdumpext_test.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "bytes" - "debug/elf" - "encoding/binary" - "fmt" - "io" - "log" - "os" - "strconv" - "strings" - "testing" -) - -// Apologies for the proprietary path, but we need objdump 2.24 + some committed patches that will land in 2.25. -const objdumpPath = "/Users/rsc/bin/objdump2" - -func testObjdump32(t *testing.T, generate func(func([]byte))) { - testObjdumpArch(t, generate, 32) -} - -func testObjdump64(t *testing.T, generate func(func([]byte))) { - testObjdumpArch(t, generate, 64) -} - -func testObjdumpArch(t *testing.T, generate func(func([]byte)), arch int) { - if testing.Short() { - t.Skip("skipping objdump test in short mode") - } - if _, err := os.Stat(objdumpPath); err != nil { - t.Skip(err) - } - - testExtDis(t, "gnu", arch, objdump, generate, allowedMismatchObjdump) -} - -func objdump(ext *ExtDis) error { - // File already written with instructions; add ELF header. - if ext.Arch == 32 { - if err := writeELF32(ext.File, ext.Size); err != nil { - return err - } - } else { - if err := writeELF64(ext.File, ext.Size); err != nil { - return err - } - } - - b, err := ext.Run(objdumpPath, "-d", "-z", ext.File.Name()) - if err != nil { - return err - } - - var ( - nmatch int - reading bool - next uint32 = start - addr uint32 - encbuf [32]byte - enc []byte - text string - ) - flush := func() { - if addr == next { - switch text { - case "repz": - text = "rep" - case "repnz": - text = "repn" - default: - text = strings.Replace(text, "repz ", "rep ", -1) - text = strings.Replace(text, "repnz ", "repn ", -1) - } - if m := pcrelw.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int16(uint32(targ)-uint32(uint16(addr))-uint32(len(enc)))) - } - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int32(uint32(targ)-addr-uint32(len(enc)))) - } - text = strings.Replace(text, "0x0(", "(", -1) - text = strings.Replace(text, "%st(0)", "%st", -1) - - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [32]byte{} - enc = nil - next += 32 - } - } - var textangle = []byte("<.text>:") - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading objdump output: %v", err) - } - if bytes.Contains(line, textangle) { - reading = true - continue - } - if !reading { - continue - } - if debug { - os.Stdout.Write(line) - } - if enc1 := parseContinuation(line, encbuf[:len(enc)]); enc1 != nil { - enc = enc1 - continue - } - flush() - nmatch++ - addr, enc, text = parseLine(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - } - flush() - if next != start+uint32(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -func parseLine(line []byte, encstart []byte) (addr uint32, enc []byte, text string) { - oline := line - i := index(line, ":\t") - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - x, err := strconv.ParseUint(string(trimSpace(line[:i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint32(x) - line = line[i+2:] - i = bytes.IndexByte(line, '\t') - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - enc, ok := parseHex(line[:i], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", oline) - } - line = trimSpace(line[i:]) - if i := bytes.IndexByte(line, '#'); i >= 0 { - line = trimSpace(line[:i]) - } - text = string(fixSpace(line)) - return -} - -func parseContinuation(line []byte, enc []byte) []byte { - i := index(line, ":\t") - if i < 0 { - return nil - } - line = line[i+1:] - enc, _ = parseHex(line, enc) - return enc -} - -// writeELF32 writes an ELF32 header to the file, -// describing a text segment that starts at start -// and extends for size bytes. -func writeELF32(f *os.File, size int) error { - f.Seek(0, io.SeekStart) - var hdr elf.Header32 - var prog elf.Prog32 - var sect elf.Section32 - var buf bytes.Buffer - binary.Write(&buf, binary.LittleEndian, &hdr) - off1 := buf.Len() - binary.Write(&buf, binary.LittleEndian, &prog) - off2 := buf.Len() - binary.Write(&buf, binary.LittleEndian, §) - off3 := buf.Len() - buf.Reset() - data := byte(elf.ELFDATA2LSB) - hdr = elf.Header32{ - Ident: [16]byte{0x7F, 'E', 'L', 'F', 1, data, 1}, - Type: 2, - Machine: uint16(elf.EM_386), - Version: 1, - Entry: start, - Phoff: uint32(off1), - Shoff: uint32(off2), - Flags: 0x05000002, - Ehsize: uint16(off1), - Phentsize: uint16(off2 - off1), - Phnum: 1, - Shentsize: uint16(off3 - off2), - Shnum: 3, - Shstrndx: 2, - } - binary.Write(&buf, binary.LittleEndian, &hdr) - prog = elf.Prog32{ - Type: 1, - Off: start, - Vaddr: start, - Paddr: start, - Filesz: uint32(size), - Memsz: uint32(size), - Flags: 5, - Align: start, - } - binary.Write(&buf, binary.LittleEndian, &prog) - binary.Write(&buf, binary.LittleEndian, §) // NULL section - sect = elf.Section32{ - Name: 1, - Type: uint32(elf.SHT_PROGBITS), - Addr: start, - Off: start, - Size: uint32(size), - Flags: uint32(elf.SHF_ALLOC | elf.SHF_EXECINSTR), - Addralign: 4, - } - binary.Write(&buf, binary.LittleEndian, §) // .text - sect = elf.Section32{ - Name: uint32(len("\x00.text\x00")), - Type: uint32(elf.SHT_STRTAB), - Addr: 0, - Off: uint32(off2 + (off3-off2)*3), - Size: uint32(len("\x00.text\x00.shstrtab\x00")), - Addralign: 1, - } - binary.Write(&buf, binary.LittleEndian, §) - buf.WriteString("\x00.text\x00.shstrtab\x00") - f.Write(buf.Bytes()) - return nil -} - -// writeELF64 writes an ELF64 header to the file, -// describing a text segment that starts at start -// and extends for size bytes. -func writeELF64(f *os.File, size int) error { - f.Seek(0, io.SeekStart) - var hdr elf.Header64 - var prog elf.Prog64 - var sect elf.Section64 - var buf bytes.Buffer - binary.Write(&buf, binary.LittleEndian, &hdr) - off1 := buf.Len() - binary.Write(&buf, binary.LittleEndian, &prog) - off2 := buf.Len() - binary.Write(&buf, binary.LittleEndian, §) - off3 := buf.Len() - buf.Reset() - data := byte(elf.ELFDATA2LSB) - hdr = elf.Header64{ - Ident: [16]byte{0x7F, 'E', 'L', 'F', 2, data, 1}, - Type: 2, - Machine: uint16(elf.EM_X86_64), - Version: 1, - Entry: start, - Phoff: uint64(off1), - Shoff: uint64(off2), - Flags: 0x05000002, - Ehsize: uint16(off1), - Phentsize: uint16(off2 - off1), - Phnum: 1, - Shentsize: uint16(off3 - off2), - Shnum: 3, - Shstrndx: 2, - } - binary.Write(&buf, binary.LittleEndian, &hdr) - prog = elf.Prog64{ - Type: 1, - Off: start, - Vaddr: start, - Paddr: start, - Filesz: uint64(size), - Memsz: uint64(size), - Flags: 5, - Align: start, - } - binary.Write(&buf, binary.LittleEndian, &prog) - binary.Write(&buf, binary.LittleEndian, §) // NULL section - sect = elf.Section64{ - Name: 1, - Type: uint32(elf.SHT_PROGBITS), - Addr: start, - Off: start, - Size: uint64(size), - Flags: uint64(elf.SHF_ALLOC | elf.SHF_EXECINSTR), - Addralign: 4, - } - binary.Write(&buf, binary.LittleEndian, §) // .text - sect = elf.Section64{ - Name: uint32(len("\x00.text\x00")), - Type: uint32(elf.SHT_STRTAB), - Addr: 0, - Off: uint64(off2 + (off3-off2)*3), - Size: uint64(len("\x00.text\x00.shstrtab\x00")), - Addralign: 1, - } - binary.Write(&buf, binary.LittleEndian, §) - buf.WriteString("\x00.text\x00.shstrtab\x00") - f.Write(buf.Bytes()) - return nil -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9ext_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9ext_test.go deleted file mode 100644 index 9bd296cf75..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9ext_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "bytes" - "fmt" - "io" - "log" - "os" - "strconv" - "testing" -) - -const plan9Path = "testdata/libmach8db" - -func testPlan9Arch(t *testing.T, arch int, generate func(func([]byte))) { - if testing.Short() { - t.Skip("skipping libmach test in short mode") - } - if _, err := os.Stat(plan9Path); err != nil { - t.Skip(err) - } - - testExtDis(t, "plan9", arch, plan9, generate, allowedMismatchPlan9) -} - -func testPlan932(t *testing.T, generate func(func([]byte))) { - testPlan9Arch(t, 32, generate) -} - -func testPlan964(t *testing.T, generate func(func([]byte))) { - testPlan9Arch(t, 64, generate) -} - -func plan9(ext *ExtDis) error { - flag := "-8" - if ext.Arch == 64 { - flag = "-6" - } - b, err := ext.Run(plan9Path, flag, ext.File.Name()) - if err != nil { - return err - } - - nmatch := 0 - next := uint32(start) - var ( - addr uint32 - encbuf [32]byte - enc []byte - text string - ) - - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading libmach8db output: %v", err) - } - if debug { - os.Stdout.Write(line) - } - nmatch++ - addr, enc, text = parseLinePlan9(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - if addr < next { - continue - } - if m := pcrelw.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int16(uint32(targ)-uint32(uint16(addr))-uint32(len(enc)))) - } - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int32(uint32(targ)-addr-uint32(len(enc)))) - } - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [32]byte{} - enc = nil - next += 32 - } - if next != start+uint32(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -func parseLinePlan9(line []byte, encstart []byte) (addr uint32, enc []byte, text string) { - i := bytes.IndexByte(line, ' ') - if i < 0 || line[0] != '0' || line[1] != 'x' { - log.Fatalf("cannot parse disassembly: %q", line) - } - j := bytes.IndexByte(line[i+1:], ' ') - if j < 0 { - log.Fatalf("cannot parse disassembly: %q", line) - } - j += i + 1 - x, err := strconv.ParseUint(string(trimSpace(line[2:i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", line) - } - addr = uint32(x) - enc, ok := parseHex(line[i+1:j], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", line) - } - return addr, enc, string(fixSpace(line[j+1:])) -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x_test.go deleted file mode 100644 index f2ea28cd90..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/plan9x_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "strings" - "testing" -) - -func TestPlan932Manual(t *testing.T) { testPlan932(t, hexCases(t, plan9ManualTests)) } -func TestPlan932Testdata(t *testing.T) { testPlan932(t, concat(basicPrefixes, testdataCases(t))) } -func TestPlan932ModRM(t *testing.T) { testPlan932(t, concat(basicPrefixes, enumModRM)) } -func TestPlan932OneByte(t *testing.T) { testBasic(t, testPlan932) } -func TestPlan9320F(t *testing.T) { testBasic(t, testPlan932, 0x0F) } -func TestPlan9320F38(t *testing.T) { testBasic(t, testPlan932, 0x0F, 0x38) } -func TestPlan9320F3A(t *testing.T) { testBasic(t, testPlan932, 0x0F, 0x3A) } -func TestPlan932Prefix(t *testing.T) { testPrefix(t, testPlan932) } - -func TestPlan964Manual(t *testing.T) { testPlan964(t, hexCases(t, plan9ManualTests)) } -func TestPlan964Testdata(t *testing.T) { testPlan964(t, concat(basicPrefixes, testdataCases(t))) } -func TestPlan964ModRM(t *testing.T) { testPlan964(t, concat(basicPrefixes, enumModRM)) } -func TestPlan964OneByte(t *testing.T) { testBasic(t, testPlan964) } -func TestPlan9640F(t *testing.T) { testBasic(t, testPlan964, 0x0F) } -func TestPlan9640F38(t *testing.T) { testBasic(t, testPlan964, 0x0F, 0x38) } -func TestPlan9640F3A(t *testing.T) { testBasic(t, testPlan964, 0x0F, 0x3A) } -func TestPlan964Prefix(t *testing.T) { testPrefix(t, testPlan964) } - -func TestPlan964REXTestdata(t *testing.T) { - testPlan964(t, filter(concat3(basicPrefixes, rexPrefixes, testdataCases(t)), isValidREX)) -} -func TestPlan964REXModRM(t *testing.T) { testPlan964(t, concat3(basicPrefixes, rexPrefixes, enumModRM)) } -func TestPlan964REXOneByte(t *testing.T) { testBasicREX(t, testPlan964) } -func TestPlan964REX0F(t *testing.T) { testBasicREX(t, testPlan964, 0x0F) } -func TestPlan964REX0F38(t *testing.T) { testBasicREX(t, testPlan964, 0x0F, 0x38) } -func TestPlan964REX0F3A(t *testing.T) { testBasicREX(t, testPlan964, 0x0F, 0x3A) } -func TestPlan964REXPrefix(t *testing.T) { testPrefixREX(t, testPlan964) } - -// plan9ManualTests holds test cases that will be run by TestPlan9Manual32 and TestPlan9Manual64. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=Plan9Manual, particularly with tracing enabled. -var plan9ManualTests = ` -` - -// allowedMismatchPlan9 reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchPlan9(text string, size int, inst *Inst, dec ExtInst) bool { - return false -} - -// Instructions known to us but not to plan9. -var plan9Unsupported = strings.Fields(` -`) diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/Makefile b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/Makefile deleted file mode 100644 index 9cb44127a4..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -libmach8db: libmach8db.c - 9c libmach8db.c && 9l -o libmach8db libmach8db.o; rm libmach8db.o - -newdecode.txt: - cd ..; go test -cover -run 'Objdump.*32' -v -timeout 10h -printtests 2>&1 | tee log - cd ..; go test -cover -run 'Objdump.*64' -v -timeout 10h -printtests 2>&1 | tee -a log - cd ..; go test -cover -run 'Xed.*32' -v -timeout 10h -printtests 2>&1 | tee -a log - cd ..; go test -cover -run 'Xed.*64' -v -timeout 10h -printtests 2>&1 | tee -a log - cd ..; go test -cover -run 'Plan9.*32' -v -timeout 10h -printtests 2>&1 | tee -a log - cd ..; go test -cover -run 'Plan9.*64' -v -timeout 10h -printtests 2>&1 | tee -a log - egrep ' (gnu|intel|plan9) ' ../log |sort >newdecode.txt - diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/decode.txt b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/decode.txt deleted file mode 100644 index 520378916b..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/decode.txt +++ /dev/null @@ -1,6771 +0,0 @@ -000511223344|556677885f5f5f5f5f5f 32 intel add byte ptr [0x44332211], al -000511223344|556677885f5f5f5f5f5f 64 gnu add %al,0x44332211(%rip) -000511223344|556677885f5f5f5f5f5f 64 intel add byte ptr [rip+0x44332211], al -0100|11223344556677885f5f5f5f5f5f 32 intel add dword ptr [eax], eax -0100|11223344556677885f5f5f5f5f5f 32 plan9 ADDL AX, 0(AX) -0100|11223344556677885f5f5f5f5f5f 64 gnu add %eax,(%rax) -0100|11223344556677885f5f5f5f5f5f 64 intel add dword ptr [rax], eax -0100|11223344556677885f5f5f5f5f5f 64 plan9 ADDL AX, 0(AX) -0211|223344556677885f5f5f5f5f5f5f 32 intel add dl, byte ptr [ecx] -0211|223344556677885f5f5f5f5f5f5f 32 plan9 ADDB 0(CX), DL -0211|223344556677885f5f5f5f5f5f5f 64 gnu add (%rcx),%dl -0211|223344556677885f5f5f5f5f5f5f 64 intel add dl, byte ptr [rcx] -0211|223344556677885f5f5f5f5f5f5f 64 plan9 ADDB 0(CX), DL -0311|223344556677885f5f5f5f5f5f5f 32 intel add edx, dword ptr [ecx] -0311|223344556677885f5f5f5f5f5f5f 32 plan9 ADDL 0(CX), DX -0311|223344556677885f5f5f5f5f5f5f 64 gnu add (%rcx),%edx -0311|223344556677885f5f5f5f5f5f5f 64 intel add edx, dword ptr [rcx] -0311|223344556677885f5f5f5f5f5f5f 64 plan9 ADDL 0(CX), DX -0411|223344556677885f5f5f5f5f5f5f 32 intel add al, 0x11 -0411|223344556677885f5f5f5f5f5f5f 32 plan9 ADDL $0x11, AL -0411|223344556677885f5f5f5f5f5f5f 64 gnu add $0x11,%al -0411|223344556677885f5f5f5f5f5f5f 64 intel add al, 0x11 -0411|223344556677885f5f5f5f5f5f5f 64 plan9 ADDL $0x11, AL -0511223344|556677885f5f5f5f5f5f5f 32 intel add eax, 0x44332211 -0511223344|556677885f5f5f5f5f5f5f 32 plan9 ADDL $0x44332211, AX -0511223344|556677885f5f5f5f5f5f5f 64 gnu add $0x44332211,%eax -0511223344|556677885f5f5f5f5f5f5f 64 intel add eax, 0x44332211 -0511223344|556677885f5f5f5f5f5f5f 64 plan9 ADDL $0x44332211, AX -06|11223344556677885f5f5f5f5f5f5f 32 intel push es -06|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL ES -06|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -06|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -06|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -07|11223344556677885f5f5f5f5f5f5f 32 intel pop es -07|11223344556677885f5f5f5f5f5f5f 32 plan9 POPL ES -07|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -07|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -07|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0811|223344556677885f5f5f5f5f5f5f 32 intel or byte ptr [ecx], dl -0811|223344556677885f5f5f5f5f5f5f 32 plan9 ORB DL, 0(CX) -0811|223344556677885f5f5f5f5f5f5f 64 gnu or %dl,(%rcx) -0811|223344556677885f5f5f5f5f5f5f 64 intel or byte ptr [rcx], dl -0811|223344556677885f5f5f5f5f5f5f 64 plan9 ORB DL, 0(CX) -0911|223344556677885f5f5f5f5f5f5f 32 intel or dword ptr [ecx], edx -0911|223344556677885f5f5f5f5f5f5f 32 plan9 ORL DX, 0(CX) -0911|223344556677885f5f5f5f5f5f5f 64 gnu or %edx,(%rcx) -0911|223344556677885f5f5f5f5f5f5f 64 intel or dword ptr [rcx], edx -0911|223344556677885f5f5f5f5f5f5f 64 plan9 ORL DX, 0(CX) -0a11|223344556677885f5f5f5f5f5f5f 32 intel or dl, byte ptr [ecx] -0a11|223344556677885f5f5f5f5f5f5f 32 plan9 ORB 0(CX), DL -0a11|223344556677885f5f5f5f5f5f5f 64 gnu or (%rcx),%dl -0a11|223344556677885f5f5f5f5f5f5f 64 intel or dl, byte ptr [rcx] -0a11|223344556677885f5f5f5f5f5f5f 64 plan9 ORB 0(CX), DL -0b11|223344556677885f5f5f5f5f5f5f 32 intel or edx, dword ptr [ecx] -0b11|223344556677885f5f5f5f5f5f5f 32 plan9 ORL 0(CX), DX -0b11|223344556677885f5f5f5f5f5f5f 64 gnu or (%rcx),%edx -0b11|223344556677885f5f5f5f5f5f5f 64 intel or edx, dword ptr [rcx] -0b11|223344556677885f5f5f5f5f5f5f 64 plan9 ORL 0(CX), DX -0c11|223344556677885f5f5f5f5f5f5f 32 intel or al, 0x11 -0c11|223344556677885f5f5f5f5f5f5f 32 plan9 ORL $0x11, AL -0c11|223344556677885f5f5f5f5f5f5f 64 gnu or $0x11,%al -0c11|223344556677885f5f5f5f5f5f5f 64 intel or al, 0x11 -0c11|223344556677885f5f5f5f5f5f5f 64 plan9 ORL $0x11, AL -0d11223344|556677885f5f5f5f5f5f5f 32 intel or eax, 0x44332211 -0d11223344|556677885f5f5f5f5f5f5f 32 plan9 ORL $0x44332211, AX -0d11223344|556677885f5f5f5f5f5f5f 64 gnu or $0x44332211,%eax -0d11223344|556677885f5f5f5f5f5f5f 64 intel or eax, 0x44332211 -0d11223344|556677885f5f5f5f5f5f5f 64 plan9 ORL $0x44332211, AX -0e|11223344556677885f5f5f5f5f5f5f 32 intel push cs -0e|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL CS -0e|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -0e|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -0e|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f0000|11223344556677885f5f5f5f5f 32 intel sldt word ptr [eax] -0f0000|11223344556677885f5f5f5f5f 32 plan9 SLDT 0(AX) -0f0000|11223344556677885f5f5f5f5f 64 gnu sldt (%rax) -0f0000|11223344556677885f5f5f5f5f 64 intel sldt word ptr [rax] -0f0000|11223344556677885f5f5f5f5f 64 plan9 SLDT 0(AX) -0f0008|11223344556677885f5f5f5f5f 32 intel str word ptr [eax] -0f0008|11223344556677885f5f5f5f5f 32 plan9 STR 0(AX) -0f0008|11223344556677885f5f5f5f5f 64 gnu str (%rax) -0f0008|11223344556677885f5f5f5f5f 64 intel str word ptr [rax] -0f0008|11223344556677885f5f5f5f5f 64 plan9 STR 0(AX) -0f0011|223344556677885f5f5f5f5f5f 32 intel lldt word ptr [ecx] -0f0011|223344556677885f5f5f5f5f5f 32 plan9 LLDT 0(CX) -0f0011|223344556677885f5f5f5f5f5f 64 gnu lldt (%rcx) -0f0011|223344556677885f5f5f5f5f5f 64 intel lldt word ptr [rcx] -0f0011|223344556677885f5f5f5f5f5f 64 plan9 LLDT 0(CX) -0f0018|11223344556677885f5f5f5f5f 32 intel ltr word ptr [eax] -0f0018|11223344556677885f5f5f5f5f 32 plan9 LTR 0(AX) -0f0018|11223344556677885f5f5f5f5f 64 gnu ltr (%rax) -0f0018|11223344556677885f5f5f5f5f 64 intel ltr word ptr [rax] -0f0018|11223344556677885f5f5f5f5f 64 plan9 LTR 0(AX) -0f0020|11223344556677885f5f5f5f5f 32 intel verr word ptr [eax] -0f0020|11223344556677885f5f5f5f5f 32 plan9 VERR 0(AX) -0f0020|11223344556677885f5f5f5f5f 64 gnu verr (%rax) -0f0020|11223344556677885f5f5f5f5f 64 intel verr word ptr [rax] -0f0020|11223344556677885f5f5f5f5f 64 plan9 VERR 0(AX) -0f0028|11223344556677885f5f5f5f5f 32 intel verw word ptr [eax] -0f0028|11223344556677885f5f5f5f5f 32 plan9 VERW 0(AX) -0f0028|11223344556677885f5f5f5f5f 64 gnu verw (%rax) -0f0028|11223344556677885f5f5f5f5f 64 intel verw word ptr [rax] -0f0028|11223344556677885f5f5f5f5f 64 plan9 VERW 0(AX) -0f0030|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f0030|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f0100|11223344556677885f5f5f5f5f 32 intel sgdt ptr [eax] -0f0100|11223344556677885f5f5f5f5f 32 plan9 SGDT 0(AX) -0f0100|11223344556677885f5f5f5f5f 64 gnu sgdtl (%rax) -0f0100|11223344556677885f5f5f5f5f 64 intel sgdt ptr [rax] -0f0100|11223344556677885f5f5f5f5f 64 plan9 SGDT 0(AX) -0f0108|11223344556677885f5f5f5f5f 32 intel sidt ptr [eax] -0f0108|11223344556677885f5f5f5f5f 32 plan9 SIDT 0(AX) -0f0108|11223344556677885f5f5f5f5f 64 gnu sidtl (%rax) -0f0108|11223344556677885f5f5f5f5f 64 intel sidt ptr [rax] -0f0108|11223344556677885f5f5f5f5f 64 plan9 SIDT 0(AX) -0f0111|223344556677885f5f5f5f5f5f 32 intel lgdt ptr [ecx] -0f0111|223344556677885f5f5f5f5f5f 32 plan9 LGDT 0(CX) -0f0111|223344556677885f5f5f5f5f5f 64 gnu lgdtl (%rcx) -0f0111|223344556677885f5f5f5f5f5f 64 intel lgdt ptr [rcx] -0f0111|223344556677885f5f5f5f5f5f 64 plan9 LGDT 0(CX) -0f0118|11223344556677885f5f5f5f5f 32 intel lidt ptr [eax] -0f0118|11223344556677885f5f5f5f5f 32 plan9 LIDT 0(AX) -0f0118|11223344556677885f5f5f5f5f 64 gnu lidtl (%rax) -0f0118|11223344556677885f5f5f5f5f 64 intel lidt ptr [rax] -0f0118|11223344556677885f5f5f5f5f 64 plan9 LIDT 0(AX) -0f0120|11223344556677885f5f5f5f5f 32 intel smsw word ptr [eax] -0f0120|11223344556677885f5f5f5f5f 32 plan9 SMSW 0(AX) -0f0120|11223344556677885f5f5f5f5f 64 gnu smsw (%rax) -0f0120|11223344556677885f5f5f5f5f 64 intel smsw word ptr [rax] -0f0120|11223344556677885f5f5f5f5f 64 plan9 SMSW 0(AX) -0f0130|11223344556677885f5f5f5f5f 32 intel lmsw word ptr [eax] -0f0130|11223344556677885f5f5f5f5f 32 plan9 LMSW 0(AX) -0f0130|11223344556677885f5f5f5f5f 64 gnu lmsw (%rax) -0f0130|11223344556677885f5f5f5f5f 64 intel lmsw word ptr [rax] -0f0130|11223344556677885f5f5f5f5f 64 plan9 LMSW 0(AX) -0f0138|11223344556677885f5f5f5f5f 32 intel invlpg byte ptr [eax] -0f0138|11223344556677885f5f5f5f5f 32 plan9 INVLPG 0(AX) -0f0138|11223344556677885f5f5f5f5f 64 gnu invlpg (%rax) -0f0138|11223344556677885f5f5f5f5f 64 intel invlpg byte ptr [rax] -0f0138|11223344556677885f5f5f5f5f 64 plan9 INVLPG 0(AX) -0f01c8|11223344556677885f5f5f5f5f 32 intel monitor -0f01c8|11223344556677885f5f5f5f5f 32 plan9 MONITOR -0f01c8|11223344556677885f5f5f5f5f 64 gnu monitor %eax,%ecx,%edx -0f01c8|11223344556677885f5f5f5f5f 64 intel monitor -0f01c8|11223344556677885f5f5f5f5f 64 plan9 MONITOR -0f01c9|11223344556677885f5f5f5f5f 32 intel mwait -0f01c9|11223344556677885f5f5f5f5f 32 plan9 MWAIT -0f01c9|11223344556677885f5f5f5f5f 64 gnu mwait %rax,%rcx -0f01c9|11223344556677885f5f5f5f5f 64 intel mwait -0f01c9|11223344556677885f5f5f5f5f 64 plan9 MWAIT -0f01d0|11223344556677885f5f5f5f5f 32 intel xgetbv -0f01d0|11223344556677885f5f5f5f5f 32 plan9 XGETBV -0f01d0|11223344556677885f5f5f5f5f 64 gnu xgetbv -0f01d0|11223344556677885f5f5f5f5f 64 intel xgetbv -0f01d0|11223344556677885f5f5f5f5f 64 plan9 XGETBV -0f01d1|11223344556677885f5f5f5f5f 32 intel xsetbv -0f01d1|11223344556677885f5f5f5f5f 32 plan9 XSETBV -0f01d1|11223344556677885f5f5f5f5f 64 gnu xsetbv -0f01d1|11223344556677885f5f5f5f5f 64 intel xsetbv -0f01d1|11223344556677885f5f5f5f5f 64 plan9 XSETBV -0f01d5|11223344556677885f5f5f5f5f 32 intel xend -0f01d5|11223344556677885f5f5f5f5f 32 plan9 XEND -0f01d5|11223344556677885f5f5f5f5f 64 gnu xend -0f01d5|11223344556677885f5f5f5f5f 64 intel xend -0f01d5|11223344556677885f5f5f5f5f 64 plan9 XEND -0f01d6|11223344556677885f5f5f5f5f 32 intel xtest -0f01d6|11223344556677885f5f5f5f5f 32 plan9 XTEST -0f01d6|11223344556677885f5f5f5f5f 64 gnu xtest -0f01d6|11223344556677885f5f5f5f5f 64 intel xtest -0f01d6|11223344556677885f5f5f5f5f 64 plan9 XTEST -0f01f8|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f01f8|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f01f8|11223344556677885f5f5f5f5f 64 gnu swapgs -0f01f8|11223344556677885f5f5f5f5f 64 intel swapgs -0f01f8|11223344556677885f5f5f5f5f 64 plan9 SWAPGS -0f01f9|11223344556677885f5f5f5f5f 32 intel rdtscp -0f01f9|11223344556677885f5f5f5f5f 32 plan9 RDTSCP -0f01f9|11223344556677885f5f5f5f5f 64 gnu rdtscp -0f01f9|11223344556677885f5f5f5f5f 64 intel rdtscp -0f01f9|11223344556677885f5f5f5f5f 64 plan9 RDTSCP -0f0211|223344556677885f5f5f5f5f5f 32 intel lar edx, word ptr [ecx] -0f0211|223344556677885f5f5f5f5f5f 32 plan9 LAR 0(CX), DX -0f0211|223344556677885f5f5f5f5f5f 64 gnu lar (%rcx),%edx -0f0211|223344556677885f5f5f5f5f5f 64 intel lar edx, word ptr [rcx] -0f0211|223344556677885f5f5f5f5f5f 64 plan9 LAR 0(CX), DX -0f0311|223344556677885f5f5f5f5f5f 32 intel lsl edx, word ptr [ecx] -0f0311|223344556677885f5f5f5f5f5f 32 plan9 LSL 0(CX), DX -0f0311|223344556677885f5f5f5f5f5f 64 gnu lsl (%rcx),%edx -0f0311|223344556677885f5f5f5f5f5f 64 intel lsl edx, word ptr [rcx] -0f0311|223344556677885f5f5f5f5f5f 64 plan9 LSL 0(CX), DX -0f04|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f04|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f04|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f04|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f04|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f05|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f05|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f05|11223344556677885f5f5f5f5f5f 64 gnu syscall -0f05|11223344556677885f5f5f5f5f5f 64 intel syscall -0f05|11223344556677885f5f5f5f5f5f 64 plan9 SYSCALL -0f06|11223344556677885f5f5f5f5f5f 32 intel clts -0f06|11223344556677885f5f5f5f5f5f 32 plan9 CLTS -0f06|11223344556677885f5f5f5f5f5f 64 gnu clts -0f06|11223344556677885f5f5f5f5f5f 64 intel clts -0f06|11223344556677885f5f5f5f5f5f 64 plan9 CLTS -0f07|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f07|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f07|11223344556677885f5f5f5f5f5f 64 gnu sysretq -0f07|11223344556677885f5f5f5f5f5f 64 intel sysret -0f07|11223344556677885f5f5f5f5f5f 64 plan9 SYSRET -0f08|11223344556677885f5f5f5f5f5f 32 intel invd -0f08|11223344556677885f5f5f5f5f5f 32 plan9 INVD -0f08|11223344556677885f5f5f5f5f5f 64 gnu invd -0f08|11223344556677885f5f5f5f5f5f 64 intel invd -0f08|11223344556677885f5f5f5f5f5f 64 plan9 INVD -0f09|11223344556677885f5f5f5f5f5f 32 intel wbinvd -0f09|11223344556677885f5f5f5f5f5f 32 plan9 WBINVD -0f09|11223344556677885f5f5f5f5f5f 64 gnu wbinvd -0f09|11223344556677885f5f5f5f5f5f 64 intel wbinvd -0f09|11223344556677885f5f5f5f5f5f 64 plan9 WBINVD -0f0b|11223344556677885f5f5f5f5f5f 32 intel ud2 -0f0b|11223344556677885f5f5f5f5f5f 32 plan9 UD2 -0f0b|11223344556677885f5f5f5f5f5f 64 gnu ud2 -0f0b|11223344556677885f5f5f5f5f5f 64 intel ud2 -0f0b|11223344556677885f5f5f5f5f5f 64 plan9 UD2 -0f0d08|11223344556677885f5f5f5f5f 32 intel prefetchw zmmword ptr [eax] -0f0d08|11223344556677885f5f5f5f5f 32 plan9 PREFETCHW 0(AX) -0f0d08|11223344556677885f5f5f5f5f 64 gnu prefetchw (%rax) -0f0d08|11223344556677885f5f5f5f5f 64 intel prefetchw zmmword ptr [rax] -0f0d08|11223344556677885f5f5f5f5f 64 plan9 PREFETCHW 0(AX) -0f1011|223344556677885f5f5f5f5f5f 32 intel movups xmm2, xmmword ptr [ecx] -0f1011|223344556677885f5f5f5f5f5f 32 plan9 MOVUPS 0(CX), X2 -0f1011|223344556677885f5f5f5f5f5f 64 gnu movups (%rcx),%xmm2 -0f1011|223344556677885f5f5f5f5f5f 64 intel movups xmm2, xmmword ptr [rcx] -0f1011|223344556677885f5f5f5f5f5f 64 plan9 MOVUPS 0(CX), X2 -0f1122|3344556677885f5f5f5f5f5f5f 32 intel movups xmmword ptr [edx], xmm4 -0f1122|3344556677885f5f5f5f5f5f5f 32 plan9 MOVUPS X4, 0(DX) -0f1122|3344556677885f5f5f5f5f5f5f 64 gnu movups %xmm4,(%rdx) -0f1122|3344556677885f5f5f5f5f5f5f 64 intel movups xmmword ptr [rdx], xmm4 -0f1122|3344556677885f5f5f5f5f5f5f 64 plan9 MOVUPS X4, 0(DX) -0f1211|223344556677885f5f5f5f5f5f 32 intel movlps xmm2, qword ptr [ecx] -0f1211|223344556677885f5f5f5f5f5f 32 plan9 MOVLPS 0(CX), X2 -0f1211|223344556677885f5f5f5f5f5f 64 gnu movlps (%rcx),%xmm2 -0f1211|223344556677885f5f5f5f5f5f 64 intel movlps xmm2, qword ptr [rcx] -0f1211|223344556677885f5f5f5f5f5f 64 plan9 MOVLPS 0(CX), X2 -0f12c0|11223344556677885f5f5f5f5f 32 intel movhlps xmm0, xmm0 -0f12c0|11223344556677885f5f5f5f5f 32 plan9 MOVHLPS X0, X0 -0f12c0|11223344556677885f5f5f5f5f 64 gnu movhlps %xmm0,%xmm0 -0f12c0|11223344556677885f5f5f5f5f 64 intel movhlps xmm0, xmm0 -0f12c0|11223344556677885f5f5f5f5f 64 plan9 MOVHLPS X0, X0 -0f1311|223344556677885f5f5f5f5f5f 32 intel movlps qword ptr [ecx], xmm2 -0f1311|223344556677885f5f5f5f5f5f 32 plan9 MOVLPS X2, 0(CX) -0f1311|223344556677885f5f5f5f5f5f 64 gnu movlps %xmm2,(%rcx) -0f1311|223344556677885f5f5f5f5f5f 64 intel movlps qword ptr [rcx], xmm2 -0f1311|223344556677885f5f5f5f5f5f 64 plan9 MOVLPS X2, 0(CX) -0f1411|223344556677885f5f5f5f5f5f 32 intel unpcklps xmm2, xmmword ptr [ecx] -0f1411|223344556677885f5f5f5f5f5f 32 plan9 UNPCKLPS 0(CX), X2 -0f1411|223344556677885f5f5f5f5f5f 64 gnu unpcklps (%rcx),%xmm2 -0f1411|223344556677885f5f5f5f5f5f 64 intel unpcklps xmm2, xmmword ptr [rcx] -0f1411|223344556677885f5f5f5f5f5f 64 plan9 UNPCKLPS 0(CX), X2 -0f1511|223344556677885f5f5f5f5f5f 32 intel unpckhps xmm2, xmmword ptr [ecx] -0f1511|223344556677885f5f5f5f5f5f 32 plan9 UNPCKHPS 0(CX), X2 -0f1511|223344556677885f5f5f5f5f5f 64 gnu unpckhps (%rcx),%xmm2 -0f1511|223344556677885f5f5f5f5f5f 64 intel unpckhps xmm2, xmmword ptr [rcx] -0f1511|223344556677885f5f5f5f5f5f 64 plan9 UNPCKHPS 0(CX), X2 -0f1611|223344556677885f5f5f5f5f5f 32 intel movhps xmm2, qword ptr [ecx] -0f1611|223344556677885f5f5f5f5f5f 32 plan9 MOVHPS 0(CX), X2 -0f1611|223344556677885f5f5f5f5f5f 64 gnu movhps (%rcx),%xmm2 -0f1611|223344556677885f5f5f5f5f5f 64 intel movhps xmm2, qword ptr [rcx] -0f1611|223344556677885f5f5f5f5f5f 64 plan9 MOVHPS 0(CX), X2 -0f16c0|11223344556677885f5f5f5f5f 32 intel movlhps xmm0, xmm0 -0f16c0|11223344556677885f5f5f5f5f 32 plan9 MOVLHPS X0, X0 -0f16c0|11223344556677885f5f5f5f5f 64 gnu movlhps %xmm0,%xmm0 -0f16c0|11223344556677885f5f5f5f5f 64 intel movlhps xmm0, xmm0 -0f16c0|11223344556677885f5f5f5f5f 64 plan9 MOVLHPS X0, X0 -0f1711|223344556677885f5f5f5f5f5f 32 intel movhps qword ptr [ecx], xmm2 -0f1711|223344556677885f5f5f5f5f5f 32 plan9 MOVHPS X2, 0(CX) -0f1711|223344556677885f5f5f5f5f5f 64 gnu movhps %xmm2,(%rcx) -0f1711|223344556677885f5f5f5f5f5f 64 intel movhps qword ptr [rcx], xmm2 -0f1711|223344556677885f5f5f5f5f5f 64 plan9 MOVHPS X2, 0(CX) -0f1800|11223344556677885f5f5f5f5f 32 intel prefetchnta zmmword ptr [eax] -0f1800|11223344556677885f5f5f5f5f 32 plan9 PREFETCHNTA 0(AX) -0f1800|11223344556677885f5f5f5f5f 64 gnu prefetchnta (%rax) -0f1800|11223344556677885f5f5f5f5f 64 intel prefetchnta zmmword ptr [rax] -0f1800|11223344556677885f5f5f5f5f 64 plan9 PREFETCHNTA 0(AX) -0f1808|11223344556677885f5f5f5f5f 32 intel prefetcht0 zmmword ptr [eax] -0f1808|11223344556677885f5f5f5f5f 32 plan9 PREFETCHT0 0(AX) -0f1808|11223344556677885f5f5f5f5f 64 gnu prefetcht0 (%rax) -0f1808|11223344556677885f5f5f5f5f 64 intel prefetcht0 zmmword ptr [rax] -0f1808|11223344556677885f5f5f5f5f 64 plan9 PREFETCHT0 0(AX) -0f1811|223344556677885f5f5f5f5f5f 32 intel prefetcht1 zmmword ptr [ecx] -0f1811|223344556677885f5f5f5f5f5f 32 plan9 PREFETCHT1 0(CX) -0f1811|223344556677885f5f5f5f5f5f 64 gnu prefetcht1 (%rcx) -0f1811|223344556677885f5f5f5f5f5f 64 intel prefetcht1 zmmword ptr [rcx] -0f1811|223344556677885f5f5f5f5f5f 64 plan9 PREFETCHT1 0(CX) -0f1818|11223344556677885f5f5f5f5f 32 intel prefetcht2 zmmword ptr [eax] -0f1818|11223344556677885f5f5f5f5f 32 plan9 PREFETCHT2 0(AX) -0f1818|11223344556677885f5f5f5f5f 64 gnu prefetcht2 (%rax) -0f1818|11223344556677885f5f5f5f5f 64 intel prefetcht2 zmmword ptr [rax] -0f1818|11223344556677885f5f5f5f5f 64 plan9 PREFETCHT2 0(AX) -0f1f00|11223344556677885f5f5f5f5f 32 intel nop dword ptr [eax], eax -0f1f00|11223344556677885f5f5f5f5f 32 plan9 NOPL 0(AX) -0f1f00|11223344556677885f5f5f5f5f 64 gnu nopl (%rax) -0f1f00|11223344556677885f5f5f5f5f 64 intel nop dword ptr [rax], eax -0f1f00|11223344556677885f5f5f5f5f 64 plan9 NOPL 0(AX) -0f2011|223344556677885f5f5f5f5f5f 32 intel mov ecx, cr2 -0f2011|223344556677885f5f5f5f5f5f 32 plan9 MOVL CR2, CX -0f2011|223344556677885f5f5f5f5f5f 64 gnu mov %cr2,%rcx -0f2011|223344556677885f5f5f5f5f5f 64 intel mov rcx, cr2 -0f2011|223344556677885f5f5f5f5f5f 64 plan9 MOVL CR2, CX -0f2111|223344556677885f5f5f5f5f5f 32 intel mov ecx, dr2 -0f2111|223344556677885f5f5f5f5f5f 32 plan9 MOVL DR2, CX -0f2111|223344556677885f5f5f5f5f5f 64 gnu mov %db2,%rcx -0f2111|223344556677885f5f5f5f5f5f 64 intel mov rcx, dr2 -0f2111|223344556677885f5f5f5f5f5f 64 plan9 MOVL DR2, CX -0f2211|223344556677885f5f5f5f5f5f 32 intel mov cr2, ecx -0f2211|223344556677885f5f5f5f5f5f 32 plan9 MOVL CX, CR2 -0f2211|223344556677885f5f5f5f5f5f 64 gnu mov %rcx,%cr2 -0f2211|223344556677885f5f5f5f5f5f 64 intel mov cr2, rcx -0f2211|223344556677885f5f5f5f5f5f 64 plan9 MOVL CX, CR2 -0f2311|223344556677885f5f5f5f5f5f 32 intel mov dr2, ecx -0f2311|223344556677885f5f5f5f5f5f 32 plan9 MOVL CX, DR2 -0f2311|223344556677885f5f5f5f5f5f 64 gnu mov %rcx,%db2 -0f2311|223344556677885f5f5f5f5f5f 64 intel mov dr2, rcx -0f2311|223344556677885f5f5f5f5f5f 64 plan9 MOVL CX, DR2 -0f2411|223344556677885f5f5f5f5f5f 32 intel mov ecx, tr2 -0f2411|223344556677885f5f5f5f5f5f 32 plan9 MOVL TR2, CX -0f2411|223344556677885f5f5f5f5f5f 64 gnu mov %tr2,%rcx -0f2411|223344556677885f5f5f5f5f5f 64 intel mov rcx, tr2 -0f2411|223344556677885f5f5f5f5f5f 64 plan9 MOVL TR2, CX -0f2611|223344556677885f5f5f5f5f5f 32 intel mov tr2, ecx -0f2611|223344556677885f5f5f5f5f5f 32 plan9 MOVL CX, TR2 -0f2611|223344556677885f5f5f5f5f5f 64 gnu mov %rcx,%tr2 -0f2611|223344556677885f5f5f5f5f5f 64 intel mov tr2, rcx -0f2611|223344556677885f5f5f5f5f5f 64 plan9 MOVL CX, TR2 -0f2811|223344556677885f5f5f5f5f5f 32 intel movaps xmm2, xmmword ptr [ecx] -0f2811|223344556677885f5f5f5f5f5f 32 plan9 MOVAPS 0(CX), X2 -0f2811|223344556677885f5f5f5f5f5f 64 gnu movaps (%rcx),%xmm2 -0f2811|223344556677885f5f5f5f5f5f 64 intel movaps xmm2, xmmword ptr [rcx] -0f2811|223344556677885f5f5f5f5f5f 64 plan9 MOVAPS 0(CX), X2 -0f2911|223344556677885f5f5f5f5f5f 32 intel movaps xmmword ptr [ecx], xmm2 -0f2911|223344556677885f5f5f5f5f5f 32 plan9 MOVAPS X2, 0(CX) -0f2911|223344556677885f5f5f5f5f5f 64 gnu movaps %xmm2,(%rcx) -0f2911|223344556677885f5f5f5f5f5f 64 intel movaps xmmword ptr [rcx], xmm2 -0f2911|223344556677885f5f5f5f5f5f 64 plan9 MOVAPS X2, 0(CX) -0f2a11|223344556677885f5f5f5f5f5f 32 intel cvtpi2ps xmm2, qword ptr [ecx] -0f2a11|223344556677885f5f5f5f5f5f 32 plan9 CVTPI2PS 0(CX), X2 -0f2a11|223344556677885f5f5f5f5f5f 64 gnu cvtpi2ps (%rcx),%xmm2 -0f2a11|223344556677885f5f5f5f5f5f 64 intel cvtpi2ps xmm2, qword ptr [rcx] -0f2a11|223344556677885f5f5f5f5f5f 64 plan9 CVTPI2PS 0(CX), X2 -0f2b11|223344556677885f5f5f5f5f5f 32 intel movntps xmmword ptr [ecx], xmm2 -0f2b11|223344556677885f5f5f5f5f5f 32 plan9 MOVNTPS X2, 0(CX) -0f2b11|223344556677885f5f5f5f5f5f 64 gnu movntps %xmm2,(%rcx) -0f2b11|223344556677885f5f5f5f5f5f 64 intel movntps xmmword ptr [rcx], xmm2 -0f2b11|223344556677885f5f5f5f5f5f 64 plan9 MOVNTPS X2, 0(CX) -0f2c11|223344556677885f5f5f5f5f5f 32 intel cvttps2pi mmx2, qword ptr [ecx] -0f2c11|223344556677885f5f5f5f5f5f 32 plan9 CVTTPS2PI 0(CX), M2 -0f2c11|223344556677885f5f5f5f5f5f 64 gnu cvttps2pi (%rcx),%mm2 -0f2c11|223344556677885f5f5f5f5f5f 64 intel cvttps2pi mmx2, qword ptr [rcx] -0f2c11|223344556677885f5f5f5f5f5f 64 plan9 CVTTPS2PI 0(CX), M2 -0f2d11|223344556677885f5f5f5f5f5f 32 intel cvtps2pi mmx2, qword ptr [ecx] -0f2d11|223344556677885f5f5f5f5f5f 32 plan9 CVTPS2PI 0(CX), M2 -0f2d11|223344556677885f5f5f5f5f5f 64 gnu cvtps2pi (%rcx),%mm2 -0f2d11|223344556677885f5f5f5f5f5f 64 intel cvtps2pi mmx2, qword ptr [rcx] -0f2d11|223344556677885f5f5f5f5f5f 64 plan9 CVTPS2PI 0(CX), M2 -0f2e11|223344556677885f5f5f5f5f5f 32 intel ucomiss xmm2, dword ptr [ecx] -0f2e11|223344556677885f5f5f5f5f5f 32 plan9 UCOMISS 0(CX), X2 -0f2e11|223344556677885f5f5f5f5f5f 64 gnu ucomiss (%rcx),%xmm2 -0f2e11|223344556677885f5f5f5f5f5f 64 intel ucomiss xmm2, dword ptr [rcx] -0f2e11|223344556677885f5f5f5f5f5f 64 plan9 UCOMISS 0(CX), X2 -0f2f11|223344556677885f5f5f5f5f5f 32 intel comiss xmm2, dword ptr [ecx] -0f2f11|223344556677885f5f5f5f5f5f 32 plan9 COMISS 0(CX), X2 -0f2f11|223344556677885f5f5f5f5f5f 64 gnu comiss (%rcx),%xmm2 -0f2f11|223344556677885f5f5f5f5f5f 64 intel comiss xmm2, dword ptr [rcx] -0f2f11|223344556677885f5f5f5f5f5f 64 plan9 COMISS 0(CX), X2 -0f30|11223344556677885f5f5f5f5f5f 32 intel wrmsr -0f30|11223344556677885f5f5f5f5f5f 32 plan9 WRMSR -0f30|11223344556677885f5f5f5f5f5f 64 gnu wrmsr -0f30|11223344556677885f5f5f5f5f5f 64 intel wrmsr -0f30|11223344556677885f5f5f5f5f5f 64 plan9 WRMSR -0f31|11223344556677885f5f5f5f5f5f 32 intel rdtsc -0f31|11223344556677885f5f5f5f5f5f 32 plan9 RDTSC -0f31|11223344556677885f5f5f5f5f5f 64 gnu rdtsc -0f31|11223344556677885f5f5f5f5f5f 64 intel rdtsc -0f31|11223344556677885f5f5f5f5f5f 64 plan9 RDTSC -0f32|11223344556677885f5f5f5f5f5f 32 intel rdmsr -0f32|11223344556677885f5f5f5f5f5f 32 plan9 RDMSR -0f32|11223344556677885f5f5f5f5f5f 64 gnu rdmsr -0f32|11223344556677885f5f5f5f5f5f 64 intel rdmsr -0f32|11223344556677885f5f5f5f5f5f 64 plan9 RDMSR -0f33|11223344556677885f5f5f5f5f5f 32 intel rdpmc -0f33|11223344556677885f5f5f5f5f5f 32 plan9 RDPMC -0f33|11223344556677885f5f5f5f5f5f 64 gnu rdpmc -0f33|11223344556677885f5f5f5f5f5f 64 intel rdpmc -0f33|11223344556677885f5f5f5f5f5f 64 plan9 RDPMC -0f34|11223344556677885f5f5f5f5f5f 32 intel sysenter -0f34|11223344556677885f5f5f5f5f5f 32 plan9 SYSENTER -0f34|11223344556677885f5f5f5f5f5f 64 gnu sysenter -0f34|11223344556677885f5f5f5f5f5f 64 intel sysenter -0f34|11223344556677885f5f5f5f5f5f 64 plan9 SYSENTER -0f35|11223344556677885f5f5f5f5f5f 32 intel sysexit -0f35|11223344556677885f5f5f5f5f5f 32 plan9 SYSEXIT -0f35|11223344556677885f5f5f5f5f5f 64 gnu sysexit -0f35|11223344556677885f5f5f5f5f5f 64 intel sysexit -0f35|11223344556677885f5f5f5f5f5f 64 plan9 SYSEXIT -0f380011|223344556677885f5f5f5f5f 32 intel pshufb mmx2, qword ptr [ecx] -0f380011|223344556677885f5f5f5f5f 32 plan9 PSHUFB 0(CX), M2 -0f380011|223344556677885f5f5f5f5f 64 gnu pshufb (%rcx),%mm2 -0f380011|223344556677885f5f5f5f5f 64 intel pshufb mmx2, qword ptr [rcx] -0f380011|223344556677885f5f5f5f5f 64 plan9 PSHUFB 0(CX), M2 -0f380111|223344556677885f5f5f5f5f 32 intel phaddw mmx2, qword ptr [ecx] -0f380111|223344556677885f5f5f5f5f 32 plan9 PHADDW 0(CX), M2 -0f380111|223344556677885f5f5f5f5f 64 gnu phaddw (%rcx),%mm2 -0f380111|223344556677885f5f5f5f5f 64 intel phaddw mmx2, qword ptr [rcx] -0f380111|223344556677885f5f5f5f5f 64 plan9 PHADDW 0(CX), M2 -0f380211|223344556677885f5f5f5f5f 32 intel phaddd mmx2, qword ptr [ecx] -0f380211|223344556677885f5f5f5f5f 32 plan9 PHADDD 0(CX), M2 -0f380211|223344556677885f5f5f5f5f 64 gnu phaddd (%rcx),%mm2 -0f380211|223344556677885f5f5f5f5f 64 intel phaddd mmx2, qword ptr [rcx] -0f380211|223344556677885f5f5f5f5f 64 plan9 PHADDD 0(CX), M2 -0f380311|223344556677885f5f5f5f5f 32 intel phaddsw mmx2, qword ptr [ecx] -0f380311|223344556677885f5f5f5f5f 32 plan9 PHADDSW 0(CX), M2 -0f380311|223344556677885f5f5f5f5f 64 gnu phaddsw (%rcx),%mm2 -0f380311|223344556677885f5f5f5f5f 64 intel phaddsw mmx2, qword ptr [rcx] -0f380311|223344556677885f5f5f5f5f 64 plan9 PHADDSW 0(CX), M2 -0f380411|223344556677885f5f5f5f5f 32 intel pmaddubsw mmx2, qword ptr [ecx] -0f380411|223344556677885f5f5f5f5f 32 plan9 PMADDUBSW 0(CX), M2 -0f380411|223344556677885f5f5f5f5f 64 gnu pmaddubsw (%rcx),%mm2 -0f380411|223344556677885f5f5f5f5f 64 intel pmaddubsw mmx2, qword ptr [rcx] -0f380411|223344556677885f5f5f5f5f 64 plan9 PMADDUBSW 0(CX), M2 -0f380511|223344556677885f5f5f5f5f 32 intel phsubw mmx2, qword ptr [ecx] -0f380511|223344556677885f5f5f5f5f 32 plan9 PHSUBW 0(CX), M2 -0f380511|223344556677885f5f5f5f5f 64 gnu phsubw (%rcx),%mm2 -0f380511|223344556677885f5f5f5f5f 64 intel phsubw mmx2, qword ptr [rcx] -0f380511|223344556677885f5f5f5f5f 64 plan9 PHSUBW 0(CX), M2 -0f380611|223344556677885f5f5f5f5f 32 intel phsubd mmx2, qword ptr [ecx] -0f380611|223344556677885f5f5f5f5f 32 plan9 PHSUBD 0(CX), M2 -0f380611|223344556677885f5f5f5f5f 64 gnu phsubd (%rcx),%mm2 -0f380611|223344556677885f5f5f5f5f 64 intel phsubd mmx2, qword ptr [rcx] -0f380611|223344556677885f5f5f5f5f 64 plan9 PHSUBD 0(CX), M2 -0f380711|223344556677885f5f5f5f5f 32 intel phsubsw mmx2, qword ptr [ecx] -0f380711|223344556677885f5f5f5f5f 32 plan9 PHSUBSW 0(CX), M2 -0f380711|223344556677885f5f5f5f5f 64 gnu phsubsw (%rcx),%mm2 -0f380711|223344556677885f5f5f5f5f 64 intel phsubsw mmx2, qword ptr [rcx] -0f380711|223344556677885f5f5f5f5f 64 plan9 PHSUBSW 0(CX), M2 -0f380811|223344556677885f5f5f5f5f 32 intel psignb mmx2, qword ptr [ecx] -0f380811|223344556677885f5f5f5f5f 32 plan9 PSIGNB 0(CX), M2 -0f380811|223344556677885f5f5f5f5f 64 gnu psignb (%rcx),%mm2 -0f380811|223344556677885f5f5f5f5f 64 intel psignb mmx2, qword ptr [rcx] -0f380811|223344556677885f5f5f5f5f 64 plan9 PSIGNB 0(CX), M2 -0f380911|223344556677885f5f5f5f5f 32 intel psignw mmx2, qword ptr [ecx] -0f380911|223344556677885f5f5f5f5f 32 plan9 PSIGNW 0(CX), M2 -0f380911|223344556677885f5f5f5f5f 64 gnu psignw (%rcx),%mm2 -0f380911|223344556677885f5f5f5f5f 64 intel psignw mmx2, qword ptr [rcx] -0f380911|223344556677885f5f5f5f5f 64 plan9 PSIGNW 0(CX), M2 -0f380a11|223344556677885f5f5f5f5f 32 intel psignd mmx2, qword ptr [ecx] -0f380a11|223344556677885f5f5f5f5f 32 plan9 PSIGND 0(CX), M2 -0f380a11|223344556677885f5f5f5f5f 64 gnu psignd (%rcx),%mm2 -0f380a11|223344556677885f5f5f5f5f 64 intel psignd mmx2, qword ptr [rcx] -0f380a11|223344556677885f5f5f5f5f 64 plan9 PSIGND 0(CX), M2 -0f380b11|223344556677885f5f5f5f5f 32 intel pmulhrsw mmx2, qword ptr [ecx] -0f380b11|223344556677885f5f5f5f5f 32 plan9 PMULHRSW 0(CX), M2 -0f380b11|223344556677885f5f5f5f5f 64 gnu pmulhrsw (%rcx),%mm2 -0f380b11|223344556677885f5f5f5f5f 64 intel pmulhrsw mmx2, qword ptr [rcx] -0f380b11|223344556677885f5f5f5f5f 64 plan9 PMULHRSW 0(CX), M2 -0f3810|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3810|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3810|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3810|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3810|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3811|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f3811|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3811|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f3811|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f3811|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3814|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3814|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3814|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3814|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3814|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3815|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3815|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3815|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3815|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3815|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3817|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3817|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3817|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3817|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3817|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f381c11|223344556677885f5f5f5f5f 32 intel pabsb mmx2, qword ptr [ecx] -0f381c11|223344556677885f5f5f5f5f 32 plan9 PABSB 0(CX), M2 -0f381c11|223344556677885f5f5f5f5f 64 gnu pabsb (%rcx),%mm2 -0f381c11|223344556677885f5f5f5f5f 64 intel pabsb mmx2, qword ptr [rcx] -0f381c11|223344556677885f5f5f5f5f 64 plan9 PABSB 0(CX), M2 -0f381d11|223344556677885f5f5f5f5f 32 intel pabsw mmx2, qword ptr [ecx] -0f381d11|223344556677885f5f5f5f5f 32 plan9 PABSW 0(CX), M2 -0f381d11|223344556677885f5f5f5f5f 64 gnu pabsw (%rcx),%mm2 -0f381d11|223344556677885f5f5f5f5f 64 intel pabsw mmx2, qword ptr [rcx] -0f381d11|223344556677885f5f5f5f5f 64 plan9 PABSW 0(CX), M2 -0f381e11|223344556677885f5f5f5f5f 32 intel pabsd mmx2, qword ptr [ecx] -0f381e11|223344556677885f5f5f5f5f 32 plan9 PABSD 0(CX), M2 -0f381e11|223344556677885f5f5f5f5f 64 gnu pabsd (%rcx),%mm2 -0f381e11|223344556677885f5f5f5f5f 64 intel pabsd mmx2, qword ptr [rcx] -0f381e11|223344556677885f5f5f5f5f 64 plan9 PABSD 0(CX), M2 -0f3820|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3820|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3820|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3820|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3820|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3821|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3821|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3821|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3821|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3821|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3822|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3822|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3822|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3822|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3822|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3823|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3823|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3823|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3823|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3823|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3824|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3824|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3824|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3824|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3824|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3825|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3825|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3825|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3825|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3825|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3828|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3828|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3828|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3828|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3828|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3829|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3829|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3829|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3829|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3829|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f382a|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f382a|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f382a|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f382a|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f382a|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f382b|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f382b|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f382b|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f382b|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f382b|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3830|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3830|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3830|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3830|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3830|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3831|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3831|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3831|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3831|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3831|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3832|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3832|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3832|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3832|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3832|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3833|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3833|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3833|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3833|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3833|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3834|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3834|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3834|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3834|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3834|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3835|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3835|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3835|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3835|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3835|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3837|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3837|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3837|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3837|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3837|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3838|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3838|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3838|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3838|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3838|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3839|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3839|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3839|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3839|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3839|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383a|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383a|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383a|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383a|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383a|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383b|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383b|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383b|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383b|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383b|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383c|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383c|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383c|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383c|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383c|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383d|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383d|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383d|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383d|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383d|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383e|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383e|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383e|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383e|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383e|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f383f|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f383f|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f383f|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f383f|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f383f|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3840|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3840|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3840|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3840|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3840|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3841|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3841|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3841|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3841|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3841|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3882|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3882|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3882|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3882|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3882|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38db|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f38db|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f38db|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f38db|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f38db|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38dc|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f38dc|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f38dc|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f38dc|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f38dc|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38dd|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f38dd|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f38dd|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f38dd|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f38dd|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38de|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f38de|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f38de|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f38de|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f38de|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38df|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f38df|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f38df|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f38df|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f38df|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f38f011|223344556677885f5f5f5f5f 32 intel movbe edx, dword ptr [ecx] -0f38f011|223344556677885f5f5f5f5f 32 plan9 MOVBE 0(CX), DX -0f38f011|223344556677885f5f5f5f5f 64 gnu movbe (%rcx),%edx -0f38f011|223344556677885f5f5f5f5f 64 intel movbe edx, dword ptr [rcx] -0f38f011|223344556677885f5f5f5f5f 64 plan9 MOVBE 0(CX), DX -0f38f111|223344556677885f5f5f5f5f 32 intel movbe dword ptr [ecx], edx -0f38f111|223344556677885f5f5f5f5f 32 plan9 MOVBE DX, 0(CX) -0f38f111|223344556677885f5f5f5f5f 64 gnu movbe %edx,(%rcx) -0f38f111|223344556677885f5f5f5f5f 64 intel movbe dword ptr [rcx], edx -0f38f111|223344556677885f5f5f5f5f 64 plan9 MOVBE DX, 0(CX) -0f3a08|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a08|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a08|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a08|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a08|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a09|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a09|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a09|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a09|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a09|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0a|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a0a|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a0a|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a0a|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a0a|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0b|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a0b|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a0b|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a0b|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a0b|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0c|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a0c|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a0c|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a0c|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a0c|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0d|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a0d|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a0d|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a0d|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a0d|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0e|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a0e|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a0e|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a0e|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a0e|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a0f1122|3344556677885f5f5f5f5f 32 intel palignr mmx2, qword ptr [ecx], 0x22 -0f3a0f1122|3344556677885f5f5f5f5f 32 plan9 PALIGNR $0x22, 0(CX), M2 -0f3a0f1122|3344556677885f5f5f5f5f 64 gnu palignr $0x22,(%rcx),%mm2 -0f3a0f1122|3344556677885f5f5f5f5f 64 intel palignr mmx2, qword ptr [rcx], 0x22 -0f3a0f1122|3344556677885f5f5f5f5f 64 plan9 PALIGNR $0x22, 0(CX), M2 -0f3a11|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f3a11|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a11|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a11|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f3a11|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a14|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a14|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a14|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a14|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a14|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a15|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a15|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a15|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a15|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a15|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a16|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a16|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a16|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a16|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a16|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a17|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a17|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a17|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a17|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a17|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a20|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a20|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a20|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a20|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a20|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a21|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a21|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a21|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a21|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a21|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a22|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a22|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a22|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a22|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a22|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a40|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a40|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a40|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a40|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a40|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a41|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a41|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a41|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a41|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a41|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a42|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a42|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a42|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a42|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a42|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a44|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a44|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a44|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a44|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a44|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a60|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a60|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a60|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a60|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a60|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a61|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a61|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a61|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a61|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a61|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a62|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a62|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a62|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a62|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a62|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3a63|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3a63|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3a63|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3a63|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3a63|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f3adf|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f3adf|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f3adf|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f3adf|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f3adf|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f4011|223344556677885f5f5f5f5f5f 32 intel cmovo edx, dword ptr [ecx] -0f4011|223344556677885f5f5f5f5f5f 32 plan9 CMOVO 0(CX), DX -0f4011|223344556677885f5f5f5f5f5f 64 gnu cmovo (%rcx),%edx -0f4011|223344556677885f5f5f5f5f5f 64 intel cmovo edx, dword ptr [rcx] -0f4011|223344556677885f5f5f5f5f5f 64 plan9 CMOVO 0(CX), DX -0f4111|223344556677885f5f5f5f5f5f 32 intel cmovno edx, dword ptr [ecx] -0f4111|223344556677885f5f5f5f5f5f 32 plan9 CMOVNO 0(CX), DX -0f4111|223344556677885f5f5f5f5f5f 64 gnu cmovno (%rcx),%edx -0f4111|223344556677885f5f5f5f5f5f 64 intel cmovno edx, dword ptr [rcx] -0f4111|223344556677885f5f5f5f5f5f 64 plan9 CMOVNO 0(CX), DX -0f4211|223344556677885f5f5f5f5f5f 32 intel cmovb edx, dword ptr [ecx] -0f4211|223344556677885f5f5f5f5f5f 32 plan9 CMOVB 0(CX), DX -0f4211|223344556677885f5f5f5f5f5f 64 gnu cmovb (%rcx),%edx -0f4211|223344556677885f5f5f5f5f5f 64 intel cmovb edx, dword ptr [rcx] -0f4211|223344556677885f5f5f5f5f5f 64 plan9 CMOVB 0(CX), DX -0f4311|223344556677885f5f5f5f5f5f 32 intel cmovnb edx, dword ptr [ecx] -0f4311|223344556677885f5f5f5f5f5f 32 plan9 CMOVAE 0(CX), DX -0f4311|223344556677885f5f5f5f5f5f 64 gnu cmovae (%rcx),%edx -0f4311|223344556677885f5f5f5f5f5f 64 intel cmovnb edx, dword ptr [rcx] -0f4311|223344556677885f5f5f5f5f5f 64 plan9 CMOVAE 0(CX), DX -0f4411|223344556677885f5f5f5f5f5f 32 intel cmovz edx, dword ptr [ecx] -0f4411|223344556677885f5f5f5f5f5f 32 plan9 CMOVE 0(CX), DX -0f4411|223344556677885f5f5f5f5f5f 64 gnu cmove (%rcx),%edx -0f4411|223344556677885f5f5f5f5f5f 64 intel cmovz edx, dword ptr [rcx] -0f4411|223344556677885f5f5f5f5f5f 64 plan9 CMOVE 0(CX), DX -0f4511|223344556677885f5f5f5f5f5f 32 intel cmovnz edx, dword ptr [ecx] -0f4511|223344556677885f5f5f5f5f5f 32 plan9 CMOVNE 0(CX), DX -0f4511|223344556677885f5f5f5f5f5f 64 gnu cmovne (%rcx),%edx -0f4511|223344556677885f5f5f5f5f5f 64 intel cmovnz edx, dword ptr [rcx] -0f4511|223344556677885f5f5f5f5f5f 64 plan9 CMOVNE 0(CX), DX -0f4611|223344556677885f5f5f5f5f5f 32 intel cmovbe edx, dword ptr [ecx] -0f4611|223344556677885f5f5f5f5f5f 32 plan9 CMOVBE 0(CX), DX -0f4611|223344556677885f5f5f5f5f5f 64 gnu cmovbe (%rcx),%edx -0f4611|223344556677885f5f5f5f5f5f 64 intel cmovbe edx, dword ptr [rcx] -0f4611|223344556677885f5f5f5f5f5f 64 plan9 CMOVBE 0(CX), DX -0f4711|223344556677885f5f5f5f5f5f 32 intel cmovnbe edx, dword ptr [ecx] -0f4711|223344556677885f5f5f5f5f5f 32 plan9 CMOVA 0(CX), DX -0f4711|223344556677885f5f5f5f5f5f 64 gnu cmova (%rcx),%edx -0f4711|223344556677885f5f5f5f5f5f 64 intel cmovnbe edx, dword ptr [rcx] -0f4711|223344556677885f5f5f5f5f5f 64 plan9 CMOVA 0(CX), DX -0f4811|223344556677885f5f5f5f5f5f 32 intel cmovs edx, dword ptr [ecx] -0f4811|223344556677885f5f5f5f5f5f 32 plan9 CMOVS 0(CX), DX -0f4811|223344556677885f5f5f5f5f5f 64 gnu cmovs (%rcx),%edx -0f4811|223344556677885f5f5f5f5f5f 64 intel cmovs edx, dword ptr [rcx] -0f4811|223344556677885f5f5f5f5f5f 64 plan9 CMOVS 0(CX), DX -0f4911|223344556677885f5f5f5f5f5f 32 intel cmovns edx, dword ptr [ecx] -0f4911|223344556677885f5f5f5f5f5f 32 plan9 CMOVNS 0(CX), DX -0f4911|223344556677885f5f5f5f5f5f 64 gnu cmovns (%rcx),%edx -0f4911|223344556677885f5f5f5f5f5f 64 intel cmovns edx, dword ptr [rcx] -0f4911|223344556677885f5f5f5f5f5f 64 plan9 CMOVNS 0(CX), DX -0f4a11|223344556677885f5f5f5f5f5f 32 intel cmovp edx, dword ptr [ecx] -0f4a11|223344556677885f5f5f5f5f5f 32 plan9 CMOVP 0(CX), DX -0f4a11|223344556677885f5f5f5f5f5f 64 gnu cmovp (%rcx),%edx -0f4a11|223344556677885f5f5f5f5f5f 64 intel cmovp edx, dword ptr [rcx] -0f4a11|223344556677885f5f5f5f5f5f 64 plan9 CMOVP 0(CX), DX -0f4b11|223344556677885f5f5f5f5f5f 32 intel cmovnp edx, dword ptr [ecx] -0f4b11|223344556677885f5f5f5f5f5f 32 plan9 CMOVNP 0(CX), DX -0f4b11|223344556677885f5f5f5f5f5f 64 gnu cmovnp (%rcx),%edx -0f4b11|223344556677885f5f5f5f5f5f 64 intel cmovnp edx, dword ptr [rcx] -0f4b11|223344556677885f5f5f5f5f5f 64 plan9 CMOVNP 0(CX), DX -0f4c11|223344556677885f5f5f5f5f5f 32 intel cmovl edx, dword ptr [ecx] -0f4c11|223344556677885f5f5f5f5f5f 32 plan9 CMOVL 0(CX), DX -0f4c11|223344556677885f5f5f5f5f5f 64 gnu cmovl (%rcx),%edx -0f4c11|223344556677885f5f5f5f5f5f 64 intel cmovl edx, dword ptr [rcx] -0f4c11|223344556677885f5f5f5f5f5f 64 plan9 CMOVL 0(CX), DX -0f4d11|223344556677885f5f5f5f5f5f 32 intel cmovnl edx, dword ptr [ecx] -0f4d11|223344556677885f5f5f5f5f5f 32 plan9 CMOVGE 0(CX), DX -0f4d11|223344556677885f5f5f5f5f5f 64 gnu cmovge (%rcx),%edx -0f4d11|223344556677885f5f5f5f5f5f 64 intel cmovnl edx, dword ptr [rcx] -0f4d11|223344556677885f5f5f5f5f5f 64 plan9 CMOVGE 0(CX), DX -0f4e11|223344556677885f5f5f5f5f5f 32 intel cmovle edx, dword ptr [ecx] -0f4e11|223344556677885f5f5f5f5f5f 32 plan9 CMOVLE 0(CX), DX -0f4e11|223344556677885f5f5f5f5f5f 64 gnu cmovle (%rcx),%edx -0f4e11|223344556677885f5f5f5f5f5f 64 intel cmovle edx, dword ptr [rcx] -0f4e11|223344556677885f5f5f5f5f5f 64 plan9 CMOVLE 0(CX), DX -0f4f11|223344556677885f5f5f5f5f5f 32 intel cmovnle edx, dword ptr [ecx] -0f4f11|223344556677885f5f5f5f5f5f 32 plan9 CMOVG 0(CX), DX -0f4f11|223344556677885f5f5f5f5f5f 64 gnu cmovg (%rcx),%edx -0f4f11|223344556677885f5f5f5f5f5f 64 intel cmovnle edx, dword ptr [rcx] -0f4f11|223344556677885f5f5f5f5f5f 64 plan9 CMOVG 0(CX), DX -0f5011|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f5011|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f5011|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f5011|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f5011|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f50c0|11223344556677885f5f5f5f5f 32 intel movmskps eax, xmm0 -0f50c0|11223344556677885f5f5f5f5f 32 plan9 MOVMSKPS X0, AX -0f50c0|11223344556677885f5f5f5f5f 64 gnu movmskps %xmm0,%eax -0f50c0|11223344556677885f5f5f5f5f 64 intel movmskps eax, xmm0 -0f50c0|11223344556677885f5f5f5f5f 64 plan9 MOVMSKPS X0, AX -0f5111|223344556677885f5f5f5f5f5f 32 intel sqrtps xmm2, xmmword ptr [ecx] -0f5111|223344556677885f5f5f5f5f5f 32 plan9 SQRTPS 0(CX), X2 -0f5111|223344556677885f5f5f5f5f5f 64 gnu sqrtps (%rcx),%xmm2 -0f5111|223344556677885f5f5f5f5f5f 64 intel sqrtps xmm2, xmmword ptr [rcx] -0f5111|223344556677885f5f5f5f5f5f 64 plan9 SQRTPS 0(CX), X2 -0f5211|223344556677885f5f5f5f5f5f 32 intel rsqrtps xmm2, xmmword ptr [ecx] -0f5211|223344556677885f5f5f5f5f5f 32 plan9 RSQRTPS 0(CX), X2 -0f5211|223344556677885f5f5f5f5f5f 64 gnu rsqrtps (%rcx),%xmm2 -0f5211|223344556677885f5f5f5f5f5f 64 intel rsqrtps xmm2, xmmword ptr [rcx] -0f5211|223344556677885f5f5f5f5f5f 64 plan9 RSQRTPS 0(CX), X2 -0f5311|223344556677885f5f5f5f5f5f 32 intel rcpps xmm2, xmmword ptr [ecx] -0f5311|223344556677885f5f5f5f5f5f 32 plan9 RCPPS 0(CX), X2 -0f5311|223344556677885f5f5f5f5f5f 64 gnu rcpps (%rcx),%xmm2 -0f5311|223344556677885f5f5f5f5f5f 64 intel rcpps xmm2, xmmword ptr [rcx] -0f5311|223344556677885f5f5f5f5f5f 64 plan9 RCPPS 0(CX), X2 -0f5411|223344556677885f5f5f5f5f5f 32 intel andps xmm2, xmmword ptr [ecx] -0f5411|223344556677885f5f5f5f5f5f 32 plan9 ANDPS 0(CX), X2 -0f5411|223344556677885f5f5f5f5f5f 64 gnu andps (%rcx),%xmm2 -0f5411|223344556677885f5f5f5f5f5f 64 intel andps xmm2, xmmword ptr [rcx] -0f5411|223344556677885f5f5f5f5f5f 64 plan9 ANDPS 0(CX), X2 -0f5511|223344556677885f5f5f5f5f5f 32 intel andnps xmm2, xmmword ptr [ecx] -0f5511|223344556677885f5f5f5f5f5f 32 plan9 ANDNPS 0(CX), X2 -0f5511|223344556677885f5f5f5f5f5f 64 gnu andnps (%rcx),%xmm2 -0f5511|223344556677885f5f5f5f5f5f 64 intel andnps xmm2, xmmword ptr [rcx] -0f5511|223344556677885f5f5f5f5f5f 64 plan9 ANDNPS 0(CX), X2 -0f5611|223344556677885f5f5f5f5f5f 32 intel orps xmm2, xmmword ptr [ecx] -0f5611|223344556677885f5f5f5f5f5f 32 plan9 ORPS 0(CX), X2 -0f5611|223344556677885f5f5f5f5f5f 64 gnu orps (%rcx),%xmm2 -0f5611|223344556677885f5f5f5f5f5f 64 intel orps xmm2, xmmword ptr [rcx] -0f5611|223344556677885f5f5f5f5f5f 64 plan9 ORPS 0(CX), X2 -0f5711|223344556677885f5f5f5f5f5f 32 intel xorps xmm2, xmmword ptr [ecx] -0f5711|223344556677885f5f5f5f5f5f 32 plan9 XORPS 0(CX), X2 -0f5711|223344556677885f5f5f5f5f5f 64 gnu xorps (%rcx),%xmm2 -0f5711|223344556677885f5f5f5f5f5f 64 intel xorps xmm2, xmmword ptr [rcx] -0f5711|223344556677885f5f5f5f5f5f 64 plan9 XORPS 0(CX), X2 -0f5811|223344556677885f5f5f5f5f5f 32 intel addps xmm2, xmmword ptr [ecx] -0f5811|223344556677885f5f5f5f5f5f 32 plan9 ADDPS 0(CX), X2 -0f5811|223344556677885f5f5f5f5f5f 64 gnu addps (%rcx),%xmm2 -0f5811|223344556677885f5f5f5f5f5f 64 intel addps xmm2, xmmword ptr [rcx] -0f5811|223344556677885f5f5f5f5f5f 64 plan9 ADDPS 0(CX), X2 -0f5911|223344556677885f5f5f5f5f5f 32 intel mulps xmm2, xmmword ptr [ecx] -0f5911|223344556677885f5f5f5f5f5f 32 plan9 MULPS 0(CX), X2 -0f5911|223344556677885f5f5f5f5f5f 64 gnu mulps (%rcx),%xmm2 -0f5911|223344556677885f5f5f5f5f5f 64 intel mulps xmm2, xmmword ptr [rcx] -0f5911|223344556677885f5f5f5f5f5f 64 plan9 MULPS 0(CX), X2 -0f5a11|223344556677885f5f5f5f5f5f 32 intel cvtps2pd xmm2, qword ptr [ecx] -0f5a11|223344556677885f5f5f5f5f5f 32 plan9 CVTPS2PD 0(CX), X2 -0f5a11|223344556677885f5f5f5f5f5f 64 gnu cvtps2pd (%rcx),%xmm2 -0f5a11|223344556677885f5f5f5f5f5f 64 intel cvtps2pd xmm2, qword ptr [rcx] -0f5a11|223344556677885f5f5f5f5f5f 64 plan9 CVTPS2PD 0(CX), X2 -0f5b11|223344556677885f5f5f5f5f5f 32 intel cvtdq2ps xmm2, xmmword ptr [ecx] -0f5b11|223344556677885f5f5f5f5f5f 32 plan9 CVTDQ2PS 0(CX), X2 -0f5b11|223344556677885f5f5f5f5f5f 64 gnu cvtdq2ps (%rcx),%xmm2 -0f5b11|223344556677885f5f5f5f5f5f 64 intel cvtdq2ps xmm2, xmmword ptr [rcx] -0f5b11|223344556677885f5f5f5f5f5f 64 plan9 CVTDQ2PS 0(CX), X2 -0f5c11|223344556677885f5f5f5f5f5f 32 intel subps xmm2, xmmword ptr [ecx] -0f5c11|223344556677885f5f5f5f5f5f 32 plan9 SUBPS 0(CX), X2 -0f5c11|223344556677885f5f5f5f5f5f 64 gnu subps (%rcx),%xmm2 -0f5c11|223344556677885f5f5f5f5f5f 64 intel subps xmm2, xmmword ptr [rcx] -0f5c11|223344556677885f5f5f5f5f5f 64 plan9 SUBPS 0(CX), X2 -0f5d11|223344556677885f5f5f5f5f5f 32 intel minps xmm2, xmmword ptr [ecx] -0f5d11|223344556677885f5f5f5f5f5f 32 plan9 MINPS 0(CX), X2 -0f5d11|223344556677885f5f5f5f5f5f 64 gnu minps (%rcx),%xmm2 -0f5d11|223344556677885f5f5f5f5f5f 64 intel minps xmm2, xmmword ptr [rcx] -0f5d11|223344556677885f5f5f5f5f5f 64 plan9 MINPS 0(CX), X2 -0f5e11|223344556677885f5f5f5f5f5f 32 intel divps xmm2, xmmword ptr [ecx] -0f5e11|223344556677885f5f5f5f5f5f 32 plan9 DIVPS 0(CX), X2 -0f5e11|223344556677885f5f5f5f5f5f 64 gnu divps (%rcx),%xmm2 -0f5e11|223344556677885f5f5f5f5f5f 64 intel divps xmm2, xmmword ptr [rcx] -0f5e11|223344556677885f5f5f5f5f5f 64 plan9 DIVPS 0(CX), X2 -0f5f11|223344556677885f5f5f5f5f5f 32 intel maxps xmm2, xmmword ptr [ecx] -0f5f11|223344556677885f5f5f5f5f5f 32 plan9 MAXPS 0(CX), X2 -0f5f11|223344556677885f5f5f5f5f5f 64 gnu maxps (%rcx),%xmm2 -0f5f11|223344556677885f5f5f5f5f5f 64 intel maxps xmm2, xmmword ptr [rcx] -0f5f11|223344556677885f5f5f5f5f5f 64 plan9 MAXPS 0(CX), X2 -0f6011|223344556677885f5f5f5f5f5f 32 intel punpcklbw mmx2, dword ptr [ecx] -0f6011|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKLBW 0(CX), M2 -0f6011|223344556677885f5f5f5f5f5f 64 gnu punpcklbw (%rcx),%mm2 -0f6011|223344556677885f5f5f5f5f5f 64 intel punpcklbw mmx2, dword ptr [rcx] -0f6011|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKLBW 0(CX), M2 -0f6111|223344556677885f5f5f5f5f5f 32 intel punpcklwd mmx2, dword ptr [ecx] -0f6111|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKLWD 0(CX), M2 -0f6111|223344556677885f5f5f5f5f5f 64 gnu punpcklwd (%rcx),%mm2 -0f6111|223344556677885f5f5f5f5f5f 64 intel punpcklwd mmx2, dword ptr [rcx] -0f6111|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKLWD 0(CX), M2 -0f6211|223344556677885f5f5f5f5f5f 32 intel punpckldq mmx2, dword ptr [ecx] -0f6211|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKLDQ 0(CX), M2 -0f6211|223344556677885f5f5f5f5f5f 64 gnu punpckldq (%rcx),%mm2 -0f6211|223344556677885f5f5f5f5f5f 64 intel punpckldq mmx2, dword ptr [rcx] -0f6211|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKLDQ 0(CX), M2 -0f6311|223344556677885f5f5f5f5f5f 32 intel packsswb mmx2, qword ptr [ecx] -0f6311|223344556677885f5f5f5f5f5f 32 plan9 PACKSSWB 0(CX), M2 -0f6311|223344556677885f5f5f5f5f5f 64 gnu packsswb (%rcx),%mm2 -0f6311|223344556677885f5f5f5f5f5f 64 intel packsswb mmx2, qword ptr [rcx] -0f6311|223344556677885f5f5f5f5f5f 64 plan9 PACKSSWB 0(CX), M2 -0f6411|223344556677885f5f5f5f5f5f 32 intel pcmpgtb mmx2, qword ptr [ecx] -0f6411|223344556677885f5f5f5f5f5f 32 plan9 PCMPGTB 0(CX), M2 -0f6411|223344556677885f5f5f5f5f5f 64 gnu pcmpgtb (%rcx),%mm2 -0f6411|223344556677885f5f5f5f5f5f 64 intel pcmpgtb mmx2, qword ptr [rcx] -0f6411|223344556677885f5f5f5f5f5f 64 plan9 PCMPGTB 0(CX), M2 -0f6511|223344556677885f5f5f5f5f5f 32 intel pcmpgtw mmx2, qword ptr [ecx] -0f6511|223344556677885f5f5f5f5f5f 32 plan9 PCMPGTW 0(CX), M2 -0f6511|223344556677885f5f5f5f5f5f 64 gnu pcmpgtw (%rcx),%mm2 -0f6511|223344556677885f5f5f5f5f5f 64 intel pcmpgtw mmx2, qword ptr [rcx] -0f6511|223344556677885f5f5f5f5f5f 64 plan9 PCMPGTW 0(CX), M2 -0f6611|223344556677885f5f5f5f5f5f 32 intel pcmpgtd mmx2, qword ptr [ecx] -0f6611|223344556677885f5f5f5f5f5f 32 plan9 PCMPGTD 0(CX), M2 -0f6611|223344556677885f5f5f5f5f5f 64 gnu pcmpgtd (%rcx),%mm2 -0f6611|223344556677885f5f5f5f5f5f 64 intel pcmpgtd mmx2, qword ptr [rcx] -0f6611|223344556677885f5f5f5f5f5f 64 plan9 PCMPGTD 0(CX), M2 -0f6711|223344556677885f5f5f5f5f5f 32 intel packuswb mmx2, qword ptr [ecx] -0f6711|223344556677885f5f5f5f5f5f 32 plan9 PACKUSWB 0(CX), M2 -0f6711|223344556677885f5f5f5f5f5f 64 gnu packuswb (%rcx),%mm2 -0f6711|223344556677885f5f5f5f5f5f 64 intel packuswb mmx2, qword ptr [rcx] -0f6711|223344556677885f5f5f5f5f5f 64 plan9 PACKUSWB 0(CX), M2 -0f6811|223344556677885f5f5f5f5f5f 32 intel punpckhbw mmx2, qword ptr [ecx] -0f6811|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKHBW 0(CX), M2 -0f6811|223344556677885f5f5f5f5f5f 64 gnu punpckhbw (%rcx),%mm2 -0f6811|223344556677885f5f5f5f5f5f 64 intel punpckhbw mmx2, qword ptr [rcx] -0f6811|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKHBW 0(CX), M2 -0f6911|223344556677885f5f5f5f5f5f 32 intel punpckhwd mmx2, qword ptr [ecx] -0f6911|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKHWD 0(CX), M2 -0f6911|223344556677885f5f5f5f5f5f 64 gnu punpckhwd (%rcx),%mm2 -0f6911|223344556677885f5f5f5f5f5f 64 intel punpckhwd mmx2, qword ptr [rcx] -0f6911|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKHWD 0(CX), M2 -0f6a11|223344556677885f5f5f5f5f5f 32 intel punpckhdq mmx2, qword ptr [ecx] -0f6a11|223344556677885f5f5f5f5f5f 32 plan9 PUNPCKHDQ 0(CX), M2 -0f6a11|223344556677885f5f5f5f5f5f 64 gnu punpckhdq (%rcx),%mm2 -0f6a11|223344556677885f5f5f5f5f5f 64 intel punpckhdq mmx2, qword ptr [rcx] -0f6a11|223344556677885f5f5f5f5f5f 64 plan9 PUNPCKHDQ 0(CX), M2 -0f6b11|223344556677885f5f5f5f5f5f 32 intel packssdw mmx2, qword ptr [ecx] -0f6b11|223344556677885f5f5f5f5f5f 32 plan9 PACKSSDW 0(CX), M2 -0f6b11|223344556677885f5f5f5f5f5f 64 gnu packssdw (%rcx),%mm2 -0f6b11|223344556677885f5f5f5f5f5f 64 intel packssdw mmx2, qword ptr [rcx] -0f6b11|223344556677885f5f5f5f5f5f 64 plan9 PACKSSDW 0(CX), M2 -0f6c|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f6c|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f6c|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f6c|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f6c|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f6d|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f6d|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f6d|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f6d|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f6d|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f6e11|223344556677885f5f5f5f5f5f 32 intel movd mmx2, dword ptr [ecx] -0f6e11|223344556677885f5f5f5f5f5f 32 plan9 MOVD 0(CX), M2 -0f6e11|223344556677885f5f5f5f5f5f 64 gnu movd (%rcx),%mm2 -0f6e11|223344556677885f5f5f5f5f5f 64 intel movd mmx2, dword ptr [rcx] -0f6e11|223344556677885f5f5f5f5f5f 64 plan9 MOVD 0(CX), M2 -0f6f11|223344556677885f5f5f5f5f5f 32 intel movq mmx2, qword ptr [ecx] -0f6f11|223344556677885f5f5f5f5f5f 32 plan9 MOVQ 0(CX), M2 -0f6f11|223344556677885f5f5f5f5f5f 64 gnu movq (%rcx),%mm2 -0f6f11|223344556677885f5f5f5f5f5f 64 intel movq mmx2, qword ptr [rcx] -0f6f11|223344556677885f5f5f5f5f5f 64 plan9 MOVQ 0(CX), M2 -0f701122|3344556677885f5f5f5f5f5f 32 intel pshufw mmx2, qword ptr [ecx], 0x22 -0f701122|3344556677885f5f5f5f5f5f 32 plan9 PSHUFW $0x22, 0(CX), M2 -0f701122|3344556677885f5f5f5f5f5f 64 gnu pshufw $0x22,(%rcx),%mm2 -0f701122|3344556677885f5f5f5f5f5f 64 intel pshufw mmx2, qword ptr [rcx], 0x22 -0f701122|3344556677885f5f5f5f5f5f 64 plan9 PSHUFW $0x22, 0(CX), M2 -0f7100|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f7100|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7100|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f7100|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f7100|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f711122|3344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f711122|3344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f711122|3344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f711122|3344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f711122|3344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f712011|223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f712011|223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f712011|223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f712011|223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f712011|223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f713011|223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f713011|223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f713011|223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f713011|223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f713011|223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f71d011|223344556677885f5f5f5f5f 32 intel psrlw mmx0, 0x11 -0f71d011|223344556677885f5f5f5f5f 32 plan9 PSRLW $0x11, M0 -0f71d011|223344556677885f5f5f5f5f 64 gnu psrlw $0x11,%mm0 -0f71d011|223344556677885f5f5f5f5f 64 intel psrlw mmx0, 0x11 -0f71d011|223344556677885f5f5f5f5f 64 plan9 PSRLW $0x11, M0 -0f71e011|223344556677885f5f5f5f5f 32 intel psraw mmx0, 0x11 -0f71e011|223344556677885f5f5f5f5f 32 plan9 PSRAW $0x11, M0 -0f71e011|223344556677885f5f5f5f5f 64 gnu psraw $0x11,%mm0 -0f71e011|223344556677885f5f5f5f5f 64 intel psraw mmx0, 0x11 -0f71e011|223344556677885f5f5f5f5f 64 plan9 PSRAW $0x11, M0 -0f71f011|223344556677885f5f5f5f5f 32 intel psllw mmx0, 0x11 -0f71f011|223344556677885f5f5f5f5f 32 plan9 PSLLW $0x11, M0 -0f71f011|223344556677885f5f5f5f5f 64 gnu psllw $0x11,%mm0 -0f71f011|223344556677885f5f5f5f5f 64 intel psllw mmx0, 0x11 -0f71f011|223344556677885f5f5f5f5f 64 plan9 PSLLW $0x11, M0 -0f7200|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f7200|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7200|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f7200|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f7200|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f721122|3344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f721122|3344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f721122|3344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f721122|3344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f721122|3344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f722011|223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f722011|223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f722011|223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f722011|223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f722011|223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f723011|223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f723011|223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f723011|223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f723011|223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f723011|223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f72d011|223344556677885f5f5f5f5f 32 intel psrld mmx0, 0x11 -0f72d011|223344556677885f5f5f5f5f 32 plan9 PSRLD $0x11, M0 -0f72d011|223344556677885f5f5f5f5f 64 gnu psrld $0x11,%mm0 -0f72d011|223344556677885f5f5f5f5f 64 intel psrld mmx0, 0x11 -0f72d011|223344556677885f5f5f5f5f 64 plan9 PSRLD $0x11, M0 -0f72e011|223344556677885f5f5f5f5f 32 intel psrad mmx0, 0x11 -0f72e011|223344556677885f5f5f5f5f 32 plan9 PSRAD $0x11, M0 -0f72e011|223344556677885f5f5f5f5f 64 gnu psrad $0x11,%mm0 -0f72e011|223344556677885f5f5f5f5f 64 intel psrad mmx0, 0x11 -0f72e011|223344556677885f5f5f5f5f 64 plan9 PSRAD $0x11, M0 -0f72f011|223344556677885f5f5f5f5f 32 intel pslld mmx0, 0x11 -0f72f011|223344556677885f5f5f5f5f 32 plan9 PSLLD $0x11, M0 -0f72f011|223344556677885f5f5f5f5f 64 gnu pslld $0x11,%mm0 -0f72f011|223344556677885f5f5f5f5f 64 intel pslld mmx0, 0x11 -0f72f011|223344556677885f5f5f5f5f 64 plan9 PSLLD $0x11, M0 -0f7300|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f7300|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7300|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f7300|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f7300|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f731122|3344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f731122|3344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f731122|3344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f731122|3344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f731122|3344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f7318|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f7318|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7318|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f7318|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f7318|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f733011|223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f733011|223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f733011|223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f733011|223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f733011|223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f7338|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0f7338|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7338|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0f7338|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0f7338|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0f73d011|223344556677885f5f5f5f5f 32 intel psrlq mmx0, 0x11 -0f73d011|223344556677885f5f5f5f5f 32 plan9 PSRLQ $0x11, M0 -0f73d011|223344556677885f5f5f5f5f 64 gnu psrlq $0x11,%mm0 -0f73d011|223344556677885f5f5f5f5f 64 intel psrlq mmx0, 0x11 -0f73d011|223344556677885f5f5f5f5f 64 plan9 PSRLQ $0x11, M0 -0f73f011|223344556677885f5f5f5f5f 32 intel psllq mmx0, 0x11 -0f73f011|223344556677885f5f5f5f5f 32 plan9 PSLLQ $0x11, M0 -0f73f011|223344556677885f5f5f5f5f 64 gnu psllq $0x11,%mm0 -0f73f011|223344556677885f5f5f5f5f 64 intel psllq mmx0, 0x11 -0f73f011|223344556677885f5f5f5f5f 64 plan9 PSLLQ $0x11, M0 -0f7411|223344556677885f5f5f5f5f5f 32 intel pcmpeqb mmx2, qword ptr [ecx] -0f7411|223344556677885f5f5f5f5f5f 32 plan9 PCMPEQB 0(CX), M2 -0f7411|223344556677885f5f5f5f5f5f 64 gnu pcmpeqb (%rcx),%mm2 -0f7411|223344556677885f5f5f5f5f5f 64 intel pcmpeqb mmx2, qword ptr [rcx] -0f7411|223344556677885f5f5f5f5f5f 64 plan9 PCMPEQB 0(CX), M2 -0f7511|223344556677885f5f5f5f5f5f 32 intel pcmpeqw mmx2, qword ptr [ecx] -0f7511|223344556677885f5f5f5f5f5f 32 plan9 PCMPEQW 0(CX), M2 -0f7511|223344556677885f5f5f5f5f5f 64 gnu pcmpeqw (%rcx),%mm2 -0f7511|223344556677885f5f5f5f5f5f 64 intel pcmpeqw mmx2, qword ptr [rcx] -0f7511|223344556677885f5f5f5f5f5f 64 plan9 PCMPEQW 0(CX), M2 -0f7611|223344556677885f5f5f5f5f5f 32 intel pcmpeqd mmx2, qword ptr [ecx] -0f7611|223344556677885f5f5f5f5f5f 32 plan9 PCMPEQD 0(CX), M2 -0f7611|223344556677885f5f5f5f5f5f 64 gnu pcmpeqd (%rcx),%mm2 -0f7611|223344556677885f5f5f5f5f5f 64 intel pcmpeqd mmx2, qword ptr [rcx] -0f7611|223344556677885f5f5f5f5f5f 64 plan9 PCMPEQD 0(CX), M2 -0f77|11223344556677885f5f5f5f5f5f 32 intel emms -0f77|11223344556677885f5f5f5f5f5f 32 plan9 EMMS -0f77|11223344556677885f5f5f5f5f5f 64 gnu emms -0f77|11223344556677885f5f5f5f5f5f 64 intel emms -0f77|11223344556677885f5f5f5f5f5f 64 plan9 EMMS -0f7c|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f7c|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7c|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f7c|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f7c|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f7d|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0f7d|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0f7d|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0f7d|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0f7d|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0f7e11|223344556677885f5f5f5f5f5f 32 intel movd dword ptr [ecx], mmx2 -0f7e11|223344556677885f5f5f5f5f5f 32 plan9 MOVD M2, 0(CX) -0f7e11|223344556677885f5f5f5f5f5f 64 gnu movd %mm2,(%rcx) -0f7e11|223344556677885f5f5f5f5f5f 64 intel movd dword ptr [rcx], mmx2 -0f7e11|223344556677885f5f5f5f5f5f 64 plan9 MOVD M2, 0(CX) -0f7f11|223344556677885f5f5f5f5f5f 32 intel movq qword ptr [ecx], mmx2 -0f7f11|223344556677885f5f5f5f5f5f 32 plan9 MOVQ M2, 0(CX) -0f7f11|223344556677885f5f5f5f5f5f 64 gnu movq %mm2,(%rcx) -0f7f11|223344556677885f5f5f5f5f5f 64 intel movq qword ptr [rcx], mmx2 -0f7f11|223344556677885f5f5f5f5f5f 64 plan9 MOVQ M2, 0(CX) -0f8011223344|556677885f5f5f5f5f5f 32 intel jo .+0x44332211 -0f8011223344|556677885f5f5f5f5f5f 32 plan9 JO .+1144201745 -0f8011223344|556677885f5f5f5f5f5f 64 gnu jo .+0x44332211 -0f8011223344|556677885f5f5f5f5f5f 64 intel jo .+0x44332211 -0f8011223344|556677885f5f5f5f5f5f 64 plan9 JO .+1144201745 -0f8111223344|556677885f5f5f5f5f5f 32 intel jno .+0x44332211 -0f8111223344|556677885f5f5f5f5f5f 32 plan9 JNO .+1144201745 -0f8111223344|556677885f5f5f5f5f5f 64 gnu jno .+0x44332211 -0f8111223344|556677885f5f5f5f5f5f 64 intel jno .+0x44332211 -0f8111223344|556677885f5f5f5f5f5f 64 plan9 JNO .+1144201745 -0f8211223344|556677885f5f5f5f5f5f 32 intel jb .+0x44332211 -0f8211223344|556677885f5f5f5f5f5f 32 plan9 JB .+1144201745 -0f8211223344|556677885f5f5f5f5f5f 64 gnu jb .+0x44332211 -0f8211223344|556677885f5f5f5f5f5f 64 intel jb .+0x44332211 -0f8211223344|556677885f5f5f5f5f5f 64 plan9 JB .+1144201745 -0f8311223344|556677885f5f5f5f5f5f 32 intel jnb .+0x44332211 -0f8311223344|556677885f5f5f5f5f5f 32 plan9 JAE .+1144201745 -0f8311223344|556677885f5f5f5f5f5f 64 gnu jae .+0x44332211 -0f8311223344|556677885f5f5f5f5f5f 64 intel jnb .+0x44332211 -0f8311223344|556677885f5f5f5f5f5f 64 plan9 JAE .+1144201745 -0f8411223344|556677885f5f5f5f5f5f 32 intel jz .+0x44332211 -0f8411223344|556677885f5f5f5f5f5f 32 plan9 JE .+1144201745 -0f8411223344|556677885f5f5f5f5f5f 64 gnu je .+0x44332211 -0f8411223344|556677885f5f5f5f5f5f 64 intel jz .+0x44332211 -0f8411223344|556677885f5f5f5f5f5f 64 plan9 JE .+1144201745 -0f8511223344|556677885f5f5f5f5f5f 32 intel jnz .+0x44332211 -0f8511223344|556677885f5f5f5f5f5f 32 plan9 JNE .+1144201745 -0f8511223344|556677885f5f5f5f5f5f 64 gnu jne .+0x44332211 -0f8511223344|556677885f5f5f5f5f5f 64 intel jnz .+0x44332211 -0f8511223344|556677885f5f5f5f5f5f 64 plan9 JNE .+1144201745 -0f8611223344|556677885f5f5f5f5f5f 32 intel jbe .+0x44332211 -0f8611223344|556677885f5f5f5f5f5f 32 plan9 JBE .+1144201745 -0f8611223344|556677885f5f5f5f5f5f 64 gnu jbe .+0x44332211 -0f8611223344|556677885f5f5f5f5f5f 64 intel jbe .+0x44332211 -0f8611223344|556677885f5f5f5f5f5f 64 plan9 JBE .+1144201745 -0f8711223344|556677885f5f5f5f5f5f 32 intel jnbe .+0x44332211 -0f8711223344|556677885f5f5f5f5f5f 32 plan9 JA .+1144201745 -0f8711223344|556677885f5f5f5f5f5f 64 gnu ja .+0x44332211 -0f8711223344|556677885f5f5f5f5f5f 64 intel jnbe .+0x44332211 -0f8711223344|556677885f5f5f5f5f5f 64 plan9 JA .+1144201745 -0f8811223344|556677885f5f5f5f5f5f 32 intel js .+0x44332211 -0f8811223344|556677885f5f5f5f5f5f 32 plan9 JS .+1144201745 -0f8811223344|556677885f5f5f5f5f5f 64 gnu js .+0x44332211 -0f8811223344|556677885f5f5f5f5f5f 64 intel js .+0x44332211 -0f8811223344|556677885f5f5f5f5f5f 64 plan9 JS .+1144201745 -0f8911223344|556677885f5f5f5f5f5f 32 intel jns .+0x44332211 -0f8911223344|556677885f5f5f5f5f5f 32 plan9 JNS .+1144201745 -0f8911223344|556677885f5f5f5f5f5f 64 gnu jns .+0x44332211 -0f8911223344|556677885f5f5f5f5f5f 64 intel jns .+0x44332211 -0f8911223344|556677885f5f5f5f5f5f 64 plan9 JNS .+1144201745 -0f8a11223344|556677885f5f5f5f5f5f 32 intel jp .+0x44332211 -0f8a11223344|556677885f5f5f5f5f5f 32 plan9 JP .+1144201745 -0f8a11223344|556677885f5f5f5f5f5f 64 gnu jp .+0x44332211 -0f8a11223344|556677885f5f5f5f5f5f 64 intel jp .+0x44332211 -0f8a11223344|556677885f5f5f5f5f5f 64 plan9 JP .+1144201745 -0f8b11223344|556677885f5f5f5f5f5f 32 intel jnp .+0x44332211 -0f8b11223344|556677885f5f5f5f5f5f 32 plan9 JNP .+1144201745 -0f8b11223344|556677885f5f5f5f5f5f 64 gnu jnp .+0x44332211 -0f8b11223344|556677885f5f5f5f5f5f 64 intel jnp .+0x44332211 -0f8b11223344|556677885f5f5f5f5f5f 64 plan9 JNP .+1144201745 -0f8c11223344|556677885f5f5f5f5f5f 32 intel jl .+0x44332211 -0f8c11223344|556677885f5f5f5f5f5f 32 plan9 JL .+1144201745 -0f8c11223344|556677885f5f5f5f5f5f 64 gnu jl .+0x44332211 -0f8c11223344|556677885f5f5f5f5f5f 64 intel jl .+0x44332211 -0f8c11223344|556677885f5f5f5f5f5f 64 plan9 JL .+1144201745 -0f8d11223344|556677885f5f5f5f5f5f 32 intel jnl .+0x44332211 -0f8d11223344|556677885f5f5f5f5f5f 32 plan9 JGE .+1144201745 -0f8d11223344|556677885f5f5f5f5f5f 64 gnu jge .+0x44332211 -0f8d11223344|556677885f5f5f5f5f5f 64 intel jnl .+0x44332211 -0f8d11223344|556677885f5f5f5f5f5f 64 plan9 JGE .+1144201745 -0f8e11223344|556677885f5f5f5f5f5f 32 intel jle .+0x44332211 -0f8e11223344|556677885f5f5f5f5f5f 32 plan9 JLE .+1144201745 -0f8e11223344|556677885f5f5f5f5f5f 64 gnu jle .+0x44332211 -0f8e11223344|556677885f5f5f5f5f5f 64 intel jle .+0x44332211 -0f8e11223344|556677885f5f5f5f5f5f 64 plan9 JLE .+1144201745 -0f8f11223344|556677885f5f5f5f5f5f 32 intel jnle .+0x44332211 -0f8f11223344|556677885f5f5f5f5f5f 32 plan9 JG .+1144201745 -0f8f11223344|556677885f5f5f5f5f5f 64 gnu jg .+0x44332211 -0f8f11223344|556677885f5f5f5f5f5f 64 intel jnle .+0x44332211 -0f8f11223344|556677885f5f5f5f5f5f 64 plan9 JG .+1144201745 -0f9011|223344556677885f5f5f5f5f5f 32 intel seto byte ptr [ecx] -0f9011|223344556677885f5f5f5f5f5f 32 plan9 SETO 0(CX) -0f9011|223344556677885f5f5f5f5f5f 64 gnu seto (%rcx) -0f9011|223344556677885f5f5f5f5f5f 64 intel seto byte ptr [rcx] -0f9011|223344556677885f5f5f5f5f5f 64 plan9 SETO 0(CX) -0f9111|223344556677885f5f5f5f5f5f 32 intel setno byte ptr [ecx] -0f9111|223344556677885f5f5f5f5f5f 32 plan9 SETNO 0(CX) -0f9111|223344556677885f5f5f5f5f5f 64 gnu setno (%rcx) -0f9111|223344556677885f5f5f5f5f5f 64 intel setno byte ptr [rcx] -0f9111|223344556677885f5f5f5f5f5f 64 plan9 SETNO 0(CX) -0f9211|223344556677885f5f5f5f5f5f 32 intel setb byte ptr [ecx] -0f9211|223344556677885f5f5f5f5f5f 32 plan9 SETB 0(CX) -0f9211|223344556677885f5f5f5f5f5f 64 gnu setb (%rcx) -0f9211|223344556677885f5f5f5f5f5f 64 intel setb byte ptr [rcx] -0f9211|223344556677885f5f5f5f5f5f 64 plan9 SETB 0(CX) -0f9311|223344556677885f5f5f5f5f5f 32 intel setnb byte ptr [ecx] -0f9311|223344556677885f5f5f5f5f5f 32 plan9 SETAE 0(CX) -0f9311|223344556677885f5f5f5f5f5f 64 gnu setae (%rcx) -0f9311|223344556677885f5f5f5f5f5f 64 intel setnb byte ptr [rcx] -0f9311|223344556677885f5f5f5f5f5f 64 plan9 SETAE 0(CX) -0f9411|223344556677885f5f5f5f5f5f 32 intel setz byte ptr [ecx] -0f9411|223344556677885f5f5f5f5f5f 32 plan9 SETE 0(CX) -0f9411|223344556677885f5f5f5f5f5f 64 gnu sete (%rcx) -0f9411|223344556677885f5f5f5f5f5f 64 intel setz byte ptr [rcx] -0f9411|223344556677885f5f5f5f5f5f 64 plan9 SETE 0(CX) -0f9511|223344556677885f5f5f5f5f5f 32 intel setnz byte ptr [ecx] -0f9511|223344556677885f5f5f5f5f5f 32 plan9 SETNE 0(CX) -0f9511|223344556677885f5f5f5f5f5f 64 gnu setne (%rcx) -0f9511|223344556677885f5f5f5f5f5f 64 intel setnz byte ptr [rcx] -0f9511|223344556677885f5f5f5f5f5f 64 plan9 SETNE 0(CX) -0f9611|223344556677885f5f5f5f5f5f 32 intel setbe byte ptr [ecx] -0f9611|223344556677885f5f5f5f5f5f 32 plan9 SETBE 0(CX) -0f9611|223344556677885f5f5f5f5f5f 64 gnu setbe (%rcx) -0f9611|223344556677885f5f5f5f5f5f 64 intel setbe byte ptr [rcx] -0f9611|223344556677885f5f5f5f5f5f 64 plan9 SETBE 0(CX) -0f9711|223344556677885f5f5f5f5f5f 32 intel setnbe byte ptr [ecx] -0f9711|223344556677885f5f5f5f5f5f 32 plan9 SETA 0(CX) -0f9711|223344556677885f5f5f5f5f5f 64 gnu seta (%rcx) -0f9711|223344556677885f5f5f5f5f5f 64 intel setnbe byte ptr [rcx] -0f9711|223344556677885f5f5f5f5f5f 64 plan9 SETA 0(CX) -0f9811|223344556677885f5f5f5f5f5f 32 intel sets byte ptr [ecx] -0f9811|223344556677885f5f5f5f5f5f 32 plan9 SETS 0(CX) -0f9811|223344556677885f5f5f5f5f5f 64 gnu sets (%rcx) -0f9811|223344556677885f5f5f5f5f5f 64 intel sets byte ptr [rcx] -0f9811|223344556677885f5f5f5f5f5f 64 plan9 SETS 0(CX) -0f9911|223344556677885f5f5f5f5f5f 32 intel setns byte ptr [ecx] -0f9911|223344556677885f5f5f5f5f5f 32 plan9 SETNS 0(CX) -0f9911|223344556677885f5f5f5f5f5f 64 gnu setns (%rcx) -0f9911|223344556677885f5f5f5f5f5f 64 intel setns byte ptr [rcx] -0f9911|223344556677885f5f5f5f5f5f 64 plan9 SETNS 0(CX) -0f9a11|223344556677885f5f5f5f5f5f 32 intel setp byte ptr [ecx] -0f9a11|223344556677885f5f5f5f5f5f 32 plan9 SETP 0(CX) -0f9a11|223344556677885f5f5f5f5f5f 64 gnu setp (%rcx) -0f9a11|223344556677885f5f5f5f5f5f 64 intel setp byte ptr [rcx] -0f9a11|223344556677885f5f5f5f5f5f 64 plan9 SETP 0(CX) -0f9b11|223344556677885f5f5f5f5f5f 32 intel setnp byte ptr [ecx] -0f9b11|223344556677885f5f5f5f5f5f 32 plan9 SETNP 0(CX) -0f9b11|223344556677885f5f5f5f5f5f 64 gnu setnp (%rcx) -0f9b11|223344556677885f5f5f5f5f5f 64 intel setnp byte ptr [rcx] -0f9b11|223344556677885f5f5f5f5f5f 64 plan9 SETNP 0(CX) -0f9c11|223344556677885f5f5f5f5f5f 32 intel setl byte ptr [ecx] -0f9c11|223344556677885f5f5f5f5f5f 32 plan9 SETL 0(CX) -0f9c11|223344556677885f5f5f5f5f5f 64 gnu setl (%rcx) -0f9c11|223344556677885f5f5f5f5f5f 64 intel setl byte ptr [rcx] -0f9c11|223344556677885f5f5f5f5f5f 64 plan9 SETL 0(CX) -0f9d11|223344556677885f5f5f5f5f5f 32 intel setnl byte ptr [ecx] -0f9d11|223344556677885f5f5f5f5f5f 32 plan9 SETGE 0(CX) -0f9d11|223344556677885f5f5f5f5f5f 64 gnu setge (%rcx) -0f9d11|223344556677885f5f5f5f5f5f 64 intel setnl byte ptr [rcx] -0f9d11|223344556677885f5f5f5f5f5f 64 plan9 SETGE 0(CX) -0f9e11|223344556677885f5f5f5f5f5f 32 intel setle byte ptr [ecx] -0f9e11|223344556677885f5f5f5f5f5f 32 plan9 SETLE 0(CX) -0f9e11|223344556677885f5f5f5f5f5f 64 gnu setle (%rcx) -0f9e11|223344556677885f5f5f5f5f5f 64 intel setle byte ptr [rcx] -0f9e11|223344556677885f5f5f5f5f5f 64 plan9 SETLE 0(CX) -0f9f11|223344556677885f5f5f5f5f5f 32 intel setnle byte ptr [ecx] -0f9f11|223344556677885f5f5f5f5f5f 32 plan9 SETG 0(CX) -0f9f11|223344556677885f5f5f5f5f5f 64 gnu setg (%rcx) -0f9f11|223344556677885f5f5f5f5f5f 64 intel setnle byte ptr [rcx] -0f9f11|223344556677885f5f5f5f5f5f 64 plan9 SETG 0(CX) -0fa0|11223344556677885f5f5f5f5f5f 32 intel push fs -0fa0|11223344556677885f5f5f5f5f5f 32 plan9 PUSHL FS -0fa0|11223344556677885f5f5f5f5f5f 64 gnu pushq %fs -0fa0|11223344556677885f5f5f5f5f5f 64 intel push fs -0fa0|11223344556677885f5f5f5f5f5f 64 plan9 PUSHL FS -0fa1|11223344556677885f5f5f5f5f5f 32 intel pop fs -0fa1|11223344556677885f5f5f5f5f5f 32 plan9 POPL FS -0fa1|11223344556677885f5f5f5f5f5f 64 gnu popq %fs -0fa1|11223344556677885f5f5f5f5f5f 64 intel pop fs -0fa1|11223344556677885f5f5f5f5f5f 64 plan9 POPL FS -0fa2|11223344556677885f5f5f5f5f5f 32 intel cpuid -0fa2|11223344556677885f5f5f5f5f5f 32 plan9 CPUID -0fa2|11223344556677885f5f5f5f5f5f 64 gnu cpuid -0fa2|11223344556677885f5f5f5f5f5f 64 intel cpuid -0fa2|11223344556677885f5f5f5f5f5f 64 plan9 CPUID -0fa311|223344556677885f5f5f5f5f5f 32 intel bt dword ptr [ecx], edx -0fa311|223344556677885f5f5f5f5f5f 32 plan9 BTL DX, 0(CX) -0fa311|223344556677885f5f5f5f5f5f 64 gnu bt %edx,(%rcx) -0fa311|223344556677885f5f5f5f5f5f 64 intel bt dword ptr [rcx], edx -0fa311|223344556677885f5f5f5f5f5f 64 plan9 BTL DX, 0(CX) -0fa41122|3344556677885f5f5f5f5f5f 32 intel shld dword ptr [ecx], edx, 0x22 -0fa41122|3344556677885f5f5f5f5f5f 32 plan9 SHLDL $0x22, DX, 0(CX) -0fa41122|3344556677885f5f5f5f5f5f 64 gnu shld $0x22,%edx,(%rcx) -0fa41122|3344556677885f5f5f5f5f5f 64 intel shld dword ptr [rcx], edx, 0x22 -0fa41122|3344556677885f5f5f5f5f5f 64 plan9 SHLDL $0x22, DX, 0(CX) -0fa511|223344556677885f5f5f5f5f5f 32 intel shld dword ptr [ecx], edx, cl -0fa511|223344556677885f5f5f5f5f5f 32 plan9 SHLDL CL, DX, 0(CX) -0fa511|223344556677885f5f5f5f5f5f 64 gnu shld %cl,%edx,(%rcx) -0fa511|223344556677885f5f5f5f5f5f 64 intel shld dword ptr [rcx], edx, cl -0fa511|223344556677885f5f5f5f5f5f 64 plan9 SHLDL CL, DX, 0(CX) -0fa8|11223344556677885f5f5f5f5f5f 32 intel push gs -0fa8|11223344556677885f5f5f5f5f5f 32 plan9 PUSHL GS -0fa8|11223344556677885f5f5f5f5f5f 64 gnu pushq %gs -0fa8|11223344556677885f5f5f5f5f5f 64 intel push gs -0fa8|11223344556677885f5f5f5f5f5f 64 plan9 PUSHL GS -0fa9|11223344556677885f5f5f5f5f5f 32 intel pop gs -0fa9|11223344556677885f5f5f5f5f5f 32 plan9 POPL GS -0fa9|11223344556677885f5f5f5f5f5f 64 gnu popq %gs -0fa9|11223344556677885f5f5f5f5f5f 64 intel pop gs -0fa9|11223344556677885f5f5f5f5f5f 64 plan9 POPL GS -0faa|11223344556677885f5f5f5f5f5f 32 intel rsm -0faa|11223344556677885f5f5f5f5f5f 32 plan9 RSM -0faa|11223344556677885f5f5f5f5f5f 64 gnu rsm -0faa|11223344556677885f5f5f5f5f5f 64 intel rsm -0faa|11223344556677885f5f5f5f5f5f 64 plan9 RSM -0fab11|223344556677885f5f5f5f5f5f 32 intel bts dword ptr [ecx], edx -0fab11|223344556677885f5f5f5f5f5f 32 plan9 BTSL DX, 0(CX) -0fab11|223344556677885f5f5f5f5f5f 64 gnu bts %edx,(%rcx) -0fab11|223344556677885f5f5f5f5f5f 64 intel bts dword ptr [rcx], edx -0fab11|223344556677885f5f5f5f5f5f 64 plan9 BTSL DX, 0(CX) -0fac1122|3344556677885f5f5f5f5f5f 32 intel shrd dword ptr [ecx], edx, 0x22 -0fac1122|3344556677885f5f5f5f5f5f 32 plan9 SHRDL $0x22, DX, 0(CX) -0fac1122|3344556677885f5f5f5f5f5f 64 gnu shrd $0x22,%edx,(%rcx) -0fac1122|3344556677885f5f5f5f5f5f 64 intel shrd dword ptr [rcx], edx, 0x22 -0fac1122|3344556677885f5f5f5f5f5f 64 plan9 SHRDL $0x22, DX, 0(CX) -0fad11|223344556677885f5f5f5f5f5f 32 intel shrd dword ptr [ecx], edx, cl -0fad11|223344556677885f5f5f5f5f5f 32 plan9 SHRDL CL, DX, 0(CX) -0fad11|223344556677885f5f5f5f5f5f 64 gnu shrd %cl,%edx,(%rcx) -0fad11|223344556677885f5f5f5f5f5f 64 intel shrd dword ptr [rcx], edx, cl -0fad11|223344556677885f5f5f5f5f5f 64 plan9 SHRDL CL, DX, 0(CX) -0fae00|11223344556677885f5f5f5f5f 32 intel fxsave ptr [eax] -0fae00|11223344556677885f5f5f5f5f 32 plan9 FXSAVE 0(AX) -0fae00|11223344556677885f5f5f5f5f 64 gnu fxsave (%rax) -0fae00|11223344556677885f5f5f5f5f 64 intel fxsave ptr [rax] -0fae00|11223344556677885f5f5f5f5f 64 plan9 FXSAVE 0(AX) -0fae08|11223344556677885f5f5f5f5f 32 intel fxrstor ptr [eax] -0fae08|11223344556677885f5f5f5f5f 32 plan9 FXRSTOR 0(AX) -0fae08|11223344556677885f5f5f5f5f 64 gnu fxrstor (%rax) -0fae08|11223344556677885f5f5f5f5f 64 intel fxrstor ptr [rax] -0fae08|11223344556677885f5f5f5f5f 64 plan9 FXRSTOR 0(AX) -0fae11|223344556677885f5f5f5f5f5f 32 intel ldmxcsr dword ptr [ecx] -0fae11|223344556677885f5f5f5f5f5f 32 plan9 LDMXCSR 0(CX) -0fae11|223344556677885f5f5f5f5f5f 64 gnu ldmxcsr (%rcx) -0fae11|223344556677885f5f5f5f5f5f 64 intel ldmxcsr dword ptr [rcx] -0fae11|223344556677885f5f5f5f5f5f 64 plan9 LDMXCSR 0(CX) -0fae18|11223344556677885f5f5f5f5f 32 intel stmxcsr dword ptr [eax] -0fae18|11223344556677885f5f5f5f5f 32 plan9 STMXCSR 0(AX) -0fae18|11223344556677885f5f5f5f5f 64 gnu stmxcsr (%rax) -0fae18|11223344556677885f5f5f5f5f 64 intel stmxcsr dword ptr [rax] -0fae18|11223344556677885f5f5f5f5f 64 plan9 STMXCSR 0(AX) -0fae20|11223344556677885f5f5f5f5f 32 intel xsave ptr [eax] -0fae20|11223344556677885f5f5f5f5f 32 plan9 XSAVE 0(AX) -0fae20|11223344556677885f5f5f5f5f 64 gnu xsave (%rax) -0fae20|11223344556677885f5f5f5f5f 64 intel xsave ptr [rax] -0fae20|11223344556677885f5f5f5f5f 64 plan9 XSAVE 0(AX) -0fae28|11223344556677885f5f5f5f5f 32 intel xrstor ptr [eax] -0fae28|11223344556677885f5f5f5f5f 32 plan9 XRSTOR 0(AX) -0fae28|11223344556677885f5f5f5f5f 64 gnu xrstor (%rax) -0fae28|11223344556677885f5f5f5f5f 64 intel xrstor ptr [rax] -0fae28|11223344556677885f5f5f5f5f 64 plan9 XRSTOR 0(AX) -0fae30|11223344556677885f5f5f5f5f 32 intel xsaveopt ptr [eax] -0fae30|11223344556677885f5f5f5f5f 32 plan9 XSAVEOPT 0(AX) -0fae30|11223344556677885f5f5f5f5f 64 gnu xsaveopt (%rax) -0fae30|11223344556677885f5f5f5f5f 64 intel xsaveopt ptr [rax] -0fae30|11223344556677885f5f5f5f5f 64 plan9 XSAVEOPT 0(AX) -0fae38|11223344556677885f5f5f5f5f 32 intel clflush zmmword ptr [eax] -0fae38|11223344556677885f5f5f5f5f 32 plan9 CLFLUSH 0(AX) -0fae38|11223344556677885f5f5f5f5f 64 gnu clflush (%rax) -0fae38|11223344556677885f5f5f5f5f 64 intel clflush zmmword ptr [rax] -0fae38|11223344556677885f5f5f5f5f 64 plan9 CLFLUSH 0(AX) -0faee8|11223344556677885f5f5f5f5f 32 intel lfence -0faee8|11223344556677885f5f5f5f5f 32 plan9 LFENCE -0faee8|11223344556677885f5f5f5f5f 64 gnu lfence -0faee8|11223344556677885f5f5f5f5f 64 intel lfence -0faee8|11223344556677885f5f5f5f5f 64 plan9 LFENCE -0faef0|11223344556677885f5f5f5f5f 32 intel mfence -0faef0|11223344556677885f5f5f5f5f 32 plan9 MFENCE -0faef0|11223344556677885f5f5f5f5f 64 gnu mfence -0faef0|11223344556677885f5f5f5f5f 64 intel mfence -0faef0|11223344556677885f5f5f5f5f 64 plan9 MFENCE -0faef8|11223344556677885f5f5f5f5f 32 intel sfence -0faef8|11223344556677885f5f5f5f5f 32 plan9 SFENCE -0faef8|11223344556677885f5f5f5f5f 64 gnu sfence -0faef8|11223344556677885f5f5f5f5f 64 intel sfence -0faef8|11223344556677885f5f5f5f5f 64 plan9 SFENCE -0faf11|223344556677885f5f5f5f5f5f 32 intel imul edx, dword ptr [ecx] -0faf11|223344556677885f5f5f5f5f5f 32 plan9 IMULL 0(CX), DX -0faf11|223344556677885f5f5f5f5f5f 64 gnu imul (%rcx),%edx -0faf11|223344556677885f5f5f5f5f5f 64 intel imul edx, dword ptr [rcx] -0faf11|223344556677885f5f5f5f5f5f 64 plan9 IMULL 0(CX), DX -0fb011|223344556677885f5f5f5f5f5f 32 intel cmpxchg byte ptr [ecx], dl -0fb011|223344556677885f5f5f5f5f5f 32 plan9 CMPXCHGB DL, 0(CX) -0fb011|223344556677885f5f5f5f5f5f 64 gnu cmpxchg %dl,(%rcx) -0fb011|223344556677885f5f5f5f5f5f 64 intel cmpxchg byte ptr [rcx], dl -0fb011|223344556677885f5f5f5f5f5f 64 plan9 CMPXCHGB DL, 0(CX) -0fb111|223344556677885f5f5f5f5f5f 32 intel cmpxchg dword ptr [ecx], edx -0fb111|223344556677885f5f5f5f5f5f 32 plan9 CMPXCHGL DX, 0(CX) -0fb111|223344556677885f5f5f5f5f5f 64 gnu cmpxchg %edx,(%rcx) -0fb111|223344556677885f5f5f5f5f5f 64 intel cmpxchg dword ptr [rcx], edx -0fb111|223344556677885f5f5f5f5f5f 64 plan9 CMPXCHGL DX, 0(CX) -0fb211|223344556677885f5f5f5f5f5f 32 intel lss edx, ptr [ecx] -0fb211|223344556677885f5f5f5f5f5f 32 plan9 LSS 0(CX), DX -0fb211|223344556677885f5f5f5f5f5f 64 gnu lss (%rcx),%edx -0fb211|223344556677885f5f5f5f5f5f 64 intel lss edx, ptr [rcx] -0fb211|223344556677885f5f5f5f5f5f 64 plan9 LSS 0(CX), DX -0fb311|223344556677885f5f5f5f5f5f 32 intel btr dword ptr [ecx], edx -0fb311|223344556677885f5f5f5f5f5f 32 plan9 BTRL DX, 0(CX) -0fb311|223344556677885f5f5f5f5f5f 64 gnu btr %edx,(%rcx) -0fb311|223344556677885f5f5f5f5f5f 64 intel btr dword ptr [rcx], edx -0fb311|223344556677885f5f5f5f5f5f 64 plan9 BTRL DX, 0(CX) -0fb411|223344556677885f5f5f5f5f5f 32 intel lfs edx, ptr [ecx] -0fb411|223344556677885f5f5f5f5f5f 32 plan9 LFS 0(CX), DX -0fb411|223344556677885f5f5f5f5f5f 64 gnu lfs (%rcx),%edx -0fb411|223344556677885f5f5f5f5f5f 64 intel lfs edx, ptr [rcx] -0fb411|223344556677885f5f5f5f5f5f 64 plan9 LFS 0(CX), DX -0fb511|223344556677885f5f5f5f5f5f 32 intel lgs edx, ptr [ecx] -0fb511|223344556677885f5f5f5f5f5f 32 plan9 LGS 0(CX), DX -0fb511|223344556677885f5f5f5f5f5f 64 gnu lgs (%rcx),%edx -0fb511|223344556677885f5f5f5f5f5f 64 intel lgs edx, ptr [rcx] -0fb511|223344556677885f5f5f5f5f5f 64 plan9 LGS 0(CX), DX -0fb611|223344556677885f5f5f5f5f5f 32 intel movzx edx, byte ptr [ecx] -0fb611|223344556677885f5f5f5f5f5f 32 plan9 MOVZX 0(CX), DX -0fb611|223344556677885f5f5f5f5f5f 64 gnu movzbl (%rcx),%edx -0fb611|223344556677885f5f5f5f5f5f 64 intel movzx edx, byte ptr [rcx] -0fb611|223344556677885f5f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -0fb711|223344556677885f5f5f5f5f5f 32 intel movzx edx, word ptr [ecx] -0fb711|223344556677885f5f5f5f5f5f 32 plan9 MOVZX 0(CX), DX -0fb711|223344556677885f5f5f5f5f5f 64 gnu movzwl (%rcx),%edx -0fb711|223344556677885f5f5f5f5f5f 64 intel movzx edx, word ptr [rcx] -0fb711|223344556677885f5f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -0fb8|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fb8|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fb8|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fb8|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fb8|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fb9|11223344556677885f5f5f5f5f5f 32 intel ud1 -0fb9|11223344556677885f5f5f5f5f5f 32 plan9 UD1 -0fb9|11223344556677885f5f5f5f5f5f 64 gnu ud1 -0fb9|11223344556677885f5f5f5f5f5f 64 intel ud1 -0fb9|11223344556677885f5f5f5f5f5f 64 plan9 UD1 -0fba11|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fba11|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fba11|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fba11|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fba11|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fba2011|223344556677885f5f5f5f5f 32 intel bt dword ptr [eax], 0x11 -0fba2011|223344556677885f5f5f5f5f 32 plan9 BTL $0x11, 0(AX) -0fba2011|223344556677885f5f5f5f5f 64 gnu btl $0x11,(%rax) -0fba2011|223344556677885f5f5f5f5f 64 intel bt dword ptr [rax], 0x11 -0fba2011|223344556677885f5f5f5f5f 64 plan9 BTL $0x11, 0(AX) -0fba2811|223344556677885f5f5f5f5f 32 intel bts dword ptr [eax], 0x11 -0fba2811|223344556677885f5f5f5f5f 32 plan9 BTSL $0x11, 0(AX) -0fba2811|223344556677885f5f5f5f5f 64 gnu btsl $0x11,(%rax) -0fba2811|223344556677885f5f5f5f5f 64 intel bts dword ptr [rax], 0x11 -0fba2811|223344556677885f5f5f5f5f 64 plan9 BTSL $0x11, 0(AX) -0fba3011|223344556677885f5f5f5f5f 32 intel btr dword ptr [eax], 0x11 -0fba3011|223344556677885f5f5f5f5f 32 plan9 BTRL $0x11, 0(AX) -0fba3011|223344556677885f5f5f5f5f 64 gnu btrl $0x11,(%rax) -0fba3011|223344556677885f5f5f5f5f 64 intel btr dword ptr [rax], 0x11 -0fba3011|223344556677885f5f5f5f5f 64 plan9 BTRL $0x11, 0(AX) -0fba3811|223344556677885f5f5f5f5f 32 intel btc dword ptr [eax], 0x11 -0fba3811|223344556677885f5f5f5f5f 32 plan9 BTCL $0x11, 0(AX) -0fba3811|223344556677885f5f5f5f5f 64 gnu btcl $0x11,(%rax) -0fba3811|223344556677885f5f5f5f5f 64 intel btc dword ptr [rax], 0x11 -0fba3811|223344556677885f5f5f5f5f 64 plan9 BTCL $0x11, 0(AX) -0fbb11|223344556677885f5f5f5f5f5f 32 intel btc dword ptr [ecx], edx -0fbb11|223344556677885f5f5f5f5f5f 32 plan9 BTCL DX, 0(CX) -0fbb11|223344556677885f5f5f5f5f5f 64 gnu btc %edx,(%rcx) -0fbb11|223344556677885f5f5f5f5f5f 64 intel btc dword ptr [rcx], edx -0fbb11|223344556677885f5f5f5f5f5f 64 plan9 BTCL DX, 0(CX) -0fbc11|223344556677885f5f5f5f5f5f 32 intel bsf edx, dword ptr [ecx] -0fbc11|223344556677885f5f5f5f5f5f 32 plan9 BSFL 0(CX), DX -0fbc11|223344556677885f5f5f5f5f5f 64 gnu bsf (%rcx),%edx -0fbc11|223344556677885f5f5f5f5f5f 64 intel bsf edx, dword ptr [rcx] -0fbc11|223344556677885f5f5f5f5f5f 64 plan9 BSFL 0(CX), DX -0fbd11|223344556677885f5f5f5f5f5f 32 intel bsr edx, dword ptr [ecx] -0fbd11|223344556677885f5f5f5f5f5f 32 plan9 BSRL 0(CX), DX -0fbd11|223344556677885f5f5f5f5f5f 64 gnu bsr (%rcx),%edx -0fbd11|223344556677885f5f5f5f5f5f 64 intel bsr edx, dword ptr [rcx] -0fbd11|223344556677885f5f5f5f5f5f 64 plan9 BSRL 0(CX), DX -0fbe11|223344556677885f5f5f5f5f5f 32 intel movsx edx, byte ptr [ecx] -0fbe11|223344556677885f5f5f5f5f5f 32 plan9 MOVSX 0(CX), DX -0fbe11|223344556677885f5f5f5f5f5f 64 gnu movsbl (%rcx),%edx -0fbe11|223344556677885f5f5f5f5f5f 64 intel movsx edx, byte ptr [rcx] -0fbe11|223344556677885f5f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -0fbf11|223344556677885f5f5f5f5f5f 32 intel movsx edx, word ptr [ecx] -0fbf11|223344556677885f5f5f5f5f5f 32 plan9 MOVSX 0(CX), DX -0fbf11|223344556677885f5f5f5f5f5f 64 gnu movswl (%rcx),%edx -0fbf11|223344556677885f5f5f5f5f5f 64 intel movsx edx, word ptr [rcx] -0fbf11|223344556677885f5f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -0fc011|223344556677885f5f5f5f5f5f 32 intel xadd byte ptr [ecx], dl -0fc011|223344556677885f5f5f5f5f5f 32 plan9 XADDB DL, 0(CX) -0fc011|223344556677885f5f5f5f5f5f 64 gnu xadd %dl,(%rcx) -0fc011|223344556677885f5f5f5f5f5f 64 intel xadd byte ptr [rcx], dl -0fc011|223344556677885f5f5f5f5f5f 64 plan9 XADDB DL, 0(CX) -0fc111|223344556677885f5f5f5f5f5f 32 intel xadd dword ptr [ecx], edx -0fc111|223344556677885f5f5f5f5f5f 32 plan9 XADDL DX, 0(CX) -0fc111|223344556677885f5f5f5f5f5f 64 gnu xadd %edx,(%rcx) -0fc111|223344556677885f5f5f5f5f5f 64 intel xadd dword ptr [rcx], edx -0fc111|223344556677885f5f5f5f5f5f 64 plan9 XADDL DX, 0(CX) -0fc20000|11223344556677885f5f5f5f 32 intel cmpps xmm0, xmmword ptr [eax], 0x0 -0fc20000|11223344556677885f5f5f5f 32 plan9 CMPPS $0x0, 0(AX), X0 -0fc20000|11223344556677885f5f5f5f 64 gnu cmpeqps (%rax),%xmm0 -0fc20000|11223344556677885f5f5f5f 64 intel cmpps xmm0, xmmword ptr [rax], 0x0 -0fc20000|11223344556677885f5f5f5f 64 plan9 CMPPS $0x0, 0(AX), X0 -0fc311|223344556677885f5f5f5f5f5f 32 intel movnti dword ptr [ecx], edx -0fc311|223344556677885f5f5f5f5f5f 32 plan9 MOVNTIL DX, 0(CX) -0fc311|223344556677885f5f5f5f5f5f 64 gnu movnti %edx,(%rcx) -0fc311|223344556677885f5f5f5f5f5f 64 intel movnti dword ptr [rcx], edx -0fc311|223344556677885f5f5f5f5f5f 64 plan9 MOVNTIL DX, 0(CX) -0fc41122|3344556677885f5f5f5f5f5f 32 intel pinsrw mmx2, word ptr [ecx], 0x22 -0fc41122|3344556677885f5f5f5f5f5f 32 plan9 PINSRW $0x22, 0(CX), M2 -0fc41122|3344556677885f5f5f5f5f5f 64 gnu pinsrw $0x22,(%rcx),%mm2 -0fc41122|3344556677885f5f5f5f5f5f 64 intel pinsrw mmx2, word ptr [rcx], 0x22 -0fc41122|3344556677885f5f5f5f5f5f 64 plan9 PINSRW $0x22, 0(CX), M2 -0fc51122|3344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fc51122|3344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fc51122|3344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fc51122|3344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fc51122|3344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fc5c011|223344556677885f5f5f5f5f 32 intel pextrw eax, mmx0, 0x11 -0fc5c011|223344556677885f5f5f5f5f 32 plan9 PEXTRW $0x11, M0, AX -0fc5c011|223344556677885f5f5f5f5f 64 gnu pextrw $0x11,%mm0,%eax -0fc5c011|223344556677885f5f5f5f5f 64 intel pextrw eax, mmx0, 0x11 -0fc5c011|223344556677885f5f5f5f5f 64 plan9 PEXTRW $0x11, M0, AX -0fc61122|3344556677885f5f5f5f5f5f 32 intel shufps xmm2, xmmword ptr [ecx], 0x22 -0fc61122|3344556677885f5f5f5f5f5f 32 plan9 SHUFPS $0x22, 0(CX), X2 -0fc61122|3344556677885f5f5f5f5f5f 64 gnu shufps $0x22,(%rcx),%xmm2 -0fc61122|3344556677885f5f5f5f5f5f 64 intel shufps xmm2, xmmword ptr [rcx], 0x22 -0fc61122|3344556677885f5f5f5f5f5f 64 plan9 SHUFPS $0x22, 0(CX), X2 -0fc708|11223344556677885f5f5f5f5f 32 intel cmpxchg8b qword ptr [eax] -0fc708|11223344556677885f5f5f5f5f 32 plan9 CMPXCHG8B 0(AX) -0fc708|11223344556677885f5f5f5f5f 64 gnu cmpxchg8b (%rax) -0fc708|11223344556677885f5f5f5f5f 64 intel cmpxchg8b qword ptr [rax] -0fc708|11223344556677885f5f5f5f5f 64 plan9 CMPXCHG8B 0(AX) -0fc718|11223344556677885f5f5f5f5f 32 intel xrstors ptr [eax] -0fc718|11223344556677885f5f5f5f5f 32 plan9 XRSTORS 0(AX) -0fc718|11223344556677885f5f5f5f5f 64 gnu xrstors (%rax) -0fc718|11223344556677885f5f5f5f5f 64 intel xrstors ptr [rax] -0fc718|11223344556677885f5f5f5f5f 64 plan9 XRSTORS 0(AX) -0fc720|11223344556677885f5f5f5f5f 32 intel xsavec ptr [eax] -0fc720|11223344556677885f5f5f5f5f 32 plan9 XSAVEC 0(AX) -0fc720|11223344556677885f5f5f5f5f 64 gnu xsavec (%rax) -0fc720|11223344556677885f5f5f5f5f 64 intel xsavec ptr [rax] -0fc720|11223344556677885f5f5f5f5f 64 plan9 XSAVEC 0(AX) -0fc728|11223344556677885f5f5f5f5f 32 intel xsaves ptr [eax] -0fc728|11223344556677885f5f5f5f5f 32 plan9 XSAVES 0(AX) -0fc728|11223344556677885f5f5f5f5f 64 gnu xsaves (%rax) -0fc728|11223344556677885f5f5f5f5f 64 intel xsaves ptr [rax] -0fc728|11223344556677885f5f5f5f5f 64 plan9 XSAVES 0(AX) -0fc730|11223344556677885f5f5f5f5f 32 intel error: unrecognized instruction -0fc730|11223344556677885f5f5f5f5f 32 plan9 error: unrecognized instruction -0fc730|11223344556677885f5f5f5f5f 64 gnu error: unrecognized instruction -0fc730|11223344556677885f5f5f5f5f 64 intel error: unrecognized instruction -0fc730|11223344556677885f5f5f5f5f 64 plan9 error: unrecognized instruction -0fc7f0|11223344556677885f5f5f5f5f 32 intel rdrand eax -0fc7f0|11223344556677885f5f5f5f5f 32 plan9 RDRAND AX -0fc7f0|11223344556677885f5f5f5f5f 64 gnu rdrand %eax -0fc7f0|11223344556677885f5f5f5f5f 64 intel rdrand eax -0fc7f0|11223344556677885f5f5f5f5f 64 plan9 RDRAND AX -0fc8|11223344556677885f5f5f5f5f5f 32 intel bswap eax -0fc8|11223344556677885f5f5f5f5f5f 32 plan9 BSWAP AX -0fc8|11223344556677885f5f5f5f5f5f 64 gnu bswap %eax -0fc8|11223344556677885f5f5f5f5f5f 64 intel bswap eax -0fc8|11223344556677885f5f5f5f5f5f 64 plan9 BSWAP AX -0fd0|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fd0|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fd0|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fd0|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fd0|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fd111|223344556677885f5f5f5f5f5f 32 intel psrlw mmx2, qword ptr [ecx] -0fd111|223344556677885f5f5f5f5f5f 32 plan9 PSRLW 0(CX), M2 -0fd111|223344556677885f5f5f5f5f5f 64 gnu psrlw (%rcx),%mm2 -0fd111|223344556677885f5f5f5f5f5f 64 intel psrlw mmx2, qword ptr [rcx] -0fd111|223344556677885f5f5f5f5f5f 64 plan9 PSRLW 0(CX), M2 -0fd211|223344556677885f5f5f5f5f5f 32 intel psrld mmx2, qword ptr [ecx] -0fd211|223344556677885f5f5f5f5f5f 32 plan9 PSRLD 0(CX), M2 -0fd211|223344556677885f5f5f5f5f5f 64 gnu psrld (%rcx),%mm2 -0fd211|223344556677885f5f5f5f5f5f 64 intel psrld mmx2, qword ptr [rcx] -0fd211|223344556677885f5f5f5f5f5f 64 plan9 PSRLD 0(CX), M2 -0fd311|223344556677885f5f5f5f5f5f 32 intel psrlq mmx2, qword ptr [ecx] -0fd311|223344556677885f5f5f5f5f5f 32 plan9 PSRLQ 0(CX), M2 -0fd311|223344556677885f5f5f5f5f5f 64 gnu psrlq (%rcx),%mm2 -0fd311|223344556677885f5f5f5f5f5f 64 intel psrlq mmx2, qword ptr [rcx] -0fd311|223344556677885f5f5f5f5f5f 64 plan9 PSRLQ 0(CX), M2 -0fd411|223344556677885f5f5f5f5f5f 32 intel paddq mmx2, qword ptr [ecx] -0fd411|223344556677885f5f5f5f5f5f 32 plan9 PADDQ 0(CX), M2 -0fd411|223344556677885f5f5f5f5f5f 64 gnu paddq (%rcx),%mm2 -0fd411|223344556677885f5f5f5f5f5f 64 intel paddq mmx2, qword ptr [rcx] -0fd411|223344556677885f5f5f5f5f5f 64 plan9 PADDQ 0(CX), M2 -0fd511|223344556677885f5f5f5f5f5f 32 intel pmullw mmx2, qword ptr [ecx] -0fd511|223344556677885f5f5f5f5f5f 32 plan9 PMULLW 0(CX), M2 -0fd511|223344556677885f5f5f5f5f5f 64 gnu pmullw (%rcx),%mm2 -0fd511|223344556677885f5f5f5f5f5f 64 intel pmullw mmx2, qword ptr [rcx] -0fd511|223344556677885f5f5f5f5f5f 64 plan9 PMULLW 0(CX), M2 -0fd6|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fd6|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fd6|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fd6|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fd6|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fd711|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fd711|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fd711|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fd711|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fd711|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fd7c0|11223344556677885f5f5f5f5f 32 intel pmovmskb eax, mmx0 -0fd7c0|11223344556677885f5f5f5f5f 32 plan9 PMOVMSKB M0, AX -0fd7c0|11223344556677885f5f5f5f5f 64 gnu pmovmskb %mm0,%eax -0fd7c0|11223344556677885f5f5f5f5f 64 intel pmovmskb eax, mmx0 -0fd7c0|11223344556677885f5f5f5f5f 64 plan9 PMOVMSKB M0, AX -0fd811|223344556677885f5f5f5f5f5f 32 intel psubusb mmx2, qword ptr [ecx] -0fd811|223344556677885f5f5f5f5f5f 32 plan9 PSUBUSB 0(CX), M2 -0fd811|223344556677885f5f5f5f5f5f 64 gnu psubusb (%rcx),%mm2 -0fd811|223344556677885f5f5f5f5f5f 64 intel psubusb mmx2, qword ptr [rcx] -0fd811|223344556677885f5f5f5f5f5f 64 plan9 PSUBUSB 0(CX), M2 -0fd911|223344556677885f5f5f5f5f5f 32 intel psubusw mmx2, qword ptr [ecx] -0fd911|223344556677885f5f5f5f5f5f 32 plan9 PSUBUSW 0(CX), M2 -0fd911|223344556677885f5f5f5f5f5f 64 gnu psubusw (%rcx),%mm2 -0fd911|223344556677885f5f5f5f5f5f 64 intel psubusw mmx2, qword ptr [rcx] -0fd911|223344556677885f5f5f5f5f5f 64 plan9 PSUBUSW 0(CX), M2 -0fda11|223344556677885f5f5f5f5f5f 32 intel pminub mmx2, qword ptr [ecx] -0fda11|223344556677885f5f5f5f5f5f 32 plan9 PMINUB 0(CX), M2 -0fda11|223344556677885f5f5f5f5f5f 64 gnu pminub (%rcx),%mm2 -0fda11|223344556677885f5f5f5f5f5f 64 intel pminub mmx2, qword ptr [rcx] -0fda11|223344556677885f5f5f5f5f5f 64 plan9 PMINUB 0(CX), M2 -0fdb11|223344556677885f5f5f5f5f5f 32 intel pand mmx2, qword ptr [ecx] -0fdb11|223344556677885f5f5f5f5f5f 32 plan9 PAND 0(CX), M2 -0fdb11|223344556677885f5f5f5f5f5f 64 gnu pand (%rcx),%mm2 -0fdb11|223344556677885f5f5f5f5f5f 64 intel pand mmx2, qword ptr [rcx] -0fdb11|223344556677885f5f5f5f5f5f 64 plan9 PAND 0(CX), M2 -0fdc11|223344556677885f5f5f5f5f5f 32 intel paddusb mmx2, qword ptr [ecx] -0fdc11|223344556677885f5f5f5f5f5f 32 plan9 PADDUSB 0(CX), M2 -0fdc11|223344556677885f5f5f5f5f5f 64 gnu paddusb (%rcx),%mm2 -0fdc11|223344556677885f5f5f5f5f5f 64 intel paddusb mmx2, qword ptr [rcx] -0fdc11|223344556677885f5f5f5f5f5f 64 plan9 PADDUSB 0(CX), M2 -0fdd11|223344556677885f5f5f5f5f5f 32 intel paddusw mmx2, qword ptr [ecx] -0fdd11|223344556677885f5f5f5f5f5f 32 plan9 PADDUSW 0(CX), M2 -0fdd11|223344556677885f5f5f5f5f5f 64 gnu paddusw (%rcx),%mm2 -0fdd11|223344556677885f5f5f5f5f5f 64 intel paddusw mmx2, qword ptr [rcx] -0fdd11|223344556677885f5f5f5f5f5f 64 plan9 PADDUSW 0(CX), M2 -0fde11|223344556677885f5f5f5f5f5f 32 intel pmaxub mmx2, qword ptr [ecx] -0fde11|223344556677885f5f5f5f5f5f 32 plan9 PMAXUB 0(CX), M2 -0fde11|223344556677885f5f5f5f5f5f 64 gnu pmaxub (%rcx),%mm2 -0fde11|223344556677885f5f5f5f5f5f 64 intel pmaxub mmx2, qword ptr [rcx] -0fde11|223344556677885f5f5f5f5f5f 64 plan9 PMAXUB 0(CX), M2 -0fdf11|223344556677885f5f5f5f5f5f 32 intel pandn mmx2, qword ptr [ecx] -0fdf11|223344556677885f5f5f5f5f5f 32 plan9 PANDN 0(CX), M2 -0fdf11|223344556677885f5f5f5f5f5f 64 gnu pandn (%rcx),%mm2 -0fdf11|223344556677885f5f5f5f5f5f 64 intel pandn mmx2, qword ptr [rcx] -0fdf11|223344556677885f5f5f5f5f5f 64 plan9 PANDN 0(CX), M2 -0fe011|223344556677885f5f5f5f5f5f 32 intel pavgb mmx2, qword ptr [ecx] -0fe011|223344556677885f5f5f5f5f5f 32 plan9 PAVGB 0(CX), M2 -0fe011|223344556677885f5f5f5f5f5f 64 gnu pavgb (%rcx),%mm2 -0fe011|223344556677885f5f5f5f5f5f 64 intel pavgb mmx2, qword ptr [rcx] -0fe011|223344556677885f5f5f5f5f5f 64 plan9 PAVGB 0(CX), M2 -0fe111|223344556677885f5f5f5f5f5f 32 intel psraw mmx2, qword ptr [ecx] -0fe111|223344556677885f5f5f5f5f5f 32 plan9 PSRAW 0(CX), M2 -0fe111|223344556677885f5f5f5f5f5f 64 gnu psraw (%rcx),%mm2 -0fe111|223344556677885f5f5f5f5f5f 64 intel psraw mmx2, qword ptr [rcx] -0fe111|223344556677885f5f5f5f5f5f 64 plan9 PSRAW 0(CX), M2 -0fe211|223344556677885f5f5f5f5f5f 32 intel psrad mmx2, qword ptr [ecx] -0fe211|223344556677885f5f5f5f5f5f 32 plan9 PSRAD 0(CX), M2 -0fe211|223344556677885f5f5f5f5f5f 64 gnu psrad (%rcx),%mm2 -0fe211|223344556677885f5f5f5f5f5f 64 intel psrad mmx2, qword ptr [rcx] -0fe211|223344556677885f5f5f5f5f5f 64 plan9 PSRAD 0(CX), M2 -0fe311|223344556677885f5f5f5f5f5f 32 intel pavgw mmx2, qword ptr [ecx] -0fe311|223344556677885f5f5f5f5f5f 32 plan9 PAVGW 0(CX), M2 -0fe311|223344556677885f5f5f5f5f5f 64 gnu pavgw (%rcx),%mm2 -0fe311|223344556677885f5f5f5f5f5f 64 intel pavgw mmx2, qword ptr [rcx] -0fe311|223344556677885f5f5f5f5f5f 64 plan9 PAVGW 0(CX), M2 -0fe411|223344556677885f5f5f5f5f5f 32 intel pmulhuw mmx2, qword ptr [ecx] -0fe411|223344556677885f5f5f5f5f5f 32 plan9 PMULHUW 0(CX), M2 -0fe411|223344556677885f5f5f5f5f5f 64 gnu pmulhuw (%rcx),%mm2 -0fe411|223344556677885f5f5f5f5f5f 64 intel pmulhuw mmx2, qword ptr [rcx] -0fe411|223344556677885f5f5f5f5f5f 64 plan9 PMULHUW 0(CX), M2 -0fe511|223344556677885f5f5f5f5f5f 32 intel pmulhw mmx2, qword ptr [ecx] -0fe511|223344556677885f5f5f5f5f5f 32 plan9 PMULHW 0(CX), M2 -0fe511|223344556677885f5f5f5f5f5f 64 gnu pmulhw (%rcx),%mm2 -0fe511|223344556677885f5f5f5f5f5f 64 intel pmulhw mmx2, qword ptr [rcx] -0fe511|223344556677885f5f5f5f5f5f 64 plan9 PMULHW 0(CX), M2 -0fe6|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0fe6|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0fe6|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0fe6|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0fe6|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0fe711|223344556677885f5f5f5f5f5f 32 intel movntq qword ptr [ecx], mmx2 -0fe711|223344556677885f5f5f5f5f5f 32 plan9 MOVNTQ M2, 0(CX) -0fe711|223344556677885f5f5f5f5f5f 64 gnu movntq %mm2,(%rcx) -0fe711|223344556677885f5f5f5f5f5f 64 intel movntq qword ptr [rcx], mmx2 -0fe711|223344556677885f5f5f5f5f5f 64 plan9 MOVNTQ M2, 0(CX) -0fe811|223344556677885f5f5f5f5f5f 32 intel psubsb mmx2, qword ptr [ecx] -0fe811|223344556677885f5f5f5f5f5f 32 plan9 PSUBSB 0(CX), M2 -0fe811|223344556677885f5f5f5f5f5f 64 gnu psubsb (%rcx),%mm2 -0fe811|223344556677885f5f5f5f5f5f 64 intel psubsb mmx2, qword ptr [rcx] -0fe811|223344556677885f5f5f5f5f5f 64 plan9 PSUBSB 0(CX), M2 -0fe911|223344556677885f5f5f5f5f5f 32 intel psubsw mmx2, qword ptr [ecx] -0fe911|223344556677885f5f5f5f5f5f 32 plan9 PSUBSW 0(CX), M2 -0fe911|223344556677885f5f5f5f5f5f 64 gnu psubsw (%rcx),%mm2 -0fe911|223344556677885f5f5f5f5f5f 64 intel psubsw mmx2, qword ptr [rcx] -0fe911|223344556677885f5f5f5f5f5f 64 plan9 PSUBSW 0(CX), M2 -0fea11|223344556677885f5f5f5f5f5f 32 intel pminsw mmx2, qword ptr [ecx] -0fea11|223344556677885f5f5f5f5f5f 32 plan9 PMINSW 0(CX), M2 -0fea11|223344556677885f5f5f5f5f5f 64 gnu pminsw (%rcx),%mm2 -0fea11|223344556677885f5f5f5f5f5f 64 intel pminsw mmx2, qword ptr [rcx] -0fea11|223344556677885f5f5f5f5f5f 64 plan9 PMINSW 0(CX), M2 -0feb11|223344556677885f5f5f5f5f5f 32 intel por mmx2, qword ptr [ecx] -0feb11|223344556677885f5f5f5f5f5f 32 plan9 POR 0(CX), M2 -0feb11|223344556677885f5f5f5f5f5f 64 gnu por (%rcx),%mm2 -0feb11|223344556677885f5f5f5f5f5f 64 intel por mmx2, qword ptr [rcx] -0feb11|223344556677885f5f5f5f5f5f 64 plan9 POR 0(CX), M2 -0fec11|223344556677885f5f5f5f5f5f 32 intel paddsb mmx2, qword ptr [ecx] -0fec11|223344556677885f5f5f5f5f5f 32 plan9 PADDSB 0(CX), M2 -0fec11|223344556677885f5f5f5f5f5f 64 gnu paddsb (%rcx),%mm2 -0fec11|223344556677885f5f5f5f5f5f 64 intel paddsb mmx2, qword ptr [rcx] -0fec11|223344556677885f5f5f5f5f5f 64 plan9 PADDSB 0(CX), M2 -0fed11|223344556677885f5f5f5f5f5f 32 intel paddsw mmx2, qword ptr [ecx] -0fed11|223344556677885f5f5f5f5f5f 32 plan9 PADDSW 0(CX), M2 -0fed11|223344556677885f5f5f5f5f5f 64 gnu paddsw (%rcx),%mm2 -0fed11|223344556677885f5f5f5f5f5f 64 intel paddsw mmx2, qword ptr [rcx] -0fed11|223344556677885f5f5f5f5f5f 64 plan9 PADDSW 0(CX), M2 -0fee11|223344556677885f5f5f5f5f5f 32 intel pmaxsw mmx2, qword ptr [ecx] -0fee11|223344556677885f5f5f5f5f5f 32 plan9 PMAXSW 0(CX), M2 -0fee11|223344556677885f5f5f5f5f5f 64 gnu pmaxsw (%rcx),%mm2 -0fee11|223344556677885f5f5f5f5f5f 64 intel pmaxsw mmx2, qword ptr [rcx] -0fee11|223344556677885f5f5f5f5f5f 64 plan9 PMAXSW 0(CX), M2 -0fef11|223344556677885f5f5f5f5f5f 32 intel pxor mmx2, qword ptr [ecx] -0fef11|223344556677885f5f5f5f5f5f 32 plan9 PXOR 0(CX), M2 -0fef11|223344556677885f5f5f5f5f5f 64 gnu pxor (%rcx),%mm2 -0fef11|223344556677885f5f5f5f5f5f 64 intel pxor mmx2, qword ptr [rcx] -0fef11|223344556677885f5f5f5f5f5f 64 plan9 PXOR 0(CX), M2 -0ff0|11223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0ff0|11223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0ff0|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0ff0|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0ff0|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0ff111|223344556677885f5f5f5f5f5f 32 intel psllw mmx2, qword ptr [ecx] -0ff111|223344556677885f5f5f5f5f5f 32 plan9 PSLLW 0(CX), M2 -0ff111|223344556677885f5f5f5f5f5f 64 gnu psllw (%rcx),%mm2 -0ff111|223344556677885f5f5f5f5f5f 64 intel psllw mmx2, qword ptr [rcx] -0ff111|223344556677885f5f5f5f5f5f 64 plan9 PSLLW 0(CX), M2 -0ff211|223344556677885f5f5f5f5f5f 32 intel pslld mmx2, qword ptr [ecx] -0ff211|223344556677885f5f5f5f5f5f 32 plan9 PSLLD 0(CX), M2 -0ff211|223344556677885f5f5f5f5f5f 64 gnu pslld (%rcx),%mm2 -0ff211|223344556677885f5f5f5f5f5f 64 intel pslld mmx2, qword ptr [rcx] -0ff211|223344556677885f5f5f5f5f5f 64 plan9 PSLLD 0(CX), M2 -0ff311|223344556677885f5f5f5f5f5f 32 intel psllq mmx2, qword ptr [ecx] -0ff311|223344556677885f5f5f5f5f5f 32 plan9 PSLLQ 0(CX), M2 -0ff311|223344556677885f5f5f5f5f5f 64 gnu psllq (%rcx),%mm2 -0ff311|223344556677885f5f5f5f5f5f 64 intel psllq mmx2, qword ptr [rcx] -0ff311|223344556677885f5f5f5f5f5f 64 plan9 PSLLQ 0(CX), M2 -0ff411|223344556677885f5f5f5f5f5f 32 intel pmuludq mmx2, qword ptr [ecx] -0ff411|223344556677885f5f5f5f5f5f 32 plan9 PMULUDQ 0(CX), M2 -0ff411|223344556677885f5f5f5f5f5f 64 gnu pmuludq (%rcx),%mm2 -0ff411|223344556677885f5f5f5f5f5f 64 intel pmuludq mmx2, qword ptr [rcx] -0ff411|223344556677885f5f5f5f5f5f 64 plan9 PMULUDQ 0(CX), M2 -0ff511|223344556677885f5f5f5f5f5f 32 intel pmaddwd mmx2, qword ptr [ecx] -0ff511|223344556677885f5f5f5f5f5f 32 plan9 PMADDWD 0(CX), M2 -0ff511|223344556677885f5f5f5f5f5f 64 gnu pmaddwd (%rcx),%mm2 -0ff511|223344556677885f5f5f5f5f5f 64 intel pmaddwd mmx2, qword ptr [rcx] -0ff511|223344556677885f5f5f5f5f5f 64 plan9 PMADDWD 0(CX), M2 -0ff611|223344556677885f5f5f5f5f5f 32 intel psadbw mmx2, qword ptr [ecx] -0ff611|223344556677885f5f5f5f5f5f 32 plan9 PSADBW 0(CX), M2 -0ff611|223344556677885f5f5f5f5f5f 64 gnu psadbw (%rcx),%mm2 -0ff611|223344556677885f5f5f5f5f5f 64 intel psadbw mmx2, qword ptr [rcx] -0ff611|223344556677885f5f5f5f5f5f 64 plan9 PSADBW 0(CX), M2 -0ff711|223344556677885f5f5f5f5f5f 32 intel error: unrecognized instruction -0ff711|223344556677885f5f5f5f5f5f 32 plan9 error: unrecognized instruction -0ff711|223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -0ff711|223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -0ff711|223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -0ff7c0|11223344556677885f5f5f5f5f 32 intel maskmovq mmx0, mmx0 -0ff7c0|11223344556677885f5f5f5f5f 32 plan9 MASKMOVQ M0, M0 -0ff7c0|11223344556677885f5f5f5f5f 64 gnu maskmovq %mm0,%mm0 -0ff7c0|11223344556677885f5f5f5f5f 64 intel maskmovq mmx0, mmx0 -0ff7c0|11223344556677885f5f5f5f5f 64 plan9 MASKMOVQ M0, M0 -0ff811|223344556677885f5f5f5f5f5f 32 intel psubb mmx2, qword ptr [ecx] -0ff811|223344556677885f5f5f5f5f5f 32 plan9 PSUBB 0(CX), M2 -0ff811|223344556677885f5f5f5f5f5f 64 gnu psubb (%rcx),%mm2 -0ff811|223344556677885f5f5f5f5f5f 64 intel psubb mmx2, qword ptr [rcx] -0ff811|223344556677885f5f5f5f5f5f 64 plan9 PSUBB 0(CX), M2 -0ff911|223344556677885f5f5f5f5f5f 32 intel psubw mmx2, qword ptr [ecx] -0ff911|223344556677885f5f5f5f5f5f 32 plan9 PSUBW 0(CX), M2 -0ff911|223344556677885f5f5f5f5f5f 64 gnu psubw (%rcx),%mm2 -0ff911|223344556677885f5f5f5f5f5f 64 intel psubw mmx2, qword ptr [rcx] -0ff911|223344556677885f5f5f5f5f5f 64 plan9 PSUBW 0(CX), M2 -0ffa11|223344556677885f5f5f5f5f5f 32 intel psubd mmx2, qword ptr [ecx] -0ffa11|223344556677885f5f5f5f5f5f 32 plan9 PSUBD 0(CX), M2 -0ffa11|223344556677885f5f5f5f5f5f 64 gnu psubd (%rcx),%mm2 -0ffa11|223344556677885f5f5f5f5f5f 64 intel psubd mmx2, qword ptr [rcx] -0ffa11|223344556677885f5f5f5f5f5f 64 plan9 PSUBD 0(CX), M2 -0ffb11|223344556677885f5f5f5f5f5f 32 intel psubq mmx2, qword ptr [ecx] -0ffb11|223344556677885f5f5f5f5f5f 32 plan9 PSUBQ 0(CX), M2 -0ffb11|223344556677885f5f5f5f5f5f 64 gnu psubq (%rcx),%mm2 -0ffb11|223344556677885f5f5f5f5f5f 64 intel psubq mmx2, qword ptr [rcx] -0ffb11|223344556677885f5f5f5f5f5f 64 plan9 PSUBQ 0(CX), M2 -0ffc11|223344556677885f5f5f5f5f5f 32 intel paddb mmx2, qword ptr [ecx] -0ffc11|223344556677885f5f5f5f5f5f 32 plan9 PADDB 0(CX), M2 -0ffc11|223344556677885f5f5f5f5f5f 64 gnu paddb (%rcx),%mm2 -0ffc11|223344556677885f5f5f5f5f5f 64 intel paddb mmx2, qword ptr [rcx] -0ffc11|223344556677885f5f5f5f5f5f 64 plan9 PADDB 0(CX), M2 -0ffd11|223344556677885f5f5f5f5f5f 32 intel paddw mmx2, qword ptr [ecx] -0ffd11|223344556677885f5f5f5f5f5f 32 plan9 PADDW 0(CX), M2 -0ffd11|223344556677885f5f5f5f5f5f 64 gnu paddw (%rcx),%mm2 -0ffd11|223344556677885f5f5f5f5f5f 64 intel paddw mmx2, qword ptr [rcx] -0ffd11|223344556677885f5f5f5f5f5f 64 plan9 PADDW 0(CX), M2 -0ffe11|223344556677885f5f5f5f5f5f 32 intel paddd mmx2, qword ptr [ecx] -0ffe11|223344556677885f5f5f5f5f5f 32 plan9 PADDD 0(CX), M2 -0ffe11|223344556677885f5f5f5f5f5f 64 gnu paddd (%rcx),%mm2 -0ffe11|223344556677885f5f5f5f5f5f 64 intel paddd mmx2, qword ptr [rcx] -0ffe11|223344556677885f5f5f5f5f5f 64 plan9 PADDD 0(CX), M2 -1011|223344556677885f5f5f5f5f5f5f 32 intel adc byte ptr [ecx], dl -1011|223344556677885f5f5f5f5f5f5f 32 plan9 ADCB DL, 0(CX) -1011|223344556677885f5f5f5f5f5f5f 64 gnu adc %dl,(%rcx) -1011|223344556677885f5f5f5f5f5f5f 64 intel adc byte ptr [rcx], dl -1011|223344556677885f5f5f5f5f5f5f 64 plan9 ADCB DL, 0(CX) -1111|223344556677885f5f5f5f5f5f5f 32 intel adc dword ptr [ecx], edx -1111|223344556677885f5f5f5f5f5f5f 32 plan9 ADCL DX, 0(CX) -1111|223344556677885f5f5f5f5f5f5f 64 gnu adc %edx,(%rcx) -1111|223344556677885f5f5f5f5f5f5f 64 intel adc dword ptr [rcx], edx -1111|223344556677885f5f5f5f5f5f5f 64 plan9 ADCL DX, 0(CX) -1211|223344556677885f5f5f5f5f5f5f 32 intel adc dl, byte ptr [ecx] -1211|223344556677885f5f5f5f5f5f5f 32 plan9 ADCB 0(CX), DL -1211|223344556677885f5f5f5f5f5f5f 64 gnu adc (%rcx),%dl -1211|223344556677885f5f5f5f5f5f5f 64 intel adc dl, byte ptr [rcx] -1211|223344556677885f5f5f5f5f5f5f 64 plan9 ADCB 0(CX), DL -1311|223344556677885f5f5f5f5f5f5f 32 intel adc edx, dword ptr [ecx] -1311|223344556677885f5f5f5f5f5f5f 32 plan9 ADCL 0(CX), DX -1311|223344556677885f5f5f5f5f5f5f 64 gnu adc (%rcx),%edx -1311|223344556677885f5f5f5f5f5f5f 64 intel adc edx, dword ptr [rcx] -1311|223344556677885f5f5f5f5f5f5f 64 plan9 ADCL 0(CX), DX -1411|223344556677885f5f5f5f5f5f5f 32 intel adc al, 0x11 -1411|223344556677885f5f5f5f5f5f5f 32 plan9 ADCL $0x11, AL -1411|223344556677885f5f5f5f5f5f5f 64 gnu adc $0x11,%al -1411|223344556677885f5f5f5f5f5f5f 64 intel adc al, 0x11 -1411|223344556677885f5f5f5f5f5f5f 64 plan9 ADCL $0x11, AL -1511223344|556677885f5f5f5f5f5f5f 32 intel adc eax, 0x44332211 -1511223344|556677885f5f5f5f5f5f5f 32 plan9 ADCL $0x44332211, AX -1511223344|556677885f5f5f5f5f5f5f 64 gnu adc $0x44332211,%eax -1511223344|556677885f5f5f5f5f5f5f 64 intel adc eax, 0x44332211 -1511223344|556677885f5f5f5f5f5f5f 64 plan9 ADCL $0x44332211, AX -16|11223344556677885f5f5f5f5f5f5f 32 intel push ss -16|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL SS -16|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -16|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -16|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -17|11223344556677885f5f5f5f5f5f5f 32 intel pop ss -17|11223344556677885f5f5f5f5f5f5f 32 plan9 POPL SS -17|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -17|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -17|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -1811|223344556677885f5f5f5f5f5f5f 32 intel sbb byte ptr [ecx], dl -1811|223344556677885f5f5f5f5f5f5f 32 plan9 SBBB DL, 0(CX) -1811|223344556677885f5f5f5f5f5f5f 64 gnu sbb %dl,(%rcx) -1811|223344556677885f5f5f5f5f5f5f 64 intel sbb byte ptr [rcx], dl -1811|223344556677885f5f5f5f5f5f5f 64 plan9 SBBB DL, 0(CX) -1911|223344556677885f5f5f5f5f5f5f 32 intel sbb dword ptr [ecx], edx -1911|223344556677885f5f5f5f5f5f5f 32 plan9 SBBL DX, 0(CX) -1911|223344556677885f5f5f5f5f5f5f 64 gnu sbb %edx,(%rcx) -1911|223344556677885f5f5f5f5f5f5f 64 intel sbb dword ptr [rcx], edx -1911|223344556677885f5f5f5f5f5f5f 64 plan9 SBBL DX, 0(CX) -1a11|223344556677885f5f5f5f5f5f5f 32 intel sbb dl, byte ptr [ecx] -1a11|223344556677885f5f5f5f5f5f5f 32 plan9 SBBB 0(CX), DL -1a11|223344556677885f5f5f5f5f5f5f 64 gnu sbb (%rcx),%dl -1a11|223344556677885f5f5f5f5f5f5f 64 intel sbb dl, byte ptr [rcx] -1a11|223344556677885f5f5f5f5f5f5f 64 plan9 SBBB 0(CX), DL -1b11|223344556677885f5f5f5f5f5f5f 32 intel sbb edx, dword ptr [ecx] -1b11|223344556677885f5f5f5f5f5f5f 32 plan9 SBBL 0(CX), DX -1b11|223344556677885f5f5f5f5f5f5f 64 gnu sbb (%rcx),%edx -1b11|223344556677885f5f5f5f5f5f5f 64 intel sbb edx, dword ptr [rcx] -1b11|223344556677885f5f5f5f5f5f5f 64 plan9 SBBL 0(CX), DX -1c11|223344556677885f5f5f5f5f5f5f 32 intel sbb al, 0x11 -1c11|223344556677885f5f5f5f5f5f5f 32 plan9 SBBL $0x11, AL -1c11|223344556677885f5f5f5f5f5f5f 64 gnu sbb $0x11,%al -1c11|223344556677885f5f5f5f5f5f5f 64 intel sbb al, 0x11 -1c11|223344556677885f5f5f5f5f5f5f 64 plan9 SBBL $0x11, AL -1d11223344|556677885f5f5f5f5f5f5f 32 intel sbb eax, 0x44332211 -1d11223344|556677885f5f5f5f5f5f5f 32 plan9 SBBL $0x44332211, AX -1d11223344|556677885f5f5f5f5f5f5f 64 gnu sbb $0x44332211,%eax -1d11223344|556677885f5f5f5f5f5f5f 64 intel sbb eax, 0x44332211 -1d11223344|556677885f5f5f5f5f5f5f 64 plan9 SBBL $0x44332211, AX -1e|11223344556677885f5f5f5f5f5f5f 32 intel push ds -1e|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL DS -1e|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -1e|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -1e|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -1f|11223344556677885f5f5f5f5f5f5f 32 intel pop ds -1f|11223344556677885f5f5f5f5f5f5f 32 plan9 POPL DS -1f|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -1f|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -1f|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -2011|223344556677885f5f5f5f5f5f5f 32 intel and byte ptr [ecx], dl -2011|223344556677885f5f5f5f5f5f5f 32 plan9 ANDB DL, 0(CX) -2011|223344556677885f5f5f5f5f5f5f 64 gnu and %dl,(%rcx) -2011|223344556677885f5f5f5f5f5f5f 64 intel and byte ptr [rcx], dl -2011|223344556677885f5f5f5f5f5f5f 64 plan9 ANDB DL, 0(CX) -2111|223344556677885f5f5f5f5f5f5f 32 intel and dword ptr [ecx], edx -2111|223344556677885f5f5f5f5f5f5f 32 plan9 ANDL DX, 0(CX) -2111|223344556677885f5f5f5f5f5f5f 64 gnu and %edx,(%rcx) -2111|223344556677885f5f5f5f5f5f5f 64 intel and dword ptr [rcx], edx -2111|223344556677885f5f5f5f5f5f5f 64 plan9 ANDL DX, 0(CX) -2211|223344556677885f5f5f5f5f5f5f 32 intel and dl, byte ptr [ecx] -2211|223344556677885f5f5f5f5f5f5f 32 plan9 ANDB 0(CX), DL -2211|223344556677885f5f5f5f5f5f5f 64 gnu and (%rcx),%dl -2211|223344556677885f5f5f5f5f5f5f 64 intel and dl, byte ptr [rcx] -2211|223344556677885f5f5f5f5f5f5f 64 plan9 ANDB 0(CX), DL -2311|223344556677885f5f5f5f5f5f5f 32 intel and edx, dword ptr [ecx] -2311|223344556677885f5f5f5f5f5f5f 32 plan9 ANDL 0(CX), DX -2311|223344556677885f5f5f5f5f5f5f 64 gnu and (%rcx),%edx -2311|223344556677885f5f5f5f5f5f5f 64 intel and edx, dword ptr [rcx] -2311|223344556677885f5f5f5f5f5f5f 64 plan9 ANDL 0(CX), DX -2411|223344556677885f5f5f5f5f5f5f 32 intel and al, 0x11 -2411|223344556677885f5f5f5f5f5f5f 32 plan9 ANDL $0x11, AL -2411|223344556677885f5f5f5f5f5f5f 64 gnu and $0x11,%al -2411|223344556677885f5f5f5f5f5f5f 64 intel and al, 0x11 -2411|223344556677885f5f5f5f5f5f5f 64 plan9 ANDL $0x11, AL -2511223344|556677885f5f5f5f5f5f5f 32 intel and eax, 0x44332211 -2511223344|556677885f5f5f5f5f5f5f 32 plan9 ANDL $0x44332211, AX -2511223344|556677885f5f5f5f5f5f5f 64 gnu and $0x44332211,%eax -2511223344|556677885f5f5f5f5f5f5f 64 intel and eax, 0x44332211 -2511223344|556677885f5f5f5f5f5f5f 64 plan9 ANDL $0x44332211, AX -266e|11223344556677885f5f5f5f5f5f 32 intel outsb es -266e|11223344556677885f5f5f5f5f5f 32 plan9 OUTSB ES:0(SI), DX -266e|11223344556677885f5f5f5f5f5f 64 gnu outsb %ds:%es:(%rsi),(%dx) -266e|11223344556677885f5f5f5f5f5f 64 intel outsb -266e|11223344556677885f5f5f5f5f5f 64 plan9 ES OUTSB DS:0(SI), DX -267011|223344556677885f5f5f5f5f5f 32 intel jo .+0x11 -267011|223344556677885f5f5f5f5f5f 32 plan9 ES JO .+17 -267011|223344556677885f5f5f5f5f5f 64 gnu es jo .+0x11 -267011|223344556677885f5f5f5f5f5f 64 intel jo .+0x11 -267011|223344556677885f5f5f5f5f5f 64 plan9 ES JO .+17 -26a01122334455667788|5f5f5f5f5f5f 64 gnu mov %es:-0x778899aabbccddef,%al -26a01122334455667788|5f5f5f5f5f5f 64 intel mov al, byte ptr [0x8877665544332211] -26a01122334455667788|5f5f5f5f5f5f 64 plan9 ES MOVB -0x778899aabbccddef, AL -26a011223344|556677885f5f5f5f5f5f 32 intel mov al, byte ptr es:[0x44332211] -26a011223344|556677885f5f5f5f5f5f 32 plan9 MOVB ES:0x44332211, AL -26|8211223344556677885f5f5f5f5f5f 32 intel es -26|8211223344556677885f5f5f5f5f5f 32 plan9 ES Op(0) -26|8211223344556677885f5f5f5f5f5f 64 gnu es -26|8211223344556677885f5f5f5f5f5f 64 intel es -26|8211223344556677885f5f5f5f5f5f 64 plan9 ES Op(0) -27|11223344556677885f5f5f5f5f5f5f 32 intel daa -27|11223344556677885f5f5f5f5f5f5f 32 plan9 DAA -27|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -27|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -27|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -2811|223344556677885f5f5f5f5f5f5f 32 intel sub byte ptr [ecx], dl -2811|223344556677885f5f5f5f5f5f5f 32 plan9 SUBB DL, 0(CX) -2811|223344556677885f5f5f5f5f5f5f 64 gnu sub %dl,(%rcx) -2811|223344556677885f5f5f5f5f5f5f 64 intel sub byte ptr [rcx], dl -2811|223344556677885f5f5f5f5f5f5f 64 plan9 SUBB DL, 0(CX) -2911|223344556677885f5f5f5f5f5f5f 32 intel sub dword ptr [ecx], edx -2911|223344556677885f5f5f5f5f5f5f 32 plan9 SUBL DX, 0(CX) -2911|223344556677885f5f5f5f5f5f5f 64 gnu sub %edx,(%rcx) -2911|223344556677885f5f5f5f5f5f5f 64 intel sub dword ptr [rcx], edx -2911|223344556677885f5f5f5f5f5f5f 64 plan9 SUBL DX, 0(CX) -2a11|223344556677885f5f5f5f5f5f5f 32 intel sub dl, byte ptr [ecx] -2a11|223344556677885f5f5f5f5f5f5f 32 plan9 SUBB 0(CX), DL -2a11|223344556677885f5f5f5f5f5f5f 64 gnu sub (%rcx),%dl -2a11|223344556677885f5f5f5f5f5f5f 64 intel sub dl, byte ptr [rcx] -2a11|223344556677885f5f5f5f5f5f5f 64 plan9 SUBB 0(CX), DL -2b11|223344556677885f5f5f5f5f5f5f 32 intel sub edx, dword ptr [ecx] -2b11|223344556677885f5f5f5f5f5f5f 32 plan9 SUBL 0(CX), DX -2b11|223344556677885f5f5f5f5f5f5f 64 gnu sub (%rcx),%edx -2b11|223344556677885f5f5f5f5f5f5f 64 intel sub edx, dword ptr [rcx] -2b11|223344556677885f5f5f5f5f5f5f 64 plan9 SUBL 0(CX), DX -2c11|223344556677885f5f5f5f5f5f5f 32 intel sub al, 0x11 -2c11|223344556677885f5f5f5f5f5f5f 32 plan9 SUBL $0x11, AL -2c11|223344556677885f5f5f5f5f5f5f 64 gnu sub $0x11,%al -2c11|223344556677885f5f5f5f5f5f5f 64 intel sub al, 0x11 -2c11|223344556677885f5f5f5f5f5f5f 64 plan9 SUBL $0x11, AL -2d11223344|556677885f5f5f5f5f5f5f 32 intel sub eax, 0x44332211 -2d11223344|556677885f5f5f5f5f5f5f 32 plan9 SUBL $0x44332211, AX -2d11223344|556677885f5f5f5f5f5f5f 64 gnu sub $0x44332211,%eax -2d11223344|556677885f5f5f5f5f5f5f 64 intel sub eax, 0x44332211 -2d11223344|556677885f5f5f5f5f5f5f 64 plan9 SUBL $0x44332211, AX -2f|11223344556677885f5f5f5f5f5f5f 32 intel das -2f|11223344556677885f5f5f5f5f5f5f 32 plan9 DAS -2f|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -2f|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -2f|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -3011|223344556677885f5f5f5f5f5f5f 32 intel xor byte ptr [ecx], dl -3011|223344556677885f5f5f5f5f5f5f 32 plan9 XORB DL, 0(CX) -3011|223344556677885f5f5f5f5f5f5f 64 gnu xor %dl,(%rcx) -3011|223344556677885f5f5f5f5f5f5f 64 intel xor byte ptr [rcx], dl -3011|223344556677885f5f5f5f5f5f5f 64 plan9 XORB DL, 0(CX) -3111|223344556677885f5f5f5f5f5f5f 32 intel xor dword ptr [ecx], edx -3111|223344556677885f5f5f5f5f5f5f 32 plan9 XORL DX, 0(CX) -3111|223344556677885f5f5f5f5f5f5f 64 gnu xor %edx,(%rcx) -3111|223344556677885f5f5f5f5f5f5f 64 intel xor dword ptr [rcx], edx -3111|223344556677885f5f5f5f5f5f5f 64 plan9 XORL DX, 0(CX) -3211|223344556677885f5f5f5f5f5f5f 32 intel xor dl, byte ptr [ecx] -3211|223344556677885f5f5f5f5f5f5f 32 plan9 XORB 0(CX), DL -3211|223344556677885f5f5f5f5f5f5f 64 gnu xor (%rcx),%dl -3211|223344556677885f5f5f5f5f5f5f 64 intel xor dl, byte ptr [rcx] -3211|223344556677885f5f5f5f5f5f5f 64 plan9 XORB 0(CX), DL -3311|223344556677885f5f5f5f5f5f5f 32 intel xor edx, dword ptr [ecx] -3311|223344556677885f5f5f5f5f5f5f 32 plan9 XORL 0(CX), DX -3311|223344556677885f5f5f5f5f5f5f 64 gnu xor (%rcx),%edx -3311|223344556677885f5f5f5f5f5f5f 64 intel xor edx, dword ptr [rcx] -3311|223344556677885f5f5f5f5f5f5f 64 plan9 XORL 0(CX), DX -3411|223344556677885f5f5f5f5f5f5f 32 intel xor al, 0x11 -3411|223344556677885f5f5f5f5f5f5f 32 plan9 XORL $0x11, AL -3411|223344556677885f5f5f5f5f5f5f 64 gnu xor $0x11,%al -3411|223344556677885f5f5f5f5f5f5f 64 intel xor al, 0x11 -3411|223344556677885f5f5f5f5f5f5f 64 plan9 XORL $0x11, AL -3511223344|556677885f5f5f5f5f5f5f 32 intel xor eax, 0x44332211 -3511223344|556677885f5f5f5f5f5f5f 32 plan9 XORL $0x44332211, AX -3511223344|556677885f5f5f5f5f5f5f 64 gnu xor $0x44332211,%eax -3511223344|556677885f5f5f5f5f5f5f 64 intel xor eax, 0x44332211 -3511223344|556677885f5f5f5f5f5f5f 64 plan9 XORL $0x44332211, AX -3667f3660f2ac0|11223344556677885f 32 intel addr16 cvtsi2ss xmm0, eax -3667f3660f2ac0|11223344556677885f 32 plan9 CVTSI2SSW AX, X0 -3667f3660f2ac0|11223344556677885f 64 gnu ss addr32 cvtsi2ss %ax,%xmm0 -3667f3660f2ac0|11223344556677885f 64 intel addr32 cvtsi2ss xmm0, eax -3667f3660f2ac0|11223344556677885f 64 plan9 CVTSI2SSW AX, X0 -36|67f3660ff7c011223344556677885f 64 gnu ss -36|f0f2f33e66f066f2f33e3666818411 32 intel ss -36|f0f2f33e66f066f2f33e3666818411 32 plan9 SS Op(0) -36|f0f2f33e66f066f2f33e3666818411 64 gnu ss -36|f0f2f33e66f066f2f33e3666818411 64 intel ss -36|f0f2f33e66f066f2f33e3666818411 64 plan9 SS Op(0) -36|f2f33ef0f78411223344556677885f 32 intel ss -36|f2f33ef0f78411223344556677885f 32 plan9 SS Op(0) -36|f2f33ef0f78411223344556677885f 64 gnu ss -36|f2f33ef0f78411223344556677885f 64 intel ss -36|f2f33ef0f78411223344556677885f 64 plan9 SS Op(0) -37|11223344556677885f5f5f5f5f5f5f 32 intel aaa -37|11223344556677885f5f5f5f5f5f5f 32 plan9 AAA -37|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -37|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -37|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -3811|223344556677885f5f5f5f5f5f5f 32 intel cmp byte ptr [ecx], dl -3811|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB DL, 0(CX) -3811|223344556677885f5f5f5f5f5f5f 64 gnu cmp %dl,(%rcx) -3811|223344556677885f5f5f5f5f5f5f 64 intel cmp byte ptr [rcx], dl -3811|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB DL, 0(CX) -3911|223344556677885f5f5f5f5f5f5f 32 intel cmp dword ptr [ecx], edx -3911|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL DX, 0(CX) -3911|223344556677885f5f5f5f5f5f5f 64 gnu cmp %edx,(%rcx) -3911|223344556677885f5f5f5f5f5f5f 64 intel cmp dword ptr [rcx], edx -3911|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL DX, 0(CX) -3a11|223344556677885f5f5f5f5f5f5f 32 intel cmp dl, byte ptr [ecx] -3a11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPB 0(CX), DL -3a11|223344556677885f5f5f5f5f5f5f 64 gnu cmp (%rcx),%dl -3a11|223344556677885f5f5f5f5f5f5f 64 intel cmp dl, byte ptr [rcx] -3a11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPB 0(CX), DL -3b11|223344556677885f5f5f5f5f5f5f 32 intel cmp edx, dword ptr [ecx] -3b11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL 0(CX), DX -3b11|223344556677885f5f5f5f5f5f5f 64 gnu cmp (%rcx),%edx -3b11|223344556677885f5f5f5f5f5f5f 64 intel cmp edx, dword ptr [rcx] -3b11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL 0(CX), DX -3c11|223344556677885f5f5f5f5f5f5f 32 intel cmp al, 0x11 -3c11|223344556677885f5f5f5f5f5f5f 32 plan9 CMPL $0x11, AL -3c11|223344556677885f5f5f5f5f5f5f 64 gnu cmp $0x11,%al -3c11|223344556677885f5f5f5f5f5f5f 64 intel cmp al, 0x11 -3c11|223344556677885f5f5f5f5f5f5f 64 plan9 CMPL $0x11, AL -3d11223344|556677885f5f5f5f5f5f5f 32 intel cmp eax, 0x44332211 -3d11223344|556677885f5f5f5f5f5f5f 32 plan9 CMPL $0x44332211, AX -3d11223344|556677885f5f5f5f5f5f5f 64 gnu cmp $0x44332211,%eax -3d11223344|556677885f5f5f5f5f5f5f 64 intel cmp eax, 0x44332211 -3d11223344|556677885f5f5f5f5f5f5f 64 plan9 CMPL $0x44332211, AX -3e67e011|223344556677885f5f5f5f5f 32 intel addr16 loopne .+0x11 -3e67e011|223344556677885f5f5f5f5f 32 plan9 LOOPNE .+17 -3e67e011|223344556677885f5f5f5f5f 64 gnu loopne,pt .+0x11 -3e67e011|223344556677885f5f5f5f5f 64 intel addr32 loopne .+0x11 -3e67e011|223344556677885f5f5f5f5f 64 plan9 LOOPNE .+17 -3ef367660f38f011|223344556677885f 32 intel movbe dx, word ptr [bx+di*1] -3ef367660f38f011|223344556677885f 32 plan9 REP; MOVBE DS:0(BX)(DI*1), DX -3ef367660f38f011|223344556677885f 64 gnu rep movbe %ds:(%ecx),%dx -3ef367660f38f011|223344556677885f 64 intel movbe dx, word ptr [ecx] -3ef367660f38f011|223344556677885f 64 plan9 REP; MOVBE 0(CX), DX -3f|11223344556677885f5f5f5f5f5f5f 32 intel aas -3f|11223344556677885f5f5f5f5f5f5f 32 plan9 AAS -3f|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -3f|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -3f|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -4040|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -4040|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -4040|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -4048|11223344556677885f5f5f5f5f5f 64 gnu error: unrecognized instruction -4048|11223344556677885f5f5f5f5f5f 64 intel error: unrecognized instruction -4048|11223344556677885f5f5f5f5f5f 64 plan9 error: unrecognized instruction -40|11223344556677885f5f5f5f5f5f5f 32 intel inc eax -40|11223344556677885f5f5f5f5f5f5f 32 plan9 INCL AX -480100|11223344556677885f5f5f5f5f 64 gnu add %rax,(%rax) -480100|11223344556677885f5f5f5f5f 64 intel add qword ptr [rax], rax -480100|11223344556677885f5f5f5f5f 64 plan9 ADDQ AX, 0(AX) -480311|223344556677885f5f5f5f5f5f 64 gnu add (%rcx),%rdx -480311|223344556677885f5f5f5f5f5f 64 intel add rdx, qword ptr [rcx] -480311|223344556677885f5f5f5f5f5f 64 plan9 ADDQ 0(CX), DX -480511223344|556677885f5f5f5f5f5f 64 gnu add $0x44332211,%rax -480511223344|556677885f5f5f5f5f5f 64 intel add rax, 0x44332211 -480511223344|556677885f5f5f5f5f5f 64 plan9 ADDQ $0x44332211, AX -480911|223344556677885f5f5f5f5f5f 64 gnu or %rdx,(%rcx) -480911|223344556677885f5f5f5f5f5f 64 intel or qword ptr [rcx], rdx -480911|223344556677885f5f5f5f5f5f 64 plan9 ORQ DX, 0(CX) -480b11|223344556677885f5f5f5f5f5f 64 gnu or (%rcx),%rdx -480b11|223344556677885f5f5f5f5f5f 64 intel or rdx, qword ptr [rcx] -480b11|223344556677885f5f5f5f5f5f 64 plan9 ORQ 0(CX), DX -480d11223344|556677885f5f5f5f5f5f 64 gnu or $0x44332211,%rax -480d11223344|556677885f5f5f5f5f5f 64 intel or rax, 0x44332211 -480d11223344|556677885f5f5f5f5f5f 64 plan9 ORQ $0x44332211, AX -480f0000|11223344556677885f5f5f5f 64 gnu sldt (%rax) -480f0000|11223344556677885f5f5f5f 64 intel sldt word ptr [rax] -480f0000|11223344556677885f5f5f5f 64 plan9 SLDT 0(AX) -480f0008|11223344556677885f5f5f5f 64 gnu str (%rax) -480f0008|11223344556677885f5f5f5f 64 intel str word ptr [rax] -480f0008|11223344556677885f5f5f5f 64 plan9 STR 0(AX) -480f0120|11223344556677885f5f5f5f 64 gnu smsw (%rax) -480f0120|11223344556677885f5f5f5f 64 intel smsw word ptr [rax] -480f0120|11223344556677885f5f5f5f 64 plan9 SMSW 0(AX) -480f0211|223344556677885f5f5f5f5f 64 gnu lar (%rcx),%rdx -480f0211|223344556677885f5f5f5f5f 64 intel lar rdx, word ptr [rcx] -480f0211|223344556677885f5f5f5f5f 64 plan9 LAR 0(CX), DX -480f0311|223344556677885f5f5f5f5f 64 gnu lsl (%rcx),%rdx -480f0311|223344556677885f5f5f5f5f 64 intel lsl rdx, word ptr [rcx] -480f0311|223344556677885f5f5f5f5f 64 plan9 LSL 0(CX), DX -480f35|11223344556677885f5f5f5f5f 64 gnu sysexit -480f35|11223344556677885f5f5f5f5f 64 intel sysexit -480f35|11223344556677885f5f5f5f5f 64 plan9 SYSEXIT -480f38f011|223344556677885f5f5f5f 64 gnu movbe (%rcx),%rdx -480f38f011|223344556677885f5f5f5f 64 intel movbe rdx, qword ptr [rcx] -480f38f011|223344556677885f5f5f5f 64 plan9 MOVBE 0(CX), DX -480f38f111|223344556677885f5f5f5f 64 gnu movbe %rdx,(%rcx) -480f38f111|223344556677885f5f5f5f 64 intel movbe qword ptr [rcx], rdx -480f38f111|223344556677885f5f5f5f 64 plan9 MOVBE DX, 0(CX) -480f4011|223344556677885f5f5f5f5f 64 gnu cmovo (%rcx),%rdx -480f4011|223344556677885f5f5f5f5f 64 intel cmovo rdx, qword ptr [rcx] -480f4011|223344556677885f5f5f5f5f 64 plan9 CMOVO 0(CX), DX -480f4111|223344556677885f5f5f5f5f 64 gnu cmovno (%rcx),%rdx -480f4111|223344556677885f5f5f5f5f 64 intel cmovno rdx, qword ptr [rcx] -480f4111|223344556677885f5f5f5f5f 64 plan9 CMOVNO 0(CX), DX -480f4211|223344556677885f5f5f5f5f 64 gnu cmovb (%rcx),%rdx -480f4211|223344556677885f5f5f5f5f 64 intel cmovb rdx, qword ptr [rcx] -480f4211|223344556677885f5f5f5f5f 64 plan9 CMOVB 0(CX), DX -480f4311|223344556677885f5f5f5f5f 64 gnu cmovae (%rcx),%rdx -480f4311|223344556677885f5f5f5f5f 64 intel cmovnb rdx, qword ptr [rcx] -480f4311|223344556677885f5f5f5f5f 64 plan9 CMOVAE 0(CX), DX -480f4411|223344556677885f5f5f5f5f 64 gnu cmove (%rcx),%rdx -480f4411|223344556677885f5f5f5f5f 64 intel cmovz rdx, qword ptr [rcx] -480f4411|223344556677885f5f5f5f5f 64 plan9 CMOVE 0(CX), DX -480f4511|223344556677885f5f5f5f5f 64 gnu cmovne (%rcx),%rdx -480f4511|223344556677885f5f5f5f5f 64 intel cmovnz rdx, qword ptr [rcx] -480f4511|223344556677885f5f5f5f5f 64 plan9 CMOVNE 0(CX), DX -480f4611|223344556677885f5f5f5f5f 64 gnu cmovbe (%rcx),%rdx -480f4611|223344556677885f5f5f5f5f 64 intel cmovbe rdx, qword ptr [rcx] -480f4611|223344556677885f5f5f5f5f 64 plan9 CMOVBE 0(CX), DX -480f4711|223344556677885f5f5f5f5f 64 gnu cmova (%rcx),%rdx -480f4711|223344556677885f5f5f5f5f 64 intel cmovnbe rdx, qword ptr [rcx] -480f4711|223344556677885f5f5f5f5f 64 plan9 CMOVA 0(CX), DX -480f4811|223344556677885f5f5f5f5f 64 gnu cmovs (%rcx),%rdx -480f4811|223344556677885f5f5f5f5f 64 intel cmovs rdx, qword ptr [rcx] -480f4811|223344556677885f5f5f5f5f 64 plan9 CMOVS 0(CX), DX -480f4911|223344556677885f5f5f5f5f 64 gnu cmovns (%rcx),%rdx -480f4911|223344556677885f5f5f5f5f 64 intel cmovns rdx, qword ptr [rcx] -480f4911|223344556677885f5f5f5f5f 64 plan9 CMOVNS 0(CX), DX -480f4a11|223344556677885f5f5f5f5f 64 gnu cmovp (%rcx),%rdx -480f4a11|223344556677885f5f5f5f5f 64 intel cmovp rdx, qword ptr [rcx] -480f4a11|223344556677885f5f5f5f5f 64 plan9 CMOVP 0(CX), DX -480f4b11|223344556677885f5f5f5f5f 64 gnu cmovnp (%rcx),%rdx -480f4b11|223344556677885f5f5f5f5f 64 intel cmovnp rdx, qword ptr [rcx] -480f4b11|223344556677885f5f5f5f5f 64 plan9 CMOVNP 0(CX), DX -480f4c11|223344556677885f5f5f5f5f 64 gnu cmovl (%rcx),%rdx -480f4c11|223344556677885f5f5f5f5f 64 intel cmovl rdx, qword ptr [rcx] -480f4c11|223344556677885f5f5f5f5f 64 plan9 CMOVL 0(CX), DX -480f4d11|223344556677885f5f5f5f5f 64 gnu cmovge (%rcx),%rdx -480f4d11|223344556677885f5f5f5f5f 64 intel cmovnl rdx, qword ptr [rcx] -480f4d11|223344556677885f5f5f5f5f 64 plan9 CMOVGE 0(CX), DX -480f4e11|223344556677885f5f5f5f5f 64 gnu cmovle (%rcx),%rdx -480f4e11|223344556677885f5f5f5f5f 64 intel cmovle rdx, qword ptr [rcx] -480f4e11|223344556677885f5f5f5f5f 64 plan9 CMOVLE 0(CX), DX -480f4f11|223344556677885f5f5f5f5f 64 gnu cmovg (%rcx),%rdx -480f4f11|223344556677885f5f5f5f5f 64 intel cmovnle rdx, qword ptr [rcx] -480f4f11|223344556677885f5f5f5f5f 64 plan9 CMOVG 0(CX), DX -480f6e11|223344556677885f5f5f5f5f 64 gnu movq (%rcx),%mm2 -480f6e11|223344556677885f5f5f5f5f 64 intel movq mmx2, qword ptr [rcx] -480f6e11|223344556677885f5f5f5f5f 64 plan9 MOVQ 0(CX), M2 -480f7e11|223344556677885f5f5f5f5f 64 gnu movq %mm2,(%rcx) -480f7e11|223344556677885f5f5f5f5f 64 intel movq qword ptr [rcx], mmx2 -480f7e11|223344556677885f5f5f5f5f 64 plan9 MOVQ M2, 0(CX) -480f8011223344|556677885f5f5f5f5f 64 gnu jo .+0x44332211 -480f8011223344|556677885f5f5f5f5f 64 intel jo .+0x44332211 -480f8011223344|556677885f5f5f5f5f 64 plan9 JO .+1144201745 -480f8111223344|556677885f5f5f5f5f 64 gnu jno .+0x44332211 -480f8111223344|556677885f5f5f5f5f 64 intel jno .+0x44332211 -480f8111223344|556677885f5f5f5f5f 64 plan9 JNO .+1144201745 -480f8211223344|556677885f5f5f5f5f 64 gnu jb .+0x44332211 -480f8211223344|556677885f5f5f5f5f 64 intel jb .+0x44332211 -480f8211223344|556677885f5f5f5f5f 64 plan9 JB .+1144201745 -480f8311223344|556677885f5f5f5f5f 64 gnu jae .+0x44332211 -480f8311223344|556677885f5f5f5f5f 64 intel jnb .+0x44332211 -480f8311223344|556677885f5f5f5f5f 64 plan9 JAE .+1144201745 -480f8411223344|556677885f5f5f5f5f 64 gnu je .+0x44332211 -480f8411223344|556677885f5f5f5f5f 64 intel jz .+0x44332211 -480f8411223344|556677885f5f5f5f5f 64 plan9 JE .+1144201745 -480f8511223344|556677885f5f5f5f5f 64 gnu jne .+0x44332211 -480f8511223344|556677885f5f5f5f5f 64 intel jnz .+0x44332211 -480f8511223344|556677885f5f5f5f5f 64 plan9 JNE .+1144201745 -480f8611223344|556677885f5f5f5f5f 64 gnu jbe .+0x44332211 -480f8611223344|556677885f5f5f5f5f 64 intel jbe .+0x44332211 -480f8611223344|556677885f5f5f5f5f 64 plan9 JBE .+1144201745 -480f8711223344|556677885f5f5f5f5f 64 gnu ja .+0x44332211 -480f8711223344|556677885f5f5f5f5f 64 intel jnbe .+0x44332211 -480f8711223344|556677885f5f5f5f5f 64 plan9 JA .+1144201745 -480f8811223344|556677885f5f5f5f5f 64 gnu js .+0x44332211 -480f8811223344|556677885f5f5f5f5f 64 intel js .+0x44332211 -480f8811223344|556677885f5f5f5f5f 64 plan9 JS .+1144201745 -480f8911223344|556677885f5f5f5f5f 64 gnu jns .+0x44332211 -480f8911223344|556677885f5f5f5f5f 64 intel jns .+0x44332211 -480f8911223344|556677885f5f5f5f5f 64 plan9 JNS .+1144201745 -480f8a11223344|556677885f5f5f5f5f 64 gnu jp .+0x44332211 -480f8a11223344|556677885f5f5f5f5f 64 intel jp .+0x44332211 -480f8a11223344|556677885f5f5f5f5f 64 plan9 JP .+1144201745 -480f8b11223344|556677885f5f5f5f5f 64 gnu jnp .+0x44332211 -480f8b11223344|556677885f5f5f5f5f 64 intel jnp .+0x44332211 -480f8b11223344|556677885f5f5f5f5f 64 plan9 JNP .+1144201745 -480f8c11223344|556677885f5f5f5f5f 64 gnu jl .+0x44332211 -480f8c11223344|556677885f5f5f5f5f 64 intel jl .+0x44332211 -480f8c11223344|556677885f5f5f5f5f 64 plan9 JL .+1144201745 -480f8d11223344|556677885f5f5f5f5f 64 gnu jge .+0x44332211 -480f8d11223344|556677885f5f5f5f5f 64 intel jnl .+0x44332211 -480f8d11223344|556677885f5f5f5f5f 64 plan9 JGE .+1144201745 -480f8e11223344|556677885f5f5f5f5f 64 gnu jle .+0x44332211 -480f8e11223344|556677885f5f5f5f5f 64 intel jle .+0x44332211 -480f8e11223344|556677885f5f5f5f5f 64 plan9 JLE .+1144201745 -480f8f11223344|556677885f5f5f5f5f 64 gnu jg .+0x44332211 -480f8f11223344|556677885f5f5f5f5f 64 intel jnle .+0x44332211 -480f8f11223344|556677885f5f5f5f5f 64 plan9 JG .+1144201745 -480fa1|11223344556677885f5f5f5f5f 64 gnu popq %fs -480fa1|11223344556677885f5f5f5f5f 64 intel pop fs -480fa1|11223344556677885f5f5f5f5f 64 plan9 POPQ FS -480fa311|223344556677885f5f5f5f5f 64 gnu bt %rdx,(%rcx) -480fa311|223344556677885f5f5f5f5f 64 intel bt qword ptr [rcx], rdx -480fa311|223344556677885f5f5f5f5f 64 plan9 BTQ DX, 0(CX) -480fa41122|3344556677885f5f5f5f5f 64 gnu shld $0x22,%rdx,(%rcx) -480fa41122|3344556677885f5f5f5f5f 64 intel shld qword ptr [rcx], rdx, 0x22 -480fa41122|3344556677885f5f5f5f5f 64 plan9 SHLDQ $0x22, DX, 0(CX) -480fa511|223344556677885f5f5f5f5f 64 gnu shld %cl,%rdx,(%rcx) -480fa511|223344556677885f5f5f5f5f 64 intel shld qword ptr [rcx], rdx, cl -480fa511|223344556677885f5f5f5f5f 64 plan9 SHLDQ CL, DX, 0(CX) -480fa9|11223344556677885f5f5f5f5f 64 gnu popq %gs -480fa9|11223344556677885f5f5f5f5f 64 intel pop gs -480fa9|11223344556677885f5f5f5f5f 64 plan9 POPQ GS -480fab11|223344556677885f5f5f5f5f 64 gnu bts %rdx,(%rcx) -480fab11|223344556677885f5f5f5f5f 64 intel bts qword ptr [rcx], rdx -480fab11|223344556677885f5f5f5f5f 64 plan9 BTSQ DX, 0(CX) -480fac1122|3344556677885f5f5f5f5f 64 gnu shrd $0x22,%rdx,(%rcx) -480fac1122|3344556677885f5f5f5f5f 64 intel shrd qword ptr [rcx], rdx, 0x22 -480fac1122|3344556677885f5f5f5f5f 64 plan9 SHRDQ $0x22, DX, 0(CX) -480fad11|223344556677885f5f5f5f5f 64 gnu shrd %cl,%rdx,(%rcx) -480fad11|223344556677885f5f5f5f5f 64 intel shrd qword ptr [rcx], rdx, cl -480fad11|223344556677885f5f5f5f5f 64 plan9 SHRDQ CL, DX, 0(CX) -480fae00|11223344556677885f5f5f5f 64 gnu fxsave64 (%rax) -480fae00|11223344556677885f5f5f5f 64 intel fxsave64 ptr [rax] -480fae00|11223344556677885f5f5f5f 64 plan9 FXSAVE64 0(AX) -480fae08|11223344556677885f5f5f5f 64 gnu fxrstor64 (%rax) -480fae08|11223344556677885f5f5f5f 64 intel fxrstor64 ptr [rax] -480fae08|11223344556677885f5f5f5f 64 plan9 FXRSTOR64 0(AX) -480fae20|11223344556677885f5f5f5f 64 gnu xsave64 (%rax) -480fae20|11223344556677885f5f5f5f 64 intel xsave64 ptr [rax] -480fae20|11223344556677885f5f5f5f 64 plan9 XSAVE64 0(AX) -480fae28|11223344556677885f5f5f5f 64 gnu xrstor64 (%rax) -480fae28|11223344556677885f5f5f5f 64 intel xrstor64 ptr [rax] -480fae28|11223344556677885f5f5f5f 64 plan9 XRSTOR64 0(AX) -480fae30|11223344556677885f5f5f5f 64 gnu xsaveopt64 (%rax) -480fae30|11223344556677885f5f5f5f 64 intel xsaveopt64 ptr [rax] -480fae30|11223344556677885f5f5f5f 64 plan9 XSAVEOPT64 0(AX) -480faf11|223344556677885f5f5f5f5f 64 gnu imul (%rcx),%rdx -480faf11|223344556677885f5f5f5f5f 64 intel imul rdx, qword ptr [rcx] -480faf11|223344556677885f5f5f5f5f 64 plan9 IMULQ 0(CX), DX -480fb111|223344556677885f5f5f5f5f 64 gnu cmpxchg %rdx,(%rcx) -480fb111|223344556677885f5f5f5f5f 64 intel cmpxchg qword ptr [rcx], rdx -480fb111|223344556677885f5f5f5f5f 64 plan9 CMPXCHGQ DX, 0(CX) -480fb211|223344556677885f5f5f5f5f 64 gnu lss (%rcx),%rdx -480fb211|223344556677885f5f5f5f5f 64 intel lss rdx, ptr [rcx] -480fb211|223344556677885f5f5f5f5f 64 plan9 LSS 0(CX), DX -480fb311|223344556677885f5f5f5f5f 64 gnu btr %rdx,(%rcx) -480fb311|223344556677885f5f5f5f5f 64 intel btr qword ptr [rcx], rdx -480fb311|223344556677885f5f5f5f5f 64 plan9 BTRQ DX, 0(CX) -480fb411|223344556677885f5f5f5f5f 64 gnu lfs (%rcx),%rdx -480fb411|223344556677885f5f5f5f5f 64 intel lfs rdx, ptr [rcx] -480fb411|223344556677885f5f5f5f5f 64 plan9 LFS 0(CX), DX -480fb511|223344556677885f5f5f5f5f 64 gnu lgs (%rcx),%rdx -480fb511|223344556677885f5f5f5f5f 64 intel lgs rdx, ptr [rcx] -480fb511|223344556677885f5f5f5f5f 64 plan9 LGS 0(CX), DX -480fb611|223344556677885f5f5f5f5f 64 gnu movzbq (%rcx),%rdx -480fb611|223344556677885f5f5f5f5f 64 intel movzx rdx, byte ptr [rcx] -480fb611|223344556677885f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -480fb711|223344556677885f5f5f5f5f 64 gnu movzwq (%rcx),%rdx -480fb711|223344556677885f5f5f5f5f 64 intel movzx rdx, word ptr [rcx] -480fb711|223344556677885f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -480fba2011|223344556677885f5f5f5f 64 gnu btq $0x11,(%rax) -480fba2011|223344556677885f5f5f5f 64 intel bt qword ptr [rax], 0x11 -480fba2011|223344556677885f5f5f5f 64 plan9 BTQ $0x11, 0(AX) -480fba2811|223344556677885f5f5f5f 64 gnu btsq $0x11,(%rax) -480fba2811|223344556677885f5f5f5f 64 intel bts qword ptr [rax], 0x11 -480fba2811|223344556677885f5f5f5f 64 plan9 BTSQ $0x11, 0(AX) -480fba3011|223344556677885f5f5f5f 64 gnu btrq $0x11,(%rax) -480fba3011|223344556677885f5f5f5f 64 intel btr qword ptr [rax], 0x11 -480fba3011|223344556677885f5f5f5f 64 plan9 BTRQ $0x11, 0(AX) -480fba3811|223344556677885f5f5f5f 64 gnu btcq $0x11,(%rax) -480fba3811|223344556677885f5f5f5f 64 intel btc qword ptr [rax], 0x11 -480fba3811|223344556677885f5f5f5f 64 plan9 BTCQ $0x11, 0(AX) -480fbb11|223344556677885f5f5f5f5f 64 gnu btc %rdx,(%rcx) -480fbb11|223344556677885f5f5f5f5f 64 intel btc qword ptr [rcx], rdx -480fbb11|223344556677885f5f5f5f5f 64 plan9 BTCQ DX, 0(CX) -480fbc11|223344556677885f5f5f5f5f 64 gnu bsf (%rcx),%rdx -480fbc11|223344556677885f5f5f5f5f 64 intel bsf rdx, qword ptr [rcx] -480fbc11|223344556677885f5f5f5f5f 64 plan9 BSFQ 0(CX), DX -480fbd11|223344556677885f5f5f5f5f 64 gnu bsr (%rcx),%rdx -480fbd11|223344556677885f5f5f5f5f 64 intel bsr rdx, qword ptr [rcx] -480fbd11|223344556677885f5f5f5f5f 64 plan9 BSRQ 0(CX), DX -480fbe11|223344556677885f5f5f5f5f 64 gnu movsbq (%rcx),%rdx -480fbe11|223344556677885f5f5f5f5f 64 intel movsx rdx, byte ptr [rcx] -480fbe11|223344556677885f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -480fbf11|223344556677885f5f5f5f5f 64 gnu movswq (%rcx),%rdx -480fbf11|223344556677885f5f5f5f5f 64 intel movsx rdx, word ptr [rcx] -480fbf11|223344556677885f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -480fc111|223344556677885f5f5f5f5f 64 gnu xadd %rdx,(%rcx) -480fc111|223344556677885f5f5f5f5f 64 intel xadd qword ptr [rcx], rdx -480fc111|223344556677885f5f5f5f5f 64 plan9 XADDQ DX, 0(CX) -480fc311|223344556677885f5f5f5f5f 64 gnu movnti %rdx,(%rcx) -480fc311|223344556677885f5f5f5f5f 64 intel movnti qword ptr [rcx], rdx -480fc311|223344556677885f5f5f5f5f 64 plan9 MOVNTIQ DX, 0(CX) -480fc708|11223344556677885f5f5f5f 64 gnu cmpxchg16b (%rax) -480fc708|11223344556677885f5f5f5f 64 intel cmpxchg16b xmmword ptr [rax] -480fc708|11223344556677885f5f5f5f 64 plan9 CMPXCHG16B 0(AX) -480fc718|11223344556677885f5f5f5f 64 gnu xrstors64 (%rax) -480fc718|11223344556677885f5f5f5f 64 intel xrstors64 ptr [rax] -480fc718|11223344556677885f5f5f5f 64 plan9 XRSTORS64 0(AX) -480fc720|11223344556677885f5f5f5f 64 gnu xsavec64 (%rax) -480fc720|11223344556677885f5f5f5f 64 intel xsavec64 ptr [rax] -480fc720|11223344556677885f5f5f5f 64 plan9 XSAVEC64 0(AX) -480fc728|11223344556677885f5f5f5f 64 gnu xsaves64 (%rax) -480fc728|11223344556677885f5f5f5f 64 intel xsaves64 ptr [rax] -480fc728|11223344556677885f5f5f5f 64 plan9 XSAVES64 0(AX) -480fc730|11223344556677885f5f5f5f 64 gnu rdrand -480fc730|11223344556677885f5f5f5f 64 intel rdrand -480fc730|11223344556677885f5f5f5f 64 plan9 RDRAND -480fc8|11223344556677885f5f5f5f5f 64 gnu bswap %rax -480fc8|11223344556677885f5f5f5f5f 64 intel bswap rax -480fc8|11223344556677885f5f5f5f5f 64 plan9 BSWAP AX -481122|3344556677885f5f5f5f5f5f5f 64 gnu adc %rsp,(%rdx) -481122|3344556677885f5f5f5f5f5f5f 64 intel adc qword ptr [rdx], rsp -481122|3344556677885f5f5f5f5f5f5f 64 plan9 ADCQ SP, 0(DX) -481311|223344556677885f5f5f5f5f5f 64 gnu adc (%rcx),%rdx -481311|223344556677885f5f5f5f5f5f 64 intel adc rdx, qword ptr [rcx] -481311|223344556677885f5f5f5f5f5f 64 plan9 ADCQ 0(CX), DX -481511223344|556677885f5f5f5f5f5f 64 gnu adc $0x44332211,%rax -481511223344|556677885f5f5f5f5f5f 64 intel adc rax, 0x44332211 -481511223344|556677885f5f5f5f5f5f 64 plan9 ADCQ $0x44332211, AX -481911|223344556677885f5f5f5f5f5f 64 gnu sbb %rdx,(%rcx) -481911|223344556677885f5f5f5f5f5f 64 intel sbb qword ptr [rcx], rdx -481911|223344556677885f5f5f5f5f5f 64 plan9 SBBQ DX, 0(CX) -481b11|223344556677885f5f5f5f5f5f 64 gnu sbb (%rcx),%rdx -481b11|223344556677885f5f5f5f5f5f 64 intel sbb rdx, qword ptr [rcx] -481b11|223344556677885f5f5f5f5f5f 64 plan9 SBBQ 0(CX), DX -481d11223344|556677885f5f5f5f5f5f 64 gnu sbb $0x44332211,%rax -481d11223344|556677885f5f5f5f5f5f 64 intel sbb rax, 0x44332211 -481d11223344|556677885f5f5f5f5f5f 64 plan9 SBBQ $0x44332211, AX -482111|223344556677885f5f5f5f5f5f 64 gnu and %rdx,(%rcx) -482111|223344556677885f5f5f5f5f5f 64 intel and qword ptr [rcx], rdx -482111|223344556677885f5f5f5f5f5f 64 plan9 ANDQ DX, 0(CX) -482311|223344556677885f5f5f5f5f5f 64 gnu and (%rcx),%rdx -482311|223344556677885f5f5f5f5f5f 64 intel and rdx, qword ptr [rcx] -482311|223344556677885f5f5f5f5f5f 64 plan9 ANDQ 0(CX), DX -482511223344|556677885f5f5f5f5f5f 64 gnu and $0x44332211,%rax -482511223344|556677885f5f5f5f5f5f 64 intel and rax, 0x44332211 -482511223344|556677885f5f5f5f5f5f 64 plan9 ANDQ $0x44332211, AX -482911|223344556677885f5f5f5f5f5f 64 gnu sub %rdx,(%rcx) -482911|223344556677885f5f5f5f5f5f 64 intel sub qword ptr [rcx], rdx -482911|223344556677885f5f5f5f5f5f 64 plan9 SUBQ DX, 0(CX) -482b11|223344556677885f5f5f5f5f5f 64 gnu sub (%rcx),%rdx -482b11|223344556677885f5f5f5f5f5f 64 intel sub rdx, qword ptr [rcx] -482b11|223344556677885f5f5f5f5f5f 64 plan9 SUBQ 0(CX), DX -482d11223344|556677885f5f5f5f5f5f 64 gnu sub $0x44332211,%rax -482d11223344|556677885f5f5f5f5f5f 64 intel sub rax, 0x44332211 -482d11223344|556677885f5f5f5f5f5f 64 plan9 SUBQ $0x44332211, AX -483111|223344556677885f5f5f5f5f5f 64 gnu xor %rdx,(%rcx) -483111|223344556677885f5f5f5f5f5f 64 intel xor qword ptr [rcx], rdx -483111|223344556677885f5f5f5f5f5f 64 plan9 XORQ DX, 0(CX) -483311|223344556677885f5f5f5f5f5f 64 gnu xor (%rcx),%rdx -483311|223344556677885f5f5f5f5f5f 64 intel xor rdx, qword ptr [rcx] -483311|223344556677885f5f5f5f5f5f 64 plan9 XORQ 0(CX), DX -483511223344|556677885f5f5f5f5f5f 64 gnu xor $0x44332211,%rax -483511223344|556677885f5f5f5f5f5f 64 intel xor rax, 0x44332211 -483511223344|556677885f5f5f5f5f5f 64 plan9 XORQ $0x44332211, AX -483911|223344556677885f5f5f5f5f5f 64 gnu cmp %rdx,(%rcx) -483911|223344556677885f5f5f5f5f5f 64 intel cmp qword ptr [rcx], rdx -483911|223344556677885f5f5f5f5f5f 64 plan9 CMPQ DX, 0(CX) -483b11|223344556677885f5f5f5f5f5f 64 gnu cmp (%rcx),%rdx -483b11|223344556677885f5f5f5f5f5f 64 intel cmp rdx, qword ptr [rcx] -483b11|223344556677885f5f5f5f5f5f 64 plan9 CMPQ 0(CX), DX -483d11223344|556677885f5f5f5f5f5f 64 gnu cmp $0x44332211,%rax -483d11223344|556677885f5f5f5f5f5f 64 intel cmp rax, 0x44332211 -483d11223344|556677885f5f5f5f5f5f 64 plan9 CMPQ $0x44332211, AX -4850|11223344556677885f5f5f5f5f5f 64 gnu push %rax -4850|11223344556677885f5f5f5f5f5f 64 intel push rax -4850|11223344556677885f5f5f5f5f5f 64 plan9 PUSHQ AX -4858|11223344556677885f5f5f5f5f5f 64 gnu pop %rax -4858|11223344556677885f5f5f5f5f5f 64 intel pop rax -4858|11223344556677885f5f5f5f5f5f 64 plan9 POPQ AX -486311|223344556677885f5f5f5f5f5f 64 gnu movsxd (%rcx),%rdx -486311|223344556677885f5f5f5f5f5f 64 intel movsxd rdx, dword ptr [rcx] -486311|223344556677885f5f5f5f5f5f 64 plan9 MOVSXD 0(CX), DX -486811223344|556677885f5f5f5f5f5f 64 gnu pushq $0x44332211 -486811223344|556677885f5f5f5f5f5f 64 intel push 0x44332211 -486811223344|556677885f5f5f5f5f5f 64 plan9 PUSHQ $0x44332211 -48691122334455|6677885f5f5f5f5f5f 64 gnu imul $0x55443322,(%rcx),%rdx -48691122334455|6677885f5f5f5f5f5f 64 intel imul rdx, qword ptr [rcx], 0x55443322 -48691122334455|6677885f5f5f5f5f5f 64 plan9 IMULQ $0x55443322, 0(CX), DX -486b1122|3344556677885f5f5f5f5f5f 64 gnu imul $0x22,(%rcx),%rdx -486b1122|3344556677885f5f5f5f5f5f 64 intel imul rdx, qword ptr [rcx], 0x22 -486b1122|3344556677885f5f5f5f5f5f 64 plan9 IMULQ $0x22, 0(CX), DX -486d|11223344556677885f5f5f5f5f5f 64 gnu insl (%dx),%es:(%rdi) -486d|11223344556677885f5f5f5f5f5f 64 intel insd -486d|11223344556677885f5f5f5f5f5f 64 plan9 INSD DX, ES:0(DI) -486f|11223344556677885f5f5f5f5f5f 64 gnu outsl %ds:(%rsi),(%dx) -486f|11223344556677885f5f5f5f5f5f 64 intel outsd -486f|11223344556677885f5f5f5f5f5f 64 plan9 OUTSD DS:0(SI), DX -48810011223344|556677885f5f5f5f5f 64 gnu addq $0x44332211,(%rax) -48810011223344|556677885f5f5f5f5f 64 intel add qword ptr [rax], 0x44332211 -48810011223344|556677885f5f5f5f5f 64 plan9 ADDQ $0x44332211, 0(AX) -48810811223344|556677885f5f5f5f5f 64 gnu orq $0x44332211,(%rax) -48810811223344|556677885f5f5f5f5f 64 intel or qword ptr [rax], 0x44332211 -48810811223344|556677885f5f5f5f5f 64 plan9 ORQ $0x44332211, 0(AX) -48811122334455|6677885f5f5f5f5f5f 64 gnu adcq $0x55443322,(%rcx) -48811122334455|6677885f5f5f5f5f5f 64 intel adc qword ptr [rcx], 0x55443322 -48811122334455|6677885f5f5f5f5f5f 64 plan9 ADCQ $0x55443322, 0(CX) -48811811223344|556677885f5f5f5f5f 64 gnu sbbq $0x44332211,(%rax) -48811811223344|556677885f5f5f5f5f 64 intel sbb qword ptr [rax], 0x44332211 -48811811223344|556677885f5f5f5f5f 64 plan9 SBBQ $0x44332211, 0(AX) -48812011223344|556677885f5f5f5f5f 64 gnu andq $0x44332211,(%rax) -48812011223344|556677885f5f5f5f5f 64 intel and qword ptr [rax], 0x44332211 -48812011223344|556677885f5f5f5f5f 64 plan9 ANDQ $0x44332211, 0(AX) -48812811223344|556677885f5f5f5f5f 64 gnu subq $0x44332211,(%rax) -48812811223344|556677885f5f5f5f5f 64 intel sub qword ptr [rax], 0x44332211 -48812811223344|556677885f5f5f5f5f 64 plan9 SUBQ $0x44332211, 0(AX) -48813011223344|556677885f5f5f5f5f 64 gnu xorq $0x44332211,(%rax) -48813011223344|556677885f5f5f5f5f 64 intel xor qword ptr [rax], 0x44332211 -48813011223344|556677885f5f5f5f5f 64 plan9 XORQ $0x44332211, 0(AX) -48813811223344|556677885f5f5f5f5f 64 gnu cmpq $0x44332211,(%rax) -48813811223344|556677885f5f5f5f5f 64 intel cmp qword ptr [rax], 0x44332211 -48813811223344|556677885f5f5f5f5f 64 plan9 CMPQ $0x44332211, 0(AX) -48830011|223344556677885f5f5f5f5f 64 gnu addq $0x11,(%rax) -48830011|223344556677885f5f5f5f5f 64 intel add qword ptr [rax], 0x11 -48830011|223344556677885f5f5f5f5f 64 plan9 ADDQ $0x11, 0(AX) -48830811|223344556677885f5f5f5f5f 64 gnu orq $0x11,(%rax) -48830811|223344556677885f5f5f5f5f 64 intel or qword ptr [rax], 0x11 -48830811|223344556677885f5f5f5f5f 64 plan9 ORQ $0x11, 0(AX) -48831122|3344556677885f5f5f5f5f5f 64 gnu adcq $0x22,(%rcx) -48831122|3344556677885f5f5f5f5f5f 64 intel adc qword ptr [rcx], 0x22 -48831122|3344556677885f5f5f5f5f5f 64 plan9 ADCQ $0x22, 0(CX) -48831811|223344556677885f5f5f5f5f 64 gnu sbbq $0x11,(%rax) -48831811|223344556677885f5f5f5f5f 64 intel sbb qword ptr [rax], 0x11 -48831811|223344556677885f5f5f5f5f 64 plan9 SBBQ $0x11, 0(AX) -48832011|223344556677885f5f5f5f5f 64 gnu andq $0x11,(%rax) -48832011|223344556677885f5f5f5f5f 64 intel and qword ptr [rax], 0x11 -48832011|223344556677885f5f5f5f5f 64 plan9 ANDQ $0x11, 0(AX) -48832811|223344556677885f5f5f5f5f 64 gnu subq $0x11,(%rax) -48832811|223344556677885f5f5f5f5f 64 intel sub qword ptr [rax], 0x11 -48832811|223344556677885f5f5f5f5f 64 plan9 SUBQ $0x11, 0(AX) -48833011|223344556677885f5f5f5f5f 64 gnu xorq $0x11,(%rax) -48833011|223344556677885f5f5f5f5f 64 intel xor qword ptr [rax], 0x11 -48833011|223344556677885f5f5f5f5f 64 plan9 XORQ $0x11, 0(AX) -48833811|223344556677885f5f5f5f5f 64 gnu cmpq $0x11,(%rax) -48833811|223344556677885f5f5f5f5f 64 intel cmp qword ptr [rax], 0x11 -48833811|223344556677885f5f5f5f5f 64 plan9 CMPQ $0x11, 0(AX) -488511|223344556677885f5f5f5f5f5f 64 gnu test %rdx,(%rcx) -488511|223344556677885f5f5f5f5f5f 64 intel test qword ptr [rcx], rdx -488511|223344556677885f5f5f5f5f5f 64 plan9 TESTQ DX, 0(CX) -488711|223344556677885f5f5f5f5f5f 64 gnu xchg %rdx,(%rcx) -488711|223344556677885f5f5f5f5f5f 64 intel xchg qword ptr [rcx], rdx -488711|223344556677885f5f5f5f5f5f 64 plan9 XCHGQ DX, 0(CX) -488911|223344556677885f5f5f5f5f5f 64 gnu mov %rdx,(%rcx) -488911|223344556677885f5f5f5f5f5f 64 intel mov qword ptr [rcx], rdx -488911|223344556677885f5f5f5f5f5f 64 plan9 MOVQ DX, 0(CX) -488b11|223344556677885f5f5f5f5f5f 64 gnu mov (%rcx),%rdx -488b11|223344556677885f5f5f5f5f5f 64 intel mov rdx, qword ptr [rcx] -488b11|223344556677885f5f5f5f5f5f 64 plan9 MOVQ 0(CX), DX -488c11|223344556677885f5f5f5f5f5f 64 gnu mov %ss,(%rcx) -488c11|223344556677885f5f5f5f5f5f 64 intel mov word ptr [rcx], ss -# MOVQ is probably more correct here (reads 16 bits of segment register, zero extends, writes 64 bits at CX) -488c11|223344556677885f5f5f5f5f5f 64 plan9 MOVW SS, 0(CX) -488d11|223344556677885f5f5f5f5f5f 64 gnu lea (%rcx),%rdx -488d11|223344556677885f5f5f5f5f5f 64 intel lea rdx, ptr [rcx] -488d11|223344556677885f5f5f5f5f5f 64 plan9 LEAQ 0(CX), DX -488e11|223344556677885f5f5f5f5f5f 64 gnu mov (%rcx),%ss -488e11|223344556677885f5f5f5f5f5f 64 intel mov ss, word ptr [rcx] -488e11|223344556677885f5f5f5f5f5f 64 plan9 MOVW 0(CX), SS -488f00|11223344556677885f5f5f5f5f 64 gnu popq (%rax) -488f00|11223344556677885f5f5f5f5f 64 intel pop qword ptr [rax] -488f00|11223344556677885f5f5f5f5f 64 plan9 POPQ 0(AX) -4891|11223344556677885f5f5f5f5f5f 64 gnu xchg %rax,%rcx -4891|11223344556677885f5f5f5f5f5f 64 intel xchg rcx, rax -4891|11223344556677885f5f5f5f5f5f 64 plan9 XCHGQ AX, CX -4898|11223344556677885f5f5f5f5f5f 64 gnu cdqe -4898|11223344556677885f5f5f5f5f5f 64 intel cdqe -4898|11223344556677885f5f5f5f5f5f 64 plan9 CDQE -4899|11223344556677885f5f5f5f5f5f 64 gnu cqto -4899|11223344556677885f5f5f5f5f5f 64 intel cqo -4899|11223344556677885f5f5f5f5f5f 64 plan9 CQO -489c|11223344556677885f5f5f5f5f5f 64 gnu pushfq -489c|11223344556677885f5f5f5f5f5f 64 intel pushfq -489c|11223344556677885f5f5f5f5f5f 64 plan9 PUSHFQ -489d|11223344556677885f5f5f5f5f5f 64 gnu popfq -489d|11223344556677885f5f5f5f5f5f 64 intel popfq -489d|11223344556677885f5f5f5f5f5f 64 plan9 POPFQ -48a01122334455667788|5f5f5f5f5f5f 64 gnu mov -0x778899aabbccddef,%al -48a01122334455667788|5f5f5f5f5f5f 64 intel mov al, byte ptr [0x8877665544332211] -48a01122334455667788|5f5f5f5f5f5f 64 plan9 MOVB -0x778899aabbccddef, AL -48a11122334455667788|5f5f5f5f5f5f 64 gnu mov -0x778899aabbccddef,%rax -48a11122334455667788|5f5f5f5f5f5f 64 intel mov rax, qword ptr [0x8877665544332211] -48a11122334455667788|5f5f5f5f5f5f 64 plan9 MOVQ -0x778899aabbccddef, AX -48a21122334455667788|5f5f5f5f5f5f 64 gnu mov %al,-0x778899aabbccddef -48a21122334455667788|5f5f5f5f5f5f 64 intel mov byte ptr [0x8877665544332211], al -48a21122334455667788|5f5f5f5f5f5f 64 plan9 MOVB AL, -0x778899aabbccddef -48a31122334455667788|5f5f5f5f5f5f 64 gnu mov %rax,-0x778899aabbccddef -48a31122334455667788|5f5f5f5f5f5f 64 intel mov qword ptr [0x8877665544332211], rax -48a31122334455667788|5f5f5f5f5f5f 64 plan9 MOVQ AX, -0x778899aabbccddef -48a5|11223344556677885f5f5f5f5f5f 64 gnu movsq %ds:(%rsi),%es:(%rdi) -48a5|11223344556677885f5f5f5f5f5f 64 intel movsq qword ptr [rdi], qword ptr [rsi] -48a5|11223344556677885f5f5f5f5f5f 64 plan9 MOVSQ DS:0(SI), ES:0(DI) -48a7|11223344556677885f5f5f5f5f5f 64 gnu cmpsq %es:(%rdi),%ds:(%rsi) -48a7|11223344556677885f5f5f5f5f5f 64 intel cmpsq qword ptr [rsi], qword ptr [rdi] -48a7|11223344556677885f5f5f5f5f5f 64 plan9 CMPSQ ES:0(DI), DS:0(SI) -48a911223344|556677885f5f5f5f5f5f 64 gnu test $0x44332211,%rax -48a911223344|556677885f5f5f5f5f5f 64 intel test rax, 0x44332211 -48a911223344|556677885f5f5f5f5f5f 64 plan9 TESTQ $0x44332211, AX -48ab|11223344556677885f5f5f5f5f5f 64 gnu stos %rax,%es:(%rdi) -48ab|11223344556677885f5f5f5f5f5f 64 intel stosq qword ptr [rdi] -48ab|11223344556677885f5f5f5f5f5f 64 plan9 STOSQ AX, ES:0(DI) -48ad|11223344556677885f5f5f5f5f5f 64 gnu lods %ds:(%rsi),%rax -48ad|11223344556677885f5f5f5f5f5f 64 intel lodsq qword ptr [rsi] -48ad|11223344556677885f5f5f5f5f5f 64 plan9 LODSQ DS:0(SI), AX -48af|11223344556677885f5f5f5f5f5f 64 gnu scas %es:(%rdi),%rax -48af|11223344556677885f5f5f5f5f5f 64 intel scasq qword ptr [rdi] -48af|11223344556677885f5f5f5f5f5f 64 plan9 SCASQ ES:0(DI), AX -48b81122334455667788|5f5f5f5f5f5f 64 gnu mov $-0x778899aabbccddef,%rax -48b81122334455667788|5f5f5f5f5f5f 64 intel mov rax, 0x8877665544332211 -48b81122334455667788|5f5f5f5f5f5f 64 plan9 MOVQ $0x8877665544332211, AX -48c10011|223344556677885f5f5f5f5f 64 gnu rolq $0x11,(%rax) -48c10011|223344556677885f5f5f5f5f 64 intel rol qword ptr [rax], 0x11 -48c10011|223344556677885f5f5f5f5f 64 plan9 ROLQ $0x11, 0(AX) -48c10811|223344556677885f5f5f5f5f 64 gnu rorq $0x11,(%rax) -48c10811|223344556677885f5f5f5f5f 64 intel ror qword ptr [rax], 0x11 -48c10811|223344556677885f5f5f5f5f 64 plan9 RORQ $0x11, 0(AX) -48c11122|3344556677885f5f5f5f5f5f 64 gnu rclq $0x22,(%rcx) -48c11122|3344556677885f5f5f5f5f5f 64 intel rcl qword ptr [rcx], 0x22 -48c11122|3344556677885f5f5f5f5f5f 64 plan9 RCLQ $0x22, 0(CX) -48c11811|223344556677885f5f5f5f5f 64 gnu rcrq $0x11,(%rax) -48c11811|223344556677885f5f5f5f5f 64 intel rcr qword ptr [rax], 0x11 -48c11811|223344556677885f5f5f5f5f 64 plan9 RCRQ $0x11, 0(AX) -48c12011|223344556677885f5f5f5f5f 64 gnu shlq $0x11,(%rax) -48c12011|223344556677885f5f5f5f5f 64 intel shl qword ptr [rax], 0x11 -48c12011|223344556677885f5f5f5f5f 64 plan9 SHLQ $0x11, 0(AX) -48c12811|223344556677885f5f5f5f5f 64 gnu shrq $0x11,(%rax) -48c12811|223344556677885f5f5f5f5f 64 intel shr qword ptr [rax], 0x11 -48c12811|223344556677885f5f5f5f5f 64 plan9 SHRQ $0x11, 0(AX) -48c13811|223344556677885f5f5f5f5f 64 gnu sarq $0x11,(%rax) -48c13811|223344556677885f5f5f5f5f 64 intel sar qword ptr [rax], 0x11 -48c13811|223344556677885f5f5f5f5f 64 plan9 SARQ $0x11, 0(AX) -48c70011223344|556677885f5f5f5f5f 64 gnu movq $0x44332211,(%rax) -48c70011223344|556677885f5f5f5f5f 64 intel mov qword ptr [rax], 0x44332211 -48c70011223344|556677885f5f5f5f5f 64 plan9 MOVQ $0x44332211, 0(AX) -48c7f811223344|556677885f5f5f5f5f 64 gnu xbeginq .+0x44332211 -48c7f811223344|556677885f5f5f5f5f 64 intel xbegin .+0x44332211 -48c7f811223344|556677885f5f5f5f5f 64 plan9 XBEGIN .+1144201745 -48c9|11223344556677885f5f5f5f5f5f 64 gnu leaveq -48c9|11223344556677885f5f5f5f5f5f 64 intel leave -48c9|11223344556677885f5f5f5f5f5f 64 plan9 LEAVE -48cf|11223344556677885f5f5f5f5f5f 64 gnu iretq -48cf|11223344556677885f5f5f5f5f5f 64 intel iretq -48cf|11223344556677885f5f5f5f5f5f 64 plan9 IRETQ -48d100|11223344556677885f5f5f5f5f 64 gnu rolq (%rax) -48d100|11223344556677885f5f5f5f5f 64 intel rol qword ptr [rax], 0x1 -48d100|11223344556677885f5f5f5f5f 64 plan9 ROLQ $0x1, 0(AX) -48d108|11223344556677885f5f5f5f5f 64 gnu rorq (%rax) -48d108|11223344556677885f5f5f5f5f 64 intel ror qword ptr [rax], 0x1 -48d108|11223344556677885f5f5f5f5f 64 plan9 RORQ $0x1, 0(AX) -48d111|223344556677885f5f5f5f5f5f 64 gnu rclq (%rcx) -48d111|223344556677885f5f5f5f5f5f 64 intel rcl qword ptr [rcx], 0x1 -48d111|223344556677885f5f5f5f5f5f 64 plan9 RCLQ $0x1, 0(CX) -48d118|11223344556677885f5f5f5f5f 64 gnu rcrq (%rax) -48d118|11223344556677885f5f5f5f5f 64 intel rcr qword ptr [rax], 0x1 -48d118|11223344556677885f5f5f5f5f 64 plan9 RCRQ $0x1, 0(AX) -48d120|11223344556677885f5f5f5f5f 64 gnu shlq (%rax) -48d120|11223344556677885f5f5f5f5f 64 intel shl qword ptr [rax], 0x1 -48d120|11223344556677885f5f5f5f5f 64 plan9 SHLQ $0x1, 0(AX) -48d128|11223344556677885f5f5f5f5f 64 gnu shrq (%rax) -48d128|11223344556677885f5f5f5f5f 64 intel shr qword ptr [rax], 0x1 -48d128|11223344556677885f5f5f5f5f 64 plan9 SHRQ $0x1, 0(AX) -48d138|11223344556677885f5f5f5f5f 64 gnu sarq (%rax) -48d138|11223344556677885f5f5f5f5f 64 intel sar qword ptr [rax], 0x1 -48d138|11223344556677885f5f5f5f5f 64 plan9 SARQ $0x1, 0(AX) -48d300|11223344556677885f5f5f5f5f 64 gnu rolq %cl,(%rax) -48d300|11223344556677885f5f5f5f5f 64 intel rol qword ptr [rax], cl -48d300|11223344556677885f5f5f5f5f 64 plan9 ROLQ CL, 0(AX) -48d308|11223344556677885f5f5f5f5f 64 gnu rorq %cl,(%rax) -48d308|11223344556677885f5f5f5f5f 64 intel ror qword ptr [rax], cl -48d308|11223344556677885f5f5f5f5f 64 plan9 RORQ CL, 0(AX) -48d311|223344556677885f5f5f5f5f5f 64 gnu rclq %cl,(%rcx) -48d311|223344556677885f5f5f5f5f5f 64 intel rcl qword ptr [rcx], cl -48d311|223344556677885f5f5f5f5f5f 64 plan9 RCLQ CL, 0(CX) -48d318|11223344556677885f5f5f5f5f 64 gnu rcrq %cl,(%rax) -48d318|11223344556677885f5f5f5f5f 64 intel rcr qword ptr [rax], cl -48d318|11223344556677885f5f5f5f5f 64 plan9 RCRQ CL, 0(AX) -48d320|11223344556677885f5f5f5f5f 64 gnu shlq %cl,(%rax) -48d320|11223344556677885f5f5f5f5f 64 intel shl qword ptr [rax], cl -48d320|11223344556677885f5f5f5f5f 64 plan9 SHLQ CL, 0(AX) -48d328|11223344556677885f5f5f5f5f 64 gnu shrq %cl,(%rax) -48d328|11223344556677885f5f5f5f5f 64 intel shr qword ptr [rax], cl -48d328|11223344556677885f5f5f5f5f 64 plan9 SHRQ CL, 0(AX) -48d338|11223344556677885f5f5f5f5f 64 gnu sarq %cl,(%rax) -48d338|11223344556677885f5f5f5f5f 64 intel sar qword ptr [rax], cl -48d338|11223344556677885f5f5f5f5f 64 plan9 SARQ CL, 0(AX) -48d7|11223344556677885f5f5f5f5f5f 64 gnu xlat %ds:(%rbx) -48d7|11223344556677885f5f5f5f5f5f 64 intel xlat -48d7|11223344556677885f5f5f5f5f5f 64 plan9 XLATB DS:0(BX) -48e511|223344556677885f5f5f5f5f5f 64 gnu in $0x11,%eax -48e511|223344556677885f5f5f5f5f5f 64 intel in eax, 0x11 -48e511|223344556677885f5f5f5f5f5f 64 plan9 INQ $0x11, AX -48e711|223344556677885f5f5f5f5f5f 64 gnu out %eax,$0x11 -48e711|223344556677885f5f5f5f5f5f 64 intel out 0x11, eax -48e711|223344556677885f5f5f5f5f5f 64 plan9 OUTQ AX, $0x11 -48e811223344|556677885f5f5f5f5f5f 64 gnu callq .+0x44332211 -48e811223344|556677885f5f5f5f5f5f 64 intel call .+0x44332211 -48e811223344|556677885f5f5f5f5f5f 64 plan9 CALL .+1144201745 -48e911223344|556677885f5f5f5f5f5f 64 gnu jmpq .+0x44332211 -48e911223344|556677885f5f5f5f5f5f 64 intel jmp .+0x44332211 -48e911223344|556677885f5f5f5f5f5f 64 plan9 JMP .+1144201745 -48ed|11223344556677885f5f5f5f5f5f 64 gnu in (%dx),%eax -48ed|11223344556677885f5f5f5f5f5f 64 intel in eax, dx -48ed|11223344556677885f5f5f5f5f5f 64 plan9 INQ DX, AX -48ef|11223344556677885f5f5f5f5f5f 64 gnu out %eax,(%dx) -48ef|11223344556677885f5f5f5f5f5f 64 intel out dx, eax -48ef|11223344556677885f5f5f5f5f5f 64 plan9 OUTQ AX, DX -48f70011223344|556677885f5f5f5f5f 64 gnu testq $0x44332211,(%rax) -48f70011223344|556677885f5f5f5f5f 64 intel test qword ptr [rax], 0x44332211 -48f70011223344|556677885f5f5f5f5f 64 plan9 TESTQ $0x44332211, 0(AX) -48f711|223344556677885f5f5f5f5f5f 64 gnu notq (%rcx) -48f711|223344556677885f5f5f5f5f5f 64 intel not qword ptr [rcx] -48f711|223344556677885f5f5f5f5f5f 64 plan9 NOTQ 0(CX) -48f718|11223344556677885f5f5f5f5f 64 gnu negq (%rax) -48f718|11223344556677885f5f5f5f5f 64 intel neg qword ptr [rax] -48f718|11223344556677885f5f5f5f5f 64 plan9 NEGQ 0(AX) -48f720|11223344556677885f5f5f5f5f 64 gnu mulq (%rax) -48f720|11223344556677885f5f5f5f5f 64 intel mul qword ptr [rax] -48f720|11223344556677885f5f5f5f5f 64 plan9 MULQ 0(AX) -48f728|11223344556677885f5f5f5f5f 64 gnu imulq (%rax) -48f728|11223344556677885f5f5f5f5f 64 intel imul qword ptr [rax] -48f728|11223344556677885f5f5f5f5f 64 plan9 IMULQ 0(AX) -48f730|11223344556677885f5f5f5f5f 64 gnu divq (%rax) -48f730|11223344556677885f5f5f5f5f 64 intel div qword ptr [rax] -48f730|11223344556677885f5f5f5f5f 64 plan9 DIVQ 0(AX) -48f738|11223344556677885f5f5f5f5f 64 gnu idivq (%rax) -48f738|11223344556677885f5f5f5f5f 64 intel idiv qword ptr [rax] -48f738|11223344556677885f5f5f5f5f 64 plan9 IDIVQ 0(AX) -48ff00|11223344556677885f5f5f5f5f 64 gnu incq (%rax) -48ff00|11223344556677885f5f5f5f5f 64 intel inc qword ptr [rax] -48ff00|11223344556677885f5f5f5f5f 64 plan9 INCQ 0(AX) -48ff08|11223344556677885f5f5f5f5f 64 gnu decq (%rax) -48ff08|11223344556677885f5f5f5f5f 64 intel dec qword ptr [rax] -48ff08|11223344556677885f5f5f5f5f 64 plan9 DECQ 0(AX) -48ff18|11223344556677885f5f5f5f5f 64 gnu lcallq *(%rax) -48ff18|11223344556677885f5f5f5f5f 64 intel call far ptr [rax] -48ff18|11223344556677885f5f5f5f5f 64 plan9 LCALL 0(AX) -48ff28|11223344556677885f5f5f5f5f 64 gnu ljmpq *(%rax) -48ff28|11223344556677885f5f5f5f5f 64 intel jmp far ptr [rax] -48ff28|11223344556677885f5f5f5f5f 64 plan9 LJMP 0(AX) -48ff30|11223344556677885f5f5f5f5f 64 gnu pushq (%rax) -48ff30|11223344556677885f5f5f5f5f 64 intel push qword ptr [rax] -48ff30|11223344556677885f5f5f5f5f 64 plan9 PUSHQ 0(AX) -48|010011223344556677885f5f5f5f5f 32 intel dec eax -48|010011223344556677885f5f5f5f5f 32 plan9 DECL AX -50|11223344556677885f5f5f5f5f5f5f 32 intel push eax -50|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL AX -50|11223344556677885f5f5f5f5f5f5f 64 gnu push %rax -50|11223344556677885f5f5f5f5f5f5f 64 intel push rax -50|11223344556677885f5f5f5f5f5f5f 64 plan9 PUSHL AX -58|11223344556677885f5f5f5f5f5f5f 32 intel pop eax -58|11223344556677885f5f5f5f5f5f5f 32 plan9 POPL AX -58|11223344556677885f5f5f5f5f5f5f 64 gnu pop %rax -58|11223344556677885f5f5f5f5f5f5f 64 intel pop rax -58|11223344556677885f5f5f5f5f5f5f 64 plan9 POPL AX -60|11223344556677885f5f5f5f5f5f5f 32 intel pushad -60|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHAD -60|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -60|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -60|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -61|11223344556677885f5f5f5f5f5f5f 32 intel popad -61|11223344556677885f5f5f5f5f5f5f 32 plan9 POPAD -61|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -61|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -61|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -6211|223344556677885f5f5f5f5f5f5f 32 intel bound edx, qword ptr [ecx] -6211|223344556677885f5f5f5f5f5f5f 32 plan9 BOUND 0(CX), DX -62|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -62|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -62|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -6311|223344556677885f5f5f5f5f5f5f 32 intel arpl word ptr [ecx], dx -6311|223344556677885f5f5f5f5f5f5f 32 plan9 ARPL DX, 0(CX) -6311|223344556677885f5f5f5f5f5f5f 64 gnu movsxd (%rcx),%edx -6311|223344556677885f5f5f5f5f5f5f 64 intel movsxd edx, dword ptr [rcx] -6311|223344556677885f5f5f5f5f5f5f 64 plan9 MOVSXD 0(CX), DX -660111|223344556677885f5f5f5f5f5f 32 intel add word ptr [ecx], dx -660111|223344556677885f5f5f5f5f5f 32 plan9 ADDW DX, 0(CX) -660111|223344556677885f5f5f5f5f5f 64 gnu add %dx,(%rcx) -660111|223344556677885f5f5f5f5f5f 64 intel add word ptr [rcx], dx -660111|223344556677885f5f5f5f5f5f 64 plan9 ADDW DX, 0(CX) -660311|223344556677885f5f5f5f5f5f 32 intel add dx, word ptr [ecx] -660311|223344556677885f5f5f5f5f5f 32 plan9 ADDW 0(CX), DX -660311|223344556677885f5f5f5f5f5f 64 gnu add (%rcx),%dx -660311|223344556677885f5f5f5f5f5f 64 intel add dx, word ptr [rcx] -660311|223344556677885f5f5f5f5f5f 64 plan9 ADDW 0(CX), DX -66051122|3344556677885f5f5f5f5f5f 32 intel add ax, 0x2211 -66051122|3344556677885f5f5f5f5f5f 32 plan9 ADDW $0x2211, AX -66051122|3344556677885f5f5f5f5f5f 64 gnu add $0x2211,%ax -66051122|3344556677885f5f5f5f5f5f 64 intel add ax, 0x2211 -66051122|3344556677885f5f5f5f5f5f 64 plan9 ADDW $0x2211, AX -660911|223344556677885f5f5f5f5f5f 32 intel or word ptr [ecx], dx -660911|223344556677885f5f5f5f5f5f 32 plan9 ORW DX, 0(CX) -660911|223344556677885f5f5f5f5f5f 64 gnu or %dx,(%rcx) -660911|223344556677885f5f5f5f5f5f 64 intel or word ptr [rcx], dx -660911|223344556677885f5f5f5f5f5f 64 plan9 ORW DX, 0(CX) -660b11|223344556677885f5f5f5f5f5f 32 intel or dx, word ptr [ecx] -660b11|223344556677885f5f5f5f5f5f 32 plan9 ORW 0(CX), DX -660b11|223344556677885f5f5f5f5f5f 64 gnu or (%rcx),%dx -660b11|223344556677885f5f5f5f5f5f 64 intel or dx, word ptr [rcx] -660b11|223344556677885f5f5f5f5f5f 64 plan9 ORW 0(CX), DX -660d1122|3344556677885f5f5f5f5f5f 32 intel or ax, 0x2211 -660d1122|3344556677885f5f5f5f5f5f 32 plan9 ORW $0x2211, AX -660d1122|3344556677885f5f5f5f5f5f 64 gnu or $0x2211,%ax -660d1122|3344556677885f5f5f5f5f5f 64 intel or ax, 0x2211 -660d1122|3344556677885f5f5f5f5f5f 64 plan9 ORW $0x2211, AX -660f0000|11223344556677885f5f5f5f 32 intel sldt word ptr [eax] -660f0000|11223344556677885f5f5f5f 32 plan9 SLDT 0(AX) -660f0000|11223344556677885f5f5f5f 64 gnu data16 sldt (%rax) -660f0000|11223344556677885f5f5f5f 64 intel sldt word ptr [rax] -660f0000|11223344556677885f5f5f5f 64 plan9 SLDT 0(AX) -660f0008|11223344556677885f5f5f5f 32 intel str word ptr [eax] -660f0008|11223344556677885f5f5f5f 32 plan9 STR 0(AX) -660f0008|11223344556677885f5f5f5f 64 gnu data16 str (%rax) -660f0008|11223344556677885f5f5f5f 64 intel str word ptr [rax] -660f0008|11223344556677885f5f5f5f 64 plan9 STR 0(AX) -660f01a611223344|556677885f5f5f5f 32 intel smsw word ptr [esi+0x44332211] -660f01a611223344|556677885f5f5f5f 32 plan9 SMSW 0x44332211(SI) -660f01a611223344|556677885f5f5f5f 64 gnu data16 smsw 0x44332211(%rsi) -660f01a611223344|556677885f5f5f5f 64 intel smsw word ptr [rsi+0x44332211] -660f01a611223344|556677885f5f5f5f 64 plan9 SMSW 0x44332211(SI) -660f0211|223344556677885f5f5f5f5f 32 intel lar dx, word ptr [ecx] -660f0211|223344556677885f5f5f5f5f 32 plan9 LAR 0(CX), DX -660f0211|223344556677885f5f5f5f5f 64 gnu lar (%rcx),%dx -660f0211|223344556677885f5f5f5f5f 64 intel lar dx, word ptr [rcx] -660f0211|223344556677885f5f5f5f5f 64 plan9 LAR 0(CX), DX -660f0311|223344556677885f5f5f5f5f 32 intel lsl dx, word ptr [ecx] -660f0311|223344556677885f5f5f5f5f 32 plan9 LSL 0(CX), DX -660f0311|223344556677885f5f5f5f5f 64 gnu lsl (%rcx),%dx -660f0311|223344556677885f5f5f5f5f 64 intel lsl dx, word ptr [rcx] -660f0311|223344556677885f5f5f5f5f 64 plan9 LSL 0(CX), DX -660f1011|223344556677885f5f5f5f5f 32 intel movupd xmm2, xmmword ptr [ecx] -660f1011|223344556677885f5f5f5f5f 32 plan9 MOVUPD 0(CX), X2 -660f1011|223344556677885f5f5f5f5f 64 gnu movupd (%rcx),%xmm2 -660f1011|223344556677885f5f5f5f5f 64 intel movupd xmm2, xmmword ptr [rcx] -660f1011|223344556677885f5f5f5f5f 64 plan9 MOVUPD 0(CX), X2 -660f1122|3344556677885f5f5f5f5f5f 32 intel movupd xmmword ptr [edx], xmm4 -660f1122|3344556677885f5f5f5f5f5f 32 plan9 MOVUPD X4, 0(DX) -660f1122|3344556677885f5f5f5f5f5f 64 gnu movupd %xmm4,(%rdx) -660f1122|3344556677885f5f5f5f5f5f 64 intel movupd xmmword ptr [rdx], xmm4 -660f1122|3344556677885f5f5f5f5f5f 64 plan9 MOVUPD X4, 0(DX) -660f1211|223344556677885f5f5f5f5f 32 intel movlpd xmm2, qword ptr [ecx] -660f1211|223344556677885f5f5f5f5f 32 plan9 MOVLPD 0(CX), X2 -660f1211|223344556677885f5f5f5f5f 64 gnu movlpd (%rcx),%xmm2 -660f1211|223344556677885f5f5f5f5f 64 intel movlpd xmm2, qword ptr [rcx] -660f1211|223344556677885f5f5f5f5f 64 plan9 MOVLPD 0(CX), X2 -660f1311|223344556677885f5f5f5f5f 32 intel movlpd qword ptr [ecx], xmm2 -660f1311|223344556677885f5f5f5f5f 32 plan9 MOVLPD X2, 0(CX) -660f1311|223344556677885f5f5f5f5f 64 gnu movlpd %xmm2,(%rcx) -660f1311|223344556677885f5f5f5f5f 64 intel movlpd qword ptr [rcx], xmm2 -660f1311|223344556677885f5f5f5f5f 64 plan9 MOVLPD X2, 0(CX) -660f1411|223344556677885f5f5f5f5f 32 intel unpcklpd xmm2, xmmword ptr [ecx] -660f1411|223344556677885f5f5f5f5f 32 plan9 UNPCKLPD 0(CX), X2 -660f1411|223344556677885f5f5f5f5f 64 gnu unpcklpd (%rcx),%xmm2 -660f1411|223344556677885f5f5f5f5f 64 intel unpcklpd xmm2, xmmword ptr [rcx] -660f1411|223344556677885f5f5f5f5f 64 plan9 UNPCKLPD 0(CX), X2 -660f1511|223344556677885f5f5f5f5f 32 intel unpckhpd xmm2, xmmword ptr [ecx] -660f1511|223344556677885f5f5f5f5f 32 plan9 UNPCKHPD 0(CX), X2 -660f1511|223344556677885f5f5f5f5f 64 gnu unpckhpd (%rcx),%xmm2 -660f1511|223344556677885f5f5f5f5f 64 intel unpckhpd xmm2, xmmword ptr [rcx] -660f1511|223344556677885f5f5f5f5f 64 plan9 UNPCKHPD 0(CX), X2 -660f1611|223344556677885f5f5f5f5f 32 intel movhpd xmm2, qword ptr [ecx] -660f1611|223344556677885f5f5f5f5f 32 plan9 MOVHPD 0(CX), X2 -660f1611|223344556677885f5f5f5f5f 64 gnu movhpd (%rcx),%xmm2 -660f1611|223344556677885f5f5f5f5f 64 intel movhpd xmm2, qword ptr [rcx] -660f1611|223344556677885f5f5f5f5f 64 plan9 MOVHPD 0(CX), X2 -660f1711|223344556677885f5f5f5f5f 32 intel movhpd qword ptr [ecx], xmm2 -660f1711|223344556677885f5f5f5f5f 32 plan9 MOVHPD X2, 0(CX) -660f1711|223344556677885f5f5f5f5f 64 gnu movhpd %xmm2,(%rcx) -660f1711|223344556677885f5f5f5f5f 64 intel movhpd qword ptr [rcx], xmm2 -660f1711|223344556677885f5f5f5f5f 64 plan9 MOVHPD X2, 0(CX) -660f1f00|11223344556677885f5f5f5f 32 intel nop word ptr [eax], ax -660f1f00|11223344556677885f5f5f5f 32 plan9 NOPW 0(AX) -660f1f00|11223344556677885f5f5f5f 64 gnu nopw (%rax) -660f1f00|11223344556677885f5f5f5f 64 intel nop word ptr [rax], ax -660f1f00|11223344556677885f5f5f5f 64 plan9 NOPW 0(AX) -660f2811|223344556677885f5f5f5f5f 32 intel movapd xmm2, xmmword ptr [ecx] -660f2811|223344556677885f5f5f5f5f 32 plan9 MOVAPD 0(CX), X2 -660f2811|223344556677885f5f5f5f5f 64 gnu movapd (%rcx),%xmm2 -660f2811|223344556677885f5f5f5f5f 64 intel movapd xmm2, xmmword ptr [rcx] -660f2811|223344556677885f5f5f5f5f 64 plan9 MOVAPD 0(CX), X2 -660f2911|223344556677885f5f5f5f5f 32 intel movapd xmmword ptr [ecx], xmm2 -660f2911|223344556677885f5f5f5f5f 32 plan9 MOVAPD X2, 0(CX) -660f2911|223344556677885f5f5f5f5f 64 gnu movapd %xmm2,(%rcx) -660f2911|223344556677885f5f5f5f5f 64 intel movapd xmmword ptr [rcx], xmm2 -660f2911|223344556677885f5f5f5f5f 64 plan9 MOVAPD X2, 0(CX) -660f2a11|223344556677885f5f5f5f5f 32 intel cvtpi2pd xmm2, qword ptr [ecx] -660f2a11|223344556677885f5f5f5f5f 32 plan9 CVTPI2PD 0(CX), X2 -660f2a11|223344556677885f5f5f5f5f 64 gnu cvtpi2pd (%rcx),%xmm2 -660f2a11|223344556677885f5f5f5f5f 64 intel cvtpi2pd xmm2, qword ptr [rcx] -660f2a11|223344556677885f5f5f5f5f 64 plan9 CVTPI2PD 0(CX), X2 -660f2b11|223344556677885f5f5f5f5f 32 intel movntpd xmmword ptr [ecx], xmm2 -660f2b11|223344556677885f5f5f5f5f 32 plan9 MOVNTPD X2, 0(CX) -660f2b11|223344556677885f5f5f5f5f 64 gnu movntpd %xmm2,(%rcx) -660f2b11|223344556677885f5f5f5f5f 64 intel movntpd xmmword ptr [rcx], xmm2 -660f2b11|223344556677885f5f5f5f5f 64 plan9 MOVNTPD X2, 0(CX) -660f2c11|223344556677885f5f5f5f5f 32 intel cvttpd2pi mmx2, xmmword ptr [ecx] -660f2c11|223344556677885f5f5f5f5f 32 plan9 CVTTPD2PI 0(CX), M2 -660f2c11|223344556677885f5f5f5f5f 64 gnu cvttpd2pi (%rcx),%mm2 -660f2c11|223344556677885f5f5f5f5f 64 intel cvttpd2pi mmx2, xmmword ptr [rcx] -660f2c11|223344556677885f5f5f5f5f 64 plan9 CVTTPD2PI 0(CX), M2 -660f2d11|223344556677885f5f5f5f5f 32 intel cvtpd2pi mmx2, xmmword ptr [ecx] -660f2d11|223344556677885f5f5f5f5f 32 plan9 CVTPD2PI 0(CX), M2 -660f2d11|223344556677885f5f5f5f5f 64 gnu cvtpd2pi (%rcx),%mm2 -660f2d11|223344556677885f5f5f5f5f 64 intel cvtpd2pi mmx2, xmmword ptr [rcx] -660f2d11|223344556677885f5f5f5f5f 64 plan9 CVTPD2PI 0(CX), M2 -660f2e11|223344556677885f5f5f5f5f 32 intel ucomisd xmm2, qword ptr [ecx] -660f2e11|223344556677885f5f5f5f5f 32 plan9 UCOMISD 0(CX), X2 -660f2e11|223344556677885f5f5f5f5f 64 gnu ucomisd (%rcx),%xmm2 -660f2e11|223344556677885f5f5f5f5f 64 intel ucomisd xmm2, qword ptr [rcx] -660f2e11|223344556677885f5f5f5f5f 64 plan9 UCOMISD 0(CX), X2 -660f2f11|223344556677885f5f5f5f5f 32 intel comisd xmm2, qword ptr [ecx] -660f2f11|223344556677885f5f5f5f5f 32 plan9 COMISD 0(CX), X2 -660f2f11|223344556677885f5f5f5f5f 64 gnu comisd (%rcx),%xmm2 -660f2f11|223344556677885f5f5f5f5f 64 intel comisd xmm2, qword ptr [rcx] -660f2f11|223344556677885f5f5f5f5f 64 plan9 COMISD 0(CX), X2 -660f380011|223344556677885f5f5f5f 32 intel pshufb xmm2, xmmword ptr [ecx] -660f380011|223344556677885f5f5f5f 32 plan9 PSHUFB 0(CX), X2 -660f380011|223344556677885f5f5f5f 64 gnu pshufb (%rcx),%xmm2 -660f380011|223344556677885f5f5f5f 64 intel pshufb xmm2, xmmword ptr [rcx] -660f380011|223344556677885f5f5f5f 64 plan9 PSHUFB 0(CX), X2 -660f380111|223344556677885f5f5f5f 32 intel phaddw xmm2, xmmword ptr [ecx] -660f380111|223344556677885f5f5f5f 32 plan9 PHADDW 0(CX), X2 -660f380111|223344556677885f5f5f5f 64 gnu phaddw (%rcx),%xmm2 -660f380111|223344556677885f5f5f5f 64 intel phaddw xmm2, xmmword ptr [rcx] -660f380111|223344556677885f5f5f5f 64 plan9 PHADDW 0(CX), X2 -660f380211|223344556677885f5f5f5f 32 intel phaddd xmm2, xmmword ptr [ecx] -660f380211|223344556677885f5f5f5f 32 plan9 PHADDD 0(CX), X2 -660f380211|223344556677885f5f5f5f 64 gnu phaddd (%rcx),%xmm2 -660f380211|223344556677885f5f5f5f 64 intel phaddd xmm2, xmmword ptr [rcx] -660f380211|223344556677885f5f5f5f 64 plan9 PHADDD 0(CX), X2 -660f380311|223344556677885f5f5f5f 32 intel phaddsw xmm2, xmmword ptr [ecx] -660f380311|223344556677885f5f5f5f 32 plan9 PHADDSW 0(CX), X2 -660f380311|223344556677885f5f5f5f 64 gnu phaddsw (%rcx),%xmm2 -660f380311|223344556677885f5f5f5f 64 intel phaddsw xmm2, xmmword ptr [rcx] -660f380311|223344556677885f5f5f5f 64 plan9 PHADDSW 0(CX), X2 -660f380411|223344556677885f5f5f5f 32 intel pmaddubsw xmm2, xmmword ptr [ecx] -660f380411|223344556677885f5f5f5f 32 plan9 PMADDUBSW 0(CX), X2 -660f380411|223344556677885f5f5f5f 64 gnu pmaddubsw (%rcx),%xmm2 -660f380411|223344556677885f5f5f5f 64 intel pmaddubsw xmm2, xmmword ptr [rcx] -660f380411|223344556677885f5f5f5f 64 plan9 PMADDUBSW 0(CX), X2 -660f380511|223344556677885f5f5f5f 32 intel phsubw xmm2, xmmword ptr [ecx] -660f380511|223344556677885f5f5f5f 32 plan9 PHSUBW 0(CX), X2 -660f380511|223344556677885f5f5f5f 64 gnu phsubw (%rcx),%xmm2 -660f380511|223344556677885f5f5f5f 64 intel phsubw xmm2, xmmword ptr [rcx] -660f380511|223344556677885f5f5f5f 64 plan9 PHSUBW 0(CX), X2 -660f380611|223344556677885f5f5f5f 32 intel phsubd xmm2, xmmword ptr [ecx] -660f380611|223344556677885f5f5f5f 32 plan9 PHSUBD 0(CX), X2 -660f380611|223344556677885f5f5f5f 64 gnu phsubd (%rcx),%xmm2 -660f380611|223344556677885f5f5f5f 64 intel phsubd xmm2, xmmword ptr [rcx] -660f380611|223344556677885f5f5f5f 64 plan9 PHSUBD 0(CX), X2 -660f380711|223344556677885f5f5f5f 32 intel phsubsw xmm2, xmmword ptr [ecx] -660f380711|223344556677885f5f5f5f 32 plan9 PHSUBSW 0(CX), X2 -660f380711|223344556677885f5f5f5f 64 gnu phsubsw (%rcx),%xmm2 -660f380711|223344556677885f5f5f5f 64 intel phsubsw xmm2, xmmword ptr [rcx] -660f380711|223344556677885f5f5f5f 64 plan9 PHSUBSW 0(CX), X2 -660f380811|223344556677885f5f5f5f 32 intel psignb xmm2, xmmword ptr [ecx] -660f380811|223344556677885f5f5f5f 32 plan9 PSIGNB 0(CX), X2 -660f380811|223344556677885f5f5f5f 64 gnu psignb (%rcx),%xmm2 -660f380811|223344556677885f5f5f5f 64 intel psignb xmm2, xmmword ptr [rcx] -660f380811|223344556677885f5f5f5f 64 plan9 PSIGNB 0(CX), X2 -660f380911|223344556677885f5f5f5f 32 intel psignw xmm2, xmmword ptr [ecx] -660f380911|223344556677885f5f5f5f 32 plan9 PSIGNW 0(CX), X2 -660f380911|223344556677885f5f5f5f 64 gnu psignw (%rcx),%xmm2 -660f380911|223344556677885f5f5f5f 64 intel psignw xmm2, xmmword ptr [rcx] -660f380911|223344556677885f5f5f5f 64 plan9 PSIGNW 0(CX), X2 -660f380a11|223344556677885f5f5f5f 32 intel psignd xmm2, xmmword ptr [ecx] -660f380a11|223344556677885f5f5f5f 32 plan9 PSIGND 0(CX), X2 -660f380a11|223344556677885f5f5f5f 64 gnu psignd (%rcx),%xmm2 -660f380a11|223344556677885f5f5f5f 64 intel psignd xmm2, xmmword ptr [rcx] -660f380a11|223344556677885f5f5f5f 64 plan9 PSIGND 0(CX), X2 -660f380b11|223344556677885f5f5f5f 32 intel pmulhrsw xmm2, xmmword ptr [ecx] -660f380b11|223344556677885f5f5f5f 32 plan9 PMULHRSW 0(CX), X2 -660f380b11|223344556677885f5f5f5f 64 gnu pmulhrsw (%rcx),%xmm2 -660f380b11|223344556677885f5f5f5f 64 intel pmulhrsw xmm2, xmmword ptr [rcx] -660f380b11|223344556677885f5f5f5f 64 plan9 PMULHRSW 0(CX), X2 -660f381011|223344556677885f5f5f5f 32 intel pblendvb xmm2, xmmword ptr [ecx] -660f381011|223344556677885f5f5f5f 32 plan9 PBLENDVB X0, 0(CX), X2 -660f381011|223344556677885f5f5f5f 64 gnu pblendvb %xmm0,(%rcx),%xmm2 -660f381011|223344556677885f5f5f5f 64 intel pblendvb xmm2, xmmword ptr [rcx] -660f381011|223344556677885f5f5f5f 64 plan9 PBLENDVB X0, 0(CX), X2 -660f381411|223344556677885f5f5f5f 32 intel blendvps xmm2, xmmword ptr [ecx] -660f381411|223344556677885f5f5f5f 32 plan9 BLENDVPS X0, 0(CX), X2 -660f381411|223344556677885f5f5f5f 64 gnu blendvps %xmm0,(%rcx),%xmm2 -660f381411|223344556677885f5f5f5f 64 intel blendvps xmm2, xmmword ptr [rcx] -660f381411|223344556677885f5f5f5f 64 plan9 BLENDVPS X0, 0(CX), X2 -660f381511|223344556677885f5f5f5f 32 intel blendvpd xmm2, xmmword ptr [ecx] -660f381511|223344556677885f5f5f5f 32 plan9 BLENDVPD X0, 0(CX), X2 -660f381511|223344556677885f5f5f5f 64 gnu blendvpd %xmm0,(%rcx),%xmm2 -660f381511|223344556677885f5f5f5f 64 intel blendvpd xmm2, xmmword ptr [rcx] -660f381511|223344556677885f5f5f5f 64 plan9 BLENDVPD X0, 0(CX), X2 -660f381711|223344556677885f5f5f5f 32 intel ptest xmm2, xmmword ptr [ecx] -660f381711|223344556677885f5f5f5f 32 plan9 PTEST 0(CX), X2 -660f381711|223344556677885f5f5f5f 64 gnu ptest (%rcx),%xmm2 -660f381711|223344556677885f5f5f5f 64 intel ptest xmm2, xmmword ptr [rcx] -660f381711|223344556677885f5f5f5f 64 plan9 PTEST 0(CX), X2 -660f381c11|223344556677885f5f5f5f 32 intel pabsb xmm2, xmmword ptr [ecx] -660f381c11|223344556677885f5f5f5f 32 plan9 PABSB 0(CX), X2 -660f381c11|223344556677885f5f5f5f 64 gnu pabsb (%rcx),%xmm2 -660f381c11|223344556677885f5f5f5f 64 intel pabsb xmm2, xmmword ptr [rcx] -660f381c11|223344556677885f5f5f5f 64 plan9 PABSB 0(CX), X2 -660f381d11|223344556677885f5f5f5f 32 intel pabsw xmm2, xmmword ptr [ecx] -660f381d11|223344556677885f5f5f5f 32 plan9 PABSW 0(CX), X2 -660f381d11|223344556677885f5f5f5f 64 gnu pabsw (%rcx),%xmm2 -660f381d11|223344556677885f5f5f5f 64 intel pabsw xmm2, xmmword ptr [rcx] -660f381d11|223344556677885f5f5f5f 64 plan9 PABSW 0(CX), X2 -660f381e11|223344556677885f5f5f5f 32 intel pabsd xmm2, xmmword ptr [ecx] -660f381e11|223344556677885f5f5f5f 32 plan9 PABSD 0(CX), X2 -660f381e11|223344556677885f5f5f5f 64 gnu pabsd (%rcx),%xmm2 -660f381e11|223344556677885f5f5f5f 64 intel pabsd xmm2, xmmword ptr [rcx] -660f381e11|223344556677885f5f5f5f 64 plan9 PABSD 0(CX), X2 -660f382011|223344556677885f5f5f5f 32 intel pmovsxbw xmm2, qword ptr [ecx] -660f382011|223344556677885f5f5f5f 32 plan9 PMOVSXBW 0(CX), X2 -660f382011|223344556677885f5f5f5f 64 gnu pmovsxbw (%rcx),%xmm2 -660f382011|223344556677885f5f5f5f 64 intel pmovsxbw xmm2, qword ptr [rcx] -660f382011|223344556677885f5f5f5f 64 plan9 PMOVSXBW 0(CX), X2 -660f382111|223344556677885f5f5f5f 32 intel pmovsxbd xmm2, dword ptr [ecx] -660f382111|223344556677885f5f5f5f 32 plan9 PMOVSXBD 0(CX), X2 -660f382111|223344556677885f5f5f5f 64 gnu pmovsxbd (%rcx),%xmm2 -660f382111|223344556677885f5f5f5f 64 intel pmovsxbd xmm2, dword ptr [rcx] -660f382111|223344556677885f5f5f5f 64 plan9 PMOVSXBD 0(CX), X2 -660f382211|223344556677885f5f5f5f 32 intel pmovsxbq xmm2, word ptr [ecx] -660f382211|223344556677885f5f5f5f 32 plan9 PMOVSXBQ 0(CX), X2 -660f382211|223344556677885f5f5f5f 64 gnu pmovsxbq (%rcx),%xmm2 -660f382211|223344556677885f5f5f5f 64 intel pmovsxbq xmm2, word ptr [rcx] -660f382211|223344556677885f5f5f5f 64 plan9 PMOVSXBQ 0(CX), X2 -660f382311|223344556677885f5f5f5f 32 intel pmovsxwd xmm2, qword ptr [ecx] -660f382311|223344556677885f5f5f5f 32 plan9 PMOVSXWD 0(CX), X2 -660f382311|223344556677885f5f5f5f 64 gnu pmovsxwd (%rcx),%xmm2 -660f382311|223344556677885f5f5f5f 64 intel pmovsxwd xmm2, qword ptr [rcx] -660f382311|223344556677885f5f5f5f 64 plan9 PMOVSXWD 0(CX), X2 -660f382411|223344556677885f5f5f5f 32 intel pmovsxwq xmm2, dword ptr [ecx] -660f382411|223344556677885f5f5f5f 32 plan9 PMOVSXWQ 0(CX), X2 -660f382411|223344556677885f5f5f5f 64 gnu pmovsxwq (%rcx),%xmm2 -660f382411|223344556677885f5f5f5f 64 intel pmovsxwq xmm2, dword ptr [rcx] -660f382411|223344556677885f5f5f5f 64 plan9 PMOVSXWQ 0(CX), X2 -660f382511|223344556677885f5f5f5f 32 intel pmovsxdq xmm2, qword ptr [ecx] -660f382511|223344556677885f5f5f5f 32 plan9 PMOVSXDQ 0(CX), X2 -660f382511|223344556677885f5f5f5f 64 gnu pmovsxdq (%rcx),%xmm2 -660f382511|223344556677885f5f5f5f 64 intel pmovsxdq xmm2, qword ptr [rcx] -660f382511|223344556677885f5f5f5f 64 plan9 PMOVSXDQ 0(CX), X2 -660f382811|223344556677885f5f5f5f 32 intel pmuldq xmm2, xmmword ptr [ecx] -660f382811|223344556677885f5f5f5f 32 plan9 PMULDQ 0(CX), X2 -660f382811|223344556677885f5f5f5f 64 gnu pmuldq (%rcx),%xmm2 -660f382811|223344556677885f5f5f5f 64 intel pmuldq xmm2, xmmword ptr [rcx] -660f382811|223344556677885f5f5f5f 64 plan9 PMULDQ 0(CX), X2 -660f382911|223344556677885f5f5f5f 32 intel pcmpeqq xmm2, xmmword ptr [ecx] -660f382911|223344556677885f5f5f5f 32 plan9 PCMPEQQ 0(CX), X2 -660f382911|223344556677885f5f5f5f 64 gnu pcmpeqq (%rcx),%xmm2 -660f382911|223344556677885f5f5f5f 64 intel pcmpeqq xmm2, xmmword ptr [rcx] -660f382911|223344556677885f5f5f5f 64 plan9 PCMPEQQ 0(CX), X2 -660f382a11|223344556677885f5f5f5f 32 intel movntdqa xmm2, xmmword ptr [ecx] -660f382a11|223344556677885f5f5f5f 32 plan9 MOVNTDQA 0(CX), X2 -660f382a11|223344556677885f5f5f5f 64 gnu movntdqa (%rcx),%xmm2 -660f382a11|223344556677885f5f5f5f 64 intel movntdqa xmm2, xmmword ptr [rcx] -660f382a11|223344556677885f5f5f5f 64 plan9 MOVNTDQA 0(CX), X2 -660f382b11|223344556677885f5f5f5f 32 intel packusdw xmm2, xmmword ptr [ecx] -660f382b11|223344556677885f5f5f5f 32 plan9 PACKUSDW 0(CX), X2 -660f382b11|223344556677885f5f5f5f 64 gnu packusdw (%rcx),%xmm2 -660f382b11|223344556677885f5f5f5f 64 intel packusdw xmm2, xmmword ptr [rcx] -660f382b11|223344556677885f5f5f5f 64 plan9 PACKUSDW 0(CX), X2 -660f383011|223344556677885f5f5f5f 32 intel pmovzxbw xmm2, qword ptr [ecx] -660f383011|223344556677885f5f5f5f 32 plan9 PMOVZXBW 0(CX), X2 -660f383011|223344556677885f5f5f5f 64 gnu pmovzxbw (%rcx),%xmm2 -660f383011|223344556677885f5f5f5f 64 intel pmovzxbw xmm2, qword ptr [rcx] -660f383011|223344556677885f5f5f5f 64 plan9 PMOVZXBW 0(CX), X2 -660f383111|223344556677885f5f5f5f 32 intel pmovzxbd xmm2, dword ptr [ecx] -660f383111|223344556677885f5f5f5f 32 plan9 PMOVZXBD 0(CX), X2 -660f383111|223344556677885f5f5f5f 64 gnu pmovzxbd (%rcx),%xmm2 -660f383111|223344556677885f5f5f5f 64 intel pmovzxbd xmm2, dword ptr [rcx] -660f383111|223344556677885f5f5f5f 64 plan9 PMOVZXBD 0(CX), X2 -660f383211|223344556677885f5f5f5f 32 intel pmovzxbq xmm2, word ptr [ecx] -660f383211|223344556677885f5f5f5f 32 plan9 PMOVZXBQ 0(CX), X2 -660f383211|223344556677885f5f5f5f 64 gnu pmovzxbq (%rcx),%xmm2 -660f383211|223344556677885f5f5f5f 64 intel pmovzxbq xmm2, word ptr [rcx] -660f383211|223344556677885f5f5f5f 64 plan9 PMOVZXBQ 0(CX), X2 -660f383311|223344556677885f5f5f5f 32 intel pmovzxwd xmm2, qword ptr [ecx] -660f383311|223344556677885f5f5f5f 32 plan9 PMOVZXWD 0(CX), X2 -660f383311|223344556677885f5f5f5f 64 gnu pmovzxwd (%rcx),%xmm2 -660f383311|223344556677885f5f5f5f 64 intel pmovzxwd xmm2, qword ptr [rcx] -660f383311|223344556677885f5f5f5f 64 plan9 PMOVZXWD 0(CX), X2 -660f383411|223344556677885f5f5f5f 32 intel pmovzxwq xmm2, dword ptr [ecx] -660f383411|223344556677885f5f5f5f 32 plan9 PMOVZXWQ 0(CX), X2 -660f383411|223344556677885f5f5f5f 64 gnu pmovzxwq (%rcx),%xmm2 -660f383411|223344556677885f5f5f5f 64 intel pmovzxwq xmm2, dword ptr [rcx] -660f383411|223344556677885f5f5f5f 64 plan9 PMOVZXWQ 0(CX), X2 -660f383511|223344556677885f5f5f5f 32 intel pmovzxdq xmm2, qword ptr [ecx] -660f383511|223344556677885f5f5f5f 32 plan9 PMOVZXDQ 0(CX), X2 -660f383511|223344556677885f5f5f5f 64 gnu pmovzxdq (%rcx),%xmm2 -660f383511|223344556677885f5f5f5f 64 intel pmovzxdq xmm2, qword ptr [rcx] -660f383511|223344556677885f5f5f5f 64 plan9 PMOVZXDQ 0(CX), X2 -660f383711|223344556677885f5f5f5f 32 intel pcmpgtq xmm2, xmmword ptr [ecx] -660f383711|223344556677885f5f5f5f 32 plan9 PCMPGTQ 0(CX), X2 -660f383711|223344556677885f5f5f5f 64 gnu pcmpgtq (%rcx),%xmm2 -660f383711|223344556677885f5f5f5f 64 intel pcmpgtq xmm2, xmmword ptr [rcx] -660f383711|223344556677885f5f5f5f 64 plan9 PCMPGTQ 0(CX), X2 -660f383811|223344556677885f5f5f5f 32 intel pminsb xmm2, xmmword ptr [ecx] -660f383811|223344556677885f5f5f5f 32 plan9 PMINSB 0(CX), X2 -660f383811|223344556677885f5f5f5f 64 gnu pminsb (%rcx),%xmm2 -660f383811|223344556677885f5f5f5f 64 intel pminsb xmm2, xmmword ptr [rcx] -660f383811|223344556677885f5f5f5f 64 plan9 PMINSB 0(CX), X2 -660f383911|223344556677885f5f5f5f 32 intel pminsd xmm2, xmmword ptr [ecx] -660f383911|223344556677885f5f5f5f 32 plan9 PMINSD 0(CX), X2 -660f383911|223344556677885f5f5f5f 64 gnu pminsd (%rcx),%xmm2 -660f383911|223344556677885f5f5f5f 64 intel pminsd xmm2, xmmword ptr [rcx] -660f383911|223344556677885f5f5f5f 64 plan9 PMINSD 0(CX), X2 -660f383a11|223344556677885f5f5f5f 32 intel pminuw xmm2, xmmword ptr [ecx] -660f383a11|223344556677885f5f5f5f 32 plan9 PMINUW 0(CX), X2 -660f383a11|223344556677885f5f5f5f 64 gnu pminuw (%rcx),%xmm2 -660f383a11|223344556677885f5f5f5f 64 intel pminuw xmm2, xmmword ptr [rcx] -660f383a11|223344556677885f5f5f5f 64 plan9 PMINUW 0(CX), X2 -660f383b11|223344556677885f5f5f5f 32 intel pminud xmm2, xmmword ptr [ecx] -660f383b11|223344556677885f5f5f5f 32 plan9 PMINUD 0(CX), X2 -660f383b11|223344556677885f5f5f5f 64 gnu pminud (%rcx),%xmm2 -660f383b11|223344556677885f5f5f5f 64 intel pminud xmm2, xmmword ptr [rcx] -660f383b11|223344556677885f5f5f5f 64 plan9 PMINUD 0(CX), X2 -660f383c11|223344556677885f5f5f5f 32 intel pmaxsb xmm2, xmmword ptr [ecx] -660f383c11|223344556677885f5f5f5f 32 plan9 PMAXSB 0(CX), X2 -660f383c11|223344556677885f5f5f5f 64 gnu pmaxsb (%rcx),%xmm2 -660f383c11|223344556677885f5f5f5f 64 intel pmaxsb xmm2, xmmword ptr [rcx] -660f383c11|223344556677885f5f5f5f 64 plan9 PMAXSB 0(CX), X2 -660f383d11|223344556677885f5f5f5f 32 intel pmaxsd xmm2, xmmword ptr [ecx] -660f383d11|223344556677885f5f5f5f 32 plan9 PMAXSD 0(CX), X2 -660f383d11|223344556677885f5f5f5f 64 gnu pmaxsd (%rcx),%xmm2 -660f383d11|223344556677885f5f5f5f 64 intel pmaxsd xmm2, xmmword ptr [rcx] -660f383d11|223344556677885f5f5f5f 64 plan9 PMAXSD 0(CX), X2 -660f383e11|223344556677885f5f5f5f 32 intel pmaxuw xmm2, xmmword ptr [ecx] -660f383e11|223344556677885f5f5f5f 32 plan9 PMAXUW 0(CX), X2 -660f383e11|223344556677885f5f5f5f 64 gnu pmaxuw (%rcx),%xmm2 -660f383e11|223344556677885f5f5f5f 64 intel pmaxuw xmm2, xmmword ptr [rcx] -660f383e11|223344556677885f5f5f5f 64 plan9 PMAXUW 0(CX), X2 -660f383f11|223344556677885f5f5f5f 32 intel pmaxud xmm2, xmmword ptr [ecx] -660f383f11|223344556677885f5f5f5f 32 plan9 PMAXUD 0(CX), X2 -660f383f11|223344556677885f5f5f5f 64 gnu pmaxud (%rcx),%xmm2 -660f383f11|223344556677885f5f5f5f 64 intel pmaxud xmm2, xmmword ptr [rcx] -660f383f11|223344556677885f5f5f5f 64 plan9 PMAXUD 0(CX), X2 -660f384011|223344556677885f5f5f5f 32 intel pmulld xmm2, xmmword ptr [ecx] -660f384011|223344556677885f5f5f5f 32 plan9 PMULLD 0(CX), X2 -660f384011|223344556677885f5f5f5f 64 gnu pmulld (%rcx),%xmm2 -660f384011|223344556677885f5f5f5f 64 intel pmulld xmm2, xmmword ptr [rcx] -660f384011|223344556677885f5f5f5f 64 plan9 PMULLD 0(CX), X2 -660f384111|223344556677885f5f5f5f 32 intel phminposuw xmm2, xmmword ptr [ecx] -660f384111|223344556677885f5f5f5f 32 plan9 PHMINPOSUW 0(CX), X2 -660f384111|223344556677885f5f5f5f 64 gnu phminposuw (%rcx),%xmm2 -660f384111|223344556677885f5f5f5f 64 intel phminposuw xmm2, xmmword ptr [rcx] -660f384111|223344556677885f5f5f5f 64 plan9 PHMINPOSUW 0(CX), X2 -660f388211|223344556677885f5f5f5f 32 intel invpcid edx, xmmword ptr [ecx] -660f388211|223344556677885f5f5f5f 32 plan9 INVPCID 0(CX), DX -660f388211|223344556677885f5f5f5f 64 gnu invpcid (%rcx),%rdx -660f388211|223344556677885f5f5f5f 64 intel invpcid rdx, xmmword ptr [rcx] -660f388211|223344556677885f5f5f5f 64 plan9 INVPCID 0(CX), DX -660f38db11|223344556677885f5f5f5f 32 intel aesimc xmm2, xmmword ptr [ecx] -660f38db11|223344556677885f5f5f5f 32 plan9 AESIMC 0(CX), X2 -660f38db11|223344556677885f5f5f5f 64 gnu aesimc (%rcx),%xmm2 -660f38db11|223344556677885f5f5f5f 64 intel aesimc xmm2, xmmword ptr [rcx] -660f38db11|223344556677885f5f5f5f 64 plan9 AESIMC 0(CX), X2 -660f38dc11|223344556677885f5f5f5f 32 intel aesenc xmm2, xmmword ptr [ecx] -660f38dc11|223344556677885f5f5f5f 32 plan9 AESENC 0(CX), X2 -660f38dc11|223344556677885f5f5f5f 64 gnu aesenc (%rcx),%xmm2 -660f38dc11|223344556677885f5f5f5f 64 intel aesenc xmm2, xmmword ptr [rcx] -660f38dc11|223344556677885f5f5f5f 64 plan9 AESENC 0(CX), X2 -660f38dd11|223344556677885f5f5f5f 32 intel aesenclast xmm2, xmmword ptr [ecx] -660f38dd11|223344556677885f5f5f5f 32 plan9 AESENCLAST 0(CX), X2 -660f38dd11|223344556677885f5f5f5f 64 gnu aesenclast (%rcx),%xmm2 -660f38dd11|223344556677885f5f5f5f 64 intel aesenclast xmm2, xmmword ptr [rcx] -660f38dd11|223344556677885f5f5f5f 64 plan9 AESENCLAST 0(CX), X2 -660f38de11|223344556677885f5f5f5f 32 intel aesdec xmm2, xmmword ptr [ecx] -660f38de11|223344556677885f5f5f5f 32 plan9 AESDEC 0(CX), X2 -660f38de11|223344556677885f5f5f5f 64 gnu aesdec (%rcx),%xmm2 -660f38de11|223344556677885f5f5f5f 64 intel aesdec xmm2, xmmword ptr [rcx] -660f38de11|223344556677885f5f5f5f 64 plan9 AESDEC 0(CX), X2 -660f38df11|223344556677885f5f5f5f 32 intel aesdeclast xmm2, xmmword ptr [ecx] -660f38df11|223344556677885f5f5f5f 32 plan9 AESDECLAST 0(CX), X2 -660f38df11|223344556677885f5f5f5f 64 gnu aesdeclast (%rcx),%xmm2 -660f38df11|223344556677885f5f5f5f 64 intel aesdeclast xmm2, xmmword ptr [rcx] -660f38df11|223344556677885f5f5f5f 64 plan9 AESDECLAST 0(CX), X2 -660f3a081122|3344556677885f5f5f5f 32 intel roundps xmm2, xmmword ptr [ecx], 0x22 -660f3a081122|3344556677885f5f5f5f 32 plan9 ROUNDPS $0x22, 0(CX), X2 -660f3a081122|3344556677885f5f5f5f 64 gnu roundps $0x22,(%rcx),%xmm2 -660f3a081122|3344556677885f5f5f5f 64 intel roundps xmm2, xmmword ptr [rcx], 0x22 -660f3a081122|3344556677885f5f5f5f 64 plan9 ROUNDPS $0x22, 0(CX), X2 -660f3a091122|3344556677885f5f5f5f 32 intel roundpd xmm2, xmmword ptr [ecx], 0x22 -660f3a091122|3344556677885f5f5f5f 32 plan9 ROUNDPD $0x22, 0(CX), X2 -660f3a091122|3344556677885f5f5f5f 64 gnu roundpd $0x22,(%rcx),%xmm2 -660f3a091122|3344556677885f5f5f5f 64 intel roundpd xmm2, xmmword ptr [rcx], 0x22 -660f3a091122|3344556677885f5f5f5f 64 plan9 ROUNDPD $0x22, 0(CX), X2 -660f3a0a1122|3344556677885f5f5f5f 32 intel roundss xmm2, dword ptr [ecx], 0x22 -660f3a0a1122|3344556677885f5f5f5f 32 plan9 ROUNDSS $0x22, 0(CX), X2 -660f3a0a1122|3344556677885f5f5f5f 64 gnu roundss $0x22,(%rcx),%xmm2 -660f3a0a1122|3344556677885f5f5f5f 64 intel roundss xmm2, dword ptr [rcx], 0x22 -660f3a0a1122|3344556677885f5f5f5f 64 plan9 ROUNDSS $0x22, 0(CX), X2 -660f3a0b1122|3344556677885f5f5f5f 32 intel roundsd xmm2, qword ptr [ecx], 0x22 -660f3a0b1122|3344556677885f5f5f5f 32 plan9 ROUNDSD $0x22, 0(CX), X2 -660f3a0b1122|3344556677885f5f5f5f 64 gnu roundsd $0x22,(%rcx),%xmm2 -660f3a0b1122|3344556677885f5f5f5f 64 intel roundsd xmm2, qword ptr [rcx], 0x22 -660f3a0b1122|3344556677885f5f5f5f 64 plan9 ROUNDSD $0x22, 0(CX), X2 -660f3a0c1122|3344556677885f5f5f5f 32 intel blendps xmm2, xmmword ptr [ecx], 0x22 -660f3a0c1122|3344556677885f5f5f5f 32 plan9 BLENDPS $0x22, 0(CX), X2 -660f3a0c1122|3344556677885f5f5f5f 64 gnu blendps $0x22,(%rcx),%xmm2 -660f3a0c1122|3344556677885f5f5f5f 64 intel blendps xmm2, xmmword ptr [rcx], 0x22 -660f3a0c1122|3344556677885f5f5f5f 64 plan9 BLENDPS $0x22, 0(CX), X2 -660f3a0d1122|3344556677885f5f5f5f 32 intel blendpd xmm2, xmmword ptr [ecx], 0x22 -660f3a0d1122|3344556677885f5f5f5f 32 plan9 BLENDPD $0x22, 0(CX), X2 -660f3a0d1122|3344556677885f5f5f5f 64 gnu blendpd $0x22,(%rcx),%xmm2 -660f3a0d1122|3344556677885f5f5f5f 64 intel blendpd xmm2, xmmword ptr [rcx], 0x22 -660f3a0d1122|3344556677885f5f5f5f 64 plan9 BLENDPD $0x22, 0(CX), X2 -660f3a0e1122|3344556677885f5f5f5f 32 intel pblendw xmm2, xmmword ptr [ecx], 0x22 -660f3a0e1122|3344556677885f5f5f5f 32 plan9 PBLENDW $0x22, 0(CX), X2 -660f3a0e1122|3344556677885f5f5f5f 64 gnu pblendw $0x22,(%rcx),%xmm2 -660f3a0e1122|3344556677885f5f5f5f 64 intel pblendw xmm2, xmmword ptr [rcx], 0x22 -660f3a0e1122|3344556677885f5f5f5f 64 plan9 PBLENDW $0x22, 0(CX), X2 -660f3a0f1122|3344556677885f5f5f5f 32 intel palignr xmm2, xmmword ptr [ecx], 0x22 -660f3a0f1122|3344556677885f5f5f5f 32 plan9 PALIGNR $0x22, 0(CX), X2 -660f3a0f1122|3344556677885f5f5f5f 64 gnu palignr $0x22,(%rcx),%xmm2 -660f3a0f1122|3344556677885f5f5f5f 64 intel palignr xmm2, xmmword ptr [rcx], 0x22 -660f3a0f1122|3344556677885f5f5f5f 64 plan9 PALIGNR $0x22, 0(CX), X2 -660f3a141122|3344556677885f5f5f5f 32 intel pextrb byte ptr [ecx], xmm2, 0x22 -660f3a141122|3344556677885f5f5f5f 32 plan9 PEXTRB $0x22, X2, 0(CX) -660f3a141122|3344556677885f5f5f5f 64 gnu pextrb $0x22,%xmm2,(%rcx) -660f3a141122|3344556677885f5f5f5f 64 intel pextrb byte ptr [rcx], xmm2, 0x22 -660f3a141122|3344556677885f5f5f5f 64 plan9 PEXTRB $0x22, X2, 0(CX) -660f3a151122|3344556677885f5f5f5f 32 intel pextrw word ptr [ecx], xmm2, 0x22 -660f3a151122|3344556677885f5f5f5f 32 plan9 PEXTRW $0x22, X2, 0(CX) -660f3a151122|3344556677885f5f5f5f 64 gnu pextrw $0x22,%xmm2,(%rcx) -660f3a151122|3344556677885f5f5f5f 64 intel pextrw word ptr [rcx], xmm2, 0x22 -660f3a151122|3344556677885f5f5f5f 64 plan9 PEXTRW $0x22, X2, 0(CX) -660f3a161122|3344556677885f5f5f5f 32 intel pextrd dword ptr [ecx], xmm2, 0x22 -660f3a161122|3344556677885f5f5f5f 32 plan9 PEXTRD $0x22, X2, 0(CX) -660f3a161122|3344556677885f5f5f5f 64 gnu pextrd $0x22,%xmm2,(%rcx) -660f3a161122|3344556677885f5f5f5f 64 intel pextrd dword ptr [rcx], xmm2, 0x22 -660f3a161122|3344556677885f5f5f5f 64 plan9 PEXTRD $0x22, X2, 0(CX) -660f3a171122|3344556677885f5f5f5f 32 intel extractps dword ptr [ecx], xmm2, 0x22 -660f3a171122|3344556677885f5f5f5f 32 plan9 EXTRACTPS $0x22, X2, 0(CX) -660f3a171122|3344556677885f5f5f5f 64 gnu extractps $0x22,%xmm2,(%rcx) -660f3a171122|3344556677885f5f5f5f 64 intel extractps dword ptr [rcx], xmm2, 0x22 -660f3a171122|3344556677885f5f5f5f 64 plan9 EXTRACTPS $0x22, X2, 0(CX) -660f3a201122|3344556677885f5f5f5f 32 intel pinsrb xmm2, byte ptr [ecx], 0x22 -660f3a201122|3344556677885f5f5f5f 32 plan9 PINSRB $0x22, 0(CX), X2 -660f3a201122|3344556677885f5f5f5f 64 gnu pinsrb $0x22,(%rcx),%xmm2 -660f3a201122|3344556677885f5f5f5f 64 intel pinsrb xmm2, byte ptr [rcx], 0x22 -660f3a201122|3344556677885f5f5f5f 64 plan9 PINSRB $0x22, 0(CX), X2 -660f3a211122|3344556677885f5f5f5f 32 intel insertps xmm2, dword ptr [ecx], 0x22 -660f3a211122|3344556677885f5f5f5f 32 plan9 INSERTPS $0x22, 0(CX), X2 -660f3a211122|3344556677885f5f5f5f 64 gnu insertps $0x22,(%rcx),%xmm2 -660f3a211122|3344556677885f5f5f5f 64 intel insertps xmm2, dword ptr [rcx], 0x22 -660f3a211122|3344556677885f5f5f5f 64 plan9 INSERTPS $0x22, 0(CX), X2 -660f3a221122|3344556677885f5f5f5f 32 intel pinsrd xmm2, dword ptr [ecx], 0x22 -660f3a221122|3344556677885f5f5f5f 32 plan9 PINSRD $0x22, 0(CX), X2 -660f3a221122|3344556677885f5f5f5f 64 gnu pinsrd $0x22,(%rcx),%xmm2 -660f3a221122|3344556677885f5f5f5f 64 intel pinsrd xmm2, dword ptr [rcx], 0x22 -660f3a221122|3344556677885f5f5f5f 64 plan9 PINSRD $0x22, 0(CX), X2 -660f3a401122|3344556677885f5f5f5f 32 intel dpps xmm2, xmmword ptr [ecx], 0x22 -660f3a401122|3344556677885f5f5f5f 32 plan9 DPPS $0x22, 0(CX), X2 -660f3a401122|3344556677885f5f5f5f 64 gnu dpps $0x22,(%rcx),%xmm2 -660f3a401122|3344556677885f5f5f5f 64 intel dpps xmm2, xmmword ptr [rcx], 0x22 -660f3a401122|3344556677885f5f5f5f 64 plan9 DPPS $0x22, 0(CX), X2 -660f3a411122|3344556677885f5f5f5f 32 intel dppd xmm2, xmmword ptr [ecx], 0x22 -660f3a411122|3344556677885f5f5f5f 32 plan9 DPPD $0x22, 0(CX), X2 -660f3a411122|3344556677885f5f5f5f 64 gnu dppd $0x22,(%rcx),%xmm2 -660f3a411122|3344556677885f5f5f5f 64 intel dppd xmm2, xmmword ptr [rcx], 0x22 -660f3a411122|3344556677885f5f5f5f 64 plan9 DPPD $0x22, 0(CX), X2 -660f3a421122|3344556677885f5f5f5f 32 intel mpsadbw xmm2, xmmword ptr [ecx], 0x22 -660f3a421122|3344556677885f5f5f5f 32 plan9 MPSADBW $0x22, 0(CX), X2 -660f3a421122|3344556677885f5f5f5f 64 gnu mpsadbw $0x22,(%rcx),%xmm2 -660f3a421122|3344556677885f5f5f5f 64 intel mpsadbw xmm2, xmmword ptr [rcx], 0x22 -660f3a421122|3344556677885f5f5f5f 64 plan9 MPSADBW $0x22, 0(CX), X2 -660f3a441122|3344556677885f5f5f5f 32 intel pclmulqdq xmm2, xmmword ptr [ecx], 0x22 -660f3a441122|3344556677885f5f5f5f 32 plan9 PCLMULQDQ $0x22, 0(CX), X2 -660f3a441122|3344556677885f5f5f5f 64 gnu pclmulqdq $0x22,(%rcx),%xmm2 -660f3a441122|3344556677885f5f5f5f 64 intel pclmulqdq xmm2, xmmword ptr [rcx], 0x22 -660f3a441122|3344556677885f5f5f5f 64 plan9 PCLMULQDQ $0x22, 0(CX), X2 -660f3a601122|3344556677885f5f5f5f 32 intel pcmpestrm xmm2, xmmword ptr [ecx], 0x22 -660f3a601122|3344556677885f5f5f5f 32 plan9 PCMPESTRM $0x22, 0(CX), X2 -660f3a601122|3344556677885f5f5f5f 64 gnu pcmpestrm $0x22,(%rcx),%xmm2 -660f3a601122|3344556677885f5f5f5f 64 intel pcmpestrm xmm2, xmmword ptr [rcx], 0x22 -660f3a601122|3344556677885f5f5f5f 64 plan9 PCMPESTRM $0x22, 0(CX), X2 -660f3a611122|3344556677885f5f5f5f 32 intel pcmpestri xmm2, xmmword ptr [ecx], 0x22 -660f3a611122|3344556677885f5f5f5f 32 plan9 PCMPESTRI $0x22, 0(CX), X2 -660f3a611122|3344556677885f5f5f5f 64 gnu pcmpestri $0x22,(%rcx),%xmm2 -660f3a611122|3344556677885f5f5f5f 64 intel pcmpestri xmm2, xmmword ptr [rcx], 0x22 -660f3a611122|3344556677885f5f5f5f 64 plan9 PCMPESTRI $0x22, 0(CX), X2 -660f3a621122|3344556677885f5f5f5f 32 intel pcmpistrm xmm2, xmmword ptr [ecx], 0x22 -660f3a621122|3344556677885f5f5f5f 32 plan9 PCMPISTRM $0x22, 0(CX), X2 -660f3a621122|3344556677885f5f5f5f 64 gnu pcmpistrm $0x22,(%rcx),%xmm2 -660f3a621122|3344556677885f5f5f5f 64 intel pcmpistrm xmm2, xmmword ptr [rcx], 0x22 -660f3a621122|3344556677885f5f5f5f 64 plan9 PCMPISTRM $0x22, 0(CX), X2 -660f3a631122|3344556677885f5f5f5f 32 intel pcmpistri xmm2, xmmword ptr [ecx], 0x22 -660f3a631122|3344556677885f5f5f5f 32 plan9 PCMPISTRI $0x22, 0(CX), X2 -660f3a631122|3344556677885f5f5f5f 64 gnu pcmpistri $0x22,(%rcx),%xmm2 -660f3a631122|3344556677885f5f5f5f 64 intel pcmpistri xmm2, xmmword ptr [rcx], 0x22 -660f3a631122|3344556677885f5f5f5f 64 plan9 PCMPISTRI $0x22, 0(CX), X2 -660f3adf1122|3344556677885f5f5f5f 32 intel aeskeygenassist xmm2, xmmword ptr [ecx], 0x22 -660f3adf1122|3344556677885f5f5f5f 32 plan9 AESKEYGENASSIST $0x22, 0(CX), X2 -660f3adf1122|3344556677885f5f5f5f 64 gnu aeskeygenassist $0x22,(%rcx),%xmm2 -660f3adf1122|3344556677885f5f5f5f 64 intel aeskeygenassist xmm2, xmmword ptr [rcx], 0x22 -660f3adf1122|3344556677885f5f5f5f 64 plan9 AESKEYGENASSIST $0x22, 0(CX), X2 -660f4011|223344556677885f5f5f5f5f 32 intel cmovo dx, word ptr [ecx] -660f4011|223344556677885f5f5f5f5f 32 plan9 CMOVO 0(CX), DX -660f4011|223344556677885f5f5f5f5f 64 gnu cmovo (%rcx),%dx -660f4011|223344556677885f5f5f5f5f 64 intel cmovo dx, word ptr [rcx] -660f4011|223344556677885f5f5f5f5f 64 plan9 CMOVO 0(CX), DX -660f4111|223344556677885f5f5f5f5f 32 intel cmovno dx, word ptr [ecx] -660f4111|223344556677885f5f5f5f5f 32 plan9 CMOVNO 0(CX), DX -660f4111|223344556677885f5f5f5f5f 64 gnu cmovno (%rcx),%dx -660f4111|223344556677885f5f5f5f5f 64 intel cmovno dx, word ptr [rcx] -660f4111|223344556677885f5f5f5f5f 64 plan9 CMOVNO 0(CX), DX -660f4211|223344556677885f5f5f5f5f 32 intel cmovb dx, word ptr [ecx] -660f4211|223344556677885f5f5f5f5f 32 plan9 CMOVB 0(CX), DX -660f4211|223344556677885f5f5f5f5f 64 gnu cmovb (%rcx),%dx -660f4211|223344556677885f5f5f5f5f 64 intel cmovb dx, word ptr [rcx] -660f4211|223344556677885f5f5f5f5f 64 plan9 CMOVB 0(CX), DX -660f4311|223344556677885f5f5f5f5f 32 intel cmovnb dx, word ptr [ecx] -660f4311|223344556677885f5f5f5f5f 32 plan9 CMOVAE 0(CX), DX -660f4311|223344556677885f5f5f5f5f 64 gnu cmovae (%rcx),%dx -660f4311|223344556677885f5f5f5f5f 64 intel cmovnb dx, word ptr [rcx] -660f4311|223344556677885f5f5f5f5f 64 plan9 CMOVAE 0(CX), DX -660f4411|223344556677885f5f5f5f5f 32 intel cmovz dx, word ptr [ecx] -660f4411|223344556677885f5f5f5f5f 32 plan9 CMOVE 0(CX), DX -660f4411|223344556677885f5f5f5f5f 64 gnu cmove (%rcx),%dx -660f4411|223344556677885f5f5f5f5f 64 intel cmovz dx, word ptr [rcx] -660f4411|223344556677885f5f5f5f5f 64 plan9 CMOVE 0(CX), DX -660f4511|223344556677885f5f5f5f5f 32 intel cmovnz dx, word ptr [ecx] -660f4511|223344556677885f5f5f5f5f 32 plan9 CMOVNE 0(CX), DX -660f4511|223344556677885f5f5f5f5f 64 gnu cmovne (%rcx),%dx -660f4511|223344556677885f5f5f5f5f 64 intel cmovnz dx, word ptr [rcx] -660f4511|223344556677885f5f5f5f5f 64 plan9 CMOVNE 0(CX), DX -660f4611|223344556677885f5f5f5f5f 32 intel cmovbe dx, word ptr [ecx] -660f4611|223344556677885f5f5f5f5f 32 plan9 CMOVBE 0(CX), DX -660f4611|223344556677885f5f5f5f5f 64 gnu cmovbe (%rcx),%dx -660f4611|223344556677885f5f5f5f5f 64 intel cmovbe dx, word ptr [rcx] -660f4611|223344556677885f5f5f5f5f 64 plan9 CMOVBE 0(CX), DX -660f4711|223344556677885f5f5f5f5f 32 intel cmovnbe dx, word ptr [ecx] -660f4711|223344556677885f5f5f5f5f 32 plan9 CMOVA 0(CX), DX -660f4711|223344556677885f5f5f5f5f 64 gnu cmova (%rcx),%dx -660f4711|223344556677885f5f5f5f5f 64 intel cmovnbe dx, word ptr [rcx] -660f4711|223344556677885f5f5f5f5f 64 plan9 CMOVA 0(CX), DX -660f4811|223344556677885f5f5f5f5f 32 intel cmovs dx, word ptr [ecx] -660f4811|223344556677885f5f5f5f5f 32 plan9 CMOVS 0(CX), DX -660f4811|223344556677885f5f5f5f5f 64 gnu cmovs (%rcx),%dx -660f4811|223344556677885f5f5f5f5f 64 intel cmovs dx, word ptr [rcx] -660f4811|223344556677885f5f5f5f5f 64 plan9 CMOVS 0(CX), DX -660f4911|223344556677885f5f5f5f5f 32 intel cmovns dx, word ptr [ecx] -660f4911|223344556677885f5f5f5f5f 32 plan9 CMOVNS 0(CX), DX -660f4911|223344556677885f5f5f5f5f 64 gnu cmovns (%rcx),%dx -660f4911|223344556677885f5f5f5f5f 64 intel cmovns dx, word ptr [rcx] -660f4911|223344556677885f5f5f5f5f 64 plan9 CMOVNS 0(CX), DX -660f4a11|223344556677885f5f5f5f5f 32 intel cmovp dx, word ptr [ecx] -660f4a11|223344556677885f5f5f5f5f 32 plan9 CMOVP 0(CX), DX -660f4a11|223344556677885f5f5f5f5f 64 gnu cmovp (%rcx),%dx -660f4a11|223344556677885f5f5f5f5f 64 intel cmovp dx, word ptr [rcx] -660f4a11|223344556677885f5f5f5f5f 64 plan9 CMOVP 0(CX), DX -660f4b11|223344556677885f5f5f5f5f 32 intel cmovnp dx, word ptr [ecx] -660f4b11|223344556677885f5f5f5f5f 32 plan9 CMOVNP 0(CX), DX -660f4b11|223344556677885f5f5f5f5f 64 gnu cmovnp (%rcx),%dx -660f4b11|223344556677885f5f5f5f5f 64 intel cmovnp dx, word ptr [rcx] -660f4b11|223344556677885f5f5f5f5f 64 plan9 CMOVNP 0(CX), DX -660f4c11|223344556677885f5f5f5f5f 32 intel cmovl dx, word ptr [ecx] -660f4c11|223344556677885f5f5f5f5f 32 plan9 CMOVL 0(CX), DX -660f4c11|223344556677885f5f5f5f5f 64 gnu cmovl (%rcx),%dx -660f4c11|223344556677885f5f5f5f5f 64 intel cmovl dx, word ptr [rcx] -660f4c11|223344556677885f5f5f5f5f 64 plan9 CMOVL 0(CX), DX -660f4d11|223344556677885f5f5f5f5f 32 intel cmovnl dx, word ptr [ecx] -660f4d11|223344556677885f5f5f5f5f 32 plan9 CMOVGE 0(CX), DX -660f4d11|223344556677885f5f5f5f5f 64 gnu cmovge (%rcx),%dx -660f4d11|223344556677885f5f5f5f5f 64 intel cmovnl dx, word ptr [rcx] -660f4d11|223344556677885f5f5f5f5f 64 plan9 CMOVGE 0(CX), DX -660f4e11|223344556677885f5f5f5f5f 32 intel cmovle dx, word ptr [ecx] -660f4e11|223344556677885f5f5f5f5f 32 plan9 CMOVLE 0(CX), DX -660f4e11|223344556677885f5f5f5f5f 64 gnu cmovle (%rcx),%dx -660f4e11|223344556677885f5f5f5f5f 64 intel cmovle dx, word ptr [rcx] -660f4e11|223344556677885f5f5f5f5f 64 plan9 CMOVLE 0(CX), DX -660f4f11|223344556677885f5f5f5f5f 32 intel cmovnle dx, word ptr [ecx] -660f4f11|223344556677885f5f5f5f5f 32 plan9 CMOVG 0(CX), DX -660f4f11|223344556677885f5f5f5f5f 64 gnu cmovg (%rcx),%dx -660f4f11|223344556677885f5f5f5f5f 64 intel cmovnle dx, word ptr [rcx] -660f4f11|223344556677885f5f5f5f5f 64 plan9 CMOVG 0(CX), DX -660f50c0|11223344556677885f5f5f5f 32 intel movmskpd eax, xmm0 -660f50c0|11223344556677885f5f5f5f 32 plan9 MOVMSKPD X0, AX -660f50c0|11223344556677885f5f5f5f 64 gnu movmskpd %xmm0,%eax -660f50c0|11223344556677885f5f5f5f 64 intel movmskpd eax, xmm0 -660f50c0|11223344556677885f5f5f5f 64 plan9 MOVMSKPD X0, AX -660f5111|223344556677885f5f5f5f5f 32 intel sqrtpd xmm2, xmmword ptr [ecx] -660f5111|223344556677885f5f5f5f5f 32 plan9 SQRTPD 0(CX), X2 -660f5111|223344556677885f5f5f5f5f 64 gnu sqrtpd (%rcx),%xmm2 -660f5111|223344556677885f5f5f5f5f 64 intel sqrtpd xmm2, xmmword ptr [rcx] -660f5111|223344556677885f5f5f5f5f 64 plan9 SQRTPD 0(CX), X2 -660f5411|223344556677885f5f5f5f5f 32 intel andpd xmm2, xmmword ptr [ecx] -660f5411|223344556677885f5f5f5f5f 32 plan9 ANDPD 0(CX), X2 -660f5411|223344556677885f5f5f5f5f 64 gnu andpd (%rcx),%xmm2 -660f5411|223344556677885f5f5f5f5f 64 intel andpd xmm2, xmmword ptr [rcx] -660f5411|223344556677885f5f5f5f5f 64 plan9 ANDPD 0(CX), X2 -660f5511|223344556677885f5f5f5f5f 32 intel andnpd xmm2, xmmword ptr [ecx] -660f5511|223344556677885f5f5f5f5f 32 plan9 ANDNPD 0(CX), X2 -660f5511|223344556677885f5f5f5f5f 64 gnu andnpd (%rcx),%xmm2 -660f5511|223344556677885f5f5f5f5f 64 intel andnpd xmm2, xmmword ptr [rcx] -660f5511|223344556677885f5f5f5f5f 64 plan9 ANDNPD 0(CX), X2 -660f5611|223344556677885f5f5f5f5f 32 intel orpd xmm2, xmmword ptr [ecx] -660f5611|223344556677885f5f5f5f5f 32 plan9 ORPD 0(CX), X2 -660f5611|223344556677885f5f5f5f5f 64 gnu orpd (%rcx),%xmm2 -660f5611|223344556677885f5f5f5f5f 64 intel orpd xmm2, xmmword ptr [rcx] -660f5611|223344556677885f5f5f5f5f 64 plan9 ORPD 0(CX), X2 -660f5711|223344556677885f5f5f5f5f 32 intel xorpd xmm2, xmmword ptr [ecx] -660f5711|223344556677885f5f5f5f5f 32 plan9 XORPD 0(CX), X2 -660f5711|223344556677885f5f5f5f5f 64 gnu xorpd (%rcx),%xmm2 -660f5711|223344556677885f5f5f5f5f 64 intel xorpd xmm2, xmmword ptr [rcx] -660f5711|223344556677885f5f5f5f5f 64 plan9 XORPD 0(CX), X2 -660f5811|223344556677885f5f5f5f5f 32 intel addpd xmm2, xmmword ptr [ecx] -660f5811|223344556677885f5f5f5f5f 32 plan9 ADDPD 0(CX), X2 -660f5811|223344556677885f5f5f5f5f 64 gnu addpd (%rcx),%xmm2 -660f5811|223344556677885f5f5f5f5f 64 intel addpd xmm2, xmmword ptr [rcx] -660f5811|223344556677885f5f5f5f5f 64 plan9 ADDPD 0(CX), X2 -660f5911|223344556677885f5f5f5f5f 32 intel mulpd xmm2, xmmword ptr [ecx] -660f5911|223344556677885f5f5f5f5f 32 plan9 MULPD 0(CX), X2 -660f5911|223344556677885f5f5f5f5f 64 gnu mulpd (%rcx),%xmm2 -660f5911|223344556677885f5f5f5f5f 64 intel mulpd xmm2, xmmword ptr [rcx] -660f5911|223344556677885f5f5f5f5f 64 plan9 MULPD 0(CX), X2 -660f5a11|223344556677885f5f5f5f5f 32 intel cvtpd2ps xmm2, xmmword ptr [ecx] -660f5a11|223344556677885f5f5f5f5f 32 plan9 CVTPD2PS 0(CX), X2 -660f5a11|223344556677885f5f5f5f5f 64 gnu cvtpd2ps (%rcx),%xmm2 -660f5a11|223344556677885f5f5f5f5f 64 intel cvtpd2ps xmm2, xmmword ptr [rcx] -660f5a11|223344556677885f5f5f5f5f 64 plan9 CVTPD2PS 0(CX), X2 -660f5b11|223344556677885f5f5f5f5f 32 intel cvtps2dq xmm2, xmmword ptr [ecx] -660f5b11|223344556677885f5f5f5f5f 32 plan9 CVTPS2DQ 0(CX), X2 -660f5b11|223344556677885f5f5f5f5f 64 gnu cvtps2dq (%rcx),%xmm2 -660f5b11|223344556677885f5f5f5f5f 64 intel cvtps2dq xmm2, xmmword ptr [rcx] -660f5b11|223344556677885f5f5f5f5f 64 plan9 CVTPS2DQ 0(CX), X2 -660f5c11|223344556677885f5f5f5f5f 32 intel subpd xmm2, xmmword ptr [ecx] -660f5c11|223344556677885f5f5f5f5f 32 plan9 SUBPD 0(CX), X2 -660f5c11|223344556677885f5f5f5f5f 64 gnu subpd (%rcx),%xmm2 -660f5c11|223344556677885f5f5f5f5f 64 intel subpd xmm2, xmmword ptr [rcx] -660f5c11|223344556677885f5f5f5f5f 64 plan9 SUBPD 0(CX), X2 -660f5d11|223344556677885f5f5f5f5f 32 intel minpd xmm2, xmmword ptr [ecx] -660f5d11|223344556677885f5f5f5f5f 32 plan9 MINPD 0(CX), X2 -660f5d11|223344556677885f5f5f5f5f 64 gnu minpd (%rcx),%xmm2 -660f5d11|223344556677885f5f5f5f5f 64 intel minpd xmm2, xmmword ptr [rcx] -660f5d11|223344556677885f5f5f5f5f 64 plan9 MINPD 0(CX), X2 -660f5e11|223344556677885f5f5f5f5f 32 intel divpd xmm2, xmmword ptr [ecx] -660f5e11|223344556677885f5f5f5f5f 32 plan9 DIVPD 0(CX), X2 -660f5e11|223344556677885f5f5f5f5f 64 gnu divpd (%rcx),%xmm2 -660f5e11|223344556677885f5f5f5f5f 64 intel divpd xmm2, xmmword ptr [rcx] -660f5e11|223344556677885f5f5f5f5f 64 plan9 DIVPD 0(CX), X2 -660f5f11|223344556677885f5f5f5f5f 32 intel maxpd xmm2, xmmword ptr [ecx] -660f5f11|223344556677885f5f5f5f5f 32 plan9 MAXPD 0(CX), X2 -660f5f11|223344556677885f5f5f5f5f 64 gnu maxpd (%rcx),%xmm2 -660f5f11|223344556677885f5f5f5f5f 64 intel maxpd xmm2, xmmword ptr [rcx] -660f5f11|223344556677885f5f5f5f5f 64 plan9 MAXPD 0(CX), X2 -660f6011|223344556677885f5f5f5f5f 32 intel punpcklbw xmm2, xmmword ptr [ecx] -660f6011|223344556677885f5f5f5f5f 32 plan9 PUNPCKLBW 0(CX), X2 -660f6011|223344556677885f5f5f5f5f 64 gnu punpcklbw (%rcx),%xmm2 -660f6011|223344556677885f5f5f5f5f 64 intel punpcklbw xmm2, xmmword ptr [rcx] -660f6011|223344556677885f5f5f5f5f 64 plan9 PUNPCKLBW 0(CX), X2 -660f6111|223344556677885f5f5f5f5f 32 intel punpcklwd xmm2, xmmword ptr [ecx] -660f6111|223344556677885f5f5f5f5f 32 plan9 PUNPCKLWD 0(CX), X2 -660f6111|223344556677885f5f5f5f5f 64 gnu punpcklwd (%rcx),%xmm2 -660f6111|223344556677885f5f5f5f5f 64 intel punpcklwd xmm2, xmmword ptr [rcx] -660f6111|223344556677885f5f5f5f5f 64 plan9 PUNPCKLWD 0(CX), X2 -660f6211|223344556677885f5f5f5f5f 32 intel punpckldq xmm2, xmmword ptr [ecx] -660f6211|223344556677885f5f5f5f5f 32 plan9 PUNPCKLDQ 0(CX), X2 -660f6211|223344556677885f5f5f5f5f 64 gnu punpckldq (%rcx),%xmm2 -660f6211|223344556677885f5f5f5f5f 64 intel punpckldq xmm2, xmmword ptr [rcx] -660f6211|223344556677885f5f5f5f5f 64 plan9 PUNPCKLDQ 0(CX), X2 -660f6311|223344556677885f5f5f5f5f 32 intel packsswb xmm2, xmmword ptr [ecx] -660f6311|223344556677885f5f5f5f5f 32 plan9 PACKSSWB 0(CX), X2 -660f6311|223344556677885f5f5f5f5f 64 gnu packsswb (%rcx),%xmm2 -660f6311|223344556677885f5f5f5f5f 64 intel packsswb xmm2, xmmword ptr [rcx] -660f6311|223344556677885f5f5f5f5f 64 plan9 PACKSSWB 0(CX), X2 -660f6411|223344556677885f5f5f5f5f 32 intel pcmpgtb xmm2, xmmword ptr [ecx] -660f6411|223344556677885f5f5f5f5f 32 plan9 PCMPGTB 0(CX), X2 -660f6411|223344556677885f5f5f5f5f 64 gnu pcmpgtb (%rcx),%xmm2 -660f6411|223344556677885f5f5f5f5f 64 intel pcmpgtb xmm2, xmmword ptr [rcx] -660f6411|223344556677885f5f5f5f5f 64 plan9 PCMPGTB 0(CX), X2 -660f6511|223344556677885f5f5f5f5f 32 intel pcmpgtw xmm2, xmmword ptr [ecx] -660f6511|223344556677885f5f5f5f5f 32 plan9 PCMPGTW 0(CX), X2 -660f6511|223344556677885f5f5f5f5f 64 gnu pcmpgtw (%rcx),%xmm2 -660f6511|223344556677885f5f5f5f5f 64 intel pcmpgtw xmm2, xmmword ptr [rcx] -660f6511|223344556677885f5f5f5f5f 64 plan9 PCMPGTW 0(CX), X2 -660f6611|223344556677885f5f5f5f5f 32 intel pcmpgtd xmm2, xmmword ptr [ecx] -660f6611|223344556677885f5f5f5f5f 32 plan9 PCMPGTD 0(CX), X2 -660f6611|223344556677885f5f5f5f5f 64 gnu pcmpgtd (%rcx),%xmm2 -660f6611|223344556677885f5f5f5f5f 64 intel pcmpgtd xmm2, xmmword ptr [rcx] -660f6611|223344556677885f5f5f5f5f 64 plan9 PCMPGTD 0(CX), X2 -660f6711|223344556677885f5f5f5f5f 32 intel packuswb xmm2, xmmword ptr [ecx] -660f6711|223344556677885f5f5f5f5f 32 plan9 PACKUSWB 0(CX), X2 -660f6711|223344556677885f5f5f5f5f 64 gnu packuswb (%rcx),%xmm2 -660f6711|223344556677885f5f5f5f5f 64 intel packuswb xmm2, xmmword ptr [rcx] -660f6711|223344556677885f5f5f5f5f 64 plan9 PACKUSWB 0(CX), X2 -660f6811|223344556677885f5f5f5f5f 32 intel punpckhbw xmm2, xmmword ptr [ecx] -660f6811|223344556677885f5f5f5f5f 32 plan9 PUNPCKHBW 0(CX), X2 -660f6811|223344556677885f5f5f5f5f 64 gnu punpckhbw (%rcx),%xmm2 -660f6811|223344556677885f5f5f5f5f 64 intel punpckhbw xmm2, xmmword ptr [rcx] -660f6811|223344556677885f5f5f5f5f 64 plan9 PUNPCKHBW 0(CX), X2 -660f6911|223344556677885f5f5f5f5f 32 intel punpckhwd xmm2, xmmword ptr [ecx] -660f6911|223344556677885f5f5f5f5f 32 plan9 PUNPCKHWD 0(CX), X2 -660f6911|223344556677885f5f5f5f5f 64 gnu punpckhwd (%rcx),%xmm2 -660f6911|223344556677885f5f5f5f5f 64 intel punpckhwd xmm2, xmmword ptr [rcx] -660f6911|223344556677885f5f5f5f5f 64 plan9 PUNPCKHWD 0(CX), X2 -660f6a11|223344556677885f5f5f5f5f 32 intel punpckhdq xmm2, xmmword ptr [ecx] -660f6a11|223344556677885f5f5f5f5f 32 plan9 PUNPCKHDQ 0(CX), X2 -660f6a11|223344556677885f5f5f5f5f 64 gnu punpckhdq (%rcx),%xmm2 -660f6a11|223344556677885f5f5f5f5f 64 intel punpckhdq xmm2, xmmword ptr [rcx] -660f6a11|223344556677885f5f5f5f5f 64 plan9 PUNPCKHDQ 0(CX), X2 -660f6b11|223344556677885f5f5f5f5f 32 intel packssdw xmm2, xmmword ptr [ecx] -660f6b11|223344556677885f5f5f5f5f 32 plan9 PACKSSDW 0(CX), X2 -660f6b11|223344556677885f5f5f5f5f 64 gnu packssdw (%rcx),%xmm2 -660f6b11|223344556677885f5f5f5f5f 64 intel packssdw xmm2, xmmword ptr [rcx] -660f6b11|223344556677885f5f5f5f5f 64 plan9 PACKSSDW 0(CX), X2 -660f6c11|223344556677885f5f5f5f5f 32 intel punpcklqdq xmm2, xmmword ptr [ecx] -660f6c11|223344556677885f5f5f5f5f 32 plan9 PUNPCKLQDQ 0(CX), X2 -660f6c11|223344556677885f5f5f5f5f 64 gnu punpcklqdq (%rcx),%xmm2 -660f6c11|223344556677885f5f5f5f5f 64 intel punpcklqdq xmm2, xmmword ptr [rcx] -660f6c11|223344556677885f5f5f5f5f 64 plan9 PUNPCKLQDQ 0(CX), X2 -660f6d11|223344556677885f5f5f5f5f 32 intel punpckhqdq xmm2, xmmword ptr [ecx] -660f6d11|223344556677885f5f5f5f5f 32 plan9 PUNPCKHQDQ 0(CX), X2 -660f6d11|223344556677885f5f5f5f5f 64 gnu punpckhqdq (%rcx),%xmm2 -660f6d11|223344556677885f5f5f5f5f 64 intel punpckhqdq xmm2, xmmword ptr [rcx] -660f6d11|223344556677885f5f5f5f5f 64 plan9 PUNPCKHQDQ 0(CX), X2 -660f6e11|223344556677885f5f5f5f5f 32 intel movd xmm2, dword ptr [ecx] -660f6e11|223344556677885f5f5f5f5f 32 plan9 MOVD 0(CX), X2 -660f6e11|223344556677885f5f5f5f5f 64 gnu movd (%rcx),%xmm2 -660f6e11|223344556677885f5f5f5f5f 64 intel movd xmm2, dword ptr [rcx] -660f6e11|223344556677885f5f5f5f5f 64 plan9 MOVD 0(CX), X2 -660f6f11|223344556677885f5f5f5f5f 32 intel movdqa xmm2, xmmword ptr [ecx] -660f6f11|223344556677885f5f5f5f5f 32 plan9 MOVDQA 0(CX), X2 -660f6f11|223344556677885f5f5f5f5f 64 gnu movdqa (%rcx),%xmm2 -660f6f11|223344556677885f5f5f5f5f 64 intel movdqa xmm2, xmmword ptr [rcx] -660f6f11|223344556677885f5f5f5f5f 64 plan9 MOVDQA 0(CX), X2 -660f701122|3344556677885f5f5f5f5f 32 intel pshufd xmm2, xmmword ptr [ecx], 0x22 -660f701122|3344556677885f5f5f5f5f 32 plan9 PSHUFD $0x22, 0(CX), X2 -660f701122|3344556677885f5f5f5f5f 64 gnu pshufd $0x22,(%rcx),%xmm2 -660f701122|3344556677885f5f5f5f5f 64 intel pshufd xmm2, xmmword ptr [rcx], 0x22 -660f701122|3344556677885f5f5f5f5f 64 plan9 PSHUFD $0x22, 0(CX), X2 -660f71d011|223344556677885f5f5f5f 32 intel psrlw xmm0, 0x11 -660f71d011|223344556677885f5f5f5f 32 plan9 PSRLW $0x11, X0 -660f71d011|223344556677885f5f5f5f 64 gnu psrlw $0x11,%xmm0 -660f71d011|223344556677885f5f5f5f 64 intel psrlw xmm0, 0x11 -660f71d011|223344556677885f5f5f5f 64 plan9 PSRLW $0x11, X0 -660f71e011|223344556677885f5f5f5f 32 intel psraw xmm0, 0x11 -660f71e011|223344556677885f5f5f5f 32 plan9 PSRAW $0x11, X0 -660f71e011|223344556677885f5f5f5f 64 gnu psraw $0x11,%xmm0 -660f71e011|223344556677885f5f5f5f 64 intel psraw xmm0, 0x11 -660f71e011|223344556677885f5f5f5f 64 plan9 PSRAW $0x11, X0 -660f71f011|223344556677885f5f5f5f 32 intel psllw xmm0, 0x11 -660f71f011|223344556677885f5f5f5f 32 plan9 PSLLW $0x11, X0 -660f71f011|223344556677885f5f5f5f 64 gnu psllw $0x11,%xmm0 -660f71f011|223344556677885f5f5f5f 64 intel psllw xmm0, 0x11 -660f71f011|223344556677885f5f5f5f 64 plan9 PSLLW $0x11, X0 -660f72d011|223344556677885f5f5f5f 32 intel psrld xmm0, 0x11 -660f72d011|223344556677885f5f5f5f 32 plan9 PSRLD $0x11, X0 -660f72d011|223344556677885f5f5f5f 64 gnu psrld $0x11,%xmm0 -660f72d011|223344556677885f5f5f5f 64 intel psrld xmm0, 0x11 -660f72d011|223344556677885f5f5f5f 64 plan9 PSRLD $0x11, X0 -660f72e011|223344556677885f5f5f5f 32 intel psrad xmm0, 0x11 -660f72e011|223344556677885f5f5f5f 32 plan9 PSRAD $0x11, X0 -660f72e011|223344556677885f5f5f5f 64 gnu psrad $0x11,%xmm0 -660f72e011|223344556677885f5f5f5f 64 intel psrad xmm0, 0x11 -660f72e011|223344556677885f5f5f5f 64 plan9 PSRAD $0x11, X0 -660f72f011|223344556677885f5f5f5f 32 intel pslld xmm0, 0x11 -660f72f011|223344556677885f5f5f5f 32 plan9 PSLLD $0x11, X0 -660f72f011|223344556677885f5f5f5f 64 gnu pslld $0x11,%xmm0 -660f72f011|223344556677885f5f5f5f 64 intel pslld xmm0, 0x11 -660f72f011|223344556677885f5f5f5f 64 plan9 PSLLD $0x11, X0 -660f73d011|223344556677885f5f5f5f 32 intel psrlq xmm0, 0x11 -660f73d011|223344556677885f5f5f5f 32 plan9 PSRLQ $0x11, X0 -660f73d011|223344556677885f5f5f5f 64 gnu psrlq $0x11,%xmm0 -660f73d011|223344556677885f5f5f5f 64 intel psrlq xmm0, 0x11 -660f73d011|223344556677885f5f5f5f 64 plan9 PSRLQ $0x11, X0 -660f73d811|223344556677885f5f5f5f 32 intel psrldq xmm0, 0x11 -660f73d811|223344556677885f5f5f5f 32 plan9 PSRLDQ $0x11, X0 -660f73d811|223344556677885f5f5f5f 64 gnu psrldq $0x11,%xmm0 -660f73d811|223344556677885f5f5f5f 64 intel psrldq xmm0, 0x11 -660f73d811|223344556677885f5f5f5f 64 plan9 PSRLDQ $0x11, X0 -660f73f011|223344556677885f5f5f5f 32 intel psllq xmm0, 0x11 -660f73f011|223344556677885f5f5f5f 32 plan9 PSLLQ $0x11, X0 -660f73f011|223344556677885f5f5f5f 64 gnu psllq $0x11,%xmm0 -660f73f011|223344556677885f5f5f5f 64 intel psllq xmm0, 0x11 -660f73f011|223344556677885f5f5f5f 64 plan9 PSLLQ $0x11, X0 -660f73f811|223344556677885f5f5f5f 32 intel pslldq xmm0, 0x11 -660f73f811|223344556677885f5f5f5f 32 plan9 PSLLDQ $0x11, X0 -660f73f811|223344556677885f5f5f5f 64 gnu pslldq $0x11,%xmm0 -660f73f811|223344556677885f5f5f5f 64 intel pslldq xmm0, 0x11 -660f73f811|223344556677885f5f5f5f 64 plan9 PSLLDQ $0x11, X0 -660f7411|223344556677885f5f5f5f5f 32 intel pcmpeqb xmm2, xmmword ptr [ecx] -660f7411|223344556677885f5f5f5f5f 32 plan9 PCMPEQB 0(CX), X2 -660f7411|223344556677885f5f5f5f5f 64 gnu pcmpeqb (%rcx),%xmm2 -660f7411|223344556677885f5f5f5f5f 64 intel pcmpeqb xmm2, xmmword ptr [rcx] -660f7411|223344556677885f5f5f5f5f 64 plan9 PCMPEQB 0(CX), X2 -660f7511|223344556677885f5f5f5f5f 32 intel pcmpeqw xmm2, xmmword ptr [ecx] -660f7511|223344556677885f5f5f5f5f 32 plan9 PCMPEQW 0(CX), X2 -660f7511|223344556677885f5f5f5f5f 64 gnu pcmpeqw (%rcx),%xmm2 -660f7511|223344556677885f5f5f5f5f 64 intel pcmpeqw xmm2, xmmword ptr [rcx] -660f7511|223344556677885f5f5f5f5f 64 plan9 PCMPEQW 0(CX), X2 -660f7611|223344556677885f5f5f5f5f 32 intel pcmpeqd xmm2, xmmword ptr [ecx] -660f7611|223344556677885f5f5f5f5f 32 plan9 PCMPEQD 0(CX), X2 -660f7611|223344556677885f5f5f5f5f 64 gnu pcmpeqd (%rcx),%xmm2 -660f7611|223344556677885f5f5f5f5f 64 intel pcmpeqd xmm2, xmmword ptr [rcx] -660f7611|223344556677885f5f5f5f5f 64 plan9 PCMPEQD 0(CX), X2 -660f7c11|223344556677885f5f5f5f5f 32 intel haddpd xmm2, xmmword ptr [ecx] -660f7c11|223344556677885f5f5f5f5f 32 plan9 HADDPD 0(CX), X2 -660f7c11|223344556677885f5f5f5f5f 64 gnu haddpd (%rcx),%xmm2 -660f7c11|223344556677885f5f5f5f5f 64 intel haddpd xmm2, xmmword ptr [rcx] -660f7c11|223344556677885f5f5f5f5f 64 plan9 HADDPD 0(CX), X2 -660f7d11|223344556677885f5f5f5f5f 32 intel hsubpd xmm2, xmmword ptr [ecx] -660f7d11|223344556677885f5f5f5f5f 32 plan9 HSUBPD 0(CX), X2 -660f7d11|223344556677885f5f5f5f5f 64 gnu hsubpd (%rcx),%xmm2 -660f7d11|223344556677885f5f5f5f5f 64 intel hsubpd xmm2, xmmword ptr [rcx] -660f7d11|223344556677885f5f5f5f5f 64 plan9 HSUBPD 0(CX), X2 -660f7e11|223344556677885f5f5f5f5f 32 intel movd dword ptr [ecx], xmm2 -660f7e11|223344556677885f5f5f5f5f 32 plan9 MOVD X2, 0(CX) -660f7e11|223344556677885f5f5f5f5f 64 gnu movd %xmm2,(%rcx) -660f7e11|223344556677885f5f5f5f5f 64 intel movd dword ptr [rcx], xmm2 -660f7e11|223344556677885f5f5f5f5f 64 plan9 MOVD X2, 0(CX) -660f7f11|223344556677885f5f5f5f5f 32 intel movdqa xmmword ptr [ecx], xmm2 -660f7f11|223344556677885f5f5f5f5f 32 plan9 MOVDQA X2, 0(CX) -660f7f11|223344556677885f5f5f5f5f 64 gnu movdqa %xmm2,(%rcx) -660f7f11|223344556677885f5f5f5f5f 64 intel movdqa xmmword ptr [rcx], xmm2 -660f7f11|223344556677885f5f5f5f5f 64 plan9 MOVDQA X2, 0(CX) -660f8011223344|556677885f5f5f5f5f 64 gnu jo .+0x44332211 -660f8011223344|556677885f5f5f5f5f 64 intel jo .+0x44332211 -660f8011223344|556677885f5f5f5f5f 64 plan9 JO .+1144201745 -660f801122|3344556677885f5f5f5f5f 32 intel jo .+0x2211 -660f801122|3344556677885f5f5f5f5f 32 plan9 JO .+8721 -660f8111223344|556677885f5f5f5f5f 64 gnu jno .+0x44332211 -660f8111223344|556677885f5f5f5f5f 64 intel jno .+0x44332211 -660f8111223344|556677885f5f5f5f5f 64 plan9 JNO .+1144201745 -660f811122|3344556677885f5f5f5f5f 32 intel jno .+0x2211 -660f811122|3344556677885f5f5f5f5f 32 plan9 JNO .+8721 -660f8211223344|556677885f5f5f5f5f 64 gnu jb .+0x44332211 -660f8211223344|556677885f5f5f5f5f 64 intel jb .+0x44332211 -660f8211223344|556677885f5f5f5f5f 64 plan9 JB .+1144201745 -660f821122|3344556677885f5f5f5f5f 32 intel jb .+0x2211 -660f821122|3344556677885f5f5f5f5f 32 plan9 JB .+8721 -660f8311223344|556677885f5f5f5f5f 64 gnu jae .+0x44332211 -660f8311223344|556677885f5f5f5f5f 64 intel jnb .+0x44332211 -660f8311223344|556677885f5f5f5f5f 64 plan9 JAE .+1144201745 -660f831122|3344556677885f5f5f5f5f 32 intel jnb .+0x2211 -660f831122|3344556677885f5f5f5f5f 32 plan9 JAE .+8721 -660f8411223344|556677885f5f5f5f5f 64 gnu je .+0x44332211 -660f8411223344|556677885f5f5f5f5f 64 intel jz .+0x44332211 -660f8411223344|556677885f5f5f5f5f 64 plan9 JE .+1144201745 -660f841122|3344556677885f5f5f5f5f 32 intel jz .+0x2211 -660f841122|3344556677885f5f5f5f5f 32 plan9 JE .+8721 -660f8511223344|556677885f5f5f5f5f 64 gnu jne .+0x44332211 -660f8511223344|556677885f5f5f5f5f 64 intel jnz .+0x44332211 -660f8511223344|556677885f5f5f5f5f 64 plan9 JNE .+1144201745 -660f851122|3344556677885f5f5f5f5f 32 intel jnz .+0x2211 -660f851122|3344556677885f5f5f5f5f 32 plan9 JNE .+8721 -660f8611223344|556677885f5f5f5f5f 64 gnu jbe .+0x44332211 -660f8611223344|556677885f5f5f5f5f 64 intel jbe .+0x44332211 -660f8611223344|556677885f5f5f5f5f 64 plan9 JBE .+1144201745 -660f861122|3344556677885f5f5f5f5f 32 intel jbe .+0x2211 -660f861122|3344556677885f5f5f5f5f 32 plan9 JBE .+8721 -660f8711223344|556677885f5f5f5f5f 64 gnu ja .+0x44332211 -660f8711223344|556677885f5f5f5f5f 64 intel jnbe .+0x44332211 -660f8711223344|556677885f5f5f5f5f 64 plan9 JA .+1144201745 -660f871122|3344556677885f5f5f5f5f 32 intel jnbe .+0x2211 -660f871122|3344556677885f5f5f5f5f 32 plan9 JA .+8721 -660f8811223344|556677885f5f5f5f5f 64 gnu js .+0x44332211 -660f8811223344|556677885f5f5f5f5f 64 intel js .+0x44332211 -660f8811223344|556677885f5f5f5f5f 64 plan9 JS .+1144201745 -660f881122|3344556677885f5f5f5f5f 32 intel js .+0x2211 -660f881122|3344556677885f5f5f5f5f 32 plan9 JS .+8721 -660f8911223344|556677885f5f5f5f5f 64 gnu jns .+0x44332211 -660f8911223344|556677885f5f5f5f5f 64 intel jns .+0x44332211 -660f8911223344|556677885f5f5f5f5f 64 plan9 JNS .+1144201745 -660f891122|3344556677885f5f5f5f5f 32 intel jns .+0x2211 -660f891122|3344556677885f5f5f5f5f 32 plan9 JNS .+8721 -660f8a11223344|556677885f5f5f5f5f 64 gnu jp .+0x44332211 -660f8a11223344|556677885f5f5f5f5f 64 intel jp .+0x44332211 -660f8a11223344|556677885f5f5f5f5f 64 plan9 JP .+1144201745 -660f8a1122|3344556677885f5f5f5f5f 32 intel jp .+0x2211 -660f8a1122|3344556677885f5f5f5f5f 32 plan9 JP .+8721 -660f8b11223344|556677885f5f5f5f5f 64 gnu jnp .+0x44332211 -660f8b11223344|556677885f5f5f5f5f 64 intel jnp .+0x44332211 -660f8b11223344|556677885f5f5f5f5f 64 plan9 JNP .+1144201745 -660f8b1122|3344556677885f5f5f5f5f 32 intel jnp .+0x2211 -660f8b1122|3344556677885f5f5f5f5f 32 plan9 JNP .+8721 -660f8c11223344|556677885f5f5f5f5f 64 gnu jl .+0x44332211 -660f8c11223344|556677885f5f5f5f5f 64 intel jl .+0x44332211 -660f8c11223344|556677885f5f5f5f5f 64 plan9 JL .+1144201745 -660f8c1122|3344556677885f5f5f5f5f 32 intel jl .+0x2211 -660f8c1122|3344556677885f5f5f5f5f 32 plan9 JL .+8721 -660f8d11223344|556677885f5f5f5f5f 64 gnu jge .+0x44332211 -660f8d11223344|556677885f5f5f5f5f 64 intel jnl .+0x44332211 -660f8d11223344|556677885f5f5f5f5f 64 plan9 JGE .+1144201745 -660f8d1122|3344556677885f5f5f5f5f 32 intel jnl .+0x2211 -660f8d1122|3344556677885f5f5f5f5f 32 plan9 JGE .+8721 -660f8e11223344|556677885f5f5f5f5f 64 gnu jle .+0x44332211 -660f8e11223344|556677885f5f5f5f5f 64 intel jle .+0x44332211 -660f8e11223344|556677885f5f5f5f5f 64 plan9 JLE .+1144201745 -660f8e1122|3344556677885f5f5f5f5f 32 intel jle .+0x2211 -660f8e1122|3344556677885f5f5f5f5f 32 plan9 JLE .+8721 -660f8f11223344|556677885f5f5f5f5f 64 gnu jg .+0x44332211 -660f8f11223344|556677885f5f5f5f5f 64 intel jnle .+0x44332211 -660f8f11223344|556677885f5f5f5f5f 64 plan9 JG .+1144201745 -660f8f1122|3344556677885f5f5f5f5f 32 intel jnle .+0x2211 -660f8f1122|3344556677885f5f5f5f5f 32 plan9 JG .+8721 -660fa1|11223344556677885f5f5f5f5f 32 intel pop fs -660fa1|11223344556677885f5f5f5f5f 32 plan9 POPW FS -660fa1|11223344556677885f5f5f5f5f 64 gnu popw %fs -660fa1|11223344556677885f5f5f5f5f 64 intel pop fs -660fa1|11223344556677885f5f5f5f5f 64 plan9 POPW FS -660fa311|223344556677885f5f5f5f5f 32 intel bt word ptr [ecx], dx -660fa311|223344556677885f5f5f5f5f 32 plan9 BTW DX, 0(CX) -660fa311|223344556677885f5f5f5f5f 64 gnu bt %dx,(%rcx) -660fa311|223344556677885f5f5f5f5f 64 intel bt word ptr [rcx], dx -660fa311|223344556677885f5f5f5f5f 64 plan9 BTW DX, 0(CX) -660fa41122|3344556677885f5f5f5f5f 32 intel shld word ptr [ecx], dx, 0x22 -660fa41122|3344556677885f5f5f5f5f 32 plan9 SHLDW $0x22, DX, 0(CX) -660fa41122|3344556677885f5f5f5f5f 64 gnu shld $0x22,%dx,(%rcx) -660fa41122|3344556677885f5f5f5f5f 64 intel shld word ptr [rcx], dx, 0x22 -660fa41122|3344556677885f5f5f5f5f 64 plan9 SHLDW $0x22, DX, 0(CX) -660fa511|223344556677885f5f5f5f5f 32 intel shld word ptr [ecx], dx, cl -660fa511|223344556677885f5f5f5f5f 32 plan9 SHLDW CL, DX, 0(CX) -660fa511|223344556677885f5f5f5f5f 64 gnu shld %cl,%dx,(%rcx) -660fa511|223344556677885f5f5f5f5f 64 intel shld word ptr [rcx], dx, cl -660fa511|223344556677885f5f5f5f5f 64 plan9 SHLDW CL, DX, 0(CX) -660fa9|11223344556677885f5f5f5f5f 32 intel pop gs -660fa9|11223344556677885f5f5f5f5f 32 plan9 POPW GS -660fa9|11223344556677885f5f5f5f5f 64 gnu popw %gs -660fa9|11223344556677885f5f5f5f5f 64 intel pop gs -660fa9|11223344556677885f5f5f5f5f 64 plan9 POPW GS -660fab11|223344556677885f5f5f5f5f 32 intel bts word ptr [ecx], dx -660fab11|223344556677885f5f5f5f5f 32 plan9 BTSW DX, 0(CX) -660fab11|223344556677885f5f5f5f5f 64 gnu bts %dx,(%rcx) -660fab11|223344556677885f5f5f5f5f 64 intel bts word ptr [rcx], dx -660fab11|223344556677885f5f5f5f5f 64 plan9 BTSW DX, 0(CX) -660fac1122|3344556677885f5f5f5f5f 32 intel shrd word ptr [ecx], dx, 0x22 -660fac1122|3344556677885f5f5f5f5f 32 plan9 SHRDW $0x22, DX, 0(CX) -660fac1122|3344556677885f5f5f5f5f 64 gnu shrd $0x22,%dx,(%rcx) -660fac1122|3344556677885f5f5f5f5f 64 intel shrd word ptr [rcx], dx, 0x22 -660fac1122|3344556677885f5f5f5f5f 64 plan9 SHRDW $0x22, DX, 0(CX) -660fad11|223344556677885f5f5f5f5f 32 intel shrd word ptr [ecx], dx, cl -660fad11|223344556677885f5f5f5f5f 32 plan9 SHRDW CL, DX, 0(CX) -660fad11|223344556677885f5f5f5f5f 64 gnu shrd %cl,%dx,(%rcx) -660fad11|223344556677885f5f5f5f5f 64 intel shrd word ptr [rcx], dx, cl -660fad11|223344556677885f5f5f5f5f 64 plan9 SHRDW CL, DX, 0(CX) -660fae00|11223344556677885f5f5f5f 32 intel fxsave ptr [eax] -660fae00|11223344556677885f5f5f5f 32 plan9 FXSAVE 0(AX) -660fae00|11223344556677885f5f5f5f 64 gnu fxsave (%rax) -660fae00|11223344556677885f5f5f5f 64 intel fxsave ptr [rax] -660fae00|11223344556677885f5f5f5f 64 plan9 FXSAVE 0(AX) -660fae08|11223344556677885f5f5f5f 32 intel fxrstor ptr [eax] -660fae08|11223344556677885f5f5f5f 32 plan9 FXRSTOR 0(AX) -660fae08|11223344556677885f5f5f5f 64 gnu data16 fxrstor (%rax) -660fae08|11223344556677885f5f5f5f 64 intel fxrstor ptr [rax] -660fae08|11223344556677885f5f5f5f 64 plan9 FXRSTOR 0(AX) -660fae20|11223344556677885f5f5f5f 32 intel xsave ptr [eax] -660fae20|11223344556677885f5f5f5f 32 plan9 XSAVE 0(AX) -660fae20|11223344556677885f5f5f5f 64 gnu data16 xsave (%rax) -660fae20|11223344556677885f5f5f5f 64 intel xsave ptr [rax] -660fae20|11223344556677885f5f5f5f 64 plan9 XSAVE 0(AX) -660fae28|11223344556677885f5f5f5f 32 intel xrstor ptr [eax] -660fae28|11223344556677885f5f5f5f 32 plan9 XRSTOR 0(AX) -660fae28|11223344556677885f5f5f5f 64 gnu data16 xrstor (%rax) -660fae28|11223344556677885f5f5f5f 64 intel xrstor ptr [rax] -660fae28|11223344556677885f5f5f5f 64 plan9 XRSTOR 0(AX) -660fae30|11223344556677885f5f5f5f 32 intel xsaveopt ptr [eax] -660fae30|11223344556677885f5f5f5f 32 plan9 XSAVEOPT 0(AX) -660fae30|11223344556677885f5f5f5f 64 gnu data16 xsaveopt (%rax) -660fae30|11223344556677885f5f5f5f 64 intel xsaveopt ptr [rax] -660fae30|11223344556677885f5f5f5f 64 plan9 XSAVEOPT 0(AX) -660faf11|223344556677885f5f5f5f5f 32 intel imul dx, word ptr [ecx] -660faf11|223344556677885f5f5f5f5f 32 plan9 IMULW 0(CX), DX -660faf11|223344556677885f5f5f5f5f 64 gnu imul (%rcx),%dx -660faf11|223344556677885f5f5f5f5f 64 intel imul dx, word ptr [rcx] -660faf11|223344556677885f5f5f5f5f 64 plan9 IMULW 0(CX), DX -660fb111|223344556677885f5f5f5f5f 32 intel cmpxchg word ptr [ecx], dx -660fb111|223344556677885f5f5f5f5f 32 plan9 CMPXCHGW DX, 0(CX) -660fb111|223344556677885f5f5f5f5f 64 gnu cmpxchg %dx,(%rcx) -660fb111|223344556677885f5f5f5f5f 64 intel cmpxchg word ptr [rcx], dx -660fb111|223344556677885f5f5f5f5f 64 plan9 CMPXCHGW DX, 0(CX) -660fb211|223344556677885f5f5f5f5f 32 intel lss dx, dword ptr [ecx] -660fb211|223344556677885f5f5f5f5f 32 plan9 LSS 0(CX), DX -660fb211|223344556677885f5f5f5f5f 64 gnu lss (%rcx),%dx -660fb211|223344556677885f5f5f5f5f 64 intel lss dx, dword ptr [rcx] -660fb211|223344556677885f5f5f5f5f 64 plan9 LSS 0(CX), DX -660fb311|223344556677885f5f5f5f5f 32 intel btr word ptr [ecx], dx -660fb311|223344556677885f5f5f5f5f 32 plan9 BTRW DX, 0(CX) -660fb311|223344556677885f5f5f5f5f 64 gnu btr %dx,(%rcx) -660fb311|223344556677885f5f5f5f5f 64 intel btr word ptr [rcx], dx -660fb311|223344556677885f5f5f5f5f 64 plan9 BTRW DX, 0(CX) -660fb411|223344556677885f5f5f5f5f 32 intel lfs dx, dword ptr [ecx] -660fb411|223344556677885f5f5f5f5f 32 plan9 LFS 0(CX), DX -660fb411|223344556677885f5f5f5f5f 64 gnu lfs (%rcx),%dx -660fb411|223344556677885f5f5f5f5f 64 intel lfs dx, dword ptr [rcx] -660fb411|223344556677885f5f5f5f5f 64 plan9 LFS 0(CX), DX -660fb511|223344556677885f5f5f5f5f 32 intel lgs dx, dword ptr [ecx] -660fb511|223344556677885f5f5f5f5f 32 plan9 LGS 0(CX), DX -660fb511|223344556677885f5f5f5f5f 64 gnu lgs (%rcx),%dx -660fb511|223344556677885f5f5f5f5f 64 intel lgs dx, dword ptr [rcx] -660fb511|223344556677885f5f5f5f5f 64 plan9 LGS 0(CX), DX -660fb611|223344556677885f5f5f5f5f 32 intel movzx dx, byte ptr [ecx] -660fb611|223344556677885f5f5f5f5f 32 plan9 MOVZX 0(CX), DX -660fb611|223344556677885f5f5f5f5f 64 gnu movzbw (%rcx),%dx -660fb611|223344556677885f5f5f5f5f 64 intel movzx dx, byte ptr [rcx] -660fb611|223344556677885f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -660fb711|223344556677885f5f5f5f5f 32 intel movzx dx, word ptr [ecx] -660fb711|223344556677885f5f5f5f5f 32 plan9 MOVZX 0(CX), DX -660fb711|223344556677885f5f5f5f5f 64 gnu movzww (%rcx),%dx -660fb711|223344556677885f5f5f5f5f 64 intel movzx dx, word ptr [rcx] -660fb711|223344556677885f5f5f5f5f 64 plan9 MOVZX 0(CX), DX -660fba2011|223344556677885f5f5f5f 32 intel bt word ptr [eax], 0x11 -660fba2011|223344556677885f5f5f5f 32 plan9 BTW $0x11, 0(AX) -660fba2011|223344556677885f5f5f5f 64 gnu btw $0x11,(%rax) -660fba2011|223344556677885f5f5f5f 64 intel bt word ptr [rax], 0x11 -660fba2011|223344556677885f5f5f5f 64 plan9 BTW $0x11, 0(AX) -660fba2811|223344556677885f5f5f5f 32 intel bts word ptr [eax], 0x11 -660fba2811|223344556677885f5f5f5f 32 plan9 BTSW $0x11, 0(AX) -660fba2811|223344556677885f5f5f5f 64 gnu btsw $0x11,(%rax) -660fba2811|223344556677885f5f5f5f 64 intel bts word ptr [rax], 0x11 -660fba2811|223344556677885f5f5f5f 64 plan9 BTSW $0x11, 0(AX) -660fba3011|223344556677885f5f5f5f 32 intel btr word ptr [eax], 0x11 -660fba3011|223344556677885f5f5f5f 32 plan9 BTRW $0x11, 0(AX) -660fba3011|223344556677885f5f5f5f 64 gnu btrw $0x11,(%rax) -660fba3011|223344556677885f5f5f5f 64 intel btr word ptr [rax], 0x11 -660fba3011|223344556677885f5f5f5f 64 plan9 BTRW $0x11, 0(AX) -660fba3811|223344556677885f5f5f5f 32 intel btc word ptr [eax], 0x11 -660fba3811|223344556677885f5f5f5f 32 plan9 BTCW $0x11, 0(AX) -660fba3811|223344556677885f5f5f5f 64 gnu btcw $0x11,(%rax) -660fba3811|223344556677885f5f5f5f 64 intel btc word ptr [rax], 0x11 -660fba3811|223344556677885f5f5f5f 64 plan9 BTCW $0x11, 0(AX) -660fbb11|223344556677885f5f5f5f5f 32 intel btc word ptr [ecx], dx -660fbb11|223344556677885f5f5f5f5f 32 plan9 BTCW DX, 0(CX) -660fbb11|223344556677885f5f5f5f5f 64 gnu btc %dx,(%rcx) -660fbb11|223344556677885f5f5f5f5f 64 intel btc word ptr [rcx], dx -660fbb11|223344556677885f5f5f5f5f 64 plan9 BTCW DX, 0(CX) -660fbc11|223344556677885f5f5f5f5f 32 intel bsf dx, word ptr [ecx] -660fbc11|223344556677885f5f5f5f5f 32 plan9 BSFW 0(CX), DX -660fbc11|223344556677885f5f5f5f5f 64 gnu bsf (%rcx),%dx -660fbc11|223344556677885f5f5f5f5f 64 intel bsf dx, word ptr [rcx] -660fbc11|223344556677885f5f5f5f5f 64 plan9 BSFW 0(CX), DX -660fbd11|223344556677885f5f5f5f5f 32 intel bsr dx, word ptr [ecx] -660fbd11|223344556677885f5f5f5f5f 32 plan9 BSRW 0(CX), DX -660fbd11|223344556677885f5f5f5f5f 64 gnu bsr (%rcx),%dx -660fbd11|223344556677885f5f5f5f5f 64 intel bsr dx, word ptr [rcx] -660fbd11|223344556677885f5f5f5f5f 64 plan9 BSRW 0(CX), DX -660fbe11|223344556677885f5f5f5f5f 32 intel movsx dx, byte ptr [ecx] -660fbe11|223344556677885f5f5f5f5f 32 plan9 MOVSX 0(CX), DX -660fbe11|223344556677885f5f5f5f5f 64 gnu movsbw (%rcx),%dx -660fbe11|223344556677885f5f5f5f5f 64 intel movsx dx, byte ptr [rcx] -660fbe11|223344556677885f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -660fbf11|223344556677885f5f5f5f5f 32 intel movsx dx, word ptr [ecx] -660fbf11|223344556677885f5f5f5f5f 32 plan9 MOVSX 0(CX), DX -660fbf11|223344556677885f5f5f5f5f 64 gnu movsww (%rcx),%dx -660fbf11|223344556677885f5f5f5f5f 64 intel movsx dx, word ptr [rcx] -660fbf11|223344556677885f5f5f5f5f 64 plan9 MOVSX 0(CX), DX -660fc111|223344556677885f5f5f5f5f 32 intel xadd word ptr [ecx], dx -660fc111|223344556677885f5f5f5f5f 32 plan9 XADDW DX, 0(CX) -660fc111|223344556677885f5f5f5f5f 64 gnu xadd %dx,(%rcx) -660fc111|223344556677885f5f5f5f5f 64 intel xadd word ptr [rcx], dx -660fc111|223344556677885f5f5f5f5f 64 plan9 XADDW DX, 0(CX) -660fc21122|3344556677885f5f5f5f5f 32 intel cmppd xmm2, xmmword ptr [ecx], 0x22 -660fc21122|3344556677885f5f5f5f5f 32 plan9 CMPPD $0x22, 0(CX), X2 -660fc21122|3344556677885f5f5f5f5f 64 gnu cmppd $0x22,(%rcx),%xmm2 -660fc21122|3344556677885f5f5f5f5f 64 intel cmppd xmm2, xmmword ptr [rcx], 0x22 -660fc21122|3344556677885f5f5f5f5f 64 plan9 CMPPD $0x22, 0(CX), X2 -660fc311|223344556677885f5f5f5f5f 32 intel movnti dword ptr [ecx], edx -660fc311|223344556677885f5f5f5f5f 32 plan9 MOVNTIL DX, 0(CX) -660fc311|223344556677885f5f5f5f5f 64 gnu movnti %edx,(%rcx) -660fc311|223344556677885f5f5f5f5f 64 intel movnti dword ptr [rcx], edx -660fc311|223344556677885f5f5f5f5f 64 plan9 MOVNTIL DX, 0(CX) -660fc41122|3344556677885f5f5f5f5f 32 intel pinsrw xmm2, word ptr [ecx], 0x22 -660fc41122|3344556677885f5f5f5f5f 32 plan9 PINSRW $0x22, 0(CX), X2 -660fc41122|3344556677885f5f5f5f5f 64 gnu pinsrw $0x22,(%rcx),%xmm2 -660fc41122|3344556677885f5f5f5f5f 64 intel pinsrw xmm2, word ptr [rcx], 0x22 -660fc41122|3344556677885f5f5f5f5f 64 plan9 PINSRW $0x22, 0(CX), X2 -660fc5c011|223344556677885f5f5f5f 32 intel pextrw eax, xmm0, 0x11 -660fc5c011|223344556677885f5f5f5f 32 plan9 PEXTRW $0x11, X0, AX -660fc5c011|223344556677885f5f5f5f 64 gnu pextrw $0x11,%xmm0,%eax -660fc5c011|223344556677885f5f5f5f 64 intel pextrw eax, xmm0, 0x11 -660fc5c011|223344556677885f5f5f5f 64 plan9 PEXTRW $0x11, X0, AX -660fc61122|3344556677885f5f5f5f5f 32 intel shufpd xmm2, xmmword ptr [ecx], 0x22 -660fc61122|3344556677885f5f5f5f5f 32 plan9 SHUFPD $0x22, 0(CX), X2 -660fc61122|3344556677885f5f5f5f5f 64 gnu shufpd $0x22,(%rcx),%xmm2 -660fc61122|3344556677885f5f5f5f5f 64 intel shufpd xmm2, xmmword ptr [rcx], 0x22 -660fc61122|3344556677885f5f5f5f5f 64 plan9 SHUFPD $0x22, 0(CX), X2 -660fc708|11223344556677885f5f5f5f 32 intel cmpxchg8b qword ptr [eax] -660fc708|11223344556677885f5f5f5f 32 plan9 CMPXCHG8B 0(AX) -660fc708|11223344556677885f5f5f5f 64 gnu data16 cmpxchg8b (%rax) -660fc708|11223344556677885f5f5f5f 64 intel cmpxchg8b qword ptr [rax] -660fc708|11223344556677885f5f5f5f 64 plan9 CMPXCHG8B 0(AX) -660fc718|11223344556677885f5f5f5f 32 intel xrstors ptr [eax] -660fc718|11223344556677885f5f5f5f 32 plan9 XRSTORS 0(AX) -660fc718|11223344556677885f5f5f5f 64 gnu xrstors (%rax) -660fc718|11223344556677885f5f5f5f 64 intel xrstors ptr [rax] -660fc718|11223344556677885f5f5f5f 64 plan9 XRSTORS 0(AX) -660fc720|11223344556677885f5f5f5f 32 intel xsavec ptr [eax] -660fc720|11223344556677885f5f5f5f 32 plan9 XSAVEC 0(AX) -660fc720|11223344556677885f5f5f5f 64 gnu xsavec (%rax) -660fc720|11223344556677885f5f5f5f 64 intel xsavec ptr [rax] -660fc720|11223344556677885f5f5f5f 64 plan9 XSAVEC 0(AX) -660fc728|11223344556677885f5f5f5f 32 intel xsaves ptr [eax] -660fc728|11223344556677885f5f5f5f 32 plan9 XSAVES 0(AX) -660fc728|11223344556677885f5f5f5f 64 gnu xsaves (%rax) -660fc728|11223344556677885f5f5f5f 64 intel xsaves ptr [rax] -660fc728|11223344556677885f5f5f5f 64 plan9 XSAVES 0(AX) -660fc7f2|11223344556677885f5f5f5f 32 intel rdrand dx -660fc7f2|11223344556677885f5f5f5f 32 plan9 RDRAND DX -660fc7f2|11223344556677885f5f5f5f 64 gnu rdrand %dx -660fc7f2|11223344556677885f5f5f5f 64 intel rdrand dx -660fc7f2|11223344556677885f5f5f5f 64 plan9 RDRAND DX -660fc8|11223344556677885f5f5f5f5f 32 intel bswap ax -660fc8|11223344556677885f5f5f5f5f 32 plan9 BSWAP AX -660fc8|11223344556677885f5f5f5f5f 64 gnu bswap %ax -660fc8|11223344556677885f5f5f5f5f 64 intel bswap ax -660fc8|11223344556677885f5f5f5f5f 64 plan9 BSWAP AX -660fd011|223344556677885f5f5f5f5f 32 intel addsubpd xmm2, xmmword ptr [ecx] -660fd011|223344556677885f5f5f5f5f 32 plan9 ADDSUBPD 0(CX), X2 -660fd011|223344556677885f5f5f5f5f 64 gnu addsubpd (%rcx),%xmm2 -660fd011|223344556677885f5f5f5f5f 64 intel addsubpd xmm2, xmmword ptr [rcx] -660fd011|223344556677885f5f5f5f5f 64 plan9 ADDSUBPD 0(CX), X2 -660fd111|223344556677885f5f5f5f5f 32 intel psrlw xmm2, xmmword ptr [ecx] -660fd111|223344556677885f5f5f5f5f 32 plan9 PSRLW 0(CX), X2 -660fd111|223344556677885f5f5f5f5f 64 gnu psrlw (%rcx),%xmm2 -660fd111|223344556677885f5f5f5f5f 64 intel psrlw xmm2, xmmword ptr [rcx] -660fd111|223344556677885f5f5f5f5f 64 plan9 PSRLW 0(CX), X2 -660fd211|223344556677885f5f5f5f5f 32 intel psrld xmm2, xmmword ptr [ecx] -660fd211|223344556677885f5f5f5f5f 32 plan9 PSRLD 0(CX), X2 -660fd211|223344556677885f5f5f5f5f 64 gnu psrld (%rcx),%xmm2 -660fd211|223344556677885f5f5f5f5f 64 intel psrld xmm2, xmmword ptr [rcx] -660fd211|223344556677885f5f5f5f5f 64 plan9 PSRLD 0(CX), X2 -660fd311|223344556677885f5f5f5f5f 32 intel psrlq xmm2, xmmword ptr [ecx] -660fd311|223344556677885f5f5f5f5f 32 plan9 PSRLQ 0(CX), X2 -660fd311|223344556677885f5f5f5f5f 64 gnu psrlq (%rcx),%xmm2 -660fd311|223344556677885f5f5f5f5f 64 intel psrlq xmm2, xmmword ptr [rcx] -660fd311|223344556677885f5f5f5f5f 64 plan9 PSRLQ 0(CX), X2 -660fd411|223344556677885f5f5f5f5f 32 intel paddq xmm2, xmmword ptr [ecx] -660fd411|223344556677885f5f5f5f5f 32 plan9 PADDQ 0(CX), X2 -660fd411|223344556677885f5f5f5f5f 64 gnu paddq (%rcx),%xmm2 -660fd411|223344556677885f5f5f5f5f 64 intel paddq xmm2, xmmword ptr [rcx] -660fd411|223344556677885f5f5f5f5f 64 plan9 PADDQ 0(CX), X2 -660fd511|223344556677885f5f5f5f5f 32 intel pmullw xmm2, xmmword ptr [ecx] -660fd511|223344556677885f5f5f5f5f 32 plan9 PMULLW 0(CX), X2 -660fd511|223344556677885f5f5f5f5f 64 gnu pmullw (%rcx),%xmm2 -660fd511|223344556677885f5f5f5f5f 64 intel pmullw xmm2, xmmword ptr [rcx] -660fd511|223344556677885f5f5f5f5f 64 plan9 PMULLW 0(CX), X2 -660fd611|223344556677885f5f5f5f5f 32 intel movq qword ptr [ecx], xmm2 -660fd611|223344556677885f5f5f5f5f 32 plan9 MOVQ X2, 0(CX) -660fd611|223344556677885f5f5f5f5f 64 gnu movq %xmm2,(%rcx) -660fd611|223344556677885f5f5f5f5f 64 intel movq qword ptr [rcx], xmm2 -660fd611|223344556677885f5f5f5f5f 64 plan9 MOVQ X2, 0(CX) -660fd7c0|11223344556677885f5f5f5f 32 intel pmovmskb eax, xmm0 -660fd7c0|11223344556677885f5f5f5f 32 plan9 PMOVMSKB X0, AX -660fd7c0|11223344556677885f5f5f5f 64 gnu pmovmskb %xmm0,%eax -660fd7c0|11223344556677885f5f5f5f 64 intel pmovmskb eax, xmm0 -660fd7c0|11223344556677885f5f5f5f 64 plan9 PMOVMSKB X0, AX -660fd811|223344556677885f5f5f5f5f 32 intel psubusb xmm2, xmmword ptr [ecx] -660fd811|223344556677885f5f5f5f5f 32 plan9 PSUBUSB 0(CX), X2 -660fd811|223344556677885f5f5f5f5f 64 gnu psubusb (%rcx),%xmm2 -660fd811|223344556677885f5f5f5f5f 64 intel psubusb xmm2, xmmword ptr [rcx] -660fd811|223344556677885f5f5f5f5f 64 plan9 PSUBUSB 0(CX), X2 -660fd911|223344556677885f5f5f5f5f 32 intel psubusw xmm2, xmmword ptr [ecx] -660fd911|223344556677885f5f5f5f5f 32 plan9 PSUBUSW 0(CX), X2 -660fd911|223344556677885f5f5f5f5f 64 gnu psubusw (%rcx),%xmm2 -660fd911|223344556677885f5f5f5f5f 64 intel psubusw xmm2, xmmword ptr [rcx] -660fd911|223344556677885f5f5f5f5f 64 plan9 PSUBUSW 0(CX), X2 -660fda11|223344556677885f5f5f5f5f 32 intel pminub xmm2, xmmword ptr [ecx] -660fda11|223344556677885f5f5f5f5f 32 plan9 PMINUB 0(CX), X2 -660fda11|223344556677885f5f5f5f5f 64 gnu pminub (%rcx),%xmm2 -660fda11|223344556677885f5f5f5f5f 64 intel pminub xmm2, xmmword ptr [rcx] -660fda11|223344556677885f5f5f5f5f 64 plan9 PMINUB 0(CX), X2 -660fdb11|223344556677885f5f5f5f5f 32 intel pand xmm2, xmmword ptr [ecx] -660fdb11|223344556677885f5f5f5f5f 32 plan9 PAND 0(CX), X2 -660fdb11|223344556677885f5f5f5f5f 64 gnu pand (%rcx),%xmm2 -660fdb11|223344556677885f5f5f5f5f 64 intel pand xmm2, xmmword ptr [rcx] -660fdb11|223344556677885f5f5f5f5f 64 plan9 PAND 0(CX), X2 -660fdc11|223344556677885f5f5f5f5f 32 intel paddusb xmm2, xmmword ptr [ecx] -660fdc11|223344556677885f5f5f5f5f 32 plan9 PADDUSB 0(CX), X2 -660fdc11|223344556677885f5f5f5f5f 64 gnu paddusb (%rcx),%xmm2 -660fdc11|223344556677885f5f5f5f5f 64 intel paddusb xmm2, xmmword ptr [rcx] -660fdc11|223344556677885f5f5f5f5f 64 plan9 PADDUSB 0(CX), X2 -660fdd11|223344556677885f5f5f5f5f 32 intel paddusw xmm2, xmmword ptr [ecx] -660fdd11|223344556677885f5f5f5f5f 32 plan9 PADDUSW 0(CX), X2 -660fdd11|223344556677885f5f5f5f5f 64 gnu paddusw (%rcx),%xmm2 -660fdd11|223344556677885f5f5f5f5f 64 intel paddusw xmm2, xmmword ptr [rcx] -660fdd11|223344556677885f5f5f5f5f 64 plan9 PADDUSW 0(CX), X2 -660fde11|223344556677885f5f5f5f5f 32 intel pmaxub xmm2, xmmword ptr [ecx] -660fde11|223344556677885f5f5f5f5f 32 plan9 PMAXUB 0(CX), X2 -660fde11|223344556677885f5f5f5f5f 64 gnu pmaxub (%rcx),%xmm2 -660fde11|223344556677885f5f5f5f5f 64 intel pmaxub xmm2, xmmword ptr [rcx] -660fde11|223344556677885f5f5f5f5f 64 plan9 PMAXUB 0(CX), X2 -660fdf11|223344556677885f5f5f5f5f 32 intel pandn xmm2, xmmword ptr [ecx] -660fdf11|223344556677885f5f5f5f5f 32 plan9 PANDN 0(CX), X2 -660fdf11|223344556677885f5f5f5f5f 64 gnu pandn (%rcx),%xmm2 -660fdf11|223344556677885f5f5f5f5f 64 intel pandn xmm2, xmmword ptr [rcx] -660fdf11|223344556677885f5f5f5f5f 64 plan9 PANDN 0(CX), X2 -660fe011|223344556677885f5f5f5f5f 32 intel pavgb xmm2, xmmword ptr [ecx] -660fe011|223344556677885f5f5f5f5f 32 plan9 PAVGB 0(CX), X2 -660fe011|223344556677885f5f5f5f5f 64 gnu pavgb (%rcx),%xmm2 -660fe011|223344556677885f5f5f5f5f 64 intel pavgb xmm2, xmmword ptr [rcx] -660fe011|223344556677885f5f5f5f5f 64 plan9 PAVGB 0(CX), X2 -660fe111|223344556677885f5f5f5f5f 32 intel psraw xmm2, xmmword ptr [ecx] -660fe111|223344556677885f5f5f5f5f 32 plan9 PSRAW 0(CX), X2 -660fe111|223344556677885f5f5f5f5f 64 gnu psraw (%rcx),%xmm2 -660fe111|223344556677885f5f5f5f5f 64 intel psraw xmm2, xmmword ptr [rcx] -660fe111|223344556677885f5f5f5f5f 64 plan9 PSRAW 0(CX), X2 -660fe211|223344556677885f5f5f5f5f 32 intel psrad xmm2, xmmword ptr [ecx] -660fe211|223344556677885f5f5f5f5f 32 plan9 PSRAD 0(CX), X2 -660fe211|223344556677885f5f5f5f5f 64 gnu psrad (%rcx),%xmm2 -660fe211|223344556677885f5f5f5f5f 64 intel psrad xmm2, xmmword ptr [rcx] -660fe211|223344556677885f5f5f5f5f 64 plan9 PSRAD 0(CX), X2 -660fe311|223344556677885f5f5f5f5f 32 intel pavgw xmm2, xmmword ptr [ecx] -660fe311|223344556677885f5f5f5f5f 32 plan9 PAVGW 0(CX), X2 -660fe311|223344556677885f5f5f5f5f 64 gnu pavgw (%rcx),%xmm2 -660fe311|223344556677885f5f5f5f5f 64 intel pavgw xmm2, xmmword ptr [rcx] -660fe311|223344556677885f5f5f5f5f 64 plan9 PAVGW 0(CX), X2 -660fe411|223344556677885f5f5f5f5f 32 intel pmulhuw xmm2, xmmword ptr [ecx] -660fe411|223344556677885f5f5f5f5f 32 plan9 PMULHUW 0(CX), X2 -660fe411|223344556677885f5f5f5f5f 64 gnu pmulhuw (%rcx),%xmm2 -660fe411|223344556677885f5f5f5f5f 64 intel pmulhuw xmm2, xmmword ptr [rcx] -660fe411|223344556677885f5f5f5f5f 64 plan9 PMULHUW 0(CX), X2 -660fe511|223344556677885f5f5f5f5f 32 intel pmulhw xmm2, xmmword ptr [ecx] -660fe511|223344556677885f5f5f5f5f 32 plan9 PMULHW 0(CX), X2 -660fe511|223344556677885f5f5f5f5f 64 gnu pmulhw (%rcx),%xmm2 -660fe511|223344556677885f5f5f5f5f 64 intel pmulhw xmm2, xmmword ptr [rcx] -660fe511|223344556677885f5f5f5f5f 64 plan9 PMULHW 0(CX), X2 -660fe611|223344556677885f5f5f5f5f 32 intel cvttpd2dq xmm2, xmmword ptr [ecx] -660fe611|223344556677885f5f5f5f5f 32 plan9 CVTTPD2DQ 0(CX), X2 -660fe611|223344556677885f5f5f5f5f 64 gnu cvttpd2dq (%rcx),%xmm2 -660fe611|223344556677885f5f5f5f5f 64 intel cvttpd2dq xmm2, xmmword ptr [rcx] -660fe611|223344556677885f5f5f5f5f 64 plan9 CVTTPD2DQ 0(CX), X2 -660fe711|223344556677885f5f5f5f5f 32 intel movntdq xmmword ptr [ecx], xmm2 -660fe711|223344556677885f5f5f5f5f 32 plan9 MOVNTDQ X2, 0(CX) -660fe711|223344556677885f5f5f5f5f 64 gnu movntdq %xmm2,(%rcx) -660fe711|223344556677885f5f5f5f5f 64 intel movntdq xmmword ptr [rcx], xmm2 -660fe711|223344556677885f5f5f5f5f 64 plan9 MOVNTDQ X2, 0(CX) -660fe811|223344556677885f5f5f5f5f 32 intel psubsb xmm2, xmmword ptr [ecx] -660fe811|223344556677885f5f5f5f5f 32 plan9 PSUBSB 0(CX), X2 -660fe811|223344556677885f5f5f5f5f 64 gnu psubsb (%rcx),%xmm2 -660fe811|223344556677885f5f5f5f5f 64 intel psubsb xmm2, xmmword ptr [rcx] -660fe811|223344556677885f5f5f5f5f 64 plan9 PSUBSB 0(CX), X2 -660fe911|223344556677885f5f5f5f5f 32 intel psubsw xmm2, xmmword ptr [ecx] -660fe911|223344556677885f5f5f5f5f 32 plan9 PSUBSW 0(CX), X2 -660fe911|223344556677885f5f5f5f5f 64 gnu psubsw (%rcx),%xmm2 -660fe911|223344556677885f5f5f5f5f 64 intel psubsw xmm2, xmmword ptr [rcx] -660fe911|223344556677885f5f5f5f5f 64 plan9 PSUBSW 0(CX), X2 -660fea11|223344556677885f5f5f5f5f 32 intel pminsw xmm2, xmmword ptr [ecx] -660fea11|223344556677885f5f5f5f5f 32 plan9 PMINSW 0(CX), X2 -660fea11|223344556677885f5f5f5f5f 64 gnu pminsw (%rcx),%xmm2 -660fea11|223344556677885f5f5f5f5f 64 intel pminsw xmm2, xmmword ptr [rcx] -660fea11|223344556677885f5f5f5f5f 64 plan9 PMINSW 0(CX), X2 -660feb11|223344556677885f5f5f5f5f 32 intel por xmm2, xmmword ptr [ecx] -660feb11|223344556677885f5f5f5f5f 32 plan9 POR 0(CX), X2 -660feb11|223344556677885f5f5f5f5f 64 gnu por (%rcx),%xmm2 -660feb11|223344556677885f5f5f5f5f 64 intel por xmm2, xmmword ptr [rcx] -660feb11|223344556677885f5f5f5f5f 64 plan9 POR 0(CX), X2 -660fec11|223344556677885f5f5f5f5f 32 intel paddsb xmm2, xmmword ptr [ecx] -660fec11|223344556677885f5f5f5f5f 32 plan9 PADDSB 0(CX), X2 -660fec11|223344556677885f5f5f5f5f 64 gnu paddsb (%rcx),%xmm2 -660fec11|223344556677885f5f5f5f5f 64 intel paddsb xmm2, xmmword ptr [rcx] -660fec11|223344556677885f5f5f5f5f 64 plan9 PADDSB 0(CX), X2 -660fed11|223344556677885f5f5f5f5f 32 intel paddsw xmm2, xmmword ptr [ecx] -660fed11|223344556677885f5f5f5f5f 32 plan9 PADDSW 0(CX), X2 -660fed11|223344556677885f5f5f5f5f 64 gnu paddsw (%rcx),%xmm2 -660fed11|223344556677885f5f5f5f5f 64 intel paddsw xmm2, xmmword ptr [rcx] -660fed11|223344556677885f5f5f5f5f 64 plan9 PADDSW 0(CX), X2 -660fee11|223344556677885f5f5f5f5f 32 intel pmaxsw xmm2, xmmword ptr [ecx] -660fee11|223344556677885f5f5f5f5f 32 plan9 PMAXSW 0(CX), X2 -660fee11|223344556677885f5f5f5f5f 64 gnu pmaxsw (%rcx),%xmm2 -660fee11|223344556677885f5f5f5f5f 64 intel pmaxsw xmm2, xmmword ptr [rcx] -660fee11|223344556677885f5f5f5f5f 64 plan9 PMAXSW 0(CX), X2 -660fef11|223344556677885f5f5f5f5f 32 intel pxor xmm2, xmmword ptr [ecx] -660fef11|223344556677885f5f5f5f5f 32 plan9 PXOR 0(CX), X2 -660fef11|223344556677885f5f5f5f5f 64 gnu pxor (%rcx),%xmm2 -660fef11|223344556677885f5f5f5f5f 64 intel pxor xmm2, xmmword ptr [rcx] -660fef11|223344556677885f5f5f5f5f 64 plan9 PXOR 0(CX), X2 -660ff111|223344556677885f5f5f5f5f 32 intel psllw xmm2, xmmword ptr [ecx] -660ff111|223344556677885f5f5f5f5f 32 plan9 PSLLW 0(CX), X2 -660ff111|223344556677885f5f5f5f5f 64 gnu psllw (%rcx),%xmm2 -660ff111|223344556677885f5f5f5f5f 64 intel psllw xmm2, xmmword ptr [rcx] -660ff111|223344556677885f5f5f5f5f 64 plan9 PSLLW 0(CX), X2 -660ff211|223344556677885f5f5f5f5f 32 intel pslld xmm2, xmmword ptr [ecx] -660ff211|223344556677885f5f5f5f5f 32 plan9 PSLLD 0(CX), X2 -660ff211|223344556677885f5f5f5f5f 64 gnu pslld (%rcx),%xmm2 -660ff211|223344556677885f5f5f5f5f 64 intel pslld xmm2, xmmword ptr [rcx] -660ff211|223344556677885f5f5f5f5f 64 plan9 PSLLD 0(CX), X2 -660ff311|223344556677885f5f5f5f5f 32 intel psllq xmm2, xmmword ptr [ecx] -660ff311|223344556677885f5f5f5f5f 32 plan9 PSLLQ 0(CX), X2 -660ff311|223344556677885f5f5f5f5f 64 gnu psllq (%rcx),%xmm2 -660ff311|223344556677885f5f5f5f5f 64 intel psllq xmm2, xmmword ptr [rcx] -660ff311|223344556677885f5f5f5f5f 64 plan9 PSLLQ 0(CX), X2 -660ff411|223344556677885f5f5f5f5f 32 intel pmuludq xmm2, xmmword ptr [ecx] -660ff411|223344556677885f5f5f5f5f 32 plan9 PMULUDQ 0(CX), X2 -660ff411|223344556677885f5f5f5f5f 64 gnu pmuludq (%rcx),%xmm2 -660ff411|223344556677885f5f5f5f5f 64 intel pmuludq xmm2, xmmword ptr [rcx] -660ff411|223344556677885f5f5f5f5f 64 plan9 PMULUDQ 0(CX), X2 -660ff511|223344556677885f5f5f5f5f 32 intel pmaddwd xmm2, xmmword ptr [ecx] -660ff511|223344556677885f5f5f5f5f 32 plan9 PMADDWD 0(CX), X2 -660ff511|223344556677885f5f5f5f5f 64 gnu pmaddwd (%rcx),%xmm2 -660ff511|223344556677885f5f5f5f5f 64 intel pmaddwd xmm2, xmmword ptr [rcx] -660ff511|223344556677885f5f5f5f5f 64 plan9 PMADDWD 0(CX), X2 -660ff611|223344556677885f5f5f5f5f 32 intel psadbw xmm2, xmmword ptr [ecx] -660ff611|223344556677885f5f5f5f5f 32 plan9 PSADBW 0(CX), X2 -660ff611|223344556677885f5f5f5f5f 64 gnu psadbw (%rcx),%xmm2 -660ff611|223344556677885f5f5f5f5f 64 intel psadbw xmm2, xmmword ptr [rcx] -660ff611|223344556677885f5f5f5f5f 64 plan9 PSADBW 0(CX), X2 -660ff7c0|11223344556677885f5f5f5f 32 intel maskmovdqu xmm0, xmm0 -660ff7c0|11223344556677885f5f5f5f 32 plan9 MASKMOVDQU X0, X0 -660ff7c0|11223344556677885f5f5f5f 64 intel maskmovdqu xmm0, xmm0 -660ff7c0|11223344556677885f5f5f5f 64 plan9 MASKMOVDQU X0, X0 -660ff811|223344556677885f5f5f5f5f 32 intel psubb xmm2, xmmword ptr [ecx] -660ff811|223344556677885f5f5f5f5f 32 plan9 PSUBB 0(CX), X2 -660ff811|223344556677885f5f5f5f5f 64 gnu psubb (%rcx),%xmm2 -660ff811|223344556677885f5f5f5f5f 64 intel psubb xmm2, xmmword ptr [rcx] -660ff811|223344556677885f5f5f5f5f 64 plan9 PSUBB 0(CX), X2 -660ff911|223344556677885f5f5f5f5f 32 intel psubw xmm2, xmmword ptr [ecx] -660ff911|223344556677885f5f5f5f5f 32 plan9 PSUBW 0(CX), X2 -660ff911|223344556677885f5f5f5f5f 64 gnu psubw (%rcx),%xmm2 -660ff911|223344556677885f5f5f5f5f 64 intel psubw xmm2, xmmword ptr [rcx] -660ff911|223344556677885f5f5f5f5f 64 plan9 PSUBW 0(CX), X2 -660ffa11|223344556677885f5f5f5f5f 32 intel psubd xmm2, xmmword ptr [ecx] -660ffa11|223344556677885f5f5f5f5f 32 plan9 PSUBD 0(CX), X2 -660ffa11|223344556677885f5f5f5f5f 64 gnu psubd (%rcx),%xmm2 -660ffa11|223344556677885f5f5f5f5f 64 intel psubd xmm2, xmmword ptr [rcx] -660ffa11|223344556677885f5f5f5f5f 64 plan9 PSUBD 0(CX), X2 -660ffb11|223344556677885f5f5f5f5f 32 intel psubq xmm2, xmmword ptr [ecx] -660ffb11|223344556677885f5f5f5f5f 32 plan9 PSUBQ 0(CX), X2 -660ffb11|223344556677885f5f5f5f5f 64 gnu psubq (%rcx),%xmm2 -660ffb11|223344556677885f5f5f5f5f 64 intel psubq xmm2, xmmword ptr [rcx] -660ffb11|223344556677885f5f5f5f5f 64 plan9 PSUBQ 0(CX), X2 -660ffc11|223344556677885f5f5f5f5f 32 intel paddb xmm2, xmmword ptr [ecx] -660ffc11|223344556677885f5f5f5f5f 32 plan9 PADDB 0(CX), X2 -660ffc11|223344556677885f5f5f5f5f 64 gnu paddb (%rcx),%xmm2 -660ffc11|223344556677885f5f5f5f5f 64 intel paddb xmm2, xmmword ptr [rcx] -660ffc11|223344556677885f5f5f5f5f 64 plan9 PADDB 0(CX), X2 -660ffd11|223344556677885f5f5f5f5f 32 intel paddw xmm2, xmmword ptr [ecx] -660ffd11|223344556677885f5f5f5f5f 32 plan9 PADDW 0(CX), X2 -660ffd11|223344556677885f5f5f5f5f 64 gnu paddw (%rcx),%xmm2 -660ffd11|223344556677885f5f5f5f5f 64 intel paddw xmm2, xmmword ptr [rcx] -660ffd11|223344556677885f5f5f5f5f 64 plan9 PADDW 0(CX), X2 -660ffe11|223344556677885f5f5f5f5f 32 intel paddd xmm2, xmmword ptr [ecx] -660ffe11|223344556677885f5f5f5f5f 32 plan9 PADDD 0(CX), X2 -660ffe11|223344556677885f5f5f5f5f 64 gnu paddd (%rcx),%xmm2 -660ffe11|223344556677885f5f5f5f5f 64 intel paddd xmm2, xmmword ptr [rcx] -660ffe11|223344556677885f5f5f5f5f 64 plan9 PADDD 0(CX), X2 -661122|3344556677885f5f5f5f5f5f5f 32 intel adc word ptr [edx], sp -661122|3344556677885f5f5f5f5f5f5f 32 plan9 ADCW SP, 0(DX) -661122|3344556677885f5f5f5f5f5f5f 64 gnu adc %sp,(%rdx) -661122|3344556677885f5f5f5f5f5f5f 64 intel adc word ptr [rdx], sp -661122|3344556677885f5f5f5f5f5f5f 64 plan9 ADCW SP, 0(DX) -661311|223344556677885f5f5f5f5f5f 32 intel adc dx, word ptr [ecx] -661311|223344556677885f5f5f5f5f5f 32 plan9 ADCW 0(CX), DX -661311|223344556677885f5f5f5f5f5f 64 gnu adc (%rcx),%dx -661311|223344556677885f5f5f5f5f5f 64 intel adc dx, word ptr [rcx] -661311|223344556677885f5f5f5f5f5f 64 plan9 ADCW 0(CX), DX -66151122|3344556677885f5f5f5f5f5f 32 intel adc ax, 0x2211 -66151122|3344556677885f5f5f5f5f5f 32 plan9 ADCW $0x2211, AX -66151122|3344556677885f5f5f5f5f5f 64 gnu adc $0x2211,%ax -66151122|3344556677885f5f5f5f5f5f 64 intel adc ax, 0x2211 -66151122|3344556677885f5f5f5f5f5f 64 plan9 ADCW $0x2211, AX -661911|223344556677885f5f5f5f5f5f 32 intel sbb word ptr [ecx], dx -661911|223344556677885f5f5f5f5f5f 32 plan9 SBBW DX, 0(CX) -661911|223344556677885f5f5f5f5f5f 64 gnu sbb %dx,(%rcx) -661911|223344556677885f5f5f5f5f5f 64 intel sbb word ptr [rcx], dx -661911|223344556677885f5f5f5f5f5f 64 plan9 SBBW DX, 0(CX) -661b11|223344556677885f5f5f5f5f5f 32 intel sbb dx, word ptr [ecx] -661b11|223344556677885f5f5f5f5f5f 32 plan9 SBBW 0(CX), DX -661b11|223344556677885f5f5f5f5f5f 64 gnu sbb (%rcx),%dx -661b11|223344556677885f5f5f5f5f5f 64 intel sbb dx, word ptr [rcx] -661b11|223344556677885f5f5f5f5f5f 64 plan9 SBBW 0(CX), DX -661d1122|3344556677885f5f5f5f5f5f 32 intel sbb ax, 0x2211 -661d1122|3344556677885f5f5f5f5f5f 32 plan9 SBBW $0x2211, AX -661d1122|3344556677885f5f5f5f5f5f 64 gnu sbb $0x2211,%ax -661d1122|3344556677885f5f5f5f5f5f 64 intel sbb ax, 0x2211 -661d1122|3344556677885f5f5f5f5f5f 64 plan9 SBBW $0x2211, AX -662111|223344556677885f5f5f5f5f5f 32 intel and word ptr [ecx], dx -662111|223344556677885f5f5f5f5f5f 32 plan9 ANDW DX, 0(CX) -662111|223344556677885f5f5f5f5f5f 64 gnu and %dx,(%rcx) -662111|223344556677885f5f5f5f5f5f 64 intel and word ptr [rcx], dx -662111|223344556677885f5f5f5f5f5f 64 plan9 ANDW DX, 0(CX) -662311|223344556677885f5f5f5f5f5f 32 intel and dx, word ptr [ecx] -662311|223344556677885f5f5f5f5f5f 32 plan9 ANDW 0(CX), DX -662311|223344556677885f5f5f5f5f5f 64 gnu and (%rcx),%dx -662311|223344556677885f5f5f5f5f5f 64 intel and dx, word ptr [rcx] -662311|223344556677885f5f5f5f5f5f 64 plan9 ANDW 0(CX), DX -66251122|3344556677885f5f5f5f5f5f 32 intel and ax, 0x2211 -66251122|3344556677885f5f5f5f5f5f 32 plan9 ANDW $0x2211, AX -66251122|3344556677885f5f5f5f5f5f 64 gnu and $0x2211,%ax -66251122|3344556677885f5f5f5f5f5f 64 intel and ax, 0x2211 -66251122|3344556677885f5f5f5f5f5f 64 plan9 ANDW $0x2211, AX -662911|223344556677885f5f5f5f5f5f 32 intel sub word ptr [ecx], dx -662911|223344556677885f5f5f5f5f5f 32 plan9 SUBW DX, 0(CX) -662911|223344556677885f5f5f5f5f5f 64 gnu sub %dx,(%rcx) -662911|223344556677885f5f5f5f5f5f 64 intel sub word ptr [rcx], dx -662911|223344556677885f5f5f5f5f5f 64 plan9 SUBW DX, 0(CX) -662b11|223344556677885f5f5f5f5f5f 32 intel sub dx, word ptr [ecx] -662b11|223344556677885f5f5f5f5f5f 32 plan9 SUBW 0(CX), DX -662b11|223344556677885f5f5f5f5f5f 64 gnu sub (%rcx),%dx -662b11|223344556677885f5f5f5f5f5f 64 intel sub dx, word ptr [rcx] -662b11|223344556677885f5f5f5f5f5f 64 plan9 SUBW 0(CX), DX -662d1122|3344556677885f5f5f5f5f5f 32 intel sub ax, 0x2211 -662d1122|3344556677885f5f5f5f5f5f 32 plan9 SUBW $0x2211, AX -662d1122|3344556677885f5f5f5f5f5f 64 gnu sub $0x2211,%ax -662d1122|3344556677885f5f5f5f5f5f 64 intel sub ax, 0x2211 -662d1122|3344556677885f5f5f5f5f5f 64 plan9 SUBW $0x2211, AX -663111|223344556677885f5f5f5f5f5f 32 intel xor word ptr [ecx], dx -663111|223344556677885f5f5f5f5f5f 32 plan9 XORW DX, 0(CX) -663111|223344556677885f5f5f5f5f5f 64 gnu xor %dx,(%rcx) -663111|223344556677885f5f5f5f5f5f 64 intel xor word ptr [rcx], dx -663111|223344556677885f5f5f5f5f5f 64 plan9 XORW DX, 0(CX) -663311|223344556677885f5f5f5f5f5f 32 intel xor dx, word ptr [ecx] -663311|223344556677885f5f5f5f5f5f 32 plan9 XORW 0(CX), DX -663311|223344556677885f5f5f5f5f5f 64 gnu xor (%rcx),%dx -663311|223344556677885f5f5f5f5f5f 64 intel xor dx, word ptr [rcx] -663311|223344556677885f5f5f5f5f5f 64 plan9 XORW 0(CX), DX -66351122|3344556677885f5f5f5f5f5f 32 intel xor ax, 0x2211 -66351122|3344556677885f5f5f5f5f5f 32 plan9 XORW $0x2211, AX -66351122|3344556677885f5f5f5f5f5f 64 gnu xor $0x2211,%ax -66351122|3344556677885f5f5f5f5f5f 64 intel xor ax, 0x2211 -66351122|3344556677885f5f5f5f5f5f 64 plan9 XORW $0x2211, AX -663911|223344556677885f5f5f5f5f5f 32 intel cmp word ptr [ecx], dx -663911|223344556677885f5f5f5f5f5f 32 plan9 CMPW DX, 0(CX) -663911|223344556677885f5f5f5f5f5f 64 gnu cmp %dx,(%rcx) -663911|223344556677885f5f5f5f5f5f 64 intel cmp word ptr [rcx], dx -663911|223344556677885f5f5f5f5f5f 64 plan9 CMPW DX, 0(CX) -663b11|223344556677885f5f5f5f5f5f 32 intel cmp dx, word ptr [ecx] -663b11|223344556677885f5f5f5f5f5f 32 plan9 CMPW 0(CX), DX -663b11|223344556677885f5f5f5f5f5f 64 gnu cmp (%rcx),%dx -663b11|223344556677885f5f5f5f5f5f 64 intel cmp dx, word ptr [rcx] -663b11|223344556677885f5f5f5f5f5f 64 plan9 CMPW 0(CX), DX -663d1122|3344556677885f5f5f5f5f5f 32 intel cmp ax, 0x2211 -663d1122|3344556677885f5f5f5f5f5f 32 plan9 CMPW $0x2211, AX -663d1122|3344556677885f5f5f5f5f5f 64 gnu cmp $0x2211,%ax -663d1122|3344556677885f5f5f5f5f5f 64 intel cmp ax, 0x2211 -663d1122|3344556677885f5f5f5f5f5f 64 plan9 CMPW $0x2211, AX -6640|11223344556677885f5f5f5f5f5f 32 intel inc ax -6640|11223344556677885f5f5f5f5f5f 32 plan9 INCW AX -66480f3a161122|3344556677885f5f5f 64 gnu pextrq $0x22,%xmm2,(%rcx) -66480f3a161122|3344556677885f5f5f 64 intel pextrq qword ptr [rcx], xmm2, 0x22 -66480f3a161122|3344556677885f5f5f 64 plan9 PEXTRQ $0x22, X2, 0(CX) -66480f3a221122|3344556677885f5f5f 64 gnu pinsrq $0x22,(%rcx),%xmm2 -66480f3a221122|3344556677885f5f5f 64 intel pinsrq xmm2, qword ptr [rcx], 0x22 -66480f3a221122|3344556677885f5f5f 64 plan9 PINSRQ $0x22, 0(CX), X2 -66480f6e11|223344556677885f5f5f5f 64 gnu movq (%rcx),%xmm2 -66480f6e11|223344556677885f5f5f5f 64 intel movq xmm2, qword ptr [rcx] -66480f6e11|223344556677885f5f5f5f 64 plan9 MOVQ 0(CX), X2 -66480f7e11|223344556677885f5f5f5f 64 gnu movq %xmm2,(%rcx) -66480f7e11|223344556677885f5f5f5f 64 intel movq qword ptr [rcx], xmm2 -66480f7e11|223344556677885f5f5f5f 64 plan9 MOVQ X2, 0(CX) -6648|0f3a1611223344556677885f5f5f 32 intel dec ax -6648|0f3a1611223344556677885f5f5f 32 plan9 DECW AX -6650|11223344556677885f5f5f5f5f5f 32 intel push ax -6650|11223344556677885f5f5f5f5f5f 32 plan9 PUSHW AX -6650|11223344556677885f5f5f5f5f5f 64 gnu push %ax -6650|11223344556677885f5f5f5f5f5f 64 intel push ax -6650|11223344556677885f5f5f5f5f5f 64 plan9 PUSHW AX -6658|11223344556677885f5f5f5f5f5f 32 intel pop ax -6658|11223344556677885f5f5f5f5f5f 32 plan9 POPW AX -6658|11223344556677885f5f5f5f5f5f 64 gnu pop %ax -6658|11223344556677885f5f5f5f5f5f 64 intel pop ax -6658|11223344556677885f5f5f5f5f5f 64 plan9 POPW AX -6660|11223344556677885f5f5f5f5f5f 32 intel data16 pusha -6660|11223344556677885f5f5f5f5f5f 32 plan9 PUSHAW -6661|11223344556677885f5f5f5f5f5f 32 intel data16 popa -6661|11223344556677885f5f5f5f5f5f 32 plan9 POPAW -666211|223344556677885f5f5f5f5f5f 32 intel bound dx, qword ptr [ecx] -666211|223344556677885f5f5f5f5f5f 32 plan9 BOUND 0(CX), DX -666311|223344556677885f5f5f5f5f5f 64 gnu movsxd (%rcx),%dx -666311|223344556677885f5f5f5f5f5f 64 intel movsxd dx, dword ptr [rcx] -666311|223344556677885f5f5f5f5f5f 64 plan9 MOVSXD 0(CX), DX -66681122|3344556677885f5f5f5f5f5f 32 intel push 0x2211 -66681122|3344556677885f5f5f5f5f5f 32 plan9 PUSHW $0x2211 -66681122|3344556677885f5f5f5f5f5f 64 gnu pushw $0x2211 -66681122|3344556677885f5f5f5f5f5f 64 intel push 0x2211 -66681122|3344556677885f5f5f5f5f5f 64 plan9 PUSHW $0x2211 -6669112233|44556677885f5f5f5f5f5f 32 intel imul dx, word ptr [ecx], 0x3322 -6669112233|44556677885f5f5f5f5f5f 32 plan9 IMULW $0x3322, 0(CX), DX -6669112233|44556677885f5f5f5f5f5f 64 gnu imul $0x3322,(%rcx),%dx -6669112233|44556677885f5f5f5f5f5f 64 intel imul dx, word ptr [rcx], 0x3322 -6669112233|44556677885f5f5f5f5f5f 64 plan9 IMULW $0x3322, 0(CX), DX -666b1122|3344556677885f5f5f5f5f5f 32 intel imul dx, word ptr [ecx], 0x22 -666b1122|3344556677885f5f5f5f5f5f 32 plan9 IMULW $0x22, 0(CX), DX -666b1122|3344556677885f5f5f5f5f5f 64 gnu imul $0x22,(%rcx),%dx -666b1122|3344556677885f5f5f5f5f5f 64 intel imul dx, word ptr [rcx], 0x22 -666b1122|3344556677885f5f5f5f5f5f 64 plan9 IMULW $0x22, 0(CX), DX -666d|11223344556677885f5f5f5f5f5f 32 intel data16 insw -666d|11223344556677885f5f5f5f5f5f 32 plan9 INSW DX, ES:0(DI) -666d|11223344556677885f5f5f5f5f5f 64 gnu insw (%dx),%es:(%rdi) -666d|11223344556677885f5f5f5f5f5f 64 intel data16 insw -666d|11223344556677885f5f5f5f5f5f 64 plan9 INSW DX, ES:0(DI) -666f|11223344556677885f5f5f5f5f5f 32 intel data16 outsw -666f|11223344556677885f5f5f5f5f5f 32 plan9 OUTSW DS:0(SI), DX -666f|11223344556677885f5f5f5f5f5f 64 gnu outsw %ds:(%rsi),(%dx) -666f|11223344556677885f5f5f5f5f5f 64 intel data16 outsw -666f|11223344556677885f5f5f5f5f5f 64 plan9 OUTSW DS:0(SI), DX -6681001122|3344556677885f5f5f5f5f 32 intel add word ptr [eax], 0x2211 -6681001122|3344556677885f5f5f5f5f 32 plan9 ADDW $0x2211, 0(AX) -6681001122|3344556677885f5f5f5f5f 64 gnu addw $0x2211,(%rax) -6681001122|3344556677885f5f5f5f5f 64 intel add word ptr [rax], 0x2211 -6681001122|3344556677885f5f5f5f5f 64 plan9 ADDW $0x2211, 0(AX) -6681081122|3344556677885f5f5f5f5f 32 intel or word ptr [eax], 0x2211 -6681081122|3344556677885f5f5f5f5f 32 plan9 ORW $0x2211, 0(AX) -6681081122|3344556677885f5f5f5f5f 64 gnu orw $0x2211,(%rax) -6681081122|3344556677885f5f5f5f5f 64 intel or word ptr [rax], 0x2211 -6681081122|3344556677885f5f5f5f5f 64 plan9 ORW $0x2211, 0(AX) -6681112233|44556677885f5f5f5f5f5f 32 intel adc word ptr [ecx], 0x3322 -6681112233|44556677885f5f5f5f5f5f 32 plan9 ADCW $0x3322, 0(CX) -6681112233|44556677885f5f5f5f5f5f 64 gnu adcw $0x3322,(%rcx) -6681112233|44556677885f5f5f5f5f5f 64 intel adc word ptr [rcx], 0x3322 -6681112233|44556677885f5f5f5f5f5f 64 plan9 ADCW $0x3322, 0(CX) -6681181122|3344556677885f5f5f5f5f 32 intel sbb word ptr [eax], 0x2211 -6681181122|3344556677885f5f5f5f5f 32 plan9 SBBW $0x2211, 0(AX) -6681181122|3344556677885f5f5f5f5f 64 gnu sbbw $0x2211,(%rax) -6681181122|3344556677885f5f5f5f5f 64 intel sbb word ptr [rax], 0x2211 -6681181122|3344556677885f5f5f5f5f 64 plan9 SBBW $0x2211, 0(AX) -6681201122|3344556677885f5f5f5f5f 32 intel and word ptr [eax], 0x2211 -6681201122|3344556677885f5f5f5f5f 32 plan9 ANDW $0x2211, 0(AX) -6681201122|3344556677885f5f5f5f5f 64 gnu andw $0x2211,(%rax) -6681201122|3344556677885f5f5f5f5f 64 intel and word ptr [rax], 0x2211 -6681201122|3344556677885f5f5f5f5f 64 plan9 ANDW $0x2211, 0(AX) -6681281122|3344556677885f5f5f5f5f 32 intel sub word ptr [eax], 0x2211 -6681281122|3344556677885f5f5f5f5f 32 plan9 SUBW $0x2211, 0(AX) -6681281122|3344556677885f5f5f5f5f 64 gnu subw $0x2211,(%rax) -6681281122|3344556677885f5f5f5f5f 64 intel sub word ptr [rax], 0x2211 -6681281122|3344556677885f5f5f5f5f 64 plan9 SUBW $0x2211, 0(AX) -6681301122|3344556677885f5f5f5f5f 32 intel xor word ptr [eax], 0x2211 -6681301122|3344556677885f5f5f5f5f 32 plan9 XORW $0x2211, 0(AX) -6681301122|3344556677885f5f5f5f5f 64 gnu xorw $0x2211,(%rax) -6681301122|3344556677885f5f5f5f5f 64 intel xor word ptr [rax], 0x2211 -6681301122|3344556677885f5f5f5f5f 64 plan9 XORW $0x2211, 0(AX) -6681381122|3344556677885f5f5f5f5f 32 intel cmp word ptr [eax], 0x2211 -6681381122|3344556677885f5f5f5f5f 32 plan9 CMPW $0x2211, 0(AX) -6681381122|3344556677885f5f5f5f5f 64 gnu cmpw $0x2211,(%rax) -6681381122|3344556677885f5f5f5f5f 64 intel cmp word ptr [rax], 0x2211 -6681381122|3344556677885f5f5f5f5f 64 plan9 CMPW $0x2211, 0(AX) -66830011|223344556677885f5f5f5f5f 32 intel add word ptr [eax], 0x11 -66830011|223344556677885f5f5f5f5f 32 plan9 ADDW $0x11, 0(AX) -66830011|223344556677885f5f5f5f5f 64 gnu addw $0x11,(%rax) -66830011|223344556677885f5f5f5f5f 64 intel add word ptr [rax], 0x11 -66830011|223344556677885f5f5f5f5f 64 plan9 ADDW $0x11, 0(AX) -66830811|223344556677885f5f5f5f5f 32 intel or word ptr [eax], 0x11 -66830811|223344556677885f5f5f5f5f 32 plan9 ORW $0x11, 0(AX) -66830811|223344556677885f5f5f5f5f 64 gnu orw $0x11,(%rax) -66830811|223344556677885f5f5f5f5f 64 intel or word ptr [rax], 0x11 -66830811|223344556677885f5f5f5f5f 64 plan9 ORW $0x11, 0(AX) -66831122|3344556677885f5f5f5f5f5f 32 intel adc word ptr [ecx], 0x22 -66831122|3344556677885f5f5f5f5f5f 32 plan9 ADCW $0x22, 0(CX) -66831122|3344556677885f5f5f5f5f5f 64 gnu adcw $0x22,(%rcx) -66831122|3344556677885f5f5f5f5f5f 64 intel adc word ptr [rcx], 0x22 -66831122|3344556677885f5f5f5f5f5f 64 plan9 ADCW $0x22, 0(CX) -66831811|223344556677885f5f5f5f5f 32 intel sbb word ptr [eax], 0x11 -66831811|223344556677885f5f5f5f5f 32 plan9 SBBW $0x11, 0(AX) -66831811|223344556677885f5f5f5f5f 64 gnu sbbw $0x11,(%rax) -66831811|223344556677885f5f5f5f5f 64 intel sbb word ptr [rax], 0x11 -66831811|223344556677885f5f5f5f5f 64 plan9 SBBW $0x11, 0(AX) -66832011|223344556677885f5f5f5f5f 32 intel and word ptr [eax], 0x11 -66832011|223344556677885f5f5f5f5f 32 plan9 ANDW $0x11, 0(AX) -66832011|223344556677885f5f5f5f5f 64 gnu andw $0x11,(%rax) -66832011|223344556677885f5f5f5f5f 64 intel and word ptr [rax], 0x11 -66832011|223344556677885f5f5f5f5f 64 plan9 ANDW $0x11, 0(AX) -66832811|223344556677885f5f5f5f5f 32 intel sub word ptr [eax], 0x11 -66832811|223344556677885f5f5f5f5f 32 plan9 SUBW $0x11, 0(AX) -66832811|223344556677885f5f5f5f5f 64 gnu subw $0x11,(%rax) -66832811|223344556677885f5f5f5f5f 64 intel sub word ptr [rax], 0x11 -66832811|223344556677885f5f5f5f5f 64 plan9 SUBW $0x11, 0(AX) -66833011|223344556677885f5f5f5f5f 32 intel xor word ptr [eax], 0x11 -66833011|223344556677885f5f5f5f5f 32 plan9 XORW $0x11, 0(AX) -66833011|223344556677885f5f5f5f5f 64 gnu xorw $0x11,(%rax) -66833011|223344556677885f5f5f5f5f 64 intel xor word ptr [rax], 0x11 -66833011|223344556677885f5f5f5f5f 64 plan9 XORW $0x11, 0(AX) -66833811|223344556677885f5f5f5f5f 32 intel cmp word ptr [eax], 0x11 -66833811|223344556677885f5f5f5f5f 32 plan9 CMPW $0x11, 0(AX) -66833811|223344556677885f5f5f5f5f 64 gnu cmpw $0x11,(%rax) -66833811|223344556677885f5f5f5f5f 64 intel cmp word ptr [rax], 0x11 -66833811|223344556677885f5f5f5f5f 64 plan9 CMPW $0x11, 0(AX) -668511|223344556677885f5f5f5f5f5f 32 intel test word ptr [ecx], dx -668511|223344556677885f5f5f5f5f5f 32 plan9 TESTW DX, 0(CX) -668511|223344556677885f5f5f5f5f5f 64 gnu test %dx,(%rcx) -668511|223344556677885f5f5f5f5f5f 64 intel test word ptr [rcx], dx -668511|223344556677885f5f5f5f5f5f 64 plan9 TESTW DX, 0(CX) -668711|223344556677885f5f5f5f5f5f 32 intel xchg word ptr [ecx], dx -668711|223344556677885f5f5f5f5f5f 32 plan9 XCHGW DX, 0(CX) -668711|223344556677885f5f5f5f5f5f 64 gnu xchg %dx,(%rcx) -668711|223344556677885f5f5f5f5f5f 64 intel xchg word ptr [rcx], dx -668711|223344556677885f5f5f5f5f5f 64 plan9 XCHGW DX, 0(CX) -668911|223344556677885f5f5f5f5f5f 32 intel mov word ptr [ecx], dx -668911|223344556677885f5f5f5f5f5f 32 plan9 MOVW DX, 0(CX) -668911|223344556677885f5f5f5f5f5f 64 gnu mov %dx,(%rcx) -668911|223344556677885f5f5f5f5f5f 64 intel mov word ptr [rcx], dx -668911|223344556677885f5f5f5f5f5f 64 plan9 MOVW DX, 0(CX) -668b11|223344556677885f5f5f5f5f5f 32 intel mov dx, word ptr [ecx] -668b11|223344556677885f5f5f5f5f5f 32 plan9 MOVW 0(CX), DX -668b11|223344556677885f5f5f5f5f5f 64 gnu mov (%rcx),%dx -668b11|223344556677885f5f5f5f5f5f 64 intel mov dx, word ptr [rcx] -668b11|223344556677885f5f5f5f5f5f 64 plan9 MOVW 0(CX), DX -668c11|223344556677885f5f5f5f5f5f 32 intel mov word ptr [ecx], ss -668c11|223344556677885f5f5f5f5f5f 32 plan9 MOVW SS, 0(CX) -668c11|223344556677885f5f5f5f5f5f 64 gnu data16 mov %ss,(%rcx) -668c11|223344556677885f5f5f5f5f5f 64 intel mov word ptr [rcx], ss -668c11|223344556677885f5f5f5f5f5f 64 plan9 MOVW SS, 0(CX) -668d11|223344556677885f5f5f5f5f5f 32 intel lea dx, ptr [ecx] -668d11|223344556677885f5f5f5f5f5f 32 plan9 LEAW 0(CX), DX -668d11|223344556677885f5f5f5f5f5f 64 gnu lea (%rcx),%dx -668d11|223344556677885f5f5f5f5f5f 64 intel lea dx, ptr [rcx] -668d11|223344556677885f5f5f5f5f5f 64 plan9 LEAW 0(CX), DX -668ec0|11223344556677885f5f5f5f5f 32 intel mov es, ax -668ec0|11223344556677885f5f5f5f5f 32 plan9 MOVW AX, ES -668ec0|11223344556677885f5f5f5f5f 64 gnu mov %ax,%es -668ec0|11223344556677885f5f5f5f5f 64 intel mov es, ax -668ec0|11223344556677885f5f5f5f5f 64 plan9 MOVW AX, ES -668f00|11223344556677885f5f5f5f5f 32 intel pop word ptr [eax] -668f00|11223344556677885f5f5f5f5f 32 plan9 POPW 0(AX) -668f00|11223344556677885f5f5f5f5f 64 gnu popw (%rax) -668f00|11223344556677885f5f5f5f5f 64 intel pop word ptr [rax] -668f00|11223344556677885f5f5f5f5f 64 plan9 POPW 0(AX) -6690|11223344556677885f5f5f5f5f5f 32 plan9 NOPW -6690|11223344556677885f5f5f5f5f5f 64 gnu data16 nop -6690|11223344556677885f5f5f5f5f5f 64 plan9 NOPW -6698|11223344556677885f5f5f5f5f5f 32 intel data16 cbw -6698|11223344556677885f5f5f5f5f5f 32 plan9 CBW -6698|11223344556677885f5f5f5f5f5f 64 gnu cbtw -6698|11223344556677885f5f5f5f5f5f 64 intel data16 cbw -6698|11223344556677885f5f5f5f5f5f 64 plan9 CBW -6699|11223344556677885f5f5f5f5f5f 32 intel data16 cwd -6699|11223344556677885f5f5f5f5f5f 32 plan9 CWD -6699|11223344556677885f5f5f5f5f5f 64 gnu cwtd -6699|11223344556677885f5f5f5f5f5f 64 intel data16 cwd -6699|11223344556677885f5f5f5f5f5f 64 plan9 CWD -669a11223344|556677885f5f5f5f5f5f 32 intel call far 0x2211, 0x4433 -669a11223344|556677885f5f5f5f5f5f 32 plan9 LCALL $0x2211, $0x4433 -669c|11223344556677885f5f5f5f5f5f 32 intel data16 pushf -669c|11223344556677885f5f5f5f5f5f 32 plan9 PUSHF -669c|11223344556677885f5f5f5f5f5f 64 gnu pushfw -669c|11223344556677885f5f5f5f5f5f 64 intel data16 pushf -669c|11223344556677885f5f5f5f5f5f 64 plan9 PUSHF -669d|11223344556677885f5f5f5f5f5f 32 intel data16 popf -669d|11223344556677885f5f5f5f5f5f 32 plan9 POPF -669d|11223344556677885f5f5f5f5f5f 64 gnu popfw -669d|11223344556677885f5f5f5f5f5f 64 intel data16 popf -669d|11223344556677885f5f5f5f5f5f 64 plan9 POPF -66a11122334455667788|5f5f5f5f5f5f 64 gnu mov -0x778899aabbccddef,%ax -66a11122334455667788|5f5f5f5f5f5f 64 intel mov ax, word ptr [0x8877665544332211] -66a11122334455667788|5f5f5f5f5f5f 64 plan9 MOVW -0x778899aabbccddef, AX -66a111223344|556677885f5f5f5f5f5f 32 intel mov ax, word ptr [0x44332211] -66a111223344|556677885f5f5f5f5f5f 32 plan9 MOVW 0x44332211, AX -66a31122334455667788|5f5f5f5f5f5f 64 gnu mov %ax,-0x778899aabbccddef -66a31122334455667788|5f5f5f5f5f5f 64 intel mov word ptr [0x8877665544332211], ax -66a31122334455667788|5f5f5f5f5f5f 64 plan9 MOVW AX, -0x778899aabbccddef -66a311223344|556677885f5f5f5f5f5f 32 intel mov word ptr [0x44332211], ax -66a311223344|556677885f5f5f5f5f5f 32 plan9 MOVW AX, 0x44332211 -66a5|11223344556677885f5f5f5f5f5f 32 intel movsw word ptr [edi], word ptr [esi] -66a5|11223344556677885f5f5f5f5f5f 32 plan9 MOVSW DS:0(SI), ES:0(DI) -66a5|11223344556677885f5f5f5f5f5f 64 gnu movsw %ds:(%rsi),%es:(%rdi) -66a5|11223344556677885f5f5f5f5f5f 64 intel movsw word ptr [rdi], word ptr [rsi] -66a5|11223344556677885f5f5f5f5f5f 64 plan9 MOVSW DS:0(SI), ES:0(DI) -66a7|11223344556677885f5f5f5f5f5f 32 intel cmpsw word ptr [esi], word ptr [edi] -66a7|11223344556677885f5f5f5f5f5f 32 plan9 CMPSW ES:0(DI), DS:0(SI) -66a7|11223344556677885f5f5f5f5f5f 64 gnu cmpsw %es:(%rdi),%ds:(%rsi) -66a7|11223344556677885f5f5f5f5f5f 64 intel cmpsw word ptr [rsi], word ptr [rdi] -66a7|11223344556677885f5f5f5f5f5f 64 plan9 CMPSW ES:0(DI), DS:0(SI) -66a91122|3344556677885f5f5f5f5f5f 32 intel test ax, 0x2211 -66a91122|3344556677885f5f5f5f5f5f 32 plan9 TESTW $0x2211, AX -66a91122|3344556677885f5f5f5f5f5f 64 gnu test $0x2211,%ax -66a91122|3344556677885f5f5f5f5f5f 64 intel test ax, 0x2211 -66a91122|3344556677885f5f5f5f5f5f 64 plan9 TESTW $0x2211, AX -66ab|11223344556677885f5f5f5f5f5f 32 intel stosw word ptr [edi] -66ab|11223344556677885f5f5f5f5f5f 32 plan9 STOSW AX, ES:0(DI) -66ab|11223344556677885f5f5f5f5f5f 64 gnu stos %ax,%es:(%rdi) -66ab|11223344556677885f5f5f5f5f5f 64 intel stosw word ptr [rdi] -66ab|11223344556677885f5f5f5f5f5f 64 plan9 STOSW AX, ES:0(DI) -66ad|11223344556677885f5f5f5f5f5f 32 intel lodsw word ptr [esi] -66ad|11223344556677885f5f5f5f5f5f 32 plan9 LODSW DS:0(SI), AX -66ad|11223344556677885f5f5f5f5f5f 64 gnu lods %ds:(%rsi),%ax -66ad|11223344556677885f5f5f5f5f5f 64 intel lodsw word ptr [rsi] -66ad|11223344556677885f5f5f5f5f5f 64 plan9 LODSW DS:0(SI), AX -66af|11223344556677885f5f5f5f5f5f 32 intel scasw word ptr [edi] -66af|11223344556677885f5f5f5f5f5f 32 plan9 SCASW ES:0(DI), AX -66af|11223344556677885f5f5f5f5f5f 64 gnu scas %es:(%rdi),%ax -66af|11223344556677885f5f5f5f5f5f 64 intel scasw word ptr [rdi] -66af|11223344556677885f5f5f5f5f5f 64 plan9 SCASW ES:0(DI), AX -66b81122|3344556677885f5f5f5f5f5f 32 intel mov ax, 0x2211 -66b81122|3344556677885f5f5f5f5f5f 32 plan9 MOVW $0x2211, AX -66b81122|3344556677885f5f5f5f5f5f 64 gnu mov $0x2211,%ax -66b81122|3344556677885f5f5f5f5f5f 64 intel mov ax, 0x2211 -66b81122|3344556677885f5f5f5f5f5f 64 plan9 MOVW $0x2211, AX -66c10011|223344556677885f5f5f5f5f 32 intel rol word ptr [eax], 0x11 -66c10011|223344556677885f5f5f5f5f 32 plan9 ROLW $0x11, 0(AX) -66c10011|223344556677885f5f5f5f5f 64 gnu rolw $0x11,(%rax) -66c10011|223344556677885f5f5f5f5f 64 intel rol word ptr [rax], 0x11 -66c10011|223344556677885f5f5f5f5f 64 plan9 ROLW $0x11, 0(AX) -66c10811|223344556677885f5f5f5f5f 32 intel ror word ptr [eax], 0x11 -66c10811|223344556677885f5f5f5f5f 32 plan9 RORW $0x11, 0(AX) -66c10811|223344556677885f5f5f5f5f 64 gnu rorw $0x11,(%rax) -66c10811|223344556677885f5f5f5f5f 64 intel ror word ptr [rax], 0x11 -66c10811|223344556677885f5f5f5f5f 64 plan9 RORW $0x11, 0(AX) -66c11122|3344556677885f5f5f5f5f5f 32 intel rcl word ptr [ecx], 0x22 -66c11122|3344556677885f5f5f5f5f5f 32 plan9 RCLW $0x22, 0(CX) -66c11122|3344556677885f5f5f5f5f5f 64 gnu rclw $0x22,(%rcx) -66c11122|3344556677885f5f5f5f5f5f 64 intel rcl word ptr [rcx], 0x22 -66c11122|3344556677885f5f5f5f5f5f 64 plan9 RCLW $0x22, 0(CX) -66c11811|223344556677885f5f5f5f5f 32 intel rcr word ptr [eax], 0x11 -66c11811|223344556677885f5f5f5f5f 32 plan9 RCRW $0x11, 0(AX) -66c11811|223344556677885f5f5f5f5f 64 gnu rcrw $0x11,(%rax) -66c11811|223344556677885f5f5f5f5f 64 intel rcr word ptr [rax], 0x11 -66c11811|223344556677885f5f5f5f5f 64 plan9 RCRW $0x11, 0(AX) -66c12011|223344556677885f5f5f5f5f 32 intel shl word ptr [eax], 0x11 -66c12011|223344556677885f5f5f5f5f 32 plan9 SHLW $0x11, 0(AX) -66c12011|223344556677885f5f5f5f5f 64 gnu shlw $0x11,(%rax) -66c12011|223344556677885f5f5f5f5f 64 intel shl word ptr [rax], 0x11 -66c12011|223344556677885f5f5f5f5f 64 plan9 SHLW $0x11, 0(AX) -66c12811|223344556677885f5f5f5f5f 32 intel shr word ptr [eax], 0x11 -66c12811|223344556677885f5f5f5f5f 32 plan9 SHRW $0x11, 0(AX) -66c12811|223344556677885f5f5f5f5f 64 gnu shrw $0x11,(%rax) -66c12811|223344556677885f5f5f5f5f 64 intel shr word ptr [rax], 0x11 -66c12811|223344556677885f5f5f5f5f 64 plan9 SHRW $0x11, 0(AX) -66c13811|223344556677885f5f5f5f5f 32 intel sar word ptr [eax], 0x11 -66c13811|223344556677885f5f5f5f5f 32 plan9 SARW $0x11, 0(AX) -66c13811|223344556677885f5f5f5f5f 64 gnu sarw $0x11,(%rax) -66c13811|223344556677885f5f5f5f5f 64 intel sar word ptr [rax], 0x11 -66c13811|223344556677885f5f5f5f5f 64 plan9 SARW $0x11, 0(AX) -66c21122|3344556677885f5f5f5f5f5f 32 intel ret 0x2211 -66c21122|3344556677885f5f5f5f5f5f 32 plan9 RET $0x2211 -66c21122|3344556677885f5f5f5f5f5f 64 gnu retw $0x2211 -66c21122|3344556677885f5f5f5f5f5f 64 intel ret 0x2211 -66c21122|3344556677885f5f5f5f5f5f 64 plan9 RET $0x2211 -66c411|223344556677885f5f5f5f5f5f 32 intel les dx, dword ptr [ecx] -66c411|223344556677885f5f5f5f5f5f 32 plan9 LES 0(CX), DX -66c511|223344556677885f5f5f5f5f5f 32 intel lds dx, dword ptr [ecx] -66c511|223344556677885f5f5f5f5f5f 32 plan9 LDS 0(CX), DX -66c7001122|3344556677885f5f5f5f5f 32 intel mov word ptr [eax], 0x2211 -66c7001122|3344556677885f5f5f5f5f 32 plan9 MOVW $0x2211, 0(AX) -66c7001122|3344556677885f5f5f5f5f 64 gnu movw $0x2211,(%rax) -66c7001122|3344556677885f5f5f5f5f 64 intel mov word ptr [rax], 0x2211 -66c7001122|3344556677885f5f5f5f5f 64 plan9 MOVW $0x2211, 0(AX) -66c7f81122|3344556677885f5f5f5f5f 32 intel xbegin .+0x2211 -66c7f81122|3344556677885f5f5f5f5f 32 plan9 XBEGIN .+8721 -66c7f81122|3344556677885f5f5f5f5f 64 gnu xbeginw .+0x2211 -66c7f81122|3344556677885f5f5f5f5f 64 intel xbegin .+0x2211 -66c7f81122|3344556677885f5f5f5f5f 64 plan9 XBEGIN .+8721 -66c9|11223344556677885f5f5f5f5f5f 32 intel data16 leave -66c9|11223344556677885f5f5f5f5f5f 32 plan9 LEAVE -66c9|11223344556677885f5f5f5f5f5f 64 gnu leavew -66c9|11223344556677885f5f5f5f5f5f 64 intel data16 leave -66c9|11223344556677885f5f5f5f5f5f 64 plan9 LEAVE -66cf|11223344556677885f5f5f5f5f5f 32 intel data16 iret -66cf|11223344556677885f5f5f5f5f5f 32 plan9 IRET -66cf|11223344556677885f5f5f5f5f5f 64 gnu iretw -66cf|11223344556677885f5f5f5f5f5f 64 intel data16 iret -66cf|11223344556677885f5f5f5f5f5f 64 plan9 IRET -66d100|11223344556677885f5f5f5f5f 32 intel rol word ptr [eax], 0x1 -66d100|11223344556677885f5f5f5f5f 32 plan9 ROLW $0x1, 0(AX) -66d100|11223344556677885f5f5f5f5f 64 gnu rolw (%rax) -66d100|11223344556677885f5f5f5f5f 64 intel rol word ptr [rax], 0x1 -66d100|11223344556677885f5f5f5f5f 64 plan9 ROLW $0x1, 0(AX) -66d108|11223344556677885f5f5f5f5f 32 intel ror word ptr [eax], 0x1 -66d108|11223344556677885f5f5f5f5f 32 plan9 RORW $0x1, 0(AX) -66d108|11223344556677885f5f5f5f5f 64 gnu rorw (%rax) -66d108|11223344556677885f5f5f5f5f 64 intel ror word ptr [rax], 0x1 -66d108|11223344556677885f5f5f5f5f 64 plan9 RORW $0x1, 0(AX) -66d111|223344556677885f5f5f5f5f5f 32 intel rcl word ptr [ecx], 0x1 -66d111|223344556677885f5f5f5f5f5f 32 plan9 RCLW $0x1, 0(CX) -66d111|223344556677885f5f5f5f5f5f 64 gnu rclw (%rcx) -66d111|223344556677885f5f5f5f5f5f 64 intel rcl word ptr [rcx], 0x1 -66d111|223344556677885f5f5f5f5f5f 64 plan9 RCLW $0x1, 0(CX) -66d118|11223344556677885f5f5f5f5f 32 intel rcr word ptr [eax], 0x1 -66d118|11223344556677885f5f5f5f5f 32 plan9 RCRW $0x1, 0(AX) -66d118|11223344556677885f5f5f5f5f 64 gnu rcrw (%rax) -66d118|11223344556677885f5f5f5f5f 64 intel rcr word ptr [rax], 0x1 -66d118|11223344556677885f5f5f5f5f 64 plan9 RCRW $0x1, 0(AX) -66d120|11223344556677885f5f5f5f5f 32 intel shl word ptr [eax], 0x1 -66d120|11223344556677885f5f5f5f5f 32 plan9 SHLW $0x1, 0(AX) -66d120|11223344556677885f5f5f5f5f 64 gnu shlw (%rax) -66d120|11223344556677885f5f5f5f5f 64 intel shl word ptr [rax], 0x1 -66d120|11223344556677885f5f5f5f5f 64 plan9 SHLW $0x1, 0(AX) -66d128|11223344556677885f5f5f5f5f 32 intel shr word ptr [eax], 0x1 -66d128|11223344556677885f5f5f5f5f 32 plan9 SHRW $0x1, 0(AX) -66d128|11223344556677885f5f5f5f5f 64 gnu shrw (%rax) -66d128|11223344556677885f5f5f5f5f 64 intel shr word ptr [rax], 0x1 -66d128|11223344556677885f5f5f5f5f 64 plan9 SHRW $0x1, 0(AX) -66d138|11223344556677885f5f5f5f5f 32 intel sar word ptr [eax], 0x1 -66d138|11223344556677885f5f5f5f5f 32 plan9 SARW $0x1, 0(AX) -66d138|11223344556677885f5f5f5f5f 64 gnu sarw (%rax) -66d138|11223344556677885f5f5f5f5f 64 intel sar word ptr [rax], 0x1 -66d138|11223344556677885f5f5f5f5f 64 plan9 SARW $0x1, 0(AX) -66d300|11223344556677885f5f5f5f5f 32 intel rol word ptr [eax], cl -66d300|11223344556677885f5f5f5f5f 32 plan9 ROLW CL, 0(AX) -66d300|11223344556677885f5f5f5f5f 64 gnu rolw %cl,(%rax) -66d300|11223344556677885f5f5f5f5f 64 intel rol word ptr [rax], cl -66d300|11223344556677885f5f5f5f5f 64 plan9 ROLW CL, 0(AX) -66d308|11223344556677885f5f5f5f5f 32 intel ror word ptr [eax], cl -66d308|11223344556677885f5f5f5f5f 32 plan9 RORW CL, 0(AX) -66d308|11223344556677885f5f5f5f5f 64 gnu rorw %cl,(%rax) -66d308|11223344556677885f5f5f5f5f 64 intel ror word ptr [rax], cl -66d308|11223344556677885f5f5f5f5f 64 plan9 RORW CL, 0(AX) -66d311|223344556677885f5f5f5f5f5f 32 intel rcl word ptr [ecx], cl -66d311|223344556677885f5f5f5f5f5f 32 plan9 RCLW CL, 0(CX) -66d311|223344556677885f5f5f5f5f5f 64 gnu rclw %cl,(%rcx) -66d311|223344556677885f5f5f5f5f5f 64 intel rcl word ptr [rcx], cl -66d311|223344556677885f5f5f5f5f5f 64 plan9 RCLW CL, 0(CX) -66d318|11223344556677885f5f5f5f5f 32 intel rcr word ptr [eax], cl -66d318|11223344556677885f5f5f5f5f 32 plan9 RCRW CL, 0(AX) -66d318|11223344556677885f5f5f5f5f 64 gnu rcrw %cl,(%rax) -66d318|11223344556677885f5f5f5f5f 64 intel rcr word ptr [rax], cl -66d318|11223344556677885f5f5f5f5f 64 plan9 RCRW CL, 0(AX) -66d320|11223344556677885f5f5f5f5f 32 intel shl word ptr [eax], cl -66d320|11223344556677885f5f5f5f5f 32 plan9 SHLW CL, 0(AX) -66d320|11223344556677885f5f5f5f5f 64 gnu shlw %cl,(%rax) -66d320|11223344556677885f5f5f5f5f 64 intel shl word ptr [rax], cl -66d320|11223344556677885f5f5f5f5f 64 plan9 SHLW CL, 0(AX) -66d328|11223344556677885f5f5f5f5f 32 intel shr word ptr [eax], cl -66d328|11223344556677885f5f5f5f5f 32 plan9 SHRW CL, 0(AX) -66d328|11223344556677885f5f5f5f5f 64 gnu shrw %cl,(%rax) -66d328|11223344556677885f5f5f5f5f 64 intel shr word ptr [rax], cl -66d328|11223344556677885f5f5f5f5f 64 plan9 SHRW CL, 0(AX) -66d338|11223344556677885f5f5f5f5f 32 intel sar word ptr [eax], cl -66d338|11223344556677885f5f5f5f5f 32 plan9 SARW CL, 0(AX) -66d338|11223344556677885f5f5f5f5f 64 gnu sarw %cl,(%rax) -66d338|11223344556677885f5f5f5f5f 64 intel sar word ptr [rax], cl -66d338|11223344556677885f5f5f5f5f 64 plan9 SARW CL, 0(AX) -66d411|223344556677885f5f5f5f5f5f 32 intel aam 0x11 -66d411|223344556677885f5f5f5f5f5f 32 plan9 AAM $0x11 -66d920|11223344556677885f5f5f5f5f 32 intel fldenv ptr [eax] -66d920|11223344556677885f5f5f5f5f 32 plan9 FLDENVW 0(AX) -66d920|11223344556677885f5f5f5f5f 64 gnu fldenvs (%rax) -66d920|11223344556677885f5f5f5f5f 64 intel fldenv ptr [rax] -66d920|11223344556677885f5f5f5f5f 64 plan9 FLDENVW 0(AX) -66e511|223344556677885f5f5f5f5f5f 32 intel in ax, 0x11 -66e511|223344556677885f5f5f5f5f5f 32 plan9 INW $0x11, AX -66e511|223344556677885f5f5f5f5f5f 64 gnu in $0x11,%ax -66e511|223344556677885f5f5f5f5f5f 64 intel in ax, 0x11 -66e511|223344556677885f5f5f5f5f5f 64 plan9 INW $0x11, AX -66e711|223344556677885f5f5f5f5f5f 32 intel out 0x11, ax -66e711|223344556677885f5f5f5f5f5f 32 plan9 OUTW AX, $0x11 -66e711|223344556677885f5f5f5f5f5f 64 gnu out %ax,$0x11 -66e711|223344556677885f5f5f5f5f5f 64 intel out 0x11, ax -66e711|223344556677885f5f5f5f5f5f 64 plan9 OUTW AX, $0x11 -66e811223344|556677885f5f5f5f5f5f 64 gnu callw .+0x44332211 -66e811223344|556677885f5f5f5f5f5f 64 intel call .+0x44332211 -66e811223344|556677885f5f5f5f5f5f 64 plan9 CALL .+1144201745 -66e81122|3344556677885f5f5f5f5f5f 32 intel call .+0x2211 -66e81122|3344556677885f5f5f5f5f5f 32 plan9 CALL .+8721 -66e911223344|556677885f5f5f5f5f5f 64 gnu jmpw .+0x44332211 -66e911223344|556677885f5f5f5f5f5f 64 intel jmp .+0x44332211 -66e911223344|556677885f5f5f5f5f5f 64 plan9 JMP .+1144201745 -66e91122|3344556677885f5f5f5f5f5f 32 intel jmp .+0x2211 -66e91122|3344556677885f5f5f5f5f5f 32 plan9 JMP .+8721 -66ea11223344|556677885f5f5f5f5f5f 32 intel jmp far 0x2211, 0x4433 -66ea11223344|556677885f5f5f5f5f5f 32 plan9 LJMP $0x2211, $0x4433 -66ed|11223344556677885f5f5f5f5f5f 32 intel in ax, dx -66ed|11223344556677885f5f5f5f5f5f 32 plan9 INW DX, AX -66ed|11223344556677885f5f5f5f5f5f 64 gnu in (%dx),%ax -66ed|11223344556677885f5f5f5f5f5f 64 intel in ax, dx -66ed|11223344556677885f5f5f5f5f5f 64 plan9 INW DX, AX -66ef|11223344556677885f5f5f5f5f5f 32 intel out dx, ax -66ef|11223344556677885f5f5f5f5f5f 32 plan9 OUTW AX, DX -66ef|11223344556677885f5f5f5f5f5f 64 gnu out %ax,(%dx) -66ef|11223344556677885f5f5f5f5f5f 64 intel out dx, ax -66ef|11223344556677885f5f5f5f5f5f 64 plan9 OUTW AX, DX -66f20f2a11|223344556677885f5f5f5f 32 intel cvtsi2sd xmm2, dword ptr [ecx] -66f20f2a11|223344556677885f5f5f5f 32 plan9 CVTSI2SDL 0(CX), X2 -66f20f2a11|223344556677885f5f5f5f 64 gnu cvtsi2sdl (%rcx),%xmm2 -66f20f2a11|223344556677885f5f5f5f 64 intel cvtsi2sd xmm2, dword ptr [rcx] -66f20f2a11|223344556677885f5f5f5f 64 plan9 CVTSI2SDL 0(CX), X2 -# the Q extension is the size of the source float64 in memory. The destination is L. -66f20f2c11|223344556677885f5f5f5f 32 intel cvttsd2si edx, qword ptr [ecx] -66f20f2c11|223344556677885f5f5f5f 32 plan9 CVTTSD2SIQ 0(CX), DX -66f20f2c11|223344556677885f5f5f5f 64 gnu cvttsd2si (%rcx),%dx -66f20f2c11|223344556677885f5f5f5f 64 intel cvttsd2si edx, qword ptr [rcx] -66f20f2c11|223344556677885f5f5f5f 64 plan9 CVTTSD2SIQ 0(CX), DX -66f20f2d11|223344556677885f5f5f5f 32 intel cvtsd2si edx, qword ptr [ecx] -66f20f2d11|223344556677885f5f5f5f 32 plan9 CVTSD2SIQ 0(CX), DX -66f20f2d11|223344556677885f5f5f5f 64 gnu cvtsd2si (%rcx),%dx -66f20f2d11|223344556677885f5f5f5f 64 intel cvtsd2si edx, qword ptr [rcx] -66f20f2d11|223344556677885f5f5f5f 64 plan9 CVTSD2SIQ 0(CX), DX -66f20f38f011|223344556677885f5f5f 32 intel crc32 edx, byte ptr [ecx] -66f20f38f011|223344556677885f5f5f 32 plan9 CRC32 0(CX), DX -66f20f38f011|223344556677885f5f5f 64 gnu crc32b (%rcx),%edx -66f20f38f011|223344556677885f5f5f 64 intel crc32 edx, byte ptr [rcx] -66f20f38f011|223344556677885f5f5f 64 plan9 CRC32 0(CX), DX -66f30f2c11|223344556677885f5f5f5f 32 intel cvttss2si edx, dword ptr [ecx] -66f30f2c11|223344556677885f5f5f5f 32 plan9 CVTTSS2SIL 0(CX), DX -66f30f2c11|223344556677885f5f5f5f 64 gnu cvttss2si (%rcx),%dx -66f30f2c11|223344556677885f5f5f5f 64 intel cvttss2si edx, dword ptr [rcx] -66f30f2c11|223344556677885f5f5f5f 64 plan9 CVTTSS2SIL 0(CX), DX -66f30f2d11|223344556677885f5f5f5f 32 intel cvtss2si edx, dword ptr [ecx] -66f30f2d11|223344556677885f5f5f5f 32 plan9 CVTSS2SIL 0(CX), DX -66f30f2d11|223344556677885f5f5f5f 64 gnu cvtss2si (%rcx),%dx -66f30f2d11|223344556677885f5f5f5f 64 intel cvtss2si edx, dword ptr [rcx] -66f30f2d11|223344556677885f5f5f5f 64 plan9 CVTSS2SIL 0(CX), DX -66f30fae11|223344556677885f5f5f5f 64 gnu wrfsbasel (%rcx) -66f30fae11|223344556677885f5f5f5f 64 intel wrfsbase dword ptr [rcx] -66f30fae11|223344556677885f5f5f5f 64 plan9 WRFSBASE 0(CX) -66f30fae18|11223344556677885f5f5f 64 gnu wrgsbasel (%rax) -66f30fae18|11223344556677885f5f5f 64 intel wrgsbase dword ptr [rax] -66f30fae18|11223344556677885f5f5f 64 plan9 WRGSBASE 0(AX) -66f30faec0|11223344556677885f5f5f 64 gnu rdfsbase %eax -66f30faec0|11223344556677885f5f5f 64 intel rdfsbase eax -66f30faec0|11223344556677885f5f5f 64 plan9 RDFSBASE AX -66f30faec8|11223344556677885f5f5f 64 gnu rdgsbase %eax -66f30faec8|11223344556677885f5f5f 64 intel rdgsbase eax -66f30faec8|11223344556677885f5f5f 64 plan9 RDGSBASE AX -66f30fd6c5|11223344556677885f5f5f 32 intel movq2dq xmm0, mmx5 -66f30fd6c5|11223344556677885f5f5f 32 plan9 MOVQ2DQ M5, X0 -66f30fd6c5|11223344556677885f5f5f 64 gnu movq2dq %mm5,%xmm0 -66f30fd6c5|11223344556677885f5f5f 64 intel movq2dq xmm0, mmx5 -66f30fd6c5|11223344556677885f5f5f 64 plan9 MOVQ2DQ M5, X0 -66f7001122|3344556677885f5f5f5f5f 32 intel test word ptr [eax], 0x2211 -66f7001122|3344556677885f5f5f5f5f 32 plan9 TESTW $0x2211, 0(AX) -66f7001122|3344556677885f5f5f5f5f 64 gnu testw $0x2211,(%rax) -66f7001122|3344556677885f5f5f5f5f 64 intel test word ptr [rax], 0x2211 -66f7001122|3344556677885f5f5f5f5f 64 plan9 TESTW $0x2211, 0(AX) -66f711|223344556677885f5f5f5f5f5f 32 intel not word ptr [ecx] -66f711|223344556677885f5f5f5f5f5f 32 plan9 NOTW 0(CX) -66f711|223344556677885f5f5f5f5f5f 64 gnu notw (%rcx) -66f711|223344556677885f5f5f5f5f5f 64 intel not word ptr [rcx] -66f711|223344556677885f5f5f5f5f5f 64 plan9 NOTW 0(CX) -66f718|11223344556677885f5f5f5f5f 32 intel neg word ptr [eax] -66f718|11223344556677885f5f5f5f5f 32 plan9 NEGW 0(AX) -66f718|11223344556677885f5f5f5f5f 64 gnu negw (%rax) -66f718|11223344556677885f5f5f5f5f 64 intel neg word ptr [rax] -66f718|11223344556677885f5f5f5f5f 64 plan9 NEGW 0(AX) -66f720|11223344556677885f5f5f5f5f 32 intel mul word ptr [eax] -66f720|11223344556677885f5f5f5f5f 32 plan9 MULW 0(AX) -66f720|11223344556677885f5f5f5f5f 64 gnu mulw (%rax) -66f720|11223344556677885f5f5f5f5f 64 intel mul word ptr [rax] -66f720|11223344556677885f5f5f5f5f 64 plan9 MULW 0(AX) -66f728|11223344556677885f5f5f5f5f 32 intel imul word ptr [eax] -66f728|11223344556677885f5f5f5f5f 32 plan9 IMULW 0(AX) -66f728|11223344556677885f5f5f5f5f 64 gnu imulw (%rax) -66f728|11223344556677885f5f5f5f5f 64 intel imul word ptr [rax] -66f728|11223344556677885f5f5f5f5f 64 plan9 IMULW 0(AX) -66f730|11223344556677885f5f5f5f5f 32 intel div word ptr [eax] -66f730|11223344556677885f5f5f5f5f 32 plan9 DIVW 0(AX) -66f730|11223344556677885f5f5f5f5f 64 gnu divw (%rax) -66f730|11223344556677885f5f5f5f5f 64 intel div word ptr [rax] -66f730|11223344556677885f5f5f5f5f 64 plan9 DIVW 0(AX) -66f738|11223344556677885f5f5f5f5f 32 intel idiv word ptr [eax] -66f738|11223344556677885f5f5f5f5f 32 plan9 IDIVW 0(AX) -66f738|11223344556677885f5f5f5f5f 64 gnu idivw (%rax) -66f738|11223344556677885f5f5f5f5f 64 intel idiv word ptr [rax] -66f738|11223344556677885f5f5f5f5f 64 plan9 IDIVW 0(AX) -66ff00|11223344556677885f5f5f5f5f 32 intel inc word ptr [eax] -66ff00|11223344556677885f5f5f5f5f 32 plan9 INCW 0(AX) -66ff00|11223344556677885f5f5f5f5f 64 gnu incw (%rax) -66ff00|11223344556677885f5f5f5f5f 64 intel inc word ptr [rax] -66ff00|11223344556677885f5f5f5f5f 64 plan9 INCW 0(AX) -66ff08|11223344556677885f5f5f5f5f 32 intel dec word ptr [eax] -66ff08|11223344556677885f5f5f5f5f 32 plan9 DECW 0(AX) -66ff08|11223344556677885f5f5f5f5f 64 gnu decw (%rax) -66ff08|11223344556677885f5f5f5f5f 64 intel dec word ptr [rax] -66ff08|11223344556677885f5f5f5f5f 64 plan9 DECW 0(AX) -66ff11|223344556677885f5f5f5f5f5f 32 intel call word ptr [ecx] -66ff11|223344556677885f5f5f5f5f5f 32 plan9 CALL 0(CX) -66ff11|223344556677885f5f5f5f5f5f 64 gnu callw *(%rcx) -66ff11|223344556677885f5f5f5f5f5f 64 intel call qword ptr [rcx] -66ff11|223344556677885f5f5f5f5f5f 64 plan9 CALL 0(CX) -66ff18|11223344556677885f5f5f5f5f 32 intel call far dword ptr [eax] -66ff18|11223344556677885f5f5f5f5f 32 plan9 LCALL 0(AX) -66ff18|11223344556677885f5f5f5f5f 64 gnu lcallw *(%rax) -66ff18|11223344556677885f5f5f5f5f 64 intel call far dword ptr [rax] -66ff18|11223344556677885f5f5f5f5f 64 plan9 LCALL 0(AX) -66ff20|11223344556677885f5f5f5f5f 32 intel jmp word ptr [eax] -66ff20|11223344556677885f5f5f5f5f 32 plan9 JMP 0(AX) -66ff20|11223344556677885f5f5f5f5f 64 gnu jmpw *(%rax) -66ff20|11223344556677885f5f5f5f5f 64 intel jmp qword ptr [rax] -66ff20|11223344556677885f5f5f5f5f 64 plan9 JMP 0(AX) -66ff28|11223344556677885f5f5f5f5f 32 intel jmp far dword ptr [eax] -66ff28|11223344556677885f5f5f5f5f 32 plan9 LJMP 0(AX) -66ff28|11223344556677885f5f5f5f5f 64 gnu ljmpw *(%rax) -66ff28|11223344556677885f5f5f5f5f 64 intel jmp far dword ptr [rax] -66ff28|11223344556677885f5f5f5f5f 64 plan9 LJMP 0(AX) -66ff30|11223344556677885f5f5f5f5f 32 intel push word ptr [eax] -66ff30|11223344556677885f5f5f5f5f 32 plan9 PUSHW 0(AX) -66ff30|11223344556677885f5f5f5f5f 64 gnu pushw (%rax) -66ff30|11223344556677885f5f5f5f5f 64 intel push word ptr [rax] -66ff30|11223344556677885f5f5f5f5f 64 plan9 PUSHW 0(AX) -66|9a11223344556677885f5f5f5f5f5f 64 gnu data16 -66|9a11223344556677885f5f5f5f5f5f 64 intel data16 -66|9a11223344556677885f5f5f5f5f5f 64 plan9 Op(0) -66|c411223344556677885f5f5f5f5f5f 64 gnu data16 -66|c411223344556677885f5f5f5f5f5f 64 intel data16 -66|c411223344556677885f5f5f5f5f5f 64 plan9 Op(0) -66|c511223344556677885f5f5f5f5f5f 64 gnu data16 -66|c511223344556677885f5f5f5f5f5f 64 intel data16 -66|c511223344556677885f5f5f5f5f5f 64 plan9 Op(0) -66|d411223344556677885f5f5f5f5f5f 64 gnu data16 -66|d411223344556677885f5f5f5f5f5f 64 intel data16 -66|d411223344556677885f5f5f5f5f5f 64 plan9 Op(0) -66|ea11223344556677885f5f5f5f5f5f 64 gnu data16 -66|ea11223344556677885f5f5f5f5f5f 64 intel data16 -66|ea11223344556677885f5f5f5f5f5f 64 plan9 Op(0) -676c|11223344556677885f5f5f5f5f5f 32 intel addr16 insb -676c|11223344556677885f5f5f5f5f5f 32 plan9 INSB DX, ES:0(DI) -676c|11223344556677885f5f5f5f5f5f 64 gnu insb (%dx),%es:(%edi) -676c|11223344556677885f5f5f5f5f5f 64 intel addr32 insb -676c|11223344556677885f5f5f5f5f5f 64 plan9 INSB DX, ES:0(DI) -67d7|11223344556677885f5f5f5f5f5f 32 intel addr16 xlat -67d7|11223344556677885f5f5f5f5f5f 32 plan9 XLATB DS:0(BX) -67d7|11223344556677885f5f5f5f5f5f 64 gnu xlat %ds:(%ebx) -67d7|11223344556677885f5f5f5f5f5f 64 intel addr32 xlat -67d7|11223344556677885f5f5f5f5f5f 64 plan9 XLATB DS:0(BX) -67e311|223344556677885f5f5f5f5f5f 32 intel addr16 jcxz .+0x11 -67e311|223344556677885f5f5f5f5f5f 32 plan9 JCXZ .+17 -67e311|223344556677885f5f5f5f5f5f 64 gnu jecxz .+0x11 -67e311|223344556677885f5f5f5f5f5f 64 intel addr32 jecxz .+0x11 -67e311|223344556677885f5f5f5f5f5f 64 plan9 JECXZ .+17 -6811223344|556677885f5f5f5f5f5f5f 32 intel push 0x44332211 -6811223344|556677885f5f5f5f5f5f5f 32 plan9 PUSHL $0x44332211 -6811223344|556677885f5f5f5f5f5f5f 64 gnu pushq $0x44332211 -6811223344|556677885f5f5f5f5f5f5f 64 intel push 0x44332211 -6811223344|556677885f5f5f5f5f5f5f 64 plan9 PUSHL $0x44332211 -691122334455|6677885f5f5f5f5f5f5f 32 intel imul edx, dword ptr [ecx], 0x55443322 -691122334455|6677885f5f5f5f5f5f5f 32 plan9 IMULL $0x55443322, 0(CX), DX -691122334455|6677885f5f5f5f5f5f5f 64 gnu imul $0x55443322,(%rcx),%edx -691122334455|6677885f5f5f5f5f5f5f 64 intel imul edx, dword ptr [rcx], 0x55443322 -691122334455|6677885f5f5f5f5f5f5f 64 plan9 IMULL $0x55443322, 0(CX), DX -6a11|223344556677885f5f5f5f5f5f5f 32 intel push 0x11 -6a11|223344556677885f5f5f5f5f5f5f 32 plan9 PUSHL $0x11 -6a11|223344556677885f5f5f5f5f5f5f 64 gnu pushq $0x11 -6a11|223344556677885f5f5f5f5f5f5f 64 intel push 0x11 -6a11|223344556677885f5f5f5f5f5f5f 64 plan9 PUSHL $0x11 -6b1122|3344556677885f5f5f5f5f5f5f 32 intel imul edx, dword ptr [ecx], 0x22 -6b1122|3344556677885f5f5f5f5f5f5f 32 plan9 IMULL $0x22, 0(CX), DX -6b1122|3344556677885f5f5f5f5f5f5f 64 gnu imul $0x22,(%rcx),%edx -6b1122|3344556677885f5f5f5f5f5f5f 64 intel imul edx, dword ptr [rcx], 0x22 -6b1122|3344556677885f5f5f5f5f5f5f 64 plan9 IMULL $0x22, 0(CX), DX -6d|11223344556677885f5f5f5f5f5f5f 32 intel insd -6d|11223344556677885f5f5f5f5f5f5f 32 plan9 INSD DX, ES:0(DI) -6d|11223344556677885f5f5f5f5f5f5f 64 gnu insl (%dx),%es:(%rdi) -6d|11223344556677885f5f5f5f5f5f5f 64 intel insd -6d|11223344556677885f5f5f5f5f5f5f 64 plan9 INSD DX, ES:0(DI) -6f|11223344556677885f5f5f5f5f5f5f 32 intel outsd -6f|11223344556677885f5f5f5f5f5f5f 32 plan9 OUTSD DS:0(SI), DX -6f|11223344556677885f5f5f5f5f5f5f 64 gnu outsl %ds:(%rsi),(%dx) -6f|11223344556677885f5f5f5f5f5f5f 64 intel outsd -6f|11223344556677885f5f5f5f5f5f5f 64 plan9 OUTSD DS:0(SI), DX -7111|223344556677885f5f5f5f5f5f5f 32 intel jno .+0x11 -7111|223344556677885f5f5f5f5f5f5f 32 plan9 JNO .+17 -7111|223344556677885f5f5f5f5f5f5f 64 gnu jno .+0x11 -7111|223344556677885f5f5f5f5f5f5f 64 intel jno .+0x11 -7111|223344556677885f5f5f5f5f5f5f 64 plan9 JNO .+17 -7211|223344556677885f5f5f5f5f5f5f 32 intel jb .+0x11 -7211|223344556677885f5f5f5f5f5f5f 32 plan9 JB .+17 -7211|223344556677885f5f5f5f5f5f5f 64 gnu jb .+0x11 -7211|223344556677885f5f5f5f5f5f5f 64 intel jb .+0x11 -7211|223344556677885f5f5f5f5f5f5f 64 plan9 JB .+17 -7311|223344556677885f5f5f5f5f5f5f 32 intel jnb .+0x11 -7311|223344556677885f5f5f5f5f5f5f 32 plan9 JAE .+17 -7311|223344556677885f5f5f5f5f5f5f 64 gnu jae .+0x11 -7311|223344556677885f5f5f5f5f5f5f 64 intel jnb .+0x11 -7311|223344556677885f5f5f5f5f5f5f 64 plan9 JAE .+17 -7411|223344556677885f5f5f5f5f5f5f 32 intel jz .+0x11 -7411|223344556677885f5f5f5f5f5f5f 32 plan9 JE .+17 -7411|223344556677885f5f5f5f5f5f5f 64 gnu je .+0x11 -7411|223344556677885f5f5f5f5f5f5f 64 intel jz .+0x11 -7411|223344556677885f5f5f5f5f5f5f 64 plan9 JE .+17 -7511|223344556677885f5f5f5f5f5f5f 32 intel jnz .+0x11 -7511|223344556677885f5f5f5f5f5f5f 32 plan9 JNE .+17 -7511|223344556677885f5f5f5f5f5f5f 64 gnu jne .+0x11 -7511|223344556677885f5f5f5f5f5f5f 64 intel jnz .+0x11 -7511|223344556677885f5f5f5f5f5f5f 64 plan9 JNE .+17 -7611|223344556677885f5f5f5f5f5f5f 32 intel jbe .+0x11 -7611|223344556677885f5f5f5f5f5f5f 32 plan9 JBE .+17 -7611|223344556677885f5f5f5f5f5f5f 64 gnu jbe .+0x11 -7611|223344556677885f5f5f5f5f5f5f 64 intel jbe .+0x11 -7611|223344556677885f5f5f5f5f5f5f 64 plan9 JBE .+17 -7711|223344556677885f5f5f5f5f5f5f 32 intel jnbe .+0x11 -7711|223344556677885f5f5f5f5f5f5f 32 plan9 JA .+17 -7711|223344556677885f5f5f5f5f5f5f 64 gnu ja .+0x11 -7711|223344556677885f5f5f5f5f5f5f 64 intel jnbe .+0x11 -7711|223344556677885f5f5f5f5f5f5f 64 plan9 JA .+17 -7811|223344556677885f5f5f5f5f5f5f 32 intel js .+0x11 -7811|223344556677885f5f5f5f5f5f5f 32 plan9 JS .+17 -7811|223344556677885f5f5f5f5f5f5f 64 gnu js .+0x11 -7811|223344556677885f5f5f5f5f5f5f 64 intel js .+0x11 -7811|223344556677885f5f5f5f5f5f5f 64 plan9 JS .+17 -7911|223344556677885f5f5f5f5f5f5f 32 intel jns .+0x11 -7911|223344556677885f5f5f5f5f5f5f 32 plan9 JNS .+17 -7911|223344556677885f5f5f5f5f5f5f 64 gnu jns .+0x11 -7911|223344556677885f5f5f5f5f5f5f 64 intel jns .+0x11 -7911|223344556677885f5f5f5f5f5f5f 64 plan9 JNS .+17 -7a11|223344556677885f5f5f5f5f5f5f 32 intel jp .+0x11 -7a11|223344556677885f5f5f5f5f5f5f 32 plan9 JP .+17 -7a11|223344556677885f5f5f5f5f5f5f 64 gnu jp .+0x11 -7a11|223344556677885f5f5f5f5f5f5f 64 intel jp .+0x11 -7a11|223344556677885f5f5f5f5f5f5f 64 plan9 JP .+17 -7b11|223344556677885f5f5f5f5f5f5f 32 intel jnp .+0x11 -7b11|223344556677885f5f5f5f5f5f5f 32 plan9 JNP .+17 -7b11|223344556677885f5f5f5f5f5f5f 64 gnu jnp .+0x11 -7b11|223344556677885f5f5f5f5f5f5f 64 intel jnp .+0x11 -7b11|223344556677885f5f5f5f5f5f5f 64 plan9 JNP .+17 -7c11|223344556677885f5f5f5f5f5f5f 32 intel jl .+0x11 -7c11|223344556677885f5f5f5f5f5f5f 32 plan9 JL .+17 -7c11|223344556677885f5f5f5f5f5f5f 64 gnu jl .+0x11 -7c11|223344556677885f5f5f5f5f5f5f 64 intel jl .+0x11 -7c11|223344556677885f5f5f5f5f5f5f 64 plan9 JL .+17 -7d11|223344556677885f5f5f5f5f5f5f 32 intel jnl .+0x11 -7d11|223344556677885f5f5f5f5f5f5f 32 plan9 JGE .+17 -7d11|223344556677885f5f5f5f5f5f5f 64 gnu jge .+0x11 -7d11|223344556677885f5f5f5f5f5f5f 64 intel jnl .+0x11 -7d11|223344556677885f5f5f5f5f5f5f 64 plan9 JGE .+17 -7e11|223344556677885f5f5f5f5f5f5f 32 intel jle .+0x11 -7e11|223344556677885f5f5f5f5f5f5f 32 plan9 JLE .+17 -7e11|223344556677885f5f5f5f5f5f5f 64 gnu jle .+0x11 -7e11|223344556677885f5f5f5f5f5f5f 64 intel jle .+0x11 -7e11|223344556677885f5f5f5f5f5f5f 64 plan9 JLE .+17 -7f11|223344556677885f5f5f5f5f5f5f 32 intel jnle .+0x11 -7f11|223344556677885f5f5f5f5f5f5f 32 plan9 JG .+17 -7f11|223344556677885f5f5f5f5f5f5f 64 gnu jg .+0x11 -7f11|223344556677885f5f5f5f5f5f5f 64 intel jnle .+0x11 -7f11|223344556677885f5f5f5f5f5f5f 64 plan9 JG .+17 -800011|223344556677885f5f5f5f5f5f 32 intel add byte ptr [eax], 0x11 -800011|223344556677885f5f5f5f5f5f 32 plan9 ADDB $0x11, 0(AX) -800011|223344556677885f5f5f5f5f5f 64 gnu addb $0x11,(%rax) -800011|223344556677885f5f5f5f5f5f 64 intel add byte ptr [rax], 0x11 -800011|223344556677885f5f5f5f5f5f 64 plan9 ADDB $0x11, 0(AX) -800811|223344556677885f5f5f5f5f5f 32 intel or byte ptr [eax], 0x11 -800811|223344556677885f5f5f5f5f5f 32 plan9 ORB $0x11, 0(AX) -800811|223344556677885f5f5f5f5f5f 64 gnu orb $0x11,(%rax) -800811|223344556677885f5f5f5f5f5f 64 intel or byte ptr [rax], 0x11 -800811|223344556677885f5f5f5f5f5f 64 plan9 ORB $0x11, 0(AX) -801122|3344556677885f5f5f5f5f5f5f 32 intel adc byte ptr [ecx], 0x22 -801122|3344556677885f5f5f5f5f5f5f 32 plan9 ADCB $0x22, 0(CX) -801122|3344556677885f5f5f5f5f5f5f 64 gnu adcb $0x22,(%rcx) -801122|3344556677885f5f5f5f5f5f5f 64 intel adc byte ptr [rcx], 0x22 -801122|3344556677885f5f5f5f5f5f5f 64 plan9 ADCB $0x22, 0(CX) -801811|223344556677885f5f5f5f5f5f 32 intel sbb byte ptr [eax], 0x11 -801811|223344556677885f5f5f5f5f5f 32 plan9 SBBB $0x11, 0(AX) -801811|223344556677885f5f5f5f5f5f 64 gnu sbbb $0x11,(%rax) -801811|223344556677885f5f5f5f5f5f 64 intel sbb byte ptr [rax], 0x11 -801811|223344556677885f5f5f5f5f5f 64 plan9 SBBB $0x11, 0(AX) -802011|223344556677885f5f5f5f5f5f 32 intel and byte ptr [eax], 0x11 -802011|223344556677885f5f5f5f5f5f 32 plan9 ANDB $0x11, 0(AX) -802011|223344556677885f5f5f5f5f5f 64 gnu andb $0x11,(%rax) -802011|223344556677885f5f5f5f5f5f 64 intel and byte ptr [rax], 0x11 -802011|223344556677885f5f5f5f5f5f 64 plan9 ANDB $0x11, 0(AX) -802811|223344556677885f5f5f5f5f5f 32 intel sub byte ptr [eax], 0x11 -802811|223344556677885f5f5f5f5f5f 32 plan9 SUBB $0x11, 0(AX) -802811|223344556677885f5f5f5f5f5f 64 gnu subb $0x11,(%rax) -802811|223344556677885f5f5f5f5f5f 64 intel sub byte ptr [rax], 0x11 -802811|223344556677885f5f5f5f5f5f 64 plan9 SUBB $0x11, 0(AX) -803011|223344556677885f5f5f5f5f5f 32 intel xor byte ptr [eax], 0x11 -803011|223344556677885f5f5f5f5f5f 32 plan9 XORB $0x11, 0(AX) -803011|223344556677885f5f5f5f5f5f 64 gnu xorb $0x11,(%rax) -803011|223344556677885f5f5f5f5f5f 64 intel xor byte ptr [rax], 0x11 -803011|223344556677885f5f5f5f5f5f 64 plan9 XORB $0x11, 0(AX) -803811|223344556677885f5f5f5f5f5f 32 intel cmp byte ptr [eax], 0x11 -803811|223344556677885f5f5f5f5f5f 32 plan9 CMPB $0x11, 0(AX) -803811|223344556677885f5f5f5f5f5f 64 gnu cmpb $0x11,(%rax) -803811|223344556677885f5f5f5f5f5f 64 intel cmp byte ptr [rax], 0x11 -803811|223344556677885f5f5f5f5f5f 64 plan9 CMPB $0x11, 0(AX) -810011223344|556677885f5f5f5f5f5f 32 intel add dword ptr [eax], 0x44332211 -810011223344|556677885f5f5f5f5f5f 32 plan9 ADDL $0x44332211, 0(AX) -810011223344|556677885f5f5f5f5f5f 64 gnu addl $0x44332211,(%rax) -810011223344|556677885f5f5f5f5f5f 64 intel add dword ptr [rax], 0x44332211 -810011223344|556677885f5f5f5f5f5f 64 plan9 ADDL $0x44332211, 0(AX) -810811223344|556677885f5f5f5f5f5f 32 intel or dword ptr [eax], 0x44332211 -810811223344|556677885f5f5f5f5f5f 32 plan9 ORL $0x44332211, 0(AX) -810811223344|556677885f5f5f5f5f5f 64 gnu orl $0x44332211,(%rax) -810811223344|556677885f5f5f5f5f5f 64 intel or dword ptr [rax], 0x44332211 -810811223344|556677885f5f5f5f5f5f 64 plan9 ORL $0x44332211, 0(AX) -811122334455|6677885f5f5f5f5f5f5f 32 intel adc dword ptr [ecx], 0x55443322 -811122334455|6677885f5f5f5f5f5f5f 32 plan9 ADCL $0x55443322, 0(CX) -811122334455|6677885f5f5f5f5f5f5f 64 gnu adcl $0x55443322,(%rcx) -811122334455|6677885f5f5f5f5f5f5f 64 intel adc dword ptr [rcx], 0x55443322 -811122334455|6677885f5f5f5f5f5f5f 64 plan9 ADCL $0x55443322, 0(CX) -811811223344|556677885f5f5f5f5f5f 32 intel sbb dword ptr [eax], 0x44332211 -811811223344|556677885f5f5f5f5f5f 32 plan9 SBBL $0x44332211, 0(AX) -811811223344|556677885f5f5f5f5f5f 64 gnu sbbl $0x44332211,(%rax) -811811223344|556677885f5f5f5f5f5f 64 intel sbb dword ptr [rax], 0x44332211 -811811223344|556677885f5f5f5f5f5f 64 plan9 SBBL $0x44332211, 0(AX) -812011223344|556677885f5f5f5f5f5f 32 intel and dword ptr [eax], 0x44332211 -812011223344|556677885f5f5f5f5f5f 32 plan9 ANDL $0x44332211, 0(AX) -812011223344|556677885f5f5f5f5f5f 64 gnu andl $0x44332211,(%rax) -812011223344|556677885f5f5f5f5f5f 64 intel and dword ptr [rax], 0x44332211 -812011223344|556677885f5f5f5f5f5f 64 plan9 ANDL $0x44332211, 0(AX) -812811223344|556677885f5f5f5f5f5f 32 intel sub dword ptr [eax], 0x44332211 -812811223344|556677885f5f5f5f5f5f 32 plan9 SUBL $0x44332211, 0(AX) -812811223344|556677885f5f5f5f5f5f 64 gnu subl $0x44332211,(%rax) -812811223344|556677885f5f5f5f5f5f 64 intel sub dword ptr [rax], 0x44332211 -812811223344|556677885f5f5f5f5f5f 64 plan9 SUBL $0x44332211, 0(AX) -813011223344|556677885f5f5f5f5f5f 32 intel xor dword ptr [eax], 0x44332211 -813011223344|556677885f5f5f5f5f5f 32 plan9 XORL $0x44332211, 0(AX) -813011223344|556677885f5f5f5f5f5f 64 gnu xorl $0x44332211,(%rax) -813011223344|556677885f5f5f5f5f5f 64 intel xor dword ptr [rax], 0x44332211 -813011223344|556677885f5f5f5f5f5f 64 plan9 XORL $0x44332211, 0(AX) -813811223344|556677885f5f5f5f5f5f 32 intel cmp dword ptr [eax], 0x44332211 -813811223344|556677885f5f5f5f5f5f 32 plan9 CMPL $0x44332211, 0(AX) -813811223344|556677885f5f5f5f5f5f 64 gnu cmpl $0x44332211,(%rax) -813811223344|556677885f5f5f5f5f5f 64 intel cmp dword ptr [rax], 0x44332211 -813811223344|556677885f5f5f5f5f5f 64 plan9 CMPL $0x44332211, 0(AX) -830011|223344556677885f5f5f5f5f5f 32 intel add dword ptr [eax], 0x11 -830011|223344556677885f5f5f5f5f5f 32 plan9 ADDL $0x11, 0(AX) -830011|223344556677885f5f5f5f5f5f 64 gnu addl $0x11,(%rax) -830011|223344556677885f5f5f5f5f5f 64 intel add dword ptr [rax], 0x11 -830011|223344556677885f5f5f5f5f5f 64 plan9 ADDL $0x11, 0(AX) -830811|223344556677885f5f5f5f5f5f 32 intel or dword ptr [eax], 0x11 -830811|223344556677885f5f5f5f5f5f 32 plan9 ORL $0x11, 0(AX) -830811|223344556677885f5f5f5f5f5f 64 gnu orl $0x11,(%rax) -830811|223344556677885f5f5f5f5f5f 64 intel or dword ptr [rax], 0x11 -830811|223344556677885f5f5f5f5f5f 64 plan9 ORL $0x11, 0(AX) -831122|3344556677885f5f5f5f5f5f5f 32 intel adc dword ptr [ecx], 0x22 -831122|3344556677885f5f5f5f5f5f5f 32 plan9 ADCL $0x22, 0(CX) -831122|3344556677885f5f5f5f5f5f5f 64 gnu adcl $0x22,(%rcx) -831122|3344556677885f5f5f5f5f5f5f 64 intel adc dword ptr [rcx], 0x22 -831122|3344556677885f5f5f5f5f5f5f 64 plan9 ADCL $0x22, 0(CX) -831811|223344556677885f5f5f5f5f5f 32 intel sbb dword ptr [eax], 0x11 -831811|223344556677885f5f5f5f5f5f 32 plan9 SBBL $0x11, 0(AX) -831811|223344556677885f5f5f5f5f5f 64 gnu sbbl $0x11,(%rax) -831811|223344556677885f5f5f5f5f5f 64 intel sbb dword ptr [rax], 0x11 -831811|223344556677885f5f5f5f5f5f 64 plan9 SBBL $0x11, 0(AX) -832011|223344556677885f5f5f5f5f5f 32 intel and dword ptr [eax], 0x11 -832011|223344556677885f5f5f5f5f5f 32 plan9 ANDL $0x11, 0(AX) -832011|223344556677885f5f5f5f5f5f 64 gnu andl $0x11,(%rax) -832011|223344556677885f5f5f5f5f5f 64 intel and dword ptr [rax], 0x11 -832011|223344556677885f5f5f5f5f5f 64 plan9 ANDL $0x11, 0(AX) -832811|223344556677885f5f5f5f5f5f 32 intel sub dword ptr [eax], 0x11 -832811|223344556677885f5f5f5f5f5f 32 plan9 SUBL $0x11, 0(AX) -832811|223344556677885f5f5f5f5f5f 64 gnu subl $0x11,(%rax) -832811|223344556677885f5f5f5f5f5f 64 intel sub dword ptr [rax], 0x11 -832811|223344556677885f5f5f5f5f5f 64 plan9 SUBL $0x11, 0(AX) -833011|223344556677885f5f5f5f5f5f 32 intel xor dword ptr [eax], 0x11 -833011|223344556677885f5f5f5f5f5f 32 plan9 XORL $0x11, 0(AX) -833011|223344556677885f5f5f5f5f5f 64 gnu xorl $0x11,(%rax) -833011|223344556677885f5f5f5f5f5f 64 intel xor dword ptr [rax], 0x11 -833011|223344556677885f5f5f5f5f5f 64 plan9 XORL $0x11, 0(AX) -833811|223344556677885f5f5f5f5f5f 32 intel cmp dword ptr [eax], 0x11 -833811|223344556677885f5f5f5f5f5f 32 plan9 CMPL $0x11, 0(AX) -833811|223344556677885f5f5f5f5f5f 64 gnu cmpl $0x11,(%rax) -833811|223344556677885f5f5f5f5f5f 64 intel cmp dword ptr [rax], 0x11 -833811|223344556677885f5f5f5f5f5f 64 plan9 CMPL $0x11, 0(AX) -8411|223344556677885f5f5f5f5f5f5f 32 intel test byte ptr [ecx], dl -8411|223344556677885f5f5f5f5f5f5f 32 plan9 TESTB DL, 0(CX) -8411|223344556677885f5f5f5f5f5f5f 64 gnu test %dl,(%rcx) -8411|223344556677885f5f5f5f5f5f5f 64 intel test byte ptr [rcx], dl -8411|223344556677885f5f5f5f5f5f5f 64 plan9 TESTB DL, 0(CX) -8511|223344556677885f5f5f5f5f5f5f 32 intel test dword ptr [ecx], edx -8511|223344556677885f5f5f5f5f5f5f 32 plan9 TESTL DX, 0(CX) -8511|223344556677885f5f5f5f5f5f5f 64 gnu test %edx,(%rcx) -8511|223344556677885f5f5f5f5f5f5f 64 intel test dword ptr [rcx], edx -8511|223344556677885f5f5f5f5f5f5f 64 plan9 TESTL DX, 0(CX) -8611|223344556677885f5f5f5f5f5f5f 32 intel xchg byte ptr [ecx], dl -8611|223344556677885f5f5f5f5f5f5f 32 plan9 XCHGB DL, 0(CX) -8611|223344556677885f5f5f5f5f5f5f 64 gnu xchg %dl,(%rcx) -8611|223344556677885f5f5f5f5f5f5f 64 intel xchg byte ptr [rcx], dl -8611|223344556677885f5f5f5f5f5f5f 64 plan9 XCHGB DL, 0(CX) -8711|223344556677885f5f5f5f5f5f5f 32 intel xchg dword ptr [ecx], edx -8711|223344556677885f5f5f5f5f5f5f 32 plan9 XCHGL DX, 0(CX) -8711|223344556677885f5f5f5f5f5f5f 64 gnu xchg %edx,(%rcx) -8711|223344556677885f5f5f5f5f5f5f 64 intel xchg dword ptr [rcx], edx -8711|223344556677885f5f5f5f5f5f5f 64 plan9 XCHGL DX, 0(CX) -8811|223344556677885f5f5f5f5f5f5f 32 intel mov byte ptr [ecx], dl -8811|223344556677885f5f5f5f5f5f5f 32 plan9 MOVB DL, 0(CX) -8811|223344556677885f5f5f5f5f5f5f 64 gnu mov %dl,(%rcx) -8811|223344556677885f5f5f5f5f5f5f 64 intel mov byte ptr [rcx], dl -8811|223344556677885f5f5f5f5f5f5f 64 plan9 MOVB DL, 0(CX) -8911|223344556677885f5f5f5f5f5f5f 32 intel mov dword ptr [ecx], edx -8911|223344556677885f5f5f5f5f5f5f 32 plan9 MOVL DX, 0(CX) -8911|223344556677885f5f5f5f5f5f5f 64 gnu mov %edx,(%rcx) -8911|223344556677885f5f5f5f5f5f5f 64 intel mov dword ptr [rcx], edx -8911|223344556677885f5f5f5f5f5f5f 64 plan9 MOVL DX, 0(CX) -8a11|223344556677885f5f5f5f5f5f5f 32 intel mov dl, byte ptr [ecx] -8a11|223344556677885f5f5f5f5f5f5f 32 plan9 MOVB 0(CX), DL -8a11|223344556677885f5f5f5f5f5f5f 64 gnu mov (%rcx),%dl -8a11|223344556677885f5f5f5f5f5f5f 64 intel mov dl, byte ptr [rcx] -8a11|223344556677885f5f5f5f5f5f5f 64 plan9 MOVB 0(CX), DL -8b11|223344556677885f5f5f5f5f5f5f 32 intel mov edx, dword ptr [ecx] -8b11|223344556677885f5f5f5f5f5f5f 32 plan9 MOVL 0(CX), DX -8b11|223344556677885f5f5f5f5f5f5f 64 gnu mov (%rcx),%edx -8b11|223344556677885f5f5f5f5f5f5f 64 intel mov edx, dword ptr [rcx] -8b11|223344556677885f5f5f5f5f5f5f 64 plan9 MOVL 0(CX), DX -8c11|223344556677885f5f5f5f5f5f5f 32 intel mov word ptr [ecx], ss -8c11|223344556677885f5f5f5f5f5f5f 32 plan9 MOVW SS, 0(CX) -8c11|223344556677885f5f5f5f5f5f5f 64 gnu mov %ss,(%rcx) -8c11|223344556677885f5f5f5f5f5f5f 64 intel mov word ptr [rcx], ss -8c11|223344556677885f5f5f5f5f5f5f 64 plan9 MOVW SS, 0(CX) -8d11|223344556677885f5f5f5f5f5f5f 32 intel lea edx, ptr [ecx] -8d11|223344556677885f5f5f5f5f5f5f 32 plan9 LEAL 0(CX), DX -8d11|223344556677885f5f5f5f5f5f5f 64 gnu lea (%rcx),%edx -8d11|223344556677885f5f5f5f5f5f5f 64 intel lea edx, ptr [rcx] -8d11|223344556677885f5f5f5f5f5f5f 64 plan9 LEAL 0(CX), DX -8e11|223344556677885f5f5f5f5f5f5f 32 intel mov ss, word ptr [ecx] -8e11|223344556677885f5f5f5f5f5f5f 32 plan9 MOVW 0(CX), SS -8e11|223344556677885f5f5f5f5f5f5f 64 gnu mov (%rcx),%ss -8e11|223344556677885f5f5f5f5f5f5f 64 intel mov ss, word ptr [rcx] -8e11|223344556677885f5f5f5f5f5f5f 64 plan9 MOVW 0(CX), SS -8f00|11223344556677885f5f5f5f5f5f 32 intel pop dword ptr [eax] -8f00|11223344556677885f5f5f5f5f5f 32 plan9 POPL 0(AX) -8f00|11223344556677885f5f5f5f5f5f 64 gnu popq (%rax) -8f00|11223344556677885f5f5f5f5f5f 64 intel pop qword ptr [rax] -8f00|11223344556677885f5f5f5f5f5f 64 plan9 POPQ 0(AX) -91|11223344556677885f5f5f5f5f5f5f 32 intel xchg ecx, eax -91|11223344556677885f5f5f5f5f5f5f 32 plan9 XCHGL AX, CX -91|11223344556677885f5f5f5f5f5f5f 64 intel xchg ecx, eax -91|11223344556677885f5f5f5f5f5f5f 64 plan9 XCHGL AX, CX -98|11223344556677885f5f5f5f5f5f5f 32 intel cwde -98|11223344556677885f5f5f5f5f5f5f 32 plan9 CWDE -98|11223344556677885f5f5f5f5f5f5f 64 gnu cwtl -98|11223344556677885f5f5f5f5f5f5f 64 intel cwde -98|11223344556677885f5f5f5f5f5f5f 64 plan9 CWDE -99|11223344556677885f5f5f5f5f5f5f 32 intel cdq -99|11223344556677885f5f5f5f5f5f5f 32 plan9 CDQ -99|11223344556677885f5f5f5f5f5f5f 64 gnu cltd -99|11223344556677885f5f5f5f5f5f5f 64 intel cdq -99|11223344556677885f5f5f5f5f5f5f 64 plan9 CDQ -9a112233445566|77885f5f5f5f5f5f5f 32 intel call far 0x44332211, 0x6655 -9a112233445566|77885f5f5f5f5f5f5f 32 plan9 LCALL $0x44332211, $0x6655 -9b|11223344556677885f5f5f5f5f5f5f 32 intel fwait -9b|11223344556677885f5f5f5f5f5f5f 32 plan9 FWAIT -9b|11223344556677885f5f5f5f5f5f5f 64 gnu fwait -9b|11223344556677885f5f5f5f5f5f5f 64 intel fwait -9b|11223344556677885f5f5f5f5f5f5f 64 plan9 FWAIT -9c|11223344556677885f5f5f5f5f5f5f 32 intel pushfd -9c|11223344556677885f5f5f5f5f5f5f 32 plan9 PUSHFD -9c|11223344556677885f5f5f5f5f5f5f 64 gnu pushfq -9c|11223344556677885f5f5f5f5f5f5f 64 intel pushfq -9c|11223344556677885f5f5f5f5f5f5f 64 plan9 PUSHFQ -9d|11223344556677885f5f5f5f5f5f5f 32 intel popfd -9d|11223344556677885f5f5f5f5f5f5f 32 plan9 POPFD -9d|11223344556677885f5f5f5f5f5f5f 64 gnu popfq -9d|11223344556677885f5f5f5f5f5f5f 64 intel popfq -9d|11223344556677885f5f5f5f5f5f5f 64 plan9 POPFQ -9e|11223344556677885f5f5f5f5f5f5f 32 intel sahf -9e|11223344556677885f5f5f5f5f5f5f 32 plan9 SAHF -9e|11223344556677885f5f5f5f5f5f5f 64 gnu sahf -9e|11223344556677885f5f5f5f5f5f5f 64 intel sahf -9e|11223344556677885f5f5f5f5f5f5f 64 plan9 SAHF -9f|11223344556677885f5f5f5f5f5f5f 32 intel lahf -9f|11223344556677885f5f5f5f5f5f5f 32 plan9 LAHF -9f|11223344556677885f5f5f5f5f5f5f 64 gnu lahf -9f|11223344556677885f5f5f5f5f5f5f 64 intel lahf -9f|11223344556677885f5f5f5f5f5f5f 64 plan9 LAHF -a11122334455667788|5f5f5f5f5f5f5f 64 gnu mov -0x778899aabbccddef,%eax -a11122334455667788|5f5f5f5f5f5f5f 64 intel mov eax, dword ptr [0x8877665544332211] -a11122334455667788|5f5f5f5f5f5f5f 64 plan9 MOVL -0x778899aabbccddef, AX -a111223344|556677885f5f5f5f5f5f5f 32 intel mov eax, dword ptr [0x44332211] -a111223344|556677885f5f5f5f5f5f5f 32 plan9 MOVL 0x44332211, AX -a21122334455667788|5f5f5f5f5f5f5f 64 gnu mov %al,-0x778899aabbccddef -a21122334455667788|5f5f5f5f5f5f5f 64 intel mov byte ptr [0x8877665544332211], al -a21122334455667788|5f5f5f5f5f5f5f 64 plan9 MOVB AL, -0x778899aabbccddef -a211223344|556677885f5f5f5f5f5f5f 32 intel mov byte ptr [0x44332211], al -a211223344|556677885f5f5f5f5f5f5f 32 plan9 MOVB AL, 0x44332211 -a31122334455667788|5f5f5f5f5f5f5f 64 gnu mov %eax,-0x778899aabbccddef -a31122334455667788|5f5f5f5f5f5f5f 64 intel mov dword ptr [0x8877665544332211], eax -a31122334455667788|5f5f5f5f5f5f5f 64 plan9 MOVL AX, -0x778899aabbccddef -a311223344|556677885f5f5f5f5f5f5f 32 intel mov dword ptr [0x44332211], eax -a311223344|556677885f5f5f5f5f5f5f 32 plan9 MOVL AX, 0x44332211 -a4|11223344556677885f5f5f5f5f5f5f 32 intel movsb byte ptr [edi], byte ptr [esi] -a4|11223344556677885f5f5f5f5f5f5f 32 plan9 MOVSB DS:0(SI), ES:0(DI) -a4|11223344556677885f5f5f5f5f5f5f 64 gnu movsb %ds:(%rsi),%es:(%rdi) -a4|11223344556677885f5f5f5f5f5f5f 64 intel movsb byte ptr [rdi], byte ptr [rsi] -a4|11223344556677885f5f5f5f5f5f5f 64 plan9 MOVSB DS:0(SI), ES:0(DI) -a5|11223344556677885f5f5f5f5f5f5f 32 intel movsd dword ptr [edi], dword ptr [esi] -a5|11223344556677885f5f5f5f5f5f5f 32 plan9 MOVSD DS:0(SI), ES:0(DI) -a5|11223344556677885f5f5f5f5f5f5f 64 gnu movsl %ds:(%rsi),%es:(%rdi) -a5|11223344556677885f5f5f5f5f5f5f 64 intel movsd dword ptr [rdi], dword ptr [rsi] -a5|11223344556677885f5f5f5f5f5f5f 64 plan9 MOVSD DS:0(SI), ES:0(DI) -a6|11223344556677885f5f5f5f5f5f5f 32 intel cmpsb byte ptr [esi], byte ptr [edi] -a6|11223344556677885f5f5f5f5f5f5f 32 plan9 CMPSB ES:0(DI), DS:0(SI) -a6|11223344556677885f5f5f5f5f5f5f 64 gnu cmpsb %es:(%rdi),%ds:(%rsi) -a6|11223344556677885f5f5f5f5f5f5f 64 intel cmpsb byte ptr [rsi], byte ptr [rdi] -a6|11223344556677885f5f5f5f5f5f5f 64 plan9 CMPSB ES:0(DI), DS:0(SI) -a7|11223344556677885f5f5f5f5f5f5f 32 intel cmpsd dword ptr [esi], dword ptr [edi] -a7|11223344556677885f5f5f5f5f5f5f 32 plan9 CMPSD ES:0(DI), DS:0(SI) -a7|11223344556677885f5f5f5f5f5f5f 64 gnu cmpsl %es:(%rdi),%ds:(%rsi) -a7|11223344556677885f5f5f5f5f5f5f 64 intel cmpsd dword ptr [rsi], dword ptr [rdi] -a7|11223344556677885f5f5f5f5f5f5f 64 plan9 CMPSD ES:0(DI), DS:0(SI) -a811|223344556677885f5f5f5f5f5f5f 32 intel test al, 0x11 -a811|223344556677885f5f5f5f5f5f5f 32 plan9 TESTL $0x11, AL -a811|223344556677885f5f5f5f5f5f5f 64 gnu test $0x11,%al -a811|223344556677885f5f5f5f5f5f5f 64 intel test al, 0x11 -a811|223344556677885f5f5f5f5f5f5f 64 plan9 TESTL $0x11, AL -a911223344|556677885f5f5f5f5f5f5f 32 intel test eax, 0x44332211 -a911223344|556677885f5f5f5f5f5f5f 32 plan9 TESTL $0x44332211, AX -a911223344|556677885f5f5f5f5f5f5f 64 gnu test $0x44332211,%eax -a911223344|556677885f5f5f5f5f5f5f 64 intel test eax, 0x44332211 -a911223344|556677885f5f5f5f5f5f5f 64 plan9 TESTL $0x44332211, AX -aa|11223344556677885f5f5f5f5f5f5f 32 intel stosb byte ptr [edi] -aa|11223344556677885f5f5f5f5f5f5f 32 plan9 STOSB AL, ES:0(DI) -aa|11223344556677885f5f5f5f5f5f5f 64 gnu stos %al,%es:(%rdi) -aa|11223344556677885f5f5f5f5f5f5f 64 intel stosb byte ptr [rdi] -aa|11223344556677885f5f5f5f5f5f5f 64 plan9 STOSB AL, ES:0(DI) -ab|11223344556677885f5f5f5f5f5f5f 32 intel stosd dword ptr [edi] -ab|11223344556677885f5f5f5f5f5f5f 32 plan9 STOSD AX, ES:0(DI) -ab|11223344556677885f5f5f5f5f5f5f 64 gnu stos %eax,%es:(%rdi) -ab|11223344556677885f5f5f5f5f5f5f 64 intel stosd dword ptr [rdi] -ab|11223344556677885f5f5f5f5f5f5f 64 plan9 STOSD AX, ES:0(DI) -ac|11223344556677885f5f5f5f5f5f5f 32 intel lodsb byte ptr [esi] -ac|11223344556677885f5f5f5f5f5f5f 32 plan9 LODSB DS:0(SI), AL -ac|11223344556677885f5f5f5f5f5f5f 64 gnu lods %ds:(%rsi),%al -ac|11223344556677885f5f5f5f5f5f5f 64 intel lodsb byte ptr [rsi] -ac|11223344556677885f5f5f5f5f5f5f 64 plan9 LODSB DS:0(SI), AL -ad|11223344556677885f5f5f5f5f5f5f 32 intel lodsd dword ptr [esi] -ad|11223344556677885f5f5f5f5f5f5f 32 plan9 LODSD DS:0(SI), AX -ad|11223344556677885f5f5f5f5f5f5f 64 gnu lods %ds:(%rsi),%eax -ad|11223344556677885f5f5f5f5f5f5f 64 intel lodsd dword ptr [rsi] -ad|11223344556677885f5f5f5f5f5f5f 64 plan9 LODSD DS:0(SI), AX -ae|11223344556677885f5f5f5f5f5f5f 32 intel scasb byte ptr [edi] -ae|11223344556677885f5f5f5f5f5f5f 32 plan9 SCASB ES:0(DI), AL -ae|11223344556677885f5f5f5f5f5f5f 64 gnu scas %es:(%rdi),%al -ae|11223344556677885f5f5f5f5f5f5f 64 intel scasb byte ptr [rdi] -ae|11223344556677885f5f5f5f5f5f5f 64 plan9 SCASB ES:0(DI), AL -af|11223344556677885f5f5f5f5f5f5f 32 intel scasd dword ptr [edi] -af|11223344556677885f5f5f5f5f5f5f 32 plan9 SCASD ES:0(DI), AX -af|11223344556677885f5f5f5f5f5f5f 64 gnu scas %es:(%rdi),%eax -af|11223344556677885f5f5f5f5f5f5f 64 intel scasd dword ptr [rdi] -af|11223344556677885f5f5f5f5f5f5f 64 plan9 SCASD ES:0(DI), AX -b011|223344556677885f5f5f5f5f5f5f 32 intel mov al, 0x11 -b011|223344556677885f5f5f5f5f5f5f 32 plan9 MOVL $0x11, AL -b011|223344556677885f5f5f5f5f5f5f 64 gnu mov $0x11,%al -b011|223344556677885f5f5f5f5f5f5f 64 intel mov al, 0x11 -b011|223344556677885f5f5f5f5f5f5f 64 plan9 MOVL $0x11, AL -b811223344|556677885f5f5f5f5f5f5f 32 intel mov eax, 0x44332211 -b811223344|556677885f5f5f5f5f5f5f 32 plan9 MOVL $0x44332211, AX -b811223344|556677885f5f5f5f5f5f5f 64 gnu mov $0x44332211,%eax -b811223344|556677885f5f5f5f5f5f5f 64 intel mov eax, 0x44332211 -b811223344|556677885f5f5f5f5f5f5f 64 plan9 MOVL $0x44332211, AX -c00011|223344556677885f5f5f5f5f5f 32 intel rol byte ptr [eax], 0x11 -c00011|223344556677885f5f5f5f5f5f 32 plan9 ROLB $0x11, 0(AX) -c00011|223344556677885f5f5f5f5f5f 64 gnu rolb $0x11,(%rax) -c00011|223344556677885f5f5f5f5f5f 64 intel rol byte ptr [rax], 0x11 -c00011|223344556677885f5f5f5f5f5f 64 plan9 ROLB $0x11, 0(AX) -c00811|223344556677885f5f5f5f5f5f 32 intel ror byte ptr [eax], 0x11 -c00811|223344556677885f5f5f5f5f5f 32 plan9 RORB $0x11, 0(AX) -c00811|223344556677885f5f5f5f5f5f 64 gnu rorb $0x11,(%rax) -c00811|223344556677885f5f5f5f5f5f 64 intel ror byte ptr [rax], 0x11 -c00811|223344556677885f5f5f5f5f5f 64 plan9 RORB $0x11, 0(AX) -c01122|3344556677885f5f5f5f5f5f5f 32 intel rcl byte ptr [ecx], 0x22 -c01122|3344556677885f5f5f5f5f5f5f 32 plan9 RCLB $0x22, 0(CX) -c01122|3344556677885f5f5f5f5f5f5f 64 gnu rclb $0x22,(%rcx) -c01122|3344556677885f5f5f5f5f5f5f 64 intel rcl byte ptr [rcx], 0x22 -c01122|3344556677885f5f5f5f5f5f5f 64 plan9 RCLB $0x22, 0(CX) -c01811|223344556677885f5f5f5f5f5f 32 intel rcr byte ptr [eax], 0x11 -c01811|223344556677885f5f5f5f5f5f 32 plan9 RCRB $0x11, 0(AX) -c01811|223344556677885f5f5f5f5f5f 64 gnu rcrb $0x11,(%rax) -c01811|223344556677885f5f5f5f5f5f 64 intel rcr byte ptr [rax], 0x11 -c01811|223344556677885f5f5f5f5f5f 64 plan9 RCRB $0x11, 0(AX) -c02011|223344556677885f5f5f5f5f5f 32 intel shl byte ptr [eax], 0x11 -c02011|223344556677885f5f5f5f5f5f 32 plan9 SHLB $0x11, 0(AX) -c02011|223344556677885f5f5f5f5f5f 64 gnu shlb $0x11,(%rax) -c02011|223344556677885f5f5f5f5f5f 64 intel shl byte ptr [rax], 0x11 -c02011|223344556677885f5f5f5f5f5f 64 plan9 SHLB $0x11, 0(AX) -c02811|223344556677885f5f5f5f5f5f 32 intel shr byte ptr [eax], 0x11 -c02811|223344556677885f5f5f5f5f5f 32 plan9 SHRB $0x11, 0(AX) -c02811|223344556677885f5f5f5f5f5f 64 gnu shrb $0x11,(%rax) -c02811|223344556677885f5f5f5f5f5f 64 intel shr byte ptr [rax], 0x11 -c02811|223344556677885f5f5f5f5f5f 64 plan9 SHRB $0x11, 0(AX) -c03811|223344556677885f5f5f5f5f5f 32 intel sar byte ptr [eax], 0x11 -c03811|223344556677885f5f5f5f5f5f 32 plan9 SARB $0x11, 0(AX) -c03811|223344556677885f5f5f5f5f5f 64 gnu sarb $0x11,(%rax) -c03811|223344556677885f5f5f5f5f5f 64 intel sar byte ptr [rax], 0x11 -c03811|223344556677885f5f5f5f5f5f 64 plan9 SARB $0x11, 0(AX) -c10011|223344556677885f5f5f5f5f5f 32 intel rol dword ptr [eax], 0x11 -c10011|223344556677885f5f5f5f5f5f 32 plan9 ROLL $0x11, 0(AX) -c10011|223344556677885f5f5f5f5f5f 64 gnu roll $0x11,(%rax) -c10011|223344556677885f5f5f5f5f5f 64 intel rol dword ptr [rax], 0x11 -c10011|223344556677885f5f5f5f5f5f 64 plan9 ROLL $0x11, 0(AX) -c10811|223344556677885f5f5f5f5f5f 32 intel ror dword ptr [eax], 0x11 -c10811|223344556677885f5f5f5f5f5f 32 plan9 RORL $0x11, 0(AX) -c10811|223344556677885f5f5f5f5f5f 64 gnu rorl $0x11,(%rax) -c10811|223344556677885f5f5f5f5f5f 64 intel ror dword ptr [rax], 0x11 -c10811|223344556677885f5f5f5f5f5f 64 plan9 RORL $0x11, 0(AX) -c11122|3344556677885f5f5f5f5f5f5f 32 intel rcl dword ptr [ecx], 0x22 -c11122|3344556677885f5f5f5f5f5f5f 32 plan9 RCLL $0x22, 0(CX) -c11122|3344556677885f5f5f5f5f5f5f 64 gnu rcll $0x22,(%rcx) -c11122|3344556677885f5f5f5f5f5f5f 64 intel rcl dword ptr [rcx], 0x22 -c11122|3344556677885f5f5f5f5f5f5f 64 plan9 RCLL $0x22, 0(CX) -c11811|223344556677885f5f5f5f5f5f 32 intel rcr dword ptr [eax], 0x11 -c11811|223344556677885f5f5f5f5f5f 32 plan9 RCRL $0x11, 0(AX) -c11811|223344556677885f5f5f5f5f5f 64 gnu rcrl $0x11,(%rax) -c11811|223344556677885f5f5f5f5f5f 64 intel rcr dword ptr [rax], 0x11 -c11811|223344556677885f5f5f5f5f5f 64 plan9 RCRL $0x11, 0(AX) -c12011|223344556677885f5f5f5f5f5f 32 intel shl dword ptr [eax], 0x11 -c12011|223344556677885f5f5f5f5f5f 32 plan9 SHLL $0x11, 0(AX) -c12011|223344556677885f5f5f5f5f5f 64 gnu shll $0x11,(%rax) -c12011|223344556677885f5f5f5f5f5f 64 intel shl dword ptr [rax], 0x11 -c12011|223344556677885f5f5f5f5f5f 64 plan9 SHLL $0x11, 0(AX) -c12811|223344556677885f5f5f5f5f5f 32 intel shr dword ptr [eax], 0x11 -c12811|223344556677885f5f5f5f5f5f 32 plan9 SHRL $0x11, 0(AX) -c12811|223344556677885f5f5f5f5f5f 64 gnu shrl $0x11,(%rax) -c12811|223344556677885f5f5f5f5f5f 64 intel shr dword ptr [rax], 0x11 -c12811|223344556677885f5f5f5f5f5f 64 plan9 SHRL $0x11, 0(AX) -c13811|223344556677885f5f5f5f5f5f 32 intel sar dword ptr [eax], 0x11 -c13811|223344556677885f5f5f5f5f5f 32 plan9 SARL $0x11, 0(AX) -c13811|223344556677885f5f5f5f5f5f 64 gnu sarl $0x11,(%rax) -c13811|223344556677885f5f5f5f5f5f 64 intel sar dword ptr [rax], 0x11 -c13811|223344556677885f5f5f5f5f5f 64 plan9 SARL $0x11, 0(AX) -c3|11223344556677885f5f5f5f5f5f5f 32 intel ret -c3|11223344556677885f5f5f5f5f5f5f 32 plan9 RET -c3|11223344556677885f5f5f5f5f5f5f 64 gnu retq -c3|11223344556677885f5f5f5f5f5f5f 64 intel ret -c3|11223344556677885f5f5f5f5f5f5f 64 plan9 RET -c411|223344556677885f5f5f5f5f5f5f 32 intel les edx, ptr [ecx] -c411|223344556677885f5f5f5f5f5f5f 32 plan9 LES 0(CX), DX -c511|223344556677885f5f5f5f5f5f5f 32 intel lds edx, ptr [ecx] -c511|223344556677885f5f5f5f5f5f5f 32 plan9 LDS 0(CX), DX -c60011|223344556677885f5f5f5f5f5f 32 intel mov byte ptr [eax], 0x11 -c60011|223344556677885f5f5f5f5f5f 32 plan9 MOVB $0x11, 0(AX) -c60011|223344556677885f5f5f5f5f5f 64 gnu movb $0x11,(%rax) -c60011|223344556677885f5f5f5f5f5f 64 intel mov byte ptr [rax], 0x11 -c60011|223344556677885f5f5f5f5f5f 64 plan9 MOVB $0x11, 0(AX) -c6f811|223344556677885f5f5f5f5f5f 32 intel xabort 0x11 -c6f811|223344556677885f5f5f5f5f5f 32 plan9 XABORT $0x11 -c6f811|223344556677885f5f5f5f5f5f 64 gnu xabort $0x11 -c6f811|223344556677885f5f5f5f5f5f 64 intel xabort 0x11 -c6f811|223344556677885f5f5f5f5f5f 64 plan9 XABORT $0x11 -c70011223344|556677885f5f5f5f5f5f 32 intel mov dword ptr [eax], 0x44332211 -c70011223344|556677885f5f5f5f5f5f 32 plan9 MOVL $0x44332211, 0(AX) -c70011223344|556677885f5f5f5f5f5f 64 gnu movl $0x44332211,(%rax) -c70011223344|556677885f5f5f5f5f5f 64 intel mov dword ptr [rax], 0x44332211 -c70011223344|556677885f5f5f5f5f5f 64 plan9 MOVL $0x44332211, 0(AX) -c7f811223344|556677885f5f5f5f5f5f 32 intel xbegin .+0x44332211 -c7f811223344|556677885f5f5f5f5f5f 32 plan9 XBEGIN .+1144201745 -c7f811223344|556677885f5f5f5f5f5f 64 gnu xbeginq .+0x44332211 -c7f811223344|556677885f5f5f5f5f5f 64 intel xbegin .+0x44332211 -c7f811223344|556677885f5f5f5f5f5f 64 plan9 XBEGIN .+1144201745 -c8112233|44556677885f5f5f5f5f5f5f 32 intel enter 0x2211, 0x33 -c8112233|44556677885f5f5f5f5f5f5f 32 plan9 ENTER $0x33, $0x2211 -c8112233|44556677885f5f5f5f5f5f5f 64 gnu enterq $0x2211,$0x33 -c8112233|44556677885f5f5f5f5f5f5f 64 intel enter 0x2211, 0x33 -c8112233|44556677885f5f5f5f5f5f5f 64 plan9 ENTER $0x33, $0x2211 -c9|11223344556677885f5f5f5f5f5f5f 32 intel leave -c9|11223344556677885f5f5f5f5f5f5f 32 plan9 LEAVE -c9|11223344556677885f5f5f5f5f5f5f 64 gnu leaveq -c9|11223344556677885f5f5f5f5f5f5f 64 intel leave -c9|11223344556677885f5f5f5f5f5f5f 64 plan9 LEAVE -ca1122|3344556677885f5f5f5f5f5f5f 32 intel ret far 0x2211 -ca1122|3344556677885f5f5f5f5f5f5f 32 plan9 LRET $0x2211 -ca1122|3344556677885f5f5f5f5f5f5f 64 gnu lretq $0x2211 -ca1122|3344556677885f5f5f5f5f5f5f 64 intel ret far 0x2211 -ca1122|3344556677885f5f5f5f5f5f5f 64 plan9 LRET $0x2211 -cb|11223344556677885f5f5f5f5f5f5f 32 intel ret far -cb|11223344556677885f5f5f5f5f5f5f 32 plan9 LRET -cb|11223344556677885f5f5f5f5f5f5f 64 gnu lretq -cb|11223344556677885f5f5f5f5f5f5f 64 intel ret far -cb|11223344556677885f5f5f5f5f5f5f 64 plan9 LRET -cc|11223344556677885f5f5f5f5f5f5f 32 intel int3 -cc|11223344556677885f5f5f5f5f5f5f 32 plan9 INT $0x3 -cc|11223344556677885f5f5f5f5f5f5f 64 gnu int3 -cc|11223344556677885f5f5f5f5f5f5f 64 intel int3 -cc|11223344556677885f5f5f5f5f5f5f 64 plan9 INT $0x3 -cd11|223344556677885f5f5f5f5f5f5f 32 intel int 0x11 -cd11|223344556677885f5f5f5f5f5f5f 32 plan9 INT $0x11 -cd11|223344556677885f5f5f5f5f5f5f 64 gnu int $0x11 -cd11|223344556677885f5f5f5f5f5f5f 64 intel int 0x11 -cd11|223344556677885f5f5f5f5f5f5f 64 plan9 INT $0x11 -ce|11223344556677885f5f5f5f5f5f5f 32 intel into -ce|11223344556677885f5f5f5f5f5f5f 32 plan9 INTO -ce|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -ce|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -ce|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -cf|11223344556677885f5f5f5f5f5f5f 32 intel iretd -cf|11223344556677885f5f5f5f5f5f5f 32 plan9 IRETD -cf|11223344556677885f5f5f5f5f5f5f 64 gnu iret -cf|11223344556677885f5f5f5f5f5f5f 64 intel iretd -cf|11223344556677885f5f5f5f5f5f5f 64 plan9 IRETD -d000|11223344556677885f5f5f5f5f5f 32 intel rol byte ptr [eax], 0x1 -d000|11223344556677885f5f5f5f5f5f 32 plan9 ROLB $0x1, 0(AX) -d000|11223344556677885f5f5f5f5f5f 64 gnu rolb (%rax) -d000|11223344556677885f5f5f5f5f5f 64 intel rol byte ptr [rax], 0x1 -d000|11223344556677885f5f5f5f5f5f 64 plan9 ROLB $0x1, 0(AX) -d008|11223344556677885f5f5f5f5f5f 32 intel ror byte ptr [eax], 0x1 -d008|11223344556677885f5f5f5f5f5f 32 plan9 RORB $0x1, 0(AX) -d008|11223344556677885f5f5f5f5f5f 64 gnu rorb (%rax) -d008|11223344556677885f5f5f5f5f5f 64 intel ror byte ptr [rax], 0x1 -d008|11223344556677885f5f5f5f5f5f 64 plan9 RORB $0x1, 0(AX) -d011|223344556677885f5f5f5f5f5f5f 32 intel rcl byte ptr [ecx], 0x1 -d011|223344556677885f5f5f5f5f5f5f 32 plan9 RCLB $0x1, 0(CX) -d011|223344556677885f5f5f5f5f5f5f 64 gnu rclb (%rcx) -d011|223344556677885f5f5f5f5f5f5f 64 intel rcl byte ptr [rcx], 0x1 -d011|223344556677885f5f5f5f5f5f5f 64 plan9 RCLB $0x1, 0(CX) -d018|11223344556677885f5f5f5f5f5f 32 intel rcr byte ptr [eax], 0x1 -d018|11223344556677885f5f5f5f5f5f 32 plan9 RCRB $0x1, 0(AX) -d018|11223344556677885f5f5f5f5f5f 64 gnu rcrb (%rax) -d018|11223344556677885f5f5f5f5f5f 64 intel rcr byte ptr [rax], 0x1 -d018|11223344556677885f5f5f5f5f5f 64 plan9 RCRB $0x1, 0(AX) -d020|11223344556677885f5f5f5f5f5f 32 intel shl byte ptr [eax], 0x1 -d020|11223344556677885f5f5f5f5f5f 32 plan9 SHLB $0x1, 0(AX) -d020|11223344556677885f5f5f5f5f5f 64 gnu shlb (%rax) -d020|11223344556677885f5f5f5f5f5f 64 intel shl byte ptr [rax], 0x1 -d020|11223344556677885f5f5f5f5f5f 64 plan9 SHLB $0x1, 0(AX) -d028|11223344556677885f5f5f5f5f5f 32 intel shr byte ptr [eax], 0x1 -d028|11223344556677885f5f5f5f5f5f 32 plan9 SHRB $0x1, 0(AX) -d028|11223344556677885f5f5f5f5f5f 64 gnu shrb (%rax) -d028|11223344556677885f5f5f5f5f5f 64 intel shr byte ptr [rax], 0x1 -d028|11223344556677885f5f5f5f5f5f 64 plan9 SHRB $0x1, 0(AX) -d038|11223344556677885f5f5f5f5f5f 32 intel sar byte ptr [eax], 0x1 -d038|11223344556677885f5f5f5f5f5f 32 plan9 SARB $0x1, 0(AX) -d038|11223344556677885f5f5f5f5f5f 64 gnu sarb (%rax) -d038|11223344556677885f5f5f5f5f5f 64 intel sar byte ptr [rax], 0x1 -d038|11223344556677885f5f5f5f5f5f 64 plan9 SARB $0x1, 0(AX) -d100|11223344556677885f5f5f5f5f5f 32 intel rol dword ptr [eax], 0x1 -d100|11223344556677885f5f5f5f5f5f 32 plan9 ROLL $0x1, 0(AX) -d100|11223344556677885f5f5f5f5f5f 64 gnu roll (%rax) -d100|11223344556677885f5f5f5f5f5f 64 intel rol dword ptr [rax], 0x1 -d100|11223344556677885f5f5f5f5f5f 64 plan9 ROLL $0x1, 0(AX) -d108|11223344556677885f5f5f5f5f5f 32 intel ror dword ptr [eax], 0x1 -d108|11223344556677885f5f5f5f5f5f 32 plan9 RORL $0x1, 0(AX) -d108|11223344556677885f5f5f5f5f5f 64 gnu rorl (%rax) -d108|11223344556677885f5f5f5f5f5f 64 intel ror dword ptr [rax], 0x1 -d108|11223344556677885f5f5f5f5f5f 64 plan9 RORL $0x1, 0(AX) -d111|223344556677885f5f5f5f5f5f5f 32 intel rcl dword ptr [ecx], 0x1 -d111|223344556677885f5f5f5f5f5f5f 32 plan9 RCLL $0x1, 0(CX) -d111|223344556677885f5f5f5f5f5f5f 64 gnu rcll (%rcx) -d111|223344556677885f5f5f5f5f5f5f 64 intel rcl dword ptr [rcx], 0x1 -d111|223344556677885f5f5f5f5f5f5f 64 plan9 RCLL $0x1, 0(CX) -d118|11223344556677885f5f5f5f5f5f 32 intel rcr dword ptr [eax], 0x1 -d118|11223344556677885f5f5f5f5f5f 32 plan9 RCRL $0x1, 0(AX) -d118|11223344556677885f5f5f5f5f5f 64 gnu rcrl (%rax) -d118|11223344556677885f5f5f5f5f5f 64 intel rcr dword ptr [rax], 0x1 -d118|11223344556677885f5f5f5f5f5f 64 plan9 RCRL $0x1, 0(AX) -d120|11223344556677885f5f5f5f5f5f 32 intel shl dword ptr [eax], 0x1 -d120|11223344556677885f5f5f5f5f5f 32 plan9 SHLL $0x1, 0(AX) -d120|11223344556677885f5f5f5f5f5f 64 gnu shll (%rax) -d120|11223344556677885f5f5f5f5f5f 64 intel shl dword ptr [rax], 0x1 -d120|11223344556677885f5f5f5f5f5f 64 plan9 SHLL $0x1, 0(AX) -d128|11223344556677885f5f5f5f5f5f 32 intel shr dword ptr [eax], 0x1 -d128|11223344556677885f5f5f5f5f5f 32 plan9 SHRL $0x1, 0(AX) -d128|11223344556677885f5f5f5f5f5f 64 gnu shrl (%rax) -d128|11223344556677885f5f5f5f5f5f 64 intel shr dword ptr [rax], 0x1 -d128|11223344556677885f5f5f5f5f5f 64 plan9 SHRL $0x1, 0(AX) -d138|11223344556677885f5f5f5f5f5f 32 intel sar dword ptr [eax], 0x1 -d138|11223344556677885f5f5f5f5f5f 32 plan9 SARL $0x1, 0(AX) -d138|11223344556677885f5f5f5f5f5f 64 gnu sarl (%rax) -d138|11223344556677885f5f5f5f5f5f 64 intel sar dword ptr [rax], 0x1 -d138|11223344556677885f5f5f5f5f5f 64 plan9 SARL $0x1, 0(AX) -d200|11223344556677885f5f5f5f5f5f 32 intel rol byte ptr [eax], cl -d200|11223344556677885f5f5f5f5f5f 32 plan9 ROLB CL, 0(AX) -d200|11223344556677885f5f5f5f5f5f 64 gnu rolb %cl,(%rax) -d200|11223344556677885f5f5f5f5f5f 64 intel rol byte ptr [rax], cl -d200|11223344556677885f5f5f5f5f5f 64 plan9 ROLB CL, 0(AX) -d208|11223344556677885f5f5f5f5f5f 32 intel ror byte ptr [eax], cl -d208|11223344556677885f5f5f5f5f5f 32 plan9 RORB CL, 0(AX) -d208|11223344556677885f5f5f5f5f5f 64 gnu rorb %cl,(%rax) -d208|11223344556677885f5f5f5f5f5f 64 intel ror byte ptr [rax], cl -d208|11223344556677885f5f5f5f5f5f 64 plan9 RORB CL, 0(AX) -d211|223344556677885f5f5f5f5f5f5f 32 intel rcl byte ptr [ecx], cl -d211|223344556677885f5f5f5f5f5f5f 32 plan9 RCLB CL, 0(CX) -d211|223344556677885f5f5f5f5f5f5f 64 gnu rclb %cl,(%rcx) -d211|223344556677885f5f5f5f5f5f5f 64 intel rcl byte ptr [rcx], cl -d211|223344556677885f5f5f5f5f5f5f 64 plan9 RCLB CL, 0(CX) -d218|11223344556677885f5f5f5f5f5f 32 intel rcr byte ptr [eax], cl -d218|11223344556677885f5f5f5f5f5f 32 plan9 RCRB CL, 0(AX) -d218|11223344556677885f5f5f5f5f5f 64 gnu rcrb %cl,(%rax) -d218|11223344556677885f5f5f5f5f5f 64 intel rcr byte ptr [rax], cl -d218|11223344556677885f5f5f5f5f5f 64 plan9 RCRB CL, 0(AX) -d220|11223344556677885f5f5f5f5f5f 32 intel shl byte ptr [eax], cl -d220|11223344556677885f5f5f5f5f5f 32 plan9 SHLB CL, 0(AX) -d220|11223344556677885f5f5f5f5f5f 64 gnu shlb %cl,(%rax) -d220|11223344556677885f5f5f5f5f5f 64 intel shl byte ptr [rax], cl -d220|11223344556677885f5f5f5f5f5f 64 plan9 SHLB CL, 0(AX) -d228|11223344556677885f5f5f5f5f5f 32 intel shr byte ptr [eax], cl -d228|11223344556677885f5f5f5f5f5f 32 plan9 SHRB CL, 0(AX) -d228|11223344556677885f5f5f5f5f5f 64 gnu shrb %cl,(%rax) -d228|11223344556677885f5f5f5f5f5f 64 intel shr byte ptr [rax], cl -d228|11223344556677885f5f5f5f5f5f 64 plan9 SHRB CL, 0(AX) -d238|11223344556677885f5f5f5f5f5f 32 intel sar byte ptr [eax], cl -d238|11223344556677885f5f5f5f5f5f 32 plan9 SARB CL, 0(AX) -d238|11223344556677885f5f5f5f5f5f 64 gnu sarb %cl,(%rax) -d238|11223344556677885f5f5f5f5f5f 64 intel sar byte ptr [rax], cl -d238|11223344556677885f5f5f5f5f5f 64 plan9 SARB CL, 0(AX) -d300|11223344556677885f5f5f5f5f5f 32 intel rol dword ptr [eax], cl -d300|11223344556677885f5f5f5f5f5f 32 plan9 ROLL CL, 0(AX) -d300|11223344556677885f5f5f5f5f5f 64 gnu roll %cl,(%rax) -d300|11223344556677885f5f5f5f5f5f 64 intel rol dword ptr [rax], cl -d300|11223344556677885f5f5f5f5f5f 64 plan9 ROLL CL, 0(AX) -d308|11223344556677885f5f5f5f5f5f 32 intel ror dword ptr [eax], cl -d308|11223344556677885f5f5f5f5f5f 32 plan9 RORL CL, 0(AX) -d308|11223344556677885f5f5f5f5f5f 64 gnu rorl %cl,(%rax) -d308|11223344556677885f5f5f5f5f5f 64 intel ror dword ptr [rax], cl -d308|11223344556677885f5f5f5f5f5f 64 plan9 RORL CL, 0(AX) -d311|223344556677885f5f5f5f5f5f5f 32 intel rcl dword ptr [ecx], cl -d311|223344556677885f5f5f5f5f5f5f 32 plan9 RCLL CL, 0(CX) -d311|223344556677885f5f5f5f5f5f5f 64 gnu rcll %cl,(%rcx) -d311|223344556677885f5f5f5f5f5f5f 64 intel rcl dword ptr [rcx], cl -d311|223344556677885f5f5f5f5f5f5f 64 plan9 RCLL CL, 0(CX) -d318|11223344556677885f5f5f5f5f5f 32 intel rcr dword ptr [eax], cl -d318|11223344556677885f5f5f5f5f5f 32 plan9 RCRL CL, 0(AX) -d318|11223344556677885f5f5f5f5f5f 64 gnu rcrl %cl,(%rax) -d318|11223344556677885f5f5f5f5f5f 64 intel rcr dword ptr [rax], cl -d318|11223344556677885f5f5f5f5f5f 64 plan9 RCRL CL, 0(AX) -d320|11223344556677885f5f5f5f5f5f 32 intel shl dword ptr [eax], cl -d320|11223344556677885f5f5f5f5f5f 32 plan9 SHLL CL, 0(AX) -d320|11223344556677885f5f5f5f5f5f 64 gnu shll %cl,(%rax) -d320|11223344556677885f5f5f5f5f5f 64 intel shl dword ptr [rax], cl -d320|11223344556677885f5f5f5f5f5f 64 plan9 SHLL CL, 0(AX) -d328|11223344556677885f5f5f5f5f5f 32 intel shr dword ptr [eax], cl -d328|11223344556677885f5f5f5f5f5f 32 plan9 SHRL CL, 0(AX) -d328|11223344556677885f5f5f5f5f5f 64 gnu shrl %cl,(%rax) -d328|11223344556677885f5f5f5f5f5f 64 intel shr dword ptr [rax], cl -d328|11223344556677885f5f5f5f5f5f 64 plan9 SHRL CL, 0(AX) -d338|11223344556677885f5f5f5f5f5f 32 intel sar dword ptr [eax], cl -d338|11223344556677885f5f5f5f5f5f 32 plan9 SARL CL, 0(AX) -d338|11223344556677885f5f5f5f5f5f 64 gnu sarl %cl,(%rax) -d338|11223344556677885f5f5f5f5f5f 64 intel sar dword ptr [rax], cl -d338|11223344556677885f5f5f5f5f5f 64 plan9 SARL CL, 0(AX) -d511|223344556677885f5f5f5f5f5f5f 32 intel aad 0x11 -d511|223344556677885f5f5f5f5f5f5f 32 plan9 AAD $0x11 -d5|11223344556677885f5f5f5f5f5f5f 64 gnu error: unrecognized instruction -d5|11223344556677885f5f5f5f5f5f5f 64 intel error: unrecognized instruction -d5|11223344556677885f5f5f5f5f5f5f 64 plan9 error: unrecognized instruction -d800|11223344556677885f5f5f5f5f5f 32 intel fadd st0, dword ptr [eax] -d800|11223344556677885f5f5f5f5f5f 32 plan9 FADD 0(AX) -d800|11223344556677885f5f5f5f5f5f 64 gnu fadds (%rax) -d800|11223344556677885f5f5f5f5f5f 64 intel fadd st0, dword ptr [rax] -d800|11223344556677885f5f5f5f5f5f 64 plan9 FADD 0(AX) -d808|11223344556677885f5f5f5f5f5f 32 intel fmul st0, dword ptr [eax] -d808|11223344556677885f5f5f5f5f5f 32 plan9 FMUL 0(AX) -d808|11223344556677885f5f5f5f5f5f 64 gnu fmuls (%rax) -d808|11223344556677885f5f5f5f5f5f 64 intel fmul st0, dword ptr [rax] -d808|11223344556677885f5f5f5f5f5f 64 plan9 FMUL 0(AX) -d811|223344556677885f5f5f5f5f5f5f 32 intel fcom st0, dword ptr [ecx] -d811|223344556677885f5f5f5f5f5f5f 32 plan9 FCOM 0(CX) -d811|223344556677885f5f5f5f5f5f5f 64 gnu fcoms (%rcx) -d811|223344556677885f5f5f5f5f5f5f 64 intel fcom st0, dword ptr [rcx] -d811|223344556677885f5f5f5f5f5f5f 64 plan9 FCOM 0(CX) -d818|11223344556677885f5f5f5f5f5f 32 intel fcomp st0, dword ptr [eax] -d818|11223344556677885f5f5f5f5f5f 32 plan9 FCOMP 0(AX) -d818|11223344556677885f5f5f5f5f5f 64 gnu fcomps (%rax) -d818|11223344556677885f5f5f5f5f5f 64 intel fcomp st0, dword ptr [rax] -d818|11223344556677885f5f5f5f5f5f 64 plan9 FCOMP 0(AX) -d820|11223344556677885f5f5f5f5f5f 32 intel fsub st0, dword ptr [eax] -d820|11223344556677885f5f5f5f5f5f 32 plan9 FSUB 0(AX) -d820|11223344556677885f5f5f5f5f5f 64 gnu fsubs (%rax) -d820|11223344556677885f5f5f5f5f5f 64 intel fsub st0, dword ptr [rax] -d820|11223344556677885f5f5f5f5f5f 64 plan9 FSUB 0(AX) -d828|11223344556677885f5f5f5f5f5f 32 intel fsubr st0, dword ptr [eax] -d828|11223344556677885f5f5f5f5f5f 32 plan9 FSUBR 0(AX) -d828|11223344556677885f5f5f5f5f5f 64 gnu fsubrs (%rax) -d828|11223344556677885f5f5f5f5f5f 64 intel fsubr st0, dword ptr [rax] -d828|11223344556677885f5f5f5f5f5f 64 plan9 FSUBR 0(AX) -d830|11223344556677885f5f5f5f5f5f 32 intel fdiv st0, dword ptr [eax] -d830|11223344556677885f5f5f5f5f5f 32 plan9 FDIV 0(AX) -d830|11223344556677885f5f5f5f5f5f 64 gnu fdivs (%rax) -d830|11223344556677885f5f5f5f5f5f 64 intel fdiv st0, dword ptr [rax] -d830|11223344556677885f5f5f5f5f5f 64 plan9 FDIV 0(AX) -d838|11223344556677885f5f5f5f5f5f 32 intel fdivr st0, dword ptr [eax] -d838|11223344556677885f5f5f5f5f5f 32 plan9 FDIVR 0(AX) -d838|11223344556677885f5f5f5f5f5f 64 gnu fdivrs (%rax) -d838|11223344556677885f5f5f5f5f5f 64 intel fdivr st0, dword ptr [rax] -d838|11223344556677885f5f5f5f5f5f 64 plan9 FDIVR 0(AX) -d8c0|11223344556677885f5f5f5f5f5f 32 intel fadd st0, st0 -d8c0|11223344556677885f5f5f5f5f5f 32 plan9 FADD F0, F0 -d8c0|11223344556677885f5f5f5f5f5f 64 gnu fadd %st,%st -d8c0|11223344556677885f5f5f5f5f5f 64 intel fadd st0, st0 -d8c0|11223344556677885f5f5f5f5f5f 64 plan9 FADD F0, F0 -d8c8|11223344556677885f5f5f5f5f5f 32 intel fmul st0, st0 -d8c8|11223344556677885f5f5f5f5f5f 32 plan9 FMUL F0, F0 -d8c8|11223344556677885f5f5f5f5f5f 64 gnu fmul %st,%st -d8c8|11223344556677885f5f5f5f5f5f 64 intel fmul st0, st0 -d8c8|11223344556677885f5f5f5f5f5f 64 plan9 FMUL F0, F0 -d8d0|11223344556677885f5f5f5f5f5f 32 intel fcom st0, st0 -d8d0|11223344556677885f5f5f5f5f5f 32 plan9 FCOM F0 -d8d0|11223344556677885f5f5f5f5f5f 64 gnu fcom %st -d8d0|11223344556677885f5f5f5f5f5f 64 intel fcom st0, st0 -d8d0|11223344556677885f5f5f5f5f5f 64 plan9 FCOM F0 -d8d8|11223344556677885f5f5f5f5f5f 32 intel fcomp st0, st0 -d8d8|11223344556677885f5f5f5f5f5f 32 plan9 FCOMP F0 -d8d8|11223344556677885f5f5f5f5f5f 64 gnu fcomp %st -d8d8|11223344556677885f5f5f5f5f5f 64 intel fcomp st0, st0 -d8d8|11223344556677885f5f5f5f5f5f 64 plan9 FCOMP F0 -d8e0|11223344556677885f5f5f5f5f5f 32 intel fsub st0, st0 -d8e0|11223344556677885f5f5f5f5f5f 32 plan9 FSUB F0, F0 -d8e0|11223344556677885f5f5f5f5f5f 64 gnu fsub %st,%st -d8e0|11223344556677885f5f5f5f5f5f 64 intel fsub st0, st0 -d8e0|11223344556677885f5f5f5f5f5f 64 plan9 FSUB F0, F0 -d8e8|11223344556677885f5f5f5f5f5f 32 intel fsubr st0, st0 -d8e8|11223344556677885f5f5f5f5f5f 32 plan9 FSUBR F0, F0 -d8e8|11223344556677885f5f5f5f5f5f 64 gnu fsubr %st,%st -d8e8|11223344556677885f5f5f5f5f5f 64 intel fsubr st0, st0 -d8e8|11223344556677885f5f5f5f5f5f 64 plan9 FSUBR F0, F0 -d8f0|11223344556677885f5f5f5f5f5f 32 intel fdiv st0, st0 -d8f0|11223344556677885f5f5f5f5f5f 32 plan9 FDIV F0, F0 -d8f0|11223344556677885f5f5f5f5f5f 64 gnu fdiv %st,%st -d8f0|11223344556677885f5f5f5f5f5f 64 intel fdiv st0, st0 -d8f0|11223344556677885f5f5f5f5f5f 64 plan9 FDIV F0, F0 -d8f8|11223344556677885f5f5f5f5f5f 32 intel fdivr st0, st0 -d8f8|11223344556677885f5f5f5f5f5f 32 plan9 FDIVR F0, F0 -d8f8|11223344556677885f5f5f5f5f5f 64 gnu fdivr %st,%st -d8f8|11223344556677885f5f5f5f5f5f 64 intel fdivr st0, st0 -d8f8|11223344556677885f5f5f5f5f5f 64 plan9 FDIVR F0, F0 -d900|11223344556677885f5f5f5f5f5f 32 intel fld st0, dword ptr [eax] -d900|11223344556677885f5f5f5f5f5f 32 plan9 FLD 0(AX) -d900|11223344556677885f5f5f5f5f5f 64 gnu flds (%rax) -d900|11223344556677885f5f5f5f5f5f 64 intel fld st0, dword ptr [rax] -d900|11223344556677885f5f5f5f5f5f 64 plan9 FLD 0(AX) -d911|223344556677885f5f5f5f5f5f5f 32 intel fst dword ptr [ecx], st0 -d911|223344556677885f5f5f5f5f5f5f 32 plan9 FST 0(CX) -d911|223344556677885f5f5f5f5f5f5f 64 gnu fsts (%rcx) -d911|223344556677885f5f5f5f5f5f5f 64 intel fst dword ptr [rcx], st0 -d911|223344556677885f5f5f5f5f5f5f 64 plan9 FST 0(CX) -d918|11223344556677885f5f5f5f5f5f 32 intel fstp dword ptr [eax], st0 -d918|11223344556677885f5f5f5f5f5f 32 plan9 FSTP 0(AX) -d918|11223344556677885f5f5f5f5f5f 64 gnu fstps (%rax) -d918|11223344556677885f5f5f5f5f5f 64 intel fstp dword ptr [rax], st0 -d918|11223344556677885f5f5f5f5f5f 64 plan9 FSTP 0(AX) -d928|11223344556677885f5f5f5f5f5f 32 intel fldcw word ptr [eax] -d928|11223344556677885f5f5f5f5f5f 32 plan9 FLDCW 0(AX) -d928|11223344556677885f5f5f5f5f5f 64 gnu fldcw (%rax) -d928|11223344556677885f5f5f5f5f5f 64 intel fldcw word ptr [rax] -d928|11223344556677885f5f5f5f5f5f 64 plan9 FLDCW 0(AX) -d930|11223344556677885f5f5f5f5f5f 32 intel fnstenv ptr [eax] -d930|11223344556677885f5f5f5f5f5f 32 plan9 FNSTENV 0(AX) -d930|11223344556677885f5f5f5f5f5f 64 gnu fnstenv (%rax) -d930|11223344556677885f5f5f5f5f5f 64 intel fnstenv ptr [rax] -d930|11223344556677885f5f5f5f5f5f 64 plan9 FNSTENV 0(AX) -d938|11223344556677885f5f5f5f5f5f 32 intel fnstcw word ptr [eax] -d938|11223344556677885f5f5f5f5f5f 32 plan9 FNSTCW 0(AX) -d938|11223344556677885f5f5f5f5f5f 64 gnu fnstcw (%rax) -d938|11223344556677885f5f5f5f5f5f 64 intel fnstcw word ptr [rax] -d938|11223344556677885f5f5f5f5f5f 64 plan9 FNSTCW 0(AX) -d9c0|11223344556677885f5f5f5f5f5f 32 intel fld st0, st0 -d9c0|11223344556677885f5f5f5f5f5f 32 plan9 FLD F0 -d9c0|11223344556677885f5f5f5f5f5f 64 gnu fld %st -d9c0|11223344556677885f5f5f5f5f5f 64 intel fld st0, st0 -d9c0|11223344556677885f5f5f5f5f5f 64 plan9 FLD F0 -d9c8|11223344556677885f5f5f5f5f5f 32 intel fxch st0, st0 -d9c8|11223344556677885f5f5f5f5f5f 32 plan9 FXCH F0 -d9c8|11223344556677885f5f5f5f5f5f 64 gnu fxch %st -d9c8|11223344556677885f5f5f5f5f5f 64 intel fxch st0, st0 -d9c8|11223344556677885f5f5f5f5f5f 64 plan9 FXCH F0 -d9d0|11223344556677885f5f5f5f5f5f 32 intel fnop -d9d0|11223344556677885f5f5f5f5f5f 32 plan9 FNOP -d9d0|11223344556677885f5f5f5f5f5f 64 gnu fnop -d9d0|11223344556677885f5f5f5f5f5f 64 intel fnop -d9d0|11223344556677885f5f5f5f5f5f 64 plan9 FNOP -d9e0|11223344556677885f5f5f5f5f5f 32 intel fchs st0 -d9e0|11223344556677885f5f5f5f5f5f 32 plan9 FCHS -d9e0|11223344556677885f5f5f5f5f5f 64 gnu fchs -d9e0|11223344556677885f5f5f5f5f5f 64 intel fchs st0 -d9e0|11223344556677885f5f5f5f5f5f 64 plan9 FCHS -d9e1|11223344556677885f5f5f5f5f5f 32 intel fabs st0 -d9e1|11223344556677885f5f5f5f5f5f 32 plan9 FABS -d9e1|11223344556677885f5f5f5f5f5f 64 gnu fabs -d9e1|11223344556677885f5f5f5f5f5f 64 intel fabs st0 -d9e1|11223344556677885f5f5f5f5f5f 64 plan9 FABS -d9e4|11223344556677885f5f5f5f5f5f 32 intel ftst st0 -d9e4|11223344556677885f5f5f5f5f5f 32 plan9 FTST -d9e4|11223344556677885f5f5f5f5f5f 64 gnu ftst -d9e4|11223344556677885f5f5f5f5f5f 64 intel ftst st0 -d9e4|11223344556677885f5f5f5f5f5f 64 plan9 FTST -d9e5|11223344556677885f5f5f5f5f5f 32 intel fxam st0 -d9e5|11223344556677885f5f5f5f5f5f 32 plan9 FXAM -d9e5|11223344556677885f5f5f5f5f5f 64 gnu fxam -d9e5|11223344556677885f5f5f5f5f5f 64 intel fxam st0 -d9e5|11223344556677885f5f5f5f5f5f 64 plan9 FXAM -d9e8|11223344556677885f5f5f5f5f5f 32 intel fld1 st0 -d9e8|11223344556677885f5f5f5f5f5f 32 plan9 FLD1 -d9e8|11223344556677885f5f5f5f5f5f 64 gnu fld1 -d9e8|11223344556677885f5f5f5f5f5f 64 intel fld1 st0 -d9e8|11223344556677885f5f5f5f5f5f 64 plan9 FLD1 -d9e9|11223344556677885f5f5f5f5f5f 32 intel fldl2t st0 -d9e9|11223344556677885f5f5f5f5f5f 32 plan9 FLDL2T -d9e9|11223344556677885f5f5f5f5f5f 64 gnu fldl2t -d9e9|11223344556677885f5f5f5f5f5f 64 intel fldl2t st0 -d9e9|11223344556677885f5f5f5f5f5f 64 plan9 FLDL2T -d9ea|11223344556677885f5f5f5f5f5f 32 intel fldl2e st0 -d9ea|11223344556677885f5f5f5f5f5f 32 plan9 FLDL2E -d9ea|11223344556677885f5f5f5f5f5f 64 gnu fldl2e -d9ea|11223344556677885f5f5f5f5f5f 64 intel fldl2e st0 -d9ea|11223344556677885f5f5f5f5f5f 64 plan9 FLDL2E -d9eb|11223344556677885f5f5f5f5f5f 32 intel fldpi st0 -d9eb|11223344556677885f5f5f5f5f5f 32 plan9 FLDPI -d9eb|11223344556677885f5f5f5f5f5f 64 gnu fldpi -d9eb|11223344556677885f5f5f5f5f5f 64 intel fldpi st0 -d9eb|11223344556677885f5f5f5f5f5f 64 plan9 FLDPI -d9ec|11223344556677885f5f5f5f5f5f 32 intel fldlg2 st0 -d9ec|11223344556677885f5f5f5f5f5f 32 plan9 FLDLG2 -d9ec|11223344556677885f5f5f5f5f5f 64 gnu fldlg2 -d9ec|11223344556677885f5f5f5f5f5f 64 intel fldlg2 st0 -d9ec|11223344556677885f5f5f5f5f5f 64 plan9 FLDLG2 -d9f0|11223344556677885f5f5f5f5f5f 32 intel f2xm1 st0 -d9f0|11223344556677885f5f5f5f5f5f 32 plan9 F2XM1 -d9f0|11223344556677885f5f5f5f5f5f 64 gnu f2xm1 -d9f0|11223344556677885f5f5f5f5f5f 64 intel f2xm1 st0 -d9f0|11223344556677885f5f5f5f5f5f 64 plan9 F2XM1 -d9f1|11223344556677885f5f5f5f5f5f 32 intel fyl2x st0, st1 -d9f1|11223344556677885f5f5f5f5f5f 32 plan9 FYL2X -d9f1|11223344556677885f5f5f5f5f5f 64 gnu fyl2x -d9f1|11223344556677885f5f5f5f5f5f 64 intel fyl2x st0, st1 -d9f1|11223344556677885f5f5f5f5f5f 64 plan9 FYL2X -d9f2|11223344556677885f5f5f5f5f5f 32 intel fptan st0, st1 -d9f2|11223344556677885f5f5f5f5f5f 32 plan9 FPTAN -d9f2|11223344556677885f5f5f5f5f5f 64 gnu fptan -d9f2|11223344556677885f5f5f5f5f5f 64 intel fptan st0, st1 -d9f2|11223344556677885f5f5f5f5f5f 64 plan9 FPTAN -d9f3|11223344556677885f5f5f5f5f5f 32 intel fpatan st0, st1 -d9f3|11223344556677885f5f5f5f5f5f 32 plan9 FPATAN -d9f3|11223344556677885f5f5f5f5f5f 64 gnu fpatan -d9f3|11223344556677885f5f5f5f5f5f 64 intel fpatan st0, st1 -d9f3|11223344556677885f5f5f5f5f5f 64 plan9 FPATAN -d9f4|11223344556677885f5f5f5f5f5f 32 intel fxtract st0, st1 -d9f4|11223344556677885f5f5f5f5f5f 32 plan9 FXTRACT -d9f4|11223344556677885f5f5f5f5f5f 64 gnu fxtract -d9f4|11223344556677885f5f5f5f5f5f 64 intel fxtract st0, st1 -d9f4|11223344556677885f5f5f5f5f5f 64 plan9 FXTRACT -d9f5|11223344556677885f5f5f5f5f5f 32 intel fprem1 st0, st1 -d9f5|11223344556677885f5f5f5f5f5f 32 plan9 FPREM1 -d9f5|11223344556677885f5f5f5f5f5f 64 gnu fprem1 -d9f5|11223344556677885f5f5f5f5f5f 64 intel fprem1 st0, st1 -d9f5|11223344556677885f5f5f5f5f5f 64 plan9 FPREM1 -d9f6|11223344556677885f5f5f5f5f5f 32 intel fdecstp -d9f6|11223344556677885f5f5f5f5f5f 32 plan9 FDECSTP -d9f6|11223344556677885f5f5f5f5f5f 64 gnu fdecstp -d9f6|11223344556677885f5f5f5f5f5f 64 intel fdecstp -d9f6|11223344556677885f5f5f5f5f5f 64 plan9 FDECSTP -d9f7|11223344556677885f5f5f5f5f5f 32 intel fincstp -d9f7|11223344556677885f5f5f5f5f5f 32 plan9 FINCSTP -d9f7|11223344556677885f5f5f5f5f5f 64 gnu fincstp -d9f7|11223344556677885f5f5f5f5f5f 64 intel fincstp -d9f7|11223344556677885f5f5f5f5f5f 64 plan9 FINCSTP -d9f8|11223344556677885f5f5f5f5f5f 32 intel fprem st0, st1 -d9f8|11223344556677885f5f5f5f5f5f 32 plan9 FPREM -d9f8|11223344556677885f5f5f5f5f5f 64 gnu fprem -d9f8|11223344556677885f5f5f5f5f5f 64 intel fprem st0, st1 -d9f8|11223344556677885f5f5f5f5f5f 64 plan9 FPREM -d9f9|11223344556677885f5f5f5f5f5f 32 intel fyl2xp1 st0, st1 -d9f9|11223344556677885f5f5f5f5f5f 32 plan9 FYL2XP1 -d9f9|11223344556677885f5f5f5f5f5f 64 gnu fyl2xp1 -d9f9|11223344556677885f5f5f5f5f5f 64 intel fyl2xp1 st0, st1 -d9f9|11223344556677885f5f5f5f5f5f 64 plan9 FYL2XP1 -d9fa|11223344556677885f5f5f5f5f5f 32 intel fsqrt st0 -d9fa|11223344556677885f5f5f5f5f5f 32 plan9 FSQRT -d9fa|11223344556677885f5f5f5f5f5f 64 gnu fsqrt -d9fa|11223344556677885f5f5f5f5f5f 64 intel fsqrt st0 -d9fa|11223344556677885f5f5f5f5f5f 64 plan9 FSQRT -d9fb|11223344556677885f5f5f5f5f5f 32 intel fsincos st0, st1 -d9fb|11223344556677885f5f5f5f5f5f 32 plan9 FSINCOS -d9fb|11223344556677885f5f5f5f5f5f 64 gnu fsincos -d9fb|11223344556677885f5f5f5f5f5f 64 intel fsincos st0, st1 -d9fb|11223344556677885f5f5f5f5f5f 64 plan9 FSINCOS -d9fc|11223344556677885f5f5f5f5f5f 32 intel frndint st0 -d9fc|11223344556677885f5f5f5f5f5f 32 plan9 FRNDINT -d9fc|11223344556677885f5f5f5f5f5f 64 gnu frndint -d9fc|11223344556677885f5f5f5f5f5f 64 intel frndint st0 -d9fc|11223344556677885f5f5f5f5f5f 64 plan9 FRNDINT -d9fd|11223344556677885f5f5f5f5f5f 32 intel fscale st0, st1 -d9fd|11223344556677885f5f5f5f5f5f 32 plan9 FSCALE -d9fd|11223344556677885f5f5f5f5f5f 64 gnu fscale -d9fd|11223344556677885f5f5f5f5f5f 64 intel fscale st0, st1 -d9fd|11223344556677885f5f5f5f5f5f 64 plan9 FSCALE -d9fe|11223344556677885f5f5f5f5f5f 32 intel fsin st0 -d9fe|11223344556677885f5f5f5f5f5f 32 plan9 FSIN -d9fe|11223344556677885f5f5f5f5f5f 64 gnu fsin -d9fe|11223344556677885f5f5f5f5f5f 64 intel fsin st0 -d9fe|11223344556677885f5f5f5f5f5f 64 plan9 FSIN -d9ff|11223344556677885f5f5f5f5f5f 32 intel fcos st0 -d9ff|11223344556677885f5f5f5f5f5f 32 plan9 FCOS -d9ff|11223344556677885f5f5f5f5f5f 64 gnu fcos -d9ff|11223344556677885f5f5f5f5f5f 64 intel fcos st0 -d9ff|11223344556677885f5f5f5f5f5f 64 plan9 FCOS -da00|11223344556677885f5f5f5f5f5f 32 intel fiadd st0, dword ptr [eax] -da00|11223344556677885f5f5f5f5f5f 32 plan9 FIADD 0(AX) -da00|11223344556677885f5f5f5f5f5f 64 gnu fiaddl (%rax) -da00|11223344556677885f5f5f5f5f5f 64 intel fiadd st0, dword ptr [rax] -da00|11223344556677885f5f5f5f5f5f 64 plan9 FIADD 0(AX) -da08|11223344556677885f5f5f5f5f5f 32 intel fimul st0, dword ptr [eax] -da08|11223344556677885f5f5f5f5f5f 32 plan9 FIMUL 0(AX) -da08|11223344556677885f5f5f5f5f5f 64 gnu fimull (%rax) -da08|11223344556677885f5f5f5f5f5f 64 intel fimul st0, dword ptr [rax] -da08|11223344556677885f5f5f5f5f5f 64 plan9 FIMUL 0(AX) -da11|223344556677885f5f5f5f5f5f5f 32 intel ficom st0, dword ptr [ecx] -da11|223344556677885f5f5f5f5f5f5f 32 plan9 FICOM 0(CX) -da11|223344556677885f5f5f5f5f5f5f 64 gnu ficoml (%rcx) -da11|223344556677885f5f5f5f5f5f5f 64 intel ficom st0, dword ptr [rcx] -da11|223344556677885f5f5f5f5f5f5f 64 plan9 FICOM 0(CX) -da18|11223344556677885f5f5f5f5f5f 32 intel ficomp st0, dword ptr [eax] -da18|11223344556677885f5f5f5f5f5f 32 plan9 FICOMP 0(AX) -da18|11223344556677885f5f5f5f5f5f 64 gnu ficompl (%rax) -da18|11223344556677885f5f5f5f5f5f 64 intel ficomp st0, dword ptr [rax] -da18|11223344556677885f5f5f5f5f5f 64 plan9 FICOMP 0(AX) -da20|11223344556677885f5f5f5f5f5f 32 intel fisub st0, dword ptr [eax] -da20|11223344556677885f5f5f5f5f5f 32 plan9 FISUB 0(AX) -da20|11223344556677885f5f5f5f5f5f 64 gnu fisubl (%rax) -da20|11223344556677885f5f5f5f5f5f 64 intel fisub st0, dword ptr [rax] -da20|11223344556677885f5f5f5f5f5f 64 plan9 FISUB 0(AX) -da28|11223344556677885f5f5f5f5f5f 32 intel fisubr st0, dword ptr [eax] -da28|11223344556677885f5f5f5f5f5f 32 plan9 FISUBR 0(AX) -da28|11223344556677885f5f5f5f5f5f 64 gnu fisubrl (%rax) -da28|11223344556677885f5f5f5f5f5f 64 intel fisubr st0, dword ptr [rax] -da28|11223344556677885f5f5f5f5f5f 64 plan9 FISUBR 0(AX) -da30|11223344556677885f5f5f5f5f5f 32 intel fidiv st0, dword ptr [eax] -da30|11223344556677885f5f5f5f5f5f 32 plan9 FIDIV 0(AX) -da30|11223344556677885f5f5f5f5f5f 64 gnu fidivl (%rax) -da30|11223344556677885f5f5f5f5f5f 64 intel fidiv st0, dword ptr [rax] -da30|11223344556677885f5f5f5f5f5f 64 plan9 FIDIV 0(AX) -da38|11223344556677885f5f5f5f5f5f 32 intel fidivr st0, dword ptr [eax] -da38|11223344556677885f5f5f5f5f5f 32 plan9 FIDIVR 0(AX) -da38|11223344556677885f5f5f5f5f5f 64 gnu fidivrl (%rax) -da38|11223344556677885f5f5f5f5f5f 64 intel fidivr st0, dword ptr [rax] -da38|11223344556677885f5f5f5f5f5f 64 plan9 FIDIVR 0(AX) -dac0|11223344556677885f5f5f5f5f5f 32 intel fcmovb st0, st0 -dac0|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVB F0, F0 -dac0|11223344556677885f5f5f5f5f5f 64 gnu fcmovb %st,%st -dac0|11223344556677885f5f5f5f5f5f 64 intel fcmovb st0, st0 -dac0|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVB F0, F0 -dac8|11223344556677885f5f5f5f5f5f 32 intel fcmove st0, st0 -dac8|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVE F0, F0 -dac8|11223344556677885f5f5f5f5f5f 64 gnu fcmove %st,%st -dac8|11223344556677885f5f5f5f5f5f 64 intel fcmove st0, st0 -dac8|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVE F0, F0 -dad0|11223344556677885f5f5f5f5f5f 32 intel fcmovbe st0, st0 -dad0|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVBE F0, F0 -dad0|11223344556677885f5f5f5f5f5f 64 gnu fcmovbe %st,%st -dad0|11223344556677885f5f5f5f5f5f 64 intel fcmovbe st0, st0 -dad0|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVBE F0, F0 -dad8|11223344556677885f5f5f5f5f5f 32 intel fcmovu st0, st0 -dad8|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVU F0, F0 -dad8|11223344556677885f5f5f5f5f5f 64 gnu fcmovu %st,%st -dad8|11223344556677885f5f5f5f5f5f 64 intel fcmovu st0, st0 -dad8|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVU F0, F0 -dae9|11223344556677885f5f5f5f5f5f 32 intel fucompp st0, st1 -dae9|11223344556677885f5f5f5f5f5f 32 plan9 FUCOMPP -dae9|11223344556677885f5f5f5f5f5f 64 gnu fucompp -dae9|11223344556677885f5f5f5f5f5f 64 intel fucompp st0, st1 -dae9|11223344556677885f5f5f5f5f5f 64 plan9 FUCOMPP -db00|11223344556677885f5f5f5f5f5f 32 intel fild st0, dword ptr [eax] -db00|11223344556677885f5f5f5f5f5f 32 plan9 FILD 0(AX) -db00|11223344556677885f5f5f5f5f5f 64 gnu fildl (%rax) -db00|11223344556677885f5f5f5f5f5f 64 intel fild st0, dword ptr [rax] -db00|11223344556677885f5f5f5f5f5f 64 plan9 FILD 0(AX) -db08|11223344556677885f5f5f5f5f5f 32 intel fisttp dword ptr [eax], st0 -db08|11223344556677885f5f5f5f5f5f 32 plan9 FISTTP 0(AX) -db08|11223344556677885f5f5f5f5f5f 64 gnu fisttpl (%rax) -db08|11223344556677885f5f5f5f5f5f 64 intel fisttp dword ptr [rax], st0 -db08|11223344556677885f5f5f5f5f5f 64 plan9 FISTTP 0(AX) -db11|223344556677885f5f5f5f5f5f5f 32 intel fist dword ptr [ecx], st0 -db11|223344556677885f5f5f5f5f5f5f 32 plan9 FIST 0(CX) -db11|223344556677885f5f5f5f5f5f5f 64 gnu fistl (%rcx) -db11|223344556677885f5f5f5f5f5f5f 64 intel fist dword ptr [rcx], st0 -db11|223344556677885f5f5f5f5f5f5f 64 plan9 FIST 0(CX) -db18|11223344556677885f5f5f5f5f5f 32 intel fistp dword ptr [eax], st0 -db18|11223344556677885f5f5f5f5f5f 32 plan9 FISTP 0(AX) -db18|11223344556677885f5f5f5f5f5f 64 gnu fistpl (%rax) -db18|11223344556677885f5f5f5f5f5f 64 intel fistp dword ptr [rax], st0 -db18|11223344556677885f5f5f5f5f5f 64 plan9 FISTP 0(AX) -db28|11223344556677885f5f5f5f5f5f 32 intel fld st0, ptr [eax] -db28|11223344556677885f5f5f5f5f5f 32 plan9 FLD 0(AX) -db28|11223344556677885f5f5f5f5f5f 64 gnu fldt (%rax) -db28|11223344556677885f5f5f5f5f5f 64 intel fld st0, ptr [rax] -db28|11223344556677885f5f5f5f5f5f 64 plan9 FLD 0(AX) -db38|11223344556677885f5f5f5f5f5f 32 intel fstp ptr [eax], st0 -db38|11223344556677885f5f5f5f5f5f 32 plan9 FSTP 0(AX) -db38|11223344556677885f5f5f5f5f5f 64 gnu fstpt (%rax) -db38|11223344556677885f5f5f5f5f5f 64 intel fstp ptr [rax], st0 -db38|11223344556677885f5f5f5f5f5f 64 plan9 FSTP 0(AX) -dbc0|11223344556677885f5f5f5f5f5f 32 intel fcmovnb st0, st0 -dbc0|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVNB F0, F0 -dbc0|11223344556677885f5f5f5f5f5f 64 gnu fcmovnb %st,%st -dbc0|11223344556677885f5f5f5f5f5f 64 intel fcmovnb st0, st0 -dbc0|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVNB F0, F0 -dbc8|11223344556677885f5f5f5f5f5f 32 intel fcmovne st0, st0 -dbc8|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVNE F0, F0 -dbc8|11223344556677885f5f5f5f5f5f 64 gnu fcmovne %st,%st -dbc8|11223344556677885f5f5f5f5f5f 64 intel fcmovne st0, st0 -dbc8|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVNE F0, F0 -dbd0|11223344556677885f5f5f5f5f5f 32 intel fcmovnbe st0, st0 -dbd0|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVNBE F0, F0 -dbd0|11223344556677885f5f5f5f5f5f 64 gnu fcmovnbe %st,%st -dbd0|11223344556677885f5f5f5f5f5f 64 intel fcmovnbe st0, st0 -dbd0|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVNBE F0, F0 -dbd8|11223344556677885f5f5f5f5f5f 32 intel fcmovnu st0, st0 -dbd8|11223344556677885f5f5f5f5f5f 32 plan9 FCMOVNU F0, F0 -dbd8|11223344556677885f5f5f5f5f5f 64 gnu fcmovnu %st,%st -dbd8|11223344556677885f5f5f5f5f5f 64 intel fcmovnu st0, st0 -dbd8|11223344556677885f5f5f5f5f5f 64 plan9 FCMOVNU F0, F0 -dbe2|11223344556677885f5f5f5f5f5f 32 intel fnclex -dbe2|11223344556677885f5f5f5f5f5f 32 plan9 FNCLEX -dbe2|11223344556677885f5f5f5f5f5f 64 gnu fnclex -dbe2|11223344556677885f5f5f5f5f5f 64 intel fnclex -dbe2|11223344556677885f5f5f5f5f5f 64 plan9 FNCLEX -dbe3|11223344556677885f5f5f5f5f5f 32 intel fninit -dbe3|11223344556677885f5f5f5f5f5f 32 plan9 FNINIT -dbe3|11223344556677885f5f5f5f5f5f 64 gnu fninit -dbe3|11223344556677885f5f5f5f5f5f 64 intel fninit -dbe3|11223344556677885f5f5f5f5f5f 64 plan9 FNINIT -dbe8|11223344556677885f5f5f5f5f5f 32 intel fucomi st0, st0 -dbe8|11223344556677885f5f5f5f5f5f 32 plan9 FUCOMI F0, F0 -dbe8|11223344556677885f5f5f5f5f5f 64 gnu fucomi %st,%st -dbe8|11223344556677885f5f5f5f5f5f 64 intel fucomi st0, st0 -dbe8|11223344556677885f5f5f5f5f5f 64 plan9 FUCOMI F0, F0 -dbf0|11223344556677885f5f5f5f5f5f 32 intel fcomi st0, st0 -dbf0|11223344556677885f5f5f5f5f5f 32 plan9 FCOMI F0, F0 -dbf0|11223344556677885f5f5f5f5f5f 64 gnu fcomi %st,%st -dbf0|11223344556677885f5f5f5f5f5f 64 intel fcomi st0, st0 -dbf0|11223344556677885f5f5f5f5f5f 64 plan9 FCOMI F0, F0 -dc00|11223344556677885f5f5f5f5f5f 32 intel fadd st0, qword ptr [eax] -dc00|11223344556677885f5f5f5f5f5f 32 plan9 FADD 0(AX) -dc00|11223344556677885f5f5f5f5f5f 64 gnu faddl (%rax) -dc00|11223344556677885f5f5f5f5f5f 64 intel fadd st0, qword ptr [rax] -dc00|11223344556677885f5f5f5f5f5f 64 plan9 FADD 0(AX) -dc08|11223344556677885f5f5f5f5f5f 32 intel fmul st0, qword ptr [eax] -dc08|11223344556677885f5f5f5f5f5f 32 plan9 FMUL 0(AX) -dc08|11223344556677885f5f5f5f5f5f 64 gnu fmull (%rax) -dc08|11223344556677885f5f5f5f5f5f 64 intel fmul st0, qword ptr [rax] -dc08|11223344556677885f5f5f5f5f5f 64 plan9 FMUL 0(AX) -dc11|223344556677885f5f5f5f5f5f5f 32 intel fcom st0, qword ptr [ecx] -dc11|223344556677885f5f5f5f5f5f5f 32 plan9 FCOM 0(CX) -dc11|223344556677885f5f5f5f5f5f5f 64 gnu fcoml (%rcx) -dc11|223344556677885f5f5f5f5f5f5f 64 intel fcom st0, qword ptr [rcx] -dc11|223344556677885f5f5f5f5f5f5f 64 plan9 FCOM 0(CX) -dc18|11223344556677885f5f5f5f5f5f 32 intel fcomp st0, qword ptr [eax] -dc18|11223344556677885f5f5f5f5f5f 32 plan9 FCOMP 0(AX) -dc18|11223344556677885f5f5f5f5f5f 64 gnu fcompl (%rax) -dc18|11223344556677885f5f5f5f5f5f 64 intel fcomp st0, qword ptr [rax] -dc18|11223344556677885f5f5f5f5f5f 64 plan9 FCOMP 0(AX) -dc20|11223344556677885f5f5f5f5f5f 32 intel fsub st0, qword ptr [eax] -dc20|11223344556677885f5f5f5f5f5f 32 plan9 FSUB 0(AX) -dc20|11223344556677885f5f5f5f5f5f 64 gnu fsubl (%rax) -dc20|11223344556677885f5f5f5f5f5f 64 intel fsub st0, qword ptr [rax] -dc20|11223344556677885f5f5f5f5f5f 64 plan9 FSUB 0(AX) -dc28|11223344556677885f5f5f5f5f5f 32 intel fsubr st0, qword ptr [eax] -dc28|11223344556677885f5f5f5f5f5f 32 plan9 FSUBR 0(AX) -dc28|11223344556677885f5f5f5f5f5f 64 gnu fsubrl (%rax) -dc28|11223344556677885f5f5f5f5f5f 64 intel fsubr st0, qword ptr [rax] -dc28|11223344556677885f5f5f5f5f5f 64 plan9 FSUBR 0(AX) -dc30|11223344556677885f5f5f5f5f5f 32 intel fdiv st0, qword ptr [eax] -dc30|11223344556677885f5f5f5f5f5f 32 plan9 FDIV 0(AX) -dc30|11223344556677885f5f5f5f5f5f 64 gnu fdivl (%rax) -dc30|11223344556677885f5f5f5f5f5f 64 intel fdiv st0, qword ptr [rax] -dc30|11223344556677885f5f5f5f5f5f 64 plan9 FDIV 0(AX) -dc38|11223344556677885f5f5f5f5f5f 32 intel fdivr st0, qword ptr [eax] -dc38|11223344556677885f5f5f5f5f5f 32 plan9 FDIVR 0(AX) -dc38|11223344556677885f5f5f5f5f5f 64 gnu fdivrl (%rax) -dc38|11223344556677885f5f5f5f5f5f 64 intel fdivr st0, qword ptr [rax] -dc38|11223344556677885f5f5f5f5f5f 64 plan9 FDIVR 0(AX) -dcc0|11223344556677885f5f5f5f5f5f 32 intel fadd st0, st0 -dcc0|11223344556677885f5f5f5f5f5f 32 plan9 FADD F0, F0 -dcc0|11223344556677885f5f5f5f5f5f 64 gnu fadd %st,%st -dcc0|11223344556677885f5f5f5f5f5f 64 intel fadd st0, st0 -dcc0|11223344556677885f5f5f5f5f5f 64 plan9 FADD F0, F0 -dcc8|11223344556677885f5f5f5f5f5f 32 intel fmul st0, st0 -dcc8|11223344556677885f5f5f5f5f5f 32 plan9 FMUL F0, F0 -dcc8|11223344556677885f5f5f5f5f5f 64 gnu fmul %st,%st -dcc8|11223344556677885f5f5f5f5f5f 64 intel fmul st0, st0 -dcc8|11223344556677885f5f5f5f5f5f 64 plan9 FMUL F0, F0 -dce0|11223344556677885f5f5f5f5f5f 32 intel fsubr st0, st0 -dce0|11223344556677885f5f5f5f5f5f 32 plan9 FSUBR F0, F0 -dce0|11223344556677885f5f5f5f5f5f 64 gnu fsub %st,%st -dce0|11223344556677885f5f5f5f5f5f 64 intel fsubr st0, st0 -dce0|11223344556677885f5f5f5f5f5f 64 plan9 FSUBR F0, F0 -dce8|11223344556677885f5f5f5f5f5f 32 intel fsub st0, st0 -dce8|11223344556677885f5f5f5f5f5f 32 plan9 FSUB F0, F0 -dce8|11223344556677885f5f5f5f5f5f 64 gnu fsubr %st,%st -dce8|11223344556677885f5f5f5f5f5f 64 intel fsub st0, st0 -dce8|11223344556677885f5f5f5f5f5f 64 plan9 FSUB F0, F0 -dcf0|11223344556677885f5f5f5f5f5f 32 intel fdivr st0, st0 -dcf0|11223344556677885f5f5f5f5f5f 32 plan9 FDIVR F0, F0 -dcf0|11223344556677885f5f5f5f5f5f 64 gnu fdiv %st,%st -dcf0|11223344556677885f5f5f5f5f5f 64 intel fdivr st0, st0 -dcf0|11223344556677885f5f5f5f5f5f 64 plan9 FDIVR F0, F0 -dcf8|11223344556677885f5f5f5f5f5f 32 intel fdiv st0, st0 -dcf8|11223344556677885f5f5f5f5f5f 32 plan9 FDIV F0, F0 -dcf8|11223344556677885f5f5f5f5f5f 64 gnu fdivr %st,%st -dcf8|11223344556677885f5f5f5f5f5f 64 intel fdiv st0, st0 -dcf8|11223344556677885f5f5f5f5f5f 64 plan9 FDIV F0, F0 -dd00|11223344556677885f5f5f5f5f5f 32 intel fld st0, qword ptr [eax] -dd00|11223344556677885f5f5f5f5f5f 32 plan9 FLD 0(AX) -dd00|11223344556677885f5f5f5f5f5f 64 gnu fldl (%rax) -dd00|11223344556677885f5f5f5f5f5f 64 intel fld st0, qword ptr [rax] -dd00|11223344556677885f5f5f5f5f5f 64 plan9 FLD 0(AX) -dd08|11223344556677885f5f5f5f5f5f 32 intel fisttp qword ptr [eax], st0 -dd08|11223344556677885f5f5f5f5f5f 32 plan9 FISTTP 0(AX) -dd08|11223344556677885f5f5f5f5f5f 64 gnu fisttpll (%rax) -dd08|11223344556677885f5f5f5f5f5f 64 intel fisttp qword ptr [rax], st0 -dd08|11223344556677885f5f5f5f5f5f 64 plan9 FISTTP 0(AX) -dd11|223344556677885f5f5f5f5f5f5f 32 intel fst qword ptr [ecx], st0 -dd11|223344556677885f5f5f5f5f5f5f 32 plan9 FST 0(CX) -dd11|223344556677885f5f5f5f5f5f5f 64 gnu fstl (%rcx) -dd11|223344556677885f5f5f5f5f5f5f 64 intel fst qword ptr [rcx], st0 -dd11|223344556677885f5f5f5f5f5f5f 64 plan9 FST 0(CX) -dd18|11223344556677885f5f5f5f5f5f 32 intel fstp qword ptr [eax], st0 -dd18|11223344556677885f5f5f5f5f5f 32 plan9 FSTP 0(AX) -dd18|11223344556677885f5f5f5f5f5f 64 gnu fstpl (%rax) -dd18|11223344556677885f5f5f5f5f5f 64 intel fstp qword ptr [rax], st0 -dd18|11223344556677885f5f5f5f5f5f 64 plan9 FSTP 0(AX) -dd20|11223344556677885f5f5f5f5f5f 32 intel frstor ptr [eax] -dd20|11223344556677885f5f5f5f5f5f 32 plan9 FRSTORL 0(AX) -dd20|11223344556677885f5f5f5f5f5f 64 gnu frstor (%rax) -dd20|11223344556677885f5f5f5f5f5f 64 intel frstor ptr [rax] -dd20|11223344556677885f5f5f5f5f5f 64 plan9 FRSTORL 0(AX) -dd30|11223344556677885f5f5f5f5f5f 32 intel fnsave ptr [eax] -dd30|11223344556677885f5f5f5f5f5f 32 plan9 FNSAVE 0(AX) -dd30|11223344556677885f5f5f5f5f5f 64 gnu fnsave (%rax) -dd30|11223344556677885f5f5f5f5f5f 64 intel fnsave ptr [rax] -dd30|11223344556677885f5f5f5f5f5f 64 plan9 FNSAVE 0(AX) -dd38|11223344556677885f5f5f5f5f5f 32 intel fnstsw word ptr [eax] -dd38|11223344556677885f5f5f5f5f5f 32 plan9 FNSTSW 0(AX) -dd38|11223344556677885f5f5f5f5f5f 64 gnu fnstsw (%rax) -dd38|11223344556677885f5f5f5f5f5f 64 intel fnstsw word ptr [rax] -dd38|11223344556677885f5f5f5f5f5f 64 plan9 FNSTSW 0(AX) -ddc0|11223344556677885f5f5f5f5f5f 32 intel ffree st0 -ddc0|11223344556677885f5f5f5f5f5f 32 plan9 FFREE F0 -ddc0|11223344556677885f5f5f5f5f5f 64 gnu ffree %st -ddc0|11223344556677885f5f5f5f5f5f 64 intel ffree st0 -ddc0|11223344556677885f5f5f5f5f5f 64 plan9 FFREE F0 -ddd0|11223344556677885f5f5f5f5f5f 32 intel fst st0, st0 -ddd0|11223344556677885f5f5f5f5f5f 32 plan9 FST F0 -ddd0|11223344556677885f5f5f5f5f5f 64 gnu fst %st -ddd0|11223344556677885f5f5f5f5f5f 64 intel fst st0, st0 -ddd0|11223344556677885f5f5f5f5f5f 64 plan9 FST F0 -ddd8|11223344556677885f5f5f5f5f5f 32 intel fstp st0, st0 -ddd8|11223344556677885f5f5f5f5f5f 32 plan9 FSTP F0 -ddd8|11223344556677885f5f5f5f5f5f 64 gnu fstp %st -ddd8|11223344556677885f5f5f5f5f5f 64 intel fstp st0, st0 -ddd8|11223344556677885f5f5f5f5f5f 64 plan9 FSTP F0 -dde0|11223344556677885f5f5f5f5f5f 32 intel fucom st0, st0 -dde0|11223344556677885f5f5f5f5f5f 32 plan9 FUCOM F0 -dde0|11223344556677885f5f5f5f5f5f 64 gnu fucom %st -dde0|11223344556677885f5f5f5f5f5f 64 intel fucom st0, st0 -dde0|11223344556677885f5f5f5f5f5f 64 plan9 FUCOM F0 -dde8|11223344556677885f5f5f5f5f5f 32 intel fucomp st0, st0 -dde8|11223344556677885f5f5f5f5f5f 32 plan9 FUCOMP F0 -dde8|11223344556677885f5f5f5f5f5f 64 gnu fucomp %st -dde8|11223344556677885f5f5f5f5f5f 64 intel fucomp st0, st0 -dde8|11223344556677885f5f5f5f5f5f 64 plan9 FUCOMP F0 -de00|11223344556677885f5f5f5f5f5f 32 intel fiadd st0, word ptr [eax] -de00|11223344556677885f5f5f5f5f5f 32 plan9 FIADD 0(AX) -de00|11223344556677885f5f5f5f5f5f 64 gnu fiadd (%rax) -de00|11223344556677885f5f5f5f5f5f 64 intel fiadd st0, word ptr [rax] -de00|11223344556677885f5f5f5f5f5f 64 plan9 FIADD 0(AX) -de08|11223344556677885f5f5f5f5f5f 32 intel fimul st0, word ptr [eax] -de08|11223344556677885f5f5f5f5f5f 32 plan9 FIMUL 0(AX) -de08|11223344556677885f5f5f5f5f5f 64 gnu fimul (%rax) -de08|11223344556677885f5f5f5f5f5f 64 intel fimul st0, word ptr [rax] -de08|11223344556677885f5f5f5f5f5f 64 plan9 FIMUL 0(AX) -de11|223344556677885f5f5f5f5f5f5f 32 intel ficom st0, word ptr [ecx] -de11|223344556677885f5f5f5f5f5f5f 32 plan9 FICOM 0(CX) -de11|223344556677885f5f5f5f5f5f5f 64 gnu ficom (%rcx) -de11|223344556677885f5f5f5f5f5f5f 64 intel ficom st0, word ptr [rcx] -de11|223344556677885f5f5f5f5f5f5f 64 plan9 FICOM 0(CX) -de18|11223344556677885f5f5f5f5f5f 32 intel ficomp st0, word ptr [eax] -de18|11223344556677885f5f5f5f5f5f 32 plan9 FICOMP 0(AX) -de18|11223344556677885f5f5f5f5f5f 64 gnu ficomp (%rax) -de18|11223344556677885f5f5f5f5f5f 64 intel ficomp st0, word ptr [rax] -de18|11223344556677885f5f5f5f5f5f 64 plan9 FICOMP 0(AX) -de20|11223344556677885f5f5f5f5f5f 32 intel fisub st0, word ptr [eax] -de20|11223344556677885f5f5f5f5f5f 32 plan9 FISUB 0(AX) -de20|11223344556677885f5f5f5f5f5f 64 gnu fisub (%rax) -de20|11223344556677885f5f5f5f5f5f 64 intel fisub st0, word ptr [rax] -de20|11223344556677885f5f5f5f5f5f 64 plan9 FISUB 0(AX) -de28|11223344556677885f5f5f5f5f5f 32 intel fisubr st0, word ptr [eax] -de28|11223344556677885f5f5f5f5f5f 32 plan9 FISUBR 0(AX) -de28|11223344556677885f5f5f5f5f5f 64 gnu fisubr (%rax) -de28|11223344556677885f5f5f5f5f5f 64 intel fisubr st0, word ptr [rax] -de28|11223344556677885f5f5f5f5f5f 64 plan9 FISUBR 0(AX) -de30|11223344556677885f5f5f5f5f5f 32 intel fidiv st0, word ptr [eax] -de30|11223344556677885f5f5f5f5f5f 32 plan9 FIDIV 0(AX) -de30|11223344556677885f5f5f5f5f5f 64 gnu fidiv (%rax) -de30|11223344556677885f5f5f5f5f5f 64 intel fidiv st0, word ptr [rax] -de30|11223344556677885f5f5f5f5f5f 64 plan9 FIDIV 0(AX) -de38|11223344556677885f5f5f5f5f5f 32 intel fidivr st0, word ptr [eax] -de38|11223344556677885f5f5f5f5f5f 32 plan9 FIDIVR 0(AX) -de38|11223344556677885f5f5f5f5f5f 64 gnu fidivr (%rax) -de38|11223344556677885f5f5f5f5f5f 64 intel fidivr st0, word ptr [rax] -de38|11223344556677885f5f5f5f5f5f 64 plan9 FIDIVR 0(AX) -dec0|11223344556677885f5f5f5f5f5f 32 intel faddp st0, st0 -dec0|11223344556677885f5f5f5f5f5f 32 plan9 FADDP F0, F0 -dec0|11223344556677885f5f5f5f5f5f 64 gnu faddp %st,%st -dec0|11223344556677885f5f5f5f5f5f 64 intel faddp st0, st0 -dec0|11223344556677885f5f5f5f5f5f 64 plan9 FADDP F0, F0 -dec8|11223344556677885f5f5f5f5f5f 32 intel fmulp st0, st0 -dec8|11223344556677885f5f5f5f5f5f 32 plan9 FMULP F0, F0 -dec8|11223344556677885f5f5f5f5f5f 64 gnu fmulp %st,%st -dec8|11223344556677885f5f5f5f5f5f 64 intel fmulp st0, st0 -dec8|11223344556677885f5f5f5f5f5f 64 plan9 FMULP F0, F0 -ded9|11223344556677885f5f5f5f5f5f 32 intel fcompp st0, st1 -ded9|11223344556677885f5f5f5f5f5f 32 plan9 FCOMPP -ded9|11223344556677885f5f5f5f5f5f 64 gnu fcompp -ded9|11223344556677885f5f5f5f5f5f 64 intel fcompp st0, st1 -ded9|11223344556677885f5f5f5f5f5f 64 plan9 FCOMPP -dee0|11223344556677885f5f5f5f5f5f 32 intel fsubrp st0, st0 -dee0|11223344556677885f5f5f5f5f5f 32 plan9 FSUBRP F0, F0 -dee0|11223344556677885f5f5f5f5f5f 64 gnu fsubp %st,%st -dee0|11223344556677885f5f5f5f5f5f 64 intel fsubrp st0, st0 -dee0|11223344556677885f5f5f5f5f5f 64 plan9 FSUBRP F0, F0 -dee8|11223344556677885f5f5f5f5f5f 32 intel fsubp st0, st0 -dee8|11223344556677885f5f5f5f5f5f 32 plan9 FSUBP F0, F0 -dee8|11223344556677885f5f5f5f5f5f 64 gnu fsubrp %st,%st -dee8|11223344556677885f5f5f5f5f5f 64 intel fsubp st0, st0 -dee8|11223344556677885f5f5f5f5f5f 64 plan9 FSUBP F0, F0 -def0|11223344556677885f5f5f5f5f5f 32 intel fdivrp st0, st0 -def0|11223344556677885f5f5f5f5f5f 32 plan9 FDIVRP F0, F0 -def0|11223344556677885f5f5f5f5f5f 64 gnu fdivp %st,%st -def0|11223344556677885f5f5f5f5f5f 64 intel fdivrp st0, st0 -def0|11223344556677885f5f5f5f5f5f 64 plan9 FDIVRP F0, F0 -def8|11223344556677885f5f5f5f5f5f 32 intel fdivp st0, st0 -def8|11223344556677885f5f5f5f5f5f 32 plan9 FDIVP F0, F0 -def8|11223344556677885f5f5f5f5f5f 64 gnu fdivrp %st,%st -def8|11223344556677885f5f5f5f5f5f 64 intel fdivp st0, st0 -def8|11223344556677885f5f5f5f5f5f 64 plan9 FDIVP F0, F0 -df00|11223344556677885f5f5f5f5f5f 32 intel fild st0, word ptr [eax] -df00|11223344556677885f5f5f5f5f5f 32 plan9 FILD 0(AX) -df00|11223344556677885f5f5f5f5f5f 64 gnu fild (%rax) -df00|11223344556677885f5f5f5f5f5f 64 intel fild st0, word ptr [rax] -df00|11223344556677885f5f5f5f5f5f 64 plan9 FILD 0(AX) -df08|11223344556677885f5f5f5f5f5f 32 intel fisttp word ptr [eax], st0 -df08|11223344556677885f5f5f5f5f5f 32 plan9 FISTTP 0(AX) -df08|11223344556677885f5f5f5f5f5f 64 gnu fisttp (%rax) -df08|11223344556677885f5f5f5f5f5f 64 intel fisttp word ptr [rax], st0 -df08|11223344556677885f5f5f5f5f5f 64 plan9 FISTTP 0(AX) -df11|223344556677885f5f5f5f5f5f5f 32 intel fist word ptr [ecx], st0 -df11|223344556677885f5f5f5f5f5f5f 32 plan9 FIST 0(CX) -df11|223344556677885f5f5f5f5f5f5f 64 gnu fist (%rcx) -df11|223344556677885f5f5f5f5f5f5f 64 intel fist word ptr [rcx], st0 -df11|223344556677885f5f5f5f5f5f5f 64 plan9 FIST 0(CX) -df18|11223344556677885f5f5f5f5f5f 32 intel fistp word ptr [eax], st0 -df18|11223344556677885f5f5f5f5f5f 32 plan9 FISTP 0(AX) -df18|11223344556677885f5f5f5f5f5f 64 gnu fistp (%rax) -df18|11223344556677885f5f5f5f5f5f 64 intel fistp word ptr [rax], st0 -df18|11223344556677885f5f5f5f5f5f 64 plan9 FISTP 0(AX) -df20|11223344556677885f5f5f5f5f5f 32 intel fbld st0, ptr [eax] -df20|11223344556677885f5f5f5f5f5f 32 plan9 FBLD 0(AX) -df20|11223344556677885f5f5f5f5f5f 64 gnu fbld (%rax) -df20|11223344556677885f5f5f5f5f5f 64 intel fbld st0, ptr [rax] -df20|11223344556677885f5f5f5f5f5f 64 plan9 FBLD 0(AX) -df28|11223344556677885f5f5f5f5f5f 32 intel fild st0, qword ptr [eax] -df28|11223344556677885f5f5f5f5f5f 32 plan9 FILD 0(AX) -df28|11223344556677885f5f5f5f5f5f 64 gnu fildll (%rax) -df28|11223344556677885f5f5f5f5f5f 64 intel fild st0, qword ptr [rax] -df28|11223344556677885f5f5f5f5f5f 64 plan9 FILD 0(AX) -df30|11223344556677885f5f5f5f5f5f 32 intel fbstp ptr [eax], st0 -df30|11223344556677885f5f5f5f5f5f 32 plan9 FBSTP 0(AX) -df30|11223344556677885f5f5f5f5f5f 64 gnu fbstp (%rax) -df30|11223344556677885f5f5f5f5f5f 64 intel fbstp ptr [rax], st0 -df30|11223344556677885f5f5f5f5f5f 64 plan9 FBSTP 0(AX) -df38|11223344556677885f5f5f5f5f5f 32 intel fistp qword ptr [eax], st0 -df38|11223344556677885f5f5f5f5f5f 32 plan9 FISTP 0(AX) -df38|11223344556677885f5f5f5f5f5f 64 gnu fistpll (%rax) -df38|11223344556677885f5f5f5f5f5f 64 intel fistp qword ptr [rax], st0 -df38|11223344556677885f5f5f5f5f5f 64 plan9 FISTP 0(AX) -dfc0|11223344556677885f5f5f5f5f5f 32 intel ffreep st0 -dfc0|11223344556677885f5f5f5f5f5f 32 plan9 FFREEP F0 -dfc0|11223344556677885f5f5f5f5f5f 64 gnu ffreep %st -dfc0|11223344556677885f5f5f5f5f5f 64 intel ffreep st0 -dfc0|11223344556677885f5f5f5f5f5f 64 plan9 FFREEP F0 -dfe0|11223344556677885f5f5f5f5f5f 32 intel fnstsw ax -dfe0|11223344556677885f5f5f5f5f5f 32 plan9 FNSTSW AX -dfe0|11223344556677885f5f5f5f5f5f 64 gnu fnstsw %ax -dfe0|11223344556677885f5f5f5f5f5f 64 intel fnstsw ax -dfe0|11223344556677885f5f5f5f5f5f 64 plan9 FNSTSW AX -dfe8|11223344556677885f5f5f5f5f5f 32 intel fucomip st0, st0 -dfe8|11223344556677885f5f5f5f5f5f 32 plan9 FUCOMIP F0, F0 -dfe8|11223344556677885f5f5f5f5f5f 64 gnu fucomip %st,%st -dfe8|11223344556677885f5f5f5f5f5f 64 intel fucomip st0, st0 -dfe8|11223344556677885f5f5f5f5f5f 64 plan9 FUCOMIP F0, F0 -dff0|11223344556677885f5f5f5f5f5f 32 intel fcomip st0, st0 -dff0|11223344556677885f5f5f5f5f5f 32 plan9 FCOMIP F0, F0 -dff0|11223344556677885f5f5f5f5f5f 64 gnu fcomip %st,%st -dff0|11223344556677885f5f5f5f5f5f 64 intel fcomip st0, st0 -dff0|11223344556677885f5f5f5f5f5f 64 plan9 FCOMIP F0, F0 -e111|223344556677885f5f5f5f5f5f5f 32 intel loope .+0x11 -e111|223344556677885f5f5f5f5f5f5f 32 plan9 LOOPE .+17 -e111|223344556677885f5f5f5f5f5f5f 64 gnu loope .+0x11 -e111|223344556677885f5f5f5f5f5f5f 64 intel loope .+0x11 -e111|223344556677885f5f5f5f5f5f5f 64 plan9 LOOPE .+17 -e211|223344556677885f5f5f5f5f5f5f 32 intel loop .+0x11 -e211|223344556677885f5f5f5f5f5f5f 32 plan9 LOOP .+17 -e211|223344556677885f5f5f5f5f5f5f 64 gnu loop .+0x11 -e211|223344556677885f5f5f5f5f5f5f 64 intel loop .+0x11 -e211|223344556677885f5f5f5f5f5f5f 64 plan9 LOOP .+17 -e311|223344556677885f5f5f5f5f5f5f 32 intel jecxz .+0x11 -e311|223344556677885f5f5f5f5f5f5f 32 plan9 JECXZ .+17 -e311|223344556677885f5f5f5f5f5f5f 64 gnu jrcxz .+0x11 -e311|223344556677885f5f5f5f5f5f5f 64 intel jrcxz .+0x11 -e311|223344556677885f5f5f5f5f5f5f 64 plan9 JRCXZ .+17 -e411|223344556677885f5f5f5f5f5f5f 32 intel in al, 0x11 -e411|223344556677885f5f5f5f5f5f5f 32 plan9 INL $0x11, AL -e411|223344556677885f5f5f5f5f5f5f 64 gnu in $0x11,%al -e411|223344556677885f5f5f5f5f5f5f 64 intel in al, 0x11 -e411|223344556677885f5f5f5f5f5f5f 64 plan9 INL $0x11, AL -e511|223344556677885f5f5f5f5f5f5f 32 intel in eax, 0x11 -e511|223344556677885f5f5f5f5f5f5f 32 plan9 INL $0x11, AX -e511|223344556677885f5f5f5f5f5f5f 64 gnu in $0x11,%eax -e511|223344556677885f5f5f5f5f5f5f 64 intel in eax, 0x11 -e511|223344556677885f5f5f5f5f5f5f 64 plan9 INL $0x11, AX -e611|223344556677885f5f5f5f5f5f5f 32 intel out 0x11, al -e611|223344556677885f5f5f5f5f5f5f 32 plan9 OUTL AL, $0x11 -e611|223344556677885f5f5f5f5f5f5f 64 gnu out %al,$0x11 -e611|223344556677885f5f5f5f5f5f5f 64 intel out 0x11, al -e611|223344556677885f5f5f5f5f5f5f 64 plan9 OUTL AL, $0x11 -e711|223344556677885f5f5f5f5f5f5f 32 intel out 0x11, eax -e711|223344556677885f5f5f5f5f5f5f 32 plan9 OUTL AX, $0x11 -e711|223344556677885f5f5f5f5f5f5f 64 gnu out %eax,$0x11 -e711|223344556677885f5f5f5f5f5f5f 64 intel out 0x11, eax -e711|223344556677885f5f5f5f5f5f5f 64 plan9 OUTL AX, $0x11 -e811223344|556677885f5f5f5f5f5f5f 32 intel call .+0x44332211 -e811223344|556677885f5f5f5f5f5f5f 32 plan9 CALL .+1144201745 -e811223344|556677885f5f5f5f5f5f5f 64 gnu callq .+0x44332211 -e811223344|556677885f5f5f5f5f5f5f 64 intel call .+0x44332211 -e811223344|556677885f5f5f5f5f5f5f 64 plan9 CALL .+1144201745 -e911223344|556677885f5f5f5f5f5f5f 32 intel jmp .+0x44332211 -e911223344|556677885f5f5f5f5f5f5f 32 plan9 JMP .+1144201745 -e911223344|556677885f5f5f5f5f5f5f 64 gnu jmpq .+0x44332211 -e911223344|556677885f5f5f5f5f5f5f 64 intel jmp .+0x44332211 -e911223344|556677885f5f5f5f5f5f5f 64 plan9 JMP .+1144201745 -ea112233445566|77885f5f5f5f5f5f5f 32 intel jmp far 0x44332211, 0x6655 -ea112233445566|77885f5f5f5f5f5f5f 32 plan9 LJMP $0x44332211, $0x6655 -eb11|223344556677885f5f5f5f5f5f5f 32 intel jmp .+0x11 -eb11|223344556677885f5f5f5f5f5f5f 32 plan9 JMP .+17 -eb11|223344556677885f5f5f5f5f5f5f 64 gnu jmp .+0x11 -eb11|223344556677885f5f5f5f5f5f5f 64 intel jmp .+0x11 -eb11|223344556677885f5f5f5f5f5f5f 64 plan9 JMP .+17 -ec|11223344556677885f5f5f5f5f5f5f 32 intel in al, dx -ec|11223344556677885f5f5f5f5f5f5f 32 plan9 INL DX, AL -ec|11223344556677885f5f5f5f5f5f5f 64 gnu in (%dx),%al -ec|11223344556677885f5f5f5f5f5f5f 64 intel in al, dx -ec|11223344556677885f5f5f5f5f5f5f 64 plan9 INL DX, AL -ed|11223344556677885f5f5f5f5f5f5f 32 intel in eax, dx -ed|11223344556677885f5f5f5f5f5f5f 32 plan9 INL DX, AX -ed|11223344556677885f5f5f5f5f5f5f 64 gnu in (%dx),%eax -ed|11223344556677885f5f5f5f5f5f5f 64 intel in eax, dx -ed|11223344556677885f5f5f5f5f5f5f 64 plan9 INL DX, AX -ee|11223344556677885f5f5f5f5f5f5f 32 intel out dx, al -ee|11223344556677885f5f5f5f5f5f5f 32 plan9 OUTL AL, DX -ee|11223344556677885f5f5f5f5f5f5f 64 gnu out %al,(%dx) -ee|11223344556677885f5f5f5f5f5f5f 64 intel out dx, al -ee|11223344556677885f5f5f5f5f5f5f 64 plan9 OUTL AL, DX -ef|11223344556677885f5f5f5f5f5f5f 32 intel out dx, eax -ef|11223344556677885f5f5f5f5f5f5f 32 plan9 OUTL AX, DX -ef|11223344556677885f5f5f5f5f5f5f 64 gnu out %eax,(%dx) -ef|11223344556677885f5f5f5f5f5f5f 64 intel out dx, eax -ef|11223344556677885f5f5f5f5f5f5f 64 plan9 OUTL AX, DX -f1|11223344556677885f5f5f5f5f5f5f 32 intel int1 -f1|11223344556677885f5f5f5f5f5f5f 32 plan9 ICEBP -f1|11223344556677885f5f5f5f5f5f5f 64 gnu icebp -f1|11223344556677885f5f5f5f5f5f5f 64 intel int1 -f1|11223344556677885f5f5f5f5f5f5f 64 plan9 ICEBP -f20f1011|223344556677885f5f5f5f5f 32 intel movsd xmm2, qword ptr [ecx] -f20f1011|223344556677885f5f5f5f5f 32 plan9 MOVSD_XMM 0(CX), X2 -f20f1011|223344556677885f5f5f5f5f 64 gnu movsd (%rcx),%xmm2 -f20f1011|223344556677885f5f5f5f5f 64 intel movsd xmm2, qword ptr [rcx] -f20f1011|223344556677885f5f5f5f5f 64 plan9 MOVSD_XMM 0(CX), X2 -f20f1122|3344556677885f5f5f5f5f5f 32 intel movsd qword ptr [edx], xmm4 -f20f1122|3344556677885f5f5f5f5f5f 32 plan9 MOVSD_XMM X4, 0(DX) -f20f1122|3344556677885f5f5f5f5f5f 64 gnu movsd %xmm4,(%rdx) -f20f1122|3344556677885f5f5f5f5f5f 64 intel movsd qword ptr [rdx], xmm4 -f20f1122|3344556677885f5f5f5f5f5f 64 plan9 MOVSD_XMM X4, 0(DX) -f20f1211|223344556677885f5f5f5f5f 32 intel movddup xmm2, qword ptr [ecx] -f20f1211|223344556677885f5f5f5f5f 32 plan9 MOVDDUP 0(CX), X2 -f20f1211|223344556677885f5f5f5f5f 64 gnu movddup (%rcx),%xmm2 -f20f1211|223344556677885f5f5f5f5f 64 intel movddup xmm2, qword ptr [rcx] -f20f1211|223344556677885f5f5f5f5f 64 plan9 MOVDDUP 0(CX), X2 -f20f2a11|223344556677885f5f5f5f5f 32 intel cvtsi2sd xmm2, dword ptr [ecx] -f20f2a11|223344556677885f5f5f5f5f 32 plan9 CVTSI2SDL 0(CX), X2 -f20f2a11|223344556677885f5f5f5f5f 64 gnu cvtsi2sdl (%rcx),%xmm2 -f20f2a11|223344556677885f5f5f5f5f 64 intel cvtsi2sd xmm2, dword ptr [rcx] -f20f2a11|223344556677885f5f5f5f5f 64 plan9 CVTSI2SDL 0(CX), X2 -f20f2c11|223344556677885f5f5f5f5f 32 intel cvttsd2si edx, qword ptr [ecx] -f20f2c11|223344556677885f5f5f5f5f 32 plan9 CVTTSD2SIQ 0(CX), DX -f20f2c11|223344556677885f5f5f5f5f 64 gnu cvttsd2si (%rcx),%edx -f20f2c11|223344556677885f5f5f5f5f 64 intel cvttsd2si edx, qword ptr [rcx] -f20f2c11|223344556677885f5f5f5f5f 64 plan9 CVTTSD2SIQ 0(CX), DX -f20f2d11|223344556677885f5f5f5f5f 32 intel cvtsd2si edx, qword ptr [ecx] -f20f2d11|223344556677885f5f5f5f5f 32 plan9 CVTSD2SIQ 0(CX), DX -f20f2d11|223344556677885f5f5f5f5f 64 gnu cvtsd2si (%rcx),%edx -f20f2d11|223344556677885f5f5f5f5f 64 intel cvtsd2si edx, qword ptr [rcx] -f20f2d11|223344556677885f5f5f5f5f 64 plan9 CVTSD2SIQ 0(CX), DX -f20f38f011|223344556677885f5f5f5f 32 intel crc32 edx, byte ptr [ecx] -f20f38f011|223344556677885f5f5f5f 32 plan9 CRC32 0(CX), DX -f20f38f011|223344556677885f5f5f5f 64 gnu crc32b (%rcx),%edx -f20f38f011|223344556677885f5f5f5f 64 intel crc32 edx, byte ptr [rcx] -f20f38f011|223344556677885f5f5f5f 64 plan9 CRC32 0(CX), DX -f20f38f111|223344556677885f5f5f5f 32 intel crc32 edx, dword ptr [ecx] -f20f38f111|223344556677885f5f5f5f 32 plan9 CRC32 0(CX), DX -f20f38f111|223344556677885f5f5f5f 64 gnu crc32l (%rcx),%edx -f20f38f111|223344556677885f5f5f5f 64 intel crc32 edx, dword ptr [rcx] -f20f38f111|223344556677885f5f5f5f 64 plan9 CRC32 0(CX), DX -f20f5111|223344556677885f5f5f5f5f 32 intel sqrtsd xmm2, qword ptr [ecx] -f20f5111|223344556677885f5f5f5f5f 32 plan9 SQRTSD 0(CX), X2 -f20f5111|223344556677885f5f5f5f5f 64 gnu sqrtsd (%rcx),%xmm2 -f20f5111|223344556677885f5f5f5f5f 64 intel sqrtsd xmm2, qword ptr [rcx] -f20f5111|223344556677885f5f5f5f5f 64 plan9 SQRTSD 0(CX), X2 -f20f5811|223344556677885f5f5f5f5f 32 intel addsd xmm2, qword ptr [ecx] -f20f5811|223344556677885f5f5f5f5f 32 plan9 ADDSD 0(CX), X2 -f20f5811|223344556677885f5f5f5f5f 64 gnu addsd (%rcx),%xmm2 -f20f5811|223344556677885f5f5f5f5f 64 intel addsd xmm2, qword ptr [rcx] -f20f5811|223344556677885f5f5f5f5f 64 plan9 ADDSD 0(CX), X2 -f20f5911|223344556677885f5f5f5f5f 32 intel mulsd xmm2, qword ptr [ecx] -f20f5911|223344556677885f5f5f5f5f 32 plan9 MULSD 0(CX), X2 -f20f5911|223344556677885f5f5f5f5f 64 gnu mulsd (%rcx),%xmm2 -f20f5911|223344556677885f5f5f5f5f 64 intel mulsd xmm2, qword ptr [rcx] -f20f5911|223344556677885f5f5f5f5f 64 plan9 MULSD 0(CX), X2 -f20f5a11|223344556677885f5f5f5f5f 32 intel cvtsd2ss xmm2, qword ptr [ecx] -f20f5a11|223344556677885f5f5f5f5f 32 plan9 CVTSD2SS 0(CX), X2 -f20f5a11|223344556677885f5f5f5f5f 64 gnu cvtsd2ss (%rcx),%xmm2 -f20f5a11|223344556677885f5f5f5f5f 64 intel cvtsd2ss xmm2, qword ptr [rcx] -f20f5a11|223344556677885f5f5f5f5f 64 plan9 CVTSD2SS 0(CX), X2 -f20f5c11|223344556677885f5f5f5f5f 32 intel subsd xmm2, qword ptr [ecx] -f20f5c11|223344556677885f5f5f5f5f 32 plan9 SUBSD 0(CX), X2 -f20f5c11|223344556677885f5f5f5f5f 64 gnu subsd (%rcx),%xmm2 -f20f5c11|223344556677885f5f5f5f5f 64 intel subsd xmm2, qword ptr [rcx] -f20f5c11|223344556677885f5f5f5f5f 64 plan9 SUBSD 0(CX), X2 -f20f5d11|223344556677885f5f5f5f5f 32 intel minsd xmm2, qword ptr [ecx] -f20f5d11|223344556677885f5f5f5f5f 32 plan9 MINSD 0(CX), X2 -f20f5d11|223344556677885f5f5f5f5f 64 gnu minsd (%rcx),%xmm2 -f20f5d11|223344556677885f5f5f5f5f 64 intel minsd xmm2, qword ptr [rcx] -f20f5d11|223344556677885f5f5f5f5f 64 plan9 MINSD 0(CX), X2 -f20f5e11|223344556677885f5f5f5f5f 32 intel divsd xmm2, qword ptr [ecx] -f20f5e11|223344556677885f5f5f5f5f 32 plan9 DIVSD 0(CX), X2 -f20f5e11|223344556677885f5f5f5f5f 64 gnu divsd (%rcx),%xmm2 -f20f5e11|223344556677885f5f5f5f5f 64 intel divsd xmm2, qword ptr [rcx] -f20f5e11|223344556677885f5f5f5f5f 64 plan9 DIVSD 0(CX), X2 -f20f5f11|223344556677885f5f5f5f5f 32 intel maxsd xmm2, qword ptr [ecx] -f20f5f11|223344556677885f5f5f5f5f 32 plan9 MAXSD 0(CX), X2 -f20f5f11|223344556677885f5f5f5f5f 64 gnu maxsd (%rcx),%xmm2 -f20f5f11|223344556677885f5f5f5f5f 64 intel maxsd xmm2, qword ptr [rcx] -f20f5f11|223344556677885f5f5f5f5f 64 plan9 MAXSD 0(CX), X2 -f20f701122|3344556677885f5f5f5f5f 32 intel pshuflw xmm2, xmmword ptr [ecx], 0x22 -f20f701122|3344556677885f5f5f5f5f 32 plan9 PSHUFLW $0x22, 0(CX), X2 -f20f701122|3344556677885f5f5f5f5f 64 gnu pshuflw $0x22,(%rcx),%xmm2 -f20f701122|3344556677885f5f5f5f5f 64 intel pshuflw xmm2, xmmword ptr [rcx], 0x22 -f20f701122|3344556677885f5f5f5f5f 64 plan9 PSHUFLW $0x22, 0(CX), X2 -f20f7c11|223344556677885f5f5f5f5f 32 intel haddps xmm2, xmmword ptr [ecx] -f20f7c11|223344556677885f5f5f5f5f 32 plan9 HADDPS 0(CX), X2 -f20f7c11|223344556677885f5f5f5f5f 64 gnu haddps (%rcx),%xmm2 -f20f7c11|223344556677885f5f5f5f5f 64 intel haddps xmm2, xmmword ptr [rcx] -f20f7c11|223344556677885f5f5f5f5f 64 plan9 HADDPS 0(CX), X2 -f20f7d11|223344556677885f5f5f5f5f 32 intel hsubps xmm2, xmmword ptr [ecx] -f20f7d11|223344556677885f5f5f5f5f 32 plan9 HSUBPS 0(CX), X2 -f20f7d11|223344556677885f5f5f5f5f 64 gnu hsubps (%rcx),%xmm2 -f20f7d11|223344556677885f5f5f5f5f 64 intel hsubps xmm2, xmmword ptr [rcx] -f20f7d11|223344556677885f5f5f5f5f 64 plan9 HSUBPS 0(CX), X2 -f20fc21122|3344556677885f5f5f5f5f 32 intel cmpsd_xmm xmm2, qword ptr [ecx], 0x22 -f20fc21122|3344556677885f5f5f5f5f 32 plan9 CMPSD_XMM $0x22, 0(CX), X2 -f20fc21122|3344556677885f5f5f5f5f 64 gnu cmpsd $0x22,(%rcx),%xmm2 -f20fc21122|3344556677885f5f5f5f5f 64 intel cmpsd_xmm xmm2, qword ptr [rcx], 0x22 -f20fc21122|3344556677885f5f5f5f5f 64 plan9 CMPSD_XMM $0x22, 0(CX), X2 -f20fd011|223344556677885f5f5f5f5f 32 intel addsubps xmm2, xmmword ptr [ecx] -f20fd011|223344556677885f5f5f5f5f 32 plan9 ADDSUBPS 0(CX), X2 -f20fd011|223344556677885f5f5f5f5f 64 gnu addsubps (%rcx),%xmm2 -f20fd011|223344556677885f5f5f5f5f 64 intel addsubps xmm2, xmmword ptr [rcx] -f20fd011|223344556677885f5f5f5f5f 64 plan9 ADDSUBPS 0(CX), X2 -f20fd6c0|11223344556677885f5f5f5f 32 intel movdq2q mmx0, xmm0 -f20fd6c0|11223344556677885f5f5f5f 32 plan9 MOVDQ2Q X0, M0 -f20fd6c0|11223344556677885f5f5f5f 64 gnu movdq2q %xmm0,%mm0 -f20fd6c0|11223344556677885f5f5f5f 64 intel movdq2q mmx0, xmm0 -f20fd6c0|11223344556677885f5f5f5f 64 plan9 MOVDQ2Q X0, M0 -f20fe611|223344556677885f5f5f5f5f 32 intel cvtpd2dq xmm2, xmmword ptr [ecx] -f20fe611|223344556677885f5f5f5f5f 32 plan9 CVTPD2DQ 0(CX), X2 -f20fe611|223344556677885f5f5f5f5f 64 gnu cvtpd2dq (%rcx),%xmm2 -f20fe611|223344556677885f5f5f5f5f 64 intel cvtpd2dq xmm2, xmmword ptr [rcx] -f20fe611|223344556677885f5f5f5f5f 64 plan9 CVTPD2DQ 0(CX), X2 -f20ff011|223344556677885f5f5f5f5f 32 intel lddqu xmm2, xmmword ptr [ecx] -f20ff011|223344556677885f5f5f5f5f 32 plan9 LDDQU 0(CX), X2 -f20ff011|223344556677885f5f5f5f5f 64 gnu lddqu (%rcx),%xmm2 -f20ff011|223344556677885f5f5f5f5f 64 intel lddqu xmm2, xmmword ptr [rcx] -f20ff011|223344556677885f5f5f5f5f 64 plan9 LDDQU 0(CX), X2 -f2480f2a11|223344556677885f5f5f5f 64 gnu cvtsi2sdq (%rcx),%xmm2 -f2480f2a11|223344556677885f5f5f5f 64 intel cvtsi2sd xmm2, qword ptr [rcx] -f2480f2a11|223344556677885f5f5f5f 64 plan9 CVTSI2SDQ 0(CX), X2 -f2480f2c11|223344556677885f5f5f5f 64 gnu cvttsd2si (%rcx),%rdx -f2480f2c11|223344556677885f5f5f5f 64 intel cvttsd2si rdx, qword ptr [rcx] -f2480f2c11|223344556677885f5f5f5f 64 plan9 CVTTSD2SIQ 0(CX), DX -f2480f2d11|223344556677885f5f5f5f 64 gnu cvtsd2si (%rcx),%rdx -f2480f2d11|223344556677885f5f5f5f 64 intel cvtsd2si rdx, qword ptr [rcx] -f2480f2d11|223344556677885f5f5f5f 64 plan9 CVTSD2SIQ 0(CX), DX -f2480f38f011|223344556677885f5f5f 64 gnu crc32b (%rcx),%rdx -f2480f38f011|223344556677885f5f5f 64 intel crc32 rdx, byte ptr [rcx] -f2480f38f011|223344556677885f5f5f 64 plan9 CRC32 0(CX), DX -f2480f38f111|223344556677885f5f5f 64 gnu crc32q (%rcx),%rdx -f2480f38f111|223344556677885f5f5f 64 intel crc32 rdx, qword ptr [rcx] -f2480f38f111|223344556677885f5f5f 64 plan9 CRC32 0(CX), DX -f267f0663e360f38f111|223344556677 32 intel lock crc32 edx, word ptr ss:[bx+di*1] -f267f0663e360f38f111|223344556677 32 plan9 DS CRC32 SS:0(BX)(DI*1), DX -f267f0663e360f38f111|223344556677 64 gnu lock crc32w %ds:%ss:(%ecx),%edx -f267f0663e360f38f111|223344556677 64 intel lock crc32 edx, word ptr [ecx] -f267f0663e360f38f111|223344556677 64 plan9 SS CRC32 0(CX), DX -f2f30f2b11|5f5f5f5f5f5f5f5f5f5f5f 32 intel movntss dword ptr [ecx], xmm2 -f2f30f2b11|5f5f5f5f5f5f5f5f5f5f5f 32 plan9 REPNE; MOVNTSS X2, 0(CX) -f2f30f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 gnu repn movntss %xmm2,(%rcx) -f2f30f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 intel movntss dword ptr [rcx], xmm2 -f2f30f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 plan9 REPNE; MOVNTSS X2, 0(CX) -f30f1011|223344556677885f5f5f5f5f 32 intel movss xmm2, dword ptr [ecx] -f30f1011|223344556677885f5f5f5f5f 32 plan9 MOVSS 0(CX), X2 -f30f1011|223344556677885f5f5f5f5f 64 gnu movss (%rcx),%xmm2 -f30f1011|223344556677885f5f5f5f5f 64 intel movss xmm2, dword ptr [rcx] -f30f1011|223344556677885f5f5f5f5f 64 plan9 MOVSS 0(CX), X2 -f30f1122|3344556677885f5f5f5f5f5f 32 intel movss dword ptr [edx], xmm4 -f30f1122|3344556677885f5f5f5f5f5f 32 plan9 MOVSS X4, 0(DX) -f30f1122|3344556677885f5f5f5f5f5f 64 gnu movss %xmm4,(%rdx) -f30f1122|3344556677885f5f5f5f5f5f 64 intel movss dword ptr [rdx], xmm4 -f30f1122|3344556677885f5f5f5f5f5f 64 plan9 MOVSS X4, 0(DX) -f30f1211|223344556677885f5f5f5f5f 32 intel movsldup xmm2, xmmword ptr [ecx] -f30f1211|223344556677885f5f5f5f5f 32 plan9 MOVSLDUP 0(CX), X2 -f30f1211|223344556677885f5f5f5f5f 64 gnu movsldup (%rcx),%xmm2 -f30f1211|223344556677885f5f5f5f5f 64 intel movsldup xmm2, xmmword ptr [rcx] -f30f1211|223344556677885f5f5f5f5f 64 plan9 MOVSLDUP 0(CX), X2 -f30f1611|223344556677885f5f5f5f5f 32 intel movshdup xmm2, xmmword ptr [ecx] -f30f1611|223344556677885f5f5f5f5f 32 plan9 MOVSHDUP 0(CX), X2 -f30f1611|223344556677885f5f5f5f5f 64 gnu movshdup (%rcx),%xmm2 -f30f1611|223344556677885f5f5f5f5f 64 intel movshdup xmm2, xmmword ptr [rcx] -f30f1611|223344556677885f5f5f5f5f 64 plan9 MOVSHDUP 0(CX), X2 -f30f2a11|223344556677885f5f5f5f5f 32 intel cvtsi2ss xmm2, dword ptr [ecx] -f30f2a11|223344556677885f5f5f5f5f 32 plan9 CVTSI2SSL 0(CX), X2 -f30f2a11|223344556677885f5f5f5f5f 64 gnu cvtsi2ssl (%rcx),%xmm2 -f30f2a11|223344556677885f5f5f5f5f 64 intel cvtsi2ss xmm2, dword ptr [rcx] -f30f2a11|223344556677885f5f5f5f5f 64 plan9 CVTSI2SSL 0(CX), X2 -f30f2c11|223344556677885f5f5f5f5f 32 intel cvttss2si edx, dword ptr [ecx] -f30f2c11|223344556677885f5f5f5f5f 32 plan9 CVTTSS2SIL 0(CX), DX -f30f2c11|223344556677885f5f5f5f5f 64 gnu cvttss2si (%rcx),%edx -f30f2c11|223344556677885f5f5f5f5f 64 intel cvttss2si edx, dword ptr [rcx] -f30f2c11|223344556677885f5f5f5f5f 64 plan9 CVTTSS2SIL 0(CX), DX -f30f2d11|223344556677885f5f5f5f5f 32 intel cvtss2si edx, dword ptr [ecx] -f30f2d11|223344556677885f5f5f5f5f 32 plan9 CVTSS2SIL 0(CX), DX -f30f2d11|223344556677885f5f5f5f5f 64 gnu cvtss2si (%rcx),%edx -f30f2d11|223344556677885f5f5f5f5f 64 intel cvtss2si edx, dword ptr [rcx] -f30f2d11|223344556677885f5f5f5f5f 64 plan9 CVTSS2SIL 0(CX), DX -f30f5111|223344556677885f5f5f5f5f 32 intel sqrtss xmm2, dword ptr [ecx] -f30f5111|223344556677885f5f5f5f5f 32 plan9 SQRTSS 0(CX), X2 -f30f5111|223344556677885f5f5f5f5f 64 gnu sqrtss (%rcx),%xmm2 -f30f5111|223344556677885f5f5f5f5f 64 intel sqrtss xmm2, dword ptr [rcx] -f30f5111|223344556677885f5f5f5f5f 64 plan9 SQRTSS 0(CX), X2 -f30f5211|223344556677885f5f5f5f5f 32 intel rsqrtss xmm2, dword ptr [ecx] -f30f5211|223344556677885f5f5f5f5f 32 plan9 RSQRTSS 0(CX), X2 -f30f5211|223344556677885f5f5f5f5f 64 gnu rsqrtss (%rcx),%xmm2 -f30f5211|223344556677885f5f5f5f5f 64 intel rsqrtss xmm2, dword ptr [rcx] -f30f5211|223344556677885f5f5f5f5f 64 plan9 RSQRTSS 0(CX), X2 -f30f5311|223344556677885f5f5f5f5f 32 intel rcpss xmm2, dword ptr [ecx] -f30f5311|223344556677885f5f5f5f5f 32 plan9 RCPSS 0(CX), X2 -f30f5311|223344556677885f5f5f5f5f 64 gnu rcpss (%rcx),%xmm2 -f30f5311|223344556677885f5f5f5f5f 64 intel rcpss xmm2, dword ptr [rcx] -f30f5311|223344556677885f5f5f5f5f 64 plan9 RCPSS 0(CX), X2 -f30f5811|223344556677885f5f5f5f5f 32 intel addss xmm2, dword ptr [ecx] -f30f5811|223344556677885f5f5f5f5f 32 plan9 ADDSS 0(CX), X2 -f30f5811|223344556677885f5f5f5f5f 64 gnu addss (%rcx),%xmm2 -f30f5811|223344556677885f5f5f5f5f 64 intel addss xmm2, dword ptr [rcx] -f30f5811|223344556677885f5f5f5f5f 64 plan9 ADDSS 0(CX), X2 -f30f5911|223344556677885f5f5f5f5f 32 intel mulss xmm2, dword ptr [ecx] -f30f5911|223344556677885f5f5f5f5f 32 plan9 MULSS 0(CX), X2 -f30f5911|223344556677885f5f5f5f5f 64 gnu mulss (%rcx),%xmm2 -f30f5911|223344556677885f5f5f5f5f 64 intel mulss xmm2, dword ptr [rcx] -f30f5911|223344556677885f5f5f5f5f 64 plan9 MULSS 0(CX), X2 -f30f5a11|223344556677885f5f5f5f5f 32 intel cvtss2sd xmm2, dword ptr [ecx] -f30f5a11|223344556677885f5f5f5f5f 32 plan9 CVTSS2SD 0(CX), X2 -f30f5a11|223344556677885f5f5f5f5f 64 gnu cvtss2sd (%rcx),%xmm2 -f30f5a11|223344556677885f5f5f5f5f 64 intel cvtss2sd xmm2, dword ptr [rcx] -f30f5a11|223344556677885f5f5f5f5f 64 plan9 CVTSS2SD 0(CX), X2 -f30f5b11|223344556677885f5f5f5f5f 32 intel cvttps2dq xmm2, xmmword ptr [ecx] -f30f5b11|223344556677885f5f5f5f5f 32 plan9 CVTTPS2DQ 0(CX), X2 -f30f5b11|223344556677885f5f5f5f5f 64 gnu cvttps2dq (%rcx),%xmm2 -f30f5b11|223344556677885f5f5f5f5f 64 intel cvttps2dq xmm2, xmmword ptr [rcx] -f30f5b11|223344556677885f5f5f5f5f 64 plan9 CVTTPS2DQ 0(CX), X2 -f30f5c11|223344556677885f5f5f5f5f 32 intel subss xmm2, dword ptr [ecx] -f30f5c11|223344556677885f5f5f5f5f 32 plan9 SUBSS 0(CX), X2 -f30f5c11|223344556677885f5f5f5f5f 64 gnu subss (%rcx),%xmm2 -f30f5c11|223344556677885f5f5f5f5f 64 intel subss xmm2, dword ptr [rcx] -f30f5c11|223344556677885f5f5f5f5f 64 plan9 SUBSS 0(CX), X2 -f30f5d11|223344556677885f5f5f5f5f 32 intel minss xmm2, dword ptr [ecx] -f30f5d11|223344556677885f5f5f5f5f 32 plan9 MINSS 0(CX), X2 -f30f5d11|223344556677885f5f5f5f5f 64 gnu minss (%rcx),%xmm2 -f30f5d11|223344556677885f5f5f5f5f 64 intel minss xmm2, dword ptr [rcx] -f30f5d11|223344556677885f5f5f5f5f 64 plan9 MINSS 0(CX), X2 -f30f5e11|223344556677885f5f5f5f5f 32 intel divss xmm2, dword ptr [ecx] -f30f5e11|223344556677885f5f5f5f5f 32 plan9 DIVSS 0(CX), X2 -f30f5e11|223344556677885f5f5f5f5f 64 gnu divss (%rcx),%xmm2 -f30f5e11|223344556677885f5f5f5f5f 64 intel divss xmm2, dword ptr [rcx] -f30f5e11|223344556677885f5f5f5f5f 64 plan9 DIVSS 0(CX), X2 -f30f5f11|223344556677885f5f5f5f5f 32 intel maxss xmm2, dword ptr [ecx] -f30f5f11|223344556677885f5f5f5f5f 32 plan9 MAXSS 0(CX), X2 -f30f5f11|223344556677885f5f5f5f5f 64 gnu maxss (%rcx),%xmm2 -f30f5f11|223344556677885f5f5f5f5f 64 intel maxss xmm2, dword ptr [rcx] -f30f5f11|223344556677885f5f5f5f5f 64 plan9 MAXSS 0(CX), X2 -f30f6f11|223344556677885f5f5f5f5f 32 intel movdqu xmm2, xmmword ptr [ecx] -f30f6f11|223344556677885f5f5f5f5f 32 plan9 MOVDQU 0(CX), X2 -f30f6f11|223344556677885f5f5f5f5f 64 gnu movdqu (%rcx),%xmm2 -f30f6f11|223344556677885f5f5f5f5f 64 intel movdqu xmm2, xmmword ptr [rcx] -f30f6f11|223344556677885f5f5f5f5f 64 plan9 MOVDQU 0(CX), X2 -f30f701122|3344556677885f5f5f5f5f 32 intel pshufhw xmm2, xmmword ptr [ecx], 0x22 -f30f701122|3344556677885f5f5f5f5f 32 plan9 PSHUFHW $0x22, 0(CX), X2 -f30f701122|3344556677885f5f5f5f5f 64 gnu pshufhw $0x22,(%rcx),%xmm2 -f30f701122|3344556677885f5f5f5f5f 64 intel pshufhw xmm2, xmmword ptr [rcx], 0x22 -f30f701122|3344556677885f5f5f5f5f 64 plan9 PSHUFHW $0x22, 0(CX), X2 -f30f7e11|223344556677885f5f5f5f5f 32 intel movq xmm2, qword ptr [ecx] -f30f7e11|223344556677885f5f5f5f5f 32 plan9 MOVQ 0(CX), X2 -f30f7e11|223344556677885f5f5f5f5f 64 gnu movq (%rcx),%xmm2 -f30f7e11|223344556677885f5f5f5f5f 64 intel movq xmm2, qword ptr [rcx] -f30f7e11|223344556677885f5f5f5f5f 64 plan9 MOVQ 0(CX), X2 -f30f7f11|223344556677885f5f5f5f5f 32 intel movdqu xmmword ptr [ecx], xmm2 -f30f7f11|223344556677885f5f5f5f5f 32 plan9 MOVDQU X2, 0(CX) -f30f7f11|223344556677885f5f5f5f5f 64 gnu movdqu %xmm2,(%rcx) -f30f7f11|223344556677885f5f5f5f5f 64 intel movdqu xmmword ptr [rcx], xmm2 -f30f7f11|223344556677885f5f5f5f5f 64 plan9 MOVDQU X2, 0(CX) -f30fae11|223344556677885f5f5f5f5f 64 gnu wrfsbasel (%rcx) -f30fae11|223344556677885f5f5f5f5f 64 intel wrfsbase dword ptr [rcx] -f30fae11|223344556677885f5f5f5f5f 64 plan9 WRFSBASE 0(CX) -f30fae18|11223344556677885f5f5f5f 64 gnu wrgsbasel (%rax) -f30fae18|11223344556677885f5f5f5f 64 intel wrgsbase dword ptr [rax] -f30fae18|11223344556677885f5f5f5f 64 plan9 WRGSBASE 0(AX) -f30faec0|11223344556677885f5f5f5f 64 gnu rdfsbase %eax -f30faec0|11223344556677885f5f5f5f 64 intel rdfsbase eax -f30faec0|11223344556677885f5f5f5f 64 plan9 RDFSBASE AX -f30faec8|11223344556677885f5f5f5f 64 gnu rdgsbase %eax -f30faec8|11223344556677885f5f5f5f 64 intel rdgsbase eax -f30faec8|11223344556677885f5f5f5f 64 plan9 RDGSBASE AX -f30fb811|223344556677885f5f5f5f5f 32 intel popcnt edx, dword ptr [ecx] -f30fb811|223344556677885f5f5f5f5f 32 plan9 POPCNT 0(CX), DX -f30fb811|223344556677885f5f5f5f5f 64 gnu popcnt (%rcx),%edx -f30fb811|223344556677885f5f5f5f5f 64 intel popcnt edx, dword ptr [rcx] -f30fb811|223344556677885f5f5f5f5f 64 plan9 POPCNT 0(CX), DX -f30fbc11|223344556677885f5f5f5f5f 32 intel tzcnt edx, dword ptr [ecx] -f30fbc11|223344556677885f5f5f5f5f 32 plan9 TZCNT 0(CX), DX -f30fbc11|223344556677885f5f5f5f5f 64 gnu tzcnt (%rcx),%edx -f30fbc11|223344556677885f5f5f5f5f 64 intel tzcnt edx, dword ptr [rcx] -f30fbc11|223344556677885f5f5f5f5f 64 plan9 TZCNT 0(CX), DX -f30fbd11|223344556677885f5f5f5f5f 32 intel lzcnt edx, dword ptr [ecx] -f30fbd11|223344556677885f5f5f5f5f 32 plan9 LZCNT 0(CX), DX -f30fbd11|223344556677885f5f5f5f5f 64 gnu lzcnt (%rcx),%edx -f30fbd11|223344556677885f5f5f5f5f 64 intel lzcnt edx, dword ptr [rcx] -f30fbd11|223344556677885f5f5f5f5f 64 plan9 LZCNT 0(CX), DX -f30fc21122|3344556677885f5f5f5f5f 32 intel cmpss xmm2, dword ptr [ecx], 0x22 -f30fc21122|3344556677885f5f5f5f5f 32 plan9 CMPSS $0x22, 0(CX), X2 -f30fc21122|3344556677885f5f5f5f5f 64 gnu cmpss $0x22,(%rcx),%xmm2 -f30fc21122|3344556677885f5f5f5f5f 64 intel cmpss xmm2, dword ptr [rcx], 0x22 -f30fc21122|3344556677885f5f5f5f5f 64 plan9 CMPSS $0x22, 0(CX), X2 -f30fe611|223344556677885f5f5f5f5f 32 intel cvtdq2pd xmm2, qword ptr [ecx] -f30fe611|223344556677885f5f5f5f5f 32 plan9 CVTDQ2PD 0(CX), X2 -f30fe611|223344556677885f5f5f5f5f 64 gnu cvtdq2pd (%rcx),%xmm2 -f30fe611|223344556677885f5f5f5f5f 64 intel cvtdq2pd xmm2, qword ptr [rcx] -f30fe611|223344556677885f5f5f5f5f 64 plan9 CVTDQ2PD 0(CX), X2 -f3480f2a11|223344556677885f5f5f5f 64 gnu cvtsi2ssq (%rcx),%xmm2 -f3480f2a11|223344556677885f5f5f5f 64 intel cvtsi2ss xmm2, qword ptr [rcx] -f3480f2a11|223344556677885f5f5f5f 64 plan9 CVTSI2SSQ 0(CX), X2 -f3480f2c11|223344556677885f5f5f5f 64 gnu cvttss2si (%rcx),%rdx -f3480f2c11|223344556677885f5f5f5f 64 intel cvttss2si rdx, dword ptr [rcx] -f3480f2c11|223344556677885f5f5f5f 64 plan9 CVTTSS2SIL 0(CX), DX -f3480f2d11|223344556677885f5f5f5f 64 gnu cvtss2si (%rcx),%rdx -f3480f2d11|223344556677885f5f5f5f 64 intel cvtss2si rdx, dword ptr [rcx] -f3480f2d11|223344556677885f5f5f5f 64 plan9 CVTSS2SIL 0(CX), DX -f3480fae11|223344556677885f5f5f5f 64 gnu wrfsbaseq (%rcx) -f3480fae11|223344556677885f5f5f5f 64 intel wrfsbase qword ptr [rcx] -f3480fae11|223344556677885f5f5f5f 64 plan9 WRFSBASE 0(CX) -f3480fae18|11223344556677885f5f5f 64 gnu wrgsbaseq (%rax) -f3480fae18|11223344556677885f5f5f 64 intel wrgsbase qword ptr [rax] -f3480fae18|11223344556677885f5f5f 64 plan9 WRGSBASE 0(AX) -f3480faec0|11223344556677885f5f5f 64 gnu rdfsbase %rax -f3480faec0|11223344556677885f5f5f 64 intel rdfsbase rax -f3480faec0|11223344556677885f5f5f 64 plan9 RDFSBASE AX -f3480faec8|11223344556677885f5f5f 64 gnu rdgsbase %rax -f3480faec8|11223344556677885f5f5f 64 intel rdgsbase rax -f3480faec8|11223344556677885f5f5f 64 plan9 RDGSBASE AX -f3480fb811|223344556677885f5f5f5f 64 gnu popcnt (%rcx),%rdx -f3480fb811|223344556677885f5f5f5f 64 intel popcnt rdx, qword ptr [rcx] -f3480fb811|223344556677885f5f5f5f 64 plan9 POPCNT 0(CX), DX -f3480fbc11|223344556677885f5f5f5f 64 gnu tzcnt (%rcx),%rdx -f3480fbc11|223344556677885f5f5f5f 64 intel tzcnt rdx, qword ptr [rcx] -f3480fbc11|223344556677885f5f5f5f 64 plan9 TZCNT 0(CX), DX -f3480fbd11|223344556677885f5f5f5f 64 gnu lzcnt (%rcx),%rdx -f3480fbd11|223344556677885f5f5f5f 64 intel lzcnt rdx, qword ptr [rcx] -f3480fbd11|223344556677885f5f5f5f 64 plan9 LZCNT 0(CX), DX -f3660fb811|223344556677885f5f5f5f 32 intel popcnt dx, word ptr [ecx] -f3660fb811|223344556677885f5f5f5f 32 plan9 POPCNT 0(CX), DX -f3660fb811|223344556677885f5f5f5f 64 gnu popcnt (%rcx),%dx -f3660fb811|223344556677885f5f5f5f 64 intel popcnt dx, word ptr [rcx] -f3660fb811|223344556677885f5f5f5f 64 plan9 POPCNT 0(CX), DX -f3660fbc11|223344556677885f5f5f5f 32 intel tzcnt dx, word ptr [ecx] -f3660fbc11|223344556677885f5f5f5f 32 plan9 TZCNT 0(CX), DX -f3660fbc11|223344556677885f5f5f5f 64 gnu tzcnt (%rcx),%dx -f3660fbc11|223344556677885f5f5f5f 64 intel tzcnt dx, word ptr [rcx] -f3660fbc11|223344556677885f5f5f5f 64 plan9 TZCNT 0(CX), DX -f3660fbd11|223344556677885f5f5f5f 32 intel lzcnt dx, word ptr [ecx] -f3660fbd11|223344556677885f5f5f5f 32 plan9 LZCNT 0(CX), DX -f3660fbd11|223344556677885f5f5f5f 64 gnu lzcnt (%rcx),%dx -f3660fbd11|223344556677885f5f5f5f 64 intel lzcnt dx, word ptr [rcx] -f3660fbd11|223344556677885f5f5f5f 64 plan9 LZCNT 0(CX), DX -f3f0673e660f38f111|22334455667788 32 intel lock movbe word ptr [bx+di*1], dx -f3f0673e660f38f111|22334455667788 32 plan9 REP; MOVBE DX, DS:0(BX)(DI*1) -f3f0673e660f38f111|22334455667788 64 gnu rep lock movbe %dx,%ds:(%ecx) -f3f0673e660f38f111|22334455667788 64 intel lock movbe word ptr [ecx], dx -f3f0673e660f38f111|22334455667788 64 plan9 REP; MOVBE DX, 0(CX) -f3f20f2b11|5f5f5f5f5f5f5f5f5f5f5f 32 intel movntsd qword ptr [ecx], xmm2 -f3f20f2b11|5f5f5f5f5f5f5f5f5f5f5f 32 plan9 REP; MOVNTSD X2, 0(CX) -f3f20f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 gnu repn movntss %xmm2,(%rcx) -f3f20f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 intel movntsd qword ptr [rcx], xmm2 -f3f20f2b11|5f5f5f5f5f5f5f5f5f5f5f 64 plan9 REP; MOVNTSD X2, 0(CX) -f4|11223344556677885f5f5f5f5f5f5f 32 intel hlt -f4|11223344556677885f5f5f5f5f5f5f 32 plan9 HLT -f4|11223344556677885f5f5f5f5f5f5f 64 gnu hlt -f4|11223344556677885f5f5f5f5f5f5f 64 intel hlt -f4|11223344556677885f5f5f5f5f5f5f 64 plan9 HLT -f5|11223344556677885f5f5f5f5f5f5f 32 intel cmc -f5|11223344556677885f5f5f5f5f5f5f 32 plan9 CMC -f5|11223344556677885f5f5f5f5f5f5f 64 gnu cmc -f5|11223344556677885f5f5f5f5f5f5f 64 intel cmc -f5|11223344556677885f5f5f5f5f5f5f 64 plan9 CMC -f60011|223344556677885f5f5f5f5f5f 32 intel test byte ptr [eax], 0x11 -f60011|223344556677885f5f5f5f5f5f 32 plan9 TESTB $0x11, 0(AX) -f60011|223344556677885f5f5f5f5f5f 64 gnu testb $0x11,(%rax) -f60011|223344556677885f5f5f5f5f5f 64 intel test byte ptr [rax], 0x11 -f60011|223344556677885f5f5f5f5f5f 64 plan9 TESTB $0x11, 0(AX) -f611|223344556677885f5f5f5f5f5f5f 32 intel not byte ptr [ecx] -f611|223344556677885f5f5f5f5f5f5f 32 plan9 NOTB 0(CX) -f611|223344556677885f5f5f5f5f5f5f 64 gnu notb (%rcx) -f611|223344556677885f5f5f5f5f5f5f 64 intel not byte ptr [rcx] -f611|223344556677885f5f5f5f5f5f5f 64 plan9 NOTB 0(CX) -f618|11223344556677885f5f5f5f5f5f 32 intel neg byte ptr [eax] -f618|11223344556677885f5f5f5f5f5f 32 plan9 NEGB 0(AX) -f618|11223344556677885f5f5f5f5f5f 64 gnu negb (%rax) -f618|11223344556677885f5f5f5f5f5f 64 intel neg byte ptr [rax] -f618|11223344556677885f5f5f5f5f5f 64 plan9 NEGB 0(AX) -f620|11223344556677885f5f5f5f5f5f 32 intel mul byte ptr [eax] -f620|11223344556677885f5f5f5f5f5f 32 plan9 MULB 0(AX) -f620|11223344556677885f5f5f5f5f5f 64 gnu mulb (%rax) -f620|11223344556677885f5f5f5f5f5f 64 intel mul byte ptr [rax] -f620|11223344556677885f5f5f5f5f5f 64 plan9 MULB 0(AX) -f628|11223344556677885f5f5f5f5f5f 32 intel imul byte ptr [eax] -f628|11223344556677885f5f5f5f5f5f 32 plan9 IMULB 0(AX) -f628|11223344556677885f5f5f5f5f5f 64 gnu imulb (%rax) -f628|11223344556677885f5f5f5f5f5f 64 intel imul byte ptr [rax] -f628|11223344556677885f5f5f5f5f5f 64 plan9 IMULB 0(AX) -f630|11223344556677885f5f5f5f5f5f 32 intel div byte ptr [eax] -f630|11223344556677885f5f5f5f5f5f 32 plan9 DIVB 0(AX) -f630|11223344556677885f5f5f5f5f5f 64 gnu divb (%rax) -f630|11223344556677885f5f5f5f5f5f 64 intel div byte ptr [rax] -f630|11223344556677885f5f5f5f5f5f 64 plan9 DIVB 0(AX) -f638|11223344556677885f5f5f5f5f5f 32 intel idiv byte ptr [eax] -f638|11223344556677885f5f5f5f5f5f 32 plan9 IDIVB 0(AX) -f638|11223344556677885f5f5f5f5f5f 64 gnu idivb (%rax) -f638|11223344556677885f5f5f5f5f5f 64 intel idiv byte ptr [rax] -f638|11223344556677885f5f5f5f5f5f 64 plan9 IDIVB 0(AX) -f70011223344|556677885f5f5f5f5f5f 32 intel test dword ptr [eax], 0x44332211 -f70011223344|556677885f5f5f5f5f5f 32 plan9 TESTL $0x44332211, 0(AX) -f70011223344|556677885f5f5f5f5f5f 64 gnu testl $0x44332211,(%rax) -f70011223344|556677885f5f5f5f5f5f 64 intel test dword ptr [rax], 0x44332211 -f70011223344|556677885f5f5f5f5f5f 64 plan9 TESTL $0x44332211, 0(AX) -f711|223344556677885f5f5f5f5f5f5f 32 intel not dword ptr [ecx] -f711|223344556677885f5f5f5f5f5f5f 32 plan9 NOTL 0(CX) -f711|223344556677885f5f5f5f5f5f5f 64 gnu notl (%rcx) -f711|223344556677885f5f5f5f5f5f5f 64 intel not dword ptr [rcx] -f711|223344556677885f5f5f5f5f5f5f 64 plan9 NOTL 0(CX) -f718|11223344556677885f5f5f5f5f5f 32 intel neg dword ptr [eax] -f718|11223344556677885f5f5f5f5f5f 32 plan9 NEGL 0(AX) -f718|11223344556677885f5f5f5f5f5f 64 gnu negl (%rax) -f718|11223344556677885f5f5f5f5f5f 64 intel neg dword ptr [rax] -f718|11223344556677885f5f5f5f5f5f 64 plan9 NEGL 0(AX) -f720|11223344556677885f5f5f5f5f5f 32 intel mul dword ptr [eax] -f720|11223344556677885f5f5f5f5f5f 32 plan9 MULL 0(AX) -f720|11223344556677885f5f5f5f5f5f 64 gnu mull (%rax) -f720|11223344556677885f5f5f5f5f5f 64 intel mul dword ptr [rax] -f720|11223344556677885f5f5f5f5f5f 64 plan9 MULL 0(AX) -f728|11223344556677885f5f5f5f5f5f 32 intel imul dword ptr [eax] -f728|11223344556677885f5f5f5f5f5f 32 plan9 IMULL 0(AX) -f728|11223344556677885f5f5f5f5f5f 64 gnu imull (%rax) -f728|11223344556677885f5f5f5f5f5f 64 intel imul dword ptr [rax] -f728|11223344556677885f5f5f5f5f5f 64 plan9 IMULL 0(AX) -f730|11223344556677885f5f5f5f5f5f 32 intel div dword ptr [eax] -f730|11223344556677885f5f5f5f5f5f 32 plan9 DIVL 0(AX) -f730|11223344556677885f5f5f5f5f5f 64 gnu divl (%rax) -f730|11223344556677885f5f5f5f5f5f 64 intel div dword ptr [rax] -f730|11223344556677885f5f5f5f5f5f 64 plan9 DIVL 0(AX) -f738|11223344556677885f5f5f5f5f5f 32 intel idiv dword ptr [eax] -f738|11223344556677885f5f5f5f5f5f 32 plan9 IDIVL 0(AX) -f738|11223344556677885f5f5f5f5f5f 64 gnu idivl (%rax) -f738|11223344556677885f5f5f5f5f5f 64 intel idiv dword ptr [rax] -f738|11223344556677885f5f5f5f5f5f 64 plan9 IDIVL 0(AX) -f8|11223344556677885f5f5f5f5f5f5f 32 intel clc -f8|11223344556677885f5f5f5f5f5f5f 32 plan9 CLC -f8|11223344556677885f5f5f5f5f5f5f 64 gnu clc -f8|11223344556677885f5f5f5f5f5f5f 64 intel clc -f8|11223344556677885f5f5f5f5f5f5f 64 plan9 CLC -f9|11223344556677885f5f5f5f5f5f5f 32 intel stc -f9|11223344556677885f5f5f5f5f5f5f 32 plan9 STC -f9|11223344556677885f5f5f5f5f5f5f 64 gnu stc -f9|11223344556677885f5f5f5f5f5f5f 64 intel stc -f9|11223344556677885f5f5f5f5f5f5f 64 plan9 STC -fa|11223344556677885f5f5f5f5f5f5f 32 intel cli -fa|11223344556677885f5f5f5f5f5f5f 32 plan9 CLI -fa|11223344556677885f5f5f5f5f5f5f 64 gnu cli -fa|11223344556677885f5f5f5f5f5f5f 64 intel cli -fa|11223344556677885f5f5f5f5f5f5f 64 plan9 CLI -fb|11223344556677885f5f5f5f5f5f5f 32 intel sti -fb|11223344556677885f5f5f5f5f5f5f 32 plan9 STI -fb|11223344556677885f5f5f5f5f5f5f 64 gnu sti -fb|11223344556677885f5f5f5f5f5f5f 64 intel sti -fb|11223344556677885f5f5f5f5f5f5f 64 plan9 STI -fc|11223344556677885f5f5f5f5f5f5f 32 intel cld -fc|11223344556677885f5f5f5f5f5f5f 32 plan9 CLD -fc|11223344556677885f5f5f5f5f5f5f 64 gnu cld -fc|11223344556677885f5f5f5f5f5f5f 64 intel cld -fc|11223344556677885f5f5f5f5f5f5f 64 plan9 CLD -fd|11223344556677885f5f5f5f5f5f5f 32 intel std -fd|11223344556677885f5f5f5f5f5f5f 32 plan9 STD -fd|11223344556677885f5f5f5f5f5f5f 64 gnu std -fd|11223344556677885f5f5f5f5f5f5f 64 intel std -fd|11223344556677885f5f5f5f5f5f5f 64 plan9 STD -fe00|11223344556677885f5f5f5f5f5f 32 intel inc byte ptr [eax] -fe00|11223344556677885f5f5f5f5f5f 32 plan9 INCB 0(AX) -fe00|11223344556677885f5f5f5f5f5f 64 gnu incb (%rax) -fe00|11223344556677885f5f5f5f5f5f 64 intel inc byte ptr [rax] -fe00|11223344556677885f5f5f5f5f5f 64 plan9 INCB 0(AX) -fe08|11223344556677885f5f5f5f5f5f 32 intel dec byte ptr [eax] -fe08|11223344556677885f5f5f5f5f5f 32 plan9 DECB 0(AX) -fe08|11223344556677885f5f5f5f5f5f 64 gnu decb (%rax) -fe08|11223344556677885f5f5f5f5f5f 64 intel dec byte ptr [rax] -fe08|11223344556677885f5f5f5f5f5f 64 plan9 DECB 0(AX) -ff00|11223344556677885f5f5f5f5f5f 32 intel inc dword ptr [eax] -ff00|11223344556677885f5f5f5f5f5f 32 plan9 INCL 0(AX) -ff00|11223344556677885f5f5f5f5f5f 64 gnu incl (%rax) -ff00|11223344556677885f5f5f5f5f5f 64 intel inc dword ptr [rax] -ff00|11223344556677885f5f5f5f5f5f 64 plan9 INCL 0(AX) -ff08|11223344556677885f5f5f5f5f5f 32 intel dec dword ptr [eax] -ff08|11223344556677885f5f5f5f5f5f 32 plan9 DECL 0(AX) -ff08|11223344556677885f5f5f5f5f5f 64 gnu decl (%rax) -ff08|11223344556677885f5f5f5f5f5f 64 intel dec dword ptr [rax] -ff08|11223344556677885f5f5f5f5f5f 64 plan9 DECL 0(AX) -ff11|223344556677885f5f5f5f5f5f5f 32 intel call dword ptr [ecx] -ff11|223344556677885f5f5f5f5f5f5f 32 plan9 CALL 0(CX) -ff18|11223344556677885f5f5f5f5f5f 32 intel call far ptr [eax] -ff18|11223344556677885f5f5f5f5f5f 32 plan9 LCALL 0(AX) -ff18|11223344556677885f5f5f5f5f5f 64 gnu lcallq *(%rax) -ff18|11223344556677885f5f5f5f5f5f 64 intel call far ptr [rax] -ff18|11223344556677885f5f5f5f5f5f 64 plan9 LCALL 0(AX) -ff20|11223344556677885f5f5f5f5f5f 32 intel jmp dword ptr [eax] -ff20|11223344556677885f5f5f5f5f5f 32 plan9 JMP 0(AX) -ff28|11223344556677885f5f5f5f5f5f 32 intel jmp far ptr [eax] -ff28|11223344556677885f5f5f5f5f5f 32 plan9 LJMP 0(AX) -ff28|11223344556677885f5f5f5f5f5f 64 gnu ljmpq *(%rax) -ff28|11223344556677885f5f5f5f5f5f 64 intel jmp far ptr [rax] -ff28|11223344556677885f5f5f5f5f5f 64 plan9 LJMP 0(AX) -ff30|11223344556677885f5f5f5f5f5f 32 intel push dword ptr [eax] -ff30|11223344556677885f5f5f5f5f5f 32 plan9 PUSHL 0(AX) -ff30|11223344556677885f5f5f5f5f5f 64 gnu pushq (%rax) -ff30|11223344556677885f5f5f5f5f5f 64 intel push qword ptr [rax] -ff30|11223344556677885f5f5f5f5f5f 64 plan9 PUSHQ 0(AX) -c5fe6f06|44556677885f5f5f5f5f5f5f 32 intel vmovdqu ymm0, ymmword ptr [esi] -c5fe6f06|44556677885f5f5f5f5f5f5f 32 plan9 VMOVDQU 0(SI), X0 -c5fe6f06|44556677885f5f5f5f5f5f5f 32 gnu vmovdqu (%esi),%ymm0 -c4227d2a0c36|6677885f5f5f5f5f5f5f 64 intel vmovntdqa ymm9, ymmword ptr [rsi+r14*1] -c4227d2a0c36|6677885f5f5f5f5f5f5f 64 plan9 VMOVNTDQA 0(SI)(R14*1), X9 -c4227d2a0c36|6677885f5f5f5f5f5f5f 64 gnu vmovntdqa (%rsi,%r14,1),%ymm9 -c57d7ff7|44556677885f5f5f5f5f5f5f 64 intel vmovdqa ymm7, ymm14 -c57d7ff7|44556677885f5f5f5f5f5f5f 64 plan9 VMOVDQA X14, X7 -c57d7ff7|44556677885f5f5f5f5f5f5f 64 gnu vmovdqa %ymm14,%ymm7 -66f3ab|223344556677885f5f5f5f5f5f 64 gnu rep stos %ax,%es:(%rdi) -66f3ab|223344556677885f5f5f5f5f5f 64 intel rep stosw word ptr [rdi] -66f3ab|223344556677885f5f5f5f5f5f 64 plan9 REP; STOSW AX, ES:0(DI) -f348a5|223344556677885f5f5f5f5f5f 64 gnu rep movsq %ds:(%rsi),%es:(%rdi) -f348a5|223344556677885f5f5f5f5f5f 64 intel rep movsq qword ptr [rdi], qword ptr [rsi] -f348a5|223344556677885f5f5f5f5f5f 64 plan9 REP; MOVSQ DS:0(SI), ES:0(DI) -f348ab|223344556677885f5f5f5f5f5f 64 gnu rep stos %rax,%es:(%rdi) -f348ab|223344556677885f5f5f5f5f5f 64 intel rep stosq qword ptr [rdi] -f348ab|223344556677885f5f5f5f5f5f 64 plan9 REP; STOSQ AX, ES:0(DI) -f3a4|11223344556677885f5f5f5f5f5f 32 gnu rep movsb %ds:(%esi),%es:(%edi) -f3a4|11223344556677885f5f5f5f5f5f 32 gnu rep movsb %ds:(%esi),%es:(%edi) -f3a4|11223344556677885f5f5f5f5f5f 32 intel rep movsb byte ptr [edi], byte ptr [esi] -f3a4|11223344556677885f5f5f5f5f5f 32 plan9 REP; MOVSB DS:0(SI), ES:0(DI) -f3a4|11223344556677885f5f5f5f5f5f 64 gnu rep movsb %ds:(%rsi),%es:(%rdi) -f3a4|11223344556677885f5f5f5f5f5f 64 intel rep movsb byte ptr [rdi], byte ptr [rsi] -f3a4|11223344556677885f5f5f5f5f5f 64 plan9 REP; MOVSB DS:0(SI), ES:0(DI) -f3a5|11223344556677885f5f5f5f5f5f 32 gnu rep movsl %ds:(%esi),%es:(%edi) -f3a5|11223344556677885f5f5f5f5f5f 32 intel rep movsd dword ptr [edi], dword ptr [esi] -f3a5|11223344556677885f5f5f5f5f5f 32 plan9 REP; MOVSD DS:0(SI), ES:0(DI) -f3a5|11223344556677885f5f5f5f5f5f 64 gnu rep movsl %ds:(%rsi),%es:(%rdi) -f3a5|11223344556677885f5f5f5f5f5f 64 intel rep movsd dword ptr [rdi], dword ptr [rsi] -f3a5|11223344556677885f5f5f5f5f5f 64 plan9 REP; MOVSD DS:0(SI), ES:0(DI) -f3a6|11223344556677885f5f5f5f5f5f 64 gnu rep cmpsb %es:(%rdi),%ds:(%rsi) -f3a6|11223344556677885f5f5f5f5f5f 64 intel rep cmpsb byte ptr [rsi], byte ptr [rdi] -f3a6|11223344556677885f5f5f5f5f5f 64 plan9 REP; CMPSB ES:0(DI), DS:0(SI) -f3ab|11223344556677885f5f5f5f5f5f 32 gnu rep stos %eax,%es:(%edi) -f3ab|11223344556677885f5f5f5f5f5f 32 intel rep stosd dword ptr [edi] -f3ab|11223344556677885f5f5f5f5f5f 32 plan9 REP; STOSD AX, ES:0(DI) -f201c1|223344556677885f5f5f5f5f5f 64 plan9 REPNE; ADDL AX, CX diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/libmach8db.c b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/libmach8db.c deleted file mode 100644 index 90ace5241d..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/testdata/libmach8db.c +++ /dev/null @@ -1,2075 +0,0 @@ -// 9c libmach8db.c && 9l -o libmach8db libmach8db.o; rm libmach8db.o - -// Libmach-based disassembler for use in reference tests. - -// Inferno libmach/8db.c -// http://code.google.com/p/inferno-os/source/browse/utils/libmach/8db.c -// -// Copyright © 1994-1999 Lucent Technologies Inc. -// Power PC support Copyright © 1995-2004 C H Forsyth (forsyth@terzarima.net). -// Portions Copyright © 1997-1999 Vita Nuova Limited. -// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). -// Revisions Copyright © 2000-2004 Lucent Technologies Inc. and others. -// Portions Copyright © 2009 The Go Authors. All rights reserved. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -#include -#include -#include - -typedef struct Map Map; -struct Map -{ - int (*get1)(Map*, uvlong, uchar*, int); - uchar *p; - uchar *ep; - uchar *startp; - uvlong startpc; -}; - -static int -get1(Map *m, uvlong addr, uchar *p, int n) -{ - return m->get1(m, addr, p, n); -} - -/* - * i386-specific debugger interface - * also amd64 extensions - */ - -static int i386inst(Map*, uvlong, int, char, char*, int); -//static int i386das(Map*, uvlong, char*, int); -//static int i386instlen(Map*, uvlong); - - /* I386/486 - Disassembler and related functions */ - -/* - * an instruction - */ -typedef struct Instr Instr; -struct Instr -{ - uchar mem[1+1+1+1+2+1+1+4+4]; /* raw instruction */ - uvlong addr; /* address of start of instruction */ - int n; /* number of bytes in instruction */ - char *prefix; /* instr prefix */ - char *segment; /* segment override */ - uchar jumptype; /* set to the operand type for jump/ret/call */ - uchar amd64; - uchar rex; /* REX prefix (or zero) */ - uchar op; - char osize; /* 'W' or 'L' (or 'Q' on amd64) */ - char asize; /* address size 'W' or 'L' (or 'Q' or amd64) */ - uchar mod; /* bits 6-7 of mod r/m field */ - uchar reg; /* bits 3-5 of mod r/m field */ - char ss; /* bits 6-7 of SIB */ - schar index; /* bits 3-5 of SIB */ - schar base; /* bits 0-2 of SIB */ - char rip; /* RIP-relative in amd64 mode */ - uchar opre; /* f2/f3 could introduce media */ - short seg; /* segment of far address */ - uint32 disp; /* displacement */ - uint32 imm; /* immediate */ - uint32 imm2; /* second immediate operand */ - uvlong imm64; /* big immediate */ - char *curr; /* fill level in output buffer */ - char *end; /* end of output buffer */ - char *err; /* error message */ -}; - - /* 386 register (ha!) set */ -enum{ - AX=0, - CX, - DX, - BX, - SP, - BP, - SI, - DI, - - /* amd64 */ - /* be careful: some unix system headers #define R8, R9, etc */ - AMD64_R8, - AMD64_R9, - AMD64_R10, - AMD64_R11, - AMD64_R12, - AMD64_R13, - AMD64_R14, - AMD64_R15 -}; - - /* amd64 rex extension byte */ -enum{ - REXW = 1<<3, /* =1, 64-bit operand size */ - REXR = 1<<2, /* extend modrm reg */ - REXX = 1<<1, /* extend sib index */ - REXB = 1<<0 /* extend modrm r/m, sib base, or opcode reg */ -}; - - /* Operand Format codes */ -/* -%A - address size register modifier (!asize -> 'E') -%C - Control register CR0/CR1/CR2 -%D - Debug register DR0/DR1/DR2/DR3/DR6/DR7 -%I - second immediate operand -%O - Operand size register modifier (!osize -> 'E') -%T - Test register TR6/TR7 -%S - size code ('W' or 'L') -%W - Weird opcode: OSIZE == 'W' => "CBW"; else => "CWDE" -%d - displacement 16-32 bits -%e - effective address - Mod R/M value -%f - floating point register F0-F7 - from Mod R/M register -%g - segment register -%i - immediate operand 8-32 bits -%o - register from opcode and REX.B -%p - PC-relative - signed displacement in immediate field -%r - Reg from Mod R/M -%w - Weird opcode: OSIZE == 'W' => "CWD"; else => "CDQ" -*/ - -typedef struct Optable Optable; -struct Optable -{ - char operand[2]; - void *proto; /* actually either (char*) or (Optable*) */ -}; - /* Operand decoding codes */ -enum { - Ib = 1, /* 8-bit immediate - (no sign extension)*/ - Ibs, /* 8-bit immediate (sign extended) */ - Jbs, /* 8-bit sign-extended immediate in jump or call */ - Iw, /* 16-bit immediate -> imm */ - Iw2, /* 16-bit immediate -> imm2 */ - Iwd, /* Operand-sized immediate (no sign extension)*/ - Iwdq, /* Operand-sized immediate, possibly 64 bits */ - Awd, /* Address offset */ - Iwds, /* Operand-sized immediate (sign extended) */ - RM, /* Word or int32 R/M field with register (/r) */ - RMB, /* Byte R/M field with register (/r) */ - RMOP, /* Word or int32 R/M field with op code (/digit) */ - RMOPB, /* Byte R/M field with op code (/digit) */ - RMR, /* R/M register only (mod = 11) */ - RMM, /* R/M memory only (mod = 0/1/2) */ - Op_R0, /* Base reg of Mod R/M is literal 0x00 */ - Op_R1, /* Base reg of Mod R/M is literal 0x01 */ - FRMOP, /* Floating point R/M field with opcode */ - FRMEX, /* Extended floating point R/M field with opcode */ - JUMP, /* Jump or Call flag - no operand */ - RET, /* Return flag - no operand */ - OA, /* literal 0x0a byte */ - PTR, /* Seg:Displacement addr (ptr16:16 or ptr16:32) */ - AUX, /* Multi-byte op code - Auxiliary table */ - AUXMM, /* multi-byte op code - auxiliary table chosen by prefix */ - PRE, /* Instr Prefix */ - OPRE, /* Instr Prefix or media op extension */ - SEG, /* Segment Prefix */ - OPOVER, /* Operand size override */ - ADDOVER, /* Address size override */ -}; - -static Optable optab0F00[8]= -{ -[0x00] = { 0,0, "MOVW LDT,%e" }, -[0x01] = { 0,0, "MOVW TR,%e" }, -[0x02] = { 0,0, "MOVW %e,LDT" }, -[0x03] = { 0,0, "MOVW %e,TR" }, -[0x04] = { 0,0, "VERR %e" }, -[0x05] = { 0,0, "VERW %e" }, -}; - -static Optable optab0F01[8]= -{ -[0x00] = { 0,0, "MOVL GDTR,%e" }, -[0x01] = { 0,0, "MOVL IDTR,%e" }, -[0x02] = { 0,0, "MOVL %e,GDTR" }, -[0x03] = { 0,0, "MOVL %e,IDTR" }, -[0x04] = { 0,0, "MOVW MSW,%e" }, /* word */ -[0x06] = { 0,0, "MOVW %e,MSW" }, /* word */ -[0x07] = { 0,0, "INVLPG %e" }, /* or SWAPGS */ -}; - -static Optable optab0F01F8[1]= -{ -[0x00] = { 0,0, "SWAPGS" }, -}; - -/* 0F71 */ -/* 0F72 */ -/* 0F73 */ - -static Optable optab0FAE[8]= -{ -[0x00] = { 0,0, "FXSAVE %e" }, -[0x01] = { 0,0, "FXRSTOR %e" }, -[0x02] = { 0,0, "LDMXCSR %e" }, -[0x03] = { 0,0, "STMXCSR %e" }, -[0x05] = { 0,0, "LFENCE" }, -[0x06] = { 0,0, "MFENCE" }, -[0x07] = { 0,0, "SFENCE" }, -}; - -/* 0F18 */ -/* 0F0D */ - -static Optable optab0FBA[8]= -{ -[0x04] = { Ib,0, "BT%S %i,%e" }, -[0x05] = { Ib,0, "BTS%S %i,%e" }, -[0x06] = { Ib,0, "BTR%S %i,%e" }, -[0x07] = { Ib,0, "BTC%S %i,%e" }, -}; - -static Optable optab0F0F[256]= -{ -[0x0c] = { 0,0, "PI2FW %m,%M" }, -[0x0d] = { 0,0, "PI2L %m,%M" }, -[0x1c] = { 0,0, "PF2IW %m,%M" }, -[0x1d] = { 0,0, "PF2IL %m,%M" }, -[0x8a] = { 0,0, "PFNACC %m,%M" }, -[0x8e] = { 0,0, "PFPNACC %m,%M" }, -[0x90] = { 0,0, "PFCMPGE %m,%M" }, -[0x94] = { 0,0, "PFMIN %m,%M" }, -[0x96] = { 0,0, "PFRCP %m,%M" }, -[0x97] = { 0,0, "PFRSQRT %m,%M" }, -[0x9a] = { 0,0, "PFSUB %m,%M" }, -[0x9e] = { 0,0, "PFADD %m,%M" }, -[0xa0] = { 0,0, "PFCMPGT %m,%M" }, -[0xa4] = { 0,0, "PFMAX %m,%M" }, -[0xa6] = { 0,0, "PFRCPIT1 %m,%M" }, -[0xa7] = { 0,0, "PFRSQIT1 %m,%M" }, -[0xaa] = { 0,0, "PFSUBR %m,%M" }, -[0xae] = { 0,0, "PFACC %m,%M" }, -[0xb0] = { 0,0, "PFCMPEQ %m,%M" }, -[0xb4] = { 0,0, "PFMUL %m,%M" }, -[0xb6] = { 0,0, "PFRCPI2T %m,%M" }, -[0xb7] = { 0,0, "PMULHRW %m,%M" }, -[0xbb] = { 0,0, "PSWAPL %m,%M" }, -}; - -static Optable optab0FC7[8]= -{ -[0x01] = { 0,0, "CMPXCHG8B %e" }, -}; - -static Optable optab660F71[8]= -{ -[0x02] = { Ib,0, "PSRLW %i,%X" }, -[0x04] = { Ib,0, "PSRAW %i,%X" }, -[0x06] = { Ib,0, "PSLLW %i,%X" }, -}; - -static Optable optab660F72[8]= -{ -[0x02] = { Ib,0, "PSRLL %i,%X" }, -[0x04] = { Ib,0, "PSRAL %i,%X" }, -[0x06] = { Ib,0, "PSLLL %i,%X" }, -}; - -static Optable optab660F73[8]= -{ -[0x02] = { Ib,0, "PSRLQ %i,%X" }, -[0x03] = { Ib,0, "PSRLO %i,%X" }, -[0x06] = { Ib,0, "PSLLQ %i,%X" }, -[0x07] = { Ib,0, "PSLLO %i,%X" }, -}; - -static Optable optab660F[256]= -{ -[0x2B] = { RM,0, "MOVNTPD %x,%e" }, -[0x2E] = { RM,0, "UCOMISD %x,%X" }, -[0x2F] = { RM,0, "COMISD %x,%X" }, -[0x5A] = { RM,0, "CVTPD2PS %x,%X" }, -[0x5B] = { RM,0, "CVTPS2PL %x,%X" }, -[0x6A] = { RM,0, "PUNPCKHLQ %x,%X" }, -[0x6B] = { RM,0, "PACKSSLW %x,%X" }, -[0x6C] = { RM,0, "PUNPCKLQDQ %x,%X" }, -[0x6D] = { RM,0, "PUNPCKHQDQ %x,%X" }, -[0x6E] = { RM,0, "MOV%S %e,%X" }, -[0x6F] = { RM,0, "MOVO %x,%X" }, /* MOVDQA */ -[0x70] = { RM,Ib, "PSHUFL %i,%x,%X" }, -[0x71] = { RMOP,0, optab660F71 }, -[0x72] = { RMOP,0, optab660F72 }, -[0x73] = { RMOP,0, optab660F73 }, -[0x7E] = { RM,0, "MOV%S %X,%e" }, -[0x7F] = { RM,0, "MOVO %X,%x" }, -[0xC4] = { RM,Ib, "PINSRW %i,%e,%X" }, -[0xC5] = { RMR,Ib, "PEXTRW %i,%X,%e" }, -[0xD4] = { RM,0, "PADDQ %x,%X" }, -[0xD5] = { RM,0, "PMULLW %x,%X" }, -[0xD6] = { RM,0, "MOVQ %X,%x" }, -[0xE6] = { RM,0, "CVTTPD2PL %x,%X" }, -[0xE7] = { RM,0, "MOVNTO %X,%e" }, -[0xF7] = { RM,0, "MASKMOVOU %x,%X" }, -}; - -static Optable optabF20F[256]= -{ -[0x10] = { RM,0, "MOVSD %x,%X" }, -[0x11] = { RM,0, "MOVSD %X,%x" }, -[0x2A] = { RM,0, "CVTS%S2SD %e,%X" }, -[0x2C] = { RM,0, "CVTTSD2S%S %x,%r" }, -[0x2D] = { RM,0, "CVTSD2S%S %x,%r" }, -[0x5A] = { RM,0, "CVTSD2SS %x,%X" }, -[0x6F] = { RM,0, "MOVOU %x,%X" }, -[0x70] = { RM,Ib, "PSHUFLW %i,%x,%X" }, -[0x7F] = { RM,0, "MOVOU %X,%x" }, -[0xD6] = { RM,0, "MOVQOZX %M,%X" }, -[0xE6] = { RM,0, "CVTPD2PL %x,%X" }, -}; - -static Optable optabF30F[256]= -{ -[0x10] = { RM,0, "MOVSS %x,%X" }, -[0x11] = { RM,0, "MOVSS %X,%x" }, -[0x2A] = { RM,0, "CVTS%S2SS %e,%X" }, -[0x2C] = { RM,0, "CVTTSS2S%S %x,%r" }, -[0x2D] = { RM,0, "CVTSS2S%S %x,%r" }, -[0x5A] = { RM,0, "CVTSS2SD %x,%X" }, -[0x5B] = { RM,0, "CVTTPS2PL %x,%X" }, -[0x6F] = { RM,0, "MOVOU %x,%X" }, -[0x70] = { RM,Ib, "PSHUFHW %i,%x,%X" }, -[0x7E] = { RM,0, "MOVQOZX %x,%X" }, -[0x7F] = { RM,0, "MOVOU %X,%x" }, -[0xD6] = { RM,0, "MOVQOZX %m*,%X" }, -[0xE6] = { RM,0, "CVTPL2PD %x,%X" }, -}; - -static Optable optab0F[256]= -{ -[0x00] = { RMOP,0, optab0F00 }, -[0x01] = { RMOP,0, optab0F01 }, -[0x02] = { RM,0, "LAR %e,%r" }, -[0x03] = { RM,0, "LSL %e,%r" }, -[0x05] = { 0,0, "SYSCALL" }, -[0x06] = { 0,0, "CLTS" }, -[0x07] = { 0,0, "SYSRET" }, -[0x08] = { 0,0, "INVD" }, -[0x09] = { 0,0, "WBINVD" }, -[0x0B] = { 0,0, "UD2" }, -[0x0F] = { RM,AUX, optab0F0F }, /* 3DNow! */ -[0x10] = { RM,0, "MOVU%s %x,%X" }, -[0x11] = { RM,0, "MOVU%s %X,%x" }, -[0x12] = { RM,0, "MOV[H]L%s %x,%X" }, /* TO DO: H if source is XMM */ -[0x13] = { RM,0, "MOVL%s %X,%e" }, -[0x14] = { RM,0, "UNPCKL%s %x,%X" }, -[0x15] = { RM,0, "UNPCKH%s %x,%X" }, -[0x16] = { RM,0, "MOV[L]H%s %x,%X" }, /* TO DO: L if source is XMM */ -[0x17] = { RM,0, "MOVH%s %X,%x" }, -[0x1F] = { RM,0, "NOP%S %e" }, -[0x20] = { RMR,0, "MOVL %C,%e" }, -[0x21] = { RMR,0, "MOVL %D,%e" }, -[0x22] = { RMR,0, "MOVL %e,%C" }, -[0x23] = { RMR,0, "MOVL %e,%D" }, -[0x24] = { RMR,0, "MOVL %T,%e" }, -[0x26] = { RMR,0, "MOVL %e,%T" }, -[0x28] = { RM,0, "MOVA%s %x,%X" }, -[0x29] = { RM,0, "MOVA%s %X,%x" }, -[0x2A] = { RM,0, "CVTPL2%s %m*,%X" }, -[0x2B] = { RM,0, "MOVNT%s %X,%e" }, -[0x2C] = { RM,0, "CVTT%s2PL %x,%M" }, -[0x2D] = { RM,0, "CVT%s2PL %x,%M" }, -[0x2E] = { RM,0, "UCOMISS %x,%X" }, -[0x2F] = { RM,0, "COMISS %x,%X" }, -[0x30] = { 0,0, "WRMSR" }, -[0x31] = { 0,0, "RDTSC" }, -[0x32] = { 0,0, "RDMSR" }, -[0x33] = { 0,0, "RDPMC" }, -[0x42] = { RM,0, "CMOVC %e,%r" }, /* CF */ -[0x43] = { RM,0, "CMOVNC %e,%r" }, /* ¬ CF */ -[0x44] = { RM,0, "CMOVZ %e,%r" }, /* ZF */ -[0x45] = { RM,0, "CMOVNZ %e,%r" }, /* ¬ ZF */ -[0x46] = { RM,0, "CMOVBE %e,%r" }, /* CF ∨ ZF */ -[0x47] = { RM,0, "CMOVA %e,%r" }, /* ¬CF ∧ ¬ZF */ -[0x48] = { RM,0, "CMOVS %e,%r" }, /* SF */ -[0x49] = { RM,0, "CMOVNS %e,%r" }, /* ¬ SF */ -[0x4A] = { RM,0, "CMOVP %e,%r" }, /* PF */ -[0x4B] = { RM,0, "CMOVNP %e,%r" }, /* ¬ PF */ -[0x4C] = { RM,0, "CMOVLT %e,%r" }, /* LT ≡ OF ≠ SF */ -[0x4D] = { RM,0, "CMOVGE %e,%r" }, /* GE ≡ ZF ∨ SF */ -[0x4E] = { RM,0, "CMOVLE %e,%r" }, /* LE ≡ ZF ∨ LT */ -[0x4F] = { RM,0, "CMOVGT %e,%r" }, /* GT ≡ ¬ZF ∧ GE */ -[0x50] = { RM,0, "MOVMSK%s %X,%r" }, /* TO DO: check */ -[0x51] = { RM,0, "SQRT%s %x,%X" }, -[0x52] = { RM,0, "RSQRT%s %x,%X" }, -[0x53] = { RM,0, "RCP%s %x,%X" }, -[0x54] = { RM,0, "AND%s %x,%X" }, -[0x55] = { RM,0, "ANDN%s %x,%X" }, -[0x56] = { RM,0, "OR%s %x,%X" }, /* TO DO: S/D */ -[0x57] = { RM,0, "XOR%s %x,%X" }, /* S/D */ -[0x58] = { RM,0, "ADD%s %x,%X" }, /* S/P S/D */ -[0x59] = { RM,0, "MUL%s %x,%X" }, -[0x5A] = { RM,0, "CVTPS2PD %x,%X" }, -[0x5B] = { RM,0, "CVTPL2PS %x,%X" }, -[0x5C] = { RM,0, "SUB%s %x,%X" }, -[0x5D] = { RM,0, "MIN%s %x,%X" }, -[0x5E] = { RM,0, "DIV%s %x,%X" }, /* TO DO: S/P S/D */ -[0x5F] = { RM,0, "MAX%s %x,%X" }, -[0x60] = { RM,0, "PUNPCKLBW %m,%M" }, -[0x61] = { RM,0, "PUNPCKLWL %m,%M" }, -[0x62] = { RM,0, "PUNPCKLLQ %m,%M" }, -[0x63] = { RM,0, "PACKSSWB %m,%M" }, -[0x64] = { RM,0, "PCMPGTB %m,%M" }, -[0x65] = { RM,0, "PCMPGTW %m,%M" }, -[0x66] = { RM,0, "PCMPGTL %m,%M" }, -[0x67] = { RM,0, "PACKUSWB %m,%M" }, -[0x68] = { RM,0, "PUNPCKHBW %m,%M" }, -[0x69] = { RM,0, "PUNPCKHWL %m,%M" }, -[0x6A] = { RM,0, "PUNPCKHLQ %m,%M" }, -[0x6B] = { RM,0, "PACKSSLW %m,%M" }, -[0x6E] = { RM,0, "MOV%S %e,%M" }, -[0x6F] = { RM,0, "MOVQ %m,%M" }, -[0x70] = { RM,Ib, "PSHUFW %i,%m,%M" }, -[0x74] = { RM,0, "PCMPEQB %m,%M" }, -[0x75] = { RM,0, "PCMPEQW %m,%M" }, -[0x76] = { RM,0, "PCMPEQL %m,%M" }, -[0x77] = { 0,0, "EMMS" }, -[0x7E] = { RM,0, "MOV%S %M,%e" }, -[0x7F] = { RM,0, "MOVQ %M,%m" }, -[0xAE] = { RMOP,0, optab0FAE }, -[0xAA] = { 0,0, "RSM" }, -[0xB0] = { RM,0, "CMPXCHGB %r,%e" }, -[0xB1] = { RM,0, "CMPXCHG%S %r,%e" }, -[0xC0] = { RMB,0, "XADDB %r,%e" }, -[0xC1] = { RM,0, "XADD%S %r,%e" }, -[0xC2] = { RM,Ib, "CMP%s %x,%X,%#i" }, -[0xC3] = { RM,0, "MOVNTI%S %r,%e" }, -[0xC6] = { RM,Ib, "SHUF%s %i,%x,%X" }, -[0xC8] = { 0,0, "BSWAP AX" }, -[0xC9] = { 0,0, "BSWAP CX" }, -[0xCA] = { 0,0, "BSWAP DX" }, -[0xCB] = { 0,0, "BSWAP BX" }, -[0xCC] = { 0,0, "BSWAP SP" }, -[0xCD] = { 0,0, "BSWAP BP" }, -[0xCE] = { 0,0, "BSWAP SI" }, -[0xCF] = { 0,0, "BSWAP DI" }, -[0xD1] = { RM,0, "PSRLW %m,%M" }, -[0xD2] = { RM,0, "PSRLL %m,%M" }, -[0xD3] = { RM,0, "PSRLQ %m,%M" }, -[0xD5] = { RM,0, "PMULLW %m,%M" }, -[0xD6] = { RM,0, "MOVQOZX %m*,%X" }, -[0xD7] = { RM,0, "PMOVMSKB %m,%r" }, -[0xD8] = { RM,0, "PSUBUSB %m,%M" }, -[0xD9] = { RM,0, "PSUBUSW %m,%M" }, -[0xDA] = { RM,0, "PMINUB %m,%M" }, -[0xDB] = { RM,0, "PAND %m,%M" }, -[0xDC] = { RM,0, "PADDUSB %m,%M" }, -[0xDD] = { RM,0, "PADDUSW %m,%M" }, -[0xDE] = { RM,0, "PMAXUB %m,%M" }, -[0xDF] = { RM,0, "PANDN %m,%M" }, -[0xE0] = { RM,0, "PAVGB %m,%M" }, -[0xE1] = { RM,0, "PSRAW %m,%M" }, -[0xE2] = { RM,0, "PSRAL %m,%M" }, -[0xE3] = { RM,0, "PAVGW %m,%M" }, -[0xE4] = { RM,0, "PMULHUW %m,%M" }, -[0xE5] = { RM,0, "PMULHW %m,%M" }, -[0xE7] = { RM,0, "MOVNTQ %M,%e" }, -[0xE8] = { RM,0, "PSUBSB %m,%M" }, -[0xE9] = { RM,0, "PSUBSW %m,%M" }, -[0xEA] = { RM,0, "PMINSW %m,%M" }, -[0xEB] = { RM,0, "POR %m,%M" }, -[0xEC] = { RM,0, "PADDSB %m,%M" }, -[0xED] = { RM,0, "PADDSW %m,%M" }, -[0xEE] = { RM,0, "PMAXSW %m,%M" }, -[0xEF] = { RM,0, "PXOR %m,%M" }, -[0xF1] = { RM,0, "PSLLW %m,%M" }, -[0xF2] = { RM,0, "PSLLL %m,%M" }, -[0xF3] = { RM,0, "PSLLQ %m,%M" }, -[0xF4] = { RM,0, "PMULULQ %m,%M" }, -[0xF5] = { RM,0, "PMADDWL %m,%M" }, -[0xF6] = { RM,0, "PSADBW %m,%M" }, -[0xF7] = { RMR,0, "MASKMOVQ %m,%M" }, -[0xF8] = { RM,0, "PSUBB %m,%M" }, -[0xF9] = { RM,0, "PSUBW %m,%M" }, -[0xFA] = { RM,0, "PSUBL %m,%M" }, -[0xFC] = { RM,0, "PADDB %m,%M" }, -[0xFD] = { RM,0, "PADDW %m,%M" }, -[0xFE] = { RM,0, "PADDL %m,%M" }, - -[0x80] = { Iwds,0, "JOS %p" }, -[0x81] = { Iwds,0, "JOC %p" }, -[0x82] = { Iwds,0, "JCS %p" }, -[0x83] = { Iwds,0, "JCC %p" }, -[0x84] = { Iwds,0, "JEQ %p" }, -[0x85] = { Iwds,0, "JNE %p" }, -[0x86] = { Iwds,0, "JLS %p" }, -[0x87] = { Iwds,0, "JHI %p" }, -[0x88] = { Iwds,0, "JMI %p" }, -[0x89] = { Iwds,0, "JPL %p" }, -[0x8a] = { Iwds,0, "JPS %p" }, -[0x8b] = { Iwds,0, "JPC %p" }, -[0x8c] = { Iwds,0, "JLT %p" }, -[0x8d] = { Iwds,0, "JGE %p" }, -[0x8e] = { Iwds,0, "JLE %p" }, -[0x8f] = { Iwds,0, "JGT %p" }, -[0x90] = { RMB,0, "SETOS %e" }, -[0x91] = { RMB,0, "SETOC %e" }, -[0x92] = { RMB,0, "SETCS %e" }, -[0x93] = { RMB,0, "SETCC %e" }, -[0x94] = { RMB,0, "SETEQ %e" }, -[0x95] = { RMB,0, "SETNE %e" }, -[0x96] = { RMB,0, "SETLS %e" }, -[0x97] = { RMB,0, "SETHI %e" }, -[0x98] = { RMB,0, "SETMI %e" }, -[0x99] = { RMB,0, "SETPL %e" }, -[0x9a] = { RMB,0, "SETPS %e" }, -[0x9b] = { RMB,0, "SETPC %e" }, -[0x9c] = { RMB,0, "SETLT %e" }, -[0x9d] = { RMB,0, "SETGE %e" }, -[0x9e] = { RMB,0, "SETLE %e" }, -[0x9f] = { RMB,0, "SETGT %e" }, -[0xa0] = { 0,0, "PUSHL FS" }, -[0xa1] = { 0,0, "POPL FS" }, -[0xa2] = { 0,0, "CPUID" }, -[0xa3] = { RM,0, "BT%S %r,%e" }, -[0xa4] = { RM,Ib, "SHLD%S %r,%i,%e" }, -[0xa5] = { RM,0, "SHLD%S %r,CL,%e" }, -[0xa8] = { 0,0, "PUSHL GS" }, -[0xa9] = { 0,0, "POPL GS" }, -[0xab] = { RM,0, "BTS%S %r,%e" }, -[0xac] = { RM,Ib, "SHRD%S %r,%i,%e" }, -[0xad] = { RM,0, "SHRD%S %r,CL,%e" }, -[0xaf] = { RM,0, "IMUL%S %e,%r" }, -[0xb2] = { RMM,0, "LSS %e,%r" }, -[0xb3] = { RM,0, "BTR%S %r,%e" }, -[0xb4] = { RMM,0, "LFS %e,%r" }, -[0xb5] = { RMM,0, "LGS %e,%r" }, -[0xb6] = { RMB,0, "MOVBZX %e,%R" }, -[0xb7] = { RM,0, "MOVWZX %e,%R" }, -[0xba] = { RMOP,0, optab0FBA }, -[0xbb] = { RM,0, "BTC%S %e,%r" }, -[0xbc] = { RM,0, "BSF%S %e,%r" }, -[0xbd] = { RM,0, "BSR%S %e,%r" }, -[0xbe] = { RMB,0, "MOVBSX %e,%R" }, -[0xbf] = { RM,0, "MOVWSX %e,%R" }, -[0xc7] = { RMOP,0, optab0FC7 }, -}; - -static Optable optab80[8]= -{ -[0x00] = { Ib,0, "ADDB %i,%e" }, -[0x01] = { Ib,0, "ORB %i,%e" }, -[0x02] = { Ib,0, "ADCB %i,%e" }, -[0x03] = { Ib,0, "SBBB %i,%e" }, -[0x04] = { Ib,0, "ANDB %i,%e" }, -[0x05] = { Ib,0, "SUBB %i,%e" }, -[0x06] = { Ib,0, "XORB %i,%e" }, -[0x07] = { Ib,0, "CMPB %e,%i" }, -}; - -static Optable optab81[8]= -{ -[0x00] = { Iwd,0, "ADD%S %i,%e" }, -[0x01] = { Iwd,0, "OR%S %i,%e" }, -[0x02] = { Iwd,0, "ADC%S %i,%e" }, -[0x03] = { Iwd,0, "SBB%S %i,%e" }, -[0x04] = { Iwd,0, "AND%S %i,%e" }, -[0x05] = { Iwd,0, "SUB%S %i,%e" }, -[0x06] = { Iwd,0, "XOR%S %i,%e" }, -[0x07] = { Iwd,0, "CMP%S %e,%i" }, -}; - -static Optable optab83[8]= -{ -[0x00] = { Ibs,0, "ADD%S %i,%e" }, -[0x01] = { Ibs,0, "OR%S %i,%e" }, -[0x02] = { Ibs,0, "ADC%S %i,%e" }, -[0x03] = { Ibs,0, "SBB%S %i,%e" }, -[0x04] = { Ibs,0, "AND%S %i,%e" }, -[0x05] = { Ibs,0, "SUB%S %i,%e" }, -[0x06] = { Ibs,0, "XOR%S %i,%e" }, -[0x07] = { Ibs,0, "CMP%S %e,%i" }, -}; - -static Optable optabC0[8] = -{ -[0x00] = { Ib,0, "ROLB %i,%e" }, -[0x01] = { Ib,0, "RORB %i,%e" }, -[0x02] = { Ib,0, "RCLB %i,%e" }, -[0x03] = { Ib,0, "RCRB %i,%e" }, -[0x04] = { Ib,0, "SHLB %i,%e" }, -[0x05] = { Ib,0, "SHRB %i,%e" }, -[0x07] = { Ib,0, "SARB %i,%e" }, -}; - -static Optable optabC1[8] = -{ -[0x00] = { Ib,0, "ROL%S %i,%e" }, -[0x01] = { Ib,0, "ROR%S %i,%e" }, -[0x02] = { Ib,0, "RCL%S %i,%e" }, -[0x03] = { Ib,0, "RCR%S %i,%e" }, -[0x04] = { Ib,0, "SHL%S %i,%e" }, -[0x05] = { Ib,0, "SHR%S %i,%e" }, -[0x07] = { Ib,0, "SAR%S %i,%e" }, -}; - -static Optable optabD0[8] = -{ -[0x00] = { 0,0, "ROLB %e" }, -[0x01] = { 0,0, "RORB %e" }, -[0x02] = { 0,0, "RCLB %e" }, -[0x03] = { 0,0, "RCRB %e" }, -[0x04] = { 0,0, "SHLB %e" }, -[0x05] = { 0,0, "SHRB %e" }, -[0x07] = { 0,0, "SARB %e" }, -}; - -static Optable optabD1[8] = -{ -[0x00] = { 0,0, "ROL%S %e" }, -[0x01] = { 0,0, "ROR%S %e" }, -[0x02] = { 0,0, "RCL%S %e" }, -[0x03] = { 0,0, "RCR%S %e" }, -[0x04] = { 0,0, "SHL%S %e" }, -[0x05] = { 0,0, "SHR%S %e" }, -[0x07] = { 0,0, "SAR%S %e" }, -}; - -static Optable optabD2[8] = -{ -[0x00] = { 0,0, "ROLB CL,%e" }, -[0x01] = { 0,0, "RORB CL,%e" }, -[0x02] = { 0,0, "RCLB CL,%e" }, -[0x03] = { 0,0, "RCRB CL,%e" }, -[0x04] = { 0,0, "SHLB CL,%e" }, -[0x05] = { 0,0, "SHRB CL,%e" }, -[0x07] = { 0,0, "SARB CL,%e" }, -}; - -static Optable optabD3[8] = -{ -[0x00] = { 0,0, "ROL%S CL,%e" }, -[0x01] = { 0,0, "ROR%S CL,%e" }, -[0x02] = { 0,0, "RCL%S CL,%e" }, -[0x03] = { 0,0, "RCR%S CL,%e" }, -[0x04] = { 0,0, "SHL%S CL,%e" }, -[0x05] = { 0,0, "SHR%S CL,%e" }, -[0x07] = { 0,0, "SAR%S CL,%e" }, -}; - -static Optable optabD8[8+8] = -{ -[0x00] = { 0,0, "FADDF %e,F0" }, -[0x01] = { 0,0, "FMULF %e,F0" }, -[0x02] = { 0,0, "FCOMF %e,F0" }, -[0x03] = { 0,0, "FCOMFP %e,F0" }, -[0x04] = { 0,0, "FSUBF %e,F0" }, -[0x05] = { 0,0, "FSUBRF %e,F0" }, -[0x06] = { 0,0, "FDIVF %e,F0" }, -[0x07] = { 0,0, "FDIVRF %e,F0" }, -[0x08] = { 0,0, "FADDD %f,F0" }, -[0x09] = { 0,0, "FMULD %f,F0" }, -[0x0a] = { 0,0, "FCOMD %f,F0" }, -[0x0b] = { 0,0, "FCOMPD %f,F0" }, -[0x0c] = { 0,0, "FSUBD %f,F0" }, -[0x0d] = { 0,0, "FSUBRD %f,F0" }, -[0x0e] = { 0,0, "FDIVD %f,F0" }, -[0x0f] = { 0,0, "FDIVRD %f,F0" }, -}; -/* - * optabD9 and optabDB use the following encoding: - * if (0 <= modrm <= 2) instruction = optabDx[modrm&0x07]; - * else instruction = optabDx[(modrm&0x3f)+8]; - * - * the instructions for MOD == 3, follow the 8 instructions - * for the other MOD values stored at the front of the table. - */ -static Optable optabD9[64+8] = -{ -[0x00] = { 0,0, "FMOVF %e,F0" }, -[0x02] = { 0,0, "FMOVF F0,%e" }, -[0x03] = { 0,0, "FMOVFP F0,%e" }, -[0x04] = { 0,0, "FLDENV%S %e" }, -[0x05] = { 0,0, "FLDCW %e" }, -[0x06] = { 0,0, "FSTENV%S %e" }, -[0x07] = { 0,0, "FSTCW %e" }, -[0x08] = { 0,0, "FMOVD F0,F0" }, /* Mod R/M = 11xx xxxx*/ -[0x09] = { 0,0, "FMOVD F1,F0" }, -[0x0a] = { 0,0, "FMOVD F2,F0" }, -[0x0b] = { 0,0, "FMOVD F3,F0" }, -[0x0c] = { 0,0, "FMOVD F4,F0" }, -[0x0d] = { 0,0, "FMOVD F5,F0" }, -[0x0e] = { 0,0, "FMOVD F6,F0" }, -[0x0f] = { 0,0, "FMOVD F7,F0" }, -[0x10] = { 0,0, "FXCHD F0,F0" }, -[0x11] = { 0,0, "FXCHD F1,F0" }, -[0x12] = { 0,0, "FXCHD F2,F0" }, -[0x13] = { 0,0, "FXCHD F3,F0" }, -[0x14] = { 0,0, "FXCHD F4,F0" }, -[0x15] = { 0,0, "FXCHD F5,F0" }, -[0x16] = { 0,0, "FXCHD F6,F0" }, -[0x17] = { 0,0, "FXCHD F7,F0" }, -[0x18] = { 0,0, "FNOP" }, -[0x28] = { 0,0, "FCHS" }, -[0x29] = { 0,0, "FABS" }, -[0x2c] = { 0,0, "FTST" }, -[0x2d] = { 0,0, "FXAM" }, -[0x30] = { 0,0, "FLD1" }, -[0x31] = { 0,0, "FLDL2T" }, -[0x32] = { 0,0, "FLDL2E" }, -[0x33] = { 0,0, "FLDPI" }, -[0x34] = { 0,0, "FLDLG2" }, -[0x35] = { 0,0, "FLDLN2" }, -[0x36] = { 0,0, "FLDZ" }, -[0x38] = { 0,0, "F2XM1" }, -[0x39] = { 0,0, "FYL2X" }, -[0x3a] = { 0,0, "FPTAN" }, -[0x3b] = { 0,0, "FPATAN" }, -[0x3c] = { 0,0, "FXTRACT" }, -[0x3d] = { 0,0, "FPREM1" }, -[0x3e] = { 0,0, "FDECSTP" }, -[0x3f] = { 0,0, "FNCSTP" }, -[0x40] = { 0,0, "FPREM" }, -[0x41] = { 0,0, "FYL2XP1" }, -[0x42] = { 0,0, "FSQRT" }, -[0x43] = { 0,0, "FSINCOS" }, -[0x44] = { 0,0, "FRNDINT" }, -[0x45] = { 0,0, "FSCALE" }, -[0x46] = { 0,0, "FSIN" }, -[0x47] = { 0,0, "FCOS" }, -}; - -static Optable optabDA[8+8] = -{ -[0x00] = { 0,0, "FADDL %e,F0" }, -[0x01] = { 0,0, "FMULL %e,F0" }, -[0x02] = { 0,0, "FCOML %e,F0" }, -[0x03] = { 0,0, "FCOMLP %e,F0" }, -[0x04] = { 0,0, "FSUBL %e,F0" }, -[0x05] = { 0,0, "FSUBRL %e,F0" }, -[0x06] = { 0,0, "FDIVL %e,F0" }, -[0x07] = { 0,0, "FDIVRL %e,F0" }, -[0x08] = { 0,0, "FCMOVCS %f,F0" }, -[0x09] = { 0,0, "FCMOVEQ %f,F0" }, -[0x0a] = { 0,0, "FCMOVLS %f,F0" }, -[0x0b] = { 0,0, "FCMOVUN %f,F0" }, -[0x0d] = { Op_R1,0, "FUCOMPP" }, -}; - -static Optable optabDB[8+64] = -{ -[0x00] = { 0,0, "FMOVL %e,F0" }, -[0x02] = { 0,0, "FMOVL F0,%e" }, -[0x03] = { 0,0, "FMOVLP F0,%e" }, -[0x05] = { 0,0, "FMOVX %e,F0" }, -[0x07] = { 0,0, "FMOVXP F0,%e" }, -[0x08] = { 0,0, "FCMOVCC F0,F0" }, /* Mod R/M = 11xx xxxx*/ -[0x09] = { 0,0, "FCMOVCC F1,F0" }, -[0x0a] = { 0,0, "FCMOVCC F2,F0" }, -[0x0b] = { 0,0, "FCMOVCC F3,F0" }, -[0x0c] = { 0,0, "FCMOVCC F4,F0" }, -[0x0d] = { 0,0, "FCMOVCC F5,F0" }, -[0x0e] = { 0,0, "FCMOVCC F6,F0" }, -[0x0f] = { 0,0, "FCMOVCC F7,F0" }, -[0x10] = { 0,0, "FCMOVNE F0,F0" }, -[0x11] = { 0,0, "FCMOVNE F1,F0" }, -[0x12] = { 0,0, "FCMOVNE F2,F0" }, -[0x13] = { 0,0, "FCMOVNE F3,F0" }, -[0x14] = { 0,0, "FCMOVNE F4,F0" }, -[0x15] = { 0,0, "FCMOVNE F5,F0" }, -[0x16] = { 0,0, "FCMOVNE F6,F0" }, -[0x17] = { 0,0, "FCMOVNE F7,F0" }, -[0x18] = { 0,0, "FCMOVHI F0,F0" }, -[0x19] = { 0,0, "FCMOVHI F1,F0" }, -[0x1a] = { 0,0, "FCMOVHI F2,F0" }, -[0x1b] = { 0,0, "FCMOVHI F3,F0" }, -[0x1c] = { 0,0, "FCMOVHI F4,F0" }, -[0x1d] = { 0,0, "FCMOVHI F5,F0" }, -[0x1e] = { 0,0, "FCMOVHI F6,F0" }, -[0x1f] = { 0,0, "FCMOVHI F7,F0" }, -[0x20] = { 0,0, "FCMOVNU F0,F0" }, -[0x21] = { 0,0, "FCMOVNU F1,F0" }, -[0x22] = { 0,0, "FCMOVNU F2,F0" }, -[0x23] = { 0,0, "FCMOVNU F3,F0" }, -[0x24] = { 0,0, "FCMOVNU F4,F0" }, -[0x25] = { 0,0, "FCMOVNU F5,F0" }, -[0x26] = { 0,0, "FCMOVNU F6,F0" }, -[0x27] = { 0,0, "FCMOVNU F7,F0" }, -[0x2a] = { 0,0, "FCLEX" }, -[0x2b] = { 0,0, "FINIT" }, -[0x30] = { 0,0, "FUCOMI F0,F0" }, -[0x31] = { 0,0, "FUCOMI F1,F0" }, -[0x32] = { 0,0, "FUCOMI F2,F0" }, -[0x33] = { 0,0, "FUCOMI F3,F0" }, -[0x34] = { 0,0, "FUCOMI F4,F0" }, -[0x35] = { 0,0, "FUCOMI F5,F0" }, -[0x36] = { 0,0, "FUCOMI F6,F0" }, -[0x37] = { 0,0, "FUCOMI F7,F0" }, -[0x38] = { 0,0, "FCOMI F0,F0" }, -[0x39] = { 0,0, "FCOMI F1,F0" }, -[0x3a] = { 0,0, "FCOMI F2,F0" }, -[0x3b] = { 0,0, "FCOMI F3,F0" }, -[0x3c] = { 0,0, "FCOMI F4,F0" }, -[0x3d] = { 0,0, "FCOMI F5,F0" }, -[0x3e] = { 0,0, "FCOMI F6,F0" }, -[0x3f] = { 0,0, "FCOMI F7,F0" }, -}; - -static Optable optabDC[8+8] = -{ -[0x00] = { 0,0, "FADDD %e,F0" }, -[0x01] = { 0,0, "FMULD %e,F0" }, -[0x02] = { 0,0, "FCOMD %e,F0" }, -[0x03] = { 0,0, "FCOMDP %e,F0" }, -[0x04] = { 0,0, "FSUBD %e,F0" }, -[0x05] = { 0,0, "FSUBRD %e,F0" }, -[0x06] = { 0,0, "FDIVD %e,F0" }, -[0x07] = { 0,0, "FDIVRD %e,F0" }, -[0x08] = { 0,0, "FADDD F0,%f" }, -[0x09] = { 0,0, "FMULD F0,%f" }, -[0x0c] = { 0,0, "FSUBRD F0,%f" }, -[0x0d] = { 0,0, "FSUBD F0,%f" }, -[0x0e] = { 0,0, "FDIVRD F0,%f" }, -[0x0f] = { 0,0, "FDIVD F0,%f" }, -}; - -static Optable optabDD[8+8] = -{ -[0x00] = { 0,0, "FMOVD %e,F0" }, -[0x02] = { 0,0, "FMOVD F0,%e" }, -[0x03] = { 0,0, "FMOVDP F0,%e" }, -[0x04] = { 0,0, "FRSTOR%S %e" }, -[0x06] = { 0,0, "FSAVE%S %e" }, -[0x07] = { 0,0, "FSTSW %e" }, -[0x08] = { 0,0, "FFREED %f" }, -[0x0a] = { 0,0, "FMOVD %f,F0" }, -[0x0b] = { 0,0, "FMOVDP %f,F0" }, -[0x0c] = { 0,0, "FUCOMD %f,F0" }, -[0x0d] = { 0,0, "FUCOMDP %f,F0" }, -}; - -static Optable optabDE[8+8] = -{ -[0x00] = { 0,0, "FADDW %e,F0" }, -[0x01] = { 0,0, "FMULW %e,F0" }, -[0x02] = { 0,0, "FCOMW %e,F0" }, -[0x03] = { 0,0, "FCOMWP %e,F0" }, -[0x04] = { 0,0, "FSUBW %e,F0" }, -[0x05] = { 0,0, "FSUBRW %e,F0" }, -[0x06] = { 0,0, "FDIVW %e,F0" }, -[0x07] = { 0,0, "FDIVRW %e,F0" }, -[0x08] = { 0,0, "FADDDP F0,%f" }, -[0x09] = { 0,0, "FMULDP F0,%f" }, -[0x0b] = { Op_R1,0, "FCOMPDP" }, -[0x0c] = { 0,0, "FSUBRDP F0,%f" }, -[0x0d] = { 0,0, "FSUBDP F0,%f" }, -[0x0e] = { 0,0, "FDIVRDP F0,%f" }, -[0x0f] = { 0,0, "FDIVDP F0,%f" }, -}; - -static Optable optabDF[8+8] = -{ -[0x00] = { 0,0, "FMOVW %e,F0" }, -[0x02] = { 0,0, "FMOVW F0,%e" }, -[0x03] = { 0,0, "FMOVWP F0,%e" }, -[0x04] = { 0,0, "FBLD %e" }, -[0x05] = { 0,0, "FMOVL %e,F0" }, -[0x06] = { 0,0, "FBSTP %e" }, -[0x07] = { 0,0, "FMOVLP F0,%e" }, -[0x0c] = { Op_R0,0, "FSTSW %OAX" }, -[0x0d] = { 0,0, "FUCOMIP F0,%f" }, -[0x0e] = { 0,0, "FCOMIP F0,%f" }, -}; - -static Optable optabF6[8] = -{ -[0x00] = { Ib,0, "TESTB %i,%e" }, -[0x02] = { 0,0, "NOTB %e" }, -[0x03] = { 0,0, "NEGB %e" }, -[0x04] = { 0,0, "MULB AL,%e" }, -[0x05] = { 0,0, "IMULB AL,%e" }, -[0x06] = { 0,0, "DIVB AL,%e" }, -[0x07] = { 0,0, "IDIVB AL,%e" }, -}; - -static Optable optabF7[8] = -{ -[0x00] = { Iwd,0, "TEST%S %i,%e" }, -[0x02] = { 0,0, "NOT%S %e" }, -[0x03] = { 0,0, "NEG%S %e" }, -[0x04] = { 0,0, "MUL%S %OAX,%e" }, -[0x05] = { 0,0, "IMUL%S %OAX,%e" }, -[0x06] = { 0,0, "DIV%S %OAX,%e" }, -[0x07] = { 0,0, "IDIV%S %OAX,%e" }, -}; - -static Optable optabFE[8] = -{ -[0x00] = { 0,0, "INCB %e" }, -[0x01] = { 0,0, "DECB %e" }, -}; - -static Optable optabFF[8] = -{ -[0x00] = { 0,0, "INC%S %e" }, -[0x01] = { 0,0, "DEC%S %e" }, -[0x02] = { JUMP,0, "CALL* %e" }, -[0x03] = { JUMP,0, "CALLF* %e" }, -[0x04] = { JUMP,0, "JMP* %e" }, -[0x05] = { JUMP,0, "JMPF* %e" }, -[0x06] = { 0,0, "PUSHL %e" }, -}; - -static Optable optable[256+2] = -{ -[0x00] = { RMB,0, "ADDB %r,%e" }, -[0x01] = { RM,0, "ADD%S %r,%e" }, -[0x02] = { RMB,0, "ADDB %e,%r" }, -[0x03] = { RM,0, "ADD%S %e,%r" }, -[0x04] = { Ib,0, "ADDB %i,AL" }, -[0x05] = { Iwd,0, "ADD%S %i,%OAX" }, -[0x06] = { 0,0, "PUSHL ES" }, -[0x07] = { 0,0, "POPL ES" }, -[0x08] = { RMB,0, "ORB %r,%e" }, -[0x09] = { RM,0, "OR%S %r,%e" }, -[0x0a] = { RMB,0, "ORB %e,%r" }, -[0x0b] = { RM,0, "OR%S %e,%r" }, -[0x0c] = { Ib,0, "ORB %i,AL" }, -[0x0d] = { Iwd,0, "OR%S %i,%OAX" }, -[0x0e] = { 0,0, "PUSHL CS" }, -[0x0f] = { AUXMM,0, optab0F }, -[0x10] = { RMB,0, "ADCB %r,%e" }, -[0x11] = { RM,0, "ADC%S %r,%e" }, -[0x12] = { RMB,0, "ADCB %e,%r" }, -[0x13] = { RM,0, "ADC%S %e,%r" }, -[0x14] = { Ib,0, "ADCB %i,AL" }, -[0x15] = { Iwd,0, "ADC%S %i,%OAX" }, -[0x16] = { 0,0, "PUSHL SS" }, -[0x17] = { 0,0, "POPL SS" }, -[0x18] = { RMB,0, "SBBB %r,%e" }, -[0x19] = { RM,0, "SBB%S %r,%e" }, -[0x1a] = { RMB,0, "SBBB %e,%r" }, -[0x1b] = { RM,0, "SBB%S %e,%r" }, -[0x1c] = { Ib,0, "SBBB %i,AL" }, -[0x1d] = { Iwd,0, "SBB%S %i,%OAX" }, -[0x1e] = { 0,0, "PUSHL DS" }, -[0x1f] = { 0,0, "POPL DS" }, -[0x20] = { RMB,0, "ANDB %r,%e" }, -[0x21] = { RM,0, "AND%S %r,%e" }, -[0x22] = { RMB,0, "ANDB %e,%r" }, -[0x23] = { RM,0, "AND%S %e,%r" }, -[0x24] = { Ib,0, "ANDB %i,AL" }, -[0x25] = { Iwd,0, "AND%S %i,%OAX" }, -[0x26] = { SEG,0, "ES:" }, -[0x27] = { 0,0, "DAA" }, -[0x28] = { RMB,0, "SUBB %r,%e" }, -[0x29] = { RM,0, "SUB%S %r,%e" }, -[0x2a] = { RMB,0, "SUBB %e,%r" }, -[0x2b] = { RM,0, "SUB%S %e,%r" }, -[0x2c] = { Ib,0, "SUBB %i,AL" }, -[0x2d] = { Iwd,0, "SUB%S %i,%OAX" }, -[0x2e] = { SEG,0, "CS:" }, -[0x2f] = { 0,0, "DAS" }, -[0x30] = { RMB,0, "XORB %r,%e" }, -[0x31] = { RM,0, "XOR%S %r,%e" }, -[0x32] = { RMB,0, "XORB %e,%r" }, -[0x33] = { RM,0, "XOR%S %e,%r" }, -[0x34] = { Ib,0, "XORB %i,AL" }, -[0x35] = { Iwd,0, "XOR%S %i,%OAX" }, -[0x36] = { SEG,0, "SS:" }, -[0x37] = { 0,0, "AAA" }, -[0x38] = { RMB,0, "CMPB %r,%e" }, -[0x39] = { RM,0, "CMP%S %r,%e" }, -[0x3a] = { RMB,0, "CMPB %e,%r" }, -[0x3b] = { RM,0, "CMP%S %e,%r" }, -[0x3c] = { Ib,0, "CMPB %i,AL" }, -[0x3d] = { Iwd,0, "CMP%S %i,%OAX" }, -[0x3e] = { SEG,0, "DS:" }, -[0x3f] = { 0,0, "AAS" }, -[0x40] = { 0,0, "INC%S %OAX" }, -[0x41] = { 0,0, "INC%S %OCX" }, -[0x42] = { 0,0, "INC%S %ODX" }, -[0x43] = { 0,0, "INC%S %OBX" }, -[0x44] = { 0,0, "INC%S %OSP" }, -[0x45] = { 0,0, "INC%S %OBP" }, -[0x46] = { 0,0, "INC%S %OSI" }, -[0x47] = { 0,0, "INC%S %ODI" }, -[0x48] = { 0,0, "DEC%S %OAX" }, -[0x49] = { 0,0, "DEC%S %OCX" }, -[0x4a] = { 0,0, "DEC%S %ODX" }, -[0x4b] = { 0,0, "DEC%S %OBX" }, -[0x4c] = { 0,0, "DEC%S %OSP" }, -[0x4d] = { 0,0, "DEC%S %OBP" }, -[0x4e] = { 0,0, "DEC%S %OSI" }, -[0x4f] = { 0,0, "DEC%S %ODI" }, -[0x50] = { 0,0, "PUSH%S %OAX" }, -[0x51] = { 0,0, "PUSH%S %OCX" }, -[0x52] = { 0,0, "PUSH%S %ODX" }, -[0x53] = { 0,0, "PUSH%S %OBX" }, -[0x54] = { 0,0, "PUSH%S %OSP" }, -[0x55] = { 0,0, "PUSH%S %OBP" }, -[0x56] = { 0,0, "PUSH%S %OSI" }, -[0x57] = { 0,0, "PUSH%S %ODI" }, -[0x58] = { 0,0, "POP%S %OAX" }, -[0x59] = { 0,0, "POP%S %OCX" }, -[0x5a] = { 0,0, "POP%S %ODX" }, -[0x5b] = { 0,0, "POP%S %OBX" }, -[0x5c] = { 0,0, "POP%S %OSP" }, -[0x5d] = { 0,0, "POP%S %OBP" }, -[0x5e] = { 0,0, "POP%S %OSI" }, -[0x5f] = { 0,0, "POP%S %ODI" }, -[0x60] = { 0,0, "PUSHA%S" }, -[0x61] = { 0,0, "POPA%S" }, -[0x62] = { RMM,0, "BOUND %e,%r" }, -[0x63] = { RM,0, "ARPL %r,%e" }, -[0x64] = { SEG,0, "FS:" }, -[0x65] = { SEG,0, "GS:" }, -[0x66] = { OPOVER,0, "" }, -[0x67] = { ADDOVER,0, "" }, -[0x68] = { Iwd,0, "PUSH%S %i" }, -[0x69] = { RM,Iwd, "IMUL%S %e,%i,%r" }, -[0x6a] = { Ib,0, "PUSH%S %i" }, -[0x6b] = { RM,Ibs, "IMUL%S %e,%i,%r" }, -[0x6c] = { 0,0, "INSB DX,(%ODI)" }, -[0x6d] = { 0,0, "INS%S DX,(%ODI)" }, -[0x6e] = { 0,0, "OUTSB (%ASI),DX" }, -[0x6f] = { 0,0, "OUTS%S (%ASI),DX" }, -[0x70] = { Jbs,0, "JOS %p" }, -[0x71] = { Jbs,0, "JOC %p" }, -[0x72] = { Jbs,0, "JCS %p" }, -[0x73] = { Jbs,0, "JCC %p" }, -[0x74] = { Jbs,0, "JEQ %p" }, -[0x75] = { Jbs,0, "JNE %p" }, -[0x76] = { Jbs,0, "JLS %p" }, -[0x77] = { Jbs,0, "JHI %p" }, -[0x78] = { Jbs,0, "JMI %p" }, -[0x79] = { Jbs,0, "JPL %p" }, -[0x7a] = { Jbs,0, "JPS %p" }, -[0x7b] = { Jbs,0, "JPC %p" }, -[0x7c] = { Jbs,0, "JLT %p" }, -[0x7d] = { Jbs,0, "JGE %p" }, -[0x7e] = { Jbs,0, "JLE %p" }, -[0x7f] = { Jbs,0, "JGT %p" }, -[0x80] = { RMOPB,0, optab80 }, -[0x81] = { RMOP,0, optab81 }, -[0x83] = { RMOP,0, optab83 }, -[0x84] = { RMB,0, "TESTB %r,%e" }, -[0x85] = { RM,0, "TEST%S %r,%e" }, -[0x86] = { RMB,0, "XCHGB %r,%e" }, -[0x87] = { RM,0, "XCHG%S %r,%e" }, -[0x88] = { RMB,0, "MOVB %r,%e" }, -[0x89] = { RM,0, "MOV%S %r,%e" }, -[0x8a] = { RMB,0, "MOVB %e,%r" }, -[0x8b] = { RM,0, "MOV%S %e,%r" }, -[0x8c] = { RM,0, "MOVW %g,%e" }, -[0x8d] = { RM,0, "LEA%S %e,%r" }, -[0x8e] = { RM,0, "MOVW %e,%g" }, -[0x8f] = { RM,0, "POP%S %e" }, -[0x90] = { 0,0, "NOP" }, -[0x91] = { 0,0, "XCHG %OCX,%OAX" }, -[0x92] = { 0,0, "XCHG %ODX,%OAX" }, -[0x93] = { 0,0, "XCHG %OBX,%OAX" }, -[0x94] = { 0,0, "XCHG %OSP,%OAX" }, -[0x95] = { 0,0, "XCHG %OBP,%OAX" }, -[0x96] = { 0,0, "XCHG %OSI,%OAX" }, -[0x97] = { 0,0, "XCHG %ODI,%OAX" }, -[0x98] = { 0,0, "%W" }, /* miserable CBW or CWDE */ -[0x99] = { 0,0, "%w" }, /* idiotic CWD or CDQ */ -[0x9a] = { PTR,0, "CALL%S %d" }, -[0x9b] = { 0,0, "WAIT" }, -[0x9c] = { 0,0, "PUSHF" }, -[0x9d] = { 0,0, "POPF" }, -[0x9e] = { 0,0, "SAHF" }, -[0x9f] = { 0,0, "LAHF" }, -[0xa0] = { Awd,0, "MOVB %i,AL" }, -[0xa1] = { Awd,0, "MOV%S %i,%OAX" }, -[0xa2] = { Awd,0, "MOVB AL,%i" }, -[0xa3] = { Awd,0, "MOV%S %OAX,%i" }, -[0xa4] = { 0,0, "MOVSB (%ASI),(%ADI)" }, -[0xa5] = { 0,0, "MOVS%S (%ASI),(%ADI)" }, -[0xa6] = { 0,0, "CMPSB (%ASI),(%ADI)" }, -[0xa7] = { 0,0, "CMPS%S (%ASI),(%ADI)" }, -[0xa8] = { Ib,0, "TESTB %i,AL" }, -[0xa9] = { Iwd,0, "TEST%S %i,%OAX" }, -[0xaa] = { 0,0, "STOSB AL,(%ADI)" }, -[0xab] = { 0,0, "STOS%S %OAX,(%ADI)" }, -[0xac] = { 0,0, "LODSB (%ASI),AL" }, -[0xad] = { 0,0, "LODS%S (%ASI),%OAX" }, -[0xae] = { 0,0, "SCASB (%ADI),AL" }, -[0xaf] = { 0,0, "SCAS%S (%ADI),%OAX" }, -[0xb0] = { Ib,0, "MOVB %i,AL" }, -[0xb1] = { Ib,0, "MOVB %i,CL" }, -[0xb2] = { Ib,0, "MOVB %i,DL" }, -[0xb3] = { Ib,0, "MOVB %i,BL" }, -[0xb4] = { Ib,0, "MOVB %i,AH" }, -[0xb5] = { Ib,0, "MOVB %i,CH" }, -[0xb6] = { Ib,0, "MOVB %i,DH" }, -[0xb7] = { Ib,0, "MOVB %i,BH" }, -[0xb8] = { Iwdq,0, "MOV%S %i,%o" }, -[0xb9] = { Iwdq,0, "MOV%S %i,%o" }, -[0xba] = { Iwdq,0, "MOV%S %i,%o" }, -[0xbb] = { Iwdq,0, "MOV%S %i,%o" }, -[0xbc] = { Iwdq,0, "MOV%S %i,%o" }, -[0xbd] = { Iwdq,0, "MOV%S %i,%o" }, -[0xbe] = { Iwdq,0, "MOV%S %i,%o" }, -[0xbf] = { Iwdq,0, "MOV%S %i,%o" }, -[0xc0] = { RMOPB,0, optabC0 }, -[0xc1] = { RMOP,0, optabC1 }, -[0xc2] = { Iw,0, "RET %i" }, -[0xc3] = { RET,0, "RET" }, -[0xc4] = { RM,0, "LES %e,%r" }, -[0xc5] = { RM,0, "LDS %e,%r" }, -[0xc6] = { RMB,Ib, "MOVB %i,%e" }, -[0xc7] = { RM,Iwd, "MOV%S %i,%e" }, -[0xc8] = { Iw2,Ib, "ENTER %i,%I" }, /* loony ENTER */ -[0xc9] = { RET,0, "LEAVE" }, /* bizarre LEAVE */ -[0xca] = { Iw,0, "RETF %i" }, -[0xcb] = { RET,0, "RETF" }, -[0xcc] = { 0,0, "INT 3" }, -[0xcd] = { Ib,0, "INTB %i" }, -[0xce] = { 0,0, "INTO" }, -[0xcf] = { 0,0, "IRET" }, -[0xd0] = { RMOPB,0, optabD0 }, -[0xd1] = { RMOP,0, optabD1 }, -[0xd2] = { RMOPB,0, optabD2 }, -[0xd3] = { RMOP,0, optabD3 }, -[0xd4] = { OA,0, "AAM" }, -[0xd5] = { OA,0, "AAD" }, -[0xd7] = { 0,0, "XLAT" }, -[0xd8] = { FRMOP,0, optabD8 }, -[0xd9] = { FRMEX,0, optabD9 }, -[0xda] = { FRMOP,0, optabDA }, -[0xdb] = { FRMEX,0, optabDB }, -[0xdc] = { FRMOP,0, optabDC }, -[0xdd] = { FRMOP,0, optabDD }, -[0xde] = { FRMOP,0, optabDE }, -[0xdf] = { FRMOP,0, optabDF }, -[0xe0] = { Jbs,0, "LOOPNE %p" }, -[0xe1] = { Jbs,0, "LOOPE %p" }, -[0xe2] = { Jbs,0, "LOOP %p" }, -[0xe3] = { Jbs,0, "JCXZ %p" }, -[0xe4] = { Ib,0, "INB %i,AL" }, -[0xe5] = { Ib,0, "IN%S %i,%OAX" }, -[0xe6] = { Ib,0, "OUTB AL,%i" }, -[0xe7] = { Ib,0, "OUT%S %OAX,%i" }, -[0xe8] = { Iwds,0, "CALL %p" }, -[0xe9] = { Iwds,0, "JMP %p" }, -[0xea] = { PTR,0, "JMP %d" }, -[0xeb] = { Jbs,0, "JMP %p" }, -[0xec] = { 0,0, "INB DX,AL" }, -[0xed] = { 0,0, "IN%S DX,%OAX" }, -[0xee] = { 0,0, "OUTB AL,DX" }, -[0xef] = { 0,0, "OUT%S %OAX,DX" }, -[0xf0] = { PRE,0, "LOCK" }, -[0xf2] = { OPRE,0, "REPNE" }, -[0xf3] = { OPRE,0, "REP" }, -[0xf4] = { 0,0, "HLT" }, -[0xf5] = { 0,0, "CMC" }, -[0xf6] = { RMOPB,0, optabF6 }, -[0xf7] = { RMOP,0, optabF7 }, -[0xf8] = { 0,0, "CLC" }, -[0xf9] = { 0,0, "STC" }, -[0xfa] = { 0,0, "CLI" }, -[0xfb] = { 0,0, "STI" }, -[0xfc] = { 0,0, "CLD" }, -[0xfd] = { 0,0, "STD" }, -[0xfe] = { RMOPB,0, optabFE }, -[0xff] = { RMOP,0, optabFF }, -[0x100] = { RM,0, "MOVLQSX %e,%r" }, -[0x101] = { RM,0, "MOVLQZX %e,%r" }, -}; - -/* - * get a byte of the instruction - */ -static int -igetc(Map *map, Instr *ip, uchar *c) -{ - if(ip->n+1 > sizeof(ip->mem)){ - werrstr("instruction too long"); - return -1; - } - if (get1(map, ip->addr+ip->n, c, 1) < 0) { - werrstr("can't read instruction: %r"); - return -1; - } - ip->mem[ip->n++] = *c; - return 1; -} - -/* - * get two bytes of the instruction - */ -static int -igets(Map *map, Instr *ip, ushort *sp) -{ - uchar c; - ushort s; - - if (igetc(map, ip, &c) < 0) - return -1; - s = c; - if (igetc(map, ip, &c) < 0) - return -1; - s |= (c<<8); - *sp = s; - return 1; -} - -/* - * get 4 bytes of the instruction - */ -static int -igetl(Map *map, Instr *ip, uint32 *lp) -{ - ushort s; - int32 l; - - if (igets(map, ip, &s) < 0) - return -1; - l = s; - if (igets(map, ip, &s) < 0) - return -1; - l |= (s<<16); - *lp = l; - return 1; -} - -/* - * get 8 bytes of the instruction - * -static int -igetq(Map *map, Instr *ip, vlong *qp) -{ - uint32 l; - uvlong q; - - if (igetl(map, ip, &l) < 0) - return -1; - q = l; - if (igetl(map, ip, &l) < 0) - return -1; - q |= ((uvlong)l<<32); - *qp = q; - return 1; -} - */ - -static int -getdisp(Map *map, Instr *ip, int mod, int rm, int code, int pcrel) -{ - uchar c; - ushort s; - - if (mod > 2) - return 1; - if (mod == 1) { - if (igetc(map, ip, &c) < 0) - return -1; - if (c&0x80) - ip->disp = c|0xffffff00; - else - ip->disp = c&0xff; - } else if (mod == 2 || rm == code) { - if (ip->asize == 'E') { - if (igetl(map, ip, &ip->disp) < 0) - return -1; - if (mod == 0) - ip->rip = pcrel; - } else { - if (igets(map, ip, &s) < 0) - return -1; - if (s&0x8000) - ip->disp = s|0xffff0000; - else - ip->disp = s; - } - if (mod == 0) - ip->base = -1; - } - return 1; -} - -static int -modrm(Map *map, Instr *ip, uchar c) -{ - uchar rm, mod; - - mod = (c>>6)&3; - rm = c&7; - ip->mod = mod; - ip->base = rm; - ip->reg = (c>>3)&7; - ip->rip = 0; - if (mod == 3) /* register */ - return 1; - if (ip->asize == 0) { /* 16-bit mode */ - switch(rm) { - case 0: - ip->base = BX; ip->index = SI; - break; - case 1: - ip->base = BX; ip->index = DI; - break; - case 2: - ip->base = BP; ip->index = SI; - break; - case 3: - ip->base = BP; ip->index = DI; - break; - case 4: - ip->base = SI; - break; - case 5: - ip->base = DI; - break; - case 6: - ip->base = BP; - break; - case 7: - ip->base = BX; - break; - default: - break; - } - return getdisp(map, ip, mod, rm, 6, 0); - } - if (rm == 4) { /* scummy sib byte */ - if (igetc(map, ip, &c) < 0) - return -1; - ip->ss = (c>>6)&0x03; - ip->index = (c>>3)&0x07; - if (ip->index == 4) - ip->index = -1; - ip->base = c&0x07; - return getdisp(map, ip, mod, ip->base, 5, 0); - } - return getdisp(map, ip, mod, rm, 5, ip->amd64); -} - -static char * -_hexify(char *buf, uint32 p, int zeros) -{ - uint32 d; - - d = p/16; - if(d) - buf = _hexify(buf, d, zeros-1); - else - while(zeros--) - *buf++ = '0'; - *buf++ = "0123456789abcdef"[p&0x0f]; - return buf; -} - -static Optable * -mkinstr(Map *map, Instr *ip, uvlong pc, int is64) -{ - int i, n, norex; - uchar c; - ushort s; - Optable *op, *obase; - char buf[128]; - - memset(ip, 0, sizeof(*ip)); - norex = 1; - ip->base = -1; - ip->index = -1; - ip->osize = 'L'; - ip->asize = 'E'; - ip->amd64 = is64; - norex = 0; - ip->addr = pc; - if (igetc(map, ip, &c) < 0) - return 0; - obase = optable; -newop: - if(ip->amd64 && !norex){ - if(c >= 0x40 && c <= 0x4f) { - ip->rex = c; - if(igetc(map, ip, &c) < 0) - return 0; - } - if(c == 0x63){ - if(ip->rex&REXW) - op = &obase[0x100]; /* MOVLQSX */ - else - op = &obase[0x101]; /* MOVLQZX */ - goto hack; - } - } - if(obase == optable) - ip->op = c; - op = &obase[c]; -hack: - if (op->proto == 0) { -badop: - n = snprint(buf, sizeof(buf), "opcode: ??"); - for (i = 0; i < ip->n && n < sizeof(buf)-3; i++, n+=2) - _hexify(buf+n, ip->mem[i], 1); - strcpy(buf+n, "??"); - werrstr(buf); - return 0; - } - for(i = 0; i < 2 && op->operand[i]; i++) { - switch(op->operand[i]) { - case Ib: /* 8-bit immediate - (no sign extension)*/ - if (igetc(map, ip, &c) < 0) - return 0; - ip->imm = c&0xff; - ip->imm64 = ip->imm; - break; - case Jbs: /* 8-bit jump immediate (sign extended) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (c&0x80) - ip->imm = c|0xffffff00; - else - ip->imm = c&0xff; - ip->imm64 = (int32)ip->imm; - ip->jumptype = Jbs; - break; - case Ibs: /* 8-bit immediate (sign extended) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (c&0x80) - if (ip->osize == 'L') - ip->imm = c|0xffffff00; - else - ip->imm = c|0xff00; - else - ip->imm = c&0xff; - ip->imm64 = (int32)ip->imm; - break; - case Iw: /* 16-bit immediate -> imm */ - if (igets(map, ip, &s) < 0) - return 0; - ip->imm = s&0xffff; - ip->imm64 = ip->imm; - ip->jumptype = Iw; - break; - case Iw2: /* 16-bit immediate -> in imm2*/ - if (igets(map, ip, &s) < 0) - return 0; - ip->imm2 = s&0xffff; - break; - case Iwd: /* Operand-sized immediate (no sign extension unless 64 bits)*/ - if (ip->osize == 'L') { - if (igetl(map, ip, &ip->imm) < 0) - return 0; - ip->imm64 = ip->imm; - if(ip->rex&REXW && (ip->imm & (1<<31)) != 0) - ip->imm64 |= (vlong)~0 << 32; - } else { - if (igets(map, ip, &s)< 0) - return 0; - ip->imm = s&0xffff; - ip->imm64 = ip->imm; - } - break; - case Iwdq: /* Operand-sized immediate, possibly big */ - if (ip->osize == 'L') { - if (igetl(map, ip, &ip->imm) < 0) - return 0; - ip->imm64 = ip->imm; - if (ip->rex & REXW) { - uint32 l; - if (igetl(map, ip, &l) < 0) - return 0; - ip->imm64 |= (uvlong)l << 32; - } - } else { - if (igets(map, ip, &s)< 0) - return 0; - ip->imm = s&0xffff; - } - break; - case Awd: /* Address-sized immediate (no sign extension)*/ - if (ip->asize == 'E') { - if (igetl(map, ip, &ip->imm) < 0) - return 0; - /* TO DO: REX */ - } else { - if (igets(map, ip, &s)< 0) - return 0; - ip->imm = s&0xffff; - } - break; - case Iwds: /* Operand-sized immediate (sign extended) */ - if (ip->osize == 'L') { - if (igetl(map, ip, &ip->imm) < 0) - return 0; - } else { - if (igets(map, ip, &s)< 0) - return 0; - if (s&0x8000) - ip->imm = s|0xffff0000; - else - ip->imm = s&0xffff; - } - ip->jumptype = Iwds; - break; - case OA: /* literal 0x0a byte */ - if (igetc(map, ip, &c) < 0) - return 0; - if (c != 0x0a) - goto badop; - break; - case Op_R0: /* base register must be R0 */ - if (ip->base != 0) - goto badop; - break; - case Op_R1: /* base register must be R1 */ - if (ip->base != 1) - goto badop; - break; - case RMB: /* R/M field with byte register (/r)*/ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - ip->osize = 'B'; - break; - case RM: /* R/M field with register (/r) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - break; - case RMOPB: /* R/M field with op code (/digit) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - c = ip->reg; /* secondary op code */ - obase = (Optable*)op->proto; - ip->osize = 'B'; - goto newop; - case RMOP: /* R/M field with op code (/digit) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - obase = (Optable*)op->proto; - if(ip->amd64 && obase == optab0F01 && c == 0xF8) - return optab0F01F8; - c = ip->reg; - goto newop; - case FRMOP: /* FP R/M field with op code (/digit) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - if ((c&0xc0) == 0xc0) - c = ip->reg+8; /* 16 entry table */ - else - c = ip->reg; - obase = (Optable*)op->proto; - goto newop; - case FRMEX: /* Extended FP R/M field with op code (/digit) */ - if (igetc(map, ip, &c) < 0) - return 0; - if (modrm(map, ip, c) < 0) - return 0; - if ((c&0xc0) == 0xc0) - c = (c&0x3f)+8; /* 64-entry table */ - else - c = ip->reg; - obase = (Optable*)op->proto; - goto newop; - case RMR: /* R/M register only (mod = 11) */ - if (igetc(map, ip, &c) < 0) - return 0; - if ((c&0xc0) != 0xc0) { - werrstr("invalid R/M register: %#x", c); - return 0; - } - if (modrm(map, ip, c) < 0) - return 0; - break; - case RMM: /* R/M register only (mod = 11) */ - if (igetc(map, ip, &c) < 0) - return 0; - if ((c&0xc0) == 0xc0) { - werrstr("invalid R/M memory mode: %#x", c); - return 0; - } - if (modrm(map, ip, c) < 0) - return 0; - break; - case PTR: /* Seg:Displacement addr (ptr16:16 or ptr16:32) */ - if (ip->osize == 'L') { - if (igetl(map, ip, &ip->disp) < 0) - return 0; - } else { - if (igets(map, ip, &s)< 0) - return 0; - ip->disp = s&0xffff; - } - if (igets(map, ip, (ushort*)&ip->seg) < 0) - return 0; - ip->jumptype = PTR; - break; - case AUXMM: /* Multi-byte op code; prefix determines table selection */ - if (igetc(map, ip, &c) < 0) - return 0; - obase = (Optable*)op->proto; - switch (ip->opre) { - case 0x66: op = optab660F; break; - case 0xF2: op = optabF20F; break; - case 0xF3: op = optabF30F; break; - default: op = nil; break; - } - if(op != nil && op[c].proto != nil) - obase = op; - norex = 1; /* no more rex prefixes */ - /* otherwise the optab entry captures it */ - goto newop; - case AUX: /* Multi-byte op code - Auxiliary table */ - obase = (Optable*)op->proto; - if (igetc(map, ip, &c) < 0) - return 0; - goto newop; - case OPRE: /* Instr Prefix or media op */ - ip->opre = c; - /* fall through */ - case PRE: /* Instr Prefix */ - ip->prefix = (char*)op->proto; - if (igetc(map, ip, &c) < 0) - return 0; - if (ip->opre && c == 0x0F) - ip->prefix = 0; - goto newop; - case SEG: /* Segment Prefix */ - ip->segment = (char*)op->proto; - if (igetc(map, ip, &c) < 0) - return 0; - goto newop; - case OPOVER: /* Operand size override */ - ip->opre = c; - ip->osize = 'W'; - if (igetc(map, ip, &c) < 0) - return 0; - if (c == 0x0F) - ip->osize = 'L'; - else if (ip->amd64 && (c&0xF0) == 0x40) - ip->osize = 'Q'; - goto newop; - case ADDOVER: /* Address size override */ - ip->asize = 0; - if (igetc(map, ip, &c) < 0) - return 0; - goto newop; - case JUMP: /* mark instruction as JUMP or RET */ - case RET: - ip->jumptype = op->operand[i]; - break; - default: - werrstr("bad operand type %d", op->operand[i]); - return 0; - } - } - return op; -} - -static void -bprint(Instr *ip, char *fmt, ...) -{ - va_list arg; - - va_start(arg, fmt); - ip->curr = vseprint(ip->curr, ip->end, fmt, arg); - va_end(arg); -} - -/* - * if we want to call 16 bit regs AX,BX,CX,... - * and 32 bit regs EAX,EBX,ECX,... then - * change the defs of ANAME and ONAME to: - * #define ANAME(ip) ((ip->asize == 'E' ? "E" : "") - * #define ONAME(ip) ((ip)->osize == 'L' ? "E" : "") - */ -#define ANAME(ip) "" -#define ONAME(ip) "" - -static char *reg[] = { -[AX] = "AX", -[CX] = "CX", -[DX] = "DX", -[BX] = "BX", -[SP] = "SP", -[BP] = "BP", -[SI] = "SI", -[DI] = "DI", - - /* amd64 */ -[AMD64_R8] = "R8", -[AMD64_R9] = "R9", -[AMD64_R10] = "R10", -[AMD64_R11] = "R11", -[AMD64_R12] = "R12", -[AMD64_R13] = "R13", -[AMD64_R14] = "R14", -[AMD64_R15] = "R15", -}; - -static char *breg[] = { "AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" }; -static char *breg64[] = { "AL", "CL", "DL", "BL", "SPB", "BPB", "SIB", "DIB", - "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B" }; -static char *sreg[] = { "ES", "CS", "SS", "DS", "FS", "GS" }; - -static void -immediate(Instr *ip, vlong val) -{ - // TODO: Translate known names. - if((ip->rex & REXW) == 0) - bprint(ip, "%#lux", (long)val); - else - bprint(ip, "%#llux", val); -} - -static void -pea(Instr *ip) -{ - int base; - - base = ip->base; - if(base >= 0 && (ip->rex & REXB)) - base += 8; - - if (ip->mod == 3) { - if (ip->osize == 'B') - bprint(ip, (ip->rex & REXB? breg64: breg)[(uchar)ip->base]); - else - bprint(ip, "%s%s", ANAME(ip), reg[base]); - return; - } - - if (ip->segment) - bprint(ip, ip->segment); - if (1) { - if (ip->base < 0) - immediate(ip, ip->disp); - else { - bprint(ip, "%#ux", ip->disp); - if(ip->rip) - bprint(ip, "(RIP)"); - bprint(ip,"(%s%s)", ANAME(ip), reg[ip->rex&REXB? ip->base+8: ip->base]); - } - } - if (ip->index >= 0) - bprint(ip,"(%s%s*%d)", ANAME(ip), reg[ip->rex&REXX? ip->index+8: ip->index], 1<ss); -} - -static void -prinstr(Instr *ip, char *fmt) -{ - int sharp, i; - vlong v; - - if (ip->prefix) - bprint(ip, "%s ", ip->prefix); - for (; *fmt && ip->curr < ip->end; fmt++) { - if (*fmt != '%'){ - *ip->curr++ = *fmt; - continue; - } - sharp = 0; - if(*++fmt == '#') { - sharp = 1; - ++fmt; - } - switch(*fmt){ - case '%': - *ip->curr++ = '%'; - break; - case 'A': - bprint(ip, "%s", ANAME(ip)); - break; - case 'C': - bprint(ip, "CR%d", ip->reg); - break; - case 'D': - if (ip->reg < 4 || ip->reg == 6 || ip->reg == 7) - bprint(ip, "DR%d",ip->reg); - else - bprint(ip, "???"); - break; - case 'I': - bprint(ip, "$"); - immediate(ip, ip->imm2); - break; - case 'O': - bprint(ip,"%s", ONAME(ip)); - break; - case 'o': - i = ip->op & 7; - if(ip->rex & REXB) - i += 8; - bprint(ip, "%s", reg[i]); - break; - case 'i': - if(!sharp) - bprint(ip, "$"); - v = ip->imm; - if(ip->rex & REXW) - v = ip->imm64; - immediate(ip, v); - break; - case 'R': - bprint(ip, "%s%s", ONAME(ip), reg[ip->rex&REXR? ip->reg+8: ip->reg]); - break; - case 'S': - if(ip->osize == 'Q' || (ip->osize == 'L' && ip->rex & REXW)) - bprint(ip, "Q"); - else - bprint(ip, "%c", ip->osize); - break; - case 's': - if(ip->opre == 0 || ip->opre == 0x66) - bprint(ip, "P"); - else - bprint(ip, "S"); - if(ip->opre == 0xf2 || ip->opre == 0x66) - bprint(ip, "D"); - else - bprint(ip, "S"); - break; - case 'T': - if (ip->reg == 6 || ip->reg == 7) - bprint(ip, "TR%d",ip->reg); - else - bprint(ip, "???"); - break; - case 'W': - if (ip->osize == 'Q' || (ip->osize == 'L' && ip->rex & REXW)) - bprint(ip, "CDQE"); - else if (ip->osize == 'L') - bprint(ip,"CWDE"); - else - bprint(ip, "CBW"); - break; - case 'd': - bprint(ip,"%#ux:%#ux", ip->seg, ip->disp); - break; - case 'm': - if (ip->mod == 3 && ip->osize != 'B') { - if(fmt[1] != '*'){ - if(ip->opre != 0) { - bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base); - break; - } - } else - fmt++; - bprint(ip, "M%d", ip->base); - break; - } - pea(ip); - break; - case 'e': - pea(ip); - break; - case 'f': - bprint(ip, "F%d", ip->base); - break; - case 'g': - if (ip->reg < 6) - bprint(ip,"%s",sreg[ip->reg]); - else - bprint(ip,"???"); - break; - case 'p': - /* - * signed immediate in the uint32 ip->imm. - */ - v = (int32)ip->imm; - immediate(ip, v+ip->addr+ip->n); - break; - case 'r': - if (ip->osize == 'B') - bprint(ip,"%s", (ip->rex? breg64: breg)[ip->rex&REXR? ip->reg+8: ip->reg]); - else - bprint(ip, reg[ip->rex&REXR? ip->reg+8: ip->reg]); - break; - case 'w': - if (ip->osize == 'Q' || ip->rex & REXW) - bprint(ip, "CQO"); - else if (ip->osize == 'L') - bprint(ip,"CDQ"); - else - bprint(ip, "CWD"); - break; - case 'M': - if(ip->opre != 0) - bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg); - else - bprint(ip, "M%d", ip->reg); - break; - case 'x': - if (ip->mod == 3 && ip->osize != 'B') { - bprint(ip, "X%d", ip->rex&REXB? ip->base+8: ip->base); - break; - } - pea(ip); - break; - case 'X': - bprint(ip, "X%d", ip->rex&REXR? ip->reg+8: ip->reg); - break; - default: - bprint(ip, "%%%c", *fmt); - break; - } - } - *ip->curr = 0; /* there's always room for 1 byte */ -} - -static int -i386inst(Map *map, uvlong pc, int is64, char modifier, char *buf, int n) -{ - Instr instr; - Optable *op; - - USED(modifier); - op = mkinstr(map, &instr, pc, is64); - if (op == 0) - return -1; - instr.curr = buf; - instr.end = buf+n-1; - prinstr(&instr, op->proto); - return instr.n; -} - -/* -static int -i386das(Map *map, uvlong pc, char *buf, int n) -{ - Instr instr; - int i; - - if (mkinstr(map, &instr, pc) == 0) { - errstr(buf, n); - return -1; - } - for(i = 0; i < instr.n && n > 2; i++) { - _hexify(buf, instr.mem[i], 1); - buf += 2; - n -= 2; - } - *buf = 0; - return instr.n; -} - -static int -i386instlen(Map *map, uvlong pc) -{ - Instr i; - - if (mkinstr(map, &i, pc)) - return i.n; - return -1; -} -*/ - -static int -getmem(Map *m, uvlong addr, uchar *dst, int ndst) -{ - uchar *p; - - p = m->startp + (addr - m->startpc); - if(p < m->p || p >= m->ep || m->ep - p < ndst) { - werrstr("out of bounds"); - return -1; - } - memmove(dst, p, ndst); - return ndst; -} - -int -x86disasm(uchar *p, uchar *end, uvlong pc, int is64, char *buf, int n) -{ - Map m; - - m.p = p; - m.ep = end; - m.startp = p; - m.startpc = pc; - m.get1 = getmem; - return i386inst(&m, pc, is64, 0, buf, n); -} - -void -usage(void) -{ - fprint(2, "usage: libmach8db file\n"); - exits("usage"); -} - -void -main(int argc, char **argv) -{ - uchar data[10000], *p, *ep; - int fd, n, eof, addr, is64; - Biobuf bstdout; - char buf[1000]; - - fmtinstall('H', encodefmt); - - is64 = 0; - ARGBEGIN{ - case '8': - is64 = 0; - break; - case '6': - is64 = 1; - break; - default: - usage(); - }ARGEND - - if(argc != 1) - usage(); - - fd = open(argv[0], OREAD); - if(fd < 0) - sysfatal("open %s: %r", argv[0]); - - Binit(&bstdout, 1, OWRITE); - p = data; - ep = data; - eof = 0; - addr = 0; - for(;;) { - if(!eof && ep-p < 64) { - memmove(data, p, ep-p); - ep = data + (ep-p); - p = data; - n = readn(fd, ep, data+sizeof data-ep); - if(n <= 0) - eof = 1; - else - ep += n; - } - if(p == ep) - break; - n = x86disasm(p, ep, addr, is64, buf, sizeof buf); - if(n < 0) { - Bprint(&bstdout, "0x%x %.*H error: %r\n", addr, 1, p); - n = 1; - } else { - Bprint(&bstdout, "0x%x %.*H %s\n", addr, n, p, buf); - } - addr += n; - p += n; - } - Bflush(&bstdout); - exits(0); -} diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xed_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xed_test.go deleted file mode 100644 index 91cf822727..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xed_test.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2014 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 x86asm - -import ( - "bytes" - "strings" - "testing" -) - -func TestXed32Manual(t *testing.T) { testXed32(t, hexCases(t, xedManualTests)) } -func TestXed32Testdata(t *testing.T) { testXed32(t, concat(basicPrefixes, testdataCases(t))) } -func TestXed32ModRM(t *testing.T) { testXed32(t, concat(basicPrefixes, enumModRM)) } -func TestXed32OneByte(t *testing.T) { testBasic(t, testXed32) } -func TestXed320F(t *testing.T) { testBasic(t, testXed32, 0x0F) } -func TestXed320F38(t *testing.T) { testBasic(t, testXed32, 0x0F, 0x38) } -func TestXed320F3A(t *testing.T) { testBasic(t, testXed32, 0x0F, 0x3A) } -func TestXed32Prefix(t *testing.T) { testPrefix(t, testXed32) } - -func TestXed64Manual(t *testing.T) { testXed64(t, hexCases(t, xedManualTests)) } -func TestXed64Testdata(t *testing.T) { testXed64(t, concat(basicPrefixes, testdataCases(t))) } -func TestXed64ModRM(t *testing.T) { testXed64(t, concat(basicPrefixes, enumModRM)) } -func TestXed64OneByte(t *testing.T) { testBasic(t, testXed64) } -func TestXed640F(t *testing.T) { testBasic(t, testXed64, 0x0F) } -func TestXed640F38(t *testing.T) { testBasic(t, testXed64, 0x0F, 0x38) } -func TestXed640F3A(t *testing.T) { testBasic(t, testXed64, 0x0F, 0x3A) } -func TestXed64Prefix(t *testing.T) { testPrefix(t, testXed64) } - -func TestXed64REXTestdata(t *testing.T) { - testXed64(t, filter(concat3(basicPrefixes, rexPrefixes, testdataCases(t)), isValidREX)) -} -func TestXed64REXModRM(t *testing.T) { testXed64(t, concat3(basicPrefixes, rexPrefixes, enumModRM)) } -func TestXed64REXOneByte(t *testing.T) { testBasicREX(t, testXed64) } -func TestXed64REX0F(t *testing.T) { testBasicREX(t, testXed64, 0x0F) } -func TestXed64REX0F38(t *testing.T) { testBasicREX(t, testXed64, 0x0F, 0x38) } -func TestXed64REX0F3A(t *testing.T) { testBasicREX(t, testXed64, 0x0F, 0x3A) } -func TestXed64REXPrefix(t *testing.T) { testPrefixREX(t, testXed64) } - -// xedManualTests holds test cases that will be run by TestXedManual32 and TestXedManual64. -// If you are debugging a few cases that turned up in a longer run, it can be useful -// to list them here and then use -run=XedManual, particularly with tracing enabled. -var xedManualTests = ` -6690 -` - -// allowedMismatchXed reports whether the mismatch between text and dec -// should be allowed by the test. -func allowedMismatchXed(text string, size int, inst *Inst, dec ExtInst) bool { - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "GENERAL_ERROR", "INSTR_TOO_LONG", "BAD_LOCK_PREFIX") { - return true - } - - if contains(dec.text, "BAD_LOCK_PREFIX") && countExactPrefix(inst, PrefixLOCK|PrefixInvalid) > 0 { - return true - } - - if contains(dec.text, "BAD_LOCK_PREFIX", "GENERAL_ERROR") && countExactPrefix(inst, PrefixLOCK|PrefixImplicit) > 0 { - return true - } - - if text == "lock" && size == 1 && contains(dec.text, "BAD_LOCK_PREFIX") { - return true - } - - // Instructions not known to us. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, unsupported...) { - return true - } - - // Instructions not known to xed. - if contains(text, xedUnsupported...) && contains(dec.text, "ERROR") { - return true - } - - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "shl ") && (inst.Opcode>>16)&0xEC38 == 0xC030 { - return true - } - - // 82 11 22: xed says 'adc byte ptr [ecx], 0x22' but there is no justification in the manuals for that. - // C0 30 11: xed says 'shl byte ptr [eax], 0x11' but there is no justification in the manuals for that. - // F6 08 11: xed says 'test byte ptr [eax], 0x11' but there is no justification in the manuals for that. - if (contains(text, "error:") || isPrefix(text) && size == 1) && hasByte(dec.enc[:dec.nenc], 0x82, 0xC0, 0xC1, 0xD0, 0xD1, 0xD2, 0xD3, 0xF6, 0xF7) { - return true - } - - // F3 11 22 and many others: xed allows and drops misused rep/repn prefix. - if (text == "rep" && dec.enc[0] == 0xF3 || (text == "repn" || text == "repne") && dec.enc[0] == 0xF2) && (!contains(dec.text, "ins", "outs", "movs", "lods", "cmps", "scas") || contains(dec.text, "xmm")) { - return true - } - - // 0F C7 30: xed says vmptrld qword ptr [eax]; we say rdrand eax. - // TODO(rsc): Fix, since we are probably wrong, but we don't have vmptrld in the manual. - if contains(text, "rdrand") && contains(dec.text, "vmptrld", "vmxon", "vmclear") { - return true - } - - // F3 0F AE 00: we say 'rdfsbase dword ptr [eax]' but RDFSBASE needs a register. - // Also, this is a 64-bit only instruction. - // TODO(rsc): Fix to reject this encoding. - if contains(text, "rdfsbase", "rdgsbase", "wrfsbase", "wrgsbase") && contains(dec.text, "ERROR") { - return true - } - - // 0F 01 F8: we say swapgs but that's only valid in 64-bit mode. - // TODO(rsc): Fix. - if contains(text, "swapgs") { - return true - } - - // 0F 24 11: 'mov ecx, tr2' except there is no TR2. - // Or maybe the MOV to TR registers doesn't use RMF. - if contains(text, "cr1", "cr5", "cr6", "cr7", "tr0", "tr1", "tr2", "tr3", "tr4", "tr5", "tr6", "tr7") && contains(dec.text, "ERROR") { - return true - } - - // 0F 19 11, 0F 1C 11, 0F 1D 11, 0F 1E 11, 0F 1F 11: xed says nop, - // but the Intel manuals say that the only NOP there is 0F 1F /0. - // Perhaps xed is reporting an older encoding. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "nop ") && (inst.Opcode>>8)&0xFFFF38 != 0x0F1F00 { - return true - } - - // 66 0F AE 38: clflushopt but we only know clflush - if contains(text, "clflush") && contains(dec.text, "clflushopt") { - return true - } - - // 0F 20 04 11: MOV SP, CR0 but has mod!=3 despite register argument. - // (This encoding ignores the mod bits.) The decoder sees the non-register - // mod and reads farther ahead to decode the memory reference that - // isn't really there, causing the size to be too large. - // TODO(rsc): Fix. - if text == dec.text && size > dec.nenc && contains(text, " cr", " dr", " tr") { - return true - } - - // 0F AE E9: xed says lfence, which is wrong (only 0F AE E8 is lfence). And so on. - if contains(dec.text, "fence") && hasByte(dec.enc[:dec.nenc], 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF) { - return true - } - - // DD C9, DF C9: xed says 'fxch st0, st1' but that instruction is D9 C9. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "fxch ") && hasByte(dec.enc[:dec.nenc], 0xDD, 0xDF) { - return true - } - - // DC D4: xed says 'fcom st0, st4' but that instruction is D8 D4. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "fcom ") && hasByte(dec.enc[:dec.nenc], 0xD8, 0xDC) { - return true - } - - // DE D4: xed says 'fcomp st0, st4' but that instruction is D8 D4. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "fcomp ") && hasByte(dec.enc[:dec.nenc], 0xDC, 0xDE) { - return true - } - - // DF D4: xed says 'fstp st4, st0' but that instruction is DD D4. - if (contains(text, "error:") || isPrefix(text) && size == 1) && contains(dec.text, "fstp ") && hasByte(dec.enc[:dec.nenc], 0xDF) { - return true - } - - return false -} - -func countExactPrefix(inst *Inst, target Prefix) int { - n := 0 - for _, p := range inst.Prefix { - if p == target { - n++ - } - } - return n -} - -func hasByte(src []byte, target ...byte) bool { - for _, b := range target { - if bytes.IndexByte(src, b) >= 0 { - return true - } - } - return false -} - -// Instructions known to us but not to xed. -var xedUnsupported = strings.Fields(` - xrstor - xsave - xsave - ud1 - xgetbv - xsetbv - fxsave - fxrstor - clflush - lfence - mfence - sfence - rsqrtps - rcpps - emms - ldmxcsr - stmxcsr - movhpd - movnti - rdrand - movbe - movlpd - sysret -`) diff --git a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xedext_test.go b/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xedext_test.go deleted file mode 100644 index e27cdc07c4..0000000000 --- a/src/cmd/vendor/golang.org/x/arch/x86/x86asm/xedext_test.go +++ /dev/null @@ -1,205 +0,0 @@ -package x86asm - -import ( - "bytes" - "fmt" - "io" - "log" - "os" - "strconv" - "strings" - "testing" -) - -// xed binary from Intel sde-external-6.22.0-2014-03-06. -const xedPath = "/Users/rsc/bin/xed" - -func testXedArch(t *testing.T, arch int, generate func(func([]byte))) { - if testing.Short() { - t.Skip("skipping xed test in short mode") - } - if _, err := os.Stat(xedPath); err != nil { - t.Skip(err) - } - - testExtDis(t, "intel", arch, xed, generate, allowedMismatchXed) -} - -func testXed32(t *testing.T, generate func(func([]byte))) { - testXedArch(t, 32, generate) -} - -func testXed64(t *testing.T, generate func(func([]byte))) { - testXedArch(t, 64, generate) -} - -func xed(ext *ExtDis) error { - b, err := ext.Run(xedPath, fmt.Sprintf("-%d", ext.Arch), "-n", "1G", "-ir", ext.File.Name()) - if err != nil { - return err - } - - nmatch := 0 - next := uint32(start) - var ( - addr uint32 - encbuf [32]byte - enc []byte - text string - ) - - var xedEnd = []byte("# end of text section") - var xedEnd1 = []byte("# Errors") - - eof := false - for { - line, err := b.ReadSlice('\n') - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("reading objdump output: %v", err) - } - if debug { - os.Stdout.Write(line) - } - if bytes.HasPrefix(line, xedEnd) || bytes.HasPrefix(line, xedEnd1) { - eof = true - } - if eof { - continue - } - nmatch++ - addr, enc, text = parseLineXed(line, encbuf[:0]) - if addr > next { - return fmt.Errorf("address out of sync expected <= %#x at %q in:\n%s", next, line, line) - } - if addr < next { - continue - } - switch text { - case "repz": - text = "rep" - case "repnz": - text = "repn" - default: - text = strings.Replace(text, "repz ", "rep ", -1) - text = strings.Replace(text, "repnz ", "repn ", -1) - } - if m := pcrelw.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int16(uint32(targ)-uint32(uint16(addr))-uint32(len(enc)))) - } - if m := pcrel.FindStringSubmatch(text); m != nil { - targ, _ := strconv.ParseUint(m[2], 16, 64) - text = fmt.Sprintf("%s .%+#x", m[1], int32(uint32(targ)-addr-uint32(len(enc)))) - } - ext.Dec <- ExtInst{addr, encbuf, len(enc), text} - encbuf = [32]byte{} - enc = nil - next += 32 - } - if next != start+uint32(ext.Size) { - return fmt.Errorf("not enough results found [%d %d]", next, start+ext.Size) - } - if err := ext.Wait(); err != nil { - return fmt.Errorf("exec: %v", err) - } - - return nil -} - -var ( - xedInRaw = []byte("In raw...") - xedDots = []byte("...") - xdis = []byte("XDIS ") - xedError = []byte("ERROR: ") - xedNoDecode = []byte("Could not decode at offset: 0x") -) - -func parseLineXed(line []byte, encstart []byte) (addr uint32, enc []byte, text string) { - oline := line - if bytes.HasPrefix(line, xedInRaw) || bytes.HasPrefix(line, xedDots) { - return 0, nil, "" - } - if bytes.HasPrefix(line, xedError) { - i := bytes.IndexByte(line[len(xedError):], ' ') - if i < 0 { - log.Fatalf("cannot parse error: %q", oline) - } - errstr := string(line[len(xedError):]) - i = bytes.Index(line, xedNoDecode) - if i < 0 { - log.Fatalf("cannot parse error: %q", oline) - } - i += len(xedNoDecode) - j := bytes.IndexByte(line[i:], ' ') - if j < 0 { - log.Fatalf("cannot parse error: %q", oline) - } - x, err := strconv.ParseUint(string(trimSpace(line[i:i+j])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint32(x) - return addr, nil, errstr - } - - if !bytes.HasPrefix(line, xdis) { - log.Fatalf("cannot parse disassembly: %q", oline) - } - - i := bytes.IndexByte(line, ':') - if i < 0 { - log.Fatalf("cannot parse disassembly: %q", oline) - } - x, err := strconv.ParseUint(string(trimSpace(line[len(xdis):i])), 16, 32) - if err != nil { - log.Fatalf("cannot parse disassembly: %q", oline) - } - addr = uint32(x) - - // spaces - i++ - for i < len(line) && line[i] == ' ' { - i++ - } - // instruction class, spaces - for i < len(line) && line[i] != ' ' { - i++ - } - for i < len(line) && line[i] == ' ' { - i++ - } - // instruction set, spaces - for i < len(line) && line[i] != ' ' { - i++ - } - for i < len(line) && line[i] == ' ' { - i++ - } - - // hex - hexStart := i - for i < len(line) && line[i] != ' ' { - i++ - } - hexEnd := i - for i < len(line) && line[i] == ' ' { - i++ - } - - // text - textStart := i - for i < len(line) && line[i] != '\n' { - i++ - } - textEnd := i - - enc, ok := parseHex(line[hexStart:hexEnd], encstart) - if !ok { - log.Fatalf("cannot parse disassembly: %q", oline) - } - - return addr, enc, string(fixSpace(line[textStart:textEnd])) -} diff --git a/src/cmd/vendor/golang.org/x/crypto/AUTHORS b/src/cmd/vendor/golang.org/x/crypto/AUTHORS new file mode 100644 index 0000000000..2b00ddba0d --- /dev/null +++ b/src/cmd/vendor/golang.org/x/crypto/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/src/cmd/vendor/golang.org/x/crypto/CONTRIBUTORS b/src/cmd/vendor/golang.org/x/crypto/CONTRIBUTORS new file mode 100644 index 0000000000..1fbd3e976f --- /dev/null +++ b/src/cmd/vendor/golang.org/x/crypto/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index 9a887598ff..9d666ffcf0 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -159,6 +159,10 @@ func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { return keyClearScreen, b[1:] case 23: // ^W return keyDeleteWord, b[1:] + case 14: // ^N + return keyDown, b[1:] + case 16: // ^P + return keyUp, b[1:] } } diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go deleted file mode 100644 index d9b77c1c5e..0000000000 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal_test.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2011 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. - -// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd windows plan9 solaris - -package terminal - -import ( - "bytes" - "io" - "os" - "runtime" - "testing" -) - -type MockTerminal struct { - toSend []byte - bytesPerRead int - received []byte -} - -func (c *MockTerminal) Read(data []byte) (n int, err error) { - n = len(data) - if n == 0 { - return - } - if n > len(c.toSend) { - n = len(c.toSend) - } - if n == 0 { - return 0, io.EOF - } - if c.bytesPerRead > 0 && n > c.bytesPerRead { - n = c.bytesPerRead - } - copy(data, c.toSend[:n]) - c.toSend = c.toSend[n:] - return -} - -func (c *MockTerminal) Write(data []byte) (n int, err error) { - c.received = append(c.received, data...) - return len(data), nil -} - -func TestClose(t *testing.T) { - c := &MockTerminal{} - ss := NewTerminal(c, "> ") - line, err := ss.ReadLine() - if line != "" { - t.Errorf("Expected empty line but got: %s", line) - } - if err != io.EOF { - t.Errorf("Error should have been EOF but got: %s", err) - } -} - -var keyPressTests = []struct { - in string - line string - err error - throwAwayLines int -}{ - { - err: io.EOF, - }, - { - in: "\r", - line: "", - }, - { - in: "foo\r", - line: "foo", - }, - { - in: "a\x1b[Cb\r", // right - line: "ab", - }, - { - in: "a\x1b[Db\r", // left - line: "ba", - }, - { - in: "a\177b\r", // backspace - line: "b", - }, - { - in: "\x1b[A\r", // up - }, - { - in: "\x1b[B\r", // down - }, - { - in: "line\x1b[A\x1b[B\r", // up then down - line: "line", - }, - { - in: "line1\rline2\x1b[A\r", // recall previous line. - line: "line1", - throwAwayLines: 1, - }, - { - // recall two previous lines and append. - in: "line1\rline2\rline3\x1b[A\x1b[Axxx\r", - line: "line1xxx", - throwAwayLines: 2, - }, - { - // Ctrl-A to move to beginning of line followed by ^K to kill - // line. - in: "a b \001\013\r", - line: "", - }, - { - // Ctrl-A to move to beginning of line, Ctrl-E to move to end, - // finally ^K to kill nothing. - in: "a b \001\005\013\r", - line: "a b ", - }, - { - in: "\027\r", - line: "", - }, - { - in: "a\027\r", - line: "", - }, - { - in: "a \027\r", - line: "", - }, - { - in: "a b\027\r", - line: "a ", - }, - { - in: "a b \027\r", - line: "a ", - }, - { - in: "one two thr\x1b[D\027\r", - line: "one two r", - }, - { - in: "\013\r", - line: "", - }, - { - in: "a\013\r", - line: "a", - }, - { - in: "ab\x1b[D\013\r", - line: "a", - }, - { - in: "Ξεσκεπάζω\r", - line: "Ξεσκεπάζω", - }, - { - in: "£\r\x1b[A\177\r", // non-ASCII char, enter, up, backspace. - line: "", - throwAwayLines: 1, - }, - { - in: "£\r££\x1b[A\x1b[B\177\r", // non-ASCII char, enter, 2x non-ASCII, up, down, backspace, enter. - line: "£", - throwAwayLines: 1, - }, - { - // Ctrl-D at the end of the line should be ignored. - in: "a\004\r", - line: "a", - }, - { - // a, b, left, Ctrl-D should erase the b. - in: "ab\x1b[D\004\r", - line: "a", - }, - { - // a, b, c, d, left, left, ^U should erase to the beginning of - // the line. - in: "abcd\x1b[D\x1b[D\025\r", - line: "cd", - }, - { - // Bracketed paste mode: control sequences should be returned - // verbatim in paste mode. - in: "abc\x1b[200~de\177f\x1b[201~\177\r", - line: "abcde\177", - }, - { - // Enter in bracketed paste mode should still work. - in: "abc\x1b[200~d\refg\x1b[201~h\r", - line: "efgh", - throwAwayLines: 1, - }, - { - // Lines consisting entirely of pasted data should be indicated as such. - in: "\x1b[200~a\r", - line: "a", - err: ErrPasteIndicator, - }, -} - -func TestKeyPresses(t *testing.T) { - for i, test := range keyPressTests { - for j := 1; j < len(test.in); j++ { - c := &MockTerminal{ - toSend: []byte(test.in), - bytesPerRead: j, - } - ss := NewTerminal(c, "> ") - for k := 0; k < test.throwAwayLines; k++ { - _, err := ss.ReadLine() - if err != nil { - t.Errorf("Throwaway line %d from test %d resulted in error: %s", k, i, err) - } - } - line, err := ss.ReadLine() - if line != test.line { - t.Errorf("Line resulting from test %d (%d bytes per read) was '%s', expected '%s'", i, j, line, test.line) - break - } - if err != test.err { - t.Errorf("Error resulting from test %d (%d bytes per read) was '%v', expected '%v'", i, j, err, test.err) - break - } - } - } -} - -func TestPasswordNotSaved(t *testing.T) { - c := &MockTerminal{ - toSend: []byte("password\r\x1b[A\r"), - bytesPerRead: 1, - } - ss := NewTerminal(c, "> ") - pw, _ := ss.ReadPassword("> ") - if pw != "password" { - t.Fatalf("failed to read password, got %s", pw) - } - line, _ := ss.ReadLine() - if len(line) > 0 { - t.Fatalf("password was saved in history") - } -} - -var setSizeTests = []struct { - width, height int -}{ - {40, 13}, - {80, 24}, - {132, 43}, -} - -func TestTerminalSetSize(t *testing.T) { - for _, setSize := range setSizeTests { - c := &MockTerminal{ - toSend: []byte("password\r\x1b[A\r"), - bytesPerRead: 1, - } - ss := NewTerminal(c, "> ") - ss.SetSize(setSize.width, setSize.height) - pw, _ := ss.ReadPassword("Password: ") - if pw != "password" { - t.Fatalf("failed to read password, got %s", pw) - } - if string(c.received) != "Password: \r\n" { - t.Errorf("failed to set the temporary prompt expected %q, got %q", "Password: ", c.received) - } - } -} - -func TestReadPasswordLineEnd(t *testing.T) { - var tests = []struct { - input string - want string - }{ - {"\n", ""}, - {"\r\n", ""}, - {"test\r\n", "test"}, - {"testtesttesttes\n", "testtesttesttes"}, - {"testtesttesttes\r\n", "testtesttesttes"}, - {"testtesttesttesttest\n", "testtesttesttesttest"}, - {"testtesttesttesttest\r\n", "testtesttesttesttest"}, - } - for _, test := range tests { - buf := new(bytes.Buffer) - if _, err := buf.WriteString(test.input); err != nil { - t.Fatal(err) - } - - have, err := readPasswordLine(buf) - if err != nil { - t.Errorf("readPasswordLine(%q) failed: %v", test.input, err) - continue - } - if string(have) != test.want { - t.Errorf("readPasswordLine(%q) returns %q, but %q is expected", test.input, string(have), test.want) - continue - } - - if _, err = buf.WriteString(test.input); err != nil { - t.Fatal(err) - } - have, err = readPasswordLine(buf) - if err != nil { - t.Errorf("readPasswordLine(%q) failed: %v", test.input, err) - continue - } - if string(have) != test.want { - t.Errorf("readPasswordLine(%q) returns %q, but %q is expected", test.input, string(have), test.want) - continue - } - } -} - -func TestMakeRawState(t *testing.T) { - fd := int(os.Stdout.Fd()) - if !IsTerminal(fd) { - t.Skip("stdout is not a terminal; skipping test") - } - - st, err := GetState(fd) - if err != nil { - t.Fatalf("failed to get terminal state from GetState: %s", err) - } - - if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { - t.Skip("MakeRaw not allowed on iOS; skipping test") - } - - defer Restore(fd, st) - raw, err := MakeRaw(fd) - if err != nil { - t.Fatalf("failed to get terminal state from MakeRaw: %s", err) - } - - if *st != *raw { - t.Errorf("states do not match; was %v, expected %v", raw, st) - } -} - -func TestOutputNewlines(t *testing.T) { - // \n should be changed to \r\n in terminal output. - buf := new(bytes.Buffer) - term := NewTerminal(buf, ">") - - term.Write([]byte("1\n2\n")) - output := string(buf.Bytes()) - const expected = "1\r\n2\r\n" - - if output != expected { - t.Errorf("incorrect output: was %q, expected %q", output, expected) - } -} diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util.go index 731c89a284..3911040840 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd +// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd // Package terminal provides support functions for dealing with terminals, as // commonly found on UNIX systems. @@ -25,7 +25,7 @@ type State struct { termios unix.Termios } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) return err == nil diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go new file mode 100644 index 0000000000..dfcd627859 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go @@ -0,0 +1,12 @@ +// Copyright 2018 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. + +// +build aix + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go index 799f049f04..9317ac7ede 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go @@ -21,7 +21,7 @@ import ( type State struct{} -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { return false } diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go index 9e41b9f43f..3d5f06a9f0 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go @@ -17,7 +17,7 @@ type State struct { termios unix.Termios } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { _, err := unix.IoctlGetTermio(fd, unix.TCGETA) return err == nil diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go index 8618955df7..6cb8a95038 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -26,7 +26,7 @@ type State struct { mode uint32 } -// IsTerminal returns true if the given file descriptor is a terminal. +// IsTerminal returns whether the given file descriptor is a terminal. func IsTerminal(fd int) bool { var st uint32 err := windows.GetConsoleMode(windows.Handle(fd), &st) diff --git a/src/cmd/vendor/golang.org/x/sys/AUTHORS b/src/cmd/vendor/golang.org/x/sys/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/src/cmd/vendor/golang.org/x/sys/CONTRIBUTORS b/src/cmd/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/src/cmd/vendor/golang.org/x/sys/unix/.gitignore b/src/cmd/vendor/golang.org/x/sys/unix/.gitignore new file mode 100644 index 0000000000..e3e0fc6f89 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/.gitignore @@ -0,0 +1,2 @@ +_obj/ +unix.test diff --git a/src/cmd/vendor/golang.org/x/sys/unix/creds_test.go b/src/cmd/vendor/golang.org/x/sys/unix/creds_test.go deleted file mode 100644 index 1b5083196a..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/creds_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2012 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. - -// +build linux - -package unix_test - -import ( - "bytes" - "go/build" - "net" - "os" - "testing" - - "golang.org/x/sys/unix" -) - -// TestSCMCredentials tests the sending and receiving of credentials -// (PID, UID, GID) in an ancillary message between two UNIX -// sockets. The SO_PASSCRED socket option is enabled on the sending -// socket for this to work. -func TestSCMCredentials(t *testing.T) { - socketTypeTests := []struct { - socketType int - dataLen int - }{ - { - unix.SOCK_STREAM, - 1, - }, { - unix.SOCK_DGRAM, - 0, - }, - } - - for _, tt := range socketTypeTests { - if tt.socketType == unix.SOCK_DGRAM && !atLeast1p10() { - t.Log("skipping DGRAM test on pre-1.10") - continue - } - - fds, err := unix.Socketpair(unix.AF_LOCAL, tt.socketType, 0) - if err != nil { - t.Fatalf("Socketpair: %v", err) - } - defer unix.Close(fds[0]) - defer unix.Close(fds[1]) - - err = unix.SetsockoptInt(fds[0], unix.SOL_SOCKET, unix.SO_PASSCRED, 1) - if err != nil { - t.Fatalf("SetsockoptInt: %v", err) - } - - srvFile := os.NewFile(uintptr(fds[0]), "server") - defer srvFile.Close() - srv, err := net.FileConn(srvFile) - if err != nil { - t.Errorf("FileConn: %v", err) - return - } - defer srv.Close() - - cliFile := os.NewFile(uintptr(fds[1]), "client") - defer cliFile.Close() - cli, err := net.FileConn(cliFile) - if err != nil { - t.Errorf("FileConn: %v", err) - return - } - defer cli.Close() - - var ucred unix.Ucred - ucred.Pid = int32(os.Getpid()) - ucred.Uid = uint32(os.Getuid()) - ucred.Gid = uint32(os.Getgid()) - oob := unix.UnixCredentials(&ucred) - - // On SOCK_STREAM, this is internally going to send a dummy byte - n, oobn, err := cli.(*net.UnixConn).WriteMsgUnix(nil, oob, nil) - if err != nil { - t.Fatalf("WriteMsgUnix: %v", err) - } - if n != 0 { - t.Fatalf("WriteMsgUnix n = %d, want 0", n) - } - if oobn != len(oob) { - t.Fatalf("WriteMsgUnix oobn = %d, want %d", oobn, len(oob)) - } - - oob2 := make([]byte, 10*len(oob)) - n, oobn2, flags, _, err := srv.(*net.UnixConn).ReadMsgUnix(nil, oob2) - if err != nil { - t.Fatalf("ReadMsgUnix: %v", err) - } - if flags != 0 { - t.Fatalf("ReadMsgUnix flags = 0x%x, want 0", flags) - } - if n != tt.dataLen { - t.Fatalf("ReadMsgUnix n = %d, want %d", n, tt.dataLen) - } - if oobn2 != oobn { - // without SO_PASSCRED set on the socket, ReadMsgUnix will - // return zero oob bytes - t.Fatalf("ReadMsgUnix oobn = %d, want %d", oobn2, oobn) - } - oob2 = oob2[:oobn2] - if !bytes.Equal(oob, oob2) { - t.Fatal("ReadMsgUnix oob bytes don't match") - } - - scm, err := unix.ParseSocketControlMessage(oob2) - if err != nil { - t.Fatalf("ParseSocketControlMessage: %v", err) - } - newUcred, err := unix.ParseUnixCredentials(&scm[0]) - if err != nil { - t.Fatalf("ParseUnixCredentials: %v", err) - } - if *newUcred != ucred { - t.Fatalf("ParseUnixCredentials = %+v, want %+v", newUcred, ucred) - } - } -} - -// atLeast1p10 reports whether we are running on Go 1.10 or later. -func atLeast1p10() bool { - for _, ver := range build.Default.ReleaseTags { - if ver == "go1.10" { - return true - } - } - return false -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/darwin_test.go b/src/cmd/vendor/golang.org/x/sys/unix/darwin_test.go deleted file mode 100644 index 29af36f102..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/darwin_test.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2018 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. - -// +build darwin,go1.12,amd64 darwin,go1.12,386 - -package unix - -import ( - "os" - "os/exec" - "strings" - "testing" -) - -type darwinTest struct { - name string - f func() -} - -// TODO(khr): decide whether to keep this test enabled permanently or -// only temporarily. -func TestDarwinLoader(t *testing.T) { - // Make sure the Darwin dynamic loader can actually resolve - // all the system calls into libSystem.dylib. Unfortunately - // there is no easy way to test this at compile time. So we - // implement a crazy hack here, calling into the syscall - // function with all its arguments set to junk, and see what - // error we get. We are happy with any error (or none) except - // an error from the dynamic loader. - // - // We have to run each test in a separate subprocess for fault isolation. - // - // Hopefully the junk args won't accidentally ask the system to do "rm -fr /". - // - // In an ideal world each syscall would have its own test, so this test - // would be unnecessary. Unfortunately, we do not live in that world. - for _, test := range darwinTests { - // Call the test binary recursively, giving it a magic argument - // (see init below) and the name of the test to run. - cmd := exec.Command(os.Args[0], "testDarwinLoader", test.name) - - // Run subprocess, collect results. Note that we expect the subprocess - // to fail somehow, so the error is irrelevant. - out, _ := cmd.CombinedOutput() - - if strings.Contains(string(out), "dyld: Symbol not found:") { - t.Errorf("can't resolve %s in libSystem.dylib", test.name) - } - if !strings.Contains(string(out), "success") { - // Not really an error. Might be a syscall that never returns, - // like exit, or one that segfaults, like gettimeofday. - t.Logf("test never finished: %s: %s", test.name, string(out)) - } - } -} - -func init() { - // The test binary execs itself with the "testDarwinLoader" argument. - // Run the test specified by os.Args[2], then panic. - if len(os.Args) >= 3 && os.Args[1] == "testDarwinLoader" { - for _, test := range darwinTests { - if test.name == os.Args[2] { - test.f() - } - } - // Panic with a "success" label, so the parent process can check it. - panic("success") - } -} - -// All the _trampoline functions in zsyscall_darwin_$ARCH.s -var darwinTests = [...]darwinTest{ - {"getgroups", libc_getgroups_trampoline}, - {"setgroups", libc_setgroups_trampoline}, - {"wait4", libc_wait4_trampoline}, - {"accept", libc_accept_trampoline}, - {"bind", libc_bind_trampoline}, - {"connect", libc_connect_trampoline}, - {"socket", libc_socket_trampoline}, - {"getsockopt", libc_getsockopt_trampoline}, - {"setsockopt", libc_setsockopt_trampoline}, - {"getpeername", libc_getpeername_trampoline}, - {"getsockname", libc_getsockname_trampoline}, - {"shutdown", libc_shutdown_trampoline}, - {"socketpair", libc_socketpair_trampoline}, - {"recvfrom", libc_recvfrom_trampoline}, - {"sendto", libc_sendto_trampoline}, - {"recvmsg", libc_recvmsg_trampoline}, - {"sendmsg", libc_sendmsg_trampoline}, - {"kevent", libc_kevent_trampoline}, - {"__sysctl", libc___sysctl_trampoline}, - {"utimes", libc_utimes_trampoline}, - {"futimes", libc_futimes_trampoline}, - {"fcntl", libc_fcntl_trampoline}, - {"poll", libc_poll_trampoline}, - {"madvise", libc_madvise_trampoline}, - {"mlock", libc_mlock_trampoline}, - {"mlockall", libc_mlockall_trampoline}, - {"mprotect", libc_mprotect_trampoline}, - {"msync", libc_msync_trampoline}, - {"munlock", libc_munlock_trampoline}, - {"munlockall", libc_munlockall_trampoline}, - {"ptrace", libc_ptrace_trampoline}, - {"pipe", libc_pipe_trampoline}, - {"getxattr", libc_getxattr_trampoline}, - {"fgetxattr", libc_fgetxattr_trampoline}, - {"setxattr", libc_setxattr_trampoline}, - {"fsetxattr", libc_fsetxattr_trampoline}, - {"removexattr", libc_removexattr_trampoline}, - {"fremovexattr", libc_fremovexattr_trampoline}, - {"listxattr", libc_listxattr_trampoline}, - {"flistxattr", libc_flistxattr_trampoline}, - {"kill", libc_kill_trampoline}, - {"ioctl", libc_ioctl_trampoline}, - {"access", libc_access_trampoline}, - {"adjtime", libc_adjtime_trampoline}, - {"chdir", libc_chdir_trampoline}, - {"chflags", libc_chflags_trampoline}, - {"chmod", libc_chmod_trampoline}, - {"chown", libc_chown_trampoline}, - {"chroot", libc_chroot_trampoline}, - {"close", libc_close_trampoline}, - {"dup", libc_dup_trampoline}, - {"dup2", libc_dup2_trampoline}, - {"exchangedata", libc_exchangedata_trampoline}, - {"exit", libc_exit_trampoline}, - {"faccessat", libc_faccessat_trampoline}, - {"fchdir", libc_fchdir_trampoline}, - {"fchflags", libc_fchflags_trampoline}, - {"fchmod", libc_fchmod_trampoline}, - {"fchmodat", libc_fchmodat_trampoline}, - {"fchown", libc_fchown_trampoline}, - {"fchownat", libc_fchownat_trampoline}, - {"flock", libc_flock_trampoline}, - {"fpathconf", libc_fpathconf_trampoline}, - {"fstat64", libc_fstat64_trampoline}, - {"fstatat64", libc_fstatat64_trampoline}, - {"fstatfs64", libc_fstatfs64_trampoline}, - {"fsync", libc_fsync_trampoline}, - {"ftruncate", libc_ftruncate_trampoline}, - {"__getdirentries64", libc___getdirentries64_trampoline}, - {"getdtablesize", libc_getdtablesize_trampoline}, - {"getegid", libc_getegid_trampoline}, - {"geteuid", libc_geteuid_trampoline}, - {"getgid", libc_getgid_trampoline}, - {"getpgid", libc_getpgid_trampoline}, - {"getpgrp", libc_getpgrp_trampoline}, - {"getpid", libc_getpid_trampoline}, - {"getppid", libc_getppid_trampoline}, - {"getpriority", libc_getpriority_trampoline}, - {"getrlimit", libc_getrlimit_trampoline}, - {"getrusage", libc_getrusage_trampoline}, - {"getsid", libc_getsid_trampoline}, - {"getuid", libc_getuid_trampoline}, - {"issetugid", libc_issetugid_trampoline}, - {"kqueue", libc_kqueue_trampoline}, - {"lchown", libc_lchown_trampoline}, - {"link", libc_link_trampoline}, - {"linkat", libc_linkat_trampoline}, - {"listen", libc_listen_trampoline}, - {"lstat64", libc_lstat64_trampoline}, - {"mkdir", libc_mkdir_trampoline}, - {"mkdirat", libc_mkdirat_trampoline}, - {"mkfifo", libc_mkfifo_trampoline}, - {"mknod", libc_mknod_trampoline}, - {"open", libc_open_trampoline}, - {"openat", libc_openat_trampoline}, - {"pathconf", libc_pathconf_trampoline}, - {"pread", libc_pread_trampoline}, - {"pwrite", libc_pwrite_trampoline}, - {"read", libc_read_trampoline}, - {"readlink", libc_readlink_trampoline}, - {"readlinkat", libc_readlinkat_trampoline}, - {"rename", libc_rename_trampoline}, - {"renameat", libc_renameat_trampoline}, - {"revoke", libc_revoke_trampoline}, - {"rmdir", libc_rmdir_trampoline}, - {"lseek", libc_lseek_trampoline}, - {"select", libc_select_trampoline}, - {"setegid", libc_setegid_trampoline}, - {"seteuid", libc_seteuid_trampoline}, - {"setgid", libc_setgid_trampoline}, - {"setlogin", libc_setlogin_trampoline}, - {"setpgid", libc_setpgid_trampoline}, - {"setpriority", libc_setpriority_trampoline}, - {"setprivexec", libc_setprivexec_trampoline}, - {"setregid", libc_setregid_trampoline}, - {"setreuid", libc_setreuid_trampoline}, - {"setrlimit", libc_setrlimit_trampoline}, - {"setsid", libc_setsid_trampoline}, - {"settimeofday", libc_settimeofday_trampoline}, - {"setuid", libc_setuid_trampoline}, - {"stat64", libc_stat64_trampoline}, - {"statfs64", libc_statfs64_trampoline}, - {"symlink", libc_symlink_trampoline}, - {"symlinkat", libc_symlinkat_trampoline}, - {"sync", libc_sync_trampoline}, - {"truncate", libc_truncate_trampoline}, - {"umask", libc_umask_trampoline}, - {"undelete", libc_undelete_trampoline}, - {"unlink", libc_unlink_trampoline}, - {"unlinkat", libc_unlinkat_trampoline}, - {"unmount", libc_unmount_trampoline}, - {"write", libc_write_trampoline}, - {"mmap", libc_mmap_trampoline}, - {"munmap", libc_munmap_trampoline}, - {"gettimeofday", libc_gettimeofday_trampoline}, - {"getfsstat64", libc_getfsstat64_trampoline}, -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/dev_linux_test.go b/src/cmd/vendor/golang.org/x/sys/unix/dev_linux_test.go deleted file mode 100644 index 51645289ca..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/dev_linux_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2017 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. - -// +build go1.7 - -package unix_test - -import ( - "fmt" - "testing" - - "golang.org/x/sys/unix" -) - -func TestDevices(t *testing.T) { - testCases := []struct { - path string - major uint32 - minor uint32 - }{ - // well known major/minor numbers according to - // https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/admin-guide/devices.txt - {"/dev/null", 1, 3}, - {"/dev/zero", 1, 5}, - {"/dev/random", 1, 8}, - {"/dev/full", 1, 7}, - {"/dev/urandom", 1, 9}, - {"/dev/tty", 5, 0}, - } - for _, tc := range testCases { - t.Run(fmt.Sprintf("%s %v:%v", tc.path, tc.major, tc.minor), func(t *testing.T) { - var stat unix.Stat_t - err := unix.Stat(tc.path, &stat) - if err != nil { - if err == unix.EACCES { - t.Skip("no permission to stat device, skipping test") - } - t.Errorf("failed to stat device: %v", err) - return - } - - dev := uint64(stat.Rdev) - if unix.Major(dev) != tc.major { - t.Errorf("for %s Major(%#x) == %d, want %d", tc.path, dev, unix.Major(dev), tc.major) - } - if unix.Minor(dev) != tc.minor { - t.Errorf("for %s Minor(%#x) == %d, want %d", tc.path, dev, unix.Minor(dev), tc.minor) - } - if unix.Mkdev(tc.major, tc.minor) != dev { - t.Errorf("for %s Mkdev(%d, %d) == %#x, want %#x", tc.path, tc.major, tc.minor, unix.Mkdev(tc.major, tc.minor), dev) - } - }) - - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/example_exec_test.go b/src/cmd/vendor/golang.org/x/sys/unix/example_exec_test.go deleted file mode 100644 index bb4d3bf5da..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/example_exec_test.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "log" - "os" - - "golang.org/x/sys/unix" -) - -func ExampleExec() { - err := unix.Exec("/bin/ls", []string{"ls", "-al"}, os.Environ()) - log.Fatal(err) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/example_flock_test.go b/src/cmd/vendor/golang.org/x/sys/unix/example_flock_test.go deleted file mode 100644 index 6c9174859e..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/example_flock_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018 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. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "log" - "os" - - "golang.org/x/sys/unix" -) - -func ExampleFlock() { - f, _ := os.Create("example.lock") - if err := unix.Flock(int(f.Fd()), unix.LOCK_EX); err != nil { - log.Fatal(err) - } - // Do work here that requires the lock. When finished, release the lock: - if err := unix.Flock(int(f.Fd()), unix.LOCK_UN); err != nil { - log.Fatal(err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/export_test.go b/src/cmd/vendor/golang.org/x/sys/unix/export_test.go deleted file mode 100644 index f8ae0e0e37..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/export_test.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2015 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix - -var Itoa = itoa diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh old mode 100755 new mode 100644 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go new file mode 100644 index 0000000000..4548b993db --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go @@ -0,0 +1,61 @@ +// Copyright 2018 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. + +// +build ignore + +// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. +//This program must be run after mksyscall.go. +package main + +import ( + "bytes" + "fmt" + "io/ioutil" + "log" + "os" + "strings" +) + +func main() { + in1, err := ioutil.ReadFile("syscall_darwin.go") + if err != nil { + log.Fatalf("can't open syscall_darwin.go: %s", err) + } + arch := os.Args[1] + in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) + if err != nil { + log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) + } + in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) + if err != nil { + log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) + } + in := string(in1) + string(in2) + string(in3) + + trampolines := map[string]bool{} + + var out bytes.Buffer + + fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) + fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") + fmt.Fprintf(&out, "\n") + fmt.Fprintf(&out, "// +build go1.12\n") + fmt.Fprintf(&out, "\n") + fmt.Fprintf(&out, "#include \"textflag.h\"\n") + for _, line := range strings.Split(in, "\n") { + if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { + continue + } + fn := line[5 : len(line)-13] + if !trampolines[fn] { + trampolines[fn] = true + fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) + fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) + } + } + err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) + if err != nil { + log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) + } +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh old mode 100755 new mode 100644 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go b/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 0000000000..9feddd00c4 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,106 @@ +// Copyright 2016 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. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the Docker-based build system if we should be. + if goos == "linux" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // Intentionally export __val fields in Fsid and Sigset_t + valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) + b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) + + // Intentionally export __fds_bits field in FdSet + fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) + b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Convert [65]int8 to [65]byte in Utsname members to simplify + // conversion to string; see golang.org/issue/20753 + convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) + b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + + // Convert [1024]int8 to [1024]byte in Ptmget members + convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) + b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) + + // Remove spare fields (e.g. in Statx_t) + spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) + b = spareFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove cgo padding fields + removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go new file mode 100644 index 0000000000..e06e4253ea --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go @@ -0,0 +1,402 @@ +// Copyright 2018 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. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_darwin.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named errno. + +A line beginning with //sysnb is like //sys, except that the +goroutine will not be suspended during the execution of the system +call. This must only be used for system calls which can never +block, as otherwise the system call could cause all goroutines to +hang. +*/ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + plan9 = flag.Bool("plan9", false, "plan9") + openbsd = flag.Bool("openbsd", false, "openbsd") + netbsd = flag.Bool("netbsd", false, "netbsd") + dragonfly = flag.Bool("dragonfly", false, "dragonfly") + arm = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair + tags = flag.String("tags", "", "build tags") + filename = flag.String("output", "", "output file name (standard output if omitted)") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + if goos == "" { + fmt.Fprintln(os.Stderr, "GOOS not defined in environment") + os.Exit(1) + } + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + + // Check that we are using the Docker-based build system if we should + if goos == "linux" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") + fmt.Fprintf(os.Stderr, "See README.md\n") + os.Exit(1) + } + } + + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + libc := false + if goos == "darwin" && strings.Contains(buildTags(), ",go1.12") { + libc = true + } + trampolines := map[string]bool{} + + text := "" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, errno error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, sysname := f[2], f[3], f[4], f[5] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // Go function header. + outDecl := "" + if len(out) > 0 { + outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) + } + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) + + // Check if err return available + errvar := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + break + } + } + + // Prepare arguments to Syscall. + var args []string + n := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\tvar _p%d *byte\n", n) + text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) + text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\tvar _p%d *byte\n", n) + text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass dummy pointer in that case. + // Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) + text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) + args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) + n++ + } else if p.Type == "int64" && (*openbsd || *netbsd) { + args = append(args, "0") + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else if endianness == "little-endian" { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } else if p.Type == "int64" && *dragonfly { + if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { + args = append(args, "0") + } + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else if endianness == "little-endian" { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } else if p.Type == "int64" && endianness != "" { + if len(args)%2 == 1 && *arm { + // arm abi specifies 64-bit argument uses + // (even, odd) pair + args = append(args, "0") + } + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } + + // Determine which form to use; pad args with zeros. + asm := "Syscall" + if nonblock != nil { + if errvar == "" && goos == "linux" { + asm = "RawSyscallNoError" + } else { + asm = "RawSyscall" + } + } else { + if errvar == "" && goos == "linux" { + asm = "SyscallNoError" + } + } + if len(args) <= 3 { + for len(args) < 3 { + args = append(args, "0") + } + } else if len(args) <= 6 { + asm += "6" + for len(args) < 6 { + args = append(args, "0") + } + } else if len(args) <= 9 { + asm += "9" + for len(args) < 9 { + args = append(args, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) + } + + // System call number. + if sysname == "" { + sysname = "SYS_" + funct + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToUpper(sysname) + } + + var libcFn string + if libc { + asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call + sysname = strings.TrimPrefix(sysname, "SYS_") // remove SYS_ + sysname = strings.ToLower(sysname) // lowercase + if sysname == "getdirentries64" { + // Special case - libSystem name and + // raw syscall name don't match. + sysname = "__getdirentries64" + } + libcFn = sysname + sysname = "funcPC(libc_" + sysname + "_trampoline)" + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) + + // Assign return values. + body := "" + ret := []string{"_", "_", "_"} + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" && !*plan9 { + reg = "e1" + ret[2] = reg + doErrno = true + } else if p.Name == "err" && *plan9 { + ret[0] = "r0" + ret[2] = "e1" + break + } else { + reg = fmt.Sprintf("r%d", i) + ret[i] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%s != 0", reg) + } + if p.Type == "int64" && endianness != "" { + // 64-bit number in r1:r0 or r0:r1. + if i+2 > len(out) { + fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) + } + if endianness == "big-endian" { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) + } else { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) + } + ret[i] = fmt.Sprintf("r%d", i) + ret[i+1] = fmt.Sprintf("r%d", i+1) + } + if reg != "e1" || *plan9 { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { + text += fmt.Sprintf("\t%s\n", call) + } else { + if errvar == "" && goos == "linux" { + // raw syscall without error on Linux, see golang.org/issue/22924 + text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) + } else { + text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) + } + } + text += body + + if *plan9 && ret[2] == "e1" { + text += "\tif int32(r0) == -1 {\n" + text += "\t\terr = e1\n" + text += "\t}\n" + } else if doErrno { + text += "\tif e1 != 0 {\n" + text += "\t\terr = errnoErr(e1)\n" + text += "\t}\n" + } + text += "\treturn\n" + text += "}\n\n" + + if libc && !trampolines[libcFn] { + // some system calls share a trampoline, like read and readlen. + trampolines[libcFn] = true + // Declare assembly trampoline. + text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) + // Assembly trampoline calls the libc_* function, which this magic + // redirects to use the function from libSystem. + text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) + text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) + text += "\n" + } + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +%s +` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go new file mode 100644 index 0000000000..f2c58fb7cc --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go @@ -0,0 +1,404 @@ +// Copyright 2019 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. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_aix.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt +*/ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + aix = flag.Bool("aix", false, "aix") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + text := "" + cExtern := "/*\n#include \n#include \n" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // Check if value return, err return available + errvar := "" + retvar := "" + rettype := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + } else { + retvar = p.Name + rettype = p.Type + } + } + + // System call name. + if sysname == "" { + sysname = funct + } + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + cRettype := "" + if rettype == "unsafe.Pointer" { + cRettype = "uintptr_t" + } else if rettype == "uintptr" { + cRettype = "uintptr_t" + } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { + cRettype = "uintptr_t" + } else if rettype == "int" { + cRettype = "int" + } else if rettype == "int32" { + cRettype = "int" + } else if rettype == "int64" { + cRettype = "long long" + } else if rettype == "uint32" { + cRettype = "unsigned int" + } else if rettype == "uint64" { + cRettype = "unsigned long long" + } else { + cRettype = "int" + } + if sysname == "exit" { + cRettype = "void" + } + + // Change p.Types to c + var cIn []string + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "string" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t", "size_t") + } else if p.Type == "unsafe.Pointer" { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "uintptr" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "int" { + cIn = append(cIn, "int") + } else if p.Type == "int32" { + cIn = append(cIn, "int") + } else if p.Type == "int64" { + cIn = append(cIn, "long long") + } else if p.Type == "uint32" { + cIn = append(cIn, "unsigned int") + } else if p.Type == "uint64" { + cIn = append(cIn, "unsigned long long") + } else { + cIn = append(cIn, "int") + } + } + + if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { + // Imports of system calls from libc + cExtern += fmt.Sprintf("%s %s", cRettype, sysname) + cIn := strings.Join(cIn, ", ") + cExtern += fmt.Sprintf("(%s);\n", cIn) + } + + // So file name. + if *aix { + if modname == "" { + modname = "libc.a/shr_64.o" + } else { + fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) + os.Exit(1) + } + } + + strconvfunc := "C.CString" + + // Go function header. + if outps != "" { + outps = fmt.Sprintf(" (%s)", outps) + } + if text != "" { + text += "\n" + } + + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) + + // Prepare arguments to Syscall. + var args []string + n := 0 + argN := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) + n++ + text += fmt.Sprintf("\tvar _p%d int\n", n) + text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) + args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) + n++ + } else if p.Type == "int64" && endianness != "" { + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + n++ + } else if p.Type == "bool" { + text += fmt.Sprintf("\tvar _p%d uint32\n", n) + text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) + args = append(args, fmt.Sprintf("_p%d", n)) + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) + } else if p.Type == "unsafe.Pointer" { + args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) + } else if p.Type == "int" { + if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { + args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) + } else if argN == 0 && funct == "fcntl" { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } + } else if p.Type == "int32" { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } else if p.Type == "int64" { + args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) + } else if p.Type == "uint32" { + args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) + } else if p.Type == "uint64" { + args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) + } else if p.Type == "uintptr" { + args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) + } + argN++ + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := "" + if sysname == "exit" { + if errvar != "" { + call += "er :=" + } else { + call += "" + } + } else if errvar != "" { + call += "r0,er :=" + } else if retvar != "" { + call += "r0,_ :=" + } else { + call += "" + } + call += fmt.Sprintf("C.%s(%s)", sysname, arglist) + + // Assign return values. + body := "" + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + } else { + reg = "r0" + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + + // verify return + if sysname != "exit" && errvar != "" { + if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { + body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } else { + body += "\tif (r0 ==-1 && er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } + } else if errvar != "" { + body += "\tif (er != nil) {\n" + body += fmt.Sprintf("\t\t%s = er\n", errvar) + body += "\t}\n" + } + + text += fmt.Sprintf("\t%s\n", call) + text += body + + text += "\treturn\n" + text += "}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + + +%s +*/ +import "C" +import ( + "unsafe" +) + + +%s + +%s +` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go new file mode 100644 index 0000000000..45b4429088 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go @@ -0,0 +1,602 @@ +// Copyright 2019 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. + +// +build ignore + +/* +This program reads a file containing function prototypes +(like syscall_aix.go) and generates system call bodies. +The prototypes are marked by lines beginning with "//sys" +and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt + + +This program will generate three files and handle both gc and gccgo implementation: + - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) + - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6 + - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. + + The generated code looks like this + +zsyscall_aix_ppc64.go +func asyscall(...) (n int, err error) { + // Pointer Creation + r1, e1 := callasyscall(...) + // Type Conversion + // Error Handler + return +} + +zsyscall_aix_ppc64_gc.go +//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o" +//go:linkname libc_asyscall libc_asyscall +var asyscall syscallFunc + +func callasyscall(...) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) + return +} + +zsyscall_aix_ppc64_ggcgo.go + +// int asyscall(...) + +import "C" + +func callasyscall(...) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.asyscall(...)) + e1 = syscall.GetErrno() + return +} +*/ + +package main + +import ( + "bufio" + "flag" + "fmt" + "io/ioutil" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + aix = flag.Bool("aix", false, "aix") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + // GCCGO + textgccgo := "" + cExtern := "/*\n#include \n" + // GC + textgc := "" + dynimports := "" + linknames := "" + var vars []string + // COMMON + textcommon := "" + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + if sysname == "" { + sysname = funct + } + + onlyCommon := false + if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { + // This function call another syscall which is already implemented. + // Therefore, the gc and gccgo part must not be generated. + onlyCommon = true + } + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + + textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + if !onlyCommon { + textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + } + + // Check if value return, err return available + errvar := "" + rettype := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + } else { + rettype = p.Type + } + } + + sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + // GCCGO Prototype return type + cRettype := "" + if rettype == "unsafe.Pointer" { + cRettype = "uintptr_t" + } else if rettype == "uintptr" { + cRettype = "uintptr_t" + } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { + cRettype = "uintptr_t" + } else if rettype == "int" { + cRettype = "int" + } else if rettype == "int32" { + cRettype = "int" + } else if rettype == "int64" { + cRettype = "long long" + } else if rettype == "uint32" { + cRettype = "unsigned int" + } else if rettype == "uint64" { + cRettype = "unsigned long long" + } else { + cRettype = "int" + } + if sysname == "exit" { + cRettype = "void" + } + + // GCCGO Prototype arguments type + var cIn []string + for i, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "string" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t", "size_t") + } else if p.Type == "unsafe.Pointer" { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "uintptr" { + cIn = append(cIn, "uintptr_t") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { + cIn = append(cIn, "uintptr_t") + } else if p.Type == "int" { + if (i == 0 || i == 2) && funct == "fcntl" { + // These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock + cIn = append(cIn, "uintptr_t") + } else { + cIn = append(cIn, "int") + } + + } else if p.Type == "int32" { + cIn = append(cIn, "int") + } else if p.Type == "int64" { + cIn = append(cIn, "long long") + } else if p.Type == "uint32" { + cIn = append(cIn, "unsigned int") + } else if p.Type == "uint64" { + cIn = append(cIn, "unsigned long long") + } else { + cIn = append(cIn, "int") + } + } + + if !onlyCommon { + // GCCGO Prototype Generation + // Imports of system calls from libc + cExtern += fmt.Sprintf("%s %s", cRettype, sysname) + cIn := strings.Join(cIn, ", ") + cExtern += fmt.Sprintf("(%s);\n", cIn) + } + // GC Library name + if modname == "" { + modname = "libc.a/shr_64.o" + } else { + fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) + os.Exit(1) + } + sysvarname := fmt.Sprintf("libc_%s", sysname) + + if !onlyCommon { + // GC Runtime import of function to allow cross-platform builds. + dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) + // GC Link symbol to proc address variable. + linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) + // GC Library proc address variable. + vars = append(vars, sysvarname) + } + + strconvfunc := "BytePtrFromString" + strconvtype := "*byte" + + // Go function header. + if outps != "" { + outps = fmt.Sprintf(" (%s)", outps) + } + if textcommon != "" { + textcommon += "\n" + } + + textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) + + // Prepare arguments tocall. + var argscommon []string // Arguments in the common part + var argscall []string // Arguments for call prototype + var argsgc []string // Arguments for gc call (with syscall6) + var argsgccgo []string // Arguments for gccgo call (with C.name_of_syscall) + n := 0 + argN := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if p.Type == "string" && errvar != "" { + textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) + n++ + } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) + textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) + argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) + n++ + } else if p.Type == "int64" && endianness != "" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") + } else if p.Type == "bool" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") + } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { + argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else if p.Type == "int" { + if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { + // These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock + argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + + } else { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } + } else if p.Type == "int32" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } else if p.Type == "int64" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) + } else if p.Type == "uint32" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) + } else if p.Type == "uint64" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) + } else if p.Type == "uintptr" { + argscommon = append(argscommon, p.Name) + argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) + argsgc = append(argsgc, p.Name) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) + } else { + argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) + argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) + argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) + argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) + } + argN++ + } + nargs := len(argsgc) + + // COMMON function generation + argscommonlist := strings.Join(argscommon, ", ") + callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) + ret := []string{"_", "_"} + body := "" + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + ret[1] = reg + doErrno = true + } else { + reg = "r0" + ret[0] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%s != 0", reg) + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" { + textcommon += fmt.Sprintf("\t%s\n", callcommon) + } else { + textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) + } + textcommon += body + + if doErrno { + textcommon += "\tif e1 != 0 {\n" + textcommon += "\t\terr = errnoErr(e1)\n" + textcommon += "\t}\n" + } + textcommon += "\treturn\n" + textcommon += "}\n" + + if onlyCommon { + continue + } + + // CALL Prototype + callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) + + // GC function generation + asm := "syscall6" + if nonblock != nil { + asm = "rawSyscall6" + } + + if len(argsgc) <= 6 { + for len(argsgc) < 6 { + argsgc = append(argsgc, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) + os.Exit(1) + } + argsgclist := strings.Join(argsgc, ", ") + callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) + + textgc += callProto + textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) + textgc += "\treturn\n}\n" + + // GCCGO function generation + argsgccgolist := strings.Join(argsgccgo, ", ") + callgccgo := fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) + textgccgo += callProto + textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) + textgccgo += "\te1 = syscall.GetErrno()\n" + textgccgo += "\treturn\n}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + + // Print zsyscall_aix_ppc64.go + err := ioutil.WriteFile("zsyscall_aix_ppc64.go", + []byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + + // Print zsyscall_aix_ppc64_gc.go + vardecls := "\t" + strings.Join(vars, ",\n\t") + vardecls += " syscallFunc" + err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", + []byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + + // Print zsyscall_aix_ppc64_gccgo.go + err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", + []byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), + 0644) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } +} + +const srcTemplate1 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + +import ( + "unsafe" +) + + +%s + +%s +` +const srcTemplate2 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s +// +build !gccgo + +package %s + +import ( + "unsafe" +) +%s +%s +%s +type syscallFunc uintptr + +var ( +%s +) + +// Implemented in runtime/syscall_aix.go. +func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) + +%s +` +const srcTemplate3 = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s +// +build gccgo + +package %s + +%s +*/ +import "C" +import ( + "syscall" +) + + +%s + +%s +` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go new file mode 100644 index 0000000000..3d864738b6 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go @@ -0,0 +1,335 @@ +// Copyright 2019 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. + +// +build ignore + +/* + This program reads a file containing function prototypes + (like syscall_solaris.go) and generates system call bodies. + The prototypes are marked by lines beginning with "//sys" + and read like func declarations if //sys is replaced by func, but: + * The parameter lists must give a name for each argument. + This includes return parameters. + * The parameter lists must give a type for each argument: + the (x, y, z int) shorthand is not allowed. + * If the return parameter is an error number, it must be named err. + * If go func name needs to be different than its libc name, + * or the function is not in libc, name could be specified + * at the end, after "=" sign, like + //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt +*/ + +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "regexp" + "strings" +) + +var ( + b32 = flag.Bool("b32", false, "32bit big-endian") + l32 = flag.Bool("l32", false, "32bit little-endian") + tags = flag.String("tags", "", "build tags") +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return *tags +} + +// Param is function parameter +type Param struct { + Name string + Type string +} + +// usage prints the program usage +func usage() { + fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") + os.Exit(1) +} + +// parseParamList parses parameter list and returns a slice of parameters +func parseParamList(list string) []string { + list = strings.TrimSpace(list) + if list == "" { + return []string{} + } + return regexp.MustCompile(`\s*,\s*`).Split(list, -1) +} + +// parseParam splits a parameter into name and type +func parseParam(p string) Param { + ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) + if ps == nil { + fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) + os.Exit(1) + } + return Param{ps[1], ps[2]} +} + +func main() { + flag.Usage = usage + flag.Parse() + if len(flag.Args()) <= 0 { + fmt.Fprintf(os.Stderr, "no files to parse provided\n") + usage() + } + + endianness := "" + if *b32 { + endianness = "big-endian" + } else if *l32 { + endianness = "little-endian" + } + + pack := "" + text := "" + dynimports := "" + linknames := "" + var vars []string + for _, path := range flag.Args() { + file, err := os.Open(path) + if err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + s := bufio.NewScanner(file) + for s.Scan() { + t := s.Text() + t = strings.TrimSpace(t) + t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) + if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { + pack = p[1] + } + nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) + if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { + continue + } + + // Line must be of the form + // func Open(path string, mode int, perm int) (fd int, err error) + // Split into name, in params, out params. + f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) + if f == nil { + fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) + os.Exit(1) + } + funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] + + // Split argument lists on comma. + in := parseParamList(inps) + out := parseParamList(outps) + + inps = strings.Join(in, ", ") + outps = strings.Join(out, ", ") + + // Try in vain to keep people from editing this file. + // The theory is that they jump into the middle of the file + // without reading the header. + text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" + + // So file name. + if modname == "" { + modname = "libc" + } + + // System call name. + if sysname == "" { + sysname = funct + } + + // System call pointer variable name. + sysvarname := fmt.Sprintf("proc%s", sysname) + + strconvfunc := "BytePtrFromString" + strconvtype := "*byte" + + sysname = strings.ToLower(sysname) // All libc functions are lowercase. + + // Runtime import of function to allow cross-platform builds. + dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) + // Link symbol to proc address variable. + linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) + // Library proc address variable. + vars = append(vars, sysvarname) + + // Go function header. + outlist := strings.Join(out, ", ") + if outlist != "" { + outlist = fmt.Sprintf(" (%s)", outlist) + } + if text != "" { + text += "\n" + } + text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) + + // Check if err return available + errvar := "" + for _, param := range out { + p := parseParam(param) + if p.Type == "error" { + errvar = p.Name + continue + } + } + + // Prepare arguments to Syscall. + var args []string + n := 0 + for _, param := range in { + p := parseParam(param) + if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { + args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") + } else if p.Type == "string" && errvar != "" { + text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) + text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if p.Type == "string" { + fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") + text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) + text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) + n++ + } else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { + // Convert slice into pointer, length. + // Have to be careful not to take address of &a[0] if len == 0: + // pass nil in that case. + text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) + text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) + args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) + n++ + } else if p.Type == "int64" && endianness != "" { + if endianness == "big-endian" { + args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) + } + } else if p.Type == "bool" { + text += fmt.Sprintf("\tvar _p%d uint32\n", n) + text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) + args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) + n++ + } else { + args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) + } + } + nargs := len(args) + + // Determine which form to use; pad args with zeros. + asm := "sysvicall6" + if nonblock != nil { + asm = "rawSysvicall6" + } + if len(args) <= 6 { + for len(args) < 6 { + args = append(args, "0") + } + } else { + fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) + os.Exit(1) + } + + // Actual call. + arglist := strings.Join(args, ", ") + call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) + + // Assign return values. + body := "" + ret := []string{"_", "_", "_"} + doErrno := false + for i := 0; i < len(out); i++ { + p := parseParam(out[i]) + reg := "" + if p.Name == "err" { + reg = "e1" + ret[2] = reg + doErrno = true + } else { + reg = fmt.Sprintf("r%d", i) + ret[i] = reg + } + if p.Type == "bool" { + reg = fmt.Sprintf("%d != 0", reg) + } + if p.Type == "int64" && endianness != "" { + // 64-bit number in r1:r0 or r0:r1. + if i+2 > len(out) { + fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) + os.Exit(1) + } + if endianness == "big-endian" { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) + } else { + reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) + } + ret[i] = fmt.Sprintf("r%d", i) + ret[i+1] = fmt.Sprintf("r%d", i+1) + } + if reg != "e1" { + body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) + } + } + if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { + text += fmt.Sprintf("\t%s\n", call) + } else { + text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) + } + text += body + + if doErrno { + text += "\tif e1 != 0 {\n" + text += "\t\terr = e1\n" + text += "\t}\n" + } + text += "\treturn\n" + text += "}\n" + } + if err := s.Err(); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + os.Exit(1) + } + file.Close() + } + imp := "" + if pack != "unix" { + imp = "import \"golang.org/x/sys/unix\"\n" + + } + vardecls := "\t" + strings.Join(vars, ",\n\t") + vardecls += " syscallFunc" + fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, text) +} + +const srcTemplate = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package %s + +import ( + "syscall" + "unsafe" +) +%s +%s +%s +var ( +%s +) + +%s +` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl b/src/cmd/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl old mode 100755 new mode 100644 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go b/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go new file mode 100644 index 0000000000..07f8960ff3 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go @@ -0,0 +1,190 @@ +// Copyright 2018 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. + +// +build ignore + +// Generate system call table for DragonFly, NetBSD, +// FreeBSD, OpenBSD or Darwin from master list +// (for example, /usr/src/sys/kern/syscalls.master or +// sys/syscall.h). +package main + +import ( + "bufio" + "fmt" + "io" + "io/ioutil" + "net/http" + "os" + "regexp" + "strings" +) + +var ( + goos, goarch string +) + +// cmdLine returns this programs's commandline arguments +func cmdLine() string { + return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") +} + +// buildTags returns build tags +func buildTags() string { + return fmt.Sprintf("%s,%s", goarch, goos) +} + +func checkErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "%v\n", err) + os.Exit(1) + } +} + +// source string and substring slice for regexp +type re struct { + str string // source string + sub []string // matched sub-string +} + +// Match performs regular expression match +func (r *re) Match(exp string) bool { + r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) + if r.sub != nil { + return true + } + return false +} + +// fetchFile fetches a text file from URL +func fetchFile(URL string) io.Reader { + resp, err := http.Get(URL) + checkErr(err) + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + checkErr(err) + return strings.NewReader(string(body)) +} + +// readFile reads a text file from path +func readFile(path string) io.Reader { + file, err := os.Open(os.Args[1]) + checkErr(err) + return file +} + +func format(name, num, proto string) string { + name = strings.ToUpper(name) + // There are multiple entries for enosys and nosys, so comment them out. + nm := re{str: name} + if nm.Match(`^SYS_E?NOSYS$`) { + name = fmt.Sprintf("// %s", name) + } + if name == `SYS_SYS_EXIT` { + name = `SYS_EXIT` + } + return fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) +} + +func main() { + // Get the OS (using GOOS_TARGET if it exist) + goos = os.Getenv("GOOS_TARGET") + if goos == "" { + goos = os.Getenv("GOOS") + } + // Get the architecture (using GOARCH_TARGET if it exists) + goarch = os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check if GOOS and GOARCH environment variables are defined + if goarch == "" || goos == "" { + fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") + os.Exit(1) + } + + file := strings.TrimSpace(os.Args[1]) + var syscalls io.Reader + if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { + // Download syscalls.master file + syscalls = fetchFile(file) + } else { + syscalls = readFile(file) + } + + var text, line string + s := bufio.NewScanner(syscalls) + for s.Scan() { + t := re{str: line} + if t.Match(`^(.*)\\$`) { + // Handle continuation + line = t.sub[1] + line += strings.TrimLeft(s.Text(), " \t") + } else { + // New line + line = s.Text() + } + t = re{str: line} + if t.Match(`\\$`) { + continue + } + t = re{str: line} + + switch goos { + case "dragonfly": + if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { + num, proto := t.sub[1], t.sub[2] + name := fmt.Sprintf("SYS_%s", t.sub[3]) + text += format(name, num, proto) + } + case "freebsd": + if t.Match(`^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$`) { + num, proto := t.sub[1], t.sub[2] + name := fmt.Sprintf("SYS_%s", t.sub[3]) + text += format(name, num, proto) + } + case "openbsd": + if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { + num, proto, name := t.sub[1], t.sub[3], t.sub[4] + text += format(name, num, proto) + } + case "netbsd": + if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { + num, proto, compat := t.sub[1], t.sub[6], t.sub[8] + name := t.sub[7] + "_" + t.sub[9] + if t.sub[11] != "" { + name = t.sub[7] + "_" + t.sub[11] + } + name = strings.ToUpper(name) + if compat == "" || compat == "13" || compat == "30" || compat == "50" { + text += fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) + } + } + case "darwin": + if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { + name, num := t.sub[1], t.sub[2] + name = strings.ToUpper(name) + text += fmt.Sprintf(" SYS_%s = %s;\n", name, num) + } + default: + fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) + os.Exit(1) + + } + } + err := s.Err() + checkErr(err) + + fmt.Printf(template, cmdLine(), buildTags(), text) +} + +const template = `// %s +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s + +package unix + +const( +%s)` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mmap_unix_test.go b/src/cmd/vendor/golang.org/x/sys/unix/mmap_unix_test.go deleted file mode 100644 index d4c4ef9264..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mmap_unix_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "runtime" - "testing" - - "golang.org/x/sys/unix" -) - -func TestMmap(t *testing.T) { - b, err := unix.Mmap(-1, 0, unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) - if err != nil { - t.Fatalf("Mmap: %v", err) - } - if err := unix.Mprotect(b, unix.PROT_READ|unix.PROT_WRITE); err != nil { - t.Fatalf("Mprotect: %v", err) - } - - b[0] = 42 - - if runtime.GOOS == "aix" { - t.Skip("msync returns invalid argument for AIX, skipping msync test") - } else { - if err := unix.Msync(b, unix.MS_SYNC); err != nil { - t.Fatalf("Msync: %v", err) - } - } - - if err := unix.Madvise(b, unix.MADV_DONTNEED); err != nil { - t.Fatalf("Madvise: %v", err) - } - if err := unix.Munmap(b); err != nil { - t.Fatalf("Munmap: %v", err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/openbsd_test.go b/src/cmd/vendor/golang.org/x/sys/unix/openbsd_test.go deleted file mode 100644 index 3ded960712..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/openbsd_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2016 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. - -// +build openbsd - -// This, on the face of it, bizarre testing mechanism is necessary because -// the only reliable way to gauge whether or not a pledge(2) call has succeeded -// is that the program has been killed as a result of breaking its pledge. - -package unix_test - -import ( - "flag" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "testing" - - "golang.org/x/sys/unix" -) - -type testProc struct { - fn func() // should always exit instead of returning - cleanup func() error // for instance, delete coredumps from testing pledge - success bool // whether zero-exit means success or failure -} - -var ( - testProcs = map[string]testProc{} - procName = "" -) - -const ( - optName = "sys-unix-internal-procname" -) - -func init() { - flag.StringVar(&procName, optName, "", "internal use only") -} - -// testCmd generates a proper command that, when executed, runs the test -// corresponding to the given key. -func testCmd(procName string) (*exec.Cmd, error) { - exe, err := filepath.Abs(os.Args[0]) - if err != nil { - return nil, err - } - cmd := exec.Command(exe, "-"+optName+"="+procName) - cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr - return cmd, nil -} - -// ExitsCorrectly is a comprehensive, one-line-of-use wrapper for testing -// a testProc with a key. -func ExitsCorrectly(procName string, t *testing.T) { - s := testProcs[procName] - c, err := testCmd(procName) - defer func() { - if s.cleanup() != nil { - t.Fatalf("Failed to run cleanup for %s", procName) - } - }() - if err != nil { - t.Fatalf("Failed to construct command for %s", procName) - } - if (c.Run() == nil) != s.success { - result := "succeed" - if !s.success { - result = "fail" - } - t.Fatalf("Process did not %s when it was supposed to", result) - } -} - -func TestMain(m *testing.M) { - flag.Parse() - if procName != "" { - testProcs[procName].fn() - } - os.Exit(m.Run()) -} - -// For example, add a test for pledge. -func init() { - testProcs["pledge"] = testProc{ - func() { - fmt.Println(unix.Pledge("", "")) - os.Exit(0) - }, - func() error { - files, err := ioutil.ReadDir(".") - if err != nil { - return err - } - for _, file := range files { - if filepath.Ext(file.Name()) == ".core" { - if err := os.Remove(file.Name()); err != nil { - return err - } - } - } - return nil - }, - false, - } -} - -func TestPledge(t *testing.T) { - ExitsCorrectly("pledge", t) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/sendfile_test.go b/src/cmd/vendor/golang.org/x/sys/unix/sendfile_test.go deleted file mode 100644 index d41fb93c8f..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/sendfile_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018 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. - -// +build darwin,amd64 darwin,386 dragonfly freebsd linux solaris - -package unix_test - -import ( - "io/ioutil" - "net" - "os" - "path/filepath" - "testing" - - "golang.org/x/sys/unix" -) - -func TestSendfile(t *testing.T) { - // Set up source data file. - tempDir, err := ioutil.TempDir("", "TestSendfile") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempDir) - name := filepath.Join(tempDir, "source") - const contents = "contents" - err = ioutil.WriteFile(name, []byte(contents), 0666) - if err != nil { - t.Fatal(err) - } - - done := make(chan bool) - - // Start server listening on a socket. - ln, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Skipf("listen failed: %s\n", err) - } - defer ln.Close() - go func() { - conn, err := ln.Accept() - if err != nil { - t.Fatal(err) - } - defer conn.Close() - b, err := ioutil.ReadAll(conn) - if string(b) != contents { - t.Errorf("contents not transmitted: got %s (len=%d), want %s", string(b), len(b), contents) - } - done <- true - }() - - // Open source file. - src, err := os.Open(name) - if err != nil { - t.Fatal(err) - } - - // Send source file to server. - conn, err := net.Dial("tcp", ln.Addr().String()) - if err != nil { - t.Fatal(err) - } - file, err := conn.(*net.TCPConn).File() - if err != nil { - t.Fatal(err) - } - var off int64 - n, err := unix.Sendfile(int(file.Fd()), int(src.Fd()), &off, len(contents)) - if err != nil { - t.Errorf("Sendfile failed %s\n", err) - } - if n != len(contents) { - t.Errorf("written count wrong: want %d, got %d", len(contents), n) - } - // Note: off is updated on some systems and not others. Oh well. - // Linux: increments off by the amount sent. - // Darwin: leaves off unchanged. - // It would be nice to fix Darwin if we can. - if off != 0 && off != int64(len(contents)) { - t.Errorf("offset wrong: god %d, want %d or %d", off, 0, len(contents)) - } - // The cursor position should be unchanged. - pos, err := src.Seek(0, 1) - if err != nil { - t.Errorf("can't get cursor position %s\n", err) - } - if pos != 0 { - t.Errorf("cursor position wrong: got %d, want 0", pos) - } - - file.Close() // Note: required to have the close below really send EOF to the server. - conn.Close() - - // Wait for server to close. - <-done -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 26e8b36cfc..5f9ae233a7 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -25,8 +25,8 @@ func cmsgAlignOf(salen int) int { if SizeofPtr == 8 { salign = 4 } - case "netbsd", "openbsd": - // NetBSD and OpenBSD armv7 require 64-bit alignment. + case "openbsd": + // OpenBSD armv7 requires 64-bit alignment. if runtime.GOARCH == "arm" { salign = 8 } diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_test.go deleted file mode 100644 index 6f55c07bd1..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix_test.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2018 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. - -// +build aix - -package unix_test - -import ( - "os" - "runtime" - "testing" - "time" - - "golang.org/x/sys/unix" -) - -func TestIoctlGetInt(t *testing.T) { - f, err := os.Open("/dev/random") - if err != nil { - t.Fatalf("failed to open device: %v", err) - } - defer f.Close() - - v, err := unix.IoctlGetInt(int(f.Fd()), unix.RNDGETENTCNT) - if err != nil { - t.Fatalf("failed to perform ioctl: %v", err) - } - - t.Logf("%d bits of entropy available", v) -} - -func TestTime(t *testing.T) { - var ut unix.Time_t - ut2, err := unix.Time(&ut) - if err != nil { - t.Fatalf("Time: %v", err) - } - if ut != ut2 { - t.Errorf("Time: return value %v should be equal to argument %v", ut2, ut) - } - - var now time.Time - - for i := 0; i < 10; i++ { - ut, err = unix.Time(nil) - if err != nil { - t.Fatalf("Time: %v", err) - } - - now = time.Now() - - if int64(ut) == now.Unix() { - return - } - } - - t.Errorf("Time: return value %v should be nearly equal to time.Now().Unix() %v", ut, now.Unix()) -} - -func TestUtime(t *testing.T) { - defer chtmpdir(t)() - - touch(t, "file1") - - buf := &unix.Utimbuf{ - Modtime: 12345, - } - - err := unix.Utime("file1", buf) - if err != nil { - t.Fatalf("Utime: %v", err) - } - - fi, err := os.Stat("file1") - if err != nil { - t.Fatal(err) - } - - if fi.ModTime().Unix() != 12345 { - t.Errorf("Utime: failed to change modtime: expected %v, got %v", 12345, fi.ModTime().Unix()) - } -} - -func TestUtimesNanoAt(t *testing.T) { - defer chtmpdir(t)() - - symlink := "symlink1" - defer os.Remove(symlink) - err := os.Symlink("nonexisting", symlink) - if err != nil { - t.Fatal(err) - } - - ts := []unix.Timespec{ - {Sec: 1111, Nsec: 2222}, - {Sec: 3333, Nsec: 4444}, - } - err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Fatalf("UtimesNanoAt: %v", err) - } - - var st unix.Stat_t - err = unix.Lstat(symlink, &st) - if err != nil { - t.Fatalf("Lstat: %v", err) - } - if runtime.GOARCH == "ppc64" { - if int64(st.Atim.Sec) != int64(ts[0].Sec) || st.Atim.Nsec != int32(ts[0].Nsec) { - t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim) - } - if int64(st.Mtim.Sec) != int64(ts[1].Sec) || st.Mtim.Nsec != int32(ts[1].Nsec) { - t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim) - } - } else { - if int32(st.Atim.Sec) != int32(ts[0].Sec) || int32(st.Atim.Nsec) != int32(ts[0].Nsec) { - t.Errorf("UtimesNanoAt: wrong atime: %v", st.Atim) - } - if int32(st.Mtim.Sec) != int32(ts[1].Sec) || int32(st.Mtim.Nsec) != int32(ts[1].Nsec) { - t.Errorf("UtimesNanoAt: wrong mtime: %v", st.Mtim) - } - } -} - -func TestPselect(t *testing.T) { - if runtime.GOARCH == "ppc64" { - t.Skip("pselect issue with structure timespec on AIX 7.2 tl0, skipping test") - } - - _, err := unix.Pselect(0, nil, nil, nil, &unix.Timespec{Sec: 0, Nsec: 0}, nil) - if err != nil { - t.Fatalf("Pselect: %v", err) - } - - dur := 2500 * time.Microsecond - ts := unix.NsecToTimespec(int64(dur)) - start := time.Now() - _, err = unix.Pselect(0, nil, nil, nil, &ts, nil) - took := time.Since(start) - if err != nil { - t.Fatalf("Pselect: %v", err) - } - - if took < dur { - t.Errorf("Pselect: timeout should have been at least %v, got %v", dur, took) - } -} - -// stringsFromByteSlice converts a sequence of attributes to a []string. -// On Linux, each entry is a NULL-terminated string. -func stringsFromByteSlice(buf []byte) []string { - var result []string - off := 0 - for i, b := range buf { - if b == 0 { - result = append(result, string(buf[off:i])) - off = i + 1 - } - } - return result -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd_test.go deleted file mode 100644 index 12924cb83d..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_bsd_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 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. - -// +build darwin dragonfly freebsd openbsd - -package unix_test - -import ( - "os/exec" - "runtime" - "testing" - "time" - - "golang.org/x/sys/unix" -) - -func TestGetfsstat(t *testing.T) { - n, err := unix.Getfsstat(nil, unix.MNT_NOWAIT) - if err != nil { - t.Fatal(err) - } - - data := make([]unix.Statfs_t, n) - n2, err := unix.Getfsstat(data, unix.MNT_NOWAIT) - if err != nil { - t.Fatal(err) - } - if n != n2 { - t.Errorf("Getfsstat(nil) = %d, but subsequent Getfsstat(slice) = %d", n, n2) - } - for i, stat := range data { - if stat == (unix.Statfs_t{}) { - t.Errorf("index %v is an empty Statfs_t struct", i) - } - } - if t.Failed() { - for i, stat := range data[:n2] { - t.Logf("data[%v] = %+v", i, stat) - } - mount, err := exec.Command("mount").CombinedOutput() - if err != nil { - t.Logf("mount: %v\n%s", err, mount) - } else { - t.Logf("mount: %s", mount) - } - } -} - -func TestSelect(t *testing.T) { - err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) - if err != nil { - t.Fatalf("Select: %v", err) - } - - dur := 250 * time.Millisecond - tv := unix.NsecToTimeval(int64(dur)) - start := time.Now() - err = unix.Select(0, nil, nil, nil, &tv) - took := time.Since(start) - if err != nil { - t.Fatalf("Select: %v", err) - } - - // On some BSDs the actual timeout might also be slightly less than the requested. - // Add an acceptable margin to avoid flaky tests. - if took < dur*2/3 { - t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) - } -} - -func TestSysctlRaw(t *testing.T) { - if runtime.GOOS == "openbsd" { - t.Skip("kern.proc.pid does not exist on OpenBSD") - } - - _, err := unix.SysctlRaw("kern.proc.pid", unix.Getpid()) - if err != nil { - t.Fatal(err) - } -} - -func TestSysctlUint32(t *testing.T) { - maxproc, err := unix.SysctlUint32("kern.maxproc") - if err != nil { - t.Fatal(err) - } - t.Logf("kern.maxproc: %v", maxproc) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_test.go deleted file mode 100644 index 7faa295fce..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_darwin_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2018 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 unix_test - -import ( - "os" - "testing" - - "golang.org/x/sys/unix" -) - -// stringsFromByteSlice converts a sequence of attributes to a []string. -// On Darwin, each entry is a NULL-terminated string. -func stringsFromByteSlice(buf []byte) []string { - var result []string - off := 0 - for i, b := range buf { - if b == 0 { - result = append(result, string(buf[off:i])) - off = i + 1 - } - } - return result -} - -func TestUtimesNanoAt(t *testing.T) { - defer chtmpdir(t)() - - symlink := "symlink1" - os.Remove(symlink) - err := os.Symlink("nonexisting", symlink) - if err != nil { - t.Fatal(err) - } - - ts := []unix.Timespec{ - {Sec: 1111, Nsec: 2222}, - {Sec: 3333, Nsec: 4444}, - } - err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Fatalf("UtimesNanoAt: %v", err) - } - - var st unix.Stat_t - err = unix.Lstat(symlink, &st) - if err != nil { - t.Fatalf("Lstat: %v", err) - } - - // Only check Mtimespec, Atimespec might not be supported by the underlying filesystem - expected := ts[1] - if st.Mtimespec.Nsec == 0 { - // Some filesystems only support 1-second time stamp resolution - // and will always set Nsec to 0. - expected.Nsec = 0 - } - if st.Mtimespec != expected { - t.Errorf("UtimesNanoAt: wrong mtime: got %v, expected %v", st.Mtimespec, expected) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go deleted file mode 100644 index 0fec1a8277..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_freebsd_test.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2014 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. - -// +build freebsd - -package unix_test - -import ( - "flag" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "testing" - - "golang.org/x/sys/unix" -) - -func TestSysctlUint64(t *testing.T) { - _, err := unix.SysctlUint64("vm.swap_total") - if err != nil { - t.Fatal(err) - } -} - -// FIXME: Infrastructure for launching tests in subprocesses stolen from openbsd_test.go - refactor? -// testCmd generates a proper command that, when executed, runs the test -// corresponding to the given key. - -type testProc struct { - fn func() // should always exit instead of returning - arg func(t *testing.T) string // generate argument for test - cleanup func(arg string) error // for instance, delete coredumps from testing pledge - success bool // whether zero-exit means success or failure -} - -var ( - testProcs = map[string]testProc{} - procName = "" - procArg = "" -) - -const ( - optName = "sys-unix-internal-procname" - optArg = "sys-unix-internal-arg" -) - -func init() { - flag.StringVar(&procName, optName, "", "internal use only") - flag.StringVar(&procArg, optArg, "", "internal use only") - -} - -func testCmd(procName string, procArg string) (*exec.Cmd, error) { - exe, err := filepath.Abs(os.Args[0]) - if err != nil { - return nil, err - } - cmd := exec.Command(exe, "-"+optName+"="+procName, "-"+optArg+"="+procArg) - cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr - return cmd, nil -} - -// ExitsCorrectly is a comprehensive, one-line-of-use wrapper for testing -// a testProc with a key. -func ExitsCorrectly(t *testing.T, procName string) { - s := testProcs[procName] - arg := "-" - if s.arg != nil { - arg = s.arg(t) - } - c, err := testCmd(procName, arg) - defer func(arg string) { - if err := s.cleanup(arg); err != nil { - t.Fatalf("Failed to run cleanup for %s %s %#v", procName, err, err) - } - }(arg) - if err != nil { - t.Fatalf("Failed to construct command for %s", procName) - } - if (c.Run() == nil) != s.success { - result := "succeed" - if !s.success { - result = "fail" - } - t.Fatalf("Process did not %s when it was supposed to", result) - } -} - -func TestMain(m *testing.M) { - flag.Parse() - if procName != "" { - t := testProcs[procName] - t.fn() - os.Stderr.WriteString("test function did not exit\n") - if t.success { - os.Exit(1) - } else { - os.Exit(0) - } - } - os.Exit(m.Run()) -} - -// end of infrastructure - -const testfile = "gocapmodetest" -const testfile2 = testfile + "2" - -func CapEnterTest() { - _, err := os.OpenFile(path.Join(procArg, testfile), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - panic(fmt.Sprintf("OpenFile: %s", err)) - } - - err = unix.CapEnter() - if err != nil { - panic(fmt.Sprintf("CapEnter: %s", err)) - } - - _, err = os.OpenFile(path.Join(procArg, testfile2), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) - if err == nil { - panic("OpenFile works!") - } - if err.(*os.PathError).Err != unix.ECAPMODE { - panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) - } - os.Exit(0) -} - -func makeTempDir(t *testing.T) string { - d, err := ioutil.TempDir("", "go_openat_test") - if err != nil { - t.Fatalf("TempDir failed: %s", err) - } - return d -} - -func removeTempDir(arg string) error { - err := os.RemoveAll(arg) - if err != nil && err.(*os.PathError).Err == unix.ENOENT { - return nil - } - return err -} - -func init() { - testProcs["cap_enter"] = testProc{ - CapEnterTest, - makeTempDir, - removeTempDir, - true, - } -} - -func TestCapEnter(t *testing.T) { - if runtime.GOARCH != "amd64" { - t.Skipf("skipping test on %s", runtime.GOARCH) - } - ExitsCorrectly(t, "cap_enter") -} - -func OpenatTest() { - f, err := os.Open(procArg) - if err != nil { - panic(err) - } - - err = unix.CapEnter() - if err != nil { - panic(fmt.Sprintf("CapEnter: %s", err)) - } - - fxx, err := unix.Openat(int(f.Fd()), "xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) - if err != nil { - panic(err) - } - unix.Close(fxx) - - // The right to open BASE/xx is not ambient - _, err = os.OpenFile(procArg+"/xx", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) - if err == nil { - panic("OpenFile succeeded") - } - if err.(*os.PathError).Err != unix.ECAPMODE { - panic(fmt.Sprintf("OpenFile failed wrong: %s %#v", err, err)) - } - - // Can't make a new directory either - err = os.Mkdir(procArg+"2", 0777) - if err == nil { - panic("MKdir succeeded") - } - if err.(*os.PathError).Err != unix.ECAPMODE { - panic(fmt.Sprintf("Mkdir failed wrong: %s %#v", err, err)) - } - - // Remove all caps except read and lookup. - r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_LOOKUP}) - if err != nil { - panic(fmt.Sprintf("CapRightsInit failed: %s %#v", err, err)) - } - err = unix.CapRightsLimit(f.Fd(), r) - if err != nil { - panic(fmt.Sprintf("CapRightsLimit failed: %s %#v", err, err)) - } - - // Check we can get the rights back again - r, err = unix.CapRightsGet(f.Fd()) - if err != nil { - panic(fmt.Sprintf("CapRightsGet failed: %s %#v", err, err)) - } - b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP}) - if err != nil { - panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) - } - if !b { - panic(fmt.Sprintf("Unexpected rights")) - } - b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_LOOKUP, unix.CAP_WRITE}) - if err != nil { - panic(fmt.Sprintf("CapRightsIsSet failed: %s %#v", err, err)) - } - if b { - panic(fmt.Sprintf("Unexpected rights (2)")) - } - - // Can no longer create a file - _, err = unix.Openat(int(f.Fd()), "xx2", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666) - if err == nil { - panic("Openat succeeded") - } - if err != unix.ENOTCAPABLE { - panic(fmt.Sprintf("OpenFileAt failed wrong: %s %#v", err, err)) - } - - // But can read an existing one - _, err = unix.Openat(int(f.Fd()), "xx", os.O_RDONLY, 0666) - if err != nil { - panic(fmt.Sprintf("Openat failed: %s %#v", err, err)) - } - - os.Exit(0) -} - -func init() { - testProcs["openat"] = testProc{ - OpenatTest, - makeTempDir, - removeTempDir, - true, - } -} - -func TestOpenat(t *testing.T) { - if runtime.GOARCH != "amd64" { - t.Skipf("skipping test on %s", runtime.GOARCH) - } - ExitsCorrectly(t, "openat") -} - -func TestCapRightsSetAndClear(t *testing.T) { - r, err := unix.CapRightsInit([]uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT}) - if err != nil { - t.Fatalf("CapRightsInit failed: %s", err) - } - - err = unix.CapRightsSet(r, []uint64{unix.CAP_EVENT, unix.CAP_LISTEN}) - if err != nil { - t.Fatalf("CapRightsSet failed: %s", err) - } - - b, err := unix.CapRightsIsSet(r, []uint64{unix.CAP_READ, unix.CAP_WRITE, unix.CAP_PDWAIT, unix.CAP_EVENT, unix.CAP_LISTEN}) - if err != nil { - t.Fatalf("CapRightsIsSet failed: %s", err) - } - if !b { - t.Fatalf("Wrong rights set") - } - - err = unix.CapRightsClear(r, []uint64{unix.CAP_READ, unix.CAP_PDWAIT}) - if err != nil { - t.Fatalf("CapRightsClear failed: %s", err) - } - - b, err = unix.CapRightsIsSet(r, []uint64{unix.CAP_WRITE, unix.CAP_EVENT, unix.CAP_LISTEN}) - if err != nil { - t.Fatalf("CapRightsIsSet failed: %s", err) - } - if !b { - t.Fatalf("Wrong rights set") - } -} - -// stringsFromByteSlice converts a sequence of attributes to a []string. -// On FreeBSD, each entry consists of a single byte containing the length -// of the attribute name, followed by the attribute name. -// The name is _not_ NULL-terminated. -func stringsFromByteSlice(buf []byte) []string { - var result []string - i := 0 - for i < len(buf) { - next := i + 1 + int(buf[i]) - result = append(result, string(buf[i+1:next])) - i = next - } - return result -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go deleted file mode 100644 index 3c3bd816fd..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_test.go +++ /dev/null @@ -1,533 +0,0 @@ -// Copyright 2016 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. - -// +build linux - -package unix_test - -import ( - "io/ioutil" - "os" - "runtime" - "runtime/debug" - "testing" - "time" - - "golang.org/x/sys/unix" -) - -func TestIoctlGetInt(t *testing.T) { - f, err := os.Open("/dev/random") - if err != nil { - t.Fatalf("failed to open device: %v", err) - } - defer f.Close() - - v, err := unix.IoctlGetInt(int(f.Fd()), unix.RNDGETENTCNT) - if err != nil { - t.Fatalf("failed to perform ioctl: %v", err) - } - - t.Logf("%d bits of entropy available", v) -} - -func TestIoctlGetRTCTime(t *testing.T) { - f, err := os.Open("/dev/rtc0") - if err != nil { - t.Skipf("skipping test, %v", err) - } - defer f.Close() - - v, err := unix.IoctlGetRTCTime(int(f.Fd())) - if err != nil { - t.Fatalf("failed to perform ioctl: %v", err) - } - - t.Logf("RTC time: %04d-%02d-%02d %02d:%02d:%02d", v.Year+1900, v.Mon+1, v.Mday, v.Hour, v.Min, v.Sec) -} - -func TestPpoll(t *testing.T) { - if runtime.GOOS == "android" { - t.Skip("mkfifo syscall is not available on android, skipping test") - } - - defer chtmpdir(t)() - f, cleanup := mktmpfifo(t) - defer cleanup() - - const timeout = 100 * time.Millisecond - - ok := make(chan bool, 1) - go func() { - select { - case <-time.After(10 * timeout): - t.Errorf("Ppoll: failed to timeout after %d", 10*timeout) - case <-ok: - } - }() - - fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} - timeoutTs := unix.NsecToTimespec(int64(timeout)) - n, err := unix.Ppoll(fds, &timeoutTs, nil) - ok <- true - if err != nil { - t.Errorf("Ppoll: unexpected error: %v", err) - return - } - if n != 0 { - t.Errorf("Ppoll: wrong number of events: got %v, expected %v", n, 0) - return - } -} - -func TestTime(t *testing.T) { - var ut unix.Time_t - ut2, err := unix.Time(&ut) - if err != nil { - t.Fatalf("Time: %v", err) - } - if ut != ut2 { - t.Errorf("Time: return value %v should be equal to argument %v", ut2, ut) - } - - var now time.Time - - for i := 0; i < 10; i++ { - ut, err = unix.Time(nil) - if err != nil { - t.Fatalf("Time: %v", err) - } - - now = time.Now() - - if int64(ut) == now.Unix() { - return - } - } - - t.Errorf("Time: return value %v should be nearly equal to time.Now().Unix() %v", ut, now.Unix()) -} - -func TestUtime(t *testing.T) { - defer chtmpdir(t)() - - touch(t, "file1") - - buf := &unix.Utimbuf{ - Modtime: 12345, - } - - err := unix.Utime("file1", buf) - if err != nil { - t.Fatalf("Utime: %v", err) - } - - fi, err := os.Stat("file1") - if err != nil { - t.Fatal(err) - } - - if fi.ModTime().Unix() != 12345 { - t.Errorf("Utime: failed to change modtime: expected %v, got %v", 12345, fi.ModTime().Unix()) - } -} - -func TestUtimesNanoAt(t *testing.T) { - defer chtmpdir(t)() - - symlink := "symlink1" - os.Remove(symlink) - err := os.Symlink("nonexisting", symlink) - if err != nil { - t.Fatal(err) - } - - ts := []unix.Timespec{ - {Sec: 1111, Nsec: 2222}, - {Sec: 3333, Nsec: 4444}, - } - err = unix.UtimesNanoAt(unix.AT_FDCWD, symlink, ts, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Fatalf("UtimesNanoAt: %v", err) - } - - var st unix.Stat_t - err = unix.Lstat(symlink, &st) - if err != nil { - t.Fatalf("Lstat: %v", err) - } - - // Only check Mtim, Atim might not be supported by the underlying filesystem - expected := ts[1] - if st.Mtim.Nsec == 0 { - // Some filesystems only support 1-second time stamp resolution - // and will always set Nsec to 0. - expected.Nsec = 0 - } - if st.Mtim != expected { - t.Errorf("UtimesNanoAt: wrong mtime: expected %v, got %v", expected, st.Mtim) - } -} - -func TestRlimitAs(t *testing.T) { - // disable GC during to avoid flaky test - defer debug.SetGCPercent(debug.SetGCPercent(-1)) - - var rlim unix.Rlimit - err := unix.Getrlimit(unix.RLIMIT_AS, &rlim) - if err != nil { - t.Fatalf("Getrlimit: %v", err) - } - var zero unix.Rlimit - if zero == rlim { - t.Fatalf("Getrlimit: got zero value %#v", rlim) - } - set := rlim - set.Cur = uint64(unix.Getpagesize()) - err = unix.Setrlimit(unix.RLIMIT_AS, &set) - if err != nil { - t.Fatalf("Setrlimit: set failed: %#v %v", set, err) - } - - // RLIMIT_AS was set to the page size, so mmap()'ing twice the page size - // should fail. See 'man 2 getrlimit'. - _, err = unix.Mmap(-1, 0, 2*unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) - if err == nil { - t.Fatal("Mmap: unexpectedly succeeded after setting RLIMIT_AS") - } - - err = unix.Setrlimit(unix.RLIMIT_AS, &rlim) - if err != nil { - t.Fatalf("Setrlimit: restore failed: %#v %v", rlim, err) - } - - b, err := unix.Mmap(-1, 0, 2*unix.Getpagesize(), unix.PROT_NONE, unix.MAP_ANON|unix.MAP_PRIVATE) - if err != nil { - t.Fatalf("Mmap: %v", err) - } - err = unix.Munmap(b) - if err != nil { - t.Fatalf("Munmap: %v", err) - } -} - -func TestSelect(t *testing.T) { - _, err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) - if err != nil { - t.Fatalf("Select: %v", err) - } - - dur := 150 * time.Millisecond - tv := unix.NsecToTimeval(int64(dur)) - start := time.Now() - _, err = unix.Select(0, nil, nil, nil, &tv) - took := time.Since(start) - if err != nil { - t.Fatalf("Select: %v", err) - } - - if took < dur { - t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) - } -} - -func TestPselect(t *testing.T) { - _, err := unix.Pselect(0, nil, nil, nil, &unix.Timespec{Sec: 0, Nsec: 0}, nil) - if err != nil { - t.Fatalf("Pselect: %v", err) - } - - dur := 2500 * time.Microsecond - ts := unix.NsecToTimespec(int64(dur)) - start := time.Now() - _, err = unix.Pselect(0, nil, nil, nil, &ts, nil) - took := time.Since(start) - if err != nil { - t.Fatalf("Pselect: %v", err) - } - - if took < dur { - t.Errorf("Pselect: timeout should have been at least %v, got %v", dur, took) - } -} - -func TestSchedSetaffinity(t *testing.T) { - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - var oldMask unix.CPUSet - err := unix.SchedGetaffinity(0, &oldMask) - if err != nil { - t.Fatalf("SchedGetaffinity: %v", err) - } - - var newMask unix.CPUSet - newMask.Zero() - if newMask.Count() != 0 { - t.Errorf("CpuZero: didn't zero CPU set: %v", newMask) - } - cpu := 1 - newMask.Set(cpu) - if newMask.Count() != 1 || !newMask.IsSet(cpu) { - t.Errorf("CpuSet: didn't set CPU %d in set: %v", cpu, newMask) - } - cpu = 5 - newMask.Set(cpu) - if newMask.Count() != 2 || !newMask.IsSet(cpu) { - t.Errorf("CpuSet: didn't set CPU %d in set: %v", cpu, newMask) - } - newMask.Clear(cpu) - if newMask.Count() != 1 || newMask.IsSet(cpu) { - t.Errorf("CpuClr: didn't clear CPU %d in set: %v", cpu, newMask) - } - - if runtime.NumCPU() < 2 { - t.Skip("skipping setaffinity tests on single CPU system") - } - if runtime.GOOS == "android" { - t.Skip("skipping setaffinity tests on android") - } - - // On a system like ppc64x where some cores can be disabled using ppc64_cpu, - // setaffinity should only be called with enabled cores. The valid cores - // are found from the oldMask, but if none are found then the setaffinity - // tests are skipped. Issue #27875. - if !oldMask.IsSet(cpu) { - newMask.Zero() - for i := 0; i < len(oldMask); i++ { - if oldMask.IsSet(i) { - newMask.Set(i) - break - } - } - if newMask.Count() == 0 { - t.Skip("skipping setaffinity tests if CPU not available") - } - } - - err = unix.SchedSetaffinity(0, &newMask) - if err != nil { - t.Fatalf("SchedSetaffinity: %v", err) - } - - var gotMask unix.CPUSet - err = unix.SchedGetaffinity(0, &gotMask) - if err != nil { - t.Fatalf("SchedGetaffinity: %v", err) - } - - if gotMask != newMask { - t.Errorf("SchedSetaffinity: returned affinity mask does not match set affinity mask") - } - - // Restore old mask so it doesn't affect successive tests - err = unix.SchedSetaffinity(0, &oldMask) - if err != nil { - t.Fatalf("SchedSetaffinity: %v", err) - } -} - -func TestStatx(t *testing.T) { - var stx unix.Statx_t - err := unix.Statx(unix.AT_FDCWD, ".", 0, 0, &stx) - if err == unix.ENOSYS || err == unix.EPERM { - t.Skip("statx syscall is not available, skipping test") - } else if err != nil { - t.Fatalf("Statx: %v", err) - } - - defer chtmpdir(t)() - touch(t, "file1") - - var st unix.Stat_t - err = unix.Stat("file1", &st) - if err != nil { - t.Fatalf("Stat: %v", err) - } - - flags := unix.AT_STATX_SYNC_AS_STAT - err = unix.Statx(unix.AT_FDCWD, "file1", flags, unix.STATX_ALL, &stx) - if err != nil { - t.Fatalf("Statx: %v", err) - } - - if uint32(stx.Mode) != st.Mode { - t.Errorf("Statx: returned stat mode does not match Stat") - } - - ctime := unix.StatxTimestamp{Sec: int64(st.Ctim.Sec), Nsec: uint32(st.Ctim.Nsec)} - mtime := unix.StatxTimestamp{Sec: int64(st.Mtim.Sec), Nsec: uint32(st.Mtim.Nsec)} - - if stx.Ctime != ctime { - t.Errorf("Statx: returned stat ctime does not match Stat") - } - if stx.Mtime != mtime { - t.Errorf("Statx: returned stat mtime does not match Stat") - } - - err = os.Symlink("file1", "symlink1") - if err != nil { - t.Fatal(err) - } - - err = unix.Lstat("symlink1", &st) - if err != nil { - t.Fatalf("Lstat: %v", err) - } - - err = unix.Statx(unix.AT_FDCWD, "symlink1", flags, unix.STATX_BASIC_STATS, &stx) - if err != nil { - t.Fatalf("Statx: %v", err) - } - - // follow symlink, expect a regulat file - if stx.Mode&unix.S_IFREG == 0 { - t.Errorf("Statx: didn't follow symlink") - } - - err = unix.Statx(unix.AT_FDCWD, "symlink1", flags|unix.AT_SYMLINK_NOFOLLOW, unix.STATX_ALL, &stx) - if err != nil { - t.Fatalf("Statx: %v", err) - } - - // follow symlink, expect a symlink - if stx.Mode&unix.S_IFLNK == 0 { - t.Errorf("Statx: unexpectedly followed symlink") - } - if uint32(stx.Mode) != st.Mode { - t.Errorf("Statx: returned stat mode does not match Lstat") - } - - ctime = unix.StatxTimestamp{Sec: int64(st.Ctim.Sec), Nsec: uint32(st.Ctim.Nsec)} - mtime = unix.StatxTimestamp{Sec: int64(st.Mtim.Sec), Nsec: uint32(st.Mtim.Nsec)} - - if stx.Ctime != ctime { - t.Errorf("Statx: returned stat ctime does not match Lstat") - } - if stx.Mtime != mtime { - t.Errorf("Statx: returned stat mtime does not match Lstat") - } -} - -// stringsFromByteSlice converts a sequence of attributes to a []string. -// On Linux, each entry is a NULL-terminated string. -func stringsFromByteSlice(buf []byte) []string { - var result []string - off := 0 - for i, b := range buf { - if b == 0 { - result = append(result, string(buf[off:i])) - off = i + 1 - } - } - return result -} - -func TestFaccessat(t *testing.T) { - defer chtmpdir(t)() - touch(t, "file1") - - err := unix.Faccessat(unix.AT_FDCWD, "file1", unix.R_OK, 0) - if err != nil { - t.Errorf("Faccessat: unexpected error: %v", err) - } - - err = unix.Faccessat(unix.AT_FDCWD, "file1", unix.R_OK, 2) - if err != unix.EINVAL { - t.Errorf("Faccessat: unexpected error: %v, want EINVAL", err) - } - - err = unix.Faccessat(unix.AT_FDCWD, "file1", unix.R_OK, unix.AT_EACCESS) - if err != nil { - t.Errorf("Faccessat: unexpected error: %v", err) - } - - err = os.Symlink("file1", "symlink1") - if err != nil { - t.Fatal(err) - } - - err = unix.Faccessat(unix.AT_FDCWD, "symlink1", unix.R_OK, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Errorf("Faccessat SYMLINK_NOFOLLOW: unexpected error %v", err) - } - - // We can't really test AT_SYMLINK_NOFOLLOW, because there - // doesn't seem to be any way to change the mode of a symlink. - // We don't test AT_EACCESS because such tests are only - // meaningful if run as root. - - err = unix.Fchmodat(unix.AT_FDCWD, "file1", 0, 0) - if err != nil { - t.Errorf("Fchmodat: unexpected error %v", err) - } - - err = unix.Faccessat(unix.AT_FDCWD, "file1", unix.F_OK, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Errorf("Faccessat: unexpected error: %v", err) - } - - err = unix.Faccessat(unix.AT_FDCWD, "file1", unix.R_OK, unix.AT_SYMLINK_NOFOLLOW) - if err != unix.EACCES { - if unix.Getuid() != 0 { - t.Errorf("Faccessat: unexpected error: %v, want EACCES", err) - } - } -} - -func TestSyncFileRange(t *testing.T) { - file, err := ioutil.TempFile("", "TestSyncFileRange") - if err != nil { - t.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - - err = unix.SyncFileRange(int(file.Fd()), 0, 0, 0) - if err == unix.ENOSYS || err == unix.EPERM { - t.Skip("sync_file_range syscall is not available, skipping test") - } else if err != nil { - t.Fatalf("SyncFileRange: %v", err) - } - - // invalid flags - flags := 0xf00 - err = unix.SyncFileRange(int(file.Fd()), 0, 0, flags) - if err != unix.EINVAL { - t.Fatalf("SyncFileRange: unexpected error: %v, want EINVAL", err) - } -} - -func TestClockNanosleep(t *testing.T) { - delay := 100 * time.Millisecond - - // Relative timespec. - start := time.Now() - rel := unix.NsecToTimespec(delay.Nanoseconds()) - err := unix.ClockNanosleep(unix.CLOCK_MONOTONIC, 0, &rel, nil) - if err == unix.ENOSYS || err == unix.EPERM { - t.Skip("clock_nanosleep syscall is not available, skipping test") - } else if err != nil { - t.Errorf("ClockNanosleep(CLOCK_MONOTONIC, 0, %#v, nil) = %v", &rel, err) - } else if slept := time.Now().Sub(start); slept < delay { - t.Errorf("ClockNanosleep(CLOCK_MONOTONIC, 0, %#v, nil) slept only %v", &rel, slept) - } - - // Absolute timespec. - start = time.Now() - until := start.Add(delay) - abs := unix.NsecToTimespec(until.UnixNano()) - err = unix.ClockNanosleep(unix.CLOCK_REALTIME, unix.TIMER_ABSTIME, &abs, nil) - if err != nil { - t.Errorf("ClockNanosleep(CLOCK_REALTIME, TIMER_ABSTIME, %#v (=%v), nil) = %v", &abs, until, err) - } else if slept := time.Now().Sub(start); slept < delay { - t.Errorf("ClockNanosleep(CLOCK_REALTIME, TIMER_ABSTIME, %#v (=%v), nil) slept only %v", &abs, until, slept) - } - - // Invalid clock. clock_nanosleep(2) says EINVAL, but it’s actually EOPNOTSUPP. - err = unix.ClockNanosleep(unix.CLOCK_THREAD_CPUTIME_ID, 0, &rel, nil) - if err != unix.EINVAL && err != unix.EOPNOTSUPP { - t.Errorf("ClockNanosleep(CLOCK_THREAD_CPUTIME_ID, 0, %#v, nil) = %v, want EINVAL or EOPNOTSUPP", &rel, err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_test.go deleted file mode 100644 index 41141f96e6..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_netbsd_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2018 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 unix_test - -import ( - "bytes" - "testing" - - "golang.org/x/sys/unix" -) - -// stringsFromByteSlice converts a sequence of attributes to a []string. -// On NetBSD, each entry consists of a single byte containing the length -// of the attribute name, followed by the attribute name. -// The name is _not_ NULL-terminated. -func stringsFromByteSlice(buf []byte) []string { - var result []string - i := 0 - for i < len(buf) { - next := i + 1 + int(buf[i]) - result = append(result, string(buf[i+1:next])) - i = next - } - return result -} - -func TestSysctlClockinfo(t *testing.T) { - ci, err := unix.SysctlClockinfo("kern.clockrate") - if err != nil { - t.Fatal(err) - } - t.Logf("tick = %v, tickadj = %v, hz = %v, profhz = %v, stathz = %v", - ci.Tick, ci.Tickadj, ci.Hz, ci.Profhz, ci.Stathz) -} - -func TestIoctlPtmget(t *testing.T) { - fd, err := unix.Open("/dev/ptmx", unix.O_NOCTTY|unix.O_RDWR, 0666) - if err != nil { - t.Skip("failed to open /dev/ptmx, skipping test") - } - defer unix.Close(fd) - - ptm, err := unix.IoctlGetPtmget(fd, unix.TIOCPTSNAME) - if err != nil { - t.Fatalf("IoctlGetPtmget: %v\n", err) - } - - t.Logf("sfd = %v, ptsname = %v", ptm.Sfd, string(ptm.Sn[:bytes.IndexByte(ptm.Sn[:], 0)])) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_test.go deleted file mode 100644 index b95f334e19..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2018 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 unix_test - -import ( - "testing" - "time" - - "golang.org/x/sys/unix" -) - -func TestPpoll(t *testing.T) { - f, cleanup := mktmpfifo(t) - defer cleanup() - - const timeout = 100 * time.Millisecond - - ok := make(chan bool, 1) - go func() { - select { - case <-time.After(10 * timeout): - t.Errorf("Ppoll: failed to timeout after %d", 10*timeout) - case <-ok: - } - }() - - fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} - timeoutTs := unix.NsecToTimespec(int64(timeout)) - n, err := unix.Ppoll(fds, &timeoutTs, nil) - ok <- true - if err != nil { - t.Errorf("Ppoll: unexpected error: %v", err) - return - } - if n != 0 { - t.Errorf("Ppoll: wrong number of events: got %v, expected %v", n, 0) - return - } -} - -func TestSysctlUvmexp(t *testing.T) { - uvm, err := unix.SysctlUvmexp("vm.uvmexp") - if err != nil { - t.Fatal(err) - } - t.Logf("free = %v", uvm.Free) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris_test.go deleted file mode 100644 index 57dba88243..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_solaris_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2017 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. - -// +build solaris - -package unix_test - -import ( - "os/exec" - "testing" - "time" - - "golang.org/x/sys/unix" -) - -func TestSelect(t *testing.T) { - err := unix.Select(0, nil, nil, nil, &unix.Timeval{Sec: 0, Usec: 0}) - if err != nil { - t.Fatalf("Select: %v", err) - } - - dur := 150 * time.Millisecond - tv := unix.NsecToTimeval(int64(dur)) - start := time.Now() - err = unix.Select(0, nil, nil, nil, &tv) - took := time.Since(start) - if err != nil { - t.Fatalf("Select: %v", err) - } - - if took < dur { - t.Errorf("Select: timeout should have been at least %v, got %v", dur, took) - } -} - -func TestStatvfs(t *testing.T) { - if err := unix.Statvfs("", nil); err == nil { - t.Fatal(`Statvfs("") expected failure`) - } - - statvfs := unix.Statvfs_t{} - if err := unix.Statvfs("/", &statvfs); err != nil { - t.Errorf(`Statvfs("/") failed: %v`, err) - } - - if t.Failed() { - mount, err := exec.Command("mount").CombinedOutput() - if err != nil { - t.Logf("mount: %v\n%s", err, mount) - } else { - t.Logf("mount: %s", mount) - } - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_test.go deleted file mode 100644 index dc857840a4..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "fmt" - "testing" - - "golang.org/x/sys/unix" -) - -func testSetGetenv(t *testing.T, key, value string) { - err := unix.Setenv(key, value) - if err != nil { - t.Fatalf("Setenv failed to set %q: %v", value, err) - } - newvalue, found := unix.Getenv(key) - if !found { - t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) - } - if newvalue != value { - t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) - } -} - -func TestEnv(t *testing.T) { - testSetGetenv(t, "TESTENV", "AVALUE") - // make sure TESTENV gets set to "", not deleted - testSetGetenv(t, "TESTENV", "") -} - -func TestItoa(t *testing.T) { - // Make most negative integer: 0x8000... - i := 1 - for i<<1 != 0 { - i <<= 1 - } - if i >= 0 { - t.Fatal("bad math") - } - s := unix.Itoa(i) - f := fmt.Sprint(i) - if s != f { - t.Fatalf("itoa(%d) = %s, want %s", i, s, f) - } -} - -func TestUname(t *testing.T) { - var utsname unix.Utsname - err := unix.Uname(&utsname) - if err != nil { - t.Fatalf("Uname: %v", err) - } - - t.Logf("OS: %s/%s %s", utsname.Sysname[:], utsname.Machine[:], utsname.Release[:]) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go deleted file mode 100644 index f6abe8c0d6..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix_test.go +++ /dev/null @@ -1,711 +0,0 @@ -// Copyright 2013 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "flag" - "fmt" - "io/ioutil" - "net" - "os" - "os/exec" - "path/filepath" - "runtime" - "syscall" - "testing" - "time" - - "golang.org/x/sys/unix" -) - -// Tests that below functions, structures and constants are consistent -// on all Unix-like systems. -func _() { - // program scheduling priority functions and constants - var ( - _ func(int, int, int) error = unix.Setpriority - _ func(int, int) (int, error) = unix.Getpriority - ) - const ( - _ int = unix.PRIO_USER - _ int = unix.PRIO_PROCESS - _ int = unix.PRIO_PGRP - ) - - // termios constants - const ( - _ int = unix.TCIFLUSH - _ int = unix.TCIOFLUSH - _ int = unix.TCOFLUSH - ) - - // fcntl file locking structure and constants - var ( - _ = unix.Flock_t{ - Type: int16(0), - Whence: int16(0), - Start: int64(0), - Len: int64(0), - Pid: int32(0), - } - ) - const ( - _ = unix.F_GETLK - _ = unix.F_SETLK - _ = unix.F_SETLKW - ) -} - -func TestErrnoSignalName(t *testing.T) { - testErrors := []struct { - num syscall.Errno - name string - }{ - {syscall.EPERM, "EPERM"}, - {syscall.EINVAL, "EINVAL"}, - {syscall.ENOENT, "ENOENT"}, - } - - for _, te := range testErrors { - t.Run(fmt.Sprintf("%d/%s", te.num, te.name), func(t *testing.T) { - e := unix.ErrnoName(te.num) - if e != te.name { - t.Errorf("ErrnoName(%d) returned %s, want %s", te.num, e, te.name) - } - }) - } - - testSignals := []struct { - num syscall.Signal - name string - }{ - {syscall.SIGHUP, "SIGHUP"}, - {syscall.SIGPIPE, "SIGPIPE"}, - {syscall.SIGSEGV, "SIGSEGV"}, - } - - for _, ts := range testSignals { - t.Run(fmt.Sprintf("%d/%s", ts.num, ts.name), func(t *testing.T) { - s := unix.SignalName(ts.num) - if s != ts.name { - t.Errorf("SignalName(%d) returned %s, want %s", ts.num, s, ts.name) - } - }) - } -} - -func TestFcntlInt(t *testing.T) { - t.Parallel() - file, err := ioutil.TempFile("", "TestFnctlInt") - if err != nil { - t.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - f := file.Fd() - flags, err := unix.FcntlInt(f, unix.F_GETFD, 0) - if err != nil { - t.Fatal(err) - } - if flags&unix.FD_CLOEXEC == 0 { - t.Errorf("flags %#x do not include FD_CLOEXEC", flags) - } -} - -// TestFcntlFlock tests whether the file locking structure matches -// the calling convention of each kernel. -func TestFcntlFlock(t *testing.T) { - name := filepath.Join(os.TempDir(), "TestFcntlFlock") - fd, err := unix.Open(name, unix.O_CREAT|unix.O_RDWR|unix.O_CLOEXEC, 0) - if err != nil { - t.Fatalf("Open failed: %v", err) - } - defer unix.Unlink(name) - defer unix.Close(fd) - flock := unix.Flock_t{ - Type: unix.F_RDLCK, - Start: 0, Len: 0, Whence: 1, - } - if err := unix.FcntlFlock(uintptr(fd), unix.F_GETLK, &flock); err != nil { - t.Fatalf("FcntlFlock failed: %v", err) - } -} - -// TestPassFD tests passing a file descriptor over a Unix socket. -// -// This test involved both a parent and child process. The parent -// process is invoked as a normal test, with "go test", which then -// runs the child process by running the current test binary with args -// "-test.run=^TestPassFD$" and an environment variable used to signal -// that the test should become the child process instead. -func TestPassFD(t *testing.T) { - if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { - t.Skip("cannot exec subprocess on iOS, skipping test") - } - if runtime.GOOS == "aix" { - t.Skip("getsockname issue on AIX 7.2 tl1, skipping test") - } - - if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { - passFDChild() - return - } - - tempDir, err := ioutil.TempDir("", "TestPassFD") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tempDir) - - fds, err := unix.Socketpair(unix.AF_LOCAL, unix.SOCK_STREAM, 0) - if err != nil { - t.Fatalf("Socketpair: %v", err) - } - defer unix.Close(fds[0]) - defer unix.Close(fds[1]) - writeFile := os.NewFile(uintptr(fds[0]), "child-writes") - readFile := os.NewFile(uintptr(fds[1]), "parent-reads") - defer writeFile.Close() - defer readFile.Close() - - cmd := exec.Command(os.Args[0], "-test.run=^TestPassFD$", "--", tempDir) - cmd.Env = []string{"GO_WANT_HELPER_PROCESS=1"} - if lp := os.Getenv("LD_LIBRARY_PATH"); lp != "" { - cmd.Env = append(cmd.Env, "LD_LIBRARY_PATH="+lp) - } - cmd.ExtraFiles = []*os.File{writeFile} - - out, err := cmd.CombinedOutput() - if len(out) > 0 || err != nil { - t.Fatalf("child process: %q, %v", out, err) - } - - c, err := net.FileConn(readFile) - if err != nil { - t.Fatalf("FileConn: %v", err) - } - defer c.Close() - - uc, ok := c.(*net.UnixConn) - if !ok { - t.Fatalf("unexpected FileConn type; expected UnixConn, got %T", c) - } - - buf := make([]byte, 32) // expect 1 byte - oob := make([]byte, 32) // expect 24 bytes - closeUnix := time.AfterFunc(5*time.Second, func() { - t.Logf("timeout reading from unix socket") - uc.Close() - }) - _, oobn, _, _, err := uc.ReadMsgUnix(buf, oob) - if err != nil { - t.Fatalf("ReadMsgUnix: %v", err) - } - closeUnix.Stop() - - scms, err := unix.ParseSocketControlMessage(oob[:oobn]) - if err != nil { - t.Fatalf("ParseSocketControlMessage: %v", err) - } - if len(scms) != 1 { - t.Fatalf("expected 1 SocketControlMessage; got scms = %#v", scms) - } - scm := scms[0] - gotFds, err := unix.ParseUnixRights(&scm) - if err != nil { - t.Fatalf("unix.ParseUnixRights: %v", err) - } - if len(gotFds) != 1 { - t.Fatalf("wanted 1 fd; got %#v", gotFds) - } - - f := os.NewFile(uintptr(gotFds[0]), "fd-from-child") - defer f.Close() - - got, err := ioutil.ReadAll(f) - want := "Hello from child process!\n" - if string(got) != want { - t.Errorf("child process ReadAll: %q, %v; want %q", got, err, want) - } -} - -// passFDChild is the child process used by TestPassFD. -func passFDChild() { - defer os.Exit(0) - - // Look for our fd. It should be fd 3, but we work around an fd leak - // bug here (http://golang.org/issue/2603) to let it be elsewhere. - var uc *net.UnixConn - for fd := uintptr(3); fd <= 10; fd++ { - f := os.NewFile(fd, "unix-conn") - var ok bool - netc, _ := net.FileConn(f) - uc, ok = netc.(*net.UnixConn) - if ok { - break - } - } - if uc == nil { - fmt.Println("failed to find unix fd") - return - } - - // Make a file f to send to our parent process on uc. - // We make it in tempDir, which our parent will clean up. - flag.Parse() - tempDir := flag.Arg(0) - f, err := ioutil.TempFile(tempDir, "") - if err != nil { - fmt.Printf("TempFile: %v", err) - return - } - - f.Write([]byte("Hello from child process!\n")) - f.Seek(0, 0) - - rights := unix.UnixRights(int(f.Fd())) - dummyByte := []byte("x") - n, oobn, err := uc.WriteMsgUnix(dummyByte, rights, nil) - if err != nil { - fmt.Printf("WriteMsgUnix: %v", err) - return - } - if n != 1 || oobn != len(rights) { - fmt.Printf("WriteMsgUnix = %d, %d; want 1, %d", n, oobn, len(rights)) - return - } -} - -// TestUnixRightsRoundtrip tests that UnixRights, ParseSocketControlMessage, -// and ParseUnixRights are able to successfully round-trip lists of file descriptors. -func TestUnixRightsRoundtrip(t *testing.T) { - testCases := [...][][]int{ - {{42}}, - {{1, 2}}, - {{3, 4, 5}}, - {{}}, - {{1, 2}, {3, 4, 5}, {}, {7}}, - } - for _, testCase := range testCases { - b := []byte{} - var n int - for _, fds := range testCase { - // Last assignment to n wins - n = len(b) + unix.CmsgLen(4*len(fds)) - b = append(b, unix.UnixRights(fds...)...) - } - // Truncate b - b = b[:n] - - scms, err := unix.ParseSocketControlMessage(b) - if err != nil { - t.Fatalf("ParseSocketControlMessage: %v", err) - } - if len(scms) != len(testCase) { - t.Fatalf("expected %v SocketControlMessage; got scms = %#v", len(testCase), scms) - } - for i, scm := range scms { - gotFds, err := unix.ParseUnixRights(&scm) - if err != nil { - t.Fatalf("ParseUnixRights: %v", err) - } - wantFds := testCase[i] - if len(gotFds) != len(wantFds) { - t.Fatalf("expected %v fds, got %#v", len(wantFds), gotFds) - } - for j, fd := range gotFds { - if fd != wantFds[j] { - t.Fatalf("expected fd %v, got %v", wantFds[j], fd) - } - } - } - } -} - -func TestRlimit(t *testing.T) { - var rlimit, zero unix.Rlimit - err := unix.Getrlimit(unix.RLIMIT_NOFILE, &rlimit) - if err != nil { - t.Fatalf("Getrlimit: save failed: %v", err) - } - if zero == rlimit { - t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit) - } - set := rlimit - set.Cur = set.Max - 1 - if runtime.GOOS == "darwin" && set.Cur > 10240 { - // The max file limit is 10240, even though - // the max returned by Getrlimit is 1<<63-1. - // This is OPEN_MAX in sys/syslimits.h. - set.Cur = 10240 - } - err = unix.Setrlimit(unix.RLIMIT_NOFILE, &set) - if err != nil { - t.Fatalf("Setrlimit: set failed: %#v %v", set, err) - } - var get unix.Rlimit - err = unix.Getrlimit(unix.RLIMIT_NOFILE, &get) - if err != nil { - t.Fatalf("Getrlimit: get failed: %v", err) - } - set = rlimit - set.Cur = set.Max - 1 - if set != get { - // Seems like Darwin requires some privilege to - // increase the soft limit of rlimit sandbox, though - // Setrlimit never reports an error. - switch runtime.GOOS { - case "darwin": - default: - t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get) - } - } - err = unix.Setrlimit(unix.RLIMIT_NOFILE, &rlimit) - if err != nil { - t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err) - } -} - -func TestSeekFailure(t *testing.T) { - _, err := unix.Seek(-1, 0, 0) - if err == nil { - t.Fatalf("Seek(-1, 0, 0) did not fail") - } - str := err.Error() // used to crash on Linux - t.Logf("Seek: %v", str) - if str == "" { - t.Fatalf("Seek(-1, 0, 0) return error with empty message") - } -} - -func TestDup(t *testing.T) { - file, err := ioutil.TempFile("", "TestDup") - if err != nil { - t.Fatalf("Tempfile failed: %v", err) - } - defer os.Remove(file.Name()) - defer file.Close() - f := int(file.Fd()) - - newFd, err := unix.Dup(f) - if err != nil { - t.Fatalf("Dup: %v", err) - } - - // Create and reserve a file descriptor. - // Dup2 automatically closes it before reusing it. - nullFile, err := os.Open("/dev/null") - if err != nil { - t.Fatal(err) - } - dupFd := int(file.Fd()) - err = unix.Dup2(newFd, dupFd) - if err != nil { - t.Fatalf("Dup2: %v", err) - } - // Keep the dummy file open long enough to not be closed in - // its finalizer. - runtime.KeepAlive(nullFile) - - b1 := []byte("Test123") - b2 := make([]byte, 7) - _, err = unix.Write(dupFd, b1) - if err != nil { - t.Fatalf("Write to dup2 fd failed: %v", err) - } - _, err = unix.Seek(f, 0, 0) - if err != nil { - t.Fatalf("Seek failed: %v", err) - } - _, err = unix.Read(f, b2) - if err != nil { - t.Fatalf("Read back failed: %v", err) - } - if string(b1) != string(b2) { - t.Errorf("Dup: stdout write not in file, expected %v, got %v", string(b1), string(b2)) - } -} - -func TestPoll(t *testing.T) { - if runtime.GOOS == "android" || - (runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64")) { - t.Skip("mkfifo syscall is not available on android and iOS, skipping test") - } - - defer chtmpdir(t)() - f, cleanup := mktmpfifo(t) - defer cleanup() - - const timeout = 100 - - ok := make(chan bool, 1) - go func() { - select { - case <-time.After(10 * timeout * time.Millisecond): - t.Errorf("Poll: failed to timeout after %d milliseconds", 10*timeout) - case <-ok: - } - }() - - fds := []unix.PollFd{{Fd: int32(f.Fd()), Events: unix.POLLIN}} - n, err := unix.Poll(fds, timeout) - ok <- true - if err != nil { - t.Errorf("Poll: unexpected error: %v", err) - return - } - if n != 0 { - t.Errorf("Poll: wrong number of events: got %v, expected %v", n, 0) - return - } -} - -func TestGetwd(t *testing.T) { - fd, err := os.Open(".") - if err != nil { - t.Fatalf("Open .: %s", err) - } - defer fd.Close() - // Directory list for test. Do not worry if any are symlinks or do not - // exist on some common unix desktop environments. That will be checked. - dirs := []string{"/", "/usr/bin", "/etc", "/var", "/opt"} - switch runtime.GOOS { - case "android": - dirs = []string{"/", "/system/bin"} - case "darwin": - switch runtime.GOARCH { - case "arm", "arm64": - d1, err := ioutil.TempDir("", "d1") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - d2, err := ioutil.TempDir("", "d2") - if err != nil { - t.Fatalf("TempDir: %v", err) - } - dirs = []string{d1, d2} - } - } - oldwd := os.Getenv("PWD") - for _, d := range dirs { - // Check whether d exists, is a dir and that d's path does not contain a symlink - fi, err := os.Stat(d) - if err != nil || !fi.IsDir() { - t.Logf("Test dir %s stat error (%v) or not a directory, skipping", d, err) - continue - } - check, err := filepath.EvalSymlinks(d) - if err != nil || check != d { - t.Logf("Test dir %s (%s) is symlink or other error (%v), skipping", d, check, err) - continue - } - err = os.Chdir(d) - if err != nil { - t.Fatalf("Chdir: %v", err) - } - pwd, err := unix.Getwd() - if err != nil { - t.Fatalf("Getwd in %s: %s", d, err) - } - os.Setenv("PWD", oldwd) - err = fd.Chdir() - if err != nil { - // We changed the current directory and cannot go back. - // Don't let the tests continue; they'll scribble - // all over some other directory. - fmt.Fprintf(os.Stderr, "fchdir back to dot failed: %s\n", err) - os.Exit(1) - } - if pwd != d { - t.Fatalf("Getwd returned %q want %q", pwd, d) - } - } -} - -func TestFstatat(t *testing.T) { - defer chtmpdir(t)() - - touch(t, "file1") - - var st1 unix.Stat_t - err := unix.Stat("file1", &st1) - if err != nil { - t.Fatalf("Stat: %v", err) - } - - var st2 unix.Stat_t - err = unix.Fstatat(unix.AT_FDCWD, "file1", &st2, 0) - if err != nil { - t.Fatalf("Fstatat: %v", err) - } - - if st1 != st2 { - t.Errorf("Fstatat: returned stat does not match Stat") - } - - err = os.Symlink("file1", "symlink1") - if err != nil { - t.Fatal(err) - } - - err = unix.Lstat("symlink1", &st1) - if err != nil { - t.Fatalf("Lstat: %v", err) - } - - err = unix.Fstatat(unix.AT_FDCWD, "symlink1", &st2, unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - t.Fatalf("Fstatat: %v", err) - } - - if st1 != st2 { - t.Errorf("Fstatat: returned stat does not match Lstat") - } -} - -func TestFchmodat(t *testing.T) { - defer chtmpdir(t)() - - touch(t, "file1") - err := os.Symlink("file1", "symlink1") - if err != nil { - t.Fatal(err) - } - - mode := os.FileMode(0444) - err = unix.Fchmodat(unix.AT_FDCWD, "symlink1", uint32(mode), 0) - if err != nil { - t.Fatalf("Fchmodat: unexpected error: %v", err) - } - - fi, err := os.Stat("file1") - if err != nil { - t.Fatal(err) - } - - if fi.Mode() != mode { - t.Errorf("Fchmodat: failed to change file mode: expected %v, got %v", mode, fi.Mode()) - } - - mode = os.FileMode(0644) - didChmodSymlink := true - err = unix.Fchmodat(unix.AT_FDCWD, "symlink1", uint32(mode), unix.AT_SYMLINK_NOFOLLOW) - if err != nil { - if (runtime.GOOS == "android" || runtime.GOOS == "linux" || runtime.GOOS == "solaris") && err == unix.EOPNOTSUPP { - // Linux and Illumos don't support flags != 0 - didChmodSymlink = false - } else { - t.Fatalf("Fchmodat: unexpected error: %v", err) - } - } - - if !didChmodSymlink { - // Didn't change mode of the symlink. On Linux, the permissions - // of a symbolic link are always 0777 according to symlink(7) - mode = os.FileMode(0777) - } - - var st unix.Stat_t - err = unix.Lstat("symlink1", &st) - if err != nil { - t.Fatal(err) - } - - got := os.FileMode(st.Mode & 0777) - if got != mode { - t.Errorf("Fchmodat: failed to change symlink mode: expected %v, got %v", mode, got) - } -} - -func TestMkdev(t *testing.T) { - major := uint32(42) - minor := uint32(7) - dev := unix.Mkdev(major, minor) - - if unix.Major(dev) != major { - t.Errorf("Major(%#x) == %d, want %d", dev, unix.Major(dev), major) - } - if unix.Minor(dev) != minor { - t.Errorf("Minor(%#x) == %d, want %d", dev, unix.Minor(dev), minor) - } -} - -func TestRenameat(t *testing.T) { - defer chtmpdir(t)() - - from, to := "renamefrom", "renameto" - - touch(t, from) - - err := unix.Renameat(unix.AT_FDCWD, from, unix.AT_FDCWD, to) - if err != nil { - t.Fatalf("Renameat: unexpected error: %v", err) - } - - _, err = os.Stat(to) - if err != nil { - t.Error(err) - } - - _, err = os.Stat(from) - if err == nil { - t.Errorf("Renameat: stat of renamed file %q unexpectedly succeeded", from) - } -} - -// mktmpfifo creates a temporary FIFO and provides a cleanup function. -func mktmpfifo(t *testing.T) (*os.File, func()) { - err := unix.Mkfifo("fifo", 0666) - if err != nil { - t.Fatalf("mktmpfifo: failed to create FIFO: %v", err) - } - - f, err := os.OpenFile("fifo", os.O_RDWR, 0666) - if err != nil { - os.Remove("fifo") - t.Fatalf("mktmpfifo: failed to open FIFO: %v", err) - } - - return f, func() { - f.Close() - os.Remove("fifo") - } -} - -// utilities taken from os/os_test.go - -func touch(t *testing.T, name string) { - f, err := os.Create(name) - if err != nil { - t.Fatal(err) - } - if err := f.Close(); err != nil { - t.Fatal(err) - } -} - -// chtmpdir changes the working directory to a new temporary directory and -// provides a cleanup function. Used when PWD is read-only. -func chtmpdir(t *testing.T) func() { - oldwd, err := os.Getwd() - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - d, err := ioutil.TempDir("", "test") - if err != nil { - t.Fatalf("chtmpdir: %v", err) - } - if err := os.Chdir(d); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - return func() { - if err := os.Chdir(oldwd); err != nil { - t.Fatalf("chtmpdir: %v", err) - } - os.RemoveAll(d) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/timestruct_test.go b/src/cmd/vendor/golang.org/x/sys/unix/timestruct_test.go deleted file mode 100644 index 1a72fdb362..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/timestruct_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2017 The Go Authors. All right reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package unix_test - -import ( - "testing" - "time" - "unsafe" - - "golang.org/x/sys/unix" -) - -func TestTimeToTimespec(t *testing.T) { - timeTests := []struct { - time time.Time - valid bool - }{ - {time.Unix(0, 0), true}, - {time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC), true}, - {time.Date(2262, time.December, 31, 23, 0, 0, 0, time.UTC), false}, - {time.Unix(0x7FFFFFFF, 0), true}, - {time.Unix(0x80000000, 0), false}, - {time.Unix(0x7FFFFFFF, 1000000000), false}, - {time.Unix(0x7FFFFFFF, 999999999), true}, - {time.Unix(-0x80000000, 0), true}, - {time.Unix(-0x80000001, 0), false}, - {time.Date(2038, time.January, 19, 3, 14, 7, 0, time.UTC), true}, - {time.Date(2038, time.January, 19, 3, 14, 8, 0, time.UTC), false}, - {time.Date(1901, time.December, 13, 20, 45, 52, 0, time.UTC), true}, - {time.Date(1901, time.December, 13, 20, 45, 51, 0, time.UTC), false}, - } - - // Currently all targets have either int32 or int64 for Timespec.Sec. - // If there were a new target with unsigned or floating point type for - // it, this test must be adjusted. - have64BitTime := (unsafe.Sizeof(unix.Timespec{}.Sec) == 8) - for _, tt := range timeTests { - ts, err := unix.TimeToTimespec(tt.time) - tt.valid = tt.valid || have64BitTime - if tt.valid && err != nil { - t.Errorf("TimeToTimespec(%v): %v", tt.time, err) - } - if err == nil { - tstime := time.Unix(int64(ts.Sec), int64(ts.Nsec)) - if !tstime.Equal(tt.time) { - t.Errorf("TimeToTimespec(%v) is the time %v", tt.time, tstime) - } - } - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go b/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go new file mode 100644 index 0000000000..25e834940d --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go @@ -0,0 +1,236 @@ +// Copyright 2018 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. + +// +build ignore +// +build aix + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + + +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +type off64 C.off64_t +type off C.off_t +type Mode_t C.mode_t + +// Time + +type Timespec C.struct_timespec + +type StTimespec C.struct_st_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +type Timezone C.struct_timezone + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit64 + +type Pid_t C.pid_t + +type _Gid_t C.gid_t + +type dev_t C.dev_t + +// Files + +type Stat_t C.struct_stat + +type StatxTimestamp C.struct_statx_timestamp + +type Statx_t C.struct_statx + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Cmsghdr C.struct_cmsghdr + +type ICMPv6Filter C.struct_icmp6_filter + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type Linger C.struct_linger + +type Msghdr C.struct_msghdr + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr +) + +type IfMsgHdr C.struct_if_msghdr + +// Misc + +type FdSet C.fd_set + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type Sigset_t C.sigset_t + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +//poll + +type PollFd struct { + Fd int32 + Events uint16 + Revents uint16 +} + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +//flock_t + +type Flock_t C.struct_flock64 + +// Statfs + +type Fsid_t C.struct_fsid_t +type Fsid64_t C.struct_fsid64_t + +type Statfs_t C.struct_statfs + +const RNDGETENTCNT = 0x80045200 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 0000000000..9fd2aaa6a2 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,277 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// uname + +type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go b/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 0000000000..3365dd79d0 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,263 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 0000000000..7470798951 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,356 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define _WANT_FREEBSD11_STAT 1 +#define _WANT_FREEBSD11_STATFS 1 +#define _WANT_FREEBSD11_DIRENT 1 +#define _WANT_FREEBSD11_KEVENT 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( + _statfsVersion = C.STATFS_VERSION + _dirblksiz = C.DIRBLKSIZ +) + +type Stat_t C.struct_stat + +type stat_freebsd11_t C.struct_freebsd11_stat + +type Statfs_t C.struct_statfs + +type statfs_freebsd11_t C.struct_freebsd11_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type dirent_freebsd11 C.struct_freebsd11_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent_freebsd11 + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLINIGNEOF = C.POLLINIGNEOF + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Capabilities + +type CapRights C.struct_cap_rights + +// Uname + +type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 0000000000..2dd4f9542c --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,289 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +type Ptmget C.struct_ptmget + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode + +// Uname + +type Utsname C.struct_utsname + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 0000000000..4e5e57f9a6 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,276 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Signal Sets + +type Sigset_t C.sigset_t + +// Uname + +type Utsname C.struct_utsname + +// Uvmexp + +const SizeofUvmexp = C.sizeof_struct_uvmexp + +type Uvmexp C.struct_uvmexp diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go b/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 0000000000..2b716f9348 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,266 @@ +// 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. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics + +const ( + SizeofPtr = C.sizeofPtr + SizeofShort = C.sizeof_short + SizeofInt = C.sizeof_int + SizeofLong = C.sizeof_long + SizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/xattr_test.go b/src/cmd/vendor/golang.org/x/sys/unix/xattr_test.go deleted file mode 100644 index 57fc84fb0f..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/xattr_test.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2018 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. - -// +build darwin freebsd linux netbsd - -package unix_test - -import ( - "io/ioutil" - "os" - "runtime" - "strings" - "testing" - - "golang.org/x/sys/unix" -) - -func TestXattr(t *testing.T) { - defer chtmpdir(t)() - - f := "xattr1" - touch(t, f) - - xattrName := "user.test" - xattrDataSet := "gopher" - - err := unix.Setxattr(f, xattrName, []byte{}, 0) - if err == unix.ENOTSUP || err == unix.EOPNOTSUPP { - t.Skip("filesystem does not support extended attributes, skipping test") - } else if err != nil { - t.Fatalf("Setxattr: %v", err) - } - - err = unix.Setxattr(f, xattrName, []byte(xattrDataSet), 0) - if err != nil { - t.Fatalf("Setxattr: %v", err) - } - - // find size - size, err := unix.Listxattr(f, nil) - if err != nil { - t.Fatalf("Listxattr: %v", err) - } - - if size <= 0 { - t.Fatalf("Listxattr returned an empty list of attributes") - } - - buf := make([]byte, size) - read, err := unix.Listxattr(f, buf) - if err != nil { - t.Fatalf("Listxattr: %v", err) - } - - xattrs := stringsFromByteSlice(buf[:read]) - - xattrWant := xattrName - if runtime.GOOS == "freebsd" { - // On FreeBSD, the namespace is stored separately from the xattr - // name and Listxattr doesn't return the namespace prefix. - xattrWant = strings.TrimPrefix(xattrWant, "user.") - } - found := false - for _, name := range xattrs { - if name == xattrWant { - found = true - } - } - - if !found { - t.Errorf("Listxattr did not return previously set attribute '%s'", xattrName) - } - - // find size - size, err = unix.Getxattr(f, xattrName, nil) - if err != nil { - t.Fatalf("Getxattr: %v", err) - } - - if size <= 0 { - t.Fatalf("Getxattr returned an empty attribute") - } - - xattrDataGet := make([]byte, size) - _, err = unix.Getxattr(f, xattrName, xattrDataGet) - if err != nil { - t.Fatalf("Getxattr: %v", err) - } - - got := string(xattrDataGet) - if got != xattrDataSet { - t.Errorf("Getxattr: expected attribute value %s, got %s", xattrDataSet, got) - } - - err = unix.Removexattr(f, xattrName) - if err != nil { - t.Fatalf("Removexattr: %v", err) - } - - n := "nonexistent" - err = unix.Lsetxattr(n, xattrName, []byte(xattrDataSet), 0) - if err != unix.ENOENT { - t.Errorf("Lsetxattr: expected %v on non-existent file, got %v", unix.ENOENT, err) - } - - _, err = unix.Lgetxattr(n, xattrName, nil) - if err != unix.ENOENT { - t.Errorf("Lgetxattr: %v", err) - } - - s := "symlink1" - err = os.Symlink(n, s) - if err != nil { - t.Fatal(err) - } - - err = unix.Lsetxattr(s, xattrName, []byte(xattrDataSet), 0) - if err != nil { - // Linux and Android doen't support xattrs on symlinks according - // to xattr(7), so just test that we get the proper error. - if (runtime.GOOS != "linux" && runtime.GOOS != "android") || err != unix.EPERM { - t.Fatalf("Lsetxattr: %v", err) - } - } -} - -func TestFdXattr(t *testing.T) { - file, err := ioutil.TempFile("", "TestFdXattr") - if err != nil { - t.Fatal(err) - } - defer os.Remove(file.Name()) - defer file.Close() - - fd := int(file.Fd()) - xattrName := "user.test" - xattrDataSet := "gopher" - - err = unix.Fsetxattr(fd, xattrName, []byte(xattrDataSet), 0) - if err == unix.ENOTSUP || err == unix.EOPNOTSUPP { - t.Skip("filesystem does not support extended attributes, skipping test") - } else if err != nil { - t.Fatalf("Fsetxattr: %v", err) - } - - // find size - size, err := unix.Flistxattr(fd, nil) - if err != nil { - t.Fatalf("Flistxattr: %v", err) - } - - if size <= 0 { - t.Fatalf("Flistxattr returned an empty list of attributes") - } - - buf := make([]byte, size) - read, err := unix.Flistxattr(fd, buf) - if err != nil { - t.Fatalf("Flistxattr: %v", err) - } - - xattrs := stringsFromByteSlice(buf[:read]) - - xattrWant := xattrName - if runtime.GOOS == "freebsd" { - // On FreeBSD, the namespace is stored separately from the xattr - // name and Listxattr doesn't return the namespace prefix. - xattrWant = strings.TrimPrefix(xattrWant, "user.") - } - found := false - for _, name := range xattrs { - if name == xattrWant { - found = true - } - } - - if !found { - t.Errorf("Flistxattr did not return previously set attribute '%s'", xattrName) - } - - // find size - size, err = unix.Fgetxattr(fd, xattrName, nil) - if err != nil { - t.Fatalf("Fgetxattr: %v", err) - } - - if size <= 0 { - t.Fatalf("Fgetxattr returned an empty attribute") - } - - xattrDataGet := make([]byte, size) - _, err = unix.Fgetxattr(fd, xattrName, xattrDataGet) - if err != nil { - t.Fatalf("Fgetxattr: %v", err) - } - - got := string(xattrDataGet) - if got != xattrDataSet { - t.Errorf("Fgetxattr: expected attribute value %s, got %s", xattrDataSet, got) - } - - err = unix.Fremovexattr(fd, xattrName) - if err != nil { - t.Fatalf("Fremovexattr: %v", err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/export_test.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/export_test.go deleted file mode 100644 index 8badf6fdcf..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/export_test.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2015 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. - -// +build windows - -package registry - -func (k Key) SetValue(name string, valtype uint32, data []byte) error { - return k.setValue(name, valtype, data) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/key.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/key.go deleted file mode 100644 index c256483434..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/key.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2015 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. - -// +build windows - -// Package registry provides access to the Windows registry. -// -// Here is a simple example, opening a registry key and reading a string value from it. -// -// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) -// if err != nil { -// log.Fatal(err) -// } -// defer k.Close() -// -// s, _, err := k.GetStringValue("SystemRoot") -// if err != nil { -// log.Fatal(err) -// } -// fmt.Printf("Windows system root is %q\n", s) -// -package registry - -import ( - "io" - "syscall" - "time" -) - -const ( - // Registry key security and access rights. - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx - // for details. - ALL_ACCESS = 0xf003f - CREATE_LINK = 0x00020 - CREATE_SUB_KEY = 0x00004 - ENUMERATE_SUB_KEYS = 0x00008 - EXECUTE = 0x20019 - NOTIFY = 0x00010 - QUERY_VALUE = 0x00001 - READ = 0x20019 - SET_VALUE = 0x00002 - WOW64_32KEY = 0x00200 - WOW64_64KEY = 0x00100 - WRITE = 0x20006 -) - -// Key is a handle to an open Windows registry key. -// Keys can be obtained by calling OpenKey; there are -// also some predefined root keys such as CURRENT_USER. -// Keys can be used directly in the Windows API. -type Key syscall.Handle - -const ( - // Windows defines some predefined root keys that are always open. - // An application can use these keys as entry points to the registry. - // Normally these keys are used in OpenKey to open new keys, - // but they can also be used anywhere a Key is required. - CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) - CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) - LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) - USERS = Key(syscall.HKEY_USERS) - CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) - PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) -) - -// Close closes open key k. -func (k Key) Close() error { - return syscall.RegCloseKey(syscall.Handle(k)) -} - -// OpenKey opens a new key with path name relative to key k. -// It accepts any open key, including CURRENT_USER and others, -// and returns the new key and an error. -// The access parameter specifies desired access rights to the -// key to be opened. -func OpenKey(k Key, path string, access uint32) (Key, error) { - p, err := syscall.UTF16PtrFromString(path) - if err != nil { - return 0, err - } - var subkey syscall.Handle - err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) - if err != nil { - return 0, err - } - return Key(subkey), nil -} - -// OpenRemoteKey opens a predefined registry key on another -// computer pcname. The key to be opened is specified by k, but -// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. -// If pcname is "", OpenRemoteKey returns local computer key. -func OpenRemoteKey(pcname string, k Key) (Key, error) { - var err error - var p *uint16 - if pcname != "" { - p, err = syscall.UTF16PtrFromString(`\\` + pcname) - if err != nil { - return 0, err - } - } - var remoteKey syscall.Handle - err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) - if err != nil { - return 0, err - } - return Key(remoteKey), nil -} - -// ReadSubKeyNames returns the names of subkeys of key k. -// The parameter n controls the number of returned names, -// analogous to the way os.File.Readdirnames works. -func (k Key) ReadSubKeyNames(n int) ([]string, error) { - names := make([]string, 0) - // Registry key size limit is 255 bytes and described there: - // https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx - buf := make([]uint16, 256) //plus extra room for terminating zero byte -loopItems: - for i := uint32(0); ; i++ { - if n > 0 { - if len(names) == n { - return names, nil - } - } - l := uint32(len(buf)) - for { - err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) - if err == nil { - break - } - if err == syscall.ERROR_MORE_DATA { - // Double buffer size and try again. - l = uint32(2 * len(buf)) - buf = make([]uint16, l) - continue - } - if err == _ERROR_NO_MORE_ITEMS { - break loopItems - } - return names, err - } - names = append(names, syscall.UTF16ToString(buf[:l])) - } - if n > len(names) { - return names, io.EOF - } - return names, nil -} - -// CreateKey creates a key named path under open key k. -// CreateKey returns the new key and a boolean flag that reports -// whether the key already existed. -// The access parameter specifies the access rights for the key -// to be created. -func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { - var h syscall.Handle - var d uint32 - err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), - 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) - if err != nil { - return 0, false, err - } - return Key(h), d == _REG_OPENED_EXISTING_KEY, nil -} - -// DeleteKey deletes the subkey path of key k and its values. -func DeleteKey(k Key, path string) error { - return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) -} - -// A KeyInfo describes the statistics of a key. It is returned by Stat. -type KeyInfo struct { - SubKeyCount uint32 - MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte - ValueCount uint32 - MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte - MaxValueLen uint32 // longest data component among the key's values, in bytes - lastWriteTime syscall.Filetime -} - -// ModTime returns the key's last write time. -func (ki *KeyInfo) ModTime() time.Time { - return time.Unix(0, ki.lastWriteTime.Nanoseconds()) -} - -// Stat retrieves information about the open key k. -func (k Key) Stat() (*KeyInfo, error) { - var ki KeyInfo - err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, - &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, - &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) - if err != nil { - return nil, err - } - return &ki, nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/mksyscall.go deleted file mode 100644 index 0ac95ffe73..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/mksyscall.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2015 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 registry - -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/registry_test.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/registry_test.go deleted file mode 100644 index 2f4dd69ef9..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/registry_test.go +++ /dev/null @@ -1,756 +0,0 @@ -// Copyright 2015 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. - -// +build windows - -package registry_test - -import ( - "bytes" - "crypto/rand" - "os" - "syscall" - "testing" - "time" - "unsafe" - - "golang.org/x/sys/windows/registry" -) - -func randKeyName(prefix string) string { - const numbers = "0123456789" - buf := make([]byte, 10) - rand.Read(buf) - for i, b := range buf { - buf[i] = numbers[b%byte(len(numbers))] - } - return prefix + string(buf) -} - -func TestReadSubKeyNames(t *testing.T) { - k, err := registry.OpenKey(registry.CLASSES_ROOT, "TypeLib", registry.ENUMERATE_SUB_KEYS) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - names, err := k.ReadSubKeyNames(-1) - if err != nil { - t.Fatal(err) - } - var foundStdOle bool - for _, name := range names { - // Every PC has "stdole 2.0 OLE Automation" library installed. - if name == "{00020430-0000-0000-C000-000000000046}" { - foundStdOle = true - } - } - if !foundStdOle { - t.Fatal("could not find stdole 2.0 OLE Automation") - } -} - -func TestCreateOpenDeleteKey(t *testing.T) { - k, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - testKName := randKeyName("TestCreateOpenDeleteKey_") - - testK, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) - if err != nil { - t.Fatal(err) - } - defer testK.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - testKAgain, exist, err := registry.CreateKey(k, testKName, registry.CREATE_SUB_KEY) - if err != nil { - t.Fatal(err) - } - defer testKAgain.Close() - - if !exist { - t.Fatalf("key %q should already exist", testKName) - } - - testKOpened, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) - if err != nil { - t.Fatal(err) - } - defer testKOpened.Close() - - err = registry.DeleteKey(k, testKName) - if err != nil { - t.Fatal(err) - } - - testKOpenedAgain, err := registry.OpenKey(k, testKName, registry.ENUMERATE_SUB_KEYS) - if err == nil { - defer testKOpenedAgain.Close() - t.Fatalf("key %q should already been deleted", testKName) - } - if err != registry.ErrNotExist { - t.Fatalf(`unexpected error ("not exist" expected): %v`, err) - } -} - -func equalStringSlice(a, b []string) bool { - if len(a) != len(b) { - return false - } - if a == nil { - return true - } - for i := range a { - if a[i] != b[i] { - return false - } - } - return true -} - -type ValueTest struct { - Type uint32 - Name string - Value interface{} - WillFail bool -} - -var ValueTests = []ValueTest{ - {Type: registry.SZ, Name: "String1", Value: ""}, - {Type: registry.SZ, Name: "String2", Value: "\000", WillFail: true}, - {Type: registry.SZ, Name: "String3", Value: "Hello World"}, - {Type: registry.SZ, Name: "String4", Value: "Hello World\000", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString1", Value: ""}, - {Type: registry.EXPAND_SZ, Name: "ExpString2", Value: "\000", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString3", Value: "Hello World"}, - {Type: registry.EXPAND_SZ, Name: "ExpString4", Value: "Hello\000World", WillFail: true}, - {Type: registry.EXPAND_SZ, Name: "ExpString5", Value: "%PATH%"}, - {Type: registry.EXPAND_SZ, Name: "ExpString6", Value: "%NO_SUCH_VARIABLE%"}, - {Type: registry.EXPAND_SZ, Name: "ExpString7", Value: "%PATH%;."}, - {Type: registry.BINARY, Name: "Binary1", Value: []byte{}}, - {Type: registry.BINARY, Name: "Binary2", Value: []byte{1, 2, 3}}, - {Type: registry.BINARY, Name: "Binary3", Value: []byte{3, 2, 1, 0, 1, 2, 3}}, - {Type: registry.DWORD, Name: "Dword1", Value: uint64(0)}, - {Type: registry.DWORD, Name: "Dword2", Value: uint64(1)}, - {Type: registry.DWORD, Name: "Dword3", Value: uint64(0xff)}, - {Type: registry.DWORD, Name: "Dword4", Value: uint64(0xffff)}, - {Type: registry.QWORD, Name: "Qword1", Value: uint64(0)}, - {Type: registry.QWORD, Name: "Qword2", Value: uint64(1)}, - {Type: registry.QWORD, Name: "Qword3", Value: uint64(0xff)}, - {Type: registry.QWORD, Name: "Qword4", Value: uint64(0xffff)}, - {Type: registry.QWORD, Name: "Qword5", Value: uint64(0xffffff)}, - {Type: registry.QWORD, Name: "Qword6", Value: uint64(0xffffffff)}, - {Type: registry.MULTI_SZ, Name: "MultiString1", Value: []string{"a", "b", "c"}}, - {Type: registry.MULTI_SZ, Name: "MultiString2", Value: []string{"abc", "", "cba"}}, - {Type: registry.MULTI_SZ, Name: "MultiString3", Value: []string{""}}, - {Type: registry.MULTI_SZ, Name: "MultiString4", Value: []string{"abcdef"}}, - {Type: registry.MULTI_SZ, Name: "MultiString5", Value: []string{"\000"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString6", Value: []string{"a\000b"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString7", Value: []string{"ab", "\000", "cd"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString8", Value: []string{"\000", "cd"}, WillFail: true}, - {Type: registry.MULTI_SZ, Name: "MultiString9", Value: []string{"ab", "\000"}, WillFail: true}, -} - -func setValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - var err error - switch test.Type { - case registry.SZ: - err = k.SetStringValue(test.Name, test.Value.(string)) - case registry.EXPAND_SZ: - err = k.SetExpandStringValue(test.Name, test.Value.(string)) - case registry.MULTI_SZ: - err = k.SetStringsValue(test.Name, test.Value.([]string)) - case registry.BINARY: - err = k.SetBinaryValue(test.Name, test.Value.([]byte)) - case registry.DWORD: - err = k.SetDWordValue(test.Name, uint32(test.Value.(uint64))) - case registry.QWORD: - err = k.SetQWordValue(test.Name, test.Value.(uint64)) - default: - t.Fatalf("unsupported type %d for %s value", test.Type, test.Name) - } - if test.WillFail { - if err == nil { - t.Fatalf("setting %s value %q should fail, but succeeded", test.Name, test.Value) - } - } else { - if err != nil { - t.Fatal(err) - } - } - } -} - -func enumerateValues(t *testing.T, k registry.Key) { - names, err := k.ReadValueNames(-1) - if err != nil { - t.Error(err) - return - } - haveNames := make(map[string]bool) - for _, n := range names { - haveNames[n] = false - } - for _, test := range ValueTests { - wantFound := !test.WillFail - _, haveFound := haveNames[test.Name] - if wantFound && !haveFound { - t.Errorf("value %s is not found while enumerating", test.Name) - } - if haveFound && !wantFound { - t.Errorf("value %s is found while enumerating, but expected to fail", test.Name) - } - if haveFound { - delete(haveNames, test.Name) - } - } - for n, v := range haveNames { - t.Errorf("value %s (%v) is found while enumerating, but has not been cretaed", n, v) - } -} - -func testErrNotExist(t *testing.T, name string, err error) { - if err == nil { - t.Errorf("%s value should not exist", name) - return - } - if err != registry.ErrNotExist { - t.Errorf("reading %s value should return 'not exist' error, but got: %s", name, err) - return - } -} - -func testErrUnexpectedType(t *testing.T, test ValueTest, gottype uint32, err error) { - if err == nil { - t.Errorf("GetXValue(%q) should not succeed", test.Name) - return - } - if err != registry.ErrUnexpectedType { - t.Errorf("reading %s value should return 'unexpected key value type' error, but got: %s", test.Name, err) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetStringValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetStringValue(test.Name) - if err != nil { - t.Errorf("GetStringValue(%s) failed: %v", test.Name, err) - return - } - if got != test.Value { - t.Errorf("want %s value %q, got %q", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - if gottype == registry.EXPAND_SZ { - _, err = registry.ExpandString(got) - if err != nil { - t.Errorf("ExpandString(%s) failed: %v", got, err) - return - } - } -} - -func testGetIntegerValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetIntegerValue(test.Name) - if err != nil { - t.Errorf("GetIntegerValue(%s) failed: %v", test.Name, err) - return - } - if got != test.Value.(uint64) { - t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetBinaryValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetBinaryValue(test.Name) - if err != nil { - t.Errorf("GetBinaryValue(%s) failed: %v", test.Name, err) - return - } - if !bytes.Equal(got, test.Value.([]byte)) { - t.Errorf("want %s value %v, got %v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetStringsValue(t *testing.T, k registry.Key, test ValueTest) { - got, gottype, err := k.GetStringsValue(test.Name) - if err != nil { - t.Errorf("GetStringsValue(%s) failed: %v", test.Name, err) - return - } - if !equalStringSlice(got, test.Value.([]string)) { - t.Errorf("want %s value %#v, got %#v", test.Name, test.Value, got) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } -} - -func testGetValue(t *testing.T, k registry.Key, test ValueTest, size int) { - if size <= 0 { - return - } - // read data with no buffer - gotsize, gottype, err := k.GetValue(test.Name, nil) - if err != nil { - t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // read data with short buffer - gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size-1)) - if err == nil { - t.Errorf("GetValue(%s, [%d]byte) should fail, but succeeded", test.Name, size-1) - return - } - if err != registry.ErrShortBuffer { - t.Errorf("reading %s value should return 'short buffer' error, but got: %s", test.Name, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // read full data - gotsize, gottype, err = k.GetValue(test.Name, make([]byte, size)) - if err != nil { - t.Errorf("GetValue(%s, [%d]byte) failed: %v", test.Name, size, err) - return - } - if gotsize != size { - t.Errorf("want %s value size of %d, got %v", test.Name, size, gotsize) - return - } - if gottype != test.Type { - t.Errorf("want %s value type %v, got %v", test.Name, test.Type, gottype) - return - } - // check GetValue returns ErrNotExist as required - _, _, err = k.GetValue(test.Name+"_not_there", make([]byte, size)) - if err == nil { - t.Errorf("GetValue(%q) should not succeed", test.Name) - return - } - if err != registry.ErrNotExist { - t.Errorf("GetValue(%q) should return 'not exist' error, but got: %s", test.Name, err) - return - } -} - -func testValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - switch test.Type { - case registry.SZ, registry.EXPAND_SZ: - if test.WillFail { - _, _, err := k.GetStringValue(test.Name) - testErrNotExist(t, test.Name, err) - } else { - testGetStringValue(t, k, test) - _, gottype, err := k.GetIntegerValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - // Size of utf16 string in bytes is not perfect, - // but correct for current test values. - // Size also includes terminating 0. - testGetValue(t, k, test, (len(test.Value.(string))+1)*2) - } - _, _, err := k.GetStringValue(test.Name + "_string_not_created") - testErrNotExist(t, test.Name+"_string_not_created", err) - case registry.DWORD, registry.QWORD: - testGetIntegerValue(t, k, test) - _, gottype, err := k.GetBinaryValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - _, _, err = k.GetIntegerValue(test.Name + "_int_not_created") - testErrNotExist(t, test.Name+"_int_not_created", err) - size := 8 - if test.Type == registry.DWORD { - size = 4 - } - testGetValue(t, k, test, size) - case registry.BINARY: - testGetBinaryValue(t, k, test) - _, gottype, err := k.GetStringsValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - _, _, err = k.GetBinaryValue(test.Name + "_byte_not_created") - testErrNotExist(t, test.Name+"_byte_not_created", err) - testGetValue(t, k, test, len(test.Value.([]byte))) - case registry.MULTI_SZ: - if test.WillFail { - _, _, err := k.GetStringsValue(test.Name) - testErrNotExist(t, test.Name, err) - } else { - testGetStringsValue(t, k, test) - _, gottype, err := k.GetStringValue(test.Name) - testErrUnexpectedType(t, test, gottype, err) - size := 0 - for _, s := range test.Value.([]string) { - size += len(s) + 1 // nil terminated - } - size += 1 // extra nil at the end - size *= 2 // count bytes, not uint16 - testGetValue(t, k, test, size) - } - _, _, err := k.GetStringsValue(test.Name + "_strings_not_created") - testErrNotExist(t, test.Name+"_strings_not_created", err) - default: - t.Errorf("unsupported type %d for %s value", test.Type, test.Name) - continue - } - } -} - -func testStat(t *testing.T, k registry.Key) { - subk, _, err := registry.CreateKey(k, "subkey", registry.CREATE_SUB_KEY) - if err != nil { - t.Error(err) - return - } - defer subk.Close() - - defer registry.DeleteKey(k, "subkey") - - ki, err := k.Stat() - if err != nil { - t.Error(err) - return - } - if ki.SubKeyCount != 1 { - t.Error("key must have 1 subkey") - } - if ki.MaxSubKeyLen != 6 { - t.Error("key max subkey name length must be 6") - } - if ki.ValueCount != 24 { - t.Errorf("key must have 24 values, but is %d", ki.ValueCount) - } - if ki.MaxValueNameLen != 12 { - t.Errorf("key max value name length must be 10, but is %d", ki.MaxValueNameLen) - } - if ki.MaxValueLen != 38 { - t.Errorf("key max value length must be 38, but is %d", ki.MaxValueLen) - } - if mt, ct := ki.ModTime(), time.Now(); ct.Sub(mt) > 100*time.Millisecond { - t.Errorf("key mod time is not close to current time: mtime=%v current=%v delta=%v", mt, ct, ct.Sub(mt)) - } -} - -func deleteValues(t *testing.T, k registry.Key) { - for _, test := range ValueTests { - if test.WillFail { - continue - } - err := k.DeleteValue(test.Name) - if err != nil { - t.Error(err) - continue - } - } - names, err := k.ReadValueNames(-1) - if err != nil { - t.Error(err) - return - } - if len(names) != 0 { - t.Errorf("some values remain after deletion: %v", names) - } -} - -func TestValues(t *testing.T) { - softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer softwareK.Close() - - testKName := randKeyName("TestValues_") - - k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - defer registry.DeleteKey(softwareK, testKName) - - setValues(t, k) - - enumerateValues(t, k) - - testValues(t, k) - - testStat(t, k) - - deleteValues(t, k) -} - -func walkKey(t *testing.T, k registry.Key, kname string) { - names, err := k.ReadValueNames(-1) - if err != nil { - t.Fatalf("reading value names of %s failed: %v", kname, err) - } - for _, name := range names { - _, valtype, err := k.GetValue(name, nil) - if err != nil { - t.Fatalf("reading value type of %s of %s failed: %v", name, kname, err) - } - switch valtype { - case registry.NONE: - case registry.SZ: - _, _, err := k.GetStringValue(name) - if err != nil { - t.Error(err) - } - case registry.EXPAND_SZ: - s, _, err := k.GetStringValue(name) - if err != nil { - t.Error(err) - } - _, err = registry.ExpandString(s) - if err != nil { - t.Error(err) - } - case registry.DWORD, registry.QWORD: - _, _, err := k.GetIntegerValue(name) - if err != nil { - t.Error(err) - } - case registry.BINARY: - _, _, err := k.GetBinaryValue(name) - if err != nil { - t.Error(err) - } - case registry.MULTI_SZ: - _, _, err := k.GetStringsValue(name) - if err != nil { - t.Error(err) - } - case registry.FULL_RESOURCE_DESCRIPTOR, registry.RESOURCE_LIST, registry.RESOURCE_REQUIREMENTS_LIST: - // TODO: not implemented - default: - t.Fatalf("value type %d of %s of %s failed: %v", valtype, name, kname, err) - } - } - - names, err = k.ReadSubKeyNames(-1) - if err != nil { - t.Fatalf("reading sub-keys of %s failed: %v", kname, err) - } - for _, name := range names { - func() { - subk, err := registry.OpenKey(k, name, registry.ENUMERATE_SUB_KEYS|registry.QUERY_VALUE) - if err != nil { - if err == syscall.ERROR_ACCESS_DENIED { - // ignore error, if we are not allowed to access this key - return - } - t.Fatalf("opening sub-keys %s of %s failed: %v", name, kname, err) - } - defer subk.Close() - - walkKey(t, subk, kname+`\`+name) - }() - } -} - -func TestWalkFullRegistry(t *testing.T) { - if testing.Short() { - t.Skip("skipping long running test in short mode") - } - walkKey(t, registry.CLASSES_ROOT, "CLASSES_ROOT") - walkKey(t, registry.CURRENT_USER, "CURRENT_USER") - walkKey(t, registry.LOCAL_MACHINE, "LOCAL_MACHINE") - walkKey(t, registry.USERS, "USERS") - walkKey(t, registry.CURRENT_CONFIG, "CURRENT_CONFIG") -} - -func TestExpandString(t *testing.T) { - got, err := registry.ExpandString("%PATH%") - if err != nil { - t.Fatal(err) - } - want := os.Getenv("PATH") - if got != want { - t.Errorf("want %q string expanded, got %q", want, got) - } -} - -func TestInvalidValues(t *testing.T) { - softwareK, err := registry.OpenKey(registry.CURRENT_USER, "Software", registry.QUERY_VALUE) - if err != nil { - t.Fatal(err) - } - defer softwareK.Close() - - testKName := randKeyName("TestInvalidValues_") - - k, exist, err := registry.CreateKey(softwareK, testKName, registry.CREATE_SUB_KEY|registry.QUERY_VALUE|registry.SET_VALUE) - if err != nil { - t.Fatal(err) - } - defer k.Close() - - if exist { - t.Fatalf("key %q already exists", testKName) - } - - defer registry.DeleteKey(softwareK, testKName) - - var tests = []struct { - Type uint32 - Name string - Data []byte - }{ - {registry.DWORD, "Dword1", nil}, - {registry.DWORD, "Dword2", []byte{1, 2, 3}}, - {registry.QWORD, "Qword1", nil}, - {registry.QWORD, "Qword2", []byte{1, 2, 3}}, - {registry.QWORD, "Qword3", []byte{1, 2, 3, 4, 5, 6, 7}}, - {registry.MULTI_SZ, "MultiString1", nil}, - {registry.MULTI_SZ, "MultiString2", []byte{0}}, - {registry.MULTI_SZ, "MultiString3", []byte{'a', 'b', 0}}, - {registry.MULTI_SZ, "MultiString4", []byte{'a', 0, 0, 'b', 0}}, - {registry.MULTI_SZ, "MultiString5", []byte{'a', 0, 0}}, - } - - for _, test := range tests { - err := k.SetValue(test.Name, test.Type, test.Data) - if err != nil { - t.Fatalf("SetValue for %q failed: %v", test.Name, err) - } - } - - for _, test := range tests { - switch test.Type { - case registry.DWORD, registry.QWORD: - value, valType, err := k.GetIntegerValue(test.Name) - if err == nil { - t.Errorf("GetIntegerValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) - } - case registry.MULTI_SZ: - value, valType, err := k.GetStringsValue(test.Name) - if err == nil { - if len(value) != 0 { - t.Errorf("GetStringsValue(%q) succeeded. Returns type=%d value=%v", test.Name, valType, value) - } - } - default: - t.Errorf("unsupported type %d for %s value", test.Type, test.Name) - } - } -} - -func TestGetMUIStringValue(t *testing.T) { - if err := registry.LoadRegLoadMUIString(); err != nil { - t.Skip("regLoadMUIString not supported; skipping") - } - if err := procGetDynamicTimeZoneInformation.Find(); err != nil { - t.Skipf("%s not supported; skipping", procGetDynamicTimeZoneInformation.Name) - } - var dtzi DynamicTimezoneinformation - if _, err := GetDynamicTimeZoneInformation(&dtzi); err != nil { - t.Fatal(err) - } - tzKeyName := syscall.UTF16ToString(dtzi.TimeZoneKeyName[:]) - timezoneK, err := registry.OpenKey(registry.LOCAL_MACHINE, - `SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\`+tzKeyName, registry.READ) - if err != nil { - t.Fatal(err) - } - defer timezoneK.Close() - - type testType struct { - name string - want string - } - var tests = []testType{ - {"MUI_Std", syscall.UTF16ToString(dtzi.StandardName[:])}, - } - if dtzi.DynamicDaylightTimeDisabled == 0 { - tests = append(tests, testType{"MUI_Dlt", syscall.UTF16ToString(dtzi.DaylightName[:])}) - } - - for _, test := range tests { - got, err := timezoneK.GetMUIStringValue(test.name) - if err != nil { - t.Error("GetMUIStringValue:", err) - } - - if got != test.want { - t.Errorf("GetMUIStringValue: %s: Got %q, want %q", test.name, got, test.want) - } - } -} - -type DynamicTimezoneinformation struct { - Bias int32 - StandardName [32]uint16 - StandardDate syscall.Systemtime - StandardBias int32 - DaylightName [32]uint16 - DaylightDate syscall.Systemtime - DaylightBias int32 - TimeZoneKeyName [128]uint16 - DynamicDaylightTimeDisabled uint8 -} - -var ( - kernel32DLL = syscall.NewLazyDLL("kernel32") - - procGetDynamicTimeZoneInformation = kernel32DLL.NewProc("GetDynamicTimeZoneInformation") -) - -func GetDynamicTimeZoneInformation(dtzi *DynamicTimezoneinformation) (rc uint32, err error) { - r0, _, e1 := syscall.Syscall(procGetDynamicTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(dtzi)), 0, 0) - rc = uint32(r0) - if rc == 0xffffffff { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/syscall.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/syscall.go deleted file mode 100644 index e66643cbaa..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/syscall.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 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. - -// +build windows - -package registry - -import "syscall" - -const ( - _REG_OPTION_NON_VOLATILE = 0 - - _REG_CREATED_NEW_KEY = 1 - _REG_OPENED_EXISTING_KEY = 2 - - _ERROR_NO_MORE_ITEMS syscall.Errno = 259 -) - -func LoadRegLoadMUIString() error { - return procRegLoadMUIStringW.Find() -} - -//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW -//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW -//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW -//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW -//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW -//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW -//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW - -//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/value.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/value.go deleted file mode 100644 index 71d4e15bab..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/value.go +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright 2015 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. - -// +build windows - -package registry - -import ( - "errors" - "io" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - // Registry value types. - NONE = 0 - SZ = 1 - EXPAND_SZ = 2 - BINARY = 3 - DWORD = 4 - DWORD_BIG_ENDIAN = 5 - LINK = 6 - MULTI_SZ = 7 - RESOURCE_LIST = 8 - FULL_RESOURCE_DESCRIPTOR = 9 - RESOURCE_REQUIREMENTS_LIST = 10 - QWORD = 11 -) - -var ( - // ErrShortBuffer is returned when the buffer was too short for the operation. - ErrShortBuffer = syscall.ERROR_MORE_DATA - - // ErrNotExist is returned when a registry key or value does not exist. - ErrNotExist = syscall.ERROR_FILE_NOT_FOUND - - // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. - ErrUnexpectedType = errors.New("unexpected key value type") -) - -// GetValue retrieves the type and data for the specified value associated -// with an open key k. It fills up buffer buf and returns the retrieved -// byte count n. If buf is too small to fit the stored value it returns -// ErrShortBuffer error along with the required buffer size n. -// If no buffer is provided, it returns true and actual buffer size n. -// If no buffer is provided, GetValue returns the value's type only. -// If the value does not exist, the error returned is ErrNotExist. -// -// GetValue is a low level function. If value's type is known, use the appropriate -// Get*Value function instead. -func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { - pname, err := syscall.UTF16PtrFromString(name) - if err != nil { - return 0, 0, err - } - var pbuf *byte - if len(buf) > 0 { - pbuf = (*byte)(unsafe.Pointer(&buf[0])) - } - l := uint32(len(buf)) - err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) - if err != nil { - return int(l), valtype, err - } - return int(l), valtype, nil -} - -func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) { - p, err := syscall.UTF16PtrFromString(name) - if err != nil { - return nil, 0, err - } - var t uint32 - n := uint32(len(buf)) - for { - err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) - if err == nil { - return buf[:n], t, nil - } - if err != syscall.ERROR_MORE_DATA { - return nil, 0, err - } - if n <= uint32(len(buf)) { - return nil, 0, err - } - buf = make([]byte, n) - } -} - -// GetStringValue retrieves the string value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetStringValue returns ErrNotExist. -// If value is not SZ or EXPAND_SZ, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return "", typ, err2 - } - switch typ { - case SZ, EXPAND_SZ: - default: - return "", typ, ErrUnexpectedType - } - if len(data) == 0 { - return "", typ, nil - } - u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] - return syscall.UTF16ToString(u), typ, nil -} - -// GetMUIStringValue retrieves the localized string value for -// the specified value name associated with an open key k. -// If the value name doesn't exist or the localized string value -// can't be resolved, GetMUIStringValue returns ErrNotExist. -// GetMUIStringValue panics if the system doesn't support -// regLoadMUIString; use LoadRegLoadMUIString to check if -// regLoadMUIString is supported before calling this function. -func (k Key) GetMUIStringValue(name string) (string, error) { - pname, err := syscall.UTF16PtrFromString(name) - if err != nil { - return "", err - } - - buf := make([]uint16, 1024) - var buflen uint32 - var pdir *uint16 - - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path - - // Try to resolve the string value using the system directory as - // a DLL search path; this assumes the string value is of the form - // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. - - // This approach works with tzres.dll but may have to be revised - // in the future to allow callers to provide custom search paths. - - var s string - s, err = ExpandString("%SystemRoot%\\system32\\") - if err != nil { - return "", err - } - pdir, err = syscall.UTF16PtrFromString(s) - if err != nil { - return "", err - } - - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - } - - for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed - if buflen <= uint32(len(buf)) { - break // Buffer not growing, assume race; break - } - buf = make([]uint16, buflen) - err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) - } - - if err != nil { - return "", err - } - - return syscall.UTF16ToString(buf), nil -} - -// ExpandString expands environment-variable strings and replaces -// them with the values defined for the current user. -// Use ExpandString to expand EXPAND_SZ strings. -func ExpandString(value string) (string, error) { - if value == "" { - return "", nil - } - p, err := syscall.UTF16PtrFromString(value) - if err != nil { - return "", err - } - r := make([]uint16, 100) - for { - n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) - if err != nil { - return "", err - } - if n <= uint32(len(r)) { - u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] - return syscall.UTF16ToString(u), nil - } - r = make([]uint16, n) - } -} - -// GetStringsValue retrieves the []string value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetStringsValue returns ErrNotExist. -// If value is not MULTI_SZ, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return nil, typ, err2 - } - if typ != MULTI_SZ { - return nil, typ, ErrUnexpectedType - } - if len(data) == 0 { - return nil, typ, nil - } - p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] - if len(p) == 0 { - return nil, typ, nil - } - if p[len(p)-1] == 0 { - p = p[:len(p)-1] // remove terminating null - } - val = make([]string, 0, 5) - from := 0 - for i, c := range p { - if c == 0 { - val = append(val, string(utf16.Decode(p[from:i]))) - from = i + 1 - } - } - return val, typ, nil -} - -// GetIntegerValue retrieves the integer value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetIntegerValue returns ErrNotExist. -// If value is not DWORD or QWORD, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 8)) - if err2 != nil { - return 0, typ, err2 - } - switch typ { - case DWORD: - if len(data) != 4 { - return 0, typ, errors.New("DWORD value is not 4 bytes long") - } - return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil - case QWORD: - if len(data) != 8 { - return 0, typ, errors.New("QWORD value is not 8 bytes long") - } - return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil - default: - return 0, typ, ErrUnexpectedType - } -} - -// GetBinaryValue retrieves the binary value for the specified -// value name associated with an open key k. It also returns the value's type. -// If value does not exist, GetBinaryValue returns ErrNotExist. -// If value is not BINARY, it will return the correct value -// type and ErrUnexpectedType. -func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { - data, typ, err2 := k.getValue(name, make([]byte, 64)) - if err2 != nil { - return nil, typ, err2 - } - if typ != BINARY { - return nil, typ, ErrUnexpectedType - } - return data, typ, nil -} - -func (k Key) setValue(name string, valtype uint32, data []byte) error { - p, err := syscall.UTF16PtrFromString(name) - if err != nil { - return err - } - if len(data) == 0 { - return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) - } - return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) -} - -// SetDWordValue sets the data and type of a name value -// under key k to value and DWORD. -func (k Key) SetDWordValue(name string, value uint32) error { - return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) -} - -// SetQWordValue sets the data and type of a name value -// under key k to value and QWORD. -func (k Key) SetQWordValue(name string, value uint64) error { - return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) -} - -func (k Key) setStringValue(name string, valtype uint32, value string) error { - v, err := syscall.UTF16FromString(value) - if err != nil { - return err - } - buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] - return k.setValue(name, valtype, buf) -} - -// SetStringValue sets the data and type of a name value -// under key k to value and SZ. The value must not contain a zero byte. -func (k Key) SetStringValue(name, value string) error { - return k.setStringValue(name, SZ, value) -} - -// SetExpandStringValue sets the data and type of a name value -// under key k to value and EXPAND_SZ. The value must not contain a zero byte. -func (k Key) SetExpandStringValue(name, value string) error { - return k.setStringValue(name, EXPAND_SZ, value) -} - -// SetStringsValue sets the data and type of a name value -// under key k to value and MULTI_SZ. The value strings -// must not contain a zero byte. -func (k Key) SetStringsValue(name string, value []string) error { - ss := "" - for _, s := range value { - for i := 0; i < len(s); i++ { - if s[i] == 0 { - return errors.New("string cannot have 0 inside") - } - } - ss += s + "\x00" - } - v := utf16.Encode([]rune(ss + "\x00")) - buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] - return k.setValue(name, MULTI_SZ, buf) -} - -// SetBinaryValue sets the data and type of a name value -// under key k to value and BINARY. -func (k Key) SetBinaryValue(name string, value []byte) error { - return k.setValue(name, BINARY, value) -} - -// DeleteValue removes a named value from the key k. -func (k Key) DeleteValue(name string) error { - return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) -} - -// ReadValueNames returns the value names of key k. -// The parameter n controls the number of returned names, -// analogous to the way os.File.Readdirnames works. -func (k Key) ReadValueNames(n int) ([]string, error) { - ki, err := k.Stat() - if err != nil { - return nil, err - } - names := make([]string, 0, ki.ValueCount) - buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character -loopItems: - for i := uint32(0); ; i++ { - if n > 0 { - if len(names) == n { - return names, nil - } - } - l := uint32(len(buf)) - for { - err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) - if err == nil { - break - } - if err == syscall.ERROR_MORE_DATA { - // Double buffer size and try again. - l = uint32(2 * len(buf)) - buf = make([]uint16, l) - continue - } - if err == _ERROR_NO_MORE_ITEMS { - break loopItems - } - return names, err - } - names = append(names, syscall.UTF16ToString(buf[:l])) - } - if n > len(names) { - return names, io.EOF - } - return names, nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go deleted file mode 100644 index 3778075da0..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go +++ /dev/null @@ -1,120 +0,0 @@ -// Code generated by 'go generate'; DO NOT EDIT. - -package registry - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var _ unsafe.Pointer - -// Do the interface allocations only once for common -// Errno values. -const ( - errnoERROR_IO_PENDING = 997 -) - -var ( - errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) -) - -// errnoErr returns common boxed Errno values, to prevent -// allocations at runtime. -func errnoErr(e syscall.Errno) error { - switch e { - case 0: - return nil - case errnoERROR_IO_PENDING: - return errERROR_IO_PENDING - } - // TODO: add more here, after collecting data on the common - // error values see on Windows. (perhaps when running - // all.bat?) - return e -} - -var ( - modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") - procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") - procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") - procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") - procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") - procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") - procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") - procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") -) - -func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { - r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { - r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { - r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) - if r0 != 0 { - regerrno = syscall.Errno(r0) - } - return -} - -func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { - r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) - n = uint32(r0) - if n == 0 { - if e1 != 0 { - err = errnoErr(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/log.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/log.go deleted file mode 100644 index e51ab42a1a..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/log.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package debug - -import ( - "os" - "strconv" -) - -// Log interface allows different log implementations to be used. -type Log interface { - Close() error - Info(eid uint32, msg string) error - Warning(eid uint32, msg string) error - Error(eid uint32, msg string) error -} - -// ConsoleLog provides access to the console. -type ConsoleLog struct { - Name string -} - -// New creates new ConsoleLog. -func New(source string) *ConsoleLog { - return &ConsoleLog{Name: source} -} - -// Close closes console log l. -func (l *ConsoleLog) Close() error { - return nil -} - -func (l *ConsoleLog) report(kind string, eid uint32, msg string) error { - s := l.Name + "." + kind + "(" + strconv.Itoa(int(eid)) + "): " + msg + "\n" - _, err := os.Stdout.Write([]byte(s)) - return err -} - -// Info writes an information event msg with event id eid to the console l. -func (l *ConsoleLog) Info(eid uint32, msg string) error { - return l.report("info", eid, msg) -} - -// Warning writes an warning event msg with event id eid to the console l. -func (l *ConsoleLog) Warning(eid uint32, msg string) error { - return l.report("warn", eid, msg) -} - -// Error writes an error event msg with event id eid to the console l. -func (l *ConsoleLog) Error(eid uint32, msg string) error { - return l.report("error", eid, msg) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/service.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/service.go deleted file mode 100644 index e621b87adc..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/debug/service.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// Package debug provides facilities to execute svc.Handler on console. -// -package debug - -import ( - "os" - "os/signal" - "syscall" - - "golang.org/x/sys/windows/svc" -) - -// Run executes service name by calling appropriate handler function. -// The process is running on console, unlike real service. Use Ctrl+C to -// send "Stop" command to your service. -func Run(name string, handler svc.Handler) error { - cmds := make(chan svc.ChangeRequest) - changes := make(chan svc.Status) - - sig := make(chan os.Signal) - signal.Notify(sig) - - go func() { - status := svc.Status{State: svc.Stopped} - for { - select { - case <-sig: - cmds <- svc.ChangeRequest{Cmd: svc.Stop, CurrentStatus: status} - case status = <-changes: - } - } - }() - - _, errno := handler.Execute([]string{name}, cmds, changes) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/event.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/event.go deleted file mode 100644 index 0508e22881..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/event.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package svc - -import ( - "errors" - - "golang.org/x/sys/windows" -) - -// event represents auto-reset, initially non-signaled Windows event. -// It is used to communicate between go and asm parts of this package. -type event struct { - h windows.Handle -} - -func newEvent() (*event, error) { - h, err := windows.CreateEvent(nil, 0, 0, nil) - if err != nil { - return nil, err - } - return &event{h: h}, nil -} - -func (e *event) Close() error { - return windows.CloseHandle(e.h) -} - -func (e *event) Set() error { - return windows.SetEvent(e.h) -} - -func (e *event) Wait() error { - s, err := windows.WaitForSingleObject(e.h, windows.INFINITE) - switch s { - case windows.WAIT_OBJECT_0: - break - case windows.WAIT_FAILED: - return err - default: - return errors.New("unexpected result from WaitForSingleObject") - } - return nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/install.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/install.go deleted file mode 100644 index c76a3760a4..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/install.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package eventlog - -import ( - "errors" - - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/registry" -) - -const ( - // Log levels. - Info = windows.EVENTLOG_INFORMATION_TYPE - Warning = windows.EVENTLOG_WARNING_TYPE - Error = windows.EVENTLOG_ERROR_TYPE -) - -const addKeyName = `SYSTEM\CurrentControlSet\Services\EventLog\Application` - -// Install modifies PC registry to allow logging with an event source src. -// It adds all required keys and values to the event log registry key. -// Install uses msgFile as the event message file. If useExpandKey is true, -// the event message file is installed as REG_EXPAND_SZ value, -// otherwise as REG_SZ. Use bitwise of log.Error, log.Warning and -// log.Info to specify events supported by the new event source. -func Install(src, msgFile string, useExpandKey bool, eventsSupported uint32) error { - appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.CREATE_SUB_KEY) - if err != nil { - return err - } - defer appkey.Close() - - sk, alreadyExist, err := registry.CreateKey(appkey, src, registry.SET_VALUE) - if err != nil { - return err - } - defer sk.Close() - if alreadyExist { - return errors.New(addKeyName + `\` + src + " registry key already exists") - } - - err = sk.SetDWordValue("CustomSource", 1) - if err != nil { - return err - } - if useExpandKey { - err = sk.SetExpandStringValue("EventMessageFile", msgFile) - } else { - err = sk.SetStringValue("EventMessageFile", msgFile) - } - if err != nil { - return err - } - err = sk.SetDWordValue("TypesSupported", eventsSupported) - if err != nil { - return err - } - return nil -} - -// InstallAsEventCreate is the same as Install, but uses -// %SystemRoot%\System32\EventCreate.exe as the event message file. -func InstallAsEventCreate(src string, eventsSupported uint32) error { - return Install(src, "%SystemRoot%\\System32\\EventCreate.exe", true, eventsSupported) -} - -// Remove deletes all registry elements installed by the correspondent Install. -func Remove(src string) error { - appkey, err := registry.OpenKey(registry.LOCAL_MACHINE, addKeyName, registry.SET_VALUE) - if err != nil { - return err - } - defer appkey.Close() - return registry.DeleteKey(appkey, src) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log.go deleted file mode 100644 index 46e5153d02..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// Package eventlog implements access to Windows event log. -// -package eventlog - -import ( - "errors" - "syscall" - - "golang.org/x/sys/windows" -) - -// Log provides access to the system log. -type Log struct { - Handle windows.Handle -} - -// Open retrieves a handle to the specified event log. -func Open(source string) (*Log, error) { - return OpenRemote("", source) -} - -// OpenRemote does the same as Open, but on different computer host. -func OpenRemote(host, source string) (*Log, error) { - if source == "" { - return nil, errors.New("Specify event log source") - } - var s *uint16 - if host != "" { - s = syscall.StringToUTF16Ptr(host) - } - h, err := windows.RegisterEventSource(s, syscall.StringToUTF16Ptr(source)) - if err != nil { - return nil, err - } - return &Log{Handle: h}, nil -} - -// Close closes event log l. -func (l *Log) Close() error { - return windows.DeregisterEventSource(l.Handle) -} - -func (l *Log) report(etype uint16, eid uint32, msg string) error { - ss := []*uint16{syscall.StringToUTF16Ptr(msg)} - return windows.ReportEvent(l.Handle, etype, 0, eid, 0, 1, 0, &ss[0], nil) -} - -// Info writes an information event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Info(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_INFORMATION_TYPE, eid, msg) -} - -// Warning writes an warning event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Warning(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_WARNING_TYPE, eid, msg) -} - -// Error writes an error event msg with event id eid to the end of event log l. -// When EventCreate.exe is used, eid must be between 1 and 1000. -func (l *Log) Error(eid uint32, msg string) error { - return l.report(windows.EVENTLOG_ERROR_TYPE, eid, msg) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go deleted file mode 100644 index 6fbbd4a876..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/eventlog/log_test.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package eventlog_test - -import ( - "testing" - - "golang.org/x/sys/windows/svc/eventlog" -) - -func TestLog(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system logs") - } - - const name = "mylog" - const supports = eventlog.Error | eventlog.Warning | eventlog.Info - err := eventlog.InstallAsEventCreate(name, supports) - if err != nil { - t.Fatalf("Install failed: %s", err) - } - defer func() { - err = eventlog.Remove(name) - if err != nil { - t.Fatalf("Remove failed: %s", err) - } - }() - - l, err := eventlog.Open(name) - if err != nil { - t.Fatalf("Open failed: %s", err) - } - defer l.Close() - - err = l.Info(1, "info") - if err != nil { - t.Fatalf("Info failed: %s", err) - } - err = l.Warning(2, "warning") - if err != nil { - t.Fatalf("Warning failed: %s", err) - } - err = l.Error(3, "error") - if err != nil { - t.Fatalf("Error failed: %s", err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/beep.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/example/beep.go deleted file mode 100644 index dcf23408d3..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/beep.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package main - -import ( - "syscall" -) - -// BUG(brainman): MessageBeep Windows api is broken on Windows 7, -// so this example does not beep when runs as service on Windows 7. - -var ( - beepFunc = syscall.MustLoadDLL("user32.dll").MustFindProc("MessageBeep") -) - -func beep() { - beepFunc.Call(0xffffffff) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/install.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/example/install.go deleted file mode 100644 index 39cb00d2ad..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/install.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package main - -import ( - "fmt" - "os" - "path/filepath" - - "golang.org/x/sys/windows/svc/eventlog" - "golang.org/x/sys/windows/svc/mgr" -) - -func exePath() (string, error) { - prog := os.Args[0] - p, err := filepath.Abs(prog) - if err != nil { - return "", err - } - fi, err := os.Stat(p) - if err == nil { - if !fi.Mode().IsDir() { - return p, nil - } - err = fmt.Errorf("%s is directory", p) - } - if filepath.Ext(p) == "" { - p += ".exe" - fi, err := os.Stat(p) - if err == nil { - if !fi.Mode().IsDir() { - return p, nil - } - err = fmt.Errorf("%s is directory", p) - } - } - return "", err -} - -func installService(name, desc string) error { - exepath, err := exePath() - if err != nil { - return err - } - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err == nil { - s.Close() - return fmt.Errorf("service %s already exists", name) - } - s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: desc}, "is", "auto-started") - if err != nil { - return err - } - defer s.Close() - err = eventlog.InstallAsEventCreate(name, eventlog.Error|eventlog.Warning|eventlog.Info) - if err != nil { - s.Delete() - return fmt.Errorf("SetupEventLogSource() failed: %s", err) - } - return nil -} - -func removeService(name string) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("service %s is not installed", name) - } - defer s.Close() - err = s.Delete() - if err != nil { - return err - } - err = eventlog.Remove(name) - if err != nil { - return fmt.Errorf("RemoveEventLogSource() failed: %s", err) - } - return nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/main.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/example/main.go deleted file mode 100644 index dc96c081af..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/main.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// Example service program that beeps. -// -// The program demonstrates how to create Windows service and -// install / remove it on a computer. It also shows how to -// stop / start / pause / continue any service, and how to -// write to event log. It also shows how to use debug -// facilities available in debug package. -// -package main - -import ( - "fmt" - "log" - "os" - "strings" - - "golang.org/x/sys/windows/svc" -) - -func usage(errmsg string) { - fmt.Fprintf(os.Stderr, - "%s\n\n"+ - "usage: %s \n"+ - " where is one of\n"+ - " install, remove, debug, start, stop, pause or continue.\n", - errmsg, os.Args[0]) - os.Exit(2) -} - -func main() { - const svcName = "myservice" - - isIntSess, err := svc.IsAnInteractiveSession() - if err != nil { - log.Fatalf("failed to determine if we are running in an interactive session: %v", err) - } - if !isIntSess { - runService(svcName, false) - return - } - - if len(os.Args) < 2 { - usage("no command specified") - } - - cmd := strings.ToLower(os.Args[1]) - switch cmd { - case "debug": - runService(svcName, true) - return - case "install": - err = installService(svcName, "my service") - case "remove": - err = removeService(svcName) - case "start": - err = startService(svcName) - case "stop": - err = controlService(svcName, svc.Stop, svc.Stopped) - case "pause": - err = controlService(svcName, svc.Pause, svc.Paused) - case "continue": - err = controlService(svcName, svc.Continue, svc.Running) - default: - usage(fmt.Sprintf("invalid command %s", cmd)) - } - if err != nil { - log.Fatalf("failed to %s %s: %v", cmd, svcName, err) - } - return -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/manage.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/example/manage.go deleted file mode 100644 index 782dbd96ca..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/manage.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package main - -import ( - "fmt" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" -) - -func startService(name string) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("could not access service: %v", err) - } - defer s.Close() - err = s.Start("is", "manual-started") - if err != nil { - return fmt.Errorf("could not start service: %v", err) - } - return nil -} - -func controlService(name string, c svc.Cmd, to svc.State) error { - m, err := mgr.Connect() - if err != nil { - return err - } - defer m.Disconnect() - s, err := m.OpenService(name) - if err != nil { - return fmt.Errorf("could not access service: %v", err) - } - defer s.Close() - status, err := s.Control(c) - if err != nil { - return fmt.Errorf("could not send control=%d: %v", c, err) - } - timeout := time.Now().Add(10 * time.Second) - for status.State != to { - if timeout.Before(time.Now()) { - return fmt.Errorf("timeout waiting for service to go to state=%d", to) - } - time.Sleep(300 * time.Millisecond) - status, err = s.Query() - if err != nil { - return fmt.Errorf("could not retrieve service status: %v", err) - } - } - return nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/service.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/example/service.go deleted file mode 100644 index 74c9393018..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/example/service.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package main - -import ( - "fmt" - "strings" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/debug" - "golang.org/x/sys/windows/svc/eventlog" -) - -var elog debug.Log - -type myservice struct{} - -func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { - const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue - changes <- svc.Status{State: svc.StartPending} - fasttick := time.Tick(500 * time.Millisecond) - slowtick := time.Tick(2 * time.Second) - tick := fasttick - changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} - elog.Info(1, strings.Join(args, "-")) -loop: - for { - select { - case <-tick: - beep() - elog.Info(1, "beep") - case c := <-r: - switch c.Cmd { - case svc.Interrogate: - changes <- c.CurrentStatus - // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 - time.Sleep(100 * time.Millisecond) - changes <- c.CurrentStatus - case svc.Stop, svc.Shutdown: - break loop - case svc.Pause: - changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted} - tick = slowtick - case svc.Continue: - changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} - tick = fasttick - default: - elog.Error(1, fmt.Sprintf("unexpected control request #%d", c)) - } - } - } - changes <- svc.Status{State: svc.StopPending} - return -} - -func runService(name string, isDebug bool) { - var err error - if isDebug { - elog = debug.New(name) - } else { - elog, err = eventlog.Open(name) - if err != nil { - return - } - } - defer elog.Close() - - elog.Info(1, fmt.Sprintf("starting %s service", name)) - run := svc.Run - if isDebug { - run = debug.Run - } - err = run(name, &myservice{}) - if err != nil { - elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err)) - return - } - elog.Info(1, fmt.Sprintf("%s service stopped", name)) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.c b/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.c deleted file mode 100644 index 6f1be1fa3b..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.c +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2012 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. - -// +build windows -// +build !go1.3 - -// copied from pkg/runtime -typedef unsigned int uint32; -typedef unsigned long long int uint64; -#ifdef _64BIT -typedef uint64 uintptr; -#else -typedef uint32 uintptr; -#endif - -// from sys_386.s or sys_amd64.s -void ·servicemain(void); - -void -·getServiceMain(uintptr *r) -{ - *r = (uintptr)·servicemain; -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.go deleted file mode 100644 index cd8b913c99..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/go12.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 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. - -// +build windows -// +build !go1.3 - -package svc - -// from go12.c -func getServiceMain(r *uintptr) diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/go13.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/go13.go deleted file mode 100644 index 9d7f3cec54..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/go13.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 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. - -// +build windows -// +build go1.3 - -package svc - -import "unsafe" - -const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const - -// Should be a built-in for unsafe.Pointer? -func add(p unsafe.Pointer, x uintptr) unsafe.Pointer { - return unsafe.Pointer(uintptr(p) + x) -} - -// funcPC returns the entry PC of the function f. -// It assumes that f is a func value. Otherwise the behavior is undefined. -func funcPC(f interface{}) uintptr { - return **(**uintptr)(add(unsafe.Pointer(&f), ptrSize)) -} - -// from sys_386.s and sys_amd64.s -func servicectlhandler(ctl uint32) uintptr -func servicemain(argc uint32, argv **uint16) - -func getServiceMain(r *uintptr) { - *r = funcPC(servicemain) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/config.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/config.go deleted file mode 100644 index d804e31f1f..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/config.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package mgr - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -const ( - // Service start types. - StartManual = windows.SERVICE_DEMAND_START // the service must be started manually - StartAutomatic = windows.SERVICE_AUTO_START // the service will start by itself whenever the computer reboots - StartDisabled = windows.SERVICE_DISABLED // the service cannot be started - - // The severity of the error, and action taken, - // if this service fails to start. - ErrorCritical = windows.SERVICE_ERROR_CRITICAL - ErrorIgnore = windows.SERVICE_ERROR_IGNORE - ErrorNormal = windows.SERVICE_ERROR_NORMAL - ErrorSevere = windows.SERVICE_ERROR_SEVERE -) - -// TODO(brainman): Password is not returned by windows.QueryServiceConfig, not sure how to get it. - -type Config struct { - ServiceType uint32 - StartType uint32 - ErrorControl uint32 - BinaryPathName string // fully qualified path to the service binary file, can also include arguments for an auto-start service - LoadOrderGroup string - TagId uint32 - Dependencies []string - ServiceStartName string // name of the account under which the service should run - DisplayName string - Password string - Description string -} - -func toString(p *uint16) string { - if p == nil { - return "" - } - return syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(p))[:]) -} - -func toStringSlice(ps *uint16) []string { - if ps == nil { - return nil - } - r := make([]string, 0) - for from, i, p := 0, 0, (*[1 << 24]uint16)(unsafe.Pointer(ps)); true; i++ { - if p[i] == 0 { - // empty string marks the end - if i <= from { - break - } - r = append(r, string(utf16.Decode(p[from:i]))) - from = i + 1 - } - } - return r -} - -// Config retrieves service s configuration paramteres. -func (s *Service) Config() (Config, error) { - var p *windows.QUERY_SERVICE_CONFIG - n := uint32(1024) - for { - b := make([]byte, n) - p = (*windows.QUERY_SERVICE_CONFIG)(unsafe.Pointer(&b[0])) - err := windows.QueryServiceConfig(s.Handle, p, n, &n) - if err == nil { - break - } - if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { - return Config{}, err - } - if n <= uint32(len(b)) { - return Config{}, err - } - } - - b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_DESCRIPTION) - if err != nil { - return Config{}, err - } - p2 := (*windows.SERVICE_DESCRIPTION)(unsafe.Pointer(&b[0])) - - return Config{ - ServiceType: p.ServiceType, - StartType: p.StartType, - ErrorControl: p.ErrorControl, - BinaryPathName: toString(p.BinaryPathName), - LoadOrderGroup: toString(p.LoadOrderGroup), - TagId: p.TagId, - Dependencies: toStringSlice(p.Dependencies), - ServiceStartName: toString(p.ServiceStartName), - DisplayName: toString(p.DisplayName), - Description: toString(p2.Description), - }, nil -} - -func updateDescription(handle windows.Handle, desc string) error { - d := windows.SERVICE_DESCRIPTION{Description: toPtr(desc)} - return windows.ChangeServiceConfig2(handle, - windows.SERVICE_CONFIG_DESCRIPTION, (*byte)(unsafe.Pointer(&d))) -} - -// UpdateConfig updates service s configuration parameters. -func (s *Service) UpdateConfig(c Config) error { - err := windows.ChangeServiceConfig(s.Handle, c.ServiceType, c.StartType, - c.ErrorControl, toPtr(c.BinaryPathName), toPtr(c.LoadOrderGroup), - nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), - toPtr(c.Password), toPtr(c.DisplayName)) - if err != nil { - return err - } - return updateDescription(s.Handle, c.Description) -} - -// queryServiceConfig2 calls Windows QueryServiceConfig2 with infoLevel parameter and returns retrieved service configuration information. -func (s *Service) queryServiceConfig2(infoLevel uint32) ([]byte, error) { - n := uint32(1024) - for { - b := make([]byte, n) - err := windows.QueryServiceConfig2(s.Handle, infoLevel, &b[0], n, &n) - if err == nil { - return b, nil - } - if err.(syscall.Errno) != syscall.ERROR_INSUFFICIENT_BUFFER { - return nil, err - } - if n <= uint32(len(b)) { - return nil, err - } - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go deleted file mode 100644 index 76965b5601..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// Package mgr can be used to manage Windows service programs. -// It can be used to install and remove them. It can also start, -// stop and pause them. The package can query / change current -// service state and config parameters. -// -package mgr - -import ( - "syscall" - "unicode/utf16" - "unsafe" - - "golang.org/x/sys/windows" -) - -// Mgr is used to manage Windows service. -type Mgr struct { - Handle windows.Handle -} - -// Connect establishes a connection to the service control manager. -func Connect() (*Mgr, error) { - return ConnectRemote("") -} - -// ConnectRemote establishes a connection to the -// service control manager on computer named host. -func ConnectRemote(host string) (*Mgr, error) { - var s *uint16 - if host != "" { - s = syscall.StringToUTF16Ptr(host) - } - h, err := windows.OpenSCManager(s, nil, windows.SC_MANAGER_ALL_ACCESS) - if err != nil { - return nil, err - } - return &Mgr{Handle: h}, nil -} - -// Disconnect closes connection to the service control manager m. -func (m *Mgr) Disconnect() error { - return windows.CloseServiceHandle(m.Handle) -} - -func toPtr(s string) *uint16 { - if len(s) == 0 { - return nil - } - return syscall.StringToUTF16Ptr(s) -} - -// toStringBlock terminates strings in ss with 0, and then -// concatenates them together. It also adds extra 0 at the end. -func toStringBlock(ss []string) *uint16 { - if len(ss) == 0 { - return nil - } - t := "" - for _, s := range ss { - if s != "" { - t += s + "\x00" - } - } - if t == "" { - return nil - } - t += "\x00" - return &utf16.Encode([]rune(t))[0] -} - -// CreateService installs new service name on the system. -// The service will be executed by running exepath binary. -// Use config c to specify service parameters. -// Any args will be passed as command-line arguments when -// the service is started; these arguments are distinct from -// the arguments passed to Service.Start or via the "Start -// parameters" field in the service's Properties dialog box. -func (m *Mgr) CreateService(name, exepath string, c Config, args ...string) (*Service, error) { - if c.StartType == 0 { - c.StartType = StartManual - } - if c.ErrorControl == 0 { - c.ErrorControl = ErrorNormal - } - if c.ServiceType == 0 { - c.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS - } - s := syscall.EscapeArg(exepath) - for _, v := range args { - s += " " + syscall.EscapeArg(v) - } - h, err := windows.CreateService(m.Handle, toPtr(name), toPtr(c.DisplayName), - windows.SERVICE_ALL_ACCESS, c.ServiceType, - c.StartType, c.ErrorControl, toPtr(s), toPtr(c.LoadOrderGroup), - nil, toStringBlock(c.Dependencies), toPtr(c.ServiceStartName), toPtr(c.Password)) - if err != nil { - return nil, err - } - if c.Description != "" { - err = updateDescription(h, c.Description) - if err != nil { - return nil, err - } - } - return &Service{Name: name, Handle: h}, nil -} - -// OpenService retrieves access to service name, so it can -// be interrogated and controlled. -func (m *Mgr) OpenService(name string) (*Service, error) { - h, err := windows.OpenService(m.Handle, syscall.StringToUTF16Ptr(name), windows.SERVICE_ALL_ACCESS) - if err != nil { - return nil, err - } - return &Service{Name: name, Handle: h}, nil -} - -// ListServices enumerates services in the specified -// service control manager database m. -// If the caller does not have the SERVICE_QUERY_STATUS -// access right to a service, the service is silently -// omitted from the list of services returned. -func (m *Mgr) ListServices() ([]string, error) { - var err error - var bytesNeeded, servicesReturned uint32 - var buf []byte - for { - var p *byte - if len(buf) > 0 { - p = &buf[0] - } - err = windows.EnumServicesStatusEx(m.Handle, windows.SC_ENUM_PROCESS_INFO, - windows.SERVICE_WIN32, windows.SERVICE_STATE_ALL, - p, uint32(len(buf)), &bytesNeeded, &servicesReturned, nil, nil) - if err == nil { - break - } - if err != syscall.ERROR_MORE_DATA { - return nil, err - } - if bytesNeeded <= uint32(len(buf)) { - return nil, err - } - buf = make([]byte, bytesNeeded) - } - if servicesReturned == 0 { - return nil, nil - } - services := (*[1 << 20]windows.ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(&buf[0]))[:servicesReturned] - var names []string - for _, s := range services { - name := syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(s.ServiceName))[:]) - names = append(names, name) - } - return names, nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go deleted file mode 100644 index 9171f5bcf1..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/mgr_test.go +++ /dev/null @@ -1,282 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package mgr_test - -import ( - "os" - "path/filepath" - "sort" - "strings" - "syscall" - "testing" - "time" - - "golang.org/x/sys/windows/svc/mgr" -) - -func TestOpenLanManServer(t *testing.T) { - m, err := mgr.Connect() - if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { - t.Skip("Skipping test: we don't have rights to manage services.") - } - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - s, err := m.OpenService("LanmanServer") - if err != nil { - t.Fatalf("OpenService(lanmanserver) failed: %s", err) - } - defer s.Close() - - _, err = s.Config() - if err != nil { - t.Fatalf("Config failed: %s", err) - } -} - -func install(t *testing.T, m *mgr.Mgr, name, exepath string, c mgr.Config) { - // Sometimes it takes a while for the service to get - // removed after previous test run. - for i := 0; ; i++ { - s, err := m.OpenService(name) - if err != nil { - break - } - s.Close() - - if i > 10 { - t.Fatalf("service %s already exists", name) - } - time.Sleep(300 * time.Millisecond) - } - - s, err := m.CreateService(name, exepath, c) - if err != nil { - t.Fatalf("CreateService(%s) failed: %v", name, err) - } - defer s.Close() -} - -func depString(d []string) string { - if len(d) == 0 { - return "" - } - for i := range d { - d[i] = strings.ToLower(d[i]) - } - ss := sort.StringSlice(d) - ss.Sort() - return strings.Join([]string(ss), " ") -} - -func testConfig(t *testing.T, s *mgr.Service, should mgr.Config) mgr.Config { - is, err := s.Config() - if err != nil { - t.Fatalf("Config failed: %s", err) - } - if should.DisplayName != is.DisplayName { - t.Fatalf("config mismatch: DisplayName is %q, but should have %q", is.DisplayName, should.DisplayName) - } - if should.StartType != is.StartType { - t.Fatalf("config mismatch: StartType is %v, but should have %v", is.StartType, should.StartType) - } - if should.Description != is.Description { - t.Fatalf("config mismatch: Description is %q, but should have %q", is.Description, should.Description) - } - if depString(should.Dependencies) != depString(is.Dependencies) { - t.Fatalf("config mismatch: Dependencies is %v, but should have %v", is.Dependencies, should.Dependencies) - } - return is -} - -func testRecoveryActions(t *testing.T, s *mgr.Service, should []mgr.RecoveryAction) { - is, err := s.RecoveryActions() - if err != nil { - t.Fatalf("RecoveryActions failed: %s", err) - } - if len(should) != len(is) { - t.Errorf("recovery action mismatch: contains %v actions, but should have %v", len(is), len(should)) - } - for i, _ := range is { - if should[i].Type != is[i].Type { - t.Errorf("recovery action mismatch: Type is %v, but should have %v", is[i].Type, should[i].Type) - } - if should[i].Delay != is[i].Delay { - t.Errorf("recovery action mismatch: Delay is %v, but should have %v", is[i].Delay, should[i].Delay) - } - } -} - -func testResetPeriod(t *testing.T, s *mgr.Service, should uint32) { - is, err := s.ResetPeriod() - if err != nil { - t.Fatalf("ResetPeriod failed: %s", err) - } - if should != is { - t.Errorf("reset period mismatch: reset period is %v, but should have %v", is, should) - } -} - -func testSetRecoveryActions(t *testing.T, s *mgr.Service) { - r := []mgr.RecoveryAction{ - mgr.RecoveryAction{ - Type: mgr.NoAction, - Delay: 60000 * time.Millisecond, - }, - mgr.RecoveryAction{ - Type: mgr.ServiceRestart, - Delay: 4 * time.Minute, - }, - mgr.RecoveryAction{ - Type: mgr.ServiceRestart, - Delay: time.Minute, - }, - mgr.RecoveryAction{ - Type: mgr.RunCommand, - Delay: 4000 * time.Millisecond, - }, - } - - // 4 recovery actions with reset period - err := s.SetRecoveryActions(r, uint32(10000)) - if err != nil { - t.Fatalf("SetRecoveryActions failed: %v", err) - } - testRecoveryActions(t, s, r) - testResetPeriod(t, s, uint32(10000)) - - // Infinite reset period - err = s.SetRecoveryActions(r, syscall.INFINITE) - if err != nil { - t.Fatalf("SetRecoveryActions failed: %v", err) - } - testRecoveryActions(t, s, r) - testResetPeriod(t, s, syscall.INFINITE) - - // nil recovery actions - err = s.SetRecoveryActions(nil, 0) - if err.Error() != "recoveryActions cannot be nil" { - t.Fatalf("SetRecoveryActions failed with unexpected error message of %q", err) - } - - // Delete all recovery actions and reset period - err = s.ResetRecoveryActions() - if err != nil { - t.Fatalf("ResetRecoveryActions failed: %v", err) - } - testRecoveryActions(t, s, nil) - testResetPeriod(t, s, 0) -} - -func testRebootMessage(t *testing.T, s *mgr.Service, should string) { - err := s.SetRebootMessage(should) - if err != nil { - t.Fatalf("SetRebootMessage failed: %v", err) - } - is, err := s.RebootMessage() - if err != nil { - t.Fatalf("RebootMessage failed: %v", err) - } - if should != is { - t.Errorf("reboot message mismatch: message is %q, but should have %q", is, should) - } -} - -func testRecoveryCommand(t *testing.T, s *mgr.Service, should string) { - err := s.SetRecoveryCommand(should) - if err != nil { - t.Fatalf("SetRecoveryCommand failed: %v", err) - } - is, err := s.RecoveryCommand() - if err != nil { - t.Fatalf("RecoveryCommand failed: %v", err) - } - if should != is { - t.Errorf("recovery command mismatch: command is %q, but should have %q", is, should) - } -} - -func remove(t *testing.T, s *mgr.Service) { - err := s.Delete() - if err != nil { - t.Fatalf("Delete failed: %s", err) - } -} - -func TestMyService(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system services") - } - - const name = "myservice" - - m, err := mgr.Connect() - if err != nil { - if errno, ok := err.(syscall.Errno); ok && errno == syscall.ERROR_ACCESS_DENIED { - t.Skip("Skipping test: we don't have rights to manage services.") - } - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - c := mgr.Config{ - StartType: mgr.StartDisabled, - DisplayName: "my service", - Description: "my service is just a test", - Dependencies: []string{"LanmanServer", "W32Time"}, - } - - exename := os.Args[0] - exepath, err := filepath.Abs(exename) - if err != nil { - t.Fatalf("filepath.Abs(%s) failed: %s", exename, err) - } - - install(t, m, name, exepath, c) - - s, err := m.OpenService(name) - if err != nil { - t.Fatalf("service %s is not installed", name) - } - defer s.Close() - - c.BinaryPathName = exepath - c = testConfig(t, s, c) - - c.StartType = mgr.StartManual - err = s.UpdateConfig(c) - if err != nil { - t.Fatalf("UpdateConfig failed: %v", err) - } - - testConfig(t, s, c) - - svcnames, err := m.ListServices() - if err != nil { - t.Fatalf("ListServices failed: %v", err) - } - var myserviceIsInstalled bool - for _, sn := range svcnames { - if sn == name { - myserviceIsInstalled = true - break - } - } - if !myserviceIsInstalled { - t.Errorf("ListServices failed to find %q service", name) - } - - testSetRecoveryActions(t, s) - testRebootMessage(t, s, "myservice failed") - testRebootMessage(t, s, "") // delete reboot message - testRecoveryCommand(t, s, "sc query myservice") - testRecoveryCommand(t, s, "") // delete recovery command - - remove(t, s) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go deleted file mode 100644 index 71ce2b8199..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2018 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. - -// +build windows - -package mgr - -import ( - "errors" - "syscall" - "time" - "unsafe" - - "golang.org/x/sys/windows" -) - -const ( - // Possible recovery actions that the service control manager can perform. - NoAction = windows.SC_ACTION_NONE // no action - ComputerReboot = windows.SC_ACTION_REBOOT // reboot the computer - ServiceRestart = windows.SC_ACTION_RESTART // restart the service - RunCommand = windows.SC_ACTION_RUN_COMMAND // run a command -) - -// RecoveryAction represents an action that the service control manager can perform when service fails. -// A service is considered failed when it terminates without reporting a status of SERVICE_STOPPED to the service controller. -type RecoveryAction struct { - Type int // one of NoAction, ComputerReboot, ServiceRestart or RunCommand - Delay time.Duration // the time to wait before performing the specified action -} - -// SetRecoveryActions sets actions that service controller performs when service fails and -// the time after which to reset the service failure count to zero if there are no failures, in seconds. -// Specify INFINITE to indicate that service failure count should never be reset. -func (s *Service) SetRecoveryActions(recoveryActions []RecoveryAction, resetPeriod uint32) error { - if recoveryActions == nil { - return errors.New("recoveryActions cannot be nil") - } - actions := []windows.SC_ACTION{} - for _, a := range recoveryActions { - action := windows.SC_ACTION{ - Type: uint32(a.Type), - Delay: uint32(a.Delay.Nanoseconds() / 1000000), - } - actions = append(actions, action) - } - rActions := windows.SERVICE_FAILURE_ACTIONS{ - ActionsCount: uint32(len(actions)), - Actions: &actions[0], - ResetPeriod: resetPeriod, - } - return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions))) -} - -// RecoveryActions returns actions that service controller performs when service fails. -// The service control manager counts the number of times service s has failed since the system booted. -// The count is reset to 0 if the service has not failed for ResetPeriod seconds. -// When the service fails for the Nth time, the service controller performs the action specified in element [N-1] of returned slice. -// If N is greater than slice length, the service controller repeats the last action in the slice. -func (s *Service) RecoveryActions() ([]RecoveryAction, error) { - b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS) - if err != nil { - return nil, err - } - p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) - if p.Actions == nil { - return nil, err - } - - var recoveryActions []RecoveryAction - actions := (*[1024]windows.SC_ACTION)(unsafe.Pointer(p.Actions))[:p.ActionsCount] - for _, action := range actions { - recoveryActions = append(recoveryActions, RecoveryAction{Type: int(action.Type), Delay: time.Duration(action.Delay) * time.Millisecond}) - } - return recoveryActions, nil -} - -// ResetRecoveryActions deletes both reset period and array of failure actions. -func (s *Service) ResetRecoveryActions() error { - actions := make([]windows.SC_ACTION, 1) - rActions := windows.SERVICE_FAILURE_ACTIONS{ - Actions: &actions[0], - } - return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions))) -} - -// ResetPeriod is the time after which to reset the service failure -// count to zero if there are no failures, in seconds. -func (s *Service) ResetPeriod() (uint32, error) { - b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS) - if err != nil { - return 0, err - } - p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) - return p.ResetPeriod, nil -} - -// SetRebootMessage sets service s reboot message. -// If msg is "", the reboot message is deleted and no message is broadcast. -func (s *Service) SetRebootMessage(msg string) error { - rActions := windows.SERVICE_FAILURE_ACTIONS{ - RebootMsg: syscall.StringToUTF16Ptr(msg), - } - return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions))) -} - -// RebootMessage is broadcast to server users before rebooting in response to the ComputerReboot service controller action. -func (s *Service) RebootMessage() (string, error) { - b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS) - if err != nil { - return "", err - } - p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) - return toString(p.RebootMsg), nil -} - -// SetRecoveryCommand sets the command line of the process to execute in response to the RunCommand service controller action. -// If cmd is "", the command is deleted and no program is run when the service fails. -func (s *Service) SetRecoveryCommand(cmd string) error { - rActions := windows.SERVICE_FAILURE_ACTIONS{ - Command: syscall.StringToUTF16Ptr(cmd), - } - return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS, (*byte)(unsafe.Pointer(&rActions))) -} - -// RecoveryCommand is the command line of the process to execute in response to the RunCommand service controller action. This process runs under the same account as the service. -func (s *Service) RecoveryCommand() (string, error) { - b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS) - if err != nil { - return "", err - } - p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) - return toString(p.Command), nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/service.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/service.go deleted file mode 100644 index fdc46af5fc..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/mgr/service.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package mgr - -import ( - "syscall" - - "golang.org/x/sys/windows" - "golang.org/x/sys/windows/svc" -) - -// TODO(brainman): Use EnumDependentServices to enumerate dependent services. - -// Service is used to access Windows service. -type Service struct { - Name string - Handle windows.Handle -} - -// Delete marks service s for deletion from the service control manager database. -func (s *Service) Delete() error { - return windows.DeleteService(s.Handle) -} - -// Close relinquish access to the service s. -func (s *Service) Close() error { - return windows.CloseServiceHandle(s.Handle) -} - -// Start starts service s. -// args will be passed to svc.Handler.Execute. -func (s *Service) Start(args ...string) error { - var p **uint16 - if len(args) > 0 { - vs := make([]*uint16, len(args)) - for i := range vs { - vs[i] = syscall.StringToUTF16Ptr(args[i]) - } - p = &vs[0] - } - return windows.StartService(s.Handle, uint32(len(args)), p) -} - -// Control sends state change request c to the servce s. -func (s *Service) Control(c svc.Cmd) (svc.Status, error) { - var t windows.SERVICE_STATUS - err := windows.ControlService(s.Handle, uint32(c), &t) - if err != nil { - return svc.Status{}, err - } - return svc.Status{ - State: svc.State(t.CurrentState), - Accepts: svc.Accepted(t.ControlsAccepted), - }, nil -} - -// Query returns current status of service s. -func (s *Service) Query() (svc.Status, error) { - var t windows.SERVICE_STATUS - err := windows.QueryServiceStatus(s.Handle, &t) - if err != nil { - return svc.Status{}, err - } - return svc.Status{ - State: svc.State(t.CurrentState), - Accepts: svc.Accepted(t.ControlsAccepted), - }, nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/security.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/security.go deleted file mode 100644 index 6fbc9236ed..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/security.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package svc - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -func allocSid(subAuth0 uint32) (*windows.SID, error) { - var sid *windows.SID - err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, - 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) - if err != nil { - return nil, err - } - return sid, nil -} - -// IsAnInteractiveSession determines if calling process is running interactively. -// It queries the process token for membership in the Interactive group. -// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s -func IsAnInteractiveSession() (bool, error) { - interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID) - if err != nil { - return false, err - } - defer windows.FreeSid(interSid) - - serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) - if err != nil { - return false, err - } - defer windows.FreeSid(serviceSid) - - t, err := windows.OpenCurrentProcessToken() - if err != nil { - return false, err - } - defer t.Close() - - gs, err := t.GetTokenGroups() - if err != nil { - return false, err - } - p := unsafe.Pointer(&gs.Groups[0]) - groups := (*[2 << 20]windows.SIDAndAttributes)(p)[:gs.GroupCount] - for _, g := range groups { - if windows.EqualSid(g.Sid, interSid) { - return true, nil - } - if windows.EqualSid(g.Sid, serviceSid) { - return false, nil - } - } - return false, nil -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/service.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/service.go deleted file mode 100644 index cda26b54b3..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/service.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// Package svc provides everything required to build Windows service. -// -package svc - -import ( - "errors" - "runtime" - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -// State describes service execution state (Stopped, Running and so on). -type State uint32 - -const ( - Stopped = State(windows.SERVICE_STOPPED) - StartPending = State(windows.SERVICE_START_PENDING) - StopPending = State(windows.SERVICE_STOP_PENDING) - Running = State(windows.SERVICE_RUNNING) - ContinuePending = State(windows.SERVICE_CONTINUE_PENDING) - PausePending = State(windows.SERVICE_PAUSE_PENDING) - Paused = State(windows.SERVICE_PAUSED) -) - -// Cmd represents service state change request. It is sent to a service -// by the service manager, and should be actioned upon by the service. -type Cmd uint32 - -const ( - Stop = Cmd(windows.SERVICE_CONTROL_STOP) - Pause = Cmd(windows.SERVICE_CONTROL_PAUSE) - Continue = Cmd(windows.SERVICE_CONTROL_CONTINUE) - Interrogate = Cmd(windows.SERVICE_CONTROL_INTERROGATE) - Shutdown = Cmd(windows.SERVICE_CONTROL_SHUTDOWN) - ParamChange = Cmd(windows.SERVICE_CONTROL_PARAMCHANGE) - NetBindAdd = Cmd(windows.SERVICE_CONTROL_NETBINDADD) - NetBindRemove = Cmd(windows.SERVICE_CONTROL_NETBINDREMOVE) - NetBindEnable = Cmd(windows.SERVICE_CONTROL_NETBINDENABLE) - NetBindDisable = Cmd(windows.SERVICE_CONTROL_NETBINDDISABLE) - DeviceEvent = Cmd(windows.SERVICE_CONTROL_DEVICEEVENT) - HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE) - PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT) - SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE) -) - -// Accepted is used to describe commands accepted by the service. -// Note that Interrogate is always accepted. -type Accepted uint32 - -const ( - AcceptStop = Accepted(windows.SERVICE_ACCEPT_STOP) - AcceptShutdown = Accepted(windows.SERVICE_ACCEPT_SHUTDOWN) - AcceptPauseAndContinue = Accepted(windows.SERVICE_ACCEPT_PAUSE_CONTINUE) - AcceptParamChange = Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE) - AcceptNetBindChange = Accepted(windows.SERVICE_ACCEPT_NETBINDCHANGE) - AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE) - AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT) - AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE) -) - -// Status combines State and Accepted commands to fully describe running service. -type Status struct { - State State - Accepts Accepted - CheckPoint uint32 // used to report progress during a lengthy operation - WaitHint uint32 // estimated time required for a pending operation, in milliseconds -} - -// ChangeRequest is sent to the service Handler to request service status change. -type ChangeRequest struct { - Cmd Cmd - EventType uint32 - EventData uintptr - CurrentStatus Status -} - -// Handler is the interface that must be implemented to build Windows service. -type Handler interface { - - // Execute will be called by the package code at the start of - // the service, and the service will exit once Execute completes. - // Inside Execute you must read service change requests from r and - // act accordingly. You must keep service control manager up to date - // about state of your service by writing into s as required. - // args contains service name followed by argument strings passed - // to the service. - // You can provide service exit code in exitCode return parameter, - // with 0 being "no error". You can also indicate if exit code, - // if any, is service specific or not by using svcSpecificEC - // parameter. - Execute(args []string, r <-chan ChangeRequest, s chan<- Status) (svcSpecificEC bool, exitCode uint32) -} - -var ( - // These are used by asm code. - goWaitsH uintptr - cWaitsH uintptr - ssHandle uintptr - sName *uint16 - sArgc uintptr - sArgv **uint16 - ctlHandlerExProc uintptr - cSetEvent uintptr - cWaitForSingleObject uintptr - cRegisterServiceCtrlHandlerExW uintptr -) - -func init() { - k := syscall.MustLoadDLL("kernel32.dll") - cSetEvent = k.MustFindProc("SetEvent").Addr() - cWaitForSingleObject = k.MustFindProc("WaitForSingleObject").Addr() - a := syscall.MustLoadDLL("advapi32.dll") - cRegisterServiceCtrlHandlerExW = a.MustFindProc("RegisterServiceCtrlHandlerExW").Addr() -} - -// The HandlerEx prototype also has a context pointer but since we don't use -// it at start-up time we don't have to pass it over either. -type ctlEvent struct { - cmd Cmd - eventType uint32 - eventData uintptr - errno uint32 -} - -// service provides access to windows service api. -type service struct { - name string - h windows.Handle - cWaits *event - goWaits *event - c chan ctlEvent - handler Handler -} - -func newService(name string, handler Handler) (*service, error) { - var s service - var err error - s.name = name - s.c = make(chan ctlEvent) - s.handler = handler - s.cWaits, err = newEvent() - if err != nil { - return nil, err - } - s.goWaits, err = newEvent() - if err != nil { - s.cWaits.Close() - return nil, err - } - return &s, nil -} - -func (s *service) close() error { - s.cWaits.Close() - s.goWaits.Close() - return nil -} - -type exitCode struct { - isSvcSpecific bool - errno uint32 -} - -func (s *service) updateStatus(status *Status, ec *exitCode) error { - if s.h == 0 { - return errors.New("updateStatus with no service status handle") - } - var t windows.SERVICE_STATUS - t.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS - t.CurrentState = uint32(status.State) - if status.Accepts&AcceptStop != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_STOP - } - if status.Accepts&AcceptShutdown != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_SHUTDOWN - } - if status.Accepts&AcceptPauseAndContinue != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_PAUSE_CONTINUE - } - if status.Accepts&AcceptParamChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_PARAMCHANGE - } - if status.Accepts&AcceptNetBindChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_NETBINDCHANGE - } - if status.Accepts&AcceptHardwareProfileChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE - } - if status.Accepts&AcceptPowerEvent != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_POWEREVENT - } - if status.Accepts&AcceptSessionChange != 0 { - t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE - } - if ec.errno == 0 { - t.Win32ExitCode = windows.NO_ERROR - t.ServiceSpecificExitCode = windows.NO_ERROR - } else if ec.isSvcSpecific { - t.Win32ExitCode = uint32(windows.ERROR_SERVICE_SPECIFIC_ERROR) - t.ServiceSpecificExitCode = ec.errno - } else { - t.Win32ExitCode = ec.errno - t.ServiceSpecificExitCode = windows.NO_ERROR - } - t.CheckPoint = status.CheckPoint - t.WaitHint = status.WaitHint - return windows.SetServiceStatus(s.h, &t) -} - -const ( - sysErrSetServiceStatusFailed = uint32(syscall.APPLICATION_ERROR) + iota - sysErrNewThreadInCallback -) - -func (s *service) run() { - s.goWaits.Wait() - s.h = windows.Handle(ssHandle) - argv := (*[100]*int16)(unsafe.Pointer(sArgv))[:sArgc] - args := make([]string, len(argv)) - for i, a := range argv { - args[i] = syscall.UTF16ToString((*[1 << 20]uint16)(unsafe.Pointer(a))[:]) - } - - cmdsToHandler := make(chan ChangeRequest) - changesFromHandler := make(chan Status) - exitFromHandler := make(chan exitCode) - - go func() { - ss, errno := s.handler.Execute(args, cmdsToHandler, changesFromHandler) - exitFromHandler <- exitCode{ss, errno} - }() - - status := Status{State: Stopped} - ec := exitCode{isSvcSpecific: true, errno: 0} - var outch chan ChangeRequest - inch := s.c - var cmd Cmd - var evtype uint32 - var evdata uintptr -loop: - for { - select { - case r := <-inch: - if r.errno != 0 { - ec.errno = r.errno - break loop - } - inch = nil - outch = cmdsToHandler - cmd = r.cmd - evtype = r.eventType - evdata = r.eventData - case outch <- ChangeRequest{cmd, evtype, evdata, status}: - inch = s.c - outch = nil - case c := <-changesFromHandler: - err := s.updateStatus(&c, &ec) - if err != nil { - // best suitable error number - ec.errno = sysErrSetServiceStatusFailed - if err2, ok := err.(syscall.Errno); ok { - ec.errno = uint32(err2) - } - break loop - } - status = c - case ec = <-exitFromHandler: - break loop - } - } - - s.updateStatus(&Status{State: Stopped}, &ec) - s.cWaits.Set() -} - -func newCallback(fn interface{}) (cb uintptr, err error) { - defer func() { - r := recover() - if r == nil { - return - } - cb = 0 - switch v := r.(type) { - case string: - err = errors.New(v) - case error: - err = v - default: - err = errors.New("unexpected panic in syscall.NewCallback") - } - }() - return syscall.NewCallback(fn), nil -} - -// BUG(brainman): There is no mechanism to run multiple services -// inside one single executable. Perhaps, it can be overcome by -// using RegisterServiceCtrlHandlerEx Windows api. - -// Run executes service name by calling appropriate handler function. -func Run(name string, handler Handler) error { - runtime.LockOSThread() - - tid := windows.GetCurrentThreadId() - - s, err := newService(name, handler) - if err != nil { - return err - } - - ctlHandler := func(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { - e := ctlEvent{cmd: Cmd(ctl), eventType: evtype, eventData: evdata} - // We assume that this callback function is running on - // the same thread as Run. Nowhere in MS documentation - // I could find statement to guarantee that. So putting - // check here to verify, otherwise things will go bad - // quickly, if ignored. - i := windows.GetCurrentThreadId() - if i != tid { - e.errno = sysErrNewThreadInCallback - } - s.c <- e - // Always return NO_ERROR (0) for now. - return 0 - } - - var svcmain uintptr - getServiceMain(&svcmain) - t := []windows.SERVICE_TABLE_ENTRY{ - {ServiceName: syscall.StringToUTF16Ptr(s.name), ServiceProc: svcmain}, - {ServiceName: nil, ServiceProc: 0}, - } - - goWaitsH = uintptr(s.goWaits.h) - cWaitsH = uintptr(s.cWaits.h) - sName = t[0].ServiceName - ctlHandlerExProc, err = newCallback(ctlHandler) - if err != nil { - return err - } - - go s.run() - - err = windows.StartServiceCtrlDispatcher(&t[0]) - if err != nil { - return err - } - return nil -} - -// StatusHandle returns service status handle. It is safe to call this function -// from inside the Handler.Execute because then it is guaranteed to be set. -// This code will have to change once multiple services are possible per process. -func StatusHandle() windows.Handle { - return windows.Handle(ssHandle) -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/svc_test.go b/src/cmd/vendor/golang.org/x/sys/windows/svc/svc_test.go deleted file mode 100644 index feed8fabde..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/svc_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -package svc_test - -import ( - "fmt" - "io/ioutil" - "math/rand" - "os" - "os/exec" - "path/filepath" - "strings" - "testing" - "time" - - "golang.org/x/sys/windows/svc" - "golang.org/x/sys/windows/svc/mgr" -) - -func getState(t *testing.T, s *mgr.Service) svc.State { - status, err := s.Query() - if err != nil { - t.Fatalf("Query(%s) failed: %s", s.Name, err) - } - return status.State -} - -func testState(t *testing.T, s *mgr.Service, want svc.State) { - have := getState(t, s) - if have != want { - t.Fatalf("%s state is=%d want=%d", s.Name, have, want) - } -} - -func waitState(t *testing.T, s *mgr.Service, want svc.State) { - for i := 0; ; i++ { - have := getState(t, s) - if have == want { - return - } - if i > 10 { - t.Fatalf("%s state is=%d, waiting timeout", s.Name, have) - } - time.Sleep(300 * time.Millisecond) - } -} - -func TestExample(t *testing.T) { - if testing.Short() { - t.Skip("skipping test in short mode - it modifies system services") - } - - const name = "myservice" - - m, err := mgr.Connect() - if err != nil { - t.Fatalf("SCM connection failed: %s", err) - } - defer m.Disconnect() - - dir, err := ioutil.TempDir("", "svc") - if err != nil { - t.Fatalf("failed to create temp directory: %v", err) - } - defer os.RemoveAll(dir) - - exepath := filepath.Join(dir, "a.exe") - o, err := exec.Command("go", "build", "-o", exepath, "golang.org/x/sys/windows/svc/example").CombinedOutput() - if err != nil { - t.Fatalf("failed to build service program: %v\n%v", err, string(o)) - } - - s, err := m.OpenService(name) - if err == nil { - err = s.Delete() - if err != nil { - s.Close() - t.Fatalf("Delete failed: %s", err) - } - s.Close() - } - s, err = m.CreateService(name, exepath, mgr.Config{DisplayName: "my service"}, "is", "auto-started") - if err != nil { - t.Fatalf("CreateService(%s) failed: %v", name, err) - } - defer s.Close() - - args := []string{"is", "manual-started", fmt.Sprintf("%d", rand.Int())} - - testState(t, s, svc.Stopped) - err = s.Start(args...) - if err != nil { - t.Fatalf("Start(%s) failed: %s", s.Name, err) - } - waitState(t, s, svc.Running) - time.Sleep(1 * time.Second) - - // testing deadlock from issues 4. - _, err = s.Control(svc.Interrogate) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - _, err = s.Control(svc.Interrogate) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - time.Sleep(1 * time.Second) - - _, err = s.Control(svc.Stop) - if err != nil { - t.Fatalf("Control(%s) failed: %s", s.Name, err) - } - waitState(t, s, svc.Stopped) - - err = s.Delete() - if err != nil { - t.Fatalf("Delete failed: %s", err) - } - - out, err := exec.Command("wevtutil.exe", "qe", "Application", "/q:*[System[Provider[@Name='myservice']]]", "/rd:true", "/c:10").CombinedOutput() - if err != nil { - t.Fatalf("wevtutil failed: %v\n%v", err, string(out)) - } - if want := strings.Join(append([]string{name}, args...), "-"); !strings.Contains(string(out), want) { - t.Errorf("%q string does not contain %q", string(out), want) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_386.s b/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_386.s deleted file mode 100644 index 2c82a9d91d..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_386.s +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVL argc+0(FP), AX - MOVL AX, ·sArgc(SB) - MOVL argv+4(FP), AX - MOVL AX, ·sArgv(SB) - - PUSHL BP - PUSHL BX - PUSHL SI - PUSHL DI - - SUBL $12, SP - - MOVL ·sName(SB), AX - MOVL AX, (SP) - MOVL $·servicectlhandler(SB), AX - MOVL AX, 4(SP) - MOVL $0, 8(SP) - MOVL ·cRegisterServiceCtrlHandlerExW(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - CMPL AX, $0 - JE exit - MOVL AX, ·ssHandle(SB) - - MOVL ·goWaitsH(SB), AX - MOVL AX, (SP) - MOVL ·cSetEvent(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - - MOVL ·cWaitsH(SB), AX - MOVL AX, (SP) - MOVL $-1, AX - MOVL AX, 4(SP) - MOVL ·cWaitForSingleObject(SB), AX - MOVL SP, BP - CALL AX - MOVL BP, SP - -exit: - ADDL $12, SP - - POPL DI - POPL SI - POPL BX - POPL BP - - MOVL 0(SP), CX - ADDL $12, SP - JMP CX - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVL ·ctlHandlerExProc(SB), CX - JMP CX diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_amd64.s b/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_amd64.s deleted file mode 100644 index bde25e9c48..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_amd64.s +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2012 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. - -// +build windows - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),7,$0 - MOVL CX, ·sArgc(SB) - MOVQ DX, ·sArgv(SB) - - SUBQ $32, SP // stack for the first 4 syscall params - - MOVQ ·sName(SB), CX - MOVQ $·servicectlhandler(SB), DX - // BUG(pastarmovj): Figure out a way to pass in context in R8. - MOVQ ·cRegisterServiceCtrlHandlerExW(SB), AX - CALL AX - CMPQ AX, $0 - JE exit - MOVQ AX, ·ssHandle(SB) - - MOVQ ·goWaitsH(SB), CX - MOVQ ·cSetEvent(SB), AX - CALL AX - - MOVQ ·cWaitsH(SB), CX - MOVQ $4294967295, DX - MOVQ ·cWaitForSingleObject(SB), AX - CALL AX - -exit: - ADDQ $32, SP - RET - -// I do not know why, but this seems to be the only way to call -// ctlHandlerProc on Windows 7. - -// func ·servicectlhandler(ctl uint32, evtype uint32, evdata uintptr, context uintptr) uintptr { -TEXT ·servicectlhandler(SB),7,$0 - MOVQ ·ctlHandlerExProc(SB), AX - JMP AX diff --git a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_arm.s b/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_arm.s deleted file mode 100644 index 33c692a8de..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/svc/sys_arm.s +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 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. - -// +build windows - -#include "textflag.h" - -// func servicemain(argc uint32, argv **uint16) -TEXT ·servicemain(SB),NOSPLIT|NOFRAME,$0 - MOVM.DB.W [R4, R14], (R13) // push {r4, lr} - MOVW R13, R4 - BIC $0x7, R13 // alignment for ABI - - MOVW R0, ·sArgc(SB) - MOVW R1, ·sArgv(SB) - - MOVW ·sName(SB), R0 - MOVW ·ctlHandlerExProc(SB), R1 - MOVW $0, R2 - MOVW ·cRegisterServiceCtrlHandlerExW(SB), R3 - BL (R3) - CMP $0, R0 - BEQ exit - MOVW R0, ·ssHandle(SB) - - MOVW ·goWaitsH(SB), R0 - MOVW ·cSetEvent(SB), R1 - BL (R1) - - MOVW ·cWaitsH(SB), R0 - MOVW $-1, R1 - MOVW ·cWaitForSingleObject(SB), R2 - BL (R2) - -exit: - MOVW R4, R13 // free extra stack space - MOVM.IA.W (R13), [R4, R15] // pop {r4, pc} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/syscall_test.go b/src/cmd/vendor/golang.org/x/sys/windows/syscall_test.go deleted file mode 100644 index d7009e44a5..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/syscall_test.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2013 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. - -// +build windows - -package windows_test - -import ( - "syscall" - "testing" - - "golang.org/x/sys/windows" -) - -func testSetGetenv(t *testing.T, key, value string) { - err := windows.Setenv(key, value) - if err != nil { - t.Fatalf("Setenv failed to set %q: %v", value, err) - } - newvalue, found := windows.Getenv(key) - if !found { - t.Fatalf("Getenv failed to find %v variable (want value %q)", key, value) - } - if newvalue != value { - t.Fatalf("Getenv(%v) = %q; want %q", key, newvalue, value) - } -} - -func TestEnv(t *testing.T) { - testSetGetenv(t, "TESTENV", "AVALUE") - // make sure TESTENV gets set to "", not deleted - testSetGetenv(t, "TESTENV", "") -} - -func TestGetProcAddressByOrdinal(t *testing.T) { - // Attempt calling shlwapi.dll:IsOS, resolving it by ordinal, as - // suggested in - // https://msdn.microsoft.com/en-us/library/windows/desktop/bb773795.aspx - h, err := windows.LoadLibrary("shlwapi.dll") - if err != nil { - t.Fatalf("Failed to load shlwapi.dll: %s", err) - } - procIsOS, err := windows.GetProcAddressByOrdinal(h, 437) - if err != nil { - t.Fatalf("Could not find shlwapi.dll:IsOS by ordinal: %s", err) - } - const OS_NT = 1 - r, _, _ := syscall.Syscall(procIsOS, 1, OS_NT, 0, 0) - if r == 0 { - t.Error("shlwapi.dll:IsOS(OS_NT) returned 0, expected non-zero value") - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows_test.go b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows_test.go deleted file mode 100644 index 539dda2413..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2012 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 windows_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "syscall" - "testing" - - "golang.org/x/sys/windows" -) - -func TestWin32finddata(t *testing.T) { - dir, err := ioutil.TempDir("", "go-build") - if err != nil { - t.Fatalf("failed to create temp directory: %v", err) - } - defer os.RemoveAll(dir) - - path := filepath.Join(dir, "long_name.and_extension") - f, err := os.Create(path) - if err != nil { - t.Fatalf("failed to create %v: %v", path, err) - } - f.Close() - - type X struct { - fd windows.Win32finddata - got byte - pad [10]byte // to protect ourselves - - } - var want byte = 2 // it is unlikely to have this character in the filename - x := X{got: want} - - pathp, _ := windows.UTF16PtrFromString(path) - h, err := windows.FindFirstFile(pathp, &(x.fd)) - if err != nil { - t.Fatalf("FindFirstFile failed: %v", err) - } - err = windows.FindClose(h) - if err != nil { - t.Fatalf("FindClose failed: %v", err) - } - - if x.got != want { - t.Fatalf("memory corruption: want=%d got=%d", want, x.got) - } -} - -func TestFormatMessage(t *testing.T) { - dll := windows.MustLoadDLL("netevent.dll") - - const TITLE_SC_MESSAGE_BOX uint32 = 0xC0001B75 - const flags uint32 = syscall.FORMAT_MESSAGE_FROM_HMODULE | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS - buf := make([]uint16, 300) - _, err := windows.FormatMessage(flags, uintptr(dll.Handle), TITLE_SC_MESSAGE_BOX, 0, buf, nil) - if err != nil { - t.Fatalf("FormatMessage for handle=%x and errno=%x failed: %v", dll.Handle, TITLE_SC_MESSAGE_BOX, err) - } -} - -func abort(funcname string, err error) { - panic(funcname + " failed: " + err.Error()) -} - -func ExampleLoadLibrary() { - h, err := windows.LoadLibrary("kernel32.dll") - if err != nil { - abort("LoadLibrary", err) - } - defer windows.FreeLibrary(h) - proc, err := windows.GetProcAddress(h, "GetVersion") - if err != nil { - abort("GetProcAddress", err) - } - r, _, _ := syscall.Syscall(uintptr(proc), 0, 0, 0, 0) - major := byte(r) - minor := uint8(r >> 8) - build := uint16(r >> 16) - print("windows version ", major, ".", minor, " (Build ", build, ")\n") -} - -func TestTOKEN_ALL_ACCESS(t *testing.T) { - if windows.TOKEN_ALL_ACCESS != 0xF01FF { - t.Errorf("TOKEN_ALL_ACCESS = %x, want 0xF01FF", windows.TOKEN_ALL_ACCESS) - } -} diff --git a/src/cmd/vendor/golang.org/x/tools/AUTHORS b/src/cmd/vendor/golang.org/x/tools/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/src/cmd/vendor/golang.org/x/tools/CONTRIBUTORS b/src/cmd/vendor/golang.org/x/tools/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go index 21baa02a8d..4d8a6e5e7d 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/analysis.go @@ -87,6 +87,7 @@ type Pass struct { OtherFiles []string // names of non-Go files of this package Pkg *types.Package // type information about the package TypesInfo *types.Info // type information about the syntax trees + TypesSizes types.Sizes // function for computing sizes of types // Report reports a Diagnostic, a finding about a specific location // in the analyzed source code such as a potential mistake. diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go index f925849ab5..2d44b0458a 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/doc.go @@ -246,7 +246,7 @@ An Analyzer that uses facts must declare their types: var Analyzer = &analysis.Analyzer{ Name: "printf", - FactTypes: []reflect.Type{reflect.TypeOf(new(isWrapper))}, + FactTypes: []analysis.Fact{new(isWrapper)}, ... } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go index 729ac3b417..a03a185fc0 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/flags.go @@ -152,12 +152,13 @@ func printFlags() { // addVersionFlag registers a -V flag that, if set, // prints the executable version and exits 0. // -// It is a variable not a function to permit easy -// overriding in the copy vendored in $GOROOT/src/cmd/vet: -// -// func init() { addVersionFlag = objabi.AddVersionFlag } -var addVersionFlag = func() { - flag.Var(versionFlag{}, "V", "print version and exit") +// If the -V flag already exists — for example, because it was already +// registered by a call to cmd/internal/objabi.AddVersionFlag — then +// addVersionFlag does nothing. +func addVersionFlag() { + if flag.Lookup("V") == nil { + flag.Var(versionFlag{}, "V", "print version and exit") + } } // versionFlag minimally complies with the -V protocol required by "go vet". diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go deleted file mode 100644 index 8f9741055c..0000000000 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags/patch.go +++ /dev/null @@ -1,7 +0,0 @@ -package analysisflags - -import "cmd/internal/objabi" - -// This additional file changes the behavior of the vendored code. - -func init() { addVersionFlag = objabi.AddVersionFlag } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go index dce1ef7bd5..6403d7783a 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl/asmdecl.go @@ -114,7 +114,8 @@ func init() { // library we cannot assume types.SizesFor is consistent with arches. // For now, assume 64-bit norms and print a warning. // But this warning should really be deferred until we attempt to use - // arch, which is very unlikely. + // arch, which is very unlikely. Better would be + // to defer size computation until we have Pass.TypesSizes. arch.sizes = types.SizesFor("gc", "amd64") log.Printf("unknown architecture %s", arch.name) } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go index 993f1ce3c4..1e4fac8595 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall/cgocall.go @@ -9,7 +9,6 @@ package cgocall import ( "fmt" "go/ast" - "go/build" "go/format" "go/parser" "go/token" @@ -45,7 +44,7 @@ func run(pass *analysis.Pass) (interface{}, error) { return nil, nil // doesn't use cgo } - cgofiles, info, err := typeCheckCgoSourceFiles(pass.Fset, pass.Pkg, pass.Files, pass.TypesInfo) + cgofiles, info, err := typeCheckCgoSourceFiles(pass.Fset, pass.Pkg, pass.Files, pass.TypesInfo, pass.TypesSizes) if err != nil { return nil, err } @@ -171,7 +170,7 @@ func checkCgo(fset *token.FileSet, f *ast.File, info *types.Info, reportf func(t // limited ourselves here to preserving function bodies and initializer // expressions since that is all that the cgocall analyzer needs. // -func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*ast.File, info *types.Info) ([]*ast.File, *types.Info, error) { +func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*ast.File, info *types.Info, sizes types.Sizes) ([]*ast.File, *types.Info, error) { const thispkg = "·this·" // Which files are cgo files? @@ -269,8 +268,7 @@ func typeCheckCgoSourceFiles(fset *token.FileSet, pkg *types.Package, files []*a Importer: importerFunc(func(path string) (*types.Package, error) { return importMap[path], nil }), - // TODO(adonovan): Sizes should probably be provided by analysis.Pass. - Sizes: types.SizesFor("gc", build.Default.GOARCH), + Sizes: sizes, Error: func(error) {}, // ignore errors (e.g. unused import) } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go index 9cca7781d0..2abe7c6d51 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/composite/composite.go @@ -21,7 +21,16 @@ const Doc = `check for unkeyed composite literals This analyzer reports a diagnostic for composite literals of struct types imported from another package that do not use the field-keyed syntax. Such literals are fragile because the addition of a new field -(even if unexported) to the struct will cause compilation to fail.` +(even if unexported) to the struct will cause compilation to fail. + +As an example, + + err = &net.DNSConfigError{err} + +should be replaced by: + + err = &net.DNSConfigError{Err: err} +` var Analyzer = &analysis.Analyzer{ Name: "composites", diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go index bd06549984..8213f63313 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go @@ -8,7 +8,11 @@ // // Example of use in another analysis: // -// import "golang.org/x/tools/go/analysis/passes/inspect" +// import ( +// "golang.org/x/tools/go/analysis" +// "golang.org/x/tools/go/analysis/passes/inspect" +// "golang.org/x/tools/go/ast/inspector" +// ) // // var Analyzer = &analysis.Analyzer{ // ... diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/pkgfact/pkgfact.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/pkgfact/pkgfact.go deleted file mode 100644 index e053086732..0000000000 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/pkgfact/pkgfact.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2018 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. - -// The pkgfact package is a demonstration and test of the package fact -// mechanism. -// -// The output of the pkgfact analysis is a set of key/values pairs -// gathered from the analyzed package and its imported dependencies. -// Each key/value pair comes from a top-level constant declaration -// whose name starts and ends with "_". For example: -// -// package p -// -// const _greeting_ = "hello" -// const _audience_ = "world" -// -// the pkgfact analysis output for package p would be: -// -// {"greeting": "hello", "audience": "world"}. -// -// In addition, the analysis reports a diagnostic at each import -// showing which key/value pairs it contributes. -package pkgfact - -import ( - "fmt" - "go/ast" - "go/token" - "go/types" - "reflect" - "sort" - "strings" - - "golang.org/x/tools/go/analysis" -) - -var Analyzer = &analysis.Analyzer{ - Name: "pkgfact", - Doc: "gather name/value pairs from constant declarations", - Run: run, - FactTypes: []analysis.Fact{new(pairsFact)}, - ResultType: reflect.TypeOf(map[string]string{}), -} - -// A pairsFact is a package-level fact that records -// an set of key=value strings accumulated from constant -// declarations in this package and its dependencies. -// Elements are ordered by keys, which are unique. -type pairsFact []string - -func (f *pairsFact) AFact() {} -func (f *pairsFact) String() string { return "pairs(" + strings.Join(*f, ", ") + ")" } - -func run(pass *analysis.Pass) (interface{}, error) { - result := make(map[string]string) - - // At each import, print the fact from the imported - // package and accumulate its information into the result. - // (Warning: accumulation leads to quadratic growth of work.) - doImport := func(spec *ast.ImportSpec) { - pkg := imported(pass.TypesInfo, spec) - var fact pairsFact - if pass.ImportPackageFact(pkg, &fact) { - for _, pair := range fact { - eq := strings.IndexByte(pair, '=') - result[pair[:eq]] = pair[1+eq:] - } - pass.Reportf(spec.Pos(), "%s", strings.Join(fact, " ")) - } - } - - // At each "const _name_ = value", add a fact into env. - doConst := func(spec *ast.ValueSpec) { - if len(spec.Names) == len(spec.Values) { - for i := range spec.Names { - name := spec.Names[i].Name - if strings.HasPrefix(name, "_") && strings.HasSuffix(name, "_") { - - if key := strings.Trim(name, "_"); key != "" { - value := pass.TypesInfo.Types[spec.Values[i]].Value.String() - result[key] = value - } - } - } - } - } - - for _, f := range pass.Files { - for _, decl := range f.Decls { - if decl, ok := decl.(*ast.GenDecl); ok { - for _, spec := range decl.Specs { - switch decl.Tok { - case token.IMPORT: - doImport(spec.(*ast.ImportSpec)) - case token.CONST: - doConst(spec.(*ast.ValueSpec)) - } - } - } - } - } - - // Sort/deduplicate the result and save it as a package fact. - keys := make([]string, 0, len(result)) - for key := range result { - keys = append(keys, key) - } - sort.Strings(keys) - var fact pairsFact - for _, key := range keys { - fact = append(fact, fmt.Sprintf("%s=%s", key, result[key])) - } - if len(fact) > 0 { - pass.ExportPackageFact(&fact) - } - - return result, nil -} - -func imported(info *types.Info, spec *ast.ImportSpec) *types.Package { - obj, ok := info.Implicits[spec] - if !ok { - obj = info.Defs[spec.Name] // renaming import - } - return obj.(*types.PkgName).Imported() -} diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go index 8f657b1bfa..d4697eac0c 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/printf.go @@ -453,15 +453,23 @@ func printfNameAndKind(pass *analysis.Pass, call *ast.CallExpr) (fn *types.Func, } // isFormatter reports whether t satisfies fmt.Formatter. -// Unlike fmt.Stringer, it's impossible to satisfy fmt.Formatter without importing fmt. -func isFormatter(pass *analysis.Pass, t types.Type) bool { - for _, imp := range pass.Pkg.Imports() { - if imp.Path() == "fmt" { - formatter := imp.Scope().Lookup("Formatter").Type().Underlying().(*types.Interface) - return types.Implements(t, formatter) - } +// The only interface method to look for is "Format(State, rune)". +func isFormatter(typ types.Type) bool { + obj, _, _ := types.LookupFieldOrMethod(typ, false, nil, "Format") + fn, ok := obj.(*types.Func) + if !ok { + return false } - return false + sig := fn.Type().(*types.Signature) + return sig.Params().Len() == 2 && + sig.Results().Len() == 0 && + isNamed(sig.Params().At(0).Type(), "fmt", "State") && + types.Identical(sig.Params().At(1).Type(), types.Typ[types.Rune]) +} + +func isNamed(T types.Type, pkgpath, name string) bool { + named, ok := T.(*types.Named) + return ok && named.Obj().Pkg().Path() == pkgpath && named.Obj().Name() == name } // formatState holds the parsed representation of a printf directive such as "%3.*[4]d". @@ -754,7 +762,7 @@ func okPrintfArg(pass *analysis.Pass, call *ast.CallExpr, state *formatState) (o formatter := false if state.argNum < len(call.Args) { if tv, ok := pass.TypesInfo.Types[call.Args[state.argNum]]; ok { - formatter = isFormatter(pass, tv.Type) + formatter = isFormatter(tv.Type) } } @@ -832,7 +840,7 @@ func recursiveStringer(pass *analysis.Pass, e ast.Expr) bool { typ := pass.TypesInfo.Types[e].Type // It's unlikely to be a recursive stringer if it has a Format method. - if isFormatter(pass, typ) { + if isFormatter(typ) { return false } diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go index e8810464cd..12286fd5df 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/printf/types.go @@ -2,7 +2,6 @@ package printf import ( "go/ast" - "go/build" "go/types" "golang.org/x/tools/go/analysis" @@ -39,7 +38,7 @@ func matchArgTypeInternal(pass *analysis.Pass, t printfArgType, typ types.Type, } } // If the type implements fmt.Formatter, we have nothing to check. - if isFormatter(pass, typ) { + if isFormatter(typ) { return true } // If we can use a string, might arg (dynamically) implement the Stringer or Error interface? @@ -235,5 +234,3 @@ func matchStructArgType(pass *analysis.Pass, t printfArgType, typ *types.Struct, } return true } - -var archSizes = types.SizesFor("gc", build.Default.GOARCH) diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go index 56b150b2b1..39f54573c9 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/shift/shift.go @@ -12,10 +12,8 @@ package shift import ( "go/ast" - "go/build" "go/constant" "go/token" - "go/types" "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/inspect" @@ -93,36 +91,9 @@ func checkLongShift(pass *analysis.Pass, node ast.Node, x, y ast.Expr) { if t == nil { return } - b, ok := t.Underlying().(*types.Basic) - if !ok { - return - } - var size int64 - switch b.Kind() { - case types.Uint8, types.Int8: - size = 8 - case types.Uint16, types.Int16: - size = 16 - case types.Uint32, types.Int32: - size = 32 - case types.Uint64, types.Int64: - size = 64 - case types.Int, types.Uint: - size = uintBitSize - case types.Uintptr: - size = uintptrBitSize - default: - return - } + size := 8 * pass.TypesSizes.Sizeof(t) if amt >= size { ident := analysisutil.Format(pass.Fset, x) pass.Reportf(node.Pos(), "%s (%d bits) too small for shift of %d", ident, size, amt) } } - -var ( - uintBitSize = 8 * archSizes.Sizeof(types.Typ[types.Uint]) - uintptrBitSize = 8 * archSizes.Sizeof(types.Typ[types.Uintptr]) -) - -var archSizes = types.SizesFor("gc", build.Default.GOARCH) diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go index 76dabc28b9..ba2e66fed2 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/unitchecker.go @@ -329,6 +329,7 @@ func run(fset *token.FileSet, cfg *Config, analyzers []*analysis.Analyzer) ([]re OtherFiles: cfg.NonGoFiles, Pkg: pkg, TypesInfo: info, + TypesSizes: tc.Sizes, ResultOf: inputs, Report: func(d analysis.Diagnostic) { act.diagnostics = append(act.diagnostics, d) }, ImportObjectFact: facts.ImportObjectFact, diff --git a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go index db88a95109..ddbdd3f08f 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go +++ b/src/cmd/vendor/golang.org/x/tools/go/ast/inspector/inspector.go @@ -14,7 +14,7 @@ // Experiments suggest the inspector's traversals are about 2.5x faster // than ast.Inspect, but it may take around 5 traversals for this // benefit to amortize the inspector's construction cost. -// If efficiency is the primary concern, do not use use Inspector for +// If efficiency is the primary concern, do not use Inspector for // one-off traversals. package inspector diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt new file mode 100644 index 0000000000..916a8ca9b6 --- /dev/null +++ b/src/cmd/vendor/modules.txt @@ -0,0 +1,62 @@ +# github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 +github.com/google/pprof/driver +github.com/google/pprof/profile +github.com/google/pprof/internal/driver +github.com/google/pprof/internal/plugin +github.com/google/pprof/internal/binutils +github.com/google/pprof/internal/graph +github.com/google/pprof/internal/measurement +github.com/google/pprof/internal/report +github.com/google/pprof/internal/symbolizer +github.com/google/pprof/internal/transport +github.com/google/pprof/third_party/d3 +github.com/google/pprof/third_party/d3flamegraph +github.com/google/pprof/third_party/svgpan +github.com/google/pprof/internal/elfexec +github.com/google/pprof/internal/symbolz +# github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 +github.com/ianlancetaylor/demangle +# golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 +golang.org/x/arch/arm/armasm +golang.org/x/arch/arm64/arm64asm +golang.org/x/arch/ppc64/ppc64asm +golang.org/x/arch/x86/x86asm +# golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 +golang.org/x/crypto/ssh/terminal +# golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 +golang.org/x/sys/unix +golang.org/x/sys/windows +# golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 +golang.org/x/tools/go/analysis/passes/asmdecl +golang.org/x/tools/go/analysis/passes/assign +golang.org/x/tools/go/analysis/passes/atomic +golang.org/x/tools/go/analysis/passes/bools +golang.org/x/tools/go/analysis/passes/buildtag +golang.org/x/tools/go/analysis/passes/cgocall +golang.org/x/tools/go/analysis/passes/composite +golang.org/x/tools/go/analysis/passes/copylock +golang.org/x/tools/go/analysis/passes/httpresponse +golang.org/x/tools/go/analysis/passes/loopclosure +golang.org/x/tools/go/analysis/passes/lostcancel +golang.org/x/tools/go/analysis/passes/nilfunc +golang.org/x/tools/go/analysis/passes/printf +golang.org/x/tools/go/analysis/passes/shift +golang.org/x/tools/go/analysis/passes/stdmethods +golang.org/x/tools/go/analysis/passes/structtag +golang.org/x/tools/go/analysis/passes/tests +golang.org/x/tools/go/analysis/passes/unmarshal +golang.org/x/tools/go/analysis/passes/unreachable +golang.org/x/tools/go/analysis/passes/unsafeptr +golang.org/x/tools/go/analysis/passes/unusedresult +golang.org/x/tools/go/analysis/unitchecker +golang.org/x/tools/go/analysis +golang.org/x/tools/go/analysis/passes/internal/analysisutil +golang.org/x/tools/go/analysis/passes/inspect +golang.org/x/tools/go/ast/inspector +golang.org/x/tools/go/analysis/passes/ctrlflow +golang.org/x/tools/go/cfg +golang.org/x/tools/go/types/typeutil +golang.org/x/tools/go/analysis/internal/analysisflags +golang.org/x/tools/go/analysis/internal/facts +golang.org/x/tools/go/ast/astutil +golang.org/x/tools/go/types/objectpath diff --git a/src/cmd/vendor/update-xtools.sh b/src/cmd/vendor/update-xtools.sh deleted file mode 100755 index 8cf5ac165d..0000000000 --- a/src/cmd/vendor/update-xtools.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh -# -# update-xtools.sh: idempotently update the vendored -# copy of the x/tools repository used by cmd/vet. - -set -u - -analysis=$(go list -f {{.Dir}} golang.org/x/tools/go/analysis) || - { echo "Add golang.org/x/tools to your GOPATH"; exit 1; } >&2 -xtools=$(dirname $(dirname $analysis)) - -vendor=$(dirname $0) - -# Find the x/tools packages directly imported by cmd/vet. -go list -f '{{range $k, $v := .ImportMap}}{{$k}} {{end}}' cmd/vet | - grep golang.org/x/tools | - # Vendor their transitive closure of dependencies. - xargs go list -f '{{.ImportPath}} {{.Dir}}' -deps | - grep golang.org/x/tools | - while read path dir - do - mkdir -p $vendor/$path - cp $dir/* -t $vendor/$path 2>/dev/null # ignore errors from subdirectories - rm -f $vendor/$path/*_test.go - git add $vendor/$path - done - -echo "Copied $xtools@$(cd $analysis && git rev-parse --short HEAD) to $vendor" >&2 - -go build -o /dev/null cmd/vet || - { echo "Failed to build cmd/vet"; exit 1; } >&2 diff --git a/src/cmd/vendor/vendor.json b/src/cmd/vendor/vendor.json deleted file mode 100644 index 93b94aef12..0000000000 --- a/src/cmd/vendor/vendor.json +++ /dev/null @@ -1,385 +0,0 @@ -{ - "comment": "", - "ignore": "", - "package": [ - { - "checksumSHA1": "tvvU1lZut+OvO+7NOIG3DXojs48=", - "path": "github.com/google/pprof/driver", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "LDRBxfypG0ZI3Nl/mfEIhrU/ae4=", - "path": "github.com/google/pprof/internal/binutils", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "mViiOBlz5l3mIlQE1SxY1IveYBU=", - "path": "github.com/google/pprof/internal/driver", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "lxGP2FcHBwAiYHup+BNMBis136o=", - "path": "github.com/google/pprof/internal/elfexec", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "ejpBQbeYO4XPI6UtiPe4SVaMQqE=", - "path": "github.com/google/pprof/internal/graph", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "QPWfnT5pEU2jOOb8l8hpiFzQJ7Q=", - "path": "github.com/google/pprof/internal/measurement", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "wMdOybuEcd10antxdOUDUugjmOs=", - "path": "github.com/google/pprof/internal/plugin", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "LmDglu/S6vFmgqkxubKDZemFHaY=", - "path": "github.com/google/pprof/internal/proftest", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "ijtIORD3B7fg+VwzjmXT/33zahM=", - "path": "github.com/google/pprof/internal/report", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "Jjx/GbK8ftMDp0uoqfjTncz0TaQ=", - "path": "github.com/google/pprof/internal/symbolizer", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "T0WqnYtJKNJYW3qYH15E1HFlmE0=", - "path": "github.com/google/pprof/internal/symbolz", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "qDNZM9DiplY70UFnEiP9NcsVplg=", - "path": "github.com/google/pprof/internal/transport", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "yFlyOuu4KgPEjXo1rIvl7Sj32Oo=", - "path": "github.com/google/pprof/profile", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "xmqfYca88U2c/I4642r3ps9uIRg=", - "path": "github.com/google/pprof/third_party/d3", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "LzWzD56Trzpq+0hLR00Yw5Gpepw=", - "path": "github.com/google/pprof/third_party/d3flamegraph", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "738v1E0v0qRW6oAKdCpBEtyVNnY=", - "path": "github.com/google/pprof/third_party/svgpan", - "revision": "fde099a545debf81bf2a96a0ec13d7da2c2a6663", - "revisionTime": "2018-10-26T15:26:56Z" - }, - { - "checksumSHA1": "J5yI4NzHbondzccJmummyJR/kQQ=", - "path": "github.com/ianlancetaylor/demangle", - "revision": "fc6590592b44fedfff586c5d94647c090fbd6bac", - "revisionTime": "2018-05-24T22:59:00Z" - }, - { - "path": "github.com/x/sys/unix", - "revision": "" - }, - { - "path": "golang.org/x/arch/arm/armasm", - "revision": "5099b4b992f2813e39cfe2623c6f638718bd0fc6", - "revisionTime": "2018-04-06T10:28:20Z" - }, - { - "path": "golang.org/x/arch/arm64/arm64asm", - "revision": "9111c30535f37e70dcaf5956d34b03233f90f3b6", - "revisionTime": "2018-03-13T04:07:09Z" - }, - { - "path": "golang.org/x/arch/ppc64/ppc64asm", - "revision": "5a4828bb704534b8a2fa09c791c67d0fb372f472", - "revisionTime": "2018-12-03T22:54:21Z" - }, - { - "path": "golang.org/x/arch/x86/x86asm", - "revision": "5099b4b992f2813e39cfe2623c6f638718bd0fc6", - "revisionTime": "2018-04-06T10:28:20Z" - }, - { - "checksumSHA1": "4nPV7YdyHiVRSWaxpy6jHt/MTq4=", - "path": "golang.org/x/crypto/ssh/terminal", - "revision": "159ae71589f303f9fbfd7528413e0fe944b9c1cb", - "revisionTime": "2018-05-24T11:38:20Z" - }, - { - "checksumSHA1": "/4HmlX92To16u5s2bryHkTS4+CM=", - "path": "golang.org/x/sys/unix", - "revision": "a34e9553db1e492c9a76e60db2296ae7e5fbb772", - "revisionTime": "2019-02-28T12:11:59Z" - }, - { - "checksumSHA1": "/G/UvW6DnpLWoplv0wkB3JunvXk=", - "path": "golang.org/x/sys/windows", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "yEg3f1MGwuyDh5NrNEGkWKlTyqY=", - "path": "golang.org/x/sys/windows/registry", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "sL1Y17u+ri3uepsUZOZ4uopiPEg=", - "path": "golang.org/x/sys/windows/svc", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "e9KJPWrdqg5PMkbE2w60Io8rY4M=", - "path": "golang.org/x/sys/windows/svc/debug", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "dz53pQfqAnXG8HdJj+nazXN9YRw=", - "path": "golang.org/x/sys/windows/svc/eventlog", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "vV6Mr/b+1GaHiHLnq2zEejQJVec=", - "path": "golang.org/x/sys/windows/svc/mgr", - "revision": "cc5685c2db1239775905f3911f0067c0fa74762f", - "revisionTime": "2019-02-24T20:24:49Z" - }, - { - "checksumSHA1": "witNkDO7koGO7+oxpBMZBvoxz3c=", - "path": "golang.org/x/tools/go/analysis", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "NPcubwbqmr2yGfGztLqizwbXrwM=", - "path": "golang.org/x/tools/go/analysis/cmd/vet-lite", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "kWG+JiD2mA+2pnSeYJrKLHHgT+s=", - "path": "golang.org/x/tools/go/analysis/internal/analysisflags", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "c4FY3+yRC2GHON66hIU254nQxA8=", - "path": "golang.org/x/tools/go/analysis/internal/facts", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "Zuz7FbEMWtUNCKTA+ofVkkDl1Ic=", - "path": "golang.org/x/tools/go/analysis/internal/unitchecker", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "fxi2KL0typcqGp87Qa9CxSp89Sk=", - "path": "golang.org/x/tools/go/analysis/passes/asmdecl", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "AK5vKjJmQD1u/6v/s107upAF03w=", - "path": "golang.org/x/tools/go/analysis/passes/assign", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "qRQNlOhRmTPecqsjJMf3Rxd7M1g=", - "path": "golang.org/x/tools/go/analysis/passes/atomic", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "zhnbma06ExmGYTu5QaGAi5+QciY=", - "path": "golang.org/x/tools/go/analysis/passes/bools", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "HWcvlzqG20E9BaG4/j3u9tnUyZ4=", - "path": "golang.org/x/tools/go/analysis/passes/buildtag", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "ekVwfAw224CT/eBihMCzAOzIHiE=", - "path": "golang.org/x/tools/go/analysis/passes/cgocall", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "dwtQdPi0Jb9BYVr0Gynh5NpCSz8=", - "path": "golang.org/x/tools/go/analysis/passes/composite", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "6M8xb//gcLk3dSpRq6/fb/8Wvqk=", - "path": "golang.org/x/tools/go/analysis/passes/copylock", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "DPQnIktTEV7cNBNDRIpg0OK6v9Q=", - "path": "golang.org/x/tools/go/analysis/passes/ctrlflow", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "GJjZZhXYqMoGmym/2DpExqHP+Cw=", - "path": "golang.org/x/tools/go/analysis/passes/httpresponse", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "Q76YV1xYtBCBsZk7uKXqih7iHL4=", - "path": "golang.org/x/tools/go/analysis/passes/inspect", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "Y7NBmaqiGnVWf3yn16cwbWmgUhI=", - "path": "golang.org/x/tools/go/analysis/passes/internal/analysisutil", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "Fjj6sV+qmJwvxGt/i8fLIma9Lzs=", - "path": "golang.org/x/tools/go/analysis/passes/loopclosure", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "VZE2qx/m2esvfEreS0RCaVoWYhc=", - "path": "golang.org/x/tools/go/analysis/passes/lostcancel", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "xf9nMwSbFWJXDC9W+Gnus+uU0Nw=", - "path": "golang.org/x/tools/go/analysis/passes/nilfunc", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "PKByrfYKilYhkhAE01z5Om0Tr+w=", - "path": "golang.org/x/tools/go/analysis/passes/pkgfact", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "BrlVsK8u6SPMyvoWdkwS4IAXVRI=", - "path": "golang.org/x/tools/go/analysis/passes/printf", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "3w9Q99Mxrf8qEU+FH7lSyy5hwc4=", - "path": "golang.org/x/tools/go/analysis/passes/shift", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "oeR6BB6OmfoYReHyNLEX9BbF1cI=", - "path": "golang.org/x/tools/go/analysis/passes/stdmethods", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "rPSH7/W3vsomdmSIgdEDrzaCQyk=", - "path": "golang.org/x/tools/go/analysis/passes/structtag", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "yHrglPUc3Ia12nwO0l/I0ArT3to=", - "path": "golang.org/x/tools/go/analysis/passes/tests", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "en0VsP2OoNX40F/bNfbO6geSgi4=", - "path": "golang.org/x/tools/go/analysis/passes/unreachable", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "641akvyeQUx5MqoHiyKwRps4vEg=", - "path": "golang.org/x/tools/go/analysis/passes/unsafeptr", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "cm27h0jINv4jlgiHMn7q572FXTY=", - "path": "golang.org/x/tools/go/analysis/passes/unusedresult", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "/bQnex6L/nyDuZCIIRbM6Is/IRY=", - "path": "golang.org/x/tools/go/ast/astutil", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "qnZLWirp4hAxafiKvH+nnmgGf8Q=", - "path": "golang.org/x/tools/go/ast/inspector", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "+g97ZSLGNNbqfBzpYje8fA5PvXs=", - "path": "golang.org/x/tools/go/cfg", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "JWIR0GVqbDYhTW9mh4zpY/ve6Ro=", - "path": "golang.org/x/tools/go/types/objectpath", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - }, - { - "checksumSHA1": "kyVWOWK3PkDKCtXRJffE60MrfOo=", - "path": "golang.org/x/tools/go/types/typeutil", - "revision": "c76e1ad98a635a7c069d7ab43d31fcf38381facc", - "revisionTime": "2018-11-05T19:48:08Z" - } - ], - "rootPath": "/cmd" -} diff --git a/src/cmd/vet/main.go b/src/cmd/vet/main.go index 4ec174b3cd..b845d95040 100644 --- a/src/cmd/vet/main.go +++ b/src/cmd/vet/main.go @@ -1,6 +1,8 @@ package main import ( + "cmd/internal/objabi" + "golang.org/x/tools/go/analysis/unitchecker" "golang.org/x/tools/go/analysis/passes/asmdecl" @@ -27,6 +29,8 @@ import ( ) func main() { + objabi.AddVersionFlag() + unitchecker.Main( asmdecl.Analyzer, assign.Analyzer, -- GitLab From 0fc89a72edc2c73651f7f6841b1146af723f517f Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 20 Feb 2019 18:25:37 -0500 Subject: [PATCH 0394/1679] cmd,std: add go.mod files Updates #30241 Updates #30228 Change-Id: Ida0fe8263bf44e0498fed2048e22283ba5716835 Reviewed-on: https://go-review.googlesource.com/c/go/+/164622 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go.mod | 12 ++++++++++++ src/cmd/go/testdata/script/mod_list_std.txt | 4 ++-- src/go.mod | 3 +++ src/make.bash | 2 +- src/make.bat | 1 + src/make.rc | 2 +- 6 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 src/cmd/go.mod create mode 100644 src/go.mod diff --git a/src/cmd/go.mod b/src/cmd/go.mod new file mode 100644 index 0000000000..dd5dccd826 --- /dev/null +++ b/src/cmd/go.mod @@ -0,0 +1,12 @@ +module cmd + +go 1.12 + +require ( + github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 + github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 // indirect + golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 + golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 + golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 // indirect + golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 +) diff --git a/src/cmd/go/testdata/script/mod_list_std.txt b/src/cmd/go/testdata/script/mod_list_std.txt index 4af0898ff7..15642cd0b7 100644 --- a/src/cmd/go/testdata/script/mod_list_std.txt +++ b/src/cmd/go/testdata/script/mod_list_std.txt @@ -24,11 +24,11 @@ stdout ^internal/x cp stdout $WORK/listdot.txt go list std -stdout ^internal/x # TODO +stdout ^internal/x # TODO: cmp stdout $WORK/listdot.txt go list all -! stdout ^internal/x # TODO: this will exist when src/go.mod is added +stdout ^internal/x ! stdout ^std/ diff --git a/src/go.mod b/src/go.mod new file mode 100644 index 0000000000..174b3fe5f1 --- /dev/null +++ b/src/go.mod @@ -0,0 +1,3 @@ +module std + +go 1.12 diff --git a/src/make.bash b/src/make.bash index b0e33cf6a4..2883f47c12 100755 --- a/src/make.bash +++ b/src/make.bash @@ -176,7 +176,7 @@ if [ "$GOROOT_BOOTSTRAP" = "$GOROOT" ]; then exit 1 fi rm -f cmd/dist/dist -GOROOT="$GOROOT_BOOTSTRAP" GOOS="" GOARCH="" "$GOROOT_BOOTSTRAP/bin/go" build -o cmd/dist/dist ./cmd/dist +GOROOT="$GOROOT_BOOTSTRAP" GOOS="" GOARCH="" GO111MODULE=off "$GOROOT_BOOTSTRAP/bin/go" build -o cmd/dist/dist ./cmd/dist # -e doesn't propagate out of eval, so check success by hand. eval $(./cmd/dist/dist env -p || echo FAIL=true) diff --git a/src/make.bat b/src/make.bat index 69275e2256..d22cb30ab2 100644 --- a/src/make.bat +++ b/src/make.bat @@ -78,6 +78,7 @@ set GOROOT=%GOROOT_BOOTSTRAP% set GOOS= set GOARCH= set GOBIN= +set GO111MODULE=off "%GOROOT_BOOTSTRAP%\bin\go.exe" build -o cmd\dist\dist.exe .\cmd\dist endlocal if errorlevel 1 goto fail diff --git a/src/make.rc b/src/make.rc index 5f888c19fd..f055ff8e14 100755 --- a/src/make.rc +++ b/src/make.rc @@ -76,7 +76,7 @@ if(~ $GOROOT_BOOTSTRAP $GOROOT){ echo 'Building Go cmd/dist using '^$GOROOT_BOOTSTRAP if(~ $#vflag 1) echo cmd/dist -GOROOT=$GOROOT_BOOTSTRAP GOOS='' GOARCH='' $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist +GOROOT=$GOROOT_BOOTSTRAP GOOS='' GOARCH='' GO111MODULE=off $GOROOT_BOOTSTRAP/bin/go build -o cmd/dist/dist ./cmd/dist eval `{./cmd/dist/dist env -9} if(~ $#vflag 1) -- GitLab From c5cf6624076a644906aa7ec5c91c4e01ccd375d3 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 1 Mar 2019 10:12:30 -0500 Subject: [PATCH 0395/1679] all: move internal/x to vendor/golang.org/x and revendor using 'go mod vendor' This also updates the vendored-in versions of several packages: 'go mod vendor' selects a consistent version of each module, but we had previously vendored an ad-hoc selection of packages. Notably, x/crypto/hkdf was previously vendored in at a much newer commit than the rest of x/crypto. Bringing the rest of x/crypto up to that commit introduced an import of golang.org/x/sys/cpu, which broke the js/wasm build, requiring an upgrade of x/sys to pick up CL 165749. Updates #30228 Updates #30241 Updates #25822 Change-Id: I5b3dbc232b7e6a048a158cbd8d36137af1efb711 Reviewed-on: https://go-review.googlesource.com/c/go/+/164623 Reviewed-by: Filippo Valsorda --- src/cmd/dist/build.go | 15 + src/cmd/dist/test.go | 3 +- .../go/testdata/script/gopath_std_vendor.txt | 4 +- src/cmd/go/testdata/script/list_std.txt | 2 +- src/cmd/go/testdata/script/mod_list_std.txt | 12 +- src/cmd/go/testdata/script/mod_std_vendor.txt | 17 +- src/cmd/go/testdata/script/std_vendor.txt | 6 +- src/cmd/vet/all/whitelist/s390x.txt | 7 + src/crypto/tls/cipher_suites.go | 2 +- src/crypto/tls/handshake_messages.go | 2 +- src/crypto/tls/key_schedule.go | 6 +- src/crypto/tls/ticket.go | 2 +- src/crypto/x509/x509.go | 4 +- src/go.mod | 7 + src/go.sum | 8 + src/go/build/deps_test.go | 30 +- .../internal/srcimporter/srcimporter_test.go | 10 +- .../chacha20poly1305/chacha20poly1305_test.go | 182 - .../chacha20poly1305_vectors_test.go | 339 -- src/internal/x/crypto/cryptobyte/asn1_test.go | 333 -- .../x/crypto/cryptobyte/cryptobyte_test.go | 428 --- .../x/crypto/cryptobyte/example_test.go | 154 - .../x/crypto/curve25519/curve25519_test.go | 39 - src/internal/x/crypto/hkdf/example_test.go | 56 - src/internal/x/crypto/hkdf/hkdf_test.go | 449 --- .../x/crypto/internal/chacha20/chacha_test.go | 188 -- .../crypto/internal/chacha20/vectors_test.go | 578 ---- .../x/crypto/poly1305/poly1305_test.go | 132 - .../x/crypto/poly1305/vectors_test.go | 2943 ----------------- src/internal/x/fiximports.bash | 6 - .../x/net/dns/dnsmessage/example_test.go | 132 - .../x/net/dns/dnsmessage/message_test.go | 1137 ------- .../x/net/http/httpguts/httplex_test.go | 119 - .../x/net/http/httpproxy/export_test.go | 13 - .../x/net/http/httpproxy/proxy_test.go | 351 -- src/internal/x/net/http2/hpack/encode_test.go | 386 --- src/internal/x/net/http2/hpack/hpack_test.go | 770 ----- src/internal/x/net/http2/hpack/tables_test.go | 214 -- src/internal/x/net/idna/punycode_test.go | 198 -- .../x/net/internal/nettest/helper_bsd.go | 53 - .../x/net/internal/nettest/helper_nobsd.go | 15 - .../x/net/internal/nettest/helper_posix.go | 31 - .../x/net/internal/nettest/helper_stub.go | 32 - .../x/net/internal/nettest/helper_unix.go | 29 - .../x/net/internal/nettest/helper_windows.go | 42 - .../x/net/internal/nettest/interface.go | 94 - src/internal/x/net/internal/nettest/rlimit.go | 11 - src/internal/x/net/internal/nettest/stack.go | 152 - src/internal/x/net/lif/address_test.go | 123 - src/internal/x/net/lif/link_test.go | 63 - src/internal/x/net/nettest/conntest_test.go | 76 - .../x/net/route/address_darwin_test.go | 63 - src/internal/x/net/route/address_test.go | 103 - .../x/net/route/message_darwin_test.go | 34 - .../x/net/route/message_freebsd_test.go | 88 - src/internal/x/net/route/message_test.go | 239 -- src/internal/x/net/route/route_test.go | 390 --- src/internal/x/text/secure/doc.go | 8 - .../x/text/transform/examples_test.go | 39 - .../x/text/unicode/bidi/example_test.go | 185 -- src/internal/x/text/unicode/doc.go | 10 - .../x/text/unicode/norm/example_iter_test.go | 84 - .../x/text/unicode/norm/example_test.go | 29 - src/net/dnsclient.go | 2 +- src/net/dnsclient_unix.go | 2 +- src/net/dnsclient_unix_test.go | 2 +- src/net/http/h2_bundle.go | 6 +- src/net/http/http.go | 2 +- src/net/http/httptest/recorder.go | 2 +- src/net/http/httputil/reverseproxy.go | 2 +- src/net/http/request.go | 2 +- src/net/http/response.go | 2 +- src/net/http/server.go | 2 +- src/net/http/transfer.go | 2 +- src/net/http/transport.go | 4 +- src/net/http/transport_test.go | 2 +- src/net/interface_bsd.go | 2 +- src/net/interface_bsdvar.go | 2 +- src/net/interface_darwin.go | 2 +- src/net/interface_freebsd.go | 2 +- src/net/interface_solaris.go | 2 +- src/net/lookup_unix.go | 2 +- src/net/pipe_test.go | 2 +- src/run.bash | 5 +- src/vendor/golang.org/x/crypto/AUTHORS | 3 + src/vendor/golang.org/x/crypto/CONTRIBUTORS | 3 + src/vendor/golang.org/x/crypto/LICENSE | 27 + src/vendor/golang.org/x/crypto/PATENTS | 22 + .../chacha20poly1305/chacha20poly1305.go | 18 +- .../chacha20poly1305_amd64.go | 14 +- .../chacha20poly1305/chacha20poly1305_amd64.s | 0 .../chacha20poly1305_generic.go | 11 +- .../chacha20poly1305_noasm.go | 0 .../chacha20poly1305/xchacha20poly1305.go | 104 + .../golang.org}/x/crypto/cryptobyte/asn1.go | 2 +- .../x/crypto/cryptobyte/asn1/asn1.go | 2 +- .../x/crypto/cryptobyte/builder.go | 0 .../golang.org}/x/crypto/cryptobyte/string.go | 2 +- .../x/crypto/curve25519/const_amd64.h | 0 .../x/crypto/curve25519/const_amd64.s | 0 .../x/crypto/curve25519/cswap_amd64.s | 0 .../x/crypto/curve25519/curve25519.go | 0 .../golang.org}/x/crypto/curve25519/doc.go | 2 +- .../x/crypto/curve25519/freeze_amd64.s | 0 .../x/crypto/curve25519/ladderstep_amd64.s | 0 .../x/crypto/curve25519/mont25519_amd64.go | 0 .../x/crypto/curve25519/mul_amd64.s | 0 .../x/crypto/curve25519/square_amd64.s | 0 .../golang.org}/x/crypto/hkdf/hkdf.go | 2 +- .../internal/chacha20/chacha_generic.go | 121 +- .../crypto/internal/chacha20/chacha_noasm.go | 0 .../crypto/internal/chacha20/chacha_s390x.go | 0 .../crypto/internal/chacha20/chacha_s390x.s} | 0 .../x/crypto/internal/chacha20/xor.go | 0 .../x/crypto/internal/subtle/aliasing.go | 32 + .../internal/subtle/aliasing_appengine.go | 35 + .../golang.org}/x/crypto/poly1305/poly1305.go | 2 +- .../x/crypto/poly1305/sum_amd64.go | 0 .../golang.org}/x/crypto/poly1305/sum_amd64.s | 0 .../golang.org}/x/crypto/poly1305/sum_arm.go | 0 .../golang.org}/x/crypto/poly1305/sum_arm.s | 0 .../x/crypto/poly1305/sum_noasm.go | 0 .../golang.org}/x/crypto/poly1305/sum_ref.go | 0 .../x/crypto/poly1305/sum_s390x.go | 0 .../golang.org}/x/crypto/poly1305/sum_s390x.s | 0 .../x/crypto/poly1305/sum_vmsl_s390x.s | 0 src/vendor/golang.org/x/net/AUTHORS | 3 + src/vendor/golang.org/x/net/CONTRIBUTORS | 3 + src/vendor/golang.org/x/net/LICENSE | 27 + src/vendor/golang.org/x/net/PATENTS | 22 + .../x/net/dns/dnsmessage/message.go | 579 +++- .../golang.org}/x/net/http/httpguts/guts.go | 0 .../x/net/http/httpguts/httplex.go | 2 +- .../golang.org}/x/net/http/httpproxy/proxy.go | 2 +- .../golang.org}/x/net/http2/hpack/encode.go | 0 .../golang.org}/x/net/http2/hpack/hpack.go | 0 .../golang.org}/x/net/http2/hpack/huffman.go | 0 .../golang.org}/x/net/http2/hpack/tables.go | 0 .../golang.org}/x/net/idna/idna.go | 8 +- .../golang.org}/x/net/idna/punycode.go | 0 .../golang.org}/x/net/idna/tables.go | 2 - .../golang.org}/x/net/idna/trie.go | 0 .../golang.org}/x/net/idna/trieval.go | 2 - .../golang.org}/x/net/lif/address.go | 0 .../golang.org}/x/net/lif/binary.go | 0 .../golang.org}/x/net/lif/defs_solaris.go | 0 .../golang.org}/x/net/lif/lif.go | 0 .../golang.org}/x/net/lif/link.go | 0 .../golang.org}/x/net/lif/sys.go | 0 .../golang.org}/x/net/lif/sys_solaris_amd64.s | 0 .../golang.org}/x/net/lif/syscall.go | 0 .../x/net/lif/zsys_solaris_amd64.go | 0 .../golang.org}/x/net/nettest/conntest.go | 0 .../x/net/nettest/conntest_go16.go | 0 .../x/net/nettest/conntest_go17.go | 0 .../golang.org}/x/net/route/address.go | 0 .../golang.org}/x/net/route/binary.go | 0 .../golang.org}/x/net/route/defs_darwin.go | 0 .../golang.org}/x/net/route/defs_dragonfly.go | 0 .../golang.org}/x/net/route/defs_freebsd.go | 0 .../golang.org}/x/net/route/defs_netbsd.go | 0 .../golang.org}/x/net/route/defs_openbsd.go | 0 .../golang.org}/x/net/route/empty.s | 0 .../golang.org}/x/net/route/interface.go | 0 .../x/net/route/interface_announce.go | 0 .../x/net/route/interface_classic.go | 0 .../x/net/route/interface_freebsd.go | 0 .../x/net/route/interface_multicast.go | 0 .../x/net/route/interface_openbsd.go | 0 .../golang.org}/x/net/route/message.go | 0 .../golang.org}/x/net/route/route.go | 0 .../golang.org}/x/net/route/route_classic.go | 0 .../golang.org}/x/net/route/route_openbsd.go | 0 .../golang.org}/x/net/route/sys.go | 0 .../golang.org}/x/net/route/sys_darwin.go | 0 .../golang.org}/x/net/route/sys_dragonfly.go | 0 .../golang.org}/x/net/route/sys_freebsd.go | 0 .../golang.org}/x/net/route/sys_netbsd.go | 0 .../golang.org}/x/net/route/sys_openbsd.go | 0 .../golang.org}/x/net/route/syscall.go | 0 .../x/net/route/syscall_go1_11_darwin.go | 0 .../x/net/route/syscall_go1_12_darwin.go | 0 .../golang.org}/x/net/route/zsys_darwin.go | 0 .../golang.org}/x/net/route/zsys_dragonfly.go | 0 .../x/net/route/zsys_freebsd_386.go | 0 .../x/net/route/zsys_freebsd_amd64.go | 0 .../x/net/route/zsys_freebsd_arm.go | 0 .../golang.org}/x/net/route/zsys_netbsd.go | 0 .../golang.org}/x/net/route/zsys_openbsd.go | 0 src/vendor/golang.org/x/sys/AUTHORS | 3 + src/vendor/golang.org/x/sys/CONTRIBUTORS | 3 + src/vendor/golang.org/x/sys/LICENSE | 27 + src/vendor/golang.org/x/sys/PATENTS | 22 + src/vendor/golang.org/x/sys/cpu/byteorder.go | 30 + src/vendor/golang.org/x/sys/cpu/cpu.go | 126 + src/vendor/golang.org/x/sys/cpu/cpu_arm.go | 9 + .../golang.org/x/sys/cpu/cpu_gc_s390x.go | 21 + src/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 16 + src/vendor/golang.org/x/sys/cpu/cpu_gccgo.c | 43 + src/vendor/golang.org/x/sys/cpu/cpu_gccgo.go | 26 + .../golang.org/x/sys/cpu/cpu_gccgo_s390x.go | 22 + src/vendor/golang.org/x/sys/cpu/cpu_linux.go | 59 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 67 + .../golang.org/x/sys/cpu/cpu_linux_ppc64x.go | 33 + .../golang.org/x/sys/cpu/cpu_linux_s390x.go | 161 + .../golang.org/x/sys/cpu/cpu_mips64x.go | 11 + src/vendor/golang.org/x/sys/cpu/cpu_mipsx.go | 11 + .../golang.org/x/sys/cpu/cpu_other_arm64.go | 11 + .../golang.org/x/sys/cpu/cpu_other_ppc64x.go | 12 + src/vendor/golang.org/x/sys/cpu/cpu_s390x.s | 57 + src/vendor/golang.org/x/sys/cpu/cpu_wasm.go | 13 + src/vendor/golang.org/x/sys/cpu/cpu_x86.go | 59 + src/vendor/golang.org/x/sys/cpu/cpu_x86.s | 27 + src/vendor/golang.org/x/text/AUTHORS | 3 + src/vendor/golang.org/x/text/CONTRIBUTORS | 3 + src/vendor/golang.org/x/text/LICENSE | 27 + src/vendor/golang.org/x/text/PATENTS | 22 + .../x/text/secure/bidirule/bidirule.go | 6 +- .../golang.org}/x/text/transform/transform.go | 4 +- .../golang.org}/x/text/unicode/bidi/bidi.go | 6 +- .../x/text/unicode/bidi/bracket.go | 2 - .../golang.org}/x/text/unicode/bidi/core.go | 2 - .../golang.org/x/text/unicode/bidi/gen.go | 133 + .../x/text/unicode/bidi/gen_ranges.go | 57 + .../x/text/unicode/bidi/gen_trieval.go | 64 + .../golang.org}/x/text/unicode/bidi/prop.go | 2 - .../golang.org}/x/text/unicode/bidi/tables.go | 2 - .../x/text/unicode/bidi/trieval.go | 2 - .../x/text/unicode/norm/composition.go | 2 - .../x/text/unicode/norm/forminfo.go | 2 - .../golang.org}/x/text/unicode/norm/input.go | 2 - .../golang.org}/x/text/unicode/norm/iter.go | 2 - .../x/text/unicode/norm/maketables.go | 976 ++++++ .../x/text/unicode/norm/normalize.go | 8 +- .../x/text/unicode/norm/readwriter.go | 2 - .../golang.org}/x/text/unicode/norm/tables.go | 2 - .../x/text/unicode/norm/transform.go | 4 +- .../golang.org}/x/text/unicode/norm/trie.go | 2 - .../x/text/unicode/norm/triegen.go | 0 src/vendor/modules.txt | 25 + 240 files changed, 3250 insertions(+), 11361 deletions(-) create mode 100644 src/go.sum delete mode 100644 src/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go delete mode 100644 src/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go delete mode 100644 src/internal/x/crypto/cryptobyte/asn1_test.go delete mode 100644 src/internal/x/crypto/cryptobyte/cryptobyte_test.go delete mode 100644 src/internal/x/crypto/cryptobyte/example_test.go delete mode 100644 src/internal/x/crypto/curve25519/curve25519_test.go delete mode 100644 src/internal/x/crypto/hkdf/example_test.go delete mode 100644 src/internal/x/crypto/hkdf/hkdf_test.go delete mode 100644 src/internal/x/crypto/internal/chacha20/chacha_test.go delete mode 100644 src/internal/x/crypto/internal/chacha20/vectors_test.go delete mode 100644 src/internal/x/crypto/poly1305/poly1305_test.go delete mode 100644 src/internal/x/crypto/poly1305/vectors_test.go delete mode 100755 src/internal/x/fiximports.bash delete mode 100644 src/internal/x/net/dns/dnsmessage/example_test.go delete mode 100644 src/internal/x/net/dns/dnsmessage/message_test.go delete mode 100644 src/internal/x/net/http/httpguts/httplex_test.go delete mode 100644 src/internal/x/net/http/httpproxy/export_test.go delete mode 100644 src/internal/x/net/http/httpproxy/proxy_test.go delete mode 100644 src/internal/x/net/http2/hpack/encode_test.go delete mode 100644 src/internal/x/net/http2/hpack/hpack_test.go delete mode 100644 src/internal/x/net/http2/hpack/tables_test.go delete mode 100644 src/internal/x/net/idna/punycode_test.go delete mode 100644 src/internal/x/net/internal/nettest/helper_bsd.go delete mode 100644 src/internal/x/net/internal/nettest/helper_nobsd.go delete mode 100644 src/internal/x/net/internal/nettest/helper_posix.go delete mode 100644 src/internal/x/net/internal/nettest/helper_stub.go delete mode 100644 src/internal/x/net/internal/nettest/helper_unix.go delete mode 100644 src/internal/x/net/internal/nettest/helper_windows.go delete mode 100644 src/internal/x/net/internal/nettest/interface.go delete mode 100644 src/internal/x/net/internal/nettest/rlimit.go delete mode 100644 src/internal/x/net/internal/nettest/stack.go delete mode 100644 src/internal/x/net/lif/address_test.go delete mode 100644 src/internal/x/net/lif/link_test.go delete mode 100644 src/internal/x/net/nettest/conntest_test.go delete mode 100644 src/internal/x/net/route/address_darwin_test.go delete mode 100644 src/internal/x/net/route/address_test.go delete mode 100644 src/internal/x/net/route/message_darwin_test.go delete mode 100644 src/internal/x/net/route/message_freebsd_test.go delete mode 100644 src/internal/x/net/route/message_test.go delete mode 100644 src/internal/x/net/route/route_test.go delete mode 100644 src/internal/x/text/secure/doc.go delete mode 100644 src/internal/x/text/transform/examples_test.go delete mode 100644 src/internal/x/text/unicode/bidi/example_test.go delete mode 100644 src/internal/x/text/unicode/doc.go delete mode 100644 src/internal/x/text/unicode/norm/example_iter_test.go delete mode 100644 src/internal/x/text/unicode/norm/example_test.go create mode 100644 src/vendor/golang.org/x/crypto/AUTHORS create mode 100644 src/vendor/golang.org/x/crypto/CONTRIBUTORS create mode 100644 src/vendor/golang.org/x/crypto/LICENSE create mode 100644 src/vendor/golang.org/x/crypto/PATENTS rename src/{internal => vendor/golang.org}/x/crypto/chacha20poly1305/chacha20poly1305.go (81%) rename src/{internal => vendor/golang.org}/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go (86%) rename src/{internal => vendor/golang.org}/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/chacha20poly1305/chacha20poly1305_generic.go (88%) rename src/{internal => vendor/golang.org}/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go (100%) create mode 100644 src/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go rename src/{internal => vendor/golang.org}/x/crypto/cryptobyte/asn1.go (99%) rename src/{internal => vendor/golang.org}/x/crypto/cryptobyte/asn1/asn1.go (96%) rename src/{internal => vendor/golang.org}/x/crypto/cryptobyte/builder.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/cryptobyte/string.go (98%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/const_amd64.h (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/const_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/cswap_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/curve25519.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/doc.go (94%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/freeze_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/ladderstep_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/mont25519_amd64.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/mul_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/curve25519/square_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/hkdf/hkdf.go (98%) rename src/{internal => vendor/golang.org}/x/crypto/internal/chacha20/chacha_generic.go (66%) rename src/{internal => vendor/golang.org}/x/crypto/internal/chacha20/chacha_noasm.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/internal/chacha20/chacha_s390x.go (100%) rename src/{internal/x/crypto/internal/chacha20/asm_s390x.s => vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s} (100%) rename src/{internal => vendor/golang.org}/x/crypto/internal/chacha20/xor.go (100%) create mode 100644 src/vendor/golang.org/x/crypto/internal/subtle/aliasing.go create mode 100644 src/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go rename src/{internal => vendor/golang.org}/x/crypto/poly1305/poly1305.go (95%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_amd64.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_arm.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_arm.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_noasm.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_ref.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_s390x.go (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_s390x.s (100%) rename src/{internal => vendor/golang.org}/x/crypto/poly1305/sum_vmsl_s390x.s (100%) create mode 100644 src/vendor/golang.org/x/net/AUTHORS create mode 100644 src/vendor/golang.org/x/net/CONTRIBUTORS create mode 100644 src/vendor/golang.org/x/net/LICENSE create mode 100644 src/vendor/golang.org/x/net/PATENTS rename src/{internal => vendor/golang.org}/x/net/dns/dnsmessage/message.go (78%) rename src/{internal => vendor/golang.org}/x/net/http/httpguts/guts.go (100%) rename src/{internal => vendor/golang.org}/x/net/http/httpguts/httplex.go (99%) rename src/{internal => vendor/golang.org}/x/net/http/httpproxy/proxy.go (99%) rename src/{internal => vendor/golang.org}/x/net/http2/hpack/encode.go (100%) rename src/{internal => vendor/golang.org}/x/net/http2/hpack/hpack.go (100%) rename src/{internal => vendor/golang.org}/x/net/http2/hpack/huffman.go (100%) rename src/{internal => vendor/golang.org}/x/net/http2/hpack/tables.go (100%) rename src/{internal => vendor/golang.org}/x/net/idna/idna.go (99%) rename src/{internal => vendor/golang.org}/x/net/idna/punycode.go (100%) rename src/{internal => vendor/golang.org}/x/net/idna/tables.go (99%) rename src/{internal => vendor/golang.org}/x/net/idna/trie.go (100%) rename src/{internal => vendor/golang.org}/x/net/idna/trieval.go (97%) rename src/{internal => vendor/golang.org}/x/net/lif/address.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/binary.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/defs_solaris.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/lif.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/link.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/sys.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/sys_solaris_amd64.s (100%) rename src/{internal => vendor/golang.org}/x/net/lif/syscall.go (100%) rename src/{internal => vendor/golang.org}/x/net/lif/zsys_solaris_amd64.go (100%) rename src/{internal => vendor/golang.org}/x/net/nettest/conntest.go (100%) rename src/{internal => vendor/golang.org}/x/net/nettest/conntest_go16.go (100%) rename src/{internal => vendor/golang.org}/x/net/nettest/conntest_go17.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/address.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/binary.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/defs_darwin.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/defs_dragonfly.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/defs_freebsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/defs_netbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/defs_openbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/empty.s (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface_announce.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface_classic.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface_freebsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface_multicast.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/interface_openbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/message.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/route.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/route_classic.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/route_openbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys_darwin.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys_dragonfly.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys_freebsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys_netbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/sys_openbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/syscall.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/syscall_go1_11_darwin.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/syscall_go1_12_darwin.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_darwin.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_dragonfly.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_freebsd_386.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_freebsd_amd64.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_freebsd_arm.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_netbsd.go (100%) rename src/{internal => vendor/golang.org}/x/net/route/zsys_openbsd.go (100%) create mode 100644 src/vendor/golang.org/x/sys/AUTHORS create mode 100644 src/vendor/golang.org/x/sys/CONTRIBUTORS create mode 100644 src/vendor/golang.org/x/sys/LICENSE create mode 100644 src/vendor/golang.org/x/sys/PATENTS create mode 100644 src/vendor/golang.org/x/sys/cpu/byteorder.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_arm.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_gccgo.c create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_gccgo.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_linux.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_mips64x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_mipsx.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_s390x.s create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_wasm.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_x86.go create mode 100644 src/vendor/golang.org/x/sys/cpu/cpu_x86.s create mode 100644 src/vendor/golang.org/x/text/AUTHORS create mode 100644 src/vendor/golang.org/x/text/CONTRIBUTORS create mode 100644 src/vendor/golang.org/x/text/LICENSE create mode 100644 src/vendor/golang.org/x/text/PATENTS rename src/{internal => vendor/golang.org}/x/text/secure/bidirule/bidirule.go (98%) rename src/{internal => vendor/golang.org}/x/text/transform/transform.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/bidi.go (98%) rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/bracket.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/core.go (99%) create mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen.go create mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go create mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/prop.go (98%) rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/tables.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/bidi/trieval.go (95%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/composition.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/forminfo.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/input.go (96%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/iter.go (99%) create mode 100644 src/vendor/golang.org/x/text/unicode/norm/maketables.go rename src/{internal => vendor/golang.org}/x/text/unicode/norm/normalize.go (98%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/readwriter.go (97%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/tables.go (99%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/transform.go (95%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/trie.go (94%) rename src/{internal => vendor/golang.org}/x/text/unicode/norm/triegen.go (100%) create mode 100644 src/vendor/modules.txt diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 87739a510d..c31d36acae 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -192,6 +192,21 @@ func xinit() { gogcflags = os.Getenv("BOOT_GO_GCFLAGS") + // Add -mod=vendor to GOFLAGS so that commands won't try to resolve go.mod + // files for vendored external modules. + // TODO(golang.org/issue/30240): If the vendor directory contains the go.mod + // files, this probably won't be necessary. + // TODO(golang.org/issue/26849): Escape spaces in GOFLAGS if needed. + goflags := strings.Fields(os.Getenv("GOFLAGS")) + for i, flag := range goflags { + if strings.HasPrefix(flag, "-mod=") { + goflags = append(goflags[0:i], goflags[i+1:]...) + break + } + } + goflags = append(goflags, "-mod=vendor") + os.Setenv("GOFLAGS", strings.Join(goflags, " ")) + cc, cxx := "gcc", "g++" if defaultclang { cc, cxx = "clang", "clang++" diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index a58cee7518..1a54752f35 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -419,9 +419,10 @@ func (t *tester) registerTests() { if !t.race { cmd.Args = append(cmd.Args, "cmd") } + cmd.Stderr = new(bytes.Buffer) all, err := cmd.Output() if err != nil { - log.Fatalf("Error running go list std cmd: %v, %s", err, all) + log.Fatalf("Error running go list std cmd: %v:\n%s", err, cmd.Stderr) } pkgs := strings.Fields(string(all)) for _, pkg := range pkgs { diff --git a/src/cmd/go/testdata/script/gopath_std_vendor.txt b/src/cmd/go/testdata/script/gopath_std_vendor.txt index 8bb1dc4430..a0a41a50de 100644 --- a/src/cmd/go/testdata/script/gopath_std_vendor.txt +++ b/src/cmd/go/testdata/script/gopath_std_vendor.txt @@ -9,8 +9,8 @@ stdout $GOPATH[/\\]src[/\\]vendor # to the package 'vendor/golang.org/x/net/http2/hpack' within GOROOT. cd importnethttp go list -deps -f '{{.ImportPath}} {{.Dir}}' -stdout ^internal/x/net/http2/hpack -stdout $GOROOT[/\\]src[/\\]internal[/\\]x[/\\]net[/\\]http2[/\\]hpack +stdout ^vendor/golang.org/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]vendor[/\\]golang.org[/\\]x[/\\]net[/\\]http2[/\\]hpack ! stdout $GOPATH[/\\]src[/\\]vendor # In the presence of $GOPATH/src/vendor/golang.org/x/net/http2/hpack, diff --git a/src/cmd/go/testdata/script/list_std.txt b/src/cmd/go/testdata/script/list_std.txt index 5960d442e5..deddaa61ea 100644 --- a/src/cmd/go/testdata/script/list_std.txt +++ b/src/cmd/go/testdata/script/list_std.txt @@ -16,7 +16,7 @@ stdout cmd/compile # In GOPATH mode, packages vendored into GOROOT should be reported as standard. go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd -stdout internal/x/net/http2/hpack +stdout golang.org/x/net/http2/hpack stdout cmd/vendor/golang\.org/x/arch/x86/x86asm # However, vendored packages should not match wildcard patterns beginning with cmd. diff --git a/src/cmd/go/testdata/script/mod_list_std.txt b/src/cmd/go/testdata/script/mod_list_std.txt index 15642cd0b7..f5136a5de0 100644 --- a/src/cmd/go/testdata/script/mod_list_std.txt +++ b/src/cmd/go/testdata/script/mod_list_std.txt @@ -5,7 +5,7 @@ env GOPROXY=off # Outside of GOROOT, our vendored packages should be reported as part of the standard library. go list -f '{{if .Standard}}{{.ImportPath}}{{end}}' std cmd -stdout ^internal/x/net/http2/hpack +stdout ^vendor/golang.org/x/net/http2/hpack stdout ^cmd/vendor/golang\.org/x/arch/x86/x86asm # cmd/... should match the same packages it used to match in GOPATH mode. @@ -20,15 +20,15 @@ stdout ^cmd/compile # Today, they are listed in 'std' but not './...'. cd $GOROOT/src go list ./... -stdout ^internal/x +! stdout ^vendor/golang.org/x # TODO: should be included, or should be omitted from 'std'. cp stdout $WORK/listdot.txt go list std -stdout ^internal/x +stdout ^vendor/golang.org/x # TODO: remove vendor/ prefix # TODO: cmp stdout $WORK/listdot.txt go list all -stdout ^internal/x +stdout ^vendor/golang.org/x # TODO: remove vendor/ prefix. ! stdout ^std/ @@ -37,11 +37,11 @@ stdout ^internal/x # TODO(golang.org/issue/30241): Make that work. # Today, they still have the vendor/ prefix. go list std -stdout ^internal/x/net/http2/hpack # TODO +stdout ^vendor/golang.org/x/net/http2/hpack # TODO ! stdout ^golang.org/x/net/http2/hpack # TODO go list -deps -f '{{if not .Standard}}{{.ImportPath}}{{end}}' std -# ! stdout ^internal/x/net/http2/hpack # TODO +# ! stdout ^vendor/golang.org/x/net/http2/hpack # TODO ! stdout ^golang.org/x/net/http2/hpack # TODO diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt index 17818c4536..5aa544cb77 100644 --- a/src/cmd/go/testdata/script/mod_std_vendor.txt +++ b/src/cmd/go/testdata/script/mod_std_vendor.txt @@ -1,17 +1,20 @@ env GO111MODULE=on env GOPROXY=off +[!gc] skip + +# 'go list' should report imports from _test.go in the TestImports field. go list -f '{{.TestImports}}' stdout net/http # from .TestImports # 'go list' should find standard-vendored packages. -go list -f '{{.Dir}}' internal/x/net/http2/hpack -stdout $GOROOT[/\\]src[/\\]internal +go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]vendor # 'go list -test' should report vendored transitive dependencies of _test.go # imports in the Deps field. go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' -stdout internal/x/crypto # dep of .TestImports +stdout ^vendor/golang.org/x/crypto # dep of .TestImports # Modules outside the standard library should not use the packages vendored there... @@ -29,7 +32,7 @@ stderr 'use of vendored package' cd ../importstd ! go build . -stderr 'use of internal package' +stderr 'use of vendored package' # When run within the 'std' module, 'go list -test' should report vendored @@ -38,8 +41,8 @@ stderr 'use of internal package' # Today, they're standard packages as long as they exist. cd $GOROOT/src go list -test -f '{{range .Deps}}{{.}}{{"\n"}}{{end}}' net/http -! stdout ^vendor/golang.org/x/net/http2/hpack # TODO: this will exist later -stdout ^internal/x/net/http2/hpack +stdout ^vendor/golang.org/x/net/http2/hpack # TODO: remove vendor/ prefix +! stdout ^golang.org/x/net/http2/hpack -- go.mod -- module m @@ -74,4 +77,4 @@ module importvendor -- importstd/x.go -- package importstd -import _ "internal/x/net/http2/hpack" +import _ "vendor/golang.org/x/net/http2/hpack" diff --git a/src/cmd/go/testdata/script/std_vendor.txt b/src/cmd/go/testdata/script/std_vendor.txt index e769dff481..6cb015fc07 100644 --- a/src/cmd/go/testdata/script/std_vendor.txt +++ b/src/cmd/go/testdata/script/std_vendor.txt @@ -7,13 +7,13 @@ go list -f '{{.TestImports}}' stdout net/http # from .TestImports # 'go list' should report standard-vendored packages by path. -go list -f '{{.Dir}}' internal/x/net/http2/hpack -stdout $GOROOT[/\\]src[/\\]internal +go list -f '{{.Dir}}' vendor/golang.org/x/net/http2/hpack +stdout $GOROOT[/\\]src[/\\]vendor # 'go list -test' should report vendored transitive dependencies of _test.go # imports in the Deps field, with a 'vendor' prefix on their import paths. go list -test -f '{{.Deps}}' -stdout internal/x/crypto # dep of .TestImports +stdout golang.org/x/crypto # dep of .TestImports # Packages outside the standard library should not use its copy of vendored packages. cd broken diff --git a/src/cmd/vet/all/whitelist/s390x.txt b/src/cmd/vet/all/whitelist/s390x.txt index 55cf44a519..c8fd385c4a 100644 --- a/src/cmd/vet/all/whitelist/s390x.txt +++ b/src/cmd/vet/all/whitelist/s390x.txt @@ -10,3 +10,10 @@ internal/cpu/cpu_s390x.s: [s390x] kmctrQuery: invalid MOVD of ret+0(FP); interna internal/cpu/cpu_s390x.s: [s390x] kmaQuery: invalid MOVD of ret+0(FP); internal/cpu.queryResult is 16-byte value internal/cpu/cpu_s390x.s: [s390x] kimdQuery: invalid MOVD of ret+0(FP); internal/cpu.queryResult is 16-byte value internal/cpu/cpu_s390x.s: [s390x] klmdQuery: invalid MOVD of ret+0(FP); internal/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] stfle: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.facilityList is 32-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] kmQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] kmcQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] kmctrQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] kmaQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] kimdQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value +vendor/golang.org/x/sys/cpu/cpu_s390x.s: [s390x] klmdQuery: invalid MOVD of ret+0(FP); vendor/golang.org/x/sys/cpu.queryResult is 16-byte value diff --git a/src/crypto/tls/cipher_suites.go b/src/crypto/tls/cipher_suites.go index ecb4db290a..7431ac0435 100644 --- a/src/crypto/tls/cipher_suites.go +++ b/src/crypto/tls/cipher_suites.go @@ -14,8 +14,8 @@ import ( "crypto/sha1" "crypto/sha256" "crypto/x509" + "golang.org/x/crypto/chacha20poly1305" "hash" - "internal/x/crypto/chacha20poly1305" ) // a keyAgreement implements the client and server side of a TLS key agreement diff --git a/src/crypto/tls/handshake_messages.go b/src/crypto/tls/handshake_messages.go index c0e049b16f..864fbd4757 100644 --- a/src/crypto/tls/handshake_messages.go +++ b/src/crypto/tls/handshake_messages.go @@ -6,7 +6,7 @@ package tls import ( "fmt" - "internal/x/crypto/cryptobyte" + "golang.org/x/crypto/cryptobyte" "strings" ) diff --git a/src/crypto/tls/key_schedule.go b/src/crypto/tls/key_schedule.go index 2cfc226d7f..3cd6e8297a 100644 --- a/src/crypto/tls/key_schedule.go +++ b/src/crypto/tls/key_schedule.go @@ -8,10 +8,10 @@ import ( "crypto/elliptic" "crypto/hmac" "errors" + "golang.org/x/crypto/cryptobyte" + "golang.org/x/crypto/curve25519" + "golang.org/x/crypto/hkdf" "hash" - "internal/x/crypto/cryptobyte" - "internal/x/crypto/curve25519" - "internal/x/crypto/hkdf" "io" "math/big" ) diff --git a/src/crypto/tls/ticket.go b/src/crypto/tls/ticket.go index 9560176259..c873e43a70 100644 --- a/src/crypto/tls/ticket.go +++ b/src/crypto/tls/ticket.go @@ -12,7 +12,7 @@ import ( "crypto/sha256" "crypto/subtle" "errors" - "internal/x/crypto/cryptobyte" + "golang.org/x/crypto/cryptobyte" "io" ) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 80e4dec0f3..0d68d82993 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -24,8 +24,8 @@ import ( "encoding/pem" "errors" "fmt" - "internal/x/crypto/cryptobyte" - cryptobyte_asn1 "internal/x/crypto/cryptobyte/asn1" + "golang.org/x/crypto/cryptobyte" + cryptobyte_asn1 "golang.org/x/crypto/cryptobyte/asn1" "io" "math/big" "net" diff --git a/src/go.mod b/src/go.mod index 174b3fe5f1..5de2e9799e 100644 --- a/src/go.mod +++ b/src/go.mod @@ -1,3 +1,10 @@ module std go 1.12 + +require ( + golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 + golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6 + golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e // indirect + golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6 // indirect +) diff --git a/src/go.sum b/src/go.sum new file mode 100644 index 0000000000..22463edac0 --- /dev/null +++ b/src/go.sum @@ -0,0 +1,8 @@ +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 h1:a4tQYYYuK9QdeO/+kEvNYyuR21S+7ve5EANok6hABhI= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6 h1:gT0Y6H7hbVPUtvtk0YGxMXPgN+p8fYlqWkgJeUCZcaQ= +golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e h1:UndnRDGP/JcdZX1LBubo1fJ3Jt6GnKREteLJvysiiPE= +golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6 h1:j8pkdn+8tJbBXIFRILFAB5MDo/hAZg4TnknVwnhU6bI= +golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 8e289ae95d..f9e5c4dec0 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -325,7 +325,7 @@ var pkgDeps = map[string][]string{ "context", "math/rand", "os", "reflect", "sort", "syscall", "time", "internal/nettrace", "internal/poll", "internal/syscall/unix", "internal/syscall/windows", "internal/singleflight", "internal/race", - "internal/x/net/dns/dnsmessage", "internal/x/net/lif", "internal/x/net/route", + "golang.org/x/net/dns/dnsmessage", "golang.org/x/net/lif", "golang.org/x/net/route", }, // NET enables use of basic network-related packages. @@ -362,9 +362,9 @@ var pkgDeps = map[string][]string{ "crypto/sha1", "crypto/sha256", "crypto/sha512", - "internal/x/crypto/chacha20poly1305", - "internal/x/crypto/curve25519", - "internal/x/crypto/poly1305", + "golang.org/x/crypto/chacha20poly1305", + "golang.org/x/crypto/curve25519", + "golang.org/x/crypto/poly1305", }, // Random byte, number generation. @@ -392,13 +392,13 @@ var pkgDeps = map[string][]string{ // SSL/TLS. "crypto/tls": { - "L4", "CRYPTO-MATH", "OS", "internal/x/crypto/cryptobyte", "internal/x/crypto/hkdf", + "L4", "CRYPTO-MATH", "OS", "golang.org/x/crypto/cryptobyte", "golang.org/x/crypto/hkdf", "container/list", "crypto/x509", "encoding/pem", "net", "syscall", }, "crypto/x509": { "L4", "CRYPTO-MATH", "OS", "CGO", "crypto/x509/pkix", "encoding/pem", "encoding/hex", "net", "os/user", "syscall", "net/url", - "internal/x/crypto/cryptobyte", "internal/x/crypto/cryptobyte/asn1", + "golang.org/x/crypto/cryptobyte", "golang.org/x/crypto/cryptobyte/asn1", }, "crypto/x509/pkix": {"L4", "CRYPTO-MATH", "encoding/hex"}, @@ -414,12 +414,12 @@ var pkgDeps = map[string][]string{ "context", "crypto/rand", "crypto/tls", - "internal/x/net/http/httpguts", - "internal/x/net/http/httpproxy", - "internal/x/net/http2/hpack", - "internal/x/net/idna", - "internal/x/text/unicode/norm", - "internal/x/text/width", + "golang.org/x/net/http/httpguts", + "golang.org/x/net/http/httpproxy", + "golang.org/x/net/http2/hpack", + "golang.org/x/net/idna", + "golang.org/x/text/unicode/norm", + "golang.org/x/text/width", "internal/nettrace", "mime/multipart", "net/http/httptrace", @@ -437,9 +437,9 @@ var pkgDeps = map[string][]string{ "net/http/fcgi": {"L4", "NET", "OS", "context", "net/http", "net/http/cgi"}, "net/http/httptest": { "L4", "NET", "OS", "crypto/tls", "flag", "net/http", "net/http/internal", "crypto/x509", - "internal/x/net/http/httpguts", + "golang.org/x/net/http/httpguts", }, - "net/http/httputil": {"L4", "NET", "OS", "context", "net/http", "net/http/internal", "internal/x/net/http/httpguts"}, + "net/http/httputil": {"L4", "NET", "OS", "context", "net/http", "net/http/internal", "golang.org/x/net/http/httpguts"}, "net/http/pprof": {"L4", "OS", "html/template", "net/http", "runtime/pprof", "runtime/trace"}, "net/rpc": {"L4", "NET", "encoding/gob", "html/template", "net/http"}, "net/rpc/jsonrpc": {"L4", "NET", "encoding/json", "net/rpc"}, @@ -490,7 +490,7 @@ func listStdPkgs(goroot string) ([]string, error) { } name := filepath.ToSlash(path[len(src):]) - if name == "builtin" || name == "cmd" || strings.Contains(name, "internal/x/") { + if name == "builtin" || name == "cmd" || strings.Contains(name, "golang.org/x/") { return filepath.SkipDir } diff --git a/src/go/internal/srcimporter/srcimporter_test.go b/src/go/internal/srcimporter/srcimporter_test.go index b84672610c..087f97461e 100644 --- a/src/go/internal/srcimporter/srcimporter_test.go +++ b/src/go/internal/srcimporter/srcimporter_test.go @@ -99,7 +99,7 @@ var importedObjectTests = []struct { {"math.Pi", "const Pi untyped float"}, {"math.Sin", "func Sin(x float64) float64"}, {"math/big.Int", "type Int struct{neg bool; abs nat}"}, - {"internal/x/text/unicode/norm.MaxSegmentSize", "const MaxSegmentSize untyped int"}, + {"golang.org/x/text/unicode/norm.MaxSegmentSize", "const MaxSegmentSize untyped int"}, } func TestImportedTypes(t *testing.T) { @@ -108,12 +108,12 @@ func TestImportedTypes(t *testing.T) { } for _, test := range importedObjectTests { - s := strings.Split(test.name, ".") - if len(s) != 2 { + i := strings.LastIndex(test.name, ".") + if i < 0 { t.Fatal("invalid test data format") } - importPath := s[0] - objName := s[1] + importPath := test.name[:i] + objName := test.name[i+1:] pkg, err := importer.ImportFrom(importPath, ".", 0) if err != nil { diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go b/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go deleted file mode 100644 index 78f981a74f..0000000000 --- a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_test.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2016 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 chacha20poly1305 - -import ( - "bytes" - cr "crypto/rand" - "encoding/hex" - mr "math/rand" - "testing" -) - -func TestVectors(t *testing.T) { - for i, test := range chacha20Poly1305Tests { - key, _ := hex.DecodeString(test.key) - nonce, _ := hex.DecodeString(test.nonce) - ad, _ := hex.DecodeString(test.aad) - plaintext, _ := hex.DecodeString(test.plaintext) - - aead, err := New(key) - if err != nil { - t.Fatal(err) - } - - ct := aead.Seal(nil, nonce, plaintext, ad) - if ctHex := hex.EncodeToString(ct); ctHex != test.out { - t.Errorf("#%d: got %s, want %s", i, ctHex, test.out) - continue - } - - plaintext2, err := aead.Open(nil, nonce, ct, ad) - if err != nil { - t.Errorf("#%d: Open failed", i) - continue - } - - if !bytes.Equal(plaintext, plaintext2) { - t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) - continue - } - - if len(ad) > 0 { - alterAdIdx := mr.Intn(len(ad)) - ad[alterAdIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering additional data", i) - } - ad[alterAdIdx] ^= 0x80 - } - - alterNonceIdx := mr.Intn(aead.NonceSize()) - nonce[alterNonceIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering nonce", i) - } - nonce[alterNonceIdx] ^= 0x80 - - alterCtIdx := mr.Intn(len(ct)) - ct[alterCtIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce, ct, ad); err == nil { - t.Errorf("#%d: Open was successful after altering ciphertext", i) - } - ct[alterCtIdx] ^= 0x80 - } -} - -func TestRandom(t *testing.T) { - // Some random tests to verify Open(Seal) == Plaintext - for i := 0; i < 256; i++ { - var nonce [12]byte - var key [32]byte - - al := mr.Intn(128) - pl := mr.Intn(16384) - ad := make([]byte, al) - plaintext := make([]byte, pl) - cr.Read(key[:]) - cr.Read(nonce[:]) - cr.Read(ad) - cr.Read(plaintext) - - aead, err := New(key[:]) - if err != nil { - t.Fatal(err) - } - - ct := aead.Seal(nil, nonce[:], plaintext, ad) - - plaintext2, err := aead.Open(nil, nonce[:], ct, ad) - if err != nil { - t.Errorf("Random #%d: Open failed", i) - continue - } - - if !bytes.Equal(plaintext, plaintext2) { - t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) - continue - } - - if len(ad) > 0 { - alterAdIdx := mr.Intn(len(ad)) - ad[alterAdIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering additional data", i) - } - ad[alterAdIdx] ^= 0x80 - } - - alterNonceIdx := mr.Intn(aead.NonceSize()) - nonce[alterNonceIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering nonce", i) - } - nonce[alterNonceIdx] ^= 0x80 - - alterCtIdx := mr.Intn(len(ct)) - ct[alterCtIdx] ^= 0x80 - if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { - t.Errorf("Random #%d: Open was successful after altering ciphertext", i) - } - ct[alterCtIdx] ^= 0x80 - } -} - -func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) { - b.SetBytes(int64(len(buf))) - - var key [32]byte - var nonce [12]byte - var ad [13]byte - var out []byte - - aead, _ := New(key[:]) - b.ResetTimer() - for i := 0; i < b.N; i++ { - out = aead.Seal(out[:0], nonce[:], buf[:], ad[:]) - } -} - -func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) { - b.SetBytes(int64(len(buf))) - - var key [32]byte - var nonce [12]byte - var ad [13]byte - var ct []byte - var out []byte - - aead, _ := New(key[:]) - ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:]) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:]) - } -} - -func BenchmarkChacha20Poly1305Open_64(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 64)) -} - -func BenchmarkChacha20Poly1305Seal_64(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 64)) -} - -func BenchmarkChacha20Poly1305Open_1350(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 1350)) -} - -func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350)) -} - -func BenchmarkChacha20Poly1305Open_8K(b *testing.B) { - benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024)) -} - -func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) { - benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024)) -} diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go b/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go deleted file mode 100644 index 64f6a7200c..0000000000 --- a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_vectors_test.go +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright 2016 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 chacha20poly1305 - -var chacha20Poly1305Tests = []struct { - plaintext, aad, key, nonce, out string -}{ - { - "", - "", - "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "070000004041424344454647", - "a0784d7a4716f3feb4f64e7f4b39bf04", - }, - { - "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", - "50515253c0c1c2c3c4c5c6c7", - "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", - "070000004041424344454647", - "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", - }, - { - "1400000cebccee3bf561b292340fec60", - "00000000000000001603030010", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163", - }, - { - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa", - }, - { - "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87", - "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1", - "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f", - "4349e2131d44dc711148dfe3", - "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb", - }, - { - "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad", - "85deea3dc4", - "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7", - "b34710f65aed442e4a40866b", - "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0", - }, - { - "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5", - "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5", - "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e", - "2bbca0910cc47ca0b8517391", - "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f", - }, - { - "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337", - "74ba3372d308910b5c9c3885f41252d57556", - "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3", - "b928935c4c966c60fd6583c0", - "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d", - }, - { - "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b", - "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4", - "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093", - "8998e043d2961afa51ea262a", - "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7", - }, - { - "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e", - "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7", - "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975", - "aeb6159fa88bb1ffd51d036d", - "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e", - }, - { - "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296", - "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14", - "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c", - "4c46854e9e101090b1436f90", - "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb", - }, - { - "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9", - "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521", - "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87", - "eaa4d916d261676d632455be", - "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd", - }, - { - "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90", - "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a", - "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089", - "2403fe689e239c2ed261b381", - "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91", - }, - { - "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae", - "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974", - "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be", - "231b5780fedfb06d724450b3", - "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7", - }, - { - "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91", - "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3", - "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97", - "1e46a7486c5a03fd6758d938", - "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf", - }, - { - "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf", - "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae", - "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369", - "e14de73c4b17581a7e0d0649", - "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d", - }, - { - "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5", - "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81", - "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6", - "bb2d033de71d570ddf824e85", - "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2", - }, - { - "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65", - "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497", - "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d", - "350287a6bed5709dfba3d35c", - "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95", - }, - { - "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5", - "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68", - "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c", - "c0494bb7249f864f69beab46", - "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081", - }, - { - "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c", - "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5", - "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7", - "674a516f8f59f9067e0485e3", - "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc", - }, - { - "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c", - "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85", - "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b", - "8726dc5cae9497936658f603", - "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465", - }, - { - "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c", - "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94", - "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea", - "b633c1a0e1ddf4727b149b3d", - "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527", - }, - { - "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c", - "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655", - "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9", - "9f1d08be539f1244f0f69ad2", - "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a", - }, - { - "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271", - "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442", - "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1", - "952f492fe00b26028c560fc6", - "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053", - }, - { - "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34", - "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f", - "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769", - "7d3981073f90c6648c5e9c74", - "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7", - }, - { - "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf", - "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062", - "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc", - "5f6267f6b3b21423267310e6", - "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5", - }, - { - "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607", - "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd", - "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f", - "240cb25aaae4d085bbb747a5", - "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500", - }, - { - "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e", - "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597", - "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31", - "d9ce7d249af9496e99c93b36", - "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb", - }, - { - "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1", - "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555", - "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd", - "7df9824e774c5f86d83cb5d8", - "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f", - }, - { - "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092", - "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5", - "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a", - "588d9bc1d98210d9700ef488", - "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3", - }, - { - "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831", - "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f", - "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34", - "34a04df283c45655a52bdd84", - "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784", - }, - { - "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154", - "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9", - "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6", - "bb21211f342379370f2642d3", - "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8", - }, - { - "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459", - "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a", - "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb", - "47cc9eea11f9f3f9aafa23bd", - "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964", - }, - { - "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768", - "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33", - "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b", - "e88c14ef96c7768f5dba9de9", - "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc", - }, - { - "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64", - "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d", - "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81", - "36c79f9f14d431cc8c077439", - "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d", - }, - { - "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30", - "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083", - "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55", - "7812a320691ca8442767a51a", - "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb", - }, - { - "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e", - "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837", - "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c", - "e4709d225a552e90fb357413", - "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75", - }, - { - "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718", - "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9", - "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257", - "8bf183347ec1ca4bceff3374", - "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b", - "0942e506c433afcda3847f2dad", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", - "d3d934f75ea0f210a8f6059401", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", - "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b", - "bc", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0", - "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d", - }, - { - "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525", - "", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5", - }, - { - "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a", - "026866d46aa940309fdcabf92a324fbc", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00", - }, - { - "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9", - "56", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b", - }, - { - "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2", - "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6", - "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", - "129039b5572e8a7a8131f76a", - "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54", - }, -} diff --git a/src/internal/x/crypto/cryptobyte/asn1_test.go b/src/internal/x/crypto/cryptobyte/asn1_test.go deleted file mode 100644 index ca28e3bcfb..0000000000 --- a/src/internal/x/crypto/cryptobyte/asn1_test.go +++ /dev/null @@ -1,333 +0,0 @@ -// Copyright 2017 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 cryptobyte - -import ( - "bytes" - encoding_asn1 "encoding/asn1" - "math/big" - "reflect" - "testing" - "time" - - "internal/x/crypto/cryptobyte/asn1" -) - -type readASN1Test struct { - name string - in []byte - tag asn1.Tag - ok bool - out interface{} -} - -var readASN1TestData = []readASN1Test{ - {"valid", []byte{0x30, 2, 1, 2}, 0x30, true, []byte{1, 2}}, - {"truncated", []byte{0x30, 3, 1, 2}, 0x30, false, nil}, - {"zero length of length", []byte{0x30, 0x80}, 0x30, false, nil}, - {"invalid long form length", []byte{0x30, 0x81, 1, 1}, 0x30, false, nil}, - {"non-minimal length", append([]byte{0x30, 0x82, 0, 0x80}, make([]byte, 0x80)...), 0x30, false, nil}, - {"invalid tag", []byte{0xa1, 3, 0x4, 1, 1}, 31, false, nil}, - {"high tag", []byte{0x1f, 0x81, 0x80, 0x01, 2, 1, 2}, 0xff /* actually 0x4001, but tag is uint8 */, false, nil}, -} - -func TestReadASN1(t *testing.T) { - for _, test := range readASN1TestData { - t.Run(test.name, func(t *testing.T) { - var in, out String = test.in, nil - ok := in.ReadASN1(&out, test.tag) - if ok != test.ok || ok && !bytes.Equal(out, test.out.([]byte)) { - t.Errorf("in.ReadASN1() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) - } - }) - } -} - -func TestReadASN1Optional(t *testing.T) { - var empty String - var present bool - ok := empty.ReadOptionalASN1(nil, &present, 0xa0) - if !ok || present { - t.Errorf("empty.ReadOptionalASN1() = %v, want true; present = %v want false", ok, present) - } - - var in, out String = []byte{0xa1, 3, 0x4, 1, 1}, nil - ok = in.ReadOptionalASN1(&out, &present, 0xa0) - if !ok || present { - t.Errorf("in.ReadOptionalASN1() = %v, want true, present = %v, want false", ok, present) - } - ok = in.ReadOptionalASN1(&out, &present, 0xa1) - wantBytes := []byte{4, 1, 1} - if !ok || !present || !bytes.Equal(out, wantBytes) { - t.Errorf("in.ReadOptionalASN1() = %v, want true; present = %v, want true; out = %v, want = %v", ok, present, out, wantBytes) - } -} - -var optionalOctetStringTestData = []struct { - readASN1Test - present bool -}{ - {readASN1Test{"empty", []byte{}, 0xa0, true, []byte{}}, false}, - {readASN1Test{"invalid", []byte{0xa1, 3, 0x4, 2, 1}, 0xa1, false, []byte{}}, true}, - {readASN1Test{"missing", []byte{0xa1, 3, 0x4, 1, 1}, 0xa0, true, []byte{}}, false}, - {readASN1Test{"present", []byte{0xa1, 3, 0x4, 1, 1}, 0xa1, true, []byte{1}}, true}, -} - -func TestReadASN1OptionalOctetString(t *testing.T) { - for _, test := range optionalOctetStringTestData { - t.Run(test.name, func(t *testing.T) { - in := String(test.in) - var out []byte - var present bool - ok := in.ReadOptionalASN1OctetString(&out, &present, test.tag) - if ok != test.ok || present != test.present || !bytes.Equal(out, test.out.([]byte)) { - t.Errorf("in.ReadOptionalASN1OctetString() = %v, want %v; present = %v want %v; out = %v, want %v", ok, test.ok, present, test.present, out, test.out) - } - }) - } -} - -const defaultInt = -1 - -var optionalIntTestData = []readASN1Test{ - {"empty", []byte{}, 0xa0, true, defaultInt}, - {"invalid", []byte{0xa1, 3, 0x2, 2, 127}, 0xa1, false, 0}, - {"missing", []byte{0xa1, 3, 0x2, 1, 127}, 0xa0, true, defaultInt}, - {"present", []byte{0xa1, 3, 0x2, 1, 42}, 0xa1, true, 42}, -} - -func TestReadASN1OptionalInteger(t *testing.T) { - for _, test := range optionalIntTestData { - t.Run(test.name, func(t *testing.T) { - in := String(test.in) - var out int - ok := in.ReadOptionalASN1Integer(&out, test.tag, defaultInt) - if ok != test.ok || ok && out != test.out.(int) { - t.Errorf("in.ReadOptionalASN1Integer() = %v, want %v; out = %v, want %v", ok, test.ok, out, test.out) - } - }) - } -} - -func TestReadASN1IntegerSigned(t *testing.T) { - testData64 := []struct { - in []byte - out int64 - }{ - {[]byte{2, 3, 128, 0, 0}, -0x800000}, - {[]byte{2, 2, 255, 0}, -256}, - {[]byte{2, 2, 255, 127}, -129}, - {[]byte{2, 1, 128}, -128}, - {[]byte{2, 1, 255}, -1}, - {[]byte{2, 1, 0}, 0}, - {[]byte{2, 1, 1}, 1}, - {[]byte{2, 1, 2}, 2}, - {[]byte{2, 1, 127}, 127}, - {[]byte{2, 2, 0, 128}, 128}, - {[]byte{2, 2, 1, 0}, 256}, - {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, - } - for i, test := range testData64 { - in := String(test.in) - var out int64 - ok := in.ReadASN1Integer(&out) - if !ok || out != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) - } - } - - // Repeat the same cases, reading into a big.Int. - t.Run("big.Int", func(t *testing.T) { - for i, test := range testData64 { - in := String(test.in) - var out big.Int - ok := in.ReadASN1Integer(&out) - if !ok || out.Int64() != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out.Int64(), test.out) - } - } - }) - - // Repeat with the implicit-tagging functions - t.Run("WithTag", func(t *testing.T) { - for i, test := range testData64 { - tag := asn1.Tag((i * 3) % 32).ContextSpecific() - - testData := make([]byte, len(test.in)) - copy(testData, test.in) - - // Alter the tag of the test case. - testData[0] = uint8(tag) - - in := String(testData) - var out int64 - ok := in.ReadASN1Int64WithTag(&out, tag) - if !ok || out != test.out { - t.Errorf("#%d: in.ReadASN1Int64WithTag() = %v, want true; out = %d, want %d", i, ok, out, test.out) - } - - var b Builder - b.AddASN1Int64WithTag(test.out, tag) - result, err := b.Bytes() - - if err != nil { - t.Errorf("#%d: AddASN1Int64WithTag failed: %s", i, err) - continue - } - - if !bytes.Equal(result, testData) { - t.Errorf("#%d: AddASN1Int64WithTag: got %x, want %x", i, result, testData) - } - } - }) -} - -func TestReadASN1IntegerUnsigned(t *testing.T) { - testData := []struct { - in []byte - out uint64 - }{ - {[]byte{2, 1, 0}, 0}, - {[]byte{2, 1, 1}, 1}, - {[]byte{2, 1, 2}, 2}, - {[]byte{2, 1, 127}, 127}, - {[]byte{2, 2, 0, 128}, 128}, - {[]byte{2, 2, 1, 0}, 256}, - {[]byte{2, 4, 0, 128, 0, 0}, 0x800000}, - {[]byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}, 0x7fffffffffffffff}, - {[]byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}, 0x8000000000000000}, - {[]byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}, 0xffffffffffffffff}, - } - for i, test := range testData { - in := String(test.in) - var out uint64 - ok := in.ReadASN1Integer(&out) - if !ok || out != test.out { - t.Errorf("#%d: in.ReadASN1Integer() = %v, want true; out = %d, want %d", i, ok, out, test.out) - } - } -} - -func TestReadASN1IntegerInvalid(t *testing.T) { - testData := []String{ - []byte{3, 1, 0}, // invalid tag - // truncated - []byte{2, 1}, - []byte{2, 2, 0}, - // not minimally encoded - []byte{2, 2, 0, 1}, - []byte{2, 2, 0xff, 0xff}, - } - - for i, test := range testData { - var out int64 - if test.ReadASN1Integer(&out) { - t.Errorf("#%d: in.ReadASN1Integer() = true, want false (out = %d)", i, out) - } - } -} - -func TestASN1ObjectIdentifier(t *testing.T) { - testData := []struct { - in []byte - ok bool - out []int - }{ - {[]byte{}, false, []int{}}, - {[]byte{6, 0}, false, []int{}}, - {[]byte{5, 1, 85}, false, []int{2, 5}}, - {[]byte{6, 1, 85}, true, []int{2, 5}}, - {[]byte{6, 2, 85, 0x02}, true, []int{2, 5, 2}}, - {[]byte{6, 4, 85, 0x02, 0xc0, 0x00}, true, []int{2, 5, 2, 0x2000}}, - {[]byte{6, 3, 0x81, 0x34, 0x03}, true, []int{2, 100, 3}}, - {[]byte{6, 7, 85, 0x02, 0xc0, 0x80, 0x80, 0x80, 0x80}, false, []int{}}, - } - - for i, test := range testData { - in := String(test.in) - var out encoding_asn1.ObjectIdentifier - ok := in.ReadASN1ObjectIdentifier(&out) - if ok != test.ok || ok && !out.Equal(test.out) { - t.Errorf("#%d: in.ReadASN1ObjectIdentifier() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) - continue - } - - var b Builder - b.AddASN1ObjectIdentifier(out) - result, err := b.Bytes() - if builderOk := err == nil; test.ok != builderOk { - t.Errorf("#%d: error from Builder.Bytes: %s", i, err) - continue - } - if test.ok && !bytes.Equal(result, test.in) { - t.Errorf("#%d: reserialisation didn't match, got %x, want %x", i, result, test.in) - continue - } - } -} - -func TestReadASN1GeneralizedTime(t *testing.T) { - testData := []struct { - in string - ok bool - out time.Time - }{ - {"20100102030405Z", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.UTC)}, - {"20100102030405", false, time.Time{}}, - {"20100102030405+0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", 6*60*60+7*60))}, - {"20100102030405-0607", true, time.Date(2010, 01, 02, 03, 04, 05, 0, time.FixedZone("", -6*60*60-7*60))}, - /* These are invalid times. However, the time package normalises times - * and they were accepted in some versions. See #11134. */ - {"00000100000000Z", false, time.Time{}}, - {"20101302030405Z", false, time.Time{}}, - {"20100002030405Z", false, time.Time{}}, - {"20100100030405Z", false, time.Time{}}, - {"20100132030405Z", false, time.Time{}}, - {"20100231030405Z", false, time.Time{}}, - {"20100102240405Z", false, time.Time{}}, - {"20100102036005Z", false, time.Time{}}, - {"20100102030460Z", false, time.Time{}}, - {"-20100102030410Z", false, time.Time{}}, - {"2010-0102030410Z", false, time.Time{}}, - {"2010-0002030410Z", false, time.Time{}}, - {"201001-02030410Z", false, time.Time{}}, - {"20100102-030410Z", false, time.Time{}}, - {"2010010203-0410Z", false, time.Time{}}, - {"201001020304-10Z", false, time.Time{}}, - } - for i, test := range testData { - in := String(append([]byte{byte(asn1.GeneralizedTime), byte(len(test.in))}, test.in...)) - var out time.Time - ok := in.ReadASN1GeneralizedTime(&out) - if ok != test.ok || ok && !reflect.DeepEqual(out, test.out) { - t.Errorf("#%d: in.ReadASN1GeneralizedTime() = %v, want %v; out = %q, want %q", i, ok, test.ok, out, test.out) - } - } -} - -func TestReadASN1BitString(t *testing.T) { - testData := []struct { - in []byte - ok bool - out encoding_asn1.BitString - }{ - {[]byte{}, false, encoding_asn1.BitString{}}, - {[]byte{0x00}, true, encoding_asn1.BitString{}}, - {[]byte{0x07, 0x00}, true, encoding_asn1.BitString{Bytes: []byte{0}, BitLength: 1}}, - {[]byte{0x07, 0x01}, false, encoding_asn1.BitString{}}, - {[]byte{0x07, 0x40}, false, encoding_asn1.BitString{}}, - {[]byte{0x08, 0x00}, false, encoding_asn1.BitString{}}, - {[]byte{0xff}, false, encoding_asn1.BitString{}}, - {[]byte{0xfe, 0x00}, false, encoding_asn1.BitString{}}, - } - for i, test := range testData { - in := String(append([]byte{3, byte(len(test.in))}, test.in...)) - var out encoding_asn1.BitString - ok := in.ReadASN1BitString(&out) - if ok != test.ok || ok && (!bytes.Equal(out.Bytes, test.out.Bytes) || out.BitLength != test.out.BitLength) { - t.Errorf("#%d: in.ReadASN1BitString() = %v, want %v; out = %v, want %v", i, ok, test.ok, out, test.out) - } - } -} diff --git a/src/internal/x/crypto/cryptobyte/cryptobyte_test.go b/src/internal/x/crypto/cryptobyte/cryptobyte_test.go deleted file mode 100644 index f294dd552b..0000000000 --- a/src/internal/x/crypto/cryptobyte/cryptobyte_test.go +++ /dev/null @@ -1,428 +0,0 @@ -// Copyright 2017 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 cryptobyte - -import ( - "bytes" - "errors" - "fmt" - "testing" -) - -func builderBytesEq(b *Builder, want ...byte) error { - got := b.BytesOrPanic() - if !bytes.Equal(got, want) { - return fmt.Errorf("Bytes() = %v, want %v", got, want) - } - return nil -} - -func TestContinuationError(t *testing.T) { - const errorStr = "TestContinuationError" - var b Builder - b.AddUint8LengthPrefixed(func(b *Builder) { - b.AddUint8(1) - panic(BuildError{Err: errors.New(errorStr)}) - }) - - ret, err := b.Bytes() - if ret != nil { - t.Error("expected nil result") - } - if err == nil { - t.Fatal("unexpected nil error") - } - if s := err.Error(); s != errorStr { - t.Errorf("expected error %q, got %v", errorStr, s) - } -} - -func TestContinuationNonError(t *testing.T) { - defer func() { - recover() - }() - - var b Builder - b.AddUint8LengthPrefixed(func(b *Builder) { - b.AddUint8(1) - panic(1) - }) - - t.Error("Builder did not panic") -} - -func TestGeneratedPanic(t *testing.T) { - defer func() { - recover() - }() - - var b Builder - b.AddUint8LengthPrefixed(func(b *Builder) { - var p *byte - *p = 0 - }) - - t.Error("Builder did not panic") -} - -func TestBytes(t *testing.T) { - var b Builder - v := []byte("foobarbaz") - b.AddBytes(v[0:3]) - b.AddBytes(v[3:4]) - b.AddBytes(v[4:9]) - if err := builderBytesEq(&b, v...); err != nil { - t.Error(err) - } - s := String(b.BytesOrPanic()) - for _, w := range []string{"foo", "bar", "baz"} { - var got []byte - if !s.ReadBytes(&got, 3) { - t.Errorf("ReadBytes() = false, want true (w = %v)", w) - } - want := []byte(w) - if !bytes.Equal(got, want) { - t.Errorf("ReadBytes(): got = %v, want %v", got, want) - } - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint8(t *testing.T) { - var b Builder - b.AddUint8(42) - if err := builderBytesEq(&b, 42); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint8 - if !s.ReadUint8(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 42 { - t.Errorf("v = %d, want 42", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint16(t *testing.T) { - var b Builder - b.AddUint16(65534) - if err := builderBytesEq(&b, 255, 254); err != nil { - t.Error(err) - } - var s String = b.BytesOrPanic() - var v uint16 - if !s.ReadUint16(&v) { - t.Error("ReadUint16() == false, want true") - } - if v != 65534 { - t.Errorf("v = %d, want 65534", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint24(t *testing.T) { - var b Builder - b.AddUint24(0xfffefd) - if err := builderBytesEq(&b, 255, 254, 253); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint32 - if !s.ReadUint24(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 0xfffefd { - t.Errorf("v = %d, want fffefd", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint24Truncation(t *testing.T) { - var b Builder - b.AddUint24(0x10111213) - if err := builderBytesEq(&b, 0x11, 0x12, 0x13); err != nil { - t.Error(err) - } -} - -func TestUint32(t *testing.T) { - var b Builder - b.AddUint32(0xfffefdfc) - if err := builderBytesEq(&b, 255, 254, 253, 252); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var v uint32 - if !s.ReadUint32(&v) { - t.Error("ReadUint8() = false, want true") - } - if v != 0xfffefdfc { - t.Errorf("v = %x, want fffefdfc", v) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUMultiple(t *testing.T) { - var b Builder - b.AddUint8(23) - b.AddUint32(0xfffefdfc) - b.AddUint16(42) - if err := builderBytesEq(&b, 23, 255, 254, 253, 252, 0, 42); err != nil { - t.Error(err) - } - - var s String = b.BytesOrPanic() - var ( - x uint8 - y uint32 - z uint16 - ) - if !s.ReadUint8(&x) || !s.ReadUint32(&y) || !s.ReadUint16(&z) { - t.Error("ReadUint8() = false, want true") - } - if x != 23 || y != 0xfffefdfc || z != 42 { - t.Errorf("x, y, z = %d, %d, %d; want 23, 4294901244, 5", x, y, z) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } -} - -func TestUint8LengthPrefixedSimple(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(23) - c.AddUint8(42) - }) - if err := builderBytesEq(&b, 2, 23, 42); err != nil { - t.Error(err) - } - - var base, child String = b.BytesOrPanic(), nil - var x, y uint8 - if !base.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || - !child.ReadUint8(&y) { - t.Error("parsing failed") - } - if x != 23 || y != 42 { - t.Errorf("want x, y == 23, 42; got %d, %d", x, y) - } - if len(base) != 0 { - t.Errorf("len(base) = %d, want 0", len(base)) - } - if len(child) != 0 { - t.Errorf("len(child) = %d, want 0", len(child)) - } -} - -func TestUint8LengthPrefixedMulti(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(23) - c.AddUint8(42) - }) - b.AddUint8(5) - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(123) - c.AddUint8(234) - }) - if err := builderBytesEq(&b, 2, 23, 42, 5, 2, 123, 234); err != nil { - t.Error(err) - } - - var s, child String = b.BytesOrPanic(), nil - var u, v, w, x, y uint8 - if !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&u) || !child.ReadUint8(&v) || - !s.ReadUint8(&w) || !s.ReadUint8LengthPrefixed(&child) || !child.ReadUint8(&x) || !child.ReadUint8(&y) { - t.Error("parsing failed") - } - if u != 23 || v != 42 || w != 5 || x != 123 || y != 234 { - t.Errorf("u, v, w, x, y = %d, %d, %d, %d, %d; want 23, 42, 5, 123, 234", - u, v, w, x, y) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - if len(child) != 0 { - t.Errorf("len(child) = %d, want 0", len(child)) - } -} - -func TestUint8LengthPrefixedNested(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(5) - c.AddUint8LengthPrefixed(func(d *Builder) { - d.AddUint8(23) - d.AddUint8(42) - }) - c.AddUint8(123) - }) - if err := builderBytesEq(&b, 5, 5, 2, 23, 42, 123); err != nil { - t.Error(err) - } - - var base, child1, child2 String = b.BytesOrPanic(), nil, nil - var u, v, w, x uint8 - if !base.ReadUint8LengthPrefixed(&child1) { - t.Error("parsing base failed") - } - if !child1.ReadUint8(&u) || !child1.ReadUint8LengthPrefixed(&child2) || !child1.ReadUint8(&x) { - t.Error("parsing child1 failed") - } - if !child2.ReadUint8(&v) || !child2.ReadUint8(&w) { - t.Error("parsing child2 failed") - } - if u != 5 || v != 23 || w != 42 || x != 123 { - t.Errorf("u, v, w, x = %d, %d, %d, %d, want 5, 23, 42, 123", - u, v, w, x) - } - if len(base) != 0 { - t.Errorf("len(base) = %d, want 0", len(base)) - } - if len(child1) != 0 { - t.Errorf("len(child1) = %d, want 0", len(child1)) - } - if len(base) != 0 { - t.Errorf("len(child2) = %d, want 0", len(child2)) - } -} - -func TestPreallocatedBuffer(t *testing.T) { - var buf [5]byte - b := NewBuilder(buf[0:0]) - b.AddUint8(1) - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8(3) - c.AddUint8(4) - }) - b.AddUint16(1286) // Outgrow buf by one byte. - want := []byte{1, 2, 3, 4, 0} - if !bytes.Equal(buf[:], want) { - t.Errorf("buf = %v want %v", buf, want) - } - if err := builderBytesEq(b, 1, 2, 3, 4, 5, 6); err != nil { - t.Error(err) - } -} - -func TestWriteWithPendingChild(t *testing.T) { - var b Builder - b.AddUint8LengthPrefixed(func(c *Builder) { - c.AddUint8LengthPrefixed(func(d *Builder) { - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; c.AddUint8() did not panic") - } - }() - c.AddUint8(2) // panics - - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") - } - }() - b.AddUint8(2) // panics - }) - - defer func() { - if recover() == nil { - t.Errorf("recover() = nil, want error; b.AddUint8() did not panic") - } - }() - b.AddUint8(2) // panics - }) -} - -// ASN.1 - -func TestASN1Int64(t *testing.T) { - tests := []struct { - in int64 - want []byte - }{ - {-0x800000, []byte{2, 3, 128, 0, 0}}, - {-256, []byte{2, 2, 255, 0}}, - {-129, []byte{2, 2, 255, 127}}, - {-128, []byte{2, 1, 128}}, - {-1, []byte{2, 1, 255}}, - {0, []byte{2, 1, 0}}, - {1, []byte{2, 1, 1}}, - {2, []byte{2, 1, 2}}, - {127, []byte{2, 1, 127}}, - {128, []byte{2, 2, 0, 128}}, - {256, []byte{2, 2, 1, 0}}, - {0x800000, []byte{2, 4, 0, 128, 0, 0}}, - } - for i, tt := range tests { - var b Builder - b.AddASN1Int64(tt.in) - if err := builderBytesEq(&b, tt.want...); err != nil { - t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) - } - - var n int64 - s := String(b.BytesOrPanic()) - ok := s.ReadASN1Integer(&n) - if !ok || n != tt.in { - t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", - ok, n, tt.in, i) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - } -} - -func TestASN1Uint64(t *testing.T) { - tests := []struct { - in uint64 - want []byte - }{ - {0, []byte{2, 1, 0}}, - {1, []byte{2, 1, 1}}, - {2, []byte{2, 1, 2}}, - {127, []byte{2, 1, 127}}, - {128, []byte{2, 2, 0, 128}}, - {256, []byte{2, 2, 1, 0}}, - {0x800000, []byte{2, 4, 0, 128, 0, 0}}, - {0x7fffffffffffffff, []byte{2, 8, 127, 255, 255, 255, 255, 255, 255, 255}}, - {0x8000000000000000, []byte{2, 9, 0, 128, 0, 0, 0, 0, 0, 0, 0}}, - {0xffffffffffffffff, []byte{2, 9, 0, 255, 255, 255, 255, 255, 255, 255, 255}}, - } - for i, tt := range tests { - var b Builder - b.AddASN1Uint64(tt.in) - if err := builderBytesEq(&b, tt.want...); err != nil { - t.Errorf("%v, (i = %d; in = %v)", err, i, tt.in) - } - - var n uint64 - s := String(b.BytesOrPanic()) - ok := s.ReadASN1Integer(&n) - if !ok || n != tt.in { - t.Errorf("s.ReadASN1Integer(&n) = %v, n = %d; want true, n = %d (i = %d)", - ok, n, tt.in, i) - } - if len(s) != 0 { - t.Errorf("len(s) = %d, want 0", len(s)) - } - } -} diff --git a/src/internal/x/crypto/cryptobyte/example_test.go b/src/internal/x/crypto/cryptobyte/example_test.go deleted file mode 100644 index 5b50025318..0000000000 --- a/src/internal/x/crypto/cryptobyte/example_test.go +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright 2017 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 cryptobyte_test - -import ( - "errors" - "fmt" - - "internal/x/crypto/cryptobyte" - "internal/x/crypto/cryptobyte/asn1" -) - -func ExampleString_lengthPrefixed() { - // This is an example of parsing length-prefixed data (as found in, for - // example, TLS). Imagine a 16-bit prefixed series of 8-bit prefixed - // strings. - - input := cryptobyte.String([]byte{0, 12, 5, 'h', 'e', 'l', 'l', 'o', 5, 'w', 'o', 'r', 'l', 'd'}) - var result []string - - var values cryptobyte.String - if !input.ReadUint16LengthPrefixed(&values) || - !input.Empty() { - panic("bad format") - } - - for !values.Empty() { - var value cryptobyte.String - if !values.ReadUint8LengthPrefixed(&value) { - panic("bad format") - } - - result = append(result, string(value)) - } - - // Output: []string{"hello", "world"} - fmt.Printf("%#v\n", result) -} - -func ExampleString_aSN1() { - // This is an example of parsing ASN.1 data that looks like: - // Foo ::= SEQUENCE { - // version [6] INTEGER DEFAULT 0 - // data OCTET STRING - // } - - input := cryptobyte.String([]byte{0x30, 12, 0xa6, 3, 2, 1, 2, 4, 5, 'h', 'e', 'l', 'l', 'o'}) - - var ( - version int64 - data, inner, versionBytes cryptobyte.String - haveVersion bool - ) - if !input.ReadASN1(&inner, asn1.SEQUENCE) || - !input.Empty() || - !inner.ReadOptionalASN1(&versionBytes, &haveVersion, asn1.Tag(6).Constructed().ContextSpecific()) || - (haveVersion && !versionBytes.ReadASN1Integer(&version)) || - (haveVersion && !versionBytes.Empty()) || - !inner.ReadASN1(&data, asn1.OCTET_STRING) || - !inner.Empty() { - panic("bad format") - } - - // Output: haveVersion: true, version: 2, data: hello - fmt.Printf("haveVersion: %t, version: %d, data: %s\n", haveVersion, version, string(data)) -} - -func ExampleBuilder_aSN1() { - // This is an example of building ASN.1 data that looks like: - // Foo ::= SEQUENCE { - // version [6] INTEGER DEFAULT 0 - // data OCTET STRING - // } - - version := int64(2) - data := []byte("hello") - const defaultVersion = 0 - - var b cryptobyte.Builder - b.AddASN1(asn1.SEQUENCE, func(b *cryptobyte.Builder) { - if version != defaultVersion { - b.AddASN1(asn1.Tag(6).Constructed().ContextSpecific(), func(b *cryptobyte.Builder) { - b.AddASN1Int64(version) - }) - } - b.AddASN1OctetString(data) - }) - - result, err := b.Bytes() - if err != nil { - panic(err) - } - - // Output: 300ca603020102040568656c6c6f - fmt.Printf("%x\n", result) -} - -func ExampleBuilder_lengthPrefixed() { - // This is an example of building length-prefixed data (as found in, - // for example, TLS). Imagine a 16-bit prefixed series of 8-bit - // prefixed strings. - input := []string{"hello", "world"} - - var b cryptobyte.Builder - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - for _, value := range input { - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes([]byte(value)) - }) - } - }) - - result, err := b.Bytes() - if err != nil { - panic(err) - } - - // Output: 000c0568656c6c6f05776f726c64 - fmt.Printf("%x\n", result) -} - -func ExampleBuilder_lengthPrefixOverflow() { - // Writing more data that can be expressed by the length prefix results - // in an error from Bytes(). - - tooLarge := make([]byte, 256) - - var b cryptobyte.Builder - b.AddUint8LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddBytes(tooLarge) - }) - - result, err := b.Bytes() - fmt.Printf("len=%d err=%s\n", len(result), err) - - // Output: len=0 err=cryptobyte: pending child length 256 exceeds 1-byte length prefix -} - -func ExampleBuilderContinuation_errorHandling() { - var b cryptobyte.Builder - // Continuations that panic with a BuildError will cause Bytes to - // return the inner error. - b.AddUint16LengthPrefixed(func(b *cryptobyte.Builder) { - b.AddUint32(0) - panic(cryptobyte.BuildError{Err: errors.New("example error")}) - }) - - result, err := b.Bytes() - fmt.Printf("len=%d err=%s\n", len(result), err) - - // Output: len=0 err=example error -} diff --git a/src/internal/x/crypto/curve25519/curve25519_test.go b/src/internal/x/crypto/curve25519/curve25519_test.go deleted file mode 100644 index 051a8301f0..0000000000 --- a/src/internal/x/crypto/curve25519/curve25519_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2012 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 curve25519 - -import ( - "fmt" - "testing" -) - -const expectedHex = "89161fde887b2b53de549af483940106ecc114d6982daa98256de23bdf77661a" - -func TestBaseScalarMult(t *testing.T) { - var a, b [32]byte - in := &a - out := &b - a[0] = 1 - - for i := 0; i < 200; i++ { - ScalarBaseMult(out, in) - in, out = out, in - } - - result := fmt.Sprintf("%x", in[:]) - if result != expectedHex { - t.Errorf("incorrect result: got %s, want %s", result, expectedHex) - } -} - -func BenchmarkScalarBaseMult(b *testing.B) { - var in, out [32]byte - in[0] = 1 - - b.SetBytes(32) - for i := 0; i < b.N; i++ { - ScalarBaseMult(&out, &in) - } -} diff --git a/src/internal/x/crypto/hkdf/example_test.go b/src/internal/x/crypto/hkdf/example_test.go deleted file mode 100644 index 3b68a40810..0000000000 --- a/src/internal/x/crypto/hkdf/example_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2014 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 hkdf_test - -import ( - "bytes" - "crypto/rand" - "crypto/sha256" - "fmt" - "io" - - "internal/x/crypto/hkdf" -) - -// Usage example that expands one master secret into three other -// cryptographically secure keys. -func Example_usage() { - // Underlying hash function for HMAC. - hash := sha256.New - - // Cryptographically secure master secret. - secret := []byte{0x00, 0x01, 0x02, 0x03} // i.e. NOT this. - - // Non-secret salt, optional (can be nil). - // Recommended: hash-length random value. - salt := make([]byte, hash().Size()) - if _, err := rand.Read(salt); err != nil { - panic(err) - } - - // Non-secret context info, optional (can be nil). - info := []byte("hkdf example") - - // Generate three 128-bit derived keys. - hkdf := hkdf.New(hash, secret, salt, info) - - var keys [][]byte - for i := 0; i < 3; i++ { - key := make([]byte, 16) - if _, err := io.ReadFull(hkdf, key); err != nil { - panic(err) - } - keys = append(keys, key) - } - - for i := range keys { - fmt.Printf("Key #%d: %v\n", i+1, !bytes.Equal(keys[i], make([]byte, 16))) - } - - // Output: - // Key #1: true - // Key #2: true - // Key #3: true -} diff --git a/src/internal/x/crypto/hkdf/hkdf_test.go b/src/internal/x/crypto/hkdf/hkdf_test.go deleted file mode 100644 index ea575772ef..0000000000 --- a/src/internal/x/crypto/hkdf/hkdf_test.go +++ /dev/null @@ -1,449 +0,0 @@ -// Copyright 2014 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 hkdf - -import ( - "bytes" - "crypto/md5" - "crypto/sha1" - "crypto/sha256" - "crypto/sha512" - "hash" - "io" - "testing" -) - -type hkdfTest struct { - hash func() hash.Hash - master []byte - salt []byte - prk []byte - info []byte - out []byte -} - -var hkdfTests = []hkdfTest{ - // Tests from RFC 5869 - { - sha256.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, - }, - []byte{ - 0x07, 0x77, 0x09, 0x36, 0x2c, 0x2e, 0x32, 0xdf, - 0x0d, 0xdc, 0x3f, 0x0d, 0xc4, 0x7b, 0xba, 0x63, - 0x90, 0xb6, 0xc7, 0x3b, 0xb5, 0x0f, 0x9c, 0x31, - 0x22, 0xec, 0x84, 0x4a, 0xd7, 0xc2, 0xb3, 0xe5, - }, - []byte{ - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, - }, - []byte{ - 0x3c, 0xb2, 0x5f, 0x25, 0xfa, 0xac, 0xd5, 0x7a, - 0x90, 0x43, 0x4f, 0x64, 0xd0, 0x36, 0x2f, 0x2a, - 0x2d, 0x2d, 0x0a, 0x90, 0xcf, 0x1a, 0x5a, 0x4c, - 0x5d, 0xb0, 0x2d, 0x56, 0xec, 0xc4, 0xc5, 0xbf, - 0x34, 0x00, 0x72, 0x08, 0xd5, 0xb8, 0x87, 0x18, - 0x58, 0x65, - }, - }, - { - sha256.New, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - }, - []byte{ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - }, - []byte{ - 0x06, 0xa6, 0xb8, 0x8c, 0x58, 0x53, 0x36, 0x1a, - 0x06, 0x10, 0x4c, 0x9c, 0xeb, 0x35, 0xb4, 0x5c, - 0xef, 0x76, 0x00, 0x14, 0x90, 0x46, 0x71, 0x01, - 0x4a, 0x19, 0x3f, 0x40, 0xc1, 0x5f, 0xc2, 0x44, - }, - []byte{ - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }, - []byte{ - 0xb1, 0x1e, 0x39, 0x8d, 0xc8, 0x03, 0x27, 0xa1, - 0xc8, 0xe7, 0xf7, 0x8c, 0x59, 0x6a, 0x49, 0x34, - 0x4f, 0x01, 0x2e, 0xda, 0x2d, 0x4e, 0xfa, 0xd8, - 0xa0, 0x50, 0xcc, 0x4c, 0x19, 0xaf, 0xa9, 0x7c, - 0x59, 0x04, 0x5a, 0x99, 0xca, 0xc7, 0x82, 0x72, - 0x71, 0xcb, 0x41, 0xc6, 0x5e, 0x59, 0x0e, 0x09, - 0xda, 0x32, 0x75, 0x60, 0x0c, 0x2f, 0x09, 0xb8, - 0x36, 0x77, 0x93, 0xa9, 0xac, 0xa3, 0xdb, 0x71, - 0xcc, 0x30, 0xc5, 0x81, 0x79, 0xec, 0x3e, 0x87, - 0xc1, 0x4c, 0x01, 0xd5, 0xc1, 0xf3, 0x43, 0x4f, - 0x1d, 0x87, - }, - }, - { - sha256.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{}, - []byte{ - 0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16, - 0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf, - 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77, - 0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04, - }, - []byte{}, - []byte{ - 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, - 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31, - 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e, - 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, - 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, - 0x96, 0xc8, - }, - }, - { - sha256.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - nil, - []byte{ - 0x19, 0xef, 0x24, 0xa3, 0x2c, 0x71, 0x7b, 0x16, - 0x7f, 0x33, 0xa9, 0x1d, 0x6f, 0x64, 0x8b, 0xdf, - 0x96, 0x59, 0x67, 0x76, 0xaf, 0xdb, 0x63, 0x77, - 0xac, 0x43, 0x4c, 0x1c, 0x29, 0x3c, 0xcb, 0x04, - }, - nil, - []byte{ - 0x8d, 0xa4, 0xe7, 0x75, 0xa5, 0x63, 0xc1, 0x8f, - 0x71, 0x5f, 0x80, 0x2a, 0x06, 0x3c, 0x5a, 0x31, - 0xb8, 0xa1, 0x1f, 0x5c, 0x5e, 0xe1, 0x87, 0x9e, - 0xc3, 0x45, 0x4e, 0x5f, 0x3c, 0x73, 0x8d, 0x2d, - 0x9d, 0x20, 0x13, 0x95, 0xfa, 0xa4, 0xb6, 0x1a, - 0x96, 0xc8, - }, - }, - { - sha1.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, - }, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, - }, - []byte{ - 0x9b, 0x6c, 0x18, 0xc4, 0x32, 0xa7, 0xbf, 0x8f, - 0x0e, 0x71, 0xc8, 0xeb, 0x88, 0xf4, 0xb3, 0x0b, - 0xaa, 0x2b, 0xa2, 0x43, - }, - []byte{ - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, - }, - []byte{ - 0x08, 0x5a, 0x01, 0xea, 0x1b, 0x10, 0xf3, 0x69, - 0x33, 0x06, 0x8b, 0x56, 0xef, 0xa5, 0xad, 0x81, - 0xa4, 0xf1, 0x4b, 0x82, 0x2f, 0x5b, 0x09, 0x15, - 0x68, 0xa9, 0xcd, 0xd4, 0xf1, 0x55, 0xfd, 0xa2, - 0xc2, 0x2e, 0x42, 0x24, 0x78, 0xd3, 0x05, 0xf3, - 0xf8, 0x96, - }, - }, - { - sha1.New, - []byte{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, - 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, - }, - []byte{ - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, - 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, - 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, - }, - []byte{ - 0x8a, 0xda, 0xe0, 0x9a, 0x2a, 0x30, 0x70, 0x59, - 0x47, 0x8d, 0x30, 0x9b, 0x26, 0xc4, 0x11, 0x5a, - 0x22, 0x4c, 0xfa, 0xf6, - }, - []byte{ - 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, - 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, - 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, - 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, - 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, - 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, - 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, - 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, - }, - []byte{ - 0x0b, 0xd7, 0x70, 0xa7, 0x4d, 0x11, 0x60, 0xf7, - 0xc9, 0xf1, 0x2c, 0xd5, 0x91, 0x2a, 0x06, 0xeb, - 0xff, 0x6a, 0xdc, 0xae, 0x89, 0x9d, 0x92, 0x19, - 0x1f, 0xe4, 0x30, 0x56, 0x73, 0xba, 0x2f, 0xfe, - 0x8f, 0xa3, 0xf1, 0xa4, 0xe5, 0xad, 0x79, 0xf3, - 0xf3, 0x34, 0xb3, 0xb2, 0x02, 0xb2, 0x17, 0x3c, - 0x48, 0x6e, 0xa3, 0x7c, 0xe3, 0xd3, 0x97, 0xed, - 0x03, 0x4c, 0x7f, 0x9d, 0xfe, 0xb1, 0x5c, 0x5e, - 0x92, 0x73, 0x36, 0xd0, 0x44, 0x1f, 0x4c, 0x43, - 0x00, 0xe2, 0xcf, 0xf0, 0xd0, 0x90, 0x0b, 0x52, - 0xd3, 0xb4, - }, - }, - { - sha1.New, - []byte{ - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, - }, - []byte{}, - []byte{ - 0xda, 0x8c, 0x8a, 0x73, 0xc7, 0xfa, 0x77, 0x28, - 0x8e, 0xc6, 0xf5, 0xe7, 0xc2, 0x97, 0x78, 0x6a, - 0xa0, 0xd3, 0x2d, 0x01, - }, - []byte{}, - []byte{ - 0x0a, 0xc1, 0xaf, 0x70, 0x02, 0xb3, 0xd7, 0x61, - 0xd1, 0xe5, 0x52, 0x98, 0xda, 0x9d, 0x05, 0x06, - 0xb9, 0xae, 0x52, 0x05, 0x72, 0x20, 0xa3, 0x06, - 0xe0, 0x7b, 0x6b, 0x87, 0xe8, 0xdf, 0x21, 0xd0, - 0xea, 0x00, 0x03, 0x3d, 0xe0, 0x39, 0x84, 0xd3, - 0x49, 0x18, - }, - }, - { - sha1.New, - []byte{ - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, - }, - nil, - []byte{ - 0x2a, 0xdc, 0xca, 0xda, 0x18, 0x77, 0x9e, 0x7c, - 0x20, 0x77, 0xad, 0x2e, 0xb1, 0x9d, 0x3f, 0x3e, - 0x73, 0x13, 0x85, 0xdd, - }, - nil, - []byte{ - 0x2c, 0x91, 0x11, 0x72, 0x04, 0xd7, 0x45, 0xf3, - 0x50, 0x0d, 0x63, 0x6a, 0x62, 0xf6, 0x4f, 0x0a, - 0xb3, 0xba, 0xe5, 0x48, 0xaa, 0x53, 0xd4, 0x23, - 0xb0, 0xd1, 0xf2, 0x7e, 0xbb, 0xa6, 0xf5, 0xe5, - 0x67, 0x3a, 0x08, 0x1d, 0x70, 0xcc, 0xe7, 0xac, - 0xfc, 0x48, - }, - }, -} - -func TestHKDF(t *testing.T) { - for i, tt := range hkdfTests { - prk := Extract(tt.hash, tt.master, tt.salt) - if !bytes.Equal(prk, tt.prk) { - t.Errorf("test %d: incorrect PRK: have %v, need %v.", i, prk, tt.prk) - } - - hkdf := New(tt.hash, tt.master, tt.salt, tt.info) - out := make([]byte, len(tt.out)) - - n, err := io.ReadFull(hkdf, out) - if n != len(tt.out) || err != nil { - t.Errorf("test %d: not enough output bytes: %d.", i, n) - } - - if !bytes.Equal(out, tt.out) { - t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out) - } - - hkdf = Expand(tt.hash, prk, tt.info) - - n, err = io.ReadFull(hkdf, out) - if n != len(tt.out) || err != nil { - t.Errorf("test %d: not enough output bytes from Expand: %d.", i, n) - } - - if !bytes.Equal(out, tt.out) { - t.Errorf("test %d: incorrect output from Expand: have %v, need %v.", i, out, tt.out) - } - } -} - -func TestHKDFMultiRead(t *testing.T) { - for i, tt := range hkdfTests { - hkdf := New(tt.hash, tt.master, tt.salt, tt.info) - out := make([]byte, len(tt.out)) - - for b := 0; b < len(tt.out); b++ { - n, err := io.ReadFull(hkdf, out[b:b+1]) - if n != 1 || err != nil { - t.Errorf("test %d.%d: not enough output bytes: have %d, need %d .", i, b, n, len(tt.out)) - } - } - - if !bytes.Equal(out, tt.out) { - t.Errorf("test %d: incorrect output: have %v, need %v.", i, out, tt.out) - } - } -} - -func TestHKDFLimit(t *testing.T) { - hash := sha1.New - master := []byte{0x00, 0x01, 0x02, 0x03} - info := []byte{} - - hkdf := New(hash, master, nil, info) - limit := hash().Size() * 255 - out := make([]byte, limit) - - // The maximum output bytes should be extractable - n, err := io.ReadFull(hkdf, out) - if n != limit || err != nil { - t.Errorf("not enough output bytes: %d, %v.", n, err) - } - - // Reading one more should fail - n, err = io.ReadFull(hkdf, make([]byte, 1)) - if n > 0 || err == nil { - t.Errorf("key expansion overflowed: n = %d, err = %v", n, err) - } -} - -func Benchmark16ByteMD5Single(b *testing.B) { - benchmarkHKDFSingle(md5.New, 16, b) -} - -func Benchmark20ByteSHA1Single(b *testing.B) { - benchmarkHKDFSingle(sha1.New, 20, b) -} - -func Benchmark32ByteSHA256Single(b *testing.B) { - benchmarkHKDFSingle(sha256.New, 32, b) -} - -func Benchmark64ByteSHA512Single(b *testing.B) { - benchmarkHKDFSingle(sha512.New, 64, b) -} - -func Benchmark8ByteMD5Stream(b *testing.B) { - benchmarkHKDFStream(md5.New, 8, b) -} - -func Benchmark16ByteMD5Stream(b *testing.B) { - benchmarkHKDFStream(md5.New, 16, b) -} - -func Benchmark8ByteSHA1Stream(b *testing.B) { - benchmarkHKDFStream(sha1.New, 8, b) -} - -func Benchmark20ByteSHA1Stream(b *testing.B) { - benchmarkHKDFStream(sha1.New, 20, b) -} - -func Benchmark8ByteSHA256Stream(b *testing.B) { - benchmarkHKDFStream(sha256.New, 8, b) -} - -func Benchmark32ByteSHA256Stream(b *testing.B) { - benchmarkHKDFStream(sha256.New, 32, b) -} - -func Benchmark8ByteSHA512Stream(b *testing.B) { - benchmarkHKDFStream(sha512.New, 8, b) -} - -func Benchmark64ByteSHA512Stream(b *testing.B) { - benchmarkHKDFStream(sha512.New, 64, b) -} - -func benchmarkHKDFSingle(hasher func() hash.Hash, block int, b *testing.B) { - master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07} - salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17} - info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27} - out := make([]byte, block) - - b.SetBytes(int64(block)) - b.ResetTimer() - - for i := 0; i < b.N; i++ { - hkdf := New(hasher, master, salt, info) - io.ReadFull(hkdf, out) - } -} - -func benchmarkHKDFStream(hasher func() hash.Hash, block int, b *testing.B) { - master := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07} - salt := []byte{0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17} - info := []byte{0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27} - out := make([]byte, block) - - b.SetBytes(int64(block)) - b.ResetTimer() - - hkdf := New(hasher, master, salt, info) - for i := 0; i < b.N; i++ { - _, err := io.ReadFull(hkdf, out) - if err != nil { - hkdf = New(hasher, master, salt, info) - i-- - } - } -} diff --git a/src/internal/x/crypto/internal/chacha20/chacha_test.go b/src/internal/x/crypto/internal/chacha20/chacha_test.go deleted file mode 100644 index bf993304e8..0000000000 --- a/src/internal/x/crypto/internal/chacha20/chacha_test.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2016 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 chacha20 - -import ( - "encoding/hex" - "fmt" - "math/rand" - "testing" -) - -func TestCore(t *testing.T) { - // This is just a smoke test that checks the example from - // https://tools.ietf.org/html/rfc7539#section-2.3.2. The - // chacha20poly1305 package contains much more extensive tests of this - // code. - var key [32]byte - for i := range key { - key[i] = byte(i) - } - - var input [16]byte - input[0] = 1 - input[7] = 9 - input[11] = 0x4a - - var out [64]byte - XORKeyStream(out[:], out[:], &input, &key) - const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" - if result := hex.EncodeToString(out[:]); result != expected { - t.Errorf("wanted %x but got %x", expected, result) - } -} - -// Run the test cases with the input and output in different buffers. -func TestNoOverlap(t *testing.T) { - for _, c := range testVectors { - s := New(c.key, c.nonce) - input, err := hex.DecodeString(c.input) - if err != nil { - t.Fatalf("cannot decode input %#v: %v", c.input, err) - } - output := make([]byte, c.length) - s.XORKeyStream(output, input) - got := hex.EncodeToString(output) - if got != c.output { - t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output) - } - } -} - -// Run the test cases with the input and output overlapping entirely. -func TestOverlap(t *testing.T) { - for _, c := range testVectors { - s := New(c.key, c.nonce) - data, err := hex.DecodeString(c.input) - if err != nil { - t.Fatalf("cannot decode input %#v: %v", c.input, err) - } - s.XORKeyStream(data, data) - got := hex.EncodeToString(data) - if got != c.output { - t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output) - } - } -} - -// Run the test cases with various source and destination offsets. -func TestUnaligned(t *testing.T) { - const max = 8 // max offset (+1) to test - for _, c := range testVectors { - input := make([]byte, c.length+max) - output := make([]byte, c.length+max) - for i := 0; i < max; i++ { // input offsets - for j := 0; j < max; j++ { // output offsets - s := New(c.key, c.nonce) - - input := input[i : i+c.length] - output := output[j : j+c.length] - - data, err := hex.DecodeString(c.input) - if err != nil { - t.Fatalf("cannot decode input %#v: %v", c.input, err) - } - copy(input, data) - s.XORKeyStream(output, input) - got := hex.EncodeToString(output) - if got != c.output { - t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output) - } - } - } - } -} - -// Run the test cases by calling XORKeyStream multiple times. -func TestStep(t *testing.T) { - // wide range of step sizes to try and hit edge cases - steps := [...]int{1, 3, 4, 7, 8, 17, 24, 30, 64, 256} - rnd := rand.New(rand.NewSource(123)) - for _, c := range testVectors { - s := New(c.key, c.nonce) - input, err := hex.DecodeString(c.input) - if err != nil { - t.Fatalf("cannot decode input %#v: %v", c.input, err) - } - output := make([]byte, c.length) - - // step through the buffers - i, step := 0, steps[rnd.Intn(len(steps))] - for i+step < c.length { - s.XORKeyStream(output[i:i+step], input[i:i+step]) - if i+step < c.length && output[i+step] != 0 { - t.Errorf("length=%v, i=%v, step=%v: output overwritten", c.length, i, step) - } - i += step - step = steps[rnd.Intn(len(steps))] - } - // finish the encryption - s.XORKeyStream(output[i:], input[i:]) - - got := hex.EncodeToString(output) - if got != c.output { - t.Errorf("length=%v: got %#v, want %#v", c.length, got, c.output) - } - } -} - -// Test that Advance() discards bytes until a block boundary is hit. -func TestAdvance(t *testing.T) { - for _, c := range testVectors { - for i := 0; i < 63; i++ { - s := New(c.key, c.nonce) - z := New(c.key, c.nonce) - input, err := hex.DecodeString(c.input) - if err != nil { - t.Fatalf("cannot decode input %#v: %v", c.input, err) - } - zeros, discard := make([]byte, 64), make([]byte, 64) - so, zo := make([]byte, c.length), make([]byte, c.length) - for j := 0; j < c.length; j += 64 { - lim := j + i - if lim > c.length { - lim = c.length - } - s.XORKeyStream(so[j:lim], input[j:lim]) - // calling s.Advance() multiple times should have no effect - for k := 0; k < i%3+1; k++ { - s.Advance() - } - z.XORKeyStream(zo[j:lim], input[j:lim]) - if lim < c.length { - end := 64 - i - if c.length-lim < end { - end = c.length - lim - } - z.XORKeyStream(discard[:], zeros[:end]) - } - } - - got := hex.EncodeToString(so) - want := hex.EncodeToString(zo) - if got != want { - t.Errorf("length=%v: got %#v, want %#v", c.length, got, want) - } - } - } -} - -func BenchmarkChaCha20(b *testing.B) { - sizes := []int{32, 63, 64, 256, 1024, 1350, 65536} - for _, size := range sizes { - s := size - b.Run(fmt.Sprint(s), func(b *testing.B) { - k := [32]byte{} - c := [16]byte{} - src := make([]byte, s) - dst := make([]byte, s) - b.SetBytes(int64(s)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - XORKeyStream(dst, src, &c, &k) - } - }) - } -} diff --git a/src/internal/x/crypto/internal/chacha20/vectors_test.go b/src/internal/x/crypto/internal/chacha20/vectors_test.go deleted file mode 100644 index b441fbd149..0000000000 --- a/src/internal/x/crypto/internal/chacha20/vectors_test.go +++ /dev/null @@ -1,578 +0,0 @@ -// Copyright 2018 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 chacha20 - -// Test vectors for ChaCha20 implementations. - -type testCase struct { - length int - nonce [3]uint32 - key [8]uint32 - input string - output string -} - -var testVectors = [...]testCase{ - { - length: 0, - nonce: [3]uint32{0x94d13317, 0x6b6a2b3, 0x3ffe0036}, - key: [8]uint32{0x9da8a3b6, 0x3abf4ae6, 0xa2f19cae, 0x1068c707, 0x72e4801e, 0xce165d92, 0x61e7028f, 0x82ac3d57}, - input: "", - output: "", - }, - { - length: 5, - nonce: [3]uint32{0x469fadd, 0xee3fcc1e, 0x45cf77b0}, - key: [8]uint32{0x3477e02b, 0x45bf809f, 0x27f4a1fa, 0xdb901de8, 0xd8a190dc, 0x1d2c21d4, 0x87bdf2ac, 0xdfbf0000}, - input: "23dbad0780", - output: "415a3e498d", - }, - { - length: 9, - nonce: [3]uint32{0x512a6b49, 0x8df9af6d, 0x5336a2a5}, - key: [8]uint32{0xe9124c25, 0x4fd1a373, 0x7945f7bb, 0xeed5f064, 0x29c4185d, 0x3c9acf13, 0x4c94a367, 0x7c2c2c53}, - input: "f518831fab69c054a6", - output: "cfe40f63f81391484b", - }, - { - length: 12, - nonce: [3]uint32{0xca697a9e, 0x6b2f6717, 0xb7859220}, - key: [8]uint32{0xfc825020, 0x5ca4410b, 0x7d5285d0, 0x160a1c9d, 0x15470b41, 0x3634742a, 0xe64aa7fa, 0xca0be67a}, - input: "805fad1d62951537aeed9859", - output: "47bd303f93c3ce04bce44710", - }, - { - length: 14, - nonce: [3]uint32{0xcded3db3, 0x35770a7f, 0x6aede9b}, - key: [8]uint32{0x44632def, 0xa5e420a7, 0xfc12a8f, 0x63b79a15, 0x337de314, 0xb82fbf16, 0x3104bc57, 0x677c9227}, - input: "f4e8a7577affb841cf48392cf5df", - output: "f445c0fb7e3d5bfdab47090ddee6", - }, - { - length: 15, - nonce: [3]uint32{0x348a50b1, 0x4acc9280, 0x8d6014ce}, - key: [8]uint32{0x34bd31a8, 0x2808f47e, 0x9d8b19f9, 0x4df59683, 0x31584348, 0x34a74a45, 0xde174a2, 0x29d4c7dc}, - input: "1179b71ec4dc34bd812f742b5a0b27", - output: "cc7f80f333c647d6e592e4f7ecc834", - }, - { - length: 20, - nonce: [3]uint32{0xc8754703, 0x9188c521, 0xac8ce8a6}, - key: [8]uint32{0xe93c79ed, 0xce89162b, 0x116a8366, 0xecdc657f, 0x5bc81d98, 0xff5d2f52, 0x171f3ebb, 0x50773f2f}, - input: "7bd94943d55392d0311c413ac755ce0347872ba3", - output: "c43665de15136af232675d9d5dbbeca77f3c542a", - }, - { - length: 21, - nonce: [3]uint32{0x9a8655cb, 0x6e9d6ea5, 0x5dad705e}, - key: [8]uint32{0x3542d5b3, 0x1f7bfd8f, 0x1038abf8, 0x7214e8ec, 0xedd05693, 0x60e663bd, 0xe8e5d506, 0xeea923a2}, - input: "1505f669acc5ad9aaa0e993ba8c24e744d13655e1f", - output: "26cad1ccf4cf4c49b267ab7be10bc2ffa3ba66bc86", - }, - { - length: 25, - nonce: [3]uint32{0x3f202ca4, 0x63fc86, 0x7260a10e}, - key: [8]uint32{0xe28ab1d6, 0xe83b3d47, 0x671271ca, 0xb977bcff, 0xa2f64476, 0x311d79b4, 0x180d91d0, 0xec1a6e0c}, - input: "20070523ddb4ebf0d5f20fd95aacf47fb269ebadda6879638a", - output: "5ce972624cb2b7e7c28f5b865ba08c887911b4f5e361830a4b", - }, - { - length: 31, - nonce: [3]uint32{0xcf8671ea, 0x8d72df2f, 0x8b5a538a}, - key: [8]uint32{0xe46ca2bb, 0xd06ab5ef, 0xb0e2966b, 0x54dd0c2d, 0x8815d89a, 0x426c30a9, 0x15b0f1e, 0x254bae75}, - input: "d10f8050c1186f92e26f351db36490d82ea677498562d8d4f487a0a4058adf", - output: "f30c11bc553b2baf6870760d735680897c9fee168f976b2a33ef395fdbd4fc", - }, - { - length: 34, - nonce: [3]uint32{0xd1be983a, 0xf5aa389, 0xfa26c7e1}, - key: [8]uint32{0x795c6da7, 0x8cb1aadc, 0xa042359a, 0x95ea2e27, 0x128253c4, 0xaabc592f, 0x391e810, 0xf641d971}, - input: "e88dc380b7d45a4a762c34f310199587867516fac4a2634022b96a9f862e17714d17", - output: "aac98ba3821399e55a5eab5862f7f1bfc63637d700125878c2b17151f306c9aec80e", - }, - { - length: 34, - nonce: [3]uint32{0x98f5f4b8, 0x3f181d73, 0x5bf4572e}, - key: [8]uint32{0xa86f8cf7, 0x8db41a2b, 0xe0e03156, 0x3dad8a59, 0xb3e4d1ba, 0x75f6fb38, 0xdb94709d, 0xc3db34f3}, - input: "b0fcf0a731e2902787309697db2384e1cda07b60002c95355a4e261fb601f034b2b3", - output: "b6c8c40ddda029a70a21c25f724cc90c43f6edc407055683572a9f5e9690a1d571bb", - }, - { - length: 40, - nonce: [3]uint32{0x7289ae18, 0x7ebe7e50, 0x7d819176}, - key: [8]uint32{0x336c07a0, 0x4a2ea22b, 0xa8872f46, 0xa47b5e28, 0xbe645e3f, 0x371c6591, 0xd2dc237a, 0x92c59580}, - input: "cf9ec6fa3f0a67488adb5598a48ed916729a1e416d206f9675dfa9fd6585793f274f363bbca348b3", - output: "bb7ed8a199aa329dcd18736ce705804ffae8c3e2ba341ae907f94f4672d57175df25d28e16962fd6", - }, - { - length: 47, - nonce: [3]uint32{0xfd3181de, 0x8b193e26, 0xbebc799}, - key: [8]uint32{0x781a4c2e, 0x27ab55e2, 0x814aaf43, 0xa0bab01, 0x9de62ce0, 0x472b03d2, 0xdfee18e8, 0x8b855b93}, - input: "be9a8211d68642310724eda3dd02f63fcc03a101d9564b0ecee6f4ecececcb0099bb26aabee46b1a2c0416b4ac269e", - output: "3152f317cf3626e26d02cff9392619ea02e22115b6d43d6dd2e1177c6bb3cb71c4a90c3d13b63c43e03605ec98d9a1", - }, - { - length: 51, - nonce: [3]uint32{0x27b02ff6, 0xa510613e, 0x218b22d8}, - key: [8]uint32{0x62fc7732, 0xcef06cf4, 0xa4f45ed5, 0x2f96654f, 0x9f2b956e, 0x42b572f4, 0x5bb59c86, 0x35e4784f}, - input: "495343a257250f8970f791f493b89d10edba89806b88aaaeb3b5aefd078ba7b765746164bce653f5e6c096dd8499fb76d97d77", - output: "62c01f426581551b5b16e8b1a3a23c86bcdd189ab695dbea4bf811a14741e6ebbb0261ef8ae47778a6be7e0ef11697b891412c", - }, - { - length: 52, - nonce: [3]uint32{0x9db97a63, 0xff50248, 0xf2b6df56}, - key: [8]uint32{0x2b657a8f, 0xfe67575d, 0xaa56d261, 0x30179a97, 0xaefcfff1, 0x9b8eb698, 0x1efe3756, 0xb4ea450c}, - input: "e37fbbd3fe37ce5a99d18e5dcb0dafe7adf8b596528708f7d310569ab44c251377f7363a390c653965e0cb8dd217464b3d8f79c1", - output: "b07d4c56fb83a49e8d9fc992e1230bb5086fecbd828cdbc7353f61b1a3cec0baf9c5bf67c9da06b49469a999ba3b37916ec125be", - }, - { - length: 56, - nonce: [3]uint32{0xc1dfec38, 0x7d7503d3, 0x9a3e3c66}, - key: [8]uint32{0x8614d8e7, 0xde9b0413, 0x2a48b4fa, 0xcbbde744, 0xad5ddc5e, 0x9144d83e, 0x74d9d617, 0x230bdb45}, - input: "9efab614388a7d99102bcc901e3623d31fd9dd9d3c3338d086f69c13e7aa8653f9ce76e722e5a6a8cbbbee067a6cb9c59aa9b4b4c518bbed", - output: "829d9fe74b7a4b3aeb04580b41d38a156ffbebba5d49ad55d1b0370f25abcd41221304941ad8e0d5095e15fbd839295bf1e7a509a807c005", - }, - { - length: 63, - nonce: [3]uint32{0xc7e2521c, 0x795499b4, 0xc7946cd7}, - key: [8]uint32{0x53fce774, 0x9a4b53bf, 0x5f614134, 0xa3c39414, 0xa8a07c72, 0x93242311, 0x43aeec99, 0x216deb5a}, - input: "03b5d7ab4bd8c9a4f47ec122cbeb595bd1a0d58de3bb3dcc66c4e288f29622d6863e846fdfb27a90740feb03a4761c6017250bc0f129cc65d19680ab9d6970", - output: "83db55d9eb441a909268311da67d432c732ad6bda0a0dae710d1bce040b91269deb558a68ced4aa5760ca0b9c5efc84e725f297bdbdadbc368bea4e20261c5", - }, - { - length: 66, - nonce: [3]uint32{0x1d41f0a1, 0x7c3b7778, 0x6991eea5}, - key: [8]uint32{0x1f213e39, 0x56261d14, 0x15fc7c2c, 0x21feccc5, 0xa95684c5, 0x26600506, 0xdadcc06b, 0xf2c810b0}, - input: "2f4da518578a2a82c8c855155645838ca431cdf35d9f8562f256746150580ca1c74f79b3e9ae78224573da8b47a4b3cc63fbed8d4e831a6b4d796c124d87c78a66e5", - output: "6fc086ded3d1d5566577ccd9971e713c1126ec52d3894f09ab701116c7b5abda959cbb207f4468eb7b6a6b7e1b6d2bc6047f337499d63522f256ee751b91f84f70b6", - }, - { - length: 72, - nonce: [3]uint32{0x749f022c, 0xa021dab0, 0x648c2252}, - key: [8]uint32{0xa1ace7b0, 0x567a0ea1, 0x52af13b9, 0xcba30c08, 0xe07a6d74, 0x5c3bca39, 0x85b2ac07, 0x3b5afc0}, - input: "55739a1738b4a4028021b21549e2661b050e3d830ad9a56f57bfcaca3e0f72051b9ca92411840061083e5e45124d8425061ab26c632ac7852118411ac80026da946357c630f27225", - output: "8051bf98f8f2617e159ba205a9342ab700973dd045e09321805eed89e419f37f3211c5aa82666b9a097270babc26d3bfe0c990fe245ae982a31f23cfbf6156b5c8cfb77f340e2bf5", - }, - { - length: 74, - nonce: [3]uint32{0x23c16ba8, 0x9fd1cd4e, 0xcb224ecb}, - key: [8]uint32{0xb694404a, 0x86b5f198, 0x10fd1bff, 0x13a84e54, 0xab21e509, 0x7443d764, 0x931b3f1, 0x686e87f2}, - input: "7ffd8d5970fdee613eeae531d1c673fd379d64b0b6bfedd010433b080b561038f7f266fa7e15d7d8e10d23f21b9d7724bb200b0f58b9250483e784f4a6555d09c234e8d1c549ebb76a8e", - output: "c173617e36ea20ce04c490803b2098bd4f1ff4b31fdca1c51c6475ade83892c5f12731652d5774631d55ae2938617a5e9462bb6083328a23a4fba52de50ca9075586f2efc22aae56e3a8", - }, - { - length: 81, - nonce: [3]uint32{0xd65f6f29, 0xf3f76219, 0x9a033c9e}, - key: [8]uint32{0xeba017c4, 0x69e0421a, 0x449e2317, 0x29858a11, 0xd0c8523a, 0xa8b0c9a2, 0xab2ca84, 0xaf011a45}, - input: "7a5766097562361cfaeac5b8a6175e1ceeeda30aec5e354df4302e7700ea48c505da9fdc57874da879480ecfea9c6c8904f330cbac5e27f296b33b667fea483348f031bef761d0b8e318a8132caa7a5943", - output: "5e9fbf427c4f0fcf44db3180ea47d923f52bee933a985543622eff70e2b3f5c673be8e05cd7acbcadd8593da454c60d5f19131e61730a73b9c0f87e3921ee5a591a086446b2a0fadd8a4bc7b49a8e83764", - }, - { - length: 88, - nonce: [3]uint32{0xc70ee56e, 0xe58ec41, 0xafd96f61}, - key: [8]uint32{0x172af2bb, 0x9085d27c, 0x8ca2c44d, 0x8aa148da, 0x290c88b0, 0x88187439, 0x18d54781, 0x633f2cce}, - input: "0777c02a2900052d9b79f38387d2c234108a2ad066cbf7df6ea6acc5a3f86b3d6156abb5b18ad4ecf79e171383a1897e64a95ecdbba6aa3f1c7c12fe31283629ff547cb113a826cb348a7c10507cc645fa2eb97b5f22e44d", - output: "368c90db3464ba488340b1960e9f75d2c3b5b392bdd5622ff70e85e6d00b1e6a996ba3978ce64f8f2b5a9a90576c8f32b908233e15d2f443cccc98af87745c93c8056603407a3fb37ce0c1f8ab6384cc37c69c98bfecf337", - }, - { - length: 92, - nonce: [3]uint32{0x3006da79, 0x2748051d, 0x72c17cdc}, - key: [8]uint32{0x60cdb7e8, 0xcecbe928, 0xe19b7ab9, 0x30d61537, 0xa0fbc199, 0x897738bf, 0xdd7705a9, 0x3e5c1763}, - input: "cf2dccbcfd781c030376f9019d841ca701cb54a1791f50f50bee0c2bf178182603a4712b5916eebd5001595c3f48283f1ba097ce2e7bf94f2b7fa957ce776e14a7a570093be2de386ececbd6525e72c5970c3e7d35974b8f0b831fbc", - output: "7c92b8c75e6eb8675229660cedcb10334965a7737cde7336512d9eff846c670d1fa8f8a427ea4f43e66be609466711fd241ccff7d3f049bda3a2394e5aa2108abc80e859611dbd3c7ba2d044a3ececa4980dd65e823dd110fea7a548", - }, - { - length: 96, - nonce: [3]uint32{0xfc0fb1ee, 0x414cc60a, 0x4144bd67}, - key: [8]uint32{0x103291c6, 0x822b03b6, 0xd29ab548, 0xc88f3efe, 0x6936056a, 0x28aaa61f, 0xa0df7858, 0xdaa23519}, - input: "e08a8949a1bfd6a8c1186b431b6ad59b106ae5552821db69b66dc03fbc4a2b970dcf9c7da4f5082572bc978f8ee27c554c8884b5a450b36d70453348cd6cac9b80c9900cf98a4088803f564bb1281d24507b2f61ba737c8145c71b50eb0f6dfc", - output: "73d043acf9dcd758c7299bd1fd1f4100d61ff77d339e279bfbe6f9233b0d9afa24992a9c1c7a19545d469fdfb369c201322f6fe8c633fcdcffef31032bfb41b9fb55506e301d049fd447d61f974a713debeaed886f486a98efd3d6c3f25fbb30", - }, - { - length: 103, - nonce: [3]uint32{0xc2030c57, 0x1e3b59e1, 0x607ede1a}, - key: [8]uint32{0xd1bac2b5, 0x56a94583, 0x628b479b, 0x3056a51e, 0x69bf8f8f, 0x2df1e03d, 0x4b9d48d2, 0x7df5c379}, - input: "a0c302120111f00c99cff7d839cdf43207a7e2f73d5dd888daa00d84254db0e621a72493480420c9c61ce1cfc54188ff525bb7a0e6c1cd298f598973a1de9fd2d79a21401588775b0adbe261ba4e4f79a894d1bd5835b5924d09ba32ef03cb4bc0bd6eb4ee4274", - output: "bc714bd7d8399beedc238f7ddeb0b99d94ad6bf8bf54548a3e4b90a76aa5673c91db6482591e8ff9126e1412bce56d52a4c2d89f22c29858e24482f177abacef428d0ae1779f0ae0778c44f9f02fe474da93c35c615b5fad29eca697978891f426714441317f2b", - }, - { - length: 109, - nonce: [3]uint32{0xf44dc81f, 0xcf6e03e7, 0xf4966796}, - key: [8]uint32{0xd7b12f4, 0x683f4789, 0xc7828fb4, 0x820fc6a0, 0xc51231eb, 0xe46716d7, 0x4036ef93, 0x26afb96c}, - input: "ebce290c03c7cb65d053918ba2da0256dc700b337b8c124c43d5da4746888ca78387feea1a3a72c5e249d3d93a1907977dd4009699a15be5da2ca89c60e971c8df5d4553b61b710d92d3453dea595a0e45ae1e093f02ea70608b7b32f9c6aadc661a052f9b14c03ea0117a3192", - output: "cbb8c4ec827a1123c1141327c594d4a8b0b4a74b0008115bb9ec4275db3a8e5529a4f145551af29c473764cbaa0794b2d1eb1066f32a07fd39f5f3fe51498c46fba5310ae7c3664571d6a851e673ded3badc25e426f9c6038724779aa6d2d8ec3f54865f7df612e25575635ab5", - }, - { - length: 115, - nonce: [3]uint32{0x8d3e461b, 0x7e05c360, 0x3bbbafdd}, - key: [8]uint32{0xf9b917c9, 0x9af89bf7, 0x7decbbc9, 0xe7e5ea7b, 0x9b4aab55, 0x90eff6be, 0xa19b6d90, 0xb9f69b1a}, - input: "275c97de985aa265332065ccce437770b110737a77dea62137a5d6cb62e9cb8b504d34334a58a71aba153d9b86f21377467b2fafaf54829331bf2ce0009acb37842b7a4b5f152aab650a393153f1ed479abc21f7a6fe205b9852ff2f7f3a0e3bfe76ca9770efada4e29e06db0569a99d08648e", - output: "b225aa01d5c438d572deaea51ac12c0c694e0f9dc0ed2884a98e5e2943d52bb4692d7d8f12486de12d0559087e8c09e4f2d5b74e350838aa2bd36023032ccbcae56be75c6a17c59583d81a1fd60e305af5053ac89f753c9347f3040e48405232dc8428c49dcb3d9b899145f5b3bc955f34dbbe", - }, - { - length: 119, - nonce: [3]uint32{0x871f33f5, 0xe4fee3ba, 0xcb8c1e93}, - key: [8]uint32{0x33124903, 0x7e0287e5, 0xe9d6988f, 0x1962405f, 0x5f21c1b5, 0x2ac695e6, 0x46b200c9, 0x9fda98ba}, - input: "ceda15cfffd53ccebe31b5886facd863f6166e02ec65f46f54148860a5c2702e34fd204d881af6055952690cd1ffa8ba4d0e297cc165d981b371932adb935398c987baff335108c5e77f2e5dd5e1ca9a017bc376cbdbe3c0f45e079c212e8986b438444e79cd37927c1479f45c9e75b0076cc9f8679011", - output: "a3f1c3f885583b999c85cd118e2ababfa5a2de0c8eb28aacc161b1efee89d8de36ddeb584174c0e92011b8d667cb64009049976082072e6262933dbf7b14839805e1face375b7cbb54f9828ba1ed8aa55634ec5d72b6351feff4d77a3a22b34203b02e096f5e5f9ae9ad6a9dd16c57ce6d94dcc8873d18", - }, - { - length: 120, - nonce: [3]uint32{0xef553ce8, 0xdfe120ea, 0x9a047e3a}, - key: [8]uint32{0xbef479c1, 0x59554f8b, 0xbf97f089, 0x52316f1e, 0x141e428, 0xff26dc04, 0xe10c8f57, 0xa7568a59}, - input: "799bb2d634406753416b3a2b67513293a0b3496ef5b2d019758dedaaac2edd72502fc4a375b3f0d4237bc16b0e3d47e7ddc315c6aef3a23fcae2eb3a6083bc7ac4fd1b5bf0025cc1cb266b40234b77db762c747d3a7b27956cf3a4cf72320fb60c0d0713fa60b37a6cb5b21a599e79d0f06a5b7201aeb5d2", - output: "e84dfb3dbaac364085497aeabd197db852d3140c0c07f5f10e5c144c1fe26a50a9877649e88c6fe04283f4b7590a8d0d042ef577693f76f706e31c4979437590fe0ab03d89afb089d1be50ae173ea5458810372838eceac53bf4bac792735d8149e548efb432e236da92bf3168bbcf36f644c23efb478a4e", - }, - { - length: 123, - nonce: [3]uint32{0xd98124a0, 0x78cd80aa, 0x3dc55cfc}, - key: [8]uint32{0x2286e41, 0xf13e38e3, 0xf735476b, 0x33c44bfc, 0xd7978797, 0x4a9c4595, 0x6080413, 0x1299fdd8}, - input: "b2d060bd173955f44ee01b8bfcf0a6fad017c3517e4e8c8da728379f6d54471c955615e2b1effe4ce3d0139df225223c361be1cac416ade10a749c5da324563696dae8272577e44e8588cd5306bff0bfbdb32af3ac7cbc78be24b51baf4d5e47cf8f1d6b0a63ed9359da45c3e7297b2314028848f5816feab885e2", - output: "ffa4aa66dd5d39694ae64696bfa96f771accef68f195456ad815751e25c47ed4f27b436f1b3e3fcaa3e0d04133b53559c100cd633ced3d4321fc56225c85d2443727bce40434455aa4c1f3e6768c0fe58ad88b3a928313d41a7629f1ce874d2c8bcf822ebdaebfd9d95a31bb62daab5385eb8eefe026e8cbf1ff7a", - }, - { - length: 127, - nonce: [3]uint32{0x53106b0f, 0xdf11fd81, 0x69d1b6f3}, - key: [8]uint32{0x736b138, 0x55cde194, 0xf8273c1, 0xf7c268e6, 0x61362bd5, 0xbb3cb455, 0x44d3c9fc, 0x7d56d3fd}, - input: "4f0171d7309493a349530940feece3c6200693f9cff38924114d53f723d090fffa3c80731b5ca989d3e924d1fa14266632cb9ab879e1a36df22dc9f8d1dadea229db72fded0c42187c38b9fa263c20e5fb5b4aa80eb90e8616e36d9b8c613b371c402343823184ecad3532058a46cf9e7ea5a9ecad043ac3028cbcc3f36d32", - output: "88c773ff34b23e691e14018ba1b2bd48a4a6979b377eb0d68336ce6192dcd5177e6b4f1c4bea2df90af56b35fe2a1d6279d253c0194dcbca9bf136f92d69165b216e4c9d1ce6b3fbe40c71e32c3f4088de352732d0e2bad9c16fd0bb9bde3d6c30257ce063432d09f19da79d49aa7641124a6c9e3f09449e911edbae11a053", - }, - { - length: 130, - nonce: [3]uint32{0x5e90ffbd, 0xa898f173, 0x269f9a88}, - key: [8]uint32{0x5244e05f, 0xf9adbe9b, 0x9e9f54ac, 0x23460046, 0x6782cdea, 0xba982c96, 0xc721506b, 0xed10f7e3}, - input: "8f8d9e18d3212bd20b96d75c06d1a63622fd83d13f79d542e45996135368772ea81511302a0d87e246dd346314cfe019bae8a5c97f567f12d82aca98dfea397c6a47dd0c419f1c609d9c52dcfcbe7eee68b2635954206ed592b7081442ce9ce3187d10ccd41cc856fb924b011f817c676c9419f52a2938c7af5f76755a75eb065411", - output: "4e130c5df384b9c3c84aa38a744260735e93783da0337ade99f777e692c5ea276ac4cc65880b4ae9c3b96888760fdddb74bc2e2694bedf1ee6f14619c8015f951ba81b274b466e318d09defe80bdbed57bc213ac4631d2eb14c8e348181d60f6295ceee1e9231ae047830ef4778ff66146621b76974773b5d11c8e17a476450f46ef", - }, - { - length: 130, - nonce: [3]uint32{0x308e39e8, 0x9aa4f14f, 0xf511db96}, - key: [8]uint32{0x833b5219, 0x4b82e588, 0x4b2d652c, 0x7c8f6ed7, 0xfe4be863, 0x9d3a50e5, 0xb888099b, 0x9f8d1968}, - input: "30d2379dd3ceae612182576f9acf6de505ab5a9445fe1a86ae75c5c29429e11c50fd9ec657b29b173a3763b1e171b5a7da1803ba5d64fccb2d32cb7788be194dbca00c3c91774c4c4c8ede48c1027d7cc8b387101a4fe5e44a1d9693b2f627626025072806083aadbced91c9711a0171f52ffb8ed5596cf34130022398c8a1da99c7", - output: "b1e8da34ad0189038ee24673979b405ef73fdbdd6f376f800031d64005a4ebed51a37f2180571223848decbea6dd22b198ab9560d7edc047c5d69183dc69b5fca346911d25cb2a1a9f830dc6382ad0024e8c3eef3aa2d155abcfe43bff01956a5e20a862fbed5c5e8df8eed0601a120caac634b068314e221f175baa11ae29002bb9", - }, - { - length: 135, - nonce: [3]uint32{0xa5feca5a, 0x753ac1b4, 0xc5a46609}, - key: [8]uint32{0xabbf4859, 0x828d9bf6, 0xf7f7aa6d, 0x25208ca2, 0xd7a4c0ad, 0x2fdd3282, 0x2bfcb8c2, 0x8389d84b}, - input: "d9404ccdcc8ef128a1b1ace4f9f1669d274ec82aa914cac34b83ac00b236478fd6167e96ec658850c6c139eb0f6fc0dd7191ba9a39828032008f7f37eb9a8df9d6cdd54240e600efe7fc49a674000c5030d825b2c5c96d0f19b8ecdbf4eeb86d3e569c5e3131abc7d6359dd4255284ccacf150d42e7a899536d51ee6db329654a4581c5ac6e419", - output: "c5534b5fb40b4834300e9577a9d87440c5272263d06e6aee84aa92cdf5d1b033145d336f26e5fe55c09a7e75753af93d0786dfc1cb435e86c67bd3ec8e766d0801b99e68691e2c3c3ffec539cf62e68285ea9027daa2716cd6f97e8eb7b9e266357a25eb2d4839a829508a6b7228f2832b3cd998f77597ae530430e6e4ecb53eb9efe456863a04", - }, - { - length: 135, - nonce: [3]uint32{0x12aa5846, 0x88604f6c, 0xc10d9585}, - key: [8]uint32{0x1491ccd6, 0x602f559d, 0xd4080c06, 0x202fabd, 0xffd3f4f8, 0xbf144c17, 0x88bf3f3c, 0x8083375}, - input: "231765f832927461f338aceb0f4cf51fd8469348c69c549c1dec7333d4aa4968c1ed58b65ab3fe3d0562600a2b076d56fd9ef91f589752e0455dd1d2e614cacfc0d757a11a4a2264bd38f23d3cca108632201b4f6c3b06477467726dde0c2f3aee01d66d788247663f1d0e66b044da9393ede27b9905b44115b067914961bdade85a2eca2844e1", - output: "1dd35f3f774f66d88cb7c2b23820ee078a093d0d85f86c4f103d869f93e2dbdd8a7cb8f101084fe1d7281a71754ec9aac5eb4fca8c365b24ed80e695caace1a8781a5a225938b50b8be96d0499752fdabd4f50d0b6ce396c6e2ca45308d1f2cc5a2a2361a8ca7a334e6ee62d466d74a1b0bf5b352f4ef6d8f8c589b733748bd3d7cda593243fab", - }, - { - length: 140, - nonce: [3]uint32{0x1c9d70f0, 0xa088a367, 0x4ec24d2b}, - key: [8]uint32{0x494e9775, 0xd07a852, 0xaf8af24a, 0xc65b825c, 0xc5e06780, 0x17fbbace, 0x651d71b5, 0xf548d8ef}, - input: "e46841f12d98aeb7710b9162d342895a971b0e3a499886bbb6aa74dc744a28d89a54542b628acdc2f693cb7c03f73fc3b74069bc3f2d000a145fb8a806cdc7d6fa971da09a33b92851cc3d1f6f5646d7fa2b1d564876feefeb63b6e66dba1c0b86ca345235bb822e0f93132346840d2a3d6eb1b541178ea51affc7b31f8da02732cc4e5bcb5d8683ae0a91c9", - output: "1dcbfd0bb2b905656c52bd7b1bcdad9b4d434ae9ac221a0d3a316115cdd4a463fa9b3444d2612a4e277d0dcd881fa6e80e59e5a54e35e1a14747aed31edf4ac24214f9d9c329ebe2157620b64efaded9976549bc4aa100d5c15be3f85f700f8a21dfe77590dfee2de9a23cc1ed1e44f32ebf68ca289b097bc13b42802dc7c75309c4afc25b5741839f7db3d5", - }, - { - length: 144, - nonce: [3]uint32{0x23067b8b, 0x5b276c6d, 0xaeca6c60}, - key: [8]uint32{0x29d64488, 0x893a2973, 0x32e3b4ef, 0x2af3d5d4, 0x95ec01b, 0xc805b64c, 0x884e8b7d, 0x798d7062}, - input: "e98e4a9550bdd29e4106f0cc8669dcc646a69438408e9a72c7cdb9b9d437b5f7a13fcb197629541c55bca1f8972a80cd1c1f591a0e24f977cdeb84763eab2648e42286e6473ea95e3a6a43b07a32b6a6cd80fe007ba0cf7f5ac7e651431f5e72690ec52a7134f9757daf0d8eff6b831a229db4ab8288f6bbf81e16fedebe621fd1737c8792cfd15fb3040f4f6a4cbc1e", - output: "5c69cf522c058790a3bc38979e172b60e71f7896d362d754edc1668d4f388b3fc0acdf40786d2f34886e107a142b1e724b9b9b171cb0e38fd78b35f8ac5269d74296c39c9f8628d848f57af9d8525a33f19021db2b9c64ba113171ebb3882075019ec7e77b51ce80b063ed41d48dad481d9536c030002a75d15c1c10ce0ec3ff17bc483f8416055a99b53035f4b6ea60", - }, - { - length: 148, - nonce: [3]uint32{0x2b079658, 0xbdf5da85, 0x8a75450d}, - key: [8]uint32{0x49c9eaa3, 0x62048819, 0x9baacfa5, 0x3870addc, 0x5c682e1, 0xf4f9fff3, 0xa3848e4b, 0xac1ebc1}, - input: "ce0f0d900dd0d31749d08631ec59f216a1391f66a73bae81d3b0e2919a461bc9a14d6a01b827e3bcb55bbccf27c1ed574157e6becd5cf47181a73c9d3e865ab48a20551027e560e965876b0e1a256bfa5cb5179bf54bd8ec65e5570e374b853b37bf4b3ef1ec612d288ebc19275fa88da9419e012f957f9b6a7e375b3377db0eb3619c731aebfeb0930772b4020d3a3e90723e72", - output: "b06981b57fe184091ef9f8ccf522a5bcdb59bf9a68a3ddb817fdd999a6ecf81053a602141cf1b17017bae592b6b6e64756631a2b29a9e1b4f877c8b2ae30f71bc921e4f34b6f9cd8e587c57a30245f80e95005d0f18f5114400785140e6743da352d921fb4a74632a9c40115ad7706263ac9b41a11609fa0c42fc00f8d60931976162598df63ebad9496dd8943d25a03fa47475c", - }, - { - length: 148, - nonce: [3]uint32{0x98e8ab8, 0x84d8e77b, 0xbb305841}, - key: [8]uint32{0x46b5f93c, 0xc8b2778d, 0x2cc5278f, 0xd2a3904c, 0x6ce5d4f, 0xc4459e8, 0x4a35c30, 0x2feadc02}, - input: "eccfd66bdc691478f354b8423d6a3f20932a1f591d8e6cefa734975fb8ee6881b6dc92c0d1d5ed54fd1999efd7f11ac697a1f130587dd895eb498c9a8fc7d1714c385ec156ecae3bdea2a3462834245e724531d0fedda2b77693a53ed7354b758e875b23cfc83219a091fb2076e7a88cd77f779ed96f8d81ffa3fe5059303ac706086494b9f2982f4f88a0c6fadc3748625004db", - output: "925529047d4177b72bf50905ba77e47608815522c1829b24046e439d5451901257903a5409fb910373167e8b7f4fdfa543a477608ddfc11bbd1efc138366961463b9915b302a346b795dd593f6fcf4fa73529b6fe83079552aabbe99474a72806f59688d826675fa7f6649b9f5307e5028853c9821b8c4a1a0fc4bfdc7c8c78b25aeaba2b5821d17b36317381a3bd578917d2504", - }, - { - length: 152, - nonce: [3]uint32{0x2e2a6e4a, 0x9a6d488a, 0xf9966cb6}, - key: [8]uint32{0x58903bff, 0xc2be173f, 0xe26128b5, 0xb6b6af53, 0x92f8eeb, 0x38cf3336, 0x7fdf90fb, 0x7ae24b37}, - input: "f0c7139c69413869bca980d7f192b2bc3f57e34ca4f26164e1a54a234e84e1aa285cc02cfbaef3dfba2dbb52a555ec1f6ef0e89d0b2f0bd1846e65b74444b5f003a7308965e67bed558689be2668ca10ca368fac072e0e4535a031af23b3c37c561e185872b86c9bceddb5c1199e43fb5f735384766d33710460b541b52d3f5b6c108c08e76724bcac7ad2d866a8bbeeea92a3d867660d2e", - output: "d2c16c7a242b493038203daec65960de384c030eb698ef6a53c36eabb7556cbfa4770eaa8bc0a2b385ad97495eeb1c03ff4e6efcb804aefa81c177dc62700a9eefe6e8dd10cff5d43a2f47463cab5eb1ee260c3826cac9bfa070f1e0435541a89ebd224d13cc43f8fff12f38091c2b3f2102d5c20d8b1c3ae4f129364bbe9f9ce2147dcf0639668ddb90dffe6a50f939f53fa7ba358e913f", - }, - { - length: 155, - nonce: [3]uint32{0x243e0198, 0x884448c, 0x9a31e760}, - key: [8]uint32{0x37e017bc, 0x9b1e2e90, 0x15679daa, 0xf94a23ee, 0xda86dfe, 0xc3eea84c, 0xdd199799, 0x6eeffb92}, - input: "7024974ebf3f66e25631c0699bcc057be0af06bc60d81a7131acaa620a998e15f385c4eaf51ff1e0a81ae5c6a7442d28a3cdc8aeb9701055e75d39ecac35f1e0ac9f9affb6f9197c0066bf39338a2286316e9d1bb7464398e411da1507c470d64f88d11d86d09e6958fa856583ace697f4ee4edc82618662cb3c5380cb4ce7f01c770aab3467d6367c409a83e447c36768a92fc78f9cbe5698c11e", - output: "ff56a3a6e3867588c753260b320c301ce80de8c406545fdd69025abc21ce7430cba6b4f4a08ad3d95dc09be50e67beeff20d1983a98b9cb544b91165f9a0a5b803a66c4e21bd3a10b463b7c1f565e66064f7019362290c77238d72b0ea1e264c0939d76799843439b9f09e220982eb1dc075d449412f838709428a6b8975db25163c58f40bf320514abf7a685150d37a98bac8b34ccb5245edb551", - }, - { - length: 160, - nonce: [3]uint32{0xd24e866d, 0xc59d25d8, 0xfcf623f1}, - key: [8]uint32{0x5f32cca0, 0x4167cac5, 0xc04943ee, 0x507fa1ec, 0xad8fdfc0, 0x6266fa2d, 0x22f05341, 0x8074143e}, - input: "8d79329cf647e966fde65a57fc959223c745801c55312046b791671773cca0af4cd48ead1f316eba0da44aa5d18025eced0c9ed97abaabb24570d89b5b00c179dca15dbae89c0b12bb9e67028e3ae4d6065041b76e508706bec36517a135554d8e6ef7cf3b613cbf894bec65d4dc4e8cb5ca8734ad397238e1e5f528fa11181a57dc71cc3d8c29f3aba45f746b1e8c7faace119c9ba23a05fffd9022c6c85260", - output: "60aea840869f7be6fcc5584b87f43d7ba91ed2d246a8f0a58e82c5153772a9561bdf08e31a0a974f8a057b04a238feb014403cd5ffe9cf231db292199198271f9793c9202387f0835a1e1dc24f85dd86cb34608923783fd38226244a2dd745071b27d49cbffebea80d9dacad1578c09852406aa15250de58d6d09cf50c3fcfff3313fac92c8dad5cb0a61ccc02c91cecee3f628e30c666698edecf81831e55ec", - }, - { - length: 167, - nonce: [3]uint32{0x30b61047, 0x810cf901, 0x4d681524}, - key: [8]uint32{0xe51476d0, 0xdf98008d, 0x59dfe69e, 0xdb39166, 0x6c1e4a4a, 0xfb76165e, 0x5180f185, 0x7359fb35}, - input: "85484293a843d2d80b72924b7972dfa97cbe5b8c6bcc096f4d5b38956eb3f13f47b02b0f759ea37014ecdecfb55f2707ef6d7e81fd4973c92b0043eac160aaf90a4f32b83067b708a08b48db7c5900d87e4f2f62b932cf0981de72b4feea50a5eb00e39429c374698cbe5b86cf3e1fc313a6156a1559f73c5bac146ceaaaf3ccf81917c3fdd0b639d57cf19ab5bc98295fff3c779242f8be486ba348bd757ba920ca6579be2156", - output: "bb1650260ef2e86d96d39170f355411b6561082dcc763df0e018fdea8f10e9dc48489fb7a075f7f84260aecc10abcfadbc6e1cd26924b25dedb1cc887ada49bb4e3e02006bdd39098ef404c1c320fb3b294ded3e82b3920c8798727badfb0d63853138c29cf1ebf1759423a1457b3d2c252acf0d1cde8165f01c0b2266297e688ff03756d1b06cb79a2cc3ba649d161b8d9ef1f8fb792bd823c4eabb7fb799393f4106ab324d98", - }, - { - length: 172, - nonce: [3]uint32{0x42020cbe, 0xad62af90, 0x29e53cd}, - key: [8]uint32{0xabad2095, 0x601ec477, 0x3bc923a1, 0x1edede1a, 0x33612355, 0x285b4858, 0xd3fd6714, 0xe0f4bcc3}, - input: "a2fc6e1b5281a4e0330eecd1ab4c41670570423173255979953142b78733b2910fa5540e8294208df6ae4f18672d5ac65acf851bcd394e1932db13c81b21e6f165e5538aff862e46126c650bbe055e54b31c78f2f0221d2631d66ef6d3f4c5ae25eada043b74d8770e2c29799c0954d8ccbd17766b79e6e94e88f478db3566a20cb890846917591a07738328d5c05f7ed4695a82607660f1239661faa9af0368aeb89726f13c2aaecf0deaf7", - output: "d8fe402a641c388522842385de98be60f87d922c318215947d4b7562d4ca1e2dbc7ee86494e65fb0bfddfdebdb2ae6469312f95b32c722b2720d64bb8d7cc3dd82f9055b1d89f05b77984f91f94ba4ac79c5129cd7c91cc751b0defc3f2799518e372d27aa683f1e7bbd4f55414c48fe8a3a37ac1f179a1a329cda775aec0d31d75a5a38addb1de67c06bddbedf4c8d87abc18c9f9dd072d457ea29ad4dfb109ce7e99a4a82fbe330b0afbb5", - }, - { - length: 176, - nonce: [3]uint32{0xa8021c8f, 0x667a02c4, 0x7a68b693}, - key: [8]uint32{0xece401c8, 0xfa805a47, 0x6d572fca, 0x9c1c780c, 0x647545e5, 0xd7ef4c11, 0x91dc1e46, 0xba2a694e}, - input: "480387bc6d2bbc9e4ced2448d9ec39a4f27abe8cfb46752d773552ad7808a794058962b49e005fef4e403e6a391d1d3f59025eeb5fb8fbbe920f5361862c205d430eac613cd66108f2f2f0bd4d95a8f6ca7bd1f917eaeb388be87d8b7084a2eb98c575034578edf1b3dafff051a59313873a7be78908599e7e1c442d883d3fd3d26787eb7467eed3a3fb2d40046a4460d5d14215565606bcf8b6270af8500e3504d6d27dacf45bace32214472d525fdc", - output: "ab81a9c28358dfe12e35a21e96f5f4190afb59214f3cf310c092ab273c63cd73a783d080c7d4db2faccd70d1180b954cd700c0a56b086691e2c2cd735c88e765e2266cd9ebe1830d63df4b34e2611a8abeeca9c8c4fac71135dafb1cb3569540ed1362ddeb744ed62f6fd21de87b836ec2980f165c02506e0c316ae3cf3d18a862954d9781f726ecc1723af4a730ccc6d6de82553450a52499acb58fb2008969401c45b2f20e12b58f308db1d199b4ff", - }, - { - length: 176, - nonce: [3]uint32{0x414e687c, 0xc6fc69c2, 0xd3ca12d3}, - key: [8]uint32{0x1b51cca, 0xbc8455af, 0x3f904842, 0x6042b452, 0xcd4dd164, 0xda83f3f0, 0xff04b972, 0xf972dd0e}, - input: "b274e61059f3215173ae226e30a92ee4b4f8a3da95f2e768e3fac2e54ddac92c200c525f190403a6ef9d13c0661c6a7e52ed14c73b821c9680f1f29711f28a6f3163cf762742ed9474dbea51ff94503a5a404adbbdfbf4c6041e57cb14ea90945dc6cb095a52a1c57c69c5f62ac1a91cd8784b925666335bbfee331820b5f7470bc566f8bbb303366aafe75d77c4df5de2649ed55b2e5e514c3cb9f632b567594a0cf02ec6089a950dbe00554ee4dfb9", - output: "a0969730d48ee881792a3927b2f5d279aba9f2ed01e6b31b92d0e1fb8ba7f35a236d838e0ce5f8654957167de864f324c870864b4e7450a6050cd4950aa35e5a1a34a595e88dd6f6396300aff285de369691b6e0e894106dc5b31525e4539c1e56df3ceedbbab1e85da8c0914e816270a4bae3af294b04a3ea6e9ef7e2aab4da5f5370df2706b5e3f000d88179ac756deaa652a1cc85e80ad9622f1bf91a2776262eb7289846d44f7f8192e763cb37aa", - }, - { - length: 183, - nonce: [3]uint32{0xdd315c1d, 0x2335da98, 0xe0a0da0f}, - key: [8]uint32{0x6419c7d6, 0xd340f42, 0x7af2f4b8, 0x3536cf42, 0x2f68c6fb, 0xac9d855f, 0x7c4d490, 0x9711b1b1}, - input: "ee849039c6cd972dc943d2a4468844d130c0150276f4e0889047e2300c3ecc6792c4527bfe9437dad877eb986e6b1aa9b867d1798c9d314243f0a87ec9ee5b601c2554876c87cbf50df3334a077c4152f8b8fef4a2d301ddbfa90c887ece757c3eb6c4fc1e0212d6b5a8bb038acaec28cba064c9b34f5364cb7f0fc2ac4ef2c7ddde0f5ba17014459eaa78f08a46a01882ebf7c6e409dadda250bb899dc8b3b70e160bbcb4412a9963b174d0fc6bc16383a46ffaacb6e0", - output: "3e272ded9c0a5cebe7cf17ac03f69eb20f62996e047501b6cc3c8691ddb2780ea72c21a81888bfea96e4373a412c55ca95648390de740102d661143043baec3976230e024477d134b8504a223c36a215b34164c9e9e1fa99a49fdc56f2f04ea525a6b82997d9bbc95c4b5baeab4dec50061efb7c1a757887acb8b47b142e0a2e61885a2c14c4642d83d718a0546b90699adc545a48129603862a1c89d8e665cde54b3ba487754db6d6f5acf6a4b95693cc569577a2dc48", - }, - { - length: 185, - nonce: [3]uint32{0xebb44f7c, 0xaf14c7dd, 0x4543cd7a}, - key: [8]uint32{0xce71977, 0x99790e86, 0x6510d6dc, 0x37968ae7, 0x2917fb9a, 0x19ef25f, 0xd282d085, 0x6128d043}, - input: "0992396a6f29b861dd0bc256e1d1b7dce88435733506a6aa20c62e43afa542d1c46e28b2e6d8e2eacb7c08db05e356fe404684b0e3a9849596db82eb788aa09258c28eb19e9838f757425b4edef12deeca56e30cf030272e325d4246d6e083219b2f965124963ca91f066d47bf5a8282a011a78b0155aa70038259a4a59135f241fd2f88c908b9f4eef7b7df0f3a1c16a52c009b522f89dabd52601bbf6e3ce68732e1a6d444469480f06da218786cf6c9666362e7a7f7be12", - output: "545c05a84b5a4fffd1dd623c8f2b11443818560bdb0c26dadd3b694d4790d294b99059f4127b7cca122c4000954d745af96094ff4623f60db33e994bb6903263d775f48d7047427b3a498c2ecde65bd37bcb8ee7e240a1e08c884c0079cab518f4e1c38ba5ea547f4da83b7c6036e4259bee91c42e8fae895df07781cc166f1d50e1550a88ee0244bb2950070714dd80a891aa8a9f0580a67a35cb44609b82a5cc7235f16deea2c4f3667f2c2b33e8eeef944e1abdc25e48fa", - }, - { - length: 187, - nonce: [3]uint32{0x35cb7190, 0x212e9a86, 0xbc423ce4}, - key: [8]uint32{0xfa19cede, 0x576ae8f2, 0x58055dab, 0x91b3355d, 0x69d2501a, 0x736323c2, 0x266c1385, 0x134f4557}, - input: "3b9efcbbb607fad5e9f1263dad014cc5c2617d439fcd980408f4f9a93acb1a33d1c3a22f38c037e4603dfbbfb5571bc08c4a1958cbbf510e3e4dd19007fe15fad7808369149a9c4db7ca0496f7a600a6f2454ee1cffd5a68d45c270e4b53ac9b77f33a1ffbb1804244f57d2b05b8036fe2cda9efead3d4eff074ea5c07128e0b354a4a11ffa179163933bc6bd10d200804cc93b64575746e94e975f990bddcc8a4335e99e2459fbe9bc0e004ffcd6cac52f48ef55cc0637a75c1dc", - output: "631ba7301e33236da2477506ea98d3b732447389e849b68e1f09bd5fd814f40dc3247a1012fa654f08e3dda0c104ee2dff12ecf5cb018644de50d70dfb6c8cc1f5f552e5f1e50466bbb538ad6b98fd37f33fe615c326efc9cc97899b829b007f91569fa9b28ce0076c53daedf9cc0f838e22cf1125b86a6a2c2eb4a45dadea45ad00fb4f054e7d6b09c13ab1dd5328debfbf4f1b70af2b8a5b1d02df8a87d7661473e0c180ba4c815f14db87c5bdc15f11a29d8e0ce3d747d5dcd4", - }, - { - length: 191, - nonce: [3]uint32{0xccc941ac, 0xdba45b02, 0xab0d7ad6}, - key: [8]uint32{0x9b750752, 0xa627090a, 0x967c95f0, 0xf8ff2c3f, 0x69beb97e, 0xa30b99c1, 0xadddc83, 0x443f9baf}, - input: "f28a71efd95e963e5e0bc0fcf04d8768ce93cb55dc73c32e6496022e214596314b7f843f5c7b136a371c2776a0bfbdd534dccbe7f55e9d3d3b5e938f2d7e74393e4caf6c38fa4b05c948e31dc6a9126817fa3d7892c478f75ab9f6ab85c0e12091bd06e89c7d3ca8d9dcdd4c21fead3d769a253919c2c72dd068474ea322b7e71cafa31684e05a63e179e6432fb70661792cc626a5060cec9e506b35d9286f15dc53cc220b1826314eec337dd8e7af688e5950b2316c30516620569ea65aab", - output: "1bcea54b1bf4e6e17f87e0d16388abe49b988b9c785b31f67f49f2ca4011ecd2ad5283d52ef707dd3b803e73a17663b5bfa9027710e045a0da4237f77a725cf92792b178575456de731b2971718937dd0e9ea12558c3fa06e80bbf769e9799f7470db5b91476d6175f1a6d8e974fd505854c1230b252bb892a318e6d0c24dcc9ecb4861769cd746abab58805bc41c6086a6d22b951fba57b00c5b78f6dcb2831715b9d4d788b11c06086f1d6e6279cd130bc752218d7836abc77d255a9e7a1", - }, - { - length: 198, - nonce: [3]uint32{0x987e7c58, 0xcc839a94, 0x30952e60}, - key: [8]uint32{0xe34a286f, 0x4adcd996, 0x97168712, 0xa82dde8, 0x14249e5, 0x5e82810b, 0xb4a445e8, 0x9579adb0}, - input: "c1d1ede73bd89b7c3d4ea43b7d49c065a99f789c57452670d1f92f04f2e26f4f5325c825f545016c854f2db2b3448f3dc00afe37c547d0740223515de57fd7a0861b00acfb39931dc9b1681035d69702183e4b9c6559fb8196acbf80b45e8cc5348b638c6d12cea11f6ef3cc370073c5467d0e077d2fb75e6bf89cea9e93e5cf9612862219ca743ef1696783140d833cd2147d8821a33310e3a49360cb26e393b3fee6dba08fcda38d1b7e2310ec1f715e3d8fa0c6b5e291eea07c25afd5c82759a834a89cc5", - output: "11a8493cdc495c179f0d29c2b4672997205a9080f596ee3c80d79b55162b1c875ac18eb94bf2a9e05b08024f524a1e9665912394a330c593d23260e6bdf87620c10a48f678693196fb744c49054182fba667c601e7b7ebf0f068e8d69ba004b804fda616a4a0d5350e1a3bd424b8266462be282308219c578569aefc1ccd09ecdf5da283356c9e524e14e69d25b0e19643dab26f54373a7272b43755c3f1ddaee6c5fb9e8e093110c41697e95f73a68c75454e050239197c9fbd8cec76698bd11894ebf6e2b2", - }, - { - length: 204, - nonce: [3]uint32{0x851f025a, 0xe6f3c800, 0x85ae7530}, - key: [8]uint32{0x2d0dbe47, 0xda05e465, 0x42f6b3b2, 0x7026e79e, 0x9e446680, 0x691df976, 0xf7b23da2, 0xbb3421fa}, - input: "37b2dc4b6a5203d3a753d2aeffcdaed5a7c1741ed04d755dd6325902128f63b6981f93c8cc540f678987f0ddb13aae6965abb975a565f0769528e2bc8c6c19d66b8934f2a39f1234f5a5e16f8f0e47789cd3042ca24d7e1d4ddb9f69d6a96e4fd648673a3a7e988a0730229512382caaded327b6bbbbd00a35df681aca21b186bc7ac3356d50889bbf891839a22bb85db4c00bfa43717b26699c485892eb5e16d1034b08d3afa61f3b5f798af502bba33d7281f2f1942b18fb733ca983244e57963615a43b64184f00a5e220", - output: "b68c7a2a1c8d8c8a03fc33495199c432726b9a1500bc5b0f8034ce32c3e3a78c42c1078e087665bd93c72a41df6bfa4e5beb63e3d3226aeeba686128229a584fab0c8c074a65cef417ad06ab1565675a41cf06bb0fb38f51204eccccb75edd724cdd16b1d65a272f939c01508f0385ca55ac68a0e145806317cc12e6848b1124943a6b2d99a8c92083fc5f31ab2e7354db3f8f2d783dbf1cfec9c54f8bfcb93d6f28ef66f18f19b0fab8836458e9b09bee742ba936cb2b747dd9dcf97ca7f6c82bf0af6f1b433592d65143fe", - }, - { - length: 210, - nonce: [3]uint32{0xaebfd97f, 0xf583442d, 0x15ab2f1f}, - key: [8]uint32{0xd3d1cf9b, 0xe43187e6, 0x5071a757, 0x412a83b4, 0x3f27716f, 0x17fdc488, 0x271f77ed, 0x6c4bb056}, - input: "68c2c5612912b5f994172720130dff092ee85a2c1395111efa64d5a281ca864d3db9600e685854d81c6de7e8747b92fb7c4c2efa829d3d4c0c9fc9d689e2e5c84c9eae8ba4ab536fb6c7523124b9e9f2997f0b36e05fb16163d6952eee066dd22fb7585925ffded0204cc76818bcead0d1f8095ca2cf9cd1ddcd0361b9c9451940e14332dac4e870e8b2af57f8c55996447e2a8c9d548255fe3ed6c08aedaf05bb599743ecb0df8655152bbb162a52e3f21bea51cb8bf29f6df8525eb1aa9f2dd73cd3d99f4cca31f90c05316a146aab2b5b", - output: "d0ae327fa3c4d6270a2750b1125145bdeef8ab5d0a11662c25372e56f368c82c6f5fc99115a06a5968f22ffe1e4c3034c231614dd6304e6853090c5940b4d1f7905ef4588356d16d903199186167fec57e3d5ce72c900fe1330a389200ed61eec0bdc3672554f1588ec342961bf4be874139b95df66431178d1d10b178e11fcbd26963ff589d5d5faf301b7774a56bbfa836112a6ea9c3026ebdd051085f9131132c2700674bef6e6c2c5b96aace94eb2ba6c0e0aef0eefa88995e742ca51ac50af83683b801b7c2c5af4880e2b344cc5564", - }, - { - length: 216, - nonce: [3]uint32{0xf9e973b8, 0x2485a6a7, 0x2ea7dee6}, - key: [8]uint32{0x96edef11, 0x8cf57f26, 0xb6e3a83c, 0x9ef434c6, 0x4607ea48, 0xace87e4d, 0xa0d87475, 0x3a9c9458}, - input: "fed3d1efa309c8b50cb9da02b95167f3b77c76e0f213490a404f049270a9c105158160357b7922e6be78bc014053360534add61c2052265d9d1985022af6c2327cf2d565e9cef25a13202577948c01edc22337dc4c45defe6adbfb36385b2766e4fa7e9059b23754b1bad52e42fce76c87782918c5911f57a9394a565620d4b2d46716aa6b2ba73e9c4001298c77bfdca6e9f7df8c20807fa71278bd11d6c318ed323584978ad345c9d383b9186db3bd9cec6d128f43ff89998f315dd07fa56e2230c89d803c1c000a1b749107a3159a54398dac37487d9a", - output: "6a95fba06be8147a269599bccda0ce8f5c693398a83738512e972808ec2f25bc72402d4bcd1bc808cc7772b6e863b0e49d1d70c58fcf4fcaa442215eeb3a4648ade085177b4e7a0b0e2198f0acf5465c97bd63f93781db3f0b9a0a184c3e06a76c4793a13923f83b2242b62511c2edff00b5304584cbe317c538de23785d2504fae8faabee81c5315298186ce3dcbf63370d1ccd9efec718cbc90b3d2e0b0b6aefb3a9b31e4311f8f518be22fdc2b0f00e79a283701c53f6936dd63734ecb24480d5365d1a81392498faf9a1ddee577007acc5f8c87895be", - }, - { - length: 217, - nonce: [3]uint32{0xe3bd4c44, 0xa3b75a31, 0xfe92010f}, - key: [8]uint32{0xdd05ab8b, 0x5ac7cd1, 0xb8113720, 0x53524706, 0x8e0ceea1, 0x52eb23e7, 0x1c85730b, 0xb33914d5}, - input: "d776bee5625d29a2ebf6fec4df94d2b9ac62e8e7c56704fd38a87ee932b787cbc555621535e76ea30183cb0ee30604f485b541f45feb8c01b9750d37fded5cdffbbc34fb90fdc9c7c7ddf949a1d50b796f1ea5db437238c7fb83c4b22c9e491f75b33d84746f1cd10bfda56851b8514ff0ded0adfd5092a66a85202d06bd967485d06a2c56011110da74bf40b6e59f61b0273164744da02ce2b285d5c3f03aee79eea4d4503e517177692ed3bb035071d77fc1b95c97a4d6cc0d41462ae4a357edf478d457c4805fa586515614697e647e19271091d5734d90", - output: "60e9b2dd15da511770162345251edfb15cea929fb79285a42f6c616dfde6befc77f252e653b2d7902a403032fc4ce4934620931a2ec952a8d0f14bf1c0b65cc287b23c2300999ed993446eb416749bf0c9c7dfe60181903e5d78a92d85e7a46b5e1f824c6004d851810b0875ec7b4083e7d861aabdd251b255b3f1fd1ee64619a17d97fde45c5704ab1ef28242d607d9501709a3ac28ee7d91a3aac00cd7f27eb9e7feaf7279962b9d3468bb4367e8e725ecf168a2e1af0b0dc5ca3f5a205b8a7a2aae6534edd224efa2cf1a9cd113b372577decaaf83c1afd", - }, - { - length: 218, - nonce: [3]uint32{0xcdabfd50, 0xd10d5b99, 0x9e160a85}, - key: [8]uint32{0x8231a4e9, 0x89f33c8b, 0xf96b11b, 0x853cae9d, 0xf6624a33, 0xee9523ee, 0x28bb7853, 0x688ac6f8}, - input: "4f57848ff5398e61bcafd4d4609bcd616ef109c0f5aa826c84f0e5055d475c6a3a90f978a38d0bd773df153179465ab6402b2c03a4bf43de1f7516eb8626d057ae1ab455316dd87f7636b15762a9e46a332645648b707b139e609b377165207bb501b8bccfa05f1bf0084631c648279afdf51c26798899777812de520f6a6f0d3c7f3ef866982f5d57f9c8d81c9a4eabb036651e8055a43c23a7f558b893dd66d8534bf8d179d8aa7d9e8987cfdaaa7b5a9381ba9c79d5c1161b1bdbd30defdd304ee07f19b7ba829a0d5b40a04b42edd6407b68399caac69069", - output: "e096cc68956ed16d2dea1154a259e01647913eeea488be0b54bd1816c781a35e161772ae1f7a26b82e864ade297a51cc9be518641b2e5f195b557ec6fc183e4e5c1fc01d84fe6ca75e5b073af8339427569b1b8ee7fcff0ffa5e7e6237987c40deec0abf091c06a3b28469c8f955fc72e4f3727557f78e8606123e0639dff782e954d55e236448f4223ff6301accda9f8fa6cd43a8d6381e5dde61851a5aec0f23aeca7262659bc793ce71fa7992f80e44611ae080b7d36066e5c75c30851306f0af514591d4d5034ecdf0d6c704bfdf85473f86141c9eb59377", - }, - { - length: 219, - nonce: [3]uint32{0x67de323f, 0xa0442ac9, 0x9d77b1d9}, - key: [8]uint32{0xca8d33d4, 0x834349d9, 0x5e68d581, 0x99a7c30e, 0xdc7f6038, 0x697e8b63, 0x284c2ece, 0xee3e3bfa}, - input: "046a61c0f09dcbf3e3af52fab8bbcded365092fad817b66ed8ca6603b649780ed812af0150adbc8b988c43a6ada564a70df677661aff7b9f380d62977d8180d2506c63637c0585dcef6fe3f7a2cf3bbb7b3d0df7769f04bf0f2e3af9439ab7615c304b32055aea0fc060890beb34fa9f90084814b6ed7363b400dfc52ee87925c5b4a14a98e3b50c7f65adc48c89ddd6414626c5e0bdefabab85c4a0e012243e682d4931be413af62fd7123ab7e7774fcae7e423bf1d3a31d036195437e9ea8f38aa40182daa9aacf3c9f3d90cc0050977c6065c9a46bcca6ba745", - output: "cd5a6a263e3ee50dda0e34c614b94c3ec1b14b99a2f4095a6b5715fdfc3449fcdf8a09d1ae02d4c52e5e638f1ee87a4a629f99f15a23dd06718792f24285f5a415e40f698752c697ee81f2f9248da1506ce04a7f489f8e2b02e6834671a2da79acc1cdfb78ea01822d09a1c4a87ffa44e56c4f85f97507044cf946ccb6a2e06e2917bac013f608d75ee78fa422a5efc9c569226bf7068d4705fde3a9fad2030256db0acf9a1d12666e0acf9f5346ad62e5af4c01a008d67ab1224b3e98278d073116ff966cdc779fb3aff985ec9411a3eefa042d71dd4ae5b15d5e", - }, - { - length: 221, - nonce: [3]uint32{0xa36a3d5a, 0x1747a05f, 0x5440eb4}, - key: [8]uint32{0x2d701ee6, 0x143d5a1a, 0xbb67b9ab, 0xabc88ccc, 0x20baad8f, 0x6507e48b, 0xdb1e1b39, 0x9e521d80}, - input: "af516216f74a6344cbe458cbba820f7e25c0b10aa84b790da2ee6317e059171076d7246c2878be83fc00c200d546c007f849e4c163d52c7b0da31beff4abff481be3266b92e668cf4dd1c84d9d7b3e5191dcd6ddb51d17d337621046e83e9ac035fccfb239648bc3c6fd340fbb50707e5a33b3ef439d292192d0e4bc727690c61450e5a28789e5ea50e746bc66d039493e080fb70e9ae06d89004cb71de8178941c422f1e9862492fc9149a4864ff52b1277b9f5a63c2f16e9adb5263cf65a034a62ebb0f1a385d2681c87a35f1c45670b4edef1c68fe9544fcf411d95", - output: "b22ffd8f0e549bd3e0206d7f01ff222f92d39b41cf995a331d5ef0cf5c24bcc3ddb36e64d351b5755400246fe4989b5f912e18daa46cdd33e52dafbd2872f16e94220b56315d72c1dbb1525fd34831d7202970c11711ff36de3fc479407c34fef0aea86e172f9beb0f393194355b9dd59625639f4a6bf72ba571c229f2fb053c1114e82793deb2dfe8232f1a327949689d2fb2820662dcd2a39a2546c7df12b3ff7e87e58c74badf568cddebd3c558f0f7874c834c4b8aa988653f138ec79620f5e3ed737690928a30f981dca9f2920ac7307607063b40f87c204de47c", - }, - { - length: 223, - nonce: [3]uint32{0xb92be022, 0x1e1257c7, 0xad7c01e}, - key: [8]uint32{0xca1dbb9c, 0xaadb9504, 0x77b8a95c, 0xc50deb5e, 0x2dbc0fb8, 0x9e654bc2, 0x94d8925a, 0xfe9cfb66}, - input: "a3d70bdb509f10bb28a8caab96db61652467cf4d8e608ee365699d6148d4e84d5d93bdabe29aa4f0bc8ee155f0b1fb73293c5293929eaacdd070e770c7cccfb2de120b0c3811abeeddaf77b7214a375ca67d618a5d169bb274a477421d71a651cfb9370bcf7e0d38f913754c11002089cf6cd6a8de1c8a937fb216591d57b37efdf3797f280773950f7eddeb9c3385c8315ff5ff581c64610a86ada7ff6a1657e262df94892dff9fdfb6e958d101f4c26296470c138dc4e1ca4bb565b3ff877a7f78b3d11d64b7c24e27ba6f6b06f6e368f5ac218cd5d11b815ab0987678eb", - output: "646314264896a6e25601e536f6e783d465b2ead1e0be4422bc9cc8eacabae4a749ad533eb28091be8397328dcfb34c92006bbda930ab070ed7b806095bb1c8f476350e7b08ffbd4d7d6055c8defaa8deff9d54f5215c2d7db27ce09e08f5d87a859145ea3126e2a01882921c3fddef3985bd451bca44063258390aec8ec725b07d064314fe43a9c83e9287b47616dfefbf539b82da209aa08a6d3176b7e3b4be4a17d44e581280a684e4a64414649bfcea82b541729f8178b580e8b972a89f5b8c4f9b68205e9396d8ae5e81873b61da074080fd44c52d50fb0880ee9c35da", - }, - { - length: 224, - nonce: [3]uint32{0x5091927, 0x661c75ba, 0xc23dad}, - key: [8]uint32{0x2e00499d, 0xafdc63db, 0xc3c62efb, 0xb4157a19, 0x84ce8b13, 0x85326279, 0x2ee71e9d, 0x318721e4}, - input: "f48b5ae62f9968baa9ba0754276cd8e9dcfa8a88e4571856d483ee857b1e7bc98b4732e81f1b4421a3bf05ab9020d56c573474b2a2ac4a2daf0a7e0c3a692a097e746d12507ba6c47bec1d91d4c7cfc8993c6700c65a0e5f11b1ccd07a04eac41f59b15b085c1e2a38b7d3be9eb7d08984782753ae23acdafbd01ae0065ab9c6d2a2d157c1fc9c49c2444f2e5f9b0f0bbfb055cc04e29b2658b85d414b448a5b62d32af9a1e115d3d396387d4bb97ba656a9202f868b32353cc05f15ae46cbe983d47b78ba73d2578a94d149e2c64a48d0c1a04fc68baf34c24b641ea0b7a800", - output: "b9af1016275eaff9905356292944168c3fe5fdffd9e4494eb33d539b34546680936c664420769204e91ead32c2bb33a8b4868b563174d1a46108b9dfe6d9ac6cc1e975f9662c8473b14950cbc9bc2c08de19d5d0653bb460bea37b4c20a9ab118a9550bfeb1b4892a3ff774e8efe3656adcdf48239f96e844d242525ee9f9559f6a469e920dcb3eaa283a0f31f5dfac3c4fac7befa586ac31bd17f8406f5c4379ba8c3e03a6992a1915afa526d5ed8cc7d5a2605423ece9f4a44f0c41d6dc35a5d2085916ca8cabd85ac257421eb78d73451f69aaedeb4ec57840231436654ce", - }, - { - length: 227, - nonce: [3]uint32{0x5d6d997c, 0x9d623987, 0x5742de36}, - key: [8]uint32{0x57b2a5ea, 0xc5bdd68b, 0x99c7b0c6, 0x26aea960, 0xba5c75f1, 0xa904cf6b, 0x685031de, 0xa0f0e99}, - input: "b39101601efa2ecdf41878b0fd920a3005ce709e4ec2970abb76e32c232ea21069f81b246eda75aace7555ce8ae203455d3723e684bd671389300e353eec0d2f499d10654fafda2e7a69bfca7198eb172249167ca8864b5d5f58d28723090ec86e251a1bac0346d52fd81f06e0c05429e0b2b895588290b7d00878a4da3378eb6c7e61487de2b318fedf68fa7ad7c88ee746827c1f60d98c7716f3f9695c5ffd4670f71a0fa78a1fb554ba482c5de83feaed7c65fc71acc9f541342eb8f7622b12bb2cfa222fa2ddd8b3ed210ce442275afa3132c8a0e17dd504ecbc92525c118952be", - output: "50eb5b21c179a03b9a822f0075906a3ce4acc32486139f92635c7d834f69071d5a6dc0e15ed06a5cee37147071d59641d140a82ad5815b954e7f28e080c3dbbeaf13943d7b7c66d49d51ba1132eeadd4cb7a7e7d726d08d95f1578d55519f267f753f3e16ff39504a87b2286d8bfba0fe6bc28887b466bf276453a82cdd0abbbbf08db0e1c26c317d50ad9b8dc09cd621bc566d362024e8404739df6468869d2125c58b25d70e392f5e75924c4341be81c263915bb514ad436fb24c2c67450e84f6d1b72d1a02a3310c07a7814d930264fdbbf5ddca7067e18e8a44faa87169b7f2e35", - }, - { - length: 233, - nonce: [3]uint32{0x75bca707, 0x89f6d1f4, 0x2a6f657a}, - key: [8]uint32{0x949f42cc, 0x2b5d3c48, 0xfe0be473, 0x17ac92aa, 0xbdc9d9dd, 0x74f9df26, 0x26487508, 0x7c7b41a2}, - input: "0a42f63b975ad0e12a1e32615813dfd6f79e53ce011e2a2f0534dd054689f8df73a8326fecfd517ff7fe530d78081af66c3a8c7c189eb9d9efed1e5577b5512d42ef1fe273f670ce380c64bc62e217a7e410a8ed89998344e29301e4e053a3a3cf7e71587fd056a6bd976f16e157476a06997dfaaff32172dd84190570621f2221420c0a0ea607ea756e9792c8c0e7157c95b89c9490e20b750ee85e4c27c9b8f409e848ec90afcad33342010bb9808358afbcb3d9b094127c38c243a204e76899677079758e7cbada9a5c18363449eebc07bab516a16372722403a046df85c7dd2ffc804c54d38aab", - output: "87a47bcaa1c1eb8e55151011c4f39af4b9e108a55a7124cdcf66d0dee727306e6971f783b038bd6b215f530cdbb53e17975742ec304fdb3792a88b674504396978c6a5e4a9c87a7c3ca430d61165c1a3f6162eeaf38c93e18b6ccb6a595ad428cdc98efef8f84463eed757a72ffd827b71c0579fcc1f4baa11812be2bc5a2a95df8e41d04b33343df09ce628c367d1f88488f7a2787f013c8e76f0b9257cee777ec4adc6df8c5790e41ea02da85142b777a0d4e7c7157a48118046935f8888b5352d1750bf00b92843027a349cf5685e8a2a2efde16dcf5e1c1ed8c779bb38cabfb42ec4dd87d58273", - }, - { - length: 234, - nonce: [3]uint32{0x5003a4f7, 0x40bd8cde, 0xfe35fb25}, - key: [8]uint32{0x576e49d9, 0xe84e9df, 0x9f227a3, 0x437c9de0, 0xc46ac8de, 0x1a6a2d2b, 0x42ab7684, 0x4253fbb6}, - input: "abeff48fa082dfe78cac33636c421991b0d94c3bc9e5bd6d22763601a55201fa47b09ce60cb959ba107020213c28ae31d54923d1e74ab1d9ddc2762b2d23d8c6961d81068230884a39682fa4b30676ffec19319362c075df0b879a0f083a67b23597bf95c4bb997fae4736479cb8a9c00520ba2f6e5962d54c313c576180d17779ff239ad60f1f1373627770d50a1c49718b2b2e536846299e052f8c1a5d3079e91cb1b8eac4661daac32d73b3b99e2051f8f694a61d1e9d3935f802921a4d979b6ade453cf30d73a4a498a6a2c5395c60fcf271d50b4967ac12b0d7bf818c2679d552e9b3b963f9f789", - output: "a0d11e732984ad575570ed51031b8ac2d7b4c536f7e85f6fce9ef5d2b946cefe2ee009227d6747c7d133ba69609f4a1e2253d0eb59d1f930611e0c26a7c0cf2d2ce7ccea6e079eadf2eb1acf0463d90fb4b3269faae3febfc88cb9fb0873d8b74894506199394c8e44a96e6b479bd3e045749cce1c3f57243abdb37e67084eb573cd820c6cee424227019592a027e9da8f7b8997bfb292627a986f83c8fb8d156a91a12a8b52659cf9272924631745ed3a2453a4c2d87a167faa9104e799c715ed597bcb66949ab15dae29a86ba147507e8d8af66e96c09c53caa053ad3b79d9ed3c0c6c00169eaec3a3", - }, - { - length: 237, - nonce: [3]uint32{0xc6ae48ce, 0x26f0906f, 0xfd8ab8bf}, - key: [8]uint32{0x42b82c50, 0x7f519e0d, 0xcbb95098, 0x6f75e532, 0xe2c9f61b, 0x5a4af942, 0x2679777b, 0x6a8e1c9c}, - input: "a77b7a5870335b9145fd2e08ec898ba2f158fda16e8a2661a7a416857b6ba6937b4843ecaa79d3635d28383af80290842de9ca0bb621ee22b7fd6bf379922741e812b1739c33dd6923d0607826fc84d46bbdbd1fe9d1255f56a167779a560a6eed1b9c9579b8f771147df467e67a070d9e9ce8ad92dc0543d1c28216c1dec82614ac5e853ed49b6abac7eb3426ef0c749febce2ca4e589d06ccfc8f9f622ede388282d69ceb2fd5122ba024b7a194da9dffc7acb481eabfcd127e9b854be1da727483452a83d1ca14238a496db89958afd7140dd057773ea9a1eee412875b552d464ba0fab31239c752d7dd3d9", - output: "b330c33a511d9809436ab0c4b84253eeda63b095d5e8dc74803de5f070444a0256d21d6c1cf82054a231b43648c3547aa37919b32cfd9893e265b55545be6d7cd11d3f238ef66c3c278fcccb7dd0dc59f57750562cb28da05d86ee30265ff6a3991a466ba7e6208c56fc8862e19ac332e5fb3cbcc84e83a6205dee61a71acd363a3c9de96d54070a69860c152d4ceb9c4b4cc3b878547b6116699885654b11f888dc3c23483a4b24fbe27c52545c06dd80ab7223d4578ab89bff5f9cbf5d55b19611a5251031df5da5060a1f198226c638ab5e8ec5db459e9cd8210f64b2521a2329d79228cc484c5065ef8a1d", - }, - { - length: 244, - nonce: [3]uint32{0xea38678b, 0xc41eada, 0x3381147b}, - key: [8]uint32{0x268fc2ac, 0x21297e86, 0xdf9ef8cf, 0xd4b45234, 0x2a95c4f2, 0xcec36ce3, 0xd5fa38c9, 0x7dc43790}, - input: "322d634bc180458123e10d0509870b54e0f0a3a72a2bd9e9cf44324c7a1ca37dd6adf9db1fcc8dadabd881f91d47d93b58382802b42ee936802fac8612ea4dd9eca5f215935ea9ba6233b9c8bddba3385861de669d95c888c8977851cb305db577a4eb2360f362fa459d61ffc8fcaa1502905b073bd8e9567ac7cff8e5fb1002c55641a3af5fc47ac0131fae372f073e19721ffcce9821e0241d7fa67bfc499c8f100e050d39bd4d7cae4557d208629603ec4a007852762ec1905d0e81b873510fd334dedcd9c288eb8415db505913af06bea94d197ab627d58f6a9944f6c56247595fc54ae3f8604aa37c3466f74561131e11dc", - output: "edbfb1090987762f75eba2439d746cdbefe8605b8ebad59e075d28b54edfe48813ccae891f6ed655c5ab5211ba896fff0c8e09bd1554aad987dc53f355d0822e9b0f524a99a79c68a9f3b4e30506cd725b07be135e4540078be88dac64fc545c433837b96a924452f6b844291c4c3fb5f8cc94f06d9f19dad7fc945f093020e82ed19f9eb3ddff68b813629991d1a460e5455e1cb41cf23bb3d96fdb6b96581c3bf9ef72814406329bbbba5b835e7724c728cebe88efcd996dea71d0fd5c53e081c21ce8b3764738d693e390fbf8e0137a716760fc9cd2014cd9bf3fd706bc3464d1f15803606976e96b1077cda0a62921ff7c32", - }, - { - length: 250, - nonce: [3]uint32{0x883ac584, 0x8fb8e7d5, 0xdf07de66}, - key: [8]uint32{0xc7747e47, 0x853d88c6, 0xbf9aa631, 0x78f16480, 0x7c248080, 0x15ff973b, 0x31528a40, 0x629686e5}, - input: "e6b8a9012cdfd2041ab2b65b4e4f1442794fdf1c3685e6622ce70f80b9c2252ba6d9e6384d474a7622053d35df946a3b19408b3e1712da00525070279ce381359b542a9ad7c07750e393e0834593777352c1f7dbc84cc1a2b1eba787377d2cb1d08a7d20e1393d44022107acac5d765be37f9075af02e4bbf8e60ceb262aa34e2b870cc7adcf54329a667249cb4958393bff4f4333338cae45cbca419d59e605aa0cecb1241080339198b9b283e4201afc07360b8ae2a57b0b9b97167c315f03fd7a87a00ae73f91ca560a1505f3cdf04576b9aee5ea775f719916f1e1942ad5311c7f87153f8e62855ace3f34afb08d4d7c7f4fd2bf83e42f76", - output: "fc2673c80812d101bca7a2e0e105fa449550e695a016596f5c3cde11fb7dc518b94fdb74058e634546a726c37896110e1d1f9cdeccba1c89958041061ded8e8bc2751ec6dad76a305e70c57f9c81a5a65b5116390af4f7bf7053a03ec13f5d60a58cc5ba61f8c46ef6d2d291de490082dcfdf294aeb3a9414d64e4bd6497d4625acfa591627bfd98f0aec7e7def71515c09942db6911d73b96b4bd2d6df03bb729e945d71549d40e4bc401e1f73baf263a74280537692240638619f92645a5ade1eb8151191c7ff8bd715b3c1cd667e69745b806e16d46d9aa680a7367b8fb45a1598631cf3d44c1f5cfcd95bc8dafdb65a2083905a6937fcf21", - }, - { - length: 256, - nonce: [3]uint32{0x79cd7a62, 0xae619be, 0x7d96d236}, - key: [8]uint32{0x7dec8e64, 0x9f12b14, 0x6c70df2a, 0xeae0aa0d, 0x27b1ac14, 0x7a00d833, 0xe63c0aca, 0x189438e2}, - input: "0cfd93b195e37dd15dfae83132c24ed5bfce7fe6fad4064b213b2c31a39e39ddad2f977e904c9c5b055ed03db46fcdd845bbb6ff0ab5a8c92e89295b6801f36ae63eba61fba24a3858aeb36f2da226b23b24d7b2c7d2670f23a9a1b60db85c0ecee584bef1b00e42d10ca17432a74bbb220d88356d82c850da4c09dd5baf413caf8f9479e02a330065fb865489c0f59605d56146ec8434182345de2d15e2a1dceeeee2fe94871d41913f6788738947ed9849ca0ae985e3e19a97bee82b96feeddceb196c9b6012264661945981c279f43db9599a4ef01116f592478619690daa64387290484d21e8d2444751194e1f361fb37f04014a3c7e4b409e5c828d8990", - output: "0502848571d1472ff10bec06c1299fad23a2cb824d88bf91b5447c5139500bd837a2fddc629e4a964e84907c1e6740263f1fef4f5ed41062982c150d9e77a1047b7d86c0e191945e8db00ca3845a39560857fc9e0e4a394eea4ba80a689cb5714c4bab7124ffdbfa8bbb91c3eb3caa1621f49dba1eea3ebf1d547ee337f9085638a12317b86c11aa1525813445107038942fc519eebdc1b98d313ad822bf0b94a054259aa8cf1be4b3a68f974269729941747f9a23fa5d83453071b431dac62274c24f6a32248b0785ff90aad5840fadc89af0aef7553d9352cfb00d3999ffbe28cd9fde7854e95710f4532b8bf5011e518c93361e58d22a2302182e00e8bccd", - }, - { - length: 268, - nonce: [3]uint32{0xb7581e00, 0x9a1bba92, 0x64356674}, - key: [8]uint32{0xdc2c9fcd, 0x5e50de1a, 0x8546466b, 0xc1b49b21, 0x36a670cd, 0x2887f367, 0x2fbf4300, 0xf90a0374}, - input: "0d8d864010ce8df1c0179cf0236dce1c100f9c115eaa5294c24a2e1afa27f9d57ebc18f00482be0218d44262bd4db73002ff53c6388f5e333470aced2a42a73b376686c8d02e05ece27cdd8b1e3f675c715981f8b656d68d0e16227b529cf881d2433e4371fbcd933eaa72346e77e688ac80ee95324512c66a4c16338cf38c941b72c21c3d01e005a07c0eb436014fb1ee61806de7e96842ca3217ab8c7607d609dd2f637f9fda8a85cb0549f262c9e4a955c384319a6ad2b696e2593d7d174f5ddb98e2a8d5d12558c18ab67571e9a0202e91ce26d720cbe41a3a6a4f309296ca4d9d9a59a9043dd2e5a707ed7d5034023d5ea06ab14b39b7852e5c984848d5670c6f2f0b189c2a8a4a4bca", - output: "d2a5693c9d503a8821751d085a0837579233e65b691366e4a7464481d22800e786939349f721a815f28b4e47c8889f0814fb95d592d1185e45d6dbcac14ffa4f1d6c79194f2f7eb7323439d9607edf80f01e3a968b483eb93c01d9cb9d3625d21d66927e7aeedc1d9bd589560ed2b61cbed5ad0e0310c8ebe140c64c67d4909c010902d5386efa359ab60a9573493d3e5d8761cfd4023eba23de48372032d4673b5f6ad66cd0dfab02a73aa81f269ae88fcabb3ae9cb09f6bf60fd3575a3046bc6843f444e1e9fb9ff9b991620344fb99da68df09496b40f8b9dfc34e830a87f65710940603ebab554d36e8b4c9228bc9c26c07b828f34cdfdd40b161717236ba325e8c20bd018b324345e09", - }, - { - length: 305, - nonce: [3]uint32{0x2c641fcb, 0x5170c7e2, 0x62a23688}, - key: [8]uint32{0x5aed5915, 0xc5c4cc18, 0xf0e51574, 0x75d894c6, 0x1b7082d1, 0x5d2ea1db, 0x709fd24, 0xf5f69898}, - input: "07c50a69e168e388caf6f91471cf436886a3de58ef2c44795d94fba6538add8d414d84f3ef0ac9377fd5bed6aa6805a695f3a711025550bb6f014893c664e09bd05f4d3b850771991fc02f41c7353cd062156243b67fce9c1f0c21eb73087a5de0db0578923eb49bf87a583351e8441c7b121645bcb64ef5960fdca85af863dca7ebb56662e9707d541513bc91bf9b301431423b552e2c148e66ecfd48045ecb3a940dd65694d7fc8bf511e691b9cfd7547fe7bca6465b72ff9f1748723c4eb14f8bc1efb2fbc6726115c597a3881e0d5019335daf2e5ea8796c2a8b893ca798c4ef2639465505c4bd492bf7e934bb35be9b66c9f35730736c65fa4c1a2485378b9d71912cb924634a8e0db2802b75728818dc00fc28effdf1d8a05e4de4608bb6a78bb19c377d5ec77dca1b5ad38fded7", - output: "3dff5fde2ca24bf419e13cb7d12368e70449d41f2aa22e4b567f5cbdbcf3257975e44097deb180f2621ec36acf375dad3b7a19234b9856dc6c7842a7f86be00304b41a8c1662a02e8390346cbd0ff6be7bc1ceb821dbd805ab5c93c9c6ea5093249b5dc52081cbbbe1b326e831ef3c6c42fb791790086d1586f7daf031e70a71b54e9134f942e9ce229fc77980eb80c985ee0c5965eaba375d156f9b423b0615f4ca6fd77de28e28f35aba327e4f1b75725730155b7b4d6c5c264bf3d9dc9a16e7ededcc261add8c666278bac5cf0b3275d6d6678060eae30bbf2ce5f63e6a53a450b65aa0adbd1c90cf045f5ddd9700c2a99c80586c5244cf4c08035b6ff630c82cec3a4fcc83860e987898b42fe746939f8b37c814f8dab65de276e9784fb90f0751d3ba0826889e1e7e4fdbf8a90942", - }, - { - length: 430, - nonce: [3]uint32{0x99b172cc, 0x91056d0, 0x48057533}, - key: [8]uint32{0xe6cf398e, 0xc3c56066, 0xc5ff194c, 0xf6d2d8c4, 0x6d1d8908, 0x63e62065, 0xcca485cb, 0x1eb03dd6}, - input: "3ddcd3c00014747903c95e49f64258615455a0b26c5070a9532382a9bbd18eeb19c9fe1a902f5c6baf544c5938fc256d310a9332223dc3c54a6eb79a4b4091c3b01c798d2800418863f2865c1cd8add760e445588576d4a6c945e1d6d50dc913674daa4737ac94d84eb0ff57cda95df915989c75adc97c4e3c1c837c798a432ba4803a246bb274b032db77e5c1bb554a5342ef2e5d3ff7f102adb5d4e282ad800ccae83f68c4bfd3b6046786a8cfaa2b63c62d64c938189b1039ae1a81ce5c91530772cca0f4a3470ba68e4e0548a221eb4addf91554e603155a4592dc5c338aa0f75a8cc2822b318fbfba4a8f73fa08512132705dae792eed6b809c251d35cca60c476406d964187b63cd59333771e37367671d0ccb393f5b8bde77bebc133485ec5c66bdd631d98cdbee78a3cf435d2f824fa2f9e91e89af28b2e155df4fb04bbe4ce0b6162dcd8e81ee8d5922ebf9c957b26c343a0396d91f6287a4af9e11b7fbb5a5a5c1fcdb186365a20617d4ff5037b0bfa97b6213a6ebcf0b78b81c65737378787b255cba03d715fed4addc2c70c1fb4d3ab16f2bff287186c26a164dae2fe9dbe3c4a2e1617f01cae79f", - output: "ecea5fc18dc4aed23359cacb8f79a457512e0a27d9816f353e315519d2b2faf74d14ae8ae5e227b203823998a47a050c363a807f45f610942fed4518b8091b88dff8b2af8fb6552eb654c85d2b6a918bcf56fb898392941d983b1afd867ef840e12313059ed3e4d217498dd511563a939c3c536fbbf8e019deed29262f0a655fc680b15939475e0cee0ce2e8bab5834f7354b93e2e0958a5bc608fab369b6aee3c9d73a6898e402484eac7300150517bbd137bf55762897696a3dc4be74b0c141755ac8f2f6e59f707b1690c451a774c46bbe195d826a6784f8d807b78f8ebc343ecacf37cb9b1b2fdbff6a1237b5098853d783e77515c419894c2628f8b5117042294ee2ed58a33746f9e79b13fdfaa25a75fc95340a89076e786e0ecad7de437a9a3fb3092146d255005b22895310b1252a3e34572cf74665b97f4adc30dd0f34e3216c7757953a4b618a775bbe68f9e0922d75afc80a1379aaf1745f2263afb6f0b37553d9c984f1ef781ea75b1980c559c77565c83f3e0bd7a3cd7cdb594658beb7e5eb940633dbc6ae2f50383beea676cb6c814b17b1d73dd133f544da88ab371415889ead21803c1ffe3f2", - }, - { - length: 449, - nonce: [3]uint32{0x2adb4a6d, 0x33d00c1c, 0x10a0193c}, - key: [8]uint32{0x8bd707df, 0x70212019, 0xdb685581, 0x9cdbd1a3, 0x7db9ff1a, 0x1af119ee, 0xb1d8c0ff, 0x3c4a22cb}, - input: "93ce72a518ae892e00c271a08ead720cc4a32b676016612b5bf2b45d9ae9a27da52e664dbbdf709d9a69ba0506e2c988bb5a587400bca8ae4773bf1f315a8f383826741bfd36afeae5219796f5ce34b229cac71c066988dbcae2cbcfcdbb49efcf335380519669aaf3058e9df7f364bfd66c84703d3faaf8747442bdd35ac98acdc719011d27beba39f62eab8656060df02fab7039223f2a96caac8649bc34da45f6f224f928d69c18b281a9b3065f376858c9fd10f26658ae21f5166a50fe9a0d20739402eec84f5240ee05e61268f34408089e264e7006a59bb63eeaa629ba72603e65718d48e94e244e7b39d21d85848d5f6f417631f3876f51b76b6c264356d7d7b1b27bbac78316c5167b689eff236078cf9e2e4626a4ae8bedeecbcaf6883e2e6e9304969b4fc7a4280dcdc5196267e9bb980e225fcbf7a9b2f7098f7f5c9edd06f50c8791edaf387ff3e85ff7bee1f61e4660fddd4eaf5ab0320508e3ccaa9823ae5a71faa86bd76e16d862d83ed57bf6a13de046a3095a74a10c4da952b3c9b8fbde36048537f76eef631a83d55d3a13096e48f02b96a5a8da74c287a9164ce03ddf2f868e9ca3119ec41f0233792e64086c903eb9247dbae80e923eae", - output: "bcf49d62dcd1cff9dc37d7096df0c39031e64ccaeea3830fa485edb71b7fcf2ec709a4b327ef9c7d4ea2b35f113a8485d4c236e06b3baccee30e79c6c08739fe5fbed59db30479b56dfbe584a5d79b169b200430ed27072137e940a34170606b31f22095f2151b4d9b901f6337f991a23e4c8997a1ebf5105361fdade1c889b8dc9565e3b33e0bd608c39d725becbb60da8a797186fe0986736112da3d09906442364d6e253e5b27fd5ad72e877c120ea7a11d42b19948f0df5ddabf9cf661c5ce14b81adc2a95b6b0009ece48922b6a2b6efffdf961be8f8ec1b51ad7cfc5c1bca371f42cdac2389cbddcdc5373b6507cdf3ffc7bfb7e81487a778fcf380b934f7326b131cb568bbaa14c8f427920aa78cc0b323d6ea65260022113e2febfb93dcfce791ab6a18489e9b38de281169f1cd3b35eee0a57ed30533d7411a7e50641a78d2e80db1f872398e4ae49938b8d5aa930c0c0da2182bd176e3df56ab90af3e46cdb862cfc12070bc3bd62d6b0387e4eee66d90c50972427b34acaf2baff9d8a76002a20f43c22ac93686defc68b98b7b707d78d0e7265aabadde32507a67f425cbd16c22a426d56b9892bac3a73dd2d2c03efdb22ecc6483f8d1ca67fc7d5", - }, - { - length: 487, - nonce: [3]uint32{0xecf15215, 0x45e31add, 0x56499d31}, - key: [8]uint32{0xf5988496, 0x49bcc2df, 0x7b4ba3c3, 0x5d5138be, 0xd6cb466b, 0xe98c82f8, 0x147d3f27, 0xc82389f0}, - input: "f72bec13b0f0b6f2317118f14c2a0d8e963b1bd49ae7584e710dbde75bb1e30c79281847cb822a5f3ae4fa56825e511212f17f0d293cfe80f872e6992d304e9283d08ce65ceeacb003b36a862c91282a22536e0b9c19953512a1bf9e20d3e7a8f1a2dff45dec0b9b04c592e88a7814540cf636a024d10008463d0b3aafbc4c9359889149433ef173124866aa6f53526ef3b3f2c630860ecdd08ffd9fc050e95da512cc87f812f9391085cdec5cc87258b8560806a52336d612da7ab05e0f60566b950904aa27c975a48c7d78455728c87f9b53aa4978374ab9592e12c22d9a760e26eb527133534ac5bbf969596b71cde8b4ef3587fa7ffa7116834348c275ad4dce68ab3397521ddc8e54380129cc81b981f9b32db20dddb0ecaa0f1ff7b06495a42b4a800a207b8e9ca38794e2fa9f40546e0e3aef7b5236d7fdadd72b1158714a5ad8d6264df1e75120088e449b9e911eddac59f1f19a795205ab7532783a93159876133b3fe3a518475a545fbe8dd2ac143f33c35d98e3ee13b63606b1e671917ac3ff9412773a3ac47b8c6627b8ba9dde6820f4f16c2ed9cb7d7086cfbb0cf2d7533eff253d14f634ab2aad3fb4289b9a0bb667a6fdd0acd5949185d53f1dd2b96ff060bb44f872a67259100669e6eaf1a7e2b11dd5fc35792db0c44a1127765934a068bf", - output: "bb618ae6b7739a4dedde1dbacf864b0892b93dea3007237d2f6f23be0718bdd29321e6b0fcb6a44dacf0f5c53d91e16165997e2302ae7ebc2dbd02c0fd8e8606a4ad13e409a4e807f331cf4174171c5fff23ca232192906b4eefdf2ffb4c65af78be01b0ba7d15b4341dd5a2edd49b17db2812358c8af0a4a9724e0169f50d1d331936bc2400012a60849876c3ead52cc9fe60173c9992f83f3e41ebd24fe3961835109612994c7620280539d483f91ef9a64c16032a35612a119589efe6357fa35b19531274576e304be75bc7e91d58015792095bb00ce4de251a52b946554366ea7ed9ce9317020ec155ae0071e022af36ad10eda5d671e5090c136e381cecdb8bc179474fabc7dab2d8a134772976cf0791b6cebe2333d34b4b8e2b6b2eab2b5dc7c6a08a583d091df64328cbcde36bc1b81095d82c741a1503c55d833d551a855e098166c5efffb8e4146e32e54abcaa85076ca6660abdfca9e82824217b5d3f23f7ff3455872bc76751480c1a8e3e725365c82fc135cd3713cc0f1ea733754142f8c37716a2a4fa8a6b898215c287565325774c2510df6b49e78cb986853ac5ca532c9a7e2bceb7c0157f60433f29fe29009343d6035d7b5892c77f821b644590615dc505604501dd218dcab789e6f0525387919cf25c7c6d62a8979e39d346decbed2657", - }, - { - length: 511, - nonce: [3]uint32{0xba68c47, 0xbc020097, 0xbf7d14a7}, - key: [8]uint32{0x3bbeedde, 0x6e8f4d6c, 0x6e27cd72, 0x140ff360, 0xc891efa0, 0x4aaa227f, 0x733cfef2, 0x2b51f1f3}, - input: "96eb94e1adbcc0646440c8824a2fc0f2c4b17d9cbddbb8ba8d9dbd6482fbf7201c74eb923153e0138b2f6f182f9c3d5656ee40bb7c26a01740b5c7d125261d4e4197614800aa152b402ba581bfbf4288e73c9ef7e7e37491212b921420eaaff880eeb458e3d0aa108b01b53492c97e328e9d10e3220b924351d583c00e76aee9325d6b89b1f162ffa30b386b37b5eaf4dfc25d22987dde4496158818c4d8f19ea300fe140be921d3f1abdaf9ab8946833a57cda5f41f995ff80e98b0f10f7afd736dd33438dfd395547f11563056078ff8f7c202aac262955f0ca5dae2365472de40f069028104ac552ea5a45ff2773335e5d3242f1e62e0e98003333dc51a3c8abbaf368f284536672e55d005b24b7aeba8e4cef23289adc12db2213aa037c797e7e753ae985568199cfe14cf1704fbca443e6036bdd05859e3583897cbefe7a0cf268b75d554b2da6e503ee04b126fbf74eaac0ebca37e84ab9c726973af780fe2bc9869fe67b7d9e4a04062ee535b2c1740d1347224e211b5cd37ee14c3325f40abee930eb6a1634986e756b3a1f86a3d7ee7184d95ea948506d8ab8b23f92ecf3eb0586f7a8b1bc227e08a0e32ca75ca4eeffc5c0a2a623547788bca66f3dc2c48671e462544d52a87d34307a7f111aeacb7da50262deab33d9f29dd6b47c3bb555be598d619cc66be8c4b74b01772725268a43d467f39bc565e5efcd0", - output: "590965d18ebdf1a89689662cfae1b8c8a73db8b26941313006b9b9bd6afa6a57149d09a27390b8883069e4fc2dfcf75035def1f8b865e24c21b1a1ed3e9f220d7b48046577b661bc92d9888a912984ad415ea2fc92c9e37da0bef5c7dab11495c612c27b5babe6eee28fd26482272fce69ca7f11bac95251735ad808365ac587830ec04105304f8e440a4da47d30e788718da4282941c9c76f18de4f954b8be750b54cb1145489edf273625a0df9a694a23fe7bfea12579b53c3b2a3de85705568cd7e603f3b8beba9a14cad9979ea283a8a291d3e1105b7f890e2a569804d9b7dd4c7e50bd0dcd11223fd7247af77f04212ece1b98c238d2fa0386a994bc502f83dcdd2e5a0d45b185155e1a395d91726d383c2c198fff1590e983c65ee041638510787c8c59c2e96f31678226a033e027bb40c416b73c3dbef31affc93a659c8ec7ffeca313fd5283a80533b2d63941c8f245d22b160c5fe57c5fa4b759c407b9acd6d9c4f80f244360b9acd11e2b43d4af757e16a6ef9d6756df39ca3a8a235e74351f50b2ebf54df633c8c400fd80b41b07117676d486377095660f2f20f62c034563b4560b473a8f4d6a740306d2a822fd8bd98012a840ba9b1709df9a0d61ecc305f7180fd764e334045d9a8ca23cb8036c05616a8b21fc488429ba4168c59dfa231f0ffa668a3be7b16583df1a55bb9c15d51660ddeca730d66f7a9", - }, - { - length: 607, - nonce: [3]uint32{0x9419df54, 0x4593f2a, 0x71c06dd6}, - key: [8]uint32{0x7b517740, 0x41e86353, 0xed629408, 0x5fe32cea, 0xb06bc5df, 0xaec9b350, 0xc00c2a6f, 0xb3aaf44f}, - input: "be3f309c6e7b89e1ec4a855cf161156d09f8a04d5630534ee19e9e071e3f4603f23f0c59a7b7f8a32c4c203ec8c129a268faba09abde7b61135c6c37fd091e2d695f0e242488098ebed30c7d321f4dcef0bdd23fa85a53569868cf2008bf4d2ee7a12a6673298c7e797321b9f4559748223b590e6fcf17aa72251586b01181cefcd32c6a1a20a0fc27143426f6572b1aab0e7301e390cb857f912d78d5153906c698ee140b36cdc72693cc019cb7add747ca3a07b2b82a2332bfa76c962b186ad94209fcf590ed0f6a73b08a771a58eb9649f2f1da4f7c385da83d50c939231f745514d14b0920deedd9c4dc6d2e547f83643d13541870875e52c610372b14b602e7a47f0b3721cfca60ec68e2eee91f40ceba2d0fdb4ebe19cb1d1ab170726c9e600030454ef355f9a40033672be520e528937f38e7a862a5ae50cd94f667cd015a72ee3f91b1a09031bf4c207e0c516b2e7a4baedf373f1ee71843e560741ed3a3094d2b513e2248caf27ce135716f6887d9f1fe5b11e02c12c989d29054ab183a3f55d9b40d78e12ff56edf936ab966c7c3130bea472b71fd69e70165a76afbf720e2c1587a77943b35acfd81b2ab6f39476623edf3663024fb84da8057ed3a361e9533caf9fc58a5e4897e4bf84f58ed063b5c353bdca3792952eec0a1404149ebeb5b17cd6350ab3e27e44e40fbcb00780d001a48d0365d534ff830553409919608881e665f83bb5cf0736d728c41cc4e985c377f89ee1186303d0d76bc634875ab3ebd87059969f24b0464ae11967bcc47f300a34e3b917b1affceea716c5ad9abf1aa3a1106e2f4d006514dc62cfd2a52426968f2f3991c9f9d8fcd", - output: "e4032c01bcece73fde73961ed216820dcb44ce20134678c98afb674bb03afec2f4aacbade7f87a32fff57ae9213eaf0509e9d9db1313b06fd1df53561f85896ba627cccd2d0e2ae4f24f5579bf02f6599f5e63412ba084cf53a5bc9a8061b5c029b755329fcd73f629fadd3bcf6cb4c572fea86466cb5159d19eaaf0f44c3471d0323bc7206bb514ed8117a61c6d98d44faff6a83716657531d965ba3efbcf067c452e0d2807db3423958d9a4421886fe132d7c47e82086db9507616b67f0051dffc1a49ecce3ca8e4d5f5af15684cd8837a471430ddd333ea0b6ee603b7d9e702692f857fab060ccf26f2a8e61dfd3b12923acca78b83a6004e4ff09113becf6bdd0bec3a449a195559dfeafd4e2a79ead5ae3c993a15ad9b1a2ce818e18edb010b7fece9aa437d85ba9841d89026d6aac1a3a6ab6dad932a26d7db6f3664b06d51584cf4d22a75c06e2840db7292798306e4d39379af85a6bc8dcaebb5246e07fadd5e336f122de0ecb99ca24a971701a1f43bd69933beef6e52d299b132e7510caf27b99739e32bd272afc36755ea80cc7ed3957d91325584b338d15b19fe554ee70bee903babe21d0cbecd49235c70a3a4f516ce16761d1cfcd70bb4b9c7c73c359f3fdd0753d6c1ac1a1463142f18266b6a9c84675f247d56563646fb2c8c3b6b81944c2ba2b76b685ba5ea40cf539bcf3850a8af3e0a69c0b38164de520a3bea82b91f67d36bbd87877b5be7f06c2d26b2dc747a26a51f51fe293197db0e91e6ac617c71ddc6edfeb7db8f067ac2012268deb7e5f00a640c1bbec5c4c71f10f921071308cadededad5c90e72d744d0bf790b043fd35729570889ebe5", - }, - { - length: 682, - nonce: [3]uint32{0x17cebe90, 0xeffe259b, 0xbdf9d4ca}, - key: [8]uint32{0x172d51e8, 0x5b80f5c6, 0xb9c9e438, 0xa56119c0, 0x62212323, 0xf5386589, 0xde7079a3, 0x669e643}, - input: "0aa4fbce7e1774f0607e7ea01fc0e6d210bb283964ae75e180a9f6ff3d2c4d50914bfc32bca6d243eb33551521d54d66f377fdc1d31974ece79b157905ff7e7a9b064f349727ce37c83c15ae13df635c3e6b4baf994d9aa0bb90b06c6cda51deefda72c97a2993448e654b746b216d2b949bff1af5238558205cfc3162f1d7a020a919db4d4eb44bcf7b269d4df57e24133d1e540694b9148444cee16e64035ef006a6079dff449949c1b342991f2a27f21c8bd74ccf4bc944284a46e9fd9f9bfd4b95f80c05553950fabbf5e5aed6babb8427832266aa4d175114de9127ff6ee848534d6dd5aa6d2dc361319863cdf32cfb1b074faed17d368964393352df01fe8d86af0e994bc9dac315f7d9efa7bef47a16676cdf17a535ae71d399c4c11a3a3ba0491e8d41f419685258a4ec7d1ae588b3ca341719c0827ce5f5a653959a8671844f2d0293c09bc7d35497ed18c160fc7b6d073a311b621a7a37f7ded1df3d73dcba1821278c9e17a191997fa4dab0802e1ee1b468e91e4272c4569a17dc0b2805b980bde798640aa328a3605abea1865083d7446e960c27f69d32882a2a2295efc9c440dc203872373411925f8839715e9441d31dd9cc14bab09a3e03b4a63e14db3039d58725796326ea6327f189beecd63955f1409467c81f4691ecfe9f0ac5234f23dfb84e3199e415ee7b4f67189e8857ff6cb3f64c2ac1b554bfbd679a6ea8491cfd69d96d08ee2744d9103e0b044212560ff707974b1a9043e1f2c3592828fde8ab5e993652c00e2b3fdb19082611b67866ece6c4a2635f87e04d2136d679f632416b03ece4d7e9406f3437163f4fe0c8cc7b87d487f6de3b3022665bcafa847c2b9199e1ba9af7deb0e29b66ad41688d03a8369416dfbee6d03526adb3ebc4b4f8531d73589499a3010b5309e9d9d2f5a9cf347983a92722dbf6c4f0bae8aba57b37d322", - output: "a31f9a532f35f20ba604a9ab9989260e5a4ed04e6ecfa1cb9e0e1d16943906acbbb4e761a2bebc86cad0ce8b3f26d98b455e4b0835eb8b43791cea29fe8fa6e5187b60198142059bbce98917aa2957ae2555bee70e6e9e21ff6197a51ac2ca2952c413efec4d9903a2f6883e88aebe7ca8316831f6a8f2cd0e486319b58dc8db862779adff98b7f35c33faa53d56acd7a81e0feffc286b728f3a11afab7cace4c30b1a45780276b1f0ab89242410d07cb1191c7b9da5d09db7c9a729d91ac3ed82f4350f2871a12d125ba672861d1b0af7219c360a0e023a8b7c23fb9d72631c72e032c097118d90e5db0576586d8224165a8376fe8d04de93516848e7c2653cb4f7d24a971ccf4f16c527ea5b4153fad5fd5bf473b15806671854507bf1a6d9e5fe4a6f6ec977197d21d69a041dd955e199031f895adefd850c8b0ae327ba0c18ca1783560e1ff0feb2f659137e34a91e9e9ff04fe3375b7db6e4326986e6265e5fef00297f6ae627c7563846e531762748fe8d0b6baff17acf1e6c5cfefa35a95ef634ff96f83f16342a6c62311fc653d314f8a6de109356ab7801316e69a48834cb6325816b1f66d5c67d6e9c9cbc8e1a0521fd6e4bf77a7d2609f99c9579e143f530677b99d198a97620d087f058edf35eb7271701ecebb8bfde5671641ed21aeee9e7db06b932e0def91be93cf2955159e9666c770cdffa03886eb6e98dfca8f91ff5cef1927c0f82b9226d65c68d011416cbef802c264e34244ead7a6ebbe28a510a37e1276f4f3cf27a3944a08aaa23bd321092761627dae20dc269b6150545c75e995cfee0a9bcedb1ad8b364beb8839fd5c9f7984fa0a08a1a354aebe18f62acf6d6664978fcfda2ce6fc16eaa2cda5b835339001b3b98d3a407a3e18e0ec2da6ee3d1448c1ece2ed67c3f51f01e76ed59f0e61102b103a3c65aea94275e8d1f0d331538efe", - }, - { - length: 768, - nonce: [3]uint32{0xb1c9bd09, 0xdbe6497d, 0x16c73b95}, - key: [8]uint32{0xbf9d9e5, 0x2eede668, 0x631dca95, 0x4233e36d, 0xd83fe644, 0x99b11f89, 0xef055717, 0x1ae9695f}, - input: "e097b1e8dea40f63714e63ab3ad9bdd518ac3e188926d1086a9850a5580affb592f6e421abc617c103479ba39a3924eea1c0bbbb051614c4b5003bbd5fcbb8093864fc1c130748194d6b560e203b889b98b574a98ec3e0e07cb2d9f271ba7794e5419123b4f2ebc7e0d65cd404104868905ff2c38d30c967fe9d77ebdd4b8fa836c3b0ad15e3e70e9a28236d5593e761e694b047f63bc62c7b0d493c3e2528c8af78f56725172ac9416ec2bdc54de92b92a63f9ccb61e686f9249c7cc337d99b2160400bb5535eb8f8eb1e3cafcbceaa821c1088edbacb3b01b5bed977e702de747ad00268ffe72e3d877dd75816db65b5459607cd1b963fe43bf2405ec223ddc0de514d59cde74f7522dc72285caa3eeb7eae527a7723b33d21ce91c91c8d26bf36eeb1dcdfc1e9e475c1565ed9c7e64ef601874a4f277280a5ceec26717e9385aee8b159379e3feed7952b87240c942970d63351259aa7a286ddb4a2620fa67565c92f592902e49422f1eecea2f44d1c0bbbf54a9e5612b86a9549aa3e6639a924c7bbe2d3c1b5669da73c0e2c6f6f6084f54a912ad2635d0141c2f5ac925414dce0da09ab8f86eae2a7b7e48741253189e5fd554d5c04d9807ac6ffd8a4f8229a3e8ab75ca5c778bd7ec5a5c02085faba9792cbc47f9e9311f3444e6544359769e1b3eb4d42ac8923ec94536e1a44497766b5da523f5763749dbc2738dfa8e13c191dfeac56c7614a96bd3ae23e4e6e5ac00be851ac9831108989b491eaade62113c531385ef3e964ce817c8ed0857adca946467682c2f4387fab2f31ce71b58370853171720268459588d5d216faca58d0bebbd7cd83a78445d9b49e83ec2cdb59b5d760880bf60532178d60372752b47d52562b316c7de5c74af9cd588643002d66bc6260595a540d2f82cf2c07fa64e0cdd1f79877b6a25b0608c735a7d35ca10852da441fcfb31061fd7e482a0989866f9eea8b0b39c3d519715c1c2766c3ad99f041143cdb36557ed647403458155dccbb80c3a365f0a85b1135695648ab67ac76b3d219c7b77e49d735c72ac947b1d7eeb279beb9d2602aba7b36ca", - output: "7b6e07e6415660affba56047b988f4548b308e7a642c76791f5c3742cc4cb744cde48fc30e50d458084e06c6dd29a52cb4c306a69a493a17c0838d14b107d07b81c983a2dbad09b80f087ba48465a8beaae5b16e8093e17cfb9e84ea3bdb9af00889268a5c01ddf25af434de56f65882322432aa275fac8519e317ef4d89478f29182143f97350983050f5d37c4b518611da6fa2aed7bb73e614231a194fe17c9073e377fc6ea0aa491e15ca54808e0536c8c3f1bf657283f807ebfc89b55049ac8fb86f89f17974fcf0afc1a2c690c0442842d0f4af9ee29dd960e499d1077bfdad4c0c9189a6e83799bb585acdb853c1e99da7ce9c7eeb9bf431f8d364d0ea80b0a95a7807f196c6ee69fe90e6d1f5d23e5cb256e37e65826d7a111f2272884d6319f968580b3164b2697ea6556816cea3ca316651fe2fd68dfa905d080c28622606f7d24da216289fa2c54c6f42dc244ecb047512ace62f0801f2dfad8f0218f45e2b3bbac97c2176c842398b16dfa1fdfc9a68b7b5a1e785d2a0cc592bc491f5a69c81127b758ee02c66b81674d3135c5882d1dc89dadcffa06f4b0644df5c7fd65c72611d79be7ad637edd6fc38b39946aa2a2c6d08ca9d3ff9a8ffe2e7989546489539b1a623fa937c468e59e0978602526b4367de277526895aa222fbaeae2084f418c5745d8ee844da0baa47f592970c14cf710f49539c12104a62baddb3382f5773dd18c83ecb238ae2e749a51584a38e394ebadd175bf5c3cec787907abb1d94af70ae63d3b7d8d5ff254da90b78ec8fe2ea95dfbc6e3e69ecad856c9e54906df8fe39859f2014b74dc3ca0ee2a957001939d37a6c0b489bd3f1658b835a57b24aa282c23e875c9e67e6eb8b32fe44e7d7d8e285d85da0ce1b53990f9fdb5e2e74728e433ed2c1044df9e89cb9bb316c39fc6fc8bcc74a382093926a288170e857d6b7f47858a4c2d05c74263dc9e8199332d0179687f4a4cdfc80ee6737300cefba75905b22d21e897f887b67aa3051877fff11d98bf96ca5091bb225bddd5eae697f3dfb0efcdb788ebf6694b5b39dbb0d4bf9427382a3a58f0b", - }, - { - length: 828, - nonce: [3]uint32{0xc7e503e, 0xf8110ddf, 0x83316c8c}, - key: [8]uint32{0xfa2d1cd, 0x4fe7f905, 0x2b9e4c1b, 0x115bc881, 0x2922bcc5, 0x3f60aa25, 0x13c26d31, 0x2096af63}, - input: "0a1064714f20d9e47fe53250ecfec759f4137e60afaf65755f4709a483504c3855833b6dcaf7aa0180fd735fa9a73d46697f6c45004adf12452ea4c04a720fd7c20b9783b74b8b3ea0c8b1563d5a85f44af8afd7d91ca6298ca22642a684f66e365edd6f6bdb2dd32dfa13c62dc497fb341b86f65d40655931171416e23e3b2623c0b4a67d448877b6e3d4e0fe284034a10162b2b5e21639047036874f4bcde22b145b5f18aa8ff32dec81e6a5ac68b3c30c24bd8fd3b8e098a1cf202e2ab2a3bb66a9393222b9f7384653cda7707f00bc3c81e9591fd040a07d3629410c2db78781a4c9db3df5f9d648162f1b087974f56a89db07aa21ba827e3864a1618945b2fba06853a13c35da2909f5013feb313bae09870b8eab904024adab0d6ac46c1a1499791b47413139dee59db676949b9e9ab8d3d6abaa954ec2a9fc83953c91b483c3b6bd6700b96484850734e72e3710a1b379c0d0698aeaf68f13a0d317bfd689471e3299288e7a383a58522f0daaff210cc4917fa05f0b8ceefc2afc46148a05a100d30787accfb4da094e61ea6b58f132692aedcabae928e53c2594b01507b8fc2d0a85a1d111d1f4de0b95258281ae01873a72606753b6f878ecd8c4f613fb3477710d260f0bca0d4c06f675ab7113eded395f88755a98a0ad22b4a002cfe9447c4e39eda13738f4eccb9c13367ebc2878257c4647d31b67e5e32b6a77f23e9593658d19c0a40e8a7228767afba1cf23072b013b2d76ee66e42b57bec2797ce3619c695a661004c8129cb5c5d6a2836be22483f3b7e40bf8ac5535bf6cd065c4821a87829948c88163cfe3c0f60cea4e7ff59df4cdbf80064b2d664b39487413039999b5e86f1d467b12682d0cd355e9f7cd980e87d584ddbda89f68632d3b8fd6bc3b80205d7feb97a46842b093f74aa14bb21accda7474247b5e39ac76ef75e9b5b52b6a829a7e2297ab88fb0eb690d54ab1af2d7437149a6202035ce15f1e6c6267458d62677c263d83d3f8119af191b7d766582620e0f08b411c996c25ba6a32c2d73f592e789ed662e94103329bfa5e6573f1116ec04438997f3e4ad91b4123b570743455020d914bde2d8417fb24671e6db261732fb89dda1a36614b095529e4f97374c9bc0e55aa577bfffa663c816ca9fae3472e0a", - output: "b00a7caf5359c5bcebe590e6bab9aa03370050c55cbd45a257f4869937e922a15f2d38121b1493d6b5dd4a8a47d7b4e5cb049d396ad84ed421df774b0408b6939f18ebf5cf83f48c540affcc2a885967bf4bd222c42904b8a73c4185bde3f97e874fad25b46714235e60c9ff53ed2975c9c85ebad0752249e4b627ffa41555eb9074f63a5f7d61d207d2ce11b2a9fa23a13a0832eccb91efa2afd8d9acfee94ac78a733fa156bfea5006da1d0127c32aadbb75c015b68c627903e1c85bf3a1a9f99c6cfbdbb5c871f7f9661b78cf5e16d819f53e9930e201d4f58e69bcdce77ec5b9b1d2cf206a71f744342273c26b9abc71303c20df3d51f52222893d803fc8e0e0afcd99ee1c7f95b48680403566f7f9e296d7ccc0ec348b6ad515af58d11fd82c628ea29ee6a5d67aaeabd8823addc01a078b04313af73105d4ce4abef8e6ee8ce649640a19678292d4f1017d121549fd2c19ba6cdc0b613e512bc9551d759c6d38aea7e35c0847a142e273a16bb1495e652f9668b97801ba3f6d9931c0a1efaa4452e15732dca1ca9cb45ed289e0fd08d1cee1cdcc9dfba8d0b2562b0b1a180f4ee69d63573222c8d4789bf0d63d2a201a70c7b27c84e620e33e8a863cf49b784269a51ead3d4ad26f044d5859988d5485a11533ea805f5a8f6313caa6b421071a34f57170fdd8e4663e9a4cdcdcc1ddaa9f6e651fb365cf827667b018ae7d028c7f96295b2b4f9eeb4b361b48af86463a79f50b107ab0935e3cec3f4f203cea801ff95fb870d2c2f0e315dc8a6a547dd3c390a1f5403917315164bd2d40362489b389a54e8dc0ddb83e6a43a26c65923e6f76ee0ee0e3a33b0a9066620a01f0319e20b9f1beb3910ad962a3000e6aacb0ae57f3f6c5e0315be5de93edcf0e45e0e47332f9daf7f33e6e8bf1929910b78b8f88ca12bf5519a3217b7554c8c8350cc314561d580bf67a3878e3979430d070121a5e070a3458742e8549bda972f603222e2b30eb8a49a955805307e6e02f8c60a08188f69340e116422458d4a8841f46a78c833b1a822e3f6c9c97422c918f17c36175ca4b3d1c081ee4b175b4b07bf101c3836eb5b9e3cbd08a89b4a1c50edcb41ea8ea6ceb1532f5b842715d50dc21e2499e08c373d3dedb96bb477c8802ab7aa957e0b5810f38", - }, - { - length: 859, - nonce: [3]uint32{0xeb02dac9, 0xa7cba06c, 0xc24764c}, - key: [8]uint32{0xe9414a57, 0xd5e29546, 0x1a5e2f4c, 0x806e4c46, 0x48098d1f, 0x4351ca1a, 0x53ed97c, 0xa6a495ca}, - input: "00fa3b13b5cfa9b5d65a41cc2d3c420518802c22c4582873f1ad52a22032d2cef7c975078b199787e852fb1f914529f60d1cc854e5d6d547216dce043e0fc94866bb2193343c3a07fde60e668266d1cee3067c6f2ce0f9f63456ad08094b6c7f515f7ca90caa96494e2a6835ba1f3f166012ad1ff6af6b5f8455d5c26e72402966af9066ca70ad027eed23b0eb02c751195064a62283975efeb29bc5993f83360d012a2f5275ac758a9e8fe458fc7cc0673e6b9e338678f0faff60a67fff3784c3054dcbd95d1b00ed4c6156b3831cc42a2ccdeee55541f228b88e6c318e2d797c6fc035ae12868c4a4e3843b5b25a530b1477dec3f5ac27644476b5766e0ee132d833f9a63200eb0980bf72c3666150e567e01e3e1f469cf36beea65946fce714a3f354983e54ca4315b57ea35c5f48bd5eada05f49db1004cbb39888ebab3afad62f6509abad77ca8c4ff28731c7ae545e6876c8f4a80b6cc26928ee05001a9764694b52edd605e182d5a3a5fd192bff58aba90f57e4debe612d02cf6f08af33a78ebf8823bb3eb46d4da25b7dfa15ad436c380633d3db3d0dc4dfec6c2324d105e7090e65342b554854e777b40b5dab8125a58e8b212364ff88459a8466ff5ae661034abc8286a78ad5aa582e2dabbcd7a0b0cedcb9fd5f0bb8c3bef9117f2ca6520a72b94e528c1a4a464398e654995d5f4c77cbabf2b204b96a058cf1b38284b34e41ac37b05a003ed51be9602050f21c6b9326714bc425c1e22833da95a6e77571691d4dcab4ef9056c4c7f85d5b445b902eb375b5164c6bdf629ccfd4127a6c024bb6c4da0b6b08350432e58f8229e04e2e76f704be17d36e0c04fcc7a98f721d4572aa7f66ae8e9664300a189bc3862da47b60c8b33424f6d577cc10f4755f36c2a6decc30ba81bf48f96616ccfcfb74965d6bdcab82728bb224c560d1cfd7a175413ad1c14c734746be3b062b4e7514e9075c688103515e32e3335dbd272a315024d56f4ecd354264da9bc712080657b2b51b06dc7c4c441d9858935a4c3e6b207bde38ea83bba4c6854b2bcf914d758e0a174c0528e0e385c7cff355c38db1c22440369141e91266824c59f1ed23e7d4b99d31b0baa7bed4526e24259dbef5c9ae275e97267b756645f804c274d65ac7ab0f7683435bc2e4f24075cd1b790aa2b53fbf044e8f2092bdf0dbe88a582ff8f8de291e8220", - output: "bea32587095caac661c3ac49e65654b282192b2addf5b9a403aea6c8bd0096291a0a66ca4062acf1da91fb5749952096ec63ab652ecf94c29807f0aaac939b6896edcd6f0cd8dd8d208b906ef4d7a8766831fecd6ce98f4ea0c34fa9a5114dbeb23c2cd6d3aa962e39b18cb343c24e65d49fad0a0fb50736f8d2b24b011108932484399f4c4510ac9a5e6bc78ff0b450e67f87b49f253b99d95d6294e15a9934fc8b89a5913c08f75d3516766fb0f60f82e2b2647b4619991c78adbcf548c07c0dda30c629349d84f298313c3e629e03760b1cf860264205a950d6fd86732a6513827f72c0dff5aff96f7203464f60849c1065beb70f282cca1334f6f6c767dfff94f063361f592e85597de5d313eaed17bd533db24818d9ba9aea2afa797721fbd19eea7b8d46bbc4b9dc0164636d2e754f5e9e8c04e2a381096331731c645ea1f613a37bfa9a6fb2c6307e9bacacbeab7f5672163ff9742a8115049bce0269d7d5f6f35787be031dbee1535b0516ec0b46d12f5833cde5f2cc569edcdd20993e9776aacf48ace7bfadf79065f2803fba6b2b27aa622abb7ae023ff2b27b727f509f313f92026392485a5ed4fd53b2e22b2d2dc1538ce158d34921214638be30ae054a0f5f1d4f9c590a2d215ac2a5b23ed33871ab26c8bb6db7fe9d6f51e527c9547248a4e9734c64658b22893f4f6867a35f18e2bbfd7d62142025955cb51af8e40b6fcb91c7e959cea2c92022c87c29dae107a306f41b00e73c7bceef8cb070e8f9e830caeee463170e919cba6eee63092a5a7ee33b74db09cdd022fdafbcd5d524253a29a103ba6f4d668d31d18f867557871c0e0258221c3050d57c18bdae4cc4ff8da0daddb5c08619be127ee76a317b59a9d8e67808603a1bfce6b4e0d070082b283bf9c0e6ef8256208e482f3e2d1a40d30807f60a868e2279dfbc3586d44ee25fdca3505cd39fd469c2cd03bc2f921d22a8346750f346c919e7247301c1c8a4a3ddb8eabc6e80d85cd2459afe1cbb4851ea2c86b8075e0fef3177cb074894410ecf681242fac62b5fa4ed3a10ddaa595427851d376cf69e350207b667f7aa26d003f1ec739a8792532ebd93f3cafb1fea40d227bcadda2fb6da794cea3371240f257f80b1b8a857ea453b46938397c1f4b303a46257750003a60666a11d03bf2afb5c71e059933d617288891733b63784bd9c662234f", - }, - { - length: 985, - nonce: [3]uint32{0x3c2b47a4, 0xf614c813, 0xa26f7014}, - key: [8]uint32{0x39bd3d18, 0xc9aacd67, 0xcb5485b5, 0x20536a22, 0xbb22ac87, 0x1c9da580, 0x7d996b2e, 0x456fe461}, - input: "01847d8a97d56e55e12f89adb13c8c0f9dea5555e8dc61171fbb8e181f6cf846a4dd68b2c75335c0896fa215bf7f9eb7e398e4520aaaf33461ecfb61051f43d43569fb75fabd79d319bf39469f951e4da7932a74624c46d8d26a9499c701c00d3dea57a6f65b4c0f33b568d13989340294d17cd005b26d89cf6fa1c88e7b6ef4d074291fa8c117ae05d7c785459ef4561c45af63a811e9aa1c31b69a5bdac2356d955a0f579791247a757a691b3de447a53619878397cd82a74053f06da3574045bc856500ec01fd2afbc64d8dd283ac876a50e9396f78c424ab157f481316fd9c90cd899f5aca46dad32c68f1d64ea7f1c4bdb994ad847072609bd89adc2fa8382a5d573b680533640b8321b6adf27926274660b2cbaf04fbc9a4fb17ce8957c38c7bab1aafd5bf7263171e47d2e1ae5cf0494815642209d303dba561754479c24ea01a573c9083b68acc49907b1748924d3c6a82feb9417ca932578c123f9db35521c0d992565f7396f0c23e436289c1720e4e7c6e285c04a8159f93e06801334e523b18fe188355cc6a155febe64ba053e6b5d1cc87787fd5ae68fa86d8c51868b9f6a9664cf0d56aa6cb8463362bb671e6b8423bcbefe2a1a0acba3f135496736b5cec5e329494af46aba322bf5d1cc108c98298459558773a316e09b0bb960a26f4b0bfbaa493b5f98a0e522b6203c471b10e662abe9b9e60de2a1517843933add02017fadd62608383ad53796159f3d21b2c8ed7295802ca79ea65d550114ca2bcc7f7c3b4c6709fffc3c2de00da06e83d8f0cf04b8c8edd21c0fc11a0b2aa7f6adad255fef25e5c0a9d59546e97446e1fbf6a51a8ea6cad54cabfdd19cd10d7d33ff0549b710557e3931821dd8809ab0a9d3aaa761a01ae0f2e378906672924d6a1b12fb1cca7bed41f31974b9917a05de60c32796f502e7035a2c01cb49bc8e1734b9fa138b81b4dfe19d37f5942dd1b42f03e1e5a6a046ecd457174150e17dd148e4bfea44b72da35ef42a7251244700e59e702033677d42611168fd246e1b18b9a464b6c20fc7fcf6360cd00466ece059a69d7d54a4f5565d08799f85dd3c849a08ba43415077c1c0e5dbdba52bb3167ee99a11db551f0260493be1dde58d2072e8c02251f4f574b6e115cbb6136dc2c3fbce75fdcefe812d9c07a91a89088985a52cb1fb9f6cef80fa30364706414175e42c75e8e37f6e7cd028c99f59caa88c49db5b46e8d6301bc39034013718a9eeef5506415016fb21d70e46a03b4c5ba72f91dd9321ff5e210e5e5f7b0723a3bc4bb02b5a74c1f4a63aa5a993a31f79a768fe8033c9abfeb4deb536af1054be02d8d1c4a6a0fa75f3eb787d57a03b7ae994fb1b54b2c43b230ce32e6245d944b3cea4fa6", - output: "785dbea5d1e50af4743ed5fd2209e441fc7c50bc7f6fd9cc7f24654c619e2606178dcbbd81a1f94c1b3176837024098bd31326145be326b32fd9277a55a6fb38780c8dc8b471a3184379d90da4aa87d80b889b1f4d8d0755c1704a526b99ac829b8ad157ca54b2b05ff8b2917e27b0c147ab54add9a89fdcad7b93ba1fe2d5be9de88b68a5324f1b42943e45ee31c4ef783ec9e2337b3f2834b10cf452b313fafdf0c03719140f64060da0a565e185cb8e544e1c185ca230ff2321739a285abe8be4be0ce76678a7b0902a77a645194de49fef8ff64cc464ea25e1f1d72c775e450f08ddd7680d27a4142879787b198583d93b84cd87fd5b4063d92d13d9c9cb580c01fac0174686a18f64e6fa0b3589624cfae04aad74950559bdf92b2b199c60cb04013aa0ef56d1f9ec5b7e968f6a83756ecc9cee7dd8b433f64649f948df5474a64549e71e46fd8bb16568d21f5fb67f5ed555f2b8aec4709383e8cbc45b9fe47c0434178ad4c6d0d42606d6eef0e21d0370898d1d5d646830a88d5f024094fe9c7a2003ca13d20ab7cd748dc11a22f578ddab416f3500eff3d89fc177b46436108e2e2c7973910cb8454a01c9e9b98f966848325444b2ac205b1ed6919fa76aaf63717574761b7f62b10649357df49f85a845a30b6acd57fa202fe58673930ec59399f537e9682b1f5f6f409988789a8e0c1f803478dded14b40d3b6eb3109758efeb6a7fe21f41c4dcc8027258da27ad74010839dbfdf8fe55050511f85c321e653f76e55f22248f46da529a380c6b1a16a19ce73af9715545c2cae098dc42dd61248dbcf7b295f4dc6b8930b41baeef677156c534869be65e723e1aa0336e8be8a3b138f840c9cd63bab6d9d61f239a47d8cf56258544e6ef65edca27069f7a57f087a7cc021fa1294b75c0c0f1093c025e426e4f041ed5187f358402676d5da5fb6ceba76a178f65c8c3046f258531c165b8808bdd221c59ff56e3e06247576e144aac01ea96a07f1be15d7a2b0b3b6c259a9133f8a50b56154ecf9f61022f470027247e6e70e6eaf7ece5e324ec8f95667ffed10337652b119e7cb8d197e306e81ea251340b9fb2c33aa230c0a16e1ca783f9344b3acbf413acd96616e6d477dba90e39326089934bc5ca6620855cdc442e25bf8b8debf335e16e7e25cceb68659cc81b13a507fbd9f30b347126beeb57016bd348fe3df592d4778011664a218227e70d7360d139480500b7f6f84153e61ca4dea105875e19ce3d11a3dfd0ad0074035ff6a9fac0ece91afd8be74c168da20c8baafcc14632eb0e774db758a3d90709cddf0266c27963788c35a842beea8ba2d916234431efde4bb32fd7e1cef51dcf580f4697206bbc3f991f4046360aea6e88ec", - }, -} diff --git a/src/internal/x/crypto/poly1305/poly1305_test.go b/src/internal/x/crypto/poly1305/poly1305_test.go deleted file mode 100644 index 256bdbba2f..0000000000 --- a/src/internal/x/crypto/poly1305/poly1305_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2012 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 poly1305 - -import ( - "encoding/hex" - "flag" - "testing" - "unsafe" -) - -var stressFlag = flag.Bool("stress", false, "run slow stress tests") - -type test struct { - in string - key string - tag string -} - -func (t *test) Input() []byte { - in, err := hex.DecodeString(t.in) - if err != nil { - panic(err) - } - return in -} - -func (t *test) Key() [32]byte { - buf, err := hex.DecodeString(t.key) - if err != nil { - panic(err) - } - var key [32]byte - copy(key[:], buf[:32]) - return key -} - -func (t *test) Tag() [16]byte { - buf, err := hex.DecodeString(t.tag) - if err != nil { - panic(err) - } - var tag [16]byte - copy(tag[:], buf[:16]) - return tag -} - -func testSum(t *testing.T, unaligned bool, sumImpl func(tag *[TagSize]byte, msg []byte, key *[32]byte)) { - var tag [16]byte - for i, v := range testData { - in := v.Input() - if unaligned { - in = unalignBytes(in) - } - key := v.Key() - sumImpl(&tag, in, &key) - if tag != v.Tag() { - t.Errorf("%d: expected %x, got %x", i, v.Tag(), tag[:]) - } - } -} - -func TestBurnin(t *testing.T) { - // This test can be used to sanity-check significant changes. It can - // take about many minutes to run, even on fast machines. It's disabled - // by default. - if !*stressFlag { - t.Skip("skipping without -stress") - } - - var key [32]byte - var input [25]byte - var output [16]byte - - for i := range key { - key[i] = 1 - } - for i := range input { - input[i] = 2 - } - - for i := uint64(0); i < 1e10; i++ { - Sum(&output, input[:], &key) - copy(key[0:], output[:]) - copy(key[16:], output[:]) - copy(input[:], output[:]) - copy(input[16:], output[:]) - } - - const expected = "5e3b866aea0b636d240c83c428f84bfa" - if got := hex.EncodeToString(output[:]); got != expected { - t.Errorf("expected %s, got %s", expected, got) - } -} - -func TestSum(t *testing.T) { testSum(t, false, Sum) } -func TestSumUnaligned(t *testing.T) { testSum(t, true, Sum) } -func TestSumGeneric(t *testing.T) { testSum(t, false, sumGeneric) } -func TestSumGenericUnaligned(t *testing.T) { testSum(t, true, sumGeneric) } - -func benchmark(b *testing.B, size int, unaligned bool) { - var out [16]byte - var key [32]byte - in := make([]byte, size) - if unaligned { - in = unalignBytes(in) - } - b.SetBytes(int64(len(in))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - Sum(&out, in, &key) - } -} - -func Benchmark64(b *testing.B) { benchmark(b, 64, false) } -func Benchmark1K(b *testing.B) { benchmark(b, 1024, false) } -func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) } -func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) } -func Benchmark2M(b *testing.B) { benchmark(b, 2097152, true) } - -func unalignBytes(in []byte) []byte { - out := make([]byte, len(in)+1) - if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 { - out = out[1:] - } else { - out = out[:len(in)] - } - copy(out, in) - return out -} diff --git a/src/internal/x/crypto/poly1305/vectors_test.go b/src/internal/x/crypto/poly1305/vectors_test.go deleted file mode 100644 index 18d7ff8e85..0000000000 --- a/src/internal/x/crypto/poly1305/vectors_test.go +++ /dev/null @@ -1,2943 +0,0 @@ -// Copyright 2018 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 poly1305 - -var testData = [...]test{ - // edge cases - { - // see https://go-review.googlesource.com/#/c/30101/ - key: "3b3a29e93b213a5c5c3b3b053a3a8c0d00000000000000000000000000000000", - tag: "6dc18b8c344cd79927118bbe84b7f314", - in: "81d8b2e46a25213b58fee4213a2a28e921c12a9632516d3b73272727becf2129", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "04000000000000000000000000000000", // (2¹³⁰-1) % (2¹³⁰-5) - in: "ffffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "faffffffffffffffffffffffffffffff", // (2¹³⁰-6) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (2¹³⁰-5) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "f9ffffffffffffffffffffffffffffff", // (2*(2¹³⁰-6)) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (2*(2¹³⁰-5)) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "f8ffffffffffffffffffffffffffffff", // (3*(2¹³⁰-6)) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (3*(2¹³⁰-5)) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "f7ffffffffffffffffffffffffffffff", // (4*(2¹³⁰-6)) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (4*(2¹³⁰-5)) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "f3ffffffffffffffffffffffffffffff", // (8*(2¹³⁰-6)) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (8*(2¹³⁰-5)) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "ebffffffffffffffffffffffffffffff", // (16*(2¹³⁰-6)) % (2¹³⁰-5) - in: "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "faffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - { - key: "0100000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", // (16*(2¹³⁰-5)) % (2¹³⁰-5) - in: "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "fbffffffffffffffffffffffffffffff" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000" + - "00000000000000000000000000000000", - }, - // original smoke tests - { - key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035", - tag: "a6f745008f81c916a20dcc74eef2b2f0", - in: "48656c6c6f20776f726c6421", - }, - { - key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035", - tag: "49ec78090e481ec6c26b33b91ccc0307", - in: "0000000000000000000000000000000000000000000000000000000000000000", - }, - { - key: "746869732069732033322d62797465206b657920666f7220506f6c7931333035", - tag: "da84bcab02676c38cdb015604274c2aa", - in: "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000", - }, - { - key: "0000000000000000000000000000000000000000000000000000000000000000", - tag: "00000000000000000000000000000000", - in: "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000000000" + - "000000000000000000000000000000000000000000000000000000", - }, - // randomly generated - { - key: "52fdfc072182654f163f5f0f9a621d729566c74d10037c4d7bbb0407d1e2c649", - tag: "9566c74d10037c4d7bbb0407d1e2c649", - in: "", - }, - { - key: "81855ad8681d0d86d1e91e00167939cb6694d2c422acd208a0072939487f6999", - tag: "eaa270caaa12faa39b797374a4b8a420", - in: "eb", - }, - { - key: "9d18a44784045d87f3c67cf22746e995af5a25367951baa2ff6cd471c483f15f", - tag: "dbea66e1da48a8f822887c6162c2acf1", - in: "b90b", - }, - { - key: "adb37c5821b6d95526a41a9504680b4e7c8b763a1b1d49d4955c848621632525", - tag: "6ac09aaa88c32ee95a7198376f16abdb", - in: "3fec73", - }, - { - key: "8dd7a9e28bf921119c160f0702448615bbda08313f6a8eb668d20bf505987592", - tag: "b1443487f97fe340b04a74719ed4de68", - in: "1e668a5b", - }, - { - key: "df2c7fc4844592d2572bcd0668d2d6c52f5054e2d0836bf84c7174cb7476364c", - tag: "7463be0f9d99a5348039e4afcbf4019c", - in: "c3dbd968b0", - }, - { - key: "f7172ed85794bb358b0c3b525da1786f9fff094279db1944ebd7a19d0f7bbacb", - tag: "2edaee3bcf303fd05609e131716f8157", - in: "e0255aa5b7d4", - }, - { - key: "4bec40f84c892b9bffd43629b0223beea5f4f74391f445d15afd4294040374f6", - tag: "965f18767420c1d94a4ef657e8d15e1e", - in: "924b98cbf8713f", - }, - { - key: "8d962d7c8d019192c24224e2cafccae3a61fb586b14323a6bc8f9e7df1d92933", - tag: "2bf4a33287dd6d87e1ed4282f7342b6a", - in: "3ff993933bea6f5b", - }, - { - key: "3af6de0374366c4719e43a1b067d89bc7f01f1f573981659a44ff17a4c7215a3", - tag: "c5e987b60373a48893c5af30acf2471f", - in: "b539eb1e5849c6077d", - }, - { - key: "bb5722f5717a289a266f97647981998ebea89c0b4b373970115e82ed6f4125c8", - tag: "19f0f640b309d168ea1b480e6a4faee5", - in: "fa7311e4d7defa922daa", - }, - { - key: "e7786667f7e936cd4f24abf7df866baa56038367ad6145de1ee8f4a8b0993ebd", - tag: "de75e5565d97834b9fa84ad568d31359", - in: "f8883a0ad8be9c3978b048", - }, - { - key: "83e56a156a8de563afa467d49dec6a40e9a1d007f033c2823061bdd0eaa59f8e", - tag: "de184a5a9b826aa203c5c017986d6690", - in: "4da6430105220d0b29688b73", - }, - { - key: "4b8ea0f3ca9936e8461f10d77c96ea80a7a665f606f6a63b7f3dfd2567c18979", - tag: "7478f18d9684905aa5d1a34ee67e4c84", - in: "e4d60f26686d9bf2fb26c901ff", - }, - { - key: "354cde1607ee294b39f32b7c7822ba64f84ab43ca0c6e6b91c1fd3be89904341", - tag: "3b2008a9c52b5308f5538b789ab5506f", - in: "79d3af4491a369012db92d184fc3", - }, - { - key: "9d1734ff5716428953bb6865fcf92b0c3a17c9028be9914eb7649c6c93478009", - tag: "71c8e76a67a505b7370b562ba15ba032", - in: "79d1830356f2a54c3deab2a4b4475d", - }, - { - key: "63afbe8fb56987c77f5818526f1814be823350eab13935f31d84484517e924ae", - tag: "1dc895f74f866bdb3edf6c4430829c1c", - in: "f78ae151c00755925836b7075885650c", - }, - { - key: "30ec29a3703934bf50a28da102975deda77e758579ea3dfe4136abf752b3b827", - tag: "afca2b3ba7b0e1a928001966883e9b16", - in: "1d03e944b3c9db366b75045f8efd69d22ae5411947cb553d7694267aef4e" + - "bcea406b32d6108bd68584f57e37caac6e33feaa3263a399437024ba9c9b" + - "14678a274f01a910ae295f6efbfe5f5abf44ccde263b5606633e2bf0006f" + - "28295d7d39069f01a239c4365854c3af7f6b41d631f92b9a8d12f4125732" + - "5fff332f7576b0620556304a3e3eae14c28d0cea39d2901a52720da85ca1" + - "e4b38eaf3f", - }, - { - key: "44c6c6ef8362f2f54fc00e09d6fc25640854c15dfcacaa8a2cecce5a3aba53ab", - tag: "6f2a09aa76c9b76774e31ec02dcf7991", - in: "705b18db94b4d338a5143e63408d8724b0cf3fae17a3f79be1072fb63c35" + - "d6042c4160f38ee9e2a9f3fb4ffb0019b454d522b5ffa17604193fb89667" + - "10a7960732ca52cf53c3f520c889b79bf504cfb57c7601232d589baccea9" + - "d6e263e25c27741d3f6c62cbbb15d9afbcbf7f7da41ab0408e3969c2e2cd" + - "cf233438bf1774ace7709a4f091e9a83fdeae0ec55eb233a9b5394cb3c78" + - "56b546d313c8a3b4c1c0e05447f4ba370eb36dbcfdec90b302dcdc3b9ef5" + - "22e2a6f1ed0afec1f8e20faabedf6b162e717d3a748a58677a0c56348f89" + - "21a266b11d0f334c62fe52ba53af19779cb2948b6570ffa0b773963c130a" + - "d797ddea", - }, - { - key: "fe4e3ad29b5125210f0ef1c314090f07c79a6f571c246f3e9ac0b7413ef110bd", - tag: "27381e3fc2a356103fb796f107d826e7", - in: "58b00ce73bff706f7ff4b6f44090a32711f3208e4e4b89cb5165ce64002c" + - "bd9c2887aa113df2468928d5a23b9ca740f80c9382d9c6034ad2960c7965" + - "03e1ce221725f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e1386" + - "47a4b44ed4bce964ed47f74aa594468ced323cb76f0d3fac476c9fb03fc9" + - "228fbae88fd580663a0454b68312207f0a3b584c62316492b49753b5d502" + - "7ce15a4f0a58250d8fb50e77f2bf4f0152e5d49435807f9d4b97be6fb779" + - "70466a5626fe33408cf9e88e2c797408a32d29416baf206a329cfffd4a75" + - "e498320982c85aad70384859c05a4b13a1d5b2f5bfef5a6ed92da482caa9" + - "568e5b6fe9d8a9ddd9eb09277b92cef9046efa18500944cbe800a0b1527e" + - "a6", - }, - { - key: "4729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b03072e641", - tag: "0173965669fb9de88d38a827a0271271", - in: "5a761f03abaa40abc9448fddeb2191d945c04767af847afd0edb5d8857b7" + - "99acb18e4affabe3037ffe7fa68aa8af5e39cc416e734d373c5ebebc9cdc" + - "c595bcce3c7bd3d8df93fab7e125ddebafe65a31bd5d41e2d2ce9c2b1789" + - "2f0fea1931a290220777a93143dfdcbfa68406e877073ff08834e197a403" + - "4aa48afa3f85b8a62708caebbac880b5b89b93da53810164402104e648b6" + - "226a1b78021851f5d9ac0f313a89ddfc454c5f8f72ac89b38b19f53784c1" + - "9e9beac03c875a27db029de37ae37a42318813487685929359ca8c5eb94e" + - "152dc1af42ea3d1676c1bdd19ab8e2925c6daee4de5ef9f9dcf08dfcbd02" + - "b80809398585928a0f7de50be1a6dc1d5768e8537988fddce562e9b948c9" + - "18bba3e933e5c400cde5e60c5ead6fc7ae77ba1d259b188a4b21c86fbc23" + - "d728b45347eada650af24c56d0800a8691332088a805bd55c446e25eb075" + - "90bafcccbec6177536401d9a2b7f512b54bfc9d00532adf5aaa7c3a96bc5" + - "9b489f77d9042c5bce26b163defde5ee6a0fbb3e9346cef81f0ae9515ef3" + - "0fa47a364e75aea9e111d596e685a591121966e031650d510354aa845580" + - "ff560760fd36514ca197c875f1d02d9216eba7627e2398322eb5cf43d72b" + - "d2e5b887d4630fb8d4747ead6eb82acd1c5b078143ee26a586ad23139d50" + - "41723470bf24a865837c", - }, - { - key: "9123461c41f5ff99aa99ce24eb4d788576e3336e65491622558fdf297b9fa007", - tag: "1eb0cdad9237905250d30a24fe172a34", - in: "864bafd7cd4ca1b2fb5766ab431a032b72b9a7e937ed648d0801f29055d3" + - "090d2463718254f9442483c7b98b938045da519843854b0ed3f7ba951a49" + - "3f321f0966603022c1dfc579b99ed9d20d573ad53171c8fef7f1f4e4613b" + - "b365b2ebb44f0ffb6907136385cdc838f0bdd4c812f042577410aca008c2" + - "afbc4c79c62572e20f8ed94ee62b4de7aa1cc84c887e1f7c31e927dfe52a" + - "5f8f46627eb5d3a4fe16fafce23623e196c9dfff7fbaff4ffe94f4589733" + - "e563e19d3045aad3e226488ac02cca4291aed169dce5039d6ab00e40f67a" + - "ab29332de1448b35507c7c8a09c4db07105dc31003620405da3b2169f5a9" + - "10c9d0096e5e3ef1b570680746acd0cc7760331b663138d6d342b051b5df" + - "410637cf7aee9b0c8c10a8f9980630f34ce001c0ab7ac65e502d39b216cb" + - "c50e73a32eaf936401e2506bd8b82c30d346bc4b2fa319f245a8657ec122" + - "eaf4ad5425c249ee160e17b95541c2aee5df820ac85de3f8e784870fd87a" + - "36cc0d163833df636613a9cc947437b6592835b9f6f4f8c0e70dbeebae7b" + - "14cdb9bc41033aa5baf40d45e24d72eac4a28e3ca030c9937ab8409a7cbf" + - "05ae21f97425254543d94d115900b90ae703b97d9856d2441d14ba49a677" + - "de8b18cb454b99ddd9daa7ccbb7500dae4e2e5df8cf3859ebddada6745fb" + - "a6a04c5c37c7ca35036f11732ce8bc27b48868611fc73c82a491bfabd7a1" + - "9df50fdc78a55dbbc2fd37f9296566557fab885b039f30e706f0cd5961e1" + - "9b642221db44a69497b8ad99408fe1e037c68bf7c5e5de1d2c68192348ec" + - "1189fb2e36973cef09ff14be23922801f6eaee41409158b45f2dec82d17c" + - "aaba160cd6", - }, - { - key: "40ff73495fe4a05ce1202ca7287ed3235b95e69f571fa5e656aaa51fae1ebdd7", - tag: "2e619d8ea81b77484e4fddeb29844e4b", - in: "aa6269c2ec7f4057b33593bc84888c970fd528d4a99a1eab9d2420134537" + - "cd6d02282e0981e140232a4a87383a21d1845c408ad757043813032a0bd5" + - "a30dcca6e3aa2df04715d879279a96879a4f3690ac2025a60c7db15e0501" + - "ebc34b734355fe4a059bd3899d920e95f1c46d432f9b08e64d7f9b38965d" + - "5a77a7ac183c3833e1a3425ead69d4f975012fd1a49ed832f69e6e9c63b4" + - "53ec049c9e7a5cf944232d10353f64434abae060f6506ad3fdb1f4415b0a" + - "f9ce8c208bc20ee526741539fa3203c77ecba410fd6718f227e0b430f9bc" + - "b049a3d38540dc222969120ce80f2007cd42a708a721aa29987b45d4e428" + - "811984ecad349cc35dd93515cefe0b002cee5e71c47935e281ebfc4b8b65" + - "2b69ccb092e55a20f1b9f97d046296124621928739a86671cc180152b953" + - "e3bf9d19f825c3dd54ae1688e49efb5efe65dcdad34bc860010e7c8c997c" + - "d5f9e320ca7d39d4ba801a175b1c76f057832f3f36d7d893e216e4c7bbdb" + - "548d0ba48449330027368b34f9c69776b4591532da1c5be68ef4eebe8cb8" + - "fa7dc5483fb70c2c896334cb1f9cb5dfe044fa086197ff5dfd02f2ba3884" + - "c53dd718c8560da743a8e9d4aeae20ccef002d82ca352592b8d8f2a8df3b" + - "0c35f15b9b370dca80d4ca8e9a133eb52094f2dd5c08731f52315d828846" + - "e37df68fd10658b480f2ac84233633957e688e924ffe3713b52c76fd8a56" + - "da8bb07daa8eb4eb8f7334f99256e2766a4109150eed424f0f743543cdea" + - "66e5baaa03edc918e8305bb19fc0c6b4ddb4aa3886cb5090940fc6d4cabe" + - "2153809e4ed60a0e2af07f1b2a6bb5a6017a578a27cbdc20a1759f76b088" + - "9a83ce25ce3ca91a4eb5c2f8580819da04d02c41770c01746de44f3db6e3" + - "402e7873db7635516e87b33e4b412ba3df68544920f5ea27ec097710954f" + - "42158bdba66d4814c064b4112538676095467c89ba98e6a543758d7093a4" + - "94df", - }, - { - key: "5cc36d09c7a6472a41f29c380a987b1ecdcf84765f4e5d3ceefc1c02181f570f", - tag: "0d57b8cbea8090df0541354673dcb4e0", - in: "44fcd629f08dc1ef53c9ae0d8869fe67fdc7a2c67b425f13c5be8d9f630c" + - "1d063c02fd75cf64c1aec9d2e2ef6e6431d5f5ad0489078dc61f46494dcc" + - "f403dad7f094170d2c3e29c198b0f341e284c4be8fa60c1a478d6bd55dd2" + - "c04dad86d2053d5d25b014e3d8b64322cdcb5004faa46cfa2d6ad2ff933b" + - "c3bd9a5a74660af3d048a9a43634c0250427d9a6219197a3f3633f841753" + - "ba7c27f3619f387b6b1a6cb9c1dc227674aa020724d137da2cb87b1615d5" + - "12974fa4747dd1e17d02c9462a44fec150ca3a8f99cc1e4953365e429956" + - "5e108535b1f62e1d4ba18e17a52164418bfd1a933f7fb3a126c860830a87" + - "293d9271da736e4398c1e37fb75c4bf02786e1faf4b610cd1377fbb9ae18" + - "0655a0abefbad700c09473469f1eca5a66d53fa3dc7cd3e7c3b0411d7e14" + - "5f96eb9654ab94913dda503a50f9e773842f4d2a5faa60869bf365830511" + - "f2ededd03e0a73000edb60c9a29a5f5e194cf3b5667a694690384599d116" + - "f8d2fd93b2aed55b7d44b5b054f3f38e788e4fdf36e591568c41d1052cad" + - "0fcb68ca4c4bf5090d57df9db6f0d91dd8b11b804f331adb7efb087a5604" + - "e9e22b4d54db40bcbc6e272ff5eaddfc1471459e59f0554c58251342134a" + - "8daaef1498069ba581ef1da2510be92843487a4eb8111c79a6f0195fc38a" + - "d6aee93c1df2b5897eaa38ad8f47ab2fe0e3aa3e6accbfd4c16d46843318" + - "5fc61c861b96ca65e34d31f24d6f56ee85092314a4d7656205c15322f1c9" + - "7613c079eae292ba966e10d1e700164e518b243f424c46f9ea63db1c2c34" + - "b512c403c128ee19030a6226517b805a072512a5e4cd274b7fd1fa23f830" + - "058208ff1a063b41039c74036b5b3da8b1a0b93135a710352da0f6c31203" + - "a09d1f2329651bb3ab3984ab591f2247e71cd44835e7a1a1b66d8595f7ae" + - "f9bf39d1417d2d31ea3599d405ff4b5999a86f52f3259b452909b57937d8" + - "5364d6c23deb4f14e0d9fcee9184df5994fdc11f045c025c8d561adb0e7d" + - "fd4748fd4b20f84e53322471a410cdb3fd88e48b2e7eb7ae5dae994cb5ea" + - "e3eaf21cf9005db560d6d22e4d9b97d7e9e488751afcd72aa176c0fcde93" + - "16f676fd527d9c42105b851639f09ea70533d26fc60cbeb4b76ed554fc99" + - "177620b28ca6f56a716f8cb384", - }, - { - key: "811c3e356e7c793acf114c624dc86ace38e67bff2a60e5b2a6c20723c1b9f003", - tag: "c6e59044cefc43ee681c3eed872d02b3", - in: "e115b304c023792448794546a2474f04294d7a616215e5dd6c40a65bb6ed" + - "b508c3680b14c176c327fdfb1ee21962c0006b7deb4e5de87db21989d13c" + - "3ab0462d5d2a52ef4ca0d366ae06a314f50e3a21d9247f814037798cc5e1" + - "0a63de027477decdeb8a8e0c279299272490106ddf8683126f60d35772c6" + - "dfc744b0adbfd5dcf118c4f2b06cfaf077881d733a5e643b7c46976647d1" + - "c1d3f8f6237c6218fa86fb47080b1f7966137667bd6661660c43b75b6339" + - "0b514bbe491aa46b524bde1c5b7456255fb214c3f74907b7ce1cba94210b" + - "78b5e68f049fcb002b96a5d38d59df6e977d587abb42d0972d5f3ffc898b" + - "3cbec26f104255761aee1b8a232d703585dd276ee1f43c8cd7e92a993eb1" + - "5107d02f59ba75f8dd1442ee37786ddb902deb88dd0ebdbf229fb25a9dca" + - "86d0ce46a278a45f5517bff2c049cc959a227dcdd3aca677e96ce84390e9" + - "b9a28e0988777331847a59f1225b027a66c1421422683dd6081af95e16f2" + - "48ab03da494112449ce7bdace6c988292f95699bb5e4d9c8d250aa28a6df" + - "44c0c265156deb27e9476a0a4af44f34bdf631b4af1146afe34ea988fc95" + - "3e71fc21ce60b3962313000fe46d757109281f6e55bc950200d0834ceb5c" + - "41553afd12576f3fbb9a8e05883ccc51c9a1269b6d8e9d27123dce5d0bd6" + - "db649c6fea06b4e4e9dea8d2d17709dc50ae8aa38231fd409e9580e255fe" + - "2bf59e6e1b6e310610ea4881206262be76120d6c97db969e003947f08bad" + - "8fa731f149397c47d2c964e84f090e77e19046277e18cd8917c48a776c9d" + - "e627b6656203b522c60e97cc61914621c564243913ae643f1c9c9e0ad00a" + - "14f66eaa45844229ecc35abb2637317ae5d5e338c68691bea8fa1fd469b7" + - "b54d0fccd730c1284ec7e6fccdec800b8fa67e6e55ac574f1e53a65ab976" + - "4c218a404184793cc9892308e296b334c85f7097edc16927c2451c4cd7e5" + - "3f239aa4f4c83241bde178f692898b1ece2dbcb19a97e64c4710326528f2" + - "4b099d0b674bd614fad307d9b9440adab32117f0f15b1450277b00eb366e" + - "0260fca84c1d27e50a1116d2ce16c8f5eb212c77c1a84425744ea3195edb" + - "b54c970b77e090b644942d43fe8c4546a158bad7620217a40e34b9bb84d1" + - "89eff32b20ef3f015714dbb1f150015d6eeb84cbccbd3fffa63bde89", - }, - { - key: "f33691f5db2dea41e1e608af3ff39f3a6988dba204ce1b09214475ae0ea864b8", - tag: "6e50e70411201378c8d67857d7b631d2", - in: "439bc9ea10db4d2b08c7fcf2e8bd89fa9844f8061d462e28f174489e7514" + - "0f84e842040141cc59ce38f9551850cfbdfac2d75337d155090d70d0d930" + - "04340bdfe60062f17c53f3c9005b9995a0feb49f6bef8eaff80f4feb7ef3" + - "f2181733a4b43b6ac43a5130a73a9b3c2cbc93bd296cd5f48c9df022b6c8" + - "2bb752bc21e3d8379be31328aa32edc11efc8a4b4b3f370ee8c870cd281d" + - "614e6bc2c0a5ca303bc48696a3bd574ee34738de4c4c29910f8feb7557bf" + - "ffcfe7428b4703144bd6d7fe5b3f5de748918553df5453b3c6001696f3de" + - "0137e454aadf30cedfb6be36b0b908a38409f1a2dc202fc285610765e4c8" + - "6414692bf4bde20ed899e97727b7ea1d95d7c621717c560f1d260ab3624e" + - "d6168d77c483dd5ce0d234049017795f2e5a7569d7ad323c50a5b1170337" + - "4174a9977026c20cd52c10b72f14e0569a684a3dcf2ccbc148fd3db506e2" + - "8d24f6c55544cb3980a36e86747adc89ebad78d1630618d113fa445f8625" + - "b583cd7be33913c30c419d047cf3baf40fd05219a1fcec717b87a65fa022" + - "1a3aa8143062d77588168019454240ae3d37640996f2967810459bc658df" + - "e556de4d07263dc3d9158ec242008226d1c6aea7f0846e12ce2d316e80da" + - "522343264ec9451ec23aaaa367d640faad4af3d44d6d86544ade34c93518" + - "2843f6b4d1c934996778affa9ee962e7dfef5e70d933d4309f0f343e9606" + - "1b91b11ac380a9675e17a96099fe411bedc28a298cd78d5496e28fbbd4f5" + - "b0a27735d1144348e22be5b75724d8f125e99c4cb4e9c3a1f0b4e9da5146" + - "e6afaa33d02fda74bf58a8badee2b634b989c01755afa6ab20ee494c6ae4" + - "c2c6f17af6b53b61d2947d83a18eb3b8a1612aad5d3ea7e8e35f325c9168" + - "ac490f22cb713ddb61fbd96011c5849ac8e2fcd42db820349bdf9157dcc0" + - "0d9f9ed9c099b10c7194d48b623b0df43759734b2a2e5f8a35e7192bf9a0" + - "03dcb9d16a54bd84d922f85b6021b28aacc5264fe9e83deb48f18f864cbd" + - "367eb163d39c45b0eb907311a2a4b09fb26109088df782ce031b02f3caff" + - "d2dbe25b1cbde9f35ba7c47292a4fd49e7def7a28824f3dfda259a86c3de" + - "59257c255c712686ee47d128a55c7b9e8c546035eab7e2da420f32ed5c94" + - "bc12a34dc68eb99257a7ea03b69d6c760b0681fa24e4ca97b7c377182ab5" + - "fee30a278b08c44c988a8f925af2997883111c750d176b432735868208f4" + - "0de7137331b544f2d28040a3581d195e82811c945c3f9fde68fc21b36a44" + - "e1cfa2d8eb625f3102461539b3f13c660936a5ddb29a0ae791fbf52c2f69" + - "7bd334653f3605b362d91cd78569b41dbd09b2a5892440b5097fa08d0b4b" + - "291fc5b934585dd8d5adc80d573fdd194b2eae26dfc49f5e51c1f1607d7e" + - "87740702f244bf39ca1d52423e0ae84891dfdf4f43ef984c7a5f293a2007" + - "a1e00e39c757f064518953f55621f955986f63", - }, - { - key: "d115b6ac998a65b48b3dae5977abaf985258d3d1cfe1616cec3d6a77f7a75785", - tag: "b431c9318ec2769fc8ee8f5fc3c079c3", - in: "7e7eb43839a6d7616b8a7b1fb7144817904342a9bd34167051162941a6b1" + - "b85db5e587f76e4a53211755d5ab29c11822d7711a97b3f1ff5b21f2485d" + - "9c86241fb56cdd6796245d3112df11ad9a7344db44d09934c4efb280ed65" + - "80cfcafb5c97a32993cbbf4917183e0b7bb38f2ce2479c28e1d39f673962" + - "17a7010448dfd39a4e7f406c8bd2d804f993bb410fffa4eb57518a531ecf" + - "259a8af068230acb826d9ffc20ee0fc43885221a321e3928971bb28615f0" + - "d9f099f5b68a80503a910fdba0bc643c60b64837900be38770b6b30c362c" + - "4580722b5dbb1b9c8cd02a18fd7b5661d2c4d28aa941c50af6655c826690" + - "37312fbf9f1cf4adb0b9400532755011b40e8252bd0e3c7a22efb0ef9122" + - "1e04b4aa8316d4a4ffeaa11909d38cc264650e7ca416835ded0953f39e29" + - "b01d3a33bba454760fb0a96d9fe50b3e42c95271e57840380d1fd39a375b" + - "3e5513a31a4b80a2dad8731d4fd1ced5ff61e1fbe8ff3ff90a277e6b5631" + - "f99f046c4c3c66158554f61af2ede73aede97e94b1d1f129aaadf9b53548" + - "553cc2304103e245b77701f134d94d2a3658f2b41108c5a519c2c8f450db" + - "027824f1c0ab94010589a4139ff521938b4f0c7bf0986585f535b6e292e5" + - "b3ded23bf81cec17c8420fe67a449e508864e4cbb7eaf335975668f013e9" + - "da70b33bd52a72094a8f03762ea7440ce9fcd10e251837cfc9ccc1a8cc47" + - "0c67379f6a32f16cf70ea8c19d1a67779a9b2d2b379665e0e908a88b26e7" + - "8c9f94f17acefa6d5feb70a7095e0297c53e091cf98df132a23a5ce5aa72" + - "59f1154b92e079f0b6f95d2a38aa5d62a2fd97c12ee7b085e57cc4652863" + - "8defacc1e70c3aceab82a9fa04e6aa70f5fbfd19de075bee4e3aac4a87d0" + - "ad0226a463a554816f1ebac08f30f4c3a93fa85d79b92f0da06348b4f008" + - "880fac2df0f768d8f9d082f5a747afb0f62eb29c89d926de9fc491921474" + - "1d8647c67d57ac55f94751389ee466bbd44dbe186f2f38abbc61a0425613" + - "e9b6a64e6bcb45a2e2bb783b9103483643d5610a7e2dcdb10b5d78423285" + - "506b42a99b00a4fb7b619b4526bb4ec78299dd01ad894fde2f053e18c55b" + - "6047f86333f2690c2cb8e87d9834ab8a5e339aa346e4d9952ed62dc083e3" + - "b11a823a67f23fec099a033f127ebe8626a89fa1a5a6b3520aa0d215a8e7" + - "dea3af37907686c16521739a95d6c532cc259c497bf397fceaea49cd46b9" + - "ad5c1b39a36fdd2f0d2225fef1b6ca2bb73fe604646c10ba4c572ab13a26" + - "559ededc98f5a34c874cc25621e65ba4852529b5a4e9c1b2bf8e1a8f8ff0" + - "5a31095b84696c6381eb9ad37ac0db184fe5fccf3554e514946a33cabe6f" + - "4d617b549d28ad1cc4642dac96e0215ee1596481600d3619e8f45e2c9ae1" + - "da834d44aca216bba0efef6254503ca90339f2d7ca508b2722d50c08def8" + - "a736590fa44855cd9eb9979c743783aa26e633696739f2ae25ff7b72ceb2" + - "4dff4455b85bbd675c8cb71ad18386dc58c371bdf37b4b3875b98a9423ff" + - "3becfc0d0ba2aacab3ee7683cb3b345095fefcaca5751ca793da63c89428", - }, - { - key: "f3717306b9729be998cdb2c9d856306c5ae3d89da2cdcef12f86f6110c98d873", - tag: "907dba0f4849c7cf4570b5128b5f31d5", - in: "079572187d4559f24d8e48dc366441acf226a4db79e214ec3ee288acc349" + - "887e2e377419bcafa377d0151497b52e4d9cf2a02b0fc91ad9516482bdf6" + - "eccd1497954b53241bfb0bc5c04cc45045c6251f23a510060fee32721872" + - "bbc95cd8d400dff00bcac2ecce6229c7d73d8f85ed5a87afdccf6dedd299" + - "2d5c7b5b8090c47c737ded036ff0e9aedf02a2242fd9820be618b9601e73" + - "d3ba5d8f1ae9805cfd2306251704bc74e3546997f109f1dfae20c03ff31f" + - "17564769aa49f01233c9c4b79f90fa3d1433d18cdc497914046ad77d2792" + - "2588a7d0e61d4258d7d80cdab8503e3111ddca22cf7f39c1f80f1e16a68d" + - "9e21db8b53dd316dfa4233cb453a39a90101c60efc08514a3057db007e96" + - "507745bd4a0764ed8717a250bffb5fd1ea58474bdfb5b869681939693926" + - "40d832a3387ed4ac9cdab0d2af8fcb51b86e4d927097f1e79b5af96574ec" + - "d59d0dd150a0208978c41de28ad6cadf72a49279cffd6dc281c640f2e294" + - "4cde49a13ed390da1dd92e3011ce0f4a0863375a9db3f67fca1e3b8288a0" + - "78611161d7cb668ecdb932e1ff3733982c8c460eeeff2bca46c96e8a02cf" + - "b55d770940de556373a4dd676e3a0dd66f1280c8cb77a85136b3f003fab4" + - "887dad548de7bfe6488ae55e7a71da4097db03900d4b94e776a939530328" + - "83492da900b2a6c3e73d7a6f12ee30c9dd06cc34e5a3893976eb1de5864d" + - "32e792ac02e68d052d9d0cfc7cfb40b77728422f6c26cf68987c6b40fcfe" + - "9d660abc657360eb129de11bd70af5eb8fe350af2c27a6ece2cdf81b94c8" + - "0e68e8c51106497cfa5171236efe2d71d76b5dff3352af9b407dc5aab60f" + - "46b5683646f5b28732b7c750d351a08a507243d8e437cc4bef13a3edaa20" + - "5fc4e9968b4e563fa0dc965ba20b8e48bc188a321b16d3213bed69647512" + - "7a20afc1a3680ef261df6d37b017dee05cfc3a42e4130216e5540cf715c4" + - "e638d7d615c50bef576eeb19b3b15b2c2b454dfcef2b18161a143ddf52fc" + - "8e88fa71cbe34c92cd4b5a0adc81e5c33e11d2721bc1b95a9e693ac3cabc" + - "490889a8a42bf7e22375b679e8598c8faef22a006ed2da8ab1c08aaed2f5" + - "6d6f26649036335c0881bfec1e3a5346335c3b3707ee92173f1a7a3305c2" + - "933f78e995da8f1df64daf12b81ce23c8813c27fd4551103dc33561c2e80" + - "45b6b6770fa03498fd359a104884699d628020173edbcc4398b977e456e4" + - "885964840466176a490e7c513ba5d66090277c1ab1632a995a54f555a452" + - "1170a000507865b6650730aa6d6050a55959102836fff3d37e4773340e59" + - "2e56951ff9652519de4421d9c5b63edbeb30a3852a1ea110a9a29721aee3" + - "23d5a306de1624cecc87badc47aa87f489635d2fb60bff62ba67f5257999" + - "6af0a1f1a6fbcd8704e119196fcc289a6db6a4170a2cae31a1d30744b702" + - "2536d1526d41659c2dcc8b39c26aecfc0f8a707136d81b2827a158fd7386" + - "a537514471c213a8c859016748e0264cf3fbde10f40c620840ec4df99432" + - "e2b9e1e368e33f126ec40c572e841c2618d49d4eb098b9533b1f4ae00b46" + - "8d15de8c8ab6d0b650e599576f2bd90a124c9c6a0f911fd1bd8253bac272" + - "942cbdf8864f3747ff7f09d8a5a9d8599be7ee1744e5f1faf3e526cd2a06" + - "b157527272af9d38565957c9ce663c295766c0e0e464971c6282b70d4c0c" + - "1fb3b69856b34c089ad2b2c745f5a033cee1429c5b855581ee285278893c" + - "43a5968d9c28384b7abe8d072ba69089c938685cb1eab461f05314ad6d06" + - "eaa58512f8738bde35b7b15ef359dd2e8753cb1ed6", - }, - { - key: "9772c1a4b74cbf53586e5df04369b35f1fdca390565872251bc6844bc81bda88", - tag: "68eb7fc459ecc3be819485001ab438dc", - in: "e115cc2f33e367cb85c01a914b3a512404ad6a98b5b0c3a211d4bffd5802" + - "ee43b3fb07451c74524ec8b4eddbb41ca33dd6e49791875d716a44bec97b" + - "7c2d4546616939ffa3b1ab9b8ba1d1a637e7c985cc922606caa0453085e3" + - "5f2fe0bd2de129d1d1856ade975a3281a62965927d8bb695e54514e69558" + - "89361a2a00a1b24e62bda78d0b71a0d40147016fcdaf1a702331dda8e678" + - "d8f476dcc91698da1688c610ec0cb1d9b8fbcd45dfde6d1503ba60a01337" + - "ae5b2f5c854a82c3087779babd2e522dd92f4718cd9f8c649ac226745ca2" + - "fa1696442764758f67cd926369578ae87612790dc56ed9cda935281a490e" + - "5c984950ec7a4e930520d273a69da4ed3a330e532508e26f942961fed0e3" + - "efeed52a7b96250d723155aa39a8ae85131c255c32bf406b647de1a37fba" + - "dc61e302bb5b70adec4505ee66b3a1d1b7bfe9c58b11e53ad556d56e5807" + - "017bb30b71be94e8f86aaf1496e8b8d6db75ec0afbe1cd336c23963c745d" + - "7b4ba1787ceb30728f1762b46f6eaad5064c8029d29b86266b87f93142a2" + - "74f519f3281d8c1cb43c23eb184ae41f3f625cf624b05a48d73cd7783fdf" + - "14954a03ec1a930e9a954424eff030e3f15357de4c19983f484619a0e9e2" + - "b67221cf965e9aa8d8926595c793adfe0181050df8b845ce648a66df532f" + - "78b10c83ecc86374a4f8abf8edcc303654bafd3dcc7de9c77a0a9d1d98fb" + - "121534b47d16f75b55fdc2a5e2e6799f8a2f8000d4292282e56863ae422a" + - "5779900ad6881b78946e750d7777f33f2f013a75c19615632c0e40b98338" + - "1e9b8d35a26abe30242c45662eebb157e6d7a8a5519de60268ac289b8295" + - "5d4feb47b9eef6da65031c6f52c2c4f5baa36fce3618b6a331f1e8bdd621" + - "48954fcf0846afeeb0a6cadb495c909a7fe671b021d5b0b4669961052187" + - "d01b67d44218471bfb04c1a3d82bf7b776208013fc8adabaefb11719f7a7" + - "e6cb0b92d4cc39b403ceb56bd806cbdcc9ee75362ab4aaeb760e170fdc6a" + - "23c038d45f465d8ec8519af8b0aad2eb5fae2972c603ed35ff8e46644803" + - "fc042ff8044540280766e35d8aaddcaa81e7c0c7eba28674f710492924c6" + - "1743da4d241e12b0c519910d4e31de332c2672ea77c9a3d5c60cd78a35d7" + - "924fda105b6f0a7cc11523157982418405be0bacf554b6398aeb9a1a3b12" + - "fe411c09e9bfb66416a47dd51cbd29abf8fbbd264dd57ba21a388c7e19e8" + - "12e66768b2584ad8471bef36245881fc04a22d9900a246668592ca35cfc3" + - "a8faf77da494df65f7d5c3daa129b7c98cef57e0826dee394eb927b3d6b3" + - "a3c42fa2576dcc6efd1259b6819da9544c82728276b324a36121a519aee5" + - "ae850738a44349cdec1220a6a933808aee44ba48ce46ec8fb7d897bd9e6b" + - "c4c325a27d1b457eb6be5c1806cd301c5d874d2e863fb0a01cbd3e1f5b0f" + - "8e0c771fca0c0b14042a7b0f3ae6264294a82212119b73821dcfbbfd85bb" + - "625b6f75e4dc0ee0292ab4f17daf1d507e6c97364260480d406bd43b7d8e" + - "8c2f26672a916321b482d5fa7166e282bfeed9b3598c8f8c19d2f8c8b98d" + - "f24c2500c8ad41cd6ed3f2835737916d846f1a6406cda1125ed7740fe301" + - "d1144559b7c95fa407599ae40a795226513153f86c9b8abe7d8aa6963c99" + - "5646ec586cbf20a03a698cc0681b7bd333402d00fa8e15cb32300b5a24ea" + - "316c5e1df67de78891846cb9183a4b112c3bcc17bcaa5fecd6c1dbbf6ef8" + - "272d9269e7f0ba9f17050a6aa5f11cb28874360396ab647941f2c9a85cb0" + - "6a969919b16997b0827af8f909c614545f1ad638ebb23109f6bab6b49b22" + - "b2285cabbb998b3e1bf42771b4d4e52330b224e5a1d63169ec85fe1c7dd2" + - "46dbafa6138448420f463d547a41c2b26026d4621b854bc7786ab3a0a93a" + - "e5390dd840f2454028b7c3bb87680f04f084089bbc8786ee42cf06904d01" + - "7e405144d2fae141599e2babe71abfbe7644fb25ec8a8a44a8928ff77a59" + - "a3e235de6bd7c7b803cf3cf60435e473e3315f02d7292b1c3f5a19c93646" + - "3cc4ccd6b24961083756f86ffa107322c5c7dd8d2e4ca0466f6725e8a35b" + - "574f0439f34ca52a393b2f017d2503ba2018fb4a0991fddc1949832d370a" + - "27c42e", - }, - { - key: "d18a328b63a1d0f34e987682fe6ca3d48b4834b4312a17e99b3d88827b8d2238", - tag: "938b43b80cb3935e39b21dd8ba133cf8", - in: "bc2b0baf92580ee6c5efe640f2a029a791a3c77bec459be74cbc30931508" + - "d9f312c3a0944212831cbe4fc92e8f107f2f750c91bcc09f7624fa9a09b4" + - "9b7712cf5d619ea9da100fc23068ae2f4e353047e3956b215884bdb12235" + - "3f06b8ee98f36c3212493d61ae9ce151cd0453f3075b18a12d7d73da3de7" + - "dc2d98376cfb420069ca8148c511ca6bbae57572394a3c615a6fefb30c5f" + - "d727f964b4065ac9ee252bdd2bcae3e70162fe0e8069974e073f0a093d45" + - "be52d7de16a8f5f65c548aa6525822ffb00dc642530fedf355f7188ef017" + - "56384760c80afb61ad903d10119a7d615ec4fbdc79c490160bdeaf200915" + - "e405f2a921a2380c0ab9d2ac1e4fdc8ec4b907368c004458598efac13dc7" + - "2751e7faded538e3dc8b16590cac9b7ec294da0ad53e22cb9c05d8ef494f" + - "a04f6ab7c843c867fbe3cf1b4eb146d65339b0b03392259f12627a8e98e8" + - "0f4896c30b8ecd210acb2365539a872541921dcd8e1e54caf4936dfc7e1f" + - "68f3bbce61d325b447a8cce7f0fcad28494f2e47dae46b136594b5dfca7a" + - "bdafd6856f91496c05b21079aa55aa8c41628220a2cf0cdd755893375b7b" + - "b13d914c9a1d1db4a18f8fa36c55e52d0342352052032fb62d32fcd51cb1" + - "ac46f44b06e682db5d96d583cda03b966c650c03ae53542e8da1066b6884" + - "4a7e2280c664415e413f270b1fdcfbb40b9daa6131d071ee7eb1553dc5b1" + - "a50677971223dc316d2d326d57cbd529c88698facdca425e2d5c6b10d7ae" + - "cae28b8890aa44ede9b9193dbe8d1d8aa1fa580ca384b57eadcbefc96dd8" + - "bfccbe3b855a96f1fd4913035f817b75954ef1827c7718aab24d353e41cb" + - "a73748e14e0c2750d5b6a9752125708cc7ee7a498c7fbadf4186e7f8fa93" + - "bfdf281a49400f877621651b8ba87edda5231e80b758564e75139b61b1a9" + - "9fb9ec694f928ab1f47c6c4287bd4182d1b2be053380616e98da06f3ef57" + - "b570ade17c51da1d602b6ebc5a638ebde30d99bf4f91d0e01557c7dcd8f7" + - "9e5120143c935fc699eb5616ccd3cac56b5f8a53ed9e6c47ba896bfefe71" + - "2004ad908c12cf6d954b83bec8fb0e641cc261ff8f542b86e62d90e227f2" + - "a5bd59c9d390c0dd857f6da2b7624787a0bb31908bae84896890b283da61" + - "d8ec4f56eea38b22b438d6374b42243f9c1d94288874e53ab90c554cc1f1" + - "d736acde67aff55007fd4b3becc4d0f3ddd96f10dc75255cb0327aa47076" + - "2b3a3a656e33c87b02a682658b6cd2a75d9c0462803c9bbffa51441501a0" + - "3a2fbb2344aa13d27ffb9e98704ea6720b6a9992e53449688cd74d0648fa" + - "e8e776b0ea6bf048b2ec05341e5948cab0af015328b284ae7bd89a5f763c" + - "eaf5ca3e647a9f5bff7197e4d357e4359fa5fe30709545453149be510e3b" + - "ff86beeba5110c79c0215fbe9ac9339a8ac7d41f7488588ab14ac657aaf7" + - "d5c03a353932bbb2b261f0e83f3526c5e8e0c2348a10ab4eed6ecdcf9014" + - "7550abcb0a722f257e01d38bad47cdd5a64eef43ef4e741bf50da275720a" + - "0aee47adfc5cd2534b911dc269197c3c396820b303f6941e3fd85b5ed21d" + - "6d8136745c3eeb9f36b1f226434e334dc94be8a5606079cb7643136aacd2" + - "da9c38b2eb7e2b898bd8632003767bf0c87d00a3c2fcee48bbbcdd949af3" + - "3455128216709df25879b0ce894ac4f121dfca6b8c7865002b828696641d" + - "14ffc59924fbda50866fded0afaea545c8008c564a3a0b023f519a9980ea" + - "d541d91d1c07a739fd02286ea5660e473f80494236a68e84ea31aad71348" + - "e45055ded69c39941e31d51df257a4d0b0d8f025dbedee093f2b91795bc1" + - "533dc472020769a157a187abd6d8d52e1693e2ef56b2212759d0c0120e54" + - "c425d0084fdb3925e296dd6cdd8e677043a90674904057d88ebdea5998aa" + - "03562a790adecc4399352df43e5179cf8c584d95ef8e4b37295946b1d37f" + - "faf4b3b7b98869184e42ea8b304fe1059f180ff83d14a0861ca7c0682c34" + - "b48a70df8653bd8d9a26f9489e1271fa44e41b392e648d0e619ecdad2c53" + - "952094802eeb70ade4ffe096e3049867de93a824217e31364b18204e9681" + - "dd8e84ae2678aad155b238f59dd9bf9ce07e97183a690b2a46a8f3624843" + - "5b2f713e7d8dcda4dea1e3c4cf9692dda082322c51f7bb1f63d92aa987ec" + - "cf1355a043e21a7b8d60a2b97f18487f6fff4c77df92dbfdc9837540c518" + - "9fd9585731bc6e726a34ca21154b0499522c9d1016953dd0fa2eb6a92b6d" + - "14d6e3da5c12fabe92bd639e253983fc91041091791643", - }, - { - key: "46e8eb27acfdc8f4be622d8741c7bc414464c149e21da97ab4afbf3e07b98b0e", - tag: "56b5f49be824c7a19b19faabf0787a87", - in: "ced52b76c057872a60107194b432cf04b7be05e65209045d2952ea0284d8" + - "3e2ed5a15cfdc58071204573c18ab03765b4d5e63a601419e039c42075b2" + - "7ebb2827de9c6233d6632e6d3db9140bdb4a9291d53f33734c2dc8e24df9" + - "0764dc10e0d321d20fdf659bfa2a81bc9e04fd0f83448143276647c08bfa" + - "dcfe3bc23898eda655c9353693ed7b022f43eefa23c21db7660c5029ca64" + - "a6085d93029ea6c43197356f56b7624d4819f5008d053357d981ffbe7f40" + - "96d6c55d8417002d36189b04bbb2c637339d90f4910a400833a8d422d88d" + - "c816c1636e8d9f7f926c244a28d9e0a956cec11e81d0fd81d4b2b5d4904a" + - "d1a5f55b5ec078dcb5c2bc1112bbfd5efc8c2577fe6d9872a985ee129e5b" + - "953e9cebf28cf23c6f9c6a5e09cb09ab586c6a50e4389cd3110777591d7f" + - "0608a3fd95b99f6ba03984fb0e13c6bbbde3668c59f2f2b69d7caadffa94" + - "6f67e725d56280e59e66dca025a18d4616e81abd9801835bd94485bb2025" + - "dee81fba440005b181ee81dc1d7796cbec92e4ec1c9016c8e8073cf281ce" + - "f749993f09a618a4671d58b476feffa454600f82955c591882715148a826" + - "586f68bb50059914dce1c1c85e5e3951647c9964ec9316005209a58baeb5" + - "2c6d01e6b4c275c0050a7e2bdc52133e433b050a700b556d4314e5c041d1" + - "93ee47f47adc971aed1b63259dd5cd4f95854a71a947eae3d3d12d0d7b52" + - "c6cd2fef2d2e892607a9681d73ac3236fad21ee30a4f857010bc95c00d5f" + - "6f0c6b3fe50cd6452be6eec4f5f01542dc2cb5e2db1f52224f11348fe2a0" + - "5d1e5885f1317f2d06ce2813dc4c723008e836a2ee95d0aac66855fe4c3b" + - "1b2e02ba0700be759b1ef1c2a3123ee4ccf9200d8d4de5e0d503f04c2053" + - "66393d1e91b648392ca28389d976aa618b4796acbfe8aa356ecdce1f7786" + - "bf09af226bb9402317b6fa319bbb9248d8ce00b1f49f066c69d4df93266b" + - "938342cd7fd4b07c320c2409ef72d8a57c21d0c6d6d493f7ca94d01b9852" + - "e4fca6a9291e9060154bc38af6c86932645f53914709fc90e11db56ec471" + - "6d600ee6452041248ea8244f79534f793bfc1f2020855d817cb4ca3c48ea" + - "7f6441ce9af9bda61936c226d810086c04a35e8654fdc30d4b35701adccc" + - "016d5895b2121ba4066e44d694f6371d97911786edb73dc3020ba186a01f" + - "ee3dd6036c0e205a8d05979bad228fd12c0fd2fded6c7f1e4c11354d266e" + - "d9c2f706269c43cd90504997d93a17b39b10dab0ff083ab3bd06540ce612" + - "d08f46ce75a16ef330525737410a0d98fb3d484968f9c12edcaf50103fdc" + - "c14128ea4ad6c30b56247eab28197fe617e5f88afa5cbe003c63d423647a" + - "d3042626fafd2084a0582ff1b1efdb5baa162662048019546234e2f6b6a1" + - "d8bb971114aae41df7795b4f3598f2af9e8921a9aadc7fab6c780aaa32a3" + - "84865a4ccb02351dbc55ec92a3152d1e66ec9d478be5dca17b4a131b4a0d" + - "3d4420fc6123fef80fd56ca266407d58a7880d6b7e5ce2b6bdc9a3721071" + - "7feec573d83c83a2e3f7d4023f2f68e785cde728fdbf5054060e4c89faa6" + - "1c9dd10524a08811d15c627b3b4ada549a3fa1d8dd77c005daaf2addeb10" + - "0abf694da8dd692f113965cd6366a5a7b0c17e1f2a320243e2c90b01418e" + - "22426d0401a2c8fd02cb3129a14fdfa6cbcaa1f1c2f17706e9ac374a3458" + - "777761e986ee4c358d26f8e420d33230d198fd86704e77298dd4c40c5205" + - "7566ac0cd92993b21937c3a3b4a8b89110a97cf38c781ad758bdc28f3565" + - "60cf3acbedfa8e05b396d226ef619746e8e4fa84c8e00a7f0e6d652808c8" + - "9c9b123d9bd802624cfa949eb68af85ca459b9aa85b81dbc0b630856cb9d" + - "7e18cdc96b3c069a006dd5b716e218a5ed1f580be3e3ccf0083017607902" + - "a7967a02d0a439e7c54b3b7ca4cc9d94a7754efba0bb5e192e8d1a6e7c79" + - "4aa59e410869b21009d9443204213f7bceb880ccf1f61edb6a67c395a361" + - "ff14144262b4d90c0e715dbefce92339ff704cc4065d56118624a7e429e4" + - "cadf0b9d2e7ffc4eb31c6078474a5265beba0774209c79bf81a930b302bd" + - "0f142534a6ae402da6d355a010d8c82dc379ea16d49b9d859a7de4db6e62" + - "40f6976ae0f47bc583b327df7ec88f5bd68f713b5d53796e72e28c29e843" + - "6c64cd411d335623ff4f5d167f3c7b8cba411e82f03714662425c8e1bc1e" + - "fbf435d28df541a914a55317de0ded8c744a1c3a6e047590244b207bcdcb" + - "f4bd1f9f81210deddd629192c58e6fd73e83812f084ef52f21c67bea98ee" + - "17554437d9642e2e", - }, - { - key: "b41210e5ef845bd5a8128455c4e67b533e3e2b19dffc1fb754caa528c234d6a0", - tag: "72c9534aec8c1d883eef899f04e1c65e", - in: "7eeca180bb20d99635e36b9208221b2b8ef073fbf5a57f5190e19cb86c49" + - "89b0e8150d22ec3aaf56f6ed9cb6720284d13a4b0a34cd3d7f7fc7089326" + - "6d1893fa4185269fb806677ff490aec8f889896fca50d6c80d295875b1d5" + - "4a779b6d49305360b31011b48537157d0f323ff4e865d46fba6bd23a06c1" + - "46878cf9404360d325432312ff08ce495edca63a3c93c44d79c050e3f1de" + - "4b6ca5fedbbd43dbdef9ceb26d440a59c7e0be3a8e461c4f15b6b1e1dc36" + - "a71fc723ad593fb903e83d0804ce497fc49bfc6b6a602b9dc6e9891010b1" + - "4ca066cb1c68044c1ad837c638076dd3708078509cba49fdc54922cdf5d7" + - "715fb43e9b5a5942cb8950eade143577bc9dcedde58d51deddc70075e452" + - "bbceab1e95b5d003eb96bea69687faa6d50d9c605769cb4287b5d9924dd6" + - "8881c699abaa6f93e41dac7639cdbbbd0259099a3ed096f482a1fa322b15" + - "ffc379812c74e09e95f1bd3706347eac421fe56895e738a47fcd3e118773" + - "c3a7e7e264cc7ff5a53a80e436df058265dab9756fdf6913786a47e98bbc" + - "411052d58ffec9ee948e28cbaadaae471c5d828eaf3b3c87d3bfd495477b" + - "403da54f1418a15ace0d4d0df68f6a8f2b0457b127d5eae1f45ae055afa1" + - "8f058d5dd7eea559de3ae9378ca53f7d6dc9a9465ea1f945295f16ee0404" + - "7fc9dd3deda8ee32631d7af70c20edc1e12c5f8abd2e78f43dbd4cd6407f" + - "038efab144a24ea8a090a7ba3e6499345a60106220c2959a388e1a73d070" + - "1d854bfaaa86165a5aee934b615ac7f45da7c43a1e8f74613917ed10dcd2" + - "27e4b070414412e77851db5bc053e5f502bb4e2b2645bca074c18643e814" + - "4caeccb58be49ea9a552913c0616382c899635eea79a166988c206b9aaa0" + - "977c7ced89c4c7aaeaa8fb89b38030c44530a97187fda592b088198b63a5" + - "2dfad59a0a4c1aadf812bdf1881924e8b51b8fd4dbca8e73b2986b3ab484" + - "171e9d0cbb08be40ae60de8818bd7f400191b42c7b3200c27643f06720a7" + - "e0a17441f34131629388ac43955b78c31ea6602a70dd665f872e7669e865" + - "f6f40e634e8772d747608cd3a570e1726eb1ddca64f08582b022bb026eda" + - "6a913dc83f174ce3c18b9fc0503d3ac74e2fe45691d6dfb4af8c86d752a1" + - "6d6664fab4de08afe8858392fcc35cb9ea82fc42c42d48c0c0556267ea0d" + - "cc19b10f05e0318c4488ffe704b5036908f5cb938eebd3163503acaa874f" + - "592d945448fbeb93a877a26a72306a36e181745ba300afdc30cb7986919f" + - "3dbdc5c47ef1fa052a9e4aeeda3955f61ce2f30a0593a81dbaffebac5a49" + - "e5a8d1308352701d1ca9e620a67a89abdf5f0f8b1a0acfde5819981d4b77" + - "58799c0fe41030b86754837712af821c315301aa8dd50d1387b9fb92ee63" + - "10777e08229edd54e5e86b086ac281bd321082ef46ce298a6211aaa3aa4f" + - "6e55b5a4641220ec94cca73087760da1b1ac3e0da3f438214e691aa184b0" + - "535950b715a64d11485940dcaa3f72e0aa521002b1443f5e7880e2a85b83" + - "40d32db0fc4c4702e10f0fa24a35da9307850e945f608ad34d6cfdf6f2b9" + - "ff4f6b8e9eb5a883546578e2ff3cc5787322e4384640f42dc5bd05f432d9" + - "610dcf7c06cdf34762dd2a5e805e24aee8cebb3b4db9e4d1471da995bba9" + - "a72cf59ea8a040671b1d8ce24a3dce4fc86d2df85c8ab5e1eb2b0567c186" + - "4fb464f48c3ca72c7df2749542ed4d4be51b63769012ce3d06356856b2a4" + - "24995a2429a156ad93bc79c705e7b163149ce53a42c34a19680dfe4fd0f7" + - "fce38c30dffe9da9bc941d131f435c1398f8284a230e9d6e3992710074c3" + - "881d03aa309a9edd0fde7a39c33f6455dfcc5ae3fa20ea0e0d6549a43536" + - "b4cd8a2991a135b7d7a4265fb840318813091274414108f13fe191db7774" + - "6a5f4270f6d51a29ff523954f84cb76131d4abee79161dcbd97dc1ef24cf" + - "db1fade057dddee00a1e0de0db1afaeed1b535f7bb402afa3b297551fd14" + - "8c8f3e05f1351d3a8ee2948daaf14e7fc448c4670c906ae076eac5a7c656" + - "fd5f9cd937b91e26c9e5adb43c138f8d65e447b0022a524e059f879c6e27" + - "4ff7e671f75717233aae70853d5bd7bbb41b43c47bb08d6dc2f54f9ec606" + - "9487d1267add72403d01552a3d138abab9ca8a0d2dc32439759aa5695f70" + - "1a17d28dfb85850fdb55fddadcdde4d220e4b05821e5736d346e7dc9c945" + - "72743366488b1de8975184771361894b6520e3407c5c2e38473430969e35" + - "b106024da8618665d58c9d084824a28991a33658d6ec702139e01b65b7d0" + - "cc537a644caeee880657803d95f5f67816948d5ab362922f8ffbd531473e" + - "b0ff8fde2afc37a4abfa28dbed0be1b3d4ed48a1d02358e8403905d33b12" + - "3066e7a9fe2491ee9eb24fc9de7dbd322c8ddbc5ebcd0d92cd102ebac96b" + - "90e2fd784fd6d4b699304df23b17d963080a013794322690456be525c071" + - "b78fcd2d1148026e44ff14c4d0f942cd44d2b3263f4a93b79ec7a618b4b0" + - "d77ae7a1f6e6c7c7e2f498b825bf1954df348bae45ae1d7c87b6787f1212" + - "60c9a724429a4a2491ef989f65acfdc72fa717486dcf1984905218e11cc3" + - "970a09d71061e6df751f100abfbf", - }, - { - key: "d9b0dc303188756312c12d08488c29f43a72e78714560fe476703c1d9d3e20c1", - tag: "6b9782f2a09b59653aa448348a49291b", - in: "dbde1820035997dc8a8ff3015b4e0674e7ce7bf0c2d994b7977f2d91b49b" + - "f200995040daeb1218a0f4307b6b8211913992b070d321bdb947b4ba5017" + - "a0885e7e5502710a75cbbcb56d49e1bdc2bc2afa5a0e83851162dec41340" + - "bafc41c5e11fcbf4ea2ac45bc57def4742281bbf734777f83c9ae1ea3d5e" + - "d42380230570f59c40d5dd9a2d89b75fa3c92664f12a274d965ed8de79a8" + - "b37f3763939ad21d1703ad794f617c8b32b20cc4dd7c1b7f969a65e1bafa" + - "f6c43f30c9eba256f10201910e2cc31a9b13a46ad29257024ef8f2ee29b2" + - "ee63cc5b6230ab9f87cd5cb534f4b0bb08a790466e0d57b849fffa1ed21b" + - "fb0b27804e3ff9df7bebf14e100cf91691a493e53870abfad6321f6711c5" + - "0fbcf1f0b2c1e5231d6c0a08e710525176355f6f82bedc1f787f0d3cb41f" + - "a11e91ebf9f4cbae46035a371232d63ef0d8bda0355af8cd0a2f7d1327d8" + - "0ab769ea0f1da0f76ec99cc737b5ce84675fa8a9ac0c98342bb82b5848bf" + - "656d35327ea01a1b09d84ab974c307511af68a30cd6978b529a8f58c68a5" + - "9d476062ace8897ec0d1a90d5d167e29ebaa6f46d93d697760c8771417ce" + - "94c0f3698985a98702833d1b68641b811840ca3d935386dbd4600fbc81c8" + - "728c4fd0e4588be739a048f03bd4ac651ceecd7e2fb120fe7190011f957f" + - "cbbfdc025f1ca0b356208db8cad87fcd53c5d3a30a7c2a48140ccd4cdb49" + - "f3961cef742caedd1e848bf3cacafb0da030416bf3177877aa0bc5f9d1cc" + - "41fafcb829d5e3ace9394028683d712552579e024084a6b855830ad9f567" + - "ff58f05d3ec263eddd6f56adec378f167e8dabbeaf7d0a9e65c71660314d" + - "6c8d54beeca2711113fbc32a2ff8c0daa8373278d10085d2a0660ad53f4e" + - "1ade74a483be180180acf9e9ad3ea5bdd9162ccd69599163a451c6837d5e" + - "a5e115bd9a560f395128ea002ee739009a44fa46078b18959933fb6e866f" + - "eb4612a56ce93b1affcb95fccaa18d71a148582ba1412a5daa07404fcb39" + - "c3cb4a2519cc506c1172c6c326016ae2e5410f6a438569f35a50d45cbf3c" + - "c46188651aa22c257858f60649cee8c05c75953ce49358dfe5980445fce9" + - "614ccd16d333ad236e29d204691ca0bf46f29da954bcaae52e41016556d2" + - "f4cae1d37565bcbe84de1b49f344d0200478a38187da29c155cc98184d9d" + - "33dca088d70054e0fce321f7a90c48a14963d0ace2b4e7a24b21c14a5e67" + - "1994fe1f7d22d1135d4df9268dd18d323fde3603288735626a5449582d35" + - "30e2c2225414e05a8c7b987c873a82e272a5d83e59b90f3d7264631d6ad0" + - "4a0cf3b5e96596a66ed5bfbc24ab6e4870aeec0acbad2cc5affaee06de32" + - "dca06f175bf763cf8e7fdf95941a177e934f0078be7dbaa4c9b6f5c16b4a" + - "5607bab5d56144a6ba3c7d9a084b8d1f4b24b6f9754ed207b230d3a2cc26" + - "259ccc725e1f8a44c4df8143e13edb5ebf073e2c9d2da5f1562df4feece2" + - "f6480987f093f642eb7afa3aa92dce2a8b60bb925cd2d11cf6c2ae7d2153" + - "1a9c8f068d71d0e682023932fe64e956a49347aed22b21084c4a84480491" + - "244ac6b337b6d12d5551ad5684766c68bacca62bdcafab6603c81bdbd8e6" + - "80d9d8b3825eaea4df023142e840f98ee251466a0422d810a54726a9f03a" + - "7e0afeb0043e60e2ba4908f951d2e87fcbc372096f2a9f4f2a95ad5faede" + - "3796b11ecf4401c3ee3d268bd8c46476c61e0ffc5c43c0f3c58c79e20f75" + - "520c102aa3c260972a870fc50f8841fa0553a9e30bf37ad282fb51b34adc" + - "7a933ca1691a8a706605ce0b906fdccbe954f8e5f2f63c42599a483c4be7" + - "3a041ef90ad930fe60e7e6d44bab29eebde5abb111e433447825c8a46ef7" + - "070d1f65862b30418efd93bfea9c2b601a994354a2ff1fc11c383e7bc555" + - "9e7546b8bf8d44358b1ce8cb63978dd194260e00a88a8fd17df06373aa80" + - "04a89172a6051bd5b8cea41bdaf3f23fc0612197f5573f3f72bce39c9f89" + - "faf3fb48d8ca918586d4feaea7e0f2a0d7a6afca096a081af462ea5318cc" + - "898a9cc09e8258a837559570cbd5eb901e8c0e04ee88ba31c81a76b000b8" + - "0e544feba576b3eb5272b53e46e96a0b35b9c759caadcec61444f8ec47c3" + - "45a1d2304e2708eeddfbfa75a98eab3493889047d690e84431d445407fdd" + - "99560c0bdd287e0944116f8ac62ab992ed3f1e2b415aea784b03c6904795" + - "f4326ff60bc839615f2894570dc9c27cf928ef192047528a1a19ec990978" + - "3b0d1a13dd4baf4a19e49bf798975abe2ad167dd574b32b3d0c22aa4d9b5" + - "2761e8f56cf2100fe5a39fceae3d865f3724d4f299d07ff899fed6baf7fc" + - "eb7189357bf56cf94a6493e61301b43e3ed158cb9c7a0e615fd9888c2db0" + - "7f7689762f62ef6b3ad4125e06b07a422f5040c3aa8b8f205d68356c9225" + - "56fc4c976165fed9599daeb297498ecf744bf6c7dc5e30604c461ad99402" + - "2eea0fb6fe33f82a97b5c272fd24162a94b761ec7e52173e7bb42e88b343" + - "64f5fa2c141ed04a86b8d00fd9c25bf77a8dc3e63f5543331405be6bf421" + - "6a891089b316aa4f887cb4aff0dfb4e80c2ccd65ddd9daa74b17b4411c0f" + - "c849dc748d9b138279dcd9ebfc6e6759a53f5c28a41bb82107d71cc161fa" + - "81291a8290", - }, - { - key: "fb70ae7ec12264ff9f51124da188e5b11dbf53cae2671363f6054b575b1ddcc1", - tag: "d9ab81fab28b3be96fa3331714e78c9a", - in: "c62edf20b1d53962b42386eb570b10378f9764421ecbd7c4802853332747" + - "19ff4c89c06005050fa9ba6579a844060eb7ece6c43bab520e683e0f36ba" + - "49cba259edc6ae35d41e0d7812a7d5edbe4d90cd5e0504d16f4c3f70d01f" + - "5a0313de55934b661ce1ec317968c2c4de60f45c66cded8c10565a1ca6d2" + - "3a84bf182df2fcb05956ed4d46b49fc0fe3bd23961d9466fde070341ce41" + - "bc6e148449360a31634fe10e91082d82def90d9da2c250ea72c58add2058" + - "d046b4392b78bc3af5b3936ed568733e8ad5672dabbfa3130a6a535ec73b" + - "da8e7223535f49f96cd35d56ed4792c5cb7076720d5461d96a2692b2ada5" + - "2be08fb7bad15d15a0108143790024f0f15f5adc275e783aa56b70844061" + - "e30952a040e4cb9650f2a010417812790105d8f58bd25d99b0db3cb16229" + - "3f6322e86cd5b0bb1505a7b998fb0f81d1e1915faca3c2c8ddea39115507" + - "80339430a7955521839deff5b301f3fad54edd5ebd2ac4ec9b1795cb4dc0" + - "e2eb62ebca8e886c3f1e507d10a0228c3027b472a7104b815f5ec8dae55e" + - "0783ff7ae9a3e6b99e381ad788206b135520cb870ba0cdbe876feea843b8" + - "5a82adc95a6d71c555f798da92b82daf0abfcdbc82ec30b1f12d78490b06" + - "7315735017a94ac150b44dfaace151896f873923310ffcd41e91bac04de6" + - "d70ea71565948c907ab21c4a23703fbbd2a8de6d3095f3d8f901538968e3" + - "60e7bfddb9d22036b1c23f4f5f1b2ee22623426a2d5de68c1e1a38e38e08" + - "e2b5670aac1edff69e9c73c2ca56cb69c709009ef1d541aff1fdb2b40c92" + - "9b87f162f394b76cdbba1f5605993e4dd9c312321d59b0aa5c6e33be1b10" + - "bfd00b92d4c02db064d0e4a98f2913c89051b0f0ead163deb5087b6466d9" + - "84f57553b0fa53850eaa142e072fd91802eb9f0d2eb7318dd620555e6ce1" + - "86706b866d41cf6ba81f100342faa14d801dc6f3d522db38fab17a879fcb" + - "b6acfe922163505bd23a6842f6ef6397ae5fb6e6016421998bd43b0142b0" + - "3ca3b16d6ccb7a47891c75c687d791a930b26aaa2e3412e7aa16e2cf1501" + - "7bf6df6d2e1c289af0d7ce03954a60c1dfcee5e4b3da51eb43ddd14faf59" + - "082005d0c8b104561f66c002ff426be60be769282fc5685cfd1968df1941" + - "73667e48e9ad681d35757f1199f1d93377bbad093c8cc3efa2bcb6ecb703" + - "694422772d15aaa58cab9e9ab277ed510f684114cc4a44ccadb3eb1c9a76" + - "d8619a9b7743106df6fb6f927ac49b22ae5bb9a9a4d231e340a2cd0e3282" + - "53f6d75df694826f60e4b3e758398793eaf73ef5d4b56cd1471e16400f40" + - "4a947e9737f4f874fe09a29ad799f4525156e3abbf0585c3c3c0a3744c86" + - "5d56db3d2ecba6bcbb1adcc8bf5f3b2a2d46d3eba18cda55201598a8112f" + - "d8f14e205f0e615f081b8ff6c5aa6669da776bfc7c34d5af4d0b26d0d819" + - "f6aacc53cf3c6653138b9a962acee9d6ea01d280c35bb1f05d1509238ccf" + - "004c5013167f804d1780d9f4ef9d45742fccac346b0472bde24ff5db9ae0" + - "16455a3c02256358fcd8e6a9aae94f8a37a1a3da58a889bbe3d295e16544" + - "2e580f59bdd31c92ffcab40c49c1cdbb4db1dd4882b66edc10fcb1704203" + - "c518c1d8d4c268588ce13fc38e0210aeb47d11d2603d4b3de5c6ff5e969b" + - "9d5904abb282b699bd04a6e9f1cb323679e30400d725aab128a032745dc0" + - "be05a46b02b34b93bff02523cd8498c021fc35a488f164a70ef1ceb873d9" + - "14a681d3a3a34cc76bfd5a547e2630d7741a284511bae5897d9f7a197fc2" + - "456af5c6cd7e1a93d3388c7a990b5feacd7749cf39fdecdc20adfdd540c6" + - "9d330195db7cc0d4555ea5f5356a3647e2265399f153c34ed1e217c5dafd" + - "c2c5dd3d566c332c7ddacb0d76ecd3a0ad505a4165443aa81b0f43cabfb4" + - "62942fe74a77c22b8f68a8b1a6d712d1e9b86e6a750005a3796ba1545396" + - "13170906d228dabf572ab969c762f8b296054f23d5d4a37bff64bf9cc46f" + - "43b491b41101256018376d487fe8097f1653a7a9e99e1ef2492600598fb0" + - "bbb7df8270be8b9106126d6f491f8b342a96ab95df6133e883d3db4c6a99" + - "402aeb58d371263a32dcf76d33c8904395b9cf0016fdfc15608eb43e20b0" + - "99cbe7455f7a76f69bba058ef96f83ae752587485657f89c7f26fde7fbeb" + - "a82ede581ee92821dc13b8202930aa58bd4f1c86f68926baca0d06fee642" + - "ea8c652d226af91a9638a0244f1a03c7ce56969b87cd5c1f86110d192e0b" + - "98dd979d74acca6c1956b1127d9a1f456053d17974081ed8ced0faa4293a" + - "319e5b25ba285c1151214f52c283e39c35af51c4572c8e395b7856697bfe" + - "dfc4145ab4ed0bdbe43ba509c06a196ae6bf30d7582550cb546c63b51833" + - "cb0dfff7196d83f6a1c6d6d712cce2ec1989fd9ff5a0a22ac5022b49d566" + - "58f196703e4809e7624fe7cfa6c13b378f5aac7e66e657ed7eaa942d1a00" + - "544a947199f24d736b8976ec2cfb563433c49ba131bd08b63636854219d4" + - "c45100c98e3092773ef492dd9210bfd8f54cfe2cddafcf5c05468d90e620" + - "0c2ef99d17fa6992cc45eff3072b7cfd51cabb07ea3019582c245b3ff758" + - "0302e88edc2c13fc43646ba34de37338568baa66ecff3accfebad88d143a" + - "fd1c3b09ae39c501e3f116af33b0b720d6c2baf5acd7f31220788b2f9017" + - "3ed7a51f400054e174d3b692273fcab263eb87bc38b1f486e707d399fe8d" + - "5a3f0a7ed4f5e443d477d1ab30bc0b312b7d85754cb886e9", - }, - { - key: "f7e7affceb80a0127d9ce2f27693f447be80efc695d2e3ee9ca37c3f1b4120f4", - tag: "41c32ced08a16bb35ac8c23868f58ac9", - in: "5a3607fb98eaea52e4d642e98aa35719bfce5b7d7902950995f4a87c3dc6" + - "ad6238aadc71b7884318c2b93cd24139eed13d68773f901307a90189e272" + - "6471e4bf9e786b2e4cf144764f33c3ac3e66521f845f6f0688f09eaa227f" + - "e71033b0f74295f6ddb91fe741323f2b54f420cb9b774d4291b06219f1fb" + - "4410b55900425c5e6fcabec76a5c2424d637a1641db6f0f6cad564a36a91" + - "0f49894bfd598e91f38ceea65e8253c1284f210cf7b50a96e664e562f3cc" + - "01c4fc490fa6d4679fd63fbb3ed8995a8a05166b573e92d22ef4370c6aac" + - "74ae94c94177e5f71143c6f340efceefda679ae76f6ed7f26eaa4848a8de" + - "8c40894316efbb06400f9695b18ba279e8947c032a84a40ca647d9ace457" + - "6dd0082494d6bd7be4e7928e749c78110af8774a5d43e9c9479964e2fddc" + - "ee51146460eac734311225d08c60706e40f298a7cb97f369ef599be097ac" + - "3bf1c275497bbd68968a235fdf8a61bc7cfeef0fe451bb04e662ca39f34e" + - "a8e3acdd0befe9762f9eeb275c0cdd43c80fc91131d1e0e790020975ab65" + - "afbea81f303ebd86760821efb4cad7cc01fd6d6fd194ac5ffe7703d890d0" + - "169e21b444cdbaf691fc741a5d99bd47357c37785755fa72582ca4754a03" + - "b4def86ded39aa6d9eb3f38801077e6d17e3cee3fb57ae83f30c79c3cf29" + - "0e2739c6b7323612cec3a561ebeadb4faa642f150323aaa9d270658c907c" + - "4c1610a5e1834730c08be3379cf1abc50c30e2bf01ce903927c27d85e135" + - "3db9e216dda8860c45925e2bb791abe5c8281ee6d16607bdca87f60662dc" + - "bd6e20224e7f009a86db66fadd8e37e0a59559328385090c6953cd20bb61" + - "f28a734fb056714f5159977f18e5c5f11de75f7a00ba807e47a29e4da32d" + - "5c67ec76ce4d7b669b5e6ee17e1df7c673dd8a7c87fce665cda8adb9547d" + - "1dccbdbe7be44846b4b121b0bfa65e4ed530789510d79bc4477e50178060" + - "f2668ac8956f39ef422ecb0e4cf90b8ce508552eedeeefa6c7d1bccc077e" + - "8088bd7e0e6aaf0bda9f11c412c270ee2ad6912f9808f9344a4bb137bdac" + - "b5b9372b00b0de026a8f5d1fb13972e1290b5005689f7636c43aee2fd443" + - "93d390371ae573f0e064b2d7df552b9adf04bf173d71c621795b9fb503dc" + - "5e918536c6ad25ce4a76f70e6b752b6d44be321187269a19bcf33ec899ca" + - "40e88b4eb23217095a85057bf95d8a54812cae4a7d32e0c2966a21376110" + - "74c6c8c3dd45a553c43c675d23308709f91be0b235d0222aa5e1e1ce08f9" + - "c6b45ceb5b47bcd7d7b2d4380bcdbd6eced452d93e6d8cbe18123277889c" + - "7f86b15fb991364a501fbf5d8244f2e3332ea0ab49e833c6f765017a4006" + - "cc7cd1a0365945a8d8873cb21832b210c83e451c01ac949de2fb0f7a420e" + - "405bf64eb251c6f022181595d68174b91e503187d3b3f49b60c23e44ea40" + - "ca20311305b413047bb22e89672758b74d6bd1a06decf09e9556421087a4" + - "0c1d2c44c5fb13d4d9625581ac4ccef1a1b5eeb5689aac5c0291aebda276" + - "50daf9d4396a64d02c6d58bcbd609d9a0017880ae0cbaf02ad0f1fc8d1b3" + - "ec987ffe13102d77352690c9b761bf13ea0b3a8ebad4a0823817fcaab4d0" + - "9b0bf03486620761dc77a6ba007ba07153b17425c4026597473e78863cbf" + - "430c0e5e9b04a83ad11506b61b8d9be3aeb06b5114e0d53d4724863eba12" + - "4f3b974bdb0d02743520409910621cd730c97ca984fe2921c38055f83ee8" + - "c4611db92e52d8ea51d89203e89df7586c574df15f3a96ed5a10bf04cb27" + - "f9656b5b11cf35fd21360b029ab26e9a741c6b3e6357aa1a41de2cac6e85" + - "f9a49e3441e60a60e74f434e1b8cd4454b11962e5507ebf904e9d6c52a7d" + - "9722300517c434758fbd6191f4550108b143eb16c0b60094fdc29327492c" + - "18a3f36737e506fda2ae48cd48691533f525acfffb619d356bf8347a8bbb" + - "4babdc2ac866e497f192e65a694d620687cfb4f631fbd6ae5d20ac2e3a12" + - "4d85f9391a240b616d829ac2adceedf8f3451ee77e4835639b13c622ef8c" + - "48a181fc7598eacb419fa438d4046aa971942c86b36eb8e16eab67105783" + - "d27fc56f5b66f35451b2a407d4648a87ae70807e45bccf14983b3abcb198" + - "d661d562dfcb00ffc569ca967171746e4e36f839946bc7d2ea9a0eda85b5" + - "a5594f6a9c1b179f7230eaa7797a6aaf8628d67fd538050cf47aa654778c" + - "11dbdc149458c1ec2233c7ca5cb172356424eb79479b6a3eed1deb9f3278" + - "5282a1034ba165032b0d30733912e7cd775cdb7e0f2616b05d521dc407a2" + - "ae7dfcf46fbae30547b56f14dbb0ead11b3666666c45d345cd5dbfa200ae" + - "24d5d0b747cdc29dfe7d9029a3e8c94d205c0b78b56d5e18613b3169bd44" + - "1b3c31513528fe102f9bac588c400f29c515d59bbcb0725a62c2e5bfb32b" + - "5cf291d737e67f923080f52d8a79f2324e45a3bd051bd51bac2816c501af" + - "873b27f253ef9b92ba4d7a422e2fb26a35c1e99eca605acc10d2a60369d0" + - "1f52bca5850299a522b3aa126f470675fa2ec84793a31e9ac0d11beab08e" + - "2c66d989a1e1b89db8d11439ad0d0e79617eafe0160e88384f936c15eb15" + - "ece4ff00e1ba80b0f9fb7a7d6138bdf0bf48d5d2ad494deae0ccf448c4bd" + - "60f0788d3f2b76de8ad1456f7572bd0ffd27bc2836d704d95e9c0df34571" + - "9dab267dd805577fafda03b834dd225ad9714d2bd182b4103faa5975180f" + - "90d5d6cac1825a19b9d4c87cc825512ae9dbeb33d2759c990905050f960c" + - "db3eb364c15b593524c882902b2a1d7fe40ea3f54fb0202fd8821463c7e3" + - "4b02a1209ba0048a9805f0468a13e03d18009318ecd92042959be263a51a" + - "407f1e660632c4247419659a4e073a8e9cd4a226763a7daea464d5427270" + - "7efd053cb4efc0504602c4f63e7d247b55db2ce1c07138f585d16cec97a3" + - "0731d5aec2166cb4de41695feb76280cbae1af8a2e67c2d5a3ac5487ffe8" + - "640f308ace6137e83576b79d586b663122221c20aba7a6bf60f73958f436" + - "59f087f850ba6e2d7fd862249c5fa6b20e3e43d4f2aa10d4c9cebfcbdf02" + - "6b8d103e4f89b93dd8af172f421001c8b162bd6d0b847a58ac108b6d6cc4" + - "9c7a9ba069deee", - }, - { - key: "e3d21f9674f72ae65661aebe726a8a6496dd3cc4b3319f797e75ccbc98125caa", - tag: "3c95668130de728d24f7bca0c91588bc", - in: "baaea2b4b4cbe9dbc4fa193c376271f40a9e216836dc35ac8012476e9abd" + - "43dac6b9ce67dc6815904e6c84a5730cea0f9b4c6900a04ae2f7344fd846" + - "58a99513ffb268c6899dfe98d605c11e7dc77de77b0d30986f3051754503" + - "7c26be7b719aa9ca1140cfdf4c586b7fe726a8bc403249396a11cfee0a6a" + - "f6c5e72259785cfd13c2897384fe527100170001ea19106aed38f7d5d9a7" + - "ad43f0b41451e19989192a46b4f9734a774b6304cb74feb7d83822044a24" + - "2e51d55c0b8318e0439493bd1a57cc13f6079166cabc46877d003dcd39b2" + - "c0b90f6b32fc77acf04a6c125e11b35d91e2b18401cd53df4aff804e3c67" + - "a8bb3894b27c6e9b0070b53a85aafab0c0a253f9cfd4d3cd3be52428385b" + - "24a3f9f71660ca2c38474d14a0309e2f400e2c21af6e379099283ff241d7" + - "51da5a96a8dcbfdc43b913b29cc8cf8020eebb4a67f5bed31f2e383f8656" + - "8c815ff172382b425e95902e80f5fc219eccb51b656d37b56660f749e5b1" + - "4976a23648680a472d02ba71476e0afb29a0e084984f4eac3befbf8dd802" + - "2b7dca4dadd18bbe58e49c49ce48a06a71557a9a620c51e2623f818e4d62" + - "c2564c7ba04595cc109685869b183faeff2ac7a65049fc57cb10fb01951e" + - "a525332782d691f9759ec2ecd68bebb9c7aece5d522a08ce7830be520db4" + - "c9d60a2e490eaa0c91e37b256a97f84b39fe3c77953748c3b86fd84e9547" + - "a298c049cb28b8c85d59548b8dce635d59487c9de615802d16a8adc4c0e7" + - "80f35b9f10588a431b39b499dca929ab9d225f26e5721820627fe62427fe" + - "06d5773a50878b6effe840dc55bd3ea0c35168f6b6a972d57e8f88c5993d" + - "1ae33e0b7e9459c123753b518c184de7aaf429df078c9a18a29af77c727b" + - "796f5c1a501fa8105ee873c4e78c907142eb19690638a182fddb413adb06" + - "d66db19c7f6f46dac582bd72a6347b4427a576eb769d233febaf7be8f768" + - "337273c12253924f15653f9f3602b783703a81454a1dd7a8772a9ab1eeb8" + - "51be33e0c6c0708f3cc2012cabe8e2f0c38e35372abe27bc148fc4e1054d" + - "9d151f80aec0232a3a92dd77928a3678ebd7d09ba7b4e1d83227257292c0" + - "b8bc4a76de36bff6c9deb383029afaf4f37d5b935dc080a18665545e4acc" + - "195da0b9545d8902408886204b64f8548b32d012e0cdc520c17d9fb3be97" + - "800c2e2b945cb09a75a0a49e5d4d81c4194d91e839333b2b9b9e34d588e4" + - "e20cc1e911ca0a1429fa70ff063f0090fd842f89dfc5cc44affcce4e1e1b" + - "8b11c612f66b074c03ac2a055fd8f51ac9ed4f2e624589ff5730721d077a" + - "fb4c19e43abf8cf3ffa698362be8be51e92c2c91a4a56be64d9ac6d3fbaf" + - "5536a24c7fd0adaf74ca84c508e5e8c8bf7d4254e0c44158bd26acdf3f64" + - "e78438b3aaff89ac9986cef1e3a88d5bf2016340367a1cacd01ec167ec6d" + - "185d93a2a220d718b43ce1d429d2cb598605660b030e51e8d75fdbdd5b8f" + - "8677675e196a40a88285b18b24c5d2d594bab3d457e6f9e503e38cd470a6" + - "9ff8037c9a0a0f110a434335d954fa856a3721e0edcfb14287c3dd9639ba" + - "4db32b7da0670dd0a872e468e3819741d0d4ecf0a4f7a011bbae1493c01e" + - "642757491189f8664be3ec6437c4f3c76abfb0276e44a4d28871d3487c2c" + - "ce2f230452cb06184bb8620919659a7ba0a3d5c12ec25678b03403715ee4" + - "acb6a53d281036d8f3a085143cf5ecc3a0c6c92129caa7ac1f645c7bb95e" + - "4f63da38dc319e2ccff4a9006f9b9b1a38c4c39f6dc686bb82d43fb9fce4" + - "0c767d3ff22f52c5f9900130c65bb6a9cc7408a777d49b70946665f4a733" + - "5099376b276a43dc9a6382bb2d40425f6481b1846148434c672b84dd7a20" + - "33deb5140d43ba39e04ffe83659b6deb48629e1abf51e68748deffb756a3" + - "ed9e0807506b248a024cd509f539f4161366547c62c72933584e851599b6" + - "82ec16f1d79e9c6a01cff6f51ba7f46b67cdca09f3ab8496322b990a6116" + - "8d7574854a1cb1cb8f30a303dbd13a095df56dbb940dd16ce79879cd2d73" + - "80a419842fa1b34da668286de4c1ff5917b7aaa64713c349dc8f855d04ae" + - "de9a3a4d0739dfc36510b1e7bb1695418164285c44631b4b1a7c5798ecb2" + - "d976c1a3679a827bf0e8c662567e402bcc1354222036ad5959a6f0b8508c" + - "6a8c7d4a63e7dde154d778fc80a011592771d55801c7e1297b00b77f80d6" + - "314ebd1f5b3057398d1943599897cfabb65e7568d8fbdfcbecfd4b8a83ca" + - "0a7bed08ab9a656424831e0d7718c15727af7c83b2ef5eb5684aa044eca2" + - "ba896811246766248b20a325094a4b4159f9cde1ee349be6dc3c9a190453" + - "0349212a9537f65ae333c288753cd2bef6c5beb2f4164168d965a2c0fb9c" + - "c8c73d9e776e23d53ddcfb83bb7dfe2a1b8c781280f449d6f310faf8b53e" + - "89e6a611d6d3f42f2aaed5259730d149b3e7dabdc9f865bc1555374738c8" + - "456abe112e9628fb31efc2ecdc972da05987aafce728ccaed246cfcdf518" + - "3fe5dae528bbfb99d33194167e0f84d462d3d0da83e92227cf57922c7956" + - "4fe44648d87c69ad708e797972c44c4a5183fd5d1150a1182e3d39c3cd16" + - "3920f1d7ed83992bc4116d9351ae1c6c4827d1374242e374310409f32d5f" + - "0f38c78b6489c568b791c70394d29ea2516dcb10e51bdad862ce3339d5e6" + - "14fe14f150961809c36e0a2c8eb872e9f7a1c0956fbc9194cb63ff9993e5" + - "d0dcf62c0f49e81dbe99f3656c4dea57b766ae9a11254f9970618f1b33c8" + - "f339f440de240170f7a21f03ff2da42102b323ce2b9b7d0de5aae324d1ba" + - "c87b1e4c5279a566bf659778f8b03882aded57377a0f1b063af2897060e4" + - "23be7cefd4aa9a28479c16773944d254fc21d3e1acdf508b7972372b5991" + - "3b8b088e93471a7d54c6ae4c52ba465ef07f19f269677fc2f64d3fb3d7f1" + - "9069d6c7001d4b002ed6683c59bd5651a450503b68a4a00820b8c17e3263" + - "18f32c21dfbcb2a02a104edaeff67ec09533aaf3d1a7fb41aa5d506ccdbb" + - "e6e35fa0a263c0aad3acc91182addf8c5bdfbd0626702694b8d652a63c65" + - "8d6b2b7c75d015630de508195e1fca9573b61bc549ca017c4bd888194d44" + - "3e031f36170215a301f922736a819f3ffda69117170d1933300366c5f2ae" + - "1052446ef7c3b82c5868be158a881597132f51c91c80c24ebf621393dc45" + - "05fe057364a76ae67494a8a5f67acb551cfe89f447df272ed9c1509fc330" + - "2c3e16541452d4d68438f26858724012ad3b72c094b9f166c6bedb8336a3" + - "41e032988f39cf53535789b320b5424d07b6bf5f8792e3aceb0e868765b8" + - "611d7905089949e0c273e2410c72a146cd63981f420405bd883e5390e985" + - "8214a8db714e8400a21d0636d7e5d9671a3582ab9ff032170b8dd6b9d5a2" + - "144d065228fa54aea9a22654df67f3f62c5fc59d68914d8b219829b536cd" + - "2ae937ecccdb6031d94cb3", - }, - { - key: "84373472e362a356bd5c9b50f55c588d067b939009944f02564f136c62dac36b", - tag: "12dd5297cfcec53deae1dd5f9325d894", - in: "860d9b2954c3daf18fd67eb8bd9e6e3de2e4988ad9b04b1987219204dee2" + - "388db1c59a935de27bce29e7cd3ebdf038785efb35eabd4c3785a62b1d9c" + - "3ffa25e2273cfe5eb10b4ec6152cd8f21dea415421b452efc7cc4ea6bf1a" + - "b85fa6614e7f6d650125424865386ff8ab53247a63ff023b2d0753a9e5bd" + - "458d6ab0156fd3cf2d5002f902f927a847e8c4a8426b0a5191f5e237d590" + - "2659ce9be9024750d1d618a6b8dd57efb6c2bbac2930858f1132639391aa" + - "9e8a620a2a7d64bb7e943c77753401b5b619d95ef857df25a52b4eb97372" + - "a05416706b2644e2687bf1d42c0cf06e5eef8a1fc7e178440bfebb85c44a" + - "4837f69e43a1789728a999c5e04291576e757510f22bca11583a4e93688b" + - "442f2b2dab8d5ea9441ff09b8287862ca538ad979297cc75510a3d9ef36a" + - "662b4b7c373f184202befa5bf3f315642e6210763d033b7e2c59731cb356" + - "045e9470bf2f83cd62f11b3e904b0c0b1be99bcb805150ba7ef12b8df3ca" + - "bfc5055640687d710ab88e0fa8034b26112ebfd044a4b290b1c6f6d18c31" + - "ba9880b1cf2d81b5d02f00d6d351da5dbf47b6a5cb7b53eaf6de52c8a68d" + - "053602ccffa37ccb44a7683ab4f8a58c4bbc9e140e4e6f3cc10a5c07ebd6" + - "070818db983f9f415168606011efab6b8d7b4e61e8eadd8bfd8d028b89bf" + - "b0a16996252d7b4ee4f9ab50fc9d6e482ecf99beeabc38d70efbb9a0d4b7" + - "9a1c5d2835adf8e25111352eabd24d562644efc97637f695e4792f2049c6" + - "00f4d889ceb951cfe289adf159865d013046985d7fe2598014bf2dbbc528" + - "b4166fc2180e724ded8e7ea1c8d66338ec50d955d5594a0a7b4655338b70" + - "e8978485a722df814fdc6fd2436dbc060121fcb575672b2a5e454c1209bc" + - "2bb21a99d39dcb3c697306dbc2104d60fd8051c43ea2fce268987d0ec249" + - "a5c02f91d3b0dfee181b3cf8ef1ba9665daf7ea1f1d3b216e378943b78b6" + - "bb41e5dba095748bc776f8df6383033a1f5504955da3f42153b1c7ea83e2" + - "f90b990ea0c5bd3906b5c4060b19f447ec7762916b8766e5a23bc4d39cdf" + - "8e27752df8129b60ccee1731e47383b589d4fcad865eed4041a186df206e" + - "9fb69ab6ea092e36f186a6fea8d77bd7f3ab0fa0e29404d617317c75c832" + - "854427848237cfc18486c95f7213b9d53f324da036e8d298133b5003984a" + - "b9d71836f9f1b059db90005a9067c261bd85aaeed4d623df2220eb52b73d" + - "d683abcdee5cebd411996f853752f638bd28df6d78bec2ed3e00d7beea06" + - "2b81c19682ffb2f6abe3a3623a2e0570650c1384f1818d76fbefe3a7ef3f" + - "46138160ef897f9934e00e066e215230e719c23905dc60d7fa4d666fa52f" + - "e7737db15126d3262c3a4c385cdb23ff3b56c131e43b241f4a6062a1a248" + - "de9f13eb82c11f7b6a22c28904a1eb6513cdb11179067b13c7b5f83a58c1" + - "4f2753f19fdb356f124f52923249d6e4a2c8dadc8bb0fc91e360155a14c5" + - "c194334b9f0a566d51fad98592b59c1cc4b40eeddb34e64f337f83874884" + - "0583f853398c343dabc29b9444be1e316309fb8d81304d654b3d4bc4cff3" + - "55fc31278fe22e649324ef10acd247c0b72397edf96a1c16bbbef0640296" + - "4d219575fd23c36efc1fb8f8a34b510ba9bdfb3b478e236777ef7c6c47f5" + - "5a2bd0383d8eed3759456ffcffb15e61985b08c022658a5ffc875821bdf8" + - "83f69f096dcc72a96888c3af76db57a54be701759670bf05cc9015f5bf1a" + - "745cf755a25b1403a870875701427f820c4b29eccc260f30113629ba03e2" + - "785014bdcbf34d0c67aa6aca20d2dece811788686d5a45820d2980bf7d69" + - "d5c820a09bad7bd95166f63dcfbe8652565c285e60e2704955d69b3037d8" + - "7f5e6567d95b8891276d5cf7c59047d10a02ae4a28794405e2524ec2d595" + - "1b36ad1b9d5265fa098a033b88aa66cd9eaf01eea49c7dc4cc51c486f624" + - "507a2be23f152f43709b2cfecee44945ca506950e90e70164b77e12e1c13" + - "0b4d1021c2afa20038f190096276cd22e89b6e7dd10fd58fa033c9d42536" + - "98de3f4908203be8dbf259112f840c76726d982b4a837cae7139e27182b6" + - "1b4dfbcc50e42d5ab8532edfbd30f668879824e9ebc34b63ff1526cda81a" + - "e38352a774d79f73219500e57f0159a32326195d8895d965071834876a45" + - "c1a3c0bc4b1638535f7d40011cd5b23343fc27fa318c1aa3f9d8c43351c6" + - "6148dc2175e0e620813266da3000954dfa22048f305244629d512e852376" + - "6248a897a3ec3e2983aaa8a0f025f18feea57a5153a59b02604ebfcc7a9f" + - "b03e62443df88ead9dee955e23bcf6528c278a353f254c9484a67a7b263d" + - "a301923a4efb6866aeaaafd428e6da48781365bc49e90cd16b2388220d08" + - "bb9f79d14012b5a8299a651917b6a829488753b6ca449a14e8dd8c5fd5ef" + - "657d627b8e7773475b802655dc033694f24376e3b01e519d1aa8365d0e55" + - "92d0a4adbf555639b6d75d7ee59a7d12c6c11317b7927f11bbe75ed90508" + - "b0698420e231206704d22dd1f1740edbdcaf19a47d66ace4eecbcefb77b0" + - "85cfcfaced4d2d6048ce76434eb79990f0898adb4af2c377b581ebab3f3a" + - "150f40dcae002d4caa60050591c0de4ba83bfd59a08670beaa4641aa9829" + - "bdbb720d6eb8b2f3e864a98676a67271a82cffdca2b3590a0b5f97efa5d4" + - "ba062b4798707159782bedc75e5363d5f5d55ec2bef70db22955adf401fa" + - "c3b7af937816eb25d54d9f2a92e5a2a04bd8b8d7568204fd289f5ed2e033" + - "a76209d288e11e8a4dbb06b9029e90cb186446746853f02d738e06bba538" + - "894e03e2658ab3d7f9ac861d2cffdf12396004d1cd15f18812d3803ab9e0" + - "6f41c9b374d6a0678bb82ce06d9e3b9dbc8d2e90b8f64d0d040f3fa8a3fa" + - "8be71d2b3183cceae1bcbfa2353689d842f7d7052e5699dcc70ab2b58761" + - "7041e5aa1e2f41911d525505f061d3ca45152f5a7a1fab50c674e4597a52" + - "b46aafb4ba57413879cad1308321843abb7c39696fc2f2e225878bb1191e" + - "e151cc76f1a1b8d491c1672fecbf710db82dcd32554361967fc839c8e5d4" + - "e488856e1b9382eb3fc3bdc3b6886a3cd79761b02bafa080a745ef6afa26" + - "822f1d10d5e8eefb842837d82c9986e78fc3390caa142b7643de8f613e5a" + - "890a57f5883409549537f8139534f4ca1b60f33e42be25433f1d82add530" + - "6a4cfce258c0d4f1f3c9148ffb5c4b626d51f78ac20bff0393b7fdb4b9cd" + - "70fee7f69892c8a9ee089c6c5c7bee0a1b825e5b9517f2c82d6c149735fe" + - "45a8839812c2deb2a355b6230697053092eca450b7b0d3242b2689efe364" + - "09e820d91fa4932034d96495d9dd3baa4b385da815a7cb69438ff648b326" + - "e7efe8d688e88570ba59df7c439faf72c95317a10c984c5ec0043407e9fc" + - "9b46487810eac19d2bb40e0a654935f76e7d8861480c5f48419eb33084d4" + - "0e1070e5ad542c94f58b49e67dd05b6637a2c67d41451b7e00ba30eff221" + - "755d6d427ec634a2b95980d274a89579feccf1c7df3787a9435e588f2496" + - "06a93b7ac41c8aaa84b91c95cad9463d4881de7353d95b13bbde4c9da90b" + - "f1fe96257309a416407c64368b5564f022c4a493f2a39df1696f45801e42" + - "a5", - }, - { - key: "2d0035a30d19b9cbc7a27561f3ab474c01115c4499b4adec660ea06ebaa1a14c", - tag: "a2c77b55cb0c076d8ea83cfe0e64f293", - in: "4e667580ba4f38f64e5cb5566bffb486dcae10cd17acb3754251e837767f" + - "16429bba2b832f29ba538f97f3556548d163be25e69f88fff0743150623b" + - "e0a1d82af9384ca335927a0e9cacc3dadbdf1e24fa5c81f2602d109e1400" + - "33929e409b9a0fa4f2653944edcb8b3ef963ba7f8806196c73bff0ded670" + - "c6def5d240c5f3daa121f8d5bec9b2a0b0f1d62d54b013dc742d6bd46325" + - "460f692b76d4991f0796820ddebf150c7d33829795784dd2759b334d2706" + - "70a7264941be5d99d460d078a9eedc3660cb3176ad302f9365f0bd698e46" + - "9f3e63511abc81109995dba17be1abe8bcd28407c7fc8d02c14794bb033e" + - "178a94f6dc73719d5bc235f980a16eccb4121ca83b13c4e165931ae4f192" + - "4292f8cfdf1c3ed40feb71e13d919b48fa296dddb4d23114a3d86ec10f16" + - "f314de4cef813ed24b49f4c7bc44cb8424df1f70e8d77366161c7cdd709e" + - "97610aca3a24fb2202ffe15eaaa25d711cb5179212a2c6497a13e5d7c365" + - "7bc502b3d2ebde2e57b714dd9bc21e73795f3d35d620613918c4c9aa0e89" + - "031481c97a5a4c15ec6abe42d40498c33d71c823bf1d5bb5fee457e2fff0" + - "bf777c80c6e3336ab3ce793440e74b336a8f7034f6ea2e4ff5ea4ea7c350" + - "65cf2ccd2da1d6df29bde10f4cc0202b5e4cf7ed097da49b970a6db41e5e" + - "98f3845b42f46663b1d1ff01da71389a8737ba8f51eac1ef357ba5ac9a80" + - "dd2c7f9476111dcd651fc33f4c86dc8658656f3f02a8878bc38ff0d0a1af" + - "2e31fb92eaef08c50195490818661feaf90e8b6f5daa1ebedb2cdbc8d5dc" + - "16db3505f9611ac46bc37931e02c1fd6aad6e4b7e187d5e6f990fddc9563" + - "2b33f55bf68b0db3890b11113ecc839a4fa4de25160e574289aabe4d8fb7" + - "9cecf9d2fa75ac8d0195beefbdfe0815f8d7d9751c1280a29b547149ec7c" + - "2295f5afa53cfb516158086bf203357eec2a5db71143f996c81555a47f92" + - "209719a71570a5553f1ff9b4b41827dd74657b463f36623565f0c9f4d2ee" + - "8735d6af56ceb3b3d0ec516b22f0ddafbc24647481f61ab169e2616c91c0" + - "e1f6a35436598ed801670e1dba76226cbd0544959ebe70f836c8a7df575c" + - "b907d780ed5aa0d6e4e8e0d2f457efe89a777374aa49d4961db96dbb787f" + - "021d99231001360d532a70ee1fb94bd6f26524dd4b7556c6d40e08723d7f" + - "9905aca66c4743f2bf8b34493bdabcfca617809a867bfe0a4f94c756a6a3" + - "dcd04ffc0a3ac671a0afefe0d5d447efcec48c6368998760db6a572676d4" + - "29b6d3d6e0c815650447748c4b27541c5447acfb8f7261b6378f3fc0fdd7" + - "375eb9d458648c7fe9cd96344f11aca912cc5098e9ee39e0b6794cc1dc2d" + - "f1b10f927102705efa20e667b63a91f935c17764650b287f5289d5790766" + - "555f31985c5aad94c652ba41fa9c0195d15405f1fcce9e23054a42c8a252" + - "da83bf6268782ba44edec5d8f94a20b1830cd1c5894cc6b9b52ad0b12a5e" + - "cf3195a32a0b02483ae3b954ac6f3af1e0f334221279d03a72138f3a2cb2" + - "1e706427c4d604674dab88d429f28a67be7a996126e077a1dcf8989d90d0" + - "8b08f4abb9a546b3c64ecaa287bf3468c59add86365b885f52afe13ed8d2" + - "69ea61832a7ecbb96ff3336f58a1eeaa6dde3611f3ff7c2cc8c9b745b0e8" + - "b5919914245a49ac192cd77d10deb9a249623f696065a532c20eef9e9b0f" + - "e706579566a9eeb14d4e8251a7750e29eaa60f034c1a7a1d51aa03a45fff" + - "89acf41080deec5506128b06f003fa46bc4021a82fad6a8052a49744ed69" + - "45bd9331b5ae80d873cd042bff079b2b9d8af8065a22c449c32a56dbbe7a" + - "80d0f3e30b9167532506915883dce0aa9cb749e4368c595c5bd33b57e36d" + - "98cc9bf91cbfa47331d69b5cbe9c92bc66c0fc9ca8717bfc108e1f710333" + - "14dba02a28b9aa05890cb01ae9175806c3c4215bd446f6cc96ec5d08982b" + - "4f83cd1646160e1d306b3cdec02d251f0901b03e8c3c35464eaa5082586b" + - "b55482db97599d513ed8d7a82e32fae302684b7ede058474c1fac7893444" + - "16fec93fb982accd162dd956ba2f31a894e9366eca00e6e997fbbf9a2980" + - "8b83a139f6432147a717381bb8baa2205715f735c1e0db273cdda6897c9f" + - "39bf0d7eb7caf93f657ef4d3fecea28baf69cf36d3cf347081df3114455e" + - "b4fe3e49ad3c3f14435e0b39b6c0d16db0fbcfd7ba8da8760d5952c03667" + - "251e7a4c3008cfb0904225e55c23b884bb09d26631650460c4240bd5a165" + - "b531ee76ba5749b3bc60adad35de519321c1672b47bc35fb59f7792a3495" + - "11b2bb3504ba4a28717823a27a1f99ce6970290b26efcf1e7a0399b10eb1" + - "0c1299c09b80f4520d00e7908d004d5b6a72a411759cfa9523f6b2912234" + - "481b1d8fe4c2365961c0528bd593d42bebb398b5836ae6ca013fe440adbb" + - "0090e8ea274f4d8bcae483e3663051a328f7c12870b40e4973a9797a2336" + - "3d3c53e1b0d1a9159bfb26158f44734b3c34b571be641bba2db937d4ae1e" + - "edc807b95b1c2a7d44804885536316ad38aedf0d83b1519661f2bb5283cb" + - "9c50dd61c3753433e988189f26962d1f4befd444257d0b6d5b819d5fd572" + - "22c9fdff032e07a4d8686d451e71de4748965309c0a2d7c422ab7cf3d96a" + - "8c0a1b0afb229debd1c9421cb828b9f2be96bb9d6b5be7ef8134bd9ccf81" + - "51620937d720d83dbdddbfaba8ecd2eab6f1974090efde0ca963e9fdd691" + - "ed0cc5e074c5780779222552fa46ddcd951763a32aa3a044ff4a73cbab41" + - "dabb3c2c03fcda68303477f0dc26f35bdb5c9bde721fba1a2db732a89629" + - "a8de3cfebc3918df1a9d5053d09da5b7316e3285bf62156ca28cb64d343e" + - "72445fd66757bf4ab374fe7932a65f3d7fb6e42cb12e5b67ddf8530383a4" + - "6c1ee7ec8883e454a467df1aa7e468a6e7035515f473901efca5d46ff358" + - "70e0cc2575bbd7f8866c8e73cb157903a1694ff3051424f28de826984dcd" + - "065dc3658df144ae3a6d37b88c367e3cf7c58169dfdedda4a2821ce22188" + - "40472ff72f0dd1a6b0100555ff188b80f835259a634405e3dad61fc299f9" + - "307e27503b2cb7714bf3b636cc64b61d2e374119c8ef8adb21f1516c7fe2" + - "38c807818065bf312003c12e02525d69d9629a99e4ac66ad2e792f302cd2" + - "a6f5f702dd28040738a084a7052f2c3ed0924c33b7a5d357b7c9a29cebd8" + - "621a4bfb7bb34676ff210d59f7f9d4eafb7c5c490c9ea48402af5bb072c4" + - "731bdebcbed4e8e08a67931b6d7342d4ef7bc4a75ca1dfbd32ed6027d8fc" + - "b71e3f55565c02e06daa8c579b69774889181291c470576a99e11f2c5acf" + - "77e091ef65ed243d4287176f7f6ac7aba6908c9ff1fa43b894a499b642ad" + - "c01b2fa1c4b58801411941bb448f1f7a04794d2cfe5db1be61f7b86d6eca" + - "c547ee51d4c9050f9e9f318dae958c150acc21c878f0c7df6065294eb1d9" + - "a278c920838a0db752b080a32e67ac312fa76b589a385f31847196076ed8" + - "1021fcc375bfcc8e1361878e2693860eb21ff0595e4eaaf7897f2b79367f" + - "7c4f711279bf0c93a97dcb1cd8d87e444ad5f4cb5c1de44e37868c6743f1" + - "cd72cec376726f26c8bd4836f9a9f9c68042f95ca6f9d7cde493e531c553" + - "8bf7ace6dd768db69ac7b41ce93e8ca27ff20a83ff2148ec5b89e05d8b8f" + - "5d78d0fe16b96f6eb8d3b20126a186085c6825df81aa16b3dbf57eabc360" + - "71299ccdda60e250c652408d9cd1da94d73c728440ae08fddb901aec0fac" + - "1050a778b10f94f84883bee158bc53b1c001807c43a3151fbf581b18dda2" + - "527430872834e5c380575c54b7aa50f817cf3249fb943d46933cad32092e" + - "bfc575bd31cc744b7405580a5f2eabe27a02eec31e0d7306750adbbb9f08" + - "c78cb2d4c738b2274c7310cbf8dd0e59138b6a91b8253ae9512fe3d7367e" + - "a965ac44d54a7ed664e5e5c3c6c2d942eac388cd32beffb38f", - }, - { - key: "2f29d71d73f7af98f96b34e939e1a21e2789ec6271b878bbebd14d7942d30080", - tag: "ec02f4953a9a63ab6f2bfc3501e4fab8", - in: "0e0950987f3508239063e26a13727fefcdfd2cea6a903615c64bf12d9ed3" + - "887f9b2cf7ccaa196ccc7756b09471475b9daefd4261e69abd23b9faf9c5" + - "1fd5d5788bb39d3c068fa6807d30f6201d3f6dfd31715d08b1733440cde1" + - "049608d23c4e45c5ed61f863350232f85827e7c292dc5f1eced1cbc912e3" + - "f5c420bd945911d3881ede5153d3b2cc85371fff98d2caf97cad6ef59001" + - "4017f9690cab08989851c2647e77e81401714a93ed9f938b79f8f54e3133" + - "fc2cdef259df2ba0d48f37bf9e43792e3a777214cf4aab6dde6deeb543a8" + - "813b71b5974136c1220d6218a252881f0f5677ff5b6aba127f19a5f3c5aa" + - "c988543d7839a90a3f947c4e4d5c6ae1ab48dbd40456d1aa65339a4c15eb" + - "520e8ff9f965ac4c37735937cf09942e7958f8a6cddee41707423f715903" + - "ffe0d15af8c3140d3a736d23be7485fceb9f07c6509f2c506eda4ec9d30c" + - "cc133708f48d8828e332808c84a745d337296d871b9794de1c5d06534aaf" + - "65587526a84e2521f8b332645e0e72564bb308ecf99b7bc69608474389d1" + - "686ffab8c49b7f04dadc28d2ecdd0f508dad2135843304e378b3bc7a4f25" + - "7fa4316be956e0a021edb8045f39fa9f002087f067199bd6001acaadd261" + - "4bf6aefd3f098f92a959685f24bb2206c347359d9c6adc6847117bb434ac" + - "6c40ec618f6ae8b75a5e2e4d44c332b7b06c8b4d521493b9b0bde8894209" + - "717a24b320214297b62dec741cea018ea681c9b56702068528b3726953e8" + - "c5e4ccd5029e4183e772d9834a56a88d45bf87603dfda40e03f7e894766a" + - "7623ab4dcc0dfc3086d17566945069173935916f772e2a5f8e1547348f28" + - "782400fc069ac0e2b94242e9e0f1ba2d0e76898f9b986540e61ea64d7f69" + - "1006b86ce61565da75eb16a8b4c5865ca4eebdde2190e354734bda94fe7e" + - "12ff47dcb5d5e6ad93cfadcc491cb350b09ffe391a157e14b65e3a211b5d" + - "4e447c3ff95571dbab33a83126d68dfddf9383b4359d4103ca64af1e6963" + - "d09e17eb944aa71e76711dca33168586bfc44ebe9fdc55497d83f238c66d" + - "bcb16063bc85635f0f1a6280563bca49ef971db96a41b6ac5e0642643262" + - "61eb4662f3d6ad4cac826db895de22c9b8aa35e6464a7f44e1ae7238e355" + - "068d68754ffcca76c50b7ce7ef9bfebac9eeab32c87d059cc7ef2adb5d57" + - "c7419adb394eef48441952253e8391e555730e29789d6293c3696f441449" + - "0aebe2bbe541e191a6652ffbec1192f0f9395b7ea370aefc1f1cc8438035" + - "d7681f12f1e11d6e334da188b10c302fc0f4bcf1de448090510a8f1d5683" + - "0c943a3c388b33a038c26741a4cf3487313f755fe7a28e25e44b5383c5f4" + - "cd6ef34d7dd73462226281899dc3f2e69809a0150f694673f31addc89888" + - "072a7d4ecd63d6b90540f9522ec05829a7f17d48728345ad808fb0203883" + - "3cbd018d612992a88df944b8e34a70920b3f26cda2e8bb16c3aa38b12b33" + - "b395c9ba5e809f60ff05f087112151af1b5987403cff8bb2dce79093f431" + - "2c744f911a6f3091e4f9ef9375c4dce4c241d2f6024a1797321851ca316c" + - "4e460fc060e7839deaff8ab5e8bf682c0f21ab6952eb793cffe690db911f" + - "50b11f56ea352942c43bfff51d4360882754faeb7cf28b6b32bf7fc9ca71" + - "fbfe1d72be05b8bac9ba513d731e2c9d13d6f2f10eb926edaaf0e3996656" + - "da8718a8e103c59326529e91ebac6ed52657c9690ccbf81028cd9fb189ec" + - "4de94fc0771e53302c8d9082835a68780cccd772660a110a1b40c57bef3a" + - "c1d69428aea549ed17663a96895a66a3bb5ff6ff61dc64908df49b760caf" + - "a5aff05e2766a418dbaa1e7d189a9edd55a04fee8c9d6e506d299abc36a9" + - "d67be035fea5d220f41d081af67615fe627c4dd04bd8659c7fa4f57f35d0" + - "db40d9684aa178d7483ed5d86f04eaea412e0ea05a4698377dbff4fc3a39" + - "1f6ce0cb833d3118d6c69319b511cce65fdc74928e270da0c537f8201eff" + - "77416155d4a39c7ad38c22cdbf7d2b7ff7d85383c178a835ec604c3f9ee3" + - "7399f7dd826e34f1a35ab75da44ba56f86097ddc0f3658ef5bd65a24f4de" + - "4255d0b03411a9d7f0ddc29e33cb865da23393471aa94e6c9e72e789206d" + - "3ba118aecd39727068f528f01b25fae2280d70033e4ee46b41b864bb922e" + - "001d8bf46d6fbaa5a594e926f45eb3a4d2f074506d7834b606f43c89699a" + - "6db00b374658d9333700894d440a712a1f25f5538f9e7c8ee57ae7e612df" + - "13292c8ba9dbede4fb77cc6c8944aaef59ea6ad3b36db398f4bb0f82d40b" + - "44879835f224d6e05992b1b8a68dd58c3dbda2fd73786492ee48c7a25f87" + - "264b766930fe9427487504fad17f8d230934f044e49ba219f26ead728856" + - "cb30eecc33a3946d3b1b781061f2458c7c46f6d96f3e06f369f97be91835" + - "f23b38347d1e381ad5be4419275772c2abd549522a0203c1ee9c96faefe1" + - "df413c4b7b2624417890e0716854b7092b3b3b368cb674035d3e6bab2357" + - "e7c262b606f7141b6dad2f6145ebc1deb7597814719784f3c17848a90ffb" + - "cb0289e2f3cc7da12442b837c4e47f468bca3eb4e944a31c48562c2f144e" + - "9e920ab5e4cf90a14ccadbae29af13db38cda911e3c8f6f525e6722809b5" + - "31a4de1926ab12f643d25af87eb8610df59eded6ec278242247dc69a4213" + - "13f7c2b26ae7a917c1bdaf66c56876e9104d40b59e6ca1431ddb77fc89f3" + - "14b46a154cf127688564a4f9e120d7b5816cd24a6e095dc8ab8b43bc3639" + - "329719f0e0f723e2f5136d82638e2249e648ebca67cf0306741e9e8d45cb" + - "903bca85485c4007397c88a1ce07266f4f611b96b7e0ace3074247a7dfb1" + - "cdbbdd66e25e172fd2bda74abde7f3b4cb5cc7ee7859f053b2f04f9de03b" + - "a8e96264117f502087c3ddbee8d850bf3618b4de90f7b3e562dfa57e4426" + - "5357236e35e71d1669226d63bca50b1b944ac07a1f794e73e80985689b25" + - "f18fc709367d63b8639d71865cee667536040be827145c08cf3e57a66678" + - "4c81115706a146eccadc7aa1a9f074b47e95bcba7db8108a13279077bef2" + - "64699fb87e5abf5b05ff3879d7c7c5169c7cae817c13f0859d4e9c05db0f" + - "74c045ecc30a51e515feea627da387ff780719395b5b9ad93179b16fad10" + - "5856049169dcebd43a7f39c549762405f807378e854b1654a1179d895ef0" + - "85aafc72c7fe1e0e1cd3abf8e20935e331145bbcece4f17ad24ebb6c64ea" + - "73bd98a7494c134859206c9422f7c4a057db0ae0770c4bcb08c1a6b9ca4b" + - "7dd8c1cdb3e4977c7ce6c1e79b9d6ad98e27d2759b53cee73ec037a8b686" + - "f1ff78eb8421f41c74ce9c62a90d38b75159ec925f232e0db71362f31e29" + - "4336f5580a34b26c5a01ee3454cba227c7f400f6889a319d7121dcea27b9" + - "584f33ac796d48a9a24cc5b6799ee12f10725fbc10d7cf83e4b87d9c444b" + - "f43e2f5ee49d8f3b531ebb58fed4234cb8bcab1b8b18bf50956506baae8b" + - "c1b7492250f3adf64294310387f1d4bcac12652895d4f2dce26f380733ce" + - "0b5820e9fcd8512a1585a49940a32fc8875ac3c9542a4270602e5e97e720" + - "90ed71b51badb775340429fdbe45b887fb9ee61cf9e091c06092cf0a2129" + - "b26572574c46910cb458bca7c63eddd29d89753d57e568323e380065794d" + - "3fa1ffb874543f5b0ddc702b087e91e22604d9600d37fa0dd90d7acb2458" + - "4cd408a4e66bb781dde5f39efda6a8fc26be0d08ffdf851e422ab1500c28" + - "bf6b4c85bdfa94e8aef5cda22870c39ad49c3c6acdbb3b0d58cd05424c65" + - "20740b5c2bce4336545eda12716317df58e6fb764fcb3004f5248c5ccd84" + - "f63abdc0dd2a64e447c0de4da4a1082a729d8ebe14810d396933085cde18" + - "318278481fdb9a748b637cacb491f5234bfe16b53a35da6677336baeedb7" + - "4a28c19a412e7812dace251446d40ec07afd63854c3dffbd5c0f6a9a3cac" + - "ee3bab07fba94800fd1fa0fe44f5f2ecb2b4a188cd02b8a2df0728347c50" + - "7d0cc58fcd5d54dffdbda11dd1bcc59758396ed8db77498fbe13238d3d8a" + - "0040194dfe66811542ddaa658094a9580d4e4b4e29", - }, - { - key: "1285f117bd90b70ef078ae62f37d2218419e894b7d334759ddb2d88833b287b5", - tag: "429b2b39195a10357043c9601590a277", - in: "00ef065a1adb4ce7108b497813ccc748933fa8442689a7cb8dc7c1ffdbf6" + - "c09adfe05ca2cc5ec3acb7493f3497ee8f9cd9bb8a4b332c18e33f78114a" + - "c8f9a72ddb9f13494e934ad711818909831013ba195b53f5e9e5b4689399" + - "6d0b669f3860958a32b85a21009d47fddbc8697b7c9b92dc75d5060eb4fb" + - "40aed7a1dbe69dbbeb6296f5467ea2426cd17d323671fa408855bc53e5c2" + - "d111203ae38cecac7719c0bd7f21f6bd6a1588187b3b513983627b80ac0b" + - "300b7fa038af1cc8512403ac2cea6e406595202ec3e74014d94cf8780ed0" + - "33c570e887ca7fb35ee4768202aa52427d02c24e63f7f2cede95ca9909e9" + - "dfa86246a27db757750667c198c9aff4ce348f7ac51864b36ef5695df713" + - "d17b8f561a972d0136bd9ee9aa16079c2ab5d29ac9ab472255ade05dc49c" + - "b966e0c1c04258ef9ec59ded01f402d9fdcd9a2020a2038a8c78892ca218" + - "30136069485527069132959dab2b81c73ca590fde2a7ecff761d95a54d63" + - "a2664aa5a6deec163e46b5225bc98976a4f363063b0f42e29f792d138af8" + - "eae68d3854b5c1985d5cd1c9f49f529b0b4d2c936887b5b92cdebacef992" + - "c35e0b7bbd52114aff8c6b261852e28e451b02099814f809b0289cba0586" + - "04a363e3f969aad3d982f645ec4c549f943fb360fb8fa0d5a597bf89842f" + - "8ced6014a5b2590ef71524a7ad50fe0ef0e2f81b6e26b99f9ebbc8036549" + - "f7eacbf6ab884710c6406ff59788e03ede35c30d4781ad5af171e0623e8f" + - "cf5344d71165f0475e256e9159040f702b359a2963116ed135dd6c1d111d" + - "2a1e33e15c178ca4f02c5fb15593c50cf9a8a492f01e04778dbb81d26c99" + - "0c58cf50a9bcf4fe38fbfc0fc0685d8bd422a773c7bce649f7a86c59118e" + - "f5f857b2c72508cd1ef05e1a0c0b7ab4687fdd57437092eb49bf41a9ae8b" + - "bd98272ea2f8ee2515ff267fa6ae892c266a7effe61ed54984924aefc461" + - "6cf483dec024ad666bc797beaa429a742d1b8806f67d451b6d3a85b4d474" + - "003cfe9e9dd906df47da5559c41f15afabecc3e6af279cca0f2a200eb2e8" + - "31437e034d457fc880f60f5ae635690bce82bf6d1ad6b4f5344ec042bf25" + - "7d010273c861e3ac516e9ee2bab3a255f570baa32298467bf704bf6d9076" + - "a4c0b08a528a05cd1fcbdf51f3885fbaba7891a144fc058919903b269b4a" + - "29f43926eda32c38853b814a7d528156c223748d674d8f7f5448350f011b" + - "bfab1511001b8014e20fee37ccd4a0456f638c197c86dc116b34f955c0b7" + - "dee10bac5ea0c2fec8a780ac05098b51b902ca6afff4db3c6fb4f761df79" + - "b2039dc5f16d9402442a6fcf6c4297769e6c36824d908beba8e584ea0b3a" + - "91b9017baeefac651d0307bd89f517789236c0693c65a5a20f244d39684c" + - "eb810cd2ffd3c78fe9285d2eb9f55d133b86113efb8dffcbc6d258e84c38" + - "2dd8f4d7d63b65672516d9bfcc3310a79ce244b60d380128d529487f99b7" + - "d532d5f5c28fad8b9a071fd2fab8fd98f6d7ed9dadbd2fc4396476eba6e2" + - "1a1b1cc594a31fbd3418d98e4aa736cab285a2786fbbd4650e49f9b080ed" + - "3fda34941c28d25545395e1408fc3e60730d0696061f821a4d24123cadf2" + - "3af3d37ba7ce1ba3cde1368d468f136df82c02f9be9210022192aa02117a" + - "ef5ff70bcfeffd47bc37b920826a4d3db001f956939abc0df520f3ec1613" + - "ba1c4b3385cad97e42bfd15a3150711fe86ba4562f17780cee1cdf198615" + - "ca06270db84986f33e1d53d552b0da82397c496a23c7a78ca7641a908e71" + - "89249cc657c0431f1e09ae0213f28a27e6267e9d17b5bba0ea4f3c21f266" + - "fe538e215ec62f85517ae6bd87799ac5ce68453f09cbbc50d6e2a168f0cf" + - "7166ad50cb65b6c76406c326573c00e04a3186251c6181933828c58f4198" + - "f8208c4484805639b0d428fd05b57e4356239638f458a84000c7a7a8de62" + - "ec25b54d1e39d2579ec9c512fec475f243576f35efc02a1cd6b0478e2dc8" + - "be5f17aa4e3849cd42e76fbffe6e7d6f912d6edf80f718f94a7e48e1fc10" + - "6cac29627d9d4b82f05a30cd7c739f7f3ef7ea368d22612f189da450e274" + - "de7b61c6361521e684d639be5af4cb11fefa5fce6f8a5065c90873e504c1" + - "2c940571ea7bd7e9221129b83039d2edb069e8b5bb68567d8fcae34c6ee0" + - "cb94474d8b056cc3c7403873f2fe6db3b567a44e702e4f4813b2a264231b" + - "0a998207b41916715ef94e5eec281589d0a711f8e74be32bc60f43d693de" + - "77f21d5f7eef892abe87725f3d2b01d9ddb6dee15f40735a8fb67766dbcd" + - "020a93b8eef4361dc3a891d521551f65dbe6e3f68c60819b0a540b0991c6" + - "4449d207cf5b1c198c17ad6caf3adc628d09fa0baae7a696d84e1879577c" + - "ffe9b3f62669d4ea5ebab6364f08c66d170ee4a94d61fb77d60b33dd6b60" + - "650f034c5c9879243d5c16f853dd7a89885a9047a341b076912d47872b3b" + - "3de49edf7451b435698ac4e182d16c339be83e18531a34aebad36c5c7c93" + - "aaf121cf99ff92d3844d40740fe001eeca9ee71300d826bc3cfc87a29d39" + - "ea108a3cf259657ec4b967fbb534e7513ef3a96bffb35abc5ce0e890696e" + - "54fab515af3d2c0be6e003747504e486c0ec6e30fa4ca79d6596ae0425f3" + - "396e40fd37432e52c74f812250dad603b3502f97ada48a26e39fd4d44584" + - "6591bfa5ffb3770d95d3dbd49e9c3a38c6305796b8f7d79bd0845170925d" + - "575774445299bdf9d3f8ad3dc2dc5cfd3ef0293b84d6e11370851af05ebf" + - "b3510a22edd930797dcb76b759a9b5a77ed8dd5130e79ff5ac44b01901bb" + - "79603cecf674202bc5d84076ff41b3c806454ce80cb9e5fa9db77294d20e" + - "6d3008ae3017aba712862ecd4b32daafef1b8cc8b19ee8f8bc3835e2372b" + - "5cec66222ad5ea9df753c033508ec43c8b5995e88c36c13ea3465c8bc462" + - "ae0a659d9767db34499e9d01fb1588410257d6f588b3fdb766a66bce28b5" + - "e0880f8cf988a2e5eb5bf80cd7d83192b7392fbb2e3a07d51aea2b6bfac0" + - "d74d304f56d5af3598a0712cb09c04c5dc14194eca8e1b9b29f88344c0ea" + - "55638c0f8ebb70b6242b797fe2525fa1bde76293dbc0a66ab4715e6f9b11" + - "f7ecd8f35a20ee4ff3552caf01bb307e257ec0576023d624d6094d43d25a" + - "aadfce939a6808f8baacb2109c3de50a1cfada9e384cdba3e97d2c9025a3" + - "2377bb195fce68c5569d2d1267e1bc68fcd925ddb4acf567fb29ea80517a" + - "7e4056fb014cdee597333ac2408157ff60cfa1afdc363a11fd4883308cab" + - "d9a8fe56c2b41c95eaef854f20bf5941ed23156d86de3bd413465a3bc74d" + - "5acffcd15722879849c261c1bbe987f89a1f00b3069453841b7da667d566" + - "e41fd894d94de44c23fed08d9bdffb723aa8449bf236261240d865efd7b1" + - "74a4460e5004ff77f4196d1d421227dff7c78f1726df7b5eebddb4bb5f57" + - "5ade25296dda2e71ab87ea2b44ef2ce8742a7ad5c1e7a40e097eb336561e" + - "865515f7ee0efbe01d5a928f208f7c9f2f58974d1c11af0e737c673dc446" + - "1795da9757010cefc6e7f2784658717938735ed8cbcbd7981a1bb8f31cab" + - "b901c87a3218dd1195c59f64d0bc3ce8b72580fe38e6dbf1181e0090e5c6" + - "d162df9f31cc52fa6a8ac61897e9b4b3cb0ca2bfb38a38d9b78e46d775d5" + - "7645d2d6da16bda8edd8675e2ba121f7f85400cf7cacb9ffcdfae583fb93" + - "753d07985a00afc3a4e26c9939a5116d9b61196502f5d774ab4c7fb6cfa6" + - "01bcfddcfabfcd28055e858d7d3c19feb6bd7c02565add3a3af61bfba8b6" + - "f4b52c072a8613e878368318383143059a98a85ba521f781a8983c2486ba" + - "b83f5b91fce02acee0be8d0dda7489975f0506c8f363b5adc48ba971adeb" + - "4e1c830b5f264ed42da36d2b5ce2fdab1e63333b1061ec5a44ec1b6e99da" + - "0f25e7f7250e788fe3f1b8e64467d3d709aeb7360720f854afe38e190cc0" + - "925c6cbd77fbfccc07d8beeb0ce68e47442fadaf13b53c30a03ce317cf79" + - "dc9155ddf96814583695f15c970fd0b6cea0b04b1825eb26e65ea9351bf2" + - "f7a841ddaa8c9f8e885b7c30b9985bac23d3ce777b", - }, - { - key: "491ebd0dddefc9f0117176772f9bab61b92a1f1de13796176091c56d1e53dfbe", - tag: "fbd3f884a3dc2a8be06ce03883282e1e", - in: "953b9a40789b206fb507ec2c5e9c88ca1baf25ad24c11a62f664db1da8bf" + - "dbe9b54f8e93b0bfb4adb12f8873096b8960fd91eb92a8ddb53232ac9141" + - "57caced33424cff943a8db129049af7e7b733afbec6637d8ee4f39d063e2" + - "be241cca6a339e48d72372efabceac57220692c40856532d95529adfae87" + - "a71c72f30244126d01a875375ad8836ef8db929bc81027935042a05c346f" + - "bc94dcc057db015e55c56064d2b11154596b813ee64b73bcac05d2688bf6" + - "f1fbb0cf3f8307b3df44c3e2dd1d226a4d0e9dc5f7482bada9611970f887" + - "f656dcb19ce1f8c5c86f4cbd1e4f49b18f170ecfd184028e769e79d7424f" + - "d01cb315897c21111f53f4d41c3b71402eea695272cb5b4e5f33abb9df50" + - "cbdaa55ed629d3ed7d93b43e550295502db1f2ed884afc320518e88be4c6" + - "b62a13f8d3636ba091d07dbc6c20c7e7fda016c05b2fadcfc9ea32f4ee2c" + - "4893de78ad8a1771aacf6efdbd8fb1f6ee9b0572ced3edc6313185b5d398" + - "88ce77950aa4c5201a256e3ae3e74f05b70faada14124b35b105a70e7769" + - "7184576b69708eaabd36e0ba885fc6bafd5738a67307a1181792333cddfd" + - "a4ef19c88497c82fccff05a8f9f732fc7505f0467a14e135288ee018aef3" + - "d0412f6b0760573d8ee4ab455d2789b4d22a42eebdf60616fe403627cfca" + - "fea672bd0a49e8e7b80e7b7b8feebce3381f2fc16819a8996a99ea230c3a" + - "84b510cf2e0d914610d646a2f45a14268ec1d6fca03d0aea5c9ae1c8d519" + - "b0e8b0f6fb8ad176b5d6aa620b253cc492b5e5645353fbd9b6c02bea48f0" + - "286e2c669782b5ffefa4d8f3f1037151026d9cca78e7808dfbe61df29e82" + - "951d7154f3c97606cd1e99300012578ea6a776dcef0811338b56606b51a6" + - "9893fe68f762af6c9c26066b1d503e64877d8cd988b443af66a36af8bdfa" + - "41b4dfb3721d1d81895884755b9c52527030afdfaecd66d4638fab1d1786" + - "3d5517ef7ee7d081b5555d24991810f1edde30930fd392f817cfe632b4ca" + - "6fb0460c36bde4a5620b9c369bf51c7d870c43998b8171a553d2f643fe8a" + - "58aabfce8cf7363ea978ff4d53f58284db822ca95b80306ec02a64d26a29" + - "c98520f1924c70d161682c54d08a2c48f54bb72980a8cf5babd0aaf0fd72" + - "7d5b1b9d9b731dc49bad228fe83f7347750e277a4fbd526983c206e075d6" + - "a03d68957b3e925a71bc1ea7304c77660d112a5d19fd21a785d4a8d7f2eb" + - "dc4183376d8125341eb28b2df5be0b4e04bbf95c47d2fe2aed939619cb97" + - "79548b752f57b723cf8295dfce69c9b7486b75a4e900f91926636f3fc78f" + - "7b7720a5151abdf5868fecf1e1a1d830cd6a4c5e3cd739da4432cf1fe2af" + - "a1090d6a1eeb32e7236ecfddb9d07b97220ab8e23edcc93d91abc11b0c30" + - "460d2027869d1c2487070cf60b85ad0b8bc5df566f6fdb0e58fd044da530" + - "6d277e564ca6cbfa820ca73fb6201b240a5a94c4ecd11d466cdc44046a66" + - "32478221bfa69b3a2cebd16baa302a573c90895d7f4cab453b11e3a4d8bb" + - "b5a9bf264781ce5b9796e3c47d0fa57f46b923889af4d073270a360dae8d" + - "51d85ea916f14787c6500d2d906ccaaa92d20d93edd09139f79bfeb5fcd9" + - "8c1cdbcbe9f2587e9c9094e3c4a32ab9ba56f400b929e80c0551f953896b" + - "e8eda6ecf22e6d4a541957dec21d6a9cf388ff0ba58169ab934902892a58" + - "86e1126b16118e965a271495ffa339c49466209ed3875b568a4290b7b949" + - "69d0465744a3c2a75c599c3a04ab1a3fd09125fe8f45724b2f48c7822b9f" + - "ef95af4b758ae66a8b6646df7a0a1aabe2a24c052fd6d30561cae0389263" + - "e3388c4c1effe431a04356c334aac64f36593544885c4b7295b57dc39638" + - "b665b22dcbf7dd6da867615de38c6a575cc66391135d47f8e1f0c73c6129" + - "17ada4099723933a758d83311b384364263cad5fe14bdd7c825d9601c400" + - "3537a5aca7f9da4710c132ce8b0f1464cee625633ef57f507739a0ab1cd2" + - "21ae634d4d0b3ff07e9ecb1baaef0a82a97279d46543a0464855cd62c07d" + - "5e890265612906a9eac88bec07b1dea5f67054c31ae40f8c673296cc5df7" + - "f0dd8cc9e643b44fd90dc2d1e870ad8acdbe165237642fd04c00965837cf" + - "bd2344ae830887a5719a3c16dc8ec08bd9131d055bfb959b64ff4cb638a1" + - "002a4fe02e369871cc4e3ffda17dd85343e679fab43e11970e60198b424b" + - "676ab17fb0dee10cc9c2e92b32b68d5b05b7a559176f822850c0557ed98b" + - "7454916e32af549a0027db95f02b88cfc5e7e05f28f53757dd97cc0f0594" + - "212f8801e58043cb17b040413c226dfce2104a172d218caa4353890de17d" + - "be1f53af6ceda24b8781801516cc51de9ca459e469b3c322be13d8c9541f" + - "755c518ca41a0ed42e44b9f87faa2a968b0292216e9f3d3e8987282103e5" + - "016fe9f7681496e1e8d663eb2d8bc30b41d735465527f19e336a98d2dc54" + - "d7c020bfab30fe6c62cbae7d09f84af69bc2c51a1839ffba15015d381ba0" + - "a44a3758771c4f18d13827f518f30bb74f4bff29a87d4b9e949f1063f63f" + - "662721cfd64ffe1dab3761852387f78fa83fb48ae2c75fc567475b673da6" + - "fa8f53770b6e5a3c9fad951ec099c6bc1e72d1c489e1ae620e7f12ddc29f" + - "ed65f29c65cef75014b999d739e2e6e015f928a30f2fee3f2e59bf65b54d" + - "89948bf2bfde98b076e5460643952befd02fc1b0f472a8b75195c53ea296" + - "6403b9028db529cd04b97231bac3068855fa211f4d976a88bc27a0088f04" + - "576e2487ac0467992066ef7667ca8429faee92db38003728e5c219c751f6" + - "6f011b5d679fdd957f4575a0cfb6b54693a9624f2c7e66c578f5f0367005" + - "c66addd1e3ab7ea1ac404e357cbdab9438b9b4f80b3a6761b864b006f1df" + - "689ae4c0434b06b686d5353d3e421b57381ea24fdcf6199195ccdb3d5cf4" + - "623a6bb1f9eba9b22fa15395f65f8093b5f90455061c1cbf8128b44a31e3" + - "910862a59e187aa7f4d22e0317ae6c177cef24eebc44171f70c25efac73b" + - "38ada0cba0b74f72d1c171277a734819c1111ebe46d5db20a6ff20e2c1a9" + - "a57edae95a3c1f80ddf2b12c86d3df0078a7bf68695b16ccf92053c727a4" + - "80586b8d87d0d1772e456fde0c20a7927f351a641bff5f22f9ee2217b6a2" + - "d0983c8102d7d5356dea60a19e105ce366b9d000987c8c33396569f97c56" + - "2d0fc0bc5859779aa10efd1f8df0909c307a9110083cc6d9748456c9bddf" + - "16dccee52b7974867cec718bb0b76b3353379a621257094277a30148ac38" + - "e5cf67ed7cc9c1bae12dbdeb99d7d880ce98e17f0dc93c5330d1824a3c9e" + - "ffd86f89e15b59a4bee5a48d4f674766896e187abaa39917b83f8d2f3265" + - "bbe7aac44c9f8d92f775fe6493e85ab44e6e28f79f28eff156c21e1abdae" + - "d10a291b88c4020b1ae8be001080870847a852d073e82bfc751028ac62d5" + - "6aeac1b18f2cff1c0c7d336bf08f8cd5099d9d3b28f9e16077e9caabab49" + - "f2d234616a7522a6bde1a3b3c608df4cc74a6c633d4c8068138abda8d26b" + - "4ca70f95d152888fb32bdee5dfad8ff4a5b002a0a327c873656db8d6fdd8" + - "ed882e47ce8e47c729e1292db9122ce2e9fa275f9bb986eb7e0a1dccb7cf" + - "abd0449c92fd35e2aedc4aa89caf53bcd28170cae85e93f93988e723a896" + - "10cefb4edb6fa545835fba3107e21dceb272c5a32da26fa77df070f41d7c" + - "ad1d68b836199ff0f1221e36b9b976b5e69bed54b5bfec67fe9cbb383484" + - "696265204797634594bc335150daea92dbc1004f613b4c27bf5c699debf9" + - "4365041b5a894701da68a93bcb61f4e546c553fe61f14ab0322b45915da6" + - "ecacaa093b0071f2516ca8c3fef2f1e3c403993d734403c47bfe5f4379e9" + - "cb5b613fde3c0d880cecef4101aad8b8b1c60a92ac5185f6c243fdf1711b" + - "0b56f0fd8e5ed6cc0f99da888e4f156455a0f0eb365b8964347eedd15d80" + - "2f297977af667ed1376dfcc610f5152421b97afaaf16f9db57a435328595" + - "b9aa00b5ed9ff106c66970fafef379f4d2f98f2c5984ea05aad64651fbf7" + - "7968c8cbc4e959859b85302a88a3c2faed37765f3f6ced59d8feb6c72e71" + - "f9d4497d98bccf95fcb650f29131e1df1bf06a5443f8af844aa1a7b5a68e" + - "bb250c7de3a65ae9b1086cf83f832050e55030d0f67c6a54ea2a1dbe18e2" + - "8a96c9e0dea2966997bfc5c5afd4244e3c8477c4f5e8bee8fc8ca9a5cde4" + - "d9c5a2c7f3d2e811b1de7ce4279229319e432674c609b4c8b70dc6172e9e" + - "653fe1969bbc2cb3685e64fd81d96d33", - }, - { - key: "b41db44465a0f0d70093f0303bbd7776017bca8461c92116595ae89f1da1e95f", - tag: "d8a111a09db22b841fa28367ce35438b", - in: "b074b0984fb83749586881e8ec2c5ce9e086cfb2aad17b42b2429d4cf43a" + - "0400fd15352d182e6c51e9338da892f886f460d40bd178d81c52e9ab9c1c" + - "bdd812594e6fe7a9bb7fb729c11328d3288604097600a0c151fa3d9e4268" + - "de75866558e9f47d8dd331994bf69f826fd4a6cb475ae5e18365f59a477a" + - "dde7fbcf7e40b4e3dee020a115830b86f0faae561751e9b596c07491c42d" + - "e02fc979e69071113953729d7b99f1867116d058a90f1b8c0f9ba12c6322" + - "4ebd1b563a87734f5d6e2d4e6715d5f0213e33316500cc4b23784f78a9bf" + - "13fdf99bfe149cf47aeaaeb9df1cee140c3c1264fe89bcde8acda6bde16c" + - "e3d770ba51950b67ad2c5232ae0cff048ddfda8540cf18e673582dc96987" + - "4b127f655e7d4e08859f2c6b95403cd5b4e2c21f72bb872e49e592306286" + - "48ba1b16fc9637709636b198f9a297aec364d4c3bc869dcad32b1830e434" + - "b556b429136f0012a0a0b6fb3797bc8668014b010ea51674ef8865348dcc" + - "197672047fcf72e6b6910a0e32a4f110d85e28db0e338d9cfdec715a8800" + - "b4f007a7951d09e41620815848c89f8768344c50bd522c46f64ac6c98e53" + - "92176651961c7a70b62f3d1819bfda674e2ecd3167415edc4b97419e8ae4" + - "9974b56cd8d52e1d05b82610b59606a750b34844ca33bfc9b21fb970738d" + - "b66f48928df79cf67730a30b0b612f8c15c22892120548ab460a6b9bb3ac" + - "e30554c86c9681c797821a1b1ce91d0e87fe90ad4097c974cfbdfd5c4c24" + - "a5f808f388e1b1473e858f48a387614501c8c39d6973ded69b1764663cd5" + - "166be02b596a49e392d637e3d8afc91323f7450318b79d5488c040e346cf" + - "0cee512044514b570aa66bb98d639a9ee23a7cebe28474592623d082873b" + - "73efb3eaa4721fc4761e15a390497cb13cce181107e8b1a0186b9e47a5a4" + - "b67a5be3cd88a43d341ef63f10af6970aaf56035db938655020809033a92" + - "8d4fe6d2f5424fbde2fe82adfd991d388edf293cb4e3eb68d876f225a5f1" + - "58208bcb1aaefcbc28d6763d267406aa8d6ecb413d18cff7a318ba031ba6" + - "0ac4560748c248de64eec56dd4540124b38581604f502d94a2004f9eb1d6" + - "edb009e16af6c6d3ccbea79b10743da98aee7ace407a90c6cfdde694f36b" + - "e0271e722618a457be68619b980754795f4ac95ebf4f1820b85ca8e3fbff" + - "a2430f8e01ab422d7140751f7741f2c921400dac404b04e049736738a87b" + - "6f49bd54b1b447b922c473831a65f224ab84fc96e4551a0333bc6187e15c" + - "c0f0ad628068bcd7c043bd1e3036ec01e7fdc3d157476149917baafaced0" + - "15d09fafb92181a0ec65b00c9c13631e65de184377416e04d3d93b847e0e" + - "286c1d88245d4d550d30d4fbfcb416ff26a39a94275631c2deafc7cb6780" + - "f149e4d0e9c4515b708fcd62be5252485407a6ceeb9247de34e0266ef384" + - "976f6d31284c97468b3b03e951d87a5a00836ea303a266147a79ff3431b4" + - "b382e86c74d92661e0f65e266b7d569c03994b667a8137f3080eda2ff542" + - "0f0b52b427558dc26932a22a615c9e6b1834a251c6b68fdfc0bbe0e8781e" + - "36adf669f2d78bd23509ef7e086634e526258e8d11a1e0be0a678ac09c7b" + - "b4e3c5758504011e701dc85997fe2a3e40c7af83f032bdbe7adc10ef1e4a" + - "666946c2bf31dd8e3a383211c9684d5302f89dafcf77976d5a02c14e2462" + - "09d2d99918e82402cb0eacaa12032ad8316315af1b3d3bd5058f7c935d35" + - "ef0d4e71373958fd5e4140a9a586d89c53e4144c00148a4706a524896eb0" + - "5b1479a0de5d3f57be46b3f5fa4e49bffe027c81a33e37abc01a4cafe08b" + - "8e21fa86b42be52d75d6407e6cdf399de7aedb9b61a6917b2677b211c979" + - "33536664c637a57ce2234e3319fe8b4a77d7285ae6347464dfd0aab3e6f1" + - "178e0029686770d3b0dd541490b097f001e95f27efe8eb16e4747937d643" + - "cdefd49e586ecad541270cedc3064bdb7c79f086bf1fa8c666304d977a15" + - "54ae268881e17d8bc3fe51fa9969f7e560e3d3e050424febec0998b35f2a" + - "7378b2c3e384cbfc80c4987734d76c78224cb81cc5376f88f0ceda28aa50" + - "44e956537c3ee209071d84a66173384e0aa466d989759fb1f2f17fe627a0" + - "ffeaae7c5a3884b237f5151278a07117c2e833f1815c7e0e0b1611f25058" + - "ca338d21deb1a571faf1d0486667cb7c58e2814c3722d24fb77ce1b7e018" + - "2ae5746442b5ad00208b17c0a68bab4df8a8f36edead4fbe79b4c9220dd6" + - "acea6d23c7caaf6ce7cabeeca677a1c764d610ea6c7e994d6a9c88f57fda" + - "ef160b251e7595578ea2cc1441d480c14b8b6945e76a001891b1f214979b" + - "c52ec15e9480d706a40cb6e3b259ee99a9e84e63a738f1b52cf71c8ecb04" + - "fc833c2c680bfed587aa1541e5ffe8bbd7b21302bbf745011e559f94f952" + - "8b7fad8a37f6d855306a5be22725859cc950bcc334179d49564af3b9c78c" + - "e1de59a9cb45086a33856ba7195c17cef573950155bea73ed16645768bf0" + - "a5cefce78ba3ff98a54a8e8afc5dfcb0d422bd811ba9b7770a663b081dbb" + - "40aefffbeabca955a9638830f0c5d70663cbf5b26067cd061c4a3f5cf8fa" + - "4b6678d82d9a2aa33f8538b7499a3466f6b0ae2a1daf280ab91a6c220684" + - "12705245f353b4b83db50bedd3bf99d42bde6363fd6212cb745467acb007" + - "b678128f6580629a06171f7f3af272f8900b801af3bf47439167871e7b0c" + - "33f198333992a6c52c32be46071738cfbf245937d48f816ebb88ff0e726a" + - "dc41de4c771ff0bd320a4c0b1fcccd9fd6c42ec9c5185943c70e9a4b7c26" + - "a980afe104bb1f99576671a254704c7d4233eaf9915e1d56c103ba9f6e8a" + - "46aff466933bf58c9842796ae9cd21f7ac6aa96ef42ca54e390203bac354" + - "b7c1de7d1887c48255201335f819020e2782a2ee8af92ceb206b651ae92b" + - "3f4fdefed05e08974aee0a353d104b1be9a5e75c7f958f1981271b0a6928" + - "05a7a2f28a0448d86102b4fadf9ab4ec2f98e31e64fcfdf2b524780b3342" + - "7a2a3100c2032fc93199f3ea7a9e8063fe73282dcb1fafaa9496c7da868f" + - "dcf33bbb761df0bfc6fef30fadd2b6efef4fd3216a8aee48a2ef28102491" + - "cf7278b567c272d1064a277eb193b3f6f01df641ddb729f72454943cbd3b" + - "671ec077f9e3548f5f57d063c653ebee4f228a78f8a128d26f7f4b44160a" + - "07e942bab87b2d043c77ecdf10c1a419e0a1c4162a99c21d4abae0558b8f" + - "4dc0b7f1ca3892a6babf71f2f70aaca26bb813ac884ee5d71abd273ff1c4" + - "add230a771b678afbb12a1ca7fbcb2c0f5589c9ce67fe8f78a8db87825b3" + - "09ca34f48ac35aa7ac69c2fb2423807650fcf47ee5529e9d79dd2628718e" + - "230ffe5b83f9d5bdfd9c5d211282e71cbcacf972995bf1b13d21419f7fa2" + - "8829ed1dcc459da35883b9269a474f7fceff01d44ab78caf1ef7d8117f50" + - "cc83eb624062b149a6ed06ddd1cd1feafccdee7122353e7b3eb82978ca69" + - "247fde52d2d6cfe7324f04af5259e1b5c2460889da4541b431ba342a1c25" + - "3a1b1b65fce7120829e5466e7ad2fe4e0f773c7c13954a9c92d906c91aa1" + - "de211f40916596bfa8245344e257e5907a2c49ebcc864cfbe28663e700d8" + - "472c50355313d5cf088e9e8a19cdd85bcfc483520498c6386050e53a3ff8" + - "1e2b77b55b116a853d71f60d621265166cd7e95ff5cb4466226d7cef68ff" + - "d0a35b61e76a43cdcfa8da7fff9558e2f89b981ec6be632b126303ca1fe8" + - "53d5c628d967d39317b60ac904d6a882beb0746f6925a86693aff4deaac2" + - "e5b64b611de86767d55a6e11221605508b1c5cc828251539b1b6f65c2c04" + - "8e65be5422c1b11194eb687d906c559068c0a810713b23b30d8b17f10df7" + - "0962c5e7e782aff7bb95adfe4cba9d90b0ebc975fa56822025100b5cb8b3" + - "8bdc8928c1a2a8034dd66e2a763696d7ce6cef4dd586b83f7d01749d37fc" + - "4fe8d7abd324d4ff1efdbdbfeb0a2fbb8b266fc2bce8e5e5b95d0089e7c5" + - "d7de4db837d1822ac8db8198889d6bfe778d0b19e842f12b5afd740aaecd" + - "e36e2cefc2cf0b082aa0c4f75684d024b8d828d8f2911fe1aae270251f62" + - "4f49584e40bb193577c9d8e04eb16c094653cdf9a15fe9210f724c7a7c73" + - "74cfd1a74abb5ceae88ea54f7e7569f8eb674529cbec965ed05bb62f1968" + - "8fdaa97297268bfeefd06eb21f700cc56f9bf7f6cecbbbe7278ada8399fb" + - "960371a2d5cdb852b11c9fa17650e614c5297bf46cb7889d52bcf49d2560" + - "720852822b75bb16524d88273cb366b84b88282da91875562e5a1fe73973" + - "afe90e5cdd3f5381612d3ba7bfa058d023a9326e403ec474d8938313fb32" + - "bdb5bf899b900c3818c43c8a0af6a061bd26e847ed75983402ee8a9cf4ef" + - "85bba5545a0d329ba81495157eda0286f1917de512fe448251697dea406d" + - "a510adcb05", - }, - { - key: "b78d5b3019688e6ef5980c17d28d7f543ca5b8f9f360f805ee459717ca0d85a1", - tag: "f01babc4901e957d0c2032a7279321e1", - in: "ba7d35b2ef8af1118bce1e78018c9314b0c8c320591e103d23f715acb05e" + - "dc98fbc618de06627661df5842dbba9f604c2d20d664e5db06e949b11d49" + - "665088dbafdb0d39d20beaca7d723f8dcdc57e9c5583d303b6cdfdbecf95" + - "7d8daf2f1c72b2a6fa27e3d18841f4841abafd334c110cd2b74efb6191db" + - "ab9b8fc8427ee17664082f31db98d30bf15dda967e20730a9ef525abe9f3" + - "f620e559ed22bf74d347c9869f0311f33da7f1a3dc858b3a8aa73a35989d" + - "b055a4a2c269c95e352259c57de8b94d8de48984ecde426d3ef60ec1c7b4" + - "41cc950f7764f55bd0cf52d069b9ad446d1f765f35d02ec104ffcc00bf1e" + - "dc1b951ef953acd19984ff1b41041bea0e9f5326a7c9ed97e6aab42174ee" + - "971ea1dbe2fd1c1f67f977ab215962b0195417170f6b7748fd57262424d6" + - "cf7c235b34425f4047191232722932213b3eb73904cadd6a2e9c7571d7c6" + - "6c2f705b5039ff75e5e71c5aa738bf4177653e6eb0b49303a4bc0e641e91" + - "2691f217296a3325431d578d615afddf47784e4618a2ca40ccecb05d621d" + - "a52f272b8cf84f7fd8177c83af1580d25a764cc06436d67171cb5d1e3b39" + - "367b46d9a59d849d87ab6bfcf3fb9bac2b1ebfcd1cef4459e74b0e1b7080" + - "dabd2dea79f75581a55de63c4b23ff67d986ad060102933fc6cce8d614c9" + - "c86dc84068828dd9e21ffc5665c809d83b09432fd315dfce5d7a4ebd8143" + - "181953e3f8716e47b0b30cc1f753e31a7d509f2dbd4177b6da310cf3cd02" + - "5db270adf98e96259a5ae1b81f5be4d5c76f502a612ca73c76b91e0ca695" + - "aa921f9489948619482c2956205ae71fffc3aba4476ff754e4878e36c763" + - "2c935c076857c5b90cd63ea4764efbcee53e2ddc9bdce54b1cbbcf0e7544" + - "d023e7c2b79419ad92221a1f76abe31a8236e370d38e2493cc9ca2aaa811" + - "30fc713d11f500fd071d6eba6861e8b0859b372e62fe60b627a96c377f66" + - "236aedf307e1d148a61bdad072b93d7d2a73367c595b1e048f7023e72729" + - "1ec508326f5424a5bbf4e010d0240b71fa9137e6642ab40c5e4fff79877d" + - "b3253c663a221b49b3e77ea307c7b9f3f72a0f3a54d0112c45c64a0c0034" + - "baf2b55ae36ea6f811bbb480cee663136474dacac174c73b1e8be817916c" + - "fd4eb1876582bb3a36cfbabad91776aa676305ddf568a86e3a5eb687fa81" + - "67771fca7b5ca00e974b3cc3e322b4bd9bcee2a87d0ae7976da5e04fa18c" + - "219fa988d4f6fce62f194b05c26ed3ae1b066cd9751a2d916d53426a454d" + - "58f9c3b2fb49374e5791b412fdee1b6029144f1ca787f56fece4f64f4fac" + - "bfe4cfd8ba7c807a83cf44008fe5126a283ab2631a87acd8e2a3bd10979c" + - "4b07a84a49b0687a45a4798ded0b5e9b2acce30e714d78395bfa8f33ca91" + - "e68b2138bd67d8a694cd87c88dcefcd101a3b408d7a9095cc6a4b38898ec" + - "c8b375f5a67deaaf73eb7e99b10314ca6bba824658bee85dd731d9a1475f" + - "976b7c0aed4b67b088f0db5ca5091273217f724969dff6cf184181377c45" + - "5722beb23fd9d097a82ea2d8d527ba6284acc20cb30f2e52af28800c61fd" + - "1faf9f4f619550e0162a1a63758e202533889b27420fe7d0eac9a47a6e11" + - "1d80054412340e0426cdddbb3c7b9b823b8db3ef58230fad7a3ac21a7805" + - "d30878d4ea78dda95c951b7a5dc552e9434c35e03e1dd88652d3714f8fbe" + - "a39936cc0717c2e0335371f2a751204f5d9386baaec853f019325edfd1b0" + - "719d1fdac3fbd774a64bf957fc54039501f66df94b5b9b82c2076c597065" + - "dfcfe58b2e215a3734066aeb685ef97759c704b5f32dd672ba59b74806cf" + - "ad5daeeb98d16f7332ff0ca713d541c84e4aef0750bab7477ea707e2e497" + - "e12882dbc0765106070ec6a722d08fe5c84a677817b28fa3a41a6117f2f5" + - "465c2a2f0eb2b8be4f36e676b4115008bade3573c86cfb1370c03b6b0dc4" + - "bbbb0ada4dedac10a593655068a26febc2bf10d869cac84e046c9c846ce7" + - "927431f606f07b92abdfd81260199ae05ed01dfa07088c56a6a8de9c6d51" + - "d61d6a6d3f9904c216ea8329467a006a3d2495a768a39ef99a21827d2def" + - "909bb743fed7209f7fe59ff1c1e710095b05f166c6173deef5c6ec4105c5" + - "fc3b87c8269c786bebd999af4acbf12d20453b125f338aee87e9509ee405" + - "9c9e568e336304d7be9ffe81d1700555b0800242d9b7450d7256f2b17f6e" + - "d46a39f67bb2980572ce73169e352070dbafd4c7fa5a6be78cf9b72981c0" + - "a01f1e1e30ee3736c59828b791d2373799854497a28a44bbe0e074925723" + - "4986696fbb06ef9ea83fbd49c45a583ce12ff10258ba06127c67b0f66dd1" + - "09f1366d8036853973d8884f93de54fb2a12949eefc020717eff47898cef" + - "306b5de068411f1e113ffdfe2556e0faedc3e27d95a45b8afc15ba0eeeff" + - "eb86da7b4324e20af80c62bf0ceb4aee1515f5912f71c6bf2febf20123e3" + - "dd3a82dc1e58a108f1039942dcdacdeb1f0ad0b2ef34488d98d6a52311ae" + - "acbd03c12f6e775e375d5979c7c295bb049f2cfd3580e3da3841ddd8e6af" + - "4de5e6512ca79cebcab9280554524881da37984d340e8f0163fe10a02ed0" + - "88682560bc6d3c4dbcf1a542ffb3dcc2ed16a2eb96896e8269697ffeb50b" + - "73f2cc354092e782a0072fc12e1eaff117c2cc8a5a1ad8b47802ac9e23fb" + - "91a0cef9e4027595e0885464e61563093ee2b1dc5f22dfd04af7de6a70d5" + - "977d3751a4b3cc0c71a71c59c0534cb1f8c0eeddcf1c0e1b3e5ad0d083b6" + - "6e8b998ddf9ae9d3b365c851d42e995b9afdf8d66b2ac40bf514ce32e456" + - "0880afd38c42c08926067eb243c4b1184e667ba756c14ace5f525eb48df7" + - "ebb429d0a23d159664f8021d27dc7167081de331c7114c9c6456e1ffdb42" + - "2172a81c06d8deca995e158c48df27261a83f83e0127f5e056a139be9b76" + - "e25dadf534d3d1ed6ebc0b5d77d51e5b90ff86f30d4023066115bc11b33c" + - "c827b1103098826d0bf8777176b2da6f1e5b580e407ccf7e614fdf4f5b53" + - "3ef6d30b20c1bee61eab90e983b1a97173a62720ffd27abb8976a948d532" + - "d06596c23b0ef31c79831bead8f8e99ad209af3658cac0cb3c3f9c88379b" + - "9bc871d8e84171d53400902da1243f664afeaff60bd96ba2639a7644676c" + - "a79f43130af12ba2c877d67f7ec030a4217a72f5368af7c9f24e643db6ac" + - "97a04adaf57dbc53762d8dfa1afd49667c4041adcb5ec303e191b786273b" + - "bb065cd9f16a3a4a399c6a7aab9c1a6604998264e8b3dbd13d8f2228b13b" + - "2c2b9fec5055d8e9f2df1d9a25e4bfe2029776389877bbef7e2c7621f06b" + - "c0b7fc0786e2b2d042483ccd4a59d2872a6c5ac73e217123e5c8401580a8" + - "d967e0895aaa28f4d25ce68c90b4394d8113bc423e9fae46ac47bc2ac191" + - "fb97b80b5a85feb2bb54f84c493235c1408662fe253c6786fcf6fdb8be87" + - "dc66a72cc847f94dfb5214af5905b7039a7363a1b23a07853daa26862783" + - "ba08a80846fbb93ce98700a4f9961115128dd67bd7d19e0c588fdf6196c1" + - "1cb0154002ae862f11421f5dc3a57b6c0870b452272be556a1d14eab1af0" + - "a91ff5b89de6bbeed6e03bc64f5efddf9e54da71c594bc5ef78e0192cfde" + - "da36e4ad1a6b0b51110c1b24d20dea1f19e18cb1184d80189f842d4f07ac" + - "834744dd009aa3771b1e5502fe4b65a403a4bb319e1880ff6ba852e90a8f" + - "4fcb52cf374c88408428cdb1255291b04ed58c992310955198d61fa1fd9d" + - "762d48f2f65a287773efc67d549981c291b427889d3e3dfc0cc6cd68415c" + - "dbed81b516786dacf431472a7dfc99688d15bb6c1b85b1a2015a106e5de8" + - "cb9eec4c80b17d00fdcf4a9c64de4643a95dade8fa9f1bc5c839037d86c1" + - "3800a244188e3b18561a74912ed72f99f2365f0126732d037dd54a3ab77f" + - "9a9f6a1c1469ea92eb707482066bd4990dec4d7614ccb4ea6dd4deb8bee2" + - "2c4dc0b9b4d4cc70a500d2c8a5ac3ef88a38439b7dc254a6d920cfd317a8" + - "4d7747148c65b6730709e43369d4c995b03c58b9df444f77f216944e70f6" + - "6446554d8d513b8f7f28ef0a2d7ad5ca2f6110304196953247a7ac184f68" + - "61fba896c2d5a59007ec2b2c8e263957e54cdc1f3b4a145228823fdf0960" + - "c33a28f59b03ee4be21001d2f56fd49ed14db33b2c4eec2c3f41b250a624" + - "99a9b6602c1e838526a54cdcd058af1c252d56009d4c7769deace53bdb66" + - "543f5a081cdde775e61efa70956fe2a7a6019a164c6e413ded314bc928b4" + - "aebccb946ffdf3eb33e187bf421febe26112b3262a526de65678cd1fa03b" + - "83513705108fe0bb87aa99aceb28af3641c46a2c4427cc1063de01aedaea" + - "fba68155d4de494a27ff6b7fcc8f5c5c3f7d3a115c397a1a295bc55aec8f" + - "7f150cbce2a8aa4706d54ec863877bb966ad441c57e612a1b5d438b98d9e" + - "fcdfe6d4f66e885f96407e038015cf974ae5a3540692b054d2ddfde59b28" + - "ede7e2f581eeb56c5b88e2779aea60c1d8ca6107b0cdda1ac93e6c7520da" + - "edc66afeed12f980e20e1e1c327d15ade4bb90de30b011a9cb33855ca3ca" + - "e2", - }, - { - key: "2b0b0fd3347e73c2fa3a9234e2787e690a11aec97a1c6d555ff7b4047b36f372", - tag: "81b1a6633f849ab0aa7baafa58a5d9b8", - in: "427f3a7a5f1142ffa68e83df5f917e07b2bc454f3adce068a8ae9e0908e1" + - "3e0099aaa9074697593c6d8c2528fedddeca05e3888be1a0a201c389a72d" + - "20cb661017544d95a431e70e7c6580d8fb46ea4495bc59db6ae2cd69510a" + - "02426c50de1b6110120f759960605aca718d4d0a497e003e1ea2b8ae9a53" + - "df3c1eb4f704eb32f8f05eb08cecba0fd4a94f0daa3b0984c30a38f94b7a" + - "10cde723182d30588bc40f1f9d38a3bab4800fdd5148e34e396144763696" + - "c9b3e9b8adfdb337123d54237c7413f98bb2056152b256e37a27bb947c67" + - "240fa3ce8da62ab367db540bcdd9eb873d6c71c75a08fe99b5c11ec8e6af" + - "f926d2adfcf073479de394d4aac5fdc6241824d944b8773db604c59afc01" + - "495ee755905e5616f256c8a64321d743a1c9368d46418826d99b762e2f6b" + - "f998d37a995969cdc1de85f0ce3987c6550459f5e5bfd9173bfcb9e0112a" + - "d91f092de446beba14fb3b8ce3fb2f9c941815b2cb5a3b406e2d887b7912" + - "bba07c8dc7caab9836827da93ca71fa5ada810da1e5e9b09738524564d8c" + - "923746d19c78dc9107b9f20f653e05d7f2eb6bd90cf5eb30fdd7b587eb46" + - "74a1064c70ef0af2e75373044d32b78d96eb1db3112342d38dca0e47b96e" + - "9307fcdd711b1c66355186369a28481cb47ef6bf6651c2ff7ee4665247cb" + - "12b573933d3b626d1c6264c88bd77873c2e73e73ee649216bf0b6d6615ab" + - "245c43569d0b8096596f25ceca8667661de1cd60dd575697370ebd63f7e9" + - "5333e8a2cdb829b75ea83d72cd246d50358f7c094c8a515805fda03165d5" + - "21391617c9f9a2ea562b419632df611a67912d2b369e5e505dbd5c719253" + - "16d66cd608cc4a9583a8eaa4661b7279870345fac3031631c1a220551527" + - "5be7d8d89b71960e687aace3a0e8f206e475053d6fbf97717b154c75406f" + - "2caa97d1ab66048f1c99281c188a2f37b8bfc736c25840a9130ef2031c05" + - "6acd9dc10592eddf94f5bac85319b10ae46cc136a0738aa803837287ed7e" + - "dafe08d1fcf31d5e63763e39a5e1f4d7d0edab368d44e63fdb33c28905ff" + - "d6be406a024c017081b4f2d70860776e9d2556cd008fa5017b58733da13c" + - "634938407a118827a80baa28d4e605db59430f65862b90cd8356baa287b8" + - "4e6d9199fd80abb9fa697e2c2c4c760128e4ec0438388cf407e2a2fe0f57" + - "908187ed8efd4c5cb83cc91dbe6a11444eede85099149ca82921bc28bdd6" + - "b9999594a41d97307f8854b1bf77b697e8cdd4daead2aa49fbc571aa44c0" + - "bc84a57cb5fd85f06847ad897ceaf449eec45bddd4e4eb1e1e119d15d5e7" + - "90957e686acbdda1bbe47ea935ebc4b8c2e3cf9b7157cc6dc03bcb19508d" + - "a9e19cb76d166da55559ec7e0995d9b50c6c45932d5b46eee400c56d9dee" + - "618977dcf6f76e3e86bc5207493afbc2aae9f569ec9277f33d9f61c03d59" + - "dd6d8250ee8cb3e54e5e941afb74f0735c41d52ef967610c9f55b2b52868" + - "4b549a99ae3392a7237bb52ff5f8d97327e2837268e767bed0bea51f76bf" + - "88bf0286bf22b881f93f1d54fab5cd4e3c148c96c39e7aeef375de249df0" + - "4d89d1bd97a7afb2be0cbfd3380cb861d31e4ad1ea8627721e4518b9db3c" + - "cda20273ec23549c4adc3c027e3ac9558de2010a0263c1225a77dac8be60" + - "d498b913f91391d8b2656ffddb06e748cb454dc2b7226745f11030a6b9ae" + - "09ac8ac428d9c6500801fb540650c94610ab70465b1210c6db2064dc84dd" + - "7f52573f8f40c281470e85176c85ec6de3c718663d30ad6b3dfc1a3a9606" + - "1936744357ca62fb8bb066aa1fcac6d7a2adf0a635cd546bef39fbd3ee0a" + - "8802ab0466ec9b049b5892a9befa4377cd199a887c34569b6f90852139a7" + - "86babc0049ee2b527aa96b988237a52eae8b4b49d2ee15ee5294118cee62" + - "3c3e11cecb836b21af88555f10be2eff8379beb615b7b3d6c01d545cacf6" + - "61be8ebbf7a3c58ac5e0e7b17997659a2bf15f2b2e3d680d142fd29d23a7" + - "aea9890f3ff7c337fce49ecedaf38573edfae07810ba9806723e576d687e" + - "a11700b8ccb96a6559259c367cef4e3999a05a373ab00a5672ce8b3d1dec" + - "a414187f383e449d10021b73c1f7e39ce01516b7af96193f9993036049fc" + - "72ac059ef36b2bcfbe13acf140d41592880fb8294ebffb98eb428ce9e65e" + - "1094521bcf8ecd71b84c7064539a7a1aac1ad2a8a22558fb3febe8a44b87" + - "72fc00c735773d4ce2868a0b478ee574b4f2e2ceb189221d36780b66212c" + - "dd8fd3627cf2faaa23a3d0b3cd7779b4d2b7f5b01eb8f1d78f5b6549c32a" + - "cc27945b5209f2dc82979324aebb5a80ab8a3b02129d358a7a98003e701c" + - "788a64de89726da470010eda8fdcf3da58b020fadc8970fafb08a29bef20" + - "2bd0707e994015258b08958fc2af4c86c3a570443fe6e1d786d7617b0c66" + - "29a6d9a97740c487622b5b8186c529d7f8af04d9f0a9f883043f08103ca4" + - "d70057ee76639f3b1046d86928d54cd79fb5bb7b46defdf15d2f8578568f" + - "1d7b73e475e798ec6812586700e038ed4791b23ac9439d679a1a4bc04cea" + - "e328330c24b065c9cdcdcedfbaf58e5299779e6f48783d29ec3b1643bc8f" + - "1095c724dea75770583b15797fc666f787510d91e65a8e2090cc1ed2013f" + - "e63ab17bc7640ee817487f4eac8326e9c4698cb4df05d01bae8c0d00fc00" + - "08919484d5e386c8f60b8ac097c93c025d74faa56e8cb688d1f0c554fc95" + - "aae30873e09aae39b2b53b1fd330b8546e82d9e09bbb80132d794c46263f" + - "4fd7b45fda61f86576dec52c49f2373e4dca31f276d033e155bbcdda82af" + - "8f823948498f4949bf23a08f4c8ca5fcc8598b89c7691a13e5aba3299ee0" + - "0b479b031463a11b97a9d0ed3189d60a6b6c2390fa5c27ce27e28384e4fb" + - "04291b476f01689292ace4db14abcb22a1a37556675c3497ac08098dfd94" + - "d682401cabec239377dff592c91aca7eb86634e9d5a2848161dc9f8c0c3a" + - "f7b6a728371fac9be057107b32634478476a34cbc8b95f83e5b7c08d28f6" + - "fb793e557513ca4c5342b124ad7808c7de9ecd2ac22d35d6d3c9ce2f8418" + - "7f16103879ed1f4827d1537f7a92b5bbd7cd12d1ecc13b91b2257ad073b7" + - "a9b1ea8f56b781bea1bddf19b3d7b5973f1065fb72105bb4aeecca5b7513" + - "ffd44d62bf41751e58490f171eb9e9eb6d57ffebedd4f77dd32f4016b769" + - "fed08dd96929e8efb39774d3c694b0d30c58610541dcfab3c1cd34970195" + - "7bf50204acd498da7e83947815e40f42338204392563a7b9039c8583a4dc" + - "faba5eaf2d0c27ada3b357b4fccd1595b9de09c607ebf20c537eb5b214b8" + - "e358cd97992fa5487bc1572c8459c583116a71e87c45c0ba2ca801931a47" + - "a18ef0785ebbe420790a30278d2d0d42a0225d211900618438d1a0b2d5be" + - "d14f8b4be850dc8cb08d775a011683a69ee1970bb114d8d5017de492f672" + - "09062d9ba3616e256d24078536f30489e4dacd6429ed37aab9b73c53fdd8" + - "a8a7aff1b914b9d82d75a46d0ccf85f48d3ce9a8d3f959b596ae9994ac3e" + - "3b4af137d0c8e07ece1b21fd8aa05522ba98f85a7ab24ed8c1e265fadf4e" + - "9a18c5ab5684d8ba8d3382ad53b415c73ebfaba35abeebaf973b6f18e0d8" + - "7f019420eb34e09bbb12afc5b149f1e9e9b6ae36ebde429d437ada1a2d52" + - "b998f7c75ef731132aafc3bb106a2ad3ae11223a355804d4869ebaa47166" + - "2df261d95d48ac6eb17c1781e81c0027ccf8f05c39e1eda7793cb16622be" + - "ce7a1ad5d2f72f8bf4bdb2f4f4dcadac3db3bf727f0d447adddad4500360" + - "09ee011bf4155e5e46c74b00d72e8e6a88de9a81a5a4685651b90e874dfe" + - "eba41698c98370fd9e99619ce59ebb8342417d03fc724f9c910ae36ac5e5" + - "b46c424141073199aaac34232a8e17ebbfdd80eb75e82290de92968f3893" + - "0ab53dc83ac433833576e86fbabfb9d7cd792c7e062811f4cb017710f841" + - "1e0fb65ea4b3cd68b0af132cb08330aa13579196ec632091476f268b44ba" + - "8f2e64b482427dfc535d40d3f58b4dee99053b35a3fed1cb245c711fa16f" + - "c141974c8db04f4c525205dad6ca23ccaebde585cd3bc91f5874452ed473" + - "08de95cb6164102744f90b3007e511e091653c97d364fe0cbd7f4cd3249c" + - "1f5c452becd722ccc8c6b4e371e2631337dff78efd903a8fc195a90ca5a2" + - "aa4513bc63cd43794ff06c5337329055c43d4fb547e63d6e4d14fbe37b52" + - "1411caf2f1b0df51a68f677db59aa227c725cf494ccb7f8cacc5a06ac5bd" + - "f135a2603175a5fd5e5af615fd2e7cea61934e6d938b9e672290aaccd99a" + - "7e26dc55efe928e56ae6354168264e61668a61f842a581cd0c4b39e0e429" + - "04631c01320857b4d7e260a39c7fbed0593875b495a76aa782b51fee4f88" + - "84ca8ddb8dda560b695323cdde78f82dd85757cadea12ef7cf205138c7ba" + - "db6a7361a8d7868c7aefa7aaf15f212f5f5ab090fd40113e5e3ad1ab04f9" + - "b7f68a12ad0c6db642d4efb3d9f54070cc80d05842272991bcdae54cd484" + - "9a017d2879fd2f6d6ebce27469dda28ad5c345c7f3c9738038667cc9a5bf" + - "97f8f3bc", - }, - { - key: "aa3a83a6843cec16ab9a02db3725654cb177e55ec9c0c4abd03ada0fbafca99a", - tag: "719dbe5a028d634398ce98e6702a164b", - in: "643883153c215352a4ff2bb2d6c857bafa6444f910653cacd2bbdb50ffdb" + - "cae23cc297a66e3afefbd85ab885e8ccf8d8f4930e403662fb4db5121aca" + - "82dfcc3069bd5f90be4f5bfd3c10f8038272021f155e5de0a381d1716abe" + - "0b64b6d0f73c30baf6ddfe0e6a700483cad0fa14f637afb2f72361e84915" + - "78ba117e1c03f01fd61aa8f31da6464f3d0c529524d12dc53b68f4d4b326" + - "db7fc45c63f75244002b8f9a185556f8aab85948647818f1486d32c73614" + - "b8c4763e2645bdb457721ff3901327588da01622a37ccbbd0374fec6fd1b" + - "cce62157e64c4cde22c3a5f14c54cd6db63db0bd77e14579989f1dd46461" + - "4c8691ef26406984b3f794bb7b612e8b160374be11586ec91e3dbb3d2ccc" + - "dbfd9c4b52f0069df27f04853e7cc8b2e382323345b82ce19473c30296cc" + - "453f479af9a09ec759597337221e37e395b5ef958d91767eeb2df37069a4" + - "f3a530399961b6bf01a88ce9dfcc21c573e899b7951723d76d3993666b7e" + - "24dc2570afe738cbe215272ccedb9d752e1a2da00d76adb4bc0bd05b52c3" + - "fa08445671c7c99981a1b535582e9b3228ce61662a1d90a9c79afbdcfcd4" + - "74def2b7880cac6533ba0a73fa0ba595e81fd9a72ec26965acc0f4159ba5" + - "08cd42553c23540bc582e6e9ac996a95a63309f3fa012eac14128818a377" + - "4d39936338827bbaafad7316e500a89ed0df7af81be99e2f6aae6bb62568" + - "1dfa7e100ebca5c8d70f67be3c1e534f25446738d990ee821c195c98d19c" + - "fd901e7722b4e388da90b95ac0b5b5dc5d052ad6b54f6ea34a824bcf0cd8" + - "7f1fc9a07e8f5b8aa0793e3c9c1022109a7c7ae97ee2a2867fd0cf0f8971" + - "34b3d150d3b24fcf8323de929b73cca01244df02510393f0b3905caa0268" + - "7fe35f64391e7d4b30be1cc98319716528ca4f35bb75d7e55cf7749968c5" + - "37136eddb149a9f91c456fde51937c0f35e7e524647311077e6fbe7f3c12" + - "37b9584fcf3b0f78744c7b2d3b452823aca06d144e4463eb5b01014201cc" + - "bfed1adf3414427072135d48e705b1b36ab602cae69428e7c19d39cbb4e0" + - "ca26a871d607ed4daa158b5c58a0a9f4aa935c18a66bdeff42f3dc44166b" + - "a299d71a2141877f23213b11c52d068b5afadc1fad76387cf1e76571e334" + - "0b066ade8da02fe3b0bdc575b1d9ec5d5f5a5f78599f14b62db0bef7ccc6" + - "1711482dfa4787957d42a58fdc2f99525c32962b06492229399980601bd2" + - "ee252306b1464914424de9aa414a0a6e5dadf8ffbf789e6d18a761035d3e" + - "f2ff0753becbd2dd19fc1c28f9acebec86f934f20b608a9ef735ac91f6b7" + - "83d9327cce7f4870d39bbbfb0100838dee83e6baf2b40cfc98415dd174ed" + - "72e393ad0459e8035dce7eb18eb3af2f39d2712846b9e1852cd61d06dfc3" + - "5e34fb761b67e2a711ceb4a82557371ed32ca8db2e4cd7fea0b6bd026177" + - "4057b9abc45dae6869cab1097459473a389a80a4523e5de696554f8b0bec" + - "0ca605e6acfaa00386fb5a48e0f5893860a29f35e680be979cf3bf81ee7e" + - "ed88262dc80af042b8cfe6359cf8b475560bb704728034e2bd67e590bd76" + - "1632e516e3292b564c7265d7a6dc15c75ba6f6a447b1c98c25315ac7de59" + - "9edc4993e4dc7d1dbfcea7e50ebd0b226e096500216c42de3abe352e5b09" + - "a3c9754aa35d00883906599c90a80284d172a90abbeaf7e156fe2166ada1" + - "794420fe55b1a166d752d0eb7f04e822d021c615e84777101e7c9f9dd12e" + - "565b7d093fe978f85e6142c1ca26798b45f4b8d23ecff6be836e810e314f" + - "ebd2ea66f2ac95bad84b39b7a6bac41448f237b45e9ec579235ba2bf5fa1" + - "f00286379ec107c743f06ae0d11b57a2f5b32e3bc5f1697aae812d7ca303" + - "b196a8a43259257f7697bae67adc7f121be561b2d0725982532ffc06cb22" + - "839d9066dce0e4d683d9348899089f6732de62751ca77f1c439e43054468" + - "2c531b9c61977bc221b66030f7571dfb3ddfb91d9838529dbc99612f650a" + - "d72bb78de061192068941a81d6ac341101aeb745b61bd7a87a35a2714d50" + - "c3eb2c3ea148fb9ebed948307f8b491aec277ac01903ba36e6ad54f89fe4" + - "280a17f8e7ae639e75aec16d56576f03c2a1efe4af995eb825ccaa6efe0f" + - "d6d878299a351591d791c286cac5cb049834580d47a9bb7720d0603e3141" + - "ad7c1ec2dd23d3002e15d73c1828a7f08062848b1b6fcf816bd954743547" + - "6f0d6f882125bd03095eb1b1a846d535730e258fc279f7095de7c2d3fcca" + - "a4640a2e2d5ce0974c1e073c60bb78171c1c88ae62c7213a95d36ea9ab17" + - "59093813b85d17ff106e69100bd739ede9656388bf47cc52730766a8a186" + - "9dcc623e09e43cfba1f83ae1d9f16789064ec73504c29686760ea02c6634" + - "a929ca10c6d334b1751494c6d143671ce8e1e7dcc9bcda25af895a193032" + - "ce27c1016ccc4d85507fd2265ebf280d3419f54f66ba2a161c068491578f" + - "be056f02f97be745db443e25ed2647c5348f278f4ad8bf5b2a2c2d56e795" + - "532e25585984a3a94f435ef2742a0413abed7230ff2e9724187c91f73a7a" + - "726ebf36bc8d0d959418dd586452664990889358c56720c1001c004ff768" + - "54b9850890ce1b31735fd9f4a3640622ef0b25c659e8a937daa0df7a21f1" + - "77be13dfdb8f729da1f48e39a05f592d8c98da416b022fd8edab8e6132eb" + - "a80c00501f5cc1e0243b6b096c8dbe7f8c6ffa2f8bcc7f309fb80b489b92" + - "c4878fabad42d91876e10ee64ccd415124461cdc7d86c7bb6bcd9133f3c0" + - "dfa8f629ddb43ab914c0ac5ecddf4398052229876fd838b9ae72523946cb" + - "bba0906a6b3ef26672c78cb24cbf691a5ec869d9fc912009d840772b7da0" + - "c7f47856037c7608705cd533918c207a744f75fdfac618a6981778e09332" + - "5c7d22170da85bdc61044b4c397919d601a30746cefefa798c58f02cb827" + - "0d130c813cbeb67b77fe67da37a1b04bf3f1e9ee95b104939220fb8a0394" + - "86ab8954b2a1468016f546406d1946d531966eadce8af3e02a1f59043ff6" + - "e1efc237dbf4dfd482c876531d131c9b120af8b8fd9662cef1a47a32da40" + - "da96c57dc4efad707a4e86d0b84262d850b451bda48e630c482ef7ede5bd" + - "c55147f69e2ff8d49262d9fe66368d1e38ecdb5c1d4e4042effff0670e69" + - "04e47d7d3047a971d65372126ff5d0426d82b12b253bb4b55005e7a22de5" + - "6fa54f1dfcce30b1e4b4f12b1e3c0de27cea30ce79b08c8c1aceb1ffa285" + - "c317d203a9f2e01d542874fc8035b7670f3648eec79561d6ff2fc20d114f" + - "ba4fbed462f1cd975ee78763c41663849b44cb2827ee875e500b445193e1" + - "4556bcccfaba833bb4ea331d24a6a3bd8ec09906c7b75598b44ce1820a49" + - "fca4a0c1501e6c67515d4fa7f88f6aa3cd7fbc6802131a7b14b219e154db" + - "9ed241133e10ace40e4d963f904dd9f3bdaaade99f19de1ddfe8af2b3cc4" + - "0a48374dd8eb559782bea5410f8f9a1cd128523c0157b6baad9ea331c273" + - "311492fa65c032d0d3b513d23b13b86201840d51759021e4133f873f2781" + - "8f54f34ba73b4f33107d49c8de1533856ec37bb440f3c67d42148765610c" + - "3296bce932c839fd866bec3762a38406ac2b39d0d93730d0c88cb8f765dc" + - "d8ee71263fc96068b538da06fc49e25dbeaa10a5111a9af8e8f8d78e6ed1" + - "3752ad021d9f2c6b5ff18a859fee9651d23a7237bd5a5c29029db3882c47" + - "0470de59fd19fb3bfbd25d116f2f13ef5c534bf3a84284ae03e3cf9cf01d" + - "9e984af9a2e63de54e030857b1a071267cc33d22843b28b64b66e4e02803" + - "c6ab5635291aefa69cfeb3958c09d0b37176842b902da26caae3f0d305e7" + - "c6ab550414e862e1d13d9bb9dc6122cb90ddb1a7bc6d31c55f146659baa9" + - "6cca4ea283e5e1639967889543ecb6849e355b6c0227572097221dd46c1d" + - "f8600b230e9644ba611ba45cd83fa4ac7df647b3be57387b6db12682018a" + - "de9be50a8ea7d5f7c743bf0c6382964bb385b3c207c0cdd63279c16130b3" + - "73ba974125291673344b35c8ef9a33be5a8a394e28dc1448f54d46af675a" + - "edc88ce85a11ad7e50058df4f3f2364abd243683d58a2b13fcb0dc0eed21" + - "380b666eb87f4be75e7f2842bae916c15af3e9658c55408537b2301faa6e" + - "42af4d94e3eda6a41d6d302be281e2a9299e9d0fb1f20cf4ca978e66bdd7" + - "4c8bea0f15c84d6513cdea787dacbd4bb529ed03528284cb12f6ecd841d3" + - "c58c3a57c6bc19b65d6d10692f4e1ad63b091137c8acacc6bc1496953f81" + - "2972bf6362cf883bb75a2d10614029596bf9f35e92addbb50315b30161b7" + - "de8867a1393d9583887a292cadceb54078c9c846ec30882e6ff987494060" + - "721d3c761940b91a126e8d1e0118617bdae01a7f9c1aa96bdd6c78ca06f2" + - "6c8d85664a8705334f4997c724ef98fe265985593d5a9c30798714e6de1e" + - "bd04b648be47a6b5d986a3103e738a5cd114b19b7ba99d2e2eec6181bf3d" + - "ff0fec8c54ae6118be8702c3e775d493a6fafb509712a43ee66c3f4b75b0" + - "194c88937cffa5fa17b284d2556f2b0eebf876e05f92c065515198bd5e83" + - "00d0db432cb256a4a0f9963a05694ffce3ecbd182209e0b7bb50120f6be4" + - "eeb9d268b17790ee14a2c887dc5753e0086630b3123734053aa37595aa8f" + - "31968ddae4991af4ab970c1e3cfa1146a2efd9dc42abd6af14777b8a0455" + - "3865691cbac4b4417b3fa13c154d581b498f3b8cb77adf0e42dc2f2fb521" + - "732447de97271e542c6cf8cad3ba0148cc3ba1f2983ead836a25a2c022d0" + - "43ba18fcd009d518d07b53344a5bc4d626b3b38405a114471f75dc70e015" + - "d11e8f6f57d087fa72909785573008b1", - }, - { - key: "1793bfda9c8666f0839b4b983776735a927bdaa3da99b13c9f3d1cc57d4d6b03", - tag: "bc89cfec34ab2f4f2d5308b8c1a5e70a", - in: "a09f661aa125471417d88912f0a4a14115df9a3a19c1de184878291acb0e" + - "89ee1f9d8213f62df442f8969a9a5a7c402fea09bdbe236fb832544e1f93" + - "9cdd4873802b2bb8fc35ba06b7ff96da6dc7efddfeeda84116bc525a7fc5" + - "2d84d2e63cbac00b122dc64f2d15b36595259d81a1d2a09f204c54072751" + - "dd812259df1104bb2d2ee58baee917c5d0aa2649c8a1503114501e6ed6fe" + - "239847d3d88dccd63d5f842426b600079c6bf06e80a2813b2208181163b8" + - "61dca07fa4d88254e84dac1c78c38397a016b5ad55a6b58878f99036db56" + - "89871ab3c321f6ed5895f218f8fd976c348b3f1269fcdf4d38c9492b4721" + - "6c45f499f5705830b33114d721f9731acf6c69fca681b74c2d82c92e145b" + - "7bab77110821d3a12cc818d7595a5c60c4b5e5219376c38a4dd52d435d41" + - "562802ff65ba2bba5c331c333d5adf194d29b2cd9ebb55927bb4ec17681a" + - "3f5574ad34fb4e964f2c756f6dbbb7a6876a21579a515263444de7a30a33" + - "15005458bc137ccfdff18a3892fc9f58f1de10d4de20bbcf860f5f036d8e" + - "8a188f18e5cf7ea3cd260710e7491befcb131d49a28dfb1ef688fd021a1e" + - "e4420d32fbfb03b47f5e85c37d91e49a1b0db85d966eb5434c4197433eb4" + - "9d56f2ff999c9a72230447032dc949202468261b48b6ac212e3f651d6c63" + - "03a06c90bb2d3a755ed91ba73bcdc28e1c5b0936e51e0a9f69c3ebabd3db" + - "add7abab6d8f6a44daeb3126429a01815f57444fb7022a4a510f8b564ae2" + - "dd9779b3a273fef15859a33e233724846c30d89fb78a595b6ff6c834812c" + - "00a991e405806aafd0c26a788895ad00a5e43c5426197aa8247207077548" + - "ee67db4cd6f878431a2e36e952d84b5fb89d681f553198e2c066310ea6ac" + - "3a31f5b1792620616f6c41d486fb844eeacc7fd36971abf416e8d6d50985" + - "c83cc92ea46ac37da8f0026aba30c945d8bb15080d2d95e4081bad626199" + - "3f95f57ed3252822a7caa035ae22a36c35e280cbbc82d729346cacdb1794" + - "ae9a9bb2793fd1d5c47121b135c2836063367339c5151b4e35278e97f62a" + - "fdd2f231d4b47812d083a829ebb9c374ff2ae8479cc4b76d55f9cef3ec6c" + - "4894f53e8caaeb0d8cd072960cedaf758e48e3640590d4f728626e0a08ee" + - "ebf719c96bf8ed4d0c283be09c0ae67b609e22d3b9aa6b03642854909de0" + - "5ed52b39673867bf586a632ab8072de15c637cc212cba8387515c9c9c433" + - "abd7ba6b02abd09da06a34694ad34f88515b65c0c9c247fdf9819fb05a1a" + - "ea4728c1182f8a08a64b7581cd0fb2131265edcb3d4874b009aede0e87ed" + - "463a2e4392aefd55e008eb7ba931788262f56e53193122a3555d4c08133b" + - "66020154b15643fa7f4f5e9f17621d350ede3dc70be02c59e40fea74dbbd" + - "7919d1a8d4e22ef07c916fa65e7d4b89fb11a7c24ddc4ca5f43344c753b6" + - "1331c3fa4558738ba7832b5b2a275bc9b7989b6e6888865793329806cd3b" + - "f0ba57c941d4428623e062f4ac05e7cd79ad5446f8838f2b247b66bddadf" + - "540845a1bb304a04b7edbbff579c8d37e2f6718f8690abd5231822c7e565" + - "69365ce532449a41ae963ec23a2a75e88307dc6b59cbb3fab913e43ed74d" + - "841ca9f6e4ef96dfd9f04e29e89361aece439c0b2e1943b30410a63d495c" + - "522ac3ec1b04ec4cb345f7f86969957ad750e5bd7dbf1d6a22eed02f70b8" + - "1cb5b2b020c0694d7f63044f9de0c3de1ede52009c858992d01ebb92ff19" + - "a9e0fbea18942fbafb77746c8e9e687dd58ccc569e767528bde43b62c7c1" + - "270a5721f1212de2b29a7aae2d6ba6cd173d7fbc78aec4356ce2e8ba9164" + - "d97dec061dd0c3a0e3c520a7611ac99739049dd5825537c70b7ef660046c" + - "1785546cd99aa400da848eb7c3c91247415c8e245d0f14c30d482c5849ae" + - "aaeab2568288229b08267818dae8f76fc674c684c99eb5faf88a0783813d" + - "f7298e0b50cb233f78471e5ca9cc3b04927c26a3871cf253798cc49aa717" + - "d8f18a1ddcbdc26497d188f15f86ec494dcf8f942c3e07e572385c6fa0ef" + - "40c0b625f1737543074a747a369482a0b342a08b3eccac9f9209be31aefe" + - "5a7794974f71ac0bc9a58026397ea3dd4f5e40511d58d2a3b45925c194ef" + - "13987037d736dd48b509d003a86471d5f161e0e5dd168b4f1ce32f703b89" + - "15004d8dfc708a5bb02b2e6fb67424b2cbcb31ddaa0114c4016b0917382d" + - "aad11815ff5b6e37d5af48daa5ef67cee3439283712bc51b5adf2356cb2a" + - "5181b8941fd78945c7c9d61497683e44fee456ad345e12b4258f15945d45" + - "b6ca4369ee792d849112d583fdb39cd4d333ee057355f0abc8d1eea4640c" + - "128cc1617982db0394233dbd416102eec1874081247d2982bbf9fed1b1b3" + - "8f4da923d68c8975c698f189a4d7840fd7aca9dceb7d91c076f85e1c546f" + - "4d5de4f60c91348455aaea30cac134c844dad93d583c139dd52b3be6346c" + - "4d2e6864125c5a2d0aed8f67930e1ebf8700ca88aacc914ea76ff17148f0" + - "777738cc126e75a2c81110faf02fefc47c91edbab7814599000ce55fe20e" + - "f313566e9b62457acf2f22e1141e220bd9d4747417d03e703d4e39282803" + - "386327fc65dd597f723ee28185c78d9195fc70a75706c36287ab9c6e00e8" + - "5cecbbd6043c6af8d30df6cdd8777be0686853b7c8a55a5b1e03e4431d39" + - "1725ff99875a85cae6926998723b36d13ad458220712209bfc5e8d2ca5d4" + - "4ea044d5ba846b4035e7ac7e9885f55d3f85c0c1b3d09fe929a74450f5d2" + - "9c9672e42d3f59be4ca9d864a4322cc454c2578493bd498a51bbe960e657" + - "3e5dd02c4a3a386d4f29e4578a39e9184024cd28d0e86ecac893b8e271bf" + - "ce3f944d130817378c74d471bd20a4086f2429ed66c5c99969fd8da358ff" + - "5c3be72bf356ae49a385aa0a631b588ddb63628fd162673e915cfc4de56e" + - "ae6ff7101df3b33125c9bab95928f6e61c60039b6cc07a66f9c733251447" + - "ef9c1ffefa2158a8ddf89dc08686a4cf9b86ea09914e79842d72a3236afc" + - "98a3afa0a1cac5590ab6a923e35a2ab8db6410a9d33cb84d1c48a054377e" + - "549774b25f50fbb343ecd5db095155cce9fb0c77d09752f62d4bbf16a770" + - "30452a75f6bdf73f7807d8f3a6bae16ad06b22175fee60549c22548de9c1" + - "3df35ef4e7bf7b66491a62b93c2c3fb0c5edc51f60f5704b56af30f1079d" + - "7c385b99f958ef8209e030e381d1ee8d67d3cb84f32e030e8ea2c1d0c77f" + - "d6b242a9f48707557c8682a08e1127f51221a55c733ab1edd00a9c2912cb" + - "36dde85f73b524e1a4f4da6414c5e4c18d9537722b2becc8a91bcc63f2b0" + - "9f32409c53c2beee0de6726dabcd6bf33118a5c23fb9c5c1810476efe658" + - "4bb6109c516b45e16b2f79f96755680374d82b91f2c519639a1815fd485b" + - "a3c00b46fbefeafcf25554ec5a6a5ae2da07c85b8a0f9fcde50263d9ed85" + - "038b2f7aadb9de765655bd201235218bfc74bcad6a9ddf4506167a649afa" + - "df400b85752d68a92b7a97f26b334dd77fce824862046b286a7c8e0adc36" + - "f713a252a673d4d995b268badf4bec8b8eefe85c25b823b6728582d35c4a" + - "60041114dab72b0623b99e2758f6a1e97365279bfba0eb1fc8952ca4f2c6" + - "fbffd9f5fd7dcad1125b18a796981b5ead0b6431141315898ace96f0d38f" + - "865698df8822ca7b65644b6b1f0a0f0d2e5850d4c93ec48ca3eba1b919e2" + - "4413a46d595ffa427715e499db3b7b9ab53c64abec7302bc737a5bd124bc" + - "da756abbca132f7f67e6989e09bfb23b497da31bf156bb9c69ae54588df1" + - "7420e8fe989f0472c8893b2bfe57cdae265a8cc7aeb39624167a567a6fbe" + - "bb1aa30c3dcfd14f2808a070994085e6e1fa79021e77c399f90ab1f995a7" + - "baff672cb693bd39b798b4c890b7d0a57978d6b9bcdc5bf3f4d205f8f24b" + - "2b43d3ae300a96971c9182be297618b9adceebedba1ab0f324b01d23d7e6" + - "35f009db3dbbc643c2d787567594bc639bfd78c4f3e6d948caf06f013423" + - "eb3c764666b58f886d5d28137c053c2a28535efcea400147e92ac6753574" + - "3b47f9cb48852abed1d057647d5b1c6f334eab1a813401fccd3dae332738" + - "776bb223e359f3c459b5c573ba64fa945bdd66c5ac0fcbd53b67032a7b80" + - "25f551e8d1fd2a4291bdb7941cbabe3a09765dc263e2bbb6db7077cc8fe6" + - "790d4bed5e36bd976d1e37dfdba36aafcdaa10c5f3ed51ba973379bcb8fd" + - "203d8b7282abbd271ecf947e54486e8653b7712c9df996a8ad035f41f29c" + - "ab81509f922c67dacb03f25f8f120cb1365ab3c1c286849c2722448ba9bc" + - "ff42a6b8a7a52f2c79b2bfcbdd22ef8a5651c18879a9575dac35f57d8107" + - "d6bece37b15d7dfff480c01f4461ef11f22228792accda4f7936d29d4c56" + - "cbba103b6d3e6db86e39e5f1bb9e9fd955df65b8a6e44a148620f02b5b90" + - "b2be9e5bb526d0ec75b1e723e94da933a356d7ca42d0ce8349699f730b8e" + - "59bac24a6b633759c88041d29399ce60a2ca2261c7eec1acb9a56e0e65bd" + - "e37653ce2cf7eb83a4d019c755bdc5d685b6394ecddb9006823182dd8138" + - "a1bf79a32d07a8e5e8ab221995c714e571b40bb255b79e328ab883542c16" + - "4899fffa16eb3296f310e302512352a864fd809beaab4169113027c6ccca" + - "99a92c6ce35c30f9449a3add70f10db1ed08078e8e6cbaafef630aab7e9f" + - "c8adb09c18e33fe1af3620d1e4d069ac11325e23cc18e5519a1ed249caf8" + - "ddba871c701f1287cc160019766988f63e089bd9bf1af7e6f5b9002e3b6c" + - "264d69a8bac16914ab55c418d3a8e974677cdcbea36c912e90386a839a37" + - "77b878e680c07c7cc99f42a7dd71924babf7fb0627d1f2cc60d9d390d1e1" + - "50d47386be6eefec9ddbb83b28fa7e2fd28cc3867cbe42d13b00545af8a0" + - "48cc07016ec79808b180e0b258c564739185da754f2e", - }, - { - key: "0d41cb4ac25217feb20e86fc2490e8d2ea2e8225c051252a9395cc4f56e1ae5a", - tag: "42df9f9a59d6dc05c98fd9e9577f7176", - in: "01caba7a19cdb09dc0ec6c522c61c628eacf17ef15485aa5710fed723875" + - "2e4e8e93dd4bbc414e4c5620bab596876dfbea33987e568ddabf7814b318" + - "8210a5f8d70041351e4d8410840642a29cc8d901c25fa67cc8f9664ea5e1" + - "9e433eaff7c722d0258ae112b7aca47120aa8af4420d4412a10732551db2" + - "cd3e0af6e5855d5eea61035af15a4d0d898d04033809e995706eba750a7c" + - "ac07aaa0dc71477d3020f778d0347f1a8e37c18540deb9ae967e734c0264" + - "df0e1f52b0b5334805579ea744c8784c3ae0c3ff8217cd3f53cb747f6996" + - "f3d2147699799e649061b205f97f7992e147fb20f21ff862c6c512e95534" + - "f03075e8e52f162e0d70d7a259e3618474427f400f44f75198edebae6e40" + - "a2173257d114e1bb5a13cf419c821eb124d90e89a938d91f4d2e70dfd1ab" + - "60446f1b602614930a329e98a0c30f107d342281db25b8f8259933e14d20" + - "8bbd991e42969e8b0600272f9bd408483cddfc4cb8dfe7bc19be1989c7fa" + - "129d38e1078d094b82e0a845040ddd69f220dc4aa2b236c44101d7da7779" + - "9827a7b037561b51e50fa033a045571c7267af93b96192df3bf6180c9a30" + - "7e8c8f2b1d6b9391767369625015da02730ad6070df4595eb8099bd8e484" + - "59214310cb62c3a91a4fa8ac3b3d7b2017d4254fb465f0a248e1bf45819b" + - "4f0360f37c9a79d405e2bb72e5c25a1b4df192cfd524d61e1e8b274f2fe0" + - "634c73f0653c7c9e9062c9d081f22a8b0327897eed7c6e870f2815bbac8f" + - "585c1bd868759a98dcb5c3db2f6c53244b9cc494a56f28a9ba673167cea8" + - "b799f37049ee7b0772972b3a6603f0b80eddb58ef03f916106814d72f000" + - "250b3573c97c5c105910d79b2f85ad9d56002a76a1f43d9d1c244ef56d3e" + - "032a9bab95fe3bd5dd830ad7d7e341f28b58c0440658f7fc2ca98f157708" + - "1c647e91432cb0739d9acdbf973ceb9b0047634d695279e8837b04dc5357" + - "f013fde3c55c9c53bf1d817ec59a1b18ed0ac0081ed9bbb3bcd1a5d3634f" + - "50f7506f79dc6a4ebfa640bf65682fe9aeca68088e276937669250064de1" + - "c19ad6d5c697f862114d0f81d2cc52be831ed20d3aab1e41fe6f476b5392" + - "af4799392464c51394c2d1a8325ee2e84f1635d295ee663490e538eb338c" + - "7126a8e731ad5c0becf144c7a9cae5c6493350b589385de29e1a0ad6716c" + - "346ec4f0a31ca5ea35c59ab6b099f65d7f0b3d00925a1da1b5777c029aea" + - "9679e895d7100645dc83f81d82a6174beab2357f7888ea640900cf3ee67a" + - "e0724a123919d78e70e05288f67e5e69ffa6f345be8a96e58bbe260184b5" + - "ec5c0c1354cfd516ebdb8d420029137d41b029641959cc07fa7b4e16b39d" + - "17f36b2367057410a42e0550e9ec1dcd2df4604d52d4f9dd1140d57af08d" + - "50e1527dad793b6d649324de799754f755818bf10e6d1ab614958dbb24ac" + - "8e2c01270a90ec3df4379c3f509b5ef721b0fd4f91a1bdb8127ae4dc74d0" + - "75f6cd8bb28319d6f8e8d8ff64fb4a42d646e9365156c6bc72cc46e9cd1c" + - "f9e735549e3df9a8e6b5fe541948b126190117db71fd1d61ad84be0f725f" + - "20b99eb141b240326d399976c4f2ce5823d94649a9580e1e8820bf49184d" + - "fc34378a60bea89b12aca69cb996c17847b7fb517cf2d51f16d78e3875ce" + - "aa33be15f6a154004f0e1134c6652c815c705efc34bcf35bd7743d28f0a2" + - "77d82dea4709dab41fbfb4e0cbc118c17aa00808872f0edc6437c357cd31" + - "74a02aee61890464e03e9458853189431bf5df6a0ad5d69951e24be7f266" + - "5bb3c904aa03f799fe7edc7bc6779d621cab7e520b5994f81505d0f01e55" + - "96e14b4c1efdf3e8aadee866c5337c1e50066b3acc039c84567b29b7d957" + - "683cadfb04fb35402acaba631e46ca83dbdd8adf28e377ec147e4d555a21" + - "e6d779d7c5a3078ab72702234d36ca65f68bd01221c9411f68f32e16ef04" + - "99a20c2d945fa31b79d9965853d38ada9d48eead9084d868c6bad974b0f4" + - "0956aa0fcbce6dac905858e46c4b62c0ee576b8db7d484a524e951f4c179" + - "decfc7d6f619e86dee808f246dd71c7e0b51d28bc958110d122fa2717148" + - "77823242711632f6e1c7c15248655ced8e451a107707cec8c84929beece4" + - "efe5503d3c1763d0ab7f139f043e26027d5e52a00d5414dd98a324a8fc2a" + - "06a1345cbde747f41099c3377b86bbdc5a17c8f6e5b773a761f78573832e" + - "4359b143810361dedc79142fffc49ddc0b32f225d50d360ceec3920fb0ba" + - "0693b644ee07fbd1ce829e223a02794b197614061c4bfa46112d105c2b7b" + - "4efea448501d146dece44f6640d674d5749db498b32969de6e165e705a18" + - "2aa1f3d8e16892b0120337640d52c9bee35e5b4b17f03eaeb31205c8ecbe" + - "1ae1b110023016e40ee87370a65c5c20bfb00f100d3c6c1de6e4a1c90162" + - "f25bddbf300ed637330206788a4ff96903f971c9618493ad074412af625c" + - "ff9e0f8f183bbd5e96c1f28307e6cae8b50cc0eb1a3a8154e44e9de947af" + - "002e4d1098d6b0ee3f2e71a10d03eb444729c42461283f37be8af2ce81ba" + - "bac246a05c2c94efacc43f0cf9ff3df38ab6fc1648c796ae7026ea95752e" + - "b70873a6da59da10d8b5316126431c4a17289466e95dc739c061d7a4b13a" + - "450809479eef421bddcdade77a6df133410328c754af8999a09b1a5c056b" + - "ecbb6fc2c339586ab92100f46d2fa1fa689994b36aa70703d76bf7738adc" + - "f0589fdfa6bd215339ad69ed983f62efce0add5a63fe7dfe4bfa006ff16e" + - "0cc06d39199ad60adcae12b75ca98d764502a783373da3a41281e03c2037" + - "e1b3ca7f7eb60e2b67427e97ec72d36670db7662c6daa505701fd279f116" + - "ac0ef569471f204e1531c25a4ac3ce19b6f68a8994b6f89b5abf034a6507" + - "32c7fad4206eb4eaa7cd9a710d866bf3c3f13c16faa268ae0cf4f69be909" + - "bb9b79aab80dd25101d4cc813a48d3f38d870f10ac0b6768005aa0e69e87" + - "dfc0424deef06414c9ba6f498c93c41c692a7a6221fb5595b390a32c70e0" + - "2cd64471c797ee8a143725849c1e054ee2043dcfc0b4cb1c00be21a14be9" + - "2d9a07f1b4e975d4c86b8a5c1387e6c42bf393e078fe86d24612d497e14b" + - "874485a3cc922b5b6d91295d7b79ab8bfa1c7f64b51e761d19bb9da82a5a" + - "a34aa469699036b6b2c55e2b84f84942f10585027ab07e2e0e562e0fc3dd" + - "36047850ded84be4416e22aa41c7a2f7d4a4d8e3dd420d746a1d8d56d87e" + - "5133a1b4380bd9a89500fd6d7e68a1ec02eb9e79e4a13edfdde1273466e4" + - "6b0e6a75f59ff6175716629da52463ad21de27f40fa2e25a566eec4b2696" + - "4af3a717dfb0170a73144c0bd9b00bed67ad8c0a146eb5a055812d071209" + - "c9d530cd4f50a41488c2238898dea8bb36b0f1496d3ea8c4ff8e263b367f" + - "64977679e697d88e5295bd97ac16a0420850d1ead9621e25a3f58925c266" + - "ef5246488b1c15a8fe0d8ec4291864faa5a67b2388b7786f47b6d27e8fe8" + - "46f85f85163e54155ef95cea4901e712a44404a4d3f27f28dd961ce36b84" + - "f3856770f07f20a2ebd34d77405beab04ddfc09770167d7d6340f494dc6b" + - "7e4c3df896bd974730193b1e862b58d4a5938e6e4ae8897dba8812924379" + - "e54f51a71364d39f76e24fdf2c6c704479ce85b456558ca6947b8fd76f03" + - "78273f0a7bcd1d860ef1defe4eea8fdb81c73eda028d82fdcb2248582ac4" + - "59eb7698a811e6c5823be886410f6b8577ff2e8252343b6ea890016ae846" + - "01c5894cfb988121059fd9c8fbc1596da470a149404fc67baa15383d38cb" + - "d17ac107b4ff3c1ca4c76b7930de02b240e7547d39f4978e0cc1fa37f8c1" + - "012b677f07bb4df4486196e9b0beb823a3827585475b878e3f6f0a2d3836" + - "2c7d34f9f3c91ed46c39cec95c2a0b6f0279a03a00ed5035b0725c393849" + - "cdb1ed3c0ecbcf3c2ce108017f468e1c3d469c03e8231d4195344ced70cf" + - "daa667252cc1554dce8d0c54eb4cf4da62367d77d7dcc02f81e788ce9f8d" + - "d306ba1b48192359cfe92bdbea9980f87ea0677d7d2082205a436cf514e6" + - "fde5eadd21b13dc836ce33b5dfb6118bcac79ae00fbb16d61f00a923b145" + - "f9caa9f3a2c7f0104f8b052e390987e57c8dc80cd5f0358afb0111af1fc4" + - "e31f92bd832ad35fd2e0bdf768272de52ce0b152f74d43a8973ad516b3ea" + - "f5937ec8a236ebc86adeba610de0cf7168453111f3c983b64df07678cae0" + - "a75466ae15adfb127328e716448cdbd2c1b73424cc29d93df11a765441e0" + - "0eeed72228e1099bd20569d9d0e9e5a0b3c11d0002e2896631186483db61" + - "c1a0cb407951f9b1ea6d3ebc79b37afb5a7037e957985e4955979b91fb85" + - "61ca7d5e8b9cdd5b7ce0130a880d9241027b011fea7696b0c695d4949ca2" + - "d0cf22d44b9fee073ecaef66d4981e172e03ea71a6edc7144393bfea5071" + - "2afac137f091bae2f5700bfb073a6d57fddcba674a899d7349044a10aadb" + - "2e7f547887dd2f765f394de5dc9ef5dbf1eab4d869be8cb68aad8e2614ac" + - "37bbf21ccd5a832ee09fdd07ce50a580a2af36256b1046e646fe3dff6d20" + - "0c5110f1ad1311bc39b8114cd11ecdb87f94df43d4f6468932fc0ed892d0" + - "3d8f3db3f8323ebb29776ab7d260493a36700bcda668abd62126a8189e91" + - "df2d2970ef688d4e8172fc942e69ba63941a36b79ac546fff38f5f7d1176" + - "57612a662ea38134e1090c3e903c9adacdeefd3ac2a0467e9f5125058c19" + - "7b2260d2afad2b0e627a9ae52cd579ee27168065658089e1b83a2d8cdb47" + - "e08966e4ec0018e78c4d267f9575b8fea2a42de5c2d25356fe4b8c9cb1ac" + - "daf0d1af4bf58b9704cd4bc08471e3b9a0e45a5693433ede2eb1374bce44" + - "1f1811cdc7612d7bb61f4f34aea0a44757bbcc12a55c1ba41a7901eb004e" + - "689587a38e5b4df4574ddcc7b2eda97f6e480d7d39f45247ea3b03c90a93" + - "0dd168b65d52a59ce9c2cb4e860cc6aaa0ee02a58d0c8ba990194bce80fe" + - "8c34ba5693fb0943ec2cbfc919e534cc47c04f502b6c217c2f860d1d482a" + - "a016aa02adfc2bea3171fc4e27e2a262fd37b824099aa227fccca508f778" + - "b8c6ec7aaff1d15f6497753f439daa9e52060fd6e9e056e6843d770fb057" + - "6d9e2e782db4843c0c2c7f408a17376719a3c5cf9fa08f04f8a779885a16" + - "5cf93ce404be", - }, - { - key: "ddbd5d6c5ebd61fa72b453dd849dc302c98a0f3e300f4768bf1dc698a3827dd2", - tag: "af608b71a353e63c64911558baa122f3", - in: "c67e2524b0de16483158a0232078fadcf611e4fbdb9e642e397b21222423" + - "cc2ed42ed34ffcb178448919ee337eff9d7d691f622e70fd3317cfd271df" + - "fe6a9d9b7e07db0d20813e2331164a654386db2ab06ae2983bf2460eaaa6" + - "3aa0171fb87afb82e85b40d95c8993b2039d32e9d38473dd13f41fb1ff1e" + - "261752ab004b221a4472b9b1a0e139f0c999f826a26a7e7df362b0611aac" + - "fa83c55cca2f7c0138d2c30313c2f6eb357278328ea6ebd6a5077947e18a" + - "a97c34b9dde3b6f2de4b83778ffcebc8c9cb58756691d5e2a3d15a759a2e" + - "5050b6da937a6f5551aec069a08027d60dd870d175d2a5b5f0b4f3143904" + - "7445c368a5c866370e9426abbc1a1c5a272b96731c4128aedeee93e8e00b" + - "b450601a6d31ea279b9450e738b4a47c0dc22d2d8ed5d44257f6318e0c59" + - "b951fb6b57746062ab95cd73c23ef0a5c000a7d14c18bfff172e59b6f6de" + - "aa61b81009e803eb05e24fb0b706870e18889a9180ac16a042d12dfff9d9" + - "1b88130f045d2342fd5ddc5f443681c31090459f262d1a65654c55251fc7" + - "d5a67bd2e62940ccd606f3e50700e4d1e992a3fdf0388b9ce3df9de6dda1" + - "5c1cd6b70622ac062dcb7ed7058872c00ff3df94032853927126cf6fa4cd" + - "c468d91c9b52dcbc272fd7ba920dcd3ea1e048af9c3286dba74d988ce9ce" + - "77174e25a87935352721dc23b60a9549322fadbe6a00dd1197dfa25b33fd" + - "9e5713afcfd0fae6dbcf27147fa58d995580d7e0a903c895752fe9819f5b" + - "b002ed752719552d0f3575312f2e618173a8ae7c147ca64a709053e5d2e1" + - "2f4d1ea337afa9ac4f9ba62760046ec1e48f4ed8f6df66786c9fd9f5bc7f" + - "9ca2526e1327b042f4657c405757690e190c91f260dee2dd3d2e6616b721" + - "e489c7c3cb828478a3d953b88f09904e7927cdf6dbd6a5419eeeb83c0be2" + - "51934a80dfe61e09442f0761aa2d013e10aeec3a32df204571ce8984a430" + - "9bbe30ccc91977790bf0305d2651ee450b749c3e7761534e45970e70a0a8" + - "473cadbc88f096970c275f188c9d2644e237fd50c2e24c1eabbf7578e80e" + - "6500762ac513fcd68cf6f8bb7a9d9eedadca059d9ecec07fe6fe7792b468" + - "9311861728dd482f087c28374cf9c5ea20b2c8630029e8485fa6fe518c74" + - "ef77d44eb7526ca764e50b5f34ed0f253a91fb2af6e59338e2af6e041e01" + - "084e1efade1aebb7d1b698ccdb8b4248ac89cd40d9517d840960c08f5e86" + - "88d8ba2b54889c1870d315498b70e0e9720f2c8c53a3377a8c0bd2d6a1c6" + - "f17c6ff847eb14def6855dc3886b99039e528b421ccbf6064e39263f8f3d" + - "340d5d20b1b14c264ac2310b5f3a0c6f0c1006d0d4f1a69af68d28ab447f" + - "cd17387e1fc98f164982a6d05dd32d6b4f0f1b04e40c6c6e0fb4467dd6b1" + - "0c5a9c92cc8c2bc97ef669b6d55cdd0aa8a15c46af954359165949012713" + - "4ea9f74181d54a300d3172c9f01db73288ef6a709c763a4891666d0baf88" + - "8531dcc77f0911412d096aef9033fa36b5c1ed283b8b5c109e45b5cde911" + - "6f3da2533fa0ab81929bd5783271d5501a9e4fce2aff9eb5a70a4215b253" + - "46885d7e4225fe34bb55b309a114a312693d60ccc61267359a8c2dd28141" + - "226e7cfd99f0f12c69df57d75dd790dbabfe3145f7fd1a24fa58e03bc2e2" + - "6ea19288af4929e5acc517d8f52a074745ff4644d94179eae6ba7d267292" + - "bbd2053167a0da9be5e4b6cd0a4200fcac5182d9957dffbefa857e662b82" + - "fc3a7cc32506e78030ed5c5d448d7f1b4fd854a735a0c50016bb85e6e716" + - "0f87527bca0de235f4b7dacb75be84919c15a5b8cf6bec035795cb67061b" + - "7855c2134c1b1bfa6affe04b7db239f73af6ea9c02bc9f7972b7f6400b6b" + - "838f4653aefc42179c21765e3ca7a5e96b4402ff544d4bc2332756a23500" + - "11241dc42ec6848afe127c00b9c333e69bb5a54ea5c7193e59ea22bd6d32" + - "af4f56b1bd2d5982ef7d9c1b02d7668525e4e81b68a400f7afc2653f0f41" + - "a03e11c7a02bd094830093481afbab96397245b9f37a568ea1c4ae248cdf" + - "afc87f88b1fb5dc300d8e9039af4e6e701b458ed3f32d693f2e869b76bb5" + - "1358cbbe5b5089013bf452734388a176cccfc1ae9b7cff603631ca48e129" + - "b5c9573d4e379547272cce8aeeeb407d3fc57f782a0eb5fcbd41e6fb13be" + - "7e4f1067cd407b42a6121b2969c384916ba2b32563e659f52aae09c8ce2e" + - "3c500fbb7e58be74cc1592dcfacd9f0d4cea1a90a18658147c81cccf6fb3" + - "078ed27f369e7646f551386a74e1b07074d93e0c1f298c761af46cdaae9f" + - "f4be86808b66d0e228016d27a3a77c843365cb847fddccb0bbcfb3b9008a" + - "1bacac59ffb0aa759a0568c72c556caf0ac1091431b574687c5fc7bd486e" + - "963e0fc3bdc828d988734a21070747c955cf8dba2df1c3a0ba8146cd58b5" + - "91b6d54712db67a9851b1607c8445bc97406eeb7488f5f85e547850d619c" + - "407f97632ca1801f52c09c2b314b4ab0f8e7fb5851fd60852f4666913ca6" + - "bc840c1ec8f8f06caefdbfbf02ce00f20b87b14ba9e651c80f40a31d0306" + - "403f541776075fbf23733a6b19e3b44d04b455b29ef8effa70cce0c59331" + - "7119abc07aa8c8d0246a760b0b36a3d87b244e83bae8a745b8277a531298" + - "f5d0283498a509c89898ddf0f7a7455be1f8a6889c46d323f1dd18c3babe" + - "1751a05f871f0639f50967afa46c19cb93d9c2a79c81e2436a7a62f225bc" + - "37c90698640f5b43673e1dc276de05ff1e29acdb4ace5121659db5f23c49" + - "57aae22f53e6f2cc935824fbd07c2ac87672eeeab895c3f06e09e178560e" + - "2fcfa7097f10201dfb8b1ebac08ca806c1b3ba3aff9284846a1a3beada53" + - "e9f7ade12eb89b5591f462b2543bb4090e081fee9fb53bbf821dc92d6b16" + - "fe820ab2ee4b1f6c0b6a6f19edb0bf6479e257fc73bcd60dc2261d0a4752" + - "e23a0be18abf355f3065177d8c3c14e21edc178d0abd1b39f703e6335131" + - "ec90cba3d9846cee7354a06c320a3f61b8a269abc7138831614f57ca6c19" + - "a4a621142889cd924bf4ffb82b57f871b854f3157e8874c22d43a5726900" + - "bafbb8f2260a1eba3a462e23d4def2ccf68ebaae8e52739a1ce67c039eaf" + - "9a6c3232fbb5a91d1e59a8dcd3798ba71345fbf83d09b83b41cc49d5ff5f" + - "2e809d2b1d5fbc1e7001ea76b9b2d8f896eb6609e2e1c5c562d2a6e74960" + - "2d67a0f6b43a201d5087509b8dc7b0440144e308c18ff8b96b607de2f20c" + - "6ee99bb05367a8b25947011889f724965a2b5c52c9db1e0622df9343c548" + - "d054699badeb15fc41055af0d79a2bfc1a5b4574634fa0dd9dd10a6213ed" + - "b6991187dc560facdc27440456a0a209fd7f5ee4fb350ae71f869723e5eb" + - "5338e3d1448bc993afca6957f4cc7b047a2c7c9593b7234725e66cc0eb23" + - "3824eb4cb905701cc522ec210950b871397c6c0bb3d0b839f2eb1a120f70" + - "36107246df4dfb2c24891bef0bd1dc131f2c9d7c295ee967e3184d963037" + - "fcc9e0b8c7011c8e04b4e70038150d34caab4f8c0230418cd2d8a91146e4" + - "4e11cf6707452ddc03d9b4e6380658135dfb48f62c0690ebad75167f4dd1" + - "c0df3ed555b5081a7b82616d9e501757c83c2193d0f640236d59f9c97a4a" + - "5c8bf532aea2cf5964ed2dbd8a70c01ca5c7677224cf2a37f3b24d8fe4ba" + - "91cd3b5033715de227de51deed15afb8eda9d2b9615d197b8f98322d7096" + - "79c5131eed48050fbe0145a9284e236605c25a4876e2adba42f4e35a8949" + - "3d59bbf44b3338d9d2e65a7d7ec6c863cd47cae9e23181b07298078a5e9b" + - "06a5c7e1059f474eb1a4247e8f02cdd4efdca67d22035b12abecf9b15982" + - "de4932a28e797bc4de38442cff2cba263eeddba0ab14fc706dbca04eaca1" + - "b4cc13000a10e35b32461424809b299798e4d8e66c92aa3181c5df16ab65" + - "9611cb625e895a8021af8c60960227d6f2ebeacb17b13536a5ff139734ef" + - "37cb67018ef9a410b856e6f6eddbe3f59b088d538c50a8f3f0912d06e47b" + - "88d773069aa759cc614e1f53cf6e572c127123d1ab56b79ee753a921cb22" + - "a60e4e6cae768c9966de4e2625484f2e990154da7fca84b6e6c0b59201e7" + - "fb8a729cb20b4c774381e84f1bd6e304543d952dc76ef741b72f3a4ca7a6" + - "ea7958b8b6337994ed82dcf988eb70f509610b9a279ab4d0f28cc2b2dd99" + - "3b8637a6be0cb4b5f67c79654c6b15e1b61120374ba9b974a628c547f11e" + - "52d72d39f8f9c5dbfc23a89f22d38984dd8d5c3ca72cd54e6adfe2b3d163" + - "86afdb50967846a4c311351a51e5fd322757bdb061d44c8796a61fa4db36" + - "793bc11984eac83bbcefb40d0bc7bab0ca81e7df3a7f58c6fe800396716d" + - "832acaddff6d72c8e19dc9ea838294ead800deadb6bc18d3e399fa76c46c" + - "5d88ee72a86a87399423b0578eb6e27d78156ea2abf6f08b5cbf747f2f74" + - "5301b694bfba84bfe3c5527acd50660eea5105a2644c1aa92f954a604fb6" + - "a1b3b2d0331497deafc3aaadc7040b9188a36cf607ee85a0655ae963fd32" + - "91dd58f8bb50b4e46dcf7c2957639bffa6b12d895660dc0323b7a092f999" + - "813380b820e1873c60d3e3038129c66d507862100a5d5842150869e7873d" + - "6bb6ad022350ffa3813aca26c80ccae72692bed9c77c9d4da23178c57153" + - "90b5f4505240a796ec9d10a7f280bd60a570b1b693453807707651fc0464" + - "03e4768965a6f42f112152942134f0a38c84137c7a6e086ef1ab9ad20d24" + - "3b93356b305c0996ab7d02c02c44cbaf8f7e60b8c0b8c9fece3f189b099d" + - "dbd126b7357c1c4ea1c8bc1ad93db91ea9bf043a4320acb60b502bec37b8" + - "6b2a5004b8225e549e613c6f83b97b7e4aeda1b013e0a442d7ce2f14e78e" + - "a94bab700c9ac0abba945e28f39fdadff223c4498cb204f01ddfcb450a41" + - "f32ae47f99a49114c6646a5cb103e9cd75f9d81dba417e48c4053e3b0295" + - "2267cd30589b0f5d993a5485a6ead1ffab9f2f4294c5853ba76383a326a6" + - "a42fb8b78948aa49f0f1f614bd0a3fbd2a58a3197daf2094605bd838285a" + - "1260f1265dca74aadd95652632335fd17cafcb73b202c3f0e5da836c2dcf" + - "2934f005935dca80154af43fa34c8ba440d1581b74ff17dfaca369dc9aa6" + - "734c03916d78e1b952691cef918fe033d33f7f4323cf724ffb8cd6c219bd" + - "046e9f268eb0601098e93daa59dde370e46269dd7c54891f71bee2829a53" + - "df86a2c7fb1046cd7c98fa21cd83597be554997a70acebe0b6e60f1f7098" + - "6f65adcae24385cb7102bdd3e01300ffd15d00f9764b3a5c51e35e5c9cdd" + - "da84f4b656fe514ec4ff8dcd774373f8a9103cf36abefe875f7084b9bbd9" + - "42e0c997ec2d860a4b622ff1a39a628582fd81f237d3d8f6843d26ac77cf" + - "bd48003e8e8c591ff813a9a897e3149ff0297ff476299d717e54d885cdd4" + - "4c3ba6ebf54bc7a1", - }, - { - key: "b15578da1020f662ada0ad4f33a180d9f8ad4991b3720bc42a22b52625c7414a", - tag: "b0e4ad4a010afd6dd41ed82868cda555", - in: "6d2afb7a9154064341bdbb533f11990d4987e7c90fbfc0167c1e58d6efff" + - "6010f7ed569dac62ad37183b0d384519ebed0bf9c6e05a070b4858e6b846" + - "547ab5e45619c866f83cce83dcdab6a8a6c36b115ac832de1c6d433b94fa" + - "35803fa1a36f1ee114f8632402a027a74ac110394f32ec4006beb0057f09" + - "a94dada8bd0d1ca9a14b1f2efb8f526d79d6438bbbaac0ca1a43935627e5" + - "d129d52c06bf6413af07513bc579447eccc3a9406645c94dae59dab98d6a" + - "f92fa90fd4efaaa4bec466806ed401d2083cda587139ad7e9ee2adbb1dfe" + - "a88b59dd788b954a0f52c3854a3fffecb4bea83debbb2f5f8883e6415d3b" + - "ac1b872df1afe185468adc59364c173082f1dd6da9d348f5f5ba2d216243" + - "23de1f623eeec875bf31d12acec40dc0c1b9562826f3105cdad4c43cf45d" + - "829aa8b14012c47847aef7a2a6e3935fd972235f5d3a7ce4ad3582785393" + - "602e2e27329914021eff38ed2926c88acec1551f17a1b818fc1c3ed4b3b6" + - "6825d55bea269d710123b52e12ca9520a069d9c6a21df3a0253b3a4a6a8c" + - "dc226d667541548834da6bdbbdc165f39e40047d4b647c507d981be17b3a" + - "836063436241a8bb46b11a2867b621413c42d838e4578b72cc1982e34bde" + - "c303b5575ef4b8dd9fea8ed5bf69539413909d03461d3853b5fbf714a61c" + - "769569f42b38fac4b849104e2f2ac1dad0e388646278789f83e0b0511571" + - "019d3bfc5b03ca4cb5564e4e75e103ea1b6000be6588e27105d7cdc2d2f1" + - "f680ad34ef823ac4bd4068146e9997834665aec7dcc7a82ff28d85d52dd6" + - "9c18dd35f326bcf709f74df5981bb90ca8e765fef9f0698a19e12220b287" + - "24a6d9e4f4c7ce93f8ca9a126689ad1df820072557ce3db246cdf41599dd" + - "44ca841bece6c7869358005536e1189aa86b764e890ef90970d6e3831def" + - "fa890bf8692381123924e7d9df804fd770a0a30ee97d5dcdca302833efe8" + - "1d4b2505b17382f0b3429b38c41269ac95e36e9f5a1dbc6e6c8963741917" + - "02a23198decb4efe6809fcbeb5d0c9098a4c300155dc841610e55c8a6e27" + - "2a38a39de3d8ebf38a750af25836ffb1bb7822bb98886280f0cab6838c01" + - "cec57961bdc2e1bf158248309ff9294adcb962252b1c24646d132a3be2c9" + - "1ff82e8e101facbdb807826cc9d1840a90874ba08692e808c336c9d280ee" + - "f36a43a75c746fb864f85711e802546ab5cc3f8f117904ba1a85d6e4b729" + - "85122c5041891e16d55b93d6fc1b7fcfdc80ed3d72d55d64b8895bbf2f8e" + - "d188684e7e89afdc1e6a7ab9bd1d3da95d68698df2cdcbb2e1a4ae70e2fd" + - "dd4760f9e5cf4255eeb1e9e8009ab507395bacb8b2177e7c5757ad02baa9" + - "a96db967d20a150d2dd7f3081d90675fe0c82f94aa3cfdf6ac5585583901" + - "7a8e122170cc817f327a3c8ef44acd6e4fa81b73bcd0bcb5792eed470481" + - "152e87f7a20c3f7c69d5a8199bf9bb7c7269b450dc37a9b22102acaa8438" + - "134d6d733d231cee9522f7d02fbb37b5818ad3ca72df4752230ee11392ef" + - "8f8219be55202bc3d476f5a9078b32fb63d42bed4cda5ef90cc62467bf5e" + - "418ecd9d5d0cf1a33eb9a930e652ce96057fef40b65588aac67621d651a0" + - "9003dbc3925912e385296cd3b2b386a44113308ddf2af52ca390487eb20c" + - "716b76d78ad45129e7c285d918de7107ea8c3b0cfd9e73933b87c0b2b505" + - "cb4c95794f2ee6d6d43e2e76026923a0bbfbc3bb22df9ad729452283ce62" + - "dc9b26684fd45e07650581afd73713a708869a069c58b599ab478974f206" + - "dbd3e4e563e346ff1881723c5fd440bdf9f70f761c6f746113397d7c04b6" + - "b341d7e44de7de0aae79badaaef5ed372ef629dffd52926110683ab2d4da" + - "a4be83eb86c8700703a660edd5a5029f66f1581da96fe1feefc970ab4086" + - "a83ae02e959821967bd27b3b629652f5bc3db2b7f1af674f9f3fb3a788f7" + - "88e6dc1722382971831a7ed72502f85b25888c1534d81c0a4f7351ecc40f" + - "4e0412e05718403fae5746d313a78c80ac297f1391ad389070410e1330a1" + - "b07d683d1c795bda74bde947f2cf0dc9638b5d0851cda27df030403816dd" + - "3b70f042888c9c192656cc4b9fea10b81b5347900d9199c8f0f47d42f2ee" + - "482b68acfa5ff47d9950c950a926a497d94c6a796e0b715416520bd6c59f" + - "30217718d5f1d7bf7c24039f6467214ac8783cf011b25c37c67dfddde426" + - "40afe97f94879f4586954737b86701b32d560f08caec3fc45184bc719c7c" + - "5bf699074fde814acae32c189158c737665a8f94637068322f0c23ff8860" + - "f1b1c1bd766440afee290aa6f7150c7adefa6d72a738cd2268da7c94788e" + - "bb39002e9a328a51f3a92dc5c7cd9e4faed5702d3592ad16217c4978f84e" + - "af0fd2c9e4c6f4dcdd9112c781eb41a9aacb0f7935bb5c92d41e67cfff6b" + - "991ccefbd667ffeded1de325da50c33e28e2eef2f636c9726dc5bfe753ee" + - "c7bb6e1f080c89451f81bc8c29dc9067ce83deed02769714fa9bb477aca5" + - "c09089934674a0cc8e4b2c3136b2e4af8040cc601b90a4dec898dc922ca4" + - "976ab5ae4ac5af93fa5b1854a76ac3bcc2090bdeaa49ec4f319cf7c7b674" + - "6d8e617abb3361b28b27983dd1b139ec4f5af7e116439d7ecb16534817bf" + - "264dbd8f59e80b443be12c17fa013c7f4d029504c9bb62b296c2326f4f49" + - "cc3201b70ac3f62abb683c630179594a6d4cf30fd55b163bf8d01986bb6b" + - "cb7050fd527f095c45661920268e56f760fee80a29c9d37b7fc23f608710" + - "1e723038e64ee1b91c4849d69bd95fc9bc24fc4a234f4855f2a203e3f699" + - "c32698585c83781677739f2c48697c93b3388dcc64aa61f01118495ded33" + - "21ef9a1c949481f96005f8d5b277a7d6a0d906ec304cf4292df172e72d20" + - "29ecdeb65f06267a605f376804bf7bc5b82d5c8facfe7e41dc10806d27e0" + - "bcc5a341d80b3c1532407f75088716d732632cd88b0037f0d829bf385fec" + - "b52a202956489f61f16b0f4781bf59068b33d7330571d0b4a6ed91830258" + - "e1220b308784fa155be9bc821f5c0009a33802fa66dd66d1dde997dddd97" + - "873ddf65927dc1be979af2b5f110eee627dc1e210326ac20544a757ac168" + - "1823f3dd04b1ddc4bf96677a0a87633994e7af2ec99b7d5dfe44c6192be6" + - "a6e69d17b074256da3947808fbf68c7506a7e2c99e6b64d1ffadbd6285d8" + - "e7e032e24d42dde0594bf03fd550be05e5d66c91a660cd1ab7cb1f43fa9d" + - "69885203a7aee35a28f117427d7ac02b742f53d13b818f8631081b1730d1" + - "5b4e1e283cc8e5c4fc3b4652fce05fd8db821f99fcf93e6842816a549791" + - "7f6c49cc53d733788b2fe3c687de58bfe6153c70d99380df1fd566a7c758" + - "8052c62e73340d6a9eccd2ed26b763d518f3a0c4d6362212fbecebb4ffb7" + - "dc94d29944fcc4ab37725b105aa7571f364146782356d8ef056a0be93a55" + - "0c890df8fecc178776fe40703ad1bd2443d92c420be4306d99686592c030" + - "fd3e2230c0b48d8db79002e8a832ef27edb53a45532955f1171203d38414" + - "b4692e901e9f40f918528fc494430f86cf967452f456b01846ac6a383fc0" + - "de2243c7d804e8643aabcb78e2653b145f400a999670217c8da43bbb9c11" + - "e074176424be0c116c304a420120138e901eca4b12ce68fec460b23bc0c7" + - "765a74fc66cbda0e503e7b1baf5883744e468c97c5f1c4b0acc4b87de9f1" + - "4b537405dfb28195439d1ff848d9cd28a8d375038ebb540a9075b7b5074b" + - "ebc18418a370f1d3ac5d68f5d239513002ad11bfc2b7ff53e2e41ccffc4b" + - "0503acc4967c93ae8590a43439b5e7987d10cb8d1957bd9ef717ee3d12df" + - "5d6736c1d8bd8da102337a94b7d14f830f6c403cbaf7925a8a2a7af1311c" + - "57224967a38f6ca374013a9819c55fd2e2a5fac4f2490be5b059f4cd9c60" + - "2d62f80789eb8d9ab893c7f44a4945e41886af218179dfa754bbb59aab68" + - "13b71d2202eb8fc8a425625d21176a28a620e21bb0dad820c0b7051ce8d1" + - "3a33f3af0958bb6cd89f9d6414ab00ddd1d2f9fdece9183d0c05fcdfd117" + - "10d250e4b2029e6992a88293d0457e73e5b1b6a1aae182c69b9cb664992f" + - "073595ef68117026ad7ea579a4043cda318931eee7b2946a34cdc7c9755f" + - "80cc79a2bfe3ed9c79dc52faa5126b824868c965eeb37e9e4e6a49600f3a" + - "cce93c0853b546edb310dcd16a5755f15b1098b2f59dbd2d90e2ea8360ba" + - "f12108236e854465456598ae2f7bc380f008f2e3cd7c98c87643cafd7c36" + - "d40e2597236428d46aa5b260f84b4212d5e26804086adcf00363ce4becb4" + - "9b57eb2847b2f18ec82c99714ad4ddfe4ff3bcac1d0fcaa32660a1dccc68" + - "5bed83254c8e2ea0ae3632a70cfbcbeadef922d78a006d43ac7ab1f8a609" + - "c6e0ebc3ca6bb8430f1a562f41010db74b9febf931ca794fa08d1bc17780" + - "532ae76f25c4ee679d788835dfa4e70ca154c9e2865c3750ffe7b837eed1" + - "972be058fdf2bdb3eb301867bb132306c7aa237f6771d60bbc56cf31cb30" + - "32a87204d454542de747418470025ab84935d3eaaca01dbbdae9ef6b5d3a" + - "ca62ce9f871a3e1272b2b671582c096a349c00f32d742ddb17993994d8ae" + - "fc178cbcf9abc03114ff2bf7db8f757c63d6898faccd822f5c2e9a7570fb" + - "9cfff148570888be24ae42644c1a5bebb6f6287147a4bcc01c7675be9e4a" + - "897519dd3132a7cc2e778f8c90d23dc8073f6fa108d7ef82d561794bd9d5" + - "f1faa306334f338ac3ba99c853f79c24f7048fa906fde87d1ed28a7b11c0" + - "66a3bb98f8d21055aaafdf7e069b77b60b3d5cbe7c5e4379c7651af955cd" + - "82a19a09caf36becb6cd3fe9e12f40379941542709991066df21b7b12dfb" + - "2416d83fcdc33bb583e3b42f24f53edf8dc7c579ad3be831c99f72bf9fb7" + - "a35b6562e824e039e6bf1adc8f5ca53846de7bae11c4317e696d887df33c" + - "525f0a9c01fc29f2c26c90b85fe82ed8bd50954cd4e9ac7c85c7f3efec75" + - "da1da4ed173cb695cee295190527edb3cb06c5dbdabe0228cc60b6455153" + - "76244f27aa56da2db10f2659090137ffb82c57233c833e0bbf22d6f647fb" + - "97b3652d2888b3ab08010b8e8a6967d560b747757806736dc98b78226634" + - "f1eecaa4a2e23ba36591acb5737d735c5bc7a2e36f1a46946927e061fdf7" + - "7a3b68ef582c26b01f5aa9a438ecc26c6941221d1590c838072f9e471fe7" + - "fd59dacb0d092d40d76ea2f7c6e954a132a015bd4cb31147f3ebe4518322" + - "916438a62836ac85a4cf4492190a85bcc8edb37e38b99ea552d749c30f74" + - "ca20c298165e8ed02d4671e0b41cac3a32a345b9349ad22c2a4bb2c16a4c" + - "e0613ca0f0518759f7d2b33cfad2fae764f410d4d9ff8a76ae02a8107e7e" + - "01d9cd0552676b85ba002f19c01ad5f416d1d08bb84fec7c3555b098dbce" + - "48e1a5d847895e54db9c5b80cc22d5b87cd41a1a94be102bdd45a3cda5d1" + - "181e10446d213d6b3fdc350d486d2011d705c5f16ccf7519065c47bad7d6" + - "89c71e5fdf9d04bfb91eb1f07fa0f001009c1d4b1f6a116a570823a8580b", - }, - { - key: "392468efccff36dade31fc1c62eb38bb61394fe448def9d9d9beec2413ddb418", - tag: "e1122e7c8e6965b90addbd46d8a548d6", - in: "6a13d37f0ec933194c227351f4a19b507d93465b1f3e88dcb5f1ed1262fa" + - "58ea99ff31e6fc85c39c04129fa69195b71b2060122fe618dd9430a63f97" + - "54b52a80b3cd099f248f91a468bae211a27bdb47ba005d29881ea5143a82" + - "967c4c30c9a4f0dba1a4975e6407fe296d40023a00efa06be763f2d73d46" + - "a2901ae28b3d8ce18009a462e223b71476d7b954c138e177d15a390847de" + - "96a7f7fd0598748e86b0f08e64d915e67c7e3cf936f3dcd60edebd36e2a1" + - "d65b6ac29530c48ab3bd52d45b4f938a19b9b31e2911105a8561600d5377" + - "905a67112ec28025aa680350ff85b808c5b4c98b7b9567d03f5ed3911ec9" + - "365a8de4b15ca62adaa69e5ba710eb1756a346016c67a297d8624f9f1ab5" + - "b3fbce98b141049f0ce26c85d2f8a9cc6ca8ab6c6e148be968931430dcc6" + - "2bf58ea9698ef52a5d271cf48e6748ac9e04bc7ae7da205a1a7535478322" + - "d820eca146cedf4b2f9aa9fcfd77ab56a7276977401dcc1f96baa1b607e0" + - "256bd04ec324ec67a4313e2d5a53d3a3fb5332927929b20c63bde805f637" + - "eb1050fee2a152a0405634f55c48a59fe370d54b2ab1671dae2c7fd92243" + - "10627808e553127c74f724362b4a6ee49b697daae7df3ddc5d2ed9d6befd" + - "77fb9f68fe3041f6ef13f46f34ab682ab8563e8996344f82b2ef006a8d54" + - "3dd9c1db4979d7da97bda45e722065f8a238f0873217b783a9a629a12b3a" + - "4de437445039997bd243efbf5e3b6059b9459d395290efb9081c632fb694" + - "81000dc74c395cb507422df181aba20f776ce3fd8765ac485021992c98b1" + - "67c68805662cb4356a0ee7ba6bdae51ac10cd06bb5b2f3a72841c714c8ed" + - "bc56998fe2fefb9bf69e172fdf54b2ab138ae59372c52a67e93882a3000f" + - "d966992aa2250c6ff93e9cac89645d70625d79332ade5dab7eb1adbe7dce" + - "5a013fb65ad32fe22ed16fb9bb35eca1f37a0433c320e8752f8fc4b7618c" + - "5e4df2efece832e259ad98b895c474e47d0e3fc488bea8f717a17de0dcf7" + - "597fb8fe12e62246296f9a887dcc3a700820c190a55a4931a7d44bd3bb2e" + - "ab6c8a8126f1be93790cebabc1d69e01796e6cc80e7c16bbc82fb333fb21" + - "c774ab7db843242838e82d8e1cb8ccab385e67a4271fe7031d74b6e8edcc" + - "8ed585d1c05a365c7665899c1dbc561151d3b44bceace77c4f53c0e0f6f7" + - "74d42f9ad3e56f1c2a8d53879d695f895690afb4698472a3d52d67159313" + - "133c87823fe0500eb68fe286f8b9a2f59f12785d026dc97bdbf793c7d1eb" + - "155f1f136aae66c256583e987f718afbe733e0a5ce30d021493fb84e2242" + - "5b18754d126235ef80335004fa84f88361a584753df409360cd8bd45bace" + - "8f48156bec66577bf2c685089f5ac7e7ec76c0df068fbaa47661f8517f92" + - "e14723b3b278f151816537a7212c96bd340a00c15c9c9bc9a2a5d163655d" + - "84b38073e2be9217cad97d362d89d4baf3ce0a8d8562f19a8c97a9aaf5e7" + - "77d60456360ffb77b30f177d2809052020d141697ecf9cb65f42b9190caf" + - "6540b2c82f6e5a8482934a6a1a5711a8c24546cd8ba432068404eae5a827" + - "2e09efc3c6037af4feaac0a46329229b010ecac6b9f077a9b076bb6d9ce1" + - "38401eb38d124baa11507a994185295020bf9b754fcf78430db9253f5929" + - "87c46c0f8589c4e463b15a3840b1cea795e24cf6b20f29a630136e0589b3" + - "8dd7fbe5ea21da72c88bd8e56473586822aa3765660a45a988df9b8eb8e8" + - "141939d3e4cc637c5d788064d40a9f7c734e43fdf8d7189a5d76700d9743" + - "fe0122944663afdb88c5201318ca782f6848b742ddebe7463fd4a32280ac" + - "1cf8311e9137d319de05ce9cd85abab24c5364041c14d3b4ce650400498e" + - "122166eccc12784b7ac3b262ac0b198ffc26eeed9a5da5374f7a2a53c87a" + - "78c217ea1fbf8d38f62511657b73109f31691aef14d82ce6e1010eae9e6f" + - "a419e5c1c16c0cc70651eb3374c03549a1bc7d3ed42d60f886102c798dbc" + - "ba56f0a2b3b9b412530c35f5f7ed06311ee14571f9c26ed9c81ef38ff000" + - "2f5ef3aab7351e32049a6ef8f48a43da1d84402d229df513dfaf1b2e4043" + - "6ce68c70ebeddd7477c9164f0dce45a6fc5de050f52ec269659d5854bcae" + - "f7762ed7400713c27a4d523eaf8c136c4a1ca00b9e9e55902daf6cdf8528" + - "c22ca1f2fa7ce87902d75a6850e1a5a4592497be1bb401878f18b189b0e2" + - "c59d10705bfabde3cd2da01eb452006b294108d5d42e88e9e15424d8cd0b" + - "8ab43a6c546b3dbf52e47b59cde6a3e417b0395220b6d63736d429da3458" + - "9a2524f1629320206fa7f1d8a041e17222c4a5814561937e1030e6375c77" + - "9dc988bb928bbdbe2c2eb20111639725d82b5d7192cd3e4acc27581f0ba7" + - "286cff41f97aa5a52ea0083de5057fd2ba985aa738e4d03fcf11ebab1d97" + - "e2ac77d1c2beb8799150a421a07b3777d0b850f24194b8309135b13da6c7" + - "e38653a711e407a1811290fbb7bc15d8b12efc6916e97ead41e042a44721" + - "e9cde3388073d921595bcddcac758dc675173f38242e65e4a284aaa7e8fa" + - "6adddaf00bc46428ab2d8601205b8895bcedfc80ca0aa4619ed6bb082ddf" + - "33ec04fa5d417f33fcdd238c6b11320c5a08f800e0f350b75d81e3bcbd15" + - "58a1eab87a3c8c2ffd7ba1d7e754e607cf98ba22a3fc766c45bd6f2569b4" + - "84639e6611714119d188a24a5e963089a16ed34e20b9f154cad8ac6031dd" + - "7a3a885afc2ae5e003ae8d4e4aabdb3e51dfc423b8cf4ed9ae2010072cbb" + - "b1108c7da1ff075e54ed827a0963ac5523ecdf3fc5eee7b4d1a6773764ec" + - "5c30f41690523fd70d895edb7ca6a1806d54240c4c7b43410da73503a323" + - "90d9070ed30da3a2fb5eccd40d083be7cf8bf40b4279f819cf795b6f075b" + - "5a67a10a06a6076d0d83c72efea05f244901c4b5fd9eb380432519311baf" + - "8c81f6325df4d37ff4d30d318f904ebb837ec76b341dd00a8f247cf0bbe9" + - "6f3784dc8f5feb344958fdf1a9ececb105f8770826db1f17a5281e997951" + - "d3c60cc28fc3e66ffeb5dbac315f98f6d240208043f28dee963d843e68ab" + - "57d847f76ae2f96ce6e37f377ef5dfef2176ecd7440ce4dadcec2231b606" + - "e4a80420fb3ed135640e1f05d6bd58b8dce062dd7d36b885d424f6318e5e" + - "a0753efbb33bbc7360d2b5dfab3ae0d5e000b8d31f2ba0f5fd8b34f96b55" + - "28fff35e769461d0f03cf3bfdf0b801dcbbf2838180cb9b108e06c353e3f" + - "0b9ef61678cfed1ea37ae76bccb5ef5957ac2c8e8f4794c8145a15f1cc88" + - "bfb0881080326c481b373c3bc9b07a9b60a0c8bd5fa4f6f90145590a5227" + - "6fcc0ccc2375d0ccb571d414d1b0c38b4e02c39db4d701c5e25e90785ef4" + - "d26f35edd8c4b96455bdca7245cfefd9cfbd2f319615e5fdf07bb9564fa0" + - "44bb35a58391d02e3927780b4076bc0893dfcb4b63a32cd7a541a4a8c253" + - "0349c6e96e378dbeb66dedf87d813d0b744452c1c4088507dca722193827" + - "9e2dfa24e4a409de494acf654f44262db9206a7717fa434ac4fdc6a6eb5b" + - "1fd5a193b6043bc4327c8c09fd6822eaa9df37bbcac1077754a295621601" + - "267b68733b62dadc2563f1700af180141f29899e2689dbbe9745ba8477f4" + - "352921900b403a01c9dd042a8c1b0e0489959fb0b0a8431c97b41e202204" + - "212ebfa00c593399dbd14d7aec07b8292d2e40b48f05fcd54a15da4a24d7" + - "2759e409f4c7b5b98fce4abac6c30e4872d92efa1f96479ec30f21699825" + - "50fa60584f5a09051a00f8e7dbb3853e66ca3f05fbfe43bef9b120a25a01" + - "eb436ba8ecda715201eda72e517d628f883386c1503aa8b8e75610f7155e" + - "9f916335ab6d6f0f9589b6220cd2b81c2c937dc065d3d14a7df8cc916cd0" + - "0ce1bb53fd9c8974298d3bd316f3658aa8cc6904f073a1472149e4b08c64" + - "5e11abe0428ccb6174df2103edd735965d6454b543d3f01410f77053f65e" + - "c1d1aee56fdd3af23bcd4e1a7fcc4e600c4831007c33fe5f0c8300f686eb" + - "9b4d1e4f08fe4ddc8a90be14dc3a5a88ff96716509341d5db24c0d016863" + - "998b1859c5021df815a6f1ca9845f1a8e99dbad132b406227c5897a1bdf3" + - "e698962f799133ff4429decbef6ce036296facf38e4812fec102b76c6d30" + - "beba1b70722254fafbc471096153478c971db7d96263660209265cb10f13" + - "b34b5fd55c4abe818a5f9715d8a85094e2946b7a001b47f629e26c636d86" + - "4968ad2ab616dfe28840bd60b4b9855c8dbe1cb873fcbc4577b5fefeb8bb" + - "4832039867dc35db9c036c83bc204396e3474ddfe806c77c65c936f488b6" + - "7c1028739562d7bb055d21441af29ae2921290e548dccf8a56021385422b" + - "15da6b232b24151309a75a00296d11aa1952a1513110b0faa93d1d8cd9ae" + - "fa9f1c59377ec9165b2c9e07cbde40db7b81bca6d58fc28bae8f473cd0e9" + - "a2420e0b943a83d284108626c24ac570b1d6c1ab971e71f43fbd6c00e171" + - "238141a6dc987a60385c3a04dd147a2f8e80dfe727b104c0fdd80b326f59" + - "0b9f86fd7b2fd1122a390979889eabd803ab57159c8509a1443eb6789382" + - "090a770ae4eba03306f96e50e19a7d44c584ccc230d104548946efca4520" + - "d61de5f473e2f4eada6c8ce9c7ee975eb4f63c0483cb775ed7d3cf690a61" + - "7d6656d683a8512707d81ca5ba176a42bcffcfa692129f292607d2a47536" + - "ccaeb464c9272d6f3816074b712af602470088b253deba18771e5f67734b" + - "587707cdd06f35264b2262fd253c25b5d38ee7db287610e5398062b7a34e" + - "6e4cf7447d00873b930ad148fd96f0ab18771bc468b874bb109924101c84" + - "c4e239ecc7687d875e4d94a1a973620ca61e35a872c2e2e61a502169f1bb" + - "4e5ff5fa2bff657be6195b3e2c7151a52fc0096d98e7f08f5a98f570aee1" + - "7b4275f1356e87e080ce0e1b9bbabe7dea48b5903bc390ce23472ad64a89" + - "41c3247bfd23ea90b2dee09085571bad85568040105e098f993bb37e43c3" + - "e6d511171c77cfc450570dfb9fc6a3930ef43c03f8213f6203d545d791c7" + - "d3fa42d5dde1655038d35c5dfacc12e9dee24fe833977549eda68ae8b508" + - "be277e743921b584f9dfa0eefbd8bf3c23f51efdef7f7487001d29e8097b" + - "ba63289cfca743023d1668555a46fe6d5b7421377414df1e9ef135480622" + - "22e2e9a7baa618d88f407517f6317b6a0ba3384ace16d68631d59ea169d5" + - "092d20afc1a481b82be5e734bb092953a0a94702bae1a0f48d2a22b9a05f" + - "f64493b7b2e984f27582b1eb937fddf8512c49830435d146dcc291a4118d" + - "5dc638b99cdcbcc5860de7a92c5b13cbd1e01e051f01af40afe124346320" + - "d3626bf9d8f7850744e032a993c276fd388718237740c6caf260fca60b8d" + - "d846102e3262b6e05ceca00c6affe938fac1847350865fc858d3ddd1d130" + - "71d1221ce7c5d575587fcba580e544b74d877ed5ca92763ef0ca0d7bfa08" + - "d57a0216b2a01a2b9ec74b8430051e0074862b7be25b6766ab520f2eb75d" + - "eeb979c28f03795f6f1e4b8410beab19a20febc91985b8a7c298534a6598" + - "f2c5b0dc5de9f5e55a97791507bc6373db26", - }, -} diff --git a/src/internal/x/fiximports.bash b/src/internal/x/fiximports.bash deleted file mode 100755 index ec72643b63..0000000000 --- a/src/internal/x/fiximports.bash +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -# To fix import paths when importing new snapshots from the golang.org/x -# repositories, run this script in the current directory. - -sed -i 's,"golang\.org/x,"internal/x,g' $(grep -lr 'golang.org') diff --git a/src/internal/x/net/dns/dnsmessage/example_test.go b/src/internal/x/net/dns/dnsmessage/example_test.go deleted file mode 100644 index 8453c23048..0000000000 --- a/src/internal/x/net/dns/dnsmessage/example_test.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2017 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 dnsmessage_test - -import ( - "fmt" - "net" - "strings" - - "internal/x/net/dns/dnsmessage" -) - -func mustNewName(name string) dnsmessage.Name { - n, err := dnsmessage.NewName(name) - if err != nil { - panic(err) - } - return n -} - -func ExampleParser() { - msg := dnsmessage.Message{ - Header: dnsmessage.Header{Response: true, Authoritative: true}, - Questions: []dnsmessage.Question{ - { - Name: mustNewName("foo.bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - { - Name: mustNewName("bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - }, - Answers: []dnsmessage.Resource{ - { - Header: dnsmessage.ResourceHeader{ - Name: mustNewName("foo.bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 1}}, - }, - { - Header: dnsmessage.ResourceHeader{ - Name: mustNewName("bar.example.com."), - Type: dnsmessage.TypeA, - Class: dnsmessage.ClassINET, - }, - Body: &dnsmessage.AResource{A: [4]byte{127, 0, 0, 2}}, - }, - }, - } - - buf, err := msg.Pack() - if err != nil { - panic(err) - } - - wantName := "bar.example.com." - - var p dnsmessage.Parser - if _, err := p.Start(buf); err != nil { - panic(err) - } - - for { - q, err := p.Question() - if err == dnsmessage.ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - if q.Name.String() != wantName { - continue - } - - fmt.Println("Found question for name", wantName) - if err := p.SkipAllQuestions(); err != nil { - panic(err) - } - break - } - - var gotIPs []net.IP - for { - h, err := p.AnswerHeader() - if err == dnsmessage.ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - if (h.Type != dnsmessage.TypeA && h.Type != dnsmessage.TypeAAAA) || h.Class != dnsmessage.ClassINET { - continue - } - - if !strings.EqualFold(h.Name.String(), wantName) { - if err := p.SkipAnswer(); err != nil { - panic(err) - } - continue - } - - switch h.Type { - case dnsmessage.TypeA: - r, err := p.AResource() - if err != nil { - panic(err) - } - gotIPs = append(gotIPs, r.A[:]) - case dnsmessage.TypeAAAA: - r, err := p.AAAAResource() - if err != nil { - panic(err) - } - gotIPs = append(gotIPs, r.AAAA[:]) - } - } - - fmt.Printf("Found A/AAAA records for name %s: %v\n", wantName, gotIPs) - - // Output: - // Found question for name bar.example.com. - // Found A/AAAA records for name bar.example.com.: [127.0.0.2] -} diff --git a/src/internal/x/net/dns/dnsmessage/message_test.go b/src/internal/x/net/dns/dnsmessage/message_test.go deleted file mode 100644 index 052897f3cf..0000000000 --- a/src/internal/x/net/dns/dnsmessage/message_test.go +++ /dev/null @@ -1,1137 +0,0 @@ -// 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 dnsmessage - -import ( - "bytes" - "fmt" - "reflect" - "strings" - "testing" -) - -func mustNewName(name string) Name { - n, err := NewName(name) - if err != nil { - panic(err) - } - return n -} - -func (m *Message) String() string { - s := fmt.Sprintf("Message: %#v\n", &m.Header) - if len(m.Questions) > 0 { - s += "-- Questions\n" - for _, q := range m.Questions { - s += fmt.Sprintf("%#v\n", q) - } - } - if len(m.Answers) > 0 { - s += "-- Answers\n" - for _, a := range m.Answers { - s += fmt.Sprintf("%#v\n", a) - } - } - if len(m.Authorities) > 0 { - s += "-- Authorities\n" - for _, ns := range m.Authorities { - s += fmt.Sprintf("%#v\n", ns) - } - } - if len(m.Additionals) > 0 { - s += "-- Additionals\n" - for _, e := range m.Additionals { - s += fmt.Sprintf("%#v\n", e) - } - } - return s -} - -func TestNameString(t *testing.T) { - want := "foo" - name := mustNewName(want) - if got := fmt.Sprint(name); got != want { - t.Errorf("got fmt.Sprint(%#v) = %s, want = %s", name, got, want) - } -} - -func TestQuestionPackUnpack(t *testing.T) { - want := Question{ - Name: mustNewName("."), - Type: TypeA, - Class: ClassINET, - } - buf, err := want.pack(make([]byte, 1, 50), map[string]int{}, 1) - if err != nil { - t.Fatal("Packing failed:", err) - } - var p Parser - p.msg = buf - p.header.questions = 1 - p.section = sectionQuestions - p.off = 1 - got, err := p.Question() - if err != nil { - t.Fatalf("Unpacking failed: %v\n%s", err, string(buf[1:])) - } - if p.off != len(buf) { - t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", p.off, len(buf)) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("Got = %+v, want = %+v", got, want) - } -} - -func TestName(t *testing.T) { - tests := []string{ - "", - ".", - "google..com", - "google.com", - "google..com.", - "google.com.", - ".google.com.", - "www..google.com.", - "www.google.com.", - } - - for _, test := range tests { - n, err := NewName(test) - if err != nil { - t.Errorf("Creating name for %q: %v", test, err) - continue - } - if ns := n.String(); ns != test { - t.Errorf("Got %#v.String() = %q, want = %q", n, ns, test) - continue - } - } -} - -func TestNamePackUnpack(t *testing.T) { - tests := []struct { - in string - want string - err error - }{ - {"", "", errNonCanonicalName}, - {".", ".", nil}, - {"google..com", "", errNonCanonicalName}, - {"google.com", "", errNonCanonicalName}, - {"google..com.", "", errZeroSegLen}, - {"google.com.", "google.com.", nil}, - {".google.com.", "", errZeroSegLen}, - {"www..google.com.", "", errZeroSegLen}, - {"www.google.com.", "www.google.com.", nil}, - } - - for _, test := range tests { - in := mustNewName(test.in) - want := mustNewName(test.want) - buf, err := in.pack(make([]byte, 0, 30), map[string]int{}, 0) - if err != test.err { - t.Errorf("Packing of %q: got err = %v, want err = %v", test.in, err, test.err) - continue - } - if test.err != nil { - continue - } - var got Name - n, err := got.unpack(buf, 0) - if err != nil { - t.Errorf("Unpacking for %q failed: %v", test.in, err) - continue - } - if n != len(buf) { - t.Errorf( - "Unpacked different amount than packed for %q: got n = %d, want = %d", - test.in, - n, - len(buf), - ) - } - if got != want { - t.Errorf("Unpacking packing of %q: got = %#v, want = %#v", test.in, got, want) - } - } -} - -func TestIncompressibleName(t *testing.T) { - name := mustNewName("example.com.") - compression := map[string]int{} - buf, err := name.pack(make([]byte, 0, 100), compression, 0) - if err != nil { - t.Fatal("First packing failed:", err) - } - buf, err = name.pack(buf, compression, 0) - if err != nil { - t.Fatal("Second packing failed:", err) - } - var n1 Name - off, err := n1.unpackCompressed(buf, 0, false /* allowCompression */) - if err != nil { - t.Fatal("Unpacking incompressible name without pointers failed:", err) - } - var n2 Name - if _, err := n2.unpackCompressed(buf, off, false /* allowCompression */); err != errCompressedSRV { - t.Errorf("Unpacking compressed incompressible name with pointers: got err = %v, want = %v", err, errCompressedSRV) - } -} - -func checkErrorPrefix(err error, prefix string) bool { - e, ok := err.(*nestedError) - return ok && e.s == prefix -} - -func TestHeaderUnpackError(t *testing.T) { - wants := []string{ - "id", - "bits", - "questions", - "answers", - "authorities", - "additionals", - } - var buf []byte - var h header - for _, want := range wants { - n, err := h.unpack(buf, 0) - if n != 0 || !checkErrorPrefix(err, want) { - t.Errorf("got h.unpack([%d]byte, 0) = %d, %v, want = 0, %s", len(buf), n, err, want) - } - buf = append(buf, 0, 0) - } -} - -func TestParserStart(t *testing.T) { - const want = "unpacking header" - var p Parser - for i := 0; i <= 1; i++ { - _, err := p.Start([]byte{}) - if !checkErrorPrefix(err, want) { - t.Errorf("got p.Start(nil) = _, %v, want = _, %s", err, want) - } - } -} - -func TestResourceNotStarted(t *testing.T) { - tests := []struct { - name string - fn func(*Parser) error - }{ - {"CNAMEResource", func(p *Parser) error { _, err := p.CNAMEResource(); return err }}, - {"MXResource", func(p *Parser) error { _, err := p.MXResource(); return err }}, - {"NSResource", func(p *Parser) error { _, err := p.NSResource(); return err }}, - {"PTRResource", func(p *Parser) error { _, err := p.PTRResource(); return err }}, - {"SOAResource", func(p *Parser) error { _, err := p.SOAResource(); return err }}, - {"TXTResource", func(p *Parser) error { _, err := p.TXTResource(); return err }}, - {"SRVResource", func(p *Parser) error { _, err := p.SRVResource(); return err }}, - {"AResource", func(p *Parser) error { _, err := p.AResource(); return err }}, - {"AAAAResource", func(p *Parser) error { _, err := p.AAAAResource(); return err }}, - } - - for _, test := range tests { - if err := test.fn(&Parser{}); err != ErrNotStarted { - t.Errorf("got _, %v = p.%s(), want = _, %v", err, test.name, ErrNotStarted) - } - } -} - -func TestDNSPackUnpack(t *testing.T) { - wants := []Message{ - { - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Answers: []Resource{}, - Authorities: []Resource{}, - Additionals: []Resource{}, - }, - largeTestMsg(), - } - for i, want := range wants { - b, err := want.Pack() - if err != nil { - t.Fatalf("%d: packing failed: %v", i, err) - } - var got Message - err = got.Unpack(b) - if err != nil { - t.Fatalf("%d: unpacking failed: %v", i, err) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("%d: got = %+v, want = %+v", i, &got, &want) - } - } -} - -func TestDNSAppendPackUnpack(t *testing.T) { - wants := []Message{ - { - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Answers: []Resource{}, - Authorities: []Resource{}, - Additionals: []Resource{}, - }, - largeTestMsg(), - } - for i, want := range wants { - b := make([]byte, 2, 514) - b, err := want.AppendPack(b) - if err != nil { - t.Fatalf("%d: packing failed: %v", i, err) - } - b = b[2:] - var got Message - err = got.Unpack(b) - if err != nil { - t.Fatalf("%d: unpacking failed: %v", i, err) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("%d: got = %+v, want = %+v", i, &got, &want) - } - } -} - -func TestSkipAll(t *testing.T) { - msg := largeTestMsg() - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing large test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - f func() error - }{ - {"SkipAllQuestions", p.SkipAllQuestions}, - {"SkipAllAnswers", p.SkipAllAnswers}, - {"SkipAllAuthorities", p.SkipAllAuthorities}, - {"SkipAllAdditionals", p.SkipAllAdditionals}, - } - for _, test := range tests { - for i := 1; i <= 3; i++ { - if err := test.f(); err != nil { - t.Errorf("Call #%d to %s(): %v", i, test.name, err) - } - } - } -} - -func TestSkipEach(t *testing.T) { - msg := smallTestMsg() - - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - f func() error - }{ - {"SkipQuestion", p.SkipQuestion}, - {"SkipAnswer", p.SkipAnswer}, - {"SkipAuthority", p.SkipAuthority}, - {"SkipAdditional", p.SkipAdditional}, - } - for _, test := range tests { - if err := test.f(); err != nil { - t.Errorf("First call: got %s() = %v, want = %v", test.name, err, nil) - } - if err := test.f(); err != ErrSectionDone { - t.Errorf("Second call: got %s() = %v, want = %v", test.name, err, ErrSectionDone) - } - } -} - -func TestSkipAfterRead(t *testing.T) { - msg := smallTestMsg() - - buf, err := msg.Pack() - if err != nil { - t.Fatal("Packing test message:", err) - } - var p Parser - if _, err := p.Start(buf); err != nil { - t.Fatal(err) - } - - tests := []struct { - name string - skip func() error - read func() error - }{ - {"Question", p.SkipQuestion, func() error { _, err := p.Question(); return err }}, - {"Answer", p.SkipAnswer, func() error { _, err := p.Answer(); return err }}, - {"Authority", p.SkipAuthority, func() error { _, err := p.Authority(); return err }}, - {"Additional", p.SkipAdditional, func() error { _, err := p.Additional(); return err }}, - } - for _, test := range tests { - if err := test.read(); err != nil { - t.Errorf("Got %s() = _, %v, want = _, %v", test.name, err, nil) - } - if err := test.skip(); err != ErrSectionDone { - t.Errorf("Got Skip%s() = %v, want = %v", test.name, err, ErrSectionDone) - } - } -} - -func TestSkipNotStarted(t *testing.T) { - var p Parser - - tests := []struct { - name string - f func() error - }{ - {"SkipAllQuestions", p.SkipAllQuestions}, - {"SkipAllAnswers", p.SkipAllAnswers}, - {"SkipAllAuthorities", p.SkipAllAuthorities}, - {"SkipAllAdditionals", p.SkipAllAdditionals}, - } - for _, test := range tests { - if err := test.f(); err != ErrNotStarted { - t.Errorf("Got %s() = %v, want = %v", test.name, err, ErrNotStarted) - } - } -} - -func TestTooManyRecords(t *testing.T) { - const recs = int(^uint16(0)) + 1 - tests := []struct { - name string - msg Message - want error - }{ - { - "Questions", - Message{ - Questions: make([]Question, recs), - }, - errTooManyQuestions, - }, - { - "Answers", - Message{ - Answers: make([]Resource, recs), - }, - errTooManyAnswers, - }, - { - "Authorities", - Message{ - Authorities: make([]Resource, recs), - }, - errTooManyAuthorities, - }, - { - "Additionals", - Message{ - Additionals: make([]Resource, recs), - }, - errTooManyAdditionals, - }, - } - - for _, test := range tests { - if _, got := test.msg.Pack(); got != test.want { - t.Errorf("Packing %d %s: got = %v, want = %v", recs, test.name, got, test.want) - } - } -} - -func TestVeryLongTxt(t *testing.T) { - want := Resource{ - ResourceHeader{ - Name: mustNewName("foo.bar.example.com."), - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{[]string{ - "", - "", - "foo bar", - "", - "www.example.com", - "www.example.com.", - strings.Repeat(".", 255), - }}, - } - buf, err := want.pack(make([]byte, 0, 8000), map[string]int{}, 0) - if err != nil { - t.Fatal("Packing failed:", err) - } - var got Resource - off, err := got.Header.unpack(buf, 0) - if err != nil { - t.Fatal("Unpacking ResourceHeader failed:", err) - } - body, n, err := unpackResourceBody(buf, off, got.Header) - if err != nil { - t.Fatal("Unpacking failed:", err) - } - got.Body = body - if n != len(buf) { - t.Errorf("Unpacked different amount than packed: got n = %d, want = %d", n, len(buf)) - } - if !reflect.DeepEqual(got, want) { - t.Errorf("Got = %#v, want = %#v", got, want) - } -} - -func TestTooLongTxt(t *testing.T) { - rb := TXTResource{[]string{strings.Repeat(".", 256)}} - if _, err := rb.pack(make([]byte, 0, 8000), map[string]int{}, 0); err != errStringTooLong { - t.Errorf("Packing TXTRecord with 256 character string: got err = %v, want = %v", err, errStringTooLong) - } -} - -func TestStartAppends(t *testing.T) { - buf := make([]byte, 2, 514) - wantBuf := []byte{4, 44} - copy(buf, wantBuf) - - b := NewBuilder(buf, Header{}) - b.EnableCompression() - - buf, err := b.Finish() - if err != nil { - t.Fatal("Building failed:", err) - } - if got, want := len(buf), headerLen+2; got != want { - t.Errorf("Got len(buf} = %d, want = %d", got, want) - } - if string(buf[:2]) != string(wantBuf) { - t.Errorf("Original data not preserved, got = %v, want = %v", buf[:2], wantBuf) - } -} - -func TestStartError(t *testing.T) { - tests := []struct { - name string - fn func(*Builder) error - }{ - {"Questions", func(b *Builder) error { return b.StartQuestions() }}, - {"Answers", func(b *Builder) error { return b.StartAnswers() }}, - {"Authorities", func(b *Builder) error { return b.StartAuthorities() }}, - {"Additionals", func(b *Builder) error { return b.StartAdditionals() }}, - } - - envs := []struct { - name string - fn func() *Builder - want error - }{ - {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, - {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, - } - - for _, env := range envs { - for _, test := range tests { - if got := test.fn(env.fn()); got != env.want { - t.Errorf("got Builder{%s}.Start%s = %v, want = %v", env.name, test.name, got, env.want) - } - } - } -} - -func TestBuilderResourceError(t *testing.T) { - tests := []struct { - name string - fn func(*Builder) error - }{ - {"CNAMEResource", func(b *Builder) error { return b.CNAMEResource(ResourceHeader{}, CNAMEResource{}) }}, - {"MXResource", func(b *Builder) error { return b.MXResource(ResourceHeader{}, MXResource{}) }}, - {"NSResource", func(b *Builder) error { return b.NSResource(ResourceHeader{}, NSResource{}) }}, - {"PTRResource", func(b *Builder) error { return b.PTRResource(ResourceHeader{}, PTRResource{}) }}, - {"SOAResource", func(b *Builder) error { return b.SOAResource(ResourceHeader{}, SOAResource{}) }}, - {"TXTResource", func(b *Builder) error { return b.TXTResource(ResourceHeader{}, TXTResource{}) }}, - {"SRVResource", func(b *Builder) error { return b.SRVResource(ResourceHeader{}, SRVResource{}) }}, - {"AResource", func(b *Builder) error { return b.AResource(ResourceHeader{}, AResource{}) }}, - {"AAAAResource", func(b *Builder) error { return b.AAAAResource(ResourceHeader{}, AAAAResource{}) }}, - } - - envs := []struct { - name string - fn func() *Builder - want error - }{ - {"sectionNotStarted", func() *Builder { return &Builder{section: sectionNotStarted} }, ErrNotStarted}, - {"sectionHeader", func() *Builder { return &Builder{section: sectionHeader} }, ErrNotStarted}, - {"sectionQuestions", func() *Builder { return &Builder{section: sectionQuestions} }, ErrNotStarted}, - {"sectionDone", func() *Builder { return &Builder{section: sectionDone} }, ErrSectionDone}, - } - - for _, env := range envs { - for _, test := range tests { - if got := test.fn(env.fn()); got != env.want { - t.Errorf("got Builder{%s}.%s = %v, want = %v", env.name, test.name, got, env.want) - } - } - } -} - -func TestFinishError(t *testing.T) { - var b Builder - want := ErrNotStarted - if _, got := b.Finish(); got != want { - t.Errorf("got Builder{}.Finish() = %v, want = %v", got, want) - } -} - -func TestBuilder(t *testing.T) { - msg := largeTestMsg() - want, err := msg.Pack() - if err != nil { - t.Fatal("Packing without builder:", err) - } - - b := NewBuilder(nil, msg.Header) - b.EnableCompression() - - if err := b.StartQuestions(); err != nil { - t.Fatal("b.StartQuestions():", err) - } - for _, q := range msg.Questions { - if err := b.Question(q); err != nil { - t.Fatalf("b.Question(%#v): %v", q, err) - } - } - - if err := b.StartAnswers(); err != nil { - t.Fatal("b.StartAnswers():", err) - } - for _, a := range msg.Answers { - switch a.Header.Type { - case TypeA: - if err := b.AResource(a.Header, *a.Body.(*AResource)); err != nil { - t.Fatalf("b.AResource(%#v): %v", a, err) - } - case TypeNS: - if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { - t.Fatalf("b.NSResource(%#v): %v", a, err) - } - case TypeCNAME: - if err := b.CNAMEResource(a.Header, *a.Body.(*CNAMEResource)); err != nil { - t.Fatalf("b.CNAMEResource(%#v): %v", a, err) - } - case TypeSOA: - if err := b.SOAResource(a.Header, *a.Body.(*SOAResource)); err != nil { - t.Fatalf("b.SOAResource(%#v): %v", a, err) - } - case TypePTR: - if err := b.PTRResource(a.Header, *a.Body.(*PTRResource)); err != nil { - t.Fatalf("b.PTRResource(%#v): %v", a, err) - } - case TypeMX: - if err := b.MXResource(a.Header, *a.Body.(*MXResource)); err != nil { - t.Fatalf("b.MXResource(%#v): %v", a, err) - } - case TypeTXT: - if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { - t.Fatalf("b.TXTResource(%#v): %v", a, err) - } - case TypeAAAA: - if err := b.AAAAResource(a.Header, *a.Body.(*AAAAResource)); err != nil { - t.Fatalf("b.AAAAResource(%#v): %v", a, err) - } - case TypeSRV: - if err := b.SRVResource(a.Header, *a.Body.(*SRVResource)); err != nil { - t.Fatalf("b.SRVResource(%#v): %v", a, err) - } - } - } - - if err := b.StartAuthorities(); err != nil { - t.Fatal("b.StartAuthorities():", err) - } - for _, a := range msg.Authorities { - if err := b.NSResource(a.Header, *a.Body.(*NSResource)); err != nil { - t.Fatalf("b.NSResource(%#v): %v", a, err) - } - } - - if err := b.StartAdditionals(); err != nil { - t.Fatal("b.StartAdditionals():", err) - } - for _, a := range msg.Additionals { - if err := b.TXTResource(a.Header, *a.Body.(*TXTResource)); err != nil { - t.Fatalf("b.TXTResource(%#v): %v", a, err) - } - } - - got, err := b.Finish() - if err != nil { - t.Fatal("b.Finish():", err) - } - if !bytes.Equal(got, want) { - t.Fatalf("Got from Builder: %#v\nwant = %#v", got, want) - } -} - -func TestResourcePack(t *testing.T) { - for _, tt := range []struct { - m Message - err error - }{ - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Answers: []Resource{{ResourceHeader{}, nil}}, - }, - &nestedError{"packing Answer", errNilResouceBody}, - }, - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeAAAA, - Class: ClassINET, - }, - }, - Authorities: []Resource{{ResourceHeader{}, (*NSResource)(nil)}}, - }, - &nestedError{"packing Authority", - &nestedError{"ResourceHeader", - &nestedError{"Name", errNonCanonicalName}, - }, - }, - }, - { - Message{ - Questions: []Question{ - { - Name: mustNewName("."), - Type: TypeA, - Class: ClassINET, - }, - }, - Additionals: []Resource{{ResourceHeader{}, nil}}, - }, - &nestedError{"packing Additional", errNilResouceBody}, - }, - } { - _, err := tt.m.Pack() - if !reflect.DeepEqual(err, tt.err) { - t.Errorf("got %v for %v; want %v", err, tt.m, tt.err) - } - } -} - -func benchmarkParsingSetup() ([]byte, error) { - name := mustNewName("foo.bar.example.com.") - msg := Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &AResource{[4]byte{}}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &AAAAResource{[16]byte{}}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &CNAMEResource{name}, - }, - { - ResourceHeader{ - Name: name, - Class: ClassINET, - }, - &NSResource{name}, - }, - }, - } - - buf, err := msg.Pack() - if err != nil { - return nil, fmt.Errorf("msg.Pack(): %v", err) - } - return buf, nil -} - -func benchmarkParsing(tb testing.TB, buf []byte) { - var p Parser - if _, err := p.Start(buf); err != nil { - tb.Fatal("p.Start(buf):", err) - } - - for { - _, err := p.Question() - if err == ErrSectionDone { - break - } - if err != nil { - tb.Fatal("p.Question():", err) - } - } - - for { - h, err := p.AnswerHeader() - if err == ErrSectionDone { - break - } - if err != nil { - panic(err) - } - - switch h.Type { - case TypeA: - if _, err := p.AResource(); err != nil { - tb.Fatal("p.AResource():", err) - } - case TypeAAAA: - if _, err := p.AAAAResource(); err != nil { - tb.Fatal("p.AAAAResource():", err) - } - case TypeCNAME: - if _, err := p.CNAMEResource(); err != nil { - tb.Fatal("p.CNAMEResource():", err) - } - case TypeNS: - if _, err := p.NSResource(); err != nil { - tb.Fatal("p.NSResource():", err) - } - default: - tb.Fatalf("unknown type: %T", h) - } - } -} - -func BenchmarkParsing(b *testing.B) { - buf, err := benchmarkParsingSetup() - if err != nil { - b.Fatal(err) - } - - b.ReportAllocs() - for i := 0; i < b.N; i++ { - benchmarkParsing(b, buf) - } -} - -func TestParsingAllocs(t *testing.T) { - buf, err := benchmarkParsingSetup() - if err != nil { - t.Fatal(err) - } - - if allocs := testing.AllocsPerRun(100, func() { benchmarkParsing(t, buf) }); allocs > 0.5 { - t.Errorf("Allocations during parsing: got = %f, want ~0", allocs) - } -} - -func benchmarkBuildingSetup() (Name, []byte) { - name := mustNewName("foo.bar.example.com.") - buf := make([]byte, 0, packStartingCap) - return name, buf -} - -func benchmarkBuilding(tb testing.TB, name Name, buf []byte) { - bld := NewBuilder(buf, Header{Response: true, Authoritative: true}) - - if err := bld.StartQuestions(); err != nil { - tb.Fatal("bld.StartQuestions():", err) - } - q := Question{ - Name: name, - Type: TypeA, - Class: ClassINET, - } - if err := bld.Question(q); err != nil { - tb.Fatalf("bld.Question(%+v): %v", q, err) - } - - hdr := ResourceHeader{ - Name: name, - Class: ClassINET, - } - if err := bld.StartAnswers(); err != nil { - tb.Fatal("bld.StartQuestions():", err) - } - - ar := AResource{[4]byte{}} - if err := bld.AResource(hdr, ar); err != nil { - tb.Fatalf("bld.AResource(%+v, %+v): %v", hdr, ar, err) - } - - aaar := AAAAResource{[16]byte{}} - if err := bld.AAAAResource(hdr, aaar); err != nil { - tb.Fatalf("bld.AAAAResource(%+v, %+v): %v", hdr, aaar, err) - } - - cnr := CNAMEResource{name} - if err := bld.CNAMEResource(hdr, cnr); err != nil { - tb.Fatalf("bld.CNAMEResource(%+v, %+v): %v", hdr, cnr, err) - } - - nsr := NSResource{name} - if err := bld.NSResource(hdr, nsr); err != nil { - tb.Fatalf("bld.NSResource(%+v, %+v): %v", hdr, nsr, err) - } - - if _, err := bld.Finish(); err != nil { - tb.Fatal("bld.Finish():", err) - } -} - -func BenchmarkBuilding(b *testing.B) { - name, buf := benchmarkBuildingSetup() - b.ReportAllocs() - for i := 0; i < b.N; i++ { - benchmarkBuilding(b, name, buf) - } -} - -func TestBuildingAllocs(t *testing.T) { - name, buf := benchmarkBuildingSetup() - if allocs := testing.AllocsPerRun(100, func() { benchmarkBuilding(t, name, buf) }); allocs > 0.5 { - t.Errorf("Allocations during building: got = %f, want ~0", allocs) - } -} - -func smallTestMsg() Message { - name := mustNewName("example.com.") - return Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - Authorities: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - Additionals: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - }, - } -} - -func BenchmarkPack(b *testing.B) { - msg := largeTestMsg() - - b.ReportAllocs() - - for i := 0; i < b.N; i++ { - if _, err := msg.Pack(); err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkAppendPack(b *testing.B) { - msg := largeTestMsg() - buf := make([]byte, 0, packStartingCap) - - b.ReportAllocs() - - for i := 0; i < b.N; i++ { - if _, err := msg.AppendPack(buf[:0]); err != nil { - b.Fatal(err) - } - } -} - -func largeTestMsg() Message { - name := mustNewName("foo.bar.example.com.") - return Message{ - Header: Header{Response: true, Authoritative: true}, - Questions: []Question{ - { - Name: name, - Type: TypeA, - Class: ClassINET, - }, - }, - Answers: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 1}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeA, - Class: ClassINET, - }, - &AResource{[4]byte{127, 0, 0, 2}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeAAAA, - Class: ClassINET, - }, - &AAAAResource{[16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeCNAME, - Class: ClassINET, - }, - &CNAMEResource{mustNewName("alias.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeSOA, - Class: ClassINET, - }, - &SOAResource{ - NS: mustNewName("ns1.example.com."), - MBox: mustNewName("mb.example.com."), - Serial: 1, - Refresh: 2, - Retry: 3, - Expire: 4, - MinTTL: 5, - }, - }, - { - ResourceHeader{ - Name: name, - Type: TypePTR, - Class: ClassINET, - }, - &PTRResource{mustNewName("ptr.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeMX, - Class: ClassINET, - }, - &MXResource{ - 7, - mustNewName("mx.example.com."), - }, - }, - { - ResourceHeader{ - Name: name, - Type: TypeSRV, - Class: ClassINET, - }, - &SRVResource{ - 8, - 9, - 11, - mustNewName("srv.example.com."), - }, - }, - }, - Authorities: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeNS, - Class: ClassINET, - }, - &NSResource{mustNewName("ns1.example.com.")}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeNS, - Class: ClassINET, - }, - &NSResource{mustNewName("ns2.example.com.")}, - }, - }, - Additionals: []Resource{ - { - ResourceHeader{ - Name: name, - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{[]string{"So Long, and Thanks for All the Fish"}}, - }, - { - ResourceHeader{ - Name: name, - Type: TypeTXT, - Class: ClassINET, - }, - &TXTResource{[]string{"Hamster Huey and the Gooey Kablooie"}}, - }, - }, - } -} diff --git a/src/internal/x/net/http/httpguts/httplex_test.go b/src/internal/x/net/http/httpguts/httplex_test.go deleted file mode 100644 index a2c57f3927..0000000000 --- a/src/internal/x/net/http/httpguts/httplex_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// 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 httpguts - -import ( - "testing" -) - -func isChar(c rune) bool { return c <= 127 } - -func isCtl(c rune) bool { return c <= 31 || c == 127 } - -func isSeparator(c rune) bool { - switch c { - case '(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', '/', '[', ']', '?', '=', '{', '}', ' ', '\t': - return true - } - return false -} - -func TestIsToken(t *testing.T) { - for i := 0; i <= 130; i++ { - r := rune(i) - expected := isChar(r) && !isCtl(r) && !isSeparator(r) - if IsTokenRune(r) != expected { - t.Errorf("isToken(0x%x) = %v", r, !expected) - } - } -} - -func TestHeaderValuesContainsToken(t *testing.T) { - tests := []struct { - vals []string - token string - want bool - }{ - { - vals: []string{"foo"}, - token: "foo", - want: true, - }, - { - vals: []string{"bar", "foo"}, - token: "foo", - want: true, - }, - { - vals: []string{"foo"}, - token: "FOO", - want: true, - }, - { - vals: []string{"foo"}, - token: "bar", - want: false, - }, - { - vals: []string{" foo "}, - token: "FOO", - want: true, - }, - { - vals: []string{"foo,bar"}, - token: "FOO", - want: true, - }, - { - vals: []string{"bar,foo,bar"}, - token: "FOO", - want: true, - }, - { - vals: []string{"bar , foo"}, - token: "FOO", - want: true, - }, - { - vals: []string{"foo ,bar "}, - token: "FOO", - want: true, - }, - { - vals: []string{"bar, foo ,bar"}, - token: "FOO", - want: true, - }, - { - vals: []string{"bar , foo"}, - token: "FOO", - want: true, - }, - } - for _, tt := range tests { - got := HeaderValuesContainsToken(tt.vals, tt.token) - if got != tt.want { - t.Errorf("headerValuesContainsToken(%q, %q) = %v; want %v", tt.vals, tt.token, got, tt.want) - } - } -} - -func TestPunycodeHostPort(t *testing.T) { - tests := []struct { - in, want string - }{ - {"www.google.com", "www.google.com"}, - {"гофер.рф", "xn--c1ae0ajs.xn--p1ai"}, - {"bücher.de", "xn--bcher-kva.de"}, - {"bücher.de:8080", "xn--bcher-kva.de:8080"}, - {"[1::6]:8080", "[1::6]:8080"}, - } - for _, tt := range tests { - got, err := PunycodeHostPort(tt.in) - if tt.want != got || err != nil { - t.Errorf("PunycodeHostPort(%q) = %q, %v, want %q, nil", tt.in, got, err, tt.want) - } - } -} diff --git a/src/internal/x/net/http/httpproxy/export_test.go b/src/internal/x/net/http/httpproxy/export_test.go deleted file mode 100644 index 5d30018fbd..0000000000 --- a/src/internal/x/net/http/httpproxy/export_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 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 httpproxy - -func ExportUseProxy(cfg *Config, host string) bool { - cfg1 := &config{ - Config: *cfg, - } - cfg1.init() - return cfg1.useProxy(host) -} diff --git a/src/internal/x/net/http/httpproxy/proxy_test.go b/src/internal/x/net/http/httpproxy/proxy_test.go deleted file mode 100644 index cf0589dba9..0000000000 --- a/src/internal/x/net/http/httpproxy/proxy_test.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2017 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 httpproxy_test - -import ( - "bytes" - "errors" - "fmt" - "net/url" - "os" - "strings" - "testing" - - "internal/x/net/http/httpproxy" -) - -// setHelper calls t.Helper() for Go 1.9+ (see go19_test.go) and does nothing otherwise. -var setHelper = func(t *testing.T) {} - -type proxyForURLTest struct { - cfg httpproxy.Config - req string // URL to fetch; blank means "http://example.com" - want string - wanterr error -} - -func (t proxyForURLTest) String() string { - var buf bytes.Buffer - space := func() { - if buf.Len() > 0 { - buf.WriteByte(' ') - } - } - if t.cfg.HTTPProxy != "" { - fmt.Fprintf(&buf, "http_proxy=%q", t.cfg.HTTPProxy) - } - if t.cfg.HTTPSProxy != "" { - space() - fmt.Fprintf(&buf, "https_proxy=%q", t.cfg.HTTPSProxy) - } - if t.cfg.NoProxy != "" { - space() - fmt.Fprintf(&buf, "no_proxy=%q", t.cfg.NoProxy) - } - req := "http://example.com" - if t.req != "" { - req = t.req - } - space() - fmt.Fprintf(&buf, "req=%q", req) - return strings.TrimSpace(buf.String()) -} - -var proxyForURLTests = []proxyForURLTest{{ - cfg: httpproxy.Config{ - HTTPProxy: "127.0.0.1:8080", - }, - want: "http://127.0.0.1:8080", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "cache.corp.example.com:1234", - }, - want: "http://cache.corp.example.com:1234", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "cache.corp.example.com", - }, - want: "http://cache.corp.example.com", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "https://cache.corp.example.com", - }, - want: "https://cache.corp.example.com", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "http://127.0.0.1:8080", - }, - want: "http://127.0.0.1:8080", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "https://127.0.0.1:8080", - }, - want: "https://127.0.0.1:8080", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "socks5://127.0.0.1", - }, - want: "socks5://127.0.0.1", -}, { - // Don't use secure for http - cfg: httpproxy.Config{ - HTTPProxy: "http.proxy.tld", - HTTPSProxy: "secure.proxy.tld", - }, - req: "http://insecure.tld/", - want: "http://http.proxy.tld", -}, { - // Use secure for https. - cfg: httpproxy.Config{ - HTTPProxy: "http.proxy.tld", - HTTPSProxy: "secure.proxy.tld", - }, - req: "https://secure.tld/", - want: "http://secure.proxy.tld", -}, { - cfg: httpproxy.Config{ - HTTPProxy: "http.proxy.tld", - HTTPSProxy: "https://secure.proxy.tld", - }, - req: "https://secure.tld/", - want: "https://secure.proxy.tld", -}, { - // Issue 16405: don't use HTTP_PROXY in a CGI environment, - // where HTTP_PROXY can be attacker-controlled. - cfg: httpproxy.Config{ - HTTPProxy: "http://10.1.2.3:8080", - CGI: true, - }, - want: "", - wanterr: errors.New("refusing to use HTTP_PROXY value in CGI environment; see golang.org/s/cgihttpproxy"), -}, { - // HTTPS proxy is still used even in CGI environment. - // (perhaps dubious but it's the historical behaviour). - cfg: httpproxy.Config{ - HTTPSProxy: "https://secure.proxy.tld", - CGI: true, - }, - req: "https://secure.tld/", - want: "https://secure.proxy.tld", -}, { - want: "", -}, { - cfg: httpproxy.Config{ - NoProxy: "example.com", - HTTPProxy: "proxy", - }, - req: "http://example.com/", - want: "", -}, { - cfg: httpproxy.Config{ - NoProxy: ".example.com", - HTTPProxy: "proxy", - }, - req: "http://example.com/", - want: "http://proxy", -}, { - cfg: httpproxy.Config{ - NoProxy: "ample.com", - HTTPProxy: "proxy", - }, - req: "http://example.com/", - want: "http://proxy", -}, { - cfg: httpproxy.Config{ - NoProxy: "example.com", - HTTPProxy: "proxy", - }, - req: "http://foo.example.com/", - want: "", -}, { - cfg: httpproxy.Config{ - NoProxy: ".foo.com", - HTTPProxy: "proxy", - }, - req: "http://example.com/", - want: "http://proxy", -}} - -func testProxyForURL(t *testing.T, tt proxyForURLTest) { - setHelper(t) - reqURLStr := tt.req - if reqURLStr == "" { - reqURLStr = "http://example.com" - } - reqURL, err := url.Parse(reqURLStr) - if err != nil { - t.Errorf("invalid URL %q", reqURLStr) - return - } - cfg := tt.cfg - proxyForURL := cfg.ProxyFunc() - url, err := proxyForURL(reqURL) - if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e { - t.Errorf("%v: got error = %q, want %q", tt, g, e) - return - } - if got := fmt.Sprintf("%s", url); got != tt.want { - t.Errorf("%v: got URL = %q, want %q", tt, url, tt.want) - } - - // Check that changing the Config doesn't change the results - // of the functuon. - cfg = httpproxy.Config{} - url, err = proxyForURL(reqURL) - if g, e := fmt.Sprintf("%v", err), fmt.Sprintf("%v", tt.wanterr); g != e { - t.Errorf("(after mutating config) %v: got error = %q, want %q", tt, g, e) - return - } - if got := fmt.Sprintf("%s", url); got != tt.want { - t.Errorf("(after mutating config) %v: got URL = %q, want %q", tt, url, tt.want) - } -} - -func TestProxyForURL(t *testing.T) { - for _, tt := range proxyForURLTests { - testProxyForURL(t, tt) - } -} - -func TestFromEnvironment(t *testing.T) { - os.Setenv("HTTP_PROXY", "httpproxy") - os.Setenv("HTTPS_PROXY", "httpsproxy") - os.Setenv("NO_PROXY", "noproxy") - os.Setenv("REQUEST_METHOD", "") - got := httpproxy.FromEnvironment() - want := httpproxy.Config{ - HTTPProxy: "httpproxy", - HTTPSProxy: "httpsproxy", - NoProxy: "noproxy", - } - if *got != want { - t.Errorf("unexpected proxy config, got %#v want %#v", got, want) - } -} - -func TestFromEnvironmentWithRequestMethod(t *testing.T) { - os.Setenv("HTTP_PROXY", "httpproxy") - os.Setenv("HTTPS_PROXY", "httpsproxy") - os.Setenv("NO_PROXY", "noproxy") - os.Setenv("REQUEST_METHOD", "PUT") - got := httpproxy.FromEnvironment() - want := httpproxy.Config{ - HTTPProxy: "httpproxy", - HTTPSProxy: "httpsproxy", - NoProxy: "noproxy", - CGI: true, - } - if *got != want { - t.Errorf("unexpected proxy config, got %#v want %#v", got, want) - } -} - -func TestFromEnvironmentLowerCase(t *testing.T) { - os.Setenv("http_proxy", "httpproxy") - os.Setenv("https_proxy", "httpsproxy") - os.Setenv("no_proxy", "noproxy") - os.Setenv("REQUEST_METHOD", "") - got := httpproxy.FromEnvironment() - want := httpproxy.Config{ - HTTPProxy: "httpproxy", - HTTPSProxy: "httpsproxy", - NoProxy: "noproxy", - } - if *got != want { - t.Errorf("unexpected proxy config, got %#v want %#v", got, want) - } -} - -var UseProxyTests = []struct { - host string - match bool -}{ - // Never proxy localhost: - {"localhost", false}, - {"127.0.0.1", false}, - {"127.0.0.2", false}, - {"[::1]", false}, - {"[::2]", true}, // not a loopback address - - {"192.168.1.1", false}, // matches exact IPv4 - {"192.168.1.2", true}, // ports do not match - {"192.168.1.3", false}, // matches exact IPv4:port - {"192.168.1.4", true}, // no match - {"10.0.0.2", false}, // matches IPv4/CIDR - {"[2001:db8::52:0:1]", false}, // matches exact IPv6 - {"[2001:db8::52:0:2]", true}, // no match - {"[2001:db8::52:0:3]", false}, // matches exact [IPv6]:port - {"[2002:db8:a::123]", false}, // matches IPv6/CIDR - {"[fe80::424b:c8be:1643:a1b6]", true}, // no match - - {"barbaz.net", true}, // does not match as .barbaz.net - {"www.barbaz.net", false}, // does match as .barbaz.net - {"foobar.com", false}, // does match as foobar.com - {"www.foobar.com", false}, // match because NO_PROXY includes "foobar.com" - {"foofoobar.com", true}, // not match as a part of foobar.com - {"baz.com", true}, // not match as a part of barbaz.com - {"localhost.net", true}, // not match as suffix of address - {"local.localhost", true}, // not match as prefix as address - {"barbarbaz.net", true}, // not match, wrong domain - {"wildcard.io", true}, // does not match as *.wildcard.io - {"nested.wildcard.io", false}, // match as *.wildcard.io - {"awildcard.io", true}, // not a match because of '*' -} - -var noProxy = "foobar.com, .barbaz.net, *.wildcard.io, 192.168.1.1, 192.168.1.2:81, 192.168.1.3:80, 10.0.0.0/30, 2001:db8::52:0:1, [2001:db8::52:0:2]:443, [2001:db8::52:0:3]:80, 2002:db8:a::45/64" - -func TestUseProxy(t *testing.T) { - cfg := &httpproxy.Config{ - NoProxy: noProxy, - } - for _, test := range UseProxyTests { - if httpproxy.ExportUseProxy(cfg, test.host+":80") != test.match { - t.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match) - } - } -} - -func TestInvalidNoProxy(t *testing.T) { - cfg := &httpproxy.Config{ - NoProxy: ":1", - } - ok := httpproxy.ExportUseProxy(cfg, "example.com:80") // should not panic - if !ok { - t.Errorf("useProxy unexpected return; got false; want true") - } -} - -func TestAllNoProxy(t *testing.T) { - cfg := &httpproxy.Config{ - NoProxy: "*", - } - for _, test := range UseProxyTests { - if httpproxy.ExportUseProxy(cfg, test.host+":80") != false { - t.Errorf("useProxy(%v) = true, want false", test.host) - } - } -} - -func BenchmarkProxyForURL(b *testing.B) { - cfg := &httpproxy.Config{ - HTTPProxy: "http://proxy.example.org", - HTTPSProxy: "https://proxy.example.org", - NoProxy: noProxy, - } - for _, test := range UseProxyTests { - u, err := url.Parse("https://" + test.host + ":80") - if err != nil { - b.Fatalf("parsed failed: %s", test.host) - } - proxyFunc := cfg.ProxyFunc() - b.Run(test.host, func(b *testing.B) { - for n := 0; n < b.N; n++ { - if au, e := proxyFunc(u); e != nil && test.match == (au != nil) { - b.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match) - } - } - }) - } -} diff --git a/src/internal/x/net/http2/hpack/encode_test.go b/src/internal/x/net/http2/hpack/encode_test.go deleted file mode 100644 index 05f12db9cd..0000000000 --- a/src/internal/x/net/http2/hpack/encode_test.go +++ /dev/null @@ -1,386 +0,0 @@ -// Copyright 2014 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 hpack - -import ( - "bytes" - "encoding/hex" - "fmt" - "math/rand" - "reflect" - "strings" - "testing" -) - -func TestEncoderTableSizeUpdate(t *testing.T) { - tests := []struct { - size1, size2 uint32 - wantHex string - }{ - // Should emit 2 table size updates (2048 and 4096) - {2048, 4096, "3fe10f 3fe11f 82"}, - - // Should emit 1 table size update (2048) - {16384, 2048, "3fe10f 82"}, - } - for _, tt := range tests { - var buf bytes.Buffer - e := NewEncoder(&buf) - e.SetMaxDynamicTableSize(tt.size1) - e.SetMaxDynamicTableSize(tt.size2) - if err := e.WriteField(pair(":method", "GET")); err != nil { - t.Fatal(err) - } - want := removeSpace(tt.wantHex) - if got := hex.EncodeToString(buf.Bytes()); got != want { - t.Errorf("e.SetDynamicTableSize %v, %v = %q; want %q", tt.size1, tt.size2, got, want) - } - } -} - -func TestEncoderWriteField(t *testing.T) { - var buf bytes.Buffer - e := NewEncoder(&buf) - var got []HeaderField - d := NewDecoder(4<<10, func(f HeaderField) { - got = append(got, f) - }) - - tests := []struct { - hdrs []HeaderField - }{ - {[]HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - }}, - {[]HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - pair("cache-control", "no-cache"), - }}, - {[]HeaderField{ - pair(":method", "GET"), - pair(":scheme", "https"), - pair(":path", "/index.html"), - pair(":authority", "www.example.com"), - pair("custom-key", "custom-value"), - }}, - } - for i, tt := range tests { - buf.Reset() - got = got[:0] - for _, hf := range tt.hdrs { - if err := e.WriteField(hf); err != nil { - t.Fatal(err) - } - } - _, err := d.Write(buf.Bytes()) - if err != nil { - t.Errorf("%d. Decoder Write = %v", i, err) - } - if !reflect.DeepEqual(got, tt.hdrs) { - t.Errorf("%d. Decoded %+v; want %+v", i, got, tt.hdrs) - } - } -} - -func TestEncoderSearchTable(t *testing.T) { - e := NewEncoder(nil) - - e.dynTab.add(pair("foo", "bar")) - e.dynTab.add(pair("blake", "miz")) - e.dynTab.add(pair(":method", "GET")) - - tests := []struct { - hf HeaderField - wantI uint64 - wantMatch bool - }{ - // Name and Value match - {pair("foo", "bar"), uint64(staticTable.len()) + 3, true}, - {pair("blake", "miz"), uint64(staticTable.len()) + 2, true}, - {pair(":method", "GET"), 2, true}, - - // Only name match because Sensitive == true. This is allowed to match - // any ":method" entry. The current implementation uses the last entry - // added in newStaticTable. - {HeaderField{":method", "GET", true}, 3, false}, - - // Only Name matches - {pair("foo", "..."), uint64(staticTable.len()) + 3, false}, - {pair("blake", "..."), uint64(staticTable.len()) + 2, false}, - // As before, this is allowed to match any ":method" entry. - {pair(":method", "..."), 3, false}, - - // None match - {pair("foo-", "bar"), 0, false}, - } - for _, tt := range tests { - if gotI, gotMatch := e.searchTable(tt.hf); gotI != tt.wantI || gotMatch != tt.wantMatch { - t.Errorf("d.search(%+v) = %v, %v; want %v, %v", tt.hf, gotI, gotMatch, tt.wantI, tt.wantMatch) - } - } -} - -func TestAppendVarInt(t *testing.T) { - tests := []struct { - n byte - i uint64 - want []byte - }{ - // Fits in a byte: - {1, 0, []byte{0}}, - {2, 2, []byte{2}}, - {3, 6, []byte{6}}, - {4, 14, []byte{14}}, - {5, 30, []byte{30}}, - {6, 62, []byte{62}}, - {7, 126, []byte{126}}, - {8, 254, []byte{254}}, - - // Multiple bytes: - {5, 1337, []byte{31, 154, 10}}, - } - for _, tt := range tests { - got := appendVarInt(nil, tt.n, tt.i) - if !bytes.Equal(got, tt.want) { - t.Errorf("appendVarInt(nil, %v, %v) = %v; want %v", tt.n, tt.i, got, tt.want) - } - } -} - -func TestAppendHpackString(t *testing.T) { - tests := []struct { - s, wantHex string - }{ - // Huffman encoded - {"www.example.com", "8c f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, - - // Not Huffman encoded - {"a", "01 61"}, - - // zero length - {"", "00"}, - } - for _, tt := range tests { - want := removeSpace(tt.wantHex) - buf := appendHpackString(nil, tt.s) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("appendHpackString(nil, %q) = %q; want %q", tt.s, got, want) - } - } -} - -func TestAppendIndexed(t *testing.T) { - tests := []struct { - i uint64 - wantHex string - }{ - // 1 byte - {1, "81"}, - {126, "fe"}, - - // 2 bytes - {127, "ff00"}, - {128, "ff01"}, - } - for _, tt := range tests { - want := removeSpace(tt.wantHex) - buf := appendIndexed(nil, tt.i) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("appendIndex(nil, %v) = %q; want %q", tt.i, got, want) - } - } -} - -func TestAppendNewName(t *testing.T) { - tests := []struct { - f HeaderField - indexing bool - wantHex string - }{ - // Incremental indexing - {HeaderField{"custom-key", "custom-value", false}, true, "40 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, - - // Without indexing - {HeaderField{"custom-key", "custom-value", false}, false, "00 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, - - // Never indexed - {HeaderField{"custom-key", "custom-value", true}, true, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, - {HeaderField{"custom-key", "custom-value", true}, false, "10 88 25a8 49e9 5ba9 7d7f 89 25a8 49e9 5bb8 e8b4 bf"}, - } - for _, tt := range tests { - want := removeSpace(tt.wantHex) - buf := appendNewName(nil, tt.f, tt.indexing) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("appendNewName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) - } - } -} - -func TestAppendIndexedName(t *testing.T) { - tests := []struct { - f HeaderField - i uint64 - indexing bool - wantHex string - }{ - // Incremental indexing - {HeaderField{":status", "302", false}, 8, true, "48 82 6402"}, - - // Without indexing - {HeaderField{":status", "302", false}, 8, false, "08 82 6402"}, - - // Never indexed - {HeaderField{":status", "302", true}, 8, true, "18 82 6402"}, - {HeaderField{":status", "302", true}, 8, false, "18 82 6402"}, - } - for _, tt := range tests { - want := removeSpace(tt.wantHex) - buf := appendIndexedName(nil, tt.f, tt.i, tt.indexing) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("appendIndexedName(nil, %+v, %v) = %q; want %q", tt.f, tt.indexing, got, want) - } - } -} - -func TestAppendTableSize(t *testing.T) { - tests := []struct { - i uint32 - wantHex string - }{ - // Fits into 1 byte - {30, "3e"}, - - // Extra byte - {31, "3f00"}, - {32, "3f01"}, - } - for _, tt := range tests { - want := removeSpace(tt.wantHex) - buf := appendTableSize(nil, tt.i) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("appendTableSize(nil, %v) = %q; want %q", tt.i, got, want) - } - } -} - -func TestEncoderSetMaxDynamicTableSize(t *testing.T) { - var buf bytes.Buffer - e := NewEncoder(&buf) - tests := []struct { - v uint32 - wantUpdate bool - wantMinSize uint32 - wantMaxSize uint32 - }{ - // Set new table size to 2048 - {2048, true, 2048, 2048}, - - // Set new table size to 16384, but still limited to - // 4096 - {16384, true, 2048, 4096}, - } - for _, tt := range tests { - e.SetMaxDynamicTableSize(tt.v) - if got := e.tableSizeUpdate; tt.wantUpdate != got { - t.Errorf("e.tableSizeUpdate = %v; want %v", got, tt.wantUpdate) - } - if got := e.minSize; tt.wantMinSize != got { - t.Errorf("e.minSize = %v; want %v", got, tt.wantMinSize) - } - if got := e.dynTab.maxSize; tt.wantMaxSize != got { - t.Errorf("e.maxSize = %v; want %v", got, tt.wantMaxSize) - } - } -} - -func TestEncoderSetMaxDynamicTableSizeLimit(t *testing.T) { - e := NewEncoder(nil) - // 4095 < initialHeaderTableSize means maxSize is truncated to - // 4095. - e.SetMaxDynamicTableSizeLimit(4095) - if got, want := e.dynTab.maxSize, uint32(4095); got != want { - t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) - } - if got, want := e.maxSizeLimit, uint32(4095); got != want { - t.Errorf("e.maxSizeLimit = %v; want %v", got, want) - } - if got, want := e.tableSizeUpdate, true; got != want { - t.Errorf("e.tableSizeUpdate = %v; want %v", got, want) - } - // maxSize will be truncated to maxSizeLimit - e.SetMaxDynamicTableSize(16384) - if got, want := e.dynTab.maxSize, uint32(4095); got != want { - t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) - } - // 8192 > current maxSizeLimit, so maxSize does not change. - e.SetMaxDynamicTableSizeLimit(8192) - if got, want := e.dynTab.maxSize, uint32(4095); got != want { - t.Errorf("e.dynTab.maxSize = %v; want %v", got, want) - } - if got, want := e.maxSizeLimit, uint32(8192); got != want { - t.Errorf("e.maxSizeLimit = %v; want %v", got, want) - } -} - -func removeSpace(s string) string { - return strings.Replace(s, " ", "", -1) -} - -func BenchmarkEncoderSearchTable(b *testing.B) { - e := NewEncoder(nil) - - // A sample of possible header fields. - // This is not based on any actual data from HTTP/2 traces. - var possible []HeaderField - for _, f := range staticTable.ents { - if f.Value == "" { - possible = append(possible, f) - continue - } - // Generate 5 random values, except for cookie and set-cookie, - // which we know can have many values in practice. - num := 5 - if f.Name == "cookie" || f.Name == "set-cookie" { - num = 25 - } - for i := 0; i < num; i++ { - f.Value = fmt.Sprintf("%s-%d", f.Name, i) - possible = append(possible, f) - } - } - for k := 0; k < 10; k++ { - f := HeaderField{ - Name: fmt.Sprintf("x-header-%d", k), - Sensitive: rand.Int()%2 == 0, - } - for i := 0; i < 5; i++ { - f.Value = fmt.Sprintf("%s-%d", f.Name, i) - possible = append(possible, f) - } - } - - // Add a random sample to the dynamic table. This very loosely simulates - // a history of 100 requests with 20 header fields per request. - for r := 0; r < 100*20; r++ { - f := possible[rand.Int31n(int32(len(possible)))] - // Skip if this is in the staticTable verbatim. - if _, has := staticTable.search(f); !has { - e.dynTab.add(f) - } - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - for _, f := range possible { - e.searchTable(f) - } - } -} diff --git a/src/internal/x/net/http2/hpack/hpack_test.go b/src/internal/x/net/http2/hpack/hpack_test.go deleted file mode 100644 index a361a2a7c2..0000000000 --- a/src/internal/x/net/http2/hpack/hpack_test.go +++ /dev/null @@ -1,770 +0,0 @@ -// Copyright 2014 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 hpack - -import ( - "bytes" - "encoding/hex" - "fmt" - "math/rand" - "reflect" - "strings" - "testing" - "time" -) - -func (d *Decoder) mustAt(idx int) HeaderField { - if hf, ok := d.at(uint64(idx)); !ok { - panic(fmt.Sprintf("bogus index %d", idx)) - } else { - return hf - } -} - -func TestDynamicTableAt(t *testing.T) { - d := NewDecoder(4096, nil) - at := d.mustAt - if got, want := at(2), (pair(":method", "GET")); got != want { - t.Errorf("at(2) = %v; want %v", got, want) - } - d.dynTab.add(pair("foo", "bar")) - d.dynTab.add(pair("blake", "miz")) - if got, want := at(staticTable.len()+1), (pair("blake", "miz")); got != want { - t.Errorf("at(dyn 1) = %v; want %v", got, want) - } - if got, want := at(staticTable.len()+2), (pair("foo", "bar")); got != want { - t.Errorf("at(dyn 2) = %v; want %v", got, want) - } - if got, want := at(3), (pair(":method", "POST")); got != want { - t.Errorf("at(3) = %v; want %v", got, want) - } -} - -func TestDynamicTableSizeEvict(t *testing.T) { - d := NewDecoder(4096, nil) - if want := uint32(0); d.dynTab.size != want { - t.Fatalf("size = %d; want %d", d.dynTab.size, want) - } - add := d.dynTab.add - add(pair("blake", "eats pizza")) - if want := uint32(15 + 32); d.dynTab.size != want { - t.Fatalf("after pizza, size = %d; want %d", d.dynTab.size, want) - } - add(pair("foo", "bar")) - if want := uint32(15 + 32 + 6 + 32); d.dynTab.size != want { - t.Fatalf("after foo bar, size = %d; want %d", d.dynTab.size, want) - } - d.dynTab.setMaxSize(15 + 32 + 1 /* slop */) - if want := uint32(6 + 32); d.dynTab.size != want { - t.Fatalf("after setMaxSize, size = %d; want %d", d.dynTab.size, want) - } - if got, want := d.mustAt(staticTable.len()+1), (pair("foo", "bar")); got != want { - t.Errorf("at(dyn 1) = %v; want %v", got, want) - } - add(pair("long", strings.Repeat("x", 500))) - if want := uint32(0); d.dynTab.size != want { - t.Fatalf("after big one, size = %d; want %d", d.dynTab.size, want) - } -} - -func TestDecoderDecode(t *testing.T) { - tests := []struct { - name string - in []byte - want []HeaderField - wantDynTab []HeaderField // newest entry first - }{ - // C.2.1 Literal Header Field with Indexing - // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.1 - {"C.2.1", dehex("400a 6375 7374 6f6d 2d6b 6579 0d63 7573 746f 6d2d 6865 6164 6572"), - []HeaderField{pair("custom-key", "custom-header")}, - []HeaderField{pair("custom-key", "custom-header")}, - }, - - // C.2.2 Literal Header Field without Indexing - // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.2 - {"C.2.2", dehex("040c 2f73 616d 706c 652f 7061 7468"), - []HeaderField{pair(":path", "/sample/path")}, - []HeaderField{}}, - - // C.2.3 Literal Header Field never Indexed - // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.3 - {"C.2.3", dehex("1008 7061 7373 776f 7264 0673 6563 7265 74"), - []HeaderField{{"password", "secret", true}}, - []HeaderField{}}, - - // C.2.4 Indexed Header Field - // http://http2.github.io/http2-spec/compression.html#rfc.section.C.2.4 - {"C.2.4", []byte("\x82"), - []HeaderField{pair(":method", "GET")}, - []HeaderField{}}, - } - for _, tt := range tests { - d := NewDecoder(4096, nil) - hf, err := d.DecodeFull(tt.in) - if err != nil { - t.Errorf("%s: %v", tt.name, err) - continue - } - if !reflect.DeepEqual(hf, tt.want) { - t.Errorf("%s: Got %v; want %v", tt.name, hf, tt.want) - } - gotDynTab := d.dynTab.reverseCopy() - if !reflect.DeepEqual(gotDynTab, tt.wantDynTab) { - t.Errorf("%s: dynamic table after = %v; want %v", tt.name, gotDynTab, tt.wantDynTab) - } - } -} - -func (dt *dynamicTable) reverseCopy() (hf []HeaderField) { - hf = make([]HeaderField, len(dt.table.ents)) - for i := range hf { - hf[i] = dt.table.ents[len(dt.table.ents)-1-i] - } - return -} - -type encAndWant struct { - enc []byte - want []HeaderField - wantDynTab []HeaderField - wantDynSize uint32 -} - -// C.3 Request Examples without Huffman Coding -// http://http2.github.io/http2-spec/compression.html#rfc.section.C.3 -func TestDecodeC3_NoHuffman(t *testing.T) { - testDecodeSeries(t, 4096, []encAndWant{ - {dehex("8286 8441 0f77 7777 2e65 7861 6d70 6c65 2e63 6f6d"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - }, - []HeaderField{ - pair(":authority", "www.example.com"), - }, - 57, - }, - {dehex("8286 84be 5808 6e6f 2d63 6163 6865"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - pair("cache-control", "no-cache"), - }, - []HeaderField{ - pair("cache-control", "no-cache"), - pair(":authority", "www.example.com"), - }, - 110, - }, - {dehex("8287 85bf 400a 6375 7374 6f6d 2d6b 6579 0c63 7573 746f 6d2d 7661 6c75 65"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "https"), - pair(":path", "/index.html"), - pair(":authority", "www.example.com"), - pair("custom-key", "custom-value"), - }, - []HeaderField{ - pair("custom-key", "custom-value"), - pair("cache-control", "no-cache"), - pair(":authority", "www.example.com"), - }, - 164, - }, - }) -} - -// C.4 Request Examples with Huffman Coding -// http://http2.github.io/http2-spec/compression.html#rfc.section.C.4 -func TestDecodeC4_Huffman(t *testing.T) { - testDecodeSeries(t, 4096, []encAndWant{ - {dehex("8286 8441 8cf1 e3c2 e5f2 3a6b a0ab 90f4 ff"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - }, - []HeaderField{ - pair(":authority", "www.example.com"), - }, - 57, - }, - {dehex("8286 84be 5886 a8eb 1064 9cbf"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "http"), - pair(":path", "/"), - pair(":authority", "www.example.com"), - pair("cache-control", "no-cache"), - }, - []HeaderField{ - pair("cache-control", "no-cache"), - pair(":authority", "www.example.com"), - }, - 110, - }, - {dehex("8287 85bf 4088 25a8 49e9 5ba9 7d7f 8925 a849 e95b b8e8 b4bf"), - []HeaderField{ - pair(":method", "GET"), - pair(":scheme", "https"), - pair(":path", "/index.html"), - pair(":authority", "www.example.com"), - pair("custom-key", "custom-value"), - }, - []HeaderField{ - pair("custom-key", "custom-value"), - pair("cache-control", "no-cache"), - pair(":authority", "www.example.com"), - }, - 164, - }, - }) -} - -// http://http2.github.io/http2-spec/compression.html#rfc.section.C.5 -// "This section shows several consecutive header lists, corresponding -// to HTTP responses, on the same connection. The HTTP/2 setting -// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 -// octets, causing some evictions to occur." -func TestDecodeC5_ResponsesNoHuff(t *testing.T) { - testDecodeSeries(t, 256, []encAndWant{ - {dehex(` -4803 3330 3258 0770 7269 7661 7465 611d -4d6f 6e2c 2032 3120 4f63 7420 3230 3133 -2032 303a 3133 3a32 3120 474d 546e 1768 -7474 7073 3a2f 2f77 7777 2e65 7861 6d70 -6c65 2e63 6f6d -`), - []HeaderField{ - pair(":status", "302"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("location", "https://www.example.com"), - }, - []HeaderField{ - pair("location", "https://www.example.com"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("cache-control", "private"), - pair(":status", "302"), - }, - 222, - }, - {dehex("4803 3330 37c1 c0bf"), - []HeaderField{ - pair(":status", "307"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("location", "https://www.example.com"), - }, - []HeaderField{ - pair(":status", "307"), - pair("location", "https://www.example.com"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("cache-control", "private"), - }, - 222, - }, - {dehex(` -88c1 611d 4d6f 6e2c 2032 3120 4f63 7420 -3230 3133 2032 303a 3133 3a32 3220 474d -54c0 5a04 677a 6970 7738 666f 6f3d 4153 -444a 4b48 514b 425a 584f 5157 454f 5049 -5541 5851 5745 4f49 553b 206d 6178 2d61 -6765 3d33 3630 303b 2076 6572 7369 6f6e -3d31 -`), - []HeaderField{ - pair(":status", "200"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), - pair("location", "https://www.example.com"), - pair("content-encoding", "gzip"), - pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), - }, - []HeaderField{ - pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), - pair("content-encoding", "gzip"), - pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), - }, - 215, - }, - }) -} - -// http://http2.github.io/http2-spec/compression.html#rfc.section.C.6 -// "This section shows the same examples as the previous section, but -// using Huffman encoding for the literal values. The HTTP/2 setting -// parameter SETTINGS_HEADER_TABLE_SIZE is set to the value of 256 -// octets, causing some evictions to occur. The eviction mechanism -// uses the length of the decoded literal values, so the same -// evictions occurs as in the previous section." -func TestDecodeC6_ResponsesHuffman(t *testing.T) { - testDecodeSeries(t, 256, []encAndWant{ - {dehex(` -4882 6402 5885 aec3 771a 4b61 96d0 7abe -9410 54d4 44a8 2005 9504 0b81 66e0 82a6 -2d1b ff6e 919d 29ad 1718 63c7 8f0b 97c8 -e9ae 82ae 43d3 -`), - []HeaderField{ - pair(":status", "302"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("location", "https://www.example.com"), - }, - []HeaderField{ - pair("location", "https://www.example.com"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("cache-control", "private"), - pair(":status", "302"), - }, - 222, - }, - {dehex("4883 640e ffc1 c0bf"), - []HeaderField{ - pair(":status", "307"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("location", "https://www.example.com"), - }, - []HeaderField{ - pair(":status", "307"), - pair("location", "https://www.example.com"), - pair("date", "Mon, 21 Oct 2013 20:13:21 GMT"), - pair("cache-control", "private"), - }, - 222, - }, - {dehex(` -88c1 6196 d07a be94 1054 d444 a820 0595 -040b 8166 e084 a62d 1bff c05a 839b d9ab -77ad 94e7 821d d7f2 e6c7 b335 dfdf cd5b -3960 d5af 2708 7f36 72c1 ab27 0fb5 291f -9587 3160 65c0 03ed 4ee5 b106 3d50 07 -`), - []HeaderField{ - pair(":status", "200"), - pair("cache-control", "private"), - pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), - pair("location", "https://www.example.com"), - pair("content-encoding", "gzip"), - pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), - }, - []HeaderField{ - pair("set-cookie", "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"), - pair("content-encoding", "gzip"), - pair("date", "Mon, 21 Oct 2013 20:13:22 GMT"), - }, - 215, - }, - }) -} - -func testDecodeSeries(t *testing.T, size uint32, steps []encAndWant) { - d := NewDecoder(size, nil) - for i, step := range steps { - hf, err := d.DecodeFull(step.enc) - if err != nil { - t.Fatalf("Error at step index %d: %v", i, err) - } - if !reflect.DeepEqual(hf, step.want) { - t.Fatalf("At step index %d: Got headers %v; want %v", i, hf, step.want) - } - gotDynTab := d.dynTab.reverseCopy() - if !reflect.DeepEqual(gotDynTab, step.wantDynTab) { - t.Errorf("After step index %d, dynamic table = %v; want %v", i, gotDynTab, step.wantDynTab) - } - if d.dynTab.size != step.wantDynSize { - t.Errorf("After step index %d, dynamic table size = %v; want %v", i, d.dynTab.size, step.wantDynSize) - } - } -} - -func TestHuffmanDecodeExcessPadding(t *testing.T) { - tests := [][]byte{ - {0xff}, // Padding Exceeds 7 bits - {0x1f, 0xff}, // {"a", 1 byte excess padding} - {0x1f, 0xff, 0xff}, // {"a", 2 byte excess padding} - {0x1f, 0xff, 0xff, 0xff}, // {"a", 3 byte excess padding} - {0xff, 0x9f, 0xff, 0xff, 0xff}, // {"a", 29 bit excess padding} - {'R', 0xbc, '0', 0xff, 0xff, 0xff, 0xff}, // Padding ends on partial symbol. - } - for i, in := range tests { - var buf bytes.Buffer - if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { - t.Errorf("test-%d: decode(%q) = %v; want ErrInvalidHuffman", i, in, err) - } - } -} - -func TestHuffmanDecodeEOS(t *testing.T) { - in := []byte{0xff, 0xff, 0xff, 0xff, 0xfc} // {EOS, "?"} - var buf bytes.Buffer - if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { - t.Errorf("error = %v; want ErrInvalidHuffman", err) - } -} - -func TestHuffmanDecodeMaxLengthOnTrailingByte(t *testing.T) { - in := []byte{0x00, 0x01} // {"0", "0", "0"} - var buf bytes.Buffer - if err := huffmanDecode(&buf, 2, in); err != ErrStringLength { - t.Errorf("error = %v; want ErrStringLength", err) - } -} - -func TestHuffmanDecodeCorruptPadding(t *testing.T) { - in := []byte{0x00} - var buf bytes.Buffer - if _, err := HuffmanDecode(&buf, in); err != ErrInvalidHuffman { - t.Errorf("error = %v; want ErrInvalidHuffman", err) - } -} - -func TestHuffmanDecode(t *testing.T) { - tests := []struct { - inHex, want string - }{ - {"f1e3 c2e5 f23a 6ba0 ab90 f4ff", "www.example.com"}, - {"a8eb 1064 9cbf", "no-cache"}, - {"25a8 49e9 5ba9 7d7f", "custom-key"}, - {"25a8 49e9 5bb8 e8b4 bf", "custom-value"}, - {"6402", "302"}, - {"aec3 771a 4b", "private"}, - {"d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff", "Mon, 21 Oct 2013 20:13:21 GMT"}, - {"9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3", "https://www.example.com"}, - {"9bd9 ab", "gzip"}, - {"94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07", - "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"}, - } - for i, tt := range tests { - var buf bytes.Buffer - in, err := hex.DecodeString(strings.Replace(tt.inHex, " ", "", -1)) - if err != nil { - t.Errorf("%d. hex input error: %v", i, err) - continue - } - if _, err := HuffmanDecode(&buf, in); err != nil { - t.Errorf("%d. decode error: %v", i, err) - continue - } - if got := buf.String(); tt.want != got { - t.Errorf("%d. decode = %q; want %q", i, got, tt.want) - } - } -} - -func BenchmarkHuffmanDecode(b *testing.B) { - b.StopTimer() - enc, err := hex.DecodeString(strings.Replace("94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07", - " ", "", -1)) - if err != nil { - b.Fatal(err) - } - b.ReportAllocs() - b.StartTimer() - var buf bytes.Buffer - for i := 0; i < b.N; i++ { - buf.Reset() - if _, err := HuffmanDecode(&buf, enc); err != nil { - b.Fatalf("decode error: %v", err) - } - if string(buf.Bytes()) != "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" { - b.Fatalf("bogus output %q", buf.Bytes()) - } - } -} - -func TestAppendHuffmanString(t *testing.T) { - tests := []struct { - in, want string - }{ - {"www.example.com", "f1e3 c2e5 f23a 6ba0 ab90 f4ff"}, - {"no-cache", "a8eb 1064 9cbf"}, - {"custom-key", "25a8 49e9 5ba9 7d7f"}, - {"custom-value", "25a8 49e9 5bb8 e8b4 bf"}, - {"302", "6402"}, - {"private", "aec3 771a 4b"}, - {"Mon, 21 Oct 2013 20:13:21 GMT", "d07a be94 1054 d444 a820 0595 040b 8166 e082 a62d 1bff"}, - {"https://www.example.com", "9d29 ad17 1863 c78f 0b97 c8e9 ae82 ae43 d3"}, - {"gzip", "9bd9 ab"}, - {"foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", - "94e7 821d d7f2 e6c7 b335 dfdf cd5b 3960 d5af 2708 7f36 72c1 ab27 0fb5 291f 9587 3160 65c0 03ed 4ee5 b106 3d50 07"}, - } - for i, tt := range tests { - buf := []byte{} - want := strings.Replace(tt.want, " ", "", -1) - buf = AppendHuffmanString(buf, tt.in) - if got := hex.EncodeToString(buf); want != got { - t.Errorf("%d. encode = %q; want %q", i, got, want) - } - } -} - -func TestHuffmanMaxStrLen(t *testing.T) { - const msg = "Some string" - huff := AppendHuffmanString(nil, msg) - - testGood := func(max int) { - var out bytes.Buffer - if err := huffmanDecode(&out, max, huff); err != nil { - t.Errorf("For maxLen=%d, unexpected error: %v", max, err) - } - if out.String() != msg { - t.Errorf("For maxLen=%d, out = %q; want %q", max, out.String(), msg) - } - } - testGood(0) - testGood(len(msg)) - testGood(len(msg) + 1) - - var out bytes.Buffer - if err := huffmanDecode(&out, len(msg)-1, huff); err != ErrStringLength { - t.Errorf("err = %v; want ErrStringLength", err) - } -} - -func TestHuffmanRoundtripStress(t *testing.T) { - const Len = 50 // of uncompressed string - input := make([]byte, Len) - var output bytes.Buffer - var huff []byte - - n := 5000 - if testing.Short() { - n = 100 - } - seed := time.Now().UnixNano() - t.Logf("Seed = %v", seed) - src := rand.New(rand.NewSource(seed)) - var encSize int64 - for i := 0; i < n; i++ { - for l := range input { - input[l] = byte(src.Intn(256)) - } - huff = AppendHuffmanString(huff[:0], string(input)) - encSize += int64(len(huff)) - output.Reset() - if err := huffmanDecode(&output, 0, huff); err != nil { - t.Errorf("Failed to decode %q -> %q -> error %v", input, huff, err) - continue - } - if !bytes.Equal(output.Bytes(), input) { - t.Errorf("Roundtrip failure on %q -> %q -> %q", input, huff, output.Bytes()) - } - } - t.Logf("Compressed size of original: %0.02f%% (%v -> %v)", 100*(float64(encSize)/(Len*float64(n))), Len*n, encSize) -} - -func TestHuffmanDecodeFuzz(t *testing.T) { - const Len = 50 // of compressed - var buf, zbuf bytes.Buffer - - n := 5000 - if testing.Short() { - n = 100 - } - seed := time.Now().UnixNano() - t.Logf("Seed = %v", seed) - src := rand.New(rand.NewSource(seed)) - numFail := 0 - for i := 0; i < n; i++ { - zbuf.Reset() - if i == 0 { - // Start with at least one invalid one. - zbuf.WriteString("00\x91\xff\xff\xff\xff\xc8") - } else { - for l := 0; l < Len; l++ { - zbuf.WriteByte(byte(src.Intn(256))) - } - } - - buf.Reset() - if err := huffmanDecode(&buf, 0, zbuf.Bytes()); err != nil { - if err == ErrInvalidHuffman { - numFail++ - continue - } - t.Errorf("Failed to decode %q: %v", zbuf.Bytes(), err) - continue - } - } - t.Logf("%0.02f%% are invalid (%d / %d)", 100*float64(numFail)/float64(n), numFail, n) - if numFail < 1 { - t.Error("expected at least one invalid huffman encoding (test starts with one)") - } -} - -func TestReadVarInt(t *testing.T) { - type res struct { - i uint64 - consumed int - err error - } - tests := []struct { - n byte - p []byte - want res - }{ - // Fits in a byte: - {1, []byte{0}, res{0, 1, nil}}, - {2, []byte{2}, res{2, 1, nil}}, - {3, []byte{6}, res{6, 1, nil}}, - {4, []byte{14}, res{14, 1, nil}}, - {5, []byte{30}, res{30, 1, nil}}, - {6, []byte{62}, res{62, 1, nil}}, - {7, []byte{126}, res{126, 1, nil}}, - {8, []byte{254}, res{254, 1, nil}}, - - // Doesn't fit in a byte: - {1, []byte{1}, res{0, 0, errNeedMore}}, - {2, []byte{3}, res{0, 0, errNeedMore}}, - {3, []byte{7}, res{0, 0, errNeedMore}}, - {4, []byte{15}, res{0, 0, errNeedMore}}, - {5, []byte{31}, res{0, 0, errNeedMore}}, - {6, []byte{63}, res{0, 0, errNeedMore}}, - {7, []byte{127}, res{0, 0, errNeedMore}}, - {8, []byte{255}, res{0, 0, errNeedMore}}, - - // Ignoring top bits: - {5, []byte{255, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 111 - {5, []byte{159, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 100 - {5, []byte{191, 154, 10}, res{1337, 3, nil}}, // high dummy three bits: 101 - - // Extra byte: - {5, []byte{191, 154, 10, 2}, res{1337, 3, nil}}, // extra byte - - // Short a byte: - {5, []byte{191, 154}, res{0, 0, errNeedMore}}, - - // integer overflow: - {1, []byte{255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128}, res{0, 0, errVarintOverflow}}, - } - for _, tt := range tests { - i, remain, err := readVarInt(tt.n, tt.p) - consumed := len(tt.p) - len(remain) - got := res{i, consumed, err} - if got != tt.want { - t.Errorf("readVarInt(%d, %v ~ %x) = %+v; want %+v", tt.n, tt.p, tt.p, got, tt.want) - } - } -} - -// Fuzz crash, originally reported at https://github.com/bradfitz/http2/issues/56 -func TestHuffmanFuzzCrash(t *testing.T) { - got, err := HuffmanDecodeToString([]byte("00\x91\xff\xff\xff\xff\xc8")) - if got != "" { - t.Errorf("Got %q; want empty string", got) - } - if err != ErrInvalidHuffman { - t.Errorf("Err = %v; want ErrInvalidHuffman", err) - } -} - -func pair(name, value string) HeaderField { - return HeaderField{Name: name, Value: value} -} - -func dehex(s string) []byte { - s = strings.Replace(s, " ", "", -1) - s = strings.Replace(s, "\n", "", -1) - b, err := hex.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -func TestEmitEnabled(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) - enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) - - numCallback := 0 - var dec *Decoder - dec = NewDecoder(8<<20, func(HeaderField) { - numCallback++ - dec.SetEmitEnabled(false) - }) - if !dec.EmitEnabled() { - t.Errorf("initial emit enabled = false; want true") - } - if _, err := dec.Write(buf.Bytes()); err != nil { - t.Error(err) - } - if numCallback != 1 { - t.Errorf("num callbacks = %d; want 1", numCallback) - } - if dec.EmitEnabled() { - t.Errorf("emit enabled = true; want false") - } -} - -func TestSaveBufLimit(t *testing.T) { - const maxStr = 1 << 10 - var got []HeaderField - dec := NewDecoder(initialHeaderTableSize, func(hf HeaderField) { - got = append(got, hf) - }) - dec.SetMaxStringLength(maxStr) - var frag []byte - frag = append(frag[:0], encodeTypeByte(false, false)) - frag = appendVarInt(frag, 7, 3) - frag = append(frag, "foo"...) - frag = appendVarInt(frag, 7, 3) - frag = append(frag, "bar"...) - - if _, err := dec.Write(frag); err != nil { - t.Fatal(err) - } - - want := []HeaderField{{Name: "foo", Value: "bar"}} - if !reflect.DeepEqual(got, want) { - t.Errorf("After small writes, got %v; want %v", got, want) - } - - frag = append(frag[:0], encodeTypeByte(false, false)) - frag = appendVarInt(frag, 7, maxStr*3) - frag = append(frag, make([]byte, maxStr*3)...) - - _, err := dec.Write(frag) - if err != ErrStringLength { - t.Fatalf("Write error = %v; want ErrStringLength", err) - } -} - -func TestDynamicSizeUpdate(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - enc.SetMaxDynamicTableSize(255) - enc.WriteField(HeaderField{Name: "foo", Value: "bar"}) - - d := NewDecoder(4096, func(_ HeaderField) {}) - _, err := d.Write(buf.Bytes()) - if err != nil { - t.Fatalf("unexpected error: got = %v", err) - } - - d.Close() - - // Start a new header - _, err = d.Write(buf.Bytes()) - if err != nil { - t.Fatalf("unexpected error: got = %v", err) - } - - // must fail since the dynamic table update must be at the beginning - _, err = d.Write(buf.Bytes()) - if err == nil { - t.Fatalf("dynamic table size update not at the beginning of a header block") - } -} diff --git a/src/internal/x/net/http2/hpack/tables_test.go b/src/internal/x/net/http2/hpack/tables_test.go deleted file mode 100644 index d963f36354..0000000000 --- a/src/internal/x/net/http2/hpack/tables_test.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2017 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 hpack - -import ( - "bufio" - "regexp" - "strconv" - "strings" - "testing" -) - -func TestHeaderFieldTable(t *testing.T) { - table := &headerFieldTable{} - table.init() - table.addEntry(pair("key1", "value1-1")) - table.addEntry(pair("key2", "value2-1")) - table.addEntry(pair("key1", "value1-2")) - table.addEntry(pair("key3", "value3-1")) - table.addEntry(pair("key4", "value4-1")) - table.addEntry(pair("key2", "value2-2")) - - // Tests will be run twice: once before evicting anything, and - // again after evicting the three oldest entries. - tests := []struct { - f HeaderField - beforeWantStaticI uint64 - beforeWantMatch bool - afterWantStaticI uint64 - afterWantMatch bool - }{ - {HeaderField{"key1", "value1-1", false}, 1, true, 0, false}, - {HeaderField{"key1", "value1-2", false}, 3, true, 0, false}, - {HeaderField{"key1", "value1-3", false}, 3, false, 0, false}, - {HeaderField{"key2", "value2-1", false}, 2, true, 3, false}, - {HeaderField{"key2", "value2-2", false}, 6, true, 3, true}, - {HeaderField{"key2", "value2-3", false}, 6, false, 3, false}, - {HeaderField{"key4", "value4-1", false}, 5, true, 2, true}, - // Name match only, because sensitive. - {HeaderField{"key4", "value4-1", true}, 5, false, 2, false}, - // Key not found. - {HeaderField{"key5", "value5-x", false}, 0, false, 0, false}, - } - - staticToDynamic := func(i uint64) uint64 { - if i == 0 { - return 0 - } - return uint64(table.len()) - i + 1 // dynamic is the reversed table - } - - searchStatic := func(f HeaderField) (uint64, bool) { - old := staticTable - staticTable = table - defer func() { staticTable = old }() - return staticTable.search(f) - } - - searchDynamic := func(f HeaderField) (uint64, bool) { - return table.search(f) - } - - for _, test := range tests { - gotI, gotMatch := searchStatic(test.f) - if wantI, wantMatch := test.beforeWantStaticI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { - t.Errorf("before evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) - } - gotI, gotMatch = searchDynamic(test.f) - wantDynamicI := staticToDynamic(test.beforeWantStaticI) - if wantI, wantMatch := wantDynamicI, test.beforeWantMatch; gotI != wantI || gotMatch != wantMatch { - t.Errorf("before evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) - } - } - - table.evictOldest(3) - - for _, test := range tests { - gotI, gotMatch := searchStatic(test.f) - if wantI, wantMatch := test.afterWantStaticI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { - t.Errorf("after evictions: searchStatic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) - } - gotI, gotMatch = searchDynamic(test.f) - wantDynamicI := staticToDynamic(test.afterWantStaticI) - if wantI, wantMatch := wantDynamicI, test.afterWantMatch; gotI != wantI || gotMatch != wantMatch { - t.Errorf("after evictions: searchDynamic(%+v)=%v,%v want %v,%v", test.f, gotI, gotMatch, wantI, wantMatch) - } - } -} - -func TestHeaderFieldTable_LookupMapEviction(t *testing.T) { - table := &headerFieldTable{} - table.init() - table.addEntry(pair("key1", "value1-1")) - table.addEntry(pair("key2", "value2-1")) - table.addEntry(pair("key1", "value1-2")) - table.addEntry(pair("key3", "value3-1")) - table.addEntry(pair("key4", "value4-1")) - table.addEntry(pair("key2", "value2-2")) - - // evict all pairs - table.evictOldest(table.len()) - - if l := table.len(); l > 0 { - t.Errorf("table.len() = %d, want 0", l) - } - - if l := len(table.byName); l > 0 { - t.Errorf("len(table.byName) = %d, want 0", l) - } - - if l := len(table.byNameValue); l > 0 { - t.Errorf("len(table.byNameValue) = %d, want 0", l) - } -} - -func TestStaticTable(t *testing.T) { - fromSpec := ` - +-------+-----------------------------+---------------+ - | 1 | :authority | | - | 2 | :method | GET | - | 3 | :method | POST | - | 4 | :path | / | - | 5 | :path | /index.html | - | 6 | :scheme | http | - | 7 | :scheme | https | - | 8 | :status | 200 | - | 9 | :status | 204 | - | 10 | :status | 206 | - | 11 | :status | 304 | - | 12 | :status | 400 | - | 13 | :status | 404 | - | 14 | :status | 500 | - | 15 | accept-charset | | - | 16 | accept-encoding | gzip, deflate | - | 17 | accept-language | | - | 18 | accept-ranges | | - | 19 | accept | | - | 20 | access-control-allow-origin | | - | 21 | age | | - | 22 | allow | | - | 23 | authorization | | - | 24 | cache-control | | - | 25 | content-disposition | | - | 26 | content-encoding | | - | 27 | content-language | | - | 28 | content-length | | - | 29 | content-location | | - | 30 | content-range | | - | 31 | content-type | | - | 32 | cookie | | - | 33 | date | | - | 34 | etag | | - | 35 | expect | | - | 36 | expires | | - | 37 | from | | - | 38 | host | | - | 39 | if-match | | - | 40 | if-modified-since | | - | 41 | if-none-match | | - | 42 | if-range | | - | 43 | if-unmodified-since | | - | 44 | last-modified | | - | 45 | link | | - | 46 | location | | - | 47 | max-forwards | | - | 48 | proxy-authenticate | | - | 49 | proxy-authorization | | - | 50 | range | | - | 51 | referer | | - | 52 | refresh | | - | 53 | retry-after | | - | 54 | server | | - | 55 | set-cookie | | - | 56 | strict-transport-security | | - | 57 | transfer-encoding | | - | 58 | user-agent | | - | 59 | vary | | - | 60 | via | | - | 61 | www-authenticate | | - +-------+-----------------------------+---------------+ -` - bs := bufio.NewScanner(strings.NewReader(fromSpec)) - re := regexp.MustCompile(`\| (\d+)\s+\| (\S+)\s*\| (\S(.*\S)?)?\s+\|`) - for bs.Scan() { - l := bs.Text() - if !strings.Contains(l, "|") { - continue - } - m := re.FindStringSubmatch(l) - if m == nil { - continue - } - i, err := strconv.Atoi(m[1]) - if err != nil { - t.Errorf("Bogus integer on line %q", l) - continue - } - if i < 1 || i > staticTable.len() { - t.Errorf("Bogus index %d on line %q", i, l) - continue - } - if got, want := staticTable.ents[i-1].Name, m[2]; got != want { - t.Errorf("header index %d name = %q; want %q", i, got, want) - } - if got, want := staticTable.ents[i-1].Value, m[3]; got != want { - t.Errorf("header index %d value = %q; want %q", i, got, want) - } - } - if err := bs.Err(); err != nil { - t.Error(err) - } -} diff --git a/src/internal/x/net/idna/punycode_test.go b/src/internal/x/net/idna/punycode_test.go deleted file mode 100644 index bfec81decd..0000000000 --- a/src/internal/x/net/idna/punycode_test.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2012 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 idna - -import ( - "strings" - "testing" -) - -var punycodeTestCases = [...]struct { - s, encoded string -}{ - {"", ""}, - {"-", "--"}, - {"-a", "-a-"}, - {"-a-", "-a--"}, - {"a", "a-"}, - {"a-", "a--"}, - {"a-b", "a-b-"}, - {"books", "books-"}, - {"bücher", "bcher-kva"}, - {"Hello世界", "Hello-ck1hg65u"}, - {"ü", "tda"}, - {"üý", "tdac"}, - - // The test cases below come from RFC 3492 section 7.1 with Errata 3026. - { - // (A) Arabic (Egyptian). - "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + - "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", - "egbpdaj6bu4bxfgehfvwxn", - }, - { - // (B) Chinese (simplified). - "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", - "ihqwcrb4cv8a8dqg056pqjye", - }, - { - // (C) Chinese (traditional). - "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", - "ihqwctvzc91f659drss3x8bo0yb", - }, - { - // (D) Czech. - "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + - "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + - "\u0065\u0073\u006B\u0079", - "Proprostnemluvesky-uyb24dma41a", - }, - { - // (E) Hebrew. - "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + - "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + - "\u05D1\u05E8\u05D9\u05EA", - "4dbcagdahymbxekheh6e0a7fei0b", - }, - { - // (F) Hindi (Devanagari). - "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + - "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + - "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + - "\u0939\u0948\u0902", - "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", - }, - { - // (G) Japanese (kanji and hiragana). - "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + - "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", - "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", - }, - { - // (H) Korean (Hangul syllables). - "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + - "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + - "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", - "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + - "psd879ccm6fea98c", - }, - { - // (I) Russian (Cyrillic). - "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + - "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + - "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + - "\u0438", - "b1abfaaepdrnnbgefbadotcwatmq2g4l", - }, - { - // (J) Spanish. - "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + - "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + - "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + - "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + - "\u0061\u00F1\u006F\u006C", - "PorqunopuedensimplementehablarenEspaol-fmd56a", - }, - { - // (K) Vietnamese. - "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + - "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + - "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + - "\u0056\u0069\u1EC7\u0074", - "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", - }, - { - // (L) 3B. - "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", - "3B-ww4c5e180e575a65lsy2b", - }, - { - // (M) -with-SUPER-MONKEYS. - "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + - "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + - "\u004F\u004E\u004B\u0045\u0059\u0053", - "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", - }, - { - // (N) Hello-Another-Way-. - "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + - "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + - "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", - "Hello-Another-Way--fc4qua05auwb3674vfr0b", - }, - { - // (O) 2. - "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", - "2-u9tlzr9756bt3uc0v", - }, - { - // (P) MajiKoi5 - "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + - "\u308B\u0035\u79D2\u524D", - "MajiKoi5-783gue6qz075azm5e", - }, - { - // (Q) de - "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", - "de-jg4avhby1noc0d", - }, - { - // (R) - "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", - "d9juau41awczczp", - }, - { - // (S) -> $1.00 <- - "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + - "\u003C\u002D", - "-> $1.00 <--", - }, -} - -func TestPunycode(t *testing.T) { - for _, tc := range punycodeTestCases { - if got, err := decode(tc.encoded); err != nil { - t.Errorf("decode(%q): %v", tc.encoded, err) - } else if got != tc.s { - t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) - } - - if got, err := encode("", tc.s); err != nil { - t.Errorf(`encode("", %q): %v`, tc.s, err) - } else if got != tc.encoded { - t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) - } - } -} - -var punycodeErrorTestCases = [...]string{ - "decode -", // A sole '-' is invalid. - "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. - "decode foo#bar", // '#' is not in [0-9A-Za-z]. - "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. - "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. - "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. - "decode 9999999999a", // "9999999999a" overflows the int32 calculation. - - "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. -} - -func TestPunycodeErrors(t *testing.T) { - for _, tc := range punycodeErrorTestCases { - var err error - switch { - case strings.HasPrefix(tc, "decode "): - _, err = decode(tc[7:]) - case strings.HasPrefix(tc, "encode "): - _, err = encode("", tc[7:]) - } - if err == nil { - if len(tc) > 256 { - tc = tc[:100] + "..." + tc[len(tc)-100:] - } - t.Errorf("no error for %s", tc) - } - } -} diff --git a/src/internal/x/net/internal/nettest/helper_bsd.go b/src/internal/x/net/internal/nettest/helper_bsd.go deleted file mode 100644 index a6e433b58c..0000000000 --- a/src/internal/x/net/internal/nettest/helper_bsd.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2016 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. - -// +build darwin dragonfly freebsd netbsd openbsd - -package nettest - -import ( - "runtime" - "strconv" - "strings" - "syscall" -) - -var darwinVersion int - -func init() { - if runtime.GOOS == "darwin" { - // See http://support.apple.com/kb/HT1633. - s, err := syscall.Sysctl("kern.osrelease") - if err != nil { - return - } - ss := strings.Split(s, ".") - if len(ss) == 0 { - return - } - darwinVersion, _ = strconv.Atoi(ss[0]) - } -} - -func supportsIPv6MulticastDeliveryOnLoopback() bool { - switch runtime.GOOS { - case "freebsd": - // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. - // Even after the fix, it looks like the latest - // kernels don't deliver link-local scoped multicast - // packets correctly. - return false - case "darwin": - return !causesIPv6Crash() - default: - return true - } -} - -func causesIPv6Crash() bool { - // We see some kernel crash when running IPv6 with IP-level - // options on Darwin kernel version 12 or below. - // See golang.org/issues/17015. - return darwinVersion < 13 -} diff --git a/src/internal/x/net/internal/nettest/helper_nobsd.go b/src/internal/x/net/internal/nettest/helper_nobsd.go deleted file mode 100644 index 1611a907f0..0000000000 --- a/src/internal/x/net/internal/nettest/helper_nobsd.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 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. - -// +build aix linux solaris - -package nettest - -func supportsIPv6MulticastDeliveryOnLoopback() bool { - return true -} - -func causesIPv6Crash() bool { - return false -} diff --git a/src/internal/x/net/internal/nettest/helper_posix.go b/src/internal/x/net/internal/nettest/helper_posix.go deleted file mode 100644 index efc67a8eba..0000000000 --- a/src/internal/x/net/internal/nettest/helper_posix.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows - -package nettest - -import ( - "os" - "syscall" -) - -func protocolNotSupported(err error) bool { - switch err := err.(type) { - case syscall.Errno: - switch err { - case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: - return true - } - case *os.SyscallError: - switch err := err.Err.(type) { - case syscall.Errno: - switch err { - case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: - return true - } - } - } - return false -} diff --git a/src/internal/x/net/internal/nettest/helper_stub.go b/src/internal/x/net/internal/nettest/helper_stub.go deleted file mode 100644 index d89cf29962..0000000000 --- a/src/internal/x/net/internal/nettest/helper_stub.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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. - -// +build js nacl plan9 - -package nettest - -import ( - "fmt" - "runtime" -) - -func maxOpenFiles() int { - return defaultMaxOpenFiles -} - -func supportsRawIPSocket() (string, bool) { - return fmt.Sprintf("not supported on %s", runtime.GOOS), false -} - -func supportsIPv6MulticastDeliveryOnLoopback() bool { - return false -} - -func causesIPv6Crash() bool { - return false -} - -func protocolNotSupported(err error) bool { - return false -} diff --git a/src/internal/x/net/internal/nettest/helper_unix.go b/src/internal/x/net/internal/nettest/helper_unix.go deleted file mode 100644 index b6839dcd8f..0000000000 --- a/src/internal/x/net/internal/nettest/helper_unix.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 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. - -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris - -package nettest - -import ( - "fmt" - "os" - "runtime" - "syscall" -) - -func maxOpenFiles() int { - var rlim syscall.Rlimit - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { - return defaultMaxOpenFiles - } - return int(rlim.Cur) -} - -func supportsRawIPSocket() (string, bool) { - if os.Getuid() != 0 { - return fmt.Sprintf("must be root on %s", runtime.GOOS), false - } - return "", true -} diff --git a/src/internal/x/net/internal/nettest/helper_windows.go b/src/internal/x/net/internal/nettest/helper_windows.go deleted file mode 100644 index 3dcb727c95..0000000000 --- a/src/internal/x/net/internal/nettest/helper_windows.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 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 nettest - -import ( - "fmt" - "runtime" - "syscall" -) - -func maxOpenFiles() int { - return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ -} - -func supportsRawIPSocket() (string, bool) { - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx: - // Note: To use a socket of type SOCK_RAW requires administrative privileges. - // Users running Winsock applications that use raw sockets must be a member of - // the Administrators group on the local computer, otherwise raw socket calls - // will fail with an error code of WSAEACCES. On Windows Vista and later, access - // for raw sockets is enforced at socket creation. In earlier versions of Windows, - // access for raw sockets is enforced during other socket operations. - s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0) - if err == syscall.WSAEACCES { - return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false - } - if err != nil { - return err.Error(), false - } - syscall.Closesocket(s) - return "", true -} - -func supportsIPv6MulticastDeliveryOnLoopback() bool { - return true -} - -func causesIPv6Crash() bool { - return false -} diff --git a/src/internal/x/net/internal/nettest/interface.go b/src/internal/x/net/internal/nettest/interface.go deleted file mode 100644 index 8e6333afe1..0000000000 --- a/src/internal/x/net/internal/nettest/interface.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2012 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 nettest - -import "net" - -// IsMulticastCapable reports whether ifi is an IP multicast-capable -// network interface. Network must be "ip", "ip4" or "ip6". -func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) { - switch network { - case "ip", "ip4", "ip6": - default: - return nil, false - } - if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { - return nil, false - } - return hasRoutableIP(network, ifi) -} - -// RoutedInterface returns a network interface that can route IP -// traffic and satisfies flags. It returns nil when an appropriate -// network interface is not found. Network must be "ip", "ip4" or -// "ip6". -func RoutedInterface(network string, flags net.Flags) *net.Interface { - switch network { - case "ip", "ip4", "ip6": - default: - return nil - } - ift, err := net.Interfaces() - if err != nil { - return nil - } - for _, ifi := range ift { - if ifi.Flags&flags != flags { - continue - } - if _, ok := hasRoutableIP(network, &ifi); !ok { - continue - } - return &ifi - } - return nil -} - -func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) { - ifat, err := ifi.Addrs() - if err != nil { - return nil, false - } - for _, ifa := range ifat { - switch ifa := ifa.(type) { - case *net.IPAddr: - if ip := routableIP(network, ifa.IP); ip != nil { - return ip, true - } - case *net.IPNet: - if ip := routableIP(network, ifa.IP); ip != nil { - return ip, true - } - } - } - return nil, false -} - -func routableIP(network string, ip net.IP) net.IP { - if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { - return nil - } - switch network { - case "ip4": - if ip := ip.To4(); ip != nil { - return ip - } - case "ip6": - if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation - return nil - } - if ip := ip.To16(); ip != nil && ip.To4() == nil { - return ip - } - default: - if ip := ip.To4(); ip != nil { - return ip - } - if ip := ip.To16(); ip != nil { - return ip - } - } - return nil -} diff --git a/src/internal/x/net/internal/nettest/rlimit.go b/src/internal/x/net/internal/nettest/rlimit.go deleted file mode 100644 index bb34aec0bb..0000000000 --- a/src/internal/x/net/internal/nettest/rlimit.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2015 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 nettest - -const defaultMaxOpenFiles = 256 - -// MaxOpenFiles returns the maximum number of open files for the -// caller's process. -func MaxOpenFiles() int { return maxOpenFiles() } diff --git a/src/internal/x/net/internal/nettest/stack.go b/src/internal/x/net/internal/nettest/stack.go deleted file mode 100644 index 1a545e21ab..0000000000 --- a/src/internal/x/net/internal/nettest/stack.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2014 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 nettest provides utilities for network testing. -package nettest - -import ( - "fmt" - "io/ioutil" - "net" - "os" - "runtime" -) - -var ( - supportsIPv4 bool - supportsIPv6 bool -) - -func init() { - if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { - ln.Close() - supportsIPv4 = true - } - if ln, err := net.Listen("tcp6", "[::1]:0"); err == nil { - ln.Close() - supportsIPv6 = true - } -} - -// SupportsIPv4 reports whether the platform supports IPv4 networking -// functionality. -func SupportsIPv4() bool { return supportsIPv4 } - -// SupportsIPv6 reports whether the platform supports IPv6 networking -// functionality. -func SupportsIPv6() bool { return supportsIPv6 } - -// SupportsRawIPSocket reports whether the platform supports raw IP -// sockets. -func SupportsRawIPSocket() (string, bool) { - return supportsRawIPSocket() -} - -// SupportsIPv6MulticastDeliveryOnLoopback reports whether the -// platform supports IPv6 multicast packet delivery on software -// loopback interface. -func SupportsIPv6MulticastDeliveryOnLoopback() bool { - return supportsIPv6MulticastDeliveryOnLoopback() -} - -// ProtocolNotSupported reports whether err is a protocol not -// supported error. -func ProtocolNotSupported(err error) bool { - return protocolNotSupported(err) -} - -// TestableNetwork reports whether network is testable on the current -// platform configuration. -func TestableNetwork(network string) bool { - // This is based on logic from standard library's - // net/platform_test.go. - switch network { - case "unix", "unixgram": - switch runtime.GOOS { - case "android", "js", "nacl", "plan9", "windows": - return false - } - if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { - return false - } - case "unixpacket": - switch runtime.GOOS { - case "aix", "android", "darwin", "freebsd", "js", "nacl", "plan9", "windows": - return false - case "netbsd": - // It passes on amd64 at least. 386 fails (Issue 22927). arm is unknown. - if runtime.GOARCH == "386" { - return false - } - } - } - return true -} - -// NewLocalListener returns a listener which listens to a loopback IP -// address or local file system path. -// Network must be "tcp", "tcp4", "tcp6", "unix" or "unixpacket". -func NewLocalListener(network string) (net.Listener, error) { - switch network { - case "tcp": - if supportsIPv4 { - if ln, err := net.Listen("tcp4", "127.0.0.1:0"); err == nil { - return ln, nil - } - } - if supportsIPv6 { - return net.Listen("tcp6", "[::1]:0") - } - case "tcp4": - if supportsIPv4 { - return net.Listen("tcp4", "127.0.0.1:0") - } - case "tcp6": - if supportsIPv6 { - return net.Listen("tcp6", "[::1]:0") - } - case "unix", "unixpacket": - return net.Listen(network, localPath()) - } - return nil, fmt.Errorf("%s is not supported", network) -} - -// NewLocalPacketListener returns a packet listener which listens to a -// loopback IP address or local file system path. -// Network must be "udp", "udp4", "udp6" or "unixgram". -func NewLocalPacketListener(network string) (net.PacketConn, error) { - switch network { - case "udp": - if supportsIPv4 { - if c, err := net.ListenPacket("udp4", "127.0.0.1:0"); err == nil { - return c, nil - } - } - if supportsIPv6 { - return net.ListenPacket("udp6", "[::1]:0") - } - case "udp4": - if supportsIPv4 { - return net.ListenPacket("udp4", "127.0.0.1:0") - } - case "udp6": - if supportsIPv6 { - return net.ListenPacket("udp6", "[::1]:0") - } - case "unixgram": - return net.ListenPacket(network, localPath()) - } - return nil, fmt.Errorf("%s is not supported", network) -} - -func localPath() string { - f, err := ioutil.TempFile("", "nettest") - if err != nil { - panic(err) - } - path := f.Name() - f.Close() - os.Remove(path) - return path -} diff --git a/src/internal/x/net/lif/address_test.go b/src/internal/x/net/lif/address_test.go deleted file mode 100644 index a25f10b67a..0000000000 --- a/src/internal/x/net/lif/address_test.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2016 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. - -// +build solaris - -package lif - -import ( - "fmt" - "testing" -) - -type addrFamily int - -func (af addrFamily) String() string { - switch af { - case sysAF_UNSPEC: - return "unspec" - case sysAF_INET: - return "inet4" - case sysAF_INET6: - return "inet6" - default: - return fmt.Sprintf("%d", af) - } -} - -const hexDigit = "0123456789abcdef" - -type llAddr []byte - -func (a llAddr) String() string { - if len(a) == 0 { - return "" - } - buf := make([]byte, 0, len(a)*3-1) - for i, b := range a { - if i > 0 { - buf = append(buf, ':') - } - buf = append(buf, hexDigit[b>>4]) - buf = append(buf, hexDigit[b&0xF]) - } - return string(buf) -} - -type ipAddr []byte - -func (a ipAddr) String() string { - if len(a) == 0 { - return "" - } - if len(a) == 4 { - return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) - } - if len(a) == 16 { - return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) - } - s := make([]byte, len(a)*2) - for i, tn := range a { - s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] - } - return string(s) -} - -func (a *Inet4Addr) String() string { - return fmt.Sprintf("(%s %s %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen) -} - -func (a *Inet6Addr) String() string { - return fmt.Sprintf("(%s %s %d %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.PrefixLen, a.ZoneID) -} - -type addrPack struct { - af int - as []Addr -} - -func addrPacks() ([]addrPack, error) { - var lastErr error - var aps []addrPack - for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - as, err := Addrs(af, "") - if err != nil { - lastErr = err - continue - } - aps = append(aps, addrPack{af: af, as: as}) - } - return aps, lastErr -} - -func TestAddrs(t *testing.T) { - aps, err := addrPacks() - if len(aps) == 0 && err != nil { - t.Fatal(err) - } - lps, err := linkPacks() - if len(lps) == 0 && err != nil { - t.Fatal(err) - } - for _, lp := range lps { - n := 0 - for _, ll := range lp.lls { - as, err := Addrs(lp.af, ll.Name) - if err != nil { - t.Fatal(lp.af, ll.Name, err) - } - t.Logf("af=%s name=%s %v", addrFamily(lp.af), ll.Name, as) - n += len(as) - } - for _, ap := range aps { - if ap.af != lp.af { - continue - } - if n != len(ap.as) { - t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(ap.as)) - continue - } - } - } -} diff --git a/src/internal/x/net/lif/link_test.go b/src/internal/x/net/lif/link_test.go deleted file mode 100644 index 0cb9b95c69..0000000000 --- a/src/internal/x/net/lif/link_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2016 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. - -// +build solaris - -package lif - -import ( - "fmt" - "testing" -) - -func (ll *Link) String() string { - return fmt.Sprintf("name=%s index=%d type=%d flags=%#x mtu=%d addr=%v", ll.Name, ll.Index, ll.Type, ll.Flags, ll.MTU, llAddr(ll.Addr)) -} - -type linkPack struct { - af int - lls []Link -} - -func linkPacks() ([]linkPack, error) { - var lastErr error - var lps []linkPack - for _, af := range [...]int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - lls, err := Links(af, "") - if err != nil { - lastErr = err - continue - } - lps = append(lps, linkPack{af: af, lls: lls}) - } - return lps, lastErr -} - -func TestLinks(t *testing.T) { - lps, err := linkPacks() - if len(lps) == 0 && err != nil { - t.Fatal(err) - } - for _, lp := range lps { - n := 0 - for _, sll := range lp.lls { - lls, err := Links(lp.af, sll.Name) - if err != nil { - t.Fatal(lp.af, sll.Name, err) - } - for _, ll := range lls { - if ll.Name != sll.Name || ll.Index != sll.Index { - t.Errorf("af=%s got %v; want %v", addrFamily(lp.af), &ll, &sll) - continue - } - t.Logf("af=%s name=%s %v", addrFamily(lp.af), sll.Name, &ll) - n++ - } - } - if n != len(lp.lls) { - t.Errorf("af=%s got %d; want %d", addrFamily(lp.af), n, len(lp.lls)) - continue - } - } -} diff --git a/src/internal/x/net/nettest/conntest_test.go b/src/internal/x/net/nettest/conntest_test.go deleted file mode 100644 index e14df0e6fb..0000000000 --- a/src/internal/x/net/nettest/conntest_test.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2016 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. - -// +build go1.8 - -package nettest - -import ( - "net" - "os" - "runtime" - "testing" - - "internal/x/net/internal/nettest" -) - -func TestTestConn(t *testing.T) { - tests := []struct{ name, network string }{ - {"TCP", "tcp"}, - {"UnixPipe", "unix"}, - {"UnixPacketPipe", "unixpacket"}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if !nettest.TestableNetwork(tt.network) { - t.Skipf("not supported on %s", runtime.GOOS) - } - - mp := func() (c1, c2 net.Conn, stop func(), err error) { - ln, err := nettest.NewLocalListener(tt.network) - if err != nil { - return nil, nil, nil, err - } - - // Start a connection between two endpoints. - var err1, err2 error - done := make(chan bool) - go func() { - c2, err2 = ln.Accept() - close(done) - }() - c1, err1 = net.Dial(ln.Addr().Network(), ln.Addr().String()) - <-done - - stop = func() { - if err1 == nil { - c1.Close() - } - if err2 == nil { - c2.Close() - } - ln.Close() - switch tt.network { - case "unix", "unixpacket": - os.Remove(ln.Addr().String()) - } - } - - switch { - case err1 != nil: - stop() - return nil, nil, nil, err1 - case err2 != nil: - stop() - return nil, nil, nil, err2 - default: - return c1, c2, stop, nil - } - } - - TestConn(t, mp) - }) - } -} diff --git a/src/internal/x/net/route/address_darwin_test.go b/src/internal/x/net/route/address_darwin_test.go deleted file mode 100644 index b86bd3df1f..0000000000 --- a/src/internal/x/net/route/address_darwin_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2016 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 route - -import ( - "reflect" - "testing" -) - -type parseAddrsOnDarwinTest struct { - attrs uint - fn func(int, []byte) (int, Addr, error) - b []byte - as []Addr -} - -var parseAddrsOnDarwinLittleEndianTests = []parseAddrsOnDarwinTest{ - { - sysRTA_DST | sysRTA_GATEWAY | sysRTA_NETMASK, - parseKernelInetAddr, - []byte{ - 0x10, 0x2, 0x0, 0x0, 0xc0, 0xa8, 0x56, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - 0x14, 0x12, 0x4, 0x0, 0x6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - }, - []Addr{ - &Inet4Addr{IP: [4]byte{192, 168, 86, 0}}, - &LinkAddr{Index: 4}, - &Inet4Addr{IP: [4]byte{255, 255, 255, 255}}, - nil, - nil, - nil, - nil, - nil, - }, - }, -} - -func TestParseAddrsOnDarwin(t *testing.T) { - tests := parseAddrsOnDarwinLittleEndianTests - if nativeEndian != littleEndian { - t.Skip("no test for non-little endian machine yet") - } - - for i, tt := range tests { - as, err := parseAddrs(tt.attrs, tt.fn, tt.b) - if err != nil { - t.Error(i, err) - continue - } - if !reflect.DeepEqual(as, tt.as) { - t.Errorf("#%d: got %+v; want %+v", i, as, tt.as) - continue - } - } -} diff --git a/src/internal/x/net/route/address_test.go b/src/internal/x/net/route/address_test.go deleted file mode 100644 index 2005ef7c20..0000000000 --- a/src/internal/x/net/route/address_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2016 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. - -// +build darwin dragonfly freebsd netbsd openbsd - -package route - -import ( - "reflect" - "testing" -) - -type parseAddrsTest struct { - attrs uint - fn func(int, []byte) (int, Addr, error) - b []byte - as []Addr -} - -var parseAddrsLittleEndianTests = []parseAddrsTest{ - { - sysRTA_DST | sysRTA_GATEWAY | sysRTA_NETMASK | sysRTA_BRD, - parseKernelInetAddr, - []byte{ - 0x38, 0x12, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - 0x38, 0x12, 0x2, 0x0, 0x6, 0x3, 0x6, 0x0, - 0x65, 0x6d, 0x31, 0x0, 0xc, 0x29, 0x66, 0x2c, - 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - 0x10, 0x2, 0x0, 0x0, 0xac, 0x10, 0xdc, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - 0x10, 0x2, 0x0, 0x0, 0xac, 0x10, 0xdc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - }, - []Addr{ - &LinkAddr{Index: 0}, - &LinkAddr{Index: 2, Name: "em1", Addr: []byte{0x00, 0x0c, 0x29, 0x66, 0x2c, 0xdc}}, - &Inet4Addr{IP: [4]byte{172, 16, 220, 180}}, - nil, - nil, - nil, - nil, - &Inet4Addr{IP: [4]byte{172, 16, 220, 255}}, - }, - }, - { - sysRTA_NETMASK | sysRTA_IFP | sysRTA_IFA, - parseKernelInetAddr, - []byte{ - 0x7, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, - - 0x18, 0x12, 0xa, 0x0, 0x87, 0x8, 0x0, 0x0, - 0x76, 0x6c, 0x61, 0x6e, 0x35, 0x36, 0x38, 0x32, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - 0x10, 0x2, 0x0, 0x0, 0xa9, 0xfe, 0x0, 0x1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - }, - []Addr{ - nil, - nil, - &Inet4Addr{IP: [4]byte{255, 255, 255, 0}}, - nil, - &LinkAddr{Index: 10, Name: "vlan5682"}, - &Inet4Addr{IP: [4]byte{169, 254, 0, 1}}, - nil, - nil, - }, - }, -} - -func TestParseAddrs(t *testing.T) { - tests := parseAddrsLittleEndianTests - if nativeEndian != littleEndian { - t.Skip("no test for non-little endian machine yet") - } - - for i, tt := range tests { - as, err := parseAddrs(tt.attrs, tt.fn, tt.b) - if err != nil { - t.Error(i, err) - continue - } - as = as[:8] // the list varies between operating systems - if !reflect.DeepEqual(as, tt.as) { - t.Errorf("#%d: got %+v; want %+v", i, as, tt.as) - continue - } - } -} diff --git a/src/internal/x/net/route/message_darwin_test.go b/src/internal/x/net/route/message_darwin_test.go deleted file mode 100644 index 316aa75071..0000000000 --- a/src/internal/x/net/route/message_darwin_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2016 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 route - -import "testing" - -func TestFetchAndParseRIBOnDarwin(t *testing.T) { - for _, typ := range []RIBType{sysNET_RT_FLAGS, sysNET_RT_DUMP2, sysNET_RT_IFLIST2} { - var lastErr error - var ms []Message - for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - rs, err := fetchAndParseRIB(af, typ) - if err != nil { - lastErr = err - continue - } - ms = append(ms, rs...) - } - if len(ms) == 0 && lastErr != nil { - t.Error(typ, lastErr) - continue - } - ss, err := msgs(ms).validate() - if err != nil { - t.Error(typ, err) - continue - } - for _, s := range ss { - t.Log(s) - } - } -} diff --git a/src/internal/x/net/route/message_freebsd_test.go b/src/internal/x/net/route/message_freebsd_test.go deleted file mode 100644 index c6d8a5f54c..0000000000 --- a/src/internal/x/net/route/message_freebsd_test.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2016 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 route - -import "testing" - -func TestFetchAndParseRIBOnFreeBSD(t *testing.T) { - for _, typ := range []RIBType{sysNET_RT_IFMALIST} { - var lastErr error - var ms []Message - for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - rs, err := fetchAndParseRIB(af, typ) - if err != nil { - lastErr = err - continue - } - ms = append(ms, rs...) - } - if len(ms) == 0 && lastErr != nil { - t.Error(typ, lastErr) - continue - } - ss, err := msgs(ms).validate() - if err != nil { - t.Error(typ, err) - continue - } - for _, s := range ss { - t.Log(s) - } - } -} - -func TestFetchAndParseRIBOnFreeBSD10AndAbove(t *testing.T) { - if _, err := FetchRIB(sysAF_UNSPEC, sysNET_RT_IFLISTL, 0); err != nil { - t.Skip("NET_RT_IFLISTL not supported") - } - if compatFreeBSD32 { - t.Skip("NET_RT_IFLIST vs. NET_RT_IFLISTL doesn't work for 386 emulation on amd64") - } - - var tests = [2]struct { - typ RIBType - b []byte - msgs []Message - ss []string - }{ - {typ: sysNET_RT_IFLIST}, - {typ: sysNET_RT_IFLISTL}, - } - for i := range tests { - var lastErr error - for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - rs, err := fetchAndParseRIB(af, tests[i].typ) - if err != nil { - lastErr = err - continue - } - tests[i].msgs = append(tests[i].msgs, rs...) - } - if len(tests[i].msgs) == 0 && lastErr != nil { - t.Error(tests[i].typ, lastErr) - continue - } - tests[i].ss, lastErr = msgs(tests[i].msgs).validate() - if lastErr != nil { - t.Error(tests[i].typ, lastErr) - continue - } - for _, s := range tests[i].ss { - t.Log(s) - } - } - for i := len(tests) - 1; i > 0; i-- { - if len(tests[i].ss) != len(tests[i-1].ss) { - t.Errorf("got %v; want %v", tests[i].ss, tests[i-1].ss) - continue - } - for j, s1 := range tests[i].ss { - s0 := tests[i-1].ss[j] - if s1 != s0 { - t.Errorf("got %s; want %s", s1, s0) - } - } - } -} diff --git a/src/internal/x/net/route/message_test.go b/src/internal/x/net/route/message_test.go deleted file mode 100644 index e848dabf4f..0000000000 --- a/src/internal/x/net/route/message_test.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2016 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. - -// +build darwin dragonfly freebsd netbsd openbsd - -package route - -import ( - "os" - "syscall" - "testing" - "time" -) - -func TestFetchAndParseRIB(t *testing.T) { - for _, typ := range []RIBType{sysNET_RT_DUMP, sysNET_RT_IFLIST} { - var lastErr error - var ms []Message - for _, af := range []int{sysAF_UNSPEC, sysAF_INET, sysAF_INET6} { - rs, err := fetchAndParseRIB(af, typ) - if err != nil { - lastErr = err - continue - } - ms = append(ms, rs...) - } - if len(ms) == 0 && lastErr != nil { - t.Error(typ, lastErr) - continue - } - ss, err := msgs(ms).validate() - if err != nil { - t.Error(typ, err) - continue - } - for _, s := range ss { - t.Log(typ, s) - } - } -} - -var ( - rtmonSock int - rtmonErr error -) - -func init() { - // We need to keep rtmonSock alive to avoid treading on - // recycled socket descriptors. - rtmonSock, rtmonErr = syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) -} - -// TestMonitorAndParseRIB leaks a worker goroutine and a socket -// descriptor but that's intentional. -func TestMonitorAndParseRIB(t *testing.T) { - if testing.Short() || os.Getuid() != 0 { - t.Skip("must be root") - } - - if rtmonErr != nil { - t.Fatal(rtmonErr) - } - - // We suppose that using an IPv4 link-local address and the - // dot1Q ID for Token Ring and FDDI doesn't harm anyone. - pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} - if err := pv.configure(1002); err != nil { - t.Skip(err) - } - if err := pv.setup(); err != nil { - t.Skip(err) - } - pv.teardown() - - go func() { - b := make([]byte, os.Getpagesize()) - for { - // There's no easy way to unblock this read - // call because the routing message exchange - // over routing socket is a connectionless - // message-oriented protocol, no control plane - // for signaling connectivity, and we cannot - // use the net package of standard library due - // to the lack of support for routing socket - // and circular dependency. - n, err := syscall.Read(rtmonSock, b) - if err != nil { - return - } - ms, err := ParseRIB(0, b[:n]) - if err != nil { - t.Error(err) - return - } - ss, err := msgs(ms).validate() - if err != nil { - t.Error(err) - return - } - for _, s := range ss { - t.Log(s) - } - } - }() - - for _, vid := range []int{1002, 1003, 1004, 1005} { - pv := &propVirtual{addr: "169.254.0.1", mask: "255.255.255.0"} - if err := pv.configure(vid); err != nil { - t.Fatal(err) - } - if err := pv.setup(); err != nil { - t.Fatal(err) - } - time.Sleep(200 * time.Millisecond) - if err := pv.teardown(); err != nil { - t.Fatal(err) - } - time.Sleep(200 * time.Millisecond) - } -} - -func TestParseRIBWithFuzz(t *testing.T) { - for _, fuzz := range []string{ - "0\x00\x05\x050000000000000000" + - "00000000000000000000" + - "00000000000000000000" + - "00000000000000000000" + - "0000000000000\x02000000" + - "00000000", - "\x02\x00\x05\f0000000000000000" + - "0\x0200000000000000", - "\x02\x00\x05\x100000000000000\x1200" + - "0\x00\xff\x00", - "\x02\x00\x05\f0000000000000000" + - "0\x12000\x00\x02\x0000", - "\x00\x00\x00\x01\x00", - "00000", - } { - for typ := RIBType(0); typ < 256; typ++ { - ParseRIB(typ, []byte(fuzz)) - } - } -} - -func TestRouteMessage(t *testing.T) { - s, err := syscall.Socket(sysAF_ROUTE, sysSOCK_RAW, sysAF_UNSPEC) - if err != nil { - t.Fatal(err) - } - defer syscall.Close(s) - - var ms []RouteMessage - for _, af := range []int{sysAF_INET, sysAF_INET6} { - if _, err := fetchAndParseRIB(af, sysNET_RT_DUMP); err != nil { - t.Log(err) - continue - } - switch af { - case sysAF_INET: - ms = append(ms, []RouteMessage{ - { - Type: sysRTM_GET, - Addrs: []Addr{ - &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, - nil, - nil, - nil, - &LinkAddr{}, - &Inet4Addr{}, - nil, - &Inet4Addr{}, - }, - }, - { - Type: sysRTM_GET, - Addrs: []Addr{ - &Inet4Addr{IP: [4]byte{127, 0, 0, 1}}, - }, - }, - }...) - case sysAF_INET6: - ms = append(ms, []RouteMessage{ - { - Type: sysRTM_GET, - Addrs: []Addr{ - &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, - nil, - nil, - nil, - &LinkAddr{}, - &Inet6Addr{}, - nil, - &Inet6Addr{}, - }, - }, - { - Type: sysRTM_GET, - Addrs: []Addr{ - &Inet6Addr{IP: [16]byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}, - }, - }, - }...) - } - } - for i, m := range ms { - m.ID = uintptr(os.Getpid()) - m.Seq = i + 1 - wb, err := m.Marshal() - if err != nil { - t.Fatalf("%v: %v", m, err) - } - if _, err := syscall.Write(s, wb); err != nil { - t.Fatalf("%v: %v", m, err) - } - rb := make([]byte, os.Getpagesize()) - n, err := syscall.Read(s, rb) - if err != nil { - t.Fatalf("%v: %v", m, err) - } - rms, err := ParseRIB(0, rb[:n]) - if err != nil { - t.Fatalf("%v: %v", m, err) - } - for _, rm := range rms { - err := rm.(*RouteMessage).Err - if err != nil { - t.Errorf("%v: %v", m, err) - } - } - ss, err := msgs(rms).validate() - if err != nil { - t.Fatalf("%v: %v", m, err) - } - for _, s := range ss { - t.Log(s) - } - } -} diff --git a/src/internal/x/net/route/route_test.go b/src/internal/x/net/route/route_test.go deleted file mode 100644 index 61bd174543..0000000000 --- a/src/internal/x/net/route/route_test.go +++ /dev/null @@ -1,390 +0,0 @@ -// Copyright 2016 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. - -// +build darwin dragonfly freebsd netbsd openbsd - -package route - -import ( - "fmt" - "os/exec" - "runtime" - "time" -) - -func (m *RouteMessage) String() string { - return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[12:16]))) -} - -func (m *InterfaceMessage) String() string { - var attrs addrAttrs - if runtime.GOOS == "openbsd" { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) - } else { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) - } - return fmt.Sprintf("%s", attrs) -} - -func (m *InterfaceAddrMessage) String() string { - var attrs addrAttrs - if runtime.GOOS == "openbsd" { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) - } else { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) - } - return fmt.Sprintf("%s", attrs) -} - -func (m *InterfaceMulticastAddrMessage) String() string { - return fmt.Sprintf("%s", addrAttrs(nativeEndian.Uint32(m.raw[4:8]))) -} - -func (m *InterfaceAnnounceMessage) String() string { - what := "" - switch m.What { - case 0: - what = "arrival" - case 1: - what = "departure" - } - return fmt.Sprintf("(%d %s %s)", m.Index, m.Name, what) -} - -func (m *InterfaceMetrics) String() string { - return fmt.Sprintf("(type=%d mtu=%d)", m.Type, m.MTU) -} - -func (m *RouteMetrics) String() string { - return fmt.Sprintf("(pmtu=%d)", m.PathMTU) -} - -type addrAttrs uint - -var addrAttrNames = [...]string{ - "dst", - "gateway", - "netmask", - "genmask", - "ifp", - "ifa", - "author", - "brd", - "df:mpls1-n:tag-o:src", // mpls1 for dragonfly, tag for netbsd, src for openbsd - "df:mpls2-o:srcmask", // mpls2 for dragonfly, srcmask for openbsd - "df:mpls3-o:label", // mpls3 for dragonfly, label for openbsd - "o:bfd", // bfd for openbsd - "o:dns", // dns for openbsd - "o:static", // static for openbsd - "o:search", // search for openbsd -} - -func (attrs addrAttrs) String() string { - var s string - for i, name := range addrAttrNames { - if attrs&(1<" - } - return s -} - -type msgs []Message - -func (ms msgs) validate() ([]string, error) { - var ss []string - for _, m := range ms { - switch m := m.(type) { - case *RouteMessage: - if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[12:16]))); err != nil { - return nil, err - } - sys := m.Sys() - if sys == nil { - return nil, fmt.Errorf("no sys for %s", m.String()) - } - ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) - case *InterfaceMessage: - var attrs addrAttrs - if runtime.GOOS == "openbsd" { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) - } else { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) - } - if err := addrs(m.Addrs).match(attrs); err != nil { - return nil, err - } - sys := m.Sys() - if sys == nil { - return nil, fmt.Errorf("no sys for %s", m.String()) - } - ss = append(ss, m.String()+" "+syss(sys).String()+" "+addrs(m.Addrs).String()) - case *InterfaceAddrMessage: - var attrs addrAttrs - if runtime.GOOS == "openbsd" { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[12:16])) - } else { - attrs = addrAttrs(nativeEndian.Uint32(m.raw[4:8])) - } - if err := addrs(m.Addrs).match(attrs); err != nil { - return nil, err - } - ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) - case *InterfaceMulticastAddrMessage: - if err := addrs(m.Addrs).match(addrAttrs(nativeEndian.Uint32(m.raw[4:8]))); err != nil { - return nil, err - } - ss = append(ss, m.String()+" "+addrs(m.Addrs).String()) - case *InterfaceAnnounceMessage: - ss = append(ss, m.String()) - default: - ss = append(ss, fmt.Sprintf("%+v", m)) - } - } - return ss, nil -} - -type syss []Sys - -func (sys syss) String() string { - var s string - for _, sy := range sys { - switch sy := sy.(type) { - case *InterfaceMetrics: - if len(s) > 0 { - s += " " - } - s += sy.String() - case *RouteMetrics: - if len(s) > 0 { - s += " " - } - s += sy.String() - } - } - return s -} - -type addrFamily int - -func (af addrFamily) String() string { - switch af { - case sysAF_UNSPEC: - return "unspec" - case sysAF_LINK: - return "link" - case sysAF_INET: - return "inet4" - case sysAF_INET6: - return "inet6" - default: - return fmt.Sprintf("%d", af) - } -} - -const hexDigit = "0123456789abcdef" - -type llAddr []byte - -func (a llAddr) String() string { - if len(a) == 0 { - return "" - } - buf := make([]byte, 0, len(a)*3-1) - for i, b := range a { - if i > 0 { - buf = append(buf, ':') - } - buf = append(buf, hexDigit[b>>4]) - buf = append(buf, hexDigit[b&0xF]) - } - return string(buf) -} - -type ipAddr []byte - -func (a ipAddr) String() string { - if len(a) == 0 { - return "" - } - if len(a) == 4 { - return fmt.Sprintf("%d.%d.%d.%d", a[0], a[1], a[2], a[3]) - } - if len(a) == 16 { - return fmt.Sprintf("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]) - } - s := make([]byte, len(a)*2) - for i, tn := range a { - s[i*2], s[i*2+1] = hexDigit[tn>>4], hexDigit[tn&0xf] - } - return string(s) -} - -func (a *LinkAddr) String() string { - name := a.Name - if name == "" { - name = "" - } - lla := llAddr(a.Addr).String() - if lla == "" { - lla = "" - } - return fmt.Sprintf("(%v %d %s %s)", addrFamily(a.Family()), a.Index, name, lla) -} - -func (a *Inet4Addr) String() string { - return fmt.Sprintf("(%v %v)", addrFamily(a.Family()), ipAddr(a.IP[:])) -} - -func (a *Inet6Addr) String() string { - return fmt.Sprintf("(%v %v %d)", addrFamily(a.Family()), ipAddr(a.IP[:]), a.ZoneID) -} - -func (a *DefaultAddr) String() string { - return fmt.Sprintf("(%v %s)", addrFamily(a.Family()), ipAddr(a.Raw[2:]).String()) -} - -type addrs []Addr - -func (as addrs) String() string { - var s string - for _, a := range as { - if a == nil { - continue - } - if len(s) > 0 { - s += " " - } - switch a := a.(type) { - case *LinkAddr: - s += a.String() - case *Inet4Addr: - s += a.String() - case *Inet6Addr: - s += a.String() - case *DefaultAddr: - s += a.String() - } - } - if s == "" { - return "" - } - return s -} - -func (as addrs) match(attrs addrAttrs) error { - var ts addrAttrs - af := sysAF_UNSPEC - for i := range as { - if as[i] != nil { - ts |= 1 << uint(i) - } - switch as[i].(type) { - case *Inet4Addr: - if af == sysAF_UNSPEC { - af = sysAF_INET - } - if af != sysAF_INET { - return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) - } - case *Inet6Addr: - if af == sysAF_UNSPEC { - af = sysAF_INET6 - } - if af != sysAF_INET6 { - return fmt.Errorf("got %v; want %v", addrs(as), addrFamily(af)) - } - } - } - if ts != attrs && ts > attrs { - return fmt.Errorf("%v not included in %v", ts, attrs) - } - return nil -} - -func fetchAndParseRIB(af int, typ RIBType) ([]Message, error) { - var err error - var b []byte - for i := 0; i < 3; i++ { - if b, err = FetchRIB(af, typ, 0); err != nil { - time.Sleep(10 * time.Millisecond) - continue - } - break - } - if err != nil { - return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) - } - ms, err := ParseRIB(typ, b) - if err != nil { - return nil, fmt.Errorf("%v %d %v", addrFamily(af), typ, err) - } - return ms, nil -} - -// propVirtual is a proprietary virtual network interface. -type propVirtual struct { - name string - addr, mask string - setupCmds []*exec.Cmd - teardownCmds []*exec.Cmd -} - -func (pv *propVirtual) setup() error { - for _, cmd := range pv.setupCmds { - if err := cmd.Run(); err != nil { - pv.teardown() - return err - } - } - return nil -} - -func (pv *propVirtual) teardown() error { - for _, cmd := range pv.teardownCmds { - if err := cmd.Run(); err != nil { - return err - } - } - return nil -} - -func (pv *propVirtual) configure(suffix int) error { - if runtime.GOOS == "openbsd" { - pv.name = fmt.Sprintf("vether%d", suffix) - } else { - pv.name = fmt.Sprintf("vlan%d", suffix) - } - xname, err := exec.LookPath("ifconfig") - if err != nil { - return err - } - pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ - Path: xname, - Args: []string{"ifconfig", pv.name, "create"}, - }) - if runtime.GOOS == "netbsd" { - // NetBSD requires an underlying dot1Q-capable network - // interface. - pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ - Path: xname, - Args: []string{"ifconfig", pv.name, "vlan", fmt.Sprintf("%d", suffix&0xfff), "vlanif", "wm0"}, - }) - } - pv.setupCmds = append(pv.setupCmds, &exec.Cmd{ - Path: xname, - Args: []string{"ifconfig", pv.name, "inet", pv.addr, "netmask", pv.mask}, - }) - pv.teardownCmds = append(pv.teardownCmds, &exec.Cmd{ - Path: xname, - Args: []string{"ifconfig", pv.name, "destroy"}, - }) - return nil -} diff --git a/src/internal/x/text/secure/doc.go b/src/internal/x/text/secure/doc.go deleted file mode 100644 index 6151b79d6e..0000000000 --- a/src/internal/x/text/secure/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2016 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. - -// secure is a repository of text security related packages. -package secure diff --git a/src/internal/x/text/transform/examples_test.go b/src/internal/x/text/transform/examples_test.go deleted file mode 100644 index 8d2fbb2171..0000000000 --- a/src/internal/x/text/transform/examples_test.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2013 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 transform_test - -import ( - "fmt" - "unicode" - - "internal/x/text/transform" - "internal/x/text/unicode/norm" -) - -func ExampleRemoveFunc() { - input := []byte(`tschüß; до свидания`) - - b := make([]byte, len(input)) - - t := transform.RemoveFunc(unicode.IsSpace) - n, _, _ := t.Transform(b, input, true) - fmt.Println(string(b[:n])) - - t = transform.RemoveFunc(func(r rune) bool { - return !unicode.Is(unicode.Latin, r) - }) - n, _, _ = t.Transform(b, input, true) - fmt.Println(string(b[:n])) - - n, _, _ = t.Transform(b, norm.NFD.Bytes(input), true) - fmt.Println(string(b[:n])) - - // Output: - // tschüß;досвидания - // tschüß - // tschuß -} diff --git a/src/internal/x/text/unicode/bidi/example_test.go b/src/internal/x/text/unicode/bidi/example_test.go deleted file mode 100644 index 56c5c4a121..0000000000 --- a/src/internal/x/text/unicode/bidi/example_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT. - -// +build ignore - -package bidi_test - -import ( - "fmt" - "log" - - "internal/x/text/bidi" -) - -func foo() { - var sa StringAttributes - var p Paragraph - n, _ := p.SetString(s) - for i, o := 0, p.Ordering(); i < o.NumRuns(); i++ { - b := o.Run(i).Bytes() - - start, end := o.Run(i).Pos() - for p := start; p < end; { - style, n := sa.StyleAt(start) - render() - p += n - } - - } -} - -type style int - -const ( - styleNormal = 0 - styleSelected = 1 << (iota - 1) - styleBold - styleItalics -) - -type styleRun struct { - end int - style style -} - -func getTextWidth(text string, styleRuns []styleRun) int { - // simplistic way to compute the width - return len([]rune(text)) -} - -// set limit and StyleRun limit for a line -// from text[start] and from styleRuns[styleRunStart] -// using Bidi.getLogicalRun(...) -// returns line width -func getLineBreak(p *bidi.Paragraph, start int, styles []styleRun) (n int) { - // dummy return - return 0 -} - -// render runs on a line sequentially, always from left to right - -// prepare rendering a new line -func startLine(d bidi.Direction, lineWidth int) { - fmt.Println() -} - -// render a run of text and advance to the right by the run width -// the text[start..limit-1] is always in logical order -func renderRun(text string, d bidi.Direction, styl style) { -} - -// We could compute a cross-product -// from the style runs with the directional runs -// and then reorder it. -// Instead, here we iterate over each run type -// and render the intersections - -// with shortcuts in simple (and common) cases. -// renderParagraph() is the main function. - -// render a directional run with -// (possibly) multiple style runs intersecting with it -func renderDirectionalRun(text string, offset int, d bidi.Direction, styles []styleRun) { - start, end := offset, len(text)+offset - // iterate over style runs - if run.Direction() == bidi.LeftToRight { - styleEnd := 0 - for _, sr := range styles { - styleEnd = styleRuns[i].end - if start < styleEnd { - if styleEnd > end { - styleEnd = end - } - renderRun(text[start-offset:styleEnd-offset], run.Direction(), styles[i].style) - if styleEnd == end { - break - } - start = styleEnd - } - } - } else { - styleStart := 0 - for i := len(styles) - 1; i >= 0; i-- { - if i > 0 { - styleStart = styles[i-1].end - } else { - styleStart = 0 - } - if end >= styleStart { - if styleStart < start { - styleStart = start - } - renderRun(text[styleStart-offset:end-offset], run.Direction(), styles[i].style) - if styleStart == start { - break - } - end = styleStart - } - } - } -} - -// the line object represents text[start..limit-1] -func renderLine(line *bidi.Runs, text string, offset int, styles []styleRun) { - if dir := line.Direction(); dir != bidi.Mixed { - if len(styles) == 1 { - renderRun(text, dir, styles[0].style) - } else { - for i := 0; i < line.NumRuns(); i++ { - renderDirectionalRun(text, offset, dir, styles) - } - } - } else { - // iterate over both directional and style runs - for i := 0; i < line.Len(); i++ { - run := line.Run(i) - start, _ := run.Pos() - renderDirectionalRun(text[start-offset:], start, run.Direction(), styles) - } - } -} - -func renderParagraph(text string, d bidi.Direction, styles []styleRun, int lineWidth) { - var p bidi.Paragraph - if err := p.SetString(text, bidi.DefaultDirection(d)); err != nil { - log.Fatal(err) - } - - if len(styles) == 0 { - styles = append(styles, []styleRun{len(text), styleNormal}) - } - - if width := getTextWidth(text, styles); width <= lineWidth { - // everything fits onto one line - - runs, err := p.Runs() - if err != nil { - log.Fatal(err) - } - - // prepare rendering a new line from either left or right - startLine(p.Direction(), width) - renderLine(&runs, text, styles) - } else { - // we need to render several lines - - for start, end := 0, 0; start < len(text); start = end { - for start >= styles[0].end { - styles = styles[1:] - } - end = getLineBreak(p, start, styles[startStyles:]) - - runs, err := p.Line(start, end) - if err != nil { - log.Fatal(err) - } - - startLine(p.Direction(), end-start) - renderLine(&runs, text[start:end], styles[startStyles:]) - } - } -} - -func main() { - renderParagraph("Some Latin text...", bidi.LeftToRight, nil, 80) - renderParagraph("Some Hebrew text...", bidi.RightToLeft, nil, 60) -} diff --git a/src/internal/x/text/unicode/doc.go b/src/internal/x/text/unicode/doc.go deleted file mode 100644 index 4f7e9f5a43..0000000000 --- a/src/internal/x/text/unicode/doc.go +++ /dev/null @@ -1,10 +0,0 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2015 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. - -// unicode holds packages with implementations of Unicode standards that are -// mostly used as building blocks for other packages in internal/x/text, -// layout engines, or are otherwise more low-level in nature. -package unicode diff --git a/src/internal/x/text/unicode/norm/example_iter_test.go b/src/internal/x/text/unicode/norm/example_iter_test.go deleted file mode 100644 index fb0e52410b..0000000000 --- a/src/internal/x/text/unicode/norm/example_iter_test.go +++ /dev/null @@ -1,84 +0,0 @@ -// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2012 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 norm_test - -import ( - "bytes" - "fmt" - "unicode/utf8" - - "internal/x/text/unicode/norm" -) - -// EqualSimple uses a norm.Iter to compare two non-normalized -// strings for equivalence. -func EqualSimple(a, b string) bool { - var ia, ib norm.Iter - ia.InitString(norm.NFKD, a) - ib.InitString(norm.NFKD, b) - for !ia.Done() && !ib.Done() { - if !bytes.Equal(ia.Next(), ib.Next()) { - return false - } - } - return ia.Done() && ib.Done() -} - -// FindPrefix finds the longest common prefix of ASCII characters -// of a and b. -func FindPrefix(a, b string) int { - i := 0 - for ; i < len(a) && i < len(b) && a[i] < utf8.RuneSelf && a[i] == b[i]; i++ { - } - return i -} - -// EqualOpt is like EqualSimple, but optimizes the special -// case for ASCII characters. -func EqualOpt(a, b string) bool { - n := FindPrefix(a, b) - a, b = a[n:], b[n:] - var ia, ib norm.Iter - ia.InitString(norm.NFKD, a) - ib.InitString(norm.NFKD, b) - for !ia.Done() && !ib.Done() { - if !bytes.Equal(ia.Next(), ib.Next()) { - return false - } - if n := int64(FindPrefix(a[ia.Pos():], b[ib.Pos():])); n != 0 { - ia.Seek(n, 1) - ib.Seek(n, 1) - } - } - return ia.Done() && ib.Done() -} - -var compareTests = []struct{ a, b string }{ - {"aaa", "aaa"}, - {"aaa", "aab"}, - {"a\u0300a", "\u00E0a"}, - {"a\u0300\u0320b", "a\u0320\u0300b"}, - {"\u1E0A\u0323", "\x44\u0323\u0307"}, - // A character that decomposes into multiple segments - // spans several iterations. - {"\u3304", "\u30A4\u30CB\u30F3\u30AF\u3099"}, -} - -func ExampleIter() { - for i, t := range compareTests { - r0 := EqualSimple(t.a, t.b) - r1 := EqualOpt(t.a, t.b) - fmt.Printf("%d: %v %v\n", i, r0, r1) - } - // Output: - // 0: true true - // 1: false false - // 2: true true - // 3: true true - // 4: true true - // 5: true true -} diff --git a/src/internal/x/text/unicode/norm/example_test.go b/src/internal/x/text/unicode/norm/example_test.go deleted file mode 100644 index a9904400df..0000000000 --- a/src/internal/x/text/unicode/norm/example_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by running "go run gen.go -core" in golang.org/x/text. DO NOT EDIT. - -// Copyright 2016 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 norm_test - -import ( - "fmt" - - "internal/x/text/unicode/norm" -) - -func ExampleForm_NextBoundary() { - s := norm.NFD.String("Mêlée") - - for i := 0; i < len(s); { - d := norm.NFC.NextBoundaryInString(s[i:], true) - fmt.Printf("%[1]s: %+[1]q\n", s[i:i+d]) - i += d - } - // Output: - // M: "M" - // ê: "e\u0302" - // l: "l" - // é: "e\u0301" - // e: "e" -} diff --git a/src/net/dnsclient.go b/src/net/dnsclient.go index 4fdf60ff4e..b5bb3a4d11 100644 --- a/src/net/dnsclient.go +++ b/src/net/dnsclient.go @@ -8,7 +8,7 @@ import ( "math/rand" "sort" - "internal/x/net/dns/dnsmessage" + "golang.org/x/net/dns/dnsmessage" ) // reverseaddr returns the in-addr.arpa. or ip6.arpa. hostname of the IP diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 86ce92dc43..5472494356 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -23,7 +23,7 @@ import ( "sync" "time" - "internal/x/net/dns/dnsmessage" + "golang.org/x/net/dns/dnsmessage" ) var ( diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index be04a44c14..810f400f0b 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -20,7 +20,7 @@ import ( "testing" "time" - "internal/x/net/dns/dnsmessage" + "golang.org/x/net/dns/dnsmessage" ) var goResolver = Resolver{PreferGo: true} diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index f714cbb9a1..262beb7068 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -44,9 +44,9 @@ import ( "sync" "time" - "internal/x/net/http/httpguts" - "internal/x/net/http2/hpack" - "internal/x/net/idna" + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http2/hpack" + "golang.org/x/net/idna" ) // A list of the possible cipher suite ids. Taken from diff --git a/src/net/http/http.go b/src/net/http/http.go index e5d59e1412..1c829ae87f 100644 --- a/src/net/http/http.go +++ b/src/net/http/http.go @@ -11,7 +11,7 @@ import ( "time" "unicode/utf8" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // maxInt64 is the effective "infinite" value for the Server and diff --git a/src/net/http/httptest/recorder.go b/src/net/http/httptest/recorder.go index f2c3c0757b..59c98adfe8 100644 --- a/src/net/http/httptest/recorder.go +++ b/src/net/http/httptest/recorder.go @@ -12,7 +12,7 @@ import ( "strconv" "strings" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // ResponseRecorder is an implementation of http.ResponseWriter that diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go index 4e10bf3997..92d7f63af5 100644 --- a/src/net/http/httputil/reverseproxy.go +++ b/src/net/http/httputil/reverseproxy.go @@ -18,7 +18,7 @@ import ( "sync" "time" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // ReverseProxy is an HTTP Handler that takes an incoming request and diff --git a/src/net/http/request.go b/src/net/http/request.go index dcad2b6fab..24e941f038 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -26,7 +26,7 @@ import ( "strings" "sync" - "internal/x/net/idna" + "golang.org/x/net/idna" ) const ( diff --git a/src/net/http/response.go b/src/net/http/response.go index f906ce829b..6d22c2892d 100644 --- a/src/net/http/response.go +++ b/src/net/http/response.go @@ -12,7 +12,7 @@ import ( "crypto/tls" "errors" "fmt" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" "io" "net/textproto" "net/url" diff --git a/src/net/http/server.go b/src/net/http/server.go index a19934e469..4e9ea34491 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -29,7 +29,7 @@ import ( "sync/atomic" "time" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // Errors used by the HTTP server. diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go index 7d73dc4fc0..43c800bca5 100644 --- a/src/net/http/transfer.go +++ b/src/net/http/transfer.go @@ -21,7 +21,7 @@ import ( "sync" "time" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // ErrLineTooLong is returned when reading request or response bodies diff --git a/src/net/http/transport.go b/src/net/http/transport.go index f0ae6ef0b9..de1fb96818 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -30,8 +30,8 @@ import ( "sync/atomic" "time" - "internal/x/net/http/httpguts" - "internal/x/net/http/httpproxy" + "golang.org/x/net/http/httpguts" + "golang.org/x/net/http/httpproxy" ) // DefaultTransport is the default implementation of Transport and is diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 74767f8499..82741e8537 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -42,7 +42,7 @@ import ( "testing" "time" - "internal/x/net/http/httpguts" + "golang.org/x/net/http/httpguts" ) // TODO: test 5 pipelined requests with responses: 1) OK, 2) OK, Connection: Close diff --git a/src/net/interface_bsd.go b/src/net/interface_bsd.go index 77372964b1..d791cb3016 100644 --- a/src/net/interface_bsd.go +++ b/src/net/interface_bsd.go @@ -9,7 +9,7 @@ package net import ( "syscall" - "internal/x/net/route" + "golang.org/x/net/route" ) // If the ifindex is zero, interfaceTable returns mappings of all diff --git a/src/net/interface_bsdvar.go b/src/net/interface_bsdvar.go index 818fafe970..a809b5f5ce 100644 --- a/src/net/interface_bsdvar.go +++ b/src/net/interface_bsdvar.go @@ -9,7 +9,7 @@ package net import ( "syscall" - "internal/x/net/route" + "golang.org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/interface_darwin.go b/src/net/interface_darwin.go index 6a6b3a5818..bb4fd73a98 100644 --- a/src/net/interface_darwin.go +++ b/src/net/interface_darwin.go @@ -7,7 +7,7 @@ package net import ( "syscall" - "internal/x/net/route" + "golang.org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/interface_freebsd.go b/src/net/interface_freebsd.go index 8eee2aa031..45badd6495 100644 --- a/src/net/interface_freebsd.go +++ b/src/net/interface_freebsd.go @@ -7,7 +7,7 @@ package net import ( "syscall" - "internal/x/net/route" + "golang.org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/interface_solaris.go b/src/net/interface_solaris.go index 868d4174ed..5f9367f996 100644 --- a/src/net/interface_solaris.go +++ b/src/net/interface_solaris.go @@ -7,7 +7,7 @@ package net import ( "syscall" - "internal/x/net/lif" + "golang.org/x/net/lif" ) // If the ifindex is zero, interfaceTable returns mappings of all diff --git a/src/net/lookup_unix.go b/src/net/lookup_unix.go index 6543f121a7..9055826d40 100644 --- a/src/net/lookup_unix.go +++ b/src/net/lookup_unix.go @@ -12,7 +12,7 @@ import ( "sync" "syscall" - "internal/x/net/dns/dnsmessage" + "golang.org/x/net/dns/dnsmessage" ) var onceReadProtocols sync.Once diff --git a/src/net/pipe_test.go b/src/net/pipe_test.go index 53ddc16313..9cc24148ca 100644 --- a/src/net/pipe_test.go +++ b/src/net/pipe_test.go @@ -10,7 +10,7 @@ import ( "testing" "time" - "internal/x/net/nettest" + "golang.org/x/net/nettest" ) func TestPipe(t *testing.T) { diff --git a/src/run.bash b/src/run.bash index 1c6c424434..1acd0194b6 100755 --- a/src/run.bash +++ b/src/run.bash @@ -15,11 +15,10 @@ export GOROOT # the api test requires GOROOT to be set. # to point to an actual directory, it just needs to pass the semantic # checks performed by Go. Use $GOROOT to define $GOPATH so that we # don't blunder into a user-defined symbolic link. -GOPATH=$GOROOT/nonexistentpath -export GOPATH +export GOPATH=/dev/null unset CDPATH # in case user has it set -unset GOBIN # Issue 14340 +export GOBIN=$GOROOT/bin # Issue 14340 unset GOFLAGS unset GO111MODULE diff --git a/src/vendor/golang.org/x/crypto/AUTHORS b/src/vendor/golang.org/x/crypto/AUTHORS new file mode 100644 index 0000000000..2b00ddba0d --- /dev/null +++ b/src/vendor/golang.org/x/crypto/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/src/vendor/golang.org/x/crypto/CONTRIBUTORS b/src/vendor/golang.org/x/crypto/CONTRIBUTORS new file mode 100644 index 0000000000..1fbd3e976f --- /dev/null +++ b/src/vendor/golang.org/x/crypto/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/src/vendor/golang.org/x/crypto/LICENSE b/src/vendor/golang.org/x/crypto/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/src/vendor/golang.org/x/crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/vendor/golang.org/x/crypto/PATENTS b/src/vendor/golang.org/x/crypto/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/src/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305.go b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go similarity index 81% rename from src/internal/x/crypto/chacha20poly1305/chacha20poly1305.go rename to src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go index 80789a1212..bbb86efef5 100644 --- a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305.go +++ b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. -package chacha20poly1305 +// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539, +// and its extended nonce variant XChaCha20-Poly1305. +package chacha20poly1305 // import "golang.org/x/crypto/chacha20poly1305" import ( "crypto/cipher" @@ -14,15 +15,24 @@ import ( const ( // KeySize is the size of the key used by this AEAD, in bytes. KeySize = 32 - // NonceSize is the size of the nonce used with this AEAD, in bytes. + + // NonceSize is the size of the nonce used with the standard variant of this + // AEAD, in bytes. + // + // Note that this is too short to be safely generated at random if the same + // key is reused more than 2³² times. NonceSize = 12 + + // NonceSizeX is the size of the nonce used with the XChaCha20-Poly1305 + // variant of this AEAD, in bytes. + NonceSizeX = 24 ) type chacha20poly1305 struct { key [8]uint32 } -// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. +// New returns a ChaCha20-Poly1305 AEAD that uses the given 256-bit key. func New(key []byte) (cipher.AEAD, error) { if len(key) != KeySize { return nil, errors.New("chacha20poly1305: bad key length") diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go similarity index 86% rename from src/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go rename to src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go index 4e7b6ea84f..2aa4fd89db 100644 --- a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go +++ b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.go @@ -9,7 +9,8 @@ package chacha20poly1305 import ( "encoding/binary" - "internal/cpu" + "golang.org/x/crypto/internal/subtle" + "golang.org/x/sys/cpu" ) //go:noescape @@ -19,7 +20,6 @@ func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) var ( - useASM = cpu.X86.HasSSSE3 useAVX2 = cpu.X86.HasAVX2 && cpu.X86.HasBMI2 ) @@ -47,7 +47,7 @@ func setupState(state *[16]uint32, key *[8]uint32, nonce []byte) { } func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { - if !useASM { + if !cpu.X86.HasSSSE3 { return c.sealGeneric(dst, nonce, plaintext, additionalData) } @@ -55,12 +55,15 @@ func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) [] setupState(&state, &c.key, nonce) ret, out := sliceForAppend(dst, len(plaintext)+16) + if subtle.InexactOverlap(out, plaintext) { + panic("chacha20poly1305: invalid buffer overlap") + } chacha20Poly1305Seal(out[:], state[:], plaintext, additionalData) return ret } func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { - if !useASM { + if !cpu.X86.HasSSSE3 { return c.openGeneric(dst, nonce, ciphertext, additionalData) } @@ -69,6 +72,9 @@ func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ( ciphertext = ciphertext[:len(ciphertext)-16] ret, out := sliceForAppend(dst, len(ciphertext)) + if subtle.InexactOverlap(out, ciphertext) { + panic("chacha20poly1305: invalid buffer overlap") + } if !chacha20Poly1305Open(out, state[:], ciphertext, additionalData) { for i := range out { out[i] = 0 diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s similarity index 100% rename from src/internal/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s rename to src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go similarity index 88% rename from src/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go rename to src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go index a77ab35f67..c27971216c 100644 --- a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_generic.go +++ b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_generic.go @@ -7,8 +7,9 @@ package chacha20poly1305 import ( "encoding/binary" - "internal/x/crypto/internal/chacha20" - "internal/x/crypto/poly1305" + "golang.org/x/crypto/internal/chacha20" + "golang.org/x/crypto/internal/subtle" + "golang.org/x/crypto/poly1305" ) func roundTo16(n int) int { @@ -17,6 +18,9 @@ func roundTo16(n int) int { func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + if subtle.InexactOverlap(out, plaintext) { + panic("chacha20poly1305: invalid buffer overlap") + } var polyKey [32]byte s := chacha20.New(c.key, [3]uint32{ @@ -62,6 +66,9 @@ func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData [] binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) ret, out := sliceForAppend(dst, len(ciphertext)) + if subtle.InexactOverlap(out, ciphertext) { + panic("chacha20poly1305: invalid buffer overlap") + } if !poly1305.Verify(&tag, polyInput, &polyKey) { for i := range out { out[i] = 0 diff --git a/src/internal/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go b/src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go similarity index 100% rename from src/internal/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go rename to src/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_noasm.go diff --git a/src/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go b/src/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go new file mode 100644 index 0000000000..a02fa57192 --- /dev/null +++ b/src/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go @@ -0,0 +1,104 @@ +// Copyright 2018 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 chacha20poly1305 + +import ( + "crypto/cipher" + "encoding/binary" + "errors" + + "golang.org/x/crypto/internal/chacha20" +) + +type xchacha20poly1305 struct { + key [8]uint32 +} + +// NewX returns a XChaCha20-Poly1305 AEAD that uses the given 256-bit key. +// +// XChaCha20-Poly1305 is a ChaCha20-Poly1305 variant that takes a longer nonce, +// suitable to be generated randomly without risk of collisions. It should be +// preferred when nonce uniqueness cannot be trivially ensured, or whenever +// nonces are randomly generated. +func NewX(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(xchacha20poly1305) + ret.key[0] = binary.LittleEndian.Uint32(key[0:4]) + ret.key[1] = binary.LittleEndian.Uint32(key[4:8]) + ret.key[2] = binary.LittleEndian.Uint32(key[8:12]) + ret.key[3] = binary.LittleEndian.Uint32(key[12:16]) + ret.key[4] = binary.LittleEndian.Uint32(key[16:20]) + ret.key[5] = binary.LittleEndian.Uint32(key[20:24]) + ret.key[6] = binary.LittleEndian.Uint32(key[24:28]) + ret.key[7] = binary.LittleEndian.Uint32(key[28:32]) + return ret, nil +} + +func (*xchacha20poly1305) NonceSize() int { + return NonceSizeX +} + +func (*xchacha20poly1305) Overhead() int { + return 16 +} + +func (x *xchacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSizeX { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + // XChaCha20-Poly1305 technically supports a 64-bit counter, so there is no + // size limit. However, since we reuse the ChaCha20-Poly1305 implementation, + // the second half of the counter is not available. This is unlikely to be + // an issue because the cipher.AEAD API requires the entire message to be in + // memory, and the counter overflows at 256 GB. + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + hNonce := [4]uint32{ + binary.LittleEndian.Uint32(nonce[0:4]), + binary.LittleEndian.Uint32(nonce[4:8]), + binary.LittleEndian.Uint32(nonce[8:12]), + binary.LittleEndian.Uint32(nonce[12:16]), + } + c := &chacha20poly1305{ + key: chacha20.HChaCha20(&x.key, &hNonce), + } + // The first 4 bytes of the final nonce are unused counter space. + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + + return c.seal(dst, cNonce[:], plaintext, additionalData) +} + +func (x *xchacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSizeX { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + hNonce := [4]uint32{ + binary.LittleEndian.Uint32(nonce[0:4]), + binary.LittleEndian.Uint32(nonce[4:8]), + binary.LittleEndian.Uint32(nonce[8:12]), + binary.LittleEndian.Uint32(nonce[12:16]), + } + c := &chacha20poly1305{ + key: chacha20.HChaCha20(&x.key, &hNonce), + } + // The first 4 bytes of the final nonce are unused counter space. + cNonce := make([]byte, NonceSize) + copy(cNonce[4:12], nonce[16:24]) + + return c.open(dst, cNonce[:], ciphertext, additionalData) +} diff --git a/src/internal/x/crypto/cryptobyte/asn1.go b/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go similarity index 99% rename from src/internal/x/crypto/cryptobyte/asn1.go rename to src/vendor/golang.org/x/crypto/cryptobyte/asn1.go index 2d40680ddd..528b9bff67 100644 --- a/src/internal/x/crypto/cryptobyte/asn1.go +++ b/src/vendor/golang.org/x/crypto/cryptobyte/asn1.go @@ -11,7 +11,7 @@ import ( "reflect" "time" - "internal/x/crypto/cryptobyte/asn1" + "golang.org/x/crypto/cryptobyte/asn1" ) // This file contains ASN.1-related methods for String and Builder. diff --git a/src/internal/x/crypto/cryptobyte/asn1/asn1.go b/src/vendor/golang.org/x/crypto/cryptobyte/asn1/asn1.go similarity index 96% rename from src/internal/x/crypto/cryptobyte/asn1/asn1.go rename to src/vendor/golang.org/x/crypto/cryptobyte/asn1/asn1.go index 90ef6a241d..cda8e3edfd 100644 --- a/src/internal/x/crypto/cryptobyte/asn1/asn1.go +++ b/src/vendor/golang.org/x/crypto/cryptobyte/asn1/asn1.go @@ -4,7 +4,7 @@ // Package asn1 contains supporting types for parsing and building ASN.1 // messages with the cryptobyte package. -package asn1 +package asn1 // import "golang.org/x/crypto/cryptobyte/asn1" // Tag represents an ASN.1 identifier octet, consisting of a tag number // (indicating a type) and class (such as context-specific or constructed). diff --git a/src/internal/x/crypto/cryptobyte/builder.go b/src/vendor/golang.org/x/crypto/cryptobyte/builder.go similarity index 100% rename from src/internal/x/crypto/cryptobyte/builder.go rename to src/vendor/golang.org/x/crypto/cryptobyte/builder.go diff --git a/src/internal/x/crypto/cryptobyte/string.go b/src/vendor/golang.org/x/crypto/cryptobyte/string.go similarity index 98% rename from src/internal/x/crypto/cryptobyte/string.go rename to src/vendor/golang.org/x/crypto/cryptobyte/string.go index bd2ed2e207..39bf98aeea 100644 --- a/src/internal/x/crypto/cryptobyte/string.go +++ b/src/vendor/golang.org/x/crypto/cryptobyte/string.go @@ -15,7 +15,7 @@ // // See the documentation and examples for the Builder and String types to get // started. -package cryptobyte +package cryptobyte // import "golang.org/x/crypto/cryptobyte" // String represents a string of bytes. It provides methods for parsing // fixed-length and length-prefixed values from it. diff --git a/src/internal/x/crypto/curve25519/const_amd64.h b/src/vendor/golang.org/x/crypto/curve25519/const_amd64.h similarity index 100% rename from src/internal/x/crypto/curve25519/const_amd64.h rename to src/vendor/golang.org/x/crypto/curve25519/const_amd64.h diff --git a/src/internal/x/crypto/curve25519/const_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/const_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/const_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/const_amd64.s diff --git a/src/internal/x/crypto/curve25519/cswap_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/cswap_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s diff --git a/src/internal/x/crypto/curve25519/curve25519.go b/src/vendor/golang.org/x/crypto/curve25519/curve25519.go similarity index 100% rename from src/internal/x/crypto/curve25519/curve25519.go rename to src/vendor/golang.org/x/crypto/curve25519/curve25519.go diff --git a/src/internal/x/crypto/curve25519/doc.go b/src/vendor/golang.org/x/crypto/curve25519/doc.go similarity index 94% rename from src/internal/x/crypto/curve25519/doc.go rename to src/vendor/golang.org/x/crypto/curve25519/doc.go index 076a8d4f10..da9b10d9c1 100644 --- a/src/internal/x/crypto/curve25519/doc.go +++ b/src/vendor/golang.org/x/crypto/curve25519/doc.go @@ -4,7 +4,7 @@ // Package curve25519 provides an implementation of scalar multiplication on // the elliptic curve known as curve25519. See https://cr.yp.to/ecdh.html -package curve25519 +package curve25519 // import "golang.org/x/crypto/curve25519" // basePoint is the x coordinate of the generator of the curve. var basePoint = [32]byte{9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} diff --git a/src/internal/x/crypto/curve25519/freeze_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/freeze_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s diff --git a/src/internal/x/crypto/curve25519/ladderstep_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/ladderstep_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s diff --git a/src/internal/x/crypto/curve25519/mont25519_amd64.go b/src/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go similarity index 100% rename from src/internal/x/crypto/curve25519/mont25519_amd64.go rename to src/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go diff --git a/src/internal/x/crypto/curve25519/mul_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/mul_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/mul_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/mul_amd64.s diff --git a/src/internal/x/crypto/curve25519/square_amd64.s b/src/vendor/golang.org/x/crypto/curve25519/square_amd64.s similarity index 100% rename from src/internal/x/crypto/curve25519/square_amd64.s rename to src/vendor/golang.org/x/crypto/curve25519/square_amd64.s diff --git a/src/internal/x/crypto/hkdf/hkdf.go b/src/vendor/golang.org/x/crypto/hkdf/hkdf.go similarity index 98% rename from src/internal/x/crypto/hkdf/hkdf.go rename to src/vendor/golang.org/x/crypto/hkdf/hkdf.go index c9077658e6..dda3f143be 100644 --- a/src/internal/x/crypto/hkdf/hkdf.go +++ b/src/vendor/golang.org/x/crypto/hkdf/hkdf.go @@ -8,7 +8,7 @@ // HKDF is a cryptographic key derivation function (KDF) with the goal of // expanding limited input keying material into one or more cryptographically // strong secret keys. -package hkdf +package hkdf // import "golang.org/x/crypto/hkdf" import ( "crypto/hmac" diff --git a/src/internal/x/crypto/internal/chacha20/chacha_generic.go b/src/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go similarity index 66% rename from src/internal/x/crypto/internal/chacha20/chacha_generic.go rename to src/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go index 7ed1cd9b18..6570847f5e 100644 --- a/src/internal/x/crypto/internal/chacha20/chacha_generic.go +++ b/src/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go @@ -9,6 +9,8 @@ package chacha20 import ( "crypto/cipher" "encoding/binary" + + "golang.org/x/crypto/internal/subtle" ) // assert that *Cipher implements cipher.Stream @@ -30,6 +32,30 @@ func New(key [8]uint32, nonce [3]uint32) *Cipher { return &Cipher{key: key, nonce: nonce} } +// ChaCha20 constants spelling "expand 32-byte k" +const ( + j0 uint32 = 0x61707865 + j1 uint32 = 0x3320646e + j2 uint32 = 0x79622d32 + j3 uint32 = 0x6b206574 +) + +func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { + a += b + d ^= a + d = (d << 16) | (d >> 16) + c += d + b ^= c + b = (b << 12) | (b >> 20) + a += b + d ^= a + d = (d << 8) | (d >> 24) + c += d + b ^= c + b = (b << 7) | (b >> 25) + return a, b, c, d +} + // XORKeyStream XORs each byte in the given slice with a byte from the // cipher's key stream. Dst and src must overlap entirely or not at all. // @@ -41,6 +67,13 @@ func New(key [8]uint32, nonce [3]uint32) *Cipher { // the src buffers was passed in a single run. That is, Cipher // maintains state and does not reset at each XORKeyStream call. func (s *Cipher) XORKeyStream(dst, src []byte) { + if len(dst) < len(src) { + panic("chacha20: output smaller than input") + } + if subtle.InexactOverlap(dst[:len(src)], src) { + panic("chacha20: invalid buffer overlap") + } + // xor src with buffered keystream first if s.len != 0 { buf := s.buf[len(s.buf)-s.len:] @@ -64,6 +97,9 @@ func (s *Cipher) XORKeyStream(dst, src []byte) { return } if haveAsm { + if uint64(len(src))+uint64(s.counter)*64 > (1<<38)-64 { + panic("chacha20: counter overflow") + } s.xorKeyStreamAsm(dst, src) return } @@ -76,59 +112,34 @@ func (s *Cipher) XORKeyStream(dst, src []byte) { copy(s.buf[len(s.buf)-64:], src[fin:]) } - // qr calculates a quarter round - qr := func(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { - a += b - d ^= a - d = (d << 16) | (d >> 16) - c += d - b ^= c - b = (b << 12) | (b >> 20) - a += b - d ^= a - d = (d << 8) | (d >> 24) - c += d - b ^= c - b = (b << 7) | (b >> 25) - return a, b, c, d - } - - // ChaCha20 constants - const ( - j0 = 0x61707865 - j1 = 0x3320646e - j2 = 0x79622d32 - j3 = 0x6b206574 - ) - // pre-calculate most of the first round - s1, s5, s9, s13 := qr(j1, s.key[1], s.key[5], s.nonce[0]) - s2, s6, s10, s14 := qr(j2, s.key[2], s.key[6], s.nonce[1]) - s3, s7, s11, s15 := qr(j3, s.key[3], s.key[7], s.nonce[2]) + s1, s5, s9, s13 := quarterRound(j1, s.key[1], s.key[5], s.nonce[0]) + s2, s6, s10, s14 := quarterRound(j2, s.key[2], s.key[6], s.nonce[1]) + s3, s7, s11, s15 := quarterRound(j3, s.key[3], s.key[7], s.nonce[2]) n := len(src) src, dst = src[:n:n], dst[:n:n] // BCE hint for i := 0; i < n; i += 64 { // calculate the remainder of the first round - s0, s4, s8, s12 := qr(j0, s.key[0], s.key[4], s.counter) + s0, s4, s8, s12 := quarterRound(j0, s.key[0], s.key[4], s.counter) // execute the second round - x0, x5, x10, x15 := qr(s0, s5, s10, s15) - x1, x6, x11, x12 := qr(s1, s6, s11, s12) - x2, x7, x8, x13 := qr(s2, s7, s8, s13) - x3, x4, x9, x14 := qr(s3, s4, s9, s14) + x0, x5, x10, x15 := quarterRound(s0, s5, s10, s15) + x1, x6, x11, x12 := quarterRound(s1, s6, s11, s12) + x2, x7, x8, x13 := quarterRound(s2, s7, s8, s13) + x3, x4, x9, x14 := quarterRound(s3, s4, s9, s14) // execute the remaining 18 rounds for i := 0; i < 9; i++ { - x0, x4, x8, x12 = qr(x0, x4, x8, x12) - x1, x5, x9, x13 = qr(x1, x5, x9, x13) - x2, x6, x10, x14 = qr(x2, x6, x10, x14) - x3, x7, x11, x15 = qr(x3, x7, x11, x15) - - x0, x5, x10, x15 = qr(x0, x5, x10, x15) - x1, x6, x11, x12 = qr(x1, x6, x11, x12) - x2, x7, x8, x13 = qr(x2, x7, x8, x13) - x3, x4, x9, x14 = qr(x3, x4, x9, x14) + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) } x0 += j0 @@ -225,3 +236,29 @@ func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { } s.XORKeyStream(out, in) } + +// HChaCha20 uses the ChaCha20 core to generate a derived key from a key and a +// nonce. It should only be used as part of the XChaCha20 construction. +func HChaCha20(key *[8]uint32, nonce *[4]uint32) [8]uint32 { + x0, x1, x2, x3 := j0, j1, j2, j3 + x4, x5, x6, x7 := key[0], key[1], key[2], key[3] + x8, x9, x10, x11 := key[4], key[5], key[6], key[7] + x12, x13, x14, x15 := nonce[0], nonce[1], nonce[2], nonce[3] + + for i := 0; i < 10; i++ { + x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) + x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) + x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) + x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) + + x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) + x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) + x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) + x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) + } + + var out [8]uint32 + out[0], out[1], out[2], out[3] = x0, x1, x2, x3 + out[4], out[5], out[6], out[7] = x12, x13, x14, x15 + return out +} diff --git a/src/internal/x/crypto/internal/chacha20/chacha_noasm.go b/src/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go similarity index 100% rename from src/internal/x/crypto/internal/chacha20/chacha_noasm.go rename to src/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go diff --git a/src/internal/x/crypto/internal/chacha20/chacha_s390x.go b/src/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go similarity index 100% rename from src/internal/x/crypto/internal/chacha20/chacha_s390x.go rename to src/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go diff --git a/src/internal/x/crypto/internal/chacha20/asm_s390x.s b/src/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s similarity index 100% rename from src/internal/x/crypto/internal/chacha20/asm_s390x.s rename to src/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s diff --git a/src/internal/x/crypto/internal/chacha20/xor.go b/src/vendor/golang.org/x/crypto/internal/chacha20/xor.go similarity index 100% rename from src/internal/x/crypto/internal/chacha20/xor.go rename to src/vendor/golang.org/x/crypto/internal/chacha20/xor.go diff --git a/src/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/src/vendor/golang.org/x/crypto/internal/subtle/aliasing.go new file mode 100644 index 0000000000..f38797bfa1 --- /dev/null +++ b/src/vendor/golang.org/x/crypto/internal/subtle/aliasing.go @@ -0,0 +1,32 @@ +// Copyright 2018 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. + +// +build !appengine + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +import "unsafe" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && + uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/src/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go b/src/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go new file mode 100644 index 0000000000..0cc4a8a642 --- /dev/null +++ b/src/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go @@ -0,0 +1,35 @@ +// Copyright 2018 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. + +// +build appengine + +// Package subtle implements functions that are often useful in cryptographic +// code but require careful thought to use correctly. +package subtle // import "golang.org/x/crypto/internal/subtle" + +// This is the Google App Engine standard variant based on reflect +// because the unsafe package and cgo are disallowed. + +import "reflect" + +// AnyOverlap reports whether x and y share memory at any (not necessarily +// corresponding) index. The memory beyond the slice length is ignored. +func AnyOverlap(x, y []byte) bool { + return len(x) > 0 && len(y) > 0 && + reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && + reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() +} + +// InexactOverlap reports whether x and y share memory at any non-corresponding +// index. The memory beyond the slice length is ignored. Note that x and y can +// have different lengths and still not have any inexact overlap. +// +// InexactOverlap can be used to implement the requirements of the crypto/cipher +// AEAD, Block, BlockMode and Stream interfaces. +func InexactOverlap(x, y []byte) bool { + if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { + return false + } + return AnyOverlap(x, y) +} diff --git a/src/internal/x/crypto/poly1305/poly1305.go b/src/vendor/golang.org/x/crypto/poly1305/poly1305.go similarity index 95% rename from src/internal/x/crypto/poly1305/poly1305.go rename to src/vendor/golang.org/x/crypto/poly1305/poly1305.go index 6d6be9a640..f562fa5712 100644 --- a/src/internal/x/crypto/poly1305/poly1305.go +++ b/src/vendor/golang.org/x/crypto/poly1305/poly1305.go @@ -17,7 +17,7 @@ used with a fixed key in order to generate one-time keys from an nonce. However, in this package AES isn't used and the one-time key is specified directly. */ -package poly1305 +package poly1305 // import "golang.org/x/crypto/poly1305" import "crypto/subtle" diff --git a/src/internal/x/crypto/poly1305/sum_amd64.go b/src/vendor/golang.org/x/crypto/poly1305/sum_amd64.go similarity index 100% rename from src/internal/x/crypto/poly1305/sum_amd64.go rename to src/vendor/golang.org/x/crypto/poly1305/sum_amd64.go diff --git a/src/internal/x/crypto/poly1305/sum_amd64.s b/src/vendor/golang.org/x/crypto/poly1305/sum_amd64.s similarity index 100% rename from src/internal/x/crypto/poly1305/sum_amd64.s rename to src/vendor/golang.org/x/crypto/poly1305/sum_amd64.s diff --git a/src/internal/x/crypto/poly1305/sum_arm.go b/src/vendor/golang.org/x/crypto/poly1305/sum_arm.go similarity index 100% rename from src/internal/x/crypto/poly1305/sum_arm.go rename to src/vendor/golang.org/x/crypto/poly1305/sum_arm.go diff --git a/src/internal/x/crypto/poly1305/sum_arm.s b/src/vendor/golang.org/x/crypto/poly1305/sum_arm.s similarity index 100% rename from src/internal/x/crypto/poly1305/sum_arm.s rename to src/vendor/golang.org/x/crypto/poly1305/sum_arm.s diff --git a/src/internal/x/crypto/poly1305/sum_noasm.go b/src/vendor/golang.org/x/crypto/poly1305/sum_noasm.go similarity index 100% rename from src/internal/x/crypto/poly1305/sum_noasm.go rename to src/vendor/golang.org/x/crypto/poly1305/sum_noasm.go diff --git a/src/internal/x/crypto/poly1305/sum_ref.go b/src/vendor/golang.org/x/crypto/poly1305/sum_ref.go similarity index 100% rename from src/internal/x/crypto/poly1305/sum_ref.go rename to src/vendor/golang.org/x/crypto/poly1305/sum_ref.go diff --git a/src/internal/x/crypto/poly1305/sum_s390x.go b/src/vendor/golang.org/x/crypto/poly1305/sum_s390x.go similarity index 100% rename from src/internal/x/crypto/poly1305/sum_s390x.go rename to src/vendor/golang.org/x/crypto/poly1305/sum_s390x.go diff --git a/src/internal/x/crypto/poly1305/sum_s390x.s b/src/vendor/golang.org/x/crypto/poly1305/sum_s390x.s similarity index 100% rename from src/internal/x/crypto/poly1305/sum_s390x.s rename to src/vendor/golang.org/x/crypto/poly1305/sum_s390x.s diff --git a/src/internal/x/crypto/poly1305/sum_vmsl_s390x.s b/src/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s similarity index 100% rename from src/internal/x/crypto/poly1305/sum_vmsl_s390x.s rename to src/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s diff --git a/src/vendor/golang.org/x/net/AUTHORS b/src/vendor/golang.org/x/net/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/src/vendor/golang.org/x/net/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/src/vendor/golang.org/x/net/CONTRIBUTORS b/src/vendor/golang.org/x/net/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/src/vendor/golang.org/x/net/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/src/vendor/golang.org/x/net/LICENSE b/src/vendor/golang.org/x/net/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/src/vendor/golang.org/x/net/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/vendor/golang.org/x/net/PATENTS b/src/vendor/golang.org/x/net/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/src/vendor/golang.org/x/net/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/src/internal/x/net/dns/dnsmessage/message.go b/src/vendor/golang.org/x/net/dns/dnsmessage/message.go similarity index 78% rename from src/internal/x/net/dns/dnsmessage/message.go rename to src/vendor/golang.org/x/net/dns/dnsmessage/message.go index d8d3b03429..13fbc0814e 100644 --- a/src/internal/x/net/dns/dnsmessage/message.go +++ b/src/vendor/golang.org/x/net/dns/dnsmessage/message.go @@ -5,6 +5,9 @@ // Package dnsmessage provides a mostly RFC 1035 compliant implementation of // DNS message packing and unpacking. // +// The package also supports messages with Extension Mechanisms for DNS +// (EDNS(0)) as defined in RFC 6891. +// // This implementation is designed to minimize heap allocations and avoid // unnecessary packing and unpacking as much as possible. package dnsmessage @@ -18,16 +21,6 @@ import ( // A Type is a type of DNS request and response. type Type uint16 -// A Class is a type of network. -type Class uint16 - -// An OpCode is a DNS operation code. -type OpCode uint16 - -// An RCode is a DNS response status code. -type RCode uint16 - -// Wire constants. const ( // ResourceHeader.Type and Question.Type TypeA Type = 1 @@ -39,6 +32,7 @@ const ( TypeTXT Type = 16 TypeAAAA Type = 28 TypeSRV Type = 33 + TypeOPT Type = 41 // Question.Type TypeWKS Type = 11 @@ -46,7 +40,46 @@ const ( TypeMINFO Type = 14 TypeAXFR Type = 252 TypeALL Type = 255 +) + +var typeNames = map[Type]string{ + TypeA: "TypeA", + TypeNS: "TypeNS", + TypeCNAME: "TypeCNAME", + TypeSOA: "TypeSOA", + TypePTR: "TypePTR", + TypeMX: "TypeMX", + TypeTXT: "TypeTXT", + TypeAAAA: "TypeAAAA", + TypeSRV: "TypeSRV", + TypeOPT: "TypeOPT", + TypeWKS: "TypeWKS", + TypeHINFO: "TypeHINFO", + TypeMINFO: "TypeMINFO", + TypeAXFR: "TypeAXFR", + TypeALL: "TypeALL", +} +// String implements fmt.Stringer.String. +func (t Type) String() string { + if n, ok := typeNames[t]; ok { + return n + } + return printUint16(uint16(t)) +} + +// GoString implements fmt.GoStringer.GoString. +func (t Type) GoString() string { + if n, ok := typeNames[t]; ok { + return "dnsmessage." + n + } + return printUint16(uint16(t)) +} + +// A Class is a type of network. +type Class uint16 + +const ( // ResourceHeader.Class and Question.Class ClassINET Class = 1 ClassCSNET Class = 2 @@ -55,7 +88,44 @@ const ( // Question.Class ClassANY Class = 255 +) +var classNames = map[Class]string{ + ClassINET: "ClassINET", + ClassCSNET: "ClassCSNET", + ClassCHAOS: "ClassCHAOS", + ClassHESIOD: "ClassHESIOD", + ClassANY: "ClassANY", +} + +// String implements fmt.Stringer.String. +func (c Class) String() string { + if n, ok := classNames[c]; ok { + return n + } + return printUint16(uint16(c)) +} + +// GoString implements fmt.GoStringer.GoString. +func (c Class) GoString() string { + if n, ok := classNames[c]; ok { + return "dnsmessage." + n + } + return printUint16(uint16(c)) +} + +// An OpCode is a DNS operation code. +type OpCode uint16 + +// GoString implements fmt.GoStringer.GoString. +func (o OpCode) GoString() string { + return printUint16(uint16(o)) +} + +// An RCode is a DNS response status code. +type RCode uint16 + +const ( // Message.Rcode RCodeSuccess RCode = 0 RCodeFormatError RCode = 1 @@ -65,6 +135,116 @@ const ( RCodeRefused RCode = 5 ) +var rCodeNames = map[RCode]string{ + RCodeSuccess: "RCodeSuccess", + RCodeFormatError: "RCodeFormatError", + RCodeServerFailure: "RCodeServerFailure", + RCodeNameError: "RCodeNameError", + RCodeNotImplemented: "RCodeNotImplemented", + RCodeRefused: "RCodeRefused", +} + +// String implements fmt.Stringer.String. +func (r RCode) String() string { + if n, ok := rCodeNames[r]; ok { + return n + } + return printUint16(uint16(r)) +} + +// GoString implements fmt.GoStringer.GoString. +func (r RCode) GoString() string { + if n, ok := rCodeNames[r]; ok { + return "dnsmessage." + n + } + return printUint16(uint16(r)) +} + +func printPaddedUint8(i uint8) string { + b := byte(i) + return string([]byte{ + b/100 + '0', + b/10%10 + '0', + b%10 + '0', + }) +} + +func printUint8Bytes(buf []byte, i uint8) []byte { + b := byte(i) + if i >= 100 { + buf = append(buf, b/100+'0') + } + if i >= 10 { + buf = append(buf, b/10%10+'0') + } + return append(buf, b%10+'0') +} + +func printByteSlice(b []byte) string { + if len(b) == 0 { + return "" + } + buf := make([]byte, 0, 5*len(b)) + buf = printUint8Bytes(buf, uint8(b[0])) + for _, n := range b[1:] { + buf = append(buf, ',', ' ') + buf = printUint8Bytes(buf, uint8(n)) + } + return string(buf) +} + +const hexDigits = "0123456789abcdef" + +func printString(str []byte) string { + buf := make([]byte, 0, len(str)) + for i := 0; i < len(str); i++ { + c := str[i] + if c == '.' || c == '-' || c == ' ' || + 'A' <= c && c <= 'Z' || + 'a' <= c && c <= 'z' || + '0' <= c && c <= '9' { + buf = append(buf, c) + continue + } + + upper := c >> 4 + lower := (c << 4) >> 4 + buf = append( + buf, + '\\', + 'x', + hexDigits[upper], + hexDigits[lower], + ) + } + return string(buf) +} + +func printUint16(i uint16) string { + return printUint32(uint32(i)) +} + +func printUint32(i uint32) string { + // Max value is 4294967295. + buf := make([]byte, 10) + for b, d := buf, uint32(1000000000); d > 0; d /= 10 { + b[0] = byte(i/d%10 + '0') + if b[0] == '0' && len(b) == len(buf) && len(buf) > 1 { + buf = buf[1:] + } + b = b[1:] + i %= d + } + return string(buf) +} + +func printBool(b bool) string { + if b { + return "true" + } + return "false" +} + var ( // ErrNotStarted indicates that the prerequisite information isn't // available yet because the previous records haven't been appropriately @@ -161,6 +341,19 @@ func (m *Header) pack() (id uint16, bits uint16) { return } +// GoString implements fmt.GoStringer.GoString. +func (m *Header) GoString() string { + return "dnsmessage.Header{" + + "ID: " + printUint16(m.ID) + ", " + + "Response: " + printBool(m.Response) + ", " + + "OpCode: " + m.OpCode.GoString() + ", " + + "Authoritative: " + printBool(m.Authoritative) + ", " + + "Truncated: " + printBool(m.Truncated) + ", " + + "RecursionDesired: " + printBool(m.RecursionDesired) + ", " + + "RecursionAvailable: " + printBool(m.RecursionAvailable) + ", " + + "RCode: " + m.RCode.GoString() + "}" +} + // Message is a representation of a DNS message. type Message struct { Header @@ -273,6 +466,13 @@ type Resource struct { Body ResourceBody } +func (r *Resource) GoString() string { + return "dnsmessage.Resource{" + + "Header: " + r.Header.GoString() + + ", Body: &" + r.Body.GoString() + + "}" +} + // A ResourceBody is a DNS resource record minus the header. type ResourceBody interface { // pack packs a Resource except for its header. @@ -281,6 +481,9 @@ type ResourceBody interface { // realType returns the actual type of the Resource. This is used to // fill in the header Type field. realType() Type + + // GoString implements fmt.GoStringer.GoString. + GoString() string } // pack appends the wire format of the Resource to msg. @@ -290,7 +493,7 @@ func (r *Resource) pack(msg []byte, compression map[string]int, compressionOff i } oldMsg := msg r.Header.Type = r.Body.realType() - msg, length, err := r.Header.pack(msg, compression, compressionOff) + msg, lenOff, err := r.Header.pack(msg, compression, compressionOff) if err != nil { return msg, &nestedError{"ResourceHeader", err} } @@ -299,7 +502,7 @@ func (r *Resource) pack(msg []byte, compression map[string]int, compressionOff i if err != nil { return msg, &nestedError{"content", err} } - if err := r.Header.fixLen(msg, length, preLen); err != nil { + if err := r.Header.fixLen(msg, lenOff, preLen); err != nil { return oldMsg, err } return msg, nil @@ -802,6 +1005,24 @@ func (p *Parser) AAAAResource() (AAAAResource, error) { return r, nil } +// OPTResource parses a single OPTResource. +// +// One of the XXXHeader methods must have been called before calling this +// method. +func (p *Parser) OPTResource() (OPTResource, error) { + if !p.resHeaderValid || p.resHeader.Type != TypeOPT { + return OPTResource{}, ErrNotStarted + } + r, err := unpackOPTResource(p.msg, p.off, p.resHeader.Length) + if err != nil { + return OPTResource{}, err + } + p.off += int(p.resHeader.Length) + p.resHeaderValid = false + p.index++ + return r, nil +} + // Unpack parses a full Message. func (m *Message) Unpack(msg []byte) error { var p Parser @@ -897,6 +1118,40 @@ func (m *Message) AppendPack(b []byte) ([]byte, error) { return msg, nil } +// GoString implements fmt.GoStringer.GoString. +func (m *Message) GoString() string { + s := "dnsmessage.Message{Header: " + m.Header.GoString() + ", " + + "Questions: []dnsmessage.Question{" + if len(m.Questions) > 0 { + s += m.Questions[0].GoString() + for _, q := range m.Questions[1:] { + s += ", " + q.GoString() + } + } + s += "}, Answers: []dnsmessage.Resource{" + if len(m.Answers) > 0 { + s += m.Answers[0].GoString() + for _, a := range m.Answers[1:] { + s += ", " + a.GoString() + } + } + s += "}, Authorities: []dnsmessage.Resource{" + if len(m.Authorities) > 0 { + s += m.Authorities[0].GoString() + for _, a := range m.Authorities[1:] { + s += ", " + a.GoString() + } + } + s += "}, Additionals: []dnsmessage.Resource{" + if len(m.Additionals) > 0 { + s += m.Additionals[0].GoString() + for _, a := range m.Additionals[1:] { + s += ", " + a.GoString() + } + } + return s + "}}" +} + // A Builder allows incrementally packing a DNS message. // // Example usage: @@ -1068,7 +1323,7 @@ func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1076,7 +1331,7 @@ func (b *Builder) CNAMEResource(h ResourceHeader, r CNAMEResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"CNAMEResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1092,7 +1347,7 @@ func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1100,7 +1355,7 @@ func (b *Builder) MXResource(h ResourceHeader, r MXResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"MXResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1116,7 +1371,7 @@ func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1124,7 +1379,7 @@ func (b *Builder) NSResource(h ResourceHeader, r NSResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"NSResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1140,7 +1395,7 @@ func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1148,7 +1403,7 @@ func (b *Builder) PTRResource(h ResourceHeader, r PTRResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"PTRResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1164,7 +1419,7 @@ func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1172,7 +1427,7 @@ func (b *Builder) SOAResource(h ResourceHeader, r SOAResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"SOAResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1188,7 +1443,7 @@ func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1196,7 +1451,7 @@ func (b *Builder) TXTResource(h ResourceHeader, r TXTResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"TXTResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1212,7 +1467,7 @@ func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1220,7 +1475,7 @@ func (b *Builder) SRVResource(h ResourceHeader, r SRVResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"SRVResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1236,7 +1491,7 @@ func (b *Builder) AResource(h ResourceHeader, r AResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1244,7 +1499,7 @@ func (b *Builder) AResource(h ResourceHeader, r AResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"AResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1260,7 +1515,7 @@ func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { return err } h.Type = r.realType() - msg, length, err := h.pack(b.msg, b.compression, b.start) + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) if err != nil { return &nestedError{"ResourceHeader", err} } @@ -1268,7 +1523,31 @@ func (b *Builder) AAAAResource(h ResourceHeader, r AAAAResource) error { if msg, err = r.pack(msg, b.compression, b.start); err != nil { return &nestedError{"AAAAResource body", err} } - if err := h.fixLen(msg, length, preLen); err != nil { + if err := h.fixLen(msg, lenOff, preLen); err != nil { + return err + } + if err := b.incrementSectionCount(); err != nil { + return err + } + b.msg = msg + return nil +} + +// OPTResource adds a single OPTResource. +func (b *Builder) OPTResource(h ResourceHeader, r OPTResource) error { + if err := b.checkResourceSection(); err != nil { + return err + } + h.Type = r.realType() + msg, lenOff, err := h.pack(b.msg, b.compression, b.start) + if err != nil { + return &nestedError{"ResourceHeader", err} + } + preLen := len(msg) + if msg, err = r.pack(msg, b.compression, b.start); err != nil { + return &nestedError{"OPTResource body", err} + } + if err := h.fixLen(msg, lenOff, preLen); err != nil { return err } if err := b.incrementSectionCount(); err != nil { @@ -1315,21 +1594,30 @@ type ResourceHeader struct { Length uint16 } +// GoString implements fmt.GoStringer.GoString. +func (h *ResourceHeader) GoString() string { + return "dnsmessage.ResourceHeader{" + + "Name: " + h.Name.GoString() + ", " + + "Type: " + h.Type.GoString() + ", " + + "Class: " + h.Class.GoString() + ", " + + "TTL: " + printUint32(h.TTL) + ", " + + "Length: " + printUint16(h.Length) + "}" +} + // pack appends the wire format of the ResourceHeader to oldMsg. // -// The bytes where length was packed are returned as a slice so they can be -// updated after the rest of the Resource has been packed. -func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int, compressionOff int) (msg []byte, length []byte, err error) { +// lenOff is the offset in msg where the Length field was packed. +func (h *ResourceHeader) pack(oldMsg []byte, compression map[string]int, compressionOff int) (msg []byte, lenOff int, err error) { msg = oldMsg if msg, err = h.Name.pack(msg, compression, compressionOff); err != nil { - return oldMsg, nil, &nestedError{"Name", err} + return oldMsg, 0, &nestedError{"Name", err} } msg = packType(msg, h.Type) msg = packClass(msg, h.Class) msg = packUint32(msg, h.TTL) - lenBegin := len(msg) + lenOff = len(msg) msg = packUint16(msg, h.Length) - return msg, msg[lenBegin : lenBegin+uint16Len], nil + return msg, lenOff, nil } func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { @@ -1353,19 +1641,63 @@ func (h *ResourceHeader) unpack(msg []byte, off int) (int, error) { return newOff, nil } -func (h *ResourceHeader) fixLen(msg []byte, length []byte, preLen int) error { +// fixLen updates a packed ResourceHeader to include the length of the +// ResourceBody. +// +// lenOff is the offset of the ResourceHeader.Length field in msg. +// +// preLen is the length that msg was before the ResourceBody was packed. +func (h *ResourceHeader) fixLen(msg []byte, lenOff int, preLen int) error { conLen := len(msg) - preLen if conLen > int(^uint16(0)) { return errResTooLong } // Fill in the length now that we know how long the content is. - packUint16(length[:0], uint16(conLen)) + packUint16(msg[lenOff:lenOff], uint16(conLen)) h.Length = uint16(conLen) return nil } +// EDNS(0) wire costants. +const ( + edns0Version = 0 + + edns0DNSSECOK = 0x00008000 + ednsVersionMask = 0x00ff0000 + edns0DNSSECOKMask = 0x00ff8000 +) + +// SetEDNS0 configures h for EDNS(0). +// +// The provided extRCode must be an extedned RCode. +func (h *ResourceHeader) SetEDNS0(udpPayloadLen int, extRCode RCode, dnssecOK bool) error { + h.Name = Name{Data: [nameLen]byte{'.'}, Length: 1} // RFC 6891 section 6.1.2 + h.Type = TypeOPT + h.Class = Class(udpPayloadLen) + h.TTL = uint32(extRCode) >> 4 << 24 + if dnssecOK { + h.TTL |= edns0DNSSECOK + } + return nil +} + +// DNSSECAllowed reports whether the DNSSEC OK bit is set. +func (h *ResourceHeader) DNSSECAllowed() bool { + return h.TTL&edns0DNSSECOKMask == edns0DNSSECOK // RFC 6891 section 6.1.3 +} + +// ExtendedRCode returns an extended RCode. +// +// The provided rcode must be the RCode in DNS message header. +func (h *ResourceHeader) ExtendedRCode(rcode RCode) RCode { + if h.TTL&ednsVersionMask == edns0Version { // RFC 6891 section 6.1.3 + return RCode(h.TTL>>24<<4) | rcode + } + return rcode +} + func skipResource(msg []byte, off int) (int, error) { newOff, err := skipName(msg, off) if err != nil { @@ -1539,10 +1871,25 @@ func NewName(name string) (Name, error) { return n, nil } +// MustNewName creates a new Name from a string and panics on error. +func MustNewName(name string) Name { + n, err := NewName(name) + if err != nil { + panic("creating name: " + err.Error()) + } + return n +} + +// String implements fmt.Stringer.String. func (n Name) String() string { return string(n.Data[:n.Length]) } +// GoString implements fmt.GoStringer.GoString. +func (n *Name) GoString() string { + return `dnsmessage.MustNewName("` + printString(n.Data[:n.Length]) + `")` +} + // pack appends the wire format of the Name to msg. // // Domain names are a sequence of counted strings split at the dots. They end @@ -1742,6 +2089,14 @@ func (q *Question) pack(msg []byte, compression map[string]int, compressionOff i return packClass(msg, q.Class), nil } +// GoString implements fmt.GoStringer.GoString. +func (q *Question) GoString() string { + return "dnsmessage.Question{" + + "Name: " + q.Name.GoString() + ", " + + "Type: " + q.Type.GoString() + ", " + + "Class: " + q.Class.GoString() + "}" +} + func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, int, error) { var ( r ResourceBody @@ -1794,6 +2149,11 @@ func unpackResourceBody(msg []byte, off int, hdr ResourceHeader) (ResourceBody, rb, err = unpackSRVResource(msg, off) r = &rb name = "SRV" + case TypeOPT: + var rb OPTResource + rb, err = unpackOPTResource(msg, off, hdr.Length) + r = &rb + name = "OPT" } if err != nil { return nil, off, &nestedError{name + " record", err} @@ -1818,6 +2178,11 @@ func (r *CNAMEResource) pack(msg []byte, compression map[string]int, compression return r.CNAME.pack(msg, compression, compressionOff) } +// GoString implements fmt.GoStringer.GoString. +func (r *CNAMEResource) GoString() string { + return "dnsmessage.CNAMEResource{CNAME: " + r.CNAME.GoString() + "}" +} + func unpackCNAMEResource(msg []byte, off int) (CNAMEResource, error) { var cname Name if _, err := cname.unpack(msg, off); err != nil { @@ -1847,6 +2212,13 @@ func (r *MXResource) pack(msg []byte, compression map[string]int, compressionOff return msg, nil } +// GoString implements fmt.GoStringer.GoString. +func (r *MXResource) GoString() string { + return "dnsmessage.MXResource{" + + "Pref: " + printUint16(r.Pref) + ", " + + "MX: " + r.MX.GoString() + "}" +} + func unpackMXResource(msg []byte, off int) (MXResource, error) { pref, off, err := unpackUint16(msg, off) if err != nil { @@ -1873,6 +2245,11 @@ func (r *NSResource) pack(msg []byte, compression map[string]int, compressionOff return r.NS.pack(msg, compression, compressionOff) } +// GoString implements fmt.GoStringer.GoString. +func (r *NSResource) GoString() string { + return "dnsmessage.NSResource{NS: " + r.NS.GoString() + "}" +} + func unpackNSResource(msg []byte, off int) (NSResource, error) { var ns Name if _, err := ns.unpack(msg, off); err != nil { @@ -1895,6 +2272,11 @@ func (r *PTRResource) pack(msg []byte, compression map[string]int, compressionOf return r.PTR.pack(msg, compression, compressionOff) } +// GoString implements fmt.GoStringer.GoString. +func (r *PTRResource) GoString() string { + return "dnsmessage.PTRResource{PTR: " + r.PTR.GoString() + "}" +} + func unpackPTRResource(msg []byte, off int) (PTRResource, error) { var ptr Name if _, err := ptr.unpack(msg, off); err != nil { @@ -1940,6 +2322,18 @@ func (r *SOAResource) pack(msg []byte, compression map[string]int, compressionOf return packUint32(msg, r.MinTTL), nil } +// GoString implements fmt.GoStringer.GoString. +func (r *SOAResource) GoString() string { + return "dnsmessage.SOAResource{" + + "NS: " + r.NS.GoString() + ", " + + "MBox: " + r.MBox.GoString() + ", " + + "Serial: " + printUint32(r.Serial) + ", " + + "Refresh: " + printUint32(r.Refresh) + ", " + + "Retry: " + printUint32(r.Retry) + ", " + + "Expire: " + printUint32(r.Expire) + ", " + + "MinTTL: " + printUint32(r.MinTTL) + "}" +} + func unpackSOAResource(msg []byte, off int) (SOAResource, error) { var ns Name off, err := ns.unpack(msg, off) @@ -1995,6 +2389,19 @@ func (r *TXTResource) pack(msg []byte, compression map[string]int, compressionOf return msg, nil } +// GoString implements fmt.GoStringer.GoString. +func (r *TXTResource) GoString() string { + s := "dnsmessage.TXTResource{TXT: []string{" + if len(r.TXT) == 0 { + return s + "}}" + } + s += `"` + printString([]byte(r.TXT[0])) + for _, t := range r.TXT[1:] { + s += `", "` + printString([]byte(t)) + } + return s + `"}}` +} + func unpackTXTResource(msg []byte, off int, length uint16) (TXTResource, error) { txts := make([]string, 0, 1) for n := uint16(0); n < length; { @@ -2038,6 +2445,15 @@ func (r *SRVResource) pack(msg []byte, compression map[string]int, compressionOf return msg, nil } +// GoString implements fmt.GoStringer.GoString. +func (r *SRVResource) GoString() string { + return "dnsmessage.SRVResource{" + + "Priority: " + printUint16(r.Priority) + ", " + + "Weight: " + printUint16(r.Weight) + ", " + + "Port: " + printUint16(r.Port) + ", " + + "Target: " + r.Target.GoString() + "}" +} + func unpackSRVResource(msg []byte, off int) (SRVResource, error) { priority, off, err := unpackUint16(msg, off) if err != nil { @@ -2072,6 +2488,12 @@ func (r *AResource) pack(msg []byte, compression map[string]int, compressionOff return packBytes(msg, r.A[:]), nil } +// GoString implements fmt.GoStringer.GoString. +func (r *AResource) GoString() string { + return "dnsmessage.AResource{" + + "A: [4]byte{" + printByteSlice(r.A[:]) + "}}" +} + func unpackAResource(msg []byte, off int) (AResource, error) { var a [4]byte if _, err := unpackBytes(msg, off, a[:]); err != nil { @@ -2089,6 +2511,12 @@ func (r *AAAAResource) realType() Type { return TypeAAAA } +// GoString implements fmt.GoStringer.GoString. +func (r *AAAAResource) GoString() string { + return "dnsmessage.AAAAResource{" + + "AAAA: [16]byte{" + printByteSlice(r.AAAA[:]) + "}}" +} + // pack appends the wire format of the AAAAResource to msg. func (r *AAAAResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { return packBytes(msg, r.AAAA[:]), nil @@ -2101,3 +2529,78 @@ func unpackAAAAResource(msg []byte, off int) (AAAAResource, error) { } return AAAAResource{aaaa}, nil } + +// An OPTResource is an OPT pseudo Resource record. +// +// The pseudo resource record is part of the extension mechanisms for DNS +// as defined in RFC 6891. +type OPTResource struct { + Options []Option +} + +// An Option represents a DNS message option within OPTResource. +// +// The message option is part of the extension mechanisms for DNS as +// defined in RFC 6891. +type Option struct { + Code uint16 // option code + Data []byte +} + +// GoString implements fmt.GoStringer.GoString. +func (o *Option) GoString() string { + return "dnsmessage.Option{" + + "Code: " + printUint16(o.Code) + ", " + + "Data: []byte{" + printByteSlice(o.Data) + "}}" +} + +func (r *OPTResource) realType() Type { + return TypeOPT +} + +func (r *OPTResource) pack(msg []byte, compression map[string]int, compressionOff int) ([]byte, error) { + for _, opt := range r.Options { + msg = packUint16(msg, opt.Code) + l := uint16(len(opt.Data)) + msg = packUint16(msg, l) + msg = packBytes(msg, opt.Data) + } + return msg, nil +} + +// GoString implements fmt.GoStringer.GoString. +func (r *OPTResource) GoString() string { + s := "dnsmessage.OPTResource{Options: []dnsmessage.Option{" + if len(r.Options) == 0 { + return s + "}}" + } + s += r.Options[0].GoString() + for _, o := range r.Options[1:] { + s += ", " + o.GoString() + } + return s + "}}" +} + +func unpackOPTResource(msg []byte, off int, length uint16) (OPTResource, error) { + var opts []Option + for oldOff := off; off < oldOff+int(length); { + var err error + var o Option + o.Code, off, err = unpackUint16(msg, off) + if err != nil { + return OPTResource{}, &nestedError{"Code", err} + } + var l uint16 + l, off, err = unpackUint16(msg, off) + if err != nil { + return OPTResource{}, &nestedError{"Data", err} + } + o.Data = make([]byte, l) + if copy(o.Data, msg[off:]) != int(l) { + return OPTResource{}, &nestedError{"Data", errCalcLen} + } + off += int(l) + opts = append(opts, o) + } + return OPTResource{opts}, nil +} diff --git a/src/internal/x/net/http/httpguts/guts.go b/src/vendor/golang.org/x/net/http/httpguts/guts.go similarity index 100% rename from src/internal/x/net/http/httpguts/guts.go rename to src/vendor/golang.org/x/net/http/httpguts/guts.go diff --git a/src/internal/x/net/http/httpguts/httplex.go b/src/vendor/golang.org/x/net/http/httpguts/httplex.go similarity index 99% rename from src/internal/x/net/http/httpguts/httplex.go rename to src/vendor/golang.org/x/net/http/httpguts/httplex.go index 7f3cdd8bd2..e7de24ee64 100644 --- a/src/internal/x/net/http/httpguts/httplex.go +++ b/src/vendor/golang.org/x/net/http/httpguts/httplex.go @@ -9,7 +9,7 @@ import ( "strings" "unicode/utf8" - "internal/x/net/idna" + "golang.org/x/net/idna" ) var isTokenTable = [127]bool{ diff --git a/src/internal/x/net/http/httpproxy/proxy.go b/src/vendor/golang.org/x/net/http/httpproxy/proxy.go similarity index 99% rename from src/internal/x/net/http/httpproxy/proxy.go rename to src/vendor/golang.org/x/net/http/httpproxy/proxy.go index d394784139..163645b86f 100644 --- a/src/internal/x/net/http/httpproxy/proxy.go +++ b/src/vendor/golang.org/x/net/http/httpproxy/proxy.go @@ -19,7 +19,7 @@ import ( "strings" "unicode/utf8" - "internal/x/net/idna" + "golang.org/x/net/idna" ) // Config holds configuration for HTTP proxy settings. See diff --git a/src/internal/x/net/http2/hpack/encode.go b/src/vendor/golang.org/x/net/http2/hpack/encode.go similarity index 100% rename from src/internal/x/net/http2/hpack/encode.go rename to src/vendor/golang.org/x/net/http2/hpack/encode.go diff --git a/src/internal/x/net/http2/hpack/hpack.go b/src/vendor/golang.org/x/net/http2/hpack/hpack.go similarity index 100% rename from src/internal/x/net/http2/hpack/hpack.go rename to src/vendor/golang.org/x/net/http2/hpack/hpack.go diff --git a/src/internal/x/net/http2/hpack/huffman.go b/src/vendor/golang.org/x/net/http2/hpack/huffman.go similarity index 100% rename from src/internal/x/net/http2/hpack/huffman.go rename to src/vendor/golang.org/x/net/http2/hpack/huffman.go diff --git a/src/internal/x/net/http2/hpack/tables.go b/src/vendor/golang.org/x/net/http2/hpack/tables.go similarity index 100% rename from src/internal/x/net/http2/hpack/tables.go rename to src/vendor/golang.org/x/net/http2/hpack/tables.go diff --git a/src/internal/x/net/idna/idna.go b/src/vendor/golang.org/x/net/idna/idna.go similarity index 99% rename from src/internal/x/net/idna/idna.go rename to src/vendor/golang.org/x/net/idna/idna.go index 7f2471e70e..346fe4423e 100644 --- a/src/internal/x/net/idna/idna.go +++ b/src/vendor/golang.org/x/net/idna/idna.go @@ -13,16 +13,16 @@ // UTS #46 is defined in http://www.unicode.org/reports/tr46. // See http://unicode.org/cldr/utility/idna.jsp for a visualization of the // differences between these two standards. -package idna +package idna // import "golang.org/x/net/idna" import ( "fmt" "strings" "unicode/utf8" - "internal/x/text/secure/bidirule" - "internal/x/text/unicode/bidi" - "internal/x/text/unicode/norm" + "golang.org/x/text/secure/bidirule" + "golang.org/x/text/unicode/bidi" + "golang.org/x/text/unicode/norm" ) // NOTE: Unlike common practice in Go APIs, the functions will return a diff --git a/src/internal/x/net/idna/punycode.go b/src/vendor/golang.org/x/net/idna/punycode.go similarity index 100% rename from src/internal/x/net/idna/punycode.go rename to src/vendor/golang.org/x/net/idna/punycode.go diff --git a/src/internal/x/net/idna/tables.go b/src/vendor/golang.org/x/net/idna/tables.go similarity index 99% rename from src/internal/x/net/idna/tables.go rename to src/vendor/golang.org/x/net/idna/tables.go index 41cf9c13d2..f910b26914 100644 --- a/src/internal/x/net/idna/tables.go +++ b/src/vendor/golang.org/x/net/idna/tables.go @@ -1,7 +1,5 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// Code generated by running "go generate" in internal/x/text. DO NOT EDIT. - package idna // UnicodeVersion is the Unicode version from which the tables in this package are derived. diff --git a/src/internal/x/net/idna/trie.go b/src/vendor/golang.org/x/net/idna/trie.go similarity index 100% rename from src/internal/x/net/idna/trie.go rename to src/vendor/golang.org/x/net/idna/trie.go diff --git a/src/internal/x/net/idna/trieval.go b/src/vendor/golang.org/x/net/idna/trieval.go similarity index 97% rename from src/internal/x/net/idna/trieval.go rename to src/vendor/golang.org/x/net/idna/trieval.go index bf57260034..7a8cf889b5 100644 --- a/src/internal/x/net/idna/trieval.go +++ b/src/vendor/golang.org/x/net/idna/trieval.go @@ -1,7 +1,5 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// Code generated by running "go generate" in internal/x/text. DO NOT EDIT. - package idna // This file contains definitions for interpreting the trie value of the idna diff --git a/src/internal/x/net/lif/address.go b/src/vendor/golang.org/x/net/lif/address.go similarity index 100% rename from src/internal/x/net/lif/address.go rename to src/vendor/golang.org/x/net/lif/address.go diff --git a/src/internal/x/net/lif/binary.go b/src/vendor/golang.org/x/net/lif/binary.go similarity index 100% rename from src/internal/x/net/lif/binary.go rename to src/vendor/golang.org/x/net/lif/binary.go diff --git a/src/internal/x/net/lif/defs_solaris.go b/src/vendor/golang.org/x/net/lif/defs_solaris.go similarity index 100% rename from src/internal/x/net/lif/defs_solaris.go rename to src/vendor/golang.org/x/net/lif/defs_solaris.go diff --git a/src/internal/x/net/lif/lif.go b/src/vendor/golang.org/x/net/lif/lif.go similarity index 100% rename from src/internal/x/net/lif/lif.go rename to src/vendor/golang.org/x/net/lif/lif.go diff --git a/src/internal/x/net/lif/link.go b/src/vendor/golang.org/x/net/lif/link.go similarity index 100% rename from src/internal/x/net/lif/link.go rename to src/vendor/golang.org/x/net/lif/link.go diff --git a/src/internal/x/net/lif/sys.go b/src/vendor/golang.org/x/net/lif/sys.go similarity index 100% rename from src/internal/x/net/lif/sys.go rename to src/vendor/golang.org/x/net/lif/sys.go diff --git a/src/internal/x/net/lif/sys_solaris_amd64.s b/src/vendor/golang.org/x/net/lif/sys_solaris_amd64.s similarity index 100% rename from src/internal/x/net/lif/sys_solaris_amd64.s rename to src/vendor/golang.org/x/net/lif/sys_solaris_amd64.s diff --git a/src/internal/x/net/lif/syscall.go b/src/vendor/golang.org/x/net/lif/syscall.go similarity index 100% rename from src/internal/x/net/lif/syscall.go rename to src/vendor/golang.org/x/net/lif/syscall.go diff --git a/src/internal/x/net/lif/zsys_solaris_amd64.go b/src/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go similarity index 100% rename from src/internal/x/net/lif/zsys_solaris_amd64.go rename to src/vendor/golang.org/x/net/lif/zsys_solaris_amd64.go diff --git a/src/internal/x/net/nettest/conntest.go b/src/vendor/golang.org/x/net/nettest/conntest.go similarity index 100% rename from src/internal/x/net/nettest/conntest.go rename to src/vendor/golang.org/x/net/nettest/conntest.go diff --git a/src/internal/x/net/nettest/conntest_go16.go b/src/vendor/golang.org/x/net/nettest/conntest_go16.go similarity index 100% rename from src/internal/x/net/nettest/conntest_go16.go rename to src/vendor/golang.org/x/net/nettest/conntest_go16.go diff --git a/src/internal/x/net/nettest/conntest_go17.go b/src/vendor/golang.org/x/net/nettest/conntest_go17.go similarity index 100% rename from src/internal/x/net/nettest/conntest_go17.go rename to src/vendor/golang.org/x/net/nettest/conntest_go17.go diff --git a/src/internal/x/net/route/address.go b/src/vendor/golang.org/x/net/route/address.go similarity index 100% rename from src/internal/x/net/route/address.go rename to src/vendor/golang.org/x/net/route/address.go diff --git a/src/internal/x/net/route/binary.go b/src/vendor/golang.org/x/net/route/binary.go similarity index 100% rename from src/internal/x/net/route/binary.go rename to src/vendor/golang.org/x/net/route/binary.go diff --git a/src/internal/x/net/route/defs_darwin.go b/src/vendor/golang.org/x/net/route/defs_darwin.go similarity index 100% rename from src/internal/x/net/route/defs_darwin.go rename to src/vendor/golang.org/x/net/route/defs_darwin.go diff --git a/src/internal/x/net/route/defs_dragonfly.go b/src/vendor/golang.org/x/net/route/defs_dragonfly.go similarity index 100% rename from src/internal/x/net/route/defs_dragonfly.go rename to src/vendor/golang.org/x/net/route/defs_dragonfly.go diff --git a/src/internal/x/net/route/defs_freebsd.go b/src/vendor/golang.org/x/net/route/defs_freebsd.go similarity index 100% rename from src/internal/x/net/route/defs_freebsd.go rename to src/vendor/golang.org/x/net/route/defs_freebsd.go diff --git a/src/internal/x/net/route/defs_netbsd.go b/src/vendor/golang.org/x/net/route/defs_netbsd.go similarity index 100% rename from src/internal/x/net/route/defs_netbsd.go rename to src/vendor/golang.org/x/net/route/defs_netbsd.go diff --git a/src/internal/x/net/route/defs_openbsd.go b/src/vendor/golang.org/x/net/route/defs_openbsd.go similarity index 100% rename from src/internal/x/net/route/defs_openbsd.go rename to src/vendor/golang.org/x/net/route/defs_openbsd.go diff --git a/src/internal/x/net/route/empty.s b/src/vendor/golang.org/x/net/route/empty.s similarity index 100% rename from src/internal/x/net/route/empty.s rename to src/vendor/golang.org/x/net/route/empty.s diff --git a/src/internal/x/net/route/interface.go b/src/vendor/golang.org/x/net/route/interface.go similarity index 100% rename from src/internal/x/net/route/interface.go rename to src/vendor/golang.org/x/net/route/interface.go diff --git a/src/internal/x/net/route/interface_announce.go b/src/vendor/golang.org/x/net/route/interface_announce.go similarity index 100% rename from src/internal/x/net/route/interface_announce.go rename to src/vendor/golang.org/x/net/route/interface_announce.go diff --git a/src/internal/x/net/route/interface_classic.go b/src/vendor/golang.org/x/net/route/interface_classic.go similarity index 100% rename from src/internal/x/net/route/interface_classic.go rename to src/vendor/golang.org/x/net/route/interface_classic.go diff --git a/src/internal/x/net/route/interface_freebsd.go b/src/vendor/golang.org/x/net/route/interface_freebsd.go similarity index 100% rename from src/internal/x/net/route/interface_freebsd.go rename to src/vendor/golang.org/x/net/route/interface_freebsd.go diff --git a/src/internal/x/net/route/interface_multicast.go b/src/vendor/golang.org/x/net/route/interface_multicast.go similarity index 100% rename from src/internal/x/net/route/interface_multicast.go rename to src/vendor/golang.org/x/net/route/interface_multicast.go diff --git a/src/internal/x/net/route/interface_openbsd.go b/src/vendor/golang.org/x/net/route/interface_openbsd.go similarity index 100% rename from src/internal/x/net/route/interface_openbsd.go rename to src/vendor/golang.org/x/net/route/interface_openbsd.go diff --git a/src/internal/x/net/route/message.go b/src/vendor/golang.org/x/net/route/message.go similarity index 100% rename from src/internal/x/net/route/message.go rename to src/vendor/golang.org/x/net/route/message.go diff --git a/src/internal/x/net/route/route.go b/src/vendor/golang.org/x/net/route/route.go similarity index 100% rename from src/internal/x/net/route/route.go rename to src/vendor/golang.org/x/net/route/route.go diff --git a/src/internal/x/net/route/route_classic.go b/src/vendor/golang.org/x/net/route/route_classic.go similarity index 100% rename from src/internal/x/net/route/route_classic.go rename to src/vendor/golang.org/x/net/route/route_classic.go diff --git a/src/internal/x/net/route/route_openbsd.go b/src/vendor/golang.org/x/net/route/route_openbsd.go similarity index 100% rename from src/internal/x/net/route/route_openbsd.go rename to src/vendor/golang.org/x/net/route/route_openbsd.go diff --git a/src/internal/x/net/route/sys.go b/src/vendor/golang.org/x/net/route/sys.go similarity index 100% rename from src/internal/x/net/route/sys.go rename to src/vendor/golang.org/x/net/route/sys.go diff --git a/src/internal/x/net/route/sys_darwin.go b/src/vendor/golang.org/x/net/route/sys_darwin.go similarity index 100% rename from src/internal/x/net/route/sys_darwin.go rename to src/vendor/golang.org/x/net/route/sys_darwin.go diff --git a/src/internal/x/net/route/sys_dragonfly.go b/src/vendor/golang.org/x/net/route/sys_dragonfly.go similarity index 100% rename from src/internal/x/net/route/sys_dragonfly.go rename to src/vendor/golang.org/x/net/route/sys_dragonfly.go diff --git a/src/internal/x/net/route/sys_freebsd.go b/src/vendor/golang.org/x/net/route/sys_freebsd.go similarity index 100% rename from src/internal/x/net/route/sys_freebsd.go rename to src/vendor/golang.org/x/net/route/sys_freebsd.go diff --git a/src/internal/x/net/route/sys_netbsd.go b/src/vendor/golang.org/x/net/route/sys_netbsd.go similarity index 100% rename from src/internal/x/net/route/sys_netbsd.go rename to src/vendor/golang.org/x/net/route/sys_netbsd.go diff --git a/src/internal/x/net/route/sys_openbsd.go b/src/vendor/golang.org/x/net/route/sys_openbsd.go similarity index 100% rename from src/internal/x/net/route/sys_openbsd.go rename to src/vendor/golang.org/x/net/route/sys_openbsd.go diff --git a/src/internal/x/net/route/syscall.go b/src/vendor/golang.org/x/net/route/syscall.go similarity index 100% rename from src/internal/x/net/route/syscall.go rename to src/vendor/golang.org/x/net/route/syscall.go diff --git a/src/internal/x/net/route/syscall_go1_11_darwin.go b/src/vendor/golang.org/x/net/route/syscall_go1_11_darwin.go similarity index 100% rename from src/internal/x/net/route/syscall_go1_11_darwin.go rename to src/vendor/golang.org/x/net/route/syscall_go1_11_darwin.go diff --git a/src/internal/x/net/route/syscall_go1_12_darwin.go b/src/vendor/golang.org/x/net/route/syscall_go1_12_darwin.go similarity index 100% rename from src/internal/x/net/route/syscall_go1_12_darwin.go rename to src/vendor/golang.org/x/net/route/syscall_go1_12_darwin.go diff --git a/src/internal/x/net/route/zsys_darwin.go b/src/vendor/golang.org/x/net/route/zsys_darwin.go similarity index 100% rename from src/internal/x/net/route/zsys_darwin.go rename to src/vendor/golang.org/x/net/route/zsys_darwin.go diff --git a/src/internal/x/net/route/zsys_dragonfly.go b/src/vendor/golang.org/x/net/route/zsys_dragonfly.go similarity index 100% rename from src/internal/x/net/route/zsys_dragonfly.go rename to src/vendor/golang.org/x/net/route/zsys_dragonfly.go diff --git a/src/internal/x/net/route/zsys_freebsd_386.go b/src/vendor/golang.org/x/net/route/zsys_freebsd_386.go similarity index 100% rename from src/internal/x/net/route/zsys_freebsd_386.go rename to src/vendor/golang.org/x/net/route/zsys_freebsd_386.go diff --git a/src/internal/x/net/route/zsys_freebsd_amd64.go b/src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go similarity index 100% rename from src/internal/x/net/route/zsys_freebsd_amd64.go rename to src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go diff --git a/src/internal/x/net/route/zsys_freebsd_arm.go b/src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go similarity index 100% rename from src/internal/x/net/route/zsys_freebsd_arm.go rename to src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go diff --git a/src/internal/x/net/route/zsys_netbsd.go b/src/vendor/golang.org/x/net/route/zsys_netbsd.go similarity index 100% rename from src/internal/x/net/route/zsys_netbsd.go rename to src/vendor/golang.org/x/net/route/zsys_netbsd.go diff --git a/src/internal/x/net/route/zsys_openbsd.go b/src/vendor/golang.org/x/net/route/zsys_openbsd.go similarity index 100% rename from src/internal/x/net/route/zsys_openbsd.go rename to src/vendor/golang.org/x/net/route/zsys_openbsd.go diff --git a/src/vendor/golang.org/x/sys/AUTHORS b/src/vendor/golang.org/x/sys/AUTHORS new file mode 100644 index 0000000000..15167cd746 --- /dev/null +++ b/src/vendor/golang.org/x/sys/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/src/vendor/golang.org/x/sys/CONTRIBUTORS b/src/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100644 index 0000000000..1c4577e968 --- /dev/null +++ b/src/vendor/golang.org/x/sys/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/src/vendor/golang.org/x/sys/LICENSE b/src/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 0000000000..6a66aea5ea --- /dev/null +++ b/src/vendor/golang.org/x/sys/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/vendor/golang.org/x/sys/PATENTS b/src/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 0000000000..733099041f --- /dev/null +++ b/src/vendor/golang.org/x/sys/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/src/vendor/golang.org/x/sys/cpu/byteorder.go b/src/vendor/golang.org/x/sys/cpu/byteorder.go new file mode 100644 index 0000000000..da6b9e4363 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/byteorder.go @@ -0,0 +1,30 @@ +// Copyright 2019 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 cpu + +import ( + "encoding/binary" + "runtime" +) + +// hostByteOrder returns binary.LittleEndian on little-endian machines and +// binary.BigEndian on big-endian machines. +func hostByteOrder() binary.ByteOrder { + switch runtime.GOARCH { + case "386", "amd64", "amd64p32", + "arm", "arm64", + "mipsle", "mips64le", "mips64p32le", + "ppc64le", + "riscv", "riscv64": + return binary.LittleEndian + case "armbe", "arm64be", + "mips", "mips64", "mips64p32", + "ppc", "ppc64", + "s390", "s390x", + "sparc", "sparc64": + return binary.BigEndian + } + panic("unknown architecture") +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu.go b/src/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 0000000000..679e78c2ce --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,126 @@ +// Copyright 2018 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 cpu implements processor feature detection for +// various CPU architectures. +package cpu + +// Initialized reports whether the CPU features were initialized. +// +// For some GOOS/GOARCH combinations initialization of the CPU features depends +// on reading an operating specific file, e.g. /proc/self/auxv on linux/arm +// Initialized will report false if reading the file fails. +var Initialized bool + +// CacheLinePad is used to pad structs to avoid false sharing. +type CacheLinePad struct{ _ [cacheLineSize]byte } + +// X86 contains the supported CPU features of the +// current X86/AMD64 platform. If the current platform +// is not X86/AMD64 then all feature flags are false. +// +// X86 is padded to avoid false sharing. Further the HasAVX +// and HasAVX2 are only set if the OS supports XMM and YMM +// registers in addition to the CPUID feature bit being set. +var X86 struct { + _ CacheLinePad + HasAES bool // AES hardware implementation (AES NI) + HasADX bool // Multi-precision add-carry instruction extensions + HasAVX bool // Advanced vector extension + HasAVX2 bool // Advanced vector extension 2 + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + HasERMS bool // Enhanced REP for MOVSB and STOSB + HasFMA bool // Fused-multiply-add instructions + HasOSXSAVE bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers. + HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM + HasPOPCNT bool // Hamming weight instruction POPCNT. + HasRDRAND bool // RDRAND instruction (on-chip random number generator) + HasRDSEED bool // RDSEED instruction (on-chip random number generator) + HasSSE2 bool // Streaming SIMD extension 2 (always available on amd64) + HasSSE3 bool // Streaming SIMD extension 3 + HasSSSE3 bool // Supplemental streaming SIMD extension 3 + HasSSE41 bool // Streaming SIMD extension 4 and 4.1 + HasSSE42 bool // Streaming SIMD extension 4 and 4.2 + _ CacheLinePad +} + +// ARM64 contains the supported CPU features of the +// current ARMv8(aarch64) platform. If the current platform +// is not arm64 then all feature flags are false. +var ARM64 struct { + _ CacheLinePad + HasFP bool // Floating-point instruction set (always available) + HasASIMD bool // Advanced SIMD (always available) + HasEVTSTRM bool // Event stream support + HasAES bool // AES hardware implementation + HasPMULL bool // Polynomial multiplication instruction set + HasSHA1 bool // SHA1 hardware implementation + HasSHA2 bool // SHA2 hardware implementation + HasCRC32 bool // CRC32 hardware implementation + HasATOMICS bool // Atomic memory operation instruction set + HasFPHP bool // Half precision floating-point instruction set + HasASIMDHP bool // Advanced SIMD half precision instruction set + HasCPUID bool // CPUID identification scheme registers + HasASIMDRDM bool // Rounding double multiply add/subtract instruction set + HasJSCVT bool // Javascript conversion from floating-point to integer + HasFCMA bool // Floating-point multiplication and addition of complex numbers + HasLRCPC bool // Release Consistent processor consistent support + HasDCPOP bool // Persistent memory support + HasSHA3 bool // SHA3 hardware implementation + HasSM3 bool // SM3 hardware implementation + HasSM4 bool // SM4 hardware implementation + HasASIMDDP bool // Advanced SIMD double precision instruction set + HasSHA512 bool // SHA512 hardware implementation + HasSVE bool // Scalable Vector Extensions + HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32 + _ CacheLinePad +} + +// PPC64 contains the supported CPU features of the current ppc64/ppc64le platforms. +// If the current platform is not ppc64/ppc64le then all feature flags are false. +// +// For ppc64/ppc64le, it is safe to check only for ISA level starting on ISA v3.00, +// since there are no optional categories. There are some exceptions that also +// require kernel support to work (DARN, SCV), so there are feature bits for +// those as well. The minimum processor requirement is POWER8 (ISA 2.07). +// The struct is padded to avoid false sharing. +var PPC64 struct { + _ CacheLinePad + HasDARN bool // Hardware random number generator (requires kernel enablement) + HasSCV bool // Syscall vectored (requires kernel enablement) + IsPOWER8 bool // ISA v2.07 (POWER8) + IsPOWER9 bool // ISA v3.00 (POWER9) + _ CacheLinePad +} + +// S390X contains the supported CPU features of the current IBM Z +// (s390x) platform. If the current platform is not IBM Z then all +// feature flags are false. +// +// S390X is padded to avoid false sharing. Further HasVX is only set +// if the OS supports vector registers in addition to the STFLE +// feature bit being set. +var S390X struct { + _ CacheLinePad + HasZARCH bool // z/Architecture mode is active [mandatory] + HasSTFLE bool // store facility list extended + HasLDISP bool // long (20-bit) displacements + HasEIMM bool // 32-bit immediates + HasDFP bool // decimal floating point + HasETF3EH bool // ETF-3 enhanced + HasMSA bool // message security assist (CPACF) + HasAES bool // KM-AES{128,192,256} functions + HasAESCBC bool // KMC-AES{128,192,256} functions + HasAESCTR bool // KMCTR-AES{128,192,256} functions + HasAESGCM bool // KMA-GCM-AES{128,192,256} functions + HasGHASH bool // KIMD-GHASH function + HasSHA1 bool // K{I,L}MD-SHA-1 functions + HasSHA256 bool // K{I,L}MD-SHA-256 functions + HasSHA512 bool // K{I,L}MD-SHA-512 functions + HasSHA3 bool // K{I,L}MD-SHA3-{224,256,384,512} and K{I,L}MD-SHAKE-{128,256} functions + HasVX bool // vector facility + HasVXE bool // vector-enhancements facility 1 + _ CacheLinePad +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_arm.go b/src/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 0000000000..7f2348b7d4 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,9 @@ +// Copyright 2018 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 cpu + +const cacheLineSize = 32 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go b/src/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go new file mode 100644 index 0000000000..568bcd031a --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_gc_s390x.go @@ -0,0 +1,21 @@ +// Copyright 2019 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. + +// +build !gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return true } + +// The following feature detection functions are defined in cpu_s390x.s. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList +func kmQuery() queryResult +func kmcQuery() queryResult +func kmctrQuery() queryResult +func kmaQuery() queryResult +func kimdQuery() queryResult +func klmdQuery() queryResult diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/src/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go new file mode 100644 index 0000000000..f7cb46971c --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -0,0 +1,16 @@ +// Copyright 2018 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. + +// +build 386 amd64 amd64p32 +// +build !gccgo + +package cpu + +// cpuid is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler +// and in cpu_gccgo.c for gccgo. +func xgetbv() (eax, edx uint32) diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.c b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.c new file mode 100644 index 0000000000..e363c7d131 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.c @@ -0,0 +1,43 @@ +// Copyright 2018 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. + +// +build 386 amd64 amd64p32 +// +build gccgo + +#include +#include + +// Need to wrap __get_cpuid_count because it's declared as static. +int +gccgoGetCpuidCount(uint32_t leaf, uint32_t subleaf, + uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx) +{ + return __get_cpuid_count(leaf, subleaf, eax, ebx, ecx, edx); +} + +// xgetbv reads the contents of an XCR (Extended Control Register) +// specified in the ECX register into registers EDX:EAX. +// Currently, the only supported value for XCR is 0. +// +// TODO: Replace with a better alternative: +// +// #include +// +// #pragma GCC target("xsave") +// +// void gccgoXgetbv(uint32_t *eax, uint32_t *edx) { +// unsigned long long x = _xgetbv(0); +// *eax = x & 0xffffffff; +// *edx = (x >> 32) & 0xffffffff; +// } +// +// Note that _xgetbv is defined starting with GCC 8. +void +gccgoXgetbv(uint32_t *eax, uint32_t *edx) +{ + __asm(" xorl %%ecx, %%ecx\n" + " xgetbv" + : "=a"(*eax), "=d"(*edx)); +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.go b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.go new file mode 100644 index 0000000000..ba49b91bd3 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo.go @@ -0,0 +1,26 @@ +// Copyright 2018 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. + +// +build 386 amd64 amd64p32 +// +build gccgo + +package cpu + +//extern gccgoGetCpuidCount +func gccgoGetCpuidCount(eaxArg, ecxArg uint32, eax, ebx, ecx, edx *uint32) + +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) { + var a, b, c, d uint32 + gccgoGetCpuidCount(eaxArg, ecxArg, &a, &b, &c, &d) + return a, b, c, d +} + +//extern gccgoXgetbv +func gccgoXgetbv(eax, edx *uint32) + +func xgetbv() (eax, edx uint32) { + var a, d uint32 + gccgoXgetbv(&a, &d) + return a, d +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go new file mode 100644 index 0000000000..aa986f7782 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_gccgo_s390x.go @@ -0,0 +1,22 @@ +// Copyright 2019 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. + +// +build gccgo + +package cpu + +// haveAsmFunctions reports whether the other functions in this file can +// be safely called. +func haveAsmFunctions() bool { return false } + +// TODO(mundaym): the following feature detection functions are currently +// stubs. See https://golang.org/cl/162887 for how to fix this. +// They are likely to be expensive to call so the results should be cached. +func stfle() facilityList { panic("not implemented for gccgo") } +func kmQuery() queryResult { panic("not implemented for gccgo") } +func kmcQuery() queryResult { panic("not implemented for gccgo") } +func kmctrQuery() queryResult { panic("not implemented for gccgo") } +func kmaQuery() queryResult { panic("not implemented for gccgo") } +func kimdQuery() queryResult { panic("not implemented for gccgo") } +func klmdQuery() queryResult { panic("not implemented for gccgo") } diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_linux.go b/src/vendor/golang.org/x/sys/cpu/cpu_linux.go new file mode 100644 index 0000000000..76b5f507fa --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_linux.go @@ -0,0 +1,59 @@ +// Copyright 2018 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. + +//+build !amd64,!amd64p32,!386 + +package cpu + +import ( + "io/ioutil" +) + +const ( + _AT_HWCAP = 16 + _AT_HWCAP2 = 26 + + procAuxv = "/proc/self/auxv" + + uintSize = int(32 << (^uint(0) >> 63)) +) + +// For those platforms don't have a 'cpuid' equivalent we use HWCAP/HWCAP2 +// These are initialized in cpu_$GOARCH.go +// and should not be changed after they are initialized. +var hwCap uint +var hwCap2 uint + +func init() { + buf, err := ioutil.ReadFile(procAuxv) + if err != nil { + // e.g. on android /proc/self/auxv is not accessible, so silently + // ignore the error and leave Initialized = false + return + } + + bo := hostByteOrder() + for len(buf) >= 2*(uintSize/8) { + var tag, val uint + switch uintSize { + case 32: + tag = uint(bo.Uint32(buf[0:])) + val = uint(bo.Uint32(buf[4:])) + buf = buf[8:] + case 64: + tag = uint(bo.Uint64(buf[0:])) + val = uint(bo.Uint64(buf[8:])) + buf = buf[16:] + } + switch tag { + case _AT_HWCAP: + hwCap = val + case _AT_HWCAP2: + hwCap2 = val + } + } + doinit() + + Initialized = true +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go new file mode 100644 index 0000000000..fa7fb1bd7b --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go @@ -0,0 +1,67 @@ +// Copyright 2018 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 cpu + +const cacheLineSize = 64 + +// HWCAP/HWCAP2 bits. These are exposed by Linux. +const ( + hwcap_FP = 1 << 0 + hwcap_ASIMD = 1 << 1 + hwcap_EVTSTRM = 1 << 2 + hwcap_AES = 1 << 3 + hwcap_PMULL = 1 << 4 + hwcap_SHA1 = 1 << 5 + hwcap_SHA2 = 1 << 6 + hwcap_CRC32 = 1 << 7 + hwcap_ATOMICS = 1 << 8 + hwcap_FPHP = 1 << 9 + hwcap_ASIMDHP = 1 << 10 + hwcap_CPUID = 1 << 11 + hwcap_ASIMDRDM = 1 << 12 + hwcap_JSCVT = 1 << 13 + hwcap_FCMA = 1 << 14 + hwcap_LRCPC = 1 << 15 + hwcap_DCPOP = 1 << 16 + hwcap_SHA3 = 1 << 17 + hwcap_SM3 = 1 << 18 + hwcap_SM4 = 1 << 19 + hwcap_ASIMDDP = 1 << 20 + hwcap_SHA512 = 1 << 21 + hwcap_SVE = 1 << 22 + hwcap_ASIMDFHM = 1 << 23 +) + +func doinit() { + // HWCAP feature bits + ARM64.HasFP = isSet(hwCap, hwcap_FP) + ARM64.HasASIMD = isSet(hwCap, hwcap_ASIMD) + ARM64.HasEVTSTRM = isSet(hwCap, hwcap_EVTSTRM) + ARM64.HasAES = isSet(hwCap, hwcap_AES) + ARM64.HasPMULL = isSet(hwCap, hwcap_PMULL) + ARM64.HasSHA1 = isSet(hwCap, hwcap_SHA1) + ARM64.HasSHA2 = isSet(hwCap, hwcap_SHA2) + ARM64.HasCRC32 = isSet(hwCap, hwcap_CRC32) + ARM64.HasATOMICS = isSet(hwCap, hwcap_ATOMICS) + ARM64.HasFPHP = isSet(hwCap, hwcap_FPHP) + ARM64.HasASIMDHP = isSet(hwCap, hwcap_ASIMDHP) + ARM64.HasCPUID = isSet(hwCap, hwcap_CPUID) + ARM64.HasASIMDRDM = isSet(hwCap, hwcap_ASIMDRDM) + ARM64.HasJSCVT = isSet(hwCap, hwcap_JSCVT) + ARM64.HasFCMA = isSet(hwCap, hwcap_FCMA) + ARM64.HasLRCPC = isSet(hwCap, hwcap_LRCPC) + ARM64.HasDCPOP = isSet(hwCap, hwcap_DCPOP) + ARM64.HasSHA3 = isSet(hwCap, hwcap_SHA3) + ARM64.HasSM3 = isSet(hwCap, hwcap_SM3) + ARM64.HasSM4 = isSet(hwCap, hwcap_SM4) + ARM64.HasASIMDDP = isSet(hwCap, hwcap_ASIMDDP) + ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512) + ARM64.HasSVE = isSet(hwCap, hwcap_SVE) + ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go b/src/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go new file mode 100644 index 0000000000..6c8d975d40 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_linux_ppc64x.go @@ -0,0 +1,33 @@ +// Copyright 2018 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. + +// +build linux +// +build ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 + +// HWCAP/HWCAP2 bits. These are exposed by the kernel. +const ( + // ISA Level + _PPC_FEATURE2_ARCH_2_07 = 0x80000000 + _PPC_FEATURE2_ARCH_3_00 = 0x00800000 + + // CPU features + _PPC_FEATURE2_DARN = 0x00200000 + _PPC_FEATURE2_SCV = 0x00100000 +) + +func doinit() { + // HWCAP2 feature bits + PPC64.IsPOWER8 = isSet(hwCap2, _PPC_FEATURE2_ARCH_2_07) + PPC64.IsPOWER9 = isSet(hwCap2, _PPC_FEATURE2_ARCH_3_00) + PPC64.HasDARN = isSet(hwCap2, _PPC_FEATURE2_DARN) + PPC64.HasSCV = isSet(hwCap2, _PPC_FEATURE2_SCV) +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go b/src/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go new file mode 100644 index 0000000000..d579eaef40 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_linux_s390x.go @@ -0,0 +1,161 @@ +// Copyright 2019 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 cpu + +const cacheLineSize = 256 + +const ( + // bit mask values from /usr/include/bits/hwcap.h + hwcap_ZARCH = 2 + hwcap_STFLE = 4 + hwcap_MSA = 8 + hwcap_LDISP = 16 + hwcap_EIMM = 32 + hwcap_DFP = 64 + hwcap_ETF3EH = 256 + hwcap_VX = 2048 + hwcap_VXE = 8192 +) + +// bitIsSet reports whether the bit at index is set. The bit index +// is in big endian order, so bit index 0 is the leftmost bit. +func bitIsSet(bits []uint64, index uint) bool { + return bits[index/64]&((1<<63)>>(index%64)) != 0 +} + +// function is the code for the named cryptographic function. +type function uint8 + +const ( + // KM{,A,C,CTR} function codes + aes128 function = 18 // AES-128 + aes192 function = 19 // AES-192 + aes256 function = 20 // AES-256 + + // K{I,L}MD function codes + sha1 function = 1 // SHA-1 + sha256 function = 2 // SHA-256 + sha512 function = 3 // SHA-512 + sha3_224 function = 32 // SHA3-224 + sha3_256 function = 33 // SHA3-256 + sha3_384 function = 34 // SHA3-384 + sha3_512 function = 35 // SHA3-512 + shake128 function = 36 // SHAKE-128 + shake256 function = 37 // SHAKE-256 + + // KLMD function codes + ghash function = 65 // GHASH +) + +// queryResult contains the result of a Query function +// call. Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type queryResult struct { + bits [2]uint64 +} + +// Has reports whether the given functions are present. +func (q *queryResult) Has(fns ...function) bool { + if len(fns) == 0 { + panic("no function codes provided") + } + for _, f := range fns { + if !bitIsSet(q.bits[:], uint(f)) { + return false + } + } + return true +} + +// facility is a bit index for the named facility. +type facility uint8 + +const ( + // cryptography facilities + msa4 facility = 77 // message-security-assist extension 4 + msa8 facility = 146 // message-security-assist extension 8 +) + +// facilityList contains the result of an STFLE call. +// Bits are numbered in big endian order so the +// leftmost bit (the MSB) is at index 0. +type facilityList struct { + bits [4]uint64 +} + +// Has reports whether the given facilities are present. +func (s *facilityList) Has(fs ...facility) bool { + if len(fs) == 0 { + panic("no facility bits provided") + } + for _, f := range fs { + if !bitIsSet(s.bits[:], uint(f)) { + return false + } + } + return true +} + +func doinit() { + // test HWCAP bit vector + has := func(featureMask uint) bool { + return hwCap&featureMask == featureMask + } + + // mandatory + S390X.HasZARCH = has(hwcap_ZARCH) + + // optional + S390X.HasSTFLE = has(hwcap_STFLE) + S390X.HasLDISP = has(hwcap_LDISP) + S390X.HasEIMM = has(hwcap_EIMM) + S390X.HasETF3EH = has(hwcap_ETF3EH) + S390X.HasDFP = has(hwcap_DFP) + S390X.HasMSA = has(hwcap_MSA) + S390X.HasVX = has(hwcap_VX) + if S390X.HasVX { + S390X.HasVXE = has(hwcap_VXE) + } + + // We need implementations of stfle, km and so on + // to detect cryptographic features. + if !haveAsmFunctions() { + return + } + + // optional cryptographic functions + if S390X.HasMSA { + aes := []function{aes128, aes192, aes256} + + // cipher message + km, kmc := kmQuery(), kmcQuery() + S390X.HasAES = km.Has(aes...) + S390X.HasAESCBC = kmc.Has(aes...) + if S390X.HasSTFLE { + facilities := stfle() + if facilities.Has(msa4) { + kmctr := kmctrQuery() + S390X.HasAESCTR = kmctr.Has(aes...) + } + if facilities.Has(msa8) { + kma := kmaQuery() + S390X.HasAESGCM = kma.Has(aes...) + } + } + + // compute message digest + kimd := kimdQuery() // intermediate (no padding) + klmd := klmdQuery() // last (padding) + S390X.HasSHA1 = kimd.Has(sha1) && klmd.Has(sha1) + S390X.HasSHA256 = kimd.Has(sha256) && klmd.Has(sha256) + S390X.HasSHA512 = kimd.Has(sha512) && klmd.Has(sha512) + S390X.HasGHASH = kimd.Has(ghash) // KLMD-GHASH does not exist + sha3 := []function{ + sha3_224, sha3_256, sha3_384, sha3_512, + shake128, shake256, + } + S390X.HasSHA3 = kimd.Has(sha3...) && klmd.Has(sha3...) + } +} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/src/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 0000000000..f55e0c82c7 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,11 @@ +// Copyright 2018 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. + +// +build mips64 mips64le + +package cpu + +const cacheLineSize = 32 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/src/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 0000000000..cda87b1a1b --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,11 @@ +// Copyright 2018 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. + +// +build mips mipsle + +package cpu + +const cacheLineSize = 32 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go b/src/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go new file mode 100644 index 0000000000..dd1e76dc92 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_other_arm64.go @@ -0,0 +1,11 @@ +// Copyright 2019 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. + +// +build !linux,arm64 + +package cpu + +const cacheLineSize = 64 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go b/src/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go new file mode 100644 index 0000000000..3053b4b987 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_other_ppc64x.go @@ -0,0 +1,12 @@ +// Copyright 2019 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. + +// +build !linux +// +build ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_s390x.s b/src/vendor/golang.org/x/sys/cpu/cpu_s390x.s new file mode 100644 index 0000000000..e5037d92e0 --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_s390x.s @@ -0,0 +1,57 @@ +// Copyright 2019 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. + +// +build !gccgo + +#include "textflag.h" + +// func stfle() facilityList +TEXT ·stfle(SB), NOSPLIT|NOFRAME, $0-32 + MOVD $ret+0(FP), R1 + MOVD $3, R0 // last doubleword index to store + XC $32, (R1), (R1) // clear 4 doublewords (32 bytes) + WORD $0xb2b01000 // store facility list extended (STFLE) + RET + +// func kmQuery() queryResult +TEXT ·kmQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KM-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92E0024 // cipher message (KM) + RET + +// func kmcQuery() queryResult +TEXT ·kmcQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMC-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92F0024 // cipher message with chaining (KMC) + RET + +// func kmctrQuery() queryResult +TEXT ·kmctrQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMCTR-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB92D4024 // cipher message with counter (KMCTR) + RET + +// func kmaQuery() queryResult +TEXT ·kmaQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KMA-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xb9296024 // cipher message with authentication (KMA) + RET + +// func kimdQuery() queryResult +TEXT ·kimdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KIMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93E0024 // compute intermediate message digest (KIMD) + RET + +// func klmdQuery() queryResult +TEXT ·klmdQuery(SB), NOSPLIT|NOFRAME, $0-16 + MOVD $0, R0 // set function code to 0 (KLMD-Query) + MOVD $ret+0(FP), R1 // address of 16-byte return value + WORD $0xB93F0024 // compute last message digest (KLMD) + RET diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_wasm.go b/src/vendor/golang.org/x/sys/cpu/cpu_wasm.go new file mode 100644 index 0000000000..108d9e696f --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_wasm.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 cpu + +// We're compiling the cpu package for an unknown (software-abstracted) CPU. +// Make CacheLinePad an empty struct and hope that the usual struct alignment +// rules are good enough. + +const cacheLineSize = 0 + +func doinit() {} diff --git a/src/vendor/golang.org/x/sys/cpu/cpu_x86.go b/src/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 0000000000..d70d317f5a --- /dev/null +++ b/src/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,59 @@ +// Copyright 2018 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. + +// +build 386 amd64 amd64p32 + +package cpu + +const cacheLineSize = 64 + +func init() { + Initialized = true + + maxID, _, _, _ := cpuid(0, 0) + + if maxID < 1 { + return + } + + _, _, ecx1, edx1 := cpuid(1, 0) + X86.HasSSE2 = isSet(26, edx1) + + X86.HasSSE3 = isSet(0, ecx1) + X86.HasPCLMULQDQ = isSet(1, ecx1) + X86.HasSSSE3 = isSet(9, ecx1) + X86.HasFMA = isSet(12, ecx1) + X86.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + X86.HasRDRAND = isSet(30, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if X86.HasOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + X86.HasBMI1 = isSet(3, ebx7) + X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX + X86.HasBMI2 = isSet(8, ebx7) + X86.HasERMS = isSet(9, ebx7) + X86.HasRDSEED = isSet(18, ebx7) + X86.HasADX = isSet(19, ebx7) +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1< 0x0F { + log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) + } + w := gen.NewCodeWriter() + defer w.WriteGoFile(*outputFile, "bidi") + + gen.WriteUnicodeVersion(w) + + t := triegen.NewTrie("bidi") + + // Build data about bracket mapping. These bits need to be or-ed with + // any other bits. + orMask := map[rune]uint64{} + + xorMap := map[rune]int{} + xorMasks := []rune{0} // First value is no-op. + + ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { + r1 := p.Rune(0) + r2 := p.Rune(1) + xor := r1 ^ r2 + if _, ok := xorMap[xor]; !ok { + xorMap[xor] = len(xorMasks) + xorMasks = append(xorMasks, xor) + } + entry := uint64(xorMap[xor]) << xorMaskShift + switch p.String(2) { + case "o": + entry |= openMask + case "c", "n": + default: + log.Fatalf("Unknown bracket class %q.", p.String(2)) + } + orMask[r1] = entry + }) + + w.WriteComment(` + xorMasks contains masks to be xor-ed with brackets to get the reverse + version.`) + w.WriteVar("xorMasks", xorMasks) + + done := map[rune]bool{} + + insert := func(r rune, c Class) { + if !done[r] { + t.Insert(r, orMask[r]|uint64(c)) + done[r] = true + } + } + + // Insert the derived BiDi properties. + ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { + r := p.Rune(0) + class, ok := bidiClass[p.String(1)] + if !ok { + log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) + } + insert(r, class) + }) + visitDefaults(insert) + + // TODO: use sparse blocks. This would reduce table size considerably + // from the looks of it. + + sz, err := t.Gen(w) + if err != nil { + log.Fatal(err) + } + w.Size += sz +} + +// dummy values to make methods in gen_common compile. The real versions +// will be generated by this file to tables.go. +var ( + xorMasks []rune +) diff --git a/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go new file mode 100644 index 0000000000..51bd68fa7f --- /dev/null +++ b/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go @@ -0,0 +1,57 @@ +// Copyright 2015 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. + +// +build ignore + +package main + +import ( + "unicode" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/ucd" + "golang.org/x/text/unicode/rangetable" +) + +// These tables are hand-extracted from: +// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt +func visitDefaults(fn func(r rune, c Class)) { + // first write default values for ranges listed above. + visitRunes(fn, AL, []rune{ + 0x0600, 0x07BF, // Arabic + 0x08A0, 0x08FF, // Arabic Extended-A + 0xFB50, 0xFDCF, // Arabic Presentation Forms + 0xFDF0, 0xFDFF, + 0xFE70, 0xFEFF, + 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols + }) + visitRunes(fn, R, []rune{ + 0x0590, 0x05FF, // Hebrew + 0x07C0, 0x089F, // Nko et al. + 0xFB1D, 0xFB4F, + 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. + 0x0001E800, 0x0001EDFF, + 0x0001EF00, 0x0001EFFF, + }) + visitRunes(fn, ET, []rune{ // European Terminator + 0x20A0, 0x20Cf, // Currency symbols + }) + rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { + fn(r, BN) // Boundary Neutral + }) + ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { + if p.String(1) == "Default_Ignorable_Code_Point" { + fn(p.Rune(0), BN) // Boundary Neutral + } + }) +} + +func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { + for i := 0; i < len(runes); i += 2 { + lo, hi := runes[i], runes[i+1] + for j := lo; j <= hi; j++ { + fn(j, c) + } + } +} diff --git a/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go new file mode 100644 index 0000000000..9cb9942894 --- /dev/null +++ b/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go @@ -0,0 +1,64 @@ +// Copyright 2015 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. + +// +build ignore + +package main + +// Class is the Unicode BiDi class. Each rune has a single class. +type Class uint + +const ( + L Class = iota // LeftToRight + R // RightToLeft + EN // EuropeanNumber + ES // EuropeanSeparator + ET // EuropeanTerminator + AN // ArabicNumber + CS // CommonSeparator + B // ParagraphSeparator + S // SegmentSeparator + WS // WhiteSpace + ON // OtherNeutral + BN // BoundaryNeutral + NSM // NonspacingMark + AL // ArabicLetter + Control // Control LRO - PDI + + numClass + + LRO // LeftToRightOverride + RLO // RightToLeftOverride + LRE // LeftToRightEmbedding + RLE // RightToLeftEmbedding + PDF // PopDirectionalFormat + LRI // LeftToRightIsolate + RLI // RightToLeftIsolate + FSI // FirstStrongIsolate + PDI // PopDirectionalIsolate + + unknownClass = ^Class(0) +) + +var controlToClass = map[rune]Class{ + 0x202D: LRO, // LeftToRightOverride, + 0x202E: RLO, // RightToLeftOverride, + 0x202A: LRE, // LeftToRightEmbedding, + 0x202B: RLE, // RightToLeftEmbedding, + 0x202C: PDF, // PopDirectionalFormat, + 0x2066: LRI, // LeftToRightIsolate, + 0x2067: RLI, // RightToLeftIsolate, + 0x2068: FSI, // FirstStrongIsolate, + 0x2069: PDI, // PopDirectionalIsolate, +} + +// A trie entry has the following bits: +// 7..5 XOR mask for brackets +// 4 1: Bracket open, 0: Bracket close +// 3..0 Class type + +const ( + openMask = 0x10 + xorMaskShift = 5 +) diff --git a/src/internal/x/text/unicode/bidi/prop.go b/src/vendor/golang.org/x/text/unicode/bidi/prop.go similarity index 98% rename from src/internal/x/text/unicode/bidi/prop.go rename to src/vendor/golang.org/x/text/unicode/bidi/prop.go index 878b8c41b9..7c9484e1f5 100644 --- a/src/internal/x/text/unicode/bidi/prop.go +++ b/src/vendor/golang.org/x/text/unicode/bidi/prop.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2016 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. diff --git a/src/internal/x/text/unicode/bidi/tables.go b/src/vendor/golang.org/x/text/unicode/bidi/tables.go similarity index 99% rename from src/internal/x/text/unicode/bidi/tables.go rename to src/vendor/golang.org/x/text/unicode/bidi/tables.go index c9c45c625f..a0b2b17a1e 100644 --- a/src/internal/x/text/unicode/bidi/tables.go +++ b/src/vendor/golang.org/x/text/unicode/bidi/tables.go @@ -1,7 +1,5 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// Code generated by running "go generate" in internal/x/text. DO NOT EDIT. - package bidi // UnicodeVersion is the Unicode version from which the tables in this package are derived. diff --git a/src/internal/x/text/unicode/bidi/trieval.go b/src/vendor/golang.org/x/text/unicode/bidi/trieval.go similarity index 95% rename from src/internal/x/text/unicode/bidi/trieval.go rename to src/vendor/golang.org/x/text/unicode/bidi/trieval.go index e59d249c75..4c459c4b72 100644 --- a/src/internal/x/text/unicode/bidi/trieval.go +++ b/src/vendor/golang.org/x/text/unicode/bidi/trieval.go @@ -1,7 +1,5 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// Code generated by running "go generate" in internal/x/text. DO NOT EDIT. - package bidi // Class is the Unicode BiDi class. Each rune has a single class. diff --git a/src/internal/x/text/unicode/norm/composition.go b/src/vendor/golang.org/x/text/unicode/norm/composition.go similarity index 99% rename from src/internal/x/text/unicode/norm/composition.go rename to src/vendor/golang.org/x/text/unicode/norm/composition.go index 80287d2d5d..bab4c5de02 100644 --- a/src/internal/x/text/unicode/norm/composition.go +++ b/src/vendor/golang.org/x/text/unicode/norm/composition.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/internal/x/text/unicode/norm/forminfo.go b/src/vendor/golang.org/x/text/unicode/norm/forminfo.go similarity index 99% rename from src/internal/x/text/unicode/norm/forminfo.go rename to src/vendor/golang.org/x/text/unicode/norm/forminfo.go index 6455840072..e67e7655c5 100644 --- a/src/internal/x/text/unicode/norm/forminfo.go +++ b/src/vendor/golang.org/x/text/unicode/norm/forminfo.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/internal/x/text/unicode/norm/input.go b/src/vendor/golang.org/x/text/unicode/norm/input.go similarity index 96% rename from src/internal/x/text/unicode/norm/input.go rename to src/vendor/golang.org/x/text/unicode/norm/input.go index 315f6fcaa1..479e35bc25 100644 --- a/src/internal/x/text/unicode/norm/input.go +++ b/src/vendor/golang.org/x/text/unicode/norm/input.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/internal/x/text/unicode/norm/iter.go b/src/vendor/golang.org/x/text/unicode/norm/iter.go similarity index 99% rename from src/internal/x/text/unicode/norm/iter.go rename to src/vendor/golang.org/x/text/unicode/norm/iter.go index d0ae6cbc1b..ce17f96c2e 100644 --- a/src/internal/x/text/unicode/norm/iter.go +++ b/src/vendor/golang.org/x/text/unicode/norm/iter.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/vendor/golang.org/x/text/unicode/norm/maketables.go b/src/vendor/golang.org/x/text/unicode/norm/maketables.go new file mode 100644 index 0000000000..8d418160ca --- /dev/null +++ b/src/vendor/golang.org/x/text/unicode/norm/maketables.go @@ -0,0 +1,976 @@ +// Copyright 2011 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. + +// +build ignore + +// Normalization table generator. +// Data read from the web. +// See forminfo.go for a description of the trie values associated with each rune. + +package main + +import ( + "bytes" + "flag" + "fmt" + "io" + "log" + "sort" + "strconv" + "strings" + + "golang.org/x/text/internal/gen" + "golang.org/x/text/internal/triegen" + "golang.org/x/text/internal/ucd" +) + +func main() { + gen.Init() + loadUnicodeData() + compactCCC() + loadCompositionExclusions() + completeCharFields(FCanonical) + completeCharFields(FCompatibility) + computeNonStarterCounts() + verifyComputed() + printChars() + testDerived() + printTestdata() + makeTables() +} + +var ( + tablelist = flag.String("tables", + "all", + "comma-separated list of which tables to generate; "+ + "can be 'decomp', 'recomp', 'info' and 'all'") + test = flag.Bool("test", + false, + "test existing tables against DerivedNormalizationProps and generate test data for regression testing") + verbose = flag.Bool("verbose", + false, + "write data to stdout as it is parsed") +) + +const MaxChar = 0x10FFFF // anything above this shouldn't exist + +// Quick Check properties of runes allow us to quickly +// determine whether a rune may occur in a normal form. +// For a given normal form, a rune may be guaranteed to occur +// verbatim (QC=Yes), may or may not combine with another +// rune (QC=Maybe), or may not occur (QC=No). +type QCResult int + +const ( + QCUnknown QCResult = iota + QCYes + QCNo + QCMaybe +) + +func (r QCResult) String() string { + switch r { + case QCYes: + return "Yes" + case QCNo: + return "No" + case QCMaybe: + return "Maybe" + } + return "***UNKNOWN***" +} + +const ( + FCanonical = iota // NFC or NFD + FCompatibility // NFKC or NFKD + FNumberOfFormTypes +) + +const ( + MComposed = iota // NFC or NFKC + MDecomposed // NFD or NFKD + MNumberOfModes +) + +// This contains only the properties we're interested in. +type Char struct { + name string + codePoint rune // if zero, this index is not a valid code point. + ccc uint8 // canonical combining class + origCCC uint8 + excludeInComp bool // from CompositionExclusions.txt + compatDecomp bool // it has a compatibility expansion + + nTrailingNonStarters uint8 + nLeadingNonStarters uint8 // must be equal to trailing if non-zero + + forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility + + state State +} + +var chars = make([]Char, MaxChar+1) +var cccMap = make(map[uint8]uint8) + +func (c Char) String() string { + buf := new(bytes.Buffer) + + fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) + fmt.Fprintf(buf, " ccc: %v\n", c.ccc) + fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) + fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) + fmt.Fprintf(buf, " state: %v\n", c.state) + fmt.Fprintf(buf, " NFC:\n") + fmt.Fprint(buf, c.forms[FCanonical]) + fmt.Fprintf(buf, " NFKC:\n") + fmt.Fprint(buf, c.forms[FCompatibility]) + + return buf.String() +} + +// In UnicodeData.txt, some ranges are marked like this: +// 3400;;Lo;0;L;;;;;N;;;;; +// 4DB5;;Lo;0;L;;;;;N;;;;; +// parseCharacter keeps a state variable indicating the weirdness. +type State int + +const ( + SNormal State = iota // known to be zero for the type + SFirst + SLast + SMissing +) + +var lastChar = rune('\u0000') + +func (c Char) isValid() bool { + return c.codePoint != 0 && c.state != SMissing +} + +type FormInfo struct { + quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed + verified [MNumberOfModes]bool // index: MComposed or MDecomposed + + combinesForward bool // May combine with rune on the right + combinesBackward bool // May combine with rune on the left + isOneWay bool // Never appears in result + inDecomp bool // Some decompositions result in this char. + decomp Decomposition + expandedDecomp Decomposition +} + +func (f FormInfo) String() string { + buf := bytes.NewBuffer(make([]byte, 0)) + + fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) + fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) + fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) + fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) + fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) + fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) + fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) + fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) + + return buf.String() +} + +type Decomposition []rune + +func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { + decomp := strings.Split(s, " ") + if len(decomp) > 0 && skipfirst { + decomp = decomp[1:] + } + for _, d := range decomp { + point, err := strconv.ParseUint(d, 16, 64) + if err != nil { + return a, err + } + a = append(a, rune(point)) + } + return a, nil +} + +func loadUnicodeData() { + f := gen.OpenUCDFile("UnicodeData.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(ucd.CodePoint) + char := &chars[r] + + char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) + decmap := p.String(ucd.DecompMapping) + + exp, err := parseDecomposition(decmap, false) + isCompat := false + if err != nil { + if len(decmap) > 0 { + exp, err = parseDecomposition(decmap, true) + if err != nil { + log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) + } + isCompat = true + } + } + + char.name = p.String(ucd.Name) + char.codePoint = r + char.forms[FCompatibility].decomp = exp + if !isCompat { + char.forms[FCanonical].decomp = exp + } else { + char.compatDecomp = true + } + if len(decmap) > 0 { + char.forms[FCompatibility].decomp = exp + } + } + if err := p.Err(); err != nil { + log.Fatal(err) + } +} + +// compactCCC converts the sparse set of CCC values to a continguous one, +// reducing the number of bits needed from 8 to 6. +func compactCCC() { + m := make(map[uint8]uint8) + for i := range chars { + c := &chars[i] + m[c.ccc] = 0 + } + cccs := []int{} + for v, _ := range m { + cccs = append(cccs, int(v)) + } + sort.Ints(cccs) + for i, c := range cccs { + cccMap[uint8(i)] = uint8(c) + m[uint8(c)] = uint8(i) + } + for i := range chars { + c := &chars[i] + c.origCCC = c.ccc + c.ccc = m[c.ccc] + } + if len(m) >= 1<<6 { + log.Fatalf("too many difference CCC values: %d >= 64", len(m)) + } +} + +// CompositionExclusions.txt has form: +// 0958 # ... +// See http://unicode.org/reports/tr44/ for full explanation +func loadCompositionExclusions() { + f := gen.OpenUCDFile("CompositionExclusions.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + c := &chars[p.Rune(0)] + if c.excludeInComp { + log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) + } + c.excludeInComp = true + } + if e := p.Err(); e != nil { + log.Fatal(e) + } +} + +// hasCompatDecomp returns true if any of the recursive +// decompositions contains a compatibility expansion. +// In this case, the character may not occur in NFK*. +func hasCompatDecomp(r rune) bool { + c := &chars[r] + if c.compatDecomp { + return true + } + for _, d := range c.forms[FCompatibility].decomp { + if hasCompatDecomp(d) { + return true + } + } + return false +} + +// Hangul related constants. +const ( + HangulBase = 0xAC00 + HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) + + JamoLBase = 0x1100 + JamoLEnd = 0x1113 + JamoVBase = 0x1161 + JamoVEnd = 0x1176 + JamoTBase = 0x11A8 + JamoTEnd = 0x11C3 + + JamoLVTCount = 19 * 21 * 28 + JamoTCount = 28 +) + +func isHangul(r rune) bool { + return HangulBase <= r && r < HangulEnd +} + +func isHangulWithoutJamoT(r rune) bool { + if !isHangul(r) { + return false + } + r -= HangulBase + return r < JamoLVTCount && r%JamoTCount == 0 +} + +func ccc(r rune) uint8 { + return chars[r].ccc +} + +// Insert a rune in a buffer, ordered by Canonical Combining Class. +func insertOrdered(b Decomposition, r rune) Decomposition { + n := len(b) + b = append(b, 0) + cc := ccc(r) + if cc > 0 { + // Use bubble sort. + for ; n > 0; n-- { + if ccc(b[n-1]) <= cc { + break + } + b[n] = b[n-1] + } + } + b[n] = r + return b +} + +// Recursively decompose. +func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { + dcomp := chars[r].forms[form].decomp + if len(dcomp) == 0 { + return insertOrdered(d, r) + } + for _, c := range dcomp { + d = decomposeRecursive(form, c, d) + } + return d +} + +func completeCharFields(form int) { + // Phase 0: pre-expand decomposition. + for i := range chars { + f := &chars[i].forms[form] + if len(f.decomp) == 0 { + continue + } + exp := make(Decomposition, 0) + for _, c := range f.decomp { + exp = decomposeRecursive(form, c, exp) + } + f.expandedDecomp = exp + } + + // Phase 1: composition exclusion, mark decomposition. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + // Marks script-specific exclusions and version restricted. + f.isOneWay = c.excludeInComp + + // Singletons + f.isOneWay = f.isOneWay || len(f.decomp) == 1 + + // Non-starter decompositions + if len(f.decomp) > 1 { + chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 + f.isOneWay = f.isOneWay || chk + } + + // Runes that decompose into more than two runes. + f.isOneWay = f.isOneWay || len(f.decomp) > 2 + + if form == FCompatibility { + f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) + } + + for _, r := range f.decomp { + chars[r].forms[form].inDecomp = true + } + } + + // Phase 2: forward and backward combining. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + if !f.isOneWay && len(f.decomp) == 2 { + f0 := &chars[f.decomp[0]].forms[form] + f1 := &chars[f.decomp[1]].forms[form] + if !f0.isOneWay { + f0.combinesForward = true + } + if !f1.isOneWay { + f1.combinesBackward = true + } + } + if isHangulWithoutJamoT(rune(i)) { + f.combinesForward = true + } + } + + // Phase 3: quick check values. + for i := range chars { + c := &chars[i] + f := &c.forms[form] + + switch { + case len(f.decomp) > 0: + f.quickCheck[MDecomposed] = QCNo + case isHangul(rune(i)): + f.quickCheck[MDecomposed] = QCNo + default: + f.quickCheck[MDecomposed] = QCYes + } + switch { + case f.isOneWay: + f.quickCheck[MComposed] = QCNo + case (i & 0xffff00) == JamoLBase: + f.quickCheck[MComposed] = QCYes + if JamoLBase <= i && i < JamoLEnd { + f.combinesForward = true + } + if JamoVBase <= i && i < JamoVEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + f.combinesForward = true + } + if JamoTBase <= i && i < JamoTEnd { + f.quickCheck[MComposed] = QCMaybe + f.combinesBackward = true + } + case !f.combinesBackward: + f.quickCheck[MComposed] = QCYes + default: + f.quickCheck[MComposed] = QCMaybe + } + } +} + +func computeNonStarterCounts() { + // Phase 4: leading and trailing non-starter count + for i := range chars { + c := &chars[i] + + runes := []rune{rune(i)} + // We always use FCompatibility so that the CGJ insertion points do not + // change for repeated normalizations with different forms. + if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { + runes = exp + } + // We consider runes that combine backwards to be non-starters for the + // purpose of Stream-Safe Text Processing. + for _, r := range runes { + if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nLeadingNonStarters++ + } + for i := len(runes) - 1; i >= 0; i-- { + if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { + break + } + c.nTrailingNonStarters++ + } + if c.nTrailingNonStarters > 3 { + log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) + } + + if isHangul(rune(i)) { + c.nTrailingNonStarters = 2 + if isHangulWithoutJamoT(rune(i)) { + c.nTrailingNonStarters = 1 + } + } + + if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { + log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) + } + if t := c.nTrailingNonStarters; t > 3 { + log.Fatalf("%U: number of trailing non-starters is %d > 3", t) + } + } +} + +func printBytes(w io.Writer, b []byte, name string) { + fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) + fmt.Fprintf(w, "var %s = [...]byte {", name) + for i, c := range b { + switch { + case i%64 == 0: + fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) + case i%8 == 0: + fmt.Fprintf(w, "\n") + } + fmt.Fprintf(w, "0x%.2X, ", c) + } + fmt.Fprint(w, "\n}\n\n") +} + +// See forminfo.go for format. +func makeEntry(f *FormInfo, c *Char) uint16 { + e := uint16(0) + if r := c.codePoint; HangulBase <= r && r < HangulEnd { + e |= 0x40 + } + if f.combinesForward { + e |= 0x20 + } + if f.quickCheck[MDecomposed] == QCNo { + e |= 0x4 + } + switch f.quickCheck[MComposed] { + case QCYes: + case QCNo: + e |= 0x10 + case QCMaybe: + e |= 0x18 + default: + log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) + } + e |= uint16(c.nTrailingNonStarters) + return e +} + +// decompSet keeps track of unique decompositions, grouped by whether +// the decomposition is followed by a trailing and/or leading CCC. +type decompSet [7]map[string]bool + +const ( + normalDecomp = iota + firstMulti + firstCCC + endMulti + firstLeadingCCC + firstCCCZeroExcept + firstStarterWithNLead + lastDecomp +) + +var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} + +func makeDecompSet() decompSet { + m := decompSet{} + for i := range m { + m[i] = make(map[string]bool) + } + return m +} +func (m *decompSet) insert(key int, s string) { + m[key][s] = true +} + +func printCharInfoTables(w io.Writer) int { + mkstr := func(r rune, f *FormInfo) (int, string) { + d := f.expandedDecomp + s := string([]rune(d)) + if max := 1 << 6; len(s) >= max { + const msg = "%U: too many bytes in decomposition: %d >= %d" + log.Fatalf(msg, r, len(s), max) + } + head := uint8(len(s)) + if f.quickCheck[MComposed] != QCYes { + head |= 0x40 + } + if f.combinesForward { + head |= 0x80 + } + s = string([]byte{head}) + s + + lccc := ccc(d[0]) + tccc := ccc(d[len(d)-1]) + cc := ccc(r) + if cc != 0 && lccc == 0 && tccc == 0 { + log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) + } + if tccc < lccc && lccc != 0 { + const msg = "%U: lccc (%d) must be <= tcc (%d)" + log.Fatalf(msg, r, lccc, tccc) + } + index := normalDecomp + nTrail := chars[r].nTrailingNonStarters + nLead := chars[r].nLeadingNonStarters + if tccc > 0 || lccc > 0 || nTrail > 0 { + tccc <<= 2 + tccc |= nTrail + s += string([]byte{tccc}) + index = endMulti + for _, r := range d[1:] { + if ccc(r) == 0 { + index = firstCCC + } + } + if lccc > 0 || nLead > 0 { + s += string([]byte{lccc}) + if index == firstCCC { + log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) + } + index = firstLeadingCCC + } + if cc != lccc { + if cc != 0 { + log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) + } + index = firstCCCZeroExcept + } + } else if len(d) > 1 { + index = firstMulti + } + return index, s + } + + decompSet := makeDecompSet() + const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. + decompSet.insert(firstStarterWithNLead, nLeadStr) + + // Store the uniqued decompositions in a byte buffer, + // preceded by their byte length. + for _, c := range chars { + for _, f := range c.forms { + if len(f.expandedDecomp) == 0 { + continue + } + if f.combinesBackward { + log.Fatalf("%U: combinesBackward and decompose", c.codePoint) + } + index, s := mkstr(c.codePoint, &f) + decompSet.insert(index, s) + } + } + + decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) + size := 0 + positionMap := make(map[string]uint16) + decompositions.WriteString("\000") + fmt.Fprintln(w, "const (") + for i, m := range decompSet { + sa := []string{} + for s := range m { + sa = append(sa, s) + } + sort.Strings(sa) + for _, s := range sa { + p := decompositions.Len() + decompositions.WriteString(s) + positionMap[s] = uint16(p) + } + if cname[i] != "" { + fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) + } + } + fmt.Fprintln(w, "maxDecomp = 0x8000") + fmt.Fprintln(w, ")") + b := decompositions.Bytes() + printBytes(w, b, "decomps") + size += len(b) + + varnames := []string{"nfc", "nfkc"} + for i := 0; i < FNumberOfFormTypes; i++ { + trie := triegen.NewTrie(varnames[i]) + + for r, c := range chars { + f := c.forms[i] + d := f.expandedDecomp + if len(d) != 0 { + _, key := mkstr(c.codePoint, &f) + trie.Insert(rune(r), uint64(positionMap[key])) + if c.ccc != ccc(d[0]) { + // We assume the lead ccc of a decomposition !=0 in this case. + if ccc(d[0]) == 0 { + log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) + } + } + } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { + // Handle cases where it can't be detected that the nLead should be equal + // to nTrail. + trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) + } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { + trie.Insert(c.codePoint, uint64(0x8000|v)) + } + } + sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) + if err != nil { + log.Fatal(err) + } + size += sz + } + return size +} + +func contains(sa []string, s string) bool { + for _, a := range sa { + if a == s { + return true + } + } + return false +} + +func makeTables() { + w := &bytes.Buffer{} + + size := 0 + if *tablelist == "" { + return + } + list := strings.Split(*tablelist, ",") + if *tablelist == "all" { + list = []string{"recomp", "info"} + } + + // Compute maximum decomposition size. + max := 0 + for _, c := range chars { + if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { + max = n + } + } + + fmt.Fprintln(w, "const (") + fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") + fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) + fmt.Fprintln(w) + fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") + fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") + fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") + fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") + fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) + fmt.Fprintln(w, ")\n") + + // Print the CCC remap table. + size += len(cccMap) + fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) + for i := 0; i < len(cccMap); i++ { + if i%8 == 0 { + fmt.Fprintln(w) + } + fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) + } + fmt.Fprintln(w, "\n}\n") + + if contains(list, "info") { + size += printCharInfoTables(w) + } + + if contains(list, "recomp") { + // Note that we use 32 bit keys, instead of 64 bit. + // This clips the bits of three entries, but we know + // this won't cause a collision. The compiler will catch + // any changes made to UnicodeData.txt that introduces + // a collision. + // Note that the recomposition map for NFC and NFKC + // are identical. + + // Recomposition map + nrentries := 0 + for _, c := range chars { + f := c.forms[FCanonical] + if !f.isOneWay && len(f.decomp) > 0 { + nrentries++ + } + } + sz := nrentries * 8 + size += sz + fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) + fmt.Fprintln(w, "var recompMap = map[uint32]rune{") + for i, c := range chars { + f := c.forms[FCanonical] + d := f.decomp + if !f.isOneWay && len(d) > 0 { + key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) + fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i) + } + } + fmt.Fprintf(w, "}\n\n") + } + + fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) + gen.WriteGoFile("tables.go", "norm", w.Bytes()) +} + +func printChars() { + if *verbose { + for _, c := range chars { + if !c.isValid() || c.state == SMissing { + continue + } + fmt.Println(c) + } + } +} + +// verifyComputed does various consistency tests. +func verifyComputed() { + for i, c := range chars { + for _, f := range c.forms { + isNo := (f.quickCheck[MDecomposed] == QCNo) + if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { + log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) + } + + isMaybe := f.quickCheck[MComposed] == QCMaybe + if f.combinesBackward != isMaybe { + log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) + } + if len(f.decomp) > 0 && f.combinesForward && isMaybe { + log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) + } + + if len(f.expandedDecomp) != 0 { + continue + } + if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { + // We accept these runes to be treated differently (it only affects + // segment breaking in iteration, most likely on improper use), but + // reconsider if more characters are added. + // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; + // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; + // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; + // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; + // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; + // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; + if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { + log.Fatalf("%U: nLead was %v; want %v", i, a, b) + } + } + } + nfc := c.forms[FCanonical] + nfkc := c.forms[FCompatibility] + if nfc.combinesBackward != nfkc.combinesBackward { + log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) + } + } +} + +// Use values in DerivedNormalizationProps.txt to compare against the +// values we computed. +// DerivedNormalizationProps.txt has form: +// 00C0..00C5 ; NFD_QC; N # ... +// 0374 ; NFD_QC; N # ... +// See http://unicode.org/reports/tr44/ for full explanation +func testDerived() { + f := gen.OpenUCDFile("DerivedNormalizationProps.txt") + defer f.Close() + p := ucd.New(f) + for p.Next() { + r := p.Rune(0) + c := &chars[r] + + var ftype, mode int + qt := p.String(1) + switch qt { + case "NFC_QC": + ftype, mode = FCanonical, MComposed + case "NFD_QC": + ftype, mode = FCanonical, MDecomposed + case "NFKC_QC": + ftype, mode = FCompatibility, MComposed + case "NFKD_QC": + ftype, mode = FCompatibility, MDecomposed + default: + continue + } + var qr QCResult + switch p.String(2) { + case "Y": + qr = QCYes + case "N": + qr = QCNo + case "M": + qr = QCMaybe + default: + log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) + } + if got := c.forms[ftype].quickCheck[mode]; got != qr { + log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) + } + c.forms[ftype].verified[mode] = true + } + if err := p.Err(); err != nil { + log.Fatal(err) + } + // Any unspecified value must be QCYes. Verify this. + for i, c := range chars { + for j, fd := range c.forms { + for k, qr := range fd.quickCheck { + if !fd.verified[k] && qr != QCYes { + m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" + log.Printf(m, i, j, k, qr, c.name) + } + } + } + } +} + +var testHeader = `const ( + Yes = iota + No + Maybe +) + +type formData struct { + qc uint8 + combinesForward bool + decomposition string +} + +type runeData struct { + r rune + ccc uint8 + nLead uint8 + nTrail uint8 + f [2]formData // 0: canonical; 1: compatibility +} + +func f(qc uint8, cf bool, dec string) [2]formData { + return [2]formData{{qc, cf, dec}, {qc, cf, dec}} +} + +func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { + return [2]formData{{qc, cf, d}, {qck, cfk, dk}} +} + +var testData = []runeData{ +` + +func printTestdata() { + type lastInfo struct { + ccc uint8 + nLead uint8 + nTrail uint8 + f string + } + + last := lastInfo{} + w := &bytes.Buffer{} + fmt.Fprintf(w, testHeader) + for r, c := range chars { + f := c.forms[FCanonical] + qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + f = c.forms[FCompatibility] + qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) + s := "" + if d == dk && qc == qck && cf == cfk { + s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) + } else { + s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) + } + current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} + if last != current { + fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) + last = current + } + } + fmt.Fprintln(w, "}") + gen.WriteGoFile("data_test.go", "norm", w.Bytes()) +} diff --git a/src/internal/x/text/unicode/norm/normalize.go b/src/vendor/golang.org/x/text/unicode/norm/normalize.go similarity index 98% rename from src/internal/x/text/unicode/norm/normalize.go rename to src/vendor/golang.org/x/text/unicode/norm/normalize.go index 791c39b1c4..e28ac641ac 100644 --- a/src/internal/x/text/unicode/norm/normalize.go +++ b/src/vendor/golang.org/x/text/unicode/norm/normalize.go @@ -1,18 +1,18 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. // Note: the file data_test.go that is generated should not be checked in. +//go:generate go run maketables.go triegen.go +//go:generate go test -tags test // Package norm contains types and functions for normalizing Unicode strings. -package norm +package norm // import "golang.org/x/text/unicode/norm" import ( "unicode/utf8" - "internal/x/text/transform" + "golang.org/x/text/transform" ) // A Form denotes a canonical representation of Unicode code points. diff --git a/src/internal/x/text/unicode/norm/readwriter.go b/src/vendor/golang.org/x/text/unicode/norm/readwriter.go similarity index 97% rename from src/internal/x/text/unicode/norm/readwriter.go rename to src/vendor/golang.org/x/text/unicode/norm/readwriter.go index 068ab57153..d926ee903e 100644 --- a/src/internal/x/text/unicode/norm/readwriter.go +++ b/src/vendor/golang.org/x/text/unicode/norm/readwriter.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/internal/x/text/unicode/norm/tables.go b/src/vendor/golang.org/x/text/unicode/norm/tables.go similarity index 99% rename from src/internal/x/text/unicode/norm/tables.go rename to src/vendor/golang.org/x/text/unicode/norm/tables.go index 2dd61adf63..316b093c53 100644 --- a/src/internal/x/text/unicode/norm/tables.go +++ b/src/vendor/golang.org/x/text/unicode/norm/tables.go @@ -1,7 +1,5 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -// Code generated by running "go generate" in internal/x/text. DO NOT EDIT. - package norm const ( diff --git a/src/internal/x/text/unicode/norm/transform.go b/src/vendor/golang.org/x/text/unicode/norm/transform.go similarity index 95% rename from src/internal/x/text/unicode/norm/transform.go rename to src/vendor/golang.org/x/text/unicode/norm/transform.go index 7837cb96a4..9f47efbaf6 100644 --- a/src/internal/x/text/unicode/norm/transform.go +++ b/src/vendor/golang.org/x/text/unicode/norm/transform.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2013 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. @@ -9,7 +7,7 @@ package norm import ( "unicode/utf8" - "internal/x/text/transform" + "golang.org/x/text/transform" ) // Reset implements the Reset method of the transform.Transformer interface. diff --git a/src/internal/x/text/unicode/norm/trie.go b/src/vendor/golang.org/x/text/unicode/norm/trie.go similarity index 94% rename from src/internal/x/text/unicode/norm/trie.go rename to src/vendor/golang.org/x/text/unicode/norm/trie.go index 761439ce59..423386bf43 100644 --- a/src/internal/x/text/unicode/norm/trie.go +++ b/src/vendor/golang.org/x/text/unicode/norm/trie.go @@ -1,5 +1,3 @@ -// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. - // Copyright 2011 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. diff --git a/src/internal/x/text/unicode/norm/triegen.go b/src/vendor/golang.org/x/text/unicode/norm/triegen.go similarity index 100% rename from src/internal/x/text/unicode/norm/triegen.go rename to src/vendor/golang.org/x/text/unicode/norm/triegen.go diff --git a/src/vendor/modules.txt b/src/vendor/modules.txt new file mode 100644 index 0000000000..4ddd15b8ec --- /dev/null +++ b/src/vendor/modules.txt @@ -0,0 +1,25 @@ +# golang.org/x/crypto v0.0.0-20181025213731-e84da0312774 +golang.org/x/crypto/chacha20poly1305 +golang.org/x/crypto/cryptobyte +golang.org/x/crypto/curve25519 +golang.org/x/crypto/hkdf +golang.org/x/crypto/cryptobyte/asn1 +golang.org/x/crypto/internal/chacha20 +golang.org/x/crypto/internal/subtle +golang.org/x/crypto/poly1305 +# golang.org/x/net v0.0.0-20181213202711-891ebc4b82d6 +golang.org/x/net/dns/dnsmessage +golang.org/x/net/lif +golang.org/x/net/route +golang.org/x/net/http/httpguts +golang.org/x/net/http/httpproxy +golang.org/x/net/http2/hpack +golang.org/x/net/idna +golang.org/x/net/nettest +# golang.org/x/sys v0.0.0-20190306220234-b354f8bf4d9e +golang.org/x/sys/cpu +# golang.org/x/text v0.1.1-0.20171102144821-8253218a5ec6 +golang.org/x/text/secure/bidirule +golang.org/x/text/unicode/bidi +golang.org/x/text/unicode/norm +golang.org/x/text/transform -- GitLab From cf4691650c3c556f19844a881a32792a919ee8d1 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Feb 2019 15:07:56 -0500 Subject: [PATCH 0396/1679] cmd/go: change the default value of GO111MODULE to 'on' Fixes #30228 Change-Id: Ie45ba6483849b843eb6605272f686b9deffe5e48 Reviewed-on: https://go-review.googlesource.com/c/go/+/162698 Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 331 +++++++++--------- src/cmd/go/help_test.go | 5 + src/cmd/go/internal/help/help.go | 7 +- src/cmd/go/internal/modload/help.go | 39 +-- src/cmd/go/internal/modload/init.go | 35 +- src/cmd/go/main.go | 15 +- src/cmd/go/mkalldocs.sh | 2 +- src/cmd/go/testdata/script/mod_find.txt | 2 +- .../go/testdata/script/mod_gobuild_import.txt | 6 + 9 files changed, 210 insertions(+), 232 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 33f6126ada..5aa296ae61 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -21,7 +21,7 @@ // fix update packages to use new APIs // fmt gofmt (reformat) package sources // generate generate Go files by processing source -// get download and install packages and dependencies +// get add dependencies to current module and install them // install compile and install packages and dependencies // list list packages or modules // mod module maintenance @@ -534,67 +534,105 @@ // For more about specifying packages, see 'go help packages'. // // -// Download and install packages and dependencies +// Add dependencies to current module and install them // // Usage: // -// go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] +// go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] // -// Get downloads the packages named by the import paths, along with their -// dependencies. It then installs the named packages, like 'go install'. +// Get resolves and adds dependencies to the current development module +// and then builds and installs them. // -// The -d flag instructs get to stop after downloading the packages; that is, -// it instructs get not to install the packages. +// The first step is to resolve which dependencies to add. // -// The -f flag, valid only when -u is set, forces get -u not to verify that -// each package has been checked out from the source control repository -// implied by its import path. This can be useful if the source is a local fork -// of the original. +// For each named package or package pattern, get must decide which version of +// the corresponding module to use. By default, get chooses the latest tagged +// release version, such as v0.4.5 or v1.2.3. If there are no tagged release +// versions, get chooses the latest tagged prerelease version, such as +// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest +// known commit. // -// The -fix flag instructs get to run the fix tool on the downloaded packages -// before resolving dependencies or building the code. +// This default version selection can be overridden by adding an @version +// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. +// For modules stored in source control repositories, the version suffix can +// also be a commit hash, branch identifier, or other syntax known to the +// source control system, as in 'go get golang.org/x/text@master'. +// The version suffix @latest explicitly requests the default behavior +// described above. // -// The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. +// If a module under consideration is already a dependency of the current +// development module, then get will update the required version. +// Specifying a version earlier than the current required version is valid and +// downgrades the dependency. The version suffix @none indicates that the +// dependency should be removed entirely, downgrading or removing modules +// depending on it as needed. // -// The -t flag instructs get to also download the packages required to build -// the tests for the specified packages. +// Although get defaults to using the latest version of the module containing +// a named package, it does not use the latest version of that module's +// dependencies. Instead it prefers to use the specific dependency versions +// requested by that module. For example, if the latest A requires module +// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' +// will use the latest A but then use B v1.2.3, as requested by A. (If there +// are competing requirements for a particular module, then 'go get' resolves +// those requirements by taking the maximum requested version.) // -// The -u flag instructs get to use the network to update the named packages -// and their dependencies. By default, get uses the network to check out -// missing packages but does not use it to look for updates to existing packages. +// The -u flag instructs get to update dependencies to use newer minor or +// patch releases when available. Continuing the previous example, +// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). // -// The -v flag enables verbose progress and debug output. +// The -u=patch flag (not -u patch) instructs get to update dependencies +// to use newer patch releases when available. Continuing the previous example, +// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). // -// Get also accepts build flags to control the installation. See 'go help build'. +// In general, adding a new dependency may require upgrading +// existing dependencies to keep a working build, and 'go get' does +// this automatically. Similarly, downgrading one dependency may +// require downgrading other dependencies, and 'go get' does +// this automatically as well. // -// When checking out a new package, get creates the target directory -// GOPATH/src/. If the GOPATH contains multiple entries, -// get uses the first one. For more details see: 'go help gopath'. +// The -m flag instructs get to stop here, after resolving, upgrading, +// and downgrading modules and updating go.mod. When using -m, +// each specified package path must be a module path as well, +// not the import path of a package below the module root. // -// When checking out or updating a package, get looks for a branch or tag -// that matches the locally installed version of Go. The most important -// rule is that if the local installation is running version "go1", get -// searches for a branch or tag named "go1". If no such version exists -// it retrieves the default branch of the package. +// The -insecure flag permits fetching from repositories and resolving +// custom domains using insecure schemes such as HTTP. Use with caution. // -// When go get checks out or updates a Git repository, -// it also updates any git submodules referenced by the repository. +// The second step is to download (if needed), build, and install +// the named packages. // -// Get never checks out or updates code stored in vendor directories. +// If an argument names a module but not a package (because there is no +// Go source code in the module's root directory), then the install step +// is skipped for that argument, instead of causing a build failure. +// For example 'go get golang.org/x/perf' succeeds even though there +// is no code corresponding to that import path. // -// For more about specifying packages, see 'go help packages'. +// Note that package patterns are allowed and are expanded after resolving +// the module versions. For example, 'go get golang.org/x/perf/cmd/...' +// adds the latest golang.org/x/perf and then installs the commands in that +// latest version. // -// For more about how 'go get' finds source code to -// download, see 'go help importpath'. +// The -d flag instructs get to download the source code needed to build +// the named packages, including downloading necessary dependencies, +// but not to build and install them. // -// This text describes the behavior of get when using GOPATH -// to manage source code and dependencies. -// If instead the go command is running in module-aware mode, -// the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help module-get'. +// With no package arguments, 'go get' applies to the main module, +// and to the Go package in the current directory, if any. In particular, +// 'go get -u' and 'go get -u=patch' update all the dependencies of the +// main module. With no package arguments and also without -u, +// 'go get' is not much more than 'go install', and 'go get -d' not much +// more than 'go list'. // -// See also: go build, go install, go clean. +// For more about modules, see 'go help modules'. +// +// For more about specifying packages, see 'go help packages'. +// +// This text describes the behavior of get using modules to manage source +// code and dependencies. If instead the go command is running in GOPATH +// mode, the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help gopath-get'. +// +// See also: go build, go install, go clean, go mod. // // // Compile and install packages and dependencies @@ -1838,6 +1876,72 @@ // See https://golang.org/s/go15vendor for details. // // +// Legacy GOPATH go get +// +// The 'go get' command changes behavior depending on whether the +// go command is running in module-aware mode or legacy GOPATH mode. +// This help text, accessible as 'go help gopath-get' even in module-aware mode, +// describes 'go get' as it operates in legacy GOPATH mode. +// +// Usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] +// +// Get downloads the packages named by the import paths, along with their +// dependencies. It then installs the named packages, like 'go install'. +// +// The -d flag instructs get to stop after downloading the packages; that is, +// it instructs get not to install the packages. +// +// The -f flag, valid only when -u is set, forces get -u not to verify that +// each package has been checked out from the source control repository +// implied by its import path. This can be useful if the source is a local fork +// of the original. +// +// The -fix flag instructs get to run the fix tool on the downloaded packages +// before resolving dependencies or building the code. +// +// The -insecure flag permits fetching from repositories and resolving +// custom domains using insecure schemes such as HTTP. Use with caution. +// +// The -t flag instructs get to also download the packages required to build +// the tests for the specified packages. +// +// The -u flag instructs get to use the network to update the named packages +// and their dependencies. By default, get uses the network to check out +// missing packages but does not use it to look for updates to existing packages. +// +// The -v flag enables verbose progress and debug output. +// +// Get also accepts build flags to control the installation. See 'go help build'. +// +// When checking out a new package, get creates the target directory +// GOPATH/src/. If the GOPATH contains multiple entries, +// get uses the first one. For more details see: 'go help gopath'. +// +// When checking out or updating a package, get looks for a branch or tag +// that matches the locally installed version of Go. The most important +// rule is that if the local installation is running version "go1", get +// searches for a branch or tag named "go1". If no such version exists +// it retrieves the default branch of the package. +// +// When go get checks out or updates a Git repository, +// it also updates any git submodules referenced by the repository. +// +// Get never checks out or updates code stored in vendor directories. +// +// For more about specifying packages, see 'go help packages'. +// +// For more about how 'go get' finds source code to +// download, see 'go help importpath'. +// +// This text describes the behavior of get when using GOPATH +// to manage source code and dependencies. +// If instead the go command is running in module-aware mode, +// the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help module-get'. +// +// See also: go build, go install, go clean. +// +// // Module proxy protocol // // The go command by default downloads modules from version control systems @@ -2097,34 +2201,25 @@ // Modules replace the old GOPATH-based approach to specifying // which source files are used in a given build. // -// Preliminary module support +// Module support // -// Go 1.11 includes preliminary support for Go modules, -// including a new module-aware 'go get' command. -// We intend to keep revising this support, while preserving compatibility, -// until it can be declared official (no longer preliminary), -// and then at a later point we may remove support for work -// in GOPATH and the old 'go get' command. +// Go 1.13 includes official support for Go modules, +// including a module-aware 'go get' command. +// Module-aware mode is active by default. // -// The quickest way to take advantage of the new Go 1.11 module support -// is to check out your repository into a directory outside GOPATH/src, -// create a go.mod file (described in the next section) there, and run -// go commands from within that file tree. -// -// For more fine-grained control, the module support in Go 1.11 respects +// For more fine-grained control, Go 1.13 continues to respect // a temporary environment variable, GO111MODULE, which can be set to one -// of three string values: off, on, or auto (the default). -// If GO111MODULE=off, then the go command never uses the -// new module support. Instead it looks in vendor directories and GOPATH +// of three string values: off, auto, or on (the default). +// If GO111MODULE=on or is unset, then the go command requires the use of +// modules, never consulting GOPATH. We refer to this as the command +// being module-aware or running in "module-aware mode". +// If GO111MODULE=auto, then the go command enables or disables module +// support based on the current directory. Module support is enabled only +// when the current directory is outside GOPATH/src and itself contains a +// go.mod file or is below a directory containing a go.mod file. +// If GO111MODULE=off, then the go command never uses +// module support. Instead it looks in vendor directories and GOPATH // to find dependencies; we now refer to this as "GOPATH mode." -// If GO111MODULE=on, then the go command requires the use of modules, -// never consulting GOPATH. We refer to this as the command being -// module-aware or running in "module-aware mode". -// If GO111MODULE=auto or is unset, then the go command enables or -// disables module support based on the current directory. -// Module support is enabled only when the current directory is outside -// GOPATH/src and itself contains a go.mod file or is below a directory -// containing a go.mod file. // // In module-aware mode, GOPATH no longer defines the meaning of imports // during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) @@ -2446,110 +2541,6 @@ // are still ignored. // // -// Module-aware go get -// -// The 'go get' command changes behavior depending on whether the -// go command is running in module-aware mode or legacy GOPATH mode. -// This help text, accessible as 'go help module-get' even in legacy GOPATH mode, -// describes 'go get' as it operates in module-aware mode. -// -// Usage: go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] -// -// Get resolves and adds dependencies to the current development module -// and then builds and installs them. -// -// The first step is to resolve which dependencies to add. -// -// For each named package or package pattern, get must decide which version of -// the corresponding module to use. By default, get chooses the latest tagged -// release version, such as v0.4.5 or v1.2.3. If there are no tagged release -// versions, get chooses the latest tagged prerelease version, such as -// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest -// known commit. -// -// This default version selection can be overridden by adding an @version -// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. -// For modules stored in source control repositories, the version suffix can -// also be a commit hash, branch identifier, or other syntax known to the -// source control system, as in 'go get golang.org/x/text@master'. -// The version suffix @latest explicitly requests the default behavior -// described above. -// -// If a module under consideration is already a dependency of the current -// development module, then get will update the required version. -// Specifying a version earlier than the current required version is valid and -// downgrades the dependency. The version suffix @none indicates that the -// dependency should be removed entirely, downgrading or removing modules -// depending on it as needed. -// -// Although get defaults to using the latest version of the module containing -// a named package, it does not use the latest version of that module's -// dependencies. Instead it prefers to use the specific dependency versions -// requested by that module. For example, if the latest A requires module -// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' -// will use the latest A but then use B v1.2.3, as requested by A. (If there -// are competing requirements for a particular module, then 'go get' resolves -// those requirements by taking the maximum requested version.) -// -// The -u flag instructs get to update dependencies to use newer minor or -// patch releases when available. Continuing the previous example, -// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). -// -// The -u=patch flag (not -u patch) instructs get to update dependencies -// to use newer patch releases when available. Continuing the previous example, -// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). -// -// In general, adding a new dependency may require upgrading -// existing dependencies to keep a working build, and 'go get' does -// this automatically. Similarly, downgrading one dependency may -// require downgrading other dependencies, and 'go get' does -// this automatically as well. -// -// The -m flag instructs get to stop here, after resolving, upgrading, -// and downgrading modules and updating go.mod. When using -m, -// each specified package path must be a module path as well, -// not the import path of a package below the module root. -// -// The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. -// -// The second step is to download (if needed), build, and install -// the named packages. -// -// If an argument names a module but not a package (because there is no -// Go source code in the module's root directory), then the install step -// is skipped for that argument, instead of causing a build failure. -// For example 'go get golang.org/x/perf' succeeds even though there -// is no code corresponding to that import path. -// -// Note that package patterns are allowed and are expanded after resolving -// the module versions. For example, 'go get golang.org/x/perf/cmd/...' -// adds the latest golang.org/x/perf and then installs the commands in that -// latest version. -// -// The -d flag instructs get to download the source code needed to build -// the named packages, including downloading necessary dependencies, -// but not to build and install them. -// -// With no package arguments, 'go get' applies to the main module, -// and to the Go package in the current directory, if any. In particular, -// 'go get -u' and 'go get -u=patch' update all the dependencies of the -// main module. With no package arguments and also without -u, -// 'go get' is not much more than 'go install', and 'go get -d' not much -// more than 'go list'. -// -// For more about modules, see 'go help modules'. -// -// For more about specifying packages, see 'go help packages'. -// -// This text describes the behavior of get using modules to manage source -// code and dependencies. If instead the go command is running in GOPATH -// mode, the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help gopath-get'. -// -// See also: go build, go install, go clean, go mod. -// -// // Package lists and patterns // // Many commands apply to a set of packages: diff --git a/src/cmd/go/help_test.go b/src/cmd/go/help_test.go index ec6a9d11cb..9c0fa8411e 100644 --- a/src/cmd/go/help_test.go +++ b/src/cmd/go/help_test.go @@ -12,9 +12,14 @@ import ( "testing" "cmd/go/internal/help" + "cmd/go/internal/modload" ) func TestDocsUpToDate(t *testing.T) { + if !modload.Enabled() { + t.Skipf("help.Help in GOPATH mode is configured by main.main") + } + buf := new(bytes.Buffer) // Match the command in mkalldocs.sh that generates alldocs.go. help.Help(buf, []string{"documentation"}) diff --git a/src/cmd/go/internal/help/help.go b/src/cmd/go/internal/help/help.go index 121deb70a5..d373771ab5 100644 --- a/src/cmd/go/internal/help/help.go +++ b/src/cmd/go/internal/help/help.go @@ -17,6 +17,7 @@ import ( "unicode/utf8" "cmd/go/internal/base" + "cmd/go/internal/modload" ) // Help implements the 'help' command. @@ -35,8 +36,10 @@ func Help(w io.Writer, args []string) { usage := &base.Command{Long: buf.String()} cmds := []*base.Command{usage} for _, cmd := range base.Go.Commands { - if cmd.UsageLine == "gopath-get" { - // Avoid duplication of the "get" documentation. + // Avoid duplication of the "get" documentation. + if cmd.UsageLine == "module-get" && modload.Enabled() { + continue + } else if cmd.UsageLine == "gopath-get" && !modload.Enabled() { continue } cmds = append(cmds, cmd) diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index 63657a448f..c1685ff08e 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -19,34 +19,25 @@ including recording and resolving dependencies on other modules. Modules replace the old GOPATH-based approach to specifying which source files are used in a given build. -Preliminary module support +Module support -Go 1.11 includes preliminary support for Go modules, -including a new module-aware 'go get' command. -We intend to keep revising this support, while preserving compatibility, -until it can be declared official (no longer preliminary), -and then at a later point we may remove support for work -in GOPATH and the old 'go get' command. +Go 1.13 includes official support for Go modules, +including a module-aware 'go get' command. +Module-aware mode is active by default. -The quickest way to take advantage of the new Go 1.11 module support -is to check out your repository into a directory outside GOPATH/src, -create a go.mod file (described in the next section) there, and run -go commands from within that file tree. - -For more fine-grained control, the module support in Go 1.11 respects +For more fine-grained control, Go 1.13 continues to respect a temporary environment variable, GO111MODULE, which can be set to one -of three string values: off, on, or auto (the default). -If GO111MODULE=off, then the go command never uses the -new module support. Instead it looks in vendor directories and GOPATH +of three string values: off, auto, or on (the default). +If GO111MODULE=on or is unset, then the go command requires the use of +modules, never consulting GOPATH. We refer to this as the command +being module-aware or running in "module-aware mode". +If GO111MODULE=auto, then the go command enables or disables module +support based on the current directory. Module support is enabled only +when the current directory is outside GOPATH/src and itself contains a +go.mod file or is below a directory containing a go.mod file. +If GO111MODULE=off, then the go command never uses +module support. Instead it looks in vendor directories and GOPATH to find dependencies; we now refer to this as "GOPATH mode." -If GO111MODULE=on, then the go command requires the use of modules, -never consulting GOPATH. We refer to this as the command being -module-aware or running in "module-aware mode". -If GO111MODULE=auto or is unset, then the go command enables or -disables module support based on the current directory. -Module support is enabled only when the current directory is outside -GOPATH/src and itself contains a go.mod file or is below a directory -containing a go.mod file. In module-aware mode, GOPATH no longer defines the meaning of imports during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 0970ccf2d6..ddfb18738f 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -34,7 +34,7 @@ import ( var ( cwd string // TODO(bcmills): Is this redundant with base.Cwd? - MustUseModules = mustUseModules() + mustUseModules = true initialized bool modRoot string @@ -70,16 +70,6 @@ func BinDir() string { return filepath.Join(gopath, "bin") } -// mustUseModules reports whether we are invoked as vgo -// (as opposed to go). -// If so, we only support builds with go.mod files. -func mustUseModules() bool { - name := os.Args[0] - name = name[strings.LastIndex(name, "/")+1:] - name = name[strings.LastIndex(name, `\`)+1:] - return strings.HasPrefix(name, "vgo") -} - var inGOPATH bool // running in GOPATH/src // Init determines whether module mode is enabled, locates the root of the @@ -96,14 +86,13 @@ func Init() { switch env { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) - case "", "auto": - // leave MustUseModules alone - case "on": - MustUseModules = true + case "auto": + mustUseModules = false + case "on", "": + mustUseModules = true case "off": - if !MustUseModules { - return - } + mustUseModules = false + return } // Disable any prompting for passwords by Git. @@ -150,7 +139,7 @@ func Init() { } } - if inGOPATH && !MustUseModules { + if inGOPATH && !mustUseModules { if CmdModInit { die() // Don't init a module that we're just going to ignore. } @@ -167,8 +156,8 @@ func Init() { } else { modRoot = findModuleRoot(cwd) if modRoot == "" { - if !MustUseModules { - // GO111MODULE is 'auto' (or unset), and we can't find a module root. + if !mustUseModules { + // GO111MODULE is 'auto', and we can't find a module root. // Stay in GOPATH mode. return } @@ -267,7 +256,7 @@ func init() { // (usually through MustModRoot). func Enabled() bool { Init() - return modRoot != "" || MustUseModules + return modRoot != "" || mustUseModules } // ModRoot returns the root of the main module. @@ -300,7 +289,7 @@ func die() { if os.Getenv("GO111MODULE") == "off" { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") } - if inGOPATH && !MustUseModules { + if inGOPATH && !mustUseModules { base.Fatalf("go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'") } if cwd != "" { diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index acca4fd3c1..e529e96986 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -49,7 +49,7 @@ func init() { fix.CmdFix, fmtcmd.CmdFmt, generate.CmdGenerate, - get.CmdGet, + modget.CmdGet, work.CmdInstall, list.CmdList, modcmd.CmdMod, @@ -89,17 +89,10 @@ func main() { base.Usage() } - if modload.MustUseModules { - // If running with modules force-enabled, change get now to change help message. - *get.CmdGet = *modget.CmdGet - } - if args[0] == "get" || args[0] == "help" { - // Replace get with module-aware get if appropriate. - // Note that if MustUseModules is true, this happened already above, - // but no harm in doing it again. - if modload.Init(); modload.Enabled() { - *get.CmdGet = *modget.CmdGet + if modload.Init(); !modload.Enabled() { + // Replace module-aware get with GOPATH get if appropriate. + *modget.CmdGet = *get.CmdGet } } diff --git a/src/cmd/go/mkalldocs.sh b/src/cmd/go/mkalldocs.sh index f37d59d2d7..a2b0aca3c9 100755 --- a/src/cmd/go/mkalldocs.sh +++ b/src/cmd/go/mkalldocs.sh @@ -8,6 +8,6 @@ set -e go build -o go.latest # If the command used to generate alldocs.go changes, update TestDocsUpToDate in # help_test.go. -./go.latest help documentation >alldocs.go +GO111MODULE='' ./go.latest help documentation >alldocs.go gofmt -w alldocs.go rm go.latest diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index 703a88e99c..e82001a24a 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -17,7 +17,7 @@ cd $GOPATH/src/example.com/x/y ! go mod init stderr 'go: modules disabled inside GOPATH/src by GO111MODULE=auto; see ''go help modules''' -env GO111MODULE=on +env GO111MODULE= # Derive module path from location inside GOPATH. cd $GOPATH/src/example.com/x/y diff --git a/src/cmd/go/testdata/script/mod_gobuild_import.txt b/src/cmd/go/testdata/script/mod_gobuild_import.txt index d2d1645b83..6c87d59649 100644 --- a/src/cmd/go/testdata/script/mod_gobuild_import.txt +++ b/src/cmd/go/testdata/script/mod_gobuild_import.txt @@ -24,12 +24,18 @@ exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on outside GOPATH/src +env GO111MODULE= +exec $WORK/testimport.exe other/x/y/z/w . +stdout w2.go env GO111MODULE=on exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on in GOPATH/src cd $GOPATH/src +env GO111MODULE= +exec $WORK/testimport.exe x/y/z/w . +stdout w1.go env GO111MODULE=on exec $WORK/testimport.exe x/y/z/w . stdout w1.go -- GitLab From 810809ebc2e2c834da9656e4b52bb3a7d6089502 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 9 Mar 2019 02:30:35 +0100 Subject: [PATCH 0397/1679] misc/android: copy less from GOROOT to the device The android emulator builders is running out of space after CL 165797 copied most of GOROOT to the device. The pkg directory is by far the largest, so only include what seems necessary to build the x/ repositories: pkg/android_$GOARCH and pkg/tool/android_$GOARCH. While here, rename the device root directory to match the exec wrapper name and make sure the deferred cleanups actually run before os.Exit. Hopefully fixes the emulator builders. Updates #23824 Change-Id: I4d1e3ab2c89fd1e5818503d323ddb87f073094da Reviewed-on: https://go-review.googlesource.com/c/go/+/166397 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 147 ++++++++++++++++++++++---------- 1 file changed, 103 insertions(+), 44 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 73530f0dd2..a662d28944 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -10,6 +10,7 @@ package main import ( "bytes" + "errors" "fmt" "go/build" "io" @@ -25,7 +26,7 @@ import ( "syscall" ) -func run(args ...string) string { +func run(args ...string) (string, error) { if flags := os.Getenv("GOANDROID_ADB_FLAGS"); flags != "" { args = append(strings.Split(flags, " "), args...) } @@ -45,40 +46,51 @@ func run(args ...string) string { log.Printf("adb %s", strings.Join(args, " ")) err := cmd.Run() if err != nil { - log.Fatalf("adb %s: %v", strings.Join(args, " "), err) + return "", fmt.Errorf("adb %s: %v", strings.Join(args, " "), err) } - return buf.String() + return buf.String(), nil } const ( - deviceRoot = "/data/local/tmp/go_exec_android" + deviceRoot = "/data/local/tmp/go_android_exec" deviceGoroot = deviceRoot + "/goroot" ) func main() { log.SetFlags(0) log.SetPrefix("go_android_exec: ") + exitCode, err := runMain() + if err != nil { + log.Fatal(err) + } + os.Exit(exitCode) +} +func runMain() (int, error) { // Concurrent use of adb is flaky, so serialize adb commands. // See https://github.com/golang/go/issues/23795 or // https://issuetracker.google.com/issues/73230216. lockPath := filepath.Join(os.TempDir(), "go_android_exec-adb-lock") lock, err := os.OpenFile(lockPath, os.O_CREATE|os.O_RDWR, 0666) if err != nil { - log.Fatal(err) + return 0, err } defer lock.Close() if err := syscall.Flock(int(lock.Fd()), syscall.LOCK_EX); err != nil { - log.Fatal(err) + return 0, err } // In case we're booting a device or emulator alongside all.bash, wait for // it to be ready. adb wait-for-device is not enough, we have to // wait for sys.boot_completed. - run("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;") + if _, err := run("wait-for-device", "exec-out", "while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;"); err != nil { + return 0, err + } // Done once per make.bash. - adbCopyGoroot() + if err := adbCopyGoroot(); err != nil { + return 0, err + } // Prepare a temporary directory that will be cleaned up at the end. // Binary names can conflict. @@ -93,27 +105,38 @@ func main() { // "$GOROOT/src/mime/multipart" or "$GOPATH/src/golang.org/x/mobile". // We extract everything after the $GOROOT or $GOPATH to run on the // same relative directory on the target device. - subdir, inGoRoot := subdir() + subdir, inGoRoot, err := subdir() + if err != nil { + return 0, err + } deviceCwd := filepath.Join(deviceGopath, subdir) if inGoRoot { deviceCwd = filepath.Join(deviceGoroot, subdir) } else { - run("exec-out", "mkdir", "-p", deviceCwd) - adbCopyTestdata(deviceCwd, subdir) + if _, err := run("exec-out", "mkdir", "-p", deviceCwd); err != nil { + return 0, err + } + if err := adbCopyTestdata(deviceCwd, subdir); err != nil { + return 0, err + } // Copy .go files from the package. goFiles, err := filepath.Glob("*.go") if err != nil { - log.Fatal(err) + return 0, err } if len(goFiles) > 0 { args := append(append([]string{"push"}, goFiles...), deviceCwd) - run(args...) + if _, err := run(args...); err != nil { + return 0, err + } } } deviceBin := fmt.Sprintf("%s/%s", deviceGotmp, binName) - run("push", os.Args[1], deviceBin) + if _, err := run("push", os.Args[1], deviceBin); err != nil { + return 0, err + } // Forward SIGQUIT from the go command to show backtraces from // the binary instead of from this wrapper. @@ -140,60 +163,62 @@ func main() { `; cd "` + deviceCwd + `"` + "; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") + "; echo -n " + exitstr + "$?" - output := run("exec-out", cmd) + output, err := run("exec-out", cmd) signal.Reset(syscall.SIGQUIT) close(quit) + if err != nil { + return 0, err + } exitIdx := strings.LastIndex(output, exitstr) if exitIdx == -1 { - log.Fatalf("no exit code: %q", output) + return 0, fmt.Errorf("no exit code: %q", output) } code, err := strconv.Atoi(output[exitIdx+len(exitstr):]) if err != nil { - log.Fatalf("bad exit code: %v", err) + return 0, fmt.Errorf("bad exit code: %v", err) } - os.Exit(code) + return code, nil } // subdir determines the package based on the current working directory, // and returns the path to the package source relative to $GOROOT (or $GOPATH). -func subdir() (pkgpath string, underGoRoot bool) { +func subdir() (pkgpath string, underGoRoot bool, err error) { cwd, err := os.Getwd() if err != nil { - log.Fatal(err) + return "", false, err } cwd, err = filepath.EvalSymlinks(cwd) if err != nil { - log.Fatal(err) + return "", false, err } goroot, err := filepath.EvalSymlinks(runtime.GOROOT()) if err != nil { - log.Fatal(err) + return "", false, err } if strings.HasPrefix(cwd, goroot) { subdir, err := filepath.Rel(goroot, cwd) if err != nil { - log.Fatal(err) + return "", false, err } - return subdir, true + return subdir, true, nil } for _, p := range filepath.SplitList(build.Default.GOPATH) { pabs, err := filepath.EvalSymlinks(p) if err != nil { - log.Fatal(err) + return "", false, err } if !strings.HasPrefix(cwd, pabs) { continue } subdir, err := filepath.Rel(pabs, cwd) if err == nil { - return subdir, false + return subdir, false, nil } } - log.Fatalf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)", + return "", false, fmt.Errorf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)", cwd, runtime.GOROOT(), build.Default.GOPATH) - return "", false } // adbCopyTestdata copies testdata directories from subdir to deviceCwd @@ -201,14 +226,18 @@ func subdir() (pkgpath string, underGoRoot bool) { // It is common for tests to reach out into testdata from parent // packages, so copy testdata directories all the way up to the root // of subdir. -func adbCopyTestdata(deviceCwd, subdir string) { +func adbCopyTestdata(deviceCwd, subdir string) error { dir := "" for { testdata := filepath.Join(dir, "testdata") if _, err := os.Stat(testdata); err == nil { devicePath := filepath.Join(deviceCwd, dir) - run("exec-out", "mkdir", "-p", devicePath) - run("push", testdata, devicePath) + if _, err := run("exec-out", "mkdir", "-p", devicePath); err != nil { + return err + } + if _, err := run("push", testdata, devicePath); err != nil { + return err + } } if subdir == "." { break @@ -216,6 +245,7 @@ func adbCopyTestdata(deviceCwd, subdir string) { subdir = filepath.Dir(subdir) dir = filepath.Join(dir, "..") } + return nil } // adbCopyGoroot clears deviceRoot for previous versions of GOROOT, GOPATH @@ -223,49 +253,78 @@ func adbCopyTestdata(deviceCwd, subdir string) { // including the go tool built for android. // A lock file ensures this only happens once, even with concurrent exec // wrappers. -func adbCopyGoroot() { +func adbCopyGoroot() error { // Also known by cmd/dist. The bootstrap command deletes the file. statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status") stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666) if err != nil { - log.Fatal(err) + return err } defer stat.Close() // Serialize check and copying. if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil { - log.Fatal(err) + return err } s, err := ioutil.ReadAll(stat) if err != nil { - log.Fatal(err) + return err } if string(s) == "done" { - return + return nil } // Delete GOROOT, GOPATH and any leftover test data. - run("exec-out", "rm", "-rf", deviceRoot) + if _, err := run("exec-out", "rm", "-rf", deviceRoot); err != nil { + return err + } deviceBin := filepath.Join(deviceGoroot, "bin") - run("exec-out", "mkdir", "-p", deviceBin) + if _, err := run("exec-out", "mkdir", "-p", deviceBin); err != nil { + return err + } goroot := runtime.GOROOT() // Build go for android. goCmd := filepath.Join(goroot, "bin", "go") tmpGo, err := ioutil.TempFile("", "go_android_exec-cmd-go-*") if err != nil { - log.Fatal(err) + return err } tmpGo.Close() defer os.Remove(tmpGo.Name()) if out, err := exec.Command(goCmd, "build", "-o", tmpGo.Name(), "cmd/go").CombinedOutput(); err != nil { - log.Fatalf("failed to build go tool for device: %s\n%v", out, err) + return fmt.Errorf("failed to build go tool for device: %s\n%v", out, err) } deviceGo := filepath.Join(deviceBin, "go") - run("push", tmpGo.Name(), deviceGo) - for _, dir := range []string{"pkg", "src", "test", "lib", "api"} { - run("push", filepath.Join(goroot, dir), filepath.Join(deviceGoroot)) + if _, err := run("push", tmpGo.Name(), deviceGo); err != nil { + return err + } + for _, dir := range []string{"src", "test", "lib", "api"} { + if _, err := run("push", filepath.Join(goroot, dir), filepath.Join(deviceGoroot)); err != nil { + return err + } + } + + // Copy only the relevant from pkg. + if _, err := run("exec-out", "mkdir", "-p", filepath.Join(deviceGoroot, "pkg", "tool")); err != nil { + return err + } + if _, err := run("push", filepath.Join(goroot, "pkg", "include"), filepath.Join(deviceGoroot, "pkg")); err != nil { + return err + } + runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output() + pkgdir := filepath.Dir(string(runtimea)) + if pkgdir == "" { + return errors.New("could not find android pkg dir") + } + if _, err := run("push", pkgdir, filepath.Join(deviceGoroot, "pkg")); err != nil { + return err + } + tooldir := filepath.Join(goroot, "pkg", "tool", filepath.Base(pkgdir)) + if _, err := run("push", tooldir, filepath.Join(deviceGoroot, "pkg", "tool")); err != nil { + return err } if _, err := stat.Write([]byte("done")); err != nil { - log.Fatal(err) + return err } + return nil } -- GitLab From c9ccdf1f8c1543072ffde1e3d6af1cfcb62f8cdc Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 10 Mar 2019 14:41:17 -0700 Subject: [PATCH 0398/1679] cmd/compile: make deadcode pass cheaper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deadcode pass runs a lot. I'd like it to run even more. This change adds dedicated storage for deadcode to ssa.Cache. In addition to being a nice win now, it makes deadcode easier to add other places in the future. name old time/op new time/op delta Template 210ms ± 3% 209ms ± 2% ~ (p=0.951 n=93+95) Unicode 92.2ms ± 3% 93.0ms ± 3% +0.87% (p=0.000 n=94+94) GoTypes 739ms ± 2% 733ms ± 2% -0.84% (p=0.000 n=92+94) Compiler 3.51s ± 2% 3.49s ± 2% -0.57% (p=0.000 n=94+91) SSA 9.80s ± 2% 9.75s ± 2% -0.57% (p=0.000 n=95+92) Flate 132ms ± 2% 132ms ± 3% ~ (p=0.165 n=94+98) GoParser 160ms ± 3% 159ms ± 3% -0.42% (p=0.005 n=96+94) Reflect 446ms ± 4% 442ms ± 4% -0.91% (p=0.000 n=95+98) Tar 186ms ± 3% 186ms ± 2% ~ (p=0.221 n=94+97) XML 252ms ± 2% 250ms ± 2% -0.55% (p=0.000 n=95+94) [Geo mean] 430ms 429ms -0.34% name old user-time/op new user-time/op delta Template 256ms ± 3% 257ms ± 3% ~ (p=0.521 n=94+98) Unicode 120ms ± 9% 121ms ± 9% ~ (p=0.074 n=99+100) GoTypes 935ms ± 3% 935ms ± 2% ~ (p=0.574 n=82+96) Compiler 4.56s ± 1% 4.55s ± 2% ~ (p=0.247 n=88+90) SSA 13.6s ± 2% 13.6s ± 1% ~ (p=0.277 n=94+95) Flate 155ms ± 3% 156ms ± 3% ~ (p=0.181 n=95+100) GoParser 193ms ± 8% 184ms ± 6% -4.39% (p=0.000 n=100+89) Reflect 549ms ± 3% 552ms ± 3% +0.45% (p=0.036 n=94+96) Tar 230ms ± 4% 230ms ± 4% ~ (p=0.670 n=97+99) XML 315ms ± 5% 309ms ±12% -2.05% (p=0.000 n=99+99) [Geo mean] 540ms 538ms -0.47% name old alloc/op new alloc/op delta Template 40.3MB ± 0% 38.9MB ± 0% -3.36% (p=0.008 n=5+5) Unicode 28.6MB ± 0% 28.4MB ± 0% -0.90% (p=0.008 n=5+5) GoTypes 137MB ± 0% 132MB ± 0% -3.65% (p=0.008 n=5+5) Compiler 637MB ± 0% 609MB ± 0% -4.40% (p=0.008 n=5+5) SSA 2.19GB ± 0% 2.07GB ± 0% -5.63% (p=0.008 n=5+5) Flate 25.0MB ± 0% 24.1MB ± 0% -3.80% (p=0.008 n=5+5) GoParser 30.0MB ± 0% 29.1MB ± 0% -3.17% (p=0.008 n=5+5) Reflect 87.1MB ± 0% 84.4MB ± 0% -3.05% (p=0.008 n=5+5) Tar 37.3MB ± 0% 36.0MB ± 0% -3.31% (p=0.008 n=5+5) XML 49.8MB ± 0% 48.0MB ± 0% -3.69% (p=0.008 n=5+5) [Geo mean] 87.6MB 84.6MB -3.50% name old allocs/op new allocs/op delta Template 387k ± 0% 380k ± 0% -1.76% (p=0.008 n=5+5) Unicode 342k ± 0% 341k ± 0% -0.31% (p=0.008 n=5+5) GoTypes 1.39M ± 0% 1.37M ± 0% -1.64% (p=0.008 n=5+5) Compiler 5.68M ± 0% 5.60M ± 0% -1.41% (p=0.008 n=5+5) SSA 17.1M ± 0% 16.8M ± 0% -1.49% (p=0.008 n=5+5) Flate 240k ± 0% 236k ± 0% -1.99% (p=0.008 n=5+5) GoParser 309k ± 0% 304k ± 0% -1.57% (p=0.008 n=5+5) Reflect 1.01M ± 0% 0.99M ± 0% -2.69% (p=0.008 n=5+5) Tar 360k ± 0% 353k ± 0% -1.91% (p=0.008 n=5+5) XML 447k ± 0% 441k ± 0% -1.26% (p=0.008 n=5+5) [Geo mean] 858k 844k -1.60% Fixes #15306 Change-Id: I9f558adb911efddead3865542fe2ca71f66fe1da Reviewed-on: https://go-review.googlesource.com/c/go/+/166718 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/cache.go | 21 ++++++++++++++++++ src/cmd/compile/internal/ssa/deadcode.go | 25 +++++++++++++++++++--- src/cmd/compile/internal/ssa/func.go | 27 ++++++++++++++++++++++++ src/cmd/compile/internal/ssa/print.go | 1 + 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/ssa/cache.go b/src/cmd/compile/internal/ssa/cache.go index 7438a81b72..6c8cc50e1e 100644 --- a/src/cmd/compile/internal/ssa/cache.go +++ b/src/cmd/compile/internal/ssa/cache.go @@ -25,6 +25,13 @@ type Cache struct { scrSparseSet []*sparseSet // scratch sparse sets to be re-used. scrSparseMap []*sparseMap // scratch sparse maps to be re-used. scrPoset []*poset // scratch poset to be reused + // deadcode contains reusable slices specifically for the deadcode pass. + // It gets special treatment because of the frequency with which it is run. + deadcode struct { + liveOrderStmts []*Value + live []bool + q []*Value + } ValueToProgAfter []*obj.Prog debugState debugState @@ -49,4 +56,18 @@ func (c *Cache) Reset() { xl[i] = nil } + // liveOrderStmts gets used multiple times during compilation of a function. + // We don't know where the high water mark was, so reslice to cap and search. + c.deadcode.liveOrderStmts = c.deadcode.liveOrderStmts[:cap(c.deadcode.liveOrderStmts)] + no := sort.Search(len(c.deadcode.liveOrderStmts), func(i int) bool { return c.deadcode.liveOrderStmts[i] == nil }) + xo := c.deadcode.liveOrderStmts[:no] + for i := range xo { + xo[i] = nil + } + c.deadcode.q = c.deadcode.q[:cap(c.deadcode.q)] + nq := sort.Search(len(c.deadcode.q), func(i int) bool { return c.deadcode.q[i] == nil }) + xq := c.deadcode.q[:nq] + for i := range xq { + xq[i] = nil + } } diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go index 72cce448ce..3c0f8f858a 100644 --- a/src/cmd/compile/internal/ssa/deadcode.go +++ b/src/cmd/compile/internal/ssa/deadcode.go @@ -9,9 +9,12 @@ import ( ) // findlive returns the reachable blocks and live values in f. +// The caller should call f.retDeadcodeLive(live) when it is done with it. func findlive(f *Func) (reachable []bool, live []bool) { reachable = ReachableBlocks(f) - live, _ = liveValues(f, reachable) + var order []*Value + live, order = liveValues(f, reachable) + f.retDeadcodeLiveOrderStmts(order) return } @@ -48,8 +51,21 @@ func ReachableBlocks(f *Func) []bool { // to be statements in reversed data flow order. // The second result is used to help conserve statement boundaries for debugging. // reachable is a map from block ID to whether the block is reachable. +// The caller should call f.retDeadcodeLive(live) and f.retDeadcodeLiveOrderStmts(liveOrderStmts) +// when they are done with the return values. func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value) { - live = make([]bool, f.NumValues()) + live = f.newDeadcodeLive() + if cap(live) < f.NumValues() { + live = make([]bool, f.NumValues()) + } else { + live = live[:f.NumValues()] + for i := range live { + live[i] = false + } + } + + liveOrderStmts = f.newDeadcodeLiveOrderStmts() + liveOrderStmts = liveOrderStmts[:0] // After regalloc, consider all values to be live. // See the comment at the top of regalloc.go and in deadcode for details. @@ -61,7 +77,8 @@ func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value } // Find all live values - q := make([]*Value, 0, 64) // stack-like worklist of unscanned values + q := f.Cache.deadcode.q[:0] + defer func() { f.Cache.deadcode.q = q }() // Starting set: all control values of reachable blocks are live. // Calls are live (because callee can observe the memory state). @@ -163,6 +180,8 @@ func deadcode(f *Func) { // Find live values. live, order := liveValues(f, reachable) + defer f.retDeadcodeLive(live) + defer f.retDeadcodeLiveOrderStmts(order) // Remove dead & duplicate entries from namedValues map. s := f.newSparseSet(f.NumValues()) diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index 7e7e2042d9..fe02dd434a 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -153,6 +153,33 @@ func (f *Func) retPoset(po *poset) { f.Cache.scrPoset = append(f.Cache.scrPoset, po) } +// newDeadcodeLive returns a slice for the +// deadcode pass to use to indicate which values are live. +func (f *Func) newDeadcodeLive() []bool { + r := f.Cache.deadcode.live + f.Cache.deadcode.live = nil + return r +} + +// retDeadcodeLive returns a deadcode live value slice for re-use. +func (f *Func) retDeadcodeLive(live []bool) { + f.Cache.deadcode.live = live +} + +// newDeadcodeLiveOrderStmts returns a slice for the +// deadcode pass to use to indicate which values +// need special treatment for statement boundaries. +func (f *Func) newDeadcodeLiveOrderStmts() []*Value { + r := f.Cache.deadcode.liveOrderStmts + f.Cache.deadcode.liveOrderStmts = nil + return r +} + +// retDeadcodeLiveOrderStmts returns a deadcode liveOrderStmts slice for re-use. +func (f *Func) retDeadcodeLiveOrderStmts(liveOrderStmts []*Value) { + f.Cache.deadcode.liveOrderStmts = liveOrderStmts +} + // newValue allocates a new Value with the given fields and places it at the end of b.Values. func (f *Func) newValue(op Op, t *types.Type, b *Block, pos src.XPos) *Value { var v *Value diff --git a/src/cmd/compile/internal/ssa/print.go b/src/cmd/compile/internal/ssa/print.go index d66530a373..58e4c3bbbe 100644 --- a/src/cmd/compile/internal/ssa/print.go +++ b/src/cmd/compile/internal/ssa/print.go @@ -83,6 +83,7 @@ func (p stringFuncPrinter) named(n LocalSlot, vals []*Value) { func fprintFunc(p funcPrinter, f *Func) { reachable, live := findlive(f) + defer f.retDeadcodeLive(live) p.header(f) printed := make([]bool, f.NumValues()) for _, b := range f.Blocks { -- GitLab From 62bfa69e6e08fd7406dfa20f93303769456be42c Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Fri, 8 Mar 2019 06:17:42 +0000 Subject: [PATCH 0399/1679] net/http: add missing error checks in tests Change-Id: I73441ba2eb349f0e0f25068e6b24c74dd33f1456 GitHub-Last-Rev: b9e6705962b94af3b1b720cc9ad6d33d7d3f1425 GitHub-Pull-Request: golang/go#30017 Reviewed-on: https://go-review.googlesource.com/c/go/+/160441 Reviewed-by: Emmanuel Odeke Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- src/net/http/request_test.go | 45 +++++++++++++++++----------------- src/net/http/serve_test.go | 4 +++ src/net/http/transport_test.go | 4 +++ 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/net/http/request_test.go b/src/net/http/request_test.go index 4e826fad15..b072f95802 100644 --- a/src/net/http/request_test.go +++ b/src/net/http/request_test.go @@ -135,30 +135,31 @@ func TestParseFormInitializeOnError(t *testing.T) { } func TestMultipartReader(t *testing.T) { - req := &Request{ - Method: "POST", - Header: Header{"Content-Type": {`multipart/form-data; boundary="foo123"`}}, - Body: ioutil.NopCloser(new(bytes.Buffer)), - } - multipart, err := req.MultipartReader() - if multipart == nil { - t.Errorf("expected multipart; error: %v", err) - } - - req = &Request{ - Method: "POST", - Header: Header{"Content-Type": {`multipart/mixed; boundary="foo123"`}}, - Body: ioutil.NopCloser(new(bytes.Buffer)), - } - multipart, err = req.MultipartReader() - if multipart == nil { - t.Errorf("expected multipart; error: %v", err) + tests := []struct { + shouldError bool + contentType string + }{ + {false, `multipart/form-data; boundary="foo123"`}, + {false, `multipart/mixed; boundary="foo123"`}, + {true, `text/plain`}, } - req.Header = Header{"Content-Type": {"text/plain"}} - multipart, err = req.MultipartReader() - if multipart != nil { - t.Error("unexpected multipart for text/plain") + for i, test := range tests { + req := &Request{ + Method: "POST", + Header: Header{"Content-Type": {test.contentType}}, + Body: ioutil.NopCloser(new(bytes.Buffer)), + } + multipart, err := req.MultipartReader() + if test.shouldError { + if err == nil || multipart != nil { + t.Errorf("test %d: unexpectedly got nil-error (%v) or non-nil-multipart (%v)", i, err, multipart) + } + continue + } + if err != nil || multipart == nil { + t.Errorf("test %d: unexpectedly got error (%v) or nil-multipart (%v)", i, err, multipart) + } } } diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 86cdb34ebb..ea6d7c2fda 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -4706,6 +4706,10 @@ func TestServerHandlersCanHandleH2PRI(t *testing.T) { defer afterTest(t) ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { conn, br, err := w.(Hijacker).Hijack() + if err != nil { + t.Error(err) + return + } defer conn.Close() if r.Method != "PRI" || r.RequestURI != "*" { t.Errorf("Got method/target %q %q; want PRI *", r.Method, r.RequestURI) diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 82741e8537..23864a4957 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -865,6 +865,10 @@ func TestRoundTripGzip(t *testing.T) { req.Header.Set("Accept-Encoding", test.accept) } res, err := tr.RoundTrip(req) + if err != nil { + t.Errorf("%d. RoundTrip: %v", i, err) + continue + } var body []byte if test.compressed { var r *gzip.Reader -- GitLab From 30cc8a46c47252e15300d3cf9d27cba9e71e649b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Mon, 11 Mar 2019 15:05:10 -0400 Subject: [PATCH 0400/1679] test: add new test for gccgo compilation problem New test for issue 30659 (compilation error due to bad export data). Updates #30659. Change-Id: I2541ee3c379e5b22033fea66bb4ebaf720cc5e1f Reviewed-on: https://go-review.googlesource.com/c/go/+/166917 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- test/fixedbugs/issue30659.dir/a.go | 19 +++++++++++++++++++ test/fixedbugs/issue30659.dir/b.go | 13 +++++++++++++ test/fixedbugs/issue30659.go | 7 +++++++ 3 files changed, 39 insertions(+) create mode 100644 test/fixedbugs/issue30659.dir/a.go create mode 100644 test/fixedbugs/issue30659.dir/b.go create mode 100644 test/fixedbugs/issue30659.go diff --git a/test/fixedbugs/issue30659.dir/a.go b/test/fixedbugs/issue30659.dir/a.go new file mode 100644 index 0000000000..3837e021c4 --- /dev/null +++ b/test/fixedbugs/issue30659.dir/a.go @@ -0,0 +1,19 @@ +// Copyright 2019 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 a + +type I interface { + I2 +} +type I2 interface { + M() +} +type S struct{} + +func (*S) M() {} + +func New() I { + return &S{} +} diff --git a/test/fixedbugs/issue30659.dir/b.go b/test/fixedbugs/issue30659.dir/b.go new file mode 100644 index 0000000000..272e520582 --- /dev/null +++ b/test/fixedbugs/issue30659.dir/b.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 b + +import ( + "./a" +) + +func B(p1 a.I, p2 a.I2) int { + return 42 +} diff --git a/test/fixedbugs/issue30659.go b/test/fixedbugs/issue30659.go new file mode 100644 index 0000000000..973ae1dcef --- /dev/null +++ b/test/fixedbugs/issue30659.go @@ -0,0 +1,7 @@ +// compiledir + +// Copyright 2019 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 ignored -- GitLab From 2bd28cee2356c34427a94f4323bd534641f7070b Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Thu, 17 Jan 2019 16:53:41 +0100 Subject: [PATCH 0401/1679] syscall: correctly set up uid/gid mappings in user namespaces Before this CL, uid/gid mapping was always set up from the parent process, which is a privileged operation. When using unprivileged user namespaces, a process can modify its uid/gid mapping after the unshare(2) call (but setting the uid/gid mapping from another process is NOT possible). Fixes #29789 Change-Id: I8c96a03f5da23fe80bbb83ef051ad89cf185d750 Reviewed-on: https://go-review.googlesource.com/c/go/+/158298 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/syscall/exec_linux.go | 98 +++++++++++++++++++++++++++------- src/syscall/exec_linux_test.go | 43 +++++++++++++++ 2 files changed, 122 insertions(+), 19 deletions(-) diff --git a/src/syscall/exec_linux.go b/src/syscall/exec_linux.go index ec8f296bca..3493f4b32b 100644 --- a/src/syscall/exec_linux.go +++ b/src/syscall/exec_linux.go @@ -82,10 +82,13 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr if sys.UidMappings != nil || sys.GidMappings != nil { Close(p[0]) - err := writeUidGidMappings(pid, sys) var err2 Errno - if err != nil { - err2 = err.(Errno) + // uid/gid mappings will be written after fork and unshare(2) for user + // namespaces. + if sys.Unshareflags&CLONE_NEWUSER == 0 { + if err := writeUidGidMappings(pid, sys); err != nil { + err2 = err.(Errno) + } } RawSyscall(SYS_WRITE, uintptr(p[1]), uintptr(unsafe.Pointer(&err2)), unsafe.Sizeof(err2)) Close(p[1]) @@ -142,12 +145,32 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att // Declare all variables at top in case any // declarations require heap allocation (e.g., err1). var ( - err2 Errno - nextfd int - i int - caps caps + err2 Errno + nextfd int + i int + caps caps + fd1 uintptr + puid, psetgroups, pgid []byte + uidmap, setgroups, gidmap []byte ) + if sys.UidMappings != nil { + puid = []byte("/proc/self/uid_map\000") + uidmap = formatIDMappings(sys.UidMappings) + } + + if sys.GidMappings != nil { + psetgroups = []byte("/proc/self/setgroups\000") + pgid = []byte("/proc/self/gid_map\000") + + if sys.GidMappingsEnableSetgroups { + setgroups = []byte("allow\000") + } else { + setgroups = []byte("deny\000") + } + gidmap = formatIDMappings(sys.GidMappings) + } + // Record parent PID so child can test if it has died. ppid, _ := rawSyscallNoError(SYS_GETPID, 0, 0, 0) @@ -264,6 +287,46 @@ func forkAndExecInChild1(argv0 *byte, argv, envv []*byte, chroot, dir *byte, att if err1 != 0 { goto childerror } + + if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.GidMappings != nil { + dirfd := int(_AT_FDCWD) + if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&psetgroups[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 { + goto childerror + } + r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&setgroups[0])), uintptr(len(setgroups))) + if err1 != 0 { + goto childerror + } + if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(fd1), 0, 0); err1 != 0 { + goto childerror + } + + if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&pgid[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 { + goto childerror + } + r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&gidmap[0])), uintptr(len(gidmap))) + if err1 != 0 { + goto childerror + } + if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(fd1), 0, 0); err1 != 0 { + goto childerror + } + } + + if sys.Unshareflags&CLONE_NEWUSER != 0 && sys.UidMappings != nil { + dirfd := int(_AT_FDCWD) + if fd1, _, err1 = RawSyscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(&puid[0])), uintptr(O_WRONLY), 0, 0, 0); err1 != 0 { + goto childerror + } + r1, _, err1 = RawSyscall(SYS_WRITE, uintptr(fd1), uintptr(unsafe.Pointer(&uidmap[0])), uintptr(len(uidmap))) + if err1 != 0 { + goto childerror + } + if _, _, err1 = RawSyscall(SYS_CLOSE, uintptr(fd1), 0, 0); err1 != 0 { + goto childerror + } + } + // The unshare system call in Linux doesn't unshare mount points // mounted with --shared. Systemd mounts / with --shared. For a // long discussion of the pros and cons of this see debian bug 739593. @@ -480,25 +543,22 @@ func forkExecPipe(p []int) (err error) { return } -// writeIDMappings writes the user namespace User ID or Group ID mappings to the specified path. -func writeIDMappings(path string, idMap []SysProcIDMap) error { - fd, err := Open(path, O_RDWR, 0) - if err != nil { - return err - } - - data := "" +func formatIDMappings(idMap []SysProcIDMap) []byte { + var data []byte for _, im := range idMap { - data = data + itoa(im.ContainerID) + " " + itoa(im.HostID) + " " + itoa(im.Size) + "\n" + data = append(data, []byte(itoa(im.ContainerID)+" "+itoa(im.HostID)+" "+itoa(im.Size)+"\n")...) } + return data +} - bytes, err := ByteSliceFromString(data) +// writeIDMappings writes the user namespace User ID or Group ID mappings to the specified path. +func writeIDMappings(path string, idMap []SysProcIDMap) error { + fd, err := Open(path, O_RDWR, 0) if err != nil { - Close(fd) return err } - if _, err := Write(fd, bytes); err != nil { + if _, err := Write(fd, formatIDMappings(idMap)); err != nil { Close(fd) return err } diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go index 826487b676..09ced3b0e0 100644 --- a/src/syscall/exec_linux_test.go +++ b/src/syscall/exec_linux_test.go @@ -434,6 +434,49 @@ func TestUnshareMountNameSpaceChroot(t *testing.T) { } } +func TestUnshareUidGidMappingHelper(*testing.T) { + if os.Getenv("GO_WANT_HELPER_PROCESS") != "1" { + return + } + defer os.Exit(0) + if err := syscall.Chroot(os.TempDir()); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } +} + +// Test for Issue 29789: unshare fails when uid/gid mapping is specified +func TestUnshareUidGidMapping(t *testing.T) { + if os.Getuid() == 0 { + t.Skip("test exercises unprivileged user namespace, fails with privileges") + } + checkUserNS(t) + cmd := exec.Command(os.Args[0], "-test.run=TestUnshareUidGidMappingHelper") + cmd.Env = append(os.Environ(), "GO_WANT_HELPER_PROCESS=1") + cmd.SysProcAttr = &syscall.SysProcAttr{ + Unshareflags: syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER, + GidMappingsEnableSetgroups: false, + UidMappings: []syscall.SysProcIDMap{ + { + ContainerID: 0, + HostID: syscall.Getuid(), + Size: 1, + }, + }, + GidMappings: []syscall.SysProcIDMap{ + { + ContainerID: 0, + HostID: syscall.Getgid(), + Size: 1, + }, + }, + } + out, err := cmd.CombinedOutput() + if err != nil { + t.Fatalf("Cmd failed with err %v, output: %s", err, out) + } +} + type capHeader struct { version uint32 pid int32 -- GitLab From 8b2a2d03947453147e8dcbec50dfe33c19e5fa57 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 01:58:38 +0000 Subject: [PATCH 0402/1679] Revert "cmd/go: change the default value of GO111MODULE to 'on'" This reverts commit cf4691650c3c556f19844a881a32792a919ee8d1 (CL 162698). Reason for revert: broke make.bash bootstrapping from head. Change-Id: I3de6d26b1af9038c6b92dec88667bfa734060a41 Reviewed-on: https://go-review.googlesource.com/c/go/+/166985 Reviewed-by: Brad Fitzpatrick --- src/cmd/go/alldocs.go | 331 +++++++++--------- src/cmd/go/help_test.go | 5 - src/cmd/go/internal/help/help.go | 7 +- src/cmd/go/internal/modload/help.go | 39 ++- src/cmd/go/internal/modload/init.go | 35 +- src/cmd/go/main.go | 15 +- src/cmd/go/mkalldocs.sh | 2 +- src/cmd/go/testdata/script/mod_find.txt | 2 +- .../go/testdata/script/mod_gobuild_import.txt | 6 - 9 files changed, 232 insertions(+), 210 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 5aa296ae61..33f6126ada 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -21,7 +21,7 @@ // fix update packages to use new APIs // fmt gofmt (reformat) package sources // generate generate Go files by processing source -// get add dependencies to current module and install them +// get download and install packages and dependencies // install compile and install packages and dependencies // list list packages or modules // mod module maintenance @@ -534,105 +534,67 @@ // For more about specifying packages, see 'go help packages'. // // -// Add dependencies to current module and install them +// Download and install packages and dependencies // // Usage: // -// go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] +// go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] // -// Get resolves and adds dependencies to the current development module -// and then builds and installs them. -// -// The first step is to resolve which dependencies to add. -// -// For each named package or package pattern, get must decide which version of -// the corresponding module to use. By default, get chooses the latest tagged -// release version, such as v0.4.5 or v1.2.3. If there are no tagged release -// versions, get chooses the latest tagged prerelease version, such as -// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest -// known commit. -// -// This default version selection can be overridden by adding an @version -// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. -// For modules stored in source control repositories, the version suffix can -// also be a commit hash, branch identifier, or other syntax known to the -// source control system, as in 'go get golang.org/x/text@master'. -// The version suffix @latest explicitly requests the default behavior -// described above. -// -// If a module under consideration is already a dependency of the current -// development module, then get will update the required version. -// Specifying a version earlier than the current required version is valid and -// downgrades the dependency. The version suffix @none indicates that the -// dependency should be removed entirely, downgrading or removing modules -// depending on it as needed. -// -// Although get defaults to using the latest version of the module containing -// a named package, it does not use the latest version of that module's -// dependencies. Instead it prefers to use the specific dependency versions -// requested by that module. For example, if the latest A requires module -// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' -// will use the latest A but then use B v1.2.3, as requested by A. (If there -// are competing requirements for a particular module, then 'go get' resolves -// those requirements by taking the maximum requested version.) -// -// The -u flag instructs get to update dependencies to use newer minor or -// patch releases when available. Continuing the previous example, -// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). +// Get downloads the packages named by the import paths, along with their +// dependencies. It then installs the named packages, like 'go install'. // -// The -u=patch flag (not -u patch) instructs get to update dependencies -// to use newer patch releases when available. Continuing the previous example, -// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). +// The -d flag instructs get to stop after downloading the packages; that is, +// it instructs get not to install the packages. // -// In general, adding a new dependency may require upgrading -// existing dependencies to keep a working build, and 'go get' does -// this automatically. Similarly, downgrading one dependency may -// require downgrading other dependencies, and 'go get' does -// this automatically as well. +// The -f flag, valid only when -u is set, forces get -u not to verify that +// each package has been checked out from the source control repository +// implied by its import path. This can be useful if the source is a local fork +// of the original. // -// The -m flag instructs get to stop here, after resolving, upgrading, -// and downgrading modules and updating go.mod. When using -m, -// each specified package path must be a module path as well, -// not the import path of a package below the module root. +// The -fix flag instructs get to run the fix tool on the downloaded packages +// before resolving dependencies or building the code. // // The -insecure flag permits fetching from repositories and resolving // custom domains using insecure schemes such as HTTP. Use with caution. // -// The second step is to download (if needed), build, and install -// the named packages. +// The -t flag instructs get to also download the packages required to build +// the tests for the specified packages. // -// If an argument names a module but not a package (because there is no -// Go source code in the module's root directory), then the install step -// is skipped for that argument, instead of causing a build failure. -// For example 'go get golang.org/x/perf' succeeds even though there -// is no code corresponding to that import path. +// The -u flag instructs get to use the network to update the named packages +// and their dependencies. By default, get uses the network to check out +// missing packages but does not use it to look for updates to existing packages. // -// Note that package patterns are allowed and are expanded after resolving -// the module versions. For example, 'go get golang.org/x/perf/cmd/...' -// adds the latest golang.org/x/perf and then installs the commands in that -// latest version. +// The -v flag enables verbose progress and debug output. // -// The -d flag instructs get to download the source code needed to build -// the named packages, including downloading necessary dependencies, -// but not to build and install them. +// Get also accepts build flags to control the installation. See 'go help build'. // -// With no package arguments, 'go get' applies to the main module, -// and to the Go package in the current directory, if any. In particular, -// 'go get -u' and 'go get -u=patch' update all the dependencies of the -// main module. With no package arguments and also without -u, -// 'go get' is not much more than 'go install', and 'go get -d' not much -// more than 'go list'. +// When checking out a new package, get creates the target directory +// GOPATH/src/. If the GOPATH contains multiple entries, +// get uses the first one. For more details see: 'go help gopath'. // -// For more about modules, see 'go help modules'. +// When checking out or updating a package, get looks for a branch or tag +// that matches the locally installed version of Go. The most important +// rule is that if the local installation is running version "go1", get +// searches for a branch or tag named "go1". If no such version exists +// it retrieves the default branch of the package. +// +// When go get checks out or updates a Git repository, +// it also updates any git submodules referenced by the repository. +// +// Get never checks out or updates code stored in vendor directories. // // For more about specifying packages, see 'go help packages'. // -// This text describes the behavior of get using modules to manage source -// code and dependencies. If instead the go command is running in GOPATH -// mode, the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help gopath-get'. +// For more about how 'go get' finds source code to +// download, see 'go help importpath'. // -// See also: go build, go install, go clean, go mod. +// This text describes the behavior of get when using GOPATH +// to manage source code and dependencies. +// If instead the go command is running in module-aware mode, +// the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help module-get'. +// +// See also: go build, go install, go clean. // // // Compile and install packages and dependencies @@ -1876,72 +1838,6 @@ // See https://golang.org/s/go15vendor for details. // // -// Legacy GOPATH go get -// -// The 'go get' command changes behavior depending on whether the -// go command is running in module-aware mode or legacy GOPATH mode. -// This help text, accessible as 'go help gopath-get' even in module-aware mode, -// describes 'go get' as it operates in legacy GOPATH mode. -// -// Usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] -// -// Get downloads the packages named by the import paths, along with their -// dependencies. It then installs the named packages, like 'go install'. -// -// The -d flag instructs get to stop after downloading the packages; that is, -// it instructs get not to install the packages. -// -// The -f flag, valid only when -u is set, forces get -u not to verify that -// each package has been checked out from the source control repository -// implied by its import path. This can be useful if the source is a local fork -// of the original. -// -// The -fix flag instructs get to run the fix tool on the downloaded packages -// before resolving dependencies or building the code. -// -// The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. -// -// The -t flag instructs get to also download the packages required to build -// the tests for the specified packages. -// -// The -u flag instructs get to use the network to update the named packages -// and their dependencies. By default, get uses the network to check out -// missing packages but does not use it to look for updates to existing packages. -// -// The -v flag enables verbose progress and debug output. -// -// Get also accepts build flags to control the installation. See 'go help build'. -// -// When checking out a new package, get creates the target directory -// GOPATH/src/. If the GOPATH contains multiple entries, -// get uses the first one. For more details see: 'go help gopath'. -// -// When checking out or updating a package, get looks for a branch or tag -// that matches the locally installed version of Go. The most important -// rule is that if the local installation is running version "go1", get -// searches for a branch or tag named "go1". If no such version exists -// it retrieves the default branch of the package. -// -// When go get checks out or updates a Git repository, -// it also updates any git submodules referenced by the repository. -// -// Get never checks out or updates code stored in vendor directories. -// -// For more about specifying packages, see 'go help packages'. -// -// For more about how 'go get' finds source code to -// download, see 'go help importpath'. -// -// This text describes the behavior of get when using GOPATH -// to manage source code and dependencies. -// If instead the go command is running in module-aware mode, -// the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help module-get'. -// -// See also: go build, go install, go clean. -// -// // Module proxy protocol // // The go command by default downloads modules from version control systems @@ -2201,25 +2097,34 @@ // Modules replace the old GOPATH-based approach to specifying // which source files are used in a given build. // -// Module support +// Preliminary module support // -// Go 1.13 includes official support for Go modules, -// including a module-aware 'go get' command. -// Module-aware mode is active by default. +// Go 1.11 includes preliminary support for Go modules, +// including a new module-aware 'go get' command. +// We intend to keep revising this support, while preserving compatibility, +// until it can be declared official (no longer preliminary), +// and then at a later point we may remove support for work +// in GOPATH and the old 'go get' command. // -// For more fine-grained control, Go 1.13 continues to respect +// The quickest way to take advantage of the new Go 1.11 module support +// is to check out your repository into a directory outside GOPATH/src, +// create a go.mod file (described in the next section) there, and run +// go commands from within that file tree. +// +// For more fine-grained control, the module support in Go 1.11 respects // a temporary environment variable, GO111MODULE, which can be set to one -// of three string values: off, auto, or on (the default). -// If GO111MODULE=on or is unset, then the go command requires the use of -// modules, never consulting GOPATH. We refer to this as the command -// being module-aware or running in "module-aware mode". -// If GO111MODULE=auto, then the go command enables or disables module -// support based on the current directory. Module support is enabled only -// when the current directory is outside GOPATH/src and itself contains a -// go.mod file or is below a directory containing a go.mod file. -// If GO111MODULE=off, then the go command never uses -// module support. Instead it looks in vendor directories and GOPATH +// of three string values: off, on, or auto (the default). +// If GO111MODULE=off, then the go command never uses the +// new module support. Instead it looks in vendor directories and GOPATH // to find dependencies; we now refer to this as "GOPATH mode." +// If GO111MODULE=on, then the go command requires the use of modules, +// never consulting GOPATH. We refer to this as the command being +// module-aware or running in "module-aware mode". +// If GO111MODULE=auto or is unset, then the go command enables or +// disables module support based on the current directory. +// Module support is enabled only when the current directory is outside +// GOPATH/src and itself contains a go.mod file or is below a directory +// containing a go.mod file. // // In module-aware mode, GOPATH no longer defines the meaning of imports // during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) @@ -2541,6 +2446,110 @@ // are still ignored. // // +// Module-aware go get +// +// The 'go get' command changes behavior depending on whether the +// go command is running in module-aware mode or legacy GOPATH mode. +// This help text, accessible as 'go help module-get' even in legacy GOPATH mode, +// describes 'go get' as it operates in module-aware mode. +// +// Usage: go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] +// +// Get resolves and adds dependencies to the current development module +// and then builds and installs them. +// +// The first step is to resolve which dependencies to add. +// +// For each named package or package pattern, get must decide which version of +// the corresponding module to use. By default, get chooses the latest tagged +// release version, such as v0.4.5 or v1.2.3. If there are no tagged release +// versions, get chooses the latest tagged prerelease version, such as +// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest +// known commit. +// +// This default version selection can be overridden by adding an @version +// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. +// For modules stored in source control repositories, the version suffix can +// also be a commit hash, branch identifier, or other syntax known to the +// source control system, as in 'go get golang.org/x/text@master'. +// The version suffix @latest explicitly requests the default behavior +// described above. +// +// If a module under consideration is already a dependency of the current +// development module, then get will update the required version. +// Specifying a version earlier than the current required version is valid and +// downgrades the dependency. The version suffix @none indicates that the +// dependency should be removed entirely, downgrading or removing modules +// depending on it as needed. +// +// Although get defaults to using the latest version of the module containing +// a named package, it does not use the latest version of that module's +// dependencies. Instead it prefers to use the specific dependency versions +// requested by that module. For example, if the latest A requires module +// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' +// will use the latest A but then use B v1.2.3, as requested by A. (If there +// are competing requirements for a particular module, then 'go get' resolves +// those requirements by taking the maximum requested version.) +// +// The -u flag instructs get to update dependencies to use newer minor or +// patch releases when available. Continuing the previous example, +// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). +// +// The -u=patch flag (not -u patch) instructs get to update dependencies +// to use newer patch releases when available. Continuing the previous example, +// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). +// +// In general, adding a new dependency may require upgrading +// existing dependencies to keep a working build, and 'go get' does +// this automatically. Similarly, downgrading one dependency may +// require downgrading other dependencies, and 'go get' does +// this automatically as well. +// +// The -m flag instructs get to stop here, after resolving, upgrading, +// and downgrading modules and updating go.mod. When using -m, +// each specified package path must be a module path as well, +// not the import path of a package below the module root. +// +// The -insecure flag permits fetching from repositories and resolving +// custom domains using insecure schemes such as HTTP. Use with caution. +// +// The second step is to download (if needed), build, and install +// the named packages. +// +// If an argument names a module but not a package (because there is no +// Go source code in the module's root directory), then the install step +// is skipped for that argument, instead of causing a build failure. +// For example 'go get golang.org/x/perf' succeeds even though there +// is no code corresponding to that import path. +// +// Note that package patterns are allowed and are expanded after resolving +// the module versions. For example, 'go get golang.org/x/perf/cmd/...' +// adds the latest golang.org/x/perf and then installs the commands in that +// latest version. +// +// The -d flag instructs get to download the source code needed to build +// the named packages, including downloading necessary dependencies, +// but not to build and install them. +// +// With no package arguments, 'go get' applies to the main module, +// and to the Go package in the current directory, if any. In particular, +// 'go get -u' and 'go get -u=patch' update all the dependencies of the +// main module. With no package arguments and also without -u, +// 'go get' is not much more than 'go install', and 'go get -d' not much +// more than 'go list'. +// +// For more about modules, see 'go help modules'. +// +// For more about specifying packages, see 'go help packages'. +// +// This text describes the behavior of get using modules to manage source +// code and dependencies. If instead the go command is running in GOPATH +// mode, the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help gopath-get'. +// +// See also: go build, go install, go clean, go mod. +// +// // Package lists and patterns // // Many commands apply to a set of packages: diff --git a/src/cmd/go/help_test.go b/src/cmd/go/help_test.go index 9c0fa8411e..ec6a9d11cb 100644 --- a/src/cmd/go/help_test.go +++ b/src/cmd/go/help_test.go @@ -12,14 +12,9 @@ import ( "testing" "cmd/go/internal/help" - "cmd/go/internal/modload" ) func TestDocsUpToDate(t *testing.T) { - if !modload.Enabled() { - t.Skipf("help.Help in GOPATH mode is configured by main.main") - } - buf := new(bytes.Buffer) // Match the command in mkalldocs.sh that generates alldocs.go. help.Help(buf, []string{"documentation"}) diff --git a/src/cmd/go/internal/help/help.go b/src/cmd/go/internal/help/help.go index d373771ab5..121deb70a5 100644 --- a/src/cmd/go/internal/help/help.go +++ b/src/cmd/go/internal/help/help.go @@ -17,7 +17,6 @@ import ( "unicode/utf8" "cmd/go/internal/base" - "cmd/go/internal/modload" ) // Help implements the 'help' command. @@ -36,10 +35,8 @@ func Help(w io.Writer, args []string) { usage := &base.Command{Long: buf.String()} cmds := []*base.Command{usage} for _, cmd := range base.Go.Commands { - // Avoid duplication of the "get" documentation. - if cmd.UsageLine == "module-get" && modload.Enabled() { - continue - } else if cmd.UsageLine == "gopath-get" && !modload.Enabled() { + if cmd.UsageLine == "gopath-get" { + // Avoid duplication of the "get" documentation. continue } cmds = append(cmds, cmd) diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index c1685ff08e..63657a448f 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -19,25 +19,34 @@ including recording and resolving dependencies on other modules. Modules replace the old GOPATH-based approach to specifying which source files are used in a given build. -Module support +Preliminary module support -Go 1.13 includes official support for Go modules, -including a module-aware 'go get' command. -Module-aware mode is active by default. +Go 1.11 includes preliminary support for Go modules, +including a new module-aware 'go get' command. +We intend to keep revising this support, while preserving compatibility, +until it can be declared official (no longer preliminary), +and then at a later point we may remove support for work +in GOPATH and the old 'go get' command. -For more fine-grained control, Go 1.13 continues to respect +The quickest way to take advantage of the new Go 1.11 module support +is to check out your repository into a directory outside GOPATH/src, +create a go.mod file (described in the next section) there, and run +go commands from within that file tree. + +For more fine-grained control, the module support in Go 1.11 respects a temporary environment variable, GO111MODULE, which can be set to one -of three string values: off, auto, or on (the default). -If GO111MODULE=on or is unset, then the go command requires the use of -modules, never consulting GOPATH. We refer to this as the command -being module-aware or running in "module-aware mode". -If GO111MODULE=auto, then the go command enables or disables module -support based on the current directory. Module support is enabled only -when the current directory is outside GOPATH/src and itself contains a -go.mod file or is below a directory containing a go.mod file. -If GO111MODULE=off, then the go command never uses -module support. Instead it looks in vendor directories and GOPATH +of three string values: off, on, or auto (the default). +If GO111MODULE=off, then the go command never uses the +new module support. Instead it looks in vendor directories and GOPATH to find dependencies; we now refer to this as "GOPATH mode." +If GO111MODULE=on, then the go command requires the use of modules, +never consulting GOPATH. We refer to this as the command being +module-aware or running in "module-aware mode". +If GO111MODULE=auto or is unset, then the go command enables or +disables module support based on the current directory. +Module support is enabled only when the current directory is outside +GOPATH/src and itself contains a go.mod file or is below a directory +containing a go.mod file. In module-aware mode, GOPATH no longer defines the meaning of imports during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index ddfb18738f..0970ccf2d6 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -34,7 +34,7 @@ import ( var ( cwd string // TODO(bcmills): Is this redundant with base.Cwd? - mustUseModules = true + MustUseModules = mustUseModules() initialized bool modRoot string @@ -70,6 +70,16 @@ func BinDir() string { return filepath.Join(gopath, "bin") } +// mustUseModules reports whether we are invoked as vgo +// (as opposed to go). +// If so, we only support builds with go.mod files. +func mustUseModules() bool { + name := os.Args[0] + name = name[strings.LastIndex(name, "/")+1:] + name = name[strings.LastIndex(name, `\`)+1:] + return strings.HasPrefix(name, "vgo") +} + var inGOPATH bool // running in GOPATH/src // Init determines whether module mode is enabled, locates the root of the @@ -86,13 +96,14 @@ func Init() { switch env { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) - case "auto": - mustUseModules = false - case "on", "": - mustUseModules = true + case "", "auto": + // leave MustUseModules alone + case "on": + MustUseModules = true case "off": - mustUseModules = false - return + if !MustUseModules { + return + } } // Disable any prompting for passwords by Git. @@ -139,7 +150,7 @@ func Init() { } } - if inGOPATH && !mustUseModules { + if inGOPATH && !MustUseModules { if CmdModInit { die() // Don't init a module that we're just going to ignore. } @@ -156,8 +167,8 @@ func Init() { } else { modRoot = findModuleRoot(cwd) if modRoot == "" { - if !mustUseModules { - // GO111MODULE is 'auto', and we can't find a module root. + if !MustUseModules { + // GO111MODULE is 'auto' (or unset), and we can't find a module root. // Stay in GOPATH mode. return } @@ -256,7 +267,7 @@ func init() { // (usually through MustModRoot). func Enabled() bool { Init() - return modRoot != "" || mustUseModules + return modRoot != "" || MustUseModules } // ModRoot returns the root of the main module. @@ -289,7 +300,7 @@ func die() { if os.Getenv("GO111MODULE") == "off" { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") } - if inGOPATH && !mustUseModules { + if inGOPATH && !MustUseModules { base.Fatalf("go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'") } if cwd != "" { diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index e529e96986..acca4fd3c1 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -49,7 +49,7 @@ func init() { fix.CmdFix, fmtcmd.CmdFmt, generate.CmdGenerate, - modget.CmdGet, + get.CmdGet, work.CmdInstall, list.CmdList, modcmd.CmdMod, @@ -89,10 +89,17 @@ func main() { base.Usage() } + if modload.MustUseModules { + // If running with modules force-enabled, change get now to change help message. + *get.CmdGet = *modget.CmdGet + } + if args[0] == "get" || args[0] == "help" { - if modload.Init(); !modload.Enabled() { - // Replace module-aware get with GOPATH get if appropriate. - *modget.CmdGet = *get.CmdGet + // Replace get with module-aware get if appropriate. + // Note that if MustUseModules is true, this happened already above, + // but no harm in doing it again. + if modload.Init(); modload.Enabled() { + *get.CmdGet = *modget.CmdGet } } diff --git a/src/cmd/go/mkalldocs.sh b/src/cmd/go/mkalldocs.sh index a2b0aca3c9..f37d59d2d7 100755 --- a/src/cmd/go/mkalldocs.sh +++ b/src/cmd/go/mkalldocs.sh @@ -8,6 +8,6 @@ set -e go build -o go.latest # If the command used to generate alldocs.go changes, update TestDocsUpToDate in # help_test.go. -GO111MODULE='' ./go.latest help documentation >alldocs.go +./go.latest help documentation >alldocs.go gofmt -w alldocs.go rm go.latest diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index e82001a24a..703a88e99c 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -17,7 +17,7 @@ cd $GOPATH/src/example.com/x/y ! go mod init stderr 'go: modules disabled inside GOPATH/src by GO111MODULE=auto; see ''go help modules''' -env GO111MODULE= +env GO111MODULE=on # Derive module path from location inside GOPATH. cd $GOPATH/src/example.com/x/y diff --git a/src/cmd/go/testdata/script/mod_gobuild_import.txt b/src/cmd/go/testdata/script/mod_gobuild_import.txt index 6c87d59649..d2d1645b83 100644 --- a/src/cmd/go/testdata/script/mod_gobuild_import.txt +++ b/src/cmd/go/testdata/script/mod_gobuild_import.txt @@ -24,18 +24,12 @@ exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on outside GOPATH/src -env GO111MODULE= -exec $WORK/testimport.exe other/x/y/z/w . -stdout w2.go env GO111MODULE=on exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on in GOPATH/src cd $GOPATH/src -env GO111MODULE= -exec $WORK/testimport.exe x/y/z/w . -stdout w1.go env GO111MODULE=on exec $WORK/testimport.exe x/y/z/w . stdout w1.go -- GitLab From 9fedec79ed2da83fe33cad8e6cf6a28d23948f27 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Mar 2019 17:25:09 -0400 Subject: [PATCH 0403/1679] go/build: bypass importGo if srcDir is in GOROOT/src This fixes the builder flake observed in https://build.golang.org/log/84fe80f8f091b9cef639b3ae2422a673f1462810, which could be replicated by running GOPROXY=off GOPATH=$(mktemp -d) go test go/internal/srcimporter Updates #30228 Fixes #30760 Change-Id: Ibf8b7a2e211611960b074b74af91acd4f0196edb Reviewed-on: https://go-review.googlesource.com/c/go/+/166977 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/go/build/build.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/go/build/build.go b/src/go/build/build.go index c8aa872bd2..1be10f1fb8 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -1002,6 +1002,7 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode, } // If modules are not enabled, then the in-process code works fine and we should keep using it. + // TODO(bcmills): This assumes that the default is "auto" instead of "on". switch os.Getenv("GO111MODULE") { case "off": return errNoModules @@ -1017,6 +1018,13 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode, } } + // If the source directory is in GOROOT, then the in-process code works fine + // and we should keep using it. Moreover, the 'go list' approach below doesn't + // take standard-library vendoring into account and will fail. + if _, ok := ctxt.hasSubdir(filepath.Join(ctxt.GOROOT, "src"), srcDir); ok { + return errNoModules + } + // For efficiency, if path is a standard library package, let the usual lookup code handle it. if ctxt.GOROOT != "" { dir := ctxt.joinPath(ctxt.GOROOT, "src", path) @@ -1043,7 +1051,12 @@ func (ctxt *Context) importGo(p *Package, path, srcDir string, mode ImportMode, } cmd := exec.Command("go", "list", "-compiler="+ctxt.Compiler, "-tags="+strings.Join(ctxt.BuildTags, ","), "-installsuffix="+ctxt.InstallSuffix, "-f={{.Dir}}\n{{.ImportPath}}\n{{.Root}}\n{{.Goroot}}\n", path) + + // TODO(bcmills): This is wrong if srcDir is in a vendor directory, or if + // srcDir is in some module dependency of the main module. The main module + // chooses what the import paths mean: individual packages don't. cmd.Dir = srcDir + var stdout, stderr strings.Builder cmd.Stdout = &stdout cmd.Stderr = &stderr -- GitLab From 21a634e2e91752aa61b4e4a008ec500eeb4ee462 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 7 Mar 2019 08:41:02 +0100 Subject: [PATCH 0404/1679] os: drop special case for FreeBSD 10.4 in newFile Support for FreeBSD 10 will be dropped with Go 1.13, so revert the workaround introduced in CL 157099. Updates #29633 Updates #27619 Change-Id: I1a2e50d3f807a411389f3db07c0f4535a590da02 Reviewed-on: https://go-review.googlesource.com/c/go/+/165801 Run-TryBot: Tobias Klauser Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/file_unix.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 857cbdb68d..4b62abfb5c 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -123,15 +123,7 @@ func newFile(fd uintptr, name string, kind newFileKind) *File { if kind == kindOpenFile { var st syscall.Stat_t switch runtime.GOOS { - case "freebsd": - // On FreeBSD before 10.4 it used to crash the - // system unpredictably while running all.bash. - // When we stop supporting FreeBSD 10 we can merge - // this into the dragonfly/netbsd/openbsd case. - // Issue 27619. - pollable = false - - case "dragonfly", "netbsd", "openbsd": + case "dragonfly", "freebsd", "netbsd", "openbsd": // Don't try to use kqueue with regular files on *BSDs. // On FreeBSD a regular file is always // reported as ready for writing. -- GitLab From 14a58d65e387481a326193840bce5787096a150e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 11 Mar 2019 15:18:05 +0100 Subject: [PATCH 0405/1679] internal/bytealg: share code for equal functions on arm Move the shared code into byteal.memeqbody. This will allow to implement optimizations (e.g. for #29001) in a single function. Change-Id: Iaa34ddeb7068d92c35a8b4e581b7fd92da56535c Reviewed-on: https://go-review.googlesource.com/c/go/+/166677 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/vet/all/whitelist/arm.txt | 1 + src/internal/bytealg/equal_arm.s | 82 +++++++++++++++---------------- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/cmd/vet/all/whitelist/arm.txt b/src/cmd/vet/all/whitelist/arm.txt index 81a1f1831e..abcb38b003 100644 --- a/src/cmd/vet/all/whitelist/arm.txt +++ b/src/cmd/vet/all/whitelist/arm.txt @@ -12,3 +12,4 @@ runtime/tls_arm.s: [arm] load_g: function load_g missing Go declaration runtime/tls_arm.s: [arm] _initcgo: function _initcgo missing Go declaration runtime/internal/atomic/asm_arm.s: [arm] cas: function cas missing Go declaration +internal/bytealg/equal_arm.s: [arm] Equal: invalid MOVW of ret+24(FP); bool is 1-byte value diff --git a/src/internal/bytealg/equal_arm.s b/src/internal/bytealg/equal_arm.s index 0d23260945..d829f2bcdc 100644 --- a/src/internal/bytealg/equal_arm.s +++ b/src/internal/bytealg/equal_arm.s @@ -5,7 +5,6 @@ #include "go_asm.h" #include "textflag.h" -// TODO: share code with memequal? TEXT ·Equal(SB),NOSPLIT,$0-25 MOVW a_len+4(FP), R1 MOVW b_len+16(FP), R3 @@ -15,63 +14,60 @@ TEXT ·Equal(SB),NOSPLIT,$0-25 MOVW a_base+0(FP), R0 MOVW b_base+12(FP), R2 - ADD R0, R1 // end - -loop: - CMP R0, R1 - B.EQ equal // reached the end - MOVBU.P 1(R0), R4 - MOVBU.P 1(R2), R5 - CMP R4, R5 - B.EQ loop - + MOVW $ret+24(FP), R7 + B memeqbody<>(SB) notequal: MOVW $0, R0 MOVBU R0, ret+24(FP) RET -equal: - MOVW $1, R0 - MOVBU R0, ret+24(FP) - RET - // memequal(a, b unsafe.Pointer, size uintptr) bool TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-13 - MOVW a+0(FP), R1 + MOVW a+0(FP), R0 MOVW b+4(FP), R2 - MOVW size+8(FP), R3 - ADD R1, R3, R6 + CMP R0, R2 + B.EQ eq + MOVW size+8(FP), R1 + MOVW $ret+12(FP), R7 + B memeqbody<>(SB) +eq: MOVW $1, R0 MOVB R0, ret+12(FP) - CMP R1, R2 - RET.EQ -loop: - CMP R1, R6 - RET.EQ - MOVBU.P 1(R1), R4 - MOVBU.P 1(R2), R5 - CMP R4, R5 - BEQ loop - - MOVW $0, R0 - MOVB R0, ret+12(FP) RET // memequal_varlen(a, b unsafe.Pointer) bool -TEXT runtime·memequal_varlen(SB),NOSPLIT,$16-9 +TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-9 MOVW a+0(FP), R0 - MOVW b+4(FP), R1 - CMP R0, R1 - BEQ eq - MOVW 4(R7), R2 // compiler stores size at offset 4 in the closure - MOVW R0, 4(R13) - MOVW R1, 8(R13) - MOVW R2, 12(R13) - BL runtime·memequal(SB) - MOVB 16(R13), R0 - MOVB R0, ret+8(FP) - RET + MOVW b+4(FP), R2 + CMP R0, R2 + B.EQ eq + MOVW 4(R7), R1 // compiler stores size at offset 4 in the closure + MOVW $ret+8(FP), R7 + B memeqbody<>(SB) eq: MOVW $1, R0 MOVB R0, ret+8(FP) RET + +// Input: +// R0: data of a +// R1: length +// R2: data of b +// R7: points to return value +TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0 + ADD R0, R1 // end +loop: + CMP R0, R1 + B.EQ equal // reached the end + MOVBU.P 1(R0), R4 + MOVBU.P 1(R2), R5 + CMP R4, R5 + B.EQ loop +notequal: + MOVW $0, R0 + MOVB R0, (R7) + RET +equal: + MOVW $1, R0 + MOVB R0, (R7) + RET -- GitLab From ef891e1c8336243023abb1638a3225405d0e5d44 Mon Sep 17 00:00:00 2001 From: Brian Kessler Date: Thu, 31 Jan 2019 22:24:00 -0700 Subject: [PATCH 0406/1679] math/big: implement Int.TrailingZeroBits Implemented via the underlying nat.trailingZeroBits. Fixes #29578 Change-Id: If9876c5a74b107cbabceb7547bef4e44501f6745 Reviewed-on: https://go-review.googlesource.com/c/go/+/160681 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot --- src/math/big/int.go | 6 ++++++ src/math/big/int_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/math/big/int.go b/src/math/big/int.go index 8c1a54a9c6..eb0285c48f 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -448,6 +448,12 @@ func (x *Int) BitLen() int { return x.abs.bitLen() } +// TrailingZeroBits returns the number of consecutive least significant zero +// bits of |x|. +func (x *Int) TrailingZeroBits() uint { + return x.abs.trailingZeroBits() +} + // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z. // If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. // diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index 48d08d0e7e..2435b3610c 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -1335,6 +1335,31 @@ func TestBitSet(t *testing.T) { } } +var tzbTests = []struct { + in string + out uint +}{ + {"0", 0}, + {"1", 0}, + {"-1", 0}, + {"4", 2}, + {"-8", 3}, + {"0x4000000000000000000", 74}, + {"-0x8000000000000000000", 75}, +} + +func TestTrailingZeroBits(t *testing.T) { + for i, test := range tzbTests { + in, _ := new(Int).SetString(test.in, 0) + want := test.out + got := in.TrailingZeroBits() + + if got != want { + t.Errorf("#%d: got %v want %v", i, got, want) + } + } +} + func BenchmarkBitset(b *testing.B) { z := new(Int) z.SetBit(z, 512, 1) -- GitLab From a85afef27726b5870e02e50f8e210e0f16f89981 Mon Sep 17 00:00:00 2001 From: fanzha02 Date: Mon, 11 Mar 2019 03:51:06 +0000 Subject: [PATCH 0407/1679] cmd/compile: add handling for new floating-point comparisons flags The CL 164718 adds new condition flags for floating-point comparisons in arm64 backend, but dose not add the handling in rewrite.go for corresponding Ops, which causes issue 30679. And this CL fixes this issue. Fixes #30679 Change-Id: I8acc749f78227c3e9e74fa7938f05fb442fb62c6 Reviewed-on: https://go-review.googlesource.com/c/go/+/166579 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/rewrite.go | 16 ++++++++++++++++ test/fixedbugs/issue30679.go | 18 ++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 test/fixedbugs/issue30679.go diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index dbbb33c171..8165852263 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -730,6 +730,14 @@ func arm64Negate(op Op) Op { return OpARM64NotEqual case OpARM64NotEqual: return OpARM64Equal + case OpARM64LessThanF: + return OpARM64GreaterEqualF + case OpARM64GreaterThanF: + return OpARM64LessEqualF + case OpARM64LessEqualF: + return OpARM64GreaterThanF + case OpARM64GreaterEqualF: + return OpARM64LessThanF default: panic("unreachable") } @@ -762,6 +770,14 @@ func arm64Invert(op Op) Op { return OpARM64LessEqualU case OpARM64Equal, OpARM64NotEqual: return op + case OpARM64LessThanF: + return OpARM64GreaterThanF + case OpARM64GreaterThanF: + return OpARM64LessThanF + case OpARM64LessEqualF: + return OpARM64GreaterEqualF + case OpARM64GreaterEqualF: + return OpARM64LessEqualF default: panic("unreachable") } diff --git a/test/fixedbugs/issue30679.go b/test/fixedbugs/issue30679.go new file mode 100644 index 0000000000..4d0df18f45 --- /dev/null +++ b/test/fixedbugs/issue30679.go @@ -0,0 +1,18 @@ +// compile + +// Copyright 2019 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 main + +func main() { + var f float64 + var p, q *float64 + + p = &f + if *q > 0 { + p = q + } + _ = *p +} -- GitLab From 6c527aa58355b936fa173828139a3e245a3ddba6 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Mon, 11 Mar 2019 23:23:08 -0400 Subject: [PATCH 0408/1679] cmd/dist: revert mod=vendor change accidentally included in CL 164623 I thought I had removed all of the 'mod=vendor' hacks I had inserted previously, but apparently missed this one in a bad merge or rebase. Updates #30228 Change-Id: Ia5aea754bf986458373fefd08fa9dd3941e31e43 Reviewed-on: https://go-review.googlesource.com/c/go/+/167077 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/dist/build.go | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index c31d36acae..87739a510d 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -192,21 +192,6 @@ func xinit() { gogcflags = os.Getenv("BOOT_GO_GCFLAGS") - // Add -mod=vendor to GOFLAGS so that commands won't try to resolve go.mod - // files for vendored external modules. - // TODO(golang.org/issue/30240): If the vendor directory contains the go.mod - // files, this probably won't be necessary. - // TODO(golang.org/issue/26849): Escape spaces in GOFLAGS if needed. - goflags := strings.Fields(os.Getenv("GOFLAGS")) - for i, flag := range goflags { - if strings.HasPrefix(flag, "-mod=") { - goflags = append(goflags[0:i], goflags[i+1:]...) - break - } - } - goflags = append(goflags, "-mod=vendor") - os.Setenv("GOFLAGS", strings.Join(goflags, " ")) - cc, cxx := "gcc", "g++" if defaultclang { cc, cxx = "clang", "clang++" -- GitLab From 781da440912c095e61b9e5a95e5b068062b150a9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 00:26:24 -0400 Subject: [PATCH 0409/1679] cmd/dist: write and use a go.mod file in the bootstrap directory Updates #30228 Change-Id: Ica28525b31a8a787875c147e16274eba8f4dbffc Reviewed-on: https://go-review.googlesource.com/c/go/+/167078 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/dist/buildtool.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 71ed4ba8bc..2f2453fd12 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -131,6 +131,7 @@ func bootstrapBuildTools() { xmkdirall(base) // Copy source code into $GOROOT/pkg/bootstrap and rewrite import paths. + writefile("module bootstrap\n", pathf("%s/%s", base, "go.mod"), 0) for _, dir := range bootstrapDirs { src := pathf("%s/src/%s", goroot, dir) dst := pathf("%s/%s", base, dir) @@ -204,7 +205,7 @@ func bootstrapBuildTools() { cmd = append(cmd, "-toolexec="+tool) } cmd = append(cmd, "bootstrap/cmd/...") - run(workspace, ShowOutput|CheckExit, cmd...) + run(base, ShowOutput|CheckExit, cmd...) // Copy binaries into tool binary directory. for _, name := range bootstrapDirs { -- GitLab From d6891bd480b664afe4e2f4a0a0a72324943859f3 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 09:25:46 -0400 Subject: [PATCH 0410/1679] cmd/go: search the target for patterns when -mod=vendor is set This fixes the root cause of the bootstrap failure reported in https://groups.google.com/d/msg/golang-dev/xcVJDj5GJ84/U0pVnUOnBwAJ. Updates #30228 Change-Id: I9ce0898922a5aac1f61ceff30319cf88031676c4 Reviewed-on: https://go-review.googlesource.com/c/go/+/167079 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/search.go | 9 ++++++++- src/cmd/go/testdata/script/mod_vendor_build.txt | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 2e82b92cc5..2cd657326c 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -105,7 +105,14 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } if cfg.BuildMod == "vendor" { - walkPkgs(filepath.Join(ModRoot(), "vendor"), "", false) + if HasModRoot() { + modPrefix := Target.Path + if Target.Path == "std" { + modPrefix = "" + } + walkPkgs(ModRoot(), modPrefix, false) + walkPkgs(filepath.Join(ModRoot(), "vendor"), "", false) + } return pkgs } diff --git a/src/cmd/go/testdata/script/mod_vendor_build.txt b/src/cmd/go/testdata/script/mod_vendor_build.txt index 01ee2d202a..da3fd91055 100644 --- a/src/cmd/go/testdata/script/mod_vendor_build.txt +++ b/src/cmd/go/testdata/script/mod_vendor_build.txt @@ -25,6 +25,10 @@ env GOPROXY=off ! go list ... go list -mod=vendor ... +# However, it should still list packages in the main module. +go list -mod=vendor m/... +stdout m + -- go.mod -- module m -- GitLab From 10aede26d0603c16f6f66c87a84bccfeb2e0c8e0 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 12 Mar 2019 16:21:43 +0100 Subject: [PATCH 0411/1679] misc/android: fix detection of GOROOT tests strings.HasPrefix is not good enough to determine whether a path is a subdirectory of another because it does not respect path boundaries. filepath.Rel is good eonugh as long as we filter out results that use parent directories, "..". Hopefully fix the android emulator builders on the subrepositories. Change-Id: I17ee7e0028c0b0b26a6c5f67629f53c9a660c6e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167117 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- misc/android/go_android_exec.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index a662d28944..ee3f16ae3d 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -196,12 +196,10 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { if err != nil { return "", false, err } - if strings.HasPrefix(cwd, goroot) { - subdir, err := filepath.Rel(goroot, cwd) - if err != nil { - return "", false, err + if subdir, err := filepath.Rel(goroot, cwd); err == nil { + if !strings.Contains(subdir, "..") { + return subdir, true, nil } - return subdir, true, nil } for _, p := range filepath.SplitList(build.Default.GOPATH) { @@ -209,12 +207,10 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { if err != nil { return "", false, err } - if !strings.HasPrefix(cwd, pabs) { - continue - } - subdir, err := filepath.Rel(pabs, cwd) - if err == nil { - return subdir, false, nil + if subdir, err := filepath.Rel(pabs, cwd); err == nil { + if !strings.Contains(subdir, "..") { + return subdir, false, nil + } } } return "", false, fmt.Errorf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)", -- GitLab From 4b4f222a0dd8765e5b493d458fa352ea22045575 Mon Sep 17 00:00:00 2001 From: Ben Hoyt Date: Thu, 6 Dec 2018 08:53:29 -0500 Subject: [PATCH 0412/1679] bytes, strings: speed up TrimSpace 4-5x for common ASCII cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds a fast path for ASCII strings to both strings.TrimSpace and bytes.TrimSpace. It doesn't slow down the non-ASCII path much, if at all. I added benchmarks for strings.TrimSpace as it didn't have any, and I fleshed out the benchmarks for bytes.TrimSpace as it just had one case (for ASCII). The benchmarks (and the code!) are now the same between the two versions. Below are the benchmark results: strings.TrimSpace: name old time/op new time/op delta TrimSpace/NoTrim-8 18.6ns ± 0% 3.8ns ± 0% -79.53% (p=0.000 n=5+4) TrimSpace/ASCII-8 33.5ns ± 2% 6.0ns ± 3% -82.05% (p=0.008 n=5+5) TrimSpace/SomeNonASCII-8 97.1ns ± 1% 88.6ns ± 1% -8.68% (p=0.008 n=5+5) TrimSpace/JustNonASCII-8 144ns ± 0% 143ns ± 0% ~ (p=0.079 n=4+5) bytes.TrimSpace: name old time/op new time/op delta TrimSpace/NoTrim-8 18.9ns ± 1% 4.1ns ± 1% -78.34% (p=0.008 n=5+5) TrimSpace/ASCII-8 29.9ns ± 0% 6.3ns ± 1% -79.06% (p=0.008 n=5+5) TrimSpace/SomeNonASCII-8 91.5ns ± 0% 82.3ns ± 0% -10.03% (p=0.008 n=5+5) TrimSpace/JustNonASCII-8 150ns ± 0% 150ns ± 0% ~ (all equal) Fixes #29122 Change-Id: Ica45cd86a219cadf60173ec9db260133cd1d7951 Reviewed-on: https://go-review.googlesource.com/c/go/+/152917 Reviewed-by: Daniel Martí Reviewed-by: Brad Fitzpatrick Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- src/bytes/bytes.go | 31 ++++++++++++++++++++++++++++++- src/bytes/bytes_test.go | 18 +++++++++++++++--- src/strings/strings.go | 31 ++++++++++++++++++++++++++++++- src/strings/strings_test.go | 16 ++++++++++++++++ 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index 6fcebe6593..08fc14d837 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -759,7 +759,36 @@ func TrimRight(s []byte, cutset string) []byte { // TrimSpace returns a subslice of s by slicing off all leading and // trailing white space, as defined by Unicode. func TrimSpace(s []byte) []byte { - return TrimFunc(s, unicode.IsSpace) + // Fast path for ASCII: look for the first ASCII non-space byte + start := 0 + for ; start < len(s); start++ { + c := s[start] + if c >= utf8.RuneSelf { + // If we run into a non-ASCII byte, fall back to the + // slower unicode-aware method on the remaining bytes + return TrimFunc(s[start:], unicode.IsSpace) + } + if asciiSpace[c] == 0 { + break + } + } + + // Now look for the first ASCII non-space byte from the end + stop := len(s) + for ; stop > start; stop-- { + c := s[stop-1] + if c >= utf8.RuneSelf { + return TrimFunc(s[start:stop], unicode.IsSpace) + } + if asciiSpace[c] == 0 { + break + } + } + + // At this point s[start:stop] starts and ends with an ASCII + // non-space bytes, so we're done. Non-ASCII cases have already + // been handled above. + return s[start:stop] } // Runes interprets s as a sequence of UTF-8-encoded code points. diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index 80a54f6118..98ba95009d 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -1617,9 +1617,21 @@ func BenchmarkFieldsFunc(b *testing.B) { } func BenchmarkTrimSpace(b *testing.B) { - s := []byte(" Some text. \n") - for i := 0; i < b.N; i++ { - TrimSpace(s) + tests := []struct { + name string + input []byte + }{ + {"NoTrim", []byte("typical")}, + {"ASCII", []byte(" foo bar ")}, + {"SomeNonASCII", []byte(" \u2000\t\r\n x\t\t\r\r\ny\n \u3000 ")}, + {"JustNonASCII", []byte("\u2000\u2000\u2000☺☺☺☺\u3000\u3000\u3000")}, + } + for _, test := range tests { + b.Run(test.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + TrimSpace(test.input) + } + }) } } diff --git a/src/strings/strings.go b/src/strings/strings.go index a98f5d8ff1..e14fffb2b8 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -818,7 +818,36 @@ func TrimRight(s string, cutset string) string { // TrimSpace returns a slice of the string s, with all leading // and trailing white space removed, as defined by Unicode. func TrimSpace(s string) string { - return TrimFunc(s, unicode.IsSpace) + // Fast path for ASCII: look for the first ASCII non-space byte + start := 0 + for ; start < len(s); start++ { + c := s[start] + if c >= utf8.RuneSelf { + // If we run into a non-ASCII byte, fall back to the + // slower unicode-aware method on the remaining bytes + return TrimFunc(s[start:], unicode.IsSpace) + } + if asciiSpace[c] == 0 { + break + } + } + + // Now look for the first ASCII non-space byte from the end + stop := len(s) + for ; stop > start; stop-- { + c := s[stop-1] + if c >= utf8.RuneSelf { + return TrimFunc(s[start:stop], unicode.IsSpace) + } + if asciiSpace[c] == 0 { + break + } + } + + // At this point s[start:stop] starts and ends with an ASCII + // non-space bytes, so we're done. Non-ASCII cases have already + // been handled above. + return s[start:stop] } // TrimPrefix returns s without the provided leading prefix string. diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index eee2dd55df..500671aca4 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -1731,3 +1731,19 @@ func BenchmarkJoin(b *testing.B) { }) } } + +func BenchmarkTrimSpace(b *testing.B) { + tests := []struct{ name, input string }{ + {"NoTrim", "typical"}, + {"ASCII", " foo bar "}, + {"SomeNonASCII", " \u2000\t\r\n x\t\t\r\r\ny\n \u3000 "}, + {"JustNonASCII", "\u2000\u2000\u2000☺☺☺☺\u3000\u3000\u3000"}, + } + for _, test := range tests { + b.Run(test.name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + TrimSpace(test.input) + } + }) + } +} -- GitLab From a083648165a7facfeca6f37c023b4b069585acb0 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 4 Feb 2019 15:33:19 -0800 Subject: [PATCH 0413/1679] spec: document new Go2 number literals This CL documents the new binary and octal integer literals, hexadecimal floats, generalized imaginary literals and digit separators for all number literals in the spec. Added empty lines between abutting paragraphs in some places (a more thorough cleanup can be done in a separate CL). A minor detail: A single 0 was considered an octal zero per the syntax (decimal integer literals always started with a non-zero digit). The new octal literal syntax allows 0o and 0O prefixes and when keeping the respective octal_lit syntax symmetric with all the others (binary_lit, hex_lit), a single 0 is not automatically part of it anymore. Rather than complicating the new octal_lit syntax to include 0 as before, it is simpler (and more natural) to accept a single 0 as part of a decimal_lit. This is purely a notational change. R=Go1.13 Updates #12711. Updates #19308. Updates #28493. Updates #29008. Change-Id: Ib9fdc6e781f6031cceeed37aaed9d05c7141adec Reviewed-on: https://go-review.googlesource.com/c/go/+/161098 Reviewed-by: Rob Pike Reviewed-by: Ian Lance Taylor --- doc/go_spec.html | 154 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 126 insertions(+), 28 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index f3d2320d86..78ddcd5650 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -118,6 +118,7 @@ The underscore character _ (U+005F) is considered a letter.
 letter        = unicode_letter | "_" .
 decimal_digit = "0" … "9" .
+binary_digit  = "0" | "1" .
 octal_digit   = "0" … "7" .
 hex_digit     = "0" … "9" | "A" … "F" | "a" … "f" .
 
@@ -273,71 +274,156 @@ The following character sequences represent
operators

An integer literal is a sequence of digits representing an integer constant. -An optional prefix sets a non-decimal base: 0 for octal, 0x or -0X for hexadecimal. In hexadecimal literals, letters -a-f and A-F represent values 10 through 15. +An optional prefix sets a non-decimal base: 0b or 0B +for binary, 0, 0o, or 0O for octal, +and 0x or 0X for hexadecimal. +A single 0 is considered a decimal zero. +In hexadecimal literals, letters a through f +and A through F represent values 10 through 15. +

+ +

+For readability, an underscore character _ may appear after +a base prefix or between successive digits; such underscores do not change +the literal's value.

-int_lit     = decimal_lit | octal_lit | hex_lit .
-decimal_lit = ( "1" … "9" ) { decimal_digit } .
-octal_lit   = "0" { octal_digit } .
-hex_lit     = "0" ( "x" | "X" ) hex_digit { hex_digit } .
+int_lit        = decimal_lit | binary_lit | octal_lit | hex_lit .
+decimal_lit    = "0" | ( "1" … "9" ) [ [ "_" ] decimal_digits ] .
+binary_lit     = "0" ( "b" | "B" ) [ "_" ] binary_digits .
+octal_lit      = "0" [ "o" | "O" ] [ "_" ] octal_digits .
+hex_lit        = "0" ( "x" | "X" ) [ "_" ] hex_digits .
+
+decimal_digits = decimal_digit { [ "_" ] decimal_digit } .
+binary_digits  = binary_digit { [ "_" ] binary_digit } .
+octal_digits   = octal_digit { [ "_" ] octal_digit } .
+hex_digits     = hex_digit { [ "_" ] hex_digit } .
 
 42
+4_2
 0600
+0_600
+0o600
+0O600       // second character is capital letter 'O'
 0xBadFace
+0xBad_Face
+0x_67_7a_2f_cc_40_c6
 170141183460469231731687303715884105727
+170_141183_460469_231731_687303_715884_105727
+
+_42         // an identifier, not an integer literal
+42_         // invalid: _ must separate successive digits
+4__2        // invalid: only one _ at a time
+0_xBadFace  // invalid: _ must separate successive digits
 
+

Floating-point literals

+

-A floating-point literal is a decimal representation of a +A floating-point literal is a decimal or hexadecimal representation of a floating-point constant. -It has an integer part, a decimal point, a fractional part, -and an exponent part. The integer and fractional part comprise -decimal digits; the exponent part is an e or E -followed by an optionally signed decimal exponent. One of the -integer part or the fractional part may be elided; one of the decimal -point or the exponent may be elided.

+ +

+A decimal floating-point literal consists of an integer part (decimal digits), +a decimal point, a fractional part (decimal digits), and an exponent part +(e or E followed by an optional sign and decimal digits). +One of the integer part or the fractional part may be elided; one of the decimal point +or the exponent part may be elided. +An exponent value exp scales the mantissa (integer and fractional part) by 10exp. +

+ +

+A hexadecimal floating-point literal consists of a 0x or 0X +prefix, an integer part (hexadecimal digits), a radix point, a fractional part (hexadecimal digits), +and an exponent part (p or P followed by an optional sign and decimal digits). +One of the integer part or the fractional part may be elided; the radix point may be elided as well, +but the exponent part is required. (This syntax matches the one given in IEEE 754-2008 §5.12.3.) +An exponent value exp scales the mantissa (integer and fractional part) by 2exp. +

+ +

+For readability, an underscore character _ may appear after +a base prefix or between successive digits; such underscores do not change +the literal value. +

+
-float_lit = decimals "." [ decimals ] [ exponent ] |
-            decimals exponent |
-            "." decimals [ exponent ] .
-decimals  = decimal_digit { decimal_digit } .
-exponent  = ( "e" | "E" ) [ "+" | "-" ] decimals .
+float_lit         = decimal_float_lit | hex_float_lit .
+
+decimal_float_lit = decimal_digits "." [ decimal_digits ] [ decimal_exponent ] |
+                    decimal_digits decimal_exponent |
+                    "." decimal_digits [ decimal_exponent ] .
+decimal_exponent  = ( "e" | "E" ) [ "+" | "-" ] decimal_digits .
+
+hex_float_lit     = "0" ( "x" | "X" ) hex_mantissa hex_exponent .
+hex_mantissa      = [ "_" ] hex_digits "." [ hex_digits ] |
+                    [ "_" ] hex_digits |
+                    "." hex_digits .
+hex_exponent      = ( "p" | "P" ) [ "+" | "-" ] decimal_digits .
 
 0.
 72.40
-072.40  // == 72.40
+072.40       // == 72.40
 2.71828
 1.e+0
 6.67428e-11
 1E6
 .25
 .12345E+5
+1_5.         // == 15.0
+0.15e+0_2    // == 15.0
+
+0x1p-2       // == 0.25
+0x2.p10      // == 2048.0
+0x1.Fp+0     // == 1.9375
+0X.8p-0      // == 0.5
+0X_1FFFP-16  // == 0.1249847412109375
+0x15e-2      // == 0x15e - 2 (integer subtraction)
+
+0x.p1        // invalid: mantissa has no digits
+1p-2         // invalid: p exponent requires hexadecimal mantissa
+0x1.5e-2     // invalid: hexadecimal mantissa requires p exponent
+1_.5         // invalid: _ must separate successive digits
+1._5         // invalid: _ must separate successive digits
+1.5_e1       // invalid: _ must separate successive digits
+1.5e_1       // invalid: _ must separate successive digits
+1.5e1_       // invalid: _ must separate successive digits
 
+

Imaginary literals

+

-An imaginary literal is a decimal representation of the imaginary part of a +An imaginary literal represents the imaginary part of a complex constant. -It consists of a -floating-point literal -or decimal integer followed -by the lower-case letter i. +It consists of an integer or +floating-point literal +followed by the lower-case letter i. +The value of an imaginary literal is the value of the respective +integer or floating-point literal multiplied by the imaginary unit i.

+
-imaginary_lit = (decimals | float_lit) "i" .
+imaginary_lit = (decimal_digits | int_lit | float_lit) "i" .
 
+

+For backward compatibility, an imaginary literal's integer part consisting +entirely of decimal digits (and possibly underscores) is considered a decimal +integer, even if it starts with a leading 0. +

+
 0i
-011i  // == 11i
+0123i         // == 123i for backward-compatibility
+0o123i        // == 0o123 * 1i == 83i
+0xabci        // == 0xabc * 1i == 2748i
 0.i
 2.71828i
 1.e+0i
@@ -345,6 +431,7 @@ imaginary_lit = (decimals | float_lit) "i" .
 1E6i
 .25i
 .12345E+5i
+0x1p-2i       // == 0x1p-2 * 1i == 0.25i
 
@@ -361,6 +448,7 @@ of the character itself, while multi-character sequences beginning with a backslash encode values in various formats.

+

The simplest form represents the single character within the quotes; since Go source text is Unicode characters encoded in UTF-8, multiple @@ -370,6 +458,7 @@ a literal a, Unicode U+0061, value 0x61, while 'ä' holds two bytes (0xc3 0xa4) representing a literal a-dieresis, U+00E4, value 0xe4.

+

Several backslash escapes allow arbitrary values to be encoded as ASCII text. There are four ways to represent the integer value @@ -380,6 +469,7 @@ plain backslash \ followed by exactly three octal digits. In each case the value of the literal is the value represented by the digits in the corresponding base.

+

Although these representations all result in an integer, they have different valid ranges. Octal escapes must represent a value between @@ -388,9 +478,11 @@ by construction. The escapes \u and \U represent Unicode code points so within them some values are illegal, in particular those above 0x10FFFF and surrogate halves.

+

After a backslash, certain single-character escapes represent special values:

+
 \a   U+0007 alert or bell
 \b   U+0008 backspace
@@ -403,6 +495,7 @@ After a backslash, certain single-character escapes represent special values:
 \'   U+0027 single quote  (valid escape only within rune literals)
 \"   U+0022 double quote  (valid escape only within string literals)
 
+

All other sequences starting with a backslash are illegal inside rune literals.

@@ -446,6 +539,7 @@ A string literal represents a string constant obtained from concatenating a sequence of characters. There are two forms: raw string literals and interpreted string literals.

+

Raw string literals are character sequences between back quotes, as in `foo`. Within the quotes, any character may appear except @@ -457,6 +551,7 @@ contain newlines. Carriage return characters ('\r') inside raw string literals are discarded from the raw string value.

+

Interpreted string literals are character sequences between double quotes, as in "bar". @@ -596,6 +691,7 @@ precision in the language, a compiler may implement them using an internal representation with limited precision. That said, every implementation must:

+
  • Represent integer constants with at least 256 bits.
  • @@ -613,12 +709,14 @@ implementation must: represent a floating-point or complex constant due to limits on precision.
+

These requirements apply both to literal constants and to the result of evaluating constant expressions.

+

Variables

-- GitLab From 49448badb6367835b43aeb9cda3af44ff191bda7 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 14:41:09 -0400 Subject: [PATCH 0414/1679] cmd/internal/obj/x86: avoid os.Chdir in issue19518_test.go Chdir leaves the test in the wrong working directory if objdumpOutput calls t.Fatalf (or panics), and it isn't necessary here anyway. Set the Dir field on the commands instead. Change-Id: I9f0eb0d4f8d15043f1e13472126ca1a1ce4b7cb3 Reviewed-on: https://go-review.googlesource.com/c/go/+/167081 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/internal/obj/x86/issue19518_test.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/cmd/internal/obj/x86/issue19518_test.go b/src/cmd/internal/obj/x86/issue19518_test.go index 4a29285ff1..1b0fb4a8b1 100644 --- a/src/cmd/internal/obj/x86/issue19518_test.go +++ b/src/cmd/internal/obj/x86/issue19518_test.go @@ -32,10 +32,6 @@ func main() { ` func objdumpOutput(t *testing.T) []byte { - cwd, err := os.Getwd() - if err != nil { - t.Fatal(err) - } tmpdir, err := ioutil.TempDir("", "19518") if err != nil { t.Fatal(err) @@ -63,15 +59,13 @@ func objdumpOutput(t *testing.T) []byte { if err != nil { t.Fatal(err) } - err = os.Chdir(tmpdir) - if err != nil { - t.Fatal(err) - } + cmd := exec.Command( testenv.GoToolPath(t), "build", "-o", filepath.Join(tmpdir, "output")) cmd.Env = append(os.Environ(), "GOARCH=amd64", "GOOS=linux") + cmd.Dir = tmpdir out, err := cmd.CombinedOutput() if err != nil { @@ -81,14 +75,12 @@ func objdumpOutput(t *testing.T) []byte { testenv.GoToolPath(t), "tool", "objdump", "-s", "testASM", filepath.Join(tmpdir, "output")) cmd2.Env = cmd.Env + cmd2.Dir = tmpdir objout, err := cmd2.CombinedOutput() if err != nil { t.Fatalf("error %s output %s", err, objout) } - err = os.Chdir(cwd) - if err != nil { - t.Fatal(err) - } + return objout } -- GitLab From 334e7509179ba5ca2271ee028052dc1d34b21bcf Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 14:43:22 -0400 Subject: [PATCH 0415/1679] cmd: ensure that GOPATH is always valid in subprocesses that execute 'go build' GOPATH/pkg contains, among other things, the module cache (and associated lockfiles). Fixes #30776 Change-Id: I305cb3c0daab8cedd2e6ad235d4733f66af18723 Reviewed-on: https://go-review.googlesource.com/c/go/+/167082 Reviewed-by: Jay Conrod --- src/cmd/cover/cover_test.go | 1 + src/cmd/internal/obj/x86/issue19518_test.go | 3 ++- src/cmd/internal/obj/x86/obj6_test.go | 3 ++- src/cmd/link/link_test.go | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index f002442b63..cf8f3d2384 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -82,6 +82,7 @@ func TestMain(m *testing.M) { fmt.Fprintln(os.Stderr, err) os.Exit(1) } + os.Setenv("GOPATH", filepath.Join(dir, "_gopath")) testTempDir = dir diff --git a/src/cmd/internal/obj/x86/issue19518_test.go b/src/cmd/internal/obj/x86/issue19518_test.go index 1b0fb4a8b1..174e2dd846 100644 --- a/src/cmd/internal/obj/x86/issue19518_test.go +++ b/src/cmd/internal/obj/x86/issue19518_test.go @@ -64,7 +64,8 @@ func objdumpOutput(t *testing.T) []byte { testenv.GoToolPath(t), "build", "-o", filepath.Join(tmpdir, "output")) - cmd.Env = append(os.Environ(), "GOARCH=amd64", "GOOS=linux") + cmd.Env = append(os.Environ(), + "GOARCH=amd64", "GOOS=linux", "GOPATH="+filepath.Join(tmpdir, "_gopath")) cmd.Dir = tmpdir out, err := cmd.CombinedOutput() diff --git a/src/cmd/internal/obj/x86/obj6_test.go b/src/cmd/internal/obj/x86/obj6_test.go index c5399744f2..f9dd584569 100644 --- a/src/cmd/internal/obj/x86/obj6_test.go +++ b/src/cmd/internal/obj/x86/obj6_test.go @@ -99,7 +99,8 @@ func asmOutput(t *testing.T, s string) []byte { testenv.GoToolPath(t), "tool", "asm", "-S", "-dynlink", "-o", filepath.Join(tmpdir, "output.6"), tmpfile.Name()) - cmd.Env = append(os.Environ(), "GOARCH=amd64", "GOOS=linux") + cmd.Env = append(os.Environ(), + "GOARCH=amd64", "GOOS=linux", "GOPATH="+filepath.Join(tmpdir, "_gopath")) asmout, err := cmd.CombinedOutput() if err != nil { t.Fatalf("error %s output %s", err, asmout) diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index 5200c3a6f0..bcb3f2f58b 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -161,7 +161,8 @@ TEXT ·x(SB),0,$0 `) cmd := exec.Command(testenv.GoToolPath(t), "build") cmd.Dir = tmpdir - cmd.Env = append(os.Environ(), []string{"GOARCH=amd64", "GOOS=linux"}...) + cmd.Env = append(os.Environ(), + "GOARCH=amd64", "GOOS=linux", "GOPATH="+filepath.Join(tmpdir, "_gopath")) out, err := cmd.CombinedOutput() if err == nil { t.Fatalf("expected build to fail, but it succeeded") -- GitLab From fda1dc2939a245cae354fbac68a5c47d7b152c87 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Mon, 11 Mar 2019 11:39:25 +0530 Subject: [PATCH 0416/1679] cmd/go: document GOGCCFLAGS Fixes #30123 Change-Id: I310b89a344a262bb758d39dfdd485ed2940cc6aa Reviewed-on: https://go-review.googlesource.com/c/go/+/166577 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/alldocs.go | 2 ++ src/cmd/go/internal/help/helpdoc.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 33f6126ada..6e8d60f4cd 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1554,6 +1554,8 @@ // // GOEXE // The executable file name suffix (".exe" on Windows, "" on other systems). +// GOGCCFLAGS +// A space-separated list of arguments supplied to the CC command. // GOHOSTARCH // The architecture (GOARCH) of the Go toolchain binaries. // GOHOSTOS diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index 916b91efa7..a989483e60 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -587,6 +587,8 @@ Additional information available from 'go env' but not read from the environment GOEXE The executable file name suffix (".exe" on Windows, "" on other systems). + GOGCCFLAGS + A space-separated list of arguments supplied to the CC command. GOHOSTARCH The architecture (GOARCH) of the Go toolchain binaries. GOHOSTOS -- GitLab From 718fdd7b48d2a20c5a84a7b516ed29c98d61e359 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 15:42:45 -0400 Subject: [PATCH 0417/1679] cmd/go/internal/cfg: remove unused Gopath variable Change-Id: Ib268157674824fd7552d3c36a61eccf8c720eaeb Reviewed-on: https://go-review.googlesource.com/c/go/+/167083 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/cfg/cfg.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 325e7d50af..31c1fb84ef 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -73,7 +73,6 @@ var ( Goarch = BuildContext.GOARCH Goos = BuildContext.GOOS ExeSuffix string - Gopath = filepath.SplitList(BuildContext.GOPATH) // ModulesEnabled specifies whether the go command is running // in module-aware mode (as opposed to GOPATH mode). -- GitLab From f54b8909ac93637159e2661f25aef5e61e8cd8fc Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 09:27:27 -0400 Subject: [PATCH 0418/1679] cmd/go/internal/modload: treat a 'std' module outside GOROOT/src as an ordinary module Fixes #30756 Change-Id: I046d43df56faac8fc09d53dc1e87a014dd6d530b Reviewed-on: https://go-review.googlesource.com/c/go/+/167080 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/import.go | 25 +++++--------- src/cmd/go/internal/modload/init.go | 20 ++++++++--- src/cmd/go/internal/modload/load.go | 34 ++++++++----------- src/cmd/go/internal/modload/query.go | 2 +- src/cmd/go/internal/modload/search.go | 16 +++------ src/cmd/go/testdata/script/mod_alt_goroot.txt | 20 +++++++++++ 6 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_alt_goroot.txt diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index fdce9d43e0..db3e1a9e5b 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -61,30 +61,21 @@ func Import(path string) (m module.Version, dir string, err error) { } // Is the package in the standard library? - if search.IsStandardImportPath(path) { - if goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) { - dir := filepath.Join(cfg.GOROOT, "src", path) - - // If the main module is in the standard library, attribute its packages - // to that module. - switch Target.Path { - case "cmd": - if strings.HasPrefix(path, "cmd") { - return Target, dir, nil - } - case "std": - if !strings.HasPrefix(path, "cmd") { - return Target, dir, nil - } + if search.IsStandardImportPath(path) && + goroot.IsStandardPackage(cfg.GOROOT, cfg.BuildContext.Compiler, path) { + if targetInGorootSrc { + if dir, ok := dirInModule(path, targetPrefix, ModRoot(), true); ok { + return Target, dir, nil } - return module.Version{}, dir, nil } + dir := filepath.Join(cfg.GOROOT, "src", path) + return module.Version{}, dir, nil } // -mod=vendor is special. // Everything must be in the main module or the main module's vendor directory. if cfg.BuildMod == "vendor" { - mainDir, mainOK := dirInModule(path, Target.Path, ModRoot(), true) + mainDir, mainOK := dirInModule(path, targetPrefix, ModRoot(), true) vendorDir, vendorOK := dirInModule(path, "", filepath.Join(ModRoot(), "vendor"), false) if mainOK && vendorOK { return module.Version{}, "", fmt.Errorf("ambiguous import: found %s in multiple directories:\n\t%s\n\t%s", path, mainDir, vendorDir) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 0970ccf2d6..a93692579c 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -18,7 +18,6 @@ import ( "cmd/go/internal/mvs" "cmd/go/internal/renameio" "cmd/go/internal/search" - "cmd/go/internal/str" "encoding/json" "fmt" "go/build" @@ -43,6 +42,15 @@ var ( excluded map[module.Version]bool Target module.Version + // targetPrefix is the path prefix for packages in Target, without a trailing + // slash. For most modules, targetPrefix is just Target.Path, but the + // standard-library module "std" has an empty prefix. + targetPrefix string + + // targetInGorootSrc caches whether modRoot is within GOROOT/src. + // The "std" module is special within GOROOT/src, but not otherwise. + targetInGorootSrc bool + gopath string CmdModInit bool // running 'go mod init' @@ -329,6 +337,7 @@ func InitMod() { Init() if modRoot == "" { Target = module.Version{Path: "command-line-arguments"} + targetPrefix = "command-line-arguments" buildList = []module.Version{Target} return } @@ -381,9 +390,12 @@ func InitMod() { // modFileToBuildList initializes buildList from the modFile. func modFileToBuildList() { Target = modFile.Module.Mod - if (str.HasPathPrefix(Target.Path, "std") || str.HasPathPrefix(Target.Path, "cmd")) && - search.InDir(cwd, cfg.GOROOTsrc) == "" { - base.Fatalf("go: reserved module path %s not allow outside of GOROOT/src", Target.Path) + targetPrefix = Target.Path + if search.InDir(cwd, cfg.GOROOTsrc) != "" { + targetInGorootSrc = true + if Target.Path == "std" { + targetPrefix = "" + } } list := []module.Version{Target} diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 205754546c..33b53052d8 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -111,7 +111,7 @@ func ImportPaths(patterns []string) []*search.Match { if strings.HasPrefix(suffix, "/vendor/") { // TODO getmode vendor check pkg = strings.TrimPrefix(suffix, "/vendor/") - } else if Target.Path == "std" { + } else if targetInGorootSrc && Target.Path == "std" { // Don't add the prefix "std/" to packages in the "std" module. // It's the one module path that isn't a prefix of its packages. pkg = strings.TrimPrefix(suffix, "/") @@ -270,14 +270,14 @@ func DirImportPath(dir string) string { } if dir == modRoot { - return Target.Path + return targetPrefix } if strings.HasPrefix(dir, modRoot+string(filepath.Separator)) { suffix := filepath.ToSlash(dir[len(modRoot):]) if strings.HasPrefix(suffix, "/vendor/") { return strings.TrimPrefix(suffix, "/vendor/") } - return Target.Path + suffix + return targetPrefix + suffix } return "." } @@ -474,14 +474,10 @@ func newLoader() *loader { ld.tags = imports.Tags() ld.testRoots = LoadTests - switch Target.Path { - case "std", "cmd": - // Inside the "std" and "cmd" modules, we prefer to use the vendor directory - // unless the command explicitly changes the module graph. - // TODO(golang.org/issue/30240): Remove this special case. - if cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ") { - ld.forceStdVendor = true - } + // Inside the "std" and "cmd" modules, we prefer to use the vendor directory + // unless the command explicitly changes the module graph. + if !targetInGorootSrc || (cfg.CmdName != "get" && !strings.HasPrefix(cfg.CmdName, "mod ")) { + ld.forceStdVendor = true } return ld @@ -680,13 +676,14 @@ func (ld *loader) stdVendor(parentPath, path string) string { return path } - if str.HasPathPrefix(parentPath, "cmd") && (Target.Path != "cmd" || ld.forceStdVendor) { - vendorPath := pathpkg.Join("cmd", "vendor", path) - if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { - return vendorPath + if str.HasPathPrefix(parentPath, "cmd") { + if ld.forceStdVendor || Target.Path != "cmd" { + vendorPath := pathpkg.Join("cmd", "vendor", path) + if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { + return vendorPath + } } - } - if Target.Path != "std" || ld.forceStdVendor { + } else if ld.forceStdVendor || Target.Path != "std" { vendorPath := pathpkg.Join("vendor", path) if _, err := os.Stat(filepath.Join(cfg.GOROOTsrc, filepath.FromSlash(vendorPath))); err == nil { return vendorPath @@ -987,8 +984,7 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { return vendorList, nil } - switch Target.Path { - case "std", "cmd": + if targetInGorootSrc { // When inside "std" or "cmd", only fetch and read go.mod files if we're // explicitly running a command that can change the module graph. If we have // to resolve a new dependency, we might pick the wrong version, but 'go mod diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 3a1ea863b0..30bdc4dc7d 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -216,7 +216,7 @@ func matchSemverPrefix(p, v string) bool { // QueryPackage returns Target as the version. func QueryPackage(path, query string, allowed func(module.Version) bool) (module.Version, *modfetch.RevInfo, error) { if HasModRoot() { - if _, ok := dirInModule(path, Target.Path, modRoot, true); ok { + if _, ok := dirInModule(path, targetPrefix, modRoot, true); ok { if query != "latest" { return module.Version{}, nil, fmt.Errorf("can't query specific version (%q) for package %s in the main module (%s)", query, path, Target.Path) } diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 2cd657326c..753b3be6de 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -106,11 +106,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] if cfg.BuildMod == "vendor" { if HasModRoot() { - modPrefix := Target.Path - if Target.Path == "std" { - modPrefix = "" - } - walkPkgs(ModRoot(), modPrefix, false) + walkPkgs(ModRoot(), targetPrefix, false) walkPkgs(filepath.Join(ModRoot(), "vendor"), "", false) } return pkgs @@ -120,12 +116,13 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] if !treeCanMatch(mod.Path) { continue } - var root string - if mod.Version == "" { + var root, modPrefix string + if mod == Target { if !HasModRoot() { continue // If there is no main module, we can't search in it. } root = ModRoot() + modPrefix = targetPrefix } else { var err error root, _, err = fetch(mod) @@ -133,10 +130,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] base.Errorf("go: %v", err) continue } - } - modPrefix := mod.Path - if mod.Path == "std" { - modPrefix = "" + modPrefix = mod.Path } walkPkgs(root, modPrefix, false) } diff --git a/src/cmd/go/testdata/script/mod_alt_goroot.txt b/src/cmd/go/testdata/script/mod_alt_goroot.txt new file mode 100644 index 0000000000..32f94c5303 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_alt_goroot.txt @@ -0,0 +1,20 @@ +env GO111MODULE=on + +# If the working directory is a different GOROOT, then the 'std' module should be +# treated as an ordinary module (with an ordinary module prefix). +# It should not override packages in GOROOT, but should not fail the command. +# See golang.org/issue/30756. +go list -e -deps -f '{{.ImportPath}} {{.Dir}}' ./bytes +stdout ^std/bytes.*$PWD[/\\]bytes +stdout '^bytes/modified' + +-- go.mod -- +module std + +go 1.12 +-- bytes/bytes.go -- +package bytes + +import _"bytes/modified" +-- bytes/modified/modified.go -- +package modified -- GitLab From 53948127d32cd8ab2d67941542122491a9cd22c9 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 17 Dec 2018 17:12:00 -0800 Subject: [PATCH 0419/1679] cmd/compile: make rulegen magic variable prediction more precise The sheer length of the generated rules files makes my editor and git client unhappy. This change is a small step towards shortening them. We recognize a few magic variables during rulegen: b, config, fe, typ. Of these, only b appears prone to false positives. By tightening the heuristic and fixing one case in MIPS.rules, we can make the heuristic enough that it has no failures. That allows us to remove the hedge assignments to _, removing 3000 pointless lines of code. Change-Id: I080cde5db28c8277cb3fd9ddcd829306c9a27785 Reviewed-on: https://go-review.googlesource.com/c/go/+/166979 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/MIPS.rules | 2 +- src/cmd/compile/internal/ssa/gen/rulegen.go | 13 +- src/cmd/compile/internal/ssa/rewrite386.go | 256 ----------- src/cmd/compile/internal/ssa/rewriteAMD64.go | 427 ------------------ src/cmd/compile/internal/ssa/rewriteARM.go | 287 ------------ src/cmd/compile/internal/ssa/rewriteARM64.go | 348 -------------- src/cmd/compile/internal/ssa/rewriteMIPS.go | 212 +-------- src/cmd/compile/internal/ssa/rewriteMIPS64.go | 258 ----------- src/cmd/compile/internal/ssa/rewritePPC64.go | 321 ------------- src/cmd/compile/internal/ssa/rewriteS390X.go | 375 --------------- src/cmd/compile/internal/ssa/rewriteWasm.go | 268 ----------- src/cmd/compile/internal/ssa/rewritedec.go | 8 - src/cmd/compile/internal/ssa/rewritedec64.go | 105 ----- .../compile/internal/ssa/rewritedecArgs.go | 6 - .../compile/internal/ssa/rewritegeneric.go | 206 --------- 15 files changed, 11 insertions(+), 3081 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/MIPS.rules b/src/cmd/compile/internal/ssa/gen/MIPS.rules index db9c5bc638..bd218b494f 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS.rules +++ b/src/cmd/compile/internal/ssa/gen/MIPS.rules @@ -688,7 +688,7 @@ (GEZ (MOVWconst [c]) yes no) && int32(c) < 0 -> (First nil no yes) // conditional move -(CMOVZ _ b (MOVWconst [0])) -> b +(CMOVZ _ f (MOVWconst [0])) -> f (CMOVZ a _ (MOVWconst [c])) && c!=0 -> a (CMOVZzero _ (MOVWconst [0])) -> (MOVWconst [0]) (CMOVZzero a (MOVWconst [c])) && c!=0 -> a diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index d280688a0a..6762d1cd3f 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -238,29 +238,23 @@ func genRules(arch arch) { } body := buf.String() - // Do a rough match to predict whether we need b, config, fe, and/or types. - // It's not precise--thus the blank assignments--but it's good enough - // to avoid generating needless code and doing pointless nil checks. - hasb := strings.Contains(body, "b.") + // Figure out whether we need b, config, fe, and/or types; provide them if so. + hasb := strings.Contains(body, " b.") hasconfig := strings.Contains(body, "config.") || strings.Contains(body, "config)") hasfe := strings.Contains(body, "fe.") hastyps := strings.Contains(body, "typ.") fmt.Fprintf(w, "func rewriteValue%s_%s_%d(v *Value) bool {\n", arch.name, op, chunk) if hasb || hasconfig || hasfe || hastyps { fmt.Fprintln(w, "b := v.Block") - fmt.Fprintln(w, "_ = b") } if hasconfig { fmt.Fprintln(w, "config := b.Func.Config") - fmt.Fprintln(w, "_ = config") } if hasfe { fmt.Fprintln(w, "fe := b.Func.fe") - fmt.Fprintln(w, "_ = fe") } if hastyps { fmt.Fprintln(w, "typ := &b.Func.Config.Types") - fmt.Fprintln(w, "_ = typ") } fmt.Fprint(w, body) fmt.Fprintf(w, "}\n") @@ -507,6 +501,9 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t // autogenerated name argname = fmt.Sprintf("%s_%d", v, i) } + if argname == "b" { + log.Fatalf("don't name args 'b', it is ambiguous with blocks") + } fmt.Fprintf(w, "%s := %s.Args[%d]\n", argname, v, i) argPos, argCanFail := genMatch0(w, arch, arg, argname, m, false, loc) if argPos != "" { diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index 75b6de8055..422a8b42fa 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -1659,9 +1659,7 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { } func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ADDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) @@ -1715,9 +1713,7 @@ func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { } func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ADDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) @@ -1801,9 +1797,7 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386ADDLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDLload [off1+off2] {sym} val base mem) @@ -1891,9 +1885,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { } func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (ADDLloadidx4 [off1+off2] {sym} val base idx mem) @@ -1983,9 +1975,7 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) // cond: is32Bit(off1+off2) // result: (ADDLmodify [off1+off2] {sym} base val mem) @@ -2043,9 +2033,7 @@ func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { } func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) // cond: is32Bit(off1+off2) // result: (ADDLmodifyidx4 [off1+off2] {sym} base idx val mem) @@ -2161,9 +2149,7 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386ADDSD_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDSD x l:(MOVSDload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (ADDSDload x [off] {sym} ptr mem) @@ -2220,9 +2206,7 @@ func rewriteValue386_Op386ADDSD_0(v *Value) bool { } func rewriteValue386_Op386ADDSDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDSDload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDSDload [off1+off2] {sym} val base mem) @@ -2280,9 +2264,7 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { } func rewriteValue386_Op386ADDSS_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDSS x l:(MOVSSload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (ADDSSload x [off] {sym} ptr mem) @@ -2339,9 +2321,7 @@ func rewriteValue386_Op386ADDSS_0(v *Value) bool { } func rewriteValue386_Op386ADDSSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ADDSSload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDSSload [off1+off2] {sym} val base mem) @@ -2615,9 +2595,7 @@ func rewriteValue386_Op386ANDLconst_0(v *Value) bool { } func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ANDLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) @@ -2671,9 +2649,7 @@ func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { } func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ANDLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) @@ -2757,9 +2733,7 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386ANDLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ANDLload [off1+off2] {sym} val base mem) @@ -2847,9 +2821,7 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { } func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (ANDLloadidx4 [off1+off2] {sym} val base idx mem) @@ -2939,9 +2911,7 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLmodify [off1] {sym} (ADDLconst [off2] base) val mem) // cond: is32Bit(off1+off2) // result: (ANDLmodify [off1+off2] {sym} base val mem) @@ -2999,9 +2969,7 @@ func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { } func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) // cond: is32Bit(off1+off2) // result: (ANDLmodifyidx4 [off1+off2] {sym} base idx val mem) @@ -3117,7 +3085,6 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386CMPB_0(v *Value) bool { b := v.Block - _ = b // match: (CMPB x (MOVLconst [c])) // cond: // result: (CMPBconst x [int64(int8(c))]) @@ -3210,7 +3177,6 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { } func rewriteValue386_Op386CMPBconst_0(v *Value) bool { b := v.Block - _ = b // match: (CMPBconst (MOVLconst [x]) [y]) // cond: int8(x)==int8(y) // result: (FlagEQ) @@ -3421,7 +3387,6 @@ func rewriteValue386_Op386CMPBload_0(v *Value) bool { } func rewriteValue386_Op386CMPL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPL x (MOVLconst [c])) // cond: // result: (CMPLconst x [c]) @@ -3685,7 +3650,6 @@ func rewriteValue386_Op386CMPLconst_0(v *Value) bool { } func rewriteValue386_Op386CMPLconst_10(v *Value) bool { b := v.Block - _ = b // match: (CMPLconst l:(MOVLload {sym} [off] ptr mem) [c]) // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) // result: @l.Block (CMPLconstload {sym} [makeValAndOff(c,off)] ptr mem) @@ -3744,7 +3708,6 @@ func rewriteValue386_Op386CMPLload_0(v *Value) bool { } func rewriteValue386_Op386CMPW_0(v *Value) bool { b := v.Block - _ = b // match: (CMPW x (MOVLconst [c])) // cond: // result: (CMPWconst x [int64(int16(c))]) @@ -3837,7 +3800,6 @@ func rewriteValue386_Op386CMPW_0(v *Value) bool { } func rewriteValue386_Op386CMPWconst_0(v *Value) bool { b := v.Block - _ = b // match: (CMPWconst (MOVLconst [x]) [y]) // cond: int16(x)==int16(y) // result: (FlagEQ) @@ -4048,9 +4010,7 @@ func rewriteValue386_Op386CMPWload_0(v *Value) bool { } func rewriteValue386_Op386DIVSD_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (DIVSD x l:(MOVSDload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (DIVSDload x [off] {sym} ptr mem) @@ -4081,9 +4041,7 @@ func rewriteValue386_Op386DIVSD_0(v *Value) bool { } func rewriteValue386_Op386DIVSDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (DIVSDload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (DIVSDload [off1+off2] {sym} val base mem) @@ -4141,9 +4099,7 @@ func rewriteValue386_Op386DIVSDload_0(v *Value) bool { } func rewriteValue386_Op386DIVSS_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (DIVSS x l:(MOVSSload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (DIVSSload x [off] {sym} ptr mem) @@ -4174,9 +4130,7 @@ func rewriteValue386_Op386DIVSS_0(v *Value) bool { } func rewriteValue386_Op386DIVSSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (DIVSSload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (DIVSSload [off1+off2] {sym} val base mem) @@ -4939,7 +4893,6 @@ func rewriteValue386_Op386LEAL8_0(v *Value) bool { } func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBLSX x:(MOVBload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBLSXload [off] {sym} ptr mem) @@ -4988,9 +4941,7 @@ func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { } func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBLSXload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVBLSX x) @@ -5044,7 +4995,6 @@ func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { } func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBLZX x:(MOVBload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBload [off] {sym} ptr mem) @@ -5118,9 +5068,7 @@ func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { } func rewriteValue386_Op386MOVBload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBload [off] {sym} ptr (MOVBstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVBLZX x) @@ -5365,9 +5313,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { } func rewriteValue386_Op386MOVBstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBstore [off] {sym} ptr (MOVBLSX x) mem) // cond: // result: (MOVBstore [off] {sym} ptr x mem) @@ -5784,9 +5730,7 @@ func rewriteValue386_Op386MOVBstore_10(v *Value) bool { } func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBstoreconst [sc] {s} (ADDLconst [off] ptr) mem) // cond: ValAndOff(sc).canAdd(off) // result: (MOVBstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -7167,9 +7111,7 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { } func rewriteValue386_Op386MOVLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVLload [off] {sym} ptr (MOVLstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: x @@ -7542,9 +7484,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386MOVLstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVLstore [off1] {sym} (ADDLconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) // result: (MOVLstore [off1+off2] {sym} ptr val mem) @@ -8423,9 +8363,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { } func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVLstoreconst [sc] {s} (ADDLconst [off] ptr) mem) // cond: ValAndOff(sc).canAdd(off) // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -9682,11 +9620,8 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { } func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (MOVSDconst [c]) // cond: config.ctxt.Flag_shared // result: (MOVSDconst2 (MOVSDconst1 [c])) @@ -9705,9 +9640,7 @@ func rewriteValue386_Op386MOVSDconst_0(v *Value) bool { } func rewriteValue386_Op386MOVSDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVSDload [off1] {sym} (ADDLconst [off2] ptr) mem) // cond: is32Bit(off1+off2) // result: (MOVSDload [off1+off2] {sym} ptr mem) @@ -9941,9 +9874,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { } func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVSDstore [off1] {sym} (ADDLconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) // result: (MOVSDstore [off1+off2] {sym} ptr val mem) @@ -10195,11 +10126,8 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { } func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (MOVSSconst [c]) // cond: config.ctxt.Flag_shared // result: (MOVSSconst2 (MOVSSconst1 [c])) @@ -10218,9 +10146,7 @@ func rewriteValue386_Op386MOVSSconst_0(v *Value) bool { } func rewriteValue386_Op386MOVSSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVSSload [off1] {sym} (ADDLconst [off2] ptr) mem) // cond: is32Bit(off1+off2) // result: (MOVSSload [off1+off2] {sym} ptr mem) @@ -10454,9 +10380,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { } func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVSSstore [off1] {sym} (ADDLconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) // result: (MOVSSstore [off1+off2] {sym} ptr val mem) @@ -10708,7 +10632,6 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { } func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWLSX x:(MOVWload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWLSXload [off] {sym} ptr mem) @@ -10757,9 +10680,7 @@ func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { } func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWLSXload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVWLSX x) @@ -10813,7 +10734,6 @@ func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { } func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWLZX x:(MOVWload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWload [off] {sym} ptr mem) @@ -10915,9 +10835,7 @@ func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { } func rewriteValue386_Op386MOVWload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVWLZX x) @@ -11289,9 +11207,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { } func rewriteValue386_Op386MOVWstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWstore [off] {sym} ptr (MOVWLSX x) mem) // cond: // result: (MOVWstore [off] {sym} ptr x mem) @@ -11600,9 +11516,7 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { } func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWstoreconst [sc] {s} (ADDLconst [off] ptr) mem) // cond: ValAndOff(sc).canAdd(off) // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -11907,7 +11821,6 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { } func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWstoreconstidx2 [x] {sym} (ADDLconst [c] ptr) idx mem) // cond: // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) @@ -12577,7 +12490,6 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { } func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWstoreidx2 [c] {sym} (ADDLconst [d] ptr) idx val mem) // cond: // result: (MOVWstoreidx2 [int64(int32(c+d))] {sym} ptr idx val mem) @@ -12886,7 +12798,6 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { } func rewriteValue386_Op386MULLconst_0(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [c] (MULLconst [d] x)) // cond: // result: (MULLconst [int64(int32(c * d))] x) @@ -13030,7 +12941,6 @@ func rewriteValue386_Op386MULLconst_0(v *Value) bool { } func rewriteValue386_Op386MULLconst_10(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [9] x) // cond: // result: (LEAL8 x x) @@ -13198,7 +13108,6 @@ func rewriteValue386_Op386MULLconst_10(v *Value) bool { } func rewriteValue386_Op386MULLconst_20(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [73] x) // cond: // result: (LEAL8 x (LEAL8 x x)) @@ -13391,9 +13300,7 @@ func rewriteValue386_Op386MULLconst_30(v *Value) bool { } func rewriteValue386_Op386MULLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (MULLload [off1+off2] {sym} val base mem) @@ -13481,9 +13388,7 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { } func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (MULLloadidx4 [off1+off2] {sym} val base idx mem) @@ -13573,9 +13478,7 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386MULSD_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULSD x l:(MOVSDload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (MULSDload x [off] {sym} ptr mem) @@ -13632,9 +13535,7 @@ func rewriteValue386_Op386MULSD_0(v *Value) bool { } func rewriteValue386_Op386MULSDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULSDload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (MULSDload [off1+off2] {sym} val base mem) @@ -13692,9 +13593,7 @@ func rewriteValue386_Op386MULSDload_0(v *Value) bool { } func rewriteValue386_Op386MULSS_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULSS x l:(MOVSSload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (MULSSload x [off] {sym} ptr mem) @@ -13751,9 +13650,7 @@ func rewriteValue386_Op386MULSS_0(v *Value) bool { } func rewriteValue386_Op386MULSSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MULSSload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (MULSSload [off1+off2] {sym} val base mem) @@ -14096,9 +13993,7 @@ func rewriteValue386_Op386ORL_0(v *Value) bool { } func rewriteValue386_Op386ORL_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL x l:(MOVLloadidx4 [off] {sym} ptr idx mem)) // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ORLloadidx4 x [off] {sym} ptr idx mem) @@ -14629,7 +14524,6 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } func rewriteValue386_Op386ORL_20(v *Value) bool { b := v.Block - _ = b // match: (ORL x0:(MOVBloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) // cond: i1==i0+1 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) @@ -15264,7 +15158,6 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } func rewriteValue386_Op386ORL_30(v *Value) bool { b := v.Block - _ = b // match: (ORL o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem))) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} p idx mem))) // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) @@ -16109,7 +16002,6 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } func rewriteValue386_Op386ORL_40(v *Value) bool { b := v.Block - _ = b // match: (ORL o0:(ORL s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)) x0:(MOVWloadidx1 [i0] {s} p idx mem)) s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem))) // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) @@ -16954,7 +16846,6 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } func rewriteValue386_Op386ORL_50(v *Value) bool { b := v.Block - _ = b // match: (ORL s1:(SHLLconst [24] x2:(MOVBloadidx1 [i3] {s} idx p mem)) o0:(ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) s0:(SHLLconst [16] x1:(MOVBloadidx1 [i2] {s} idx p mem)))) // cond: i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && o0.Uses == 1 && mergePoint(b,x0,x1,x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (MOVLloadidx1 [i0] {s} p idx mem) @@ -17758,9 +17649,7 @@ func rewriteValue386_Op386ORLconst_0(v *Value) bool { } func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) @@ -17814,9 +17703,7 @@ func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { } func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (ORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) @@ -17900,9 +17787,7 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386ORLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ORLload [off1+off2] {sym} val base mem) @@ -17990,9 +17875,7 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { } func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (ORLloadidx4 [off1+off2] {sym} val base idx mem) @@ -18082,9 +17965,7 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386ORLmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLmodify [off1] {sym} (ADDLconst [off2] base) val mem) // cond: is32Bit(off1+off2) // result: (ORLmodify [off1+off2] {sym} base val mem) @@ -18142,9 +18023,7 @@ func rewriteValue386_Op386ORLmodify_0(v *Value) bool { } func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) // cond: is32Bit(off1+off2) // result: (ORLmodifyidx4 [off1+off2] {sym} base idx val mem) @@ -19584,7 +19463,6 @@ func rewriteValue386_Op386SHRWconst_0(v *Value) bool { } func rewriteValue386_Op386SUBL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBL x (MOVLconst [c])) // cond: // result: (SUBLconst x [c]) @@ -19736,9 +19614,7 @@ func rewriteValue386_Op386SUBLconst_0(v *Value) bool { } func rewriteValue386_Op386SUBLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBLload [off1+off2] {sym} val base mem) @@ -19826,9 +19702,7 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { } func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (SUBLloadidx4 [off1+off2] {sym} val base idx mem) @@ -19918,9 +19792,7 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBLmodify [off1] {sym} (ADDLconst [off2] base) val mem) // cond: is32Bit(off1+off2) // result: (SUBLmodify [off1+off2] {sym} base val mem) @@ -19978,9 +19850,7 @@ func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { } func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) // cond: is32Bit(off1+off2) // result: (SUBLmodifyidx4 [off1+off2] {sym} base idx val mem) @@ -20096,9 +19966,7 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386SUBSD_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBSD x l:(MOVSDload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (SUBSDload x [off] {sym} ptr mem) @@ -20129,9 +19997,7 @@ func rewriteValue386_Op386SUBSD_0(v *Value) bool { } func rewriteValue386_Op386SUBSDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBSDload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBSDload [off1+off2] {sym} val base mem) @@ -20189,9 +20055,7 @@ func rewriteValue386_Op386SUBSDload_0(v *Value) bool { } func rewriteValue386_Op386SUBSS_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBSS x l:(MOVSSload [off] {sym} ptr mem)) // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (SUBSSload x [off] {sym} ptr mem) @@ -20222,9 +20086,7 @@ func rewriteValue386_Op386SUBSS_0(v *Value) bool { } func rewriteValue386_Op386SUBSSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SUBSSload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBSSload [off1+off2] {sym} val base mem) @@ -20654,9 +20516,7 @@ func rewriteValue386_Op386XORLconst_0(v *Value) bool { } func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLconstmodify [valoff1] {sym} (ADDLconst [off2] base) mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (XORLconstmodify [ValAndOff(valoff1).add(off2)] {sym} base mem) @@ -20710,9 +20570,7 @@ func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { } func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLconstmodifyidx4 [valoff1] {sym} (ADDLconst [off2] base) idx mem) // cond: ValAndOff(valoff1).canAdd(off2) // result: (XORLconstmodifyidx4 [ValAndOff(valoff1).add(off2)] {sym} base idx mem) @@ -20796,9 +20654,7 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { } func rewriteValue386_Op386XORLload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLload [off1] {sym} val (ADDLconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (XORLload [off1+off2] {sym} val base mem) @@ -20886,9 +20742,7 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { } func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLloadidx4 [off1] {sym} val (ADDLconst [off2] base) idx mem) // cond: is32Bit(off1+off2) // result: (XORLloadidx4 [off1+off2] {sym} val base idx mem) @@ -20978,9 +20832,7 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { } func rewriteValue386_Op386XORLmodify_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLmodify [off1] {sym} (ADDLconst [off2] base) val mem) // cond: is32Bit(off1+off2) // result: (XORLmodify [off1+off2] {sym} base val mem) @@ -21038,9 +20890,7 @@ func rewriteValue386_Op386XORLmodify_0(v *Value) bool { } func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLmodifyidx4 [off1] {sym} (ADDLconst [off2] base) idx val mem) // cond: is32Bit(off1+off2) // result: (XORLmodifyidx4 [off1+off2] {sym} base idx val mem) @@ -21645,9 +21495,7 @@ func rewriteValue386_OpDiv64F_0(v *Value) bool { } func rewriteValue386_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) @@ -21667,9 +21515,7 @@ func rewriteValue386_OpDiv8_0(v *Value) bool { } func rewriteValue386_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) @@ -21689,7 +21535,6 @@ func rewriteValue386_OpDiv8u_0(v *Value) bool { } func rewriteValue386_OpEq16_0(v *Value) bool { b := v.Block - _ = b // match: (Eq16 x y) // cond: // result: (SETEQ (CMPW x y)) @@ -21707,7 +21552,6 @@ func rewriteValue386_OpEq16_0(v *Value) bool { } func rewriteValue386_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x y) // cond: // result: (SETEQ (CMPL x y)) @@ -21725,7 +21569,6 @@ func rewriteValue386_OpEq32_0(v *Value) bool { } func rewriteValue386_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (SETEQF (UCOMISS x y)) @@ -21743,7 +21586,6 @@ func rewriteValue386_OpEq32F_0(v *Value) bool { } func rewriteValue386_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (SETEQF (UCOMISD x y)) @@ -21761,7 +21603,6 @@ func rewriteValue386_OpEq64F_0(v *Value) bool { } func rewriteValue386_OpEq8_0(v *Value) bool { b := v.Block - _ = b // match: (Eq8 x y) // cond: // result: (SETEQ (CMPB x y)) @@ -21779,7 +21620,6 @@ func rewriteValue386_OpEq8_0(v *Value) bool { } func rewriteValue386_OpEqB_0(v *Value) bool { b := v.Block - _ = b // match: (EqB x y) // cond: // result: (SETEQ (CMPB x y)) @@ -21797,7 +21637,6 @@ func rewriteValue386_OpEqB_0(v *Value) bool { } func rewriteValue386_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (EqPtr x y) // cond: // result: (SETEQ (CMPL x y)) @@ -21815,7 +21654,6 @@ func rewriteValue386_OpEqPtr_0(v *Value) bool { } func rewriteValue386_OpGeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Geq16 x y) // cond: // result: (SETGE (CMPW x y)) @@ -21833,7 +21671,6 @@ func rewriteValue386_OpGeq16_0(v *Value) bool { } func rewriteValue386_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq16U x y) // cond: // result: (SETAE (CMPW x y)) @@ -21851,7 +21688,6 @@ func rewriteValue386_OpGeq16U_0(v *Value) bool { } func rewriteValue386_OpGeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32 x y) // cond: // result: (SETGE (CMPL x y)) @@ -21869,7 +21705,6 @@ func rewriteValue386_OpGeq32_0(v *Value) bool { } func rewriteValue386_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (SETGEF (UCOMISS x y)) @@ -21887,7 +21722,6 @@ func rewriteValue386_OpGeq32F_0(v *Value) bool { } func rewriteValue386_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32U x y) // cond: // result: (SETAE (CMPL x y)) @@ -21905,7 +21739,6 @@ func rewriteValue386_OpGeq32U_0(v *Value) bool { } func rewriteValue386_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (SETGEF (UCOMISD x y)) @@ -21923,7 +21756,6 @@ func rewriteValue386_OpGeq64F_0(v *Value) bool { } func rewriteValue386_OpGeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Geq8 x y) // cond: // result: (SETGE (CMPB x y)) @@ -21941,7 +21773,6 @@ func rewriteValue386_OpGeq8_0(v *Value) bool { } func rewriteValue386_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq8U x y) // cond: // result: (SETAE (CMPB x y)) @@ -21997,7 +21828,6 @@ func rewriteValue386_OpGetG_0(v *Value) bool { } func rewriteValue386_OpGreater16_0(v *Value) bool { b := v.Block - _ = b // match: (Greater16 x y) // cond: // result: (SETG (CMPW x y)) @@ -22015,7 +21845,6 @@ func rewriteValue386_OpGreater16_0(v *Value) bool { } func rewriteValue386_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater16U x y) // cond: // result: (SETA (CMPW x y)) @@ -22033,7 +21862,6 @@ func rewriteValue386_OpGreater16U_0(v *Value) bool { } func rewriteValue386_OpGreater32_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32 x y) // cond: // result: (SETG (CMPL x y)) @@ -22051,7 +21879,6 @@ func rewriteValue386_OpGreater32_0(v *Value) bool { } func rewriteValue386_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (SETGF (UCOMISS x y)) @@ -22069,7 +21896,6 @@ func rewriteValue386_OpGreater32F_0(v *Value) bool { } func rewriteValue386_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32U x y) // cond: // result: (SETA (CMPL x y)) @@ -22087,7 +21913,6 @@ func rewriteValue386_OpGreater32U_0(v *Value) bool { } func rewriteValue386_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (SETGF (UCOMISD x y)) @@ -22105,7 +21930,6 @@ func rewriteValue386_OpGreater64F_0(v *Value) bool { } func rewriteValue386_OpGreater8_0(v *Value) bool { b := v.Block - _ = b // match: (Greater8 x y) // cond: // result: (SETG (CMPB x y)) @@ -22123,7 +21947,6 @@ func rewriteValue386_OpGreater8_0(v *Value) bool { } func rewriteValue386_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater8U x y) // cond: // result: (SETA (CMPB x y)) @@ -22185,7 +22008,6 @@ func rewriteValue386_OpInterCall_0(v *Value) bool { } func rewriteValue386_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsInBounds idx len) // cond: // result: (SETB (CMPL idx len)) @@ -22203,7 +22025,6 @@ func rewriteValue386_OpIsInBounds_0(v *Value) bool { } func rewriteValue386_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b // match: (IsNonNil p) // cond: // result: (SETNE (TESTL p p)) @@ -22219,7 +22040,6 @@ func rewriteValue386_OpIsNonNil_0(v *Value) bool { } func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsSliceInBounds idx len) // cond: // result: (SETBE (CMPL idx len)) @@ -22237,7 +22057,6 @@ func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValue386_OpLeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Leq16 x y) // cond: // result: (SETLE (CMPW x y)) @@ -22255,7 +22074,6 @@ func rewriteValue386_OpLeq16_0(v *Value) bool { } func rewriteValue386_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq16U x y) // cond: // result: (SETBE (CMPW x y)) @@ -22273,7 +22091,6 @@ func rewriteValue386_OpLeq16U_0(v *Value) bool { } func rewriteValue386_OpLeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32 x y) // cond: // result: (SETLE (CMPL x y)) @@ -22291,7 +22108,6 @@ func rewriteValue386_OpLeq32_0(v *Value) bool { } func rewriteValue386_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (SETGEF (UCOMISS y x)) @@ -22309,7 +22125,6 @@ func rewriteValue386_OpLeq32F_0(v *Value) bool { } func rewriteValue386_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32U x y) // cond: // result: (SETBE (CMPL x y)) @@ -22327,7 +22142,6 @@ func rewriteValue386_OpLeq32U_0(v *Value) bool { } func rewriteValue386_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (SETGEF (UCOMISD y x)) @@ -22345,7 +22159,6 @@ func rewriteValue386_OpLeq64F_0(v *Value) bool { } func rewriteValue386_OpLeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Leq8 x y) // cond: // result: (SETLE (CMPB x y)) @@ -22363,7 +22176,6 @@ func rewriteValue386_OpLeq8_0(v *Value) bool { } func rewriteValue386_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq8U x y) // cond: // result: (SETBE (CMPB x y)) @@ -22381,7 +22193,6 @@ func rewriteValue386_OpLeq8U_0(v *Value) bool { } func rewriteValue386_OpLess16_0(v *Value) bool { b := v.Block - _ = b // match: (Less16 x y) // cond: // result: (SETL (CMPW x y)) @@ -22399,7 +22210,6 @@ func rewriteValue386_OpLess16_0(v *Value) bool { } func rewriteValue386_OpLess16U_0(v *Value) bool { b := v.Block - _ = b // match: (Less16U x y) // cond: // result: (SETB (CMPW x y)) @@ -22417,7 +22227,6 @@ func rewriteValue386_OpLess16U_0(v *Value) bool { } func rewriteValue386_OpLess32_0(v *Value) bool { b := v.Block - _ = b // match: (Less32 x y) // cond: // result: (SETL (CMPL x y)) @@ -22435,7 +22244,6 @@ func rewriteValue386_OpLess32_0(v *Value) bool { } func rewriteValue386_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (SETGF (UCOMISS y x)) @@ -22453,7 +22261,6 @@ func rewriteValue386_OpLess32F_0(v *Value) bool { } func rewriteValue386_OpLess32U_0(v *Value) bool { b := v.Block - _ = b // match: (Less32U x y) // cond: // result: (SETB (CMPL x y)) @@ -22471,7 +22278,6 @@ func rewriteValue386_OpLess32U_0(v *Value) bool { } func rewriteValue386_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (SETGF (UCOMISD y x)) @@ -22489,7 +22295,6 @@ func rewriteValue386_OpLess64F_0(v *Value) bool { } func rewriteValue386_OpLess8_0(v *Value) bool { b := v.Block - _ = b // match: (Less8 x y) // cond: // result: (SETL (CMPB x y)) @@ -22507,7 +22312,6 @@ func rewriteValue386_OpLess8_0(v *Value) bool { } func rewriteValue386_OpLess8U_0(v *Value) bool { b := v.Block - _ = b // match: (Less8U x y) // cond: // result: (SETB (CMPB x y)) @@ -22622,7 +22426,6 @@ func rewriteValue386_OpLocalAddr_0(v *Value) bool { } func rewriteValue386_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x16 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -22647,7 +22450,6 @@ func rewriteValue386_OpLsh16x16_0(v *Value) bool { } func rewriteValue386_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x32 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -22711,7 +22513,6 @@ func rewriteValue386_OpLsh16x64_0(v *Value) bool { } func rewriteValue386_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x8 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -22736,7 +22537,6 @@ func rewriteValue386_OpLsh16x8_0(v *Value) bool { } func rewriteValue386_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x16 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -22761,7 +22561,6 @@ func rewriteValue386_OpLsh32x16_0(v *Value) bool { } func rewriteValue386_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x32 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -22825,7 +22624,6 @@ func rewriteValue386_OpLsh32x64_0(v *Value) bool { } func rewriteValue386_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x8 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -22850,7 +22648,6 @@ func rewriteValue386_OpLsh32x8_0(v *Value) bool { } func rewriteValue386_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x16 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -22875,7 +22672,6 @@ func rewriteValue386_OpLsh8x16_0(v *Value) bool { } func rewriteValue386_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x32 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -22939,7 +22735,6 @@ func rewriteValue386_OpLsh8x64_0(v *Value) bool { } func rewriteValue386_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x8 x y) // cond: // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -23024,9 +22819,7 @@ func rewriteValue386_OpMod32u_0(v *Value) bool { } func rewriteValue386_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) @@ -23046,9 +22839,7 @@ func rewriteValue386_OpMod8_0(v *Value) bool { } func rewriteValue386_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) @@ -23068,9 +22859,7 @@ func rewriteValue386_OpMod8u_0(v *Value) bool { } func rewriteValue386_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -23326,11 +23115,8 @@ func rewriteValue386_OpMove_0(v *Value) bool { } func rewriteValue386_OpMove_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [s] dst src mem) // cond: s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice // result: (DUFFCOPY [10*(128-s/4)] dst src mem) @@ -23481,11 +23267,8 @@ func rewriteValue386_OpNeg32_0(v *Value) bool { } func rewriteValue386_OpNeg32F_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Neg32F x) // cond: !config.use387 // result: (PXOR x (MOVSSconst [auxFrom32F(float32(math.Copysign(0, -1)))])) @@ -23517,11 +23300,8 @@ func rewriteValue386_OpNeg32F_0(v *Value) bool { } func rewriteValue386_OpNeg64F_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Neg64F x) // cond: !config.use387 // result: (PXOR x (MOVSDconst [auxFrom64F(math.Copysign(0, -1))])) @@ -23564,7 +23344,6 @@ func rewriteValue386_OpNeg8_0(v *Value) bool { } func rewriteValue386_OpNeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Neq16 x y) // cond: // result: (SETNE (CMPW x y)) @@ -23582,7 +23361,6 @@ func rewriteValue386_OpNeq16_0(v *Value) bool { } func rewriteValue386_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x y) // cond: // result: (SETNE (CMPL x y)) @@ -23600,7 +23378,6 @@ func rewriteValue386_OpNeq32_0(v *Value) bool { } func rewriteValue386_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (SETNEF (UCOMISS x y)) @@ -23618,7 +23395,6 @@ func rewriteValue386_OpNeq32F_0(v *Value) bool { } func rewriteValue386_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (SETNEF (UCOMISD x y)) @@ -23636,7 +23412,6 @@ func rewriteValue386_OpNeq64F_0(v *Value) bool { } func rewriteValue386_OpNeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Neq8 x y) // cond: // result: (SETNE (CMPB x y)) @@ -23654,7 +23429,6 @@ func rewriteValue386_OpNeq8_0(v *Value) bool { } func rewriteValue386_OpNeqB_0(v *Value) bool { b := v.Block - _ = b // match: (NeqB x y) // cond: // result: (SETNE (CMPB x y)) @@ -23672,7 +23446,6 @@ func rewriteValue386_OpNeqB_0(v *Value) bool { } func rewriteValue386_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (NeqPtr x y) // cond: // result: (SETNE (CMPL x y)) @@ -23809,7 +23582,6 @@ func rewriteValue386_OpRound64F_0(v *Value) bool { } func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux16 x y) // cond: // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPWconst y [16]))) @@ -23834,7 +23606,6 @@ func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { } func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux32 x y) // cond: // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPLconst y [16]))) @@ -23898,7 +23669,6 @@ func rewriteValue386_OpRsh16Ux64_0(v *Value) bool { } func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux8 x y) // cond: // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPBconst y [16]))) @@ -23923,7 +23693,6 @@ func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { } func rewriteValue386_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x16 x y) // cond: // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [16]))))) @@ -23951,7 +23720,6 @@ func rewriteValue386_OpRsh16x16_0(v *Value) bool { } func rewriteValue386_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x32 x y) // cond: // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [16]))))) @@ -24020,7 +23788,6 @@ func rewriteValue386_OpRsh16x64_0(v *Value) bool { } func rewriteValue386_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x8 x y) // cond: // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [16]))))) @@ -24048,7 +23815,6 @@ func rewriteValue386_OpRsh16x8_0(v *Value) bool { } func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux16 x y) // cond: // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -24073,7 +23839,6 @@ func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { } func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux32 x y) // cond: // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -24137,7 +23902,6 @@ func rewriteValue386_OpRsh32Ux64_0(v *Value) bool { } func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux8 x y) // cond: // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -24162,7 +23926,6 @@ func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { } func rewriteValue386_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x16 x y) // cond: // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [32]))))) @@ -24190,7 +23953,6 @@ func rewriteValue386_OpRsh32x16_0(v *Value) bool { } func rewriteValue386_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x32 x y) // cond: // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [32]))))) @@ -24259,7 +24021,6 @@ func rewriteValue386_OpRsh32x64_0(v *Value) bool { } func rewriteValue386_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x8 x y) // cond: // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [32]))))) @@ -24287,7 +24048,6 @@ func rewriteValue386_OpRsh32x8_0(v *Value) bool { } func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux16 x y) // cond: // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPWconst y [8]))) @@ -24312,7 +24072,6 @@ func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { } func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux32 x y) // cond: // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPLconst y [8]))) @@ -24376,7 +24135,6 @@ func rewriteValue386_OpRsh8Ux64_0(v *Value) bool { } func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux8 x y) // cond: // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPBconst y [8]))) @@ -24401,7 +24159,6 @@ func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { } func rewriteValue386_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x16 x y) // cond: // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [8]))))) @@ -24429,7 +24186,6 @@ func rewriteValue386_OpRsh8x16_0(v *Value) bool { } func rewriteValue386_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x32 x y) // cond: // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [8]))))) @@ -24498,7 +24254,6 @@ func rewriteValue386_OpRsh8x64_0(v *Value) bool { } func rewriteValue386_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x8 x y) // cond: // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [8]))))) @@ -24526,9 +24281,7 @@ func rewriteValue386_OpRsh8x8_0(v *Value) bool { } func rewriteValue386_OpSelect0_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select0 (Mul32uover x y)) // cond: // result: (Select0 (MULLU x y)) @@ -24552,9 +24305,7 @@ func rewriteValue386_OpSelect0_0(v *Value) bool { } func rewriteValue386_OpSelect1_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select1 (Mul32uover x y)) // cond: // result: (SETO (Select1 (MULLU x y))) @@ -24624,7 +24375,6 @@ func rewriteValue386_OpSignmask_0(v *Value) bool { } func rewriteValue386_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SARLconst (NEGL x) [31]) @@ -24970,9 +24720,7 @@ func rewriteValue386_OpXor8_0(v *Value) bool { } func rewriteValue386_OpZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -25163,11 +24911,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { } func rewriteValue386_OpZero_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Zero [12] destptr mem) // cond: // result: (MOVLstoreconst [makeValAndOff(0,8)] destptr (MOVLstoreconst [makeValAndOff(0,4)] destptr (MOVLstoreconst [0] destptr mem))) @@ -25299,7 +25044,6 @@ func rewriteValue386_OpZeroExt8to32_0(v *Value) bool { } func rewriteValue386_OpZeromask_0(v *Value) bool { b := v.Block - _ = b // match: (Zeromask x) // cond: // result: (XORLconst [-1] (SBBLcarrymask (CMPLconst x [1]))) diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index b52e53f9d2..0b87c2f382 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -2115,9 +2115,7 @@ func rewriteValueAMD64_OpAMD64ADDLconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ADDLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDLload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDLload [off1+off2] {sym} val base mem) @@ -3076,9 +3074,7 @@ func rewriteValueAMD64_OpAMD64ADDQconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ADDQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDQload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDQload [off1+off2] {sym} val base mem) @@ -3278,9 +3274,7 @@ func rewriteValueAMD64_OpAMD64ADDSD_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ADDSDload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDSDload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDSDload [off1+off2] {sym} val base mem) @@ -3424,9 +3418,7 @@ func rewriteValueAMD64_OpAMD64ADDSS_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDSSload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ADDSSload [off1+off2] {sym} val base mem) @@ -3515,9 +3507,7 @@ func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDL (NOTL (SHLL (MOVLconst [1]) y)) x) // cond: !config.nacl // result: (BTRL x y) @@ -3720,9 +3710,7 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDLconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDLconst [c] x) // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl // result: (BTRLconst [log2uint32(^c)] x) @@ -3889,9 +3877,7 @@ func rewriteValueAMD64_OpAMD64ANDLconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ANDLload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ANDLload [off1+off2] {sym} val base mem) @@ -4036,9 +4022,7 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDQ (NOTQ (SHLQ (MOVQconst [1]) y)) x) // cond: !config.nacl // result: (BTRQ x y) @@ -4247,9 +4231,7 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDQconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ANDQconst [c] x) // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl // result: (BTRQconst [log2(^c)] x) @@ -4426,9 +4408,7 @@ func rewriteValueAMD64_OpAMD64ANDQconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ANDQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ANDQload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ANDQload [off1+off2] {sym} val base mem) @@ -4573,7 +4553,6 @@ func rewriteValueAMD64_OpAMD64ANDQmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64BSFQ_0(v *Value) bool { b := v.Block - _ = b // match: (BSFQ (ORQconst [1<<8] (MOVBQZX x))) // cond: // result: (BSFQ (ORQconst [1<<8] x)) @@ -8796,7 +8775,6 @@ func rewriteValueAMD64_OpAMD64CMOVWNE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPB_0(v *Value) bool { b := v.Block - _ = b // match: (CMPB x (MOVLconst [c])) // cond: // result: (CMPBconst x [int64(int8(c))]) @@ -8889,7 +8867,6 @@ func rewriteValueAMD64_OpAMD64CMPB_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPBconst_0(v *Value) bool { b := v.Block - _ = b // match: (CMPBconst (MOVLconst [x]) [y]) // cond: int8(x)==int8(y) // result: (FlagEQ) @@ -9199,7 +9176,6 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPL x (MOVLconst [c])) // cond: // result: (CMPLconst x [c]) @@ -9457,7 +9433,6 @@ func rewriteValueAMD64_OpAMD64CMPLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPLconst_10(v *Value) bool { b := v.Block - _ = b // match: (CMPLconst l:(MOVLload {sym} [off] ptr mem) [c]) // cond: l.Uses == 1 && validValAndOff(c, off) && clobber(l) // result: @l.Block (CMPLconstload {sym} [makeValAndOff(c,off)] ptr mem) @@ -9621,7 +9596,6 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPQ_0(v *Value) bool { b := v.Block - _ = b // match: (CMPQ x (MOVQconst [c])) // cond: is32Bit(c) // result: (CMPQconst x [c]) @@ -9904,7 +9878,6 @@ func rewriteValueAMD64_OpAMD64CMPQconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64CMPQconst_10(v *Value) bool { b := v.Block - _ = b // match: (CMPQconst (SHRQconst _ [c]) [n]) // cond: 0 <= n && 0 < c && c <= 64 && (1< [off] {sym} ptr mem) @@ -12228,7 +12198,6 @@ func rewriteValueAMD64_OpAMD64MOVBQSXload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBQZX x:(MOVBload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBload [off] {sym} ptr mem) @@ -13011,7 +12980,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { b := v.Block - _ = b // match: (MOVBstore [off] {sym} ptr (MOVBQSX x) mem) // cond: // result: (MOVBstore [off] {sym} ptr x mem) @@ -13362,9 +13330,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBstore [i] {s} p w x6:(MOVBstore [i-1] {s} p (SHRQconst [8] w) x5:(MOVBstore [i-2] {s} p (SHRQconst [16] w) x4:(MOVBstore [i-3] {s} p (SHRQconst [24] w) x3:(MOVBstore [i-4] {s} p (SHRQconst [32] w) x2:(MOVBstore [i-5] {s} p (SHRQconst [40] w) x1:(MOVBstore [i-6] {s} p (SHRQconst [48] w) x0:(MOVBstore [i-7] {s} p (SHRQconst [56] w) mem)))))))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) // result: (MOVQstore [i-7] {s} p (BSWAPQ w) mem) @@ -14358,7 +14324,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBstoreidx1 [c] {sym} (ADDQconst [d] ptr) idx val mem) // cond: is32Bit(c+d) // result: (MOVBstoreidx1 [c+d] {sym} ptr idx val mem) @@ -15081,7 +15046,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLQSX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVLQSX x:(MOVLload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVLQSXload [off] {sym} ptr mem) @@ -15247,7 +15211,6 @@ func rewriteValueAMD64_OpAMD64MOVLQSXload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLQZX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVLQZX x:(MOVLload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVLload [off] {sym} ptr mem) @@ -15479,7 +15442,6 @@ func rewriteValueAMD64_OpAMD64MOVLatomicload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLf2i_0(v *Value) bool { b := v.Block - _ = b // match: (MOVLf2i (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [off] {sym}) @@ -15507,7 +15469,6 @@ func rewriteValueAMD64_OpAMD64MOVLf2i_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLi2f_0(v *Value) bool { b := v.Block - _ = b // match: (MOVLi2f (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [off] {sym}) @@ -15797,9 +15758,7 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLload_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVLload [off] {sym} (SB) _) // cond: symIsRO(sym) // result: (MOVQconst [int64(read32(sym, off, config.BigEndian))]) @@ -16501,9 +16460,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVLstore [i] {s} p (SHRQconst [32] w) x:(MOVLstore [i-4] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVQstore [i-4] {s} p w mem) @@ -17692,9 +17649,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVLstoreconst [sc] {s} (ADDQconst [off] ptr) mem) // cond: ValAndOff(sc).canAdd(off) // result: (MOVLstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -17944,9 +17899,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVLstoreconstidx1 [c] {sym} ptr (SHLQconst [2] idx) mem) // cond: // result: (MOVLstoreconstidx4 [c] {sym} ptr idx mem) @@ -18067,9 +18020,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVLstoreconstidx4 [x] {sym} (ADDQconst [c] ptr) idx mem) // cond: ValAndOff(x).canAdd(c) // result: (MOVLstoreconstidx4 [ValAndOff(x).add(c)] {sym} ptr idx mem) @@ -18412,7 +18363,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { b := v.Block - _ = b // match: (MOVLstoreidx4 [c] {sym} (ADDQconst [d] ptr) idx val mem) // cond: is32Bit(c+d) // result: (MOVLstoreidx4 [c+d] {sym} ptr idx val mem) @@ -18855,7 +18805,6 @@ func rewriteValueAMD64_OpAMD64MOVQatomicload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVQf2i_0(v *Value) bool { b := v.Block - _ = b // match: (MOVQf2i (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [off] {sym}) @@ -18883,7 +18832,6 @@ func rewriteValueAMD64_OpAMD64MOVQf2i_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVQi2f_0(v *Value) bool { b := v.Block - _ = b // match: (MOVQi2f (Arg [off] {sym})) // cond: t.Size() == u.Size() // result: @b.Func.Entry (Arg [off] {sym}) @@ -18911,9 +18859,7 @@ func rewriteValueAMD64_OpAMD64MOVQi2f_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVQload [off] {sym} ptr (MOVQstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: x @@ -20645,9 +20591,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_30(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVQstoreconst [sc] {s} (ADDQconst [off] ptr) mem) // cond: ValAndOff(sc).canAdd(off) // result: (MOVQstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -22609,7 +22553,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWQSX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWQSX x:(MOVWload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWQSXload [off] {sym} ptr mem) @@ -22788,7 +22731,6 @@ func rewriteValueAMD64_OpAMD64MOVWQSXload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWQZX x:(MOVWload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWload [off] {sym} ptr mem) @@ -22981,9 +22923,7 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWload [off] {sym} ptr (MOVWstore [off2] {sym2} ptr2 x _)) // cond: sym == sym2 && off == off2 && isSamePtr(ptr, ptr2) // result: (MOVWQZX x) @@ -23775,9 +23715,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVWstore [i] {s} p (SHRQconst [16] w) x:(MOVWstore [i-2] {s} p w mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVLstore [i-2] {s} p w mem) @@ -24405,7 +24343,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWstoreconstidx2 [x] {sym} (ADDQconst [c] ptr) idx mem) // cond: ValAndOff(x).canAdd(c) // result: (MOVWstoreconstidx2 [ValAndOff(x).add(c)] {sym} ptr idx mem) @@ -24823,7 +24760,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWstoreidx2 [c] {sym} (ADDQconst [d] ptr) idx val mem) // cond: is32Bit(c+d) // result: (MOVWstoreidx2 [c+d] {sym} ptr idx val mem) @@ -25109,7 +25045,6 @@ func rewriteValueAMD64_OpAMD64MULL_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULLconst_0(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [c] (MULLconst [d] x)) // cond: // result: (MULLconst [int64(int32(c * d))] x) @@ -25253,7 +25188,6 @@ func rewriteValueAMD64_OpAMD64MULLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULLconst_10(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [ 9] x) // cond: // result: (LEAL8 x x) @@ -25421,7 +25355,6 @@ func rewriteValueAMD64_OpAMD64MULLconst_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULLconst_20(v *Value) bool { b := v.Block - _ = b // match: (MULLconst [73] x) // cond: // result: (LEAL8 x (LEAL8 x x)) @@ -25655,7 +25588,6 @@ func rewriteValueAMD64_OpAMD64MULQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULQconst_0(v *Value) bool { b := v.Block - _ = b // match: (MULQconst [c] (MULQconst [d] x)) // cond: is32Bit(c*d) // result: (MULQconst [c * d] x) @@ -25802,7 +25734,6 @@ func rewriteValueAMD64_OpAMD64MULQconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULQconst_10(v *Value) bool { b := v.Block - _ = b // match: (MULQconst [ 9] x) // cond: // result: (LEAQ8 x x) @@ -25970,7 +25901,6 @@ func rewriteValueAMD64_OpAMD64MULQconst_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULQconst_20(v *Value) bool { b := v.Block - _ = b // match: (MULQconst [73] x) // cond: // result: (LEAQ8 x (LEAQ8 x x)) @@ -26218,9 +26148,7 @@ func rewriteValueAMD64_OpAMD64MULSD_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULSDload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MULSDload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (MULSDload [off1+off2] {sym} val base mem) @@ -26364,9 +26292,7 @@ func rewriteValueAMD64_OpAMD64MULSS_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64MULSSload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MULSSload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (MULSSload [off1+off2] {sym} val base mem) @@ -26569,9 +26495,7 @@ func rewriteValueAMD64_OpAMD64NOTQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORL (SHLL (MOVLconst [1]) y) x) // cond: !config.nacl // result: (BTSL x y) @@ -29806,9 +29730,7 @@ func rewriteValueAMD64_OpAMD64ORL_40(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL (SHRB x (ANDLconst y [ 7])) (SHLL x (NEGL (ADDLconst (ANDLconst y [ 7]) [ -8])))) // cond: v.Type.Size() == 1 // result: (RORB x y) @@ -30327,9 +30249,7 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL or:(ORL y s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem))) s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem))) // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j0] (MOVWload [i0] {s} p mem)) y) @@ -30884,9 +30804,7 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLLconst [16] x1:(MOVWloadidx1 [i1] {s} p idx mem))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) @@ -31476,9 +31394,7 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y)) // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) @@ -32173,9 +32089,7 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL or:(ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) y) s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem))) // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) @@ -32822,9 +32736,7 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL or:(ORL y s1:(SHLLconst [j1] x1:(MOVBload [i1] {s} p mem))) s0:(SHLLconst [j0] x0:(MOVBload [i0] {s} p mem))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWload [i0] {s} p mem))) y) @@ -33422,9 +33334,7 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLLconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) @@ -34135,9 +34045,7 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y)) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) @@ -34862,9 +34770,7 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORL or:(ORL s1:(SHLLconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) y) s0:(SHLLconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORL (SHLLconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) @@ -35137,9 +35043,7 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORLconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORLconst [c] x) // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTSLconst [log2uint32(c)] x) @@ -35282,9 +35186,7 @@ func rewriteValueAMD64_OpAMD64ORLconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORLload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ORLload [off1+off2] {sym} val base mem) @@ -35429,9 +35331,7 @@ func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORQ (SHLQ (MOVQconst [1]) y) x) // cond: !config.nacl // result: (BTSQ x y) @@ -36451,9 +36351,7 @@ func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ (SHRQ x y) (ANDQ (SHLQ x (NEGL y)) (SBBQcarrymask (CMPLconst (NEGL (ADDLconst (ANDLconst y [63]) [-64])) [64])))) // cond: // result: (RORQ x y) @@ -36993,9 +36891,7 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ sh:(SHLQconst [32] x1:(MOVLload [i1] {s} p mem)) x0:(MOVLload [i0] {s} p mem)) // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVQload [i0] {s} p mem) @@ -37615,9 +37511,7 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ x0:(MOVBloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [8] x1:(MOVBloadidx1 [i1] {s} p idx mem))) // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWloadidx1 [i0] {s} p idx mem) @@ -38162,9 +38056,7 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ x0:(MOVWloadidx1 [i0] {s} idx p mem) sh:(SHLQconst [16] x1:(MOVWloadidx1 [i1] {s} idx p mem))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVLloadidx1 [i0] {s} p idx mem) @@ -38709,9 +38601,7 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ sh:(SHLQconst [32] x1:(MOVLloadidx1 [i1] {s} idx p mem)) x0:(MOVLloadidx1 [i0] {s} p idx mem)) // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVQloadidx1 [i0] {s} p idx mem) @@ -39361,9 +39251,7 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)) or:(ORQ y s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)))) // cond: i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j0] (MOVWloadidx1 [i0] {s} p idx mem)) y) @@ -40058,9 +39946,7 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} idx p mem)) or:(ORQ s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} p idx mem)) y)) // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) @@ -40755,9 +40641,7 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ or:(ORQ y s0:(SHLQconst [j0] x0:(MOVWloadidx1 [i0] {s} idx p mem))) s1:(SHLQconst [j1] x1:(MOVWloadidx1 [i1] {s} p idx mem))) // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j0] (MOVLloadidx1 [i0] {s} p idx mem)) y) @@ -41400,9 +41284,7 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLload [i0] {s} p mem))) r1:(BSWAPL x1:(MOVLload [i1] {s} p mem))) // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQload [i0] {s} p mem)) @@ -42111,9 +41993,7 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ x1:(MOVBloadidx1 [i1] {s} idx p mem) sh:(SHLQconst [8] x0:(MOVBloadidx1 [i0] {s} p idx mem))) // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem)) @@ -42727,9 +42607,7 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)) sh:(SHLQconst [16] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem)))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem)) @@ -43404,9 +43282,7 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ sh:(SHLQconst [32] r0:(BSWAPL x0:(MOVLloadidx1 [i0] {s} idx p mem))) r1:(BSWAPL x1:(MOVLloadidx1 [i1] {s} p idx mem))) // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (BSWAPQ (MOVQloadidx1 [i0] {s} p idx mem)) @@ -44107,9 +43983,7 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ s0:(SHLQconst [j0] x0:(MOVBloadidx1 [i0] {s} idx p mem)) or:(ORQ y s1:(SHLQconst [j1] x1:(MOVBloadidx1 [i1] {s} idx p mem)))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j1] (ROLWconst [8] (MOVWloadidx1 [i0] {s} p idx mem))) y) @@ -44847,9 +44721,7 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} idx p mem))) or:(ORQ s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} p idx mem))) y)) // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) @@ -45704,9 +45576,7 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQ or:(ORQ y s1:(SHLQconst [j1] r1:(ROLWconst [8] x1:(MOVWloadidx1 [i1] {s} idx p mem)))) s0:(SHLQconst [j0] r0:(ROLWconst [8] x0:(MOVWloadidx1 [i0] {s} p idx mem)))) // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORQ (SHLQconst [j1] (BSWAPL (MOVLloadidx1 [i0] {s} p idx mem))) y) @@ -46188,9 +46058,7 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ORQconst [c] x) // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTSQconst [log2(c)] x) @@ -46331,9 +46199,7 @@ func rewriteValueAMD64_OpAMD64ORQconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORQload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (ORQload [off1+off2] {sym} val base mem) @@ -47207,7 +47073,6 @@ func rewriteValueAMD64_OpAMD64SARBconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SARL_0(v *Value) bool { b := v.Block - _ = b // match: (SARL x (MOVQconst [c])) // cond: // result: (SARLconst [c&31] x) @@ -47462,7 +47327,6 @@ func rewriteValueAMD64_OpAMD64SARLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SARQ_0(v *Value) bool { b := v.Block - _ = b // match: (SARQ x (MOVQconst [c])) // cond: // result: (SARQconst [c&63] x) @@ -48119,7 +47983,6 @@ func rewriteValueAMD64_OpAMD64SETAE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETAEstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETBEstore [off] {sym} ptr x mem) @@ -48314,7 +48177,6 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETAstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETBstore [off] {sym} ptr x mem) @@ -48661,7 +48523,6 @@ func rewriteValueAMD64_OpAMD64SETBE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETBEstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETAEstore [off] {sym} ptr x mem) @@ -48856,7 +48717,6 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETBstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETAstore [off] {sym} ptr x mem) @@ -49051,9 +48911,7 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQ (TESTL (SHLL (MOVLconst [1]) x) y)) // cond: !config.nacl // result: (SETAE (BTL x y)) @@ -49330,9 +49188,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (SETAE (BTQconst [63] x)) @@ -49673,9 +49529,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQ (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 && !config.nacl // result: (SETAE (BTLconst [31] x)) @@ -49809,9 +49663,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) // cond: !config.nacl // result: (SETAEstore [off] {sym} ptr (BTL x y) mem) @@ -50178,9 +50030,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) // cond: z1==z2 && !config.nacl // result: (SETAEstore [off] {sym} ptr (BTQconst [63] x) mem) @@ -50611,9 +50461,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETEQstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) // cond: z1==z2 && !config.nacl // result: (SETAEstore [off] {sym} ptr (BTLconst [31] x) mem) @@ -51034,7 +50882,6 @@ func rewriteValueAMD64_OpAMD64SETGE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETGEstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETLEstore [off] {sym} ptr x mem) @@ -51229,7 +51076,6 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETGstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETLstore [off] {sym} ptr x mem) @@ -51576,7 +51422,6 @@ func rewriteValueAMD64_OpAMD64SETLE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETLEstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETGEstore [off] {sym} ptr x mem) @@ -51771,7 +51616,6 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { b := v.Block - _ = b // match: (SETLstore [off] {sym} ptr (InvertFlags x) mem) // cond: // result: (SETGstore [off] {sym} ptr x mem) @@ -51966,9 +51810,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNE (TESTL (SHLL (MOVLconst [1]) x) y)) // cond: !config.nacl // result: (SETB (BTL x y)) @@ -52245,9 +52087,7 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (SETB (BTQconst [63] x)) @@ -52588,9 +52428,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNE_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNE (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 && !config.nacl // result: (SETB (BTLconst [31] x)) @@ -52724,9 +52562,7 @@ func rewriteValueAMD64_OpAMD64SETNE_20(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNEstore [off] {sym} ptr (TESTL (SHLL (MOVLconst [1]) x) y) mem) // cond: !config.nacl // result: (SETBstore [off] {sym} ptr (BTL x y) mem) @@ -53093,9 +52929,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNEstore [off] {sym} ptr (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2) mem) // cond: z1==z2 && !config.nacl // result: (SETBstore [off] {sym} ptr (BTQconst [63] x) mem) @@ -53526,9 +53360,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SETNEstore [off] {sym} ptr (TESTL z1:(SHRLconst [31] x) z2) mem) // cond: z1==z2 && !config.nacl // result: (SETBstore [off] {sym} ptr (BTLconst [31] x) mem) @@ -53797,7 +53629,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHLL_0(v *Value) bool { b := v.Block - _ = b // match: (SHLL x (MOVQconst [c])) // cond: // result: (SHLLconst [c&31] x) @@ -54022,9 +53853,7 @@ func rewriteValueAMD64_OpAMD64SHLL_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHLLconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SHLLconst [1] (SHRLconst [1] x)) // cond: !config.nacl // result: (BTRLconst [0] x) @@ -54065,7 +53894,6 @@ func rewriteValueAMD64_OpAMD64SHLLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHLQ_0(v *Value) bool { b := v.Block - _ = b // match: (SHLQ x (MOVQconst [c])) // cond: // result: (SHLQconst [c&63] x) @@ -54290,9 +54118,7 @@ func rewriteValueAMD64_OpAMD64SHLQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHLQconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SHLQconst [1] (SHRQconst [1] x)) // cond: !config.nacl // result: (BTRQconst [0] x) @@ -54424,7 +54250,6 @@ func rewriteValueAMD64_OpAMD64SHRBconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHRL_0(v *Value) bool { b := v.Block - _ = b // match: (SHRL x (MOVQconst [c])) // cond: // result: (SHRLconst [c&31] x) @@ -54649,9 +54474,7 @@ func rewriteValueAMD64_OpAMD64SHRL_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHRLconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SHRLconst [1] (SHLLconst [1] x)) // cond: !config.nacl // result: (BTRLconst [31] x) @@ -54692,7 +54515,6 @@ func rewriteValueAMD64_OpAMD64SHRLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHRQ_0(v *Value) bool { b := v.Block - _ = b // match: (SHRQ x (MOVQconst [c])) // cond: // result: (SHRQconst [c&63] x) @@ -54917,9 +54739,7 @@ func rewriteValueAMD64_OpAMD64SHRQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SHRQconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SHRQconst [1] (SHLQconst [1] x)) // cond: !config.nacl // result: (BTRQconst [63] x) @@ -55051,7 +54871,6 @@ func rewriteValueAMD64_OpAMD64SHRWconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBL x (MOVLconst [c])) // cond: // result: (SUBLconst x [c]) @@ -55156,9 +54975,7 @@ func rewriteValueAMD64_OpAMD64SUBLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SUBLload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBLload [off1+off2] {sym} val base mem) @@ -55303,7 +55120,6 @@ func rewriteValueAMD64_OpAMD64SUBLmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBQ_0(v *Value) bool { b := v.Block - _ = b // match: (SUBQ x (MOVQconst [c])) // cond: is32Bit(c) // result: (SUBQconst x [c]) @@ -55472,9 +55288,7 @@ func rewriteValueAMD64_OpAMD64SUBQconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SUBQload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBQload [off1+off2] {sym} val base mem) @@ -55648,9 +55462,7 @@ func rewriteValueAMD64_OpAMD64SUBSD_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBSDload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SUBSDload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBSDload [off1+off2] {sym} val base mem) @@ -55768,9 +55580,7 @@ func rewriteValueAMD64_OpAMD64SUBSS_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SUBSSload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (SUBSSload [off1+off2] {sym} val base mem) @@ -55859,7 +55669,6 @@ func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64TESTB_0(v *Value) bool { b := v.Block - _ = b // match: (TESTB (MOVLconst [c]) x) // cond: // result: (TESTBconst [c] x) @@ -55971,7 +55780,6 @@ func rewriteValueAMD64_OpAMD64TESTBconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64TESTL_0(v *Value) bool { b := v.Block - _ = b // match: (TESTL (MOVLconst [c]) x) // cond: // result: (TESTLconst [c] x) @@ -56083,7 +55891,6 @@ func rewriteValueAMD64_OpAMD64TESTLconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64TESTQ_0(v *Value) bool { b := v.Block - _ = b // match: (TESTQ (MOVQconst [c]) x) // cond: is32Bit(c) // result: (TESTQconst [c] x) @@ -56201,7 +56008,6 @@ func rewriteValueAMD64_OpAMD64TESTQconst_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64TESTW_0(v *Value) bool { b := v.Block - _ = b // match: (TESTW (MOVLconst [c]) x) // cond: // result: (TESTWconst [c] x) @@ -56483,9 +56289,7 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORL (SHLL (MOVLconst [1]) y) x) // cond: !config.nacl // result: (BTCL x y) @@ -56848,9 +56652,7 @@ func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORLconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORLconst [c] x) // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTCLconst [log2uint32(c)] x) @@ -57144,9 +56946,7 @@ func rewriteValueAMD64_OpAMD64XORLconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XORLload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (XORLload [off1+off2] {sym} val base mem) @@ -57291,9 +57091,7 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORQ (SHLQ (MOVQconst [1]) y) x) // cond: !config.nacl // result: (BTCQ x y) @@ -57550,9 +57348,7 @@ func rewriteValueAMD64_OpAMD64XORQ_10(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORQconst_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (XORQconst [c] x) // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTCQconst [log2(c)] x) @@ -57682,9 +57478,7 @@ func rewriteValueAMD64_OpAMD64XORQconstmodify_0(v *Value) bool { } func rewriteValueAMD64_OpAMD64XORQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XORQload [off1] {sym} val (ADDQconst [off2] base) mem) // cond: is32Bit(off1+off2) // result: (XORQload [off1+off2] {sym} val base mem) @@ -57913,9 +57707,7 @@ func rewriteValueAMD64_OpAdd8_0(v *Value) bool { } func rewriteValueAMD64_OpAddPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (AddPtr x y) // cond: config.PtrSize == 8 // result: (ADDQ x y) @@ -57950,9 +57742,7 @@ func rewriteValueAMD64_OpAddPtr_0(v *Value) bool { } func rewriteValueAMD64_OpAddr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Addr {sym} base) // cond: config.PtrSize == 8 // result: (LEAQ {sym} base) @@ -58055,9 +57845,7 @@ func rewriteValueAMD64_OpAndB_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicAdd32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicAdd32 ptr val mem) // cond: // result: (AddTupleFirst32 val (XADDLlock val ptr mem)) @@ -58078,9 +57866,7 @@ func rewriteValueAMD64_OpAtomicAdd32_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicAdd64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicAdd64 ptr val mem) // cond: // result: (AddTupleFirst64 val (XADDQlock val ptr mem)) @@ -58213,9 +57999,7 @@ func rewriteValueAMD64_OpAtomicLoad64_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicLoadPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (AtomicLoadPtr ptr mem) // cond: config.PtrSize == 8 // result: (MOVQatomicload ptr mem) @@ -58266,9 +58050,7 @@ func rewriteValueAMD64_OpAtomicOr8_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicStore32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicStore32 ptr val mem) // cond: // result: (Select1 (XCHGL val ptr mem)) @@ -58288,9 +58070,7 @@ func rewriteValueAMD64_OpAtomicStore32_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicStore64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicStore64 ptr val mem) // cond: // result: (Select1 (XCHGQ val ptr mem)) @@ -58310,11 +58090,8 @@ func rewriteValueAMD64_OpAtomicStore64_0(v *Value) bool { } func rewriteValueAMD64_OpAtomicStorePtrNoWB_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (AtomicStorePtrNoWB ptr val mem) // cond: config.PtrSize == 8 // result: (Select1 (XCHGQ val ptr mem)) @@ -58371,9 +58148,7 @@ func rewriteValueAMD64_OpAvg64u_0(v *Value) bool { } func rewriteValueAMD64_OpBitLen16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen16 x) // cond: // result: (BSRL (LEAL1 [1] (MOVWQZX x) (MOVWQZX x))) @@ -58394,9 +58169,7 @@ func rewriteValueAMD64_OpBitLen16_0(v *Value) bool { } func rewriteValueAMD64_OpBitLen32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen32 x) // cond: // result: (Select0 (BSRQ (LEAQ1 [1] (MOVLQZX x) (MOVLQZX x)))) @@ -58419,9 +58192,7 @@ func rewriteValueAMD64_OpBitLen32_0(v *Value) bool { } func rewriteValueAMD64_OpBitLen64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen64 x) // cond: // result: (ADDQconst [1] (CMOVQEQ (Select0 (BSRQ x)) (MOVQconst [-1]) (Select1 (BSRQ x)))) @@ -58450,9 +58221,7 @@ func rewriteValueAMD64_OpBitLen64_0(v *Value) bool { } func rewriteValueAMD64_OpBitLen8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen8 x) // cond: // result: (BSRL (LEAL1 [1] (MOVBQZX x) (MOVBQZX x))) @@ -59461,9 +59230,7 @@ func rewriteValueAMD64_OpCondSelect_30(v *Value) bool { } func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CondSelect x y (SETGF cond)) // cond: is16BitInt(t) // result: (CMOVWGTF y x cond) @@ -59715,9 +59482,7 @@ func rewriteValueAMD64_OpConstBool_0(v *Value) bool { } func rewriteValueAMD64_OpConstNil_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (ConstNil) // cond: config.PtrSize == 8 // result: (MOVQconst [0]) @@ -59744,9 +59509,7 @@ func rewriteValueAMD64_OpConstNil_0(v *Value) bool { } func rewriteValueAMD64_OpCtz16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz16 x) // cond: // result: (BSFL (BTSLconst [16] x)) @@ -59773,9 +59536,7 @@ func rewriteValueAMD64_OpCtz16NonZero_0(v *Value) bool { } func rewriteValueAMD64_OpCtz32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz32 x) // cond: // result: (Select0 (BSFQ (BTSQconst [32] x))) @@ -59804,9 +59565,7 @@ func rewriteValueAMD64_OpCtz32NonZero_0(v *Value) bool { } func rewriteValueAMD64_OpCtz64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz64 x) // cond: // result: (CMOVQEQ (Select0 (BSFQ x)) (MOVQconst [64]) (Select1 (BSFQ x))) @@ -59832,9 +59591,7 @@ func rewriteValueAMD64_OpCtz64_0(v *Value) bool { } func rewriteValueAMD64_OpCtz64NonZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz64NonZero x) // cond: // result: (Select0 (BSFQ x)) @@ -59849,9 +59606,7 @@ func rewriteValueAMD64_OpCtz64NonZero_0(v *Value) bool { } func rewriteValueAMD64_OpCtz8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz8 x) // cond: // result: (BSFL (BTSLconst [ 8] x)) @@ -60004,9 +59759,7 @@ func rewriteValueAMD64_OpDiv128u_0(v *Value) bool { } func rewriteValueAMD64_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 [a] x y) // cond: // result: (Select0 (DIVW [a] x y)) @@ -60026,9 +59779,7 @@ func rewriteValueAMD64_OpDiv16_0(v *Value) bool { } func rewriteValueAMD64_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (Select0 (DIVWU x y)) @@ -60046,9 +59797,7 @@ func rewriteValueAMD64_OpDiv16u_0(v *Value) bool { } func rewriteValueAMD64_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 [a] x y) // cond: // result: (Select0 (DIVL [a] x y)) @@ -60082,9 +59831,7 @@ func rewriteValueAMD64_OpDiv32F_0(v *Value) bool { } func rewriteValueAMD64_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (Select0 (DIVLU x y)) @@ -60102,9 +59849,7 @@ func rewriteValueAMD64_OpDiv32u_0(v *Value) bool { } func rewriteValueAMD64_OpDiv64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div64 [a] x y) // cond: // result: (Select0 (DIVQ [a] x y)) @@ -60138,9 +59883,7 @@ func rewriteValueAMD64_OpDiv64F_0(v *Value) bool { } func rewriteValueAMD64_OpDiv64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div64u x y) // cond: // result: (Select0 (DIVQU x y)) @@ -60158,9 +59901,7 @@ func rewriteValueAMD64_OpDiv64u_0(v *Value) bool { } func rewriteValueAMD64_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (Select0 (DIVW (SignExt8to16 x) (SignExt8to16 y))) @@ -60182,9 +59923,7 @@ func rewriteValueAMD64_OpDiv8_0(v *Value) bool { } func rewriteValueAMD64_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (Select0 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y))) @@ -60206,7 +59945,6 @@ func rewriteValueAMD64_OpDiv8u_0(v *Value) bool { } func rewriteValueAMD64_OpEq16_0(v *Value) bool { b := v.Block - _ = b // match: (Eq16 x y) // cond: // result: (SETEQ (CMPW x y)) @@ -60224,7 +59962,6 @@ func rewriteValueAMD64_OpEq16_0(v *Value) bool { } func rewriteValueAMD64_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x y) // cond: // result: (SETEQ (CMPL x y)) @@ -60242,7 +59979,6 @@ func rewriteValueAMD64_OpEq32_0(v *Value) bool { } func rewriteValueAMD64_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (SETEQF (UCOMISS x y)) @@ -60260,7 +59996,6 @@ func rewriteValueAMD64_OpEq32F_0(v *Value) bool { } func rewriteValueAMD64_OpEq64_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64 x y) // cond: // result: (SETEQ (CMPQ x y)) @@ -60278,7 +60013,6 @@ func rewriteValueAMD64_OpEq64_0(v *Value) bool { } func rewriteValueAMD64_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (SETEQF (UCOMISD x y)) @@ -60296,7 +60030,6 @@ func rewriteValueAMD64_OpEq64F_0(v *Value) bool { } func rewriteValueAMD64_OpEq8_0(v *Value) bool { b := v.Block - _ = b // match: (Eq8 x y) // cond: // result: (SETEQ (CMPB x y)) @@ -60314,7 +60047,6 @@ func rewriteValueAMD64_OpEq8_0(v *Value) bool { } func rewriteValueAMD64_OpEqB_0(v *Value) bool { b := v.Block - _ = b // match: (EqB x y) // cond: // result: (SETEQ (CMPB x y)) @@ -60332,9 +60064,7 @@ func rewriteValueAMD64_OpEqB_0(v *Value) bool { } func rewriteValueAMD64_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (EqPtr x y) // cond: config.PtrSize == 8 // result: (SETEQ (CMPQ x y)) @@ -60385,7 +60115,6 @@ func rewriteValueAMD64_OpFloor_0(v *Value) bool { } func rewriteValueAMD64_OpGeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Geq16 x y) // cond: // result: (SETGE (CMPW x y)) @@ -60403,7 +60132,6 @@ func rewriteValueAMD64_OpGeq16_0(v *Value) bool { } func rewriteValueAMD64_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq16U x y) // cond: // result: (SETAE (CMPW x y)) @@ -60421,7 +60149,6 @@ func rewriteValueAMD64_OpGeq16U_0(v *Value) bool { } func rewriteValueAMD64_OpGeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32 x y) // cond: // result: (SETGE (CMPL x y)) @@ -60439,7 +60166,6 @@ func rewriteValueAMD64_OpGeq32_0(v *Value) bool { } func rewriteValueAMD64_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (SETGEF (UCOMISS x y)) @@ -60457,7 +60183,6 @@ func rewriteValueAMD64_OpGeq32F_0(v *Value) bool { } func rewriteValueAMD64_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32U x y) // cond: // result: (SETAE (CMPL x y)) @@ -60475,7 +60200,6 @@ func rewriteValueAMD64_OpGeq32U_0(v *Value) bool { } func rewriteValueAMD64_OpGeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64 x y) // cond: // result: (SETGE (CMPQ x y)) @@ -60493,7 +60217,6 @@ func rewriteValueAMD64_OpGeq64_0(v *Value) bool { } func rewriteValueAMD64_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (SETGEF (UCOMISD x y)) @@ -60511,7 +60234,6 @@ func rewriteValueAMD64_OpGeq64F_0(v *Value) bool { } func rewriteValueAMD64_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64U x y) // cond: // result: (SETAE (CMPQ x y)) @@ -60529,7 +60251,6 @@ func rewriteValueAMD64_OpGeq64U_0(v *Value) bool { } func rewriteValueAMD64_OpGeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Geq8 x y) // cond: // result: (SETGE (CMPB x y)) @@ -60547,7 +60268,6 @@ func rewriteValueAMD64_OpGeq8_0(v *Value) bool { } func rewriteValueAMD64_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq8U x y) // cond: // result: (SETAE (CMPB x y)) @@ -60603,7 +60323,6 @@ func rewriteValueAMD64_OpGetG_0(v *Value) bool { } func rewriteValueAMD64_OpGreater16_0(v *Value) bool { b := v.Block - _ = b // match: (Greater16 x y) // cond: // result: (SETG (CMPW x y)) @@ -60621,7 +60340,6 @@ func rewriteValueAMD64_OpGreater16_0(v *Value) bool { } func rewriteValueAMD64_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater16U x y) // cond: // result: (SETA (CMPW x y)) @@ -60639,7 +60357,6 @@ func rewriteValueAMD64_OpGreater16U_0(v *Value) bool { } func rewriteValueAMD64_OpGreater32_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32 x y) // cond: // result: (SETG (CMPL x y)) @@ -60657,7 +60374,6 @@ func rewriteValueAMD64_OpGreater32_0(v *Value) bool { } func rewriteValueAMD64_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (SETGF (UCOMISS x y)) @@ -60675,7 +60391,6 @@ func rewriteValueAMD64_OpGreater32F_0(v *Value) bool { } func rewriteValueAMD64_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32U x y) // cond: // result: (SETA (CMPL x y)) @@ -60693,7 +60408,6 @@ func rewriteValueAMD64_OpGreater32U_0(v *Value) bool { } func rewriteValueAMD64_OpGreater64_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64 x y) // cond: // result: (SETG (CMPQ x y)) @@ -60711,7 +60425,6 @@ func rewriteValueAMD64_OpGreater64_0(v *Value) bool { } func rewriteValueAMD64_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (SETGF (UCOMISD x y)) @@ -60729,7 +60442,6 @@ func rewriteValueAMD64_OpGreater64F_0(v *Value) bool { } func rewriteValueAMD64_OpGreater64U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64U x y) // cond: // result: (SETA (CMPQ x y)) @@ -60747,7 +60459,6 @@ func rewriteValueAMD64_OpGreater64U_0(v *Value) bool { } func rewriteValueAMD64_OpGreater8_0(v *Value) bool { b := v.Block - _ = b // match: (Greater8 x y) // cond: // result: (SETG (CMPB x y)) @@ -60765,7 +60476,6 @@ func rewriteValueAMD64_OpGreater8_0(v *Value) bool { } func rewriteValueAMD64_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater8U x y) // cond: // result: (SETA (CMPB x y)) @@ -60867,9 +60577,7 @@ func rewriteValueAMD64_OpInterCall_0(v *Value) bool { } func rewriteValueAMD64_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (IsInBounds idx len) // cond: config.PtrSize == 8 // result: (SETB (CMPQ idx len)) @@ -60908,9 +60616,7 @@ func rewriteValueAMD64_OpIsInBounds_0(v *Value) bool { } func rewriteValueAMD64_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (IsNonNil p) // cond: config.PtrSize == 8 // result: (SETNE (TESTQ p p)) @@ -60945,9 +60651,7 @@ func rewriteValueAMD64_OpIsNonNil_0(v *Value) bool { } func rewriteValueAMD64_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (IsSliceInBounds idx len) // cond: config.PtrSize == 8 // result: (SETBE (CMPQ idx len)) @@ -60986,7 +60690,6 @@ func rewriteValueAMD64_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueAMD64_OpLeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Leq16 x y) // cond: // result: (SETLE (CMPW x y)) @@ -61004,7 +60707,6 @@ func rewriteValueAMD64_OpLeq16_0(v *Value) bool { } func rewriteValueAMD64_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq16U x y) // cond: // result: (SETBE (CMPW x y)) @@ -61022,7 +60724,6 @@ func rewriteValueAMD64_OpLeq16U_0(v *Value) bool { } func rewriteValueAMD64_OpLeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32 x y) // cond: // result: (SETLE (CMPL x y)) @@ -61040,7 +60741,6 @@ func rewriteValueAMD64_OpLeq32_0(v *Value) bool { } func rewriteValueAMD64_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (SETGEF (UCOMISS y x)) @@ -61058,7 +60758,6 @@ func rewriteValueAMD64_OpLeq32F_0(v *Value) bool { } func rewriteValueAMD64_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32U x y) // cond: // result: (SETBE (CMPL x y)) @@ -61076,7 +60775,6 @@ func rewriteValueAMD64_OpLeq32U_0(v *Value) bool { } func rewriteValueAMD64_OpLeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64 x y) // cond: // result: (SETLE (CMPQ x y)) @@ -61094,7 +60792,6 @@ func rewriteValueAMD64_OpLeq64_0(v *Value) bool { } func rewriteValueAMD64_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (SETGEF (UCOMISD y x)) @@ -61112,7 +60809,6 @@ func rewriteValueAMD64_OpLeq64F_0(v *Value) bool { } func rewriteValueAMD64_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64U x y) // cond: // result: (SETBE (CMPQ x y)) @@ -61130,7 +60826,6 @@ func rewriteValueAMD64_OpLeq64U_0(v *Value) bool { } func rewriteValueAMD64_OpLeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Leq8 x y) // cond: // result: (SETLE (CMPB x y)) @@ -61148,7 +60843,6 @@ func rewriteValueAMD64_OpLeq8_0(v *Value) bool { } func rewriteValueAMD64_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq8U x y) // cond: // result: (SETBE (CMPB x y)) @@ -61166,7 +60860,6 @@ func rewriteValueAMD64_OpLeq8U_0(v *Value) bool { } func rewriteValueAMD64_OpLess16_0(v *Value) bool { b := v.Block - _ = b // match: (Less16 x y) // cond: // result: (SETL (CMPW x y)) @@ -61184,7 +60877,6 @@ func rewriteValueAMD64_OpLess16_0(v *Value) bool { } func rewriteValueAMD64_OpLess16U_0(v *Value) bool { b := v.Block - _ = b // match: (Less16U x y) // cond: // result: (SETB (CMPW x y)) @@ -61202,7 +60894,6 @@ func rewriteValueAMD64_OpLess16U_0(v *Value) bool { } func rewriteValueAMD64_OpLess32_0(v *Value) bool { b := v.Block - _ = b // match: (Less32 x y) // cond: // result: (SETL (CMPL x y)) @@ -61220,7 +60911,6 @@ func rewriteValueAMD64_OpLess32_0(v *Value) bool { } func rewriteValueAMD64_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (SETGF (UCOMISS y x)) @@ -61238,7 +60928,6 @@ func rewriteValueAMD64_OpLess32F_0(v *Value) bool { } func rewriteValueAMD64_OpLess32U_0(v *Value) bool { b := v.Block - _ = b // match: (Less32U x y) // cond: // result: (SETB (CMPL x y)) @@ -61256,7 +60945,6 @@ func rewriteValueAMD64_OpLess32U_0(v *Value) bool { } func rewriteValueAMD64_OpLess64_0(v *Value) bool { b := v.Block - _ = b // match: (Less64 x y) // cond: // result: (SETL (CMPQ x y)) @@ -61274,7 +60962,6 @@ func rewriteValueAMD64_OpLess64_0(v *Value) bool { } func rewriteValueAMD64_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (SETGF (UCOMISD y x)) @@ -61292,7 +60979,6 @@ func rewriteValueAMD64_OpLess64F_0(v *Value) bool { } func rewriteValueAMD64_OpLess64U_0(v *Value) bool { b := v.Block - _ = b // match: (Less64U x y) // cond: // result: (SETB (CMPQ x y)) @@ -61310,7 +60996,6 @@ func rewriteValueAMD64_OpLess64U_0(v *Value) bool { } func rewriteValueAMD64_OpLess8_0(v *Value) bool { b := v.Block - _ = b // match: (Less8 x y) // cond: // result: (SETL (CMPB x y)) @@ -61328,7 +61013,6 @@ func rewriteValueAMD64_OpLess8_0(v *Value) bool { } func rewriteValueAMD64_OpLess8U_0(v *Value) bool { b := v.Block - _ = b // match: (Less8U x y) // cond: // result: (SETB (CMPB x y)) @@ -61346,9 +61030,7 @@ func rewriteValueAMD64_OpLess8U_0(v *Value) bool { } func rewriteValueAMD64_OpLoad_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Load ptr mem) // cond: (is64BitInt(t) || isPtr(t) && config.PtrSize == 8) // result: (MOVQload ptr mem) @@ -61449,9 +61131,7 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { } func rewriteValueAMD64_OpLocalAddr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (LocalAddr {sym} base _) // cond: config.PtrSize == 8 // result: (LEAQ {sym} base) @@ -61486,7 +61166,6 @@ func rewriteValueAMD64_OpLocalAddr_0(v *Value) bool { } func rewriteValueAMD64_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -61530,7 +61209,6 @@ func rewriteValueAMD64_OpLsh16x16_0(v *Value) bool { } func rewriteValueAMD64_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -61574,7 +61252,6 @@ func rewriteValueAMD64_OpLsh16x32_0(v *Value) bool { } func rewriteValueAMD64_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) @@ -61618,7 +61295,6 @@ func rewriteValueAMD64_OpLsh16x64_0(v *Value) bool { } func rewriteValueAMD64_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -61662,7 +61338,6 @@ func rewriteValueAMD64_OpLsh16x8_0(v *Value) bool { } func rewriteValueAMD64_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -61706,7 +61381,6 @@ func rewriteValueAMD64_OpLsh32x16_0(v *Value) bool { } func rewriteValueAMD64_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -61750,7 +61424,6 @@ func rewriteValueAMD64_OpLsh32x32_0(v *Value) bool { } func rewriteValueAMD64_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) @@ -61794,7 +61467,6 @@ func rewriteValueAMD64_OpLsh32x64_0(v *Value) bool { } func rewriteValueAMD64_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -61838,7 +61510,6 @@ func rewriteValueAMD64_OpLsh32x8_0(v *Value) bool { } func rewriteValueAMD64_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x16 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPWconst y [64]))) @@ -61882,7 +61553,6 @@ func rewriteValueAMD64_OpLsh64x16_0(v *Value) bool { } func rewriteValueAMD64_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x32 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPLconst y [64]))) @@ -61926,7 +61596,6 @@ func rewriteValueAMD64_OpLsh64x32_0(v *Value) bool { } func rewriteValueAMD64_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x64 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPQconst y [64]))) @@ -61970,7 +61639,6 @@ func rewriteValueAMD64_OpLsh64x64_0(v *Value) bool { } func rewriteValueAMD64_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x8 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPBconst y [64]))) @@ -62014,7 +61682,6 @@ func rewriteValueAMD64_OpLsh64x8_0(v *Value) bool { } func rewriteValueAMD64_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -62058,7 +61725,6 @@ func rewriteValueAMD64_OpLsh8x16_0(v *Value) bool { } func rewriteValueAMD64_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -62102,7 +61768,6 @@ func rewriteValueAMD64_OpLsh8x32_0(v *Value) bool { } func rewriteValueAMD64_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) @@ -62146,7 +61811,6 @@ func rewriteValueAMD64_OpLsh8x64_0(v *Value) bool { } func rewriteValueAMD64_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -62190,9 +61854,7 @@ func rewriteValueAMD64_OpLsh8x8_0(v *Value) bool { } func rewriteValueAMD64_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 [a] x y) // cond: // result: (Select1 (DIVW [a] x y)) @@ -62212,9 +61874,7 @@ func rewriteValueAMD64_OpMod16_0(v *Value) bool { } func rewriteValueAMD64_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (Select1 (DIVWU x y)) @@ -62232,9 +61892,7 @@ func rewriteValueAMD64_OpMod16u_0(v *Value) bool { } func rewriteValueAMD64_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 [a] x y) // cond: // result: (Select1 (DIVL [a] x y)) @@ -62254,9 +61912,7 @@ func rewriteValueAMD64_OpMod32_0(v *Value) bool { } func rewriteValueAMD64_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (Select1 (DIVLU x y)) @@ -62274,9 +61930,7 @@ func rewriteValueAMD64_OpMod32u_0(v *Value) bool { } func rewriteValueAMD64_OpMod64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64 [a] x y) // cond: // result: (Select1 (DIVQ [a] x y)) @@ -62296,9 +61950,7 @@ func rewriteValueAMD64_OpMod64_0(v *Value) bool { } func rewriteValueAMD64_OpMod64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64u x y) // cond: // result: (Select1 (DIVQU x y)) @@ -62316,9 +61968,7 @@ func rewriteValueAMD64_OpMod64u_0(v *Value) bool { } func rewriteValueAMD64_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (Select1 (DIVW (SignExt8to16 x) (SignExt8to16 y))) @@ -62340,9 +61990,7 @@ func rewriteValueAMD64_OpMod8_0(v *Value) bool { } func rewriteValueAMD64_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (Select1 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y))) @@ -62364,11 +62012,8 @@ func rewriteValueAMD64_OpMod8u_0(v *Value) bool { } func rewriteValueAMD64_OpMove_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -62615,11 +62260,8 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { } func rewriteValueAMD64_OpMove_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [3] dst src mem) // cond: // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVWstore dst (MOVWload src mem) mem)) @@ -62921,11 +62563,8 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { } func rewriteValueAMD64_OpMove_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [s] dst src mem) // cond: s > 16 && s%16 != 0 && s%16 > 8 && !config.useSSE // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (MOVQstore [8] dst (MOVQload [8] src mem) (MOVQstore dst (MOVQload src mem) mem))) @@ -63131,9 +62770,7 @@ func rewriteValueAMD64_OpNeg32_0(v *Value) bool { } func rewriteValueAMD64_OpNeg32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg32F x) // cond: // result: (PXOR x (MOVSSconst [auxFrom32F(float32(math.Copysign(0, -1)))])) @@ -63160,9 +62797,7 @@ func rewriteValueAMD64_OpNeg64_0(v *Value) bool { } func rewriteValueAMD64_OpNeg64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg64F x) // cond: // result: (PXOR x (MOVSDconst [auxFrom64F(math.Copysign(0, -1))])) @@ -63189,7 +62824,6 @@ func rewriteValueAMD64_OpNeg8_0(v *Value) bool { } func rewriteValueAMD64_OpNeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Neq16 x y) // cond: // result: (SETNE (CMPW x y)) @@ -63207,7 +62841,6 @@ func rewriteValueAMD64_OpNeq16_0(v *Value) bool { } func rewriteValueAMD64_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x y) // cond: // result: (SETNE (CMPL x y)) @@ -63225,7 +62858,6 @@ func rewriteValueAMD64_OpNeq32_0(v *Value) bool { } func rewriteValueAMD64_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (SETNEF (UCOMISS x y)) @@ -63243,7 +62875,6 @@ func rewriteValueAMD64_OpNeq32F_0(v *Value) bool { } func rewriteValueAMD64_OpNeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64 x y) // cond: // result: (SETNE (CMPQ x y)) @@ -63261,7 +62892,6 @@ func rewriteValueAMD64_OpNeq64_0(v *Value) bool { } func rewriteValueAMD64_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (SETNEF (UCOMISD x y)) @@ -63279,7 +62909,6 @@ func rewriteValueAMD64_OpNeq64F_0(v *Value) bool { } func rewriteValueAMD64_OpNeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Neq8 x y) // cond: // result: (SETNE (CMPB x y)) @@ -63297,7 +62926,6 @@ func rewriteValueAMD64_OpNeq8_0(v *Value) bool { } func rewriteValueAMD64_OpNeqB_0(v *Value) bool { b := v.Block - _ = b // match: (NeqB x y) // cond: // result: (SETNE (CMPB x y)) @@ -63315,9 +62943,7 @@ func rewriteValueAMD64_OpNeqB_0(v *Value) bool { } func rewriteValueAMD64_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (NeqPtr x y) // cond: config.PtrSize == 8 // result: (SETNE (CMPQ x y)) @@ -63382,11 +63008,8 @@ func rewriteValueAMD64_OpNot_0(v *Value) bool { } func rewriteValueAMD64_OpOffPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OffPtr [off] ptr) // cond: config.PtrSize == 8 && is32Bit(off) // result: (ADDQconst [off] ptr) @@ -63505,9 +63128,7 @@ func rewriteValueAMD64_OpOrB_0(v *Value) bool { } func rewriteValueAMD64_OpPopCount16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount16 x) // cond: // result: (POPCNTL (MOVWQZX x)) @@ -63544,9 +63165,7 @@ func rewriteValueAMD64_OpPopCount64_0(v *Value) bool { } func rewriteValueAMD64_OpPopCount8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount8 x) // cond: // result: (POPCNTL (MOVBQZX x)) @@ -63653,7 +63272,6 @@ func rewriteValueAMD64_OpRoundToEven_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPWconst y [16]))) @@ -63697,7 +63315,6 @@ func rewriteValueAMD64_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPLconst y [16]))) @@ -63741,7 +63358,6 @@ func rewriteValueAMD64_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPQconst y [16]))) @@ -63785,7 +63401,6 @@ func rewriteValueAMD64_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPBconst y [16]))) @@ -63829,7 +63444,6 @@ func rewriteValueAMD64_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x16 x y) // cond: !shiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [16]))))) @@ -63876,7 +63490,6 @@ func rewriteValueAMD64_OpRsh16x16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x32 x y) // cond: !shiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [16]))))) @@ -63923,7 +63536,6 @@ func rewriteValueAMD64_OpRsh16x32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x64 x y) // cond: !shiftIsBounded(v) // result: (SARW x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [16]))))) @@ -63970,7 +63582,6 @@ func rewriteValueAMD64_OpRsh16x64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x8 x y) // cond: !shiftIsBounded(v) // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [16]))))) @@ -64017,7 +63628,6 @@ func rewriteValueAMD64_OpRsh16x8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPWconst y [32]))) @@ -64061,7 +63671,6 @@ func rewriteValueAMD64_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPLconst y [32]))) @@ -64105,7 +63714,6 @@ func rewriteValueAMD64_OpRsh32Ux32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPQconst y [32]))) @@ -64149,7 +63757,6 @@ func rewriteValueAMD64_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPBconst y [32]))) @@ -64193,7 +63800,6 @@ func rewriteValueAMD64_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x16 x y) // cond: !shiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [32]))))) @@ -64240,7 +63846,6 @@ func rewriteValueAMD64_OpRsh32x16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x32 x y) // cond: !shiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [32]))))) @@ -64287,7 +63892,6 @@ func rewriteValueAMD64_OpRsh32x32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x64 x y) // cond: !shiftIsBounded(v) // result: (SARL x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [32]))))) @@ -64334,7 +63938,6 @@ func rewriteValueAMD64_OpRsh32x64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x8 x y) // cond: !shiftIsBounded(v) // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [32]))))) @@ -64381,7 +63984,6 @@ func rewriteValueAMD64_OpRsh32x8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux16 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPWconst y [64]))) @@ -64425,7 +64027,6 @@ func rewriteValueAMD64_OpRsh64Ux16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux32 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPLconst y [64]))) @@ -64469,7 +64070,6 @@ func rewriteValueAMD64_OpRsh64Ux32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux64 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPQconst y [64]))) @@ -64513,7 +64113,6 @@ func rewriteValueAMD64_OpRsh64Ux64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux8 x y) // cond: !shiftIsBounded(v) // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPBconst y [64]))) @@ -64557,7 +64156,6 @@ func rewriteValueAMD64_OpRsh64Ux8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x16 x y) // cond: !shiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [64]))))) @@ -64604,7 +64202,6 @@ func rewriteValueAMD64_OpRsh64x16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x32 x y) // cond: !shiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [64]))))) @@ -64651,7 +64248,6 @@ func rewriteValueAMD64_OpRsh64x32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x64 x y) // cond: !shiftIsBounded(v) // result: (SARQ x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [64]))))) @@ -64698,7 +64294,6 @@ func rewriteValueAMD64_OpRsh64x64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x8 x y) // cond: !shiftIsBounded(v) // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [64]))))) @@ -64745,7 +64340,6 @@ func rewriteValueAMD64_OpRsh64x8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux16 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPWconst y [8]))) @@ -64789,7 +64383,6 @@ func rewriteValueAMD64_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux32 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPLconst y [8]))) @@ -64833,7 +64426,6 @@ func rewriteValueAMD64_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux64 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPQconst y [8]))) @@ -64877,7 +64469,6 @@ func rewriteValueAMD64_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux8 x y) // cond: !shiftIsBounded(v) // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPBconst y [8]))) @@ -64921,7 +64512,6 @@ func rewriteValueAMD64_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x16 x y) // cond: !shiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [8]))))) @@ -64968,7 +64558,6 @@ func rewriteValueAMD64_OpRsh8x16_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x32 x y) // cond: !shiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [8]))))) @@ -65015,7 +64604,6 @@ func rewriteValueAMD64_OpRsh8x32_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x64 x y) // cond: !shiftIsBounded(v) // result: (SARB x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [8]))))) @@ -65062,7 +64650,6 @@ func rewriteValueAMD64_OpRsh8x64_0(v *Value) bool { } func rewriteValueAMD64_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x8 x y) // cond: !shiftIsBounded(v) // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [8]))))) @@ -65109,9 +64696,7 @@ func rewriteValueAMD64_OpRsh8x8_0(v *Value) bool { } func rewriteValueAMD64_OpSelect0_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select0 (Mul64uover x y)) // cond: // result: (Select0 (MULQU x y)) @@ -65242,9 +64827,7 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { } func rewriteValueAMD64_OpSelect1_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select1 (Mul64uover x y)) // cond: // result: (SETO (Select1 (MULQU x y))) @@ -65481,7 +65064,6 @@ func rewriteValueAMD64_OpSignExt8to64_0(v *Value) bool { } func rewriteValueAMD64_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SARQconst (NEGQ x) [63]) @@ -65719,9 +65301,7 @@ func rewriteValueAMD64_OpSub8_0(v *Value) bool { } func rewriteValueAMD64_OpSubPtr_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (SubPtr x y) // cond: config.PtrSize == 8 // result: (SUBQ x y) @@ -65914,9 +65494,7 @@ func rewriteValueAMD64_OpXor8_0(v *Value) bool { } func rewriteValueAMD64_OpZero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Zero [0] _ mem) // cond: // result: mem @@ -66103,9 +65681,7 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { } func rewriteValueAMD64_OpZero_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Zero [16] destptr mem) // cond: !config.useSSE // result: (MOVQstoreconst [makeValAndOff(0,8)] destptr (MOVQstoreconst [0] destptr mem)) @@ -66400,11 +65976,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { } func rewriteValueAMD64_OpZero_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Zero [s] destptr mem) // cond: s > 64 && s <= 1024 && s%16 == 0 && !config.noDuffDevice // result: (DUFFZERO [s] destptr (MOVOconst [0]) mem) diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index c190ef779c..496e3168f6 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -1442,7 +1442,6 @@ func rewriteValueARM_OpARMADCconst_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftLL (MOVWconst [c]) x [d] flags) // cond: // result: (ADCconst [c] (SLLconst x [d]) flags) @@ -1488,7 +1487,6 @@ func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftLLreg (MOVWconst [c]) x y flags) // cond: // result: (ADCconst [c] (SLL x y) flags) @@ -1535,7 +1533,6 @@ func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftRA (MOVWconst [c]) x [d] flags) // cond: // result: (ADCconst [c] (SRAconst x [d]) flags) @@ -1581,7 +1578,6 @@ func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftRAreg (MOVWconst [c]) x y flags) // cond: // result: (ADCconst [c] (SRA x y) flags) @@ -1628,7 +1624,6 @@ func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftRL (MOVWconst [c]) x [d] flags) // cond: // result: (ADCconst [c] (SRLconst x [d]) flags) @@ -1674,7 +1669,6 @@ func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADCshiftRLreg (MOVWconst [c]) x y flags) // cond: // result: (ADCconst [c] (SRL x y) flags) @@ -1902,7 +1896,6 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { } func rewriteValueARM_OpARMADD_10(v *Value) bool { b := v.Block - _ = b // match: (ADD x (SRL y z)) // cond: // result: (ADDshiftRLreg x y z) @@ -2553,7 +2546,6 @@ func rewriteValueARM_OpARMADDS_10(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ADDSconst [c] (SLLconst x [d])) @@ -2595,7 +2587,6 @@ func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftLLreg (MOVWconst [c]) x y) // cond: // result: (ADDSconst [c] (SLL x y)) @@ -2638,7 +2629,6 @@ func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftRA (MOVWconst [c]) x [d]) // cond: // result: (ADDSconst [c] (SRAconst x [d])) @@ -2680,7 +2670,6 @@ func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftRAreg (MOVWconst [c]) x y) // cond: // result: (ADDSconst [c] (SRA x y)) @@ -2723,7 +2712,6 @@ func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftRL (MOVWconst [c]) x [d]) // cond: // result: (ADDSconst [c] (SRLconst x [d])) @@ -2765,7 +2753,6 @@ func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDSshiftRLreg (MOVWconst [c]) x y) // cond: // result: (ADDSconst [c] (SRL x y)) @@ -2932,9 +2919,7 @@ func rewriteValueARM_OpARMADDconst_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ADDconst [c] (SLLconst x [d])) @@ -3066,7 +3051,6 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftLLreg (MOVWconst [c]) x y) // cond: // result: (ADDconst [c] (SLL x y)) @@ -3109,7 +3093,6 @@ func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRA (MOVWconst [c]) x [d]) // cond: // result: (ADDconst [c] (SRAconst x [d])) @@ -3151,7 +3134,6 @@ func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRAreg (MOVWconst [c]) x y) // cond: // result: (ADDconst [c] (SRA x y)) @@ -3194,7 +3176,6 @@ func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRL (MOVWconst [c]) x [d]) // cond: // result: (ADDconst [c] (SRLconst x [d])) @@ -3258,7 +3239,6 @@ func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRLreg (MOVWconst [c]) x y) // cond: // result: (ADDconst [c] (SRL x y)) @@ -3804,7 +3784,6 @@ func rewriteValueARM_OpARMANDconst_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ANDconst [c] (SLLconst x [d])) @@ -3869,7 +3848,6 @@ func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftLLreg (MOVWconst [c]) x y) // cond: // result: (ANDconst [c] (SLL x y)) @@ -3912,7 +3890,6 @@ func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRA (MOVWconst [c]) x [d]) // cond: // result: (ANDconst [c] (SRAconst x [d])) @@ -3977,7 +3954,6 @@ func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRAreg (MOVWconst [c]) x y) // cond: // result: (ANDconst [c] (SRA x y)) @@ -4020,7 +3996,6 @@ func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRL (MOVWconst [c]) x [d]) // cond: // result: (ANDconst [c] (SRLconst x [d])) @@ -4085,7 +4060,6 @@ func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRLreg (MOVWconst [c]) x y) // cond: // result: (ANDconst [c] (SRL x y)) @@ -4961,7 +4935,6 @@ func rewriteValueARM_OpARMCMNconst_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftLL (MOVWconst [c]) x [d]) // cond: // result: (CMNconst [c] (SLLconst x [d])) @@ -5003,7 +4976,6 @@ func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftLLreg (MOVWconst [c]) x y) // cond: // result: (CMNconst [c] (SLL x y)) @@ -5046,7 +5018,6 @@ func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRA (MOVWconst [c]) x [d]) // cond: // result: (CMNconst [c] (SRAconst x [d])) @@ -5088,7 +5059,6 @@ func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRAreg (MOVWconst [c]) x y) // cond: // result: (CMNconst [c] (SRA x y)) @@ -5131,7 +5101,6 @@ func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRL (MOVWconst [c]) x [d]) // cond: // result: (CMNconst [c] (SRLconst x [d])) @@ -5173,7 +5142,6 @@ func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMCMNshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRLreg (MOVWconst [c]) x y) // cond: // result: (CMNconst [c] (SRL x y)) @@ -5402,7 +5370,6 @@ func rewriteValueARM_OpARMCMOVWLSconst_0(v *Value) bool { } func rewriteValueARM_OpARMCMP_0(v *Value) bool { b := v.Block - _ = b // match: (CMP x (MOVWconst [c])) // cond: // result: (CMPconst [c] x) @@ -5595,7 +5562,6 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { } func rewriteValueARM_OpARMCMP_10(v *Value) bool { b := v.Block - _ = b // match: (CMP x (SRL y z)) // cond: // result: (CMPshiftRLreg x y z) @@ -5884,7 +5850,6 @@ func rewriteValueARM_OpARMCMPconst_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftLL (MOVWconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) @@ -5928,7 +5893,6 @@ func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftLLreg (MOVWconst [c]) x y) // cond: // result: (InvertFlags (CMPconst [c] (SLL x y))) @@ -5973,7 +5937,6 @@ func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRA (MOVWconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SRAconst x [d]))) @@ -6017,7 +5980,6 @@ func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRAreg (MOVWconst [c]) x y) // cond: // result: (InvertFlags (CMPconst [c] (SRA x y))) @@ -6062,7 +6024,6 @@ func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRL (MOVWconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) @@ -6106,7 +6067,6 @@ func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRLreg (MOVWconst [c]) x y) // cond: // result: (InvertFlags (CMPconst [c] (SRL x y))) @@ -6835,9 +6795,7 @@ func rewriteValueARM_OpARMLessThanU_0(v *Value) bool { } func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: // result: (MOVBUload [off1+off2] {sym} ptr mem) @@ -7096,9 +7054,7 @@ func rewriteValueARM_OpARMMOVBUreg_0(v *Value) bool { } func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: // result: (MOVBload [off1+off2] {sym} ptr mem) @@ -7342,9 +7298,7 @@ func rewriteValueARM_OpARMMOVBreg_0(v *Value) bool { } func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: // result: (MOVBstore [off1+off2] {sym} ptr val mem) @@ -7923,9 +7877,7 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { } func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: // result: (MOVHUload [off1+off2] {sym} ptr mem) @@ -8209,9 +8161,7 @@ func rewriteValueARM_OpARMMOVHUreg_0(v *Value) bool { } func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: // result: (MOVHload [off1+off2] {sym} ptr mem) @@ -8505,9 +8455,7 @@ func rewriteValueARM_OpARMMOVHreg_0(v *Value) bool { } func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: // result: (MOVHstore [off1+off2] {sym} ptr val mem) @@ -8700,9 +8648,7 @@ func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { } func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: // result: (MOVWload [off1+off2] {sym} ptr mem) @@ -9286,9 +9232,7 @@ func rewriteValueARM_OpARMMOVWreg_0(v *Value) bool { } func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: // result: (MOVWstore [off1+off2] {sym} ptr val mem) @@ -9918,7 +9862,6 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { } func rewriteValueARM_OpARMMUL_10(v *Value) bool { b := v.Block - _ = b // match: (MUL x (MOVWconst [c])) // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (RSBshiftLL x x [log2(c+1)]) @@ -10188,7 +10131,6 @@ func rewriteValueARM_OpARMMUL_20(v *Value) bool { } func rewriteValueARM_OpARMMULA_0(v *Value) bool { b := v.Block - _ = b // match: (MULA x (MOVWconst [c]) a) // cond: int32(c) == -1 // result: (SUB a x) @@ -10429,7 +10371,6 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { } func rewriteValueARM_OpARMMULA_10(v *Value) bool { b := v.Block - _ = b // match: (MULA (MOVWconst [c]) x a) // cond: int32(c) == -1 // result: (SUB a x) @@ -10776,7 +10717,6 @@ func rewriteValueARM_OpARMMULF_0(v *Value) bool { } func rewriteValueARM_OpARMMULS_0(v *Value) bool { b := v.Block - _ = b // match: (MULS x (MOVWconst [c]) a) // cond: int32(c) == -1 // result: (ADD a x) @@ -11017,7 +10957,6 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { } func rewriteValueARM_OpARMMULS_10(v *Value) bool { b := v.Block - _ = b // match: (MULS (MOVWconst [c]) x a) // cond: int32(c) == -1 // result: (ADD a x) @@ -12021,9 +11960,7 @@ func rewriteValueARM_OpARMORconst_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORshiftLL (MOVWconst [c]) x [d]) // cond: // result: (ORconst [c] (SLLconst x [d])) @@ -12178,7 +12115,6 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftLLreg (MOVWconst [c]) x y) // cond: // result: (ORconst [c] (SLL x y)) @@ -12221,7 +12157,6 @@ func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRA (MOVWconst [c]) x [d]) // cond: // result: (ORconst [c] (SRAconst x [d])) @@ -12286,7 +12221,6 @@ func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRAreg (MOVWconst [c]) x y) // cond: // result: (ORconst [c] (SRA x y)) @@ -12329,7 +12263,6 @@ func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRL (MOVWconst [c]) x [d]) // cond: // result: (ORconst [c] (SRLconst x [d])) @@ -12416,7 +12349,6 @@ func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRLreg (MOVWconst [c]) x y) // cond: // result: (ORconst [c] (SRL x y)) @@ -12754,7 +12686,6 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftLL (MOVWconst [c]) x [d]) // cond: // result: (SUBSconst [c] (SLLconst x [d])) @@ -12796,7 +12727,6 @@ func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftLLreg (MOVWconst [c]) x y) // cond: // result: (SUBSconst [c] (SLL x y)) @@ -12839,7 +12769,6 @@ func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftRA (MOVWconst [c]) x [d]) // cond: // result: (SUBSconst [c] (SRAconst x [d])) @@ -12881,7 +12810,6 @@ func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftRAreg (MOVWconst [c]) x y) // cond: // result: (SUBSconst [c] (SRA x y)) @@ -12924,7 +12852,6 @@ func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftRL (MOVWconst [c]) x [d]) // cond: // result: (SUBSconst [c] (SRLconst x [d])) @@ -12966,7 +12893,6 @@ func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBSshiftRLreg (MOVWconst [c]) x y) // cond: // result: (SUBSconst [c] (SRL x y)) @@ -13074,7 +13000,6 @@ func rewriteValueARM_OpARMRSBconst_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftLL (MOVWconst [c]) x [d]) // cond: // result: (SUBconst [c] (SLLconst x [d])) @@ -13138,7 +13063,6 @@ func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftLLreg (MOVWconst [c]) x y) // cond: // result: (SUBconst [c] (SLL x y)) @@ -13181,7 +13105,6 @@ func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftRA (MOVWconst [c]) x [d]) // cond: // result: (SUBconst [c] (SRAconst x [d])) @@ -13245,7 +13168,6 @@ func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftRAreg (MOVWconst [c]) x y) // cond: // result: (SUBconst [c] (SRA x y)) @@ -13288,7 +13210,6 @@ func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftRL (MOVWconst [c]) x [d]) // cond: // result: (SUBconst [c] (SRLconst x [d])) @@ -13352,7 +13273,6 @@ func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSBshiftRLreg (MOVWconst [c]) x y) // cond: // result: (SUBconst [c] (SRL x y)) @@ -13436,7 +13356,6 @@ func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftLL (MOVWconst [c]) x [d] flags) // cond: // result: (SBCconst [c] (SLLconst x [d]) flags) @@ -13482,7 +13401,6 @@ func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftLLreg (MOVWconst [c]) x y flags) // cond: // result: (SBCconst [c] (SLL x y) flags) @@ -13529,7 +13447,6 @@ func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftRA (MOVWconst [c]) x [d] flags) // cond: // result: (SBCconst [c] (SRAconst x [d]) flags) @@ -13575,7 +13492,6 @@ func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftRAreg (MOVWconst [c]) x y flags) // cond: // result: (SBCconst [c] (SRA x y) flags) @@ -13622,7 +13538,6 @@ func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftRL (MOVWconst [c]) x [d] flags) // cond: // result: (SBCconst [c] (SRLconst x [d]) flags) @@ -13668,7 +13583,6 @@ func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (RSCshiftRLreg (MOVWconst [c]) x y flags) // cond: // result: (SBCconst [c] (SRL x y) flags) @@ -14044,7 +13958,6 @@ func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftLL (MOVWconst [c]) x [d] flags) // cond: // result: (RSCconst [c] (SLLconst x [d]) flags) @@ -14090,7 +14003,6 @@ func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftLLreg (MOVWconst [c]) x y flags) // cond: // result: (RSCconst [c] (SLL x y) flags) @@ -14137,7 +14049,6 @@ func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftRA (MOVWconst [c]) x [d] flags) // cond: // result: (RSCconst [c] (SRAconst x [d]) flags) @@ -14183,7 +14094,6 @@ func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftRAreg (MOVWconst [c]) x y flags) // cond: // result: (RSCconst [c] (SRA x y) flags) @@ -14230,7 +14140,6 @@ func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftRL (MOVWconst [c]) x [d] flags) // cond: // result: (RSCconst [c] (SRLconst x [d]) flags) @@ -14276,7 +14185,6 @@ func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SBCshiftRLreg (MOVWconst [c]) x y flags) // cond: // result: (RSCconst [c] (SRL x y) flags) @@ -15182,7 +15090,6 @@ func rewriteValueARM_OpARMSUBS_10(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftLL (MOVWconst [c]) x [d]) // cond: // result: (RSBSconst [c] (SLLconst x [d])) @@ -15224,7 +15131,6 @@ func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftLLreg (MOVWconst [c]) x y) // cond: // result: (RSBSconst [c] (SLL x y)) @@ -15267,7 +15173,6 @@ func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftRA (MOVWconst [c]) x [d]) // cond: // result: (RSBSconst [c] (SRAconst x [d])) @@ -15309,7 +15214,6 @@ func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftRAreg (MOVWconst [c]) x y) // cond: // result: (RSBSconst [c] (SRA x y)) @@ -15352,7 +15256,6 @@ func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftRL (MOVWconst [c]) x [d]) // cond: // result: (RSBSconst [c] (SRLconst x [d])) @@ -15394,7 +15297,6 @@ func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBSshiftRLreg (MOVWconst [c]) x y) // cond: // result: (RSBSconst [c] (SRL x y)) @@ -15561,7 +15463,6 @@ func rewriteValueARM_OpARMSUBconst_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftLL (MOVWconst [c]) x [d]) // cond: // result: (RSBconst [c] (SLLconst x [d])) @@ -15625,7 +15526,6 @@ func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftLLreg (MOVWconst [c]) x y) // cond: // result: (RSBconst [c] (SLL x y)) @@ -15668,7 +15568,6 @@ func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftRA (MOVWconst [c]) x [d]) // cond: // result: (RSBconst [c] (SRAconst x [d])) @@ -15732,7 +15631,6 @@ func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftRAreg (MOVWconst [c]) x y) // cond: // result: (RSBconst [c] (SRA x y)) @@ -15775,7 +15673,6 @@ func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftRL (MOVWconst [c]) x [d]) // cond: // result: (RSBconst [c] (SRLconst x [d])) @@ -15839,7 +15736,6 @@ func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (SUBshiftRLreg (MOVWconst [c]) x y) // cond: // result: (RSBconst [c] (SRL x y)) @@ -16193,7 +16089,6 @@ func rewriteValueARM_OpARMTEQconst_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftLL (MOVWconst [c]) x [d]) // cond: // result: (TEQconst [c] (SLLconst x [d])) @@ -16235,7 +16130,6 @@ func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftLLreg (MOVWconst [c]) x y) // cond: // result: (TEQconst [c] (SLL x y)) @@ -16278,7 +16172,6 @@ func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftRA (MOVWconst [c]) x [d]) // cond: // result: (TEQconst [c] (SRAconst x [d])) @@ -16320,7 +16213,6 @@ func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftRAreg (MOVWconst [c]) x y) // cond: // result: (TEQconst [c] (SRA x y)) @@ -16363,7 +16255,6 @@ func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftRL (MOVWconst [c]) x [d]) // cond: // result: (TEQconst [c] (SRLconst x [d])) @@ -16405,7 +16296,6 @@ func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (TEQshiftRLreg (MOVWconst [c]) x y) // cond: // result: (TEQconst [c] (SRL x y)) @@ -16759,7 +16649,6 @@ func rewriteValueARM_OpARMTSTconst_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftLL (MOVWconst [c]) x [d]) // cond: // result: (TSTconst [c] (SLLconst x [d])) @@ -16801,7 +16690,6 @@ func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftLLreg (MOVWconst [c]) x y) // cond: // result: (TSTconst [c] (SLL x y)) @@ -16844,7 +16732,6 @@ func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRA (MOVWconst [c]) x [d]) // cond: // result: (TSTconst [c] (SRAconst x [d])) @@ -16886,7 +16773,6 @@ func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRAreg (MOVWconst [c]) x y) // cond: // result: (TSTconst [c] (SRA x y)) @@ -16929,7 +16815,6 @@ func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRL (MOVWconst [c]) x [d]) // cond: // result: (TSTconst [c] (SRLconst x [d])) @@ -16971,7 +16856,6 @@ func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMTSTshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRLreg (MOVWconst [c]) x y) // cond: // result: (TSTconst [c] (SRL x y)) @@ -17369,9 +17253,7 @@ func rewriteValueARM_OpARMXORconst_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XORshiftLL (MOVWconst [c]) x [d]) // cond: // result: (XORconst [c] (SLLconst x [d])) @@ -17525,7 +17407,6 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftLLreg (MOVWconst [c]) x y) // cond: // result: (XORconst [c] (SLL x y)) @@ -17568,7 +17449,6 @@ func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRA (MOVWconst [c]) x [d]) // cond: // result: (XORconst [c] (SRAconst x [d])) @@ -17632,7 +17512,6 @@ func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRAreg (MOVWconst [c]) x y) // cond: // result: (XORconst [c] (SRA x y)) @@ -17675,7 +17554,6 @@ func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRL (MOVWconst [c]) x [d]) // cond: // result: (XORconst [c] (SRLconst x [d])) @@ -17761,7 +17639,6 @@ func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRLreg (MOVWconst [c]) x y) // cond: // result: (XORconst [c] (SRL x y)) @@ -17804,7 +17681,6 @@ func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { } func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRR (MOVWconst [c]) x [d]) // cond: // result: (XORconst [c] (SRRconst x [d])) @@ -18029,7 +17905,6 @@ func rewriteValueARM_OpAndB_0(v *Value) bool { } func rewriteValueARM_OpAvg32u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg32u x y) // cond: // result: (ADD (SRLconst (SUB x y) [1]) y) @@ -18052,7 +17927,6 @@ func rewriteValueARM_OpAvg32u_0(v *Value) bool { } func rewriteValueARM_OpBitLen32_0(v *Value) bool { b := v.Block - _ = b // match: (BitLen32 x) // cond: // result: (RSBconst [32] (CLZ x)) @@ -18069,7 +17943,6 @@ func rewriteValueARM_OpBitLen32_0(v *Value) bool { } func rewriteValueARM_OpBswap32_0(v *Value) bool { b := v.Block - _ = b // match: (Bswap32 x) // cond: objabi.GOARM==5 // result: (XOR (SRLconst (BICconst (XOR x (SRRconst [16] x)) [0xff0000]) [8]) (SRRconst x [8])) @@ -18243,7 +18116,6 @@ func rewriteValueARM_OpConstNil_0(v *Value) bool { } func rewriteValueARM_OpCtz32_0(v *Value) bool { b := v.Block - _ = b // match: (Ctz32 x) // cond: objabi.GOARM<=6 // result: (RSBconst [32] (CLZ (SUBconst (AND x (RSBconst [0] x)) [1]))) @@ -18410,9 +18282,7 @@ func rewriteValueARM_OpCvt64Fto32U_0(v *Value) bool { } func rewriteValueARM_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) @@ -18432,9 +18302,7 @@ func rewriteValueARM_OpDiv16_0(v *Value) bool { } func rewriteValueARM_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -18454,9 +18322,7 @@ func rewriteValueARM_OpDiv16u_0(v *Value) bool { } func rewriteValueARM_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 x y) // cond: // result: (SUB (XOR (Select0 (CALLudiv (SUB (XOR x (Signmask x)) (Signmask x)) (SUB (XOR y (Signmask y)) (Signmask y)))) (Signmask (XOR x y))) (Signmask (XOR x y))) @@ -18524,9 +18390,7 @@ func rewriteValueARM_OpDiv32F_0(v *Value) bool { } func rewriteValueARM_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (Select0 (CALLudiv x y)) @@ -18559,9 +18423,7 @@ func rewriteValueARM_OpDiv64F_0(v *Value) bool { } func rewriteValueARM_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) @@ -18581,9 +18443,7 @@ func rewriteValueARM_OpDiv8_0(v *Value) bool { } func rewriteValueARM_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -18603,9 +18463,7 @@ func rewriteValueARM_OpDiv8u_0(v *Value) bool { } func rewriteValueARM_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -18627,7 +18485,6 @@ func rewriteValueARM_OpEq16_0(v *Value) bool { } func rewriteValueARM_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x y) // cond: // result: (Equal (CMP x y)) @@ -18645,7 +18502,6 @@ func rewriteValueARM_OpEq32_0(v *Value) bool { } func rewriteValueARM_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (Equal (CMPF x y)) @@ -18663,7 +18519,6 @@ func rewriteValueARM_OpEq32F_0(v *Value) bool { } func rewriteValueARM_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (Equal (CMPD x y)) @@ -18681,9 +18536,7 @@ func rewriteValueARM_OpEq64F_0(v *Value) bool { } func rewriteValueARM_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -18705,9 +18558,7 @@ func rewriteValueARM_OpEq8_0(v *Value) bool { } func rewriteValueARM_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (XORconst [1] (XOR x y)) @@ -18726,7 +18577,6 @@ func rewriteValueARM_OpEqB_0(v *Value) bool { } func rewriteValueARM_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (EqPtr x y) // cond: // result: (Equal (CMP x y)) @@ -18744,9 +18594,7 @@ func rewriteValueARM_OpEqPtr_0(v *Value) bool { } func rewriteValueARM_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) @@ -18768,9 +18616,7 @@ func rewriteValueARM_OpGeq16_0(v *Value) bool { } func rewriteValueARM_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -18792,7 +18638,6 @@ func rewriteValueARM_OpGeq16U_0(v *Value) bool { } func rewriteValueARM_OpGeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32 x y) // cond: // result: (GreaterEqual (CMP x y)) @@ -18810,7 +18655,6 @@ func rewriteValueARM_OpGeq32_0(v *Value) bool { } func rewriteValueARM_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (GreaterEqual (CMPF x y)) @@ -18828,7 +18672,6 @@ func rewriteValueARM_OpGeq32F_0(v *Value) bool { } func rewriteValueARM_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32U x y) // cond: // result: (GreaterEqualU (CMP x y)) @@ -18846,7 +18689,6 @@ func rewriteValueARM_OpGeq32U_0(v *Value) bool { } func rewriteValueARM_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (GreaterEqual (CMPD x y)) @@ -18864,9 +18706,7 @@ func rewriteValueARM_OpGeq64F_0(v *Value) bool { } func rewriteValueARM_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) @@ -18888,9 +18728,7 @@ func rewriteValueARM_OpGeq8_0(v *Value) bool { } func rewriteValueARM_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -18939,9 +18777,7 @@ func rewriteValueARM_OpGetClosurePtr_0(v *Value) bool { } func rewriteValueARM_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) @@ -18963,9 +18799,7 @@ func rewriteValueARM_OpGreater16_0(v *Value) bool { } func rewriteValueARM_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -18987,7 +18821,6 @@ func rewriteValueARM_OpGreater16U_0(v *Value) bool { } func rewriteValueARM_OpGreater32_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32 x y) // cond: // result: (GreaterThan (CMP x y)) @@ -19005,7 +18838,6 @@ func rewriteValueARM_OpGreater32_0(v *Value) bool { } func rewriteValueARM_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (GreaterThan (CMPF x y)) @@ -19023,7 +18855,6 @@ func rewriteValueARM_OpGreater32F_0(v *Value) bool { } func rewriteValueARM_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32U x y) // cond: // result: (GreaterThanU (CMP x y)) @@ -19041,7 +18872,6 @@ func rewriteValueARM_OpGreater32U_0(v *Value) bool { } func rewriteValueARM_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (GreaterThan (CMPD x y)) @@ -19059,9 +18889,7 @@ func rewriteValueARM_OpGreater64F_0(v *Value) bool { } func rewriteValueARM_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) @@ -19083,9 +18911,7 @@ func rewriteValueARM_OpGreater8_0(v *Value) bool { } func rewriteValueARM_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -19151,7 +18977,6 @@ func rewriteValueARM_OpInterCall_0(v *Value) bool { } func rewriteValueARM_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsInBounds idx len) // cond: // result: (LessThanU (CMP idx len)) @@ -19169,7 +18994,6 @@ func rewriteValueARM_OpIsInBounds_0(v *Value) bool { } func rewriteValueARM_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b // match: (IsNonNil ptr) // cond: // result: (NotEqual (CMPconst [0] ptr)) @@ -19185,7 +19009,6 @@ func rewriteValueARM_OpIsNonNil_0(v *Value) bool { } func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsSliceInBounds idx len) // cond: // result: (LessEqualU (CMP idx len)) @@ -19203,9 +19026,7 @@ func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueARM_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) @@ -19227,9 +19048,7 @@ func rewriteValueARM_OpLeq16_0(v *Value) bool { } func rewriteValueARM_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -19251,7 +19070,6 @@ func rewriteValueARM_OpLeq16U_0(v *Value) bool { } func rewriteValueARM_OpLeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32 x y) // cond: // result: (LessEqual (CMP x y)) @@ -19269,7 +19087,6 @@ func rewriteValueARM_OpLeq32_0(v *Value) bool { } func rewriteValueARM_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (GreaterEqual (CMPF y x)) @@ -19287,7 +19104,6 @@ func rewriteValueARM_OpLeq32F_0(v *Value) bool { } func rewriteValueARM_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32U x y) // cond: // result: (LessEqualU (CMP x y)) @@ -19305,7 +19121,6 @@ func rewriteValueARM_OpLeq32U_0(v *Value) bool { } func rewriteValueARM_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (GreaterEqual (CMPD y x)) @@ -19323,9 +19138,7 @@ func rewriteValueARM_OpLeq64F_0(v *Value) bool { } func rewriteValueARM_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) @@ -19347,9 +19160,7 @@ func rewriteValueARM_OpLeq8_0(v *Value) bool { } func rewriteValueARM_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -19371,9 +19182,7 @@ func rewriteValueARM_OpLeq8U_0(v *Value) bool { } func rewriteValueARM_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) @@ -19395,9 +19204,7 @@ func rewriteValueARM_OpLess16_0(v *Value) bool { } func rewriteValueARM_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -19419,7 +19226,6 @@ func rewriteValueARM_OpLess16U_0(v *Value) bool { } func rewriteValueARM_OpLess32_0(v *Value) bool { b := v.Block - _ = b // match: (Less32 x y) // cond: // result: (LessThan (CMP x y)) @@ -19437,7 +19243,6 @@ func rewriteValueARM_OpLess32_0(v *Value) bool { } func rewriteValueARM_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (GreaterThan (CMPF y x)) @@ -19455,7 +19260,6 @@ func rewriteValueARM_OpLess32F_0(v *Value) bool { } func rewriteValueARM_OpLess32U_0(v *Value) bool { b := v.Block - _ = b // match: (Less32U x y) // cond: // result: (LessThanU (CMP x y)) @@ -19473,7 +19277,6 @@ func rewriteValueARM_OpLess32U_0(v *Value) bool { } func rewriteValueARM_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (GreaterThan (CMPD y x)) @@ -19491,9 +19294,7 @@ func rewriteValueARM_OpLess64F_0(v *Value) bool { } func rewriteValueARM_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) @@ -19515,9 +19316,7 @@ func rewriteValueARM_OpLess8_0(v *Value) bool { } func rewriteValueARM_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -19684,9 +19483,7 @@ func rewriteValueARM_OpLocalAddr_0(v *Value) bool { } func rewriteValueARM_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -19713,7 +19510,6 @@ func rewriteValueARM_OpLsh16x16_0(v *Value) bool { } func rewriteValueARM_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x32 x y) // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) @@ -19775,9 +19571,7 @@ func rewriteValueARM_OpLsh16x64_0(v *Value) bool { } func rewriteValueARM_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: // result: (SLL x (ZeroExt8to32 y)) @@ -19795,9 +19589,7 @@ func rewriteValueARM_OpLsh16x8_0(v *Value) bool { } func rewriteValueARM_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -19824,7 +19616,6 @@ func rewriteValueARM_OpLsh32x16_0(v *Value) bool { } func rewriteValueARM_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x32 x y) // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) @@ -19886,9 +19677,7 @@ func rewriteValueARM_OpLsh32x64_0(v *Value) bool { } func rewriteValueARM_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: // result: (SLL x (ZeroExt8to32 y)) @@ -19906,9 +19695,7 @@ func rewriteValueARM_OpLsh32x8_0(v *Value) bool { } func rewriteValueARM_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -19935,7 +19722,6 @@ func rewriteValueARM_OpLsh8x16_0(v *Value) bool { } func rewriteValueARM_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x32 x y) // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) @@ -19997,9 +19783,7 @@ func rewriteValueARM_OpLsh8x64_0(v *Value) bool { } func rewriteValueARM_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: // result: (SLL x (ZeroExt8to32 y)) @@ -20017,9 +19801,7 @@ func rewriteValueARM_OpLsh8x8_0(v *Value) bool { } func rewriteValueARM_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) @@ -20039,9 +19821,7 @@ func rewriteValueARM_OpMod16_0(v *Value) bool { } func rewriteValueARM_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -20061,9 +19841,7 @@ func rewriteValueARM_OpMod16u_0(v *Value) bool { } func rewriteValueARM_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (SUB (XOR (Select1 (CALLudiv (SUB (XOR x (Signmask x)) (Signmask x)) (SUB (XOR y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) @@ -20111,9 +19889,7 @@ func rewriteValueARM_OpMod32_0(v *Value) bool { } func rewriteValueARM_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (Select1 (CALLudiv x y)) @@ -20132,9 +19908,7 @@ func rewriteValueARM_OpMod32u_0(v *Value) bool { } func rewriteValueARM_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) @@ -20154,9 +19928,7 @@ func rewriteValueARM_OpMod8_0(v *Value) bool { } func rewriteValueARM_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -20176,11 +19948,8 @@ func rewriteValueARM_OpMod8u_0(v *Value) bool { } func rewriteValueARM_OpMove_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -20600,9 +20369,7 @@ func rewriteValueARM_OpNeg8_0(v *Value) bool { } func rewriteValueARM_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -20624,7 +20391,6 @@ func rewriteValueARM_OpNeq16_0(v *Value) bool { } func rewriteValueARM_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x y) // cond: // result: (NotEqual (CMP x y)) @@ -20642,7 +20408,6 @@ func rewriteValueARM_OpNeq32_0(v *Value) bool { } func rewriteValueARM_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (NotEqual (CMPF x y)) @@ -20660,7 +20425,6 @@ func rewriteValueARM_OpNeq32F_0(v *Value) bool { } func rewriteValueARM_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (NotEqual (CMPD x y)) @@ -20678,9 +20442,7 @@ func rewriteValueARM_OpNeq64F_0(v *Value) bool { } func rewriteValueARM_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -20716,7 +20478,6 @@ func rewriteValueARM_OpNeqB_0(v *Value) bool { } func rewriteValueARM_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (NeqPtr x y) // cond: // result: (NotEqual (CMP x y)) @@ -20867,9 +20628,7 @@ func rewriteValueARM_OpRound64F_0(v *Value) bool { } func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: // result: (CMOVWHSconst (SRL (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -20898,9 +20657,7 @@ func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: // result: (CMOVWHSconst (SRL (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) @@ -20925,9 +20682,7 @@ func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x (Const64 [c])) // cond: uint64(c) < 16 // result: (SRLconst (SLLconst x [16]) [c+16]) @@ -20971,9 +20726,7 @@ func rewriteValueARM_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) @@ -20993,9 +20746,7 @@ func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueARM_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) @@ -21021,9 +20772,7 @@ func rewriteValueARM_OpRsh16x16_0(v *Value) bool { } func rewriteValueARM_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) @@ -21045,9 +20794,7 @@ func rewriteValueARM_OpRsh16x32_0(v *Value) bool { } func rewriteValueARM_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x (Const64 [c])) // cond: uint64(c) < 16 // result: (SRAconst (SLLconst x [16]) [c+16]) @@ -21096,9 +20843,7 @@ func rewriteValueARM_OpRsh16x64_0(v *Value) bool { } func rewriteValueARM_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) @@ -21118,9 +20863,7 @@ func rewriteValueARM_OpRsh16x8_0(v *Value) bool { } func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: // result: (CMOVWHSconst (SRL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -21147,7 +20890,6 @@ func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux32 x y) // cond: // result: (CMOVWHSconst (SRL x y) (CMPconst [256] y) [0]) @@ -21209,9 +20951,7 @@ func rewriteValueARM_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: // result: (SRL x (ZeroExt8to32 y)) @@ -21229,9 +20969,7 @@ func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueARM_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) @@ -21255,7 +20993,6 @@ func rewriteValueARM_OpRsh32x16_0(v *Value) bool { } func rewriteValueARM_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x32 x y) // cond: // result: (SRAcond x y (CMPconst [256] y)) @@ -21316,9 +21053,7 @@ func rewriteValueARM_OpRsh32x64_0(v *Value) bool { } func rewriteValueARM_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: // result: (SRA x (ZeroExt8to32 y)) @@ -21336,9 +21071,7 @@ func rewriteValueARM_OpRsh32x8_0(v *Value) bool { } func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: // result: (CMOVWHSconst (SRL (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) @@ -21367,9 +21100,7 @@ func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: // result: (CMOVWHSconst (SRL (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) @@ -21394,9 +21125,7 @@ func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x (Const64 [c])) // cond: uint64(c) < 8 // result: (SRLconst (SLLconst x [24]) [c+24]) @@ -21440,9 +21169,7 @@ func rewriteValueARM_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -21462,9 +21189,7 @@ func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueARM_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) @@ -21490,9 +21215,7 @@ func rewriteValueARM_OpRsh8x16_0(v *Value) bool { } func rewriteValueARM_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) @@ -21514,9 +21237,7 @@ func rewriteValueARM_OpRsh8x32_0(v *Value) bool { } func rewriteValueARM_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x (Const64 [c])) // cond: uint64(c) < 8 // result: (SRAconst (SLLconst x [24]) [c+24]) @@ -21565,9 +21286,7 @@ func rewriteValueARM_OpRsh8x64_0(v *Value) bool { } func rewriteValueARM_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) @@ -21772,7 +21491,6 @@ func rewriteValueARM_OpSignmask_0(v *Value) bool { } func rewriteValueARM_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRAconst (RSBconst [0] x) [31]) @@ -22119,11 +21837,8 @@ func rewriteValueARM_OpXor8_0(v *Value) bool { } func rewriteValueARM_OpZero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -22412,9 +22127,7 @@ func rewriteValueARM_OpZeroExt8to32_0(v *Value) bool { } func rewriteValueARM_OpZeromask_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zeromask x) // cond: // result: (SRAconst (RSBshiftRL x x [1]) [31]) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index a8acb4fec8..63e87880e8 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -1159,9 +1159,7 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { } func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADD x (NEG y)) // cond: // result: (SUB x y) @@ -1550,9 +1548,7 @@ func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { } func rewriteValueARM64_OpARM64ADD_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADD (SRL x (ANDconst [63] y)) (CSEL0 {cc} (SLL x (SUB (MOVDconst [64]) (ANDconst [63] y))) (CMPconst [64] (SUB (MOVDconst [64]) (ANDconst [63] y))))) // cond: cc.(Op) == OpARM64LessThanU // result: (ROR x y) @@ -2323,9 +2319,7 @@ func rewriteValueARM64_OpARM64ADDconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADDshiftLL (MOVDconst [c]) x [d]) // cond: // result: (ADDconst [c] (SLLconst x [d])) @@ -2486,7 +2480,6 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRA (MOVDconst [c]) x [d]) // cond: // result: (ADDconst [c] (SRAconst x [d])) @@ -2528,7 +2521,6 @@ func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ADDshiftRL (MOVDconst [c]) x [d]) // cond: // result: (ADDconst [c] (SRLconst x [d])) @@ -2972,7 +2964,6 @@ func rewriteValueARM64_OpARM64ANDconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64ANDshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftLL (MOVDconst [c]) x [d]) // cond: // result: (ANDconst [c] (SLLconst x [d])) @@ -3037,7 +3028,6 @@ func rewriteValueARM64_OpARM64ANDshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRA (MOVDconst [c]) x [d]) // cond: // result: (ANDconst [c] (SRAconst x [d])) @@ -3102,7 +3092,6 @@ func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64ANDshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ANDshiftRL (MOVDconst [c]) x [d]) // cond: // result: (ANDconst [c] (SRLconst x [d])) @@ -3750,7 +3739,6 @@ func rewriteValueARM64_OpARM64CMNconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMNshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftLL (MOVDconst [c]) x [d]) // cond: // result: (CMNconst [c] (SLLconst x [d])) @@ -3792,7 +3780,6 @@ func rewriteValueARM64_OpARM64CMNshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRA (MOVDconst [c]) x [d]) // cond: // result: (CMNconst [c] (SRAconst x [d])) @@ -3834,7 +3821,6 @@ func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (CMNshiftRL (MOVDconst [c]) x [d]) // cond: // result: (CMNconst [c] (SRLconst x [d])) @@ -3876,7 +3862,6 @@ func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { b := v.Block - _ = b // match: (CMP x (MOVDconst [c])) // cond: // result: (CMPconst [c] x) @@ -4047,7 +4032,6 @@ func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMPW_0(v *Value) bool { b := v.Block - _ = b // match: (CMPW x (MOVDconst [c])) // cond: // result: (CMPWconst [int64(int32(c))] x) @@ -4359,7 +4343,6 @@ func rewriteValueARM64_OpARM64CMPconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMPshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftLL (MOVDconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) @@ -4403,7 +4386,6 @@ func rewriteValueARM64_OpARM64CMPshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMPshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRA (MOVDconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SRAconst x [d]))) @@ -4447,7 +4429,6 @@ func rewriteValueARM64_OpARM64CMPshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64CMPshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (CMPshiftRL (MOVDconst [c]) x [d]) // cond: // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) @@ -5238,7 +5219,6 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { } func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { b := v.Block - _ = b // match: (FCMPD x (FMOVDconst [0])) // cond: // result: (FCMPD0 x) @@ -5279,7 +5259,6 @@ func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { } func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { b := v.Block - _ = b // match: (FCMPS x (FMOVSconst [0])) // cond: // result: (FCMPS0 x) @@ -5320,7 +5299,6 @@ func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVDfpgp_0(v *Value) bool { b := v.Block - _ = b // match: (FMOVDfpgp (Arg [off] {sym})) // cond: // result: @b.Func.Entry (Arg [off] {sym}) @@ -5344,7 +5322,6 @@ func rewriteValueARM64_OpARM64FMOVDfpgp_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVDgpfp_0(v *Value) bool { b := v.Block - _ = b // match: (FMOVDgpfp (Arg [off] {sym})) // cond: // result: @b.Func.Entry (Arg [off] {sym}) @@ -5368,9 +5345,7 @@ func rewriteValueARM64_OpARM64FMOVDgpfp_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (FMOVDload [off] {sym} ptr (MOVDstore [off] {sym} ptr val _)) // cond: // result: (FMOVDgpfp val) @@ -5514,9 +5489,7 @@ func rewriteValueARM64_OpARM64FMOVDloadidx_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (FMOVDstore [off] {sym} ptr (FMOVDgpfp val) mem) // cond: // result: (MOVDstore [off] {sym} ptr val mem) @@ -5665,9 +5638,7 @@ func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (FMOVSload [off] {sym} ptr (MOVWstore [off] {sym} ptr val _)) // cond: // result: (FMOVSgpfp val) @@ -5811,9 +5782,7 @@ func rewriteValueARM64_OpARM64FMOVSloadidx_0(v *Value) bool { } func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (FMOVSstore [off] {sym} ptr (FMOVSgpfp val) mem) // cond: // result: (MOVWstore [off] {sym} ptr val mem) @@ -7002,7 +6971,6 @@ func rewriteValueARM64_OpARM64LessThanU_0(v *Value) bool { } func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { b := v.Block - _ = b // match: (MADD a x (MOVDconst [-1])) // cond: // result: (SUB a x) @@ -7232,7 +7200,6 @@ func rewriteValueARM64_OpARM64MADD_0(v *Value) bool { } func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { b := v.Block - _ = b // match: (MADD a (MOVDconst [-1]) x) // cond: // result: (SUB a x) @@ -7462,7 +7429,6 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { } func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { b := v.Block - _ = b // match: (MADD (MOVDconst [c]) x y) // cond: // result: (ADDconst [c] (MUL x y)) @@ -7508,7 +7474,6 @@ func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { } func rewriteValueARM64_OpARM64MADDW_0(v *Value) bool { b := v.Block - _ = b // match: (MADDW a x (MOVDconst [c])) // cond: int32(c)==-1 // result: (SUB a x) @@ -7741,7 +7706,6 @@ func rewriteValueARM64_OpARM64MADDW_0(v *Value) bool { } func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { b := v.Block - _ = b // match: (MADDW a (MOVDconst [c]) x) // cond: int32(c)==-1 // result: (SUB a x) @@ -7974,7 +7938,6 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { } func rewriteValueARM64_OpARM64MADDW_20(v *Value) bool { b := v.Block - _ = b // match: (MADDW (MOVDconst [c]) x y) // cond: // result: (ADDconst [c] (MULW x y)) @@ -8020,7 +7983,6 @@ func rewriteValueARM64_OpARM64MADDW_20(v *Value) bool { } func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { b := v.Block - _ = b // match: (MNEG x (MOVDconst [-1])) // cond: // result: x @@ -8213,7 +8175,6 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { } func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { b := v.Block - _ = b // match: (MNEG x (MOVDconst [c])) // cond: isPowerOfTwo(c+1) && c >= 7 // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) @@ -8503,7 +8464,6 @@ func rewriteValueARM64_OpARM64MNEG_20(v *Value) bool { } func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { b := v.Block - _ = b // match: (MNEGW x (MOVDconst [c])) // cond: int32(c)==-1 // result: x @@ -8702,7 +8662,6 @@ func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { } func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { b := v.Block - _ = b // match: (MNEGW x (MOVDconst [c])) // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) @@ -9036,9 +8995,7 @@ func rewriteValueARM64_OpARM64MODW_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBUload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVBUload [off1+off2] {sym} ptr mem) @@ -9334,9 +9291,7 @@ func rewriteValueARM64_OpARM64MOVBUreg_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVBload [off1+off2] {sym} ptr mem) @@ -9569,9 +9524,7 @@ func rewriteValueARM64_OpARM64MOVBreg_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVBstore [off1+off2] {sym} ptr val mem) @@ -10271,7 +10224,6 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { b := v.Block - _ = b // match: (MOVBstore [i] {s} ptr0 (UBFX [bfc] w) x:(MOVBstore [i-1] {s} ptr1 w0:(UBFX [bfc2] w) mem)) // cond: x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32 - getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32 - getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc) - 8 && clobber(x) // result: (MOVHstore [i-1] {s} ptr0 w0 mem) @@ -11264,7 +11216,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { b := v.Block - _ = b // match: (MOVBstore [i] {s} ptr w x0:(MOVBstore [i-1] {s} ptr (SRLconst [8] w) x1:(MOVBstore [i-2] {s} ptr (SRLconst [16] w) x2:(MOVBstore [i-3] {s} ptr (SRLconst [24] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstore [i-3] {s} ptr (REVW w) mem) @@ -11841,7 +11792,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { b := v.Block - _ = b // match: (MOVBstore [i] {s} ptr w x:(MOVBstore [i-1] {s} ptr (SRLconst [8] (MOVDreg w)) mem)) // cond: x.Uses == 1 && clobber(x) // result: (MOVHstore [i-1] {s} ptr (REV16W w) mem) @@ -12179,7 +12129,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { b := v.Block - _ = b // match: (MOVBstoreidx ptr (ADDconst [3] idx) w x0:(MOVBstoreidx ptr (ADDconst [2] idx) (UBFX [armBFAuxInt(8, 24)] w) x1:(MOVBstoreidx ptr (ADDconst [1] idx) (UBFX [armBFAuxInt(16, 16)] w) x2:(MOVBstoreidx ptr idx (UBFX [armBFAuxInt(24, 8)] w) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) // result: (MOVWstoreidx ptr idx (REVW w) mem) @@ -12488,9 +12437,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVBstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVBstorezero [off1+off2] {sym} ptr mem) @@ -12704,9 +12651,7 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVDload [off] {sym} ptr (FMOVDstore [off] {sym} ptr val _)) // cond: // result: (FMOVDfpgp val) @@ -13051,9 +12996,7 @@ func rewriteValueARM64_OpARM64MOVDreg_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVDstore [off] {sym} ptr (FMOVDfpgp val) mem) // cond: // result: (FMOVDstore [off] {sym} ptr val mem) @@ -13365,9 +13308,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVDstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVDstorezero [off1+off2] {sym} ptr mem) @@ -13674,9 +13615,7 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx8_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHUload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVHUload [off1+off2] {sym} ptr mem) @@ -14148,9 +14087,7 @@ func rewriteValueARM64_OpARM64MOVHUreg_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVHload [off1+off2] {sym} ptr mem) @@ -14609,9 +14546,7 @@ func rewriteValueARM64_OpARM64MOVHreg_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHstore [off1] {sym} (ADDconst [off2] ptr) val mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVHstore [off1+off2] {sym} ptr val mem) @@ -14878,7 +14813,6 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { b := v.Block - _ = b // match: (MOVHstore [2] {s} (ADD ptr0 idx0) (SRLconst [16] w) x:(MOVHstoreidx ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x) // result: (MOVWstoreidx ptr1 idx1 w mem) @@ -15367,7 +15301,6 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { b := v.Block - _ = b // match: (MOVHstore [2] {s} (ADDshiftLL [1] ptr0 idx0) (SRLconst [j] w) x:(MOVHstoreidx2 ptr1 idx1 w0:(SRLconst [j-16] w) mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVWstoreidx ptr1 (SLLconst [1] idx1) w0 mem) @@ -15840,9 +15773,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVHstorezero [off1+off2] {sym} ptr mem) @@ -16229,9 +16160,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx2_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVQstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVQstorezero [off1+off2] {sym} ptr mem) @@ -16285,9 +16214,7 @@ func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWUload [off] {sym} ptr (FMOVSstore [off] {sym} ptr val _)) // cond: // result: (FMOVSfpgp val) @@ -16814,9 +16741,7 @@ func rewriteValueARM64_OpARM64MOVWUreg_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWload [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVWload [off1+off2] {sym} ptr mem) @@ -17354,9 +17279,7 @@ func rewriteValueARM64_OpARM64MOVWreg_10(v *Value) bool { } func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWstore [off] {sym} ptr (FMOVSfpgp val) mem) // cond: // result: (FMOVSstore [off] {sym} ptr val mem) @@ -17646,7 +17569,6 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { b := v.Block - _ = b // match: (MOVWstore [4] {s} (ADDshiftLL [2] ptr0 idx0) (SRLconst [32] w) x:(MOVWstoreidx4 ptr1 idx1 w mem)) // cond: x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x) // result: (MOVDstoreidx ptr1 (SLLconst [2] idx1) w mem) @@ -18137,9 +18059,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { } func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVWstorezero [off1] {sym} (ADDconst [off2] ptr) mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (MOVWstorezero [off1+off2] {sym} ptr mem) @@ -18482,7 +18402,6 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx4_0(v *Value) bool { } func rewriteValueARM64_OpARM64MSUB_0(v *Value) bool { b := v.Block - _ = b // match: (MSUB a x (MOVDconst [-1])) // cond: // result: (ADD a x) @@ -18712,7 +18631,6 @@ func rewriteValueARM64_OpARM64MSUB_0(v *Value) bool { } func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { b := v.Block - _ = b // match: (MSUB a (MOVDconst [-1]) x) // cond: // result: (ADD a x) @@ -18942,7 +18860,6 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { } func rewriteValueARM64_OpARM64MSUB_20(v *Value) bool { b := v.Block - _ = b // match: (MSUB (MOVDconst [c]) x y) // cond: // result: (ADDconst [c] (MNEG x y)) @@ -18988,7 +18905,6 @@ func rewriteValueARM64_OpARM64MSUB_20(v *Value) bool { } func rewriteValueARM64_OpARM64MSUBW_0(v *Value) bool { b := v.Block - _ = b // match: (MSUBW a x (MOVDconst [c])) // cond: int32(c)==-1 // result: (ADD a x) @@ -19221,7 +19137,6 @@ func rewriteValueARM64_OpARM64MSUBW_0(v *Value) bool { } func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { b := v.Block - _ = b // match: (MSUBW a (MOVDconst [c]) x) // cond: int32(c)==-1 // result: (ADD a x) @@ -19454,7 +19369,6 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { } func rewriteValueARM64_OpARM64MSUBW_20(v *Value) bool { b := v.Block - _ = b // match: (MSUBW (MOVDconst [c]) x y) // cond: // result: (ADDconst [c] (MNEGW x y)) @@ -19675,7 +19589,6 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { } func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { b := v.Block - _ = b // match: (MUL x (MOVDconst [c])) // cond: isPowerOfTwo(c-1) && c >= 3 // result: (ADDshiftLL x x [log2(c-1)]) @@ -19906,7 +19819,6 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { } func rewriteValueARM64_OpARM64MUL_20(v *Value) bool { b := v.Block - _ = b // match: (MUL x (MOVDconst [c])) // cond: c%9 == 0 && isPowerOfTwo(c/9) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) @@ -20176,7 +20088,6 @@ func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { } func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { b := v.Block - _ = b // match: (MULW x (MOVDconst [c])) // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (ADDshiftLL x x [log2(c-1)]) @@ -20407,7 +20318,6 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { } func rewriteValueARM64_OpARM64MULW_20(v *Value) bool { b := v.Block - _ = b // match: (MULW x (MOVDconst [c])) // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) @@ -21032,9 +20942,7 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { } func rewriteValueARM64_OpARM64OR_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR x1:(SRAconst [c] y) x0) // cond: clobberIfDead(x1) // result: (ORshiftRA x0 y [c]) @@ -21998,7 +21906,6 @@ func rewriteValueARM64_OpARM64OR_10(v *Value) bool { } func rewriteValueARM64_OpARM64OR_20(v *Value) bool { b := v.Block - _ = b // match: (OR (ANDconst [ac] y) (UBFIZ [bfc] x)) // cond: ac == ^((1< y7:(MOVDnop x7:(MOVBUload [i0] {s} p mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] o2:(ORshiftLL [24] o3:(ORshiftLL [32] o4:(ORshiftLL [40] o5:(ORshiftLL [48] s0:(SLLconst [56] y0:(MOVDnop x0:(MOVBUload [i7] {s} p mem))) y1:(MOVDnop x1:(MOVBUload [i6] {s} p mem))) y2:(MOVDnop x2:(MOVBUload [i5] {s} p mem))) y3:(MOVDnop x3:(MOVBUload [i4] {s} p mem))) y4:(MOVDnop x4:(MOVBUload [i3] {s} p mem))) y5:(MOVDnop x5:(MOVBUload [i2] {s} p mem))) y6:(MOVDnop x6:(MOVBUload [i1] {s} p mem)))) // cond: i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && y4.Uses == 1 && y5.Uses == 1 && y6.Uses == 1 && y7.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(y4) && clobber(y5) && clobber(y6) && clobber(y7) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) // result: @mergePoint(b,x0,x1,x2,x3,x4,x5,x6,x7) (MOVDload {s} (OffPtr [i0] p) mem) @@ -24828,7 +24734,6 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { } func rewriteValueARM64_OpARM64OR_40(v *Value) bool { b := v.Block - _ = b // match: (OR y3:(MOVDnop x3:(MOVBUloadidx ptr (ADDconst [3] idx) mem)) o0:(ORshiftLL [8] o1:(ORshiftLL [16] s0:(SLLconst [24] y0:(MOVDnop x0:(MOVBUloadidx ptr idx mem))) y1:(MOVDnop x1:(MOVBUloadidx ptr (ADDconst [1] idx) mem))) y2:(MOVDnop x2:(MOVBUloadidx ptr (ADDconst [2] idx) mem)))) // cond: x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && y2.Uses == 1 && y3.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && s0.Uses == 1 && mergePoint(b,x0,x1,x2,x3) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(y0) && clobber(y1) && clobber(y2) && clobber(y3) && clobber(o0) && clobber(o1) && clobber(s0) // result: @mergePoint(b,x0,x1,x2,x3) (REVW (MOVWUloadidx ptr idx mem)) @@ -26700,9 +26605,7 @@ func rewriteValueARM64_OpARM64ORconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORshiftLL (MOVDconst [c]) x [d]) // cond: // result: (ORconst [c] (SLLconst x [d])) @@ -26971,7 +26874,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { b := v.Block - _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUloadidx ptr0 idx0 mem)) y1:(MOVDnop x1:(MOVBUload [1] {s} p1:(ADD ptr1 idx1) mem))) // cond: s == nil && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (MOVHUloadidx ptr0 idx0 mem) @@ -27986,7 +27888,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { } func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { b := v.Block - _ = b // match: (ORshiftLL [8] y0:(MOVDnop x0:(MOVBUload [i1] {s} p mem)) y1:(MOVDnop x1:(MOVBUload [i0] {s} p mem))) // cond: i1 == i0+1 && x0.Uses == 1 && x1.Uses == 1 && y0.Uses == 1 && y1.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(y0) && clobber(y1) // result: @mergePoint(b,x0,x1) (REV16W (MOVHUload [i0] {s} p mem)) @@ -28869,7 +28770,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { } func rewriteValueARM64_OpARM64ORshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRA (MOVDconst [c]) x [d]) // cond: // result: (ORconst [c] (SRAconst x [d])) @@ -28934,7 +28834,6 @@ func rewriteValueARM64_OpARM64ORshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (ORshiftRL (MOVDconst [c]) x [d]) // cond: // result: (ORconst [c] (SRLconst x [d])) @@ -29678,9 +29577,7 @@ func rewriteValueARM64_OpARM64SRLconst_10(v *Value) bool { } func rewriteValueARM64_OpARM64STP_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (STP [off1] {sym} (ADDconst [off2] ptr) val1 val2 mem) // cond: is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared) // result: (STP [off1+off2] {sym} ptr val1 val2 mem) @@ -29772,7 +29669,6 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { } func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { b := v.Block - _ = b // match: (SUB x (MOVDconst [c])) // cond: // result: (SUBconst [c] x) @@ -30488,7 +30384,6 @@ func rewriteValueARM64_OpARM64TSTconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64TSTshiftLL_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftLL (MOVDconst [c]) x [d]) // cond: // result: (TSTconst [c] (SLLconst x [d])) @@ -30530,7 +30425,6 @@ func rewriteValueARM64_OpARM64TSTshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64TSTshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRA (MOVDconst [c]) x [d]) // cond: // result: (TSTconst [c] (SRAconst x [d])) @@ -30572,7 +30466,6 @@ func rewriteValueARM64_OpARM64TSTshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64TSTshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (TSTshiftRL (MOVDconst [c]) x [d]) // cond: // result: (TSTconst [c] (SRLconst x [d])) @@ -30834,9 +30727,7 @@ func rewriteValueARM64_OpARM64UDIVW_0(v *Value) bool { } func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (UMOD x y) // cond: // result: (MSUB x y (UDIV x y)) @@ -30915,9 +30806,7 @@ func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { } func rewriteValueARM64_OpARM64UMODW_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (UMODW x y) // cond: // result: (MSUBW x y (UDIVW x y)) @@ -31182,9 +31071,7 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { } func rewriteValueARM64_OpARM64XOR_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XOR x1:(SRAconst [c] y) x0) // cond: clobberIfDead(x1) // result: (XORshiftRA x0 y [c]) @@ -32180,9 +32067,7 @@ func rewriteValueARM64_OpARM64XORconst_0(v *Value) bool { } func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XORshiftLL (MOVDconst [c]) x [d]) // cond: // result: (XORconst [c] (SLLconst x [d])) @@ -32365,7 +32250,6 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { } func rewriteValueARM64_OpARM64XORshiftRA_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRA (MOVDconst [c]) x [d]) // cond: // result: (XORconst [c] (SRAconst x [d])) @@ -32429,7 +32313,6 @@ func rewriteValueARM64_OpARM64XORshiftRA_0(v *Value) bool { } func rewriteValueARM64_OpARM64XORshiftRL_0(v *Value) bool { b := v.Block - _ = b // match: (XORshiftRL (MOVDconst [c]) x [d]) // cond: // result: (XORconst [c] (SRLconst x [d])) @@ -32801,9 +32684,7 @@ func rewriteValueARM64_OpAtomicAdd64Variant_0(v *Value) bool { } func rewriteValueARM64_OpAtomicAnd8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicAnd8 ptr val mem) // cond: // result: (Select1 (LoweredAtomicAnd8 ptr val mem)) @@ -32933,9 +32814,7 @@ func rewriteValueARM64_OpAtomicLoadPtr_0(v *Value) bool { } func rewriteValueARM64_OpAtomicOr8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicOr8 ptr val mem) // cond: // result: (Select1 (LoweredAtomicOr8 ptr val mem)) @@ -33003,7 +32882,6 @@ func rewriteValueARM64_OpAtomicStorePtrNoWB_0(v *Value) bool { } func rewriteValueARM64_OpAvg64u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg64u x y) // cond: // result: (ADD (SRLconst (SUB x y) [1]) y) @@ -33026,9 +32904,7 @@ func rewriteValueARM64_OpAvg64u_0(v *Value) bool { } func rewriteValueARM64_OpBitLen32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen32 x) // cond: // result: (SUB (MOVDconst [32]) (CLZW x)) @@ -33046,9 +32922,7 @@ func rewriteValueARM64_OpBitLen32_0(v *Value) bool { } func rewriteValueARM64_OpBitLen64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen64 x) // cond: // result: (SUB (MOVDconst [64]) (CLZ x)) @@ -33066,9 +32940,7 @@ func rewriteValueARM64_OpBitLen64_0(v *Value) bool { } func rewriteValueARM64_OpBitRev16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitRev16 x) // cond: // result: (SRLconst [48] (RBIT x)) @@ -33106,9 +32978,7 @@ func rewriteValueARM64_OpBitRev64_0(v *Value) bool { } func rewriteValueARM64_OpBitRev8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitRev8 x) // cond: // result: (SRLconst [56] (RBIT x)) @@ -33219,7 +33089,6 @@ func rewriteValueARM64_OpCom8_0(v *Value) bool { } func rewriteValueARM64_OpCondSelect_0(v *Value) bool { b := v.Block - _ = b // match: (CondSelect x y bool) // cond: flagArg(bool) != nil // result: (CSEL {bool.Op} x y flagArg(bool)) @@ -33350,9 +33219,7 @@ func rewriteValueARM64_OpConstNil_0(v *Value) bool { } func rewriteValueARM64_OpCtz16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz16 x) // cond: // result: (CLZW (RBITW (ORconst [0x10000] x))) @@ -33383,7 +33250,6 @@ func rewriteValueARM64_OpCtz16NonZero_0(v *Value) bool { } func rewriteValueARM64_OpCtz32_0(v *Value) bool { b := v.Block - _ = b // match: (Ctz32 x) // cond: // result: (CLZW (RBITW x)) @@ -33410,7 +33276,6 @@ func rewriteValueARM64_OpCtz32NonZero_0(v *Value) bool { } func rewriteValueARM64_OpCtz64_0(v *Value) bool { b := v.Block - _ = b // match: (Ctz64 x) // cond: // result: (CLZ (RBIT x)) @@ -33437,9 +33302,7 @@ func rewriteValueARM64_OpCtz64NonZero_0(v *Value) bool { } func rewriteValueARM64_OpCtz8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz8 x) // cond: // result: (CLZW (RBITW (ORconst [0x100] x))) @@ -33668,9 +33531,7 @@ func rewriteValueARM64_OpCvt64to64F_0(v *Value) bool { } func rewriteValueARM64_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) @@ -33690,9 +33551,7 @@ func rewriteValueARM64_OpDiv16_0(v *Value) bool { } func rewriteValueARM64_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -33796,9 +33655,7 @@ func rewriteValueARM64_OpDiv64u_0(v *Value) bool { } func rewriteValueARM64_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) @@ -33818,9 +33675,7 @@ func rewriteValueARM64_OpDiv8_0(v *Value) bool { } func rewriteValueARM64_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -33840,9 +33695,7 @@ func rewriteValueARM64_OpDiv8u_0(v *Value) bool { } func rewriteValueARM64_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -33864,7 +33717,6 @@ func rewriteValueARM64_OpEq16_0(v *Value) bool { } func rewriteValueARM64_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x y) // cond: // result: (Equal (CMPW x y)) @@ -33882,7 +33734,6 @@ func rewriteValueARM64_OpEq32_0(v *Value) bool { } func rewriteValueARM64_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (Equal (FCMPS x y)) @@ -33900,7 +33751,6 @@ func rewriteValueARM64_OpEq32F_0(v *Value) bool { } func rewriteValueARM64_OpEq64_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64 x y) // cond: // result: (Equal (CMP x y)) @@ -33918,7 +33768,6 @@ func rewriteValueARM64_OpEq64_0(v *Value) bool { } func rewriteValueARM64_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (Equal (FCMPD x y)) @@ -33936,9 +33785,7 @@ func rewriteValueARM64_OpEq64F_0(v *Value) bool { } func rewriteValueARM64_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -33960,9 +33807,7 @@ func rewriteValueARM64_OpEq8_0(v *Value) bool { } func rewriteValueARM64_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (XOR (MOVDconst [1]) (XOR x y)) @@ -33983,7 +33828,6 @@ func rewriteValueARM64_OpEqB_0(v *Value) bool { } func rewriteValueARM64_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (EqPtr x y) // cond: // result: (Equal (CMP x y)) @@ -34012,9 +33856,7 @@ func rewriteValueARM64_OpFloor_0(v *Value) bool { } func rewriteValueARM64_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -34036,9 +33878,7 @@ func rewriteValueARM64_OpGeq16_0(v *Value) bool { } func rewriteValueARM64_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -34060,7 +33900,6 @@ func rewriteValueARM64_OpGeq16U_0(v *Value) bool { } func rewriteValueARM64_OpGeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32 x y) // cond: // result: (GreaterEqual (CMPW x y)) @@ -34078,7 +33917,6 @@ func rewriteValueARM64_OpGeq32_0(v *Value) bool { } func rewriteValueARM64_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (GreaterEqualF (FCMPS x y)) @@ -34096,7 +33934,6 @@ func rewriteValueARM64_OpGeq32F_0(v *Value) bool { } func rewriteValueARM64_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32U x y) // cond: // result: (GreaterEqualU (CMPW x y)) @@ -34114,7 +33951,6 @@ func rewriteValueARM64_OpGeq32U_0(v *Value) bool { } func rewriteValueARM64_OpGeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64 x y) // cond: // result: (GreaterEqual (CMP x y)) @@ -34132,7 +33968,6 @@ func rewriteValueARM64_OpGeq64_0(v *Value) bool { } func rewriteValueARM64_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (GreaterEqualF (FCMPD x y)) @@ -34150,7 +33985,6 @@ func rewriteValueARM64_OpGeq64F_0(v *Value) bool { } func rewriteValueARM64_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64U x y) // cond: // result: (GreaterEqualU (CMP x y)) @@ -34168,9 +34002,7 @@ func rewriteValueARM64_OpGeq64U_0(v *Value) bool { } func rewriteValueARM64_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -34192,9 +34024,7 @@ func rewriteValueARM64_OpGeq8_0(v *Value) bool { } func rewriteValueARM64_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -34243,9 +34073,7 @@ func rewriteValueARM64_OpGetClosurePtr_0(v *Value) bool { } func rewriteValueARM64_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -34267,9 +34095,7 @@ func rewriteValueARM64_OpGreater16_0(v *Value) bool { } func rewriteValueARM64_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -34291,7 +34117,6 @@ func rewriteValueARM64_OpGreater16U_0(v *Value) bool { } func rewriteValueARM64_OpGreater32_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32 x y) // cond: // result: (GreaterThan (CMPW x y)) @@ -34309,7 +34134,6 @@ func rewriteValueARM64_OpGreater32_0(v *Value) bool { } func rewriteValueARM64_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (GreaterThanF (FCMPS x y)) @@ -34327,7 +34151,6 @@ func rewriteValueARM64_OpGreater32F_0(v *Value) bool { } func rewriteValueARM64_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32U x y) // cond: // result: (GreaterThanU (CMPW x y)) @@ -34345,7 +34168,6 @@ func rewriteValueARM64_OpGreater32U_0(v *Value) bool { } func rewriteValueARM64_OpGreater64_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64 x y) // cond: // result: (GreaterThan (CMP x y)) @@ -34363,7 +34185,6 @@ func rewriteValueARM64_OpGreater64_0(v *Value) bool { } func rewriteValueARM64_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (GreaterThanF (FCMPD x y)) @@ -34381,7 +34202,6 @@ func rewriteValueARM64_OpGreater64F_0(v *Value) bool { } func rewriteValueARM64_OpGreater64U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64U x y) // cond: // result: (GreaterThanU (CMP x y)) @@ -34399,9 +34219,7 @@ func rewriteValueARM64_OpGreater64U_0(v *Value) bool { } func rewriteValueARM64_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -34423,9 +34241,7 @@ func rewriteValueARM64_OpGreater8_0(v *Value) bool { } func rewriteValueARM64_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -34447,9 +34263,7 @@ func rewriteValueARM64_OpGreater8U_0(v *Value) bool { } func rewriteValueARM64_OpHmul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32 x y) // cond: // result: (SRAconst (MULL x y) [32]) @@ -34468,9 +34282,7 @@ func rewriteValueARM64_OpHmul32_0(v *Value) bool { } func rewriteValueARM64_OpHmul32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32u x y) // cond: // result: (SRAconst (UMULL x y) [32]) @@ -34533,7 +34345,6 @@ func rewriteValueARM64_OpInterCall_0(v *Value) bool { } func rewriteValueARM64_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsInBounds idx len) // cond: // result: (LessThanU (CMP idx len)) @@ -34551,7 +34362,6 @@ func rewriteValueARM64_OpIsInBounds_0(v *Value) bool { } func rewriteValueARM64_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b // match: (IsNonNil ptr) // cond: // result: (NotEqual (CMPconst [0] ptr)) @@ -34567,7 +34377,6 @@ func rewriteValueARM64_OpIsNonNil_0(v *Value) bool { } func rewriteValueARM64_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsSliceInBounds idx len) // cond: // result: (LessEqualU (CMP idx len)) @@ -34585,9 +34394,7 @@ func rewriteValueARM64_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueARM64_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -34609,9 +34416,7 @@ func rewriteValueARM64_OpLeq16_0(v *Value) bool { } func rewriteValueARM64_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -34633,7 +34438,6 @@ func rewriteValueARM64_OpLeq16U_0(v *Value) bool { } func rewriteValueARM64_OpLeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32 x y) // cond: // result: (LessEqual (CMPW x y)) @@ -34651,7 +34455,6 @@ func rewriteValueARM64_OpLeq32_0(v *Value) bool { } func rewriteValueARM64_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (LessEqualF (FCMPS x y)) @@ -34669,7 +34472,6 @@ func rewriteValueARM64_OpLeq32F_0(v *Value) bool { } func rewriteValueARM64_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32U x y) // cond: // result: (LessEqualU (CMPW x y)) @@ -34687,7 +34489,6 @@ func rewriteValueARM64_OpLeq32U_0(v *Value) bool { } func rewriteValueARM64_OpLeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64 x y) // cond: // result: (LessEqual (CMP x y)) @@ -34705,7 +34506,6 @@ func rewriteValueARM64_OpLeq64_0(v *Value) bool { } func rewriteValueARM64_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (LessEqualF (FCMPD x y)) @@ -34723,7 +34523,6 @@ func rewriteValueARM64_OpLeq64F_0(v *Value) bool { } func rewriteValueARM64_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64U x y) // cond: // result: (LessEqualU (CMP x y)) @@ -34741,9 +34540,7 @@ func rewriteValueARM64_OpLeq64U_0(v *Value) bool { } func rewriteValueARM64_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -34765,9 +34562,7 @@ func rewriteValueARM64_OpLeq8_0(v *Value) bool { } func rewriteValueARM64_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -34789,9 +34584,7 @@ func rewriteValueARM64_OpLeq8U_0(v *Value) bool { } func rewriteValueARM64_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -34813,9 +34606,7 @@ func rewriteValueARM64_OpLess16_0(v *Value) bool { } func rewriteValueARM64_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -34837,7 +34628,6 @@ func rewriteValueARM64_OpLess16U_0(v *Value) bool { } func rewriteValueARM64_OpLess32_0(v *Value) bool { b := v.Block - _ = b // match: (Less32 x y) // cond: // result: (LessThan (CMPW x y)) @@ -34855,7 +34645,6 @@ func rewriteValueARM64_OpLess32_0(v *Value) bool { } func rewriteValueARM64_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (LessThanF (FCMPS x y)) @@ -34873,7 +34662,6 @@ func rewriteValueARM64_OpLess32F_0(v *Value) bool { } func rewriteValueARM64_OpLess32U_0(v *Value) bool { b := v.Block - _ = b // match: (Less32U x y) // cond: // result: (LessThanU (CMPW x y)) @@ -34891,7 +34679,6 @@ func rewriteValueARM64_OpLess32U_0(v *Value) bool { } func rewriteValueARM64_OpLess64_0(v *Value) bool { b := v.Block - _ = b // match: (Less64 x y) // cond: // result: (LessThan (CMP x y)) @@ -34909,7 +34696,6 @@ func rewriteValueARM64_OpLess64_0(v *Value) bool { } func rewriteValueARM64_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (LessThanF (FCMPD x y)) @@ -34927,7 +34713,6 @@ func rewriteValueARM64_OpLess64F_0(v *Value) bool { } func rewriteValueARM64_OpLess64U_0(v *Value) bool { b := v.Block - _ = b // match: (Less64U x y) // cond: // result: (LessThanU (CMP x y)) @@ -34945,9 +34730,7 @@ func rewriteValueARM64_OpLess64U_0(v *Value) bool { } func rewriteValueARM64_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -34969,9 +34752,7 @@ func rewriteValueARM64_OpLess8_0(v *Value) bool { } func rewriteValueARM64_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -35170,9 +34951,7 @@ func rewriteValueARM64_OpLocalAddr_0(v *Value) bool { } func rewriteValueARM64_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -35203,9 +34982,7 @@ func rewriteValueARM64_OpLsh16x16_0(v *Value) bool { } func rewriteValueARM64_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -35236,7 +35013,6 @@ func rewriteValueARM64_OpLsh16x32_0(v *Value) bool { } func rewriteValueARM64_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) @@ -35263,9 +35039,7 @@ func rewriteValueARM64_OpLsh16x64_0(v *Value) bool { } func rewriteValueARM64_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -35296,9 +35070,7 @@ func rewriteValueARM64_OpLsh16x8_0(v *Value) bool { } func rewriteValueARM64_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -35329,9 +35101,7 @@ func rewriteValueARM64_OpLsh32x16_0(v *Value) bool { } func rewriteValueARM64_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -35362,7 +35132,6 @@ func rewriteValueARM64_OpLsh32x32_0(v *Value) bool { } func rewriteValueARM64_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) @@ -35389,9 +35158,7 @@ func rewriteValueARM64_OpLsh32x64_0(v *Value) bool { } func rewriteValueARM64_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -35422,9 +35189,7 @@ func rewriteValueARM64_OpLsh32x8_0(v *Value) bool { } func rewriteValueARM64_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -35455,9 +35220,7 @@ func rewriteValueARM64_OpLsh64x16_0(v *Value) bool { } func rewriteValueARM64_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -35488,7 +35251,6 @@ func rewriteValueARM64_OpLsh64x32_0(v *Value) bool { } func rewriteValueARM64_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) @@ -35515,9 +35277,7 @@ func rewriteValueARM64_OpLsh64x64_0(v *Value) bool { } func rewriteValueARM64_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -35548,9 +35308,7 @@ func rewriteValueARM64_OpLsh64x8_0(v *Value) bool { } func rewriteValueARM64_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -35581,9 +35339,7 @@ func rewriteValueARM64_OpLsh8x16_0(v *Value) bool { } func rewriteValueARM64_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -35614,7 +35370,6 @@ func rewriteValueARM64_OpLsh8x32_0(v *Value) bool { } func rewriteValueARM64_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) @@ -35641,9 +35396,7 @@ func rewriteValueARM64_OpLsh8x64_0(v *Value) bool { } func rewriteValueARM64_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -35674,9 +35427,7 @@ func rewriteValueARM64_OpLsh8x8_0(v *Value) bool { } func rewriteValueARM64_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (MODW (SignExt16to32 x) (SignExt16to32 y)) @@ -35696,9 +35447,7 @@ func rewriteValueARM64_OpMod16_0(v *Value) bool { } func rewriteValueARM64_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -35774,9 +35523,7 @@ func rewriteValueARM64_OpMod64u_0(v *Value) bool { } func rewriteValueARM64_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (MODW (SignExt8to32 x) (SignExt8to32 y)) @@ -35796,9 +35543,7 @@ func rewriteValueARM64_OpMod8_0(v *Value) bool { } func rewriteValueARM64_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -35818,9 +35563,7 @@ func rewriteValueARM64_OpMod8u_0(v *Value) bool { } func rewriteValueARM64_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -36073,11 +35816,8 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { } func rewriteValueARM64_OpMove_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [16] dst src mem) // cond: // result: (MOVDstore [8] dst (MOVDload [8] src mem) (MOVDstore dst (MOVDload src mem) mem)) @@ -36412,9 +36152,7 @@ func rewriteValueARM64_OpNeg8_0(v *Value) bool { } func rewriteValueARM64_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -36436,7 +36174,6 @@ func rewriteValueARM64_OpNeq16_0(v *Value) bool { } func rewriteValueARM64_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x y) // cond: // result: (NotEqual (CMPW x y)) @@ -36454,7 +36191,6 @@ func rewriteValueARM64_OpNeq32_0(v *Value) bool { } func rewriteValueARM64_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (NotEqual (FCMPS x y)) @@ -36472,7 +36208,6 @@ func rewriteValueARM64_OpNeq32F_0(v *Value) bool { } func rewriteValueARM64_OpNeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64 x y) // cond: // result: (NotEqual (CMP x y)) @@ -36490,7 +36225,6 @@ func rewriteValueARM64_OpNeq64_0(v *Value) bool { } func rewriteValueARM64_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (NotEqual (FCMPD x y)) @@ -36508,9 +36242,7 @@ func rewriteValueARM64_OpNeq64F_0(v *Value) bool { } func rewriteValueARM64_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -36546,7 +36278,6 @@ func rewriteValueARM64_OpNeqB_0(v *Value) bool { } func rewriteValueARM64_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (NeqPtr x y) // cond: // result: (NotEqual (CMP x y)) @@ -36578,9 +36309,7 @@ func rewriteValueARM64_OpNilCheck_0(v *Value) bool { } func rewriteValueARM64_OpNot_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Not x) // cond: // result: (XOR (MOVDconst [1]) x) @@ -36693,9 +36422,7 @@ func rewriteValueARM64_OpOrB_0(v *Value) bool { } func rewriteValueARM64_OpPopCount16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount16 x) // cond: // result: (FMOVDfpgp (VUADDLV (VCNT (FMOVDgpfp (ZeroExt16to64 x))))) @@ -36718,9 +36445,7 @@ func rewriteValueARM64_OpPopCount16_0(v *Value) bool { } func rewriteValueARM64_OpPopCount32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount32 x) // cond: // result: (FMOVDfpgp (VUADDLV (VCNT (FMOVDgpfp (ZeroExt32to64 x))))) @@ -36743,9 +36468,7 @@ func rewriteValueARM64_OpPopCount32_0(v *Value) bool { } func rewriteValueARM64_OpPopCount64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount64 x) // cond: // result: (FMOVDfpgp (VUADDLV (VCNT (FMOVDgpfp x)))) @@ -36766,7 +36489,6 @@ func rewriteValueARM64_OpPopCount64_0(v *Value) bool { } func rewriteValueARM64_OpRotateLeft32_0(v *Value) bool { b := v.Block - _ = b // match: (RotateLeft32 x y) // cond: // result: (RORW x (NEG y)) @@ -36784,7 +36506,6 @@ func rewriteValueARM64_OpRotateLeft32_0(v *Value) bool { } func rewriteValueARM64_OpRotateLeft64_0(v *Value) bool { b := v.Block - _ = b // match: (RotateLeft64 x y) // cond: // result: (ROR x (NEG y)) @@ -36846,9 +36567,7 @@ func rewriteValueARM64_OpRoundToEven_0(v *Value) bool { } func rewriteValueARM64_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -36881,9 +36600,7 @@ func rewriteValueARM64_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueARM64_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -36916,9 +36633,7 @@ func rewriteValueARM64_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueARM64_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) @@ -36947,9 +36662,7 @@ func rewriteValueARM64_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueARM64_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -36982,9 +36695,7 @@ func rewriteValueARM64_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueARM64_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) @@ -37016,9 +36727,7 @@ func rewriteValueARM64_OpRsh16x16_0(v *Value) bool { } func rewriteValueARM64_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) @@ -37050,9 +36759,7 @@ func rewriteValueARM64_OpRsh16x32_0(v *Value) bool { } func rewriteValueARM64_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x y) // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) @@ -37080,9 +36787,7 @@ func rewriteValueARM64_OpRsh16x64_0(v *Value) bool { } func rewriteValueARM64_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) @@ -37114,9 +36819,7 @@ func rewriteValueARM64_OpRsh16x8_0(v *Value) bool { } func rewriteValueARM64_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -37149,9 +36852,7 @@ func rewriteValueARM64_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueARM64_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -37184,9 +36885,7 @@ func rewriteValueARM64_OpRsh32Ux32_0(v *Value) bool { } func rewriteValueARM64_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) @@ -37215,9 +36914,7 @@ func rewriteValueARM64_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueARM64_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -37250,9 +36947,7 @@ func rewriteValueARM64_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueARM64_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) @@ -37284,9 +36979,7 @@ func rewriteValueARM64_OpRsh32x16_0(v *Value) bool { } func rewriteValueARM64_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x32 x y) // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) @@ -37318,9 +37011,7 @@ func rewriteValueARM64_OpRsh32x32_0(v *Value) bool { } func rewriteValueARM64_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x y) // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) @@ -37348,9 +37039,7 @@ func rewriteValueARM64_OpRsh32x64_0(v *Value) bool { } func rewriteValueARM64_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) @@ -37382,9 +37071,7 @@ func rewriteValueARM64_OpRsh32x8_0(v *Value) bool { } func rewriteValueARM64_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -37415,9 +37102,7 @@ func rewriteValueARM64_OpRsh64Ux16_0(v *Value) bool { } func rewriteValueARM64_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -37448,7 +37133,6 @@ func rewriteValueARM64_OpRsh64Ux32_0(v *Value) bool { } func rewriteValueARM64_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL x y) (Const64 [0]) (CMPconst [64] y)) @@ -37475,9 +37159,7 @@ func rewriteValueARM64_OpRsh64Ux64_0(v *Value) bool { } func rewriteValueARM64_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -37508,9 +37190,7 @@ func rewriteValueARM64_OpRsh64Ux8_0(v *Value) bool { } func rewriteValueARM64_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 x y) // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) @@ -37540,9 +37220,7 @@ func rewriteValueARM64_OpRsh64x16_0(v *Value) bool { } func rewriteValueARM64_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x32 x y) // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) @@ -37572,7 +37250,6 @@ func rewriteValueARM64_OpRsh64x32_0(v *Value) bool { } func rewriteValueARM64_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x64 x y) // cond: // result: (SRA x (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) @@ -37598,9 +37275,7 @@ func rewriteValueARM64_OpRsh64x64_0(v *Value) bool { } func rewriteValueARM64_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 x y) // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) @@ -37630,9 +37305,7 @@ func rewriteValueARM64_OpRsh64x8_0(v *Value) bool { } func rewriteValueARM64_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) @@ -37665,9 +37338,7 @@ func rewriteValueARM64_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueARM64_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) @@ -37700,9 +37371,7 @@ func rewriteValueARM64_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueARM64_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) @@ -37731,9 +37400,7 @@ func rewriteValueARM64_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueARM64_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) @@ -37766,9 +37433,7 @@ func rewriteValueARM64_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueARM64_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) @@ -37800,9 +37465,7 @@ func rewriteValueARM64_OpRsh8x16_0(v *Value) bool { } func rewriteValueARM64_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) @@ -37834,9 +37497,7 @@ func rewriteValueARM64_OpRsh8x32_0(v *Value) bool { } func rewriteValueARM64_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x y) // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) @@ -37864,9 +37525,7 @@ func rewriteValueARM64_OpRsh8x64_0(v *Value) bool { } func rewriteValueARM64_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) @@ -37964,7 +37623,6 @@ func rewriteValueARM64_OpSignExt8to64_0(v *Value) bool { } func rewriteValueARM64_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRAconst (NEG x) [63]) @@ -38373,9 +38031,7 @@ func rewriteValueARM64_OpXor8_0(v *Value) bool { } func rewriteValueARM64_OpZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -38598,9 +38254,7 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { } func rewriteValueARM64_OpZero_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [10] ptr mem) // cond: // result: (MOVHstore [8] ptr (MOVDconst [0]) (MOVDstore ptr (MOVDconst [0]) mem)) @@ -38938,9 +38592,7 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { } func rewriteValueARM64_OpZero_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Zero [s] ptr mem) // cond: s%16 != 0 && s%16 <= 8 && s > 16 // result: (Zero [8] (OffPtr ptr [s-8]) (Zero [s-s%16] ptr mem)) diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index 55bef5a792..a2520df710 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -562,7 +562,6 @@ func rewriteValueMIPS_OpAdd32F_0(v *Value) bool { } func rewriteValueMIPS_OpAdd32withcarry_0(v *Value) bool { b := v.Block - _ = b // match: (Add32withcarry x y c) // cond: // result: (ADD c (ADD x y)) @@ -710,11 +709,8 @@ func rewriteValueMIPS_OpAtomicAdd32_0(v *Value) bool { } func rewriteValueMIPS_OpAtomicAnd8_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (AtomicAnd8 ptr val mem) // cond: !config.BigEndian // result: (LoweredAtomicAnd (AND (MOVWconst [^3]) ptr) (OR (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] ptr))) (NORconst [0] (SLL (MOVWconst [0xff]) (SLLconst [3] (ANDconst [3] ptr))))) mem) @@ -887,11 +883,8 @@ func rewriteValueMIPS_OpAtomicLoadPtr_0(v *Value) bool { } func rewriteValueMIPS_OpAtomicOr8_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (AtomicOr8 ptr val mem) // cond: !config.BigEndian // result: (LoweredAtomicOr (AND (MOVWconst [^3]) ptr) (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] ptr))) mem) @@ -997,7 +990,6 @@ func rewriteValueMIPS_OpAtomicStorePtrNoWB_0(v *Value) bool { } func rewriteValueMIPS_OpAvg32u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg32u x y) // cond: // result: (ADD (SRLconst (SUB x y) [1]) y) @@ -1020,9 +1012,7 @@ func rewriteValueMIPS_OpAvg32u_0(v *Value) bool { } func rewriteValueMIPS_OpBitLen32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen32 x) // cond: // result: (SUB (MOVWconst [32]) (CLZ x)) @@ -1171,9 +1161,7 @@ func rewriteValueMIPS_OpConstNil_0(v *Value) bool { } func rewriteValueMIPS_OpCtz32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz32 x) // cond: // result: (SUB (MOVWconst [32]) (CLZ (SUBconst [1] (AND x (NEG x))))) @@ -1277,9 +1265,7 @@ func rewriteValueMIPS_OpCvt64Fto32F_0(v *Value) bool { } func rewriteValueMIPS_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (Select1 (DIV (SignExt16to32 x) (SignExt16to32 y))) @@ -1301,9 +1287,7 @@ func rewriteValueMIPS_OpDiv16_0(v *Value) bool { } func rewriteValueMIPS_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (Select1 (DIVU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -1325,9 +1309,7 @@ func rewriteValueMIPS_OpDiv16u_0(v *Value) bool { } func rewriteValueMIPS_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 x y) // cond: // result: (Select1 (DIV x y)) @@ -1359,9 +1341,7 @@ func rewriteValueMIPS_OpDiv32F_0(v *Value) bool { } func rewriteValueMIPS_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (Select1 (DIVU x y)) @@ -1393,9 +1373,7 @@ func rewriteValueMIPS_OpDiv64F_0(v *Value) bool { } func rewriteValueMIPS_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (Select1 (DIV (SignExt8to32 x) (SignExt8to32 y))) @@ -1417,9 +1395,7 @@ func rewriteValueMIPS_OpDiv8_0(v *Value) bool { } func rewriteValueMIPS_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (Select1 (DIVU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -1441,9 +1417,7 @@ func rewriteValueMIPS_OpDiv8u_0(v *Value) bool { } func rewriteValueMIPS_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (SGTUconst [1] (XOR (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -1466,9 +1440,7 @@ func rewriteValueMIPS_OpEq16_0(v *Value) bool { } func rewriteValueMIPS_OpEq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32 x y) // cond: // result: (SGTUconst [1] (XOR x y)) @@ -1487,7 +1459,6 @@ func rewriteValueMIPS_OpEq32_0(v *Value) bool { } func rewriteValueMIPS_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (FPFlagTrue (CMPEQF x y)) @@ -1505,7 +1476,6 @@ func rewriteValueMIPS_OpEq32F_0(v *Value) bool { } func rewriteValueMIPS_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (FPFlagTrue (CMPEQD x y)) @@ -1523,9 +1493,7 @@ func rewriteValueMIPS_OpEq64F_0(v *Value) bool { } func rewriteValueMIPS_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (SGTUconst [1] (XOR (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -1548,9 +1516,7 @@ func rewriteValueMIPS_OpEq8_0(v *Value) bool { } func rewriteValueMIPS_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (XORconst [1] (XOR x y)) @@ -1569,9 +1535,7 @@ func rewriteValueMIPS_OpEqB_0(v *Value) bool { } func rewriteValueMIPS_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqPtr x y) // cond: // result: (SGTUconst [1] (XOR x y)) @@ -1590,9 +1554,7 @@ func rewriteValueMIPS_OpEqPtr_0(v *Value) bool { } func rewriteValueMIPS_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (XORconst [1] (SGT (SignExt16to32 y) (SignExt16to32 x))) @@ -1615,9 +1577,7 @@ func rewriteValueMIPS_OpGeq16_0(v *Value) bool { } func rewriteValueMIPS_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (XORconst [1] (SGTU (ZeroExt16to32 y) (ZeroExt16to32 x))) @@ -1640,9 +1600,7 @@ func rewriteValueMIPS_OpGeq16U_0(v *Value) bool { } func rewriteValueMIPS_OpGeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32 x y) // cond: // result: (XORconst [1] (SGT y x)) @@ -1661,7 +1619,6 @@ func rewriteValueMIPS_OpGeq32_0(v *Value) bool { } func rewriteValueMIPS_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (FPFlagTrue (CMPGEF x y)) @@ -1679,9 +1636,7 @@ func rewriteValueMIPS_OpGeq32F_0(v *Value) bool { } func rewriteValueMIPS_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32U x y) // cond: // result: (XORconst [1] (SGTU y x)) @@ -1700,7 +1655,6 @@ func rewriteValueMIPS_OpGeq32U_0(v *Value) bool { } func rewriteValueMIPS_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (FPFlagTrue (CMPGED x y)) @@ -1718,9 +1672,7 @@ func rewriteValueMIPS_OpGeq64F_0(v *Value) bool { } func rewriteValueMIPS_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (XORconst [1] (SGT (SignExt8to32 y) (SignExt8to32 x))) @@ -1743,9 +1695,7 @@ func rewriteValueMIPS_OpGeq8_0(v *Value) bool { } func rewriteValueMIPS_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (XORconst [1] (SGTU (ZeroExt8to32 y) (ZeroExt8to32 x))) @@ -1795,9 +1745,7 @@ func rewriteValueMIPS_OpGetClosurePtr_0(v *Value) bool { } func rewriteValueMIPS_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (SGT (SignExt16to32 x) (SignExt16to32 y)) @@ -1817,9 +1765,7 @@ func rewriteValueMIPS_OpGreater16_0(v *Value) bool { } func rewriteValueMIPS_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (SGTU (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -1853,7 +1799,6 @@ func rewriteValueMIPS_OpGreater32_0(v *Value) bool { } func rewriteValueMIPS_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (FPFlagTrue (CMPGTF x y)) @@ -1885,7 +1830,6 @@ func rewriteValueMIPS_OpGreater32U_0(v *Value) bool { } func rewriteValueMIPS_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (FPFlagTrue (CMPGTD x y)) @@ -1903,9 +1847,7 @@ func rewriteValueMIPS_OpGreater64F_0(v *Value) bool { } func rewriteValueMIPS_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (SGT (SignExt8to32 x) (SignExt8to32 y)) @@ -1925,9 +1867,7 @@ func rewriteValueMIPS_OpGreater8_0(v *Value) bool { } func rewriteValueMIPS_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (SGTU (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -1947,9 +1887,7 @@ func rewriteValueMIPS_OpGreater8U_0(v *Value) bool { } func rewriteValueMIPS_OpHmul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32 x y) // cond: // result: (Select0 (MULT x y)) @@ -1967,9 +1905,7 @@ func rewriteValueMIPS_OpHmul32_0(v *Value) bool { } func rewriteValueMIPS_OpHmul32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32u x y) // cond: // result: (Select0 (MULTU x y)) @@ -2017,9 +1953,7 @@ func rewriteValueMIPS_OpIsInBounds_0(v *Value) bool { } func rewriteValueMIPS_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsNonNil ptr) // cond: // result: (SGTU ptr (MOVWconst [0])) @@ -2035,9 +1969,7 @@ func rewriteValueMIPS_OpIsNonNil_0(v *Value) bool { } func rewriteValueMIPS_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsSliceInBounds idx len) // cond: // result: (XORconst [1] (SGTU idx len)) @@ -2056,9 +1988,7 @@ func rewriteValueMIPS_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueMIPS_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (XORconst [1] (SGT (SignExt16to32 x) (SignExt16to32 y))) @@ -2081,9 +2011,7 @@ func rewriteValueMIPS_OpLeq16_0(v *Value) bool { } func rewriteValueMIPS_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (XORconst [1] (SGTU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -2106,9 +2034,7 @@ func rewriteValueMIPS_OpLeq16U_0(v *Value) bool { } func rewriteValueMIPS_OpLeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32 x y) // cond: // result: (XORconst [1] (SGT x y)) @@ -2127,7 +2053,6 @@ func rewriteValueMIPS_OpLeq32_0(v *Value) bool { } func rewriteValueMIPS_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (FPFlagTrue (CMPGEF y x)) @@ -2145,9 +2070,7 @@ func rewriteValueMIPS_OpLeq32F_0(v *Value) bool { } func rewriteValueMIPS_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32U x y) // cond: // result: (XORconst [1] (SGTU x y)) @@ -2166,7 +2089,6 @@ func rewriteValueMIPS_OpLeq32U_0(v *Value) bool { } func rewriteValueMIPS_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (FPFlagTrue (CMPGED y x)) @@ -2184,9 +2106,7 @@ func rewriteValueMIPS_OpLeq64F_0(v *Value) bool { } func rewriteValueMIPS_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (XORconst [1] (SGT (SignExt8to32 x) (SignExt8to32 y))) @@ -2209,9 +2129,7 @@ func rewriteValueMIPS_OpLeq8_0(v *Value) bool { } func rewriteValueMIPS_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (XORconst [1] (SGTU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -2234,9 +2152,7 @@ func rewriteValueMIPS_OpLeq8U_0(v *Value) bool { } func rewriteValueMIPS_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (SGT (SignExt16to32 y) (SignExt16to32 x)) @@ -2256,9 +2172,7 @@ func rewriteValueMIPS_OpLess16_0(v *Value) bool { } func rewriteValueMIPS_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (SGTU (ZeroExt16to32 y) (ZeroExt16to32 x)) @@ -2292,7 +2206,6 @@ func rewriteValueMIPS_OpLess32_0(v *Value) bool { } func rewriteValueMIPS_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (FPFlagTrue (CMPGTF y x)) @@ -2324,7 +2237,6 @@ func rewriteValueMIPS_OpLess32U_0(v *Value) bool { } func rewriteValueMIPS_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (FPFlagTrue (CMPGTD y x)) @@ -2342,9 +2254,7 @@ func rewriteValueMIPS_OpLess64F_0(v *Value) bool { } func rewriteValueMIPS_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (SGT (SignExt8to32 y) (SignExt8to32 x)) @@ -2364,9 +2274,7 @@ func rewriteValueMIPS_OpLess8_0(v *Value) bool { } func rewriteValueMIPS_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (SGTU (ZeroExt8to32 y) (ZeroExt8to32 x)) @@ -2531,9 +2439,7 @@ func rewriteValueMIPS_OpLocalAddr_0(v *Value) bool { } func rewriteValueMIPS_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -2563,9 +2469,7 @@ func rewriteValueMIPS_OpLsh16x16_0(v *Value) bool { } func rewriteValueMIPS_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x y) // cond: // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -2630,9 +2534,7 @@ func rewriteValueMIPS_OpLsh16x64_0(v *Value) bool { } func rewriteValueMIPS_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -2662,9 +2564,7 @@ func rewriteValueMIPS_OpLsh16x8_0(v *Value) bool { } func rewriteValueMIPS_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -2694,9 +2594,7 @@ func rewriteValueMIPS_OpLsh32x16_0(v *Value) bool { } func rewriteValueMIPS_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x y) // cond: // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -2761,9 +2659,7 @@ func rewriteValueMIPS_OpLsh32x64_0(v *Value) bool { } func rewriteValueMIPS_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -2793,9 +2689,7 @@ func rewriteValueMIPS_OpLsh32x8_0(v *Value) bool { } func rewriteValueMIPS_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -2825,9 +2719,7 @@ func rewriteValueMIPS_OpLsh8x16_0(v *Value) bool { } func rewriteValueMIPS_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x y) // cond: // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -2892,9 +2784,7 @@ func rewriteValueMIPS_OpLsh8x64_0(v *Value) bool { } func rewriteValueMIPS_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -3071,7 +2961,6 @@ func rewriteValueMIPS_OpMIPSADDconst_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSAND_0(v *Value) bool { b := v.Block - _ = b // match: (AND x (MOVWconst [c])) // cond: // result: (ANDconst [c] x) @@ -3236,14 +3125,12 @@ func rewriteValueMIPS_OpMIPSANDconst_0(v *Value) bool { return false } func rewriteValueMIPS_OpMIPSCMOVZ_0(v *Value) bool { - b := v.Block - _ = b - // match: (CMOVZ _ b (MOVWconst [0])) + // match: (CMOVZ _ f (MOVWconst [0])) // cond: - // result: b + // result: f for { _ = v.Args[2] - b := v.Args[1] + f := v.Args[1] v_2 := v.Args[2] if v_2.Op != OpMIPSMOVWconst { break @@ -3252,8 +3139,8 @@ func rewriteValueMIPS_OpMIPSCMOVZ_0(v *Value) bool { break } v.reset(OpCopy) - v.Type = b.Type - v.AddArg(b) + v.Type = f.Type + v.AddArg(f) return true } // match: (CMOVZ a _ (MOVWconst [c])) @@ -3458,7 +3345,6 @@ func rewriteValueMIPS_OpMIPSMOVBUload_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSMOVBUreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBUreg x:(MOVBUload _ _)) // cond: // result: (MOVWreg x) @@ -3619,7 +3505,6 @@ func rewriteValueMIPS_OpMIPSMOVBload_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSMOVBreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVBreg x:(MOVBload _ _)) // cond: // result: (MOVWreg x) @@ -4290,7 +4175,6 @@ func rewriteValueMIPS_OpMIPSMOVHUload_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSMOVHUreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVHUreg x:(MOVBUload _ _)) // cond: // result: (MOVWreg x) @@ -4476,7 +4360,6 @@ func rewriteValueMIPS_OpMIPSMOVHload_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSMOVHreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVHreg x:(MOVBload _ _)) // cond: // result: (MOVWreg x) @@ -5318,7 +5201,6 @@ func rewriteValueMIPS_OpMIPSNORconst_0(v *Value) bool { } func rewriteValueMIPS_OpMIPSOR_0(v *Value) bool { b := v.Block - _ = b // match: (OR x (MOVWconst [c])) // cond: // result: (ORconst [c] x) @@ -6296,9 +6178,7 @@ func rewriteValueMIPS_OpMIPSXORconst_0(v *Value) bool { } func rewriteValueMIPS_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (Select0 (DIV (SignExt16to32 x) (SignExt16to32 y))) @@ -6320,9 +6200,7 @@ func rewriteValueMIPS_OpMod16_0(v *Value) bool { } func rewriteValueMIPS_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (Select0 (DIVU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -6344,9 +6222,7 @@ func rewriteValueMIPS_OpMod16u_0(v *Value) bool { } func rewriteValueMIPS_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (Select0 (DIV x y)) @@ -6364,9 +6240,7 @@ func rewriteValueMIPS_OpMod32_0(v *Value) bool { } func rewriteValueMIPS_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (Select0 (DIVU x y)) @@ -6384,9 +6258,7 @@ func rewriteValueMIPS_OpMod32u_0(v *Value) bool { } func rewriteValueMIPS_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (Select0 (DIV (SignExt8to32 x) (SignExt8to32 y))) @@ -6408,9 +6280,7 @@ func rewriteValueMIPS_OpMod8_0(v *Value) bool { } func rewriteValueMIPS_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (Select0 (DIVU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -6432,9 +6302,7 @@ func rewriteValueMIPS_OpMod8u_0(v *Value) bool { } func rewriteValueMIPS_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -6752,11 +6620,8 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { } func rewriteValueMIPS_OpMove_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [6] {t} dst src mem) // cond: t.(*types.Type).Alignment()%2 == 0 // result: (MOVHstore [4] dst (MOVHload [4] src mem) (MOVHstore [2] dst (MOVHload [2] src mem) (MOVHstore dst (MOVHload src mem) mem))) @@ -7059,9 +6924,7 @@ func rewriteValueMIPS_OpNeg8_0(v *Value) bool { } func rewriteValueMIPS_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (SGTU (XOR (ZeroExt16to32 x) (ZeroExt16to32 y)) (MOVWconst [0])) @@ -7086,9 +6949,7 @@ func rewriteValueMIPS_OpNeq16_0(v *Value) bool { } func rewriteValueMIPS_OpNeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32 x y) // cond: // result: (SGTU (XOR x y) (MOVWconst [0])) @@ -7109,7 +6970,6 @@ func rewriteValueMIPS_OpNeq32_0(v *Value) bool { } func rewriteValueMIPS_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (FPFlagFalse (CMPEQF x y)) @@ -7127,7 +6987,6 @@ func rewriteValueMIPS_OpNeq32F_0(v *Value) bool { } func rewriteValueMIPS_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (FPFlagFalse (CMPEQD x y)) @@ -7145,9 +7004,7 @@ func rewriteValueMIPS_OpNeq64F_0(v *Value) bool { } func rewriteValueMIPS_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (SGTU (XOR (ZeroExt8to32 x) (ZeroExt8to32 y)) (MOVWconst [0])) @@ -7186,9 +7043,7 @@ func rewriteValueMIPS_OpNeqB_0(v *Value) bool { } func rewriteValueMIPS_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqPtr x y) // cond: // result: (SGTU (XOR x y) (MOVWconst [0])) @@ -7342,9 +7197,7 @@ func rewriteValueMIPS_OpRound64F_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: // result: (CMOVZ (SRL (ZeroExt16to32 x) (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -7376,9 +7229,7 @@ func rewriteValueMIPS_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: // result: (CMOVZ (SRL (ZeroExt16to32 x) y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -7406,9 +7257,7 @@ func rewriteValueMIPS_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x (Const64 [c])) // cond: uint32(c) < 16 // result: (SRLconst (SLLconst x [16]) [c+16]) @@ -7452,9 +7301,7 @@ func rewriteValueMIPS_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: // result: (CMOVZ (SRL (ZeroExt16to32 x) (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -7486,9 +7333,7 @@ func rewriteValueMIPS_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) @@ -7519,9 +7364,7 @@ func rewriteValueMIPS_OpRsh16x16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) @@ -7548,9 +7391,7 @@ func rewriteValueMIPS_OpRsh16x32_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x (Const64 [c])) // cond: uint32(c) < 16 // result: (SRAconst (SLLconst x [16]) [c+16]) @@ -7599,9 +7440,7 @@ func rewriteValueMIPS_OpRsh16x64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) @@ -7632,9 +7471,7 @@ func rewriteValueMIPS_OpRsh16x8_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: // result: (CMOVZ (SRL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -7664,9 +7501,7 @@ func rewriteValueMIPS_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x y) // cond: // result: (CMOVZ (SRL x y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -7731,9 +7566,7 @@ func rewriteValueMIPS_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: // result: (CMOVZ (SRL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -7763,9 +7596,7 @@ func rewriteValueMIPS_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: // result: (SRA x ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) @@ -7794,9 +7625,7 @@ func rewriteValueMIPS_OpRsh32x16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x32 x y) // cond: // result: (SRA x ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) @@ -7862,9 +7691,7 @@ func rewriteValueMIPS_OpRsh32x64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: // result: (SRA x ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) @@ -7893,9 +7720,7 @@ func rewriteValueMIPS_OpRsh32x8_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: // result: (CMOVZ (SRL (ZeroExt8to32 x) (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) @@ -7927,9 +7752,7 @@ func rewriteValueMIPS_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: // result: (CMOVZ (SRL (ZeroExt8to32 x) y) (MOVWconst [0]) (SGTUconst [32] y)) @@ -7957,9 +7780,7 @@ func rewriteValueMIPS_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x (Const64 [c])) // cond: uint32(c) < 8 // result: (SRLconst (SLLconst x [24]) [c+24]) @@ -8003,9 +7824,7 @@ func rewriteValueMIPS_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: // result: (CMOVZ (SRL (ZeroExt8to32 x) (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) @@ -8037,9 +7856,7 @@ func rewriteValueMIPS_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) @@ -8070,9 +7887,7 @@ func rewriteValueMIPS_OpRsh8x16_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) @@ -8099,9 +7914,7 @@ func rewriteValueMIPS_OpRsh8x32_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x (Const64 [c])) // cond: uint32(c) < 8 // result: (SRAconst (SLLconst x [24]) [c+24]) @@ -8150,9 +7963,7 @@ func rewriteValueMIPS_OpRsh8x64_0(v *Value) bool { } func rewriteValueMIPS_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) @@ -8183,9 +7994,7 @@ func rewriteValueMIPS_OpRsh8x8_0(v *Value) bool { } func rewriteValueMIPS_OpSelect0_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select0 (Add32carry x y)) // cond: // result: (ADD x y) @@ -8503,9 +8312,7 @@ func rewriteValueMIPS_OpSelect0_10(v *Value) bool { } func rewriteValueMIPS_OpSelect1_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Select1 (Add32carry x y)) // cond: // result: (SGTU x (ADD x y)) @@ -8866,7 +8673,6 @@ func rewriteValueMIPS_OpSignmask_0(v *Value) bool { } func rewriteValueMIPS_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRAconst (NEG x) [31]) @@ -9044,7 +8850,6 @@ func rewriteValueMIPS_OpSub32F_0(v *Value) bool { } func rewriteValueMIPS_OpSub32withcarry_0(v *Value) bool { b := v.Block - _ = b // match: (Sub32withcarry x y c) // cond: // result: (SUB (SUB x y) c) @@ -9203,9 +9008,7 @@ func rewriteValueMIPS_OpXor8_0(v *Value) bool { } func rewriteValueMIPS_OpZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -9482,11 +9285,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { } func rewriteValueMIPS_OpZero_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Zero [12] {t} ptr mem) // cond: t.(*types.Type).Alignment()%4 == 0 // result: (MOVWstore [8] ptr (MOVWconst [0]) (MOVWstore [4] ptr (MOVWconst [0]) (MOVWstore [0] ptr (MOVWconst [0]) mem))) @@ -9627,9 +9427,7 @@ func rewriteValueMIPS_OpZeroExt8to32_0(v *Value) bool { } func rewriteValueMIPS_OpZeromask_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zeromask x) // cond: // result: (NEG (SGTU x (MOVWconst [0]))) diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index 9e12780664..c56f82f696 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -987,7 +987,6 @@ func rewriteValueMIPS64_OpAtomicStorePtrNoWB_0(v *Value) bool { } func rewriteValueMIPS64_OpAvg64u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg64u x y) // cond: // result: (ADDV (SRLVconst (SUBV x y) [1]) y) @@ -1028,9 +1027,7 @@ func rewriteValueMIPS64_OpClosureCall_0(v *Value) bool { } func rewriteValueMIPS64_OpCom16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com16 x) // cond: // result: (NOR (MOVVconst [0]) x) @@ -1046,9 +1043,7 @@ func rewriteValueMIPS64_OpCom16_0(v *Value) bool { } func rewriteValueMIPS64_OpCom32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com32 x) // cond: // result: (NOR (MOVVconst [0]) x) @@ -1064,9 +1059,7 @@ func rewriteValueMIPS64_OpCom32_0(v *Value) bool { } func rewriteValueMIPS64_OpCom64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com64 x) // cond: // result: (NOR (MOVVconst [0]) x) @@ -1082,9 +1075,7 @@ func rewriteValueMIPS64_OpCom64_0(v *Value) bool { } func rewriteValueMIPS64_OpCom8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com8 x) // cond: // result: (NOR (MOVVconst [0]) x) @@ -1297,9 +1288,7 @@ func rewriteValueMIPS64_OpCvt64to64F_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (Select1 (DIVV (SignExt16to64 x) (SignExt16to64 y))) @@ -1321,9 +1310,7 @@ func rewriteValueMIPS64_OpDiv16_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (Select1 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))) @@ -1345,9 +1332,7 @@ func rewriteValueMIPS64_OpDiv16u_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 x y) // cond: // result: (Select1 (DIVV (SignExt32to64 x) (SignExt32to64 y))) @@ -1383,9 +1368,7 @@ func rewriteValueMIPS64_OpDiv32F_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (Select1 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))) @@ -1407,9 +1390,7 @@ func rewriteValueMIPS64_OpDiv32u_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div64 x y) // cond: // result: (Select1 (DIVV x y)) @@ -1441,9 +1422,7 @@ func rewriteValueMIPS64_OpDiv64F_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div64u x y) // cond: // result: (Select1 (DIVVU x y)) @@ -1461,9 +1440,7 @@ func rewriteValueMIPS64_OpDiv64u_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (Select1 (DIVV (SignExt8to64 x) (SignExt8to64 y))) @@ -1485,9 +1462,7 @@ func rewriteValueMIPS64_OpDiv8_0(v *Value) bool { } func rewriteValueMIPS64_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (Select1 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))) @@ -1509,9 +1484,7 @@ func rewriteValueMIPS64_OpDiv8u_0(v *Value) bool { } func rewriteValueMIPS64_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt16to64 x) (ZeroExt16to64 y))) @@ -1536,9 +1509,7 @@ func rewriteValueMIPS64_OpEq16_0(v *Value) bool { } func rewriteValueMIPS64_OpEq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32 x y) // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt32to64 x) (ZeroExt32to64 y))) @@ -1563,7 +1534,6 @@ func rewriteValueMIPS64_OpEq32_0(v *Value) bool { } func rewriteValueMIPS64_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (FPFlagTrue (CMPEQF x y)) @@ -1581,9 +1551,7 @@ func rewriteValueMIPS64_OpEq32F_0(v *Value) bool { } func rewriteValueMIPS64_OpEq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq64 x y) // cond: // result: (SGTU (MOVVconst [1]) (XOR x y)) @@ -1604,7 +1572,6 @@ func rewriteValueMIPS64_OpEq64_0(v *Value) bool { } func rewriteValueMIPS64_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (FPFlagTrue (CMPEQD x y)) @@ -1622,9 +1589,7 @@ func rewriteValueMIPS64_OpEq64F_0(v *Value) bool { } func rewriteValueMIPS64_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt8to64 x) (ZeroExt8to64 y))) @@ -1649,9 +1614,7 @@ func rewriteValueMIPS64_OpEq8_0(v *Value) bool { } func rewriteValueMIPS64_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (XOR (MOVVconst [1]) (XOR x y)) @@ -1672,9 +1635,7 @@ func rewriteValueMIPS64_OpEqB_0(v *Value) bool { } func rewriteValueMIPS64_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqPtr x y) // cond: // result: (SGTU (MOVVconst [1]) (XOR x y)) @@ -1695,9 +1656,7 @@ func rewriteValueMIPS64_OpEqPtr_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt16to64 y) (SignExt16to64 x))) @@ -1722,9 +1681,7 @@ func rewriteValueMIPS64_OpGeq16_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt16to64 y) (ZeroExt16to64 x))) @@ -1749,9 +1706,7 @@ func rewriteValueMIPS64_OpGeq16U_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt32to64 y) (SignExt32to64 x))) @@ -1776,7 +1731,6 @@ func rewriteValueMIPS64_OpGeq32_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (FPFlagTrue (CMPGEF x y)) @@ -1794,9 +1748,7 @@ func rewriteValueMIPS64_OpGeq32F_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt32to64 y) (ZeroExt32to64 x))) @@ -1821,9 +1773,7 @@ func rewriteValueMIPS64_OpGeq32U_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT y x)) @@ -1844,7 +1794,6 @@ func rewriteValueMIPS64_OpGeq64_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (FPFlagTrue (CMPGED x y)) @@ -1862,9 +1811,7 @@ func rewriteValueMIPS64_OpGeq64F_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU y x)) @@ -1885,9 +1832,7 @@ func rewriteValueMIPS64_OpGeq64U_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt8to64 y) (SignExt8to64 x))) @@ -1912,9 +1857,7 @@ func rewriteValueMIPS64_OpGeq8_0(v *Value) bool { } func rewriteValueMIPS64_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt8to64 y) (ZeroExt8to64 x))) @@ -1966,9 +1909,7 @@ func rewriteValueMIPS64_OpGetClosurePtr_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (SGT (SignExt16to64 x) (SignExt16to64 y)) @@ -1988,9 +1929,7 @@ func rewriteValueMIPS64_OpGreater16_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (SGTU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -2010,9 +1949,7 @@ func rewriteValueMIPS64_OpGreater16U_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32 x y) // cond: // result: (SGT (SignExt32to64 x) (SignExt32to64 y)) @@ -2032,7 +1969,6 @@ func rewriteValueMIPS64_OpGreater32_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (FPFlagTrue (CMPGTF x y)) @@ -2050,9 +1986,7 @@ func rewriteValueMIPS64_OpGreater32F_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32U x y) // cond: // result: (SGTU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -2086,7 +2020,6 @@ func rewriteValueMIPS64_OpGreater64_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (FPFlagTrue (CMPGTD x y)) @@ -2118,9 +2051,7 @@ func rewriteValueMIPS64_OpGreater64U_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (SGT (SignExt8to64 x) (SignExt8to64 y)) @@ -2140,9 +2071,7 @@ func rewriteValueMIPS64_OpGreater8_0(v *Value) bool { } func rewriteValueMIPS64_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (SGTU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -2162,9 +2091,7 @@ func rewriteValueMIPS64_OpGreater8U_0(v *Value) bool { } func rewriteValueMIPS64_OpHmul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32 x y) // cond: // result: (SRAVconst (Select1 (MULV (SignExt32to64 x) (SignExt32to64 y))) [32]) @@ -2189,9 +2116,7 @@ func rewriteValueMIPS64_OpHmul32_0(v *Value) bool { } func rewriteValueMIPS64_OpHmul32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32u x y) // cond: // result: (SRLVconst (Select1 (MULVU (ZeroExt32to64 x) (ZeroExt32to64 y))) [32]) @@ -2216,9 +2141,7 @@ func rewriteValueMIPS64_OpHmul32u_0(v *Value) bool { } func rewriteValueMIPS64_OpHmul64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul64 x y) // cond: // result: (Select0 (MULV x y)) @@ -2236,9 +2159,7 @@ func rewriteValueMIPS64_OpHmul64_0(v *Value) bool { } func rewriteValueMIPS64_OpHmul64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul64u x y) // cond: // result: (Select0 (MULVU x y)) @@ -2286,9 +2207,7 @@ func rewriteValueMIPS64_OpIsInBounds_0(v *Value) bool { } func rewriteValueMIPS64_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsNonNil ptr) // cond: // result: (SGTU ptr (MOVVconst [0])) @@ -2304,9 +2223,7 @@ func rewriteValueMIPS64_OpIsNonNil_0(v *Value) bool { } func rewriteValueMIPS64_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsSliceInBounds idx len) // cond: // result: (XOR (MOVVconst [1]) (SGTU idx len)) @@ -2327,9 +2244,7 @@ func rewriteValueMIPS64_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt16to64 x) (SignExt16to64 y))) @@ -2354,9 +2269,7 @@ func rewriteValueMIPS64_OpLeq16_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt16to64 x) (ZeroExt16to64 y))) @@ -2381,9 +2294,7 @@ func rewriteValueMIPS64_OpLeq16U_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt32to64 x) (SignExt32to64 y))) @@ -2408,7 +2319,6 @@ func rewriteValueMIPS64_OpLeq32_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (FPFlagTrue (CMPGEF y x)) @@ -2426,9 +2336,7 @@ func rewriteValueMIPS64_OpLeq32F_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt32to64 x) (ZeroExt32to64 y))) @@ -2453,9 +2361,7 @@ func rewriteValueMIPS64_OpLeq32U_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT x y)) @@ -2476,7 +2382,6 @@ func rewriteValueMIPS64_OpLeq64_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (FPFlagTrue (CMPGED y x)) @@ -2494,9 +2399,7 @@ func rewriteValueMIPS64_OpLeq64F_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU x y)) @@ -2517,9 +2420,7 @@ func rewriteValueMIPS64_OpLeq64U_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt8to64 x) (SignExt8to64 y))) @@ -2544,9 +2445,7 @@ func rewriteValueMIPS64_OpLeq8_0(v *Value) bool { } func rewriteValueMIPS64_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt8to64 x) (ZeroExt8to64 y))) @@ -2571,9 +2470,7 @@ func rewriteValueMIPS64_OpLeq8U_0(v *Value) bool { } func rewriteValueMIPS64_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (SGT (SignExt16to64 y) (SignExt16to64 x)) @@ -2593,9 +2490,7 @@ func rewriteValueMIPS64_OpLess16_0(v *Value) bool { } func rewriteValueMIPS64_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (SGTU (ZeroExt16to64 y) (ZeroExt16to64 x)) @@ -2615,9 +2510,7 @@ func rewriteValueMIPS64_OpLess16U_0(v *Value) bool { } func rewriteValueMIPS64_OpLess32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32 x y) // cond: // result: (SGT (SignExt32to64 y) (SignExt32to64 x)) @@ -2637,7 +2530,6 @@ func rewriteValueMIPS64_OpLess32_0(v *Value) bool { } func rewriteValueMIPS64_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (FPFlagTrue (CMPGTF y x)) @@ -2655,9 +2547,7 @@ func rewriteValueMIPS64_OpLess32F_0(v *Value) bool { } func rewriteValueMIPS64_OpLess32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32U x y) // cond: // result: (SGTU (ZeroExt32to64 y) (ZeroExt32to64 x)) @@ -2691,7 +2581,6 @@ func rewriteValueMIPS64_OpLess64_0(v *Value) bool { } func rewriteValueMIPS64_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (FPFlagTrue (CMPGTD y x)) @@ -2723,9 +2612,7 @@ func rewriteValueMIPS64_OpLess64U_0(v *Value) bool { } func rewriteValueMIPS64_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (SGT (SignExt8to64 y) (SignExt8to64 x)) @@ -2745,9 +2632,7 @@ func rewriteValueMIPS64_OpLess8_0(v *Value) bool { } func rewriteValueMIPS64_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (SGTU (ZeroExt8to64 y) (ZeroExt8to64 x)) @@ -2944,9 +2829,7 @@ func rewriteValueMIPS64_OpLocalAddr_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) @@ -2977,9 +2860,7 @@ func rewriteValueMIPS64_OpLsh16x16_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) @@ -3010,9 +2891,7 @@ func rewriteValueMIPS64_OpLsh16x32_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) @@ -3039,9 +2918,7 @@ func rewriteValueMIPS64_OpLsh16x64_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) @@ -3072,9 +2949,7 @@ func rewriteValueMIPS64_OpLsh16x8_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) @@ -3105,9 +2980,7 @@ func rewriteValueMIPS64_OpLsh32x16_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) @@ -3138,9 +3011,7 @@ func rewriteValueMIPS64_OpLsh32x32_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) @@ -3167,9 +3038,7 @@ func rewriteValueMIPS64_OpLsh32x64_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) @@ -3200,9 +3069,7 @@ func rewriteValueMIPS64_OpLsh32x8_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) @@ -3233,9 +3100,7 @@ func rewriteValueMIPS64_OpLsh64x16_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) @@ -3266,9 +3131,7 @@ func rewriteValueMIPS64_OpLsh64x32_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) @@ -3295,9 +3158,7 @@ func rewriteValueMIPS64_OpLsh64x64_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) @@ -3328,9 +3189,7 @@ func rewriteValueMIPS64_OpLsh64x8_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) @@ -3361,9 +3220,7 @@ func rewriteValueMIPS64_OpLsh8x16_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) @@ -3394,9 +3251,7 @@ func rewriteValueMIPS64_OpLsh8x32_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) @@ -3423,9 +3278,7 @@ func rewriteValueMIPS64_OpLsh8x64_0(v *Value) bool { } func rewriteValueMIPS64_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) @@ -6640,9 +6493,7 @@ func rewriteValueMIPS64_OpMIPS64XORconst_0(v *Value) bool { } func rewriteValueMIPS64_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (Select0 (DIVV (SignExt16to64 x) (SignExt16to64 y))) @@ -6664,9 +6515,7 @@ func rewriteValueMIPS64_OpMod16_0(v *Value) bool { } func rewriteValueMIPS64_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (Select0 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))) @@ -6688,9 +6537,7 @@ func rewriteValueMIPS64_OpMod16u_0(v *Value) bool { } func rewriteValueMIPS64_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (Select0 (DIVV (SignExt32to64 x) (SignExt32to64 y))) @@ -6712,9 +6559,7 @@ func rewriteValueMIPS64_OpMod32_0(v *Value) bool { } func rewriteValueMIPS64_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (Select0 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))) @@ -6736,9 +6581,7 @@ func rewriteValueMIPS64_OpMod32u_0(v *Value) bool { } func rewriteValueMIPS64_OpMod64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64 x y) // cond: // result: (Select0 (DIVV x y)) @@ -6756,9 +6599,7 @@ func rewriteValueMIPS64_OpMod64_0(v *Value) bool { } func rewriteValueMIPS64_OpMod64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64u x y) // cond: // result: (Select0 (DIVVU x y)) @@ -6776,9 +6617,7 @@ func rewriteValueMIPS64_OpMod64u_0(v *Value) bool { } func rewriteValueMIPS64_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y))) @@ -6800,9 +6639,7 @@ func rewriteValueMIPS64_OpMod8_0(v *Value) bool { } func rewriteValueMIPS64_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))) @@ -6824,9 +6661,7 @@ func rewriteValueMIPS64_OpMod8u_0(v *Value) bool { } func rewriteValueMIPS64_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -7130,11 +6965,8 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { } func rewriteValueMIPS64_OpMove_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Move [3] dst src mem) // cond: // result: (MOVBstore [2] dst (MOVBload [2] src mem) (MOVBstore [1] dst (MOVBload [1] src mem) (MOVBstore dst (MOVBload src mem) mem))) @@ -7360,9 +7192,7 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { } func rewriteValueMIPS64_OpMul16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul16 x y) // cond: // result: (Select1 (MULVU x y)) @@ -7380,9 +7210,7 @@ func rewriteValueMIPS64_OpMul16_0(v *Value) bool { } func rewriteValueMIPS64_OpMul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul32 x y) // cond: // result: (Select1 (MULVU x y)) @@ -7414,9 +7242,7 @@ func rewriteValueMIPS64_OpMul32F_0(v *Value) bool { } func rewriteValueMIPS64_OpMul64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul64 x y) // cond: // result: (Select1 (MULVU x y)) @@ -7448,9 +7274,7 @@ func rewriteValueMIPS64_OpMul64F_0(v *Value) bool { } func rewriteValueMIPS64_OpMul8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul8 x y) // cond: // result: (Select1 (MULVU x y)) @@ -7534,9 +7358,7 @@ func rewriteValueMIPS64_OpNeg8_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (SGTU (XOR (ZeroExt16to32 x) (ZeroExt16to64 y)) (MOVVconst [0])) @@ -7561,9 +7383,7 @@ func rewriteValueMIPS64_OpNeq16_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32 x y) // cond: // result: (SGTU (XOR (ZeroExt32to64 x) (ZeroExt32to64 y)) (MOVVconst [0])) @@ -7588,7 +7408,6 @@ func rewriteValueMIPS64_OpNeq32_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (FPFlagFalse (CMPEQF x y)) @@ -7606,9 +7425,7 @@ func rewriteValueMIPS64_OpNeq32F_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq64 x y) // cond: // result: (SGTU (XOR x y) (MOVVconst [0])) @@ -7629,7 +7446,6 @@ func rewriteValueMIPS64_OpNeq64_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (FPFlagFalse (CMPEQD x y)) @@ -7647,9 +7463,7 @@ func rewriteValueMIPS64_OpNeq64F_0(v *Value) bool { } func rewriteValueMIPS64_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (SGTU (XOR (ZeroExt8to64 x) (ZeroExt8to64 y)) (MOVVconst [0])) @@ -7688,9 +7502,7 @@ func rewriteValueMIPS64_OpNeqB_0(v *Value) bool { } func rewriteValueMIPS64_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqPtr x y) // cond: // result: (SGTU (XOR x y) (MOVVconst [0])) @@ -7858,9 +7670,7 @@ func rewriteValueMIPS64_OpRound64F_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt16to64 y))) @@ -7893,9 +7703,7 @@ func rewriteValueMIPS64_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt32to64 y))) @@ -7928,9 +7736,7 @@ func rewriteValueMIPS64_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt16to64 x) y)) @@ -7959,9 +7765,7 @@ func rewriteValueMIPS64_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt8to64 y))) @@ -7994,9 +7798,7 @@ func rewriteValueMIPS64_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) @@ -8029,9 +7831,7 @@ func rewriteValueMIPS64_OpRsh16x16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) @@ -8064,9 +7864,7 @@ func rewriteValueMIPS64_OpRsh16x32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x y) // cond: // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) @@ -8095,9 +7893,7 @@ func rewriteValueMIPS64_OpRsh16x64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) @@ -8130,9 +7926,7 @@ func rewriteValueMIPS64_OpRsh16x8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt16to64 y))) @@ -8165,9 +7959,7 @@ func rewriteValueMIPS64_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt32to64 y))) @@ -8200,9 +7992,7 @@ func rewriteValueMIPS64_OpRsh32Ux32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt32to64 x) y)) @@ -8231,9 +8021,7 @@ func rewriteValueMIPS64_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt8to64 y))) @@ -8266,9 +8054,7 @@ func rewriteValueMIPS64_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) @@ -8301,9 +8087,7 @@ func rewriteValueMIPS64_OpRsh32x16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x32 x y) // cond: // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) @@ -8336,9 +8120,7 @@ func rewriteValueMIPS64_OpRsh32x32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x y) // cond: // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) @@ -8367,9 +8149,7 @@ func rewriteValueMIPS64_OpRsh32x64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) @@ -8402,9 +8182,7 @@ func rewriteValueMIPS64_OpRsh32x8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV x (ZeroExt16to64 y))) @@ -8435,9 +8213,7 @@ func rewriteValueMIPS64_OpRsh64Ux16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV x (ZeroExt32to64 y))) @@ -8468,9 +8244,7 @@ func rewriteValueMIPS64_OpRsh64Ux32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV x y)) @@ -8497,9 +8271,7 @@ func rewriteValueMIPS64_OpRsh64Ux64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV x (ZeroExt8to64 y))) @@ -8530,9 +8302,7 @@ func rewriteValueMIPS64_OpRsh64Ux8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 x y) // cond: // result: (SRAV x (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) @@ -8563,9 +8333,7 @@ func rewriteValueMIPS64_OpRsh64x16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x32 x y) // cond: // result: (SRAV x (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) @@ -8596,9 +8364,7 @@ func rewriteValueMIPS64_OpRsh64x32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 x y) // cond: // result: (SRAV x (OR (NEGV (SGTU y (MOVVconst [63]))) y)) @@ -8625,9 +8391,7 @@ func rewriteValueMIPS64_OpRsh64x64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 x y) // cond: // result: (SRAV x (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) @@ -8658,9 +8422,7 @@ func rewriteValueMIPS64_OpRsh64x8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt16to64 y))) @@ -8693,9 +8455,7 @@ func rewriteValueMIPS64_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt32to64 y))) @@ -8728,9 +8488,7 @@ func rewriteValueMIPS64_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt8to64 x) y)) @@ -8759,9 +8517,7 @@ func rewriteValueMIPS64_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt8to64 y))) @@ -8794,9 +8550,7 @@ func rewriteValueMIPS64_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) @@ -8829,9 +8583,7 @@ func rewriteValueMIPS64_OpRsh8x16_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) @@ -8864,9 +8616,7 @@ func rewriteValueMIPS64_OpRsh8x32_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x y) // cond: // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) @@ -8895,9 +8645,7 @@ func rewriteValueMIPS64_OpRsh8x64_0(v *Value) bool { } func rewriteValueMIPS64_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) @@ -9578,7 +9326,6 @@ func rewriteValueMIPS64_OpSignExt8to64_0(v *Value) bool { } func rewriteValueMIPS64_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRAVconst (NEGV x) [63]) @@ -9976,9 +9723,7 @@ func rewriteValueMIPS64_OpXor8_0(v *Value) bool { } func rewriteValueMIPS64_OpZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -10251,11 +9996,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { } func rewriteValueMIPS64_OpZero_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Zero [3] ptr mem) // cond: // result: (MOVBstore [2] ptr (MOVVconst [0]) (MOVBstore [1] ptr (MOVVconst [0]) (MOVBstore [0] ptr (MOVVconst [0]) mem))) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index fdb34aec0a..29d9ec5d4d 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -1154,7 +1154,6 @@ func rewriteValuePPC64_OpAtomicStoreRel32_0(v *Value) bool { } func rewriteValuePPC64_OpAvg64u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg64u x y) // cond: // result: (ADD (SRDconst (SUB x y) [1]) y) @@ -1177,9 +1176,7 @@ func rewriteValuePPC64_OpAvg64u_0(v *Value) bool { } func rewriteValuePPC64_OpBitLen32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen32 x) // cond: // result: (SUB (MOVDconst [32]) (CNTLZW x)) @@ -1197,9 +1194,7 @@ func rewriteValuePPC64_OpBitLen32_0(v *Value) bool { } func rewriteValuePPC64_OpBitLen64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen64 x) // cond: // result: (SUB (MOVDconst [64]) (CNTLZD x)) @@ -1395,9 +1390,7 @@ func rewriteValuePPC64_OpCopysign_0(v *Value) bool { } func rewriteValuePPC64_OpCtz16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz16 x) // cond: // result: (POPCNTW (MOVHZreg (ANDN (ADDconst [-1] x) x))) @@ -1418,9 +1411,7 @@ func rewriteValuePPC64_OpCtz16_0(v *Value) bool { } func rewriteValuePPC64_OpCtz32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz32 x) // cond: // result: (POPCNTW (MOVWZreg (ANDN (ADDconst [-1] x) x))) @@ -1452,9 +1443,7 @@ func rewriteValuePPC64_OpCtz32NonZero_0(v *Value) bool { } func rewriteValuePPC64_OpCtz64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz64 x) // cond: // result: (POPCNTD (ANDN (ADDconst [-1] x) x)) @@ -1484,9 +1473,7 @@ func rewriteValuePPC64_OpCtz64NonZero_0(v *Value) bool { } func rewriteValuePPC64_OpCtz8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz8 x) // cond: // result: (POPCNTB (MOVBZreg (ANDN (ADDconst [-1] x) x))) @@ -1507,9 +1494,7 @@ func rewriteValuePPC64_OpCtz8_0(v *Value) bool { } func rewriteValuePPC64_OpCvt32Fto32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32Fto32 x) // cond: // result: (MFVSRD (FCTIWZ x)) @@ -1524,9 +1509,7 @@ func rewriteValuePPC64_OpCvt32Fto32_0(v *Value) bool { } func rewriteValuePPC64_OpCvt32Fto64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32Fto64 x) // cond: // result: (MFVSRD (FCTIDZ x)) @@ -1553,9 +1536,7 @@ func rewriteValuePPC64_OpCvt32Fto64F_0(v *Value) bool { } func rewriteValuePPC64_OpCvt32to32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32to32F x) // cond: // result: (FCFIDS (MTVSRD (SignExt32to64 x))) @@ -1572,9 +1553,7 @@ func rewriteValuePPC64_OpCvt32to32F_0(v *Value) bool { } func rewriteValuePPC64_OpCvt32to64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32to64F x) // cond: // result: (FCFID (MTVSRD (SignExt32to64 x))) @@ -1591,9 +1570,7 @@ func rewriteValuePPC64_OpCvt32to64F_0(v *Value) bool { } func rewriteValuePPC64_OpCvt64Fto32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64Fto32 x) // cond: // result: (MFVSRD (FCTIWZ x)) @@ -1619,9 +1596,7 @@ func rewriteValuePPC64_OpCvt64Fto32F_0(v *Value) bool { } func rewriteValuePPC64_OpCvt64Fto64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64Fto64 x) // cond: // result: (MFVSRD (FCTIDZ x)) @@ -1636,9 +1611,7 @@ func rewriteValuePPC64_OpCvt64Fto64_0(v *Value) bool { } func rewriteValuePPC64_OpCvt64to32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64to32F x) // cond: // result: (FCFIDS (MTVSRD x)) @@ -1653,9 +1626,7 @@ func rewriteValuePPC64_OpCvt64to32F_0(v *Value) bool { } func rewriteValuePPC64_OpCvt64to64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64to64F x) // cond: // result: (FCFID (MTVSRD x)) @@ -1670,9 +1641,7 @@ func rewriteValuePPC64_OpCvt64to64F_0(v *Value) bool { } func rewriteValuePPC64_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) @@ -1692,9 +1661,7 @@ func rewriteValuePPC64_OpDiv16_0(v *Value) bool { } func rewriteValuePPC64_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (DIVWU (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -1798,9 +1765,7 @@ func rewriteValuePPC64_OpDiv64u_0(v *Value) bool { } func rewriteValuePPC64_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) @@ -1820,9 +1785,7 @@ func rewriteValuePPC64_OpDiv8_0(v *Value) bool { } func rewriteValuePPC64_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (DIVWU (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -1842,9 +1805,7 @@ func rewriteValuePPC64_OpDiv8u_0(v *Value) bool { } func rewriteValuePPC64_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -1887,7 +1848,6 @@ func rewriteValuePPC64_OpEq16_0(v *Value) bool { } func rewriteValuePPC64_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x y) // cond: // result: (Equal (CMPW x y)) @@ -1905,7 +1865,6 @@ func rewriteValuePPC64_OpEq32_0(v *Value) bool { } func rewriteValuePPC64_OpEq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32F x y) // cond: // result: (Equal (FCMPU x y)) @@ -1923,7 +1882,6 @@ func rewriteValuePPC64_OpEq32F_0(v *Value) bool { } func rewriteValuePPC64_OpEq64_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64 x y) // cond: // result: (Equal (CMP x y)) @@ -1941,7 +1899,6 @@ func rewriteValuePPC64_OpEq64_0(v *Value) bool { } func rewriteValuePPC64_OpEq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64F x y) // cond: // result: (Equal (FCMPU x y)) @@ -1959,9 +1916,7 @@ func rewriteValuePPC64_OpEq64F_0(v *Value) bool { } func rewriteValuePPC64_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -2004,9 +1959,7 @@ func rewriteValuePPC64_OpEq8_0(v *Value) bool { } func rewriteValuePPC64_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (ANDconst [1] (EQV x y)) @@ -2025,7 +1978,6 @@ func rewriteValuePPC64_OpEqB_0(v *Value) bool { } func rewriteValuePPC64_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (EqPtr x y) // cond: // result: (Equal (CMP x y)) @@ -2054,9 +2006,7 @@ func rewriteValuePPC64_OpFloor_0(v *Value) bool { } func rewriteValuePPC64_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -2078,9 +2028,7 @@ func rewriteValuePPC64_OpGeq16_0(v *Value) bool { } func rewriteValuePPC64_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (GreaterEqual (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -2102,7 +2050,6 @@ func rewriteValuePPC64_OpGeq16U_0(v *Value) bool { } func rewriteValuePPC64_OpGeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32 x y) // cond: // result: (GreaterEqual (CMPW x y)) @@ -2120,7 +2067,6 @@ func rewriteValuePPC64_OpGeq32_0(v *Value) bool { } func rewriteValuePPC64_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32F x y) // cond: // result: (FGreaterEqual (FCMPU x y)) @@ -2138,7 +2084,6 @@ func rewriteValuePPC64_OpGeq32F_0(v *Value) bool { } func rewriteValuePPC64_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq32U x y) // cond: // result: (GreaterEqual (CMPWU x y)) @@ -2156,7 +2101,6 @@ func rewriteValuePPC64_OpGeq32U_0(v *Value) bool { } func rewriteValuePPC64_OpGeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64 x y) // cond: // result: (GreaterEqual (CMP x y)) @@ -2174,7 +2118,6 @@ func rewriteValuePPC64_OpGeq64_0(v *Value) bool { } func rewriteValuePPC64_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64F x y) // cond: // result: (FGreaterEqual (FCMPU x y)) @@ -2192,7 +2135,6 @@ func rewriteValuePPC64_OpGeq64F_0(v *Value) bool { } func rewriteValuePPC64_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Geq64U x y) // cond: // result: (GreaterEqual (CMPU x y)) @@ -2210,9 +2152,7 @@ func rewriteValuePPC64_OpGeq64U_0(v *Value) bool { } func rewriteValuePPC64_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -2234,9 +2174,7 @@ func rewriteValuePPC64_OpGeq8_0(v *Value) bool { } func rewriteValuePPC64_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (GreaterEqual (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -2285,9 +2223,7 @@ func rewriteValuePPC64_OpGetClosurePtr_0(v *Value) bool { } func rewriteValuePPC64_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -2309,9 +2245,7 @@ func rewriteValuePPC64_OpGreater16_0(v *Value) bool { } func rewriteValuePPC64_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (GreaterThan (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -2333,7 +2267,6 @@ func rewriteValuePPC64_OpGreater16U_0(v *Value) bool { } func rewriteValuePPC64_OpGreater32_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32 x y) // cond: // result: (GreaterThan (CMPW x y)) @@ -2351,7 +2284,6 @@ func rewriteValuePPC64_OpGreater32_0(v *Value) bool { } func rewriteValuePPC64_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32F x y) // cond: // result: (FGreaterThan (FCMPU x y)) @@ -2369,7 +2301,6 @@ func rewriteValuePPC64_OpGreater32F_0(v *Value) bool { } func rewriteValuePPC64_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater32U x y) // cond: // result: (GreaterThan (CMPWU x y)) @@ -2387,7 +2318,6 @@ func rewriteValuePPC64_OpGreater32U_0(v *Value) bool { } func rewriteValuePPC64_OpGreater64_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64 x y) // cond: // result: (GreaterThan (CMP x y)) @@ -2405,7 +2335,6 @@ func rewriteValuePPC64_OpGreater64_0(v *Value) bool { } func rewriteValuePPC64_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64F x y) // cond: // result: (FGreaterThan (FCMPU x y)) @@ -2423,7 +2352,6 @@ func rewriteValuePPC64_OpGreater64F_0(v *Value) bool { } func rewriteValuePPC64_OpGreater64U_0(v *Value) bool { b := v.Block - _ = b // match: (Greater64U x y) // cond: // result: (GreaterThan (CMPU x y)) @@ -2441,9 +2369,7 @@ func rewriteValuePPC64_OpGreater64U_0(v *Value) bool { } func rewriteValuePPC64_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -2465,9 +2391,7 @@ func rewriteValuePPC64_OpGreater8_0(v *Value) bool { } func rewriteValuePPC64_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (GreaterThan (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -2561,7 +2485,6 @@ func rewriteValuePPC64_OpInterCall_0(v *Value) bool { } func rewriteValuePPC64_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsInBounds idx len) // cond: // result: (LessThan (CMPU idx len)) @@ -2579,7 +2502,6 @@ func rewriteValuePPC64_OpIsInBounds_0(v *Value) bool { } func rewriteValuePPC64_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b // match: (IsNonNil ptr) // cond: // result: (NotEqual (CMPconst [0] ptr)) @@ -2595,7 +2517,6 @@ func rewriteValuePPC64_OpIsNonNil_0(v *Value) bool { } func rewriteValuePPC64_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b // match: (IsSliceInBounds idx len) // cond: // result: (LessEqual (CMPU idx len)) @@ -2613,9 +2534,7 @@ func rewriteValuePPC64_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValuePPC64_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -2637,9 +2556,7 @@ func rewriteValuePPC64_OpLeq16_0(v *Value) bool { } func rewriteValuePPC64_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (LessEqual (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -2661,7 +2578,6 @@ func rewriteValuePPC64_OpLeq16U_0(v *Value) bool { } func rewriteValuePPC64_OpLeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32 x y) // cond: // result: (LessEqual (CMPW x y)) @@ -2679,7 +2595,6 @@ func rewriteValuePPC64_OpLeq32_0(v *Value) bool { } func rewriteValuePPC64_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32F x y) // cond: // result: (FLessEqual (FCMPU x y)) @@ -2697,7 +2612,6 @@ func rewriteValuePPC64_OpLeq32F_0(v *Value) bool { } func rewriteValuePPC64_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq32U x y) // cond: // result: (LessEqual (CMPWU x y)) @@ -2715,7 +2629,6 @@ func rewriteValuePPC64_OpLeq32U_0(v *Value) bool { } func rewriteValuePPC64_OpLeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64 x y) // cond: // result: (LessEqual (CMP x y)) @@ -2733,7 +2646,6 @@ func rewriteValuePPC64_OpLeq64_0(v *Value) bool { } func rewriteValuePPC64_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64F x y) // cond: // result: (FLessEqual (FCMPU x y)) @@ -2751,7 +2663,6 @@ func rewriteValuePPC64_OpLeq64F_0(v *Value) bool { } func rewriteValuePPC64_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b // match: (Leq64U x y) // cond: // result: (LessEqual (CMPU x y)) @@ -2769,9 +2680,7 @@ func rewriteValuePPC64_OpLeq64U_0(v *Value) bool { } func rewriteValuePPC64_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -2793,9 +2702,7 @@ func rewriteValuePPC64_OpLeq8_0(v *Value) bool { } func rewriteValuePPC64_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (LessEqual (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -2817,9 +2724,7 @@ func rewriteValuePPC64_OpLeq8U_0(v *Value) bool { } func rewriteValuePPC64_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -2841,9 +2746,7 @@ func rewriteValuePPC64_OpLess16_0(v *Value) bool { } func rewriteValuePPC64_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (LessThan (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) @@ -2865,7 +2768,6 @@ func rewriteValuePPC64_OpLess16U_0(v *Value) bool { } func rewriteValuePPC64_OpLess32_0(v *Value) bool { b := v.Block - _ = b // match: (Less32 x y) // cond: // result: (LessThan (CMPW x y)) @@ -2883,7 +2785,6 @@ func rewriteValuePPC64_OpLess32_0(v *Value) bool { } func rewriteValuePPC64_OpLess32F_0(v *Value) bool { b := v.Block - _ = b // match: (Less32F x y) // cond: // result: (FLessThan (FCMPU x y)) @@ -2901,7 +2802,6 @@ func rewriteValuePPC64_OpLess32F_0(v *Value) bool { } func rewriteValuePPC64_OpLess32U_0(v *Value) bool { b := v.Block - _ = b // match: (Less32U x y) // cond: // result: (LessThan (CMPWU x y)) @@ -2919,7 +2819,6 @@ func rewriteValuePPC64_OpLess32U_0(v *Value) bool { } func rewriteValuePPC64_OpLess64_0(v *Value) bool { b := v.Block - _ = b // match: (Less64 x y) // cond: // result: (LessThan (CMP x y)) @@ -2937,7 +2836,6 @@ func rewriteValuePPC64_OpLess64_0(v *Value) bool { } func rewriteValuePPC64_OpLess64F_0(v *Value) bool { b := v.Block - _ = b // match: (Less64F x y) // cond: // result: (FLessThan (FCMPU x y)) @@ -2955,7 +2853,6 @@ func rewriteValuePPC64_OpLess64F_0(v *Value) bool { } func rewriteValuePPC64_OpLess64U_0(v *Value) bool { b := v.Block - _ = b // match: (Less64U x y) // cond: // result: (LessThan (CMPU x y)) @@ -2973,9 +2870,7 @@ func rewriteValuePPC64_OpLess64U_0(v *Value) bool { } func rewriteValuePPC64_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -2997,9 +2892,7 @@ func rewriteValuePPC64_OpLess8_0(v *Value) bool { } func rewriteValuePPC64_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (LessThan (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) @@ -3021,9 +2914,7 @@ func rewriteValuePPC64_OpLess8U_0(v *Value) bool { } func rewriteValuePPC64_OpLoad_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Load ptr mem) // cond: (is64BitInt(t) || isPtr(t)) // result: (MOVDload ptr mem) @@ -3204,9 +3095,7 @@ func rewriteValuePPC64_OpLocalAddr_0(v *Value) bool { } func rewriteValuePPC64_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3247,9 +3136,7 @@ func rewriteValuePPC64_OpLsh16x16_0(v *Value) bool { } func rewriteValuePPC64_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x (Const64 [c])) // cond: uint32(c) < 16 // result: (SLWconst x [c]) @@ -3328,9 +3215,7 @@ func rewriteValuePPC64_OpLsh16x32_0(v *Value) bool { } func rewriteValuePPC64_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x64 x (Const64 [c])) // cond: uint64(c) < 16 // result: (SLWconst x [c]) @@ -3424,9 +3309,7 @@ func rewriteValuePPC64_OpLsh16x64_0(v *Value) bool { } func rewriteValuePPC64_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3467,9 +3350,7 @@ func rewriteValuePPC64_OpLsh16x8_0(v *Value) bool { } func rewriteValuePPC64_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3510,9 +3391,7 @@ func rewriteValuePPC64_OpLsh32x16_0(v *Value) bool { } func rewriteValuePPC64_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x (Const64 [c])) // cond: uint32(c) < 32 // result: (SLWconst x [c]) @@ -3591,9 +3470,7 @@ func rewriteValuePPC64_OpLsh32x32_0(v *Value) bool { } func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x64 x (Const64 [c])) // cond: uint64(c) < 32 // result: (SLWconst x [c]) @@ -3766,9 +3643,7 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { } func rewriteValuePPC64_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3809,9 +3684,7 @@ func rewriteValuePPC64_OpLsh32x8_0(v *Value) bool { } func rewriteValuePPC64_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -3852,9 +3725,7 @@ func rewriteValuePPC64_OpLsh64x16_0(v *Value) bool { } func rewriteValuePPC64_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 x (Const64 [c])) // cond: uint32(c) < 64 // result: (SLDconst x [c]) @@ -3933,9 +3804,7 @@ func rewriteValuePPC64_OpLsh64x32_0(v *Value) bool { } func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 x (Const64 [c])) // cond: uint64(c) < 64 // result: (SLDconst x [c]) @@ -4108,9 +3977,7 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { } func rewriteValuePPC64_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -4151,9 +4018,7 @@ func rewriteValuePPC64_OpLsh64x8_0(v *Value) bool { } func rewriteValuePPC64_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4194,9 +4059,7 @@ func rewriteValuePPC64_OpLsh8x16_0(v *Value) bool { } func rewriteValuePPC64_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x (Const64 [c])) // cond: uint32(c) < 8 // result: (SLWconst x [c]) @@ -4275,9 +4138,7 @@ func rewriteValuePPC64_OpLsh8x32_0(v *Value) bool { } func rewriteValuePPC64_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x64 x (Const64 [c])) // cond: uint64(c) < 8 // result: (SLWconst x [c]) @@ -4371,9 +4232,7 @@ func rewriteValuePPC64_OpLsh8x64_0(v *Value) bool { } func rewriteValuePPC64_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4414,9 +4273,7 @@ func rewriteValuePPC64_OpLsh8x8_0(v *Value) bool { } func rewriteValuePPC64_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) @@ -4436,9 +4293,7 @@ func rewriteValuePPC64_OpMod16_0(v *Value) bool { } func rewriteValuePPC64_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) @@ -4458,9 +4313,7 @@ func rewriteValuePPC64_OpMod16u_0(v *Value) bool { } func rewriteValuePPC64_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (SUB x (MULLW y (DIVW x y))) @@ -4482,9 +4335,7 @@ func rewriteValuePPC64_OpMod32_0(v *Value) bool { } func rewriteValuePPC64_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (SUB x (MULLW y (DIVWU x y))) @@ -4506,9 +4357,7 @@ func rewriteValuePPC64_OpMod32u_0(v *Value) bool { } func rewriteValuePPC64_OpMod64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64 x y) // cond: // result: (SUB x (MULLD y (DIVD x y))) @@ -4530,9 +4379,7 @@ func rewriteValuePPC64_OpMod64_0(v *Value) bool { } func rewriteValuePPC64_OpMod64u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod64u x y) // cond: // result: (SUB x (MULLD y (DIVDU x y))) @@ -4554,9 +4401,7 @@ func rewriteValuePPC64_OpMod64u_0(v *Value) bool { } func rewriteValuePPC64_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) @@ -4576,9 +4421,7 @@ func rewriteValuePPC64_OpMod8_0(v *Value) bool { } func rewriteValuePPC64_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) @@ -4598,9 +4441,7 @@ func rewriteValuePPC64_OpMod8u_0(v *Value) bool { } func rewriteValuePPC64_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -5043,9 +4884,7 @@ func rewriteValuePPC64_OpNeg8_0(v *Value) bool { } func rewriteValuePPC64_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) @@ -5088,7 +4927,6 @@ func rewriteValuePPC64_OpNeq16_0(v *Value) bool { } func rewriteValuePPC64_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x y) // cond: // result: (NotEqual (CMPW x y)) @@ -5106,7 +4944,6 @@ func rewriteValuePPC64_OpNeq32_0(v *Value) bool { } func rewriteValuePPC64_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32F x y) // cond: // result: (NotEqual (FCMPU x y)) @@ -5124,7 +4961,6 @@ func rewriteValuePPC64_OpNeq32F_0(v *Value) bool { } func rewriteValuePPC64_OpNeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64 x y) // cond: // result: (NotEqual (CMP x y)) @@ -5142,7 +4978,6 @@ func rewriteValuePPC64_OpNeq64_0(v *Value) bool { } func rewriteValuePPC64_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64F x y) // cond: // result: (NotEqual (FCMPU x y)) @@ -5160,9 +4995,7 @@ func rewriteValuePPC64_OpNeq64F_0(v *Value) bool { } func rewriteValuePPC64_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) @@ -5219,7 +5052,6 @@ func rewriteValuePPC64_OpNeqB_0(v *Value) bool { } func rewriteValuePPC64_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b // match: (NeqPtr x y) // cond: // result: (NotEqual (CMP x y)) @@ -5263,9 +5095,7 @@ func rewriteValuePPC64_OpNot_0(v *Value) bool { } func rewriteValuePPC64_OpOffPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OffPtr [off] ptr) // cond: // result: (ADD (MOVDconst [off]) ptr) @@ -5352,9 +5182,7 @@ func rewriteValuePPC64_OpOrB_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64ADD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ADD (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (ROTLconst [c] x) @@ -6300,7 +6128,6 @@ func rewriteValuePPC64_OpPPC64ANDconst_10(v *Value) bool { } func rewriteValuePPC64_OpPPC64CMP_0(v *Value) bool { b := v.Block - _ = b // match: (CMP x (MOVDconst [c])) // cond: is16Bit(c) // result: (CMPconst x [c]) @@ -6345,7 +6172,6 @@ func rewriteValuePPC64_OpPPC64CMP_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64CMPU_0(v *Value) bool { b := v.Block - _ = b // match: (CMPU x (MOVDconst [c])) // cond: isU16Bit(c) // result: (CMPUconst x [c]) @@ -6441,7 +6267,6 @@ func rewriteValuePPC64_OpPPC64CMPUconst_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64CMPW_0(v *Value) bool { b := v.Block - _ = b // match: (CMPW x (MOVWreg y)) // cond: // result: (CMPW x y) @@ -6518,7 +6343,6 @@ func rewriteValuePPC64_OpPPC64CMPW_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64CMPWU_0(v *Value) bool { b := v.Block - _ = b // match: (CMPWU x (MOVWZreg y)) // cond: // result: (CMPWU x y) @@ -7508,9 +7332,7 @@ func rewriteValuePPC64_OpPPC64LessThan_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MFVSRD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MFVSRD (FMOVDconst [c])) // cond: // result: (MOVDconst [c]) @@ -7677,9 +7499,7 @@ func rewriteValuePPC64_OpPPC64MOVBZloadidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBZreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBZreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0xFF // result: y @@ -7863,9 +7683,7 @@ func rewriteValuePPC64_OpPPC64MOVBZreg_10(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0x7F // result: y @@ -8294,11 +8112,8 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (MOVBstore [off] {sym} ptr (SRWconst (MOVHreg x) [c]) mem) // cond: c <= 8 // result: (MOVBstore [off] {sym} ptr (SRWconst x [c]) mem) @@ -8761,11 +8576,8 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBstore_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (MOVBstore [i7] {s} p (SRDconst w [56]) x0:(MOVBstore [i6] {s} p (SRDconst w [48]) x1:(MOVBstore [i5] {s} p (SRDconst w [40]) x2:(MOVBstore [i4] {s} p (SRDconst w [32]) x3:(MOVWstore [i0] {s} p w mem))))) // cond: !config.BigEndian && i0%4 == 0 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) // result: (MOVDstore [i0] {s} p w mem) @@ -9056,9 +8868,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_20(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBstoreidx ptr (MOVDconst [c]) val mem) // cond: is16Bit(c) // result: (MOVBstore [c] ptr val mem) @@ -9323,9 +9133,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVBstoreidx_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBstoreidx [off] {sym} ptr idx (SRWconst (MOVWreg x) [c]) mem) // cond: c <= 24 // result: (MOVBstoreidx [off] {sym} ptr idx (SRWconst x [c]) mem) @@ -10036,9 +9844,7 @@ func rewriteValuePPC64_OpPPC64MOVHZloadidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVHZreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVHZreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0xFFFF // result: y @@ -10421,9 +10227,7 @@ func rewriteValuePPC64_OpPPC64MOVHloadidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVHreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVHreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0x7FFF // result: y @@ -10677,9 +10481,7 @@ func rewriteValuePPC64_OpPPC64MOVHreg_10(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (MOVHstore [off1] {sym} (ADDconst [off2] x) val mem) // cond: is16Bit(off1+off2) // result: (MOVHstore [off1+off2] {sym} x val mem) @@ -11323,9 +11125,7 @@ func rewriteValuePPC64_OpPPC64MOVWZloadidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVWZreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVWZreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0xFFFFFFFF // result: y @@ -11813,9 +11613,7 @@ func rewriteValuePPC64_OpPPC64MOVWloadidx_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MOVWreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVWreg y:(ANDconst [c] _)) // cond: uint64(c) <= 0xFFFF // result: y @@ -12437,9 +12235,7 @@ func rewriteValuePPC64_OpPPC64MOVWstorezero_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64MTVSRD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MTVSRD (MOVDconst [c])) // cond: // result: (FMOVDconst [c]) @@ -12559,9 +12355,7 @@ func rewriteValuePPC64_OpPPC64NotEqual_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (ROTLconst [c] x) @@ -12964,11 +12758,8 @@ func rewriteValuePPC64_OpPPC64OR_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR x (MOVDconst [c])) // cond: isU32Bit(c) // result: (ORconst [c] x) @@ -13419,11 +13210,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR s0:(SLWconst x0:(MOVBZload [i1] {s} p mem) [n1]) s1:(SLWconst x1:(MOVBZload [i0] {s} p mem) [n2])) // cond: !config.BigEndian && i1 == i0+1 && n1%8 == 0 && n2 == n1+8 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) // result: @mergePoint(b,x0,x1) (SLDconst (MOVHBRload (MOVDaddr [i0] {s} p) mem) [n1]) @@ -14140,11 +13928,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR o0:(OR s0:(SLDconst x1:(MOVBZload [i2] {s} p mem) [16]) x0:(MOVHZload [i0] {s} p mem)) s1:(SLDconst x2:(MOVBZload [i3] {s} p mem) [24])) // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses ==1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (MOVWZload {s} [i0] p mem) @@ -15045,11 +14830,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR x0:(MOVBZload [i3] {s} p mem) o0:(OR s0:(SLWconst x1:(MOVBZload [i2] {s} p mem) [8]) s1:(SLWconst x2:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [16]))) // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (MOVWBRload (MOVDaddr [i0] {s} p) mem) @@ -15994,11 +15776,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i2] {s} p mem) [40]) s0:(SLDconst x0:(MOVHBRload (MOVDaddr [i0] {s} p) mem) [48])) s2:(SLDconst x2:(MOVBZload [i3] {s} p mem) [32])) // cond: !config.BigEndian && i2 == i0+2 && i3 == i0+3 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && o0.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && mergePoint(b, x0, x1, x2) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(o0) // result: @mergePoint(b,x0,x1,x2) (SLDconst (MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]) @@ -17175,9 +16954,7 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (OR s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56]) o5:(OR o4:(OR s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40]) o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem))) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48]))) // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) @@ -18582,11 +18359,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR o5:(OR o4:(OR o3:(OR s3:(SLDconst x4:(MOVBZload [i4] {s} p mem) [32]) x0:(MOVWZload {s} [i0] p mem)) s4:(SLDconst x5:(MOVBZload [i5] {s} p mem) [40])) s5:(SLDconst x6:(MOVBZload [i6] {s} p mem) [48])) s6:(SLDconst x7:(MOVBZload [i7] {s} p mem) [56])) // cond: !config.BigEndian && i0%4 == 0 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x0.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses ==1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s3.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x0, x4, x5, x6, x7) != nil && clobber(x0) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(s3) && clobber(s4) && clobber(s5) && clobber (s6) && clobber(o3) && clobber(o4) && clobber(o5) // result: @mergePoint(b,x0,x4,x5,x6,x7) (MOVDload {s} [i0] p mem) @@ -20063,11 +19837,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR o0:(OR s1:(SLDconst x1:(MOVBZload [i1] {s} p mem) [48]) o1:(OR s2:(SLDconst x2:(MOVBZload [i2] {s} p mem) [40]) o2:(OR s3:(SLDconst x3:(MOVBZload [i3] {s} p mem) [32]) x4:(MOVWBRload (MOVDaddr [i4] p) mem)))) s0:(SLDconst x0:(MOVBZload [i0] {s} p mem) [56])) // cond: !config.BigEndian && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && o0.Uses == 1 && o1.Uses == 1 && o2.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && mergePoint(b, x0, x1, x2, x3, x4) != nil && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(o0) && clobber(o1) && clobber(o2) && clobber(s0) && clobber(s1) && clobber(s2) && clobber(s3) // result: @mergePoint(b,x0,x1,x2,x3,x4) (MOVDBRload (MOVDaddr [i0] {s} p) mem) @@ -21568,11 +21339,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]) o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])))) // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) @@ -23097,11 +22865,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR o5:(OR o4:(OR s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16]) o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLWconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32]))) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8])) x7:(MOVBZload [i7] {s} p mem)) // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) @@ -24626,11 +24391,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (OR x7:(MOVBZload [i7] {s} p mem) o5:(OR o4:(OR o3:(OR s4:(SLDconst x4:(MOVBZload [i4] {s} p mem) [24]) s0:(SLDconst x3:(MOVWBRload (MOVDaddr [i0] {s} p) mem) [32])) s5:(SLDconst x5:(MOVBZload [i5] {s} p mem) [16])) s6:(SLDconst x6:(MOVBZload [i6] {s} p mem) [8]))) // cond: !config.BigEndian && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && x7.Uses == 1 && o3.Uses == 1 && o4.Uses == 1 && o5.Uses == 1 && s0.Uses == 1 && s4.Uses == 1 && s5.Uses == 1 && s6.Uses == 1 && mergePoint(b, x3, x4, x5, x6, x7) != nil && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6) && clobber(x7) && clobber(o3) && clobber(o4) && clobber(o5) && clobber(s0) && clobber(s4) && clobber(s5) && clobber(s6) // result: @mergePoint(b,x3,x4,x5,x6,x7) (MOVDBRload (MOVDaddr [i0] {s} p) mem) @@ -26241,9 +26003,7 @@ func rewriteValuePPC64_OpPPC64SUB_0(v *Value) bool { } func rewriteValuePPC64_OpPPC64XOR_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (XOR (SLDconst x [c]) (SRDconst x [d])) // cond: d == 64-c // result: (ROTLconst [c] x) @@ -26719,9 +26479,7 @@ func rewriteValuePPC64_OpPPC64XORconst_0(v *Value) bool { } func rewriteValuePPC64_OpPopCount16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount16 x) // cond: // result: (POPCNTW (MOVHZreg x)) @@ -26736,9 +26494,7 @@ func rewriteValuePPC64_OpPopCount16_0(v *Value) bool { } func rewriteValuePPC64_OpPopCount32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount32 x) // cond: // result: (POPCNTW (MOVWZreg x)) @@ -26764,9 +26520,7 @@ func rewriteValuePPC64_OpPopCount64_0(v *Value) bool { } func rewriteValuePPC64_OpPopCount8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount8 x) // cond: // result: (POPCNTB (MOVBZreg x)) @@ -26814,9 +26568,7 @@ func rewriteValuePPC64_OpRound64F_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -26861,9 +26613,7 @@ func rewriteValuePPC64_OpRsh16Ux16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x (Const64 [c])) // cond: uint32(c) < 16 // result: (SRWconst (ZeroExt16to32 x) [c]) @@ -26950,9 +26700,7 @@ func rewriteValuePPC64_OpRsh16Ux32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x (Const64 [c])) // cond: uint64(c) < 16 // result: (SRWconst (ZeroExt16to32 x) [c]) @@ -27054,9 +26802,7 @@ func rewriteValuePPC64_OpRsh16Ux64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -27101,9 +26847,7 @@ func rewriteValuePPC64_OpRsh16Ux8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -27148,9 +26892,7 @@ func rewriteValuePPC64_OpRsh16x16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x (Const64 [c])) // cond: uint32(c) < 16 // result: (SRAWconst (SignExt16to32 x) [c]) @@ -27237,9 +26979,7 @@ func rewriteValuePPC64_OpRsh16x32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x (Const64 [c])) // cond: uint64(c) < 16 // result: (SRAWconst (SignExt16to32 x) [c]) @@ -27345,9 +27085,7 @@ func rewriteValuePPC64_OpRsh16x64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -27392,9 +27130,7 @@ func rewriteValuePPC64_OpRsh16x8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -27435,9 +27171,7 @@ func rewriteValuePPC64_OpRsh32Ux16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x (Const64 [c])) // cond: uint32(c) < 32 // result: (SRWconst x [c]) @@ -27516,9 +27250,7 @@ func rewriteValuePPC64_OpRsh32Ux32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x (Const64 [c])) // cond: uint64(c) < 32 // result: (SRWconst x [c]) @@ -27817,9 +27549,7 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32Ux64_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x y) // cond: // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) @@ -27843,9 +27573,7 @@ func rewriteValuePPC64_OpRsh32Ux64_10(v *Value) bool { } func rewriteValuePPC64_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -27886,9 +27614,7 @@ func rewriteValuePPC64_OpRsh32Ux8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -27929,9 +27655,7 @@ func rewriteValuePPC64_OpRsh32x16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x32 x (Const64 [c])) // cond: uint32(c) < 32 // result: (SRAWconst x [c]) @@ -28010,9 +27734,7 @@ func rewriteValuePPC64_OpRsh32x32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x (Const64 [c])) // cond: uint64(c) < 32 // result: (SRAWconst x [c]) @@ -28313,9 +28035,7 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh32x64_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x y) // cond: // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) @@ -28339,9 +28059,7 @@ func rewriteValuePPC64_OpRsh32x64_10(v *Value) bool { } func rewriteValuePPC64_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -28382,9 +28100,7 @@ func rewriteValuePPC64_OpRsh32x8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -28425,9 +28141,7 @@ func rewriteValuePPC64_OpRsh64Ux16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 x (Const64 [c])) // cond: uint32(c) < 64 // result: (SRDconst x [c]) @@ -28506,9 +28220,7 @@ func rewriteValuePPC64_OpRsh64Ux32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 x (Const64 [c])) // cond: uint64(c) < 64 // result: (SRDconst x [c]) @@ -28807,9 +28519,7 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64Ux64_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 x y) // cond: // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) @@ -28833,9 +28543,7 @@ func rewriteValuePPC64_OpRsh64Ux64_10(v *Value) bool { } func rewriteValuePPC64_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -28876,9 +28584,7 @@ func rewriteValuePPC64_OpRsh64Ux8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -28919,9 +28625,7 @@ func rewriteValuePPC64_OpRsh64x16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x32 x (Const64 [c])) // cond: uint32(c) < 64 // result: (SRADconst x [c]) @@ -29000,9 +28704,7 @@ func rewriteValuePPC64_OpRsh64x32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 x (Const64 [c])) // cond: uint64(c) < 64 // result: (SRADconst x [c]) @@ -29303,9 +29005,7 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh64x64_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 x y) // cond: // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) @@ -29329,9 +29029,7 @@ func rewriteValuePPC64_OpRsh64x64_10(v *Value) bool { } func rewriteValuePPC64_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -29372,9 +29070,7 @@ func rewriteValuePPC64_OpRsh64x8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -29419,9 +29115,7 @@ func rewriteValuePPC64_OpRsh8Ux16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x (Const64 [c])) // cond: uint32(c) < 8 // result: (SRWconst (ZeroExt8to32 x) [c]) @@ -29508,9 +29202,7 @@ func rewriteValuePPC64_OpRsh8Ux32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x (Const64 [c])) // cond: uint64(c) < 8 // result: (SRWconst (ZeroExt8to32 x) [c]) @@ -29612,9 +29304,7 @@ func rewriteValuePPC64_OpRsh8Ux64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -29659,9 +29349,7 @@ func rewriteValuePPC64_OpRsh8Ux8_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -29706,9 +29394,7 @@ func rewriteValuePPC64_OpRsh8x16_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x (Const64 [c])) // cond: uint32(c) < 8 // result: (SRAWconst (SignExt8to32 x) [c]) @@ -29795,9 +29481,7 @@ func rewriteValuePPC64_OpRsh8x32_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x (Const64 [c])) // cond: uint64(c) < 8 // result: (SRAWconst (SignExt8to32 x) [c]) @@ -29903,9 +29587,7 @@ func rewriteValuePPC64_OpRsh8x64_0(v *Value) bool { } func rewriteValuePPC64_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -30016,7 +29698,6 @@ func rewriteValuePPC64_OpSignExt8to64_0(v *Value) bool { } func rewriteValuePPC64_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRADconst (NEG x) [63]) @@ -30515,7 +30196,6 @@ func rewriteValuePPC64_OpXor8_0(v *Value) bool { } func rewriteValuePPC64_OpZero_0(v *Value) bool { b := v.Block - _ = b // match: (Zero [0] _ mem) // cond: // result: mem @@ -30698,7 +30378,6 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { } func rewriteValuePPC64_OpZero_10(v *Value) bool { b := v.Block - _ = b // match: (Zero [12] {t} destptr mem) // cond: t.(*types.Type).Alignment()%4 == 0 // result: (MOVWstorezero [8] destptr (MOVDstorezero [0] destptr mem)) diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index ce501a74ef..09b7fa4474 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -989,9 +989,7 @@ func rewriteValueS390X_OpAndB_0(v *Value) bool { } func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicAdd32 ptr val mem) // cond: // result: (AddTupleFirst32 val (LAA ptr val mem)) @@ -1012,9 +1010,7 @@ func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { } func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AtomicAdd64 ptr val mem) // cond: // result: (AddTupleFirst64 val (LAAG ptr val mem)) @@ -1193,7 +1189,6 @@ func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { } func rewriteValueS390X_OpAvg64u_0(v *Value) bool { b := v.Block - _ = b // match: (Avg64u x y) // cond: // result: (ADD (SRDconst (SUB x y) [1]) y) @@ -1216,9 +1211,7 @@ func rewriteValueS390X_OpAvg64u_0(v *Value) bool { } func rewriteValueS390X_OpBitLen64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen64 x) // cond: // result: (SUB (MOVDconst [64]) (FLOGR x)) @@ -1419,9 +1412,7 @@ func rewriteValueS390X_OpConstNil_0(v *Value) bool { } func rewriteValueS390X_OpCtz32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz32 x) // cond: // result: (SUB (MOVDconst [64]) (FLOGR (MOVWZreg (ANDW (SUBWconst [1] x) (NOTW x))))) @@ -1461,9 +1452,7 @@ func rewriteValueS390X_OpCtz32NonZero_0(v *Value) bool { } func rewriteValueS390X_OpCtz64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz64 x) // cond: // result: (SUB (MOVDconst [64]) (FLOGR (AND (SUBconst [1] x) (NOT x)))) @@ -1611,9 +1600,7 @@ func rewriteValueS390X_OpCvt64to64F_0(v *Value) bool { } func rewriteValueS390X_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (DIVW (MOVHreg x) (MOVHreg y)) @@ -1633,9 +1620,7 @@ func rewriteValueS390X_OpDiv16_0(v *Value) bool { } func rewriteValueS390X_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) @@ -1655,9 +1640,7 @@ func rewriteValueS390X_OpDiv16u_0(v *Value) bool { } func rewriteValueS390X_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 x y) // cond: // result: (DIVW (MOVWreg x) y) @@ -1689,9 +1672,7 @@ func rewriteValueS390X_OpDiv32F_0(v *Value) bool { } func rewriteValueS390X_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (DIVWU (MOVWZreg x) y) @@ -1751,9 +1732,7 @@ func rewriteValueS390X_OpDiv64u_0(v *Value) bool { } func rewriteValueS390X_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (DIVW (MOVBreg x) (MOVBreg y)) @@ -1773,9 +1752,7 @@ func rewriteValueS390X_OpDiv8_0(v *Value) bool { } func rewriteValueS390X_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) @@ -1795,9 +1772,7 @@ func rewriteValueS390X_OpDiv8u_0(v *Value) bool { } func rewriteValueS390X_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -1825,9 +1800,7 @@ func rewriteValueS390X_OpEq16_0(v *Value) bool { } func rewriteValueS390X_OpEq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32 x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -1851,9 +1824,7 @@ func rewriteValueS390X_OpEq32_0(v *Value) bool { } func rewriteValueS390X_OpEq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32F x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) @@ -1877,9 +1848,7 @@ func rewriteValueS390X_OpEq32F_0(v *Value) bool { } func rewriteValueS390X_OpEq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq64 x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -1903,9 +1872,7 @@ func rewriteValueS390X_OpEq64_0(v *Value) bool { } func rewriteValueS390X_OpEq64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq64F x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) @@ -1929,9 +1896,7 @@ func rewriteValueS390X_OpEq64F_0(v *Value) bool { } func rewriteValueS390X_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -1959,9 +1924,7 @@ func rewriteValueS390X_OpEq8_0(v *Value) bool { } func rewriteValueS390X_OpEqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqB x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -1989,9 +1952,7 @@ func rewriteValueS390X_OpEqB_0(v *Value) bool { } func rewriteValueS390X_OpEqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqPtr x y) // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -2027,9 +1988,7 @@ func rewriteValueS390X_OpFloor_0(v *Value) bool { } func rewriteValueS390X_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -2057,9 +2016,7 @@ func rewriteValueS390X_OpGeq16_0(v *Value) bool { } func rewriteValueS390X_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) @@ -2087,9 +2044,7 @@ func rewriteValueS390X_OpGeq16U_0(v *Value) bool { } func rewriteValueS390X_OpGeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32 x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -2113,9 +2068,7 @@ func rewriteValueS390X_OpGeq32_0(v *Value) bool { } func rewriteValueS390X_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32F x y) // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) @@ -2139,9 +2092,7 @@ func rewriteValueS390X_OpGeq32F_0(v *Value) bool { } func rewriteValueS390X_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32U x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) @@ -2165,9 +2116,7 @@ func rewriteValueS390X_OpGeq32U_0(v *Value) bool { } func rewriteValueS390X_OpGeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64 x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -2191,9 +2140,7 @@ func rewriteValueS390X_OpGeq64_0(v *Value) bool { } func rewriteValueS390X_OpGeq64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64F x y) // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) @@ -2217,9 +2164,7 @@ func rewriteValueS390X_OpGeq64F_0(v *Value) bool { } func rewriteValueS390X_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64U x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) @@ -2243,9 +2188,7 @@ func rewriteValueS390X_OpGeq64U_0(v *Value) bool { } func rewriteValueS390X_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -2273,9 +2216,7 @@ func rewriteValueS390X_OpGeq8_0(v *Value) bool { } func rewriteValueS390X_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) @@ -2341,9 +2282,7 @@ func rewriteValueS390X_OpGetG_0(v *Value) bool { } func rewriteValueS390X_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -2371,9 +2310,7 @@ func rewriteValueS390X_OpGreater16_0(v *Value) bool { } func rewriteValueS390X_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) @@ -2401,9 +2338,7 @@ func rewriteValueS390X_OpGreater16U_0(v *Value) bool { } func rewriteValueS390X_OpGreater32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32 x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -2427,9 +2362,7 @@ func rewriteValueS390X_OpGreater32_0(v *Value) bool { } func rewriteValueS390X_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32F x y) // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) @@ -2453,9 +2386,7 @@ func rewriteValueS390X_OpGreater32F_0(v *Value) bool { } func rewriteValueS390X_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32U x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) @@ -2479,9 +2410,7 @@ func rewriteValueS390X_OpGreater32U_0(v *Value) bool { } func rewriteValueS390X_OpGreater64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater64 x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -2505,9 +2434,7 @@ func rewriteValueS390X_OpGreater64_0(v *Value) bool { } func rewriteValueS390X_OpGreater64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater64F x y) // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) @@ -2531,9 +2458,7 @@ func rewriteValueS390X_OpGreater64F_0(v *Value) bool { } func rewriteValueS390X_OpGreater64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater64U x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) @@ -2557,9 +2482,7 @@ func rewriteValueS390X_OpGreater64U_0(v *Value) bool { } func rewriteValueS390X_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -2587,9 +2510,7 @@ func rewriteValueS390X_OpGreater8_0(v *Value) bool { } func rewriteValueS390X_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) @@ -2617,9 +2538,7 @@ func rewriteValueS390X_OpGreater8U_0(v *Value) bool { } func rewriteValueS390X_OpHmul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32 x y) // cond: // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) @@ -2642,9 +2561,7 @@ func rewriteValueS390X_OpHmul32_0(v *Value) bool { } func rewriteValueS390X_OpHmul32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Hmul32u x y) // cond: // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) @@ -2730,9 +2647,7 @@ func rewriteValueS390X_OpInterCall_0(v *Value) bool { } func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsInBounds idx len) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) @@ -2756,9 +2671,7 @@ func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { } func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsNonNil p) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPconst p [0])) @@ -2780,9 +2693,7 @@ func rewriteValueS390X_OpIsNonNil_0(v *Value) bool { } func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsSliceInBounds idx len) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) @@ -2806,9 +2717,7 @@ func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueS390X_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -2836,9 +2745,7 @@ func rewriteValueS390X_OpLeq16_0(v *Value) bool { } func rewriteValueS390X_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) @@ -2866,9 +2773,7 @@ func rewriteValueS390X_OpLeq16U_0(v *Value) bool { } func rewriteValueS390X_OpLeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32 x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -2892,9 +2797,7 @@ func rewriteValueS390X_OpLeq32_0(v *Value) bool { } func rewriteValueS390X_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32F x y) // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) @@ -2918,9 +2821,7 @@ func rewriteValueS390X_OpLeq32F_0(v *Value) bool { } func rewriteValueS390X_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32U x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) @@ -2944,9 +2845,7 @@ func rewriteValueS390X_OpLeq32U_0(v *Value) bool { } func rewriteValueS390X_OpLeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64 x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -2970,9 +2869,7 @@ func rewriteValueS390X_OpLeq64_0(v *Value) bool { } func rewriteValueS390X_OpLeq64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64F x y) // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) @@ -2996,9 +2893,7 @@ func rewriteValueS390X_OpLeq64F_0(v *Value) bool { } func rewriteValueS390X_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64U x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) @@ -3022,9 +2917,7 @@ func rewriteValueS390X_OpLeq64U_0(v *Value) bool { } func rewriteValueS390X_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -3052,9 +2945,7 @@ func rewriteValueS390X_OpLeq8_0(v *Value) bool { } func rewriteValueS390X_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) @@ -3082,9 +2973,7 @@ func rewriteValueS390X_OpLeq8U_0(v *Value) bool { } func rewriteValueS390X_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -3112,9 +3001,7 @@ func rewriteValueS390X_OpLess16_0(v *Value) bool { } func rewriteValueS390X_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) @@ -3142,9 +3029,7 @@ func rewriteValueS390X_OpLess16U_0(v *Value) bool { } func rewriteValueS390X_OpLess32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32 x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -3168,9 +3053,7 @@ func rewriteValueS390X_OpLess32_0(v *Value) bool { } func rewriteValueS390X_OpLess32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32F x y) // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) @@ -3194,9 +3077,7 @@ func rewriteValueS390X_OpLess32F_0(v *Value) bool { } func rewriteValueS390X_OpLess32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32U x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) @@ -3220,9 +3101,7 @@ func rewriteValueS390X_OpLess32U_0(v *Value) bool { } func rewriteValueS390X_OpLess64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less64 x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -3246,9 +3125,7 @@ func rewriteValueS390X_OpLess64_0(v *Value) bool { } func rewriteValueS390X_OpLess64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less64F x y) // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) @@ -3272,9 +3149,7 @@ func rewriteValueS390X_OpLess64F_0(v *Value) bool { } func rewriteValueS390X_OpLess64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less64U x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) @@ -3298,9 +3173,7 @@ func rewriteValueS390X_OpLess64U_0(v *Value) bool { } func rewriteValueS390X_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -3328,9 +3201,7 @@ func rewriteValueS390X_OpLess8_0(v *Value) bool { } func rewriteValueS390X_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) @@ -3519,9 +3390,7 @@ func rewriteValueS390X_OpLocalAddr_0(v *Value) bool { } func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3565,9 +3434,7 @@ func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { } func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3609,9 +3476,7 @@ func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { } func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x64 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3653,9 +3518,7 @@ func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { } func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3699,9 +3562,7 @@ func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { } func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3745,9 +3606,7 @@ func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { } func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3789,9 +3648,7 @@ func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { } func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x64 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3833,9 +3690,7 @@ func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { } func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -3879,9 +3734,7 @@ func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { } func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -3925,9 +3778,7 @@ func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { } func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -3969,9 +3820,7 @@ func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { } func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -4013,9 +3862,7 @@ func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { } func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 x y) // cond: shiftIsBounded(v) // result: (SLD x y) @@ -4059,9 +3906,7 @@ func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { } func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4105,9 +3950,7 @@ func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { } func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4149,9 +3992,7 @@ func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { } func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x64 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4193,9 +4034,7 @@ func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { } func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: shiftIsBounded(v) // result: (SLW x y) @@ -4239,9 +4078,7 @@ func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { } func rewriteValueS390X_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (MODW (MOVHreg x) (MOVHreg y)) @@ -4261,9 +4098,7 @@ func rewriteValueS390X_OpMod16_0(v *Value) bool { } func rewriteValueS390X_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (MODWU (MOVHZreg x) (MOVHZreg y)) @@ -4283,9 +4118,7 @@ func rewriteValueS390X_OpMod16u_0(v *Value) bool { } func rewriteValueS390X_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (MODW (MOVWreg x) y) @@ -4303,9 +4136,7 @@ func rewriteValueS390X_OpMod32_0(v *Value) bool { } func rewriteValueS390X_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (MODWU (MOVWZreg x) y) @@ -4351,9 +4182,7 @@ func rewriteValueS390X_OpMod64u_0(v *Value) bool { } func rewriteValueS390X_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (MODW (MOVBreg x) (MOVBreg y)) @@ -4373,9 +4202,7 @@ func rewriteValueS390X_OpMod8_0(v *Value) bool { } func rewriteValueS390X_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (MODWU (MOVBZreg x) (MOVBZreg y)) @@ -4395,9 +4222,7 @@ func rewriteValueS390X_OpMod8u_0(v *Value) bool { } func rewriteValueS390X_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -4650,9 +4475,7 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { } func rewriteValueS390X_OpMove_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [7] dst src mem) // cond: // result: (MOVBstore [6] dst (MOVBZload [6] src mem) (MOVHstore [4] dst (MOVHZload [4] src mem) (MOVWstore dst (MOVWZload src mem) mem))) @@ -4976,9 +4799,7 @@ func rewriteValueS390X_OpNeg8_0(v *Value) bool { } func rewriteValueS390X_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) @@ -5006,9 +4827,7 @@ func rewriteValueS390X_OpNeq16_0(v *Value) bool { } func rewriteValueS390X_OpNeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32 x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) @@ -5032,9 +4851,7 @@ func rewriteValueS390X_OpNeq32_0(v *Value) bool { } func rewriteValueS390X_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32F x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) @@ -5058,9 +4875,7 @@ func rewriteValueS390X_OpNeq32F_0(v *Value) bool { } func rewriteValueS390X_OpNeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq64 x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -5084,9 +4899,7 @@ func rewriteValueS390X_OpNeq64_0(v *Value) bool { } func rewriteValueS390X_OpNeq64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq64F x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) @@ -5110,9 +4923,7 @@ func rewriteValueS390X_OpNeq64F_0(v *Value) bool { } func rewriteValueS390X_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -5140,9 +4951,7 @@ func rewriteValueS390X_OpNeq8_0(v *Value) bool { } func rewriteValueS390X_OpNeqB_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqB x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) @@ -5170,9 +4979,7 @@ func rewriteValueS390X_OpNeqB_0(v *Value) bool { } func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqPtr x y) // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) @@ -5222,9 +5029,7 @@ func rewriteValueS390X_OpNot_0(v *Value) bool { } func rewriteValueS390X_OpOffPtr_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OffPtr [off] ptr:(SP)) // cond: // result: (MOVDaddr [off] ptr) @@ -5339,9 +5144,7 @@ func rewriteValueS390X_OpOrB_0(v *Value) bool { } func rewriteValueS390X_OpPopCount16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount16 x) // cond: // result: (MOVBZreg (SumBytes2 (POPCNT x))) @@ -5358,9 +5161,7 @@ func rewriteValueS390X_OpPopCount16_0(v *Value) bool { } func rewriteValueS390X_OpPopCount32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount32 x) // cond: // result: (MOVBZreg (SumBytes4 (POPCNT x))) @@ -5377,9 +5178,7 @@ func rewriteValueS390X_OpPopCount32_0(v *Value) bool { } func rewriteValueS390X_OpPopCount64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount64 x) // cond: // result: (MOVBZreg (SumBytes8 (POPCNT x))) @@ -5396,9 +5195,7 @@ func rewriteValueS390X_OpPopCount64_0(v *Value) bool { } func rewriteValueS390X_OpPopCount8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (PopCount8 x) // cond: // result: (POPCNT (MOVBZreg x)) @@ -5487,9 +5284,7 @@ func rewriteValueS390X_OpRoundToEven_0(v *Value) bool { } func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -5537,9 +5332,7 @@ func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -5585,9 +5378,7 @@ func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -5633,9 +5424,7 @@ func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) @@ -5683,9 +5472,7 @@ func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -5731,9 +5518,7 @@ func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { } func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -5777,9 +5562,7 @@ func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { } func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -5823,9 +5606,7 @@ func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { } func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) @@ -5871,9 +5652,7 @@ func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { } func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -5917,9 +5696,7 @@ func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -5961,9 +5738,7 @@ func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { } func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -6005,9 +5780,7 @@ func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW x y) @@ -6051,9 +5824,7 @@ func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -6095,7 +5866,6 @@ func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { } func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x32 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -6135,7 +5905,6 @@ func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { } func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x64 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -6175,9 +5944,7 @@ func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { } func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: shiftIsBounded(v) // result: (SRAW x y) @@ -6219,9 +5986,7 @@ func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { } func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -6265,9 +6030,7 @@ func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { } func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -6309,9 +6072,7 @@ func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { } func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -6353,9 +6114,7 @@ func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { } func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 x y) // cond: shiftIsBounded(v) // result: (SRD x y) @@ -6399,9 +6158,7 @@ func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { } func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -6443,7 +6200,6 @@ func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { } func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x32 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -6483,7 +6239,6 @@ func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { } func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x64 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -6523,9 +6278,7 @@ func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { } func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 x y) // cond: shiftIsBounded(v) // result: (SRAD x y) @@ -6567,9 +6320,7 @@ func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { } func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -6617,9 +6368,7 @@ func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -6665,9 +6414,7 @@ func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -6713,9 +6460,7 @@ func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) @@ -6763,9 +6508,7 @@ func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -6811,9 +6554,7 @@ func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { } func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -6857,9 +6598,7 @@ func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { } func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -6903,9 +6642,7 @@ func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { } func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) @@ -7808,7 +7545,6 @@ func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { b := v.Block - _ = b // match: (ADDload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (ADD x (LGDR y)) @@ -7899,9 +7635,7 @@ func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { } func rewriteValueS390X_OpS390XAND_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (AND x (MOVDconst [c])) // cond: is32Bit(c) && c < 0 // result: (ANDconst [c] x) @@ -8727,7 +8461,6 @@ func rewriteValueS390X_OpS390XANDconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { b := v.Block - _ = b // match: (ANDload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (AND x (LGDR y)) @@ -8818,7 +8551,6 @@ func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { } func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { b := v.Block - _ = b // match: (CMP x (MOVDconst [c])) // cond: is32Bit(c) // result: (CMPconst x [c]) @@ -8863,7 +8595,6 @@ func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { } func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { b := v.Block - _ = b // match: (CMPU x (MOVDconst [c])) // cond: isU32Bit(c) // result: (CMPUconst x [int64(int32(c))]) @@ -9093,7 +8824,6 @@ func rewriteValueS390X_OpS390XCMPUconst_10(v *Value) bool { } func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { b := v.Block - _ = b // match: (CMPW x (MOVDconst [c])) // cond: // result: (CMPWconst x [int64(int32(c))]) @@ -9196,7 +8926,6 @@ func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { } func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { b := v.Block - _ = b // match: (CMPWU x (MOVDconst [c])) // cond: // result: (CMPWUconst x [int64(int32(c))]) @@ -10783,7 +10512,6 @@ func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { } func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { b := v.Block - _ = b // match: (LDGR (SRDconst [1] (SLDconst [1] x))) // cond: // result: (LPDFR (LDGR x)) @@ -11481,9 +11209,7 @@ func rewriteValueS390X_OpS390XMOVBZreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBZreg x:(MOVBZreg _)) // cond: // result: (MOVDreg x) @@ -11892,9 +11618,7 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVBreg x:(MOVBload _ _)) // cond: // result: (MOVDreg x) @@ -15313,7 +15037,6 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { b := v.Block - _ = b // match: (MOVDnop x) // cond: t.Compare(x.Type) == types.CMPeq // result: x @@ -15563,7 +15286,6 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { b := v.Block - _ = b // match: (MOVDnop x:(MOVBloadidx [off] {sym} ptr idx mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBloadidx [off] {sym} ptr idx mem) @@ -15742,7 +15464,6 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVDreg x) // cond: t.Compare(x.Type) == types.CMPeq // result: x @@ -15975,7 +15696,6 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { b := v.Block - _ = b // match: (MOVDreg x:(MOVBZloadidx [off] {sym} ptr idx mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVBZloadidx [off] {sym} ptr idx mem) @@ -17887,7 +17607,6 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVHZreg x:(MOVBZload _ _)) // cond: // result: (MOVDreg x) @@ -18064,9 +17783,7 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVHZreg x:(MOVHloadidx [off] {sym} ptr idx mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVHZloadidx [off] {sym} ptr idx mem) @@ -18358,7 +18075,6 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVHreg x:(MOVBload _ _)) // cond: // result: (MOVDreg x) @@ -18506,9 +18222,7 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVHreg x:(MOVHload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVHload [off] {sym} ptr mem) @@ -18991,9 +18705,7 @@ func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { } func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVHstoreconst [sc] {s} (ADDconst [off] ptr) mem) // cond: isU12Bit(ValAndOff(sc).Off()+off) // result: (MOVHstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -20802,7 +20514,6 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { b := v.Block - _ = b // match: (MOVWZreg x:(MOVBZload _ _)) // cond: // result: (MOVDreg x) @@ -20950,7 +20661,6 @@ func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { b := v.Block - _ = b // match: (MOVWZreg x:(MOVWload [off] {sym} ptr mem)) // cond: x.Uses == 1 && clobber(x) // result: @x.Block (MOVWZload [off] {sym} ptr mem) @@ -21411,7 +21121,6 @@ func rewriteValueS390X_OpS390XMOVWreg_0(v *Value) bool { } func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { b := v.Block - _ = b // match: (MOVWreg x:(MOVWreg _)) // cond: // result: (MOVDreg x) @@ -21960,9 +21669,7 @@ func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { } func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (MOVWstoreconst [sc] {s} (ADDconst [off] ptr) mem) // cond: isU12Bit(ValAndOff(sc).Off()+off) // result: (MOVWstoreconst [ValAndOff(sc).add(off)] {s} ptr mem) @@ -22741,7 +22448,6 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { } func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { b := v.Block - _ = b // match: (MULLDconst [-1] x) // cond: // result: (NEG x) @@ -22844,7 +22550,6 @@ func rewriteValueS390X_OpS390XMULLDconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { b := v.Block - _ = b // match: (MULLDload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (MULLD x (LGDR y)) @@ -23194,7 +22899,6 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { } func rewriteValueS390X_OpS390XMULLWconst_0(v *Value) bool { b := v.Block - _ = b // match: (MULLWconst [-1] x) // cond: // result: (NEGW x) @@ -23407,9 +23111,7 @@ func rewriteValueS390X_OpS390XNEGW_0(v *Value) bool { } func rewriteValueS390X_OpS390XNOT_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NOT x) // cond: true // result: (XOR (MOVDconst [-1]) x) @@ -23445,7 +23147,6 @@ func rewriteValueS390X_OpS390XNOTW_0(v *Value) bool { } func rewriteValueS390X_OpS390XOR_0(v *Value) bool { b := v.Block - _ = b // match: (OR x (MOVDconst [c])) // cond: isU32Bit(c) // result: (ORconst [c] x) @@ -23756,9 +23457,7 @@ func rewriteValueS390X_OpS390XOR_0(v *Value) bool { } func rewriteValueS390X_OpS390XOR_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR (MOVDconst [c]) (MOVDconst [d])) // cond: // result: (MOVDconst [c|d]) @@ -24074,9 +23773,7 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } func rewriteValueS390X_OpS390XOR_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR sh:(SLDconst [16] x0:(MOVHZload [i0] {s} p mem)) x1:(MOVHZload [i1] {s} p mem)) // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWZload [i0] {s} p mem) @@ -24676,9 +24373,7 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } func rewriteValueS390X_OpS390XOR_30(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVHZload [i1] {s} p mem))) s0:(SLDconst [j0] x0:(MOVHZload [i0] {s} p mem))) // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j1] (MOVWZload [i0] {s} p mem)) y) @@ -25233,9 +24928,7 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } func rewriteValueS390X_OpS390XOR_40(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLDconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) @@ -25780,9 +25473,7 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } func rewriteValueS390X_OpS390XOR_50(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR x1:(MOVWZloadidx [i1] {s} idx p mem) sh:(SLDconst [32] x0:(MOVWZloadidx [i0] {s} idx p mem))) // cond: i1 == i0+4 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVDloadidx [i0] {s} p idx mem) @@ -26402,9 +26093,7 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } func rewriteValueS390X_OpS390XOR_60(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} p idx mem)))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) @@ -27099,9 +26788,7 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } func rewriteValueS390X_OpS390XOR_70(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR y s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) @@ -27796,9 +27483,7 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } func rewriteValueS390X_OpS390XOR_80(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR s1:(SLDconst [j1] x1:(MOVHZloadidx [i1] {s} idx p mem)) y) s0:(SLDconst [j0] x0:(MOVHZloadidx [i0] {s} p idx mem))) // cond: i1 == i0+2 && j1 == j0-16 && j1 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j1] (MOVWZloadidx [i0] {s} p idx mem)) y) @@ -28447,9 +28132,7 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } func rewriteValueS390X_OpS390XOR_90(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem))) r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRload [i0] {s} p mem)) @@ -29113,9 +28796,7 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } func rewriteValueS390X_OpS390XOR_100(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR y s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRload [i0] {s} p mem)))) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRload [i1] {s} p mem)))) // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j0] (MOVWZreg (MOVWBRload [i0] {s} p mem))) y) @@ -29706,9 +29387,7 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } func rewriteValueS390X_OpS390XOR_110(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem)) @@ -30347,9 +30026,7 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } func rewriteValueS390X_OpS390XOR_120(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR r0:(MOVWZreg x0:(MOVWBRloadidx [i0] {s} idx p mem)) sh:(SLDconst [32] r1:(MOVWZreg x1:(MOVWBRloadidx [i1] {s} idx p mem)))) // cond: i1 == i0+4 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVDBRloadidx [i0] {s} p idx mem) @@ -31019,9 +30696,7 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } func rewriteValueS390X_OpS390XOR_130(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} p idx mem)))) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) @@ -31736,9 +31411,7 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } func rewriteValueS390X_OpS390XOR_140(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR y s0:(SLDconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) s1:(SLDconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) @@ -32525,9 +32198,7 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } func rewriteValueS390X_OpS390XOR_150(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (OR or:(OR s0:(SLDconst [j0] r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem))) y) s1:(SLDconst [j1] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) // cond: i1 == i0+2 && j1 == j0+16 && j0 % 32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (OR (SLDconst [j0] (MOVWZreg (MOVWBRloadidx [i0] {s} p idx mem))) y) @@ -33328,9 +32999,7 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { } func rewriteValueS390X_OpS390XORW_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW g:(MOVWZload [off] {sym} ptr mem) x) // cond: ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g) // result: (ORWload [off] {sym} x ptr mem) @@ -33807,9 +33476,7 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } func rewriteValueS390X_OpS390XORW_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW or:(ORW y s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j1] (MOVHZload [i0] {s} p mem)) y) @@ -34364,9 +34031,7 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } func rewriteValueS390X_OpS390XORW_30(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW x1:(MOVHZloadidx [i1] {s} idx p mem) sh:(SLWconst [16] x0:(MOVHZloadidx [i0] {s} p idx mem))) // cond: i1 == i0+2 && p.Op != OpSB && x0.Uses == 1 && x1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWZloadidx [i0] {s} p idx mem) @@ -34956,9 +34621,7 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } func rewriteValueS390X_OpS390XORW_40(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y)) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) @@ -35653,9 +35316,7 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } func rewriteValueS390X_OpS390XORW_50(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW or:(ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) y) s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem))) // cond: i1 == i0+1 && j1 == j0-8 && j1 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j1] (MOVHZloadidx [i0] {s} p idx mem)) y) @@ -36281,9 +35942,7 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } func rewriteValueS390X_OpS390XORW_60(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW or:(ORW y s0:(SLWconst [j0] x0:(MOVBZload [i0] {s} p mem))) s1:(SLWconst [j1] x1:(MOVBZload [i1] {s} p mem))) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRload [i0] {s} p mem))) y) @@ -36864,9 +36523,7 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } func rewriteValueS390X_OpS390XORW_70(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW r0:(MOVHZreg x0:(MOVHBRloadidx [i0] {s} idx p mem)) sh:(SLWconst [16] r1:(MOVHZreg x1:(MOVHBRloadidx [i1] {s} p idx mem)))) // cond: i1 == i0+2 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && sh.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(sh) // result: @mergePoint(b,x0,x1) (MOVWBRloadidx [i0] {s} p idx mem) @@ -37518,9 +37175,7 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } func rewriteValueS390X_OpS390XORW_80(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem)) or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y)) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) @@ -38235,9 +37890,7 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } func rewriteValueS390X_OpS390XORW_90(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ORW or:(ORW s0:(SLWconst [j0] x0:(MOVBZloadidx [i0] {s} idx p mem)) y) s1:(SLWconst [j1] x1:(MOVBZloadidx [i1] {s} idx p mem))) // cond: p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0 % 16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b,x0,x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or) // result: @mergePoint(b,x0,x1) (ORW (SLWconst [j0] (MOVHZreg (MOVHBRloadidx [i0] {s} p idx mem))) y) @@ -38595,7 +38248,6 @@ func rewriteValueS390X_OpS390XORconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XORload_0(v *Value) bool { b := v.Block - _ = b // match: (ORload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (OR x (LGDR y)) @@ -38724,9 +38376,7 @@ func rewriteValueS390X_OpS390XRLLG_0(v *Value) bool { } func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SLD x (MOVDconst [c])) // cond: // result: (SLDconst x [c&63]) @@ -38932,9 +38582,7 @@ func rewriteValueS390X_OpS390XSLD_10(v *Value) bool { } func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SLW x (MOVDconst [c])) // cond: // result: (SLWconst x [c&63]) @@ -39140,9 +38788,7 @@ func rewriteValueS390X_OpS390XSLW_10(v *Value) bool { } func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SRAD x (MOVDconst [c])) // cond: // result: (SRADconst x [c&63]) @@ -39365,9 +39011,7 @@ func rewriteValueS390X_OpS390XSRADconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SRAW x (MOVDconst [c])) // cond: // result: (SRAWconst x [c&63]) @@ -39590,9 +39234,7 @@ func rewriteValueS390X_OpS390XSRAWconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SRD x (MOVDconst [c])) // cond: // result: (SRDconst x [c&63]) @@ -39798,7 +39440,6 @@ func rewriteValueS390X_OpS390XSRD_10(v *Value) bool { } func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool { b := v.Block - _ = b // match: (SRDconst [1] (SLDconst [1] (LGDR x))) // cond: // result: (LGDR (LPDFR x)) @@ -39830,9 +39471,7 @@ func rewriteValueS390X_OpS390XSRDconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SRW x (MOVDconst [c])) // cond: // result: (SRWconst x [c&63]) @@ -40154,7 +39793,6 @@ func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { } func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { b := v.Block - _ = b // match: (SUB x (MOVDconst [c])) // cond: is32Bit(c) // result: (SUBconst x [c]) @@ -40240,7 +39878,6 @@ func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { } func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { b := v.Block - _ = b // match: (SUBW x (MOVDconst [c])) // cond: // result: (SUBWconst x [int64(int32(c))]) @@ -40494,7 +40131,6 @@ func rewriteValueS390X_OpS390XSUBconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { b := v.Block - _ = b // match: (SUBload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (SUB x (LGDR y)) @@ -40585,9 +40221,7 @@ func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { } func rewriteValueS390X_OpS390XSumBytes2_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SumBytes2 x) // cond: // result: (ADDW (SRWconst x [8]) x) @@ -40604,9 +40238,7 @@ func rewriteValueS390X_OpS390XSumBytes2_0(v *Value) bool { } func rewriteValueS390X_OpS390XSumBytes4_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SumBytes4 x) // cond: // result: (SumBytes2 (ADDW (SRWconst x [16]) x)) @@ -40625,9 +40257,7 @@ func rewriteValueS390X_OpS390XSumBytes4_0(v *Value) bool { } func rewriteValueS390X_OpS390XSumBytes8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SumBytes8 x) // cond: // result: (SumBytes4 (ADDW (SRDconst x [32]) x)) @@ -41353,7 +40983,6 @@ func rewriteValueS390X_OpS390XXORconst_0(v *Value) bool { } func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { b := v.Block - _ = b // match: (XORload [off] {sym} x ptr1 (FMOVDstore [off] {sym} ptr2 y _)) // cond: isSamePtr(ptr1, ptr2) // result: (XOR x (LGDR y)) @@ -41444,7 +41073,6 @@ func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { } func rewriteValueS390X_OpSelect0_0(v *Value) bool { b := v.Block - _ = b // match: (Select0 (AddTupleFirst32 val tuple)) // cond: // result: (ADDW val (Select0 tuple)) @@ -41584,7 +41212,6 @@ func rewriteValueS390X_OpSignExt8to64_0(v *Value) bool { } func rewriteValueS390X_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b // match: (Slicemask x) // cond: // result: (SRADconst (NEG x) [63]) @@ -41994,7 +41621,6 @@ func rewriteValueS390X_OpXor8_0(v *Value) bool { } func rewriteValueS390X_OpZero_0(v *Value) bool { b := v.Block - _ = b // match: (Zero [0] _ mem) // cond: // result: mem @@ -42174,7 +41800,6 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { } func rewriteValueS390X_OpZero_10(v *Value) bool { b := v.Block - _ = b // match: (Zero [s] destptr mem) // cond: s > 1024 // result: (LoweredZero [s%256] destptr (ADDconst destptr [(s/256)*256]) mem) diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index 1b7b5022da..9e0eee8fa0 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -737,9 +737,7 @@ func rewriteValueWasm_OpClosureCall_0(v *Value) bool { } func rewriteValueWasm_OpCom16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com16 x) // cond: // result: (I64Xor x (I64Const [-1])) @@ -755,9 +753,7 @@ func rewriteValueWasm_OpCom16_0(v *Value) bool { } func rewriteValueWasm_OpCom32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com32 x) // cond: // result: (I64Xor x (I64Const [-1])) @@ -773,9 +769,7 @@ func rewriteValueWasm_OpCom32_0(v *Value) bool { } func rewriteValueWasm_OpCom64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com64 x) // cond: // result: (I64Xor x (I64Const [-1])) @@ -791,9 +785,7 @@ func rewriteValueWasm_OpCom64_0(v *Value) bool { } func rewriteValueWasm_OpCom8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com8 x) // cond: // result: (I64Xor x (I64Const [-1])) @@ -968,9 +960,7 @@ func rewriteValueWasm_OpCvt32Fto64U_0(v *Value) bool { } func rewriteValueWasm_OpCvt32Uto32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32Uto32F x) // cond: // result: (LoweredRound32F (F64ConvertI64U (ZeroExt32to64 x))) @@ -987,9 +977,7 @@ func rewriteValueWasm_OpCvt32Uto32F_0(v *Value) bool { } func rewriteValueWasm_OpCvt32Uto64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32Uto64F x) // cond: // result: (F64ConvertI64U (ZeroExt32to64 x)) @@ -1004,9 +992,7 @@ func rewriteValueWasm_OpCvt32Uto64F_0(v *Value) bool { } func rewriteValueWasm_OpCvt32to32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32to32F x) // cond: // result: (LoweredRound32F (F64ConvertI64S (SignExt32to64 x))) @@ -1023,9 +1009,7 @@ func rewriteValueWasm_OpCvt32to32F_0(v *Value) bool { } func rewriteValueWasm_OpCvt32to64F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt32to64F x) // cond: // result: (F64ConvertI64S (SignExt32to64 x)) @@ -1095,9 +1079,7 @@ func rewriteValueWasm_OpCvt64Fto64U_0(v *Value) bool { } func rewriteValueWasm_OpCvt64Uto32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64Uto32F x) // cond: // result: (LoweredRound32F (F64ConvertI64U x)) @@ -1123,9 +1105,7 @@ func rewriteValueWasm_OpCvt64Uto64F_0(v *Value) bool { } func rewriteValueWasm_OpCvt64to32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Cvt64to32F x) // cond: // result: (LoweredRound32F (F64ConvertI64S x)) @@ -1151,9 +1131,7 @@ func rewriteValueWasm_OpCvt64to64F_0(v *Value) bool { } func rewriteValueWasm_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 x y) // cond: // result: (I64DivS (SignExt16to64 x) (SignExt16to64 y)) @@ -1173,9 +1151,7 @@ func rewriteValueWasm_OpDiv16_0(v *Value) bool { } func rewriteValueWasm_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16u x y) // cond: // result: (I64DivU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -1195,9 +1171,7 @@ func rewriteValueWasm_OpDiv16u_0(v *Value) bool { } func rewriteValueWasm_OpDiv32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32 x y) // cond: // result: (I64DivS (SignExt32to64 x) (SignExt32to64 y)) @@ -1231,9 +1205,7 @@ func rewriteValueWasm_OpDiv32F_0(v *Value) bool { } func rewriteValueWasm_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div32u x y) // cond: // result: (I64DivU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -1295,9 +1267,7 @@ func rewriteValueWasm_OpDiv64u_0(v *Value) bool { } func rewriteValueWasm_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 x y) // cond: // result: (I64DivS (SignExt8to64 x) (SignExt8to64 y)) @@ -1317,9 +1287,7 @@ func rewriteValueWasm_OpDiv8_0(v *Value) bool { } func rewriteValueWasm_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u x y) // cond: // result: (I64DivU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -1339,9 +1307,7 @@ func rewriteValueWasm_OpDiv8u_0(v *Value) bool { } func rewriteValueWasm_OpEq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq16 x y) // cond: // result: (I64Eq (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -1361,9 +1327,7 @@ func rewriteValueWasm_OpEq16_0(v *Value) bool { } func rewriteValueWasm_OpEq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32 x y) // cond: // result: (I64Eq (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -1383,9 +1347,7 @@ func rewriteValueWasm_OpEq32_0(v *Value) bool { } func rewriteValueWasm_OpEq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq32F x y) // cond: // result: (F64Eq (LoweredRound32F x) (LoweredRound32F y)) @@ -1433,9 +1395,7 @@ func rewriteValueWasm_OpEq64F_0(v *Value) bool { } func rewriteValueWasm_OpEq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq8 x y) // cond: // result: (I64Eq (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -1483,9 +1443,7 @@ func rewriteValueWasm_OpEqPtr_0(v *Value) bool { } func rewriteValueWasm_OpGeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16 x y) // cond: // result: (I64GeS (SignExt16to64 x) (SignExt16to64 y)) @@ -1505,9 +1463,7 @@ func rewriteValueWasm_OpGeq16_0(v *Value) bool { } func rewriteValueWasm_OpGeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq16U x y) // cond: // result: (I64GeU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -1527,9 +1483,7 @@ func rewriteValueWasm_OpGeq16U_0(v *Value) bool { } func rewriteValueWasm_OpGeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32 x y) // cond: // result: (I64GeS (SignExt32to64 x) (SignExt32to64 y)) @@ -1549,9 +1503,7 @@ func rewriteValueWasm_OpGeq32_0(v *Value) bool { } func rewriteValueWasm_OpGeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32F x y) // cond: // result: (F64Ge (LoweredRound32F x) (LoweredRound32F y)) @@ -1571,9 +1523,7 @@ func rewriteValueWasm_OpGeq32F_0(v *Value) bool { } func rewriteValueWasm_OpGeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq32U x y) // cond: // result: (I64GeU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -1635,9 +1585,7 @@ func rewriteValueWasm_OpGeq64U_0(v *Value) bool { } func rewriteValueWasm_OpGeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8 x y) // cond: // result: (I64GeS (SignExt8to64 x) (SignExt8to64 y)) @@ -1657,9 +1605,7 @@ func rewriteValueWasm_OpGeq8_0(v *Value) bool { } func rewriteValueWasm_OpGeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq8U x y) // cond: // result: (I64GeU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -1706,9 +1652,7 @@ func rewriteValueWasm_OpGetClosurePtr_0(v *Value) bool { } func rewriteValueWasm_OpGreater16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16 x y) // cond: // result: (I64GtS (SignExt16to64 x) (SignExt16to64 y)) @@ -1728,9 +1672,7 @@ func rewriteValueWasm_OpGreater16_0(v *Value) bool { } func rewriteValueWasm_OpGreater16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater16U x y) // cond: // result: (I64GtU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -1750,9 +1692,7 @@ func rewriteValueWasm_OpGreater16U_0(v *Value) bool { } func rewriteValueWasm_OpGreater32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32 x y) // cond: // result: (I64GtS (SignExt32to64 x) (SignExt32to64 y)) @@ -1772,9 +1712,7 @@ func rewriteValueWasm_OpGreater32_0(v *Value) bool { } func rewriteValueWasm_OpGreater32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32F x y) // cond: // result: (F64Gt (LoweredRound32F x) (LoweredRound32F y)) @@ -1794,9 +1732,7 @@ func rewriteValueWasm_OpGreater32F_0(v *Value) bool { } func rewriteValueWasm_OpGreater32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater32U x y) // cond: // result: (I64GtU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -1858,9 +1794,7 @@ func rewriteValueWasm_OpGreater64U_0(v *Value) bool { } func rewriteValueWasm_OpGreater8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8 x y) // cond: // result: (I64GtS (SignExt8to64 x) (SignExt8to64 y)) @@ -1880,9 +1814,7 @@ func rewriteValueWasm_OpGreater8_0(v *Value) bool { } func rewriteValueWasm_OpGreater8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater8U x y) // cond: // result: (I64GtU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -1932,9 +1864,7 @@ func rewriteValueWasm_OpIsInBounds_0(v *Value) bool { } func rewriteValueWasm_OpIsNonNil_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (IsNonNil p) // cond: // result: (I64Eqz (I64Eqz p)) @@ -1963,9 +1893,7 @@ func rewriteValueWasm_OpIsSliceInBounds_0(v *Value) bool { } func rewriteValueWasm_OpLeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16 x y) // cond: // result: (I64LeS (SignExt16to64 x) (SignExt16to64 y)) @@ -1985,9 +1913,7 @@ func rewriteValueWasm_OpLeq16_0(v *Value) bool { } func rewriteValueWasm_OpLeq16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq16U x y) // cond: // result: (I64LeU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -2007,9 +1933,7 @@ func rewriteValueWasm_OpLeq16U_0(v *Value) bool { } func rewriteValueWasm_OpLeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32 x y) // cond: // result: (I64LeS (SignExt32to64 x) (SignExt32to64 y)) @@ -2029,9 +1953,7 @@ func rewriteValueWasm_OpLeq32_0(v *Value) bool { } func rewriteValueWasm_OpLeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32F x y) // cond: // result: (F64Le (LoweredRound32F x) (LoweredRound32F y)) @@ -2051,9 +1973,7 @@ func rewriteValueWasm_OpLeq32F_0(v *Value) bool { } func rewriteValueWasm_OpLeq32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq32U x y) // cond: // result: (I64LeU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -2115,9 +2035,7 @@ func rewriteValueWasm_OpLeq64U_0(v *Value) bool { } func rewriteValueWasm_OpLeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8 x y) // cond: // result: (I64LeS (SignExt8to64 x) (SignExt8to64 y)) @@ -2137,9 +2055,7 @@ func rewriteValueWasm_OpLeq8_0(v *Value) bool { } func rewriteValueWasm_OpLeq8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq8U x y) // cond: // result: (I64LeU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -2159,9 +2075,7 @@ func rewriteValueWasm_OpLeq8U_0(v *Value) bool { } func rewriteValueWasm_OpLess16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16 x y) // cond: // result: (I64LtS (SignExt16to64 x) (SignExt16to64 y)) @@ -2181,9 +2095,7 @@ func rewriteValueWasm_OpLess16_0(v *Value) bool { } func rewriteValueWasm_OpLess16U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less16U x y) // cond: // result: (I64LtU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -2203,9 +2115,7 @@ func rewriteValueWasm_OpLess16U_0(v *Value) bool { } func rewriteValueWasm_OpLess32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32 x y) // cond: // result: (I64LtS (SignExt32to64 x) (SignExt32to64 y)) @@ -2225,9 +2135,7 @@ func rewriteValueWasm_OpLess32_0(v *Value) bool { } func rewriteValueWasm_OpLess32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32F x y) // cond: // result: (F64Lt (LoweredRound32F x) (LoweredRound32F y)) @@ -2247,9 +2155,7 @@ func rewriteValueWasm_OpLess32F_0(v *Value) bool { } func rewriteValueWasm_OpLess32U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less32U x y) // cond: // result: (I64LtU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -2311,9 +2217,7 @@ func rewriteValueWasm_OpLess64U_0(v *Value) bool { } func rewriteValueWasm_OpLess8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8 x y) // cond: // result: (I64LtS (SignExt8to64 x) (SignExt8to64 y)) @@ -2333,9 +2237,7 @@ func rewriteValueWasm_OpLess8_0(v *Value) bool { } func rewriteValueWasm_OpLess8U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less8U x y) // cond: // result: (I64LtU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -2516,9 +2418,7 @@ func rewriteValueWasm_OpLocalAddr_0(v *Value) bool { } func rewriteValueWasm_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x16 x y) // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) @@ -2536,9 +2436,7 @@ func rewriteValueWasm_OpLsh16x16_0(v *Value) bool { } func rewriteValueWasm_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x32 x y) // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) @@ -2570,9 +2468,7 @@ func rewriteValueWasm_OpLsh16x64_0(v *Value) bool { } func rewriteValueWasm_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x8 x y) // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) @@ -2590,9 +2486,7 @@ func rewriteValueWasm_OpLsh16x8_0(v *Value) bool { } func rewriteValueWasm_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x16 x y) // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) @@ -2610,9 +2504,7 @@ func rewriteValueWasm_OpLsh32x16_0(v *Value) bool { } func rewriteValueWasm_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x32 x y) // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) @@ -2644,9 +2536,7 @@ func rewriteValueWasm_OpLsh32x64_0(v *Value) bool { } func rewriteValueWasm_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x8 x y) // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) @@ -2664,9 +2554,7 @@ func rewriteValueWasm_OpLsh32x8_0(v *Value) bool { } func rewriteValueWasm_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 x y) // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) @@ -2684,9 +2572,7 @@ func rewriteValueWasm_OpLsh64x16_0(v *Value) bool { } func rewriteValueWasm_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 x y) // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) @@ -2704,9 +2590,7 @@ func rewriteValueWasm_OpLsh64x32_0(v *Value) bool { } func rewriteValueWasm_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 x y) // cond: // result: (Select (I64Shl x y) (I64Const [0]) (I64LtU y (I64Const [64]))) @@ -2733,9 +2617,7 @@ func rewriteValueWasm_OpLsh64x64_0(v *Value) bool { } func rewriteValueWasm_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 x y) // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) @@ -2753,9 +2635,7 @@ func rewriteValueWasm_OpLsh64x8_0(v *Value) bool { } func rewriteValueWasm_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x16 x y) // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) @@ -2773,9 +2653,7 @@ func rewriteValueWasm_OpLsh8x16_0(v *Value) bool { } func rewriteValueWasm_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x32 x y) // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) @@ -2807,9 +2685,7 @@ func rewriteValueWasm_OpLsh8x64_0(v *Value) bool { } func rewriteValueWasm_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x8 x y) // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) @@ -2827,9 +2703,7 @@ func rewriteValueWasm_OpLsh8x8_0(v *Value) bool { } func rewriteValueWasm_OpMod16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16 x y) // cond: // result: (I64RemS (SignExt16to64 x) (SignExt16to64 y)) @@ -2849,9 +2723,7 @@ func rewriteValueWasm_OpMod16_0(v *Value) bool { } func rewriteValueWasm_OpMod16u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod16u x y) // cond: // result: (I64RemU (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -2871,9 +2743,7 @@ func rewriteValueWasm_OpMod16u_0(v *Value) bool { } func rewriteValueWasm_OpMod32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32 x y) // cond: // result: (I64RemS (SignExt32to64 x) (SignExt32to64 y)) @@ -2893,9 +2763,7 @@ func rewriteValueWasm_OpMod32_0(v *Value) bool { } func rewriteValueWasm_OpMod32u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod32u x y) // cond: // result: (I64RemU (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -2943,9 +2811,7 @@ func rewriteValueWasm_OpMod64u_0(v *Value) bool { } func rewriteValueWasm_OpMod8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8 x y) // cond: // result: (I64RemS (SignExt8to64 x) (SignExt8to64 y)) @@ -2965,9 +2831,7 @@ func rewriteValueWasm_OpMod8_0(v *Value) bool { } func rewriteValueWasm_OpMod8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mod8u x y) // cond: // result: (I64RemU (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -2987,9 +2851,7 @@ func rewriteValueWasm_OpMod8u_0(v *Value) bool { } func rewriteValueWasm_OpMove_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [0] _ _ mem) // cond: // result: mem @@ -3233,9 +3095,7 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { } func rewriteValueWasm_OpMove_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Move [s] dst src mem) // cond: s > 8 && s < 16 // result: (I64Store [s-8] dst (I64Load [s-8] src mem) (I64Store dst (I64Load src mem) mem)) @@ -3446,9 +3306,7 @@ func rewriteValueWasm_OpMul8_0(v *Value) bool { } func rewriteValueWasm_OpNeg16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg16 x) // cond: // result: (I64Sub (I64Const [0]) x) @@ -3464,9 +3322,7 @@ func rewriteValueWasm_OpNeg16_0(v *Value) bool { } func rewriteValueWasm_OpNeg32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg32 x) // cond: // result: (I64Sub (I64Const [0]) x) @@ -3493,9 +3349,7 @@ func rewriteValueWasm_OpNeg32F_0(v *Value) bool { } func rewriteValueWasm_OpNeg64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg64 x) // cond: // result: (I64Sub (I64Const [0]) x) @@ -3522,9 +3376,7 @@ func rewriteValueWasm_OpNeg64F_0(v *Value) bool { } func rewriteValueWasm_OpNeg8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neg8 x) // cond: // result: (I64Sub (I64Const [0]) x) @@ -3540,9 +3392,7 @@ func rewriteValueWasm_OpNeg8_0(v *Value) bool { } func rewriteValueWasm_OpNeq16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq16 x y) // cond: // result: (I64Ne (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -3562,9 +3412,7 @@ func rewriteValueWasm_OpNeq16_0(v *Value) bool { } func rewriteValueWasm_OpNeq32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32 x y) // cond: // result: (I64Ne (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -3584,9 +3432,7 @@ func rewriteValueWasm_OpNeq32_0(v *Value) bool { } func rewriteValueWasm_OpNeq32F_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq32F x y) // cond: // result: (F64Ne (LoweredRound32F x) (LoweredRound32F y)) @@ -3634,9 +3480,7 @@ func rewriteValueWasm_OpNeq64F_0(v *Value) bool { } func rewriteValueWasm_OpNeq8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq8 x y) // cond: // result: (I64Ne (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -3815,9 +3659,7 @@ func rewriteValueWasm_OpRound64F_0(v *Value) bool { } func rewriteValueWasm_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux16 x y) // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt16to64 y)) @@ -3837,9 +3679,7 @@ func rewriteValueWasm_OpRsh16Ux16_0(v *Value) bool { } func rewriteValueWasm_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux32 x y) // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt32to64 y)) @@ -3859,9 +3699,7 @@ func rewriteValueWasm_OpRsh16Ux32_0(v *Value) bool { } func rewriteValueWasm_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 x y) // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) y) @@ -3879,9 +3717,7 @@ func rewriteValueWasm_OpRsh16Ux64_0(v *Value) bool { } func rewriteValueWasm_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux8 x y) // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt8to64 y)) @@ -3901,9 +3737,7 @@ func rewriteValueWasm_OpRsh16Ux8_0(v *Value) bool { } func rewriteValueWasm_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x16 x y) // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt16to64 y)) @@ -3923,9 +3757,7 @@ func rewriteValueWasm_OpRsh16x16_0(v *Value) bool { } func rewriteValueWasm_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x32 x y) // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt32to64 y)) @@ -3945,9 +3777,7 @@ func rewriteValueWasm_OpRsh16x32_0(v *Value) bool { } func rewriteValueWasm_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x y) // cond: // result: (Rsh64x64 (SignExt16to64 x) y) @@ -3965,9 +3795,7 @@ func rewriteValueWasm_OpRsh16x64_0(v *Value) bool { } func rewriteValueWasm_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x8 x y) // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt8to64 y)) @@ -3987,9 +3815,7 @@ func rewriteValueWasm_OpRsh16x8_0(v *Value) bool { } func rewriteValueWasm_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux16 x y) // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt16to64 y)) @@ -4009,9 +3835,7 @@ func rewriteValueWasm_OpRsh32Ux16_0(v *Value) bool { } func rewriteValueWasm_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux32 x y) // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt32to64 y)) @@ -4031,9 +3855,7 @@ func rewriteValueWasm_OpRsh32Ux32_0(v *Value) bool { } func rewriteValueWasm_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 x y) // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) y) @@ -4051,9 +3873,7 @@ func rewriteValueWasm_OpRsh32Ux64_0(v *Value) bool { } func rewriteValueWasm_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux8 x y) // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt8to64 y)) @@ -4073,9 +3893,7 @@ func rewriteValueWasm_OpRsh32Ux8_0(v *Value) bool { } func rewriteValueWasm_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x16 x y) // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt16to64 y)) @@ -4095,9 +3913,7 @@ func rewriteValueWasm_OpRsh32x16_0(v *Value) bool { } func rewriteValueWasm_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x32 x y) // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt32to64 y)) @@ -4117,9 +3933,7 @@ func rewriteValueWasm_OpRsh32x32_0(v *Value) bool { } func rewriteValueWasm_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x y) // cond: // result: (Rsh64x64 (SignExt32to64 x) y) @@ -4137,9 +3951,7 @@ func rewriteValueWasm_OpRsh32x64_0(v *Value) bool { } func rewriteValueWasm_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x8 x y) // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt8to64 y)) @@ -4159,9 +3971,7 @@ func rewriteValueWasm_OpRsh32x8_0(v *Value) bool { } func rewriteValueWasm_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 x y) // cond: // result: (Rsh64Ux64 x (ZeroExt16to64 y)) @@ -4179,9 +3989,7 @@ func rewriteValueWasm_OpRsh64Ux16_0(v *Value) bool { } func rewriteValueWasm_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 x y) // cond: // result: (Rsh64Ux64 x (ZeroExt32to64 y)) @@ -4199,9 +4007,7 @@ func rewriteValueWasm_OpRsh64Ux32_0(v *Value) bool { } func rewriteValueWasm_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 x y) // cond: // result: (Select (I64ShrU x y) (I64Const [0]) (I64LtU y (I64Const [64]))) @@ -4228,9 +4034,7 @@ func rewriteValueWasm_OpRsh64Ux64_0(v *Value) bool { } func rewriteValueWasm_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 x y) // cond: // result: (Rsh64Ux64 x (ZeroExt8to64 y)) @@ -4248,9 +4052,7 @@ func rewriteValueWasm_OpRsh64Ux8_0(v *Value) bool { } func rewriteValueWasm_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 x y) // cond: // result: (Rsh64x64 x (ZeroExt16to64 y)) @@ -4268,9 +4070,7 @@ func rewriteValueWasm_OpRsh64x16_0(v *Value) bool { } func rewriteValueWasm_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x32 x y) // cond: // result: (Rsh64x64 x (ZeroExt32to64 y)) @@ -4288,9 +4088,7 @@ func rewriteValueWasm_OpRsh64x32_0(v *Value) bool { } func rewriteValueWasm_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 x y) // cond: // result: (I64ShrS x (Select y (I64Const [63]) (I64LtU y (I64Const [64])))) @@ -4317,9 +4115,7 @@ func rewriteValueWasm_OpRsh64x64_0(v *Value) bool { } func rewriteValueWasm_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 x y) // cond: // result: (Rsh64x64 x (ZeroExt8to64 y)) @@ -4337,9 +4133,7 @@ func rewriteValueWasm_OpRsh64x8_0(v *Value) bool { } func rewriteValueWasm_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux16 x y) // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt16to64 y)) @@ -4359,9 +4153,7 @@ func rewriteValueWasm_OpRsh8Ux16_0(v *Value) bool { } func rewriteValueWasm_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux32 x y) // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt32to64 y)) @@ -4381,9 +4173,7 @@ func rewriteValueWasm_OpRsh8Ux32_0(v *Value) bool { } func rewriteValueWasm_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 x y) // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) y) @@ -4401,9 +4191,7 @@ func rewriteValueWasm_OpRsh8Ux64_0(v *Value) bool { } func rewriteValueWasm_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux8 x y) // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt8to64 y)) @@ -4423,9 +4211,7 @@ func rewriteValueWasm_OpRsh8Ux8_0(v *Value) bool { } func rewriteValueWasm_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x16 x y) // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt16to64 y)) @@ -4445,9 +4231,7 @@ func rewriteValueWasm_OpRsh8x16_0(v *Value) bool { } func rewriteValueWasm_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x32 x y) // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt32to64 y)) @@ -4467,9 +4251,7 @@ func rewriteValueWasm_OpRsh8x32_0(v *Value) bool { } func rewriteValueWasm_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x y) // cond: // result: (Rsh64x64 (SignExt8to64 x) y) @@ -4487,9 +4269,7 @@ func rewriteValueWasm_OpRsh8x64_0(v *Value) bool { } func rewriteValueWasm_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x8 x y) // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt8to64 y)) @@ -4509,9 +4289,7 @@ func rewriteValueWasm_OpRsh8x8_0(v *Value) bool { } func rewriteValueWasm_OpSignExt16to32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt16to32 x:(I64Load16S _ _)) // cond: // result: x @@ -4546,9 +4324,7 @@ func rewriteValueWasm_OpSignExt16to32_0(v *Value) bool { } func rewriteValueWasm_OpSignExt16to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt16to64 x:(I64Load16S _ _)) // cond: // result: x @@ -4583,9 +4359,7 @@ func rewriteValueWasm_OpSignExt16to64_0(v *Value) bool { } func rewriteValueWasm_OpSignExt32to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt32to64 x:(I64Load32S _ _)) // cond: // result: x @@ -4620,9 +4394,7 @@ func rewriteValueWasm_OpSignExt32to64_0(v *Value) bool { } func rewriteValueWasm_OpSignExt8to16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt8to16 x:(I64Load8S _ _)) // cond: // result: x @@ -4657,9 +4429,7 @@ func rewriteValueWasm_OpSignExt8to16_0(v *Value) bool { } func rewriteValueWasm_OpSignExt8to32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt8to32 x:(I64Load8S _ _)) // cond: // result: x @@ -4694,9 +4464,7 @@ func rewriteValueWasm_OpSignExt8to32_0(v *Value) bool { } func rewriteValueWasm_OpSignExt8to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt8to64 x:(I64Load8S _ _)) // cond: // result: x @@ -4731,9 +4499,7 @@ func rewriteValueWasm_OpSignExt8to64_0(v *Value) bool { } func rewriteValueWasm_OpSlicemask_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Slicemask x) // cond: // result: (I64ShrS (I64Sub (I64Const [0]) x) (I64Const [63])) @@ -5068,9 +4834,7 @@ func rewriteValueWasm_OpWB_0(v *Value) bool { } func rewriteValueWasm_OpWasmF64Add_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (F64Add (F64Const [x]) (F64Const [y])) // cond: // result: (F64Const [auxFrom64F(auxTo64F(x) + auxTo64F(y))]) @@ -5112,9 +4876,7 @@ func rewriteValueWasm_OpWasmF64Add_0(v *Value) bool { } func rewriteValueWasm_OpWasmF64Mul_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (F64Mul (F64Const [x]) (F64Const [y])) // cond: // result: (F64Const [auxFrom64F(auxTo64F(x) * auxTo64F(y))]) @@ -5156,9 +4918,7 @@ func rewriteValueWasm_OpWasmF64Mul_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Add_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Add (I64Const [x]) (I64Const [y])) // cond: // result: (I64Const [x + y]) @@ -5253,9 +5013,7 @@ func rewriteValueWasm_OpWasmI64AddConst_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64And_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64And (I64Const [x]) (I64Const [y])) // cond: // result: (I64Const [x & y]) @@ -5297,9 +5055,7 @@ func rewriteValueWasm_OpWasmI64And_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Eq_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Eq (I64Const [x]) (I64Const [y])) // cond: x == y // result: (I64Const [1]) @@ -5578,9 +5334,7 @@ func rewriteValueWasm_OpWasmI64Load8U_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Mul_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Mul (I64Const [x]) (I64Const [y])) // cond: // result: (I64Const [x * y]) @@ -5622,9 +5376,7 @@ func rewriteValueWasm_OpWasmI64Mul_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Ne_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Ne (I64Const [x]) (I64Const [y])) // cond: x == y // result: (I64Const [0]) @@ -5710,9 +5462,7 @@ func rewriteValueWasm_OpWasmI64Ne_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Or_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Or (I64Const [x]) (I64Const [y])) // cond: // result: (I64Const [x | y]) @@ -5928,9 +5678,7 @@ func rewriteValueWasm_OpWasmI64Store8_0(v *Value) bool { } func rewriteValueWasm_OpWasmI64Xor_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (I64Xor (I64Const [x]) (I64Const [y])) // cond: // result: (I64Const [x ^ y]) @@ -6028,9 +5776,7 @@ func rewriteValueWasm_OpXor8_0(v *Value) bool { } func rewriteValueWasm_OpZero_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [0] _ mem) // cond: // result: mem @@ -6247,9 +5993,7 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { } func rewriteValueWasm_OpZero_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Zero [16] destptr mem) // cond: // result: (I64Store [8] destptr (I64Const [0]) (I64Store destptr (I64Const [0]) mem)) @@ -6367,9 +6111,7 @@ func rewriteValueWasm_OpZero_10(v *Value) bool { } func rewriteValueWasm_OpZeroExt16to32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt16to32 x:(I64Load16U _ _)) // cond: // result: x @@ -6399,9 +6141,7 @@ func rewriteValueWasm_OpZeroExt16to32_0(v *Value) bool { } func rewriteValueWasm_OpZeroExt16to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt16to64 x:(I64Load16U _ _)) // cond: // result: x @@ -6431,9 +6171,7 @@ func rewriteValueWasm_OpZeroExt16to64_0(v *Value) bool { } func rewriteValueWasm_OpZeroExt32to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt32to64 x:(I64Load32U _ _)) // cond: // result: x @@ -6463,9 +6201,7 @@ func rewriteValueWasm_OpZeroExt32to64_0(v *Value) bool { } func rewriteValueWasm_OpZeroExt8to16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt8to16 x:(I64Load8U _ _)) // cond: // result: x @@ -6495,9 +6231,7 @@ func rewriteValueWasm_OpZeroExt8to16_0(v *Value) bool { } func rewriteValueWasm_OpZeroExt8to32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt8to32 x:(I64Load8U _ _)) // cond: // result: x @@ -6527,9 +6261,7 @@ func rewriteValueWasm_OpZeroExt8to32_0(v *Value) bool { } func rewriteValueWasm_OpZeroExt8to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt8to64 x:(I64Load8U _ _)) // cond: // result: x diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go index e980520376..97fd67d65b 100644 --- a/src/cmd/compile/internal/ssa/rewritedec.go +++ b/src/cmd/compile/internal/ssa/rewritedec.go @@ -97,8 +97,6 @@ func rewriteValuedec_OpIData_0(v *Value) bool { return false } func rewriteValuedec_OpITab_0(v *Value) bool { - b := v.Block - _ = b // match: (ITab (IMake itab _)) // cond: // result: itab @@ -118,11 +116,8 @@ func rewriteValuedec_OpITab_0(v *Value) bool { } func rewriteValuedec_OpLoad_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Load ptr mem) // cond: t.IsComplex() && t.Size() == 8 // result: (ComplexMake (Load ptr mem) (Load (OffPtr [4] ptr) mem) ) @@ -313,11 +308,8 @@ func rewriteValuedec_OpSlicePtr_0(v *Value) bool { } func rewriteValuedec_OpStore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Store {t} dst (ComplexMake real imag) mem) // cond: t.(*types.Type).Size() == 8 // result: (Store {typ.Float32} (OffPtr [4] dst) imag (Store {typ.Float32} dst real mem)) diff --git a/src/cmd/compile/internal/ssa/rewritedec64.go b/src/cmd/compile/internal/ssa/rewritedec64.go index f88fce8076..eef5483c30 100644 --- a/src/cmd/compile/internal/ssa/rewritedec64.go +++ b/src/cmd/compile/internal/ssa/rewritedec64.go @@ -138,9 +138,7 @@ func rewriteValuedec64(v *Value) bool { } func rewriteValuedec64_OpAdd64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Add64 x y) // cond: // result: (Int64Make (Add32withcarry (Int64Hi x) (Int64Hi y) (Select1 (Add32carry (Int64Lo x) (Int64Lo y)))) (Select0 (Add32carry (Int64Lo x) (Int64Lo y)))) @@ -182,9 +180,7 @@ func rewriteValuedec64_OpAdd64_0(v *Value) bool { } func rewriteValuedec64_OpAnd64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (And64 x y) // cond: // result: (Int64Make (And32 (Int64Hi x) (Int64Hi y)) (And32 (Int64Lo x) (Int64Lo y))) @@ -214,11 +210,8 @@ func rewriteValuedec64_OpAnd64_0(v *Value) bool { } func rewriteValuedec64_OpArg_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Arg {n} [off]) // cond: is64BitInt(v.Type) && !config.BigEndian && v.Type.IsSigned() // result: (Int64Make (Arg {n} [off+4]) (Arg {n} [off])) @@ -303,9 +296,7 @@ func rewriteValuedec64_OpArg_0(v *Value) bool { } func rewriteValuedec64_OpBitLen64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (BitLen64 x) // cond: // result: (Add32 (BitLen32 (Int64Hi x)) (BitLen32 (Or32 (Int64Lo x) (Zeromask (Int64Hi x))))) @@ -335,9 +326,7 @@ func rewriteValuedec64_OpBitLen64_0(v *Value) bool { } func rewriteValuedec64_OpBswap64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Bswap64 x) // cond: // result: (Int64Make (Bswap32 (Int64Lo x)) (Bswap32 (Int64Hi x))) @@ -359,9 +348,7 @@ func rewriteValuedec64_OpBswap64_0(v *Value) bool { } func rewriteValuedec64_OpCom64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Com64 x) // cond: // result: (Int64Make (Com32 (Int64Hi x)) (Com32 (Int64Lo x))) @@ -383,9 +370,7 @@ func rewriteValuedec64_OpCom64_0(v *Value) bool { } func rewriteValuedec64_OpConst64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Const64 [c]) // cond: t.IsSigned() // result: (Int64Make (Const32 [c>>32]) (Const32 [int64(int32(c))])) @@ -426,9 +411,7 @@ func rewriteValuedec64_OpConst64_0(v *Value) bool { } func rewriteValuedec64_OpCtz64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Ctz64 x) // cond: // result: (Add32 (Ctz32 (Int64Lo x)) (And32 (Com32 (Zeromask (Int64Lo x))) (Ctz32 (Int64Hi x)))) @@ -471,9 +454,7 @@ func rewriteValuedec64_OpCtz64NonZero_0(v *Value) bool { } func rewriteValuedec64_OpEq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Eq64 x y) // cond: // result: (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Eq32 (Int64Lo x) (Int64Lo y))) @@ -503,9 +484,7 @@ func rewriteValuedec64_OpEq64_0(v *Value) bool { } func rewriteValuedec64_OpGeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64 x y) // cond: // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) @@ -545,9 +524,7 @@ func rewriteValuedec64_OpGeq64_0(v *Value) bool { } func rewriteValuedec64_OpGeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Geq64U x y) // cond: // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) @@ -587,9 +564,7 @@ func rewriteValuedec64_OpGeq64U_0(v *Value) bool { } func rewriteValuedec64_OpGreater64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater64 x y) // cond: // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) @@ -629,9 +604,7 @@ func rewriteValuedec64_OpGreater64_0(v *Value) bool { } func rewriteValuedec64_OpGreater64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Greater64U x y) // cond: // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) @@ -707,9 +680,7 @@ func rewriteValuedec64_OpInt64Lo_0(v *Value) bool { } func rewriteValuedec64_OpLeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64 x y) // cond: // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) @@ -749,9 +720,7 @@ func rewriteValuedec64_OpLeq64_0(v *Value) bool { } func rewriteValuedec64_OpLeq64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Leq64U x y) // cond: // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) @@ -791,9 +760,7 @@ func rewriteValuedec64_OpLeq64U_0(v *Value) bool { } func rewriteValuedec64_OpLess64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less64 x y) // cond: // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) @@ -833,9 +800,7 @@ func rewriteValuedec64_OpLess64_0(v *Value) bool { } func rewriteValuedec64_OpLess64U_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Less64U x y) // cond: // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) @@ -875,11 +840,8 @@ func rewriteValuedec64_OpLess64U_0(v *Value) bool { } func rewriteValuedec64_OpLoad_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Load ptr mem) // cond: is64BitInt(t) && !config.BigEndian && t.IsSigned() // result: (Int64Make (Load (OffPtr [4] ptr) mem) (Load ptr mem)) @@ -984,9 +946,7 @@ func rewriteValuedec64_OpLoad_0(v *Value) bool { } func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -1063,9 +1023,7 @@ func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { } func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -1142,9 +1100,7 @@ func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { } func rewriteValuedec64_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x16 (Int64Make hi lo) s) // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x16 hi s) (Rsh32Ux16 lo (Sub16 (Const16 [32]) s))) (Lsh32x16 lo (Sub16 s (Const16 [32])))) (Lsh32x16 lo s)) @@ -1195,9 +1151,7 @@ func rewriteValuedec64_OpLsh64x16_0(v *Value) bool { } func rewriteValuedec64_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x32 (Int64Make hi lo) s) // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x32 hi s) (Rsh32Ux32 lo (Sub32 (Const32 [32]) s))) (Lsh32x32 lo (Sub32 s (Const32 [32])))) (Lsh32x32 lo s)) @@ -1248,9 +1202,7 @@ func rewriteValuedec64_OpLsh64x32_0(v *Value) bool { } func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const64 [0]) @@ -1327,9 +1279,7 @@ func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { } func rewriteValuedec64_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x8 (Int64Make hi lo) s) // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x8 hi s) (Rsh32Ux8 lo (Sub8 (Const8 [32]) s))) (Lsh32x8 lo (Sub8 s (Const8 [32])))) (Lsh32x8 lo s)) @@ -1380,9 +1330,7 @@ func rewriteValuedec64_OpLsh64x8_0(v *Value) bool { } func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -1459,9 +1407,7 @@ func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { } func rewriteValuedec64_OpMul64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul64 x y) // cond: // result: (Int64Make (Add32 (Mul32 (Int64Lo x) (Int64Hi y)) (Add32 (Mul32 (Int64Hi x) (Int64Lo y)) (Select0 (Mul32uhilo (Int64Lo x) (Int64Lo y))))) (Select1 (Mul32uhilo (Int64Lo x) (Int64Lo y)))) @@ -1515,7 +1461,6 @@ func rewriteValuedec64_OpMul64_0(v *Value) bool { } func rewriteValuedec64_OpNeg64_0(v *Value) bool { b := v.Block - _ = b // match: (Neg64 x) // cond: // result: (Sub64 (Const64 [0]) x) @@ -1532,9 +1477,7 @@ func rewriteValuedec64_OpNeg64_0(v *Value) bool { } func rewriteValuedec64_OpNeq64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Neq64 x y) // cond: // result: (OrB (Neq32 (Int64Hi x) (Int64Hi y)) (Neq32 (Int64Lo x) (Int64Lo y))) @@ -1564,9 +1507,7 @@ func rewriteValuedec64_OpNeq64_0(v *Value) bool { } func rewriteValuedec64_OpOr64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Or64 x y) // cond: // result: (Int64Make (Or32 (Int64Hi x) (Int64Hi y)) (Or32 (Int64Lo x) (Int64Lo y))) @@ -1596,9 +1537,7 @@ func rewriteValuedec64_OpOr64_0(v *Value) bool { } func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -1675,9 +1614,7 @@ func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { } func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 x (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Signmask (SignExt16to32 x)) @@ -1757,9 +1694,7 @@ func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { } func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -1836,9 +1771,7 @@ func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { } func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 x (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Signmask x) @@ -1916,9 +1849,7 @@ func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { } func rewriteValuedec64_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux16 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32Ux16 hi s) (Or32 (Or32 (Rsh32Ux16 lo s) (Lsh32x16 hi (Sub16 (Const16 [32]) s))) (Rsh32Ux16 hi (Sub16 s (Const16 [32]))))) @@ -1969,9 +1900,7 @@ func rewriteValuedec64_OpRsh64Ux16_0(v *Value) bool { } func rewriteValuedec64_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux32 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32Ux32 hi s) (Or32 (Or32 (Rsh32Ux32 lo s) (Lsh32x32 hi (Sub32 (Const32 [32]) s))) (Rsh32Ux32 hi (Sub32 s (Const32 [32]))))) @@ -2022,9 +1951,7 @@ func rewriteValuedec64_OpRsh64Ux32_0(v *Value) bool { } func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const64 [0]) @@ -2101,9 +2028,7 @@ func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { } func rewriteValuedec64_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux8 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32Ux8 hi s) (Or32 (Or32 (Rsh32Ux8 lo s) (Lsh32x8 hi (Sub8 (Const8 [32]) s))) (Rsh32Ux8 hi (Sub8 s (Const8 [32]))))) @@ -2154,9 +2079,7 @@ func rewriteValuedec64_OpRsh64Ux8_0(v *Value) bool { } func rewriteValuedec64_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x16 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32x16 hi s) (Or32 (Or32 (Rsh32Ux16 lo s) (Lsh32x16 hi (Sub16 (Const16 [32]) s))) (And32 (Rsh32x16 hi (Sub16 s (Const16 [32]))) (Zeromask (ZeroExt16to32 (Rsh16Ux32 s (Const32 [5]))))))) @@ -2219,9 +2142,7 @@ func rewriteValuedec64_OpRsh64x16_0(v *Value) bool { } func rewriteValuedec64_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x32 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32x32 hi s) (Or32 (Or32 (Rsh32Ux32 lo s) (Lsh32x32 hi (Sub32 (Const32 [32]) s))) (And32 (Rsh32x32 hi (Sub32 s (Const32 [32]))) (Zeromask (Rsh32Ux32 s (Const32 [5])))))) @@ -2282,9 +2203,7 @@ func rewriteValuedec64_OpRsh64x32_0(v *Value) bool { } func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 x (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Int64Make (Signmask (Int64Hi x)) (Signmask (Int64Hi x))) @@ -2371,9 +2290,7 @@ func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { } func rewriteValuedec64_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x8 (Int64Make hi lo) s) // cond: // result: (Int64Make (Rsh32x8 hi s) (Or32 (Or32 (Rsh32Ux8 lo s) (Lsh32x8 hi (Sub8 (Const8 [32]) s))) (And32 (Rsh32x8 hi (Sub8 s (Const8 [32]))) (Zeromask (ZeroExt8to32 (Rsh8Ux32 s (Const32 [5]))))))) @@ -2436,9 +2353,7 @@ func rewriteValuedec64_OpRsh64x8_0(v *Value) bool { } func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 _ (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Const32 [0]) @@ -2515,9 +2430,7 @@ func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { } func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8x64 x (Int64Make (Const32 [c]) _)) // cond: c != 0 // result: (Signmask (SignExt8to32 x)) @@ -2597,9 +2510,7 @@ func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { } func rewriteValuedec64_OpSignExt16to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt16to64 x) // cond: // result: (SignExt32to64 (SignExt16to32 x)) @@ -2614,9 +2525,7 @@ func rewriteValuedec64_OpSignExt16to64_0(v *Value) bool { } func rewriteValuedec64_OpSignExt32to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt32to64 x) // cond: // result: (Int64Make (Signmask x) x) @@ -2632,9 +2541,7 @@ func rewriteValuedec64_OpSignExt32to64_0(v *Value) bool { } func rewriteValuedec64_OpSignExt8to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (SignExt8to64 x) // cond: // result: (SignExt32to64 (SignExt8to32 x)) @@ -2649,9 +2556,7 @@ func rewriteValuedec64_OpSignExt8to64_0(v *Value) bool { } func rewriteValuedec64_OpStore_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Store {t} dst (Int64Make hi lo) mem) // cond: t.(*types.Type).Size() == 8 && !config.BigEndian // result: (Store {hi.Type} (OffPtr [4] dst) hi (Store {lo.Type} dst lo mem)) @@ -2722,9 +2627,7 @@ func rewriteValuedec64_OpStore_0(v *Value) bool { } func rewriteValuedec64_OpSub64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Sub64 x y) // cond: // result: (Int64Make (Sub32withcarry (Int64Hi x) (Int64Hi y) (Select1 (Sub32carry (Int64Lo x) (Int64Lo y)))) (Select0 (Sub32carry (Int64Lo x) (Int64Lo y)))) @@ -2818,9 +2721,7 @@ func rewriteValuedec64_OpTrunc64to8_0(v *Value) bool { } func rewriteValuedec64_OpXor64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Xor64 x y) // cond: // result: (Int64Make (Xor32 (Int64Hi x) (Int64Hi y)) (Xor32 (Int64Lo x) (Int64Lo y))) @@ -2850,9 +2751,7 @@ func rewriteValuedec64_OpXor64_0(v *Value) bool { } func rewriteValuedec64_OpZeroExt16to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt16to64 x) // cond: // result: (ZeroExt32to64 (ZeroExt16to32 x)) @@ -2867,9 +2766,7 @@ func rewriteValuedec64_OpZeroExt16to64_0(v *Value) bool { } func rewriteValuedec64_OpZeroExt32to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt32to64 x) // cond: // result: (Int64Make (Const32 [0]) x) @@ -2885,9 +2782,7 @@ func rewriteValuedec64_OpZeroExt32to64_0(v *Value) bool { } func rewriteValuedec64_OpZeroExt8to64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ZeroExt8to64 x) // cond: // result: (ZeroExt32to64 (ZeroExt8to32 x)) diff --git a/src/cmd/compile/internal/ssa/rewritedecArgs.go b/src/cmd/compile/internal/ssa/rewritedecArgs.go index 6b823252ea..633c0fa8b5 100644 --- a/src/cmd/compile/internal/ssa/rewritedecArgs.go +++ b/src/cmd/compile/internal/ssa/rewritedecArgs.go @@ -24,13 +24,9 @@ func rewriteValuedecArgs(v *Value) bool { } func rewriteValuedecArgs_OpArg_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config fe := b.Func.fe - _ = fe typ := &b.Func.Config.Types - _ = typ // match: (Arg {n} [off]) // cond: v.Type.IsString() // result: (StringMake (Arg {n} [off]) (Arg {n} [off+config.PtrSize])) @@ -242,9 +238,7 @@ func rewriteValuedecArgs_OpArg_0(v *Value) bool { } func rewriteValuedecArgs_OpArg_10(v *Value) bool { b := v.Block - _ = b fe := b.Func.fe - _ = fe // match: (Arg ) // cond: t.IsArray() && t.NumElem() == 0 // result: (ArrayMake0) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index f2c7529e02..a173d4c8f7 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -472,7 +472,6 @@ func rewriteValuegeneric(v *Value) bool { } func rewriteValuegeneric_OpAdd16_0(v *Value) bool { b := v.Block - _ = b // match: (Add16 (Const16 [c]) (Const16 [d])) // cond: // result: (Const16 [int64(int16(c+d))]) @@ -755,7 +754,6 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { } func rewriteValuegeneric_OpAdd16_10(v *Value) bool { b := v.Block - _ = b // match: (Add16 (Const16 [0]) x) // cond: // result: x @@ -1006,7 +1004,6 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { } func rewriteValuegeneric_OpAdd16_20(v *Value) bool { b := v.Block - _ = b // match: (Add16 x (Sub16 i:(Const16 ) z)) // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Add16 i (Sub16 x z)) @@ -1307,7 +1304,6 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { } func rewriteValuegeneric_OpAdd16_30(v *Value) bool { b := v.Block - _ = b // match: (Add16 (Const16 [c]) (Sub16 (Const16 [d]) x)) // cond: // result: (Sub16 (Const16 [int64(int16(c+d))]) x) @@ -1440,7 +1436,6 @@ func rewriteValuegeneric_OpAdd16_30(v *Value) bool { } func rewriteValuegeneric_OpAdd32_0(v *Value) bool { b := v.Block - _ = b // match: (Add32 (Const32 [c]) (Const32 [d])) // cond: // result: (Const32 [int64(int32(c+d))]) @@ -1723,7 +1718,6 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { } func rewriteValuegeneric_OpAdd32_10(v *Value) bool { b := v.Block - _ = b // match: (Add32 (Const32 [0]) x) // cond: // result: x @@ -1974,7 +1968,6 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { } func rewriteValuegeneric_OpAdd32_20(v *Value) bool { b := v.Block - _ = b // match: (Add32 x (Sub32 i:(Const32 ) z)) // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Add32 i (Sub32 x z)) @@ -2275,7 +2268,6 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { } func rewriteValuegeneric_OpAdd32_30(v *Value) bool { b := v.Block - _ = b // match: (Add32 (Const32 [c]) (Sub32 (Const32 [d]) x)) // cond: // result: (Sub32 (Const32 [int64(int32(c+d))]) x) @@ -2449,7 +2441,6 @@ func rewriteValuegeneric_OpAdd32F_0(v *Value) bool { } func rewriteValuegeneric_OpAdd64_0(v *Value) bool { b := v.Block - _ = b // match: (Add64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c+d]) @@ -2732,7 +2723,6 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { } func rewriteValuegeneric_OpAdd64_10(v *Value) bool { b := v.Block - _ = b // match: (Add64 (Const64 [0]) x) // cond: // result: x @@ -2983,7 +2973,6 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { } func rewriteValuegeneric_OpAdd64_20(v *Value) bool { b := v.Block - _ = b // match: (Add64 x (Sub64 i:(Const64 ) z)) // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Add64 i (Sub64 x z)) @@ -3284,7 +3273,6 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { } func rewriteValuegeneric_OpAdd64_30(v *Value) bool { b := v.Block - _ = b // match: (Add64 (Const64 [c]) (Sub64 (Const64 [d]) x)) // cond: // result: (Sub64 (Const64 [c+d]) x) @@ -3458,7 +3446,6 @@ func rewriteValuegeneric_OpAdd64F_0(v *Value) bool { } func rewriteValuegeneric_OpAdd8_0(v *Value) bool { b := v.Block - _ = b // match: (Add8 (Const8 [c]) (Const8 [d])) // cond: // result: (Const8 [int64(int8(c+d))]) @@ -3741,7 +3728,6 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { } func rewriteValuegeneric_OpAdd8_10(v *Value) bool { b := v.Block - _ = b // match: (Add8 (Const8 [0]) x) // cond: // result: x @@ -3992,7 +3978,6 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { } func rewriteValuegeneric_OpAdd8_20(v *Value) bool { b := v.Block - _ = b // match: (Add8 x (Sub8 i:(Const8 ) z)) // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Add8 i (Sub8 x z)) @@ -4293,7 +4278,6 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { } func rewriteValuegeneric_OpAdd8_30(v *Value) bool { b := v.Block - _ = b // match: (Add8 (Const8 [c]) (Sub8 (Const8 [d]) x)) // cond: // result: (Sub8 (Const8 [int64(int8(c+d))]) x) @@ -4680,7 +4664,6 @@ func rewriteValuegeneric_OpAnd16_0(v *Value) bool { } func rewriteValuegeneric_OpAnd16_10(v *Value) bool { b := v.Block - _ = b // match: (And16 _ (Const16 [0])) // cond: // result: (Const16 [0]) @@ -4925,7 +4908,6 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { } func rewriteValuegeneric_OpAnd16_20(v *Value) bool { b := v.Block - _ = b // match: (And16 (Const16 [c]) (And16 x (Const16 [d]))) // cond: // result: (And16 (Const16 [int64(int16(c&d))]) x) @@ -5241,7 +5223,6 @@ func rewriteValuegeneric_OpAnd32_0(v *Value) bool { } func rewriteValuegeneric_OpAnd32_10(v *Value) bool { b := v.Block - _ = b // match: (And32 _ (Const32 [0])) // cond: // result: (Const32 [0]) @@ -5486,7 +5467,6 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { } func rewriteValuegeneric_OpAnd32_20(v *Value) bool { b := v.Block - _ = b // match: (And32 (Const32 [c]) (And32 x (Const32 [d]))) // cond: // result: (And32 (Const32 [int64(int32(c&d))]) x) @@ -5802,7 +5782,6 @@ func rewriteValuegeneric_OpAnd64_0(v *Value) bool { } func rewriteValuegeneric_OpAnd64_10(v *Value) bool { b := v.Block - _ = b // match: (And64 _ (Const64 [0])) // cond: // result: (Const64 [0]) @@ -6039,7 +6018,6 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { } func rewriteValuegeneric_OpAnd64_20(v *Value) bool { b := v.Block - _ = b // match: (And64 (And64 z i:(Const64 )) x) // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (And64 i (And64 z x)) @@ -6471,7 +6449,6 @@ func rewriteValuegeneric_OpAnd8_0(v *Value) bool { } func rewriteValuegeneric_OpAnd8_10(v *Value) bool { b := v.Block - _ = b // match: (And8 _ (Const8 [0])) // cond: // result: (Const8 [0]) @@ -6716,7 +6693,6 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { } func rewriteValuegeneric_OpAnd8_20(v *Value) bool { b := v.Block - _ = b // match: (And8 (Const8 [c]) (And8 x (Const8 [d]))) // cond: // result: (And8 (Const8 [int64(int8(c&d))]) x) @@ -6970,9 +6946,7 @@ func rewriteValuegeneric_OpCom8_0(v *Value) bool { } func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (ConstInterface) // cond: // result: (IMake (ConstNil ) (ConstNil )) @@ -6987,11 +6961,8 @@ func rewriteValuegeneric_OpConstInterface_0(v *Value) bool { } func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (ConstSlice) // cond: config.PtrSize == 4 // result: (SliceMake (ConstNil ) (Const32 [0]) (Const32 [0])) @@ -7032,13 +7003,9 @@ func rewriteValuegeneric_OpConstSlice_0(v *Value) bool { } func rewriteValuegeneric_OpConstString_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config fe := b.Func.fe - _ = fe typ := &b.Func.Config.Types - _ = typ // match: (ConstString {s}) // cond: config.PtrSize == 4 && s.(string) == "" // result: (StringMake (ConstNil) (Const32 [0])) @@ -7400,9 +7367,7 @@ func rewriteValuegeneric_OpCvt64to64F_0(v *Value) bool { } func rewriteValuegeneric_OpDiv16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div16 (Const16 [c]) (Const16 [d])) // cond: d != 0 // result: (Const16 [int64(int16(c)/int16(d))]) @@ -7575,11 +7540,8 @@ func rewriteValuegeneric_OpDiv16_0(v *Value) bool { } func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Div16u (Const16 [c]) (Const16 [d])) // cond: d != 0 // result: (Const16 [int64(int16(uint16(c)/uint16(d)))]) @@ -7762,11 +7724,8 @@ func rewriteValuegeneric_OpDiv16u_0(v *Value) bool { } func rewriteValuegeneric_OpDiv32_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Div32 (Const32 [c]) (Const32 [d])) // cond: d != 0 // result: (Const32 [int64(int32(c)/int32(d))]) @@ -8014,7 +7973,6 @@ func rewriteValuegeneric_OpDiv32_0(v *Value) bool { } func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { b := v.Block - _ = b // match: (Div32F (Const32F [c]) (Const32F [d])) // cond: // result: (Const32F [auxFrom32F(auxTo32F(c) / auxTo32F(d))]) @@ -8060,11 +8018,8 @@ func rewriteValuegeneric_OpDiv32F_0(v *Value) bool { } func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Div32u (Const32 [c]) (Const32 [d])) // cond: d != 0 // result: (Const32 [int64(int32(uint32(c)/uint32(d)))]) @@ -8306,11 +8261,8 @@ func rewriteValuegeneric_OpDiv32u_0(v *Value) bool { } func rewriteValuegeneric_OpDiv64_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Div64 (Const64 [c]) (Const64 [d])) // cond: d != 0 // result: (Const64 [c/d]) @@ -8538,7 +8490,6 @@ func rewriteValuegeneric_OpDiv64_0(v *Value) bool { } func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { b := v.Block - _ = b // match: (Div64F (Const64F [c]) (Const64F [d])) // cond: // result: (Const64F [auxFrom64F(auxTo64F(c) / auxTo64F(d))]) @@ -8584,11 +8535,8 @@ func rewriteValuegeneric_OpDiv64F_0(v *Value) bool { } func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (Div64u (Const64 [c]) (Const64 [d])) // cond: d != 0 // result: (Const64 [int64(uint64(c)/uint64(d))]) @@ -8745,9 +8693,7 @@ func rewriteValuegeneric_OpDiv64u_0(v *Value) bool { } func rewriteValuegeneric_OpDiv8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8 (Const8 [c]) (Const8 [d])) // cond: d != 0 // result: (Const8 [int64(int8(c)/int8(d))]) @@ -8920,9 +8866,7 @@ func rewriteValuegeneric_OpDiv8_0(v *Value) bool { } func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Div8u (Const8 [c]) (Const8 [d])) // cond: d != 0 // result: (Const8 [int64(int8(uint8(c)/uint8(d)))]) @@ -9000,7 +8944,6 @@ func rewriteValuegeneric_OpDiv8u_0(v *Value) bool { } func rewriteValuegeneric_OpEq16_0(v *Value) bool { b := v.Block - _ = b // match: (Eq16 x x) // cond: // result: (ConstBool [1]) @@ -9238,7 +9181,6 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { } func rewriteValuegeneric_OpEq32_0(v *Value) bool { b := v.Block - _ = b // match: (Eq32 x x) // cond: // result: (ConstBool [1]) @@ -9517,7 +9459,6 @@ func rewriteValuegeneric_OpEq32F_0(v *Value) bool { } func rewriteValuegeneric_OpEq64_0(v *Value) bool { b := v.Block - _ = b // match: (Eq64 x x) // cond: // result: (ConstBool [1]) @@ -9796,7 +9737,6 @@ func rewriteValuegeneric_OpEq64F_0(v *Value) bool { } func rewriteValuegeneric_OpEq8_0(v *Value) bool { b := v.Block - _ = b // match: (Eq8 x x) // cond: // result: (ConstBool [1]) @@ -10145,9 +10085,7 @@ func rewriteValuegeneric_OpEqB_0(v *Value) bool { } func rewriteValuegeneric_OpEqInter_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqInter x y) // cond: // result: (EqPtr (ITab x) (ITab y)) @@ -10368,9 +10306,7 @@ func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { } func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqPtr (Const32 [d]) (Const32 [c])) // cond: // result: (ConstBool [b2i(c == d)]) @@ -10567,9 +10503,7 @@ func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { } func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqPtr p (Const32 [0])) // cond: // result: (Not (IsNonNil p)) @@ -10663,9 +10597,7 @@ func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { } func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (EqSlice x y) // cond: // result: (EqPtr (SlicePtr x) (SlicePtr y)) @@ -12993,9 +12925,7 @@ func rewriteValuegeneric_OpLess8U_0(v *Value) bool { } func rewriteValuegeneric_OpLoad_0(v *Value) bool { b := v.Block - _ = b fe := b.Func.fe - _ = fe // match: (Load p1 (Store {t2} p2 x _)) // cond: isSamePtr(p1, p2) && t1.Compare(x.Type) == types.CMPeq && t1.Size() == sizeof(t2) // result: x @@ -13325,9 +13255,7 @@ func rewriteValuegeneric_OpLoad_0(v *Value) bool { } func rewriteValuegeneric_OpLoad_10(v *Value) bool { b := v.Block - _ = b fe := b.Func.fe - _ = fe // match: (Load op:(OffPtr [o1] p1) (Store {t2} p2 _ (Store {t3} p3 _ (Store {t4} p4 _ mem:(Zero [n] p5 _))))) // cond: o1 >= 0 && o1+t1.Size() <= n && isSamePtr(p1, p5) && fe.CanSSA(t1) && disjoint(op, t1.Size(), p2, sizeof(t2)) && disjoint(op, t1.Size(), p3, sizeof(t3)) && disjoint(op, t1.Size(), p4, sizeof(t4)) // result: @mem.Block (Load (OffPtr [o1] p5) mem) @@ -13641,9 +13569,7 @@ func rewriteValuegeneric_OpLoad_10(v *Value) bool { } func rewriteValuegeneric_OpLoad_20(v *Value) bool { b := v.Block - _ = b fe := b.Func.fe - _ = fe // match: (Load ptr mem) // cond: t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t) // result: (StructMake1 (Load (OffPtr [0] ptr) mem)) @@ -13804,7 +13730,6 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { } func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x16 x (Const16 [c])) // cond: // result: (Lsh16x64 x (Const64 [int64(uint16(c))])) @@ -13844,7 +13769,6 @@ func rewriteValuegeneric_OpLsh16x16_0(v *Value) bool { } func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x32 x (Const32 [c])) // cond: // result: (Lsh16x64 x (Const64 [int64(uint32(c))])) @@ -13884,9 +13808,7 @@ func rewriteValuegeneric_OpLsh16x32_0(v *Value) bool { } func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh16x64 (Const16 [c]) (Const64 [d])) // cond: // result: (Const16 [int64(int16(c) << uint64(d))]) @@ -14034,7 +13956,6 @@ func rewriteValuegeneric_OpLsh16x64_0(v *Value) bool { } func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh16x8 x (Const8 [c])) // cond: // result: (Lsh16x64 x (Const64 [int64(uint8(c))])) @@ -14074,7 +13995,6 @@ func rewriteValuegeneric_OpLsh16x8_0(v *Value) bool { } func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x16 x (Const16 [c])) // cond: // result: (Lsh32x64 x (Const64 [int64(uint16(c))])) @@ -14114,7 +14034,6 @@ func rewriteValuegeneric_OpLsh32x16_0(v *Value) bool { } func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x32 x (Const32 [c])) // cond: // result: (Lsh32x64 x (Const64 [int64(uint32(c))])) @@ -14154,9 +14073,7 @@ func rewriteValuegeneric_OpLsh32x32_0(v *Value) bool { } func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh32x64 (Const32 [c]) (Const64 [d])) // cond: // result: (Const32 [int64(int32(c) << uint64(d))]) @@ -14304,7 +14221,6 @@ func rewriteValuegeneric_OpLsh32x64_0(v *Value) bool { } func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh32x8 x (Const8 [c])) // cond: // result: (Lsh32x64 x (Const64 [int64(uint8(c))])) @@ -14344,7 +14260,6 @@ func rewriteValuegeneric_OpLsh32x8_0(v *Value) bool { } func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x16 x (Const16 [c])) // cond: // result: (Lsh64x64 x (Const64 [int64(uint16(c))])) @@ -14384,7 +14299,6 @@ func rewriteValuegeneric_OpLsh64x16_0(v *Value) bool { } func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x32 x (Const32 [c])) // cond: // result: (Lsh64x64 x (Const64 [int64(uint32(c))])) @@ -14424,9 +14338,7 @@ func rewriteValuegeneric_OpLsh64x32_0(v *Value) bool { } func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh64x64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c << uint64(d)]) @@ -14574,7 +14486,6 @@ func rewriteValuegeneric_OpLsh64x64_0(v *Value) bool { } func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh64x8 x (Const8 [c])) // cond: // result: (Lsh64x64 x (Const64 [int64(uint8(c))])) @@ -14614,7 +14525,6 @@ func rewriteValuegeneric_OpLsh64x8_0(v *Value) bool { } func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x16 x (Const16 [c])) // cond: // result: (Lsh8x64 x (Const64 [int64(uint16(c))])) @@ -14654,7 +14564,6 @@ func rewriteValuegeneric_OpLsh8x16_0(v *Value) bool { } func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x32 x (Const32 [c])) // cond: // result: (Lsh8x64 x (Const64 [int64(uint32(c))])) @@ -14694,9 +14603,7 @@ func rewriteValuegeneric_OpLsh8x32_0(v *Value) bool { } func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Lsh8x64 (Const8 [c]) (Const64 [d])) // cond: // result: (Const8 [int64(int8(c) << uint64(d))]) @@ -14844,7 +14751,6 @@ func rewriteValuegeneric_OpLsh8x64_0(v *Value) bool { } func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Lsh8x8 x (Const8 [c])) // cond: // result: (Lsh8x64 x (Const64 [int64(uint8(c))])) @@ -14884,7 +14790,6 @@ func rewriteValuegeneric_OpLsh8x8_0(v *Value) bool { } func rewriteValuegeneric_OpMod16_0(v *Value) bool { b := v.Block - _ = b // match: (Mod16 (Const16 [c]) (Const16 [d])) // cond: d != 0 // result: (Const16 [int64(int16(c % d))]) @@ -14986,7 +14891,6 @@ func rewriteValuegeneric_OpMod16_0(v *Value) bool { } func rewriteValuegeneric_OpMod16u_0(v *Value) bool { b := v.Block - _ = b // match: (Mod16u (Const16 [c]) (Const16 [d])) // cond: d != 0 // result: (Const16 [int64(uint16(c) % uint16(d))]) @@ -15065,7 +14969,6 @@ func rewriteValuegeneric_OpMod16u_0(v *Value) bool { } func rewriteValuegeneric_OpMod32_0(v *Value) bool { b := v.Block - _ = b // match: (Mod32 (Const32 [c]) (Const32 [d])) // cond: d != 0 // result: (Const32 [int64(int32(c % d))]) @@ -15167,7 +15070,6 @@ func rewriteValuegeneric_OpMod32_0(v *Value) bool { } func rewriteValuegeneric_OpMod32u_0(v *Value) bool { b := v.Block - _ = b // match: (Mod32u (Const32 [c]) (Const32 [d])) // cond: d != 0 // result: (Const32 [int64(uint32(c) % uint32(d))]) @@ -15246,7 +15148,6 @@ func rewriteValuegeneric_OpMod32u_0(v *Value) bool { } func rewriteValuegeneric_OpMod64_0(v *Value) bool { b := v.Block - _ = b // match: (Mod64 (Const64 [c]) (Const64 [d])) // cond: d != 0 // result: (Const64 [c % d]) @@ -15369,7 +15270,6 @@ func rewriteValuegeneric_OpMod64_0(v *Value) bool { } func rewriteValuegeneric_OpMod64u_0(v *Value) bool { b := v.Block - _ = b // match: (Mod64u (Const64 [c]) (Const64 [d])) // cond: d != 0 // result: (Const64 [int64(uint64(c) % uint64(d))]) @@ -15469,7 +15369,6 @@ func rewriteValuegeneric_OpMod64u_0(v *Value) bool { } func rewriteValuegeneric_OpMod8_0(v *Value) bool { b := v.Block - _ = b // match: (Mod8 (Const8 [c]) (Const8 [d])) // cond: d != 0 // result: (Const8 [int64(int8(c % d))]) @@ -15571,7 +15470,6 @@ func rewriteValuegeneric_OpMod8_0(v *Value) bool { } func rewriteValuegeneric_OpMod8u_0(v *Value) bool { b := v.Block - _ = b // match: (Mod8u (Const8 [c]) (Const8 [d])) // cond: d != 0 // result: (Const8 [int64(uint8(c) % uint8(d))]) @@ -15650,7 +15548,6 @@ func rewriteValuegeneric_OpMod8u_0(v *Value) bool { } func rewriteValuegeneric_OpMove_0(v *Value) bool { b := v.Block - _ = b // match: (Move {t} [n] dst1 src mem:(Zero {t} [n] dst2 _)) // cond: isSamePtr(src, dst2) // result: (Zero {t} [n] dst1 mem) @@ -16148,7 +16045,6 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { } func rewriteValuegeneric_OpMove_10(v *Value) bool { b := v.Block - _ = b // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} op2:(OffPtr [o2] p2) d1 (Store {t3} op3:(OffPtr [0] p3) d2 _)))) // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && o2 == sizeof(t3) && n == sizeof(t2) + sizeof(t3) // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [0] dst) d2 mem)) @@ -16978,9 +16874,7 @@ func rewriteValuegeneric_OpMove_10(v *Value) bool { } func rewriteValuegeneric_OpMove_20(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Move {t1} [n] dst p1 mem:(VarDef (Store {t2} (OffPtr [o2] p2) d1 (Store {t3} (OffPtr [o3] p3) d2 (Store {t4} (OffPtr [o4] p4) d3 (Store {t5} (OffPtr [o5] p5) d4 (Zero {t6} [n] p6 _))))))) // cond: isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && isSamePtr(p5, p6) && alignof(t2) <= alignof(t1) && alignof(t3) <= alignof(t1) && alignof(t4) <= alignof(t1) && alignof(t5) <= alignof(t1) && alignof(t6) <= alignof(t1) && registerizable(b, t2) && registerizable(b, t3) && registerizable(b, t4) && registerizable(b, t5) && n >= o2 + sizeof(t2) && n >= o3 + sizeof(t3) && n >= o4 + sizeof(t4) && n >= o5 + sizeof(t5) // result: (Store {t2} (OffPtr [o2] dst) d1 (Store {t3} (OffPtr [o3] dst) d2 (Store {t4} (OffPtr [o4] dst) d3 (Store {t5} (OffPtr [o5] dst) d4 (Zero {t1} [n] dst mem))))) @@ -17188,9 +17082,7 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool { } func rewriteValuegeneric_OpMul16_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul16 (Const16 [c]) (Const16 [d])) // cond: // result: (Const16 [int64(int16(c*d))]) @@ -17397,7 +17289,6 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { } func rewriteValuegeneric_OpMul16_10(v *Value) bool { b := v.Block - _ = b // match: (Mul16 (Const16 [0]) _) // cond: // result: (Const16 [0]) @@ -17562,9 +17453,7 @@ func rewriteValuegeneric_OpMul16_10(v *Value) bool { } func rewriteValuegeneric_OpMul32_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul32 (Const32 [c]) (Const32 [d])) // cond: // result: (Const32 [int64(int32(c*d))]) @@ -17771,7 +17660,6 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { } func rewriteValuegeneric_OpMul32_10(v *Value) bool { b := v.Block - _ = b // match: (Mul32 (Const32 [c]) (Add32 (Const32 [d]) x)) // cond: // result: (Add32 (Const32 [int64(int32(c*d))]) (Mul32 (Const32 [c]) x)) @@ -18243,9 +18131,7 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { } func rewriteValuegeneric_OpMul64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c*d]) @@ -18452,7 +18338,6 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { } func rewriteValuegeneric_OpMul64_10(v *Value) bool { b := v.Block - _ = b // match: (Mul64 (Const64 [c]) (Add64 (Const64 [d]) x)) // cond: // result: (Add64 (Const64 [c*d]) (Mul64 (Const64 [c]) x)) @@ -18924,9 +18809,7 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { } func rewriteValuegeneric_OpMul8_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Mul8 (Const8 [c]) (Const8 [d])) // cond: // result: (Const8 [int64(int8(c*d))]) @@ -19133,7 +19016,6 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { } func rewriteValuegeneric_OpMul8_10(v *Value) bool { b := v.Block - _ = b // match: (Mul8 (Const8 [0]) _) // cond: // result: (Const8 [0]) @@ -19464,7 +19346,6 @@ func rewriteValuegeneric_OpNeg8_0(v *Value) bool { } func rewriteValuegeneric_OpNeq16_0(v *Value) bool { b := v.Block - _ = b // match: (Neq16 x x) // cond: // result: (ConstBool [0]) @@ -19702,7 +19583,6 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { } func rewriteValuegeneric_OpNeq32_0(v *Value) bool { b := v.Block - _ = b // match: (Neq32 x x) // cond: // result: (ConstBool [0]) @@ -19981,7 +19861,6 @@ func rewriteValuegeneric_OpNeq32F_0(v *Value) bool { } func rewriteValuegeneric_OpNeq64_0(v *Value) bool { b := v.Block - _ = b // match: (Neq64 x x) // cond: // result: (ConstBool [0]) @@ -20260,7 +20139,6 @@ func rewriteValuegeneric_OpNeq64F_0(v *Value) bool { } func rewriteValuegeneric_OpNeq8_0(v *Value) bool { b := v.Block - _ = b // match: (Neq8 x x) // cond: // result: (ConstBool [0]) @@ -20649,9 +20527,7 @@ func rewriteValuegeneric_OpNeqB_0(v *Value) bool { } func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqInter x y) // cond: // result: (NeqPtr (ITab x) (ITab y)) @@ -21143,9 +21019,7 @@ func rewriteValuegeneric_OpNeqPtr_20(v *Value) bool { } func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (NeqSlice x y) // cond: // result: (NeqPtr (SlicePtr x) (SlicePtr y)) @@ -21165,11 +21039,8 @@ func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { } func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config fe := b.Func.fe - _ = fe // match: (NilCheck (GetG mem) mem) // cond: // result: mem @@ -22174,7 +22045,6 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { } func rewriteValuegeneric_OpOr16_10(v *Value) bool { b := v.Block - _ = b // match: (Or16 (Or16 y x) x) // cond: // result: (Or16 x y) @@ -22471,7 +22341,6 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { } func rewriteValuegeneric_OpOr16_20(v *Value) bool { b := v.Block - _ = b // match: (Or16 (Const16 [c]) (Or16 x (Const16 [d]))) // cond: // result: (Or16 (Const16 [int64(int16(c|d))]) x) @@ -22755,7 +22624,6 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { } func rewriteValuegeneric_OpOr32_10(v *Value) bool { b := v.Block - _ = b // match: (Or32 (Or32 y x) x) // cond: // result: (Or32 x y) @@ -23052,7 +22920,6 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { } func rewriteValuegeneric_OpOr32_20(v *Value) bool { b := v.Block - _ = b // match: (Or32 (Const32 [c]) (Or32 x (Const32 [d]))) // cond: // result: (Or32 (Const32 [int64(int32(c|d))]) x) @@ -23336,7 +23203,6 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { } func rewriteValuegeneric_OpOr64_10(v *Value) bool { b := v.Block - _ = b // match: (Or64 (Or64 y x) x) // cond: // result: (Or64 x y) @@ -23633,7 +23499,6 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { } func rewriteValuegeneric_OpOr64_20(v *Value) bool { b := v.Block - _ = b // match: (Or64 (Const64 [c]) (Or64 x (Const64 [d]))) // cond: // result: (Or64 (Const64 [c|d]) x) @@ -23917,7 +23782,6 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { } func rewriteValuegeneric_OpOr8_10(v *Value) bool { b := v.Block - _ = b // match: (Or8 (Or8 y x) x) // cond: // result: (Or8 x y) @@ -24214,7 +24078,6 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { } func rewriteValuegeneric_OpOr8_20(v *Value) bool { b := v.Block - _ = b // match: (Or8 (Const8 [c]) (Or8 x (Const8 [d]))) // cond: // result: (Or8 (Const8 [int64(int8(c|d))]) x) @@ -24414,11 +24277,8 @@ func rewriteValuegeneric_OpPhi_0(v *Value) bool { } func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config typ := &b.Func.Config.Types - _ = typ // match: (PtrIndex ptr idx) // cond: config.PtrSize == 4 // result: (AddPtr ptr (Mul32 idx (Const32 [t.Elem().Size()]))) @@ -24497,7 +24357,6 @@ func rewriteValuegeneric_OpRound64F_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux16 x (Const16 [c])) // cond: // result: (Rsh16Ux64 x (Const64 [int64(uint16(c))])) @@ -24537,7 +24396,6 @@ func rewriteValuegeneric_OpRsh16Ux16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux32 x (Const32 [c])) // cond: // result: (Rsh16Ux64 x (Const64 [int64(uint32(c))])) @@ -24577,9 +24435,7 @@ func rewriteValuegeneric_OpRsh16Ux32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16Ux64 (Const16 [c]) (Const64 [d])) // cond: // result: (Const16 [int64(int16(uint16(c) >> uint64(d)))]) @@ -24784,7 +24640,6 @@ func rewriteValuegeneric_OpRsh16Ux64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16Ux8 x (Const8 [c])) // cond: // result: (Rsh16Ux64 x (Const64 [int64(uint8(c))])) @@ -24824,7 +24679,6 @@ func rewriteValuegeneric_OpRsh16Ux8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x16 x (Const16 [c])) // cond: // result: (Rsh16x64 x (Const64 [int64(uint16(c))])) @@ -24864,7 +24718,6 @@ func rewriteValuegeneric_OpRsh16x16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x32 x (Const32 [c])) // cond: // result: (Rsh16x64 x (Const64 [int64(uint32(c))])) @@ -24904,9 +24757,7 @@ func rewriteValuegeneric_OpRsh16x32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh16x64 (Const16 [c]) (Const64 [d])) // cond: // result: (Const16 [int64(int16(c) >> uint64(d))]) @@ -25027,7 +24878,6 @@ func rewriteValuegeneric_OpRsh16x64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh16x8 x (Const8 [c])) // cond: // result: (Rsh16x64 x (Const64 [int64(uint8(c))])) @@ -25067,7 +24917,6 @@ func rewriteValuegeneric_OpRsh16x8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux16 x (Const16 [c])) // cond: // result: (Rsh32Ux64 x (Const64 [int64(uint16(c))])) @@ -25107,7 +24956,6 @@ func rewriteValuegeneric_OpRsh32Ux16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux32 x (Const32 [c])) // cond: // result: (Rsh32Ux64 x (Const64 [int64(uint32(c))])) @@ -25147,9 +24995,7 @@ func rewriteValuegeneric_OpRsh32Ux32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32Ux64 (Const32 [c]) (Const64 [d])) // cond: // result: (Const32 [int64(int32(uint32(c) >> uint64(d)))]) @@ -25385,7 +25231,6 @@ func rewriteValuegeneric_OpRsh32Ux64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32Ux8 x (Const8 [c])) // cond: // result: (Rsh32Ux64 x (Const64 [int64(uint8(c))])) @@ -25425,7 +25270,6 @@ func rewriteValuegeneric_OpRsh32Ux8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x16 x (Const16 [c])) // cond: // result: (Rsh32x64 x (Const64 [int64(uint16(c))])) @@ -25465,7 +25309,6 @@ func rewriteValuegeneric_OpRsh32x16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x32 x (Const32 [c])) // cond: // result: (Rsh32x64 x (Const64 [int64(uint32(c))])) @@ -25505,9 +25348,7 @@ func rewriteValuegeneric_OpRsh32x32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh32x64 (Const32 [c]) (Const64 [d])) // cond: // result: (Const32 [int64(int32(c) >> uint64(d))]) @@ -25659,7 +25500,6 @@ func rewriteValuegeneric_OpRsh32x64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh32x8 x (Const8 [c])) // cond: // result: (Rsh32x64 x (Const64 [int64(uint8(c))])) @@ -25699,7 +25539,6 @@ func rewriteValuegeneric_OpRsh32x8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux16 x (Const16 [c])) // cond: // result: (Rsh64Ux64 x (Const64 [int64(uint16(c))])) @@ -25739,7 +25578,6 @@ func rewriteValuegeneric_OpRsh64Ux16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux32 x (Const32 [c])) // cond: // result: (Rsh64Ux64 x (Const64 [int64(uint32(c))])) @@ -25779,9 +25617,7 @@ func rewriteValuegeneric_OpRsh64Ux32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64Ux64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [int64(uint64(c) >> uint64(d))]) @@ -26048,7 +25884,6 @@ func rewriteValuegeneric_OpRsh64Ux64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64Ux8 x (Const8 [c])) // cond: // result: (Rsh64Ux64 x (Const64 [int64(uint8(c))])) @@ -26088,7 +25923,6 @@ func rewriteValuegeneric_OpRsh64Ux8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x16 x (Const16 [c])) // cond: // result: (Rsh64x64 x (Const64 [int64(uint16(c))])) @@ -26128,7 +25962,6 @@ func rewriteValuegeneric_OpRsh64x16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x32 x (Const32 [c])) // cond: // result: (Rsh64x64 x (Const64 [int64(uint32(c))])) @@ -26168,9 +26001,7 @@ func rewriteValuegeneric_OpRsh64x32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh64x64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c >> uint64(d)]) @@ -26353,7 +26184,6 @@ func rewriteValuegeneric_OpRsh64x64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh64x8 x (Const8 [c])) // cond: // result: (Rsh64x64 x (Const64 [int64(uint8(c))])) @@ -26393,7 +26223,6 @@ func rewriteValuegeneric_OpRsh64x8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux16 x (Const16 [c])) // cond: // result: (Rsh8Ux64 x (Const64 [int64(uint16(c))])) @@ -26433,7 +26262,6 @@ func rewriteValuegeneric_OpRsh8Ux16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux32 x (Const32 [c])) // cond: // result: (Rsh8Ux64 x (Const64 [int64(uint32(c))])) @@ -26473,9 +26301,7 @@ func rewriteValuegeneric_OpRsh8Ux32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (Rsh8Ux64 (Const8 [c]) (Const64 [d])) // cond: // result: (Const8 [int64(int8(uint8(c) >> uint64(d)))]) @@ -26649,7 +26475,6 @@ func rewriteValuegeneric_OpRsh8Ux64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8Ux8 x (Const8 [c])) // cond: // result: (Rsh8Ux64 x (Const64 [int64(uint8(c))])) @@ -26689,7 +26514,6 @@ func rewriteValuegeneric_OpRsh8Ux8_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x16 x (Const16 [c])) // cond: // result: (Rsh8x64 x (Const64 [int64(uint16(c))])) @@ -26729,7 +26553,6 @@ func rewriteValuegeneric_OpRsh8x16_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x32 x (Const32 [c])) // cond: // result: (Rsh8x64 x (Const64 [int64(uint32(c))])) @@ -26769,7 +26592,6 @@ func rewriteValuegeneric_OpRsh8x32_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x64 (Const8 [c]) (Const64 [d])) // cond: // result: (Const8 [int64(int8(c) >> uint64(d))]) @@ -26859,7 +26681,6 @@ func rewriteValuegeneric_OpRsh8x64_0(v *Value) bool { } func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { b := v.Block - _ = b // match: (Rsh8x8 x (Const8 [c])) // cond: // result: (Rsh8x64 x (Const64 [int64(uint8(c))])) @@ -27393,9 +27214,7 @@ func rewriteValuegeneric_OpSqrt_0(v *Value) bool { } func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (StaticCall {sym} s1:(Store _ (Const64 [sz]) s2:(Store _ src s3:(Store {t} _ dst mem)))) // cond: isSameSym(sym,"runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst,src,sz,config) && clobber(s1) && clobber(s2) && clobber(s3) // result: (Move {t.(*types.Type).Elem()} [sz] dst src mem) @@ -27494,7 +27313,6 @@ func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { } func rewriteValuegeneric_OpStore_0(v *Value) bool { b := v.Block - _ = b // match: (Store {t1} p1 (Load p2 mem) mem) // cond: isSamePtr(p1, p2) && t2.Size() == sizeof(t1) // result: mem @@ -27837,11 +27655,8 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { } func rewriteValuegeneric_OpStore_10(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config fe := b.Func.fe - _ = fe // match: (Store dst (StructMake2 f0 f1) mem) // cond: // result: (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)) @@ -28189,7 +28004,6 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { } func rewriteValuegeneric_OpStore_20(v *Value) bool { b := v.Block - _ = b // match: (Store {t1} op1:(OffPtr [o1] p1) d1 m2:(Store {t2} op2:(OffPtr [o2] p2) d2 m3:(Store {t3} op3:(OffPtr [0] p3) d3 m4:(Move [n] p4 _ mem)))) // cond: m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3) + sizeof(t2) + sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4) // result: (Store {t1} op1 d1 (Store {t2} op2 d2 (Store {t3} op3 d3 mem))) @@ -28784,9 +28598,7 @@ func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { } func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { b := v.Block - _ = b fe := b.Func.fe - _ = fe // match: (StructSelect [i] x:(Load ptr mem)) // cond: !fe.CanSSA(t) // result: @x.Block (Load (OffPtr [t.FieldOff(int(i))] ptr) mem) @@ -28834,7 +28646,6 @@ func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { } func rewriteValuegeneric_OpSub16_0(v *Value) bool { b := v.Block - _ = b // match: (Sub16 (Const16 [c]) (Const16 [d])) // cond: // result: (Const16 [int64(int16(c-d))]) @@ -29073,7 +28884,6 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { } func rewriteValuegeneric_OpSub16_10(v *Value) bool { b := v.Block - _ = b // match: (Sub16 (Add16 y x) y) // cond: // result: x @@ -29218,7 +29028,6 @@ func rewriteValuegeneric_OpSub16_10(v *Value) bool { } func rewriteValuegeneric_OpSub32_0(v *Value) bool { b := v.Block - _ = b // match: (Sub32 (Const32 [c]) (Const32 [d])) // cond: // result: (Const32 [int64(int32(c-d))]) @@ -29457,7 +29266,6 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { } func rewriteValuegeneric_OpSub32_10(v *Value) bool { b := v.Block - _ = b // match: (Sub32 (Add32 y x) y) // cond: // result: x @@ -29624,7 +29432,6 @@ func rewriteValuegeneric_OpSub32F_0(v *Value) bool { } func rewriteValuegeneric_OpSub64_0(v *Value) bool { b := v.Block - _ = b // match: (Sub64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c-d]) @@ -29863,7 +29670,6 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { } func rewriteValuegeneric_OpSub64_10(v *Value) bool { b := v.Block - _ = b // match: (Sub64 (Add64 y x) y) // cond: // result: x @@ -30030,7 +29836,6 @@ func rewriteValuegeneric_OpSub64F_0(v *Value) bool { } func rewriteValuegeneric_OpSub8_0(v *Value) bool { b := v.Block - _ = b // match: (Sub8 (Const8 [c]) (Const8 [d])) // cond: // result: (Const8 [int64(int8(c-d))]) @@ -30269,7 +30074,6 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { } func rewriteValuegeneric_OpSub8_10(v *Value) bool { b := v.Block - _ = b // match: (Sub8 (Add8 y x) y) // cond: // result: x @@ -31046,7 +30850,6 @@ func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { } func rewriteValuegeneric_OpXor16_0(v *Value) bool { b := v.Block - _ = b // match: (Xor16 (Const16 [c]) (Const16 [d])) // cond: // result: (Const16 [int64(int16(c^d))]) @@ -31246,7 +31049,6 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { } func rewriteValuegeneric_OpXor16_10(v *Value) bool { b := v.Block - _ = b // match: (Xor16 (Xor16 z i:(Const16 )) x) // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Xor16 i (Xor16 z x)) @@ -31463,7 +31265,6 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { } func rewriteValuegeneric_OpXor32_0(v *Value) bool { b := v.Block - _ = b // match: (Xor32 (Const32 [c]) (Const32 [d])) // cond: // result: (Const32 [int64(int32(c^d))]) @@ -31663,7 +31464,6 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { } func rewriteValuegeneric_OpXor32_10(v *Value) bool { b := v.Block - _ = b // match: (Xor32 (Xor32 z i:(Const32 )) x) // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Xor32 i (Xor32 z x)) @@ -31880,7 +31680,6 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { } func rewriteValuegeneric_OpXor64_0(v *Value) bool { b := v.Block - _ = b // match: (Xor64 (Const64 [c]) (Const64 [d])) // cond: // result: (Const64 [c^d]) @@ -32080,7 +31879,6 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { } func rewriteValuegeneric_OpXor64_10(v *Value) bool { b := v.Block - _ = b // match: (Xor64 (Xor64 z i:(Const64 )) x) // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Xor64 i (Xor64 z x)) @@ -32297,7 +32095,6 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { } func rewriteValuegeneric_OpXor8_0(v *Value) bool { b := v.Block - _ = b // match: (Xor8 (Const8 [c]) (Const8 [d])) // cond: // result: (Const8 [int64(int8(c^d))]) @@ -32497,7 +32294,6 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { } func rewriteValuegeneric_OpXor8_10(v *Value) bool { b := v.Block - _ = b // match: (Xor8 (Xor8 z i:(Const8 )) x) // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Xor8 i (Xor8 z x)) @@ -32714,9 +32510,7 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { } func rewriteValuegeneric_OpZero_0(v *Value) bool { b := v.Block - _ = b config := b.Func.Config - _ = config // match: (Zero (Load (OffPtr [c] (SP)) mem) mem) // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem -- GitLab From af13cfc3a21a56e50f651dd9c1edcb6d30fc6e45 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 16:28:03 -0400 Subject: [PATCH 0420/1679] ../test: set GOPATH in nosplit.go This test invokes 'go build', so in module mode it needs a module cache to guard edits to go.mod. Fixes #30776 Change-Id: I89ebef1fad718247e7f972cd830e31d6f4a83e4c Reviewed-on: https://go-review.googlesource.com/c/go/+/167085 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod TryBot-Result: Gobot Gobot --- test/nosplit.go | 1 + 1 file changed, 1 insertion(+) diff --git a/test/nosplit.go b/test/nosplit.go index 46810b1a2f..266e6077b1 100644 --- a/test/nosplit.go +++ b/test/nosplit.go @@ -217,6 +217,7 @@ func main() { return } defer os.RemoveAll(dir) + os.Setenv("GOPATH", filepath.Join(dir, "_gopath")) if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), []byte("module go-test-nosplit\n"), 0666); err != nil { log.Panic(err) -- GitLab From 01d1dc4172793edfc597f7abe5da38f7f232b69a Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 16:43:45 -0400 Subject: [PATCH 0421/1679] cmd/go: fix typo in GoGetInsecure to actually set GOPROXY I typo'd this variable in CL 165745, and neither I, the reviewer, nor the TryBots noticed. But the longtest builder noticed, and it's not happy about it. Updates #30571 Change-Id: I5e3d267346407855ec0d1f340a72dc2c521ecc63 Reviewed-on: https://go-review.googlesource.com/c/go/+/167086 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/go_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 19fbf6d718..f25d6f4503 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -3670,7 +3670,7 @@ func TestGoGetInsecure(t *testing.T) { tg.tempFile("go.mod", "module m") tg.cd(tg.path(".")) tg.setenv("GO111MODULE", "on") - tg.setenv("GO111PROXY", "") + tg.setenv("GOPROXY", "") } else { tg.setenv("GOPATH", tg.path(".")) tg.setenv("GO111MODULE", "off") -- GitLab From c4078a1998657709848e18e82a1b9f2cccac05c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 11 Mar 2019 17:04:48 +0000 Subject: [PATCH 0422/1679] text/tabwriter: use a single defer per Write call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lines with single cells prompt a flush. Unfortunately, a call to Writer.Flush also means two defers, which is an expensive operation to do if many lines consist of single cells. This is common when formatting code with aligned comments. Most lines aren't going to have any comments at all, so the performance hit is going to be noticeable. The Write method already has a "defer handlePanic" of its own, so we don't need to worry about panics leaking out. The error will now mention "Write" instead of "Flush" if a panic is encountered during that nested flush, but arguably that's a good thing; the user called Write, not Flush. For the reset call, add a non-deferred call as part of flushNoDefers, as that's still necessary. Otherwise, the exported Flush method still does a "defer b.reset". The current tabwriter benchmarks are unaffected, since they don't contain many single-cell lines, and because lines are written one at a time. For that reason, we add a benchmark which has both of these characteristics. name old time/op new time/op delta Code-8 2.72µs ± 0% 1.77µs ± 0% -34.88% (p=0.000 n=6+5) name old alloc/op new alloc/op delta Code-8 648B ± 0% 648B ± 0% ~ (all equal) name old allocs/op new allocs/op delta Code-8 13.0 ± 0% 13.0 ± 0% ~ (all equal) Perhaps unsurprisingly, go/printer also gets a bit faster, as it too buffers its output before writing it to tabwriter. name old time/op new time/op delta Print-8 6.53ms ± 0% 6.39ms ± 0% -2.22% (p=0.008 n=5+5) Change-Id: Ie01fea5ced43886a9eb796cb1e6c810f7a810853 Reviewed-on: https://go-review.googlesource.com/c/go/+/166797 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/text/tabwriter/tabwriter.go | 22 +++++++++++++++++----- src/text/tabwriter/tabwriter_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/text/tabwriter/tabwriter.go b/src/text/tabwriter/tabwriter.go index 36d999b411..bd45cddecb 100644 --- a/src/text/tabwriter/tabwriter.go +++ b/src/text/tabwriter/tabwriter.go @@ -473,8 +473,12 @@ func (b *Writer) terminateCell(htab bool) int { return len(*line) } -func handlePanic(err *error, op string) { +func (b *Writer) handlePanic(err *error, op string) { if e := recover(); e != nil { + if op == "Flush" { + // If Flush ran into a panic, we still need to reset. + b.reset() + } if nerr, ok := e.(osError); ok { *err = nerr.err return @@ -491,10 +495,17 @@ func (b *Writer) Flush() error { return b.flush() } +// flush is the internal version of Flush, with a named return value which we +// don't want to expose. func (b *Writer) flush() (err error) { - defer b.reset() // even in the presence of errors - defer handlePanic(&err, "Flush") + defer b.handlePanic(&err, "Flush") + return b.flushNoDefers() +} +// flushNoDefers is like flush, but without a deferred handlePanic call. This +// can be called from other methods which already have their own deferred +// handlePanic calls, such as Write, and avoid the extra defer work. +func (b *Writer) flushNoDefers() (err error) { // add current cell if not empty if b.cell.size > 0 { if b.endChar != 0 { @@ -506,6 +517,7 @@ func (b *Writer) flush() (err error) { // format contents of buffer b.format(0, 0, len(b.lines)) + b.reset() return nil } @@ -516,7 +528,7 @@ var hbar = []byte("---\n") // while writing to the underlying output stream. // func (b *Writer) Write(buf []byte) (n int, err error) { - defer handlePanic(&err, "Write") + defer b.handlePanic(&err, "Write") // split text into cells n = 0 @@ -539,7 +551,7 @@ func (b *Writer) Write(buf []byte) (n int, err error) { // the formatting of the following lines (the last cell per // line is ignored by format()), thus we can flush the // Writer contents. - if err = b.Flush(); err != nil { + if err = b.flushNoDefers(); err != nil { return } if ch == '\f' && b.flags&Debug != 0 { diff --git a/src/text/tabwriter/tabwriter_test.go b/src/text/tabwriter/tabwriter_test.go index 07bae0ca0b..6a97d4c427 100644 --- a/src/text/tabwriter/tabwriter_test.go +++ b/src/text/tabwriter/tabwriter_test.go @@ -729,3 +729,27 @@ func BenchmarkRagged(b *testing.B) { }) } } + +const codeSnippet = ` +some command + +foo # aligned +barbaz # comments + +but +mostly +single +cell +lines +` + +func BenchmarkCode(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + w := NewWriter(ioutil.Discard, 4, 4, 1, ' ', 0) // no particular reason for these settings + // The code is small, so it's reasonable for the tabwriter user + // to write it all at once, or buffer the writes. + w.Write([]byte(codeSnippet)) + w.Flush() + } +} -- GitLab From cfa93ba51fb62252633c62ddc9351d56c18ce018 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 7 Mar 2019 17:44:50 -0800 Subject: [PATCH 0423/1679] math/big: add support for underscores '_' in numbers The primary change is in nat.scan which now accepts underscores for base 0. While at it, streamlined error handling in that function as well. Also, improved the corresponding test significantly by checking the expected result values also in case of scan errors. The second major change is in scanExponent which now accepts underscores when the new sepOk argument is set. While at it, essentially rewrote that function to match error and underscore handling of nat.scan more closely. Added a new test for scanExponent which until now was only tested indirectly. Finally, updated the documentation for several functions and added many new test cases to clients of nat.scan. A major portion of this CL is due to much better test coverage. Updates #28493. Change-Id: I7f17b361b633fbe6c798619d891bd5e0a045b5c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/166157 Reviewed-by: Emmanuel Odeke --- src/math/big/floatconv.go | 37 ++++--- src/math/big/floatconv_test.go | 25 +++++ src/math/big/int.go | 16 ++- src/math/big/intconv_test.go | 17 +++ src/math/big/natconv.go | 195 ++++++++++++++++++--------------- src/math/big/natconv_test.go | 178 ++++++++++++++++++------------ src/math/big/ratconv.go | 109 ++++++++++-------- src/math/big/ratconv_test.go | 121 +++++++++++++++++--- 8 files changed, 458 insertions(+), 240 deletions(-) diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go index b685b2a288..88216f5600 100644 --- a/src/math/big/floatconv.go +++ b/src/math/big/floatconv.go @@ -55,7 +55,7 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) { // exponent var exp int64 var ebase int - exp, ebase, err = scanExponent(r, true) + exp, ebase, err = scanExponent(r, true, base == 0) if err != nil { return } @@ -216,20 +216,29 @@ func (z *Float) pow5(n uint64) *Float { // point number with a mantissa in the given conversion base (the exponent // is always a decimal number), or a string representing an infinite value. // +// For base 0, an underscore character ``_'' may appear between a base +// prefix and an adjacent digit, and between successive digits; such +// underscores do not change the value of the number, or the returned +// digit count. Incorrect placement of underscores is reported as an +// error if there are no other errors. If base != 0, underscores are +// not recognized and thus terminate scanning like any other character +// that is not a valid radix point or digit. +// // It sets z to the (possibly rounded) value of the corresponding floating- // point value, and returns z, the actual base b, and an error err, if any. // The entire string (not just a prefix) must be consumed for success. // If z's precision is 0, it is changed to 64 before rounding takes effect. // The number must be of the form: // -// number = [ sign ] [ prefix ] mantissa [ exponent ] | infinity . -// sign = "+" | "-" . -// prefix = "0" ( "b" | "B" | "o" | "O" | "x" | "X" ) . -// mantissa = digits | digits "." [ digits ] | "." digits . -// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . -// digits = digit { digit } . -// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . -// infinity = [ sign ] ( "inf" | "Inf" ) . +// number = [ sign ] ( float | "inf" | "Inf" ) . +// sign = "+" | "-" . +// float = ( mantissa | prefix pmantissa ) [ exponent ] . +// prefix = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] . +// mantissa = digits "." [ digits ] | digits | "." digits . +// pmantissa = [ "_" ] digits "." [ digits ] | [ "_" ] digits | "." digits . +// exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . +// digits = digit { [ "_" ] digit } . +// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // // The base argument must be 0, 2, 8, 10, or 16. Providing an invalid base // argument will lead to a run-time panic. @@ -240,11 +249,11 @@ func (z *Float) pow5(n uint64) *Float { // no prefix is accepted. The octal prefix "0" is not supported (a leading // "0" is simply considered a "0"). // -// A "p" or "P" exponent indicates a binary (rather then decimal) exponent; -// for instance "0x1.fffffffffffffp1023" (using base 0) represents the -// maximum float64 value. For hexadecimal mantissae, the exponent must -// be binary, if present (an "e" or "E" exponent indicator cannot be -// distinguished from a mantissa digit). +// A "p" or "P" exponent indicates a base 2 (rather then base 10) exponent; +// for instance, "0x1.fffffffffffffp1023" (using base 0) represents the +// maximum float64 value. For hexadecimal mantissae, the exponent character +// must be one of 'p' or 'P', if present (an "e" or "E" exponent indicator +// cannot be distinguished from a mantissa digit). // // The returned *Float f is nil and the value of z is valid but not // defined if an error is reported. diff --git a/src/math/big/floatconv_test.go b/src/math/big/floatconv_test.go index f32dd8928b..c6c6ba63e5 100644 --- a/src/math/big/floatconv_test.go +++ b/src/math/big/floatconv_test.go @@ -72,6 +72,21 @@ func TestFloatSetFloat64String(t *testing.T) { {"infinity", nan}, {"foobar", nan}, + // invalid underscores + {"_", nan}, + {"0_", nan}, + {"1__0", nan}, + {"123_.", nan}, + {"123._", nan}, + {"123._4", nan}, + {"1_2.3_4_", nan}, + {"_.123", nan}, + {"_123.456", nan}, + {"10._0", nan}, + {"10.0e_0", nan}, + {"10.0e0_", nan}, + {"0P-0__0", nan}, + // misc decimal values {"3.14159265", 3.14159265}, {"-687436.79457e-245", -687436.79457e-245}, @@ -142,6 +157,16 @@ func TestFloatSetFloat64String(t *testing.T) { {"-0X0.00008P+16", -0.5}, {"0x0.0000000000001p-1022", math.SmallestNonzeroFloat64}, {"0x1.fffffffffffffp1023", math.MaxFloat64}, + + // underscores + {"0_0", 0}, + {"1_000.", 1000}, + {"1_2_3.4_5_6", 123.456}, + {"1.0e0_0", 1}, + {"1p+1_0", 1024}, + {"0b_1000", 0x8}, + {"0b_1011_1101", 0xbd}, + {"0x_f0_0d_1eP+0_8", 0xf00d1e00}, } { var x Float x.SetPrec(53) diff --git a/src/math/big/int.go b/src/math/big/int.go index eb0285c48f..afad1bc961 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -401,16 +401,24 @@ func (x *Int) IsUint64() bool { // (not just a prefix) must be valid for success. If SetString fails, // the value of z is undefined but the returned value is nil. // -// The base argument must be 0 or a value between 2 and MaxBase. If the base -// is 0, the string prefix determines the actual conversion base. A prefix of -// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a -// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10. +// The base argument must be 0 or a value between 2 and MaxBase. +// For base 0, the number prefix determines the actual base: A prefix of +// ``0b'' or ``0B'' selects base 2, ``0'', ``0o'' or ``0O'' selects base 8, +// and ``0x'' or ``0X'' selects base 16. Otherwise, the selected base is 10 +// and no prefix is accepted. // // For bases <= 36, lower and upper case letters are considered the same: // The letters 'a' to 'z' and 'A' to 'Z' represent digit values 10 to 35. // For bases > 36, the upper case letters 'A' to 'Z' represent the digit // values 36 to 61. // +// For base 0, an underscore character ``_'' may appear between a base +// prefix and an adjacent digit, and between successive digits; such +// underscores do not change the value of the number. +// Incorrect placement of underscores is reported as an error if there +// are no other errors. If base != 0, underscores are not recognized +// and act like any other character that is not a valid digit. +// func (z *Int) SetString(s string, base int) (*Int, bool) { return z.setFromScanner(strings.NewReader(s), base) } diff --git a/src/math/big/intconv_test.go b/src/math/big/intconv_test.go index d625b6aa3d..5ba29263a6 100644 --- a/src/math/big/intconv_test.go +++ b/src/math/big/intconv_test.go @@ -34,6 +34,16 @@ var stringTests = []struct { {in: "0xg", base: 0}, {in: "g", base: 16}, + // invalid inputs with separators + // (smoke tests only - a comprehensive set of tests is in natconv_test.go) + {in: "_"}, + {in: "0_"}, + {in: "_0"}, + {in: "-1__0"}, + {in: "0x10_"}, + {in: "1_000", base: 10}, // separators are not permitted for bases != 0 + {in: "d_e_a_d", base: 16}, + // valid inputs {"0", "0", 0, 0, true}, {"0", "0", 10, 0, true}, @@ -67,6 +77,13 @@ var stringTests = []struct { {"A", "A", 37, 36, true}, {"ABCXYZ", "abcxyz", 36, 623741435, true}, {"ABCXYZ", "ABCXYZ", 62, 33536793425, true}, + + // valid input with separators + // (smoke tests only - a comprehensive set of tests is in natconv_test.go) + {"1_000", "1000", 0, 1000, true}, + {"0b_1010", "10", 0, 10, true}, + {"+0o_660", "432", 0, 0660, true}, + {"-0xF00D_1E", "-15731998", 0, -0xf00d1e, true}, } func TestIntText(t *testing.T) { diff --git a/src/math/big/natconv.go b/src/math/big/natconv.go index c3c4115097..42d1cccf6f 100644 --- a/src/math/big/natconv.go +++ b/src/math/big/natconv.go @@ -55,16 +55,31 @@ func pow(x Word, n int) (p Word) { return } +// scan errors +var ( + errNoDigits = errors.New("number has no digits") + errInvalSep = errors.New("'_' must separate successive digits") +) + // scan scans the number corresponding to the longest possible prefix // from r representing an unsigned number in a given conversion base. -// It returns the corresponding natural number res, the actual base b, +// scan returns the corresponding natural number res, the actual base b, // a digit count, and a read or syntax error err, if any. // -// number = [ prefix ] mantissa . -// prefix = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] . -// mantissa = digits | digits "." [ digits ] | "." digits . -// digits = digit { digit } . -// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . +// For base 0, an underscore character ``_'' may appear between a base +// prefix and an adjacent digit, and between successive digits; such +// underscores do not change the value of the number, or the returned +// digit count. Incorrect placement of underscores is reported as an +// error if there are no other errors. If base != 0, underscores are +// not recognized and thus terminate scanning like any other character +// that is not a valid radix point or digit. +// +// number = mantissa | prefix pmantissa . +// prefix = "0" [ "b" | "B" | "o" | "O" | "x" | "X" ] . +// mantissa = digits "." [ digits ] | digits | "." digits . +// pmantissa = [ "_" ] digits "." [ digits ] | [ "_" ] digits | "." digits . +// digits = digit { [ "_" ] digit } . +// digit = "0" ... "9" | "a" ... "z" | "A" ... "Z" . // // Unless fracOk is set, the base argument must be 0 or a value between // 2 and MaxBase. If fracOk is set, the base argument must be one of @@ -92,53 +107,51 @@ func pow(x Word, n int) (p Word) { // In this case, the actual value of the scanned number is res * b**count. // func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count int, err error) { - // reject illegal bases + // reject invalid bases baseOk := base == 0 || !fracOk && 2 <= base && base <= MaxBase || fracOk && (base == 2 || base == 8 || base == 10 || base == 16) if !baseOk { - panic(fmt.Sprintf("illegal number base %d", base)) + panic(fmt.Sprintf("invalid number base %d", base)) } + // prev encodes the previously seen char: it is one + // of '_', '0' (a digit), or '.' (anything else). A + // valid separator '_' may only occur after a digit + // and if base == 0. + prev := '.' + invalSep := false + // one char look-ahead ch, err := r.ReadByte() - if err != nil { - return // io.EOF is also an error in this case - } // determine actual base b, prefix := base, 0 if base == 0 { // actual base is 10 unless there's a base prefix b = 10 - if ch == '0' { + if err == nil && ch == '0' { + prev = '0' count = 1 ch, err = r.ReadByte() - if err != nil { - if err == io.EOF { - err = nil // not an error; input is "0" - res = z[:0] - } - return - } - // possibly one of 0b, 0B, 0o, 0O, 0x, 0X - switch ch { - case 'b', 'B': - b, prefix = 2, 'b' - case 'o', 'O': - b, prefix = 8, 'o' - case 'x', 'X': - b, prefix = 16, 'x' - default: - if !fracOk { - b, prefix = 8, '0' + if err == nil { + // possibly one of 0b, 0B, 0o, 0O, 0x, 0X + switch ch { + case 'b', 'B': + b, prefix = 2, 'b' + case 'o', 'O': + b, prefix = 8, 'o' + case 'x', 'X': + b, prefix = 16, 'x' + default: + if !fracOk { + b, prefix = 8, '0' + } } - } - if prefix != 0 { - count = 0 // prefix is not counted - if prefix != '0' { - if ch, err = r.ReadByte(); err != nil { - return // io.EOF is also an error in this case + if prefix != 0 { + count = 0 // prefix is not counted + if prefix != '0' { + ch, err = r.ReadByte() } } } @@ -155,76 +168,76 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in di := Word(0) // 0 <= di < b1**i < bn i := 0 // 0 <= i < n dp := -1 // position of decimal point - for { - if fracOk && ch == '.' { + for err == nil { + if ch == '.' && fracOk { fracOk = false + if prev == '_' { + invalSep = true + } + prev = '.' dp = count - // advance - if ch, err = r.ReadByte(); err != nil { - if err == io.EOF { - err = nil - break + } else if ch == '_' && base == 0 { + if prev != '0' { + invalSep = true + } + prev = '_' + } else { + // convert rune into digit value d1 + var d1 Word + switch { + case '0' <= ch && ch <= '9': + d1 = Word(ch - '0') + case 'a' <= ch && ch <= 'z': + d1 = Word(ch - 'a' + 10) + case 'A' <= ch && ch <= 'Z': + if b <= maxBaseSmall { + d1 = Word(ch - 'A' + 10) + } else { + d1 = Word(ch - 'A' + maxBaseSmall) } - return + default: + d1 = MaxBase + 1 } - } + if d1 >= b1 { + r.UnreadByte() // ch does not belong to number anymore + break + } + prev = '0' + count++ - // convert rune into digit value d1 - var d1 Word - switch { - case '0' <= ch && ch <= '9': - d1 = Word(ch - '0') - case 'a' <= ch && ch <= 'z': - d1 = Word(ch - 'a' + 10) - case 'A' <= ch && ch <= 'Z': - if b <= maxBaseSmall { - d1 = Word(ch - 'A' + 10) - } else { - d1 = Word(ch - 'A' + maxBaseSmall) + // collect d1 in di + di = di*b1 + d1 + i++ + + // if di is "full", add it to the result + if i == n { + z = z.mulAddWW(z, bn, di) + di = 0 + i = 0 } - default: - d1 = MaxBase + 1 - } - if d1 >= b1 { - r.UnreadByte() // ch does not belong to number anymore - break } - count++ - // collect d1 in di - di = di*b1 + d1 - i++ + ch, err = r.ReadByte() + } - // if di is "full", add it to the result - if i == n { - z = z.mulAddWW(z, bn, di) - di = 0 - i = 0 - } + if err == io.EOF { + err = nil + } - // advance - if ch, err = r.ReadByte(); err != nil { - if err == io.EOF { - err = nil - break - } - return - } + // other errors take precedence over invalid separators + if err == nil && (invalSep || prev == '_') { + err = errInvalSep } if count == 0 { // no digits found if prefix == '0' { - // there was only the octal prefix 0 (possibly followed by digits > 7); - // count as one digit and return base 10, not 8 - count = 1 - b = 10 - } else { - err = errors.New("syntax error scanning number") + // there was only the octal prefix 0 (possibly followed by separators and digits > 7); + // interpret as decimal 0 + return z[:0], 10, 1, err } - return + err = errNoDigits // fall through; result will be 0 } - // count > 0 // add remaining digits to result if i > 0 { @@ -232,9 +245,9 @@ func (z nat) scan(r io.ByteScanner, base int, fracOk bool) (res nat, b, count in } res = z.norm() - // adjust for fraction, if any + // adjust count for fraction, if any if dp >= 0 { - // 0 <= dp <= count > 0 + // 0 <= dp <= count count = dp - count } diff --git a/src/math/big/natconv_test.go b/src/math/big/natconv_test.go index 645e2b8434..9c2acca07e 100644 --- a/src/math/big/natconv_test.go +++ b/src/math/big/natconv_test.go @@ -109,92 +109,126 @@ var natScanTests = []struct { x nat // expected nat b int // expected base count int // expected digit count - ok bool // expected success + err error // expected error next rune // next character (or 0, if at EOF) }{ - // invalid: no mantissa - {}, - {s: "?"}, - {base: 10}, - {base: 36}, - {base: 62}, - {s: "?", base: 10}, - {s: "0b"}, - {s: "0o"}, - {s: "0x"}, - {s: "0b2"}, - {s: "0B2"}, - {s: "0o8"}, - {s: "0O8"}, - {s: "0xg"}, - {s: "0Xg"}, - {s: "345", base: 2}, + // invalid: no digits + {"", 0, false, nil, 10, 0, errNoDigits, 0}, + {"_", 0, false, nil, 10, 0, errNoDigits, 0}, + {"?", 0, false, nil, 10, 0, errNoDigits, '?'}, + {"?", 10, false, nil, 10, 0, errNoDigits, '?'}, + {"", 10, false, nil, 10, 0, errNoDigits, 0}, + {"", 36, false, nil, 36, 0, errNoDigits, 0}, + {"", 62, false, nil, 62, 0, errNoDigits, 0}, + {"0b", 0, false, nil, 2, 0, errNoDigits, 0}, + {"0o", 0, false, nil, 8, 0, errNoDigits, 0}, + {"0x", 0, false, nil, 16, 0, errNoDigits, 0}, + {"0x_", 0, false, nil, 16, 0, errNoDigits, 0}, + {"0b2", 0, false, nil, 2, 0, errNoDigits, '2'}, + {"0B2", 0, false, nil, 2, 0, errNoDigits, '2'}, + {"0o8", 0, false, nil, 8, 0, errNoDigits, '8'}, + {"0O8", 0, false, nil, 8, 0, errNoDigits, '8'}, + {"0xg", 0, false, nil, 16, 0, errNoDigits, 'g'}, + {"0Xg", 0, false, nil, 16, 0, errNoDigits, 'g'}, + {"345", 2, false, nil, 2, 0, errNoDigits, '3'}, // invalid: incorrect use of decimal point - {s: ".0"}, - {s: ".0", base: 10}, - {s: ".", base: 0}, - {s: "0x.0"}, + {"._", 0, true, nil, 10, 0, errNoDigits, 0}, + {".0", 0, false, nil, 10, 0, errNoDigits, '.'}, + {".0", 10, false, nil, 10, 0, errNoDigits, '.'}, + {".", 0, true, nil, 10, 0, errNoDigits, 0}, + {"0x.", 0, true, nil, 16, 0, errNoDigits, 0}, + {"0x.g", 0, true, nil, 16, 0, errNoDigits, 'g'}, + {"0x.0", 0, false, nil, 16, 0, errNoDigits, '.'}, + + // invalid: incorrect use of separators + {"_0", 0, false, nil, 10, 1, errInvalSep, 0}, + {"0_", 0, false, nil, 10, 1, errInvalSep, 0}, + {"0__0", 0, false, nil, 8, 1, errInvalSep, 0}, + {"0x___0", 0, false, nil, 16, 1, errInvalSep, 0}, + {"0_x", 0, false, nil, 10, 1, errInvalSep, 'x'}, + {"0_8", 0, false, nil, 10, 1, errInvalSep, '8'}, + {"123_.", 0, true, nat{123}, 10, 0, errInvalSep, 0}, + {"._123", 0, true, nat{123}, 10, -3, errInvalSep, 0}, + {"0b__1000", 0, false, nat{0x8}, 2, 4, errInvalSep, 0}, + {"0o60___0", 0, false, nat{0600}, 8, 3, errInvalSep, 0}, + {"0466_", 0, false, nat{0466}, 8, 3, errInvalSep, 0}, + {"01234567_8", 0, false, nat{01234567}, 8, 7, errInvalSep, '8'}, + {"1_.", 0, true, nat{1}, 10, 0, errInvalSep, 0}, + {"0._1", 0, true, nat{1}, 10, -1, errInvalSep, 0}, + {"2.7_", 0, true, nat{27}, 10, -1, errInvalSep, 0}, + {"0x1.0_", 0, true, nat{0x10}, 16, -1, errInvalSep, 0}, + + // valid: separators are not accepted for base != 0 + {"0_", 10, false, nil, 10, 1, nil, '_'}, + {"1__0", 10, false, nat{1}, 10, 1, nil, '_'}, + {"0__8", 10, false, nil, 10, 1, nil, '_'}, + {"xy_z_", 36, false, nat{33*36 + 34}, 36, 2, nil, '_'}, // valid, no decimal point - {"0", 0, false, nil, 10, 1, true, 0}, - {"0", 10, false, nil, 10, 1, true, 0}, - {"0", 36, false, nil, 36, 1, true, 0}, - {"0", 62, false, nil, 62, 1, true, 0}, - {"1", 0, false, nat{1}, 10, 1, true, 0}, - {"1", 10, false, nat{1}, 10, 1, true, 0}, - {"0 ", 0, false, nil, 10, 1, true, ' '}, - {"00 ", 0, false, nil, 8, 1, true, ' '}, // octal 0 - {"0b1", 0, false, nat{1}, 2, 1, true, 0}, - {"0B11000101", 0, false, nat{0xc5}, 2, 8, true, 0}, - {"0B110001012", 0, false, nat{0xc5}, 2, 8, true, '2'}, - {"07", 0, false, nat{7}, 8, 1, true, 0}, - {"08", 0, false, nil, 10, 1, true, '8'}, - {"08", 10, false, nat{8}, 10, 2, true, 0}, - {"018", 0, false, nat{1}, 8, 1, true, '8'}, - {"0o7", 0, false, nat{7}, 8, 1, true, 0}, - {"0o18", 0, false, nat{1}, 8, 1, true, '8'}, - {"0O17", 0, false, nat{017}, 8, 2, true, 0}, - {"03271", 0, false, nat{03271}, 8, 4, true, 0}, - {"10ab", 0, false, nat{10}, 10, 2, true, 'a'}, - {"1234567890", 0, false, nat{1234567890}, 10, 10, true, 0}, - {"A", 36, false, nat{10}, 36, 1, true, 0}, - {"A", 37, false, nat{36}, 37, 1, true, 0}, - {"xyz", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, 0}, - {"XYZ?", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, true, '?'}, - {"XYZ?", 62, false, nat{(59*62+60)*62 + 61}, 62, 3, true, '?'}, - {"0x", 16, false, nil, 16, 1, true, 'x'}, - {"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, true, 0}, - {"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, true, 0}, + {"0", 0, false, nil, 10, 1, nil, 0}, + {"0", 36, false, nil, 36, 1, nil, 0}, + {"0", 62, false, nil, 62, 1, nil, 0}, + {"1", 0, false, nat{1}, 10, 1, nil, 0}, + {"1", 10, false, nat{1}, 10, 1, nil, 0}, + {"0 ", 0, false, nil, 10, 1, nil, ' '}, + {"00 ", 0, false, nil, 8, 1, nil, ' '}, // octal 0 + {"0b1", 0, false, nat{1}, 2, 1, nil, 0}, + {"0B11000101", 0, false, nat{0xc5}, 2, 8, nil, 0}, + {"0B110001012", 0, false, nat{0xc5}, 2, 8, nil, '2'}, + {"07", 0, false, nat{7}, 8, 1, nil, 0}, + {"08", 0, false, nil, 10, 1, nil, '8'}, + {"08", 10, false, nat{8}, 10, 2, nil, 0}, + {"018", 0, false, nat{1}, 8, 1, nil, '8'}, + {"0o7", 0, false, nat{7}, 8, 1, nil, 0}, + {"0o18", 0, false, nat{1}, 8, 1, nil, '8'}, + {"0O17", 0, false, nat{017}, 8, 2, nil, 0}, + {"03271", 0, false, nat{03271}, 8, 4, nil, 0}, + {"10ab", 0, false, nat{10}, 10, 2, nil, 'a'}, + {"1234567890", 0, false, nat{1234567890}, 10, 10, nil, 0}, + {"A", 36, false, nat{10}, 36, 1, nil, 0}, + {"A", 37, false, nat{36}, 37, 1, nil, 0}, + {"xyz", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, nil, 0}, + {"XYZ?", 36, false, nat{(33*36+34)*36 + 35}, 36, 3, nil, '?'}, + {"XYZ?", 62, false, nat{(59*62+60)*62 + 61}, 62, 3, nil, '?'}, + {"0x", 16, false, nil, 16, 1, nil, 'x'}, + {"0xdeadbeef", 0, false, nat{0xdeadbeef}, 16, 8, nil, 0}, + {"0XDEADBEEF", 0, false, nat{0xdeadbeef}, 16, 8, nil, 0}, // valid, with decimal point - {"0.", 0, false, nil, 10, 1, true, '.'}, - {"0.", 10, true, nil, 10, 0, true, 0}, - {"0.1.2", 10, true, nat{1}, 10, -1, true, '.'}, - {".000", 10, true, nil, 10, -3, true, 0}, - {"12.3", 10, true, nat{123}, 10, -1, true, 0}, - {"012.345", 10, true, nat{12345}, 10, -3, true, 0}, - {"0.1", 0, true, nat{1}, 10, -1, true, 0}, - {"0.1", 2, true, nat{1}, 2, -1, true, 0}, - {"0.12", 2, true, nat{1}, 2, -1, true, '2'}, - {"0b0.1", 0, true, nat{1}, 2, -1, true, 0}, - {"0B0.12", 0, true, nat{1}, 2, -1, true, '2'}, - {"0o0.7", 0, true, nat{7}, 8, -1, true, 0}, - {"0O0.78", 0, true, nat{7}, 8, -1, true, '8'}, + {"0.", 0, false, nil, 10, 1, nil, '.'}, + {"0.", 10, true, nil, 10, 0, nil, 0}, + {"0.1.2", 10, true, nat{1}, 10, -1, nil, '.'}, + {".000", 10, true, nil, 10, -3, nil, 0}, + {"12.3", 10, true, nat{123}, 10, -1, nil, 0}, + {"012.345", 10, true, nat{12345}, 10, -3, nil, 0}, + {"0.1", 0, true, nat{1}, 10, -1, nil, 0}, + {"0.1", 2, true, nat{1}, 2, -1, nil, 0}, + {"0.12", 2, true, nat{1}, 2, -1, nil, '2'}, + {"0b0.1", 0, true, nat{1}, 2, -1, nil, 0}, + {"0B0.12", 0, true, nat{1}, 2, -1, nil, '2'}, + {"0o0.7", 0, true, nat{7}, 8, -1, nil, 0}, + {"0O0.78", 0, true, nat{7}, 8, -1, nil, '8'}, + {"0xdead.beef", 0, true, nat{0xdeadbeef}, 16, -4, nil, 0}, + + // valid, with separators + {"1_000", 0, false, nat{1000}, 10, 4, nil, 0}, + {"0_466", 0, false, nat{0466}, 8, 3, nil, 0}, + {"0o_600", 0, false, nat{0600}, 8, 3, nil, 0}, + {"0x_f0_0d", 0, false, nat{0xf00d}, 16, 4, nil, 0}, + {"0b1000_0001", 0, false, nat{0x81}, 2, 8, nil, 0}, + {"1_000.000_1", 0, true, nat{10000001}, 10, -4, nil, 0}, + {"0x_f00d.1e", 0, true, nat{0xf00d1e}, 16, -2, nil, 0}, + {"0x_f00d.1E2", 0, true, nat{0xf00d1e2}, 16, -3, nil, 0}, + {"0x_f00d.1eg", 0, true, nat{0xf00d1e}, 16, -2, nil, 'g'}, } func TestScanBase(t *testing.T) { for _, a := range natScanTests { r := strings.NewReader(a.s) x, b, count, err := nat(nil).scan(r, a.base, a.frac) - if err == nil && !a.ok { - t.Errorf("scan%+v\n\texpected error", a) - } - if err != nil { - if a.ok { - t.Errorf("scan%+v\n\tgot error = %s", a, err) - } - continue + if err != a.err { + t.Errorf("scan%+v\n\tgot error = %v; want %v", a, err, a.err) } if x.cmp(a.x) != 0 { t.Errorf("scan%+v\n\tgot z = %v; want %v", a, x, a.x) diff --git a/src/math/big/ratconv.go b/src/math/big/ratconv.go index bd2509f168..07288ca94f 100644 --- a/src/math/big/ratconv.go +++ b/src/math/big/ratconv.go @@ -87,7 +87,7 @@ func (z *Rat) SetString(s string) (*Rat, bool) { // exponent var exp int64 - exp, _, err = scanExponent(r, false) + exp, _, err = scanExponent(r, false, false) if err != nil { return nil, false } @@ -129,75 +129,96 @@ func (z *Rat) SetString(s string) (*Rat, bool) { return z, true } -// scanExponent scans the longest possible prefix of r representing a decimal -// ('e', 'E') or binary ('p', 'P') exponent, if any. It returns the exponent, -// the exponent base (10 or 2), or a read or syntax error, if any. +// scanExponent scans the longest possible prefix of r representing a base 10 +// (``e'', ``E'') or a base 2 (``p'', ``P'') exponent, if any. It returns the +// exponent, the exponent base (10 or 2), or a read or syntax error, if any. +// +// If sepOk is set, an underscore character ``_'' may appear between successive +// exponent digits; such underscores do not change the value of the exponent. +// Incorrect placement of underscores is reported as an error if there are no +// other errors. If sepOk is not set, underscores are not recognized and thus +// terminate scanning like any other character that is not a valid digit. // // exponent = ( "e" | "E" | "p" | "P" ) [ sign ] digits . // sign = "+" | "-" . -// digits = digit { digit } . +// digits = digit { [ '_' ] digit } . // digit = "0" ... "9" . // -// A binary exponent is only permitted if binExpOk is set. -func scanExponent(r io.ByteScanner, binExpOk bool) (exp int64, base int, err error) { - base = 10 - - var ch byte - if ch, err = r.ReadByte(); err != nil { +// A base 2 exponent is only permitted if base2ok is set. +func scanExponent(r io.ByteScanner, base2ok, sepOk bool) (exp int64, base int, err error) { + // one char look-ahead + ch, err := r.ReadByte() + if err != nil { if err == io.EOF { - err = nil // no exponent; same as e0 + err = nil } - return + return 0, 10, err } + // exponent char switch ch { case 'e', 'E': - // ok + base = 10 case 'p', 'P': - if binExpOk { + if base2ok { base = 2 break // ok } fallthrough // binary exponent not permitted default: - r.UnreadByte() - return // no exponent; same as e0 - } - - var neg bool - if neg, err = scanSign(r); err != nil { - return + r.UnreadByte() // ch does not belong to exponent anymore + return 0, 10, nil } + // sign var digits []byte - if neg { - digits = append(digits, '-') + ch, err = r.ReadByte() + if err == nil && (ch == '+' || ch == '-') { + if ch == '-' { + digits = append(digits, '-') + } + ch, err = r.ReadByte() } - // no need to use nat.scan for exponent digits - // since we only care about int64 values - the - // from-scratch scan is easy enough and faster - for i := 0; ; i++ { - if ch, err = r.ReadByte(); err != nil { - if err != io.EOF || i == 0 { - return + // prev encodes the previously seen char: it is one + // of '_', '0' (a digit), or '.' (anything else). A + // valid separator '_' may only occur after a digit. + prev := '.' + invalSep := false + + // exponent value + hasDigits := false + for err == nil { + if '0' <= ch && ch <= '9' { + digits = append(digits, ch) + prev = '0' + hasDigits = true + } else if ch == '_' && sepOk { + if prev != '0' { + invalSep = true } - err = nil - break // i > 0 - } - if ch < '0' || '9' < ch { - if i == 0 { - r.UnreadByte() - err = fmt.Errorf("invalid exponent (missing digits)") - return - } - break // i > 0 + prev = '_' + } else { + r.UnreadByte() // ch does not belong to number anymore + break } - digits = append(digits, ch) + ch, err = r.ReadByte() + } + + if err == io.EOF { + err = nil + } + if err == nil && !hasDigits { + err = errNoDigits + } + if err == nil { + exp, err = strconv.ParseInt(string(digits), 10, 64) + } + // other errors take precedence over invalid separators + if err == nil && (invalSep || prev == '_') { + err = errInvalSep } - // i > 0 => we have at least one digit - exp, err = strconv.ParseInt(string(digits), 10, 64) return } diff --git a/src/math/big/ratconv_test.go b/src/math/big/ratconv_test.go index bdc6a3e1b0..dea4d1933a 100644 --- a/src/math/big/ratconv_test.go +++ b/src/math/big/ratconv_test.go @@ -7,25 +7,91 @@ package big import ( "bytes" "fmt" + "io" "math" "strconv" "strings" "testing" ) +var exponentTests = []struct { + s string // string to be scanned + base2ok bool // true if 'p'/'P' exponents are accepted + sepOk bool // true if '_' separators are accepted + x int64 // expected exponent + b int // expected exponent base + err error // expected error + next rune // next character (or 0, if at EOF) +}{ + // valid, without separators + {"", false, false, 0, 10, nil, 0}, + {"1", false, false, 0, 10, nil, '1'}, + {"e0", false, false, 0, 10, nil, 0}, + {"E1", false, false, 1, 10, nil, 0}, + {"e+10", false, false, 10, 10, nil, 0}, + {"e-10", false, false, -10, 10, nil, 0}, + {"e123456789a", false, false, 123456789, 10, nil, 'a'}, + {"p", false, false, 0, 10, nil, 'p'}, + {"P+100", false, false, 0, 10, nil, 'P'}, + {"p0", true, false, 0, 2, nil, 0}, + {"P-123", true, false, -123, 2, nil, 0}, + {"p+0a", true, false, 0, 2, nil, 'a'}, + {"p+123__", true, false, 123, 2, nil, '_'}, // '_' is not part of the number anymore + + // valid, with separators + {"e+1_0", false, true, 10, 10, nil, 0}, + {"e-1_0", false, true, -10, 10, nil, 0}, + {"e123_456_789a", false, true, 123456789, 10, nil, 'a'}, + {"P+1_00", false, true, 0, 10, nil, 'P'}, + {"p-1_2_3", true, true, -123, 2, nil, 0}, + + // invalid: no digits + {"e", false, false, 0, 10, errNoDigits, 0}, + {"ef", false, false, 0, 10, errNoDigits, 'f'}, + {"e+", false, false, 0, 10, errNoDigits, 0}, + {"E-x", false, false, 0, 10, errNoDigits, 'x'}, + {"p", true, false, 0, 2, errNoDigits, 0}, + {"P-", true, false, 0, 2, errNoDigits, 0}, + {"p+e", true, false, 0, 2, errNoDigits, 'e'}, + {"e+_x", false, true, 0, 10, errNoDigits, 'x'}, + + // invalid: incorrect use of separator + {"e0_", false, true, 0, 10, errInvalSep, 0}, + {"e_0", false, true, 0, 10, errInvalSep, 0}, + {"e-1_2__3", false, true, -123, 10, errInvalSep, 0}, +} + +func TestScanExponent(t *testing.T) { + for _, a := range exponentTests { + r := strings.NewReader(a.s) + x, b, err := scanExponent(r, a.base2ok, a.sepOk) + if err != a.err { + t.Errorf("scanExponent%+v\n\tgot error = %v; want %v", a, err, a.err) + } + if x != a.x { + t.Errorf("scanExponent%+v\n\tgot z = %v; want %v", a, x, a.x) + } + if b != a.b { + t.Errorf("scanExponent%+v\n\tgot b = %d; want %d", a, b, a.b) + } + next, _, err := r.ReadRune() + if err == io.EOF { + next = 0 + err = nil + } + if err == nil && next != a.next { + t.Errorf("scanExponent%+v\n\tgot next = %q; want %q", a, next, a.next) + } + } +} + type StringTest struct { in, out string ok bool } var setStringTests = []StringTest{ - {"0", "0", true}, - {"-0", "0", true}, - {"1", "1", true}, - {"-1", "-1", true}, - {"1.", "1", true}, - {"1e0", "1", true}, - {"1.e1", "10", true}, + // invalid {in: "1e"}, {in: "1.e"}, {in: "1e+14e-5"}, @@ -33,6 +99,20 @@ var setStringTests = []StringTest{ {in: "r"}, {in: "a/b"}, {in: "a.b"}, + {in: "1/0"}, + {in: "4/3/2"}, // issue 17001 + {in: "4/3/"}, + {in: "4/3."}, + {in: "4/"}, + + // valid + {"0", "0", true}, + {"-0", "0", true}, + {"1", "1", true}, + {"-1", "-1", true}, + {"1.", "1", true}, + {"1e0", "1", true}, + {"1.e1", "10", true}, {"-0.1", "-1/10", true}, {"-.1", "-1/10", true}, {"2/4", "1/2", true}, @@ -49,24 +129,35 @@ var setStringTests = []StringTest{ {"106/141787961317645621392", "53/70893980658822810696", true}, {"204211327800791583.81095", "4084226556015831676219/20000", true}, {"0e9999999999", "0", true}, // issue #16176 - {in: "1/0"}, - {in: "4/3/2"}, // issue 17001 - {in: "4/3/"}, - {in: "4/3."}, - {in: "4/"}, } // These are not supported by fmt.Fscanf. var setStringTests2 = []StringTest{ + // invalid + {in: "4/3x"}, + + // invalid with separators + // (smoke tests only - a comprehensive set of tests is in natconv_test.go) + {in: "10_/1"}, + {in: "_10/1"}, + {in: "1/1__0"}, + {in: "1_000.0"}, // floats are base 10 which doesn't permit separators; see also issue #29799 + + // valid {"0b1000/3", "8/3", true}, {"0B1000/0x8", "1", true}, - {"-010/1", "-8", true}, // TODO(gri) should we even permit octal here? + {"-010/1", "-8", true}, {"-010.", "-10", true}, {"-0o10/1", "-8", true}, {"0x10/1", "16", true}, {"0x10/0x20", "1/2", true}, - {in: "4/3x"}, - // TODO(gri) add more tests + + // valid with separators + // (smoke tests only - a comprehensive set of tests is in natconv_test.go) + {"0b_1000/3", "8/3", true}, + {"0B_10_00/0x8", "1", true}, + {"0xdead/0B1101_1110_1010_1101", "1", true}, + {"0B1101_1110_1010_1101/0XD_E_A_D", "1", true}, } func TestRatSetString(t *testing.T) { -- GitLab From fbc5acbd704ff2640d0aed19f116b862f858a549 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 8 Mar 2019 17:30:55 -0800 Subject: [PATCH 0424/1679] cmd/compile: remove work-arounds for handling underscores in numbers With math/big supporting underscores directly, there is no need to manually remove them before calling the math/big conversion routines. Updates #28493. Change-Id: I6f865c8f87c3469ffd6c33f960ed540135055226 Reviewed-on: https://go-review.googlesource.com/c/go/+/166417 Reviewed-by: Emmanuel Odeke Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/mpfloat.go | 4 ---- src/cmd/compile/internal/gc/mpint.go | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/cmd/compile/internal/gc/mpfloat.go b/src/cmd/compile/internal/gc/mpfloat.go index 0379075406..d15f26784e 100644 --- a/src/cmd/compile/internal/gc/mpfloat.go +++ b/src/cmd/compile/internal/gc/mpfloat.go @@ -8,7 +8,6 @@ import ( "fmt" "math" "math/big" - "strings" ) // implements float arithmetic @@ -180,9 +179,6 @@ func (a *Mpflt) Neg() { } func (a *Mpflt) SetString(as string) { - // TODO(gri) remove this code once math/big.Float.Parse can handle separators - as = strings.Replace(as, "_", "", -1) // strip separators - // TODO(gri) why is this needed? for len(as) > 0 && (as[0] == ' ' || as[0] == '\t') { as = as[1:] diff --git a/src/cmd/compile/internal/gc/mpint.go b/src/cmd/compile/internal/gc/mpint.go index 81b60dd278..e4dd22d0a0 100644 --- a/src/cmd/compile/internal/gc/mpint.go +++ b/src/cmd/compile/internal/gc/mpint.go @@ -7,7 +7,6 @@ package gc import ( "fmt" "math/big" - "strings" ) // implements integer arithmetic @@ -282,9 +281,6 @@ func (a *Mpint) SetInt64(c int64) { } func (a *Mpint) SetString(as string) { - // TODO(gri) remove this code once math/big.Int.SetString can handle separators - as = strings.Replace(as, "_", "", -1) // strip separators - _, ok := a.Val.SetString(as, 0) if !ok { // required syntax is [+-][0[x]]d* -- GitLab From bea58ef352ddf35e9de5ce3cec7eafa036d5491c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Sun, 10 Mar 2019 10:19:31 -0700 Subject: [PATCH 0425/1679] cmd/compile: don't report redundant error for invalid integer literals Fixes #30722. Change-Id: Ia4c6e37282edc44788cd8af3f6cfa10895a19e4f Reviewed-on: https://go-review.googlesource.com/c/go/+/166519 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/mpint.go | 14 +++++--------- test/fixedbugs/issue30722.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 test/fixedbugs/issue30722.go diff --git a/src/cmd/compile/internal/gc/mpint.go b/src/cmd/compile/internal/gc/mpint.go index e4dd22d0a0..340350bca7 100644 --- a/src/cmd/compile/internal/gc/mpint.go +++ b/src/cmd/compile/internal/gc/mpint.go @@ -283,15 +283,11 @@ func (a *Mpint) SetInt64(c int64) { func (a *Mpint) SetString(as string) { _, ok := a.Val.SetString(as, 0) if !ok { - // required syntax is [+-][0[x]]d* - // At the moment we lose precise error cause; - // the old code distinguished between: - // - malformed hex constant - // - malformed octal constant - // - malformed decimal constant - // TODO(gri) use different conversion function - yyerror("malformed integer constant: %s", as) - a.Val.SetUint64(0) + // The lexer checks for correct syntax of the literal + // and reports detailed errors. Thus SetString should + // never fail (in theory it might run out of memory, + // but that wouldn't be reported as an error here). + Fatalf("malformed integer constant: %s", as) return } if a.checkOverflow(0) { diff --git a/test/fixedbugs/issue30722.go b/test/fixedbugs/issue30722.go new file mode 100644 index 0000000000..02258f0bea --- /dev/null +++ b/test/fixedbugs/issue30722.go @@ -0,0 +1,17 @@ +// errorcheck + +// Copyright 2019 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. + +// Verify that we only get one error per invalid integer literal. + +package p + +const ( + _ = 1_ // ERROR "'_' must separate successive digits" + _ = 0b // ERROR "binary literal has no digits" + _ = 0o // ERROR "octal literal has no digits" + _ = 0x // ERROR "hexadecimal literal has no digits" + _ = 0xde__ad // ERROR "'_' must separate successive digits" +) -- GitLab From 0ff9df6b53076a9402f691b07707f7d88d352722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:39:09 +0100 Subject: [PATCH 0426/1679] cmd: disable DWARF with old ld on aix/ppc64 DWARF relocations isn't working with some older ld, because of -Wl,-bnoobjreorder which is needed on Go. This commit checks ld's version and disable DWARF generation in cmd/link if it's too old. Some tests must therefore be skipped. Change-Id: I2e794c263eb0dfe0b42e7062fb80c26f086b44d1 Reviewed-on: https://go-review.googlesource.com/c/go/+/164007 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- .../compile/internal/ssa/stmtlines_test.go | 16 +++++++ src/cmd/internal/dwarf/dwarf.go | 42 +++++++++++++++++++ src/cmd/link/dwarf_test.go | 14 +++++++ src/cmd/link/internal/ld/dwarf.go | 5 +++ src/cmd/link/internal/ld/lib.go | 22 +++++----- 5 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/cmd/compile/internal/ssa/stmtlines_test.go b/src/cmd/compile/internal/ssa/stmtlines_test.go index c71f8befd9..b8a9388b61 100644 --- a/src/cmd/compile/internal/ssa/stmtlines_test.go +++ b/src/cmd/compile/internal/ssa/stmtlines_test.go @@ -1,6 +1,7 @@ package ssa_test import ( + cmddwarf "cmd/internal/dwarf" "debug/dwarf" "debug/elf" "debug/macho" @@ -9,6 +10,7 @@ import ( "internal/testenv" "internal/xcoff" "io" + "os" "runtime" "testing" ) @@ -49,6 +51,20 @@ func TestStmtLines(t *testing.T) { t.Skip("skipping on plan9; no DWARF symbol table in executables") } + if runtime.GOOS == "aix" { + extld := os.Getenv("CC") + if extld == "" { + extld = "gcc" + } + enabled, err := cmddwarf.IsDWARFEnabledOnAIXLd(extld) + if err != nil { + t.Fatal(err) + } + if !enabled { + t.Skip("skipping on aix: no DWARF with ld version < 7.2.2 ") + } + } + lines := map[Line]bool{} dw, err := open(testenv.GoToolPath(t)) must(err) diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go index 8ad84105a4..7f37cf059d 100644 --- a/src/cmd/internal/dwarf/dwarf.go +++ b/src/cmd/internal/dwarf/dwarf.go @@ -8,10 +8,13 @@ package dwarf import ( + "bytes" "cmd/internal/objabi" "errors" "fmt" + "os/exec" "sort" + "strconv" "strings" ) @@ -1526,3 +1529,42 @@ type byChildIndex []*Var func (s byChildIndex) Len() int { return len(s) } func (s byChildIndex) Less(i, j int) bool { return s[i].ChildIndex < s[j].ChildIndex } func (s byChildIndex) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// IsDWARFEnabledOnAIX returns true if DWARF is possible on the +// current extld. +// AIX ld doesn't support DWARF with -bnoobjreorder with version +// prior to 7.2.2. +func IsDWARFEnabledOnAIXLd(extld string) (bool, error) { + out, err := exec.Command(extld, "-Wl,-V").CombinedOutput() + if err != nil { + // The normal output should display ld version and + // then fails because ".main" is not defined: + // ld: 0711-317 ERROR: Undefined symbol: .main + if !bytes.Contains(out, []byte("0711-317")) { + return false, fmt.Errorf("%s -Wl,-V failed: %v\n%s", extld, err, out) + } + } + // gcc -Wl,-V output should be: + // /usr/bin/ld: LD X.X.X(date) + // ... + out = bytes.TrimPrefix(out, []byte("/usr/bin/ld: LD ")) + vers := string(bytes.Split(out, []byte("("))[0]) + subvers := strings.Split(vers, ".") + if len(subvers) != 3 { + return false, fmt.Errorf("cannot parse %s -Wl,-V (%s): %v\n", extld, out, err) + } + if v, err := strconv.Atoi(subvers[0]); err != nil || v < 7 { + return false, nil + } else if v > 7 { + return true, nil + } + if v, err := strconv.Atoi(subvers[1]); err != nil || v < 2 { + return false, nil + } else if v > 2 { + return true, nil + } + if v, err := strconv.Atoi(subvers[2]); err != nil || v < 2 { + return false, nil + } + return true, nil +} diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 9c3bc624ef..ecc96019be 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -5,6 +5,7 @@ package main import ( + cmddwarf "cmd/internal/dwarf" "cmd/internal/objfile" "debug/dwarf" "internal/testenv" @@ -39,6 +40,19 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) for _, prog := range []string{"testprog", "testprogcgo"} { prog := prog + expectDWARF := expectDWARF + if runtime.GOOS == "aix" && prog == "testprogcgo" { + extld := os.Getenv("CC") + if extld == "" { + extld = "gcc" + } + expectDWARF, err = cmddwarf.IsDWARFEnabledOnAIXLd(extld) + if err != nil { + t.Fatal(err) + } + + } + t.Run(prog, func(t *testing.T) { t.Parallel() diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 446fd572ac..d923b7599d 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1721,6 +1721,11 @@ func dwarfEnabled(ctxt *Link) bool { case ctxt.HeadType == objabi.Hdarwin: case ctxt.HeadType == objabi.Hwindows: case ctxt.HeadType == objabi.Haix: + res, err := dwarf.IsDWARFEnabledOnAIXLd(ctxt.extld()) + if err != nil { + Exitf("%v", err) + } + return res default: return false } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 44befc9637..d5efcee34b 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -322,18 +322,24 @@ func loadinternal(ctxt *Link, name string) *sym.Library { return nil } -// findLibPathCmd uses cmd command to find gcc library libname. -// It returns library full path if found, or "none" if not found. -func (ctxt *Link) findLibPathCmd(cmd, libname string) string { +// extld returns the current external linker. +func (ctxt *Link) extld() string { if *flagExtld == "" { *flagExtld = "gcc" } + return *flagExtld +} + +// findLibPathCmd uses cmd command to find gcc library libname. +// It returns library full path if found, or "none" if not found. +func (ctxt *Link) findLibPathCmd(cmd, libname string) string { + extld := ctxt.extld() args := hostlinkArchArgs(ctxt.Arch) args = append(args, cmd) if ctxt.Debugvlog != 0 { - ctxt.Logf("%s %v\n", *flagExtld, args) + ctxt.Logf("%s %v\n", extld, args) } - out, err := exec.Command(*flagExtld, args...).Output() + out, err := exec.Command(extld, args...).Output() if err != nil { if ctxt.Debugvlog != 0 { ctxt.Logf("not using a %s file because compiler failed\n%v\n%s\n", libname, err, out) @@ -1111,12 +1117,8 @@ func (ctxt *Link) hostlink() { return } - if *flagExtld == "" { - *flagExtld = "gcc" - } - var argv []string - argv = append(argv, *flagExtld) + argv = append(argv, ctxt.extld()) argv = append(argv, hostlinkArchArgs(ctxt.Arch)...) if *FlagS || debug_s { -- GitLab From b6544a2a87b17f552c3ab4f7f0f082e48b56d5fa Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Sun, 23 Dec 2018 15:01:11 +0530 Subject: [PATCH 0427/1679] testing/cover: improve message when a package has no statements Fixes #25492 Change-Id: Ic1496857524dad0c0a77f3bb80fa084c9bf00aa9 Reviewed-on: https://go-review.googlesource.com/c/go/+/155777 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/go/go_test.go | 8 ++++++++ src/cmd/go/testdata/testcover/pkg4/a.go | 5 +++++ src/cmd/go/testdata/testcover/pkg4/a_test.go | 9 +++++++++ src/testing/cover.go | 3 ++- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/testcover/pkg4/a.go create mode 100644 src/cmd/go/testdata/testcover/pkg4/a_test.go diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index f25d6f4503..60e02e7532 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -2612,6 +2612,14 @@ func TestCoverageDepLoop(t *testing.T) { tg.grepStdout("coverage: 100.0% of statements", "expected 100.0% coverage") } +func TestCoverageNoStatements(t *testing.T) { + tooSlow(t) + tg := testgo(t) + defer tg.cleanup() + tg.run("test", "-cover", "./testdata/testcover/pkg4") + tg.grepStdout("[no statements]", "expected [no statements] for pkg4") +} + func TestCoverageImportMainLoop(t *testing.T) { skipIfGccgo(t, "gccgo has no cover tool") tg := testgo(t) diff --git a/src/cmd/go/testdata/testcover/pkg4/a.go b/src/cmd/go/testdata/testcover/pkg4/a.go new file mode 100644 index 0000000000..cf09e6f1b0 --- /dev/null +++ b/src/cmd/go/testdata/testcover/pkg4/a.go @@ -0,0 +1,5 @@ +package pkg4 + +type T struct { + X bool +} diff --git a/src/cmd/go/testdata/testcover/pkg4/a_test.go b/src/cmd/go/testdata/testcover/pkg4/a_test.go new file mode 100644 index 0000000000..12b8685294 --- /dev/null +++ b/src/cmd/go/testdata/testcover/pkg4/a_test.go @@ -0,0 +1,9 @@ +package pkg4 + +import ( + "testing" +) + +func TestT(t *testing.T) { + _ = T{} +} diff --git a/src/testing/cover.go b/src/testing/cover.go index 17c03f5e5e..62ee5ac9c0 100644 --- a/src/testing/cover.go +++ b/src/testing/cover.go @@ -109,7 +109,8 @@ func coverReport() { } } if total == 0 { - total = 1 + fmt.Println("coverage: [no statements]") + return } fmt.Printf("coverage: %.1f%% of statements%s\n", 100*float64(active)/float64(total), cover.CoveredPackages) } -- GitLab From a891f2e2ae60c1cc740751bcb3427f71c618b9d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:42:11 +0100 Subject: [PATCH 0428/1679] cmd: always allow bigtoc generation with gcc on aix/ppc64 -mcmodel=large and -Wl,-bbigtoc must always be passed to gcc in order to prevent TOC overflow error. However, a warning is still issued by ld. It is removed as it doesn't give any useful information. Change-Id: I95a78e8993cc7b5c0f329654d507409785f7eea6 Reviewed-on: https://go-review.googlesource.com/c/go/+/164008 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/gcc.go | 1 + src/cmd/go/internal/work/exec.go | 5 +++++ src/cmd/link/internal/ld/lib.go | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 915ad66111..9428ffd3bf 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1587,6 +1587,7 @@ func (p *Package) gccCmd() []string { c = append(c, p.gccMachine()...) if goos == "aix" { c = append(c, "-maix64") + c = append(c, "-mcmodel=large") } c = append(c, "-") //read input from standard input return c diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 62ae01e555..e53ef6cdd3 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2244,6 +2244,11 @@ func (b *Builder) compilerCmd(compiler []string, incdir, workdir string) []strin } } + if cfg.Goos == "aix" { + // mcmodel=large must always be enabled to allow large TOC. + a = append(a, "-mcmodel=large") + } + // disable ASCII art in clang errors, if possible if b.gccSupportsFlag(compiler, "-fno-caret-diagnostics") { a = append(a, "-fno-caret-diagnostics") diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index d5efcee34b..5e1b042073 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1153,6 +1153,10 @@ func (ctxt *Link) hostlink() { // prevent ld to reorder .text functions to keep the same // first/last functions for moduledata. argv = append(argv, "-Wl,-bnoobjreorder") + // mcmodel=large is needed for every gcc generated files, but + // ld still need -bbigtoc in order to allow larger TOC. + argv = append(argv, "-mcmodel=large") + argv = append(argv, "-Wl,-bbigtoc") } switch ctxt.BuildMode { @@ -1387,11 +1391,24 @@ func (ctxt *Link) hostlink() { // Filter out useless linker warnings caused by bugs outside Go. // See also cmd/go/internal/work/exec.go's gccld method. var save [][]byte + var skipLines int for _, line := range bytes.SplitAfter(out, []byte("\n")) { // golang.org/issue/26073 - Apple Xcode bug if bytes.Contains(line, []byte("ld: warning: text-based stub file")) { continue } + + if skipLines > 0 { + skipLines-- + continue + } + + // Remove TOC overflow warning on AIX. + if bytes.Contains(line, []byte("ld: 0711-783")) { + skipLines = 2 + continue + } + save = append(save, line) } out = bytes.Join(save, nil) -- GitLab From a5fdd58c84b6b0a1ae5a53faebc0550024e3a066 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Sun, 10 Mar 2019 14:30:06 +0900 Subject: [PATCH 0429/1679] runtime, internal/poll, net: report event scanning error on read event This change makes it possible the runtime-integrated network poller and APIs in the package internal/poll to report an event scanning error on a read event. The latest Go releases open up the way of the manipulation of the poller for users. On the other hand, it starts misleading users into believing that the poller accepts any user-configured file or socket perfectly because of not reporting any error on event scanning, as mentioned in issue 30426. The initial implementation of the poller was designed for just well-configured, validated sockets produced by the package net. However, the assumption is now obsolete. Fixes #30624. Benchmark results on linux/amd64: benchmark old ns/op new ns/op delta BenchmarkTCP4OneShot-4 24649 23979 -2.72% BenchmarkTCP4OneShotTimeout-4 25742 24411 -5.17% BenchmarkTCP4Persistent-4 5139 5222 +1.62% BenchmarkTCP4PersistentTimeout-4 4919 4892 -0.55% BenchmarkTCP6OneShot-4 21182 20767 -1.96% BenchmarkTCP6OneShotTimeout-4 23364 22305 -4.53% BenchmarkTCP6Persistent-4 4351 4366 +0.34% BenchmarkTCP6PersistentTimeout-4 4227 4255 +0.66% BenchmarkTCP4ConcurrentReadWrite-4 2309 1839 -20.36% BenchmarkTCP6ConcurrentReadWrite-4 2180 1791 -17.84% benchmark old allocs new allocs delta BenchmarkTCP4OneShot-4 26 26 +0.00% BenchmarkTCP4OneShotTimeout-4 26 26 +0.00% BenchmarkTCP4Persistent-4 0 0 +0.00% BenchmarkTCP4PersistentTimeout-4 0 0 +0.00% BenchmarkTCP6OneShot-4 26 26 +0.00% BenchmarkTCP6OneShotTimeout-4 26 26 +0.00% BenchmarkTCP6Persistent-4 0 0 +0.00% BenchmarkTCP6PersistentTimeout-4 0 0 +0.00% BenchmarkTCP4ConcurrentReadWrite-4 0 0 +0.00% BenchmarkTCP6ConcurrentReadWrite-4 0 0 +0.00% benchmark old bytes new bytes delta BenchmarkTCP4OneShot-4 2000 2000 +0.00% BenchmarkTCP4OneShotTimeout-4 2000 2000 +0.00% BenchmarkTCP4Persistent-4 0 0 +0.00% BenchmarkTCP4PersistentTimeout-4 0 0 +0.00% BenchmarkTCP6OneShot-4 2144 2144 +0.00% BenchmarkTCP6OneShotTimeout-4 2144 2145 +0.05% BenchmarkTCP6Persistent-4 0 0 +0.00% BenchmarkTCP6PersistentTimeout-4 0 0 +0.00% BenchmarkTCP4ConcurrentReadWrite-4 0 0 +0.00% BenchmarkTCP6ConcurrentReadWrite-4 0 0 +0.00% Change-Id: Iab60e504dff5639e688dc5420d852f336508c0af Reviewed-on: https://go-review.googlesource.com/c/go/+/166497 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/error_linux_test.go | 31 +++++++++++++++++++ src/internal/poll/error_stub_test.go | 21 +++++++++++++ src/internal/poll/error_test.go | 44 +++++++++++++++++++++++++++ src/internal/poll/fd.go | 4 +++ src/internal/poll/fd_poll_runtime.go | 2 ++ src/net/error_test.go | 4 +-- src/runtime/netpoll.go | 14 +++++++-- src/runtime/netpoll_aix.go | 4 +++ src/runtime/netpoll_epoll.go | 5 ++- src/runtime/netpoll_kqueue.go | 7 ++++- src/runtime/netpoll_solaris.go | 4 +++ 11 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 src/internal/poll/error_linux_test.go create mode 100644 src/internal/poll/error_stub_test.go create mode 100644 src/internal/poll/error_test.go diff --git a/src/internal/poll/error_linux_test.go b/src/internal/poll/error_linux_test.go new file mode 100644 index 0000000000..059fb8eac9 --- /dev/null +++ b/src/internal/poll/error_linux_test.go @@ -0,0 +1,31 @@ +// Copyright 2019 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 poll_test + +import ( + "errors" + "internal/poll" + "os" + "syscall" +) + +func badStateFile() (*os.File, error) { + if os.Getuid() != 0 { + return nil, errors.New("must be root") + } + // Using OpenFile for a device file is an easy way to make a + // file attached to the runtime-integrated network poller and + // configured in halfway. + return os.OpenFile("/dev/net/tun", os.O_RDWR, 0) +} + +func isBadStateFileError(err error) (string, bool) { + switch err { + case poll.ErrNotPollable, syscall.EBADFD: + return "", true + default: + return "not pollable or file in bad state error", false + } +} diff --git a/src/internal/poll/error_stub_test.go b/src/internal/poll/error_stub_test.go new file mode 100644 index 0000000000..c40ffcd20f --- /dev/null +++ b/src/internal/poll/error_stub_test.go @@ -0,0 +1,21 @@ +// Copyright 2019 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. + +// +build !linux + +package poll_test + +import ( + "errors" + "os" + "runtime" +) + +func badStateFile() (*os.File, error) { + return nil, errors.New("not supported on " + runtime.GOOS) +} + +func isBadStateFileError(err error) (string, bool) { + return "", false +} diff --git a/src/internal/poll/error_test.go b/src/internal/poll/error_test.go new file mode 100644 index 0000000000..89c6e384c5 --- /dev/null +++ b/src/internal/poll/error_test.go @@ -0,0 +1,44 @@ +// Copyright 2019 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 poll_test + +import ( + "fmt" + "net" + "os" + "testing" +) + +func TestReadError(t *testing.T) { + t.Run("ErrNotPollable", func(t *testing.T) { + f, err := badStateFile() + if err != nil { + t.Skip(err) + } + defer f.Close() + var b [1]byte + _, err = f.Read(b[:]) + if perr := parseReadError(err, isBadStateFileError); perr != nil { + t.Fatal(perr) + } + }) +} + +func parseReadError(nestedErr error, verify func(error) (string, bool)) error { + err := nestedErr + if nerr, ok := err.(*net.OpError); ok { + err = nerr.Err + } + if nerr, ok := err.(*os.PathError); ok { + err = nerr.Err + } + if nerr, ok := err.(*os.SyscallError); ok { + err = nerr.Err + } + if s, ok := verify(err); !ok { + return fmt.Errorf("got %v; want %s", nestedErr, s) + } + return nil +} diff --git a/src/internal/poll/fd.go b/src/internal/poll/fd.go index 2567746106..2ab86f2314 100644 --- a/src/internal/poll/fd.go +++ b/src/internal/poll/fd.go @@ -44,6 +44,10 @@ func (e *TimeoutError) Error() string { return "i/o timeout" } func (e *TimeoutError) Timeout() bool { return true } func (e *TimeoutError) Temporary() bool { return true } +// ErrNotPollable is returned when the file or socket is not suitable +// for event notification. +var ErrNotPollable = errors.New("not pollable") + // consume removes data from a slice of byte slices, for writev. func consume(v *[][]byte, n int64) { for len(*v) > 0 { diff --git a/src/internal/poll/fd_poll_runtime.go b/src/internal/poll/fd_poll_runtime.go index 2932615d85..d32f4a0ddd 100644 --- a/src/internal/poll/fd_poll_runtime.go +++ b/src/internal/poll/fd_poll_runtime.go @@ -115,6 +115,8 @@ func convertErr(res int, isFile bool) error { return errClosing(isFile) case 2: return ErrTimeout + case 3: + return ErrNotPollable } println("unreachable: ", res) panic("unreachable") diff --git a/src/net/error_test.go b/src/net/error_test.go index 2819986c0c..b0622d7fd5 100644 --- a/src/net/error_test.go +++ b/src/net/error_test.go @@ -436,7 +436,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing, poll.ErrTimeout: + case poll.ErrNetClosing, poll.ErrTimeout, poll.ErrNotPollable: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) @@ -627,7 +627,7 @@ second: goto third } switch nestedErr { - case poll.ErrNetClosing, poll.ErrTimeout: + case poll.ErrNetClosing, poll.ErrTimeout, poll.ErrNotPollable: return nil } return fmt.Errorf("unexpected type on 2nd nested level: %T", nestedErr) diff --git a/src/runtime/netpoll.go b/src/runtime/netpoll.go index 71ca993cc0..0de67c63e7 100644 --- a/src/runtime/netpoll.go +++ b/src/runtime/netpoll.go @@ -49,13 +49,14 @@ type pollDesc struct { // The lock protects pollOpen, pollSetDeadline, pollUnblock and deadlineimpl operations. // This fully covers seq, rt and wt variables. fd is constant throughout the PollDesc lifetime. // pollReset, pollWait, pollWaitCanceled and runtime·netpollready (IO readiness notification) - // proceed w/o taking the lock. So closing, rg, rd, wg and wd are manipulated + // proceed w/o taking the lock. So closing, everr, rg, rd, wg and wd are manipulated // in a lock-free way by all operations. // NOTE(dvyukov): the following code uses uintptr to store *g (rg/wg), // that will blow up when GC starts moving objects. lock mutex // protects the following fields fd uintptr closing bool + everr bool // marks event scanning error happened user uint32 // user settable cookie rseq uintptr // protects from stale read timers rg uintptr // pdReady, pdWait, G waiting for read or nil @@ -120,6 +121,7 @@ func poll_runtime_pollOpen(fd uintptr) (*pollDesc, int) { } pd.fd = fd pd.closing = false + pd.everr = false pd.rseq++ pd.rg = 0 pd.rd = 0 @@ -335,10 +337,16 @@ func netpollready(toRun *gList, pd *pollDesc, mode int32) { func netpollcheckerr(pd *pollDesc, mode int32) int { if pd.closing { - return 1 // errClosing + return 1 // ErrFileClosing or ErrNetClosing } if (mode == 'r' && pd.rd < 0) || (mode == 'w' && pd.wd < 0) { - return 2 // errTimeout + return 2 // ErrTimeout + } + // Report an event scanning error only on a read event. + // An error on a write event will be captured in a subsequent + // write call that is able to report a more specific error. + if mode == 'r' && pd.everr { + return 3 // ErrNotPollable } return 0 } diff --git a/src/runtime/netpoll_aix.go b/src/runtime/netpoll_aix.go index 1e886dae94..b4d7de8c2a 100644 --- a/src/runtime/netpoll_aix.go +++ b/src/runtime/netpoll_aix.go @@ -232,6 +232,10 @@ retry: if pollVerbose { println("*** netpollready i=", i, "revents=", pfd.revents, "events=", pfd.events, "pd=", pds[i]) } + pds[i].everr = false + if pfd.revents&_POLLERR != 0 { + pds[i].everr = true + } netpollready(&toRun, pds[i], mode) n-- } diff --git a/src/runtime/netpoll_epoll.go b/src/runtime/netpoll_epoll.go index f764d6ff7c..7dc8301acd 100644 --- a/src/runtime/netpoll_epoll.go +++ b/src/runtime/netpoll_epoll.go @@ -91,7 +91,10 @@ retry: } if mode != 0 { pd := *(**pollDesc)(unsafe.Pointer(&ev.data)) - + pd.everr = false + if ev.events&_EPOLLERR != 0 { + pd.everr = true + } netpollready(&toRun, pd, mode) } } diff --git a/src/runtime/netpoll_kqueue.go b/src/runtime/netpoll_kqueue.go index fdaa1cd80d..1de484978a 100644 --- a/src/runtime/netpoll_kqueue.go +++ b/src/runtime/netpoll_kqueue.go @@ -102,7 +102,12 @@ retry: mode += 'w' } if mode != 0 { - netpollready(&toRun, (*pollDesc)(unsafe.Pointer(ev.udata)), mode) + pd := (*pollDesc)(unsafe.Pointer(ev.udata)) + pd.everr = false + if ev.flags&_EV_ERROR != 0 { + pd.everr = true + } + netpollready(&toRun, pd, mode) } } if block && toRun.empty() { diff --git a/src/runtime/netpoll_solaris.go b/src/runtime/netpoll_solaris.go index 6bd484afaa..7ae8a2aba1 100644 --- a/src/runtime/netpoll_solaris.go +++ b/src/runtime/netpoll_solaris.go @@ -233,6 +233,10 @@ retry: } if mode != 0 { + pd.everr = false + if ev.portev_events&_POLLERR != 0 { + pd.everr = true + } netpollready(&toRun, pd, mode) } } -- GitLab From 5f40351708cabe28f90500be87dbe316a2280f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 25 Nov 2018 17:30:36 +0000 Subject: [PATCH 0430/1679] encoding/base64: speed up the decoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most of the decoding time is spent in the first Decode loop, since the rest of the function only deals with the few remaining bytes. Any unnecessary work done in that loop body matters tremendously. One such unnecessary bottleneck was the use of the enc.decodeMap table. Since enc is a pointer receiver, and the field is used within the non-inlineable function decode64, the decoder must perform a nil check at every iteration. To fix that, move the enc.decodeMap uses to the parent function, where we can lift the nil check outside the loop. That gives roughly a 15% speed-up. The function no longer performs decoding per se, so rename it. While at it, remove the now unnecessary receivers. An unfortunate side effect of this change is that the loop now contains eight bounds checks on src instead of just one. However, not having to slice src plus the nil check removal well outweigh the added cost. The other piece that made decode64 slow was that it wasn't inlined, and had multiple branches. Use a simple bitwise-or trick suggested by Roger Peppe, and collapse the rest of the bitwise logic into a single expression. Inlinability and the reduced branching give a further 10% speed-up. Finally, add these two functions to TestIntendedInlining, since we want them to stay inlinable. Apply the same refactor to decode32 for consistency, and to let 32-bit architectures see a similar performance gain for large inputs. name old time/op new time/op delta DecodeString/2-8 47.3ns ± 1% 45.8ns ± 0% -3.28% (p=0.002 n=6+6) DecodeString/4-8 55.8ns ± 2% 51.5ns ± 0% -7.71% (p=0.004 n=5+6) DecodeString/8-8 64.9ns ± 0% 61.7ns ± 0% -4.99% (p=0.004 n=5+6) DecodeString/64-8 238ns ± 0% 198ns ± 0% -16.54% (p=0.002 n=6+6) DecodeString/8192-8 19.5µs ± 0% 14.6µs ± 0% -24.96% (p=0.004 n=6+5) name old speed new speed delta DecodeString/2-8 84.6MB/s ± 1% 87.4MB/s ± 0% +3.38% (p=0.002 n=6+6) DecodeString/4-8 143MB/s ± 2% 155MB/s ± 0% +8.41% (p=0.004 n=5+6) DecodeString/8-8 185MB/s ± 0% 195MB/s ± 0% +5.29% (p=0.004 n=5+6) DecodeString/64-8 369MB/s ± 0% 442MB/s ± 0% +19.78% (p=0.002 n=6+6) DecodeString/8192-8 560MB/s ± 0% 746MB/s ± 0% +33.27% (p=0.004 n=6+5) Updates #19636. Change-Id: Ib839577b0e3f5a2bb201f5cae580c61365d92894 Reviewed-on: https://go-review.googlesource.com/c/go/+/151177 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: roger peppe --- src/cmd/compile/internal/gc/inl_test.go | 4 + src/encoding/base64/base64.go | 112 +++++++++++------------- 2 files changed, 56 insertions(+), 60 deletions(-) diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index 7868c14aa6..a04869c5a3 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -119,6 +119,10 @@ func TestIntendedInlining(t *testing.T) { "byLiteral.Less", "byLiteral.Swap", }, + "encoding/base64": { + "assemble32", + "assemble64", + }, "unicode/utf8": { "FullRune", "FullRuneInString", diff --git a/src/encoding/base64/base64.go b/src/encoding/base64/base64.go index a7da7747ef..082210198f 100644 --- a/src/encoding/base64/base64.go +++ b/src/encoding/base64/base64.go @@ -284,6 +284,9 @@ func (enc *Encoding) decodeQuantum(dst, src []byte, si int) (nsi, n int, err err var dbuf [4]byte dlen := 4 + // Lift the nil check outside of the loop. + _ = enc.decodeMap + for j := 0; j < len(dbuf); j++ { if len(src) == si { switch { @@ -467,9 +470,23 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) { return 0, nil } + // Lift the nil check outside of the loop. enc.decodeMap is directly + // used later in this function, to let the compiler know that the + // receiver can't be nil. + _ = enc.decodeMap + si := 0 for strconv.IntSize >= 64 && len(src)-si >= 8 && len(dst)-n >= 8 { - if dn, ok := enc.decode64(src[si:]); ok { + if dn, ok := assemble64( + enc.decodeMap[src[si+0]], + enc.decodeMap[src[si+1]], + enc.decodeMap[src[si+2]], + enc.decodeMap[src[si+3]], + enc.decodeMap[src[si+4]], + enc.decodeMap[src[si+5]], + enc.decodeMap[src[si+6]], + enc.decodeMap[src[si+7]], + ); ok { binary.BigEndian.PutUint64(dst[n:], dn) n += 6 si += 8 @@ -484,7 +501,12 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) { } for len(src)-si >= 4 && len(dst)-n >= 4 { - if dn, ok := enc.decode32(src[si:]); ok { + if dn, ok := assemble32( + enc.decodeMap[src[si+0]], + enc.decodeMap[src[si+1]], + enc.decodeMap[src[si+2]], + enc.decodeMap[src[si+3]], + ); ok { binary.BigEndian.PutUint32(dst[n:], dn) n += 3 si += 4 @@ -509,70 +531,40 @@ func (enc *Encoding) Decode(dst, src []byte) (n int, err error) { return n, err } -// decode32 tries to decode 4 base64 characters into 3 bytes, and returns those -// bytes. len(src) must be >= 4. -// Returns (0, false) if decoding failed. -func (enc *Encoding) decode32(src []byte) (dn uint32, ok bool) { - var n uint32 - _ = src[3] - if n = uint32(enc.decodeMap[src[0]]); n == 0xff { - return 0, false - } - dn |= n << 26 - if n = uint32(enc.decodeMap[src[1]]); n == 0xff { - return 0, false - } - dn |= n << 20 - if n = uint32(enc.decodeMap[src[2]]); n == 0xff { +// assemble32 assembles 4 base64 digits into 3 bytes. +// Each digit comes from the decode map, and will be 0xff +// if it came from an invalid character. +func assemble32(n1, n2, n3, n4 byte) (dn uint32, ok bool) { + // Check that all the digits are valid. If any of them was 0xff, their + // bitwise OR will be 0xff. + if n1|n2|n3|n4 == 0xff { return 0, false } - dn |= n << 14 - if n = uint32(enc.decodeMap[src[3]]); n == 0xff { - return 0, false - } - dn |= n << 8 - return dn, true + return uint32(n1)<<26 | + uint32(n2)<<20 | + uint32(n3)<<14 | + uint32(n4)<<8, + true } -// decode64 tries to decode 8 base64 characters into 6 bytes, and returns those -// bytes. len(src) must be >= 8. -// Returns (0, false) if decoding failed. -func (enc *Encoding) decode64(src []byte) (dn uint64, ok bool) { - var n uint64 - _ = src[7] - if n = uint64(enc.decodeMap[src[0]]); n == 0xff { - return 0, false - } - dn |= n << 58 - if n = uint64(enc.decodeMap[src[1]]); n == 0xff { - return 0, false - } - dn |= n << 52 - if n = uint64(enc.decodeMap[src[2]]); n == 0xff { - return 0, false - } - dn |= n << 46 - if n = uint64(enc.decodeMap[src[3]]); n == 0xff { - return 0, false - } - dn |= n << 40 - if n = uint64(enc.decodeMap[src[4]]); n == 0xff { - return 0, false - } - dn |= n << 34 - if n = uint64(enc.decodeMap[src[5]]); n == 0xff { - return 0, false - } - dn |= n << 28 - if n = uint64(enc.decodeMap[src[6]]); n == 0xff { - return 0, false - } - dn |= n << 22 - if n = uint64(enc.decodeMap[src[7]]); n == 0xff { +// assemble64 assembles 8 base64 digits into 6 bytes. +// Each digit comes from the decode map, and will be 0xff +// if it came from an invalid character. +func assemble64(n1, n2, n3, n4, n5, n6, n7, n8 byte) (dn uint64, ok bool) { + // Check that all the digits are valid. If any of them was 0xff, their + // bitwise OR will be 0xff. + if n1|n2|n3|n4|n5|n6|n7|n8 == 0xff { return 0, false } - dn |= n << 16 - return dn, true + return uint64(n1)<<58 | + uint64(n2)<<52 | + uint64(n3)<<46 | + uint64(n4)<<40 | + uint64(n5)<<34 | + uint64(n6)<<28 | + uint64(n7)<<22 | + uint64(n8)<<16, + true } type newlineFilteringReader struct { -- GitLab From 2f02daaa46b2648f464d7c39ff4a1c5ee43631d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 3 Mar 2019 17:24:57 +0000 Subject: [PATCH 0431/1679] cmd/go/internal/base: remove MergeEnvLists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This internally exported function allowed merging environment variable lists, and was mostly a convenience for the rest of cmd/go/internal. It seems to date all the way back to 2013. However, since CL 37586 in early 2017, os/exec has already taken care of deduplicating environment variable lists. Thus, it's unnecessary for cmd/go to take care of that before calling exec.Cmd.Start. Moreover, because os/exec will deduplicate the list in any case, we're adding extra work in all these scenarios. Finally, remove an unnecessary addition of GOROOT= in internal/tool. cfg.OrigEnv may not have the correct GOROOT set up, but os.Environ does; cmd/go's main function makes sure of that. Change-Id: I1f92f65fb927dc15bc7b0397cfd1a572b6337bb3 Reviewed-on: https://go-review.googlesource.com/c/go/+/164703 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/base/env.go | 32 ++++-------------------- src/cmd/go/internal/generate/generate.go | 2 +- src/cmd/go/internal/tool/tool.go | 2 -- src/cmd/go/internal/work/exec.go | 6 +++-- 4 files changed, 10 insertions(+), 32 deletions(-) diff --git a/src/cmd/go/internal/base/env.go b/src/cmd/go/internal/base/env.go index fcade9d84e..077295e0ef 100644 --- a/src/cmd/go/internal/base/env.go +++ b/src/cmd/go/internal/base/env.go @@ -4,34 +4,12 @@ package base -import "strings" - -// EnvForDir returns a copy of the environment -// suitable for running in the given directory. -// The environment is the current process's environment -// but with an updated $PWD, so that an os.Getwd in the -// child will be faster. +// EnvForDir returns a modified environment suitable for running in the given +// directory. +// The environment is the supplied base environment but with an updated $PWD, so +// that an os.Getwd in the child will be faster. func EnvForDir(dir string, base []string) []string { // Internally we only use rooted paths, so dir is rooted. // Even if dir is not rooted, no harm done. - return MergeEnvLists([]string{"PWD=" + dir}, base) -} - -// MergeEnvLists merges the two environment lists such that -// variables with the same name in "in" replace those in "out". -// This always returns a newly allocated slice. -func MergeEnvLists(in, out []string) []string { - out = append([]string(nil), out...) -NextVar: - for _, inkv := range in { - k := strings.SplitAfterN(inkv, "=", 2)[0] - for i, outkv := range out { - if strings.HasPrefix(outkv, k) { - out[i] = inkv - continue NextVar - } - } - out = append(out, inkv) - } - return out + return append(base, "PWD="+dir) } diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index 124dbc05f5..23e2ecc224 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -428,7 +428,7 @@ func (g *Generator) exec(words []string) { cmd.Stderr = os.Stderr // Run the command in the package directory. cmd.Dir = g.dir - cmd.Env = base.MergeEnvLists(g.env, cfg.OrigEnv) + cmd.Env = append(cfg.OrigEnv, g.env...) err := cmd.Run() if err != nil { g.errorf("running %q: %s", words[0], err) diff --git a/src/cmd/go/internal/tool/tool.go b/src/cmd/go/internal/tool/tool.go index edcf93513d..930eecb63f 100644 --- a/src/cmd/go/internal/tool/tool.go +++ b/src/cmd/go/internal/tool/tool.go @@ -83,8 +83,6 @@ func runTool(cmd *base.Command, args []string) { Stdin: os.Stdin, Stdout: os.Stdout, Stderr: os.Stderr, - // Set $GOROOT, mainly for go tool dist. - Env: base.MergeEnvLists([]string{"GOROOT=" + cfg.GOROOT}, os.Environ()), } err := toolCmd.Run() if err != nil { diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index e53ef6cdd3..3310beb709 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -1903,7 +1903,8 @@ func (b *Builder) runOut(dir string, env []string, cmdargs ...interface{}) ([]by cleanup := passLongArgsInResponseFiles(cmd) defer cleanup() cmd.Dir = dir - cmd.Env = base.MergeEnvLists(env, base.EnvForDir(cmd.Dir, os.Environ())) + cmd.Env = base.EnvForDir(cmd.Dir, os.Environ()) + cmd.Env = append(cmd.Env, env...) err := cmd.Run() // err can be something like 'exit status 1'. @@ -2327,7 +2328,8 @@ func (b *Builder) gccSupportsFlag(compiler []string, flag string) bool { } cmd := exec.Command(cmdArgs[0], cmdArgs[1:]...) cmd.Dir = b.WorkDir - cmd.Env = base.MergeEnvLists([]string{"LC_ALL=C"}, base.EnvForDir(cmd.Dir, os.Environ())) + cmd.Env = base.EnvForDir(cmd.Dir, os.Environ()) + cmd.Env = append(cmd.Env, "LC_ALL=C") out, _ := cmd.CombinedOutput() // GCC says "unrecognized command line option". // clang says "unknown argument". -- GitLab From bd680d94a030962efbdb20a51eb19e50ba286e56 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 12 Mar 2019 15:43:16 -0400 Subject: [PATCH 0432/1679] cmd/go/internal/{modconv,modfetch,modload}: set modfetch proxy URL in tests Fixes #30571 Change-Id: Id4c74e83ee58a080d1c2894ae5ebdbf4aeb1ce42 Reviewed-on: https://go-review.googlesource.com/c/go/+/167084 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modconv/convert_test.go | 2 ++ src/cmd/go/internal/modfetch/coderepo_test.go | 2 ++ src/cmd/go/internal/modfetch/proxy.go | 8 ++++++++ src/cmd/go/internal/modload/query_test.go | 6 ++++++ 4 files changed, 18 insertions(+) diff --git a/src/cmd/go/internal/modconv/convert_test.go b/src/cmd/go/internal/modconv/convert_test.go index 4d55d73f21..d6316e36e9 100644 --- a/src/cmd/go/internal/modconv/convert_test.go +++ b/src/cmd/go/internal/modconv/convert_test.go @@ -28,6 +28,8 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { + modfetch.SetProxy("direct") + if _, err := exec.LookPath("git"); err != nil { fmt.Fprintln(os.Stderr, "skipping because git binary not found") fmt.Println("PASS") diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index 7a419576ce..2c756c50f2 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -24,6 +24,8 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { + SetProxy("direct") + dir, err := ioutil.TempDir("", "gitrepo-test-") if err != nil { log.Fatal(err) diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go index 60ed2a3796..3d4d2becf4 100644 --- a/src/cmd/go/internal/modfetch/proxy.go +++ b/src/cmd/go/internal/modfetch/proxy.go @@ -87,6 +87,14 @@ cached module versions with GOPROXY=https://example.com/proxy. var proxyURL = os.Getenv("GOPROXY") +// SetProxy sets the proxy to use when fetching modules. +// It accepts the same syntax as the GOPROXY environment variable, +// which also provides its default configuration. +// SetProxy must not be called after the first module fetch has begun. +func SetProxy(url string) { + proxyURL = url +} + func lookupProxy(path string) (Repo, error) { if strings.Contains(proxyURL, ",") { return nil, fmt.Errorf("invalid $GOPROXY setting: cannot have comma") diff --git a/src/cmd/go/internal/modload/query_test.go b/src/cmd/go/internal/modload/query_test.go index 9b07383217..d6e52c6b74 100644 --- a/src/cmd/go/internal/modload/query_test.go +++ b/src/cmd/go/internal/modload/query_test.go @@ -14,6 +14,7 @@ import ( "strings" "testing" + "cmd/go/internal/cfg" "cmd/go/internal/modfetch" "cmd/go/internal/modfetch/codehost" "cmd/go/internal/module" @@ -24,11 +25,16 @@ func TestMain(m *testing.M) { } func testMain(m *testing.M) int { + modfetch.SetProxy("direct") + dir, err := ioutil.TempDir("", "modload-test-") if err != nil { log.Fatal(err) } defer os.RemoveAll(dir) + + os.Setenv("GOPATH", dir) + cfg.BuildContext.GOPATH = dir modfetch.PkgMod = filepath.Join(dir, "pkg/mod") codehost.WorkRoot = filepath.Join(dir, "codework") return m.Run() -- GitLab From 82af9e67493b14ad1e10f28a384645e904a88d6f Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 28 Jan 2019 18:00:01 -0500 Subject: [PATCH 0433/1679] cmd/compile: move statement marks from jumps to targets When a jump at the end of a block is about to be marked as a statement, if the first real instruction in the target block is also a statement for the same line, remove the mark from the jump. This is a first effort at a minimal-harm heuristic. A better heuristic might skip over any "not-statement" values preceding a definitely marked value. Fixes #29443. Change-Id: Ibd52783713b4936e0c2dfda8d708bf186f33b00a Reviewed-on: https://go-review.googlesource.com/c/go/+/159977 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Alessandro Arzilli Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 3 +++ src/cmd/compile/internal/ssa/numberlines.go | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index d6b2bd3137..ecc449114d 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5236,7 +5236,10 @@ func genssa(f *ssa.Func, pp *Progs) { br.P.To.Val = s.bstart[br.B.ID] if br.P.Pos.IsStmt() != src.PosIsStmt { br.P.Pos = br.P.Pos.WithNotStmt() + } else if v0 := br.B.FirstPossibleStmtValue(); v0 != nil && v0.Pos.Line() == br.P.Pos.Line() && v0.Pos.IsStmt() == src.PosIsStmt { + br.P.Pos = br.P.Pos.WithNotStmt() } + } if e.log { // spew to stdout diff --git a/src/cmd/compile/internal/ssa/numberlines.go b/src/cmd/compile/internal/ssa/numberlines.go index 3e14b9e3df..ef5e133206 100644 --- a/src/cmd/compile/internal/ssa/numberlines.go +++ b/src/cmd/compile/internal/ssa/numberlines.go @@ -73,6 +73,16 @@ func notStmtBoundary(op Op) bool { return false } +func (b *Block) FirstPossibleStmtValue() *Value { + for _, v := range b.Values { + if notStmtBoundary(v.Op) { + continue + } + return v + } + return nil +} + func numberLines(f *Func) { po := f.Postorder() endlines := make(map[ID]src.XPos) -- GitLab From 4ba69a9a17d643e2e18acebac7b176746564b897 Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Seo Date: Fri, 11 Jan 2019 17:16:28 -0200 Subject: [PATCH 0434/1679] cmd/compile: add processor level selection support to ppc64{,le} ppc64{,le} processor level selection allows the compiler to generate instructions targeting newer processors and processor-specific optimizations without breaking compatibility with our current baseline. This feature introduces a new environment variable, GOPPC64. GOPPC64 is a GOARCH=ppc64{,le} specific option, for a choice between different processor levels (i.e. Instruction Set Architecture versions) for which the compiler will target. The default is 'power8'. Change-Id: Ic152e283ae1c47084ece4346fa002a3eabb3bb9e Reviewed-on: https://go-review.googlesource.com/c/go/+/163758 Run-TryBot: Carlos Eduardo Seo TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- doc/install-source.html | 11 +++++++++++ src/cmd/dist/build.go | 11 +++++++++++ src/cmd/dist/buildruntime.go | 2 ++ src/cmd/go/internal/cfg/cfg.go | 1 + src/cmd/go/internal/envcmd/env.go | 2 ++ src/cmd/internal/objabi/util.go | 12 ++++++++++++ test/run.go | 4 ++-- 7 files changed, 41 insertions(+), 2 deletions(-) diff --git a/doc/install-source.html b/doc/install-source.html index bbe7cdfd00..c11151be64 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -627,6 +627,17 @@ contains further details regarding Go's ARM support.

+
  • $GOPPC64 (for ppc64 and ppc64le only) +

    +This variable sets the processor level (i.e. Instruction Set Architecture version) +for which the compiler will target. The default is power8. +

    +
      +
    • GOPPC64=power8: generate ISA v2.07 instructions
    • +
    • GOPPC64=power9: generate ISA v3.00 instructions
    • +
    +
  • +

    diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 87739a510d..539227232a 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -33,6 +33,7 @@ var ( go386 string gomips string gomips64 string + goppc64 string goroot string goroot_final string goextlinkenabled string @@ -159,6 +160,12 @@ func xinit() { } gomips64 = b + b = os.Getenv("GOPPC64") + if b == "" { + b = "power8" + } + goppc64 = b + if p := pathf("%s/src/all.bash", goroot); !isfile(p) { fatalf("$GOROOT is not set correctly or not exported\n"+ "\tGOROOT=%s\n"+ @@ -219,6 +226,7 @@ func xinit() { os.Setenv("GOOS", goos) os.Setenv("GOMIPS", gomips) os.Setenv("GOMIPS64", gomips64) + os.Setenv("GOPPC64", goppc64) os.Setenv("GOROOT", goroot) os.Setenv("GOROOT_FINAL", goroot_final) @@ -1117,6 +1125,9 @@ func cmdenv() { if goarch == "mips64" || goarch == "mips64le" { xprintf(format, "GOMIPS64", gomips64) } + if goarch == "ppc64" || goarch == "ppc64le" { + xprintf(format, "GOPPC64", goppc64) + } if *path { sep := ":" diff --git a/src/cmd/dist/buildruntime.go b/src/cmd/dist/buildruntime.go index d5462792f8..2744951597 100644 --- a/src/cmd/dist/buildruntime.go +++ b/src/cmd/dist/buildruntime.go @@ -45,6 +45,7 @@ func mkzversion(dir, file string) { // const defaultGOARM = // const defaultGOMIPS = // const defaultGOMIPS64 = +// const defaultGOPPC64 = // const defaultGOOS = runtime.GOOS // const defaultGOARCH = runtime.GOARCH // const defaultGO_EXTLINK_ENABLED = @@ -73,6 +74,7 @@ func mkzbootstrap(file string) { fmt.Fprintf(&buf, "const defaultGOARM = `%s`\n", goarm) fmt.Fprintf(&buf, "const defaultGOMIPS = `%s`\n", gomips) fmt.Fprintf(&buf, "const defaultGOMIPS64 = `%s`\n", gomips64) + fmt.Fprintf(&buf, "const defaultGOPPC64 = `%s`\n", goppc64) fmt.Fprintf(&buf, "const defaultGOOS = runtime.GOOS\n") fmt.Fprintf(&buf, "const defaultGOARCH = runtime.GOARCH\n") fmt.Fprintf(&buf, "const defaultGO_EXTLINK_ENABLED = `%s`\n", goextlinkenabled) diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 31c1fb84ef..80a154b066 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -104,6 +104,7 @@ var ( GO386 = objabi.GO386 GOMIPS = objabi.GOMIPS GOMIPS64 = objabi.GOMIPS64 + GOPPC64 = fmt.Sprintf("%s%d", "power", objabi.GOPPC64) ) // Update build context to use our computed GOROOT. diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index ae98d3999a..08291dfb14 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -81,6 +81,8 @@ func MkEnv() []cfg.EnvVar { env = append(env, cfg.EnvVar{Name: "GOMIPS", Value: cfg.GOMIPS}) case "mips64", "mips64le": env = append(env, cfg.EnvVar{Name: "GOMIPS64", Value: cfg.GOMIPS64}) + case "ppc64", "ppc64le": + env = append(env, cfg.EnvVar{Name: "GOPPC64", Value: cfg.GOPPC64}) } cc := cfg.DefaultCC(cfg.Goos, cfg.Goarch) diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index 907f75cb4f..665c8b3be6 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -28,6 +28,7 @@ var ( GOARM = goarm() GOMIPS = gomips() GOMIPS64 = gomips64() + GOPPC64 = goppc64() GO_LDSO = defaultGO_LDSO Version = version ) @@ -64,6 +65,17 @@ func gomips64() string { panic("unreachable") } +func goppc64() int { + switch v := envOr("GOPPC64", defaultGOPPC64); v { + case "power8": + return 8 + case "power9": + return 9 + } + log.Fatalf("Invalid GOPPC64 value. Must be power8 or power9.") + panic("unreachable") +} + func Getgoextlinkenabled() string { return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) } diff --git a/test/run.go b/test/run.go index ad38d420c9..7a764d5f8d 100644 --- a/test/run.go +++ b/test/run.go @@ -1382,8 +1382,8 @@ var ( "arm64": {}, "mips": {"GOMIPS", "hardfloat", "softfloat"}, "mips64": {"GOMIPS64", "hardfloat", "softfloat"}, - "ppc64": {}, - "ppc64le": {}, + "ppc64": {"GOPPC64", "power8", "power9"}, + "ppc64le": {"GOPPC64", "power8", "power9"}, "s390x": {}, } ) -- GitLab From 5d4fa147c70b5ec2dfa812220c1ddc135e3b5381 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Mar 2019 10:29:14 -0400 Subject: [PATCH 0435/1679] cmd/go/internal/modload: remove unused InitGoMod function Change-Id: I0223d935184017e841d56abe114d78b670457c5a Reviewed-on: https://go-review.googlesource.com/c/go/+/167437 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/modload/init.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index a93692579c..af7ce070ce 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -445,13 +445,6 @@ func legacyModInit() { } } -// InitGoStmt adds a go statement, unless there already is one. -func InitGoStmt() { - if modFile.Go == nil { - addGoStmt() - } -} - // addGoStmt adds a go statement referring to the current version. func addGoStmt() { tags := build.Default.ReleaseTags -- GitLab From 04f1b65cc6ffbaa3693bbcb57ae26fb59466531b Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Wed, 13 Mar 2019 10:32:48 +0000 Subject: [PATCH 0436/1679] cmd/compile: try and access last argument first in rulegen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reduces the number of extra bounds check hints we need to insert. For example, rather than producing: _ = v.Args[2] x := v.Args[0] y := v.Args[1] z := v.Args[2] We now produce: z := v.Args[2] x := v.Args[0] y := v.Args[1] This gets rid of about 7000 lines of code from the rewrite rules. Change-Id: I1291cf0f82e8d035a6d65bce7dee6cedee04cbcd Reviewed-on: https://go-review.googlesource.com/c/go/+/167397 Reviewed-by: Daniel Martí Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/gen/rulegen.go | 13 +- src/cmd/compile/internal/ssa/rewrite386.go | 2210 +++----- src/cmd/compile/internal/ssa/rewriteAMD64.go | 4846 ++++++----------- src/cmd/compile/internal/ssa/rewriteARM.go | 2708 +++------ src/cmd/compile/internal/ssa/rewriteARM64.go | 2787 ++++------ src/cmd/compile/internal/ssa/rewriteMIPS.go | 760 +-- src/cmd/compile/internal/ssa/rewriteMIPS64.go | 919 ++-- src/cmd/compile/internal/ssa/rewritePPC64.go | 1713 ++---- src/cmd/compile/internal/ssa/rewriteS390X.go | 3215 ++++------- src/cmd/compile/internal/ssa/rewriteWasm.go | 676 +-- src/cmd/compile/internal/ssa/rewritedec.go | 49 +- src/cmd/compile/internal/ssa/rewritedec64.go | 202 +- .../compile/internal/ssa/rewritegeneric.go | 1740 ++---- 13 files changed, 7351 insertions(+), 14487 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 6762d1cd3f..1f61035969 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -449,7 +449,6 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t } if aux != "" { - if !isVariable(aux) { // code fmt.Fprintf(w, "if %s.Aux != %s {\nbreak\n}\n", v, aux) @@ -466,8 +465,18 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t } } + // Access last argument first to minimize bounds checks. if n := len(args); n > 1 { - fmt.Fprintf(w, "_ = %s.Args[%d]\n", v, n-1) // combine some bounds checks + a := args[n-1] + if _, set := m[a]; !set && a != "_" && isVariable(a) { + m[a] = struct{}{} + fmt.Fprintf(w, "%s := %s.Args[%d]\n", a, v, n-1) + + // delete the last argument so it is not reprocessed + args = args[:n-1] + } else { + fmt.Fprintf(w, "_ = %s.Args[%d]\n", v, n-1) + } } for i, arg := range args { if arg == "_" { diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index 422a8b42fa..e2d76ecb85 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -707,14 +707,13 @@ func rewriteValue386_Op386ADCL_0(v *Value) bool { // cond: // result: (ADCLconst [c] x f) for { - _ = v.Args[2] + f := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - f := v.Args[2] v.reset(Op386ADCLconst) v.AuxInt = c v.AddArg(x) @@ -725,14 +724,13 @@ func rewriteValue386_Op386ADCL_0(v *Value) bool { // cond: // result: (ADCLconst [c] x f) for { - _ = v.Args[2] + f := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt x := v.Args[1] - f := v.Args[2] v.reset(Op386ADCLconst) v.AuxInt = c v.AddArg(x) @@ -743,14 +741,13 @@ func rewriteValue386_Op386ADCL_0(v *Value) bool { // cond: // result: (ADCLconst [c] x f) for { - _ = v.Args[2] + f := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt x := v.Args[1] - f := v.Args[2] v.reset(Op386ADCLconst) v.AuxInt = c v.AddArg(x) @@ -761,14 +758,13 @@ func rewriteValue386_Op386ADCL_0(v *Value) bool { // cond: // result: (ADCLconst [c] x f) for { - _ = v.Args[2] + f := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - f := v.Args[2] v.reset(Op386ADCLconst) v.AuxInt = c v.AddArg(x) @@ -798,13 +794,12 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { // cond: // result: (ADDLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386ADDLconst) v.AuxInt = c v.AddArg(x) @@ -999,7 +994,7 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { // cond: // result: (LEAL8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -1008,7 +1003,6 @@ func rewriteValue386_Op386ADDL_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL8) v.AddArg(x) v.AddArg(y) @@ -1040,7 +1034,7 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { // cond: // result: (LEAL4 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -1049,7 +1043,6 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL4) v.AddArg(x) v.AddArg(y) @@ -1078,7 +1071,7 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { // cond: // result: (LEAL2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -1087,7 +1080,6 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL2) v.AddArg(x) v.AddArg(y) @@ -1103,9 +1095,8 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { if v_1.Op != Op386ADDL { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if y != v_1.Args[1] { + y := v_1.Args[1] + if y != v_1.Args[0] { break } v.reset(Op386LEAL2) @@ -1117,17 +1108,15 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { // cond: // result: (LEAL2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if y != v_0.Args[1] { + y := v_0.Args[1] + if y != v_0.Args[0] { break } - x := v.Args[1] v.reset(Op386LEAL2) v.AddArg(x) v.AddArg(y) @@ -1143,11 +1132,10 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { if v_1.Op != Op386ADDL { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(Op386LEAL2) v.AddArg(y) v.AddArg(x) @@ -1177,15 +1165,13 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { // cond: // result: (LEAL2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(Op386LEAL2) @@ -1197,15 +1183,14 @@ func rewriteValue386_Op386ADDL_10(v *Value) bool { // cond: // result: (LEAL2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(Op386LEAL2) @@ -1220,14 +1205,13 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { // cond: // result: (LEAL1 [c] x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } c := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] v.reset(Op386LEAL1) v.AuxInt = c v.AddArg(x) @@ -1279,7 +1263,7 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAL1 [c] {s} x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1287,7 +1271,6 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { c := v_0.AuxInt s := v_0.Aux y := v_0.Args[0] - x := v.Args[1] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -1310,9 +1293,8 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1328,17 +1310,15 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1362,10 +1342,9 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1382,18 +1361,16 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDLloadidx4 x [off] {sym} ptr idx mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLloadidx4 { break } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] - x := v.Args[1] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1426,13 +1403,12 @@ func rewriteValue386_Op386ADDL_20(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386NEGL { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386SUBL) v.AddArg(x) v.AddArg(y) @@ -1461,13 +1437,12 @@ func rewriteValue386_Op386ADDLcarry_0(v *Value) bool { // cond: // result: (ADDLconstcarry [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386ADDLconstcarry) v.AuxInt = c v.AddArg(x) @@ -1485,9 +1460,8 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(Op386LEAL1) v.AuxInt = c v.AddArg(x) @@ -1526,9 +1500,8 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1550,9 +1523,8 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1574,9 +1546,8 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1598,9 +1569,8 @@ func rewriteValue386_Op386ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1666,14 +1636,13 @@ func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -1690,7 +1659,7 @@ func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1698,7 +1667,6 @@ func rewriteValue386_Op386ADDLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -1720,7 +1688,7 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -1728,7 +1696,6 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -1746,7 +1713,7 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -1754,7 +1721,6 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { } off2 := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2 * 4)) { break } @@ -1772,7 +1738,7 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -1781,7 +1747,6 @@ func rewriteValue386_Op386ADDLconstmodifyidx4_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -1804,7 +1769,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -1812,7 +1777,6 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -1830,7 +1794,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -1839,7 +1803,6 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -1857,7 +1820,7 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -1865,10 +1828,8 @@ func rewriteValue386_Op386ADDLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -1892,7 +1853,7 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -1901,7 +1862,6 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -1920,7 +1880,7 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -1929,7 +1889,6 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -1948,7 +1907,7 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -1958,7 +1917,6 @@ func rewriteValue386_Op386ADDLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -1982,7 +1940,7 @@ func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -1990,7 +1948,6 @@ func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2008,7 +1965,7 @@ func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -2017,7 +1974,6 @@ func rewriteValue386_Op386ADDLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2040,7 +1996,7 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -2049,7 +2005,6 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -2068,7 +2023,7 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2077,7 +2032,6 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { off2 := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -2096,7 +2050,7 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -2106,7 +2060,6 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2125,7 +2078,7 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -2133,7 +2086,6 @@ func rewriteValue386_Op386ADDLmodifyidx4_0(v *Value) bool { break } c := v_2.AuxInt - mem := v.Args[3] if !(validValAndOff(c, off)) { break } @@ -2162,9 +2114,8 @@ func rewriteValue386_Op386ADDSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -2180,17 +2131,15 @@ func rewriteValue386_Op386ADDSD_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (ADDSDload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVSDload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -2213,7 +2162,7 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2221,7 +2170,6 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2239,7 +2187,7 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -2248,7 +2196,6 @@ func rewriteValue386_Op386ADDSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2277,9 +2224,8 @@ func rewriteValue386_Op386ADDSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -2295,17 +2241,15 @@ func rewriteValue386_Op386ADDSS_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (ADDSSload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVSSload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -2328,7 +2272,7 @@ func rewriteValue386_Op386ADDSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2336,7 +2280,6 @@ func rewriteValue386_Op386ADDSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2354,7 +2297,7 @@ func rewriteValue386_Op386ADDSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -2363,7 +2306,6 @@ func rewriteValue386_Op386ADDSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2398,13 +2340,12 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { // cond: // result: (ANDLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386ANDLconst) v.AuxInt = c v.AddArg(x) @@ -2422,9 +2363,8 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2440,17 +2380,15 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ANDLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2474,10 +2412,9 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2494,18 +2431,16 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ANDLloadidx4 x [off] {sym} ptr idx mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLloadidx4 { break } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] - x := v.Args[1] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2522,9 +2457,8 @@ func rewriteValue386_Op386ANDL_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -2602,14 +2536,13 @@ func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -2626,7 +2559,7 @@ func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -2634,7 +2567,6 @@ func rewriteValue386_Op386ANDLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2656,7 +2588,7 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -2664,7 +2596,6 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -2682,7 +2613,7 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2690,7 +2621,6 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { } off2 := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2 * 4)) { break } @@ -2708,7 +2638,7 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -2717,7 +2647,6 @@ func rewriteValue386_Op386ANDLconstmodifyidx4_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2740,7 +2669,7 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2748,7 +2677,6 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2766,7 +2694,7 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -2775,7 +2703,6 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2793,7 +2720,7 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -2801,10 +2728,8 @@ func rewriteValue386_Op386ANDLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -2828,7 +2753,7 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -2837,7 +2762,6 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -2856,7 +2780,7 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -2865,7 +2789,6 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -2884,7 +2807,7 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -2894,7 +2817,6 @@ func rewriteValue386_Op386ANDLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2918,7 +2840,7 @@ func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -2926,7 +2848,6 @@ func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2944,7 +2865,7 @@ func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -2953,7 +2874,6 @@ func rewriteValue386_Op386ANDLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -2976,7 +2896,7 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -2985,7 +2905,6 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -3004,7 +2923,7 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -3013,7 +2932,6 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { off2 := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -3032,7 +2950,7 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -3042,7 +2960,6 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -3061,7 +2978,7 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -3069,7 +2986,6 @@ func rewriteValue386_Op386ANDLmodifyidx4_0(v *Value) bool { break } c := v_2.AuxInt - mem := v.Args[3] if !(validValAndOff(c, off)) { break } @@ -3105,13 +3021,12 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { // cond: // result: (InvertFlags (CMPBconst x [int64(int8(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386InvertFlags) v0 := b.NewValue0(v.Pos, Op386CMPBconst, types.TypeFlags) v0.AuxInt = int64(int8(c)) @@ -3123,17 +3038,15 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPBload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVBload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3157,9 +3070,8 @@ func rewriteValue386_Op386CMPB_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3284,9 +3196,8 @@ func rewriteValue386_Op386CMPBconst_0(v *Value) bool { if l.Op != Op386ANDL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -3340,9 +3251,8 @@ func rewriteValue386_Op386CMPBconst_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -3365,14 +3275,13 @@ func rewriteValue386_Op386CMPBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(int64(int8(c)), off)) { break } @@ -3407,13 +3316,12 @@ func rewriteValue386_Op386CMPL_0(v *Value) bool { // cond: // result: (InvertFlags (CMPLconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386InvertFlags) v0 := b.NewValue0(v.Pos, Op386CMPLconst, types.TypeFlags) v0.AuxInt = c @@ -3425,17 +3333,15 @@ func rewriteValue386_Op386CMPL_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPLload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3459,9 +3365,8 @@ func rewriteValue386_Op386CMPL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3601,9 +3506,8 @@ func rewriteValue386_Op386CMPLconst_0(v *Value) bool { if l.Op != Op386ANDL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -3661,9 +3565,8 @@ func rewriteValue386_Op386CMPLconst_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -3686,14 +3589,13 @@ func rewriteValue386_Op386CMPLload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(int64(int32(c)), off)) { break } @@ -3728,13 +3630,12 @@ func rewriteValue386_Op386CMPW_0(v *Value) bool { // cond: // result: (InvertFlags (CMPWconst x [int64(int16(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386InvertFlags) v0 := b.NewValue0(v.Pos, Op386CMPWconst, types.TypeFlags) v0.AuxInt = int64(int16(c)) @@ -3746,17 +3647,15 @@ func rewriteValue386_Op386CMPW_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPWload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVWload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3780,9 +3679,8 @@ func rewriteValue386_Op386CMPW_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -3907,9 +3805,8 @@ func rewriteValue386_Op386CMPWconst_0(v *Value) bool { if l.Op != Op386ANDL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -3963,9 +3860,8 @@ func rewriteValue386_Op386CMPWconst_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -3988,14 +3884,13 @@ func rewriteValue386_Op386CMPWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(int64(int16(c)), off)) { break } @@ -4023,9 +3918,8 @@ func rewriteValue386_Op386DIVSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -4048,7 +3942,7 @@ func rewriteValue386_Op386DIVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -4056,7 +3950,6 @@ func rewriteValue386_Op386DIVSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4074,7 +3967,7 @@ func rewriteValue386_Op386DIVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -4083,7 +3976,6 @@ func rewriteValue386_Op386DIVSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -4112,9 +4004,8 @@ func rewriteValue386_Op386DIVSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -4137,7 +4028,7 @@ func rewriteValue386_Op386DIVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -4145,7 +4036,6 @@ func rewriteValue386_Op386DIVSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4163,7 +4053,7 @@ func rewriteValue386_Op386DIVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -4172,7 +4062,6 @@ func rewriteValue386_Op386DIVSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -4218,9 +4107,8 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -4265,9 +4153,8 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4290,9 +4177,8 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4315,9 +4201,8 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4340,9 +4225,8 @@ func rewriteValue386_Op386LEAL_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4362,14 +4246,13 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -4433,7 +4316,7 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -4442,7 +4325,6 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL2) v.AuxInt = c v.Aux = s @@ -4479,7 +4361,7 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -4488,7 +4370,6 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL4) v.AuxInt = c v.Aux = s @@ -4525,7 +4406,7 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -4534,7 +4415,6 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(Op386LEAL8) v.AuxInt = c v.Aux = s @@ -4548,7 +4428,7 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4556,7 +4436,6 @@ func rewriteValue386_Op386LEAL1_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -4601,14 +4480,13 @@ func rewriteValue386_Op386LEAL2_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -4695,7 +4573,7 @@ func rewriteValue386_Op386LEAL2_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4703,7 +4581,6 @@ func rewriteValue386_Op386LEAL2_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -4723,14 +4600,13 @@ func rewriteValue386_Op386LEAL4_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -4794,7 +4670,7 @@ func rewriteValue386_Op386LEAL4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4802,7 +4678,6 @@ func rewriteValue386_Op386LEAL4_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -4822,14 +4697,13 @@ func rewriteValue386_Op386LEAL8_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -4870,7 +4744,7 @@ func rewriteValue386_Op386LEAL8_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4878,7 +4752,6 @@ func rewriteValue386_Op386LEAL8_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -4903,9 +4776,8 @@ func rewriteValue386_Op386MOVBLSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -4972,7 +4844,7 @@ func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -4980,7 +4852,6 @@ func rewriteValue386_Op386MOVBLSXload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5005,9 +4876,8 @@ func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -5031,10 +4901,9 @@ func rewriteValue386_Op386MOVBLZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5099,14 +4968,13 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -5123,7 +4991,7 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -5131,7 +4999,6 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5148,17 +5015,15 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -5176,15 +5041,13 @@ func rewriteValue386_Op386MOVBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -5223,7 +5086,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -5231,7 +5094,6 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -5246,7 +5108,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -5254,7 +5116,6 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVBloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -5269,7 +5130,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -5277,7 +5138,6 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVBloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -5292,7 +5152,7 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -5300,7 +5160,6 @@ func rewriteValue386_Op386MOVBloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -5320,14 +5179,13 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVBLSX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVBstore) v.AuxInt = off v.Aux = sym @@ -5342,14 +5200,13 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVBLZX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVBstore) v.AuxInt = off v.Aux = sym @@ -5364,7 +5221,7 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -5372,7 +5229,6 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5390,14 +5246,13 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -5414,7 +5269,7 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -5423,7 +5278,6 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5441,18 +5295,16 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -5471,16 +5323,14 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -5519,14 +5369,13 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5564,14 +5413,13 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5602,7 +5450,7 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -5616,7 +5464,6 @@ func rewriteValue386_Op386MOVBstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5650,7 +5497,7 @@ func rewriteValue386_Op386MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -5664,7 +5511,6 @@ func rewriteValue386_Op386MOVBstore_10(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5700,7 +5546,7 @@ func rewriteValue386_Op386MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -5714,7 +5560,6 @@ func rewriteValue386_Op386MOVBstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -5737,14 +5582,13 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -5761,7 +5605,7 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -5769,7 +5613,6 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5786,17 +5629,15 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -5814,15 +5655,13 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(Op386MOVBstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -5847,11 +5686,10 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -5878,11 +5716,10 @@ func rewriteValue386_Op386MOVBstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -5902,7 +5739,7 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -5910,7 +5747,6 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -5925,7 +5761,7 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -5933,7 +5769,6 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVBstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -5959,14 +5794,13 @@ func rewriteValue386_Op386MOVBstoreconstidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -5987,7 +5821,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -5996,7 +5830,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVBstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -6012,7 +5845,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -6021,7 +5854,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVBstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -6037,7 +5869,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -6046,7 +5878,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVBstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -6062,7 +5893,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -6071,7 +5902,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVBstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -6108,7 +5938,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6118,7 +5948,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6158,7 +5987,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6168,7 +5997,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6208,7 +6036,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6218,7 +6046,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6258,7 +6085,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6268,7 +6095,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6308,7 +6134,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6318,7 +6144,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6358,7 +6183,7 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6368,7 +6193,6 @@ func rewriteValue386_Op386MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6411,7 +6235,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6421,7 +6245,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6461,7 +6284,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6471,7 +6294,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6504,7 +6326,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6521,7 +6343,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6554,7 +6375,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6571,7 +6392,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6604,7 +6424,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6621,7 +6441,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6654,7 +6473,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6671,7 +6490,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6704,7 +6522,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6721,7 +6539,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6754,7 +6571,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6771,7 +6588,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6804,7 +6620,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6821,7 +6637,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6854,7 +6669,7 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6871,7 +6686,6 @@ func rewriteValue386_Op386MOVBstoreidx1_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6912,7 +6726,7 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -6929,7 +6743,6 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -6967,7 +6780,7 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -6984,7 +6797,6 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -7022,7 +6834,7 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -7039,7 +6851,6 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -7077,7 +6888,7 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -7094,7 +6905,6 @@ func rewriteValue386_Op386MOVBstoreidx1_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -7143,14 +6953,13 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -7167,7 +6976,7 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -7175,7 +6984,6 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -7192,17 +7000,15 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -7220,17 +7026,15 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -7248,15 +7052,13 @@ func rewriteValue386_Op386MOVLload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -7295,7 +7097,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -7305,7 +7107,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLloadidx4) v.AuxInt = c v.Aux = sym @@ -7320,7 +7121,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -7330,7 +7131,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLloadidx4) v.AuxInt = c v.Aux = sym @@ -7345,7 +7145,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -7353,7 +7153,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -7368,7 +7167,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -7376,7 +7175,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -7391,7 +7189,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -7399,7 +7197,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -7414,7 +7211,7 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -7422,7 +7219,6 @@ func rewriteValue386_Op386MOVLloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -7440,7 +7236,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -7448,7 +7244,6 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLloadidx4) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -7463,7 +7258,7 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -7471,7 +7266,6 @@ func rewriteValue386_Op386MOVLloadidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLloadidx4) v.AuxInt = int64(int32(c + 4*d)) v.Aux = sym @@ -7491,7 +7285,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -7499,7 +7293,6 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -7517,14 +7310,13 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -7541,7 +7333,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -7550,7 +7342,6 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -7568,18 +7359,16 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -7598,18 +7387,16 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -7628,16 +7415,14 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -7656,7 +7441,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ADDLload { @@ -7673,8 +7458,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -7694,7 +7478,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ANDLload { @@ -7711,8 +7495,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -7732,7 +7515,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ORLload { @@ -7749,8 +7532,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -7770,7 +7552,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386XORLload { @@ -7787,8 +7569,7 @@ func rewriteValue386_Op386MOVLstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -7811,13 +7592,13 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ADDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLload { break @@ -7832,9 +7613,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -7854,7 +7633,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ADDL { @@ -7876,8 +7655,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -7897,13 +7675,13 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386SUBL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLload { break @@ -7918,9 +7696,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -7940,13 +7716,13 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ANDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLload { break @@ -7961,9 +7737,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -7983,7 +7757,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ANDL { @@ -8005,8 +7779,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -8026,13 +7799,13 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLload { break @@ -8047,9 +7820,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -8069,7 +7840,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ORL { @@ -8091,8 +7862,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -8112,13 +7882,13 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386XORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLload { break @@ -8133,9 +7903,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -8155,7 +7923,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386XORL { @@ -8177,8 +7945,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -8198,7 +7965,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ADDLconst { @@ -8219,8 +7986,7 @@ func rewriteValue386_Op386MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -8242,7 +8008,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ANDLconst { @@ -8263,8 +8029,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -8283,7 +8048,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386ORLconst { @@ -8304,8 +8069,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -8324,7 +8088,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != Op386XORLconst { @@ -8345,8 +8109,7 @@ func rewriteValue386_Op386MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -8370,14 +8133,13 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -8394,7 +8156,7 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -8402,7 +8164,6 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -8419,17 +8180,15 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -8447,17 +8206,15 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL4 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -8475,15 +8232,13 @@ func rewriteValue386_Op386MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(Op386MOVLstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -8501,7 +8256,7 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -8511,7 +8266,6 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLstoreconstidx4) v.AuxInt = c v.Aux = sym @@ -8526,7 +8280,7 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -8534,7 +8288,6 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -8549,7 +8302,7 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -8557,7 +8310,6 @@ func rewriteValue386_Op386MOVLstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -8575,7 +8327,7 @@ func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -8583,7 +8335,6 @@ func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLstoreconstidx4) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -8598,7 +8349,7 @@ func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -8606,7 +8357,6 @@ func rewriteValue386_Op386MOVLstoreconstidx4_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVLstoreconstidx4) v.AuxInt = ValAndOff(x).add(4 * c) v.Aux = sym @@ -8624,7 +8374,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -8635,7 +8385,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx4) v.AuxInt = c v.Aux = sym @@ -8651,7 +8400,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -8662,7 +8411,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx4) v.AuxInt = c v.Aux = sym @@ -8678,7 +8426,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -8687,7 +8435,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -8703,7 +8450,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -8712,7 +8459,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -8728,7 +8474,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -8737,7 +8483,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -8753,7 +8498,7 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -8762,7 +8507,6 @@ func rewriteValue386_Op386MOVLstoreidx1_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -8781,7 +8525,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -8790,7 +8534,6 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx4) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -8806,7 +8549,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -8815,7 +8558,6 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVLstoreidx4) v.AuxInt = int64(int32(c + 4*d)) v.Aux = sym @@ -8831,7 +8573,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -8852,8 +8594,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != y.Args[2] { break } - mem := y.Args[3] - if mem != v.Args[3] { + if mem != y.Args[3] { break } if !(y.Uses == 1 && clobber(y)) { @@ -8874,7 +8615,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -8895,8 +8636,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != y.Args[2] { break } - mem := y.Args[3] - if mem != v.Args[3] { + if mem != y.Args[3] { break } if !(y.Uses == 1 && clobber(y)) { @@ -8917,7 +8657,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -8938,8 +8678,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != y.Args[2] { break } - mem := y.Args[3] - if mem != v.Args[3] { + if mem != y.Args[3] { break } if !(y.Uses == 1 && clobber(y)) { @@ -8960,7 +8699,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -8981,8 +8720,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != y.Args[2] { break } - mem := y.Args[3] - if mem != v.Args[3] { + if mem != y.Args[3] { break } if !(y.Uses == 1 && clobber(y)) { @@ -9003,14 +8741,14 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] if y.Op != Op386ADDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLloadidx4 { break @@ -9028,9 +8766,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - x := y.Args[1] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9051,7 +8787,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9077,8 +8813,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9099,14 +8834,14 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] if y.Op != Op386SUBL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLloadidx4 { break @@ -9124,9 +8859,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - x := y.Args[1] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9147,14 +8880,14 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] if y.Op != Op386ANDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLloadidx4 { break @@ -9172,9 +8905,7 @@ func rewriteValue386_Op386MOVLstoreidx4_0(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - x := y.Args[1] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9198,7 +8929,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9224,8 +8955,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9246,14 +8976,14 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] if y.Op != Op386ORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLloadidx4 { break @@ -9271,9 +9001,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - x := y.Args[1] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9294,7 +9022,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9320,8 +9048,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9342,14 +9069,14 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] if y.Op != Op386XORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != Op386MOVLloadidx4 { break @@ -9367,9 +9094,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - x := y.Args[1] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9390,7 +9115,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9416,8 +9141,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -9438,7 +9162,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9463,8 +9187,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -9484,7 +9207,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9509,8 +9232,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -9530,7 +9252,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9555,8 +9277,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -9576,7 +9297,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] y := v.Args[2] @@ -9601,8 +9322,7 @@ func rewriteValue386_Op386MOVLstoreidx4_10(v *Value) bool { if idx != l.Args[1] { break } - mem := l.Args[2] - if mem != v.Args[3] { + if mem != l.Args[2] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l) && validValAndOff(c, off)) { @@ -9647,14 +9367,13 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -9671,7 +9390,7 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -9679,7 +9398,6 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9696,17 +9414,15 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9724,17 +9440,15 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9752,15 +9466,13 @@ func rewriteValue386_Op386MOVSDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -9781,7 +9493,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -9789,7 +9501,6 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVSDloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -9804,7 +9515,7 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -9812,7 +9523,6 @@ func rewriteValue386_Op386MOVSDloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVSDloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -9830,7 +9540,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -9838,7 +9548,6 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVSDloadidx8) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -9853,7 +9562,7 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -9861,7 +9570,6 @@ func rewriteValue386_Op386MOVSDloadidx8_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVSDloadidx8) v.AuxInt = int64(int32(c + 8*d)) v.Aux = sym @@ -9881,7 +9589,7 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -9889,7 +9597,6 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -9907,7 +9614,7 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -9916,7 +9623,6 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9934,18 +9640,16 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9964,18 +9668,16 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9994,16 +9696,14 @@ func rewriteValue386_Op386MOVSDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -10025,7 +9725,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10034,7 +9734,6 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSDstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10050,7 +9749,7 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10059,7 +9758,6 @@ func rewriteValue386_Op386MOVSDstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSDstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10078,7 +9776,7 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10087,7 +9785,6 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSDstoreidx8) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10103,7 +9800,7 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10112,7 +9809,6 @@ func rewriteValue386_Op386MOVSDstoreidx8_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSDstoreidx8) v.AuxInt = int64(int32(c + 8*d)) v.Aux = sym @@ -10153,14 +9849,13 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -10177,7 +9872,7 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -10185,7 +9880,6 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -10202,17 +9896,15 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10230,17 +9922,15 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10258,15 +9948,13 @@ func rewriteValue386_Op386MOVSSload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -10287,7 +9975,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10295,7 +9983,6 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVSSloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10310,7 +9997,7 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10318,7 +10005,6 @@ func rewriteValue386_Op386MOVSSloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVSSloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10336,7 +10022,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10344,7 +10030,6 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVSSloadidx4) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10359,7 +10044,7 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10367,7 +10052,6 @@ func rewriteValue386_Op386MOVSSloadidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVSSloadidx4) v.AuxInt = int64(int32(c + 4*d)) v.Aux = sym @@ -10387,7 +10071,7 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10395,7 +10079,6 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -10413,7 +10096,7 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -10422,7 +10105,6 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -10440,18 +10122,16 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10470,18 +10150,16 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10500,16 +10178,14 @@ func rewriteValue386_Op386MOVSSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -10531,7 +10207,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10540,7 +10216,6 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSSstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10556,7 +10231,7 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10565,7 +10240,6 @@ func rewriteValue386_Op386MOVSSstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSSstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10584,7 +10258,7 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -10593,7 +10267,6 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSSstoreidx4) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -10609,7 +10282,7 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -10618,7 +10291,6 @@ func rewriteValue386_Op386MOVSSstoreidx4_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVSSstoreidx4) v.AuxInt = int64(int32(c + 4*d)) v.Aux = sym @@ -10642,9 +10314,8 @@ func rewriteValue386_Op386MOVWLSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -10711,7 +10382,7 @@ func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -10719,7 +10390,6 @@ func rewriteValue386_Op386MOVWLSXload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -10744,9 +10414,8 @@ func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -10770,10 +10439,9 @@ func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -10798,10 +10466,9 @@ func rewriteValue386_Op386MOVWLZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -10866,14 +10533,13 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -10890,7 +10556,7 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -10898,7 +10564,6 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -10915,17 +10580,15 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10943,17 +10606,15 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL2 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10971,15 +10632,13 @@ func rewriteValue386_Op386MOVWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -11018,7 +10677,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -11028,7 +10687,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWloadidx2) v.AuxInt = c v.Aux = sym @@ -11043,7 +10701,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -11053,7 +10711,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWloadidx2) v.AuxInt = c v.Aux = sym @@ -11068,7 +10725,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11076,7 +10733,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11091,7 +10747,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -11099,7 +10755,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11114,7 +10769,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -11122,7 +10777,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11137,7 +10791,7 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11145,7 +10799,6 @@ func rewriteValue386_Op386MOVWloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWloadidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11163,7 +10816,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11171,7 +10824,6 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWloadidx2) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11186,7 +10838,7 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -11194,7 +10846,6 @@ func rewriteValue386_Op386MOVWloadidx2_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWloadidx2) v.AuxInt = int64(int32(c + 2*d)) v.Aux = sym @@ -11214,14 +10865,13 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVWLSX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWstore) v.AuxInt = off v.Aux = sym @@ -11236,14 +10886,13 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVWLZX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWstore) v.AuxInt = off v.Aux = sym @@ -11258,7 +10907,7 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11266,7 +10915,6 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -11284,14 +10932,13 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -11308,7 +10955,7 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -11317,7 +10964,6 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -11335,18 +10981,16 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11365,18 +11009,16 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL2 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11395,16 +11037,14 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -11443,14 +11083,13 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11486,7 +11125,7 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -11500,7 +11139,6 @@ func rewriteValue386_Op386MOVWstore_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11523,14 +11161,13 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -11547,7 +11184,7 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -11555,7 +11192,6 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -11572,17 +11208,15 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -11600,17 +11234,15 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL2 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -11628,15 +11260,13 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDL { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(Op386MOVWstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -11661,11 +11291,10 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -11692,11 +11321,10 @@ func rewriteValue386_Op386MOVWstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -11716,7 +11344,7 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -11726,7 +11354,6 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWstoreconstidx2) v.AuxInt = c v.Aux = sym @@ -11741,7 +11368,7 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11749,7 +11376,6 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -11764,7 +11390,7 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -11772,7 +11398,6 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWstoreconstidx1) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -11798,14 +11423,13 @@ func rewriteValue386_Op386MOVWstoreconstidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -11827,7 +11451,7 @@ func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11835,7 +11459,6 @@ func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWstoreconstidx2) v.AuxInt = ValAndOff(x).add(c) v.Aux = sym @@ -11850,7 +11473,7 @@ func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -11858,7 +11481,6 @@ func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(Op386MOVWstoreconstidx2) v.AuxInt = ValAndOff(x).add(2 * c) v.Aux = sym @@ -11884,14 +11506,13 @@ func rewriteValue386_Op386MOVWstoreconstidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -11915,7 +11536,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386SHLLconst { @@ -11926,7 +11547,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx2) v.AuxInt = c v.Aux = sym @@ -11942,7 +11562,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386SHLLconst { break @@ -11953,7 +11573,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx2) v.AuxInt = c v.Aux = sym @@ -11969,7 +11588,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -11978,7 +11597,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -11994,7 +11612,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -12003,7 +11621,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -12019,7 +11636,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -12028,7 +11645,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -12044,7 +11660,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -12053,7 +11669,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx1) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -12090,7 +11705,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12100,7 +11715,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12140,7 +11754,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12150,7 +11764,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12190,7 +11803,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12200,7 +11813,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12240,7 +11852,7 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12250,7 +11862,6 @@ func rewriteValue386_Op386MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12291,7 +11902,7 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12308,7 +11919,6 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12346,7 +11956,7 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12363,7 +11973,6 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12401,7 +12010,7 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12418,7 +12027,6 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12456,7 +12064,7 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12473,7 +12081,6 @@ func rewriteValue386_Op386MOVWstoreidx1_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12496,7 +12103,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -12505,7 +12112,6 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx2) v.AuxInt = int64(int32(c + d)) v.Aux = sym @@ -12521,7 +12127,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -12530,7 +12136,6 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(Op386MOVWstoreidx2) v.AuxInt = int64(int32(c + 2*d)) v.Aux = sym @@ -12567,7 +12172,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12577,7 +12182,6 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12618,7 +12222,7 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12635,7 +12239,6 @@ func rewriteValue386_Op386MOVWstoreidx2_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12674,13 +12277,12 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { // cond: // result: (MULLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386MULLconst) v.AuxInt = c v.AddArg(x) @@ -12698,9 +12300,8 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -12716,17 +12317,15 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (MULLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -12750,10 +12349,9 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -12770,18 +12368,16 @@ func rewriteValue386_Op386MULL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (MULLloadidx4 x [off] {sym} ptr idx mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLloadidx4 { break } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] - x := v.Args[1] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -13307,7 +12903,7 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -13315,7 +12911,6 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -13333,7 +12928,7 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -13342,7 +12937,6 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13360,7 +12954,7 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -13368,10 +12962,8 @@ func rewriteValue386_Op386MULLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -13395,7 +12987,7 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -13404,7 +12996,6 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -13423,7 +13014,7 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -13432,7 +13023,6 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -13451,7 +13041,7 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -13461,7 +13051,6 @@ func rewriteValue386_Op386MULLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13491,9 +13080,8 @@ func rewriteValue386_Op386MULSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -13509,17 +13097,15 @@ func rewriteValue386_Op386MULSD_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (MULSDload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVSDload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -13542,7 +13128,7 @@ func rewriteValue386_Op386MULSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -13550,7 +13136,6 @@ func rewriteValue386_Op386MULSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -13568,7 +13153,7 @@ func rewriteValue386_Op386MULSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -13577,7 +13162,6 @@ func rewriteValue386_Op386MULSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13606,9 +13190,8 @@ func rewriteValue386_Op386MULSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -13624,17 +13207,15 @@ func rewriteValue386_Op386MULSS_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l) // result: (MULSSload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVSSload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -13657,7 +13238,7 @@ func rewriteValue386_Op386MULSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -13665,7 +13246,6 @@ func rewriteValue386_Op386MULSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -13683,7 +13263,7 @@ func rewriteValue386_Op386MULSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -13692,7 +13272,6 @@ func rewriteValue386_Op386MULSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13759,13 +13338,12 @@ func rewriteValue386_Op386ORL_0(v *Value) bool { // cond: // result: (ORLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386ORLconst) v.AuxInt = c v.AddArg(x) @@ -13949,9 +13527,8 @@ func rewriteValue386_Op386ORL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -13967,17 +13544,15 @@ func rewriteValue386_Op386ORL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ORLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -14006,10 +13581,9 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -14026,18 +13600,16 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ORLloadidx4 x [off] {sym} ptr idx mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLloadidx4 { break } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] - x := v.Args[1] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -14054,9 +13626,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -14075,9 +13646,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s0 := v.Args[1] if s0.Op != Op386SHLLconst { break @@ -14131,9 +13701,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != Op386MOVBload { break @@ -14178,9 +13747,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -14261,9 +13829,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := o0.Args[1] if x0.Op != Op386MOVWload { break @@ -14332,9 +13899,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -14408,9 +13974,8 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -14477,10 +14042,9 @@ func rewriteValue386_Op386ORL_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := v.Args[1] if s0.Op != Op386SHLLconst { break @@ -14535,10 +14099,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := v.Args[1] if s0.Op != Op386SHLLconst { break @@ -14589,10 +14152,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := v.Args[1] if s0.Op != Op386SHLLconst { break @@ -14643,10 +14205,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := v.Args[1] if s0.Op != Op386SHLLconst { break @@ -14704,10 +14265,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != Op386MOVBloadidx1 { break @@ -14758,10 +14318,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != Op386MOVBloadidx1 { break @@ -14812,10 +14371,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != Op386MOVBloadidx1 { break @@ -14866,10 +14424,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != Op386MOVBloadidx1 { break @@ -14918,10 +14475,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15002,10 +14558,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15086,10 +14641,9 @@ func rewriteValue386_Op386ORL_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15174,10 +14728,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15265,10 +14818,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -15349,10 +14901,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -15433,10 +14984,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -15517,10 +15067,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -15594,10 +15143,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15678,10 +15226,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15762,10 +15309,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15846,10 +15392,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s0 := o0.Args[1] if s0.Op != Op386SHLLconst { break @@ -15937,10 +15482,9 @@ func rewriteValue386_Op386ORL_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -16025,10 +15569,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -16109,10 +15652,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -16193,10 +15735,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := o0.Args[1] if x0.Op != Op386MOVWloadidx1 { break @@ -16272,10 +15813,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16356,10 +15896,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16440,10 +15979,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16524,10 +16062,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16608,10 +16145,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16692,10 +16228,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16776,10 +16311,9 @@ func rewriteValue386_Op386ORL_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16864,10 +16398,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -16948,10 +16481,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17032,10 +16564,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17116,10 +16647,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17200,10 +16730,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17284,10 +16813,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17368,10 +16896,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17452,10 +16979,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] p := x2.Args[0] idx := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17536,10 +17062,9 @@ func rewriteValue386_Op386ORL_50(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[2] + mem := x2.Args[2] idx := x2.Args[0] p := x2.Args[1] - mem := x2.Args[2] o0 := v.Args[1] if o0.Op != Op386ORL { break @@ -17656,14 +17181,13 @@ func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -17680,7 +17204,7 @@ func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -17688,7 +17212,6 @@ func rewriteValue386_Op386ORLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17710,7 +17233,7 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -17718,7 +17241,6 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -17736,7 +17258,7 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -17744,7 +17266,6 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { } off2 := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2 * 4)) { break } @@ -17762,7 +17283,7 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -17771,7 +17292,6 @@ func rewriteValue386_Op386ORLconstmodifyidx4_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17794,7 +17314,7 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -17802,7 +17322,6 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -17820,7 +17339,7 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -17829,7 +17348,6 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17847,7 +17365,7 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -17855,10 +17373,8 @@ func rewriteValue386_Op386ORLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -17882,7 +17398,7 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -17891,7 +17407,6 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -17910,7 +17425,7 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -17919,7 +17434,6 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -17938,7 +17452,7 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -17948,7 +17462,6 @@ func rewriteValue386_Op386ORLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17972,7 +17485,7 @@ func rewriteValue386_Op386ORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -17980,7 +17493,6 @@ func rewriteValue386_Op386ORLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -17998,7 +17510,7 @@ func rewriteValue386_Op386ORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -18007,7 +17519,6 @@ func rewriteValue386_Op386ORLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -18030,7 +17541,7 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -18039,7 +17550,6 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -18058,7 +17568,7 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -18067,7 +17577,6 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { off2 := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -18086,7 +17595,7 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -18096,7 +17605,6 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -18115,7 +17623,7 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -18123,7 +17631,6 @@ func rewriteValue386_Op386ORLmodifyidx4_0(v *Value) bool { break } c := v_2.AuxInt - mem := v.Args[3] if !(validValAndOff(c, off)) { break } @@ -18404,14 +17911,13 @@ func rewriteValue386_Op386SBBL_0(v *Value) bool { // cond: // result: (SBBLconst [c] x f) for { - _ = v.Args[2] + f := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386MOVLconst { break } c := v_1.AuxInt - f := v.Args[2] v.reset(Op386SBBLconst) v.AuxInt = c v.AddArg(x) @@ -19483,13 +18989,12 @@ func rewriteValue386_Op386SUBL_0(v *Value) bool { // cond: // result: (NEGL (SUBLconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386NEGL) v0 := b.NewValue0(v.Pos, Op386SUBLconst, v.Type) v0.AuxInt = c @@ -19509,9 +19014,8 @@ func rewriteValue386_Op386SUBL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -19535,10 +19039,9 @@ func rewriteValue386_Op386SUBL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -19555,9 +19058,8 @@ func rewriteValue386_Op386SUBL_0(v *Value) bool { // cond: // result: (MOVLconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(Op386MOVLconst) @@ -19621,7 +19123,7 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -19629,7 +19131,6 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -19647,7 +19148,7 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -19656,7 +19157,6 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -19674,7 +19174,7 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -19682,10 +19182,8 @@ func rewriteValue386_Op386SUBLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -19709,7 +19207,7 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -19718,7 +19216,6 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -19737,7 +19234,7 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -19746,7 +19243,6 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -19765,7 +19261,7 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -19775,7 +19271,6 @@ func rewriteValue386_Op386SUBLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -19799,7 +19294,7 @@ func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -19807,7 +19302,6 @@ func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -19825,7 +19319,7 @@ func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -19834,7 +19328,6 @@ func rewriteValue386_Op386SUBLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -19857,7 +19350,7 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -19866,7 +19359,6 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -19885,7 +19377,7 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -19894,7 +19386,6 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { off2 := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -19913,7 +19404,7 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -19923,7 +19414,6 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -19942,7 +19432,7 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -19950,7 +19440,6 @@ func rewriteValue386_Op386SUBLmodifyidx4_0(v *Value) bool { break } c := v_2.AuxInt - mem := v.Args[3] if !(validValAndOff(-c, off)) { break } @@ -19979,9 +19468,8 @@ func rewriteValue386_Op386SUBSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -20004,7 +19492,7 @@ func rewriteValue386_Op386SUBSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20012,7 +19500,6 @@ func rewriteValue386_Op386SUBSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -20030,7 +19517,7 @@ func rewriteValue386_Op386SUBSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -20039,7 +19526,6 @@ func rewriteValue386_Op386SUBSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20068,9 +19554,8 @@ func rewriteValue386_Op386SUBSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && !config.use387 && clobber(l)) { break } @@ -20093,7 +19578,7 @@ func rewriteValue386_Op386SUBSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20101,7 +19586,6 @@ func rewriteValue386_Op386SUBSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -20119,7 +19603,7 @@ func rewriteValue386_Op386SUBSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -20128,7 +19612,6 @@ func rewriteValue386_Op386SUBSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20163,13 +19646,12 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { // cond: // result: (XORLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(Op386XORLconst) v.AuxInt = c v.AddArg(x) @@ -20353,9 +19835,8 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -20371,17 +19852,15 @@ func rewriteValue386_Op386XORL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -20408,10 +19887,9 @@ func rewriteValue386_Op386XORL_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -20428,18 +19906,16 @@ func rewriteValue386_Op386XORL_10(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORLloadidx4 x [off] {sym} ptr idx mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != Op386MOVLloadidx4 { break } off := l.AuxInt sym := l.Aux - _ = l.Args[2] + mem := l.Args[2] ptr := l.Args[0] idx := l.Args[1] - mem := l.Args[2] - x := v.Args[1] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -20456,9 +19932,8 @@ func rewriteValue386_Op386XORL_10(v *Value) bool { // cond: // result: (MOVLconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(Op386MOVLconst) @@ -20523,14 +19998,13 @@ func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -20547,7 +20021,7 @@ func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -20555,7 +20029,6 @@ func rewriteValue386_Op386XORLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20577,7 +20050,7 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -20585,7 +20058,6 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -20603,7 +20075,7 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20611,7 +20083,6 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { } off2 := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2 * 4)) { break } @@ -20629,7 +20100,7 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -20638,7 +20109,6 @@ func rewriteValue386_Op386XORLconstmodifyidx4_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20661,7 +20131,7 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20669,7 +20139,6 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -20687,7 +20156,7 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -20696,7 +20165,6 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20714,7 +20182,7 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL4 { @@ -20722,10 +20190,8 @@ func rewriteValue386_Op386XORLload_0(v *Value) bool { } off2 := v_1.AuxInt sym2 := v_1.Aux - _ = v_1.Args[1] - ptr := v_1.Args[0] idx := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -20749,7 +20215,7 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20758,7 +20224,6 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { off2 := v_1.AuxInt base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -20777,7 +20242,7 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] base := v.Args[1] v_2 := v.Args[2] @@ -20786,7 +20251,6 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { } off2 := v_2.AuxInt idx := v_2.Args[0] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -20805,7 +20269,7 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386LEAL { @@ -20815,7 +20279,6 @@ func rewriteValue386_Op386XORLloadidx4_0(v *Value) bool { sym2 := v_1.Aux base := v_1.Args[0] idx := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20839,7 +20302,7 @@ func rewriteValue386_Op386XORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -20847,7 +20310,6 @@ func rewriteValue386_Op386XORLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -20865,7 +20327,7 @@ func rewriteValue386_Op386XORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -20874,7 +20336,6 @@ func rewriteValue386_Op386XORLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20897,7 +20358,7 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386ADDLconst { break @@ -20906,7 +20367,6 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -20925,7 +20385,7 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] base := v.Args[0] v_1 := v.Args[1] if v_1.Op != Op386ADDLconst { @@ -20934,7 +20394,6 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { off2 := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2*4)) { break } @@ -20953,7 +20412,7 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != Op386LEAL { break @@ -20963,7 +20422,6 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { base := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -20982,7 +20440,7 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -20990,7 +20448,6 @@ func rewriteValue386_Op386XORLmodifyidx4_0(v *Value) bool { break } c := v_2.AuxInt - mem := v.Args[3] if !(validValAndOff(c, off)) { break } @@ -21009,9 +20466,8 @@ func rewriteValue386_OpAdd16_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDL) v.AddArg(x) v.AddArg(y) @@ -21023,9 +20479,8 @@ func rewriteValue386_OpAdd32_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDL) v.AddArg(x) v.AddArg(y) @@ -21037,9 +20492,8 @@ func rewriteValue386_OpAdd32F_0(v *Value) bool { // cond: // result: (ADDSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDSS) v.AddArg(x) v.AddArg(y) @@ -21051,9 +20505,8 @@ func rewriteValue386_OpAdd32carry_0(v *Value) bool { // cond: // result: (ADDLcarry x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDLcarry) v.AddArg(x) v.AddArg(y) @@ -21065,10 +20518,9 @@ func rewriteValue386_OpAdd32withcarry_0(v *Value) bool { // cond: // result: (ADCL x y c) for { - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(Op386ADCL) v.AddArg(x) v.AddArg(y) @@ -21081,9 +20533,8 @@ func rewriteValue386_OpAdd64F_0(v *Value) bool { // cond: // result: (ADDSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDSD) v.AddArg(x) v.AddArg(y) @@ -21095,9 +20546,8 @@ func rewriteValue386_OpAdd8_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDL) v.AddArg(x) v.AddArg(y) @@ -21109,9 +20559,8 @@ func rewriteValue386_OpAddPtr_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ADDL) v.AddArg(x) v.AddArg(y) @@ -21136,9 +20585,8 @@ func rewriteValue386_OpAnd16_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v.AddArg(x) v.AddArg(y) @@ -21150,9 +20598,8 @@ func rewriteValue386_OpAnd32_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v.AddArg(x) v.AddArg(y) @@ -21164,9 +20611,8 @@ func rewriteValue386_OpAnd8_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v.AddArg(x) v.AddArg(y) @@ -21178,9 +20624,8 @@ func rewriteValue386_OpAndB_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v.AddArg(x) v.AddArg(y) @@ -21192,9 +20637,8 @@ func rewriteValue386_OpAvg32u_0(v *Value) bool { // cond: // result: (AVGLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386AVGLU) v.AddArg(x) v.AddArg(y) @@ -21218,10 +20662,9 @@ func rewriteValue386_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(Op386CALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -21411,9 +20854,8 @@ func rewriteValue386_OpDiv16_0(v *Value) bool { // result: (DIVW [a] x y) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVW) v.AuxInt = a v.AddArg(x) @@ -21426,9 +20868,8 @@ func rewriteValue386_OpDiv16u_0(v *Value) bool { // cond: // result: (DIVWU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVWU) v.AddArg(x) v.AddArg(y) @@ -21441,9 +20882,8 @@ func rewriteValue386_OpDiv32_0(v *Value) bool { // result: (DIVL [a] x y) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVL) v.AuxInt = a v.AddArg(x) @@ -21456,9 +20896,8 @@ func rewriteValue386_OpDiv32F_0(v *Value) bool { // cond: // result: (DIVSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVSS) v.AddArg(x) v.AddArg(y) @@ -21470,9 +20909,8 @@ func rewriteValue386_OpDiv32u_0(v *Value) bool { // cond: // result: (DIVLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVLU) v.AddArg(x) v.AddArg(y) @@ -21484,9 +20922,8 @@ func rewriteValue386_OpDiv64F_0(v *Value) bool { // cond: // result: (DIVSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVSD) v.AddArg(x) v.AddArg(y) @@ -21500,9 +20937,8 @@ func rewriteValue386_OpDiv8_0(v *Value) bool { // cond: // result: (DIVW (SignExt8to16 x) (SignExt8to16 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVW) v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) v0.AddArg(x) @@ -21520,9 +20956,8 @@ func rewriteValue386_OpDiv8u_0(v *Value) bool { // cond: // result: (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386DIVWU) v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) v0.AddArg(x) @@ -21539,9 +20974,8 @@ func rewriteValue386_OpEq16_0(v *Value) bool { // cond: // result: (SETEQ (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQ) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -21556,9 +20990,8 @@ func rewriteValue386_OpEq32_0(v *Value) bool { // cond: // result: (SETEQ (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQ) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21573,9 +21006,8 @@ func rewriteValue386_OpEq32F_0(v *Value) bool { // cond: // result: (SETEQF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -21590,9 +21022,8 @@ func rewriteValue386_OpEq64F_0(v *Value) bool { // cond: // result: (SETEQF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -21607,9 +21038,8 @@ func rewriteValue386_OpEq8_0(v *Value) bool { // cond: // result: (SETEQ (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQ) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21624,9 +21054,8 @@ func rewriteValue386_OpEqB_0(v *Value) bool { // cond: // result: (SETEQ (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQ) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21641,9 +21070,8 @@ func rewriteValue386_OpEqPtr_0(v *Value) bool { // cond: // result: (SETEQ (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETEQ) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21658,9 +21086,8 @@ func rewriteValue386_OpGeq16_0(v *Value) bool { // cond: // result: (SETGE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGE) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -21675,9 +21102,8 @@ func rewriteValue386_OpGeq16U_0(v *Value) bool { // cond: // result: (SETAE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETAE) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -21692,9 +21118,8 @@ func rewriteValue386_OpGeq32_0(v *Value) bool { // cond: // result: (SETGE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21709,9 +21134,8 @@ func rewriteValue386_OpGeq32F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGEF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -21726,9 +21150,8 @@ func rewriteValue386_OpGeq32U_0(v *Value) bool { // cond: // result: (SETAE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETAE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21743,9 +21166,8 @@ func rewriteValue386_OpGeq64F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGEF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -21760,9 +21182,8 @@ func rewriteValue386_OpGeq8_0(v *Value) bool { // cond: // result: (SETGE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21777,9 +21198,8 @@ func rewriteValue386_OpGeq8U_0(v *Value) bool { // cond: // result: (SETAE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETAE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21832,9 +21252,8 @@ func rewriteValue386_OpGreater16_0(v *Value) bool { // cond: // result: (SETG (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETG) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -21849,9 +21268,8 @@ func rewriteValue386_OpGreater16U_0(v *Value) bool { // cond: // result: (SETA (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETA) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -21866,9 +21284,8 @@ func rewriteValue386_OpGreater32_0(v *Value) bool { // cond: // result: (SETG (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETG) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21883,9 +21300,8 @@ func rewriteValue386_OpGreater32F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -21900,9 +21316,8 @@ func rewriteValue386_OpGreater32U_0(v *Value) bool { // cond: // result: (SETA (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETA) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -21917,9 +21332,8 @@ func rewriteValue386_OpGreater64F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -21934,9 +21348,8 @@ func rewriteValue386_OpGreater8_0(v *Value) bool { // cond: // result: (SETG (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETG) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21951,9 +21364,8 @@ func rewriteValue386_OpGreater8U_0(v *Value) bool { // cond: // result: (SETA (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETA) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -21967,9 +21379,8 @@ func rewriteValue386_OpHmul32_0(v *Value) bool { // cond: // result: (HMULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386HMULL) v.AddArg(x) v.AddArg(y) @@ -21981,9 +21392,8 @@ func rewriteValue386_OpHmul32u_0(v *Value) bool { // cond: // result: (HMULLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386HMULLU) v.AddArg(x) v.AddArg(y) @@ -21996,9 +21406,8 @@ func rewriteValue386_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(Op386CALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -22012,9 +21421,8 @@ func rewriteValue386_OpIsInBounds_0(v *Value) bool { // cond: // result: (SETB (CMPL idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(Op386SETB) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(idx) @@ -22044,9 +21452,8 @@ func rewriteValue386_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (SETBE (CMPL idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(Op386SETBE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(idx) @@ -22061,9 +21468,8 @@ func rewriteValue386_OpLeq16_0(v *Value) bool { // cond: // result: (SETLE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETLE) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -22078,9 +21484,8 @@ func rewriteValue386_OpLeq16U_0(v *Value) bool { // cond: // result: (SETBE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETBE) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -22095,9 +21500,8 @@ func rewriteValue386_OpLeq32_0(v *Value) bool { // cond: // result: (SETLE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETLE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -22112,9 +21516,8 @@ func rewriteValue386_OpLeq32F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGEF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(y) @@ -22129,9 +21532,8 @@ func rewriteValue386_OpLeq32U_0(v *Value) bool { // cond: // result: (SETBE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETBE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -22146,9 +21548,8 @@ func rewriteValue386_OpLeq64F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGEF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(y) @@ -22163,9 +21564,8 @@ func rewriteValue386_OpLeq8_0(v *Value) bool { // cond: // result: (SETLE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETLE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -22180,9 +21580,8 @@ func rewriteValue386_OpLeq8U_0(v *Value) bool { // cond: // result: (SETBE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETBE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -22197,9 +21596,8 @@ func rewriteValue386_OpLess16_0(v *Value) bool { // cond: // result: (SETL (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETL) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -22214,9 +21612,8 @@ func rewriteValue386_OpLess16U_0(v *Value) bool { // cond: // result: (SETB (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETB) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -22231,9 +21628,8 @@ func rewriteValue386_OpLess32_0(v *Value) bool { // cond: // result: (SETL (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETL) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -22248,9 +21644,8 @@ func rewriteValue386_OpLess32F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(y) @@ -22265,9 +21660,8 @@ func rewriteValue386_OpLess32U_0(v *Value) bool { // cond: // result: (SETB (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETB) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -22282,9 +21676,8 @@ func rewriteValue386_OpLess64F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETGF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(y) @@ -22299,9 +21692,8 @@ func rewriteValue386_OpLess8_0(v *Value) bool { // cond: // result: (SETL (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETL) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -22316,9 +21708,8 @@ func rewriteValue386_OpLess8U_0(v *Value) bool { // cond: // result: (SETB (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETB) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -22333,9 +21724,8 @@ func rewriteValue386_OpLoad_0(v *Value) bool { // result: (MOVLload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) || isPtr(t)) { break } @@ -22349,9 +21739,8 @@ func rewriteValue386_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t)) { break } @@ -22365,9 +21754,8 @@ func rewriteValue386_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean() || is8BitInt(t)) { break } @@ -22381,9 +21769,8 @@ func rewriteValue386_OpLoad_0(v *Value) bool { // result: (MOVSSload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -22397,9 +21784,8 @@ func rewriteValue386_OpLoad_0(v *Value) bool { // result: (MOVSDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -22431,9 +21817,8 @@ func rewriteValue386_OpLsh16x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22455,9 +21840,8 @@ func rewriteValue386_OpLsh16x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22518,9 +21902,8 @@ func rewriteValue386_OpLsh16x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22542,9 +21925,8 @@ func rewriteValue386_OpLsh32x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22566,9 +21948,8 @@ func rewriteValue386_OpLsh32x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22629,9 +22010,8 @@ func rewriteValue386_OpLsh32x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22653,9 +22033,8 @@ func rewriteValue386_OpLsh8x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22677,9 +22056,8 @@ func rewriteValue386_OpLsh8x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22740,9 +22118,8 @@ func rewriteValue386_OpLsh8x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHLL, t) v0.AddArg(x) @@ -22762,10 +22139,9 @@ func rewriteValue386_OpMod16_0(v *Value) bool { // cond: // result: (MODW [a] x y) for { - a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] + a := v.AuxInt y := v.Args[1] + x := v.Args[0] v.reset(Op386MODW) v.AuxInt = a v.AddArg(x) @@ -22778,9 +22154,8 @@ func rewriteValue386_OpMod16u_0(v *Value) bool { // cond: // result: (MODWU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MODWU) v.AddArg(x) v.AddArg(y) @@ -22793,9 +22168,8 @@ func rewriteValue386_OpMod32_0(v *Value) bool { // result: (MODL [a] x y) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MODL) v.AuxInt = a v.AddArg(x) @@ -22808,9 +22182,8 @@ func rewriteValue386_OpMod32u_0(v *Value) bool { // cond: // result: (MODLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MODLU) v.AddArg(x) v.AddArg(y) @@ -22824,9 +22197,8 @@ func rewriteValue386_OpMod8_0(v *Value) bool { // cond: // result: (MODW (SignExt8to16 x) (SignExt8to16 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MODW) v0 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) v0.AddArg(x) @@ -22844,9 +22216,8 @@ func rewriteValue386_OpMod8u_0(v *Value) bool { // cond: // result: (MODWU (ZeroExt8to16 x) (ZeroExt8to16 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MODWU) v0 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) v0.AddArg(x) @@ -22867,7 +22238,6 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -22881,10 +22251,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) @@ -22901,10 +22270,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) @@ -22921,10 +22289,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) @@ -22941,10 +22308,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -22970,10 +22336,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVBstore) v.AuxInt = 4 v.AddArg(dst) @@ -22999,10 +22364,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVWstore) v.AuxInt = 4 v.AddArg(dst) @@ -23028,10 +22392,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLstore) v.AuxInt = 3 v.AddArg(dst) @@ -23057,10 +22420,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(Op386MOVLstore) v.AuxInt = 4 v.AddArg(dst) @@ -23084,10 +22446,9 @@ func rewriteValue386_OpMove_0(v *Value) bool { // result: (Move [s-s%4] (ADDLconst dst [s%4]) (ADDLconst src [s%4]) (MOVLstore dst (MOVLload src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 8 && s%4 != 0) { break } @@ -23122,10 +22483,9 @@ func rewriteValue386_OpMove_10(v *Value) bool { // result: (DUFFCOPY [10*(128-s/4)] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 8 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { break } @@ -23141,10 +22501,9 @@ func rewriteValue386_OpMove_10(v *Value) bool { // result: (REPMOVSL dst src (MOVLconst [s/4]) mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !((s > 4*128 || config.noDuffDevice) && s%4 == 0) { break } @@ -23164,9 +22523,8 @@ func rewriteValue386_OpMul16_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULL) v.AddArg(x) v.AddArg(y) @@ -23178,9 +22536,8 @@ func rewriteValue386_OpMul32_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULL) v.AddArg(x) v.AddArg(y) @@ -23192,9 +22549,8 @@ func rewriteValue386_OpMul32F_0(v *Value) bool { // cond: // result: (MULSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULSS) v.AddArg(x) v.AddArg(y) @@ -23206,9 +22562,8 @@ func rewriteValue386_OpMul32uhilo_0(v *Value) bool { // cond: // result: (MULLQU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULLQU) v.AddArg(x) v.AddArg(y) @@ -23220,9 +22575,8 @@ func rewriteValue386_OpMul64F_0(v *Value) bool { // cond: // result: (MULSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULSD) v.AddArg(x) v.AddArg(y) @@ -23234,9 +22588,8 @@ func rewriteValue386_OpMul8_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386MULL) v.AddArg(x) v.AddArg(y) @@ -23348,9 +22701,8 @@ func rewriteValue386_OpNeq16_0(v *Value) bool { // cond: // result: (SETNE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNE) v0 := b.NewValue0(v.Pos, Op386CMPW, types.TypeFlags) v0.AddArg(x) @@ -23365,9 +22717,8 @@ func rewriteValue386_OpNeq32_0(v *Value) bool { // cond: // result: (SETNE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -23382,9 +22733,8 @@ func rewriteValue386_OpNeq32F_0(v *Value) bool { // cond: // result: (SETNEF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNEF) v0 := b.NewValue0(v.Pos, Op386UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -23399,9 +22749,8 @@ func rewriteValue386_OpNeq64F_0(v *Value) bool { // cond: // result: (SETNEF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNEF) v0 := b.NewValue0(v.Pos, Op386UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -23416,9 +22765,8 @@ func rewriteValue386_OpNeq8_0(v *Value) bool { // cond: // result: (SETNE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -23433,9 +22781,8 @@ func rewriteValue386_OpNeqB_0(v *Value) bool { // cond: // result: (SETNE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNE) v0 := b.NewValue0(v.Pos, Op386CMPB, types.TypeFlags) v0.AddArg(x) @@ -23450,9 +22797,8 @@ func rewriteValue386_OpNeqPtr_0(v *Value) bool { // cond: // result: (SETNE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SETNE) v0 := b.NewValue0(v.Pos, Op386CMPL, types.TypeFlags) v0.AddArg(x) @@ -23466,9 +22812,8 @@ func rewriteValue386_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(Op386LoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -23505,9 +22850,8 @@ func rewriteValue386_OpOr16_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ORL) v.AddArg(x) v.AddArg(y) @@ -23519,9 +22863,8 @@ func rewriteValue386_OpOr32_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ORL) v.AddArg(x) v.AddArg(y) @@ -23533,9 +22876,8 @@ func rewriteValue386_OpOr8_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ORL) v.AddArg(x) v.AddArg(y) @@ -23547,9 +22889,8 @@ func rewriteValue386_OpOrB_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ORL) v.AddArg(x) v.AddArg(y) @@ -23587,9 +22928,8 @@ func rewriteValue386_OpRsh16Ux16_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPWconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRW, t) v0.AddArg(x) @@ -23611,9 +22951,8 @@ func rewriteValue386_OpRsh16Ux32_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPLconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRW, t) v0.AddArg(x) @@ -23674,9 +23013,8 @@ func rewriteValue386_OpRsh16Ux8_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPBconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRW, t) v0.AddArg(x) @@ -23698,9 +23036,8 @@ func rewriteValue386_OpRsh16x16_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARW) v.Type = t v.AddArg(x) @@ -23725,9 +23062,8 @@ func rewriteValue386_OpRsh16x32_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARW) v.Type = t v.AddArg(x) @@ -23793,9 +23129,8 @@ func rewriteValue386_OpRsh16x8_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARW) v.Type = t v.AddArg(x) @@ -23820,9 +23155,8 @@ func rewriteValue386_OpRsh32Ux16_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRL, t) v0.AddArg(x) @@ -23844,9 +23178,8 @@ func rewriteValue386_OpRsh32Ux32_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRL, t) v0.AddArg(x) @@ -23907,9 +23240,8 @@ func rewriteValue386_OpRsh32Ux8_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRL, t) v0.AddArg(x) @@ -23931,9 +23263,8 @@ func rewriteValue386_OpRsh32x16_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARL) v.Type = t v.AddArg(x) @@ -23958,9 +23289,8 @@ func rewriteValue386_OpRsh32x32_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARL) v.Type = t v.AddArg(x) @@ -24026,9 +23356,8 @@ func rewriteValue386_OpRsh32x8_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARL) v.Type = t v.AddArg(x) @@ -24053,9 +23382,8 @@ func rewriteValue386_OpRsh8Ux16_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPWconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRB, t) v0.AddArg(x) @@ -24077,9 +23405,8 @@ func rewriteValue386_OpRsh8Ux32_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPLconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRB, t) v0.AddArg(x) @@ -24140,9 +23467,8 @@ func rewriteValue386_OpRsh8Ux8_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPBconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386ANDL) v0 := b.NewValue0(v.Pos, Op386SHRB, t) v0.AddArg(x) @@ -24164,9 +23490,8 @@ func rewriteValue386_OpRsh8x16_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARB) v.Type = t v.AddArg(x) @@ -24191,9 +23516,8 @@ func rewriteValue386_OpRsh8x32_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARB) v.Type = t v.AddArg(x) @@ -24259,9 +23583,8 @@ func rewriteValue386_OpRsh8x8_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SARB) v.Type = t v.AddArg(x) @@ -24290,9 +23613,8 @@ func rewriteValue386_OpSelect0_0(v *Value) bool { if v_0.Op != OpMul32uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSelect0) v.Type = typ.UInt32 v0 := b.NewValue0(v.Pos, Op386MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) @@ -24314,9 +23636,8 @@ func rewriteValue386_OpSelect1_0(v *Value) bool { if v_0.Op != OpMul32uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(Op386SETO) v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) v1 := b.NewValue0(v.Pos, Op386MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) @@ -24421,10 +23742,9 @@ func rewriteValue386_OpStore_0(v *Value) bool { // result: (MOVSDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -24439,10 +23759,9 @@ func rewriteValue386_OpStore_0(v *Value) bool { // result: (MOVSSstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -24457,10 +23776,9 @@ func rewriteValue386_OpStore_0(v *Value) bool { // result: (MOVLstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4) { break } @@ -24475,10 +23793,9 @@ func rewriteValue386_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -24493,10 +23810,9 @@ func rewriteValue386_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -24513,9 +23829,8 @@ func rewriteValue386_OpSub16_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBL) v.AddArg(x) v.AddArg(y) @@ -24527,9 +23842,8 @@ func rewriteValue386_OpSub32_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBL) v.AddArg(x) v.AddArg(y) @@ -24541,9 +23855,8 @@ func rewriteValue386_OpSub32F_0(v *Value) bool { // cond: // result: (SUBSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBSS) v.AddArg(x) v.AddArg(y) @@ -24555,9 +23868,8 @@ func rewriteValue386_OpSub32carry_0(v *Value) bool { // cond: // result: (SUBLcarry x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBLcarry) v.AddArg(x) v.AddArg(y) @@ -24569,10 +23881,9 @@ func rewriteValue386_OpSub32withcarry_0(v *Value) bool { // cond: // result: (SBBL x y c) for { - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(Op386SBBL) v.AddArg(x) v.AddArg(y) @@ -24585,9 +23896,8 @@ func rewriteValue386_OpSub64F_0(v *Value) bool { // cond: // result: (SUBSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBSD) v.AddArg(x) v.AddArg(y) @@ -24599,9 +23909,8 @@ func rewriteValue386_OpSub8_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBL) v.AddArg(x) v.AddArg(y) @@ -24613,9 +23922,8 @@ func rewriteValue386_OpSubPtr_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386SUBL) v.AddArg(x) v.AddArg(y) @@ -24664,10 +23972,9 @@ func rewriteValue386_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(Op386LoweredWB) v.Aux = fn v.AddArg(destptr) @@ -24681,9 +23988,8 @@ func rewriteValue386_OpXor16_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386XORL) v.AddArg(x) v.AddArg(y) @@ -24695,9 +24001,8 @@ func rewriteValue386_OpXor32_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386XORL) v.AddArg(x) v.AddArg(y) @@ -24709,9 +24014,8 @@ func rewriteValue386_OpXor8_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(Op386XORL) v.AddArg(x) v.AddArg(y) @@ -24728,7 +24032,6 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -24742,9 +24045,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVBstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -24758,9 +24060,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVWstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -24774,9 +24075,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVLstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -24790,9 +24090,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVBstoreconst) v.AuxInt = makeValAndOff(0, 2) v.AddArg(destptr) @@ -24810,9 +24109,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVBstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -24830,9 +24128,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVWstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -24850,9 +24147,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVLstoreconst) v.AuxInt = makeValAndOff(0, 3) v.AddArg(destptr) @@ -24868,9 +24164,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { // result: (Zero [s-s%4] (ADDLconst destptr [s%4]) (MOVLstoreconst [0] destptr mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%4 != 0 && s > 4) { break } @@ -24894,9 +24189,8 @@ func rewriteValue386_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVLstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -24920,9 +24214,8 @@ func rewriteValue386_OpZero_10(v *Value) bool { if v.AuxInt != 12 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVLstoreconst) v.AuxInt = makeValAndOff(0, 8) v.AddArg(destptr) @@ -24944,9 +24237,8 @@ func rewriteValue386_OpZero_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(Op386MOVLstoreconst) v.AuxInt = makeValAndOff(0, 12) v.AddArg(destptr) @@ -24970,9 +24262,8 @@ func rewriteValue386_OpZero_10(v *Value) bool { // result: (DUFFZERO [1*(128-s/4)] destptr (MOVLconst [0]) mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s > 16 && s <= 4*128 && s%4 == 0 && !config.noDuffDevice) { break } @@ -24990,9 +24281,8 @@ func rewriteValue386_OpZero_10(v *Value) bool { // result: (REPSTOSL destptr (MOVLconst [s/4]) (MOVLconst [0]) mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !((s > 4*128 || (config.noDuffDevice && s > 16)) && s%4 == 0) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 0b87c2f382..926c4a599c 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -1161,14 +1161,13 @@ func rewriteValueAMD64_OpAMD64ADCQ_0(v *Value) bool { // cond: is32Bit(c) // result: (ADCQconst x [c] carry) for { - _ = v.Args[2] + carry := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - carry := v.Args[2] if !(is32Bit(c)) { break } @@ -1182,14 +1181,13 @@ func rewriteValueAMD64_OpAMD64ADCQ_0(v *Value) bool { // cond: is32Bit(c) // result: (ADCQconst x [c] carry) for { - _ = v.Args[2] + carry := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt x := v.Args[1] - carry := v.Args[2] if !(is32Bit(c)) { break } @@ -1257,13 +1255,12 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { // cond: // result: (ADDLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64ADDLconst) v.AuxInt = c v.AddArg(x) @@ -1458,7 +1455,7 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { // cond: // result: (LEAL8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -1467,7 +1464,6 @@ func rewriteValueAMD64_OpAMD64ADDL_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL8) v.AddArg(x) v.AddArg(y) @@ -1499,7 +1495,7 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // cond: // result: (LEAL4 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -1508,7 +1504,6 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL4) v.AddArg(x) v.AddArg(y) @@ -1537,7 +1532,7 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // cond: // result: (LEAL2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -1546,7 +1541,6 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL2) v.AddArg(x) v.AddArg(y) @@ -1562,9 +1556,8 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { if v_1.Op != OpAMD64ADDL { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if y != v_1.Args[1] { + y := v_1.Args[1] + if y != v_1.Args[0] { break } v.reset(OpAMD64LEAL2) @@ -1576,17 +1569,15 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // cond: // result: (LEAL2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDL { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if y != v_0.Args[1] { + y := v_0.Args[1] + if y != v_0.Args[0] { break } - x := v.Args[1] v.reset(OpAMD64LEAL2) v.AddArg(x) v.AddArg(y) @@ -1602,11 +1593,10 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { if v_1.Op != OpAMD64ADDL { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAMD64LEAL2) v.AddArg(y) v.AddArg(x) @@ -1636,15 +1626,13 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // cond: // result: (LEAL2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAMD64LEAL2) @@ -1656,15 +1644,14 @@ func rewriteValueAMD64_OpAMD64ADDL_10(v *Value) bool { // cond: // result: (LEAL2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDL { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAMD64LEAL2) @@ -1679,14 +1666,13 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { // cond: // result: (LEAL1 [c] x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } c := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] v.reset(OpAMD64LEAL1) v.AuxInt = c v.AddArg(x) @@ -1738,7 +1724,7 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAL1 [c] {s} x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -1746,7 +1732,6 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { c := v_0.AuxInt s := v_0.Aux y := v_0.Args[0] - x := v.Args[1] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -1777,13 +1762,12 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64NEGL { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64SUBL) v.AddArg(x) v.AddArg(y) @@ -1801,9 +1785,8 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1819,17 +1802,15 @@ func rewriteValueAMD64_OpAMD64ADDL_20(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -1853,9 +1834,8 @@ func rewriteValueAMD64_OpAMD64ADDLconst_0(v *Value) bool { if v_0.Op != OpAMD64ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64LEAL1) v.AuxInt = c v.AddArg(x) @@ -1913,9 +1893,8 @@ func rewriteValueAMD64_OpAMD64ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1937,9 +1916,8 @@ func rewriteValueAMD64_OpAMD64ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1961,9 +1939,8 @@ func rewriteValueAMD64_OpAMD64ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -1985,9 +1962,8 @@ func rewriteValueAMD64_OpAMD64ADDLconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -2068,14 +2044,13 @@ func rewriteValueAMD64_OpAMD64ADDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -2092,7 +2067,7 @@ func rewriteValueAMD64_OpAMD64ADDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -2100,7 +2075,6 @@ func rewriteValueAMD64_OpAMD64ADDLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -2122,7 +2096,7 @@ func rewriteValueAMD64_OpAMD64ADDLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -2130,7 +2104,6 @@ func rewriteValueAMD64_OpAMD64ADDLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2148,7 +2121,7 @@ func rewriteValueAMD64_OpAMD64ADDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -2157,7 +2130,6 @@ func rewriteValueAMD64_OpAMD64ADDLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -2209,7 +2181,7 @@ func rewriteValueAMD64_OpAMD64ADDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -2217,7 +2189,6 @@ func rewriteValueAMD64_OpAMD64ADDLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -2235,7 +2206,7 @@ func rewriteValueAMD64_OpAMD64ADDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -2244,7 +2215,6 @@ func rewriteValueAMD64_OpAMD64ADDLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -2282,13 +2252,12 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { // cond: is32Bit(c) // result: (ADDQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -2374,7 +2343,7 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { // cond: // result: (LEAQ8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -2383,7 +2352,6 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ8) v.AddArg(x) v.AddArg(y) @@ -2412,7 +2380,7 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { // cond: // result: (LEAQ4 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -2421,7 +2389,6 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ4) v.AddArg(x) v.AddArg(y) @@ -2450,7 +2417,7 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { // cond: // result: (LEAQ2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -2459,7 +2426,6 @@ func rewriteValueAMD64_OpAMD64ADDQ_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ2) v.AddArg(x) v.AddArg(y) @@ -2478,9 +2444,8 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { if v_1.Op != OpAMD64ADDQ { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if y != v_1.Args[1] { + y := v_1.Args[1] + if y != v_1.Args[0] { break } v.reset(OpAMD64LEAQ2) @@ -2492,17 +2457,15 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // cond: // result: (LEAQ2 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if y != v_0.Args[1] { + y := v_0.Args[1] + if y != v_0.Args[0] { break } - x := v.Args[1] v.reset(OpAMD64LEAQ2) v.AddArg(x) v.AddArg(y) @@ -2518,11 +2481,10 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { if v_1.Op != OpAMD64ADDQ { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAMD64LEAQ2) v.AddArg(y) v.AddArg(x) @@ -2552,15 +2514,13 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // cond: // result: (LEAQ2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAMD64LEAQ2) @@ -2572,15 +2532,14 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // cond: // result: (LEAQ2 y x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAMD64LEAQ2) @@ -2592,14 +2551,13 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // cond: // result: (LEAQ1 [c] x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } c := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] v.reset(OpAMD64LEAQ1) v.AuxInt = c v.AddArg(x) @@ -2651,7 +2609,7 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { // cond: x.Op != OpSB && y.Op != OpSB // result: (LEAQ1 [c] {s} x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -2659,7 +2617,6 @@ func rewriteValueAMD64_OpAMD64ADDQ_10(v *Value) bool { c := v_0.AuxInt s := v_0.Aux y := v_0.Args[0] - x := v.Args[1] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -2693,13 +2650,12 @@ func rewriteValueAMD64_OpAMD64ADDQ_20(v *Value) bool { // cond: // result: (SUBQ x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64NEGQ { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64SUBQ) v.AddArg(x) v.AddArg(y) @@ -2717,9 +2673,8 @@ func rewriteValueAMD64_OpAMD64ADDQ_20(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2735,17 +2690,15 @@ func rewriteValueAMD64_OpAMD64ADDQ_20(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDQload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -2783,13 +2736,12 @@ func rewriteValueAMD64_OpAMD64ADDQcarry_0(v *Value) bool { // cond: is32Bit(c) // result: (ADDQconstcarry x [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -2810,9 +2762,8 @@ func rewriteValueAMD64_OpAMD64ADDQconst_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64LEAQ1) v.AuxInt = c v.AddArg(x) @@ -2870,9 +2821,8 @@ func rewriteValueAMD64_OpAMD64ADDQconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -2894,9 +2844,8 @@ func rewriteValueAMD64_OpAMD64ADDQconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -2918,9 +2867,8 @@ func rewriteValueAMD64_OpAMD64ADDQconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -2942,9 +2890,8 @@ func rewriteValueAMD64_OpAMD64ADDQconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(c + d)) { break } @@ -3027,14 +2974,13 @@ func rewriteValueAMD64_OpAMD64ADDQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -3051,7 +2997,7 @@ func rewriteValueAMD64_OpAMD64ADDQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -3059,7 +3005,6 @@ func rewriteValueAMD64_OpAMD64ADDQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -3081,7 +3026,7 @@ func rewriteValueAMD64_OpAMD64ADDQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -3089,7 +3034,6 @@ func rewriteValueAMD64_OpAMD64ADDQload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3107,7 +3051,7 @@ func rewriteValueAMD64_OpAMD64ADDQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -3116,7 +3060,6 @@ func rewriteValueAMD64_OpAMD64ADDQload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -3168,7 +3111,7 @@ func rewriteValueAMD64_OpAMD64ADDQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -3176,7 +3119,6 @@ func rewriteValueAMD64_OpAMD64ADDQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3194,7 +3136,7 @@ func rewriteValueAMD64_OpAMD64ADDQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -3203,7 +3145,6 @@ func rewriteValueAMD64_OpAMD64ADDQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -3230,9 +3171,8 @@ func rewriteValueAMD64_OpAMD64ADDSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3248,17 +3188,15 @@ func rewriteValueAMD64_OpAMD64ADDSD_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDSDload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVSDload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3281,7 +3219,7 @@ func rewriteValueAMD64_OpAMD64ADDSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -3289,7 +3227,6 @@ func rewriteValueAMD64_OpAMD64ADDSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3307,7 +3244,7 @@ func rewriteValueAMD64_OpAMD64ADDSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -3316,7 +3253,6 @@ func rewriteValueAMD64_OpAMD64ADDSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -3374,9 +3310,8 @@ func rewriteValueAMD64_OpAMD64ADDSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3392,17 +3327,15 @@ func rewriteValueAMD64_OpAMD64ADDSS_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ADDSSload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVSSload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3425,7 +3358,7 @@ func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -3433,7 +3366,6 @@ func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3451,7 +3383,7 @@ func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -3460,7 +3392,6 @@ func rewriteValueAMD64_OpAMD64ADDSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -3512,7 +3443,7 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // cond: !config.nacl // result: (BTRL x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64NOTL { break @@ -3521,7 +3452,7 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { if v_0_0.Op != OpAMD64SHLL { break } - _ = v_0_0.Args[1] + y := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVLconst { break @@ -3529,8 +3460,6 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - y := v_0_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -3553,7 +3482,7 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { if v_1_0.Op != OpAMD64SHLL { break } - _ = v_1_0.Args[1] + y := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVLconst { break @@ -3561,7 +3490,6 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - y := v_1_0.Args[1] if !(!config.nacl) { break } @@ -3574,13 +3502,12 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // cond: isUint32PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl // result: (BTRLconst [log2uint32(^c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint32PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl) { break } @@ -3628,13 +3555,12 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // cond: // result: (ANDLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64ANDLconst) v.AuxInt = c v.AddArg(x) @@ -3644,9 +3570,8 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -3666,9 +3591,8 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3684,17 +3608,15 @@ func rewriteValueAMD64_OpAMD64ANDL_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ANDLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -3830,14 +3752,13 @@ func rewriteValueAMD64_OpAMD64ANDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -3854,7 +3775,7 @@ func rewriteValueAMD64_OpAMD64ANDLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -3862,7 +3783,6 @@ func rewriteValueAMD64_OpAMD64ANDLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -3884,7 +3804,7 @@ func rewriteValueAMD64_OpAMD64ANDLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -3892,7 +3812,6 @@ func rewriteValueAMD64_OpAMD64ANDLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3910,7 +3829,7 @@ func rewriteValueAMD64_OpAMD64ANDLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -3919,7 +3838,6 @@ func rewriteValueAMD64_OpAMD64ANDLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -3971,7 +3889,7 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -3979,7 +3897,6 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3997,7 +3914,7 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4006,7 +3923,6 @@ func rewriteValueAMD64_OpAMD64ANDLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4027,7 +3943,7 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // cond: !config.nacl // result: (BTRQ x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64NOTQ { break @@ -4036,7 +3952,7 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { if v_0_0.Op != OpAMD64SHLQ { break } - _ = v_0_0.Args[1] + y := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVQconst { break @@ -4044,8 +3960,6 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - y := v_0_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -4068,7 +3982,7 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { if v_1_0.Op != OpAMD64SHLQ { break } - _ = v_1_0.Args[1] + y := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVQconst { break @@ -4076,7 +3990,6 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - y := v_1_0.Args[1] if !(!config.nacl) { break } @@ -4089,13 +4002,12 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // cond: isUint64PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl // result: (BTRQconst [log2(^c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint64PowerOfTwo(^c) && uint64(^c) >= 128 && !config.nacl) { break } @@ -4146,13 +4058,12 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // cond: is32Bit(c) // result: (ANDQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -4165,9 +4076,8 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -4187,9 +4097,8 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -4205,17 +4114,15 @@ func rewriteValueAMD64_OpAMD64ANDQ_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ANDQload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -4361,14 +4268,13 @@ func rewriteValueAMD64_OpAMD64ANDQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -4385,7 +4291,7 @@ func rewriteValueAMD64_OpAMD64ANDQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4393,7 +4299,6 @@ func rewriteValueAMD64_OpAMD64ANDQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -4415,7 +4320,7 @@ func rewriteValueAMD64_OpAMD64ANDQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -4423,7 +4328,6 @@ func rewriteValueAMD64_OpAMD64ANDQload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4441,7 +4345,7 @@ func rewriteValueAMD64_OpAMD64ANDQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -4450,7 +4354,6 @@ func rewriteValueAMD64_OpAMD64ANDQload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4502,7 +4405,7 @@ func rewriteValueAMD64_OpAMD64ANDQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -4510,7 +4413,6 @@ func rewriteValueAMD64_OpAMD64ANDQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4528,7 +4430,7 @@ func rewriteValueAMD64_OpAMD64ANDQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4537,7 +4439,6 @@ func rewriteValueAMD64_OpAMD64ANDQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4659,14 +4560,13 @@ func rewriteValueAMD64_OpAMD64BTCLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -4683,7 +4583,7 @@ func rewriteValueAMD64_OpAMD64BTCLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4691,7 +4591,6 @@ func rewriteValueAMD64_OpAMD64BTCLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -4711,7 +4610,7 @@ func rewriteValueAMD64_OpAMD64BTCLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -4719,7 +4618,6 @@ func rewriteValueAMD64_OpAMD64BTCLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4737,7 +4635,7 @@ func rewriteValueAMD64_OpAMD64BTCLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4746,7 +4644,6 @@ func rewriteValueAMD64_OpAMD64BTCLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4816,14 +4713,13 @@ func rewriteValueAMD64_OpAMD64BTCQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -4840,7 +4736,7 @@ func rewriteValueAMD64_OpAMD64BTCQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4848,7 +4744,6 @@ func rewriteValueAMD64_OpAMD64BTCQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -4868,7 +4763,7 @@ func rewriteValueAMD64_OpAMD64BTCQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -4876,7 +4771,6 @@ func rewriteValueAMD64_OpAMD64BTCQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4894,7 +4788,7 @@ func rewriteValueAMD64_OpAMD64BTCQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -4903,7 +4797,6 @@ func rewriteValueAMD64_OpAMD64BTCQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -4967,9 +4860,8 @@ func rewriteValueAMD64_OpAMD64BTLconst_0(v *Value) bool { if s.Op != OpAMD64SHRQ { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v.reset(OpAMD64BTQ) v.AddArg(y) v.AddArg(x) @@ -5024,9 +4916,8 @@ func rewriteValueAMD64_OpAMD64BTLconst_0(v *Value) bool { if s.Op != OpAMD64SHRL { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v.reset(OpAMD64BTL) v.AddArg(y) v.AddArg(x) @@ -5084,9 +4975,8 @@ func rewriteValueAMD64_OpAMD64BTQconst_0(v *Value) bool { if s.Op != OpAMD64SHRQ { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v.reset(OpAMD64BTQ) v.AddArg(y) v.AddArg(x) @@ -5186,14 +5076,13 @@ func rewriteValueAMD64_OpAMD64BTRLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -5210,7 +5099,7 @@ func rewriteValueAMD64_OpAMD64BTRLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5218,7 +5107,6 @@ func rewriteValueAMD64_OpAMD64BTRLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -5238,7 +5126,7 @@ func rewriteValueAMD64_OpAMD64BTRLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -5246,7 +5134,6 @@ func rewriteValueAMD64_OpAMD64BTRLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5264,7 +5151,7 @@ func rewriteValueAMD64_OpAMD64BTRLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5273,7 +5160,6 @@ func rewriteValueAMD64_OpAMD64BTRLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -5379,14 +5265,13 @@ func rewriteValueAMD64_OpAMD64BTRQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -5403,7 +5288,7 @@ func rewriteValueAMD64_OpAMD64BTRQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5411,7 +5296,6 @@ func rewriteValueAMD64_OpAMD64BTRQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -5431,7 +5315,7 @@ func rewriteValueAMD64_OpAMD64BTRQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -5439,7 +5323,6 @@ func rewriteValueAMD64_OpAMD64BTRQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5457,7 +5340,7 @@ func rewriteValueAMD64_OpAMD64BTRQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5466,7 +5349,6 @@ func rewriteValueAMD64_OpAMD64BTRQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -5572,14 +5454,13 @@ func rewriteValueAMD64_OpAMD64BTSLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -5596,7 +5477,7 @@ func rewriteValueAMD64_OpAMD64BTSLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5604,7 +5485,6 @@ func rewriteValueAMD64_OpAMD64BTSLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -5624,7 +5504,7 @@ func rewriteValueAMD64_OpAMD64BTSLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -5632,7 +5512,6 @@ func rewriteValueAMD64_OpAMD64BTSLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5650,7 +5529,7 @@ func rewriteValueAMD64_OpAMD64BTSLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5659,7 +5538,6 @@ func rewriteValueAMD64_OpAMD64BTSLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -5765,14 +5643,13 @@ func rewriteValueAMD64_OpAMD64BTSQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -5789,7 +5666,7 @@ func rewriteValueAMD64_OpAMD64BTSQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5797,7 +5674,6 @@ func rewriteValueAMD64_OpAMD64BTSQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -5817,7 +5693,7 @@ func rewriteValueAMD64_OpAMD64BTSQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -5825,7 +5701,6 @@ func rewriteValueAMD64_OpAMD64BTSQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5843,7 +5718,7 @@ func rewriteValueAMD64_OpAMD64BTSQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -5852,7 +5727,6 @@ func rewriteValueAMD64_OpAMD64BTSQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -8795,13 +8669,12 @@ func rewriteValueAMD64_OpAMD64CMPB_0(v *Value) bool { // cond: // result: (InvertFlags (CMPBconst x [int64(int8(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPBconst, types.TypeFlags) v0.AuxInt = int64(int8(c)) @@ -8813,17 +8686,15 @@ func rewriteValueAMD64_OpAMD64CMPB_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPBload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVBload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -8847,9 +8718,8 @@ func rewriteValueAMD64_OpAMD64CMPB_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -8974,9 +8844,8 @@ func rewriteValueAMD64_OpAMD64CMPBconst_0(v *Value) bool { if v_0.Op != OpAMD64ANDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64TESTB) v.AddArg(x) v.AddArg(y) @@ -9024,9 +8893,8 @@ func rewriteValueAMD64_OpAMD64CMPBconst_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -9049,14 +8917,13 @@ func rewriteValueAMD64_OpAMD64CMPBconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -9073,7 +8940,7 @@ func rewriteValueAMD64_OpAMD64CMPBconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -9081,7 +8948,6 @@ func rewriteValueAMD64_OpAMD64CMPBconstload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -9101,7 +8967,7 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -9109,7 +8975,6 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -9127,7 +8992,7 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -9136,7 +9001,6 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9154,14 +9018,13 @@ func rewriteValueAMD64_OpAMD64CMPBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(int64(int8(c)), off)) { break } @@ -9196,13 +9059,12 @@ func rewriteValueAMD64_OpAMD64CMPL_0(v *Value) bool { // cond: // result: (InvertFlags (CMPLconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPLconst, types.TypeFlags) v0.AuxInt = c @@ -9214,17 +9076,15 @@ func rewriteValueAMD64_OpAMD64CMPL_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPLload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -9248,9 +9108,8 @@ func rewriteValueAMD64_OpAMD64CMPL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -9390,9 +9249,8 @@ func rewriteValueAMD64_OpAMD64CMPLconst_0(v *Value) bool { if v_0.Op != OpAMD64ANDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64TESTL) v.AddArg(x) v.AddArg(y) @@ -9444,9 +9302,8 @@ func rewriteValueAMD64_OpAMD64CMPLconst_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -9469,14 +9326,13 @@ func rewriteValueAMD64_OpAMD64CMPLconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -9493,7 +9349,7 @@ func rewriteValueAMD64_OpAMD64CMPLconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -9501,7 +9357,6 @@ func rewriteValueAMD64_OpAMD64CMPLconstload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -9521,7 +9376,7 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -9529,7 +9384,6 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -9547,7 +9401,7 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -9556,7 +9410,6 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9574,14 +9427,13 @@ func rewriteValueAMD64_OpAMD64CMPLload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(c, off)) { break } @@ -9619,13 +9471,12 @@ func rewriteValueAMD64_OpAMD64CMPQ_0(v *Value) bool { // cond: is32Bit(c) // result: (InvertFlags (CMPQconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -9640,17 +9491,15 @@ func rewriteValueAMD64_OpAMD64CMPQ_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPQload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -9674,9 +9523,8 @@ func rewriteValueAMD64_OpAMD64CMPQ_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -9937,9 +9785,8 @@ func rewriteValueAMD64_OpAMD64CMPQconst_10(v *Value) bool { if v_0.Op != OpAMD64ANDQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64TESTQ) v.AddArg(x) v.AddArg(y) @@ -9987,9 +9834,8 @@ func rewriteValueAMD64_OpAMD64CMPQconst_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -10012,14 +9858,13 @@ func rewriteValueAMD64_OpAMD64CMPQconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -10036,7 +9881,7 @@ func rewriteValueAMD64_OpAMD64CMPQconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -10044,7 +9889,6 @@ func rewriteValueAMD64_OpAMD64CMPQconstload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -10064,7 +9908,7 @@ func rewriteValueAMD64_OpAMD64CMPQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -10072,7 +9916,6 @@ func rewriteValueAMD64_OpAMD64CMPQload_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -10090,7 +9933,7 @@ func rewriteValueAMD64_OpAMD64CMPQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -10099,7 +9942,6 @@ func rewriteValueAMD64_OpAMD64CMPQload_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10117,14 +9959,13 @@ func rewriteValueAMD64_OpAMD64CMPQload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(c, off)) { break } @@ -10159,13 +10000,12 @@ func rewriteValueAMD64_OpAMD64CMPW_0(v *Value) bool { // cond: // result: (InvertFlags (CMPWconst x [int64(int16(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64InvertFlags) v0 := b.NewValue0(v.Pos, OpAMD64CMPWconst, types.TypeFlags) v0.AuxInt = int64(int16(c)) @@ -10177,17 +10017,15 @@ func rewriteValueAMD64_OpAMD64CMPW_0(v *Value) bool { // cond: canMergeLoad(v, l) && clobber(l) // result: (CMPWload {sym} [off] ptr x mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVWload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -10211,9 +10049,8 @@ func rewriteValueAMD64_OpAMD64CMPW_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoad(v, l) && clobber(l)) { break } @@ -10338,9 +10175,8 @@ func rewriteValueAMD64_OpAMD64CMPWconst_0(v *Value) bool { if v_0.Op != OpAMD64ANDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64TESTW) v.AddArg(x) v.AddArg(y) @@ -10388,9 +10224,8 @@ func rewriteValueAMD64_OpAMD64CMPWconst_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l.Uses == 1 && validValAndOff(c, off) && clobber(l)) { break } @@ -10413,14 +10248,13 @@ func rewriteValueAMD64_OpAMD64CMPWconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -10437,7 +10271,7 @@ func rewriteValueAMD64_OpAMD64CMPWconstload_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -10445,7 +10279,6 @@ func rewriteValueAMD64_OpAMD64CMPWconstload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -10465,7 +10298,7 @@ func rewriteValueAMD64_OpAMD64CMPWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -10473,7 +10306,6 @@ func rewriteValueAMD64_OpAMD64CMPWload_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -10491,7 +10323,7 @@ func rewriteValueAMD64_OpAMD64CMPWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -10500,7 +10332,6 @@ func rewriteValueAMD64_OpAMD64CMPWload_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10518,14 +10349,13 @@ func rewriteValueAMD64_OpAMD64CMPWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(int64(int16(c)), off)) { break } @@ -10545,7 +10375,7 @@ func rewriteValueAMD64_OpAMD64CMPXCHGLlock_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -10554,7 +10384,6 @@ func rewriteValueAMD64_OpAMD64CMPXCHGLlock_0(v *Value) bool { ptr := v_0.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -10576,7 +10405,7 @@ func rewriteValueAMD64_OpAMD64CMPXCHGQlock_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -10585,7 +10414,6 @@ func rewriteValueAMD64_OpAMD64CMPXCHGQlock_0(v *Value) bool { ptr := v_0.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1 + off2)) { break } @@ -10613,9 +10441,8 @@ func rewriteValueAMD64_OpAMD64DIVSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -10636,7 +10463,7 @@ func rewriteValueAMD64_OpAMD64DIVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -10644,7 +10471,6 @@ func rewriteValueAMD64_OpAMD64DIVSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -10662,7 +10488,7 @@ func rewriteValueAMD64_OpAMD64DIVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -10671,7 +10497,6 @@ func rewriteValueAMD64_OpAMD64DIVSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10698,9 +10523,8 @@ func rewriteValueAMD64_OpAMD64DIVSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -10721,7 +10545,7 @@ func rewriteValueAMD64_OpAMD64DIVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -10729,7 +10553,6 @@ func rewriteValueAMD64_OpAMD64DIVSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -10747,7 +10570,7 @@ func rewriteValueAMD64_OpAMD64DIVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -10756,7 +10579,6 @@ func rewriteValueAMD64_OpAMD64DIVSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10775,9 +10597,8 @@ func rewriteValueAMD64_OpAMD64HMULL_0(v *Value) bool { // cond: !x.rematerializeable() && y.rematerializeable() // result: (HMULL y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!x.rematerializeable() && y.rematerializeable()) { break } @@ -10793,9 +10614,8 @@ func rewriteValueAMD64_OpAMD64HMULLU_0(v *Value) bool { // cond: !x.rematerializeable() && y.rematerializeable() // result: (HMULLU y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!x.rematerializeable() && y.rematerializeable()) { break } @@ -10811,9 +10631,8 @@ func rewriteValueAMD64_OpAMD64HMULQ_0(v *Value) bool { // cond: !x.rematerializeable() && y.rematerializeable() // result: (HMULQ y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!x.rematerializeable() && y.rematerializeable()) { break } @@ -10829,9 +10648,8 @@ func rewriteValueAMD64_OpAMD64HMULQU_0(v *Value) bool { // cond: !x.rematerializeable() && y.rematerializeable() // result: (HMULQU y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!x.rematerializeable() && y.rematerializeable()) { break } @@ -10874,9 +10692,8 @@ func rewriteValueAMD64_OpAMD64LEAL_0(v *Value) bool { if v_0.Op != OpAMD64ADDL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -10896,14 +10713,13 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -10967,7 +10783,7 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -10976,7 +10792,6 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL2) v.AuxInt = c v.Aux = s @@ -11013,7 +10828,7 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -11022,7 +10837,6 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL4) v.AuxInt = c v.Aux = s @@ -11059,7 +10873,7 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLLconst { break @@ -11068,7 +10882,6 @@ func rewriteValueAMD64_OpAMD64LEAL1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAL8) v.AuxInt = c v.Aux = s @@ -11085,14 +10898,13 @@ func rewriteValueAMD64_OpAMD64LEAL2_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11182,14 +10994,13 @@ func rewriteValueAMD64_OpAMD64LEAL4_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11256,14 +11067,13 @@ func rewriteValueAMD64_OpAMD64LEAL8_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11332,9 +11142,8 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(x.Op != OpSB && y.Op != OpSB) { break } @@ -11379,9 +11188,8 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11404,9 +11212,8 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11429,9 +11236,8 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11454,9 +11260,8 @@ func rewriteValueAMD64_OpAMD64LEAQ_0(v *Value) bool { } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11476,14 +11281,13 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11547,7 +11351,7 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -11556,7 +11360,6 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ2) v.AuxInt = c v.Aux = s @@ -11593,7 +11396,7 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -11602,7 +11405,6 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ4) v.AuxInt = c v.Aux = s @@ -11639,7 +11441,7 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -11648,7 +11450,6 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpAMD64LEAQ8) v.AuxInt = c v.Aux = s @@ -11662,7 +11463,7 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -11670,7 +11471,6 @@ func rewriteValueAMD64_OpAMD64LEAQ1_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -11715,14 +11515,13 @@ func rewriteValueAMD64_OpAMD64LEAQ2_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11809,7 +11608,7 @@ func rewriteValueAMD64_OpAMD64LEAQ2_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -11817,7 +11616,6 @@ func rewriteValueAMD64_OpAMD64LEAQ2_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -11837,14 +11635,13 @@ func rewriteValueAMD64_OpAMD64LEAQ4_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11908,7 +11705,7 @@ func rewriteValueAMD64_OpAMD64LEAQ4_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -11916,7 +11713,6 @@ func rewriteValueAMD64_OpAMD64LEAQ4_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -11936,14 +11732,13 @@ func rewriteValueAMD64_OpAMD64LEAQ8_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(c+d) && x.Op != OpSB) { break } @@ -11984,7 +11779,7 @@ func rewriteValueAMD64_OpAMD64LEAQ8_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -11992,7 +11787,6 @@ func rewriteValueAMD64_OpAMD64LEAQ8_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -12017,9 +11811,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12043,9 +11836,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12069,9 +11861,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12095,9 +11886,8 @@ func rewriteValueAMD64_OpAMD64MOVBQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12175,7 +11965,7 @@ func rewriteValueAMD64_OpAMD64MOVBQSXload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -12183,7 +11973,6 @@ func rewriteValueAMD64_OpAMD64MOVBQSXload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -12208,9 +11997,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12234,9 +12022,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12260,9 +12047,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12286,9 +12072,8 @@ func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12325,10 +12110,9 @@ func rewriteValueAMD64_OpAMD64MOVBQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -12404,14 +12188,13 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -12428,7 +12211,7 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -12436,7 +12219,6 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -12453,17 +12235,15 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -12481,15 +12261,13 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -12507,7 +12285,7 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -12515,7 +12293,6 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -12532,14 +12309,13 @@ func rewriteValueAMD64_OpAMD64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -12577,7 +12353,7 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -12585,7 +12361,6 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -12603,7 +12378,7 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -12611,7 +12386,6 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -12629,7 +12403,7 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -12637,7 +12411,6 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -12655,7 +12428,7 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -12663,7 +12436,6 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -12681,14 +12453,13 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -12705,14 +12476,13 @@ func rewriteValueAMD64_OpAMD64MOVBloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt p := v.Args[1] - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -12732,14 +12502,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETL { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12757,14 +12526,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETLE { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12782,14 +12550,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETG { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12807,14 +12574,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETGE { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12832,14 +12598,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETEQ { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12857,14 +12622,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETNE { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12882,14 +12646,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETB { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12907,14 +12670,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETBE { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12932,14 +12694,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETA { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12957,14 +12718,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SETAE { break } x := y.Args[0] - mem := v.Args[2] if !(y.Uses == 1) { break } @@ -12986,14 +12746,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVBQSX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -13008,14 +12767,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVBQZX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -13030,7 +12788,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -13038,7 +12796,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -13056,14 +12813,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -13080,14 +12836,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -13104,7 +12859,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -13113,7 +12868,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -13131,18 +12885,16 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -13161,16 +12913,14 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -13202,7 +12952,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -13216,7 +12966,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(x0.Uses == 1 && clobber(x0)) { break } @@ -13298,7 +13047,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -13312,7 +13061,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_10(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -13494,7 +13242,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -13508,7 +13256,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } @@ -13548,14 +13295,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13593,14 +13339,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13638,14 +13383,13 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13676,7 +13420,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -13690,7 +13434,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13721,7 +13464,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -13735,7 +13478,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13766,7 +13508,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -13780,7 +13522,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13816,7 +13557,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -13830,7 +13571,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13866,7 +13606,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -13880,7 +13620,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -13906,9 +13645,8 @@ func rewriteValueAMD64_OpAMD64MOVBstore_20(v *Value) bool { } j := x1.AuxInt s2 := x1.Aux - _ = x1.Args[1] - p2 := x1.Args[0] mem := x1.Args[1] + p2 := x1.Args[0] mem2 := v.Args[2] if mem2.Op != OpAMD64MOVBstore { break @@ -13968,7 +13706,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -13977,7 +13715,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -13995,7 +13732,7 @@ func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break @@ -14003,7 +13740,6 @@ func rewriteValueAMD64_OpAMD64MOVBstore_30(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -14024,14 +13760,13 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -14048,7 +13783,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -14056,7 +13791,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -14073,17 +13807,15 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -14101,15 +13833,13 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(OpAMD64MOVBstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -14134,11 +13864,10 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -14165,11 +13894,10 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -14186,7 +13914,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -14194,7 +13922,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -14211,14 +13938,13 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -14238,7 +13964,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -14246,7 +13972,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -14264,7 +13989,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -14272,7 +13997,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -14301,14 +14025,13 @@ func rewriteValueAMD64_OpAMD64MOVBstoreconstidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -14330,7 +14053,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -14339,7 +14062,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -14358,7 +14080,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -14367,7 +14089,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -14400,7 +14121,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[3] + mem := x0.Args[3] if p != x0.Args[0] { break } @@ -14417,7 +14138,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x0_2.Args[0] { break } - mem := x0.Args[3] if !(x0.Uses == 1 && clobber(x0)) { break } @@ -14507,7 +14227,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[3] + mem := x0.Args[3] if p != x0.Args[0] { break } @@ -14524,7 +14244,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x0_2.Args[0] { break } - mem := x0.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -14721,7 +14440,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[3] + mem := x0.Args[3] if p != x0.Args[0] { break } @@ -14738,7 +14457,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x0_2.Args[0] { break } - mem := x0.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } @@ -14780,7 +14498,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14790,7 +14508,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14830,7 +14547,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14840,7 +14557,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14880,7 +14596,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14890,7 +14606,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14928,7 +14643,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14945,7 +14660,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14983,7 +14697,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -15000,7 +14714,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -15022,7 +14735,7 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_10(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -15030,7 +14743,6 @@ func rewriteValueAMD64_OpAMD64MOVBstoreidx1_10(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -15056,9 +14768,8 @@ func rewriteValueAMD64_OpAMD64MOVLQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15082,9 +14793,8 @@ func rewriteValueAMD64_OpAMD64MOVLQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15188,7 +14898,7 @@ func rewriteValueAMD64_OpAMD64MOVLQSXload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -15196,7 +14906,6 @@ func rewriteValueAMD64_OpAMD64MOVLQSXload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15221,9 +14930,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15247,9 +14955,8 @@ func rewriteValueAMD64_OpAMD64MOVLQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15286,10 +14993,9 @@ func rewriteValueAMD64_OpAMD64MOVLQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15314,10 +15020,9 @@ func rewriteValueAMD64_OpAMD64MOVLQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15395,14 +15100,13 @@ func rewriteValueAMD64_OpAMD64MOVLatomicload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -15419,7 +15123,7 @@ func rewriteValueAMD64_OpAMD64MOVLatomicload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -15427,7 +15131,6 @@ func rewriteValueAMD64_OpAMD64MOVLatomicload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15525,14 +15228,13 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -15549,7 +15251,7 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -15557,7 +15259,6 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15574,17 +15275,15 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15602,17 +15301,15 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15630,17 +15327,15 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -15658,15 +15353,13 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -15684,7 +15377,7 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -15692,7 +15385,6 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -15709,14 +15401,13 @@ func rewriteValueAMD64_OpAMD64MOVLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -15786,7 +15477,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -15796,7 +15487,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLloadidx4) v.AuxInt = c v.Aux = sym @@ -15811,7 +15501,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -15821,7 +15511,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVLloadidx4) v.AuxInt = c v.Aux = sym @@ -15836,7 +15525,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -15846,7 +15535,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLloadidx8) v.AuxInt = c v.Aux = sym @@ -15861,7 +15549,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -15871,7 +15559,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVLloadidx8) v.AuxInt = c v.Aux = sym @@ -15886,7 +15573,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -15894,7 +15581,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -15912,7 +15598,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -15920,7 +15606,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -15938,7 +15623,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -15946,7 +15631,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -15964,7 +15648,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -15972,7 +15656,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -15990,14 +15673,13 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -16014,14 +15696,13 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt p := v.Args[1] - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -16041,7 +15722,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -16049,7 +15730,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -16067,7 +15747,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -16075,7 +15755,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 4*d)) { break } @@ -16093,14 +15772,13 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx4_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 4*c)) { break } @@ -16120,7 +15798,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -16128,7 +15806,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx8_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -16146,7 +15823,7 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -16154,7 +15831,6 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx8_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 8*d)) { break } @@ -16172,14 +15848,13 @@ func rewriteValueAMD64_OpAMD64MOVLloadidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 8*c)) { break } @@ -16199,14 +15874,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLQSX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AuxInt = off v.Aux = sym @@ -16221,14 +15895,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLQZX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AuxInt = off v.Aux = sym @@ -16243,7 +15916,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -16251,7 +15924,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -16269,14 +15941,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -16293,14 +15964,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -16317,7 +15987,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -16326,7 +15996,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -16344,18 +16013,16 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -16374,18 +16041,16 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -16404,18 +16069,16 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -16434,16 +16097,14 @@ func rewriteValueAMD64_OpAMD64MOVLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -16487,14 +16148,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16530,7 +16190,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -16544,7 +16204,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16570,9 +16229,8 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { } j := x1.AuxInt s2 := x1.Aux - _ = x1.Args[1] - p2 := x1.Args[0] mem := x1.Args[1] + p2 := x1.Args[0] mem2 := v.Args[2] if mem2.Op != OpAMD64MOVLstore { break @@ -16629,7 +16287,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -16638,7 +16296,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -16656,7 +16313,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break @@ -16664,7 +16321,6 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -16682,7 +16338,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDLload { @@ -16699,8 +16355,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -16720,7 +16375,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDLload { @@ -16737,8 +16392,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -16758,7 +16412,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORLload { @@ -16775,8 +16429,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -16796,7 +16449,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORLload { @@ -16813,8 +16466,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -16834,13 +16486,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -16855,9 +16507,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -16880,7 +16530,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDL { @@ -16902,8 +16552,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -16923,13 +16572,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SUBL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -16944,9 +16593,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -16966,13 +16613,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -16987,9 +16634,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17009,7 +16654,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDL { @@ -17031,8 +16676,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17052,13 +16696,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -17073,9 +16717,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17095,7 +16737,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORL { @@ -17117,8 +16759,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17138,13 +16779,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -17159,9 +16800,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17181,7 +16820,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORL { @@ -17203,8 +16842,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17224,13 +16862,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTCL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -17245,9 +16883,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17267,13 +16903,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTRL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -17288,9 +16924,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17313,13 +16947,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTSL { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVLload { break @@ -17334,9 +16968,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -17356,7 +16988,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ADDLconst { @@ -17375,8 +17007,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17395,7 +17026,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ANDLconst { @@ -17414,8 +17045,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17434,7 +17064,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ORLconst { @@ -17453,8 +17083,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17473,7 +17102,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64XORLconst { @@ -17492,8 +17121,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17512,7 +17140,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTCLconst { @@ -17531,8 +17159,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17551,7 +17178,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTRLconst { @@ -17570,8 +17197,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17590,7 +17216,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTSLconst { @@ -17609,8 +17235,7 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -17629,14 +17254,13 @@ func rewriteValueAMD64_OpAMD64MOVLstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLf2i { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVSSstore) v.AuxInt = off v.Aux = sym @@ -17656,14 +17280,13 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -17680,7 +17303,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -17688,7 +17311,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -17705,17 +17327,15 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -17733,17 +17353,15 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ4 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -17761,15 +17379,13 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(OpAMD64MOVLstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -17794,11 +17410,10 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } @@ -17828,11 +17443,10 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } @@ -17852,7 +17466,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -17860,7 +17474,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -17877,14 +17490,13 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -17906,7 +17518,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -17916,7 +17528,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLstoreconstidx4) v.AuxInt = c v.Aux = sym @@ -17931,7 +17542,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -17939,7 +17550,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -17957,7 +17567,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -17965,7 +17575,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -17994,14 +17603,13 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } @@ -18027,7 +17635,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -18035,7 +17643,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -18053,7 +17660,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -18061,7 +17668,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(4 * c)) { break } @@ -18090,14 +17696,13 @@ func rewriteValueAMD64_OpAMD64MOVLstoreconstidx4_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } @@ -18124,7 +17729,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -18135,7 +17740,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVLstoreidx4) v.AuxInt = c v.Aux = sym @@ -18151,7 +17755,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -18162,7 +17766,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVLstoreidx8) v.AuxInt = c v.Aux = sym @@ -18178,7 +17781,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -18187,7 +17790,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -18206,7 +17808,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -18215,7 +17817,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -18255,7 +17856,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -18265,7 +17866,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -18303,7 +17903,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -18320,7 +17920,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -18339,7 +17938,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -18347,7 +17946,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx1_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -18369,7 +17967,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -18378,7 +17976,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -18397,7 +17994,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -18406,7 +18003,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 4*d)) { break } @@ -18446,7 +18042,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -18456,7 +18052,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -18497,7 +18092,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -18514,7 +18109,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -18536,7 +18130,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -18544,7 +18138,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx4_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 4*c)) { break } @@ -18565,7 +18158,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -18574,7 +18167,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -18593,7 +18185,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -18602,7 +18194,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 8*d)) { break } @@ -18621,7 +18212,7 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -18629,7 +18220,6 @@ func rewriteValueAMD64_OpAMD64MOVLstoreidx8_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 8*c)) { break } @@ -18650,14 +18240,13 @@ func rewriteValueAMD64_OpAMD64MOVOload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -18674,7 +18263,7 @@ func rewriteValueAMD64_OpAMD64MOVOload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -18682,7 +18271,6 @@ func rewriteValueAMD64_OpAMD64MOVOload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18702,7 +18290,7 @@ func rewriteValueAMD64_OpAMD64MOVOstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -18710,7 +18298,6 @@ func rewriteValueAMD64_OpAMD64MOVOstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -18728,7 +18315,7 @@ func rewriteValueAMD64_OpAMD64MOVOstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -18737,7 +18324,6 @@ func rewriteValueAMD64_OpAMD64MOVOstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18758,14 +18344,13 @@ func rewriteValueAMD64_OpAMD64MOVQatomicload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -18782,7 +18367,7 @@ func rewriteValueAMD64_OpAMD64MOVQatomicload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -18790,7 +18375,6 @@ func rewriteValueAMD64_OpAMD64MOVQatomicload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18891,14 +18475,13 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -18915,7 +18498,7 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -18923,7 +18506,6 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18940,17 +18522,15 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18968,17 +18548,15 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18996,15 +18574,13 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -19022,7 +18598,7 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -19030,7 +18606,6 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -19047,14 +18622,13 @@ func rewriteValueAMD64_OpAMD64MOVQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -19119,7 +18693,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -19129,7 +18703,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVQloadidx8) v.AuxInt = c v.Aux = sym @@ -19144,7 +18717,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -19154,7 +18727,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVQloadidx8) v.AuxInt = c v.Aux = sym @@ -19169,7 +18741,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -19177,7 +18749,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -19195,7 +18766,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -19203,7 +18774,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -19221,7 +18791,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -19229,7 +18799,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -19247,7 +18816,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -19255,7 +18824,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -19273,14 +18841,13 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -19297,14 +18864,13 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt p := v.Args[1] - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -19324,7 +18890,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -19332,7 +18898,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -19350,7 +18915,7 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -19358,7 +18923,6 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 8*d)) { break } @@ -19376,14 +18940,13 @@ func rewriteValueAMD64_OpAMD64MOVQloadidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 8*c)) { break } @@ -19403,7 +18966,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -19411,7 +18974,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -19429,14 +18991,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validValAndOff(c, off)) { break } @@ -19453,7 +19014,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -19462,7 +19023,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -19480,18 +19040,16 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -19510,18 +19068,16 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -19540,16 +19096,14 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -19568,7 +19122,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -19577,7 +19131,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -19595,7 +19148,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break @@ -19603,7 +19156,6 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -19621,7 +19173,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDQload { @@ -19638,8 +19190,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -19659,7 +19210,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDQload { @@ -19676,8 +19227,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_0(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -19700,7 +19250,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORQload { @@ -19717,8 +19267,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -19738,7 +19287,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORQload { @@ -19755,8 +19304,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != y.Args[1] { break } - mem := y.Args[2] - if mem != v.Args[2] { + if mem != y.Args[2] { break } if !(y.Uses == 1 && clobber(y)) { @@ -19776,13 +19324,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -19797,9 +19345,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -19819,7 +19365,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ADDQ { @@ -19841,8 +19387,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -19862,13 +19407,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64SUBQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -19883,9 +19428,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -19905,13 +19448,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -19926,9 +19469,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -19948,7 +19489,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ANDQ { @@ -19970,8 +19511,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -19991,13 +19531,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -20012,9 +19552,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20034,7 +19572,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64ORQ { @@ -20056,8 +19594,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20077,13 +19614,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -20098,9 +19635,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_10(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20123,7 +19658,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64XORQ { @@ -20145,8 +19680,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20166,13 +19700,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTCQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -20187,9 +19721,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20209,13 +19741,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTRQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -20230,9 +19762,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20252,13 +19782,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] y := v.Args[1] if y.Op != OpAMD64BTSQ { break } - _ = y.Args[1] + x := y.Args[1] l := y.Args[0] if l.Op != OpAMD64MOVQload { break @@ -20273,9 +19803,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { if ptr != l.Args[0] { break } - mem := l.Args[1] - x := y.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(y.Uses == 1 && l.Uses == 1 && clobber(y) && clobber(l)) { @@ -20295,7 +19823,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ADDQconst { @@ -20314,8 +19842,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20334,7 +19861,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ANDQconst { @@ -20353,8 +19880,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20373,7 +19899,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64ORQconst { @@ -20392,8 +19918,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20412,7 +19937,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64XORQconst { @@ -20431,8 +19956,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20451,7 +19975,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTCQconst { @@ -20470,8 +19994,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20490,7 +20013,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTRQconst { @@ -20509,8 +20032,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_20(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20532,7 +20054,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] a := v.Args[1] if a.Op != OpAMD64BTSQconst { @@ -20551,8 +20073,7 @@ func rewriteValueAMD64_OpAMD64MOVQstore_30(v *Value) bool { } _ = l.Args[1] ptr2 := l.Args[0] - mem := l.Args[1] - if mem != v.Args[2] { + if mem != l.Args[1] { break } if !(isSamePtr(ptr, ptr2) && a.Uses == 1 && l.Uses == 1 && validValAndOff(c, off) && clobber(l) && clobber(a)) { @@ -20571,14 +20092,13 @@ func rewriteValueAMD64_OpAMD64MOVQstore_30(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQf2i { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVSDstore) v.AuxInt = off v.Aux = sym @@ -20598,14 +20118,13 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -20622,7 +20141,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -20630,7 +20149,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -20647,17 +20165,15 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -20675,17 +20191,15 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -20703,15 +20217,13 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(OpAMD64MOVQstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -20736,11 +20248,10 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(config.useSSE && x.Uses == 1 && ValAndOff(c2).Off()+8 == ValAndOff(c).Off() && ValAndOff(c).Val() == 0 && ValAndOff(c2).Val() == 0 && clobber(x)) { break } @@ -20760,7 +20271,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -20768,7 +20279,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -20785,14 +20295,13 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -20812,7 +20321,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -20822,7 +20331,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVQstoreconstidx8) v.AuxInt = c v.Aux = sym @@ -20837,7 +20345,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -20845,7 +20353,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -20863,7 +20370,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -20871,7 +20378,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -20892,7 +20398,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx8_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -20900,7 +20406,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx8_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -20918,7 +20423,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx8_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -20926,7 +20431,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreconstidx8_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(8 * c)) { break } @@ -20947,7 +20451,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -20958,7 +20462,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVQstoreidx8) v.AuxInt = c v.Aux = sym @@ -20974,7 +20477,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -20983,7 +20486,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21002,7 +20504,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21011,7 +20513,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21030,7 +20531,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -21038,7 +20539,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx1_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -21059,7 +20559,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21068,7 +20568,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21087,7 +20586,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21096,7 +20595,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 8*d)) { break } @@ -21115,7 +20613,7 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -21123,7 +20621,6 @@ func rewriteValueAMD64_OpAMD64MOVQstoreidx8_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 8*c)) { break } @@ -21144,14 +20641,13 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -21168,7 +20664,7 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -21176,7 +20672,6 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21193,17 +20688,15 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21221,17 +20714,15 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21249,15 +20740,13 @@ func rewriteValueAMD64_OpAMD64MOVSDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -21305,7 +20794,7 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -21315,7 +20804,6 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVSDloadidx8) v.AuxInt = c v.Aux = sym @@ -21330,7 +20818,7 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21338,7 +20826,6 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -21356,7 +20843,7 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21364,7 +20851,6 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -21382,14 +20868,13 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -21409,7 +20894,7 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21417,7 +20902,6 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx8_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -21435,7 +20919,7 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21443,7 +20927,6 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx8_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 8*d)) { break } @@ -21461,14 +20944,13 @@ func rewriteValueAMD64_OpAMD64MOVSDloadidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 8*c)) { break } @@ -21488,7 +20970,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21496,7 +20978,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -21514,7 +20995,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -21523,7 +21004,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21541,18 +21021,16 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21571,18 +21049,16 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ8 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21601,16 +21077,14 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -21629,14 +21103,13 @@ func rewriteValueAMD64_OpAMD64MOVSDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQi2f { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVQstore) v.AuxInt = off v.Aux = sym @@ -21654,7 +21127,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -21665,7 +21138,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVSDstoreidx8) v.AuxInt = c v.Aux = sym @@ -21681,7 +21153,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21690,7 +21162,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21709,7 +21180,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21718,7 +21189,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21737,7 +21207,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -21745,7 +21215,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx1_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -21766,7 +21235,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -21775,7 +21244,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -21794,7 +21262,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -21803,7 +21271,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 8*d)) { break } @@ -21822,7 +21289,7 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -21830,7 +21297,6 @@ func rewriteValueAMD64_OpAMD64MOVSDstoreidx8_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 8*c)) { break } @@ -21851,14 +21317,13 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -21875,7 +21340,7 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -21883,7 +21348,6 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21900,17 +21364,15 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21928,17 +21390,15 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21956,15 +21416,13 @@ func rewriteValueAMD64_OpAMD64MOVSSload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -22012,7 +21470,7 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -22022,7 +21480,6 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVSSloadidx4) v.AuxInt = c v.Aux = sym @@ -22037,7 +21494,7 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -22045,7 +21502,6 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -22063,7 +21519,7 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -22071,7 +21527,6 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -22089,14 +21544,13 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -22116,7 +21570,7 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -22124,7 +21578,6 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx4_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -22142,7 +21595,7 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -22150,7 +21603,6 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx4_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 4*d)) { break } @@ -22168,14 +21620,13 @@ func rewriteValueAMD64_OpAMD64MOVSSloadidx4_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 4*c)) { break } @@ -22195,7 +21646,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -22203,7 +21654,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -22221,7 +21671,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -22230,7 +21680,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -22248,18 +21697,16 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -22278,18 +21725,16 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ4 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -22308,16 +21753,14 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -22336,14 +21779,13 @@ func rewriteValueAMD64_OpAMD64MOVSSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLi2f { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AuxInt = off v.Aux = sym @@ -22361,7 +21803,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -22372,7 +21814,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVSSstoreidx4) v.AuxInt = c v.Aux = sym @@ -22388,7 +21829,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -22397,7 +21838,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -22416,7 +21856,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -22425,7 +21865,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -22444,7 +21883,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -22452,7 +21891,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx1_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -22473,7 +21911,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -22482,7 +21920,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -22501,7 +21938,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -22510,7 +21947,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 4*d)) { break } @@ -22529,7 +21965,7 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -22537,7 +21973,6 @@ func rewriteValueAMD64_OpAMD64MOVSSstoreidx4_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 4*c)) { break } @@ -22563,9 +21998,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22589,9 +22023,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22615,9 +22048,8 @@ func rewriteValueAMD64_OpAMD64MOVWQSX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22708,7 +22140,7 @@ func rewriteValueAMD64_OpAMD64MOVWQSXload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -22716,7 +22148,6 @@ func rewriteValueAMD64_OpAMD64MOVWQSXload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -22741,9 +22172,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22767,9 +22197,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22793,9 +22222,8 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -22832,10 +22260,9 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -22860,10 +22287,9 @@ func rewriteValueAMD64_OpAMD64MOVWQZX_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -22954,14 +22380,13 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -22978,7 +22403,7 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -22986,7 +22411,6 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23003,17 +22427,15 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23031,17 +22453,15 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ2 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23059,15 +22479,13 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -23085,7 +22503,7 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -23093,7 +22511,6 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -23110,14 +22527,13 @@ func rewriteValueAMD64_OpAMD64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -23155,7 +22571,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -23165,7 +22581,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVWloadidx2) v.AuxInt = c v.Aux = sym @@ -23180,7 +22595,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQconst { break @@ -23190,7 +22605,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVWloadidx2) v.AuxInt = c v.Aux = sym @@ -23205,7 +22619,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -23213,7 +22627,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -23231,7 +22644,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -23239,7 +22652,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -23257,7 +22669,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -23265,7 +22677,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -23283,7 +22694,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -23291,7 +22702,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -23309,14 +22719,13 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -23333,14 +22742,13 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt p := v.Args[1] - mem := v.Args[2] if !(is32Bit(i + c)) { break } @@ -23360,7 +22768,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -23368,7 +22776,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx2_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is32Bit(c + d)) { break } @@ -23386,7 +22793,7 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -23394,7 +22801,6 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx2_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(c + 2*d)) { break } @@ -23412,14 +22818,13 @@ func rewriteValueAMD64_OpAMD64MOVWloadidx2_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(i + 2*c)) { break } @@ -23439,14 +22844,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVWQSX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVWstore) v.AuxInt = off v.Aux = sym @@ -23461,14 +22865,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVWQZX { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVWstore) v.AuxInt = off v.Aux = sym @@ -23483,7 +22886,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -23491,7 +22894,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -23509,14 +22911,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVLconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -23533,14 +22934,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(validOff(off)) { break } @@ -23557,7 +22957,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -23566,7 +22966,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23584,18 +22983,16 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23614,18 +23011,16 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ2 { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -23644,16 +23039,14 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -23692,14 +23085,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -23742,14 +23134,13 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -23785,7 +23176,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -23799,7 +23190,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -23835,7 +23225,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -23849,7 +23239,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -23875,9 +23264,8 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { } j := x1.AuxInt s2 := x1.Aux - _ = x1.Args[1] - p2 := x1.Args[0] mem := x1.Args[1] + p2 := x1.Args[0] mem2 := v.Args[2] if mem2.Op != OpAMD64MOVWstore { break @@ -23934,7 +23322,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -23943,7 +23331,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -23961,7 +23348,7 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break @@ -23969,7 +23356,6 @@ func rewriteValueAMD64_OpAMD64MOVWstore_10(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -23990,14 +23376,13 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -24014,7 +23399,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -24022,7 +23407,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -24039,17 +23423,15 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ1 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -24067,17 +23449,15 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ2 { break } off := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(canMergeSym(sym1, sym2)) { break } @@ -24095,15 +23475,13 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQ { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] v.reset(OpAMD64MOVWstoreconstidx1) v.AuxInt = x v.Aux = sym @@ -24128,11 +23506,10 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -24159,11 +23536,10 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -24180,7 +23556,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAL { break @@ -24188,7 +23564,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -24205,14 +23580,13 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDLconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(sc).canAdd(off)) { break } @@ -24232,7 +23606,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -24242,7 +23616,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64MOVWstoreconstidx2) v.AuxInt = c v.Aux = sym @@ -24257,7 +23630,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -24265,7 +23638,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -24283,7 +23655,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -24291,7 +23663,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -24320,14 +23691,13 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -24349,7 +23719,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -24357,7 +23727,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { c := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(ValAndOff(x).canAdd(c)) { break } @@ -24375,7 +23744,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { for { x := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -24383,7 +23752,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(ValAndOff(x).canAdd(2 * c)) { break } @@ -24412,14 +23780,13 @@ func rewriteValueAMD64_OpAMD64MOVWstoreconstidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if i != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -24443,7 +23810,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64SHLQconst { @@ -24454,7 +23821,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64MOVWstoreidx2) v.AuxInt = c v.Aux = sym @@ -24470,7 +23836,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -24479,7 +23845,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -24498,7 +23863,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -24507,7 +23872,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -24547,7 +23911,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24557,7 +23921,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24597,7 +23960,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24607,7 +23970,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24645,7 +24007,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24662,7 +24024,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24700,7 +24061,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24717,7 +24078,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24736,7 +24096,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -24744,7 +24104,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx1_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + c)) { break } @@ -24766,7 +24125,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -24775,7 +24134,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + d)) { break } @@ -24794,7 +24152,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -24803,7 +24161,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is32Bit(c + 2*d)) { break } @@ -24843,7 +24200,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24853,7 +24210,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24896,7 +24252,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24906,7 +24262,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24947,7 +24302,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -24964,7 +24319,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -24986,7 +24340,7 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { @@ -24994,7 +24348,6 @@ func rewriteValueAMD64_OpAMD64MOVWstoreidx2_0(v *Value) bool { } c := v_1.AuxInt w := v.Args[2] - mem := v.Args[3] if !(is32Bit(i + 2*c)) { break } @@ -25029,13 +24382,12 @@ func rewriteValueAMD64_OpAMD64MULL_0(v *Value) bool { // cond: // result: (MULLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64MULLconst) v.AuxInt = c v.AddArg(x) @@ -25569,13 +24921,12 @@ func rewriteValueAMD64_OpAMD64MULQ_0(v *Value) bool { // cond: is32Bit(c) // result: (MULQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -26104,9 +25455,8 @@ func rewriteValueAMD64_OpAMD64MULSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -26122,17 +25472,15 @@ func rewriteValueAMD64_OpAMD64MULSD_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (MULSDload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVSDload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -26155,7 +25503,7 @@ func rewriteValueAMD64_OpAMD64MULSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -26163,7 +25511,6 @@ func rewriteValueAMD64_OpAMD64MULSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -26181,7 +25528,7 @@ func rewriteValueAMD64_OpAMD64MULSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -26190,7 +25537,6 @@ func rewriteValueAMD64_OpAMD64MULSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -26248,9 +25594,8 @@ func rewriteValueAMD64_OpAMD64MULSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -26266,17 +25611,15 @@ func rewriteValueAMD64_OpAMD64MULSS_0(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (MULSSload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVSSload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -26299,7 +25642,7 @@ func rewriteValueAMD64_OpAMD64MULSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -26307,7 +25650,6 @@ func rewriteValueAMD64_OpAMD64MULSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -26325,7 +25667,7 @@ func rewriteValueAMD64_OpAMD64MULSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -26334,7 +25676,6 @@ func rewriteValueAMD64_OpAMD64MULSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -26500,12 +25841,12 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { // cond: !config.nacl // result: (BTSL x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVLconst { break @@ -26513,8 +25854,6 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - y := v_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -26533,7 +25872,7 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { if v_1.Op != OpAMD64SHLL { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVLconst { break @@ -26541,7 +25880,6 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { if v_1_0.AuxInt != 1 { break } - y := v_1.Args[1] if !(!config.nacl) { break } @@ -26554,13 +25892,12 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTSLconst [log2uint32(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl) { break } @@ -26608,13 +25945,12 @@ func rewriteValueAMD64_OpAMD64ORL_0(v *Value) bool { // cond: // result: (ORLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64ORLconst) v.AuxInt = c v.AddArg(x) @@ -26798,9 +26134,8 @@ func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -26867,9 +26202,8 @@ func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27074,9 +26408,8 @@ func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27143,9 +26476,8 @@ func rewriteValueAMD64_OpAMD64ORL_10(v *Value) bool { if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27353,9 +26685,8 @@ func rewriteValueAMD64_OpAMD64ORL_20(v *Value) bool { if v_0.Op != OpAMD64SHRL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27422,9 +26753,8 @@ func rewriteValueAMD64_OpAMD64ORL_20(v *Value) bool { if v_0.Op != OpAMD64SHRL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27629,9 +26959,8 @@ func rewriteValueAMD64_OpAMD64ORL_20(v *Value) bool { if v_0.Op != OpAMD64SHRL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -27698,9 +27027,8 @@ func rewriteValueAMD64_OpAMD64ORL_20(v *Value) bool { if v_0.Op != OpAMD64SHRL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDL { break @@ -29847,9 +29175,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -29868,9 +29195,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -29924,9 +29250,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpAMD64MOVBload { break @@ -29966,9 +29291,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30022,9 +29346,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpAMD64MOVWload { break @@ -30069,14 +29392,13 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -30097,7 +29419,6 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -30133,9 +29454,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -30190,7 +29510,7 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -30202,10 +29522,8 @@ func rewriteValueAMD64_OpAMD64ORL_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -30272,9 +29590,8 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -30325,10 +29642,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30379,10 +29695,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30433,10 +29748,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30487,10 +29801,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30548,10 +29861,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -30602,10 +29914,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -30656,10 +29967,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -30710,10 +30020,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -30757,10 +30066,9 @@ func rewriteValueAMD64_OpAMD64ORL_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30816,10 +30124,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30870,10 +30177,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30924,10 +30230,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -30985,10 +30290,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -31039,10 +30343,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -31093,10 +30396,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -31147,10 +30449,9 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -31199,15 +30500,14 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31231,7 +30531,6 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31268,15 +30567,14 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31300,7 +30598,6 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31337,15 +30634,14 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31369,7 +30665,6 @@ func rewriteValueAMD64_OpAMD64ORL_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31411,15 +30706,14 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31443,7 +30737,6 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31480,10 +30773,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -31549,10 +30841,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -31618,10 +30909,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -31687,10 +30977,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -31749,7 +31038,7 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31761,11 +31050,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -31818,7 +31105,7 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -31830,11 +31117,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -31900,10 +31185,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -31969,10 +31253,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -32025,7 +31308,7 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -32037,11 +31320,9 @@ func rewriteValueAMD64_OpAMD64ORL_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -32099,7 +31380,7 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLLconst { break @@ -32111,11 +31392,9 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -32181,10 +31460,9 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -32250,10 +31528,9 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLLconst { break @@ -32308,9 +31585,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -32367,9 +31643,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpAMD64MOVBload { break @@ -32419,9 +31694,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -32491,9 +31765,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -32547,14 +31820,13 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -32575,7 +31847,6 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -32614,9 +31885,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -32674,7 +31944,7 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -32686,10 +31956,8 @@ func rewriteValueAMD64_OpAMD64ORL_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -32759,9 +32027,8 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -32815,10 +32082,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -32872,10 +32138,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -32929,10 +32194,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -32986,10 +32250,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -33050,10 +32313,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -33107,10 +32369,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -33164,10 +32425,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -33221,10 +32481,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -33278,10 +32537,9 @@ func rewriteValueAMD64_OpAMD64ORL_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -33353,10 +32611,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -33423,10 +32680,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -33493,10 +32749,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLLconst { break @@ -33570,10 +32825,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -33640,10 +32894,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -33710,10 +32963,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -33780,10 +33032,9 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -33841,15 +33092,14 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -33873,7 +33123,6 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -33913,15 +33162,14 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -33945,7 +33193,6 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -33985,15 +33232,14 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34017,7 +33263,6 @@ func rewriteValueAMD64_OpAMD64ORL_110(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34062,15 +33307,14 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34094,7 +33338,6 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34134,10 +33377,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -34206,10 +33448,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -34278,10 +33519,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -34350,10 +33590,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORL { break @@ -34415,7 +33654,7 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34427,11 +33666,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34487,7 +33724,7 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34499,11 +33736,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34572,10 +33807,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34644,10 +33878,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34703,7 +33936,7 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34715,11 +33948,9 @@ func rewriteValueAMD64_OpAMD64ORL_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34780,7 +34011,7 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { if or.Op != OpAMD64ORL { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLLconst { break @@ -34792,11 +34023,9 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34865,10 +34094,9 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34937,10 +34165,9 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLLconst { break @@ -34999,9 +34226,8 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -35017,17 +34243,15 @@ func rewriteValueAMD64_OpAMD64ORL_130(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ORLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -35139,14 +34363,13 @@ func rewriteValueAMD64_OpAMD64ORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -35163,7 +34386,7 @@ func rewriteValueAMD64_OpAMD64ORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -35171,7 +34394,6 @@ func rewriteValueAMD64_OpAMD64ORLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -35193,7 +34415,7 @@ func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -35201,7 +34423,6 @@ func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -35219,7 +34440,7 @@ func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -35228,7 +34449,6 @@ func rewriteValueAMD64_OpAMD64ORLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -35280,7 +34500,7 @@ func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -35288,7 +34508,6 @@ func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -35306,7 +34525,7 @@ func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -35315,7 +34534,6 @@ func rewriteValueAMD64_OpAMD64ORLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -35336,12 +34554,12 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { // cond: !config.nacl // result: (BTSQ x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break @@ -35349,8 +34567,6 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - y := v_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -35369,7 +34585,7 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { if v_1.Op != OpAMD64SHLQ { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break @@ -35377,7 +34593,6 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { if v_1_0.AuxInt != 1 { break } - y := v_1.Args[1] if !(!config.nacl) { break } @@ -35390,13 +34605,12 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTSQconst [log2(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl) { break } @@ -35447,13 +34661,12 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { // cond: is32Bit(c) // result: (ORQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -35525,9 +34738,8 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -35594,9 +34806,8 @@ func rewriteValueAMD64_OpAMD64ORQ_0(v *Value) bool { if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -35804,9 +35015,8 @@ func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -35873,9 +35083,8 @@ func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -36080,9 +35289,8 @@ func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { if v_0.Op != OpAMD64SHRQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -36149,9 +35357,8 @@ func rewriteValueAMD64_OpAMD64ORQ_10(v *Value) bool { if v_0.Op != OpAMD64SHRQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -36361,9 +35568,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { if v_0.Op != OpAMD64SHRQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -36430,9 +35636,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { if v_0.Op != OpAMD64SHRQ { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ANDQ { break @@ -36632,9 +35837,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -36653,9 +35857,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -36709,9 +35912,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpAMD64MOVBload { break @@ -36751,9 +35953,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -36807,9 +36008,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpAMD64MOVWload { break @@ -36849,9 +36049,8 @@ func rewriteValueAMD64_OpAMD64ORQ_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -36910,9 +36109,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpAMD64MOVLload { break @@ -36957,14 +36155,13 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -36985,7 +36182,6 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37021,9 +36217,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -37078,7 +36273,7 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -37090,10 +36285,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -37155,9 +36348,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -37213,14 +36405,13 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -37241,7 +36432,6 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37277,9 +36467,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -37334,7 +36523,7 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -37346,10 +36535,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -37411,9 +36598,8 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -37464,10 +36650,9 @@ func rewriteValueAMD64_OpAMD64ORQ_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -37523,10 +36708,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -37577,10 +36761,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -37631,10 +36814,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -37692,10 +36874,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -37746,10 +36927,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -37800,10 +36980,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -37854,10 +37033,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVBloadidx1 { break @@ -37901,10 +37079,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -37955,10 +37132,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38009,10 +37185,9 @@ func rewriteValueAMD64_OpAMD64ORQ_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38068,10 +37243,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38129,10 +37303,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -38183,10 +37356,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -38237,10 +37409,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -38291,10 +37462,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVWloadidx1 { break @@ -38338,10 +37508,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38392,10 +37561,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38446,10 +37614,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38500,10 +37667,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -38561,10 +37727,9 @@ func rewriteValueAMD64_OpAMD64ORQ_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVLloadidx1 { break @@ -38620,10 +37785,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVLloadidx1 { break @@ -38674,10 +37838,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVLloadidx1 { break @@ -38728,10 +37891,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpAMD64MOVLloadidx1 { break @@ -38780,15 +37942,14 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -38812,7 +37973,6 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -38849,15 +38009,14 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -38881,7 +38040,6 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -38918,15 +38076,14 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -38950,7 +38107,6 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -38987,15 +38143,14 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39019,7 +38174,6 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -39056,10 +38210,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -39125,10 +38278,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -39194,10 +38346,9 @@ func rewriteValueAMD64_OpAMD64ORQ_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -39268,10 +38419,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -39330,7 +38480,7 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39342,11 +38492,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39399,7 +38547,7 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39411,11 +38559,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39481,10 +38627,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39550,10 +38695,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39606,7 +38750,7 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39618,11 +38762,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39675,7 +38817,7 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39687,11 +38829,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39757,10 +38897,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39826,10 +38965,9 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -39889,15 +39027,14 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39921,7 +39058,6 @@ func rewriteValueAMD64_OpAMD64ORQ_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -39963,15 +39099,14 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -39995,7 +39130,6 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -40032,15 +39166,14 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40064,7 +39197,6 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -40101,15 +39233,14 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40133,7 +39264,6 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -40170,10 +39300,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -40239,10 +39368,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -40308,10 +39436,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -40377,10 +39504,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -40439,7 +39565,7 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40451,11 +39577,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40508,7 +39632,7 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40520,11 +39644,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40590,10 +39712,9 @@ func rewriteValueAMD64_OpAMD64ORQ_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40664,10 +39785,9 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40720,7 +39840,7 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40732,11 +39852,9 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40789,7 +39907,7 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpAMD64SHLQconst { break @@ -40801,11 +39919,9 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40871,10 +39987,9 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40940,10 +40055,9 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpAMD64SHLQconst { break @@ -40998,9 +40112,8 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -41057,9 +40170,8 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpAMD64MOVBload { break @@ -41109,9 +40221,8 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -41181,9 +40292,8 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -41236,9 +40346,8 @@ func rewriteValueAMD64_OpAMD64ORQ_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -41307,9 +40416,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] r1 := v.Args[1] if r1.Op != OpAMD64BSWAPL { break @@ -41360,14 +40468,13 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -41388,7 +40495,6 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -41427,9 +40533,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -41487,7 +40592,7 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -41499,10 +40604,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -41567,9 +40670,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -41635,14 +40737,13 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -41670,7 +40771,6 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -41715,9 +40815,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -41781,7 +40880,7 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -41800,10 +40899,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -41881,9 +40978,8 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -41943,10 +41039,9 @@ func rewriteValueAMD64_OpAMD64ORQ_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42005,10 +41100,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42062,10 +41156,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42119,10 +41212,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42183,10 +41275,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -42240,10 +41331,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -42297,10 +41387,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -42354,10 +41443,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpAMD64MOVBloadidx1 { break @@ -42411,10 +41499,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42481,10 +41568,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42551,10 +41637,9 @@ func rewriteValueAMD64_OpAMD64ORQ_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42626,10 +41711,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -42703,10 +41787,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -42773,10 +41856,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -42843,10 +41925,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -42913,10 +41994,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64ROLWconst { break @@ -42973,10 +42053,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -43037,10 +42116,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -43101,10 +42179,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -43165,10 +42242,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpAMD64SHLQconst { break @@ -43236,10 +42312,9 @@ func rewriteValueAMD64_OpAMD64ORQ_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64BSWAPL { break @@ -43305,10 +42380,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64BSWAPL { break @@ -43369,10 +42443,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64BSWAPL { break @@ -43433,10 +42506,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] r1 := v.Args[1] if r1.Op != OpAMD64BSWAPL { break @@ -43491,15 +42563,14 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -43523,7 +42594,6 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -43563,15 +42633,14 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -43595,7 +42664,6 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -43635,15 +42703,14 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -43667,7 +42734,6 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -43707,15 +42773,14 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -43739,7 +42804,6 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -43779,10 +42843,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -43851,10 +42914,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -43923,10 +42985,9 @@ func rewriteValueAMD64_OpAMD64ORQ_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -44000,10 +43061,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -44065,7 +43125,7 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44077,11 +43137,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44137,7 +43195,7 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44149,11 +43207,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44222,10 +43278,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44294,10 +43349,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44353,7 +43407,7 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44365,11 +43419,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44425,7 +43477,7 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44437,11 +43489,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44510,10 +43560,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44582,10 +43631,9 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -44655,15 +43703,14 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44694,7 +43741,6 @@ func rewriteValueAMD64_OpAMD64ORQ_140(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -44745,15 +43791,14 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44784,7 +43829,6 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -44830,15 +43874,14 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44869,7 +43912,6 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -44915,15 +43957,14 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -44954,7 +43995,6 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -45000,10 +44040,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -45085,10 +44124,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -45170,10 +44208,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -45255,10 +44292,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpAMD64ORQ { break @@ -45326,7 +44362,7 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -45345,11 +44381,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45411,7 +44445,7 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -45430,11 +44464,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45516,10 +44548,9 @@ func rewriteValueAMD64_OpAMD64ORQ_150(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45606,10 +44637,9 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45671,7 +44701,7 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -45690,11 +44720,9 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45756,7 +44784,7 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { if or.Op != OpAMD64ORQ { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpAMD64SHLQconst { break @@ -45775,11 +44803,9 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45861,10 +44887,9 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -45946,10 +44971,9 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpAMD64SHLQconst { break @@ -46014,9 +45038,8 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -46032,17 +45055,15 @@ func rewriteValueAMD64_OpAMD64ORQ_160(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (ORQload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -46152,14 +45173,13 @@ func rewriteValueAMD64_OpAMD64ORQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -46176,7 +45196,7 @@ func rewriteValueAMD64_OpAMD64ORQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -46184,7 +45204,6 @@ func rewriteValueAMD64_OpAMD64ORQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -46206,7 +45225,7 @@ func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -46214,7 +45233,6 @@ func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -46232,7 +45250,7 @@ func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -46241,7 +45259,6 @@ func rewriteValueAMD64_OpAMD64ORQload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -46293,7 +45310,7 @@ func rewriteValueAMD64_OpAMD64ORQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -46301,7 +45318,6 @@ func rewriteValueAMD64_OpAMD64ORQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -46319,7 +45335,7 @@ func rewriteValueAMD64_OpAMD64ORQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -46328,7 +45344,6 @@ func rewriteValueAMD64_OpAMD64ORQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -47712,14 +46727,13 @@ func rewriteValueAMD64_OpAMD64SBBQ_0(v *Value) bool { // cond: is32Bit(c) // result: (SBBQconst x [c] borrow) for { - _ = v.Args[2] + borrow := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64MOVQconst { break } c := v_1.AuxInt - borrow := v.Args[2] if !(is32Bit(c)) { break } @@ -47989,14 +47003,13 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETBEstore) v.AuxInt = off v.Aux = sym @@ -48011,7 +47024,7 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -48019,7 +47032,6 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -48037,7 +47049,7 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -48046,7 +47058,6 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -48064,13 +47075,12 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48087,13 +47097,12 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48110,13 +47119,12 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48133,13 +47141,12 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48156,13 +47163,12 @@ func rewriteValueAMD64_OpAMD64SETAEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48183,14 +47189,13 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETBstore) v.AuxInt = off v.Aux = sym @@ -48205,7 +47210,7 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -48213,7 +47218,6 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -48231,7 +47235,7 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -48240,7 +47244,6 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -48258,13 +47261,12 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48281,13 +47283,12 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48304,13 +47305,12 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48327,13 +47327,12 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48350,13 +47349,12 @@ func rewriteValueAMD64_OpAMD64SETAstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48529,14 +47527,13 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETAEstore) v.AuxInt = off v.Aux = sym @@ -48551,7 +47548,7 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -48559,7 +47556,6 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -48577,7 +47573,7 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -48586,7 +47582,6 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -48604,13 +47599,12 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48627,13 +47621,12 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48650,13 +47643,12 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48673,13 +47665,12 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48696,13 +47687,12 @@ func rewriteValueAMD64_OpAMD64SETBEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48723,14 +47713,13 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETAstore) v.AuxInt = off v.Aux = sym @@ -48745,7 +47734,7 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -48753,7 +47742,6 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -48771,7 +47759,7 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -48780,7 +47768,6 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -48798,13 +47785,12 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48821,13 +47807,12 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48844,13 +47829,12 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48867,13 +47851,12 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48890,13 +47873,12 @@ func rewriteValueAMD64_OpAMD64SETBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -48920,12 +47902,12 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64SHLL { break } - _ = v_0_0.Args[1] + x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVLconst { break @@ -48933,8 +47915,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - x := v_0_0.Args[1] - y := v_0.Args[1] if !(!config.nacl) { break } @@ -48959,7 +47939,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_1.Op != OpAMD64SHLL { break } - _ = v_0_1.Args[1] + x := v_0_1.Args[1] v_0_1_0 := v_0_1.Args[0] if v_0_1_0.Op != OpAMD64MOVLconst { break @@ -48967,7 +47947,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_1_0.AuxInt != 1 { break } - x := v_0_1.Args[1] if !(!config.nacl) { break } @@ -48986,12 +47965,12 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64SHLQ { break } - _ = v_0_0.Args[1] + x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVQconst { break @@ -48999,8 +47978,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - x := v_0_0.Args[1] - y := v_0.Args[1] if !(!config.nacl) { break } @@ -49025,7 +48002,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_1.Op != OpAMD64SHLQ { break } - _ = v_0_1.Args[1] + x := v_0_1.Args[1] v_0_1_0 := v_0_1.Args[0] if v_0_1_0.Op != OpAMD64MOVQconst { break @@ -49033,7 +48010,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0_1_0.AuxInt != 1 { break } - x := v_0_1.Args[1] if !(!config.nacl) { break } @@ -49092,13 +48068,12 @@ func rewriteValueAMD64_OpAMD64SETEQ_0(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -49197,7 +48172,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -49213,7 +48188,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49267,7 +48241,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -49283,7 +48257,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49337,7 +48310,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -49353,7 +48326,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49407,7 +48379,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -49423,7 +48395,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49477,7 +48448,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -49486,7 +48457,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_10(v *Value) bool { break } x := z1.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49538,7 +48508,7 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -49547,7 +48517,6 @@ func rewriteValueAMD64_OpAMD64SETEQ_20(v *Value) bool { break } x := z1.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -49670,18 +48639,18 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64SHLL { break } - _ = v_1_0.Args[1] + x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVLconst { break @@ -49689,9 +48658,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - x := v_1_0.Args[1] - y := v_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -49712,7 +48678,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -49724,7 +48690,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_1.Op != OpAMD64SHLL { break } - _ = v_1_1.Args[1] + x := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpAMD64MOVLconst { break @@ -49732,8 +48698,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_1_0.AuxInt != 1 { break } - x := v_1_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -49754,18 +48718,18 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64SHLQ { break } - _ = v_1_0.Args[1] + x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVQconst { break @@ -49773,9 +48737,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - x := v_1_0.Args[1] - y := v_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -49796,7 +48757,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -49808,7 +48769,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_1.Op != OpAMD64SHLQ { break } - _ = v_1_1.Args[1] + x := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpAMD64MOVQconst { break @@ -49816,8 +48777,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if v_1_1_0.AuxInt != 1 { break } - x := v_1_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -49838,7 +48797,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTLconst { @@ -49846,7 +48805,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { } c := v_1.AuxInt x := v_1.Args[0] - mem := v.Args[2] if !(isUint32PowerOfTwo(c) && !config.nacl) { break } @@ -49867,7 +48825,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQconst { @@ -49875,7 +48833,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { } c := v_1.AuxInt x := v_1.Args[0] - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -49896,20 +48853,18 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break } c := v_1_0.AuxInt - x := v_1.Args[1] - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -49930,7 +48885,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -49943,7 +48898,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { break } c := v_1_1.AuxInt - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -49964,7 +48918,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64CMPLconst { @@ -49980,7 +48934,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if s.AuxInt != 1 { break } - mem := v.Args[2] v.reset(OpAMD64SETNEstore) v.AuxInt = off v.Aux = sym @@ -49998,7 +48951,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64CMPQconst { @@ -50014,7 +48967,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_0(v *Value) bool { if s.AuxInt != 1 { break } - mem := v.Args[2] v.reset(OpAMD64SETNEstore) v.AuxInt = off v.Aux = sym @@ -50037,13 +48989,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -50059,8 +49011,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50081,7 +49031,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -50104,7 +49054,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50125,13 +49074,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -50147,8 +49096,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50169,7 +49116,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -50192,7 +49139,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50213,13 +49159,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -50235,8 +49181,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50257,7 +49201,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -50280,7 +49224,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50301,13 +49244,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -50323,8 +49266,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50345,7 +49286,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -50368,7 +49309,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50389,13 +49329,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -50404,8 +49344,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50426,7 +49364,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -50442,7 +49380,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_10(v *Value) bool { break } x := z1.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50468,13 +49405,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -50483,8 +49420,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { break } x := z1.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50505,7 +49440,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -50521,7 +49456,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { break } x := z1.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -50542,14 +49476,13 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym @@ -50564,7 +49497,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -50572,7 +49505,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -50590,7 +49522,7 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -50599,7 +49531,6 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -50617,13 +49548,12 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50640,13 +49570,12 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50663,13 +49592,12 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50686,13 +49614,12 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50709,13 +49636,12 @@ func rewriteValueAMD64_OpAMD64SETEQstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50888,14 +49814,13 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETLEstore) v.AuxInt = off v.Aux = sym @@ -50910,7 +49835,7 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -50918,7 +49843,6 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -50936,7 +49860,7 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -50945,7 +49869,6 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -50963,13 +49886,12 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -50986,13 +49908,12 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51009,13 +49930,12 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51032,13 +49952,12 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51055,13 +49974,12 @@ func rewriteValueAMD64_OpAMD64SETGEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51082,14 +50000,13 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETLstore) v.AuxInt = off v.Aux = sym @@ -51104,7 +50021,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -51112,7 +50029,6 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -51130,7 +50046,7 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -51139,7 +50055,6 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -51157,13 +50072,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51180,13 +50094,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51203,13 +50116,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51226,13 +50138,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51249,13 +50160,12 @@ func rewriteValueAMD64_OpAMD64SETGstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51428,14 +50338,13 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETGEstore) v.AuxInt = off v.Aux = sym @@ -51450,7 +50359,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -51458,7 +50367,6 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -51476,7 +50384,7 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -51485,7 +50393,6 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -51503,13 +50410,12 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51526,13 +50432,12 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51549,13 +50454,12 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51572,13 +50476,12 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51595,13 +50498,12 @@ func rewriteValueAMD64_OpAMD64SETLEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51622,14 +50524,13 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETGstore) v.AuxInt = off v.Aux = sym @@ -51644,7 +50545,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -51652,7 +50553,6 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -51670,7 +50570,7 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -51679,7 +50579,6 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -51697,13 +50596,12 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51720,13 +50618,12 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51743,13 +50640,12 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51766,13 +50662,12 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51789,13 +50684,12 @@ func rewriteValueAMD64_OpAMD64SETLstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -51819,12 +50713,12 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64SHLL { break } - _ = v_0_0.Args[1] + x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVLconst { break @@ -51832,8 +50726,6 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - x := v_0_0.Args[1] - y := v_0.Args[1] if !(!config.nacl) { break } @@ -51858,7 +50750,7 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_1.Op != OpAMD64SHLL { break } - _ = v_0_1.Args[1] + x := v_0_1.Args[1] v_0_1_0 := v_0_1.Args[0] if v_0_1_0.Op != OpAMD64MOVLconst { break @@ -51866,7 +50758,6 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_1_0.AuxInt != 1 { break } - x := v_0_1.Args[1] if !(!config.nacl) { break } @@ -51885,12 +50776,12 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64SHLQ { break } - _ = v_0_0.Args[1] + x := v_0_0.Args[1] v_0_0_0 := v_0_0.Args[0] if v_0_0_0.Op != OpAMD64MOVQconst { break @@ -51898,8 +50789,6 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_0_0.AuxInt != 1 { break } - x := v_0_0.Args[1] - y := v_0.Args[1] if !(!config.nacl) { break } @@ -51924,7 +50813,7 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_1.Op != OpAMD64SHLQ { break } - _ = v_0_1.Args[1] + x := v_0_1.Args[1] v_0_1_0 := v_0_1.Args[0] if v_0_1_0.Op != OpAMD64MOVQconst { break @@ -51932,7 +50821,6 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0_1_0.AuxInt != 1 { break } - x := v_0_1.Args[1] if !(!config.nacl) { break } @@ -51991,13 +50879,12 @@ func rewriteValueAMD64_OpAMD64SETNE_0(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -52096,7 +50983,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -52112,7 +50999,6 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52166,7 +51052,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -52182,7 +51068,6 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52236,7 +51121,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -52252,7 +51137,6 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52306,7 +51190,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -52322,7 +51206,6 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52376,7 +51259,7 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { if v_0.Op != OpAMD64TESTQ { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -52385,7 +51268,6 @@ func rewriteValueAMD64_OpAMD64SETNE_10(v *Value) bool { break } x := z1.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52437,7 +51319,7 @@ func rewriteValueAMD64_OpAMD64SETNE_20(v *Value) bool { if v_0.Op != OpAMD64TESTL { break } - _ = v_0.Args[1] + z2 := v_0.Args[1] z1 := v_0.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -52446,7 +51328,6 @@ func rewriteValueAMD64_OpAMD64SETNE_20(v *Value) bool { break } x := z1.Args[0] - z2 := v_0.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -52569,18 +51450,18 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64SHLL { break } - _ = v_1_0.Args[1] + x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVLconst { break @@ -52588,9 +51469,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - x := v_1_0.Args[1] - y := v_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -52611,7 +51489,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -52623,7 +51501,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_1.Op != OpAMD64SHLL { break } - _ = v_1_1.Args[1] + x := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpAMD64MOVLconst { break @@ -52631,8 +51509,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_1_0.AuxInt != 1 { break } - x := v_1_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -52653,18 +51529,18 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64SHLQ { break } - _ = v_1_0.Args[1] + x := v_1_0.Args[1] v_1_0_0 := v_1_0.Args[0] if v_1_0_0.Op != OpAMD64MOVQconst { break @@ -52672,9 +51548,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_0_0.AuxInt != 1 { break } - x := v_1_0.Args[1] - y := v_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -52695,7 +51568,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -52707,7 +51580,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_1.Op != OpAMD64SHLQ { break } - _ = v_1_1.Args[1] + x := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpAMD64MOVQconst { break @@ -52715,8 +51588,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if v_1_1_0.AuxInt != 1 { break } - x := v_1_1.Args[1] - mem := v.Args[2] if !(!config.nacl) { break } @@ -52737,7 +51608,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTLconst { @@ -52745,7 +51616,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { } c := v_1.AuxInt x := v_1.Args[0] - mem := v.Args[2] if !(isUint32PowerOfTwo(c) && !config.nacl) { break } @@ -52766,7 +51636,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQconst { @@ -52774,7 +51644,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { } c := v_1.AuxInt x := v_1.Args[0] - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -52795,20 +51664,18 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break } c := v_1_0.AuxInt - x := v_1.Args[1] - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -52829,7 +51696,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -52842,7 +51709,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { break } c := v_1_1.AuxInt - mem := v.Args[2] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -52863,7 +51729,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64CMPLconst { @@ -52879,7 +51745,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if s.AuxInt != 1 { break } - mem := v.Args[2] v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym @@ -52897,7 +51762,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64CMPQconst { @@ -52913,7 +51778,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_0(v *Value) bool { if s.AuxInt != 1 { break } - mem := v.Args[2] v.reset(OpAMD64SETEQstore) v.AuxInt = off v.Aux = sym @@ -52936,13 +51800,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -52958,8 +51822,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -52980,7 +51842,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -53003,7 +51865,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53024,13 +51885,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -53046,8 +51907,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53068,7 +51927,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -53091,7 +51950,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53112,13 +51970,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -53134,8 +51992,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53156,7 +52012,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -53179,7 +52035,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53200,13 +52055,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -53222,8 +52077,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53244,7 +52097,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -53267,7 +52120,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1_0.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53288,13 +52140,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -53303,8 +52155,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53325,7 +52175,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTQ { @@ -53341,7 +52191,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_10(v *Value) bool { break } x := z1.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53367,13 +52216,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { break } - _ = v_1.Args[1] + z2 := v_1.Args[1] z1 := v_1.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -53382,8 +52231,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { break } x := z1.Args[0] - z2 := v_1.Args[1] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53404,7 +52251,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64TESTL { @@ -53420,7 +52267,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { break } x := z1.Args[0] - mem := v.Args[2] if !(z1 == z2 && !config.nacl) { break } @@ -53441,14 +52287,13 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64InvertFlags { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpAMD64SETNEstore) v.AuxInt = off v.Aux = sym @@ -53463,7 +52308,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -53471,7 +52316,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -53489,7 +52333,7 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -53498,7 +52342,6 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -53516,13 +52359,12 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagEQ { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -53539,13 +52381,12 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -53562,13 +52403,12 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagLT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -53585,13 +52425,12 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_ULT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -53608,13 +52447,12 @@ func rewriteValueAMD64_OpAMD64SETNEstore_20(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] if x.Op != OpAMD64FlagGT_UGT { break } - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = off v.Aux = sym @@ -54891,13 +53729,12 @@ func rewriteValueAMD64_OpAMD64SUBL_0(v *Value) bool { // cond: // result: (NEGL (SUBLconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64NEGL) v0 := b.NewValue0(v.Pos, OpAMD64SUBLconst, v.Type) v0.AuxInt = c @@ -54909,9 +53746,8 @@ func rewriteValueAMD64_OpAMD64SUBL_0(v *Value) bool { // cond: // result: (MOVLconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpAMD64MOVLconst) @@ -54930,9 +53766,8 @@ func rewriteValueAMD64_OpAMD64SUBL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -54982,7 +53817,7 @@ func rewriteValueAMD64_OpAMD64SUBLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -54990,7 +53825,6 @@ func rewriteValueAMD64_OpAMD64SUBLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55008,7 +53842,7 @@ func rewriteValueAMD64_OpAMD64SUBLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -55017,7 +53851,6 @@ func rewriteValueAMD64_OpAMD64SUBLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55069,7 +53902,7 @@ func rewriteValueAMD64_OpAMD64SUBLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -55077,7 +53910,6 @@ func rewriteValueAMD64_OpAMD64SUBLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55095,7 +53927,7 @@ func rewriteValueAMD64_OpAMD64SUBLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -55104,7 +53936,6 @@ func rewriteValueAMD64_OpAMD64SUBLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55143,13 +53974,12 @@ func rewriteValueAMD64_OpAMD64SUBQ_0(v *Value) bool { // cond: is32Bit(c) // result: (NEGQ (SUBQconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -55164,9 +53994,8 @@ func rewriteValueAMD64_OpAMD64SUBQ_0(v *Value) bool { // cond: // result: (MOVQconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpAMD64MOVQconst) @@ -55185,9 +54014,8 @@ func rewriteValueAMD64_OpAMD64SUBQ_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -55295,7 +54123,7 @@ func rewriteValueAMD64_OpAMD64SUBQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -55303,7 +54131,6 @@ func rewriteValueAMD64_OpAMD64SUBQload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55321,7 +54148,7 @@ func rewriteValueAMD64_OpAMD64SUBQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -55330,7 +54157,6 @@ func rewriteValueAMD64_OpAMD64SUBQload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55382,7 +54208,7 @@ func rewriteValueAMD64_OpAMD64SUBQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -55390,7 +54216,6 @@ func rewriteValueAMD64_OpAMD64SUBQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55408,7 +54233,7 @@ func rewriteValueAMD64_OpAMD64SUBQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -55417,7 +54242,6 @@ func rewriteValueAMD64_OpAMD64SUBQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55444,9 +54268,8 @@ func rewriteValueAMD64_OpAMD64SUBSD_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -55469,7 +54292,7 @@ func rewriteValueAMD64_OpAMD64SUBSDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -55477,7 +54300,6 @@ func rewriteValueAMD64_OpAMD64SUBSDload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55495,7 +54317,7 @@ func rewriteValueAMD64_OpAMD64SUBSDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -55504,7 +54326,6 @@ func rewriteValueAMD64_OpAMD64SUBSDload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55562,9 +54383,8 @@ func rewriteValueAMD64_OpAMD64SUBSS_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -55587,7 +54407,7 @@ func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -55595,7 +54415,6 @@ func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -55613,7 +54432,7 @@ func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -55622,7 +54441,6 @@ func rewriteValueAMD64_OpAMD64SUBSSload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -55673,13 +54491,12 @@ func rewriteValueAMD64_OpAMD64TESTB_0(v *Value) bool { // cond: // result: (TESTBconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64TESTBconst) v.AuxInt = c v.AddArg(x) @@ -55705,17 +54522,15 @@ func rewriteValueAMD64_OpAMD64TESTB_0(v *Value) bool { // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPBconstload {sym} [makeValAndOff(0,off)] ptr mem) for { - _ = v.Args[1] + l2 := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVBload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - l2 := v.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -55741,9 +54556,8 @@ func rewriteValueAMD64_OpAMD64TESTB_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -55784,13 +54598,12 @@ func rewriteValueAMD64_OpAMD64TESTL_0(v *Value) bool { // cond: // result: (TESTLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64TESTLconst) v.AuxInt = c v.AddArg(x) @@ -55816,17 +54629,15 @@ func rewriteValueAMD64_OpAMD64TESTL_0(v *Value) bool { // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPLconstload {sym} [makeValAndOff(0,off)] ptr mem) for { - _ = v.Args[1] + l2 := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - l2 := v.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -55852,9 +54663,8 @@ func rewriteValueAMD64_OpAMD64TESTL_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -55895,13 +54705,12 @@ func rewriteValueAMD64_OpAMD64TESTQ_0(v *Value) bool { // cond: is32Bit(c) // result: (TESTQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -55933,17 +54742,15 @@ func rewriteValueAMD64_OpAMD64TESTQ_0(v *Value) bool { // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPQconstload {sym} [makeValAndOff(0,off)] ptr mem) for { - _ = v.Args[1] + l2 := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - l2 := v.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -55969,9 +54776,8 @@ func rewriteValueAMD64_OpAMD64TESTQ_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -56012,13 +54818,12 @@ func rewriteValueAMD64_OpAMD64TESTW_0(v *Value) bool { // cond: // result: (TESTWconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64TESTWconst) v.AuxInt = c v.AddArg(x) @@ -56044,17 +54849,15 @@ func rewriteValueAMD64_OpAMD64TESTW_0(v *Value) bool { // cond: l == l2 && l.Uses == 2 && validValAndOff(0,off) && clobber(l) // result: @l.Block (CMPWconstload {sym} [makeValAndOff(0,off)] ptr mem) for { - _ = v.Args[1] + l2 := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVWload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - l2 := v.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -56080,9 +54883,8 @@ func rewriteValueAMD64_OpAMD64TESTW_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(l == l2 && l.Uses == 2 && validValAndOff(0, off) && clobber(l)) { break } @@ -56124,7 +54926,7 @@ func rewriteValueAMD64_OpAMD64XADDLlock_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -56132,7 +54934,6 @@ func rewriteValueAMD64_OpAMD64XADDLlock_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -56153,7 +54954,7 @@ func rewriteValueAMD64_OpAMD64XADDQlock_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -56161,7 +54962,6 @@ func rewriteValueAMD64_OpAMD64XADDQlock_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -56182,7 +54982,7 @@ func rewriteValueAMD64_OpAMD64XCHGL_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -56190,7 +54990,6 @@ func rewriteValueAMD64_OpAMD64XCHGL_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -56208,7 +55007,7 @@ func rewriteValueAMD64_OpAMD64XCHGL_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -56217,7 +55016,6 @@ func rewriteValueAMD64_OpAMD64XCHGL_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && ptr.Op != OpSB) { break } @@ -56238,7 +55036,7 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -56246,7 +55044,6 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -56264,7 +55061,7 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -56273,7 +55070,6 @@ func rewriteValueAMD64_OpAMD64XCHGQ_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && ptr.Op != OpSB) { break } @@ -56294,12 +55090,12 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { // cond: !config.nacl // result: (BTCL x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVLconst { break @@ -56307,8 +55103,6 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - y := v_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -56327,7 +55121,7 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { if v_1.Op != OpAMD64SHLL { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVLconst { break @@ -56335,7 +55129,6 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { if v_1_0.AuxInt != 1 { break } - y := v_1.Args[1] if !(!config.nacl) { break } @@ -56348,13 +55141,12 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { // cond: isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTCLconst [log2uint32(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint32PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl) { break } @@ -56402,13 +55194,12 @@ func rewriteValueAMD64_OpAMD64XORL_0(v *Value) bool { // cond: // result: (XORLconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVLconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpAMD64XORLconst) v.AuxInt = c v.AddArg(x) @@ -56587,9 +55378,8 @@ func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { // cond: // result: (MOVLconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpAMD64MOVLconst) @@ -56608,9 +55398,8 @@ func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -56626,17 +55415,15 @@ func rewriteValueAMD64_OpAMD64XORL_10(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORLload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVLload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -56899,14 +55686,13 @@ func rewriteValueAMD64_OpAMD64XORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -56923,7 +55709,7 @@ func rewriteValueAMD64_OpAMD64XORLconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -56931,7 +55717,6 @@ func rewriteValueAMD64_OpAMD64XORLconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -56953,7 +55738,7 @@ func rewriteValueAMD64_OpAMD64XORLload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -56961,7 +55746,6 @@ func rewriteValueAMD64_OpAMD64XORLload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -56979,7 +55763,7 @@ func rewriteValueAMD64_OpAMD64XORLload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -56988,7 +55772,6 @@ func rewriteValueAMD64_OpAMD64XORLload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -57040,7 +55823,7 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -57048,7 +55831,6 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -57066,7 +55848,7 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -57075,7 +55857,6 @@ func rewriteValueAMD64_OpAMD64XORLmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -57096,12 +55877,12 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // cond: !config.nacl // result: (BTCQ x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] + y := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break @@ -57109,8 +55890,6 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - y := v_0.Args[1] - x := v.Args[1] if !(!config.nacl) { break } @@ -57129,7 +55908,7 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { if v_1.Op != OpAMD64SHLQ { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break @@ -57137,7 +55916,6 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { if v_1_0.AuxInt != 1 { break } - y := v_1.Args[1] if !(!config.nacl) { break } @@ -57150,13 +55928,12 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // cond: isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl // result: (BTCQconst [log2(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint64PowerOfTwo(c) && uint64(c) >= 128 && !config.nacl) { break } @@ -57207,13 +55984,12 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // cond: is32Bit(c) // result: (XORQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -57280,9 +56056,8 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { // cond: // result: (MOVQconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpAMD64MOVQconst) @@ -57301,9 +56076,8 @@ func rewriteValueAMD64_OpAMD64XORQ_0(v *Value) bool { } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -57322,17 +56096,15 @@ func rewriteValueAMD64_OpAMD64XORQ_10(v *Value) bool { // cond: canMergeLoadClobber(v, l, x) && clobber(l) // result: (XORQload x [off] {sym} ptr mem) for { - _ = v.Args[1] + x := v.Args[1] l := v.Args[0] if l.Op != OpAMD64MOVQload { break } off := l.AuxInt sym := l.Aux - _ = l.Args[1] - ptr := l.Args[0] mem := l.Args[1] - x := v.Args[1] + ptr := l.Args[0] if !(canMergeLoadClobber(v, l, x) && clobber(l)) { break } @@ -57431,14 +56203,13 @@ func rewriteValueAMD64_OpAMD64XORQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break } off2 := v_0.AuxInt base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2)) { break } @@ -57455,7 +56226,7 @@ func rewriteValueAMD64_OpAMD64XORQconstmodify_0(v *Value) bool { for { valoff1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -57463,7 +56234,6 @@ func rewriteValueAMD64_OpAMD64XORQconstmodify_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(ValAndOff(valoff1).canAdd(off2) && canMergeSym(sym1, sym2)) { break } @@ -57485,7 +56255,7 @@ func rewriteValueAMD64_OpAMD64XORQload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64ADDQconst { @@ -57493,7 +56263,6 @@ func rewriteValueAMD64_OpAMD64XORQload_0(v *Value) bool { } off2 := v_1.AuxInt base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -57511,7 +56280,7 @@ func rewriteValueAMD64_OpAMD64XORQload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] val := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpAMD64LEAQ { @@ -57520,7 +56289,6 @@ func rewriteValueAMD64_OpAMD64XORQload_0(v *Value) bool { off2 := v_1.AuxInt sym2 := v_1.Aux base := v_1.Args[0] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -57572,7 +56340,7 @@ func rewriteValueAMD64_OpAMD64XORQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64ADDQconst { break @@ -57580,7 +56348,6 @@ func rewriteValueAMD64_OpAMD64XORQmodify_0(v *Value) bool { off2 := v_0.AuxInt base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -57598,7 +56365,7 @@ func rewriteValueAMD64_OpAMD64XORQmodify_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpAMD64LEAQ { break @@ -57607,7 +56374,6 @@ func rewriteValueAMD64_OpAMD64XORQmodify_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -57626,9 +56392,8 @@ func rewriteValueAMD64_OpAdd16_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDL) v.AddArg(x) v.AddArg(y) @@ -57640,9 +56405,8 @@ func rewriteValueAMD64_OpAdd32_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDL) v.AddArg(x) v.AddArg(y) @@ -57654,9 +56418,8 @@ func rewriteValueAMD64_OpAdd32F_0(v *Value) bool { // cond: // result: (ADDSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDSS) v.AddArg(x) v.AddArg(y) @@ -57668,9 +56431,8 @@ func rewriteValueAMD64_OpAdd64_0(v *Value) bool { // cond: // result: (ADDQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDQ) v.AddArg(x) v.AddArg(y) @@ -57682,9 +56444,8 @@ func rewriteValueAMD64_OpAdd64F_0(v *Value) bool { // cond: // result: (ADDSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDSD) v.AddArg(x) v.AddArg(y) @@ -57696,9 +56457,8 @@ func rewriteValueAMD64_OpAdd8_0(v *Value) bool { // cond: // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ADDL) v.AddArg(x) v.AddArg(y) @@ -57712,9 +56472,8 @@ func rewriteValueAMD64_OpAddPtr_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (ADDQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 8) { break } @@ -57727,9 +56486,8 @@ func rewriteValueAMD64_OpAddPtr_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (ADDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 4) { break } @@ -57778,9 +56536,8 @@ func rewriteValueAMD64_OpAnd16_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ANDL) v.AddArg(x) v.AddArg(y) @@ -57792,9 +56549,8 @@ func rewriteValueAMD64_OpAnd32_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ANDL) v.AddArg(x) v.AddArg(y) @@ -57806,9 +56562,8 @@ func rewriteValueAMD64_OpAnd64_0(v *Value) bool { // cond: // result: (ANDQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ANDQ) v.AddArg(x) v.AddArg(y) @@ -57820,9 +56575,8 @@ func rewriteValueAMD64_OpAnd8_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ANDL) v.AddArg(x) v.AddArg(y) @@ -57834,9 +56588,8 @@ func rewriteValueAMD64_OpAndB_0(v *Value) bool { // cond: // result: (ANDL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ANDL) v.AddArg(x) v.AddArg(y) @@ -57850,10 +56603,9 @@ func rewriteValueAMD64_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (AddTupleFirst32 val (XADDLlock val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64AddTupleFirst32) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpAMD64XADDLlock, types.NewTuple(typ.UInt32, types.TypeMem)) @@ -57871,10 +56623,9 @@ func rewriteValueAMD64_OpAtomicAdd64_0(v *Value) bool { // cond: // result: (AddTupleFirst64 val (XADDQlock val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64AddTupleFirst64) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpAMD64XADDQlock, types.NewTuple(typ.UInt64, types.TypeMem)) @@ -57890,10 +56641,9 @@ func rewriteValueAMD64_OpAtomicAnd8_0(v *Value) bool { // cond: // result: (ANDBlock ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64ANDBlock) v.AddArg(ptr) v.AddArg(val) @@ -57906,11 +56656,10 @@ func rewriteValueAMD64_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (CMPXCHGLlock ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64CMPXCHGLlock) v.AddArg(ptr) v.AddArg(old) @@ -57924,11 +56673,10 @@ func rewriteValueAMD64_OpAtomicCompareAndSwap64_0(v *Value) bool { // cond: // result: (CMPXCHGQlock ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpAMD64CMPXCHGQlock) v.AddArg(ptr) v.AddArg(old) @@ -57942,10 +56690,9 @@ func rewriteValueAMD64_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (XCHGL val ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64XCHGL) v.AddArg(val) v.AddArg(ptr) @@ -57958,10 +56705,9 @@ func rewriteValueAMD64_OpAtomicExchange64_0(v *Value) bool { // cond: // result: (XCHGQ val ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64XCHGQ) v.AddArg(val) v.AddArg(ptr) @@ -57974,9 +56720,8 @@ func rewriteValueAMD64_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (MOVLatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64MOVLatomicload) v.AddArg(ptr) v.AddArg(mem) @@ -57988,9 +56733,8 @@ func rewriteValueAMD64_OpAtomicLoad64_0(v *Value) bool { // cond: // result: (MOVQatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64MOVQatomicload) v.AddArg(ptr) v.AddArg(mem) @@ -58004,9 +56748,8 @@ func rewriteValueAMD64_OpAtomicLoadPtr_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (MOVQatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(config.PtrSize == 8) { break } @@ -58019,9 +56762,8 @@ func rewriteValueAMD64_OpAtomicLoadPtr_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (MOVLatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(config.PtrSize == 4) { break } @@ -58037,10 +56779,9 @@ func rewriteValueAMD64_OpAtomicOr8_0(v *Value) bool { // cond: // result: (ORBlock ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64ORBlock) v.AddArg(ptr) v.AddArg(val) @@ -58055,10 +56796,9 @@ func rewriteValueAMD64_OpAtomicStore32_0(v *Value) bool { // cond: // result: (Select1 (XCHGL val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64XCHGL, types.NewTuple(typ.UInt32, types.TypeMem)) v0.AddArg(val) @@ -58075,10 +56815,9 @@ func rewriteValueAMD64_OpAtomicStore64_0(v *Value) bool { // cond: // result: (Select1 (XCHGQ val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64XCHGQ, types.NewTuple(typ.UInt64, types.TypeMem)) v0.AddArg(val) @@ -58096,10 +56835,9 @@ func rewriteValueAMD64_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (Select1 (XCHGQ val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(config.PtrSize == 8) { break } @@ -58115,10 +56853,9 @@ func rewriteValueAMD64_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (Select1 (XCHGL val ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(config.PtrSize == 4) { break } @@ -58137,9 +56874,8 @@ func rewriteValueAMD64_OpAvg64u_0(v *Value) bool { // cond: // result: (AVGQU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64AVGQU) v.AddArg(x) v.AddArg(y) @@ -58280,10 +57016,9 @@ func rewriteValueAMD64_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64CALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -59280,10 +58015,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CondSelect x y (MOVBQZX check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 1) { break } @@ -59301,10 +58035,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CondSelect x y (MOVWQZX check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 2) { break } @@ -59322,10 +58055,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CondSelect x y (MOVLQZX check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 4) { break } @@ -59343,10 +58075,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CMOVQNE y x (CMPQconst [0] check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 8 && (is64BitInt(t) || isPtr(t))) { break } @@ -59364,10 +58095,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CMOVLNE y x (CMPQconst [0] check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 8 && is32BitInt(t)) { break } @@ -59385,10 +58115,9 @@ func rewriteValueAMD64_OpCondSelect_40(v *Value) bool { // result: (CMOVWNE y x (CMPQconst [0] check)) for { t := v.Type - _ = v.Args[2] + check := v.Args[2] x := v.Args[0] y := v.Args[1] - check := v.Args[2] if !(!check.Type.IsFlags() && check.Type.Size() == 8 && is16BitInt(t)) { break } @@ -59746,10 +58475,9 @@ func rewriteValueAMD64_OpDiv128u_0(v *Value) bool { // cond: // result: (DIVQU2 xhi xlo y) for { - _ = v.Args[2] + y := v.Args[2] xhi := v.Args[0] xlo := v.Args[1] - y := v.Args[2] v.reset(OpAMD64DIVQU2) v.AddArg(xhi) v.AddArg(xlo) @@ -59765,9 +58493,8 @@ func rewriteValueAMD64_OpDiv16_0(v *Value) bool { // result: (Select0 (DIVW [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16)) v0.AuxInt = a @@ -59784,9 +58511,8 @@ func rewriteValueAMD64_OpDiv16u_0(v *Value) bool { // cond: // result: (Select0 (DIVWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16)) v0.AddArg(x) @@ -59803,9 +58529,8 @@ func rewriteValueAMD64_OpDiv32_0(v *Value) bool { // result: (Select0 (DIVL [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVL, types.NewTuple(typ.Int32, typ.Int32)) v0.AuxInt = a @@ -59820,9 +58545,8 @@ func rewriteValueAMD64_OpDiv32F_0(v *Value) bool { // cond: // result: (DIVSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64DIVSS) v.AddArg(x) v.AddArg(y) @@ -59836,9 +58560,8 @@ func rewriteValueAMD64_OpDiv32u_0(v *Value) bool { // cond: // result: (Select0 (DIVLU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVLU, types.NewTuple(typ.UInt32, typ.UInt32)) v0.AddArg(x) @@ -59855,9 +58578,8 @@ func rewriteValueAMD64_OpDiv64_0(v *Value) bool { // result: (Select0 (DIVQ [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVQ, types.NewTuple(typ.Int64, typ.Int64)) v0.AuxInt = a @@ -59872,9 +58594,8 @@ func rewriteValueAMD64_OpDiv64F_0(v *Value) bool { // cond: // result: (DIVSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64DIVSD) v.AddArg(x) v.AddArg(y) @@ -59888,9 +58609,8 @@ func rewriteValueAMD64_OpDiv64u_0(v *Value) bool { // cond: // result: (Select0 (DIVQU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVQU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -59906,9 +58626,8 @@ func rewriteValueAMD64_OpDiv8_0(v *Value) bool { // cond: // result: (Select0 (DIVW (SignExt8to16 x) (SignExt8to16 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16)) v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) @@ -59928,9 +58647,8 @@ func rewriteValueAMD64_OpDiv8u_0(v *Value) bool { // cond: // result: (Select0 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16)) v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) @@ -59949,9 +58667,8 @@ func rewriteValueAMD64_OpEq16_0(v *Value) bool { // cond: // result: (SETEQ (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -59966,9 +58683,8 @@ func rewriteValueAMD64_OpEq32_0(v *Value) bool { // cond: // result: (SETEQ (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -59983,9 +58699,8 @@ func rewriteValueAMD64_OpEq32F_0(v *Value) bool { // cond: // result: (SETEQF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -60000,9 +58715,8 @@ func rewriteValueAMD64_OpEq64_0(v *Value) bool { // cond: // result: (SETEQ (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60017,9 +58731,8 @@ func rewriteValueAMD64_OpEq64F_0(v *Value) bool { // cond: // result: (SETEQF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -60034,9 +58747,8 @@ func rewriteValueAMD64_OpEq8_0(v *Value) bool { // cond: // result: (SETEQ (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60051,9 +58763,8 @@ func rewriteValueAMD64_OpEqB_0(v *Value) bool { // cond: // result: (SETEQ (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETEQ) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60069,9 +58780,8 @@ func rewriteValueAMD64_OpEqPtr_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (SETEQ (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 8) { break } @@ -60086,9 +58796,8 @@ func rewriteValueAMD64_OpEqPtr_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (SETEQ (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 4) { break } @@ -60119,9 +58828,8 @@ func rewriteValueAMD64_OpGeq16_0(v *Value) bool { // cond: // result: (SETGE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGE) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60136,9 +58844,8 @@ func rewriteValueAMD64_OpGeq16U_0(v *Value) bool { // cond: // result: (SETAE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60153,9 +58860,8 @@ func rewriteValueAMD64_OpGeq32_0(v *Value) bool { // cond: // result: (SETGE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGE) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60170,9 +58876,8 @@ func rewriteValueAMD64_OpGeq32F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -60187,9 +58892,8 @@ func rewriteValueAMD64_OpGeq32U_0(v *Value) bool { // cond: // result: (SETAE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60204,9 +58908,8 @@ func rewriteValueAMD64_OpGeq64_0(v *Value) bool { // cond: // result: (SETGE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60221,9 +58924,8 @@ func rewriteValueAMD64_OpGeq64F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -60238,9 +58940,8 @@ func rewriteValueAMD64_OpGeq64U_0(v *Value) bool { // cond: // result: (SETAE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60255,9 +58956,8 @@ func rewriteValueAMD64_OpGeq8_0(v *Value) bool { // cond: // result: (SETGE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60272,9 +58972,8 @@ func rewriteValueAMD64_OpGeq8U_0(v *Value) bool { // cond: // result: (SETAE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETAE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60327,9 +59026,8 @@ func rewriteValueAMD64_OpGreater16_0(v *Value) bool { // cond: // result: (SETG (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETG) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60344,9 +59042,8 @@ func rewriteValueAMD64_OpGreater16U_0(v *Value) bool { // cond: // result: (SETA (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETA) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60361,9 +59058,8 @@ func rewriteValueAMD64_OpGreater32_0(v *Value) bool { // cond: // result: (SETG (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETG) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60378,9 +59074,8 @@ func rewriteValueAMD64_OpGreater32F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -60395,9 +59090,8 @@ func rewriteValueAMD64_OpGreater32U_0(v *Value) bool { // cond: // result: (SETA (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETA) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60412,9 +59106,8 @@ func rewriteValueAMD64_OpGreater64_0(v *Value) bool { // cond: // result: (SETG (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETG) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60429,9 +59122,8 @@ func rewriteValueAMD64_OpGreater64F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -60446,9 +59138,8 @@ func rewriteValueAMD64_OpGreater64U_0(v *Value) bool { // cond: // result: (SETA (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETA) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60463,9 +59154,8 @@ func rewriteValueAMD64_OpGreater8_0(v *Value) bool { // cond: // result: (SETG (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETG) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60480,9 +59170,8 @@ func rewriteValueAMD64_OpGreater8U_0(v *Value) bool { // cond: // result: (SETA (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETA) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60496,9 +59185,8 @@ func rewriteValueAMD64_OpHmul32_0(v *Value) bool { // cond: // result: (HMULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64HMULL) v.AddArg(x) v.AddArg(y) @@ -60510,9 +59198,8 @@ func rewriteValueAMD64_OpHmul32u_0(v *Value) bool { // cond: // result: (HMULLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64HMULLU) v.AddArg(x) v.AddArg(y) @@ -60524,9 +59211,8 @@ func rewriteValueAMD64_OpHmul64_0(v *Value) bool { // cond: // result: (HMULQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64HMULQ) v.AddArg(x) v.AddArg(y) @@ -60538,9 +59224,8 @@ func rewriteValueAMD64_OpHmul64u_0(v *Value) bool { // cond: // result: (HMULQU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64HMULQU) v.AddArg(x) v.AddArg(y) @@ -60565,9 +59250,8 @@ func rewriteValueAMD64_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpAMD64CALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -60582,9 +59266,8 @@ func rewriteValueAMD64_OpIsInBounds_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (SETB (CMPQ idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] if !(config.PtrSize == 8) { break } @@ -60599,9 +59282,8 @@ func rewriteValueAMD64_OpIsInBounds_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (SETB (CMPL idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] if !(config.PtrSize == 4) { break } @@ -60656,9 +59338,8 @@ func rewriteValueAMD64_OpIsSliceInBounds_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (SETBE (CMPQ idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] if !(config.PtrSize == 8) { break } @@ -60673,9 +59354,8 @@ func rewriteValueAMD64_OpIsSliceInBounds_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (SETBE (CMPL idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] if !(config.PtrSize == 4) { break } @@ -60694,9 +59374,8 @@ func rewriteValueAMD64_OpLeq16_0(v *Value) bool { // cond: // result: (SETLE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETLE) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60711,9 +59390,8 @@ func rewriteValueAMD64_OpLeq16U_0(v *Value) bool { // cond: // result: (SETBE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETBE) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60728,9 +59406,8 @@ func rewriteValueAMD64_OpLeq32_0(v *Value) bool { // cond: // result: (SETLE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETLE) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60745,9 +59422,8 @@ func rewriteValueAMD64_OpLeq32F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(y) @@ -60762,9 +59438,8 @@ func rewriteValueAMD64_OpLeq32U_0(v *Value) bool { // cond: // result: (SETBE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETBE) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60779,9 +59454,8 @@ func rewriteValueAMD64_OpLeq64_0(v *Value) bool { // cond: // result: (SETLE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETLE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60796,9 +59470,8 @@ func rewriteValueAMD64_OpLeq64F_0(v *Value) bool { // cond: // result: (SETGEF (UCOMISD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(y) @@ -60813,9 +59486,8 @@ func rewriteValueAMD64_OpLeq64U_0(v *Value) bool { // cond: // result: (SETBE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETBE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60830,9 +59502,8 @@ func rewriteValueAMD64_OpLeq8_0(v *Value) bool { // cond: // result: (SETLE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETLE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60847,9 +59518,8 @@ func rewriteValueAMD64_OpLeq8U_0(v *Value) bool { // cond: // result: (SETBE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETBE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -60864,9 +59534,8 @@ func rewriteValueAMD64_OpLess16_0(v *Value) bool { // cond: // result: (SETL (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETL) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60881,9 +59550,8 @@ func rewriteValueAMD64_OpLess16U_0(v *Value) bool { // cond: // result: (SETB (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -60898,9 +59566,8 @@ func rewriteValueAMD64_OpLess32_0(v *Value) bool { // cond: // result: (SETL (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETL) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60915,9 +59582,8 @@ func rewriteValueAMD64_OpLess32F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(y) @@ -60932,9 +59598,8 @@ func rewriteValueAMD64_OpLess32U_0(v *Value) bool { // cond: // result: (SETB (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -60949,9 +59614,8 @@ func rewriteValueAMD64_OpLess64_0(v *Value) bool { // cond: // result: (SETL (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETL) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -60966,9 +59630,8 @@ func rewriteValueAMD64_OpLess64F_0(v *Value) bool { // cond: // result: (SETGF (UCOMISD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETGF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(y) @@ -60983,9 +59646,8 @@ func rewriteValueAMD64_OpLess64U_0(v *Value) bool { // cond: // result: (SETB (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -61000,9 +59662,8 @@ func rewriteValueAMD64_OpLess8_0(v *Value) bool { // cond: // result: (SETL (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETL) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -61017,9 +59678,8 @@ func rewriteValueAMD64_OpLess8U_0(v *Value) bool { // cond: // result: (SETB (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETB) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -61036,9 +59696,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVQload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) || isPtr(t) && config.PtrSize == 8) { break } @@ -61052,9 +59711,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVLload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) || isPtr(t) && config.PtrSize == 4) { break } @@ -61068,9 +59726,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t)) { break } @@ -61084,9 +59741,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean() || is8BitInt(t)) { break } @@ -61100,9 +59756,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVSSload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -61116,9 +59771,8 @@ func rewriteValueAMD64_OpLoad_0(v *Value) bool { // result: (MOVSDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -61171,9 +59825,8 @@ func rewriteValueAMD64_OpLsh16x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61194,9 +59847,8 @@ func rewriteValueAMD64_OpLsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61214,9 +59866,8 @@ func rewriteValueAMD64_OpLsh16x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61237,9 +59888,8 @@ func rewriteValueAMD64_OpLsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61257,9 +59907,8 @@ func rewriteValueAMD64_OpLsh16x64_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61280,9 +59929,8 @@ func rewriteValueAMD64_OpLsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61300,9 +59948,8 @@ func rewriteValueAMD64_OpLsh16x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61323,9 +59970,8 @@ func rewriteValueAMD64_OpLsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61343,9 +59989,8 @@ func rewriteValueAMD64_OpLsh32x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61366,9 +60011,8 @@ func rewriteValueAMD64_OpLsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61386,9 +60030,8 @@ func rewriteValueAMD64_OpLsh32x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61409,9 +60052,8 @@ func rewriteValueAMD64_OpLsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61429,9 +60071,8 @@ func rewriteValueAMD64_OpLsh32x64_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61452,9 +60093,8 @@ func rewriteValueAMD64_OpLsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61472,9 +60112,8 @@ func rewriteValueAMD64_OpLsh32x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61495,9 +60134,8 @@ func rewriteValueAMD64_OpLsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61515,9 +60153,8 @@ func rewriteValueAMD64_OpLsh64x16_0(v *Value) bool { // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPWconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61538,9 +60175,8 @@ func rewriteValueAMD64_OpLsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61558,9 +60194,8 @@ func rewriteValueAMD64_OpLsh64x32_0(v *Value) bool { // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPLconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61581,9 +60216,8 @@ func rewriteValueAMD64_OpLsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61601,9 +60235,8 @@ func rewriteValueAMD64_OpLsh64x64_0(v *Value) bool { // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPQconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61624,9 +60257,8 @@ func rewriteValueAMD64_OpLsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61644,9 +60276,8 @@ func rewriteValueAMD64_OpLsh64x8_0(v *Value) bool { // result: (ANDQ (SHLQ x y) (SBBQcarrymask (CMPBconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61667,9 +60298,8 @@ func rewriteValueAMD64_OpLsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61687,9 +60317,8 @@ func rewriteValueAMD64_OpLsh8x16_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61710,9 +60339,8 @@ func rewriteValueAMD64_OpLsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61730,9 +60358,8 @@ func rewriteValueAMD64_OpLsh8x32_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61753,9 +60380,8 @@ func rewriteValueAMD64_OpLsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61773,9 +60399,8 @@ func rewriteValueAMD64_OpLsh8x64_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPQconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61796,9 +60421,8 @@ func rewriteValueAMD64_OpLsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61816,9 +60440,8 @@ func rewriteValueAMD64_OpLsh8x8_0(v *Value) bool { // result: (ANDL (SHLL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -61839,9 +60462,8 @@ func rewriteValueAMD64_OpLsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -61860,9 +60482,8 @@ func rewriteValueAMD64_OpMod16_0(v *Value) bool { // result: (Select1 (DIVW [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16)) v0.AuxInt = a @@ -61879,9 +60500,8 @@ func rewriteValueAMD64_OpMod16u_0(v *Value) bool { // cond: // result: (Select1 (DIVWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16)) v0.AddArg(x) @@ -61898,9 +60518,8 @@ func rewriteValueAMD64_OpMod32_0(v *Value) bool { // result: (Select1 (DIVL [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVL, types.NewTuple(typ.Int32, typ.Int32)) v0.AuxInt = a @@ -61917,9 +60536,8 @@ func rewriteValueAMD64_OpMod32u_0(v *Value) bool { // cond: // result: (Select1 (DIVLU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVLU, types.NewTuple(typ.UInt32, typ.UInt32)) v0.AddArg(x) @@ -61936,9 +60554,8 @@ func rewriteValueAMD64_OpMod64_0(v *Value) bool { // result: (Select1 (DIVQ [a] x y)) for { a := v.AuxInt - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVQ, types.NewTuple(typ.Int64, typ.Int64)) v0.AuxInt = a @@ -61955,9 +60572,8 @@ func rewriteValueAMD64_OpMod64u_0(v *Value) bool { // cond: // result: (Select1 (DIVQU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVQU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -61973,9 +60589,8 @@ func rewriteValueAMD64_OpMod8_0(v *Value) bool { // cond: // result: (Select1 (DIVW (SignExt8to16 x) (SignExt8to16 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVW, types.NewTuple(typ.Int16, typ.Int16)) v1 := b.NewValue0(v.Pos, OpSignExt8to16, typ.Int16) @@ -61995,9 +60610,8 @@ func rewriteValueAMD64_OpMod8u_0(v *Value) bool { // cond: // result: (Select1 (DIVWU (ZeroExt8to16 x) (ZeroExt8to16 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpAMD64DIVWU, types.NewTuple(typ.UInt16, typ.UInt16)) v1 := b.NewValue0(v.Pos, OpZeroExt8to16, typ.UInt16) @@ -62021,7 +60635,6 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -62035,10 +60648,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpAMD64MOVBload, typ.UInt8) @@ -62055,10 +60667,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVWstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpAMD64MOVWload, typ.UInt16) @@ -62075,10 +60686,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpAMD64MOVLload, typ.UInt32) @@ -62095,10 +60705,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVQstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpAMD64MOVQload, typ.UInt64) @@ -62115,10 +60724,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(config.useSSE) { break } @@ -62138,10 +60746,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(!config.useSSE) { break } @@ -62170,10 +60777,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 32 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMove) v.AuxInt = 16 v0 := b.NewValue0(v.Pos, OpOffPtr, dst.Type) @@ -62199,10 +60805,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 48 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(config.useSSE) { break } @@ -62231,10 +60836,9 @@ func rewriteValueAMD64_OpMove_0(v *Value) bool { if v.AuxInt != 64 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(config.useSSE) { break } @@ -62269,10 +60873,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -62298,10 +60901,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = 4 v.AddArg(dst) @@ -62327,10 +60929,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVWstore) v.AuxInt = 4 v.AddArg(dst) @@ -62356,10 +60957,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AuxInt = 3 v.AddArg(dst) @@ -62385,10 +60985,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 9 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVBstore) v.AuxInt = 8 v.AddArg(dst) @@ -62414,10 +61013,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 10 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVWstore) v.AuxInt = 8 v.AddArg(dst) @@ -62443,10 +61041,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { if v.AuxInt != 12 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64MOVLstore) v.AuxInt = 8 v.AddArg(dst) @@ -62470,10 +61067,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { // result: (MOVQstore [s-8] dst (MOVQload [s-8] src mem) (MOVQstore dst (MOVQload src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s == 11 || s >= 13 && s <= 15) { break } @@ -62500,10 +61096,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (MOVQstore dst (MOVQload src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 && s%16 != 0 && s%16 <= 8) { break } @@ -62532,10 +61127,9 @@ func rewriteValueAMD64_OpMove_10(v *Value) bool { // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (MOVOstore dst (MOVOload src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 && s%16 != 0 && s%16 > 8 && config.useSSE) { break } @@ -62570,10 +61164,9 @@ func rewriteValueAMD64_OpMove_20(v *Value) bool { // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (MOVQstore [8] dst (MOVQload [8] src mem) (MOVQstore dst (MOVQload src mem) mem))) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 && s%16 != 0 && s%16 > 8 && !config.useSSE) { break } @@ -62611,10 +61204,9 @@ func rewriteValueAMD64_OpMove_20(v *Value) bool { // result: (DUFFCOPY [14*(64-s/16)] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 64 && s <= 16*64 && s%16 == 0 && !config.noDuffDevice) { break } @@ -62630,10 +61222,9 @@ func rewriteValueAMD64_OpMove_20(v *Value) bool { // result: (REPMOVSQ dst src (MOVQconst [s/8]) mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !((s > 16*64 || config.noDuffDevice) && s%8 == 0) { break } @@ -62653,9 +61244,8 @@ func rewriteValueAMD64_OpMul16_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULL) v.AddArg(x) v.AddArg(y) @@ -62667,9 +61257,8 @@ func rewriteValueAMD64_OpMul32_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULL) v.AddArg(x) v.AddArg(y) @@ -62681,9 +61270,8 @@ func rewriteValueAMD64_OpMul32F_0(v *Value) bool { // cond: // result: (MULSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULSS) v.AddArg(x) v.AddArg(y) @@ -62695,9 +61283,8 @@ func rewriteValueAMD64_OpMul64_0(v *Value) bool { // cond: // result: (MULQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULQ) v.AddArg(x) v.AddArg(y) @@ -62709,9 +61296,8 @@ func rewriteValueAMD64_OpMul64F_0(v *Value) bool { // cond: // result: (MULSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULSD) v.AddArg(x) v.AddArg(y) @@ -62723,9 +61309,8 @@ func rewriteValueAMD64_OpMul64uhilo_0(v *Value) bool { // cond: // result: (MULQU2 x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULQU2) v.AddArg(x) v.AddArg(y) @@ -62737,9 +61322,8 @@ func rewriteValueAMD64_OpMul8_0(v *Value) bool { // cond: // result: (MULL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64MULL) v.AddArg(x) v.AddArg(y) @@ -62828,9 +61412,8 @@ func rewriteValueAMD64_OpNeq16_0(v *Value) bool { // cond: // result: (SETNE (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPW, types.TypeFlags) v0.AddArg(x) @@ -62845,9 +61428,8 @@ func rewriteValueAMD64_OpNeq32_0(v *Value) bool { // cond: // result: (SETNE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPL, types.TypeFlags) v0.AddArg(x) @@ -62862,9 +61444,8 @@ func rewriteValueAMD64_OpNeq32F_0(v *Value) bool { // cond: // result: (SETNEF (UCOMISS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISS, types.TypeFlags) v0.AddArg(x) @@ -62879,9 +61460,8 @@ func rewriteValueAMD64_OpNeq64_0(v *Value) bool { // cond: // result: (SETNE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPQ, types.TypeFlags) v0.AddArg(x) @@ -62896,9 +61476,8 @@ func rewriteValueAMD64_OpNeq64F_0(v *Value) bool { // cond: // result: (SETNEF (UCOMISD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNEF) v0 := b.NewValue0(v.Pos, OpAMD64UCOMISD, types.TypeFlags) v0.AddArg(x) @@ -62913,9 +61492,8 @@ func rewriteValueAMD64_OpNeq8_0(v *Value) bool { // cond: // result: (SETNE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -62930,9 +61508,8 @@ func rewriteValueAMD64_OpNeqB_0(v *Value) bool { // cond: // result: (SETNE (CMPB x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SETNE) v0 := b.NewValue0(v.Pos, OpAMD64CMPB, types.TypeFlags) v0.AddArg(x) @@ -62948,9 +61525,8 @@ func rewriteValueAMD64_OpNeqPtr_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (SETNE (CMPQ x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 8) { break } @@ -62965,9 +61541,8 @@ func rewriteValueAMD64_OpNeqPtr_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (SETNE (CMPL x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 4) { break } @@ -62985,9 +61560,8 @@ func rewriteValueAMD64_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64LoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -63061,9 +61635,8 @@ func rewriteValueAMD64_OpOr16_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ORL) v.AddArg(x) v.AddArg(y) @@ -63075,9 +61648,8 @@ func rewriteValueAMD64_OpOr32_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ORL) v.AddArg(x) v.AddArg(y) @@ -63089,9 +61661,8 @@ func rewriteValueAMD64_OpOr64_0(v *Value) bool { // cond: // result: (ORQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ORQ) v.AddArg(x) v.AddArg(y) @@ -63103,9 +61674,8 @@ func rewriteValueAMD64_OpOr8_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ORL) v.AddArg(x) v.AddArg(y) @@ -63117,9 +61687,8 @@ func rewriteValueAMD64_OpOrB_0(v *Value) bool { // cond: // result: (ORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64ORL) v.AddArg(x) v.AddArg(y) @@ -63183,9 +61752,8 @@ func rewriteValueAMD64_OpRotateLeft16_0(v *Value) bool { // cond: // result: (ROLW a b) for { - _ = v.Args[1] - a := v.Args[0] b := v.Args[1] + a := v.Args[0] v.reset(OpAMD64ROLW) v.AddArg(a) v.AddArg(b) @@ -63197,9 +61765,8 @@ func rewriteValueAMD64_OpRotateLeft32_0(v *Value) bool { // cond: // result: (ROLL a b) for { - _ = v.Args[1] - a := v.Args[0] b := v.Args[1] + a := v.Args[0] v.reset(OpAMD64ROLL) v.AddArg(a) v.AddArg(b) @@ -63211,9 +61778,8 @@ func rewriteValueAMD64_OpRotateLeft64_0(v *Value) bool { // cond: // result: (ROLQ a b) for { - _ = v.Args[1] - a := v.Args[0] b := v.Args[1] + a := v.Args[0] v.reset(OpAMD64ROLQ) v.AddArg(a) v.AddArg(b) @@ -63225,9 +61791,8 @@ func rewriteValueAMD64_OpRotateLeft8_0(v *Value) bool { // cond: // result: (ROLB a b) for { - _ = v.Args[1] - a := v.Args[0] b := v.Args[1] + a := v.Args[0] v.reset(OpAMD64ROLB) v.AddArg(a) v.AddArg(b) @@ -63277,9 +61842,8 @@ func rewriteValueAMD64_OpRsh16Ux16_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPWconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63300,9 +61864,8 @@ func rewriteValueAMD64_OpRsh16Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63320,9 +61883,8 @@ func rewriteValueAMD64_OpRsh16Ux32_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPLconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63343,9 +61905,8 @@ func rewriteValueAMD64_OpRsh16Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63363,9 +61924,8 @@ func rewriteValueAMD64_OpRsh16Ux64_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPQconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63386,9 +61946,8 @@ func rewriteValueAMD64_OpRsh16Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63406,9 +61965,8 @@ func rewriteValueAMD64_OpRsh16Ux8_0(v *Value) bool { // result: (ANDL (SHRW x y) (SBBLcarrymask (CMPBconst y [16]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63429,9 +61987,8 @@ func rewriteValueAMD64_OpRsh16Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63449,9 +62006,8 @@ func rewriteValueAMD64_OpRsh16x16_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63475,9 +62031,8 @@ func rewriteValueAMD64_OpRsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63495,9 +62050,8 @@ func rewriteValueAMD64_OpRsh16x32_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63521,9 +62075,8 @@ func rewriteValueAMD64_OpRsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63541,9 +62094,8 @@ func rewriteValueAMD64_OpRsh16x64_0(v *Value) bool { // result: (SARW x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63567,9 +62119,8 @@ func rewriteValueAMD64_OpRsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63587,9 +62138,8 @@ func rewriteValueAMD64_OpRsh16x8_0(v *Value) bool { // result: (SARW x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [16]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63613,9 +62163,8 @@ func rewriteValueAMD64_OpRsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63633,9 +62182,8 @@ func rewriteValueAMD64_OpRsh32Ux16_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPWconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63656,9 +62204,8 @@ func rewriteValueAMD64_OpRsh32Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63676,9 +62223,8 @@ func rewriteValueAMD64_OpRsh32Ux32_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPLconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63699,9 +62245,8 @@ func rewriteValueAMD64_OpRsh32Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63719,9 +62264,8 @@ func rewriteValueAMD64_OpRsh32Ux64_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPQconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63742,9 +62286,8 @@ func rewriteValueAMD64_OpRsh32Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63762,9 +62305,8 @@ func rewriteValueAMD64_OpRsh32Ux8_0(v *Value) bool { // result: (ANDL (SHRL x y) (SBBLcarrymask (CMPBconst y [32]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63785,9 +62327,8 @@ func rewriteValueAMD64_OpRsh32Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63805,9 +62346,8 @@ func rewriteValueAMD64_OpRsh32x16_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63831,9 +62371,8 @@ func rewriteValueAMD64_OpRsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63851,9 +62390,8 @@ func rewriteValueAMD64_OpRsh32x32_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63877,9 +62415,8 @@ func rewriteValueAMD64_OpRsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63897,9 +62434,8 @@ func rewriteValueAMD64_OpRsh32x64_0(v *Value) bool { // result: (SARL x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63923,9 +62459,8 @@ func rewriteValueAMD64_OpRsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63943,9 +62478,8 @@ func rewriteValueAMD64_OpRsh32x8_0(v *Value) bool { // result: (SARL x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [32]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -63969,9 +62503,8 @@ func rewriteValueAMD64_OpRsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -63989,9 +62522,8 @@ func rewriteValueAMD64_OpRsh64Ux16_0(v *Value) bool { // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPWconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64012,9 +62544,8 @@ func rewriteValueAMD64_OpRsh64Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64032,9 +62563,8 @@ func rewriteValueAMD64_OpRsh64Ux32_0(v *Value) bool { // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPLconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64055,9 +62585,8 @@ func rewriteValueAMD64_OpRsh64Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64075,9 +62604,8 @@ func rewriteValueAMD64_OpRsh64Ux64_0(v *Value) bool { // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPQconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64098,9 +62626,8 @@ func rewriteValueAMD64_OpRsh64Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64118,9 +62645,8 @@ func rewriteValueAMD64_OpRsh64Ux8_0(v *Value) bool { // result: (ANDQ (SHRQ x y) (SBBQcarrymask (CMPBconst y [64]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64141,9 +62667,8 @@ func rewriteValueAMD64_OpRsh64Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64161,9 +62686,8 @@ func rewriteValueAMD64_OpRsh64x16_0(v *Value) bool { // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [64]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64187,9 +62711,8 @@ func rewriteValueAMD64_OpRsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64207,9 +62730,8 @@ func rewriteValueAMD64_OpRsh64x32_0(v *Value) bool { // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [64]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64233,9 +62755,8 @@ func rewriteValueAMD64_OpRsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64253,9 +62774,8 @@ func rewriteValueAMD64_OpRsh64x64_0(v *Value) bool { // result: (SARQ x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [64]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64279,9 +62799,8 @@ func rewriteValueAMD64_OpRsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64299,9 +62818,8 @@ func rewriteValueAMD64_OpRsh64x8_0(v *Value) bool { // result: (SARQ x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [64]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64325,9 +62843,8 @@ func rewriteValueAMD64_OpRsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64345,9 +62862,8 @@ func rewriteValueAMD64_OpRsh8Ux16_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPWconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64368,9 +62884,8 @@ func rewriteValueAMD64_OpRsh8Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64388,9 +62903,8 @@ func rewriteValueAMD64_OpRsh8Ux32_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPLconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64411,9 +62925,8 @@ func rewriteValueAMD64_OpRsh8Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64431,9 +62944,8 @@ func rewriteValueAMD64_OpRsh8Ux64_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPQconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64454,9 +62966,8 @@ func rewriteValueAMD64_OpRsh8Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64474,9 +62985,8 @@ func rewriteValueAMD64_OpRsh8Ux8_0(v *Value) bool { // result: (ANDL (SHRB x y) (SBBLcarrymask (CMPBconst y [8]))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64497,9 +63007,8 @@ func rewriteValueAMD64_OpRsh8Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SHRB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64517,9 +63026,8 @@ func rewriteValueAMD64_OpRsh8x16_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPWconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64543,9 +63051,8 @@ func rewriteValueAMD64_OpRsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64563,9 +63070,8 @@ func rewriteValueAMD64_OpRsh8x32_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPLconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64589,9 +63095,8 @@ func rewriteValueAMD64_OpRsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64609,9 +63114,8 @@ func rewriteValueAMD64_OpRsh8x64_0(v *Value) bool { // result: (SARB x (ORQ y (NOTQ (SBBQcarrymask (CMPQconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64635,9 +63139,8 @@ func rewriteValueAMD64_OpRsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64655,9 +63158,8 @@ func rewriteValueAMD64_OpRsh8x8_0(v *Value) bool { // result: (SARB x (ORL y (NOTL (SBBLcarrymask (CMPBconst y [8]))))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(!shiftIsBounded(v)) { break } @@ -64681,9 +63183,8 @@ func rewriteValueAMD64_OpRsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SARB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -64705,9 +63206,8 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpMul64uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSelect0) v.Type = typ.UInt64 v0 := b.NewValue0(v.Pos, OpAMD64MULQU, types.NewTuple(typ.UInt64, types.TypeFlags)) @@ -64724,9 +63224,8 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpMul32uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSelect0) v.Type = typ.UInt32 v0 := b.NewValue0(v.Pos, OpAMD64MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) @@ -64743,10 +63242,9 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpAdd64carry { break } - _ = v_0.Args[2] + c := v_0.Args[2] x := v_0.Args[0] y := v_0.Args[1] - c := v_0.Args[2] v.reset(OpSelect0) v.Type = typ.UInt64 v0 := b.NewValue0(v.Pos, OpAMD64ADCQ, types.NewTuple(typ.UInt64, types.TypeFlags)) @@ -64768,10 +63266,9 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpSub64borrow { break } - _ = v_0.Args[2] + c := v_0.Args[2] x := v_0.Args[0] y := v_0.Args[1] - c := v_0.Args[2] v.reset(OpSelect0) v.Type = typ.UInt64 v0 := b.NewValue0(v.Pos, OpAMD64SBBQ, types.NewTuple(typ.UInt64, types.TypeFlags)) @@ -64794,9 +63291,8 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpAMD64AddTupleFirst32 { break } - _ = v_0.Args[1] - val := v_0.Args[0] tuple := v_0.Args[1] + val := v_0.Args[0] v.reset(OpAMD64ADDL) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpSelect0, t) @@ -64813,9 +63309,8 @@ func rewriteValueAMD64_OpSelect0_0(v *Value) bool { if v_0.Op != OpAMD64AddTupleFirst64 { break } - _ = v_0.Args[1] - val := v_0.Args[0] tuple := v_0.Args[1] + val := v_0.Args[0] v.reset(OpAMD64ADDQ) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpSelect0, t) @@ -64836,9 +63331,8 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMul64uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64SETO) v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpAMD64MULQU, types.NewTuple(typ.UInt64, types.TypeFlags)) @@ -64856,9 +63350,8 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMul32uover { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpAMD64SETO) v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpAMD64MULLU, types.NewTuple(typ.UInt32, types.TypeFlags)) @@ -64876,10 +63369,9 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpAdd64carry { break } - _ = v_0.Args[2] + c := v_0.Args[2] x := v_0.Args[0] y := v_0.Args[1] - c := v_0.Args[2] v.reset(OpAMD64NEGQ) v.Type = typ.UInt64 v0 := b.NewValue0(v.Pos, OpAMD64SBBQcarrymask, typ.UInt64) @@ -64905,10 +63397,9 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpSub64borrow { break } - _ = v_0.Args[2] + c := v_0.Args[2] x := v_0.Args[0] y := v_0.Args[1] - c := v_0.Args[2] v.reset(OpAMD64NEGQ) v.Type = typ.UInt64 v0 := b.NewValue0(v.Pos, OpAMD64SBBQcarrymask, typ.UInt64) @@ -64974,7 +63465,6 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpAMD64AddTupleFirst32 { break } - _ = v_0.Args[1] tuple := v_0.Args[1] v.reset(OpSelect1) v.AddArg(tuple) @@ -64988,7 +63478,6 @@ func rewriteValueAMD64_OpSelect1_0(v *Value) bool { if v_0.Op != OpAMD64AddTupleFirst64 { break } - _ = v_0.Args[1] tuple := v_0.Args[1] v.reset(OpSelect1) v.AddArg(tuple) @@ -65110,10 +63599,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVSDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -65128,10 +63616,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVSSstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -65146,10 +63633,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVQstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8) { break } @@ -65164,10 +63650,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVLstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4) { break } @@ -65182,10 +63667,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -65200,10 +63684,9 @@ func rewriteValueAMD64_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -65220,9 +63703,8 @@ func rewriteValueAMD64_OpSub16_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBL) v.AddArg(x) v.AddArg(y) @@ -65234,9 +63716,8 @@ func rewriteValueAMD64_OpSub32_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBL) v.AddArg(x) v.AddArg(y) @@ -65248,9 +63729,8 @@ func rewriteValueAMD64_OpSub32F_0(v *Value) bool { // cond: // result: (SUBSS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBSS) v.AddArg(x) v.AddArg(y) @@ -65262,9 +63742,8 @@ func rewriteValueAMD64_OpSub64_0(v *Value) bool { // cond: // result: (SUBQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBQ) v.AddArg(x) v.AddArg(y) @@ -65276,9 +63755,8 @@ func rewriteValueAMD64_OpSub64F_0(v *Value) bool { // cond: // result: (SUBSD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBSD) v.AddArg(x) v.AddArg(y) @@ -65290,9 +63768,8 @@ func rewriteValueAMD64_OpSub8_0(v *Value) bool { // cond: // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64SUBL) v.AddArg(x) v.AddArg(y) @@ -65306,9 +63783,8 @@ func rewriteValueAMD64_OpSubPtr_0(v *Value) bool { // cond: config.PtrSize == 8 // result: (SUBQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 8) { break } @@ -65321,9 +63797,8 @@ func rewriteValueAMD64_OpSubPtr_0(v *Value) bool { // cond: config.PtrSize == 4 // result: (SUBL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(config.PtrSize == 4) { break } @@ -65424,10 +63899,9 @@ func rewriteValueAMD64_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64LoweredWB) v.Aux = fn v.AddArg(destptr) @@ -65441,9 +63915,8 @@ func rewriteValueAMD64_OpXor16_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64XORL) v.AddArg(x) v.AddArg(y) @@ -65455,9 +63928,8 @@ func rewriteValueAMD64_OpXor32_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64XORL) v.AddArg(x) v.AddArg(y) @@ -65469,9 +63941,8 @@ func rewriteValueAMD64_OpXor64_0(v *Value) bool { // cond: // result: (XORQ x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64XORQ) v.AddArg(x) v.AddArg(y) @@ -65483,9 +63954,8 @@ func rewriteValueAMD64_OpXor8_0(v *Value) bool { // cond: // result: (XORL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAMD64XORL) v.AddArg(x) v.AddArg(y) @@ -65502,7 +63972,6 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -65516,9 +63985,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVBstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -65532,9 +64000,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVWstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -65548,9 +64015,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVLstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -65564,9 +64030,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVQstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -65580,9 +64045,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVBstoreconst) v.AuxInt = makeValAndOff(0, 2) v.AddArg(destptr) @@ -65600,9 +64064,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVBstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -65620,9 +64083,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVWstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -65640,9 +64102,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpAMD64MOVLstoreconst) v.AuxInt = makeValAndOff(0, 3) v.AddArg(destptr) @@ -65658,9 +64119,8 @@ func rewriteValueAMD64_OpZero_0(v *Value) bool { // result: (Zero [s-s%8] (OffPtr destptr [s%8]) (MOVQstoreconst [0] destptr mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%8 != 0 && s > 8 && !config.useSSE) { break } @@ -65689,9 +64149,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(!config.useSSE) { break } @@ -65712,9 +64171,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 24 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(!config.useSSE) { break } @@ -65739,9 +64197,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 32 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(!config.useSSE) { break } @@ -65768,9 +64225,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { // result: (MOVQstoreconst [makeValAndOff(0,s-8)] destptr (MOVQstoreconst [0] destptr mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s > 8 && s < 16 && config.useSSE) { break } @@ -65789,9 +64245,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { // result: (Zero [s-s%16] (OffPtr destptr [s%16]) (MOVOstore destptr (MOVOconst [0]) mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%16 != 0 && s > 16 && s%16 > 8 && config.useSSE) { break } @@ -65815,9 +64270,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { // result: (Zero [s-s%16] (OffPtr destptr [s%16]) (MOVQstoreconst [0] destptr mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%16 != 0 && s > 16 && s%16 <= 8 && config.useSSE) { break } @@ -65841,9 +64295,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(config.useSSE) { break } @@ -65862,9 +64315,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 32 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(config.useSSE) { break } @@ -65892,9 +64344,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 48 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(config.useSSE) { break } @@ -65931,9 +64382,8 @@ func rewriteValueAMD64_OpZero_10(v *Value) bool { if v.AuxInt != 64 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(config.useSSE) { break } @@ -65983,9 +64433,8 @@ func rewriteValueAMD64_OpZero_20(v *Value) bool { // result: (DUFFZERO [s] destptr (MOVOconst [0]) mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s > 64 && s <= 1024 && s%16 == 0 && !config.noDuffDevice) { break } @@ -66003,9 +64452,8 @@ func rewriteValueAMD64_OpZero_20(v *Value) bool { // result: (REPSTOSQ destptr (MOVQconst [s/8]) (MOVQconst [0]) mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !((s > 1024 || (config.noDuffDevice && s > 64 || !config.useSSE && s > 32)) && s%8 == 0) { break } @@ -66105,12 +64553,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVLconst { break @@ -66118,8 +64566,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] - y := v.Args[1] if !(!config.nacl) { break } @@ -66145,7 +64591,7 @@ func rewriteBlockAMD64(b *Block) bool { if v_1.Op != OpAMD64SHLL { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVLconst { break @@ -66153,7 +64599,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_1_0.AuxInt != 1 { break } - x := v_1.Args[1] if !(!config.nacl) { break } @@ -66173,12 +64618,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break @@ -66186,8 +64631,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] - y := v.Args[1] if !(!config.nacl) { break } @@ -66213,7 +64656,7 @@ func rewriteBlockAMD64(b *Block) bool { if v_1.Op != OpAMD64SHLQ { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break @@ -66221,7 +64664,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_1_0.AuxInt != 1 { break } - x := v_1.Args[1] if !(!config.nacl) { break } @@ -66283,13 +64725,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -66335,7 +64776,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -66351,7 +64792,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -66407,7 +64847,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -66423,7 +64863,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -66479,7 +64918,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -66495,7 +64934,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -66551,7 +64989,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -66567,7 +65005,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -66623,7 +65060,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -66632,7 +65069,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -66681,7 +65117,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -66690,7 +65126,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -67951,12 +66386,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVLconst { break @@ -67964,8 +66399,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] - y := v.Args[1] if !(!config.nacl) { break } @@ -67991,7 +66424,7 @@ func rewriteBlockAMD64(b *Block) bool { if v_1.Op != OpAMD64SHLL { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVLconst { break @@ -67999,7 +66432,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_1_0.AuxInt != 1 { break } - x := v_1.Args[1] if !(!config.nacl) { break } @@ -68019,12 +66451,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpAMD64MOVQconst { break @@ -68032,8 +66464,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] - y := v.Args[1] if !(!config.nacl) { break } @@ -68059,7 +66489,7 @@ func rewriteBlockAMD64(b *Block) bool { if v_1.Op != OpAMD64SHLQ { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpAMD64MOVQconst { break @@ -68067,7 +66497,6 @@ func rewriteBlockAMD64(b *Block) bool { if v_1_0.AuxInt != 1 { break } - x := v_1.Args[1] if !(!config.nacl) { break } @@ -68129,13 +66558,12 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isUint64PowerOfTwo(c) && !config.nacl) { break } @@ -68181,7 +66609,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLQconst { break @@ -68197,7 +66625,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -68253,7 +66680,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLLconst { break @@ -68269,7 +66696,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -68325,7 +66751,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -68341,7 +66767,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -68397,7 +66822,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -68413,7 +66838,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1_0.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -68469,7 +66893,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTQ { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { break @@ -68478,7 +66902,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } @@ -68527,7 +66950,7 @@ func rewriteBlockAMD64(b *Block) bool { if v.Op != OpAMD64TESTL { break } - _ = v.Args[1] + z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { break @@ -68536,7 +66959,6 @@ func rewriteBlockAMD64(b *Block) bool { break } x := z1.Args[0] - z2 := v.Args[1] if !(z1 == z2 && !config.nacl) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 496e3168f6..e6635ad6b5 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -831,14 +831,13 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v.AddArg(x) @@ -849,14 +848,13 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v.AddArg(x) @@ -867,14 +865,13 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v.AddArg(x) @@ -885,14 +882,13 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v.AddArg(x) @@ -903,7 +899,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLLconst { @@ -911,7 +907,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftLL) v.AuxInt = c v.AddArg(x) @@ -923,7 +918,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -931,7 +926,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftLL) v.AuxInt = c v.AddArg(x) @@ -943,7 +937,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -951,7 +945,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftLL) v.AuxInt = c v.AddArg(x) @@ -963,7 +956,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLLconst { @@ -971,7 +964,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftLL) v.AuxInt = c v.AddArg(x) @@ -983,7 +975,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRLconst { @@ -991,7 +983,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftRL) v.AuxInt = c v.AddArg(x) @@ -1003,7 +994,7 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { // cond: // result: (ADCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -1011,7 +1002,6 @@ func rewriteValueARM_OpARMADC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRL) v.AuxInt = c v.AddArg(x) @@ -1026,7 +1016,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -1034,7 +1024,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRL) v.AuxInt = c v.AddArg(x) @@ -1046,7 +1035,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRLconst { @@ -1054,7 +1043,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftRL) v.AuxInt = c v.AddArg(x) @@ -1066,7 +1054,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRAconst { @@ -1074,7 +1062,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftRA) v.AuxInt = c v.AddArg(x) @@ -1086,7 +1073,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break @@ -1094,7 +1081,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRA) v.AuxInt = c v.AddArg(x) @@ -1106,7 +1092,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break @@ -1114,7 +1100,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRA) v.AuxInt = c v.AddArg(x) @@ -1126,7 +1111,7 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRAconst { @@ -1134,7 +1119,6 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMADCshiftRA) v.AuxInt = c v.AddArg(x) @@ -1146,16 +1130,14 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1167,16 +1149,14 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1188,16 +1168,14 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1209,16 +1187,14 @@ func rewriteValueARM_OpARMADC_10(v *Value) bool { // cond: // result: (ADCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1233,16 +1209,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1254,16 +1228,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1275,16 +1247,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1296,16 +1266,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1317,16 +1285,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1338,16 +1304,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1359,16 +1323,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1380,16 +1342,14 @@ func rewriteValueARM_OpARMADC_20(v *Value) bool { // cond: // result: (ADCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMADCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1405,14 +1365,13 @@ func rewriteValueARM_OpARMADCconst_0(v *Value) bool { // result: (ADCconst [int64(int32(c+d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMADCconst) v.AuxInt = int64(int32(c + d)) v.AddArg(x) @@ -1424,14 +1383,13 @@ func rewriteValueARM_OpARMADCconst_0(v *Value) bool { // result: (ADCconst [int64(int32(c-d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMADCconst) v.AuxInt = int64(int32(c - d)) v.AddArg(x) @@ -1447,14 +1405,13 @@ func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { // result: (ADCconst [c] (SLLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -1469,14 +1426,13 @@ func rewriteValueARM_OpARMADCshiftLL_0(v *Value) bool { // result: (ADCconst x [int64(int32(uint32(c)< x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -1499,7 +1455,6 @@ func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -1513,7 +1468,7 @@ func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { // cond: // result: (ADCshiftLL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -1521,7 +1476,6 @@ func rewriteValueARM_OpARMADCshiftLLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMADCshiftLL) v.AuxInt = c v.AddArg(x) @@ -1538,14 +1492,13 @@ func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { // result: (ADCconst [c] (SRAconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -1560,14 +1513,13 @@ func rewriteValueARM_OpARMADCshiftRA_0(v *Value) bool { // result: (ADCconst x [int64(int32(c)>>uint64(d))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = int64(int32(c) >> uint64(d)) v.AddArg(x) @@ -1582,7 +1534,7 @@ func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { // cond: // result: (ADCconst [c] (SRA x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -1590,7 +1542,6 @@ func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -1604,7 +1555,7 @@ func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { // cond: // result: (ADCshiftRA x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -1612,7 +1563,6 @@ func rewriteValueARM_OpARMADCshiftRAreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMADCshiftRA) v.AuxInt = c v.AddArg(x) @@ -1629,14 +1579,13 @@ func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { // result: (ADCconst [c] (SRLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -1651,14 +1600,13 @@ func rewriteValueARM_OpARMADCshiftRL_0(v *Value) bool { // result: (ADCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMADCconst) v.AuxInt = int64(int32(uint32(c) >> uint64(d))) v.AddArg(x) @@ -1673,7 +1621,7 @@ func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { // cond: // result: (ADCconst [c] (SRL x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -1681,7 +1629,6 @@ func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMADCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -1695,7 +1642,7 @@ func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { // cond: // result: (ADCshiftRL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -1703,7 +1650,6 @@ func rewriteValueARM_OpARMADCshiftRLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMADCshiftRL) v.AuxInt = c v.AddArg(x) @@ -1734,13 +1680,12 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { // cond: // result: (ADDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDconst) v.AuxInt = c v.AddArg(x) @@ -1768,14 +1713,13 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { // cond: // result: (ADDshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDshiftLL) v.AuxInt = c v.AddArg(x) @@ -1804,14 +1748,13 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { // cond: // result: (ADDshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDshiftRL) v.AuxInt = c v.AddArg(x) @@ -1840,14 +1783,13 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { // cond: // result: (ADDshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDshiftRA) v.AuxInt = c v.AddArg(x) @@ -1864,9 +1806,8 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1877,15 +1818,13 @@ func rewriteValueARM_OpARMADD_0(v *Value) bool { // cond: // result: (ADDshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -1906,9 +1845,8 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1919,15 +1857,13 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { // cond: // result: (ADDshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -1944,9 +1880,8 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1957,15 +1892,13 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { // cond: // result: (ADDshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -1995,7 +1928,7 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMRSBconst { break @@ -2004,7 +1937,6 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMSUB) v.AddArg(x) v.AddArg(y) @@ -2066,15 +1998,13 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { // cond: // result: (MULA x y a) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMUL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARMMULA) v.AddArg(x) v.AddArg(y) @@ -2091,9 +2021,8 @@ func rewriteValueARM_OpARMADD_10(v *Value) bool { if v_1.Op != OpARMMUL { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARMMULA) v.AddArg(x) v.AddArg(y) @@ -2113,9 +2042,8 @@ func rewriteValueARM_OpARMADDD_0(v *Value) bool { if v_1.Op != OpARMMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2129,15 +2057,13 @@ func rewriteValueARM_OpARMADDD_0(v *Value) bool { // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULAD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2157,9 +2083,8 @@ func rewriteValueARM_OpARMADDD_0(v *Value) bool { if v_1.Op != OpARMNMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2173,15 +2098,13 @@ func rewriteValueARM_OpARMADDD_0(v *Value) bool { // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULSD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2204,9 +2127,8 @@ func rewriteValueARM_OpARMADDF_0(v *Value) bool { if v_1.Op != OpARMMULF { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2220,15 +2142,13 @@ func rewriteValueARM_OpARMADDF_0(v *Value) bool { // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULAF a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMULF { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2248,9 +2168,8 @@ func rewriteValueARM_OpARMADDF_0(v *Value) bool { if v_1.Op != OpARMNMULF { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2264,15 +2183,13 @@ func rewriteValueARM_OpARMADDF_0(v *Value) bool { // cond: a.Uses == 1 && objabi.GOARM >= 6 // result: (MULSF a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNMULF { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -2305,13 +2222,12 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // cond: // result: (ADDSconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDSconst) v.AuxInt = c v.AddArg(x) @@ -2339,14 +2255,13 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // cond: // result: (ADDSshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDSshiftLL) v.AuxInt = c v.AddArg(x) @@ -2375,14 +2290,13 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // cond: // result: (ADDSshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDSshiftRL) v.AuxInt = c v.AddArg(x) @@ -2411,14 +2325,13 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // cond: // result: (ADDSshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMADDSshiftRA) v.AuxInt = c v.AddArg(x) @@ -2435,9 +2348,8 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDSshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -2448,15 +2360,13 @@ func rewriteValueARM_OpARMADDS_0(v *Value) bool { // cond: // result: (ADDSshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDSshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -2476,9 +2386,8 @@ func rewriteValueARM_OpARMADDS_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDSshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -2489,15 +2398,13 @@ func rewriteValueARM_OpARMADDS_10(v *Value) bool { // cond: // result: (ADDSshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDSshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -2514,9 +2421,8 @@ func rewriteValueARM_OpARMADDS_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMADDSshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -2527,15 +2433,13 @@ func rewriteValueARM_OpARMADDS_10(v *Value) bool { // cond: // result: (ADDSshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMADDSshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -2551,13 +2455,12 @@ func rewriteValueARM_OpARMADDSshiftLL_0(v *Value) bool { // result: (ADDSconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -2591,14 +2494,13 @@ func rewriteValueARM_OpARMADDSshiftLLreg_0(v *Value) bool { // cond: // result: (ADDSconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -2634,13 +2536,12 @@ func rewriteValueARM_OpARMADDSshiftRA_0(v *Value) bool { // result: (ADDSconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -2674,14 +2575,13 @@ func rewriteValueARM_OpARMADDSshiftRAreg_0(v *Value) bool { // cond: // result: (ADDSconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -2717,13 +2617,12 @@ func rewriteValueARM_OpARMADDSshiftRL_0(v *Value) bool { // result: (ADDSconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -2757,14 +2656,13 @@ func rewriteValueARM_OpARMADDSshiftRLreg_0(v *Value) bool { // cond: // result: (ADDSconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -2925,13 +2823,12 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { // result: (ADDconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -2962,7 +2859,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { // result: (SRRconst [32-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -2970,8 +2867,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -2989,7 +2885,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMBFXU { break @@ -3000,8 +2896,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMREV16) @@ -3018,7 +2913,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -3036,8 +2931,7 @@ func rewriteValueARM_OpARMADDshiftLL_0(v *Value) bool { if v_0_0.AuxInt != 16 { break } - x := v_0_0.Args[0] - if x != v.Args[1] { + if x != v_0_0.Args[0] { break } if !(objabi.GOARM >= 6) { @@ -3055,14 +2949,13 @@ func rewriteValueARM_OpARMADDshiftLLreg_0(v *Value) bool { // cond: // result: (ADDconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -3098,13 +2991,12 @@ func rewriteValueARM_OpARMADDshiftRA_0(v *Value) bool { // result: (ADDconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -3138,14 +3030,13 @@ func rewriteValueARM_OpARMADDshiftRAreg_0(v *Value) bool { // cond: // result: (ADDconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -3181,13 +3072,12 @@ func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { // result: (ADDconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -3218,7 +3108,7 @@ func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { // result: (SRRconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -3226,8 +3116,7 @@ func rewriteValueARM_OpARMADDshiftRL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -3243,14 +3132,13 @@ func rewriteValueARM_OpARMADDshiftRLreg_0(v *Value) bool { // cond: // result: (ADDconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -3300,13 +3188,12 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // cond: // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMANDconst) v.AuxInt = c v.AddArg(x) @@ -3334,14 +3221,13 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // cond: // result: (ANDshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMANDshiftLL) v.AuxInt = c v.AddArg(x) @@ -3370,14 +3256,13 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // cond: // result: (ANDshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMANDshiftRL) v.AuxInt = c v.AddArg(x) @@ -3406,14 +3291,13 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // cond: // result: (ANDshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMANDshiftRA) v.AuxInt = c v.AddArg(x) @@ -3430,9 +3314,8 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMANDshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -3443,15 +3326,13 @@ func rewriteValueARM_OpARMAND_0(v *Value) bool { // cond: // result: (ANDshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMANDshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -3471,9 +3352,8 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMANDshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -3484,15 +3364,13 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // cond: // result: (ANDshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMANDshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -3509,9 +3387,8 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMANDshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -3522,15 +3399,13 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // cond: // result: (ANDshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMANDshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -3541,9 +3416,8 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -3571,13 +3445,12 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // cond: // result: (BIC x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMVN { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMBIC) v.AddArg(x) v.AddArg(y) @@ -3605,14 +3478,13 @@ func rewriteValueARM_OpARMAND_10(v *Value) bool { // cond: // result: (BICshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMVNshiftLL { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMBICshiftLL) v.AuxInt = c v.AddArg(x) @@ -3644,14 +3516,13 @@ func rewriteValueARM_OpARMAND_20(v *Value) bool { // cond: // result: (BICshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMVNshiftRL { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMBICshiftRL) v.AuxInt = c v.AddArg(x) @@ -3680,14 +3551,13 @@ func rewriteValueARM_OpARMAND_20(v *Value) bool { // cond: // result: (BICshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMVNshiftRA { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMBICshiftRA) v.AuxInt = c v.AddArg(x) @@ -3789,13 +3659,12 @@ func rewriteValueARM_OpARMANDshiftLL_0(v *Value) bool { // result: (ANDconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -3852,14 +3721,13 @@ func rewriteValueARM_OpARMANDshiftLLreg_0(v *Value) bool { // cond: // result: (ANDconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -3895,13 +3763,12 @@ func rewriteValueARM_OpARMANDshiftRA_0(v *Value) bool { // result: (ANDconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -3958,14 +3825,13 @@ func rewriteValueARM_OpARMANDshiftRAreg_0(v *Value) bool { // cond: // result: (ANDconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -4001,13 +3867,12 @@ func rewriteValueARM_OpARMANDshiftRL_0(v *Value) bool { // result: (ANDconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -4064,14 +3929,13 @@ func rewriteValueARM_OpARMANDshiftRLreg_0(v *Value) bool { // cond: // result: (ANDconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -4215,9 +4079,8 @@ func rewriteValueARM_OpARMBIC_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMBICshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -4234,9 +4097,8 @@ func rewriteValueARM_OpARMBIC_0(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMBICshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -4253,9 +4115,8 @@ func rewriteValueARM_OpARMBIC_0(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMBICshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -4266,9 +4127,8 @@ func rewriteValueARM_OpARMBIC_0(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARMMOVWconst) @@ -4573,13 +4433,12 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // cond: // result: (CMNconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMCMNconst) v.AuxInt = c v.AddArg(x) @@ -4607,14 +4466,13 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // cond: // result: (CMNshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMCMNshiftLL) v.AuxInt = c v.AddArg(x) @@ -4643,14 +4501,13 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // cond: // result: (CMNshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMCMNshiftRL) v.AuxInt = c v.AddArg(x) @@ -4679,14 +4536,13 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // cond: // result: (CMNshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMCMNshiftRA) v.AuxInt = c v.AddArg(x) @@ -4703,9 +4559,8 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMNshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -4716,15 +4571,13 @@ func rewriteValueARM_OpARMCMN_0(v *Value) bool { // cond: // result: (CMNshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMCMNshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -4744,9 +4597,8 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMNshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -4757,15 +4609,13 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { // cond: // result: (CMNshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMCMNshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -4782,9 +4632,8 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMNshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -4795,15 +4644,13 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { // cond: // result: (CMNshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMCMNshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -4833,7 +4680,7 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { // cond: // result: (CMP x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMRSBconst { break @@ -4842,7 +4689,6 @@ func rewriteValueARM_OpARMCMN_10(v *Value) bool { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMCMP) v.AddArg(x) v.AddArg(y) @@ -4940,13 +4786,12 @@ func rewriteValueARM_OpARMCMNshiftLL_0(v *Value) bool { // result: (CMNconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -4980,14 +4825,13 @@ func rewriteValueARM_OpARMCMNshiftLLreg_0(v *Value) bool { // cond: // result: (CMNconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -5023,13 +4867,12 @@ func rewriteValueARM_OpARMCMNshiftRA_0(v *Value) bool { // result: (CMNconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -5063,14 +4906,13 @@ func rewriteValueARM_OpARMCMNshiftRAreg_0(v *Value) bool { // cond: // result: (CMNconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -5106,13 +4948,12 @@ func rewriteValueARM_OpARMCMNshiftRL_0(v *Value) bool { // result: (CMNconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -5146,14 +4987,13 @@ func rewriteValueARM_OpARMCMNshiftRLreg_0(v *Value) bool { // cond: // result: (CMNconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMCMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -5390,13 +5230,12 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPconst [c] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -5426,14 +5265,13 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftLL x y [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftLL, types.TypeFlags) v0.AuxInt = c @@ -5464,14 +5302,13 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftRL x y [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftRL, types.TypeFlags) v0.AuxInt = c @@ -5502,14 +5339,13 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftRA x y [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftRA, types.TypeFlags) v0.AuxInt = c @@ -5528,9 +5364,8 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMPshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -5541,15 +5376,13 @@ func rewriteValueARM_OpARMCMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftLLreg x y z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftLLreg, types.TypeFlags) v0.AddArg(x) @@ -5572,9 +5405,8 @@ func rewriteValueARM_OpARMCMP_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMPshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -5585,15 +5417,13 @@ func rewriteValueARM_OpARMCMP_10(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftRLreg x y z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftRLreg, types.TypeFlags) v0.AddArg(x) @@ -5612,9 +5442,8 @@ func rewriteValueARM_OpARMCMP_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMCMPshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -5625,15 +5454,13 @@ func rewriteValueARM_OpARMCMP_10(v *Value) bool { // cond: // result: (InvertFlags (CMPshiftRAreg x y z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPshiftRAreg, types.TypeFlags) v0.AddArg(x) @@ -5855,13 +5682,12 @@ func rewriteValueARM_OpARMCMPshiftLL_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -5897,14 +5723,13 @@ func rewriteValueARM_OpARMCMPshiftLLreg_0(v *Value) bool { // cond: // result: (InvertFlags (CMPconst [c] (SLL x y))) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -5942,13 +5767,12 @@ func rewriteValueARM_OpARMCMPshiftRA_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SRAconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -5984,14 +5808,13 @@ func rewriteValueARM_OpARMCMPshiftRAreg_0(v *Value) bool { // cond: // result: (InvertFlags (CMPconst [c] (SRA x y))) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -6029,13 +5852,12 @@ func rewriteValueARM_OpARMCMPshiftRL_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -6071,14 +5893,13 @@ func rewriteValueARM_OpARMCMPshiftRLreg_0(v *Value) bool { // cond: // result: (InvertFlags (CMPconst [c] (SRL x y))) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMInvertFlags) v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) v0.AuxInt = c @@ -6802,14 +6623,13 @@ func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVBUload) v.AuxInt = off1 + off2 v.Aux = sym @@ -6823,14 +6643,13 @@ func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVBUload) v.AuxInt = off1 - off2 v.Aux = sym @@ -6844,7 +6663,7 @@ func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -6852,7 +6671,6 @@ func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -6895,15 +6713,13 @@ func rewriteValueARM_OpARMMOVBUload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -6962,14 +6778,13 @@ func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { // cond: // result: (MOVBUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVBUload) v.AuxInt = c v.AddArg(ptr) @@ -6980,14 +6795,13 @@ func rewriteValueARM_OpARMMOVBUloadidx_0(v *Value) bool { // cond: // result: (MOVBUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBUload) v.AuxInt = c v.AddArg(ptr) @@ -7061,14 +6875,13 @@ func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVBload) v.AuxInt = off1 + off2 v.Aux = sym @@ -7082,14 +6895,13 @@ func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVBload) v.AuxInt = off1 - off2 v.Aux = sym @@ -7103,7 +6915,7 @@ func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7111,7 +6923,6 @@ func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -7154,15 +6965,13 @@ func rewriteValueARM_OpARMMOVBload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -7203,14 +7012,13 @@ func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { // cond: // result: (MOVBload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVBload) v.AuxInt = c v.AddArg(ptr) @@ -7221,14 +7029,13 @@ func rewriteValueARM_OpARMMOVBloadidx_0(v *Value) bool { // cond: // result: (MOVBload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBload) v.AuxInt = c v.AddArg(ptr) @@ -7305,7 +7112,7 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break @@ -7313,7 +7120,6 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off1 + off2 v.Aux = sym @@ -7328,7 +7134,7 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break @@ -7336,7 +7142,6 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off1 - off2 v.Aux = sym @@ -7351,7 +7156,7 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7360,7 +7165,6 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -7378,14 +7182,13 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off v.Aux = sym @@ -7400,14 +7203,13 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVBUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off v.Aux = sym @@ -7422,14 +7224,13 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off v.Aux = sym @@ -7444,14 +7245,13 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = off v.Aux = sym @@ -7468,16 +7268,14 @@ func rewriteValueARM_OpARMMOVBstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -7495,7 +7293,7 @@ func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -7503,7 +7301,6 @@ func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVBstore) v.AuxInt = c v.AddArg(ptr) @@ -7515,7 +7312,7 @@ func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -7523,7 +7320,6 @@ func rewriteValueARM_OpARMMOVBstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVBstore) v.AuxInt = c v.AddArg(ptr) @@ -7540,14 +7336,13 @@ func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVDload) v.AuxInt = off1 + off2 v.Aux = sym @@ -7561,14 +7356,13 @@ func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVDload) v.AuxInt = off1 - off2 v.Aux = sym @@ -7582,7 +7376,7 @@ func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7590,7 +7384,6 @@ func rewriteValueARM_OpARMMOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -7635,7 +7428,7 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break @@ -7643,7 +7436,6 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVDstore) v.AuxInt = off1 + off2 v.Aux = sym @@ -7658,7 +7450,7 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break @@ -7666,7 +7458,6 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVDstore) v.AuxInt = off1 - off2 v.Aux = sym @@ -7681,7 +7472,7 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7690,7 +7481,6 @@ func rewriteValueARM_OpARMMOVDstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -7711,14 +7501,13 @@ func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVFload) v.AuxInt = off1 + off2 v.Aux = sym @@ -7732,14 +7521,13 @@ func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVFload) v.AuxInt = off1 - off2 v.Aux = sym @@ -7753,7 +7541,7 @@ func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7761,7 +7549,6 @@ func rewriteValueARM_OpARMMOVFload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -7806,7 +7593,7 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break @@ -7814,7 +7601,6 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVFstore) v.AuxInt = off1 + off2 v.Aux = sym @@ -7829,7 +7615,7 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break @@ -7837,7 +7623,6 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVFstore) v.AuxInt = off1 - off2 v.Aux = sym @@ -7852,7 +7637,7 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7861,7 +7646,6 @@ func rewriteValueARM_OpARMMOVFstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -7884,14 +7668,13 @@ func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVHUload) v.AuxInt = off1 + off2 v.Aux = sym @@ -7905,14 +7688,13 @@ func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVHUload) v.AuxInt = off1 - off2 v.Aux = sym @@ -7926,7 +7708,7 @@ func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -7934,7 +7716,6 @@ func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -7977,15 +7758,13 @@ func rewriteValueARM_OpARMMOVHUload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8044,14 +7823,13 @@ func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVHUload) v.AuxInt = c v.AddArg(ptr) @@ -8062,14 +7840,13 @@ func rewriteValueARM_OpARMMOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVHUload) v.AuxInt = c v.AddArg(ptr) @@ -8168,14 +7945,13 @@ func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVHload) v.AuxInt = off1 + off2 v.Aux = sym @@ -8189,14 +7965,13 @@ func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVHload) v.AuxInt = off1 - off2 v.Aux = sym @@ -8210,7 +7985,7 @@ func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -8218,7 +7993,6 @@ func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -8261,15 +8035,13 @@ func rewriteValueARM_OpARMMOVHload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8310,14 +8082,13 @@ func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVHload) v.AuxInt = c v.AddArg(ptr) @@ -8328,14 +8099,13 @@ func rewriteValueARM_OpARMMOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVHload) v.AuxInt = c v.AddArg(ptr) @@ -8462,7 +8232,7 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break @@ -8470,7 +8240,6 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVHstore) v.AuxInt = off1 + off2 v.Aux = sym @@ -8485,7 +8254,7 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break @@ -8493,7 +8262,6 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVHstore) v.AuxInt = off1 - off2 v.Aux = sym @@ -8508,7 +8276,7 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -8517,7 +8285,6 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -8535,14 +8302,13 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVHstore) v.AuxInt = off v.Aux = sym @@ -8557,14 +8323,13 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVHstore) v.AuxInt = off v.Aux = sym @@ -8581,16 +8346,14 @@ func rewriteValueARM_OpARMMOVHstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -8608,7 +8371,7 @@ func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -8616,7 +8379,6 @@ func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVHstore) v.AuxInt = c v.AddArg(ptr) @@ -8628,7 +8390,7 @@ func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -8636,7 +8398,6 @@ func rewriteValueARM_OpARMMOVHstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVHstore) v.AuxInt = c v.AddArg(ptr) @@ -8655,14 +8416,13 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVWload) v.AuxInt = off1 + off2 v.Aux = sym @@ -8676,14 +8436,13 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] v.reset(OpARMMOVWload) v.AuxInt = off1 - off2 v.Aux = sym @@ -8697,7 +8456,7 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -8705,7 +8464,6 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -8749,15 +8507,13 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8775,16 +8531,14 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftLL { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8803,16 +8557,14 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftRL { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8831,16 +8583,14 @@ func rewriteValueARM_OpARMMOVWload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftRA { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(sym == nil && !config.nacl) { break } @@ -8901,14 +8651,13 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVWload) v.AuxInt = c v.AddArg(ptr) @@ -8919,14 +8668,13 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWload) v.AuxInt = c v.AddArg(ptr) @@ -8937,7 +8685,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftLL ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLLconst { @@ -8945,7 +8693,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftLL) v.AuxInt = c v.AddArg(ptr) @@ -8957,7 +8704,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftLL ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -8965,7 +8712,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { c := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftLL) v.AuxInt = c v.AddArg(ptr) @@ -8977,7 +8723,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftRL ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRLconst { @@ -8985,7 +8731,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftRL) v.AuxInt = c v.AddArg(ptr) @@ -8997,7 +8742,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftRL ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -9005,7 +8750,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { c := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftRL) v.AuxInt = c v.AddArg(ptr) @@ -9017,7 +8761,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftRA ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRAconst { @@ -9025,7 +8769,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { } c := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftRA) v.AuxInt = c v.AddArg(ptr) @@ -9037,7 +8780,7 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadshiftRA ptr idx [c] mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break @@ -9045,7 +8788,6 @@ func rewriteValueARM_OpARMMOVWloadidx_0(v *Value) bool { c := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWloadshiftRA) v.AuxInt = c v.AddArg(ptr) @@ -9088,14 +8830,13 @@ func rewriteValueARM_OpARMMOVWloadshiftLL_0(v *Value) bool { // result: (MOVWload [int64(uint32(c)<>uint64(d))] ptr mem) for { d := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVWload) v.AuxInt = int64(int32(c) >> uint64(d)) v.AddArg(ptr) @@ -9186,14 +8926,13 @@ func rewriteValueARM_OpARMMOVWloadshiftRL_0(v *Value) bool { // result: (MOVWload [int64(uint32(c)>>uint64(d))] ptr mem) for { d := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARMMOVWload) v.AuxInt = int64(uint32(c) >> uint64(d)) v.AddArg(ptr) @@ -9239,7 +8978,7 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break @@ -9247,7 +8986,6 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWstore) v.AuxInt = off1 + off2 v.Aux = sym @@ -9262,7 +9000,7 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break @@ -9270,7 +9008,6 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVWstore) v.AuxInt = off1 - off2 v.Aux = sym @@ -9285,7 +9022,7 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWaddr { break @@ -9294,7 +9031,6 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -9314,16 +9050,14 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -9342,17 +9076,15 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftLL { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -9372,17 +9104,15 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftRL { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -9402,17 +9132,15 @@ func rewriteValueARM_OpARMMOVWstore_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMADDshiftRA { break } c := v_0.AuxInt - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(sym == nil && !config.nacl) { break } @@ -9431,7 +9159,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -9439,7 +9167,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstore) v.AuxInt = c v.AddArg(ptr) @@ -9451,7 +9178,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -9459,7 +9186,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstore) v.AuxInt = c v.AddArg(ptr) @@ -9471,7 +9197,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftLL ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLLconst { @@ -9480,7 +9206,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { c := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftLL) v.AuxInt = c v.AddArg(ptr) @@ -9493,7 +9218,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftLL ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -9502,7 +9227,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftLL) v.AuxInt = c v.AddArg(ptr) @@ -9515,7 +9239,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftRL ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRLconst { @@ -9524,7 +9248,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { c := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftRL) v.AuxInt = c v.AddArg(ptr) @@ -9537,7 +9260,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftRL ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -9546,7 +9269,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftRL) v.AuxInt = c v.AddArg(ptr) @@ -9559,7 +9281,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftRA ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRAconst { @@ -9568,7 +9290,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { c := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftRA) v.AuxInt = c v.AddArg(ptr) @@ -9581,7 +9302,7 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreshiftRA ptr idx [c] val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break @@ -9590,7 +9311,6 @@ func rewriteValueARM_OpARMMOVWstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstoreshiftRA) v.AuxInt = c v.AddArg(ptr) @@ -9607,7 +9327,7 @@ func rewriteValueARM_OpARMMOVWstoreshiftLL_0(v *Value) bool { // result: (MOVWstore [int64(uint32(c)<>uint64(d))] ptr val mem) for { d := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -9639,7 +9358,6 @@ func rewriteValueARM_OpARMMOVWstoreshiftRA_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstore) v.AuxInt = int64(int32(c) >> uint64(d)) v.AddArg(ptr) @@ -9655,7 +9373,7 @@ func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { // result: (MOVWstore [int64(uint32(c)>>uint64(d))] ptr val mem) for { d := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -9663,7 +9381,6 @@ func rewriteValueARM_OpARMMOVWstoreshiftRL_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARMMOVWstore) v.AuxInt = int64(uint32(c) >> uint64(d)) v.AddArg(ptr) @@ -9697,13 +9414,12 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { // cond: int32(c) == -1 // result: (RSBconst [0] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(int32(c) == -1) { break } @@ -9766,7 +9482,7 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -9774,7 +9490,6 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -9803,13 +9518,12 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (SLLconst [log2(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -9842,13 +9556,12 @@ func rewriteValueARM_OpARMMUL_0(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (ADDshiftLL x x [log2(c-1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -9886,13 +9599,12 @@ func rewriteValueARM_OpARMMUL_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (RSBshiftLL x x [log2(c+1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -9929,13 +9641,12 @@ func rewriteValueARM_OpARMMUL_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -9975,13 +9686,12 @@ func rewriteValueARM_OpARMMUL_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -10021,13 +9731,12 @@ func rewriteValueARM_OpARMMUL_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -10067,13 +9776,12 @@ func rewriteValueARM_OpARMMUL_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -10135,14 +9843,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: int32(c) == -1 // result: (SUB a x) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(int32(c) == -1) { break } @@ -10155,7 +9862,7 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: // result: a for { - _ = v.Args[2] + a := v.Args[2] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break @@ -10163,7 +9870,6 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { if v_1.AuxInt != 0 { break } - a := v.Args[2] v.reset(OpCopy) v.Type = a.Type v.AddArg(a) @@ -10173,7 +9879,7 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: // result: (ADD x a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -10182,7 +9888,6 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { if v_1.AuxInt != 1 { break } - a := v.Args[2] v.reset(OpARMADD) v.AddArg(x) v.AddArg(a) @@ -10192,14 +9897,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (ADD (SLLconst [log2(c)] x) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -10215,14 +9919,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (ADD (ADDshiftLL x x [log2(c-1)]) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -10239,14 +9942,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (ADD (RSBshiftLL x x [log2(c+1)]) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -10263,14 +9965,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (ADD (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -10290,14 +9991,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (ADD (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -10317,14 +10017,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (ADD (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -10344,14 +10043,13 @@ func rewriteValueARM_OpARMMULA_0(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (ADD (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -10375,14 +10073,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: int32(c) == -1 // result: (SUB a x) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(int32(c) == -1) { break } @@ -10395,7 +10092,7 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: // result: a for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -10403,7 +10100,6 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { if v_0.AuxInt != 0 { break } - a := v.Args[2] v.reset(OpCopy) v.Type = a.Type v.AddArg(a) @@ -10413,7 +10109,7 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: // result: (ADD x a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -10422,7 +10118,6 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { break } x := v.Args[1] - a := v.Args[2] v.reset(OpARMADD) v.AddArg(x) v.AddArg(a) @@ -10432,14 +10127,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (ADD (SLLconst [log2(c)] x) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -10455,14 +10149,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (ADD (ADDshiftLL x x [log2(c-1)]) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -10479,14 +10172,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (ADD (RSBshiftLL x x [log2(c+1)]) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -10503,14 +10195,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (ADD (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -10530,14 +10221,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (ADD (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -10557,14 +10247,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (ADD (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -10584,14 +10273,13 @@ func rewriteValueARM_OpARMMULA_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (ADD (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -10614,7 +10302,7 @@ func rewriteValueARM_OpARMMULA_20(v *Value) bool { // cond: // result: (ADDconst [int64(int32(c*d))] a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -10625,7 +10313,6 @@ func rewriteValueARM_OpARMMULA_20(v *Value) bool { break } d := v_1.AuxInt - a := v.Args[2] v.reset(OpARMADDconst) v.AuxInt = int64(int32(c * d)) v.AddArg(a) @@ -10638,13 +10325,12 @@ func rewriteValueARM_OpARMMULD_0(v *Value) bool { // cond: objabi.GOARM >= 6 // result: (NMULD x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNEGD { break } x := v_0.Args[0] - y := v.Args[1] if !(objabi.GOARM >= 6) { break } @@ -10679,13 +10365,12 @@ func rewriteValueARM_OpARMMULF_0(v *Value) bool { // cond: objabi.GOARM >= 6 // result: (NMULF x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNEGF { break } x := v_0.Args[0] - y := v.Args[1] if !(objabi.GOARM >= 6) { break } @@ -10721,14 +10406,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: int32(c) == -1 // result: (ADD a x) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(int32(c) == -1) { break } @@ -10741,7 +10425,7 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: // result: a for { - _ = v.Args[2] + a := v.Args[2] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break @@ -10749,7 +10433,6 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { if v_1.AuxInt != 0 { break } - a := v.Args[2] v.reset(OpCopy) v.Type = a.Type v.AddArg(a) @@ -10759,7 +10442,7 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: // result: (RSB x a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { @@ -10768,7 +10451,6 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { if v_1.AuxInt != 1 { break } - a := v.Args[2] v.reset(OpARMRSB) v.AddArg(x) v.AddArg(a) @@ -10778,14 +10460,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (RSB (SLLconst [log2(c)] x) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -10801,14 +10482,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (RSB (ADDshiftLL x x [log2(c-1)]) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -10825,14 +10505,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (RSB (RSBshiftLL x x [log2(c+1)]) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -10849,14 +10528,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (RSB (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -10876,14 +10554,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (RSB (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -10903,14 +10580,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (RSB (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -10930,14 +10606,13 @@ func rewriteValueARM_OpARMMULS_0(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (RSB (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - a := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -10961,14 +10636,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: int32(c) == -1 // result: (ADD a x) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(int32(c) == -1) { break } @@ -10981,7 +10655,7 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: // result: a for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -10989,7 +10663,6 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { if v_0.AuxInt != 0 { break } - a := v.Args[2] v.reset(OpCopy) v.Type = a.Type v.AddArg(a) @@ -10999,7 +10672,7 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: // result: (RSB x a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -11008,7 +10681,6 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { break } x := v.Args[1] - a := v.Args[2] v.reset(OpARMRSB) v.AddArg(x) v.AddArg(a) @@ -11018,14 +10690,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (RSB (SLLconst [log2(c)] x) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -11041,14 +10712,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (RSB (ADDshiftLL x x [log2(c-1)]) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -11065,14 +10735,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (RSB (RSBshiftLL x x [log2(c+1)]) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -11089,14 +10758,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (RSB (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -11116,14 +10784,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (RSB (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -11143,14 +10810,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (RSB (SLLconst [log2(c/7)] (RSBshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -11170,14 +10836,13 @@ func rewriteValueARM_OpARMMULS_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (RSB (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - a := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -11200,7 +10865,7 @@ func rewriteValueARM_OpARMMULS_20(v *Value) bool { // cond: // result: (SUBconst [int64(int32(c*d))] a) for { - _ = v.Args[2] + a := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -11211,7 +10876,6 @@ func rewriteValueARM_OpARMMULS_20(v *Value) bool { break } d := v_1.AuxInt - a := v.Args[2] v.reset(OpARMSUBconst) v.AuxInt = int64(int32(c * d)) v.AddArg(a) @@ -11286,9 +10950,8 @@ func rewriteValueARM_OpARMMVN_0(v *Value) bool { if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARMMVNshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -11302,9 +10965,8 @@ func rewriteValueARM_OpARMMVN_0(v *Value) bool { if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARMMVNshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -11318,9 +10980,8 @@ func rewriteValueARM_OpARMMVN_0(v *Value) bool { if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARMMVNshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -11445,9 +11106,8 @@ func rewriteValueARM_OpARMNEGD_0(v *Value) bool { if v_0.Op != OpARMMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(objabi.GOARM >= 6) { break } @@ -11467,9 +11127,8 @@ func rewriteValueARM_OpARMNEGF_0(v *Value) bool { if v_0.Op != OpARMMULF { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(objabi.GOARM >= 6) { break } @@ -11485,13 +11144,12 @@ func rewriteValueARM_OpARMNMULD_0(v *Value) bool { // cond: // result: (MULD x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNEGD { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARMMULD) v.AddArg(x) v.AddArg(y) @@ -11520,13 +11178,12 @@ func rewriteValueARM_OpARMNMULF_0(v *Value) bool { // cond: // result: (MULF x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMNEGF { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARMMULF) v.AddArg(x) v.AddArg(y) @@ -11647,13 +11304,12 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { // cond: // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMORconst) v.AuxInt = c v.AddArg(x) @@ -11681,14 +11337,13 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { // cond: // result: (ORshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMORshiftLL) v.AuxInt = c v.AddArg(x) @@ -11717,14 +11372,13 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { // cond: // result: (ORshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMORshiftRL) v.AuxInt = c v.AddArg(x) @@ -11753,14 +11407,13 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { // cond: // result: (ORshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMORshiftRA) v.AuxInt = c v.AddArg(x) @@ -11777,9 +11430,8 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMORshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -11790,15 +11442,13 @@ func rewriteValueARM_OpARMOR_0(v *Value) bool { // cond: // result: (ORshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMORshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -11818,9 +11468,8 @@ func rewriteValueARM_OpARMOR_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMORshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -11831,15 +11480,13 @@ func rewriteValueARM_OpARMOR_10(v *Value) bool { // cond: // result: (ORshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMORshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -11856,9 +11503,8 @@ func rewriteValueARM_OpARMOR_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMORshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -11869,15 +11515,13 @@ func rewriteValueARM_OpARMOR_10(v *Value) bool { // cond: // result: (ORshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMORshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -11888,9 +11532,8 @@ func rewriteValueARM_OpARMOR_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -11966,13 +11609,12 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { // result: (ORconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -12003,7 +11645,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { // result: (SRRconst [32-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -12011,8 +11653,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -12030,7 +11671,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMBFXU { break @@ -12041,8 +11682,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMREV16) @@ -12059,7 +11699,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -12077,8 +11717,7 @@ func rewriteValueARM_OpARMORshiftLL_0(v *Value) bool { if v_0_0.AuxInt != 16 { break } - x := v_0_0.Args[0] - if x != v.Args[1] { + if x != v_0_0.Args[0] { break } if !(objabi.GOARM >= 6) { @@ -12119,14 +11758,13 @@ func rewriteValueARM_OpARMORshiftLLreg_0(v *Value) bool { // cond: // result: (ORconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -12162,13 +11800,12 @@ func rewriteValueARM_OpARMORshiftRA_0(v *Value) bool { // result: (ORconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -12225,14 +11862,13 @@ func rewriteValueARM_OpARMORshiftRAreg_0(v *Value) bool { // cond: // result: (ORconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -12268,13 +11904,12 @@ func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { // result: (ORconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -12305,7 +11940,7 @@ func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { // result: (SRRconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -12313,8 +11948,7 @@ func rewriteValueARM_OpARMORshiftRL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -12353,14 +11987,13 @@ func rewriteValueARM_OpARMORshiftRLreg_0(v *Value) bool { // cond: // result: (ORconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -12394,13 +12027,12 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { // cond: // result: (SUBconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBconst) v.AuxInt = c v.AddArg(x) @@ -12444,14 +12076,13 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { // cond: // result: (SUBshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMSUBshiftLL) v.AuxInt = c v.AddArg(x) @@ -12480,14 +12111,13 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { // cond: // result: (SUBshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMSUBshiftRL) v.AuxInt = c v.AddArg(x) @@ -12516,14 +12146,13 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { // cond: // result: (SUBshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMSUBshiftRA) v.AuxInt = c v.AddArg(x) @@ -12540,9 +12169,8 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMRSBshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -12553,15 +12181,13 @@ func rewriteValueARM_OpARMRSB_0(v *Value) bool { // cond: // result: (SUBshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMSUBshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -12581,9 +12207,8 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMRSBshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -12594,15 +12219,13 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { // cond: // result: (SUBshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMSUBshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -12619,9 +12242,8 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMRSBshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -12632,15 +12254,13 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { // cond: // result: (SUBshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMSUBshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -12651,9 +12271,8 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARMMOVWconst) @@ -12664,15 +12283,13 @@ func rewriteValueARM_OpARMRSB_10(v *Value) bool { // cond: objabi.GOARM == 7 // result: (MULS x y a) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMUL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] if !(objabi.GOARM == 7) { break } @@ -12691,13 +12308,12 @@ func rewriteValueARM_OpARMRSBSshiftLL_0(v *Value) bool { // result: (SUBSconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -12731,14 +12347,13 @@ func rewriteValueARM_OpARMRSBSshiftLLreg_0(v *Value) bool { // cond: // result: (SUBSconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -12774,13 +12389,12 @@ func rewriteValueARM_OpARMRSBSshiftRA_0(v *Value) bool { // result: (SUBSconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -12814,14 +12428,13 @@ func rewriteValueARM_OpARMRSBSshiftRAreg_0(v *Value) bool { // cond: // result: (SUBSconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -12857,13 +12470,12 @@ func rewriteValueARM_OpARMRSBSshiftRL_0(v *Value) bool { // result: (SUBSconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -12897,14 +12509,13 @@ func rewriteValueARM_OpARMRSBSshiftRLreg_0(v *Value) bool { // cond: // result: (SUBSconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -13005,13 +12616,12 @@ func rewriteValueARM_OpARMRSBshiftLL_0(v *Value) bool { // result: (SUBconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -13067,14 +12677,13 @@ func rewriteValueARM_OpARMRSBshiftLLreg_0(v *Value) bool { // cond: // result: (SUBconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -13110,13 +12719,12 @@ func rewriteValueARM_OpARMRSBshiftRA_0(v *Value) bool { // result: (SUBconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -13172,14 +12780,13 @@ func rewriteValueARM_OpARMRSBshiftRAreg_0(v *Value) bool { // cond: // result: (SUBconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -13215,13 +12822,12 @@ func rewriteValueARM_OpARMRSBshiftRL_0(v *Value) bool { // result: (SUBconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -13277,14 +12883,13 @@ func rewriteValueARM_OpARMRSBshiftRLreg_0(v *Value) bool { // cond: // result: (SUBconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMSUBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -13319,14 +12924,13 @@ func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { // result: (RSCconst [int64(int32(c-d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMRSCconst) v.AuxInt = int64(int32(c - d)) v.AddArg(x) @@ -13338,14 +12942,13 @@ func rewriteValueARM_OpARMRSCconst_0(v *Value) bool { // result: (RSCconst [int64(int32(c+d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMRSCconst) v.AuxInt = int64(int32(c + d)) v.AddArg(x) @@ -13361,14 +12964,13 @@ func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { // result: (SBCconst [c] (SLLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -13383,14 +12985,13 @@ func rewriteValueARM_OpARMRSCshiftLL_0(v *Value) bool { // result: (RSCconst x [int64(int32(uint32(c)< x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -13413,7 +13014,6 @@ func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -13427,7 +13027,7 @@ func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { // cond: // result: (RSCshiftLL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -13435,7 +13035,6 @@ func rewriteValueARM_OpARMRSCshiftLLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMRSCshiftLL) v.AuxInt = c v.AddArg(x) @@ -13452,14 +13051,13 @@ func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { // result: (SBCconst [c] (SRAconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -13474,14 +13072,13 @@ func rewriteValueARM_OpARMRSCshiftRA_0(v *Value) bool { // result: (RSCconst x [int64(int32(c)>>uint64(d))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = int64(int32(c) >> uint64(d)) v.AddArg(x) @@ -13496,7 +13093,7 @@ func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { // cond: // result: (SBCconst [c] (SRA x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -13504,7 +13101,6 @@ func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -13518,7 +13114,7 @@ func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { // cond: // result: (RSCshiftRA x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -13526,7 +13122,6 @@ func rewriteValueARM_OpARMRSCshiftRAreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMRSCshiftRA) v.AuxInt = c v.AddArg(x) @@ -13543,14 +13138,13 @@ func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { // result: (SBCconst [c] (SRLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -13565,14 +13159,13 @@ func rewriteValueARM_OpARMRSCshiftRL_0(v *Value) bool { // result: (RSCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = int64(int32(uint32(c) >> uint64(d))) v.AddArg(x) @@ -13587,7 +13180,7 @@ func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { // cond: // result: (SBCconst [c] (SRL x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -13595,7 +13188,6 @@ func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMSBCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -13609,7 +13201,7 @@ func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { // cond: // result: (RSCshiftRL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -13617,7 +13209,6 @@ func rewriteValueARM_OpARMRSCshiftRLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMRSCshiftRL) v.AuxInt = c v.AddArg(x) @@ -13632,14 +13223,13 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (RSCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = c v.AddArg(x) @@ -13650,14 +13240,13 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (SBCconst [c] x flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = c v.AddArg(x) @@ -13668,7 +13257,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (SBCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLLconst { @@ -13676,7 +13265,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMSBCshiftLL) v.AuxInt = c v.AddArg(x) @@ -13688,7 +13276,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (RSCshiftLL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -13696,7 +13284,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftLL) v.AuxInt = c v.AddArg(x) @@ -13708,7 +13295,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (SBCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRLconst { @@ -13716,7 +13303,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMSBCshiftRL) v.AuxInt = c v.AddArg(x) @@ -13728,7 +13314,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (RSCshiftRL x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -13736,7 +13322,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftRL) v.AuxInt = c v.AddArg(x) @@ -13748,7 +13333,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (SBCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRAconst { @@ -13756,7 +13341,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { } c := v_1.AuxInt y := v_1.Args[0] - flags := v.Args[2] v.reset(OpARMSBCshiftRA) v.AuxInt = c v.AddArg(x) @@ -13768,7 +13352,7 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (RSCshiftRA x y [c] flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break @@ -13776,7 +13360,6 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { c := v_0.AuxInt y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftRA) v.AuxInt = c v.AddArg(x) @@ -13788,16 +13371,14 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (SBCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMSBCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -13809,16 +13390,14 @@ func rewriteValueARM_OpARMSBC_0(v *Value) bool { // cond: // result: (RSCshiftLLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -13833,16 +13412,14 @@ func rewriteValueARM_OpARMSBC_10(v *Value) bool { // cond: // result: (SBCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMSBCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -13854,16 +13431,14 @@ func rewriteValueARM_OpARMSBC_10(v *Value) bool { // cond: // result: (RSCshiftRLreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -13875,16 +13450,14 @@ func rewriteValueARM_OpARMSBC_10(v *Value) bool { // cond: // result: (SBCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] - flags := v.Args[2] + y := v_1.Args[0] v.reset(OpARMSBCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -13896,16 +13469,14 @@ func rewriteValueARM_OpARMSBC_10(v *Value) bool { // cond: // result: (RSCshiftRAreg x y z flags) for { - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] + y := v_0.Args[0] x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -13921,14 +13492,13 @@ func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { // result: (SBCconst [int64(int32(c-d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMADDconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMSBCconst) v.AuxInt = int64(int32(c - d)) v.AddArg(x) @@ -13940,14 +13510,13 @@ func rewriteValueARM_OpARMSBCconst_0(v *Value) bool { // result: (SBCconst [int64(int32(c+d))] x flags) for { c := v.AuxInt - _ = v.Args[1] + flags := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSUBconst { break } d := v_0.AuxInt x := v_0.Args[0] - flags := v.Args[1] v.reset(OpARMSBCconst) v.AuxInt = int64(int32(c + d)) v.AddArg(x) @@ -13963,14 +13532,13 @@ func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { // result: (RSCconst [c] (SLLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -13985,14 +13553,13 @@ func rewriteValueARM_OpARMSBCshiftLL_0(v *Value) bool { // result: (SBCconst x [int64(int32(uint32(c)< x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -14015,7 +13582,6 @@ func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -14029,7 +13595,7 @@ func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { // cond: // result: (SBCshiftLL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -14037,7 +13603,6 @@ func rewriteValueARM_OpARMSBCshiftLLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMSBCshiftLL) v.AuxInt = c v.AddArg(x) @@ -14054,14 +13619,13 @@ func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { // result: (RSCconst [c] (SRAconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -14076,14 +13640,13 @@ func rewriteValueARM_OpARMSBCshiftRA_0(v *Value) bool { // result: (SBCconst x [int64(int32(c)>>uint64(d))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = int64(int32(c) >> uint64(d)) v.AddArg(x) @@ -14098,7 +13661,7 @@ func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { // cond: // result: (RSCconst [c] (SRA x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -14106,7 +13669,6 @@ func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -14120,7 +13682,7 @@ func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { // cond: // result: (SBCshiftRA x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -14128,7 +13690,6 @@ func rewriteValueARM_OpARMSBCshiftRAreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMSBCshiftRA) v.AuxInt = c v.AddArg(x) @@ -14145,14 +13706,13 @@ func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { // result: (RSCconst [c] (SRLconst x [d]) flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - flags := v.Args[2] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -14167,14 +13727,13 @@ func rewriteValueARM_OpARMSBCshiftRL_0(v *Value) bool { // result: (SBCconst x [int64(int32(uint32(c)>>uint64(d)))] flags) for { d := v.AuxInt - _ = v.Args[2] + flags := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARMMOVWconst { break } c := v_1.AuxInt - flags := v.Args[2] v.reset(OpARMSBCconst) v.AuxInt = int64(int32(uint32(c) >> uint64(d))) v.AddArg(x) @@ -14189,7 +13748,7 @@ func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { // cond: // result: (RSCconst [c] (SRL x y) flags) for { - _ = v.Args[3] + flags := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break @@ -14197,7 +13756,6 @@ func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { c := v_0.AuxInt x := v.Args[1] y := v.Args[2] - flags := v.Args[3] v.reset(OpARMRSCconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -14211,7 +13769,7 @@ func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { // cond: // result: (SBCshiftRL x y [c] flags) for { - _ = v.Args[3] + flags := v.Args[3] x := v.Args[0] y := v.Args[1] v_2 := v.Args[2] @@ -14219,7 +13777,6 @@ func rewriteValueARM_OpARMSBCshiftRLreg_0(v *Value) bool { break } c := v_2.AuxInt - flags := v.Args[3] v.reset(OpARMSBCshiftRL) v.AuxInt = c v.AddArg(x) @@ -14460,13 +14017,12 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { // cond: // result: (RSBconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBconst) v.AuxInt = c v.AddArg(x) @@ -14510,14 +14066,13 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { // cond: // result: (RSBshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBshiftLL) v.AuxInt = c v.AddArg(x) @@ -14546,14 +14101,13 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { // cond: // result: (RSBshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBshiftRL) v.AuxInt = c v.AddArg(x) @@ -14582,14 +14136,13 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { // cond: // result: (RSBshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBshiftRA) v.AuxInt = c v.AddArg(x) @@ -14606,9 +14159,8 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -14619,15 +14171,13 @@ func rewriteValueARM_OpARMSUB_0(v *Value) bool { // cond: // result: (RSBshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -14647,9 +14197,8 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -14660,15 +14209,13 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { // cond: // result: (RSBshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -14685,9 +14232,8 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -14698,15 +14244,13 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { // cond: // result: (RSBshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -14717,9 +14261,8 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARMMOVWconst) @@ -14736,9 +14279,8 @@ func rewriteValueARM_OpARMSUB_10(v *Value) bool { if v_1.Op != OpARMMUL { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(objabi.GOARM == 7) { break } @@ -14761,9 +14303,8 @@ func rewriteValueARM_OpARMSUBD_0(v *Value) bool { if v_1.Op != OpARMMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -14783,9 +14324,8 @@ func rewriteValueARM_OpARMSUBD_0(v *Value) bool { if v_1.Op != OpARMNMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -14808,9 +14348,8 @@ func rewriteValueARM_OpARMSUBF_0(v *Value) bool { if v_1.Op != OpARMMULF { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -14830,9 +14369,8 @@ func rewriteValueARM_OpARMSUBF_0(v *Value) bool { if v_1.Op != OpARMNMULF { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] if !(a.Uses == 1 && objabi.GOARM >= 6) { break } @@ -14883,14 +14421,13 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { // cond: // result: (RSBSshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBSshiftLL) v.AuxInt = c v.AddArg(x) @@ -14919,14 +14456,13 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { // cond: // result: (RSBSshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBSshiftRL) v.AuxInt = c v.AddArg(x) @@ -14955,14 +14491,13 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { // cond: // result: (RSBSshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMRSBSshiftRA) v.AuxInt = c v.AddArg(x) @@ -14979,9 +14514,8 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBSshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -14992,15 +14526,13 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { // cond: // result: (RSBSshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBSshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -15017,9 +14549,8 @@ func rewriteValueARM_OpARMSUBS_0(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBSshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -15033,15 +14564,13 @@ func rewriteValueARM_OpARMSUBS_10(v *Value) bool { // cond: // result: (RSBSshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBSshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -15058,9 +14587,8 @@ func rewriteValueARM_OpARMSUBS_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMSUBSshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -15071,15 +14599,13 @@ func rewriteValueARM_OpARMSUBS_10(v *Value) bool { // cond: // result: (RSBSshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMRSBSshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -15095,13 +14621,12 @@ func rewriteValueARM_OpARMSUBSshiftLL_0(v *Value) bool { // result: (RSBSconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -15135,14 +14660,13 @@ func rewriteValueARM_OpARMSUBSshiftLLreg_0(v *Value) bool { // cond: // result: (RSBSconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -15178,13 +14702,12 @@ func rewriteValueARM_OpARMSUBSshiftRA_0(v *Value) bool { // result: (RSBSconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -15218,14 +14741,13 @@ func rewriteValueARM_OpARMSUBSshiftRAreg_0(v *Value) bool { // cond: // result: (RSBSconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -15261,13 +14783,12 @@ func rewriteValueARM_OpARMSUBSshiftRL_0(v *Value) bool { // result: (RSBSconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -15301,14 +14822,13 @@ func rewriteValueARM_OpARMSUBSshiftRLreg_0(v *Value) bool { // cond: // result: (RSBSconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBSconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -15468,13 +14988,12 @@ func rewriteValueARM_OpARMSUBshiftLL_0(v *Value) bool { // result: (RSBconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -15530,14 +15049,13 @@ func rewriteValueARM_OpARMSUBshiftLLreg_0(v *Value) bool { // cond: // result: (RSBconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -15573,13 +15091,12 @@ func rewriteValueARM_OpARMSUBshiftRA_0(v *Value) bool { // result: (RSBconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -15635,14 +15152,13 @@ func rewriteValueARM_OpARMSUBshiftRAreg_0(v *Value) bool { // cond: // result: (RSBconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -15678,13 +15194,12 @@ func rewriteValueARM_OpARMSUBshiftRL_0(v *Value) bool { // result: (RSBconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -15740,14 +15255,13 @@ func rewriteValueARM_OpARMSUBshiftRLreg_0(v *Value) bool { // cond: // result: (RSBconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMRSBconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -15797,13 +15311,12 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { // cond: // result: (TEQconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTEQconst) v.AuxInt = c v.AddArg(x) @@ -15831,14 +15344,13 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { // cond: // result: (TEQshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTEQshiftLL) v.AuxInt = c v.AddArg(x) @@ -15867,14 +15379,13 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { // cond: // result: (TEQshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTEQshiftRL) v.AuxInt = c v.AddArg(x) @@ -15903,14 +15414,13 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { // cond: // result: (TEQshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTEQshiftRA) v.AuxInt = c v.AddArg(x) @@ -15927,9 +15437,8 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTEQshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -15940,15 +15449,13 @@ func rewriteValueARM_OpARMTEQ_0(v *Value) bool { // cond: // result: (TEQshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTEQshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -15968,9 +15475,8 @@ func rewriteValueARM_OpARMTEQ_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTEQshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -15981,15 +15487,13 @@ func rewriteValueARM_OpARMTEQ_10(v *Value) bool { // cond: // result: (TEQshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTEQshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -16006,9 +15510,8 @@ func rewriteValueARM_OpARMTEQ_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTEQshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -16019,15 +15522,13 @@ func rewriteValueARM_OpARMTEQ_10(v *Value) bool { // cond: // result: (TEQshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTEQshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -16094,13 +15595,12 @@ func rewriteValueARM_OpARMTEQshiftLL_0(v *Value) bool { // result: (TEQconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -16134,14 +15634,13 @@ func rewriteValueARM_OpARMTEQshiftLLreg_0(v *Value) bool { // cond: // result: (TEQconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -16177,13 +15676,12 @@ func rewriteValueARM_OpARMTEQshiftRA_0(v *Value) bool { // result: (TEQconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -16217,14 +15715,13 @@ func rewriteValueARM_OpARMTEQshiftRAreg_0(v *Value) bool { // cond: // result: (TEQconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -16260,13 +15757,12 @@ func rewriteValueARM_OpARMTEQshiftRL_0(v *Value) bool { // result: (TEQconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -16300,14 +15796,13 @@ func rewriteValueARM_OpARMTEQshiftRLreg_0(v *Value) bool { // cond: // result: (TEQconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTEQconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -16357,13 +15852,12 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { // cond: // result: (TSTconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTSTconst) v.AuxInt = c v.AddArg(x) @@ -16391,14 +15885,13 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { // cond: // result: (TSTshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTSTshiftLL) v.AuxInt = c v.AddArg(x) @@ -16427,14 +15920,13 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { // cond: // result: (TSTshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTSTshiftRL) v.AuxInt = c v.AddArg(x) @@ -16463,14 +15955,13 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { // cond: // result: (TSTshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMTSTshiftRA) v.AuxInt = c v.AddArg(x) @@ -16487,9 +15978,8 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTSTshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -16500,15 +15990,13 @@ func rewriteValueARM_OpARMTST_0(v *Value) bool { // cond: // result: (TSTshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTSTshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -16528,9 +16016,8 @@ func rewriteValueARM_OpARMTST_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTSTshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -16541,15 +16028,13 @@ func rewriteValueARM_OpARMTST_10(v *Value) bool { // cond: // result: (TSTshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTSTshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -16566,9 +16051,8 @@ func rewriteValueARM_OpARMTST_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMTSTshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -16579,15 +16063,13 @@ func rewriteValueARM_OpARMTST_10(v *Value) bool { // cond: // result: (TSTshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMTSTshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -16654,13 +16136,12 @@ func rewriteValueARM_OpARMTSTshiftLL_0(v *Value) bool { // result: (TSTconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -16694,14 +16175,13 @@ func rewriteValueARM_OpARMTSTshiftLLreg_0(v *Value) bool { // cond: // result: (TSTconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -16737,13 +16217,12 @@ func rewriteValueARM_OpARMTSTshiftRA_0(v *Value) bool { // result: (TSTconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -16777,14 +16256,13 @@ func rewriteValueARM_OpARMTSTshiftRAreg_0(v *Value) bool { // cond: // result: (TSTconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -16820,13 +16298,12 @@ func rewriteValueARM_OpARMTSTshiftRL_0(v *Value) bool { // result: (TSTconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -16860,14 +16337,13 @@ func rewriteValueARM_OpARMTSTshiftRLreg_0(v *Value) bool { // cond: // result: (TSTconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMTSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -16917,13 +16393,12 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // cond: // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMXORconst) v.AuxInt = c v.AddArg(x) @@ -16951,14 +16426,13 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // cond: // result: (XORshiftLL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMXORshiftLL) v.AuxInt = c v.AddArg(x) @@ -16987,14 +16461,13 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // cond: // result: (XORshiftRL x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMXORshiftRL) v.AuxInt = c v.AddArg(x) @@ -17023,14 +16496,13 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // cond: // result: (XORshiftRA x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRAconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMXORshiftRA) v.AuxInt = c v.AddArg(x) @@ -17059,14 +16531,13 @@ func rewriteValueARM_OpARMXOR_0(v *Value) bool { // cond: // result: (XORshiftRR x y [c]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRRconst { break } c := v_0.AuxInt y := v_0.Args[0] - x := v.Args[1] v.reset(OpARMXORshiftRR) v.AuxInt = c v.AddArg(x) @@ -17086,9 +16557,8 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { if v_1.Op != OpARMSLL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMXORshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -17099,15 +16569,13 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { // cond: // result: (XORshiftLLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMXORshiftLLreg) v.AddArg(x) v.AddArg(y) @@ -17124,9 +16592,8 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { if v_1.Op != OpARMSRL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMXORshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -17137,15 +16604,13 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { // cond: // result: (XORshiftRLreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMXORshiftRLreg) v.AddArg(x) v.AddArg(y) @@ -17162,9 +16627,8 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { if v_1.Op != OpARMSRA { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARMXORshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -17175,15 +16639,13 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { // cond: // result: (XORshiftRAreg x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRA { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpARMXORshiftRAreg) v.AddArg(x) v.AddArg(y) @@ -17194,9 +16656,8 @@ func rewriteValueARM_OpARMXOR_10(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARMMOVWconst) @@ -17259,13 +16720,12 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { // result: (XORconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLLconst, x.Type) @@ -17296,7 +16756,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { // result: (SRRconst [32-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -17304,8 +16764,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -17323,7 +16782,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMBFXU { break @@ -17334,8 +16793,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMREV16) @@ -17352,7 +16810,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSRLconst { break @@ -17370,8 +16828,7 @@ func rewriteValueARM_OpARMXORshiftLL_0(v *Value) bool { if v_0_0.AuxInt != 16 { break } - x := v_0_0.Args[0] - if x != v.Args[1] { + if x != v_0_0.Args[0] { break } if !(objabi.GOARM >= 6) { @@ -17411,14 +16868,13 @@ func rewriteValueARM_OpARMXORshiftLLreg_0(v *Value) bool { // cond: // result: (XORconst [c] (SLL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -17454,13 +16910,12 @@ func rewriteValueARM_OpARMXORshiftRA_0(v *Value) bool { // result: (XORconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRAconst, x.Type) @@ -17516,14 +16971,13 @@ func rewriteValueARM_OpARMXORshiftRAreg_0(v *Value) bool { // cond: // result: (XORconst [c] (SRA x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRA, x.Type) @@ -17559,13 +17013,12 @@ func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { // result: (XORconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRLconst, x.Type) @@ -17596,7 +17049,7 @@ func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { // result: (SRRconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMSLLconst { break @@ -17604,8 +17057,7 @@ func rewriteValueARM_OpARMXORshiftRL_0(v *Value) bool { if v_0.AuxInt != 32-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARMSRRconst) @@ -17643,14 +17095,13 @@ func rewriteValueARM_OpARMXORshiftRLreg_0(v *Value) bool { // cond: // result: (XORconst [c] (SRL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -17686,13 +17137,12 @@ func rewriteValueARM_OpARMXORshiftRR_0(v *Value) bool { // result: (XORconst [c] (SRRconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARMMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARMXORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARMSRRconst, x.Type) @@ -17725,9 +17175,8 @@ func rewriteValueARM_OpAdd16_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADD) v.AddArg(x) v.AddArg(y) @@ -17739,9 +17188,8 @@ func rewriteValueARM_OpAdd32_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADD) v.AddArg(x) v.AddArg(y) @@ -17753,9 +17201,8 @@ func rewriteValueARM_OpAdd32F_0(v *Value) bool { // cond: // result: (ADDF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADDF) v.AddArg(x) v.AddArg(y) @@ -17767,9 +17214,8 @@ func rewriteValueARM_OpAdd32carry_0(v *Value) bool { // cond: // result: (ADDS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADDS) v.AddArg(x) v.AddArg(y) @@ -17781,10 +17227,9 @@ func rewriteValueARM_OpAdd32withcarry_0(v *Value) bool { // cond: // result: (ADC x y c) for { - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(OpARMADC) v.AddArg(x) v.AddArg(y) @@ -17797,9 +17242,8 @@ func rewriteValueARM_OpAdd64F_0(v *Value) bool { // cond: // result: (ADDD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADDD) v.AddArg(x) v.AddArg(y) @@ -17811,9 +17255,8 @@ func rewriteValueARM_OpAdd8_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADD) v.AddArg(x) v.AddArg(y) @@ -17825,9 +17268,8 @@ func rewriteValueARM_OpAddPtr_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADD) v.AddArg(x) v.AddArg(y) @@ -17852,9 +17294,8 @@ func rewriteValueARM_OpAnd16_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMAND) v.AddArg(x) v.AddArg(y) @@ -17866,9 +17307,8 @@ func rewriteValueARM_OpAnd32_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMAND) v.AddArg(x) v.AddArg(y) @@ -17880,9 +17320,8 @@ func rewriteValueARM_OpAnd8_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMAND) v.AddArg(x) v.AddArg(y) @@ -17894,9 +17333,8 @@ func rewriteValueARM_OpAndB_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMAND) v.AddArg(x) v.AddArg(y) @@ -17910,9 +17348,8 @@ func rewriteValueARM_OpAvg32u_0(v *Value) bool { // result: (ADD (SRLconst (SUB x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMADD) v0 := b.NewValue0(v.Pos, OpARMSRLconst, t) v0.AuxInt = 1 @@ -17993,10 +17430,9 @@ func rewriteValueARM_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpARMCALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -18287,9 +17723,8 @@ func rewriteValueARM_OpDiv16_0(v *Value) bool { // cond: // result: (Div32 (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpDiv32) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -18307,9 +17742,8 @@ func rewriteValueARM_OpDiv16u_0(v *Value) bool { // cond: // result: (Div32u (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpDiv32u) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -18327,9 +17761,8 @@ func rewriteValueARM_OpDiv32_0(v *Value) bool { // cond: // result: (SUB (XOR (Select0 (CALLudiv (SUB (XOR x (Signmask x)) (Signmask x)) (SUB (XOR y (Signmask y)) (Signmask y)))) (Signmask (XOR x y))) (Signmask (XOR x y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) v1 := b.NewValue0(v.Pos, OpSelect0, typ.UInt32) @@ -18379,9 +17812,8 @@ func rewriteValueARM_OpDiv32F_0(v *Value) bool { // cond: // result: (DIVF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMDIVF) v.AddArg(x) v.AddArg(y) @@ -18395,9 +17827,8 @@ func rewriteValueARM_OpDiv32u_0(v *Value) bool { // cond: // result: (Select0 (CALLudiv x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v.Type = typ.UInt32 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) @@ -18412,9 +17843,8 @@ func rewriteValueARM_OpDiv64F_0(v *Value) bool { // cond: // result: (DIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMDIVD) v.AddArg(x) v.AddArg(y) @@ -18428,9 +17858,8 @@ func rewriteValueARM_OpDiv8_0(v *Value) bool { // cond: // result: (Div32 (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpDiv32) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -18448,9 +17877,8 @@ func rewriteValueARM_OpDiv8u_0(v *Value) bool { // cond: // result: (Div32u (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpDiv32u) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -18468,9 +17896,8 @@ func rewriteValueARM_OpEq16_0(v *Value) bool { // cond: // result: (Equal (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -18489,9 +17916,8 @@ func rewriteValueARM_OpEq32_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18506,9 +17932,8 @@ func rewriteValueARM_OpEq32F_0(v *Value) bool { // cond: // result: (Equal (CMPF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(x) @@ -18523,9 +17948,8 @@ func rewriteValueARM_OpEq64F_0(v *Value) bool { // cond: // result: (Equal (CMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(x) @@ -18541,9 +17965,8 @@ func rewriteValueARM_OpEq8_0(v *Value) bool { // cond: // result: (Equal (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -18563,9 +17986,8 @@ func rewriteValueARM_OpEqB_0(v *Value) bool { // cond: // result: (XORconst [1] (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpARMXOR, typ.Bool) @@ -18581,9 +18003,8 @@ func rewriteValueARM_OpEqPtr_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18599,9 +18020,8 @@ func rewriteValueARM_OpGeq16_0(v *Value) bool { // cond: // result: (GreaterEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -18621,9 +18041,8 @@ func rewriteValueARM_OpGeq16U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -18642,9 +18061,8 @@ func rewriteValueARM_OpGeq32_0(v *Value) bool { // cond: // result: (GreaterEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18659,9 +18077,8 @@ func rewriteValueARM_OpGeq32F_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(x) @@ -18676,9 +18093,8 @@ func rewriteValueARM_OpGeq32U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18693,9 +18109,8 @@ func rewriteValueARM_OpGeq64F_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(x) @@ -18711,9 +18126,8 @@ func rewriteValueARM_OpGeq8_0(v *Value) bool { // cond: // result: (GreaterEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -18733,9 +18147,8 @@ func rewriteValueARM_OpGeq8U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -18782,9 +18195,8 @@ func rewriteValueARM_OpGreater16_0(v *Value) bool { // cond: // result: (GreaterThan (CMP (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -18804,9 +18216,8 @@ func rewriteValueARM_OpGreater16U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -18825,9 +18236,8 @@ func rewriteValueARM_OpGreater32_0(v *Value) bool { // cond: // result: (GreaterThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18842,9 +18252,8 @@ func rewriteValueARM_OpGreater32F_0(v *Value) bool { // cond: // result: (GreaterThan (CMPF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(x) @@ -18859,9 +18268,8 @@ func rewriteValueARM_OpGreater32U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -18876,9 +18284,8 @@ func rewriteValueARM_OpGreater64F_0(v *Value) bool { // cond: // result: (GreaterThan (CMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(x) @@ -18894,9 +18301,8 @@ func rewriteValueARM_OpGreater8_0(v *Value) bool { // cond: // result: (GreaterThan (CMP (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -18916,9 +18322,8 @@ func rewriteValueARM_OpGreater8U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -18936,9 +18341,8 @@ func rewriteValueARM_OpHmul32_0(v *Value) bool { // cond: // result: (HMUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMHMUL) v.AddArg(x) v.AddArg(y) @@ -18950,9 +18354,8 @@ func rewriteValueARM_OpHmul32u_0(v *Value) bool { // cond: // result: (HMULU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMHMULU) v.AddArg(x) v.AddArg(y) @@ -18965,9 +18368,8 @@ func rewriteValueARM_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpARMCALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -18981,9 +18383,8 @@ func rewriteValueARM_OpIsInBounds_0(v *Value) bool { // cond: // result: (LessThanU (CMP idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpARMLessThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(idx) @@ -19013,9 +18414,8 @@ func rewriteValueARM_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (LessEqualU (CMP idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpARMLessEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(idx) @@ -19031,9 +18431,8 @@ func rewriteValueARM_OpLeq16_0(v *Value) bool { // cond: // result: (LessEqual (CMP (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -19053,9 +18452,8 @@ func rewriteValueARM_OpLeq16U_0(v *Value) bool { // cond: // result: (LessEqualU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -19074,9 +18472,8 @@ func rewriteValueARM_OpLeq32_0(v *Value) bool { // cond: // result: (LessEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -19091,9 +18488,8 @@ func rewriteValueARM_OpLeq32F_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(y) @@ -19108,9 +18504,8 @@ func rewriteValueARM_OpLeq32U_0(v *Value) bool { // cond: // result: (LessEqualU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -19125,9 +18520,8 @@ func rewriteValueARM_OpLeq64F_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterEqual) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(y) @@ -19143,9 +18537,8 @@ func rewriteValueARM_OpLeq8_0(v *Value) bool { // cond: // result: (LessEqual (CMP (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -19165,9 +18558,8 @@ func rewriteValueARM_OpLeq8U_0(v *Value) bool { // cond: // result: (LessEqualU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessEqualU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -19187,9 +18579,8 @@ func rewriteValueARM_OpLess16_0(v *Value) bool { // cond: // result: (LessThan (CMP (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -19209,9 +18600,8 @@ func rewriteValueARM_OpLess16U_0(v *Value) bool { // cond: // result: (LessThanU (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -19230,9 +18620,8 @@ func rewriteValueARM_OpLess32_0(v *Value) bool { // cond: // result: (LessThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -19247,9 +18636,8 @@ func rewriteValueARM_OpLess32F_0(v *Value) bool { // cond: // result: (GreaterThan (CMPF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(y) @@ -19264,9 +18652,8 @@ func rewriteValueARM_OpLess32U_0(v *Value) bool { // cond: // result: (LessThanU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -19281,9 +18668,8 @@ func rewriteValueARM_OpLess64F_0(v *Value) bool { // cond: // result: (GreaterThan (CMPD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMGreaterThan) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(y) @@ -19299,9 +18685,8 @@ func rewriteValueARM_OpLess8_0(v *Value) bool { // cond: // result: (LessThan (CMP (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThan) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -19321,9 +18706,8 @@ func rewriteValueARM_OpLess8U_0(v *Value) bool { // cond: // result: (LessThanU (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMLessThanU) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -19342,9 +18726,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean()) { break } @@ -19358,9 +18741,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -19374,9 +18756,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && !isSigned(t)) { break } @@ -19390,9 +18771,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -19406,9 +18786,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVHUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -19422,9 +18801,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) || isPtr(t)) { break } @@ -19438,9 +18816,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVFload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -19454,9 +18831,8 @@ func rewriteValueARM_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -19488,9 +18864,8 @@ func rewriteValueARM_OpLsh16x16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19514,9 +18889,8 @@ func rewriteValueARM_OpLsh16x32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19576,9 +18950,8 @@ func rewriteValueARM_OpLsh16x8_0(v *Value) bool { // cond: // result: (SLL x (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSLL) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -19594,9 +18967,8 @@ func rewriteValueARM_OpLsh32x16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19620,9 +18992,8 @@ func rewriteValueARM_OpLsh32x32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19682,9 +19053,8 @@ func rewriteValueARM_OpLsh32x8_0(v *Value) bool { // cond: // result: (SLL x (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSLL) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -19700,9 +19070,8 @@ func rewriteValueARM_OpLsh8x16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19726,9 +19095,8 @@ func rewriteValueARM_OpLsh8x32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SLL x y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSLL, x.Type) @@ -19788,9 +19156,8 @@ func rewriteValueARM_OpLsh8x8_0(v *Value) bool { // cond: // result: (SLL x (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSLL) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -19806,9 +19173,8 @@ func rewriteValueARM_OpMod16_0(v *Value) bool { // cond: // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -19826,9 +19192,8 @@ func rewriteValueARM_OpMod16u_0(v *Value) bool { // cond: // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32u) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -19846,9 +19211,8 @@ func rewriteValueARM_OpMod32_0(v *Value) bool { // cond: // result: (SUB (XOR (Select1 (CALLudiv (SUB (XOR x (Signmask x)) (Signmask x)) (SUB (XOR y (Signmask y)) (Signmask y)))) (Signmask x)) (Signmask x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v0 := b.NewValue0(v.Pos, OpARMXOR, typ.UInt32) v1 := b.NewValue0(v.Pos, OpSelect1, typ.UInt32) @@ -19894,9 +19258,8 @@ func rewriteValueARM_OpMod32u_0(v *Value) bool { // cond: // result: (Select1 (CALLudiv x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v.Type = typ.UInt32 v0 := b.NewValue0(v.Pos, OpARMCALLudiv, types.NewTuple(typ.UInt32, typ.UInt32)) @@ -19913,9 +19276,8 @@ func rewriteValueARM_OpMod8_0(v *Value) bool { // cond: // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -19933,9 +19295,8 @@ func rewriteValueARM_OpMod8u_0(v *Value) bool { // cond: // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32u) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -19957,7 +19318,6 @@ func rewriteValueARM_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -19971,10 +19331,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpARMMOVBUload, typ.UInt8) @@ -19992,10 +19351,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -20015,10 +19373,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = 1 v.AddArg(dst) @@ -20045,10 +19402,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -20069,10 +19425,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -20101,10 +19456,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = 3 v.AddArg(dst) @@ -20148,10 +19502,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARMMOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -20185,10 +19538,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { break } @@ -20205,10 +19557,9 @@ func rewriteValueARM_OpMove_0(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { break } @@ -20230,9 +19581,8 @@ func rewriteValueARM_OpMul16_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMUL) v.AddArg(x) v.AddArg(y) @@ -20244,9 +19594,8 @@ func rewriteValueARM_OpMul32_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMUL) v.AddArg(x) v.AddArg(y) @@ -20258,9 +19607,8 @@ func rewriteValueARM_OpMul32F_0(v *Value) bool { // cond: // result: (MULF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMULF) v.AddArg(x) v.AddArg(y) @@ -20272,9 +19620,8 @@ func rewriteValueARM_OpMul32uhilo_0(v *Value) bool { // cond: // result: (MULLU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMULLU) v.AddArg(x) v.AddArg(y) @@ -20286,9 +19633,8 @@ func rewriteValueARM_OpMul64F_0(v *Value) bool { // cond: // result: (MULD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMULD) v.AddArg(x) v.AddArg(y) @@ -20300,9 +19646,8 @@ func rewriteValueARM_OpMul8_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMMUL) v.AddArg(x) v.AddArg(y) @@ -20374,9 +19719,8 @@ func rewriteValueARM_OpNeq16_0(v *Value) bool { // cond: // result: (NotEqual (CMP (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -20395,9 +19739,8 @@ func rewriteValueARM_OpNeq32_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -20412,9 +19755,8 @@ func rewriteValueARM_OpNeq32F_0(v *Value) bool { // cond: // result: (NotEqual (CMPF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMPF, types.TypeFlags) v0.AddArg(x) @@ -20429,9 +19771,8 @@ func rewriteValueARM_OpNeq64F_0(v *Value) bool { // cond: // result: (NotEqual (CMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMPD, types.TypeFlags) v0.AddArg(x) @@ -20447,9 +19788,8 @@ func rewriteValueARM_OpNeq8_0(v *Value) bool { // cond: // result: (NotEqual (CMP (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -20467,9 +19807,8 @@ func rewriteValueARM_OpNeqB_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMXOR) v.AddArg(x) v.AddArg(y) @@ -20482,9 +19821,8 @@ func rewriteValueARM_OpNeqPtr_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMNotEqual) v0 := b.NewValue0(v.Pos, OpARMCMP, types.TypeFlags) v0.AddArg(x) @@ -20498,9 +19836,8 @@ func rewriteValueARM_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARMLoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -20551,9 +19888,8 @@ func rewriteValueARM_OpOr16_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMOR) v.AddArg(x) v.AddArg(y) @@ -20565,9 +19901,8 @@ func rewriteValueARM_OpOr32_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMOR) v.AddArg(x) v.AddArg(y) @@ -20579,9 +19914,8 @@ func rewriteValueARM_OpOr8_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMOR) v.AddArg(x) v.AddArg(y) @@ -20593,9 +19927,8 @@ func rewriteValueARM_OpOrB_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMOR) v.AddArg(x) v.AddArg(y) @@ -20633,9 +19966,8 @@ func rewriteValueARM_OpRsh16Ux16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL (ZeroExt16to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -20662,9 +19994,8 @@ func rewriteValueARM_OpRsh16Ux32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL (ZeroExt16to32 x) y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -20731,9 +20062,8 @@ func rewriteValueARM_OpRsh16Ux8_0(v *Value) bool { // cond: // result: (SRL (ZeroExt16to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRL) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -20751,9 +20081,8 @@ func rewriteValueARM_OpRsh16x16_0(v *Value) bool { // cond: // result: (SRAcond (SignExt16to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -20777,9 +20106,8 @@ func rewriteValueARM_OpRsh16x32_0(v *Value) bool { // cond: // result: (SRAcond (SignExt16to32 x) y (CMPconst [256] y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -20848,9 +20176,8 @@ func rewriteValueARM_OpRsh16x8_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -20868,9 +20195,8 @@ func rewriteValueARM_OpRsh32Ux16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL x (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -20894,9 +20220,8 @@ func rewriteValueARM_OpRsh32Ux32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL x y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -20956,9 +20281,8 @@ func rewriteValueARM_OpRsh32Ux8_0(v *Value) bool { // cond: // result: (SRL x (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRL) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -20974,9 +20298,8 @@ func rewriteValueARM_OpRsh32x16_0(v *Value) bool { // cond: // result: (SRAcond x (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -20997,9 +20320,8 @@ func rewriteValueARM_OpRsh32x32_0(v *Value) bool { // cond: // result: (SRAcond x y (CMPconst [256] y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v.AddArg(x) v.AddArg(y) @@ -21058,9 +20380,8 @@ func rewriteValueARM_OpRsh32x8_0(v *Value) bool { // cond: // result: (SRA x (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -21076,9 +20397,8 @@ func rewriteValueARM_OpRsh8Ux16_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL (ZeroExt8to32 x) (ZeroExt16to32 y)) (CMPconst [256] (ZeroExt16to32 y)) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -21105,9 +20425,8 @@ func rewriteValueARM_OpRsh8Ux32_0(v *Value) bool { // cond: // result: (CMOVWHSconst (SRL (ZeroExt8to32 x) y) (CMPconst [256] y) [0]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMCMOVWHSconst) v.AuxInt = 0 v0 := b.NewValue0(v.Pos, OpARMSRL, x.Type) @@ -21174,9 +20493,8 @@ func rewriteValueARM_OpRsh8Ux8_0(v *Value) bool { // cond: // result: (SRL (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRL) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -21194,9 +20512,8 @@ func rewriteValueARM_OpRsh8x16_0(v *Value) bool { // cond: // result: (SRAcond (SignExt8to32 x) (ZeroExt16to32 y) (CMPconst [256] (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -21220,9 +20537,8 @@ func rewriteValueARM_OpRsh8x32_0(v *Value) bool { // cond: // result: (SRAcond (SignExt8to32 x) y (CMPconst [256] y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRAcond) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -21291,9 +20607,8 @@ func rewriteValueARM_OpRsh8x8_0(v *Value) bool { // cond: // result: (SRA (SignExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSRA) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -21538,10 +20853,9 @@ func rewriteValueARM_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -21556,10 +20870,9 @@ func rewriteValueARM_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -21574,10 +20887,9 @@ func rewriteValueARM_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { break } @@ -21592,10 +20904,9 @@ func rewriteValueARM_OpStore_0(v *Value) bool { // result: (MOVFstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -21610,10 +20921,9 @@ func rewriteValueARM_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -21630,9 +20940,8 @@ func rewriteValueARM_OpSub16_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v.AddArg(x) v.AddArg(y) @@ -21644,9 +20953,8 @@ func rewriteValueARM_OpSub32_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v.AddArg(x) v.AddArg(y) @@ -21658,9 +20966,8 @@ func rewriteValueARM_OpSub32F_0(v *Value) bool { // cond: // result: (SUBF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUBF) v.AddArg(x) v.AddArg(y) @@ -21672,9 +20979,8 @@ func rewriteValueARM_OpSub32carry_0(v *Value) bool { // cond: // result: (SUBS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUBS) v.AddArg(x) v.AddArg(y) @@ -21686,10 +20992,9 @@ func rewriteValueARM_OpSub32withcarry_0(v *Value) bool { // cond: // result: (SBC x y c) for { - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(OpARMSBC) v.AddArg(x) v.AddArg(y) @@ -21702,9 +21007,8 @@ func rewriteValueARM_OpSub64F_0(v *Value) bool { // cond: // result: (SUBD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUBD) v.AddArg(x) v.AddArg(y) @@ -21716,9 +21020,8 @@ func rewriteValueARM_OpSub8_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v.AddArg(x) v.AddArg(y) @@ -21730,9 +21033,8 @@ func rewriteValueARM_OpSubPtr_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMSUB) v.AddArg(x) v.AddArg(y) @@ -21781,10 +21083,9 @@ func rewriteValueARM_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpARMLoweredWB) v.Aux = fn v.AddArg(destptr) @@ -21798,9 +21099,8 @@ func rewriteValueARM_OpXor16_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMXOR) v.AddArg(x) v.AddArg(y) @@ -21812,9 +21112,8 @@ func rewriteValueARM_OpXor32_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMXOR) v.AddArg(x) v.AddArg(y) @@ -21826,9 +21125,8 @@ func rewriteValueARM_OpXor8_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARMXOR) v.AddArg(x) v.AddArg(y) @@ -21846,7 +21144,6 @@ func rewriteValueARM_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -21860,9 +21157,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARMMOVBstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpARMMOVWconst, typ.UInt32) @@ -21879,9 +21175,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -21900,9 +21195,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARMMOVBstore) v.AuxInt = 1 v.AddArg(ptr) @@ -21927,9 +21221,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -21949,9 +21242,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -21978,9 +21270,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARMMOVBstore) v.AuxInt = 3 v.AddArg(ptr) @@ -22018,9 +21309,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARMMOVBstore) v.AuxInt = 2 v.AddArg(ptr) @@ -22050,9 +21340,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%4 == 0 && s > 4 && s <= 512 && t.(*types.Type).Alignment()%4 == 0 && !config.noDuffDevice) { break } @@ -22071,9 +21360,8 @@ func rewriteValueARM_OpZero_0(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !((s > 512 || config.noDuffDevice) || t.(*types.Type).Alignment()%4 != 0) { break } @@ -22250,9 +21538,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22279,10 +21566,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -22341,9 +21627,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22372,9 +21657,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22403,9 +21687,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22433,10 +21716,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22464,10 +21746,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22495,10 +21776,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22526,9 +21806,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22555,10 +21834,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -22617,9 +21895,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22648,9 +21925,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22679,9 +21955,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22709,10 +21984,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22740,10 +22014,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22771,10 +22044,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22802,9 +22074,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22860,9 +22131,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22891,9 +22161,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22922,9 +22191,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -22952,10 +22220,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -22983,10 +22250,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23014,10 +22280,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23045,9 +22310,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23103,9 +22367,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23134,9 +22397,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23165,9 +22427,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23195,10 +22456,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23226,10 +22486,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23257,10 +22516,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23370,9 +22628,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23399,10 +22656,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -23461,9 +22717,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23492,9 +22747,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23523,9 +22777,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23553,10 +22806,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23584,10 +22836,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23615,10 +22866,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23646,9 +22896,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23675,10 +22924,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -23737,9 +22985,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23768,9 +23015,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23799,9 +23045,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23829,10 +23074,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23860,10 +23104,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23891,10 +23134,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -23922,9 +23164,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -23980,9 +23221,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24011,9 +23251,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24042,9 +23281,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24072,10 +23310,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24103,10 +23340,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24134,10 +23370,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24165,9 +23400,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24223,9 +23457,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24254,9 +23487,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24285,9 +23517,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24315,10 +23546,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24346,10 +23576,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24377,10 +23606,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24491,9 +23719,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24520,10 +23747,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -24582,9 +23808,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24613,9 +23838,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24644,9 +23868,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24674,10 +23897,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24705,10 +23927,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24736,10 +23957,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24767,9 +23987,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24825,9 +24044,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24856,9 +24074,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24887,9 +24104,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -24917,10 +24133,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24948,10 +24163,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -24979,10 +24193,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25010,9 +24223,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25039,10 +24251,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -25101,9 +24312,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25132,9 +24342,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25163,9 +24372,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25193,10 +24401,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25224,10 +24431,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25255,10 +24461,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25286,9 +24491,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25344,9 +24548,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25375,9 +24578,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25406,9 +24608,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25436,10 +24637,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25467,10 +24667,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25498,10 +24697,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25767,9 +24965,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25796,10 +24993,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -25858,9 +25054,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25889,9 +25084,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25920,9 +25114,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -25950,10 +25143,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -25981,10 +25173,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26012,10 +25203,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26043,9 +25233,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26072,10 +25261,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -26134,9 +25322,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26165,9 +25352,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26196,9 +25382,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26226,10 +25411,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26257,10 +25441,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26288,10 +25471,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26319,9 +25501,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26377,9 +25558,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26408,9 +25588,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26439,9 +25618,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26469,10 +25647,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26500,10 +25677,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26531,10 +25707,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26562,9 +25737,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26620,9 +25794,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26651,9 +25824,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26682,9 +25854,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26712,10 +25883,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26743,10 +25913,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26774,10 +25943,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -26888,9 +26056,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -26917,10 +26084,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -26979,9 +26145,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27010,9 +26175,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27041,9 +26205,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27071,10 +26234,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27102,10 +26264,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27133,10 +26294,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27164,9 +26324,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27193,10 +26352,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -27255,9 +26413,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27286,9 +26443,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27317,9 +26473,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27347,10 +26502,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27378,10 +26532,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27409,10 +26562,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27440,9 +26592,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27498,9 +26649,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27529,9 +26679,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27560,9 +26709,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27590,10 +26738,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27621,10 +26768,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27652,10 +26798,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27683,9 +26828,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27741,9 +26885,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27772,9 +26915,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27803,9 +26945,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -27833,10 +26974,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27864,10 +27004,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -27895,10 +27034,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28217,9 +27355,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUB { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28246,10 +27383,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULS { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -28308,9 +27444,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28339,9 +27474,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28370,9 +27504,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28400,10 +27533,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28431,10 +27563,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28462,10 +27593,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMSUBshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28493,9 +27623,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADD { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28522,10 +27651,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMMULA { break } - _ = l.Args[2] + a := l.Args[2] x := l.Args[0] y := l.Args[1] - a := l.Args[2] if !(l.Uses == 1) { break } @@ -28584,9 +27712,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28615,9 +27742,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28646,9 +27772,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28676,10 +27801,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28707,10 +27831,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28738,10 +27861,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMADDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28769,9 +27891,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMAND { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28827,9 +27948,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28858,9 +27978,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28889,9 +28008,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -28919,10 +28037,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28950,10 +28067,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -28981,10 +28097,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMANDshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -29012,9 +28127,8 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXOR { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -29070,9 +28184,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -29101,9 +28214,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -29132,9 +28244,8 @@ func rewriteBlockARM(b *Block) bool { break } c := l.AuxInt - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1) { break } @@ -29162,10 +28273,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftLLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -29193,10 +28303,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRLreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } @@ -29224,10 +28333,9 @@ func rewriteBlockARM(b *Block) bool { if l.Op != OpARMXORshiftRAreg { break } - _ = l.Args[2] + z := l.Args[2] x := l.Args[0] y := l.Args[1] - z := l.Args[2] if !(l.Uses == 1) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 63e87880e8..89f01b4d84 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -967,13 +967,12 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // cond: // result: (ADDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ADDconst) v.AuxInt = c v.AddArg(x) @@ -989,9 +988,8 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { if l.Op != OpARM64MUL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -1005,15 +1003,13 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // cond: l.Uses==1 && clobber(l) // result: (MADD a x y) for { - _ = v.Args[1] + a := v.Args[1] l := v.Args[0] if l.Op != OpARM64MUL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] - a := v.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -1033,9 +1029,8 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { if l.Op != OpARM64MNEG { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -1049,15 +1044,13 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // cond: l.Uses==1 && clobber(l) // result: (MSUB a x y) for { - _ = v.Args[1] + a := v.Args[1] l := v.Args[0] if l.Op != OpARM64MNEG { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] - a := v.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -1077,9 +1070,8 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { if l.Op != OpARM64MULW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -1093,15 +1085,13 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) // result: (MADDW a x y) for { - _ = v.Args[1] + a := v.Args[1] l := v.Args[0] if l.Op != OpARM64MULW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] - a := v.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -1121,9 +1111,8 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { if l.Op != OpARM64MNEGW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -1137,15 +1126,13 @@ func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // cond: a.Type.Size() != 8 && l.Uses==1 && clobber(l) // result: (MSUBW a x y) for { - _ = v.Args[1] + a := v.Args[1] l := v.Args[0] if l.Op != OpARM64MNEGW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] - a := v.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -1180,13 +1167,12 @@ func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64NEG { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -1217,14 +1203,13 @@ func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (ADDshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -1259,14 +1244,13 @@ func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (ADDshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -1301,14 +1285,13 @@ func rewriteValueARM64_OpARM64ADD_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (ADDshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -2325,13 +2308,12 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { // result: (ADDconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -2362,7 +2344,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { // result: (RORconst [64-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -2370,8 +2352,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -2385,14 +2366,13 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { @@ -2413,7 +2393,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break @@ -2424,8 +2404,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64REV16W) @@ -2437,7 +2416,7 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { // result: (EXTRconst [64-c] x2 x) for { c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -2446,7 +2425,6 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { break } x := v_0.Args[0] - x2 := v.Args[1] v.reset(OpARM64EXTRconst) v.AuxInt = 64 - c v.AddArg(x2) @@ -2459,14 +2437,13 @@ func rewriteValueARM64_OpARM64ADDshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt x := v_0.Args[0] - x2 := v.Args[1] if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } @@ -2485,13 +2462,12 @@ func rewriteValueARM64_OpARM64ADDshiftRA_0(v *Value) bool { // result: (ADDconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -2526,13 +2502,12 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { // result: (ADDconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -2563,7 +2538,7 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { // result: (RORconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -2571,8 +2546,7 @@ func rewriteValueARM64_OpARM64ADDshiftRL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -2633,13 +2607,12 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { // cond: // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ANDconst) v.AuxInt = c v.AddArg(x) @@ -2649,9 +2622,8 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -2679,13 +2651,12 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { // cond: // result: (BIC x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MVN { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARM64BIC) v.AddArg(x) v.AddArg(y) @@ -2716,14 +2687,13 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (ANDshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -2758,14 +2728,13 @@ func rewriteValueARM64_OpARM64AND_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (ANDshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -2803,14 +2772,13 @@ func rewriteValueARM64_OpARM64AND_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (ANDshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -2969,13 +2937,12 @@ func rewriteValueARM64_OpARM64ANDshiftLL_0(v *Value) bool { // result: (ANDconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -3033,13 +3000,12 @@ func rewriteValueARM64_OpARM64ANDshiftRA_0(v *Value) bool { // result: (ANDconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -3097,13 +3063,12 @@ func rewriteValueARM64_OpARM64ANDshiftRL_0(v *Value) bool { // result: (ANDconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ANDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -3175,9 +3140,8 @@ func rewriteValueARM64_OpARM64BIC_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARM64MOVDconst) @@ -3396,13 +3360,12 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { // cond: // result: (CMNconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64CMNconst) v.AuxInt = c v.AddArg(x) @@ -3433,14 +3396,13 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (CMNshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -3475,14 +3437,13 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (CMNshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -3517,14 +3478,13 @@ func rewriteValueARM64_OpARM64CMN_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (CMNshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -3557,13 +3517,12 @@ func rewriteValueARM64_OpARM64CMNW_0(v *Value) bool { // cond: // result: (CMNWconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64CMNWconst) v.AuxInt = c v.AddArg(x) @@ -3744,13 +3703,12 @@ func rewriteValueARM64_OpARM64CMNshiftLL_0(v *Value) bool { // result: (CMNconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64CMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -3785,13 +3743,12 @@ func rewriteValueARM64_OpARM64CMNshiftRA_0(v *Value) bool { // result: (CMNconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64CMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -3826,13 +3783,12 @@ func rewriteValueARM64_OpARM64CMNshiftRL_0(v *Value) bool { // result: (CMNconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64CMNconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -3882,13 +3838,12 @@ func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { // cond: // result: (InvertFlags (CMPconst [c] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) v0.AuxInt = c @@ -3921,14 +3876,13 @@ func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { // cond: clobberIfDead(x0) // result: (InvertFlags (CMPshiftLL x1 y [c])) for { - _ = v.Args[1] + x1 := v.Args[1] x0 := v.Args[0] if x0.Op != OpARM64SLLconst { break } c := x0.AuxInt y := x0.Args[0] - x1 := v.Args[1] if !(clobberIfDead(x0)) { break } @@ -3965,14 +3919,13 @@ func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { // cond: clobberIfDead(x0) // result: (InvertFlags (CMPshiftRL x1 y [c])) for { - _ = v.Args[1] + x1 := v.Args[1] x0 := v.Args[0] if x0.Op != OpARM64SRLconst { break } c := x0.AuxInt y := x0.Args[0] - x1 := v.Args[1] if !(clobberIfDead(x0)) { break } @@ -4009,14 +3962,13 @@ func rewriteValueARM64_OpARM64CMP_0(v *Value) bool { // cond: clobberIfDead(x0) // result: (InvertFlags (CMPshiftRA x1 y [c])) for { - _ = v.Args[1] + x1 := v.Args[1] x0 := v.Args[0] if x0.Op != OpARM64SRAconst { break } c := x0.AuxInt y := x0.Args[0] - x1 := v.Args[1] if !(clobberIfDead(x0)) { break } @@ -4052,13 +4004,12 @@ func rewriteValueARM64_OpARM64CMPW_0(v *Value) bool { // cond: // result: (InvertFlags (CMPWconst [int64(int32(c))] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, types.TypeFlags) v0.AuxInt = int64(int32(c)) @@ -4348,13 +4299,12 @@ func rewriteValueARM64_OpARM64CMPshiftLL_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SLLconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) v0.AuxInt = c @@ -4391,13 +4341,12 @@ func rewriteValueARM64_OpARM64CMPshiftRA_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SRAconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) v0.AuxInt = c @@ -4434,13 +4383,12 @@ func rewriteValueARM64_OpARM64CMPshiftRL_0(v *Value) bool { // result: (InvertFlags (CMPconst [c] (SRLconst x [d]))) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64CMPconst, types.TypeFlags) v0.AuxInt = c @@ -4476,7 +4424,7 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { // result: (CSEL0 {cc} x flag) for { cc := v.Aux - _ = v.Args[2] + flag := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -4485,7 +4433,6 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { if v_1.AuxInt != 0 { break } - flag := v.Args[2] v.reset(OpARM64CSEL0) v.Aux = cc v.AddArg(x) @@ -4497,7 +4444,7 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { // result: (CSEL0 {arm64Negate(cc.(Op))} y flag) for { cc := v.Aux - _ = v.Args[2] + flag := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -4506,7 +4453,6 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { break } y := v.Args[1] - flag := v.Args[2] v.reset(OpARM64CSEL0) v.Aux = arm64Negate(cc.(Op)) v.AddArg(y) @@ -4538,9 +4484,8 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { // result: x for { cc := v.Aux - _ = v.Args[2] - x := v.Args[0] flag := v.Args[2] + x := v.Args[0] if !(ccARM64Eval(cc, flag) > 0) { break } @@ -4554,9 +4499,8 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { // result: y for { cc := v.Aux - _ = v.Args[2] - y := v.Args[1] flag := v.Args[2] + y := v.Args[1] if !(ccARM64Eval(cc, flag) < 0) { break } @@ -4643,9 +4587,8 @@ func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { // result: x for { cc := v.Aux - _ = v.Args[1] - x := v.Args[0] flag := v.Args[1] + x := v.Args[0] if !(ccARM64Eval(cc, flag) > 0) { break } @@ -4659,7 +4602,6 @@ func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { // result: (MOVDconst [0]) for { cc := v.Aux - _ = v.Args[1] flag := v.Args[1] if !(ccARM64Eval(cc, flag) < 0) { break @@ -4783,9 +4725,8 @@ func rewriteValueARM64_OpARM64EON_0(v *Value) bool { // cond: // result: (MOVDconst [-1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARM64MOVDconst) @@ -5070,9 +5011,8 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { if v_1.Op != OpARM64FMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMADDD) v.AddArg(a) v.AddArg(x) @@ -5083,15 +5023,13 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { // cond: // result: (FMADDD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMADDD) v.AddArg(a) v.AddArg(x) @@ -5108,9 +5046,8 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { if v_1.Op != OpARM64FNMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMSUBD) v.AddArg(a) v.AddArg(x) @@ -5121,15 +5058,13 @@ func rewriteValueARM64_OpARM64FADDD_0(v *Value) bool { // cond: // result: (FMSUBD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMSUBD) v.AddArg(a) v.AddArg(x) @@ -5149,9 +5084,8 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { if v_1.Op != OpARM64FMULS { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMADDS) v.AddArg(a) v.AddArg(x) @@ -5162,15 +5096,13 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { // cond: // result: (FMADDS a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMADDS) v.AddArg(a) v.AddArg(x) @@ -5187,9 +5119,8 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { if v_1.Op != OpARM64FNMULS { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMSUBS) v.AddArg(a) v.AddArg(x) @@ -5200,15 +5131,13 @@ func rewriteValueARM64_OpARM64FADDS_0(v *Value) bool { // cond: // result: (FMSUBS a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMSUBS) v.AddArg(a) v.AddArg(x) @@ -5240,7 +5169,7 @@ func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { // cond: // result: (InvertFlags (FCMPD0 x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMOVDconst { break @@ -5248,7 +5177,6 @@ func rewriteValueARM64_OpARM64FCMPD_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64FCMPD0, types.TypeFlags) v0.AddArg(x) @@ -5280,7 +5208,7 @@ func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { // cond: // result: (InvertFlags (FCMPS0 x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMOVSconst { break @@ -5288,7 +5216,6 @@ func rewriteValueARM64_OpARM64FCMPS_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpARM64InvertFlags) v0 := b.NewValue0(v.Pos, OpARM64FCMPS0, types.TypeFlags) v0.AddArg(x) @@ -5379,14 +5306,13 @@ func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5403,15 +5329,13 @@ func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -5427,7 +5351,7 @@ func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -5435,7 +5359,6 @@ func rewriteValueARM64_OpARM64FMOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5453,14 +5376,13 @@ func rewriteValueARM64_OpARM64FMOVDloadidx_0(v *Value) bool { // cond: // result: (FMOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64FMOVDload) v.AuxInt = c v.AddArg(ptr) @@ -5471,14 +5393,13 @@ func rewriteValueARM64_OpARM64FMOVDloadidx_0(v *Value) bool { // cond: // result: (FMOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64FMOVDload) v.AuxInt = c v.AddArg(ptr) @@ -5496,14 +5417,13 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64FMOVDgpfp { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVDstore) v.AuxInt = off v.Aux = sym @@ -5518,7 +5438,7 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -5526,7 +5446,6 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5544,16 +5463,14 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -5570,7 +5487,7 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -5579,7 +5496,6 @@ func rewriteValueARM64_OpARM64FMOVDstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5598,7 +5514,7 @@ func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { // cond: // result: (FMOVDstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -5606,7 +5522,6 @@ func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64FMOVDstore) v.AuxInt = c v.AddArg(ptr) @@ -5618,7 +5533,7 @@ func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { // cond: // result: (FMOVDstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -5626,7 +5541,6 @@ func rewriteValueARM64_OpARM64FMOVDstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64FMOVDstore) v.AuxInt = c v.AddArg(idx) @@ -5672,14 +5586,13 @@ func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5696,15 +5609,13 @@ func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -5720,7 +5631,7 @@ func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -5728,7 +5639,6 @@ func rewriteValueARM64_OpARM64FMOVSload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5746,14 +5656,13 @@ func rewriteValueARM64_OpARM64FMOVSloadidx_0(v *Value) bool { // cond: // result: (FMOVSload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64FMOVSload) v.AuxInt = c v.AddArg(ptr) @@ -5764,14 +5673,13 @@ func rewriteValueARM64_OpARM64FMOVSloadidx_0(v *Value) bool { // cond: // result: (FMOVSload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64FMOVSload) v.AuxInt = c v.AddArg(ptr) @@ -5789,14 +5697,13 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64FMOVSgpfp { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWstore) v.AuxInt = off v.Aux = sym @@ -5811,7 +5718,7 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -5819,7 +5726,6 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5837,16 +5743,14 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -5863,7 +5767,7 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -5872,7 +5776,6 @@ func rewriteValueARM64_OpARM64FMOVSstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -5891,7 +5794,7 @@ func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { // cond: // result: (FMOVSstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -5899,7 +5802,6 @@ func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64FMOVSstore) v.AuxInt = c v.AddArg(ptr) @@ -5911,7 +5813,7 @@ func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { // cond: // result: (FMOVSstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -5919,7 +5821,6 @@ func rewriteValueARM64_OpARM64FMOVSstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64FMOVSstore) v.AuxInt = c v.AddArg(idx) @@ -5934,13 +5835,12 @@ func rewriteValueARM64_OpARM64FMULD_0(v *Value) bool { // cond: // result: (FNMULD x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNEGD { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64FNMULD) v.AddArg(x) v.AddArg(y) @@ -5969,13 +5869,12 @@ func rewriteValueARM64_OpARM64FMULS_0(v *Value) bool { // cond: // result: (FNMULS x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNEGS { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64FNMULS) v.AddArg(x) v.AddArg(y) @@ -6008,9 +5907,8 @@ func rewriteValueARM64_OpARM64FNEGD_0(v *Value) bool { if v_0.Op != OpARM64FMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMULD) v.AddArg(x) v.AddArg(y) @@ -6024,9 +5922,8 @@ func rewriteValueARM64_OpARM64FNEGD_0(v *Value) bool { if v_0.Op != OpARM64FNMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMULD) v.AddArg(x) v.AddArg(y) @@ -6043,9 +5940,8 @@ func rewriteValueARM64_OpARM64FNEGS_0(v *Value) bool { if v_0.Op != OpARM64FMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMULS) v.AddArg(x) v.AddArg(y) @@ -6059,9 +5955,8 @@ func rewriteValueARM64_OpARM64FNEGS_0(v *Value) bool { if v_0.Op != OpARM64FNMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64FMULS) v.AddArg(x) v.AddArg(y) @@ -6074,13 +5969,12 @@ func rewriteValueARM64_OpARM64FNMULD_0(v *Value) bool { // cond: // result: (FMULD x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNEGD { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64FMULD) v.AddArg(x) v.AddArg(y) @@ -6109,13 +6003,12 @@ func rewriteValueARM64_OpARM64FNMULS_0(v *Value) bool { // cond: // result: (FMULS x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNEGS { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64FMULS) v.AddArg(x) v.AddArg(y) @@ -6150,9 +6043,8 @@ func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { if v_1.Op != OpARM64FMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMSUBD) v.AddArg(a) v.AddArg(x) @@ -6163,15 +6055,13 @@ func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { // cond: // result: (FNMSUBD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMSUBD) v.AddArg(a) v.AddArg(x) @@ -6188,9 +6078,8 @@ func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { if v_1.Op != OpARM64FNMULD { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMADDD) v.AddArg(a) v.AddArg(x) @@ -6201,15 +6090,13 @@ func rewriteValueARM64_OpARM64FSUBD_0(v *Value) bool { // cond: // result: (FNMADDD a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNMULD { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMADDD) v.AddArg(a) v.AddArg(x) @@ -6229,9 +6116,8 @@ func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { if v_1.Op != OpARM64FMULS { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMSUBS) v.AddArg(a) v.AddArg(x) @@ -6242,15 +6128,13 @@ func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { // cond: // result: (FNMSUBS a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMSUBS) v.AddArg(a) v.AddArg(x) @@ -6267,9 +6151,8 @@ func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { if v_1.Op != OpARM64FNMULS { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpARM64FMADDS) v.AddArg(a) v.AddArg(x) @@ -6280,15 +6163,13 @@ func rewriteValueARM64_OpARM64FSUBS_0(v *Value) bool { // cond: // result: (FNMADDS a x y) for { - _ = v.Args[1] + a := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64FNMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - a := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64FNMADDS) v.AddArg(a) v.AddArg(x) @@ -7204,7 +7085,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: // result: (SUB a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -7213,7 +7094,6 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { if v_1.AuxInt != -1 { break } - x := v.Args[2] v.reset(OpARM64SUB) v.AddArg(a) v.AddArg(x) @@ -7241,7 +7121,7 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: // result: (ADD a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -7250,7 +7130,6 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { if v_1.AuxInt != 1 { break } - x := v.Args[2] v.reset(OpARM64ADD) v.AddArg(a) v.AddArg(x) @@ -7260,14 +7139,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (ADDshiftLL a x [log2(c)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -7281,14 +7159,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && c>=3 // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c-1) && c >= 3) { break } @@ -7305,14 +7182,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && c>=7 // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c+1) && c >= 7) { break } @@ -7329,14 +7205,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } @@ -7354,14 +7229,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } @@ -7379,14 +7253,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } @@ -7404,14 +7277,13 @@ func rewriteValueARM64_OpARM64MADD_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } @@ -7433,14 +7305,13 @@ func rewriteValueARM64_OpARM64MADD_20(v *Value) bool { // cond: // result: (ADDconst [c] (MUL x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64MUL, x.Type) @@ -7710,14 +7581,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: int32(c)==-1 // result: (SUB a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(int32(c) == -1) { break } @@ -7749,14 +7619,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: int32(c)==1 // result: (ADD a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(int32(c) == 1) { break } @@ -7769,14 +7638,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (ADDshiftLL a x [log2(c)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -7790,14 +7658,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c)>=3 // result: (ADD a (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -7814,14 +7681,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c)>=7 // result: (SUB a (SUBshiftLL x x [log2(c+1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -7838,14 +7704,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -7863,14 +7728,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -7888,14 +7752,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SUBshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -7913,14 +7776,13 @@ func rewriteValueARM64_OpARM64MADDW_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (ADDshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -7942,14 +7804,13 @@ func rewriteValueARM64_OpARM64MADDW_20(v *Value) bool { // cond: // result: (ADDconst [c] (MULW x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64MULW, x.Type) @@ -8005,7 +7866,7 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -8013,7 +7874,6 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -8072,7 +7932,7 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { // cond: // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -8080,7 +7940,6 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpARM64NEG) v.AddArg(x) return true @@ -8110,13 +7969,12 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (NEG (SLLconst [log2(c)] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -8153,13 +8011,12 @@ func rewriteValueARM64_OpARM64MNEG_0(v *Value) bool { // cond: isPowerOfTwo(c-1) && c >= 3 // result: (NEG (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c-1) && c >= 3) { break } @@ -8203,13 +8060,12 @@ func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && c >= 7 // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c+1) && c >= 7) { break } @@ -8251,13 +8107,12 @@ func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } @@ -8300,13 +8155,12 @@ func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } @@ -8349,13 +8203,12 @@ func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } @@ -8398,13 +8251,12 @@ func rewriteValueARM64_OpARM64MNEG_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } @@ -8487,13 +8339,12 @@ func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { // cond: int32(c)==-1 // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(int32(c) == -1) { break } @@ -8558,13 +8409,12 @@ func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { // cond: int32(c)==1 // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(int32(c) == 1) { break } @@ -8597,13 +8447,12 @@ func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (NEG (SLLconst [log2(c)] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -8640,13 +8489,12 @@ func rewriteValueARM64_OpARM64MNEGW_0(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (NEG (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -8690,13 +8538,12 @@ func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (NEG (ADDshiftLL (NEG x) x [log2(c+1)])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -8738,13 +8585,12 @@ func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SLLconst [log2(c/3)] (SUBshiftLL x x [2])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -8787,13 +8633,12 @@ func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (NEG (SLLconst [log2(c/5)] (ADDshiftLL x x [2]))) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -8836,13 +8681,12 @@ func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SLLconst [log2(c/7)] (SUBshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -8885,13 +8729,12 @@ func rewriteValueARM64_OpARM64MNEGW_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (NEG (SLLconst [log2(c/9)] (ADDshiftLL x x [3]))) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -9002,14 +8845,13 @@ func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9026,15 +8868,13 @@ func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -9050,7 +8890,7 @@ func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -9058,7 +8898,6 @@ func rewriteValueARM64_OpARM64MOVBUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9117,14 +8956,13 @@ func rewriteValueARM64_OpARM64MOVBUloadidx_0(v *Value) bool { // cond: // result: (MOVBUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVBUload) v.AuxInt = c v.AddArg(ptr) @@ -9135,14 +8973,13 @@ func rewriteValueARM64_OpARM64MOVBUloadidx_0(v *Value) bool { // cond: // result: (MOVBUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBUload) v.AuxInt = c v.AddArg(ptr) @@ -9298,14 +9135,13 @@ func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9322,15 +9158,13 @@ func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -9346,7 +9180,7 @@ func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -9354,7 +9188,6 @@ func rewriteValueARM64_OpARM64MOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9395,14 +9228,13 @@ func rewriteValueARM64_OpARM64MOVBloadidx_0(v *Value) bool { // cond: // result: (MOVBload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVBload) v.AuxInt = c v.AddArg(ptr) @@ -9413,14 +9245,13 @@ func rewriteValueARM64_OpARM64MOVBloadidx_0(v *Value) bool { // cond: // result: (MOVBload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBload) v.AuxInt = c v.AddArg(ptr) @@ -9531,7 +9362,7 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -9539,7 +9370,6 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9557,16 +9387,14 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -9583,7 +9411,7 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -9592,7 +9420,6 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -9610,7 +9437,7 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -9619,7 +9446,6 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpARM64MOVBstorezero) v.AuxInt = off v.Aux = sym @@ -9633,14 +9459,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9655,14 +9480,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVBUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9677,14 +9501,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9699,14 +9522,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9721,14 +9543,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9743,14 +9564,13 @@ func rewriteValueARM64_OpARM64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = off v.Aux = sym @@ -9788,12 +9608,11 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -9818,9 +9637,8 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -9833,13 +9651,12 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -9876,12 +9693,11 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -9906,9 +9722,8 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64UBFX { break @@ -9921,13 +9736,12 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -9964,12 +9778,11 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -9994,9 +9807,8 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64UBFX { break @@ -10009,13 +9821,12 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -10056,12 +9867,11 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -10086,9 +9896,8 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -10105,13 +9914,12 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -10146,7 +9954,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] w0 := x.Args[1] if w0.Op != OpARM64SRLconst { @@ -10158,7 +9966,6 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -10183,9 +9990,8 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -10196,7 +10002,7 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -10209,7 +10015,6 @@ func rewriteValueARM64_OpARM64MOVBstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -10248,7 +10053,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] w0 := x.Args[1] if w0.Op != OpARM64UBFX { @@ -10258,7 +10063,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { break } @@ -10283,9 +10087,8 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64UBFX { break @@ -10296,7 +10099,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -10307,7 +10110,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && getARM64BFwidth(bfc) == 32-getARM64BFlsb(bfc) && getARM64BFwidth(bfc2) == 32-getARM64BFlsb(bfc2) && getARM64BFlsb(bfc2) == getARM64BFlsb(bfc)-8 && clobber(x)) { break } @@ -10346,7 +10148,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] w0 := x.Args[1] if w0.Op != OpARM64SRLconst { @@ -10362,7 +10164,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != w0_0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -10387,9 +10188,8 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -10404,7 +10204,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -10421,7 +10221,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != w0_0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -10595,7 +10394,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x6.Aux != s { break } - _ = x6.Args[2] + mem := x6.Args[2] if ptr != x6.Args[0] { break } @@ -10609,7 +10408,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x6_1.Args[0] { break } - mem := x6.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } @@ -10769,9 +10567,8 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] x5_1 := x5.Args[1] if x5_1.Op != OpARM64SRLconst { break @@ -10786,7 +10583,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x6.Op != OpARM64MOVBstoreidx { break } - _ = x6.Args[3] + mem := x6.Args[3] ptr0 := x6.Args[0] idx0 := x6.Args[1] x6_2 := x6.Args[2] @@ -10799,7 +10596,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x6_2.Args[0] { break } - mem := x6.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } @@ -10879,7 +10675,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2.Aux != s { break } - _ = x2.Args[2] + mem := x2.Args[2] if ptr != x2.Args[0] { break } @@ -10893,7 +10689,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x2_1.Args[0] { break } - mem := x2.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -10957,9 +10752,8 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] x1_1 := x1.Args[1] if x1_1.Op != OpARM64UBFX { break @@ -10974,7 +10768,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2.Op != OpARM64MOVBstoreidx { break } - _ = x2.Args[3] + mem := x2.Args[3] ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] @@ -10987,7 +10781,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x2_2.Args[0] { break } - mem := x2.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -11075,7 +10868,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2.Aux != s { break } - _ = x2.Args[2] + mem := x2.Args[2] if ptr != x2.Args[0] { break } @@ -11093,7 +10886,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x2_1_0.Args[0] { break } - mem := x2.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -11161,9 +10953,8 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] x1_1 := x1.Args[1] if x1_1.Op != OpARM64SRLconst { break @@ -11182,7 +10973,7 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if x2.Op != OpARM64MOVBstoreidx { break } - _ = x2.Args[3] + mem := x2.Args[3] ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] @@ -11199,7 +10990,6 @@ func rewriteValueARM64_OpARM64MOVBstore_20(v *Value) bool { if w != x2_2_0.Args[0] { break } - mem := x2.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -11283,7 +11073,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x2.Aux != s { break } - _ = x2.Args[2] + mem := x2.Args[2] if ptr != x2.Args[0] { break } @@ -11297,7 +11087,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x2_1.Args[0] { break } - mem := x2.Args[2] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -11361,9 +11150,8 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] x1_1 := x1.Args[1] if x1_1.Op != OpARM64SRLconst { break @@ -11378,7 +11166,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x2.Op != OpARM64MOVBstoreidx { break } - _ = x2.Args[3] + mem := x2.Args[3] ptr0 := x2.Args[0] idx0 := x2.Args[1] x2_2 := x2.Args[2] @@ -11391,7 +11179,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x2_2.Args[0] { break } - mem := x2.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && isSamePtr(p1, p) && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -11423,7 +11210,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } @@ -11437,7 +11224,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11464,15 +11250,14 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr1 := v_0.Args[0] idx1 := v_0.Args[1] + ptr1 := v_0.Args[0] w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] @@ -11485,7 +11270,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -11517,7 +11301,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } @@ -11531,7 +11315,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11558,15 +11341,14 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr1 := v_0.Args[0] idx1 := v_0.Args[1] + ptr1 := v_0.Args[0] w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] @@ -11579,7 +11361,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -11611,7 +11392,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } @@ -11629,7 +11410,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_1_0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11656,15 +11436,14 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr1 := v_0.Args[0] idx1 := v_0.Args[1] + ptr1 := v_0.Args[0] w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] @@ -11681,7 +11460,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_2_0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -11713,7 +11491,7 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } @@ -11727,7 +11505,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11754,15 +11531,14 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr1 := v_0.Args[0] idx1 := v_0.Args[1] + ptr1 := v_0.Args[0] w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] @@ -11775,7 +11551,6 @@ func rewriteValueARM64_OpARM64MOVBstore_30(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -11811,7 +11586,7 @@ func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } @@ -11829,7 +11604,6 @@ func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { if w != x_1_0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11856,15 +11630,14 @@ func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr1 := v_0.Args[0] idx1 := v_0.Args[1] + ptr1 := v_0.Args[0] w := v.Args[1] x := v.Args[2] if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr0 := x.Args[0] idx0 := x.Args[1] x_2 := x.Args[2] @@ -11881,7 +11654,6 @@ func rewriteValueARM64_OpARM64MOVBstore_40(v *Value) bool { if w != x_2_0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -11901,7 +11673,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -11909,7 +11681,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVBstore) v.AuxInt = c v.AddArg(ptr) @@ -11921,7 +11692,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -11929,7 +11700,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVBstore) v.AuxInt = c v.AddArg(idx) @@ -11941,7 +11711,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstorezeroidx ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -11951,7 +11721,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVBstorezeroidx) v.AddArg(ptr) v.AddArg(idx) @@ -11962,7 +11731,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -11970,7 +11739,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -11982,7 +11750,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -11990,7 +11758,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -12002,7 +11769,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12010,7 +11777,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -12022,7 +11788,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12030,7 +11796,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -12042,7 +11807,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12050,7 +11815,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -12062,7 +11826,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { // cond: // result: (MOVBstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12070,7 +11834,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVBstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -12104,7 +11867,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] if ptr != x.Args[0] { break } @@ -12114,7 +11877,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12204,7 +11966,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x2.Op != OpARM64MOVBstoreidx { break } - _ = x2.Args[3] + mem := x2.Args[3] if ptr != x2.Args[0] { break } @@ -12221,7 +11983,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if w != x2_2.Args[0] { break } - mem := x2.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -12302,7 +12063,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x2.Op != OpARM64MOVBstoreidx { break } - _ = x2.Args[3] + mem := x2.Args[3] if ptr != x2.Args[0] { break } @@ -12326,7 +12087,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if w != x2_2.Args[0] { break } - mem := x2.Args[3] if !(x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -12356,7 +12116,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] if ptr != x.Args[0] { break } @@ -12373,7 +12133,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12398,7 +12157,7 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if x.Op != OpARM64MOVBstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] if ptr != x.Args[0] { break } @@ -12422,7 +12181,6 @@ func rewriteValueARM64_OpARM64MOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12444,14 +12202,13 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -12468,7 +12225,7 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -12476,7 +12233,6 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -12493,15 +12249,13 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -12527,9 +12281,8 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] - ptr1 := x.Args[0] mem := x.Args[1] + ptr1 := x.Args[0] if !(x.Uses == 1 && areAdjacentOffsets(i, j, 1) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -12553,17 +12306,15 @@ func rewriteValueARM64_OpARM64MOVBstorezero_0(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVBstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -12580,14 +12331,13 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { // cond: // result: (MOVBstorezero [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVBstorezero) v.AuxInt = c v.AddArg(ptr) @@ -12598,14 +12348,13 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { // cond: // result: (MOVBstorezero [c] idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBstorezero) v.AuxInt = c v.AddArg(idx) @@ -12630,14 +12379,13 @@ func rewriteValueARM64_OpARM64MOVBstorezeroidx_0(v *Value) bool { if x.Op != OpARM64MOVBstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } if idx != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -12685,14 +12433,13 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -12709,15 +12456,13 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -12733,7 +12478,7 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -12741,10 +12486,8 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { if v_0.AuxInt != 3 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -12760,7 +12503,7 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -12768,7 +12511,6 @@ func rewriteValueARM64_OpARM64MOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -12827,14 +12569,13 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { // cond: // result: (MOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVDload) v.AuxInt = c v.AddArg(ptr) @@ -12845,14 +12586,13 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { // cond: // result: (MOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDload) v.AuxInt = c v.AddArg(ptr) @@ -12863,7 +12603,7 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { // cond: // result: (MOVDloadidx8 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -12873,7 +12613,6 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVDloadidx8) v.AddArg(ptr) v.AddArg(idx) @@ -12884,7 +12623,7 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { // cond: // result: (MOVDloadidx8 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -12894,7 +12633,6 @@ func rewriteValueARM64_OpARM64MOVDloadidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDloadidx8) v.AddArg(ptr) v.AddArg(idx) @@ -12929,14 +12667,13 @@ func rewriteValueARM64_OpARM64MOVDloadidx8_0(v *Value) bool { // cond: // result: (MOVDload [c<<3] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVDload) v.AuxInt = c << 3 v.AddArg(ptr) @@ -13003,14 +12740,13 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64FMOVDfpgp { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64FMOVDstore) v.AuxInt = off v.Aux = sym @@ -13025,7 +12761,7 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -13033,7 +12769,6 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13051,16 +12786,14 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -13077,7 +12810,7 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -13085,11 +12818,9 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { if v_0.AuxInt != 3 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -13106,7 +12837,7 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -13115,7 +12846,6 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13133,7 +12863,7 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -13142,7 +12872,6 @@ func rewriteValueARM64_OpARM64MOVDstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpARM64MOVDstorezero) v.AuxInt = off v.Aux = sym @@ -13157,7 +12886,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { // cond: // result: (MOVDstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -13165,7 +12894,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVDstore) v.AuxInt = c v.AddArg(ptr) @@ -13177,7 +12905,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { // cond: // result: (MOVDstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -13185,7 +12913,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVDstore) v.AuxInt = c v.AddArg(idx) @@ -13197,7 +12924,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { // cond: // result: (MOVDstoreidx8 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -13208,7 +12935,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVDstoreidx8) v.AddArg(ptr) v.AddArg(idx) @@ -13220,7 +12946,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { // cond: // result: (MOVDstoreidx8 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -13231,7 +12957,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVDstoreidx8) v.AddArg(ptr) v.AddArg(idx) @@ -13243,7 +12968,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { // cond: // result: (MOVDstorezeroidx ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -13253,7 +12978,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVDstorezeroidx) v.AddArg(ptr) v.AddArg(idx) @@ -13267,7 +12991,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { // cond: // result: (MOVDstore [c<<3] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -13275,7 +12999,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVDstore) v.AuxInt = c << 3 v.AddArg(ptr) @@ -13287,7 +13010,7 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { // cond: // result: (MOVDstorezeroidx8 ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -13297,7 +13020,6 @@ func rewriteValueARM64_OpARM64MOVDstoreidx8_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVDstorezeroidx8) v.AddArg(ptr) v.AddArg(idx) @@ -13315,14 +13037,13 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13339,7 +13060,7 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -13347,7 +13068,6 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13364,15 +13084,13 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -13388,7 +13106,7 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -13396,10 +13114,8 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if v_0.AuxInt != 3 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -13425,9 +13141,8 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] - ptr1 := x.Args[0] mem := x.Args[1] + ptr1 := x.Args[0] if !(x.Uses == 1 && areAdjacentOffsets(i, j, 8) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -13451,17 +13166,15 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if p0.Op != OpARM64ADD { break } - _ = p0.Args[1] - ptr0 := p0.Args[0] idx0 := p0.Args[1] + ptr0 := p0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVDstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -13488,17 +13201,15 @@ func rewriteValueARM64_OpARM64MOVDstorezero_0(v *Value) bool { if p0.AuxInt != 3 { break } - _ = p0.Args[1] - ptr0 := p0.Args[0] idx0 := p0.Args[1] + ptr0 := p0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVDstorezeroidx8 { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -13516,14 +13227,13 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { // cond: // result: (MOVDstorezero [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVDstorezero) v.AuxInt = c v.AddArg(ptr) @@ -13534,14 +13244,13 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { // cond: // result: (MOVDstorezero [c] idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDstorezero) v.AuxInt = c v.AddArg(idx) @@ -13552,7 +13261,7 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { // cond: // result: (MOVDstorezeroidx8 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -13562,7 +13271,6 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVDstorezeroidx8) v.AddArg(ptr) v.AddArg(idx) @@ -13573,7 +13281,7 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { // cond: // result: (MOVDstorezeroidx8 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -13583,7 +13291,6 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDstorezeroidx8) v.AddArg(ptr) v.AddArg(idx) @@ -13597,14 +13304,13 @@ func rewriteValueARM64_OpARM64MOVDstorezeroidx8_0(v *Value) bool { // cond: // result: (MOVDstorezero [c<<3] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVDstorezero) v.AuxInt = c << 3 v.AddArg(ptr) @@ -13622,14 +13328,13 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13646,15 +13351,13 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -13670,7 +13373,7 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -13678,10 +13381,8 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -13697,7 +13398,7 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -13705,7 +13406,6 @@ func rewriteValueARM64_OpARM64MOVHUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -13764,14 +13464,13 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHUload) v.AuxInt = c v.AddArg(ptr) @@ -13782,14 +13481,13 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHUload) v.AuxInt = c v.AddArg(ptr) @@ -13800,7 +13498,7 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -13810,7 +13508,6 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHUloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -13821,18 +13518,16 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64ADD { break } - _ = v_1.Args[1] - idx := v_1.Args[0] - if idx != v_1.Args[1] { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - mem := v.Args[2] v.reset(OpARM64MOVHUloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -13843,18 +13538,16 @@ func rewriteValueARM64_OpARM64MOVHUloadidx_0(v *Value) bool { // cond: // result: (MOVHUloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - idx := v_0.Args[0] - if idx != v_0.Args[1] { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHUloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -13889,14 +13582,13 @@ func rewriteValueARM64_OpARM64MOVHUloadidx2_0(v *Value) bool { // cond: // result: (MOVHUload [c<<1] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHUload) v.AuxInt = c << 1 v.AddArg(ptr) @@ -14094,14 +13786,13 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -14118,15 +13809,13 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -14142,7 +13831,7 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -14150,10 +13839,8 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -14169,7 +13856,7 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -14177,7 +13864,6 @@ func rewriteValueARM64_OpARM64MOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -14218,14 +13904,13 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHload) v.AuxInt = c v.AddArg(ptr) @@ -14236,14 +13921,13 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHload) v.AuxInt = c v.AddArg(ptr) @@ -14254,7 +13938,7 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -14264,7 +13948,6 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -14275,18 +13958,16 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64ADD { break } - _ = v_1.Args[1] - idx := v_1.Args[0] - if idx != v_1.Args[1] { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - mem := v.Args[2] v.reset(OpARM64MOVHloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -14297,18 +13978,16 @@ func rewriteValueARM64_OpARM64MOVHloadidx_0(v *Value) bool { // cond: // result: (MOVHloadidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - idx := v_0.Args[0] - if idx != v_0.Args[1] { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHloadidx2) v.AddArg(ptr) v.AddArg(idx) @@ -14343,14 +14022,13 @@ func rewriteValueARM64_OpARM64MOVHloadidx2_0(v *Value) bool { // cond: // result: (MOVHload [c<<1] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHload) v.AuxInt = c << 1 v.AddArg(ptr) @@ -14553,7 +14231,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -14561,7 +14239,6 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -14579,16 +14256,14 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -14605,7 +14280,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -14613,11 +14288,9 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -14634,7 +14307,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -14643,7 +14316,6 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -14661,7 +14333,7 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -14670,7 +14342,6 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpARM64MOVHstorezero) v.AuxInt = off v.Aux = sym @@ -14684,14 +14355,13 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AuxInt = off v.Aux = sym @@ -14706,14 +14376,13 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AuxInt = off v.Aux = sym @@ -14728,14 +14397,13 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AuxInt = off v.Aux = sym @@ -14750,14 +14418,13 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AuxInt = off v.Aux = sym @@ -14792,12 +14459,11 @@ func rewriteValueARM64_OpARM64MOVHstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -14826,9 +14492,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -14841,13 +14506,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -14874,9 +14538,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -14889,13 +14552,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx2 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -14935,12 +14597,11 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -14965,9 +14626,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64UBFX { break @@ -14980,13 +14640,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -15013,9 +14672,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64UBFX { break @@ -15028,13 +14686,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx2 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -15078,12 +14735,11 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -15108,9 +14764,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -15127,13 +14782,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -15160,9 +14814,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -15179,13 +14832,12 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx2 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -15223,7 +14875,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] w0 := x.Args[1] if w0.Op != OpARM64SRLconst { @@ -15235,7 +14887,6 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -15260,9 +14911,8 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -15273,7 +14923,7 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -15286,7 +14936,6 @@ func rewriteValueARM64_OpARM64MOVHstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -15317,9 +14966,8 @@ func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -15330,7 +14978,7 @@ func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { if x.Op != OpARM64MOVHstoreidx2 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -15343,7 +14991,6 @@ func rewriteValueARM64_OpARM64MOVHstore_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -15364,7 +15011,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -15372,7 +15019,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstore) v.AuxInt = c v.AddArg(ptr) @@ -15384,7 +15030,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -15392,7 +15038,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstore) v.AuxInt = c v.AddArg(idx) @@ -15404,7 +15049,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -15415,7 +15060,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15427,19 +15071,17 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64ADD { break } - _ = v_1.Args[1] - idx := v_1.Args[0] - if idx != v_1.Args[1] { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15451,7 +15093,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -15462,7 +15104,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15474,19 +15115,17 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - idx := v_0.Args[0] - if idx != v_0.Args[1] { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15498,7 +15137,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15508,7 +15147,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVHstorezeroidx) v.AddArg(ptr) v.AddArg(idx) @@ -15519,7 +15157,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15527,7 +15165,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -15539,7 +15176,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15547,7 +15184,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -15559,7 +15195,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { // cond: // result: (MOVHstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15567,7 +15203,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -15582,7 +15217,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { // cond: // result: (MOVHstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15590,7 +15225,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -15624,7 +15258,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { if x.Op != OpARM64MOVHstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] if ptr != x.Args[0] { break } @@ -15634,7 +15268,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx_10(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -15652,7 +15285,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstore [c<<1] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -15660,7 +15293,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVHstore) v.AuxInt = c << 1 v.AddArg(ptr) @@ -15672,7 +15304,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx2 ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15682,7 +15314,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15693,7 +15324,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15701,7 +15332,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15713,7 +15343,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15721,7 +15351,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15733,7 +15362,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15741,7 +15370,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15753,7 +15381,7 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { // cond: // result: (MOVHstoreidx2 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -15761,7 +15389,6 @@ func rewriteValueARM64_OpARM64MOVHstoreidx2_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVHstoreidx2) v.AddArg(ptr) v.AddArg(idx) @@ -15780,14 +15407,13 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -15804,7 +15430,7 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -15812,7 +15438,6 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -15829,15 +15454,13 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -15853,7 +15476,7 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -15861,10 +15484,8 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -15890,9 +15511,8 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] - ptr1 := x.Args[0] mem := x.Args[1] + ptr1 := x.Args[0] if !(x.Uses == 1 && areAdjacentOffsets(i, j, 2) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -15916,17 +15536,15 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVHstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -15952,17 +15570,15 @@ func rewriteValueARM64_OpARM64MOVHstorezero_0(v *Value) bool { if v_0.AuxInt != 1 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVHstorezeroidx2 { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -15982,14 +15598,13 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezero [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHstorezero) v.AuxInt = c v.AddArg(ptr) @@ -16000,14 +15615,13 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezero [c] idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHstorezero) v.AuxInt = c v.AddArg(idx) @@ -16018,7 +15632,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -16028,7 +15642,6 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) @@ -16039,18 +15652,16 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64ADD { break } - _ = v_1.Args[1] - idx := v_1.Args[0] - if idx != v_1.Args[1] { + idx := v_1.Args[1] + if idx != v_1.Args[0] { break } - mem := v.Args[2] v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) @@ -16061,7 +15672,7 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -16071,7 +15682,6 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) @@ -16082,18 +15692,16 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { // cond: // result: (MOVHstorezeroidx2 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - idx := v_0.Args[0] - if idx != v_0.Args[1] { + idx := v_0.Args[1] + if idx != v_0.Args[0] { break } ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHstorezeroidx2) v.AddArg(ptr) v.AddArg(idx) @@ -16118,14 +15726,13 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx_0(v *Value) bool { if x.Op != OpARM64MOVHstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } if idx != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16142,14 +15749,13 @@ func rewriteValueARM64_OpARM64MOVHstorezeroidx2_0(v *Value) bool { // cond: // result: (MOVHstorezero [c<<1] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVHstorezero) v.AuxInt = c << 1 v.AddArg(ptr) @@ -16167,14 +15773,13 @@ func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16191,7 +15796,7 @@ func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -16199,7 +15804,6 @@ func rewriteValueARM64_OpARM64MOVQstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16248,14 +15852,13 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16272,15 +15875,13 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -16296,7 +15897,7 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -16304,10 +15905,8 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -16323,7 +15922,7 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -16331,7 +15930,6 @@ func rewriteValueARM64_OpARM64MOVWUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16390,14 +15988,13 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { // cond: // result: (MOVWUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWUload) v.AuxInt = c v.AddArg(ptr) @@ -16408,14 +16005,13 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { // cond: // result: (MOVWUload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWUload) v.AuxInt = c v.AddArg(ptr) @@ -16426,7 +16022,7 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { // cond: // result: (MOVWUloadidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -16436,7 +16032,6 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWUloadidx4) v.AddArg(ptr) v.AddArg(idx) @@ -16447,7 +16042,7 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { // cond: // result: (MOVWUloadidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -16457,7 +16052,6 @@ func rewriteValueARM64_OpARM64MOVWUloadidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWUloadidx4) v.AddArg(ptr) v.AddArg(idx) @@ -16492,14 +16086,13 @@ func rewriteValueARM64_OpARM64MOVWUloadidx4_0(v *Value) bool { // cond: // result: (MOVWUload [c<<2] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWUload) v.AuxInt = c << 2 v.AddArg(ptr) @@ -16748,14 +16341,13 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16772,15 +16364,13 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -16796,7 +16386,7 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -16804,10 +16394,8 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -16823,7 +16411,7 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -16831,7 +16419,6 @@ func rewriteValueARM64_OpARM64MOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -16872,14 +16459,13 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWload) v.AuxInt = c v.AddArg(ptr) @@ -16890,14 +16476,13 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWload) v.AuxInt = c v.AddArg(ptr) @@ -16908,7 +16493,7 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -16918,7 +16503,6 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWloadidx4) v.AddArg(ptr) v.AddArg(idx) @@ -16929,7 +16513,7 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { // cond: // result: (MOVWloadidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -16939,7 +16523,6 @@ func rewriteValueARM64_OpARM64MOVWloadidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWloadidx4) v.AddArg(ptr) v.AddArg(idx) @@ -16974,14 +16557,13 @@ func rewriteValueARM64_OpARM64MOVWloadidx4_0(v *Value) bool { // cond: // result: (MOVWload [c<<2] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWload) v.AuxInt = c << 2 v.AddArg(ptr) @@ -17286,14 +16868,13 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64FMOVSfpgp { break } val := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64FMOVSstore) v.AuxInt = off v.Aux = sym @@ -17308,7 +16889,7 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -17316,7 +16897,6 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17334,16 +16914,14 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -17360,7 +16938,7 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -17368,11 +16946,9 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil) { break } @@ -17389,7 +16965,7 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -17398,7 +16974,6 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -17416,7 +16991,7 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -17425,7 +17000,6 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpARM64MOVWstorezero) v.AuxInt = off v.Aux = sym @@ -17439,14 +17013,13 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWstore) v.AuxInt = off v.Aux = sym @@ -17461,14 +17034,13 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWstore) v.AuxInt = off v.Aux = sym @@ -17503,12 +17075,11 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -17533,9 +17104,8 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -17548,13 +17118,12 @@ func rewriteValueARM64_OpARM64MOVWstore_0(v *Value) bool { if x.Op != OpARM64MOVWstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -17585,9 +17154,8 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -17600,13 +17168,12 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if x.Op != OpARM64MOVWstoreidx4 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -17644,7 +17211,7 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] w0 := x.Args[1] if w0.Op != OpARM64SRLconst { @@ -17656,7 +17223,6 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -17681,9 +17247,8 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -17694,7 +17259,7 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if x.Op != OpARM64MOVWstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -17707,7 +17272,6 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -17734,9 +17298,8 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SRLconst { break @@ -17747,7 +17310,7 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if x.Op != OpARM64MOVWstoreidx4 { break } - _ = x.Args[3] + mem := x.Args[3] ptr1 := x.Args[0] idx1 := x.Args[1] w0 := x.Args[2] @@ -17760,7 +17323,6 @@ func rewriteValueARM64_OpARM64MOVWstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -17781,7 +17343,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -17789,7 +17351,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVWstore) v.AuxInt = c v.AddArg(ptr) @@ -17801,7 +17362,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstore [c] idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -17809,7 +17370,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { c := v_0.AuxInt idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVWstore) v.AuxInt = c v.AddArg(idx) @@ -17821,7 +17381,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreidx4 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -17832,7 +17392,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { } idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx4) v.AddArg(ptr) v.AddArg(idx) @@ -17844,7 +17403,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreidx4 ptr idx val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -17855,7 +17414,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx4) v.AddArg(ptr) v.AddArg(idx) @@ -17867,7 +17425,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstorezeroidx ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -17877,7 +17435,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVWstorezeroidx) v.AddArg(ptr) v.AddArg(idx) @@ -17888,7 +17445,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -17896,7 +17453,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -17908,7 +17464,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { // cond: // result: (MOVWstoreidx ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -17916,7 +17472,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx) v.AddArg(ptr) v.AddArg(idx) @@ -17950,7 +17505,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { if x.Op != OpARM64MOVWstoreidx { break } - _ = x.Args[3] + mem := x.Args[3] if ptr != x.Args[0] { break } @@ -17960,7 +17515,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17978,7 +17532,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { // cond: // result: (MOVWstore [c<<2] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -17986,7 +17540,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] v.reset(OpARM64MOVWstore) v.AuxInt = c << 2 v.AddArg(ptr) @@ -17998,7 +17551,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { // cond: // result: (MOVWstorezeroidx4 ptr idx mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -18008,7 +17561,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVWstorezeroidx4) v.AddArg(ptr) v.AddArg(idx) @@ -18019,7 +17571,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { // cond: // result: (MOVWstoreidx4 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -18027,7 +17579,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx4) v.AddArg(ptr) v.AddArg(idx) @@ -18039,7 +17590,7 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { // cond: // result: (MOVWstoreidx4 ptr idx x mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -18047,7 +17598,6 @@ func rewriteValueARM64_OpARM64MOVWstoreidx4_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpARM64MOVWstoreidx4) v.AddArg(ptr) v.AddArg(idx) @@ -18066,14 +17616,13 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -18090,7 +17639,7 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -18098,7 +17647,6 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -18115,15 +17663,13 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -18139,7 +17685,7 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64ADDshiftLL { break @@ -18147,10 +17693,8 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(off == 0 && sym == nil) { break } @@ -18176,9 +17720,8 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] - ptr1 := x.Args[0] mem := x.Args[1] + ptr1 := x.Args[0] if !(x.Uses == 1 && areAdjacentOffsets(i, j, 4) && is32Bit(min(i, j)) && isSamePtr(ptr0, ptr1) && clobber(x)) { break } @@ -18202,17 +17745,15 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { if v_0.Op != OpARM64ADD { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVWstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && (isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) || isSamePtr(ptr0, idx1) && isSamePtr(idx0, ptr1)) && clobber(x)) { break } @@ -18238,17 +17779,15 @@ func rewriteValueARM64_OpARM64MOVWstorezero_0(v *Value) bool { if v_0.AuxInt != 2 { break } - _ = v_0.Args[1] - ptr0 := v_0.Args[0] idx0 := v_0.Args[1] + ptr0 := v_0.Args[0] x := v.Args[1] if x.Op != OpARM64MOVWstorezeroidx4 { break } - _ = x.Args[2] + mem := x.Args[2] ptr1 := x.Args[0] idx1 := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && s == nil && isSamePtr(ptr0, ptr1) && isSamePtr(idx0, idx1) && clobber(x)) { break } @@ -18268,14 +17807,13 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { // cond: // result: (MOVWstorezero [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWstorezero) v.AuxInt = c v.AddArg(ptr) @@ -18286,14 +17824,13 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { // cond: // result: (MOVWstorezero [c] idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt idx := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWstorezero) v.AuxInt = c v.AddArg(idx) @@ -18304,7 +17841,7 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { // cond: // result: (MOVWstorezeroidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64SLLconst { @@ -18314,7 +17851,6 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { break } idx := v_1.Args[0] - mem := v.Args[2] v.reset(OpARM64MOVWstorezeroidx4) v.AddArg(ptr) v.AddArg(idx) @@ -18325,7 +17861,7 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { // cond: // result: (MOVWstorezeroidx4 ptr idx mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -18335,7 +17871,6 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { } idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWstorezeroidx4) v.AddArg(ptr) v.AddArg(idx) @@ -18360,14 +17895,13 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx_0(v *Value) bool { if x.Op != OpARM64MOVWstorezeroidx { break } - _ = x.Args[2] + mem := x.Args[2] if ptr != x.Args[0] { break } if idx != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -18384,14 +17918,13 @@ func rewriteValueARM64_OpARM64MOVWstorezeroidx4_0(v *Value) bool { // cond: // result: (MOVWstorezero [c<<2] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] v.reset(OpARM64MOVWstorezero) v.AuxInt = c << 2 v.AddArg(ptr) @@ -18635,7 +18168,7 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: // result: (ADD a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -18644,7 +18177,6 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { if v_1.AuxInt != -1 { break } - x := v.Args[2] v.reset(OpARM64ADD) v.AddArg(a) v.AddArg(x) @@ -18672,7 +18204,7 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: // result: (SUB a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -18681,7 +18213,6 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { if v_1.AuxInt != 1 { break } - x := v.Args[2] v.reset(OpARM64SUB) v.AddArg(a) v.AddArg(x) @@ -18691,14 +18222,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (SUBshiftLL a x [log2(c)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -18712,14 +18242,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && c>=3 // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c-1) && c >= 3) { break } @@ -18736,14 +18265,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && c>=7 // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c+1) && c >= 7) { break } @@ -18760,14 +18288,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } @@ -18785,14 +18312,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } @@ -18810,14 +18336,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } @@ -18835,14 +18360,13 @@ func rewriteValueARM64_OpARM64MSUB_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } @@ -18864,14 +18388,13 @@ func rewriteValueARM64_OpARM64MSUB_20(v *Value) bool { // cond: // result: (ADDconst [c] (MNEG x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64MNEG, x.Type) @@ -19141,14 +18664,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: int32(c)==-1 // result: (ADD a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(int32(c) == -1) { break } @@ -19180,14 +18702,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: int32(c)==1 // result: (SUB a x) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(int32(c) == 1) { break } @@ -19200,14 +18721,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: isPowerOfTwo(c) // result: (SUBshiftLL a x [log2(c)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c)) { break } @@ -19221,14 +18741,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c)>=3 // result: (SUB a (ADDshiftLL x x [log2(c-1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -19245,14 +18764,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c)>=7 // result: (ADD a (SUBshiftLL x x [log2(c+1)])) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -19269,14 +18787,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (ADDshiftLL a (SUBshiftLL x x [2]) [log2(c/3)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -19294,14 +18811,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (SUBshiftLL a (ADDshiftLL x x [2]) [log2(c/5)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -19319,14 +18835,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (ADDshiftLL a (SUBshiftLL x x [3]) [log2(c/7)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -19344,14 +18859,13 @@ func rewriteValueARM64_OpARM64MSUBW_10(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (SUBshiftLL a (ADDshiftLL x x [3]) [log2(c/9)]) for { - _ = v.Args[2] + x := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { break } c := v_1.AuxInt - x := v.Args[2] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -19373,14 +18887,13 @@ func rewriteValueARM64_OpARM64MSUBW_20(v *Value) bool { // cond: // result: (ADDconst [c] (MNEGW x y)) for { - _ = v.Args[2] + y := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt x := v.Args[1] - y := v.Args[2] v.reset(OpARM64ADDconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64MNEGW, x.Type) @@ -19417,13 +18930,12 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { // cond: // result: (MNEG x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64NEG { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64MNEG) v.AddArg(x) v.AddArg(y) @@ -19466,7 +18978,7 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { // cond: // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -19474,7 +18986,6 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpARM64NEG) v.AddArg(x) return true @@ -19533,7 +19044,7 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break @@ -19541,7 +19052,6 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -19570,13 +19080,12 @@ func rewriteValueARM64_OpARM64MUL_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (SLLconst [log2(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -19613,13 +19122,12 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && c >= 3 // result: (ADDshiftLL x x [log2(c-1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c-1) && c >= 3) { break } @@ -19655,13 +19163,12 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && c >= 7 // result: (ADDshiftLL (NEG x) x [log2(c+1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c+1) && c >= 7) { break } @@ -19700,13 +19207,12 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%3 == 0 && isPowerOfTwo(c/3)) { break } @@ -19746,13 +19252,12 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%5 == 0 && isPowerOfTwo(c/5)) { break } @@ -19794,13 +19299,12 @@ func rewriteValueARM64_OpARM64MUL_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%7 == 0 && isPowerOfTwo(c/7)) { break } @@ -19846,13 +19350,12 @@ func rewriteValueARM64_OpARM64MUL_20(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%9 == 0 && isPowerOfTwo(c/9)) { break } @@ -19910,13 +19413,12 @@ func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { // cond: // result: (MNEGW x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64NEG { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpARM64MNEGW) v.AddArg(x) v.AddArg(y) @@ -19960,13 +19462,12 @@ func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { // cond: int32(c)==-1 // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(int32(c) == -1) { break } @@ -20031,13 +19532,12 @@ func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { // cond: int32(c)==1 // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(int32(c) == 1) { break } @@ -20069,13 +19569,12 @@ func rewriteValueARM64_OpARM64MULW_0(v *Value) bool { // cond: isPowerOfTwo(c) // result: (SLLconst [log2(c)] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -20112,13 +19611,12 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { // cond: isPowerOfTwo(c-1) && int32(c) >= 3 // result: (ADDshiftLL x x [log2(c-1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c-1) && int32(c) >= 3) { break } @@ -20154,13 +19652,12 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { // cond: isPowerOfTwo(c+1) && int32(c) >= 7 // result: (ADDshiftLL (NEG x) x [log2(c+1)]) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(c+1) && int32(c) >= 7) { break } @@ -20199,13 +19696,12 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { // cond: c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c) // result: (SLLconst [log2(c/3)] (ADDshiftLL x x [1])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%3 == 0 && isPowerOfTwo(c/3) && is32Bit(c)) { break } @@ -20245,13 +19741,12 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { // cond: c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c) // result: (SLLconst [log2(c/5)] (ADDshiftLL x x [2])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%5 == 0 && isPowerOfTwo(c/5) && is32Bit(c)) { break } @@ -20293,13 +19788,12 @@ func rewriteValueARM64_OpARM64MULW_10(v *Value) bool { // cond: c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c) // result: (SLLconst [log2(c/7)] (ADDshiftLL (NEG x) x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%7 == 0 && isPowerOfTwo(c/7) && is32Bit(c)) { break } @@ -20345,13 +19839,12 @@ func rewriteValueARM64_OpARM64MULW_20(v *Value) bool { // cond: c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c) // result: (SLLconst [log2(c/9)] (ADDshiftLL x x [3])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(c%9 == 0 && isPowerOfTwo(c/9) && is32Bit(c)) { break } @@ -20534,9 +20027,8 @@ func rewriteValueARM64_OpARM64NEG_0(v *Value) bool { if v_0.Op != OpARM64MUL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64MNEG) v.AddArg(x) v.AddArg(y) @@ -20550,9 +20042,8 @@ func rewriteValueARM64_OpARM64NEG_0(v *Value) bool { if v_0.Op != OpARM64MULW { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpARM64MNEGW) v.AddArg(x) v.AddArg(y) @@ -20775,13 +20266,12 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { // cond: // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ORconst) v.AuxInt = c v.AddArg(x) @@ -20791,9 +20281,8 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -20821,13 +20310,12 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { // cond: // result: (ORN x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MVN { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARM64ORN) v.AddArg(x) v.AddArg(y) @@ -20858,14 +20346,13 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (ORshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -20900,14 +20387,13 @@ func rewriteValueARM64_OpARM64OR_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (ORshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -20947,14 +20433,13 @@ func rewriteValueARM64_OpARM64OR_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (ORshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -22023,9 +21508,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { } i3 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -22114,9 +21598,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { } i0 := x3.AuxInt s := x3.Aux - _ = x3.Args[1] - p := x3.Args[0] mem := x3.Args[1] + p := x3.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -22253,9 +21736,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { break } s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -22296,9 +21778,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x2.Args[1] { break } @@ -22342,10 +21823,9 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { if x3.Op != OpARM64MOVBUloadidx { break } - _ = x3.Args[2] + mem := x3.Args[2] ptr0 := x3.Args[0] idx0 := x3.Args[1] - mem := x3.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -22426,9 +21906,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x2.Args[1] { break } @@ -22481,7 +21960,7 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] if x0_1.Op != OpARM64ADDconst { @@ -22491,7 +21970,6 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { break } idx := x0_1.Args[0] - mem := x0.Args[2] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -22586,10 +22064,9 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { if x3.Op != OpARM64MOVBUloadidx { break } - _ = x3.Args[2] + mem := x3.Args[2] ptr := x3.Args[0] idx := x3.Args[1] - mem := x3.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -22771,9 +22248,8 @@ func rewriteValueARM64_OpARM64OR_20(v *Value) bool { } i7 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -22942,9 +22418,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { } i0 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -23221,9 +22696,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { break } s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -23348,9 +22822,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x6.Args[1] { break } @@ -23394,10 +22867,9 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if x7.Op != OpARM64MOVBUloadidx { break } - _ = x7.Args[2] + mem := x7.Args[2] ptr0 := x7.Args[0] idx0 := x7.Args[1] - mem := x7.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -23594,9 +23066,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x6.Args[1] { break } @@ -23681,7 +23152,7 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] if x0_1.Op != OpARM64ADDconst { @@ -23691,7 +23162,6 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { break } idx := x0_1.Args[0] - mem := x0.Args[2] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -23886,10 +23356,9 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if x7.Op != OpARM64MOVBUloadidx { break } - _ = x7.Args[2] + mem := x7.Args[2] ptr := x7.Args[0] idx := x7.Args[1] - mem := x7.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -24171,9 +23640,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -24264,9 +23732,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { } i3 := x3.AuxInt s := x3.Aux - _ = x3.Args[1] - p := x3.Args[0] mem := x3.Args[1] + p := x3.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -24401,10 +23868,9 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -24422,9 +23888,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -24500,9 +23965,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { break } s := x3.Aux - _ = x3.Args[1] - p := x3.Args[0] mem := x3.Args[1] + p := x3.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -24559,9 +24023,8 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -24637,10 +24100,9 @@ func rewriteValueARM64_OpARM64OR_30(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] y1 := o1.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -24748,7 +24210,7 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if x3.Op != OpARM64MOVBUloadidx { break } - _ = x3.Args[2] + mem := x3.Args[2] ptr := x3.Args[0] x3_1 := x3.Args[1] if x3_1.Op != OpARM64ADDconst { @@ -24758,7 +24220,6 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { break } idx := x3_1.Args[0] - mem := x3.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -24935,9 +24396,8 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -25104,9 +24564,8 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -25381,10 +24840,9 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -25402,9 +24860,8 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -25564,9 +25021,8 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { break } s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -25655,9 +25111,8 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -25849,10 +25304,9 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] y1 := o5.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -26056,7 +25510,7 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { if x7.Op != OpARM64MOVBUloadidx { break } - _ = x7.Args[2] + mem := x7.Args[2] ptr := x7.Args[0] x7_1 := x7.Args[1] if x7_1.Op != OpARM64ADDconst { @@ -26066,7 +25520,6 @@ func rewriteValueARM64_OpARM64OR_40(v *Value) bool { break } idx := x7_1.Args[0] - mem := x7.Args[2] o0 := v.Args[1] if o0.Op != OpARM64ORshiftLL { break @@ -26327,9 +25780,8 @@ func rewriteValueARM64_OpARM64ORN_0(v *Value) bool { // cond: // result: (MOVDconst [-1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARM64MOVDconst) @@ -26611,13 +26063,12 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { // result: (ORconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -26671,7 +26122,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { // result: (RORconst [64-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -26679,8 +26130,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -26694,14 +26144,13 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { @@ -26722,7 +26171,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break @@ -26733,8 +26182,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64REV16W) @@ -26746,7 +26194,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { // result: (EXTRconst [64-c] x2 x) for { c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -26755,7 +26203,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { break } x := v_0.Args[0] - x2 := v.Args[1] v.reset(OpARM64EXTRconst) v.AuxInt = 64 - c v.AddArg(x2) @@ -26768,14 +26215,13 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt x := v_0.Args[0] - x2 := v.Args[1] if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } @@ -26833,9 +26279,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_0(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -26891,10 +26336,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -26912,9 +26356,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -26947,10 +26390,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27011,9 +26453,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27088,10 +26529,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVHUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27109,9 +26549,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -27167,10 +26606,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVHUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27254,10 +26692,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVHUloadidx2 { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27278,9 +26715,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if p1.AuxInt != 1 { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -27357,9 +26793,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27488,10 +26923,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVWUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27509,9 +26943,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -27625,10 +27058,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVWUloadidx4 { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr0 := x0.Args[0] idx0 := x0.Args[1] - mem := x0.Args[2] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27649,9 +27081,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if p1.AuxInt != 2 { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -27768,10 +27199,9 @@ func rewriteValueARM64_OpARM64ORshiftLL_10(v *Value) bool { if x0.Op != OpARM64MOVWUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27907,9 +27337,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { } i1 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -27965,15 +27394,13 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } s := x0.Aux - _ = x0.Args[1] + mem := x0.Args[1] p1 := x0.Args[0] if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] - mem := x0.Args[1] + ptr1 := p1.Args[0] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28019,7 +27446,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if x0.Op != OpARM64MOVBUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] if x0_1.Op != OpARM64ADDconst { @@ -28029,7 +27456,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } idx := x0_1.Args[0] - mem := x0.Args[2] y1 := v.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28089,9 +27515,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { } i2 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28176,9 +27601,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28198,9 +27622,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x1.Args[1] { break } @@ -28257,7 +27680,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if x0.Op != OpARM64MOVHUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] if x0_1.Op != OpARM64ADDconst { @@ -28267,7 +27690,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } idx := x0_1.Args[0] - mem := x0.Args[2] y1 := o0.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28368,9 +27790,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { } i4 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28509,9 +27930,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28573,9 +27993,8 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if p1.Op != OpARM64ADD { break } - _ = p1.Args[1] - ptr1 := p1.Args[0] idx1 := p1.Args[1] + ptr1 := p1.Args[0] if mem != x3.Args[1] { break } @@ -28648,7 +28067,7 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { if x0.Op != OpARM64MOVWUloadidx { break } - _ = x0.Args[2] + mem := x0.Args[2] ptr := x0.Args[0] x0_1 := x0.Args[1] if x0_1.Op != OpARM64ADDconst { @@ -28658,7 +28077,6 @@ func rewriteValueARM64_OpARM64ORshiftLL_20(v *Value) bool { break } idx := x0_1.Args[0] - mem := x0.Args[2] y1 := o2.Args[1] if y1.Op != OpARM64MOVDnop { break @@ -28775,13 +28193,12 @@ func rewriteValueARM64_OpARM64ORshiftRA_0(v *Value) bool { // result: (ORconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -28839,13 +28256,12 @@ func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { // result: (ORconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64ORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -28899,7 +28315,7 @@ func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { // result: (RORconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -28907,8 +28323,7 @@ func rewriteValueARM64_OpARM64ORshiftRL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -29584,7 +28999,7 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64ADDconst { break @@ -29593,7 +29008,6 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { ptr := v_0.Args[0] val1 := v.Args[1] val2 := v.Args[2] - mem := v.Args[3] if !(is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -29612,7 +29026,7 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDaddr { break @@ -29622,7 +29036,6 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { ptr := v_0.Args[0] val1 := v.Args[1] val2 := v.Args[2] - mem := v.Args[3] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2) && (ptr.Op != OpSB || !config.ctxt.Flag_shared)) { break } @@ -29641,7 +29054,7 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpARM64MOVDconst { @@ -29657,7 +29070,6 @@ func rewriteValueARM64_OpARM64STP_0(v *Value) bool { if v_2.AuxInt != 0 { break } - mem := v.Args[3] v.reset(OpARM64MOVQstorezero) v.AuxInt = off v.Aux = sym @@ -29695,9 +29107,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { if l.Op != OpARM64MUL { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -29717,9 +29128,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { if l.Op != OpARM64MNEG { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(l.Uses == 1 && clobber(l)) { break } @@ -29739,9 +29149,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { if l.Op != OpARM64MULW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -29761,9 +29170,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { if l.Op != OpARM64MNEGW { break } - _ = l.Args[1] - x := l.Args[0] y := l.Args[1] + x := l.Args[0] if !(a.Type.Size() != 8 && l.Uses == 1 && clobber(l)) { break } @@ -29777,9 +29185,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARM64MOVDconst) @@ -29796,9 +29203,8 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { if v_1.Op != OpARM64SUB { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpARM64SUB) v0 := b.NewValue0(v.Pos, OpARM64ADD, v.Type) v0.AddArg(x) @@ -29811,15 +29217,13 @@ func rewriteValueARM64_OpARM64SUB_0(v *Value) bool { // cond: // result: (SUB x (ADD y z)) for { - _ = v.Args[1] + z := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SUB { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - z := v.Args[1] + x := v_0.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64ADD, y.Type) @@ -30105,13 +29509,12 @@ func rewriteValueARM64_OpARM64TST_0(v *Value) bool { // cond: // result: (TSTconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64TSTconst) v.AuxInt = c v.AddArg(x) @@ -30142,14 +29545,13 @@ func rewriteValueARM64_OpARM64TST_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (TSTshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -30184,14 +29586,13 @@ func rewriteValueARM64_OpARM64TST_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (TSTshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -30226,14 +29627,13 @@ func rewriteValueARM64_OpARM64TST_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (TSTshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -30266,13 +29666,12 @@ func rewriteValueARM64_OpARM64TSTW_0(v *Value) bool { // cond: // result: (TSTWconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64TSTWconst) v.AuxInt = c v.AddArg(x) @@ -30389,13 +29788,12 @@ func rewriteValueARM64_OpARM64TSTshiftLL_0(v *Value) bool { // result: (TSTconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64TSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -30430,13 +29828,12 @@ func rewriteValueARM64_OpARM64TSTshiftRA_0(v *Value) bool { // result: (TSTconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64TSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -30471,13 +29868,12 @@ func rewriteValueARM64_OpARM64TSTshiftRL_0(v *Value) bool { // result: (TSTconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64TSTconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -30735,9 +30131,8 @@ func rewriteValueARM64_OpARM64UMOD_0(v *Value) bool { if v.Type != typ.UInt64 { break } - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MSUB) v.Type = typ.UInt64 v.AddArg(x) @@ -30814,9 +30209,8 @@ func rewriteValueARM64_OpARM64UMODW_0(v *Value) bool { if v.Type != typ.UInt32 { break } - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MSUBW) v.Type = typ.UInt32 v.AddArg(x) @@ -30905,13 +30299,12 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { // cond: // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64XORconst) v.AuxInt = c v.AddArg(x) @@ -30921,9 +30314,8 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpARM64MOVDconst) @@ -30950,13 +30342,12 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { // cond: // result: (EON x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MVN { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpARM64EON) v.AddArg(x) v.AddArg(y) @@ -30987,14 +30378,13 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (XORshiftLL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SLLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -31029,14 +30419,13 @@ func rewriteValueARM64_OpARM64XOR_0(v *Value) bool { // cond: clobberIfDead(x1) // result: (XORshiftRL x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRLconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -31076,14 +30465,13 @@ func rewriteValueARM64_OpARM64XOR_10(v *Value) bool { // cond: clobberIfDead(x1) // result: (XORshiftRA x0 y [c]) for { - _ = v.Args[1] + x0 := v.Args[1] x1 := v.Args[0] if x1.Op != OpARM64SRAconst { break } c := x1.AuxInt y := x1.Args[0] - x0 := v.Args[1] if !(clobberIfDead(x1)) { break } @@ -32073,13 +31461,12 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { // result: (XORconst [c] (SLLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64XORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SLLconst, x.Type) @@ -32132,7 +31519,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { // result: (RORconst [64-c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -32140,8 +31527,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -32155,14 +31541,13 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { @@ -32183,7 +31568,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break @@ -32194,8 +31579,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { if v_0.AuxInt != armBFAuxInt(8, 8) { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64REV16W) @@ -32207,7 +31591,7 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { // result: (EXTRconst [64-c] x2 x) for { c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SRLconst { break @@ -32216,7 +31600,6 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { break } x := v_0.Args[0] - x2 := v.Args[1] v.reset(OpARM64EXTRconst) v.AuxInt = 64 - c v.AddArg(x2) @@ -32229,14 +31612,13 @@ func rewriteValueARM64_OpARM64XORshiftLL_0(v *Value) bool { for { t := v.Type c := v.AuxInt - _ = v.Args[1] + x2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64UBFX { break } bfc := v_0.AuxInt x := v_0.Args[0] - x2 := v.Args[1] if !(c < 32 && t.Size() == 4 && bfc == armBFAuxInt(32-c, c)) { break } @@ -32255,13 +31637,12 @@ func rewriteValueARM64_OpARM64XORshiftRA_0(v *Value) bool { // result: (XORconst [c] (SRAconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64XORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRAconst, x.Type) @@ -32318,13 +31699,12 @@ func rewriteValueARM64_OpARM64XORshiftRL_0(v *Value) bool { // result: (XORconst [c] (SRLconst x [d])) for { d := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpARM64XORconst) v.AuxInt = c v0 := b.NewValue0(v.Pos, OpARM64SRLconst, x.Type) @@ -32377,7 +31757,7 @@ func rewriteValueARM64_OpARM64XORshiftRL_0(v *Value) bool { // result: (RORconst [ c] x) for { c := v.AuxInt - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpARM64SLLconst { break @@ -32385,8 +31765,7 @@ func rewriteValueARM64_OpARM64XORshiftRL_0(v *Value) bool { if v_0.AuxInt != 64-c { break } - x := v_0.Args[0] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpARM64RORconst) @@ -32442,9 +31821,8 @@ func rewriteValueARM64_OpAdd16_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v.AddArg(x) v.AddArg(y) @@ -32456,9 +31834,8 @@ func rewriteValueARM64_OpAdd32_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v.AddArg(x) v.AddArg(y) @@ -32470,9 +31847,8 @@ func rewriteValueARM64_OpAdd32F_0(v *Value) bool { // cond: // result: (FADDS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FADDS) v.AddArg(x) v.AddArg(y) @@ -32484,9 +31860,8 @@ func rewriteValueARM64_OpAdd64_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v.AddArg(x) v.AddArg(y) @@ -32498,9 +31873,8 @@ func rewriteValueARM64_OpAdd64F_0(v *Value) bool { // cond: // result: (FADDD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FADDD) v.AddArg(x) v.AddArg(y) @@ -32512,9 +31886,8 @@ func rewriteValueARM64_OpAdd8_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v.AddArg(x) v.AddArg(y) @@ -32526,9 +31899,8 @@ func rewriteValueARM64_OpAddPtr_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v.AddArg(x) v.AddArg(y) @@ -32553,9 +31925,8 @@ func rewriteValueARM64_OpAnd16_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64AND) v.AddArg(x) v.AddArg(y) @@ -32567,9 +31938,8 @@ func rewriteValueARM64_OpAnd32_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64AND) v.AddArg(x) v.AddArg(y) @@ -32581,9 +31951,8 @@ func rewriteValueARM64_OpAnd64_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64AND) v.AddArg(x) v.AddArg(y) @@ -32595,9 +31964,8 @@ func rewriteValueARM64_OpAnd8_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64AND) v.AddArg(x) v.AddArg(y) @@ -32609,9 +31977,8 @@ func rewriteValueARM64_OpAndB_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64AND) v.AddArg(x) v.AddArg(y) @@ -32623,10 +31990,9 @@ func rewriteValueARM64_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicAdd32) v.AddArg(ptr) v.AddArg(val) @@ -32639,10 +32005,9 @@ func rewriteValueARM64_OpAtomicAdd32Variant_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd32Variant ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicAdd32Variant) v.AddArg(ptr) v.AddArg(val) @@ -32655,10 +32020,9 @@ func rewriteValueARM64_OpAtomicAdd64_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicAdd64) v.AddArg(ptr) v.AddArg(val) @@ -32671,10 +32035,9 @@ func rewriteValueARM64_OpAtomicAdd64Variant_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd64Variant ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicAdd64Variant) v.AddArg(ptr) v.AddArg(val) @@ -32689,10 +32052,9 @@ func rewriteValueARM64_OpAtomicAnd8_0(v *Value) bool { // cond: // result: (Select1 (LoweredAtomicAnd8 ptr val mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpARM64LoweredAtomicAnd8, types.NewTuple(typ.UInt8, types.TypeMem)) v0.AddArg(ptr) @@ -32707,11 +32069,10 @@ func rewriteValueARM64_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas32 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpARM64LoweredAtomicCas32) v.AddArg(ptr) v.AddArg(old) @@ -32725,11 +32086,10 @@ func rewriteValueARM64_OpAtomicCompareAndSwap64_0(v *Value) bool { // cond: // result: (LoweredAtomicCas64 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpARM64LoweredAtomicCas64) v.AddArg(ptr) v.AddArg(old) @@ -32743,10 +32103,9 @@ func rewriteValueARM64_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicExchange32) v.AddArg(ptr) v.AddArg(val) @@ -32759,10 +32118,9 @@ func rewriteValueARM64_OpAtomicExchange64_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredAtomicExchange64) v.AddArg(ptr) v.AddArg(val) @@ -32775,9 +32133,8 @@ func rewriteValueARM64_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (LDARW ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64LDARW) v.AddArg(ptr) v.AddArg(mem) @@ -32789,9 +32146,8 @@ func rewriteValueARM64_OpAtomicLoad64_0(v *Value) bool { // cond: // result: (LDAR ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64LDAR) v.AddArg(ptr) v.AddArg(mem) @@ -32803,9 +32159,8 @@ func rewriteValueARM64_OpAtomicLoadPtr_0(v *Value) bool { // cond: // result: (LDAR ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64LDAR) v.AddArg(ptr) v.AddArg(mem) @@ -32819,10 +32174,9 @@ func rewriteValueARM64_OpAtomicOr8_0(v *Value) bool { // cond: // result: (Select1 (LoweredAtomicOr8 ptr val mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpARM64LoweredAtomicOr8, types.NewTuple(typ.UInt8, types.TypeMem)) v0.AddArg(ptr) @@ -32837,10 +32191,9 @@ func rewriteValueARM64_OpAtomicStore32_0(v *Value) bool { // cond: // result: (STLRW ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64STLRW) v.AddArg(ptr) v.AddArg(val) @@ -32853,10 +32206,9 @@ func rewriteValueARM64_OpAtomicStore64_0(v *Value) bool { // cond: // result: (STLR ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64STLR) v.AddArg(ptr) v.AddArg(val) @@ -32869,10 +32221,9 @@ func rewriteValueARM64_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: // result: (STLR ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpARM64STLR) v.AddArg(ptr) v.AddArg(val) @@ -32887,9 +32238,8 @@ func rewriteValueARM64_OpAvg64u_0(v *Value) bool { // result: (ADD (SRLconst (SUB x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ADD) v0 := b.NewValue0(v.Pos, OpARM64SRLconst, t) v0.AuxInt = 1 @@ -33031,10 +32381,9 @@ func rewriteValueARM64_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpARM64CALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -33093,10 +32442,9 @@ func rewriteValueARM64_OpCondSelect_0(v *Value) bool { // cond: flagArg(bool) != nil // result: (CSEL {bool.Op} x y flagArg(bool)) for { - _ = v.Args[2] + bool := v.Args[2] x := v.Args[0] y := v.Args[1] - bool := v.Args[2] if !(flagArg(bool) != nil) { break } @@ -33111,10 +32459,9 @@ func rewriteValueARM64_OpCondSelect_0(v *Value) bool { // cond: flagArg(bool) == nil // result: (CSEL {OpARM64NotEqual} x y (CMPWconst [0] bool)) for { - _ = v.Args[2] + bool := v.Args[2] x := v.Args[0] y := v.Args[1] - bool := v.Args[2] if !(flagArg(bool) == nil) { break } @@ -33536,9 +32883,8 @@ func rewriteValueARM64_OpDiv16_0(v *Value) bool { // cond: // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64DIVW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -33556,9 +32902,8 @@ func rewriteValueARM64_OpDiv16u_0(v *Value) bool { // cond: // result: (UDIVW (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UDIVW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -33574,9 +32919,8 @@ func rewriteValueARM64_OpDiv32_0(v *Value) bool { // cond: // result: (DIVW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64DIVW) v.AddArg(x) v.AddArg(y) @@ -33588,9 +32932,8 @@ func rewriteValueARM64_OpDiv32F_0(v *Value) bool { // cond: // result: (FDIVS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FDIVS) v.AddArg(x) v.AddArg(y) @@ -33602,9 +32945,8 @@ func rewriteValueARM64_OpDiv32u_0(v *Value) bool { // cond: // result: (UDIVW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UDIVW) v.AddArg(x) v.AddArg(y) @@ -33616,9 +32958,8 @@ func rewriteValueARM64_OpDiv64_0(v *Value) bool { // cond: // result: (DIV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64DIV) v.AddArg(x) v.AddArg(y) @@ -33630,9 +32971,8 @@ func rewriteValueARM64_OpDiv64F_0(v *Value) bool { // cond: // result: (FDIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FDIVD) v.AddArg(x) v.AddArg(y) @@ -33644,9 +32984,8 @@ func rewriteValueARM64_OpDiv64u_0(v *Value) bool { // cond: // result: (UDIV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UDIV) v.AddArg(x) v.AddArg(y) @@ -33660,9 +32999,8 @@ func rewriteValueARM64_OpDiv8_0(v *Value) bool { // cond: // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64DIVW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -33680,9 +33018,8 @@ func rewriteValueARM64_OpDiv8u_0(v *Value) bool { // cond: // result: (UDIVW (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UDIVW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -33700,9 +33037,8 @@ func rewriteValueARM64_OpEq16_0(v *Value) bool { // cond: // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -33721,9 +33057,8 @@ func rewriteValueARM64_OpEq32_0(v *Value) bool { // cond: // result: (Equal (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -33738,9 +33073,8 @@ func rewriteValueARM64_OpEq32F_0(v *Value) bool { // cond: // result: (Equal (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -33755,9 +33089,8 @@ func rewriteValueARM64_OpEq64_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -33772,9 +33105,8 @@ func rewriteValueARM64_OpEq64F_0(v *Value) bool { // cond: // result: (Equal (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -33790,9 +33122,8 @@ func rewriteValueARM64_OpEq8_0(v *Value) bool { // cond: // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -33812,9 +33143,8 @@ func rewriteValueARM64_OpEqB_0(v *Value) bool { // cond: // result: (XOR (MOVDconst [1]) (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) v0.AuxInt = 1 @@ -33832,9 +33162,8 @@ func rewriteValueARM64_OpEqPtr_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64Equal) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -33861,9 +33190,8 @@ func rewriteValueARM64_OpGeq16_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -33883,9 +33211,8 @@ func rewriteValueARM64_OpGeq16U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -33904,9 +33231,8 @@ func rewriteValueARM64_OpGeq32_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -33921,9 +33247,8 @@ func rewriteValueARM64_OpGeq32F_0(v *Value) bool { // cond: // result: (GreaterEqualF (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -33938,9 +33263,8 @@ func rewriteValueARM64_OpGeq32U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -33955,9 +33279,8 @@ func rewriteValueARM64_OpGeq64_0(v *Value) bool { // cond: // result: (GreaterEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqual) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -33972,9 +33295,8 @@ func rewriteValueARM64_OpGeq64F_0(v *Value) bool { // cond: // result: (GreaterEqualF (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -33989,9 +33311,8 @@ func rewriteValueARM64_OpGeq64U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34007,9 +33328,8 @@ func rewriteValueARM64_OpGeq8_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -34029,9 +33349,8 @@ func rewriteValueARM64_OpGeq8U_0(v *Value) bool { // cond: // result: (GreaterEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -34078,9 +33397,8 @@ func rewriteValueARM64_OpGreater16_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -34100,9 +33418,8 @@ func rewriteValueARM64_OpGreater16U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -34121,9 +33438,8 @@ func rewriteValueARM64_OpGreater32_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34138,9 +33454,8 @@ func rewriteValueARM64_OpGreater32F_0(v *Value) bool { // cond: // result: (GreaterThanF (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -34155,9 +33470,8 @@ func rewriteValueARM64_OpGreater32U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34172,9 +33486,8 @@ func rewriteValueARM64_OpGreater64_0(v *Value) bool { // cond: // result: (GreaterThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThan) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34189,9 +33502,8 @@ func rewriteValueARM64_OpGreater64F_0(v *Value) bool { // cond: // result: (GreaterThanF (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -34206,9 +33518,8 @@ func rewriteValueARM64_OpGreater64U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34224,9 +33535,8 @@ func rewriteValueARM64_OpGreater8_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -34246,9 +33556,8 @@ func rewriteValueARM64_OpGreater8U_0(v *Value) bool { // cond: // result: (GreaterThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64GreaterThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -34268,9 +33577,8 @@ func rewriteValueARM64_OpHmul32_0(v *Value) bool { // cond: // result: (SRAconst (MULL x y) [32]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRAconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpARM64MULL, typ.Int64) @@ -34287,9 +33595,8 @@ func rewriteValueARM64_OpHmul32u_0(v *Value) bool { // cond: // result: (SRAconst (UMULL x y) [32]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRAconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpARM64UMULL, typ.UInt64) @@ -34304,9 +33611,8 @@ func rewriteValueARM64_OpHmul64_0(v *Value) bool { // cond: // result: (MULH x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MULH) v.AddArg(x) v.AddArg(y) @@ -34318,9 +33624,8 @@ func rewriteValueARM64_OpHmul64u_0(v *Value) bool { // cond: // result: (UMULH x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UMULH) v.AddArg(x) v.AddArg(y) @@ -34333,9 +33638,8 @@ func rewriteValueARM64_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpARM64CALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -34349,9 +33653,8 @@ func rewriteValueARM64_OpIsInBounds_0(v *Value) bool { // cond: // result: (LessThanU (CMP idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(idx) @@ -34381,9 +33684,8 @@ func rewriteValueARM64_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (LessEqualU (CMP idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpARM64LessEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(idx) @@ -34399,9 +33701,8 @@ func rewriteValueARM64_OpLeq16_0(v *Value) bool { // cond: // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -34421,9 +33722,8 @@ func rewriteValueARM64_OpLeq16U_0(v *Value) bool { // cond: // result: (LessEqualU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -34442,9 +33742,8 @@ func rewriteValueARM64_OpLeq32_0(v *Value) bool { // cond: // result: (LessEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34459,9 +33758,8 @@ func rewriteValueARM64_OpLeq32F_0(v *Value) bool { // cond: // result: (LessEqualF (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -34476,9 +33774,8 @@ func rewriteValueARM64_OpLeq32U_0(v *Value) bool { // cond: // result: (LessEqualU (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34493,9 +33790,8 @@ func rewriteValueARM64_OpLeq64_0(v *Value) bool { // cond: // result: (LessEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqual) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34510,9 +33806,8 @@ func rewriteValueARM64_OpLeq64F_0(v *Value) bool { // cond: // result: (LessEqualF (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -34527,9 +33822,8 @@ func rewriteValueARM64_OpLeq64U_0(v *Value) bool { // cond: // result: (LessEqualU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34545,9 +33839,8 @@ func rewriteValueARM64_OpLeq8_0(v *Value) bool { // cond: // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -34567,9 +33860,8 @@ func rewriteValueARM64_OpLeq8U_0(v *Value) bool { // cond: // result: (LessEqualU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessEqualU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -34589,9 +33881,8 @@ func rewriteValueARM64_OpLess16_0(v *Value) bool { // cond: // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -34611,9 +33902,8 @@ func rewriteValueARM64_OpLess16U_0(v *Value) bool { // cond: // result: (LessThanU (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -34632,9 +33922,8 @@ func rewriteValueARM64_OpLess32_0(v *Value) bool { // cond: // result: (LessThan (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34649,9 +33938,8 @@ func rewriteValueARM64_OpLess32F_0(v *Value) bool { // cond: // result: (LessThanF (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -34666,9 +33954,8 @@ func rewriteValueARM64_OpLess32U_0(v *Value) bool { // cond: // result: (LessThanU (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -34683,9 +33970,8 @@ func rewriteValueARM64_OpLess64_0(v *Value) bool { // cond: // result: (LessThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThan) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34700,9 +33986,8 @@ func rewriteValueARM64_OpLess64F_0(v *Value) bool { // cond: // result: (LessThanF (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanF) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -34717,9 +34002,8 @@ func rewriteValueARM64_OpLess64U_0(v *Value) bool { // cond: // result: (LessThanU (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -34735,9 +34019,8 @@ func rewriteValueARM64_OpLess8_0(v *Value) bool { // cond: // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThan) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -34757,9 +34040,8 @@ func rewriteValueARM64_OpLess8U_0(v *Value) bool { // cond: // result: (LessThanU (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LessThanU) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -34778,9 +34060,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean()) { break } @@ -34794,9 +34075,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -34810,9 +34090,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && !isSigned(t)) { break } @@ -34826,9 +34105,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -34842,9 +34120,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVHUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -34858,9 +34135,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && isSigned(t)) { break } @@ -34874,9 +34150,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVWUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && !isSigned(t)) { break } @@ -34890,9 +34165,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) || isPtr(t)) { break } @@ -34906,9 +34180,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (FMOVSload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -34922,9 +34195,8 @@ func rewriteValueARM64_OpLoad_0(v *Value) bool { // result: (FMOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -34957,9 +34229,8 @@ func rewriteValueARM64_OpLsh16x16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -34988,9 +34259,8 @@ func rewriteValueARM64_OpLsh16x32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35018,9 +34288,8 @@ func rewriteValueARM64_OpLsh16x64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35045,9 +34314,8 @@ func rewriteValueARM64_OpLsh16x8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35076,9 +34344,8 @@ func rewriteValueARM64_OpLsh32x16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35107,9 +34374,8 @@ func rewriteValueARM64_OpLsh32x32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35137,9 +34403,8 @@ func rewriteValueARM64_OpLsh32x64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35164,9 +34429,8 @@ func rewriteValueARM64_OpLsh32x8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35195,9 +34459,8 @@ func rewriteValueARM64_OpLsh64x16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35226,9 +34489,8 @@ func rewriteValueARM64_OpLsh64x32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35256,9 +34518,8 @@ func rewriteValueARM64_OpLsh64x64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35283,9 +34544,8 @@ func rewriteValueARM64_OpLsh64x8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35314,9 +34574,8 @@ func rewriteValueARM64_OpLsh8x16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35345,9 +34604,8 @@ func rewriteValueARM64_OpLsh8x32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35375,9 +34633,8 @@ func rewriteValueARM64_OpLsh8x64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35402,9 +34659,8 @@ func rewriteValueARM64_OpLsh8x8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SLL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SLL, t) @@ -35432,9 +34688,8 @@ func rewriteValueARM64_OpMod16_0(v *Value) bool { // cond: // result: (MODW (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MODW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -35452,9 +34707,8 @@ func rewriteValueARM64_OpMod16u_0(v *Value) bool { // cond: // result: (UMODW (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UMODW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -35470,9 +34724,8 @@ func rewriteValueARM64_OpMod32_0(v *Value) bool { // cond: // result: (MODW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MODW) v.AddArg(x) v.AddArg(y) @@ -35484,9 +34737,8 @@ func rewriteValueARM64_OpMod32u_0(v *Value) bool { // cond: // result: (UMODW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UMODW) v.AddArg(x) v.AddArg(y) @@ -35498,9 +34750,8 @@ func rewriteValueARM64_OpMod64_0(v *Value) bool { // cond: // result: (MOD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MOD) v.AddArg(x) v.AddArg(y) @@ -35512,9 +34763,8 @@ func rewriteValueARM64_OpMod64u_0(v *Value) bool { // cond: // result: (UMOD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UMOD) v.AddArg(x) v.AddArg(y) @@ -35528,9 +34778,8 @@ func rewriteValueARM64_OpMod8_0(v *Value) bool { // cond: // result: (MODW (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MODW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -35548,9 +34797,8 @@ func rewriteValueARM64_OpMod8u_0(v *Value) bool { // cond: // result: (UMODW (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64UMODW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -35571,7 +34819,6 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -35585,10 +34832,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpARM64MOVBUload, typ.UInt8) @@ -35605,10 +34851,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpARM64MOVHUload, typ.UInt16) @@ -35625,10 +34870,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpARM64MOVWUload, typ.UInt32) @@ -35645,10 +34889,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpARM64MOVDload, typ.UInt64) @@ -35665,10 +34908,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -35694,10 +34936,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = 4 v.AddArg(dst) @@ -35723,10 +34964,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVHstore) v.AuxInt = 4 v.AddArg(dst) @@ -35752,10 +34992,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVBstore) v.AuxInt = 6 v.AddArg(dst) @@ -35790,10 +35029,9 @@ func rewriteValueARM64_OpMove_0(v *Value) bool { if v.AuxInt != 12 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVWstore) v.AuxInt = 8 v.AddArg(dst) @@ -35825,10 +35063,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDstore) v.AuxInt = 8 v.AddArg(dst) @@ -35854,10 +35091,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { if v.AuxInt != 24 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpARM64MOVDstore) v.AuxInt = 16 v.AddArg(dst) @@ -35890,10 +35126,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { // result: (Move [s%8] (OffPtr dst [s-s%8]) (OffPtr src [s-s%8]) (Move [s-s%8] dst src mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s%8 != 0 && s > 8) { break } @@ -35920,10 +35155,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { // result: (MOVDstore [s-8] dst (MOVDload [s-8] src mem) (DUFFCOPY [8*(64-(s-8)/16)] dst src mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 32 && s <= 16*64 && s%16 == 8 && !config.noDuffDevice) { break } @@ -35948,10 +35182,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { // result: (DUFFCOPY [8 * (64 - s/16)] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 32 && s <= 16*64 && s%16 == 0 && !config.noDuffDevice) { break } @@ -35967,10 +35200,9 @@ func rewriteValueARM64_OpMove_10(v *Value) bool { // result: (LoweredMove dst src (ADDconst src [s-8]) mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 24 && s%8 == 0) { break } @@ -35991,9 +35223,8 @@ func rewriteValueARM64_OpMul16_0(v *Value) bool { // cond: // result: (MULW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MULW) v.AddArg(x) v.AddArg(y) @@ -36005,9 +35236,8 @@ func rewriteValueARM64_OpMul32_0(v *Value) bool { // cond: // result: (MULW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MULW) v.AddArg(x) v.AddArg(y) @@ -36019,9 +35249,8 @@ func rewriteValueARM64_OpMul32F_0(v *Value) bool { // cond: // result: (FMULS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FMULS) v.AddArg(x) v.AddArg(y) @@ -36033,9 +35262,8 @@ func rewriteValueARM64_OpMul64_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MUL) v.AddArg(x) v.AddArg(y) @@ -36047,9 +35275,8 @@ func rewriteValueARM64_OpMul64F_0(v *Value) bool { // cond: // result: (FMULD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FMULD) v.AddArg(x) v.AddArg(y) @@ -36061,9 +35288,8 @@ func rewriteValueARM64_OpMul64uhilo_0(v *Value) bool { // cond: // result: (LoweredMuluhilo x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64LoweredMuluhilo) v.AddArg(x) v.AddArg(y) @@ -36075,9 +35301,8 @@ func rewriteValueARM64_OpMul8_0(v *Value) bool { // cond: // result: (MULW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64MULW) v.AddArg(x) v.AddArg(y) @@ -36157,9 +35382,8 @@ func rewriteValueARM64_OpNeq16_0(v *Value) bool { // cond: // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -36178,9 +35402,8 @@ func rewriteValueARM64_OpNeq32_0(v *Value) bool { // cond: // result: (NotEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v0.AddArg(x) @@ -36195,9 +35418,8 @@ func rewriteValueARM64_OpNeq32F_0(v *Value) bool { // cond: // result: (NotEqual (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64FCMPS, types.TypeFlags) v0.AddArg(x) @@ -36212,9 +35434,8 @@ func rewriteValueARM64_OpNeq64_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -36229,9 +35450,8 @@ func rewriteValueARM64_OpNeq64F_0(v *Value) bool { // cond: // result: (NotEqual (FCMPD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64FCMPD, types.TypeFlags) v0.AddArg(x) @@ -36247,9 +35467,8 @@ func rewriteValueARM64_OpNeq8_0(v *Value) bool { // cond: // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -36267,9 +35486,8 @@ func rewriteValueARM64_OpNeqB_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v.AddArg(x) v.AddArg(y) @@ -36282,9 +35500,8 @@ func rewriteValueARM64_OpNeqPtr_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64NotEqual) v0 := b.NewValue0(v.Pos, OpARM64CMP, types.TypeFlags) v0.AddArg(x) @@ -36298,9 +35515,8 @@ func rewriteValueARM64_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64LoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -36355,9 +35571,8 @@ func rewriteValueARM64_OpOr16_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64OR) v.AddArg(x) v.AddArg(y) @@ -36369,9 +35584,8 @@ func rewriteValueARM64_OpOr32_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64OR) v.AddArg(x) v.AddArg(y) @@ -36383,9 +35597,8 @@ func rewriteValueARM64_OpOr64_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64OR) v.AddArg(x) v.AddArg(y) @@ -36397,9 +35610,8 @@ func rewriteValueARM64_OpOr8_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64OR) v.AddArg(x) v.AddArg(y) @@ -36411,9 +35623,8 @@ func rewriteValueARM64_OpOrB_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64OR) v.AddArg(x) v.AddArg(y) @@ -36493,9 +35704,8 @@ func rewriteValueARM64_OpRotateLeft32_0(v *Value) bool { // cond: // result: (RORW x (NEG y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64RORW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64NEG, y.Type) @@ -36510,9 +35720,8 @@ func rewriteValueARM64_OpRotateLeft64_0(v *Value) bool { // cond: // result: (ROR x (NEG y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64ROR) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64NEG, y.Type) @@ -36573,9 +35782,8 @@ func rewriteValueARM64_OpRsh16Ux16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36606,9 +35814,8 @@ func rewriteValueARM64_OpRsh16Ux32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36639,9 +35846,8 @@ func rewriteValueARM64_OpRsh16Ux64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36668,9 +35874,8 @@ func rewriteValueARM64_OpRsh16Ux8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt16to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36700,9 +35905,8 @@ func rewriteValueARM64_OpRsh16x16_0(v *Value) bool { // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -36732,9 +35936,8 @@ func rewriteValueARM64_OpRsh16x32_0(v *Value) bool { // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -36764,9 +35967,8 @@ func rewriteValueARM64_OpRsh16x64_0(v *Value) bool { // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -36792,9 +35994,8 @@ func rewriteValueARM64_OpRsh16x8_0(v *Value) bool { // cond: // result: (SRA (SignExt16to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -36825,9 +36026,8 @@ func rewriteValueARM64_OpRsh32Ux16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36858,9 +36058,8 @@ func rewriteValueARM64_OpRsh32Ux32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36891,9 +36090,8 @@ func rewriteValueARM64_OpRsh32Ux64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36920,9 +36118,8 @@ func rewriteValueARM64_OpRsh32Ux8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt32to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -36952,9 +36149,8 @@ func rewriteValueARM64_OpRsh32x16_0(v *Value) bool { // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -36984,9 +36180,8 @@ func rewriteValueARM64_OpRsh32x32_0(v *Value) bool { // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -37016,9 +36211,8 @@ func rewriteValueARM64_OpRsh32x64_0(v *Value) bool { // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -37044,9 +36238,8 @@ func rewriteValueARM64_OpRsh32x8_0(v *Value) bool { // cond: // result: (SRA (SignExt32to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -37077,9 +36270,8 @@ func rewriteValueARM64_OpRsh64Ux16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37108,9 +36300,8 @@ func rewriteValueARM64_OpRsh64Ux32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37138,9 +36329,8 @@ func rewriteValueARM64_OpRsh64Ux64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL x y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37165,9 +36355,8 @@ func rewriteValueARM64_OpRsh64Ux8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL x (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37195,9 +36384,8 @@ func rewriteValueARM64_OpRsh64x16_0(v *Value) bool { // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) @@ -37225,9 +36413,8 @@ func rewriteValueARM64_OpRsh64x32_0(v *Value) bool { // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) @@ -37254,9 +36441,8 @@ func rewriteValueARM64_OpRsh64x64_0(v *Value) bool { // cond: // result: (SRA x (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) @@ -37280,9 +36466,8 @@ func rewriteValueARM64_OpRsh64x8_0(v *Value) bool { // cond: // result: (SRA x (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpARM64CSEL, y.Type) @@ -37311,9 +36496,8 @@ func rewriteValueARM64_OpRsh8Ux16_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt16to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37344,9 +36528,8 @@ func rewriteValueARM64_OpRsh8Ux32_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt32to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37377,9 +36560,8 @@ func rewriteValueARM64_OpRsh8Ux64_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) y) (Const64 [0]) (CMPconst [64] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37406,9 +36588,8 @@ func rewriteValueARM64_OpRsh8Ux8_0(v *Value) bool { // result: (CSEL {OpARM64LessThanU} (SRL (ZeroExt8to64 x) (ZeroExt8to64 y)) (Const64 [0]) (CMPconst [64] (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64CSEL) v.Aux = OpARM64LessThanU v0 := b.NewValue0(v.Pos, OpARM64SRL, t) @@ -37438,9 +36619,8 @@ func rewriteValueARM64_OpRsh8x16_0(v *Value) bool { // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt16to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt16to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -37470,9 +36650,8 @@ func rewriteValueARM64_OpRsh8x32_0(v *Value) bool { // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt32to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt32to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -37502,9 +36681,8 @@ func rewriteValueARM64_OpRsh8x64_0(v *Value) bool { // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} y (Const64 [63]) (CMPconst [64] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -37530,9 +36708,8 @@ func rewriteValueARM64_OpRsh8x8_0(v *Value) bool { // cond: // result: (SRA (SignExt8to64 x) (CSEL {OpARM64LessThanU} (ZeroExt8to64 y) (Const64 [63]) (CMPconst [64] (ZeroExt8to64 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SRA) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -37669,10 +36846,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -37687,10 +36863,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -37705,10 +36880,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { break } @@ -37723,10 +36897,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && !is64BitFloat(val.Type)) { break } @@ -37741,10 +36914,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (FMOVSstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -37759,10 +36931,9 @@ func rewriteValueARM64_OpStore_0(v *Value) bool { // result: (FMOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -37779,9 +36950,8 @@ func rewriteValueARM64_OpSub16_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -37793,9 +36963,8 @@ func rewriteValueARM64_OpSub32_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -37807,9 +36976,8 @@ func rewriteValueARM64_OpSub32F_0(v *Value) bool { // cond: // result: (FSUBS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FSUBS) v.AddArg(x) v.AddArg(y) @@ -37821,9 +36989,8 @@ func rewriteValueARM64_OpSub64_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -37835,9 +37002,8 @@ func rewriteValueARM64_OpSub64F_0(v *Value) bool { // cond: // result: (FSUBD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64FSUBD) v.AddArg(x) v.AddArg(y) @@ -37849,9 +37015,8 @@ func rewriteValueARM64_OpSub8_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -37863,9 +37028,8 @@ func rewriteValueARM64_OpSubPtr_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64SUB) v.AddArg(x) v.AddArg(y) @@ -37961,10 +37125,9 @@ func rewriteValueARM64_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpARM64LoweredWB) v.Aux = fn v.AddArg(destptr) @@ -37978,9 +37141,8 @@ func rewriteValueARM64_OpXor16_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v.AddArg(x) v.AddArg(y) @@ -37992,9 +37154,8 @@ func rewriteValueARM64_OpXor32_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v.AddArg(x) v.AddArg(y) @@ -38006,9 +37167,8 @@ func rewriteValueARM64_OpXor64_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v.AddArg(x) v.AddArg(y) @@ -38020,9 +37180,8 @@ func rewriteValueARM64_OpXor8_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpARM64XOR) v.AddArg(x) v.AddArg(y) @@ -38039,7 +37198,6 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -38053,9 +37211,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) @@ -38071,9 +37228,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVHstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) @@ -38089,9 +37245,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVWstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) @@ -38107,9 +37262,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVDstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpARM64MOVDconst, typ.UInt64) @@ -38125,9 +37279,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 2 v.AddArg(ptr) @@ -38150,9 +37303,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 4 v.AddArg(ptr) @@ -38175,9 +37327,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVHstore) v.AuxInt = 4 v.AddArg(ptr) @@ -38200,9 +37351,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 6 v.AddArg(ptr) @@ -38232,9 +37382,8 @@ func rewriteValueARM64_OpZero_0(v *Value) bool { if v.AuxInt != 9 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 8 v.AddArg(ptr) @@ -38262,9 +37411,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 10 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVHstore) v.AuxInt = 8 v.AddArg(ptr) @@ -38287,9 +37435,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 11 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 10 v.AddArg(ptr) @@ -38319,9 +37466,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 12 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVWstore) v.AuxInt = 8 v.AddArg(ptr) @@ -38344,9 +37490,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 13 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 12 v.AddArg(ptr) @@ -38376,9 +37521,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 14 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVHstore) v.AuxInt = 12 v.AddArg(ptr) @@ -38408,9 +37552,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 15 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64MOVBstore) v.AuxInt = 14 v.AddArg(ptr) @@ -38447,9 +37590,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64STP) v.AuxInt = 0 v.AddArg(ptr) @@ -38469,9 +37611,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 32 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64STP) v.AuxInt = 16 v.AddArg(ptr) @@ -38501,9 +37642,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 48 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64STP) v.AuxInt = 32 v.AddArg(ptr) @@ -38543,9 +37683,8 @@ func rewriteValueARM64_OpZero_10(v *Value) bool { if v.AuxInt != 64 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpARM64STP) v.AuxInt = 48 v.AddArg(ptr) @@ -38598,9 +37737,8 @@ func rewriteValueARM64_OpZero_20(v *Value) bool { // result: (Zero [8] (OffPtr ptr [s-8]) (Zero [s-s%16] ptr mem)) for { s := v.AuxInt - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%16 != 0 && s%16 <= 8 && s > 16) { break } @@ -38622,9 +37760,8 @@ func rewriteValueARM64_OpZero_20(v *Value) bool { // result: (Zero [16] (OffPtr ptr [s-16]) (Zero [s-s%16] ptr mem)) for { s := v.AuxInt - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%16 != 0 && s%16 > 8 && s > 16) { break } @@ -38646,9 +37783,8 @@ func rewriteValueARM64_OpZero_20(v *Value) bool { // result: (DUFFZERO [4 * (64 - s/16)] ptr mem) for { s := v.AuxInt - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%16 == 0 && s > 64 && s <= 16*64 && !config.noDuffDevice) { break } @@ -38663,9 +37799,8 @@ func rewriteValueARM64_OpZero_20(v *Value) bool { // result: (LoweredZero ptr (ADDconst [s-16] ptr) mem) for { s := v.AuxInt - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%16 == 0 && (s > 16*64 || config.noDuffDevice)) { break } @@ -38798,9 +37933,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -38827,9 +37961,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -38940,9 +38073,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -38969,9 +38101,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39084,10 +38215,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39117,10 +38247,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39150,10 +38279,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39183,10 +38311,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39424,9 +38551,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39453,9 +38579,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39566,9 +38691,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39595,9 +38719,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39676,10 +38799,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39709,10 +38831,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39742,10 +38863,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39775,10 +38895,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -39952,9 +39071,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -39981,9 +39099,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40094,9 +39211,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40123,9 +39239,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40204,10 +39319,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40237,10 +39351,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40270,10 +39383,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40303,10 +39415,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40656,9 +39767,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40685,9 +39795,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40798,9 +39907,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40827,9 +39935,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -40908,10 +40015,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40941,10 +40047,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -40974,10 +40079,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41007,10 +40111,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41150,9 +40253,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41179,9 +40281,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41292,9 +40393,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41321,9 +40421,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41402,10 +40501,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41435,10 +40533,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41468,10 +40565,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41501,10 +40597,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41679,9 +40774,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41708,9 +40802,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41821,9 +40914,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41850,9 +40942,8 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64ADD { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -41965,10 +41056,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADD { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -41998,10 +41088,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUB { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -42031,10 +41120,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MADDW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } @@ -42064,10 +41152,9 @@ func rewriteBlockARM64(b *Block) bool { if z.Op != OpARM64MSUBW { break } - _ = z.Args[2] + y := z.Args[2] a := z.Args[0] x := z.Args[1] - y := z.Args[2] if !(z.Uses == 1) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index a2520df710..145ee5aa63 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -523,9 +523,8 @@ func rewriteValueMIPS_OpAdd16_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADD) v.AddArg(x) v.AddArg(y) @@ -537,9 +536,8 @@ func rewriteValueMIPS_OpAdd32_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADD) v.AddArg(x) v.AddArg(y) @@ -551,9 +549,8 @@ func rewriteValueMIPS_OpAdd32F_0(v *Value) bool { // cond: // result: (ADDF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADDF) v.AddArg(x) v.AddArg(y) @@ -567,10 +564,9 @@ func rewriteValueMIPS_OpAdd32withcarry_0(v *Value) bool { // result: (ADD c (ADD x y)) for { t := v.Type - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(OpMIPSADD) v.AddArg(c) v0 := b.NewValue0(v.Pos, OpMIPSADD, t) @@ -585,9 +581,8 @@ func rewriteValueMIPS_OpAdd64F_0(v *Value) bool { // cond: // result: (ADDD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADDD) v.AddArg(x) v.AddArg(y) @@ -599,9 +594,8 @@ func rewriteValueMIPS_OpAdd8_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADD) v.AddArg(x) v.AddArg(y) @@ -613,9 +607,8 @@ func rewriteValueMIPS_OpAddPtr_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADD) v.AddArg(x) v.AddArg(y) @@ -640,9 +633,8 @@ func rewriteValueMIPS_OpAnd16_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSAND) v.AddArg(x) v.AddArg(y) @@ -654,9 +646,8 @@ func rewriteValueMIPS_OpAnd32_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSAND) v.AddArg(x) v.AddArg(y) @@ -668,9 +659,8 @@ func rewriteValueMIPS_OpAnd8_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSAND) v.AddArg(x) v.AddArg(y) @@ -682,9 +672,8 @@ func rewriteValueMIPS_OpAndB_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSAND) v.AddArg(x) v.AddArg(y) @@ -696,10 +685,9 @@ func rewriteValueMIPS_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSLoweredAtomicAdd) v.AddArg(ptr) v.AddArg(val) @@ -715,10 +703,9 @@ func rewriteValueMIPS_OpAtomicAnd8_0(v *Value) bool { // cond: !config.BigEndian // result: (LoweredAtomicAnd (AND (MOVWconst [^3]) ptr) (OR (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] ptr))) (NORconst [0] (SLL (MOVWconst [0xff]) (SLLconst [3] (ANDconst [3] ptr))))) mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(!config.BigEndian) { break } @@ -765,10 +752,9 @@ func rewriteValueMIPS_OpAtomicAnd8_0(v *Value) bool { // cond: config.BigEndian // result: (LoweredAtomicAnd (AND (MOVWconst [^3]) ptr) (OR (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] (XORconst [3] ptr)))) (NORconst [0] (SLL (MOVWconst [0xff]) (SLLconst [3] (ANDconst [3] (XORconst [3] ptr)))))) mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(config.BigEndian) { break } @@ -824,11 +810,10 @@ func rewriteValueMIPS_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpMIPSLoweredAtomicCas) v.AddArg(ptr) v.AddArg(old) @@ -842,10 +827,9 @@ func rewriteValueMIPS_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSLoweredAtomicExchange) v.AddArg(ptr) v.AddArg(val) @@ -858,9 +842,8 @@ func rewriteValueMIPS_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSLoweredAtomicLoad) v.AddArg(ptr) v.AddArg(mem) @@ -872,9 +855,8 @@ func rewriteValueMIPS_OpAtomicLoadPtr_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSLoweredAtomicLoad) v.AddArg(ptr) v.AddArg(mem) @@ -889,10 +871,9 @@ func rewriteValueMIPS_OpAtomicOr8_0(v *Value) bool { // cond: !config.BigEndian // result: (LoweredAtomicOr (AND (MOVWconst [^3]) ptr) (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] ptr))) mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(!config.BigEndian) { break } @@ -922,10 +903,9 @@ func rewriteValueMIPS_OpAtomicOr8_0(v *Value) bool { // cond: config.BigEndian // result: (LoweredAtomicOr (AND (MOVWconst [^3]) ptr) (SLL (ZeroExt8to32 val) (SLLconst [3] (ANDconst [3] (XORconst [3] ptr)))) mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(config.BigEndian) { break } @@ -961,10 +941,9 @@ func rewriteValueMIPS_OpAtomicStore32_0(v *Value) bool { // cond: // result: (LoweredAtomicStore ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSLoweredAtomicStore) v.AddArg(ptr) v.AddArg(val) @@ -977,10 +956,9 @@ func rewriteValueMIPS_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: // result: (LoweredAtomicStore ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSLoweredAtomicStore) v.AddArg(ptr) v.AddArg(val) @@ -995,9 +973,8 @@ func rewriteValueMIPS_OpAvg32u_0(v *Value) bool { // result: (ADD (SRLconst (SUB x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSADD) v0 := b.NewValue0(v.Pos, OpMIPSSRLconst, t) v0.AuxInt = 1 @@ -1035,10 +1012,9 @@ func rewriteValueMIPS_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSCALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -1270,9 +1246,8 @@ func rewriteValueMIPS_OpDiv16_0(v *Value) bool { // cond: // result: (Select1 (DIV (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -1292,9 +1267,8 @@ func rewriteValueMIPS_OpDiv16u_0(v *Value) bool { // cond: // result: (Select1 (DIVU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -1314,9 +1288,8 @@ func rewriteValueMIPS_OpDiv32_0(v *Value) bool { // cond: // result: (Select1 (DIV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v0.AddArg(x) @@ -1330,9 +1303,8 @@ func rewriteValueMIPS_OpDiv32F_0(v *Value) bool { // cond: // result: (DIVF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSDIVF) v.AddArg(x) v.AddArg(y) @@ -1346,9 +1318,8 @@ func rewriteValueMIPS_OpDiv32u_0(v *Value) bool { // cond: // result: (Select1 (DIVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v0.AddArg(x) @@ -1362,9 +1333,8 @@ func rewriteValueMIPS_OpDiv64F_0(v *Value) bool { // cond: // result: (DIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSDIVD) v.AddArg(x) v.AddArg(y) @@ -1378,9 +1348,8 @@ func rewriteValueMIPS_OpDiv8_0(v *Value) bool { // cond: // result: (Select1 (DIV (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -1400,9 +1369,8 @@ func rewriteValueMIPS_OpDiv8u_0(v *Value) bool { // cond: // result: (Select1 (DIVU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -1422,9 +1390,8 @@ func rewriteValueMIPS_OpEq16_0(v *Value) bool { // cond: // result: (SGTUconst [1] (XOR (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTUconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) @@ -1445,9 +1412,8 @@ func rewriteValueMIPS_OpEq32_0(v *Value) bool { // cond: // result: (SGTUconst [1] (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTUconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) @@ -1463,9 +1429,8 @@ func rewriteValueMIPS_OpEq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPEQF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPEQF, types.TypeFlags) v0.AddArg(x) @@ -1480,9 +1445,8 @@ func rewriteValueMIPS_OpEq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPEQD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPEQD, types.TypeFlags) v0.AddArg(x) @@ -1498,9 +1462,8 @@ func rewriteValueMIPS_OpEq8_0(v *Value) bool { // cond: // result: (SGTUconst [1] (XOR (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTUconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) @@ -1521,9 +1484,8 @@ func rewriteValueMIPS_OpEqB_0(v *Value) bool { // cond: // result: (XORconst [1] (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.Bool) @@ -1540,9 +1502,8 @@ func rewriteValueMIPS_OpEqPtr_0(v *Value) bool { // cond: // result: (SGTUconst [1] (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTUconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) @@ -1559,9 +1520,8 @@ func rewriteValueMIPS_OpGeq16_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT (SignExt16to32 y) (SignExt16to32 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -1582,9 +1542,8 @@ func rewriteValueMIPS_OpGeq16U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU (ZeroExt16to32 y) (ZeroExt16to32 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -1605,9 +1564,8 @@ func rewriteValueMIPS_OpGeq32_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -1623,9 +1581,8 @@ func rewriteValueMIPS_OpGeq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGEF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGEF, types.TypeFlags) v0.AddArg(x) @@ -1641,9 +1598,8 @@ func rewriteValueMIPS_OpGeq32U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -1659,9 +1615,8 @@ func rewriteValueMIPS_OpGeq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGED x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGED, types.TypeFlags) v0.AddArg(x) @@ -1677,9 +1632,8 @@ func rewriteValueMIPS_OpGeq8_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT (SignExt8to32 y) (SignExt8to32 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -1700,9 +1654,8 @@ func rewriteValueMIPS_OpGeq8U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU (ZeroExt8to32 y) (ZeroExt8to32 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -1750,9 +1703,8 @@ func rewriteValueMIPS_OpGreater16_0(v *Value) bool { // cond: // result: (SGT (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -1770,9 +1722,8 @@ func rewriteValueMIPS_OpGreater16U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -1788,9 +1739,8 @@ func rewriteValueMIPS_OpGreater32_0(v *Value) bool { // cond: // result: (SGT x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v.AddArg(x) v.AddArg(y) @@ -1803,9 +1753,8 @@ func rewriteValueMIPS_OpGreater32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGTF, types.TypeFlags) v0.AddArg(x) @@ -1819,9 +1768,8 @@ func rewriteValueMIPS_OpGreater32U_0(v *Value) bool { // cond: // result: (SGTU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v.AddArg(x) v.AddArg(y) @@ -1834,9 +1782,8 @@ func rewriteValueMIPS_OpGreater64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGTD, types.TypeFlags) v0.AddArg(x) @@ -1852,9 +1799,8 @@ func rewriteValueMIPS_OpGreater8_0(v *Value) bool { // cond: // result: (SGT (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -1872,9 +1818,8 @@ func rewriteValueMIPS_OpGreater8U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -1892,9 +1837,8 @@ func rewriteValueMIPS_OpHmul32_0(v *Value) bool { // cond: // result: (Select0 (MULT x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSMULT, types.NewTuple(typ.Int32, typ.Int32)) v0.AddArg(x) @@ -1910,9 +1854,8 @@ func rewriteValueMIPS_OpHmul32u_0(v *Value) bool { // cond: // result: (Select0 (MULTU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSMULTU, types.NewTuple(typ.UInt32, typ.UInt32)) v0.AddArg(x) @@ -1927,9 +1870,8 @@ func rewriteValueMIPS_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpMIPSCALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -1942,9 +1884,8 @@ func rewriteValueMIPS_OpIsInBounds_0(v *Value) bool { // cond: // result: (SGTU len idx) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpMIPSSGTU) v.AddArg(len) v.AddArg(idx) @@ -1974,9 +1915,8 @@ func rewriteValueMIPS_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -1993,9 +1933,8 @@ func rewriteValueMIPS_OpLeq16_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -2016,9 +1955,8 @@ func rewriteValueMIPS_OpLeq16U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -2039,9 +1977,8 @@ func rewriteValueMIPS_OpLeq32_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -2057,9 +1994,8 @@ func rewriteValueMIPS_OpLeq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGEF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGEF, types.TypeFlags) v0.AddArg(y) @@ -2075,9 +2011,8 @@ func rewriteValueMIPS_OpLeq32U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -2093,9 +2028,8 @@ func rewriteValueMIPS_OpLeq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGED y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGED, types.TypeFlags) v0.AddArg(y) @@ -2111,9 +2045,8 @@ func rewriteValueMIPS_OpLeq8_0(v *Value) bool { // cond: // result: (XORconst [1] (SGT (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGT, typ.Bool) @@ -2134,9 +2067,8 @@ func rewriteValueMIPS_OpLeq8U_0(v *Value) bool { // cond: // result: (XORconst [1] (SGTU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXORconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpMIPSSGTU, typ.Bool) @@ -2157,9 +2089,8 @@ func rewriteValueMIPS_OpLess16_0(v *Value) bool { // cond: // result: (SGT (SignExt16to32 y) (SignExt16to32 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(y) @@ -2177,9 +2108,8 @@ func rewriteValueMIPS_OpLess16U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt16to32 y) (ZeroExt16to32 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(y) @@ -2195,9 +2125,8 @@ func rewriteValueMIPS_OpLess32_0(v *Value) bool { // cond: // result: (SGT y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v.AddArg(y) v.AddArg(x) @@ -2210,9 +2139,8 @@ func rewriteValueMIPS_OpLess32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGTF, types.TypeFlags) v0.AddArg(y) @@ -2226,9 +2154,8 @@ func rewriteValueMIPS_OpLess32U_0(v *Value) bool { // cond: // result: (SGTU y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v.AddArg(y) v.AddArg(x) @@ -2241,9 +2168,8 @@ func rewriteValueMIPS_OpLess64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPSCMPGTD, types.TypeFlags) v0.AddArg(y) @@ -2259,9 +2185,8 @@ func rewriteValueMIPS_OpLess8_0(v *Value) bool { // cond: // result: (SGT (SignExt8to32 y) (SignExt8to32 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGT) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(y) @@ -2279,9 +2204,8 @@ func rewriteValueMIPS_OpLess8U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt8to32 y) (ZeroExt8to32 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(y) @@ -2298,9 +2222,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean()) { break } @@ -2314,9 +2237,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -2330,9 +2252,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && !isSigned(t)) { break } @@ -2346,9 +2267,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -2362,9 +2282,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVHUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -2378,9 +2297,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) || isPtr(t)) { break } @@ -2394,9 +2312,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVFload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -2410,9 +2327,8 @@ func rewriteValueMIPS_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -2445,9 +2361,8 @@ func rewriteValueMIPS_OpLsh16x16_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2475,9 +2390,8 @@ func rewriteValueMIPS_OpLsh16x32_0(v *Value) bool { // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2540,9 +2454,8 @@ func rewriteValueMIPS_OpLsh16x8_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2570,9 +2483,8 @@ func rewriteValueMIPS_OpLsh32x16_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2600,9 +2512,8 @@ func rewriteValueMIPS_OpLsh32x32_0(v *Value) bool { // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2665,9 +2576,8 @@ func rewriteValueMIPS_OpLsh32x8_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2695,9 +2605,8 @@ func rewriteValueMIPS_OpLsh8x16_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2725,9 +2634,8 @@ func rewriteValueMIPS_OpLsh8x32_0(v *Value) bool { // result: (CMOVZ (SLL x y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2790,9 +2698,8 @@ func rewriteValueMIPS_OpLsh8x8_0(v *Value) bool { // result: (CMOVZ (SLL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSLL, t) v0.AddArg(x) @@ -2833,13 +2740,12 @@ func rewriteValueMIPS_OpMIPSADD_0(v *Value) bool { // cond: // result: (ADDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSADDconst) v.AuxInt = c v.AddArg(x) @@ -2865,13 +2771,12 @@ func rewriteValueMIPS_OpMIPSADD_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSNEG { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpMIPSSUB) v.AddArg(x) v.AddArg(y) @@ -2981,13 +2886,12 @@ func rewriteValueMIPS_OpMIPSAND_0(v *Value) bool { // cond: // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSANDconst) v.AuxInt = c v.AddArg(x) @@ -2997,9 +2901,8 @@ func rewriteValueMIPS_OpMIPSAND_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -3166,7 +3069,7 @@ func rewriteValueMIPS_OpMIPSCMOVZ_0(v *Value) bool { // cond: // result: (CMOVZzero a c) for { - _ = v.Args[2] + c := v.Args[2] a := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { @@ -3175,7 +3078,6 @@ func rewriteValueMIPS_OpMIPSCMOVZ_0(v *Value) bool { if v_1.AuxInt != 0 { break } - c := v.Args[2] v.reset(OpMIPSCMOVZzero) v.AddArg(a) v.AddArg(c) @@ -3226,14 +3128,13 @@ func rewriteValueMIPS_OpMIPSLoweredAtomicAdd_0(v *Value) bool { // cond: is16Bit(c) // result: (LoweredAtomicAddconst [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -3250,7 +3151,7 @@ func rewriteValueMIPS_OpMIPSLoweredAtomicStore_0(v *Value) bool { // cond: // result: (LoweredAtomicStorezero ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { @@ -3259,7 +3160,6 @@ func rewriteValueMIPS_OpMIPSLoweredAtomicStore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPSLoweredAtomicStorezero) v.AddArg(ptr) v.AddArg(mem) @@ -3274,14 +3174,13 @@ func rewriteValueMIPS_OpMIPSMOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3298,7 +3197,7 @@ func rewriteValueMIPS_OpMIPSMOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3306,7 +3205,6 @@ func rewriteValueMIPS_OpMIPSMOVBUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -3381,9 +3279,8 @@ func rewriteValueMIPS_OpMIPSMOVBUreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -3434,14 +3331,13 @@ func rewriteValueMIPS_OpMIPSMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3458,7 +3354,7 @@ func rewriteValueMIPS_OpMIPSMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3466,7 +3362,6 @@ func rewriteValueMIPS_OpMIPSMOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -3541,9 +3436,8 @@ func rewriteValueMIPS_OpMIPSMOVBreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -3597,7 +3491,7 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] if x.Op != OpMIPSADDconst { break @@ -3605,7 +3499,6 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { off2 := x.AuxInt ptr := x.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3623,7 +3516,7 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3632,7 +3525,6 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -3650,7 +3542,7 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { @@ -3659,7 +3551,6 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPSMOVBstorezero) v.AuxInt = off v.Aux = sym @@ -3673,14 +3564,13 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = off v.Aux = sym @@ -3695,14 +3585,13 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVBUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = off v.Aux = sym @@ -3717,14 +3606,13 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = off v.Aux = sym @@ -3739,14 +3627,13 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = off v.Aux = sym @@ -3761,14 +3648,13 @@ func rewriteValueMIPS_OpMIPSMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = off v.Aux = sym @@ -3786,14 +3672,13 @@ func rewriteValueMIPS_OpMIPSMOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3810,7 +3695,7 @@ func rewriteValueMIPS_OpMIPSMOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3818,7 +3703,6 @@ func rewriteValueMIPS_OpMIPSMOVBstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -3838,14 +3722,13 @@ func rewriteValueMIPS_OpMIPSMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3862,7 +3745,7 @@ func rewriteValueMIPS_OpMIPSMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3870,7 +3753,6 @@ func rewriteValueMIPS_OpMIPSMOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -3915,7 +3797,7 @@ func rewriteValueMIPS_OpMIPSMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] if x.Op != OpMIPSADDconst { break @@ -3923,7 +3805,6 @@ func rewriteValueMIPS_OpMIPSMOVDstore_0(v *Value) bool { off2 := x.AuxInt ptr := x.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3941,7 +3822,7 @@ func rewriteValueMIPS_OpMIPSMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -3950,7 +3831,6 @@ func rewriteValueMIPS_OpMIPSMOVDstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -3971,14 +3851,13 @@ func rewriteValueMIPS_OpMIPSMOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -3995,7 +3874,7 @@ func rewriteValueMIPS_OpMIPSMOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4003,7 +3882,6 @@ func rewriteValueMIPS_OpMIPSMOVFload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4048,7 +3926,7 @@ func rewriteValueMIPS_OpMIPSMOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] if x.Op != OpMIPSADDconst { break @@ -4056,7 +3934,6 @@ func rewriteValueMIPS_OpMIPSMOVFstore_0(v *Value) bool { off2 := x.AuxInt ptr := x.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4074,7 +3951,7 @@ func rewriteValueMIPS_OpMIPSMOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4083,7 +3960,6 @@ func rewriteValueMIPS_OpMIPSMOVFstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -4104,14 +3980,13 @@ func rewriteValueMIPS_OpMIPSMOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4128,7 +4003,7 @@ func rewriteValueMIPS_OpMIPSMOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4136,7 +4011,6 @@ func rewriteValueMIPS_OpMIPSMOVHUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4236,9 +4110,8 @@ func rewriteValueMIPS_OpMIPSMOVHUreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -4289,14 +4162,13 @@ func rewriteValueMIPS_OpMIPSMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4313,7 +4185,7 @@ func rewriteValueMIPS_OpMIPSMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4321,7 +4193,6 @@ func rewriteValueMIPS_OpMIPSMOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4446,9 +4317,8 @@ func rewriteValueMIPS_OpMIPSMOVHreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -4502,7 +4372,7 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] if x.Op != OpMIPSADDconst { break @@ -4510,7 +4380,6 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { off2 := x.AuxInt ptr := x.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4528,7 +4397,7 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4537,7 +4406,6 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -4555,7 +4423,7 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { @@ -4564,7 +4432,6 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPSMOVHstorezero) v.AuxInt = off v.Aux = sym @@ -4578,14 +4445,13 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVHstore) v.AuxInt = off v.Aux = sym @@ -4600,14 +4466,13 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVHstore) v.AuxInt = off v.Aux = sym @@ -4622,14 +4487,13 @@ func rewriteValueMIPS_OpMIPSMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVHstore) v.AuxInt = off v.Aux = sym @@ -4647,14 +4511,13 @@ func rewriteValueMIPS_OpMIPSMOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4671,7 +4534,7 @@ func rewriteValueMIPS_OpMIPSMOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4679,7 +4542,6 @@ func rewriteValueMIPS_OpMIPSMOVHstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4699,14 +4561,13 @@ func rewriteValueMIPS_OpMIPSMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4723,7 +4584,7 @@ func rewriteValueMIPS_OpMIPSMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4731,7 +4592,6 @@ func rewriteValueMIPS_OpMIPSMOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4804,7 +4664,7 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] if x.Op != OpMIPSADDconst { break @@ -4812,7 +4672,6 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { off2 := x.AuxInt ptr := x.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4830,7 +4689,7 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4839,7 +4698,6 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2)) { break } @@ -4857,7 +4715,7 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWconst { @@ -4866,7 +4724,6 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPSMOVWstorezero) v.AuxInt = off v.Aux = sym @@ -4880,14 +4737,13 @@ func rewriteValueMIPS_OpMIPSMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPSMOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPSMOVWstore) v.AuxInt = off v.Aux = sym @@ -4905,14 +4761,13 @@ func rewriteValueMIPS_OpMIPSMOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] x := v.Args[0] if x.Op != OpMIPSADDconst { break } off2 := x.AuxInt ptr := x.Args[0] - mem := v.Args[1] if !(is16Bit(off1+off2) || x.Uses == 1) { break } @@ -4929,7 +4784,7 @@ func rewriteValueMIPS_OpMIPSMOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWaddr { break @@ -4937,7 +4792,6 @@ func rewriteValueMIPS_OpMIPSMOVWstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2)) { break } @@ -4987,7 +4841,7 @@ func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break @@ -4995,7 +4849,6 @@ func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -5023,7 +4876,7 @@ func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { // cond: // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break @@ -5031,7 +4884,6 @@ func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpMIPSNEG) v.AddArg(x) return true @@ -5057,13 +4909,12 @@ func rewriteValueMIPS_OpMIPSMUL_0(v *Value) bool { // cond: isPowerOfTwo(int64(uint32(c))) // result: (SLLconst [log2(int64(uint32(c)))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isPowerOfTwo(int64(uint32(c)))) { break } @@ -5168,13 +5019,12 @@ func rewriteValueMIPS_OpMIPSNOR_0(v *Value) bool { // cond: // result: (NORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSNORconst) v.AuxInt = c v.AddArg(x) @@ -5221,13 +5071,12 @@ func rewriteValueMIPS_OpMIPSOR_0(v *Value) bool { // cond: // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSORconst) v.AuxInt = c v.AddArg(x) @@ -5237,9 +5086,8 @@ func rewriteValueMIPS_OpMIPSOR_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -5355,13 +5203,12 @@ func rewriteValueMIPS_OpMIPSSGT_0(v *Value) bool { // cond: // result: (SGTconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSSGTconst) v.AuxInt = c v.AddArg(x) @@ -5391,13 +5238,12 @@ func rewriteValueMIPS_OpMIPSSGTU_0(v *Value) bool { // cond: // result: (SGTUconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSSGTUconst) v.AuxInt = c v.AddArg(x) @@ -5979,9 +5825,8 @@ func rewriteValueMIPS_OpMIPSSUB_0(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpMIPSMOVWconst) @@ -5992,7 +5837,7 @@ func rewriteValueMIPS_OpMIPSSUB_0(v *Value) bool { // cond: // result: (NEG x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break @@ -6000,7 +5845,6 @@ func rewriteValueMIPS_OpMIPSSUB_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpMIPSNEG) v.AddArg(x) return true @@ -6090,13 +5934,12 @@ func rewriteValueMIPS_OpMIPSXOR_0(v *Value) bool { // cond: // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPSMOVWconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpMIPSXORconst) v.AuxInt = c v.AddArg(x) @@ -6106,9 +5949,8 @@ func rewriteValueMIPS_OpMIPSXOR_0(v *Value) bool { // cond: // result: (MOVWconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpMIPSMOVWconst) @@ -6183,9 +6025,8 @@ func rewriteValueMIPS_OpMod16_0(v *Value) bool { // cond: // result: (Select0 (DIV (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -6205,9 +6046,8 @@ func rewriteValueMIPS_OpMod16u_0(v *Value) bool { // cond: // result: (Select0 (DIVU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -6227,9 +6067,8 @@ func rewriteValueMIPS_OpMod32_0(v *Value) bool { // cond: // result: (Select0 (DIV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v0.AddArg(x) @@ -6245,9 +6084,8 @@ func rewriteValueMIPS_OpMod32u_0(v *Value) bool { // cond: // result: (Select0 (DIVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v0.AddArg(x) @@ -6263,9 +6101,8 @@ func rewriteValueMIPS_OpMod8_0(v *Value) bool { // cond: // result: (Select0 (DIV (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIV, types.NewTuple(typ.Int32, typ.Int32)) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -6285,9 +6122,8 @@ func rewriteValueMIPS_OpMod8u_0(v *Value) bool { // cond: // result: (Select0 (DIVU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPSDIVU, types.NewTuple(typ.UInt32, typ.UInt32)) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -6310,7 +6146,6 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -6324,10 +6159,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpMIPSMOVBUload, typ.UInt8) @@ -6345,10 +6179,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6368,10 +6201,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = 1 v.AddArg(dst) @@ -6398,10 +6230,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6422,10 +6253,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6454,10 +6284,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = 3 v.AddArg(dst) @@ -6501,10 +6330,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSMOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -6540,10 +6368,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6573,10 +6400,9 @@ func rewriteValueMIPS_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6630,10 +6456,9 @@ func rewriteValueMIPS_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6672,10 +6497,9 @@ func rewriteValueMIPS_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6714,10 +6538,9 @@ func rewriteValueMIPS_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6763,10 +6586,9 @@ func rewriteValueMIPS_OpMove_10(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 || t.(*types.Type).Alignment()%4 != 0) { break } @@ -6788,9 +6610,8 @@ func rewriteValueMIPS_OpMul16_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMUL) v.AddArg(x) v.AddArg(y) @@ -6802,9 +6623,8 @@ func rewriteValueMIPS_OpMul32_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMUL) v.AddArg(x) v.AddArg(y) @@ -6816,9 +6636,8 @@ func rewriteValueMIPS_OpMul32F_0(v *Value) bool { // cond: // result: (MULF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMULF) v.AddArg(x) v.AddArg(y) @@ -6830,9 +6649,8 @@ func rewriteValueMIPS_OpMul32uhilo_0(v *Value) bool { // cond: // result: (MULTU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMULTU) v.AddArg(x) v.AddArg(y) @@ -6844,9 +6662,8 @@ func rewriteValueMIPS_OpMul64F_0(v *Value) bool { // cond: // result: (MULD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMULD) v.AddArg(x) v.AddArg(y) @@ -6858,9 +6675,8 @@ func rewriteValueMIPS_OpMul8_0(v *Value) bool { // cond: // result: (MUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSMUL) v.AddArg(x) v.AddArg(y) @@ -6929,9 +6745,8 @@ func rewriteValueMIPS_OpNeq16_0(v *Value) bool { // cond: // result: (SGTU (XOR (ZeroExt16to32 x) (ZeroExt16to32 y)) (MOVWconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -6954,9 +6769,8 @@ func rewriteValueMIPS_OpNeq32_0(v *Value) bool { // cond: // result: (SGTU (XOR x y) (MOVWconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) v0.AddArg(x) @@ -6974,9 +6788,8 @@ func rewriteValueMIPS_OpNeq32F_0(v *Value) bool { // cond: // result: (FPFlagFalse (CMPEQF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagFalse) v0 := b.NewValue0(v.Pos, OpMIPSCMPEQF, types.TypeFlags) v0.AddArg(x) @@ -6991,9 +6804,8 @@ func rewriteValueMIPS_OpNeq64F_0(v *Value) bool { // cond: // result: (FPFlagFalse (CMPEQD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSFPFlagFalse) v0 := b.NewValue0(v.Pos, OpMIPSCMPEQD, types.TypeFlags) v0.AddArg(x) @@ -7009,9 +6821,8 @@ func rewriteValueMIPS_OpNeq8_0(v *Value) bool { // cond: // result: (SGTU (XOR (ZeroExt8to32 x) (ZeroExt8to32 y)) (MOVWconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -7032,9 +6843,8 @@ func rewriteValueMIPS_OpNeqB_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXOR) v.AddArg(x) v.AddArg(y) @@ -7048,9 +6858,8 @@ func rewriteValueMIPS_OpNeqPtr_0(v *Value) bool { // cond: // result: (SGTU (XOR x y) (MOVWconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSGTU) v0 := b.NewValue0(v.Pos, OpMIPSXOR, typ.UInt32) v0.AddArg(x) @@ -7067,9 +6876,8 @@ func rewriteValueMIPS_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSLoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -7120,9 +6928,8 @@ func rewriteValueMIPS_OpOr16_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSOR) v.AddArg(x) v.AddArg(y) @@ -7134,9 +6941,8 @@ func rewriteValueMIPS_OpOr32_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSOR) v.AddArg(x) v.AddArg(y) @@ -7148,9 +6954,8 @@ func rewriteValueMIPS_OpOr8_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSOR) v.AddArg(x) v.AddArg(y) @@ -7162,9 +6967,8 @@ func rewriteValueMIPS_OpOrB_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSOR) v.AddArg(x) v.AddArg(y) @@ -7203,9 +7007,8 @@ func rewriteValueMIPS_OpRsh16Ux16_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt16to32 x) (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -7235,9 +7038,8 @@ func rewriteValueMIPS_OpRsh16Ux32_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt16to32 x) y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -7307,9 +7109,8 @@ func rewriteValueMIPS_OpRsh16Ux8_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt16to32 x) (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -7338,9 +7139,8 @@ func rewriteValueMIPS_OpRsh16x16_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -7369,9 +7169,8 @@ func rewriteValueMIPS_OpRsh16x32_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -7445,9 +7244,8 @@ func rewriteValueMIPS_OpRsh16x8_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -7477,9 +7275,8 @@ func rewriteValueMIPS_OpRsh32Ux16_0(v *Value) bool { // result: (CMOVZ (SRL x (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v0.AddArg(x) @@ -7507,9 +7304,8 @@ func rewriteValueMIPS_OpRsh32Ux32_0(v *Value) bool { // result: (CMOVZ (SRL x y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v0.AddArg(x) @@ -7572,9 +7368,8 @@ func rewriteValueMIPS_OpRsh32Ux8_0(v *Value) bool { // result: (CMOVZ (SRL x (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v0.AddArg(x) @@ -7601,9 +7396,8 @@ func rewriteValueMIPS_OpRsh32x16_0(v *Value) bool { // cond: // result: (SRA x ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPSCMOVZ, typ.UInt32) @@ -7630,9 +7424,8 @@ func rewriteValueMIPS_OpRsh32x32_0(v *Value) bool { // cond: // result: (SRA x ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPSCMOVZ, typ.UInt32) @@ -7696,9 +7489,8 @@ func rewriteValueMIPS_OpRsh32x8_0(v *Value) bool { // cond: // result: (SRA x ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPSCMOVZ, typ.UInt32) @@ -7726,9 +7518,8 @@ func rewriteValueMIPS_OpRsh8Ux16_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt8to32 x) (ZeroExt16to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt16to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -7758,9 +7549,8 @@ func rewriteValueMIPS_OpRsh8Ux32_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt8to32 x) y) (MOVWconst [0]) (SGTUconst [32] y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -7830,9 +7620,8 @@ func rewriteValueMIPS_OpRsh8Ux8_0(v *Value) bool { // result: (CMOVZ (SRL (ZeroExt8to32 x) (ZeroExt8to32 y) ) (MOVWconst [0]) (SGTUconst [32] (ZeroExt8to32 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSSRL, t) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -7861,9 +7650,8 @@ func rewriteValueMIPS_OpRsh8x16_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt16to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt16to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -7892,9 +7680,8 @@ func rewriteValueMIPS_OpRsh8x32_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ y (MOVWconst [-1]) (SGTUconst [32] y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -7968,9 +7755,8 @@ func rewriteValueMIPS_OpRsh8x8_0(v *Value) bool { // cond: // result: (SRA (SignExt16to32 x) ( CMOVZ (ZeroExt8to32 y) (MOVWconst [-1]) (SGTUconst [32] (ZeroExt8to32 y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSRA) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -8004,9 +7790,8 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpMIPSADD) v.Type = t.FieldType(0) v.AddArg(x) @@ -8022,9 +7807,8 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpMIPSSUB) v.Type = t.FieldType(0) v.AddArg(x) @@ -8119,7 +7903,7 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { if v_0.Op != OpMIPSMULTU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPSMOVWconst { break @@ -8127,7 +7911,6 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { if v_0_0.AuxInt != -1 { break } - x := v_0.Args[1] v.reset(OpMIPSCMOVZ) v0 := b.NewValue0(v.Pos, OpMIPSADDconst, x.Type) v0.AuxInt = -1 @@ -8175,13 +7958,12 @@ func rewriteValueMIPS_OpSelect0_0(v *Value) bool { if v_0.Op != OpMIPSMULTU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPSMOVWconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isPowerOfTwo(int64(uint32(c)))) { break } @@ -8322,9 +8104,8 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpMIPSSGTU) v.Type = typ.Bool v.AddArg(x) @@ -8343,9 +8124,8 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpMIPSSGTU) v.Type = typ.Bool v0 := b.NewValue0(v.Pos, OpMIPSSUB, t.FieldType(0)) @@ -8403,7 +8183,7 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPSMULTU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPSMOVWconst { break @@ -8411,7 +8191,6 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -8447,7 +8226,7 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPSMULTU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPSMOVWconst { break @@ -8455,7 +8234,6 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { if v_0_0.AuxInt != -1 { break } - x := v_0.Args[1] v.reset(OpMIPSNEG) v.Type = x.Type v.AddArg(x) @@ -8491,13 +8269,12 @@ func rewriteValueMIPS_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPSMULTU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPSMOVWconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isPowerOfTwo(int64(uint32(c)))) { break } @@ -8719,10 +8496,9 @@ func rewriteValueMIPS_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -8737,10 +8513,9 @@ func rewriteValueMIPS_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -8755,10 +8530,9 @@ func rewriteValueMIPS_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { break } @@ -8773,10 +8547,9 @@ func rewriteValueMIPS_OpStore_0(v *Value) bool { // result: (MOVFstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -8791,10 +8564,9 @@ func rewriteValueMIPS_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -8811,9 +8583,8 @@ func rewriteValueMIPS_OpSub16_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUB) v.AddArg(x) v.AddArg(y) @@ -8825,9 +8596,8 @@ func rewriteValueMIPS_OpSub32_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUB) v.AddArg(x) v.AddArg(y) @@ -8839,9 +8609,8 @@ func rewriteValueMIPS_OpSub32F_0(v *Value) bool { // cond: // result: (SUBF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUBF) v.AddArg(x) v.AddArg(y) @@ -8855,10 +8624,9 @@ func rewriteValueMIPS_OpSub32withcarry_0(v *Value) bool { // result: (SUB (SUB x y) c) for { t := v.Type - _ = v.Args[2] + c := v.Args[2] x := v.Args[0] y := v.Args[1] - c := v.Args[2] v.reset(OpMIPSSUB) v0 := b.NewValue0(v.Pos, OpMIPSSUB, t) v0.AddArg(x) @@ -8873,9 +8641,8 @@ func rewriteValueMIPS_OpSub64F_0(v *Value) bool { // cond: // result: (SUBD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUBD) v.AddArg(x) v.AddArg(y) @@ -8887,9 +8654,8 @@ func rewriteValueMIPS_OpSub8_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUB) v.AddArg(x) v.AddArg(y) @@ -8901,9 +8667,8 @@ func rewriteValueMIPS_OpSubPtr_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSSUB) v.AddArg(x) v.AddArg(y) @@ -8952,10 +8717,9 @@ func rewriteValueMIPS_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpMIPSLoweredWB) v.Aux = fn v.AddArg(destptr) @@ -8969,9 +8733,8 @@ func rewriteValueMIPS_OpXor16_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXOR) v.AddArg(x) v.AddArg(y) @@ -8983,9 +8746,8 @@ func rewriteValueMIPS_OpXor32_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXOR) v.AddArg(x) v.AddArg(y) @@ -8997,9 +8759,8 @@ func rewriteValueMIPS_OpXor8_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPSXOR) v.AddArg(x) v.AddArg(y) @@ -9016,7 +8777,6 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -9030,9 +8790,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSMOVBstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpMIPSMOVWconst, typ.UInt32) @@ -9049,9 +8808,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -9070,9 +8828,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSMOVBstore) v.AuxInt = 1 v.AddArg(ptr) @@ -9097,9 +8854,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9119,9 +8875,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -9148,9 +8903,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSMOVBstore) v.AuxInt = 3 v.AddArg(ptr) @@ -9188,9 +8942,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPSMOVBstore) v.AuxInt = 2 v.AddArg(ptr) @@ -9222,9 +8975,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -9259,9 +9011,8 @@ func rewriteValueMIPS_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9295,9 +9046,8 @@ func rewriteValueMIPS_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9332,9 +9082,8 @@ func rewriteValueMIPS_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9374,9 +9123,8 @@ func rewriteValueMIPS_OpZero_10(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s > 16 || t.(*types.Type).Alignment()%4 != 0) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index c56f82f696..4d1d817033 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -619,9 +619,8 @@ func rewriteValueMIPS64_OpAdd16_0(v *Value) bool { // cond: // result: (ADDV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v.AddArg(x) v.AddArg(y) @@ -633,9 +632,8 @@ func rewriteValueMIPS64_OpAdd32_0(v *Value) bool { // cond: // result: (ADDV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v.AddArg(x) v.AddArg(y) @@ -647,9 +645,8 @@ func rewriteValueMIPS64_OpAdd32F_0(v *Value) bool { // cond: // result: (ADDF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDF) v.AddArg(x) v.AddArg(y) @@ -661,9 +658,8 @@ func rewriteValueMIPS64_OpAdd64_0(v *Value) bool { // cond: // result: (ADDV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v.AddArg(x) v.AddArg(y) @@ -675,9 +671,8 @@ func rewriteValueMIPS64_OpAdd64F_0(v *Value) bool { // cond: // result: (ADDD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDD) v.AddArg(x) v.AddArg(y) @@ -689,9 +684,8 @@ func rewriteValueMIPS64_OpAdd8_0(v *Value) bool { // cond: // result: (ADDV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v.AddArg(x) v.AddArg(y) @@ -703,9 +697,8 @@ func rewriteValueMIPS64_OpAddPtr_0(v *Value) bool { // cond: // result: (ADDV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v.AddArg(x) v.AddArg(y) @@ -730,9 +723,8 @@ func rewriteValueMIPS64_OpAnd16_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v.AddArg(x) v.AddArg(y) @@ -744,9 +736,8 @@ func rewriteValueMIPS64_OpAnd32_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v.AddArg(x) v.AddArg(y) @@ -758,9 +749,8 @@ func rewriteValueMIPS64_OpAnd64_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v.AddArg(x) v.AddArg(y) @@ -772,9 +762,8 @@ func rewriteValueMIPS64_OpAnd8_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v.AddArg(x) v.AddArg(y) @@ -786,9 +775,8 @@ func rewriteValueMIPS64_OpAndB_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v.AddArg(x) v.AddArg(y) @@ -800,10 +788,9 @@ func rewriteValueMIPS64_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicAdd32) v.AddArg(ptr) v.AddArg(val) @@ -816,10 +803,9 @@ func rewriteValueMIPS64_OpAtomicAdd64_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicAdd64) v.AddArg(ptr) v.AddArg(val) @@ -832,11 +818,10 @@ func rewriteValueMIPS64_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas32 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpMIPS64LoweredAtomicCas32) v.AddArg(ptr) v.AddArg(old) @@ -850,11 +835,10 @@ func rewriteValueMIPS64_OpAtomicCompareAndSwap64_0(v *Value) bool { // cond: // result: (LoweredAtomicCas64 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpMIPS64LoweredAtomicCas64) v.AddArg(ptr) v.AddArg(old) @@ -868,10 +852,9 @@ func rewriteValueMIPS64_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicExchange32) v.AddArg(ptr) v.AddArg(val) @@ -884,10 +867,9 @@ func rewriteValueMIPS64_OpAtomicExchange64_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicExchange64) v.AddArg(ptr) v.AddArg(val) @@ -900,9 +882,8 @@ func rewriteValueMIPS64_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad32 ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64LoweredAtomicLoad32) v.AddArg(ptr) v.AddArg(mem) @@ -914,9 +895,8 @@ func rewriteValueMIPS64_OpAtomicLoad64_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad64 ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64LoweredAtomicLoad64) v.AddArg(ptr) v.AddArg(mem) @@ -928,9 +908,8 @@ func rewriteValueMIPS64_OpAtomicLoadPtr_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad64 ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64LoweredAtomicLoad64) v.AddArg(ptr) v.AddArg(mem) @@ -942,10 +921,9 @@ func rewriteValueMIPS64_OpAtomicStore32_0(v *Value) bool { // cond: // result: (LoweredAtomicStore32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicStore32) v.AddArg(ptr) v.AddArg(val) @@ -958,10 +936,9 @@ func rewriteValueMIPS64_OpAtomicStore64_0(v *Value) bool { // cond: // result: (LoweredAtomicStore64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicStore64) v.AddArg(ptr) v.AddArg(val) @@ -974,10 +951,9 @@ func rewriteValueMIPS64_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: // result: (LoweredAtomicStore64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicStore64) v.AddArg(ptr) v.AddArg(val) @@ -992,9 +968,8 @@ func rewriteValueMIPS64_OpAvg64u_0(v *Value) bool { // result: (ADDV (SRLVconst (SUBV x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64ADDV) v0 := b.NewValue0(v.Pos, OpMIPS64SRLVconst, t) v0.AuxInt = 1 @@ -1013,10 +988,9 @@ func rewriteValueMIPS64_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64CALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -1293,9 +1267,8 @@ func rewriteValueMIPS64_OpDiv16_0(v *Value) bool { // cond: // result: (Select1 (DIVV (SignExt16to64 x) (SignExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) @@ -1315,9 +1288,8 @@ func rewriteValueMIPS64_OpDiv16u_0(v *Value) bool { // cond: // result: (Select1 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -1337,9 +1309,8 @@ func rewriteValueMIPS64_OpDiv32_0(v *Value) bool { // cond: // result: (Select1 (DIVV (SignExt32to64 x) (SignExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) @@ -1357,9 +1328,8 @@ func rewriteValueMIPS64_OpDiv32F_0(v *Value) bool { // cond: // result: (DIVF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64DIVF) v.AddArg(x) v.AddArg(y) @@ -1373,9 +1343,8 @@ func rewriteValueMIPS64_OpDiv32u_0(v *Value) bool { // cond: // result: (Select1 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -1395,9 +1364,8 @@ func rewriteValueMIPS64_OpDiv64_0(v *Value) bool { // cond: // result: (Select1 (DIVV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v0.AddArg(x) @@ -1411,9 +1379,8 @@ func rewriteValueMIPS64_OpDiv64F_0(v *Value) bool { // cond: // result: (DIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64DIVD) v.AddArg(x) v.AddArg(y) @@ -1427,9 +1394,8 @@ func rewriteValueMIPS64_OpDiv64u_0(v *Value) bool { // cond: // result: (Select1 (DIVVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -1445,9 +1411,8 @@ func rewriteValueMIPS64_OpDiv8_0(v *Value) bool { // cond: // result: (Select1 (DIVV (SignExt8to64 x) (SignExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) @@ -1467,9 +1432,8 @@ func rewriteValueMIPS64_OpDiv8u_0(v *Value) bool { // cond: // result: (Select1 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -1489,9 +1453,8 @@ func rewriteValueMIPS64_OpEq16_0(v *Value) bool { // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt16to64 x) (ZeroExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1514,9 +1477,8 @@ func rewriteValueMIPS64_OpEq32_0(v *Value) bool { // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt32to64 x) (ZeroExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1538,9 +1500,8 @@ func rewriteValueMIPS64_OpEq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPEQF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPEQF, types.TypeFlags) v0.AddArg(x) @@ -1556,9 +1517,8 @@ func rewriteValueMIPS64_OpEq64_0(v *Value) bool { // cond: // result: (SGTU (MOVVconst [1]) (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1576,9 +1536,8 @@ func rewriteValueMIPS64_OpEq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPEQD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPEQD, types.TypeFlags) v0.AddArg(x) @@ -1594,9 +1553,8 @@ func rewriteValueMIPS64_OpEq8_0(v *Value) bool { // cond: // result: (SGTU (MOVVconst [1]) (XOR (ZeroExt8to64 x) (ZeroExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1619,9 +1577,8 @@ func rewriteValueMIPS64_OpEqB_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1640,9 +1597,8 @@ func rewriteValueMIPS64_OpEqPtr_0(v *Value) bool { // cond: // result: (SGTU (MOVVconst [1]) (XOR x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1661,9 +1617,8 @@ func rewriteValueMIPS64_OpGeq16_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt16to64 y) (SignExt16to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1686,9 +1641,8 @@ func rewriteValueMIPS64_OpGeq16U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt16to64 y) (ZeroExt16to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1711,9 +1665,8 @@ func rewriteValueMIPS64_OpGeq32_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt32to64 y) (SignExt32to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1735,9 +1688,8 @@ func rewriteValueMIPS64_OpGeq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGEF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGEF, types.TypeFlags) v0.AddArg(x) @@ -1753,9 +1705,8 @@ func rewriteValueMIPS64_OpGeq32U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt32to64 y) (ZeroExt32to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1778,9 +1729,8 @@ func rewriteValueMIPS64_OpGeq64_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1798,9 +1748,8 @@ func rewriteValueMIPS64_OpGeq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGED x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGED, types.TypeFlags) v0.AddArg(x) @@ -1816,9 +1765,8 @@ func rewriteValueMIPS64_OpGeq64U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1837,9 +1785,8 @@ func rewriteValueMIPS64_OpGeq8_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt8to64 y) (SignExt8to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1862,9 +1809,8 @@ func rewriteValueMIPS64_OpGeq8U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt8to64 y) (ZeroExt8to64 x))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -1914,9 +1860,8 @@ func rewriteValueMIPS64_OpGreater16_0(v *Value) bool { // cond: // result: (SGT (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -1934,9 +1879,8 @@ func rewriteValueMIPS64_OpGreater16U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1954,9 +1898,8 @@ func rewriteValueMIPS64_OpGreater32_0(v *Value) bool { // cond: // result: (SGT (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -1973,9 +1916,8 @@ func rewriteValueMIPS64_OpGreater32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGTF, types.TypeFlags) v0.AddArg(x) @@ -1991,9 +1933,8 @@ func rewriteValueMIPS64_OpGreater32U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -2009,9 +1950,8 @@ func rewriteValueMIPS64_OpGreater64_0(v *Value) bool { // cond: // result: (SGT x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v.AddArg(x) v.AddArg(y) @@ -2024,9 +1964,8 @@ func rewriteValueMIPS64_OpGreater64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGTD, types.TypeFlags) v0.AddArg(x) @@ -2040,9 +1979,8 @@ func rewriteValueMIPS64_OpGreater64U_0(v *Value) bool { // cond: // result: (SGTU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v.AddArg(x) v.AddArg(y) @@ -2056,9 +1994,8 @@ func rewriteValueMIPS64_OpGreater8_0(v *Value) bool { // cond: // result: (SGT (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -2076,9 +2013,8 @@ func rewriteValueMIPS64_OpGreater8U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -2096,9 +2032,8 @@ func rewriteValueMIPS64_OpHmul32_0(v *Value) bool { // cond: // result: (SRAVconst (Select1 (MULV (SignExt32to64 x) (SignExt32to64 y))) [32]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAVconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpSelect1, typ.Int64) @@ -2121,9 +2056,8 @@ func rewriteValueMIPS64_OpHmul32u_0(v *Value) bool { // cond: // result: (SRLVconst (Select1 (MULVU (ZeroExt32to64 x) (ZeroExt32to64 y))) [32]) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRLVconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpSelect1, typ.UInt64) @@ -2146,9 +2080,8 @@ func rewriteValueMIPS64_OpHmul64_0(v *Value) bool { // cond: // result: (Select0 (MULV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64MULV, types.NewTuple(typ.Int64, typ.Int64)) v0.AddArg(x) @@ -2164,9 +2097,8 @@ func rewriteValueMIPS64_OpHmul64u_0(v *Value) bool { // cond: // result: (Select0 (MULVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64MULVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -2181,9 +2113,8 @@ func rewriteValueMIPS64_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpMIPS64CALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -2196,9 +2127,8 @@ func rewriteValueMIPS64_OpIsInBounds_0(v *Value) bool { // cond: // result: (SGTU len idx) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpMIPS64SGTU) v.AddArg(len) v.AddArg(idx) @@ -2228,9 +2158,8 @@ func rewriteValueMIPS64_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2249,9 +2178,8 @@ func rewriteValueMIPS64_OpLeq16_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt16to64 x) (SignExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2274,9 +2202,8 @@ func rewriteValueMIPS64_OpLeq16U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt16to64 x) (ZeroExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2299,9 +2226,8 @@ func rewriteValueMIPS64_OpLeq32_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt32to64 x) (SignExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2323,9 +2249,8 @@ func rewriteValueMIPS64_OpLeq32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGEF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGEF, types.TypeFlags) v0.AddArg(y) @@ -2341,9 +2266,8 @@ func rewriteValueMIPS64_OpLeq32U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt32to64 x) (ZeroExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2366,9 +2290,8 @@ func rewriteValueMIPS64_OpLeq64_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2386,9 +2309,8 @@ func rewriteValueMIPS64_OpLeq64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGED y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGED, types.TypeFlags) v0.AddArg(y) @@ -2404,9 +2326,8 @@ func rewriteValueMIPS64_OpLeq64U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2425,9 +2346,8 @@ func rewriteValueMIPS64_OpLeq8_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGT (SignExt8to64 x) (SignExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2450,9 +2370,8 @@ func rewriteValueMIPS64_OpLeq8U_0(v *Value) bool { // cond: // result: (XOR (MOVVconst [1]) (SGTU (ZeroExt8to64 x) (ZeroExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) v0.AuxInt = 1 @@ -2475,9 +2394,8 @@ func rewriteValueMIPS64_OpLess16_0(v *Value) bool { // cond: // result: (SGT (SignExt16to64 y) (SignExt16to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(y) @@ -2495,9 +2413,8 @@ func rewriteValueMIPS64_OpLess16U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt16to64 y) (ZeroExt16to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(y) @@ -2515,9 +2432,8 @@ func rewriteValueMIPS64_OpLess32_0(v *Value) bool { // cond: // result: (SGT (SignExt32to64 y) (SignExt32to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(y) @@ -2534,9 +2450,8 @@ func rewriteValueMIPS64_OpLess32F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTF y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGTF, types.TypeFlags) v0.AddArg(y) @@ -2552,9 +2467,8 @@ func rewriteValueMIPS64_OpLess32U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt32to64 y) (ZeroExt32to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(y) @@ -2570,9 +2484,8 @@ func rewriteValueMIPS64_OpLess64_0(v *Value) bool { // cond: // result: (SGT y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v.AddArg(y) v.AddArg(x) @@ -2585,9 +2498,8 @@ func rewriteValueMIPS64_OpLess64F_0(v *Value) bool { // cond: // result: (FPFlagTrue (CMPGTD y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagTrue) v0 := b.NewValue0(v.Pos, OpMIPS64CMPGTD, types.TypeFlags) v0.AddArg(y) @@ -2601,9 +2513,8 @@ func rewriteValueMIPS64_OpLess64U_0(v *Value) bool { // cond: // result: (SGTU y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v.AddArg(y) v.AddArg(x) @@ -2617,9 +2528,8 @@ func rewriteValueMIPS64_OpLess8_0(v *Value) bool { // cond: // result: (SGT (SignExt8to64 y) (SignExt8to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGT) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(y) @@ -2637,9 +2547,8 @@ func rewriteValueMIPS64_OpLess8U_0(v *Value) bool { // cond: // result: (SGTU (ZeroExt8to64 y) (ZeroExt8to64 x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(y) @@ -2656,9 +2565,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean()) { break } @@ -2672,9 +2580,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -2688,9 +2595,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVBUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && !isSigned(t)) { break } @@ -2704,9 +2610,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -2720,9 +2625,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVHUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -2736,9 +2640,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && isSigned(t)) { break } @@ -2752,9 +2655,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVWUload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && !isSigned(t)) { break } @@ -2768,9 +2670,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVVload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) || isPtr(t)) { break } @@ -2784,9 +2685,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVFload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -2800,9 +2700,8 @@ func rewriteValueMIPS64_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -2835,9 +2734,8 @@ func rewriteValueMIPS64_OpLsh16x16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -2866,9 +2764,8 @@ func rewriteValueMIPS64_OpLsh16x32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -2897,9 +2794,8 @@ func rewriteValueMIPS64_OpLsh16x64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -2924,9 +2820,8 @@ func rewriteValueMIPS64_OpLsh16x8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -2955,9 +2850,8 @@ func rewriteValueMIPS64_OpLsh32x16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -2986,9 +2880,8 @@ func rewriteValueMIPS64_OpLsh32x32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3017,9 +2910,8 @@ func rewriteValueMIPS64_OpLsh32x64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3044,9 +2936,8 @@ func rewriteValueMIPS64_OpLsh32x8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3075,9 +2966,8 @@ func rewriteValueMIPS64_OpLsh64x16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3106,9 +2996,8 @@ func rewriteValueMIPS64_OpLsh64x32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3137,9 +3026,8 @@ func rewriteValueMIPS64_OpLsh64x64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3164,9 +3052,8 @@ func rewriteValueMIPS64_OpLsh64x8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3195,9 +3082,8 @@ func rewriteValueMIPS64_OpLsh8x16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SLLV x (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3226,9 +3112,8 @@ func rewriteValueMIPS64_OpLsh8x32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SLLV x (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3257,9 +3142,8 @@ func rewriteValueMIPS64_OpLsh8x64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SLLV x y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3284,9 +3168,8 @@ func rewriteValueMIPS64_OpLsh8x8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SLLV x (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -3331,13 +3214,12 @@ func rewriteValueMIPS64_OpMIPS64ADDV_0(v *Value) bool { // cond: is32Bit(c) // result: (ADDVconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -3366,13 +3248,12 @@ func rewriteValueMIPS64_OpMIPS64ADDV_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64NEGV { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -3490,13 +3371,12 @@ func rewriteValueMIPS64_OpMIPS64AND_0(v *Value) bool { // cond: is32Bit(c) // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -3509,9 +3389,8 @@ func rewriteValueMIPS64_OpMIPS64AND_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -3583,14 +3462,13 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicAdd32_0(v *Value) bool { // cond: is32Bit(c) // result: (LoweredAtomicAddconst32 [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(c)) { break } @@ -3607,14 +3485,13 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicAdd64_0(v *Value) bool { // cond: is32Bit(c) // result: (LoweredAtomicAddconst64 [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is32Bit(c)) { break } @@ -3631,7 +3508,7 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore32_0(v *Value) bool { // cond: // result: (LoweredAtomicStorezero32 ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -3640,7 +3517,6 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore32_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicStorezero32) v.AddArg(ptr) v.AddArg(mem) @@ -3653,7 +3529,7 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore64_0(v *Value) bool { // cond: // result: (LoweredAtomicStorezero64 ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -3662,7 +3538,6 @@ func rewriteValueMIPS64_OpMIPS64LoweredAtomicStore64_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64LoweredAtomicStorezero64) v.AddArg(ptr) v.AddArg(mem) @@ -3677,14 +3552,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -3701,7 +3575,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -3709,7 +3583,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -3770,14 +3643,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -3794,7 +3666,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -3802,7 +3674,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -3863,7 +3734,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -3871,7 +3742,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -3889,7 +3759,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -3898,7 +3768,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -3916,7 +3785,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -3925,7 +3794,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64MOVBstorezero) v.AuxInt = off v.Aux = sym @@ -3939,14 +3807,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -3961,14 +3828,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVBUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -3983,14 +3849,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -4005,14 +3870,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -4027,14 +3891,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -4049,14 +3912,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = off v.Aux = sym @@ -4074,14 +3936,13 @@ func rewriteValueMIPS64_OpMIPS64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4098,7 +3959,7 @@ func rewriteValueMIPS64_OpMIPS64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4106,7 +3967,6 @@ func rewriteValueMIPS64_OpMIPS64MOVBstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4126,14 +3986,13 @@ func rewriteValueMIPS64_OpMIPS64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4150,7 +4009,7 @@ func rewriteValueMIPS64_OpMIPS64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4158,7 +4017,6 @@ func rewriteValueMIPS64_OpMIPS64MOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4178,7 +4036,7 @@ func rewriteValueMIPS64_OpMIPS64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -4186,7 +4044,6 @@ func rewriteValueMIPS64_OpMIPS64MOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4204,7 +4061,7 @@ func rewriteValueMIPS64_OpMIPS64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4213,7 +4070,6 @@ func rewriteValueMIPS64_OpMIPS64MOVDstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4234,14 +4090,13 @@ func rewriteValueMIPS64_OpMIPS64MOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4258,7 +4113,7 @@ func rewriteValueMIPS64_OpMIPS64MOVFload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4266,7 +4121,6 @@ func rewriteValueMIPS64_OpMIPS64MOVFload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4286,7 +4140,7 @@ func rewriteValueMIPS64_OpMIPS64MOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -4294,7 +4148,6 @@ func rewriteValueMIPS64_OpMIPS64MOVFstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4312,7 +4165,7 @@ func rewriteValueMIPS64_OpMIPS64MOVFstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4321,7 +4174,6 @@ func rewriteValueMIPS64_OpMIPS64MOVFstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4342,14 +4194,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4366,7 +4217,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4374,7 +4225,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4460,14 +4310,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4484,7 +4333,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4492,7 +4341,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4603,7 +4451,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -4611,7 +4459,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4629,7 +4476,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4638,7 +4485,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4656,7 +4502,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -4665,7 +4511,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64MOVHstorezero) v.AuxInt = off v.Aux = sym @@ -4679,14 +4524,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVHstore) v.AuxInt = off v.Aux = sym @@ -4701,14 +4545,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVHUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVHstore) v.AuxInt = off v.Aux = sym @@ -4723,14 +4566,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVHstore) v.AuxInt = off v.Aux = sym @@ -4745,14 +4587,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVHstore) v.AuxInt = off v.Aux = sym @@ -4770,14 +4611,13 @@ func rewriteValueMIPS64_OpMIPS64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4794,7 +4634,7 @@ func rewriteValueMIPS64_OpMIPS64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4802,7 +4642,6 @@ func rewriteValueMIPS64_OpMIPS64MOVHstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4822,14 +4661,13 @@ func rewriteValueMIPS64_OpMIPS64MOVVload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -4846,7 +4684,7 @@ func rewriteValueMIPS64_OpMIPS64MOVVload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4854,7 +4692,6 @@ func rewriteValueMIPS64_OpMIPS64MOVVload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4902,7 +4739,7 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -4910,7 +4747,6 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -4928,7 +4764,7 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -4937,7 +4773,6 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -4955,7 +4790,7 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -4964,7 +4799,6 @@ func rewriteValueMIPS64_OpMIPS64MOVVstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64MOVVstorezero) v.AuxInt = off v.Aux = sym @@ -4981,14 +4815,13 @@ func rewriteValueMIPS64_OpMIPS64MOVVstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -5005,7 +4838,7 @@ func rewriteValueMIPS64_OpMIPS64MOVVstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -5013,7 +4846,6 @@ func rewriteValueMIPS64_OpMIPS64MOVVstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -5033,14 +4865,13 @@ func rewriteValueMIPS64_OpMIPS64MOVWUload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -5057,7 +4888,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWUload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -5065,7 +4896,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWUload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -5176,14 +5006,13 @@ func rewriteValueMIPS64_OpMIPS64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -5200,7 +5029,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -5208,7 +5037,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -5372,7 +5200,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break @@ -5380,7 +5208,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1 + off2)) { break } @@ -5398,7 +5225,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -5407,7 +5234,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { sym2 := v_0.Aux ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -5425,7 +5251,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVVconst { @@ -5434,7 +5260,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpMIPS64MOVWstorezero) v.AuxInt = off v.Aux = sym @@ -5448,14 +5273,13 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVWstore) v.AuxInt = off v.Aux = sym @@ -5470,14 +5294,13 @@ func rewriteValueMIPS64_OpMIPS64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpMIPS64MOVWUreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpMIPS64MOVWstore) v.AuxInt = off v.Aux = sym @@ -5495,14 +5318,13 @@ func rewriteValueMIPS64_OpMIPS64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64ADDVconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1 + off2)) { break } @@ -5519,7 +5341,7 @@ func rewriteValueMIPS64_OpMIPS64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVaddr { break @@ -5527,7 +5349,6 @@ func rewriteValueMIPS64_OpMIPS64MOVWstorezero_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && is32Bit(off1+off2)) { break } @@ -5580,13 +5401,12 @@ func rewriteValueMIPS64_OpMIPS64NOR_0(v *Value) bool { // cond: is32Bit(c) // result: (NORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -5638,13 +5458,12 @@ func rewriteValueMIPS64_OpMIPS64OR_0(v *Value) bool { // cond: is32Bit(c) // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -5657,9 +5476,8 @@ func rewriteValueMIPS64_OpMIPS64OR_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -5734,13 +5552,12 @@ func rewriteValueMIPS64_OpMIPS64SGT_0(v *Value) bool { // cond: is32Bit(c) // result: (SGTconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -5756,13 +5573,12 @@ func rewriteValueMIPS64_OpMIPS64SGTU_0(v *Value) bool { // cond: is32Bit(c) // result: (SGTUconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -6279,9 +6095,8 @@ func rewriteValueMIPS64_OpMIPS64SUBV_0(v *Value) bool { // cond: // result: (MOVVconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpMIPS64MOVVconst) @@ -6292,7 +6107,7 @@ func rewriteValueMIPS64_OpMIPS64SUBV_0(v *Value) bool { // cond: // result: (NEGV x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break @@ -6300,7 +6115,6 @@ func rewriteValueMIPS64_OpMIPS64SUBV_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpMIPS64NEGV) v.AddArg(x) return true @@ -6399,13 +6213,12 @@ func rewriteValueMIPS64_OpMIPS64XOR_0(v *Value) bool { // cond: is32Bit(c) // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMIPS64MOVVconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -6418,9 +6231,8 @@ func rewriteValueMIPS64_OpMIPS64XOR_0(v *Value) bool { // cond: // result: (MOVVconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpMIPS64MOVVconst) @@ -6498,9 +6310,8 @@ func rewriteValueMIPS64_OpMod16_0(v *Value) bool { // cond: // result: (Select0 (DIVV (SignExt16to64 x) (SignExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) @@ -6520,9 +6331,8 @@ func rewriteValueMIPS64_OpMod16u_0(v *Value) bool { // cond: // result: (Select0 (DIVVU (ZeroExt16to64 x) (ZeroExt16to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -6542,9 +6352,8 @@ func rewriteValueMIPS64_OpMod32_0(v *Value) bool { // cond: // result: (Select0 (DIVV (SignExt32to64 x) (SignExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) @@ -6564,9 +6373,8 @@ func rewriteValueMIPS64_OpMod32u_0(v *Value) bool { // cond: // result: (Select0 (DIVVU (ZeroExt32to64 x) (ZeroExt32to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -6586,9 +6394,8 @@ func rewriteValueMIPS64_OpMod64_0(v *Value) bool { // cond: // result: (Select0 (DIVV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v0.AddArg(x) @@ -6604,9 +6411,8 @@ func rewriteValueMIPS64_OpMod64u_0(v *Value) bool { // cond: // result: (Select0 (DIVVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -6622,9 +6428,8 @@ func rewriteValueMIPS64_OpMod8_0(v *Value) bool { // cond: // result: (Select0 (DIVV (SignExt8to64 x) (SignExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVV, types.NewTuple(typ.Int64, typ.Int64)) v1 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) @@ -6644,9 +6449,8 @@ func rewriteValueMIPS64_OpMod8u_0(v *Value) bool { // cond: // result: (Select0 (DIVVU (ZeroExt8to64 x) (ZeroExt8to64 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect0) v0 := b.NewValue0(v.Pos, OpMIPS64DIVVU, types.NewTuple(typ.UInt64, typ.UInt64)) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -6669,7 +6473,6 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -6683,10 +6486,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpMIPS64MOVBload, typ.Int8) @@ -6704,10 +6506,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6727,10 +6528,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = 1 v.AddArg(dst) @@ -6757,10 +6557,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6781,10 +6580,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6813,10 +6611,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = 3 v.AddArg(dst) @@ -6861,10 +6658,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -6885,10 +6681,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -6918,10 +6713,9 @@ func rewriteValueMIPS64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -6974,10 +6768,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64MOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -7013,10 +6806,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -7055,10 +6847,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -7097,10 +6888,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -7130,10 +6920,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -7170,10 +6959,9 @@ func rewriteValueMIPS64_OpMove_10(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 24 || t.(*types.Type).Alignment()%8 != 0) { break } @@ -7197,9 +6985,8 @@ func rewriteValueMIPS64_OpMul16_0(v *Value) bool { // cond: // result: (Select1 (MULVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64MULVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -7215,9 +7002,8 @@ func rewriteValueMIPS64_OpMul32_0(v *Value) bool { // cond: // result: (Select1 (MULVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64MULVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -7231,9 +7017,8 @@ func rewriteValueMIPS64_OpMul32F_0(v *Value) bool { // cond: // result: (MULF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64MULF) v.AddArg(x) v.AddArg(y) @@ -7247,9 +7032,8 @@ func rewriteValueMIPS64_OpMul64_0(v *Value) bool { // cond: // result: (Select1 (MULVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64MULVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -7263,9 +7047,8 @@ func rewriteValueMIPS64_OpMul64F_0(v *Value) bool { // cond: // result: (MULD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64MULD) v.AddArg(x) v.AddArg(y) @@ -7279,9 +7062,8 @@ func rewriteValueMIPS64_OpMul8_0(v *Value) bool { // cond: // result: (Select1 (MULVU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpSelect1) v0 := b.NewValue0(v.Pos, OpMIPS64MULVU, types.NewTuple(typ.UInt64, typ.UInt64)) v0.AddArg(x) @@ -7363,9 +7145,8 @@ func rewriteValueMIPS64_OpNeq16_0(v *Value) bool { // cond: // result: (SGTU (XOR (ZeroExt16to32 x) (ZeroExt16to64 y)) (MOVVconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64XOR, typ.UInt64) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -7388,9 +7169,8 @@ func rewriteValueMIPS64_OpNeq32_0(v *Value) bool { // cond: // result: (SGTU (XOR (ZeroExt32to64 x) (ZeroExt32to64 y)) (MOVVconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64XOR, typ.UInt64) v1 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -7412,9 +7192,8 @@ func rewriteValueMIPS64_OpNeq32F_0(v *Value) bool { // cond: // result: (FPFlagFalse (CMPEQF x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagFalse) v0 := b.NewValue0(v.Pos, OpMIPS64CMPEQF, types.TypeFlags) v0.AddArg(x) @@ -7430,9 +7209,8 @@ func rewriteValueMIPS64_OpNeq64_0(v *Value) bool { // cond: // result: (SGTU (XOR x y) (MOVVconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64XOR, typ.UInt64) v0.AddArg(x) @@ -7450,9 +7228,8 @@ func rewriteValueMIPS64_OpNeq64F_0(v *Value) bool { // cond: // result: (FPFlagFalse (CMPEQD x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64FPFlagFalse) v0 := b.NewValue0(v.Pos, OpMIPS64CMPEQD, types.TypeFlags) v0.AddArg(x) @@ -7468,9 +7245,8 @@ func rewriteValueMIPS64_OpNeq8_0(v *Value) bool { // cond: // result: (SGTU (XOR (ZeroExt8to64 x) (ZeroExt8to64 y)) (MOVVconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64XOR, typ.UInt64) v1 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -7491,9 +7267,8 @@ func rewriteValueMIPS64_OpNeqB_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v.AddArg(x) v.AddArg(y) @@ -7507,9 +7282,8 @@ func rewriteValueMIPS64_OpNeqPtr_0(v *Value) bool { // cond: // result: (SGTU (XOR x y) (MOVVconst [0])) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SGTU) v0 := b.NewValue0(v.Pos, OpMIPS64XOR, typ.UInt64) v0.AddArg(x) @@ -7526,9 +7300,8 @@ func rewriteValueMIPS64_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64LoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -7579,9 +7352,8 @@ func rewriteValueMIPS64_OpOr16_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64OR) v.AddArg(x) v.AddArg(y) @@ -7593,9 +7365,8 @@ func rewriteValueMIPS64_OpOr32_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64OR) v.AddArg(x) v.AddArg(y) @@ -7607,9 +7378,8 @@ func rewriteValueMIPS64_OpOr64_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64OR) v.AddArg(x) v.AddArg(y) @@ -7621,9 +7391,8 @@ func rewriteValueMIPS64_OpOr8_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64OR) v.AddArg(x) v.AddArg(y) @@ -7635,9 +7404,8 @@ func rewriteValueMIPS64_OpOrB_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64OR) v.AddArg(x) v.AddArg(y) @@ -7676,9 +7444,8 @@ func rewriteValueMIPS64_OpRsh16Ux16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7709,9 +7476,8 @@ func rewriteValueMIPS64_OpRsh16Ux32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7742,9 +7508,8 @@ func rewriteValueMIPS64_OpRsh16Ux64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt16to64 x) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7771,9 +7536,8 @@ func rewriteValueMIPS64_OpRsh16Ux8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt16to64 x) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7804,9 +7568,8 @@ func rewriteValueMIPS64_OpRsh16x16_0(v *Value) bool { // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -7837,9 +7600,8 @@ func rewriteValueMIPS64_OpRsh16x32_0(v *Value) bool { // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -7870,9 +7632,8 @@ func rewriteValueMIPS64_OpRsh16x64_0(v *Value) bool { // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -7899,9 +7660,8 @@ func rewriteValueMIPS64_OpRsh16x8_0(v *Value) bool { // result: (SRAV (SignExt16to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -7932,9 +7692,8 @@ func rewriteValueMIPS64_OpRsh32Ux16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7965,9 +7724,8 @@ func rewriteValueMIPS64_OpRsh32Ux32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -7998,9 +7756,8 @@ func rewriteValueMIPS64_OpRsh32Ux64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt32to64 x) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8027,9 +7784,8 @@ func rewriteValueMIPS64_OpRsh32Ux8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt32to64 x) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8060,9 +7816,8 @@ func rewriteValueMIPS64_OpRsh32x16_0(v *Value) bool { // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -8093,9 +7848,8 @@ func rewriteValueMIPS64_OpRsh32x32_0(v *Value) bool { // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -8126,9 +7880,8 @@ func rewriteValueMIPS64_OpRsh32x64_0(v *Value) bool { // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -8155,9 +7908,8 @@ func rewriteValueMIPS64_OpRsh32x8_0(v *Value) bool { // result: (SRAV (SignExt32to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -8188,9 +7940,8 @@ func rewriteValueMIPS64_OpRsh64Ux16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV x (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8219,9 +7970,8 @@ func rewriteValueMIPS64_OpRsh64Ux32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV x (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8250,9 +8000,8 @@ func rewriteValueMIPS64_OpRsh64Ux64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV x y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8277,9 +8026,8 @@ func rewriteValueMIPS64_OpRsh64Ux8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV x (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8308,9 +8056,8 @@ func rewriteValueMIPS64_OpRsh64x16_0(v *Value) bool { // result: (SRAV x (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPS64OR, t) @@ -8339,9 +8086,8 @@ func rewriteValueMIPS64_OpRsh64x32_0(v *Value) bool { // result: (SRAV x (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPS64OR, t) @@ -8370,9 +8116,8 @@ func rewriteValueMIPS64_OpRsh64x64_0(v *Value) bool { // result: (SRAV x (OR (NEGV (SGTU y (MOVVconst [63]))) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPS64OR, t) @@ -8397,9 +8142,8 @@ func rewriteValueMIPS64_OpRsh64x8_0(v *Value) bool { // result: (SRAV x (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpMIPS64OR, t) @@ -8428,9 +8172,8 @@ func rewriteValueMIPS64_OpRsh8Ux16_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt16to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8461,9 +8204,8 @@ func rewriteValueMIPS64_OpRsh8Ux32_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt32to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8494,9 +8236,8 @@ func rewriteValueMIPS64_OpRsh8Ux64_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) y)) (SRLV (ZeroExt8to64 x) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8523,9 +8264,8 @@ func rewriteValueMIPS64_OpRsh8Ux8_0(v *Value) bool { // result: (AND (NEGV (SGTU (MOVVconst [64]) (ZeroExt8to64 y))) (SRLV (ZeroExt8to64 x) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64AND) v0 := b.NewValue0(v.Pos, OpMIPS64NEGV, t) v1 := b.NewValue0(v.Pos, OpMIPS64SGTU, typ.Bool) @@ -8556,9 +8296,8 @@ func rewriteValueMIPS64_OpRsh8x16_0(v *Value) bool { // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt16to64 y) (MOVVconst [63]))) (ZeroExt16to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -8589,9 +8328,8 @@ func rewriteValueMIPS64_OpRsh8x32_0(v *Value) bool { // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt32to64 y) (MOVVconst [63]))) (ZeroExt32to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -8622,9 +8360,8 @@ func rewriteValueMIPS64_OpRsh8x64_0(v *Value) bool { // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU y (MOVVconst [63]))) y)) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -8651,9 +8388,8 @@ func rewriteValueMIPS64_OpRsh8x8_0(v *Value) bool { // result: (SRAV (SignExt8to64 x) (OR (NEGV (SGTU (ZeroExt8to64 y) (MOVVconst [63]))) (ZeroExt8to64 y))) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SRAV) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -8798,7 +8534,7 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break @@ -8806,7 +8542,6 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0_0.AuxInt != -1 { break } - x := v_0.Args[1] v.reset(OpMIPS64NEGV) v.AddArg(x) return true @@ -8881,7 +8616,7 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break @@ -8889,7 +8624,6 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -8926,13 +8660,12 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isPowerOfTwo(c)) { break } @@ -8949,7 +8682,7 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break @@ -8957,7 +8690,6 @@ func rewriteValueMIPS64_OpSelect1_0(v *Value) bool { if v_0_0.AuxInt != -1 { break } - x := v_0.Args[1] v.reset(OpMIPS64NEGV) v.AddArg(x) return true @@ -9034,7 +8766,7 @@ func rewriteValueMIPS64_OpSelect1_10(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break @@ -9042,7 +8774,6 @@ func rewriteValueMIPS64_OpSelect1_10(v *Value) bool { if v_0_0.AuxInt != 1 { break } - x := v_0.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -9078,13 +8809,12 @@ func rewriteValueMIPS64_OpSelect1_10(v *Value) bool { if v_0.Op != OpMIPS64MULVU { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpMIPS64MOVVconst { break } c := v_0_0.AuxInt - x := v_0.Args[1] if !(isPowerOfTwo(c)) { break } @@ -9372,10 +9102,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -9390,10 +9119,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -9408,10 +9136,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && !is32BitFloat(val.Type)) { break } @@ -9426,10 +9153,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVVstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && !is64BitFloat(val.Type)) { break } @@ -9444,10 +9170,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVFstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -9462,10 +9187,9 @@ func rewriteValueMIPS64_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -9482,9 +9206,8 @@ func rewriteValueMIPS64_OpSub16_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -9496,9 +9219,8 @@ func rewriteValueMIPS64_OpSub32_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -9510,9 +9232,8 @@ func rewriteValueMIPS64_OpSub32F_0(v *Value) bool { // cond: // result: (SUBF x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBF) v.AddArg(x) v.AddArg(y) @@ -9524,9 +9245,8 @@ func rewriteValueMIPS64_OpSub64_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -9538,9 +9258,8 @@ func rewriteValueMIPS64_OpSub64F_0(v *Value) bool { // cond: // result: (SUBD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBD) v.AddArg(x) v.AddArg(y) @@ -9552,9 +9271,8 @@ func rewriteValueMIPS64_OpSub8_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -9566,9 +9284,8 @@ func rewriteValueMIPS64_OpSubPtr_0(v *Value) bool { // cond: // result: (SUBV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64SUBV) v.AddArg(x) v.AddArg(y) @@ -9653,10 +9370,9 @@ func rewriteValueMIPS64_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpMIPS64LoweredWB) v.Aux = fn v.AddArg(destptr) @@ -9670,9 +9386,8 @@ func rewriteValueMIPS64_OpXor16_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v.AddArg(x) v.AddArg(y) @@ -9684,9 +9399,8 @@ func rewriteValueMIPS64_OpXor32_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v.AddArg(x) v.AddArg(y) @@ -9698,9 +9412,8 @@ func rewriteValueMIPS64_OpXor64_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v.AddArg(x) v.AddArg(y) @@ -9712,9 +9425,8 @@ func rewriteValueMIPS64_OpXor8_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMIPS64XOR) v.AddArg(x) v.AddArg(y) @@ -9731,7 +9443,6 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -9745,9 +9456,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64MOVBstore) v.AddArg(ptr) v0 := b.NewValue0(v.Pos, OpMIPS64MOVVconst, typ.UInt64) @@ -9764,9 +9474,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -9785,9 +9494,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64MOVBstore) v.AuxInt = 1 v.AddArg(ptr) @@ -9812,9 +9520,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9834,9 +9541,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -9863,9 +9569,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64MOVBstore) v.AuxInt = 3 v.AddArg(ptr) @@ -9904,9 +9609,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -9926,9 +9630,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -9956,9 +9659,8 @@ func rewriteValueMIPS64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -10005,9 +9707,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpMIPS64MOVBstore) v.AuxInt = 2 v.AddArg(ptr) @@ -10039,9 +9740,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%2 == 0) { break } @@ -10076,9 +9776,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -10113,9 +9812,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -10143,9 +9841,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.(*types.Type).Alignment()%8 == 0) { break } @@ -10178,9 +9875,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(s%8 == 0 && s > 24 && s <= 8*128 && t.(*types.Type).Alignment()%8 == 0 && !config.noDuffDevice) { break } @@ -10196,9 +9892,8 @@ func rewriteValueMIPS64_OpZero_10(v *Value) bool { for { s := v.AuxInt t := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !((s > 8*128 || config.noDuffDevice) || t.(*types.Type).Alignment()%8 != 0) { break } diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 29d9ec5d4d..302b785f61 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -712,9 +712,8 @@ func rewriteValuePPC64_OpAdd16_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v.AddArg(x) v.AddArg(y) @@ -726,9 +725,8 @@ func rewriteValuePPC64_OpAdd32_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v.AddArg(x) v.AddArg(y) @@ -740,9 +738,8 @@ func rewriteValuePPC64_OpAdd32F_0(v *Value) bool { // cond: // result: (FADDS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FADDS) v.AddArg(x) v.AddArg(y) @@ -754,9 +751,8 @@ func rewriteValuePPC64_OpAdd64_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v.AddArg(x) v.AddArg(y) @@ -768,9 +764,8 @@ func rewriteValuePPC64_OpAdd64F_0(v *Value) bool { // cond: // result: (FADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FADD) v.AddArg(x) v.AddArg(y) @@ -782,9 +777,8 @@ func rewriteValuePPC64_OpAdd8_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v.AddArg(x) v.AddArg(y) @@ -796,9 +790,8 @@ func rewriteValuePPC64_OpAddPtr_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v.AddArg(x) v.AddArg(y) @@ -823,9 +816,8 @@ func rewriteValuePPC64_OpAnd16_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64AND) v.AddArg(x) v.AddArg(y) @@ -837,9 +829,8 @@ func rewriteValuePPC64_OpAnd32_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64AND) v.AddArg(x) v.AddArg(y) @@ -851,9 +842,8 @@ func rewriteValuePPC64_OpAnd64_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64AND) v.AddArg(x) v.AddArg(y) @@ -865,9 +855,8 @@ func rewriteValuePPC64_OpAnd8_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64AND) v.AddArg(x) v.AddArg(y) @@ -879,9 +868,8 @@ func rewriteValuePPC64_OpAndB_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64AND) v.AddArg(x) v.AddArg(y) @@ -893,10 +881,9 @@ func rewriteValuePPC64_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicAdd32) v.AddArg(ptr) v.AddArg(val) @@ -909,10 +896,9 @@ func rewriteValuePPC64_OpAtomicAdd64_0(v *Value) bool { // cond: // result: (LoweredAtomicAdd64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicAdd64) v.AddArg(ptr) v.AddArg(val) @@ -925,10 +911,9 @@ func rewriteValuePPC64_OpAtomicAnd8_0(v *Value) bool { // cond: // result: (LoweredAtomicAnd8 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicAnd8) v.AddArg(ptr) v.AddArg(val) @@ -941,11 +926,10 @@ func rewriteValuePPC64_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas32 [1] ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpPPC64LoweredAtomicCas32) v.AuxInt = 1 v.AddArg(ptr) @@ -960,11 +944,10 @@ func rewriteValuePPC64_OpAtomicCompareAndSwap64_0(v *Value) bool { // cond: // result: (LoweredAtomicCas64 [1] ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpPPC64LoweredAtomicCas64) v.AuxInt = 1 v.AddArg(ptr) @@ -979,11 +962,10 @@ func rewriteValuePPC64_OpAtomicCompareAndSwapRel32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas32 [0] ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpPPC64LoweredAtomicCas32) v.AuxInt = 0 v.AddArg(ptr) @@ -998,10 +980,9 @@ func rewriteValuePPC64_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicExchange32) v.AddArg(ptr) v.AddArg(val) @@ -1014,10 +995,9 @@ func rewriteValuePPC64_OpAtomicExchange64_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicExchange64) v.AddArg(ptr) v.AddArg(val) @@ -1030,9 +1010,8 @@ func rewriteValuePPC64_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad32 [1] ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredAtomicLoad32) v.AuxInt = 1 v.AddArg(ptr) @@ -1045,9 +1024,8 @@ func rewriteValuePPC64_OpAtomicLoad64_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad64 [1] ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredAtomicLoad64) v.AuxInt = 1 v.AddArg(ptr) @@ -1060,9 +1038,8 @@ func rewriteValuePPC64_OpAtomicLoadAcq32_0(v *Value) bool { // cond: // result: (LoweredAtomicLoad32 [0] ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredAtomicLoad32) v.AuxInt = 0 v.AddArg(ptr) @@ -1075,9 +1052,8 @@ func rewriteValuePPC64_OpAtomicLoadPtr_0(v *Value) bool { // cond: // result: (LoweredAtomicLoadPtr [1] ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredAtomicLoadPtr) v.AuxInt = 1 v.AddArg(ptr) @@ -1090,10 +1066,9 @@ func rewriteValuePPC64_OpAtomicOr8_0(v *Value) bool { // cond: // result: (LoweredAtomicOr8 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicOr8) v.AddArg(ptr) v.AddArg(val) @@ -1106,10 +1081,9 @@ func rewriteValuePPC64_OpAtomicStore32_0(v *Value) bool { // cond: // result: (LoweredAtomicStore32 [1] ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicStore32) v.AuxInt = 1 v.AddArg(ptr) @@ -1123,10 +1097,9 @@ func rewriteValuePPC64_OpAtomicStore64_0(v *Value) bool { // cond: // result: (LoweredAtomicStore64 [1] ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicStore64) v.AuxInt = 1 v.AddArg(ptr) @@ -1140,10 +1113,9 @@ func rewriteValuePPC64_OpAtomicStoreRel32_0(v *Value) bool { // cond: // result: (LoweredAtomicStore32 [0] ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredAtomicStore32) v.AuxInt = 0 v.AddArg(ptr) @@ -1159,9 +1131,8 @@ func rewriteValuePPC64_OpAvg64u_0(v *Value) bool { // result: (ADD (SRDconst (SUB x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ADD) v0 := b.NewValue0(v.Pos, OpPPC64SRDconst, t) v0.AuxInt = 1 @@ -1227,10 +1198,9 @@ func rewriteValuePPC64_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64CALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -1379,9 +1349,8 @@ func rewriteValuePPC64_OpCopysign_0(v *Value) bool { // cond: // result: (FCPSGN y x) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FCPSGN) v.AddArg(y) v.AddArg(x) @@ -1646,9 +1615,8 @@ func rewriteValuePPC64_OpDiv16_0(v *Value) bool { // cond: // result: (DIVW (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -1666,9 +1634,8 @@ func rewriteValuePPC64_OpDiv16u_0(v *Value) bool { // cond: // result: (DIVWU (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVWU) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -1684,9 +1651,8 @@ func rewriteValuePPC64_OpDiv32_0(v *Value) bool { // cond: // result: (DIVW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVW) v.AddArg(x) v.AddArg(y) @@ -1698,9 +1664,8 @@ func rewriteValuePPC64_OpDiv32F_0(v *Value) bool { // cond: // result: (FDIVS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FDIVS) v.AddArg(x) v.AddArg(y) @@ -1712,9 +1677,8 @@ func rewriteValuePPC64_OpDiv32u_0(v *Value) bool { // cond: // result: (DIVWU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVWU) v.AddArg(x) v.AddArg(y) @@ -1726,9 +1690,8 @@ func rewriteValuePPC64_OpDiv64_0(v *Value) bool { // cond: // result: (DIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVD) v.AddArg(x) v.AddArg(y) @@ -1740,9 +1703,8 @@ func rewriteValuePPC64_OpDiv64F_0(v *Value) bool { // cond: // result: (FDIV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FDIV) v.AddArg(x) v.AddArg(y) @@ -1754,9 +1716,8 @@ func rewriteValuePPC64_OpDiv64u_0(v *Value) bool { // cond: // result: (DIVDU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVDU) v.AddArg(x) v.AddArg(y) @@ -1770,9 +1731,8 @@ func rewriteValuePPC64_OpDiv8_0(v *Value) bool { // cond: // result: (DIVW (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -1790,9 +1750,8 @@ func rewriteValuePPC64_OpDiv8u_0(v *Value) bool { // cond: // result: (DIVWU (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64DIVWU) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -1810,9 +1769,8 @@ func rewriteValuePPC64_OpEq16_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(isSigned(x.Type) && isSigned(y.Type)) { break } @@ -1831,9 +1789,8 @@ func rewriteValuePPC64_OpEq16_0(v *Value) bool { // cond: // result: (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -1852,9 +1809,8 @@ func rewriteValuePPC64_OpEq32_0(v *Value) bool { // cond: // result: (Equal (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -1869,9 +1825,8 @@ func rewriteValuePPC64_OpEq32F_0(v *Value) bool { // cond: // result: (Equal (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -1886,9 +1841,8 @@ func rewriteValuePPC64_OpEq64_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -1903,9 +1857,8 @@ func rewriteValuePPC64_OpEq64F_0(v *Value) bool { // cond: // result: (Equal (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -1921,9 +1874,8 @@ func rewriteValuePPC64_OpEq8_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(isSigned(x.Type) && isSigned(y.Type)) { break } @@ -1942,9 +1894,8 @@ func rewriteValuePPC64_OpEq8_0(v *Value) bool { // cond: // result: (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -1964,9 +1915,8 @@ func rewriteValuePPC64_OpEqB_0(v *Value) bool { // cond: // result: (ANDconst [1] (EQV x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ANDconst) v.AuxInt = 1 v0 := b.NewValue0(v.Pos, OpPPC64EQV, typ.Int64) @@ -1982,9 +1932,8 @@ func rewriteValuePPC64_OpEqPtr_0(v *Value) bool { // cond: // result: (Equal (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64Equal) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -2011,9 +1960,8 @@ func rewriteValuePPC64_OpGeq16_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -2033,9 +1981,8 @@ func rewriteValuePPC64_OpGeq16U_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -2054,9 +2001,8 @@ func rewriteValuePPC64_OpGeq32_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -2071,9 +2017,8 @@ func rewriteValuePPC64_OpGeq32F_0(v *Value) bool { // cond: // result: (FGreaterEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FGreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2088,9 +2033,8 @@ func rewriteValuePPC64_OpGeq32U_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v0.AddArg(x) @@ -2105,9 +2049,8 @@ func rewriteValuePPC64_OpGeq64_0(v *Value) bool { // cond: // result: (GreaterEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -2122,9 +2065,8 @@ func rewriteValuePPC64_OpGeq64F_0(v *Value) bool { // cond: // result: (FGreaterEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FGreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2139,9 +2081,8 @@ func rewriteValuePPC64_OpGeq64U_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(x) @@ -2157,9 +2098,8 @@ func rewriteValuePPC64_OpGeq8_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -2179,9 +2119,8 @@ func rewriteValuePPC64_OpGeq8U_0(v *Value) bool { // cond: // result: (GreaterEqual (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -2228,9 +2167,8 @@ func rewriteValuePPC64_OpGreater16_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -2250,9 +2188,8 @@ func rewriteValuePPC64_OpGreater16U_0(v *Value) bool { // cond: // result: (GreaterThan (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -2271,9 +2208,8 @@ func rewriteValuePPC64_OpGreater32_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -2288,9 +2224,8 @@ func rewriteValuePPC64_OpGreater32F_0(v *Value) bool { // cond: // result: (FGreaterThan (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FGreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2305,9 +2240,8 @@ func rewriteValuePPC64_OpGreater32U_0(v *Value) bool { // cond: // result: (GreaterThan (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v0.AddArg(x) @@ -2322,9 +2256,8 @@ func rewriteValuePPC64_OpGreater64_0(v *Value) bool { // cond: // result: (GreaterThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -2339,9 +2272,8 @@ func rewriteValuePPC64_OpGreater64F_0(v *Value) bool { // cond: // result: (FGreaterThan (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FGreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2356,9 +2288,8 @@ func rewriteValuePPC64_OpGreater64U_0(v *Value) bool { // cond: // result: (GreaterThan (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(x) @@ -2374,9 +2305,8 @@ func rewriteValuePPC64_OpGreater8_0(v *Value) bool { // cond: // result: (GreaterThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -2396,9 +2326,8 @@ func rewriteValuePPC64_OpGreater8U_0(v *Value) bool { // cond: // result: (GreaterThan (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64GreaterThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -2416,9 +2345,8 @@ func rewriteValuePPC64_OpHmul32_0(v *Value) bool { // cond: // result: (MULHW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULHW) v.AddArg(x) v.AddArg(y) @@ -2430,9 +2358,8 @@ func rewriteValuePPC64_OpHmul32u_0(v *Value) bool { // cond: // result: (MULHWU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULHWU) v.AddArg(x) v.AddArg(y) @@ -2444,9 +2371,8 @@ func rewriteValuePPC64_OpHmul64_0(v *Value) bool { // cond: // result: (MULHD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULHD) v.AddArg(x) v.AddArg(y) @@ -2458,9 +2384,8 @@ func rewriteValuePPC64_OpHmul64u_0(v *Value) bool { // cond: // result: (MULHDU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULHDU) v.AddArg(x) v.AddArg(y) @@ -2473,9 +2398,8 @@ func rewriteValuePPC64_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpPPC64CALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -2489,9 +2413,8 @@ func rewriteValuePPC64_OpIsInBounds_0(v *Value) bool { // cond: // result: (LessThan (CMPU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(idx) @@ -2521,9 +2444,8 @@ func rewriteValuePPC64_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (LessEqual (CMPU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(idx) @@ -2539,9 +2461,8 @@ func rewriteValuePPC64_OpLeq16_0(v *Value) bool { // cond: // result: (LessEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -2561,9 +2482,8 @@ func rewriteValuePPC64_OpLeq16U_0(v *Value) bool { // cond: // result: (LessEqual (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -2582,9 +2502,8 @@ func rewriteValuePPC64_OpLeq32_0(v *Value) bool { // cond: // result: (LessEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -2599,9 +2518,8 @@ func rewriteValuePPC64_OpLeq32F_0(v *Value) bool { // cond: // result: (FLessEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FLessEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2616,9 +2534,8 @@ func rewriteValuePPC64_OpLeq32U_0(v *Value) bool { // cond: // result: (LessEqual (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v0.AddArg(x) @@ -2633,9 +2550,8 @@ func rewriteValuePPC64_OpLeq64_0(v *Value) bool { // cond: // result: (LessEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -2650,9 +2566,8 @@ func rewriteValuePPC64_OpLeq64F_0(v *Value) bool { // cond: // result: (FLessEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FLessEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2667,9 +2582,8 @@ func rewriteValuePPC64_OpLeq64U_0(v *Value) bool { // cond: // result: (LessEqual (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(x) @@ -2685,9 +2599,8 @@ func rewriteValuePPC64_OpLeq8_0(v *Value) bool { // cond: // result: (LessEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -2707,9 +2620,8 @@ func rewriteValuePPC64_OpLeq8U_0(v *Value) bool { // cond: // result: (LessEqual (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -2729,9 +2641,8 @@ func rewriteValuePPC64_OpLess16_0(v *Value) bool { // cond: // result: (LessThan (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) @@ -2751,9 +2662,8 @@ func rewriteValuePPC64_OpLess16U_0(v *Value) bool { // cond: // result: (LessThan (CMPWU (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -2772,9 +2682,8 @@ func rewriteValuePPC64_OpLess32_0(v *Value) bool { // cond: // result: (LessThan (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -2789,9 +2698,8 @@ func rewriteValuePPC64_OpLess32F_0(v *Value) bool { // cond: // result: (FLessThan (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FLessThan) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2806,9 +2714,8 @@ func rewriteValuePPC64_OpLess32U_0(v *Value) bool { // cond: // result: (LessThan (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v0.AddArg(x) @@ -2823,9 +2730,8 @@ func rewriteValuePPC64_OpLess64_0(v *Value) bool { // cond: // result: (LessThan (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -2840,9 +2746,8 @@ func rewriteValuePPC64_OpLess64F_0(v *Value) bool { // cond: // result: (FLessThan (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FLessThan) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -2857,9 +2762,8 @@ func rewriteValuePPC64_OpLess64U_0(v *Value) bool { // cond: // result: (LessThan (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPU, types.TypeFlags) v0.AddArg(x) @@ -2875,9 +2779,8 @@ func rewriteValuePPC64_OpLess8_0(v *Value) bool { // cond: // result: (LessThan (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) @@ -2897,9 +2800,8 @@ func rewriteValuePPC64_OpLess8U_0(v *Value) bool { // cond: // result: (LessThan (CMPWU (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LessThan) v0 := b.NewValue0(v.Pos, OpPPC64CMPWU, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -2920,9 +2822,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) || isPtr(t)) { break } @@ -2936,9 +2837,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && isSigned(t)) { break } @@ -2952,9 +2852,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVWZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && !isSigned(t)) { break } @@ -2968,9 +2867,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -2984,9 +2882,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVHZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -3000,9 +2897,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVBZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean()) { break } @@ -3016,9 +2912,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVBreg (MOVBZload ptr mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -3034,9 +2929,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (MOVBZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && !isSigned(t)) { break } @@ -3050,9 +2944,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (FMOVSload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -3066,9 +2959,8 @@ func rewriteValuePPC64_OpLoad_0(v *Value) bool { // result: (FMOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -3100,9 +2992,8 @@ func rewriteValuePPC64_OpLsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3115,9 +3006,8 @@ func rewriteValuePPC64_OpLsh16x16_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3179,9 +3069,8 @@ func rewriteValuePPC64_OpLsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3194,9 +3083,8 @@ func rewriteValuePPC64_OpLsh16x32_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3275,9 +3163,8 @@ func rewriteValuePPC64_OpLsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3290,9 +3177,8 @@ func rewriteValuePPC64_OpLsh16x64_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3314,9 +3200,8 @@ func rewriteValuePPC64_OpLsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3329,9 +3214,8 @@ func rewriteValuePPC64_OpLsh16x8_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3355,9 +3239,8 @@ func rewriteValuePPC64_OpLsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3370,9 +3253,8 @@ func rewriteValuePPC64_OpLsh32x16_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3434,9 +3316,8 @@ func rewriteValuePPC64_OpLsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3449,9 +3330,8 @@ func rewriteValuePPC64_OpLsh32x32_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3530,9 +3410,8 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3578,7 +3457,7 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -3586,7 +3465,6 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { if v_1_0.AuxInt != 31 { break } - y := v_1.Args[1] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) @@ -3624,9 +3502,8 @@ func rewriteValuePPC64_OpLsh32x64_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3648,9 +3525,8 @@ func rewriteValuePPC64_OpLsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3663,9 +3539,8 @@ func rewriteValuePPC64_OpLsh32x8_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3689,9 +3564,8 @@ func rewriteValuePPC64_OpLsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3704,9 +3578,8 @@ func rewriteValuePPC64_OpLsh64x16_0(v *Value) bool { // cond: // result: (SLD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3768,9 +3641,8 @@ func rewriteValuePPC64_OpLsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3783,9 +3655,8 @@ func rewriteValuePPC64_OpLsh64x32_0(v *Value) bool { // cond: // result: (SLD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3864,9 +3735,8 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3912,7 +3782,7 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -3920,7 +3790,6 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { if v_1_0.AuxInt != 63 { break } - y := v_1.Args[1] v.reset(OpPPC64SLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) @@ -3958,9 +3827,8 @@ func rewriteValuePPC64_OpLsh64x64_0(v *Value) bool { // cond: // result: (SLD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -3982,9 +3850,8 @@ func rewriteValuePPC64_OpLsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3997,9 +3864,8 @@ func rewriteValuePPC64_OpLsh64x8_0(v *Value) bool { // cond: // result: (SLD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -4023,9 +3889,8 @@ func rewriteValuePPC64_OpLsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4038,9 +3903,8 @@ func rewriteValuePPC64_OpLsh8x16_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -4102,9 +3966,8 @@ func rewriteValuePPC64_OpLsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4117,9 +3980,8 @@ func rewriteValuePPC64_OpLsh8x32_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -4198,9 +4060,8 @@ func rewriteValuePPC64_OpLsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4213,9 +4074,8 @@ func rewriteValuePPC64_OpLsh8x64_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -4237,9 +4097,8 @@ func rewriteValuePPC64_OpLsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4252,9 +4111,8 @@ func rewriteValuePPC64_OpLsh8x8_0(v *Value) bool { // cond: // result: (SLW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -4278,9 +4136,8 @@ func rewriteValuePPC64_OpMod16_0(v *Value) bool { // cond: // result: (Mod32 (SignExt16to32 x) (SignExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -4298,9 +4155,8 @@ func rewriteValuePPC64_OpMod16u_0(v *Value) bool { // cond: // result: (Mod32u (ZeroExt16to32 x) (ZeroExt16to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32u) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -4318,9 +4174,8 @@ func rewriteValuePPC64_OpMod32_0(v *Value) bool { // cond: // result: (SUB x (MULLW y (DIVW x y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64MULLW, typ.Int32) @@ -4340,9 +4195,8 @@ func rewriteValuePPC64_OpMod32u_0(v *Value) bool { // cond: // result: (SUB x (MULLW y (DIVWU x y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64MULLW, typ.Int32) @@ -4362,9 +4216,8 @@ func rewriteValuePPC64_OpMod64_0(v *Value) bool { // cond: // result: (SUB x (MULLD y (DIVD x y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64MULLD, typ.Int64) @@ -4384,9 +4237,8 @@ func rewriteValuePPC64_OpMod64u_0(v *Value) bool { // cond: // result: (SUB x (MULLD y (DIVDU x y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64MULLD, typ.Int64) @@ -4406,9 +4258,8 @@ func rewriteValuePPC64_OpMod8_0(v *Value) bool { // cond: // result: (Mod32 (SignExt8to32 x) (SignExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -4426,9 +4277,8 @@ func rewriteValuePPC64_OpMod8u_0(v *Value) bool { // cond: // result: (Mod32u (ZeroExt8to32 x) (ZeroExt8to32 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpMod32u) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -4449,7 +4299,6 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -4463,10 +4312,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpPPC64MOVBZload, typ.UInt8) @@ -4483,10 +4331,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpPPC64MOVHZload, typ.UInt16) @@ -4503,10 +4350,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVWstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpPPC64MOVWZload, typ.UInt32) @@ -4524,10 +4370,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { break } t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -4547,10 +4392,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVWstore) v.AuxInt = 4 v.AddArg(dst) @@ -4576,10 +4420,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -4605,10 +4448,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = 4 v.AddArg(dst) @@ -4634,10 +4476,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AuxInt = 4 v.AddArg(dst) @@ -4663,10 +4504,9 @@ func rewriteValuePPC64_OpMove_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = 6 v.AddArg(dst) @@ -4702,10 +4542,9 @@ func rewriteValuePPC64_OpMove_10(v *Value) bool { // result: (LoweredMove [s] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 8) { break } @@ -4723,9 +4562,8 @@ func rewriteValuePPC64_OpMul16_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULLW) v.AddArg(x) v.AddArg(y) @@ -4737,9 +4575,8 @@ func rewriteValuePPC64_OpMul32_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULLW) v.AddArg(x) v.AddArg(y) @@ -4751,9 +4588,8 @@ func rewriteValuePPC64_OpMul32F_0(v *Value) bool { // cond: // result: (FMULS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FMULS) v.AddArg(x) v.AddArg(y) @@ -4765,9 +4601,8 @@ func rewriteValuePPC64_OpMul64_0(v *Value) bool { // cond: // result: (MULLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULLD) v.AddArg(x) v.AddArg(y) @@ -4779,9 +4614,8 @@ func rewriteValuePPC64_OpMul64F_0(v *Value) bool { // cond: // result: (FMUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FMUL) v.AddArg(x) v.AddArg(y) @@ -4793,9 +4627,8 @@ func rewriteValuePPC64_OpMul64uhilo_0(v *Value) bool { // cond: // result: (LoweredMuluhilo x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64LoweredMuluhilo) v.AddArg(x) v.AddArg(y) @@ -4807,9 +4640,8 @@ func rewriteValuePPC64_OpMul8_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64MULLW) v.AddArg(x) v.AddArg(y) @@ -4889,9 +4721,8 @@ func rewriteValuePPC64_OpNeq16_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt16to32 x) (SignExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(isSigned(x.Type) && isSigned(y.Type)) { break } @@ -4910,9 +4741,8 @@ func rewriteValuePPC64_OpNeq16_0(v *Value) bool { // cond: // result: (NotEqual (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) @@ -4931,9 +4761,8 @@ func rewriteValuePPC64_OpNeq32_0(v *Value) bool { // cond: // result: (NotEqual (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v0.AddArg(x) @@ -4948,9 +4777,8 @@ func rewriteValuePPC64_OpNeq32F_0(v *Value) bool { // cond: // result: (NotEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -4965,9 +4793,8 @@ func rewriteValuePPC64_OpNeq64_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -4982,9 +4809,8 @@ func rewriteValuePPC64_OpNeq64F_0(v *Value) bool { // cond: // result: (NotEqual (FCMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64FCMPU, types.TypeFlags) v0.AddArg(x) @@ -5000,9 +4826,8 @@ func rewriteValuePPC64_OpNeq8_0(v *Value) bool { // cond: isSigned(x.Type) && isSigned(y.Type) // result: (NotEqual (CMPW (SignExt8to32 x) (SignExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(isSigned(x.Type) && isSigned(y.Type)) { break } @@ -5021,9 +4846,8 @@ func rewriteValuePPC64_OpNeq8_0(v *Value) bool { // cond: // result: (NotEqual (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMPW, types.TypeFlags) v1 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) @@ -5041,9 +4865,8 @@ func rewriteValuePPC64_OpNeqB_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64XOR) v.AddArg(x) v.AddArg(y) @@ -5056,9 +4879,8 @@ func rewriteValuePPC64_OpNeqPtr_0(v *Value) bool { // cond: // result: (NotEqual (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64NotEqual) v0 := b.NewValue0(v.Pos, OpPPC64CMP, types.TypeFlags) v0.AddArg(x) @@ -5072,9 +4894,8 @@ func rewriteValuePPC64_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -5115,9 +4936,8 @@ func rewriteValuePPC64_OpOr16_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64OR) v.AddArg(x) v.AddArg(y) @@ -5129,9 +4949,8 @@ func rewriteValuePPC64_OpOr32_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64OR) v.AddArg(x) v.AddArg(y) @@ -5143,9 +4962,8 @@ func rewriteValuePPC64_OpOr64_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64OR) v.AddArg(x) v.AddArg(y) @@ -5157,9 +4975,8 @@ func rewriteValuePPC64_OpOr8_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64OR) v.AddArg(x) v.AddArg(y) @@ -5171,9 +4988,8 @@ func rewriteValuePPC64_OpOrB_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64OR) v.AddArg(x) v.AddArg(y) @@ -5566,13 +5382,12 @@ func rewriteValuePPC64_OpPPC64ADD_0(v *Value) bool { // cond: is32Bit(c) // result: (ADDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -5647,9 +5462,8 @@ func rewriteValuePPC64_OpPPC64AND_0(v *Value) bool { if v_1.Op != OpPPC64NOR { break } - _ = v_1.Args[1] - y := v_1.Args[0] - if y != v_1.Args[1] { + y := v_1.Args[1] + if y != v_1.Args[0] { break } v.reset(OpPPC64ANDN) @@ -5661,17 +5475,15 @@ func rewriteValuePPC64_OpPPC64AND_0(v *Value) bool { // cond: // result: (ANDN x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64NOR { break } - _ = v_0.Args[1] - y := v_0.Args[0] - if y != v_0.Args[1] { + y := v_0.Args[1] + if y != v_0.Args[0] { break } - x := v.Args[1] v.reset(OpPPC64ANDN) v.AddArg(x) v.AddArg(y) @@ -5738,13 +5550,12 @@ func rewriteValuePPC64_OpPPC64AND_0(v *Value) bool { // cond: isU16Bit(c) // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU16Bit(c)) { break } @@ -6151,13 +5962,12 @@ func rewriteValuePPC64_OpPPC64CMP_0(v *Value) bool { // cond: is16Bit(c) // result: (InvertFlags (CMPconst y [c])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - y := v.Args[1] if !(is16Bit(c)) { break } @@ -6195,13 +6005,12 @@ func rewriteValuePPC64_OpPPC64CMPU_0(v *Value) bool { // cond: isU16Bit(c) // result: (InvertFlags (CMPUconst y [c])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - y := v.Args[1] if !(isU16Bit(c)) { break } @@ -6287,13 +6096,12 @@ func rewriteValuePPC64_OpPPC64CMPW_0(v *Value) bool { // cond: // result: (CMPW x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVWreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpPPC64CMPW) v.AddArg(x) v.AddArg(y) @@ -6322,13 +6130,12 @@ func rewriteValuePPC64_OpPPC64CMPW_0(v *Value) bool { // cond: is16Bit(c) // result: (InvertFlags (CMPWconst y [c])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - y := v.Args[1] if !(is16Bit(c)) { break } @@ -6363,13 +6170,12 @@ func rewriteValuePPC64_OpPPC64CMPWU_0(v *Value) bool { // cond: // result: (CMPWU x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVWZreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpPPC64CMPWU) v.AddArg(x) v.AddArg(y) @@ -6398,13 +6204,12 @@ func rewriteValuePPC64_OpPPC64CMPWU_0(v *Value) bool { // cond: isU16Bit(c) // result: (InvertFlags (CMPWUconst y [c])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - y := v.Args[1] if !(isU16Bit(c)) { break } @@ -6643,15 +6448,13 @@ func rewriteValuePPC64_OpPPC64FADD_0(v *Value) bool { // cond: // result: (FMADD x y z) for { - _ = v.Args[1] + z := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64FMUL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - z := v.Args[1] + x := v_0.Args[0] v.reset(OpPPC64FMADD) v.AddArg(x) v.AddArg(y) @@ -6668,9 +6471,8 @@ func rewriteValuePPC64_OpPPC64FADD_0(v *Value) bool { if v_1.Op != OpPPC64FMUL { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpPPC64FMADD) v.AddArg(x) v.AddArg(y) @@ -6684,15 +6486,13 @@ func rewriteValuePPC64_OpPPC64FADDS_0(v *Value) bool { // cond: // result: (FMADDS x y z) for { - _ = v.Args[1] + z := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64FMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - z := v.Args[1] + x := v_0.Args[0] v.reset(OpPPC64FMADDS) v.AddArg(x) v.AddArg(y) @@ -6709,9 +6509,8 @@ func rewriteValuePPC64_OpPPC64FADDS_0(v *Value) bool { if v_1.Op != OpPPC64FMULS { break } - _ = v_1.Args[1] - x := v_1.Args[0] y := v_1.Args[1] + x := v_1.Args[0] v.reset(OpPPC64FMADDS) v.AddArg(x) v.AddArg(y) @@ -6786,7 +6585,7 @@ func rewriteValuePPC64_OpPPC64FMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -6794,7 +6593,6 @@ func rewriteValuePPC64_OpPPC64FMOVDload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -6811,14 +6609,13 @@ func rewriteValuePPC64_OpPPC64FMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -6838,14 +6635,13 @@ func rewriteValuePPC64_OpPPC64FMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MTVSRD { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVDstore) v.AuxInt = off v.Aux = sym @@ -6860,7 +6656,7 @@ func rewriteValuePPC64_OpPPC64FMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -6868,7 +6664,6 @@ func rewriteValuePPC64_OpPPC64FMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -6886,7 +6681,7 @@ func rewriteValuePPC64_OpPPC64FMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -6895,7 +6690,6 @@ func rewriteValuePPC64_OpPPC64FMOVDstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -6916,7 +6710,7 @@ func rewriteValuePPC64_OpPPC64FMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -6924,7 +6718,6 @@ func rewriteValuePPC64_OpPPC64FMOVSload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -6941,14 +6734,13 @@ func rewriteValuePPC64_OpPPC64FMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -6968,7 +6760,7 @@ func rewriteValuePPC64_OpPPC64FMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -6976,7 +6768,6 @@ func rewriteValuePPC64_OpPPC64FMOVSstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -6994,7 +6785,7 @@ func rewriteValuePPC64_OpPPC64FMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -7003,7 +6794,6 @@ func rewriteValuePPC64_OpPPC64FMOVSstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -7067,15 +6857,13 @@ func rewriteValuePPC64_OpPPC64FSUB_0(v *Value) bool { // cond: // result: (FMSUB x y z) for { - _ = v.Args[1] + z := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64FMUL { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - z := v.Args[1] + x := v_0.Args[0] v.reset(OpPPC64FMSUB) v.AddArg(x) v.AddArg(y) @@ -7089,15 +6877,13 @@ func rewriteValuePPC64_OpPPC64FSUBS_0(v *Value) bool { // cond: // result: (FMSUBS x y z) for { - _ = v.Args[1] + z := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64FMULS { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - z := v.Args[1] + x := v_0.Args[0] v.reset(OpPPC64FMSUBS) v.AddArg(x) v.AddArg(y) @@ -7356,9 +7142,8 @@ func rewriteValuePPC64_OpPPC64MFVSRD_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -7381,7 +7166,7 @@ func rewriteValuePPC64_OpPPC64MOVBZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -7389,7 +7174,6 @@ func rewriteValuePPC64_OpPPC64MOVBZload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -7406,14 +7190,13 @@ func rewriteValuePPC64_OpPPC64MOVBZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -7432,15 +7215,13 @@ func rewriteValuePPC64_OpPPC64MOVBZload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -7457,14 +7238,13 @@ func rewriteValuePPC64_OpPPC64MOVBZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVBZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -7478,14 +7258,13 @@ func rewriteValuePPC64_OpPPC64MOVBZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVBZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -7880,7 +7659,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -7888,7 +7667,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { off2 := v_0.AuxInt x := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -7906,7 +7684,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -7915,7 +7693,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -7933,7 +7710,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -7942,7 +7719,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpPPC64MOVBstorezero) v.AuxInt = off v.Aux = sym @@ -7956,16 +7732,14 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] + ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil && p.Uses == 1) { break } @@ -7982,14 +7756,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8004,14 +7777,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVBZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8026,14 +7798,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8048,14 +7819,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8070,14 +7840,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8092,14 +7861,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVBstore) v.AuxInt = off v.Aux = sym @@ -8120,7 +7888,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64SRWconst { @@ -8132,7 +7900,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { break } x := v_1_0.Args[0] - mem := v.Args[2] if !(c <= 8) { break } @@ -8153,7 +7920,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64SRWconst { @@ -8165,7 +7932,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { break } x := v_1_0.Args[0] - mem := v.Args[2] if !(c <= 8) { break } @@ -8186,7 +7952,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64SRWconst { @@ -8198,7 +7964,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { break } x := v_1_0.Args[0] - mem := v.Args[2] if !(c <= 24) { break } @@ -8219,7 +7984,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64SRWconst { @@ -8231,7 +7996,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { break } x := v_1_0.Args[0] - mem := v.Args[2] if !(c <= 24) { break } @@ -8270,7 +8034,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -8284,7 +8048,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) { break } @@ -8323,7 +8086,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -8337,7 +8100,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) { break } @@ -8376,14 +8138,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } if w != x0.Args[1] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) { break } @@ -8419,14 +8180,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } if w != x0.Args[1] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) { break } @@ -8499,7 +8259,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x2.Aux != s { break } - _ = x2.Args[2] + mem := x2.Args[2] if p != x2.Args[0] { break } @@ -8513,7 +8273,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if w != x2_1.Args[0] { break } - mem := x2.Args[2] if !(!config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && clobber(x0) && clobber(x1) && clobber(x2)) { break } @@ -8544,7 +8303,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } @@ -8558,7 +8317,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_10(v *Value) bool { if w != x0_1.Args[0] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+1 && clobber(x0)) { break } @@ -8668,14 +8426,13 @@ func rewriteValuePPC64_OpPPC64MOVBstore_20(v *Value) bool { if x3.Aux != s { break } - _ = x3.Args[2] + mem := x3.Args[2] if p != x3.Args[0] { break } if w != x3.Args[1] { break } - mem := x3.Args[2] if !(!config.BigEndian && i0%4 == 0 && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3)) { break } @@ -8836,7 +8593,7 @@ func rewriteValuePPC64_OpPPC64MOVBstore_20(v *Value) bool { if x6.Aux != s { break } - _ = x6.Args[2] + mem := x6.Args[2] if p != x6.Args[0] { break } @@ -8850,7 +8607,6 @@ func rewriteValuePPC64_OpPPC64MOVBstore_20(v *Value) bool { if w != x6_1.Args[0] { break } - mem := x6.Args[2] if !(!config.BigEndian && x0.Uses == 1 && x1.Uses == 1 && x2.Uses == 1 && x3.Uses == 1 && x4.Uses == 1 && x5.Uses == 1 && x6.Uses == 1 && i1 == i0+1 && i2 == i0+2 && i3 == i0+3 && i4 == i0+4 && i5 == i0+5 && i6 == i0+6 && i7 == i0+7 && clobber(x0) && clobber(x1) && clobber(x2) && clobber(x3) && clobber(x4) && clobber(x5) && clobber(x6)) { break } @@ -8873,7 +8629,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVBstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -8881,7 +8637,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -8896,7 +8651,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVBstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break @@ -8904,7 +8659,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -8921,7 +8675,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -8929,7 +8683,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -8945,7 +8698,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -8953,7 +8706,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -8969,7 +8721,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -8977,7 +8729,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -8993,7 +8744,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9001,7 +8752,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -9017,7 +8767,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9025,7 +8775,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -9041,7 +8790,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9049,7 +8798,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVBstoreidx) v.AuxInt = off v.Aux = sym @@ -9065,7 +8813,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9078,7 +8826,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2_0.Args[0] - mem := v.Args[3] if !(c <= 8) { break } @@ -9100,7 +8847,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9113,7 +8860,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_0(v *Value) bool { break } x := v_2_0.Args[0] - mem := v.Args[3] if !(c <= 8) { break } @@ -9140,7 +8886,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9153,7 +8899,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_10(v *Value) bool { break } x := v_2_0.Args[0] - mem := v.Args[3] if !(c <= 24) { break } @@ -9175,7 +8920,7 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_10(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -9188,7 +8933,6 @@ func rewriteValuePPC64_OpPPC64MOVBstoreidx_10(v *Value) bool { break } x := v_2_0.Args[0] - mem := v.Args[3] if !(c <= 24) { break } @@ -9213,14 +8957,13 @@ func rewriteValuePPC64_OpPPC64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -9237,7 +8980,7 @@ func rewriteValuePPC64_OpPPC64MOVBstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -9245,7 +8988,6 @@ func rewriteValuePPC64_OpPPC64MOVBstorezero_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux x := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) { break } @@ -9292,7 +9034,7 @@ func rewriteValuePPC64_OpPPC64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -9300,7 +9042,6 @@ func rewriteValuePPC64_OpPPC64MOVDload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -9317,14 +9058,13 @@ func rewriteValuePPC64_OpPPC64MOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -9343,15 +9083,13 @@ func rewriteValuePPC64_OpPPC64MOVDload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -9368,14 +9106,13 @@ func rewriteValuePPC64_OpPPC64MOVDloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -9389,14 +9126,13 @@ func rewriteValuePPC64_OpPPC64MOVDloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVDload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -9415,14 +9151,13 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MFVSRD { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64FMOVDstore) v.AuxInt = off v.Aux = sym @@ -9437,7 +9172,7 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -9445,7 +9180,6 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { off2 := v_0.AuxInt x := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -9463,7 +9197,7 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -9472,7 +9206,6 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -9490,7 +9223,7 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -9499,7 +9232,6 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpPPC64MOVDstorezero) v.AuxInt = off v.Aux = sym @@ -9513,16 +9245,14 @@ func rewriteValuePPC64_OpPPC64MOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] + ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil && p.Uses == 1) { break } @@ -9540,7 +9270,7 @@ func rewriteValuePPC64_OpPPC64MOVDstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVDstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -9548,7 +9278,6 @@ func rewriteValuePPC64_OpPPC64MOVDstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -9563,7 +9292,7 @@ func rewriteValuePPC64_OpPPC64MOVDstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVDstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break @@ -9571,7 +9300,6 @@ func rewriteValuePPC64_OpPPC64MOVDstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -9591,14 +9319,13 @@ func rewriteValuePPC64_OpPPC64MOVDstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -9615,7 +9342,7 @@ func rewriteValuePPC64_OpPPC64MOVDstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -9623,7 +9350,6 @@ func rewriteValuePPC64_OpPPC64MOVDstorezero_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux x := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) { break } @@ -9642,14 +9368,13 @@ func rewriteValuePPC64_OpPPC64MOVHBRstore_0(v *Value) bool { // result: (MOVHBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHBRstore) v.Aux = sym v.AddArg(ptr) @@ -9662,14 +9387,13 @@ func rewriteValuePPC64_OpPPC64MOVHBRstore_0(v *Value) bool { // result: (MOVHBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHBRstore) v.Aux = sym v.AddArg(ptr) @@ -9682,14 +9406,13 @@ func rewriteValuePPC64_OpPPC64MOVHBRstore_0(v *Value) bool { // result: (MOVHBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHBRstore) v.Aux = sym v.AddArg(ptr) @@ -9702,14 +9425,13 @@ func rewriteValuePPC64_OpPPC64MOVHBRstore_0(v *Value) bool { // result: (MOVHBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHBRstore) v.Aux = sym v.AddArg(ptr) @@ -9726,7 +9448,7 @@ func rewriteValuePPC64_OpPPC64MOVHZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -9734,7 +9456,6 @@ func rewriteValuePPC64_OpPPC64MOVHZload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -9751,14 +9472,13 @@ func rewriteValuePPC64_OpPPC64MOVHZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -9777,15 +9497,13 @@ func rewriteValuePPC64_OpPPC64MOVHZload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -9802,14 +9520,13 @@ func rewriteValuePPC64_OpPPC64MOVHZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -9823,14 +9540,13 @@ func rewriteValuePPC64_OpPPC64MOVHZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -10109,7 +9825,7 @@ func rewriteValuePPC64_OpPPC64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -10117,7 +9833,6 @@ func rewriteValuePPC64_OpPPC64MOVHload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -10134,14 +9849,13 @@ func rewriteValuePPC64_OpPPC64MOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -10160,15 +9874,13 @@ func rewriteValuePPC64_OpPPC64MOVHload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -10185,14 +9897,13 @@ func rewriteValuePPC64_OpPPC64MOVHloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -10206,14 +9917,13 @@ func rewriteValuePPC64_OpPPC64MOVHloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -10488,7 +10198,7 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -10496,7 +10206,6 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { off2 := v_0.AuxInt x := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -10514,7 +10223,7 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -10523,7 +10232,6 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -10541,7 +10249,7 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -10550,7 +10258,6 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpPPC64MOVHstorezero) v.AuxInt = off v.Aux = sym @@ -10564,16 +10271,14 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] + ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil && p.Uses == 1) { break } @@ -10590,14 +10295,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AuxInt = off v.Aux = sym @@ -10612,14 +10316,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVHZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AuxInt = off v.Aux = sym @@ -10634,14 +10337,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AuxInt = off v.Aux = sym @@ -10656,14 +10358,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVHstore) v.AuxInt = off v.Aux = sym @@ -10696,14 +10397,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } if w != x0.Args[1] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)) { break } @@ -10739,14 +10439,13 @@ func rewriteValuePPC64_OpPPC64MOVHstore_0(v *Value) bool { if x0.Aux != s { break } - _ = x0.Args[2] + mem := x0.Args[2] if p != x0.Args[0] { break } if w != x0.Args[1] { break } - mem := x0.Args[2] if !(!config.BigEndian && x0.Uses == 1 && i1 == i0+2 && clobber(x0)) { break } @@ -10765,7 +10464,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -10773,7 +10472,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -10788,7 +10486,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVHstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break @@ -10796,7 +10494,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -10813,7 +10510,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -10821,7 +10518,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVHstoreidx) v.AuxInt = off v.Aux = sym @@ -10837,7 +10533,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -10845,7 +10541,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVHstoreidx) v.AuxInt = off v.Aux = sym @@ -10861,7 +10556,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -10869,7 +10564,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVHstoreidx) v.AuxInt = off v.Aux = sym @@ -10885,7 +10579,7 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -10893,7 +10587,6 @@ func rewriteValuePPC64_OpPPC64MOVHstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVHstoreidx) v.AuxInt = off v.Aux = sym @@ -10912,14 +10605,13 @@ func rewriteValuePPC64_OpPPC64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -10936,7 +10628,7 @@ func rewriteValuePPC64_OpPPC64MOVHstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -10944,7 +10636,6 @@ func rewriteValuePPC64_OpPPC64MOVHstorezero_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux x := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) { break } @@ -10963,14 +10654,13 @@ func rewriteValuePPC64_OpPPC64MOVWBRstore_0(v *Value) bool { // result: (MOVWBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVWBRstore) v.Aux = sym v.AddArg(ptr) @@ -10983,14 +10673,13 @@ func rewriteValuePPC64_OpPPC64MOVWBRstore_0(v *Value) bool { // result: (MOVWBRstore {sym} ptr x mem) for { sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVWBRstore) v.Aux = sym v.AddArg(ptr) @@ -11007,7 +10696,7 @@ func rewriteValuePPC64_OpPPC64MOVWZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -11015,7 +10704,6 @@ func rewriteValuePPC64_OpPPC64MOVWZload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -11032,14 +10720,13 @@ func rewriteValuePPC64_OpPPC64MOVWZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -11058,15 +10745,13 @@ func rewriteValuePPC64_OpPPC64MOVWZload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -11083,14 +10768,13 @@ func rewriteValuePPC64_OpPPC64MOVWZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -11104,14 +10788,13 @@ func rewriteValuePPC64_OpPPC64MOVWZloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWZload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -11495,7 +11178,7 @@ func rewriteValuePPC64_OpPPC64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -11503,7 +11186,6 @@ func rewriteValuePPC64_OpPPC64MOVWload_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux ptr := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -11520,14 +11202,13 @@ func rewriteValuePPC64_OpPPC64MOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -11546,15 +11227,13 @@ func rewriteValuePPC64_OpPPC64MOVWload_0(v *Value) bool { break } sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] - mem := v.Args[1] + ptr := p.Args[0] if !(sym == nil && p.Uses == 1) { break } @@ -11571,14 +11250,13 @@ func rewriteValuePPC64_OpPPC64MOVWloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -11592,14 +11270,13 @@ func rewriteValuePPC64_OpPPC64MOVWloadidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWload [c] ptr mem) for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt ptr := v.Args[1] - mem := v.Args[2] if !(is16Bit(c)) { break } @@ -11942,7 +11619,7 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break @@ -11950,7 +11627,6 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { off2 := v_0.AuxInt x := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is16Bit(off1 + off2)) { break } @@ -11968,7 +11644,7 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -11977,7 +11653,6 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { sym2 := p.Aux ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(canMergeSym(sym1, sym2) && (ptr.Op != OpSB || p.Uses == 1)) { break } @@ -11995,7 +11670,7 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -12004,7 +11679,6 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { if v_1.AuxInt != 0 { break } - mem := v.Args[2] v.reset(OpPPC64MOVWstorezero) v.AuxInt = off v.Aux = sym @@ -12018,16 +11692,14 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] p := v.Args[0] if p.Op != OpPPC64ADD { break } - _ = p.Args[1] - ptr := p.Args[0] idx := p.Args[1] + ptr := p.Args[0] val := v.Args[1] - mem := v.Args[2] if !(off == 0 && sym == nil && p.Uses == 1) { break } @@ -12044,14 +11716,13 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVWstore) v.AuxInt = off v.Aux = sym @@ -12066,14 +11737,13 @@ func rewriteValuePPC64_OpPPC64MOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpPPC64MOVWstore) v.AuxInt = off v.Aux = sym @@ -12089,7 +11759,7 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpPPC64MOVDconst { @@ -12097,7 +11767,6 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { } c := v_1.AuxInt val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -12112,7 +11781,7 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { // cond: is16Bit(c) // result: (MOVWstore [c] ptr val mem) for { - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break @@ -12120,7 +11789,6 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { c := v_0.AuxInt ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is16Bit(c)) { break } @@ -12137,7 +11805,7 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12145,7 +11813,6 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVWstoreidx) v.AuxInt = off v.Aux = sym @@ -12161,7 +11828,7 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] idx := v.Args[1] v_2 := v.Args[2] @@ -12169,7 +11836,6 @@ func rewriteValuePPC64_OpPPC64MOVWstoreidx_0(v *Value) bool { break } x := v_2.Args[0] - mem := v.Args[3] v.reset(OpPPC64MOVWstoreidx) v.AuxInt = off v.Aux = sym @@ -12188,14 +11854,13 @@ func rewriteValuePPC64_OpPPC64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64ADDconst { break } off2 := v_0.AuxInt x := v_0.Args[0] - mem := v.Args[1] if !(is16Bit(off1 + off2)) { break } @@ -12212,7 +11877,7 @@ func rewriteValuePPC64_OpPPC64MOVWstorezero_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] p := v.Args[0] if p.Op != OpPPC64MOVDaddr { break @@ -12220,7 +11885,6 @@ func rewriteValuePPC64_OpPPC64MOVWstorezero_0(v *Value) bool { off2 := p.AuxInt sym2 := p.Aux x := p.Args[0] - mem := v.Args[1] if !(canMergeSym(sym1, sym2) && (x.Op != OpSB || p.Uses == 1)) { break } @@ -12259,9 +11923,8 @@ func rewriteValuePPC64_OpPPC64MTVSRD_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -12783,13 +12446,12 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { // cond: isU32Bit(c) // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU32Bit(c)) { break } @@ -12810,9 +12472,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o1 := v.Args[1] if o1.Op != OpPPC64SLWconst { break @@ -12867,9 +12528,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpPPC64MOVBZload { break @@ -12910,9 +12570,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o1 := v.Args[1] if o1.Op != OpPPC64SLDconst { break @@ -12967,9 +12626,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpPPC64MOVBZload { break @@ -13010,9 +12668,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i1 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o1 := v.Args[1] if o1.Op != OpPPC64SLWconst { break @@ -13069,9 +12726,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i0 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpPPC64MOVBZload { break @@ -13114,9 +12770,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i1 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o1 := v.Args[1] if o1.Op != OpPPC64SLDconst { break @@ -13173,9 +12828,8 @@ func rewriteValuePPC64_OpPPC64OR_10(v *Value) bool { } i0 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpPPC64MOVBZload { break @@ -13229,9 +12883,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i1 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpPPC64SLWconst { break @@ -13287,9 +12940,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i0 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpPPC64SLWconst { break @@ -13345,9 +12997,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i1 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpPPC64SLDconst { break @@ -13403,9 +13054,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i0 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -13463,9 +13113,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -13543,9 +13192,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -13631,9 +13279,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := o0.Args[1] if x0.Op != OpPPC64MOVHZload { break @@ -13704,9 +13351,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s0 := o0.Args[1] if s0.Op != OpPPC64SLWconst { break @@ -13783,9 +13429,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -13863,9 +13508,8 @@ func rewriteValuePPC64_OpPPC64OR_20(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -13957,9 +13601,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := o0.Args[1] if x0.Op != OpPPC64MOVHZload { break @@ -14030,9 +13673,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s0 := o0.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -14109,9 +13751,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -14201,9 +13842,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -14301,9 +13941,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := o0.Args[1] if x0.Op != OpPPC64MOVHBRload { break @@ -14387,7 +14026,7 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { if x0.Type != t { break } - _ = x0.Args[1] + mem := x0.Args[1] x0_0 := x0.Args[0] if x0_0.Op != OpPPC64MOVDaddr { break @@ -14398,7 +14037,6 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { i2 := x0_0.AuxInt s := x0_0.Aux p := x0_0.Args[0] - mem := x0.Args[1] s0 := o0.Args[1] if s0.Op != OpPPC64SLWconst { break @@ -14477,9 +14115,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -14569,9 +14206,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -14669,9 +14305,8 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := o0.Args[1] if x0.Op != OpPPC64MOVHBRload { break @@ -14755,7 +14390,7 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { if x0.Type != t { break } - _ = x0.Args[1] + mem := x0.Args[1] x0_0 := x0.Args[0] if x0_0.Op != OpPPC64MOVDaddr { break @@ -14766,7 +14401,6 @@ func rewriteValuePPC64_OpPPC64OR_30(v *Value) bool { i2 := x0_0.AuxInt s := x0_0.Aux p := x0_0.Args[0] - mem := x0.Args[1] s0 := o0.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -14844,9 +14478,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -14936,9 +14569,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -15043,9 +14675,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s1 := o0.Args[1] if s1.Op != OpPPC64SLWconst { break @@ -15136,7 +14767,7 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { if x2.Type != t { break } - _ = x2.Args[1] + mem := x2.Args[1] x2_0 := x2.Args[0] if x2_0.Op != OpPPC64MOVDaddr { break @@ -15147,7 +14778,6 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { i0 := x2_0.AuxInt s := x2_0.Aux p := x2_0.Args[0] - mem := x2.Args[1] s0 := o0.Args[1] if s0.Op != OpPPC64SLWconst { break @@ -15212,9 +14842,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -15304,9 +14933,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -15411,9 +15039,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s1 := o0.Args[1] if s1.Op != OpPPC64SLDconst { break @@ -15504,7 +15131,7 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { if x2.Type != t { break } - _ = x2.Args[1] + mem := x2.Args[1] x2_0 := x2.Args[0] if x2_0.Op != OpPPC64MOVDaddr { break @@ -15515,7 +15142,6 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { i0 := x2_0.AuxInt s := x2_0.Aux p := x2_0.Args[0] - mem := x2.Args[1] s0 := o0.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -15587,9 +15213,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -15689,9 +15314,8 @@ func rewriteValuePPC64_OpPPC64OR_40(v *Value) bool { } i3 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -15805,9 +15429,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i2 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := o0.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -15908,7 +15531,7 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { if x0.Type != t { break } - _ = x0.Args[1] + mem := x0.Args[1] x0_0 := x0.Args[0] if x0_0.Op != OpPPC64MOVDaddr { break @@ -15919,7 +15542,6 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { i0 := x0_0.AuxInt s := x0_0.Aux p := x0_0.Args[0] - mem := x0.Args[1] s1 := o0.Args[1] if s1.Op != OpPPC64SLDconst { break @@ -16001,9 +15623,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -16103,9 +15724,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i0 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -16213,9 +15833,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := o0.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -16316,7 +15935,7 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { if x0.Type != t { break } - _ = x0.Args[1] + mem := x0.Args[1] x0_0 := x0.Args[0] if x0_0.Op != OpPPC64MOVDaddr { break @@ -16327,7 +15946,6 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { i2 := x0_0.AuxInt s := x0_0.Aux p := x0_0.Args[0] - mem := x0.Args[1] s1 := o0.Args[1] if s1.Op != OpPPC64SLDconst { break @@ -16409,9 +16027,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -16549,9 +16166,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -16689,9 +16305,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -16829,9 +16444,8 @@ func rewriteValuePPC64_OpPPC64OR_50(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -16974,9 +16588,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -17114,9 +16727,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -17254,9 +16866,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -17394,9 +17005,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -17542,9 +17152,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -17682,9 +17291,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -17822,9 +17430,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -17962,9 +17569,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -18110,9 +17716,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -18250,9 +17855,8 @@ func rewriteValuePPC64_OpPPC64OR_60(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -18404,9 +18008,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i4 := x4.AuxInt s := x4.Aux - _ = x4.Args[1] - p := x4.Args[0] mem := x4.Args[1] + p := x4.Args[0] x0 := o3.Args[1] if x0.Op != OpPPC64MOVWZload { break @@ -18537,9 +18140,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s3 := o3.Args[1] if s3.Op != OpPPC64SLDconst { break @@ -18660,9 +18262,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -18809,9 +18410,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -18958,9 +18558,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19107,9 +18706,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19256,9 +18854,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19405,9 +19002,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19554,9 +19150,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19703,9 +19298,8 @@ func rewriteValuePPC64_OpPPC64OR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] o0 := v.Args[1] if o0.Op != OpPPC64OR { break @@ -19866,9 +19460,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] o1 := o0.Args[1] if o1.Op != OpPPC64OR { break @@ -20015,9 +19608,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] o1 := o0.Args[1] if o1.Op != OpPPC64OR { break @@ -20164,9 +19756,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] o1 := o0.Args[1] if o1.Op != OpPPC64OR { break @@ -20313,9 +19904,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] o1 := o0.Args[1] if o1.Op != OpPPC64OR { break @@ -20470,9 +20060,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i2 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o2 := o1.Args[1] if o2.Op != OpPPC64OR { break @@ -20619,9 +20208,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i2 := x2.AuxInt s := x2.Aux - _ = x2.Args[1] - p := x2.Args[0] mem := x2.Args[1] + p := x2.Args[0] o2 := o1.Args[1] if o2.Op != OpPPC64OR { break @@ -20776,9 +20364,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i3 := x3.AuxInt s := x3.Aux - _ = x3.Args[1] - p := x3.Args[0] mem := x3.Args[1] + p := x3.Args[0] x4 := o2.Args[1] if x4.Op != OpPPC64MOVWBRload { break @@ -20919,7 +20506,7 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { if x4.Type != t { break } - _ = x4.Args[1] + mem := x4.Args[1] x4_0 := x4.Args[0] if x4_0.Op != OpPPC64MOVDaddr { break @@ -20929,7 +20516,6 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i4 := x4_0.AuxInt p := x4_0.Args[0] - mem := x4.Args[1] s3 := o2.Args[1] if s3.Op != OpPPC64SLDconst { break @@ -21043,9 +20629,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21195,9 +20780,8 @@ func rewriteValuePPC64_OpPPC64OR_80(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21353,9 +20937,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21505,9 +21088,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21657,9 +21239,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21809,9 +21390,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -21961,9 +21541,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -22113,9 +21692,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -22280,9 +21858,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -22432,9 +22009,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -22584,9 +22160,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -22736,9 +22311,8 @@ func rewriteValuePPC64_OpPPC64OR_90(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -22902,9 +22476,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -23054,9 +22627,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -23214,9 +22786,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i4 := x4.AuxInt s := x4.Aux - _ = x4.Args[1] - p := x4.Args[0] mem := x4.Args[1] + p := x4.Args[0] s0 := o3.Args[1] if s0.Op != OpPPC64SLWconst { break @@ -23367,7 +22938,7 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { if x3.Type != t { break } - _ = x3.Args[1] + mem := x3.Args[1] x3_0 := x3.Args[0] if x3_0.Op != OpPPC64MOVDaddr { break @@ -23378,7 +22949,6 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { i0 := x3_0.AuxInt s := x3_0.Aux p := x3_0.Args[0] - mem := x3.Args[1] s4 := o3.Args[1] if s4.Op != OpPPC64SLDconst { break @@ -23487,9 +23057,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -23639,9 +23208,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -23791,9 +23359,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -23943,9 +23510,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -24095,9 +23661,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -24247,9 +23812,8 @@ func rewriteValuePPC64_OpPPC64OR_100(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -24405,9 +23969,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -24557,9 +24120,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i7 := x7.AuxInt s := x7.Aux - _ = x7.Args[1] - p := x7.Args[0] mem := x7.Args[1] + p := x7.Args[0] o5 := v.Args[1] if o5.Op != OpPPC64OR { break @@ -24724,9 +24286,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -24876,9 +24437,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -25028,9 +24588,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -25180,9 +24739,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i6 := x6.AuxInt s := x6.Aux - _ = x6.Args[1] - p := x6.Args[0] mem := x6.Args[1] + p := x6.Args[0] o4 := o5.Args[1] if o4.Op != OpPPC64OR { break @@ -25340,9 +24898,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -25492,9 +25049,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i5 := x5.AuxInt s := x5.Aux - _ = x5.Args[1] - p := x5.Args[0] mem := x5.Args[1] + p := x5.Args[0] o3 := o4.Args[1] if o3.Op != OpPPC64OR { break @@ -25652,9 +25208,8 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { } i4 := x4.AuxInt s := x4.Aux - _ = x4.Args[1] - p := x4.Args[0] mem := x4.Args[1] + p := x4.Args[0] s0 := o3.Args[1] if s0.Op != OpPPC64SLDconst { break @@ -25805,7 +25360,7 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { if x3.Type != t { break } - _ = x3.Args[1] + mem := x3.Args[1] x3_0 := x3.Args[0] if x3_0.Op != OpPPC64MOVDaddr { break @@ -25816,7 +25371,6 @@ func rewriteValuePPC64_OpPPC64OR_110(v *Value) bool { i0 := x3_0.AuxInt s := x3_0.Aux p := x3_0.Args[0] - mem := x3.Args[1] s4 := o3.Args[1] if s4.Op != OpPPC64SLDconst { break @@ -26428,13 +25982,12 @@ func rewriteValuePPC64_OpPPC64XOR_10(v *Value) bool { // cond: isU32Bit(c) // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpPPC64MOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU32Bit(c)) { break } @@ -26573,9 +26126,8 @@ func rewriteValuePPC64_OpRsh16Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26590,9 +26142,8 @@ func rewriteValuePPC64_OpRsh16Ux16_0(v *Value) bool { // cond: // result: (SRW (ZeroExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -26660,9 +26211,8 @@ func rewriteValuePPC64_OpRsh16Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26677,9 +26227,8 @@ func rewriteValuePPC64_OpRsh16Ux32_0(v *Value) bool { // cond: // result: (SRW (ZeroExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -26764,9 +26313,8 @@ func rewriteValuePPC64_OpRsh16Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26781,9 +26329,8 @@ func rewriteValuePPC64_OpRsh16Ux64_0(v *Value) bool { // cond: // result: (SRW (ZeroExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -26807,9 +26354,8 @@ func rewriteValuePPC64_OpRsh16Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26824,9 +26370,8 @@ func rewriteValuePPC64_OpRsh16Ux8_0(v *Value) bool { // cond: // result: (SRW (ZeroExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt16to32, typ.UInt32) v0.AddArg(x) @@ -26852,9 +26397,8 @@ func rewriteValuePPC64_OpRsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26869,9 +26413,8 @@ func rewriteValuePPC64_OpRsh16x16_0(v *Value) bool { // cond: // result: (SRAW (SignExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -26939,9 +26482,8 @@ func rewriteValuePPC64_OpRsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -26956,9 +26498,8 @@ func rewriteValuePPC64_OpRsh16x32_0(v *Value) bool { // cond: // result: (SRAW (SignExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -27047,9 +26588,8 @@ func rewriteValuePPC64_OpRsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27064,9 +26604,8 @@ func rewriteValuePPC64_OpRsh16x64_0(v *Value) bool { // cond: // result: (SRAW (SignExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -27090,9 +26629,8 @@ func rewriteValuePPC64_OpRsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27107,9 +26645,8 @@ func rewriteValuePPC64_OpRsh16x8_0(v *Value) bool { // cond: // result: (SRAW (SignExt16to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-16] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt16to32, typ.Int32) v0.AddArg(x) @@ -27135,9 +26672,8 @@ func rewriteValuePPC64_OpRsh32Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27150,9 +26686,8 @@ func rewriteValuePPC64_OpRsh32Ux16_0(v *Value) bool { // cond: // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27214,9 +26749,8 @@ func rewriteValuePPC64_OpRsh32Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27229,9 +26763,8 @@ func rewriteValuePPC64_OpRsh32Ux32_0(v *Value) bool { // cond: // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27310,9 +26843,8 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27358,7 +26890,7 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -27366,7 +26898,6 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { if v_1_0.AuxInt != 31 { break } - y := v_1.Args[1] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) @@ -27523,7 +27054,7 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { if v_1_1.Type != typ.UInt { break } - _ = v_1_1.Args[1] + y := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpPPC64MOVDconst { break @@ -27531,7 +27062,6 @@ func rewriteValuePPC64_OpRsh32Ux64_0(v *Value) bool { if v_1_1_0.AuxInt != 31 { break } - y := v_1_1.Args[1] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) @@ -27554,9 +27084,8 @@ func rewriteValuePPC64_OpRsh32Ux64_10(v *Value) bool { // cond: // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27578,9 +27107,8 @@ func rewriteValuePPC64_OpRsh32Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27593,9 +27121,8 @@ func rewriteValuePPC64_OpRsh32Ux8_0(v *Value) bool { // cond: // result: (SRW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27619,9 +27146,8 @@ func rewriteValuePPC64_OpRsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27634,9 +27160,8 @@ func rewriteValuePPC64_OpRsh32x16_0(v *Value) bool { // cond: // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27698,9 +27223,8 @@ func rewriteValuePPC64_OpRsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27713,9 +27237,8 @@ func rewriteValuePPC64_OpRsh32x32_0(v *Value) bool { // cond: // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -27796,9 +27319,8 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -27844,7 +27366,7 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -27852,7 +27374,6 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { if v_1_0.AuxInt != 31 { break } - y := v_1.Args[1] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int32) @@ -28009,7 +27530,7 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { if v_1_1.Type != typ.UInt { break } - _ = v_1_1.Args[1] + y := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpPPC64MOVDconst { break @@ -28017,7 +27538,6 @@ func rewriteValuePPC64_OpRsh32x64_0(v *Value) bool { if v_1_1_0.AuxInt != 31 { break } - y := v_1_1.Args[1] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) @@ -28040,9 +27560,8 @@ func rewriteValuePPC64_OpRsh32x64_10(v *Value) bool { // cond: // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28064,9 +27583,8 @@ func rewriteValuePPC64_OpRsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28079,9 +27597,8 @@ func rewriteValuePPC64_OpRsh32x8_0(v *Value) bool { // cond: // result: (SRAW x (ORN y (MaskIfNotCarry (ADDconstForCarry [-32] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28105,9 +27622,8 @@ func rewriteValuePPC64_OpRsh64Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28120,9 +27636,8 @@ func rewriteValuePPC64_OpRsh64Ux16_0(v *Value) bool { // cond: // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28184,9 +27699,8 @@ func rewriteValuePPC64_OpRsh64Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28199,9 +27713,8 @@ func rewriteValuePPC64_OpRsh64Ux32_0(v *Value) bool { // cond: // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28280,9 +27793,8 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28328,7 +27840,7 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -28336,7 +27848,6 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { if v_1_0.AuxInt != 63 { break } - y := v_1.Args[1] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) @@ -28493,7 +28004,7 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { if v_1_1.Type != typ.UInt { break } - _ = v_1_1.Args[1] + y := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpPPC64MOVDconst { break @@ -28501,7 +28012,6 @@ func rewriteValuePPC64_OpRsh64Ux64_0(v *Value) bool { if v_1_1_0.AuxInt != 63 { break } - y := v_1_1.Args[1] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) @@ -28524,9 +28034,8 @@ func rewriteValuePPC64_OpRsh64Ux64_10(v *Value) bool { // cond: // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28548,9 +28057,8 @@ func rewriteValuePPC64_OpRsh64Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28563,9 +28071,8 @@ func rewriteValuePPC64_OpRsh64Ux8_0(v *Value) bool { // cond: // result: (SRD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28589,9 +28096,8 @@ func rewriteValuePPC64_OpRsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28604,9 +28110,8 @@ func rewriteValuePPC64_OpRsh64x16_0(v *Value) bool { // cond: // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28668,9 +28173,8 @@ func rewriteValuePPC64_OpRsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28683,9 +28187,8 @@ func rewriteValuePPC64_OpRsh64x32_0(v *Value) bool { // cond: // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -28766,9 +28269,8 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -28814,7 +28316,7 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { if v_1.Op != OpPPC64AND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpPPC64MOVDconst { break @@ -28822,7 +28324,6 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { if v_1_0.AuxInt != 63 { break } - y := v_1.Args[1] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ANDconst, typ.Int64) @@ -28979,7 +28480,7 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { if v_1_1.Type != typ.UInt { break } - _ = v_1_1.Args[1] + y := v_1_1.Args[1] v_1_1_0 := v_1_1.Args[0] if v_1_1_0.Op != OpPPC64MOVDconst { break @@ -28987,7 +28488,6 @@ func rewriteValuePPC64_OpRsh64x64_0(v *Value) bool { if v_1_1_0.AuxInt != 63 { break } - y := v_1_1.Args[1] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64SUB, typ.UInt) @@ -29010,9 +28510,8 @@ func rewriteValuePPC64_OpRsh64x64_10(v *Value) bool { // cond: // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -29034,9 +28533,8 @@ func rewriteValuePPC64_OpRsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29049,9 +28547,8 @@ func rewriteValuePPC64_OpRsh64x8_0(v *Value) bool { // cond: // result: (SRAD x (ORN y (MaskIfNotCarry (ADDconstForCarry [-64] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpPPC64ORN, typ.Int64) @@ -29075,9 +28572,8 @@ func rewriteValuePPC64_OpRsh8Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29092,9 +28588,8 @@ func rewriteValuePPC64_OpRsh8Ux16_0(v *Value) bool { // cond: // result: (SRW (ZeroExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -29162,9 +28657,8 @@ func rewriteValuePPC64_OpRsh8Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29179,9 +28673,8 @@ func rewriteValuePPC64_OpRsh8Ux32_0(v *Value) bool { // cond: // result: (SRW (ZeroExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -29266,9 +28759,8 @@ func rewriteValuePPC64_OpRsh8Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29283,9 +28775,8 @@ func rewriteValuePPC64_OpRsh8Ux64_0(v *Value) bool { // cond: // result: (SRW (ZeroExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -29309,9 +28800,8 @@ func rewriteValuePPC64_OpRsh8Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29326,9 +28816,8 @@ func rewriteValuePPC64_OpRsh8Ux8_0(v *Value) bool { // cond: // result: (SRW (ZeroExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRW) v0 := b.NewValue0(v.Pos, OpZeroExt8to32, typ.UInt32) v0.AddArg(x) @@ -29354,9 +28843,8 @@ func rewriteValuePPC64_OpRsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29371,9 +28859,8 @@ func rewriteValuePPC64_OpRsh8x16_0(v *Value) bool { // cond: // result: (SRAW (SignExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt16to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -29441,9 +28928,8 @@ func rewriteValuePPC64_OpRsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29458,9 +28944,8 @@ func rewriteValuePPC64_OpRsh8x32_0(v *Value) bool { // cond: // result: (SRAW (SignExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt32to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -29549,9 +29034,8 @@ func rewriteValuePPC64_OpRsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29566,9 +29050,8 @@ func rewriteValuePPC64_OpRsh8x64_0(v *Value) bool { // cond: // result: (SRAW (SignExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -29592,9 +29075,8 @@ func rewriteValuePPC64_OpRsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -29609,9 +29091,8 @@ func rewriteValuePPC64_OpRsh8x8_0(v *Value) bool { // cond: // result: (SRAW (SignExt8to32 x) (ORN y (MaskIfNotCarry (ADDconstForCarry [-8] (ZeroExt8to64 y))))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SRAW) v0 := b.NewValue0(v.Pos, OpSignExt8to32, typ.Int32) v0.AddArg(x) @@ -29744,10 +29225,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (FMOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -29762,10 +29242,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (FMOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is32BitFloat(val.Type)) { break } @@ -29780,10 +29259,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (FMOVSstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -29798,10 +29276,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && (is64BitInt(val.Type) || isPtr(val.Type))) { break } @@ -29816,10 +29293,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitInt(val.Type)) { break } @@ -29834,10 +29310,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -29852,10 +29327,9 @@ func rewriteValuePPC64_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -29872,9 +29346,8 @@ func rewriteValuePPC64_OpSub16_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v.AddArg(y) @@ -29886,9 +29359,8 @@ func rewriteValuePPC64_OpSub32_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v.AddArg(y) @@ -29900,9 +29372,8 @@ func rewriteValuePPC64_OpSub32F_0(v *Value) bool { // cond: // result: (FSUBS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FSUBS) v.AddArg(x) v.AddArg(y) @@ -29914,9 +29385,8 @@ func rewriteValuePPC64_OpSub64_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v.AddArg(y) @@ -29928,9 +29398,8 @@ func rewriteValuePPC64_OpSub64F_0(v *Value) bool { // cond: // result: (FSUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64FSUB) v.AddArg(x) v.AddArg(y) @@ -29942,9 +29411,8 @@ func rewriteValuePPC64_OpSub8_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v.AddArg(y) @@ -29956,9 +29424,8 @@ func rewriteValuePPC64_OpSubPtr_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64SUB) v.AddArg(x) v.AddArg(y) @@ -30126,10 +29593,9 @@ func rewriteValuePPC64_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpPPC64LoweredWB) v.Aux = fn v.AddArg(destptr) @@ -30143,9 +29609,8 @@ func rewriteValuePPC64_OpXor16_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64XOR) v.AddArg(x) v.AddArg(y) @@ -30157,9 +29622,8 @@ func rewriteValuePPC64_OpXor32_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64XOR) v.AddArg(x) v.AddArg(y) @@ -30171,9 +29635,8 @@ func rewriteValuePPC64_OpXor64_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64XOR) v.AddArg(x) v.AddArg(y) @@ -30185,9 +29648,8 @@ func rewriteValuePPC64_OpXor8_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64XOR) v.AddArg(x) v.AddArg(y) @@ -30203,7 +29665,6 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -30217,9 +29678,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVBstorezero) v.AddArg(destptr) v.AddArg(mem) @@ -30232,9 +29692,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVHstorezero) v.AddArg(destptr) v.AddArg(mem) @@ -30247,9 +29706,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVBstorezero) v.AuxInt = 2 v.AddArg(destptr) @@ -30266,9 +29724,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVWstorezero) v.AddArg(destptr) v.AddArg(mem) @@ -30281,9 +29738,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVBstorezero) v.AuxInt = 4 v.AddArg(destptr) @@ -30300,9 +29756,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVHstorezero) v.AuxInt = 4 v.AddArg(destptr) @@ -30319,9 +29774,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVBstorezero) v.AuxInt = 6 v.AddArg(destptr) @@ -30343,9 +29797,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -30361,9 +29814,8 @@ func rewriteValuePPC64_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpPPC64MOVWstorezero) v.AuxInt = 4 v.AddArg(destptr) @@ -30386,9 +29838,8 @@ func rewriteValuePPC64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -30410,9 +29861,8 @@ func rewriteValuePPC64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -30434,9 +29884,8 @@ func rewriteValuePPC64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -30462,9 +29911,8 @@ func rewriteValuePPC64_OpZero_10(v *Value) bool { break } t := v.Aux - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(t.(*types.Type).Alignment()%4 == 0) { break } @@ -30491,9 +29939,8 @@ func rewriteValuePPC64_OpZero_10(v *Value) bool { // result: (LoweredZero [s] ptr mem) for { s := v.AuxInt - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpPPC64LoweredZero) v.AuxInt = s v.AddArg(ptr) @@ -30746,9 +30193,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -30775,9 +30221,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -30804,9 +30249,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -30938,9 +30382,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -30967,9 +30410,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -30996,9 +30438,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31131,9 +30572,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31160,9 +30600,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31189,9 +30628,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31479,9 +30917,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31508,9 +30945,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31537,9 +30973,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31672,9 +31107,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31701,9 +31135,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -31730,9 +31163,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -32124,9 +31556,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64AND { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -32153,9 +31584,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64OR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } @@ -32182,9 +31612,8 @@ func rewriteBlockPPC64(b *Block) bool { if z.Op != OpPPC64XOR { break } - _ = z.Args[1] - x := z.Args[0] y := z.Args[1] + x := z.Args[0] if !(z.Uses == 1) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index 09b7fa4474..3ee004be99 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -811,9 +811,8 @@ func rewriteValueS390X_OpAdd16_0(v *Value) bool { // cond: // result: (ADDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADDW) v.AddArg(x) v.AddArg(y) @@ -825,9 +824,8 @@ func rewriteValueS390X_OpAdd32_0(v *Value) bool { // cond: // result: (ADDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADDW) v.AddArg(x) v.AddArg(y) @@ -839,9 +837,8 @@ func rewriteValueS390X_OpAdd32F_0(v *Value) bool { // cond: // result: (FADDS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFADDS) v.AddArg(x) v.AddArg(y) @@ -853,9 +850,8 @@ func rewriteValueS390X_OpAdd64_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADD) v.AddArg(x) v.AddArg(y) @@ -867,9 +863,8 @@ func rewriteValueS390X_OpAdd64F_0(v *Value) bool { // cond: // result: (FADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFADD) v.AddArg(x) v.AddArg(y) @@ -881,9 +876,8 @@ func rewriteValueS390X_OpAdd8_0(v *Value) bool { // cond: // result: (ADDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADDW) v.AddArg(x) v.AddArg(y) @@ -895,9 +889,8 @@ func rewriteValueS390X_OpAddPtr_0(v *Value) bool { // cond: // result: (ADD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADD) v.AddArg(x) v.AddArg(y) @@ -922,9 +915,8 @@ func rewriteValueS390X_OpAnd16_0(v *Value) bool { // cond: // result: (ANDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XANDW) v.AddArg(x) v.AddArg(y) @@ -936,9 +928,8 @@ func rewriteValueS390X_OpAnd32_0(v *Value) bool { // cond: // result: (ANDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XANDW) v.AddArg(x) v.AddArg(y) @@ -950,9 +941,8 @@ func rewriteValueS390X_OpAnd64_0(v *Value) bool { // cond: // result: (AND x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XAND) v.AddArg(x) v.AddArg(y) @@ -964,9 +954,8 @@ func rewriteValueS390X_OpAnd8_0(v *Value) bool { // cond: // result: (ANDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XANDW) v.AddArg(x) v.AddArg(y) @@ -978,9 +967,8 @@ func rewriteValueS390X_OpAndB_0(v *Value) bool { // cond: // result: (ANDW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XANDW) v.AddArg(x) v.AddArg(y) @@ -994,10 +982,9 @@ func rewriteValueS390X_OpAtomicAdd32_0(v *Value) bool { // cond: // result: (AddTupleFirst32 val (LAA ptr val mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XAddTupleFirst32) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpS390XLAA, types.NewTuple(typ.UInt32, types.TypeMem)) @@ -1015,10 +1002,9 @@ func rewriteValueS390X_OpAtomicAdd64_0(v *Value) bool { // cond: // result: (AddTupleFirst64 val (LAAG ptr val mem)) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XAddTupleFirst64) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpS390XLAAG, types.NewTuple(typ.UInt64, types.TypeMem)) @@ -1034,11 +1020,10 @@ func rewriteValueS390X_OpAtomicCompareAndSwap32_0(v *Value) bool { // cond: // result: (LoweredAtomicCas32 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpS390XLoweredAtomicCas32) v.AddArg(ptr) v.AddArg(old) @@ -1052,11 +1037,10 @@ func rewriteValueS390X_OpAtomicCompareAndSwap64_0(v *Value) bool { // cond: // result: (LoweredAtomicCas64 ptr old new_ mem) for { - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] old := v.Args[1] new_ := v.Args[2] - mem := v.Args[3] v.reset(OpS390XLoweredAtomicCas64) v.AddArg(ptr) v.AddArg(old) @@ -1070,10 +1054,9 @@ func rewriteValueS390X_OpAtomicExchange32_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange32 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XLoweredAtomicExchange32) v.AddArg(ptr) v.AddArg(val) @@ -1086,10 +1069,9 @@ func rewriteValueS390X_OpAtomicExchange64_0(v *Value) bool { // cond: // result: (LoweredAtomicExchange64 ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XLoweredAtomicExchange64) v.AddArg(ptr) v.AddArg(val) @@ -1102,9 +1084,8 @@ func rewriteValueS390X_OpAtomicLoad32_0(v *Value) bool { // cond: // result: (MOVWZatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpS390XMOVWZatomicload) v.AddArg(ptr) v.AddArg(mem) @@ -1116,9 +1097,8 @@ func rewriteValueS390X_OpAtomicLoad64_0(v *Value) bool { // cond: // result: (MOVDatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpS390XMOVDatomicload) v.AddArg(ptr) v.AddArg(mem) @@ -1130,9 +1110,8 @@ func rewriteValueS390X_OpAtomicLoadPtr_0(v *Value) bool { // cond: // result: (MOVDatomicload ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpS390XMOVDatomicload) v.AddArg(ptr) v.AddArg(mem) @@ -1144,10 +1123,9 @@ func rewriteValueS390X_OpAtomicStore32_0(v *Value) bool { // cond: // result: (MOVWatomicstore ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVWatomicstore) v.AddArg(ptr) v.AddArg(val) @@ -1160,10 +1138,9 @@ func rewriteValueS390X_OpAtomicStore64_0(v *Value) bool { // cond: // result: (MOVDatomicstore ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVDatomicstore) v.AddArg(ptr) v.AddArg(val) @@ -1176,10 +1153,9 @@ func rewriteValueS390X_OpAtomicStorePtrNoWB_0(v *Value) bool { // cond: // result: (MOVDatomicstore ptr val mem) for { - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVDatomicstore) v.AddArg(ptr) v.AddArg(val) @@ -1194,9 +1170,8 @@ func rewriteValueS390X_OpAvg64u_0(v *Value) bool { // result: (ADD (SRDconst (SUB x y) [1]) y) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XADD) v0 := b.NewValue0(v.Pos, OpS390XSRDconst, t) v0.AuxInt = 1 @@ -1267,10 +1242,9 @@ func rewriteValueS390X_OpClosureCall_0(v *Value) bool { // result: (CALLclosure [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpS390XCALLclosure) v.AuxInt = argwid v.AddArg(entry) @@ -1605,9 +1579,8 @@ func rewriteValueS390X_OpDiv16_0(v *Value) bool { // cond: // result: (DIVW (MOVHreg x) (MOVHreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -1625,9 +1598,8 @@ func rewriteValueS390X_OpDiv16u_0(v *Value) bool { // cond: // result: (DIVWU (MOVHZreg x) (MOVHZreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVWU) v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v0.AddArg(x) @@ -1645,9 +1617,8 @@ func rewriteValueS390X_OpDiv32_0(v *Value) bool { // cond: // result: (DIVW (MOVWreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVW) v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) v0.AddArg(x) @@ -1661,9 +1632,8 @@ func rewriteValueS390X_OpDiv32F_0(v *Value) bool { // cond: // result: (FDIVS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFDIVS) v.AddArg(x) v.AddArg(y) @@ -1677,9 +1647,8 @@ func rewriteValueS390X_OpDiv32u_0(v *Value) bool { // cond: // result: (DIVWU (MOVWZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVWU) v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) v0.AddArg(x) @@ -1693,9 +1662,8 @@ func rewriteValueS390X_OpDiv64_0(v *Value) bool { // cond: // result: (DIVD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVD) v.AddArg(x) v.AddArg(y) @@ -1707,9 +1675,8 @@ func rewriteValueS390X_OpDiv64F_0(v *Value) bool { // cond: // result: (FDIV x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFDIV) v.AddArg(x) v.AddArg(y) @@ -1721,9 +1688,8 @@ func rewriteValueS390X_OpDiv64u_0(v *Value) bool { // cond: // result: (DIVDU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVDU) v.AddArg(x) v.AddArg(y) @@ -1737,9 +1703,8 @@ func rewriteValueS390X_OpDiv8_0(v *Value) bool { // cond: // result: (DIVW (MOVBreg x) (MOVBreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -1757,9 +1722,8 @@ func rewriteValueS390X_OpDiv8u_0(v *Value) bool { // cond: // result: (DIVWU (MOVBZreg x) (MOVBZreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XDIVWU) v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) v0.AddArg(x) @@ -1777,9 +1741,8 @@ func rewriteValueS390X_OpEq16_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1805,9 +1768,8 @@ func rewriteValueS390X_OpEq32_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1829,9 +1791,8 @@ func rewriteValueS390X_OpEq32F_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1853,9 +1814,8 @@ func rewriteValueS390X_OpEq64_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1877,9 +1837,8 @@ func rewriteValueS390X_OpEq64F_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1901,9 +1860,8 @@ func rewriteValueS390X_OpEq8_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1929,9 +1887,8 @@ func rewriteValueS390X_OpEqB_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1957,9 +1914,8 @@ func rewriteValueS390X_OpEqPtr_0(v *Value) bool { // cond: // result: (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDEQ) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -1993,9 +1949,8 @@ func rewriteValueS390X_OpGeq16_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2021,9 +1976,8 @@ func rewriteValueS390X_OpGeq16U_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2049,9 +2003,8 @@ func rewriteValueS390X_OpGeq32_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2073,9 +2026,8 @@ func rewriteValueS390X_OpGeq32F_0(v *Value) bool { // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGEnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2097,9 +2049,8 @@ func rewriteValueS390X_OpGeq32U_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2121,9 +2072,8 @@ func rewriteValueS390X_OpGeq64_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2145,9 +2095,8 @@ func rewriteValueS390X_OpGeq64F_0(v *Value) bool { // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGEnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2169,9 +2118,8 @@ func rewriteValueS390X_OpGeq64U_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2193,9 +2141,8 @@ func rewriteValueS390X_OpGeq8_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2221,9 +2168,8 @@ func rewriteValueS390X_OpGeq8U_0(v *Value) bool { // cond: // result: (MOVDGE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2287,9 +2233,8 @@ func rewriteValueS390X_OpGreater16_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2315,9 +2260,8 @@ func rewriteValueS390X_OpGreater16U_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2343,9 +2287,8 @@ func rewriteValueS390X_OpGreater32_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2367,9 +2310,8 @@ func rewriteValueS390X_OpGreater32F_0(v *Value) bool { // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGTnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2391,9 +2333,8 @@ func rewriteValueS390X_OpGreater32U_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2415,9 +2356,8 @@ func rewriteValueS390X_OpGreater64_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2439,9 +2379,8 @@ func rewriteValueS390X_OpGreater64F_0(v *Value) bool { // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGTnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2463,9 +2402,8 @@ func rewriteValueS390X_OpGreater64U_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2487,9 +2425,8 @@ func rewriteValueS390X_OpGreater8_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2515,9 +2452,8 @@ func rewriteValueS390X_OpGreater8U_0(v *Value) bool { // cond: // result: (MOVDGT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2543,9 +2479,8 @@ func rewriteValueS390X_OpHmul32_0(v *Value) bool { // cond: // result: (SRDconst [32] (MULLD (MOVWreg x) (MOVWreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRDconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) @@ -2566,9 +2501,8 @@ func rewriteValueS390X_OpHmul32u_0(v *Value) bool { // cond: // result: (SRDconst [32] (MULLD (MOVWZreg x) (MOVWZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRDconst) v.AuxInt = 32 v0 := b.NewValue0(v.Pos, OpS390XMULLD, typ.Int64) @@ -2587,9 +2521,8 @@ func rewriteValueS390X_OpHmul64_0(v *Value) bool { // cond: // result: (MULHD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULHD) v.AddArg(x) v.AddArg(y) @@ -2601,9 +2534,8 @@ func rewriteValueS390X_OpHmul64u_0(v *Value) bool { // cond: // result: (MULHDU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULHDU) v.AddArg(x) v.AddArg(y) @@ -2619,9 +2551,8 @@ func rewriteValueS390X_OpITab_0(v *Value) bool { if v_0.Op != OpLoad { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] mem := v_0.Args[1] + ptr := v_0.Args[0] v.reset(OpS390XMOVDload) v.AddArg(ptr) v.AddArg(mem) @@ -2635,9 +2566,8 @@ func rewriteValueS390X_OpInterCall_0(v *Value) bool { // result: (CALLinter [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpS390XCALLinter) v.AuxInt = argwid v.AddArg(entry) @@ -2652,9 +2582,8 @@ func rewriteValueS390X_OpIsInBounds_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2698,9 +2627,8 @@ func rewriteValueS390X_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU idx len)) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2722,9 +2650,8 @@ func rewriteValueS390X_OpLeq16_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2750,9 +2677,8 @@ func rewriteValueS390X_OpLeq16U_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2778,9 +2704,8 @@ func rewriteValueS390X_OpLeq32_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2802,9 +2727,8 @@ func rewriteValueS390X_OpLeq32F_0(v *Value) bool { // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGEnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2826,9 +2750,8 @@ func rewriteValueS390X_OpLeq32U_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2850,9 +2773,8 @@ func rewriteValueS390X_OpLeq64_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2874,9 +2796,8 @@ func rewriteValueS390X_OpLeq64F_0(v *Value) bool { // cond: // result: (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGEnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2898,9 +2819,8 @@ func rewriteValueS390X_OpLeq64U_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2922,9 +2842,8 @@ func rewriteValueS390X_OpLeq8_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2950,9 +2869,8 @@ func rewriteValueS390X_OpLeq8U_0(v *Value) bool { // cond: // result: (MOVDLE (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -2978,9 +2896,8 @@ func rewriteValueS390X_OpLess16_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3006,9 +2923,8 @@ func rewriteValueS390X_OpLess16U_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVHZreg x) (MOVHZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3034,9 +2950,8 @@ func rewriteValueS390X_OpLess32_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3058,9 +2973,8 @@ func rewriteValueS390X_OpLess32F_0(v *Value) bool { // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMPS y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGTnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3082,9 +2996,8 @@ func rewriteValueS390X_OpLess32U_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3106,9 +3019,8 @@ func rewriteValueS390X_OpLess64_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3130,9 +3042,8 @@ func rewriteValueS390X_OpLess64F_0(v *Value) bool { // cond: // result: (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) (FCMP y x)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGTnoinv) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3154,9 +3065,8 @@ func rewriteValueS390X_OpLess64U_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPU x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3178,9 +3088,8 @@ func rewriteValueS390X_OpLess8_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3206,9 +3115,8 @@ func rewriteValueS390X_OpLess8U_0(v *Value) bool { // cond: // result: (MOVDLT (MOVDconst [0]) (MOVDconst [1]) (CMPWU (MOVBZreg x) (MOVBZreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDLT) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -3233,9 +3141,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) || isPtr(t)) { break } @@ -3249,9 +3156,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVWload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && isSigned(t)) { break } @@ -3265,9 +3171,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVWZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitInt(t) && !isSigned(t)) { break } @@ -3281,9 +3186,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVHload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && isSigned(t)) { break } @@ -3297,9 +3201,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVHZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is16BitInt(t) && !isSigned(t)) { break } @@ -3313,9 +3216,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVBload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is8BitInt(t) && isSigned(t)) { break } @@ -3329,9 +3231,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (MOVBZload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsBoolean() || (is8BitInt(t) && !isSigned(t))) { break } @@ -3345,9 +3246,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (FMOVSload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -3361,9 +3261,8 @@ func rewriteValueS390X_OpLoad_0(v *Value) bool { // result: (FMOVDload ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -3395,9 +3294,8 @@ func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3411,9 +3309,8 @@ func rewriteValueS390X_OpLsh16x16_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3439,9 +3336,8 @@ func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3455,9 +3351,8 @@ func rewriteValueS390X_OpLsh16x32_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3481,9 +3376,8 @@ func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3497,9 +3391,8 @@ func rewriteValueS390X_OpLsh16x64_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3523,9 +3416,8 @@ func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3539,9 +3431,8 @@ func rewriteValueS390X_OpLsh16x8_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3567,9 +3458,8 @@ func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3583,9 +3473,8 @@ func rewriteValueS390X_OpLsh32x16_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3611,9 +3500,8 @@ func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3627,9 +3515,8 @@ func rewriteValueS390X_OpLsh32x32_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3653,9 +3540,8 @@ func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3669,9 +3555,8 @@ func rewriteValueS390X_OpLsh32x64_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3695,9 +3580,8 @@ func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3711,9 +3595,8 @@ func rewriteValueS390X_OpLsh32x8_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3739,9 +3622,8 @@ func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3755,9 +3637,8 @@ func rewriteValueS390X_OpLsh64x16_0(v *Value) bool { // result: (MOVDGE (SLD x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLD, t) @@ -3783,9 +3664,8 @@ func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3799,9 +3679,8 @@ func rewriteValueS390X_OpLsh64x32_0(v *Value) bool { // result: (MOVDGE (SLD x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLD, t) @@ -3825,9 +3704,8 @@ func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3841,9 +3719,8 @@ func rewriteValueS390X_OpLsh64x64_0(v *Value) bool { // result: (MOVDGE (SLD x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLD, t) @@ -3867,9 +3744,8 @@ func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3883,9 +3759,8 @@ func rewriteValueS390X_OpLsh64x8_0(v *Value) bool { // result: (MOVDGE (SLD x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLD, t) @@ -3911,9 +3786,8 @@ func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3927,9 +3801,8 @@ func rewriteValueS390X_OpLsh8x16_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3955,9 +3828,8 @@ func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -3971,9 +3843,8 @@ func rewriteValueS390X_OpLsh8x32_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -3997,9 +3868,8 @@ func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4013,9 +3883,8 @@ func rewriteValueS390X_OpLsh8x64_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -4039,9 +3908,8 @@ func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -4055,9 +3923,8 @@ func rewriteValueS390X_OpLsh8x8_0(v *Value) bool { // result: (MOVDGE (SLW x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSLW, t) @@ -4083,9 +3950,8 @@ func rewriteValueS390X_OpMod16_0(v *Value) bool { // cond: // result: (MODW (MOVHreg x) (MOVHreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -4103,9 +3969,8 @@ func rewriteValueS390X_OpMod16u_0(v *Value) bool { // cond: // result: (MODWU (MOVHZreg x) (MOVHZreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODWU) v0 := b.NewValue0(v.Pos, OpS390XMOVHZreg, typ.UInt64) v0.AddArg(x) @@ -4123,9 +3988,8 @@ func rewriteValueS390X_OpMod32_0(v *Value) bool { // cond: // result: (MODW (MOVWreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODW) v0 := b.NewValue0(v.Pos, OpS390XMOVWreg, typ.Int64) v0.AddArg(x) @@ -4141,9 +4005,8 @@ func rewriteValueS390X_OpMod32u_0(v *Value) bool { // cond: // result: (MODWU (MOVWZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODWU) v0 := b.NewValue0(v.Pos, OpS390XMOVWZreg, typ.UInt64) v0.AddArg(x) @@ -4157,9 +4020,8 @@ func rewriteValueS390X_OpMod64_0(v *Value) bool { // cond: // result: (MODD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODD) v.AddArg(x) v.AddArg(y) @@ -4171,9 +4033,8 @@ func rewriteValueS390X_OpMod64u_0(v *Value) bool { // cond: // result: (MODDU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODDU) v.AddArg(x) v.AddArg(y) @@ -4187,9 +4048,8 @@ func rewriteValueS390X_OpMod8_0(v *Value) bool { // cond: // result: (MODW (MOVBreg x) (MOVBreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -4207,9 +4067,8 @@ func rewriteValueS390X_OpMod8u_0(v *Value) bool { // cond: // result: (MODWU (MOVBZreg x) (MOVBZreg y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMODWU) v0 := b.NewValue0(v.Pos, OpS390XMOVBZreg, typ.UInt64) v0.AddArg(x) @@ -4230,7 +4089,6 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -4244,10 +4102,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpS390XMOVBZload, typ.UInt8) @@ -4264,10 +4121,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVHstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpS390XMOVHZload, typ.UInt16) @@ -4284,10 +4140,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVWstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpS390XMOVWZload, typ.UInt32) @@ -4304,10 +4159,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVDstore) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpS390XMOVDload, typ.UInt64) @@ -4324,10 +4178,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVDstore) v.AuxInt = 8 v.AddArg(dst) @@ -4353,10 +4206,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 24 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVDstore) v.AuxInt = 16 v.AddArg(dst) @@ -4391,10 +4243,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AuxInt = 2 v.AddArg(dst) @@ -4420,10 +4271,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AuxInt = 4 v.AddArg(dst) @@ -4449,10 +4299,9 @@ func rewriteValueS390X_OpMove_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVHstore) v.AuxInt = 4 v.AddArg(dst) @@ -4483,10 +4332,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AuxInt = 6 v.AddArg(dst) @@ -4519,10 +4367,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { // result: (MVC [makeValAndOff(s, 0)] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 0 && s <= 256) { break } @@ -4538,10 +4385,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { // result: (MVC [makeValAndOff(s-256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 256 && s <= 512) { break } @@ -4562,10 +4408,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { // result: (MVC [makeValAndOff(s-512, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem))) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 512 && s <= 768) { break } @@ -4591,10 +4436,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { // result: (MVC [makeValAndOff(s-768, 768)] dst src (MVC [makeValAndOff(256, 512)] dst src (MVC [makeValAndOff(256, 256)] dst src (MVC [makeValAndOff(256, 0)] dst src mem)))) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 768 && s <= 1024) { break } @@ -4625,10 +4469,9 @@ func rewriteValueS390X_OpMove_10(v *Value) bool { // result: (LoweredMove [s%256] dst src (ADD src (MOVDconst [(s/256)*256])) mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 1024) { break } @@ -4652,9 +4495,8 @@ func rewriteValueS390X_OpMul16_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULLW) v.AddArg(x) v.AddArg(y) @@ -4666,9 +4508,8 @@ func rewriteValueS390X_OpMul32_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULLW) v.AddArg(x) v.AddArg(y) @@ -4680,9 +4521,8 @@ func rewriteValueS390X_OpMul32F_0(v *Value) bool { // cond: // result: (FMULS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFMULS) v.AddArg(x) v.AddArg(y) @@ -4694,9 +4534,8 @@ func rewriteValueS390X_OpMul64_0(v *Value) bool { // cond: // result: (MULLD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULLD) v.AddArg(x) v.AddArg(y) @@ -4708,9 +4547,8 @@ func rewriteValueS390X_OpMul64F_0(v *Value) bool { // cond: // result: (FMUL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFMUL) v.AddArg(x) v.AddArg(y) @@ -4722,9 +4560,8 @@ func rewriteValueS390X_OpMul8_0(v *Value) bool { // cond: // result: (MULLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMULLW) v.AddArg(x) v.AddArg(y) @@ -4804,9 +4641,8 @@ func rewriteValueS390X_OpNeq16_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVHreg x) (MOVHreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4832,9 +4668,8 @@ func rewriteValueS390X_OpNeq32_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4856,9 +4691,8 @@ func rewriteValueS390X_OpNeq32F_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMPS x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4880,9 +4714,8 @@ func rewriteValueS390X_OpNeq64_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4904,9 +4737,8 @@ func rewriteValueS390X_OpNeq64F_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (FCMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4928,9 +4760,8 @@ func rewriteValueS390X_OpNeq8_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4956,9 +4787,8 @@ func rewriteValueS390X_OpNeqB_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMPW (MOVBreg x) (MOVBreg y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -4984,9 +4814,8 @@ func rewriteValueS390X_OpNeqPtr_0(v *Value) bool { // cond: // result: (MOVDNE (MOVDconst [0]) (MOVDconst [1]) (CMP x y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDNE) v0 := b.NewValue0(v.Pos, OpS390XMOVDconst, typ.UInt64) v0.AuxInt = 0 @@ -5006,9 +4835,8 @@ func rewriteValueS390X_OpNilCheck_0(v *Value) bool { // cond: // result: (LoweredNilCheck ptr mem) for { - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpS390XLoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -5077,9 +4905,8 @@ func rewriteValueS390X_OpOr16_0(v *Value) bool { // cond: // result: (ORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XORW) v.AddArg(x) v.AddArg(y) @@ -5091,9 +4918,8 @@ func rewriteValueS390X_OpOr32_0(v *Value) bool { // cond: // result: (ORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XORW) v.AddArg(x) v.AddArg(y) @@ -5105,9 +4931,8 @@ func rewriteValueS390X_OpOr64_0(v *Value) bool { // cond: // result: (OR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XOR) v.AddArg(x) v.AddArg(y) @@ -5119,9 +4944,8 @@ func rewriteValueS390X_OpOr8_0(v *Value) bool { // cond: // result: (ORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XORW) v.AddArg(x) v.AddArg(y) @@ -5133,9 +4957,8 @@ func rewriteValueS390X_OpOrB_0(v *Value) bool { // cond: // result: (ORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XORW) v.AddArg(x) v.AddArg(y) @@ -5213,9 +5036,8 @@ func rewriteValueS390X_OpRotateLeft32_0(v *Value) bool { // cond: // result: (RLL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XRLL) v.AddArg(x) v.AddArg(y) @@ -5227,9 +5049,8 @@ func rewriteValueS390X_OpRotateLeft64_0(v *Value) bool { // cond: // result: (RLLG x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XRLLG) v.AddArg(x) v.AddArg(y) @@ -5289,9 +5110,8 @@ func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5307,9 +5127,8 @@ func rewriteValueS390X_OpRsh16Ux16_0(v *Value) bool { // result: (MOVDGE (SRW (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5337,9 +5156,8 @@ func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5355,9 +5173,8 @@ func rewriteValueS390X_OpRsh16Ux32_0(v *Value) bool { // result: (MOVDGE (SRW (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5383,9 +5200,8 @@ func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5401,9 +5217,8 @@ func rewriteValueS390X_OpRsh16Ux64_0(v *Value) bool { // result: (MOVDGE (SRW (MOVHZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5429,9 +5244,8 @@ func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVHZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5447,9 +5261,8 @@ func rewriteValueS390X_OpRsh16Ux8_0(v *Value) bool { // result: (MOVDGE (SRW (MOVHZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5477,9 +5290,8 @@ func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5494,9 +5306,8 @@ func rewriteValueS390X_OpRsh16x16_0(v *Value) bool { // cond: // result: (SRAW (MOVHreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVHZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -5523,9 +5334,8 @@ func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5540,9 +5350,8 @@ func rewriteValueS390X_OpRsh16x32_0(v *Value) bool { // cond: // result: (SRAW (MOVHreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -5567,9 +5376,8 @@ func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5584,9 +5392,8 @@ func rewriteValueS390X_OpRsh16x64_0(v *Value) bool { // cond: // result: (SRAW (MOVHreg x) (MOVDGE y (MOVDconst [63]) (CMPUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -5611,9 +5418,8 @@ func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVHreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5628,9 +5434,8 @@ func rewriteValueS390X_OpRsh16x8_0(v *Value) bool { // cond: // result: (SRAW (MOVHreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVBZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVHreg, typ.Int64) v0.AddArg(x) @@ -5657,9 +5462,8 @@ func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5673,9 +5477,8 @@ func rewriteValueS390X_OpRsh32Ux16_0(v *Value) bool { // result: (MOVDGE (SRW x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5701,9 +5504,8 @@ func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5717,9 +5519,8 @@ func rewriteValueS390X_OpRsh32Ux32_0(v *Value) bool { // result: (MOVDGE (SRW x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5743,9 +5544,8 @@ func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5759,9 +5559,8 @@ func rewriteValueS390X_OpRsh32Ux64_0(v *Value) bool { // result: (MOVDGE (SRW x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5785,9 +5584,8 @@ func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5801,9 +5599,8 @@ func rewriteValueS390X_OpRsh32Ux8_0(v *Value) bool { // result: (MOVDGE (SRW x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -5829,9 +5626,8 @@ func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5844,9 +5640,8 @@ func rewriteValueS390X_OpRsh32x16_0(v *Value) bool { // cond: // result: (SRAW x (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVHZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -5870,9 +5665,8 @@ func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5885,9 +5679,8 @@ func rewriteValueS390X_OpRsh32x32_0(v *Value) bool { // cond: // result: (SRAW x (MOVDGE y (MOVDconst [63]) (CMPWUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -5909,9 +5702,8 @@ func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5924,9 +5716,8 @@ func rewriteValueS390X_OpRsh32x64_0(v *Value) bool { // cond: // result: (SRAW x (MOVDGE y (MOVDconst [63]) (CMPUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -5949,9 +5740,8 @@ func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -5964,9 +5754,8 @@ func rewriteValueS390X_OpRsh32x8_0(v *Value) bool { // cond: // result: (SRAW x (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVBZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -5991,9 +5780,8 @@ func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6007,9 +5795,8 @@ func rewriteValueS390X_OpRsh64Ux16_0(v *Value) bool { // result: (MOVDGE (SRD x y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRD, t) @@ -6035,9 +5822,8 @@ func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6051,9 +5837,8 @@ func rewriteValueS390X_OpRsh64Ux32_0(v *Value) bool { // result: (MOVDGE (SRD x y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRD, t) @@ -6077,9 +5862,8 @@ func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6093,9 +5877,8 @@ func rewriteValueS390X_OpRsh64Ux64_0(v *Value) bool { // result: (MOVDGE (SRD x y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRD, t) @@ -6119,9 +5902,8 @@ func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6135,9 +5917,8 @@ func rewriteValueS390X_OpRsh64Ux8_0(v *Value) bool { // result: (MOVDGE (SRD x y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRD, t) @@ -6163,9 +5944,8 @@ func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6178,9 +5958,8 @@ func rewriteValueS390X_OpRsh64x16_0(v *Value) bool { // cond: // result: (SRAD x (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVHZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -6204,9 +5983,8 @@ func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6219,9 +5997,8 @@ func rewriteValueS390X_OpRsh64x32_0(v *Value) bool { // cond: // result: (SRAD x (MOVDGE y (MOVDconst [63]) (CMPWUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -6243,9 +6020,8 @@ func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6258,9 +6034,8 @@ func rewriteValueS390X_OpRsh64x64_0(v *Value) bool { // cond: // result: (SRAD x (MOVDGE y (MOVDconst [63]) (CMPUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -6283,9 +6058,8 @@ func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAD x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6298,9 +6072,8 @@ func rewriteValueS390X_OpRsh64x8_0(v *Value) bool { // cond: // result: (SRAD x (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVBZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XMOVDGE, y.Type) @@ -6325,9 +6098,8 @@ func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6343,9 +6115,8 @@ func rewriteValueS390X_OpRsh8Ux16_0(v *Value) bool { // result: (MOVDGE (SRW (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVHZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -6373,9 +6144,8 @@ func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6391,9 +6161,8 @@ func rewriteValueS390X_OpRsh8Ux32_0(v *Value) bool { // result: (MOVDGE (SRW (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -6419,9 +6188,8 @@ func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6437,9 +6205,8 @@ func rewriteValueS390X_OpRsh8Ux64_0(v *Value) bool { // result: (MOVDGE (SRW (MOVBZreg x) y) (MOVDconst [0]) (CMPUconst y [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -6465,9 +6232,8 @@ func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRW (MOVBZreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6483,9 +6249,8 @@ func rewriteValueS390X_OpRsh8Ux8_0(v *Value) bool { // result: (MOVDGE (SRW (MOVBZreg x) y) (MOVDconst [0]) (CMPWUconst (MOVBZreg y) [64])) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XMOVDGE) v.Type = t v0 := b.NewValue0(v.Pos, OpS390XSRW, t) @@ -6513,9 +6278,8 @@ func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6530,9 +6294,8 @@ func rewriteValueS390X_OpRsh8x16_0(v *Value) bool { // cond: // result: (SRAW (MOVBreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVHZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -6559,9 +6322,8 @@ func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6576,9 +6338,8 @@ func rewriteValueS390X_OpRsh8x32_0(v *Value) bool { // cond: // result: (SRAW (MOVBreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -6603,9 +6364,8 @@ func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6620,9 +6380,8 @@ func rewriteValueS390X_OpRsh8x64_0(v *Value) bool { // cond: // result: (SRAW (MOVBreg x) (MOVDGE y (MOVDconst [63]) (CMPUconst y [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -6647,9 +6406,8 @@ func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { // cond: shiftIsBounded(v) // result: (SRAW (MOVBreg x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] if !(shiftIsBounded(v)) { break } @@ -6664,9 +6422,8 @@ func rewriteValueS390X_OpRsh8x8_0(v *Value) bool { // cond: // result: (SRAW (MOVBreg x) (MOVDGE y (MOVDconst [63]) (CMPWUconst (MOVBZreg y) [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSRAW) v0 := b.NewValue0(v.Pos, OpS390XMOVBreg, typ.Int64) v0.AddArg(x) @@ -6710,13 +6467,12 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { // cond: is32Bit(c) // result: (ADDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -6806,7 +6562,7 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { // cond: ptr.Op != OpSB && idx.Op != OpSB // result: (MOVDaddridx [c] {s} ptr idx) for { - _ = v.Args[1] + idx := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -6814,7 +6570,6 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { c := v_0.AuxInt s := v_0.Aux ptr := v_0.Args[0] - idx := v.Args[1] if !(ptr.Op != OpSB && idx.Op != OpSB) { break } @@ -6845,13 +6600,12 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XNEG { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpS390XSUB) v.AddArg(x) v.AddArg(y) @@ -6870,9 +6624,8 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -6890,17 +6643,15 @@ func rewriteValueS390X_OpS390XADD_0(v *Value) bool { // result: (ADDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -6921,17 +6672,15 @@ func rewriteValueS390X_OpS390XADD_10(v *Value) bool { // result: (ADDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -6957,9 +6706,8 @@ func rewriteValueS390X_OpS390XADD_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -6995,13 +6743,12 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { // cond: // result: (ADDWconst [int64(int32(c))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XADDWconst) v.AuxInt = int64(int32(c)) v.AddArg(x) @@ -7081,13 +6828,12 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { // cond: // result: (SUBW x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XNEGW { break } y := v_0.Args[0] - x := v.Args[1] v.reset(OpS390XSUBW) v.AddArg(x) v.AddArg(y) @@ -7106,9 +6852,8 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7126,17 +6871,15 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7154,17 +6897,15 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7190,9 +6931,8 @@ func rewriteValueS390X_OpS390XADDW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7221,9 +6961,8 @@ func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7241,17 +6980,15 @@ func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7269,17 +7006,15 @@ func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { // result: (ADDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7305,9 +7040,8 @@ func rewriteValueS390X_OpS390XADDW_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7376,7 +7110,7 @@ func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -7384,7 +7118,6 @@ func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -7402,7 +7135,7 @@ func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -7411,7 +7144,6 @@ func rewriteValueS390X_OpS390XADDWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -7482,9 +7214,8 @@ func rewriteValueS390X_OpS390XADDconst_0(v *Value) bool { } d := v_0.AuxInt s := v_0.Aux - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] if !(is20Bit(c + d)) { break } @@ -7584,7 +7315,7 @@ func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -7592,7 +7323,6 @@ func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -7610,7 +7340,7 @@ func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -7619,7 +7349,6 @@ func rewriteValueS390X_OpS390XADDload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -7659,13 +7388,12 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // cond: is32Bit(c) && c < 0 // result: (ANDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c) && c < 0) { break } @@ -7699,13 +7427,12 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // cond: is32Bit(c) && c >= 0 // result: (MOVWZreg (ANDWconst [int64(int32(c))] x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c) && c >= 0) { break } @@ -7737,7 +7464,7 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // cond: // result: (MOVBZreg x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -7745,7 +7472,6 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { if v_0.AuxInt != 0xFF { break } - x := v.Args[1] v.reset(OpS390XMOVBZreg) v.AddArg(x) return true @@ -7771,7 +7497,7 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // cond: // result: (MOVHZreg x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -7779,7 +7505,6 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { if v_0.AuxInt != 0xFFFF { break } - x := v.Args[1] v.reset(OpS390XMOVHZreg) v.AddArg(x) return true @@ -7805,7 +7530,7 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { // cond: // result: (MOVWZreg x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -7813,7 +7538,6 @@ func rewriteValueS390X_OpS390XAND_0(v *Value) bool { if v_0.AuxInt != 0xFFFFFFFF { break } - x := v.Args[1] v.reset(OpS390XMOVWZreg) v.AddArg(x) return true @@ -7863,9 +7587,8 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -7886,9 +7609,8 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7906,17 +7628,15 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { // result: (ANDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7934,17 +7654,15 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { // result: (ANDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -7970,9 +7688,8 @@ func rewriteValueS390X_OpS390XAND_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8008,13 +7725,12 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // cond: // result: (ANDWconst [int64(int32(c))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XANDWconst) v.AuxInt = int64(int32(c)) v.AddArg(x) @@ -8024,9 +7740,8 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -8047,9 +7762,8 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8067,17 +7781,15 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8095,17 +7807,15 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8131,9 +7841,8 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8159,9 +7868,8 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8179,17 +7887,15 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8207,17 +7913,15 @@ func rewriteValueS390X_OpS390XANDW_0(v *Value) bool { // result: (ANDWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8246,9 +7950,8 @@ func rewriteValueS390X_OpS390XANDW_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -8353,7 +8056,7 @@ func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -8361,7 +8064,6 @@ func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -8379,7 +8081,7 @@ func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -8388,7 +8090,6 @@ func rewriteValueS390X_OpS390XANDWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -8500,7 +8201,7 @@ func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -8508,7 +8209,6 @@ func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -8526,7 +8226,7 @@ func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -8535,7 +8235,6 @@ func rewriteValueS390X_OpS390XANDload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -8574,13 +8273,12 @@ func rewriteValueS390X_OpS390XCMP_0(v *Value) bool { // cond: is32Bit(c) // result: (InvertFlags (CMPconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -8618,13 +8316,12 @@ func rewriteValueS390X_OpS390XCMPU_0(v *Value) bool { // cond: isU32Bit(c) // result: (InvertFlags (CMPUconst x [int64(int32(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU32Bit(c)) { break } @@ -8844,13 +8541,12 @@ func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { // cond: // result: (InvertFlags (CMPWconst x [int64(int32(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) v0.AuxInt = int64(int32(c)) @@ -8894,13 +8590,12 @@ func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { // cond: // result: (CMPW x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVWreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpS390XCMPW) v.AddArg(x) v.AddArg(y) @@ -8910,13 +8605,12 @@ func rewriteValueS390X_OpS390XCMPW_0(v *Value) bool { // cond: // result: (CMPW x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVWZreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpS390XCMPW) v.AddArg(x) v.AddArg(y) @@ -8946,13 +8640,12 @@ func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { // cond: // result: (InvertFlags (CMPWUconst x [int64(int32(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XInvertFlags) v0 := b.NewValue0(v.Pos, OpS390XCMPWUconst, types.TypeFlags) v0.AuxInt = int64(int32(c)) @@ -8996,13 +8689,12 @@ func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { // cond: // result: (CMPWU x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVWreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpS390XCMPWU) v.AddArg(x) v.AddArg(y) @@ -9012,13 +8704,12 @@ func rewriteValueS390X_OpS390XCMPWU_0(v *Value) bool { // cond: // result: (CMPWU x y) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVWZreg { break } x := v_0.Args[0] - y := v.Args[1] v.reset(OpS390XCMPWU) v.AddArg(x) v.AddArg(y) @@ -9577,15 +9268,13 @@ func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { // cond: // result: (FMADD x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XFMUL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpS390XFMADD) v.AddArg(x) v.AddArg(y) @@ -9602,9 +9291,8 @@ func rewriteValueS390X_OpS390XFADD_0(v *Value) bool { if v_1.Op != OpS390XFMUL { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpS390XFMADD) v.AddArg(x) v.AddArg(y) @@ -9618,15 +9306,13 @@ func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { // cond: // result: (FMADDS x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XFMULS { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpS390XFMADDS) v.AddArg(x) v.AddArg(y) @@ -9643,9 +9329,8 @@ func rewriteValueS390X_OpS390XFADDS_0(v *Value) bool { if v_1.Op != OpS390XFMULS { break } - _ = v_1.Args[1] - y := v_1.Args[0] z := v_1.Args[1] + y := v_1.Args[0] v.reset(OpS390XFMADDS) v.AddArg(x) v.AddArg(y) @@ -9718,14 +9403,13 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -9742,7 +9426,7 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -9750,7 +9434,6 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9767,17 +9450,15 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9795,15 +9476,13 @@ func rewriteValueS390X_OpS390XFMOVDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -9824,7 +9503,7 @@ func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -9832,7 +9511,6 @@ func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -9850,7 +9528,7 @@ func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -9858,7 +9536,6 @@ func rewriteValueS390X_OpS390XFMOVDloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -9879,7 +9556,7 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -9887,7 +9564,6 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -9905,7 +9581,7 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -9914,7 +9590,6 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9932,18 +9607,16 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -9962,16 +9635,14 @@ func rewriteValueS390X_OpS390XFMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -9993,7 +9664,7 @@ func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10002,7 +9673,6 @@ func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -10021,7 +9691,7 @@ func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -10030,7 +9700,6 @@ func rewriteValueS390X_OpS390XFMOVDstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -10081,14 +9750,13 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -10105,7 +9773,7 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -10113,7 +9781,6 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10130,17 +9797,15 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10158,15 +9823,13 @@ func rewriteValueS390X_OpS390XFMOVSload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -10187,7 +9850,7 @@ func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10195,7 +9858,6 @@ func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -10213,7 +9875,7 @@ func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -10221,7 +9883,6 @@ func rewriteValueS390X_OpS390XFMOVSloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -10242,7 +9903,7 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10250,7 +9911,6 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -10268,7 +9928,7 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -10277,7 +9937,6 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10295,18 +9954,16 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10325,16 +9982,14 @@ func rewriteValueS390X_OpS390XFMOVSstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -10356,7 +10011,7 @@ func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10365,7 +10020,6 @@ func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -10384,7 +10038,7 @@ func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -10393,7 +10047,6 @@ func rewriteValueS390X_OpS390XFMOVSstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -10471,15 +10124,13 @@ func rewriteValueS390X_OpS390XFSUB_0(v *Value) bool { // cond: // result: (FMSUB x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XFMUL { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpS390XFMSUB) v.AddArg(x) v.AddArg(y) @@ -10493,15 +10144,13 @@ func rewriteValueS390X_OpS390XFSUBS_0(v *Value) bool { // cond: // result: (FMSUBS x y z) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XFMULS { break } - _ = v_0.Args[1] - y := v_0.Args[0] z := v_0.Args[1] - x := v.Args[1] + y := v_0.Args[0] v.reset(OpS390XFMSUBS) v.AddArg(x) v.AddArg(y) @@ -10547,7 +10196,7 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { if v_0.Op != OpS390XOR { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -10555,7 +10204,6 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { if v_0_0.AuxInt != -1<<63 { break } - x := v_0.Args[1] v.reset(OpS390XLNDFR) v0 := b.NewValue0(v.Pos, OpS390XLDGR, t) v0.AddArg(x) @@ -10598,7 +10246,7 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { t1 := x.Type off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] x_0 := x.Args[0] if x_0.Op != OpS390XMOVDconst { break @@ -10607,7 +10255,6 @@ func rewriteValueS390X_OpS390XLDGR_0(v *Value) bool { break } ptr := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -10761,14 +10408,13 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -10785,7 +10431,7 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -10793,7 +10439,6 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10810,17 +10455,15 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -10838,15 +10481,13 @@ func rewriteValueS390X_OpS390XMOVBZload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -10867,7 +10508,7 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10875,7 +10516,6 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -10893,7 +10533,7 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -10901,7 +10541,6 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -10919,7 +10558,7 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -10927,7 +10566,6 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -10945,7 +10583,7 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -10953,7 +10591,6 @@ func rewriteValueS390X_OpS390XMOVBZloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -11258,9 +10895,8 @@ func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -11284,9 +10920,8 @@ func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -11310,10 +10945,9 @@ func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11338,10 +10972,9 @@ func rewriteValueS390X_OpS390XMOVBZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11410,14 +11043,13 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -11434,7 +11066,7 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -11442,7 +11074,6 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11459,17 +11090,15 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11487,15 +11116,13 @@ func rewriteValueS390X_OpS390XMOVBload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -11516,7 +11143,7 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -11524,7 +11151,6 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -11542,7 +11168,7 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -11550,7 +11176,6 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -11568,7 +11193,7 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -11576,7 +11201,6 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -11594,7 +11218,7 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -11602,7 +11226,6 @@ func rewriteValueS390X_OpS390XMOVBloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -11696,9 +11319,8 @@ func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -11722,9 +11344,8 @@ func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -11748,10 +11369,9 @@ func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11776,10 +11396,9 @@ func rewriteValueS390X_OpS390XMOVBreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -11823,14 +11442,13 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVBreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AuxInt = off v.Aux = sym @@ -11845,14 +11463,13 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVBZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVBstore) v.AuxInt = off v.Aux = sym @@ -11867,7 +11484,7 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -11875,7 +11492,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -11893,14 +11509,13 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is20Bit(off) && ptr.Op != OpSB) { break } @@ -11917,7 +11532,7 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -11926,7 +11541,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11944,18 +11558,16 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -11974,16 +11586,14 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -12015,7 +11625,7 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12029,7 +11639,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12065,7 +11674,7 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12079,7 +11688,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12110,7 +11718,7 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12124,7 +11732,6 @@ func rewriteValueS390X_OpS390XMOVBstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12163,7 +11770,7 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12177,7 +11784,6 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12215,14 +11821,13 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12258,7 +11863,7 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12272,7 +11877,6 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12310,14 +11914,13 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12353,7 +11956,7 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -12367,7 +11970,6 @@ func rewriteValueS390X_OpS390XMOVBstore_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -12388,14 +11990,13 @@ func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(ValAndOff(sc).Off() + off)) { break } @@ -12412,7 +12013,7 @@ func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -12420,7 +12021,6 @@ func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -12447,11 +12047,10 @@ func rewriteValueS390X_OpS390XMOVBstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+1 == ValAndOff(c).Off() && clobber(x)) { break } @@ -12471,7 +12070,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -12480,7 +12079,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -12499,7 +12097,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -12508,7 +12106,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -12527,7 +12124,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -12536,7 +12133,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -12555,7 +12151,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -12564,7 +12160,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -12597,7 +12192,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12614,7 +12209,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12647,7 +12241,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12664,7 +12258,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12697,7 +12290,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12714,7 +12307,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12747,7 +12339,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12764,7 +12356,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12802,7 +12393,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12819,7 +12410,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12857,7 +12447,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12874,7 +12464,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12915,7 +12504,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -12932,7 +12521,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -12970,7 +12558,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -12987,7 +12575,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13020,7 +12607,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13037,7 +12624,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13070,7 +12656,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13087,7 +12673,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13120,7 +12705,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13137,7 +12722,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13170,7 +12754,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13187,7 +12771,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13225,7 +12808,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13242,7 +12825,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13280,7 +12862,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13297,7 +12879,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13335,7 +12916,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13352,7 +12933,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13390,7 +12970,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13407,7 +12987,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13450,7 +13029,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13460,7 +13039,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13500,7 +13078,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13510,7 +13088,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13550,7 +13127,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13560,7 +13137,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13600,7 +13176,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13610,7 +13186,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13648,7 +13223,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13665,7 +13240,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13703,7 +13277,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13720,7 +13294,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13758,7 +13331,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13775,7 +13348,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13813,7 +13385,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13830,7 +13402,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13870,7 +13441,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13880,7 +13451,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13920,7 +13490,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -13930,7 +13500,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_20(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -13973,7 +13542,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -13983,7 +13552,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14023,7 +13591,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -14033,7 +13601,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14071,7 +13638,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14088,7 +13655,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14126,7 +13692,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -14143,7 +13709,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14181,7 +13746,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -14198,7 +13763,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14236,7 +13800,7 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -14253,7 +13817,6 @@ func rewriteValueS390X_OpS390XMOVBstoreidx_30(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -14671,14 +14234,13 @@ func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { for { c := v.AuxInt s := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } d := v_0.AuxInt x := v_0.Args[0] - y := v.Args[1] if !(is20Bit(c+d) && x.Op != OpSB) { break } @@ -14719,7 +14281,7 @@ func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -14727,7 +14289,6 @@ func rewriteValueS390X_OpS390XMOVDaddridx_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux x := v_0.Args[0] - y := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && x.Op != OpSB) { break } @@ -14828,14 +14389,13 @@ func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -14852,7 +14412,7 @@ func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -14861,7 +14421,6 @@ func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } @@ -14878,17 +14437,15 @@ func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -14906,15 +14463,13 @@ func rewriteValueS390X_OpS390XMOVDload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -14935,7 +14490,7 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -14943,7 +14498,6 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -14961,7 +14515,7 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -14969,7 +14523,6 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -14987,7 +14540,7 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -14995,7 +14548,6 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -15013,7 +14565,7 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -15021,7 +14573,6 @@ func rewriteValueS390X_OpS390XMOVDloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -15075,9 +14626,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15102,9 +14652,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15129,9 +14678,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15156,9 +14704,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15183,9 +14730,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15210,9 +14756,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15237,9 +14782,8 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15264,10 +14808,9 @@ func rewriteValueS390X_OpS390XMOVDnop_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15297,10 +14840,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15326,10 +14868,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15355,10 +14896,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15384,10 +14924,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15413,10 +14952,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15442,10 +14980,9 @@ func rewriteValueS390X_OpS390XMOVDnop_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15514,9 +15051,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15541,9 +15077,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15568,9 +15103,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15595,9 +15129,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15622,9 +15155,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15649,9 +15181,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15676,9 +15207,8 @@ func rewriteValueS390X_OpS390XMOVDreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -15707,10 +15237,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15736,10 +15265,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15765,10 +15293,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15794,10 +15321,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15823,10 +15349,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15852,10 +15377,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15881,10 +15405,9 @@ func rewriteValueS390X_OpS390XMOVDreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -15908,7 +15431,7 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -15916,7 +15439,6 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -15934,14 +15456,13 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { break } @@ -15958,7 +15479,7 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -15968,7 +15489,6 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%8 == 0 && (off1+off2)%8 == 0))) { break } @@ -15986,18 +15506,16 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -16016,16 +15534,14 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -16057,12 +15573,11 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } w0 := x.Args[1] - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-8) && clobber(x)) { break } @@ -16094,13 +15609,12 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] - mem := x.Args[3] if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { break } @@ -16133,14 +15647,13 @@ func rewriteValueS390X_OpS390XMOVDstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[4] + mem := x.Args[4] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] w2 := x.Args[3] - mem := x.Args[4] if !(x.Uses == 1 && is20Bit(i-24) && clobber(x)) { break } @@ -16164,14 +15677,13 @@ func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } @@ -16188,7 +15700,7 @@ func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -16196,7 +15708,6 @@ func rewriteValueS390X_OpS390XMOVDstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -16216,7 +15727,7 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -16225,7 +15736,6 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -16244,7 +15754,7 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -16253,7 +15763,6 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -16272,7 +15781,7 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -16281,7 +15790,6 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -16300,7 +15808,7 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -16309,7 +15817,6 @@ func rewriteValueS390X_OpS390XMOVDstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -16351,14 +15858,13 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16394,7 +15900,7 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -16408,7 +15914,6 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16446,14 +15951,13 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16489,7 +15993,7 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -16503,7 +16007,6 @@ func rewriteValueS390X_OpS390XMOVHBRstore_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -16545,7 +16048,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -16555,7 +16058,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16595,7 +16097,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -16605,7 +16107,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16645,7 +16146,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -16655,7 +16156,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16695,7 +16195,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -16705,7 +16205,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16743,7 +16242,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -16760,7 +16259,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16798,7 +16296,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -16815,7 +16313,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16853,7 +16350,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -16870,7 +16367,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16908,7 +16404,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -16925,7 +16421,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -16965,7 +16460,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -16975,7 +16470,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17015,7 +16509,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -17025,7 +16519,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17068,7 +16561,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -17078,7 +16571,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17118,7 +16610,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -17128,7 +16620,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17166,7 +16657,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -17183,7 +16674,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17221,7 +16711,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -17238,7 +16728,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17276,7 +16765,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -17293,7 +16782,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17331,7 +16819,7 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -17348,7 +16836,6 @@ func rewriteValueS390X_OpS390XMOVHBRstoreidx_10(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -17398,14 +16885,13 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -17422,7 +16908,7 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -17431,7 +16917,6 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } @@ -17448,17 +16933,15 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -17476,15 +16959,13 @@ func rewriteValueS390X_OpS390XMOVHZload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -17505,7 +16986,7 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -17513,7 +16994,6 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -17531,7 +17011,7 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -17539,7 +17019,6 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -17557,7 +17036,7 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -17565,7 +17044,6 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -17583,7 +17061,7 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -17591,7 +17069,6 @@ func rewriteValueS390X_OpS390XMOVHZloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -17709,9 +17186,8 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -17735,9 +17211,8 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -17761,10 +17236,9 @@ func rewriteValueS390X_OpS390XMOVHZreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -17794,10 +17268,9 @@ func rewriteValueS390X_OpS390XMOVHZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -17866,14 +17339,13 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -17890,7 +17362,7 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -17899,7 +17371,6 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } @@ -17916,17 +17387,15 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -17944,15 +17413,13 @@ func rewriteValueS390X_OpS390XMOVHload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -17973,7 +17440,7 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -17981,7 +17448,6 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -17999,7 +17465,7 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -18007,7 +17473,6 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -18025,7 +17490,7 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -18033,7 +17498,6 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -18051,7 +17515,7 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -18059,7 +17523,6 @@ func rewriteValueS390X_OpS390XMOVHloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -18202,9 +17665,8 @@ func rewriteValueS390X_OpS390XMOVHreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -18233,9 +17695,8 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -18259,10 +17720,9 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -18287,10 +17747,9 @@ func rewriteValueS390X_OpS390XMOVHreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -18334,14 +17793,13 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVHreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVHstore) v.AuxInt = off v.Aux = sym @@ -18356,14 +17814,13 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVHZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVHstore) v.AuxInt = off v.Aux = sym @@ -18378,7 +17835,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -18386,7 +17843,6 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -18404,14 +17860,13 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(isU12Bit(off) && ptr.Op != OpSB) { break } @@ -18428,7 +17883,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -18438,7 +17893,6 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%2 == 0 && (off1+off2)%2 == 0))) { break } @@ -18456,18 +17910,16 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -18486,16 +17938,14 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -18527,7 +17977,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -18541,7 +17991,6 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -18577,7 +18026,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -18591,7 +18040,6 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -18622,7 +18070,7 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -18636,7 +18084,6 @@ func rewriteValueS390X_OpS390XMOVHstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -18675,7 +18122,7 @@ func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -18689,7 +18136,6 @@ func rewriteValueS390X_OpS390XMOVHstore_10(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -18712,14 +18158,13 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } @@ -18736,7 +18181,7 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -18744,7 +18189,6 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -18771,11 +18215,10 @@ func rewriteValueS390X_OpS390XMOVHstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+2 == ValAndOff(c).Off() && clobber(x)) { break } @@ -18798,7 +18241,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -18807,7 +18250,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -18826,7 +18268,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -18835,7 +18277,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -18854,7 +18295,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -18863,7 +18304,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -18882,7 +18322,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -18891,7 +18331,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -18924,7 +18363,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -18941,7 +18380,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -18974,7 +18412,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -18991,7 +18429,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19024,7 +18461,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19041,7 +18478,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19074,7 +18510,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19091,7 +18527,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19129,7 +18564,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19146,7 +18581,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19184,7 +18618,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19201,7 +18635,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19242,7 +18675,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19259,7 +18692,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19297,7 +18729,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19314,7 +18746,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19347,7 +18778,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19364,7 +18795,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19397,7 +18827,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19414,7 +18844,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19447,7 +18876,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19464,7 +18893,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19497,7 +18925,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19514,7 +18942,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19552,7 +18979,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19569,7 +18996,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19607,7 +19033,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19624,7 +19050,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19662,7 +19087,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19679,7 +19104,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19717,7 +19141,7 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19734,7 +19158,6 @@ func rewriteValueS390X_OpS390XMOVHstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19776,14 +19199,13 @@ func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -19819,7 +19241,7 @@ func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -19833,7 +19255,6 @@ func rewriteValueS390X_OpS390XMOVWBRstore_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -19875,7 +19296,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19885,7 +19306,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19925,7 +19345,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -19935,7 +19355,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -19975,7 +19394,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -19985,7 +19404,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20025,7 +19443,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -20035,7 +19453,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != x.Args[2] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20073,7 +19490,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -20090,7 +19507,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20128,7 +19544,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -20145,7 +19561,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20183,7 +19598,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -20200,7 +19615,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20238,7 +19652,7 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -20255,7 +19669,6 @@ func rewriteValueS390X_OpS390XMOVWBRstoreidx_0(v *Value) bool { if w != w0.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -20305,14 +19718,13 @@ func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -20329,7 +19741,7 @@ func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -20338,7 +19750,6 @@ func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } @@ -20355,17 +19766,15 @@ func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -20383,15 +19792,13 @@ func rewriteValueS390X_OpS390XMOVWZload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -20412,7 +19819,7 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -20420,7 +19827,6 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20438,7 +19844,7 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -20446,7 +19852,6 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20464,7 +19869,7 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -20472,7 +19877,6 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20490,7 +19894,7 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -20498,7 +19902,6 @@ func rewriteValueS390X_OpS390XMOVWZloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20641,9 +20044,8 @@ func rewriteValueS390X_OpS390XMOVWZreg_0(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -20671,9 +20073,8 @@ func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -20697,10 +20098,9 @@ func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -20725,10 +20125,9 @@ func rewriteValueS390X_OpS390XMOVWZreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -20780,14 +20179,13 @@ func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(is20Bit(off1 + off2)) { break } @@ -20804,7 +20202,7 @@ func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -20813,7 +20211,6 @@ func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { off2 := v_0.AuxInt sym2 := v_0.Aux base := v_0.Args[0] - mem := v.Args[1] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } @@ -20830,17 +20227,15 @@ func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -20858,15 +20253,13 @@ func rewriteValueS390X_OpS390XMOVWload_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] - mem := v.Args[1] + ptr := v_0.Args[0] if !(ptr.Op != OpSB) { break } @@ -20887,7 +20280,7 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -20895,7 +20288,6 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { d := v_0.AuxInt ptr := v_0.Args[0] idx := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20913,7 +20305,7 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -20921,7 +20313,6 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { } d := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20939,7 +20330,7 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -20947,7 +20338,6 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { } d := v_1.AuxInt idx := v_1.Args[0] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -20965,7 +20355,7 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -20973,7 +20363,6 @@ func rewriteValueS390X_OpS390XMOVWloadidx_0(v *Value) bool { d := v_0.AuxInt idx := v_0.Args[0] ptr := v.Args[1] - mem := v.Args[2] if !(is20Bit(c + d)) { break } @@ -21169,9 +20558,8 @@ func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -21195,9 +20583,8 @@ func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(x.Uses == 1 && clobber(x)) { break } @@ -21221,10 +20608,9 @@ func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -21249,10 +20635,9 @@ func rewriteValueS390X_OpS390XMOVWreg_10(v *Value) bool { } off := x.AuxInt sym := x.Aux - _ = x.Args[2] + mem := x.Args[2] ptr := x.Args[0] idx := x.Args[1] - mem := x.Args[2] if !(x.Uses == 1 && clobber(x)) { break } @@ -21276,14 +20661,13 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVWreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVWstore) v.AuxInt = off v.Aux = sym @@ -21298,14 +20682,13 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVWZreg { break } x := v_1.Args[0] - mem := v.Args[2] v.reset(OpS390XMOVWstore) v.AuxInt = off v.Aux = sym @@ -21320,7 +20703,7 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -21328,7 +20711,6 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is20Bit(off1 + off2)) { break } @@ -21346,14 +20728,13 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDconst { break } c := v_1.AuxInt - mem := v.Args[2] if !(is16Bit(c) && isU12Bit(off) && ptr.Op != OpSB) { break } @@ -21370,7 +20751,7 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -21380,7 +20761,6 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { sym2 := v_0.Aux base := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2) && (base.Op != OpSB || (t.IsPtr() && t.Elem().Alignment()%4 == 0 && (off1+off2)%4 == 0))) { break } @@ -21398,18 +20778,16 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off1 := v.AuxInt sym1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddridx { break } off2 := v_0.AuxInt sym2 := v_0.Aux - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32Bit(off1+off2) && canMergeSym(sym1, sym2)) { break } @@ -21428,16 +20806,14 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XADD { break } - _ = v_0.Args[1] - ptr := v_0.Args[0] idx := v_0.Args[1] + ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(ptr.Op != OpSB) { break } @@ -21476,14 +20852,13 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } if w != x.Args[1] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -21519,7 +20894,7 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } @@ -21533,7 +20908,6 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { if w != x_1.Args[0] { break } - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && clobber(x)) { break } @@ -21564,12 +20938,11 @@ func rewriteValueS390X_OpS390XMOVWstore_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[2] + mem := x.Args[2] if p != x.Args[0] { break } w0 := x.Args[1] - mem := x.Args[2] if !(p.Op != OpSB && x.Uses == 1 && is20Bit(i-4) && clobber(x)) { break } @@ -21604,13 +20977,12 @@ func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] - mem := x.Args[3] if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { break } @@ -21643,14 +21015,13 @@ func rewriteValueS390X_OpS390XMOVWstore_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[4] + mem := x.Args[4] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] w2 := x.Args[3] - mem := x.Args[4] if !(x.Uses == 1 && is20Bit(i-12) && clobber(x)) { break } @@ -21676,14 +21047,13 @@ func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt s := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break } off := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU12Bit(ValAndOff(sc).Off() + off)) { break } @@ -21700,7 +21070,7 @@ func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { for { sc := v.AuxInt sym1 := v.Aux - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDaddr { break @@ -21708,7 +21078,6 @@ func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { off := v_0.AuxInt sym2 := v_0.Aux ptr := v_0.Args[0] - mem := v.Args[1] if !(ptr.Op != OpSB && canMergeSym(sym1, sym2) && ValAndOff(sc).canAdd(off)) { break } @@ -21735,11 +21104,10 @@ func rewriteValueS390X_OpS390XMOVWstoreconst_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[1] + mem := x.Args[1] if p != x.Args[0] { break } - mem := x.Args[1] if !(p.Op != OpSB && x.Uses == 1 && ValAndOff(a).Off()+4 == ValAndOff(c).Off() && clobber(x)) { break } @@ -21762,7 +21130,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -21771,7 +21139,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { ptr := v_0.Args[0] idx := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -21790,7 +21157,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] idx := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -21799,7 +21166,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { d := v_1.AuxInt ptr := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -21818,7 +21184,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] ptr := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -21827,7 +21193,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { d := v_1.AuxInt idx := v_1.Args[0] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -21846,7 +21211,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { for { c := v.AuxInt sym := v.Aux - _ = v.Args[3] + mem := v.Args[3] v_0 := v.Args[0] if v_0.Op != OpS390XADDconst { break @@ -21855,7 +21220,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { idx := v_0.Args[0] ptr := v.Args[1] val := v.Args[2] - mem := v.Args[3] if !(is20Bit(c + d)) { break } @@ -21888,7 +21252,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -21905,7 +21269,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -21938,7 +21301,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -21955,7 +21318,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -21988,7 +21350,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -22005,7 +21367,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22038,7 +21399,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -22055,7 +21416,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22093,7 +21453,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -22110,7 +21470,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22148,7 +21507,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -22165,7 +21524,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_0(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22206,7 +21564,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } @@ -22223,7 +21581,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22261,7 +21618,7 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if idx != x.Args[0] { break } @@ -22278,7 +21635,6 @@ func rewriteValueS390X_OpS390XMOVWstoreidx_10(v *Value) bool { if w != x_2.Args[0] { break } - mem := x.Args[3] if !(x.Uses == 1 && clobber(x)) { break } @@ -22317,13 +21673,12 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { // cond: is32Bit(c) // result: (MULLDconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -22345,9 +21700,8 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22365,17 +21719,15 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { // result: (MULLDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22393,17 +21745,15 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { // result: (MULLDload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22429,9 +21779,8 @@ func rewriteValueS390X_OpS390XMULLD_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22589,7 +21938,7 @@ func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -22597,7 +21946,6 @@ func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -22615,7 +21963,7 @@ func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -22624,7 +21972,6 @@ func rewriteValueS390X_OpS390XMULLDload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -22659,13 +22006,12 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { // cond: // result: (MULLWconst [int64(int32(c))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XMULLWconst) v.AuxInt = int64(int32(c)) v.AddArg(x) @@ -22684,9 +22030,8 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22704,17 +22049,15 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22732,17 +22075,15 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22768,9 +22109,8 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22796,9 +22136,8 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22816,17 +22155,15 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22844,17 +22181,15 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { // result: (MULLWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -22880,9 +22215,8 @@ func rewriteValueS390X_OpS390XMULLW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -23006,7 +22340,7 @@ func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -23014,7 +22348,6 @@ func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -23032,7 +22365,7 @@ func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -23041,7 +22374,6 @@ func rewriteValueS390X_OpS390XMULLWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -23170,13 +22502,12 @@ func rewriteValueS390X_OpS390XOR_0(v *Value) bool { // cond: isU32Bit(c) // result: (ORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU32Bit(c)) { break } @@ -23500,9 +22831,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -23523,9 +22853,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -23543,17 +22872,15 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { // result: (ORload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -23571,17 +22898,15 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { // result: (ORload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -23607,9 +22932,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -23633,9 +22957,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -23689,9 +23012,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpS390XMOVBZload { break @@ -23731,9 +23053,8 @@ func rewriteValueS390X_OpS390XOR_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -23792,9 +23113,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpS390XMOVHZload { break @@ -23834,9 +23154,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -23890,9 +23209,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpS390XMOVWZload { break @@ -23937,14 +23255,13 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -23965,7 +23282,6 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -24001,9 +23317,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break @@ -24058,7 +23373,7 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -24070,10 +23385,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -24135,9 +23448,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -24193,14 +23505,13 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -24221,7 +23532,6 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -24257,9 +23567,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break @@ -24314,7 +23623,7 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -24326,10 +23635,8 @@ func rewriteValueS390X_OpS390XOR_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -24396,9 +23703,8 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -24449,10 +23755,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24503,10 +23808,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24557,10 +23861,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24611,10 +23914,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24672,10 +23974,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -24726,10 +24027,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -24780,10 +24080,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -24834,10 +24133,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -24881,10 +24179,9 @@ func rewriteValueS390X_OpS390XOR_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24940,10 +24237,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -24994,10 +24290,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25048,10 +24343,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25109,10 +24403,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -25163,10 +24456,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -25217,10 +24509,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -25271,10 +24562,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -25318,10 +24608,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25372,10 +24661,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25426,10 +24714,9 @@ func rewriteValueS390X_OpS390XOR_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25485,10 +24772,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -25546,10 +24832,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVWZloadidx { break @@ -25600,10 +24885,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVWZloadidx { break @@ -25654,10 +24938,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVWZloadidx { break @@ -25708,10 +24991,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVWZloadidx { break @@ -25760,15 +25042,14 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -25792,7 +25073,6 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -25829,15 +25109,14 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -25861,7 +25140,6 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -25898,15 +25176,14 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -25930,7 +25207,6 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -25967,15 +25243,14 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -25999,7 +25274,6 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -26036,10 +25310,9 @@ func rewriteValueS390X_OpS390XOR_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -26110,10 +25383,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -26179,10 +25451,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -26248,10 +25519,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -26310,7 +25580,7 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26322,11 +25592,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26379,7 +25647,7 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26391,11 +25659,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26461,10 +25727,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26530,10 +25795,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26586,7 +25850,7 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26598,11 +25862,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26655,7 +25917,7 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26667,11 +25929,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26737,10 +25997,9 @@ func rewriteValueS390X_OpS390XOR_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26811,10 +26070,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -26874,15 +26132,14 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26906,7 +26163,6 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -26943,15 +26199,14 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -26975,7 +26230,6 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -27012,15 +26266,14 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27044,7 +26297,6 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -27081,15 +26333,14 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27113,7 +26364,6 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0-16 && j1%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -27150,10 +26400,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -27219,10 +26468,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -27288,10 +26536,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -27357,10 +26604,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -27419,7 +26665,7 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27431,11 +26677,9 @@ func rewriteValueS390X_OpS390XOR_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27493,7 +26737,7 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27505,11 +26749,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27575,10 +26817,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27644,10 +26885,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27700,7 +26940,7 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27712,11 +26952,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27769,7 +27007,7 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLDconst { break @@ -27781,11 +27019,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27851,10 +27087,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27920,10 +27155,9 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLDconst { break @@ -27978,9 +27212,8 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -28036,9 +27269,8 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpS390XMOVBZload { break @@ -28084,9 +27316,8 @@ func rewriteValueS390X_OpS390XOR_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -28155,9 +27386,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -28207,9 +27437,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -28271,9 +27500,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] r0 := v.Args[1] if r0.Op != OpS390XMOVWZreg { break @@ -28322,14 +27550,13 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -28350,7 +27577,6 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -28388,9 +27614,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break @@ -28447,7 +27672,7 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -28459,10 +27684,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -28526,9 +27749,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -28590,14 +27812,13 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -28622,7 +27843,6 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -28664,9 +27884,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XOR { break @@ -28727,7 +27946,7 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -28743,10 +27962,8 @@ func rewriteValueS390X_OpS390XOR_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -28823,9 +28040,8 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -28882,10 +28098,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -28938,10 +28153,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -28994,10 +28208,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29050,10 +28263,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29113,10 +28325,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -29169,10 +28380,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -29225,10 +28435,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -29281,10 +28490,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -29334,10 +28542,9 @@ func rewriteValueS390X_OpS390XOR_100(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29403,10 +28610,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29467,10 +28673,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29531,10 +28736,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29602,10 +28806,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -29666,10 +28869,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -29730,10 +28932,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -29794,10 +28995,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -29851,10 +29051,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29913,10 +29112,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -29975,10 +29173,9 @@ func rewriteValueS390X_OpS390XOR_110(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -30042,10 +29239,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLDconst { break @@ -30111,10 +29307,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVWZreg { break @@ -30173,10 +29368,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVWZreg { break @@ -30235,10 +29429,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVWZreg { break @@ -30297,10 +29490,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVWZreg { break @@ -30353,15 +29545,14 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -30385,7 +29576,6 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -30424,15 +29614,14 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -30456,7 +29645,6 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -30495,15 +29683,14 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -30527,7 +29714,6 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -30566,15 +29752,14 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -30598,7 +29783,6 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -30637,10 +29821,9 @@ func rewriteValueS390X_OpS390XOR_120(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -30713,10 +29896,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -30784,10 +29966,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -30855,10 +30036,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -30919,7 +30099,7 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -30931,11 +30111,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -30990,7 +30168,7 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31002,11 +30180,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31074,10 +30250,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31145,10 +30320,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31203,7 +30377,7 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31215,11 +30389,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31274,7 +30446,7 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31286,11 +30458,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31358,10 +30528,9 @@ func rewriteValueS390X_OpS390XOR_130(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31434,10 +30603,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -31503,15 +30671,14 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31539,7 +30706,6 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31582,15 +30748,14 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31618,7 +30783,6 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31661,15 +30825,14 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31697,7 +30860,6 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31740,15 +30902,14 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -31776,7 +30937,6 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(i1 == i0+2 && j1 == j0+16 && j0%32 == 0 && x0.Uses == 1 && x1.Uses == 1 && r0.Uses == 1 && r1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(r0) && clobber(r1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -31819,10 +30979,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -31898,10 +31057,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -31977,10 +31135,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -32056,10 +31213,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XOR { break @@ -32124,7 +31280,7 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -32140,11 +31296,9 @@ func rewriteValueS390X_OpS390XOR_140(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32208,7 +31362,7 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -32224,11 +31378,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32304,10 +31456,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32383,10 +31534,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32445,7 +31595,7 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -32461,11 +31611,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32524,7 +31672,7 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { if or.Op != OpS390XOR { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLDconst { break @@ -32540,11 +31688,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32620,10 +31766,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32699,10 +31844,9 @@ func rewriteValueS390X_OpS390XOR_150(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLDconst { break @@ -32775,13 +31919,12 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { // cond: // result: (ORWconst [int64(int32(c))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XORWconst) v.AuxInt = int64(int32(c)) v.AddArg(x) @@ -32845,9 +31988,8 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -32868,9 +32010,8 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -32888,17 +32029,15 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -32916,17 +32055,15 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -32952,9 +32089,8 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -32980,9 +32116,8 @@ func rewriteValueS390X_OpS390XORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -33005,17 +32140,15 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -33033,17 +32166,15 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { // result: (ORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -33069,9 +32200,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -33095,9 +32225,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33151,9 +32280,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpS390XMOVBZload { break @@ -33193,9 +32321,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33249,9 +32376,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] x1 := v.Args[1] if x1.Op != OpS390XMOVHZload { break @@ -33296,14 +32422,13 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -33324,7 +32449,6 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { if mem != x1.Args[1] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -33360,9 +32484,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] or := v.Args[1] if or.Op != OpS390XORW { break @@ -33417,7 +32540,7 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -33429,10 +32552,8 @@ func rewriteValueS390X_OpS390XORW_10(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] - y := or.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -33499,9 +32620,8 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -33552,10 +32672,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33606,10 +32725,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33660,10 +32778,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33714,10 +32831,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -33775,10 +32891,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -33829,10 +32944,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -33883,10 +32997,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -33937,10 +33050,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVBZloadidx { break @@ -33984,10 +33096,9 @@ func rewriteValueS390X_OpS390XORW_20(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -34043,10 +33154,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -34097,10 +33207,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -34151,10 +33260,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -34212,10 +33320,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -34266,10 +33373,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -34320,10 +33426,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -34374,10 +33479,9 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] x1 := v.Args[1] if x1.Op != OpS390XMOVHZloadidx { break @@ -34426,15 +33530,14 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -34458,7 +33561,6 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34495,15 +33597,14 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -34527,7 +33628,6 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34564,15 +33664,14 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -34596,7 +33695,6 @@ func rewriteValueS390X_OpS390XORW_30(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34638,15 +33736,14 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -34670,7 +33767,6 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { if mem != x1.Args[2] { break } - y := or.Args[1] if !(i1 == i0+1 && j1 == j0-8 && j1%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -34707,10 +33803,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -34776,10 +33871,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -34845,10 +33939,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -34914,10 +34007,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -34976,7 +34068,7 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -34988,11 +34080,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35045,7 +34135,7 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -35057,11 +34147,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35127,10 +34215,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35196,10 +34283,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35252,7 +34338,7 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -35264,11 +34350,9 @@ func rewriteValueS390X_OpS390XORW_40(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35326,7 +34410,7 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s1 := or.Args[0] if s1.Op != OpS390XSLWconst { break @@ -35338,11 +34422,9 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] - y := or.Args[1] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35408,10 +34490,9 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35477,10 +34558,9 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] s0 := v.Args[1] if s0.Op != OpS390XSLWconst { break @@ -35535,9 +34615,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -35593,9 +34672,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] x0 := v.Args[1] if x0.Op != OpS390XMOVBZload { break @@ -35641,9 +34719,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -35705,9 +34782,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -35756,14 +34832,13 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -35784,7 +34859,6 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { if mem != x0.Args[1] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -35822,9 +34896,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[1] - p := x1.Args[0] mem := x1.Args[1] + p := x1.Args[0] or := v.Args[1] if or.Op != OpS390XORW { break @@ -35881,7 +34954,7 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -35893,10 +34966,8 @@ func rewriteValueS390X_OpS390XORW_50(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] - y := or.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -35965,9 +35036,8 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[1] - p := x0.Args[0] mem := x0.Args[1] + p := x0.Args[0] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -36020,10 +35090,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36076,10 +35145,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36132,10 +35200,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36188,10 +35255,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36251,10 +35317,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -36307,10 +35372,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -36363,10 +35427,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -36419,10 +35482,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] x0 := v.Args[1] if x0.Op != OpS390XMOVBZloadidx { break @@ -36472,10 +35534,9 @@ func rewriteValueS390X_OpS390XORW_60(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36539,10 +35600,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36601,10 +35661,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36663,10 +35722,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] sh := v.Args[1] if sh.Op != OpS390XSLWconst { break @@ -36732,10 +35790,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -36794,10 +35851,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -36856,10 +35912,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -36918,10 +35973,9 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] r0 := v.Args[1] if r0.Op != OpS390XMOVHZreg { break @@ -36974,15 +36028,14 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37006,7 +36059,6 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37045,15 +36097,14 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37077,7 +36128,6 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37116,15 +36166,14 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37148,7 +36197,6 @@ func rewriteValueS390X_OpS390XORW_70(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37192,15 +36240,14 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37224,7 +36271,6 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { if mem != x0.Args[2] { break } - y := or.Args[1] if !(p.Op != OpSB && i1 == i0+1 && j1 == j0+8 && j0%16 == 0 && x0.Uses == 1 && x1.Uses == 1 && s0.Uses == 1 && s1.Uses == 1 && or.Uses == 1 && mergePoint(b, x0, x1) != nil && clobber(x0) && clobber(x1) && clobber(s0) && clobber(s1) && clobber(or)) { break } @@ -37263,10 +36309,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -37334,10 +36379,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -37405,10 +36449,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] p := x1.Args[0] idx := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -37476,10 +36519,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i1 := x1.AuxInt s := x1.Aux - _ = x1.Args[2] + mem := x1.Args[2] idx := x1.Args[0] p := x1.Args[1] - mem := x1.Args[2] or := v.Args[1] if or.Op != OpS390XORW { break @@ -37540,7 +36582,7 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37552,11 +36594,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37611,7 +36651,7 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37623,11 +36663,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37695,10 +36733,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37766,10 +36803,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37824,7 +36860,7 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37836,11 +36872,9 @@ func rewriteValueS390X_OpS390XORW_80(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37900,7 +36934,7 @@ func rewriteValueS390X_OpS390XORW_90(v *Value) bool { if or.Op != OpS390XORW { break } - _ = or.Args[1] + y := or.Args[1] s0 := or.Args[0] if s0.Op != OpS390XSLWconst { break @@ -37912,11 +36946,9 @@ func rewriteValueS390X_OpS390XORW_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] - y := or.Args[1] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -37984,10 +37016,9 @@ func rewriteValueS390X_OpS390XORW_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] p := x0.Args[0] idx := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -38055,10 +37086,9 @@ func rewriteValueS390X_OpS390XORW_90(v *Value) bool { } i0 := x0.AuxInt s := x0.Aux - _ = x0.Args[2] + mem := x0.Args[2] idx := x0.Args[0] p := x0.Args[1] - mem := x0.Args[2] s1 := v.Args[1] if s1.Op != OpS390XSLWconst { break @@ -38156,7 +37186,7 @@ func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -38164,7 +37194,6 @@ func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -38182,7 +37211,7 @@ func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -38191,7 +37220,6 @@ func rewriteValueS390X_OpS390XORWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -38287,7 +37315,7 @@ func rewriteValueS390X_OpS390XORload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -38295,7 +37323,6 @@ func rewriteValueS390X_OpS390XORload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -38313,7 +37340,7 @@ func rewriteValueS390X_OpS390XORload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -38322,7 +37349,6 @@ func rewriteValueS390X_OpS390XORload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -38403,13 +37429,12 @@ func rewriteValueS390X_OpS390XSLD_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSLD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -38609,13 +37634,12 @@ func rewriteValueS390X_OpS390XSLW_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSLW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -38815,13 +37839,12 @@ func rewriteValueS390X_OpS390XSRAD_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSRAD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -39038,13 +38061,12 @@ func rewriteValueS390X_OpS390XSRAW_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSRAW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -39261,13 +38283,12 @@ func rewriteValueS390X_OpS390XSRD_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSRD) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -39498,13 +38519,12 @@ func rewriteValueS390X_OpS390XSRW_0(v *Value) bool { if v_1.Op != OpS390XAND { break } - _ = v_1.Args[1] + y := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpS390XMOVDconst { break } c := v_1_0.AuxInt - y := v_1.Args[1] v.reset(OpS390XSRW) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpS390XANDWconst, typ.UInt32) @@ -39696,13 +38716,12 @@ func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] - mem := x.Args[3] if !(x.Uses == 1 && is20Bit(i-8) && clobber(x)) { break } @@ -39723,7 +38742,7 @@ func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { for { i := v.AuxInt s := v.Aux - _ = v.Args[3] + mem := v.Args[3] p := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XSRDconst { @@ -39736,7 +38755,6 @@ func rewriteValueS390X_OpS390XSTM2_0(v *Value) bool { if x != v.Args[2] { break } - mem := v.Args[3] v.reset(OpS390XMOVDstore) v.AuxInt = i v.Aux = s @@ -39768,13 +38786,12 @@ func rewriteValueS390X_OpS390XSTMG2_0(v *Value) bool { if x.Aux != s { break } - _ = x.Args[3] + mem := x.Args[3] if p != x.Args[0] { break } w0 := x.Args[1] w1 := x.Args[2] - mem := x.Args[3] if !(x.Uses == 1 && is20Bit(i-16) && clobber(x)) { break } @@ -39816,13 +38833,12 @@ func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { // cond: is32Bit(c) // result: (NEG (SUBconst x [c])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(is32Bit(c)) { break } @@ -39837,9 +38853,8 @@ func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpS390XMOVDconst) @@ -39859,9 +38874,8 @@ func rewriteValueS390X_OpS390XSUB_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -39898,13 +38912,12 @@ func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { // cond: // result: (NEGW (SUBWconst x [int64(int32(c))])) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XNEGW) v0 := b.NewValue0(v.Pos, OpS390XSUBWconst, v.Type) v0.AuxInt = int64(int32(c)) @@ -39916,9 +38929,8 @@ func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpS390XMOVDconst) @@ -39938,9 +38950,8 @@ func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -39966,9 +38977,8 @@ func rewriteValueS390X_OpS390XSUBW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40017,7 +39027,7 @@ func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -40025,7 +39035,6 @@ func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -40043,7 +39052,7 @@ func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -40052,7 +39061,6 @@ func rewriteValueS390X_OpS390XSUBWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -40170,7 +39178,7 @@ func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -40178,7 +39186,6 @@ func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -40196,7 +39203,7 @@ func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -40205,7 +39212,6 @@ func rewriteValueS390X_OpS390XSUBload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -40298,13 +39304,12 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { // cond: isU32Bit(c) // result: (XORconst [c] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] if !(isU32Bit(c)) { break } @@ -40409,9 +39414,8 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpS390XMOVDconst) @@ -40431,9 +39435,8 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40451,17 +39454,15 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { // result: (XORload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40479,17 +39480,15 @@ func rewriteValueS390X_OpS390XXOR_0(v *Value) bool { // result: (XORload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVDload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40518,9 +39517,8 @@ func rewriteValueS390X_OpS390XXOR_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40556,13 +39554,12 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { // cond: // result: (XORWconst [int64(int32(c))] x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break } c := v_0.AuxInt - x := v.Args[1] v.reset(OpS390XXORWconst) v.AuxInt = int64(int32(c)) v.AddArg(x) @@ -40626,9 +39623,8 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { // cond: // result: (MOVDconst [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpS390XMOVDconst) @@ -40648,9 +39644,8 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40668,17 +39663,15 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40696,17 +39689,15 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40732,9 +39723,8 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40760,9 +39750,8 @@ func rewriteValueS390X_OpS390XXORW_0(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40783,17 +39772,15 @@ func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40811,17 +39798,15 @@ func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { // result: (XORWload [off] {sym} x ptr mem) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] g := v.Args[0] if g.Op != OpS390XMOVWZload { break } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] - x := v.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40847,9 +39832,8 @@ func rewriteValueS390X_OpS390XXORW_10(v *Value) bool { } off := g.AuxInt sym := g.Aux - _ = g.Args[1] - ptr := g.Args[0] mem := g.Args[1] + ptr := g.Args[0] if !(ptr.Op != OpSB && is20Bit(off) && canMergeLoadClobber(v, g, x) && clobber(g)) { break } @@ -40902,7 +39886,7 @@ func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -40910,7 +39894,6 @@ func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -40928,7 +39911,7 @@ func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -40937,7 +39920,6 @@ func rewriteValueS390X_OpS390XXORWload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -41022,7 +40004,7 @@ func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { for { off1 := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XADDconst { @@ -41030,7 +40012,6 @@ func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { } off2 := v_1.AuxInt ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(off1+off2)) { break } @@ -41048,7 +40029,7 @@ func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { for { o1 := v.AuxInt s1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpS390XMOVDaddr { @@ -41057,7 +40038,6 @@ func rewriteValueS390X_OpS390XXORload_0(v *Value) bool { o2 := v_1.AuxInt s2 := v_1.Aux ptr := v_1.Args[0] - mem := v.Args[2] if !(ptr.Op != OpSB && is20Bit(o1+o2) && canMergeSym(s1, s2)) { break } @@ -41082,9 +40062,8 @@ func rewriteValueS390X_OpSelect0_0(v *Value) bool { if v_0.Op != OpS390XAddTupleFirst32 { break } - _ = v_0.Args[1] - val := v_0.Args[0] tuple := v_0.Args[1] + val := v_0.Args[0] v.reset(OpS390XADDW) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpSelect0, t) @@ -41101,9 +40080,8 @@ func rewriteValueS390X_OpSelect0_0(v *Value) bool { if v_0.Op != OpS390XAddTupleFirst64 { break } - _ = v_0.Args[1] - val := v_0.Args[0] tuple := v_0.Args[1] + val := v_0.Args[0] v.reset(OpS390XADD) v.AddArg(val) v0 := b.NewValue0(v.Pos, OpSelect0, t) @@ -41122,7 +40100,6 @@ func rewriteValueS390X_OpSelect1_0(v *Value) bool { if v_0.Op != OpS390XAddTupleFirst32 { break } - _ = v_0.Args[1] tuple := v_0.Args[1] v.reset(OpSelect1) v.AddArg(tuple) @@ -41136,7 +40113,6 @@ func rewriteValueS390X_OpSelect1_0(v *Value) bool { if v_0.Op != OpS390XAddTupleFirst64 { break } - _ = v_0.Args[1] tuple := v_0.Args[1] v.reset(OpSelect1) v.AddArg(tuple) @@ -41258,10 +40234,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (FMOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8 && is64BitFloat(val.Type)) { break } @@ -41276,10 +40251,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (FMOVSstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4 && is32BitFloat(val.Type)) { break } @@ -41294,10 +40268,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (MOVDstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8) { break } @@ -41312,10 +40285,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (MOVWstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4) { break } @@ -41330,10 +40302,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (MOVHstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -41348,10 +40319,9 @@ func rewriteValueS390X_OpStore_0(v *Value) bool { // result: (MOVBstore ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -41368,9 +40338,8 @@ func rewriteValueS390X_OpSub16_0(v *Value) bool { // cond: // result: (SUBW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSUBW) v.AddArg(x) v.AddArg(y) @@ -41382,9 +40351,8 @@ func rewriteValueS390X_OpSub32_0(v *Value) bool { // cond: // result: (SUBW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSUBW) v.AddArg(x) v.AddArg(y) @@ -41396,9 +40364,8 @@ func rewriteValueS390X_OpSub32F_0(v *Value) bool { // cond: // result: (FSUBS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFSUBS) v.AddArg(x) v.AddArg(y) @@ -41410,9 +40377,8 @@ func rewriteValueS390X_OpSub64_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSUB) v.AddArg(x) v.AddArg(y) @@ -41424,9 +40390,8 @@ func rewriteValueS390X_OpSub64F_0(v *Value) bool { // cond: // result: (FSUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XFSUB) v.AddArg(x) v.AddArg(y) @@ -41438,9 +40403,8 @@ func rewriteValueS390X_OpSub8_0(v *Value) bool { // cond: // result: (SUBW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSUBW) v.AddArg(x) v.AddArg(y) @@ -41452,9 +40416,8 @@ func rewriteValueS390X_OpSubPtr_0(v *Value) bool { // cond: // result: (SUB x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XSUB) v.AddArg(x) v.AddArg(y) @@ -41551,10 +40514,9 @@ func rewriteValueS390X_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpS390XLoweredWB) v.Aux = fn v.AddArg(destptr) @@ -41568,9 +40530,8 @@ func rewriteValueS390X_OpXor16_0(v *Value) bool { // cond: // result: (XORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XXORW) v.AddArg(x) v.AddArg(y) @@ -41582,9 +40543,8 @@ func rewriteValueS390X_OpXor32_0(v *Value) bool { // cond: // result: (XORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XXORW) v.AddArg(x) v.AddArg(y) @@ -41596,9 +40556,8 @@ func rewriteValueS390X_OpXor64_0(v *Value) bool { // cond: // result: (XOR x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XXOR) v.AddArg(x) v.AddArg(y) @@ -41610,9 +40569,8 @@ func rewriteValueS390X_OpXor8_0(v *Value) bool { // cond: // result: (XORW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpS390XXORW) v.AddArg(x) v.AddArg(y) @@ -41628,7 +40586,6 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -41642,9 +40599,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVBstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -41658,9 +40614,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVHstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -41674,9 +40629,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVWstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -41690,9 +40644,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVDstoreconst) v.AuxInt = 0 v.AddArg(destptr) @@ -41706,9 +40659,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVBstoreconst) v.AuxInt = makeValAndOff(0, 2) v.AddArg(destptr) @@ -41726,9 +40678,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVBstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -41746,9 +40697,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVHstoreconst) v.AuxInt = makeValAndOff(0, 4) v.AddArg(destptr) @@ -41766,9 +40716,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpS390XMOVWstoreconst) v.AuxInt = makeValAndOff(0, 3) v.AddArg(destptr) @@ -41784,9 +40733,8 @@ func rewriteValueS390X_OpZero_0(v *Value) bool { // result: (CLEAR [makeValAndOff(s, 0)] destptr mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s > 0 && s <= 1024) { break } @@ -41805,9 +40753,8 @@ func rewriteValueS390X_OpZero_10(v *Value) bool { // result: (LoweredZero [s%256] destptr (ADDconst destptr [(s/256)*256]) mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s > 1024) { break } @@ -42073,7 +41020,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDLT { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42088,7 +41035,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XLT b.SetControl(cmp) b.Aux = nil @@ -42102,7 +41048,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDLE { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42117,7 +41063,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XLE b.SetControl(cmp) b.Aux = nil @@ -42131,7 +41076,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDGT { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42146,7 +41091,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XGT b.SetControl(cmp) b.Aux = nil @@ -42160,7 +41104,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDGE { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42175,7 +41119,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XGE b.SetControl(cmp) b.Aux = nil @@ -42189,7 +41132,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDEQ { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42204,7 +41147,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XEQ b.SetControl(cmp) b.Aux = nil @@ -42218,7 +41160,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDNE { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42233,7 +41175,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XNE b.SetControl(cmp) b.Aux = nil @@ -42247,7 +41188,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDGTnoinv { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42262,7 +41203,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XGTF b.SetControl(cmp) b.Aux = nil @@ -42276,7 +41216,7 @@ func rewriteBlockS390X(b *Block) bool { if v.Op != OpS390XMOVDGEnoinv { break } - _ = v.Args[2] + cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { break @@ -42291,7 +41231,6 @@ func rewriteBlockS390X(b *Block) bool { if v_1.AuxInt != 1 { break } - cmp := v.Args[2] b.Kind = BlockS390XGEF b.SetControl(cmp) b.Aux = nil @@ -42441,7 +41380,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDLT { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42456,7 +41395,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XLT b.SetControl(cmp) b.Aux = nil @@ -42477,7 +41415,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDLE { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42492,7 +41430,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XLE b.SetControl(cmp) b.Aux = nil @@ -42513,7 +41450,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDGT { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42528,7 +41465,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XGT b.SetControl(cmp) b.Aux = nil @@ -42549,7 +41485,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDGE { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42564,7 +41500,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XGE b.SetControl(cmp) b.Aux = nil @@ -42585,7 +41520,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDEQ { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42600,7 +41535,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XEQ b.SetControl(cmp) b.Aux = nil @@ -42621,7 +41555,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDNE { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42636,7 +41570,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XNE b.SetControl(cmp) b.Aux = nil @@ -42657,7 +41590,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDGTnoinv { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42672,7 +41605,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XGTF b.SetControl(cmp) b.Aux = nil @@ -42693,7 +41625,7 @@ func rewriteBlockS390X(b *Block) bool { if v_0.Op != OpS390XMOVDGEnoinv { break } - _ = v_0.Args[2] + cmp := v_0.Args[2] v_0_0 := v_0.Args[0] if v_0_0.Op != OpS390XMOVDconst { break @@ -42708,7 +41640,6 @@ func rewriteBlockS390X(b *Block) bool { if v_0_1.AuxInt != 1 { break } - cmp := v_0.Args[2] b.Kind = BlockS390XGEF b.SetControl(cmp) b.Aux = nil diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index 9e0eee8fa0..8418e51f6a 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -541,9 +541,8 @@ func rewriteValueWasm_OpAdd16_0(v *Value) bool { // cond: // result: (I64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Add) v.AddArg(x) v.AddArg(y) @@ -555,9 +554,8 @@ func rewriteValueWasm_OpAdd32_0(v *Value) bool { // cond: // result: (I64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Add) v.AddArg(x) v.AddArg(y) @@ -569,9 +567,8 @@ func rewriteValueWasm_OpAdd32F_0(v *Value) bool { // cond: // result: (F64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Add) v.AddArg(x) v.AddArg(y) @@ -583,9 +580,8 @@ func rewriteValueWasm_OpAdd64_0(v *Value) bool { // cond: // result: (I64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Add) v.AddArg(x) v.AddArg(y) @@ -597,9 +593,8 @@ func rewriteValueWasm_OpAdd64F_0(v *Value) bool { // cond: // result: (F64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Add) v.AddArg(x) v.AddArg(y) @@ -611,9 +606,8 @@ func rewriteValueWasm_OpAdd8_0(v *Value) bool { // cond: // result: (I64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Add) v.AddArg(x) v.AddArg(y) @@ -625,9 +619,8 @@ func rewriteValueWasm_OpAddPtr_0(v *Value) bool { // cond: // result: (I64Add x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Add) v.AddArg(x) v.AddArg(y) @@ -652,9 +645,8 @@ func rewriteValueWasm_OpAnd16_0(v *Value) bool { // cond: // result: (I64And x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64And) v.AddArg(x) v.AddArg(y) @@ -666,9 +658,8 @@ func rewriteValueWasm_OpAnd32_0(v *Value) bool { // cond: // result: (I64And x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64And) v.AddArg(x) v.AddArg(y) @@ -680,9 +671,8 @@ func rewriteValueWasm_OpAnd64_0(v *Value) bool { // cond: // result: (I64And x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64And) v.AddArg(x) v.AddArg(y) @@ -694,9 +684,8 @@ func rewriteValueWasm_OpAnd8_0(v *Value) bool { // cond: // result: (I64And x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64And) v.AddArg(x) v.AddArg(y) @@ -708,9 +697,8 @@ func rewriteValueWasm_OpAndB_0(v *Value) bool { // cond: // result: (I64And x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64And) v.AddArg(x) v.AddArg(y) @@ -723,10 +711,9 @@ func rewriteValueWasm_OpClosureCall_0(v *Value) bool { // result: (LoweredClosureCall [argwid] entry closure mem) for { argwid := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] entry := v.Args[0] closure := v.Args[1] - mem := v.Args[2] v.reset(OpWasmLoweredClosureCall) v.AuxInt = argwid v.AddArg(entry) @@ -892,9 +879,8 @@ func rewriteValueWasm_OpConvert_0(v *Value) bool { // result: (LoweredConvert x mem) for { t := v.Type - _ = v.Args[1] - x := v.Args[0] mem := v.Args[1] + x := v.Args[0] v.reset(OpWasmLoweredConvert) v.Type = t v.AddArg(x) @@ -1136,9 +1122,8 @@ func rewriteValueWasm_OpDiv16_0(v *Value) bool { // cond: // result: (I64DivS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -1156,9 +1141,8 @@ func rewriteValueWasm_OpDiv16u_0(v *Value) bool { // cond: // result: (I64DivU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1176,9 +1160,8 @@ func rewriteValueWasm_OpDiv32_0(v *Value) bool { // cond: // result: (I64DivS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -1194,9 +1177,8 @@ func rewriteValueWasm_OpDiv32F_0(v *Value) bool { // cond: // result: (F64Div x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Div) v.AddArg(x) v.AddArg(y) @@ -1210,9 +1192,8 @@ func rewriteValueWasm_OpDiv32u_0(v *Value) bool { // cond: // result: (I64DivU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -1228,9 +1209,8 @@ func rewriteValueWasm_OpDiv64_0(v *Value) bool { // cond: // result: (I64DivS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivS) v.AddArg(x) v.AddArg(y) @@ -1242,9 +1222,8 @@ func rewriteValueWasm_OpDiv64F_0(v *Value) bool { // cond: // result: (F64Div x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Div) v.AddArg(x) v.AddArg(y) @@ -1256,9 +1235,8 @@ func rewriteValueWasm_OpDiv64u_0(v *Value) bool { // cond: // result: (I64DivU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivU) v.AddArg(x) v.AddArg(y) @@ -1272,9 +1250,8 @@ func rewriteValueWasm_OpDiv8_0(v *Value) bool { // cond: // result: (I64DivS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -1292,9 +1269,8 @@ func rewriteValueWasm_OpDiv8u_0(v *Value) bool { // cond: // result: (I64DivU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64DivU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -1312,9 +1288,8 @@ func rewriteValueWasm_OpEq16_0(v *Value) bool { // cond: // result: (I64Eq (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1332,9 +1307,8 @@ func rewriteValueWasm_OpEq32_0(v *Value) bool { // cond: // result: (I64Eq (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -1352,9 +1326,8 @@ func rewriteValueWasm_OpEq32F_0(v *Value) bool { // cond: // result: (F64Eq (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Eq) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -1370,9 +1343,8 @@ func rewriteValueWasm_OpEq64_0(v *Value) bool { // cond: // result: (I64Eq x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v.AddArg(x) v.AddArg(y) @@ -1384,9 +1356,8 @@ func rewriteValueWasm_OpEq64F_0(v *Value) bool { // cond: // result: (F64Eq x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Eq) v.AddArg(x) v.AddArg(y) @@ -1400,9 +1371,8 @@ func rewriteValueWasm_OpEq8_0(v *Value) bool { // cond: // result: (I64Eq (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -1418,9 +1388,8 @@ func rewriteValueWasm_OpEqB_0(v *Value) bool { // cond: // result: (I64Eq x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v.AddArg(x) v.AddArg(y) @@ -1432,9 +1401,8 @@ func rewriteValueWasm_OpEqPtr_0(v *Value) bool { // cond: // result: (I64Eq x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Eq) v.AddArg(x) v.AddArg(y) @@ -1448,9 +1416,8 @@ func rewriteValueWasm_OpGeq16_0(v *Value) bool { // cond: // result: (I64GeS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -1468,9 +1435,8 @@ func rewriteValueWasm_OpGeq16U_0(v *Value) bool { // cond: // result: (I64GeU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1488,9 +1454,8 @@ func rewriteValueWasm_OpGeq32_0(v *Value) bool { // cond: // result: (I64GeS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -1508,9 +1473,8 @@ func rewriteValueWasm_OpGeq32F_0(v *Value) bool { // cond: // result: (F64Ge (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Ge) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -1528,9 +1492,8 @@ func rewriteValueWasm_OpGeq32U_0(v *Value) bool { // cond: // result: (I64GeU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -1546,9 +1509,8 @@ func rewriteValueWasm_OpGeq64_0(v *Value) bool { // cond: // result: (I64GeS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeS) v.AddArg(x) v.AddArg(y) @@ -1560,9 +1522,8 @@ func rewriteValueWasm_OpGeq64F_0(v *Value) bool { // cond: // result: (F64Ge x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Ge) v.AddArg(x) v.AddArg(y) @@ -1574,9 +1535,8 @@ func rewriteValueWasm_OpGeq64U_0(v *Value) bool { // cond: // result: (I64GeU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeU) v.AddArg(x) v.AddArg(y) @@ -1590,9 +1550,8 @@ func rewriteValueWasm_OpGeq8_0(v *Value) bool { // cond: // result: (I64GeS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -1610,9 +1569,8 @@ func rewriteValueWasm_OpGeq8U_0(v *Value) bool { // cond: // result: (I64GeU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GeU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -1657,9 +1615,8 @@ func rewriteValueWasm_OpGreater16_0(v *Value) bool { // cond: // result: (I64GtS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -1677,9 +1634,8 @@ func rewriteValueWasm_OpGreater16U_0(v *Value) bool { // cond: // result: (I64GtU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1697,9 +1653,8 @@ func rewriteValueWasm_OpGreater32_0(v *Value) bool { // cond: // result: (I64GtS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -1717,9 +1672,8 @@ func rewriteValueWasm_OpGreater32F_0(v *Value) bool { // cond: // result: (F64Gt (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Gt) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -1737,9 +1691,8 @@ func rewriteValueWasm_OpGreater32U_0(v *Value) bool { // cond: // result: (I64GtU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -1755,9 +1708,8 @@ func rewriteValueWasm_OpGreater64_0(v *Value) bool { // cond: // result: (I64GtS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtS) v.AddArg(x) v.AddArg(y) @@ -1769,9 +1721,8 @@ func rewriteValueWasm_OpGreater64F_0(v *Value) bool { // cond: // result: (F64Gt x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Gt) v.AddArg(x) v.AddArg(y) @@ -1783,9 +1734,8 @@ func rewriteValueWasm_OpGreater64U_0(v *Value) bool { // cond: // result: (I64GtU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtU) v.AddArg(x) v.AddArg(y) @@ -1799,9 +1749,8 @@ func rewriteValueWasm_OpGreater8_0(v *Value) bool { // cond: // result: (I64GtS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -1819,9 +1768,8 @@ func rewriteValueWasm_OpGreater8U_0(v *Value) bool { // cond: // result: (I64GtU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64GtU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -1838,9 +1786,8 @@ func rewriteValueWasm_OpInterCall_0(v *Value) bool { // result: (LoweredInterCall [argwid] entry mem) for { argwid := v.AuxInt - _ = v.Args[1] - entry := v.Args[0] mem := v.Args[1] + entry := v.Args[0] v.reset(OpWasmLoweredInterCall) v.AuxInt = argwid v.AddArg(entry) @@ -1853,9 +1800,8 @@ func rewriteValueWasm_OpIsInBounds_0(v *Value) bool { // cond: // result: (I64LtU idx len) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpWasmI64LtU) v.AddArg(idx) v.AddArg(len) @@ -1882,9 +1828,8 @@ func rewriteValueWasm_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (I64LeU idx len) for { - _ = v.Args[1] - idx := v.Args[0] len := v.Args[1] + idx := v.Args[0] v.reset(OpWasmI64LeU) v.AddArg(idx) v.AddArg(len) @@ -1898,9 +1843,8 @@ func rewriteValueWasm_OpLeq16_0(v *Value) bool { // cond: // result: (I64LeS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -1918,9 +1862,8 @@ func rewriteValueWasm_OpLeq16U_0(v *Value) bool { // cond: // result: (I64LeU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -1938,9 +1881,8 @@ func rewriteValueWasm_OpLeq32_0(v *Value) bool { // cond: // result: (I64LeS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -1958,9 +1900,8 @@ func rewriteValueWasm_OpLeq32F_0(v *Value) bool { // cond: // result: (F64Le (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Le) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -1978,9 +1919,8 @@ func rewriteValueWasm_OpLeq32U_0(v *Value) bool { // cond: // result: (I64LeU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -1996,9 +1936,8 @@ func rewriteValueWasm_OpLeq64_0(v *Value) bool { // cond: // result: (I64LeS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeS) v.AddArg(x) v.AddArg(y) @@ -2010,9 +1949,8 @@ func rewriteValueWasm_OpLeq64F_0(v *Value) bool { // cond: // result: (F64Le x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Le) v.AddArg(x) v.AddArg(y) @@ -2024,9 +1962,8 @@ func rewriteValueWasm_OpLeq64U_0(v *Value) bool { // cond: // result: (I64LeU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeU) v.AddArg(x) v.AddArg(y) @@ -2040,9 +1977,8 @@ func rewriteValueWasm_OpLeq8_0(v *Value) bool { // cond: // result: (I64LeS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -2060,9 +1996,8 @@ func rewriteValueWasm_OpLeq8U_0(v *Value) bool { // cond: // result: (I64LeU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LeU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -2080,9 +2015,8 @@ func rewriteValueWasm_OpLess16_0(v *Value) bool { // cond: // result: (I64LtS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -2100,9 +2034,8 @@ func rewriteValueWasm_OpLess16U_0(v *Value) bool { // cond: // result: (I64LtU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -2120,9 +2053,8 @@ func rewriteValueWasm_OpLess32_0(v *Value) bool { // cond: // result: (I64LtS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -2140,9 +2072,8 @@ func rewriteValueWasm_OpLess32F_0(v *Value) bool { // cond: // result: (F64Lt (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Lt) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -2160,9 +2091,8 @@ func rewriteValueWasm_OpLess32U_0(v *Value) bool { // cond: // result: (I64LtU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -2178,9 +2108,8 @@ func rewriteValueWasm_OpLess64_0(v *Value) bool { // cond: // result: (I64LtS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtS) v.AddArg(x) v.AddArg(y) @@ -2192,9 +2121,8 @@ func rewriteValueWasm_OpLess64F_0(v *Value) bool { // cond: // result: (F64Lt x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Lt) v.AddArg(x) v.AddArg(y) @@ -2206,9 +2134,8 @@ func rewriteValueWasm_OpLess64U_0(v *Value) bool { // cond: // result: (I64LtU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtU) v.AddArg(x) v.AddArg(y) @@ -2222,9 +2149,8 @@ func rewriteValueWasm_OpLess8_0(v *Value) bool { // cond: // result: (I64LtS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -2242,9 +2168,8 @@ func rewriteValueWasm_OpLess8U_0(v *Value) bool { // cond: // result: (I64LtU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64LtU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -2261,9 +2186,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (F32Load ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is32BitFloat(t)) { break } @@ -2277,9 +2201,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (F64Load ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitFloat(t)) { break } @@ -2293,9 +2216,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 8) { break } @@ -2309,9 +2231,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load32U ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 4 && !t.IsSigned()) { break } @@ -2325,9 +2246,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load32S ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 4 && t.IsSigned()) { break } @@ -2341,9 +2261,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load16U ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 2 && !t.IsSigned()) { break } @@ -2357,9 +2276,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load16S ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 2 && t.IsSigned()) { break } @@ -2373,9 +2291,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load8U ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 1 && !t.IsSigned()) { break } @@ -2389,9 +2306,8 @@ func rewriteValueWasm_OpLoad_0(v *Value) bool { // result: (I64Load8S ptr mem) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.Size() == 1 && t.IsSigned()) { break } @@ -2423,9 +2339,8 @@ func rewriteValueWasm_OpLsh16x16_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -2441,9 +2356,8 @@ func rewriteValueWasm_OpLsh16x32_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -2457,9 +2371,8 @@ func rewriteValueWasm_OpLsh16x64_0(v *Value) bool { // cond: // result: (Lsh64x64 x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v.AddArg(y) @@ -2473,9 +2386,8 @@ func rewriteValueWasm_OpLsh16x8_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -2491,9 +2403,8 @@ func rewriteValueWasm_OpLsh32x16_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -2509,9 +2420,8 @@ func rewriteValueWasm_OpLsh32x32_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -2525,9 +2435,8 @@ func rewriteValueWasm_OpLsh32x64_0(v *Value) bool { // cond: // result: (Lsh64x64 x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v.AddArg(y) @@ -2541,9 +2450,8 @@ func rewriteValueWasm_OpLsh32x8_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -2559,9 +2467,8 @@ func rewriteValueWasm_OpLsh64x16_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -2577,9 +2484,8 @@ func rewriteValueWasm_OpLsh64x32_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -2595,9 +2501,8 @@ func rewriteValueWasm_OpLsh64x64_0(v *Value) bool { // cond: // result: (Select (I64Shl x y) (I64Const [0]) (I64LtU y (I64Const [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmSelect) v0 := b.NewValue0(v.Pos, OpWasmI64Shl, typ.Int64) v0.AddArg(x) @@ -2622,9 +2527,8 @@ func rewriteValueWasm_OpLsh64x8_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -2640,9 +2544,8 @@ func rewriteValueWasm_OpLsh8x16_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -2658,9 +2561,8 @@ func rewriteValueWasm_OpLsh8x32_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -2674,9 +2576,8 @@ func rewriteValueWasm_OpLsh8x64_0(v *Value) bool { // cond: // result: (Lsh64x64 x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v.AddArg(y) @@ -2690,9 +2591,8 @@ func rewriteValueWasm_OpLsh8x8_0(v *Value) bool { // cond: // result: (Lsh64x64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpLsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -2708,9 +2608,8 @@ func rewriteValueWasm_OpMod16_0(v *Value) bool { // cond: // result: (I64RemS (SignExt16to64 x) (SignExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemS) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -2728,9 +2627,8 @@ func rewriteValueWasm_OpMod16u_0(v *Value) bool { // cond: // result: (I64RemU (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemU) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -2748,9 +2646,8 @@ func rewriteValueWasm_OpMod32_0(v *Value) bool { // cond: // result: (I64RemS (SignExt32to64 x) (SignExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemS) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -2768,9 +2665,8 @@ func rewriteValueWasm_OpMod32u_0(v *Value) bool { // cond: // result: (I64RemU (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemU) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -2786,9 +2682,8 @@ func rewriteValueWasm_OpMod64_0(v *Value) bool { // cond: // result: (I64RemS x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemS) v.AddArg(x) v.AddArg(y) @@ -2800,9 +2695,8 @@ func rewriteValueWasm_OpMod64u_0(v *Value) bool { // cond: // result: (I64RemU x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemU) v.AddArg(x) v.AddArg(y) @@ -2816,9 +2710,8 @@ func rewriteValueWasm_OpMod8_0(v *Value) bool { // cond: // result: (I64RemS (SignExt8to64 x) (SignExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemS) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -2836,9 +2729,8 @@ func rewriteValueWasm_OpMod8u_0(v *Value) bool { // cond: // result: (I64RemU (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64RemU) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -2859,7 +2751,6 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[2] mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type @@ -2873,10 +2764,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store8) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpWasmI64Load8U, typ.UInt8) @@ -2893,10 +2783,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store16) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpWasmI64Load16U, typ.UInt16) @@ -2913,10 +2802,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store32) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpWasmI64Load32U, typ.UInt32) @@ -2933,10 +2821,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store) v.AddArg(dst) v0 := b.NewValue0(v.Pos, OpWasmI64Load, typ.UInt64) @@ -2953,10 +2840,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store) v.AuxInt = 8 v.AddArg(dst) @@ -2982,10 +2868,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store8) v.AuxInt = 2 v.AddArg(dst) @@ -3011,10 +2896,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store8) v.AuxInt = 4 v.AddArg(dst) @@ -3040,10 +2924,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store16) v.AuxInt = 4 v.AddArg(dst) @@ -3069,10 +2952,9 @@ func rewriteValueWasm_OpMove_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] v.reset(OpWasmI64Store32) v.AuxInt = 3 v.AddArg(dst) @@ -3101,10 +2983,9 @@ func rewriteValueWasm_OpMove_10(v *Value) bool { // result: (I64Store [s-8] dst (I64Load [s-8] src mem) (I64Store dst (I64Load src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 8 && s < 16) { break } @@ -3131,10 +3012,9 @@ func rewriteValueWasm_OpMove_10(v *Value) bool { // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (I64Store dst (I64Load src mem) mem)) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 && s%16 != 0 && s%16 <= 8) { break } @@ -3163,10 +3043,9 @@ func rewriteValueWasm_OpMove_10(v *Value) bool { // result: (Move [s-s%16] (OffPtr dst [s%16]) (OffPtr src [s%16]) (I64Store [8] dst (I64Load [8] src mem) (I64Store dst (I64Load src mem) mem))) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s > 16 && s%16 != 0 && s%16 > 8) { break } @@ -3204,10 +3083,9 @@ func rewriteValueWasm_OpMove_10(v *Value) bool { // result: (LoweredMove [s/8] dst src mem) for { s := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(s%8 == 0) { break } @@ -3225,9 +3103,8 @@ func rewriteValueWasm_OpMul16_0(v *Value) bool { // cond: // result: (I64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Mul) v.AddArg(x) v.AddArg(y) @@ -3239,9 +3116,8 @@ func rewriteValueWasm_OpMul32_0(v *Value) bool { // cond: // result: (I64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Mul) v.AddArg(x) v.AddArg(y) @@ -3253,9 +3129,8 @@ func rewriteValueWasm_OpMul32F_0(v *Value) bool { // cond: // result: (F64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Mul) v.AddArg(x) v.AddArg(y) @@ -3267,9 +3142,8 @@ func rewriteValueWasm_OpMul64_0(v *Value) bool { // cond: // result: (I64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Mul) v.AddArg(x) v.AddArg(y) @@ -3281,9 +3155,8 @@ func rewriteValueWasm_OpMul64F_0(v *Value) bool { // cond: // result: (F64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Mul) v.AddArg(x) v.AddArg(y) @@ -3295,9 +3168,8 @@ func rewriteValueWasm_OpMul8_0(v *Value) bool { // cond: // result: (I64Mul x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Mul) v.AddArg(x) v.AddArg(y) @@ -3397,9 +3269,8 @@ func rewriteValueWasm_OpNeq16_0(v *Value) bool { // cond: // result: (I64Ne (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -3417,9 +3288,8 @@ func rewriteValueWasm_OpNeq32_0(v *Value) bool { // cond: // result: (I64Ne (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -3437,9 +3307,8 @@ func rewriteValueWasm_OpNeq32F_0(v *Value) bool { // cond: // result: (F64Ne (LoweredRound32F x) (LoweredRound32F y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Ne) v0 := b.NewValue0(v.Pos, OpWasmLoweredRound32F, typ.Float32) v0.AddArg(x) @@ -3455,9 +3324,8 @@ func rewriteValueWasm_OpNeq64_0(v *Value) bool { // cond: // result: (I64Ne x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v.AddArg(x) v.AddArg(y) @@ -3469,9 +3337,8 @@ func rewriteValueWasm_OpNeq64F_0(v *Value) bool { // cond: // result: (F64Ne x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Ne) v.AddArg(x) v.AddArg(y) @@ -3485,9 +3352,8 @@ func rewriteValueWasm_OpNeq8_0(v *Value) bool { // cond: // result: (I64Ne (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -3503,9 +3369,8 @@ func rewriteValueWasm_OpNeqB_0(v *Value) bool { // cond: // result: (I64Ne x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v.AddArg(x) v.AddArg(y) @@ -3517,9 +3382,8 @@ func rewriteValueWasm_OpNeqPtr_0(v *Value) bool { // cond: // result: (I64Ne x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Ne) v.AddArg(x) v.AddArg(y) @@ -3530,10 +3394,9 @@ func rewriteValueWasm_OpNilCheck_0(v *Value) bool { // match: (NilCheck ptr mem) // cond: // result: (LoweredNilCheck ptr mem) - for { - _ = v.Args[1] - ptr := v.Args[0] + for { mem := v.Args[1] + ptr := v.Args[0] v.reset(OpWasmLoweredNilCheck) v.AddArg(ptr) v.AddArg(mem) @@ -3569,9 +3432,8 @@ func rewriteValueWasm_OpOr16_0(v *Value) bool { // cond: // result: (I64Or x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Or) v.AddArg(x) v.AddArg(y) @@ -3583,9 +3445,8 @@ func rewriteValueWasm_OpOr32_0(v *Value) bool { // cond: // result: (I64Or x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Or) v.AddArg(x) v.AddArg(y) @@ -3597,9 +3458,8 @@ func rewriteValueWasm_OpOr64_0(v *Value) bool { // cond: // result: (I64Or x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Or) v.AddArg(x) v.AddArg(y) @@ -3611,9 +3471,8 @@ func rewriteValueWasm_OpOr8_0(v *Value) bool { // cond: // result: (I64Or x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Or) v.AddArg(x) v.AddArg(y) @@ -3625,9 +3484,8 @@ func rewriteValueWasm_OpOrB_0(v *Value) bool { // cond: // result: (I64Or x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Or) v.AddArg(x) v.AddArg(y) @@ -3664,9 +3522,8 @@ func rewriteValueWasm_OpRsh16Ux16_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -3684,9 +3541,8 @@ func rewriteValueWasm_OpRsh16Ux32_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -3704,9 +3560,8 @@ func rewriteValueWasm_OpRsh16Ux64_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -3722,9 +3577,8 @@ func rewriteValueWasm_OpRsh16Ux8_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt16to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) v0.AddArg(x) @@ -3742,9 +3596,8 @@ func rewriteValueWasm_OpRsh16x16_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -3762,9 +3615,8 @@ func rewriteValueWasm_OpRsh16x32_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -3782,9 +3634,8 @@ func rewriteValueWasm_OpRsh16x64_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt16to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -3800,9 +3651,8 @@ func rewriteValueWasm_OpRsh16x8_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt16to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt16to64, typ.Int64) v0.AddArg(x) @@ -3820,9 +3670,8 @@ func rewriteValueWasm_OpRsh32Ux16_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -3840,9 +3689,8 @@ func rewriteValueWasm_OpRsh32Ux32_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -3860,9 +3708,8 @@ func rewriteValueWasm_OpRsh32Ux64_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -3878,9 +3725,8 @@ func rewriteValueWasm_OpRsh32Ux8_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt32to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) v0.AddArg(x) @@ -3898,9 +3744,8 @@ func rewriteValueWasm_OpRsh32x16_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -3918,9 +3763,8 @@ func rewriteValueWasm_OpRsh32x32_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -3938,9 +3782,8 @@ func rewriteValueWasm_OpRsh32x64_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt32to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -3956,9 +3799,8 @@ func rewriteValueWasm_OpRsh32x8_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt32to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt32to64, typ.Int64) v0.AddArg(x) @@ -3976,9 +3818,8 @@ func rewriteValueWasm_OpRsh64Ux16_0(v *Value) bool { // cond: // result: (Rsh64Ux64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -3994,9 +3835,8 @@ func rewriteValueWasm_OpRsh64Ux32_0(v *Value) bool { // cond: // result: (Rsh64Ux64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -4012,9 +3852,8 @@ func rewriteValueWasm_OpRsh64Ux64_0(v *Value) bool { // cond: // result: (Select (I64ShrU x y) (I64Const [0]) (I64LtU y (I64Const [64]))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmSelect) v0 := b.NewValue0(v.Pos, OpWasmI64ShrU, typ.Int64) v0.AddArg(x) @@ -4039,9 +3878,8 @@ func rewriteValueWasm_OpRsh64Ux8_0(v *Value) bool { // cond: // result: (Rsh64Ux64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -4057,9 +3895,8 @@ func rewriteValueWasm_OpRsh64x16_0(v *Value) bool { // cond: // result: (Rsh64x64 x (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) @@ -4075,9 +3912,8 @@ func rewriteValueWasm_OpRsh64x32_0(v *Value) bool { // cond: // result: (Rsh64x64 x (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) @@ -4093,9 +3929,8 @@ func rewriteValueWasm_OpRsh64x64_0(v *Value) bool { // cond: // result: (I64ShrS x (Select y (I64Const [63]) (I64LtU y (I64Const [64])))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64ShrS) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpWasmSelect, typ.Int64) @@ -4120,9 +3955,8 @@ func rewriteValueWasm_OpRsh64x8_0(v *Value) bool { // cond: // result: (Rsh64x64 x (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) @@ -4138,9 +3972,8 @@ func rewriteValueWasm_OpRsh8Ux16_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -4158,9 +3991,8 @@ func rewriteValueWasm_OpRsh8Ux32_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -4178,9 +4010,8 @@ func rewriteValueWasm_OpRsh8Ux64_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -4196,9 +4027,8 @@ func rewriteValueWasm_OpRsh8Ux8_0(v *Value) bool { // cond: // result: (Rsh64Ux64 (ZeroExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64Ux64) v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) v0.AddArg(x) @@ -4216,9 +4046,8 @@ func rewriteValueWasm_OpRsh8x16_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt16to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -4236,9 +4065,8 @@ func rewriteValueWasm_OpRsh8x32_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt32to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -4256,9 +4084,8 @@ func rewriteValueWasm_OpRsh8x64_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt8to64 x) y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -4274,9 +4101,8 @@ func rewriteValueWasm_OpRsh8x8_0(v *Value) bool { // cond: // result: (Rsh64x64 (SignExt8to64 x) (ZeroExt8to64 y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpRsh64x64) v0 := b.NewValue0(v.Pos, OpSignExt8to64, typ.Int64) v0.AddArg(x) @@ -4539,10 +4365,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (F64Store ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is64BitFloat(t.(*types.Type))) { break } @@ -4557,10 +4382,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (F32Store ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(is32BitFloat(t.(*types.Type))) { break } @@ -4575,10 +4399,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (I64Store ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 8) { break } @@ -4593,10 +4416,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (I64Store32 ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 4) { break } @@ -4611,10 +4433,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (I64Store16 ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 2) { break } @@ -4629,10 +4450,9 @@ func rewriteValueWasm_OpStore_0(v *Value) bool { // result: (I64Store8 ptr val mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] val := v.Args[1] - mem := v.Args[2] if !(t.(*types.Type).Size() == 1) { break } @@ -4649,9 +4469,8 @@ func rewriteValueWasm_OpSub16_0(v *Value) bool { // cond: // result: (I64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Sub) v.AddArg(x) v.AddArg(y) @@ -4663,9 +4482,8 @@ func rewriteValueWasm_OpSub32_0(v *Value) bool { // cond: // result: (I64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Sub) v.AddArg(x) v.AddArg(y) @@ -4677,9 +4495,8 @@ func rewriteValueWasm_OpSub32F_0(v *Value) bool { // cond: // result: (F64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Sub) v.AddArg(x) v.AddArg(y) @@ -4691,9 +4508,8 @@ func rewriteValueWasm_OpSub64_0(v *Value) bool { // cond: // result: (I64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Sub) v.AddArg(x) v.AddArg(y) @@ -4705,9 +4521,8 @@ func rewriteValueWasm_OpSub64F_0(v *Value) bool { // cond: // result: (F64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmF64Sub) v.AddArg(x) v.AddArg(y) @@ -4719,9 +4534,8 @@ func rewriteValueWasm_OpSub8_0(v *Value) bool { // cond: // result: (I64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Sub) v.AddArg(x) v.AddArg(y) @@ -4733,9 +4547,8 @@ func rewriteValueWasm_OpSubPtr_0(v *Value) bool { // cond: // result: (I64Sub x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Sub) v.AddArg(x) v.AddArg(y) @@ -4820,10 +4633,9 @@ func rewriteValueWasm_OpWB_0(v *Value) bool { // result: (LoweredWB {fn} destptr srcptr mem) for { fn := v.Aux - _ = v.Args[2] + mem := v.Args[2] destptr := v.Args[0] srcptr := v.Args[1] - mem := v.Args[2] v.reset(OpWasmLoweredWB) v.Aux = fn v.AddArg(destptr) @@ -4858,13 +4670,12 @@ func rewriteValueWasm_OpWasmF64Add_0(v *Value) bool { // cond: // result: (F64Add y (F64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmF64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmF64Add) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmF64Const, typ.Float64) @@ -4900,13 +4711,12 @@ func rewriteValueWasm_OpWasmF64Mul_0(v *Value) bool { // cond: // result: (F64Mul y (F64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmF64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmF64Mul) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmF64Const, typ.Float64) @@ -4942,13 +4752,12 @@ func rewriteValueWasm_OpWasmI64Add_0(v *Value) bool { // cond: // result: (I64Add y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Add) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5037,13 +4846,12 @@ func rewriteValueWasm_OpWasmI64And_0(v *Value) bool { // cond: // result: (I64And y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64And) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5104,13 +4912,12 @@ func rewriteValueWasm_OpWasmI64Eq_0(v *Value) bool { // cond: // result: (I64Eq y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Eq) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5163,14 +4970,13 @@ func rewriteValueWasm_OpWasmI64Load_0(v *Value) bool { // result: (I64Load [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5188,14 +4994,13 @@ func rewriteValueWasm_OpWasmI64Load16S_0(v *Value) bool { // result: (I64Load16S [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5213,14 +5018,13 @@ func rewriteValueWasm_OpWasmI64Load16U_0(v *Value) bool { // result: (I64Load16U [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5238,14 +5042,13 @@ func rewriteValueWasm_OpWasmI64Load32S_0(v *Value) bool { // result: (I64Load32S [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5263,14 +5066,13 @@ func rewriteValueWasm_OpWasmI64Load32U_0(v *Value) bool { // result: (I64Load32U [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5288,14 +5090,13 @@ func rewriteValueWasm_OpWasmI64Load8S_0(v *Value) bool { // result: (I64Load8S [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5313,14 +5114,13 @@ func rewriteValueWasm_OpWasmI64Load8U_0(v *Value) bool { // result: (I64Load8U [off+off2] ptr mem) for { off := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break } off2 := v_0.AuxInt ptr := v_0.Args[0] - mem := v.Args[1] if !(isU32Bit(off + off2)) { break } @@ -5358,13 +5158,12 @@ func rewriteValueWasm_OpWasmI64Mul_0(v *Value) bool { // cond: // result: (I64Mul y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Mul) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5425,13 +5224,12 @@ func rewriteValueWasm_OpWasmI64Ne_0(v *Value) bool { // cond: // result: (I64Ne y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Ne) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5486,13 +5284,12 @@ func rewriteValueWasm_OpWasmI64Or_0(v *Value) bool { // cond: // result: (I64Or y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Or) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5574,7 +5371,7 @@ func rewriteValueWasm_OpWasmI64Store_0(v *Value) bool { // result: (I64Store [off+off2] ptr val mem) for { off := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break @@ -5582,7 +5379,6 @@ func rewriteValueWasm_OpWasmI64Store_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(isU32Bit(off + off2)) { break } @@ -5601,7 +5397,7 @@ func rewriteValueWasm_OpWasmI64Store16_0(v *Value) bool { // result: (I64Store16 [off+off2] ptr val mem) for { off := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break @@ -5609,7 +5405,6 @@ func rewriteValueWasm_OpWasmI64Store16_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(isU32Bit(off + off2)) { break } @@ -5628,7 +5423,7 @@ func rewriteValueWasm_OpWasmI64Store32_0(v *Value) bool { // result: (I64Store32 [off+off2] ptr val mem) for { off := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break @@ -5636,7 +5431,6 @@ func rewriteValueWasm_OpWasmI64Store32_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(isU32Bit(off + off2)) { break } @@ -5655,7 +5449,7 @@ func rewriteValueWasm_OpWasmI64Store8_0(v *Value) bool { // result: (I64Store8 [off+off2] ptr val mem) for { off := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpWasmI64AddConst { break @@ -5663,7 +5457,6 @@ func rewriteValueWasm_OpWasmI64Store8_0(v *Value) bool { off2 := v_0.AuxInt ptr := v_0.Args[0] val := v.Args[1] - mem := v.Args[2] if !(isU32Bit(off + off2)) { break } @@ -5702,13 +5495,12 @@ func rewriteValueWasm_OpWasmI64Xor_0(v *Value) bool { // cond: // result: (I64Xor y (I64Const [x])) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpWasmI64Const { break } x := v_0.AuxInt - y := v.Args[1] v.reset(OpWasmI64Xor) v.AddArg(y) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5723,9 +5515,8 @@ func rewriteValueWasm_OpXor16_0(v *Value) bool { // cond: // result: (I64Xor x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Xor) v.AddArg(x) v.AddArg(y) @@ -5737,9 +5528,8 @@ func rewriteValueWasm_OpXor32_0(v *Value) bool { // cond: // result: (I64Xor x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Xor) v.AddArg(x) v.AddArg(y) @@ -5751,9 +5541,8 @@ func rewriteValueWasm_OpXor64_0(v *Value) bool { // cond: // result: (I64Xor x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Xor) v.AddArg(x) v.AddArg(y) @@ -5765,9 +5554,8 @@ func rewriteValueWasm_OpXor8_0(v *Value) bool { // cond: // result: (I64Xor x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpWasmI64Xor) v.AddArg(x) v.AddArg(y) @@ -5784,7 +5572,6 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 0 { break } - _ = v.Args[1] mem := v.Args[1] v.reset(OpCopy) v.Type = mem.Type @@ -5798,9 +5585,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 1 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store8) v.AddArg(destptr) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5816,9 +5602,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 2 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store16) v.AddArg(destptr) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5834,9 +5619,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 4 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store32) v.AddArg(destptr) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5852,9 +5636,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 8 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store) v.AddArg(destptr) v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) @@ -5870,9 +5653,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 3 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store8) v.AuxInt = 2 v.AddArg(destptr) @@ -5895,9 +5677,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 5 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store8) v.AuxInt = 4 v.AddArg(destptr) @@ -5920,9 +5701,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 6 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store16) v.AuxInt = 4 v.AddArg(destptr) @@ -5945,9 +5725,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { if v.AuxInt != 7 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store32) v.AuxInt = 3 v.AddArg(destptr) @@ -5968,9 +5747,8 @@ func rewriteValueWasm_OpZero_0(v *Value) bool { // result: (Zero [s-s%8] (OffPtr destptr [s%8]) (I64Store destptr (I64Const [0]) mem)) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%8 != 0 && s > 8) { break } @@ -6001,9 +5779,8 @@ func rewriteValueWasm_OpZero_10(v *Value) bool { if v.AuxInt != 16 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store) v.AuxInt = 8 v.AddArg(destptr) @@ -6026,9 +5803,8 @@ func rewriteValueWasm_OpZero_10(v *Value) bool { if v.AuxInt != 24 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store) v.AuxInt = 16 v.AddArg(destptr) @@ -6058,9 +5834,8 @@ func rewriteValueWasm_OpZero_10(v *Value) bool { if v.AuxInt != 32 { break } - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] v.reset(OpWasmI64Store) v.AuxInt = 24 v.AddArg(destptr) @@ -6095,9 +5870,8 @@ func rewriteValueWasm_OpZero_10(v *Value) bool { // result: (LoweredZero [s/8] destptr mem) for { s := v.AuxInt - _ = v.Args[1] - destptr := v.Args[0] mem := v.Args[1] + destptr := v.Args[0] if !(s%8 == 0 && s > 32) { break } diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go index 97fd67d65b..b61886c989 100644 --- a/src/cmd/compile/internal/ssa/rewritedec.go +++ b/src/cmd/compile/internal/ssa/rewritedec.go @@ -51,7 +51,6 @@ func rewriteValuedec_OpComplexImag_0(v *Value) bool { if v_0.Op != OpComplexMake { break } - _ = v_0.Args[1] imag := v_0.Args[1] v.reset(OpCopy) v.Type = imag.Type @@ -87,7 +86,6 @@ func rewriteValuedec_OpIData_0(v *Value) bool { if v_0.Op != OpIMake { break } - _ = v_0.Args[1] data := v_0.Args[1] v.reset(OpCopy) v.Type = data.Type @@ -123,9 +121,8 @@ func rewriteValuedec_OpLoad_0(v *Value) bool { // result: (ComplexMake (Load ptr mem) (Load (OffPtr [4] ptr) mem) ) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsComplex() && t.Size() == 8) { break } @@ -148,9 +145,8 @@ func rewriteValuedec_OpLoad_0(v *Value) bool { // result: (ComplexMake (Load ptr mem) (Load (OffPtr [8] ptr) mem) ) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsComplex() && t.Size() == 16) { break } @@ -173,9 +169,8 @@ func rewriteValuedec_OpLoad_0(v *Value) bool { // result: (StringMake (Load ptr mem) (Load (OffPtr [config.PtrSize] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsString()) { break } @@ -198,9 +193,8 @@ func rewriteValuedec_OpLoad_0(v *Value) bool { // result: (SliceMake (Load ptr mem) (Load (OffPtr [config.PtrSize] ptr) mem) (Load (OffPtr [2*config.PtrSize] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsSlice()) { break } @@ -230,9 +224,8 @@ func rewriteValuedec_OpLoad_0(v *Value) bool { // result: (IMake (Load ptr mem) (Load (OffPtr [config.PtrSize] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsInterface()) { break } @@ -261,7 +254,6 @@ func rewriteValuedec_OpSliceCap_0(v *Value) bool { if v_0.Op != OpSliceMake { break } - _ = v_0.Args[2] cap := v_0.Args[2] v.reset(OpCopy) v.Type = cap.Type @@ -315,16 +307,14 @@ func rewriteValuedec_OpStore_0(v *Value) bool { // result: (Store {typ.Float32} (OffPtr [4] dst) imag (Store {typ.Float32} dst real mem)) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpComplexMake { break } - _ = v_1.Args[1] - real := v_1.Args[0] imag := v_1.Args[1] - mem := v.Args[2] + real := v_1.Args[0] if !(t.(*types.Type).Size() == 8) { break } @@ -348,16 +338,14 @@ func rewriteValuedec_OpStore_0(v *Value) bool { // result: (Store {typ.Float64} (OffPtr [8] dst) imag (Store {typ.Float64} dst real mem)) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpComplexMake { break } - _ = v_1.Args[1] - real := v_1.Args[0] imag := v_1.Args[1] - mem := v.Args[2] + real := v_1.Args[0] if !(t.(*types.Type).Size() == 16) { break } @@ -380,16 +368,14 @@ func rewriteValuedec_OpStore_0(v *Value) bool { // cond: // result: (Store {typ.Int} (OffPtr [config.PtrSize] dst) len (Store {typ.BytePtr} dst ptr mem)) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpStringMake { break } - _ = v_1.Args[1] - ptr := v_1.Args[0] len := v_1.Args[1] - mem := v.Args[2] + ptr := v_1.Args[0] v.reset(OpStore) v.Aux = typ.Int v0 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr) @@ -409,17 +395,15 @@ func rewriteValuedec_OpStore_0(v *Value) bool { // cond: // result: (Store {typ.Int} (OffPtr [2*config.PtrSize] dst) cap (Store {typ.Int} (OffPtr [config.PtrSize] dst) len (Store {typ.BytePtr} dst ptr mem))) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpSliceMake { break } - _ = v_1.Args[2] + cap := v_1.Args[2] ptr := v_1.Args[0] len := v_1.Args[1] - cap := v_1.Args[2] - mem := v.Args[2] v.reset(OpStore) v.Aux = typ.Int v0 := b.NewValue0(v.Pos, OpOffPtr, typ.IntPtr) @@ -447,16 +431,14 @@ func rewriteValuedec_OpStore_0(v *Value) bool { // cond: // result: (Store {typ.BytePtr} (OffPtr [config.PtrSize] dst) data (Store {typ.Uintptr} dst itab mem)) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpIMake { break } - _ = v_1.Args[1] - itab := v_1.Args[0] data := v_1.Args[1] - mem := v.Args[2] + itab := v_1.Args[0] v.reset(OpStore) v.Aux = typ.BytePtr v0 := b.NewValue0(v.Pos, OpOffPtr, typ.BytePtrPtr) @@ -483,7 +465,6 @@ func rewriteValuedec_OpStringLen_0(v *Value) bool { if v_0.Op != OpStringMake { break } - _ = v_0.Args[1] len := v_0.Args[1] v.reset(OpCopy) v.Type = len.Type diff --git a/src/cmd/compile/internal/ssa/rewritedec64.go b/src/cmd/compile/internal/ssa/rewritedec64.go index eef5483c30..5a143a92a7 100644 --- a/src/cmd/compile/internal/ssa/rewritedec64.go +++ b/src/cmd/compile/internal/ssa/rewritedec64.go @@ -143,9 +143,8 @@ func rewriteValuedec64_OpAdd64_0(v *Value) bool { // cond: // result: (Int64Make (Add32withcarry (Int64Hi x) (Int64Hi y) (Select1 (Add32carry (Int64Lo x) (Int64Lo y)))) (Select0 (Add32carry (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpAdd32withcarry, typ.Int32) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -185,9 +184,8 @@ func rewriteValuedec64_OpAnd64_0(v *Value) bool { // cond: // result: (Int64Make (And32 (Int64Hi x) (Int64Hi y)) (And32 (Int64Lo x) (Int64Lo y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpAnd32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -459,9 +457,8 @@ func rewriteValuedec64_OpEq64_0(v *Value) bool { // cond: // result: (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Eq32 (Int64Lo x) (Int64Lo y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpAndB) v0 := b.NewValue0(v.Pos, OpEq32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -489,9 +486,8 @@ func rewriteValuedec64_OpGeq64_0(v *Value) bool { // cond: // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -529,9 +525,8 @@ func rewriteValuedec64_OpGeq64U_0(v *Value) bool { // cond: // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Geq32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -569,9 +564,8 @@ func rewriteValuedec64_OpGreater64_0(v *Value) bool { // cond: // result: (OrB (Greater32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpGreater32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -609,9 +603,8 @@ func rewriteValuedec64_OpGreater64U_0(v *Value) bool { // cond: // result: (OrB (Greater32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Greater32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpGreater32U, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -669,7 +662,6 @@ func rewriteValuedec64_OpInt64Lo_0(v *Value) bool { if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] lo := v_0.Args[1] v.reset(OpCopy) v.Type = lo.Type @@ -685,9 +677,8 @@ func rewriteValuedec64_OpLeq64_0(v *Value) bool { // cond: // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -725,9 +716,8 @@ func rewriteValuedec64_OpLeq64U_0(v *Value) bool { // cond: // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Leq32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -765,9 +755,8 @@ func rewriteValuedec64_OpLess64_0(v *Value) bool { // cond: // result: (OrB (Less32 (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpLess32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -805,9 +794,8 @@ func rewriteValuedec64_OpLess64U_0(v *Value) bool { // cond: // result: (OrB (Less32U (Int64Hi x) (Int64Hi y)) (AndB (Eq32 (Int64Hi x) (Int64Hi y)) (Less32U (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpLess32U, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -847,9 +835,8 @@ func rewriteValuedec64_OpLoad_0(v *Value) bool { // result: (Int64Make (Load (OffPtr [4] ptr) mem) (Load ptr mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) && !config.BigEndian && t.IsSigned()) { break } @@ -872,9 +859,8 @@ func rewriteValuedec64_OpLoad_0(v *Value) bool { // result: (Int64Make (Load (OffPtr [4] ptr) mem) (Load ptr mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) && !config.BigEndian && !t.IsSigned()) { break } @@ -897,9 +883,8 @@ func rewriteValuedec64_OpLoad_0(v *Value) bool { // result: (Int64Make (Load ptr mem) (Load (OffPtr [4] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) && config.BigEndian && t.IsSigned()) { break } @@ -922,9 +907,8 @@ func rewriteValuedec64_OpLoad_0(v *Value) bool { // result: (Int64Make (Load ptr mem) (Load (OffPtr [4] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(is64BitInt(t) && config.BigEndian && !t.IsSigned()) { break } @@ -979,7 +963,7 @@ func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -987,7 +971,6 @@ func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpLsh16x32) v.AddArg(x) v.AddArg(lo) @@ -1003,9 +986,8 @@ func rewriteValuedec64_OpLsh16x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1056,7 +1038,7 @@ func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1064,7 +1046,6 @@ func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpLsh32x32) v.AddArg(x) v.AddArg(lo) @@ -1080,9 +1061,8 @@ func rewriteValuedec64_OpLsh32x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1105,15 +1085,13 @@ func rewriteValuedec64_OpLsh64x16_0(v *Value) bool { // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x16 hi s) (Rsh32Ux16 lo (Sub16 (Const16 [32]) s))) (Lsh32x16 lo (Sub16 s (Const16 [32])))) (Lsh32x16 lo s)) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) @@ -1156,15 +1134,13 @@ func rewriteValuedec64_OpLsh64x32_0(v *Value) bool { // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x32 hi s) (Rsh32Ux32 lo (Sub32 (Const32 [32]) s))) (Lsh32x32 lo (Sub32 s (Const32 [32])))) (Lsh32x32 lo s)) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) @@ -1235,7 +1211,7 @@ func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1243,7 +1219,6 @@ func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpLsh64x32) v.AddArg(x) v.AddArg(lo) @@ -1259,9 +1234,8 @@ func rewriteValuedec64_OpLsh64x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1284,15 +1258,13 @@ func rewriteValuedec64_OpLsh64x8_0(v *Value) bool { // cond: // result: (Int64Make (Or32 (Or32 (Lsh32x8 hi s) (Rsh32Ux8 lo (Sub8 (Const8 [32]) s))) (Lsh32x8 lo (Sub8 s (Const8 [32])))) (Lsh32x8 lo s)) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) @@ -1363,7 +1335,7 @@ func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1371,7 +1343,6 @@ func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpLsh8x32) v.AddArg(x) v.AddArg(lo) @@ -1387,9 +1358,8 @@ func rewriteValuedec64_OpLsh8x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1412,9 +1382,8 @@ func rewriteValuedec64_OpMul64_0(v *Value) bool { // cond: // result: (Int64Make (Add32 (Mul32 (Int64Lo x) (Int64Hi y)) (Add32 (Mul32 (Int64Hi x) (Int64Lo y)) (Select0 (Mul32uhilo (Int64Lo x) (Int64Lo y))))) (Select1 (Mul32uhilo (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpAdd32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpMul32, typ.UInt32) @@ -1482,9 +1451,8 @@ func rewriteValuedec64_OpNeq64_0(v *Value) bool { // cond: // result: (OrB (Neq32 (Int64Hi x) (Int64Hi y)) (Neq32 (Int64Lo x) (Int64Lo y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpOrB) v0 := b.NewValue0(v.Pos, OpNeq32, typ.Bool) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -1512,9 +1480,8 @@ func rewriteValuedec64_OpOr64_0(v *Value) bool { // cond: // result: (Int64Make (Or32 (Int64Hi x) (Int64Hi y)) (Or32 (Int64Lo x) (Int64Lo y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpOr32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -1570,7 +1537,7 @@ func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1578,7 +1545,6 @@ func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh16Ux32) v.AddArg(x) v.AddArg(lo) @@ -1594,9 +1560,8 @@ func rewriteValuedec64_OpRsh16Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1650,7 +1615,7 @@ func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1658,7 +1623,6 @@ func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh16x32) v.AddArg(x) v.AddArg(lo) @@ -1674,9 +1638,8 @@ func rewriteValuedec64_OpRsh16x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1727,7 +1690,7 @@ func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1735,7 +1698,6 @@ func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh32Ux32) v.AddArg(x) v.AddArg(lo) @@ -1751,9 +1713,8 @@ func rewriteValuedec64_OpRsh32Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1805,7 +1766,7 @@ func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1813,7 +1774,6 @@ func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh32x32) v.AddArg(x) v.AddArg(lo) @@ -1829,9 +1789,8 @@ func rewriteValuedec64_OpRsh32x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -1854,15 +1813,13 @@ func rewriteValuedec64_OpRsh64Ux16_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32Ux16 hi s) (Or32 (Or32 (Rsh32Ux16 lo s) (Lsh32x16 hi (Sub16 (Const16 [32]) s))) (Rsh32Ux16 hi (Sub16 s (Const16 [32]))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32Ux16, typ.UInt32) v0.AddArg(hi) @@ -1905,15 +1862,13 @@ func rewriteValuedec64_OpRsh64Ux32_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32Ux32 hi s) (Or32 (Or32 (Rsh32Ux32 lo s) (Lsh32x32 hi (Sub32 (Const32 [32]) s))) (Rsh32Ux32 hi (Sub32 s (Const32 [32]))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32Ux32, typ.UInt32) v0.AddArg(hi) @@ -1984,7 +1939,7 @@ func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -1992,7 +1947,6 @@ func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh64Ux32) v.AddArg(x) v.AddArg(lo) @@ -2008,9 +1962,8 @@ func rewriteValuedec64_OpRsh64Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -2033,15 +1986,13 @@ func rewriteValuedec64_OpRsh64Ux8_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32Ux8 hi s) (Or32 (Or32 (Rsh32Ux8 lo s) (Lsh32x8 hi (Sub8 (Const8 [32]) s))) (Rsh32Ux8 hi (Sub8 s (Const8 [32]))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32Ux8, typ.UInt32) v0.AddArg(hi) @@ -2084,15 +2035,13 @@ func rewriteValuedec64_OpRsh64x16_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32x16 hi s) (Or32 (Or32 (Rsh32Ux16 lo s) (Lsh32x16 hi (Sub16 (Const16 [32]) s))) (And32 (Rsh32x16 hi (Sub16 s (Const16 [32]))) (Zeromask (ZeroExt16to32 (Rsh16Ux32 s (Const32 [5]))))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32x16, typ.UInt32) v0.AddArg(hi) @@ -2147,15 +2096,13 @@ func rewriteValuedec64_OpRsh64x32_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32x32 hi s) (Or32 (Or32 (Rsh32Ux32 lo s) (Lsh32x32 hi (Sub32 (Const32 [32]) s))) (And32 (Rsh32x32 hi (Sub32 s (Const32 [32]))) (Zeromask (Rsh32Ux32 s (Const32 [5])))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32x32, typ.UInt32) v0.AddArg(hi) @@ -2246,7 +2193,7 @@ func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -2254,7 +2201,6 @@ func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh64x32) v.AddArg(x) v.AddArg(lo) @@ -2270,9 +2216,8 @@ func rewriteValuedec64_OpRsh64x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -2295,15 +2240,13 @@ func rewriteValuedec64_OpRsh64x8_0(v *Value) bool { // cond: // result: (Int64Make (Rsh32x8 hi s) (Or32 (Or32 (Rsh32Ux8 lo s) (Lsh32x8 hi (Sub8 (Const8 [32]) s))) (And32 (Rsh32x8 hi (Sub8 s (Const8 [32]))) (Zeromask (ZeroExt8to32 (Rsh8Ux32 s (Const32 [5]))))))) for { - _ = v.Args[1] + s := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] - hi := v_0.Args[0] lo := v_0.Args[1] - s := v.Args[1] + hi := v_0.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpRsh32x8, typ.UInt32) v0.AddArg(hi) @@ -2386,7 +2329,7 @@ func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -2394,7 +2337,6 @@ func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh8Ux32) v.AddArg(x) v.AddArg(lo) @@ -2410,9 +2352,8 @@ func rewriteValuedec64_OpRsh8Ux64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -2466,7 +2407,7 @@ func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] + lo := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -2474,7 +2415,6 @@ func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { if v_1_0.AuxInt != 0 { break } - lo := v_1.Args[1] v.reset(OpRsh8x32) v.AddArg(x) v.AddArg(lo) @@ -2490,9 +2430,8 @@ func rewriteValuedec64_OpRsh8x64_0(v *Value) bool { if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] + hi := v_1.Args[0] if !(hi.Op != OpConst32) { break } @@ -2562,16 +2501,14 @@ func rewriteValuedec64_OpStore_0(v *Value) bool { // result: (Store {hi.Type} (OffPtr [4] dst) hi (Store {lo.Type} dst lo mem)) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] - mem := v.Args[2] + hi := v_1.Args[0] if !(t.(*types.Type).Size() == 8 && !config.BigEndian) { break } @@ -2595,16 +2532,14 @@ func rewriteValuedec64_OpStore_0(v *Value) bool { // result: (Store {lo.Type} (OffPtr [4] dst) lo (Store {hi.Type} dst hi mem)) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpInt64Make { break } - _ = v_1.Args[1] - hi := v_1.Args[0] lo := v_1.Args[1] - mem := v.Args[2] + hi := v_1.Args[0] if !(t.(*types.Type).Size() == 8 && config.BigEndian) { break } @@ -2632,9 +2567,8 @@ func rewriteValuedec64_OpSub64_0(v *Value) bool { // cond: // result: (Int64Make (Sub32withcarry (Int64Hi x) (Int64Hi y) (Select1 (Sub32carry (Int64Lo x) (Int64Lo y)))) (Select0 (Sub32carry (Int64Lo x) (Int64Lo y)))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpSub32withcarry, typ.Int32) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) @@ -2676,7 +2610,6 @@ func rewriteValuedec64_OpTrunc64to16_0(v *Value) bool { if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] lo := v_0.Args[1] v.reset(OpTrunc32to16) v.AddArg(lo) @@ -2693,7 +2626,6 @@ func rewriteValuedec64_OpTrunc64to32_0(v *Value) bool { if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] lo := v_0.Args[1] v.reset(OpCopy) v.Type = lo.Type @@ -2711,7 +2643,6 @@ func rewriteValuedec64_OpTrunc64to8_0(v *Value) bool { if v_0.Op != OpInt64Make { break } - _ = v_0.Args[1] lo := v_0.Args[1] v.reset(OpTrunc32to8) v.AddArg(lo) @@ -2726,9 +2657,8 @@ func rewriteValuedec64_OpXor64_0(v *Value) bool { // cond: // result: (Int64Make (Xor32 (Int64Hi x) (Int64Hi y)) (Xor32 (Int64Lo x) (Int64Lo y))) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpInt64Make) v0 := b.NewValue0(v.Pos, OpXor32, typ.UInt32) v1 := b.NewValue0(v.Pos, OpInt64Hi, typ.UInt32) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index a173d4c8f7..868cd76f55 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -520,18 +520,16 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd16, t) @@ -550,18 +548,16 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd16, t) @@ -580,9 +576,8 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -610,9 +605,8 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -640,18 +634,16 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd16, t) @@ -670,18 +662,16 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd16, t) @@ -700,9 +690,8 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -730,9 +719,8 @@ func rewriteValuegeneric_OpAdd16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -758,7 +746,7 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -766,7 +754,6 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -836,19 +823,17 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Add16 i (Add16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -864,7 +849,7 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Add16 i (Add16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break @@ -876,7 +861,6 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -898,13 +882,12 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { if v_1.Op != OpAdd16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -948,19 +931,17 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Add16 i (Sub16 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -982,13 +963,12 @@ func rewriteValuegeneric_OpAdd16_10(v *Value) bool { if v_1.Op != OpSub16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -1014,13 +994,12 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { if v_1.Op != OpSub16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -1036,19 +1015,17 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Add16 i (Sub16 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -1064,7 +1041,7 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Sub16 (Add16 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub16 { break @@ -1076,7 +1053,6 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -1148,7 +1124,7 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Sub16 (Add16 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub16 { break @@ -1160,7 +1136,6 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -1187,7 +1162,7 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { if v_1.Op != OpAdd16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -1196,7 +1171,6 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c + d)) @@ -1245,14 +1219,13 @@ func rewriteValuegeneric_OpAdd16_20(v *Value) bool { if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -1319,7 +1292,7 @@ func rewriteValuegeneric_OpAdd16_30(v *Value) bool { if v_1.Op != OpSub16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -1328,7 +1301,6 @@ func rewriteValuegeneric_OpAdd16_30(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpSub16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c + d)) @@ -1345,14 +1317,13 @@ func rewriteValuegeneric_OpAdd16_30(v *Value) bool { if v_0.Op != OpSub16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -1484,18 +1455,16 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd32, t) @@ -1514,18 +1483,16 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd32, t) @@ -1544,9 +1511,8 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -1574,9 +1540,8 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -1604,18 +1569,16 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd32, t) @@ -1634,18 +1597,16 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd32, t) @@ -1664,9 +1625,8 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -1694,9 +1654,8 @@ func rewriteValuegeneric_OpAdd32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -1722,7 +1681,7 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -1730,7 +1689,6 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -1800,19 +1758,17 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Add32 i (Add32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -1828,7 +1784,7 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Add32 i (Add32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break @@ -1840,7 +1796,6 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -1862,13 +1817,12 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { if v_1.Op != OpAdd32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -1912,19 +1866,17 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Add32 i (Sub32 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -1946,13 +1898,12 @@ func rewriteValuegeneric_OpAdd32_10(v *Value) bool { if v_1.Op != OpSub32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -1978,13 +1929,12 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { if v_1.Op != OpSub32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -2000,19 +1950,17 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Add32 i (Sub32 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -2028,7 +1976,7 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Sub32 (Add32 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub32 { break @@ -2040,7 +1988,6 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -2112,7 +2059,7 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Sub32 (Add32 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub32 { break @@ -2124,7 +2071,6 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -2151,7 +2097,7 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { if v_1.Op != OpAdd32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -2160,7 +2106,6 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c + d)) @@ -2209,14 +2154,13 @@ func rewriteValuegeneric_OpAdd32_20(v *Value) bool { if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -2283,7 +2227,7 @@ func rewriteValuegeneric_OpAdd32_30(v *Value) bool { if v_1.Op != OpSub32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -2292,7 +2236,6 @@ func rewriteValuegeneric_OpAdd32_30(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpSub32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c + d)) @@ -2309,14 +2252,13 @@ func rewriteValuegeneric_OpAdd32_30(v *Value) bool { if v_0.Op != OpSub32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -2489,18 +2431,16 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd64, t) @@ -2519,18 +2459,16 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd64, t) @@ -2549,9 +2487,8 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -2579,9 +2516,8 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -2609,18 +2545,16 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd64, t) @@ -2639,18 +2573,16 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd64, t) @@ -2669,9 +2601,8 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -2699,9 +2630,8 @@ func rewriteValuegeneric_OpAdd64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -2727,7 +2657,7 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -2735,7 +2665,6 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -2805,19 +2734,17 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Add64 i (Add64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -2833,7 +2760,7 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Add64 i (Add64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break @@ -2845,7 +2772,6 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -2867,13 +2793,12 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { if v_1.Op != OpAdd64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -2917,19 +2842,17 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Add64 i (Sub64 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -2951,13 +2874,12 @@ func rewriteValuegeneric_OpAdd64_10(v *Value) bool { if v_1.Op != OpSub64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -2983,13 +2905,12 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { if v_1.Op != OpSub64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -3005,19 +2926,17 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Add64 i (Sub64 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -3033,7 +2952,7 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Sub64 (Add64 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub64 { break @@ -3045,7 +2964,6 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -3117,7 +3035,7 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Sub64 (Add64 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub64 { break @@ -3129,7 +3047,6 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -3156,7 +3073,7 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { if v_1.Op != OpAdd64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -3165,7 +3082,6 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c + d @@ -3214,14 +3130,13 @@ func rewriteValuegeneric_OpAdd64_20(v *Value) bool { if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -3288,7 +3203,7 @@ func rewriteValuegeneric_OpAdd64_30(v *Value) bool { if v_1.Op != OpSub64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -3297,7 +3212,6 @@ func rewriteValuegeneric_OpAdd64_30(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpSub64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c + d @@ -3314,14 +3228,13 @@ func rewriteValuegeneric_OpAdd64_30(v *Value) bool { if v_0.Op != OpSub64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -3494,18 +3407,16 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd8, t) @@ -3524,18 +3435,16 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd8, t) @@ -3554,9 +3463,8 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -3584,9 +3492,8 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -3614,18 +3521,16 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd8, t) @@ -3644,18 +3549,16 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpAdd8, t) @@ -3674,9 +3577,8 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] z := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -3704,9 +3606,8 @@ func rewriteValuegeneric_OpAdd8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - z := v_0.Args[0] x := v_0.Args[1] + z := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -3732,7 +3633,7 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -3740,7 +3641,6 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -3810,19 +3710,17 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Add8 i (Add8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -3838,7 +3736,7 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Add8 i (Add8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break @@ -3850,7 +3748,6 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -3872,13 +3769,12 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { if v_1.Op != OpAdd8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -3922,19 +3818,17 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Add8 i (Sub8 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -3956,13 +3850,12 @@ func rewriteValuegeneric_OpAdd8_10(v *Value) bool { if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -3988,13 +3881,12 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -4010,19 +3902,17 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Add8 i (Sub8 x z)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -4038,7 +3928,7 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Sub8 (Add8 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub8 { break @@ -4050,7 +3940,6 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -4122,7 +4011,7 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Sub8 (Add8 x z) i) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpSub8 { break @@ -4134,7 +4023,6 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -4161,7 +4049,7 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { if v_1.Op != OpAdd8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -4170,7 +4058,6 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c + d)) @@ -4219,14 +4106,13 @@ func rewriteValuegeneric_OpAdd8_20(v *Value) bool { if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -4293,7 +4179,7 @@ func rewriteValuegeneric_OpAdd8_30(v *Value) bool { if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -4302,7 +4188,6 @@ func rewriteValuegeneric_OpAdd8_30(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpSub8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c + d)) @@ -4319,14 +4204,13 @@ func rewriteValuegeneric_OpAdd8_30(v *Value) bool { if v_0.Op != OpSub8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -4598,9 +4482,8 @@ func rewriteValuegeneric_OpAnd16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -4612,7 +4495,7 @@ func rewriteValuegeneric_OpAnd16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -4620,7 +4503,6 @@ func rewriteValuegeneric_OpAnd16_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -4690,11 +4572,10 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { if v_1.Op != OpAnd16 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAnd16) v.AddArg(x) v.AddArg(y) @@ -4724,15 +4605,13 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { // cond: // result: (And16 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAnd16) @@ -4744,15 +4623,14 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { // cond: // result: (And16 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd16 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAnd16) @@ -4764,19 +4642,17 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (And16 i (And16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -4792,7 +4668,7 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (And16 i (And16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd16 { break @@ -4804,7 +4680,6 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -4826,13 +4701,12 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { if v_1.Op != OpAnd16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -4887,7 +4761,7 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { if v_1.Op != OpAnd16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -4896,7 +4770,6 @@ func rewriteValuegeneric_OpAnd16_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAnd16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c & d)) @@ -4949,14 +4822,13 @@ func rewriteValuegeneric_OpAnd16_20(v *Value) bool { if v_0.Op != OpAnd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -5157,9 +5029,8 @@ func rewriteValuegeneric_OpAnd32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -5171,7 +5042,7 @@ func rewriteValuegeneric_OpAnd32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -5179,7 +5050,6 @@ func rewriteValuegeneric_OpAnd32_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -5249,11 +5119,10 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { if v_1.Op != OpAnd32 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAnd32) v.AddArg(x) v.AddArg(y) @@ -5283,15 +5152,13 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { // cond: // result: (And32 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAnd32) @@ -5303,15 +5170,14 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { // cond: // result: (And32 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd32 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAnd32) @@ -5323,19 +5189,17 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (And32 i (And32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -5351,7 +5215,7 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (And32 i (And32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd32 { break @@ -5363,7 +5227,6 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -5385,13 +5248,12 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { if v_1.Op != OpAnd32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -5446,7 +5308,7 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { if v_1.Op != OpAnd32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -5455,7 +5317,6 @@ func rewriteValuegeneric_OpAnd32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAnd32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c & d)) @@ -5508,14 +5369,13 @@ func rewriteValuegeneric_OpAnd32_20(v *Value) bool { if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -5716,9 +5576,8 @@ func rewriteValuegeneric_OpAnd64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -5730,7 +5589,7 @@ func rewriteValuegeneric_OpAnd64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -5738,7 +5597,6 @@ func rewriteValuegeneric_OpAnd64_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -5808,11 +5666,10 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { if v_1.Op != OpAnd64 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAnd64) v.AddArg(x) v.AddArg(y) @@ -5842,15 +5699,13 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { // cond: // result: (And64 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAnd64) @@ -5862,15 +5717,14 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { // cond: // result: (And64 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd64 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAnd64) @@ -5883,13 +5737,12 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { // result: (Rsh64Ux64 (Lsh64x64 x (Const64 [nlz(y)])) (Const64 [nlz(y)])) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break } y := v_0.AuxInt - x := v.Args[1] if !(nlz(y)+nto(y) == 64 && nto(y) >= 32) { break } @@ -5937,13 +5790,12 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { // result: (Lsh64x64 (Rsh64Ux64 x (Const64 [ntz(y)])) (Const64 [ntz(y)])) for { t := v.Type - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break } y := v_0.AuxInt - x := v.Args[1] if !(nlo(y)+ntz(y) == 64 && ntz(y) >= 32) { break } @@ -5990,19 +5842,17 @@ func rewriteValuegeneric_OpAnd64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (And64 i (And64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -6022,7 +5872,7 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (And64 i (And64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd64 { break @@ -6034,7 +5884,6 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -6056,13 +5905,12 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { if v_1.Op != OpAnd64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -6117,7 +5965,7 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { if v_1.Op != OpAnd64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -6126,7 +5974,6 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAnd64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c & d @@ -6175,14 +6022,13 @@ func rewriteValuegeneric_OpAnd64_20(v *Value) bool { if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -6383,9 +6229,8 @@ func rewriteValuegeneric_OpAnd8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -6397,7 +6242,7 @@ func rewriteValuegeneric_OpAnd8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -6405,7 +6250,6 @@ func rewriteValuegeneric_OpAnd8_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -6475,11 +6319,10 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { if v_1.Op != OpAnd8 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpAnd8) v.AddArg(x) v.AddArg(y) @@ -6509,15 +6352,13 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { // cond: // result: (And8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpAnd8) @@ -6529,15 +6370,14 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { // cond: // result: (And8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd8 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpAnd8) @@ -6549,19 +6389,17 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (And8 i (And8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -6577,7 +6415,7 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (And8 i (And8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAnd8 { break @@ -6589,7 +6427,6 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -6611,13 +6448,12 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { if v_1.Op != OpAnd8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -6672,7 +6508,7 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { if v_1.Op != OpAnd8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -6681,7 +6517,6 @@ func rewriteValuegeneric_OpAnd8_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAnd8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c & d)) @@ -6734,14 +6569,13 @@ func rewriteValuegeneric_OpAnd8_20(v *Value) bool { if v_0.Op != OpAnd8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -7083,21 +6917,19 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { // cond: // result: (Add64 ptr off) for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] + off := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConvert { break } _ = v_0_0.Args[1] ptr := v_0_0.Args[0] - mem := v_0_0.Args[1] - off := v_0.Args[1] - if mem != v.Args[1] { + if mem != v_0_0.Args[1] { break } v.reset(OpAdd64) @@ -7109,7 +6941,7 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { // cond: // result: (Add64 ptr off) for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break @@ -7122,8 +6954,7 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { } _ = v_0_1.Args[1] ptr := v_0_1.Args[0] - mem := v_0_1.Args[1] - if mem != v.Args[1] { + if mem != v_0_1.Args[1] { break } v.reset(OpAdd64) @@ -7135,21 +6966,19 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { // cond: // result: (Add32 ptr off) for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] + off := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConvert { break } _ = v_0_0.Args[1] ptr := v_0_0.Args[0] - mem := v_0_0.Args[1] - off := v_0.Args[1] - if mem != v.Args[1] { + if mem != v_0_0.Args[1] { break } v.reset(OpAdd32) @@ -7161,7 +6990,7 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { // cond: // result: (Add32 ptr off) for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break @@ -7174,8 +7003,7 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { } _ = v_0_1.Args[1] ptr := v_0_1.Args[0] - mem := v_0_1.Args[1] - if mem != v.Args[1] { + if mem != v_0_1.Args[1] { break } v.reset(OpAdd32) @@ -7187,15 +7015,14 @@ func rewriteValuegeneric_OpConvert_0(v *Value) bool { // cond: // result: ptr for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConvert { break } _ = v_0.Args[1] ptr := v_0.Args[0] - mem := v_0.Args[1] - if mem != v.Args[1] { + if mem != v_0.Args[1] { break } v.reset(OpCopy) @@ -8948,9 +8775,8 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -8972,7 +8798,7 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { if v_1.Op != OpAdd16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -8981,7 +8807,6 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpEq16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c - d)) @@ -9030,14 +8855,13 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -9132,9 +8956,8 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { if s.Op != OpSub16 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -9166,9 +8989,8 @@ func rewriteValuegeneric_OpEq16_0(v *Value) bool { if s.Op != OpSub16 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -9185,9 +9007,8 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -9209,7 +9030,7 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { if v_1.Op != OpAdd32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -9218,7 +9039,6 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpEq32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c - d)) @@ -9267,14 +9087,13 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -9369,9 +9188,8 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { if s.Op != OpSub32 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -9403,9 +9221,8 @@ func rewriteValuegeneric_OpEq32_0(v *Value) bool { if s.Op != OpSub32 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -9463,9 +9280,8 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -9487,7 +9303,7 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { if v_1.Op != OpAdd64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -9496,7 +9312,6 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpEq64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c - d @@ -9545,14 +9360,13 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -9647,9 +9461,8 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { if s.Op != OpSub64 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -9681,9 +9494,8 @@ func rewriteValuegeneric_OpEq64_0(v *Value) bool { if s.Op != OpSub64 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -9741,9 +9553,8 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -9765,7 +9576,7 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { if v_1.Op != OpAdd8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -9774,7 +9585,6 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpEq8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c - d)) @@ -9823,14 +9633,13 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -9925,9 +9734,8 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { if s.Op != OpSub8 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -9959,9 +9767,8 @@ func rewriteValuegeneric_OpEq8_0(v *Value) bool { if s.Op != OpSub8 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -10015,7 +9822,7 @@ func rewriteValuegeneric_OpEqB_0(v *Value) bool { // cond: // result: (Not x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstBool { break @@ -10023,7 +9830,6 @@ func rewriteValuegeneric_OpEqB_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpNot) v.AddArg(x) return true @@ -10049,7 +9855,7 @@ func rewriteValuegeneric_OpEqB_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstBool { break @@ -10057,7 +9863,6 @@ func rewriteValuegeneric_OpEqB_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -10090,9 +9895,8 @@ func rewriteValuegeneric_OpEqInter_0(v *Value) bool { // cond: // result: (EqPtr (ITab x) (ITab y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpEqPtr) v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) v0.AddArg(x) @@ -10108,9 +9912,8 @@ func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -10201,14 +10004,13 @@ func rewriteValuegeneric_OpEqPtr_0(v *Value) bool { // cond: isSamePtr(p1, p2) // result: (ConstBool [b2i(o1 == 0)]) for { - _ = v.Args[1] + p2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOffPtr { break } o1 := v_0.AuxInt p1 := v_0.Args[0] - p2 := v.Args[1] if !(isSamePtr(p1, p2)) { break } @@ -10440,15 +10242,13 @@ func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { // cond: isSamePtr(p1, p2) // result: (Not (IsNonNil o1)) for { - _ = v.Args[1] + p2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAddPtr { break } - _ = v_0.Args[1] - p1 := v_0.Args[0] o1 := v_0.Args[1] - p2 := v.Args[1] + p1 := v_0.Args[0] if !(isSamePtr(p1, p2)) { break } @@ -10468,9 +10268,8 @@ func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { if v_1.Op != OpAddPtr { break } - _ = v_1.Args[1] - p1 := v_1.Args[0] o1 := v_1.Args[1] + p1 := v_1.Args[0] if !(isSamePtr(p1, p2)) { break } @@ -10484,7 +10283,7 @@ func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { // cond: // result: (Not (IsNonNil p)) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -10492,7 +10291,6 @@ func rewriteValuegeneric_OpEqPtr_10(v *Value) bool { if v_0.AuxInt != 0 { break } - p := v.Args[1] v.reset(OpNot) v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) v0.AddArg(p) @@ -10527,7 +10325,7 @@ func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { // cond: // result: (Not (IsNonNil p)) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -10535,7 +10333,6 @@ func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { if v_0.AuxInt != 0 { break } - p := v.Args[1] v.reset(OpNot) v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) v0.AddArg(p) @@ -10565,12 +10362,11 @@ func rewriteValuegeneric_OpEqPtr_20(v *Value) bool { // cond: // result: (Not (IsNonNil p)) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstNil { break } - p := v.Args[1] v.reset(OpNot) v0 := b.NewValue0(v.Pos, OpIsNonNil, typ.Bool) v0.AddArg(p) @@ -10602,9 +10398,8 @@ func rewriteValuegeneric_OpEqSlice_0(v *Value) bool { // cond: // result: (EqPtr (SlicePtr x) (SlicePtr y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpEqPtr) v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) v0.AddArg(x) @@ -11096,7 +10891,7 @@ func rewriteValuegeneric_OpInterCall_0(v *Value) bool { // result: (StaticCall [argsize] {devirt(v, itab, off)} mem) for { argsize := v.AuxInt - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpLoad { break @@ -11125,7 +10920,6 @@ func rewriteValuegeneric_OpInterCall_0(v *Value) bool { if v_0_0_0_0_0_0.Op != OpSB { break } - mem := v.Args[1] if !(devirt(v, itab, off) != nil) { break } @@ -11226,9 +11020,8 @@ func rewriteValuegeneric_OpIsInBounds_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -11871,14 +11664,13 @@ func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMod32u { break } _ = v_0.Args[1] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpConstBool) @@ -11889,14 +11681,13 @@ func rewriteValuegeneric_OpIsInBounds_20(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpMod64u { break } _ = v_0.Args[1] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpConstBool) @@ -12273,9 +12064,8 @@ func rewriteValuegeneric_OpIsSliceInBounds_0(v *Value) bool { // cond: // result: (ConstBool [1]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -13575,9 +13365,8 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { // result: (StructMake1 (Load (OffPtr [0] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsStruct() && t.NumFields() == 1 && fe.CanSSA(t)) { break } @@ -13596,9 +13385,8 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { // result: (StructMake2 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsStruct() && t.NumFields() == 2 && fe.CanSSA(t)) { break } @@ -13624,9 +13412,8 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { // result: (StructMake3 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsStruct() && t.NumFields() == 3 && fe.CanSSA(t)) { break } @@ -13659,9 +13446,8 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { // result: (StructMake4 (Load (OffPtr [0] ptr) mem) (Load (OffPtr [t.FieldOff(1)] ptr) mem) (Load (OffPtr [t.FieldOff(2)] ptr) mem) (Load (OffPtr [t.FieldOff(3)] ptr) mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsStruct() && t.NumFields() == 4 && fe.CanSSA(t)) { break } @@ -13713,9 +13499,8 @@ func rewriteValuegeneric_OpLoad_20(v *Value) bool { // result: (ArrayMake1 (Load ptr mem)) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] if !(t.IsArray() && t.NumElem() == 1 && fe.CanSSA(t)) { break } @@ -15628,14 +15413,13 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { break } t2 := store.Aux - _ = store.Args[2] + mem := store.Args[2] op := store.Args[0] if op.Op != OpOffPtr { break } o2 := op.AuxInt dst2 := op.Args[0] - mem := store.Args[2] if !(isSamePtr(dst1, dst2) && store.Uses == 1 && n >= o2+sizeof(t2) && disjoint(src1, n, op, sizeof(t2)) && clobber(store)) { break } @@ -15666,9 +15450,8 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { if move.Aux != t { break } - _ = move.Args[2] - dst2 := move.Args[0] mem := move.Args[2] + dst2 := move.Args[0] if !(move.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move)) { break } @@ -15704,9 +15487,8 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { if move.Aux != t { break } - _ = move.Args[2] - dst2 := move.Args[0] mem := move.Args[2] + dst2 := move.Args[0] if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(move) && clobber(vardef)) { break } @@ -15740,9 +15522,8 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { if zero.Aux != t { break } - _ = zero.Args[1] - dst2 := zero.Args[0] mem := zero.Args[1] + dst2 := zero.Args[0] if !(zero.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero)) { break } @@ -15778,9 +15559,8 @@ func rewriteValuegeneric_OpMove_0(v *Value) bool { if zero.Aux != t { break } - _ = zero.Args[1] - dst2 := zero.Args[0] mem := zero.Args[1] + dst2 := zero.Args[0] if !(zero.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && disjoint(src1, n, dst2, n) && clobber(zero) && clobber(vardef)) { break } @@ -17066,10 +16846,9 @@ func rewriteValuegeneric_OpMove_20(v *Value) bool { // cond: isSamePtr(dst, src) // result: mem for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] src := v.Args[1] - mem := v.Args[2] if !(isSamePtr(dst, src)) { break } @@ -17125,7 +16904,7 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -17133,7 +16912,6 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -17161,7 +16939,7 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { // cond: // result: (Neg16 x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -17169,7 +16947,6 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpNeg16) v.AddArg(x) return true @@ -17219,13 +16996,12 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { // result: (Lsh16x64 n (Const64 [log2(c)])) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break } c := v_0.AuxInt - n := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -17266,13 +17042,12 @@ func rewriteValuegeneric_OpMul16_0(v *Value) bool { // result: (Neg16 (Lsh16x64 n (Const64 [log2(-c)]))) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break } c := v_0.AuxInt - n := v.Args[1] if !(t.IsSigned() && isPowerOfTwo(-c)) { break } @@ -17336,7 +17111,7 @@ func rewriteValuegeneric_OpMul16_10(v *Value) bool { if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -17345,7 +17120,6 @@ func rewriteValuegeneric_OpMul16_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpMul16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c * d)) @@ -17394,14 +17168,13 @@ func rewriteValuegeneric_OpMul16_10(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -17496,7 +17269,7 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -17504,7 +17277,6 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -17532,7 +17304,7 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { // cond: // result: (Neg32 x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -17540,7 +17312,6 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpNeg32) v.AddArg(x) return true @@ -17590,13 +17361,12 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { // result: (Lsh32x64 n (Const64 [log2(c)])) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break } c := v_0.AuxInt - n := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -17637,13 +17407,12 @@ func rewriteValuegeneric_OpMul32_0(v *Value) bool { // result: (Neg32 (Lsh32x64 n (Const64 [log2(-c)]))) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break } c := v_0.AuxInt - n := v.Args[1] if !(t.IsSigned() && isPowerOfTwo(-c)) { break } @@ -17678,7 +17447,7 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { if v_1.Type != t { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -17687,7 +17456,6 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c * d)) @@ -17750,7 +17518,7 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break @@ -17759,7 +17527,6 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { break } d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -17867,7 +17634,7 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -17876,7 +17643,6 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpMul32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c * d)) @@ -17925,14 +17691,13 @@ func rewriteValuegeneric_OpMul32_10(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -18043,7 +17808,7 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32F { break @@ -18051,7 +17816,6 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { if v_0.AuxInt != auxFrom64F(1) { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -18078,7 +17842,7 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { // cond: // result: (Neg32F x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32F { break @@ -18086,7 +17850,6 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { if v_0.AuxInt != auxFrom32F(-1) { break } - x := v.Args[1] v.reset(OpNeg32F) v.AddArg(x) return true @@ -18113,7 +17876,7 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { // cond: // result: (Add32F x x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32F { break @@ -18121,7 +17884,6 @@ func rewriteValuegeneric_OpMul32F_0(v *Value) bool { if v_0.AuxInt != auxFrom32F(2) { break } - x := v.Args[1] v.reset(OpAdd32F) v.AddArg(x) v.AddArg(x) @@ -18174,7 +17936,7 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -18182,7 +17944,6 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -18210,7 +17971,7 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { // cond: // result: (Neg64 x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -18218,7 +17979,6 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpNeg64) v.AddArg(x) return true @@ -18268,13 +18028,12 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { // result: (Lsh64x64 n (Const64 [log2(c)])) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break } c := v_0.AuxInt - n := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -18315,13 +18074,12 @@ func rewriteValuegeneric_OpMul64_0(v *Value) bool { // result: (Neg64 (Lsh64x64 n (Const64 [log2(-c)]))) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break } c := v_0.AuxInt - n := v.Args[1] if !(t.IsSigned() && isPowerOfTwo(-c)) { break } @@ -18356,7 +18114,7 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { if v_1.Type != t { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -18365,7 +18123,6 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c * d @@ -18428,7 +18185,7 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { break } t := v_0.Type - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break @@ -18437,7 +18194,6 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { break } d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -18545,7 +18301,7 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -18554,7 +18310,6 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpMul64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c * d @@ -18603,14 +18358,13 @@ func rewriteValuegeneric_OpMul64_10(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -18721,7 +18475,7 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64F { break @@ -18729,7 +18483,6 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { if v_0.AuxInt != auxFrom64F(1) { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -18756,7 +18509,7 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { // cond: // result: (Neg64F x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64F { break @@ -18764,7 +18517,6 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { if v_0.AuxInt != auxFrom64F(-1) { break } - x := v.Args[1] v.reset(OpNeg64F) v.AddArg(x) return true @@ -18791,7 +18543,7 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { // cond: // result: (Add64F x x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64F { break @@ -18799,7 +18551,6 @@ func rewriteValuegeneric_OpMul64F_0(v *Value) bool { if v_0.AuxInt != auxFrom64F(2) { break } - x := v.Args[1] v.reset(OpAdd64F) v.AddArg(x) v.AddArg(x) @@ -18852,7 +18603,7 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -18860,7 +18611,6 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -18888,7 +18638,7 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { // cond: // result: (Neg8 x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -18896,7 +18646,6 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { if v_0.AuxInt != -1 { break } - x := v.Args[1] v.reset(OpNeg8) v.AddArg(x) return true @@ -18946,13 +18695,12 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { // result: (Lsh8x64 n (Const64 [log2(c)])) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break } c := v_0.AuxInt - n := v.Args[1] if !(isPowerOfTwo(c)) { break } @@ -18993,13 +18741,12 @@ func rewriteValuegeneric_OpMul8_0(v *Value) bool { // result: (Neg8 (Lsh8x64 n (Const64 [log2(-c)]))) for { t := v.Type - _ = v.Args[1] + n := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break } c := v_0.AuxInt - n := v.Args[1] if !(t.IsSigned() && isPowerOfTwo(-c)) { break } @@ -19063,7 +18810,7 @@ func rewriteValuegeneric_OpMul8_10(v *Value) bool { if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -19072,7 +18819,6 @@ func rewriteValuegeneric_OpMul8_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpMul8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c * d)) @@ -19121,14 +18867,13 @@ func rewriteValuegeneric_OpMul8_10(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -19200,9 +18945,8 @@ func rewriteValuegeneric_OpNeg16_0(v *Value) bool { if v_0.Op != OpSub16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSub16) v.AddArg(y) v.AddArg(x) @@ -19232,9 +18976,8 @@ func rewriteValuegeneric_OpNeg32_0(v *Value) bool { if v_0.Op != OpSub32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSub32) v.AddArg(y) v.AddArg(x) @@ -19283,9 +19026,8 @@ func rewriteValuegeneric_OpNeg64_0(v *Value) bool { if v_0.Op != OpSub64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSub64) v.AddArg(y) v.AddArg(x) @@ -19334,9 +19076,8 @@ func rewriteValuegeneric_OpNeg8_0(v *Value) bool { if v_0.Op != OpSub8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpSub8) v.AddArg(y) v.AddArg(x) @@ -19350,9 +19091,8 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -19374,7 +19114,7 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { if v_1.Op != OpAdd16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -19383,7 +19123,6 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpNeq16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c - d)) @@ -19432,14 +19171,13 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -19534,9 +19272,8 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { if s.Op != OpSub16 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -19568,9 +19305,8 @@ func rewriteValuegeneric_OpNeq16_0(v *Value) bool { if s.Op != OpSub16 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -19587,9 +19323,8 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -19611,7 +19346,7 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { if v_1.Op != OpAdd32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -19620,7 +19355,6 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpNeq32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c - d)) @@ -19669,14 +19403,13 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -19771,9 +19504,8 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { if s.Op != OpSub32 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -19805,9 +19537,8 @@ func rewriteValuegeneric_OpNeq32_0(v *Value) bool { if s.Op != OpSub32 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -19865,9 +19596,8 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -19889,7 +19619,7 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { if v_1.Op != OpAdd64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -19898,7 +19628,6 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpNeq64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c - d @@ -19947,14 +19676,13 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -20049,9 +19777,8 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { if s.Op != OpSub64 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -20083,9 +19810,8 @@ func rewriteValuegeneric_OpNeq64_0(v *Value) bool { if s.Op != OpSub64 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -20143,9 +19869,8 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -20167,7 +19892,7 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { if v_1.Op != OpAdd8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -20176,7 +19901,6 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpNeq8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c - d)) @@ -20225,14 +19949,13 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -20327,9 +20050,8 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { if s.Op != OpSub8 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -20361,9 +20083,8 @@ func rewriteValuegeneric_OpNeq8_0(v *Value) bool { if s.Op != OpSub8 { break } - _ = s.Args[1] - x := s.Args[0] y := s.Args[1] + x := s.Args[0] if !(s.Uses == 1) { break } @@ -20417,7 +20138,7 @@ func rewriteValuegeneric_OpNeqB_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstBool { break @@ -20425,7 +20146,6 @@ func rewriteValuegeneric_OpNeqB_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -20453,7 +20173,7 @@ func rewriteValuegeneric_OpNeqB_0(v *Value) bool { // cond: // result: (Not x) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstBool { break @@ -20461,7 +20181,6 @@ func rewriteValuegeneric_OpNeqB_0(v *Value) bool { if v_0.AuxInt != 1 { break } - x := v.Args[1] v.reset(OpNot) v.AddArg(x) return true @@ -20532,9 +20251,8 @@ func rewriteValuegeneric_OpNeqInter_0(v *Value) bool { // cond: // result: (NeqPtr (ITab x) (ITab y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpNeqPtr) v0 := b.NewValue0(v.Pos, OpITab, typ.Uintptr) v0.AddArg(x) @@ -20550,9 +20268,8 @@ func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { // cond: // result: (ConstBool [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConstBool) @@ -20643,14 +20360,13 @@ func rewriteValuegeneric_OpNeqPtr_0(v *Value) bool { // cond: isSamePtr(p1, p2) // result: (ConstBool [b2i(o1 != 0)]) for { - _ = v.Args[1] + p2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOffPtr { break } o1 := v_0.AuxInt p1 := v_0.Args[0] - p2 := v.Args[1] if !(isSamePtr(p1, p2)) { break } @@ -20880,15 +20596,13 @@ func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { // cond: isSamePtr(p1, p2) // result: (IsNonNil o1) for { - _ = v.Args[1] + p2 := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAddPtr { break } - _ = v_0.Args[1] - p1 := v_0.Args[0] o1 := v_0.Args[1] - p2 := v.Args[1] + p1 := v_0.Args[0] if !(isSamePtr(p1, p2)) { break } @@ -20906,9 +20620,8 @@ func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { if v_1.Op != OpAddPtr { break } - _ = v_1.Args[1] - p1 := v_1.Args[0] o1 := v_1.Args[1] + p1 := v_1.Args[0] if !(isSamePtr(p1, p2)) { break } @@ -20920,7 +20633,7 @@ func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { // cond: // result: (IsNonNil p) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -20928,7 +20641,6 @@ func rewriteValuegeneric_OpNeqPtr_10(v *Value) bool { if v_0.AuxInt != 0 { break } - p := v.Args[1] v.reset(OpIsNonNil) v.AddArg(p) return true @@ -20957,7 +20669,7 @@ func rewriteValuegeneric_OpNeqPtr_20(v *Value) bool { // cond: // result: (IsNonNil p) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -20965,7 +20677,6 @@ func rewriteValuegeneric_OpNeqPtr_20(v *Value) bool { if v_0.AuxInt != 0 { break } - p := v.Args[1] v.reset(OpIsNonNil) v.AddArg(p) return true @@ -20991,12 +20702,11 @@ func rewriteValuegeneric_OpNeqPtr_20(v *Value) bool { // cond: // result: (IsNonNil p) for { - _ = v.Args[1] + p := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConstNil { break } - p := v.Args[1] v.reset(OpIsNonNil) v.AddArg(p) return true @@ -21024,9 +20734,8 @@ func rewriteValuegeneric_OpNeqSlice_0(v *Value) bool { // cond: // result: (NeqPtr (SlicePtr x) (SlicePtr y)) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpNeqPtr) v0 := b.NewValue0(v.Pos, OpSlicePtr, typ.BytePtr) v0.AddArg(x) @@ -21045,13 +20754,12 @@ func rewriteValuegeneric_OpNilCheck_0(v *Value) bool { // cond: // result: mem for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpGetG { break } - mem := v_0.Args[0] - if mem != v.Args[1] { + if mem != v_0.Args[0] { break } v.reset(OpCopy) @@ -21147,9 +20855,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpEq64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpNeq64) v.AddArg(x) v.AddArg(y) @@ -21163,9 +20870,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpEq32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpNeq32) v.AddArg(x) v.AddArg(y) @@ -21179,9 +20885,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpEq16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpNeq16) v.AddArg(x) v.AddArg(y) @@ -21195,9 +20900,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpEq8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpNeq8) v.AddArg(x) v.AddArg(y) @@ -21211,9 +20915,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpEqB { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpNeqB) v.AddArg(x) v.AddArg(y) @@ -21227,9 +20930,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpNeq64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpEq64) v.AddArg(x) v.AddArg(y) @@ -21243,9 +20945,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpNeq32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpEq32) v.AddArg(x) v.AddArg(y) @@ -21259,9 +20960,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpNeq16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpEq16) v.AddArg(x) v.AddArg(y) @@ -21275,9 +20975,8 @@ func rewriteValuegeneric_OpNot_0(v *Value) bool { if v_0.Op != OpNeq8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpEq8) v.AddArg(x) v.AddArg(y) @@ -21294,9 +20993,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpNeqB { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpEqB) v.AddArg(x) v.AddArg(y) @@ -21310,9 +21008,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq64) v.AddArg(x) v.AddArg(y) @@ -21326,9 +21023,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq32) v.AddArg(x) v.AddArg(y) @@ -21342,9 +21038,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq16) v.AddArg(x) v.AddArg(y) @@ -21358,9 +21053,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq8) v.AddArg(x) v.AddArg(y) @@ -21374,9 +21068,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater64U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq64U) v.AddArg(x) v.AddArg(y) @@ -21390,9 +21083,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater32U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq32U) v.AddArg(x) v.AddArg(y) @@ -21406,9 +21098,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater16U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq16U) v.AddArg(x) v.AddArg(y) @@ -21422,9 +21113,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGreater8U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLeq8U) v.AddArg(x) v.AddArg(y) @@ -21438,9 +21128,8 @@ func rewriteValuegeneric_OpNot_10(v *Value) bool { if v_0.Op != OpGeq64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess64) v.AddArg(x) v.AddArg(y) @@ -21457,9 +21146,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess32) v.AddArg(x) v.AddArg(y) @@ -21473,9 +21161,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess16) v.AddArg(x) v.AddArg(y) @@ -21489,9 +21176,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess8) v.AddArg(x) v.AddArg(y) @@ -21505,9 +21191,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq64U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess64U) v.AddArg(x) v.AddArg(y) @@ -21521,9 +21206,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq32U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess32U) v.AddArg(x) v.AddArg(y) @@ -21537,9 +21221,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq16U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess16U) v.AddArg(x) v.AddArg(y) @@ -21553,9 +21236,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpGeq8U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpLess8U) v.AddArg(x) v.AddArg(y) @@ -21569,9 +21251,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpLess64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq64) v.AddArg(x) v.AddArg(y) @@ -21585,9 +21266,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpLess32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq32) v.AddArg(x) v.AddArg(y) @@ -21601,9 +21281,8 @@ func rewriteValuegeneric_OpNot_20(v *Value) bool { if v_0.Op != OpLess16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq16) v.AddArg(x) v.AddArg(y) @@ -21620,9 +21299,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLess8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq8) v.AddArg(x) v.AddArg(y) @@ -21636,9 +21314,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLess64U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq64U) v.AddArg(x) v.AddArg(y) @@ -21652,9 +21329,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLess32U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq32U) v.AddArg(x) v.AddArg(y) @@ -21668,9 +21344,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLess16U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq16U) v.AddArg(x) v.AddArg(y) @@ -21684,9 +21359,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLess8U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGeq8U) v.AddArg(x) v.AddArg(y) @@ -21700,9 +21374,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLeq64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater64) v.AddArg(x) v.AddArg(y) @@ -21716,9 +21389,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLeq32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater32) v.AddArg(x) v.AddArg(y) @@ -21732,9 +21404,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLeq16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater16) v.AddArg(x) v.AddArg(y) @@ -21748,9 +21419,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLeq8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater8) v.AddArg(x) v.AddArg(y) @@ -21764,9 +21434,8 @@ func rewriteValuegeneric_OpNot_30(v *Value) bool { if v_0.Op != OpLeq64U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater64U) v.AddArg(x) v.AddArg(y) @@ -21783,9 +21452,8 @@ func rewriteValuegeneric_OpNot_40(v *Value) bool { if v_0.Op != OpLeq32U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater32U) v.AddArg(x) v.AddArg(y) @@ -21799,9 +21467,8 @@ func rewriteValuegeneric_OpNot_40(v *Value) bool { if v_0.Op != OpLeq16U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater16U) v.AddArg(x) v.AddArg(y) @@ -21815,9 +21482,8 @@ func rewriteValuegeneric_OpNot_40(v *Value) bool { if v_0.Op != OpLeq8U { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v.reset(OpGreater8U) v.AddArg(x) v.AddArg(y) @@ -21903,9 +21569,8 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -21917,7 +21582,7 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -21925,7 +21590,6 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -21991,11 +21655,10 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { if v_1.Op != OpOr16 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpOr16) v.AddArg(x) v.AddArg(y) @@ -22025,15 +21688,13 @@ func rewriteValuegeneric_OpOr16_0(v *Value) bool { // cond: // result: (Or16 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpOr16) @@ -22049,15 +21710,14 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { // cond: // result: (Or16 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr16 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpOr16) @@ -22106,13 +21766,12 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { if v_0.Op != OpAnd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } c2 := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -22176,13 +21835,12 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { if v_1.Op != OpAnd16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break } c2 := v_1_0.AuxInt - x := v_1.Args[1] if !(^(c1 | c2) == 0) { break } @@ -22197,19 +21855,17 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Or16 i (Or16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -22225,7 +21881,7 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Or16 i (Or16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr16 { break @@ -22237,7 +21893,6 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -22259,13 +21914,12 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { if v_1.Op != OpOr16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -22320,7 +21974,7 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { if v_1.Op != OpOr16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -22329,7 +21983,6 @@ func rewriteValuegeneric_OpOr16_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpOr16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c | d)) @@ -22382,14 +22035,13 @@ func rewriteValuegeneric_OpOr16_20(v *Value) bool { if v_0.Op != OpOr16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -22482,9 +22134,8 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -22496,7 +22147,7 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -22504,7 +22155,6 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -22570,11 +22220,10 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { if v_1.Op != OpOr32 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpOr32) v.AddArg(x) v.AddArg(y) @@ -22604,15 +22253,13 @@ func rewriteValuegeneric_OpOr32_0(v *Value) bool { // cond: // result: (Or32 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpOr32) @@ -22628,15 +22275,14 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { // cond: // result: (Or32 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr32 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpOr32) @@ -22685,13 +22331,12 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } c2 := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -22755,13 +22400,12 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { if v_1.Op != OpAnd32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break } c2 := v_1_0.AuxInt - x := v_1.Args[1] if !(^(c1 | c2) == 0) { break } @@ -22776,19 +22420,17 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Or32 i (Or32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -22804,7 +22446,7 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Or32 i (Or32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr32 { break @@ -22816,7 +22458,6 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -22838,13 +22479,12 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { if v_1.Op != OpOr32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -22899,7 +22539,7 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { if v_1.Op != OpOr32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -22908,7 +22548,6 @@ func rewriteValuegeneric_OpOr32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpOr32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c | d)) @@ -22961,14 +22600,13 @@ func rewriteValuegeneric_OpOr32_20(v *Value) bool { if v_0.Op != OpOr32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -23061,9 +22699,8 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -23075,7 +22712,7 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -23083,7 +22720,6 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -23149,11 +22785,10 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { if v_1.Op != OpOr64 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpOr64) v.AddArg(x) v.AddArg(y) @@ -23183,15 +22818,13 @@ func rewriteValuegeneric_OpOr64_0(v *Value) bool { // cond: // result: (Or64 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpOr64) @@ -23207,15 +22840,14 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { // cond: // result: (Or64 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr64 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpOr64) @@ -23264,13 +22896,12 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } c2 := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -23334,13 +22965,12 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { if v_1.Op != OpAnd64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break } c2 := v_1_0.AuxInt - x := v_1.Args[1] if !(^(c1 | c2) == 0) { break } @@ -23355,19 +22985,17 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Or64 i (Or64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -23383,7 +23011,7 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Or64 i (Or64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr64 { break @@ -23395,7 +23023,6 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -23417,13 +23044,12 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { if v_1.Op != OpOr64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -23478,7 +23104,7 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { if v_1.Op != OpOr64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -23487,7 +23113,6 @@ func rewriteValuegeneric_OpOr64_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpOr64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c | d @@ -23540,14 +23165,13 @@ func rewriteValuegeneric_OpOr64_20(v *Value) bool { if v_0.Op != OpOr64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -23640,9 +23264,8 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpCopy) @@ -23654,7 +23277,7 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -23662,7 +23285,6 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -23728,11 +23350,10 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { if v_1.Op != OpOr8 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpOr8) v.AddArg(x) v.AddArg(y) @@ -23762,15 +23383,13 @@ func rewriteValuegeneric_OpOr8_0(v *Value) bool { // cond: // result: (Or8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpOr8) @@ -23786,15 +23405,14 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { // cond: // result: (Or8 x y) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr8 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpOr8) @@ -23843,13 +23461,12 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { if v_0.Op != OpAnd8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } c2 := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -23913,13 +23530,12 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { if v_1.Op != OpAnd8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break } c2 := v_1_0.AuxInt - x := v_1.Args[1] if !(^(c1 | c2) == 0) { break } @@ -23934,19 +23550,17 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Or8 i (Or8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -23962,7 +23576,7 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Or8 i (Or8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpOr8 { break @@ -23974,7 +23588,6 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -23996,13 +23609,12 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { if v_1.Op != OpOr8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -24057,7 +23669,7 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { if v_1.Op != OpOr8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -24066,7 +23678,6 @@ func rewriteValuegeneric_OpOr8_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpOr8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c | d)) @@ -24119,14 +23730,13 @@ func rewriteValuegeneric_OpOr8_20(v *Value) bool { if v_0.Op != OpOr8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -24284,9 +23894,8 @@ func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { // result: (AddPtr ptr (Mul32 idx (Const32 [t.Elem().Size()]))) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] idx := v.Args[1] + ptr := v.Args[0] if !(config.PtrSize == 4) { break } @@ -24305,9 +23914,8 @@ func rewriteValuegeneric_OpPtrIndex_0(v *Value) bool { // result: (AddPtr ptr (Mul64 idx (Const64 [t.Elem().Size()]))) for { t := v.Type - _ = v.Args[1] - ptr := v.Args[0] idx := v.Args[1] + ptr := v.Args[0] if !(config.PtrSize == 8) { break } @@ -27241,9 +26849,8 @@ func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { break } t := s3.Aux - _ = s3.Args[2] - dst := s3.Args[1] mem := s3.Args[2] + dst := s3.Args[1] if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { break } @@ -27281,9 +26888,8 @@ func rewriteValuegeneric_OpStaticCall_0(v *Value) bool { break } t := s3.Aux - _ = s3.Args[2] - dst := s3.Args[1] mem := s3.Args[2] + dst := s3.Args[1] if !(isSameSym(sym, "runtime.memmove") && t.(*types.Type).IsPtr() && s1.Uses == 1 && s2.Uses == 1 && s3.Uses == 1 && isInlinableMemmove(dst, src, sz, config) && clobber(s1) && clobber(s2) && clobber(s3)) { break } @@ -27318,7 +26924,7 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { // result: mem for { t1 := v.Aux - _ = v.Args[2] + mem := v.Args[2] p1 := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpLoad { @@ -27327,8 +26933,7 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { t2 := v_1.Type _ = v_1.Args[1] p2 := v_1.Args[0] - mem := v_1.Args[1] - if mem != v.Args[2] { + if mem != v_1.Args[1] { break } if !(isSamePtr(p1, p2) && t2.Size() == sizeof(t1)) { @@ -27351,9 +26956,8 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { break } t2 := v_1.Type - _ = v_1.Args[1] - p2 := v_1.Args[0] oldmem := v_1.Args[1] + p2 := v_1.Args[0] mem := v.Args[2] if mem.Op != OpStore { break @@ -27384,9 +26988,8 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { break } t2 := v_1.Type - _ = v_1.Args[1] - p2 := v_1.Args[0] oldmem := v_1.Args[1] + p2 := v_1.Args[0] mem := v.Args[2] if mem.Op != OpStore { break @@ -27424,9 +27027,8 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { break } t2 := v_1.Type - _ = v_1.Args[1] - p2 := v_1.Args[0] oldmem := v_1.Args[1] + p2 := v_1.Args[0] mem := v.Args[2] if mem.Op != OpStore { break @@ -27617,12 +27219,11 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { // cond: // result: mem for { - _ = v.Args[2] + mem := v.Args[2] v_1 := v.Args[1] if v_1.Op != OpStructMake0 { break } - mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type v.AddArg(mem) @@ -27632,7 +27233,7 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { // cond: // result: (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpStructMake1 { @@ -27640,7 +27241,6 @@ func rewriteValuegeneric_OpStore_0(v *Value) bool { } t := v_1.Type f0 := v_1.Args[0] - mem := v.Args[2] v.reset(OpStore) v.Aux = t.FieldType(0) v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(0).PtrTo()) @@ -27661,17 +27261,15 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: // result: (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpStructMake2 { break } t := v_1.Type - _ = v_1.Args[1] - f0 := v_1.Args[0] f1 := v_1.Args[1] - mem := v.Args[2] + f0 := v_1.Args[0] v.reset(OpStore) v.Aux = t.FieldType(1) v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(1).PtrTo()) @@ -27694,18 +27292,16 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: // result: (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem))) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpStructMake3 { break } t := v_1.Type - _ = v_1.Args[2] + f2 := v_1.Args[2] f0 := v_1.Args[0] f1 := v_1.Args[1] - f2 := v_1.Args[2] - mem := v.Args[2] v.reset(OpStore) v.Aux = t.FieldType(2) v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(2).PtrTo()) @@ -27736,19 +27332,17 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: // result: (Store {t.FieldType(3)} (OffPtr [t.FieldOff(3)] dst) f3 (Store {t.FieldType(2)} (OffPtr [t.FieldOff(2)] dst) f2 (Store {t.FieldType(1)} (OffPtr [t.FieldOff(1)] dst) f1 (Store {t.FieldType(0)} (OffPtr [0] dst) f0 mem)))) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpStructMake4 { break } t := v_1.Type - _ = v_1.Args[3] + f3 := v_1.Args[3] f0 := v_1.Args[0] f1 := v_1.Args[1] f2 := v_1.Args[2] - f3 := v_1.Args[3] - mem := v.Args[2] v.reset(OpStore) v.Aux = t.FieldType(3) v0 := b.NewValue0(v.Pos, OpOffPtr, t.FieldType(3).PtrTo()) @@ -27788,7 +27382,7 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // result: (Move {t} [sizeof(t)] dst src mem) for { t := v.Aux - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpLoad { @@ -27796,8 +27390,7 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { } _ = v_1.Args[1] src := v_1.Args[0] - mem := v_1.Args[1] - if mem != v.Args[2] { + if mem != v_1.Args[1] { break } if !(!fe.CanSSA(t.(*types.Type))) { @@ -27822,9 +27415,8 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { if v_1.Op != OpLoad { break } - _ = v_1.Args[1] - src := v_1.Args[0] mem := v_1.Args[1] + src := v_1.Args[0] v_2 := v.Args[2] if v_2.Op != OpVarDef { break @@ -27851,12 +27443,11 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: // result: mem for { - _ = v.Args[2] + mem := v.Args[2] v_1 := v.Args[1] if v_1.Op != OpArrayMake0 { break } - mem := v.Args[2] v.reset(OpCopy) v.Type = mem.Type v.AddArg(mem) @@ -27866,14 +27457,13 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: // result: (Store {e.Type} dst e mem) for { - _ = v.Args[2] + mem := v.Args[2] dst := v.Args[0] v_1 := v.Args[1] if v_1.Op != OpArrayMake1 { break } e := v_1.Args[0] - mem := v.Args[2] v.reset(OpStore) v.Aux = e.Type v.AddArg(dst) @@ -27885,7 +27475,7 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpLoad { break @@ -27900,11 +27490,10 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { if v_0_0_0.Op != OpSP { break } - mem := v_0.Args[1] - x := v.Args[1] - if mem != v.Args[2] { + if mem != v_0.Args[1] { break } + x := v.Args[1] if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } @@ -27917,7 +27506,7 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { // cond: isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { - _ = v.Args[2] + mem := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpOffPtr { break @@ -27936,11 +27525,10 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { if v_0_0_0_0.Op != OpSP { break } - mem := v_0_0.Args[1] - x := v.Args[1] - if mem != v.Args[2] { + if mem != v_0_0.Args[1] { break } + x := v.Args[1] if !(isConstZero(x) && mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { break } @@ -27982,9 +27570,8 @@ func rewriteValuegeneric_OpStore_10(v *Value) bool { break } n := m3.AuxInt - _ = m3.Args[2] - p3 := m3.Args[0] mem := m3.Args[2] + p3 := m3.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { break } @@ -28050,9 +27637,8 @@ func rewriteValuegeneric_OpStore_20(v *Value) bool { break } n := m4.AuxInt - _ = m4.Args[2] - p4 := m4.Args[0] mem := m4.Args[2] + p4 := m4.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { break } @@ -28132,9 +27718,8 @@ func rewriteValuegeneric_OpStore_20(v *Value) bool { break } n := m5.AuxInt - _ = m5.Args[2] - p5 := m5.Args[0] mem := m5.Args[2] + p5 := m5.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { break } @@ -28193,9 +27778,8 @@ func rewriteValuegeneric_OpStore_20(v *Value) bool { break } n := m3.AuxInt - _ = m3.Args[1] - p3 := m3.Args[0] mem := m3.Args[1] + p3 := m3.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && o1 == sizeof(t2) && n == sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && clobber(m2) && clobber(m3)) { break } @@ -28257,9 +27841,8 @@ func rewriteValuegeneric_OpStore_20(v *Value) bool { break } n := m4.AuxInt - _ = m4.Args[1] - p4 := m4.Args[0] mem := m4.Args[1] + p4 := m4.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && o2 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && clobber(m2) && clobber(m3) && clobber(m4)) { break } @@ -28339,9 +27922,8 @@ func rewriteValuegeneric_OpStore_20(v *Value) bool { break } n := m5.AuxInt - _ = m5.Args[1] - p5 := m5.Args[0] mem := m5.Args[1] + p5 := m5.Args[0] if !(m2.Uses == 1 && m3.Uses == 1 && m4.Uses == 1 && m5.Uses == 1 && o3 == sizeof(t4) && o2-o3 == sizeof(t3) && o1-o2 == sizeof(t2) && n == sizeof(t4)+sizeof(t3)+sizeof(t2)+sizeof(t1) && isSamePtr(p1, p2) && isSamePtr(p2, p3) && isSamePtr(p3, p4) && isSamePtr(p4, p5) && clobber(m2) && clobber(m3) && clobber(m4) && clobber(m5)) { break } @@ -28461,7 +28043,6 @@ func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { if v_0.Op != OpStructMake2 { break } - _ = v_0.Args[1] x := v_0.Args[1] v.reset(OpCopy) v.Type = x.Type @@ -28515,7 +28096,6 @@ func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { if v_0.Op != OpStructMake3 { break } - _ = v_0.Args[2] x := v_0.Args[2] v.reset(OpCopy) v.Type = x.Type @@ -28587,7 +28167,6 @@ func rewriteValuegeneric_OpStructSelect_0(v *Value) bool { if v_0.Op != OpStructMake4 { break } - _ = v_0.Args[3] x := v_0.Args[3] v.reset(OpCopy) v.Type = x.Type @@ -28609,9 +28188,8 @@ func rewriteValuegeneric_OpStructSelect_10(v *Value) bool { break } t := x.Type - _ = x.Args[1] - ptr := x.Args[0] mem := x.Args[1] + ptr := x.Args[0] if !(!fe.CanSSA(t)) { break } @@ -28697,18 +28275,16 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub16, t) @@ -28727,18 +28303,16 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul16) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub16, t) @@ -28757,9 +28331,8 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -28787,9 +28360,8 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { if v_0.Op != OpMul16 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul16 { break @@ -28811,9 +28383,8 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { // cond: // result: (Const16 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst16) @@ -28824,15 +28395,13 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -28844,15 +28413,14 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -28864,15 +28432,14 @@ func rewriteValuegeneric_OpSub16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break } _ = v_0.Args[1] x := v_0.Args[0] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpCopy) @@ -28888,15 +28455,13 @@ func rewriteValuegeneric_OpSub16_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd16 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[0] { break } v.reset(OpCopy) @@ -28914,13 +28479,12 @@ func rewriteValuegeneric_OpSub16_10(v *Value) bool { if v_1.Op != OpSub16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -29007,7 +28571,7 @@ func rewriteValuegeneric_OpSub16_10(v *Value) bool { if v_1.Op != OpSub16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -29016,7 +28580,6 @@ func rewriteValuegeneric_OpSub16_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c - d)) @@ -29079,18 +28642,16 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub32, t) @@ -29109,18 +28670,16 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul32) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub32, t) @@ -29139,9 +28698,8 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -29169,9 +28727,8 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { if v_0.Op != OpMul32 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul32 { break @@ -29193,9 +28750,8 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { // cond: // result: (Const32 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst32) @@ -29206,15 +28762,13 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -29226,15 +28780,14 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -29246,15 +28799,14 @@ func rewriteValuegeneric_OpSub32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } _ = v_0.Args[1] x := v_0.Args[0] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpCopy) @@ -29270,15 +28822,13 @@ func rewriteValuegeneric_OpSub32_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd32 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[0] { break } v.reset(OpCopy) @@ -29296,13 +28846,12 @@ func rewriteValuegeneric_OpSub32_10(v *Value) bool { if v_1.Op != OpSub32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -29389,7 +28938,7 @@ func rewriteValuegeneric_OpSub32_10(v *Value) bool { if v_1.Op != OpSub32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -29398,7 +28947,6 @@ func rewriteValuegeneric_OpSub32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c - d)) @@ -29483,18 +29031,16 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub64, t) @@ -29513,18 +29059,16 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul64) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub64, t) @@ -29543,9 +29087,8 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -29573,9 +29116,8 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { if v_0.Op != OpMul64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul64 { break @@ -29597,9 +29139,8 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { // cond: // result: (Const64 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst64) @@ -29610,15 +29151,13 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -29630,15 +29169,14 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -29650,15 +29188,14 @@ func rewriteValuegeneric_OpSub64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } _ = v_0.Args[1] x := v_0.Args[0] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpCopy) @@ -29674,15 +29211,13 @@ func rewriteValuegeneric_OpSub64_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd64 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[0] { break } v.reset(OpCopy) @@ -29700,13 +29235,12 @@ func rewriteValuegeneric_OpSub64_10(v *Value) bool { if v_1.Op != OpSub64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -29793,7 +29327,7 @@ func rewriteValuegeneric_OpSub64_10(v *Value) bool { if v_1.Op != OpSub64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -29802,7 +29336,6 @@ func rewriteValuegeneric_OpSub64_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c - d @@ -29887,18 +29420,16 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub8, t) @@ -29917,18 +29448,16 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] if x != v_1.Args[0] { break } - z := v_1.Args[1] v.reset(OpMul8) v.AddArg(x) v0 := b.NewValue0(v.Pos, OpSub8, t) @@ -29947,9 +29476,8 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] + x := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -29977,9 +29505,8 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { if v_0.Op != OpMul8 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] + y := v_0.Args[0] v_1 := v.Args[1] if v_1.Op != OpMul8 { break @@ -30001,9 +29528,8 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { // cond: // result: (Const8 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst8) @@ -30014,15 +29540,13 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -30034,15 +29558,14 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -30054,15 +29577,14 @@ func rewriteValuegeneric_OpSub8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break } _ = v_0.Args[1] x := v_0.Args[0] - y := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[1] { break } v.reset(OpCopy) @@ -30078,15 +29600,13 @@ func rewriteValuegeneric_OpSub8_10(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAdd8 { break } - _ = v_0.Args[1] - y := v_0.Args[0] x := v_0.Args[1] - if y != v.Args[1] { + if y != v_0.Args[0] { break } v.reset(OpCopy) @@ -30104,13 +29624,12 @@ func rewriteValuegeneric_OpSub8_10(v *Value) bool { if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -30197,7 +29716,7 @@ func rewriteValuegeneric_OpSub8_10(v *Value) bool { if v_1.Op != OpSub8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -30206,7 +29725,6 @@ func rewriteValuegeneric_OpSub8_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpAdd8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c - d)) @@ -30266,13 +29784,12 @@ func rewriteValuegeneric_OpTrunc16to8_0(v *Value) bool { if v_0.Op != OpAnd16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFF == 0xFF) { break } @@ -30380,13 +29897,12 @@ func rewriteValuegeneric_OpTrunc32to16_0(v *Value) bool { if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFFFF == 0xFFFF) { break } @@ -30468,13 +29984,12 @@ func rewriteValuegeneric_OpTrunc32to8_0(v *Value) bool { if v_0.Op != OpAnd32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFF == 0xFF) { break } @@ -30582,13 +30097,12 @@ func rewriteValuegeneric_OpTrunc64to16_0(v *Value) bool { if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFFFF == 0xFFFF) { break } @@ -30722,13 +30236,12 @@ func rewriteValuegeneric_OpTrunc64to32_0(v *Value) bool { if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFFFFFFFF == 0xFFFFFFFF) { break } @@ -30810,13 +30323,12 @@ func rewriteValuegeneric_OpTrunc64to8_0(v *Value) bool { if v_0.Op != OpAnd64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } y := v_0_0.AuxInt - x := v_0.Args[1] if !(y&0xFF == 0xFF) { break } @@ -30892,9 +30404,8 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { // cond: // result: (Const16 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst16) @@ -30905,7 +30416,7 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst16 { break @@ -30913,7 +30424,6 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -30947,11 +30457,10 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { if v_1.Op != OpXor16 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpCopy) v.Type = y.Type v.AddArg(y) @@ -30981,15 +30490,13 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor16 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -31001,15 +30508,14 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor16 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -31021,19 +30527,17 @@ func rewriteValuegeneric_OpXor16_0(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Xor16 i (Xor16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor16 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -31053,7 +30557,7 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { // cond: (z.Op != OpConst16 && x.Op != OpConst16) // result: (Xor16 i (Xor16 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor16 { break @@ -31065,7 +30569,6 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -31087,13 +30590,12 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { if v_1.Op != OpXor16 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst16 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst16 && x.Op != OpConst16) { break } @@ -31148,7 +30650,7 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { if v_1.Op != OpXor16 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst16 { break @@ -31157,7 +30659,6 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpXor16) v0 := b.NewValue0(v.Pos, OpConst16, t) v0.AuxInt = int64(int16(c ^ d)) @@ -31206,14 +30707,13 @@ func rewriteValuegeneric_OpXor16_10(v *Value) bool { if v_0.Op != OpXor16 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst16 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst16 { break @@ -31307,9 +30807,8 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { // cond: // result: (Const32 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst32) @@ -31320,7 +30819,7 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst32 { break @@ -31328,7 +30827,6 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -31362,11 +30860,10 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { if v_1.Op != OpXor32 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpCopy) v.Type = y.Type v.AddArg(y) @@ -31396,15 +30893,13 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor32 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -31416,15 +30911,14 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor32 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -31436,19 +30930,17 @@ func rewriteValuegeneric_OpXor32_0(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Xor32 i (Xor32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor32 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -31468,7 +30960,7 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { // cond: (z.Op != OpConst32 && x.Op != OpConst32) // result: (Xor32 i (Xor32 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor32 { break @@ -31480,7 +30972,6 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -31502,13 +30993,12 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { if v_1.Op != OpXor32 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst32 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst32 && x.Op != OpConst32) { break } @@ -31563,7 +31053,7 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { if v_1.Op != OpXor32 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst32 { break @@ -31572,7 +31062,6 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpXor32) v0 := b.NewValue0(v.Pos, OpConst32, t) v0.AuxInt = int64(int32(c ^ d)) @@ -31621,14 +31110,13 @@ func rewriteValuegeneric_OpXor32_10(v *Value) bool { if v_0.Op != OpXor32 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst32 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst32 { break @@ -31722,9 +31210,8 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { // cond: // result: (Const64 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst64) @@ -31735,7 +31222,7 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst64 { break @@ -31743,7 +31230,6 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -31777,11 +31263,10 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { if v_1.Op != OpXor64 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpCopy) v.Type = y.Type v.AddArg(y) @@ -31811,15 +31296,13 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor64 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -31831,15 +31314,14 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor64 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -31851,19 +31333,17 @@ func rewriteValuegeneric_OpXor64_0(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Xor64 i (Xor64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor64 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -31883,7 +31363,7 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { // cond: (z.Op != OpConst64 && x.Op != OpConst64) // result: (Xor64 i (Xor64 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor64 { break @@ -31895,7 +31375,6 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -31917,13 +31396,12 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { if v_1.Op != OpXor64 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst64 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst64 && x.Op != OpConst64) { break } @@ -31978,7 +31456,7 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { if v_1.Op != OpXor64 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst64 { break @@ -31987,7 +31465,6 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpXor64) v0 := b.NewValue0(v.Pos, OpConst64, t) v0.AuxInt = c ^ d @@ -32036,14 +31513,13 @@ func rewriteValuegeneric_OpXor64_10(v *Value) bool { if v_0.Op != OpXor64 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst64 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst64 { break @@ -32137,9 +31613,8 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { // cond: // result: (Const8 [0]) for { - _ = v.Args[1] - x := v.Args[0] - if x != v.Args[1] { + x := v.Args[1] + if x != v.Args[0] { break } v.reset(OpConst8) @@ -32150,7 +31625,7 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { // cond: // result: x for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpConst8 { break @@ -32158,7 +31633,6 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { if v_0.AuxInt != 0 { break } - x := v.Args[1] v.reset(OpCopy) v.Type = x.Type v.AddArg(x) @@ -32192,11 +31666,10 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { if v_1.Op != OpXor8 { break } - _ = v_1.Args[1] + y := v_1.Args[1] if x != v_1.Args[0] { break } - y := v_1.Args[1] v.reset(OpCopy) v.Type = y.Type v.AddArg(y) @@ -32226,15 +31699,13 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor8 { break } - _ = v_0.Args[1] - x := v_0.Args[0] y := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[0] { break } v.reset(OpCopy) @@ -32246,15 +31717,14 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { // cond: // result: y for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor8 { break } _ = v_0.Args[1] y := v_0.Args[0] - x := v_0.Args[1] - if x != v.Args[1] { + if x != v_0.Args[1] { break } v.reset(OpCopy) @@ -32266,19 +31736,17 @@ func rewriteValuegeneric_OpXor8_0(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Xor8 i (Xor8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor8 { break } - _ = v_0.Args[1] + z := v_0.Args[1] i := v_0.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_0.Args[1] - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -32298,7 +31766,7 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { // cond: (z.Op != OpConst8 && x.Op != OpConst8) // result: (Xor8 i (Xor8 z x)) for { - _ = v.Args[1] + x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpXor8 { break @@ -32310,7 +31778,6 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { break } t := i.Type - x := v.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -32332,13 +31799,12 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { if v_1.Op != OpXor8 { break } - _ = v_1.Args[1] + z := v_1.Args[1] i := v_1.Args[0] if i.Op != OpConst8 { break } t := i.Type - z := v_1.Args[1] if !(z.Op != OpConst8 && x.Op != OpConst8) { break } @@ -32393,7 +31859,7 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { if v_1.Op != OpXor8 { break } - _ = v_1.Args[1] + x := v_1.Args[1] v_1_0 := v_1.Args[0] if v_1_0.Op != OpConst8 { break @@ -32402,7 +31868,6 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { break } d := v_1_0.AuxInt - x := v_1.Args[1] v.reset(OpXor8) v0 := b.NewValue0(v.Pos, OpConst8, t) v0.AuxInt = int64(int8(c ^ d)) @@ -32451,14 +31916,13 @@ func rewriteValuegeneric_OpXor8_10(v *Value) bool { if v_0.Op != OpXor8 { break } - _ = v_0.Args[1] + x := v_0.Args[1] v_0_0 := v_0.Args[0] if v_0_0.Op != OpConst8 { break } t := v_0_0.Type d := v_0_0.AuxInt - x := v_0.Args[1] v_1 := v.Args[1] if v_1.Op != OpConst8 { break @@ -32515,7 +31979,7 @@ func rewriteValuegeneric_OpZero_0(v *Value) bool { // cond: mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize() + config.RegSize // result: mem for { - _ = v.Args[1] + mem := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpLoad { break @@ -32530,8 +31994,7 @@ func rewriteValuegeneric_OpZero_0(v *Value) bool { if v_0_0_0.Op != OpSP { break } - mem := v_0.Args[1] - if mem != v.Args[1] { + if mem != v_0.Args[1] { break } if !(mem.Op == OpStaticCall && isSameSym(mem.Aux, "runtime.newobject") && c == config.ctxt.FixedFrameSize()+config.RegSize) { @@ -32555,14 +32018,13 @@ func rewriteValuegeneric_OpZero_0(v *Value) bool { break } t2 := store.Aux - _ = store.Args[2] + mem := store.Args[2] store_0 := store.Args[0] if store_0.Op != OpOffPtr { break } o2 := store_0.AuxInt p2 := store_0.Args[0] - mem := store.Args[2] if !(isSamePtr(p1, p2) && store.Uses == 1 && n >= o2+sizeof(t2) && clobber(store)) { break } @@ -32591,9 +32053,8 @@ func rewriteValuegeneric_OpZero_0(v *Value) bool { if move.Aux != t { break } - _ = move.Args[2] - dst2 := move.Args[0] mem := move.Args[2] + dst2 := move.Args[0] if !(move.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move)) { break } @@ -32627,9 +32088,8 @@ func rewriteValuegeneric_OpZero_0(v *Value) bool { if move.Aux != t { break } - _ = move.Args[2] - dst2 := move.Args[0] mem := move.Args[2] + dst2 := move.Args[0] if !(move.Uses == 1 && vardef.Uses == 1 && isSamePtr(dst1, dst2) && clobber(move) && clobber(vardef)) { break } -- GitLab From 82bd93991a84042f4d960f0338cbff4792867857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 13 Mar 2019 14:14:12 +0100 Subject: [PATCH 0437/1679] syscall: add Chroot and Dup2 for aix/ppc64 Change-Id: Ib98c7ad91d83ce68811f5c671200462c5fee0fca Reviewed-on: https://go-review.googlesource.com/c/go/+/167398 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Tobias Klauser --- src/syscall/syscall_aix.go | 3 ++- src/syscall/zsyscall_aix_ppc64.go | 28 +++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 4947248e38..8039da735b 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -46,7 +46,7 @@ func (ts *StTimespec_t) Nano() int64 { // But, as fcntl is currently not exported and isn't called with F_DUP2FD, // it doesn't matter. //sys fcntl(fd int, cmd int, arg int) (val int, err error) -//sys dup2(old int, new int) (val int, err error) +//sys Dup2(old int, new int) (val int, err error) //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { @@ -567,6 +567,7 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid), //sys Chdir(path string) (err error) //sys Chmod(path string, mode uint32) (err error) //sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) //sys Close(fd int) (err error) //sys Dup(fd int) (nfd int, err error) //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index 7d01dc013c..52398e60f1 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -8,7 +8,7 @@ package syscall import "unsafe" //go:cgo_import_dynamic libc_fcntl fcntl "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_dup2 dup2 "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_Dup2 dup2 "libc.a/shr_64.o" //go:cgo_import_dynamic libc_pipe pipe "libc.a/shr_64.o" //go:cgo_import_dynamic libc_readlink readlink "libc.a/shr_64.o" //go:cgo_import_dynamic libc_utimes utimes "libc.a/shr_64.o" @@ -41,6 +41,7 @@ import "unsafe" //go:cgo_import_dynamic libc_Chdir chdir "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Chmod chmod "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Chown chown "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_Chroot chroot "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Close close "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Dup dup "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Faccessat faccessat "libc.a/shr_64.o" @@ -97,7 +98,7 @@ import "unsafe" //go:cgo_import_dynamic libc_munmap munmap "libc.a/shr_64.o" //go:linkname libc_fcntl libc_fcntl -//go:linkname libc_dup2 libc_dup2 +//go:linkname libc_Dup2 libc_Dup2 //go:linkname libc_pipe libc_pipe //go:linkname libc_readlink libc_readlink //go:linkname libc_utimes libc_utimes @@ -130,6 +131,7 @@ import "unsafe" //go:linkname libc_Chdir libc_Chdir //go:linkname libc_Chmod libc_Chmod //go:linkname libc_Chown libc_Chown +//go:linkname libc_Chroot libc_Chroot //go:linkname libc_Close libc_Close //go:linkname libc_Dup libc_Dup //go:linkname libc_Faccessat libc_Faccessat @@ -189,7 +191,7 @@ type libcFunc uintptr var ( libc_fcntl, - libc_dup2, + libc_Dup2, libc_pipe, libc_readlink, libc_utimes, @@ -222,6 +224,7 @@ var ( libc_Chdir, libc_Chmod, libc_Chown, + libc_Chroot, libc_Close, libc_Dup, libc_Faccessat, @@ -291,8 +294,8 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(old int, new int) (val int, err error) { - r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_dup2)), 2, uintptr(old), uintptr(new), 0, 0, 0, 0) +func Dup2(old int, new int) (val int, err error) { + r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Dup2)), 2, uintptr(old), uintptr(new), 0, 0, 0, 0) val = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -694,6 +697,21 @@ func Chown(path string, uid int, gid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Chroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Close(fd int) (err error) { _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Close)), 1, uintptr(fd), 0, 0, 0, 0, 0) if e1 != 0 { -- GitLab From 3aa7bbdbcb432f78462fa816ba7c63cb7f3991fe Mon Sep 17 00:00:00 2001 From: Ilya Tocar Date: Wed, 13 Jun 2018 14:20:19 -0500 Subject: [PATCH 0438/1679] runtime: simplify readUnaligned We already have a pure go code sequence that is compiled into single load. Just use it everywhere, instead of pointer hackery. Passes toolstash-check. Change-Id: I0c42b5532fa9a5665da3385913609c6d42aaff27 Reviewed-on: https://go-review.googlesource.com/c/go/+/118568 Run-TryBot: Ilya Tocar TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/alg.go | 18 ++++++++++++++++++ src/runtime/unaligned1.go | 17 ----------------- src/runtime/unaligned2.go | 20 -------------------- 3 files changed, 18 insertions(+), 37 deletions(-) delete mode 100644 src/runtime/unaligned1.go delete mode 100644 src/runtime/unaligned2.go diff --git a/src/runtime/alg.go b/src/runtime/alg.go index 1c6795a1fa..732d32bf41 100644 --- a/src/runtime/alg.go +++ b/src/runtime/alg.go @@ -316,3 +316,21 @@ func initAlgAES() { // Initialize with random data so hash collisions will be hard to engineer. getRandomData(aeskeysched[:]) } + +// Note: These routines perform the read with an native endianness. +func readUnaligned32(p unsafe.Pointer) uint32 { + q := (*[4]byte)(p) + if sys.BigEndian { + return uint32(q[3]) | uint32(q[2])<<8 | uint32(q[1])<<16 | uint32(q[0])<<24 + } + return uint32(q[0]) | uint32(q[1])<<8 | uint32(q[2])<<16 | uint32(q[3])<<24 +} + +func readUnaligned64(p unsafe.Pointer) uint64 { + q := (*[8]byte)(p) + if sys.BigEndian { + return uint64(q[7]) | uint64(q[6])<<8 | uint64(q[5])<<16 | uint64(q[4])<<24 | + uint64(q[3])<<32 | uint64(q[2])<<40 | uint64(q[1])<<48 | uint64(q[0])<<56 + } + return uint64(q[0]) | uint64(q[1])<<8 | uint64(q[2])<<16 | uint64(q[3])<<24 | uint64(q[4])<<32 | uint64(q[5])<<40 | uint64(q[6])<<48 | uint64(q[7])<<56 +} diff --git a/src/runtime/unaligned1.go b/src/runtime/unaligned1.go deleted file mode 100644 index 1d90bdf83e..0000000000 --- a/src/runtime/unaligned1.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2014 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. - -// +build 386 amd64 amd64p32 arm64 ppc64 ppc64le s390x wasm - -package runtime - -import "unsafe" - -func readUnaligned32(p unsafe.Pointer) uint32 { - return *(*uint32)(p) -} - -func readUnaligned64(p unsafe.Pointer) uint64 { - return *(*uint64)(p) -} diff --git a/src/runtime/unaligned2.go b/src/runtime/unaligned2.go deleted file mode 100644 index 28b61192c4..0000000000 --- a/src/runtime/unaligned2.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 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. - -// +build arm mips mipsle mips64 mips64le - -package runtime - -import "unsafe" - -// Note: These routines perform the read with an unspecified endianness. -func readUnaligned32(p unsafe.Pointer) uint32 { - q := (*[4]byte)(p) - return uint32(q[0]) + uint32(q[1])<<8 + uint32(q[2])<<16 + uint32(q[3])<<24 -} - -func readUnaligned64(p unsafe.Pointer) uint64 { - q := (*[8]byte)(p) - return uint64(q[0]) + uint64(q[1])<<8 + uint64(q[2])<<16 + uint64(q[3])<<24 + uint64(q[4])<<32 + uint64(q[5])<<40 + uint64(q[6])<<48 + uint64(q[7])<<56 -} -- GitLab From 3def15cd20dc136e033a5866086ce862dc36bd52 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 27 Feb 2019 17:34:07 -0800 Subject: [PATCH 0439/1679] cmd/compile: move all constant folding logic into evconst All setconst calls now happen within evconst. While here, get rid of callrecv, which (incompletely) duplicates the logic of hascallchan. Passes toolstash-check. Change-Id: Ic67b9dd2a1b397d4bc25e8c8b6f81daf4f6cfb75 Reviewed-on: https://go-review.googlesource.com/c/go/+/166980 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 57 ++++++++++++++ src/cmd/compile/internal/gc/typecheck.go | 96 +----------------------- 2 files changed, 58 insertions(+), 95 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 0e6d838eaa..218d1d1d7f 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -631,6 +631,13 @@ func evconst(n *Node) { setconst(n, convlit1(nl, n.Type, true, false).Val()) } + case OCONVNOP: + if nl.Op == OLITERAL && nl.isGoConst() { + // set so n.Orig gets OCONV instead of OCONVNOP + n.Op = OCONV + setconst(n, nl.Val()) + } + case OBYTES2STR: // string([]byte(nil)) or string([]rune(nil)) if nl.Op == OLITERAL && nl.Val().Ctype() == CTNIL { @@ -664,6 +671,56 @@ func evconst(n *Node) { } else { n.List.Set(s) } + + case OCAP, OLEN: + switch nl.Type.Etype { + case TSTRING: + if Isconst(nl, CTSTR) { + setintconst(n, int64(len(nl.Val().U.(string)))) + } + case TARRAY: + if !hascallchan(nl) { + setintconst(n, nl.Type.NumElem()) + } + } + + case OALIGNOF, OOFFSETOF, OSIZEOF: + setintconst(n, evalunsafe(n)) + + case OREAL, OIMAG: + if nl.Op == OLITERAL { + var re, im *Mpflt + switch consttype(nl) { + case CTINT, CTRUNE: + re = newMpflt() + re.SetInt(nl.Val().U.(*Mpint)) + // im = 0 + case CTFLT: + re = nl.Val().U.(*Mpflt) + // im = 0 + case CTCPLX: + re = &nl.Val().U.(*Mpcplx).Real + im = &nl.Val().U.(*Mpcplx).Imag + default: + Fatalf("impossible") + } + if n.Op == OIMAG { + if im == nil { + im = newMpflt() + } + re = im + } + setconst(n, Val{re}) + } + + case OCOMPLEX: + if nl.Op == OLITERAL && nr.Op == OLITERAL { + // make it a complex literal + c := newMpcmplx() + c.Real.Set(toflt(nl.Val()).U.(*Mpflt)) + c.Imag.Set(toflt(nr.Val()).U.(*Mpflt)) + setconst(n, Val{c}) + } } } diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 69ba9ef52a..8ae6c112b6 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -307,39 +307,6 @@ func typecheck(n *Node, top int) (res *Node) { return n } -// does n contain a call or receive operation? -func callrecv(n *Node) bool { - if n == nil { - return false - } - - switch n.Op { - case OCALL, - OCALLMETH, - OCALLINTER, - OCALLFUNC, - ORECV, - OCAP, - OLEN, - OCOPY, - ONEW, - OAPPEND, - ODELETE: - return true - } - - return callrecv(n.Left) || callrecv(n.Right) || callrecvlist(n.Ninit) || callrecvlist(n.Nbody) || callrecvlist(n.List) || callrecvlist(n.Rlist) -} - -func callrecvlist(l Nodes) bool { - for _, n := range l.Slice() { - if callrecv(n) { - return true - } - } - return false -} - // indexlit implements typechecking of untyped values as // array/slice indexes. It is almost equivalent to defaultlit // but also accepts untyped numeric values representable as @@ -1402,9 +1369,6 @@ func typecheck1(n *Node, top int) (res *Node) { } n.Type = types.Types[TUINTPTR] - // any side effects disappear; ignore init - setintconst(n, evalunsafe(n)) - case OCAP, OLEN: ok |= ctxExpr if !onearg(n, "%v", n.Op) { @@ -1436,23 +1400,6 @@ func typecheck1(n *Node, top int) (res *Node) { n.Type = types.Types[TINT] - // Result might be constant. - var res int64 = -1 // valid if >= 0 - switch t.Etype { - case TSTRING: - if Isconst(l, CTSTR) { - res = int64(len(l.Val().U.(string))) - } - - case TARRAY: - if !callrecv(l) { - res = t.NumElem() - } - } - if res >= 0 { - setintconst(n, res) - } - case OREAL, OIMAG: ok |= ctxExpr if !onearg(n, "%v", n.Op) { @@ -1484,36 +1431,6 @@ func typecheck1(n *Node, top int) (res *Node) { } n.Type = types.Types[et] - // if the argument is a constant, the result is a constant - // (any untyped numeric constant can be represented as a - // complex number) - if l.Op == OLITERAL { - var re, im *Mpflt - switch consttype(l) { - case CTINT, CTRUNE: - re = newMpflt() - re.SetInt(l.Val().U.(*Mpint)) - // im = 0 - case CTFLT: - re = l.Val().U.(*Mpflt) - // im = 0 - case CTCPLX: - re = &l.Val().U.(*Mpcplx).Real - im = &l.Val().U.(*Mpcplx).Imag - default: - yyerror("invalid argument %L for %v", l, n.Op) - n.Type = nil - return n - } - if n.Op == OIMAG { - if im == nil { - im = newMpflt() - } - re = im - } - setconst(n, Val{re}) - } - case OCOMPLEX: ok |= ctxExpr var r *Node @@ -1586,14 +1503,6 @@ func typecheck1(n *Node, top int) (res *Node) { } n.Type = t - if l.Op == OLITERAL && r.Op == OLITERAL { - // make it a complex literal - c := newMpcmplx() - c.Real.Set(toflt(l.Val()).U.(*Mpflt)) - c.Imag.Set(toflt(r.Val()).U.(*Mpflt)) - setconst(n, Val{c}) - } - case OCLOSE: if !onearg(n, "%v", n.Op) { n.Type = nil @@ -1817,10 +1726,7 @@ func typecheck1(n *Node, top int) (res *Node) { switch n.Op { case OCONVNOP: - if n.Left.Op == OLITERAL && n.isGoConst() { - n.Op = OCONV // set so n.Orig gets OCONV instead of OCONVNOP - setconst(n, n.Left.Val()) // convert n to OLITERAL with the given value - } else if t.Etype == n.Type.Etype { + if t.Etype == n.Type.Etype { switch t.Etype { case TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128: // Floating point casts imply rounding and -- GitLab From a1b5cb1d04dc3aac7149a5cb7cfc02111bd4ebef Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 27 Feb 2019 18:18:47 -0800 Subject: [PATCH 0440/1679] cmd/compile: simplify isGoConst The only ways to construct an OLITERAL node are (1) a basic literal from the source package, (2) constant folding within evconst (which only folds Go language constants), (3) the universal "nil" constant, and (4) implicit conversions of nil to some concrete type. Passes toolstash-check. Change-Id: I30fc6b07ebede7adbdfa4ed562436cbb7078a2ff Reviewed-on: https://go-review.googlesource.com/c/go/+/166981 Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 116 ++++------------------- src/cmd/compile/internal/gc/typecheck.go | 13 +-- test/fixedbugs/bug297.go | 2 +- test/fixedbugs/issue11361.go | 2 +- test/fixedbugs/issue17038.go | 2 +- test/fixedbugs/issue8183.go | 4 +- 6 files changed, 30 insertions(+), 109 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 218d1d1d7f..18f8d352e9 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -584,14 +584,6 @@ func Isconst(n *Node, ct Ctype) bool { // evconst rewrites constant expressions into OLITERAL nodes. func evconst(n *Node) { - if !n.isGoConst() { - // Avoid constant evaluation of things that aren't actually constants - // according to the spec. See issue 24760. - // The SSA backend has a more robust optimizer that will catch - // all of these weird cases (like uintptr(unsafe.Pointer(uintptr(1)))). - return - } - nl, nr := n.Left, n.Right // Pick off just the opcodes that can be constant evaluated. @@ -626,24 +618,18 @@ func evconst(n *Node) { } case OCONV: - if n.Type != nil && okforconst[n.Type.Etype] && nl.Op == OLITERAL { + if okforconst[n.Type.Etype] && nl.Op == OLITERAL { // TODO(mdempsky): There should be a convval function. setconst(n, convlit1(nl, n.Type, true, false).Val()) } case OCONVNOP: - if nl.Op == OLITERAL && nl.isGoConst() { + if okforconst[n.Type.Etype] && nl.Op == OLITERAL { // set so n.Orig gets OCONV instead of OCONVNOP n.Op = OCONV setconst(n, nl.Val()) } - case OBYTES2STR: - // string([]byte(nil)) or string([]rune(nil)) - if nl.Op == OLITERAL && nl.Val().Ctype() == CTNIL { - setconst(n, Val{U: ""}) - } - case OADDSTR: // Merge adjacent constants in the argument list. s := n.List.Slice() @@ -657,6 +643,17 @@ func evconst(n *Node) { i2++ } + // Hack to appease toolstash. Because + // we were checking isGoConst early + // on, we wouldn't collapse adjacent + // string constants unless the entire + // string was a constant. + // + // TODO(mdempsky): Remove in next commit. + if i1 != 0 || i2 != len(s) { + return + } + nl := *s[i1] nl.Orig = &nl nl.SetVal(Val{strings.Join(strs, "")}) @@ -714,6 +711,10 @@ func evconst(n *Node) { } case OCOMPLEX: + if nl == nil || nr == nil { + // TODO(mdempsky): Remove after early OAS2FUNC rewrite CL lands. + break + } if nl.Op == OLITERAL && nr.Op == OLITERAL { // make it a complex literal c := newMpcmplx() @@ -1338,88 +1339,7 @@ func indexconst(n *Node) int64 { // Expressions derived from nil, like string([]byte(nil)), while they // may be known at compile time, are not Go language constants. func (n *Node) isGoConst() bool { - if n.Orig != nil { - n = n.Orig - } - - switch n.Op { - case OADD, - OAND, - OANDAND, - OANDNOT, - OBITNOT, - ODIV, - OEQ, - OGE, - OGT, - OLE, - OLSH, - OLT, - ONEG, - OMOD, - OMUL, - ONE, - ONOT, - OOR, - OOROR, - OPLUS, - ORSH, - OSUB, - OXOR, - OIOTA, - OREAL, - OIMAG: - if n.Left.isGoConst() && (n.Right == nil || n.Right.isGoConst()) { - return true - } - - case OCOMPLEX: - if n.List.Len() == 0 && n.Left.isGoConst() && n.Right.isGoConst() { - return true - } - - case OADDSTR: - for _, n1 := range n.List.Slice() { - if !n1.isGoConst() { - return false - } - } - return true - - case OCONV, OCONVNOP: - if okforconst[n.Type.Etype] && n.Left.isGoConst() { - return true - } - - case OLEN, OCAP: - l := n.Left - if l.isGoConst() { - return true - } - - // Special case: len/cap is constant when applied to array or - // pointer to array when the expression does not contain - // function calls or channel receive operations. - t := l.Type - - if t != nil && t.IsPtr() { - t = t.Elem() - } - if t != nil && t.IsArray() && !hascallchan(l) { - return true - } - - case OLITERAL: - if n.Val().Ctype() != CTNIL { - return true - } - - case OALIGNOF, OOFFSETOF, OSIZEOF: - return true - } - - //dump("nonconst", n); - return false + return n.Op == OLITERAL && n.Val().Ctype() != CTNIL } func hascallchan(n *Node) bool { diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 8ae6c112b6..0efcaac200 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -3671,17 +3671,18 @@ func typecheckdef(n *Node) { } e = typecheck(e, ctxExpr) - if Isconst(e, CTNIL) { - yyerrorl(n.Pos, "const initializer cannot be nil") + if e.Type == nil { goto ret } - - if e.Type != nil && e.Op != OLITERAL || !e.isGoConst() { + if !e.isGoConst() { if !e.Diag() { - yyerrorl(n.Pos, "const initializer %v is not a constant", e) + if Isconst(e, CTNIL) { + yyerrorl(n.Pos, "const initializer cannot be nil") + } else { + yyerrorl(n.Pos, "const initializer %v is not a constant", e) + } e.SetDiag(true) } - goto ret } diff --git a/test/fixedbugs/bug297.go b/test/fixedbugs/bug297.go index 852d208251..c2bd253d05 100644 --- a/test/fixedbugs/bug297.go +++ b/test/fixedbugs/bug297.go @@ -11,5 +11,5 @@ package main type ByteSize float64 const ( _ = iota; // ignore first value by assigning to blank identifier - KB ByteSize = 1<<(10*X) // ERROR "undefined" "is not a constant|as type ByteSize" + KB ByteSize = 1<<(10*X) // ERROR "undefined" ) diff --git a/test/fixedbugs/issue11361.go b/test/fixedbugs/issue11361.go index d01776b47c..1260ea89c9 100644 --- a/test/fixedbugs/issue11361.go +++ b/test/fixedbugs/issue11361.go @@ -8,4 +8,4 @@ package a import "fmt" // ERROR "imported and not used" -const n = fmt // ERROR "fmt without selector" "fmt is not a constant" +const n = fmt // ERROR "fmt without selector" diff --git a/test/fixedbugs/issue17038.go b/test/fixedbugs/issue17038.go index e07a4b22ce..1b65ffc1f0 100644 --- a/test/fixedbugs/issue17038.go +++ b/test/fixedbugs/issue17038.go @@ -6,4 +6,4 @@ package main -const A = complex(0()) // ERROR "cannot call non-function" "const initializer .* is not a constant" +const A = complex(0()) // ERROR "cannot call non-function" diff --git a/test/fixedbugs/issue8183.go b/test/fixedbugs/issue8183.go index f23e660e94..531dd4dbf8 100644 --- a/test/fixedbugs/issue8183.go +++ b/test/fixedbugs/issue8183.go @@ -18,6 +18,6 @@ const ( const ( c = len([1 - iota]int{}) d - e // ERROR "array bound must be non-negative" "const initializer len\(composite literal\) is not a constant" - f // ERROR "array bound must be non-negative" "const initializer len\(composite literal\) is not a constant" + e // ERROR "array bound must be non-negative" + f // ERROR "array bound must be non-negative" ) -- GitLab From 0a04c0430e9671bd531a2928a8416424da1e3dde Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 27 Feb 2019 18:27:13 -0800 Subject: [PATCH 0441/1679] cmd/compile: restore constant folding optimization within OADDSTR Change-Id: Ib55f2458c75aee49302f0dd4e2a819f9931a5ed3 Reviewed-on: https://go-review.googlesource.com/c/go/+/166982 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 18f8d352e9..825f08ca8a 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -643,17 +643,6 @@ func evconst(n *Node) { i2++ } - // Hack to appease toolstash. Because - // we were checking isGoConst early - // on, we wouldn't collapse adjacent - // string constants unless the entire - // string was a constant. - // - // TODO(mdempsky): Remove in next commit. - if i1 != 0 || i2 != len(s) { - return - } - nl := *s[i1] nl.Orig = &nl nl.SetVal(Val{strings.Join(strs, "")}) -- GitLab From bf94fc3ae387fc09929443393741919fac6727af Mon Sep 17 00:00:00 2001 From: Hana Kim Date: Mon, 14 Jan 2019 11:13:34 -0500 Subject: [PATCH 0442/1679] cmd/go: fix the default build output name for versioned binaries `go build` has chosen the last element of the package import path as the default output name when -o option is given. That caused the output of a package build when the module root is the major version component such as 'v2'. A similar issue involving `go install` was fixed in https://golang.org/cl/128900. This CL refactors the logic added with the change and makes it available as internal/load.DefaultExecName. This CL makes 'go test' to choose the right default test binary name when the tested package is in the module root. (E.g., instead of v2.test, choose pkg.test for the test of 'path/pkg/v2') Fixes #27283. Change-Id: I6905754f0906db46e3ce069552715f45356913ae Reviewed-on: https://go-review.googlesource.com/c/go/+/140863 Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 71 ++++++++++--------- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/build.go | 4 +- .../testdata/mod/rsc.io_fortune_v2_v2.0.0.txt | 6 ++ .../testdata/script/mod_build_versioned.txt | 16 +++++ 5 files changed, 64 insertions(+), 35 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_build_versioned.txt diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index a0333bd522..9da01a0372 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1186,6 +1186,44 @@ var cgoSyscallExclude = map[string]bool{ var foldPath = make(map[string]string) +// DefaultExecName returns the default executable name of the given +// package. +func DefaultExecName(p *Package) string { + _, elem := filepath.Split(p.ImportPath) + if cfg.ModulesEnabled { + // NOTE(rsc): Using p.ImportPath instead of p.Dir + // makes sure we install a package in the root of a + // cached module directory as that package name + // not name@v1.2.3. + // Using p.ImportPath instead of p.Dir + // is probably correct all the time, + // even for non-module-enabled code, + // but I'm not brave enough to change the + // non-module behavior this late in the + // release cycle. Maybe for Go 1.12. + // See golang.org/issue/26869. + _, elem = pathpkg.Split(p.ImportPath) + + // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. + // See golang.org/issue/24667. + isVersion := func(v string) bool { + if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { + return false + } + for i := 2; i < len(v); i++ { + if c := v[i]; c < '0' || '9' < c { + return false + } + } + return true + } + if isVersion(elem) { + _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) + } + } + return elem +} + // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { @@ -1226,38 +1264,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { p.Error = &PackageError{Err: e} return } - _, elem := filepath.Split(p.Dir) - if cfg.ModulesEnabled { - // NOTE(rsc): Using p.ImportPath instead of p.Dir - // makes sure we install a package in the root of a - // cached module directory as that package name - // not name@v1.2.3. - // Using p.ImportPath instead of p.Dir - // is probably correct all the time, - // even for non-module-enabled code, - // but I'm not brave enough to change the - // non-module behavior this late in the - // release cycle. Maybe for Go 1.12. - // See golang.org/issue/26869. - _, elem = pathpkg.Split(p.ImportPath) - - // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. - // See golang.org/issue/24667. - isVersion := func(v string) bool { - if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { - return false - } - for i := 2; i < len(v); i++ { - if c := v[i]; c < '0' || '9' < c { - return false - } - } - return true - } - if isVersion(elem) { - _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) - } - } + elem := DefaultExecName(p) full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH { // Install cross-compiled binaries to subdirectories of bin. diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index fe90af3be5..aaca8fcf68 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -811,7 +811,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin if p.ImportPath == "command-line-arguments" { elem = p.Name } else { - _, elem = path.Split(p.ImportPath) + elem = load.DefaultExecName(p) } testBinary := elem + ".test" diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 145b87513a..26234d15cc 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -10,7 +10,7 @@ import ( "go/build" "os" "os/exec" - "path" + //"path" "path/filepath" "runtime" "strings" @@ -285,7 +285,7 @@ func runBuild(cmd *base.Command, args []string) { pkgs := load.PackagesForBuild(args) if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" { - _, cfg.BuildO = path.Split(pkgs[0].ImportPath) + cfg.BuildO = load.DefaultExecName(pkgs[0]) cfg.BuildO += cfg.ExeSuffix } diff --git a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt index cfa91f08a5..3acd637931 100644 --- a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt +++ b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt @@ -13,3 +13,9 @@ import "rsc.io/quote" func main() { println(quote.Hello()) } +-- fortune_test.go -- +package main + +import "testing" + +func TestFortuneV2(t *testing.T) {} diff --git a/src/cmd/go/testdata/script/mod_build_versioned.txt b/src/cmd/go/testdata/script/mod_build_versioned.txt new file mode 100644 index 0000000000..eb081c9be1 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_build_versioned.txt @@ -0,0 +1,16 @@ +env GO111MODULE=on + +go get -m rsc.io/fortune/v2 + +# The default executable name shouldn't be v2$exe +go build rsc.io/fortune/v2 +! exists v2$exe +exists fortune$exe + +# The default test binary name shouldn't be v2.test$exe +go test -c rsc.io/fortune/v2 +! exists v2.test$exe +exists fortune.test$exe + +-- go.mod -- +module scratch -- GitLab From 6aa710f7231bd02eac4389579dc11bb7d9c1bdad Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 13 Mar 2019 20:49:19 +0000 Subject: [PATCH 0443/1679] cmd/go/internal/work: remove commented-out import Somebody wasn't using goimports. :) Change-Id: Ibad3c0781ea70d538592b2e90d8b578e4fae8173 Reviewed-on: https://go-review.googlesource.com/c/go/+/167385 Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/work/build.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 26234d15cc..d89ee899f0 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -10,7 +10,6 @@ import ( "go/build" "os" "os/exec" - //"path" "path/filepath" "runtime" "strings" -- GitLab From 1a24bf10bc398d94bbdbb0c77b691e5840d343df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 13 Mar 2019 17:57:03 +0000 Subject: [PATCH 0444/1679] builtin: make len's godoc less ambiguous MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The len godoc uses a blockquote to list the rules for its semantics. The item that describes channels is a bit long, so it's split in two lines. However, the first line ends with a semicolon, and the second line can be read as a sentence of its own, so it's easy to misinterpret that the two lines are separate. Making that easy mistake would lead to an incorrect understanding of len: if v is nil, len(v) is zero. This could lead us to think that len(nil) is valid and should return zero. When in fact, that statement only applies to nil channels. To make this less ambiguous, add a bit of indentation to the follow-up line, to align with the channel body. If lists are added to godoc in the future via #7873, perhaps this text can be simplified. Fixes #30349. Change-Id: I84226edc812d429493137bcc65c332e92d4e6c87 Reviewed-on: https://go-review.googlesource.com/c/go/+/167403 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills Reviewed-by: Brad Fitzpatrick --- src/builtin/builtin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/builtin/builtin.go b/src/builtin/builtin.go index c78fe09ea6..61ed6100b4 100644 --- a/src/builtin/builtin.go +++ b/src/builtin/builtin.go @@ -151,7 +151,7 @@ func delete(m map[Type]Type1, key Type) // Slice, or map: the number of elements in v; if v is nil, len(v) is zero. // String: the number of bytes in v. // Channel: the number of elements queued (unread) in the channel buffer; -// if v is nil, len(v) is zero. +// if v is nil, len(v) is zero. // For some arguments, such as a string literal or a simple array expression, the // result can be a constant. See the Go language specification's "Length and // capacity" section for details. -- GitLab From 2989abc91efb7d64eb141b918bdc361975308e81 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Mar 2019 16:42:18 -0400 Subject: [PATCH 0445/1679] cmd/dist: add a test in misc/reboot to verify that the toolchain can self-bootstrap Fixes #30758 Change-Id: I8e49958602de9caa47bb5710828158e51744f375 Reviewed-on: https://go-review.googlesource.com/c/go/+/167478 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- misc/reboot/overlaydir_test.go | 80 ++++++++++++++++++++++++++++++++++ misc/reboot/reboot_test.go | 52 ++++++++++++++++++++++ src/cmd/dist/test.go | 6 +++ 3 files changed, 138 insertions(+) create mode 100644 misc/reboot/overlaydir_test.go create mode 100644 misc/reboot/reboot_test.go diff --git a/misc/reboot/overlaydir_test.go b/misc/reboot/overlaydir_test.go new file mode 100644 index 0000000000..b38a8efbb9 --- /dev/null +++ b/misc/reboot/overlaydir_test.go @@ -0,0 +1,80 @@ +// Copyright 2019 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 reboot_test + +import ( + "io" + "os" + "path/filepath" + "strings" +) + +// overlayDir makes a minimal-overhead copy of srcRoot in which new files may be added. +// +// TODO: Once we no longer need to support the misc module in GOPATH mode, +// factor this function out into a package to reduce duplication. +func overlayDir(dstRoot, srcRoot string) error { + dstRoot = filepath.Clean(dstRoot) + if err := os.MkdirAll(dstRoot, 0777); err != nil { + return err + } + + // If we don't use the absolute path here, exec'ing make.bash fails with + // “too many levels of symbolic links”. + symBase, err := filepath.Abs(srcRoot) + if err != nil { + return err + } + + return filepath.Walk(srcRoot, func(srcPath string, info os.FileInfo, err error) error { + if err != nil || srcPath == srcRoot { + return err + } + + suffix := strings.TrimPrefix(srcPath, srcRoot) + for len(suffix) > 0 && suffix[0] == filepath.Separator { + suffix = suffix[1:] + } + dstPath := filepath.Join(dstRoot, suffix) + + perm := info.Mode() & os.ModePerm + if info.Mode()&os.ModeSymlink != 0 { + info, err = os.Stat(srcPath) + if err != nil { + return err + } + perm = info.Mode() & os.ModePerm + } + + // Always copy directories (don't symlink them). + // If we add a file in the overlay, we don't want to add it in the original. + if info.IsDir() { + return os.Mkdir(dstPath, perm) + } + + // If the OS supports symlinks, use them instead of copying bytes. + if err := os.Symlink(filepath.Join(symBase, suffix), dstPath); err == nil { + return nil + } + + // Otherwise, copy the bytes. + src, err := os.Open(srcPath) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err + } + + _, err = io.Copy(dst, src) + if closeErr := dst.Close(); err == nil { + err = closeErr + } + return err + }) +} diff --git a/misc/reboot/reboot_test.go b/misc/reboot/reboot_test.go new file mode 100644 index 0000000000..717c0fb709 --- /dev/null +++ b/misc/reboot/reboot_test.go @@ -0,0 +1,52 @@ +// Copyright 2019 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 reboot_test verifies that the current GOROOT can be used to bootstrap +// itself. +package reboot_test + +import ( + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" +) + +func TestRepeatBootstrap(t *testing.T) { + goroot, err := ioutil.TempDir("", "reboot-goroot") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(goroot) + + gorootSrc := filepath.Join(goroot, "src") + if err := overlayDir(gorootSrc, filepath.Join(runtime.GOROOT(), "src")); err != nil { + t.Fatal(err) + } + + if err := ioutil.WriteFile(filepath.Join(goroot, "VERSION"), []byte(runtime.Version()), 0666); err != nil { + t.Fatal(err) + } + + var makeScript string + switch runtime.GOOS { + case "windows": + makeScript = "make.bat" + case "plan9": + makeScript = "make.rc" + default: + makeScript = "make.bash" + } + + cmd := exec.Command(filepath.Join(runtime.GOROOT(), "src", makeScript)) + cmd.Dir = gorootSrc + cmd.Env = append(os.Environ(), "GOROOT=", "GOROOT_BOOTSTRAP="+runtime.GOROOT()) + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + if err := cmd.Run(); err != nil { + t.Fatal(err) + } +} diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 1a54752f35..9e7205f56e 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -739,6 +739,12 @@ func (t *tester) registerTests() { }, }) } + + // Ensure that the toolchain can bootstrap itself. + // This test adds another ~45s to all.bash if run sequentially, so run it only on the builders. + if os.Getenv("GO_BUILDER_NAME") != "" && goos != "android" && !t.iOS() { + t.registerHostTest("reboot", "../misc/reboot", "misc/reboot", ".") + } } // isRegisteredTestName reports whether a test named testName has already -- GitLab From 870cfe64843736764c1a1263b12801a1f1cec5d9 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 13 Mar 2019 13:52:17 -0700 Subject: [PATCH 0446/1679] test/codegen: gofmt Change-Id: I33f5b5051e5f75aa264ec656926223c5a3c09c1b Reviewed-on: https://go-review.googlesource.com/c/go/+/167498 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Matt Layher --- test/codegen/arithmetic.go | 1 + test/codegen/comparisons.go | 10 +-- test/codegen/noextend.go | 124 ++++++++++++++++++------------------ test/codegen/shift.go | 18 +++--- 4 files changed, 76 insertions(+), 77 deletions(-) diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index e5671774ed..16d7d25d3e 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -15,6 +15,7 @@ package codegen // ----------------- // var ef int + func SubMem(arr []int, b, c, d int) int { // 386:`SUBL\s[A-Z]+,\s8\([A-Z]+\)` // amd64:`SUBQ\s[A-Z]+,\s16\([A-Z]+\)` diff --git a/test/codegen/comparisons.go b/test/codegen/comparisons.go index f14918e9df..62ba184ed4 100644 --- a/test/codegen/comparisons.go +++ b/test/codegen/comparisons.go @@ -215,30 +215,30 @@ func CmpLogicalToZero(a, b, c uint32, d, e uint64) uint64 { // ppc64:"ANDCC",-"CMPW" // ppc64le:"ANDCC",-"CMPW" - if a & 63 == 0 { + if a&63 == 0 { return 1 } // ppc64:"ANDCC",-"CMP" // ppc64le:"ANDCC",-"CMP" - if d & 255 == 0 { + if d&255 == 0 { return 1 } // ppc64:"ANDCC",-"CMP" // ppc64le:"ANDCC",-"CMP" - if d & e == 0 { + if d&e == 0 { return 1 } // ppc64:"ORCC",-"CMP" // ppc64le:"ORCC",-"CMP" - if d | e == 0 { + if d|e == 0 { return 1 } // ppc64:"XORCC",-"CMP" // ppc64le:"XORCC",-"CMP" - if e ^ d == 0 { + if e^d == 0 { return 1 } return 0 diff --git a/test/codegen/noextend.go b/test/codegen/noextend.go index 46bfe3f2f9..424fd2008d 100644 --- a/test/codegen/noextend.go +++ b/test/codegen/noextend.go @@ -31,30 +31,30 @@ func set16(x8 int8, u8 uint8, y8 int8, z8 uint8) { // AND not needed due to size // ppc64:-"ANDCC" - // ppc64le:-"ANDCC" - sval16[1] = 255 & int16(x8+y8) + // ppc64le:-"ANDCC" + sval16[1] = 255 & int16(x8+y8) // ppc64:-"ANDCC" - // ppc64le:-"ANDCC" - val16[1] = 255 & uint16(u8+z8) + // ppc64le:-"ANDCC" + val16[1] = 255 & uint16(u8+z8) } func shiftidx(x8 int8, u8 uint8, x16 int16, u16 uint16, x32 int32, u32 uint32) { // ppc64:-"MOVB\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" - sval16[0] = int16(val16[x8>>1]) + // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" + sval16[0] = int16(val16[x8>>1]) // ppc64:-"MOVBZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" - val16[0] = uint16(sval16[u8>>2]) + // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" + val16[0] = uint16(sval16[u8>>2]) // ppc64:-"MOVH\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" - sval16[1] = int16(val16[x16>>1]) + // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" + sval16[1] = int16(val16[x16>>1]) // ppc64:-"MOVHZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" - val16[1] = uint16(sval16[u16>>2]) + // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" + val16[1] = uint16(sval16[u16>>2]) } @@ -72,11 +72,11 @@ func setnox(x8 int8, u8 uint8, y8 int8, z8 uint8, x16 int16, u16 uint16, x32 int // AND not needed due to size // ppc64:-"ANDCC" // ppc64le:-"ANDCC" - sval16[1] = 255 & int16(x8+y8) + sval16[1] = 255 & int16(x8+y8) // ppc64:-"ANDCC" - // ppc64le:-"ANDCC" - val16[1] = 255 & uint16(u8+z8) + // ppc64le:-"ANDCC" + val16[1] = 255 & uint16(u8+z8) // ppc64:-"MOVB\tR\\d+,\\sR\\d+" // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" @@ -95,24 +95,24 @@ func setnox(x8 int8, u8 uint8, y8 int8, z8 uint8, x16 int16, u16 uint16, x32 int val32[1] = uint32(u16) // ppc64:-"MOVB\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" - sval64[0] = int64(x8) + // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" + sval64[0] = int64(x8) // ppc64:-"MOVH\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" - sval64[1] = int64(x16) + // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" + sval64[1] = int64(x16) // ppc64:-"MOVW\tR\\d+,\\sR\\d+" // ppc64le:-"MOVW\tR\\d+,\\sR\\d+" sval64[2] = int64(x32) //ppc64:-"MOVBZ\tR\\d+,\\sR\\d+" - //ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" - val64[0] = uint64(u8) + //ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" + val64[0] = uint64(u8) // ppc64:-"MOVHZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" - val64[1] = uint64(u16) + // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" + val64[1] = uint64(u16) // ppc64:-"MOVWZ\tR\\d+,\\sR\\d+" // ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+" @@ -121,15 +121,15 @@ func setnox(x8 int8, u8 uint8, y8 int8, z8 uint8, x16 int16, u16 uint16, x32 int func cmp16(x8 int8, u8 uint8, x32 int32, u32 uint32, x64 int64, u64 uint64) bool { // ppc64:-"MOVB\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" + // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" if int16(x8) == sval16[0] { return true } // ppc64:-"MOVBZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" - if uint16(u8) == val16[0] { - return true + // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" + if uint16(u8) == val16[0] { + return true } // ppc64:-"MOVHZ\tR\\d+,\\sR\\d+" @@ -174,16 +174,16 @@ func cmp16(x8 int8, u8 uint8, x32 int32, u32 uint32, x64 int64, u64 uint64) bool func cmp32(x8 int8, u8 uint8, x16 int16, u16 uint16, x64 int64, u64 uint64) bool { // ppc64:-"MOVB\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" - if int32(x8) == sval32[0] { - return true - } + // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" + if int32(x8) == sval32[0] { + return true + } // ppc64:-"MOVBZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" - if uint32(u8) == val32[0] { - return true - } + // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" + if uint32(u8) == val32[0] { + return true + } // ppc64:-"MOVH\tR\\d+,\\sR\\d+" // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" @@ -213,43 +213,41 @@ func cmp32(x8 int8, u8 uint8, x16 int16, u16 uint16, x64 int64, u64 uint64) bool return false } - -func cmp64(x8 int8, u8 uint8, x16 int16, u16 uint16, x32 int32, u32 uint32) bool { +func cmp64(x8 int8, u8 uint8, x16 int16, u16 uint16, x32 int32, u32 uint32) bool { // ppc64:-"MOVB\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" - if int64(x8) == sval64[0] { - return true - } + // ppc64le:-"MOVB\tR\\d+,\\sR\\d+" + if int64(x8) == sval64[0] { + return true + } // ppc64:-"MOVBZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" - if uint64(u8) == val64[0] { - return true - } + // ppc64le:-"MOVBZ\tR\\d+,\\sR\\d+" + if uint64(u8) == val64[0] { + return true + } // ppc64:-"MOVH\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" - if int64(x16) == sval64[0] { - return true - } + // ppc64le:-"MOVH\tR\\d+,\\sR\\d+" + if int64(x16) == sval64[0] { + return true + } // ppc64:-"MOVHZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" - if uint64(u16) == val64[0] { - return true - } + // ppc64le:-"MOVHZ\tR\\d+,\\sR\\d+" + if uint64(u16) == val64[0] { + return true + } // ppc64:-"MOVW\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVW\tR\\d+,\\sR\\d+" - if int64(x32) == sval64[0] { - return true - } + // ppc64le:-"MOVW\tR\\d+,\\sR\\d+" + if int64(x32) == sval64[0] { + return true + } // ppc64:-"MOVWZ\tR\\d+,\\sR\\d+" - // ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+" - if uint64(u32) == val64[0] { - return true - } - return false + // ppc64le:-"MOVWZ\tR\\d+,\\sR\\d+" + if uint64(u32) == val64[0] { + return true + } + return false } - diff --git a/test/codegen/shift.go b/test/codegen/shift.go index 93fa828868..1e145d3748 100644 --- a/test/codegen/shift.go +++ b/test/codegen/shift.go @@ -12,47 +12,47 @@ package codegen func lshMask64x64(v int64, s uint64) int64 { // s390x:-".*AND",-".*MOVDGE" - return v << (s&63) + return v << (s & 63) } func rshMask64Ux64(v uint64, s uint64) uint64 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func rshMask64x64(v int64, s uint64) int64 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func lshMask32x64(v int32, s uint64) int32 { // s390x:-".*AND",-".*MOVDGE" - return v << (s&63) + return v << (s & 63) } func rshMask32Ux64(v uint32, s uint64) uint32 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func rshMask32x64(v int32, s uint64) int32 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func lshMask64x32(v int64, s uint32) int64 { // s390x:-".*AND",-".*MOVDGE" - return v << (s&63) + return v << (s & 63) } func rshMask64Ux32(v uint64, s uint32) uint64 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func rshMask64x32(v int64, s uint32) int64 { // s390x:-".*AND",-".*MOVDGE" - return v >> (s&63) + return v >> (s & 63) } func lshMask64x32Ext(v int64, s int32) int64 { -- GitLab From 2d21bf4252781e3997c30a873e56325436ca3f76 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 13 Mar 2019 15:51:15 -0700 Subject: [PATCH 0447/1679] cmd/compile: cleanup OREAL/OIMAG constant folding Based on suggestion from gri@ on golang.org/cl/166980. Passes toolstash-check. Change-Id: I79b66bb09b5635f3a9daecaa5d605b661a0ab108 Reviewed-on: https://go-review.googlesource.com/c/go/+/167501 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/const.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index 825f08ca8a..ef4b933f68 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -676,17 +676,17 @@ func evconst(n *Node) { case OREAL, OIMAG: if nl.Op == OLITERAL { var re, im *Mpflt - switch consttype(nl) { - case CTINT, CTRUNE: + switch u := nl.Val().U.(type) { + case *Mpint: re = newMpflt() - re.SetInt(nl.Val().U.(*Mpint)) + re.SetInt(u) // im = 0 - case CTFLT: - re = nl.Val().U.(*Mpflt) + case *Mpflt: + re = u // im = 0 - case CTCPLX: - re = &nl.Val().U.(*Mpcplx).Real - im = &nl.Val().U.(*Mpcplx).Imag + case *Mpcplx: + re = &u.Real + im = &u.Imag default: Fatalf("impossible") } -- GitLab From 61945fc5022e36ae88758f2c4e8f7c29f0824ae0 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 13 Mar 2019 13:53:38 -0700 Subject: [PATCH 0448/1679] cmd/compile: don't generate panicshift for masked int shifts We know that a & 31 is non-negative for all a, signed or not. We can avoid checking that and needing to write out an unreachable call to panicshift. Change-Id: I32f32fb2c950d2b2b35ac5c0e99b7b2dbd47f917 Reviewed-on: https://go-review.googlesource.com/c/go/+/167499 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Keith Randall --- .../compile/internal/ssa/gen/generic.rules | 5 + .../compile/internal/ssa/rewritegeneric.go | 232 ++++++++++++++++++ test/codegen/shift.go | 28 +++ 3 files changed, 265 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 61451891a5..43e788562c 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -420,6 +420,11 @@ (Less(64|32|16|8) (Const(64|32|16|8) [c]) (Const(64|32|16|8) [d])) -> (ConstBool [b2i(c < d)]) (Leq(64|32|16|8) (Const(64|32|16|8) [c]) (Const(64|32|16|8) [d])) -> (ConstBool [b2i(c <= d)]) +(Geq8 (And8 _ (Const8 [c])) (Const8 [0])) && int8(c) >= 0 -> (ConstBool [1]) +(Geq16 (And16 _ (Const16 [c])) (Const16 [0])) && int16(c) >= 0 -> (ConstBool [1]) +(Geq32 (And32 _ (Const32 [c])) (Const32 [0])) && int32(c) >= 0 -> (ConstBool [1]) +(Geq64 (And64 _ (Const64 [c])) (Const64 [0])) && int64(c) >= 0 -> (ConstBool [1]) + (Greater64U (Const64 [c]) (Const64 [d])) -> (ConstBool [b2i(uint64(c) > uint64(d))]) (Greater32U (Const32 [c]) (Const32 [d])) -> (ConstBool [b2i(uint32(c) > uint32(d))]) (Greater16U (Const16 [c]) (Const16 [d])) -> (ConstBool [b2i(uint16(c) > uint16(d))]) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 868cd76f55..b25012cb31 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -10430,6 +10430,64 @@ func rewriteValuegeneric_OpGeq16_0(v *Value) bool { v.AuxInt = b2i(c >= d) return true } + // match: (Geq16 (And16 _ (Const16 [c])) (Const16 [0])) + // cond: int16(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd16 { + break + } + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst16 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int16(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (Geq16 (And16 (Const16 [c]) _) (Const16 [0])) + // cond: int16(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd16 { + break + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst16 { + break + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst16 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int16(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } return false } func rewriteValuegeneric_OpGeq16U_0(v *Value) bool { @@ -10474,6 +10532,64 @@ func rewriteValuegeneric_OpGeq32_0(v *Value) bool { v.AuxInt = b2i(c >= d) return true } + // match: (Geq32 (And32 _ (Const32 [c])) (Const32 [0])) + // cond: int32(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd32 { + break + } + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst32 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int32(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (Geq32 (And32 (Const32 [c]) _) (Const32 [0])) + // cond: int32(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd32 { + break + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst32 { + break + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst32 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int32(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } return false } func rewriteValuegeneric_OpGeq32F_0(v *Value) bool { @@ -10540,6 +10656,64 @@ func rewriteValuegeneric_OpGeq64_0(v *Value) bool { v.AuxInt = b2i(c >= d) return true } + // match: (Geq64 (And64 _ (Const64 [c])) (Const64 [0])) + // cond: int64(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd64 { + break + } + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int64(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (Geq64 (And64 (Const64 [c]) _) (Const64 [0])) + // cond: int64(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd64 { + break + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst64 { + break + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int64(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } return false } func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { @@ -10606,6 +10780,64 @@ func rewriteValuegeneric_OpGeq8_0(v *Value) bool { v.AuxInt = b2i(c >= d) return true } + // match: (Geq8 (And8 _ (Const8 [c])) (Const8 [0])) + // cond: int8(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd8 { + break + } + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst8 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int8(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } + // match: (Geq8 (And8 (Const8 [c]) _) (Const8 [0])) + // cond: int8(c) >= 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpAnd8 { + break + } + _ = v_0.Args[1] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst8 { + break + } + c := v_0_0.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst8 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(int8(c) >= 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } return false } func rewriteValuegeneric_OpGeq8U_0(v *Value) bool { diff --git a/test/codegen/shift.go b/test/codegen/shift.go index 1e145d3748..4ae9d7d6a0 100644 --- a/test/codegen/shift.go +++ b/test/codegen/shift.go @@ -70,6 +70,34 @@ func rshMask64x32Ext(v int64, s int32) int64 { return v >> uint(s&63) } +// --------------- // +// signed shifts // +// --------------- // + +// We do want to generate a test + panicshift for these cases. +func lshSigned(v8 int8, v16 int16, v32 int32, v64 int64, x int) { + // amd64:"TESTB" + _ = x << v8 + // amd64:"TESTW" + _ = x << v16 + // amd64:"TESTL" + _ = x << v32 + // amd64:"TESTQ" + _ = x << v64 +} + +// We want to avoid generating a test + panicshift for these cases. +func lshSignedMasked(v8 int8, v16 int16, v32 int32, v64 int64, x int) { + // amd64:-"TESTB" + _ = x << (v8 & 7) + // amd64:-"TESTW" + _ = x << (v16 & 15) + // amd64:-"TESTL" + _ = x << (v32 & 31) + // amd64:-"TESTQ" + _ = x << (v64 & 63) +} + // ------------------ // // bounded shifts // // ------------------ // -- GitLab From 66f5d4e03500bf5085d10eb5ffd89bf33b7d2b9f Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 13 Mar 2019 14:36:34 -0700 Subject: [PATCH 0449/1679] cmd/compile: int64(uint64 >> x) >= 0 if x > 0 This rewrite rule triggers only once, in math/big.quotToFloat64, as part of converting a uint64 to a float64. Nevertheless, it is cheap; let's add it. Change-Id: I3ed4a197a559110fec1bc04b3a8abb4c7fcc2c89 Reviewed-on: https://go-review.googlesource.com/c/go/+/167500 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- .../compile/internal/ssa/gen/generic.rules | 2 ++ .../compile/internal/ssa/rewritegeneric.go | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index 43e788562c..aac7438e0a 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -425,6 +425,8 @@ (Geq32 (And32 _ (Const32 [c])) (Const32 [0])) && int32(c) >= 0 -> (ConstBool [1]) (Geq64 (And64 _ (Const64 [c])) (Const64 [0])) && int64(c) >= 0 -> (ConstBool [1]) +(Geq64 (Rsh64Ux64 _ (Const64 [c])) (Const64 [0])) && c > 0 -> (ConstBool [1]) + (Greater64U (Const64 [c]) (Const64 [d])) -> (ConstBool [b2i(uint64(c) > uint64(d))]) (Greater32U (Const32 [c]) (Const32 [d])) -> (ConstBool [b2i(uint32(c) > uint32(d))]) (Greater16U (Const16 [c]) (Const16 [d])) -> (ConstBool [b2i(uint16(c) > uint16(d))]) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index b25012cb31..543664c8bc 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -10714,6 +10714,35 @@ func rewriteValuegeneric_OpGeq64_0(v *Value) bool { v.AuxInt = 1 return true } + // match: (Geq64 (Rsh64Ux64 _ (Const64 [c])) (Const64 [0])) + // cond: c > 0 + // result: (ConstBool [1]) + for { + _ = v.Args[1] + v_0 := v.Args[0] + if v_0.Op != OpRsh64Ux64 { + break + } + _ = v_0.Args[1] + v_0_1 := v_0.Args[1] + if v_0_1.Op != OpConst64 { + break + } + c := v_0_1.AuxInt + v_1 := v.Args[1] + if v_1.Op != OpConst64 { + break + } + if v_1.AuxInt != 0 { + break + } + if !(c > 0) { + break + } + v.reset(OpConstBool) + v.AuxInt = 1 + return true + } return false } func rewriteValuegeneric_OpGeq64F_0(v *Value) bool { -- GitLab From 7c04110c5203c4502d4c23f1464acb9f07f8bb6b Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 6 Mar 2019 22:24:54 -0500 Subject: [PATCH 0450/1679] fmt: put back named results in ss.scanBasePrefix CL 165619 removed these names when it removed the use of the plain 'return'. But the names help for documentation purposes even without being mentioned directly in the function, so removing them makes the code less readable. Put them back. I renamed found to zeroFound to make the meaning clearer. Change-Id: I1010931f08290af0b0ede7d21b1404c2eea196a0 Reviewed-on: https://go-review.googlesource.com/c/go/+/165899 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/fmt/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmt/scan.go b/src/fmt/scan.go index fe6cbd477f..4554f17300 100644 --- a/src/fmt/scan.go +++ b/src/fmt/scan.go @@ -612,7 +612,7 @@ func (s *ss) scanRune(bitSize int) int64 { // scanBasePrefix reports whether the integer begins with a bas prefix // and returns the base, digit string, and whether a zero was found. // It is called only if the verb is %v. -func (s *ss) scanBasePrefix() (int, string, bool) { +func (s *ss) scanBasePrefix() (base int, digits string, zeroFound bool) { if !s.peek("0") { return 0, decimalDigits + "_", false } -- GitLab From ee1c76dccdfb2a40fb21a7875cccd8fc6d76d7ad Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 27 Feb 2019 10:14:44 -0800 Subject: [PATCH 0451/1679] runtime: simplify constant strings in asm As of CL 163747, we can write arbitrary length strings in assembly DATA instructions. Make use of it here to improve readability. Change-Id: I556279ca893f527874e3b26112c43573834ccd9c Reviewed-on: https://go-review.googlesource.com/c/go/+/167386 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick --- src/runtime/asm_386.s | 12 ++---------- src/runtime/asm_amd64.s | 8 +++----- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 48a959aad1..51103928b3 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -248,16 +248,8 @@ ok: CALL runtime·abort(SB) RET -DATA bad_proc_msg<>+0x00(SB)/8, $"This pro" -DATA bad_proc_msg<>+0x08(SB)/8, $"gram can" -DATA bad_proc_msg<>+0x10(SB)/8, $" only be" -DATA bad_proc_msg<>+0x18(SB)/8, $" run on " -DATA bad_proc_msg<>+0x20(SB)/8, $"processo" -DATA bad_proc_msg<>+0x28(SB)/8, $"rs with " -DATA bad_proc_msg<>+0x30(SB)/8, $"MMX supp" -DATA bad_proc_msg<>+0x38(SB)/4, $"ort." -DATA bad_proc_msg<>+0x3c(SB)/1, $0xa -GLOBL bad_proc_msg<>(SB), RODATA, $0x3d +DATA bad_proc_msg<>+0x00(SB)/61, $"This program can only be run on processors with MMX support.\n" +GLOBL bad_proc_msg<>(SB), RODATA, $61 DATA runtime·mainPC+0(SB)/4,$runtime·main(SB) GLOBL runtime·mainPC(SB),RODATA,$4 diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index 6339dc0000..85133bf2df 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -1438,10 +1438,8 @@ flush: MOVQ 96(SP), R15 JMP ret -DATA debugCallFrameTooLarge<>+0x00(SB)/8, $"call fra" -DATA debugCallFrameTooLarge<>+0x08(SB)/8, $"me too l" -DATA debugCallFrameTooLarge<>+0x10(SB)/4, $"arge" -GLOBL debugCallFrameTooLarge<>(SB), RODATA, $0x14 // Size duplicated below +DATA debugCallFrameTooLarge<>+0x00(SB)/20, $"call frame too large" +GLOBL debugCallFrameTooLarge<>(SB), RODATA, $20 // Size duplicated below // debugCallV1 is the entry point for debugger-injected function // calls on running goroutines. It informs the runtime that a @@ -1565,7 +1563,7 @@ good: // The frame size is too large. Report the error. MOVQ $debugCallFrameTooLarge<>(SB), AX MOVQ AX, 0(SP) - MOVQ $0x14, 8(SP) + MOVQ $20, 8(SP) // length of debugCallFrameTooLarge string MOVQ $8, AX BYTE $0xcc JMP restore -- GitLab From 1024b25d0c044484ed9288ac8f78bd9f5ebb5287 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 13 Mar 2019 09:48:33 -0700 Subject: [PATCH 0452/1679] spec: clarify wording on passing slice arguments to variadic functions Per discussion on #30769. Fixes #30769. Change-Id: I620dbac936de1a0b5deec03926dd11d690a918e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167380 Reviewed-by: Brad Fitzpatrick Reviewed-by: Matthew Dempsky Reviewed-by: Rob Pike --- doc/go_spec.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go_spec.html b/doc/go_spec.html index 78ddcd5650..98ef599631 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ @@ -3484,7 +3484,7 @@ within Greeting, who will have the value

    -If the final argument is assignable to a slice type []T, it may be +If the final argument is assignable to a slice type []T, it is passed unchanged as the value for a ...T parameter if the argument is followed by .... In this case no new slice is created.

    -- GitLab From f6695a15e15713cdac16978837d8b01ef4999279 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 13 Mar 2019 20:06:37 -0400 Subject: [PATCH 0453/1679] crypto/x509: move debug prints to standard error Standard output is reserved for actual program output. Debug print should be limited in general (here they are enabled by an environment variable) and always go to standard error. Came across by accident. Change-Id: I1490be71473520f049719572b3acaa0ea9f9e5c1 Reviewed-on: https://go-review.googlesource.com/c/go/+/167502 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Filippo Valsorda --- src/crypto/x509/root_darwin.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/crypto/x509/root_darwin.go b/src/crypto/x509/root_darwin.go index 9b8a1cca7d..2f6a8b8d60 100644 --- a/src/crypto/x509/root_darwin.go +++ b/src/crypto/x509/root_darwin.go @@ -58,7 +58,7 @@ func execSecurityRoots() (*CertPool, error) { return nil, err } if debugDarwinRoots { - fmt.Printf("crypto/x509: %d certs have a trust policy\n", len(hasPolicy)) + fmt.Fprintf(os.Stderr, "crypto/x509: %d certs have a trust policy\n", len(hasPolicy)) } keychains := []string{"/Library/Keychains/System.keychain"} @@ -68,7 +68,7 @@ func execSecurityRoots() (*CertPool, error) { home, err := os.UserHomeDir() if err != nil { if debugDarwinRoots { - fmt.Printf("crypto/x509: can't get user home directory: %v\n", err) + fmt.Fprintf(os.Stderr, "crypto/x509: can't get user home directory: %v\n", err) } } else { keychains = append(keychains, @@ -148,7 +148,7 @@ func execSecurityRoots() (*CertPool, error) { wg.Wait() if debugDarwinRoots { - fmt.Printf("crypto/x509: ran security verify-cert %d times\n", numVerified) + fmt.Fprintf(os.Stderr, "crypto/x509: ran security verify-cert %d times\n", numVerified) } return roots, nil @@ -205,12 +205,12 @@ func verifyCertWithSystem(cert *Certificate) bool { } if err := cmd.Run(); err != nil { if debugDarwinRoots { - fmt.Printf("crypto/x509: verify-cert rejected %s: %q\n", cert.Subject, bytes.TrimSpace(stderr.Bytes())) + fmt.Fprintf(os.Stderr, "crypto/x509: verify-cert rejected %s: %q\n", cert.Subject, bytes.TrimSpace(stderr.Bytes())) } return false } if debugDarwinRoots { - fmt.Printf("crypto/x509: verify-cert approved %s\n", cert.Subject) + fmt.Fprintf(os.Stderr, "crypto/x509: verify-cert approved %s\n", cert.Subject) } return true } @@ -243,7 +243,7 @@ func getCertsWithTrustPolicy() (map[string]bool, error) { // localized on macOS, just interpret any failure to mean that // there are no trust settings. if debugDarwinRoots { - fmt.Printf("crypto/x509: exec %q: %v, %s\n", cmd.Args, err, stderr.Bytes()) + fmt.Fprintf(os.Stderr, "crypto/x509: exec %q: %v, %s\n", cmd.Args, err, stderr.Bytes()) } return nil } -- GitLab From b6fb6673bc1d132025b75fb6d3928775d959a8e3 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Fri, 1 Mar 2019 09:31:30 -0400 Subject: [PATCH 0454/1679] fmt: refined tests for non-string error verbs This is a refinement of CL 164557. Make it explicit in tests that using a non-string verb with fmtError does not result in falling back to using fmt.Formatter. Change-Id: I6d090f31818eb7cc7668d7565b1449c91cd03a23 Reviewed-on: https://go-review.googlesource.com/c/go/+/164701 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/fmt/errors_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go index d2957e675b..a3cd26ef3e 100644 --- a/src/fmt/errors_test.go +++ b/src/fmt/errors_test.go @@ -353,6 +353,10 @@ func TestErrorFormatter(t *testing.T) { err: intError(4), fmt: "%d", want: "4", + }, { + err: intError(4), + fmt: "%🤪", + want: "%!🤪(fmt_test.intError=4)", }} for i, tc := range testCases { t.Run(fmt.Sprintf("%d/%s", i, tc.fmt), func(t *testing.T) { @@ -446,6 +450,12 @@ type intError int func (e intError) Error() string { return fmt.Sprint(e) } +func (e wrapped) Format(w fmt.State, r rune) { + // Test that the normal fallback handling after handleMethod for + // non-string verbs is used. This path should not be reached. + fmt.Fprintf(w, "Unreachable: %d", e) +} + func (e intError) FormatError(p errors.Printer) (next error) { p.Printf("error %d", e) return nil -- GitLab From 5402854c3557f87fa2741a52ffc15dfb1ef333cc Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Wed, 13 Mar 2019 12:24:54 +0100 Subject: [PATCH 0455/1679] errors: record only single frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See Issue #29382 and Issue #30468. 3 frames are no longer needed as of https://go-review.googlesource.com/c/go/+/152537/ name old time/op new time/op delta New-8 475ns ± 3% 352ns ± 2% -25.87% (p=0.008 n=5+5) Errorf/no_format-8 661ns ± 4% 558ns ± 2% -15.63% (p=0.008 n=5+5) Errorf/with_format-8 729ns ± 6% 626ns ± 2% -14.23% (p=0.008 n=5+5) Errorf/method:_mytype-8 1.00µs ± 9% 0.84µs ± 2% -15.94% (p=0.008 n=5+5) Errorf/method:_number-8 1.25µs ± 7% 1.04µs ± 2% -16.38% (p=0.008 n=5+5) Change-Id: I30377e769b3b3be623f63ecbe365f8950ca08dda Reviewed-on: https://go-review.googlesource.com/c/go/+/167400 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/errors/frame.go | 15 +++------------ src/errors/frame_test.go | 31 +++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/errors/frame.go b/src/errors/frame.go index a5369e5c36..487092fa89 100644 --- a/src/errors/frame.go +++ b/src/errors/frame.go @@ -10,10 +10,7 @@ import ( // A Frame contains part of a call stack. type Frame struct { - // Make room for three PCs: the one we were asked for, what it called, - // and possibly a PC for skipPleaseUseCallersFrames. See: - // https://go.googlesource.com/go/+/032678e0fb/src/runtime/extern.go#169 - frames [3]uintptr + frames [1]uintptr } // Caller returns a Frame that describes a frame on the caller's stack. @@ -21,7 +18,7 @@ type Frame struct { // Caller(0) returns the frame for the caller of Caller. func Caller(skip int) Frame { var s Frame - runtime.Callers(skip+1, s.frames[:]) + runtime.Callers(skip+2, s.frames[:]) return s } @@ -30,13 +27,7 @@ func Caller(skip int) Frame { // The returned function may be "" even if file and line are not. func (f Frame) location() (function, file string, line int) { frames := runtime.CallersFrames(f.frames[:]) - if _, ok := frames.Next(); !ok { - return "", "", 0 - } - fr, ok := frames.Next() - if !ok { - return "", "", 0 - } + fr, _ := frames.Next() return fr.Function, fr.File, fr.Line } diff --git a/src/errors/frame_test.go b/src/errors/frame_test.go index 864a6934d1..ba08166966 100644 --- a/src/errors/frame_test.go +++ b/src/errors/frame_test.go @@ -9,19 +9,42 @@ import ( "errors" "fmt" "math/big" + "regexp" + "strings" "testing" ) +func TestFrame(t *testing.T) { + + // Extra line + got := fmt.Sprintf("%+v", errors.New("Test")) + got = got[strings.Index(got, "Test"):] + const want = "^Test:" + + "\n errors_test.TestFrame" + + "\n .*/errors/frame_test.go:20$" + ok, err := regexp.MatchString(want, got) + if err != nil { + t.Fatal(err) + } + if !ok { + t.Errorf("\n got %v;\nwant %v", got, want) + } +} + type myType struct{} func (myType) Format(s fmt.State, v rune) { s.Write(bytes.Repeat([]byte("Hi! "), 10)) } +func BenchmarkNew(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = errors.New("new error") + } +} + func BenchmarkErrorf(b *testing.B) { err := errors.New("foo") - // pi := big.NewFloat(3.14) // Something expensive. - num := big.NewInt(5) args := func(a ...interface{}) []interface{} { return a } benchCases := []struct { name string @@ -30,8 +53,8 @@ func BenchmarkErrorf(b *testing.B) { }{ {"no_format", "msg: %v", args(err)}, {"with_format", "failed %d times: %v", args(5, err)}, - {"method: mytype", "pi: %v", args("myfile.go", myType{}, err)}, - {"method: number", "pi: %v", args("myfile.go", num, err)}, + {"method: mytype", "pi %s %v: %v", args("myfile.go", myType{}, err)}, + {"method: number", "pi %s %d: %v", args("myfile.go", big.NewInt(5), err)}, } for _, bc := range benchCases { b.Run(bc.name, func(b *testing.B) { -- GitLab From 8bf18b56a47a98b9dd2fa03beb358312237a8c76 Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Wed, 13 Mar 2019 16:47:44 +0100 Subject: [PATCH 0456/1679] errors: improve performance of New MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See Issue #29382 and Issue #30468. Improvements in this CL: name old time/op new time/op delta New-8 352ns ± 2% 225ns ± 5% -36.04% (p=0.008 n=5+5) Improvements together with moving to 1 uintptr: name old time/op new time/op delta New-8 475ns ± 3% 225ns ± 5% -52.59% (p=0.008 n=5+5) Change-Id: I9d69a14e5e10a6498767defb7d5f26ceedcf9ba5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167401 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/errors/errors.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/errors/errors.go b/src/errors/errors.go index f23a96c43e..ebb136cdd4 100644 --- a/src/errors/errors.go +++ b/src/errors/errors.go @@ -5,12 +5,17 @@ // Package errors implements functions to manipulate errors. package errors +import "runtime" + // New returns an error that formats as the given text. // // The returned error contains a Frame set to the caller's location and // implements Formatter to show this information when printed with details. func New(text string) error { - return &errorString{text, Caller(1)} + // Inline call to errors.Callers to improve performance. + var s Frame + runtime.Callers(2, s.frames[:]) + return &errorString{text, s} } // errorString is a trivial implementation of error. -- GitLab From 1f90d081391d4f5911960fd28d81d7ea5e554a8f Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Wed, 13 Mar 2019 16:25:02 +0100 Subject: [PATCH 0457/1679] fmt: make type of fmt.Errorf the same as that of errors.New This applies only for cases where %w is not used. The purpose of this change is to reduce test failures where tests depend on these two being the same type, as they previously were. Change-Id: I2dd28b93fe1d59f3cfbb4eb0875d1fb8ee699746 Reviewed-on: https://go-review.googlesource.com/c/go/+/167402 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/errors/errors.go | 21 ++++++++++++++++++--- src/fmt/errors.go | 5 +++-- src/fmt/errors_test.go | 15 +++++++++++++++ src/go/build/deps_test.go | 5 +++-- src/internal/errinternal/errinternal.go | 9 +++++++++ 5 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 src/internal/errinternal/errinternal.go diff --git a/src/errors/errors.go b/src/errors/errors.go index ebb136cdd4..51175b13c8 100644 --- a/src/errors/errors.go +++ b/src/errors/errors.go @@ -5,7 +5,10 @@ // Package errors implements functions to manipulate errors. package errors -import "runtime" +import ( + "internal/errinternal" + "runtime" +) // New returns an error that formats as the given text. // @@ -15,21 +18,33 @@ func New(text string) error { // Inline call to errors.Callers to improve performance. var s Frame runtime.Callers(2, s.frames[:]) - return &errorString{text, s} + return &errorString{text, nil, s} +} + +func init() { + errinternal.NewError = func(text string, err error) error { + var s Frame + runtime.Callers(3, s.frames[:]) + return &errorString{text, err, s} + } } // errorString is a trivial implementation of error. type errorString struct { s string + err error frame Frame } func (e *errorString) Error() string { + if e.err != nil { + return e.s + ": " + e.err.Error() + } return e.s } func (e *errorString) FormatError(p Printer) (next error) { p.Print(e.s) e.frame.Format(p) - return nil + return e.err } diff --git a/src/fmt/errors.go b/src/fmt/errors.go index 7506b6a20b..06416425c3 100644 --- a/src/fmt/errors.go +++ b/src/fmt/errors.go @@ -6,6 +6,7 @@ package fmt import ( "errors" + "internal/errinternal" "strings" ) @@ -21,7 +22,7 @@ import ( func Errorf(format string, a ...interface{}) error { err, wrap := lastError(format, a) if err == nil { - return &noWrapError{Sprintf(format, a...), nil, errors.Caller(1)} + return errinternal.NewError(Sprintf(format, a...), nil) } // TODO: this is not entirely correct. The error value could be @@ -33,7 +34,7 @@ func Errorf(format string, a ...interface{}) error { if wrap { return &wrapError{msg, err, errors.Caller(1)} } - return &noWrapError{msg, err, errors.Caller(1)} + return errinternal.NewError(msg, err) } func lastError(format string, a []interface{}) (err error, wrap bool) { diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go index a3cd26ef3e..ed77709ea0 100644 --- a/src/fmt/errors_test.go +++ b/src/fmt/errors_test.go @@ -378,6 +378,21 @@ func TestErrorFormatter(t *testing.T) { } } +func TestSameType(t *testing.T) { + err0 := errors.New("inner") + want := fmt.Sprintf("%T", err0) + + err := fmt.Errorf("foo: %v", err0) + if got := fmt.Sprintf("%T", err); got != want { + t.Errorf("got %v; want %v", got, want) + } + + err = fmt.Errorf("foo %s", "bar") + if got := fmt.Sprintf("%T", err); got != want { + t.Errorf("got %v; want %v", got, want) + } +} + var _ errors.Formatter = wrapped{} type wrapped struct { diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index f9e5c4dec0..31a5d2741d 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -34,7 +34,7 @@ import ( // var pkgDeps = map[string][]string{ // L0 is the lowest level, core, nearly unavoidable packages. - "errors": {"runtime", "internal/reflectlite"}, + "errors": {"runtime", "internal/errinternal", "internal/reflectlite"}, "io": {"errors", "sync", "sync/atomic"}, "runtime": {"unsafe", "runtime/internal/atomic", "runtime/internal/sys", "runtime/internal/math", "internal/cpu", "internal/bytealg"}, "runtime/internal/sys": {}, @@ -46,6 +46,7 @@ var pkgDeps = map[string][]string{ "unsafe": {}, "internal/cpu": {}, "internal/bytealg": {"unsafe", "internal/cpu"}, + "internal/errinternal": {}, "internal/reflectlite": {"runtime", "unsafe"}, "L0": { @@ -183,7 +184,7 @@ var pkgDeps = map[string][]string{ }, // Formatted I/O: few dependencies (L1) but we must add reflect and internal/fmtsort. - "fmt": {"L1", "bytes", "strings", "os", "reflect", "internal/fmtsort"}, + "fmt": {"L1", "bytes", "strings", "os", "reflect", "internal/errinternal", "internal/fmtsort"}, "log": {"L1", "os", "fmt", "time"}, // Packages used by testing must be low-level (L2+fmt). diff --git a/src/internal/errinternal/errinternal.go b/src/internal/errinternal/errinternal.go new file mode 100644 index 0000000000..f484ac03e8 --- /dev/null +++ b/src/internal/errinternal/errinternal.go @@ -0,0 +1,9 @@ +// Copyright 2019 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 errinternal + +// NewError creates a new error as created by errors.New, but with one +// additional stack frame depth. +var NewError func(msg string, err error) error -- GitLab From 259de39375d39a1ba32de640cde5d112b7b80acf Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Seo Date: Thu, 31 Jan 2019 11:22:21 -0600 Subject: [PATCH 0458/1679] cmd/internal/obj/ppc64: fix wrong register encoding in XX1-Form instructions A bug in the encoding of XX1-Form is flipping bit 31 of such instructions. This may result in register clobering when using VSX instructions. This was not exposed before because we currently don't generate these instructions in SSA, and the asm files in which they are present aren't affected by register clobbering. This change fixes the bug and adds a testcase for the problem. Fixes #30112 Change-Id: I77b606159ae1efea33d2ba3e1c74b7fae8d5d2e7 Reviewed-on: https://go-review.googlesource.com/c/go/+/163759 Reviewed-by: Bryan C. Mills Reviewed-by: Lynn Boger Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/asm/internal/asm/testdata/ppc64.s | 6 ++++++ src/cmd/internal/obj/ppc64/asm9.go | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/ppc64.s b/src/cmd/asm/internal/asm/testdata/ppc64.s index 366c80c090..8440375de6 100644 --- a/src/cmd/asm/internal/asm/testdata/ppc64.s +++ b/src/cmd/asm/internal/asm/testdata/ppc64.s @@ -1021,18 +1021,24 @@ label1: // VSX move from VSR, XX1-form // XS,RA produces // RA,XS +// Extended mnemonics accept VMX and FP registers as sources MFVSRD VS0, R1 MFVSRWZ VS33, R1 MFVSRLD VS63, R1 + MFVRD V0, R1 + MFFPRD F0, R1 // VSX move to VSR, XX1-form // RA,XT produces // XT,RA +// Extended mnemonics accept VMX and FP registers as targets MTVSRD R1, VS0 MTVSRWA R1, VS31 MTVSRWZ R1, VS63 MTVSRDD R1, R2, VS0 MTVSRWS R1, VS32 + MTVRD R1, V13 + MTFPRD R1, F24 // VSX AND, XX3-form // XA,XB,XT produces diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index a2ea492710..f9935d2686 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -3555,22 +3555,22 @@ func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) { if REG_V0 <= xt && xt <= REG_V31 { /* Convert V0-V31 to VS32-VS63 */ xt = xt + 64 - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg)) } else if REG_F0 <= xt && xt <= REG_F31 { /* Convert F0-F31 to VS0-VS31 */ xt = xt + 64 - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg)) } else if REG_VS0 <= xt && xt <= REG_VS63 { - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg)) } else if REG_V0 <= xs && xs <= REG_V31 { /* Likewise for XS */ xs = xs + 64 - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg)) } else if REG_F0 <= xs && xs <= REG_F31 { xs = xs + 64 - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg)) } else if REG_VS0 <= xs && xs <= REG_VS63 { - o1 = AOP_XX1(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg)) + o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg)) } case 89: /* VSX instructions, XX2-form */ -- GitLab From eca5c83a3e8b926d663b6a824c76b4dadac7b66d Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 13 Feb 2019 15:07:56 -0500 Subject: [PATCH 0459/1679] cmd/go: change the default value of GO111MODULE to 'on' This reverts CL 166985, restoring CL 162698. The bootstrap failure from CL 162698 was fixed in CL 167077 and CL 167078. Fixes #30228 Change-Id: I5a4e3081018c51b74b67185e64f20a9c824a564e Reviewed-on: https://go-review.googlesource.com/c/go/+/167087 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 331 +++++++++--------- src/cmd/go/help_test.go | 5 + src/cmd/go/internal/help/help.go | 7 +- src/cmd/go/internal/modload/help.go | 39 +-- src/cmd/go/internal/modload/init.go | 35 +- src/cmd/go/main.go | 15 +- src/cmd/go/mkalldocs.sh | 2 +- src/cmd/go/testdata/script/mod_find.txt | 2 +- .../go/testdata/script/mod_gobuild_import.txt | 6 + 9 files changed, 210 insertions(+), 232 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 6e8d60f4cd..d037d86bff 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -21,7 +21,7 @@ // fix update packages to use new APIs // fmt gofmt (reformat) package sources // generate generate Go files by processing source -// get download and install packages and dependencies +// get add dependencies to current module and install them // install compile and install packages and dependencies // list list packages or modules // mod module maintenance @@ -534,67 +534,105 @@ // For more about specifying packages, see 'go help packages'. // // -// Download and install packages and dependencies +// Add dependencies to current module and install them // // Usage: // -// go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] +// go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] // -// Get downloads the packages named by the import paths, along with their -// dependencies. It then installs the named packages, like 'go install'. +// Get resolves and adds dependencies to the current development module +// and then builds and installs them. // -// The -d flag instructs get to stop after downloading the packages; that is, -// it instructs get not to install the packages. +// The first step is to resolve which dependencies to add. // -// The -f flag, valid only when -u is set, forces get -u not to verify that -// each package has been checked out from the source control repository -// implied by its import path. This can be useful if the source is a local fork -// of the original. +// For each named package or package pattern, get must decide which version of +// the corresponding module to use. By default, get chooses the latest tagged +// release version, such as v0.4.5 or v1.2.3. If there are no tagged release +// versions, get chooses the latest tagged prerelease version, such as +// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest +// known commit. // -// The -fix flag instructs get to run the fix tool on the downloaded packages -// before resolving dependencies or building the code. +// This default version selection can be overridden by adding an @version +// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. +// For modules stored in source control repositories, the version suffix can +// also be a commit hash, branch identifier, or other syntax known to the +// source control system, as in 'go get golang.org/x/text@master'. +// The version suffix @latest explicitly requests the default behavior +// described above. // -// The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. +// If a module under consideration is already a dependency of the current +// development module, then get will update the required version. +// Specifying a version earlier than the current required version is valid and +// downgrades the dependency. The version suffix @none indicates that the +// dependency should be removed entirely, downgrading or removing modules +// depending on it as needed. // -// The -t flag instructs get to also download the packages required to build -// the tests for the specified packages. +// Although get defaults to using the latest version of the module containing +// a named package, it does not use the latest version of that module's +// dependencies. Instead it prefers to use the specific dependency versions +// requested by that module. For example, if the latest A requires module +// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' +// will use the latest A but then use B v1.2.3, as requested by A. (If there +// are competing requirements for a particular module, then 'go get' resolves +// those requirements by taking the maximum requested version.) // -// The -u flag instructs get to use the network to update the named packages -// and their dependencies. By default, get uses the network to check out -// missing packages but does not use it to look for updates to existing packages. +// The -u flag instructs get to update dependencies to use newer minor or +// patch releases when available. Continuing the previous example, +// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). // -// The -v flag enables verbose progress and debug output. +// The -u=patch flag (not -u patch) instructs get to update dependencies +// to use newer patch releases when available. Continuing the previous example, +// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). // -// Get also accepts build flags to control the installation. See 'go help build'. +// In general, adding a new dependency may require upgrading +// existing dependencies to keep a working build, and 'go get' does +// this automatically. Similarly, downgrading one dependency may +// require downgrading other dependencies, and 'go get' does +// this automatically as well. // -// When checking out a new package, get creates the target directory -// GOPATH/src/. If the GOPATH contains multiple entries, -// get uses the first one. For more details see: 'go help gopath'. +// The -m flag instructs get to stop here, after resolving, upgrading, +// and downgrading modules and updating go.mod. When using -m, +// each specified package path must be a module path as well, +// not the import path of a package below the module root. // -// When checking out or updating a package, get looks for a branch or tag -// that matches the locally installed version of Go. The most important -// rule is that if the local installation is running version "go1", get -// searches for a branch or tag named "go1". If no such version exists -// it retrieves the default branch of the package. +// The -insecure flag permits fetching from repositories and resolving +// custom domains using insecure schemes such as HTTP. Use with caution. // -// When go get checks out or updates a Git repository, -// it also updates any git submodules referenced by the repository. +// The second step is to download (if needed), build, and install +// the named packages. // -// Get never checks out or updates code stored in vendor directories. +// If an argument names a module but not a package (because there is no +// Go source code in the module's root directory), then the install step +// is skipped for that argument, instead of causing a build failure. +// For example 'go get golang.org/x/perf' succeeds even though there +// is no code corresponding to that import path. // -// For more about specifying packages, see 'go help packages'. +// Note that package patterns are allowed and are expanded after resolving +// the module versions. For example, 'go get golang.org/x/perf/cmd/...' +// adds the latest golang.org/x/perf and then installs the commands in that +// latest version. // -// For more about how 'go get' finds source code to -// download, see 'go help importpath'. +// The -d flag instructs get to download the source code needed to build +// the named packages, including downloading necessary dependencies, +// but not to build and install them. // -// This text describes the behavior of get when using GOPATH -// to manage source code and dependencies. -// If instead the go command is running in module-aware mode, -// the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help module-get'. +// With no package arguments, 'go get' applies to the main module, +// and to the Go package in the current directory, if any. In particular, +// 'go get -u' and 'go get -u=patch' update all the dependencies of the +// main module. With no package arguments and also without -u, +// 'go get' is not much more than 'go install', and 'go get -d' not much +// more than 'go list'. // -// See also: go build, go install, go clean. +// For more about modules, see 'go help modules'. +// +// For more about specifying packages, see 'go help packages'. +// +// This text describes the behavior of get using modules to manage source +// code and dependencies. If instead the go command is running in GOPATH +// mode, the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help gopath-get'. +// +// See also: go build, go install, go clean, go mod. // // // Compile and install packages and dependencies @@ -1840,6 +1878,72 @@ // See https://golang.org/s/go15vendor for details. // // +// Legacy GOPATH go get +// +// The 'go get' command changes behavior depending on whether the +// go command is running in module-aware mode or legacy GOPATH mode. +// This help text, accessible as 'go help gopath-get' even in module-aware mode, +// describes 'go get' as it operates in legacy GOPATH mode. +// +// Usage: go get [-d] [-f] [-t] [-u] [-v] [-fix] [-insecure] [build flags] [packages] +// +// Get downloads the packages named by the import paths, along with their +// dependencies. It then installs the named packages, like 'go install'. +// +// The -d flag instructs get to stop after downloading the packages; that is, +// it instructs get not to install the packages. +// +// The -f flag, valid only when -u is set, forces get -u not to verify that +// each package has been checked out from the source control repository +// implied by its import path. This can be useful if the source is a local fork +// of the original. +// +// The -fix flag instructs get to run the fix tool on the downloaded packages +// before resolving dependencies or building the code. +// +// The -insecure flag permits fetching from repositories and resolving +// custom domains using insecure schemes such as HTTP. Use with caution. +// +// The -t flag instructs get to also download the packages required to build +// the tests for the specified packages. +// +// The -u flag instructs get to use the network to update the named packages +// and their dependencies. By default, get uses the network to check out +// missing packages but does not use it to look for updates to existing packages. +// +// The -v flag enables verbose progress and debug output. +// +// Get also accepts build flags to control the installation. See 'go help build'. +// +// When checking out a new package, get creates the target directory +// GOPATH/src/. If the GOPATH contains multiple entries, +// get uses the first one. For more details see: 'go help gopath'. +// +// When checking out or updating a package, get looks for a branch or tag +// that matches the locally installed version of Go. The most important +// rule is that if the local installation is running version "go1", get +// searches for a branch or tag named "go1". If no such version exists +// it retrieves the default branch of the package. +// +// When go get checks out or updates a Git repository, +// it also updates any git submodules referenced by the repository. +// +// Get never checks out or updates code stored in vendor directories. +// +// For more about specifying packages, see 'go help packages'. +// +// For more about how 'go get' finds source code to +// download, see 'go help importpath'. +// +// This text describes the behavior of get when using GOPATH +// to manage source code and dependencies. +// If instead the go command is running in module-aware mode, +// the details of get's flags and effects change, as does 'go help get'. +// See 'go help modules' and 'go help module-get'. +// +// See also: go build, go install, go clean. +// +// // Module proxy protocol // // The go command by default downloads modules from version control systems @@ -2099,34 +2203,25 @@ // Modules replace the old GOPATH-based approach to specifying // which source files are used in a given build. // -// Preliminary module support +// Module support // -// Go 1.11 includes preliminary support for Go modules, -// including a new module-aware 'go get' command. -// We intend to keep revising this support, while preserving compatibility, -// until it can be declared official (no longer preliminary), -// and then at a later point we may remove support for work -// in GOPATH and the old 'go get' command. +// Go 1.13 includes official support for Go modules, +// including a module-aware 'go get' command. +// Module-aware mode is active by default. // -// The quickest way to take advantage of the new Go 1.11 module support -// is to check out your repository into a directory outside GOPATH/src, -// create a go.mod file (described in the next section) there, and run -// go commands from within that file tree. -// -// For more fine-grained control, the module support in Go 1.11 respects +// For more fine-grained control, Go 1.13 continues to respect // a temporary environment variable, GO111MODULE, which can be set to one -// of three string values: off, on, or auto (the default). -// If GO111MODULE=off, then the go command never uses the -// new module support. Instead it looks in vendor directories and GOPATH +// of three string values: off, auto, or on (the default). +// If GO111MODULE=on or is unset, then the go command requires the use of +// modules, never consulting GOPATH. We refer to this as the command +// being module-aware or running in "module-aware mode". +// If GO111MODULE=auto, then the go command enables or disables module +// support based on the current directory. Module support is enabled only +// when the current directory is outside GOPATH/src and itself contains a +// go.mod file or is below a directory containing a go.mod file. +// If GO111MODULE=off, then the go command never uses +// module support. Instead it looks in vendor directories and GOPATH // to find dependencies; we now refer to this as "GOPATH mode." -// If GO111MODULE=on, then the go command requires the use of modules, -// never consulting GOPATH. We refer to this as the command being -// module-aware or running in "module-aware mode". -// If GO111MODULE=auto or is unset, then the go command enables or -// disables module support based on the current directory. -// Module support is enabled only when the current directory is outside -// GOPATH/src and itself contains a go.mod file or is below a directory -// containing a go.mod file. // // In module-aware mode, GOPATH no longer defines the meaning of imports // during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) @@ -2448,110 +2543,6 @@ // are still ignored. // // -// Module-aware go get -// -// The 'go get' command changes behavior depending on whether the -// go command is running in module-aware mode or legacy GOPATH mode. -// This help text, accessible as 'go help module-get' even in legacy GOPATH mode, -// describes 'go get' as it operates in module-aware mode. -// -// Usage: go get [-d] [-m] [-u] [-v] [-insecure] [build flags] [packages] -// -// Get resolves and adds dependencies to the current development module -// and then builds and installs them. -// -// The first step is to resolve which dependencies to add. -// -// For each named package or package pattern, get must decide which version of -// the corresponding module to use. By default, get chooses the latest tagged -// release version, such as v0.4.5 or v1.2.3. If there are no tagged release -// versions, get chooses the latest tagged prerelease version, such as -// v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest -// known commit. -// -// This default version selection can be overridden by adding an @version -// suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. -// For modules stored in source control repositories, the version suffix can -// also be a commit hash, branch identifier, or other syntax known to the -// source control system, as in 'go get golang.org/x/text@master'. -// The version suffix @latest explicitly requests the default behavior -// described above. -// -// If a module under consideration is already a dependency of the current -// development module, then get will update the required version. -// Specifying a version earlier than the current required version is valid and -// downgrades the dependency. The version suffix @none indicates that the -// dependency should be removed entirely, downgrading or removing modules -// depending on it as needed. -// -// Although get defaults to using the latest version of the module containing -// a named package, it does not use the latest version of that module's -// dependencies. Instead it prefers to use the specific dependency versions -// requested by that module. For example, if the latest A requires module -// B v1.2.3, while B v1.2.4 and v1.3.1 are also available, then 'go get A' -// will use the latest A but then use B v1.2.3, as requested by A. (If there -// are competing requirements for a particular module, then 'go get' resolves -// those requirements by taking the maximum requested version.) -// -// The -u flag instructs get to update dependencies to use newer minor or -// patch releases when available. Continuing the previous example, -// 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). -// -// The -u=patch flag (not -u patch) instructs get to update dependencies -// to use newer patch releases when available. Continuing the previous example, -// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). -// -// In general, adding a new dependency may require upgrading -// existing dependencies to keep a working build, and 'go get' does -// this automatically. Similarly, downgrading one dependency may -// require downgrading other dependencies, and 'go get' does -// this automatically as well. -// -// The -m flag instructs get to stop here, after resolving, upgrading, -// and downgrading modules and updating go.mod. When using -m, -// each specified package path must be a module path as well, -// not the import path of a package below the module root. -// -// The -insecure flag permits fetching from repositories and resolving -// custom domains using insecure schemes such as HTTP. Use with caution. -// -// The second step is to download (if needed), build, and install -// the named packages. -// -// If an argument names a module but not a package (because there is no -// Go source code in the module's root directory), then the install step -// is skipped for that argument, instead of causing a build failure. -// For example 'go get golang.org/x/perf' succeeds even though there -// is no code corresponding to that import path. -// -// Note that package patterns are allowed and are expanded after resolving -// the module versions. For example, 'go get golang.org/x/perf/cmd/...' -// adds the latest golang.org/x/perf and then installs the commands in that -// latest version. -// -// The -d flag instructs get to download the source code needed to build -// the named packages, including downloading necessary dependencies, -// but not to build and install them. -// -// With no package arguments, 'go get' applies to the main module, -// and to the Go package in the current directory, if any. In particular, -// 'go get -u' and 'go get -u=patch' update all the dependencies of the -// main module. With no package arguments and also without -u, -// 'go get' is not much more than 'go install', and 'go get -d' not much -// more than 'go list'. -// -// For more about modules, see 'go help modules'. -// -// For more about specifying packages, see 'go help packages'. -// -// This text describes the behavior of get using modules to manage source -// code and dependencies. If instead the go command is running in GOPATH -// mode, the details of get's flags and effects change, as does 'go help get'. -// See 'go help modules' and 'go help gopath-get'. -// -// See also: go build, go install, go clean, go mod. -// -// // Package lists and patterns // // Many commands apply to a set of packages: diff --git a/src/cmd/go/help_test.go b/src/cmd/go/help_test.go index ec6a9d11cb..9c0fa8411e 100644 --- a/src/cmd/go/help_test.go +++ b/src/cmd/go/help_test.go @@ -12,9 +12,14 @@ import ( "testing" "cmd/go/internal/help" + "cmd/go/internal/modload" ) func TestDocsUpToDate(t *testing.T) { + if !modload.Enabled() { + t.Skipf("help.Help in GOPATH mode is configured by main.main") + } + buf := new(bytes.Buffer) // Match the command in mkalldocs.sh that generates alldocs.go. help.Help(buf, []string{"documentation"}) diff --git a/src/cmd/go/internal/help/help.go b/src/cmd/go/internal/help/help.go index 121deb70a5..d373771ab5 100644 --- a/src/cmd/go/internal/help/help.go +++ b/src/cmd/go/internal/help/help.go @@ -17,6 +17,7 @@ import ( "unicode/utf8" "cmd/go/internal/base" + "cmd/go/internal/modload" ) // Help implements the 'help' command. @@ -35,8 +36,10 @@ func Help(w io.Writer, args []string) { usage := &base.Command{Long: buf.String()} cmds := []*base.Command{usage} for _, cmd := range base.Go.Commands { - if cmd.UsageLine == "gopath-get" { - // Avoid duplication of the "get" documentation. + // Avoid duplication of the "get" documentation. + if cmd.UsageLine == "module-get" && modload.Enabled() { + continue + } else if cmd.UsageLine == "gopath-get" && !modload.Enabled() { continue } cmds = append(cmds, cmd) diff --git a/src/cmd/go/internal/modload/help.go b/src/cmd/go/internal/modload/help.go index 63657a448f..c1685ff08e 100644 --- a/src/cmd/go/internal/modload/help.go +++ b/src/cmd/go/internal/modload/help.go @@ -19,34 +19,25 @@ including recording and resolving dependencies on other modules. Modules replace the old GOPATH-based approach to specifying which source files are used in a given build. -Preliminary module support +Module support -Go 1.11 includes preliminary support for Go modules, -including a new module-aware 'go get' command. -We intend to keep revising this support, while preserving compatibility, -until it can be declared official (no longer preliminary), -and then at a later point we may remove support for work -in GOPATH and the old 'go get' command. +Go 1.13 includes official support for Go modules, +including a module-aware 'go get' command. +Module-aware mode is active by default. -The quickest way to take advantage of the new Go 1.11 module support -is to check out your repository into a directory outside GOPATH/src, -create a go.mod file (described in the next section) there, and run -go commands from within that file tree. - -For more fine-grained control, the module support in Go 1.11 respects +For more fine-grained control, Go 1.13 continues to respect a temporary environment variable, GO111MODULE, which can be set to one -of three string values: off, on, or auto (the default). -If GO111MODULE=off, then the go command never uses the -new module support. Instead it looks in vendor directories and GOPATH +of three string values: off, auto, or on (the default). +If GO111MODULE=on or is unset, then the go command requires the use of +modules, never consulting GOPATH. We refer to this as the command +being module-aware or running in "module-aware mode". +If GO111MODULE=auto, then the go command enables or disables module +support based on the current directory. Module support is enabled only +when the current directory is outside GOPATH/src and itself contains a +go.mod file or is below a directory containing a go.mod file. +If GO111MODULE=off, then the go command never uses +module support. Instead it looks in vendor directories and GOPATH to find dependencies; we now refer to this as "GOPATH mode." -If GO111MODULE=on, then the go command requires the use of modules, -never consulting GOPATH. We refer to this as the command being -module-aware or running in "module-aware mode". -If GO111MODULE=auto or is unset, then the go command enables or -disables module support based on the current directory. -Module support is enabled only when the current directory is outside -GOPATH/src and itself contains a go.mod file or is below a directory -containing a go.mod file. In module-aware mode, GOPATH no longer defines the meaning of imports during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index af7ce070ce..d0beb6e747 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -33,7 +33,7 @@ import ( var ( cwd string // TODO(bcmills): Is this redundant with base.Cwd? - MustUseModules = mustUseModules() + mustUseModules = true initialized bool modRoot string @@ -78,16 +78,6 @@ func BinDir() string { return filepath.Join(gopath, "bin") } -// mustUseModules reports whether we are invoked as vgo -// (as opposed to go). -// If so, we only support builds with go.mod files. -func mustUseModules() bool { - name := os.Args[0] - name = name[strings.LastIndex(name, "/")+1:] - name = name[strings.LastIndex(name, `\`)+1:] - return strings.HasPrefix(name, "vgo") -} - var inGOPATH bool // running in GOPATH/src // Init determines whether module mode is enabled, locates the root of the @@ -104,14 +94,13 @@ func Init() { switch env { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) - case "", "auto": - // leave MustUseModules alone - case "on": - MustUseModules = true + case "auto": + mustUseModules = false + case "on", "": + mustUseModules = true case "off": - if !MustUseModules { - return - } + mustUseModules = false + return } // Disable any prompting for passwords by Git. @@ -158,7 +147,7 @@ func Init() { } } - if inGOPATH && !MustUseModules { + if inGOPATH && !mustUseModules { if CmdModInit { die() // Don't init a module that we're just going to ignore. } @@ -175,8 +164,8 @@ func Init() { } else { modRoot = findModuleRoot(cwd) if modRoot == "" { - if !MustUseModules { - // GO111MODULE is 'auto' (or unset), and we can't find a module root. + if !mustUseModules { + // GO111MODULE is 'auto', and we can't find a module root. // Stay in GOPATH mode. return } @@ -275,7 +264,7 @@ func init() { // (usually through MustModRoot). func Enabled() bool { Init() - return modRoot != "" || MustUseModules + return modRoot != "" || mustUseModules } // ModRoot returns the root of the main module. @@ -308,7 +297,7 @@ func die() { if os.Getenv("GO111MODULE") == "off" { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") } - if inGOPATH && !MustUseModules { + if inGOPATH && !mustUseModules { base.Fatalf("go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'") } if cwd != "" { diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index acca4fd3c1..e529e96986 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -49,7 +49,7 @@ func init() { fix.CmdFix, fmtcmd.CmdFmt, generate.CmdGenerate, - get.CmdGet, + modget.CmdGet, work.CmdInstall, list.CmdList, modcmd.CmdMod, @@ -89,17 +89,10 @@ func main() { base.Usage() } - if modload.MustUseModules { - // If running with modules force-enabled, change get now to change help message. - *get.CmdGet = *modget.CmdGet - } - if args[0] == "get" || args[0] == "help" { - // Replace get with module-aware get if appropriate. - // Note that if MustUseModules is true, this happened already above, - // but no harm in doing it again. - if modload.Init(); modload.Enabled() { - *get.CmdGet = *modget.CmdGet + if modload.Init(); !modload.Enabled() { + // Replace module-aware get with GOPATH get if appropriate. + *modget.CmdGet = *get.CmdGet } } diff --git a/src/cmd/go/mkalldocs.sh b/src/cmd/go/mkalldocs.sh index f37d59d2d7..a2b0aca3c9 100755 --- a/src/cmd/go/mkalldocs.sh +++ b/src/cmd/go/mkalldocs.sh @@ -8,6 +8,6 @@ set -e go build -o go.latest # If the command used to generate alldocs.go changes, update TestDocsUpToDate in # help_test.go. -./go.latest help documentation >alldocs.go +GO111MODULE='' ./go.latest help documentation >alldocs.go gofmt -w alldocs.go rm go.latest diff --git a/src/cmd/go/testdata/script/mod_find.txt b/src/cmd/go/testdata/script/mod_find.txt index 703a88e99c..e82001a24a 100644 --- a/src/cmd/go/testdata/script/mod_find.txt +++ b/src/cmd/go/testdata/script/mod_find.txt @@ -17,7 +17,7 @@ cd $GOPATH/src/example.com/x/y ! go mod init stderr 'go: modules disabled inside GOPATH/src by GO111MODULE=auto; see ''go help modules''' -env GO111MODULE=on +env GO111MODULE= # Derive module path from location inside GOPATH. cd $GOPATH/src/example.com/x/y diff --git a/src/cmd/go/testdata/script/mod_gobuild_import.txt b/src/cmd/go/testdata/script/mod_gobuild_import.txt index d2d1645b83..6c87d59649 100644 --- a/src/cmd/go/testdata/script/mod_gobuild_import.txt +++ b/src/cmd/go/testdata/script/mod_gobuild_import.txt @@ -24,12 +24,18 @@ exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on outside GOPATH/src +env GO111MODULE= +exec $WORK/testimport.exe other/x/y/z/w . +stdout w2.go env GO111MODULE=on exec $WORK/testimport.exe other/x/y/z/w . stdout w2.go # GO111MODULE=on in GOPATH/src cd $GOPATH/src +env GO111MODULE= +exec $WORK/testimport.exe x/y/z/w . +stdout w1.go env GO111MODULE=on exec $WORK/testimport.exe x/y/z/w . stdout w1.go -- GitLab From f2a18b1456e9cbb83ada13776195c56d2a6fb951 Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Seo Date: Fri, 22 Feb 2019 16:12:37 -0300 Subject: [PATCH 0460/1679] cmd/compile: make math/bits.RotateLeft{32,64} intrinsics on ppc64x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends CL 132435 to ppc64x. ppc64x has 32- and 64-bit variable rotate left instructions. name old time/op new time/op delta RotateLeft32-16 1.39ns ± 0% 1.37ns ± 0% -1.44% (p=0.008 n=5+5) RotateLeft64-16 1.35ns ± 0% 1.32ns ± 0% -2.22% (p=0.008 n=5+5) Updates #17566 Change-Id: I567f634ff90d0691db45df0a25c99fcdfe10ca00 Reviewed-on: https://go-review.googlesource.com/c/go/+/163760 Reviewed-by: Lynn Boger --- src/cmd/compile/internal/gc/ssa.go | 4 +- src/cmd/compile/internal/ssa/gen/PPC64.rules | 8 +++ src/cmd/compile/internal/ssa/rewritePPC64.go | 74 ++++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index ecc449114d..d61f463ccf 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3427,12 +3427,12 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue2(ssa.OpRotateLeft32, types.Types[TUINT32], args[0], args[1]) }, - sys.AMD64, sys.ARM64, sys.S390X) + sys.AMD64, sys.ARM64, sys.S390X, sys.PPC64) addF("math/bits", "RotateLeft64", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue2(ssa.OpRotateLeft64, types.Types[TUINT64], args[0], args[1]) }, - sys.AMD64, sys.ARM64, sys.S390X) + sys.AMD64, sys.ARM64, sys.S390X, sys.PPC64) alias("math/bits", "RotateLeft", "math/bits", "RotateLeft64", p8...) makeOnesCountAMD64 := func(op64 ssa.Op, op32 ssa.Op) func(s *state, n *Node, args []*ssa.Value) *ssa.Value { diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index e5d5295908..8dee5a1cba 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -100,6 +100,14 @@ ( OR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) -> (ROTLW x y) (XOR (SLW x (ANDconst [31] y)) (SRW x (SUB (MOVDconst [32]) (ANDconst [31] y)))) -> (ROTLW x y) +// Lowering rotates +(RotateLeft32 x y) -> (ROTLW x y) +(RotateLeft64 x y) -> (ROTL x y) + +// Constant rotate generation +(ROTLW x (MOVDconst [c])) -> (ROTLWconst x [c&31]) +(ROTL x (MOVDconst [c])) -> (ROTLconst x [c&63]) + (Lsh64x64 x (Const64 [c])) && uint64(c) < 64 -> (SLDconst x [c]) (Rsh64x64 x (Const64 [c])) && uint64(c) < 64 -> (SRADconst x [c]) (Rsh64Ux64 x (Const64 [c])) && uint64(c) < 64 -> (SRDconst x [c]) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 302b785f61..9245f403b8 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -537,6 +537,10 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64ORN_0(v) case OpPPC64ORconst: return rewriteValuePPC64_OpPPC64ORconst_0(v) + case OpPPC64ROTL: + return rewriteValuePPC64_OpPPC64ROTL_0(v) + case OpPPC64ROTLW: + return rewriteValuePPC64_OpPPC64ROTLW_0(v) case OpPPC64SUB: return rewriteValuePPC64_OpPPC64SUB_0(v) case OpPPC64XOR: @@ -551,6 +555,10 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPopCount64_0(v) case OpPopCount8: return rewriteValuePPC64_OpPopCount8_0(v) + case OpRotateLeft32: + return rewriteValuePPC64_OpRotateLeft32_0(v) + case OpRotateLeft64: + return rewriteValuePPC64_OpRotateLeft64_0(v) case OpRound: return rewriteValuePPC64_OpRound_0(v) case OpRound32F: @@ -25533,6 +25541,44 @@ func rewriteValuePPC64_OpPPC64ORconst_0(v *Value) bool { } return false } +func rewriteValuePPC64_OpPPC64ROTL_0(v *Value) bool { + // match: (ROTL x (MOVDconst [c])) + // cond: + // result: (ROTLconst x [c&63]) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpPPC64MOVDconst { + break + } + c := v_1.AuxInt + v.reset(OpPPC64ROTLconst) + v.AuxInt = c & 63 + v.AddArg(x) + return true + } + return false +} +func rewriteValuePPC64_OpPPC64ROTLW_0(v *Value) bool { + // match: (ROTLW x (MOVDconst [c])) + // cond: + // result: (ROTLWconst x [c&31]) + for { + _ = v.Args[1] + x := v.Args[0] + v_1 := v.Args[1] + if v_1.Op != OpPPC64MOVDconst { + break + } + c := v_1.AuxInt + v.reset(OpPPC64ROTLWconst) + v.AuxInt = c & 31 + v.AddArg(x) + return true + } + return false +} func rewriteValuePPC64_OpPPC64SUB_0(v *Value) bool { // match: (SUB x (MOVDconst [c])) // cond: is32Bit(-c) @@ -26086,6 +26132,34 @@ func rewriteValuePPC64_OpPopCount8_0(v *Value) bool { return true } } +func rewriteValuePPC64_OpRotateLeft32_0(v *Value) bool { + // match: (RotateLeft32 x y) + // cond: + // result: (ROTLW x y) + for { + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + v.reset(OpPPC64ROTLW) + v.AddArg(x) + v.AddArg(y) + return true + } +} +func rewriteValuePPC64_OpRotateLeft64_0(v *Value) bool { + // match: (RotateLeft64 x y) + // cond: + // result: (ROTL x y) + for { + _ = v.Args[1] + x := v.Args[0] + y := v.Args[1] + v.reset(OpPPC64ROTL) + v.AddArg(x) + v.AddArg(y) + return true + } +} func rewriteValuePPC64_OpRound_0(v *Value) bool { // match: (Round x) // cond: -- GitLab From b130764043f2106929a2e6f75ced8edfd2a542ea Mon Sep 17 00:00:00 2001 From: Patrick Barker Date: Thu, 14 Mar 2019 02:51:02 +0000 Subject: [PATCH 0461/1679] printer: check if specs exist before accessing them in genDecl printer Checks that specs exist before attempting to access the first element in genDecl printer. Change-Id: I3619bcabf6fec64c88b7a10cdb7be355e9e40559 GitHub-Last-Rev: 54cf699c969cb88cfd269f847a2bb4f25916be94 GitHub-Pull-Request: golang/go#30823 Reviewed-on: https://go-review.googlesource.com/c/go/+/167390 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot --- src/go/printer/nodes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/go/printer/nodes.go b/src/go/printer/nodes.go index 0f2029cada..fa7589e868 100644 --- a/src/go/printer/nodes.go +++ b/src/go/printer/nodes.go @@ -1568,7 +1568,7 @@ func (p *printer) genDecl(d *ast.GenDecl) { } p.print(d.Rparen, token.RPAREN) - } else { + } else if len(d.Specs) > 0 { // single declaration p.spec(d.Specs[0], 1, true) } -- GitLab From 47e42cdadc4abeb28ff21930bfe22210dcb9abd4 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Tue, 12 Mar 2019 23:40:03 +0100 Subject: [PATCH 0462/1679] misc/wasm: add workaround for missed timeout events TryBot is sometimes running into deadlocks on js/wasm. We haven't been able to reproduce them yet. This workaround is an experiment to resolve these deadlocks by retrying a missed timeout event. A timeout event is scheduled by Go to be woken by JavaScript after a certain amount of time. The checkTimeouts function then checks which notes to wake by comparing their deadline to nanotime. If this check fails erroneously then the note may stay asleep forever, causing a deadlock. This may or may not be the reason of the observed deadlocks. Updates #28975. Change-Id: I46b9d4069307142914f0e7b3acd4e65578319f0b Reviewed-on: https://go-review.googlesource.com/c/go/+/167119 Reviewed-by: Brad Fitzpatrick --- misc/wasm/wasm_exec.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index 8eff751d62..e939e8527a 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -265,7 +265,15 @@ const id = this._nextCallbackTimeoutID; this._nextCallbackTimeoutID++; this._scheduledTimeouts.set(id, setTimeout( - () => { this._resume(); }, + () => { + this._resume(); + while (this._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn("scheduleTimeoutEvent: missed timeout event"); + this._resume(); + } + }, getInt64(sp + 8) + 1, // setTimeout has been seen to fire up to 1 millisecond early )); mem().setInt32(sp + 16, id, true); -- GitLab From d98e0720bcd05d0c162e932710a4ca39d9ef0fd2 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 14 Mar 2019 17:22:00 +0000 Subject: [PATCH 0463/1679] cmd/compile/internal/ssa: re-run generator CL 163760 was submitted with this file generated from an old version of the code generator. Change-Id: I9a3b9a48f794f74567f82ef58637cb1820befd11 Reviewed-on: https://go-review.googlesource.com/c/go/+/167677 Reviewed-by: Richard Musiol --- src/cmd/compile/internal/ssa/rewritePPC64.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 9245f403b8..7daed08dab 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -26137,9 +26137,8 @@ func rewriteValuePPC64_OpRotateLeft32_0(v *Value) bool { // cond: // result: (ROTLW x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ROTLW) v.AddArg(x) v.AddArg(y) @@ -26151,9 +26150,8 @@ func rewriteValuePPC64_OpRotateLeft64_0(v *Value) bool { // cond: // result: (ROTL x y) for { - _ = v.Args[1] - x := v.Args[0] y := v.Args[1] + x := v.Args[0] v.reset(OpPPC64ROTL) v.AddArg(x) v.AddArg(y) -- GitLab From d3bb45d9046bb7d12c4fc9cdaf122f36d001fd31 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Thu, 14 Mar 2019 13:58:47 -0400 Subject: [PATCH 0464/1679] doc: document Go 1.11.6 Change-Id: I99832fa4f2c3ec28e2dad46cf7607f3766948031 Reviewed-on: https://go-review.googlesource.com/c/go/+/167698 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 3b6131b331..7255bd9811 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -80,6 +80,14 @@ the Go 1.11.5 milestone on our issue tracker for details.

    +

    +go1.11.6 (released 2019/03/14) includes fixes to cgo, the compiler, linker, +runtime, go command, and the crypto/x509, encoding/json, +net, and net/url packages. See the +Go +1.11.6 milestone on our issue tracker for details. +

    +

    go1.10 (released 2018/02/16)

    -- GitLab From f832a97e454a5e2bed336321965fd2382b2af868 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Thu, 14 Mar 2019 14:03:30 -0400 Subject: [PATCH 0465/1679] doc: document Go 1.12.1 Change-Id: I6d3a615c5f72e9aa29d23e127af98d6e836da173 Reviewed-on: https://go-review.googlesource.com/c/go/+/167699 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 7255bd9811..7a036db9a8 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -30,6 +30,14 @@ Go 1.12 is a major release of Go. Read the Go 1.12 Release Notes for more information.

    +

    +go1.12.1 (released 2019/03/14) includes fixes to cgo, the compiler, the go +command, and the fmt, net/smtp, os, +path/filepath, sync, and text/template +packages. See the Go +1.12.1 milestone on our issue tracker for details. +

    +

    go1.11 (released 2018/08/24)

    -- GitLab From aa193c0b9623acd7397c0799ffc9efe5845216b2 Mon Sep 17 00:00:00 2001 From: Derek Phan Date: Thu, 14 Mar 2019 00:55:05 +0000 Subject: [PATCH 0466/1679] time: add methods to convert duration to microseconds and milliseconds The return values are integers, as opposed to floats, since the fractionals can be derived from multiplying t.Seconds(). Fixes #28564 Change-Id: I3796227e1f64ead39ff0aacfbdce912d952f2994 GitHub-Last-Rev: b843ab740bf5a8216478322533521d6243fe1cb1 GitHub-Pull-Request: golang/go#30819 Reviewed-on: https://go-review.googlesource.com/c/go/+/167387 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer TryBot-Result: Gobot Gobot --- src/time/time.go | 6 ++++++ src/time/time_test.go | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/time/time.go b/src/time/time.go index d0d780fd6c..aacde0db2c 100644 --- a/src/time/time.go +++ b/src/time/time.go @@ -783,6 +783,12 @@ func fmtInt(buf []byte, v uint64) int { // Nanoseconds returns the duration as an integer nanosecond count. func (d Duration) Nanoseconds() int64 { return int64(d) } +// Microseconds returns the duration as an integer microsecond count. +func (d Duration) Microseconds() int64 { return int64(d) / 1e3 } + +// Milliseconds returns the duration as an integer millisecond count. +func (d Duration) Milliseconds() int64 { return int64(d) / 1e6 } + // These methods return float64 because the dominant // use case is for printing a floating point number like 1.5s, and // a truncation to integer would make them not useful in those cases. diff --git a/src/time/time_test.go b/src/time/time_test.go index 76924e36f3..0ac3c3a27f 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -690,7 +690,7 @@ var gobTests = []Time{ Date(0, 1, 2, 3, 4, 5, 6, UTC), Date(7, 8, 9, 10, 11, 12, 13, FixedZone("", 0)), Unix(81985467080890095, 0x76543210), // Time.sec: 0x0123456789ABCDEF - {}, // nil location + {}, // nil location Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", 32767*60)), Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", -32768*60)), } @@ -1021,7 +1021,39 @@ var nsDurationTests = []struct { func TestDurationNanoseconds(t *testing.T) { for _, tt := range nsDurationTests { if got := tt.d.Nanoseconds(); got != tt.want { - t.Errorf("d.Nanoseconds() = %d; want: %d", got, tt.want) + t.Errorf("Duration(%s).Nanoseconds() = %d; want: %d", tt.d, got, tt.want) + } + } +} + +var usDurationTests = []struct { + d Duration + want int64 +}{ + {Duration(-1000), -1}, + {Duration(1000), 1}, +} + +func TestDurationMicroseconds(t *testing.T) { + for _, tt := range usDurationTests { + if got := tt.d.Microseconds(); got != tt.want { + t.Errorf("Duration(%s).Microseconds() = %d; want: %d", tt.d, got, tt.want) + } + } +} + +var msDurationTests = []struct { + d Duration + want int64 +}{ + {Duration(-1000000), -1}, + {Duration(1000000), 1}, +} + +func TestDurationMilliseconds(t *testing.T) { + for _, tt := range msDurationTests { + if got := tt.d.Milliseconds(); got != tt.want { + t.Errorf("Duration(%s).Milliseconds() = %d; want: %d", tt.d, got, tt.want) } } } @@ -1036,7 +1068,7 @@ var secDurationTests = []struct { func TestDurationSeconds(t *testing.T) { for _, tt := range secDurationTests { if got := tt.d.Seconds(); got != tt.want { - t.Errorf("d.Seconds() = %g; want: %g", got, tt.want) + t.Errorf("Duration(%s).Seconds() = %g; want: %g", tt.d, got, tt.want) } } } @@ -1055,7 +1087,7 @@ var minDurationTests = []struct { func TestDurationMinutes(t *testing.T) { for _, tt := range minDurationTests { if got := tt.d.Minutes(); got != tt.want { - t.Errorf("d.Minutes() = %g; want: %g", got, tt.want) + t.Errorf("Duration(%s).Minutes() = %g; want: %g", tt.d, got, tt.want) } } } @@ -1074,7 +1106,7 @@ var hourDurationTests = []struct { func TestDurationHours(t *testing.T) { for _, tt := range hourDurationTests { if got := tt.d.Hours(); got != tt.want { - t.Errorf("d.Hours() = %g; want: %g", got, tt.want) + t.Errorf("Duration(%s).Hours() = %g; want: %g", tt.d, got, tt.want) } } } -- GitLab From 5ee1b849592787ed050ef3fbd9b2c58aabd20ff3 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Tue, 5 Mar 2019 01:56:17 +0100 Subject: [PATCH 0467/1679] math, math/bits: add intrinsics for wasm This commit adds compiler intrinsics for the packages math and math/bits on the wasm architecture for better performance. benchmark old ns/op new ns/op delta BenchmarkCeil 8.31 3.21 -61.37% BenchmarkCopysign 5.24 3.88 -25.95% BenchmarkAbs 5.42 3.34 -38.38% BenchmarkFloor 8.29 3.18 -61.64% BenchmarkRoundToEven 9.76 3.26 -66.60% BenchmarkSqrtLatency 8.13 4.88 -39.98% BenchmarkSqrtPrime 5246 3535 -32.62% BenchmarkTrunc 8.29 3.15 -62.00% BenchmarkLeadingZeros 13.0 4.23 -67.46% BenchmarkLeadingZeros8 4.65 4.42 -4.95% BenchmarkLeadingZeros16 7.60 4.38 -42.37% BenchmarkLeadingZeros32 10.7 4.48 -58.13% BenchmarkLeadingZeros64 12.9 4.31 -66.59% BenchmarkTrailingZeros 6.52 4.04 -38.04% BenchmarkTrailingZeros8 4.57 4.14 -9.41% BenchmarkTrailingZeros16 6.69 4.16 -37.82% BenchmarkTrailingZeros32 6.97 4.23 -39.31% BenchmarkTrailingZeros64 6.59 4.00 -39.30% BenchmarkOnesCount 7.93 3.30 -58.39% BenchmarkOnesCount8 3.56 3.19 -10.39% BenchmarkOnesCount16 4.85 3.19 -34.23% BenchmarkOnesCount32 7.27 3.19 -56.12% BenchmarkOnesCount64 8.08 3.28 -59.41% BenchmarkRotateLeft 4.88 3.80 -22.13% BenchmarkRotateLeft64 5.03 3.63 -27.83% Change-Id: Ic1e0c2984878be8defb6eb7eb6ee63765c793222 Reviewed-on: https://go-review.googlesource.com/c/go/+/165177 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 42 +-- src/cmd/compile/internal/ssa/gen/Wasm.rules | 25 ++ src/cmd/compile/internal/ssa/gen/WasmOps.go | 13 + src/cmd/compile/internal/ssa/opGen.go | 156 ++++++++++ src/cmd/compile/internal/ssa/rewriteWasm.go | 317 ++++++++++++++++++++ src/cmd/compile/internal/wasm/ssa.go | 4 +- test/codegen/math.go | 7 + test/codegen/mathbits.go | 21 ++ test/run.go | 4 + 9 files changed, 566 insertions(+), 23 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index d61f463ccf..62301642f5 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3190,22 +3190,22 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpSqrt, types.Types[TFLOAT64], args[0]) }, - sys.I386, sys.AMD64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.S390X) + sys.I386, sys.AMD64, sys.ARM, sys.ARM64, sys.MIPS, sys.MIPS64, sys.PPC64, sys.S390X, sys.Wasm) addF("math", "Trunc", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpTrunc, types.Types[TFLOAT64], args[0]) }, - sys.ARM64, sys.PPC64, sys.S390X) + sys.ARM64, sys.PPC64, sys.S390X, sys.Wasm) addF("math", "Ceil", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCeil, types.Types[TFLOAT64], args[0]) }, - sys.ARM64, sys.PPC64, sys.S390X) + sys.ARM64, sys.PPC64, sys.S390X, sys.Wasm) addF("math", "Floor", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpFloor, types.Types[TFLOAT64], args[0]) }, - sys.ARM64, sys.PPC64, sys.S390X) + sys.ARM64, sys.PPC64, sys.S390X, sys.Wasm) addF("math", "Round", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpRound, types.Types[TFLOAT64], args[0]) @@ -3215,17 +3215,17 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpRoundToEven, types.Types[TFLOAT64], args[0]) }, - sys.ARM64, sys.S390X) + sys.ARM64, sys.S390X, sys.Wasm) addF("math", "Abs", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpAbs, types.Types[TFLOAT64], args[0]) }, - sys.ARM64, sys.PPC64) + sys.ARM64, sys.PPC64, sys.Wasm) addF("math", "Copysign", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue2(ssa.OpCopysign, types.Types[TFLOAT64], args[0], args[1]) }, - sys.PPC64) + sys.PPC64, sys.Wasm) makeRoundAMD64 := func(op ssa.Op) func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return func(s *state, n *Node, args []*ssa.Value) *ssa.Value { @@ -3275,12 +3275,12 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz64, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "TrailingZeros32", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz32, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "TrailingZeros16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt16to32, types.Types[TUINT32], args[0]) @@ -3293,7 +3293,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz16, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64) + sys.AMD64, sys.ARM64, sys.Wasm) addF("math/bits", "TrailingZeros16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt16to64, types.Types[TUINT64], args[0]) @@ -3314,7 +3314,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz8, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64) + sys.AMD64, sys.ARM64, sys.Wasm) addF("math/bits", "TrailingZeros8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt8to64, types.Types[TUINT64], args[0]) @@ -3331,7 +3331,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpBitLen64, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "Len32", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpBitLen32, types.Types[TINT], args[0]) @@ -3345,7 +3345,7 @@ func init() { x := s.newValue1(ssa.OpZeroExt32to64, types.Types[TUINT64], args[0]) return s.newValue1(ssa.OpBitLen64, types.Types[TINT], x) }, - sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "Len16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { if s.config.PtrSize == 4 { @@ -3355,7 +3355,7 @@ func init() { x := s.newValue1(ssa.OpZeroExt16to64, types.Types[TUINT64], args[0]) return s.newValue1(ssa.OpBitLen64, types.Types[TINT], x) }, - sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "Len16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpBitLen16, types.Types[TINT], args[0]) @@ -3370,7 +3370,7 @@ func init() { x := s.newValue1(ssa.OpZeroExt8to64, types.Types[TUINT64], args[0]) return s.newValue1(ssa.OpBitLen64, types.Types[TINT], x) }, - sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) addF("math/bits", "Len8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpBitLen8, types.Types[TINT], args[0]) @@ -3383,7 +3383,7 @@ func init() { } return s.newValue1(ssa.OpBitLen64, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64) + sys.AMD64, sys.ARM64, sys.ARM, sys.S390X, sys.MIPS, sys.PPC64, sys.Wasm) // LeadingZeros is handled because it trivially calls Len. addF("math/bits", "Reverse64", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { @@ -3432,7 +3432,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue2(ssa.OpRotateLeft64, types.Types[TUINT64], args[0], args[1]) }, - sys.AMD64, sys.ARM64, sys.S390X, sys.PPC64) + sys.AMD64, sys.ARM64, sys.S390X, sys.PPC64, sys.Wasm) alias("math/bits", "RotateLeft", "math/bits", "RotateLeft64", p8...) makeOnesCountAMD64 := func(op64 ssa.Op, op32 ssa.Op) func(s *state, n *Node, args []*ssa.Value) *ssa.Value { @@ -3476,7 +3476,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpPopCount64, types.Types[TINT], args[0]) }, - sys.PPC64, sys.ARM64, sys.S390X) + sys.PPC64, sys.ARM64, sys.S390X, sys.Wasm) addF("math/bits", "OnesCount32", makeOnesCountAMD64(ssa.OpPopCount32, ssa.OpPopCount32), sys.AMD64) @@ -3484,7 +3484,7 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpPopCount32, types.Types[TINT], args[0]) }, - sys.PPC64, sys.ARM64, sys.S390X) + sys.PPC64, sys.ARM64, sys.S390X, sys.Wasm) addF("math/bits", "OnesCount16", makeOnesCountAMD64(ssa.OpPopCount16, ssa.OpPopCount16), sys.AMD64) @@ -3492,12 +3492,12 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpPopCount16, types.Types[TINT], args[0]) }, - sys.ARM64, sys.S390X, sys.PPC64) + sys.ARM64, sys.S390X, sys.PPC64, sys.Wasm) addF("math/bits", "OnesCount8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpPopCount8, types.Types[TINT], args[0]) }, - sys.S390X, sys.PPC64) + sys.S390X, sys.PPC64, sys.Wasm) addF("math/bits", "OnesCount", makeOnesCountAMD64(ssa.OpPopCount64, ssa.OpPopCount32), sys.AMD64) diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index b7ecae7d8c..83e1be798e 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -357,6 +357,31 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +// --- Intrinsics --- +(Sqrt x) -> (F64Sqrt x) +(Trunc x) -> (F64Trunc x) +(Ceil x) -> (F64Ceil x) +(Floor x) -> (F64Floor x) +(RoundToEven x) -> (F64Nearest x) +(Abs x) -> (F64Abs x) +(Copysign x y) -> (F64Copysign x y) + +(Ctz64 x) -> (I64Ctz x) +(Ctz32 x) -> (I64Ctz (I64Or x (I64Const [0x100000000]))) +(Ctz16 x) -> (I64Ctz (I64Or x (I64Const [0x10000]))) +(Ctz8 x) -> (I64Ctz (I64Or x (I64Const [0x100]))) + +(Ctz(64|32|16|8)NonZero x) -> (I64Ctz x) + +(BitLen64 x) -> (I64Sub (I64Const [64]) (I64Clz x)) + +(RotateLeft64 x y) -> (I64Rotl x y) + +(PopCount64 x) -> (I64Popcnt x) +(PopCount32 x) -> (I64Popcnt (ZeroExt32to64 x)) +(PopCount16 x) -> (I64Popcnt (ZeroExt16to64 x)) +(PopCount8 x) -> (I64Popcnt (ZeroExt8to64 x)) + // --- Optimizations --- (I64Add (I64Const [x]) (I64Const [y])) -> (I64Const [x + y]) (I64Mul (I64Const [x]) (I64Const [y])) -> (I64Const [x * y]) diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index c0ad9498ff..4a01bf6c28 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -191,6 +191,19 @@ func init() { {name: "I64TruncF64U", asm: "I64TruncF64U", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to an unsigned integer {name: "F64ConvertI64S", asm: "F64ConvertI64S", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the signed integer arg0 to a float {name: "F64ConvertI64U", asm: "F64ConvertI64U", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the unsigned integer arg0 to a float + + {name: "F64Sqrt", asm: "F64Sqrt", argLength: 1, reg: fp11, typ: "Float64"}, // sqrt(arg0) + {name: "F64Trunc", asm: "F64Trunc", argLength: 1, reg: fp11, typ: "Float64"}, // trunc(arg0) + {name: "F64Ceil", asm: "F64Ceil", argLength: 1, reg: fp11, typ: "Float64"}, // ceil(arg0) + {name: "F64Floor", asm: "F64Floor", argLength: 1, reg: fp11, typ: "Float64"}, // floor(arg0) + {name: "F64Nearest", asm: "F64Nearest", argLength: 1, reg: fp11, typ: "Float64"}, // round(arg0) + {name: "F64Abs", asm: "F64Abs", argLength: 1, reg: fp11, typ: "Float64"}, // abs(arg0) + {name: "F64Copysign", asm: "F64Copysign", argLength: 2, reg: fp21, typ: "Float64"}, // copysign(arg0, arg1) + + {name: "I64Ctz", asm: "I64Ctz", argLength: 1, reg: gp11, typ: "Int64"}, // ctz(arg0) + {name: "I64Clz", asm: "I64Clz", argLength: 1, reg: gp11, typ: "Int64"}, // clz(arg0) + {name: "I64Rotl", asm: "I64Rotl", argLength: 2, reg: gp21, typ: "Int64"}, // rotl(arg0, arg1) + {name: "I64Popcnt", asm: "I64Popcnt", argLength: 1, reg: gp11, typ: "Int64"}, // popcnt(arg0) } archs = append(archs, arch{ diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index ae1a2b47e6..bf9fe7c960 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -2094,6 +2094,17 @@ const ( OpWasmI64TruncF64U OpWasmF64ConvertI64S OpWasmF64ConvertI64U + OpWasmF64Sqrt + OpWasmF64Trunc + OpWasmF64Ceil + OpWasmF64Floor + OpWasmF64Nearest + OpWasmF64Abs + OpWasmF64Copysign + OpWasmI64Ctz + OpWasmI64Clz + OpWasmI64Rotl + OpWasmI64Popcnt OpAdd8 OpAdd16 @@ -28178,6 +28189,151 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "F64Sqrt", + argLen: 1, + asm: wasm.AF64Sqrt, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Trunc", + argLen: 1, + asm: wasm.AF64Trunc, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Ceil", + argLen: 1, + asm: wasm.AF64Ceil, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Floor", + argLen: 1, + asm: wasm.AF64Floor, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Nearest", + argLen: 1, + asm: wasm.AF64Nearest, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Abs", + argLen: 1, + asm: wasm.AF64Abs, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "F64Copysign", + argLen: 2, + asm: wasm.AF64Copysign, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + {1, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + outputs: []outputInfo{ + {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 + }, + }, + }, + { + name: "I64Ctz", + argLen: 1, + asm: wasm.AI64Ctz, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, + { + name: "I64Clz", + argLen: 1, + asm: wasm.AI64Clz, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, + { + name: "I64Rotl", + argLen: 2, + asm: wasm.AI64Rotl, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + {1, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, + { + name: "I64Popcnt", + argLen: 1, + asm: wasm.AI64Popcnt, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, { name: "Add8", diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index 8418e51f6a..c5fc8c815f 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -17,6 +17,8 @@ var _ = types.TypeMem // in case not otherwise used func rewriteValueWasm(v *Value) bool { switch v.Op { + case OpAbs: + return rewriteValueWasm_OpAbs_0(v) case OpAdd16: return rewriteValueWasm_OpAdd16_0(v) case OpAdd32: @@ -43,6 +45,10 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpAnd8_0(v) case OpAndB: return rewriteValueWasm_OpAndB_0(v) + case OpBitLen64: + return rewriteValueWasm_OpBitLen64_0(v) + case OpCeil: + return rewriteValueWasm_OpCeil_0(v) case OpClosureCall: return rewriteValueWasm_OpClosureCall_0(v) case OpCom16: @@ -71,6 +77,24 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpConstNil_0(v) case OpConvert: return rewriteValueWasm_OpConvert_0(v) + case OpCopysign: + return rewriteValueWasm_OpCopysign_0(v) + case OpCtz16: + return rewriteValueWasm_OpCtz16_0(v) + case OpCtz16NonZero: + return rewriteValueWasm_OpCtz16NonZero_0(v) + case OpCtz32: + return rewriteValueWasm_OpCtz32_0(v) + case OpCtz32NonZero: + return rewriteValueWasm_OpCtz32NonZero_0(v) + case OpCtz64: + return rewriteValueWasm_OpCtz64_0(v) + case OpCtz64NonZero: + return rewriteValueWasm_OpCtz64NonZero_0(v) + case OpCtz8: + return rewriteValueWasm_OpCtz8_0(v) + case OpCtz8NonZero: + return rewriteValueWasm_OpCtz8NonZero_0(v) case OpCvt32Fto32: return rewriteValueWasm_OpCvt32Fto32_0(v) case OpCvt32Fto32U: @@ -143,6 +167,8 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpEqB_0(v) case OpEqPtr: return rewriteValueWasm_OpEqPtr_0(v) + case OpFloor: + return rewriteValueWasm_OpFloor_0(v) case OpGeq16: return rewriteValueWasm_OpGeq16_0(v) case OpGeq16U: @@ -347,10 +373,22 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpOr8_0(v) case OpOrB: return rewriteValueWasm_OpOrB_0(v) + case OpPopCount16: + return rewriteValueWasm_OpPopCount16_0(v) + case OpPopCount32: + return rewriteValueWasm_OpPopCount32_0(v) + case OpPopCount64: + return rewriteValueWasm_OpPopCount64_0(v) + case OpPopCount8: + return rewriteValueWasm_OpPopCount8_0(v) + case OpRotateLeft64: + return rewriteValueWasm_OpRotateLeft64_0(v) case OpRound32F: return rewriteValueWasm_OpRound32F_0(v) case OpRound64F: return rewriteValueWasm_OpRound64F_0(v) + case OpRoundToEven: + return rewriteValueWasm_OpRoundToEven_0(v) case OpRsh16Ux16: return rewriteValueWasm_OpRsh16Ux16_0(v) case OpRsh16Ux32: @@ -429,6 +467,8 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpSignExt8to64_0(v) case OpSlicemask: return rewriteValueWasm_OpSlicemask_0(v) + case OpSqrt: + return rewriteValueWasm_OpSqrt_0(v) case OpStaticCall: return rewriteValueWasm_OpStaticCall_0(v) case OpStore: @@ -447,6 +487,8 @@ func rewriteValueWasm(v *Value) bool { return rewriteValueWasm_OpSub8_0(v) case OpSubPtr: return rewriteValueWasm_OpSubPtr_0(v) + case OpTrunc: + return rewriteValueWasm_OpTrunc_0(v) case OpTrunc16to8: return rewriteValueWasm_OpTrunc16to8_0(v) case OpTrunc32to16: @@ -536,6 +578,17 @@ func rewriteValueWasm(v *Value) bool { } return false } +func rewriteValueWasm_OpAbs_0(v *Value) bool { + // match: (Abs x) + // cond: + // result: (F64Abs x) + for { + x := v.Args[0] + v.reset(OpWasmF64Abs) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpAdd16_0(v *Value) bool { // match: (Add16 x y) // cond: @@ -705,6 +758,35 @@ func rewriteValueWasm_OpAndB_0(v *Value) bool { return true } } +func rewriteValueWasm_OpBitLen64_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (BitLen64 x) + // cond: + // result: (I64Sub (I64Const [64]) (I64Clz x)) + for { + x := v.Args[0] + v.reset(OpWasmI64Sub) + v0 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v0.AuxInt = 64 + v.AddArg(v0) + v1 := b.NewValue0(v.Pos, OpWasmI64Clz, typ.Int64) + v1.AddArg(x) + v.AddArg(v1) + return true + } +} +func rewriteValueWasm_OpCeil_0(v *Value) bool { + // match: (Ceil x) + // cond: + // result: (F64Ceil x) + for { + x := v.Args[0] + v.reset(OpWasmF64Ceil) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpClosureCall_0(v *Value) bool { // match: (ClosureCall [argwid] entry closure mem) // cond: @@ -888,6 +970,128 @@ func rewriteValueWasm_OpConvert_0(v *Value) bool { return true } } +func rewriteValueWasm_OpCopysign_0(v *Value) bool { + // match: (Copysign x y) + // cond: + // result: (F64Copysign x y) + for { + y := v.Args[1] + x := v.Args[0] + v.reset(OpWasmF64Copysign) + v.AddArg(x) + v.AddArg(y) + return true + } +} +func rewriteValueWasm_OpCtz16_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Ctz16 x) + // cond: + // result: (I64Ctz (I64Or x (I64Const [0x10000]))) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v0 := b.NewValue0(v.Pos, OpWasmI64Or, typ.Int64) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v1.AuxInt = 0x10000 + v0.AddArg(v1) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpCtz16NonZero_0(v *Value) bool { + // match: (Ctz16NonZero x) + // cond: + // result: (I64Ctz x) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v.AddArg(x) + return true + } +} +func rewriteValueWasm_OpCtz32_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Ctz32 x) + // cond: + // result: (I64Ctz (I64Or x (I64Const [0x100000000]))) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v0 := b.NewValue0(v.Pos, OpWasmI64Or, typ.Int64) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v1.AuxInt = 0x100000000 + v0.AddArg(v1) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpCtz32NonZero_0(v *Value) bool { + // match: (Ctz32NonZero x) + // cond: + // result: (I64Ctz x) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v.AddArg(x) + return true + } +} +func rewriteValueWasm_OpCtz64_0(v *Value) bool { + // match: (Ctz64 x) + // cond: + // result: (I64Ctz x) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v.AddArg(x) + return true + } +} +func rewriteValueWasm_OpCtz64NonZero_0(v *Value) bool { + // match: (Ctz64NonZero x) + // cond: + // result: (I64Ctz x) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v.AddArg(x) + return true + } +} +func rewriteValueWasm_OpCtz8_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Ctz8 x) + // cond: + // result: (I64Ctz (I64Or x (I64Const [0x100]))) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v0 := b.NewValue0(v.Pos, OpWasmI64Or, typ.Int64) + v0.AddArg(x) + v1 := b.NewValue0(v.Pos, OpWasmI64Const, typ.Int64) + v1.AuxInt = 0x100 + v0.AddArg(v1) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpCtz8NonZero_0(v *Value) bool { + // match: (Ctz8NonZero x) + // cond: + // result: (I64Ctz x) + for { + x := v.Args[0] + v.reset(OpWasmI64Ctz) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpCvt32Fto32_0(v *Value) bool { // match: (Cvt32Fto32 x) // cond: @@ -1409,6 +1613,17 @@ func rewriteValueWasm_OpEqPtr_0(v *Value) bool { return true } } +func rewriteValueWasm_OpFloor_0(v *Value) bool { + // match: (Floor x) + // cond: + // result: (F64Floor x) + for { + x := v.Args[0] + v.reset(OpWasmF64Floor) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpGeq16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types @@ -3492,6 +3707,75 @@ func rewriteValueWasm_OpOrB_0(v *Value) bool { return true } } +func rewriteValueWasm_OpPopCount16_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (PopCount16 x) + // cond: + // result: (I64Popcnt (ZeroExt16to64 x)) + for { + x := v.Args[0] + v.reset(OpWasmI64Popcnt) + v0 := b.NewValue0(v.Pos, OpZeroExt16to64, typ.UInt64) + v0.AddArg(x) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpPopCount32_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (PopCount32 x) + // cond: + // result: (I64Popcnt (ZeroExt32to64 x)) + for { + x := v.Args[0] + v.reset(OpWasmI64Popcnt) + v0 := b.NewValue0(v.Pos, OpZeroExt32to64, typ.UInt64) + v0.AddArg(x) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpPopCount64_0(v *Value) bool { + // match: (PopCount64 x) + // cond: + // result: (I64Popcnt x) + for { + x := v.Args[0] + v.reset(OpWasmI64Popcnt) + v.AddArg(x) + return true + } +} +func rewriteValueWasm_OpPopCount8_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (PopCount8 x) + // cond: + // result: (I64Popcnt (ZeroExt8to64 x)) + for { + x := v.Args[0] + v.reset(OpWasmI64Popcnt) + v0 := b.NewValue0(v.Pos, OpZeroExt8to64, typ.UInt64) + v0.AddArg(x) + v.AddArg(v0) + return true + } +} +func rewriteValueWasm_OpRotateLeft64_0(v *Value) bool { + // match: (RotateLeft64 x y) + // cond: + // result: (I64Rotl x y) + for { + y := v.Args[1] + x := v.Args[0] + v.reset(OpWasmI64Rotl) + v.AddArg(x) + v.AddArg(y) + return true + } +} func rewriteValueWasm_OpRound32F_0(v *Value) bool { // match: (Round32F x) // cond: @@ -3515,6 +3799,17 @@ func rewriteValueWasm_OpRound64F_0(v *Value) bool { return true } } +func rewriteValueWasm_OpRoundToEven_0(v *Value) bool { + // match: (RoundToEven x) + // cond: + // result: (F64Nearest x) + for { + x := v.Args[0] + v.reset(OpWasmF64Nearest) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpRsh16Ux16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types @@ -4344,6 +4639,17 @@ func rewriteValueWasm_OpSlicemask_0(v *Value) bool { return true } } +func rewriteValueWasm_OpSqrt_0(v *Value) bool { + // match: (Sqrt x) + // cond: + // result: (F64Sqrt x) + for { + x := v.Args[0] + v.reset(OpWasmF64Sqrt) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpStaticCall_0(v *Value) bool { // match: (StaticCall [argwid] {target} mem) // cond: @@ -4555,6 +4861,17 @@ func rewriteValueWasm_OpSubPtr_0(v *Value) bool { return true } } +func rewriteValueWasm_OpTrunc_0(v *Value) bool { + // match: (Trunc x) + // cond: + // result: (F64Trunc x) + for { + x := v.Args[0] + v.reset(OpWasmF64Trunc) + v.AddArg(x) + return true + } +} func rewriteValueWasm_OpTrunc16to8_0(v *Value) bool { // match: (Trunc16to8 x) // cond: diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 604c88247f..d2ac2df613 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -291,7 +291,7 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { s.Prog(v.Op.Asm()) s.Prog(wasm.AI64ExtendI32U) - case ssa.OpWasmI64Add, ssa.OpWasmI64Sub, ssa.OpWasmI64Mul, ssa.OpWasmI64DivU, ssa.OpWasmI64RemS, ssa.OpWasmI64RemU, ssa.OpWasmI64And, ssa.OpWasmI64Or, ssa.OpWasmI64Xor, ssa.OpWasmI64Shl, ssa.OpWasmI64ShrS, ssa.OpWasmI64ShrU, ssa.OpWasmF64Add, ssa.OpWasmF64Sub, ssa.OpWasmF64Mul, ssa.OpWasmF64Div: + case ssa.OpWasmI64Add, ssa.OpWasmI64Sub, ssa.OpWasmI64Mul, ssa.OpWasmI64DivU, ssa.OpWasmI64RemS, ssa.OpWasmI64RemU, ssa.OpWasmI64And, ssa.OpWasmI64Or, ssa.OpWasmI64Xor, ssa.OpWasmI64Shl, ssa.OpWasmI64ShrS, ssa.OpWasmI64ShrU, ssa.OpWasmF64Add, ssa.OpWasmF64Sub, ssa.OpWasmF64Mul, ssa.OpWasmF64Div, ssa.OpWasmF64Copysign, ssa.OpWasmI64Rotl: getValue64(s, v.Args[0]) getValue64(s, v.Args[1]) s.Prog(v.Op.Asm()) @@ -317,7 +317,7 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { p := s.Prog(wasm.ACall) p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncU} - case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U: + case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U, ssa.OpWasmF64Sqrt, ssa.OpWasmF64Trunc, ssa.OpWasmF64Ceil, ssa.OpWasmF64Floor, ssa.OpWasmF64Nearest, ssa.OpWasmF64Abs, ssa.OpWasmI64Ctz, ssa.OpWasmI64Clz, ssa.OpWasmI64Popcnt: getValue64(s, v.Args[0]) s.Prog(v.Op.Asm()) diff --git a/test/codegen/math.go b/test/codegen/math.go index aaf6b080ff..597271ce72 100644 --- a/test/codegen/math.go +++ b/test/codegen/math.go @@ -15,12 +15,14 @@ func approx(x float64) { // arm64:"FRINTPD" // ppc64:"FRIP" // ppc64le:"FRIP" + // wasm:"F64Ceil" sink64[0] = math.Ceil(x) // s390x:"FIDBR\t[$]7" // arm64:"FRINTMD" // ppc64:"FRIM" // ppc64le:"FRIM" + // wasm:"F64Floor" sink64[1] = math.Floor(x) // s390x:"FIDBR\t[$]1" @@ -33,10 +35,12 @@ func approx(x float64) { // arm64:"FRINTZD" // ppc64:"FRIZ" // ppc64le:"FRIZ" + // wasm:"F64Trunc" sink64[3] = math.Trunc(x) // s390x:"FIDBR\t[$]4" // arm64:"FRINTND" + // wasm:"F64Nearest" sink64[4] = math.RoundToEven(x) } @@ -47,6 +51,7 @@ func sqrt(x float64) float64 { // arm/7:"SQRTD" // mips/hardfloat:"SQRTD" mips/softfloat:-"SQRTD" // mips64/hardfloat:"SQRTD" mips64/softfloat:-"SQRTD" + // wasm:"F64Sqrt" return math.Sqrt(x) } @@ -57,6 +62,7 @@ func abs(x, y float64) { // s390x:"LPDFR\t",-"MOVD\t" (no integer load/store) // ppc64:"FABS\t" // ppc64le:"FABS\t" + // wasm:"F64Abs" sink64[0] = math.Abs(x) // amd64:"BTRQ\t[$]63","PXOR" (TODO: this should be BTSQ) @@ -78,6 +84,7 @@ func copysign(a, b, c float64) { // s390x:"CPSDR",-"MOVD" (no integer load/store) // ppc64:"FCPSGN" // ppc64le:"FCPSGN" + // wasm:"F64Copysign" sink64[0] = math.Copysign(a, b) // amd64:"BTSQ\t[$]63" diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index c77b66c3f7..9a4051a0ce 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -17,6 +17,7 @@ func LeadingZeros(n uint) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.LeadingZeros(n) } @@ -25,6 +26,7 @@ func LeadingZeros64(n uint64) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.LeadingZeros64(n) } @@ -33,6 +35,7 @@ func LeadingZeros32(n uint32) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZW" // mips:"CLZ" + // wasm:"I64Clz" return bits.LeadingZeros32(n) } @@ -41,6 +44,7 @@ func LeadingZeros16(n uint16) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.LeadingZeros16(n) } @@ -49,6 +53,7 @@ func LeadingZeros8(n uint8) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.LeadingZeros8(n) } @@ -61,6 +66,7 @@ func Len(n uint) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.Len(n) } @@ -69,6 +75,7 @@ func Len64(n uint64) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.Len64(n) } @@ -77,6 +84,7 @@ func Len32(n uint32) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.Len32(n) } @@ -85,6 +93,7 @@ func Len16(n uint16) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.Len16(n) } @@ -93,6 +102,7 @@ func Len8(n uint8) int { // s390x:"FLOGR" // arm:"CLZ" arm64:"CLZ" // mips:"CLZ" + // wasm:"I64Clz" return bits.Len8(n) } @@ -106,6 +116,7 @@ func OnesCount(n uint) int { // s390x:"POPCNT" // ppc64:"POPCNTD" // ppc64le:"POPCNTD" + // wasm:"I64Popcnt" return bits.OnesCount(n) } @@ -115,6 +126,7 @@ func OnesCount64(n uint64) int { // s390x:"POPCNT" // ppc64:"POPCNTD" // ppc64le:"POPCNTD" + // wasm:"I64Popcnt" return bits.OnesCount64(n) } @@ -124,6 +136,7 @@ func OnesCount32(n uint32) int { // s390x:"POPCNT" // ppc64:"POPCNTW" // ppc64le:"POPCNTW" + // wasm:"I64Popcnt" return bits.OnesCount32(n) } @@ -133,6 +146,7 @@ func OnesCount16(n uint16) int { // s390x:"POPCNT" // ppc64:"POPCNTW" // ppc64le:"POPCNTW" + // wasm:"I64Popcnt" return bits.OnesCount16(n) } @@ -140,6 +154,7 @@ func OnesCount8(n uint8) int { // s390x:"POPCNT" // ppc64:"POPCNTB" // ppc64le:"POPCNTB" + // wasm:"I64Popcnt" return bits.OnesCount8(n) } @@ -187,6 +202,7 @@ func RotateLeft64(n uint64) uint64 { // ppc64:"ROTL" // ppc64le:"ROTL" // s390x:"RLLG" + // wasm:"I64Rotl" return bits.RotateLeft64(n, 37) } @@ -246,6 +262,7 @@ func TrailingZeros(n uint) int { // s390x:"FLOGR" // ppc64:"ANDN","POPCNTD" // ppc64le:"ANDN","POPCNTD" + // wasm:"I64Ctz" return bits.TrailingZeros(n) } @@ -255,6 +272,7 @@ func TrailingZeros64(n uint64) int { // s390x:"FLOGR" // ppc64:"ANDN","POPCNTD" // ppc64le:"ANDN","POPCNTD" + // wasm:"I64Ctz" return bits.TrailingZeros64(n) } @@ -264,6 +282,7 @@ func TrailingZeros32(n uint32) int { // s390x:"FLOGR","MOVWZ" // ppc64:"ANDN","POPCNTW" // ppc64le:"ANDN","POPCNTW" + // wasm:"I64Ctz" return bits.TrailingZeros32(n) } @@ -273,6 +292,7 @@ func TrailingZeros16(n uint16) int { // s390x:"FLOGR","OR\t\\$65536" // ppc64:"POPCNTD","OR\\t\\$65536" // ppc64le:"POPCNTD","OR\\t\\$65536" + // wasm:"I64Ctz" return bits.TrailingZeros16(n) } @@ -280,6 +300,7 @@ func TrailingZeros8(n uint8) int { // amd64:"BSFL","BTSL\\t\\$8" // arm64:"ORR\t\\$256","RBITW","CLZW",-"MOVBU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$256" + // wasm:"I64Ctz" return bits.TrailingZeros8(n) } diff --git a/test/run.go b/test/run.go index 7a764d5f8d..97d54902a7 100644 --- a/test/run.go +++ b/test/run.go @@ -1385,6 +1385,7 @@ var ( "ppc64": {"GOPPC64", "power8", "power9"}, "ppc64le": {"GOPPC64", "power8", "power9"}, "s390x": {}, + "wasm": {}, } ) @@ -1463,6 +1464,9 @@ func (t *test) wantedAsmOpcodes(fn string) asmChecks { os, arch, subarch = "linux", archspec[0], archspec[1][1:] default: // 1 component: "386" os, arch, subarch = "linux", archspec[0], "" + if arch == "wasm" { + os = "js" + } } if _, ok := archVariants[arch]; !ok { -- GitLab From 032acb3a1fdaff2899273c49e1b89ef3d56d80b7 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Thu, 14 Mar 2019 16:44:38 -0400 Subject: [PATCH 0468/1679] doc: add minor revisions header for 1.12 Change-Id: I0d4a55af0bee754ab1ee817780027e9f72475afb Reviewed-on: https://go-review.googlesource.com/c/go/+/167711 Reviewed-by: Katie Hockman Reviewed-by: Katie Hockman --- doc/devel/release.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 7a036db9a8..c7dde6ff4d 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -30,6 +30,8 @@ Go 1.12 is a major release of Go. Read the Go 1.12 Release Notes for more information.

    +

    Minor revisions

    +

    go1.12.1 (released 2019/03/14) includes fixes to cgo, the compiler, the go command, and the fmt, net/smtp, os, -- GitLab From c0cfe9687f4f1b862328c85b3a160bc86d200d32 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 12 Dec 2018 11:15:37 -0800 Subject: [PATCH 0469/1679] cmd/compile: rewrite f(g()) for multi-value g() during typecheck This is a re-attempt at CL 153841, which caused two regressions: 1. crypto/ecdsa failed to build with -gcflags=-l=4. This was because when "t1, t2, ... := g(); f(t1, t2, ...)" was exported, we were losing the first assignment from the call's Ninit field. 2. net/http/pprof failed to run with -gcflags=-N. This is due to a conflict with CL 159717: as of that CL, package-scope initialization statements are executed within the "init.ializer" function, rather than the "init" function, and the generated temp variables need to be moved accordingly too. [Rest of description is as before.] This CL moves order.go's copyRet logic for rewriting f(g()) into t1, t2, ... := g(); f(t1, t2, ...) earlier into typecheck. This allows the rest of the compiler to stop worrying about multi-value functions appearing outside of OAS2FUNC nodes. This changes compiler behavior in a few observable ways: 1. Typechecking error messages for builtin functions now use general case error messages rather than unnecessarily differing ones. 2. Because f(g()) is rewritten before inlining, saved inline bodies now see the rewritten form too. This could be addressed, but doesn't seem worthwhile. 3. Most notably, this simplifies escape analysis and fixes a memory corruption issue in esc.go. See #29197 for details. Fixes #15992. Fixes #29197. Change-Id: I930b10f7e27af68a0944d6c9bfc8707c3fab27a4 Reviewed-on: https://go-review.googlesource.com/c/go/+/166983 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/esc.go | 7 - src/cmd/compile/internal/gc/fmt.go | 13 +- src/cmd/compile/internal/gc/iexport.go | 4 +- src/cmd/compile/internal/gc/iimport.go | 4 +- src/cmd/compile/internal/gc/init.go | 15 ++ src/cmd/compile/internal/gc/inl.go | 18 +- src/cmd/compile/internal/gc/order.go | 60 +----- src/cmd/compile/internal/gc/typecheck.go | 258 ++++++++--------------- test/cmplx.go | 6 +- test/copy1.go | 2 +- test/fixedbugs/issue15992.go | 38 ++++ test/fixedbugs/issue15992.out | 4 + test/fixedbugs/issue17038.go | 2 +- test/fixedbugs/issue9521.go | 4 +- 14 files changed, 167 insertions(+), 268 deletions(-) create mode 100644 test/fixedbugs/issue15992.go create mode 100644 test/fixedbugs/issue15992.out diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index bd0fb82554..c533439cc8 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -1604,13 +1604,6 @@ func (e *EscState) esccall(call *Node, parent *Node) { } argList := call.List - if argList.Len() == 1 { - arg := argList.First() - if arg.Type.IsFuncArgStruct() { // f(g()) - argList = e.nodeEscState(arg).Retval - } - } - args := argList.Slice() if indirect { diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index fc1af603a2..12f341b660 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1404,14 +1404,11 @@ func (n *Node) exprfmt(s fmt.State, prec int, mode fmtMode) { } mode.Fprintf(s, "sliceheader{%v,%v,%v}", n.Left, n.List.First(), n.List.Second()) - case OCOPY: - mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) - - case OCOMPLEX: - if n.List.Len() == 1 { - mode.Fprintf(s, "%#v(%v)", n.Op, n.List.First()) - } else { + case OCOMPLEX, OCOPY: + if n.Left != nil { mode.Fprintf(s, "%#v(%v, %v)", n.Op, n.Left, n.Right) + } else { + mode.Fprintf(s, "%#v(%.v)", n.Op, n.List) } case OCONV, @@ -1540,6 +1537,8 @@ func (n *Node) nodefmt(s fmt.State, flag FmtFlag, mode fmtMode) { if flag&FmtLong != 0 && t != nil { if t.Etype == TNIL { fmt.Fprint(s, "nil") + } else if n.Op == ONAME && n.Name.AutoTemp() { + mode.Fprintf(s, "%v value", t) } else { mode.Fprintf(s, "%v (type %v)", n, t) } diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index 2a34e2ea77..d50d3e9400 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -1277,6 +1277,7 @@ func (w *exportWriter) expr(n *Node) { case OCALL, OCALLFUNC, OCALLMETH, OCALLINTER, OGETG: w.op(OCALL) w.pos(n.Pos) + w.stmtList(n.Ninit) w.expr(n.Left) w.exprList(n.List) w.bool(n.IsDDD()) @@ -1387,7 +1388,8 @@ func (w *exportWriter) localIdent(s *types.Sym, v int32) { return } - if i := strings.LastIndex(name, "."); i >= 0 { + // TODO(mdempsky): Fix autotmp hack. + if i := strings.LastIndex(name, "."); i >= 0 && !strings.HasPrefix(name, ".autotmp_") { Fatalf("unexpected dot in identifier: %v", name) } diff --git a/src/cmd/compile/internal/gc/iimport.go b/src/cmd/compile/internal/gc/iimport.go index addf829b04..51b57ce0a8 100644 --- a/src/cmd/compile/internal/gc/iimport.go +++ b/src/cmd/compile/internal/gc/iimport.go @@ -907,7 +907,9 @@ func (r *importReader) node() *Node { // unreachable - mapped to OCALL case below by exporter case OCALL: - n := nodl(r.pos(), OCALL, r.expr(), nil) + n := nodl(r.pos(), OCALL, nil, nil) + n.Ninit.Set(r.stmtList()) + n.Left = r.expr() n.List.Set(r.exprList()) n.SetIsDDD(r.bool()) return n diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index e981f83653..6fd2c3427f 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -14,6 +14,9 @@ import ( // the name, normally "pkg.init", is altered to "pkg.init.0". var renameinitgen int +// Dummy function for autotmps generated during typechecking. +var dummyInitFn = nod(ODCLFUNC, nil, nil) + func renameinit() *types.Sym { s := lookupN("init.", renameinitgen) renameinitgen++ @@ -93,6 +96,12 @@ func fninit(n []*Node) { initializers = lookup("init.ializers") disableExport(initializers) fn := dclfunc(initializers, nod(OTFUNC, nil, nil)) + for _, dcl := range dummyInitFn.Func.Dcl { + dcl.Name.Curfn = fn + } + fn.Func.Dcl = append(fn.Func.Dcl, dummyInitFn.Func.Dcl...) + dummyInitFn.Func.Dcl = nil + fn.Nbody.Set(nf) funcbody() @@ -103,6 +112,12 @@ func fninit(n []*Node) { funccompile(fn) lineno = autogeneratedPos } + if dummyInitFn.Func.Dcl != nil { + // We only generate temps using dummyInitFn if there + // are package-scope initialization statements, so + // something's weird if we get here. + Fatalf("dummyInitFn still has declarations") + } var r []*Node diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 81cad31a13..88c294173b 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -589,24 +589,13 @@ func inlnode(n *Node, maxCost int32) *Node { } inlnodelist(n.List, maxCost) - switch n.Op { - case OBLOCK: + if n.Op == OBLOCK { for _, n2 := range n.List.Slice() { if n2.Op == OINLCALL { inlconv2stmt(n2) } } - - case ORETURN, OCALLFUNC, OCALLMETH, OCALLINTER, OAPPEND, OCOMPLEX: - // if we just replaced arg in f(arg()) or return arg with an inlined call - // and arg returns multiple values, glue as list - if n.List.Len() == 1 && n.List.First().Op == OINLCALL && n.List.First().Rlist.Len() > 1 { - n.List.Set(inlconv2list(n.List.First())) - break - } - fallthrough - - default: + } else { s := n.List.Slice() for i1, n1 := range s { if n1 != nil && n1.Op == OINLCALL { @@ -1016,9 +1005,6 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node { // to pass as a slice. numvals := n.List.Len() - if numvals == 1 && n.List.First().Type.IsFuncArgStruct() { - numvals = n.List.First().Type.NumFields() - } x := as.List.Len() for as.List.Len() < numvals { diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 0098242c79..7b86537a21 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -380,66 +380,12 @@ func (o *Order) init(n *Node) { n.Ninit.Set(nil) } -// Ismulticall reports whether the list l is f() for a multi-value function. -// Such an f() could appear as the lone argument to a multi-arg function. -func ismulticall(l Nodes) bool { - // one arg only - if l.Len() != 1 { - return false - } - n := l.First() - - // must be call - switch n.Op { - default: - return false - case OCALLFUNC, OCALLMETH, OCALLINTER: - // call must return multiple values - return n.Left.Type.NumResults() > 1 - } -} - -// copyRet emits t1, t2, ... = n, where n is a function call, -// and then returns the list t1, t2, .... -func (o *Order) copyRet(n *Node) []*Node { - if !n.Type.IsFuncArgStruct() { - Fatalf("copyret %v %d", n.Type, n.Left.Type.NumResults()) - } - - slice := n.Type.Fields().Slice() - l1 := make([]*Node, len(slice)) - l2 := make([]*Node, len(slice)) - for i, t := range slice { - tmp := temp(t.Type) - l1[i] = tmp - l2[i] = tmp - } - - as := nod(OAS2, nil, nil) - as.List.Set(l1) - as.Rlist.Set1(n) - as = typecheck(as, ctxStmt) - o.stmt(as) - - return l2 -} - -// callArgs orders the list of call arguments *l. -func (o *Order) callArgs(l *Nodes) { - if ismulticall(*l) { - // return f() where f() is multiple values. - l.Set(o.copyRet(l.First())) - } else { - o.exprList(*l) - } -} - // call orders the call expression n. // n.Op is OCALLMETH/OCALLFUNC/OCALLINTER or a builtin like OCOPY. func (o *Order) call(n *Node) { n.Left = o.expr(n.Left, nil) n.Right = o.expr(n.Right, nil) // ODDDARG temp - o.callArgs(&n.List) + o.exprList(n.List) if n.Op != OCALLFUNC { return @@ -811,7 +757,7 @@ func (o *Order) stmt(n *Node) { o.cleanTemp(t) case ORETURN: - o.callArgs(&n.List) + o.exprList(n.List) o.out = append(o.out, n) // Special: clean case temporaries in each block entry. @@ -1200,7 +1146,7 @@ func (o *Order) expr(n, lhs *Node) *Node { n.List.SetFirst(o.expr(n.List.First(), nil)) // order x n.List.Second().Left = o.expr(n.List.Second().Left, nil) // order y } else { - o.callArgs(&n.List) + o.exprList(n.List) } if lhs == nil || lhs.Op != ONAME && !samesafeexpr(lhs, n.List.First()) { diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 0efcaac200..2468f52b74 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1285,11 +1285,7 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - if n.List.Len() == 1 && !n.IsDDD() { - n.List.SetFirst(typecheck(n.List.First(), ctxExpr|ctxMultiOK)) - } else { - typecheckslice(n.List.Slice(), ctxExpr) - } + typecheckargs(n) t := l.Type if t == nil { n.Type = nil @@ -1433,51 +1429,24 @@ func typecheck1(n *Node, top int) (res *Node) { case OCOMPLEX: ok |= ctxExpr - var r *Node - var l *Node - if n.List.Len() == 1 { - typecheckslice(n.List.Slice(), ctxMultiOK) - if n.List.First().Op != OCALLFUNC && n.List.First().Op != OCALLMETH { - yyerror("invalid operation: complex expects two arguments") - n.Type = nil - return n - } - - t := n.List.First().Left.Type - if !t.IsKind(TFUNC) { - // Bail. This error will be reported elsewhere. - return n - } - if t.NumResults() != 2 { - yyerror("invalid operation: complex expects two arguments, %v returns %d results", n.List.First(), t.NumResults()) - n.Type = nil - return n - } - - t = n.List.First().Type - l = asNode(t.Field(0).Nname) - r = asNode(t.Field(1).Nname) - } else { - if !twoarg(n) { - n.Type = nil - return n - } - n.Left = typecheck(n.Left, ctxExpr) - n.Right = typecheck(n.Right, ctxExpr) - l = n.Left - r = n.Right - if l.Type == nil || r.Type == nil { - n.Type = nil - return n - } - l, r = defaultlit2(l, r, false) - if l.Type == nil || r.Type == nil { - n.Type = nil - return n - } - n.Left = l - n.Right = r + typecheckargs(n) + if !twoarg(n) { + n.Type = nil + return n + } + l := n.Left + r := n.Right + if l.Type == nil || r.Type == nil { + n.Type = nil + return n } + l, r = defaultlit2(l, r, false) + if l.Type == nil || r.Type == nil { + n.Type = nil + return n + } + n.Left = l + n.Right = r if !types.Identical(l.Type, r.Type) { yyerror("invalid operation: %v (mismatched types %v and %v)", n, l.Type, r.Type) @@ -1531,6 +1500,8 @@ func typecheck1(n *Node, top int) (res *Node) { ok |= ctxStmt case ODELETE: + ok |= ctxStmt + typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to delete") @@ -1550,8 +1521,6 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - ok |= ctxStmt - typecheckslice(args.Slice(), ctxExpr) l := args.First() r := args.Second() if l.Type != nil && !l.Type.IsMap() { @@ -1564,6 +1533,7 @@ func typecheck1(n *Node, top int) (res *Node) { case OAPPEND: ok |= ctxExpr + typecheckargs(n) args := n.List if args.Len() == 0 { yyerror("missing arguments to append") @@ -1571,25 +1541,12 @@ func typecheck1(n *Node, top int) (res *Node) { return n } - if args.Len() == 1 && !n.IsDDD() { - args.SetFirst(typecheck(args.First(), ctxExpr|ctxMultiOK)) - } else { - typecheckslice(args.Slice(), ctxExpr) - } - t := args.First().Type if t == nil { n.Type = nil return n } - // Unpack multiple-return result before type-checking. - var funarg *types.Type - if t.IsFuncArgStruct() { - funarg = t - t = t.Field(0).Type - } - n.Type = t if !t.IsSlice() { if Isconst(args.First(), CTNIL) { @@ -1625,44 +1582,23 @@ func typecheck1(n *Node, top int) (res *Node) { break } - if funarg != nil { - for _, t := range funarg.FieldSlice()[1:] { - if assignop(t.Type, n.Type.Elem(), nil) == 0 { - yyerror("cannot append %v value to []%v", t.Type, n.Type.Elem()) - } - } - } else { - as := args.Slice()[1:] - for i, n := range as { - if n.Type == nil { - continue - } - as[i] = assignconv(n, t.Elem(), "append") - checkwidth(as[i].Type) // ensure width is calculated for backend + as := args.Slice()[1:] + for i, n := range as { + if n.Type == nil { + continue } + as[i] = assignconv(n, t.Elem(), "append") + checkwidth(as[i].Type) // ensure width is calculated for backend } case OCOPY: ok |= ctxStmt | ctxExpr - args := n.List - if args.Len() < 2 { - yyerror("missing arguments to copy") + typecheckargs(n) + if !twoarg(n) { n.Type = nil return n } - - if args.Len() > 2 { - yyerror("too many arguments to copy") - n.Type = nil - return n - } - - n.Left = args.First() - n.Right = args.Second() - n.List.Set(nil) n.Type = types.Types[TINT] - n.Left = typecheck(n.Left, ctxExpr) - n.Right = typecheck(n.Right, ctxExpr) if n.Left.Type == nil || n.Right.Type == nil { n.Type = nil return n @@ -2055,11 +1991,7 @@ func typecheck1(n *Node, top int) (res *Node) { case ORETURN: ok |= ctxStmt - if n.List.Len() == 1 { - typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) - } else { - typecheckslice(n.List.Slice(), ctxExpr) - } + typecheckargs(n) if Curfn == nil { yyerror("return outside function") n.Type = nil @@ -2163,6 +2095,51 @@ func typecheck1(n *Node, top int) (res *Node) { return n } +func typecheckargs(n *Node) { + if n.List.Len() != 1 || n.IsDDD() { + typecheckslice(n.List.Slice(), ctxExpr) + return + } + + typecheckslice(n.List.Slice(), ctxExpr|ctxMultiOK) + t := n.List.First().Type + if t == nil || !t.IsFuncArgStruct() { + return + } + + // Rewrite f(g()) into t1, t2, ... = g(); f(t1, t2, ...). + + // Save n as n.Orig for fmt.go. + if n.Orig == n { + n.Orig = n.sepcopy() + } + + as := nod(OAS2, nil, nil) + as.Rlist.AppendNodes(&n.List) + + // If we're outside of function context, then this call will + // be executed during the generated init function. However, + // init.go hasn't yet created it. Instead, associate the + // temporary variables with dummyInitFn for now, and init.go + // will reassociate them later when it's appropriate. + static := Curfn == nil + if static { + Curfn = dummyInitFn + } + for _, f := range t.FieldSlice() { + t := temp(f.Type) + as.Ninit.Append(nod(ODCL, t, nil)) + as.List.Append(t) + n.List.Append(t) + } + if static { + Curfn = nil + } + + as = typecheck(as, ctxStmt) + n.Ninit.Append(as) +} + func checksliceindex(l *Node, r *Node, tp *types.Type) bool { t := r.Type if t == nil { @@ -2302,24 +2279,15 @@ func twoarg(n *Node) bool { if n.Left != nil { return true } - if n.List.Len() == 0 { - yyerror("missing argument to %v - %v", n.Op, n) + if n.List.Len() != 2 { + if n.List.Len() < 2 { + yyerror("not enough arguments in call to %v", n) + } else { + yyerror("too many arguments in call to %v", n) + } return false } - n.Left = n.List.First() - if n.List.Len() == 1 { - yyerror("missing argument to %v - %v", n.Op, n) - n.List.Set(nil) - return false - } - - if n.List.Len() > 2 { - yyerror("too many arguments to %v - %v", n.Op, n) - n.List.Set(nil) - return false - } - n.Right = n.List.Second() n.List.Set(nil) return true @@ -2579,8 +2547,6 @@ func hasddd(t *types.Type) bool { // typecheck assignment: type list = expression list func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, desc func() string) { var t *types.Type - var n1 int - var n2 int var i int lno := lineno @@ -2593,57 +2559,10 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, var n *Node if nl.Len() == 1 { n = nl.First() - if n.Type != nil && n.Type.IsFuncArgStruct() { - if !hasddd(tstruct) { - n1 := tstruct.NumFields() - n2 := n.Type.NumFields() - if n2 > n1 { - goto toomany - } - if n2 < n1 { - goto notenough - } - } - - lfs := tstruct.FieldSlice() - rfs := n.Type.FieldSlice() - var why string - for i, tl := range lfs { - if tl.IsDDD() { - for _, tn := range rfs[i:] { - if assignop(tn.Type, tl.Type.Elem(), &why) == 0 { - if call != nil { - yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type.Elem(), call, why) - } else { - yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type.Elem(), desc(), why) - } - } - } - return - } - - if i >= len(rfs) { - goto notenough - } - tn := rfs[i] - if assignop(tn.Type, tl.Type, &why) == 0 { - if call != nil { - yyerror("cannot use %v as type %v in argument to %v%s", tn.Type, tl.Type, call, why) - } else { - yyerror("cannot use %v as type %v in %s%s", tn.Type, tl.Type, desc(), why) - } - } - } - - if len(rfs) > len(lfs) { - goto toomany - } - return - } } - n1 = tstruct.NumFields() - n2 = nl.Len() + n1 := tstruct.NumFields() + n2 := nl.Len() if !hasddd(tstruct) { if n2 > n1 { goto toomany @@ -2685,6 +2604,7 @@ func typecheckaste(op Op, call *Node, isddd bool, tstruct *types.Type, nl Nodes, return } + // TODO(mdempsky): Make into ... call with implicit slice. for ; i < nl.Len(); i++ { n = nl.Index(i) setlineno(n) @@ -2792,14 +2712,8 @@ func (nl Nodes) retsigerr(isddd bool) string { } var typeStrings []string - if nl.Len() == 1 && nl.First().Type != nil && nl.First().Type.IsFuncArgStruct() { - for _, f := range nl.First().Type.Fields().Slice() { - typeStrings = append(typeStrings, sigrepr(f.Type)) - } - } else { - for _, n := range nl.Slice() { - typeStrings = append(typeStrings, sigrepr(n.Type)) - } + for _, n := range nl.Slice() { + typeStrings = append(typeStrings, sigrepr(n.Type)) } ddd := "" diff --git a/test/cmplx.go b/test/cmplx.go index dedf2bd8d3..d63c7ebc7e 100644 --- a/test/cmplx.go +++ b/test/cmplx.go @@ -49,10 +49,10 @@ func main() { _ = complex(f64, F64) // ERROR "complex" _ = complex(F64, f64) // ERROR "complex" - _ = complex(F1()) // ERROR "expects two arguments.*returns 1" - _ = complex(F3()) // ERROR "expects two arguments.*returns 3" + _ = complex(F1()) // ERROR "not enough arguments" + _ = complex(F3()) // ERROR "too many arguments" - _ = complex() // ERROR "missing argument" + _ = complex() // ERROR "not enough arguments" c128 = complex(f32, f32) // ERROR "cannot use" c64 = complex(f64, f64) // ERROR "cannot use" diff --git a/test/copy1.go b/test/copy1.go index 14285498f8..e1fa105584 100644 --- a/test/copy1.go +++ b/test/copy1.go @@ -14,7 +14,7 @@ func main() { si := make([]int, 8) sf := make([]float64, 8) - _ = copy() // ERROR "missing arguments" + _ = copy() // ERROR "not enough arguments" _ = copy(1, 2, 3) // ERROR "too many arguments" _ = copy(si, "hi") // ERROR "have different element types.*int.*string" diff --git a/test/fixedbugs/issue15992.go b/test/fixedbugs/issue15992.go new file mode 100644 index 0000000000..957bb89fac --- /dev/null +++ b/test/fixedbugs/issue15992.go @@ -0,0 +1,38 @@ +// run + +// Copyright 2018 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 main + +import ( + "fmt" +) + +func f(a []byte) ([]byte, []byte) { + return a, []byte("abc") +} + +func g(a []byte) ([]byte, string) { + return a, "abc" +} + +func h(m map[int]int) (map[int]int, int) { + return m, 0 +} + +func main() { + a := []byte{1, 2, 3} + n := copy(f(a)) + fmt.Println(n, a) + + b := []byte{1, 2, 3} + n = copy(f(b)) + fmt.Println(n, b) + + m := map[int]int{0: 0} + fmt.Println(len(m)) + delete(h(m)) + fmt.Println(len(m)) +} diff --git a/test/fixedbugs/issue15992.out b/test/fixedbugs/issue15992.out new file mode 100644 index 0000000000..e0011e3edb --- /dev/null +++ b/test/fixedbugs/issue15992.out @@ -0,0 +1,4 @@ +3 [97 98 99] +3 [97 98 99] +1 +0 diff --git a/test/fixedbugs/issue17038.go b/test/fixedbugs/issue17038.go index 1b65ffc1f0..4d7422c60c 100644 --- a/test/fixedbugs/issue17038.go +++ b/test/fixedbugs/issue17038.go @@ -6,4 +6,4 @@ package main -const A = complex(0()) // ERROR "cannot call non-function" +const A = complex(0()) // ERROR "cannot call non-function" "not enough arguments" diff --git a/test/fixedbugs/issue9521.go b/test/fixedbugs/issue9521.go index ef0a5a6547..4e4a55f1e1 100644 --- a/test/fixedbugs/issue9521.go +++ b/test/fixedbugs/issue9521.go @@ -13,6 +13,6 @@ func f() (_, _ []int) { return } func g() (x []int, y float64) { return } func main() { - _ = append(f()) // ERROR "cannot append \[\]int value to \[\]int" - _ = append(g()) // ERROR "cannot append float64 value to \[\]int" + _ = append(f()) // ERROR "cannot use \[\]int value as type int in append" + _ = append(g()) // ERROR "cannot use float64 value as type int in append" } -- GitLab From 829c140f149dba8933dea0cead3a78de4c83b529 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Thu, 14 Mar 2019 13:54:05 -0700 Subject: [PATCH 0470/1679] cmd/compile: move Strongly Connected Components code into new file This logic is used by the current escape analysis pass, but otherwise logically independent. Move (unchanged) into a separate file to make that clearer, and to make it easier to replace esc.go later. Updates #23109. Change-Id: Iec8c0c47ea04c0008165791731c11d9104d5a474 Reviewed-on: https://go-review.googlesource.com/c/go/+/167715 Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/esc.go | 138 --------------------------- src/cmd/compile/internal/gc/scc.go | 145 +++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 138 deletions(-) create mode 100644 src/cmd/compile/internal/gc/scc.go diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index c533439cc8..42ced85ca2 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -11,144 +11,6 @@ import ( "strings" ) -// Run analysis on minimal sets of mutually recursive functions -// or single non-recursive functions, bottom up. -// -// Finding these sets is finding strongly connected components -// by reverse topological order in the static call graph. -// The algorithm (known as Tarjan's algorithm) for doing that is taken from -// Sedgewick, Algorithms, Second Edition, p. 482, with two adaptations. -// -// First, a hidden closure function (n.Func.IsHiddenClosure()) cannot be the -// root of a connected component. Refusing to use it as a root -// forces it into the component of the function in which it appears. -// This is more convenient for escape analysis. -// -// Second, each function becomes two virtual nodes in the graph, -// with numbers n and n+1. We record the function's node number as n -// but search from node n+1. If the search tells us that the component -// number (min) is n+1, we know that this is a trivial component: one function -// plus its closures. If the search tells us that the component number is -// n, then there was a path from node n+1 back to node n, meaning that -// the function set is mutually recursive. The escape analysis can be -// more precise when analyzing a single non-recursive function than -// when analyzing a set of mutually recursive functions. - -type bottomUpVisitor struct { - analyze func([]*Node, bool) - visitgen uint32 - nodeID map[*Node]uint32 - stack []*Node -} - -// visitBottomUp invokes analyze on the ODCLFUNC nodes listed in list. -// It calls analyze with successive groups of functions, working from -// the bottom of the call graph upward. Each time analyze is called with -// a list of functions, every function on that list only calls other functions -// on the list or functions that have been passed in previous invocations of -// analyze. Closures appear in the same list as their outer functions. -// The lists are as short as possible while preserving those requirements. -// (In a typical program, many invocations of analyze will be passed just -// a single function.) The boolean argument 'recursive' passed to analyze -// specifies whether the functions on the list are mutually recursive. -// If recursive is false, the list consists of only a single function and its closures. -// If recursive is true, the list may still contain only a single function, -// if that function is itself recursive. -func visitBottomUp(list []*Node, analyze func(list []*Node, recursive bool)) { - var v bottomUpVisitor - v.analyze = analyze - v.nodeID = make(map[*Node]uint32) - for _, n := range list { - if n.Op == ODCLFUNC && !n.Func.IsHiddenClosure() { - v.visit(n) - } - } -} - -func (v *bottomUpVisitor) visit(n *Node) uint32 { - if id := v.nodeID[n]; id > 0 { - // already visited - return id - } - - v.visitgen++ - id := v.visitgen - v.nodeID[n] = id - v.visitgen++ - min := v.visitgen - - v.stack = append(v.stack, n) - min = v.visitcodelist(n.Nbody, min) - if (min == id || min == id+1) && !n.Func.IsHiddenClosure() { - // This node is the root of a strongly connected component. - - // The original min passed to visitcodelist was v.nodeID[n]+1. - // If visitcodelist found its way back to v.nodeID[n], then this - // block is a set of mutually recursive functions. - // Otherwise it's just a lone function that does not recurse. - recursive := min == id - - // Remove connected component from stack. - // Mark walkgen so that future visits return a large number - // so as not to affect the caller's min. - - var i int - for i = len(v.stack) - 1; i >= 0; i-- { - x := v.stack[i] - if x == n { - break - } - v.nodeID[x] = ^uint32(0) - } - v.nodeID[n] = ^uint32(0) - block := v.stack[i:] - // Run escape analysis on this set of functions. - v.stack = v.stack[:i] - v.analyze(block, recursive) - } - - return min -} - -func (v *bottomUpVisitor) visitcodelist(l Nodes, min uint32) uint32 { - for _, n := range l.Slice() { - min = v.visitcode(n, min) - } - return min -} - -func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { - if n == nil { - return min - } - - min = v.visitcodelist(n.Ninit, min) - min = v.visitcode(n.Left, min) - min = v.visitcode(n.Right, min) - min = v.visitcodelist(n.List, min) - min = v.visitcodelist(n.Nbody, min) - min = v.visitcodelist(n.Rlist, min) - - switch n.Op { - case OCALLFUNC, OCALLMETH: - fn := asNode(n.Left.Type.Nname()) - if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { - m := v.visit(fn.Name.Defn) - if m < min { - min = m - } - } - - case OCLOSURE: - m := v.visit(n.Func.Closure) - if m < min { - min = m - } - } - - return min -} - // Escape analysis. // An escape analysis pass for a set of functions. The diff --git a/src/cmd/compile/internal/gc/scc.go b/src/cmd/compile/internal/gc/scc.go new file mode 100644 index 0000000000..80d5be6549 --- /dev/null +++ b/src/cmd/compile/internal/gc/scc.go @@ -0,0 +1,145 @@ +// Copyright 2011 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 gc + +// Strongly connected components. +// +// Run analysis on minimal sets of mutually recursive functions +// or single non-recursive functions, bottom up. +// +// Finding these sets is finding strongly connected components +// by reverse topological order in the static call graph. +// The algorithm (known as Tarjan's algorithm) for doing that is taken from +// Sedgewick, Algorithms, Second Edition, p. 482, with two adaptations. +// +// First, a hidden closure function (n.Func.IsHiddenClosure()) cannot be the +// root of a connected component. Refusing to use it as a root +// forces it into the component of the function in which it appears. +// This is more convenient for escape analysis. +// +// Second, each function becomes two virtual nodes in the graph, +// with numbers n and n+1. We record the function's node number as n +// but search from node n+1. If the search tells us that the component +// number (min) is n+1, we know that this is a trivial component: one function +// plus its closures. If the search tells us that the component number is +// n, then there was a path from node n+1 back to node n, meaning that +// the function set is mutually recursive. The escape analysis can be +// more precise when analyzing a single non-recursive function than +// when analyzing a set of mutually recursive functions. + +type bottomUpVisitor struct { + analyze func([]*Node, bool) + visitgen uint32 + nodeID map[*Node]uint32 + stack []*Node +} + +// visitBottomUp invokes analyze on the ODCLFUNC nodes listed in list. +// It calls analyze with successive groups of functions, working from +// the bottom of the call graph upward. Each time analyze is called with +// a list of functions, every function on that list only calls other functions +// on the list or functions that have been passed in previous invocations of +// analyze. Closures appear in the same list as their outer functions. +// The lists are as short as possible while preserving those requirements. +// (In a typical program, many invocations of analyze will be passed just +// a single function.) The boolean argument 'recursive' passed to analyze +// specifies whether the functions on the list are mutually recursive. +// If recursive is false, the list consists of only a single function and its closures. +// If recursive is true, the list may still contain only a single function, +// if that function is itself recursive. +func visitBottomUp(list []*Node, analyze func(list []*Node, recursive bool)) { + var v bottomUpVisitor + v.analyze = analyze + v.nodeID = make(map[*Node]uint32) + for _, n := range list { + if n.Op == ODCLFUNC && !n.Func.IsHiddenClosure() { + v.visit(n) + } + } +} + +func (v *bottomUpVisitor) visit(n *Node) uint32 { + if id := v.nodeID[n]; id > 0 { + // already visited + return id + } + + v.visitgen++ + id := v.visitgen + v.nodeID[n] = id + v.visitgen++ + min := v.visitgen + + v.stack = append(v.stack, n) + min = v.visitcodelist(n.Nbody, min) + if (min == id || min == id+1) && !n.Func.IsHiddenClosure() { + // This node is the root of a strongly connected component. + + // The original min passed to visitcodelist was v.nodeID[n]+1. + // If visitcodelist found its way back to v.nodeID[n], then this + // block is a set of mutually recursive functions. + // Otherwise it's just a lone function that does not recurse. + recursive := min == id + + // Remove connected component from stack. + // Mark walkgen so that future visits return a large number + // so as not to affect the caller's min. + + var i int + for i = len(v.stack) - 1; i >= 0; i-- { + x := v.stack[i] + if x == n { + break + } + v.nodeID[x] = ^uint32(0) + } + v.nodeID[n] = ^uint32(0) + block := v.stack[i:] + // Run escape analysis on this set of functions. + v.stack = v.stack[:i] + v.analyze(block, recursive) + } + + return min +} + +func (v *bottomUpVisitor) visitcodelist(l Nodes, min uint32) uint32 { + for _, n := range l.Slice() { + min = v.visitcode(n, min) + } + return min +} + +func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { + if n == nil { + return min + } + + min = v.visitcodelist(n.Ninit, min) + min = v.visitcode(n.Left, min) + min = v.visitcode(n.Right, min) + min = v.visitcodelist(n.List, min) + min = v.visitcodelist(n.Nbody, min) + min = v.visitcodelist(n.Rlist, min) + + switch n.Op { + case OCALLFUNC, OCALLMETH: + fn := asNode(n.Left.Type.Nname()) + if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { + m := v.visit(fn.Name.Defn) + if m < min { + min = m + } + } + + case OCLOSURE: + m := v.visit(n.Func.Closure) + if m < min { + min = m + } + } + + return min +} -- GitLab From 0a7bc8f430e3e4017910780a898a5f20d337895b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 13 Mar 2019 18:56:37 -0700 Subject: [PATCH 0471/1679] runtime: introduce and consistently use setNsec for timespec The general code for setting a timespec value sometimes used set_nsec and sometimes used a combination of set_sec and set_nsec. Standardize on a setNsec function that takes a number of nanoseconds and splits them up to set the tv_sec and tv_nsec fields. Consistently mark setNsec as go:nosplit, since it has to be that way on some systems including Darwin and GNU/Linux. Consistently use timediv on 32-bit systems to help stay within split-stack limits on processors that don't have a 64-bit division instruction. Change-Id: I6396bb7ddbef171a96876bdeaf7a1c585a6d725b Reviewed-on: https://go-review.googlesource.com/c/go/+/167389 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/defs1_netbsd_386.go | 9 +++------ src/runtime/defs1_netbsd_amd64.go | 10 ++++------ src/runtime/defs1_netbsd_arm.go | 9 +++------ src/runtime/defs1_solaris_amd64.go | 6 ++++++ src/runtime/defs_aix_ppc64.go | 7 +++++++ src/runtime/defs_darwin_386.go | 5 ++--- src/runtime/defs_darwin_amd64.go | 6 +++--- src/runtime/defs_darwin_arm.go | 5 ++--- src/runtime/defs_darwin_arm64.go | 6 +++--- src/runtime/defs_dragonfly_amd64.go | 6 ++++-- src/runtime/defs_freebsd_386.go | 5 +++-- src/runtime/defs_freebsd_amd64.go | 6 ++++-- src/runtime/defs_freebsd_arm.go | 5 +++-- src/runtime/defs_linux_386.go | 9 +++------ src/runtime/defs_linux_amd64.go | 10 ++++------ src/runtime/defs_linux_arm.go | 9 +++------ src/runtime/defs_linux_arm64.go | 10 ++++------ src/runtime/defs_linux_mips64x.go | 10 ++++------ src/runtime/defs_linux_mipsx.go | 9 ++------- src/runtime/defs_linux_ppc64.go | 10 ++++------ src/runtime/defs_linux_ppc64le.go | 10 ++++------ src/runtime/defs_linux_s390x.go | 10 ++++------ src/runtime/defs_nacl_386.go | 5 +++++ src/runtime/defs_nacl_amd64p32.go | 6 ++++++ src/runtime/defs_nacl_arm.go | 5 +++++ src/runtime/defs_openbsd_386.go | 9 +++------ src/runtime/defs_openbsd_amd64.go | 10 ++++------ src/runtime/defs_openbsd_arm.go | 9 +++------ src/runtime/os_darwin.go | 2 +- src/runtime/os_freebsd.go | 2 +- src/runtime/os_linux.go | 17 ++--------------- src/runtime/os_netbsd.go | 4 +--- src/runtime/os_openbsd.go | 5 +---- src/runtime/runtime1.go | 1 + 34 files changed, 112 insertions(+), 135 deletions(-) diff --git a/src/runtime/defs1_netbsd_386.go b/src/runtime/defs1_netbsd_386.go index c26f417a02..3eae12eed0 100644 --- a/src/runtime/defs1_netbsd_386.go +++ b/src/runtime/defs1_netbsd_386.go @@ -106,12 +106,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs1_netbsd_amd64.go b/src/runtime/defs1_netbsd_amd64.go index 0704cd4fb3..51d55c91f9 100644 --- a/src/runtime/defs1_netbsd_amd64.go +++ b/src/runtime/defs1_netbsd_amd64.go @@ -108,12 +108,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs1_netbsd_arm.go b/src/runtime/defs1_netbsd_arm.go index d2a13ad4b0..fadb3415b3 100644 --- a/src/runtime/defs1_netbsd_arm.go +++ b/src/runtime/defs1_netbsd_arm.go @@ -108,12 +108,9 @@ type timespec struct { _ [4]byte // EABI } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs1_solaris_amd64.go b/src/runtime/defs1_solaris_amd64.go index 5ee3c3fc27..64d51a7bd8 100644 --- a/src/runtime/defs1_solaris_amd64.go +++ b/src/runtime/defs1_solaris_amd64.go @@ -161,6 +161,12 @@ type timespec struct { tv_nsec int64 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 +} + type timeval struct { tv_sec int64 tv_usec int64 diff --git a/src/runtime/defs_aix_ppc64.go b/src/runtime/defs_aix_ppc64.go index e7480d06ba..db17b90496 100644 --- a/src/runtime/defs_aix_ppc64.go +++ b/src/runtime/defs_aix_ppc64.go @@ -126,6 +126,13 @@ type timespec struct { tv_sec int64 tv_nsec int64 } + +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 +} + type timeval struct { tv_sec int64 tv_usec int32 diff --git a/src/runtime/defs_darwin_386.go b/src/runtime/defs_darwin_386.go index ae56d154fa..43dc08a078 100644 --- a/src/runtime/defs_darwin_386.go +++ b/src/runtime/defs_darwin_386.go @@ -149,9 +149,8 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = int32(ns / 1000000000) - t.tv_nsec = int32(ns % 1000000000) +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type fpcontrol struct { diff --git a/src/runtime/defs_darwin_amd64.go b/src/runtime/defs_darwin_amd64.go index a339ebd4c6..59b0effa13 100644 --- a/src/runtime/defs_darwin_amd64.go +++ b/src/runtime/defs_darwin_amd64.go @@ -151,9 +151,9 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = ns / 1000000000 - t.tv_nsec = ns % 1000000000 +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type fpcontrol struct { diff --git a/src/runtime/defs_darwin_arm.go b/src/runtime/defs_darwin_arm.go index 148b0a764e..243f52a5df 100644 --- a/src/runtime/defs_darwin_arm.go +++ b/src/runtime/defs_darwin_arm.go @@ -151,9 +151,8 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = int32(ns / 1000000000) - t.tv_nsec = int32(ns % 1000000000) +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type floatstate32 struct { diff --git a/src/runtime/defs_darwin_arm64.go b/src/runtime/defs_darwin_arm64.go index 46e6d9ff8c..7056074f46 100644 --- a/src/runtime/defs_darwin_arm64.go +++ b/src/runtime/defs_darwin_arm64.go @@ -151,9 +151,9 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = ns / 1000000000 - t.tv_nsec = ns % 1000000000 +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type exceptionstate64 struct { diff --git a/src/runtime/defs_dragonfly_amd64.go b/src/runtime/defs_dragonfly_amd64.go index c30da805cc..30f1b33845 100644 --- a/src/runtime/defs_dragonfly_amd64.go +++ b/src/runtime/defs_dragonfly_amd64.go @@ -174,8 +174,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_freebsd_386.go b/src/runtime/defs_freebsd_386.go index afdf54055f..c4d5c897d3 100644 --- a/src/runtime/defs_freebsd_386.go +++ b/src/runtime/defs_freebsd_386.go @@ -191,8 +191,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_freebsd_amd64.go b/src/runtime/defs_freebsd_amd64.go index c88c0c55c7..89d36c270d 100644 --- a/src/runtime/defs_freebsd_amd64.go +++ b/src/runtime/defs_freebsd_amd64.go @@ -201,8 +201,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_freebsd_arm.go b/src/runtime/defs_freebsd_arm.go index 0c21ea6cff..cc8c924c37 100644 --- a/src/runtime/defs_freebsd_arm.go +++ b/src/runtime/defs_freebsd_arm.go @@ -163,8 +163,9 @@ type timespec struct { pad_cgo_0 [4]byte } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs_linux_386.go b/src/runtime/defs_linux_386.go index 0ebac17aef..e2fcbcac71 100644 --- a/src/runtime/defs_linux_386.go +++ b/src/runtime/defs_linux_386.go @@ -137,12 +137,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_linux_amd64.go b/src/runtime/defs_linux_amd64.go index c0a0ef0dd4..ddad7fddd4 100644 --- a/src/runtime/defs_linux_amd64.go +++ b/src/runtime/defs_linux_amd64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_arm.go b/src/runtime/defs_linux_arm.go index 43946bb79c..9d10d664e1 100644 --- a/src/runtime/defs_linux_arm.go +++ b/src/runtime/defs_linux_arm.go @@ -94,12 +94,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type stackt struct { diff --git a/src/runtime/defs_linux_arm64.go b/src/runtime/defs_linux_arm64.go index c2cc281ab4..b325a229a1 100644 --- a/src/runtime/defs_linux_arm64.go +++ b/src/runtime/defs_linux_arm64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_mips64x.go b/src/runtime/defs_linux_mips64x.go index 9dacd5d1e9..a52d0d40cf 100644 --- a/src/runtime/defs_linux_mips64x.go +++ b/src/runtime/defs_linux_mips64x.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_mipsx.go b/src/runtime/defs_linux_mipsx.go index 9532ac54ee..f3a1dd0cf0 100644 --- a/src/runtime/defs_linux_mipsx.go +++ b/src/runtime/defs_linux_mipsx.go @@ -99,13 +99,8 @@ type timespec struct { } //go:nosplit -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -//go:nosplit -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_linux_ppc64.go b/src/runtime/defs_linux_ppc64.go index 5a4326da07..f438993721 100644 --- a/src/runtime/defs_linux_ppc64.go +++ b/src/runtime/defs_linux_ppc64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_ppc64le.go b/src/runtime/defs_linux_ppc64le.go index 5a4326da07..f438993721 100644 --- a/src/runtime/defs_linux_ppc64le.go +++ b/src/runtime/defs_linux_ppc64le.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_s390x.go b/src/runtime/defs_linux_s390x.go index a6cc9c48e9..19b99b5bdf 100644 --- a/src/runtime/defs_linux_s390x.go +++ b/src/runtime/defs_linux_s390x.go @@ -95,12 +95,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_nacl_386.go b/src/runtime/defs_nacl_386.go index 5e65e033ab..70dfcf2c51 100644 --- a/src/runtime/defs_nacl_386.go +++ b/src/runtime/defs_nacl_386.go @@ -14,6 +14,11 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) +} + type excregs386 struct { eax uint32 ecx uint32 diff --git a/src/runtime/defs_nacl_amd64p32.go b/src/runtime/defs_nacl_amd64p32.go index 27afc388cc..37067483f4 100644 --- a/src/runtime/defs_nacl_amd64p32.go +++ b/src/runtime/defs_nacl_amd64p32.go @@ -14,6 +14,12 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = int32(ns % 1e9) +} + type excregs386 struct { eax uint32 ecx uint32 diff --git a/src/runtime/defs_nacl_arm.go b/src/runtime/defs_nacl_arm.go index 817a3d3054..89e539ea7b 100644 --- a/src/runtime/defs_nacl_arm.go +++ b/src/runtime/defs_nacl_arm.go @@ -14,6 +14,11 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) +} + type excregsarm struct { r0 uint32 r1 uint32 diff --git a/src/runtime/defs_openbsd_386.go b/src/runtime/defs_openbsd_386.go index 7b956c44f0..0e59a0591a 100644 --- a/src/runtime/defs_openbsd_386.go +++ b/src/runtime/defs_openbsd_386.go @@ -134,12 +134,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs_openbsd_amd64.go b/src/runtime/defs_openbsd_amd64.go index 0a93905717..5cefac5858 100644 --- a/src/runtime/defs_openbsd_amd64.go +++ b/src/runtime/defs_openbsd_amd64.go @@ -144,12 +144,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_openbsd_arm.go b/src/runtime/defs_openbsd_arm.go index 59f9410e1d..b187e9776f 100644 --- a/src/runtime/defs_openbsd_arm.go +++ b/src/runtime/defs_openbsd_arm.go @@ -139,12 +139,9 @@ type timespec struct { pad_cgo_0 [4]byte } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 26b02820cd..18c15ad89e 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -53,7 +53,7 @@ func semasleep(ns int64) int32 { return -1 } var t timespec - t.set_nsec(ns - spent) + t.setNsec(ns - spent) err := pthread_cond_timedwait_relative_np(&mp.cond, &mp.mutex, &t) if err == _ETIMEDOUT { pthread_mutex_unlock(&mp.mutex) diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index 08f7b0ecf0..ba0afa23bf 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -156,7 +156,7 @@ func futexsleep1(addr *uint32, val uint32, ns int64) { if ns >= 0 { var ut umtx_time ut._clockid = _CLOCK_MONOTONIC - ut._timeout.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ut._timeout.tv_nsec))))) + ut._timeout.setNsec(ns) utp = &ut } ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp) diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index a04c995c00..8f3afe0577 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -35,8 +35,6 @@ const ( // Don't sleep longer than ns; ns < 0 means forever. //go:nosplit func futexsleep(addr *uint32, val uint32, ns int64) { - var ts timespec - // Some Linux kernels have a bug where futex of // FUTEX_WAIT returns an internal error code // as an errno. Libpthread ignores the return value @@ -47,19 +45,8 @@ func futexsleep(addr *uint32, val uint32, ns int64) { return } - // It's difficult to live within the no-split stack limits here. - // On ARM and 386, a 64-bit divide invokes a general software routine - // that needs more stack than we can afford. So we use timediv instead. - // But on real 64-bit systems, where words are larger but the stack limit - // is not, even timediv is too heavy, and we really need to use just an - // ordinary machine instruction. - if sys.PtrSize == 8 { - ts.set_sec(ns / 1000000000) - ts.set_nsec(int32(ns % 1000000000)) - } else { - ts.tv_nsec = 0 - ts.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ts.tv_nsec))))) - } + var ts timespec + ts.setNsec(ns) futex(unsafe.Pointer(addr), _FUTEX_WAIT_PRIVATE, val, unsafe.Pointer(&ts), nil, 0) } diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 7deab3ed03..fa3c9fa649 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -148,9 +148,7 @@ func semasleep(ns int64) int32 { if wait <= 0 { return -1 } - var nsec int32 - ts.set_sec(timediv(wait, 1000000000, &nsec)) - ts.set_nsec(nsec) + ts.setNsec(wait) tsp = &ts } ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil) diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 353a5d94ba..42fe315bcd 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -139,10 +139,7 @@ func semasleep(ns int64) int32 { var tsp *timespec if ns >= 0 { var ts timespec - var nsec int32 - ns += nanotime() - ts.set_sec(int64(timediv(ns, 1000000000, &nsec))) - ts.set_nsec(nsec) + ts.setNsec(ns + nanotime()) tsp = &ts } diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go index a597e1cd7f..ad29818e0a 100644 --- a/src/runtime/runtime1.go +++ b/src/runtime/runtime1.go @@ -412,6 +412,7 @@ func setTraceback(level string) { // This is a very special function, do not use it if you are not sure what you are doing. // int64 division is lowered into _divv() call on 386, which does not fit into nosplit functions. // Handles overflow in a time-specific manner. +// This keeps us within no-split stack limits on 32-bit processors. //go:nosplit func timediv(v int64, div int32, rem *int32) int32 { res := int32(0) -- GitLab From d039e12b54a73796caa913994597a9f3a73e8e87 Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Fri, 1 Mar 2019 18:04:14 +0800 Subject: [PATCH 0472/1679] os: consistently return PathError from RemoveAll Fixes #30491 Change-Id: If4070e5d39d8649643d7e90f6f3eb499642e25ab Reviewed-on: https://go-review.googlesource.com/c/go/+/164720 Run-TryBot: Baokun Lee TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Emmanuel Odeke --- src/os/path.go | 1 + src/os/path_unix.go | 2 +- src/os/removeall_at.go | 38 ++++++++++++++++++++++++-------------- src/os/removeall_test.go | 15 +++++++++++++-- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/os/path.go b/src/os/path.go index 104b7ceaf7..ba43ea3525 100644 --- a/src/os/path.go +++ b/src/os/path.go @@ -62,6 +62,7 @@ func MkdirAll(path string, perm FileMode) error { // It removes everything it can but returns the first error // it encounters. If the path does not exist, RemoveAll // returns nil (no error). +// If there is an error, it will be of type *PathError. func RemoveAll(path string) error { return removeAll(path) } diff --git a/src/os/path_unix.go b/src/os/path_unix.go index be373a50a9..a08ddaf6db 100644 --- a/src/os/path_unix.go +++ b/src/os/path_unix.go @@ -51,7 +51,7 @@ func splitPath(path string) (string, string) { // Remove leading directory path for i--; i >= 0; i-- { if path[i] == '/' { - dirname = path[:i+1] + dirname = path[:i] basename = path[i+1:] break } diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 94232cf556..330963b354 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -46,13 +46,20 @@ func removeAll(path string) error { } defer parent.Close() - return removeAllFrom(parent, base) + if err := removeAllFrom(parent, base); err != nil { + if pathErr, ok := err.(*PathError); ok { + pathErr.Path = parentDir + string(PathSeparator) + pathErr.Path + err = pathErr + } + return err + } + return nil } -func removeAllFrom(parent *File, path string) error { +func removeAllFrom(parent *File, base string) error { parentFd := int(parent.Fd()) // Simple case: if Unlink (aka remove) works, we're done. - err := unix.Unlinkat(parentFd, path, 0) + err := unix.Unlinkat(parentFd, base, 0) if err == nil || IsNotExist(err) { return nil } @@ -64,21 +71,21 @@ func removeAllFrom(parent *File, path string) error { // whose contents need to be removed. // Otherwise just return the error. if err != syscall.EISDIR && err != syscall.EPERM && err != syscall.EACCES { - return err + return &PathError{"unlinkat", base, err} } // Is this a directory we need to recurse into? var statInfo syscall.Stat_t - statErr := unix.Fstatat(parentFd, path, &statInfo, unix.AT_SYMLINK_NOFOLLOW) + statErr := unix.Fstatat(parentFd, base, &statInfo, unix.AT_SYMLINK_NOFOLLOW) if statErr != nil { if IsNotExist(statErr) { return nil } - return statErr + return &PathError{"fstatat", base, statErr} } if statInfo.Mode&syscall.S_IFMT != syscall.S_IFDIR { - // Not a directory; return the error from the Remove. - return err + // Not a directory; return the error from the unix.Unlinkat. + return &PathError{"unlinkat", base, err} } // Remove the directory's entries. @@ -87,12 +94,12 @@ func removeAllFrom(parent *File, path string) error { const request = 1024 // Open the directory to recurse into - file, err := openFdAt(parentFd, path) + file, err := openFdAt(parentFd, base) if err != nil { if IsNotExist(err) { return nil } - recurseErr = err + recurseErr = &PathError{"openfdat", base, err} break } @@ -103,12 +110,15 @@ func removeAllFrom(parent *File, path string) error { if IsNotExist(readErr) { return nil } - return readErr + return &PathError{"readdirnames", base, readErr} } for _, name := range names { err := removeAllFrom(file, name) if err != nil { + if pathErr, ok := err.(*PathError); ok { + pathErr.Path = base + string(PathSeparator) + pathErr.Path + } recurseErr = err } } @@ -127,7 +137,7 @@ func removeAllFrom(parent *File, path string) error { } // Remove the directory itself. - unlinkError := unix.Unlinkat(parentFd, path, unix.AT_REMOVEDIR) + unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR) if unlinkError == nil || IsNotExist(unlinkError) { return nil } @@ -135,7 +145,7 @@ func removeAllFrom(parent *File, path string) error { if recurseErr != nil { return recurseErr } - return unlinkError + return &PathError{"unlinkat", base, unlinkError} } // openFdAt opens path relative to the directory in fd. @@ -157,7 +167,7 @@ func openFdAt(dirfd int, name string) (*File, error) { continue } - return nil, &PathError{"openat", name, e} + return nil, e } if !supportsCloseOnExec { diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index 8690bb5d2a..2bd14979e0 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -286,7 +286,7 @@ func TestRemoveReadOnlyDir(t *testing.T) { } // Issue #29983. -func TestRemoveAllButReadOnly(t *testing.T) { +func TestRemoveAllButReadOnlyAndPathError(t *testing.T) { switch runtime.GOOS { case "nacl", "js", "windows": t.Skipf("skipping test on %s", runtime.GOOS) @@ -347,10 +347,21 @@ func TestRemoveAllButReadOnly(t *testing.T) { defer Chmod(d, 0777) } - if err := RemoveAll(tempDir); err == nil { + err = RemoveAll(tempDir) + if err == nil { t.Fatal("RemoveAll succeeded unexpectedly") } + // The error should be of type *PathError. + // see issue 30491 for details. + if pathErr, ok := err.(*PathError); ok { + if g, w := pathErr.Path, filepath.Join(tempDir, "b", "y"); g != w { + t.Errorf("got %q, expected pathErr.path %q", g, w) + } + } else { + t.Errorf("got %T, expected *os.PathError", err) + } + for _, dir := range dirs { _, err := Stat(filepath.Join(tempDir, dir)) if inReadonly(dir) { -- GitLab From d06704a3c2c3bb668926c8d20b9d4855b7131148 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 Mar 2019 19:10:43 -0700 Subject: [PATCH 0473/1679] cmd/cover: don't assume duplicate positions are in order Fixes #30746 Change-Id: I63f2d82f14eeaab6b14e956e21ddeec56fee025b Reviewed-on: https://go-review.googlesource.com/c/go/+/167257 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/cover/cover.go | 52 +++++++++++++------- src/cmd/cover/cover_test.go | 94 +++++++++++++++++++++++++++++++++---- 2 files changed, 120 insertions(+), 26 deletions(-) diff --git a/src/cmd/cover/cover.go b/src/cmd/cover/cover.go index 0348849578..2394e57977 100644 --- a/src/cmd/cover/cover.go +++ b/src/cmd/cover/cover.go @@ -646,20 +646,11 @@ func (f *File) addVariables(w io.Writer) { // - 32-bit starting line number // - 32-bit ending line number // - (16 bit ending column number << 16) | (16-bit starting column number). - var lastStart, lastEnd token.Position for i, block := range f.blocks { start := f.fset.Position(block.startByte) end := f.fset.Position(block.endByte) - // It is possible for positions to repeat when there is a - // line directive that does not specify column information - // and the input has not been passed through gofmt. - // See issue #27350 and TestHtmlUnformatted. - if samePos(start, lastStart) && samePos(end, lastEnd) { - end.Column++ - } - lastStart = start - lastEnd = end + start, end = dedup(start, end) fmt.Fprintf(w, "\t\t%d, %d, %#x, // [%d]\n", start.Line, end.Line, (end.Column&0xFFFF)<<16|(start.Column&0xFFFF), i) } @@ -710,10 +701,39 @@ func isValidIdentifier(ident string) bool { return true } -// samePos returns whether two positions have the same file/line/column. -// We don't use p1 == p2 because token.Position also has an Offset field, -// and when the input uses //line directives two Positions can have different -// Offset values while having the same file/line/dolumn. -func samePos(p1, p2 token.Position) bool { - return p1.Filename == p2.Filename && p1.Line == p2.Line && p1.Column == p2.Column +// It is possible for positions to repeat when there is a line +// directive that does not specify column information and the input +// has not been passed through gofmt. +// See issues #27530 and #30746. +// Tests are TestHtmlUnformatted and TestLineDup. +// We use a map to avoid duplicates. + +// pos2 is a pair of token.Position values, used as a map key type. +type pos2 struct { + p1, p2 token.Position +} + +// seenPos2 tracks whether we have seen a token.Position pair. +var seenPos2 = make(map[pos2]bool) + +// dedup takes a token.Position pair and returns a pair that does not +// duplicate any existing pair. The returned pair will have the Offset +// fields cleared. +func dedup(p1, p2 token.Position) (r1, r2 token.Position) { + key := pos2{ + p1: p1, + p2: p2, + } + + // We want to ignore the Offset fields in the map, + // since cover uses only file/line/column. + key.p1.Offset = 0 + key.p2.Offset = 0 + + for seenPos2[key] { + key.p2.Column++ + } + seenPos2[key] = true + + return key.p1, key.p2 } diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index cf8f3d2384..a53660f744 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -40,16 +40,20 @@ var ( htmlGolden = filepath.Join(testdata, "html", "html.golden") // Temporary files. - tmpTestMain string - coverInput string - coverOutput string - htmlProfile string - htmlHTML string - htmlUDir string - htmlU string - htmlUTest string - htmlUProfile string - htmlUHTML string + tmpTestMain string + coverInput string + coverOutput string + htmlProfile string + htmlHTML string + htmlUDir string + htmlU string + htmlUTest string + htmlUProfile string + htmlUHTML string + lineDupDir string + lineDupGo string + lineDupTestGo string + lineDupProfile string ) var ( @@ -96,6 +100,10 @@ func TestMain(m *testing.M) { htmlUTest = filepath.Join(htmlUDir, "htmlunformatted_test.go") htmlUProfile = filepath.Join(htmlUDir, "htmlunformatted.cov") htmlUHTML = filepath.Join(htmlUDir, "htmlunformatted.html") + lineDupDir = filepath.Join(dir, "linedup") + lineDupGo = filepath.Join(lineDupDir, "linedup.go") + lineDupTestGo = filepath.Join(lineDupDir, "linedup_test.go") + lineDupProfile = filepath.Join(lineDupDir, "linedup.out") status := m.Run() @@ -484,6 +492,72 @@ lab: run(cmd, t) } +// lineDupContents becomes linedup.go in TestFuncWithDuplicateLines. +const lineDupContents = ` +package linedup + +var G int + +func LineDup(c int) { + for i := 0; i < c; i++ { +//line ld.go:100 + if i % 2 == 0 { + G++ + } + if i % 3 == 0 { + G++; G++ + } +//line ld.go:100 + if i % 4 == 0 { + G++; G++; G++ + } + if i % 5 == 0 { + G++; G++; G++; G++ + } + } +} +` + +// lineDupTestContents becomes linedup_test.go in TestFuncWithDuplicateLines. +const lineDupTestContents = ` +package linedup + +import "testing" + +func TestLineDup(t *testing.T) { + LineDup(100) +} +` + +// Test -func with duplicate //line directives with different numbers +// of statements. +func TestFuncWithDuplicateLines(t *testing.T) { + t.Parallel() + testenv.MustHaveGoRun(t) + buildCover(t) + + if err := os.Mkdir(lineDupDir, 0777); err != nil { + t.Fatal(err) + } + + if err := ioutil.WriteFile(lineDupGo, []byte(lineDupContents), 0444); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(lineDupTestGo, []byte(lineDupTestContents), 0444); err != nil { + t.Fatal(err) + } + + // go test -cover -covermode count -coverprofile TMPDIR/linedup.out + cmd := exec.Command(testenv.GoToolPath(t), "test", toolexecArg, "-cover", "-covermode", "count", "-coverprofile", lineDupProfile) + cmd.Dir = lineDupDir + run(cmd, t) + + // testcover -func=TMPDIR/linedup.out + cmd = exec.Command(testcover, "-func", lineDupProfile) + cmd.Dir = testTempDir + run(cmd, t) +} + func run(c *exec.Cmd, t *testing.T) { t.Helper() t.Log("running", c.Args) -- GitLab From cb8054a6b63975975b89c2901ce31f3be4fe7838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:48:43 +0100 Subject: [PATCH 0474/1679] cmd/link: fix trampoline generation for aix/ppc64 This commit fixes trampoline generation on aix/ppc64 which must use TOC symbols. It also adds a size to runtime.text.X symbols to prevent ld from moving them, like runtime.text. Change-Id: Ida033ec20ad8d7b7fb3faeb0ec4fa7bc4ce86b7e Reviewed-on: https://go-review.googlesource.com/c/go/+/164009 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/data.go | 44 +++++++++++++++--- src/cmd/link/internal/ld/lib.go | 3 +- src/cmd/link/internal/ld/xcoff.go | 8 +++- src/cmd/link/internal/ppc64/asm.go | 73 ++++++++++++++++++++---------- 4 files changed, 95 insertions(+), 33 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 9d160ca49b..d31d135273 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1990,6 +1990,10 @@ func (ctxt *Link) textaddress() { // lay down trampolines after each function for ; ntramps < len(ctxt.tramps); ntramps++ { tramp := ctxt.tramps[ntramps] + if ctxt.HeadType == objabi.Haix && strings.HasPrefix(tramp.Name, "runtime.text.") { + // Already set in assignAddress + continue + } sect, n, va = assignAddress(ctxt, sect, n, tramp, va, true) } } @@ -2030,10 +2034,6 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6 } else { va = uint64(Rnd(int64(va), int64(Funcalign))) } - s.Value = 0 - for sub := s; sub != nil; sub = sub.Sub { - sub.Value += int64(va) - } funcsize := uint64(MINFUNC) // spacing required for findfunctab if s.Size > MINFUNC { @@ -2049,7 +2049,7 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6 // Only break at outermost syms. - if ctxt.Arch.InFamily(sys.PPC64) && s.Outer == nil && ctxt.IsELF && ctxt.LinkMode == LinkExternal && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(s, isTramp) > 0x1c00000 { + if ctxt.Arch.InFamily(sys.PPC64) && s.Outer == nil && ctxt.LinkMode == LinkExternal && va-sect.Vaddr+funcsize+maxSizeTrampolinesPPC64(s, isTramp) > 0x1c00000 { // Set the length for the previous text section sect.Length = va - sect.Vaddr @@ -2059,9 +2059,35 @@ func assignAddress(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint6 s.Sect = sect // Create a symbol for the start of the secondary text sections - ctxt.Syms.Lookup(fmt.Sprintf("runtime.text.%d", n), 0).Sect = sect + ntext := ctxt.Syms.Lookup(fmt.Sprintf("runtime.text.%d", n), 0) + ntext.Sect = sect + if ctxt.HeadType == objabi.Haix { + // runtime.text.X must be a real symbol on AIX. + // Assign its address directly in order to be the + // first symbol of this new section. + ntext.Type = sym.STEXT + ntext.Size = int64(MINFUNC) + ntext.Attr |= sym.AttrReachable + ntext.Attr |= sym.AttrOnList + ctxt.tramps = append(ctxt.tramps, ntext) + + ntext.Value = int64(va) + va += uint64(ntext.Size) + + if s.Align != 0 { + va = uint64(Rnd(int64(va), int64(s.Align))) + } else { + va = uint64(Rnd(int64(va), int64(Funcalign))) + } + } n++ } + + s.Value = 0 + for sub := s; sub != nil; sub = sub.Sub { + sub.Value += int64(va) + } + va += funcsize return sect, n, va @@ -2247,7 +2273,11 @@ func (ctxt *Link) address() []*sym.Segment { break } symname := fmt.Sprintf("runtime.text.%d", n) - ctxt.xdefine(symname, sym.STEXT, int64(sect.Vaddr)) + if ctxt.HeadType != objabi.Haix || ctxt.LinkMode != LinkExternal { + // Addresses are already set on AIX with external linker + // because these symbols are part of their sections. + ctxt.xdefine(symname, sym.STEXT, int64(sect.Vaddr)) + } n++ } diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 5e1b042073..f12c8aeed7 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2176,7 +2176,8 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6 n++ continue } - if sect.Name != ".text" { + if sect.Name != ".text" || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) { + // On AIX, runtime.text.X are symbols already in the symtab. break } s = ctxt.Syms.ROLookup(fmt.Sprintf("runtime.text.%d", n), 0) diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index 70be67420b..f4422ff023 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -777,7 +777,11 @@ func (f *xcoffFile) writeSymbolFunc(ctxt *Link, x *sym.Symbol) []xcoffSym { syms := []xcoffSym{} // Check if a new file is detected. - if x.File == "" { // Undefined global symbol + if strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { + // Trampoline don't have a FILE so there are considered + // in the current file. + // Same goes for runtime.text.X symbols. + } else if x.File == "" { // Undefined global symbol // If this happens, the algorithme must be redone. if currSymSrcFile.name != "" { Exitf("undefined global symbol found inside another file") @@ -860,7 +864,7 @@ func putaixsym(ctxt *Link, x *sym.Symbol, str string, t SymbolType, addr int64, return case TextSym: - if x.FuncInfo != nil { + if x.FuncInfo != nil || strings.Contains(x.Name, "-tramp") || strings.HasPrefix(x.Name, "runtime.text.") { // Function within a file syms = xfile.writeSymbolFunc(ctxt, x) } else { diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index 70b3d2bd6d..a857694962 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -694,7 +694,7 @@ func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { ld.Errorf(s, "unexpected trampoline for shared or dynamic linking\n") } else { ctxt.AddTramp(tramp) - gentramp(ctxt.Arch, ctxt.LinkMode, tramp, r.Sym, r.Add) + gentramp(ctxt, tramp, r.Sym, r.Add) } } r.Sym = tramp @@ -706,40 +706,67 @@ func trampoline(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol) { } } -func gentramp(arch *sys.Arch, linkmode ld.LinkMode, tramp, target *sym.Symbol, offset int64) { - // Used for default build mode for an executable - // Address of the call target is generated using - // relocation and doesn't depend on r2 (TOC). +func gentramp(ctxt *ld.Link, tramp, target *sym.Symbol, offset int64) { tramp.Size = 16 // 4 instructions tramp.P = make([]byte, tramp.Size) t := ld.Symaddr(target) + offset - o1 := uint32(0x3fe00000) // lis r31,targetaddr hi - o2 := uint32(0x3bff0000) // addi r31,targetaddr lo - // With external linking, the target address must be - // relocated using LO and HA - if linkmode == ld.LinkExternal { + var o1, o2 uint32 + + if ctxt.HeadType == objabi.Haix { + // On AIX, the address is retrieved with a TOC symbol. + // For internal linking, the "Linux" way might still be used. + // However, all text symbols are accessed with a TOC symbol as + // text relocations aren't supposed to be possible. + // So, keep using the external linking way to be more AIX friendly. + o1 = uint32(0x3fe20000) // lis r2, toctargetaddr hi + o2 = uint32(0xebff0000) // ld r31, toctargetaddr lo + + toctramp := ctxt.Syms.Lookup("TOC."+tramp.Name, 0) + toctramp.Type = sym.SXCOFFTOC + toctramp.Attr |= sym.AttrReachable + toctramp.AddAddr(ctxt.Arch, target) + tr := tramp.AddRel() tr.Off = 0 - tr.Type = objabi.R_ADDRPOWER + tr.Type = objabi.R_ADDRPOWER_TOCREL_DS tr.Siz = 8 // generates 2 relocations: HA + LO - tr.Sym = target + tr.Sym = toctramp tr.Add = offset } else { - // adjustment needed if lo has sign bit set - // when using addi to compute address - val := uint32((t & 0xffff0000) >> 16) - if t&0x8000 != 0 { - val += 1 + // Used for default build mode for an executable + // Address of the call target is generated using + // relocation and doesn't depend on r2 (TOC). + o1 = uint32(0x3fe00000) // lis r31,targetaddr hi + o2 = uint32(0x3bff0000) // addi r31,targetaddr lo + + // With external linking, the target address must be + // relocated using LO and HA + if ctxt.LinkMode == ld.LinkExternal { + tr := tramp.AddRel() + tr.Off = 0 + tr.Type = objabi.R_ADDRPOWER + tr.Siz = 8 // generates 2 relocations: HA + LO + tr.Sym = target + tr.Add = offset + + } else { + // adjustment needed if lo has sign bit set + // when using addi to compute address + val := uint32((t & 0xffff0000) >> 16) + if t&0x8000 != 0 { + val += 1 + } + o1 |= val // hi part of addr + o2 |= uint32(t & 0xffff) // lo part of addr } - o1 |= val // hi part of addr - o2 |= uint32(t & 0xffff) // lo part of addr } + o3 := uint32(0x7fe903a6) // mtctr r31 o4 := uint32(0x4e800420) // bctr - arch.ByteOrder.PutUint32(tramp.P, o1) - arch.ByteOrder.PutUint32(tramp.P[4:], o2) - arch.ByteOrder.PutUint32(tramp.P[8:], o3) - arch.ByteOrder.PutUint32(tramp.P[12:], o4) + ctxt.Arch.ByteOrder.PutUint32(tramp.P, o1) + ctxt.Arch.ByteOrder.PutUint32(tramp.P[4:], o2) + ctxt.Arch.ByteOrder.PutUint32(tramp.P[8:], o3) + ctxt.Arch.ByteOrder.PutUint32(tramp.P[12:], o4) } func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) { -- GitLab From 9238a8ffe12b6eb44aab12de1b861c0f045da8b7 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 14 Mar 2019 17:08:25 -0400 Subject: [PATCH 0475/1679] cmd/go: skip package loading if explicitly cleaning a cache Fixes #28680 Fixes #29925 Change-Id: I9f7effb3e7743b96b0b8a797d6e1044b39d9b86b Reviewed-on: https://go-review.googlesource.com/c/go/+/167717 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 3 ++- src/cmd/go/internal/clean/clean.go | 14 ++++++++++++-- src/cmd/go/testdata/script/mod_clean_cache.txt | 5 ++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index d037d86bff..55371c1215 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -202,7 +202,8 @@ // so go clean is mainly concerned with object files left by other // tools or by manual invocations of go build. // -// Specifically, clean removes the following files from each of the +// If a package argument is given or the -i or -r flag is set, +// clean removes the following files from each of the // source directories corresponding to the import paths: // // _obj/ old object directory, left from Makefiles diff --git a/src/cmd/go/internal/clean/clean.go b/src/cmd/go/internal/clean/clean.go index 27121ed2ae..3389d5f18b 100644 --- a/src/cmd/go/internal/clean/clean.go +++ b/src/cmd/go/internal/clean/clean.go @@ -33,7 +33,8 @@ The go command builds most objects in a temporary directory, so go clean is mainly concerned with object files left by other tools or by manual invocations of go build. -Specifically, clean removes the following files from each of the +If a package argument is given or the -i or -r flag is set, +clean removes the following files from each of the source directories corresponding to the import paths: _obj/ old object directory, left from Makefiles @@ -105,7 +106,16 @@ func init() { } func runClean(cmd *base.Command, args []string) { - if len(args) > 0 || !modload.Enabled() || modload.HasModRoot() { + // golang.org/issue/29925: only load packages before cleaning if + // either the flags and arguments explicitly imply a package, + // or no other target (such as a cache) was requested to be cleaned. + cleanPkg := len(args) > 0 || cleanI || cleanR + if (!modload.Enabled() || modload.HasModRoot()) && + !cleanCache && !cleanModcache && !cleanTestcache { + cleanPkg = true + } + + if cleanPkg { for _, pkg := range load.PackagesAndErrors(args) { clean(pkg) } diff --git a/src/cmd/go/testdata/script/mod_clean_cache.txt b/src/cmd/go/testdata/script/mod_clean_cache.txt index a9519f9d90..01fbc381e0 100644 --- a/src/cmd/go/testdata/script/mod_clean_cache.txt +++ b/src/cmd/go/testdata/script/mod_clean_cache.txt @@ -30,10 +30,9 @@ go clean -r -modcache ! exists ../replaced/test.out # BUG: should still exist # 'go clean -modcache' should not download anything before cleaning. -# BUG(golang.org/issue/28680): Today, it does. go mod edit -require rsc.io/quote@v1.99999999.0-not-a-real-version -! go clean -modcache # BUG: should succeed -stderr 'finding rsc.io' # BUG: should not resolve module +go clean -modcache +! stderr 'finding rsc.io' go mod edit -droprequire rsc.io/quote -- go.mod -- -- GitLab From 694012aa3b74d0c382c13737ba65b8d80b0f9d25 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Mar 2019 08:32:16 -0400 Subject: [PATCH 0476/1679] cmd/cover: add go.mod file in lineDupDir This fixes TestFuncWithDuplicateLines (introduced in CL 167257) in module mode. Updates #30746 Updates #30228 Change-Id: I7b3e7192ae23f855c373e881389874ff6ffd49ad Reviewed-on: https://go-review.googlesource.com/c/go/+/167740 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Andrew Bonventre --- src/cmd/cover/cover_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index a53660f744..bac448cd47 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -540,6 +540,9 @@ func TestFuncWithDuplicateLines(t *testing.T) { t.Fatal(err) } + if err := ioutil.WriteFile(filepath.Join(lineDupDir, "go.mod"), []byte("module linedup\n"), 0444); err != nil { + t.Fatal(err) + } if err := ioutil.WriteFile(lineDupGo, []byte(lineDupContents), 0444); err != nil { t.Fatal(err) } @@ -554,7 +557,7 @@ func TestFuncWithDuplicateLines(t *testing.T) { // testcover -func=TMPDIR/linedup.out cmd = exec.Command(testcover, "-func", lineDupProfile) - cmd.Dir = testTempDir + cmd.Dir = lineDupDir run(cmd, t) } -- GitLab From 9d9d4eeb87ed5dae09e26d744ea7d6caf9b182dc Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 15 Mar 2019 11:29:03 +0100 Subject: [PATCH 0477/1679] bytes: add hard benchmarks for Index and Count Add Benchmark(Index|Count)Hard[1-3] in preparation for implementing Index and Count in assembly on arm. Updates #29001 Change-Id: I2a9701892190e8d91de069c2f5a7f5bd3544c6c2 Reviewed-on: https://go-review.googlesource.com/c/go/+/167798 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/bytes/bytes_test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index 98ba95009d..d508fc9895 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -1654,16 +1654,39 @@ func makeBenchInputHard() []byte { var benchInputHard = makeBenchInputHard() +func benchmarkIndexHard(b *testing.B, sep []byte) { + for i := 0; i < b.N; i++ { + Index(benchInputHard, sep) + } +} + func benchmarkLastIndexHard(b *testing.B, sep []byte) { for i := 0; i < b.N; i++ { LastIndex(benchInputHard, sep) } } +func benchmarkCountHard(b *testing.B, sep []byte) { + for i := 0; i < b.N; i++ { + Count(benchInputHard, sep) + } +} + +func BenchmarkIndexHard1(b *testing.B) { benchmarkIndexHard(b, []byte("<>")) } +func BenchmarkIndexHard2(b *testing.B) { benchmarkIndexHard(b, []byte("")) } +func BenchmarkIndexHard3(b *testing.B) { benchmarkIndexHard(b, []byte("hello world")) } +func BenchmarkIndexHard4(b *testing.B) { + benchmarkIndexHard(b, []byte("

    helloworld
    ")) +} + func BenchmarkLastIndexHard1(b *testing.B) { benchmarkLastIndexHard(b, []byte("<>")) } func BenchmarkLastIndexHard2(b *testing.B) { benchmarkLastIndexHard(b, []byte("")) } func BenchmarkLastIndexHard3(b *testing.B) { benchmarkLastIndexHard(b, []byte("hello world")) } +func BenchmarkCountHard1(b *testing.B) { benchmarkCountHard(b, []byte("<>")) } +func BenchmarkCountHard2(b *testing.B) { benchmarkCountHard(b, []byte("")) } +func BenchmarkCountHard3(b *testing.B) { benchmarkCountHard(b, []byte("hello world")) } + func BenchmarkSplitEmptySeparator(b *testing.B) { for i := 0; i < b.N; i++ { Split(benchInputHard, nil) -- GitLab From 653579138555ff2728ba16f841b640e06deab8df Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 13 Mar 2019 16:46:10 -0400 Subject: [PATCH 0478/1679] math: fix math.Remainder(-x,x) (for Inf > x > 0) Modify the |x| == |y| case to return -0 when x < 0. Fixes #30814. Change-Id: Ic4cd48001e0e894a12b5b813c6a1ddc3a055610b Reviewed-on: https://go-review.googlesource.com/c/go/+/167479 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/all_test.go | 14 ++++++++++++++ src/math/remainder.go | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/src/math/all_test.go b/src/math/all_test.go index ed42941780..208c8233e0 100644 --- a/src/math/all_test.go +++ b/src/math/all_test.go @@ -2795,6 +2795,20 @@ func TestRemainder(t *testing.T) { if f := Remainder(5.9790119248836734e+200, 1.1258465975523544); -0.4810497673014966 != f { t.Errorf("Remainder(5.9790119248836734e+200, 1.1258465975523544) = %g, want -0.4810497673014966", f) } + // verify that sign is correct when r == 0. + test := func(x, y float64) { + if r := Remainder(x, y); r == 0 && Signbit(r) != Signbit(x) { + t.Errorf("Remainder(x=%f, y=%f) = %f, sign of (zero) result should agree with sign of x", x, y, r) + } + } + for x := 0.0; x <= 3.0; x += 1 { + for y := 1.0; y <= 3.0; y += 1 { + test(x, y) + test(x, -y) + test(-x, y) + test(-x, -y) + } + } } func TestRound(t *testing.T) { diff --git a/src/math/remainder.go b/src/math/remainder.go index 504fdda7df..7c77d6eb3b 100644 --- a/src/math/remainder.go +++ b/src/math/remainder.go @@ -57,6 +57,10 @@ func remainder(x, y float64) float64 { y = -y } if x == y { + if sign { + zero := 0.0 + return -zero + } return 0 } if y <= HalfMax { -- GitLab From 6e63b15567cb67059153bbcd787ed0d2f64dbcf3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 15 Mar 2019 18:13:38 +0100 Subject: [PATCH 0479/1679] misc/android: copy go.mod and go.sum files Fixes TestFindStdlib in x/tools on android. Change-Id: I2da7c702164e23488c7f9574f636ac36f63ab421 Reviewed-on: https://go-review.googlesource.com/c/go/+/167799 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index ee3f16ae3d..2be0b07502 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -116,7 +116,7 @@ func runMain() (int, error) { if _, err := run("exec-out", "mkdir", "-p", deviceCwd); err != nil { return 0, err } - if err := adbCopyTestdata(deviceCwd, subdir); err != nil { + if err := adbCopyTree(deviceCwd, subdir); err != nil { return 0, err } @@ -217,21 +217,24 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { cwd, runtime.GOROOT(), build.Default.GOPATH) } -// adbCopyTestdata copies testdata directories from subdir to deviceCwd -// on the device. -// It is common for tests to reach out into testdata from parent -// packages, so copy testdata directories all the way up to the root -// of subdir. -func adbCopyTestdata(deviceCwd, subdir string) error { +// adbCopyTree copies testdata, go.mod, go.sum files from subdir +// and from parent directories all the way up to the root of subdir. +// go.mod and go.sum files are needed for the go tool modules queries, +// and the testdata directories for tests. It is common for tests to +// reach out into testdata from parent packages. +func adbCopyTree(deviceCwd, subdir string) error { dir := "" for { - testdata := filepath.Join(dir, "testdata") - if _, err := os.Stat(testdata); err == nil { + for _, path := range []string{"testdata", "go.mod", "go.sum"} { + path := filepath.Join(dir, path) + if _, err := os.Stat(path); err != nil { + continue + } devicePath := filepath.Join(deviceCwd, dir) if _, err := run("exec-out", "mkdir", "-p", devicePath); err != nil { return err } - if _, err := run("push", testdata, devicePath); err != nil { + if _, err := run("push", path, devicePath); err != nil { return err } } -- GitLab From c135dfbf1842993aa2fd4c293b2476ce4733daf7 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 18 Jan 2019 15:16:11 -0500 Subject: [PATCH 0480/1679] debug/dwarf: more graceful handling of unsupported types Enhance the type decoder to do a better job handling unknown type tags. DWARF has a number of type DIEs that this package doesn't handle (things like "pointer to member" types in C++); avoid crashing for such types, but instead return a placeholder "UnsupportedType" object (this idea suggested by Austin). This provides a compromise between implementing the entire kitchen sink and simply returning an error outright on any unknown type DIE. Fixes #29601. Change-Id: I2eeffa094c86ef3a2c358ee42e8e629d74cec2ed Reviewed-on: https://go-review.googlesource.com/c/go/+/158797 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/debug/dwarf/testdata/cppunsuptypes.cc | 34 ++++++++++++ src/debug/dwarf/testdata/cppunsuptypes.elf | Bin 0 -> 3920 bytes src/debug/dwarf/type.go | 24 +++++++++ src/debug/dwarf/type_test.go | 60 +++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 src/debug/dwarf/testdata/cppunsuptypes.cc create mode 100644 src/debug/dwarf/testdata/cppunsuptypes.elf diff --git a/src/debug/dwarf/testdata/cppunsuptypes.cc b/src/debug/dwarf/testdata/cppunsuptypes.cc new file mode 100644 index 0000000000..e9281c7dec --- /dev/null +++ b/src/debug/dwarf/testdata/cppunsuptypes.cc @@ -0,0 +1,34 @@ +// Copyright 2019 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. + +// cppunsuptypes.elf built with g++ 7.3 +// g++ -g -c -o cppunsuptypes.elf cppunsuptypes.cc + +int i = 3; +double d = 3; + +// anonymous reference type +int &culprit = i; + +// named reference type +typedef double &dref; +dref dr = d; + +// incorporated into another type +typedef struct { + dref q; + int &r; +} hasrefs; + +hasrefs hr = { d, i }; + +// This code is intended to trigger a DWARF "pointer to member" type DIE +struct CS { int dm; }; + +int foo() +{ + int CS::* pdm = &CS::dm; + CS cs = {42}; + return cs.*pdm; +} diff --git a/src/debug/dwarf/testdata/cppunsuptypes.elf b/src/debug/dwarf/testdata/cppunsuptypes.elf new file mode 100644 index 0000000000000000000000000000000000000000..e955512ecd0227f5564ab4d1a29c054d636742d9 GIT binary patch literal 3920 zcmb<-^>JfjWMqH=Mg}_u1P><4z%YRm!FB*M9T>zJ#27+7I-hzRcl`kpI_~;Ki-Cc` zqucd|M{npC55^1K46%nnG7JpN5DH3iK#YL$@KKJ83=Aw_1sq^!LD*mc2%!X_z$8;9 z10&dIPPlcOs0t$Jjulj zj0z7y_DoD+-~};2S{aoX7zG(s`GmQd`K0*-8HLyd#2FZvOcc?yGEfkS}UYk?}VlF9RbZIGHmtFfcMC7ZjA{6_*y2R2HNb z>m?^c^l&mkXa)vmSw`>X(vwU~42+EKexVA^+S-OD3g&vodIk!*xh17}skZ5>>(%_JD24y}LhL8UdA_x{U))E7h=ivd0P|N@lho^otad3`A5d(3U8Q4G+24-f! z?qX&JE)2CG0cHkpt^zSpFf#)$3LnN{X5fc0QD|lcK@>iW!^|KAW1`T^3<4;85C^1E zkO2`sFrS0s4I~cp8H^TVU|ig;R0&cK#h`S797-_zLESacgPD61Di1OTT#rHdKcO_toCGKzRsg`nOQ7QHAOk?<4Y<^W3W6$5C=;X}ToXe1 zu&@GYLk@ovs64v30#qEN7KEW(1_r(2%G{E~BnG|Wk|GG50b`Y%gIkp%t04N5d;<6@tJvP`3!pCB0N4ZDXA#645kMxomiBZm!1kY zA1s!WnU@OFQe0BRpqHGVo12c;nELFH!wXQyI^b(4QeHT%2JqrL1G|m0SypXegKuTAayYPpcV#5ohJ_a zCx9dwF#V729#E?TWG=e>8CdKG38C8`2elt+9h_PKWx1jS7#f!$k^$0QMz?UDk-%*faBn%aXi-5`%bTN?RDrlyKg+E9PgwfT4(h0Wk zOMp5QrXS>fP`L^fW`MbWA`bW8g4*u^vJ?rU+uwsD{3bvxg4qMIAJl4q3d8N63$-8S zPMB3n&;&gVCIF>j_QU8EIP~v;>Ie4-pn5?ROdpKi2-OdgL&jI3`jN#zY?wX}8-$NR z^+SUTBm~Acp!#9;AXt!r0iy+W5J&i}fCdzD_<`yzs4zVIK<+`e8)TONC{ZvlF#G^1 zU|?VX)$5>o7+pW8n+kO*NE;k;K-0f2Tm-^^8VBKk+f1PLDVz&u9DrJM0WJbzpz8+! D{?rCR literal 0 HcmV?d00001 diff --git a/src/debug/dwarf/type.go b/src/debug/dwarf/type.go index 4352092ed0..316db258f6 100644 --- a/src/debug/dwarf/type.go +++ b/src/debug/dwarf/type.go @@ -261,6 +261,20 @@ func (t *TypedefType) String() string { return t.Name } func (t *TypedefType) Size() int64 { return t.Type.Size() } +// An UnsupportedType is a placeholder returned in situations where we +// encounter a type that isn't supported. +type UnsupportedType struct { + CommonType + Tag Tag +} + +func (t *UnsupportedType) String() string { + if t.Name != "" { + return t.Name + } + return t.Name + "(unsupported type " + t.Tag.String() + ")" +} + // typeReader is used to read from either the info section or the // types section. type typeReader interface { @@ -680,6 +694,16 @@ func (d *Data) readType(name string, r typeReader, off Offset, typeCache map[Off typ = t typeCache[off] = t t.Name, _ = e.Val(AttrName).(string) + + default: + // This is some other type DIE that we're currently not + // equipped to handle. Return an abstract "unsupported type" + // object in such cases. + t := new(UnsupportedType) + typ = t + typeCache[off] = t + t.Tag = e.Tag + t.Name, _ = e.Val(AttrName).(string) } if err != nil { diff --git a/src/debug/dwarf/type_test.go b/src/debug/dwarf/type_test.go index 6c06731ea1..aa2fbeca0b 100644 --- a/src/debug/dwarf/type_test.go +++ b/src/debug/dwarf/type_test.go @@ -9,6 +9,8 @@ import ( "debug/elf" "debug/macho" "debug/pe" + "fmt" + "strconv" "testing" ) @@ -168,3 +170,61 @@ func TestTypedefCycle(t *testing.T) { } } } + +var unsupportedTypeTests = []string{ + // varname:typename:string:size + "culprit::(unsupported type ReferenceType):8", + "pdm::(unsupported type PtrToMemberType):-1", +} + +func TestUnsupportedTypes(t *testing.T) { + // Issue 29601: + // When reading DWARF from C++ load modules, we can encounter + // oddball type DIEs. These will be returned as "UnsupportedType" + // objects; check to make sure this works properly. + d := elfData(t, "testdata/cppunsuptypes.elf") + r := d.Reader() + seen := make(map[string]bool) + for { + e, err := r.Next() + if err != nil { + t.Fatal("r.Next:", err) + } + if e == nil { + break + } + if e.Tag == TagVariable { + vname, _ := e.Val(AttrName).(string) + tAttr := e.Val(AttrType) + typOff, ok := tAttr.(Offset) + if !ok { + t.Errorf("variable at offset %v has no type", e.Offset) + continue + } + typ, err := d.Type(typOff) + if err != nil { + t.Errorf("err in type decode: %v\n", err) + continue + } + unsup, isok := typ.(*UnsupportedType) + if !isok { + continue + } + tag := vname + ":" + unsup.Name + ":" + unsup.String() + + ":" + strconv.FormatInt(unsup.Size(), 10) + seen[tag] = true + } + } + dumpseen := false + for _, v := range unsupportedTypeTests { + if !seen[v] { + t.Errorf("missing %s", v) + dumpseen = true + } + } + if dumpseen { + for k, _ := range seen { + fmt.Printf("seen: %s\n", k) + } + } +} -- GitLab From d9db9e32e924a60bbfbb15cc0dd7cfaaf8a62a3b Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 15 Mar 2019 13:29:40 -0400 Subject: [PATCH 0481/1679] runtime: fix write barrier on wasm The current wasm write barrier implementation incorrectly implements the "deletion" part of the barrier. It correctly greys the new value of the pointer, but rather than also greying the old value of the pointer, it greys the object containing the slot (which, since the old value was just overwritten, is not going to contain the old value). This can lead to unmarked, reachable objects. Often, this is masked by other marking activity, but one specific sequence that can lead to an unmarked object because of this bug is: 1. Initially, GC is off, object A is reachable from just one pointer in the heap. 2. GC starts and scans the stack of goroutine G. 3. G copies the pointer to A on to its stack and overwrites the pointer to A in the heap. (Now A is reachable only from G's stack.) 4. GC finishes while A is still reachable from G's stack. With a functioning deletion barrier, step 3 causes A to be greyed. Without a functioning deletion barrier, nothing causes A to be greyed, so A will be freed even though it's still reachable from G's stack. This CL fixes the wasm write barrier. Fixes #30871. Change-Id: I8a74ee517facd3aa9ad606e5424bcf8f0d78e754 Reviewed-on: https://go-review.googlesource.com/c/go/+/167743 Run-TryBot: Austin Clements Reviewed-by: Cherry Zhang --- src/runtime/asm_wasm.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/asm_wasm.s b/src/runtime/asm_wasm.s index 1d25ee899d..a40efc2c2e 100644 --- a/src/runtime/asm_wasm.s +++ b/src/runtime/asm_wasm.s @@ -443,7 +443,7 @@ TEXT runtime·gcWriteBarrier(SB), NOSPLIT, $16 // Record value MOVD R1, 0(R5) // Record *slot - MOVD R0, 8(R5) + MOVD (R0), 8(R5) // Increment wbBuf.next Get R5 -- GitLab From 156c830bea6795d57ef9eb9bfe66197413c00fce Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 15 Mar 2019 08:49:38 +0100 Subject: [PATCH 0482/1679] cmd/compile: eliminate unnecessary type conversions in TrailingZeros(16|8) for arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This follows CL 156999 which did the same for arm64. name old time/op new time/op delta TrailingZeros-4 7.30ns ± 1% 7.30ns ± 0% ~ (p=0.413 n=9+9) TrailingZeros8-4 8.32ns ± 0% 7.17ns ± 0% -13.77% (p=0.000 n=10+9) TrailingZeros16-4 8.30ns ± 0% 7.18ns ± 0% -13.50% (p=0.000 n=9+10) TrailingZeros32-4 6.46ns ± 1% 6.47ns ± 1% ~ (p=0.325 n=10+10) TrailingZeros64-4 16.3ns ± 0% 16.2ns ± 0% -0.61% (p=0.000 n=7+10) Change-Id: I7e9e1abf7e30d811aa474d272b2824ec7cbbaa98 Reviewed-on: https://go-review.googlesource.com/c/go/+/167797 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/ssa.go | 8 +- src/cmd/compile/internal/ssa/gen/ARM.rules | 11 +- src/cmd/compile/internal/ssa/rewriteARM.go | 140 +++++++++++++++++++++ test/codegen/mathbits.go | 4 + 4 files changed, 158 insertions(+), 5 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 62301642f5..3ccb59e105 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3288,12 +3288,12 @@ func init() { y := s.newValue2(ssa.OpOr32, types.Types[TUINT32], x, c) return s.newValue1(ssa.OpCtz32, types.Types[TINT], y) }, - sys.ARM, sys.MIPS) + sys.MIPS) addF("math/bits", "TrailingZeros16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz16, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.Wasm) + sys.AMD64, sys.ARM, sys.ARM64, sys.Wasm) addF("math/bits", "TrailingZeros16", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt16to64, types.Types[TUINT64], args[0]) @@ -3309,12 +3309,12 @@ func init() { y := s.newValue2(ssa.OpOr32, types.Types[TUINT32], x, c) return s.newValue1(ssa.OpCtz32, types.Types[TINT], y) }, - sys.ARM, sys.MIPS) + sys.MIPS) addF("math/bits", "TrailingZeros8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue1(ssa.OpCtz8, types.Types[TINT], args[0]) }, - sys.AMD64, sys.ARM64, sys.Wasm) + sys.AMD64, sys.ARM, sys.ARM64, sys.Wasm) addF("math/bits", "TrailingZeros8", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { x := s.newValue1(ssa.OpZeroExt8to64, types.Types[TUINT64], args[0]) diff --git a/src/cmd/compile/internal/ssa/gen/ARM.rules b/src/cmd/compile/internal/ssa/gen/ARM.rules index db418b76a6..a3f36d3009 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM.rules @@ -59,13 +59,22 @@ // TODO: optimize this for ARMv5 and ARMv6 (Ctz32NonZero x) -> (Ctz32 x) +(Ctz16NonZero x) -> (Ctz32 x) +(Ctz8NonZero x) -> (Ctz32 x) // count trailing zero for ARMv5 and ARMv6 // 32 - CLZ(x&-x - 1) -(Ctz32 x) && objabi.GOARM<=6 -> (RSBconst [32] (CLZ (SUBconst (AND x (RSBconst [0] x)) [1]))) +(Ctz32 x) && objabi.GOARM<=6 -> + (RSBconst [32] (CLZ (SUBconst (AND x (RSBconst [0] x)) [1]))) +(Ctz16 x) && objabi.GOARM<=6 -> + (RSBconst [32] (CLZ (SUBconst (AND (ORconst [0x10000] x) (RSBconst [0] (ORconst [0x10000] x))) [1]))) +(Ctz8 x) && objabi.GOARM<=6 -> + (RSBconst [32] (CLZ (SUBconst (AND (ORconst [0x100] x) (RSBconst [0] (ORconst [0x100] x))) [1]))) // count trailing zero for ARMv7 (Ctz32 x) && objabi.GOARM==7 -> (CLZ (RBIT x)) +(Ctz16 x) && objabi.GOARM==7 -> (CLZ (RBIT (ORconst [0x10000] x))) +(Ctz8 x) && objabi.GOARM==7 -> (CLZ (RBIT (ORconst [0x100] x))) // bit length (BitLen32 x) -> (RSBconst [32] (CLZ x)) diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index e6635ad6b5..37a34a9977 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -483,10 +483,18 @@ func rewriteValueARM(v *Value) bool { return rewriteValueARM_OpConstBool_0(v) case OpConstNil: return rewriteValueARM_OpConstNil_0(v) + case OpCtz16: + return rewriteValueARM_OpCtz16_0(v) + case OpCtz16NonZero: + return rewriteValueARM_OpCtz16NonZero_0(v) case OpCtz32: return rewriteValueARM_OpCtz32_0(v) case OpCtz32NonZero: return rewriteValueARM_OpCtz32NonZero_0(v) + case OpCtz8: + return rewriteValueARM_OpCtz8_0(v) + case OpCtz8NonZero: + return rewriteValueARM_OpCtz8NonZero_0(v) case OpCvt32Fto32: return rewriteValueARM_OpCvt32Fto32_0(v) case OpCvt32Fto32U: @@ -17550,6 +17558,72 @@ func rewriteValueARM_OpConstNil_0(v *Value) bool { return true } } +func rewriteValueARM_OpCtz16_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Ctz16 x) + // cond: objabi.GOARM<=6 + // result: (RSBconst [32] (CLZ (SUBconst (AND (ORconst [0x10000] x) (RSBconst [0] (ORconst [0x10000] x))) [1]))) + for { + t := v.Type + x := v.Args[0] + if !(objabi.GOARM <= 6) { + break + } + v.reset(OpARMRSBconst) + v.AuxInt = 32 + v0 := b.NewValue0(v.Pos, OpARMCLZ, t) + v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) + v1.AuxInt = 1 + v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v3.AuxInt = 0x10000 + v3.AddArg(x) + v2.AddArg(v3) + v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) + v4.AuxInt = 0 + v5 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v5.AuxInt = 0x10000 + v5.AddArg(x) + v4.AddArg(v5) + v2.AddArg(v4) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + // match: (Ctz16 x) + // cond: objabi.GOARM==7 + // result: (CLZ (RBIT (ORconst [0x10000] x))) + for { + t := v.Type + x := v.Args[0] + if !(objabi.GOARM == 7) { + break + } + v.reset(OpARMCLZ) + v.Type = t + v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v1.AuxInt = 0x10000 + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + return false +} +func rewriteValueARM_OpCtz16NonZero_0(v *Value) bool { + // match: (Ctz16NonZero x) + // cond: + // result: (Ctz32 x) + for { + x := v.Args[0] + v.reset(OpCtz32) + v.AddArg(x) + return true + } +} func rewriteValueARM_OpCtz32_0(v *Value) bool { b := v.Block // match: (Ctz32 x) @@ -17606,6 +17680,72 @@ func rewriteValueARM_OpCtz32NonZero_0(v *Value) bool { return true } } +func rewriteValueARM_OpCtz8_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Ctz8 x) + // cond: objabi.GOARM<=6 + // result: (RSBconst [32] (CLZ (SUBconst (AND (ORconst [0x100] x) (RSBconst [0] (ORconst [0x100] x))) [1]))) + for { + t := v.Type + x := v.Args[0] + if !(objabi.GOARM <= 6) { + break + } + v.reset(OpARMRSBconst) + v.AuxInt = 32 + v0 := b.NewValue0(v.Pos, OpARMCLZ, t) + v1 := b.NewValue0(v.Pos, OpARMSUBconst, typ.UInt32) + v1.AuxInt = 1 + v2 := b.NewValue0(v.Pos, OpARMAND, typ.UInt32) + v3 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v3.AuxInt = 0x100 + v3.AddArg(x) + v2.AddArg(v3) + v4 := b.NewValue0(v.Pos, OpARMRSBconst, typ.UInt32) + v4.AuxInt = 0 + v5 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v5.AuxInt = 0x100 + v5.AddArg(x) + v4.AddArg(v5) + v2.AddArg(v4) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + // match: (Ctz8 x) + // cond: objabi.GOARM==7 + // result: (CLZ (RBIT (ORconst [0x100] x))) + for { + t := v.Type + x := v.Args[0] + if !(objabi.GOARM == 7) { + break + } + v.reset(OpARMCLZ) + v.Type = t + v0 := b.NewValue0(v.Pos, OpARMRBIT, typ.UInt32) + v1 := b.NewValue0(v.Pos, OpARMORconst, typ.UInt32) + v1.AuxInt = 0x100 + v1.AddArg(x) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + return false +} +func rewriteValueARM_OpCtz8NonZero_0(v *Value) bool { + // match: (Ctz8NonZero x) + // cond: + // result: (Ctz32 x) + for { + x := v.Args[0] + v.reset(OpCtz32) + v.AddArg(x) + return true + } +} func rewriteValueARM_OpCvt32Fto32_0(v *Value) bool { // match: (Cvt32Fto32 x) // cond: diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 9a4051a0ce..3d5f1f64c8 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -258,6 +258,7 @@ func RotateLeftVariable32(n uint32, m int) uint32 { func TrailingZeros(n uint) int { // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" + // arm:"CLZ" // arm64:"RBIT","CLZ" // s390x:"FLOGR" // ppc64:"ANDN","POPCNTD" @@ -278,6 +279,7 @@ func TrailingZeros64(n uint64) int { func TrailingZeros32(n uint32) int { // amd64:"BTSQ\\t\\$32","BSFQ" + // arm:"CLZ" // arm64:"RBITW","CLZW" // s390x:"FLOGR","MOVWZ" // ppc64:"ANDN","POPCNTW" @@ -288,6 +290,7 @@ func TrailingZeros32(n uint32) int { func TrailingZeros16(n uint16) int { // amd64:"BSFL","BTSL\\t\\$16" + // arm:"ORR\t\\$65536","CLZ",-"MOVHU\tR" // arm64:"ORR\t\\$65536","RBITW","CLZW",-"MOVHU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$65536" // ppc64:"POPCNTD","OR\\t\\$65536" @@ -298,6 +301,7 @@ func TrailingZeros16(n uint16) int { func TrailingZeros8(n uint8) int { // amd64:"BSFL","BTSL\\t\\$8" + // arm:"ORR\t\\$256","CLZ",-"MOVBU\tR" // arm64:"ORR\t\\$256","RBITW","CLZW",-"MOVBU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$256" // wasm:"I64Ctz" -- GitLab From 64b1889e2d98e336160cad337a7781c720696290 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 15 Mar 2019 13:58:21 -0400 Subject: [PATCH 0483/1679] test: new test for issue 30862 New test case, inspired by gccgo issue 30862. Updates #30862. Change-Id: I5e494b877e4fd142b8facb527471fe1fdef39c61 Reviewed-on: https://go-review.googlesource.com/c/go/+/167744 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- test/fixedbugs/issue30862.dir/a.go | 15 ++++++++++++++ test/fixedbugs/issue30862.dir/b.go | 29 +++++++++++++++++++++++++++ test/fixedbugs/issue30862.dir/main.go | 28 ++++++++++++++++++++++++++ test/fixedbugs/issue30862.go | 14 +++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 test/fixedbugs/issue30862.dir/a.go create mode 100644 test/fixedbugs/issue30862.dir/b.go create mode 100644 test/fixedbugs/issue30862.dir/main.go create mode 100644 test/fixedbugs/issue30862.go diff --git a/test/fixedbugs/issue30862.dir/a.go b/test/fixedbugs/issue30862.dir/a.go new file mode 100644 index 0000000000..c23f4de1ef --- /dev/null +++ b/test/fixedbugs/issue30862.dir/a.go @@ -0,0 +1,15 @@ +// Copyright 2019 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 a + +var pl int + +type NoitfStruct struct { + F int + G int +} + +//go:nointerface +func (t *NoitfStruct) NoInterfaceMethod() {} diff --git a/test/fixedbugs/issue30862.dir/b.go b/test/fixedbugs/issue30862.dir/b.go new file mode 100644 index 0000000000..3e501bb8dc --- /dev/null +++ b/test/fixedbugs/issue30862.dir/b.go @@ -0,0 +1,29 @@ +// Copyright 2019 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 b + +import "./a" + +type EmbedImported struct { + a.NoitfStruct +} + +func Test() []string { + bad := []string{} + x := interface{}(new(a.NoitfStruct)) + if _, ok := x.(interface { + NoInterfaceMethod() + }); ok { + bad = append(bad, "fail 1") + } + + x = interface{}(new(EmbedImported)) + if _, ok := x.(interface { + NoInterfaceMethod() + }); ok { + bad = append(bad, "fail 2") + } + return bad +} diff --git a/test/fixedbugs/issue30862.dir/main.go b/test/fixedbugs/issue30862.dir/main.go new file mode 100644 index 0000000000..80db0e13a8 --- /dev/null +++ b/test/fixedbugs/issue30862.dir/main.go @@ -0,0 +1,28 @@ +// Copyright 2019 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 main + +import ( + "fmt" + "os" + + "./b" +) + +// Test case for issue 30862. + +// Be aware that unless GOEXPERIMENT=fieldtrack is set when building +// the compiler, this test will fail if executed with a regular GC +// compiler. + +func main() { + bad := b.Test() + if len(bad) > 0 { + for _, s := range bad { + fmt.Fprintf(os.Stderr, "test failed: %s\n", s) + } + os.Exit(1) + } +} diff --git a/test/fixedbugs/issue30862.go b/test/fixedbugs/issue30862.go new file mode 100644 index 0000000000..ba122cc3c8 --- /dev/null +++ b/test/fixedbugs/issue30862.go @@ -0,0 +1,14 @@ +// rundir + +// Copyright 2019 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. + +// Test case for issue 30862. This test as written will +// fail for the main 'gc' compiler unless GOEXPERIMENT=fieldtrack +// is set when building it, whereas gccgo has field tracking +// enabled by default (hence the build tag below). + +// +build gccgo + +package ignored -- GitLab From 37e4a61d26d3b10aa11c5155b72c6bc882bd3122 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Mar 2019 09:10:09 -0400 Subject: [PATCH 0484/1679] cmd/go/internal/cache: remove log.txt from the cache directory Also remove an existing log.txt in the cache directory during 'go clean -cache' if it exists. Fixes #25323 Change-Id: I1c6e20554db0edc6d850a7b4379d71ef5844eaea Reviewed-on: https://go-review.googlesource.com/c/go/+/167741 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/cache/cache.go | 10 ----- src/cmd/go/internal/cache/cache_test.go | 49 ------------------------- src/cmd/go/internal/clean/clean.go | 8 +++- 3 files changed, 7 insertions(+), 60 deletions(-) diff --git a/src/cmd/go/internal/cache/cache.go b/src/cmd/go/internal/cache/cache.go index ab84cf6302..3e386a0881 100644 --- a/src/cmd/go/internal/cache/cache.go +++ b/src/cmd/go/internal/cache/cache.go @@ -33,7 +33,6 @@ type OutputID [HashSize]byte // A Cache is a package cache, backed by a file system directory tree. type Cache struct { dir string - log *os.File now func() time.Time } @@ -63,13 +62,8 @@ func Open(dir string) (*Cache, error) { return nil, err } } - f, err := os.OpenFile(filepath.Join(dir, "log.txt"), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) - if err != nil { - return nil, err - } c := &Cache{ dir: dir, - log: f, now: time.Now, } return c, nil @@ -141,7 +135,6 @@ type Entry struct { // get is Get but does not respect verify mode, so that Put can use it. func (c *Cache) get(id ActionID) (Entry, error) { missing := func() (Entry, error) { - fmt.Fprintf(c.log, "%d miss %x\n", c.now().Unix(), id) return Entry{}, errMissing } f, err := os.Open(c.fileName(id, "a")) @@ -184,8 +177,6 @@ func (c *Cache) get(id ActionID) (Entry, error) { return missing() } - fmt.Fprintf(c.log, "%d get %x\n", c.now().Unix(), id) - c.used(c.fileName(id, "a")) return Entry{buf, size, time.Unix(0, tm)}, nil @@ -349,7 +340,6 @@ func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify } os.Chtimes(file, c.now(), c.now()) // mainly for tests - fmt.Fprintf(c.log, "%d put %x %x %d\n", c.now().Unix(), id, out, size) return nil } diff --git a/src/cmd/go/internal/cache/cache_test.go b/src/cmd/go/internal/cache/cache_test.go index d3dafccd13..7229bc4cec 100644 --- a/src/cmd/go/internal/cache/cache_test.go +++ b/src/cmd/go/internal/cache/cache_test.go @@ -144,55 +144,6 @@ func TestVerifyPanic(t *testing.T) { t.Fatal("mismatched Put did not panic in verify mode") } -func TestCacheLog(t *testing.T) { - dir, err := ioutil.TempDir("", "cachetest-") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - c, err := Open(dir) - if err != nil { - t.Fatalf("Open: %v", err) - } - c.now = func() time.Time { return time.Unix(1e9, 0) } - - id := ActionID(dummyID(1)) - c.Get(id) - c.PutBytes(id, []byte("abc")) - c.Get(id) - - c, err = Open(dir) - if err != nil { - t.Fatalf("Open #2: %v", err) - } - c.now = func() time.Time { return time.Unix(1e9+1, 0) } - c.Get(id) - - id2 := ActionID(dummyID(2)) - c.Get(id2) - c.PutBytes(id2, []byte("abc")) - c.Get(id2) - c.Get(id) - - data, err := ioutil.ReadFile(filepath.Join(dir, "log.txt")) - if err != nil { - t.Fatal(err) - } - want := `1000000000 miss 0100000000000000000000000000000000000000000000000000000000000000 -1000000000 put 0100000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3 -1000000000 get 0100000000000000000000000000000000000000000000000000000000000000 -1000000001 get 0100000000000000000000000000000000000000000000000000000000000000 -1000000001 miss 0200000000000000000000000000000000000000000000000000000000000000 -1000000001 put 0200000000000000000000000000000000000000000000000000000000000000 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad 3 -1000000001 get 0200000000000000000000000000000000000000000000000000000000000000 -1000000001 get 0100000000000000000000000000000000000000000000000000000000000000 -` - if string(data) != want { - t.Fatalf("log:\n%s\nwant:\n%s", string(data), want) - } -} - func dummyID(x int) [HashSize]byte { var out [HashSize]byte binary.LittleEndian.PutUint64(out[:], uint64(x)) diff --git a/src/cmd/go/internal/clean/clean.go b/src/cmd/go/internal/clean/clean.go index 3389d5f18b..f7d80ff6dc 100644 --- a/src/cmd/go/internal/clean/clean.go +++ b/src/cmd/go/internal/clean/clean.go @@ -132,11 +132,11 @@ func runClean(cmd *base.Command, args []string) { // and not something that we want to remove. Also, we'd like to preserve // the access log for future analysis, even if the cache is cleared. subdirs, _ := filepath.Glob(filepath.Join(dir, "[0-9a-f][0-9a-f]")) + printedErrors := false if len(subdirs) > 0 { if cfg.BuildN || cfg.BuildX { b.Showcmd("", "rm -r %s", strings.Join(subdirs, " ")) } - printedErrors := false for _, d := range subdirs { // Only print the first error - there may be many. // This also mimics what os.RemoveAll(dir) would do. @@ -146,6 +146,12 @@ func runClean(cmd *base.Command, args []string) { } } } + + logFile := filepath.Join(dir, "log.txt") + if err := os.RemoveAll(logFile); err != nil && !printedErrors { + printedErrors = true + base.Errorf("go clean -cache: %v", err) + } } } -- GitLab From 356f5a117641711e8ef6df731dfeefefbe2fe3e3 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 5 Mar 2019 14:53:03 -0500 Subject: [PATCH 0485/1679] cmd/go: list directories in module cache replacements "go list" has allowed listing directory paths to packages in the module cache since CL 126715. This is sometimes necessary for tools gathering package information about source files in imported packages. With this change, we only allow directories in the module cache for modules in the build list after replacements are applied. Previously, we ignored replacements when expanding file system path patterns while constructing the build list. Fixes #29548 Change-Id: Ic7f89122c4656c8967c14545cb7117f98e89e721 Reviewed-on: https://go-review.googlesource.com/c/go/+/165381 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/load.go | 13 ++++++++++++- .../testdata/script/mod_list_replace_dir.txt | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/script/mod_list_replace_dir.txt diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 33b53052d8..71b7308c0d 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -212,7 +212,18 @@ func ImportPaths(patterns []string) []*search.Match { // if dir is in the module cache copy of a module in our build list. func pathInModuleCache(dir string) string { for _, m := range buildList[1:] { - root, err := modfetch.DownloadDir(m) + var root string + var err error + if repl := Replacement(m); repl.Path != "" && repl.Version == "" { + root = repl.Path + if !filepath.IsAbs(root) { + root = filepath.Join(ModRoot(), root) + } + } else if repl.Path != "" { + root, err = modfetch.DownloadDir(repl) + } else { + root, err = modfetch.DownloadDir(m) + } if err != nil { continue } diff --git a/src/cmd/go/testdata/script/mod_list_replace_dir.txt b/src/cmd/go/testdata/script/mod_list_replace_dir.txt new file mode 100644 index 0000000000..37de8825e0 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_list_replace_dir.txt @@ -0,0 +1,19 @@ +# Test that "go list" succeeds when given a directory in a replacement +# module within the module cache. +# Verifies golang.org/issue/29548 + +env GO111MODULE=on +go mod download + +! go list $GOPATH/pkg/mod/rsc.io/quote@v1.5.2 +stderr 'outside available modules' + +go list $GOPATH/pkg/mod/rsc.io/quote@v1.5.1 +stdout 'rsc.io/quote' + +-- go.mod -- +module example.com/quoter + +require rsc.io/quote v1.5.2 + +replace rsc.io/quote => rsc.io/quote v1.5.1 -- GitLab From 7765576e09cdc04f57afe0bc71f100c234b104d2 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sat, 16 Mar 2019 09:47:17 +1100 Subject: [PATCH 0486/1679] cmd/go: skip broken TestScript/build_acl_windows on arm Updates #30711 Change-Id: I280f7effaf488d5d9908d9d0cd1e0e99c22f91ca Reviewed-on: https://go-review.googlesource.com/c/go/+/167778 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/go/testdata/script/build_acl_windows.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cmd/go/testdata/script/build_acl_windows.txt b/src/cmd/go/testdata/script/build_acl_windows.txt index 13a3ba226a..21b8879a11 100644 --- a/src/cmd/go/testdata/script/build_acl_windows.txt +++ b/src/cmd/go/testdata/script/build_acl_windows.txt @@ -1,4 +1,5 @@ [!windows] stop +[arm] skip # TODO(golang.org/issue/30711): Skip broken test. [!exec:icacls] skip [!exec:powershell] skip -- GitLab From 14c3692502be68275a8deb9c19dabbbd510a4f31 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sat, 16 Mar 2019 14:05:00 +0100 Subject: [PATCH 0487/1679] cmd/dist: reenable testing of Examples for js/wasm Testing Examples for js/wasm is supported as of ac56baa, so we can reenable them. This reverts CL 119377 (commit 9a91713). Fixes #25933 Change-Id: I0f228a3ec385dbe9573d3c33e42dccd4488d7152 Reviewed-on: https://go-review.googlesource.com/c/go/+/167800 Reviewed-by: Brad Fitzpatrick --- src/cmd/dist/test.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 9e7205f56e..5ecef4494d 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -326,8 +326,6 @@ func (t *tester) registerStdTest(pkg string) { } if t.compileOnly { args = append(args, "-run=^$") - } else if goos == "js" && goarch == "wasm" { - args = append(args, "-run=^Test") // exclude examples; Issue 25913 } args = append(args, stdMatches...) cmd := exec.Command("go", args...) @@ -1270,9 +1268,6 @@ func (t *tester) runFlag(rx string) string { if t.compileOnly { return "-run=^$" } - if rx == "" && goos == "js" && goarch == "wasm" { - return "-run=^Test" // exclude examples; Issue 25913 - } return "-run=" + rx } -- GitLab From 746f405f98ab8ad6e2e6a1ce162c831527aafd57 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 Mar 2019 16:07:25 +0100 Subject: [PATCH 0488/1679] cmd/go,misc/ios: fix tests on iOS Now that modules are always on, cmd/go tests require a valid GOCACHE. However, on iOS where the go tool is not available, the cmd/go test driver ends up setting GOCACHE to the empty string. Fix it by falling back to the builtin default cache directory. The iOS exec wrapper passes the environment variables to the app on the device, including $HOME used for the default cache directory. Skip $HOME to let the device specific and writable $HOME be used instead. Should fix cmd/go on the iOS builders that broke when GO111MODULE defaulted to on. Change-Id: I0939f5b8aaa1d2db95e64c99f4130eee2d0b4d4d Reviewed-on: https://go-review.googlesource.com/c/go/+/167938 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/ios/go_darwin_arm_exec.go | 4 ++-- src/cmd/go/go_test.go | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/misc/ios/go_darwin_arm_exec.go b/misc/ios/go_darwin_arm_exec.go index 6a3d9def68..8912d1e8fc 100644 --- a/misc/ios/go_darwin_arm_exec.go +++ b/misc/ios/go_darwin_arm_exec.go @@ -467,8 +467,8 @@ func idevCmd(cmd *exec.Cmd) *exec.Cmd { func run(appdir, bundleID string, args []string) error { var env []string for _, e := range os.Environ() { - // Don't override TMPDIR on the device. - if strings.HasPrefix(e, "TMPDIR=") { + // Don't override TMPDIR, HOME on the device. + if strings.HasPrefix(e, "TMPDIR=") || strings.HasPrefix(e, "HOME=") { continue } env = append(env, e) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 60e02e7532..faf953ddeb 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -6,6 +6,7 @@ package main_test import ( "bytes" + "cmd/go/internal/cache" "cmd/internal/sys" "context" "debug/elf" @@ -166,6 +167,7 @@ func TestMain(m *testing.M) { defer removeAll(testTmpDir) } + testGOCACHE = cache.DefaultDir() if canRun { testBin = filepath.Join(testTmpDir, "testbin") if err := os.Mkdir(testBin, 0777); err != nil { -- GitLab From a734601bdf8a3e26c76afc42ffdc918ced687b7a Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 14 Mar 2019 11:35:53 +0100 Subject: [PATCH 0489/1679] internal/bytealg: use word-wise comparison for Equal on arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow CL 165338 and use word-wise comparison for aligned buffers in Equal on arm, otherwise fall back to the current byte-wise comparison. name old time/op new time/op delta Equal/0-4 25.7ns ± 1% 23.5ns ± 1% -8.78% (p=0.000 n=10+10) Equal/1-4 65.8ns ± 0% 60.1ns ± 1% -8.69% (p=0.000 n=10+9) Equal/6-4 82.9ns ± 1% 86.7ns ± 0% +4.59% (p=0.000 n=10+10) Equal/9-4 90.0ns ± 0% 101.0ns ± 0% +12.18% (p=0.000 n=9+10) Equal/15-4 108ns ± 0% 119ns ± 0% +10.19% (p=0.000 n=8+8) Equal/16-4 111ns ± 0% 82ns ± 0% -26.37% (p=0.000 n=8+10) Equal/20-4 124ns ± 1% 87ns ± 1% -29.94% (p=0.000 n=9+10) Equal/32-4 160ns ± 1% 97ns ± 1% -39.40% (p=0.000 n=10+10) Equal/4K-4 14.0µs ± 0% 3.6µs ± 1% -74.57% (p=0.000 n=9+10) Equal/4M-4 12.8ms ± 1% 3.2ms ± 0% -74.93% (p=0.000 n=9+9) Equal/64M-4 204ms ± 1% 51ms ± 0% -74.78% (p=0.000 n=10+10) EqualPort/1-4 47.0ns ± 1% 46.8ns ± 0% -0.40% (p=0.015 n=10+6) EqualPort/6-4 82.6ns ± 1% 81.9ns ± 1% -0.87% (p=0.002 n=10+10) EqualPort/32-4 232ns ± 0% 232ns ± 0% ~ (p=0.496 n=8+10) EqualPort/4K-4 29.0µs ± 1% 29.0µs ± 1% ~ (p=0.604 n=9+10) EqualPort/4M-4 24.0ms ± 1% 23.8ms ± 0% -0.65% (p=0.001 n=9+9) EqualPort/64M-4 383ms ± 1% 382ms ± 0% ~ (p=0.218 n=10+10) CompareBytesEqual-4 61.2ns ± 1% 61.0ns ± 1% ~ (p=0.539 n=10+10) name old speed new speed delta Equal/1-4 15.2MB/s ± 0% 16.6MB/s ± 1% +9.52% (p=0.000 n=10+9) Equal/6-4 72.4MB/s ± 1% 69.2MB/s ± 0% -4.40% (p=0.000 n=10+10) Equal/9-4 100MB/s ± 0% 89MB/s ± 0% -11.40% (p=0.000 n=9+10) Equal/15-4 138MB/s ± 1% 125MB/s ± 1% -9.41% (p=0.000 n=10+10) Equal/16-4 144MB/s ± 1% 196MB/s ± 0% +36.41% (p=0.000 n=10+10) Equal/20-4 162MB/s ± 1% 231MB/s ± 1% +42.98% (p=0.000 n=9+10) Equal/32-4 200MB/s ± 1% 331MB/s ± 1% +65.64% (p=0.000 n=10+10) Equal/4K-4 292MB/s ± 0% 1149MB/s ± 1% +293.19% (p=0.000 n=9+10) Equal/4M-4 328MB/s ± 1% 1307MB/s ± 0% +298.87% (p=0.000 n=9+9) Equal/64M-4 329MB/s ± 1% 1306MB/s ± 0% +296.56% (p=0.000 n=10+10) EqualPort/1-4 21.3MB/s ± 1% 21.4MB/s ± 0% +0.42% (p=0.002 n=10+9) EqualPort/6-4 72.6MB/s ± 1% 73.2MB/s ± 1% +0.87% (p=0.003 n=10+10) EqualPort/32-4 138MB/s ± 0% 138MB/s ± 0% ~ (p=0.953 n=9+10) EqualPort/4K-4 141MB/s ± 1% 141MB/s ± 1% ~ (p=0.382 n=10+10) EqualPort/4M-4 175MB/s ± 1% 176MB/s ± 0% +0.65% (p=0.001 n=9+9) EqualPort/64M-4 175MB/s ± 1% 176MB/s ± 0% ~ (p=0.225 n=10+10) The 5-12% decrease in performance on Equal/{6,9,15} are due to the benchmarks splitting the bytes buffer in half. The b argument to Equal then ends up being unaligned and thus the fast word-wise compare doesn't kick in. Updates #29001 Change-Id: I73be501c18e67d211ed19da7771b4f254254e609 Reviewed-on: https://go-review.googlesource.com/c/go/+/167557 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/internal/bytealg/equal_arm.s | 57 +++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/src/internal/bytealg/equal_arm.s b/src/internal/bytealg/equal_arm.s index d829f2bcdc..b8f2b69bbe 100644 --- a/src/internal/bytealg/equal_arm.s +++ b/src/internal/bytealg/equal_arm.s @@ -8,14 +8,19 @@ TEXT ·Equal(SB),NOSPLIT,$0-25 MOVW a_len+4(FP), R1 MOVW b_len+16(FP), R3 - CMP R1, R3 // unequal lengths are not equal B.NE notequal + CMP $0, R1 // short path to handle 0-byte case + B.EQ equal MOVW a_base+0(FP), R0 MOVW b_base+12(FP), R2 MOVW $ret+24(FP), R7 B memeqbody<>(SB) +equal: + MOVW $1, R0 + MOVB R0, ret+24(FP) + RET notequal: MOVW $0, R0 MOVBU R0, ret+24(FP) @@ -28,6 +33,8 @@ TEXT runtime·memequal(SB),NOSPLIT|NOFRAME,$0-13 CMP R0, R2 B.EQ eq MOVW size+8(FP), R1 + CMP $0, R1 + B.EQ eq // short path to handle 0-byte case MOVW $ret+12(FP), R7 B memeqbody<>(SB) eq: @@ -41,7 +48,9 @@ TEXT runtime·memequal_varlen(SB),NOSPLIT|NOFRAME,$0-9 MOVW b+4(FP), R2 CMP R0, R2 B.EQ eq - MOVW 4(R7), R1 // compiler stores size at offset 4 in the closure + MOVW 4(R7), R1 // compiler stores size at offset 4 in the closure + CMP $0, R1 + B.EQ eq // short path to handle 0-byte case MOVW $ret+8(FP), R7 B memeqbody<>(SB) eq: @@ -54,20 +63,50 @@ eq: // R1: length // R2: data of b // R7: points to return value +// +// On exit: +// R4, R5 and R6 are clobbered TEXT memeqbody<>(SB),NOSPLIT|NOFRAME,$0-0 - ADD R0, R1 // end -loop: + CMP $1, R1 + B.EQ one // 1-byte special case for better performance + + CMP $4, R1 + ADD R0, R1 // R1 is the end of the range to compare + B.LT byte_loop // length < 4 + AND $3, R0, R6 + CMP $0, R6 + B.NE byte_loop // unaligned a, use byte-wise compare (TODO: try to align a) + AND $3, R2, R6 + CMP $0, R6 + B.NE byte_loop // unaligned b, use byte-wise compare + AND $0xfffffffc, R1, R6 + // length >= 4 +chunk4_loop: + MOVW.P 4(R0), R4 + MOVW.P 4(R2), R5 + CMP R4, R5 + B.NE notequal + CMP R0, R6 + B.NE chunk4_loop CMP R0, R1 B.EQ equal // reached the end +byte_loop: MOVBU.P 1(R0), R4 MOVBU.P 1(R2), R5 CMP R4, R5 - B.EQ loop -notequal: - MOVW $0, R0 - MOVB R0, (R7) - RET + B.NE notequal + CMP R0, R1 + B.NE byte_loop equal: MOVW $1, R0 MOVB R0, (R7) RET +one: + MOVBU (R0), R4 + MOVBU (R2), R5 + CMP R4, R5 + B.EQ equal +notequal: + MOVW $0, R0 + MOVB R0, (R7) + RET -- GitLab From bedb6a18d855d1968a685ccd90c81a43b3def9fa Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 Mar 2019 16:01:27 +0100 Subject: [PATCH 0490/1679] os: only fallback to root directory if $HOME fails for UserHomeDir UserHomeDir always returns "/" for platforms where the home directory is not always well defined. However, the user might set HOME before running a Go program on those platforms and on at least iOS, HOME is actually set to something useful (the root of the app specific writable directory). This CL changes UserHomeDir to use the root directory "/" only if $HOME is empty. Change-Id: Icaa01de53cd585d527d9a23b1629375d6b7f67e9 Reviewed-on: https://go-review.googlesource.com/c/go/+/167802 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/os/file.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/os/file.go b/src/os/file.go index d880a37569..5f715f4275 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -445,6 +445,12 @@ func UserHomeDir() (string, error) { env, enverr = "USERPROFILE", "%userprofile%" case "plan9": env, enverr = "home", "$home" + } + if v := Getenv(env); v != "" { + return v, nil + } + // On some geese the home directory is not always defined. + switch runtime.GOOS { case "nacl", "android": return "/", nil case "darwin": @@ -452,9 +458,6 @@ func UserHomeDir() (string, error) { return "/", nil } } - if v := Getenv(env); v != "" { - return v, nil - } return "", errors.New(enverr + " is not defined") } -- GitLab From 3496ff1d1905fca857e009584f4c9a15481739d6 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 17 Mar 2019 22:39:42 +0100 Subject: [PATCH 0491/1679] internal/bytealg: share code for IndexByte functions on arm Move the shared code of IndexByte and IndexByteString into indexbytebody. This will allow to implement optimizations (e.g. for #29001) in a single function. Change-Id: I1d550da8eb65f95e492a460a12058cc35b1162b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/167939 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/internal/bytealg/indexbyte_arm.s | 42 +++++++++++----------------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/src/internal/bytealg/indexbyte_arm.s b/src/internal/bytealg/indexbyte_arm.s index 7d9bbb183d..faf97977a6 100644 --- a/src/internal/bytealg/indexbyte_arm.s +++ b/src/internal/bytealg/indexbyte_arm.s @@ -9,46 +9,38 @@ TEXT ·IndexByte(SB),NOSPLIT,$0-20 MOVW b_base+0(FP), R0 MOVW b_len+4(FP), R1 MOVBU c+12(FP), R2 // byte to find - MOVW R0, R4 // store base for later - ADD R0, R1 // end - -_loop: - CMP R0, R1 - B.EQ _notfound - MOVBU.P 1(R0), R3 - CMP R2, R3 - B.NE _loop - - SUB $1, R0 // R0 will be one beyond the position we want - SUB R4, R0 // remove base - MOVW R0, ret+16(FP) - RET - -_notfound: - MOVW $-1, R0 - MOVW R0, ret+16(FP) - RET + MOVW $ret+16(FP), R5 + B indexbytebody<>(SB) TEXT ·IndexByteString(SB),NOSPLIT,$0-16 MOVW s_base+0(FP), R0 MOVW s_len+4(FP), R1 MOVBU c+8(FP), R2 // byte to find + MOVW $ret+12(FP), R5 + B indexbytebody<>(SB) + +// input: +// R0: data +// R1: data length +// R2: byte to find +// R5: address to put result +TEXT indexbytebody<>(SB),NOSPLIT,$0-0 MOVW R0, R4 // store base for later ADD R0, R1 // end -_sib_loop: +loop: CMP R0, R1 - B.EQ _sib_notfound + B.EQ notfound MOVBU.P 1(R0), R3 CMP R2, R3 - B.NE _sib_loop + B.NE loop SUB $1, R0 // R0 will be one beyond the position we want SUB R4, R0 // remove base - MOVW R0, ret+12(FP) + MOVW R0, (R5) RET -_sib_notfound: +notfound: MOVW $-1, R0 - MOVW R0, ret+12(FP) + MOVW R0, (R5) RET -- GitLab From e5f6e2d1c8ae540504e1728a5449af3715bf27eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 17 Mar 2019 22:45:30 +0000 Subject: [PATCH 0492/1679] encoding/json: fix performance regression in the decoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In golang.org/cl/145218, a feature was added where the JSON decoder would keep track of the entire path to a field when reporting an UnmarshalTypeError. However, we all failed to check if this affected the benchmarks - myself included, as a reviewer. Below are the numbers comparing the CL's parent with itself, once it was merged: name old time/op new time/op delta CodeDecoder-8 12.9ms ± 1% 28.2ms ± 2% +119.33% (p=0.002 n=6+6) name old speed new speed delta CodeDecoder-8 151MB/s ± 1% 69MB/s ± 3% -54.40% (p=0.002 n=6+6) name old alloc/op new alloc/op delta CodeDecoder-8 2.74MB ± 0% 109.39MB ± 0% +3891.83% (p=0.002 n=6+6) name old allocs/op new allocs/op delta CodeDecoder-8 77.5k ± 0% 168.5k ± 0% +117.30% (p=0.004 n=6+5) The reason why the decoder got twice as slow is because it now allocated ~40x as many objects, which puts a lot of pressure on the garbage collector. The reason is that the CL concatenated strings every time a nested field was decoded. In other words, practically every field generated garbage when decoded. This is hugely wasteful, especially considering that the vast majority of JSON decoding inputs won't return UnmarshalTypeError. Instead, use a stack of fields, and make sure to always use the same backing array, to ensure we only need to grow the slice to the maximum depth once. The original CL also introduced a bug. The field stack string wasn't reset to its original state when reaching "d.opcode == scanEndObject", so the last field in a decoded struct could leak. For example, an added test decodes a list of structs, and encoding/json before this CL would fail: got: cannot unmarshal string into Go struct field T.Ts.Y.Y.Y of type int want: cannot unmarshal string into Go struct field T.Ts.Y of type int To fix that, simply reset the stack after decoding every field, even if it's the last. Below is the original performance versus this CL. There's a tiny performance hit, probably due to the append for every decoded field, but at least we're back to the usual ~150MB/s. name old time/op new time/op delta CodeDecoder-8 12.9ms ± 1% 13.0ms ± 1% +1.25% (p=0.009 n=6+6) name old speed new speed delta CodeDecoder-8 151MB/s ± 1% 149MB/s ± 1% -1.24% (p=0.009 n=6+6) name old alloc/op new alloc/op delta CodeDecoder-8 2.74MB ± 0% 2.74MB ± 0% +0.00% (p=0.002 n=6+6) name old allocs/op new allocs/op delta CodeDecoder-8 77.5k ± 0% 77.5k ± 0% +0.00% (p=0.002 n=6+6) Finally, make all of these benchmarks report allocs by default. The decoder ones are pretty sensitive to generated garbage, so ReportAllocs would have made the performance regression more obvious. Change-Id: I67b50f86b2e72f55539429450c67bfb1a9464b67 Reviewed-on: https://go-review.googlesource.com/c/go/+/167978 Reviewed-by: Brad Fitzpatrick Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- src/encoding/json/bench_test.go | 12 ++++++++++++ src/encoding/json/decode.go | 28 +++++++++++++++------------- src/encoding/json/decode_test.go | 14 +++++++++++++- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/encoding/json/bench_test.go b/src/encoding/json/bench_test.go index 72cb349062..c81ab8e993 100644 --- a/src/encoding/json/bench_test.go +++ b/src/encoding/json/bench_test.go @@ -82,6 +82,7 @@ func codeInit() { } func BenchmarkCodeEncoder(b *testing.B) { + b.ReportAllocs() if codeJSON == nil { b.StopTimer() codeInit() @@ -99,6 +100,7 @@ func BenchmarkCodeEncoder(b *testing.B) { } func BenchmarkCodeMarshal(b *testing.B) { + b.ReportAllocs() if codeJSON == nil { b.StopTimer() codeInit() @@ -133,6 +135,7 @@ func benchMarshalBytes(n int) func(*testing.B) { } func BenchmarkMarshalBytes(b *testing.B) { + b.ReportAllocs() // 32 fits within encodeState.scratch. b.Run("32", benchMarshalBytes(32)) // 256 doesn't fit in encodeState.scratch, but is small enough to @@ -143,6 +146,7 @@ func BenchmarkMarshalBytes(b *testing.B) { } func BenchmarkCodeDecoder(b *testing.B) { + b.ReportAllocs() if codeJSON == nil { b.StopTimer() codeInit() @@ -167,6 +171,7 @@ func BenchmarkCodeDecoder(b *testing.B) { } func BenchmarkUnicodeDecoder(b *testing.B) { + b.ReportAllocs() j := []byte(`"\uD83D\uDE01"`) b.SetBytes(int64(len(j))) r := bytes.NewReader(j) @@ -182,6 +187,7 @@ func BenchmarkUnicodeDecoder(b *testing.B) { } func BenchmarkDecoderStream(b *testing.B) { + b.ReportAllocs() b.StopTimer() var buf bytes.Buffer dec := NewDecoder(&buf) @@ -204,6 +210,7 @@ func BenchmarkDecoderStream(b *testing.B) { } func BenchmarkCodeUnmarshal(b *testing.B) { + b.ReportAllocs() if codeJSON == nil { b.StopTimer() codeInit() @@ -221,6 +228,7 @@ func BenchmarkCodeUnmarshal(b *testing.B) { } func BenchmarkCodeUnmarshalReuse(b *testing.B) { + b.ReportAllocs() if codeJSON == nil { b.StopTimer() codeInit() @@ -238,6 +246,7 @@ func BenchmarkCodeUnmarshalReuse(b *testing.B) { } func BenchmarkUnmarshalString(b *testing.B) { + b.ReportAllocs() data := []byte(`"hello, world"`) b.RunParallel(func(pb *testing.PB) { var s string @@ -250,6 +259,7 @@ func BenchmarkUnmarshalString(b *testing.B) { } func BenchmarkUnmarshalFloat64(b *testing.B) { + b.ReportAllocs() data := []byte(`3.14`) b.RunParallel(func(pb *testing.PB) { var f float64 @@ -262,6 +272,7 @@ func BenchmarkUnmarshalFloat64(b *testing.B) { } func BenchmarkUnmarshalInt64(b *testing.B) { + b.ReportAllocs() data := []byte(`3`) b.RunParallel(func(pb *testing.PB) { var x int64 @@ -300,6 +311,7 @@ func BenchmarkUnmapped(b *testing.B) { } func BenchmarkTypeFieldsCache(b *testing.B) { + b.ReportAllocs() var maxTypes int = 1e6 if testenv.Builder() != "" { maxTypes = 1e3 // restrict cache sizes on builders diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 3900bcc165..3f9fe1f573 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -14,6 +14,7 @@ import ( "fmt" "reflect" "strconv" + "strings" "unicode" "unicode/utf16" "unicode/utf8" @@ -266,8 +267,8 @@ type decodeState struct { opcode int // last read result scan scanner errorContext struct { // provides context for type errors - Struct reflect.Type - Field string + Struct reflect.Type + FieldStack []string } savedError error useNumber bool @@ -289,7 +290,9 @@ func (d *decodeState) init(data []byte) *decodeState { d.off = 0 d.savedError = nil d.errorContext.Struct = nil - d.errorContext.Field = "" + + // Reuse the allocated space for the FieldStack slice. + d.errorContext.FieldStack = d.errorContext.FieldStack[:0] return d } @@ -303,11 +306,11 @@ func (d *decodeState) saveError(err error) { // addErrorContext returns a new error enhanced with information from d.errorContext func (d *decodeState) addErrorContext(err error) error { - if d.errorContext.Struct != nil || d.errorContext.Field != "" { + if d.errorContext.Struct != nil || len(d.errorContext.FieldStack) > 0 { switch err := err.(type) { case *UnmarshalTypeError: err.Struct = d.errorContext.Struct.Name() - err.Field = d.errorContext.Field + err.Field = strings.Join(d.errorContext.FieldStack, ".") return err } } @@ -659,7 +662,7 @@ func (d *decodeState) object(v reflect.Value) error { } var mapElem reflect.Value - originalErrorContext := d.errorContext + origErrorContext := d.errorContext for { // Read opening " of string key or closing }. @@ -730,11 +733,7 @@ func (d *decodeState) object(v reflect.Value) error { } subv = subv.Field(i) } - if originalErrorContext.Field == "" { - d.errorContext.Field = f.name - } else { - d.errorContext.Field = originalErrorContext.Field + "." + f.name - } + d.errorContext.FieldStack = append(d.errorContext.FieldStack, f.name) d.errorContext.Struct = t } else if d.disallowUnknownFields { d.saveError(fmt.Errorf("json: unknown field %q", key)) @@ -814,14 +813,17 @@ func (d *decodeState) object(v reflect.Value) error { if d.opcode == scanSkipSpace { d.scanWhile(scanSkipSpace) } + // Reset errorContext to its original state. + // Keep the same underlying array for FieldStack, to reuse the + // space and avoid unnecessary allocs. + d.errorContext.FieldStack = d.errorContext.FieldStack[:len(origErrorContext.FieldStack)] + d.errorContext.Struct = origErrorContext.Struct if d.opcode == scanEndObject { break } if d.opcode != scanObjectValue { panic(phasePanicMsg) } - - d.errorContext = originalErrorContext } return nil } diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go index d99d65d763..8da74fa3d3 100644 --- a/src/encoding/json/decode_test.go +++ b/src/encoding/json/decode_test.go @@ -50,7 +50,8 @@ type P struct { } type PP struct { - T T + T T + Ts []T } type SS string @@ -943,6 +944,17 @@ var unmarshalTests = []unmarshalTest{ Offset: 29, }, }, + { + in: `{"Ts": [{"Y": 1}, {"Y": 2}, {"Y": "bad-type"}]}`, + ptr: new(PP), + err: &UnmarshalTypeError{ + Value: "string", + Struct: "T", + Field: "Ts.Y", + Type: reflect.TypeOf(int(0)), + Offset: 29, + }, + }, } func TestMarshal(t *testing.T) { -- GitLab From 6ca51f78978de7e6206d38b99eef8172fc8540d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20M=C3=B6hrmann?= Date: Wed, 7 Nov 2018 09:33:12 +0100 Subject: [PATCH 0493/1679] runtime: replace division by span element size by multiply and shifts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Divisions are generally slow. The compiler can optimize a division to use a sequence of faster multiplies and shifts (magic constants) if the divisor is not know at compile time. The value of the span element size in mcentral.grow is not known at compile time but magic constants to compute n / span.elementsize are already stored in class_to_divmagic and mspan. They however need to be adjusted to work for (0 <= n <= span.npages * pagesize) instead of (0 <= n < span.npages * pagesize). Change-Id: Ieea59f1c94525a88d012f2557d43691967900deb Reviewed-on: https://go-review.googlesource.com/c/go/+/148057 Run-TryBot: Martin Möhrmann TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Keith Randall --- src/runtime/mcentral.go | 8 ++++---- src/runtime/mksizeclasses.go | 4 ++-- src/runtime/sizeclasses.go | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/runtime/mcentral.go b/src/runtime/mcentral.go index a60eb9fd0c..cd5901054a 100644 --- a/src/runtime/mcentral.go +++ b/src/runtime/mcentral.go @@ -251,16 +251,16 @@ func (c *mcentral) freeSpan(s *mspan, preserve bool, wasempty bool) bool { func (c *mcentral) grow() *mspan { npages := uintptr(class_to_allocnpages[c.spanclass.sizeclass()]) size := uintptr(class_to_size[c.spanclass.sizeclass()]) - n := (npages << _PageShift) / size s := mheap_.alloc(npages, c.spanclass, false, true) if s == nil { return nil } - p := s.base() - s.limit = p + size*n - + // Use division by multiplication and shifts to quickly compute: + // n := (npages << _PageShift) / size + n := (npages << _PageShift) >> s.divShift * uintptr(s.divMul) >> s.divShift2 + s.limit = s.base() + size*n heapBitsForAddr(s.base()).initSpan(s) return s } diff --git a/src/runtime/mksizeclasses.go b/src/runtime/mksizeclasses.go index b146dbcd6c..cacbb64207 100644 --- a/src/runtime/mksizeclasses.go +++ b/src/runtime/mksizeclasses.go @@ -171,7 +171,7 @@ func makeClasses() []class { // computeDivMagic computes some magic constants to implement // the division required to compute object number from span offset. // n / c.size is implemented as n >> c.shift * c.mul >> c.shift2 -// for all 0 <= n < c.npages * pageSize +// for all 0 <= n <= c.npages * pageSize func computeDivMagic(c *class) { // divisor d := c.size @@ -180,7 +180,7 @@ func computeDivMagic(c *class) { } // maximum input value for which the formula needs to work. - max := c.npages*pageSize - 1 + max := c.npages * pageSize if powerOfTwo(d) { // If the size is a power of two, heapBitsForObject can divide even faster by masking. diff --git a/src/runtime/sizeclasses.go b/src/runtime/sizeclasses.go index 9e17b001d3..9c1b44fe0b 100644 --- a/src/runtime/sizeclasses.go +++ b/src/runtime/sizeclasses.go @@ -90,6 +90,6 @@ type divMagic struct { baseMask uint16 } -var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 9, 171, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 9, 57, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 7, 43, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 6, 13, 0}, {6, 11, 187, 0}, {8, 5, 11, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}} +var class_to_divmagic = [_NumSizeClasses]divMagic{{0, 0, 0, 0}, {3, 0, 1, 65528}, {4, 0, 1, 65520}, {5, 0, 1, 65504}, {4, 11, 683, 0}, {6, 0, 1, 65472}, {4, 10, 205, 0}, {5, 9, 171, 0}, {4, 11, 293, 0}, {7, 0, 1, 65408}, {4, 13, 911, 0}, {5, 10, 205, 0}, {4, 12, 373, 0}, {6, 9, 171, 0}, {4, 13, 631, 0}, {5, 11, 293, 0}, {4, 13, 547, 0}, {8, 0, 1, 65280}, {5, 9, 57, 0}, {6, 9, 103, 0}, {5, 12, 373, 0}, {7, 7, 43, 0}, {5, 10, 79, 0}, {6, 10, 147, 0}, {5, 11, 137, 0}, {9, 0, 1, 65024}, {6, 9, 57, 0}, {7, 9, 103, 0}, {6, 11, 187, 0}, {8, 7, 43, 0}, {7, 8, 37, 0}, {10, 0, 1, 64512}, {7, 9, 57, 0}, {8, 6, 13, 0}, {7, 11, 187, 0}, {9, 5, 11, 0}, {8, 8, 37, 0}, {11, 0, 1, 63488}, {8, 9, 57, 0}, {7, 10, 49, 0}, {10, 5, 11, 0}, {7, 10, 41, 0}, {7, 9, 19, 0}, {12, 0, 1, 61440}, {8, 9, 27, 0}, {8, 10, 49, 0}, {11, 5, 11, 0}, {7, 13, 161, 0}, {7, 13, 155, 0}, {8, 9, 19, 0}, {13, 0, 1, 57344}, {8, 12, 111, 0}, {9, 9, 27, 0}, {11, 6, 13, 0}, {7, 14, 193, 0}, {12, 3, 3, 0}, {8, 13, 155, 0}, {11, 8, 37, 0}, {14, 0, 1, 49152}, {11, 8, 29, 0}, {7, 13, 55, 0}, {12, 5, 7, 0}, {8, 14, 193, 0}, {13, 3, 3, 0}, {7, 14, 77, 0}, {12, 7, 19, 0}, {15, 0, 1, 32768}} var size_to_class8 = [smallSizeMax/smallSizeDiv + 1]uint8{0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31} var size_to_class128 = [(_MaxSmallSize-smallSizeMax)/largeSizeDiv + 1]uint8{31, 32, 33, 34, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 46, 47, 47, 47, 48, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66} -- GitLab From b48bda9c6f57ca9a940eac95700485b9640a62e9 Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Thu, 14 Mar 2019 23:42:57 -0700 Subject: [PATCH 0494/1679] cmd/go: allow -o to point to a folder that writes multiple execs If -o points to a directory that exists then allow multiple executables to be written to that directory. Fixes #14295 Change-Id: Ic951e637c70a2ada5e7534bae9a43901a39fe2c5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167679 Run-TryBot: Daniel Theophanes TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 8 ++--- src/cmd/go/internal/work/build.go | 33 +++++++++++++++---- .../go/testdata/script/build_multi_main.txt | 27 +++++++++++++++ 3 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/cmd/go/testdata/script/build_multi_main.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 55371c1215..141f13c63e 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -89,10 +89,10 @@ // // When compiling packages, build ignores files that end in '_test.go'. // -// The -o flag, only allowed when compiling a single package, -// forces build to write the resulting executable or object -// to the named output file, instead of the default behavior described -// in the last two paragraphs. +// The -o flag forces build to write the resulting executable or object +// to the named output file or directory, instead of the default behavior described +// in the last two paragraphs. If the named output is a directory that exists, +// then any resulting executables will be written to that directory. // // The -i flag installs the packages that are dependencies of the target. // diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index d89ee899f0..82ac7d692f 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -42,10 +42,10 @@ serving only as a check that the packages can be built. When compiling packages, build ignores files that end in '_test.go'. -The -o flag, only allowed when compiling a single package, -forces build to write the resulting executable or object -to the named output file, instead of the default behavior described -in the last two paragraphs. +The -o flag forces build to write the resulting executable or object +to the named output file or directory, instead of the default behavior described +in the last two paragraphs. If the named output is a directory that exists, +then any resulting executables will be written to that directory. The -i flag installs the packages that are dependencies of the target. @@ -153,7 +153,7 @@ func init() { CmdInstall.Run = runInstall CmdBuild.Flag.BoolVar(&cfg.BuildI, "i", false, "") - CmdBuild.Flag.StringVar(&cfg.BuildO, "o", "", "output file") + CmdBuild.Flag.StringVar(&cfg.BuildO, "o", "", "output file or directory") CmdInstall.Flag.BoolVar(&cfg.BuildI, "i", false, "") @@ -316,8 +316,29 @@ func runBuild(cmd *base.Command, args []string) { } if cfg.BuildO != "" { + // If the -o name exists and is a directory, then + // write all main packages to that directory. + // Otherwise require only a single package be built. + if bs, err := os.Stat(cfg.BuildO); err == nil && bs.IsDir() { + a := &Action{Mode: "go build"} + for _, p := range pkgs { + if p.Name != "main" { + continue + } + p.Target = filepath.Join(cfg.BuildO, load.DefaultExecName(p)) + p.Target += cfg.ExeSuffix + p.Stale = true + p.StaleReason = "build -o flag in use" + a.Deps = append(a.Deps, b.AutoAction(ModeInstall, depMode, p)) + } + if len(a.Deps) == 0 { + base.Fatalf("go build: no main packages to build") + } + b.Do(a) + return + } if len(pkgs) > 1 { - base.Fatalf("go build: cannot use -o with multiple packages") + base.Fatalf("go build: cannot write multiple packages to non-directory %s", cfg.BuildO) } else if len(pkgs) == 0 { base.Fatalf("no packages to build") } diff --git a/src/cmd/go/testdata/script/build_multi_main.txt b/src/cmd/go/testdata/script/build_multi_main.txt new file mode 100644 index 0000000000..734e8d88d2 --- /dev/null +++ b/src/cmd/go/testdata/script/build_multi_main.txt @@ -0,0 +1,27 @@ +# Verify build -o can output multiple executables to a directory. + +mkdir $WORK/bin +go build -o $WORK/bin ./cmd/c1 ./cmd/c2 +! stderr 'multiple packages' + +! go build -o $WORK/bin ./pkg1 ./pkg1 +stderr 'no main packages' + +-- go.mod -- +module exmod + +-- cmd/c1/main.go -- +package main + +func main() {} + +-- cmd/c2/main.go -- +package main + +func main() {} + +-- pkg1/pkg1.go -- +package pkg1 + +-- pkg2/pkg2.go -- +package pkg2 -- GitLab From 2c423f063b137781a97a6a56998a2e3abffc4051 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 6 Feb 2019 14:12:36 -0800 Subject: [PATCH 0495/1679] cmd/compile,runtime: provide index information on bounds check failure A few examples (for accessing a slice of length 3): s[-1] runtime error: index out of range [-1] s[3] runtime error: index out of range [3] with length 3 s[-1:0] runtime error: slice bounds out of range [-1:] s[3:0] runtime error: slice bounds out of range [3:0] s[3:-1] runtime error: slice bounds out of range [:-1] s[3:4] runtime error: slice bounds out of range [:4] with capacity 3 s[0:3:4] runtime error: slice bounds out of range [::4] with capacity 3 Note that in cases where there are multiple things wrong with the indexes (e.g. s[3:-1]), we report one of those errors kind of arbitrarily, currently the rightmost one. An exhaustive set of examples is in issue30116[u].out in the CL. The message text has the same prefix as the old message text. That leads to slightly awkward phrasing but hopefully minimizes the chance that code depending on the error text will break. Increases the size of the go binary by 0.5% (amd64). The panic functions take arguments in registers in order to keep the size of the compiled code as small as possible. Fixes #30116 Change-Id: Idb99a827b7888822ca34c240eca87b7e44a04fdd Reviewed-on: https://go-review.googlesource.com/c/go/+/161477 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/amd64/ssa.go | 14 + src/cmd/compile/internal/arm/ssa.go | 12 + src/cmd/compile/internal/arm64/ssa.go | 6 + src/cmd/compile/internal/gc/builtin.go | 461 ++++++++------- .../compile/internal/gc/builtin/runtime.go | 21 +- src/cmd/compile/internal/gc/go.go | 5 +- src/cmd/compile/internal/gc/ssa.go | 282 ++++++--- src/cmd/compile/internal/mips/ssa.go | 12 + src/cmd/compile/internal/mips64/ssa.go | 6 + src/cmd/compile/internal/ppc64/ssa.go | 7 + src/cmd/compile/internal/s390x/ssa.go | 6 + src/cmd/compile/internal/ssa/func.go | 12 + src/cmd/compile/internal/ssa/gen/386.rules | 8 + src/cmd/compile/internal/ssa/gen/386Ops.go | 13 + src/cmd/compile/internal/ssa/gen/AMD64.rules | 12 +- src/cmd/compile/internal/ssa/gen/AMD64Ops.go | 15 + src/cmd/compile/internal/ssa/gen/ARM.rules | 8 + src/cmd/compile/internal/ssa/gen/ARM64.rules | 4 + src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 11 + src/cmd/compile/internal/ssa/gen/ARMOps.go | 16 + src/cmd/compile/internal/ssa/gen/MIPS.rules | 7 + src/cmd/compile/internal/ssa/gen/MIPS64.rules | 4 + src/cmd/compile/internal/ssa/gen/MIPS64Ops.go | 11 + src/cmd/compile/internal/ssa/gen/MIPSOps.go | 16 + src/cmd/compile/internal/ssa/gen/PPC64.rules | 4 + src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 11 + src/cmd/compile/internal/ssa/gen/S390X.rules | 4 + src/cmd/compile/internal/ssa/gen/S390XOps.go | 10 + .../compile/internal/ssa/gen/genericOps.go | 8 + src/cmd/compile/internal/ssa/op.go | 67 +++ src/cmd/compile/internal/ssa/opGen.go | 458 ++++++++++++++ src/cmd/compile/internal/ssa/rewrite386.go | 130 ++++ src/cmd/compile/internal/ssa/rewriteAMD64.go | 144 +++++ src/cmd/compile/internal/ssa/rewriteARM.go | 130 ++++ src/cmd/compile/internal/ssa/rewriteARM64.go | 62 ++ src/cmd/compile/internal/ssa/rewriteMIPS.go | 130 ++++ src/cmd/compile/internal/ssa/rewriteMIPS64.go | 62 ++ src/cmd/compile/internal/ssa/rewritePPC64.go | 62 ++ src/cmd/compile/internal/ssa/rewriteS390X.go | 62 ++ src/cmd/compile/internal/x86/ssa.go | 14 + src/runtime/asm_386.s | 152 +++++ src/runtime/asm_amd64.s | 70 +++ src/runtime/asm_amd64p32.s | 152 +++++ src/runtime/asm_arm.s | 152 +++++ src/runtime/asm_arm64.s | 70 +++ src/runtime/asm_mips64x.s | 70 +++ src/runtime/asm_mipsx.s | 152 +++++ src/runtime/asm_ppc64x.s | 70 +++ src/runtime/asm_s390x.s | 70 +++ src/runtime/error.go | 108 ++++ src/runtime/os_plan9.go | 12 - src/runtime/panic.go | 163 +++-- src/runtime/panic32.go | 105 ++++ test/codegen/memcombine.go | 12 +- test/fixedbugs/issue15002.go | 12 +- test/fixedbugs/issue30116.go | 112 ++++ test/fixedbugs/issue30116.out | 558 ++++++++++++++++++ test/fixedbugs/issue30116u.go | 112 ++++ test/fixedbugs/issue30116u.out | 340 +++++++++++ 59 files changed, 4464 insertions(+), 355 deletions(-) create mode 100644 src/runtime/panic32.go create mode 100644 test/fixedbugs/issue30116.go create mode 100644 test/fixedbugs/issue30116.out create mode 100644 test/fixedbugs/issue30116u.go create mode 100644 test/fixedbugs/issue30116u.out diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index b9fca18d4f..48b4f7d0b5 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -926,6 +926,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpAMD64LoweredPanicBoundsA, ssa.OpAMD64LoweredPanicBoundsB, ssa.OpAMD64LoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(int64(2 * gc.Widthptr)) // space used in callee args area by assembly stubs + + case ssa.OpAMD64LoweredPanicExtendA, ssa.OpAMD64LoweredPanicExtendB, ssa.OpAMD64LoweredPanicExtendC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.ExtendCheckFunc[v.AuxInt] + s.UseArgs(int64(3 * gc.Widthptr)) // space used in callee args area by assembly stubs + case ssa.OpAMD64NEGQ, ssa.OpAMD64NEGL, ssa.OpAMD64BSWAPQ, ssa.OpAMD64BSWAPL, ssa.OpAMD64NOTQ, ssa.OpAMD64NOTL: diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index 320fe98707..8af6b1e6ed 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -711,6 +711,18 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpARMLoweredPanicBoundsA, ssa.OpARMLoweredPanicBoundsB, ssa.OpARMLoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(8) // space used in callee args area by assembly stubs + case ssa.OpARMLoweredPanicExtendA, ssa.OpARMLoweredPanicExtendB, ssa.OpARMLoweredPanicExtendC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.ExtendCheckFunc[v.AuxInt] + s.UseArgs(12) // space used in callee args area by assembly stubs case ssa.OpARMDUFFZERO: p := s.Prog(obj.ADUFFZERO) p.To.Type = obj.TYPE_MEM diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 0ea3c191ac..75cf1d0bd9 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -846,6 +846,12 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpARM64LoweredPanicBoundsA, ssa.OpARM64LoweredPanicBoundsB, ssa.OpARM64LoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(16) // space used in callee args area by assembly stubs case ssa.OpARM64LoweredNilCheck: // Issue a load which will fault if arg is nil. p := s.Prog(arm64.AMOVB) diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index f32fcd675d..8244929f74 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -10,8 +10,6 @@ var runtimeDecls = [...]struct { typ int }{ {"newobject", funcTag, 4}, - {"panicindex", funcTag, 5}, - {"panicslice", funcTag, 5}, {"panicdivide", funcTag, 5}, {"panicshift", funcTag, 5}, {"panicmakeslicelen", funcTag, 5}, @@ -20,138 +18,154 @@ var runtimeDecls = [...]struct { {"gopanic", funcTag, 7}, {"gorecover", funcTag, 10}, {"goschedguarded", funcTag, 5}, - {"printbool", funcTag, 12}, - {"printfloat", funcTag, 14}, - {"printint", funcTag, 16}, - {"printhex", funcTag, 18}, - {"printuint", funcTag, 18}, - {"printcomplex", funcTag, 20}, - {"printstring", funcTag, 22}, - {"printpointer", funcTag, 23}, - {"printiface", funcTag, 23}, - {"printeface", funcTag, 23}, - {"printslice", funcTag, 23}, + {"goPanicIndex", funcTag, 12}, + {"goPanicIndexU", funcTag, 14}, + {"goPanicSliceAlen", funcTag, 12}, + {"goPanicSliceAlenU", funcTag, 14}, + {"goPanicSliceAcap", funcTag, 12}, + {"goPanicSliceAcapU", funcTag, 14}, + {"goPanicSliceB", funcTag, 12}, + {"goPanicSliceBU", funcTag, 14}, + {"goPanicSlice3Alen", funcTag, 12}, + {"goPanicSlice3AlenU", funcTag, 14}, + {"goPanicSlice3Acap", funcTag, 12}, + {"goPanicSlice3AcapU", funcTag, 14}, + {"goPanicSlice3B", funcTag, 12}, + {"goPanicSlice3BU", funcTag, 14}, + {"goPanicSlice3C", funcTag, 12}, + {"goPanicSlice3CU", funcTag, 14}, + {"printbool", funcTag, 16}, + {"printfloat", funcTag, 18}, + {"printint", funcTag, 20}, + {"printhex", funcTag, 22}, + {"printuint", funcTag, 22}, + {"printcomplex", funcTag, 24}, + {"printstring", funcTag, 26}, + {"printpointer", funcTag, 27}, + {"printiface", funcTag, 27}, + {"printeface", funcTag, 27}, + {"printslice", funcTag, 27}, {"printnl", funcTag, 5}, {"printsp", funcTag, 5}, {"printlock", funcTag, 5}, {"printunlock", funcTag, 5}, - {"concatstring2", funcTag, 26}, - {"concatstring3", funcTag, 27}, - {"concatstring4", funcTag, 28}, - {"concatstring5", funcTag, 29}, - {"concatstrings", funcTag, 31}, - {"cmpstring", funcTag, 33}, - {"intstring", funcTag, 36}, - {"slicebytetostring", funcTag, 38}, - {"slicebytetostringtmp", funcTag, 39}, - {"slicerunetostring", funcTag, 42}, - {"stringtoslicebyte", funcTag, 43}, - {"stringtoslicerune", funcTag, 46}, - {"slicecopy", funcTag, 48}, - {"slicestringcopy", funcTag, 49}, - {"decoderune", funcTag, 50}, - {"countrunes", funcTag, 51}, - {"convI2I", funcTag, 52}, - {"convT16", funcTag, 54}, - {"convT32", funcTag, 54}, - {"convT64", funcTag, 54}, - {"convTstring", funcTag, 54}, - {"convTslice", funcTag, 54}, - {"convT2E", funcTag, 55}, - {"convT2Enoptr", funcTag, 55}, - {"convT2I", funcTag, 55}, - {"convT2Inoptr", funcTag, 55}, - {"assertE2I", funcTag, 52}, - {"assertE2I2", funcTag, 56}, - {"assertI2I", funcTag, 52}, - {"assertI2I2", funcTag, 56}, - {"panicdottypeE", funcTag, 57}, - {"panicdottypeI", funcTag, 57}, - {"panicnildottype", funcTag, 58}, - {"ifaceeq", funcTag, 60}, - {"efaceeq", funcTag, 60}, - {"fastrand", funcTag, 62}, - {"makemap64", funcTag, 64}, - {"makemap", funcTag, 65}, - {"makemap_small", funcTag, 66}, - {"mapaccess1", funcTag, 67}, - {"mapaccess1_fast32", funcTag, 68}, - {"mapaccess1_fast64", funcTag, 68}, - {"mapaccess1_faststr", funcTag, 68}, - {"mapaccess1_fat", funcTag, 69}, - {"mapaccess2", funcTag, 70}, - {"mapaccess2_fast32", funcTag, 71}, - {"mapaccess2_fast64", funcTag, 71}, - {"mapaccess2_faststr", funcTag, 71}, - {"mapaccess2_fat", funcTag, 72}, - {"mapassign", funcTag, 67}, - {"mapassign_fast32", funcTag, 68}, - {"mapassign_fast32ptr", funcTag, 68}, - {"mapassign_fast64", funcTag, 68}, - {"mapassign_fast64ptr", funcTag, 68}, - {"mapassign_faststr", funcTag, 68}, - {"mapiterinit", funcTag, 73}, - {"mapdelete", funcTag, 73}, - {"mapdelete_fast32", funcTag, 74}, - {"mapdelete_fast64", funcTag, 74}, - {"mapdelete_faststr", funcTag, 74}, - {"mapiternext", funcTag, 75}, - {"mapclear", funcTag, 76}, - {"makechan64", funcTag, 78}, - {"makechan", funcTag, 79}, - {"chanrecv1", funcTag, 81}, - {"chanrecv2", funcTag, 82}, - {"chansend1", funcTag, 84}, - {"closechan", funcTag, 23}, - {"writeBarrier", varTag, 86}, - {"typedmemmove", funcTag, 87}, - {"typedmemclr", funcTag, 88}, - {"typedslicecopy", funcTag, 89}, - {"selectnbsend", funcTag, 90}, - {"selectnbrecv", funcTag, 91}, - {"selectnbrecv2", funcTag, 93}, - {"selectsetpc", funcTag, 58}, - {"selectgo", funcTag, 94}, + {"concatstring2", funcTag, 30}, + {"concatstring3", funcTag, 31}, + {"concatstring4", funcTag, 32}, + {"concatstring5", funcTag, 33}, + {"concatstrings", funcTag, 35}, + {"cmpstring", funcTag, 36}, + {"intstring", funcTag, 39}, + {"slicebytetostring", funcTag, 41}, + {"slicebytetostringtmp", funcTag, 42}, + {"slicerunetostring", funcTag, 45}, + {"stringtoslicebyte", funcTag, 46}, + {"stringtoslicerune", funcTag, 49}, + {"slicecopy", funcTag, 51}, + {"slicestringcopy", funcTag, 52}, + {"decoderune", funcTag, 53}, + {"countrunes", funcTag, 54}, + {"convI2I", funcTag, 55}, + {"convT16", funcTag, 57}, + {"convT32", funcTag, 57}, + {"convT64", funcTag, 57}, + {"convTstring", funcTag, 57}, + {"convTslice", funcTag, 57}, + {"convT2E", funcTag, 58}, + {"convT2Enoptr", funcTag, 58}, + {"convT2I", funcTag, 58}, + {"convT2Inoptr", funcTag, 58}, + {"assertE2I", funcTag, 55}, + {"assertE2I2", funcTag, 59}, + {"assertI2I", funcTag, 55}, + {"assertI2I2", funcTag, 59}, + {"panicdottypeE", funcTag, 60}, + {"panicdottypeI", funcTag, 60}, + {"panicnildottype", funcTag, 61}, + {"ifaceeq", funcTag, 63}, + {"efaceeq", funcTag, 63}, + {"fastrand", funcTag, 65}, + {"makemap64", funcTag, 67}, + {"makemap", funcTag, 68}, + {"makemap_small", funcTag, 69}, + {"mapaccess1", funcTag, 70}, + {"mapaccess1_fast32", funcTag, 71}, + {"mapaccess1_fast64", funcTag, 71}, + {"mapaccess1_faststr", funcTag, 71}, + {"mapaccess1_fat", funcTag, 72}, + {"mapaccess2", funcTag, 73}, + {"mapaccess2_fast32", funcTag, 74}, + {"mapaccess2_fast64", funcTag, 74}, + {"mapaccess2_faststr", funcTag, 74}, + {"mapaccess2_fat", funcTag, 75}, + {"mapassign", funcTag, 70}, + {"mapassign_fast32", funcTag, 71}, + {"mapassign_fast32ptr", funcTag, 71}, + {"mapassign_fast64", funcTag, 71}, + {"mapassign_fast64ptr", funcTag, 71}, + {"mapassign_faststr", funcTag, 71}, + {"mapiterinit", funcTag, 76}, + {"mapdelete", funcTag, 76}, + {"mapdelete_fast32", funcTag, 77}, + {"mapdelete_fast64", funcTag, 77}, + {"mapdelete_faststr", funcTag, 77}, + {"mapiternext", funcTag, 78}, + {"mapclear", funcTag, 79}, + {"makechan64", funcTag, 81}, + {"makechan", funcTag, 82}, + {"chanrecv1", funcTag, 84}, + {"chanrecv2", funcTag, 85}, + {"chansend1", funcTag, 87}, + {"closechan", funcTag, 27}, + {"writeBarrier", varTag, 89}, + {"typedmemmove", funcTag, 90}, + {"typedmemclr", funcTag, 91}, + {"typedslicecopy", funcTag, 92}, + {"selectnbsend", funcTag, 93}, + {"selectnbrecv", funcTag, 94}, + {"selectnbrecv2", funcTag, 96}, + {"selectsetpc", funcTag, 61}, + {"selectgo", funcTag, 97}, {"block", funcTag, 5}, - {"makeslice", funcTag, 95}, - {"makeslice64", funcTag, 96}, - {"growslice", funcTag, 98}, - {"memmove", funcTag, 99}, - {"memclrNoHeapPointers", funcTag, 100}, - {"memclrHasPointers", funcTag, 100}, - {"memequal", funcTag, 101}, - {"memequal8", funcTag, 102}, - {"memequal16", funcTag, 102}, - {"memequal32", funcTag, 102}, - {"memequal64", funcTag, 102}, - {"memequal128", funcTag, 102}, - {"int64div", funcTag, 103}, - {"uint64div", funcTag, 104}, - {"int64mod", funcTag, 103}, - {"uint64mod", funcTag, 104}, - {"float64toint64", funcTag, 105}, - {"float64touint64", funcTag, 106}, - {"float64touint32", funcTag, 107}, - {"int64tofloat64", funcTag, 108}, - {"uint64tofloat64", funcTag, 109}, - {"uint32tofloat64", funcTag, 110}, - {"complex128div", funcTag, 111}, - {"racefuncenter", funcTag, 112}, + {"makeslice", funcTag, 98}, + {"makeslice64", funcTag, 99}, + {"growslice", funcTag, 101}, + {"memmove", funcTag, 102}, + {"memclrNoHeapPointers", funcTag, 103}, + {"memclrHasPointers", funcTag, 103}, + {"memequal", funcTag, 104}, + {"memequal8", funcTag, 105}, + {"memequal16", funcTag, 105}, + {"memequal32", funcTag, 105}, + {"memequal64", funcTag, 105}, + {"memequal128", funcTag, 105}, + {"int64div", funcTag, 106}, + {"uint64div", funcTag, 107}, + {"int64mod", funcTag, 106}, + {"uint64mod", funcTag, 107}, + {"float64toint64", funcTag, 108}, + {"float64touint64", funcTag, 109}, + {"float64touint32", funcTag, 110}, + {"int64tofloat64", funcTag, 111}, + {"uint64tofloat64", funcTag, 112}, + {"uint32tofloat64", funcTag, 113}, + {"complex128div", funcTag, 114}, + {"racefuncenter", funcTag, 115}, {"racefuncenterfp", funcTag, 5}, {"racefuncexit", funcTag, 5}, - {"raceread", funcTag, 112}, - {"racewrite", funcTag, 112}, - {"racereadrange", funcTag, 113}, - {"racewriterange", funcTag, 113}, - {"msanread", funcTag, 113}, - {"msanwrite", funcTag, 113}, - {"x86HasPOPCNT", varTag, 11}, - {"x86HasSSE41", varTag, 11}, - {"arm64HasATOMICS", varTag, 11}, + {"raceread", funcTag, 115}, + {"racewrite", funcTag, 115}, + {"racereadrange", funcTag, 116}, + {"racewriterange", funcTag, 116}, + {"msanread", funcTag, 116}, + {"msanwrite", funcTag, 116}, + {"x86HasPOPCNT", varTag, 15}, + {"x86HasSSE41", varTag, 15}, + {"arm64HasATOMICS", varTag, 15}, } func runtimeTypes() []*types.Type { - var typs [114]*types.Type + var typs [117]*types.Type typs[0] = types.Bytetype typs[1] = types.NewPtr(typs[0]) typs[2] = types.Types[TANY] @@ -163,108 +177,111 @@ func runtimeTypes() []*types.Type { typs[8] = types.Types[TINT32] typs[9] = types.NewPtr(typs[8]) typs[10] = functype(nil, []*Node{anonfield(typs[9])}, []*Node{anonfield(typs[6])}) - typs[11] = types.Types[TBOOL] - typs[12] = functype(nil, []*Node{anonfield(typs[11])}, nil) - typs[13] = types.Types[TFLOAT64] - typs[14] = functype(nil, []*Node{anonfield(typs[13])}, nil) - typs[15] = types.Types[TINT64] + typs[11] = types.Types[TINT] + typs[12] = functype(nil, []*Node{anonfield(typs[11]), anonfield(typs[11])}, nil) + typs[13] = types.Types[TUINT] + typs[14] = functype(nil, []*Node{anonfield(typs[13]), anonfield(typs[11])}, nil) + typs[15] = types.Types[TBOOL] typs[16] = functype(nil, []*Node{anonfield(typs[15])}, nil) - typs[17] = types.Types[TUINT64] + typs[17] = types.Types[TFLOAT64] typs[18] = functype(nil, []*Node{anonfield(typs[17])}, nil) - typs[19] = types.Types[TCOMPLEX128] + typs[19] = types.Types[TINT64] typs[20] = functype(nil, []*Node{anonfield(typs[19])}, nil) - typs[21] = types.Types[TSTRING] + typs[21] = types.Types[TUINT64] typs[22] = functype(nil, []*Node{anonfield(typs[21])}, nil) - typs[23] = functype(nil, []*Node{anonfield(typs[2])}, nil) - typs[24] = types.NewArray(typs[0], 32) - typs[25] = types.NewPtr(typs[24]) - typs[26] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) - typs[27] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) - typs[28] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) - typs[29] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) - typs[30] = types.NewSlice(typs[21]) - typs[31] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[30])}, []*Node{anonfield(typs[21])}) - typs[32] = types.Types[TINT] - typs[33] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[32])}) - typs[34] = types.NewArray(typs[0], 4) - typs[35] = types.NewPtr(typs[34]) - typs[36] = functype(nil, []*Node{anonfield(typs[35]), anonfield(typs[15])}, []*Node{anonfield(typs[21])}) - typs[37] = types.NewSlice(typs[0]) - typs[38] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[37])}, []*Node{anonfield(typs[21])}) - typs[39] = functype(nil, []*Node{anonfield(typs[37])}, []*Node{anonfield(typs[21])}) - typs[40] = types.Runetype - typs[41] = types.NewSlice(typs[40]) - typs[42] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[41])}, []*Node{anonfield(typs[21])}) - typs[43] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21])}, []*Node{anonfield(typs[37])}) - typs[44] = types.NewArray(typs[40], 32) - typs[45] = types.NewPtr(typs[44]) - typs[46] = functype(nil, []*Node{anonfield(typs[45]), anonfield(typs[21])}, []*Node{anonfield(typs[41])}) - typs[47] = types.Types[TUINTPTR] - typs[48] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2]), anonfield(typs[47])}, []*Node{anonfield(typs[32])}) - typs[49] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[32])}) - typs[50] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[32])}, []*Node{anonfield(typs[40]), anonfield(typs[32])}) - typs[51] = functype(nil, []*Node{anonfield(typs[21])}, []*Node{anonfield(typs[32])}) - typs[52] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) - typs[53] = types.Types[TUNSAFEPTR] - typs[54] = functype(nil, []*Node{anonfield(typs[2])}, []*Node{anonfield(typs[53])}) - typs[55] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) - typs[56] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[11])}) - typs[57] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) - typs[58] = functype(nil, []*Node{anonfield(typs[1])}, nil) - typs[59] = types.NewPtr(typs[47]) - typs[60] = functype(nil, []*Node{anonfield(typs[59]), anonfield(typs[53]), anonfield(typs[53])}, []*Node{anonfield(typs[11])}) - typs[61] = types.Types[TUINT32] - typs[62] = functype(nil, nil, []*Node{anonfield(typs[61])}) - typs[63] = types.NewMap(typs[2], typs[2]) - typs[64] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[3])}, []*Node{anonfield(typs[63])}) - typs[65] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[32]), anonfield(typs[3])}, []*Node{anonfield(typs[63])}) - typs[66] = functype(nil, nil, []*Node{anonfield(typs[63])}) - typs[67] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) - typs[68] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) - typs[69] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) - typs[70] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) - typs[71] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) - typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) - typs[73] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[3])}, nil) - typs[74] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63]), anonfield(typs[2])}, nil) - typs[75] = functype(nil, []*Node{anonfield(typs[3])}, nil) - typs[76] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[63])}, nil) - typs[77] = types.NewChan(typs[2], types.Cboth) - typs[78] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15])}, []*Node{anonfield(typs[77])}) - typs[79] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[32])}, []*Node{anonfield(typs[77])}) - typs[80] = types.NewChan(typs[2], types.Crecv) - typs[81] = functype(nil, []*Node{anonfield(typs[80]), anonfield(typs[3])}, nil) - typs[82] = functype(nil, []*Node{anonfield(typs[80]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) - typs[83] = types.NewChan(typs[2], types.Csend) + typs[23] = types.Types[TCOMPLEX128] + typs[24] = functype(nil, []*Node{anonfield(typs[23])}, nil) + typs[25] = types.Types[TSTRING] + typs[26] = functype(nil, []*Node{anonfield(typs[25])}, nil) + typs[27] = functype(nil, []*Node{anonfield(typs[2])}, nil) + typs[28] = types.NewArray(typs[0], 32) + typs[29] = types.NewPtr(typs[28]) + typs[30] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[25]), anonfield(typs[25])}, []*Node{anonfield(typs[25])}) + typs[31] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25])}, []*Node{anonfield(typs[25])}) + typs[32] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25])}, []*Node{anonfield(typs[25])}) + typs[33] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25]), anonfield(typs[25])}, []*Node{anonfield(typs[25])}) + typs[34] = types.NewSlice(typs[25]) + typs[35] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[34])}, []*Node{anonfield(typs[25])}) + typs[36] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[25])}, []*Node{anonfield(typs[11])}) + typs[37] = types.NewArray(typs[0], 4) + typs[38] = types.NewPtr(typs[37]) + typs[39] = functype(nil, []*Node{anonfield(typs[38]), anonfield(typs[19])}, []*Node{anonfield(typs[25])}) + typs[40] = types.NewSlice(typs[0]) + typs[41] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[40])}, []*Node{anonfield(typs[25])}) + typs[42] = functype(nil, []*Node{anonfield(typs[40])}, []*Node{anonfield(typs[25])}) + typs[43] = types.Runetype + typs[44] = types.NewSlice(typs[43]) + typs[45] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[44])}, []*Node{anonfield(typs[25])}) + typs[46] = functype(nil, []*Node{anonfield(typs[29]), anonfield(typs[25])}, []*Node{anonfield(typs[40])}) + typs[47] = types.NewArray(typs[43], 32) + typs[48] = types.NewPtr(typs[47]) + typs[49] = functype(nil, []*Node{anonfield(typs[48]), anonfield(typs[25])}, []*Node{anonfield(typs[44])}) + typs[50] = types.Types[TUINTPTR] + typs[51] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2]), anonfield(typs[50])}, []*Node{anonfield(typs[11])}) + typs[52] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[11])}) + typs[53] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[11])}, []*Node{anonfield(typs[43]), anonfield(typs[11])}) + typs[54] = functype(nil, []*Node{anonfield(typs[25])}, []*Node{anonfield(typs[11])}) + typs[55] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) + typs[56] = types.Types[TUNSAFEPTR] + typs[57] = functype(nil, []*Node{anonfield(typs[2])}, []*Node{anonfield(typs[56])}) + typs[58] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) + typs[59] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[15])}) + typs[60] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) + typs[61] = functype(nil, []*Node{anonfield(typs[1])}, nil) + typs[62] = types.NewPtr(typs[50]) + typs[63] = functype(nil, []*Node{anonfield(typs[62]), anonfield(typs[56]), anonfield(typs[56])}, []*Node{anonfield(typs[15])}) + typs[64] = types.Types[TUINT32] + typs[65] = functype(nil, nil, []*Node{anonfield(typs[64])}) + typs[66] = types.NewMap(typs[2], typs[2]) + typs[67] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[19]), anonfield(typs[3])}, []*Node{anonfield(typs[66])}) + typs[68] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[11]), anonfield(typs[3])}, []*Node{anonfield(typs[66])}) + typs[69] = functype(nil, nil, []*Node{anonfield(typs[66])}) + typs[70] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) + typs[71] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) + typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) + typs[73] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[15])}) + typs[74] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[15])}) + typs[75] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[15])}) + typs[76] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[3])}, nil) + typs[77] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66]), anonfield(typs[2])}, nil) + typs[78] = functype(nil, []*Node{anonfield(typs[3])}, nil) + typs[79] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[66])}, nil) + typs[80] = types.NewChan(typs[2], types.Cboth) + typs[81] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[19])}, []*Node{anonfield(typs[80])}) + typs[82] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[11])}, []*Node{anonfield(typs[80])}) + typs[83] = types.NewChan(typs[2], types.Crecv) typs[84] = functype(nil, []*Node{anonfield(typs[83]), anonfield(typs[3])}, nil) - typs[85] = types.NewArray(typs[0], 3) - typs[86] = tostruct([]*Node{namedfield("enabled", typs[11]), namedfield("pad", typs[85]), namedfield("needed", typs[11]), namedfield("cgo", typs[11]), namedfield("alignme", typs[17])}) - typs[87] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) - typs[88] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) - typs[89] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[32])}) - typs[90] = functype(nil, []*Node{anonfield(typs[83]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) - typs[91] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[80])}, []*Node{anonfield(typs[11])}) - typs[92] = types.NewPtr(typs[11]) - typs[93] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[92]), anonfield(typs[80])}, []*Node{anonfield(typs[11])}) - typs[94] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[32])}, []*Node{anonfield(typs[32]), anonfield(typs[11])}) - typs[95] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[32]), anonfield(typs[32])}, []*Node{anonfield(typs[53])}) - typs[96] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[53])}) - typs[97] = types.NewSlice(typs[2]) - typs[98] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[97]), anonfield(typs[32])}, []*Node{anonfield(typs[97])}) - typs[99] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[47])}, nil) - typs[100] = functype(nil, []*Node{anonfield(typs[53]), anonfield(typs[47])}, nil) - typs[101] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[47])}, []*Node{anonfield(typs[11])}) - typs[102] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) - typs[103] = functype(nil, []*Node{anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[15])}) - typs[104] = functype(nil, []*Node{anonfield(typs[17]), anonfield(typs[17])}, []*Node{anonfield(typs[17])}) - typs[105] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[15])}) - typs[106] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[17])}) - typs[107] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[61])}) - typs[108] = functype(nil, []*Node{anonfield(typs[15])}, []*Node{anonfield(typs[13])}) - typs[109] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[13])}) - typs[110] = functype(nil, []*Node{anonfield(typs[61])}, []*Node{anonfield(typs[13])}) - typs[111] = functype(nil, []*Node{anonfield(typs[19]), anonfield(typs[19])}, []*Node{anonfield(typs[19])}) - typs[112] = functype(nil, []*Node{anonfield(typs[47])}, nil) - typs[113] = functype(nil, []*Node{anonfield(typs[47]), anonfield(typs[47])}, nil) + typs[85] = functype(nil, []*Node{anonfield(typs[83]), anonfield(typs[3])}, []*Node{anonfield(typs[15])}) + typs[86] = types.NewChan(typs[2], types.Csend) + typs[87] = functype(nil, []*Node{anonfield(typs[86]), anonfield(typs[3])}, nil) + typs[88] = types.NewArray(typs[0], 3) + typs[89] = tostruct([]*Node{namedfield("enabled", typs[15]), namedfield("pad", typs[88]), namedfield("needed", typs[15]), namedfield("cgo", typs[15]), namedfield("alignme", typs[21])}) + typs[90] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) + typs[91] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) + typs[92] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[11])}) + typs[93] = functype(nil, []*Node{anonfield(typs[86]), anonfield(typs[3])}, []*Node{anonfield(typs[15])}) + typs[94] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[83])}, []*Node{anonfield(typs[15])}) + typs[95] = types.NewPtr(typs[15]) + typs[96] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[95]), anonfield(typs[83])}, []*Node{anonfield(typs[15])}) + typs[97] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[11])}, []*Node{anonfield(typs[11]), anonfield(typs[15])}) + typs[98] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[11]), anonfield(typs[11])}, []*Node{anonfield(typs[56])}) + typs[99] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[19]), anonfield(typs[19])}, []*Node{anonfield(typs[56])}) + typs[100] = types.NewSlice(typs[2]) + typs[101] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[100]), anonfield(typs[11])}, []*Node{anonfield(typs[100])}) + typs[102] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[50])}, nil) + typs[103] = functype(nil, []*Node{anonfield(typs[56]), anonfield(typs[50])}, nil) + typs[104] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[50])}, []*Node{anonfield(typs[15])}) + typs[105] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[15])}) + typs[106] = functype(nil, []*Node{anonfield(typs[19]), anonfield(typs[19])}, []*Node{anonfield(typs[19])}) + typs[107] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) + typs[108] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[19])}) + typs[109] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[21])}) + typs[110] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[64])}) + typs[111] = functype(nil, []*Node{anonfield(typs[19])}, []*Node{anonfield(typs[17])}) + typs[112] = functype(nil, []*Node{anonfield(typs[21])}, []*Node{anonfield(typs[17])}) + typs[113] = functype(nil, []*Node{anonfield(typs[64])}, []*Node{anonfield(typs[17])}) + typs[114] = functype(nil, []*Node{anonfield(typs[23]), anonfield(typs[23])}, []*Node{anonfield(typs[23])}) + typs[115] = functype(nil, []*Node{anonfield(typs[50])}, nil) + typs[116] = functype(nil, []*Node{anonfield(typs[50]), anonfield(typs[50])}, nil) return typs[:] } diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 210881a6e9..a8a9b061ec 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -15,8 +15,6 @@ package runtime import "unsafe" func newobject(typ *byte) *any -func panicindex() -func panicslice() func panicdivide() func panicshift() func panicmakeslicelen() @@ -27,6 +25,25 @@ func gopanic(interface{}) func gorecover(*int32) interface{} func goschedguarded() +// Note: these declarations are just for wasm port. +// Other ports call assembly stubs instead. +func goPanicIndex(x int, y int) +func goPanicIndexU(x uint, y int) +func goPanicSliceAlen(x int, y int) +func goPanicSliceAlenU(x uint, y int) +func goPanicSliceAcap(x int, y int) +func goPanicSliceAcapU(x uint, y int) +func goPanicSliceB(x int, y int) +func goPanicSliceBU(x uint, y int) +func goPanicSlice3Alen(x int, y int) +func goPanicSlice3AlenU(x uint, y int) +func goPanicSlice3Acap(x int, y int) +func goPanicSlice3AcapU(x uint, y int) +func goPanicSlice3B(x int, y int) +func goPanicSlice3BU(x uint, y int) +func goPanicSlice3C(x int, y int) +func goPanicSlice3CU(x uint, y int) + func printbool(bool) func printfloat(float64) func printint(int64) diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 007585ef10..5f2c328909 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -300,10 +300,8 @@ var ( panicshift, panicdottypeE, panicdottypeI, - panicindex, panicnildottype, panicoverflow, - panicslice, raceread, racereadrange, racewrite, @@ -316,6 +314,9 @@ var ( Udiv, writeBarrier *obj.LSym + BoundsCheckFunc [ssa.BoundsKindCount]*obj.LSym + ExtendCheckFunc [ssa.BoundsKindCount]*obj.LSym + // GO386=387 ControlWord64trunc, ControlWord32 *obj.LSym diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 3ccb59e105..031c3c072c 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -80,10 +80,8 @@ func initssaconfig() { panicdivide = sysfunc("panicdivide") panicdottypeE = sysfunc("panicdottypeE") panicdottypeI = sysfunc("panicdottypeI") - panicindex = sysfunc("panicindex") panicnildottype = sysfunc("panicnildottype") panicoverflow = sysfunc("panicoverflow") - panicslice = sysfunc("panicslice") panicshift = sysfunc("panicshift") raceread = sysfunc("raceread") racereadrange = sysfunc("racereadrange") @@ -96,6 +94,59 @@ func initssaconfig() { typedmemmove = sysfunc("typedmemmove") Udiv = sysvar("udiv") // asm func with special ABI writeBarrier = sysvar("writeBarrier") // struct { bool; ... } + if thearch.LinkArch.Family == sys.Wasm { + BoundsCheckFunc[ssa.BoundsIndex] = sysvar("goPanicIndex") + BoundsCheckFunc[ssa.BoundsIndexU] = sysvar("goPanicIndexU") + BoundsCheckFunc[ssa.BoundsSliceAlen] = sysvar("goPanicSliceAlen") + BoundsCheckFunc[ssa.BoundsSliceAlenU] = sysvar("goPanicSliceAlenU") + BoundsCheckFunc[ssa.BoundsSliceAcap] = sysvar("goPanicSliceAcap") + BoundsCheckFunc[ssa.BoundsSliceAcapU] = sysvar("goPanicSliceAcapU") + BoundsCheckFunc[ssa.BoundsSliceB] = sysvar("goPanicSliceB") + BoundsCheckFunc[ssa.BoundsSliceBU] = sysvar("goPanicSliceBU") + BoundsCheckFunc[ssa.BoundsSlice3Alen] = sysvar("goPanicSlice3Alen") + BoundsCheckFunc[ssa.BoundsSlice3AlenU] = sysvar("goPanicSlice3AlenU") + BoundsCheckFunc[ssa.BoundsSlice3Acap] = sysvar("goPanicSlice3Acap") + BoundsCheckFunc[ssa.BoundsSlice3AcapU] = sysvar("goPanicSlice3AcapU") + BoundsCheckFunc[ssa.BoundsSlice3B] = sysvar("goPanicSlice3B") + BoundsCheckFunc[ssa.BoundsSlice3BU] = sysvar("goPanicSlice3BU") + BoundsCheckFunc[ssa.BoundsSlice3C] = sysvar("goPanicSlice3C") + BoundsCheckFunc[ssa.BoundsSlice3CU] = sysvar("goPanicSlice3CU") + } else { + BoundsCheckFunc[ssa.BoundsIndex] = sysvar("panicIndex") + BoundsCheckFunc[ssa.BoundsIndexU] = sysvar("panicIndexU") + BoundsCheckFunc[ssa.BoundsSliceAlen] = sysvar("panicSliceAlen") + BoundsCheckFunc[ssa.BoundsSliceAlenU] = sysvar("panicSliceAlenU") + BoundsCheckFunc[ssa.BoundsSliceAcap] = sysvar("panicSliceAcap") + BoundsCheckFunc[ssa.BoundsSliceAcapU] = sysvar("panicSliceAcapU") + BoundsCheckFunc[ssa.BoundsSliceB] = sysvar("panicSliceB") + BoundsCheckFunc[ssa.BoundsSliceBU] = sysvar("panicSliceBU") + BoundsCheckFunc[ssa.BoundsSlice3Alen] = sysvar("panicSlice3Alen") + BoundsCheckFunc[ssa.BoundsSlice3AlenU] = sysvar("panicSlice3AlenU") + BoundsCheckFunc[ssa.BoundsSlice3Acap] = sysvar("panicSlice3Acap") + BoundsCheckFunc[ssa.BoundsSlice3AcapU] = sysvar("panicSlice3AcapU") + BoundsCheckFunc[ssa.BoundsSlice3B] = sysvar("panicSlice3B") + BoundsCheckFunc[ssa.BoundsSlice3BU] = sysvar("panicSlice3BU") + BoundsCheckFunc[ssa.BoundsSlice3C] = sysvar("panicSlice3C") + BoundsCheckFunc[ssa.BoundsSlice3CU] = sysvar("panicSlice3CU") + } + if thearch.LinkArch.PtrSize == 4 { + ExtendCheckFunc[ssa.BoundsIndex] = sysvar("panicExtendIndex") + ExtendCheckFunc[ssa.BoundsIndexU] = sysvar("panicExtendIndexU") + ExtendCheckFunc[ssa.BoundsSliceAlen] = sysvar("panicExtendSliceAlen") + ExtendCheckFunc[ssa.BoundsSliceAlenU] = sysvar("panicExtendSliceAlenU") + ExtendCheckFunc[ssa.BoundsSliceAcap] = sysvar("panicExtendSliceAcap") + ExtendCheckFunc[ssa.BoundsSliceAcapU] = sysvar("panicExtendSliceAcapU") + ExtendCheckFunc[ssa.BoundsSliceB] = sysvar("panicExtendSliceB") + ExtendCheckFunc[ssa.BoundsSliceBU] = sysvar("panicExtendSliceBU") + ExtendCheckFunc[ssa.BoundsSlice3Alen] = sysvar("panicExtendSlice3Alen") + ExtendCheckFunc[ssa.BoundsSlice3AlenU] = sysvar("panicExtendSlice3AlenU") + ExtendCheckFunc[ssa.BoundsSlice3Acap] = sysvar("panicExtendSlice3Acap") + ExtendCheckFunc[ssa.BoundsSlice3AcapU] = sysvar("panicExtendSlice3AcapU") + ExtendCheckFunc[ssa.BoundsSlice3B] = sysvar("panicExtendSlice3B") + ExtendCheckFunc[ssa.BoundsSlice3BU] = sysvar("panicExtendSlice3BU") + ExtendCheckFunc[ssa.BoundsSlice3C] = sysvar("panicExtendSlice3C") + ExtendCheckFunc[ssa.BoundsSlice3CU] = sysvar("panicExtendSlice3CU") + } // GO386=387 runtime definitions ControlWord64trunc = sysvar("controlWord64trunc") // uint16 @@ -575,6 +626,11 @@ func (s *state) newValue4(op ssa.Op, t *types.Type, arg0, arg1, arg2, arg3 *ssa. return s.curBlock.NewValue4(s.peekPos(), op, t, arg0, arg1, arg2, arg3) } +// newValue4 adds a new value with four arguments and an auxint value to the current block. +func (s *state) newValue4I(op ssa.Op, t *types.Type, aux int64, arg0, arg1, arg2, arg3 *ssa.Value) *ssa.Value { + return s.curBlock.NewValue4I(s.peekPos(), op, t, aux, arg0, arg1, arg2, arg3) +} + // entryNewValue0 adds a new value with no arguments to the entry block. func (s *state) entryNewValue0(op ssa.Op, t *types.Type) *ssa.Value { return s.f.Entry.NewValue0(src.NoXPos, op, t) @@ -2262,11 +2318,8 @@ func (s *state) expr(n *Node) *ssa.Value { } a := s.expr(n.Left) i := s.expr(n.Right) - i = s.extendIndex(i, panicindex) - if !n.Bounded() { - len := s.newValue1(ssa.OpStringLen, types.Types[TINT], a) - s.boundsCheck(i, len) - } + len := s.newValue1(ssa.OpStringLen, types.Types[TINT], a) + i = s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded()) ptrtyp := s.f.Config.Types.BytePtr ptr := s.newValue1(ssa.OpStringPtr, ptrtyp, a) if Isconst(n.Right, CTINT) { @@ -2288,14 +2341,12 @@ func (s *state) expr(n *Node) *ssa.Value { // Bounds check will never succeed. Might as well // use constants for the bounds check. z := s.constInt(types.Types[TINT], 0) - s.boundsCheck(z, z) + s.boundsCheck(z, z, ssa.BoundsIndex, false) // The return value won't be live, return junk. return s.newValue0(ssa.OpUnknown, n.Type) } - i = s.extendIndex(i, panicindex) - if !n.Bounded() { - s.boundsCheck(i, s.constInt(types.Types[TINT], bound)) - } + len := s.constInt(types.Types[TINT], bound) + i = s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded()) return s.newValue1I(ssa.OpArraySelect, n.Type, 0, a) } p := s.addr(n, false) @@ -2353,13 +2404,13 @@ func (s *state) expr(n *Node) *ssa.Value { var i, j, k *ssa.Value low, high, max := n.SliceBounds() if low != nil { - i = s.extendIndex(s.expr(low), panicslice) + i = s.expr(low) } if high != nil { - j = s.extendIndex(s.expr(high), panicslice) + j = s.expr(high) } if max != nil { - k = s.extendIndex(s.expr(max), panicslice) + k = s.expr(max) } p, l, c := s.slice(n.Left.Type, v, i, j, k, n.Bounded()) return s.newValue3(ssa.OpSliceMake, n.Type, p, l, c) @@ -2369,10 +2420,10 @@ func (s *state) expr(n *Node) *ssa.Value { var i, j *ssa.Value low, high, _ := n.SliceBounds() if low != nil { - i = s.extendIndex(s.expr(low), panicslice) + i = s.expr(low) } if high != nil { - j = s.extendIndex(s.expr(high), panicslice) + j = s.expr(high) } p, l, _ := s.slice(n.Left.Type, v, i, j, nil, n.Bounded()) return s.newValue2(ssa.OpStringMake, n.Type, p, l) @@ -2680,15 +2731,15 @@ func (s *state) assign(left *Node, right *ssa.Value, deref bool, skip skipMask) // The bounds check must fail. Might as well // ignore the actual index and just use zeros. z := s.constInt(types.Types[TINT], 0) - s.boundsCheck(z, z) + s.boundsCheck(z, z, ssa.BoundsIndex, false) return } if n != 1 { s.Fatalf("assigning to non-1-length array") } // Rewrite to a = [1]{v} - i = s.extendIndex(i, panicindex) - s.boundsCheck(i, s.constInt(types.Types[TINT], 1)) + len := s.constInt(types.Types[TINT], 1) + i = s.boundsCheck(i, len, ssa.BoundsIndex, false) v := s.newValue1(ssa.OpArrayMake1, t, right) s.assign(left.Left, v, false, 0) return @@ -3875,21 +3926,15 @@ func (s *state) addr(n *Node, bounded bool) *ssa.Value { if n.Left.Type.IsSlice() { a := s.expr(n.Left) i := s.expr(n.Right) - i = s.extendIndex(i, panicindex) len := s.newValue1(ssa.OpSliceLen, types.Types[TINT], a) - if !n.Bounded() { - s.boundsCheck(i, len) - } + i = s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded()) p := s.newValue1(ssa.OpSlicePtr, t, a) return s.newValue2(ssa.OpPtrIndex, t, p, i) } else { // array a := s.addr(n.Left, bounded) i := s.expr(n.Right) - i = s.extendIndex(i, panicindex) len := s.constInt(types.Types[TINT], n.Left.Type.NumElem()) - if !n.Bounded() { - s.boundsCheck(i, len) - } + i = s.boundsCheck(i, len, ssa.BoundsIndex, n.Bounded()) return s.newValue2(ssa.OpPtrIndex, types.NewPtr(n.Left.Type.Elem()), a, i) } case ODEREF: @@ -4028,32 +4073,70 @@ func (s *state) nilCheck(ptr *ssa.Value) { s.newValue2(ssa.OpNilCheck, types.TypeVoid, ptr, s.mem()) } -// boundsCheck generates bounds checking code. Checks if 0 <= idx < len, branches to exit if not. -// len must be known to be nonnegative. +// boundsCheck generates bounds checking code. Checks if 0 <= idx <[=] len, branches to exit if not. // Starts a new block on return. -// idx is already converted to full int width. -func (s *state) boundsCheck(idx, len *ssa.Value) { - if Debug['B'] != 0 { - return +// On input, len must be converted to full int width and be nonnegative. +// Returns idx converted to full int width. +// If bounded is true then caller guarantees the index is not out of bounds +// (but boundsCheck will still extend the index to full int width). +func (s *state) boundsCheck(idx, len *ssa.Value, kind ssa.BoundsKind, bounded bool) *ssa.Value { + idx = s.extendIndex(idx, len, kind, bounded) + + if bounded || Debug['B'] != 0 { + // If bounded or bounds checking is flag-disabled, then no check necessary, + // just return the extended index. + return idx } - // bounds check - cmp := s.newValue2(ssa.OpIsInBounds, types.Types[TBOOL], idx, len) - s.check(cmp, panicindex) -} + bNext := s.f.NewBlock(ssa.BlockPlain) + bPanic := s.f.NewBlock(ssa.BlockExit) + + if !idx.Type.IsSigned() { + switch kind { + case ssa.BoundsIndex: + kind = ssa.BoundsIndexU + case ssa.BoundsSliceAlen: + kind = ssa.BoundsSliceAlenU + case ssa.BoundsSliceAcap: + kind = ssa.BoundsSliceAcapU + case ssa.BoundsSliceB: + kind = ssa.BoundsSliceBU + case ssa.BoundsSlice3Alen: + kind = ssa.BoundsSlice3AlenU + case ssa.BoundsSlice3Acap: + kind = ssa.BoundsSlice3AcapU + case ssa.BoundsSlice3B: + kind = ssa.BoundsSlice3BU + case ssa.BoundsSlice3C: + kind = ssa.BoundsSlice3CU + } + } + + var cmp *ssa.Value + if kind == ssa.BoundsIndex || kind == ssa.BoundsIndexU { + cmp = s.newValue2(ssa.OpIsInBounds, types.Types[TBOOL], idx, len) + } else { + cmp = s.newValue2(ssa.OpIsSliceInBounds, types.Types[TBOOL], idx, len) + } + b := s.endBlock() + b.Kind = ssa.BlockIf + b.SetControl(cmp) + b.Likely = ssa.BranchLikely + b.AddEdgeTo(bNext) + b.AddEdgeTo(bPanic) -// sliceBoundsCheck generates slice bounds checking code. Checks if 0 <= idx <= len, branches to exit if not. -// len must be known to be nonnegative. -// Starts a new block on return. -// idx and len are already converted to full int width. -func (s *state) sliceBoundsCheck(idx, len *ssa.Value) { - if Debug['B'] != 0 { - return + s.startBlock(bPanic) + if thearch.LinkArch.Family == sys.Wasm { + // TODO(khr): figure out how to do "register" based calling convention for bounds checks. + // Should be similar to gcWriteBarrier, but I can't make it work. + s.rtcall(BoundsCheckFunc[kind], false, nil, idx, len) + } else { + mem := s.newValue3I(ssa.OpPanicBounds, types.TypeMem, int64(kind), idx, len, s.mem()) + s.endBlock().SetControl(mem) } + s.startBlock(bNext) - // bounds check - cmp := s.newValue2(ssa.OpIsSliceInBounds, types.Types[TBOOL], idx, len) - s.check(cmp, panicslice) + return idx } // If cmp (a bool) is false, panic using the given function. @@ -4307,21 +4390,36 @@ func (s *state) slice(t *types.Type, v, i, j, k *ssa.Value, bounded bool) (p, l, if j == nil { j = len } + three := true if k == nil { + three = false k = cap } - if !bounded { - // Panic if slice indices are not in bounds. - // Make sure we check these in reverse order so that we're always - // comparing against a value known to be nonnegative. See issue 28797. + // Panic if slice indices are not in bounds. + // Make sure we check these in reverse order so that we're always + // comparing against a value known to be nonnegative. See issue 28797. + if three { if k != cap { - s.sliceBoundsCheck(k, cap) + kind := ssa.BoundsSlice3Alen + if t.IsSlice() { + kind = ssa.BoundsSlice3Acap + } + k = s.boundsCheck(k, cap, kind, bounded) + } + if j != k { + j = s.boundsCheck(j, k, ssa.BoundsSlice3B, bounded) } + i = s.boundsCheck(i, j, ssa.BoundsSlice3C, bounded) + } else { if j != k { - s.sliceBoundsCheck(j, k) + kind := ssa.BoundsSliceAlen + if t.IsSlice() { + kind = ssa.BoundsSliceAcap + } + j = s.boundsCheck(j, k, kind, bounded) } - s.sliceBoundsCheck(i, j) + i = s.boundsCheck(i, j, ssa.BoundsSliceB, bounded) } // Generate the following code assuming that indexes are in bounds. @@ -5432,26 +5530,66 @@ func AddAux2(a *obj.Addr, v *ssa.Value, offset int64) { } // extendIndex extends v to a full int width. -// panic using the given function if v does not fit in an int (only on 32-bit archs). -func (s *state) extendIndex(v *ssa.Value, panicfn *obj.LSym) *ssa.Value { - size := v.Type.Size() +// panic with the given kind if v does not fit in an int (only on 32-bit archs). +func (s *state) extendIndex(idx, len *ssa.Value, kind ssa.BoundsKind, bounded bool) *ssa.Value { + size := idx.Type.Size() if size == s.config.PtrSize { - return v + return idx } if size > s.config.PtrSize { // truncate 64-bit indexes on 32-bit pointer archs. Test the // high word and branch to out-of-bounds failure if it is not 0. - if Debug['B'] == 0 { - hi := s.newValue1(ssa.OpInt64Hi, types.Types[TUINT32], v) - cmp := s.newValue2(ssa.OpEq32, types.Types[TBOOL], hi, s.constInt32(types.Types[TUINT32], 0)) - s.check(cmp, panicfn) + var lo *ssa.Value + if idx.Type.IsSigned() { + lo = s.newValue1(ssa.OpInt64Lo, types.Types[TINT], idx) + } else { + lo = s.newValue1(ssa.OpInt64Lo, types.Types[TUINT], idx) + } + if bounded || Debug['B'] != 0 { + return lo + } + bNext := s.f.NewBlock(ssa.BlockPlain) + bPanic := s.f.NewBlock(ssa.BlockExit) + hi := s.newValue1(ssa.OpInt64Hi, types.Types[TUINT32], idx) + cmp := s.newValue2(ssa.OpEq32, types.Types[TBOOL], hi, s.constInt32(types.Types[TUINT32], 0)) + if !idx.Type.IsSigned() { + switch kind { + case ssa.BoundsIndex: + kind = ssa.BoundsIndexU + case ssa.BoundsSliceAlen: + kind = ssa.BoundsSliceAlenU + case ssa.BoundsSliceAcap: + kind = ssa.BoundsSliceAcapU + case ssa.BoundsSliceB: + kind = ssa.BoundsSliceBU + case ssa.BoundsSlice3Alen: + kind = ssa.BoundsSlice3AlenU + case ssa.BoundsSlice3Acap: + kind = ssa.BoundsSlice3AcapU + case ssa.BoundsSlice3B: + kind = ssa.BoundsSlice3BU + case ssa.BoundsSlice3C: + kind = ssa.BoundsSlice3CU + } } - return s.newValue1(ssa.OpTrunc64to32, types.Types[TINT], v) + b := s.endBlock() + b.Kind = ssa.BlockIf + b.SetControl(cmp) + b.Likely = ssa.BranchLikely + b.AddEdgeTo(bNext) + b.AddEdgeTo(bPanic) + + s.startBlock(bPanic) + mem := s.newValue4I(ssa.OpPanicExtend, types.TypeMem, int64(kind), hi, lo, len, s.mem()) + s.endBlock().SetControl(mem) + s.startBlock(bNext) + + return lo } // Extend value to the required size var op ssa.Op - if v.Type.IsSigned() { + if idx.Type.IsSigned() { switch 10*size + s.config.PtrSize { case 14: op = ssa.OpSignExt8to32 @@ -5464,7 +5602,7 @@ func (s *state) extendIndex(v *ssa.Value, panicfn *obj.LSym) *ssa.Value { case 48: op = ssa.OpSignExt32to64 default: - s.Fatalf("bad signed index extension %s", v.Type) + s.Fatalf("bad signed index extension %s", idx.Type) } } else { switch 10*size + s.config.PtrSize { @@ -5479,10 +5617,10 @@ func (s *state) extendIndex(v *ssa.Value, panicfn *obj.LSym) *ssa.Value { case 48: op = ssa.OpZeroExt32to64 default: - s.Fatalf("bad unsigned index extension %s", v.Type) + s.Fatalf("bad unsigned index extension %s", idx.Type) } } - return s.newValue1(op, types.Types[TINT], v) + return s.newValue1(op, types.Types[TINT], idx) } // CheckLoweredPhi checks that regalloc and stackalloc correctly handled phi values. @@ -5612,6 +5750,14 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) { } } +// UseArgs records the fact that an instruction needs a certain amount of +// callee args space for its use. +func (s *SSAGenState) UseArgs(n int64) { + if s.maxarg < n { + s.maxarg = n + } +} + // fieldIdx finds the index of the field referred to by the ODOT node n. func fieldIdx(n *Node) int { t := n.Left.Type diff --git a/src/cmd/compile/internal/mips/ssa.go b/src/cmd/compile/internal/mips/ssa.go index 97a9b20537..d2ea0f46bb 100644 --- a/src/cmd/compile/internal/mips/ssa.go +++ b/src/cmd/compile/internal/mips/ssa.go @@ -485,6 +485,18 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpMIPSLoweredPanicBoundsA, ssa.OpMIPSLoweredPanicBoundsB, ssa.OpMIPSLoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(8) // space used in callee args area by assembly stubs + case ssa.OpMIPSLoweredPanicExtendA, ssa.OpMIPSLoweredPanicExtendB, ssa.OpMIPSLoweredPanicExtendC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.ExtendCheckFunc[v.AuxInt] + s.UseArgs(12) // space used in callee args area by assembly stubs case ssa.OpMIPSLoweredAtomicLoad: s.Prog(mips.ASYNC) diff --git a/src/cmd/compile/internal/mips64/ssa.go b/src/cmd/compile/internal/mips64/ssa.go index 8a2d2b0f7a..d0c8b06900 100644 --- a/src/cmd/compile/internal/mips64/ssa.go +++ b/src/cmd/compile/internal/mips64/ssa.go @@ -489,6 +489,12 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpMIPS64LoweredPanicBoundsA, ssa.OpMIPS64LoweredPanicBoundsB, ssa.OpMIPS64LoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(16) // space used in callee args area by assembly stubs case ssa.OpMIPS64LoweredAtomicLoad32, ssa.OpMIPS64LoweredAtomicLoad64: as := mips.AMOVV if v.Op == ssa.OpMIPS64LoweredAtomicLoad32 { diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 3b37c797a9..4cccbecbb3 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -1183,6 +1183,13 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpPPC64LoweredPanicBoundsA, ssa.OpPPC64LoweredPanicBoundsB, ssa.OpPPC64LoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(16) // space used in callee args area by assembly stubs + case ssa.OpPPC64LoweredNilCheck: if objabi.GOOS == "aix" { // CMP Rarg0, R0 diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index be48e1b23e..d90605bcbd 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -514,6 +514,12 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_MEM p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.OpS390XLoweredPanicBoundsA, ssa.OpS390XLoweredPanicBoundsB, ssa.OpS390XLoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(16) // space used in callee args area by assembly stubs case ssa.OpS390XFLOGR, ssa.OpS390XPOPCNT, ssa.OpS390XNEG, ssa.OpS390XNEGW, ssa.OpS390XMOVWBR, ssa.OpS390XMOVDBR: diff --git a/src/cmd/compile/internal/ssa/func.go b/src/cmd/compile/internal/ssa/func.go index fe02dd434a..4f6dbff208 100644 --- a/src/cmd/compile/internal/ssa/func.go +++ b/src/cmd/compile/internal/ssa/func.go @@ -512,6 +512,18 @@ func (b *Block) NewValue4(pos src.XPos, op Op, t *types.Type, arg0, arg1, arg2, return v } +// NewValue4I returns a new value in the block with four arguments and and auxint value. +func (b *Block) NewValue4I(pos src.XPos, op Op, t *types.Type, auxint int64, arg0, arg1, arg2, arg3 *Value) *Value { + v := b.Func.newValue(op, t, b, pos) + v.AuxInt = auxint + v.Args = []*Value{arg0, arg1, arg2, arg3} + arg0.Uses++ + arg1.Uses++ + arg2.Uses++ + arg3.Uses++ + return v +} + // constVal returns a constant value for c. func (f *Func) constVal(op Op, t *types.Type, c int64, setAuxInt bool) *Value { if f.constants == nil { diff --git a/src/cmd/compile/internal/ssa/gen/386.rules b/src/cmd/compile/internal/ssa/gen/386.rules index 2ee0b2a928..0f20b115f8 100644 --- a/src/cmd/compile/internal/ssa/gen/386.rules +++ b/src/cmd/compile/internal/ssa/gen/386.rules @@ -385,6 +385,14 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 0 -> (LoweredPanicExtendA [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 1 -> (LoweredPanicExtendB [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 2 -> (LoweredPanicExtendC [kind] hi lo y mem) + // *************************** // Above: lowering rules // Below: optimizations diff --git a/src/cmd/compile/internal/ssa/gen/386Ops.go b/src/cmd/compile/internal/ssa/gen/386Ops.go index fa3e7cd375..2851c4321c 100644 --- a/src/cmd/compile/internal/ssa/gen/386Ops.go +++ b/src/cmd/compile/internal/ssa/gen/386Ops.go @@ -86,6 +86,8 @@ func init() { ax = buildReg("AX") cx = buildReg("CX") dx = buildReg("DX") + bx = buildReg("BX") + si = buildReg("SI") gp = buildReg("AX CX DX BX BP SI DI") fp = buildReg("X0 X1 X2 X3 X4 X5 X6 X7") gpsp = gp | buildReg("SP") @@ -524,6 +526,17 @@ func init() { // It saves all GP registers if necessary, but may clobber others. {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("DI"), ax}, clobbers: callerSave &^ gp}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{dx, bx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{cx, dx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{ax, cx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + // Extend ops are the same as Bounds ops except the indexes are 64-bit. + {name: "LoweredPanicExtendA", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, dx, bx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendB", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, cx, dx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendC", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, ax, cx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + // Constant flag values. For any comparison, there are 5 possible // outcomes: the three from the signed total order (<,==,>) and the // three from the unsigned total order. The == cases overlap. diff --git a/src/cmd/compile/internal/ssa/gen/AMD64.rules b/src/cmd/compile/internal/ssa/gen/AMD64.rules index 6b2d3f77cf..91bb22f3fe 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64.rules +++ b/src/cmd/compile/internal/ssa/gen/AMD64.rules @@ -225,7 +225,8 @@ (NeqPtr x y) && config.PtrSize == 4 -> (SETNE (CMPL x y)) (Neq(32|64)F x y) -> (SETNEF (UCOMIS(S|D) x y)) -(Int64Hi x) -> (SHRQconst [32] x) // needed for amd64p32 +(Int64Hi x) -> (SHRQconst [32] x) // needed for amd64p32 +(Int64Lo x) -> x // Lowering loads (Load ptr mem) && (is64BitInt(t) || isPtr(t) && config.PtrSize == 8) -> (MOVQload ptr mem) @@ -561,6 +562,15 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + +// For amd64p32 +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 0 -> (LoweredPanicExtendA [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 1 -> (LoweredPanicExtendB [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 2 -> (LoweredPanicExtendC [kind] hi lo y mem) + // *************************** // Above: lowering rules // Below: optimizations diff --git a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go index a7880430ae..3ce302f514 100644 --- a/src/cmd/compile/internal/ssa/gen/AMD64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/AMD64Ops.go @@ -93,6 +93,8 @@ func init() { ax = buildReg("AX") cx = buildReg("CX") dx = buildReg("DX") + bx = buildReg("BX") + si = buildReg("SI") gp = buildReg("AX CX DX BX BP SI DI R8 R9 R10 R11 R12 R13 R14 R15") fp = buildReg("X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15") gpsp = gp | buildReg("SP") @@ -709,6 +711,19 @@ func init() { // It saves all GP registers if necessary, but may clobber others. {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("DI"), ax}, clobbers: callerSave &^ gp}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{dx, bx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{cx, dx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{ax, cx}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + + // amd64p32 only: PanicBounds ops take 32-bit indexes. + // The Extend ops are the same as the Bounds ops except the indexes are 64-bit. + {name: "LoweredPanicExtendA", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, dx, bx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendB", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, cx, dx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendC", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{si, ax, cx}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + // Constant flag values. For any comparison, there are 5 possible // outcomes: the three from the signed total order (<,==,>) and the // three from the unsigned total order. The == cases overlap. diff --git a/src/cmd/compile/internal/ssa/gen/ARM.rules b/src/cmd/compile/internal/ssa/gen/ARM.rules index a3f36d3009..2934a91429 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM.rules @@ -406,6 +406,14 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 0 -> (LoweredPanicExtendA [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 1 -> (LoweredPanicExtendB [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 2 -> (LoweredPanicExtendC [kind] hi lo y mem) + // Optimizations // fold offset into address diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 3adb7895a2..35126835d2 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -600,6 +600,10 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + // Optimizations // Absorb boolean tests into block diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index b6bf10315e..04c4b3f517 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -130,6 +130,10 @@ func init() { gpspsbg = gpspg | buildReg("SB") fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31") callerSave = gp | fp | buildReg("g") // runtime.setg (and anything calling it) may clobber g + r0 = buildReg("R0") + r1 = buildReg("R1") + r2 = buildReg("R2") + r3 = buildReg("R3") ) // Common regInfo var ( @@ -650,6 +654,13 @@ func init() { // It saves all GP registers if necessary, // but clobbers R30 (LR) because it's a call. {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R30")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r0, r1}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). } blocks := []blockData{ diff --git a/src/cmd/compile/internal/ssa/gen/ARMOps.go b/src/cmd/compile/internal/ssa/gen/ARMOps.go index 86d7e5f8ec..d8bdfeb86e 100644 --- a/src/cmd/compile/internal/ssa/gen/ARMOps.go +++ b/src/cmd/compile/internal/ssa/gen/ARMOps.go @@ -94,6 +94,11 @@ func init() { gpspsbg = gpspg | buildReg("SB") fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15") callerSave = gp | fp | buildReg("g") // runtime.setg (and anything calling it) may clobber g + r0 = buildReg("R0") + r1 = buildReg("R1") + r2 = buildReg("R2") + r3 = buildReg("R3") + r4 = buildReg("R4") ) // Common regInfo var ( @@ -526,6 +531,17 @@ func init() { // See runtime/stubs.go for a more detailed discussion. {name: "LoweredGetCallerPC", reg: gp01, rematerializeable: true}, + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r0, r1}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + // Extend ops are the same as Bounds ops except the indexes are 64-bit. + {name: "LoweredPanicExtendA", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r2, r3}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendB", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r1, r2}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendC", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r0, r1}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + // Constant flag values. For any comparison, there are 5 possible // outcomes: the three from the signed total order (<,==,>) and the // three from the unsigned total order. The == cases overlap. diff --git a/src/cmd/compile/internal/ssa/gen/MIPS.rules b/src/cmd/compile/internal/ssa/gen/MIPS.rules index bd218b494f..573f1d44c7 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS.rules +++ b/src/cmd/compile/internal/ssa/gen/MIPS.rules @@ -410,6 +410,13 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 0 -> (LoweredPanicExtendA [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 1 -> (LoweredPanicExtendB [kind] hi lo y mem) +(PanicExtend [kind] hi lo y mem) && boundsABI(kind) == 2 -> (LoweredPanicExtendC [kind] hi lo y mem) // Optimizations diff --git a/src/cmd/compile/internal/ssa/gen/MIPS64.rules b/src/cmd/compile/internal/ssa/gen/MIPS64.rules index 9c16c35438..52f9c4895d 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS64.rules +++ b/src/cmd/compile/internal/ssa/gen/MIPS64.rules @@ -412,6 +412,10 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + // Optimizations // Absorb boolean tests into block diff --git a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go index 5235930ccc..f476c9b6fe 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/MIPS64Ops.go @@ -136,6 +136,10 @@ func init() { lo = buildReg("LO") hi = buildReg("HI") callerSave = gp | fp | lo | hi | buildReg("g") // runtime.setg (and anything calling it) may clobber g + r1 = buildReg("R1") + r2 = buildReg("R2") + r3 = buildReg("R3") + r4 = buildReg("R4") ) // Common regInfo var ( @@ -420,6 +424,13 @@ func init() { // but clobbers R31 (LR) because it's a call // and R23 (REGTMP). {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ gpg) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). } blocks := []blockData{ diff --git a/src/cmd/compile/internal/ssa/gen/MIPSOps.go b/src/cmd/compile/internal/ssa/gen/MIPSOps.go index 2605b60650..729cc05102 100644 --- a/src/cmd/compile/internal/ssa/gen/MIPSOps.go +++ b/src/cmd/compile/internal/ssa/gen/MIPSOps.go @@ -120,6 +120,11 @@ func init() { lo = buildReg("LO") hi = buildReg("HI") callerSave = gp | fp | lo | hi | buildReg("g") // runtime.setg (and anything calling it) may clobber g + r1 = buildReg("R1") + r2 = buildReg("R2") + r3 = buildReg("R3") + r4 = buildReg("R4") + r5 = buildReg("R5") ) // Common regInfo var ( @@ -390,6 +395,17 @@ func init() { // but clobbers R31 (LR) because it's a call // and R23 (REGTMP). {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ gpg) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + // Extend ops are the same as Bounds ops except the indexes are 64-bit. + {name: "LoweredPanicExtendA", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r3, r4}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendB", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r2, r3}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). + {name: "LoweredPanicExtendC", argLength: 4, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r1, r2}}, typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. AuxInt contains report code (see PanicExtend in genericOps.go). } blocks := []blockData{ diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index 8dee5a1cba..b0a249a558 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -655,6 +655,10 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + // Optimizations // Note that PPC "logical" immediates come in 0:15 and 16:31 unsigned immediate forms, // so ORconst, XORconst easily expand into a pair. diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index d6638b1ec7..2404d1afd6 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -158,6 +158,10 @@ func init() { fpstore = regInfo{inputs: []regMask{gp | sp | sb, fp}} fpstoreidx = regInfo{inputs: []regMask{gp | sp | sb, gp | sp | sb, fp}} callerSave = regMask(gp | fp | gr) + r3 = buildReg("R3") + r4 = buildReg("R4") + r5 = buildReg("R5") + r6 = buildReg("R6") ) ops := []opData{ {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1 @@ -537,6 +541,13 @@ func init() { // but may clobber anything else, including R31 (REGTMP). {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R20"), buildReg("R21")}, clobbers: (callerSave &^ buildReg("R0 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R20 R21 g")) | buildReg("R31")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r5, r6}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r4, r5}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r3, r4}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in genericOps.go). + // (InvertFlags (CMP a b)) == (CMP b a) // So if we want (LessThan (CMP a b)) but we can't do that because a is a constant, // then we do (LessThan (InvertFlags (CMP b a))) instead. diff --git a/src/cmd/compile/internal/ssa/gen/S390X.rules b/src/cmd/compile/internal/ssa/gen/S390X.rules index 0aeea53561..2803f2ff50 100644 --- a/src/cmd/compile/internal/ssa/gen/S390X.rules +++ b/src/cmd/compile/internal/ssa/gen/S390X.rules @@ -419,6 +419,10 @@ // Write barrier. (WB {fn} destptr srcptr mem) -> (LoweredWB {fn} destptr srcptr mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 0 -> (LoweredPanicBoundsA [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 1 -> (LoweredPanicBoundsB [kind] x y mem) +(PanicBounds [kind] x y mem) && boundsABI(kind) == 2 -> (LoweredPanicBoundsC [kind] x y mem) + // *************************** // Above: lowering rules // Below: optimizations diff --git a/src/cmd/compile/internal/ssa/gen/S390XOps.go b/src/cmd/compile/internal/ssa/gen/S390XOps.go index 19cb4be41c..4074243e98 100644 --- a/src/cmd/compile/internal/ssa/gen/S390XOps.go +++ b/src/cmd/compile/internal/ssa/gen/S390XOps.go @@ -127,6 +127,9 @@ func init() { fp = buildReg("F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15") callerSave = gp | fp | buildReg("g") // runtime.setg (and anything calling it) may clobber g + r1 = buildReg("R1") + r2 = buildReg("R2") + r3 = buildReg("R3") ) // Common slices of register masks var ( @@ -463,6 +466,13 @@ func init() { // but clobbers R14 (LR) because it's a call. {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R14")}, clobberFlags: true, aux: "Sym", symEffect: "None"}, + // There are three of these functions so that they can have three different register inputs. + // When we check 0 <= c <= cap (A), then 0 <= b <= c (B), then 0 <= a <= b (C), we want the + // default registers to match so we don't need to copy registers around unnecessarily. + {name: "LoweredPanicBoundsA", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r2, r3}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsB", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r1, r2}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + {name: "LoweredPanicBoundsC", argLength: 3, aux: "Int64", reg: regInfo{inputs: []regMask{r0, r1}}, typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. AuxInt contains report code (see PanicBounds in generic.go). + // Constant flag values. For any comparison, there are 5 possible // outcomes: the three from the signed total order (<,==,>) and the // three from the unsigned total order. The == cases overlap. diff --git a/src/cmd/compile/internal/ssa/gen/genericOps.go b/src/cmd/compile/internal/ssa/gen/genericOps.go index 89e6961bd7..79169c34a1 100644 --- a/src/cmd/compile/internal/ssa/gen/genericOps.go +++ b/src/cmd/compile/internal/ssa/gen/genericOps.go @@ -369,6 +369,14 @@ var genericOps = []opData{ // arch-dependent), and is not a safe-point. {name: "WB", argLength: 3, typ: "Mem", aux: "Sym", symEffect: "None"}, // arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier + // PanicBounds and PanicExtend generate a runtime panic. + // Their arguments provide index values to use in panic messages. + // Both PanicBounds and PanicExtend have an AuxInt value from the BoundsKind type (in ../op.go). + // PanicBounds' index is int sized. + // PanicExtend's index is int64 sized. (PanicExtend is only used on 32-bit archs.) + {name: "PanicBounds", argLength: 3, aux: "Int64", typ: "Mem"}, // arg0=idx, arg1=len, arg2=mem, returns memory. + {name: "PanicExtend", argLength: 4, aux: "Int64", typ: "Mem"}, // arg0=idxHi, arg1=idxLo, arg2=len, arg3=mem, returns memory. + // Function calls. Arguments to the call have already been written to the stack. // Return values appear on the stack. The method receiver, if any, is treated // as a phantom first argument. diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index a3cebce43b..b404533f6c 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -165,3 +165,70 @@ func (x ValAndOff) add(off int64) int64 { } return makeValAndOff(x.Val(), x.Off()+off) } + +type BoundsKind uint8 + +const ( + BoundsIndex BoundsKind = iota // indexing operation, 0 <= idx < len failed + BoundsIndexU // ... with unsigned idx + BoundsSliceAlen // 2-arg slicing operation, 0 <= high <= len failed + BoundsSliceAlenU // ... with unsigned high + BoundsSliceAcap // 2-arg slicing operation, 0 <= high <= cap failed + BoundsSliceAcapU // ... with unsigned high + BoundsSliceB // 2-arg slicing operation, 0 <= low <= high failed + BoundsSliceBU // ... with unsigned low + BoundsSlice3Alen // 3-arg slicing operation, 0 <= max <= len failed + BoundsSlice3AlenU // ... with unsigned max + BoundsSlice3Acap // 3-arg slicing operation, 0 <= max <= cap failed + BoundsSlice3AcapU // ... with unsigned max + BoundsSlice3B // 3-arg slicing operation, 0 <= high <= max failed + BoundsSlice3BU // ... with unsigned high + BoundsSlice3C // 3-arg slicing operation, 0 <= low <= high failed + BoundsSlice3CU // ... with unsigned low + BoundsKindCount +) + +// boundsAPI determines which register arguments a bounds check call should use. For an [a:b:c] slice, we do: +// CMPQ c, cap +// JA fail1 +// CMPQ b, c +// JA fail2 +// CMPQ a, b +// JA fail3 +// +// fail1: CALL panicSlice3Acap (c, cap) +// fail2: CALL panicSlice3B (b, c) +// fail3: CALL panicSlice3C (a, b) +// +// When we register allocate that code, we want the same register to be used for +// the first arg of panicSlice3Acap and the second arg to panicSlice3B. That way, +// initializing that register once will satisfy both calls. +// That desire ends up dividing the set of bounds check calls into 3 sets. This function +// determines which set to use for a given panic call. +// The first arg for set 0 should be the second arg for set 1. +// The first arg for set 1 should be the second arg for set 2. +func boundsABI(b int64) int { + switch BoundsKind(b) { + case BoundsSlice3Alen, + BoundsSlice3AlenU, + BoundsSlice3Acap, + BoundsSlice3AcapU: + return 0 + case BoundsSliceAlen, + BoundsSliceAlenU, + BoundsSliceAcap, + BoundsSliceAcapU, + BoundsSlice3B, + BoundsSlice3BU: + return 1 + case BoundsIndex, + BoundsIndexU, + BoundsSliceB, + BoundsSliceBU, + BoundsSlice3C, + BoundsSlice3CU: + return 2 + default: + panic("bad BoundsKind") + } +} diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index bf9fe7c960..c5e88e853e 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -463,6 +463,12 @@ const ( Op386LoweredGetCallerSP Op386LoweredNilCheck Op386LoweredWB + Op386LoweredPanicBoundsA + Op386LoweredPanicBoundsB + Op386LoweredPanicBoundsC + Op386LoweredPanicExtendA + Op386LoweredPanicExtendB + Op386LoweredPanicExtendC Op386FlagEQ Op386FlagLT_ULT Op386FlagLT_UGT @@ -844,6 +850,12 @@ const ( OpAMD64LoweredGetCallerSP OpAMD64LoweredNilCheck OpAMD64LoweredWB + OpAMD64LoweredPanicBoundsA + OpAMD64LoweredPanicBoundsB + OpAMD64LoweredPanicBoundsC + OpAMD64LoweredPanicExtendA + OpAMD64LoweredPanicExtendB + OpAMD64LoweredPanicExtendC OpAMD64FlagEQ OpAMD64FlagLT_ULT OpAMD64FlagLT_UGT @@ -1115,6 +1127,12 @@ const ( OpARMLoweredGetClosurePtr OpARMLoweredGetCallerSP OpARMLoweredGetCallerPC + OpARMLoweredPanicBoundsA + OpARMLoweredPanicBoundsB + OpARMLoweredPanicBoundsC + OpARMLoweredPanicExtendA + OpARMLoweredPanicExtendB + OpARMLoweredPanicExtendC OpARMFlagEQ OpARMFlagLT_ULT OpARMFlagLT_UGT @@ -1403,6 +1421,9 @@ const ( OpARM64LoweredAtomicAnd8 OpARM64LoweredAtomicOr8 OpARM64LoweredWB + OpARM64LoweredPanicBoundsA + OpARM64LoweredPanicBoundsB + OpARM64LoweredPanicBoundsC OpMIPSADD OpMIPSADDconst @@ -1506,6 +1527,12 @@ const ( OpMIPSLoweredGetCallerSP OpMIPSLoweredGetCallerPC OpMIPSLoweredWB + OpMIPSLoweredPanicBoundsA + OpMIPSLoweredPanicBoundsB + OpMIPSLoweredPanicBoundsC + OpMIPSLoweredPanicExtendA + OpMIPSLoweredPanicExtendB + OpMIPSLoweredPanicExtendC OpMIPS64ADDV OpMIPS64ADDVconst @@ -1619,6 +1646,9 @@ const ( OpMIPS64LoweredGetCallerSP OpMIPS64LoweredGetCallerPC OpMIPS64LoweredWB + OpMIPS64LoweredPanicBoundsA + OpMIPS64LoweredPanicBoundsB + OpMIPS64LoweredPanicBoundsC OpPPC64ADD OpPPC64ADDconst @@ -1799,6 +1829,9 @@ const ( OpPPC64LoweredAtomicAnd8 OpPPC64LoweredAtomicOr8 OpPPC64LoweredWB + OpPPC64LoweredPanicBoundsA + OpPPC64LoweredPanicBoundsB + OpPPC64LoweredPanicBoundsC OpPPC64InvertFlags OpPPC64FlagEQ OpPPC64FlagLT @@ -1994,6 +2027,9 @@ const ( OpS390XLoweredRound32F OpS390XLoweredRound64F OpS390XLoweredWB + OpS390XLoweredPanicBoundsA + OpS390XLoweredPanicBoundsB + OpS390XLoweredPanicBoundsC OpS390XFlagEQ OpS390XFlagLT OpS390XFlagGT @@ -2351,6 +2387,8 @@ const ( OpMoveWB OpZeroWB OpWB + OpPanicBounds + OpPanicExtend OpClosureCall OpStaticCall OpInterCall @@ -5588,6 +5626,75 @@ var opcodeTable = [...]opInfo{ clobbers: 65280, // X0 X1 X2 X3 X4 X5 X6 X7 }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // DX + {1, 8}, // BX + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // CX + {1, 4}, // DX + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1}, // AX + {1, 2}, // CX + }, + }, + }, + { + name: "LoweredPanicExtendA", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 4}, // DX + {2, 8}, // BX + }, + }, + }, + { + name: "LoweredPanicExtendB", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 2}, // CX + {2, 4}, // DX + }, + }, + }, + { + name: "LoweredPanicExtendC", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 1}, // AX + {2, 2}, // CX + }, + }, + }, { name: "FlagEQ", argLen: 0, @@ -11113,6 +11220,75 @@ var opcodeTable = [...]opInfo{ clobbers: 4294901760, // X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // DX + {1, 8}, // BX + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // CX + {1, 4}, // DX + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1}, // AX + {1, 2}, // CX + }, + }, + }, + { + name: "LoweredPanicExtendA", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 4}, // DX + {2, 8}, // BX + }, + }, + }, + { + name: "LoweredPanicExtendB", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 2}, // CX + {2, 4}, // DX + }, + }, + }, + { + name: "LoweredPanicExtendC", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 64}, // SI + {1, 1}, // AX + {2, 2}, // CX + }, + }, + }, { name: "FlagEQ", argLen: 0, @@ -14847,6 +15023,75 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // R2 + {1, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // R1 + {1, 4}, // R2 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1}, // R0 + {1, 2}, // R1 + }, + }, + }, + { + name: "LoweredPanicExtendA", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 16}, // R4 + {1, 4}, // R2 + {2, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicExtendB", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 16}, // R4 + {1, 2}, // R1 + {2, 4}, // R2 + }, + }, + }, + { + name: "LoweredPanicExtendC", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 16}, // R4 + {1, 1}, // R0 + {2, 2}, // R1 + }, + }, + }, { name: "FlagEQ", argLen: 0, @@ -18610,6 +18855,39 @@ var opcodeTable = [...]opInfo{ clobbers: 9223372035244163072, // R30 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31 }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // R2 + {1, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // R1 + {1, 4}, // R2 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1}, // R0 + {1, 2}, // R1 + }, + }, + }, { name: "ADD", @@ -20000,6 +20278,75 @@ var opcodeTable = [...]opInfo{ clobbers: 140737219919872, // R31 F0 F2 F4 F6 F8 F10 F12 F14 F16 F18 F20 F22 F24 F26 F28 F30 HI LO }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 8}, // R3 + {1, 16}, // R4 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // R2 + {1, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // R1 + {1, 4}, // R2 + }, + }, + }, + { + name: "LoweredPanicExtendA", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 32}, // R5 + {1, 8}, // R3 + {2, 16}, // R4 + }, + }, + }, + { + name: "LoweredPanicExtendB", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 32}, // R5 + {1, 4}, // R2 + {2, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicExtendC", + auxType: auxInt64, + argLen: 4, + reg: regInfo{ + inputs: []inputInfo{ + {0, 32}, // R5 + {1, 2}, // R1 + {2, 4}, // R2 + }, + }, + }, { name: "ADDV", @@ -21530,6 +21877,39 @@ var opcodeTable = [...]opInfo{ clobbers: 4611686018293170176, // R31 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 F27 F28 F29 F30 F31 HI LO }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 8}, // R3 + {1, 16}, // R4 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // R2 + {1, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // R1 + {1, 4}, // R2 + }, + }, + }, { name: "ADD", @@ -24010,6 +24390,39 @@ var opcodeTable = [...]opInfo{ clobbers: 576460746931503104, // R16 R17 R18 R19 R22 R23 R24 R25 R26 R27 R28 R29 R31 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 F21 F22 F23 F24 F25 F26 }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 32}, // R5 + {1, 64}, // R6 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 16}, // R4 + {1, 32}, // R5 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 8}, // R3 + {1, 16}, // R4 + }, + }, + }, { name: "InvertFlags", argLen: 1, @@ -26871,6 +27284,39 @@ var opcodeTable = [...]opInfo{ clobbers: 4294918144, // R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 }, }, + { + name: "LoweredPanicBoundsA", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4}, // R2 + {1, 8}, // R3 + }, + }, + }, + { + name: "LoweredPanicBoundsB", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 2}, // R1 + {1, 4}, // R2 + }, + }, + }, + { + name: "LoweredPanicBoundsC", + auxType: auxInt64, + argLen: 3, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1}, // R0 + {1, 2}, // R1 + }, + }, + }, { name: "FlagEQ", argLen: 0, @@ -29693,6 +30139,18 @@ var opcodeTable = [...]opInfo{ symEffect: SymNone, generic: true, }, + { + name: "PanicBounds", + auxType: auxInt64, + argLen: 3, + generic: true, + }, + { + name: "PanicExtend", + auxType: auxInt64, + argLen: 4, + generic: true, + }, { name: "ClosureCall", auxType: auxInt64, diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index e2d76ecb85..bb59feab0b 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -587,6 +587,10 @@ func rewriteValue386(v *Value) bool { return rewriteValue386_OpOr8_0(v) case OpOrB: return rewriteValue386_OpOrB_0(v) + case OpPanicBounds: + return rewriteValue386_OpPanicBounds_0(v) + case OpPanicExtend: + return rewriteValue386_OpPanicExtend_0(v) case OpRound32F: return rewriteValue386_OpRound32F_0(v) case OpRound64F: @@ -22897,6 +22901,132 @@ func rewriteValue386_OpOrB_0(v *Value) bool { return true } } +func rewriteValue386_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(Op386LoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(Op386LoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(Op386LoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} +func rewriteValue386_OpPanicExtend_0(v *Value) bool { + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicExtendA [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 0) { + break + } + v.reset(Op386LoweredPanicExtendA) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicExtendB [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 1) { + break + } + v.reset(Op386LoweredPanicExtendB) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicExtendC [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 2) { + break + } + v.reset(Op386LoweredPanicExtendC) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValue386_OpRound32F_0(v *Value) bool { // match: (Round32F x) // cond: diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 926c4a599c..708ab9df05 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -831,6 +831,8 @@ func rewriteValueAMD64(v *Value) bool { return rewriteValueAMD64_OpHmul64u_0(v) case OpInt64Hi: return rewriteValueAMD64_OpInt64Hi_0(v) + case OpInt64Lo: + return rewriteValueAMD64_OpInt64Lo_0(v) case OpInterCall: return rewriteValueAMD64_OpInterCall_0(v) case OpIsInBounds: @@ -991,6 +993,10 @@ func rewriteValueAMD64(v *Value) bool { return rewriteValueAMD64_OpOr8_0(v) case OpOrB: return rewriteValueAMD64_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueAMD64_OpPanicBounds_0(v) + case OpPanicExtend: + return rewriteValueAMD64_OpPanicExtend_0(v) case OpPopCount16: return rewriteValueAMD64_OpPopCount16_0(v) case OpPopCount32: @@ -59244,6 +59250,18 @@ func rewriteValueAMD64_OpInt64Hi_0(v *Value) bool { return true } } +func rewriteValueAMD64_OpInt64Lo_0(v *Value) bool { + // match: (Int64Lo x) + // cond: + // result: x + for { + x := v.Args[0] + v.reset(OpCopy) + v.Type = x.Type + v.AddArg(x) + return true + } +} func rewriteValueAMD64_OpInterCall_0(v *Value) bool { // match: (InterCall [argwid] entry mem) // cond: @@ -61695,6 +61713,132 @@ func rewriteValueAMD64_OpOrB_0(v *Value) bool { return true } } +func rewriteValueAMD64_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpAMD64LoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpAMD64LoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpAMD64LoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueAMD64_OpPanicExtend_0(v *Value) bool { + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicExtendA [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpAMD64LoweredPanicExtendA) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicExtendB [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpAMD64LoweredPanicExtendB) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicExtendC [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpAMD64LoweredPanicExtendC) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueAMD64_OpPopCount16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 37a34a9977..11c1bde8d1 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -719,6 +719,10 @@ func rewriteValueARM(v *Value) bool { return rewriteValueARM_OpOr8_0(v) case OpOrB: return rewriteValueARM_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueARM_OpPanicBounds_0(v) + case OpPanicExtend: + return rewriteValueARM_OpPanicExtend_0(v) case OpRound32F: return rewriteValueARM_OpRound32F_0(v) case OpRound64F: @@ -20075,6 +20079,132 @@ func rewriteValueARM_OpOrB_0(v *Value) bool { return true } } +func rewriteValueARM_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpARMLoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpARMLoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpARMLoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueARM_OpPanicExtend_0(v *Value) bool { + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicExtendA [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpARMLoweredPanicExtendA) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicExtendB [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpARMLoweredPanicExtendB) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicExtendC [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpARMLoweredPanicExtendC) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueARM_OpRound32F_0(v *Value) bool { // match: (Round32F x) // cond: diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 89f01b4d84..499c5bbbd4 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -789,6 +789,8 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpOr8_0(v) case OpOrB: return rewriteValueARM64_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueARM64_OpPanicBounds_0(v) case OpPopCount16: return rewriteValueARM64_OpPopCount16_0(v) case OpPopCount32: @@ -35631,6 +35633,66 @@ func rewriteValueARM64_OpOrB_0(v *Value) bool { return true } } +func rewriteValueARM64_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpARM64LoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpARM64LoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpARM64LoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueARM64_OpPopCount16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index 145ee5aa63..d506d77ae3 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -405,6 +405,10 @@ func rewriteValueMIPS(v *Value) bool { return rewriteValueMIPS_OpOr8_0(v) case OpOrB: return rewriteValueMIPS_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueMIPS_OpPanicBounds_0(v) + case OpPanicExtend: + return rewriteValueMIPS_OpPanicExtend_0(v) case OpRound32F: return rewriteValueMIPS_OpRound32F_0(v) case OpRound64F: @@ -6975,6 +6979,132 @@ func rewriteValueMIPS_OpOrB_0(v *Value) bool { return true } } +func rewriteValueMIPS_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpMIPSLoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpMIPSLoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpMIPSLoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} +func rewriteValueMIPS_OpPanicExtend_0(v *Value) bool { + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicExtendA [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpMIPSLoweredPanicExtendA) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicExtendB [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpMIPSLoweredPanicExtendB) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicExtend [kind] hi lo y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicExtendC [kind] hi lo y mem) + for { + kind := v.AuxInt + _ = v.Args[3] + hi := v.Args[0] + lo := v.Args[1] + y := v.Args[2] + mem := v.Args[3] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpMIPSLoweredPanicExtendC) + v.AuxInt = kind + v.AddArg(hi) + v.AddArg(lo) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueMIPS_OpRound32F_0(v *Value) bool { // match: (Round32F x) // cond: diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index 4d1d817033..ca93e04c2c 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -469,6 +469,8 @@ func rewriteValueMIPS64(v *Value) bool { return rewriteValueMIPS64_OpOr8_0(v) case OpOrB: return rewriteValueMIPS64_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueMIPS64_OpPanicBounds_0(v) case OpRound32F: return rewriteValueMIPS64_OpRound32F_0(v) case OpRound64F: @@ -7412,6 +7414,66 @@ func rewriteValueMIPS64_OpOrB_0(v *Value) bool { return true } } +func rewriteValueMIPS64_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpMIPS64LoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpMIPS64LoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpMIPS64LoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueMIPS64_OpRound32F_0(v *Value) bool { // match: (Round32F x) // cond: diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 7daed08dab..d1e4482137 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -547,6 +547,8 @@ func rewriteValuePPC64(v *Value) bool { return rewriteValuePPC64_OpPPC64XOR_0(v) || rewriteValuePPC64_OpPPC64XOR_10(v) case OpPPC64XORconst: return rewriteValuePPC64_OpPPC64XORconst_0(v) + case OpPanicBounds: + return rewriteValuePPC64_OpPanicBounds_0(v) case OpPopCount16: return rewriteValuePPC64_OpPopCount16_0(v) case OpPopCount32: @@ -26076,6 +26078,66 @@ func rewriteValuePPC64_OpPPC64XORconst_0(v *Value) bool { } return false } +func rewriteValuePPC64_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpPPC64LoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpPPC64LoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpPPC64LoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValuePPC64_OpPopCount16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index 3ee004be99..ddf648ded7 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -385,6 +385,8 @@ func rewriteValueS390X(v *Value) bool { return rewriteValueS390X_OpOr8_0(v) case OpOrB: return rewriteValueS390X_OpOrB_0(v) + case OpPanicBounds: + return rewriteValueS390X_OpPanicBounds_0(v) case OpPopCount16: return rewriteValueS390X_OpPopCount16_0(v) case OpPopCount32: @@ -4965,6 +4967,66 @@ func rewriteValueS390X_OpOrB_0(v *Value) bool { return true } } +func rewriteValueS390X_OpPanicBounds_0(v *Value) bool { + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 0 + // result: (LoweredPanicBoundsA [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 0) { + break + } + v.reset(OpS390XLoweredPanicBoundsA) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 1 + // result: (LoweredPanicBoundsB [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 1) { + break + } + v.reset(OpS390XLoweredPanicBoundsB) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + // match: (PanicBounds [kind] x y mem) + // cond: boundsABI(kind) == 2 + // result: (LoweredPanicBoundsC [kind] x y mem) + for { + kind := v.AuxInt + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + mem := v.Args[2] + if !(boundsABI(kind) == 2) { + break + } + v.reset(OpS390XLoweredPanicBoundsC) + v.AuxInt = kind + v.AddArg(x) + v.AddArg(y) + v.AddArg(mem) + return true + } + return false +} func rewriteValueS390X_OpPopCount16_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index 24ba9649be..b7b0f44529 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -758,6 +758,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Name = obj.NAME_EXTERN p.To.Sym = v.Aux.(*obj.LSym) + case ssa.Op386LoweredPanicBoundsA, ssa.Op386LoweredPanicBoundsB, ssa.Op386LoweredPanicBoundsC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.BoundsCheckFunc[v.AuxInt] + s.UseArgs(8) // space used in callee args area by assembly stubs + + case ssa.Op386LoweredPanicExtendA, ssa.Op386LoweredPanicExtendB, ssa.Op386LoweredPanicExtendC: + p := s.Prog(obj.ACALL) + p.To.Type = obj.TYPE_MEM + p.To.Name = obj.NAME_EXTERN + p.To.Sym = gc.ExtendCheckFunc[v.AuxInt] + s.UseArgs(12) // space used in callee args area by assembly stubs + case ssa.Op386CALLstatic, ssa.Op386CALLclosure, ssa.Op386CALLinter: s.Call(v) case ssa.Op386NEGL, diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 51103928b3..8805dbf7d6 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -1401,3 +1401,155 @@ flush: MOVL 12(SP), BP MOVL 16(SP), SI JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSlice3CU(SB) + +// Extended versions for 64-bit indexes. +TEXT runtime·panicExtendIndex(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendIndex(SB) +TEXT runtime·panicExtendIndexU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendIndexU(SB) +TEXT runtime·panicExtendSliceAlen(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAlen(SB) +TEXT runtime·panicExtendSliceAlenU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAlenU(SB) +TEXT runtime·panicExtendSliceAcap(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAcap(SB) +TEXT runtime·panicExtendSliceAcapU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAcapU(SB) +TEXT runtime·panicExtendSliceB(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSliceB(SB) +TEXT runtime·panicExtendSliceBU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSliceBU(SB) +TEXT runtime·panicExtendSlice3Alen(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3Alen(SB) +TEXT runtime·panicExtendSlice3AlenU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3AlenU(SB) +TEXT runtime·panicExtendSlice3Acap(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3Acap(SB) +TEXT runtime·panicExtendSlice3AcapU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3AcapU(SB) +TEXT runtime·panicExtendSlice3B(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSlice3B(SB) +TEXT runtime·panicExtendSlice3BU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSlice3BU(SB) +TEXT runtime·panicExtendSlice3C(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSlice3C(SB) +TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSlice3CU(SB) diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index 85133bf2df..d3e5c54378 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -1628,3 +1628,73 @@ TEXT runtime·debugCallPanicked(SB),NOSPLIT,$16-16 MOVQ $2, AX BYTE $0xcc RET + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 + MOVQ DX, x+0(FP) + MOVQ BX, y+8(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 + MOVQ DX, x+0(FP) + MOVQ BX, y+8(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 + MOVQ DX, x+0(FP) + MOVQ BX, y+8(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 + MOVQ DX, x+0(FP) + MOVQ BX, y+8(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 + MOVQ CX, x+0(FP) + MOVQ DX, y+8(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 + MOVQ AX, x+0(FP) + MOVQ CX, y+8(FP) + JMP runtime·goPanicSlice3CU(SB) diff --git a/src/runtime/asm_amd64p32.s b/src/runtime/asm_amd64p32.s index 7b57fc78d6..4d0d6c5650 100644 --- a/src/runtime/asm_amd64p32.s +++ b/src/runtime/asm_amd64p32.s @@ -607,3 +607,155 @@ flush: MOVQ 56(SP), R11 MOVQ 64(SP), R12 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-8 + MOVL DX, x+0(FP) + MOVL BX, y+4(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-8 + MOVL CX, x+0(FP) + MOVL DX, y+4(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-8 + MOVL AX, x+0(FP) + MOVL CX, y+4(FP) + JMP runtime·goPanicSlice3CU(SB) + +// Extended versions for 64-bit indexes. +TEXT runtime·panicExtendIndex(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendIndex(SB) +TEXT runtime·panicExtendIndexU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendIndexU(SB) +TEXT runtime·panicExtendSliceAlen(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAlen(SB) +TEXT runtime·panicExtendSliceAlenU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAlenU(SB) +TEXT runtime·panicExtendSliceAcap(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAcap(SB) +TEXT runtime·panicExtendSliceAcapU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSliceAcapU(SB) +TEXT runtime·panicExtendSliceB(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSliceB(SB) +TEXT runtime·panicExtendSliceBU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSliceBU(SB) +TEXT runtime·panicExtendSlice3Alen(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3Alen(SB) +TEXT runtime·panicExtendSlice3AlenU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3AlenU(SB) +TEXT runtime·panicExtendSlice3Acap(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3Acap(SB) +TEXT runtime·panicExtendSlice3AcapU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL DX, lo+4(FP) + MOVL BX, y+8(FP) + JMP runtime·goPanicExtendSlice3AcapU(SB) +TEXT runtime·panicExtendSlice3B(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSlice3B(SB) +TEXT runtime·panicExtendSlice3BU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL CX, lo+4(FP) + MOVL DX, y+8(FP) + JMP runtime·goPanicExtendSlice3BU(SB) +TEXT runtime·panicExtendSlice3C(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSlice3C(SB) +TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 + MOVL SI, hi+0(FP) + MOVL AX, lo+4(FP) + MOVL CX, y+8(FP) + JMP runtime·goPanicExtendSlice3CU(SB) diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s index 745aceaaff..c1e915b97c 100644 --- a/src/runtime/asm_arm.s +++ b/src/runtime/asm_arm.s @@ -969,3 +969,155 @@ flush: MOVM.IA.W (R13), [R14] MOVM.IA.W (R13), [R2-R9,R12] JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-8 + MOVW R0, x+0(FP) + MOVW R1, y+4(FP) + JMP runtime·goPanicSlice3CU(SB) + +// Extended versions for 64-bit indexes. +TEXT runtime·panicExtendIndex(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendIndex(SB) +TEXT runtime·panicExtendIndexU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendIndexU(SB) +TEXT runtime·panicExtendSliceAlen(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAlen(SB) +TEXT runtime·panicExtendSliceAlenU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAlenU(SB) +TEXT runtime·panicExtendSliceAcap(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAcap(SB) +TEXT runtime·panicExtendSliceAcapU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAcapU(SB) +TEXT runtime·panicExtendSliceB(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendSliceB(SB) +TEXT runtime·panicExtendSliceBU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendSliceBU(SB) +TEXT runtime·panicExtendSlice3Alen(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3Alen(SB) +TEXT runtime·panicExtendSlice3AlenU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3AlenU(SB) +TEXT runtime·panicExtendSlice3Acap(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3Acap(SB) +TEXT runtime·panicExtendSlice3AcapU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3AcapU(SB) +TEXT runtime·panicExtendSlice3B(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3B(SB) +TEXT runtime·panicExtendSlice3BU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3BU(SB) +TEXT runtime·panicExtendSlice3C(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendSlice3C(SB) +TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 + MOVW R4, hi+0(FP) + MOVW R0, lo+4(FP) + MOVW R1, y+8(FP) + JMP runtime·goPanicExtendSlice3CU(SB) diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index bbeb3df0c8..f7cf0d3544 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -1245,3 +1245,73 @@ flush: MOVD 184(RSP), R25 MOVD 192(RSP), R26 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSlice3CU(SB) diff --git a/src/runtime/asm_mips64x.s b/src/runtime/asm_mips64x.s index ef45ab1378..257c13e9af 100644 --- a/src/runtime/asm_mips64x.s +++ b/src/runtime/asm_mips64x.s @@ -750,3 +750,73 @@ flush: MOVV 168(R29), R24 MOVV 176(R29), R25 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 + MOVV R3, x+0(FP) + MOVV R4, y+8(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 + MOVV R3, x+0(FP) + MOVV R4, y+8(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 + MOVV R3, x+0(FP) + MOVV R4, y+8(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 + MOVV R3, x+0(FP) + MOVV R4, y+8(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 + MOVV R2, x+0(FP) + MOVV R3, y+8(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 + MOVV R1, x+0(FP) + MOVV R2, y+8(FP) + JMP runtime·goPanicSlice3CU(SB) diff --git a/src/runtime/asm_mipsx.s b/src/runtime/asm_mipsx.s index 6ef4507ee1..9f38bbc71e 100644 --- a/src/runtime/asm_mipsx.s +++ b/src/runtime/asm_mipsx.s @@ -764,3 +764,155 @@ flush: MOVW 92(R29), R25 MOVW 96(R29), R28 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-8 + MOVW R3, x+0(FP) + MOVW R4, y+4(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-8 + MOVW R3, x+0(FP) + MOVW R4, y+4(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-8 + MOVW R3, x+0(FP) + MOVW R4, y+4(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-8 + MOVW R3, x+0(FP) + MOVW R4, y+4(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-8 + MOVW R2, x+0(FP) + MOVW R3, y+4(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-8 + MOVW R1, x+0(FP) + MOVW R2, y+4(FP) + JMP runtime·goPanicSlice3CU(SB) + +// Extended versions for 64-bit indexes. +TEXT runtime·panicExtendIndex(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendIndex(SB) +TEXT runtime·panicExtendIndexU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendIndexU(SB) +TEXT runtime·panicExtendSliceAlen(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAlen(SB) +TEXT runtime·panicExtendSliceAlenU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAlenU(SB) +TEXT runtime·panicExtendSliceAcap(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAcap(SB) +TEXT runtime·panicExtendSliceAcapU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSliceAcapU(SB) +TEXT runtime·panicExtendSliceB(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendSliceB(SB) +TEXT runtime·panicExtendSliceBU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendSliceBU(SB) +TEXT runtime·panicExtendSlice3Alen(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R4, y+8(FP) + JMP runtime·goPanicExtendSlice3Alen(SB) +TEXT runtime·panicExtendSlice3AlenU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R4, y+8(FP) + JMP runtime·goPanicExtendSlice3AlenU(SB) +TEXT runtime·panicExtendSlice3Acap(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R4, y+8(FP) + JMP runtime·goPanicExtendSlice3Acap(SB) +TEXT runtime·panicExtendSlice3AcapU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R3, lo+4(FP) + MOVW R4, y+8(FP) + JMP runtime·goPanicExtendSlice3AcapU(SB) +TEXT runtime·panicExtendSlice3B(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3B(SB) +TEXT runtime·panicExtendSlice3BU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R2, lo+4(FP) + MOVW R3, y+8(FP) + JMP runtime·goPanicExtendSlice3BU(SB) +TEXT runtime·panicExtendSlice3C(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendSlice3C(SB) +TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 + MOVW R5, hi+0(FP) + MOVW R1, lo+4(FP) + MOVW R2, y+8(FP) + JMP runtime·goPanicExtendSlice3CU(SB) diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index 9b5da3db99..9ac83e5590 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -976,3 +976,73 @@ flush: MOVD (FIXED_FRAME+96)(R1), R14 MOVD (FIXED_FRAME+104)(R1), R15 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 + MOVD R5, x+0(FP) + MOVD R6, y+8(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 + MOVD R5, x+0(FP) + MOVD R6, y+8(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 + MOVD R5, x+0(FP) + MOVD R6, y+8(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 + MOVD R5, x+0(FP) + MOVD R6, y+8(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 + MOVD R4, x+0(FP) + MOVD R5, y+8(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 + MOVD R3, x+0(FP) + MOVD R4, y+8(FP) + JMP runtime·goPanicSlice3CU(SB) diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s index 566c3e9236..5b9e0cd481 100644 --- a/src/runtime/asm_s390x.s +++ b/src/runtime/asm_s390x.s @@ -863,3 +863,73 @@ flush: MOVD 24(R15), R0 // restore R0 LMG 32(R15), R5, R12 // restore R5 - R12 JMP ret + +// Note: these functions use a special calling convention to save generated code space. +// Arguments are passed in registers, but the space for those arguments are allocated +// in the caller's stack frame. These stubs write the args into that stack space and +// then tail call to the corresponding runtime handler. +// The tail call makes these stubs disappear in backtraces. +TEXT runtime·panicIndex(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicIndex(SB) +TEXT runtime·panicIndexU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicIndexU(SB) +TEXT runtime·panicSliceAlen(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAlen(SB) +TEXT runtime·panicSliceAlenU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAlenU(SB) +TEXT runtime·panicSliceAcap(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAcap(SB) +TEXT runtime·panicSliceAcapU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSliceAcapU(SB) +TEXT runtime·panicSliceB(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSliceB(SB) +TEXT runtime·panicSliceBU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSliceBU(SB) +TEXT runtime·panicSlice3Alen(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3Alen(SB) +TEXT runtime·panicSlice3AlenU(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3AlenU(SB) +TEXT runtime·panicSlice3Acap(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3Acap(SB) +TEXT runtime·panicSlice3AcapU(SB),NOSPLIT,$0-16 + MOVD R2, x+0(FP) + MOVD R3, y+8(FP) + JMP runtime·goPanicSlice3AcapU(SB) +TEXT runtime·panicSlice3B(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSlice3B(SB) +TEXT runtime·panicSlice3BU(SB),NOSPLIT,$0-16 + MOVD R1, x+0(FP) + MOVD R2, y+8(FP) + JMP runtime·goPanicSlice3BU(SB) +TEXT runtime·panicSlice3C(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSlice3C(SB) +TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 + MOVD R0, x+0(FP) + MOVD R1, y+8(FP) + JMP runtime·goPanicSlice3CU(SB) diff --git a/src/runtime/error.go b/src/runtime/error.go index 9a2beaeb95..0085dfc824 100644 --- a/src/runtime/error.go +++ b/src/runtime/error.go @@ -53,6 +53,21 @@ func (e *TypeAssertionError) Error() string { ": missing method " + e.missingMethod } +//go:nosplit +// itoa converts val to a decimal representation. The result is +// written somewhere within buf and the location of the result is returned. +// buf must be at least 20 bytes. +func itoa(buf []byte, val uint64) []byte { + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return buf[i:] +} + // An errorString represents a runtime error described by a single string. type errorString string @@ -73,6 +88,99 @@ func (e plainError) Error() string { return string(e) } +// An boundsError represents a an indexing or slicing operation gone wrong. +type boundsError struct { + x int64 + y int + // Values in an index or slice expression can be signed or unsigned. + // That means we'd need 65 bits to encode all possible indexes, from -2^63 to 2^64-1. + // Instead, we keep track of whether x should be interpreted as signed or unsigned. + // y is known to be nonnegative and to fit in an int. + signed bool + code boundsErrorCode +} + +type boundsErrorCode uint8 + +const ( + boundsIndex boundsErrorCode = iota // s[x], 0 <= x < len(s) failed + + boundsSliceAlen // s[?:x], 0 <= x <= len(s) failed + boundsSliceAcap // s[?:x], 0 <= x <= cap(s) failed + boundsSliceB // s[x:y], 0 <= x <= y failed (but boundsSliceA didn't happen) + + boundsSlice3Alen // s[?:?:x], 0 <= x <= len(s) failed + boundsSlice3Acap // s[?:?:x], 0 <= x <= cap(s) failed + boundsSlice3B // s[?:x:y], 0 <= x <= y failed (but boundsSlice3A didn't happen) + boundsSlice3C // s[x:y:?], 0 <= x <= y failed (but boundsSlice3A/B didn't happen) + + // Note: in the above, len(s) and cap(s) are stored in y +) + +// boundsErrorFmts provide error text for various out-of-bounds panics. +// Note: if you change these strings, you should adjust the size of the buffer +// in boundsError.Error below as well. +var boundsErrorFmts = [...]string{ + boundsIndex: "index out of range [%x] with length %y", + boundsSliceAlen: "slice bounds out of range [:%x] with length %y", + boundsSliceAcap: "slice bounds out of range [:%x] with capacity %y", + boundsSliceB: "slice bounds out of range [%x:%y]", + boundsSlice3Alen: "slice bounds out of range [::%x] with length %y", + boundsSlice3Acap: "slice bounds out of range [::%x] with capacity %y", + boundsSlice3B: "slice bounds out of range [:%x:%y]", + boundsSlice3C: "slice bounds out of range [%x:%y:]", +} + +// boundsNegErrorFmts are overriding formats if x is negative. In this case there's no need to report y. +var boundsNegErrorFmts = [...]string{ + boundsIndex: "index out of range [%x]", + boundsSliceAlen: "slice bounds out of range [:%x]", + boundsSliceAcap: "slice bounds out of range [:%x]", + boundsSliceB: "slice bounds out of range [%x:]", + boundsSlice3Alen: "slice bounds out of range [::%x]", + boundsSlice3Acap: "slice bounds out of range [::%x]", + boundsSlice3B: "slice bounds out of range [:%x:]", + boundsSlice3C: "slice bounds out of range [%x::]", +} + +func (e boundsError) RuntimeError() {} + +func appendIntStr(b []byte, v int64, signed bool) []byte { + if signed && v < 0 { + b = append(b, '-') + v = -v + } + var buf [20]byte + b = append(b, itoa(buf[:], uint64(v))...) + return b +} + +func (e boundsError) Error() string { + fmt := boundsErrorFmts[e.code] + if e.signed && e.x < 0 { + fmt = boundsNegErrorFmts[e.code] + } + // max message length is 99: "runtime error: slice bounds out of range [::%x] with capacity %y" + // x can be at most 20 characters. y can be at most 19. + b := make([]byte, 0, 100) + b = append(b, "runtime error: "...) + for i := 0; i < len(fmt); i++ { + c := fmt[i] + if c != '%' { + b = append(b, c) + continue + } + i++ + switch fmt[i] { + case 'x': + b = appendIntStr(b, e.x, e.signed) + case 'y': + b = appendIntStr(b, int64(e.y), true) + } + } + return string(b) +} + type stringer interface { String() string } diff --git a/src/runtime/os_plan9.go b/src/runtime/os_plan9.go index 5469114a2b..d7ea1ef841 100644 --- a/src/runtime/os_plan9.go +++ b/src/runtime/os_plan9.go @@ -338,18 +338,6 @@ func nanotime() int64 { return ns } -//go:nosplit -func itoa(buf []byte, val uint64) []byte { - i := len(buf) - 1 - for val >= 10 { - buf[i] = byte(val%10 + '0') - i-- - val /= 10 - } - buf[i] = byte(val + '0') - return buf[i:] -} - var goexits = []byte("go: exit ") var emptystatus = []byte("\x00") var exiting uint32 diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 59916dd5e5..918ab7682a 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -10,85 +10,176 @@ import ( "unsafe" ) -// Calling panic with one of the errors below will call errorString.Error -// which will call mallocgc to concatenate strings. That will fail if -// malloc is locked, causing a confusing error message. Throw a better -// error message instead. -func panicCheckMalloc(err error) { +// Check to make sure we can really generate a panic. If the panic +// was generated from the runtime, or from inside malloc, then convert +// to a throw of msg. +// pc should be the program counter of the compiler-generated code that +// triggered this panic. +func panicCheck1(pc uintptr, msg string) { + if sys.GoarchWasm == 0 && hasPrefix(funcname(findfunc(pc)), "runtime.") { + // Note: wasm can't tail call, so we can't get the original caller's pc. + throw(msg) + } + // TODO: is this redundant? How could we be in malloc + // but not in the runtime? runtime/internal/*, maybe? gp := getg() if gp != nil && gp.m != nil && gp.m.mallocing != 0 { - throw(string(err.(errorString))) + throw(msg) } } -var indexError = error(errorString("index out of range")) +// Same as above, but calling from the runtime is allowed. +func panicCheck2(err string) { + gp := getg() + if gp != nil && gp.m != nil && gp.m.mallocing != 0 { + throw(err) + } +} -// The panic{index,slice,divide,shift} functions are called by +// The panic{Index,Slice,divide,shift} functions are called by // code generated by the compiler for out of bounds index expressions, // out of bounds slice expressions, division by zero, and shift by negative. // The panicdivide (again), panicoverflow, panicfloat, and panicmem // functions are called by the signal handler when a signal occurs // indicating the respective problem. // -// Since panic{index,slice,shift} are never called directly, and +// Since panic{Index,Slice,shift} are never called directly, and // since the runtime package should never have an out of bounds slice // or array reference or negative shift, if we see those functions called from the // runtime package we turn the panic into a throw. That will dump the // entire runtime stack for easier debugging. +// +// The panic{Index,Slice} functions are implemented in assembly and tail call +// to the goPanic{Index,Slice} functions below. This is done so we can use +// a space-minimal register calling convention. -func panicindex() { - if hasPrefix(funcname(findfunc(getcallerpc())), "runtime.") { - throw(string(indexError.(errorString))) - } - panicCheckMalloc(indexError) - panic(indexError) +// failures in the comparisons for s[x], 0 <= x < y (y == len(s)) +func goPanicIndex(x int, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsIndex}) +} +func goPanicIndexU(x uint, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsIndex}) } -var sliceError = error(errorString("slice bounds out of range")) +// failures in the comparisons for s[:x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicSliceAlen(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSliceAlen}) +} +func goPanicSliceAlenU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSliceAlen}) +} +func goPanicSliceAcap(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSliceAcap}) +} +func goPanicSliceAcapU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSliceAcap}) +} -func panicslice() { - if hasPrefix(funcname(findfunc(getcallerpc())), "runtime.") { - throw(string(sliceError.(errorString))) - } - panicCheckMalloc(sliceError) - panic(sliceError) +// failures in the comparisons for s[x:y], 0 <= x <= y +func goPanicSliceB(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSliceB}) +} +func goPanicSliceBU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSliceB}) +} + +// failures in the comparisons for s[::x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicSlice3Alen(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSlice3Alen}) +} +func goPanicSlice3AlenU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSlice3Alen}) +} +func goPanicSlice3Acap(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSlice3Acap}) +} +func goPanicSlice3AcapU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSlice3Acap}) +} + +// failures in the comparisons for s[:x:y], 0 <= x <= y +func goPanicSlice3B(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSlice3B}) +} +func goPanicSlice3BU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSlice3B}) +} + +// failures in the comparisons for s[x:y:], 0 <= x <= y +func goPanicSlice3C(x int, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: true, y: y, code: boundsSlice3C}) +} +func goPanicSlice3CU(x uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(x), signed: false, y: y, code: boundsSlice3C}) +} + +// Implemented in assembly, as they take arguments in registers. +// Declared here to mark them as ABIInternal. +func panicIndex(x int, y int) +func panicIndexU(x uint, y int) +func panicSliceAlen(x int, y int) +func panicSliceAlenU(x uint, y int) +func panicSliceAcap(x int, y int) +func panicSliceAcapU(x uint, y int) +func panicSliceB(x int, y int) +func panicSliceBU(x uint, y int) +func panicSlice3Alen(x int, y int) +func panicSlice3AlenU(x uint, y int) +func panicSlice3Acap(x int, y int) +func panicSlice3AcapU(x uint, y int) +func panicSlice3B(x int, y int) +func panicSlice3BU(x uint, y int) +func panicSlice3C(x int, y int) +func panicSlice3CU(x uint, y int) + +var shiftError = error(errorString("negative shift amount")) + +func panicshift() { + panicCheck1(getcallerpc(), "negative shift amount") + panic(shiftError) } var divideError = error(errorString("integer divide by zero")) func panicdivide() { - panicCheckMalloc(divideError) + panicCheck2("integer divide by zero") panic(divideError) } var overflowError = error(errorString("integer overflow")) func panicoverflow() { - panicCheckMalloc(overflowError) + panicCheck2("integer overflow") panic(overflowError) } -var shiftError = error(errorString("negative shift amount")) - -func panicshift() { - if hasPrefix(funcname(findfunc(getcallerpc())), "runtime.") { - throw(string(shiftError.(errorString))) - } - panicCheckMalloc(shiftError) - panic(shiftError) -} - var floatError = error(errorString("floating point error")) func panicfloat() { - panicCheckMalloc(floatError) + panicCheck2("floating point error") panic(floatError) } var memoryError = error(errorString("invalid memory address or nil pointer dereference")) func panicmem() { - panicCheckMalloc(memoryError) + panicCheck2("invalid memory address or nil pointer dereference") panic(memoryError) } diff --git a/src/runtime/panic32.go b/src/runtime/panic32.go new file mode 100644 index 0000000000..b89ce9d563 --- /dev/null +++ b/src/runtime/panic32.go @@ -0,0 +1,105 @@ +// Copyright 2019 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. + +// +build 386 amd64p32 arm mips mipsle + +package runtime + +// Additional index/slice error paths for 32-bit platforms. +// Used when the high word of a 64-bit index is not zero. + +// failures in the comparisons for s[x], 0 <= x < y (y == len(s)) +func goPanicExtendIndex(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsIndex}) +} +func goPanicExtendIndexU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsIndex}) +} + +// failures in the comparisons for s[:x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicExtendSliceAlen(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceAlen}) +} +func goPanicExtendSliceAlenU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceAlen}) +} +func goPanicExtendSliceAcap(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceAcap}) +} +func goPanicExtendSliceAcapU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceAcap}) +} + +// failures in the comparisons for s[x:y], 0 <= x <= y +func goPanicExtendSliceB(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceB}) +} +func goPanicExtendSliceBU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceB}) +} + +// failures in the comparisons for s[::x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicExtendSlice3Alen(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3Alen}) +} +func goPanicExtendSlice3AlenU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3Alen}) +} +func goPanicExtendSlice3Acap(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3Acap}) +} +func goPanicExtendSlice3AcapU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3Acap}) +} + +// failures in the comparisons for s[:x:y], 0 <= x <= y +func goPanicExtendSlice3B(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3B}) +} +func goPanicExtendSlice3BU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3B}) +} + +// failures in the comparisons for s[x:y:], 0 <= x <= y +func goPanicExtendSlice3C(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3C}) +} +func goPanicExtendSlice3CU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3C}) +} + +// Implemented in assembly, as they take arguments in registers. +// Declared here to mark them as ABIInternal. +func panicExtendIndex(hi int, lo uint, y int) +func panicExtendIndexU(hi uint, lo uint, y int) +func panicExtendSliceAlen(hi int, lo uint, y int) +func panicExtendSliceAlenU(hi uint, lo uint, y int) +func panicExtendSliceAcap(hi int, lo uint, y int) +func panicExtendSliceAcapU(hi uint, lo uint, y int) +func panicExtendSliceB(hi int, lo uint, y int) +func panicExtendSliceBU(hi uint, lo uint, y int) +func panicExtendSlice3Alen(hi int, lo uint, y int) +func panicExtendSlice3AlenU(hi uint, lo uint, y int) +func panicExtendSlice3Acap(hi int, lo uint, y int) +func panicExtendSlice3AcapU(hi uint, lo uint, y int) +func panicExtendSlice3B(hi int, lo uint, y int) +func panicExtendSlice3BU(hi uint, lo uint, y int) +func panicExtendSlice3C(hi int, lo uint, y int) +func panicExtendSlice3CU(hi uint, lo uint, y int) diff --git a/test/codegen/memcombine.go b/test/codegen/memcombine.go index 2b4422ebd2..72da47c7e9 100644 --- a/test/codegen/memcombine.go +++ b/test/codegen/memcombine.go @@ -20,7 +20,7 @@ var sink16 uint16 // ------------- // func load_le64(b []byte) { - // amd64:`MOVQ\s\(.*\),`,-`MOV[BWL]`,-`OR` + // amd64:`MOVQ\s\(.*\),`,-`MOV[BWL]\t[^$]`,-`OR` // s390x:`MOVDBR\s\(.*\),` // arm64:`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]` // ppc64le:`MOVD\s`,-`MOV[BHW]Z` @@ -28,7 +28,7 @@ func load_le64(b []byte) { } func load_le64_idx(b []byte, idx int) { - // amd64:`MOVQ\s\(.*\)\(.*\*1\),`,-`MOV[BWL]`,-`OR` + // amd64:`MOVQ\s\(.*\)\(.*\*1\),`,-`MOV[BWL]\t[^$]`,-`OR` // s390x:`MOVDBR\s\(.*\)\(.*\*1\),` // arm64:`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[BHW]` // ppc64le:`MOVD\s`,-`MOV[BHW]Z\s` @@ -68,7 +68,7 @@ func load_le16_idx(b []byte, idx int) { } func load_be64(b []byte) { - // amd64:`BSWAPQ`,-`MOV[BWL]`,-`OR` + // amd64:`BSWAPQ`,-`MOV[BWL]\t[^$]`,-`OR` // s390x:`MOVD\s\(.*\),` // arm64:`REV`,`MOVD\s\(R[0-9]+\),`,-`MOV[BHW]`,-`REVW`,-`REV16W` // ppc64le:`MOVDBR` @@ -76,7 +76,7 @@ func load_be64(b []byte) { } func load_be64_idx(b []byte, idx int) { - // amd64:`BSWAPQ`,-`MOV[BWL]`,-`OR` + // amd64:`BSWAPQ`,-`MOV[BWL]\t[^$]`,-`OR` // s390x:`MOVD\s\(.*\)\(.*\*1\),` // arm64:`REV`,`MOVD\s\(R[0-9]+\)\(R[0-9]+\),`,-`MOV[WHB]`,-`REVW`,-`REV16W` // ppc64le:`MOVDBR` @@ -141,7 +141,7 @@ func load_le_byte4_uint32_inv(s []byte) uint32 { func load_le_byte8_uint64(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,-`ORR`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]`,-`OR` + // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]\t[^$]`,-`OR` return uint64(s[0]) | uint64(s[1])<<8 | uint64(s[2])<<16 | uint64(s[3])<<24 | uint64(s[4])<<32 | uint64(s[5])<<40 | uint64(s[6])<<48 | uint64(s[7])<<56 } @@ -180,7 +180,7 @@ func load_be_byte8_uint64(s []byte) uint64 { func load_be_byte8_uint64_inv(s []byte) uint64 { // arm64:`MOVD\t\(R[0-9]+\)`,`REV`,-`ORR`,-`REVW`,-`REV16W`,-`MOV[BHW]` - // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]`,-`OR` + // amd64:`MOVQ\s\([A-Z]+\),\s[A-Z]+`,-`MOV[BWL]\t[^$]`,-`OR` return uint64(s[7]) | uint64(s[6])<<8 | uint64(s[5])<<16 | uint64(s[4])<<24 | uint64(s[3])<<32 | uint64(s[2])<<40 | uint64(s[1])<<48 | uint64(s[0])<<56 } diff --git a/test/fixedbugs/issue15002.go b/test/fixedbugs/issue15002.go index a27fd92399..936105ed12 100644 --- a/test/fixedbugs/issue15002.go +++ b/test/fixedbugs/issue15002.go @@ -48,7 +48,7 @@ func test16(x []byte) uint16 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() @@ -66,7 +66,7 @@ func test16i(x []byte, i int) uint16 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() @@ -80,7 +80,7 @@ func test32(x []byte) uint32 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() @@ -94,7 +94,7 @@ func test32i(x []byte, i int) uint32 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() @@ -108,7 +108,7 @@ func test64(x []byte) uint64 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() @@ -123,7 +123,7 @@ func test64i(x []byte, i int) uint64 { panic("no fault or bounds check failure happened") } s := fmt.Sprintf("%s", r) - if s != "runtime error: index out of range" { + if s != "runtime error: index out of range [1] with length 1" { panic("bad panic: " + s) } }() diff --git a/test/fixedbugs/issue30116.go b/test/fixedbugs/issue30116.go new file mode 100644 index 0000000000..452a6e3ae8 --- /dev/null +++ b/test/fixedbugs/issue30116.go @@ -0,0 +1,112 @@ +// run + +// Copyright 2019 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. + +// This test makes sure the text output for bounds check failures is as expected. + +package main + +import ( + "fmt" + "os" + "runtime" + "text/tabwriter" +) + +// Testing with length 3 slices, arrays, and strings. +// Large (>1<<32) values are included to test 32-bit platforms. +var indexes = []int64{-9876543210, -1, 0, 2, 3, 9876543210} +var slices = []int64{-9876543210, -1, 0, 3, 4, 9876543210} + +var w *tabwriter.Writer + +func main() { + w = tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.AlignRight) + defer w.Flush() + doIndex() + doSlice() + doSlice3() +} +func doIndex() { + a := []int{1, 2, 3} + for _, i := range indexes { + printPanic(fmt.Sprintf("slice[%d]", i), func() { + _ = a[i] + }) + } + b := [3]int{1, 2, 3} + for _, i := range indexes { + printPanic(fmt.Sprintf("array[%d]", i), func() { + _ = b[i] + }) + } + c := "123" + for _, i := range indexes { + printPanic(fmt.Sprintf("string[%d]", i), func() { + _ = c[i] + }) + } +} + +func doSlice() { + a := []int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("slice[%d:%d]", i, j), func() { + _ = a[i:j] + }) + } + } + b := [3]int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("array[%d:%d]", i, j), func() { + _ = b[i:j] + }) + } + } + c := "123" + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("string[%d:%d]", i, j), func() { + _ = c[i:j] + }) + } + } +} + +func doSlice3() { + a := []int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + for _, k := range slices { + printPanic(fmt.Sprintf("slice[%d:%d:%d]", i, j, k), func() { + _ = a[i:j:k] + }) + } + } + } + b := [3]int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + for _, k := range slices { + printPanic(fmt.Sprintf("array[%d:%d:%d]", i, j, k), func() { + _ = b[i:j:k] + }) + } + } + } +} + +func printPanic(msg string, f func()) { + defer func() { + res := "no panic" + if e := recover(); e != nil { + res = e.(runtime.Error).Error() + } + fmt.Fprintf(w, "%s\t %s\n", msg, res) + }() + f() +} diff --git a/test/fixedbugs/issue30116.out b/test/fixedbugs/issue30116.out new file mode 100644 index 0000000000..bde134d950 --- /dev/null +++ b/test/fixedbugs/issue30116.out @@ -0,0 +1,558 @@ + slice[-9876543210] runtime error: index out of range [-9876543210] + slice[-1] runtime error: index out of range [-1] + slice[0] no panic + slice[2] no panic + slice[3] runtime error: index out of range [3] with length 3 + slice[9876543210] runtime error: index out of range [9876543210] with length 3 + array[-9876543210] runtime error: index out of range [-9876543210] + array[-1] runtime error: index out of range [-1] + array[0] no panic + array[2] no panic + array[3] runtime error: index out of range [3] with length 3 + array[9876543210] runtime error: index out of range [9876543210] with length 3 + string[-9876543210] runtime error: index out of range [-9876543210] + string[-1] runtime error: index out of range [-1] + string[0] no panic + string[2] no panic + string[3] runtime error: index out of range [3] with length 3 + string[9876543210] runtime error: index out of range [9876543210] with length 3 + slice[-9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[-9876543210:-1] runtime error: slice bounds out of range [:-1] + slice[-9876543210:0] runtime error: slice bounds out of range [-9876543210:] + slice[-9876543210:3] runtime error: slice bounds out of range [-9876543210:] + slice[-9876543210:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[-9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + slice[-1:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[-1:-1] runtime error: slice bounds out of range [:-1] + slice[-1:0] runtime error: slice bounds out of range [-1:] + slice[-1:3] runtime error: slice bounds out of range [-1:] + slice[-1:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[-1:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + slice[0:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[0:-1] runtime error: slice bounds out of range [:-1] + slice[0:0] no panic + slice[0:3] no panic + slice[0:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[0:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + slice[3:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[3:-1] runtime error: slice bounds out of range [:-1] + slice[3:0] runtime error: slice bounds out of range [3:0] + slice[3:3] no panic + slice[3:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[3:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + slice[4:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[4:-1] runtime error: slice bounds out of range [:-1] + slice[4:0] runtime error: slice bounds out of range [4:0] + slice[4:3] runtime error: slice bounds out of range [4:3] + slice[4:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[4:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + slice[9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + slice[9876543210:-1] runtime error: slice bounds out of range [:-1] + slice[9876543210:0] runtime error: slice bounds out of range [9876543210:0] + slice[9876543210:3] runtime error: slice bounds out of range [9876543210:3] + slice[9876543210:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with capacity 3 + array[-9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[-9876543210:-1] runtime error: slice bounds out of range [:-1] + array[-9876543210:0] runtime error: slice bounds out of range [-9876543210:] + array[-9876543210:3] runtime error: slice bounds out of range [-9876543210:] + array[-9876543210:4] runtime error: slice bounds out of range [:4] with length 3 + array[-9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + array[-1:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[-1:-1] runtime error: slice bounds out of range [:-1] + array[-1:0] runtime error: slice bounds out of range [-1:] + array[-1:3] runtime error: slice bounds out of range [-1:] + array[-1:4] runtime error: slice bounds out of range [:4] with length 3 + array[-1:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + array[0:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[0:-1] runtime error: slice bounds out of range [:-1] + array[0:0] no panic + array[0:3] no panic + array[0:4] runtime error: slice bounds out of range [:4] with length 3 + array[0:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + array[3:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[3:-1] runtime error: slice bounds out of range [:-1] + array[3:0] runtime error: slice bounds out of range [3:0] + array[3:3] no panic + array[3:4] runtime error: slice bounds out of range [:4] with length 3 + array[3:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + array[4:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[4:-1] runtime error: slice bounds out of range [:-1] + array[4:0] runtime error: slice bounds out of range [4:0] + array[4:3] runtime error: slice bounds out of range [4:3] + array[4:4] runtime error: slice bounds out of range [:4] with length 3 + array[4:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + array[9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + array[9876543210:-1] runtime error: slice bounds out of range [:-1] + array[9876543210:0] runtime error: slice bounds out of range [9876543210:0] + array[9876543210:3] runtime error: slice bounds out of range [9876543210:3] + array[9876543210:4] runtime error: slice bounds out of range [:4] with length 3 + array[9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[-9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[-9876543210:-1] runtime error: slice bounds out of range [:-1] + string[-9876543210:0] runtime error: slice bounds out of range [-9876543210:] + string[-9876543210:3] runtime error: slice bounds out of range [-9876543210:] + string[-9876543210:4] runtime error: slice bounds out of range [:4] with length 3 + string[-9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[-1:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[-1:-1] runtime error: slice bounds out of range [:-1] + string[-1:0] runtime error: slice bounds out of range [-1:] + string[-1:3] runtime error: slice bounds out of range [-1:] + string[-1:4] runtime error: slice bounds out of range [:4] with length 3 + string[-1:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[0:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[0:-1] runtime error: slice bounds out of range [:-1] + string[0:0] no panic + string[0:3] no panic + string[0:4] runtime error: slice bounds out of range [:4] with length 3 + string[0:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[3:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[3:-1] runtime error: slice bounds out of range [:-1] + string[3:0] runtime error: slice bounds out of range [3:0] + string[3:3] no panic + string[3:4] runtime error: slice bounds out of range [:4] with length 3 + string[3:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[4:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[4:-1] runtime error: slice bounds out of range [:-1] + string[4:0] runtime error: slice bounds out of range [4:0] + string[4:3] runtime error: slice bounds out of range [4:3] + string[4:4] runtime error: slice bounds out of range [:4] with length 3 + string[4:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + string[9876543210:-9876543210] runtime error: slice bounds out of range [:-9876543210] + string[9876543210:-1] runtime error: slice bounds out of range [:-1] + string[9876543210:0] runtime error: slice bounds out of range [9876543210:0] + string[9876543210:3] runtime error: slice bounds out of range [9876543210:3] + string[9876543210:4] runtime error: slice bounds out of range [:4] with length 3 + string[9876543210:9876543210] runtime error: slice bounds out of range [:9876543210] with length 3 + slice[-9876543210:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[-9876543210:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[-9876543210:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-9876543210:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:-1:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:-1:0] runtime error: slice bounds out of range [:-1:] + slice[-9876543210:-1:3] runtime error: slice bounds out of range [:-1:] + slice[-9876543210:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-9876543210:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:0:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:0:0] runtime error: slice bounds out of range [-9876543210::] + slice[-9876543210:0:3] runtime error: slice bounds out of range [-9876543210::] + slice[-9876543210:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-9876543210:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:3:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:3:0] runtime error: slice bounds out of range [:3:0] + slice[-9876543210:3:3] runtime error: slice bounds out of range [-9876543210::] + slice[-9876543210:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-9876543210:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:4:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:4:0] runtime error: slice bounds out of range [:4:0] + slice[-9876543210:4:3] runtime error: slice bounds out of range [:4:3] + slice[-9876543210:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-9876543210:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-9876543210:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[-9876543210:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[-9876543210:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[-9876543210:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-9876543210:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[-1:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[-1:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[-1:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:-1:-1] runtime error: slice bounds out of range [::-1] + slice[-1:-1:0] runtime error: slice bounds out of range [:-1:] + slice[-1:-1:3] runtime error: slice bounds out of range [:-1:] + slice[-1:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:0:-1] runtime error: slice bounds out of range [::-1] + slice[-1:0:0] runtime error: slice bounds out of range [-1::] + slice[-1:0:3] runtime error: slice bounds out of range [-1::] + slice[-1:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:3:-1] runtime error: slice bounds out of range [::-1] + slice[-1:3:0] runtime error: slice bounds out of range [:3:0] + slice[-1:3:3] runtime error: slice bounds out of range [-1::] + slice[-1:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:4:-1] runtime error: slice bounds out of range [::-1] + slice[-1:4:0] runtime error: slice bounds out of range [:4:0] + slice[-1:4:3] runtime error: slice bounds out of range [:4:3] + slice[-1:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[-1:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[-1:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[-1:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[-1:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[-1:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[-1:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[0:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[0:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[0:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:-1:-1] runtime error: slice bounds out of range [::-1] + slice[0:-1:0] runtime error: slice bounds out of range [:-1:] + slice[0:-1:3] runtime error: slice bounds out of range [:-1:] + slice[0:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:0:-1] runtime error: slice bounds out of range [::-1] + slice[0:0:0] no panic + slice[0:0:3] no panic + slice[0:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:3:-1] runtime error: slice bounds out of range [::-1] + slice[0:3:0] runtime error: slice bounds out of range [:3:0] + slice[0:3:3] no panic + slice[0:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:4:-1] runtime error: slice bounds out of range [::-1] + slice[0:4:0] runtime error: slice bounds out of range [:4:0] + slice[0:4:3] runtime error: slice bounds out of range [:4:3] + slice[0:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[0:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[0:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[0:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[0:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[0:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[3:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[3:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[3:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:-1:-1] runtime error: slice bounds out of range [::-1] + slice[3:-1:0] runtime error: slice bounds out of range [:-1:] + slice[3:-1:3] runtime error: slice bounds out of range [:-1:] + slice[3:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:0:-1] runtime error: slice bounds out of range [::-1] + slice[3:0:0] runtime error: slice bounds out of range [3:0:] + slice[3:0:3] runtime error: slice bounds out of range [3:0:] + slice[3:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:3:-1] runtime error: slice bounds out of range [::-1] + slice[3:3:0] runtime error: slice bounds out of range [:3:0] + slice[3:3:3] no panic + slice[3:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:4:-1] runtime error: slice bounds out of range [::-1] + slice[3:4:0] runtime error: slice bounds out of range [:4:0] + slice[3:4:3] runtime error: slice bounds out of range [:4:3] + slice[3:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[3:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[3:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[3:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[3:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[3:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[4:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[4:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[4:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:-1:-1] runtime error: slice bounds out of range [::-1] + slice[4:-1:0] runtime error: slice bounds out of range [:-1:] + slice[4:-1:3] runtime error: slice bounds out of range [:-1:] + slice[4:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:0:-1] runtime error: slice bounds out of range [::-1] + slice[4:0:0] runtime error: slice bounds out of range [4:0:] + slice[4:0:3] runtime error: slice bounds out of range [4:0:] + slice[4:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:3:-1] runtime error: slice bounds out of range [::-1] + slice[4:3:0] runtime error: slice bounds out of range [:3:0] + slice[4:3:3] runtime error: slice bounds out of range [4:3:] + slice[4:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:4:-1] runtime error: slice bounds out of range [::-1] + slice[4:4:0] runtime error: slice bounds out of range [:4:0] + slice[4:4:3] runtime error: slice bounds out of range [:4:3] + slice[4:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[4:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[4:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[4:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[4:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[4:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:-9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + slice[9876543210:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + slice[9876543210:-9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:-1:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:-1:0] runtime error: slice bounds out of range [:-1:] + slice[9876543210:-1:3] runtime error: slice bounds out of range [:-1:] + slice[9876543210:-1:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:0:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:0:0] runtime error: slice bounds out of range [9876543210:0:] + slice[9876543210:0:3] runtime error: slice bounds out of range [9876543210:0:] + slice[9876543210:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:0:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:3:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:3:0] runtime error: slice bounds out of range [:3:0] + slice[9876543210:3:3] runtime error: slice bounds out of range [9876543210:3:] + slice[9876543210:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:3:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:4:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:4:0] runtime error: slice bounds out of range [:4:0] + slice[9876543210:4:3] runtime error: slice bounds out of range [:4:3] + slice[9876543210:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:4:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + slice[9876543210:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + slice[9876543210:9876543210:-1] runtime error: slice bounds out of range [::-1] + slice[9876543210:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + slice[9876543210:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + slice[9876543210:9876543210:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[9876543210:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with capacity 3 + array[-9876543210:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[-9876543210:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[-9876543210:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-9876543210:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:-1:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:-1:0] runtime error: slice bounds out of range [:-1:] + array[-9876543210:-1:3] runtime error: slice bounds out of range [:-1:] + array[-9876543210:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-9876543210:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:0:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:0:0] runtime error: slice bounds out of range [-9876543210::] + array[-9876543210:0:3] runtime error: slice bounds out of range [-9876543210::] + array[-9876543210:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-9876543210:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:3:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:3:0] runtime error: slice bounds out of range [:3:0] + array[-9876543210:3:3] runtime error: slice bounds out of range [-9876543210::] + array[-9876543210:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-9876543210:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:4:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:4:0] runtime error: slice bounds out of range [:4:0] + array[-9876543210:4:3] runtime error: slice bounds out of range [:4:3] + array[-9876543210:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-9876543210:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-9876543210:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[-9876543210:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[-9876543210:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[-9876543210:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[-9876543210:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[-1:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[-1:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[-1:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:-1:-1] runtime error: slice bounds out of range [::-1] + array[-1:-1:0] runtime error: slice bounds out of range [:-1:] + array[-1:-1:3] runtime error: slice bounds out of range [:-1:] + array[-1:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:0:-1] runtime error: slice bounds out of range [::-1] + array[-1:0:0] runtime error: slice bounds out of range [-1::] + array[-1:0:3] runtime error: slice bounds out of range [-1::] + array[-1:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:3:-1] runtime error: slice bounds out of range [::-1] + array[-1:3:0] runtime error: slice bounds out of range [:3:0] + array[-1:3:3] runtime error: slice bounds out of range [-1::] + array[-1:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:4:-1] runtime error: slice bounds out of range [::-1] + array[-1:4:0] runtime error: slice bounds out of range [:4:0] + array[-1:4:3] runtime error: slice bounds out of range [:4:3] + array[-1:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[-1:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[-1:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[-1:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[-1:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[-1:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[-1:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[0:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[0:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[0:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:-1:-1] runtime error: slice bounds out of range [::-1] + array[0:-1:0] runtime error: slice bounds out of range [:-1:] + array[0:-1:3] runtime error: slice bounds out of range [:-1:] + array[0:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:0:-1] runtime error: slice bounds out of range [::-1] + array[0:0:0] no panic + array[0:0:3] no panic + array[0:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:3:-1] runtime error: slice bounds out of range [::-1] + array[0:3:0] runtime error: slice bounds out of range [:3:0] + array[0:3:3] no panic + array[0:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:4:-1] runtime error: slice bounds out of range [::-1] + array[0:4:0] runtime error: slice bounds out of range [:4:0] + array[0:4:3] runtime error: slice bounds out of range [:4:3] + array[0:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[0:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[0:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[0:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[0:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[0:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[3:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[3:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[3:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:-1:-1] runtime error: slice bounds out of range [::-1] + array[3:-1:0] runtime error: slice bounds out of range [:-1:] + array[3:-1:3] runtime error: slice bounds out of range [:-1:] + array[3:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:0:-1] runtime error: slice bounds out of range [::-1] + array[3:0:0] runtime error: slice bounds out of range [3:0:] + array[3:0:3] runtime error: slice bounds out of range [3:0:] + array[3:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:3:-1] runtime error: slice bounds out of range [::-1] + array[3:3:0] runtime error: slice bounds out of range [:3:0] + array[3:3:3] no panic + array[3:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:4:-1] runtime error: slice bounds out of range [::-1] + array[3:4:0] runtime error: slice bounds out of range [:4:0] + array[3:4:3] runtime error: slice bounds out of range [:4:3] + array[3:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[3:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[3:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[3:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[3:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[3:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[4:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[4:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[4:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:-1:-1] runtime error: slice bounds out of range [::-1] + array[4:-1:0] runtime error: slice bounds out of range [:-1:] + array[4:-1:3] runtime error: slice bounds out of range [:-1:] + array[4:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:0:-1] runtime error: slice bounds out of range [::-1] + array[4:0:0] runtime error: slice bounds out of range [4:0:] + array[4:0:3] runtime error: slice bounds out of range [4:0:] + array[4:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:3:-1] runtime error: slice bounds out of range [::-1] + array[4:3:0] runtime error: slice bounds out of range [:3:0] + array[4:3:3] runtime error: slice bounds out of range [4:3:] + array[4:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:4:-1] runtime error: slice bounds out of range [::-1] + array[4:4:0] runtime error: slice bounds out of range [:4:0] + array[4:4:3] runtime error: slice bounds out of range [:4:3] + array[4:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[4:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[4:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[4:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[4:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[4:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:-9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:-9876543210:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:-9876543210:0] runtime error: slice bounds out of range [:-9876543210:] + array[9876543210:-9876543210:3] runtime error: slice bounds out of range [:-9876543210:] + array[9876543210:-9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:-9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:-1:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:-1:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:-1:0] runtime error: slice bounds out of range [:-1:] + array[9876543210:-1:3] runtime error: slice bounds out of range [:-1:] + array[9876543210:-1:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:-1:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:0:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:0:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:0:0] runtime error: slice bounds out of range [9876543210:0:] + array[9876543210:0:3] runtime error: slice bounds out of range [9876543210:0:] + array[9876543210:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:0:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:3:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:3:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:3:0] runtime error: slice bounds out of range [:3:0] + array[9876543210:3:3] runtime error: slice bounds out of range [9876543210:3:] + array[9876543210:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:3:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:4:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:4:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:4:0] runtime error: slice bounds out of range [:4:0] + array[9876543210:4:3] runtime error: slice bounds out of range [:4:3] + array[9876543210:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:4:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 + array[9876543210:9876543210:-9876543210] runtime error: slice bounds out of range [::-9876543210] + array[9876543210:9876543210:-1] runtime error: slice bounds out of range [::-1] + array[9876543210:9876543210:0] runtime error: slice bounds out of range [:9876543210:0] + array[9876543210:9876543210:3] runtime error: slice bounds out of range [:9876543210:3] + array[9876543210:9876543210:4] runtime error: slice bounds out of range [::4] with length 3 + array[9876543210:9876543210:9876543210] runtime error: slice bounds out of range [::9876543210] with length 3 diff --git a/test/fixedbugs/issue30116u.go b/test/fixedbugs/issue30116u.go new file mode 100644 index 0000000000..7c2aea2cd4 --- /dev/null +++ b/test/fixedbugs/issue30116u.go @@ -0,0 +1,112 @@ +// run + +// Copyright 2019 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. + +// This test makes sure the text output for bounds check failures is as expected. + +package main + +import ( + "fmt" + "os" + "runtime" + "text/tabwriter" +) + +// Testing with length 3 slices, arrays, and strings. +// A large (>1<<32) value is included to test 32-bit platforms. +var indexes = []uint64{0, 2, 3, 1<<32 - 1, 1<<64 - 1} +var slices = []uint64{0, 3, 4, 1<<32 - 1, 1<<64 - 1} + +var w *tabwriter.Writer + +func main() { + w = tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.AlignRight) + defer w.Flush() + doIndex() + doSlice() + doSlice3() +} +func doIndex() { + a := []int{1, 2, 3} + for _, i := range indexes { + printPanic(fmt.Sprintf("slice[%d]", i), func() { + _ = a[i] + }) + } + b := [3]int{1, 2, 3} + for _, i := range indexes { + printPanic(fmt.Sprintf("array[%d]", i), func() { + _ = b[i] + }) + } + c := "123" + for _, i := range indexes { + printPanic(fmt.Sprintf("string[%d]", i), func() { + _ = c[i] + }) + } +} + +func doSlice() { + a := []int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("slice[%d:%d]", i, j), func() { + _ = a[i:j] + }) + } + } + b := [3]int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("array[%d:%d]", i, j), func() { + _ = b[i:j] + }) + } + } + c := "123" + for _, i := range slices { + for _, j := range slices { + printPanic(fmt.Sprintf("string[%d:%d]", i, j), func() { + _ = c[i:j] + }) + } + } +} + +func doSlice3() { + a := []int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + for _, k := range slices { + printPanic(fmt.Sprintf("slice[%d:%d:%d]", i, j, k), func() { + _ = a[i:j:k] + }) + } + } + } + b := [3]int{1, 2, 3} + for _, i := range slices { + for _, j := range slices { + for _, k := range slices { + printPanic(fmt.Sprintf("array[%d:%d:%d]", i, j, k), func() { + _ = b[i:j:k] + }) + } + } + } +} + +func printPanic(msg string, f func()) { + defer func() { + res := "no panic" + if e := recover(); e != nil { + res = e.(runtime.Error).Error() + } + fmt.Fprintf(w, "%s\t %s\n", msg, res) + }() + f() +} diff --git a/test/fixedbugs/issue30116u.out b/test/fixedbugs/issue30116u.out new file mode 100644 index 0000000000..ee19192aaa --- /dev/null +++ b/test/fixedbugs/issue30116u.out @@ -0,0 +1,340 @@ + slice[0] no panic + slice[2] no panic + slice[3] runtime error: index out of range [3] with length 3 + slice[4294967295] runtime error: index out of range [4294967295] with length 3 + slice[18446744073709551615] runtime error: index out of range [18446744073709551615] with length 3 + array[0] no panic + array[2] no panic + array[3] runtime error: index out of range [3] with length 3 + array[4294967295] runtime error: index out of range [4294967295] with length 3 + array[18446744073709551615] runtime error: index out of range [18446744073709551615] with length 3 + string[0] no panic + string[2] no panic + string[3] runtime error: index out of range [3] with length 3 + string[4294967295] runtime error: index out of range [4294967295] with length 3 + string[18446744073709551615] runtime error: index out of range [18446744073709551615] with length 3 + slice[0:0] no panic + slice[0:3] no panic + slice[0:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[0:4294967295] runtime error: slice bounds out of range [:4294967295] with capacity 3 + slice[0:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with capacity 3 + slice[3:0] runtime error: slice bounds out of range [3:0] + slice[3:3] no panic + slice[3:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[3:4294967295] runtime error: slice bounds out of range [:4294967295] with capacity 3 + slice[3:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with capacity 3 + slice[4:0] runtime error: slice bounds out of range [4:0] + slice[4:3] runtime error: slice bounds out of range [4:3] + slice[4:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[4:4294967295] runtime error: slice bounds out of range [:4294967295] with capacity 3 + slice[4:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with capacity 3 + slice[4294967295:0] runtime error: slice bounds out of range [4294967295:0] + slice[4294967295:3] runtime error: slice bounds out of range [4294967295:3] + slice[4294967295:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[4294967295:4294967295] runtime error: slice bounds out of range [:4294967295] with capacity 3 + slice[4294967295:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with capacity 3 + slice[18446744073709551615:0] runtime error: slice bounds out of range [18446744073709551615:0] + slice[18446744073709551615:3] runtime error: slice bounds out of range [18446744073709551615:3] + slice[18446744073709551615:4] runtime error: slice bounds out of range [:4] with capacity 3 + slice[18446744073709551615:4294967295] runtime error: slice bounds out of range [:4294967295] with capacity 3 + slice[18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with capacity 3 + array[0:0] no panic + array[0:3] no panic + array[0:4] runtime error: slice bounds out of range [:4] with length 3 + array[0:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + array[0:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + array[3:0] runtime error: slice bounds out of range [3:0] + array[3:3] no panic + array[3:4] runtime error: slice bounds out of range [:4] with length 3 + array[3:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + array[3:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + array[4:0] runtime error: slice bounds out of range [4:0] + array[4:3] runtime error: slice bounds out of range [4:3] + array[4:4] runtime error: slice bounds out of range [:4] with length 3 + array[4:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + array[4:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + array[4294967295:0] runtime error: slice bounds out of range [4294967295:0] + array[4294967295:3] runtime error: slice bounds out of range [4294967295:3] + array[4294967295:4] runtime error: slice bounds out of range [:4] with length 3 + array[4294967295:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + array[4294967295:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + array[18446744073709551615:0] runtime error: slice bounds out of range [18446744073709551615:0] + array[18446744073709551615:3] runtime error: slice bounds out of range [18446744073709551615:3] + array[18446744073709551615:4] runtime error: slice bounds out of range [:4] with length 3 + array[18446744073709551615:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + array[18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + string[0:0] no panic + string[0:3] no panic + string[0:4] runtime error: slice bounds out of range [:4] with length 3 + string[0:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + string[0:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + string[3:0] runtime error: slice bounds out of range [3:0] + string[3:3] no panic + string[3:4] runtime error: slice bounds out of range [:4] with length 3 + string[3:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + string[3:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + string[4:0] runtime error: slice bounds out of range [4:0] + string[4:3] runtime error: slice bounds out of range [4:3] + string[4:4] runtime error: slice bounds out of range [:4] with length 3 + string[4:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + string[4:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + string[4294967295:0] runtime error: slice bounds out of range [4294967295:0] + string[4294967295:3] runtime error: slice bounds out of range [4294967295:3] + string[4294967295:4] runtime error: slice bounds out of range [:4] with length 3 + string[4294967295:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + string[4294967295:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + string[18446744073709551615:0] runtime error: slice bounds out of range [18446744073709551615:0] + string[18446744073709551615:3] runtime error: slice bounds out of range [18446744073709551615:3] + string[18446744073709551615:4] runtime error: slice bounds out of range [:4] with length 3 + string[18446744073709551615:4294967295] runtime error: slice bounds out of range [:4294967295] with length 3 + string[18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [:18446744073709551615] with length 3 + slice[0:0:0] no panic + slice[0:0:3] no panic + slice[0:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:0:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[0:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[0:3:0] runtime error: slice bounds out of range [:3:0] + slice[0:3:3] no panic + slice[0:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:3:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[0:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[0:4:0] runtime error: slice bounds out of range [:4:0] + slice[0:4:3] runtime error: slice bounds out of range [:4:3] + slice[0:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:4:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[0:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[0:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + slice[0:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + slice[0:4294967295:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[0:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[0:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + slice[0:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + slice[0:18446744073709551615:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[0:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[0:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[3:0:0] runtime error: slice bounds out of range [3:0:] + slice[3:0:3] runtime error: slice bounds out of range [3:0:] + slice[3:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:0:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[3:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[3:3:0] runtime error: slice bounds out of range [:3:0] + slice[3:3:3] no panic + slice[3:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:3:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[3:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[3:4:0] runtime error: slice bounds out of range [:4:0] + slice[3:4:3] runtime error: slice bounds out of range [:4:3] + slice[3:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:4:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[3:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[3:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + slice[3:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + slice[3:4294967295:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[3:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[3:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + slice[3:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + slice[3:18446744073709551615:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[3:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[3:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4:0:0] runtime error: slice bounds out of range [4:0:] + slice[4:0:3] runtime error: slice bounds out of range [4:0:] + slice[4:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:0:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4:3:0] runtime error: slice bounds out of range [:3:0] + slice[4:3:3] runtime error: slice bounds out of range [4:3:] + slice[4:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:3:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4:4:0] runtime error: slice bounds out of range [:4:0] + slice[4:4:3] runtime error: slice bounds out of range [:4:3] + slice[4:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:4:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + slice[4:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + slice[4:4294967295:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + slice[4:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + slice[4:18446744073709551615:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4294967295:0:0] runtime error: slice bounds out of range [4294967295:0:] + slice[4294967295:0:3] runtime error: slice bounds out of range [4294967295:0:] + slice[4294967295:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4294967295:0:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4294967295:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4294967295:3:0] runtime error: slice bounds out of range [:3:0] + slice[4294967295:3:3] runtime error: slice bounds out of range [4294967295:3:] + slice[4294967295:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4294967295:3:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4294967295:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4294967295:4:0] runtime error: slice bounds out of range [:4:0] + slice[4294967295:4:3] runtime error: slice bounds out of range [:4:3] + slice[4294967295:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4294967295:4:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4294967295:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4294967295:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + slice[4294967295:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + slice[4294967295:4294967295:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4294967295:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4294967295:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[4294967295:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + slice[4294967295:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + slice[4294967295:18446744073709551615:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[4294967295:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[4294967295:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[18446744073709551615:0:0] runtime error: slice bounds out of range [18446744073709551615:0:] + slice[18446744073709551615:0:3] runtime error: slice bounds out of range [18446744073709551615:0:] + slice[18446744073709551615:0:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[18446744073709551615:0:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[18446744073709551615:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[18446744073709551615:3:0] runtime error: slice bounds out of range [:3:0] + slice[18446744073709551615:3:3] runtime error: slice bounds out of range [18446744073709551615:3:] + slice[18446744073709551615:3:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[18446744073709551615:3:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[18446744073709551615:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[18446744073709551615:4:0] runtime error: slice bounds out of range [:4:0] + slice[18446744073709551615:4:3] runtime error: slice bounds out of range [:4:3] + slice[18446744073709551615:4:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[18446744073709551615:4:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[18446744073709551615:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[18446744073709551615:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + slice[18446744073709551615:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + slice[18446744073709551615:4294967295:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[18446744073709551615:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[18446744073709551615:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + slice[18446744073709551615:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + slice[18446744073709551615:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + slice[18446744073709551615:18446744073709551615:4] runtime error: slice bounds out of range [::4] with capacity 3 + slice[18446744073709551615:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with capacity 3 + slice[18446744073709551615:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with capacity 3 + array[0:0:0] no panic + array[0:0:3] no panic + array[0:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:0:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[0:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[0:3:0] runtime error: slice bounds out of range [:3:0] + array[0:3:3] no panic + array[0:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:3:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[0:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[0:4:0] runtime error: slice bounds out of range [:4:0] + array[0:4:3] runtime error: slice bounds out of range [:4:3] + array[0:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:4:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[0:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[0:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + array[0:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + array[0:4294967295:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[0:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[0:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + array[0:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + array[0:18446744073709551615:4] runtime error: slice bounds out of range [::4] with length 3 + array[0:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[0:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[3:0:0] runtime error: slice bounds out of range [3:0:] + array[3:0:3] runtime error: slice bounds out of range [3:0:] + array[3:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:0:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[3:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[3:3:0] runtime error: slice bounds out of range [:3:0] + array[3:3:3] no panic + array[3:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:3:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[3:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[3:4:0] runtime error: slice bounds out of range [:4:0] + array[3:4:3] runtime error: slice bounds out of range [:4:3] + array[3:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:4:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[3:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[3:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + array[3:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + array[3:4294967295:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[3:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[3:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + array[3:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + array[3:18446744073709551615:4] runtime error: slice bounds out of range [::4] with length 3 + array[3:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[3:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4:0:0] runtime error: slice bounds out of range [4:0:] + array[4:0:3] runtime error: slice bounds out of range [4:0:] + array[4:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:0:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4:3:0] runtime error: slice bounds out of range [:3:0] + array[4:3:3] runtime error: slice bounds out of range [4:3:] + array[4:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:3:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4:4:0] runtime error: slice bounds out of range [:4:0] + array[4:4:3] runtime error: slice bounds out of range [:4:3] + array[4:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:4:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + array[4:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + array[4:4294967295:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + array[4:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + array[4:18446744073709551615:4] runtime error: slice bounds out of range [::4] with length 3 + array[4:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4294967295:0:0] runtime error: slice bounds out of range [4294967295:0:] + array[4294967295:0:3] runtime error: slice bounds out of range [4294967295:0:] + array[4294967295:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[4294967295:0:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4294967295:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4294967295:3:0] runtime error: slice bounds out of range [:3:0] + array[4294967295:3:3] runtime error: slice bounds out of range [4294967295:3:] + array[4294967295:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[4294967295:3:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4294967295:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4294967295:4:0] runtime error: slice bounds out of range [:4:0] + array[4294967295:4:3] runtime error: slice bounds out of range [:4:3] + array[4294967295:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[4294967295:4:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4294967295:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4294967295:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + array[4294967295:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + array[4294967295:4294967295:4] runtime error: slice bounds out of range [::4] with length 3 + array[4294967295:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4294967295:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[4294967295:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + array[4294967295:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + array[4294967295:18446744073709551615:4] runtime error: slice bounds out of range [::4] with length 3 + array[4294967295:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[4294967295:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[18446744073709551615:0:0] runtime error: slice bounds out of range [18446744073709551615:0:] + array[18446744073709551615:0:3] runtime error: slice bounds out of range [18446744073709551615:0:] + array[18446744073709551615:0:4] runtime error: slice bounds out of range [::4] with length 3 + array[18446744073709551615:0:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[18446744073709551615:0:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[18446744073709551615:3:0] runtime error: slice bounds out of range [:3:0] + array[18446744073709551615:3:3] runtime error: slice bounds out of range [18446744073709551615:3:] + array[18446744073709551615:3:4] runtime error: slice bounds out of range [::4] with length 3 + array[18446744073709551615:3:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[18446744073709551615:3:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[18446744073709551615:4:0] runtime error: slice bounds out of range [:4:0] + array[18446744073709551615:4:3] runtime error: slice bounds out of range [:4:3] + array[18446744073709551615:4:4] runtime error: slice bounds out of range [::4] with length 3 + array[18446744073709551615:4:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[18446744073709551615:4:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[18446744073709551615:4294967295:0] runtime error: slice bounds out of range [:4294967295:0] + array[18446744073709551615:4294967295:3] runtime error: slice bounds out of range [:4294967295:3] + array[18446744073709551615:4294967295:4] runtime error: slice bounds out of range [::4] with length 3 + array[18446744073709551615:4294967295:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[18446744073709551615:4294967295:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 + array[18446744073709551615:18446744073709551615:0] runtime error: slice bounds out of range [:18446744073709551615:0] + array[18446744073709551615:18446744073709551615:3] runtime error: slice bounds out of range [:18446744073709551615:3] + array[18446744073709551615:18446744073709551615:4] runtime error: slice bounds out of range [::4] with length 3 + array[18446744073709551615:18446744073709551615:4294967295] runtime error: slice bounds out of range [::4294967295] with length 3 + array[18446744073709551615:18446744073709551615:18446744073709551615] runtime error: slice bounds out of range [::18446744073709551615] with length 3 -- GitLab From 916e861fd969e19e918e5b24c45a834c63dd8ee4 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 18 Mar 2019 12:19:26 -0700 Subject: [PATCH 0496/1679] cmd/compile: fix importing rewritten f(g()) calls golang.org/cl/166983 started serializing the Ninit field of OCALL nodes within function inline bodies (necessary to fix a regression in building crypto/ecdsa with -gcflags=-l=4), but this means the Ninit field needs to be typechecked when the imported function body is used. It's unclear why this wasn't necessary for the crypto/ecdsa regression. Fixes #30907. Change-Id: Id5f0bf3c4d17bbd6d5318913b859093c93a0a20c Reviewed-on: https://go-review.googlesource.com/c/go/+/168199 Run-TryBot: Matthew Dempsky Reviewed-by: Robert Griesemer TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/typecheck.go | 1 + test/fixedbugs/issue30907.dir/a.go | 19 +++++++++++++++++++ test/fixedbugs/issue30907.dir/b.go | 11 +++++++++++ test/fixedbugs/issue30907.go | 7 +++++++ 4 files changed, 38 insertions(+) create mode 100644 test/fixedbugs/issue30907.dir/a.go create mode 100644 test/fixedbugs/issue30907.dir/b.go create mode 100644 test/fixedbugs/issue30907.go diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go index 2468f52b74..a746b34180 100644 --- a/src/cmd/compile/internal/gc/typecheck.go +++ b/src/cmd/compile/internal/gc/typecheck.go @@ -1239,6 +1239,7 @@ func typecheck1(n *Node, top int) (res *Node) { // call and call like case OCALL: + typecheckslice(n.Ninit.Slice(), ctxStmt) // imported rewritten f(g()) calls (#30907) n.Left = typecheck(n.Left, ctxExpr|Etype|ctxCallee) if n.Left.Diag() { n.SetDiag(true) diff --git a/test/fixedbugs/issue30907.dir/a.go b/test/fixedbugs/issue30907.dir/a.go new file mode 100644 index 0000000000..e1a5c0cc3b --- /dev/null +++ b/test/fixedbugs/issue30907.dir/a.go @@ -0,0 +1,19 @@ +// Copyright 2019 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 a + +type UUID string + +func New() UUID { + return Must(NewRandom()) +} + +func NewRandom() (UUID, error) { + return "", nil +} + +func Must(uuid UUID, err error) UUID { + return uuid +} diff --git a/test/fixedbugs/issue30907.dir/b.go b/test/fixedbugs/issue30907.dir/b.go new file mode 100644 index 0000000000..f4f5fc4fdd --- /dev/null +++ b/test/fixedbugs/issue30907.dir/b.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 p + +import "./a" + +func F() { + a.New() +} diff --git a/test/fixedbugs/issue30907.go b/test/fixedbugs/issue30907.go new file mode 100644 index 0000000000..973ae1dcef --- /dev/null +++ b/test/fixedbugs/issue30907.go @@ -0,0 +1,7 @@ +// compiledir + +// Copyright 2019 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 ignored -- GitLab From 991c85a750574a608daf70330e26070f8cd97bb4 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Sun, 16 Dec 2018 03:14:40 +1100 Subject: [PATCH 0497/1679] cmd/dist: sort gohostos switch entries Sort gohostos switch entries for readability/maintainability. Change-Id: I565b0aee33e8463502faa68eaceea6f7dccca66b Reviewed-on: https://go-review.googlesource.com/c/go/+/154379 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/cmd/dist/main.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cmd/dist/main.go b/src/cmd/dist/main.go index bab8ab781a..ed116e22f6 100644 --- a/src/cmd/dist/main.go +++ b/src/cmd/dist/main.go @@ -56,6 +56,9 @@ func main() { gohostos = runtime.GOOS switch gohostos { + case "aix": + // uname -m doesn't work under AIX + gohostarch = "ppc64" case "darwin": // Even on 64-bit platform, darwin uname -m prints i386. // We don't support any of the OS X versions that run on 32-bit-only hardware anymore. @@ -72,6 +75,11 @@ func main() { if runtime.GOARCH == "arm" { defaultclang = true } + case "plan9": + gohostarch = os.Getenv("objtype") + if gohostarch == "" { + fatalf("$objtype is unset") + } case "solaris": // Even on 64-bit platform, solaris uname -m prints i86pc. out := run("", CheckExit, "isainfo", "-n") @@ -81,16 +89,8 @@ func main() { if strings.Contains(out, "i386") { gohostarch = "386" } - case "plan9": - gohostarch = os.Getenv("objtype") - if gohostarch == "" { - fatalf("$objtype is unset") - } case "windows": exe = ".exe" - case "aix": - // uname -m doesn't work under AIX - gohostarch = "ppc64" } sysinit() -- GitLab From d949d0b9252be1fffeadd65183a6bab3acf3de7a Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 5 Feb 2019 16:22:38 -0800 Subject: [PATCH 0498/1679] cmd/compile: reorganize init functions Instead of writing an init function per package that does the same thing for every package, just write that implementation once in the runtime. Change the compiler to generate a data structure that encodes the required initialization operations. Reduces cmd/go binary size by 0.3%+. Most of the init code is gone, including all the corresponding stack map info. The .inittask structures that replace them are quite a bit smaller. Most usefully to me, there is no longer an init function in every -S output. (There is an .inittask global there, but it's much less distracting.) After this CL we could change the name of the "init.ializers" function back to just "init". Update #6853 R=go1.13 Change-Id: Iec82b205cc52fe3ade4d36406933c97dbc9c01b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/161337 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/init.go | 236 +++++---------------------- src/cmd/link/internal/ld/data.go | 2 +- src/cmd/link/internal/ld/deadcode.go | 4 +- src/plugin/plugin_dlopen.go | 16 +- src/runtime/panic.go | 4 - src/runtime/proc.go | 48 +++++- test/fixedbugs/issue29919.dir/a.go | 4 +- test/init.go | 4 +- 8 files changed, 98 insertions(+), 220 deletions(-) diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index 6fd2c3427f..01421eee36 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -6,6 +6,7 @@ package gc import ( "cmd/compile/internal/types" + "cmd/internal/obj" ) // A function named init is a special case. @@ -23,77 +24,29 @@ func renameinit() *types.Sym { return s } -// anyinit reports whether there any interesting init statements. -func anyinit(n []*Node) bool { - for _, ln := range n { - switch ln.Op { - case ODCLFUNC, ODCLCONST, ODCLTYPE, OEMPTY: - case OAS: - if !ln.Left.isBlank() || !candiscard(ln.Right) { - return true - } - default: - return true - } - } - - // is this main - if localpkg.Name == "main" { - return true - } +// fninit makes an initialization record for the package. +// See runtime/proc.go:initTask for its layout. +// The 3 tasks for initialization are: +// 1) Initialize all of the packages the current package depends on. +// 2) Initialize all the variables that have initializers. +// 3) Run any init functions. +func fninit(n []*Node) { + nf := initfix(n) - // is there an explicit init function - if renameinitgen > 0 { - return true - } + var deps []*obj.LSym // initTask records for packages the current package depends on + var fns []*obj.LSym // functions to call for package initialization - // are there any imported init functions - for _, s := range types.InitSyms { - if s.Def != nil { - return true + // Find imported packages with init tasks. + for _, p := range types.ImportedPkgList() { + if s, ok := p.LookupOK(".inittask"); ok { + deps = append(deps, s.Linksym()) } } - // then none - return false -} - -// fninit hand-crafts package initialization code. -// -// func init.ializers() { (0) -// -// } -// var initdone· uint8 (1) -// func init() { (2) -// if initdone· > 1 { (3) -// return (3a) -// } -// if initdone· == 1 { (4) -// throw() (4a) -// } -// initdone· = 1 (5) -// // over all matching imported symbols -// .init() (6) -// init.ializers() (7) -// init.() // if any (8) -// initdone· = 2 (9) -// return (10) -// } -func fninit(n []*Node) { - lineno = autogeneratedPos - nf := initfix(n) - if !anyinit(nf) { - return - } - - // (0) // Make a function that contains all the initialization statements. - // This is a separate function because we want it to appear in - // stack traces, where the init function itself does not. - var initializers *types.Sym if len(nf) > 0 { lineno = nf[0].Pos // prolog/epilog gets line number of first init stmt - initializers = lookup("init.ializers") + initializers := lookup("init.ializers") disableExport(initializers) fn := dclfunc(initializers, nod(OTFUNC, nil, nil)) for _, dcl := range dummyInitFn.Func.Dcl { @@ -110,7 +63,7 @@ func fninit(n []*Node) { typecheckslice(nf, ctxStmt) Curfn = nil funccompile(fn) - lineno = autogeneratedPos + fns = append(fns, initializers.Linksym()) } if dummyInitFn.Func.Dcl != nil { // We only generate temps using dummyInitFn if there @@ -119,140 +72,37 @@ func fninit(n []*Node) { Fatalf("dummyInitFn still has declarations") } - var r []*Node - - // (1) - gatevar := newname(lookup("initdone·")) - addvar(gatevar, types.Types[TUINT8], PEXTERN) - - // (2) - initsym := lookup("init") - fn := dclfunc(initsym, nod(OTFUNC, nil, nil)) - - // (3) - a := nod(OIF, nil, nil) - a.Left = nod(OGT, gatevar, nodintconst(1)) - a.SetLikely(true) - r = append(r, a) - // (3a) - a.Nbody.Set1(nod(ORETURN, nil, nil)) - - // (4) - b := nod(OIF, nil, nil) - b.Left = nod(OEQ, gatevar, nodintconst(1)) - // this actually isn't likely, but code layout is better - // like this: no JMP needed after the call. - b.SetLikely(true) - r = append(r, b) - // (4a) - b.Nbody.Set1(nod(OCALL, syslook("throwinit"), nil)) - - // (5) - a = nod(OAS, gatevar, nodintconst(1)) - - r = append(r, a) - - // (6) - for _, s := range types.InitSyms { - if s == initsym { - continue - } - n := resolve(oldname(s)) - if n.Op == ONONAME { - // No package-scope init function; just a - // local variable, field name, or something. - continue - } - n.checkInitFuncSignature() - a = nod(OCALL, n, nil) - r = append(r, a) + // Record user init functions. + for i := 0; i < renameinitgen; i++ { + s := lookupN("init.", i) + fns = append(fns, s.Linksym()) } - // (7) - if initializers != nil { - n := newname(initializers) - addvar(n, functype(nil, nil, nil), PFUNC) - r = append(r, nod(OCALL, n, nil)) + if len(deps) == 0 && len(fns) == 0 && localpkg.Name != "main" && localpkg.Name != "runtime" { + return // nothing to initialize } - // (8) - - // maxInlineInitCalls is the threshold at which we switch - // from generating calls inline to generating a static array - // of functions and calling them in a loop. - // See CL 41500 for more discussion. - const maxInlineInitCalls = 500 - - if renameinitgen < maxInlineInitCalls { - // Not many init functions. Just call them all directly. - for i := 0; i < renameinitgen; i++ { - s := lookupN("init.", i) - n := asNode(s.Def) - n.checkInitFuncSignature() - a = nod(OCALL, n, nil) - r = append(r, a) - } - } else { - // Lots of init functions. - // Set up an array of functions and loop to call them. - // This is faster to compile and similar at runtime. - - // Build type [renameinitgen]func(). - typ := types.NewArray(functype(nil, nil, nil), int64(renameinitgen)) - - // Make and fill array. - fnarr := staticname(typ) - fnarr.Name.SetReadonly(true) - for i := 0; i < renameinitgen; i++ { - s := lookupN("init.", i) - lhs := nod(OINDEX, fnarr, nodintconst(int64(i))) - rhs := asNode(s.Def) - rhs.checkInitFuncSignature() - as := nod(OAS, lhs, rhs) - as = typecheck(as, ctxStmt) - genAsStatic(as) - } - - // Generate a loop that calls each function in turn. - // for i := 0; i < renameinitgen; i++ { - // fnarr[i]() - // } - i := temp(types.Types[TINT]) - fnidx := nod(OINDEX, fnarr, i) - fnidx.SetBounded(true) - - zero := nod(OAS, i, nodintconst(0)) - cond := nod(OLT, i, nodintconst(int64(renameinitgen))) - incr := nod(OAS, i, nod(OADD, i, nodintconst(1))) - body := nod(OCALL, fnidx, nil) - - loop := nod(OFOR, cond, incr) - loop.Nbody.Set1(body) - loop.Ninit.Set1(zero) - - loop = typecheck(loop, ctxStmt) - r = append(r, loop) + // Make an .inittask structure. + sym := lookup(".inittask") + nn := newname(sym) + nn.Type = types.Types[TUINT8] // dummy type + nn.SetClass(PEXTERN) + sym.Def = asTypesNode(nn) + exportsym(nn) + lsym := sym.Linksym() + ot := 0 + ot = duintptr(lsym, ot, 0) // state: not initialized yet + ot = duintptr(lsym, ot, uint64(len(deps))) + ot = duintptr(lsym, ot, uint64(len(fns))) + for _, d := range deps { + ot = dsymptr(lsym, ot, d, 0) } - - // (9) - a = nod(OAS, gatevar, nodintconst(2)) - - r = append(r, a) - - // (10) - a = nod(ORETURN, nil, nil) - - r = append(r, a) - exportsym(fn.Func.Nname) - - fn.Nbody.Set(r) - funcbody() - - Curfn = fn - fn = typecheck(fn, ctxStmt) - typecheckslice(r, ctxStmt) - Curfn = nil - funccompile(fn) + for _, f := range fns { + ot = dsymptr(lsym, ot, f, 0) + } + // An initTask has pointers, but none into the Go heap. + // It's not quite read only, the state field must be modifiable. + ggloblsym(lsym, int32(ot), obj.NOPTR) } func (n *Node) checkInitFuncSignature() { diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index d31d135273..ff339af303 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -148,7 +148,7 @@ func relocsym(ctxt *Link, s *sym.Symbol) { // When putting the runtime but not main into a shared library // these symbols are undefined and that's OK. if ctxt.BuildMode == BuildModeShared { - if r.Sym.Name == "main.main" || r.Sym.Name == "main.init" { + if r.Sym.Name == "main.main" || r.Sym.Name == "main..inittask" { r.Sym.Type = sym.SDYNIMPORT } else if strings.HasPrefix(r.Sym.Name, "go.info.") { // Skip go.info symbols. They are only needed to communicate diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index 627ce05d7a..f9a0ee0f96 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -222,7 +222,7 @@ func (d *deadcodepass) init() { // functions and mark what is reachable from there. if d.ctxt.linkShared && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { - names = append(names, "main.main", "main.init") + names = append(names, "main.main", "main..inittask") } else { // The external linker refers main symbol directly. if d.ctxt.LinkMode == LinkExternal && (d.ctxt.BuildMode == BuildModeExe || d.ctxt.BuildMode == BuildModePIE) { @@ -234,7 +234,7 @@ func (d *deadcodepass) init() { } names = append(names, *flagEntrySymbol) if d.ctxt.BuildMode == BuildModePlugin { - names = append(names, objabi.PathToPrefix(*flagPluginPath)+".init", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs") + names = append(names, objabi.PathToPrefix(*flagPluginPath)+"..inittask", objabi.PathToPrefix(*flagPluginPath)+".main", "go.plugin.tabs") // We don't keep the go.plugin.exports symbol, // but we do keep the symbols it refers to. diff --git a/src/plugin/plugin_dlopen.go b/src/plugin/plugin_dlopen.go index f24093989f..03d3f08717 100644 --- a/src/plugin/plugin_dlopen.go +++ b/src/plugin/plugin_dlopen.go @@ -92,15 +92,13 @@ func open(name string) (*Plugin, error) { plugins[filepath] = p pluginsMu.Unlock() - initStr := make([]byte, len(pluginpath)+6) + initStr := make([]byte, len(pluginpath)+len("..inittask")+1) // +1 for terminating NUL copy(initStr, pluginpath) - copy(initStr[len(pluginpath):], ".init") + copy(initStr[len(pluginpath):], "..inittask") - initFuncPC := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr) - if initFuncPC != nil { - initFuncP := &initFuncPC - initFunc := *(*func())(unsafe.Pointer(&initFuncP)) - initFunc() + initTask := C.pluginLookup(h, (*C.char)(unsafe.Pointer(&initStr[0])), &cErr) + if initTask != nil { + doInit(initTask) } // Fill out the value of each plugin symbol. @@ -150,3 +148,7 @@ var ( // lastmoduleinit is defined in package runtime func lastmoduleinit() (pluginpath string, syms map[string]interface{}, errstr string) + +// doInit is defined in package runtime +//go:linkname doInit runtime.doInit +func doInit(t unsafe.Pointer) // t should be a *runtime.initTask diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 918ab7682a..543fd23c01 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -183,10 +183,6 @@ func panicmem() { panic(memoryError) } -func throwinit() { - throw("recursive call during initialization - linker skew") -} - // Create a new deferred function fn with siz bytes of arguments. // The compiler turns a defer statement into a call to this. //go:nosplit diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 6e56b4b1d1..a077a5da03 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -82,11 +82,11 @@ var ( raceprocctx0 uintptr ) -//go:linkname runtime_init runtime.init -func runtime_init() +//go:linkname runtime_inittask runtime..inittask +var runtime_inittask initTask -//go:linkname main_init main.init -func main_init() +//go:linkname main_inittask main..inittask +var main_inittask initTask // main_init_done is a signal used by cgocallbackg that initialization // has been completed. It is made before _cgo_notify_runtime_init_done, @@ -144,7 +144,7 @@ func main() { throw("runtime.main not on m0") } - runtime_init() // must be before defer + doInit(&runtime_inittask) // must be before defer if nanotime() == 0 { throw("nanotime returning zero") } @@ -184,8 +184,8 @@ func main() { cgocall(_cgo_notify_runtime_init_done, nil) } - fn := main_init // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime - fn() + doInit(&main_inittask) + close(main_init_done) needUnlock = false @@ -196,7 +196,7 @@ func main() { // has a main, but it is not executed. return } - fn = main_main // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime + fn := main_main // make an indirect call, as the linker doesn't know the address of the main package when laying down the runtime fn() if raceenabled { racefini() @@ -5185,3 +5185,35 @@ func gcd(a, b uint32) uint32 { } return a } + +// An initTask represents the set of initializations that need to be done for a package. +type initTask struct { + // TODO: pack the first 3 fields more tightly? + state uintptr // 0 = uninitialized, 1 = in progress, 2 = done + ndeps uintptr + nfns uintptr + // followed by ndeps instances of an *initTask, one per package depended on + // followed by nfns pcs, one per init function to run +} + +func doInit(t *initTask) { + switch t.state { + case 2: // fully initialized + return + case 1: // initialization in progress + throw("recursive call during initialization - linker skew") + default: // not initialized yet + t.state = 1 // initialization in progress + for i := uintptr(0); i < t.ndeps; i++ { + p := add(unsafe.Pointer(t), (3+i)*sys.PtrSize) + t2 := *(**initTask)(p) + doInit(t2) + } + for i := uintptr(0); i < t.nfns; i++ { + p := add(unsafe.Pointer(t), (3+t.ndeps+i)*sys.PtrSize) + f := *(*func())(unsafe.Pointer(&p)) + f() + } + t.state = 2 // initialization done + } +} diff --git a/test/fixedbugs/issue29919.dir/a.go b/test/fixedbugs/issue29919.dir/a.go index cfccc4aabb..2452127ae6 100644 --- a/test/fixedbugs/issue29919.dir/a.go +++ b/test/fixedbugs/issue29919.dir/a.go @@ -65,8 +65,8 @@ func f() int { panic("traceback truncated after init.ializers") } f, _ = iter.Next() - if f.Function != "runtime.main" { - panic("runtime.main missing") + if !strings.HasPrefix(f.Function, "runtime.") { + panic("runtime. driver missing") } return 0 diff --git a/test/init.go b/test/init.go index f4689443cf..317f2472cb 100644 --- a/test/init.go +++ b/test/init.go @@ -9,13 +9,11 @@ package main -import "runtime" - func init() { } func main() { init() // ERROR "undefined.*init" - runtime.init() // ERROR "unexported.*runtime\.init" + runtime.init() // ERROR "undefined.*runtime\.init" var _ = init // ERROR "undefined.*init" } -- GitLab From 689544c0b9287852c3ace3c7bd106a8996bbf28f Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 18 Mar 2019 12:49:49 -0700 Subject: [PATCH 0499/1679] runtime: fix registers for bounds check calling convention on arm Some of the registers in which indexes + length were supposed to be passed were wrong. Update #30116 Change-Id: I1089366b7429c1e0ecad9219b847db069ce6b5d6 Reviewed-on: https://go-review.googlesource.com/c/go/+/168041 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/runtime/asm_arm.s | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s index c1e915b97c..af7da64ce6 100644 --- a/src/runtime/asm_arm.s +++ b/src/runtime/asm_arm.s @@ -1054,22 +1054,22 @@ TEXT runtime·panicExtendIndexU(SB),NOSPLIT,$0-12 TEXT runtime·panicExtendSliceAlen(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSliceAlen(SB) TEXT runtime·panicExtendSliceAlenU(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSliceAlenU(SB) TEXT runtime·panicExtendSliceAcap(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSliceAcap(SB) TEXT runtime·panicExtendSliceAcapU(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSliceAcapU(SB) TEXT runtime·panicExtendSliceB(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) @@ -1083,33 +1083,33 @@ TEXT runtime·panicExtendSliceBU(SB),NOSPLIT,$0-12 JMP runtime·goPanicExtendSliceBU(SB) TEXT runtime·panicExtendSlice3Alen(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) - MOVW R3, lo+4(FP) + MOVW R2, lo+4(FP) MOVW R3, y+8(FP) JMP runtime·goPanicExtendSlice3Alen(SB) TEXT runtime·panicExtendSlice3AlenU(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) - MOVW R3, lo+4(FP) + MOVW R2, lo+4(FP) MOVW R3, y+8(FP) JMP runtime·goPanicExtendSlice3AlenU(SB) TEXT runtime·panicExtendSlice3Acap(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) - MOVW R3, lo+4(FP) + MOVW R2, lo+4(FP) MOVW R3, y+8(FP) JMP runtime·goPanicExtendSlice3Acap(SB) TEXT runtime·panicExtendSlice3AcapU(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) - MOVW R3, lo+4(FP) + MOVW R2, lo+4(FP) MOVW R3, y+8(FP) JMP runtime·goPanicExtendSlice3AcapU(SB) TEXT runtime·panicExtendSlice3B(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSlice3B(SB) TEXT runtime·panicExtendSlice3BU(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) MOVW R1, lo+4(FP) - MOVW R3, y+8(FP) + MOVW R2, y+8(FP) JMP runtime·goPanicExtendSlice3BU(SB) TEXT runtime·panicExtendSlice3C(SB),NOSPLIT,$0-12 MOVW R4, hi+0(FP) -- GitLab From 27e444d5e6cce9f3f4c132ad964627bdb31a3651 Mon Sep 17 00:00:00 2001 From: bakape Date: Mon, 18 Mar 2019 19:53:41 +0000 Subject: [PATCH 0500/1679] net/http: Detect MIME type of v5 RAR archives Change-Id: Id9dedc861523e2dafe0e67f70862973124fa07b3 GitHub-Last-Rev: b662561f1980dff9861dd8a738c75a03baa72681 GitHub-Pull-Request: golang/go#30909 Reviewed-on: https://go-review.googlesource.com/c/go/+/168039 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/sniff.go | 3 ++- src/net/http/sniff_test.go | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/net/http/sniff.go b/src/net/http/sniff.go index f03f723542..114a88ccba 100644 --- a/src/net/http/sniff.go +++ b/src/net/http/sniff.go @@ -185,7 +185,8 @@ var sniffSignatures = []sniffSig{ // Archive types &exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"}, &exactSig{[]byte("PK\x03\x04"), "application/zip"}, - &exactSig{[]byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"}, + &exactSig{[]byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"}, // RAR v1.5-v4.0 + &exactSig{[]byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+ &exactSig{[]byte("\x00\x61\x73\x6D"), "application/wasm"}, diff --git a/src/net/http/sniff_test.go b/src/net/http/sniff_test.go index b752f23382..08ae79c285 100644 --- a/src/net/http/sniff_test.go +++ b/src/net/http/sniff_test.go @@ -72,6 +72,10 @@ var sniffTests = []struct { {"woff sample I", []byte("\x77\x4f\x46\x46\x00\x01\x00\x00\x00\x00\x30\x54\x00\x0d\x00\x00"), "font/woff"}, {"woff2 sample", []byte("\x77\x4f\x46\x32\x00\x01\x00\x00\x00"), "font/woff2"}, {"wasm sample", []byte("\x00\x61\x73\x6d\x01\x00"), "application/wasm"}, + + // Archive types + {"RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"}, + {"RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"}, } func TestDetectContentType(t *testing.T) { -- GitLab From 7b916243d98e36a385da4086fd9dd57004f6e4ca Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 18 Mar 2019 13:17:35 -0700 Subject: [PATCH 0501/1679] cmd/compile: rename init function from init.ializers back to init The name change init -> init.ializers was initially required for initialization code. With CL 161337 there's no wrapper code any more, there's a data structure instead (named .inittask). So we can go back to just plain init appearing in tracebacks. RELNOTE=yes Update #29919. Followon to CL 161337. Change-Id: I5a4a49d286df24b53b2baa193dfda482f3ea82a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167780 Run-TryBot: Keith Randall Reviewed-by: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/init.go | 2 +- src/fmt/errors_test.go | 2 +- test/fixedbugs/issue29919.dir/a.go | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/gc/init.go b/src/cmd/compile/internal/gc/init.go index 01421eee36..6467aafd53 100644 --- a/src/cmd/compile/internal/gc/init.go +++ b/src/cmd/compile/internal/gc/init.go @@ -46,7 +46,7 @@ func fninit(n []*Node) { // Make a function that contains all the initialization statements. if len(nf) > 0 { lineno = nf[0].Pos // prolog/epilog gets line number of first init stmt - initializers := lookup("init.ializers") + initializers := lookup("init") disableExport(initializers) fn := dclfunc(initializers, nod(OTFUNC, nil, nil)) for _, dcl := range dummyInitFn.Func.Dcl { diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go index ed77709ea0..0183ba77e5 100644 --- a/src/fmt/errors_test.go +++ b/src/fmt/errors_test.go @@ -157,7 +157,7 @@ func TestErrorFormatter(t *testing.T) { want: "fallback:" + "\n somefile.go:123" + "\n - file does not exist:" + - "\n os.init.ializers" + + "\n os.init" + "\n .+/os/error.go:\\d\\d", regexp: true, }, { diff --git a/test/fixedbugs/issue29919.dir/a.go b/test/fixedbugs/issue29919.dir/a.go index 2452127ae6..078f973b4b 100644 --- a/test/fixedbugs/issue29919.dir/a.go +++ b/test/fixedbugs/issue29919.dir/a.go @@ -34,8 +34,8 @@ func f() int { if !strings.Contains(s, "a.go:19") { panic("missing a.go:19") } - if !strings.Contains(s, "a.init.ializers") { - panic("missing a.init.ializers") + if !strings.Contains(s, "a.init") { + panic("missing a.init") } // Check the CallersFrames results. @@ -58,11 +58,11 @@ func f() int { panic("traceback truncated after f") } f, more = iter.Next() - if f.Function != "a.init.ializers" || !strings.HasSuffix(f.File, "a.go") || f.Line != 15 { - panic(fmt.Sprintf("bad init.ializers %v\n", f)) + if f.Function != "a.init" || !strings.HasSuffix(f.File, "a.go") || f.Line != 15 { + panic(fmt.Sprintf("bad init %v\n", f)) } if !more { - panic("traceback truncated after init.ializers") + panic("traceback truncated after init") } f, _ = iter.Next() if !strings.HasPrefix(f.Function, "runtime.") { -- GitLab From 08751259b75ad88e1b65c0b1c1a76541b924dd9d Mon Sep 17 00:00:00 2001 From: Philipp Stephani Date: Mon, 18 Mar 2019 20:13:17 +0000 Subject: [PATCH 0502/1679] cmd/cgo: use C exact-width integer types to represent Go types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The exact-width integer types are required to use two’s complement representation and may not have padding bits, cf. §7.20.1.1/1 in the C11 standard or https://en.cppreference.com/w/c/types/integer. This ensures that they have the same domain and representation as the corresponding Go types. Fixes #29878 Change-Id: Ie8a51e91666dfd89731c7859abe47356c94ca1be GitHub-Last-Rev: 546a2cc3f1e22dc282757f73c01c91b00899d911 GitHub-Pull-Request: golang/go#29907 Reviewed-on: https://go-review.googlesource.com/c/go/+/159258 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/cgo_test.go | 1 + misc/cgo/test/issue29878.go | 20 ++++++++++++++++ misc/cgo/test/issue29878export.go | 12 ++++++++++ src/cmd/cgo/doc.go | 4 +++- src/cmd/cgo/gcc.go | 38 +++++++++++++++++++++++++++++++ src/cmd/cgo/out.go | 36 ++++++++++++----------------- 6 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 misc/cgo/test/issue29878.go create mode 100644 misc/cgo/test/issue29878export.go diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 2d6d269608..7f886bad68 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -56,6 +56,7 @@ func Test25143(t *testing.T) { test25143(t) } func Test26066(t *testing.T) { test26066(t) } func Test27660(t *testing.T) { test27660(t) } func Test28896(t *testing.T) { test28896(t) } +func Test29878(t *testing.T) { test29878(t) } func Test30065(t *testing.T) { test30065(t) } func TestAlign(t *testing.T) { testAlign(t) } func TestAtol(t *testing.T) { testAtol(t) } diff --git a/misc/cgo/test/issue29878.go b/misc/cgo/test/issue29878.go new file mode 100644 index 0000000000..c1aeaf9709 --- /dev/null +++ b/misc/cgo/test/issue29878.go @@ -0,0 +1,20 @@ +// Copyright 2019 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 cgotest + +// #include +// uint64_t issue29878exported(int8_t); // prototype must match +// int16_t issue29878function(uint32_t arg) { return issue29878exported(arg); } +import "C" + +import "testing" + +func test29878(t *testing.T) { + const arg uint32 = 123 // fits into all integer types + var ret int16 = C.issue29878function(arg) // no conversions needed + if int64(ret) != int64(arg) { + t.Errorf("return value unexpected: got %d, want %d", ret, arg) + } +} diff --git a/misc/cgo/test/issue29878export.go b/misc/cgo/test/issue29878export.go new file mode 100644 index 0000000000..59727c72fc --- /dev/null +++ b/misc/cgo/test/issue29878export.go @@ -0,0 +1,12 @@ +// Copyright 2019 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 cgotest + +import "C" + +//export issue29878exported +func issue29878exported(arg int8) uint64 { + return uint64(arg) +} diff --git a/src/cmd/cgo/doc.go b/src/cmd/cgo/doc.go index 73ad4ba079..2ca77fe8be 100644 --- a/src/cmd/cgo/doc.go +++ b/src/cmd/cgo/doc.go @@ -148,6 +148,8 @@ C.long, C.ulong (unsigned long), C.longlong (long long), C.ulonglong (unsigned long long), C.float, C.double, C.complexfloat (complex float), and C.complexdouble (complex double). The C type void* is represented by Go's unsafe.Pointer. +The C sized integer types (int8_t, uint8_t, …) are represented by their Go +counterparts (int8, uint8, …). The C types __int128_t and __uint128_t are represented by [16]byte. A few special C types which would normally be represented by a pointer @@ -296,7 +298,7 @@ Go functions can be exported for use by C code in the following way: They will be available in the C code as: - extern int64 MyFunction(int arg1, int arg2, GoString arg3); + extern int64_t MyFunction(int arg1, int arg2, GoString arg3); extern struct MyFunction2_return MyFunction2(int arg1, int arg2, GoString arg3); found in the _cgo_export.h generated header, after any preambles diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 9428ffd3bf..3932489093 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -23,6 +23,7 @@ import ( "internal/xcoff" "math" "os" + "regexp" "strconv" "strings" "unicode" @@ -2046,6 +2047,8 @@ type typeConv struct { ptrSize int64 intSize int64 + + exactWidthIntegerTypes map[string]*Type } var tagGen int @@ -2088,6 +2091,21 @@ func (c *typeConv) Init(ptrSize, intSize int64) { } else { c.goVoidPtr = c.Ident("unsafe.Pointer") } + + c.exactWidthIntegerTypes = make(map[string]*Type) + for _, t := range []ast.Expr{ + c.int8, c.int16, c.int32, c.int64, + c.uint8, c.uint16, c.uint32, c.uint64, + } { + name := t.(*ast.Ident).Name + u := new(Type) + *u = *goTypes[name] + if u.Align > ptrSize { + u.Align = ptrSize + } + u.Go = t + c.exactWidthIntegerTypes[name] = u + } } // base strips away qualifiers and typedefs to get the underlying type @@ -2459,6 +2477,24 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { t.Align = c.ptrSize break } + // Exact-width integer types. These are always compatible with + // the corresponding Go types since the C standard requires + // them to have no padding bit and use the two’s complement + // representation. + if exactWidthIntegerType.MatchString(dt.Name) { + sub := c.Type(dt.Type, pos) + u := c.exactWidthIntegerTypes[strings.TrimSuffix(dt.Name, "_t")] + if sub.Size != u.Size { + fatalf("%s: unexpected size: %d vs. %d – %s", lineno(pos), sub.Size, u.Size, dtype) + } + if sub.Align != u.Align { + fatalf("%s: unexpected alignment: %d vs. %d – %s", lineno(pos), sub.Align, u.Align, dtype) + } + t.Size = u.Size + t.Align = u.Align + t.Go = u.Go + break + } name := c.Ident("_Ctype_" + dt.Name) goIdent[name.Name] = name sub := c.Type(dt.Type, pos) @@ -2594,6 +2630,8 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { return t } +var exactWidthIntegerType = regexp.MustCompile(`^u?int(8|16|32|64)_t$`) + // isStructUnionClass reports whether the type described by the Go syntax x // is a struct, union, or class with a tag. func isStructUnionClass(x ast.Expr) bool { diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index d00c990d63..5d61a2fb8a 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -1361,19 +1361,19 @@ func c(repr string, args ...interface{}) *TypeRepr { // Map predeclared Go types to Type. var goTypes = map[string]*Type{ - "bool": {Size: 1, Align: 1, C: c("GoUint8")}, - "byte": {Size: 1, Align: 1, C: c("GoUint8")}, + "bool": {Size: 1, Align: 1, C: c("uint8_t")}, + "byte": {Size: 1, Align: 1, C: c("uint8_t")}, "int": {Size: 0, Align: 0, C: c("GoInt")}, "uint": {Size: 0, Align: 0, C: c("GoUint")}, - "rune": {Size: 4, Align: 4, C: c("GoInt32")}, - "int8": {Size: 1, Align: 1, C: c("GoInt8")}, - "uint8": {Size: 1, Align: 1, C: c("GoUint8")}, - "int16": {Size: 2, Align: 2, C: c("GoInt16")}, - "uint16": {Size: 2, Align: 2, C: c("GoUint16")}, - "int32": {Size: 4, Align: 4, C: c("GoInt32")}, - "uint32": {Size: 4, Align: 4, C: c("GoUint32")}, - "int64": {Size: 8, Align: 8, C: c("GoInt64")}, - "uint64": {Size: 8, Align: 8, C: c("GoUint64")}, + "rune": {Size: 4, Align: 4, C: c("int32_t")}, + "int8": {Size: 1, Align: 1, C: c("int8_t")}, + "uint8": {Size: 1, Align: 1, C: c("uint8_t")}, + "int16": {Size: 2, Align: 2, C: c("int16_t")}, + "uint16": {Size: 2, Align: 2, C: c("uint16_t")}, + "int32": {Size: 4, Align: 4, C: c("int32_t")}, + "uint32": {Size: 4, Align: 4, C: c("uint32_t")}, + "int64": {Size: 8, Align: 8, C: c("int64_t")}, + "uint64": {Size: 8, Align: 8, C: c("uint64_t")}, "float32": {Size: 4, Align: 4, C: c("GoFloat32")}, "float64": {Size: 8, Align: 8, C: c("GoFloat64")}, "complex64": {Size: 8, Align: 4, C: c("GoComplex64")}, @@ -1865,16 +1865,10 @@ const gccExportHeaderProlog = ` #ifndef GO_CGO_PROLOGUE_H #define GO_CGO_PROLOGUE_H -typedef signed char GoInt8; -typedef unsigned char GoUint8; -typedef short GoInt16; -typedef unsigned short GoUint16; -typedef int GoInt32; -typedef unsigned int GoUint32; -typedef long long GoInt64; -typedef unsigned long long GoUint64; -typedef GoIntGOINTBITS GoInt; -typedef GoUintGOINTBITS GoUint; +#include + +typedef intGOINTBITS_t GoInt; +typedef uintGOINTBITS_t GoUint; typedef __SIZE_TYPE__ GoUintptr; typedef float GoFloat32; typedef double GoFloat64; -- GitLab From ca36af215f78b670000b31e7573f0fcf0c5de594 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 4 Jan 2019 17:34:33 -0800 Subject: [PATCH 0503/1679] cmd/compile: better write barrier removal when initializing new objects When initializing a new object, we're often writing 1) to a location that doesn't have a pointer to a heap object 2) a pointer that doesn't point to a heap object When both those conditions are true, we can avoid the write barrier. This CL detects case 1 by looking for writes to known-zeroed locations. The results of runtime.newobject are zeroed, and we perform a simple tracking of which parts of that object are written so we can determine what part remains zero at each write. This CL detects case 2 by looking for addresses of globals (including the types and itabs which are used in interfaces) and for nil pointers. Makes cmd/go 0.3% smaller. Some particular cases, like the slice literal in #29573, can get much smaller. TODO: we can remove actual zero writes also with this mechanism. Update #29573 Change-Id: Ie74a3533775ea88da0495ba02458391e5db26cb9 Reviewed-on: https://go-review.googlesource.com/c/go/+/156363 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/sinit.go | 3 +- src/cmd/compile/internal/ssa/writebarrier.go | 127 +++++++++++++++++-- test/writebarrier.go | 28 ++++ 3 files changed, 145 insertions(+), 13 deletions(-) diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index efdaf1c3c5..93afeb90a6 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -729,6 +729,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) if r.Sym.IsBlank() { return nblank, r.Left } + setlineno(r) return nodSym(ODOT, var_, r.Sym), r.Left } default: @@ -756,7 +757,7 @@ func fixedlit(ctxt initContext, kind initKind, n *Node, var_ *Node, init *Nodes) } // build list of assignments: var[index] = expr - setlineno(value) + setlineno(a) a = nod(OAS, a, value) a = typecheck(a, ctxStmt) switch kind { diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index 49770018f8..d9f39bffc9 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -11,9 +11,18 @@ import ( "strings" ) +// A ZeroRegion records a range of an object which is known to be zero. +// A ZeroRegion only applies to a single memory state. +type ZeroRegion struct { + base *Value + min int64 + max int64 +} + // needwb reports whether we need write barrier for store op v. // v must be Store/Move/Zero. -func needwb(v *Value) bool { +// zeroes provides known zero information (keyed by ID of memory-type values). +func needwb(v *Value, zeroes map[ID]ZeroRegion) bool { t, ok := v.Aux.(*types.Type) if !ok { v.Fatalf("store aux is not a type: %s", v.LongString()) @@ -24,14 +33,24 @@ func needwb(v *Value) bool { if IsStackAddr(v.Args[0]) { return false // write on stack doesn't need write barrier } - if v.Op == OpStore && IsGlobalAddr(v.Args[1]) && IsNewObject(v.Args[0], v.MemoryArg()) { - // Storing pointers to non-heap locations into a fresh object doesn't need a write barrier. - return false - } if v.Op == OpMove && IsReadOnlyGlobalAddr(v.Args[1]) && IsNewObject(v.Args[0], v.MemoryArg()) { // Copying data from readonly memory into a fresh object doesn't need a write barrier. return false } + if v.Op == OpStore && IsGlobalAddr(v.Args[1]) { + // Storing pointers to non-heap locations into zeroed memory doesn't need a write barrier. + ptr := v.Args[0] + var off int64 + size := v.Aux.(*types.Type).Size() + for ptr.Op == OpOffPtr { + off += ptr.AuxInt + ptr = ptr.Args[0] + } + z := zeroes[v.MemoryArg().ID] + if ptr == z.base && off >= z.min && off+size <= z.max { + return false + } + } return true } @@ -58,6 +77,7 @@ func writebarrier(f *Func) { var sset *sparseSet var storeNumber []int32 + zeroes := f.computeZeroMap() for _, b := range f.Blocks { // range loop is safe since the blocks we added contain no stores to expand // first, identify all the stores that need to insert a write barrier. // mark them with WB ops temporarily. record presence of WB ops. @@ -65,7 +85,7 @@ func writebarrier(f *Func) { for _, v := range b.Values { switch v.Op { case OpStore, OpMove, OpZero: - if needwb(v) { + if needwb(v, zeroes) { switch v.Op { case OpStore: v.Op = OpStoreWB @@ -301,6 +321,87 @@ func writebarrier(f *Func) { } } +// computeZeroMap returns a map from an ID of a memory value to +// a set of locations that are known to be zeroed at that memory value. +func (f *Func) computeZeroMap() map[ID]ZeroRegion { + // Keep track of which parts of memory are known to be zero. + // This helps with removing write barriers for various initialization patterns. + // This analysis is conservative. We only keep track, for each memory state, of + // a single constant range of a single object which is known to be zero. + zeroes := map[ID]ZeroRegion{} + // Find new objects. + for _, b := range f.Blocks { + for _, v := range b.Values { + if v.Op != OpLoad { + continue + } + mem := v.MemoryArg() + if IsNewObject(v, mem) { + zeroes[mem.ID] = ZeroRegion{v, 0, v.Type.Elem().Size()} + } + } + } + // Find stores to those new objects. + for { + changed := false + for _, b := range f.Blocks { + // Note: iterating forwards helps convergence, as values are + // typically (but not always!) in store order. + for _, v := range b.Values { + if v.Op != OpStore { + continue + } + z, ok := zeroes[v.MemoryArg().ID] + if !ok { + continue + } + ptr := v.Args[0] + var off int64 + size := v.Aux.(*types.Type).Size() + for ptr.Op == OpOffPtr { + off += ptr.AuxInt + ptr = ptr.Args[0] + } + if ptr != z.base { + // Different base object - we don't know anything. + // We could even be writing to the base object we know + // about, but through an aliased but offset pointer. + // So we have to throw all the zero information we have away. + continue + } + if off < z.min || off+size > z.max { + // Writing, at least partially, outside the known zeroes. + // We could salvage some zero information, but probably + // not worth it. + continue + } + // We now know we're storing to a zeroed area. + // We need to make a smaller zero range for the result of this store. + if off == z.min { + z.min += size + } else if off+size == z.max { + z.max -= size + } else { + // The store splits the known zero range in two. + // Keep track of the upper one, as we tend to initialize + // things in increasing memory order. + // TODO: keep track of larger one instead? + z.min = off + size + } + // Save updated zero range. + if zeroes[v.ID] != z { + zeroes[v.ID] = z + changed = true + } + } + } + if !changed { + break + } + } + return zeroes +} + // wbcall emits write barrier runtime call in b, returns memory. // if valIsVolatile, it moves val into temp space before making the call. func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Value, valIsVolatile bool) *Value { @@ -373,9 +474,15 @@ func IsStackAddr(v *Value) bool { return false } -// IsGlobalAddr reports whether v is known to be an address of a global. +// IsGlobalAddr reports whether v is known to be an address of a global (or nil). func IsGlobalAddr(v *Value) bool { - return v.Op == OpAddr && v.Args[0].Op == OpSB + if v.Op == OpAddr && v.Args[0].Op == OpSB { + return true // address of a global + } + if v.Op == OpConst64 || v.Op == OpConst32 { + return true // nil, the only possible pointer constant + } + return false } // IsReadOnlyGlobalAddr reports whether v is known to be an address of a read-only global. @@ -388,10 +495,6 @@ func IsReadOnlyGlobalAddr(v *Value) bool { } // IsNewObject reports whether v is a pointer to a freshly allocated & zeroed object at memory state mem. -// TODO: Be more precise. We really want "IsNilPointer" for the particular field in question. -// Right now, we can only detect a new object before any writes have been done to it. -// We could ignore non-pointer writes, writes to offsets which -// are known not to overlap the write in question, etc. func IsNewObject(v *Value, mem *Value) bool { if v.Op != OpLoad { return false diff --git a/test/writebarrier.go b/test/writebarrier.go index 8d262dd203..8cd559c190 100644 --- a/test/writebarrier.go +++ b/test/writebarrier.go @@ -261,3 +261,31 @@ func f24() **int { func f25() []string { return []string{"abc", "def", "ghi"} // no write barrier here } + +type T26 struct { + a, b, c int + d, e, f *int +} + +var g26 int + +func f26(p *int) *T26 { // see issue 29573 + return &T26{ + a: 5, + b: 6, + c: 7, + d: &g26, // no write barrier: global ptr + e: nil, // no write barrier: nil ptr + f: p, // ERROR "write barrier" + } +} + +func f27(p *int) []interface{} { + return []interface{}{ + nil, // no write barrier: zeroed memory, nil ptr + (*T26)(nil), // no write barrier: zeroed memory, type ptr & nil ptr + &g26, // no write barrier: zeroed memory, type ptr & global ptr + 7, // no write barrier: zeroed memory, type ptr & global ptr + p, // ERROR "write barrier" + } +} -- GitLab From 0cd74d1f1181c113352476d2913141e7cc88abc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 16:52:35 +0100 Subject: [PATCH 0504/1679] cmd, runtime: fix C trampolines on aix/ppc64 C trampolines are made by fixup CSECTS which are added between two symbols. If such CSECTS is added inside Go functions, all method offsets stored in moduledatas will be wrong. In order to prevent this, every C code is moved at the end of the executable and long calls are created for GO functions called by C code. The main function can't longer be made in Go as AIX __start isn't using a long call to branch on it. Therefore, a main is defined on runtime/cgo. Change-Id: I214b18decdb83107cf7325b298609eef9f9d1330 Reviewed-on: https://go-review.googlesource.com/c/go/+/164010 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/exec.go | 21 +++++++++++++++++++++ src/cmd/link/internal/ld/lib.go | 19 +++++++++++++++++++ src/cmd/link/internal/ld/pcln.go | 2 +- src/cmd/link/internal/ld/xcoff.go | 6 +++--- src/runtime/asm_ppc64x.s | 7 +++++++ src/runtime/cgo/callbacks_aix.go | 10 ++++++++++ src/runtime/cgo/gcc_aix_ppc64.S | 4 ++-- src/runtime/cgo/gcc_aix_ppc64.c | 22 ++++++++++++++++++++++ 8 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/runtime/cgo/callbacks_aix.go create mode 100644 src/runtime/cgo/gcc_aix_ppc64.c diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 3310beb709..0e10f2c926 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -2150,11 +2150,32 @@ func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string, // Filter out useless linker warnings caused by bugs outside Go. // See also cmd/link/internal/ld's hostlink method. var save [][]byte + var skipLines int for _, line := range bytes.SplitAfter(out, []byte("\n")) { // golang.org/issue/26073 - Apple Xcode bug if bytes.Contains(line, []byte("ld: warning: text-based stub file")) { continue } + + if skipLines > 0 { + skipLines-- + continue + } + + // Remove duplicate main symbol with runtime/cgo on AIX. + // With runtime/cgo, two main are available: + // One is generated by cgo tool with {return 0;}. + // The other one is the main calling runtime.rt0_go + // in runtime/cgo. + // The second can't be used by cgo programs because + // runtime.rt0_go is unknown to them. + // Therefore, we let ld remove this main version + // and used the cgo generated one. + if p.ImportPath == "runtime/cgo" && bytes.Contains(line, []byte("ld: 0711-224 WARNING: Duplicate symbol: .main")) { + skipLines = 1 + continue + } + save = append(save, line) } out = bytes.Join(save, nil) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index f12c8aeed7..076d2a71b9 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1288,6 +1288,25 @@ func (ctxt *Link) hostlink() { argv = append(argv, filepath.Join(*flagTmpdir, "go.o")) argv = append(argv, hostobjCopy()...) + if ctxt.HeadType == objabi.Haix { + // We want to have C files after Go files to remove + // trampolines csects made by ld. + argv = append(argv, "-nostartfiles") + argv = append(argv, "/lib/crt0_64.o") + + extld := ctxt.extld() + // Get starting files. + getPathFile := func(file string) string { + args := []string{"-maix64", "--print-file-name=" + file} + out, err := exec.Command(extld, args...).CombinedOutput() + if err != nil { + log.Fatalf("running %s failed: %v\n%s", extld, err, out) + } + return strings.Trim(string(out), "\n") + } + argv = append(argv, getPathFile("crtcxa.o")) + argv = append(argv, getPathFile("crtdbase.o")) + } if ctxt.linkShared { seenDirs := make(map[string]bool) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index e32f9e7110..5c590608e3 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -164,7 +164,7 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) { // onlycsymbol reports whether this is a symbol that is referenced by C code. func onlycsymbol(s *sym.Symbol) bool { switch s.Name { - case "_cgo_topofstack", "_cgo_panic", "crosscall2": + case "_cgo_topofstack", "__cgo_topofstack", "_cgo_panic", "crosscall2": return true } if strings.HasPrefix(s.Name, "_cgoexp_") { diff --git a/src/cmd/link/internal/ld/xcoff.go b/src/cmd/link/internal/ld/xcoff.go index f4422ff023..7fcd8a3c97 100644 --- a/src/cmd/link/internal/ld/xcoff.go +++ b/src/cmd/link/internal/ld/xcoff.go @@ -1218,9 +1218,9 @@ func (ctxt *Link) doxcoff() { } if ctxt.LinkMode == LinkExternal { - // Change main name to match __start code. - main := ctxt.Syms.ROLookup("_main", 0) - main.Name = ".main" + // Change rt0_go name to match name in runtime/cgo:main(). + rt0 := ctxt.Syms.ROLookup("runtime.rt0_go", 0) + ctxt.Syms.Rename(rt0.Name, "runtime_rt0_go", 0, ctxt.Reachparent) for _, s := range ctxt.Syms.Allsym { if !s.Attr.CgoExport() { diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index 9ac83e5590..d7fc66bda1 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -113,6 +113,7 @@ TEXT runtime·breakpoint(SB),NOSPLIT|NOFRAME,$0-0 TEXT runtime·asminit(SB),NOSPLIT|NOFRAME,$0-0 RET +// Any changes must be reflected to runtime/cgo/gcc_aix_ppc64.S:.crosscall_ppc64 TEXT _cgo_reginit(SB),NOSPLIT|NOFRAME,$0-0 // crosscall_ppc64 and crosscall2 need to reginit, but can't // get at the 'runtime.reginit' symbol. @@ -847,7 +848,13 @@ TEXT runtime·return0(SB), NOSPLIT, $0 // Called from cgo wrappers, this function returns g->m->curg.stack.hi. // Must obey the gcc calling convention. +#ifdef GOOS_aix +// On AIX, _cgo_topofstack is defined in runtime/cgo, because it must +// be a longcall in order to prevent trampolines from ld. +TEXT __cgo_topofstack(SB),NOSPLIT|NOFRAME,$0 +#else TEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0 +#endif // g (R30) and R31 are callee-save in the C ABI, so save them MOVD g, R4 MOVD R31, R5 diff --git a/src/runtime/cgo/callbacks_aix.go b/src/runtime/cgo/callbacks_aix.go new file mode 100644 index 0000000000..26654931da --- /dev/null +++ b/src/runtime/cgo/callbacks_aix.go @@ -0,0 +1,10 @@ +// Copyright 2019 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 cgo + +// These functions must be exported in order to perform +// longcall on cgo programs (cf gcc_aix_ppc64.c). +// go:cgo_export_static __cgo_topofstack +// go:cgo_export_static runtime.rt0_go diff --git a/src/runtime/cgo/gcc_aix_ppc64.S b/src/runtime/cgo/gcc_aix_ppc64.S index bff6dd1999..a00fae24d2 100644 --- a/src/runtime/cgo/gcc_aix_ppc64.S +++ b/src/runtime/cgo/gcc_aix_ppc64.S @@ -31,8 +31,8 @@ crosscall_ppc64: stdu 1, -296(1) // Set up Go ABI constant registers - bl ._cgo_reginit - nop + // Must match _cgo_reginit in runtime package. + xor 0, 0, 0 // Restore g pointer (r30 in Go ABI, which may have been clobbered by C) mr 30, 4 diff --git a/src/runtime/cgo/gcc_aix_ppc64.c b/src/runtime/cgo/gcc_aix_ppc64.c new file mode 100644 index 0000000000..d54c0ff32d --- /dev/null +++ b/src/runtime/cgo/gcc_aix_ppc64.c @@ -0,0 +1,22 @@ +// Copyright 2019 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. + +// +build aix +// +build ppc64 ppc64le + +/* + * On AIX, call to _cgo_topofstack and Go main are forced to be a longcall. + * Without it, ld might add trampolines in the middle of .text section + * to reach these functions which are normally declared in runtime package. + */ +extern int __attribute__((longcall)) __cgo_topofstack(void); +extern int __attribute__((longcall)) runtime_rt0_go(int argc, char **argv); + +int _cgo_topofstack(void) { + return __cgo_topofstack(); +} + +int main(int argc, char **argv) { + return runtime_rt0_go(argc, argv); +} -- GitLab From ca4314d39efd5f9dfa12b2eff7a945d9ead0b69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 27 Feb 2019 15:44:43 +0100 Subject: [PATCH 0505/1679] net: allow build on aix/ppc64 with cgo This commit adds C support for net package for aix/ppc64. Change-Id: I704710991fc013c6ec3511671def6791df4854f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/164038 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Mikio Hara --- src/net/cgo_aix.go | 24 ++++++++++++++++++++++++ src/net/cgo_sockold.go | 2 +- src/net/cgo_unix.go | 7 ++++++- src/net/cgo_unix_test.go | 2 +- 4 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 src/net/cgo_aix.go diff --git a/src/net/cgo_aix.go b/src/net/cgo_aix.go new file mode 100644 index 0000000000..d0ad414a32 --- /dev/null +++ b/src/net/cgo_aix.go @@ -0,0 +1,24 @@ +// Copyright 2019 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. + +// +build cgo,!netgo + +package net + +/* +#include +#include + +#include +*/ +import "C" + +import "unsafe" + +const cgoAddrInfoFlags = C.AI_CANONNAME + +func cgoNameinfoPTR(b []byte, sa *C.struct_sockaddr, salen C.socklen_t) (int, error) { + gerrno, err := C.getnameinfo(sa, C.size_t(salen), (*C.char)(unsafe.Pointer(&b[0])), C.size_t(len(b)), nil, 0, C.NI_NAMEREQD) + return int(gerrno), err +} diff --git a/src/net/cgo_sockold.go b/src/net/cgo_sockold.go index e629a09f9c..e1e642bb41 100644 --- a/src/net/cgo_sockold.go +++ b/src/net/cgo_sockold.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo,!netgo -// +build darwin dragonfly freebsd netbsd openbsd +// +build aix darwin dragonfly freebsd netbsd openbsd package net diff --git a/src/net/cgo_unix.go b/src/net/cgo_unix.go index b7cbcfe77a..6420fd05e7 100644 --- a/src/net/cgo_unix.go +++ b/src/net/cgo_unix.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo,!netgo -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package net @@ -14,6 +14,11 @@ package net #include #include #include + +// If nothing else defined EAI_OVERFLOW, make sure it has a value. +#ifndef EAI_OVERFLOW +#define EAI_OVERFLOW -12 +#endif */ import "C" diff --git a/src/net/cgo_unix_test.go b/src/net/cgo_unix_test.go index c3eab5b3b2..99d79a60c4 100644 --- a/src/net/cgo_unix_test.go +++ b/src/net/cgo_unix_test.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // +build cgo,!netgo -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package net -- GitLab From b3cfb0b3228ada12eaea404784739f51e1671652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 27 Feb 2019 15:45:18 +0100 Subject: [PATCH 0506/1679] os/user: allow build on aix/ppc64 with cgo This commit adds C support for os/user package for aix/ppc64. Updates #30563 Change-Id: Id07646998a7243b1335b85b5d4fe5bc4114e2a88 Reviewed-on: https://go-review.googlesource.com/c/go/+/164039 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/user/listgroups_aix.go | 13 +++++++++++++ src/os/user/user_test.go | 3 +++ 2 files changed, 16 insertions(+) create mode 100644 src/os/user/listgroups_aix.go diff --git a/src/os/user/listgroups_aix.go b/src/os/user/listgroups_aix.go new file mode 100644 index 0000000000..17de3e98d4 --- /dev/null +++ b/src/os/user/listgroups_aix.go @@ -0,0 +1,13 @@ +// Copyright 2019 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. + +// +build cgo,!osusergo + +package user + +import "fmt" + +func listGroups(u *User) ([]string, error) { + return nil, fmt.Errorf("user: list groups for %s: not supported on AIX", u.Username) +} diff --git a/src/os/user/user_test.go b/src/os/user/user_test.go index 2563077eb2..eeb24dd0e0 100644 --- a/src/os/user/user_test.go +++ b/src/os/user/user_test.go @@ -129,6 +129,9 @@ func TestLookupGroup(t *testing.T) { func TestGroupIds(t *testing.T) { checkGroup(t) + if runtime.GOOS == "aix" { + t.Skip("skipping GroupIds, see golang.org/issue/30563") + } if runtime.GOOS == "solaris" { t.Skip("skipping GroupIds, see golang.org/issue/14709") } -- GitLab From 66b264d2c1119ffefd7cd99def02b9f533651678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 20 Feb 2019 17:01:15 +0100 Subject: [PATCH 0507/1679] runtime: fix TestSigStackSwapping on aix/ppc64 This commit fixes TestSigStackSwapping by increasing the signal stack size. This is needed because SIGSTKSZ is too small when VMX is used on AIX. Change-Id: Ic2b5faa65745228d0768383b3d6ebd4b6f9f532c Reviewed-on: https://go-review.googlesource.com/c/go/+/164012 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/testdata/testprogcgo/sigstack.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/runtime/testdata/testprogcgo/sigstack.go b/src/runtime/testdata/testprogcgo/sigstack.go index 492dfeff7f..21b668d6c0 100644 --- a/src/runtime/testdata/testprogcgo/sigstack.go +++ b/src/runtime/testdata/testprogcgo/sigstack.go @@ -17,11 +17,18 @@ package main #include #include +#ifdef _AIX +// On AIX, SIGSTKSZ is too small to handle Go sighandler. +#define CSIGSTKSZ 0x4000 +#else +#define CSIGSTKSZ SIGSTKSZ +#endif + extern void SigStackCallback(); static void* WithSigStack(void* arg __attribute__((unused))) { // Set up an alternate system stack. - void* base = mmap(0, SIGSTKSZ, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); + void* base = mmap(0, CSIGSTKSZ, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); if (base == MAP_FAILED) { perror("mmap failed"); abort(); @@ -29,7 +36,7 @@ static void* WithSigStack(void* arg __attribute__((unused))) { stack_t st = {}, ost = {}; st.ss_sp = (char*)base; st.ss_flags = 0; - st.ss_size = SIGSTKSZ; + st.ss_size = CSIGSTKSZ; if (sigaltstack(&st, &ost) < 0) { perror("sigaltstack failed"); abort(); @@ -42,13 +49,13 @@ static void* WithSigStack(void* arg __attribute__((unused))) { if (ost.ss_flags & SS_DISABLE) { // Darwin libsystem has a bug where it checks ss_size // even if SS_DISABLE is set. (The kernel gets it right.) - ost.ss_size = SIGSTKSZ; + ost.ss_size = CSIGSTKSZ; } if (sigaltstack(&ost, NULL) < 0) { perror("sigaltstack restore failed"); abort(); } - mprotect(base, SIGSTKSZ, PROT_NONE); + mprotect(base, CSIGSTKSZ, PROT_NONE); return NULL; } -- GitLab From 6f7bb2cab6c9ac6b6ec530a87ffc854d19335a15 Mon Sep 17 00:00:00 2001 From: Michael Darakananda Date: Fri, 24 Aug 2018 00:27:35 -0700 Subject: [PATCH 0508/1679] time: optimize Sub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is primarily achieved by checking for arithmetic overflow instead of using Add and Equal. It's a decent performance improvement even though the function still isn't inlined. name old time/op new time/op delta Sub-6 242ns ± 0% 122ns ± 0% -49.59% (p=0.002 n=8+10) Updates #17858. Change-Id: I1469b618183c83ea8ea54d5ce277eb15f2ec0f11 Reviewed-on: https://go-review.googlesource.com/c/go/+/131196 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/time/time.go | 33 +++++++++++++++++++++++++-------- src/time/time_test.go | 10 +++++++++- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/time/time.go b/src/time/time.go index aacde0db2c..d9938861ac 100644 --- a/src/time/time.go +++ b/src/time/time.go @@ -906,16 +906,33 @@ func (t Time) Sub(u Time) Duration { } return d } - d := Duration(t.sec()-u.sec())*Second + Duration(t.nsec()-u.nsec()) - // Check for overflow or underflow. - switch { - case u.Add(d).Equal(t): - return d // d is correct - case t.Before(u): + + ts, us := t.sec(), u.sec() + + var sec, nsec, d int64 + + ssub := ts - us + if (ssub < ts) != (us > 0) { + goto overflow + } + + if ssub < int64(minDuration/Second) || ssub > int64(maxDuration/Second) { + goto overflow + } + sec = ssub * int64(Second) + + nsec = int64(t.nsec() - u.nsec()) + d = sec + nsec + if (d > sec) != (nsec > 0) { + goto overflow + } + return Duration(d) + +overflow: + if t.Before(u) { return minDuration // t - u is negative out of range - default: - return maxDuration // t - u is positive out of range } + return maxDuration // t - u is positive out of range } // Since returns the time elapsed since t. diff --git a/src/time/time_test.go b/src/time/time_test.go index 0ac3c3a27f..dd3a8160cd 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -690,7 +690,7 @@ var gobTests = []Time{ Date(0, 1, 2, 3, 4, 5, 6, UTC), Date(7, 8, 9, 10, 11, 12, 13, FixedZone("", 0)), Unix(81985467080890095, 0x76543210), // Time.sec: 0x0123456789ABCDEF - {}, // nil location + {}, // nil location Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", 32767*60)), Date(1, 2, 3, 4, 5, 6, 7, FixedZone("", -32768*60)), } @@ -1008,6 +1008,14 @@ func TestSub(t *testing.T) { } } +func BenchmarkSub(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, st := range subTests { + st.t.Sub(st.u) + } + } +} + var nsDurationTests = []struct { d Duration want int64 -- GitLab From 205d62d58b16afbb4e6232a0591e3e8f4153a591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:14:46 +0100 Subject: [PATCH 0509/1679] runtime: disable pprof test with cgo on aix/ppc64 This commit disables new cgo pprof tests and adds an handler in sigtramp to refuse SIGPROF signal. Updates #28555 Change-Id: I152a871f8636e93328d411329104c6f023bd1691 Reviewed-on: https://go-review.googlesource.com/c/go/+/164013 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/crash_cgo_test.go | 3 +++ src/runtime/pprof/proto_test.go | 4 ++++ src/runtime/sys_aix_ppc64.s | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index c1dd757797..e0c8955e7d 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -229,6 +229,9 @@ func TestCgoPanicDeadlock(t *testing.T) { } func TestCgoCCodeSIGPROF(t *testing.T) { + if runtime.GOOS == "aix" { + t.Skip("pprof not yet available on AIX (see golang.org/issue/28555)") + } t.Parallel() got := runTestProg(t, "testprogcgo", "CgoCCodeSIGPROF") want := "OK\n" diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index 4452d51231..cb38150da8 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -312,6 +312,10 @@ func TestMapping(t *testing.T) { testenv.MustHaveGoRun(t) testenv.MustHaveCGO(t) + if runtime.GOOS == "aix" { + t.Skip("pprof not yet available on AIX (see golang.org/issue/28555)") + } + prog := "./testdata/mappingtest/main.go" // GoOnly includes only Go symbols that runtime will symbolize. diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index d691b76cc7..d9e97ac8b7 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -109,6 +109,9 @@ TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 BL runtime·load_g(SB) + CMP $0, g + BEQ sigtrampnog // g == nil + // Save m->libcall. We need to do this because we // might get interrupted by a signal in runtime·asmcgocall. @@ -155,6 +158,7 @@ TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 MOVD 120(R1), R8 MOVD R8, 0(R7) +exit: // restore registers MOVD 56(R1),R31 MOVD 64(R1),g @@ -166,6 +170,19 @@ TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 MOVD R0, LR BR (LR) +sigtrampnog: + // Signal arrived on a non-Go thread. + // SIGPROF handler is not yet available so simply call badsignal, + // after having created *sigctxt. + MOVD R4, 80(R1) + MOVD R5, 88(R1) + MOVD R1, R4 + ADD $80, R4 + MOVD R4, FIXED_FRAME+8(R1) + MOVD R3, FIXED_FRAME+0(R1) + BL runtime·badsignal(SB) + JMP exit + // runtime.tstart is a function descriptor to the real tstart. DATA runtime·tstart+0(SB)/8, $runtime·_tstart(SB) DATA runtime·tstart+8(SB)/8, $TOC(SB) -- GitLab From d227a0811b76791fad04eeba35cf2794a719d610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C3=A8i=20C=C5=8Dngru=C3=AC?= Date: Mon, 4 Mar 2019 10:07:07 +0000 Subject: [PATCH 0510/1679] internal/poll, os: cancel pending I/O when closing pipes on Windows When closing a pipe, use CancelIoEx to cancel pending I/O. This makes concurrent Read and Write calls return os.ErrClosed. This change also enables some pipe tests on Windows. Fixes #28477 Fixes #25835 Change-Id: If52bb7d80895763488a61632e4682a78336e8420 Reviewed-on: https://go-review.googlesource.com/c/go/+/164721 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/fd_windows.go | 18 ++++++++++++++++ src/internal/poll/sendfile_windows.go | 8 ++----- src/os/file_windows.go | 5 ++++- src/os/pipe_test.go | 30 ++++++++++++++++++++------- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index f666b061e2..92bab5f9dd 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -342,6 +342,7 @@ const ( kindFile kindConsole kindDir + kindPipe ) // logInitFD is set by tests to enable file descriptor initialization logging. @@ -364,6 +365,8 @@ func (fd *FD) Init(net string, pollable bool) (string, error) { fd.kind = kindConsole case "dir": fd.kind = kindDir + case "pipe": + fd.kind = kindPipe case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6", "ip", "ip4", "ip6", @@ -461,6 +464,9 @@ func (fd *FD) Close() error { if !fd.fdmu.increfAndClose() { return errClosing(fd.isFile) } + if fd.kind == kindPipe { + syscall.CancelIoEx(fd.Sysfd, nil) + } // unblock pending reader and writer fd.pd.evict() err := fd.decref() @@ -505,6 +511,12 @@ func (fd *FD) Read(buf []byte) (int, error) { n, err = fd.readConsole(buf) default: n, err = syscall.Read(fd.Sysfd, buf) + if fd.kind == kindPipe && err == syscall.ERROR_OPERATION_ABORTED { + // Close uses CancelIoEx to interrupt concurrent I/O for pipes. + // If the fd is a pipe and the Read was interrupted by CancelIoEx, + // we assume it is interrupted by Close. + err = ErrFileClosing + } } if err != nil { n = 0 @@ -692,6 +704,12 @@ func (fd *FD) Write(buf []byte) (int, error) { n, err = fd.writeConsole(b) default: n, err = syscall.Write(fd.Sysfd, b) + if fd.kind == kindPipe && err == syscall.ERROR_OPERATION_ABORTED { + // Close uses CancelIoEx to interrupt concurrent I/O for pipes. + // If the fd is a pipe and the Write was interrupted by CancelIoEx, + // we assume it is interrupted by Close. + err = ErrFileClosing + } } if err != nil { n = 0 diff --git a/src/internal/poll/sendfile_windows.go b/src/internal/poll/sendfile_windows.go index 17a3681064..0fe9b9b420 100644 --- a/src/internal/poll/sendfile_windows.go +++ b/src/internal/poll/sendfile_windows.go @@ -8,12 +8,8 @@ import "syscall" // SendFile wraps the TransmitFile call. func SendFile(fd *FD, src syscall.Handle, n int64) (int64, error) { - ft, err := syscall.GetFileType(src) - if err != nil { - return 0, err - } - // TransmitFile does not work with pipes - if ft == syscall.FILE_TYPE_PIPE { + if fd.kind == kindPipe { + // TransmitFile does not work with pipes return 0, syscall.ESPIPE } diff --git a/src/os/file_windows.go b/src/os/file_windows.go index b0206d9200..f311ae11d9 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -42,6 +42,9 @@ func newFile(h syscall.Handle, name string, kind string) *File { if syscall.GetConsoleMode(h, &m) == nil { kind = "console" } + if t, err := syscall.GetFileType(h); err == nil && t == syscall.FILE_TYPE_PIPE { + kind = "pipe" + } } f := &File{&file{ @@ -315,7 +318,7 @@ func Pipe() (r *File, w *File, err error) { if e != nil { return nil, nil, NewSyscallError("pipe", e) } - return newFile(p[0], "|0", "file"), newFile(p[1], "|1", "file"), nil + return newFile(p[0], "|0", "pipe"), newFile(p[1], "|1", "pipe"), nil } func tempDir() string { diff --git a/src/os/pipe_test.go b/src/os/pipe_test.go index 779b2bdf85..4c53bc985d 100644 --- a/src/os/pipe_test.go +++ b/src/os/pipe_test.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Test broken pipes on Unix systems. -// +build !windows,!plan9,!nacl,!js +// +build !plan9,!nacl,!js package os_test @@ -35,6 +35,11 @@ func TestEPIPE(t *testing.T) { t.Fatal(err) } + expect := syscall.EPIPE + if runtime.GOOS == "windows" { + // 232 is Windows error code ERROR_NO_DATA, "The pipe is being closed". + expect = syscall.Errno(232) + } // Every time we write to the pipe we should get an EPIPE. for i := 0; i < 20; i++ { _, err = w.Write([]byte("hi")) @@ -47,13 +52,17 @@ func TestEPIPE(t *testing.T) { if se, ok := err.(*os.SyscallError); ok { err = se.Err } - if err != syscall.EPIPE { - t.Errorf("iteration %d: got %v, expected EPIPE", i, err) + if err != expect { + t.Errorf("iteration %d: got %v, expected %v", i, err, expect) } } } func TestStdPipe(t *testing.T) { + switch runtime.GOOS { + case "windows": + t.Skip("Windows doesn't support SIGPIPE") + } testenv.MustHaveExec(t) r, w, err := os.Pipe() if err != nil { @@ -195,8 +204,12 @@ func TestClosedPipeRaceWrite(t *testing.T) { // for unsupported file type." Currently it returns EAGAIN; it is // possible that in the future it will simply wait for data. func TestReadNonblockingFd(t *testing.T) { + switch runtime.GOOS { + case "windows": + t.Skip("Windows doesn't support SetNonblock") + } if os.Getenv("GO_WANT_READ_NONBLOCKING_FD") == "1" { - fd := int(os.Stdin.Fd()) + fd := syscallDescriptor(os.Stdin.Fd()) syscall.SetNonblock(fd, true) defer syscall.SetNonblock(fd, false) _, err := os.Stdin.Read(make([]byte, 1)) @@ -226,7 +239,7 @@ func TestReadNonblockingFd(t *testing.T) { } func TestCloseWithBlockingReadByNewFile(t *testing.T) { - var p [2]int + var p [2]syscallDescriptor err := syscall.Pipe(p[:]) if err != nil { t.Fatal(err) @@ -276,8 +289,11 @@ func testCloseWithBlockingRead(t *testing.T, r, w *os.File) { if err == nil { t.Error("I/O on closed pipe unexpectedly succeeded") } - if err != io.EOF { - t.Errorf("got %v, expected io.EOF", err) + if pe, ok := err.(*os.PathError); ok { + err = pe.Err + } + if err != io.EOF && err != os.ErrClosed { + t.Errorf("got %v, expected EOF or closed", err) } }(c2) -- GitLab From d24d25b4e43badc38539b563f5264b341ccf3746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:45:40 +0100 Subject: [PATCH 0511/1679] runtime: enable external linker tests for aix/ppc64 Change-Id: Icc42843adb15c2aba1cfea854fad049c6704344b Reviewed-on: https://go-review.googlesource.com/c/go/+/164014 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/crash_cgo_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index e0c8955e7d..07eba78c8a 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -90,9 +90,9 @@ func TestCgoExternalThreadSIGPROF(t *testing.T) { case "plan9", "windows": t.Skipf("no pthreads on %s", runtime.GOOS) } - if runtime.GOARCH == "ppc64" { + if runtime.GOARCH == "ppc64" && runtime.GOOS == "linux" { // TODO(austin) External linking not implemented on - // ppc64 (issue #8912) + // linux/ppc64 (issue #8912) t.Skipf("no external linking on ppc64") } -- GitLab From 451a2eb0abf38874fb144963a44356495141465d Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Fri, 15 Mar 2019 05:10:08 +0900 Subject: [PATCH 0512/1679] runtime, internal/poll: report only critical event scanning error This change makes the runtime-integrated network poller report only critical event scanning errors. In the previous attempt, CL 166497, we treated any combination of error events as event scanning errors and it caused false positives in event waiters because platform-dependent event notification mechanisms allow event originators to use various combination of events. To avoid false positives, this change makes the poller treat an individual error event as a critical event scanning error by the convention of event notification mechanism implementations. Updates #30624. Fixes #30817. Fixes #30840. Change-Id: I906c9e83864527ff73f636fd02bab854d54684ea Reviewed-on: https://go-review.googlesource.com/c/go/+/167777 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/error_test.go | 6 ++++ src/internal/poll/read_test.go | 62 +++++++++++++++++++++++++++++++++ src/runtime/netpoll_aix.go | 2 +- src/runtime/netpoll_epoll.go | 2 +- src/runtime/netpoll_kqueue.go | 2 +- src/runtime/netpoll_solaris.go | 2 +- 6 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/internal/poll/read_test.go diff --git a/src/internal/poll/error_test.go b/src/internal/poll/error_test.go index 89c6e384c5..06b96f635a 100644 --- a/src/internal/poll/error_test.go +++ b/src/internal/poll/error_test.go @@ -9,6 +9,7 @@ import ( "net" "os" "testing" + "time" ) func TestReadError(t *testing.T) { @@ -18,6 +19,11 @@ func TestReadError(t *testing.T) { t.Skip(err) } defer f.Close() + + // Give scheduler a chance to have two separated + // goroutines: an event poller and an event waiter. + time.Sleep(100 * time.Millisecond) + var b [1]byte _, err = f.Read(b[:]) if perr := parseReadError(err, isBadStateFileError); perr != nil { diff --git a/src/internal/poll/read_test.go b/src/internal/poll/read_test.go new file mode 100644 index 0000000000..b4f5236d3e --- /dev/null +++ b/src/internal/poll/read_test.go @@ -0,0 +1,62 @@ +// Copyright 2019 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 poll_test + +import ( + "io/ioutil" + "os" + "runtime" + "sync" + "testing" + "time" +) + +func TestRead(t *testing.T) { + t.Run("SpecialFile", func(t *testing.T) { + var wg sync.WaitGroup + for _, p := range specialFiles() { + for i := 0; i < 4; i++ { + wg.Add(1) + go func(p string) { + defer wg.Done() + for i := 0; i < 100; i++ { + if _, err := ioutil.ReadFile(p); err != nil { + t.Error(err) + return + } + time.Sleep(time.Nanosecond) + } + }(p) + } + } + wg.Wait() + }) +} + +func specialFiles() []string { + var ps []string + switch runtime.GOOS { + case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd": + ps = []string{ + "/dev/null", + } + case "linux": + ps = []string{ + "/dev/null", + "/proc/stat", + "/sys/devices/system/cpu/online", + } + } + nps := ps[:0] + for _, p := range ps { + f, err := os.Open(p) + if err != nil { + continue + } + f.Close() + nps = append(nps, p) + } + return nps +} diff --git a/src/runtime/netpoll_aix.go b/src/runtime/netpoll_aix.go index b4d7de8c2a..0ad8718fe0 100644 --- a/src/runtime/netpoll_aix.go +++ b/src/runtime/netpoll_aix.go @@ -233,7 +233,7 @@ retry: println("*** netpollready i=", i, "revents=", pfd.revents, "events=", pfd.events, "pd=", pds[i]) } pds[i].everr = false - if pfd.revents&_POLLERR != 0 { + if pfd.revents == _POLLERR { pds[i].everr = true } netpollready(&toRun, pds[i], mode) diff --git a/src/runtime/netpoll_epoll.go b/src/runtime/netpoll_epoll.go index 7dc8301acd..8f49309865 100644 --- a/src/runtime/netpoll_epoll.go +++ b/src/runtime/netpoll_epoll.go @@ -92,7 +92,7 @@ retry: if mode != 0 { pd := *(**pollDesc)(unsafe.Pointer(&ev.data)) pd.everr = false - if ev.events&_EPOLLERR != 0 { + if ev.events == _EPOLLERR { pd.everr = true } netpollready(&toRun, pd, mode) diff --git a/src/runtime/netpoll_kqueue.go b/src/runtime/netpoll_kqueue.go index 1de484978a..a8880e82a5 100644 --- a/src/runtime/netpoll_kqueue.go +++ b/src/runtime/netpoll_kqueue.go @@ -104,7 +104,7 @@ retry: if mode != 0 { pd := (*pollDesc)(unsafe.Pointer(ev.udata)) pd.everr = false - if ev.flags&_EV_ERROR != 0 { + if ev.flags == _EV_ERROR { pd.everr = true } netpollready(&toRun, pd, mode) diff --git a/src/runtime/netpoll_solaris.go b/src/runtime/netpoll_solaris.go index 7ae8a2aba1..b4bb40ed9b 100644 --- a/src/runtime/netpoll_solaris.go +++ b/src/runtime/netpoll_solaris.go @@ -234,7 +234,7 @@ retry: if mode != 0 { pd.everr = false - if ev.portev_events&_POLLERR != 0 { + if ev.portev_events == _POLLERR { pd.everr = true } netpollready(&toRun, pd, mode) -- GitLab From bf103723f829b206bd24e4cf3c4306c4232b6fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:46:47 +0100 Subject: [PATCH 0513/1679] runtime: fix sigfwd for aix/ppc64 This commit fixes runtime.sigfwd for aix/ppc64. fn is a function descriptor and not a function. R2 must be saved and restored. Change-Id: Ie506b0bdde562ca37202d19973ba1d537c3d64e2 Reviewed-on: https://go-review.googlesource.com/c/go/+/164015 Reviewed-by: Ian Lance Taylor --- src/runtime/sys_aix_ppc64.s | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index d9e97ac8b7..ee572cb4de 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -77,8 +77,15 @@ TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 MOVD info+16(FP), R4 MOVD ctx+24(FP), R5 MOVD fn+0(FP), R12 - MOVD R12, CTR + // fn is a function descriptor + // R2 must be saved on restore + MOVD 0(R12), R0 + MOVD R2, 40(R1) + MOVD 8(R12), R2 + MOVD R0, CTR BL (CTR) + MOVD 40(R1), R2 + BL runtime·reginit(SB) RET -- GitLab From b2453c058839683cafd8a77600f2cee29cc3c668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Tue, 19 Mar 2019 14:00:03 +0100 Subject: [PATCH 0514/1679] runtime/cgo: correct cgo_export directives in callbacks_aix.go This commit removes spaces which were wrongly added in //go:cgo_export_static during CL 164010. Change-Id: Iadd18efdde9ff32e907d793a72ef0f9efda35fe6 Reviewed-on: https://go-review.googlesource.com/c/go/+/168317 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/cgo/callbacks_aix.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/cgo/callbacks_aix.go b/src/runtime/cgo/callbacks_aix.go index 26654931da..7dafb6b310 100644 --- a/src/runtime/cgo/callbacks_aix.go +++ b/src/runtime/cgo/callbacks_aix.go @@ -6,5 +6,5 @@ package cgo // These functions must be exported in order to perform // longcall on cgo programs (cf gcc_aix_ppc64.c). -// go:cgo_export_static __cgo_topofstack -// go:cgo_export_static runtime.rt0_go +//go:cgo_export_static __cgo_topofstack +//go:cgo_export_static runtime.rt0_go -- GitLab From faa7fa03b1e694258d40f8f62076dd96843b861e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:49:22 +0100 Subject: [PATCH 0515/1679] cmd/internal/goobj: add XCOFF support to TestParseCGOArchive Change-Id: I9d14142977b4f2e8cb7ed33582249d0448bae023 Reviewed-on: https://go-review.googlesource.com/c/go/+/164016 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/internal/goobj/goobj_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/cmd/internal/goobj/goobj_test.go b/src/cmd/internal/goobj/goobj_test.go index 840b45c908..4a4d35a413 100644 --- a/src/cmd/internal/goobj/goobj_test.go +++ b/src/cmd/internal/goobj/goobj_test.go @@ -10,6 +10,7 @@ import ( "debug/pe" "fmt" "internal/testenv" + "internal/xcoff" "io" "io/ioutil" "os" @@ -292,6 +293,24 @@ func TestParseCGOArchive(t *testing.T) { } } } + case "aix": + c1 = "." + c1 + c2 = "." + c2 + for _, obj := range p.Native { + xf, err := xcoff.NewFile(obj) + if err != nil { + t.Fatal(err) + } + for _, s := range xf.Symbols { + switch s.Name { + case c1: + found1 = true + case c2: + found2 = true + } + } + } + default: for _, obj := range p.Native { ef, err := elf.NewFile(obj) -- GitLab From d34548e0b6acc14a99bc6ffc225eedbb56e03d60 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 18 Mar 2019 18:35:44 -0400 Subject: [PATCH 0516/1679] cmd/go: avoid link error when -coverpkg covers main packages (more) This fixes two problems missed in CL 164877. First, p.Internal.BuildInfo is now part of the cache key. This is important since p.Internal.BuildInfo causes the build action to synthesize a new source file, which affects the output. Second, recompileForTest is always called for test packages. Previously, it was only called when there were internal test sources, so the fix in CL 164877 did not apply to packages that only had external tests. Fixes #30374 Change-Id: Iac2d7e8914f0313f9ab4222299a866f67889eb2e Reviewed-on: https://go-review.googlesource.com/c/go/+/168200 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/load/test.go | 23 ++++++++------- src/cmd/go/internal/work/exec.go | 1 + .../script/cover_pkgall_multiple_mains.txt | 28 +++++++++++-------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index 5142b16e06..c8e0b3f5f6 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -292,17 +292,8 @@ func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest * pmain.Imports = pmain.Imports[:w] pmain.Internal.RawImports = str.StringList(pmain.Imports) - if ptest != p { - // We have made modifications to the package p being tested - // and are rebuilding p (as ptest). - // Arrange to rebuild all packages q such that - // the test depends on q and q depends on p. - // This makes sure that q sees the modifications to p. - // Strictly speaking, the rebuild is only necessary if the - // modifications to p change its export metadata, but - // determining that is a bit tricky, so we rebuild always. - recompileForTest(pmain, p, ptest, pxtest) - } + // Replace pmain's transitive dependencies with test copies, as necessary. + recompileForTest(pmain, p, ptest, pxtest) // Should we apply coverage analysis locally, // only for this package and only for this test? @@ -351,6 +342,14 @@ Search: return stk } +// recompileForTest copies and replaces certain packages in pmain's dependency +// graph. This is necessary for two reasons. First, if ptest is different than +// preal, packages that import the package under test should get ptest instead +// of preal. This is particularly important if pxtest depends on functionality +// exposed in test sources in ptest. Second, if there is a main package +// (other than pmain) anywhere, we need to clear p.Internal.BuildInfo in +// the test copy to prevent link conflicts. This may happen if both -coverpkg +// and the command line patterns include multiple main packages. func recompileForTest(pmain, preal, ptest, pxtest *Package) { // The "test copy" of preal is ptest. // For each package that depends on preal, make a "test copy" @@ -393,7 +392,7 @@ func recompileForTest(pmain, preal, ptest, pxtest *Package) { // Don't compile build info from a main package. This can happen // if -coverpkg patterns include main packages, since those packages - // are imported by pmain. + // are imported by pmain. See golang.org/issue/30907. if p.Internal.BuildInfo != "" && p != pmain { split() } diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 0e10f2c926..14d13f83d3 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -213,6 +213,7 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID { if p.Internal.CoverMode != "" { fmt.Fprintf(h, "cover %q %q\n", p.Internal.CoverMode, b.toolID("cover")) } + fmt.Fprintf(h, "modinfo %q\n", p.Internal.BuildInfo) // Configuration specific to compiler toolchain. switch cfg.BuildToolchainName { diff --git a/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt b/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt index 8ee4848d0a..ab7cd66949 100644 --- a/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt +++ b/src/cmd/go/testdata/script/cover_pkgall_multiple_mains.txt @@ -6,32 +6,38 @@ env GO111MODULE=on [short] skip -go test -coverpkg=all ./main1 ./main2 +go test -coverpkg=all ./... -- go.mod -- module example.com/cov --- main1/main1.go -- +-- mainonly/mainonly.go -- package main func main() {} --- main1/main1_test.go -- +-- mainwithtest/mainwithtest.go -- package main -import "testing" +func main() {} -func TestMain1(t *testing.T) {} +func Foo() {} --- main2/main2.go -- +-- mainwithtest/mainwithtest_test.go -- package main -func main() {} +import "testing" --- main2/main2_test.go -- -package main +func TestFoo(t *testing.T) { + Foo() +} -import "testing" +-- xtest/x.go -- +package x -func TestMain2(t *testing.T) {} +-- xtest/x_test.go -- +package x_test + +import "testing" +func TestX(t *testing.T) {} -- GitLab From 72954ebcfdeb5354e43ed781061d46e48137bfc0 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 19 Mar 2019 06:51:14 -0700 Subject: [PATCH 0517/1679] cmd/cgo: accept __uint8_t as the uint8_t type This works around the NetBSD which defines the type using "#define" rather than typedef. Fixes #30918 Updates #29878 Change-Id: I8998eba52139366ae46762bdad5fcae85f9b4027 Reviewed-on: https://go-review.googlesource.com/c/go/+/168337 Reviewed-by: Benny Siegert Reviewed-by: Tobias Klauser Reviewed-by: Brad Fitzpatrick Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot --- src/cmd/cgo/gcc.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 3932489093..941f1db832 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -2483,7 +2483,9 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { // representation. if exactWidthIntegerType.MatchString(dt.Name) { sub := c.Type(dt.Type, pos) - u := c.exactWidthIntegerTypes[strings.TrimSuffix(dt.Name, "_t")] + goname := strings.TrimPrefix(dt.Name, "__") + goname = strings.TrimSuffix(goname, "_t") + u := c.exactWidthIntegerTypes[goname] if sub.Size != u.Size { fatalf("%s: unexpected size: %d vs. %d – %s", lineno(pos), sub.Size, u.Size, dtype) } @@ -2630,7 +2632,7 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { return t } -var exactWidthIntegerType = regexp.MustCompile(`^u?int(8|16|32|64)_t$`) +var exactWidthIntegerType = regexp.MustCompile(`^(__)?u?int(8|16|32|64)_t$`) // isStructUnionClass reports whether the type described by the Go syntax x // is a struct, union, or class with a tag. -- GitLab From b4f3b8a313a81105d923d2b7ed0b8b7524084b63 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 19 Mar 2019 15:52:10 +0200 Subject: [PATCH 0518/1679] cmd/go/internal/work: whitelist tvOS and watchOS compiler flags Updates #22395 Change-Id: I6c207934b32d38374875f756c4f8c6dfe38d8cb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/168318 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/security.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go index e3d85e29c1..9e26ab8353 100644 --- a/src/cmd/go/internal/work/security.go +++ b/src/cmd/go/internal/work/security.go @@ -101,6 +101,10 @@ var validCompilerFlags = []*lazyregexp.Regexp{ re(`-mmacosx-(.+)`), re(`-mios-simulator-version-min=(.+)`), re(`-miphoneos-version-min=(.+)`), + re(`-mtvos-simulator-version-min=(.+)`), + re(`-mtvos-version-min=(.+)`), + re(`-mwatchos-simulator-version-min=(.+)`), + re(`-mwatchos-version-min=(.+)`), re(`-mnop-fun-dllimport`), re(`-m(no-)?sse[0-9.]*`), re(`-m(no-)?ssse3`), -- GitLab From 349e7df2c3d0f9b5429e7c86121499c137faac7e Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Tue, 19 Mar 2019 16:16:50 +0700 Subject: [PATCH 0519/1679] net/http: fix wrong mime rar signature MIME sniffing standard defines the RAR signature as 52 61 72 20 1A 07 00. But this signature is wrong, the RARlab spec defines the 4th byte must be 0x21 or "!", not 0x20 or " ". Checking a rar file also indicates that: $ file abc.rar abc.rar: RAR archive data, v1d, os: Win32 $ head -c 7 abc.rar | od -v -t x1 0000000 52 61 72 21 1a 07 00 0000007 There is also an issue to fix this problem in MIME standard. See: - https://www.rarlab.com/technote.htm#rarsign - https://github.com/whatwg/mimesniff/issues/63 Fixes #30926 Change-Id: Id2e2de7ecbf7f44d37ebaf280efd05e4972c5078 Reviewed-on: https://go-review.googlesource.com/c/go/+/167781 Reviewed-by: Brad Fitzpatrick Reviewed-by: Emmanuel Odeke Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/sniff.go | 10 ++++++++-- src/net/http/sniff_test.go | 6 ++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/net/http/sniff.go b/src/net/http/sniff.go index 114a88ccba..67a7151b0c 100644 --- a/src/net/http/sniff.go +++ b/src/net/http/sniff.go @@ -185,8 +185,14 @@ var sniffSignatures = []sniffSig{ // Archive types &exactSig{[]byte("\x1F\x8B\x08"), "application/x-gzip"}, &exactSig{[]byte("PK\x03\x04"), "application/zip"}, - &exactSig{[]byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"}, // RAR v1.5-v4.0 - &exactSig{[]byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+ + // RAR's signatures are incorrectly defined by the MIME spec as per + // https://github.com/whatwg/mimesniff/issues/63 + // However, RAR Labs correctly defines it at: + // https://www.rarlab.com/technote.htm#rarsign + // so we use the definition from RAR Labs. + // TODO: do whatever the spec ends up doing. + &exactSig{[]byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"}, // RAR v1.5-v4.0 + &exactSig{[]byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"}, // RAR v5+ &exactSig{[]byte("\x00\x61\x73\x6D"), "application/wasm"}, diff --git a/src/net/http/sniff_test.go b/src/net/http/sniff_test.go index 08ae79c285..a1157a0823 100644 --- a/src/net/http/sniff_test.go +++ b/src/net/http/sniff_test.go @@ -74,8 +74,10 @@ var sniffTests = []struct { {"wasm sample", []byte("\x00\x61\x73\x6d\x01\x00"), "application/wasm"}, // Archive types - {"RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/x-rar-compressed"}, - {"RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/x-rar-compressed"}, + {"RAR v1.5-v4.0", []byte("Rar!\x1A\x07\x00"), "application/x-rar-compressed"}, + {"RAR v5+", []byte("Rar!\x1A\x07\x01\x00"), "application/x-rar-compressed"}, + {"Incorrect RAR v1.5-v4.0", []byte("Rar \x1A\x07\x00"), "application/octet-stream"}, + {"Incorrect RAR v5+", []byte("Rar \x1A\x07\x01\x00"), "application/octet-stream"}, } func TestDetectContentType(t *testing.T) { -- GitLab From 834d229eb6cec7d5b2c4b645985921266e645cb1 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 11 Mar 2019 10:27:11 -0400 Subject: [PATCH 0520/1679] testing: add B.ReportMetric for custom benchmark metrics This adds a ReportMetric method to testing.B that lets the user report custom benchmark metrics and override built-in metrics. Fixes #26037. Change-Id: I8236fbde3683fc27bbe45cbbedfd377b435edf64 Reviewed-on: https://go-review.googlesource.com/c/go/+/166717 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Josh Bleecher Snyder --- src/testing/benchmark.go | 134 +++++++++++++++++++++++++++++----- src/testing/benchmark_test.go | 63 ++++++++++++++++ src/testing/export_test.go | 1 + 3 files changed, 179 insertions(+), 19 deletions(-) diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 24bac313d2..73951767bd 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -8,13 +8,17 @@ import ( "flag" "fmt" "internal/race" + "io" + "math" "os" "runtime" + "sort" "strconv" "strings" "sync" "sync/atomic" "time" + "unicode" ) var matchBenchmarks = flag.String("test.bench", "", "run only benchmarks matching `regexp`") @@ -101,6 +105,8 @@ type B struct { // The net total of this test after being run. netAllocs uint64 netBytes uint64 + // Extra metrics collected by ReportMetric. + extra map[string]float64 } // StartTimer starts timing a test. This function is called automatically @@ -129,9 +135,19 @@ func (b *B) StopTimer() { } } -// ResetTimer zeros the elapsed benchmark time and memory allocation counters. +// ResetTimer zeros the elapsed benchmark time and memory allocation counters +// and deletes user-reported metrics. // It does not affect whether the timer is running. func (b *B) ResetTimer() { + if b.extra == nil { + // Allocate the extra map before reading memory stats. + // Pre-size it to make more allocation unlikely. + b.extra = make(map[string]float64, 16) + } else { + for k := range b.extra { + delete(b.extra, k) + } + } if b.timerOn { runtime.ReadMemStats(&memStats) b.startAllocs = memStats.Mallocs @@ -328,7 +344,26 @@ func (b *B) launch() { b.runN(n) } } - b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes} + b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes, b.extra} +} + +// ReportMetric adds "n unit" to the reported benchmark results. +// If the metric is per-iteration, the caller should divide by b.N, +// and by convention units should end in "/op". +// ReportMetric overrides any previously reported value for the same unit. +// ReportMetric panics if unit is the empty string or if unit contains +// any whitespace. +// If unit is a unit normally reported by the benchmark framework itself +// (such as "allocs/op"), ReportMetric will override that metric. +// Setting "ns/op" to 0 will suppress that built-in metric. +func (b *B) ReportMetric(n float64, unit string) { + if unit == "" { + panic("metric unit must not be empty") + } + if strings.IndexFunc(unit, unicode.IsSpace) >= 0 { + panic("metric unit must not contain whitespace") + } + b.extra[unit] = n } // The results of a benchmark run. @@ -338,56 +373,117 @@ type BenchmarkResult struct { Bytes int64 // Bytes processed in one iteration. MemAllocs uint64 // The total number of memory allocations. MemBytes uint64 // The total number of bytes allocated. + + // Extra records additional metrics reported by ReportMetric. + Extra map[string]float64 } +// NsPerOp returns the "ns/op" metric. func (r BenchmarkResult) NsPerOp() int64 { + if v, ok := r.Extra["ns/op"]; ok { + return int64(v) + } if r.N <= 0 { return 0 } return r.T.Nanoseconds() / int64(r.N) } +// mbPerSec returns the "MB/s" metric. func (r BenchmarkResult) mbPerSec() float64 { + if v, ok := r.Extra["MB/s"]; ok { + return v + } if r.Bytes <= 0 || r.T <= 0 || r.N <= 0 { return 0 } return (float64(r.Bytes) * float64(r.N) / 1e6) / r.T.Seconds() } -// AllocsPerOp returns r.MemAllocs / r.N. +// AllocsPerOp returns the "allocs/op" metric, +// which is calculated as r.MemAllocs / r.N. func (r BenchmarkResult) AllocsPerOp() int64 { + if v, ok := r.Extra["allocs/op"]; ok { + return int64(v) + } if r.N <= 0 { return 0 } return int64(r.MemAllocs) / int64(r.N) } -// AllocedBytesPerOp returns r.MemBytes / r.N. +// AllocedBytesPerOp returns the "B/op" metric, +// which is calculated as r.MemBytes / r.N. func (r BenchmarkResult) AllocedBytesPerOp() int64 { + if v, ok := r.Extra["B/op"]; ok { + return int64(v) + } if r.N <= 0 { return 0 } return int64(r.MemBytes) / int64(r.N) } +// String returns a summary of the benchmark results. +// It follows the benchmark result line format from +// https://golang.org/design/14313-benchmark-format, not including the +// benchmark name. +// Extra metrics override built-in metrics of the same name. +// String does not include allocs/op or B/op, since those are reported +// by MemString. func (r BenchmarkResult) String() string { - mbs := r.mbPerSec() - mb := "" - if mbs != 0 { - mb = fmt.Sprintf("\t%7.2f MB/s", mbs) - } - nsop := r.NsPerOp() - ns := fmt.Sprintf("%10d ns/op", nsop) - if r.N > 0 && nsop < 100 { - // The format specifiers here make sure that - // the ones digits line up for all three possible formats. - if nsop < 10 { - ns = fmt.Sprintf("%13.2f ns/op", float64(r.T.Nanoseconds())/float64(r.N)) - } else { - ns = fmt.Sprintf("%12.1f ns/op", float64(r.T.Nanoseconds())/float64(r.N)) + buf := new(strings.Builder) + fmt.Fprintf(buf, "%8d", r.N) + + if ns := r.NsPerOp(); ns != 0 { + buf.WriteByte('\t') + prettyPrint(buf, float64(ns), "ns/op") + } + + if mbs := r.mbPerSec(); mbs != 0 { + fmt.Fprintf(buf, "\t%7.2f MB/s", mbs) + } + + // Print extra metrics that aren't represented in the standard + // metrics. + var extraKeys []string + for k := range r.Extra { + switch k { + case "ns/op", "MB/s", "B/op", "allocs/op": + // Built-in metrics reported elsewhere. + continue } + extraKeys = append(extraKeys, k) + } + sort.Strings(extraKeys) + for _, k := range extraKeys { + buf.WriteByte('\t') + prettyPrint(buf, r.Extra[k], k) + } + return buf.String() +} + +func prettyPrint(w io.Writer, x float64, unit string) { + // Print all numbers with 10 places before the decimal point + // and small numbers with three sig figs. + var format string + switch y := math.Abs(x); { + case y == 0 || y >= 99.95: + format = "%10.0f %s" + case y >= 9.995: + format = "%12.1f %s" + case y >= 0.9995: + format = "%13.2f %s" + case y >= 0.09995: + format = "%14.3f %s" + case y >= 0.009995: + format = "%15.4f %s" + case y >= 0.0009995: + format = "%16.5f %s" + default: + format = "%17.6f %s" } - return fmt.Sprintf("%8d\t%s%s", r.N, ns, mb) + fmt.Fprintf(w, format, x, unit) } // MemString returns r.AllocedBytesPerOp and r.AllocsPerOp in the same format as 'go test'. diff --git a/src/testing/benchmark_test.go b/src/testing/benchmark_test.go index 431bb537bd..9e87f137f1 100644 --- a/src/testing/benchmark_test.go +++ b/src/testing/benchmark_test.go @@ -7,6 +7,8 @@ package testing_test import ( "bytes" "runtime" + "sort" + "strings" "sync/atomic" "testing" "text/template" @@ -63,6 +65,32 @@ func TestRoundUp(t *testing.T) { } } +var prettyPrintTests = []struct { + v float64 + expected string +}{ + {0, " 0 x"}, + {1234.1, " 1234 x"}, + {-1234.1, " -1234 x"}, + {99.950001, " 100 x"}, + {99.949999, " 99.9 x"}, + {9.9950001, " 10.0 x"}, + {9.9949999, " 9.99 x"}, + {-9.9949999, " -9.99 x"}, + {0.0099950001, " 0.0100 x"}, + {0.0099949999, " 0.00999 x"}, +} + +func TestPrettyPrint(t *testing.T) { + for _, tt := range prettyPrintTests { + buf := new(strings.Builder) + testing.PrettyPrint(buf, tt.v, "x") + if tt.expected != buf.String() { + t.Errorf("prettyPrint(%v): expected %q, actual %q", tt.v, tt.expected, buf.String()) + } + } +} + func TestRunParallel(t *testing.T) { testing.Benchmark(func(b *testing.B) { procs := uint32(0) @@ -111,3 +139,38 @@ func ExampleB_RunParallel() { }) }) } + +func TestReportMetric(t *testing.T) { + res := testing.Benchmark(func(b *testing.B) { + b.ReportMetric(12345, "ns/op") + b.ReportMetric(0.2, "frobs/op") + }) + // Test built-in overriding. + if res.NsPerOp() != 12345 { + t.Errorf("NsPerOp: expected %v, actual %v", 12345, res.NsPerOp()) + } + // Test stringing. + res.N = 1 // Make the output stable + want := " 1\t 12345 ns/op\t 0.200 frobs/op" + if want != res.String() { + t.Errorf("expected %q, actual %q", want, res.String()) + } +} + +func ExampleB_ReportMetric() { + // This reports a custom benchmark metric relevant to a + // specific algorithm (in this case, sorting). + testing.Benchmark(func(b *testing.B) { + var compares int64 + for i := 0; i < b.N; i++ { + s := []int{5, 4, 3, 2, 1} + sort.Slice(s, func(i, j int) bool { + compares++ + return s[i] < s[j] + }) + } + // This metric is per-operation, so divide by b.N and + // report it as a "/op" unit. + b.ReportMetric(float64(compares)/float64(b.N), "compares/op") + }) +} diff --git a/src/testing/export_test.go b/src/testing/export_test.go index 89781b439f..65e5c3dbb8 100644 --- a/src/testing/export_test.go +++ b/src/testing/export_test.go @@ -7,4 +7,5 @@ package testing var ( RoundDown10 = roundDown10 RoundUp = roundUp + PrettyPrint = prettyPrint ) -- GitLab From 3cb1e9d98a98abed5fbdcf78a54956851310fe30 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 19 Mar 2019 14:54:40 +0100 Subject: [PATCH 0521/1679] internal/bytealg: add assembly implementation of Count/CountString on arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simple single-byte loop count for now, to be further improved in future CLs. Benchmark on linux/arm: name old time/op new time/op delta CountSingle/10-4 122ns ± 0% 87ns ± 1% -28.41% (p=0.000 n=7+10) CountSingle/32-4 242ns ± 0% 174ns ± 1% -28.25% (p=0.000 n=10+10) CountSingle/4K-4 24.2µs ± 1% 15.6µs ± 1% -35.42% (p=0.000 n=10+10) CountSingle/4M-4 29.6ms ± 1% 21.3ms ± 1% -28.09% (p=0.000 n=10+9) CountSingle/64M-4 562ms ± 0% 414ms ± 1% -26.23% (p=0.000 n=8+10) name old speed new speed delta CountSingle/10-4 81.7MB/s ± 1% 114.5MB/s ± 1% +40.07% (p=0.000 n=10+10) CountSingle/32-4 132MB/s ± 0% 184MB/s ± 1% +39.39% (p=0.000 n=10+9) CountSingle/4K-4 170MB/s ± 1% 263MB/s ± 1% +54.86% (p=0.000 n=10+10) CountSingle/4M-4 142MB/s ± 1% 197MB/s ± 1% +39.07% (p=0.000 n=10+9) CountSingle/64M-4 119MB/s ± 0% 162MB/s ± 1% +35.55% (p=0.000 n=8+10) Updates #29001 Change-Id: I42a268215a62044286ec32b548d8e4b86b9570ee Reviewed-on: https://go-review.googlesource.com/c/go/+/168319 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall Reviewed-by: Cherry Zhang --- src/internal/bytealg/count_arm.s | 43 +++++++++++++++++++++++++++ src/internal/bytealg/count_generic.go | 2 +- src/internal/bytealg/count_native.go | 2 +- 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/internal/bytealg/count_arm.s diff --git a/src/internal/bytealg/count_arm.s b/src/internal/bytealg/count_arm.s new file mode 100644 index 0000000000..f704ea0c69 --- /dev/null +++ b/src/internal/bytealg/count_arm.s @@ -0,0 +1,43 @@ +// Copyright 2019 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. + +#include "go_asm.h" +#include "textflag.h" + +TEXT ·Count(SB),NOSPLIT,$0-20 + MOVW b_base+0(FP), R0 + MOVW b_len+4(FP), R1 + MOVBU c+12(FP), R2 + MOVW $ret+16(FP), R7 + B countbytebody<>(SB) + +TEXT ·CountString(SB),NOSPLIT,$0-16 + MOVW s_base+0(FP), R0 + MOVW s_len+4(FP), R1 + MOVBU c+8(FP), R2 + MOVW $ret+12(FP), R7 + B countbytebody<>(SB) + +// Input: +// R0: data +// R1: data length +// R2: byte to find +// R7: address to put result +// +// On exit: +// R4 and R8 are clobbered +TEXT countbytebody<>(SB),NOSPLIT,$0 + MOVW $0, R8 // R8 = count of byte to search + CMP $0, R1 + B.EQ done // short path to handle 0-byte case + ADD R0, R1 // R1 is the end of the range +byte_loop: + MOVBU.P 1(R0), R4 + CMP R4, R2 + ADD.EQ $1, R8 + CMP R0, R1 + B.NE byte_loop +done: + MOVW R8, (R7) + RET diff --git a/src/internal/bytealg/count_generic.go b/src/internal/bytealg/count_generic.go index e24b2b7fa0..13759ad496 100644 --- a/src/internal/bytealg/count_generic.go +++ b/src/internal/bytealg/count_generic.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64,!arm64,!ppc64le,!ppc64 +// +build !amd64,!arm,!arm64,!ppc64le,!ppc64 package bytealg diff --git a/src/internal/bytealg/count_native.go b/src/internal/bytealg/count_native.go index e6a91b3c0e..52b2a461a4 100644 --- a/src/internal/bytealg/count_native.go +++ b/src/internal/bytealg/count_native.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build amd64 arm64 ppc64le ppc64 +// +build amd64 arm arm64 ppc64le ppc64 package bytealg -- GitLab From 80b6812d7b33cbc16232a3b1b631aaa26be17a71 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 10 Mar 2019 08:34:59 -0700 Subject: [PATCH 0522/1679] cmd/compile: move flagalloc op splitting to rewrite rules Flagalloc has the unenviable task of splitting flag-generating ops that have been merged with loads when the flags need to "spilled" (i.e. regenerated). Since there weren't very many of them, there was a hard-coded list of ops and bespoke code written to split them. This change migrates load splitting into rewrite rules, to make them easier to maintain. Change-Id: I7750eafb888a802206c410f9c341b3133e7748b8 Reviewed-on: https://go-review.googlesource.com/c/go/+/166978 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/config.go | 4 + src/cmd/compile/internal/ssa/flagalloc.go | 83 +----- .../internal/ssa/gen/386splitload.rules | 9 + .../internal/ssa/gen/AMD64splitload.rules | 16 ++ src/cmd/compile/internal/ssa/gen/main.go | 1 + src/cmd/compile/internal/ssa/gen/rulegen.go | 28 +- src/cmd/compile/internal/ssa/op.go | 12 + .../internal/ssa/rewrite386splitload.go | 198 ++++++++++++++ .../internal/ssa/rewriteAMD64splitload.go | 253 ++++++++++++++++++ src/cmd/dist/buildtool.go | 1 + 10 files changed, 513 insertions(+), 92 deletions(-) create mode 100644 src/cmd/compile/internal/ssa/gen/386splitload.rules create mode 100644 src/cmd/compile/internal/ssa/gen/AMD64splitload.rules create mode 100644 src/cmd/compile/internal/ssa/rewrite386splitload.go create mode 100644 src/cmd/compile/internal/ssa/rewriteAMD64splitload.go diff --git a/src/cmd/compile/internal/ssa/config.go b/src/cmd/compile/internal/ssa/config.go index 5d7504392c..e46d937e42 100644 --- a/src/cmd/compile/internal/ssa/config.go +++ b/src/cmd/compile/internal/ssa/config.go @@ -21,6 +21,7 @@ type Config struct { Types Types lowerBlock blockRewriter // lowering function lowerValue valueRewriter // lowering function + splitLoad valueRewriter // function for splitting merged load ops; only used on some architectures registers []Register // machine registers gpRegMask regMask // general purpose integer register mask fpRegMask regMask // floating point register mask @@ -201,6 +202,7 @@ func NewConfig(arch string, types Types, ctxt *obj.Link, optimize bool) *Config c.RegSize = 8 c.lowerBlock = rewriteBlockAMD64 c.lowerValue = rewriteValueAMD64 + c.splitLoad = rewriteValueAMD64splitload c.registers = registersAMD64[:] c.gpRegMask = gpRegMaskAMD64 c.fpRegMask = fpRegMaskAMD64 @@ -212,6 +214,7 @@ func NewConfig(arch string, types Types, ctxt *obj.Link, optimize bool) *Config c.RegSize = 8 c.lowerBlock = rewriteBlockAMD64 c.lowerValue = rewriteValueAMD64 + c.splitLoad = rewriteValueAMD64splitload c.registers = registersAMD64[:] c.gpRegMask = gpRegMaskAMD64 c.fpRegMask = fpRegMaskAMD64 @@ -224,6 +227,7 @@ func NewConfig(arch string, types Types, ctxt *obj.Link, optimize bool) *Config c.RegSize = 4 c.lowerBlock = rewriteBlock386 c.lowerValue = rewriteValue386 + c.splitLoad = rewriteValue386splitload c.registers = registers386[:] c.gpRegMask = gpRegMask386 c.fpRegMask = fpRegMask386 diff --git a/src/cmd/compile/internal/ssa/flagalloc.go b/src/cmd/compile/internal/ssa/flagalloc.go index 56c12e320a..7a2ecc22dc 100644 --- a/src/cmd/compile/internal/ssa/flagalloc.go +++ b/src/cmd/compile/internal/ssa/flagalloc.go @@ -4,30 +4,6 @@ package ssa -// When breaking up a combined load-compare to separated load and compare operations, -// opLoad specifies the load operation, and opCmp specifies the compare operation. -type typeCmdLoadMap struct { - opLoad Op - opCmp Op -} - -var opCmpLoadMap = map[Op]typeCmdLoadMap{ - OpAMD64CMPQload: {OpAMD64MOVQload, OpAMD64CMPQ}, - OpAMD64CMPLload: {OpAMD64MOVLload, OpAMD64CMPL}, - OpAMD64CMPWload: {OpAMD64MOVWload, OpAMD64CMPW}, - OpAMD64CMPBload: {OpAMD64MOVBload, OpAMD64CMPB}, - Op386CMPLload: {Op386MOVLload, Op386CMPL}, - Op386CMPWload: {Op386MOVWload, Op386CMPW}, - Op386CMPBload: {Op386MOVBload, Op386CMPB}, - OpAMD64CMPQconstload: {OpAMD64MOVQload, OpAMD64CMPQconst}, - OpAMD64CMPLconstload: {OpAMD64MOVLload, OpAMD64CMPLconst}, - OpAMD64CMPWconstload: {OpAMD64MOVWload, OpAMD64CMPWconst}, - OpAMD64CMPBconstload: {OpAMD64MOVBload, OpAMD64CMPBconst}, - Op386CMPLconstload: {Op386MOVLload, Op386CMPLconst}, - Op386CMPWconstload: {Op386MOVWload, Op386CMPWconst}, - Op386CMPBconstload: {Op386MOVBload, Op386CMPBconst}, -} - // flagalloc allocates the flag register among all the flag-generating // instructions. Flag values are recomputed if they need to be // spilled/restored. @@ -142,67 +118,10 @@ func flagalloc(f *Func) { // If v will be spilled, and v uses memory, then we must split it // into a load + a flag generator. - // TODO: figure out how to do this without arch-dependent code. if spill[v.ID] && v.MemoryArg() != nil { - switch v.Op { - case OpAMD64CMPQload: - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt64, v.AuxInt, v.Aux, v.Args[0], v.Args[2]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = 0 - v.Aux = nil - v.SetArgs2(load, v.Args[1]) - case OpAMD64CMPLload, Op386CMPLload: - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt32, v.AuxInt, v.Aux, v.Args[0], v.Args[2]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = 0 - v.Aux = nil - v.SetArgs2(load, v.Args[1]) - case OpAMD64CMPWload, Op386CMPWload: - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt16, v.AuxInt, v.Aux, v.Args[0], v.Args[2]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = 0 - v.Aux = nil - v.SetArgs2(load, v.Args[1]) - case OpAMD64CMPBload, Op386CMPBload: - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt8, v.AuxInt, v.Aux, v.Args[0], v.Args[2]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = 0 - v.Aux = nil - v.SetArgs2(load, v.Args[1]) - - case OpAMD64CMPQconstload: - vo := v.AuxValAndOff() - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt64, vo.Off(), v.Aux, v.Args[0], v.Args[1]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = vo.Val() - v.Aux = nil - v.SetArgs1(load) - case OpAMD64CMPLconstload, Op386CMPLconstload: - vo := v.AuxValAndOff() - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt32, vo.Off(), v.Aux, v.Args[0], v.Args[1]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = vo.Val() - v.Aux = nil - v.SetArgs1(load) - case OpAMD64CMPWconstload, Op386CMPWconstload: - vo := v.AuxValAndOff() - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt16, vo.Off(), v.Aux, v.Args[0], v.Args[1]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = vo.Val() - v.Aux = nil - v.SetArgs1(load) - case OpAMD64CMPBconstload, Op386CMPBconstload: - vo := v.AuxValAndOff() - load := b.NewValue2IA(v.Pos, opCmpLoadMap[v.Op].opLoad, f.Config.Types.UInt8, vo.Off(), v.Aux, v.Args[0], v.Args[1]) - v.Op = opCmpLoadMap[v.Op].opCmp - v.AuxInt = vo.Val() - v.Aux = nil - v.SetArgs1(load) - - default: + if !f.Config.splitLoad(v) { f.Fatalf("can't split flag generator: %s", v.LongString()) } - } // Make sure any flag arg of v is in the flags register. diff --git a/src/cmd/compile/internal/ssa/gen/386splitload.rules b/src/cmd/compile/internal/ssa/gen/386splitload.rules new file mode 100644 index 0000000000..7d24700750 --- /dev/null +++ b/src/cmd/compile/internal/ssa/gen/386splitload.rules @@ -0,0 +1,9 @@ +// Copyright 2019 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. + +// See the top of AMD64splitload.rules for discussion of these rules. + +(CMP(L|W|B)load {sym} [off] ptr x mem) -> (CMP(L|W|B) (MOV(L|W|B)load {sym} [off] ptr mem) x) + +(CMP(L|W|B)constload {sym} [vo] ptr mem) -> (CMP(L|W|B)const (MOV(L|W|B)load {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) diff --git a/src/cmd/compile/internal/ssa/gen/AMD64splitload.rules b/src/cmd/compile/internal/ssa/gen/AMD64splitload.rules new file mode 100644 index 0000000000..e8e1b4d258 --- /dev/null +++ b/src/cmd/compile/internal/ssa/gen/AMD64splitload.rules @@ -0,0 +1,16 @@ +// Copyright 2019 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. + +// This file contains rules used by flagalloc to split +// a flag-generating merged load op into separate load and op. +// Unlike with the other rules files, not all of these +// rules will be applied to all values. +// Rather, flagalloc will request for rules to be applied +// to a particular problematic value. +// These are often the exact inverse of rules in AMD64.rules, +// only with the conditions removed. + +(CMP(Q|L|W|B)load {sym} [off] ptr x mem) -> (CMP(Q|L|W|B) (MOV(Q|L|W|B)load {sym} [off] ptr mem) x) + +(CMP(Q|L|W|B)constload {sym} [vo] ptr mem) -> (CMP(Q|L|W|B)const (MOV(Q|L|W|B)load {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) diff --git a/src/cmd/compile/internal/ssa/gen/main.go b/src/cmd/compile/internal/ssa/gen/main.go index 0903f77dbb..bfecb9b29f 100644 --- a/src/cmd/compile/internal/ssa/gen/main.go +++ b/src/cmd/compile/internal/ssa/gen/main.go @@ -398,6 +398,7 @@ func (a arch) Name() string { func genLower() { for _, a := range archs { genRules(a) + genSplitLoadRules(a) } } diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 1f61035969..2082ba15c4 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -80,11 +80,19 @@ func (r Rule) parse() (match, cond, result string) { return match, cond, result } -func genRules(arch arch) { +func genRules(arch arch) { genRulesSuffix(arch, "") } +func genSplitLoadRules(arch arch) { genRulesSuffix(arch, "splitload") } + +func genRulesSuffix(arch arch, suff string) { // Open input file. - text, err := os.Open(arch.name + ".rules") + text, err := os.Open(arch.name + suff + ".rules") if err != nil { - log.Fatalf("can't read rule file: %v", err) + if suff == "" { + // All architectures must have a plain rules file. + log.Fatalf("can't read rule file: %v", err) + } + // Some architectures have bonus rules files that others don't share. That's fine. + return } // oprules contains a list of rules for each block and opcode @@ -122,7 +130,7 @@ func genRules(arch arch) { continue } - loc := fmt.Sprintf("%s.rules:%d", arch.name, ruleLineno) + loc := fmt.Sprintf("%s%s.rules:%d", arch.name, suff, ruleLineno) for _, rule2 := range expandOr(rule) { for _, rule3 := range commute(rule2, arch) { r := Rule{rule: rule3, loc: loc} @@ -156,7 +164,7 @@ func genRules(arch arch) { // Start output buffer, write header. w := new(bytes.Buffer) - fmt.Fprintf(w, "// Code generated from gen/%s.rules; DO NOT EDIT.\n", arch.name) + fmt.Fprintf(w, "// Code generated from gen/%s%s.rules; DO NOT EDIT.\n", arch.name, suff) fmt.Fprintln(w, "// generated with: cd gen; go run *.go") fmt.Fprintln(w) fmt.Fprintln(w, "package ssa") @@ -174,7 +182,7 @@ func genRules(arch arch) { const chunkSize = 10 // Main rewrite routine is a switch on v.Op. - fmt.Fprintf(w, "func rewriteValue%s(v *Value) bool {\n", arch.name) + fmt.Fprintf(w, "func rewriteValue%s%s(v *Value) bool {\n", arch.name, suff) fmt.Fprintf(w, "switch v.Op {\n") for _, op := range ops { fmt.Fprintf(w, "case %s:\n", op) @@ -183,7 +191,7 @@ func genRules(arch arch) { if chunk > 0 { fmt.Fprint(w, " || ") } - fmt.Fprintf(w, "rewriteValue%s_%s_%d(v)", arch.name, op, chunk) + fmt.Fprintf(w, "rewriteValue%s%s_%s_%d(v)", arch.name, suff, op, chunk) } fmt.Fprintln(w) } @@ -243,7 +251,7 @@ func genRules(arch arch) { hasconfig := strings.Contains(body, "config.") || strings.Contains(body, "config)") hasfe := strings.Contains(body, "fe.") hastyps := strings.Contains(body, "typ.") - fmt.Fprintf(w, "func rewriteValue%s_%s_%d(v *Value) bool {\n", arch.name, op, chunk) + fmt.Fprintf(w, "func rewriteValue%s%s_%s_%d(v *Value) bool {\n", arch.name, suff, op, chunk) if hasb || hasconfig || hasfe || hastyps { fmt.Fprintln(w, "b := v.Block") } @@ -263,7 +271,7 @@ func genRules(arch arch) { // Generate block rewrite function. There are only a few block types // so we can make this one function with a switch. - fmt.Fprintf(w, "func rewriteBlock%s(b *Block) bool {\n", arch.name) + fmt.Fprintf(w, "func rewriteBlock%s%s(b *Block) bool {\n", arch.name, suff) fmt.Fprintln(w, "config := b.Func.Config") fmt.Fprintln(w, "_ = config") fmt.Fprintln(w, "fe := b.Func.fe") @@ -382,7 +390,7 @@ func genRules(arch arch) { } // Write to file - err = ioutil.WriteFile("../rewrite"+arch.name+".go", src, 0666) + err = ioutil.WriteFile("../rewrite"+arch.name+suff+".go", src, 0666) if err != nil { log.Fatalf("can't write output: %v\n", err) } diff --git a/src/cmd/compile/internal/ssa/op.go b/src/cmd/compile/internal/ssa/op.go index b404533f6c..ee764ec0f8 100644 --- a/src/cmd/compile/internal/ssa/op.go +++ b/src/cmd/compile/internal/ssa/op.go @@ -154,6 +154,18 @@ func makeValAndOff(val, off int64) int64 { return ValAndOff(val<<32 + int64(uint32(off))).Int64() } +// offOnly returns the offset half of ValAndOff vo. +// It is intended for use in rewrite rules. +func offOnly(vo int64) int64 { + return ValAndOff(vo).Off() +} + +// valOnly returns the value half of ValAndOff vo. +// It is intended for use in rewrite rules. +func valOnly(vo int64) int64 { + return ValAndOff(vo).Val() +} + func (x ValAndOff) canAdd(off int64) bool { newoff := x.Off() + off return newoff == int64(int32(newoff)) diff --git a/src/cmd/compile/internal/ssa/rewrite386splitload.go b/src/cmd/compile/internal/ssa/rewrite386splitload.go new file mode 100644 index 0000000000..96f8cf587a --- /dev/null +++ b/src/cmd/compile/internal/ssa/rewrite386splitload.go @@ -0,0 +1,198 @@ +// Code generated from gen/386splitload.rules; DO NOT EDIT. +// generated with: cd gen; go run *.go + +package ssa + +import "fmt" +import "math" +import "cmd/internal/obj" +import "cmd/internal/objabi" +import "cmd/compile/internal/types" + +var _ = fmt.Println // in case not otherwise used +var _ = math.MinInt8 // in case not otherwise used +var _ = obj.ANOP // in case not otherwise used +var _ = objabi.GOROOT // in case not otherwise used +var _ = types.TypeMem // in case not otherwise used + +func rewriteValue386splitload(v *Value) bool { + switch v.Op { + case Op386CMPBconstload: + return rewriteValue386splitload_Op386CMPBconstload_0(v) + case Op386CMPBload: + return rewriteValue386splitload_Op386CMPBload_0(v) + case Op386CMPLconstload: + return rewriteValue386splitload_Op386CMPLconstload_0(v) + case Op386CMPLload: + return rewriteValue386splitload_Op386CMPLload_0(v) + case Op386CMPWconstload: + return rewriteValue386splitload_Op386CMPWconstload_0(v) + case Op386CMPWload: + return rewriteValue386splitload_Op386CMPWload_0(v) + } + return false +} +func rewriteValue386splitload_Op386CMPBconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPBconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPBconst (MOVBload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(Op386CMPBconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValue386splitload_Op386CMPBload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPBload {sym} [off] ptr x mem) + // cond: + // result: (CMPB (MOVBload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(Op386CMPB) + v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteValue386splitload_Op386CMPLconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPLconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPLconst (MOVLload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(Op386CMPLconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValue386splitload_Op386CMPLload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPLload {sym} [off] ptr x mem) + // cond: + // result: (CMPL (MOVLload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(Op386CMPL) + v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteValue386splitload_Op386CMPWconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPWconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPWconst (MOVWload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(Op386CMPWconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValue386splitload_Op386CMPWload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPWload {sym} [off] ptr x mem) + // cond: + // result: (CMPW (MOVWload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(Op386CMPW) + v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteBlock386splitload(b *Block) bool { + config := b.Func.Config + _ = config + fe := b.Func.fe + _ = fe + typ := &config.Types + _ = typ + switch b.Kind { + } + return false +} diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go new file mode 100644 index 0000000000..af7067b754 --- /dev/null +++ b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go @@ -0,0 +1,253 @@ +// Code generated from gen/AMD64splitload.rules; DO NOT EDIT. +// generated with: cd gen; go run *.go + +package ssa + +import "fmt" +import "math" +import "cmd/internal/obj" +import "cmd/internal/objabi" +import "cmd/compile/internal/types" + +var _ = fmt.Println // in case not otherwise used +var _ = math.MinInt8 // in case not otherwise used +var _ = obj.ANOP // in case not otherwise used +var _ = objabi.GOROOT // in case not otherwise used +var _ = types.TypeMem // in case not otherwise used + +func rewriteValueAMD64splitload(v *Value) bool { + switch v.Op { + case OpAMD64CMPBconstload: + return rewriteValueAMD64splitload_OpAMD64CMPBconstload_0(v) + case OpAMD64CMPBload: + return rewriteValueAMD64splitload_OpAMD64CMPBload_0(v) + case OpAMD64CMPLconstload: + return rewriteValueAMD64splitload_OpAMD64CMPLconstload_0(v) + case OpAMD64CMPLload: + return rewriteValueAMD64splitload_OpAMD64CMPLload_0(v) + case OpAMD64CMPQconstload: + return rewriteValueAMD64splitload_OpAMD64CMPQconstload_0(v) + case OpAMD64CMPQload: + return rewriteValueAMD64splitload_OpAMD64CMPQload_0(v) + case OpAMD64CMPWconstload: + return rewriteValueAMD64splitload_OpAMD64CMPWconstload_0(v) + case OpAMD64CMPWload: + return rewriteValueAMD64splitload_OpAMD64CMPWload_0(v) + } + return false +} +func rewriteValueAMD64splitload_OpAMD64CMPBconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPBconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPBconst (MOVBload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(OpAMD64CMPBconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, OpAMD64MOVBload, typ.UInt8) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPBload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPBload {sym} [off] ptr x mem) + // cond: + // result: (CMPB (MOVBload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(OpAMD64CMPB) + v0 := b.NewValue0(v.Pos, OpAMD64MOVBload, typ.UInt8) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPLconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPLconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPLconst (MOVLload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(OpAMD64CMPLconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLload, typ.UInt32) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPLload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPLload {sym} [off] ptr x mem) + // cond: + // result: (CMPL (MOVLload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(OpAMD64CMPL) + v0 := b.NewValue0(v.Pos, OpAMD64MOVLload, typ.UInt32) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPQconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPQconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPQconst (MOVQload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(OpAMD64CMPQconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, OpAMD64MOVQload, typ.UInt64) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPQload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPQload {sym} [off] ptr x mem) + // cond: + // result: (CMPQ (MOVQload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(OpAMD64CMPQ) + v0 := b.NewValue0(v.Pos, OpAMD64MOVQload, typ.UInt64) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPWconstload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPWconstload {sym} [vo] ptr mem) + // cond: + // result: (CMPWconst (MOVWload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) + for { + vo := v.AuxInt + sym := v.Aux + _ = v.Args[1] + ptr := v.Args[0] + mem := v.Args[1] + v.reset(OpAMD64CMPWconst) + v.AuxInt = valOnly(vo) + v0 := b.NewValue0(v.Pos, OpAMD64MOVWload, typ.UInt16) + v0.AuxInt = offOnly(vo) + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + return true + } +} +func rewriteValueAMD64splitload_OpAMD64CMPWload_0(v *Value) bool { + b := v.Block + _ = b + typ := &b.Func.Config.Types + _ = typ + // match: (CMPWload {sym} [off] ptr x mem) + // cond: + // result: (CMPW (MOVWload {sym} [off] ptr mem) x) + for { + off := v.AuxInt + sym := v.Aux + _ = v.Args[2] + ptr := v.Args[0] + x := v.Args[1] + mem := v.Args[2] + v.reset(OpAMD64CMPW) + v0 := b.NewValue0(v.Pos, OpAMD64MOVWload, typ.UInt16) + v0.AuxInt = off + v0.Aux = sym + v0.AddArg(ptr) + v0.AddArg(mem) + v.AddArg(v0) + v.AddArg(x) + return true + } +} +func rewriteBlockAMD64splitload(b *Block) bool { + config := b.Func.Config + _ = config + fe := b.Func.fe + _ = fe + typ := &config.Types + _ = typ + switch b.Kind { + } + return false +} diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 2f2453fd12..7b85927785 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -245,6 +245,7 @@ func isUnneededSSARewriteFile(srcFile string) (archCaps string, unneeded bool) { } archCaps = fileArch fileArch = strings.ToLower(fileArch) + fileArch = strings.TrimSuffix(fileArch, "splitload") if fileArch == strings.TrimSuffix(runtime.GOARCH, "le") { return "", false } -- GitLab From e608ffda0828e8001c0d95dc5ead28472c05d74e Mon Sep 17 00:00:00 2001 From: David Chase Date: Tue, 19 Mar 2019 17:11:15 +0000 Subject: [PATCH 0523/1679] cmd/compile: fix ssa/debug_test.go reference file Behavior improved, file expects old worse behavior. Update file to expect newer, better output. Fixes #30912. Change-Id: I410bdaacdb77a4620656753c8c0dc2d4d5378985 Reviewed-on: https://go-review.googlesource.com/c/go/+/168377 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Katie Hockman --- src/cmd/compile/internal/ssa/testdata/i22558.gdb-dbg.nexts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/cmd/compile/internal/ssa/testdata/i22558.gdb-dbg.nexts b/src/cmd/compile/internal/ssa/testdata/i22558.gdb-dbg.nexts index 8a49b168bf..70dfa07b87 100644 --- a/src/cmd/compile/internal/ssa/testdata/i22558.gdb-dbg.nexts +++ b/src/cmd/compile/internal/ssa/testdata/i22558.gdb-dbg.nexts @@ -2,3 +2,10 @@ 19: func test(t *thing, u *thing) { 20: if t.next != nil { 23: fmt.Fprintf(os.Stderr, "%s\n", t.name) +24: u.self = u +25: t.self = t +26: t.next = u +27: for _, p := range t.stuff { +28: if isFoo(t, p) { +29: return +44: } -- GitLab From fc1e6915dc04aeb95c2f736f8c8805ba6a696c30 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 18 Mar 2019 07:33:43 -0700 Subject: [PATCH 0524/1679] cmd/internal/obj/x86: minor clean-up in span6 * Reduce the scope of q. * Remove duplicate handling of AADJSP. * Move ab declaration closer to use. * Collapse nested if statements. * Change declaration of n for increased readability in context. * Simplify AADJSP handling. Passes toolstash-check. Change-Id: I046369477db567f2f7c4a9c8d400ec9dd9c32f3f Reviewed-on: https://go-review.googlesource.com/c/go/+/168342 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/internal/obj/x86/asm6.go | 51 ++++++++------------------------ 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index 987ded2fca..305fcc4952 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1857,63 +1857,38 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { ctxt.Diag("x86 tables not initialized, call x86.instinit first") } - var ab AsmBuf - for p := s.Func.Text; p != nil; p = p.Link { - if p.To.Type == obj.TYPE_BRANCH { - if p.Pcond == nil { - p.Pcond = p - } + if p.To.Type == obj.TYPE_BRANCH && p.Pcond == nil { + p.Pcond = p } if p.As == AADJSP { p.To.Type = obj.TYPE_REG p.To.Reg = REG_SP - v := int32(-p.From.Offset) - p.From.Offset = int64(v) - p.As = spadjop(ctxt, AADDL, AADDQ) - if v < 0 { - p.As = spadjop(ctxt, ASUBL, ASUBQ) - v = -v - p.From.Offset = int64(v) - } - - if v == 0 { + switch v := p.From.Offset; { + case v == 0: p.As = obj.ANOP + case v < 0: + p.As = spadjop(ctxt, AADDL, AADDQ) + p.From.Offset *= -1 + default: + p.As = spadjop(ctxt, ASUBL, ASUBQ) } } } - var q *obj.Prog var count int64 // rough count of number of instructions for p := s.Func.Text; p != nil; p = p.Link { count++ p.Back = branchShort // use short branches first time through - q = p.Pcond - if q != nil && (q.Back&branchShort != 0) { + if q := p.Pcond; q != nil && (q.Back&branchShort != 0) { p.Back |= branchBackwards q.Back |= branchLoopHead } - - if p.As == AADJSP { - p.To.Type = obj.TYPE_REG - p.To.Reg = REG_SP - v := int32(-p.From.Offset) - p.From.Offset = int64(v) - p.As = spadjop(ctxt, AADDL, AADDQ) - if v < 0 { - p.As = spadjop(ctxt, ASUBL, ASUBQ) - v = -v - p.From.Offset = int64(v) - } - - if v == 0 { - p.As = obj.ANOP - } - } } s.GrowCap(count * 5) // preallocate roughly 5 bytes per instruction - n := 0 + var ab AsmBuf + var n int var c int32 errors := ctxt.Errors for { @@ -1975,7 +1950,7 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { p.Pc = int64(c) // process forward jumps to p - for q = p.Rel; q != nil; q = q.Forwd { + for q := p.Rel; q != nil; q = q.Forwd { v := int32(p.Pc - (q.Pc + int64(q.Isize))) if q.Back&branchShort != 0 { if v > 127 { -- GitLab From 250b96a7bfa5b9ac0f31e70e768173f57a61d2f7 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 19 Mar 2019 12:26:22 -0700 Subject: [PATCH 0525/1679] cmd/compile: slightly optimize adding 128 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'SUBQ $-0x80, r' is shorter to encode than 'ADDQ $0x80, r', and functionally equivalent. Use it instead. Shaves off a few bytes here and there: file before after Δ % compile 25935856 25927664 -8192 -0.032% nm 4251840 4247744 -4096 -0.096% Change-Id: Ia9e02ea38cbded6a52a613b92e3a914f878d931e Reviewed-on: https://go-review.googlesource.com/c/go/+/168344 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/amd64/ssa.go | 20 +++++++++++++++++--- test/codegen/arithmetic.go | 10 ++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 48b4f7d0b5..5b8590c357 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -414,7 +414,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { r := v.Reg() a := v.Args[0].Reg() if r == a { - if v.AuxInt == 1 { + switch v.AuxInt { + case 1: var asm obj.As // Software optimization manual recommends add $1,reg. // But inc/dec is 1 byte smaller. ICC always uses inc @@ -430,8 +431,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = r return - } - if v.AuxInt == -1 { + case -1: var asm obj.As if v.Op == ssa.OpAMD64ADDQconst { asm = x86.ADECQ @@ -442,6 +442,20 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = r return + case 0x80: + // 'SUBQ $-0x80, r' is shorter to encode than + // and functionally equivalent to 'ADDQ $0x80, r'. + asm := x86.ASUBL + if v.Op == ssa.OpAMD64ADDQconst { + asm = x86.ASUBQ + } + p := s.Prog(asm) + p.From.Type = obj.TYPE_CONST + p.From.Offset = -0x80 + p.To.Type = obj.TYPE_REG + p.To.Reg = r + return + } p := s.Prog(v.Op.Asm()) p.From.Type = obj.TYPE_CONST diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index 16d7d25d3e..b5976be9d2 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -381,3 +381,13 @@ func MULS(a, b, c uint32) (uint32, uint32, uint32) { r2 := c - b*64 return r0, r1, r2 } + +func addSpecial(a, b, c uint32) (uint32, uint32, uint32) { + // amd64:`INCL` + a++ + // amd64:`DECL` + b-- + // amd64:`SUBL.*-128` + c += 128 + return a, b, c +} -- GitLab From cb8aefd3b06f39679ebe1abbd38abef52cbd76b7 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 19 Mar 2019 10:40:52 -0700 Subject: [PATCH 0526/1679] cmd/internal/obj/x86: slightly optimize ADJSP encoding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This shaves a few bytes off here and there. file before after Δ % buildid 2865992 2861896 -4096 -0.143% pprof 14744060 14739964 -4096 -0.028% trace 11680644 11676548 -4096 -0.035% vet 8448240 8444144 -4096 -0.048% Change-Id: I799034afabc06a37b535301cd1380d63b4461095 Reviewed-on: https://go-review.googlesource.com/c/go/+/168343 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Martin Möhrmann --- src/cmd/internal/obj/x86/asm6.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index 305fcc4952..91a2fc22ff 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1864,10 +1864,14 @@ func span6(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { if p.As == AADJSP { p.To.Type = obj.TYPE_REG p.To.Reg = REG_SP + // Generate 'ADDQ $x, SP' or 'SUBQ $x, SP', with x positive. + // One exception: It is smaller to encode $-0x80 than $0x80. + // For that case, flip the sign and the op: + // Instead of 'ADDQ $0x80, SP', generate 'SUBQ $-0x80, SP'. switch v := p.From.Offset; { case v == 0: p.As = obj.ANOP - case v < 0: + case v == 0x80 || (v < 0 && v != -0x80): p.As = spadjop(ctxt, AADDL, AADDQ) p.From.Offset *= -1 default: -- GitLab From 456f3e10cdee774ccf12121f47b88865a3777e7c Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Wed, 20 Mar 2019 11:32:59 +1100 Subject: [PATCH 0527/1679] cmd/go: fix minor grammatical nit: command-line is an adjective... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit while command line is a noun. Change-Id: I9dfc2f6841d1171854857a8daa785d55afe2c5f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/167783 Reviewed-by: Daniel Martí Reviewed-by: Brad Fitzpatrick Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- src/cmd/go/alldocs.go | 2 +- src/cmd/go/go_test.go | 2 +- src/cmd/go/internal/help/helpdoc.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 141f13c63e..5b62ed939c 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1495,7 +1495,7 @@ // GOFLAGS // A space-separated list of -flag=value settings to apply // to go commands by default, when the given flag is known by -// the current command. Flags listed on the command-line +// the current command. Flags listed on the command line // are applied after this list and therefore override it. // GOOS // The operating system for which to compile code. diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index faf953ddeb..240ba594f5 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -5970,7 +5970,7 @@ func TestBadCgoDirectives(t *testing.T) { if runtime.Compiler == "gc" { tg.runFail("build", tg.path("src/x/_cgo_yy.go")) // ... but if forced, the comment is rejected // Actually, today there is a separate issue that _ files named - // on the command-line are ignored. Once that is fixed, + // on the command line are ignored. Once that is fixed, // we want to see the cgo_ldflag error. tg.grepStderr("//go:cgo_ldflag only allowed in cgo-generated code|no Go files", "did not reject //go:cgo_ldflag directive") } diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index a989483e60..d931c9225b 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -489,7 +489,7 @@ General-purpose environment variables: GOFLAGS A space-separated list of -flag=value settings to apply to go commands by default, when the given flag is known by - the current command. Flags listed on the command-line + the current command. Flags listed on the command line are applied after this list and therefore override it. GOOS The operating system for which to compile code. -- GitLab From 5714c91b532f3ac9b354cd8302c63aa6f9ab53e7 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Mon, 14 Jan 2019 09:36:18 +0000 Subject: [PATCH 0528/1679] cmd/compile: intrinsify math/bits.Add64 for arm64 This CL instrinsifies Add64 with arm64 instruction sequence ADDS, ADCS and ADC, and optimzes the case of carry chains.The CL also changes the test code so that the intrinsic implementation can be tested. Benchmarks: name old time/op new time/op delta Add-224 2.500000ns +- 0% 2.090000ns +- 4% -16.40% (p=0.000 n=9+10) Add32-224 2.500000ns +- 0% 2.500000ns +- 0% ~ (all equal) Add64-224 2.500000ns +- 0% 1.577778ns +- 2% -36.89% (p=0.000 n=10+9) Add64multiple-224 6.000000ns +- 0% 2.000000ns +- 0% -66.67% (p=0.000 n=10+10) Change-Id: I6ee91c9a85c16cc72ade5fd94868c579f16c7615 Reviewed-on: https://go-review.googlesource.com/c/go/+/159017 Run-TryBot: Ben Shi TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/arm64/ssa.go | 24 ++++ src/cmd/compile/internal/gc/ssa.go | 4 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 6 + src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 109 ++++++++++--------- src/cmd/compile/internal/ssa/opGen.go | 44 ++++++++ src/cmd/compile/internal/ssa/rewriteARM64.go | 108 ++++++++++++++++++ src/math/bits/bits_test.go | 25 +++++ test/codegen/mathbits.go | 10 ++ 8 files changed, 277 insertions(+), 53 deletions(-) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 75cf1d0bd9..98cd6c3b03 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -246,6 +246,30 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.Reg = v.Args[0].Reg() p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() + case ssa.OpARM64ADDSconstflags: + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_CONST + p.From.Offset = v.AuxInt + p.Reg = v.Args[0].Reg() + p.To.Type = obj.TYPE_REG + p.To.Reg = v.Reg0() + case ssa.OpARM64ADCzerocarry: + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_REG + p.From.Reg = arm64.REGZERO + p.Reg = arm64.REGZERO + p.To.Type = obj.TYPE_REG + p.To.Reg = v.Reg() + case ssa.OpARM64ADCSflags: + r := v.Reg0() + r1 := v.Args[0].Reg() + r2 := v.Args[1].Reg() + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_REG + p.From.Reg = r2 + p.Reg = r1 + p.To.Type = obj.TYPE_REG + p.To.Reg = r case ssa.OpARM64EXTRconst, ssa.OpARM64EXTRWconst: p := s.Prog(v.Op.Asm()) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 031c3c072c..aa2e2c19c9 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3562,8 +3562,8 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue3(ssa.OpAdd64carry, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1], args[2]) }, - sys.AMD64) - alias("math/bits", "Add", "math/bits", "Add64", sys.ArchAMD64) + sys.AMD64, sys.ARM64) + alias("math/bits", "Add", "math/bits", "Add64", sys.ArchAMD64, sys.ArchARM64) addF("math/bits", "Sub64", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue3(ssa.OpSub64borrow, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1], args[2]) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 35126835d2..df841e5546 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -144,6 +144,12 @@ (UMOD x y) -> (MSUB x y (UDIV x y)) (UMODW x y) -> (MSUBW x y (UDIVW x y)) +// 64-bit addition with carry. +(Select0 (Add64carry x y c)) -> (Select0 (ADCSflags x y (Select1 (ADDSconstflags [-1] c)))) +(Select1 (Add64carry x y c)) -> (ADCzerocarry (Select1 (ADCSflags x y (Select1 (ADDSconstflags [-1] c))))) +// The carry flag of c doesn't change. +(ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) -> (ADCSflags x y c) + // boolean ops -- booleans are represented with 0=false, 1=true (AndB x y) -> (AND x y) (OrB x y) -> (OR x y) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 04c4b3f517..05d57fa8ca 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -137,60 +137,66 @@ func init() { ) // Common regInfo var ( - gp01 = regInfo{inputs: nil, outputs: []regMask{gp}} - gp11 = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp}} - gp11sp = regInfo{inputs: []regMask{gpspg}, outputs: []regMask{gp}} - gp1flags = regInfo{inputs: []regMask{gpg}} - gp1flags1 = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp}} - gp21 = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp}} - gp31 = regInfo{inputs: []regMask{gpg, gpg, gpg}, outputs: []regMask{gp}} - gp21nog = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} - gp2flags = regInfo{inputs: []regMask{gpg, gpg}} - gp2flags1 = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} - gp22 = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp, gp}} - gpload = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{gp}} - gp2load = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{gp}} - gpstore = regInfo{inputs: []regMask{gpspsbg, gpg}} - gpstore0 = regInfo{inputs: []regMask{gpspsbg}} - gpstore2 = regInfo{inputs: []regMask{gpspsbg, gpg, gpg}} - gpxchg = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{gp}} - gpcas = regInfo{inputs: []regMask{gpspsbg, gpg, gpg}, outputs: []regMask{gp}} - fp01 = regInfo{inputs: nil, outputs: []regMask{fp}} - fp11 = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}} - fpgp = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}} - gpfp = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}} - fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}} - fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}} - fp2flags = regInfo{inputs: []regMask{fp, fp}} - fp1flags = regInfo{inputs: []regMask{fp}} - fpload = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{fp}} - fp2load = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{fp}} - fpstore = regInfo{inputs: []regMask{gpspsbg, fp}} - fpstore2 = regInfo{inputs: []regMask{gpspsbg, gpg, fp}} - readflags = regInfo{inputs: nil, outputs: []regMask{gp}} + gp01 = regInfo{inputs: nil, outputs: []regMask{gp}} + gp0flags1 = regInfo{inputs: []regMask{0}, outputs: []regMask{gp}} + gp11 = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp}} + gp11sp = regInfo{inputs: []regMask{gpspg}, outputs: []regMask{gp}} + gp1flags = regInfo{inputs: []regMask{gpg}} + gp1flags1 = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp}} + gp11flags = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp, 0}} + gp21 = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp}} + gp21nog = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} + gp2flags = regInfo{inputs: []regMask{gpg, gpg}} + gp2flags1 = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} + gp2flags1flags = regInfo{inputs: []regMask{gp, gp, 0}, outputs: []regMask{gp, 0}} + gp2load = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{gp}} + gp22 = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp, gp}} + gp31 = regInfo{inputs: []regMask{gpg, gpg, gpg}, outputs: []regMask{gp}} + gpload = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{gp}} + gpstore = regInfo{inputs: []regMask{gpspsbg, gpg}} + gpstore0 = regInfo{inputs: []regMask{gpspsbg}} + gpstore2 = regInfo{inputs: []regMask{gpspsbg, gpg, gpg}} + gpxchg = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{gp}} + gpcas = regInfo{inputs: []regMask{gpspsbg, gpg, gpg}, outputs: []regMask{gp}} + fp01 = regInfo{inputs: nil, outputs: []regMask{fp}} + fp11 = regInfo{inputs: []regMask{fp}, outputs: []regMask{fp}} + fpgp = regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}} + gpfp = regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}} + fp21 = regInfo{inputs: []regMask{fp, fp}, outputs: []regMask{fp}} + fp31 = regInfo{inputs: []regMask{fp, fp, fp}, outputs: []regMask{fp}} + fp2flags = regInfo{inputs: []regMask{fp, fp}} + fp1flags = regInfo{inputs: []regMask{fp}} + fpload = regInfo{inputs: []regMask{gpspsbg}, outputs: []regMask{fp}} + fp2load = regInfo{inputs: []regMask{gpspsbg, gpg}, outputs: []regMask{fp}} + fpstore = regInfo{inputs: []regMask{gpspsbg, fp}} + fpstore2 = regInfo{inputs: []regMask{gpspsbg, gpg, fp}} + readflags = regInfo{inputs: nil, outputs: []regMask{gp}} ) ops := []opData{ // binary ops - {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1 - {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int64"}, // arg0 + auxInt - {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1 - {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64"}, // arg0 - auxInt - {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true}, // arg0 * arg1 - {name: "MULW", argLength: 2, reg: gp21, asm: "MULW", commutative: true}, // arg0 * arg1, 32-bit - {name: "MNEG", argLength: 2, reg: gp21, asm: "MNEG", commutative: true}, // -arg0 * arg1 - {name: "MNEGW", argLength: 2, reg: gp21, asm: "MNEGW", commutative: true}, // -arg0 * arg1, 32-bit - {name: "MULH", argLength: 2, reg: gp21, asm: "SMULH", commutative: true}, // (arg0 * arg1) >> 64, signed - {name: "UMULH", argLength: 2, reg: gp21, asm: "UMULH", commutative: true}, // (arg0 * arg1) >> 64, unsigned - {name: "MULL", argLength: 2, reg: gp21, asm: "SMULL", commutative: true}, // arg0 * arg1, signed, 32-bit mult results in 64-bit - {name: "UMULL", argLength: 2, reg: gp21, asm: "UMULL", commutative: true}, // arg0 * arg1, unsigned, 32-bit mult results in 64-bit - {name: "DIV", argLength: 2, reg: gp21, asm: "SDIV"}, // arg0 / arg1, signed - {name: "UDIV", argLength: 2, reg: gp21, asm: "UDIV"}, // arg0 / arg1, unsighed - {name: "DIVW", argLength: 2, reg: gp21, asm: "SDIVW"}, // arg0 / arg1, signed, 32 bit - {name: "UDIVW", argLength: 2, reg: gp21, asm: "UDIVW"}, // arg0 / arg1, unsighed, 32 bit - {name: "MOD", argLength: 2, reg: gp21, asm: "REM"}, // arg0 % arg1, signed - {name: "UMOD", argLength: 2, reg: gp21, asm: "UREM"}, // arg0 % arg1, unsigned - {name: "MODW", argLength: 2, reg: gp21, asm: "REMW"}, // arg0 % arg1, signed, 32 bit - {name: "UMODW", argLength: 2, reg: gp21, asm: "UREMW"}, // arg0 % arg1, unsigned, 32 bit + {name: "ADCSflags", argLength: 3, reg: gp2flags1flags, typ: "(UInt64,Flags)", asm: "ADCS", commutative: true}, // arg0+arg1+carry, set flags. + {name: "ADCzerocarry", argLength: 1, reg: gp0flags1, typ: "UInt64", asm: "ADC"}, // ZR+ZR+carry + {name: "ADDSconstflags", argLength: 1, reg: gp11flags, typ: "(UInt64,Flags)", asm: "ADDS", aux: "Int64"}, // arg0+auxint, set flags. + {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1 + {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int64"}, // arg0 + auxInt + {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1 + {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64"}, // arg0 - auxInt + {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true}, // arg0 * arg1 + {name: "MULW", argLength: 2, reg: gp21, asm: "MULW", commutative: true}, // arg0 * arg1, 32-bit + {name: "MNEG", argLength: 2, reg: gp21, asm: "MNEG", commutative: true}, // -arg0 * arg1 + {name: "MNEGW", argLength: 2, reg: gp21, asm: "MNEGW", commutative: true}, // -arg0 * arg1, 32-bit + {name: "MULH", argLength: 2, reg: gp21, asm: "SMULH", commutative: true}, // (arg0 * arg1) >> 64, signed + {name: "UMULH", argLength: 2, reg: gp21, asm: "UMULH", commutative: true}, // (arg0 * arg1) >> 64, unsigned + {name: "MULL", argLength: 2, reg: gp21, asm: "SMULL", commutative: true}, // arg0 * arg1, signed, 32-bit mult results in 64-bit + {name: "UMULL", argLength: 2, reg: gp21, asm: "UMULL", commutative: true}, // arg0 * arg1, unsigned, 32-bit mult results in 64-bit + {name: "DIV", argLength: 2, reg: gp21, asm: "SDIV"}, // arg0 / arg1, signed + {name: "UDIV", argLength: 2, reg: gp21, asm: "UDIV"}, // arg0 / arg1, unsighed + {name: "DIVW", argLength: 2, reg: gp21, asm: "SDIVW"}, // arg0 / arg1, signed, 32 bit + {name: "UDIVW", argLength: 2, reg: gp21, asm: "UDIVW"}, // arg0 / arg1, unsighed, 32 bit + {name: "MOD", argLength: 2, reg: gp21, asm: "REM"}, // arg0 % arg1, signed + {name: "UMOD", argLength: 2, reg: gp21, asm: "UREM"}, // arg0 % arg1, unsigned + {name: "MODW", argLength: 2, reg: gp21, asm: "REMW"}, // arg0 % arg1, signed, 32 bit + {name: "UMODW", argLength: 2, reg: gp21, asm: "UREMW"}, // arg0 % arg1, unsigned, 32 bit {name: "FADDS", argLength: 2, reg: fp21, asm: "FADDS", commutative: true}, // arg0 + arg1 {name: "FADDD", argLength: 2, reg: fp21, asm: "FADDD", commutative: true}, // arg0 + arg1 @@ -214,6 +220,7 @@ func init() { {name: "ORN", argLength: 2, reg: gp21, asm: "ORN"}, // arg0 | ^arg1 {name: "LoweredMuluhilo", argLength: 2, reg: gp22, resultNotInArgs: true}, // arg0 * arg1, returns (hi, lo) + // unary ops {name: "MVN", argLength: 1, reg: gp11, asm: "MVN"}, // ^arg0 {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"}, // -arg0 diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index c5e88e853e..92d161480a 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1141,6 +1141,9 @@ const ( OpARMInvertFlags OpARMLoweredWB + OpARM64ADCSflags + OpARM64ADCzerocarry + OpARM64ADDSconstflags OpARM64ADD OpARM64ADDconst OpARM64SUB @@ -15137,6 +15140,47 @@ var opcodeTable = [...]opInfo{ }, }, + { + name: "ADCSflags", + argLen: 3, + commutative: true, + asm: arm64.AADCS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + {1, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "ADCzerocarry", + argLen: 1, + asm: arm64.AADC, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "ADDSconstflags", + auxType: auxInt64, + argLen: 1, + asm: arm64.AADDS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, { name: "ADD", argLen: 2, diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 499c5bbbd4..7cc85b66cd 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -17,6 +17,8 @@ var _ = types.TypeMem // in case not otherwise used func rewriteValueARM64(v *Value) bool { switch v.Op { + case OpARM64ADCSflags: + return rewriteValueARM64_OpARM64ADCSflags_0(v) case OpARM64ADD: return rewriteValueARM64_OpARM64ADD_0(v) || rewriteValueARM64_OpARM64ADD_10(v) || rewriteValueARM64_OpARM64ADD_20(v) case OpARM64ADDconst: @@ -873,6 +875,10 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpRsh8x64_0(v) case OpRsh8x8: return rewriteValueARM64_OpRsh8x8_0(v) + case OpSelect0: + return rewriteValueARM64_OpSelect0_0(v) + case OpSelect1: + return rewriteValueARM64_OpSelect1_0(v) case OpSignExt16to32: return rewriteValueARM64_OpSignExt16to32_0(v) case OpSignExt16to64: @@ -948,6 +954,46 @@ func rewriteValueARM64(v *Value) bool { } return false } +func rewriteValueARM64_OpARM64ADCSflags_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) + // cond: + // result: (ADCSflags x y c) + for { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 { + break + } + if v_2.Type != types.TypeFlags { + break + } + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64ADDSconstflags { + break + } + if v_2_0.AuxInt != -1 { + break + } + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64ADCzerocarry { + break + } + if v_2_0_0.Type != typ.UInt64 { + break + } + c := v_2_0_0.Args[0] + v.reset(OpARM64ADCSflags) + v.AddArg(x) + v.AddArg(y) + v.AddArg(c) + return true + } + return false +} func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { // match: (ADD x (MOVDconst [c])) // cond: @@ -36794,6 +36840,68 @@ func rewriteValueARM64_OpRsh8x8_0(v *Value) bool { return true } } +func rewriteValueARM64_OpSelect0_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Select0 (Add64carry x y c)) + // cond: + // result: (Select0 (ADCSflags x y (Select1 (ADDSconstflags [-1] c)))) + for { + v_0 := v.Args[0] + if v_0.Op != OpAdd64carry { + break + } + c := v_0.Args[2] + x := v_0.Args[0] + y := v_0.Args[1] + v.reset(OpSelect0) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpARM64ADCSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v0.AddArg(x) + v0.AddArg(y) + v1 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v2 := b.NewValue0(v.Pos, OpARM64ADDSconstflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v2.AuxInt = -1 + v2.AddArg(c) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + return false +} +func rewriteValueARM64_OpSelect1_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (Select1 (Add64carry x y c)) + // cond: + // result: (ADCzerocarry (Select1 (ADCSflags x y (Select1 (ADDSconstflags [-1] c))))) + for { + v_0 := v.Args[0] + if v_0.Op != OpAdd64carry { + break + } + c := v_0.Args[2] + x := v_0.Args[0] + y := v_0.Args[1] + v.reset(OpARM64ADCzerocarry) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v1 := b.NewValue0(v.Pos, OpARM64ADCSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v1.AddArg(x) + v1.AddArg(y) + v2 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v3 := b.NewValue0(v.Pos, OpARM64ADDSconstflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v3.AuxInt = -1 + v3.AddArg(c) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } + return false +} func rewriteValueARM64_OpSignExt16to32_0(v *Value) bool { // match: (SignExt16to32 x) // cond: diff --git a/src/math/bits/bits_test.go b/src/math/bits/bits_test.go index 1ec5107ae1..bfd0e287fa 100644 --- a/src/math/bits/bits_test.go +++ b/src/math/bits/bits_test.go @@ -736,6 +736,13 @@ func TestAddSubUint(t *testing.T) { test("Add symmetric", Add, a.y, a.x, a.c, a.z, a.cout) test("Sub", Sub, a.z, a.x, a.c, a.y, a.cout) test("Sub symmetric", Sub, a.z, a.y, a.c, a.x, a.cout) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + test("Add intrinsic", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.x, a.y, a.c, a.z, a.cout) + test("Add intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.y, a.x, a.c, a.z, a.cout) + test("Sub intrinsic", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.x, a.c, a.y, a.cout) + test("Add intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) + } } @@ -790,6 +797,12 @@ func TestAddSubUint64(t *testing.T) { test("Add64 symmetric", Add64, a.y, a.x, a.c, a.z, a.cout) test("Sub64", Sub64, a.z, a.x, a.c, a.y, a.cout) test("Sub64 symmetric", Sub64, a.z, a.y, a.c, a.x, a.cout) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + test("Add64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.x, a.y, a.c, a.z, a.cout) + test("Add64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.y, a.x, a.c, a.z, a.cout) + test("Sub64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.x, a.c, a.y, a.cout) + test("Add64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) } } @@ -817,6 +830,12 @@ func TestMulDiv(t *testing.T) { testMul("Mul symmetric", Mul, a.y, a.x, a.hi, a.lo) testDiv("Div", Div, a.hi, a.lo+a.r, a.y, a.x, a.r) testDiv("Div symmetric", Div, a.hi, a.lo+a.r, a.x, a.y, a.r) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + testMul("Mul intrinsic", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.x, a.y, a.hi, a.lo) + testMul("Mul intrinsic symmetric", func(x, y uint) (uint, uint) { return Mul(x, y) }, a.y, a.x, a.hi, a.lo) + testDiv("Div intrinsic", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div intrinsic symmetric", func(hi, lo, y uint) (uint, uint) { return Div(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r) } } @@ -873,6 +892,12 @@ func TestMulDiv64(t *testing.T) { testMul("Mul64 symmetric", Mul64, a.y, a.x, a.hi, a.lo) testDiv("Div64", Div64, a.hi, a.lo+a.r, a.y, a.x, a.r) testDiv("Div64 symmetric", Div64, a.hi, a.lo+a.r, a.x, a.y, a.r) + // The above code can't test intrinsic implementation, because the passed function is not called directly. + // The following code uses a closure to test the intrinsic version in case the function is intrinsified. + testMul("Mul64 intrinsic", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.x, a.y, a.hi, a.lo) + testMul("Mul64 intrinsic symmetric", func(x, y uint64) (uint64, uint64) { return Mul64(x, y) }, a.y, a.x, a.hi, a.lo) + testDiv("Div64 intrinsic", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.y, a.x, a.r) + testDiv("Div64 intrinsic symmetric", func(hi, lo, y uint64) (uint64, uint64) { return Div64(hi, lo, y) }, a.hi, a.lo+a.r, a.x, a.y, a.r) } } diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 3d5f1f64c8..9a3b00cab7 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -367,21 +367,25 @@ func IterateBits8(n uint8) int { // --------------- // func Add(x, y, ci uint) (r, co uint) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ","SBBQ","NEGQ" return bits.Add(x, y, ci) } func AddC(x, ci uint) (r, co uint) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ","SBBQ","NEGQ" return bits.Add(x, 7, ci) } func AddZ(x, y uint) (r, co uint) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ" return bits.Add(x, y, 0) } func AddR(x, y, ci uint) uint { + // arm64:"ADDS","ADCS",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ" r, _ := bits.Add(x, y, ci) return r @@ -389,27 +393,32 @@ func AddR(x, y, ci uint) uint { func AddM(p, q, r *[3]uint) { var c uint r[0], c = bits.Add(p[0], q[0], c) + // arm64:"ADCS",-"ADD\t",-"CMP" // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ" r[1], c = bits.Add(p[1], q[1], c) r[2], c = bits.Add(p[2], q[2], c) } func Add64(x, y, ci uint64) (r, co uint64) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ","SBBQ","NEGQ" return bits.Add64(x, y, ci) } func Add64C(x, ci uint64) (r, co uint64) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ","SBBQ","NEGQ" return bits.Add64(x, 7, ci) } func Add64Z(x, y uint64) (r, co uint64) { + // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ" return bits.Add64(x, y, 0) } func Add64R(x, y, ci uint64) uint64 { + // arm64:"ADDS","ADCS",-"ADD\t",-"CMP" // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ" r, _ := bits.Add64(x, y, ci) return r @@ -417,6 +426,7 @@ func Add64R(x, y, ci uint64) uint64 { func Add64M(p, q, r *[3]uint64) { var c uint64 r[0], c = bits.Add64(p[0], q[0], c) + // arm64:"ADCS",-"ADD\t",-"CMP" // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ" r[1], c = bits.Add64(p[1], q[1], c) r[2], c = bits.Add64(p[2], q[2], c) -- GitLab From e0181ff52a17eeddd20b8560ce4abaa615388dd0 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Tue, 19 Mar 2019 18:32:11 +0900 Subject: [PATCH 0529/1679] runtime: disable event scanning error reporting on solaris It seems like we need to pay special attention to capturing error condition on the event port of SmartOS. The previous attempt CL 167777 works on Oracle Solaris but doesn't work on SmartOS for the uncertain reason. It's better to disable the reporting for now. Updates #30624. Fixes #30840. Change-Id: Ieca5dac4fceb7e8c9cb4db149bb4c2e79691588c Reviewed-on: https://go-review.googlesource.com/c/go/+/167782 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/netpoll_solaris.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/runtime/netpoll_solaris.go b/src/runtime/netpoll_solaris.go index b4bb40ed9b..ddddb27962 100644 --- a/src/runtime/netpoll_solaris.go +++ b/src/runtime/netpoll_solaris.go @@ -233,10 +233,11 @@ retry: } if mode != 0 { - pd.everr = false - if ev.portev_events == _POLLERR { - pd.everr = true - } + // TODO(mikio): Consider implementing event + // scanning error reporting once we are sure + // about the event port on SmartOS. + // + // See golang.org/x/issue/30840. netpollready(&toRun, pd, mode) } } -- GitLab From 9e0e9ac5547a9cc5174cca79abaac0cdd3ec787e Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sun, 17 Mar 2019 11:56:29 +0700 Subject: [PATCH 0530/1679] os: fix windows Lstat missing name for some files On Windows, GetFileAttributesEx fails with ERROR_SHARING_VIOLATION for some files, like c:\pagefile.sys. In this case, newFileStatFromWin32finddata is used to fill file info, but it does not fill name and path. After getting file stat from newFileStatFromWin32finddata, just set file info name and path before return fixes the issue. Fixes #30883 Change-Id: I654e96c634e8a9bf5ce7e1aaa93968e88953620d Reviewed-on: https://go-review.googlesource.com/c/go/+/167779 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Alex Brainman --- src/os/os_windows_test.go | 5 ++++- src/os/stat_windows.go | 16 +++++++--------- src/os/types_windows.go | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/os/os_windows_test.go b/src/os/os_windows_test.go index 0b42e089bd..326670cc9d 100644 --- a/src/os/os_windows_test.go +++ b/src/os/os_windows_test.go @@ -755,8 +755,11 @@ func TestReadStdin(t *testing.T) { } func TestStatPagefile(t *testing.T) { - _, err := os.Stat(`c:\pagefile.sys`) + fi, err := os.Stat(`c:\pagefile.sys`) if err == nil { + if fi.Name() == "" { + t.Fatal(`FileInfo of c:\pagefile.sys has empty name`) + } return } if os.IsNotExist(err) { diff --git a/src/os/stat_windows.go b/src/os/stat_windows.go index 271ff5f843..fd22ef21ab 100644 --- a/src/os/stat_windows.go +++ b/src/os/stat_windows.go @@ -80,7 +80,6 @@ func stat(funcname, name string, createFileAttrs uint32) (FileInfo, error) { if err == nil && fa.FileAttributes&syscall.FILE_ATTRIBUTE_REPARSE_POINT == 0 { // Not a symlink. fs := &fileStat{ - path: name, FileAttributes: fa.FileAttributes, CreationTime: fa.CreationTime, LastAccessTime: fa.LastAccessTime, @@ -88,14 +87,9 @@ func stat(funcname, name string, createFileAttrs uint32) (FileInfo, error) { FileSizeHigh: fa.FileSizeHigh, FileSizeLow: fa.FileSizeLow, } - // Gather full path to be used by os.SameFile later. - if !isAbs(fs.path) { - fs.path, err = syscall.FullPath(fs.path) - if err != nil { - return nil, &PathError{"FullPath", name, err} - } + if err := fs.saveInfoFromPath(name); err != nil { + return nil, err } - fs.name = basename(name) return fs, nil } // GetFileAttributesEx fails with ERROR_SHARING_VIOLATION error for @@ -107,7 +101,11 @@ func stat(funcname, name string, createFileAttrs uint32) (FileInfo, error) { return nil, &PathError{"FindFirstFile", name, err} } syscall.FindClose(sh) - return newFileStatFromWin32finddata(&fd), nil + fs := newFileStatFromWin32finddata(&fd) + if err := fs.saveInfoFromPath(name); err != nil { + return nil, err + } + return fs, nil } // Finally use CreateFile. diff --git a/src/os/types_windows.go b/src/os/types_windows.go index 5e33292bec..3d1a6674b1 100644 --- a/src/os/types_windows.go +++ b/src/os/types_windows.go @@ -189,6 +189,21 @@ func (fs *fileStat) loadFileId() error { return nil } +// saveInfoFromPath saves full path of the file to be used by os.SameFile later, +// and set name from path. +func (fs *fileStat) saveInfoFromPath(path string) error { + fs.path = path + if !isAbs(fs.path) { + var err error + fs.path, err = syscall.FullPath(fs.path) + if err != nil { + return &PathError{"FullPath", path, err} + } + } + fs.name = basename(path) + return nil +} + // devNullStat is fileStat structure describing DevNull file ("NUL"). var devNullStat = fileStat{ name: DevNull, -- GitLab From b41eef244319df4f7431728ac7671cdbe8449778 Mon Sep 17 00:00:00 2001 From: Jonathan Amsterdam Date: Mon, 18 Mar 2019 08:06:49 -0400 Subject: [PATCH 0531/1679] os: add PathError.Unwrap Add an Unwrap method to PathError so it works with the errors.Is/As functions. Change-Id: Ia6171c0418584f3cd53ee99d97c687941a9e3109 Reviewed-on: https://go-review.googlesource.com/c/go/+/168097 Reviewed-by: Damien Neil --- src/os/error.go | 2 ++ src/os/error_test.go | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/os/error.go b/src/os/error.go index b4242a4829..16e5cb5786 100644 --- a/src/os/error.go +++ b/src/os/error.go @@ -32,6 +32,8 @@ type PathError struct { func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() } +func (e *PathError) Unwrap() error { return e.Err } + // Timeout reports whether this error represents a timeout. func (e *PathError) Timeout() bool { t, ok := e.Err.(timeout) diff --git a/src/os/error_test.go b/src/os/error_test.go index 3499ceec95..0e3570996e 100644 --- a/src/os/error_test.go +++ b/src/os/error_test.go @@ -5,6 +5,7 @@ package os_test import ( + "errors" "fmt" "io/ioutil" "os" @@ -155,3 +156,10 @@ func TestErrPathNUL(t *testing.T) { t.Fatal("Open should have failed") } } + +func TestPathErrorUnwrap(t *testing.T) { + pe := &os.PathError{Err: os.ErrInvalid} + if !errors.Is(pe, os.ErrInvalid) { + t.Error("errors.Is failed, wanted success") + } +} -- GitLab From 1b5b08d10a372ef3e3a21442fade2d2b4e3be343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:50:29 +0100 Subject: [PATCH 0532/1679] cmd/nm: fix cgo tests for aix/ppc64 This commit handles AIX cgo in cmd/nm tests. Change-Id: I6753a0102e4f2c4c7bd4d7c999f62a0cb3d2183c Reviewed-on: https://go-review.googlesource.com/c/go/+/164017 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/nm/nm_cgo_test.go | 2 ++ src/cmd/nm/nm_test.go | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/cmd/nm/nm_cgo_test.go b/src/cmd/nm/nm_cgo_test.go index 1dfdf7f21a..143a297e05 100644 --- a/src/cmd/nm/nm_cgo_test.go +++ b/src/cmd/nm/nm_cgo_test.go @@ -20,6 +20,8 @@ func canInternalLink() bool { case "arm64", "mips64", "mips64le", "mips", "mipsle", "ppc64", "ppc64le": return false } + case "aix": + return false } return true } diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go index 8176ddd7f4..e47d57d9cb 100644 --- a/src/cmd/nm/nm_test.go +++ b/src/cmd/nm/nm_test.go @@ -136,6 +136,11 @@ func testGoExec(t *testing.T, iscgo, isexternallinker bool) { "runtime.noptrdata": "D", } + if runtime.GOOS == "aix" && iscgo { + // pclntab is moved to .data section on AIX. + runtimeSyms["runtime.epclntab"] = "D" + } + out, err = exec.Command(testnmpath, exe).CombinedOutput() if err != nil { t.Fatalf("go tool nm: %v\n%s", err, string(out)) @@ -146,7 +151,10 @@ func testGoExec(t *testing.T, iscgo, isexternallinker bool) { // On AIX, .data and .bss addresses are changed by the loader. // Therefore, the values returned by the exec aren't the same // than the ones inside the symbol table. + // In case of cgo, .text symbols are also changed. switch code { + case "T", "t", "R", "r": + return iscgo case "D", "d", "B", "b": return true } @@ -267,6 +275,9 @@ func testGoLib(t *testing.T, iscgo bool) { if runtime.GOOS == "darwin" || (runtime.GOOS == "windows" && runtime.GOARCH == "386") { syms = append(syms, symType{"D", "_cgodata", true, false}) syms = append(syms, symType{"T", "_cgofunc", true, false}) + } else if runtime.GOOS == "aix" { + syms = append(syms, symType{"D", "cgodata", true, false}) + syms = append(syms, symType{"T", ".cgofunc", true, false}) } else { syms = append(syms, symType{"D", "cgodata", true, false}) syms = append(syms, symType{"T", "cgofunc", true, false}) -- GitLab From 125d187f9ac013cd23daaf447962622f38d3826c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:56:35 +0100 Subject: [PATCH 0533/1679] cmd/dist, misc/cgo: enable tests for aix/ppc64 Some cgo tests aren't yet available on aix/ppc64. -shared and -static don't work as expected and will be fixed latter. Updates #30565 Change-Id: Ic59cabe685cb1cbdf89a8d1d1a1d2c4b0e8ef442 Reviewed-on: https://go-review.googlesource.com/c/go/+/164018 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/cthread_unix.c | 2 +- misc/cgo/test/issue18146.go | 2 ++ misc/cgo/testso/so_test.go | 7 ++++++- misc/cgo/testsovar/so_test.go | 7 ++++++- src/cmd/dist/test.go | 12 +++++++++--- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/misc/cgo/test/cthread_unix.c b/misc/cgo/test/cthread_unix.c index 6323e4980e..247d636d06 100644 --- a/misc/cgo/test/cthread_unix.c +++ b/misc/cgo/test/cthread_unix.c @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris #include #include "_cgo_export.h" diff --git a/misc/cgo/test/issue18146.go b/misc/cgo/test/issue18146.go index 6483903fed..0605a24ee9 100644 --- a/misc/cgo/test/issue18146.go +++ b/misc/cgo/test/issue18146.go @@ -46,6 +46,8 @@ func test18146(t *testing.T) { switch runtime.GOOS { default: setNproc = false + case "aix": + nproc = 9 case "linux": nproc = 6 case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd": diff --git a/misc/cgo/testso/so_test.go b/misc/cgo/testso/so_test.go index 500b08fae8..68388caa90 100644 --- a/misc/cgo/testso/so_test.go +++ b/misc/cgo/testso/so_test.go @@ -25,7 +25,12 @@ func requireTestSOSupported(t *testing.T) { t.Skip("No exec facility on iOS.") } case "ppc64": - t.Skip("External linking not implemented on ppc64 (issue #8912).") + if runtime.GOOS == "linux" { + t.Skip("External linking not implemented on aix/ppc64 (issue #8912).") + } + if runtime.GOOS == "aix" { + t.Skip("Using shared object isn't yet available on aix/ppc64 (issue #30565)") + } case "mips64le", "mips64": t.Skip("External linking not implemented on mips64.") } diff --git a/misc/cgo/testsovar/so_test.go b/misc/cgo/testsovar/so_test.go index 500b08fae8..68388caa90 100644 --- a/misc/cgo/testsovar/so_test.go +++ b/misc/cgo/testsovar/so_test.go @@ -25,7 +25,12 @@ func requireTestSOSupported(t *testing.T) { t.Skip("No exec facility on iOS.") } case "ppc64": - t.Skip("External linking not implemented on ppc64 (issue #8912).") + if runtime.GOOS == "linux" { + t.Skip("External linking not implemented on aix/ppc64 (issue #8912).") + } + if runtime.GOOS == "aix" { + t.Skip("Using shared object isn't yet available on aix/ppc64 (issue #30565)") + } case "mips64le", "mips64": t.Skip("External linking not implemented on mips64.") } diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 5ecef4494d..eaed9c4946 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -877,7 +877,8 @@ func (t *tester) out(v string) { func (t *tester) extLink() bool { pair := gohostos + "-" + goarch switch pair { - case "android-arm", + case "aix-ppc64", + "android-arm", "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64", "dragonfly-amd64", "freebsd-386", "freebsd-amd64", "freebsd-arm", @@ -912,6 +913,10 @@ func (t *tester) internalLink() bool { if goarch == "arm64" || goarch == "mips64" || goarch == "mips64le" || goarch == "mips" || goarch == "mipsle" { return false } + if goos == "aix" { + // linkmode=internal isn't supported. + return false + } return true } @@ -1013,7 +1018,8 @@ func (t *tester) cgoTest(dt *distTest) error { } t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external") t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external -s") - case "android-arm", + case "aix-ppc64", + "android-arm", "dragonfly-amd64", "freebsd-386", "freebsd-amd64", "freebsd-arm", "linux-386", "linux-amd64", "linux-arm", "linux-ppc64le", "linux-s390x", @@ -1027,7 +1033,7 @@ func (t *tester) cgoTest(dt *distTest) error { t.addCmd(dt, "misc/cgo/testtls", t.goTest(), "-ldflags", "-linkmode=external") switch pair { - case "netbsd-386", "netbsd-amd64": + case "aix-ppc64", "netbsd-386", "netbsd-amd64": // no static linking case "freebsd-arm": // -fPIC compiled tls code will use __tls_get_addr instead -- GitLab From af7b7571c4575748cf8cb2ffe683e97286666e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 21 Feb 2019 10:58:42 +0100 Subject: [PATCH 0534/1679] cmd/dist: enable cgo for aix/ppc64 Change-Id: I78be2b0b857d1ea2fb0b6906eb5afd796580f52d Reviewed-on: https://go-review.googlesource.com/c/go/+/164019 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/dist/build.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 539227232a..b3e9ad33e9 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1459,7 +1459,7 @@ func checkNotStale(goBinary string, targets ...string) { // single point of truth for supported platforms. This list is used // by 'go tool dist list'. var cgoEnabled = map[string]bool{ - "aix/ppc64": false, + "aix/ppc64": true, "darwin/386": true, "darwin/amd64": true, "darwin/arm": true, -- GitLab From a919b760378343a211719991a9e0b1b819ac9f3d Mon Sep 17 00:00:00 2001 From: Damien Neil Date: Tue, 19 Feb 2019 13:03:55 -0800 Subject: [PATCH 0535/1679] os: make errors.Is work with ErrPermission et al. As proposed in Issue #29934, update errors produced by the os package to work with errors.Is sentinel tests. For example, errors.Is(err, os.ErrPermission) is equivalent to os.IsPermission(err) with added unwrapping support. Move the definition for os.ErrPermission and others into the syscall package. Add an Is method to syscall.Errno and others. Add an Unwrap method to os.PathError and others. Updates #30322 Updates #29934 Change-Id: I95727d26c18a5354c720de316dff0bffc04dd926 Reviewed-on: https://go-review.googlesource.com/c/go/+/163058 Reviewed-by: Marcel van Lohuizen --- src/fmt/errors_test.go | 4 +-- src/go/build/deps_test.go | 5 ++-- src/internal/oserror/errors.go | 20 ++++++++++++++ src/os/error.go | 49 +++++++++++++++++++++++++++------- src/os/error_plan9.go | 44 ------------------------------ src/os/error_test.go | 20 +++++++++++--- src/os/error_unix.go | 24 ----------------- src/os/error_windows.go | 28 ------------------- src/os/file.go | 4 +++ src/syscall/syscall_js.go | 17 ++++++++++++ src/syscall/syscall_nacl.go | 17 ++++++++++++ src/syscall/syscall_plan9.go | 44 +++++++++++++++++++++++++++++- src/syscall/syscall_unix.go | 17 ++++++++++++ src/syscall/syscall_windows.go | 23 ++++++++++++++++ 14 files changed, 201 insertions(+), 115 deletions(-) create mode 100644 src/internal/oserror/errors.go delete mode 100644 src/os/error_plan9.go delete mode 100644 src/os/error_unix.go delete mode 100644 src/os/error_windows.go diff --git a/src/fmt/errors_test.go b/src/fmt/errors_test.go index 0183ba77e5..39f247e06d 100644 --- a/src/fmt/errors_test.go +++ b/src/fmt/errors_test.go @@ -157,8 +157,8 @@ func TestErrorFormatter(t *testing.T) { want: "fallback:" + "\n somefile.go:123" + "\n - file does not exist:" + - "\n os.init" + - "\n .+/os/error.go:\\d\\d", + "\n .*" + + "\n .+.go:\\d+", regexp: true, }, { err: &wrapped{"outer", diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 31a5d2741d..df1d8dd3b3 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -146,8 +146,9 @@ var pkgDeps = map[string][]string{ // End of linear dependency definitions. // Operating system access. - "syscall": {"L0", "internal/race", "internal/syscall/windows/sysdll", "syscall/js", "unicode/utf16"}, + "syscall": {"L0", "internal/oserror", "internal/race", "internal/syscall/windows/sysdll", "syscall/js", "unicode/utf16"}, "syscall/js": {"L0"}, + "internal/oserror": {"L0"}, "internal/syscall/unix": {"L0", "syscall"}, "internal/syscall/windows": {"L0", "syscall", "internal/syscall/windows/sysdll"}, "internal/syscall/windows/registry": {"L0", "syscall", "internal/syscall/windows/sysdll", "unicode/utf16"}, @@ -167,7 +168,7 @@ var pkgDeps = map[string][]string{ "internal/poll": {"L0", "internal/race", "syscall", "time", "unicode/utf16", "unicode/utf8", "internal/syscall/windows"}, "internal/testlog": {"L0"}, - "os": {"L1", "os", "syscall", "time", "internal/poll", "internal/syscall/windows", "internal/syscall/unix", "internal/testlog"}, + "os": {"L1", "os", "syscall", "time", "internal/oserror", "internal/poll", "internal/syscall/windows", "internal/syscall/unix", "internal/testlog"}, "path/filepath": {"L2", "os", "syscall", "internal/syscall/windows"}, "io/ioutil": {"L2", "os", "path/filepath", "time"}, "os/exec": {"L2", "os", "context", "path/filepath", "syscall"}, diff --git a/src/internal/oserror/errors.go b/src/internal/oserror/errors.go new file mode 100644 index 0000000000..66ed7faaba --- /dev/null +++ b/src/internal/oserror/errors.go @@ -0,0 +1,20 @@ +// Copyright 2019 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 oserror defines errors values used in the os package. +// +// These types are defined here to permit the syscall package to reference them. +package oserror + +import "errors" + +var ( + ErrInvalid = errors.New("invalid argument") + ErrPermission = errors.New("permission denied") + ErrExist = errors.New("file already exists") + ErrNotExist = errors.New("file does not exist") + ErrClosed = errors.New("file already closed") + ErrTemporary = errors.New("temporary error") + ErrTimeout = errors.New("deadline exceeded") +) diff --git a/src/os/error.go b/src/os/error.go index 16e5cb5786..4cf35f2b77 100644 --- a/src/os/error.go +++ b/src/os/error.go @@ -5,20 +5,35 @@ package os import ( - "errors" + "internal/oserror" "internal/poll" ) // Portable analogs of some common system call errors. +// +// Errors returned from this package may be tested against these errors +// with errors.Is. var ( - ErrInvalid = errors.New("invalid argument") // methods on File will return this error when the receiver is nil - ErrPermission = errors.New("permission denied") - ErrExist = errors.New("file already exists") - ErrNotExist = errors.New("file does not exist") - ErrClosed = errors.New("file already closed") - ErrNoDeadline = poll.ErrNoDeadline + // ErrInvalid indicates an invalid argument. + // Methods on File will return this error when the receiver is nil. + ErrInvalid = errInvalid() // "invalid argument" + + ErrPermission = errPermission() // "permission denied" + ErrExist = errExist() // "file already exists" + ErrNotExist = errNotExist() // "file does not exist" + ErrClosed = errClosed() // "file already closed" + ErrTimeout = errTimeout() // "deadline exceeded" + ErrNoDeadline = errNoDeadline() // "file type does not support deadline" ) +func errInvalid() error { return oserror.ErrInvalid } +func errPermission() error { return oserror.ErrPermission } +func errExist() error { return oserror.ErrExist } +func errNotExist() error { return oserror.ErrNotExist } +func errClosed() error { return oserror.ErrClosed } +func errTimeout() error { return oserror.ErrTimeout } +func errNoDeadline() error { return poll.ErrNoDeadline } + type timeout interface { Timeout() bool } @@ -48,6 +63,8 @@ type SyscallError struct { func (e *SyscallError) Error() string { return e.Syscall + ": " + e.Err.Error() } +func (e *SyscallError) Unwrap() error { return e.Err } + // Timeout reports whether this error represents a timeout. func (e *SyscallError) Timeout() bool { t, ok := e.Err.(timeout) @@ -68,21 +85,21 @@ func NewSyscallError(syscall string, err error) error { // that a file or directory already exists. It is satisfied by ErrExist as // well as some syscall errors. func IsExist(err error) bool { - return isExist(err) + return underlyingErrorIs(err, ErrExist) } // IsNotExist returns a boolean indicating whether the error is known to // report that a file or directory does not exist. It is satisfied by // ErrNotExist as well as some syscall errors. func IsNotExist(err error) bool { - return isNotExist(err) + return underlyingErrorIs(err, ErrNotExist) } // IsPermission returns a boolean indicating whether the error is known to // report that permission is denied. It is satisfied by ErrPermission as well // as some syscall errors. func IsPermission(err error) bool { - return isPermission(err) + return underlyingErrorIs(err, ErrPermission) } // IsTimeout returns a boolean indicating whether the error is known @@ -92,6 +109,18 @@ func IsTimeout(err error) bool { return ok && terr.Timeout() } +func underlyingErrorIs(err, target error) bool { + // Note that this function is not errors.Is: + // underlyingError only unwraps the specific error-wrapping types + // that it historically did, not all errors.Wrapper implementations. + err = underlyingError(err) + if err == target { + return true + } + e, ok := err.(interface{ Is(error) bool }) + return ok && e.Is(target) +} + // underlyingError returns the underlying error for known os error types. func underlyingError(err error) error { switch err := err.(type) { diff --git a/src/os/error_plan9.go b/src/os/error_plan9.go deleted file mode 100644 index b82bf0dea3..0000000000 --- a/src/os/error_plan9.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2011 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 os - -func isExist(err error) bool { - return checkErrMessageContent(err, "exists", "is a directory") -} - -func isNotExist(err error) bool { - return checkErrMessageContent(err, "does not exist", "not found", - "has been removed", "no parent") -} - -func isPermission(err error) bool { - return checkErrMessageContent(err, "permission denied") -} - -// checkErrMessageContent checks if err message contains one of msgs. -func checkErrMessageContent(err error, msgs ...string) bool { - if err == nil { - return false - } - err = underlyingError(err) - for _, msg := range msgs { - if contains(err.Error(), msg) { - return true - } - } - return false -} - -// contains is a local version of strings.Contains. It knows len(sep) > 1. -func contains(s, sep string) bool { - n := len(sep) - c := sep[0] - for i := 0; i+n <= len(s); i++ { - if s[i] == c && s[i:i+n] == sep { - return true - } - } - return false -} diff --git a/src/os/error_test.go b/src/os/error_test.go index 0e3570996e..a03bd28b9a 100644 --- a/src/os/error_test.go +++ b/src/os/error_test.go @@ -27,7 +27,7 @@ func TestErrIsExist(t *testing.T) { t.Fatal("Open should have failed") return } - if s := checkErrorPredicate("os.IsExist", os.IsExist, err); s != "" { + if s := checkErrorPredicate("os.IsExist", os.IsExist, err, os.ErrExist); s != "" { t.Fatal(s) return } @@ -39,7 +39,7 @@ func testErrNotExist(name string) string { f.Close() return "Open should have failed" } - if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" { + if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err, os.ErrNotExist); s != "" { return s } @@ -47,7 +47,7 @@ func testErrNotExist(name string) string { if err == nil { return "Chdir should have failed" } - if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err); s != "" { + if s := checkErrorPredicate("os.IsNotExist", os.IsNotExist, err, os.ErrNotExist); s != "" { return s } return "" @@ -74,10 +74,13 @@ func TestErrIsNotExist(t *testing.T) { } } -func checkErrorPredicate(predName string, pred func(error) bool, err error) string { +func checkErrorPredicate(predName string, pred func(error) bool, err, target error) string { if !pred(err) { return fmt.Sprintf("%s does not work as expected for %#v", predName, err) } + if !errors.Is(err, target) { + return fmt.Sprintf("errors.Is(%#v, %#v) = false, want true", err, target) + } return "" } @@ -108,9 +111,15 @@ func TestIsExist(t *testing.T) { if is := os.IsExist(tt.err); is != tt.is { t.Errorf("os.IsExist(%T %v) = %v, want %v", tt.err, tt.err, is, tt.is) } + if is := errors.Is(tt.err, os.ErrExist); is != tt.is { + t.Errorf("errors.Is(%T %v, os.ErrExist) = %v, want %v", tt.err, tt.err, is, tt.is) + } if isnot := os.IsNotExist(tt.err); isnot != tt.isnot { t.Errorf("os.IsNotExist(%T %v) = %v, want %v", tt.err, tt.err, isnot, tt.isnot) } + if isnot := errors.Is(tt.err, os.ErrNotExist); isnot != tt.isnot { + t.Errorf("errors.Is(%T %v, os.ErrNotExist) = %v, want %v", tt.err, tt.err, isnot, tt.isnot) + } } } @@ -130,6 +139,9 @@ func TestIsPermission(t *testing.T) { if got := os.IsPermission(tt.err); got != tt.want { t.Errorf("os.IsPermission(%#v) = %v; want %v", tt.err, got, tt.want) } + if got := errors.Is(tt.err, os.ErrPermission); got != tt.want { + t.Errorf("errors.Is(%#v, os.ErrPermission) = %v; want %v", tt.err, got, tt.want) + } } } diff --git a/src/os/error_unix.go b/src/os/error_unix.go deleted file mode 100644 index bb6bbcc1e6..0000000000 --- a/src/os/error_unix.go +++ /dev/null @@ -1,24 +0,0 @@ -// 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. - -// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris - -package os - -import "syscall" - -func isExist(err error) bool { - err = underlyingError(err) - return err == syscall.EEXIST || err == syscall.ENOTEMPTY || err == ErrExist -} - -func isNotExist(err error) bool { - err = underlyingError(err) - return err == syscall.ENOENT || err == ErrNotExist -} - -func isPermission(err error) bool { - err = underlyingError(err) - return err == syscall.EACCES || err == syscall.EPERM || err == ErrPermission -} diff --git a/src/os/error_windows.go b/src/os/error_windows.go deleted file mode 100644 index 02593b53fe..0000000000 --- a/src/os/error_windows.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2012 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 os - -import "syscall" - -func isExist(err error) bool { - err = underlyingError(err) - return err == syscall.ERROR_ALREADY_EXISTS || - err == syscall.ERROR_DIR_NOT_EMPTY || - err == syscall.ERROR_FILE_EXISTS || err == ErrExist -} - -const _ERROR_BAD_NETPATH = syscall.Errno(53) - -func isNotExist(err error) bool { - err = underlyingError(err) - return err == syscall.ERROR_FILE_NOT_FOUND || - err == _ERROR_BAD_NETPATH || - err == syscall.ERROR_PATH_NOT_FOUND || err == ErrNotExist -} - -func isPermission(err error) bool { - err = underlyingError(err) - return err == syscall.ERROR_ACCESS_DENIED || err == ErrPermission -} diff --git a/src/os/file.go b/src/os/file.go index 5f715f4275..a44263ee8a 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -98,6 +98,10 @@ func (e *LinkError) Error() string { return e.Op + " " + e.Old + " " + e.New + ": " + e.Err.Error() } +func (e *LinkError) Unwrap() error { + return e.Err +} + // Read reads up to len(b) bytes from the File. // It returns the number of bytes read and any error encountered. // At end of file, Read returns 0, io.EOF. diff --git a/src/syscall/syscall_js.go b/src/syscall/syscall_js.go index 2e1a9ec9f1..4dfcc6ed64 100644 --- a/src/syscall/syscall_js.go +++ b/src/syscall/syscall_js.go @@ -7,6 +7,7 @@ package syscall import ( + "internal/oserror" "sync" "unsafe" ) @@ -55,6 +56,22 @@ func (e Errno) Error() string { return "errno " + itoa(int(e)) } +func (e Errno) Is(target error) bool { + switch target { + case oserror.ErrTemporary: + return e.Temporary() + case oserror.ErrTimeout: + return e.Timeout() + case oserror.ErrPermission: + return e == EACCES || e == EPERM + case oserror.ErrExist: + return e == EEXIST || e == ENOTEMPTY + case oserror.ErrNotExist: + return e == ENOENT + } + return false +} + func (e Errno) Temporary() bool { return e == EINTR || e == EMFILE || e.Timeout() } diff --git a/src/syscall/syscall_nacl.go b/src/syscall/syscall_nacl.go index 1102cd66e3..3fc504fd9f 100644 --- a/src/syscall/syscall_nacl.go +++ b/src/syscall/syscall_nacl.go @@ -5,6 +5,7 @@ package syscall import ( + "internal/oserror" "sync" "unsafe" ) @@ -62,6 +63,22 @@ func (e Errno) Error() string { return "errno " + itoa(int(e)) } +func (e Errno) Is(target error) bool { + switch target { + case oserror.ErrTemporary: + return e.Temporary() + case oserror.ErrTimeout: + return e.Timeout() + case oserror.ErrPermission: + return e == EACCES || e == EPERM + case oserror.ErrExist: + return e == EEXIST || e == ENOTEMPTY + case oserror.ErrNotExist: + return e == ENOENT + } + return false +} + func (e Errno) Temporary() bool { return e == EINTR || e == EMFILE || e.Timeout() } diff --git a/src/syscall/syscall_plan9.go b/src/syscall/syscall_plan9.go index 48513c73c9..9b5a2940b0 100644 --- a/src/syscall/syscall_plan9.go +++ b/src/syscall/syscall_plan9.go @@ -11,7 +11,10 @@ package syscall -import "unsafe" +import ( + "internal/oserror" + "unsafe" +) const ImplementsGetwd = true const bitSize16 = 2 @@ -24,6 +27,45 @@ func (e ErrorString) Error() string { return string(e) } // NewError converts s to an ErrorString, which satisfies the Error interface. func NewError(s string) error { return ErrorString(s) } +func (e ErrorString) Is(target error) bool { + switch target { + case oserror.ErrTemporary: + return e.Temporary() + case oserror.ErrTimeout: + return e.Timeout() + case oserror.ErrPermission: + return checkErrMessageContent(e, "permission denied") + case oserror.ErrExist: + return checkErrMessageContent(e, "exists", "is a directory") + case oserror.ErrNotExist: + return checkErrMessageContent(e, "does not exist", "not found", + "has been removed", "no parent") + } + return false +} + +// checkErrMessageContent checks if err message contains one of msgs. +func checkErrMessageContent(e ErrorString, msgs ...string) bool { + for _, msg := range msgs { + if contains(string(e), msg) { + return true + } + } + return false +} + +// contains is a local version of strings.Contains. It knows len(sep) > 1. +func contains(s, sep string) bool { + n := len(sep) + c := sep[0] + for i := 0; i+n <= len(s); i++ { + if s[i] == c && s[i:i+n] == sep { + return true + } + } + return false +} + func (e ErrorString) Temporary() bool { return e == EINTR || e == EMFILE || e.Timeout() } diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go index 4336851554..fd54dc0dc7 100644 --- a/src/syscall/syscall_unix.go +++ b/src/syscall/syscall_unix.go @@ -7,6 +7,7 @@ package syscall import ( + "internal/oserror" "internal/race" "runtime" "sync" @@ -120,6 +121,22 @@ func (e Errno) Error() string { return "errno " + itoa(int(e)) } +func (e Errno) Is(target error) bool { + switch target { + case oserror.ErrTemporary: + return e.Temporary() + case oserror.ErrTimeout: + return e.Timeout() + case oserror.ErrPermission: + return e == EACCES || e == EPERM + case oserror.ErrExist: + return e == EEXIST || e == ENOTEMPTY + case oserror.ErrNotExist: + return e == ENOENT + } + return false +} + func (e Errno) Temporary() bool { return e == EINTR || e == EMFILE || e.Timeout() } diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go index de05840386..22c9e50a44 100644 --- a/src/syscall/syscall_windows.go +++ b/src/syscall/syscall_windows.go @@ -8,6 +8,7 @@ package syscall import ( errorspkg "errors" + "internal/oserror" "internal/race" "runtime" "sync" @@ -110,6 +111,28 @@ func (e Errno) Error() string { return string(utf16.Decode(b[:n])) } +const _ERROR_BAD_NETPATH = Errno(53) + +func (e Errno) Is(target error) bool { + switch target { + case oserror.ErrTemporary: + return e.Temporary() + case oserror.ErrTimeout: + return e.Timeout() + case oserror.ErrPermission: + return e == ERROR_ACCESS_DENIED + case oserror.ErrExist: + return e == ERROR_ALREADY_EXISTS || + e == ERROR_DIR_NOT_EMPTY || + e == ERROR_FILE_EXISTS + case oserror.ErrNotExist: + return e == ERROR_FILE_NOT_FOUND || + e == _ERROR_BAD_NETPATH || + e == ERROR_PATH_NOT_FOUND + } + return false +} + func (e Errno) Temporary() bool { return e == EINTR || e == EMFILE || e.Timeout() } -- GitLab From fd270d8b579cc9dd4ced34fa7605a444794a787d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 20 Mar 2019 16:17:56 +0000 Subject: [PATCH 0536/1679] cmd: update vendored x/tools MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This lets us get rid of a handful of cmd/vet/whitelist/all.txt entries, since the stdmethods pass is now happy with the encoding/xml package. Change-Id: I9de2190984dd00342903967262790c7f6b1f0a75 Reviewed-on: https://go-review.googlesource.com/c/go/+/168458 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go.mod | 6 +- src/cmd/go.sum | 17 +- .../x/crypto/ssh/terminal/util_windows.go | 6 +- src/cmd/vendor/golang.org/x/sys/unix/mkall.sh | 4 +- .../vendor/golang.org/x/sys/unix/mkerrors.sh | 2 + .../vendor/golang.org/x/sys/unix/mksyscall.go | 2 +- .../golang.org/x/sys/unix/sockcmsg_unix.go | 4 +- .../golang.org/x/sys/unix/syscall_aix.go | 2 + .../golang.org/x/sys/unix/syscall_linux.go | 40 ++++ .../x/sys/unix/syscall_linux_arm.go | 6 + .../x/sys/unix/syscall_linux_arm64.go | 13 ++ .../x/sys/unix/syscall_linux_riscv64.go | 13 ++ .../golang.org/x/sys/unix/syscall_openbsd.go | 17 ++ .../golang.org/x/sys/unix/syscall_unix.go | 37 ++++ .../golang.org/x/sys/unix/types_openbsd.go | 6 + .../x/sys/unix/zerrors_linux_386.go | 57 +++++- .../x/sys/unix/zerrors_linux_amd64.go | 57 +++++- .../x/sys/unix/zerrors_linux_arm.go | 57 +++++- .../x/sys/unix/zerrors_linux_arm64.go | 57 +++++- .../x/sys/unix/zerrors_linux_mips.go | 57 +++++- .../x/sys/unix/zerrors_linux_mips64.go | 57 +++++- .../x/sys/unix/zerrors_linux_mips64le.go | 57 +++++- .../x/sys/unix/zerrors_linux_mipsle.go | 57 +++++- .../x/sys/unix/zerrors_linux_ppc64.go | 57 +++++- .../x/sys/unix/zerrors_linux_ppc64le.go | 57 +++++- .../x/sys/unix/zerrors_linux_riscv64.go | 57 +++++- .../x/sys/unix/zerrors_linux_s390x.go | 57 +++++- .../x/sys/unix/zerrors_linux_sparc64.go | 57 +++++- .../x/sys/unix/zsyscall_aix_ppc64.go | 8 + .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 10 + .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 9 + .../x/sys/unix/zsyscall_linux_386.go | 21 +++ .../x/sys/unix/zsyscall_linux_amd64.go | 21 +++ .../x/sys/unix/zsyscall_linux_arm.go | 31 ++++ .../x/sys/unix/zsyscall_linux_arm64.go | 36 ++++ .../x/sys/unix/zsyscall_linux_mips.go | 21 +++ .../x/sys/unix/zsyscall_linux_mips64.go | 21 +++ .../x/sys/unix/zsyscall_linux_mips64le.go | 21 +++ .../x/sys/unix/zsyscall_linux_mipsle.go | 21 +++ .../x/sys/unix/zsyscall_linux_ppc64.go | 21 +++ .../x/sys/unix/zsyscall_linux_ppc64le.go | 21 +++ .../x/sys/unix/zsyscall_linux_riscv64.go | 36 ++++ .../x/sys/unix/zsyscall_linux_s390x.go | 21 +++ .../x/sys/unix/zsyscall_linux_sparc64.go | 21 +++ .../x/sys/unix/zsysnum_linux_arm64.go | 1 + .../x/sys/unix/zsysnum_linux_riscv64.go | 1 + .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + .../golang.org/x/sys/unix/ztypes_linux_386.go | 58 +++++- .../x/sys/unix/ztypes_linux_amd64.go | 58 +++++- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 58 +++++- .../x/sys/unix/ztypes_linux_arm64.go | 58 +++++- .../x/sys/unix/ztypes_linux_mips.go | 58 +++++- .../x/sys/unix/ztypes_linux_mips64.go | 58 +++++- .../x/sys/unix/ztypes_linux_mips64le.go | 58 +++++- .../x/sys/unix/ztypes_linux_mipsle.go | 58 +++++- .../x/sys/unix/ztypes_linux_ppc64.go | 58 +++++- .../x/sys/unix/ztypes_linux_ppc64le.go | 58 +++++- .../x/sys/unix/ztypes_linux_riscv64.go | 58 +++++- .../x/sys/unix/ztypes_linux_s390x.go | 58 +++++- .../x/sys/unix/ztypes_linux_sparc64.go | 58 +++++- .../x/sys/unix/ztypes_openbsd_386.go | 10 + .../x/sys/unix/ztypes_openbsd_amd64.go | 10 + .../x/sys/unix/ztypes_openbsd_arm.go | 10 + .../golang.org/x/sys/windows/dll_windows.go | 8 +- .../x/sys/windows/security_windows.go | 171 ++++++++++++++++++ .../x/sys/windows/zsyscall_windows.go | 27 +++ .../analysis/passes/stdmethods/stdmethods.go | 10 +- src/cmd/vendor/modules.txt | 6 +- src/cmd/vet/all/whitelist/all.txt | 10 +- 69 files changed, 2078 insertions(+), 197 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index dd5dccd826..e0ac8cf6eb 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 // indirect golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 - golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 - golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 // indirect - golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 + golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a + golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca // indirect + golang.org/x/tools v0.0.0-20190320160634-b6b7807791df ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 4492808399..57bb4fa012 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -4,10 +4,13 @@ github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 h1:pKqc8lA github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 h1:Pn8fQdvx+z1avAi7fdM2kRYWQNxGlavNDSyzrQg2SsU= golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 h1:ng3VDlRp5/DHpSWl02R4rM9I+8M2rhmsuLwAMmkLQWE= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 h1:Zw7eRv6INHGfu15LVRN1vrrwusJbnfJjAZn3D1VkQIE= -golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 h1:2oZsfYnKfYzL4I57uYiRFsUf0bqlLkiuw8nnj3+voUA= -golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a h1:YX8ljsm6wXlHZO+aRz9Exqr0evNhKRNe5K/gi+zKh4U= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca h1:o2TLx1bGN3W+Ei0EMU5fShLupLmTOU95KvJJmfYhAzM= +golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190320160634-b6b7807791df h1:taFQs++Xc5kswn4bzUZyWI+ShGK1r9pFxQAiVZaRfto= +golang.org/x/tools v0.0.0-20190320160634-b6b7807791df/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go index 6cb8a95038..5cfdf8f3f0 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -64,13 +64,15 @@ func Restore(fd int, state *State) error { return windows.SetConsoleMode(windows.Handle(fd), state.mode) } -// GetSize returns the dimensions of the given terminal. +// GetSize returns the visible dimensions of the given terminal. +// +// These dimensions don't include any scrollback buffer height. func GetSize(fd int) (width, height int, err error) { var info windows.ConsoleScreenBufferInfo if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { return 0, 0, err } - return int(info.Size.X), int(info.Size.Y), nil + return int(info.Window.Right - info.Window.Left + 1), int(info.Window.Bottom - info.Window.Top + 1), nil } // ReadPassword reads a line of input from a terminal without local echo. This diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh index 75152f99b2..1e5c59d0dd 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkall.sh @@ -207,8 +207,6 @@ esac esac if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi - if [ -n "$mktypes" ]; then - echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + if [ -n "$mktypes" ]; then echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; fi if [ -n "$mkasm" ]; then echo "$mkasm $GOARCH"; fi - fi ) | $run diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh index 6a23484e5b..cfb61ba049 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/src/cmd/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -192,6 +192,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -501,6 +502,7 @@ ccflags="$@" $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || $2 ~/^PPPIOC/ || + $2 ~ /^FAN_|FANOTIFY_/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go index e06e4253ea..bed93d4890 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go @@ -228,7 +228,7 @@ func main() { } else { args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) } - } else if p.Type == "int64" && endianness != "" { + } else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { if len(args)%2 == 1 && *arm { // arm abi specifies 64-bit argument uses // (even, odd) pair diff --git a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go index 5f9ae233a7..26e8b36cfc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -25,8 +25,8 @@ func cmsgAlignOf(salen int) int { if SizeofPtr == 8 { salign = 4 } - case "openbsd": - // OpenBSD armv7 requires 64-bit alignment. + case "netbsd", "openbsd": + // NetBSD and OpenBSD armv7 require 64-bit alignment. if runtime.GOARCH == "arm" { salign = 8 } diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go index a76826f443..fd83d87509 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -545,3 +545,5 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { //sys gettimeofday(tv *Timeval, tzp *Timezone) (err error) //sysnb Time(t *Time_t) (tt Time_t, err error) //sys Utime(path string, buf *Utimbuf) (err error) + +//sys Getsystemcfg(label int) (n uint64) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go index 4bb86aa0fe..7e429ab2f9 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -39,6 +39,20 @@ func Creat(path string, mode uint32) (fd int, err error) { return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) } +//sys FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) +//sys fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) + +func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) (err error) { + if pathname == "" { + return fanotifyMark(fd, flags, mask, dirFd, nil) + } + p, err := BytePtrFromString(pathname) + if err != nil { + return err + } + return fanotifyMark(fd, flags, mask, dirFd, p) +} + //sys fchmodat(dirfd int, path string, mode uint32) (err error) func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { @@ -990,10 +1004,28 @@ func GetsockoptString(fd, level, opt int) (string, error) { return string(buf[:vallen-1]), nil } +func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { + var value TpacketStats + vallen := _Socklen(SizeofTpacketStats) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTpacketStatsV3(fd, level, opt int) (*TpacketStatsV3, error) { + var value TpacketStatsV3 + vallen := _Socklen(SizeofTpacketStatsV3) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) } +func SetsockoptPacketMreq(fd, level, opt int, mreq *PacketMreq) error { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + // SetsockoptSockFprog attaches a classic BPF or an extended BPF program to a // socket to filter incoming packets. See 'man 7 socket' for usage information. func SetsockoptSockFprog(fd, level, opt int, fprog *SockFprog) error { @@ -1008,6 +1040,14 @@ func SetsockoptCanRawFilter(fd, level, opt int, filter []CanFilter) error { return setsockopt(fd, level, opt, p, uintptr(len(filter)*SizeofCanFilter)) } +func SetsockoptTpacketReq(fd, level, opt int, tp *TpacketReq) error { + return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) +} + +func SetsockoptTpacketReq3(fd, level, opt int, tp *TpacketReq3) error { + return setsockopt(fd, level, opt, unsafe.Pointer(tp), unsafe.Sizeof(*tp)) +} + // Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) // KeyctlInt calls keyctl commands in which each argument is an int. diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index cda3559419..3a3c37b4c8 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -19,12 +19,18 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } +//sysnb pipe(p *[2]_C_int) (err error) + func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } var pp [2]_C_int + // Try pipe2 first for Android O, then try pipe for kernel 2.6.23. err = pipe2(&pp, 0) + if err == ENOSYS { + err = pipe(&pp) + } p[0] = int(pp[0]) p[1] = int(pp[1]) return diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 6d56722401..cb20b15d5d 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -208,3 +208,16 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { } return ppoll(&fds[0], len(fds), ts, nil) } + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index f23ca451c7..6230f64052 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -211,3 +211,16 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0) } + +//sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) + +func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { + cmdlineLen := len(cmdline) + if cmdlineLen > 0 { + // Account for the additional NULL byte added by + // BytePtrFromString in kexecFileLoad. The kexec_file_load + // syscall expects a NULL-terminated string. + cmdlineLen++ + } + return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 687999549c..c8648ec026 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -43,6 +43,23 @@ func nametomib(name string) (mib []_C_int, err error) { return nil, EINVAL } +func SysctlClockinfo(name string) (*Clockinfo, error) { + mib, err := sysctlmib(name) + if err != nil { + return nil, err + } + + n := uintptr(SizeofClockinfo) + var ci Clockinfo + if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofClockinfo { + return nil, EIO + } + return &ci, nil +} + func SysctlUvmexp(name string) (*Uvmexp, error) { mib, err := sysctlmib(name) if err != nil { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go index 33583a22b6..ae59fba0c1 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -28,6 +28,11 @@ var ( errENOENT error = syscall.ENOENT ) +var ( + signalNameMapOnce sync.Once + signalNameMap map[string]syscall.Signal +) + // errnoErr returns common boxed Errno values, to prevent // allocations at runtime. func errnoErr(e syscall.Errno) error { @@ -66,6 +71,19 @@ func SignalName(s syscall.Signal) string { return "" } +// SignalNum returns the syscall.Signal for signal named s, +// or 0 if a signal with such name is not found. +// The signal name should start with "SIG". +func SignalNum(s string) syscall.Signal { + signalNameMapOnce.Do(func() { + signalNameMap = make(map[string]syscall.Signal) + for _, signal := range signalList { + signalNameMap[signal.name] = signal.num + } + }) + return signalNameMap[s] +} + // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. func clen(n []byte) int { i := bytes.IndexByte(n, 0) @@ -377,3 +395,22 @@ func SetNonblock(fd int, nonblocking bool) (err error) { func Exec(argv0 string, argv []string, envv []string) error { return syscall.Exec(argv0, argv, envv) } + +// Lutimes sets the access and modification times tv on path. If path refers to +// a symlink, it is not dereferenced and the timestamps are set on the symlink. +// If tv is nil, the access and modification times are set to the current time. +// Otherwise tv must contain exactly 2 elements, with access time as the first +// element and modification time as the second element. +func Lutimes(path string, tv []Timeval) error { + if tv == nil { + return UtimesNanoAt(AT_FDCWD, path, nil, AT_SYMLINK_NOFOLLOW) + } + if len(tv) != 2 { + return EINVAL + } + ts := []Timespec{ + NsecToTimespec(TimevalToNsec(tv[0])), + NsecToTimespec(TimevalToNsec(tv[1])), + } + return UtimesNanoAt(AT_FDCWD, path, ts, AT_SYMLINK_NOFOLLOW) +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go index 4e5e57f9a6..8aafbe4469 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -274,3 +274,9 @@ type Utsname C.struct_utsname const SizeofUvmexp = C.sizeof_struct_uvmexp type Uvmexp C.struct_uvmexp + +// Clockinfo + +const SizeofClockinfo = C.sizeof_struct_clockinfo + +type Clockinfo C.struct_clockinfo diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index cb89df8f54..9e99d67cb8 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 @@ -486,6 +487,50 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -493,6 +538,7 @@ const ( FFDLY = 0x8000 FLUSHO = 0x1000 FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -514,7 +560,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1134,7 +1180,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1398,6 +1444,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2232,6 +2284,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 73c9b88ca7..e3091f1e30 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 @@ -486,6 +487,50 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -493,6 +538,7 @@ const ( FFDLY = 0x8000 FLUSHO = 0x1000 FP_XSTATE_MAGIC2 = 0x46505845 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -514,7 +560,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1134,7 +1180,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1398,6 +1444,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2233,6 +2285,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index f1ef82f57e..a75dfebcc4 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2239,6 +2291,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index cf17c99069..393ad7c91b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 @@ -488,6 +489,50 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 @@ -495,6 +540,7 @@ const ( FFDLY = 0x8000 FLUSHO = 0x1000 FPSIMD_MAGIC = 0x46508001 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -516,7 +562,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1135,7 +1181,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1399,6 +1445,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2224,6 +2276,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 380913c4fc..ba1beb9093 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2234,6 +2286,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index fb82529ac9..efba3e5c9d 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2234,6 +2286,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 677d904562..d3f6e90652 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2234,6 +2286,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 7ddd09d782..7275cd876b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2234,6 +2286,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index ebaca417b4..7586a134ef 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1131,7 +1177,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1398,6 +1444,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2294,6 +2346,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 02938cb6ed..b861ec7834 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x4000 FFDLY = 0x4000 FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1131,7 +1177,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1398,6 +1444,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2294,6 +2346,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 5aea4b9093..a321ec23f4 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2220,6 +2272,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 7f7c2e3e2f..f6c99164ff 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -174,6 +174,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 @@ -486,12 +487,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -513,7 +559,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1132,7 +1178,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1396,6 +1442,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2293,6 +2345,7 @@ const ( TUNGETVNETBE = 0x800454df TUNGETVNETHDRSZ = 0x800454d7 TUNGETVNETLE = 0x800454dd + TUNSETCARRIER = 0x400454e2 TUNSETDEBUG = 0x400454c9 TUNSETFILTEREBPF = 0x800454e1 TUNSETGROUP = 0x400454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 968e21fd68..c1e95e29cb 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -177,6 +177,7 @@ const ( B9600 = 0xd BALLOON_KVM_MAGIC = 0x13661366 BDEVFS_MAGIC = 0x62646576 + BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 @@ -490,12 +491,57 @@ const ( FALLOC_FL_PUNCH_HOLE = 0x2 FALLOC_FL_UNSHARE_RANGE = 0x40 FALLOC_FL_ZERO_RANGE = 0x10 + FANOTIFY_METADATA_VERSION = 0x3 + FAN_ACCESS = 0x1 + FAN_ACCESS_PERM = 0x20000 + FAN_ALLOW = 0x1 + FAN_ALL_CLASS_BITS = 0xc + FAN_ALL_EVENTS = 0x3b + FAN_ALL_INIT_FLAGS = 0x3f + FAN_ALL_MARK_FLAGS = 0xff + FAN_ALL_OUTGOING_EVENTS = 0x3403b + FAN_ALL_PERM_EVENTS = 0x30000 + FAN_AUDIT = 0x10 + FAN_CLASS_CONTENT = 0x4 + FAN_CLASS_NOTIF = 0x0 + FAN_CLASS_PRE_CONTENT = 0x8 + FAN_CLOEXEC = 0x1 + FAN_CLOSE = 0x18 + FAN_CLOSE_NOWRITE = 0x10 + FAN_CLOSE_WRITE = 0x8 + FAN_DENY = 0x2 + FAN_ENABLE_AUDIT = 0x40 + FAN_EVENT_METADATA_LEN = 0x18 + FAN_EVENT_ON_CHILD = 0x8000000 + FAN_MARK_ADD = 0x1 + FAN_MARK_DONT_FOLLOW = 0x4 + FAN_MARK_FILESYSTEM = 0x100 + FAN_MARK_FLUSH = 0x80 + FAN_MARK_IGNORED_MASK = 0x20 + FAN_MARK_IGNORED_SURV_MODIFY = 0x40 + FAN_MARK_INODE = 0x0 + FAN_MARK_MOUNT = 0x10 + FAN_MARK_ONLYDIR = 0x8 + FAN_MARK_REMOVE = 0x2 + FAN_MODIFY = 0x2 + FAN_NOFD = -0x1 + FAN_NONBLOCK = 0x2 + FAN_ONDIR = 0x40000000 + FAN_OPEN = 0x20 + FAN_OPEN_EXEC = 0x1000 + FAN_OPEN_EXEC_PERM = 0x40000 + FAN_OPEN_PERM = 0x10000 + FAN_Q_OVERFLOW = 0x4000 + FAN_REPORT_TID = 0x100 + FAN_UNLIMITED_MARKS = 0x20 + FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 FD_SETSIZE = 0x400 FF0 = 0x0 FF1 = 0x8000 FFDLY = 0x8000 FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_ADIANTUM = 0x9 FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 @@ -517,7 +563,7 @@ const ( FS_POLICY_FLAGS_PAD_4 = 0x0 FS_POLICY_FLAGS_PAD_8 = 0x1 FS_POLICY_FLAGS_PAD_MASK = 0x3 - FS_POLICY_FLAGS_VALID = 0x3 + FS_POLICY_FLAGS_VALID = 0x7 FUTEXFS_SUPER_MAGIC = 0xbad1dea F_ADD_SEALS = 0x409 F_DUPFD = 0x0 @@ -1136,7 +1182,7 @@ const ( NETLINK_UNUSED = 0x1 NETLINK_USERSOCK = 0x2 NETLINK_XFRM = 0x6 - NETNSA_MAX = 0x3 + NETNSA_MAX = 0x5 NETNSA_NSID_NOT_ASSIGNED = -0x1 NFNETLINK_V0 = 0x0 NFNLGRP_ACCT_QUOTA = 0x8 @@ -1400,6 +1446,12 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_PAC_APDAKEY = 0x4 + PR_PAC_APDBKEY = 0x8 + PR_PAC_APGAKEY = 0x10 + PR_PAC_APIAKEY = 0x1 + PR_PAC_APIBKEY = 0x2 + PR_PAC_RESET_KEYS = 0x36 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2282,6 +2334,7 @@ const ( TUNGETVNETBE = 0x400454df TUNGETVNETHDRSZ = 0x400454d7 TUNGETVNETLE = 0x400454dd + TUNSETCARRIER = 0x800454e2 TUNSETDEBUG = 0x800454c9 TUNSETFILTEREBPF = 0x400454e1 TUNSETGROUP = 0x800454ce diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index e645a05cbe..52802bfc17 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -1367,6 +1367,14 @@ func Utime(path string, buf *Utimbuf) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getsystemcfg(label int) (n uint64) { + r0, _ := callgetsystemcfg(label) + n = uint64(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrlimit(resource int, rlim *Rlimit) (err error) { _, e1 := callgetrlimit(resource, uintptr(unsafe.Pointer(rlim))) if e1 != 0 { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index 0b8eb72102..a2b24e4a43 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -120,6 +120,7 @@ import ( //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.a/shr_64.o" //go:cgo_import_dynamic libc_time time "libc.a/shr_64.o" //go:cgo_import_dynamic libc_utime utime "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_getsystemcfg getsystemcfg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getrlimit getrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_setrlimit setrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_lseek lseek "libc.a/shr_64.o" @@ -235,6 +236,7 @@ import ( //go:linkname libc_gettimeofday libc_gettimeofday //go:linkname libc_time libc_time //go:linkname libc_utime libc_utime +//go:linkname libc_getsystemcfg libc_getsystemcfg //go:linkname libc_getrlimit libc_getrlimit //go:linkname libc_setrlimit libc_setrlimit //go:linkname libc_lseek libc_lseek @@ -353,6 +355,7 @@ var ( libc_gettimeofday, libc_time, libc_utime, + libc_getsystemcfg, libc_getrlimit, libc_setrlimit, libc_lseek, @@ -1135,6 +1138,13 @@ func callutime(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func callgetsystemcfg(label int) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_getsystemcfg)), 1, uintptr(label), 0, 0, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getrlimit)), 2, uintptr(resource), rlim, 0, 0, 0, 0) return diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index e88a442787..5491c89e96 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -118,6 +118,7 @@ int poll(uintptr_t, int, int); int gettimeofday(uintptr_t, uintptr_t); int time(uintptr_t); int utime(uintptr_t, uintptr_t); +unsigned long long getsystemcfg(int); int getrlimit(int, uintptr_t); int setrlimit(int, uintptr_t); long long lseek(int, long long, int); @@ -1011,6 +1012,14 @@ func callutime(_p0 uintptr, buf uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func callgetsystemcfg(label int) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.getsystemcfg(C.int(label))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func callgetrlimit(resource int, rlim uintptr) (r1 uintptr, e1 Errno) { r1 = uintptr(C.getrlimit(C.int(resource), C.uintptr_t(rlim))) e1 = syscall.GetErrno() diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index c8b451000b..9855afa767 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(mask>>32), uintptr(dirFd), uintptr(unsafe.Pointer(pathname))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 2aac3184bc..773e251185 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 13c06c2815..ccea621d48 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(mask>>32), uintptr(dirFd), uintptr(unsafe.Pointer(pathname))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1658,6 +1679,16 @@ func faccessat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go index 737fa8d181..712c7a3265 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2206,3 +2227,18 @@ func pipe2(p *[2]_C_int, flags int) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 0a85f3f8db..68b325100b 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask>>32), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index ec7007e781..a8be4076cf 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index c5bb25d964..1351028adc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index 26ada0478f..327b4f97a8 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(mask>>32), uintptr(dirFd), uintptr(unsafe.Pointer(pathname))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index 2da9cb700a..c145bd3cec 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 772733d83f..cd8179c7a5 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 996eba517a..2e90cf0f27 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -2186,3 +2207,18 @@ func pipe2(p *[2]_C_int, flags int) (err error) { } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(cmdline) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_KEXEC_FILE_LOAD, uintptr(kernelFd), uintptr(initrdFd), uintptr(cmdlineLen), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index cb9072a33a..fe9c7e12b0 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 5e48a1001b..d4a2100b09 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -14,6 +14,27 @@ var _ syscall.Errno // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) { + r0, _, e1 := Syscall(SYS_FANOTIFY_INIT, uintptr(flags), uintptr(event_f_flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) { + _, _, e1 := Syscall6(SYS_FANOTIFY_MARK, uintptr(fd), uintptr(flags), uintptr(mask), uintptr(dirFd), uintptr(unsafe.Pointer(pathname)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func fchmodat(dirfd int, path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 3206967896..b81d508a73 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -285,4 +285,5 @@ const ( SYS_STATX = 291 SYS_IO_PGETEVENTS = 292 SYS_RSEQ = 293 + SYS_KEXEC_FILE_LOAD = 294 ) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 473c74613f..2c8c46a2fc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -284,4 +284,5 @@ const ( SYS_STATX = 291 SYS_IO_PGETEVENTS = 292 SYS_RSEQ = 293 + SYS_KEXEC_FILE_LOAD = 294 ) diff --git a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 93480fcb16..6ed306370a 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -253,6 +253,7 @@ const ( SYS_TIMER_GETOVERRUN = 264 SYS_TIMER_DELETE = 265 SYS_TIMER_CREATE = 266 + SYS_VSERVER = 267 SYS_IO_SETUP = 268 SYS_IO_DESTROY = 269 SYS_IO_SUBMIT = 270 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 18724670a8..6dfe56be76 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -973,7 +973,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1076,6 +1077,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1097,21 +1099,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1124,6 +1143,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1428,6 +1448,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2043,3 +2066,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 6ddbf0665c..9f8cbf4cb3 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -984,7 +984,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1087,6 +1088,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1108,21 +1110,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1135,6 +1154,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1440,6 +1460,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2056,3 +2079,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index b8e3ec1384..cbbf19a447 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -962,7 +962,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1065,6 +1066,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1086,21 +1088,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1113,6 +1132,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1418,6 +1438,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2034,3 +2057,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 2f73f0086d..be21189dbd 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -963,7 +963,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1066,6 +1067,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1087,21 +1089,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1114,6 +1133,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1419,6 +1439,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2035,3 +2058,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 4a2a18bcb0..d599ca2759 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -967,7 +967,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1070,6 +1071,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1091,21 +1093,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1118,6 +1137,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1424,6 +1444,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2040,3 +2063,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 41e4513de1..011be86bae 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -965,7 +965,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1068,6 +1069,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1089,21 +1091,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1116,6 +1135,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1421,6 +1441,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2037,3 +2060,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 4a3d74b76e..8163445163 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -965,7 +965,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1068,6 +1069,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1089,21 +1091,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1116,6 +1135,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1421,6 +1441,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2037,3 +2060,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 8ae3ca4e4e..4ecf7a8c77 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -967,7 +967,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1070,6 +1071,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1091,21 +1093,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1118,6 +1137,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1424,6 +1444,9 @@ const ( SizeofTpacketHdr = 0x18 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2040,3 +2063,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 50294c94c0..ea817bafba 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -973,7 +973,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1076,6 +1077,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1097,21 +1099,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1124,6 +1143,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1429,6 +1449,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2045,3 +2068,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index d2acf3a734..192ea3b105 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -973,7 +973,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1076,6 +1077,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1097,21 +1099,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1124,6 +1143,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1429,6 +1449,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2045,3 +2068,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 675c596880..673e5e7919 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -990,7 +990,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1093,6 +1094,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1114,21 +1116,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1141,6 +1160,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1446,6 +1466,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2062,3 +2085,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 9f2cf0dfd7..faafcddfcc 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -986,7 +986,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1089,6 +1090,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1110,21 +1112,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1137,6 +1156,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1443,6 +1463,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2059,3 +2082,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 68643903c9..392dd7375c 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -968,7 +968,8 @@ type PerfEventAttr struct { Clockid int32 Sample_regs_intr uint64 Aux_watermark uint32 - _ uint32 + Sample_max_stack uint16 + _ uint16 } type PerfEventMmapPage struct { @@ -1071,6 +1072,7 @@ const ( PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 + PERF_COUNT_SW_BPF_OUTPUT = 0xa PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 @@ -1092,21 +1094,38 @@ const ( PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + PERF_SAMPLE_BRANCH_ABORT_TX = 0x80 + PERF_SAMPLE_BRANCH_IN_TX = 0x100 + PERF_SAMPLE_BRANCH_NO_TX = 0x200 + PERF_SAMPLE_BRANCH_COND = 0x400 + PERF_SAMPLE_BRANCH_CALL_STACK = 0x800 + PERF_SAMPLE_BRANCH_IND_JUMP = 0x1000 + PERF_SAMPLE_BRANCH_CALL = 0x2000 + PERF_SAMPLE_BRANCH_NO_FLAGS = 0x4000 + PERF_SAMPLE_BRANCH_NO_CYCLES = 0x8000 + PERF_SAMPLE_BRANCH_TYPE_SAVE = 0x10000 PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 PERF_FORMAT_ID = 0x4 PERF_FORMAT_GROUP = 0x8 - PERF_RECORD_MMAP = 0x1 - PERF_RECORD_LOST = 0x2 - PERF_RECORD_COMM = 0x3 - PERF_RECORD_EXIT = 0x4 - PERF_RECORD_THROTTLE = 0x5 - PERF_RECORD_UNTHROTTLE = 0x6 - PERF_RECORD_FORK = 0x7 - PERF_RECORD_READ = 0x8 - PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + PERF_RECORD_MMAP2 = 0xa + PERF_RECORD_AUX = 0xb + PERF_RECORD_ITRACE_START = 0xc + PERF_RECORD_LOST_SAMPLES = 0xd + PERF_RECORD_SWITCH = 0xe + PERF_RECORD_SWITCH_CPU_WIDE = 0xf + PERF_RECORD_NAMESPACES = 0x10 PERF_CONTEXT_HV = -0x20 PERF_CONTEXT_KERNEL = -0x80 @@ -1119,6 +1138,7 @@ const ( PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_FLAG_FD_CLOEXEC = 0x8 ) const ( @@ -1424,6 +1444,9 @@ const ( SizeofTpacketHdr = 0x20 SizeofTpacket2Hdr = 0x20 SizeofTpacket3Hdr = 0x30 + + SizeofTpacketStats = 0x8 + SizeofTpacketStatsV3 = 0xc ) const ( @@ -2040,3 +2063,18 @@ type SockExtendedErr struct { Info uint32 Data uint32 } + +type FanotifyEventMetadata struct { + Event_len uint32 + Vers uint8 + Reserved uint8 + Metadata_len uint16 + Mask uint64 + Fd int32 + Pid int32 +} + +type FanotifyResponse struct { + Fd int32 + Response uint32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 8b37d83992..900fb44622 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -558,3 +558,13 @@ type Uvmexp struct { Fpswtch int32 Kmapent int32 } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 6efea46355..028fa78d74 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -558,3 +558,13 @@ type Uvmexp struct { Fpswtch int32 Kmapent int32 } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index 510efc3eaa..b45d5eedff 100644 --- a/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/src/cmd/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -559,3 +559,13 @@ type Uvmexp struct { Fpswtch int32 Kmapent int32 } + +const SizeofClockinfo = 0x14 + +type Clockinfo struct { + Hz int32 + Tick int32 + Tickadj int32 + Stathz int32 + Profhz int32 +} diff --git a/src/cmd/vendor/golang.org/x/sys/windows/dll_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/dll_windows.go index e92c05b213..ba67658db1 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/dll_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/dll_windows.go @@ -359,11 +359,11 @@ func loadLibraryEx(name string, system bool) (*DLL, error) { // trying to load "foo.dll" out of the system // folder, but LoadLibraryEx doesn't support // that yet on their system, so emulate it. - windir, _ := Getenv("WINDIR") // old var; apparently works on XP - if windir == "" { - return nil, errString("%WINDIR% not defined") + systemdir, err := GetSystemDirectory() + if err != nil { + return nil, err } - loadDLL = windir + "\\System32\\" + name + loadDLL = systemdir + "\\" + name } } h, err := LoadLibraryEx(loadDLL, 0, flags) diff --git a/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go index 9f946da6fe..da06406c44 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/security_windows.go @@ -169,6 +169,7 @@ const ( //sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid //sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid //sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid +//sys createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, sizeSid *uint32) (err error) = advapi32.CreateWellKnownSid //sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid //sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid @@ -286,6 +287,158 @@ func (sid *SID) LookupAccount(system string) (account, domain string, accType ui } } +// Various types of pre-specified sids that can be synthesized at runtime. +type WELL_KNOWN_SID_TYPE uint32 + +const ( + WinNullSid = 0 + WinWorldSid = 1 + WinLocalSid = 2 + WinCreatorOwnerSid = 3 + WinCreatorGroupSid = 4 + WinCreatorOwnerServerSid = 5 + WinCreatorGroupServerSid = 6 + WinNtAuthoritySid = 7 + WinDialupSid = 8 + WinNetworkSid = 9 + WinBatchSid = 10 + WinInteractiveSid = 11 + WinServiceSid = 12 + WinAnonymousSid = 13 + WinProxySid = 14 + WinEnterpriseControllersSid = 15 + WinSelfSid = 16 + WinAuthenticatedUserSid = 17 + WinRestrictedCodeSid = 18 + WinTerminalServerSid = 19 + WinRemoteLogonIdSid = 20 + WinLogonIdsSid = 21 + WinLocalSystemSid = 22 + WinLocalServiceSid = 23 + WinNetworkServiceSid = 24 + WinBuiltinDomainSid = 25 + WinBuiltinAdministratorsSid = 26 + WinBuiltinUsersSid = 27 + WinBuiltinGuestsSid = 28 + WinBuiltinPowerUsersSid = 29 + WinBuiltinAccountOperatorsSid = 30 + WinBuiltinSystemOperatorsSid = 31 + WinBuiltinPrintOperatorsSid = 32 + WinBuiltinBackupOperatorsSid = 33 + WinBuiltinReplicatorSid = 34 + WinBuiltinPreWindows2000CompatibleAccessSid = 35 + WinBuiltinRemoteDesktopUsersSid = 36 + WinBuiltinNetworkConfigurationOperatorsSid = 37 + WinAccountAdministratorSid = 38 + WinAccountGuestSid = 39 + WinAccountKrbtgtSid = 40 + WinAccountDomainAdminsSid = 41 + WinAccountDomainUsersSid = 42 + WinAccountDomainGuestsSid = 43 + WinAccountComputersSid = 44 + WinAccountControllersSid = 45 + WinAccountCertAdminsSid = 46 + WinAccountSchemaAdminsSid = 47 + WinAccountEnterpriseAdminsSid = 48 + WinAccountPolicyAdminsSid = 49 + WinAccountRasAndIasServersSid = 50 + WinNTLMAuthenticationSid = 51 + WinDigestAuthenticationSid = 52 + WinSChannelAuthenticationSid = 53 + WinThisOrganizationSid = 54 + WinOtherOrganizationSid = 55 + WinBuiltinIncomingForestTrustBuildersSid = 56 + WinBuiltinPerfMonitoringUsersSid = 57 + WinBuiltinPerfLoggingUsersSid = 58 + WinBuiltinAuthorizationAccessSid = 59 + WinBuiltinTerminalServerLicenseServersSid = 60 + WinBuiltinDCOMUsersSid = 61 + WinBuiltinIUsersSid = 62 + WinIUserSid = 63 + WinBuiltinCryptoOperatorsSid = 64 + WinUntrustedLabelSid = 65 + WinLowLabelSid = 66 + WinMediumLabelSid = 67 + WinHighLabelSid = 68 + WinSystemLabelSid = 69 + WinWriteRestrictedCodeSid = 70 + WinCreatorOwnerRightsSid = 71 + WinCacheablePrincipalsGroupSid = 72 + WinNonCacheablePrincipalsGroupSid = 73 + WinEnterpriseReadonlyControllersSid = 74 + WinAccountReadonlyControllersSid = 75 + WinBuiltinEventLogReadersGroup = 76 + WinNewEnterpriseReadonlyControllersSid = 77 + WinBuiltinCertSvcDComAccessGroup = 78 + WinMediumPlusLabelSid = 79 + WinLocalLogonSid = 80 + WinConsoleLogonSid = 81 + WinThisOrganizationCertificateSid = 82 + WinApplicationPackageAuthoritySid = 83 + WinBuiltinAnyPackageSid = 84 + WinCapabilityInternetClientSid = 85 + WinCapabilityInternetClientServerSid = 86 + WinCapabilityPrivateNetworkClientServerSid = 87 + WinCapabilityPicturesLibrarySid = 88 + WinCapabilityVideosLibrarySid = 89 + WinCapabilityMusicLibrarySid = 90 + WinCapabilityDocumentsLibrarySid = 91 + WinCapabilitySharedUserCertificatesSid = 92 + WinCapabilityEnterpriseAuthenticationSid = 93 + WinCapabilityRemovableStorageSid = 94 + WinBuiltinRDSRemoteAccessServersSid = 95 + WinBuiltinRDSEndpointServersSid = 96 + WinBuiltinRDSManagementServersSid = 97 + WinUserModeDriversSid = 98 + WinBuiltinHyperVAdminsSid = 99 + WinAccountCloneableControllersSid = 100 + WinBuiltinAccessControlAssistanceOperatorsSid = 101 + WinBuiltinRemoteManagementUsersSid = 102 + WinAuthenticationAuthorityAssertedSid = 103 + WinAuthenticationServiceAssertedSid = 104 + WinLocalAccountSid = 105 + WinLocalAccountAndAdministratorSid = 106 + WinAccountProtectedUsersSid = 107 + WinCapabilityAppointmentsSid = 108 + WinCapabilityContactsSid = 109 + WinAccountDefaultSystemManagedSid = 110 + WinBuiltinDefaultSystemManagedGroupSid = 111 + WinBuiltinStorageReplicaAdminsSid = 112 + WinAccountKeyAdminsSid = 113 + WinAccountEnterpriseKeyAdminsSid = 114 + WinAuthenticationKeyTrustSid = 115 + WinAuthenticationKeyPropertyMFASid = 116 + WinAuthenticationKeyPropertyAttestationSid = 117 + WinAuthenticationFreshKeyAuthSid = 118 + WinBuiltinDeviceOwnersSid = 119 +) + +// Creates a sid for a well-known predefined alias, generally using the constants of the form +// Win*Sid, for the local machine. +func CreateWellKnownSid(sidType WELL_KNOWN_SID_TYPE) (*SID, error) { + return CreateWellKnownDomainSid(sidType, nil) +} + +// Creates a sid for a well-known predefined alias, generally using the constants of the form +// Win*Sid, for the domain specified by the domainSid parameter. +func CreateWellKnownDomainSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID) (*SID, error) { + n := uint32(50) + for { + b := make([]byte, n) + sid := (*SID)(unsafe.Pointer(&b[0])) + err := createWellKnownSid(sidType, domainSid, sid, &n) + if err == nil { + return sid, nil + } + if err != ERROR_INSUFFICIENT_BUFFER { + return nil, err + } + if n <= uint32(len(b)) { + return nil, err + } + } +} + const ( // do not reorder TOKEN_ASSIGN_PRIMARY = 1 << iota @@ -372,6 +525,7 @@ type Tokengroups struct { //sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken //sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation //sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW +//sys getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) = kernel32.GetSystemDirectoryW // An access token contains the security information for a logon session. // The system creates an access token when a user logs on, and every @@ -468,6 +622,23 @@ func (t Token) GetUserProfileDirectory() (string, error) { } } +// GetSystemDirectory retrieves path to current location of the system +// directory, which is typically, though not always, C:\Windows\System32. +func GetSystemDirectory() (string, error) { + n := uint32(MAX_PATH) + for { + b := make([]uint16, n) + l, e := getSystemDirectory(&b[0], n) + if e != nil { + return "", e + } + if l <= n { + return UTF16ToString(b[:l]), nil + } + n = l + } +} + // IsMember reports whether the access token t is a member of the provided SID. func (t Token) IsMember(sid *SID) (bool, error) { var b int32 diff --git a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go index e4b54e2d92..75dcd275ca 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -246,12 +246,14 @@ var ( procGetLengthSid = modadvapi32.NewProc("GetLengthSid") procCopySid = modadvapi32.NewProc("CopySid") procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procCreateWellKnownSid = modadvapi32.NewProc("CreateWellKnownSid") procFreeSid = modadvapi32.NewProc("FreeSid") procEqualSid = modadvapi32.NewProc("EqualSid") procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") + procGetSystemDirectoryW = modkernel32.NewProc("GetSystemDirectoryW") ) func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { @@ -2653,6 +2655,18 @@ func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, s return } +func createWellKnownSid(sidType WELL_KNOWN_SID_TYPE, domainSid *SID, sid *SID, sizeSid *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCreateWellKnownSid.Addr(), 4, uintptr(sidType), uintptr(unsafe.Pointer(domainSid)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sizeSid)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func FreeSid(sid *SID) (err error) { r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) if r1 != 0 { @@ -2718,3 +2732,16 @@ func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { } return } + +func getSystemDirectory(dir *uint16, dirLen uint32) (len uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetSystemDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(dir)), uintptr(dirLen), 0) + len = uint32(r0) + if len == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go index 8349511224..72530a0eeb 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods/stdmethods.go @@ -8,7 +8,6 @@ package stdmethods import ( "go/ast" - "go/token" "go/types" "strings" @@ -163,7 +162,7 @@ func matchParams(pass *analysis.Pass, expect []string, actual *types.Tuple, pref if i >= actual.Len() { return false } - if !matchParamType(pass.Fset, pass.Pkg, x, actual.At(i).Type()) { + if !matchParamType(x, actual.At(i).Type()) { return false } } @@ -174,13 +173,8 @@ func matchParams(pass *analysis.Pass, expect []string, actual *types.Tuple, pref } // Does this one type match? -func matchParamType(fset *token.FileSet, pkg *types.Package, expect string, actual types.Type) bool { +func matchParamType(expect string, actual types.Type) bool { expect = strings.TrimPrefix(expect, "=") - // Strip package name if we're in that package. - if n := len(pkg.Name()); len(expect) > n && expect[:n] == pkg.Name() && expect[n] == '.' { - expect = expect[n+1:] - } - // Overkill but easy. return typeString(actual) == expect } diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 916a8ca9b6..2b3dc6fe2f 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -21,12 +21,12 @@ golang.org/x/arch/arm/armasm golang.org/x/arch/arm64/arm64asm golang.org/x/arch/ppc64/ppc64asm golang.org/x/arch/x86/x86asm -# golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67 +# golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a golang.org/x/crypto/ssh/terminal -# golang.org/x/sys v0.0.0-20190225065934-cc5685c2db12 +# golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3 +# golang.org/x/tools v0.0.0-20190320160634-b6b7807791df golang.org/x/tools/go/analysis/passes/asmdecl golang.org/x/tools/go/analysis/passes/assign golang.org/x/tools/go/analysis/passes/atomic diff --git a/src/cmd/vet/all/whitelist/all.txt b/src/cmd/vet/all/whitelist/all.txt index c73516392f..dd0718a389 100644 --- a/src/cmd/vet/all/whitelist/all.txt +++ b/src/cmd/vet/all/whitelist/all.txt @@ -47,15 +47,9 @@ cmd/internal/bio/buf.go: method Seek(offset int64, whence int) int64 should have fmt/print.go: method WriteByte(c byte) should have signature WriteByte(byte) error runtime/pprof/pprof.go: method WriteTo(w io.Writer, debug int) error should have signature WriteTo(io.Writer) (int64, error) -// These encoding/xml methods have the correct signature. -// vet doesn't know it because they are *in* the encoding/xml package. -// It's not worth teaching vet about the distinction, so whitelist them. +// Also non-standard, but this method is on an unexported type, so it's +// irrelevant. encoding/gob/encode.go: method WriteByte(c byte) should have signature WriteByte(byte) error -encoding/xml/marshal.go: method MarshalXML(e *xml.Encoder, start xml.StartElement) error should have signature MarshalXML(*xml.Encoder, xml.StartElement) error -encoding/xml/marshal_test.go: method MarshalXML(e *xml.Encoder, start xml.StartElement) error should have signature MarshalXML(*xml.Encoder, xml.StartElement) error -encoding/xml/read.go: method UnmarshalXML(d *xml.Decoder, start xml.StartElement) error should have signature UnmarshalXML(*xml.Decoder, xml.StartElement) error -encoding/xml/read_test.go: method UnmarshalXML(d *xml.Decoder, start xml.StartElement) error should have signature UnmarshalXML(*xml.Decoder, xml.StartElement) error -encoding/xml/xml_test.go: method UnmarshalXML(*xml.Decoder, xml.StartElement) error should have signature UnmarshalXML(*xml.Decoder, xml.StartElement) error // Long struct tags used to test reflect internals cmd/link/link_test.go: struct field tag "\n\tLondon. Michaelmas term lately over, and the Lord Chancellor sitting in Lincoln’s Inn Hall. Implacable November weather. As much mud in the streets as if the waters had but newly retired from the face of the earth, and it would not be wonderful to meet a Megalosaurus, forty feet long or so, waddling like an elephantine lizard up Holborn Hill. Smoke lowering down from chimney-pots, making a soft black drizzle, with flakes of soot in it as big as full-grown snowflakes—gone into mourning, one might imagine, for the death of the sun. Dogs, undistinguishable in mire. Horses, scarcely better; splashed to their very blinkers. Foot passengers, jostling one another’s umbrellas in a general infection of ill temper, and losing their foot-hold at street-corners, where tens of thousands of other foot passengers have been slipping and sliding since the day broke (if this day ever broke), adding new deposits to the crust upon crust of mud, sticking at those points tenaciously to the pavement, and accumulating at compound interest.\n\n\tFog everywhere. Fog up the river, where it flows among green aits and meadows; fog down the river, where it rolls defiled among the tiers of shipping and the waterside pollutions of a great (and dirty) city. Fog on the Essex marshes, fog on the Kentish heights. Fog creeping into the cabooses of collier-brigs; fog lying out on the yards and hovering in the rigging of great ships; fog drooping on the gunwales of barges and small boats. Fog in the eyes and throats of ancient Greenwich pensioners, wheezing by the firesides of their wards; fog in the stem and bowl of the afternoon pipe of the wrathful skipper, down in his close cabin; fog cruelly pinching the toes and fingers of his shivering little ‘prentice boy on deck. Chance people on the bridges peeping over the parapets into a nether sky of fog, with fog all round them, as if they were up in a balloon and hanging in the misty clouds.\n\n\tGas looming through the fog in divers places in the streets, much as the sun may, from the spongey fields, be seen to loom by husbandman and ploughboy. Most of the shops lighted two hours before their time—as the gas seems to know, for it has a haggard and unwilling look.\n\n\tThe raw afternoon is rawest, and the dense fog is densest, and the muddy streets are muddiest near that leaden-headed old obstruction, appropriate ornament for the threshold of a leaden-headed old corporation, Temple Bar. And hard by Temple Bar, in Lincoln’s Inn Hall, at the very heart of the fog, sits the Lord High Chancellor in his High Court of Chancery." not compatible with reflect.StructTag.Get: bad syntax for struct tag key -- GitLab From 23b476a3c8b5d915c4b50957a0f3935a40261eac Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sun, 17 Mar 2019 07:14:12 -0700 Subject: [PATCH 0537/1679] cmd/compile: port callnew to ssa conversion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is part of a general effort to shrink walk. In an ideal world, we'd have an SSA op for allocation, but we don't yet have a good mechanism for introducing function calling during SSA compilation. In the meantime, SSA conversion is a better place for it. This also makes it easier to introduce new optimizations; instead of doing the typecheck walk dance, we can simply write what we want the backend to do. I introduced a new opcode in this change because: (a) It avoids a class of bugs involving correctly detecting whether this ONEW is a "before walk" ONEW or an "after walk" ONEW. It also means that using ONEW or ONEWOBJ in the wrong context will generally result in a faster failure. (b) Opcodes are cheap. (c) It provides a better place to put documentation. This change also is also marginally more performant: name old alloc/op new alloc/op delta Template 39.1MB ± 0% 39.0MB ± 0% -0.14% (p=0.008 n=5+5) Unicode 28.4MB ± 0% 28.4MB ± 0% ~ (p=0.421 n=5+5) GoTypes 132MB ± 0% 132MB ± 0% -0.23% (p=0.008 n=5+5) Compiler 608MB ± 0% 607MB ± 0% -0.25% (p=0.008 n=5+5) SSA 2.04GB ± 0% 2.04GB ± 0% -0.01% (p=0.008 n=5+5) Flate 24.4MB ± 0% 24.3MB ± 0% -0.13% (p=0.008 n=5+5) GoParser 29.3MB ± 0% 29.1MB ± 0% -0.54% (p=0.008 n=5+5) Reflect 84.8MB ± 0% 84.7MB ± 0% -0.21% (p=0.008 n=5+5) Tar 36.7MB ± 0% 36.6MB ± 0% -0.10% (p=0.008 n=5+5) XML 48.7MB ± 0% 48.6MB ± 0% -0.24% (p=0.008 n=5+5) [Geo mean] 85.0MB 84.8MB -0.19% name old allocs/op new allocs/op delta Template 383k ± 0% 382k ± 0% -0.26% (p=0.008 n=5+5) Unicode 341k ± 0% 341k ± 0% ~ (p=0.579 n=5+5) GoTypes 1.37M ± 0% 1.36M ± 0% -0.39% (p=0.008 n=5+5) Compiler 5.59M ± 0% 5.56M ± 0% -0.49% (p=0.008 n=5+5) SSA 16.9M ± 0% 16.9M ± 0% -0.03% (p=0.008 n=5+5) Flate 238k ± 0% 238k ± 0% -0.23% (p=0.008 n=5+5) GoParser 306k ± 0% 303k ± 0% -0.93% (p=0.008 n=5+5) Reflect 990k ± 0% 987k ± 0% -0.33% (p=0.008 n=5+5) Tar 356k ± 0% 355k ± 0% -0.20% (p=0.008 n=5+5) XML 444k ± 0% 442k ± 0% -0.45% (p=0.008 n=5+5) [Geo mean] 848k 845k -0.33% Change-Id: I2c36003a7cbf71b53857b7de734852b698f49310 Reviewed-on: https://go-review.googlesource.com/c/go/+/167957 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/go.go | 4 +++- src/cmd/compile/internal/gc/op_string.go | 4 ++-- src/cmd/compile/internal/gc/ssa.go | 11 +++++++++++ src/cmd/compile/internal/gc/syntax.go | 3 ++- src/cmd/compile/internal/gc/walk.go | 22 ++++++---------------- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index 5f2c328909..6123e6acc1 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -295,6 +295,7 @@ var ( growslice, msanread, msanwrite, + newobject, newproc, panicdivide, panicshift, @@ -312,7 +313,8 @@ var ( typedmemclr, typedmemmove, Udiv, - writeBarrier *obj.LSym + writeBarrier, + zerobaseSym *obj.LSym BoundsCheckFunc [ssa.BoundsKindCount]*obj.LSym ExtendCheckFunc [ssa.BoundsKindCount]*obj.LSym diff --git a/src/cmd/compile/internal/gc/op_string.go b/src/cmd/compile/internal/gc/op_string.go index 54fce2409e..af55df68a3 100644 --- a/src/cmd/compile/internal/gc/op_string.go +++ b/src/cmd/compile/internal/gc/op_string.go @@ -4,9 +4,9 @@ package gc import "strconv" -const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVEINDREGSPINLMARKRETJMPGETGEND" +const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNEWOBJNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVEINDREGSPINLMARKRETJMPGETGEND" -var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 466, 472, 476, 479, 483, 488, 493, 499, 504, 508, 513, 521, 529, 535, 544, 555, 562, 566, 573, 580, 588, 592, 596, 600, 607, 614, 622, 628, 633, 638, 642, 647, 655, 660, 665, 669, 672, 680, 684, 686, 691, 693, 698, 704, 710, 716, 722, 727, 731, 738, 744, 749, 755, 758, 764, 771, 776, 780, 785, 789, 799, 804, 812, 818, 825, 832, 840, 847, 853, 857, 860} +var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 469, 472, 478, 482, 485, 489, 494, 499, 505, 510, 514, 519, 527, 535, 541, 550, 561, 568, 572, 579, 586, 594, 598, 602, 606, 613, 620, 628, 634, 639, 644, 648, 653, 661, 666, 671, 675, 678, 686, 690, 692, 697, 699, 704, 710, 716, 722, 728, 733, 737, 744, 750, 755, 761, 764, 770, 777, 782, 786, 791, 795, 805, 810, 818, 824, 831, 838, 846, 853, 859, 863, 866} func (i Op) String() string { if i >= Op(len(_Op_index)-1) { diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index aa2e2c19c9..52515bdb1d 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -76,6 +76,7 @@ func initssaconfig() { growslice = sysfunc("growslice") msanread = sysfunc("msanread") msanwrite = sysfunc("msanwrite") + newobject = sysfunc("newobject") newproc = sysfunc("newproc") panicdivide = sysfunc("panicdivide") panicdottypeE = sysfunc("panicdottypeE") @@ -94,6 +95,8 @@ func initssaconfig() { typedmemmove = sysfunc("typedmemmove") Udiv = sysvar("udiv") // asm func with special ABI writeBarrier = sysvar("writeBarrier") // struct { bool; ... } + zerobaseSym = sysvar("zerobase") + if thearch.LinkArch.Family == sys.Wasm { BoundsCheckFunc[ssa.BoundsIndex] = sysvar("goPanicIndex") BoundsCheckFunc[ssa.BoundsIndexU] = sysvar("goPanicIndexU") @@ -2453,6 +2456,14 @@ func (s *state) expr(n *Node) *ssa.Value { } return s.zeroVal(n.Type) + case ONEWOBJ: + if n.Type.Elem().Size() == 0 { + return s.newValue1A(ssa.OpAddr, n.Type, zerobaseSym, s.sb) + } + typ := s.expr(n.Left) + vv := s.rtcall(newobject, true, []*types.Type{n.Type}, typ) + return vv[0] + default: s.Fatalf("unhandled expr %v", n.Op) return nil diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 5f07c6c52a..278633489e 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -668,7 +668,8 @@ const ( ORSH // Left >> Right OAND // Left & Right OANDNOT // Left &^ Right - ONEW // new(Left) + ONEW // new(Left); corresponds to calls to new in source code + ONEWOBJ // runtime.newobject(n.Type); introduced by walk; Left is type descriptor ONOT // !Left OBITNOT // ^Left OPLUS // +Left diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 77f578197c..3533a3e230 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -481,7 +481,7 @@ opswitch: Dump("walk", n) Fatalf("walkexpr: switch 1 unknown op %+S", n) - case ONONAME, OINDREGSP, OEMPTY, OGETG: + case ONONAME, OINDREGSP, OEMPTY, OGETG, ONEWOBJ: case OTYPE, ONAME, OLITERAL: // TODO(mdempsky): Just return n; see discussion on CL 38655. @@ -1944,21 +1944,11 @@ func callnew(t *types.Type) *Node { yyerror("%v is go:notinheap; heap allocation disallowed", t) } dowidth(t) - - if t.Size() == 0 { - // Return &runtime.zerobase if we know that the requested size is 0. - // This is what runtime.mallocgc would return. - z := newname(Runtimepkg.Lookup("zerobase")) - z.SetClass(PEXTERN) - z.Type = t - return typecheck(nod(OADDR, z, nil), ctxExpr) - } - - fn := syslook("newobject") - fn = substArgTypes(fn, t) - v := mkcall1(fn, types.NewPtr(t), nil, typename(t)) - v.SetNonNil(true) - return v + n := nod(ONEWOBJ, typename(t), nil) + n.Type = types.NewPtr(t) + n.SetTypecheck(1) + n.SetNonNil(true) + return n } // isReflectHeaderDataField reports whether l is an expression p.Data -- GitLab From 3023d7da49cad1a6fae4684d1b9313c51a4085d4 Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Seo Date: Fri, 8 Feb 2019 16:18:12 -0200 Subject: [PATCH 0538/1679] cmd/compile/internal, cmd/internal/obj/ppc64: generate new count trailing zeros instructions on POWER9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change adds new POWER9 instructions for counting trailing zeros (CNTTZW/CNTTZD) to the assembler and generates them in SSA when GOPPC64=power9. name old time/op new time/op delta TrailingZeros-160 1.59ns ±20% 1.45ns ±10% -8.81% (p=0.000 n=14+13) TrailingZeros8-160 1.55ns ±23% 1.62ns ±44% ~ (p=0.593 n=13+15) TrailingZeros16-160 1.78ns ±23% 1.62ns ±38% -9.31% (p=0.003 n=14+14) TrailingZeros32-160 1.64ns ±10% 1.49ns ± 9% -9.15% (p=0.000 n=13+14) TrailingZeros64-160 1.53ns ± 6% 1.45ns ± 5% -5.38% (p=0.000 n=15+13) Change-Id: I365e6ff79f3ce4d8ebe089a6a86b1771853eb596 Reviewed-on: https://go-review.googlesource.com/c/go/+/167517 Reviewed-by: Lynn Boger --- src/cmd/compile/internal/ppc64/ssa.go | 2 +- src/cmd/compile/internal/ssa/gen/PPC64.rules | 10 ++++--- src/cmd/compile/internal/ssa/gen/PPC64Ops.go | 3 ++ src/cmd/compile/internal/ssa/opGen.go | 28 ++++++++++++++++++ src/cmd/compile/internal/ssa/rewritePPC64.go | 30 ++++++++++++++++++-- src/cmd/internal/obj/ppc64/a.out.go | 4 +++ src/cmd/internal/obj/ppc64/anames.go | 4 +++ src/cmd/internal/obj/ppc64/asm9.go | 23 ++++++++++++--- test/codegen/mathbits.go | 24 ++++++++++------ 9 files changed, 109 insertions(+), 19 deletions(-) diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index 4cccbecbb3..a32f80fb29 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -620,7 +620,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.To.Type = obj.TYPE_REG p.To.Reg = ppc64.REGTMP // Ignored; this is for the carry effect. - case ssa.OpPPC64NEG, ssa.OpPPC64FNEG, ssa.OpPPC64FSQRT, ssa.OpPPC64FSQRTS, ssa.OpPPC64FFLOOR, ssa.OpPPC64FTRUNC, ssa.OpPPC64FCEIL, ssa.OpPPC64FCTIDZ, ssa.OpPPC64FCTIWZ, ssa.OpPPC64FCFID, ssa.OpPPC64FCFIDS, ssa.OpPPC64FRSP, ssa.OpPPC64CNTLZD, ssa.OpPPC64CNTLZW, ssa.OpPPC64POPCNTD, ssa.OpPPC64POPCNTW, ssa.OpPPC64POPCNTB, ssa.OpPPC64MFVSRD, ssa.OpPPC64MTVSRD, ssa.OpPPC64FABS, ssa.OpPPC64FNABS, ssa.OpPPC64FROUND: + case ssa.OpPPC64NEG, ssa.OpPPC64FNEG, ssa.OpPPC64FSQRT, ssa.OpPPC64FSQRTS, ssa.OpPPC64FFLOOR, ssa.OpPPC64FTRUNC, ssa.OpPPC64FCEIL, ssa.OpPPC64FCTIDZ, ssa.OpPPC64FCTIWZ, ssa.OpPPC64FCFID, ssa.OpPPC64FCFIDS, ssa.OpPPC64FRSP, ssa.OpPPC64CNTLZD, ssa.OpPPC64CNTLZW, ssa.OpPPC64POPCNTD, ssa.OpPPC64POPCNTW, ssa.OpPPC64POPCNTB, ssa.OpPPC64MFVSRD, ssa.OpPPC64MTVSRD, ssa.OpPPC64FABS, ssa.OpPPC64FNABS, ssa.OpPPC64FROUND, ssa.OpPPC64CNTTZW, ssa.OpPPC64CNTTZD: r := v.Reg() p := s.Prog(v.Op.Asm()) p.To.Type = obj.TYPE_REG diff --git a/src/cmd/compile/internal/ssa/gen/PPC64.rules b/src/cmd/compile/internal/ssa/gen/PPC64.rules index b0a249a558..e21dd9be7b 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64.rules +++ b/src/cmd/compile/internal/ssa/gen/PPC64.rules @@ -303,10 +303,12 @@ (Ctz32NonZero x) -> (Ctz32 x) (Ctz64NonZero x) -> (Ctz64 x) -(Ctz64 x) -> (POPCNTD (ANDN (ADDconst [-1] x) x)) -(Ctz32 x) -> (POPCNTW (MOVWZreg (ANDN (ADDconst [-1] x) x))) +(Ctz64 x) && objabi.GOPPC64<=8 -> (POPCNTD (ANDN (ADDconst [-1] x) x)) +(Ctz64 x) -> (CNTTZD x) +(Ctz32 x) && objabi.GOPPC64<=8 -> (POPCNTW (MOVWZreg (ANDN (ADDconst [-1] x) x))) +(Ctz32 x) -> (CNTTZW (MOVWZreg x)) (Ctz16 x) -> (POPCNTW (MOVHZreg (ANDN (ADDconst [-1] x) x))) -(Ctz8 x) -> (POPCNTB (MOVBZreg (ANDN (ADDconst [-1] x) x))) +(Ctz8 x) -> (POPCNTB (MOVBZreg (ANDN (ADDconst [-1] x) x))) (BitLen64 x) -> (SUB (MOVDconst [64]) (CNTLZD x)) (BitLen32 x) -> (SUB (MOVDconst [32]) (CNTLZW x)) @@ -339,7 +341,7 @@ // Sign extension dependence on operand sign sets up for sign/zero-extension elision later (Eq8 x y) && isSigned(x.Type) && isSigned(y.Type) -> (Equal (CMPW (SignExt8to32 x) (SignExt8to32 y))) (Eq16 x y) && isSigned(x.Type) && isSigned(y.Type) -> (Equal (CMPW (SignExt16to32 x) (SignExt16to32 y))) -(Eq8 x y) -> (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) +(Eq8 x y) -> (Equal (CMPW (ZeroExt8to32 x) (ZeroExt8to32 y))) (Eq16 x y) -> (Equal (CMPW (ZeroExt16to32 x) (ZeroExt16to32 y))) (Eq32 x y) -> (Equal (CMPW x y)) (Eq64 x y) -> (Equal (CMP x y)) diff --git a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go index 2404d1afd6..90585100f8 100644 --- a/src/cmd/compile/internal/ssa/gen/PPC64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/PPC64Ops.go @@ -215,6 +215,9 @@ func init() { {name: "CNTLZD", argLength: 1, reg: gp11, asm: "CNTLZD", clobberFlags: true}, // count leading zeros {name: "CNTLZW", argLength: 1, reg: gp11, asm: "CNTLZW", clobberFlags: true}, // count leading zeros (32 bit) + {name: "CNTTZD", argLength: 1, reg: gp11, asm: "CNTTZD"}, // count trailing zeros + {name: "CNTTZW", argLength: 1, reg: gp11, asm: "CNTTZW"}, // count trailing zeros (32 bit) + {name: "POPCNTD", argLength: 1, reg: gp11, asm: "POPCNTD"}, // number of set bits in arg0 {name: "POPCNTW", argLength: 1, reg: gp11, asm: "POPCNTW"}, // number of set bits in each word of arg0 placed in corresponding word {name: "POPCNTB", argLength: 1, reg: gp11, asm: "POPCNTB"}, // number of set bits in each byte of arg0 placed in corresonding byte diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 92d161480a..fec35b7c40 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1693,6 +1693,8 @@ const ( OpPPC64ROTLWconst OpPPC64CNTLZD OpPPC64CNTLZW + OpPPC64CNTTZD + OpPPC64CNTTZW OpPPC64POPCNTD OpPPC64POPCNTW OpPPC64POPCNTB @@ -22525,6 +22527,32 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "CNTTZD", + argLen: 1, + asm: ppc64.ACNTTZD, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 + }, + outputs: []outputInfo{ + {0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 + }, + }, + }, + { + name: "CNTTZW", + argLen: 1, + asm: ppc64.ACNTTZW, + reg: regInfo{ + inputs: []inputInfo{ + {0, 1073733630}, // SP SB R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 + }, + outputs: []outputInfo{ + {0, 1073733624}, // R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R14 R15 R16 R17 R18 R19 R20 R21 R22 R23 R24 R25 R26 R27 R28 R29 + }, + }, + }, { name: "POPCNTD", argLen: 1, diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index d1e4482137..012e5c7680 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -1392,10 +1392,13 @@ func rewriteValuePPC64_OpCtz32_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Ctz32 x) - // cond: + // cond: objabi.GOPPC64<=8 // result: (POPCNTW (MOVWZreg (ANDN (ADDconst [-1] x) x))) for { x := v.Args[0] + if !(objabi.GOPPC64 <= 8) { + break + } v.reset(OpPPC64POPCNTW) v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64) v1 := b.NewValue0(v.Pos, OpPPC64ANDN, typ.Int) @@ -1408,6 +1411,17 @@ func rewriteValuePPC64_OpCtz32_0(v *Value) bool { v.AddArg(v0) return true } + // match: (Ctz32 x) + // cond: + // result: (CNTTZW (MOVWZreg x)) + for { + x := v.Args[0] + v.reset(OpPPC64CNTTZW) + v0 := b.NewValue0(v.Pos, OpPPC64MOVWZreg, typ.Int64) + v0.AddArg(x) + v.AddArg(v0) + return true + } } func rewriteValuePPC64_OpCtz32NonZero_0(v *Value) bool { // match: (Ctz32NonZero x) @@ -1424,10 +1438,13 @@ func rewriteValuePPC64_OpCtz64_0(v *Value) bool { b := v.Block typ := &b.Func.Config.Types // match: (Ctz64 x) - // cond: + // cond: objabi.GOPPC64<=8 // result: (POPCNTD (ANDN (ADDconst [-1] x) x)) for { x := v.Args[0] + if !(objabi.GOPPC64 <= 8) { + break + } v.reset(OpPPC64POPCNTD) v0 := b.NewValue0(v.Pos, OpPPC64ANDN, typ.Int64) v1 := b.NewValue0(v.Pos, OpPPC64ADDconst, typ.Int64) @@ -1438,6 +1455,15 @@ func rewriteValuePPC64_OpCtz64_0(v *Value) bool { v.AddArg(v0) return true } + // match: (Ctz64 x) + // cond: + // result: (CNTTZD x) + for { + x := v.Args[0] + v.reset(OpPPC64CNTTZD) + v.AddArg(x) + return true + } } func rewriteValuePPC64_OpCtz64NonZero_0(v *Value) bool { // match: (Ctz64NonZero x) diff --git a/src/cmd/internal/obj/ppc64/a.out.go b/src/cmd/internal/obj/ppc64/a.out.go index 6b248d5c36..c637d54a50 100644 --- a/src/cmd/internal/obj/ppc64/a.out.go +++ b/src/cmd/internal/obj/ppc64/a.out.go @@ -749,6 +749,10 @@ const ( APOPCNTD APOPCNTW APOPCNTB + ACNTTZW + ACNTTZWCC + ACNTTZD + ACNTTZDCC ACOPY APASTECC ADARN diff --git a/src/cmd/internal/obj/ppc64/anames.go b/src/cmd/internal/obj/ppc64/anames.go index fb934e96f9..5a459ee1ce 100644 --- a/src/cmd/internal/obj/ppc64/anames.go +++ b/src/cmd/internal/obj/ppc64/anames.go @@ -341,6 +341,10 @@ var Anames = []string{ "POPCNTD", "POPCNTW", "POPCNTB", + "CNTTZW", + "CNTTZWCC", + "CNTTZD", + "CNTTZDCC", "COPY", "PASTECC", "DARN", diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index f9935d2686..a7ac0ff0c0 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -389,9 +389,10 @@ var optab = []Optab{ {AMOVWZ, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsr */ /* Other ISA 2.05+ instructions */ - {APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0}, /* population count, x-form */ - {ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0}, /* compare byte, x-form */ - {ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0}, /* compare equal byte, x-form */ + {APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0}, /* population count, x-form */ + {ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0}, /* compare byte, x-form */ + {ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0}, /* compare equal byte, x-form, ISA 3.0 */ + {ACMPEQB, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0}, {AFTDIV, C_FREG, C_FREG, C_NONE, C_SCON, 92, 4, 0}, /* floating test for sw divide, x-form */ {AFTSQRT, C_FREG, C_NONE, C_NONE, C_SCON, 93, 4, 0}, /* floating test for sw square root, x-form */ {ACOPY, C_REG, C_NONE, C_NONE, C_REG, 92, 4, 0}, /* copy/paste facility, x-form */ @@ -1304,9 +1305,13 @@ func buildop(ctxt *obj.Link) { opset(ADIVDUVCC, r0) opset(ADIVDUCC, r0) - case APOPCNTD: + case APOPCNTD: /* popcntd, popcntw, popcntb, cnttzw, cnttzd */ opset(APOPCNTW, r0) opset(APOPCNTB, r0) + opset(ACNTTZW, r0) + opset(ACNTTZWCC, r0) + opset(ACNTTZD, r0) + opset(ACNTTZDCC, r0) case ACOPY: /* copy, paste. */ opset(APASTECC, r0) @@ -3760,6 +3765,8 @@ func (c *ctxt9) oprrr(a obj.As) uint32 { return OPVCC(31, 32, 0, 0) case ACMPB: return OPVCC(31, 508, 0, 0) /* cmpb - v2.05 */ + case ACMPEQB: + return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */ case ACNTLZW: return OPVCC(31, 26, 0, 0) @@ -4118,6 +4125,14 @@ func (c *ctxt9) oprrr(a obj.As) uint32 { return OPVCC(31, 378, 0, 0) /* popcntw - v2.06 */ case APOPCNTB: return OPVCC(31, 122, 0, 0) /* popcntb - v2.02 */ + case ACNTTZW: + return OPVCC(31, 538, 0, 0) /* cnttzw - v3.00 */ + case ACNTTZWCC: + return OPVCC(31, 538, 0, 1) /* cnttzw. - v3.00 */ + case ACNTTZD: + return OPVCC(31, 570, 0, 0) /* cnttzd - v3.00 */ + case ACNTTZDCC: + return OPVCC(31, 570, 0, 1) /* cnttzd. - v3.00 */ case ARFI: return OPVCC(19, 50, 0, 0) diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 9a3b00cab7..5c541bfd29 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -261,8 +261,10 @@ func TrailingZeros(n uint) int { // arm:"CLZ" // arm64:"RBIT","CLZ" // s390x:"FLOGR" - // ppc64:"ANDN","POPCNTD" - // ppc64le:"ANDN","POPCNTD" + // ppc64/power8:"ANDN","POPCNTD" + // ppc64le/power8:"ANDN","POPCNTD" + // ppc64/power9: "CNTTZD" + // ppc64le/power9: "CNTTZD" // wasm:"I64Ctz" return bits.TrailingZeros(n) } @@ -271,8 +273,10 @@ func TrailingZeros64(n uint64) int { // amd64:"BSFQ","MOVL\t\\$64","CMOVQEQ" // arm64:"RBIT","CLZ" // s390x:"FLOGR" - // ppc64:"ANDN","POPCNTD" - // ppc64le:"ANDN","POPCNTD" + // ppc64/power8:"ANDN","POPCNTD" + // ppc64le/power8:"ANDN","POPCNTD" + // ppc64/power9: "CNTTZD" + // ppc64le/power9: "CNTTZD" // wasm:"I64Ctz" return bits.TrailingZeros64(n) } @@ -282,8 +286,10 @@ func TrailingZeros32(n uint32) int { // arm:"CLZ" // arm64:"RBITW","CLZW" // s390x:"FLOGR","MOVWZ" - // ppc64:"ANDN","POPCNTW" - // ppc64le:"ANDN","POPCNTW" + // ppc64/power8:"ANDN","POPCNTW" + // ppc64le/power8:"ANDN","POPCNTW" + // ppc64/power9: "CNTTZW" + // ppc64le/power9: "CNTTZW" // wasm:"I64Ctz" return bits.TrailingZeros32(n) } @@ -293,8 +299,10 @@ func TrailingZeros16(n uint16) int { // arm:"ORR\t\\$65536","CLZ",-"MOVHU\tR" // arm64:"ORR\t\\$65536","RBITW","CLZW",-"MOVHU\tR",-"RBIT\t",-"CLZ\t" // s390x:"FLOGR","OR\t\\$65536" - // ppc64:"POPCNTD","OR\\t\\$65536" - // ppc64le:"POPCNTD","OR\\t\\$65536" + // ppc64/power8:"POPCNTD","OR\\t\\$65536" + // ppc64le/power8:"POPCNTD","OR\\t\\$65536" + // ppc64/power9:"CNTTZD","OR\\t\\$65536" + // ppc64le/power9:"CNTTZD","OR\\t\\$65536" // wasm:"I64Ctz" return bits.TrailingZeros16(n) } -- GitLab From 03a79e94ac72f2425a6da0b399dc2f660cf295b6 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 11 Mar 2019 20:21:27 -0700 Subject: [PATCH 0539/1679] testing: stop rounding b.N MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original goal of rounding to readable b.N was to make it easier to eyeball times. However, proper analysis requires tooling (such as benchstat) anyway. Instead, take b.N as it comes. This will reduce the impact of external noise such as GC on benchmarks. This requires reworking our iteration estimates. We used to calculate the estimated ns/op and then divide our target ns by that estimate. However, this order of operations was destructive when the ns/op was very small; rounding could hide almost an order of magnitude of variation. Instead, multiply first, then divide. Also, make n an int64 to avoid overflow. Prior to this change, we attempted to cap b.N at 1e9. Due to rounding up, it was possible to get b.N as high as 2e9. This change consistently enforces the 1e9 cap. This change also reduces the wall time required to run benchmarks. Here's the impact of this change on the wall time to run all benchmarks once with benchtime=1s on some std packages: name old time/op new time/op delta bytes 306s ± 1% 238s ± 1% -22.24% (p=0.000 n=10+10) encoding/json 112s ± 8% 99s ± 7% -11.64% (p=0.000 n=10+10) net/http 54.7s ± 7% 44.9s ± 4% -17.94% (p=0.000 n=10+9) runtime 957s ± 1% 714s ± 0% -25.38% (p=0.000 n=10+9) strings 262s ± 1% 201s ± 1% -23.27% (p=0.000 n=10+10) [Geo mean] 216s 172s -20.23% Updates #24735 Change-Id: I7e38efb8e23c804046bf4fc065b3f5f3991d0a15 Reviewed-on: https://go-review.googlesource.com/c/go/+/112155 Reviewed-by: Austin Clements --- src/cmd/go/go_test.go | 4 +- src/testing/benchmark.go | 71 +++++++++++------------------------ src/testing/benchmark_test.go | 51 ------------------------- src/testing/export_test.go | 6 +-- 4 files changed, 24 insertions(+), 108 deletions(-) diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 240ba594f5..1ee50ac983 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4947,14 +4947,14 @@ func TestTestRegexps(t *testing.T) { x_test.go:15: LOG: Y running N=10000 x_test.go:15: LOG: Y running N=1000000 x_test.go:15: LOG: Y running N=100000000 - x_test.go:15: LOG: Y running N=2000000000 + x_test.go:15: LOG: Y running N=1000000000 --- BENCH: BenchmarkX/Y x_test.go:15: LOG: Y running N=1 x_test.go:15: LOG: Y running N=100 x_test.go:15: LOG: Y running N=10000 x_test.go:15: LOG: Y running N=1000000 x_test.go:15: LOG: Y running N=100000000 - x_test.go:15: LOG: Y running N=2000000000 + x_test.go:15: LOG: Y running N=1000000000 --- BENCH: BenchmarkX x_test.go:13: LOG: X running N=1 --- BENCH: BenchmarkXX diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 73951767bd..407e371c66 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -170,13 +170,6 @@ func (b *B) ReportAllocs() { b.showAllocResult = true } -func (b *B) nsPerOp() int64 { - if b.N <= 0 { - return 0 - } - return b.duration.Nanoseconds() / int64(b.N) -} - // runN runs a single benchmark for the specified number of iterations. func (b *B) runN(n int) { benchmarkLock.Lock() @@ -199,53 +192,20 @@ func (b *B) runN(n int) { } } -func min(x, y int) int { +func min(x, y int64) int64 { if x > y { return y } return x } -func max(x, y int) int { +func max(x, y int64) int64 { if x < y { return y } return x } -// roundDown10 rounds a number down to the nearest power of 10. -func roundDown10(n int) int { - var tens = 0 - // tens = floor(log_10(n)) - for n >= 10 { - n = n / 10 - tens++ - } - // result = 10^tens - result := 1 - for i := 0; i < tens; i++ { - result *= 10 - } - return result -} - -// roundUp rounds x up to a number of the form [1eX, 2eX, 3eX, 5eX]. -func roundUp(n int) int { - base := roundDown10(n) - switch { - case n <= base: - return base - case n <= (2 * base): - return 2 * base - case n <= (3 * base): - return 3 * base - case n <= (5 * base): - return 5 * base - default: - return 10 * base - } -} - // run1 runs the first iteration of benchFunc. It reports whether more // iterations of this benchmarks should be run. func (b *B) run1() bool { @@ -328,20 +288,31 @@ func (b *B) launch() { b.runN(b.benchTime.n) } else { d := b.benchTime.d - for n := 1; !b.failed && b.duration < d && n < 1e9; { + for n := int64(1); !b.failed && b.duration < d && n < 1e9; { last := n // Predict required iterations. - n = int(d.Nanoseconds()) - if nsop := b.nsPerOp(); nsop != 0 { - n /= int(nsop) + goalns := d.Nanoseconds() + prevIters := int64(b.N) + prevns := b.duration.Nanoseconds() + if prevns <= 0 { + // Round up, to avoid div by zero. + prevns = 1 } + // Order of operations matters. + // For very fast benchmarks, prevIters ~= prevns. + // If you divide first, you get 0 or 1, + // which can hide an order of magnitude in execution time. + // So multiply first, then divide. + n = goalns * prevIters / prevns // Run more iterations than we think we'll need (1.2x). + n += n / 5 // Don't grow too fast in case we had timing errors previously. + n = min(n, 100*last) // Be sure to run at least one more than last time. - n = max(min(n+n/5, 100*last), last+1) - // Round up to something easy to read. - n = roundUp(n) - b.runN(n) + n = max(n, last+1) + // Don't run more than 1e9 times. (This also keeps n in int range on 32 bit platforms.) + n = min(n, 1e9) + b.runN(int(n)) } } b.result = BenchmarkResult{b.N, b.duration, b.bytes, b.netAllocs, b.netBytes, b.extra} diff --git a/src/testing/benchmark_test.go b/src/testing/benchmark_test.go index 9e87f137f1..7d28fb632a 100644 --- a/src/testing/benchmark_test.go +++ b/src/testing/benchmark_test.go @@ -14,57 +14,6 @@ import ( "text/template" ) -var roundDownTests = []struct { - v, expected int -}{ - {1, 1}, - {9, 1}, - {10, 10}, - {11, 10}, - {100, 100}, - {101, 100}, - {999, 100}, - {1000, 1000}, - {1001, 1000}, -} - -func TestRoundDown10(t *testing.T) { - for _, tt := range roundDownTests { - actual := testing.RoundDown10(tt.v) - if tt.expected != actual { - t.Errorf("roundDown10(%d): expected %d, actual %d", tt.v, tt.expected, actual) - } - } -} - -var roundUpTests = []struct { - v, expected int -}{ - {0, 1}, - {1, 1}, - {2, 2}, - {3, 3}, - {5, 5}, - {9, 10}, - {999, 1000}, - {1000, 1000}, - {1400, 2000}, - {1700, 2000}, - {2700, 3000}, - {4999, 5000}, - {5000, 5000}, - {5001, 10000}, -} - -func TestRoundUp(t *testing.T) { - for _, tt := range roundUpTests { - actual := testing.RoundUp(tt.v) - if tt.expected != actual { - t.Errorf("roundUp(%d): expected %d, actual %d", tt.v, tt.expected, actual) - } - } -} - var prettyPrintTests = []struct { v float64 expected string diff --git a/src/testing/export_test.go b/src/testing/export_test.go index 65e5c3dbb8..0022491ecd 100644 --- a/src/testing/export_test.go +++ b/src/testing/export_test.go @@ -4,8 +4,4 @@ package testing -var ( - RoundDown10 = roundDown10 - RoundUp = roundUp - PrettyPrint = prettyPrint -) +var PrettyPrint = prettyPrint -- GitLab From ba965640a45f5d94976c3ad6c92396cab539155a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 17 Mar 2019 17:48:57 +0100 Subject: [PATCH 0540/1679] cmd/link/internal/ld: enable bitcode builds for iOS, tvOS, watchOS The Go toolchain cannot output bitcode, but there is a trick where object code can be marked with an __asm section, persuading the Apple toolchain to include our object code in bitcode builds. This enables Go builds with bitcode enabled; the next CL adds the necessary plumbing for building on tvOS and watchOS. Thanks to Aman Gupta for the trick. Test is added two CLs from here. Fixes #22395 (at least until Apple tightens bitcode requirements.) Change-Id: Ic1c1448c4d46222bb3dd097b1f4df80848051e5f Reviewed-on: https://go-review.googlesource.com/c/go/+/168320 Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/macho.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index b935814ff0..f2756678d6 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -395,6 +395,14 @@ func (ctxt *Link) domacho() { s.Type = sym.SMACHOINDIRECTGOT s.Attr |= sym.AttrReachable } + + // Add a dummy symbol that will become the __asm marker section. + if ctxt.LinkMode == LinkExternal { + s := ctxt.Syms.Lookup(".llvmasm", 0) + s.Type = sym.SMACHO + s.Attr |= sym.AttrReachable + s.AddUint8(0) + } } func machoadddynlib(lib string, linkmode LinkMode) { @@ -481,6 +489,17 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string) msect.flag = S_MOD_INIT_FUNC_POINTERS } + // Some platforms such as watchOS and tvOS require binaries with + // bitcode enabled. The Go toolchain can't output bitcode, so use + // a marker section in the __LLVM segment, "__asm", to tell the Apple + // toolchain that the Go text came from assembler and thus has no + // bitcode. This is not true, but Kotlin/Native, Rust and Flutter + // are also using this trick. + if sect.Name == ".llvmasm" { + msect.name = "__asm" + msect.segname = "__LLVM" + } + if segname == "__DWARF" { msect.flag |= S_ATTR_DEBUG } -- GitLab From 0fe1986a72ea578390d4909988a1d7cb3a687544 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 20 Mar 2019 20:10:38 +0100 Subject: [PATCH 0541/1679] cmd/link/internal/ld: extract Mach-O load command parsing We're going to need the ability to extract the LC_VERSION_MIN_* and LC_BUILD_VERSION load commands. This CL adds peekMachoPlatform to do that and in the process simplifies machoCombineDwarf. While here, disable DWARF combining for Apple platforms other than macOS (watchOS, tvOS, bridgeOS), not just iOS. Updates #22395 Change-Id: I4862b0f15ccc87b7be1a6532b4d37b47c8f7f243 Reviewed-on: https://go-review.googlesource.com/c/go/+/168459 Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/lib.go | 18 +++- src/cmd/link/internal/ld/macho.go | 58 ++++++++++++ .../link/internal/ld/macho_combine_dwarf.go | 91 +++++++------------ 3 files changed, 109 insertions(+), 58 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 076d2a71b9..2900268a57 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -44,6 +44,7 @@ import ( "cmd/link/internal/sym" "crypto/sha1" "debug/elf" + "debug/macho" "encoding/base64" "encoding/binary" "encoding/hex" @@ -1449,11 +1450,24 @@ func (ctxt *Link) hostlink() { } // For os.Rename to work reliably, must be in same directory as outfile. combinedOutput := *flagOutfile + "~" - isIOS, err := machoCombineDwarf(ctxt, *flagOutfile, dsym, combinedOutput) + exef, err := os.Open(*flagOutfile) if err != nil { Exitf("%s: combining dwarf failed: %v", os.Args[0], err) } - if !isIOS { + defer exef.Close() + exem, err := macho.NewFile(exef) + if err != nil { + Exitf("%s: parsing Mach-O header failed: %v", os.Args[0], err) + } + load, err := peekMachoPlatform(exem) + if err != nil { + Exitf("%s: failed to parse Mach-O load commands: %v", os.Args[0], err) + } + // Only macOS supports unmapped segments such as our __DWARF segment. + if load == nil || load.platform == PLATFORM_MACOS { + if err := machoCombineDwarf(ctxt, exef, exem, dsym, combinedOutput); err != nil { + Exitf("%s: combining dwarf failed: %v", os.Args[0], err) + } os.Remove(*flagOutfile) if err := os.Rename(combinedOutput, *flagOutfile); err != nil { Exitf("%s: %v", os.Args[0], err) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index f2756678d6..32b2013059 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -5,9 +5,12 @@ package ld import ( + "bytes" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" + "debug/macho" + "encoding/binary" "sort" "strings" ) @@ -45,11 +48,20 @@ type MachoSeg struct { flag uint32 } +// MachoPlatformLoad represents a LC_VERSION_MIN_* or +// LC_BUILD_VERSION load command. +type MachoPlatformLoad struct { + platform MachoPlatform // One of PLATFORM_* constants. + cmd MachoLoad +} + type MachoLoad struct { type_ uint32 data []uint32 } +type MachoPlatform int + /* * Total amount of space to reserve at the start of the file * for Header, PHeaders, and SHeaders. @@ -167,6 +179,14 @@ const ( S_ATTR_SOME_INSTRUCTIONS = 0x00000400 ) +const ( + PLATFORM_MACOS MachoPlatform = 1 + PLATFORM_IOS MachoPlatform = 2 + PLATFORM_TVOS MachoPlatform = 3 + PLATFORM_WATCHOS MachoPlatform = 4 + PLATFORM_BRIDGEOS MachoPlatform = 5 +) + // Mach-O file writing // https://developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html @@ -996,3 +1016,41 @@ func Machoemitreloc(ctxt *Link) { machorelocsect(ctxt, sect, dwarfp) } } + +// peekMachoPlatform returns the first LC_VERSION_MIN_* or LC_BUILD_VERSION +// load command found in the Mach-O file, if any. +func peekMachoPlatform(m *macho.File) (*MachoPlatformLoad, error) { + for _, cmd := range m.Loads { + raw := cmd.Raw() + ml := MachoLoad{ + type_: m.ByteOrder.Uint32(raw), + } + // Skip the type and command length. + data := raw[8:] + var p MachoPlatform + switch ml.type_ { + case LC_VERSION_MIN_IPHONEOS: + p = PLATFORM_IOS + case LC_VERSION_MIN_MACOSX: + p = PLATFORM_MACOS + case LC_VERSION_MIN_WATCHOS: + p = PLATFORM_WATCHOS + case LC_VERSION_MIN_TVOS: + p = PLATFORM_TVOS + case LC_BUILD_VERSION: + p = MachoPlatform(m.ByteOrder.Uint32(data)) + default: + continue + } + ml.data = make([]uint32, len(data)/4) + r := bytes.NewReader(data) + if err := binary.Read(r, m.ByteOrder, &ml.data); err != nil { + return nil, err + } + return &MachoPlatformLoad{ + platform: p, + cmd: ml, + }, nil + } + return nil, nil +} diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go index 95bd4c7c36..1e8ee48b04 100644 --- a/src/cmd/link/internal/ld/macho_combine_dwarf.go +++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go @@ -86,55 +86,28 @@ func (r loadCmdReader) WriteAt(offset int64, data interface{}) error { } // machoCombineDwarf merges dwarf info generated by dsymutil into a macho executable. -// machoCombineDwarf returns true and skips merging if the input executable is for iOS. // // With internal linking, DWARF is embedded into the executable, this lets us do the // same for external linking. -// inexe is the path to the executable with no DWARF. It must have enough room in the macho +// exef is the file of the executable with no DWARF. It must have enough room in the macho // header to add the DWARF sections. (Use ld's -headerpad option) +// exem is the macho representation of exef. // dsym is the path to the macho file containing DWARF from dsymutil. // outexe is the path where the combined executable should be saved. -func machoCombineDwarf(ctxt *Link, inexe, dsym, outexe string) (bool, error) { - exef, err := os.Open(inexe) - if err != nil { - return false, err - } - exem, err := macho.NewFile(exef) - if err != nil { - return false, err - } - cmdOffset := unsafe.Sizeof(exem.FileHeader) - is64bit := exem.Magic == macho.Magic64 - if is64bit { - // mach_header_64 has one extra uint32. - cmdOffset += unsafe.Sizeof(exem.Magic) - } - // Check for LC_VERSION_MIN_IPHONEOS. - reader := loadCmdReader{next: int64(cmdOffset), f: exef, order: exem.ByteOrder} - for i := uint32(0); i < exem.Ncmd; i++ { - cmd, err := reader.Next() - if err != nil { - return false, err - } - if cmd.Cmd == LC_VERSION_MIN_IPHONEOS { - // The executable is for iOS, which doesn't support unmapped - // segments such as our __DWARF segment. Skip combining. - return true, nil - } - } +func machoCombineDwarf(ctxt *Link, exef *os.File, exem *macho.File, dsym, outexe string) error { dwarff, err := os.Open(dsym) if err != nil { - return false, err + return err } outf, err := os.Create(outexe) if err != nil { - return false, err + return err } outf.Chmod(0755) dwarfm, err := macho.NewFile(dwarff) if err != nil { - return false, err + return err } // The string table needs to be the last thing in the file @@ -142,26 +115,26 @@ func machoCombineDwarf(ctxt *Link, inexe, dsym, outexe string) (bool, error) { // linkedit section, but all the others can be copied directly. linkseg = exem.Segment("__LINKEDIT") if linkseg == nil { - return false, fmt.Errorf("missing __LINKEDIT segment") + return fmt.Errorf("missing __LINKEDIT segment") } if _, err = exef.Seek(0, 0); err != nil { - return false, err + return err } if _, err := io.CopyN(outf, exef, int64(linkseg.Offset)); err != nil { - return false, err + return err } realdwarf = dwarfm.Segment("__DWARF") if realdwarf == nil { - return false, fmt.Errorf("missing __DWARF segment") + return fmt.Errorf("missing __DWARF segment") } // Try to compress the DWARF sections. This includes some Apple // proprietary sections like __apple_types. compressedSects, compressedBytes, err := machoCompressSections(ctxt, dwarfm) if err != nil { - return false, err + return err } // Now copy the dwarf data into the output. @@ -169,12 +142,12 @@ func machoCombineDwarf(ctxt *Link, inexe, dsym, outexe string) (bool, error) { // even though we mark this one as being 0 bytes of virtual address space. dwarfstart = machoCalcStart(realdwarf.Offset, linkseg.Offset, pageAlign) if _, err = outf.Seek(dwarfstart, 0); err != nil { - return false, err + return err } dwarfaddr = int64((linkseg.Addr + linkseg.Memsz + 1< Date: Tue, 19 Mar 2019 13:19:48 +0200 Subject: [PATCH 0542/1679] cmd/link/internal/ld: copy Mach-O platform version commands to go.o To build for watchOS and tvOS the Apple toolchain requires a Mach-O load command that matches the platform for all object files in a build. The go.o object file produced by the Go linker contains no such command. The loader commands are mutually exclusive so we need to pick the right one. Fortunately, cgo must be enabled for watchOS and tvOS to be useful, so we can copy the first loader command we find in the object files produced by the host compiler. Add a test that builds a small program for tvOS to test both this CL and the previous CL that added bitcode support. Updates #22395 Change-Id: I7a47d19be9d80f0459dc358c600cddd9f236c444 Reviewed-on: https://go-review.googlesource.com/c/go/+/168321 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/dwarf_test.go | 51 +++++++++++++++++++++++++++++++ src/cmd/link/internal/ld/macho.go | 39 +++++++++++++++++++++-- src/cmd/link/testdata/lib.go | 8 +++++ src/cmd/link/testdata/main.m | 5 +++ 4 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 src/cmd/link/testdata/lib.go create mode 100644 src/cmd/link/testdata/main.m diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index ecc96019be..e9c9e29301 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -171,3 +171,54 @@ func TestDWARFiOS(t *testing.T) { testDWARF(t, "c-archive", true, cc, "CGO_ENABLED=1", "GOOS=darwin", "GOARCH=arm", "GOARM=7") testDWARF(t, "c-archive", true, cc, "CGO_ENABLED=1", "GOOS=darwin", "GOARCH=arm64") } + +func TestBuildFortvOS(t *testing.T) { + testenv.MustHaveCGO(t) + testenv.MustHaveGoBuild(t) + + // Only run this on darwin/amd64, where we can cross build for tvOS. + if runtime.GOARCH != "amd64" || runtime.GOOS != "darwin" { + t.Skip("skipping on non-darwin/amd64 platform") + } + if err := exec.Command("xcrun", "--help").Run(); err != nil { + t.Skipf("error running xcrun, required for iOS cross build: %v", err) + } + + sdkPath, err := exec.Command("xcrun", "--sdk", "appletvos", "--show-sdk-path").Output() + if err != nil { + t.Fatalf("xcrun --sdk appletvos --show-sdk-path failed: %v", err) + } + CC := []string{ + "clang", + "-arch", + "arm64", + "-isysroot", strings.TrimSpace(string(sdkPath)), + "-mtvos-version-min=12.0", + "-fembed-bitcode", + "-framework", "CoreFoundation", + } + lib := filepath.Join("testdata", "lib.go") + tmpDir, err := ioutil.TempDir("", "go-link-TestBuildFortvOS") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + ar := filepath.Join(tmpDir, "lib.a") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-buildmode=c-archive", "-o", ar, lib) + cmd.Env = append(os.Environ(), + "CGO_ENABLED=1", + "GOOS=darwin", + "GOARCH=arm64", + "CC="+strings.Join(CC, " "), + ) + if out, err := cmd.CombinedOutput(); err != nil { + t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) + } + + link := exec.Command(CC[0], CC[1:]...) + link.Args = append(link.Args, ar, filepath.Join("testdata", "main.m")) + if out, err := link.CombinedOutput(); err != nil { + t.Fatalf("%v: %v:\n%s", link.Args, err, out) + } +} diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 32b2013059..98359c26fc 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -11,6 +11,9 @@ import ( "cmd/link/internal/sym" "debug/macho" "encoding/binary" + "fmt" + "io" + "os" "sort" "strings" ) @@ -691,8 +694,14 @@ func Asmbmacho(ctxt *Link) { } } } - - if ctxt.LinkMode == LinkInternal { + load, err := hostobjMachoPlatform(hostobj) + if err != nil { + Exitf("%v", err) + } + if load != nil { + ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data))) + copy(ml.data, load.cmd.data) + } else if ctxt.LinkMode == LinkInternal { // For lldb, must say LC_VERSION_MIN_MACOSX or else // it won't know that this Mach-O binary is from OS X // (could be iOS or WatchOS instead). @@ -1017,6 +1026,32 @@ func Machoemitreloc(ctxt *Link) { } } +// hostobjMachoPlatform returns the first platform load command found +// in the host objects, if any. +func hostobjMachoPlatform(hostobj []Hostobj) (*MachoPlatformLoad, error) { + for _, h := range hostobj { + f, err := os.Open(h.file) + if err != nil { + return nil, fmt.Errorf("%s: failed to open host object: %v\n", h.file, err) + } + defer f.Close() + sr := io.NewSectionReader(f, h.off, h.length) + m, err := macho.NewFile(sr) + if err != nil { + // Not a valid Mach-O file. + return nil, nil + } + load, err := peekMachoPlatform(m) + if err != nil { + return nil, err + } + if load != nil { + return load, nil + } + } + return nil, nil +} + // peekMachoPlatform returns the first LC_VERSION_MIN_* or LC_BUILD_VERSION // load command found in the Mach-O file, if any. func peekMachoPlatform(m *macho.File) (*MachoPlatformLoad, error) { diff --git a/src/cmd/link/testdata/lib.go b/src/cmd/link/testdata/lib.go new file mode 100644 index 0000000000..bc6c699440 --- /dev/null +++ b/src/cmd/link/testdata/lib.go @@ -0,0 +1,8 @@ +package main + +import "C" + +//export GoFunc +func GoFunc() {} + +func main() {} diff --git a/src/cmd/link/testdata/main.m b/src/cmd/link/testdata/main.m new file mode 100644 index 0000000000..1c8175f6cc --- /dev/null +++ b/src/cmd/link/testdata/main.m @@ -0,0 +1,5 @@ +extern void GoFunc(); + +int main(int argc, char **argv) { + GoFunc(); +} -- GitLab From eb00167e27ba3525d26bbe9286c82090da782587 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 21 Mar 2019 13:42:53 +0100 Subject: [PATCH 0543/1679] cmd/link: skip TestBuildFortvOS if the SDK is missing While we're here, move the test from dwarf_test.go to link_test.go; it doesn't have anything to do with DWARF. Should fix the macOS builders with only the Xcode command line tools installed. Change-Id: Iaaba1b589f4d778705f7b627f78c2b12388e2b3b Reviewed-on: https://go-review.googlesource.com/c/go/+/168462 TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/cmd/link/dwarf_test.go | 51 ------------------------------------- src/cmd/link/link_test.go | 52 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index e9c9e29301..ecc96019be 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -171,54 +171,3 @@ func TestDWARFiOS(t *testing.T) { testDWARF(t, "c-archive", true, cc, "CGO_ENABLED=1", "GOOS=darwin", "GOARCH=arm", "GOARM=7") testDWARF(t, "c-archive", true, cc, "CGO_ENABLED=1", "GOOS=darwin", "GOARCH=arm64") } - -func TestBuildFortvOS(t *testing.T) { - testenv.MustHaveCGO(t) - testenv.MustHaveGoBuild(t) - - // Only run this on darwin/amd64, where we can cross build for tvOS. - if runtime.GOARCH != "amd64" || runtime.GOOS != "darwin" { - t.Skip("skipping on non-darwin/amd64 platform") - } - if err := exec.Command("xcrun", "--help").Run(); err != nil { - t.Skipf("error running xcrun, required for iOS cross build: %v", err) - } - - sdkPath, err := exec.Command("xcrun", "--sdk", "appletvos", "--show-sdk-path").Output() - if err != nil { - t.Fatalf("xcrun --sdk appletvos --show-sdk-path failed: %v", err) - } - CC := []string{ - "clang", - "-arch", - "arm64", - "-isysroot", strings.TrimSpace(string(sdkPath)), - "-mtvos-version-min=12.0", - "-fembed-bitcode", - "-framework", "CoreFoundation", - } - lib := filepath.Join("testdata", "lib.go") - tmpDir, err := ioutil.TempDir("", "go-link-TestBuildFortvOS") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - ar := filepath.Join(tmpDir, "lib.a") - cmd := exec.Command(testenv.GoToolPath(t), "build", "-buildmode=c-archive", "-o", ar, lib) - cmd.Env = append(os.Environ(), - "CGO_ENABLED=1", - "GOOS=darwin", - "GOARCH=arm64", - "CC="+strings.Join(CC, " "), - ) - if out, err := cmd.CombinedOutput(); err != nil { - t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) - } - - link := exec.Command(CC[0], CC[1:]...) - link.Args = append(link.Args, ar, filepath.Join("testdata", "main.m")) - if out, err := link.CombinedOutput(); err != nil { - t.Fatalf("%v: %v:\n%s", link.Args, err, out) - } -} diff --git a/src/cmd/link/link_test.go b/src/cmd/link/link_test.go index bcb3f2f58b..5ecda58707 100644 --- a/src/cmd/link/link_test.go +++ b/src/cmd/link/link_test.go @@ -7,6 +7,7 @@ import ( "os/exec" "path/filepath" "regexp" + "runtime" "strings" "testing" ) @@ -177,3 +178,54 @@ main.x: relocation target main.zero not defined t.Fatalf("want:\n%sgot:\n%s", want, got) } } + +func TestBuildFortvOS(t *testing.T) { + testenv.MustHaveCGO(t) + testenv.MustHaveGoBuild(t) + + // Only run this on darwin/amd64, where we can cross build for tvOS. + if runtime.GOARCH != "amd64" || runtime.GOOS != "darwin" { + t.Skip("skipping on non-darwin/amd64 platform") + } + if err := exec.Command("xcrun", "--help").Run(); err != nil { + t.Skipf("error running xcrun, required for iOS cross build: %v", err) + } + + sdkPath, err := exec.Command("xcrun", "--sdk", "appletvos", "--show-sdk-path").Output() + if err != nil { + t.Skip("failed to locate appletvos SDK, skipping") + } + CC := []string{ + "clang", + "-arch", + "arm64", + "-isysroot", strings.TrimSpace(string(sdkPath)), + "-mtvos-version-min=12.0", + "-fembed-bitcode", + "-framework", "CoreFoundation", + } + lib := filepath.Join("testdata", "lib.go") + tmpDir, err := ioutil.TempDir("", "go-link-TestBuildFortvOS") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tmpDir) + + ar := filepath.Join(tmpDir, "lib.a") + cmd := exec.Command(testenv.GoToolPath(t), "build", "-buildmode=c-archive", "-o", ar, lib) + cmd.Env = append(os.Environ(), + "CGO_ENABLED=1", + "GOOS=darwin", + "GOARCH=arm64", + "CC="+strings.Join(CC, " "), + ) + if out, err := cmd.CombinedOutput(); err != nil { + t.Fatalf("%v: %v:\n%s", cmd.Args, err, out) + } + + link := exec.Command(CC[0], CC[1:]...) + link.Args = append(link.Args, ar, filepath.Join("testdata", "main.m")) + if out, err := link.CombinedOutput(); err != nil { + t.Fatalf("%v: %v:\n%s", link.Args, err, out) + } +} -- GitLab From 6249ea2f39958764b88ab1b03cd55cf99dae6bbd Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 20 Mar 2019 14:09:51 -0700 Subject: [PATCH 0544/1679] os/exec: add Cmd.String The initial implementation is intentionally simple. Let's see how far it gets us. Fixes #30638 Change-Id: I240afae2b401744ab2ff2a69952c4eb0fd3feb56 Reviewed-on: https://go-review.googlesource.com/c/go/+/168518 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/os/exec/exec.go | 19 +++++++++++++++++++ src/os/exec/exec_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/os/exec/exec.go b/src/os/exec/exec.go index 424b49cf06..d481cf7798 100644 --- a/src/os/exec/exec.go +++ b/src/os/exec/exec.go @@ -190,6 +190,25 @@ func CommandContext(ctx context.Context, name string, arg ...string) *Cmd { return cmd } +// String returns a human-readable description of c. +// It is intended only for debugging. +// In particular, it is not suitable for use as input to a shell. +// The output of String may vary across Go releases. +func (c *Cmd) String() string { + if c.lookPathErr != nil { + // failed to resolve path; report the original requested path (plus args) + return strings.Join(c.Args, " ") + } + // report the exact executable path (plus args) + b := new(strings.Builder) + b.WriteString(c.Path) + for _, a := range c.Args[1:] { + b.WriteByte(' ') + b.WriteString(a) + } + return b.String() +} + // interfaceEqual protects against panics from doing equality tests on // two interfaces with non-comparable underlying types. func interfaceEqual(a, b interface{}) bool { diff --git a/src/os/exec/exec_test.go b/src/os/exec/exec_test.go index 3e6b7bb95e..26be62dd92 100644 --- a/src/os/exec/exec_test.go +++ b/src/os/exec/exec_test.go @@ -1150,3 +1150,37 @@ func TestDedupEnvEcho(t *testing.T) { t.Errorf("output = %q; want %q", got, want) } } + +func TestString(t *testing.T) { + echoPath, err := exec.LookPath("echo") + if err != nil { + t.Skip(err) + } + tests := [...]struct { + path string + args []string + want string + }{ + {"echo", nil, echoPath}, + {"echo", []string{"a"}, echoPath + " a"}, + {"echo", []string{"a", "b"}, echoPath + " a b"}, + } + for _, test := range tests { + cmd := exec.Command(test.path, test.args...) + if got := cmd.String(); got != test.want { + t.Errorf("String(%q, %q) = %q, want %q", test.path, test.args, got, test.want) + } + } +} + +func TestStringPathNotResolved(t *testing.T) { + _, err := exec.LookPath("makemeasandwich") + if err == nil { + t.Skip("wow, thanks") + } + cmd := exec.Command("makemeasandwich", "-lettuce") + want := "makemeasandwich -lettuce" + if got := cmd.String(); got != want { + t.Errorf("String(%q, %q) = %q, want %q", "makemeasandwich", "-lettuce", got, want) + } +} -- GitLab From 409c97c5f017037e3a47aff64e3e65ce22eee5ba Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 19 Mar 2019 06:59:51 +0100 Subject: [PATCH 0545/1679] misc/android: pass on GOPROXY to device environment Android devices don't have git available, so many go tool commands that fetch dependencies fail. Builders already have a GOPROXY available, so pass that along to the device environment. Updates #30885 Change-Id: Id0d2338932f0cd7de4d95d9e0ca9b79d29336ffe Reviewed-on: https://go-review.googlesource.com/c/go/+/168118 TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/android/go_android_exec.go | 1 + 1 file changed, 1 insertion(+) diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index 2be0b07502..e20b99a4e8 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -158,6 +158,7 @@ func runMain() (int, error) { `; export GOROOT="` + deviceGoroot + `"` + `; export GOPATH="` + deviceGopath + `"` + `; export CGO_ENABLED=0` + + `; export GOPROXY=` + os.Getenv("GOPROXY") + `; export GOCACHE="` + deviceRoot + `/gocache"` + `; export PATH=$PATH:"` + deviceGoroot + `/bin"` + `; cd "` + deviceCwd + `"` + -- GitLab From 7ae8e53de293dd567c1d02dec679f67381c9ace5 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 21 Mar 2019 15:15:40 +0100 Subject: [PATCH 0546/1679] misc/ios: don't override GOCACHE on the device The iOS exec wrapper copies the environment variables to the binary running on the device. However, some variables such as HOME, TMPDIR and GOCACHE refer to directories that might not be valid on the device. The wrapper already ignores HOME and TMPDIR, but after GO111MODULE was flipped to on for the standard library, cmd/go tests started failing without a valid and writable GOCACHE. It took a while to reproduce because go test does not set an explicit GOCACHE but cmd/dist test does. Fixes #30914 Change-Id: If186cddc5cfd7ad39a0b3eb95f9c64a7d53a27e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/168557 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/ios/go_darwin_arm_exec.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/ios/go_darwin_arm_exec.go b/misc/ios/go_darwin_arm_exec.go index 8912d1e8fc..cdf4b07d0a 100644 --- a/misc/ios/go_darwin_arm_exec.go +++ b/misc/ios/go_darwin_arm_exec.go @@ -467,8 +467,8 @@ func idevCmd(cmd *exec.Cmd) *exec.Cmd { func run(appdir, bundleID string, args []string) error { var env []string for _, e := range os.Environ() { - // Don't override TMPDIR, HOME on the device. - if strings.HasPrefix(e, "TMPDIR=") || strings.HasPrefix(e, "HOME=") { + // Don't override TMPDIR, HOME, GOCACHE on the device. + if strings.HasPrefix(e, "TMPDIR=") || strings.HasPrefix(e, "HOME=") || strings.HasPrefix(e, "GOCACHE=") { continue } env = append(env, e) -- GitLab From 700e969d5b23732179ea86cfe67e8d1a0a1cc10a Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 21 Mar 2019 09:16:56 -0700 Subject: [PATCH 0547/1679] cmd/compile: regenerate rewrite rules Change-Id: I7e921b7b4665ff76dc8bae493b2a49318690770b Reviewed-on: https://go-review.googlesource.com/c/go/+/168637 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Michael Munday Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/ssa/rewrite386.go | 18 +++------ .../internal/ssa/rewrite386splitload.go | 30 +++----------- src/cmd/compile/internal/ssa/rewriteAMD64.go | 18 +++------ .../internal/ssa/rewriteAMD64splitload.go | 40 ++++--------------- src/cmd/compile/internal/ssa/rewriteARM.go | 18 +++------ src/cmd/compile/internal/ssa/rewriteARM64.go | 9 ++--- src/cmd/compile/internal/ssa/rewriteMIPS.go | 18 +++------ src/cmd/compile/internal/ssa/rewriteMIPS64.go | 9 ++--- src/cmd/compile/internal/ssa/rewritePPC64.go | 9 ++--- src/cmd/compile/internal/ssa/rewriteS390X.go | 9 ++--- 10 files changed, 50 insertions(+), 128 deletions(-) diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index bb59feab0b..aae0c59300 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -22907,10 +22907,9 @@ func rewriteValue386_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -22926,10 +22925,9 @@ func rewriteValue386_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -22945,10 +22943,9 @@ func rewriteValue386_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } @@ -22967,11 +22964,10 @@ func rewriteValue386_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendA [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 0) { break } @@ -22988,11 +22984,10 @@ func rewriteValue386_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendB [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 1) { break } @@ -23009,11 +23004,10 @@ func rewriteValue386_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendC [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewrite386splitload.go b/src/cmd/compile/internal/ssa/rewrite386splitload.go index 96f8cf587a..31ed4d0a41 100644 --- a/src/cmd/compile/internal/ssa/rewrite386splitload.go +++ b/src/cmd/compile/internal/ssa/rewrite386splitload.go @@ -34,18 +34,15 @@ func rewriteValue386splitload(v *Value) bool { } func rewriteValue386splitload_Op386CMPBconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPBconstload {sym} [vo] ptr mem) // cond: // result: (CMPBconst (MOVBload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(Op386CMPBconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) @@ -59,19 +56,16 @@ func rewriteValue386splitload_Op386CMPBconstload_0(v *Value) bool { } func rewriteValue386splitload_Op386CMPBload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPBload {sym} [off] ptr x mem) // cond: // result: (CMPB (MOVBload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(Op386CMPB) v0 := b.NewValue0(v.Pos, Op386MOVBload, typ.UInt8) v0.AuxInt = off @@ -85,18 +79,15 @@ func rewriteValue386splitload_Op386CMPBload_0(v *Value) bool { } func rewriteValue386splitload_Op386CMPLconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPLconstload {sym} [vo] ptr mem) // cond: // result: (CMPLconst (MOVLload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(Op386CMPLconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) @@ -110,19 +101,16 @@ func rewriteValue386splitload_Op386CMPLconstload_0(v *Value) bool { } func rewriteValue386splitload_Op386CMPLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPLload {sym} [off] ptr x mem) // cond: // result: (CMPL (MOVLload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(Op386CMPL) v0 := b.NewValue0(v.Pos, Op386MOVLload, typ.UInt32) v0.AuxInt = off @@ -136,18 +124,15 @@ func rewriteValue386splitload_Op386CMPLload_0(v *Value) bool { } func rewriteValue386splitload_Op386CMPWconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPWconstload {sym} [vo] ptr mem) // cond: // result: (CMPWconst (MOVWload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(Op386CMPWconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) @@ -161,19 +146,16 @@ func rewriteValue386splitload_Op386CMPWconstload_0(v *Value) bool { } func rewriteValue386splitload_Op386CMPWload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPWload {sym} [off] ptr x mem) // cond: // result: (CMPW (MOVWload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(Op386CMPW) v0 := b.NewValue0(v.Pos, Op386MOVWload, typ.UInt16) v0.AuxInt = off diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index 708ab9df05..c377e28170 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -61719,10 +61719,9 @@ func rewriteValueAMD64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -61738,10 +61737,9 @@ func rewriteValueAMD64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -61757,10 +61755,9 @@ func rewriteValueAMD64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } @@ -61779,11 +61776,10 @@ func rewriteValueAMD64_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendA [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 0) { break } @@ -61800,11 +61796,10 @@ func rewriteValueAMD64_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendB [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 1) { break } @@ -61821,11 +61816,10 @@ func rewriteValueAMD64_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendC [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go index af7067b754..dbd0e031a4 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go @@ -38,18 +38,15 @@ func rewriteValueAMD64splitload(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPBconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPBconstload {sym} [vo] ptr mem) // cond: // result: (CMPBconst (MOVBload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64CMPBconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, OpAMD64MOVBload, typ.UInt8) @@ -63,19 +60,16 @@ func rewriteValueAMD64splitload_OpAMD64CMPBconstload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPBload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPBload {sym} [off] ptr x mem) // cond: // result: (CMPB (MOVBload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64CMPB) v0 := b.NewValue0(v.Pos, OpAMD64MOVBload, typ.UInt8) v0.AuxInt = off @@ -89,18 +83,15 @@ func rewriteValueAMD64splitload_OpAMD64CMPBload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPLconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPLconstload {sym} [vo] ptr mem) // cond: // result: (CMPLconst (MOVLload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64CMPLconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, OpAMD64MOVLload, typ.UInt32) @@ -114,19 +105,16 @@ func rewriteValueAMD64splitload_OpAMD64CMPLconstload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPLload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPLload {sym} [off] ptr x mem) // cond: // result: (CMPL (MOVLload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64CMPL) v0 := b.NewValue0(v.Pos, OpAMD64MOVLload, typ.UInt32) v0.AuxInt = off @@ -140,18 +128,15 @@ func rewriteValueAMD64splitload_OpAMD64CMPLload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPQconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPQconstload {sym} [vo] ptr mem) // cond: // result: (CMPQconst (MOVQload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64CMPQconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, OpAMD64MOVQload, typ.UInt64) @@ -165,19 +150,16 @@ func rewriteValueAMD64splitload_OpAMD64CMPQconstload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPQload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPQload {sym} [off] ptr x mem) // cond: // result: (CMPQ (MOVQload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64CMPQ) v0 := b.NewValue0(v.Pos, OpAMD64MOVQload, typ.UInt64) v0.AuxInt = off @@ -191,18 +173,15 @@ func rewriteValueAMD64splitload_OpAMD64CMPQload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPWconstload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPWconstload {sym} [vo] ptr mem) // cond: // result: (CMPWconst (MOVWload {sym} [offOnly(vo)] ptr mem) [valOnly(vo)]) for { vo := v.AuxInt sym := v.Aux - _ = v.Args[1] - ptr := v.Args[0] mem := v.Args[1] + ptr := v.Args[0] v.reset(OpAMD64CMPWconst) v.AuxInt = valOnly(vo) v0 := b.NewValue0(v.Pos, OpAMD64MOVWload, typ.UInt16) @@ -216,19 +195,16 @@ func rewriteValueAMD64splitload_OpAMD64CMPWconstload_0(v *Value) bool { } func rewriteValueAMD64splitload_OpAMD64CMPWload_0(v *Value) bool { b := v.Block - _ = b typ := &b.Func.Config.Types - _ = typ // match: (CMPWload {sym} [off] ptr x mem) // cond: // result: (CMPW (MOVWload {sym} [off] ptr mem) x) for { off := v.AuxInt sym := v.Aux - _ = v.Args[2] + mem := v.Args[2] ptr := v.Args[0] x := v.Args[1] - mem := v.Args[2] v.reset(OpAMD64CMPW) v0 := b.NewValue0(v.Pos, OpAMD64MOVWload, typ.UInt16) v0.AuxInt = off diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 11c1bde8d1..9d3dbd88f8 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -20085,10 +20085,9 @@ func rewriteValueARM_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -20104,10 +20103,9 @@ func rewriteValueARM_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -20123,10 +20121,9 @@ func rewriteValueARM_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } @@ -20145,11 +20142,10 @@ func rewriteValueARM_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendA [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 0) { break } @@ -20166,11 +20162,10 @@ func rewriteValueARM_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendB [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 1) { break } @@ -20187,11 +20182,10 @@ func rewriteValueARM_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendC [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 7cc85b66cd..e54eeb1eb1 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -35685,10 +35685,9 @@ func rewriteValueARM64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -35704,10 +35703,9 @@ func rewriteValueARM64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -35723,10 +35721,9 @@ func rewriteValueARM64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index d506d77ae3..4c11640616 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -6985,10 +6985,9 @@ func rewriteValueMIPS_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -7004,10 +7003,9 @@ func rewriteValueMIPS_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -7023,10 +7021,9 @@ func rewriteValueMIPS_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } @@ -7045,11 +7042,10 @@ func rewriteValueMIPS_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendA [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 0) { break } @@ -7066,11 +7062,10 @@ func rewriteValueMIPS_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendB [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 1) { break } @@ -7087,11 +7082,10 @@ func rewriteValueMIPS_OpPanicExtend_0(v *Value) bool { // result: (LoweredPanicExtendC [kind] hi lo y mem) for { kind := v.AuxInt - _ = v.Args[3] + mem := v.Args[3] hi := v.Args[0] lo := v.Args[1] y := v.Args[2] - mem := v.Args[3] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index ca93e04c2c..d9efa99261 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -7420,10 +7420,9 @@ func rewriteValueMIPS64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -7439,10 +7438,9 @@ func rewriteValueMIPS64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -7458,10 +7456,9 @@ func rewriteValueMIPS64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 012e5c7680..4c25c39707 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -26110,10 +26110,9 @@ func rewriteValuePPC64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -26129,10 +26128,9 @@ func rewriteValuePPC64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -26148,10 +26146,9 @@ func rewriteValuePPC64_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index ddf648ded7..78fa5c5c96 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -4973,10 +4973,9 @@ func rewriteValueS390X_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsA [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 0) { break } @@ -4992,10 +4991,9 @@ func rewriteValueS390X_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsB [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 1) { break } @@ -5011,10 +5009,9 @@ func rewriteValueS390X_OpPanicBounds_0(v *Value) bool { // result: (LoweredPanicBoundsC [kind] x y mem) for { kind := v.AuxInt - _ = v.Args[2] + mem := v.Args[2] x := v.Args[0] y := v.Args[1] - mem := v.Args[2] if !(boundsABI(kind) == 2) { break } -- GitLab From 686b8142290a1eeba5a430b69be2c43273042dd7 Mon Sep 17 00:00:00 2001 From: Alberto Donizetti Date: Thu, 21 Mar 2019 18:22:58 +0100 Subject: [PATCH 0548/1679] cmd/go/internal/modfetch: update TestCodeRepo for gopkg.in/yaml.v2 New release, it broke again the longtest builder. Align the expected data with the current release. Making these tests independent of external repositories is #28856. This fixes the longtest builder. Updates #28856 Change-Id: I32d2f3325af828d26ab417a5e986e3aeefa1a897 Reviewed-on: https://go-review.googlesource.com/c/go/+/168561 Run-TryBot: Alberto Donizetti TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/modfetch/coderepo_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index 2c756c50f2..078362700f 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -286,10 +286,10 @@ var codeRepoTests = []struct { { path: "gopkg.in/yaml.v2", rev: "v2", - version: "v2.2.2", - name: "51d6538a90f86fe93ac480b35f37b2be17fef232", - short: "51d6538a90f8", - time: time.Date(2018, 11, 15, 11, 05, 04, 0, time.UTC), + version: "v2.2.3-0.20190319135612-7b8349ac747c", + name: "7b8349ac747c6a24702b762d2c4fd9266cf4f1d6", + short: "7b8349ac747c", + time: time.Date(2019, 03, 19, 13, 56, 12, 0, time.UTC), gomod: "module \"gopkg.in/yaml.v2\"\n\nrequire (\n\t\"gopkg.in/check.v1\" v0.0.0-20161208181325-20d25e280405\n)\n", }, { -- GitLab From 4a52267574db7b04915c6dc3648cfd8255844dd3 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Mon, 11 Mar 2019 09:15:38 -0400 Subject: [PATCH 0549/1679] cmd/go/internal/modfetch: update comment referring to old Import function The Import function was moved from modfetch/repo.go to modload/import.go in vgo CL 122880, and its semantics have changed in vgo CL 123095 to do more than just searching for a module. Both of these changes were ported to cmd/go in CL 123576. Delete the mention of the old Import function from the modfetch/repo.go comment, since what it refers to does not exist anymore. Change-Id: I6dc6984128152cf9611d30fbc4e6418e91a7641f Reviewed-on: https://go-review.googlesource.com/c/go/+/166597 Reviewed-by: Jay Conrod --- src/cmd/go/internal/modfetch/repo.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/cmd/go/internal/modfetch/repo.go b/src/cmd/go/internal/modfetch/repo.go index c63f6b0422..ab6e46dd74 100644 --- a/src/cmd/go/internal/modfetch/repo.go +++ b/src/cmd/go/internal/modfetch/repo.go @@ -160,12 +160,6 @@ type RevInfo struct { // To avoid version control access except when absolutely necessary, // Lookup does not attempt to connect to the repository itself. // -// The Import function takes an import path found in source code and -// determines which module to add to the requirement list to satisfy -// that import. It checks successive truncations of the import path -// to determine possible modules and stops when it finds a module -// in which the latest version satisfies the import path. -// // The ImportRepoRev function is a variant of Import which is limited // to code in a source code repository at a particular revision identifier // (usually a commit hash or source code repository tag, not necessarily -- GitLab From 804a4024ec9b149410df6aeaa8b443e65e70ff28 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 21 Mar 2019 16:41:48 +0100 Subject: [PATCH 0550/1679] cmd/link/internal/ld: don't leave files open in a loop Noticed by Ingo Oeser in his review of CL 168321. Change-Id: I2f39db675a7c22b395062a11903657a9d0d1956d Reviewed-on: https://go-review.googlesource.com/c/go/+/168560 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Cherry Zhang Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/ld/macho.go | 55 +++++++++++++++---------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 98359c26fc..d13857081a 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -694,14 +694,20 @@ func Asmbmacho(ctxt *Link) { } } } - load, err := hostobjMachoPlatform(hostobj) - if err != nil { - Exitf("%v", err) + foundLoad := false + for _, h := range hostobj { + load, err := hostobjMachoPlatform(&h) + if err != nil { + Exitf("%v", err) + } + if load != nil { + ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data))) + copy(ml.data, load.cmd.data) + foundLoad = true + break + } } - if load != nil { - ml := newMachoLoad(ctxt.Arch, load.cmd.type_, uint32(len(load.cmd.data))) - copy(ml.data, load.cmd.data) - } else if ctxt.LinkMode == LinkInternal { + if !foundLoad && ctxt.LinkMode == LinkInternal { // For lldb, must say LC_VERSION_MIN_MACOSX or else // it won't know that this Mach-O binary is from OS X // (could be iOS or WatchOS instead). @@ -1027,29 +1033,20 @@ func Machoemitreloc(ctxt *Link) { } // hostobjMachoPlatform returns the first platform load command found -// in the host objects, if any. -func hostobjMachoPlatform(hostobj []Hostobj) (*MachoPlatformLoad, error) { - for _, h := range hostobj { - f, err := os.Open(h.file) - if err != nil { - return nil, fmt.Errorf("%s: failed to open host object: %v\n", h.file, err) - } - defer f.Close() - sr := io.NewSectionReader(f, h.off, h.length) - m, err := macho.NewFile(sr) - if err != nil { - // Not a valid Mach-O file. - return nil, nil - } - load, err := peekMachoPlatform(m) - if err != nil { - return nil, err - } - if load != nil { - return load, nil - } +// in the host object, if any. +func hostobjMachoPlatform(h *Hostobj) (*MachoPlatformLoad, error) { + f, err := os.Open(h.file) + if err != nil { + return nil, fmt.Errorf("%s: failed to open host object: %v\n", h.file, err) } - return nil, nil + defer f.Close() + sr := io.NewSectionReader(f, h.off, h.length) + m, err := macho.NewFile(sr) + if err != nil { + // Not a valid Mach-O file. + return nil, nil + } + return peekMachoPlatform(m) } // peekMachoPlatform returns the first LC_VERSION_MIN_* or LC_BUILD_VERSION -- GitLab From f23c601bf9f66ef4a0d9d2dcd003b95e78fb28f8 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 21 Mar 2019 13:40:28 -0400 Subject: [PATCH 0551/1679] cmd/compile: copy volatile values before emitting write barrier call It is possible that a "volatile" value (one that can be clobbered by preparing args of a call) to be used in multiple write barrier calls. We used to copy the volatile value right before each call. But this doesn't work if the value is used the second time, after the first call where it is already clobbered. Copy it before emitting any call. Fixes #30977. Change-Id: Iedcc91ad848d5ded547bf37a8359c125d32e994c Reviewed-on: https://go-review.googlesource.com/c/go/+/168677 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/writebarrier.go | 78 ++++++++++++++------ test/fixedbugs/issue30977.go | 52 +++++++++++++ 2 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 test/fixedbugs/issue30977.go diff --git a/src/cmd/compile/internal/ssa/writebarrier.go b/src/cmd/compile/internal/ssa/writebarrier.go index d9f39bffc9..3c64da20a7 100644 --- a/src/cmd/compile/internal/ssa/writebarrier.go +++ b/src/cmd/compile/internal/ssa/writebarrier.go @@ -216,6 +216,43 @@ func writebarrier(f *Func) { // and simple store version to bElse memThen := mem memElse := mem + + // If the source of a MoveWB is volatile (will be clobbered by a + // function call), we need to copy it to a temporary location, as + // marshaling the args of typedmemmove might clobber the value we're + // trying to move. + // Look for volatile source, copy it to temporary before we emit any + // call. + // It is unlikely to have more than one of them. Just do a linear + // search instead of using a map. + type volatileCopy struct { + src *Value // address of original volatile value + tmp *Value // address of temporary we've copied the volatile value into + } + var volatiles []volatileCopy + copyLoop: + for _, w := range stores { + if w.Op == OpMoveWB { + val := w.Args[1] + if isVolatile(val) { + for _, c := range volatiles { + if val == c.src { + continue copyLoop // already copied + } + } + + t := val.Type.Elem() + tmp := f.fe.Auto(w.Pos, t) + memThen = bThen.NewValue1A(w.Pos, OpVarDef, types.TypeMem, tmp, memThen) + tmpaddr := bThen.NewValue2A(w.Pos, OpLocalAddr, t.PtrTo(), tmp, sp, memThen) + siz := t.Size() + memThen = bThen.NewValue3I(w.Pos, OpMove, types.TypeMem, siz, tmpaddr, val, memThen) + memThen.Aux = t + volatiles = append(volatiles, volatileCopy{val, tmpaddr}) + } + } + } + for _, w := range stores { ptr := w.Args[0] pos := w.Pos @@ -242,11 +279,19 @@ func writebarrier(f *Func) { // then block: emit write barrier call switch w.Op { case OpStoreWB, OpMoveWB, OpZeroWB: - volatile := w.Op == OpMoveWB && isVolatile(val) if w.Op == OpStoreWB { memThen = bThen.NewValue3A(pos, OpWB, types.TypeMem, gcWriteBarrier, ptr, val, memThen) } else { - memThen = wbcall(pos, bThen, fn, typ, ptr, val, memThen, sp, sb, volatile) + srcval := val + if w.Op == OpMoveWB && isVolatile(srcval) { + for _, c := range volatiles { + if srcval == c.src { + srcval = c.tmp + break + } + } + } + memThen = wbcall(pos, bThen, fn, typ, ptr, srcval, memThen, sp, sb) } // Note that we set up a writebarrier function call. f.fe.SetWBPos(pos) @@ -269,6 +314,12 @@ func writebarrier(f *Func) { } } + // mark volatile temps dead + for _, c := range volatiles { + tmpNode := c.tmp.Aux + memThen = bThen.NewValue1A(memThen.Pos, OpVarKill, types.TypeMem, tmpNode, memThen) + } + // merge memory // Splice memory Phi into the last memory of the original sequence, // which may be used in subsequent blocks. Other memories in the @@ -403,25 +454,9 @@ func (f *Func) computeZeroMap() map[ID]ZeroRegion { } // wbcall emits write barrier runtime call in b, returns memory. -// if valIsVolatile, it moves val into temp space before making the call. -func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Value, valIsVolatile bool) *Value { +func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Value) *Value { config := b.Func.Config - var tmp GCNode - if valIsVolatile { - // Copy to temp location if the source is volatile (will be clobbered by - // a function call). Marshaling the args to typedmemmove might clobber the - // value we're trying to move. - t := val.Type.Elem() - tmp = b.Func.fe.Auto(val.Pos, t) - mem = b.NewValue1A(pos, OpVarDef, types.TypeMem, tmp, mem) - tmpaddr := b.NewValue2A(pos, OpLocalAddr, t.PtrTo(), tmp, sp, mem) - siz := t.Size() - mem = b.NewValue3I(pos, OpMove, types.TypeMem, siz, tmpaddr, val, mem) - mem.Aux = t - val = tmpaddr - } - // put arguments on stack off := config.ctxt.FixedFrameSize() @@ -449,11 +484,6 @@ func wbcall(pos src.XPos, b *Block, fn, typ *obj.LSym, ptr, val, mem, sp, sb *Va // issue call mem = b.NewValue1A(pos, OpStaticCall, types.TypeMem, fn, mem) mem.AuxInt = off - config.ctxt.FixedFrameSize() - - if valIsVolatile { - mem = b.NewValue1A(pos, OpVarKill, types.TypeMem, tmp, mem) // mark temp dead - } - return mem } diff --git a/test/fixedbugs/issue30977.go b/test/fixedbugs/issue30977.go new file mode 100644 index 0000000000..2ca040d79a --- /dev/null +++ b/test/fixedbugs/issue30977.go @@ -0,0 +1,52 @@ +// run + +// Copyright 2019 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. + +// Issue 30977: write barrier call clobbers volatile +// value when there are multiple uses of the value. + +package main + +import "runtime" + +type T struct { + a, b, c, d, e string +} + +//go:noinline +func g() T { + return T{"a", "b", "c", "d", "e"} +} + +//go:noinline +func f() { + // The compiler optimizes this to direct copying + // the call result to both globals, with write + // barriers. The first write barrier call clobbers + // the result of g on stack. + X = g() + Y = X +} + +var X, Y T + +const N = 1000 + +func main() { + // Keep GC running so the write barrier is on. + go func() { + for { + runtime.GC() + } + }() + + for i := 0; i < N; i++ { + runtime.Gosched() + f() + if X != Y { + panic("FAIL") + } + } +} -- GitLab From 4dad64f5f1530a02404d562c7e6992d285bd9087 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Thu, 21 Mar 2019 15:08:41 +1100 Subject: [PATCH 0552/1679] image/gif: don't assume Encode src's origin is (0, 0) When gif.Encode is given an "m image.Image" argument that isn't an *image.Paletted, it creates a temporary *image.Paletted (called pm) that is intended to be a copy of this image, only with fewer colors. That creation process, and specifically the opts.Drawer.Draw call that does the copy, incorrectly assumed that m.Bounds().Min is the zero point (0, 0). This commit fixes that. Fixes #30887 Change-Id: Ie03bddec359e2dcc52f18451049452105514e179 Reviewed-on: https://go-review.googlesource.com/c/go/+/168418 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/image/gif/writer.go | 5 +++- src/image/gif/writer_test.go | 51 +++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/image/gif/writer.go b/src/image/gif/writer.go index 5e80feb33f..5819df0dd0 100644 --- a/src/image/gif/writer.go +++ b/src/image/gif/writer.go @@ -435,12 +435,15 @@ func Encode(w io.Writer, m image.Image, o *Options) error { pm, ok := m.(*image.Paletted) if !ok || len(pm.Palette) > opts.NumColors { + // Set pm to be a palettedized copy of m, including its bounds, which + // might not start at (0, 0). + // // TODO: Pick a better sub-sample of the Plan 9 palette. pm = image.NewPaletted(b, palette.Plan9[:opts.NumColors]) if opts.Quantizer != nil { pm.Palette = opts.Quantizer.Quantize(make(color.Palette, 0, opts.NumColors), m) } - opts.Drawer.Draw(pm, b, m, image.ZP) + opts.Drawer.Draw(pm, b, m, b.Min) } // When calling Encode instead of EncodeAll, the single-frame image is diff --git a/src/image/gif/writer_test.go b/src/image/gif/writer_test.go index 69042ec674..91275bb907 100644 --- a/src/image/gif/writer_test.go +++ b/src/image/gif/writer_test.go @@ -339,7 +339,10 @@ func TestEncodeNonZeroMinPoint(t *testing.T) { {+2, +2}, } for _, p := range points { - src := image.NewPaletted(image.Rectangle{Min: p, Max: p.Add(image.Point{6, 6})}, palette.Plan9) + src := image.NewPaletted(image.Rectangle{ + Min: p, + Max: p.Add(image.Point{6, 6}), + }, palette.Plan9) var buf bytes.Buffer if err := Encode(&buf, src, nil); err != nil { t.Errorf("p=%v: Encode: %v", p, err) @@ -354,6 +357,52 @@ func TestEncodeNonZeroMinPoint(t *testing.T) { t.Errorf("p=%v: got %v, want %v", p, got, want) } } + + // Also test having a source image (gray on the diagonal) that has a + // non-zero Bounds().Min, but isn't an image.Paletted. + { + p := image.Point{+2, +2} + src := image.NewRGBA(image.Rectangle{ + Min: p, + Max: p.Add(image.Point{6, 6}), + }) + src.SetRGBA(2, 2, color.RGBA{0x22, 0x22, 0x22, 0xFF}) + src.SetRGBA(3, 3, color.RGBA{0x33, 0x33, 0x33, 0xFF}) + src.SetRGBA(4, 4, color.RGBA{0x44, 0x44, 0x44, 0xFF}) + src.SetRGBA(5, 5, color.RGBA{0x55, 0x55, 0x55, 0xFF}) + src.SetRGBA(6, 6, color.RGBA{0x66, 0x66, 0x66, 0xFF}) + src.SetRGBA(7, 7, color.RGBA{0x77, 0x77, 0x77, 0xFF}) + + var buf bytes.Buffer + if err := Encode(&buf, src, nil); err != nil { + t.Errorf("gray-diagonal: Encode: %v", err) + return + } + m, err := Decode(&buf) + if err != nil { + t.Errorf("gray-diagonal: Decode: %v", err) + return + } + if got, want := m.Bounds(), image.Rect(0, 0, 6, 6); got != want { + t.Errorf("gray-diagonal: got %v, want %v", got, want) + return + } + + rednessAt := func(x int, y int) uint32 { + r, _, _, _ := m.At(x, y).RGBA() + // Shift by 8 to convert from 16 bit color to 8 bit color. + return r >> 8 + } + + // Round-tripping a still (non-animated) image.Image through + // Encode+Decode should shift the origin to (0, 0). + if got, want := rednessAt(0, 0), uint32(0x22); got != want { + t.Errorf("gray-diagonal: rednessAt(0, 0): got 0x%02x, want 0x%02x", got, want) + } + if got, want := rednessAt(5, 5), uint32(0x77); got != want { + t.Errorf("gray-diagonal: rednessAt(5, 5): got 0x%02x, want 0x%02x", got, want) + } + } } func TestEncodeImplicitConfigSize(t *testing.T) { -- GitLab From 99e223289b023279fa27803184c3e3c8a3d523cc Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sun, 17 Mar 2019 15:51:30 +0100 Subject: [PATCH 0553/1679] cmd/link/internal/wasm: optimize data section in wasm binary This change optimizes the data section in the wasm binary by omitting blocks of zeroes and instead emitting data segments with offsets skipping the zeroes. This optimization is inspired by the memory-packing pass of the wasm-opt tool and reduces the wasm binary size of "hello world" by 14%. Change-Id: Iba3043df05bf6aab4745c5f8015c0337fc218aff Reviewed-on: https://go-review.googlesource.com/c/go/+/167801 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/ld/data.go | 31 ++++++++++++----- src/cmd/link/internal/wasm/asm.go | 57 ++++++++++++++++++++++++++++--- 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index ff339af303..717597dfd5 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -32,6 +32,7 @@ package ld import ( + "bufio" "bytes" "cmd/internal/gcprog" "cmd/internal/objabi" @@ -684,7 +685,7 @@ func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) { ctxt.Logf("codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) } - blk(ctxt, ctxt.Textp, addr, size, pad) + blk(ctxt.Out, ctxt.Textp, addr, size, pad) /* again for printing */ if !*flagA { @@ -742,7 +743,7 @@ func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) { } } -func blk(ctxt *Link, syms []*sym.Symbol, addr, size int64, pad []byte) { +func blk(out *OutBuf, syms []*sym.Symbol, addr, size int64, pad []byte) { for i, s := range syms { if !s.Attr.SubSymbol() && s.Value >= addr { syms = syms[i:] @@ -767,13 +768,13 @@ func blk(ctxt *Link, syms []*sym.Symbol, addr, size int64, pad []byte) { errorexit() } if addr < s.Value { - ctxt.Out.WriteStringPad("", int(s.Value-addr), pad) + out.WriteStringPad("", int(s.Value-addr), pad) addr = s.Value } - ctxt.Out.Write(s.P) + out.Write(s.P) addr += int64(len(s.P)) if addr < s.Value+s.Size { - ctxt.Out.WriteStringPad("", int(s.Value+s.Size-addr), pad) + out.WriteStringPad("", int(s.Value+s.Size-addr), pad) addr = s.Value + s.Size } if addr != s.Value+s.Size { @@ -786,17 +787,29 @@ func blk(ctxt *Link, syms []*sym.Symbol, addr, size int64, pad []byte) { } if addr < eaddr { - ctxt.Out.WriteStringPad("", int(eaddr-addr), pad) + out.WriteStringPad("", int(eaddr-addr), pad) } - ctxt.Out.Flush() + out.Flush() } func Datblk(ctxt *Link, addr int64, size int64) { + writeDatblkToOutBuf(ctxt, ctxt.Out, addr, size) +} + +func DatblkBytes(ctxt *Link, addr int64, size int64) []byte { + buf := bytes.NewBuffer(make([]byte, 0, size)) + out := &OutBuf{w: bufio.NewWriter(buf)} + writeDatblkToOutBuf(ctxt, out, addr, size) + out.Flush() + return buf.Bytes() +} + +func writeDatblkToOutBuf(ctxt *Link, out *OutBuf, addr int64, size int64) { if *flagA { ctxt.Logf("datblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) } - blk(ctxt, datap, addr, size, zeros[:]) + blk(out, datap, addr, size, zeros[:]) /* again for printing */ if !*flagA { @@ -870,7 +883,7 @@ func Dwarfblk(ctxt *Link, addr int64, size int64) { ctxt.Logf("dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, ctxt.Out.Offset()) } - blk(ctxt, dwarfp, addr, size, zeros[:]) + blk(ctxt.Out, dwarfp, addr, size, zeros[:]) } var zeros [512]byte diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index 737de59928..2665659fe0 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -417,14 +417,63 @@ func writeDataSec(ctxt *ld.Link) { ctxt.Syms.Lookup("runtime.data", 0).Sect, } - writeUleb128(ctxt.Out, uint64(len(sections))) // number of data entries + type dataSegment struct { + offset int32 + data []byte + } + + // Omit blocks of zeroes and instead emit data segments with offsets skipping the zeroes. + // This reduces the size of the WebAssembly binary. We use 8 bytes as an estimate for the + // overhead of adding a new segment (same as wasm-opt's memory-packing optimization uses). + const segmentOverhead = 8 + var segments []*dataSegment for _, sec := range sections { + data := ld.DatblkBytes(ctxt, int64(sec.Vaddr), int64(sec.Length)) + offset := int32(sec.Vaddr) + + // skip leading zeroes + for len(data) > 0 && data[0] == 0 { + data = data[1:] + offset++ + } + + for len(data) > 0 { + dataLen := int32(len(data)) + var segmentEnd, zeroEnd int32 + for { + // look for beginning of zeroes + for segmentEnd < dataLen && data[segmentEnd] != 0 { + segmentEnd++ + } + // look for end of zeroes + zeroEnd = segmentEnd + for zeroEnd < dataLen && data[zeroEnd] == 0 { + zeroEnd++ + } + // emit segment if omitting zeroes reduces the output size + if zeroEnd-segmentEnd >= segmentOverhead || zeroEnd == dataLen { + break + } + segmentEnd = zeroEnd + } + + segments = append(segments, &dataSegment{ + offset: offset, + data: data[:segmentEnd], + }) + data = data[zeroEnd:] + offset += zeroEnd + } + } + + writeUleb128(ctxt.Out, uint64(len(segments))) // number of data entries + for _, seg := range segments { writeUleb128(ctxt.Out, 0) // memidx - writeI32Const(ctxt.Out, int32(sec.Vaddr)) + writeI32Const(ctxt.Out, seg.offset) ctxt.Out.WriteByte(0x0b) // end - writeUleb128(ctxt.Out, uint64(sec.Length)) - ld.Datblk(ctxt, int64(sec.Vaddr), int64(sec.Length)) + writeUleb128(ctxt.Out, uint64(len(seg.data))) + ctxt.Out.Write(seg.data) } writeSecSize(ctxt, sizeOffset) -- GitLab From 9f56845f2ca53316e1554dff4d4b373fec91ab84 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 21 Mar 2019 09:32:03 -0700 Subject: [PATCH 0554/1679] cmd/compile: stop shadowing bool type in rewrite rules This disrupts code instrumentation tools like go-fuzz. Change-Id: I524f31316975096ca5e3b1203a82e91ed1b6097e Reviewed-on: https://go-review.googlesource.com/c/go/+/168801 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/ssa/gen/ARM64.rules | 20 ++--- src/cmd/compile/internal/ssa/rewriteARM64.go | 82 ++++++++++---------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index df841e5546..81696bc09d 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -361,8 +361,8 @@ (FCMPD (FMOVDconst [0]) x) -> (InvertFlags (FCMPD0 x)) // CSEL needs a flag-generating argument. Synthesize a CMPW if necessary. -(CondSelect x y bool) && flagArg(bool) != nil -> (CSEL {bool.Op} x y flagArg(bool)) -(CondSelect x y bool) && flagArg(bool) == nil -> (CSEL {OpARM64NotEqual} x y (CMPWconst [0] bool)) +(CondSelect x y boolval) && flagArg(boolval) != nil -> (CSEL {boolval.Op} x y flagArg(boolval)) +(CondSelect x y boolval) && flagArg(boolval) == nil -> (CSEL {OpARM64NotEqual} x y (CMPWconst [0] boolval)) (OffPtr [off] ptr:(SP)) -> (MOVDaddr [off] ptr) (OffPtr [off] ptr) -> (ADDconst [off] ptr) @@ -1647,14 +1647,14 @@ (CSEL0 {cc} _ flag) && ccARM64Eval(cc, flag) < 0 -> (MOVDconst [0]) // absorb flags back into boolean CSEL -(CSEL {cc} x y (CMPWconst [0] bool)) && cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil -> - (CSEL {bool.Op} x y flagArg(bool)) -(CSEL {cc} x y (CMPWconst [0] bool)) && cc.(Op) == OpARM64Equal && flagArg(bool) != nil -> - (CSEL {arm64Negate(bool.Op)} x y flagArg(bool)) -(CSEL0 {cc} x (CMPWconst [0] bool)) && cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil -> - (CSEL0 {bool.Op} x flagArg(bool)) -(CSEL0 {cc} x (CMPWconst [0] bool)) && cc.(Op) == OpARM64Equal && flagArg(bool) != nil -> - (CSEL0 {arm64Negate(bool.Op)} x flagArg(bool)) +(CSEL {cc} x y (CMPWconst [0] boolval)) && cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil -> + (CSEL {boolval.Op} x y flagArg(boolval)) +(CSEL {cc} x y (CMPWconst [0] boolval)) && cc.(Op) == OpARM64Equal && flagArg(boolval) != nil -> + (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) +(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil -> + (CSEL0 {boolval.Op} x flagArg(boolval)) +(CSEL0 {cc} x (CMPWconst [0] boolval)) && cc.(Op) == OpARM64Equal && flagArg(boolval) != nil -> + (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) // absorb shifts into ops (NEG x:(SLLconst [c] y)) && clobberIfDead(x) -> (NEGshiftLL [c] y) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index e54eeb1eb1..cad3e53932 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -4557,9 +4557,9 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { v.AddArg(y) return true } - // match: (CSEL {cc} x y (CMPWconst [0] bool)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil - // result: (CSEL {bool.Op} x y flagArg(bool)) + // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // result: (CSEL {boolval.Op} x y flagArg(boolval)) for { cc := v.Aux _ = v.Args[2] @@ -4572,20 +4572,20 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { if v_2.AuxInt != 0 { break } - bool := v_2.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil) { + boolval := v_2.Args[0] + if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL) - v.Aux = bool.Op + v.Aux = boolval.Op v.AddArg(x) v.AddArg(y) - v.AddArg(flagArg(bool)) + v.AddArg(flagArg(boolval)) return true } - // match: (CSEL {cc} x y (CMPWconst [0] bool)) - // cond: cc.(Op) == OpARM64Equal && flagArg(bool) != nil - // result: (CSEL {arm64Negate(bool.Op)} x y flagArg(bool)) + // match: (CSEL {cc} x y (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // result: (CSEL {arm64Negate(boolval.Op)} x y flagArg(boolval)) for { cc := v.Aux _ = v.Args[2] @@ -4598,15 +4598,15 @@ func rewriteValueARM64_OpARM64CSEL_0(v *Value) bool { if v_2.AuxInt != 0 { break } - bool := v_2.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(bool) != nil) { + boolval := v_2.Args[0] + if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL) - v.Aux = arm64Negate(bool.Op) + v.Aux = arm64Negate(boolval.Op) v.AddArg(x) v.AddArg(y) - v.AddArg(flagArg(bool)) + v.AddArg(flagArg(boolval)) return true } return false @@ -4658,9 +4658,9 @@ func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { v.AuxInt = 0 return true } - // match: (CSEL0 {cc} x (CMPWconst [0] bool)) - // cond: cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil - // result: (CSEL0 {bool.Op} x flagArg(bool)) + // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil + // result: (CSEL0 {boolval.Op} x flagArg(boolval)) for { cc := v.Aux _ = v.Args[1] @@ -4672,19 +4672,19 @@ func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { if v_1.AuxInt != 0 { break } - bool := v_1.Args[0] - if !(cc.(Op) == OpARM64NotEqual && flagArg(bool) != nil) { + boolval := v_1.Args[0] + if !(cc.(Op) == OpARM64NotEqual && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL0) - v.Aux = bool.Op + v.Aux = boolval.Op v.AddArg(x) - v.AddArg(flagArg(bool)) + v.AddArg(flagArg(boolval)) return true } - // match: (CSEL0 {cc} x (CMPWconst [0] bool)) - // cond: cc.(Op) == OpARM64Equal && flagArg(bool) != nil - // result: (CSEL0 {arm64Negate(bool.Op)} x flagArg(bool)) + // match: (CSEL0 {cc} x (CMPWconst [0] boolval)) + // cond: cc.(Op) == OpARM64Equal && flagArg(boolval) != nil + // result: (CSEL0 {arm64Negate(boolval.Op)} x flagArg(boolval)) for { cc := v.Aux _ = v.Args[1] @@ -4696,14 +4696,14 @@ func rewriteValueARM64_OpARM64CSEL0_0(v *Value) bool { if v_1.AuxInt != 0 { break } - bool := v_1.Args[0] - if !(cc.(Op) == OpARM64Equal && flagArg(bool) != nil) { + boolval := v_1.Args[0] + if !(cc.(Op) == OpARM64Equal && flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL0) - v.Aux = arm64Negate(bool.Op) + v.Aux = arm64Negate(boolval.Op) v.AddArg(x) - v.AddArg(flagArg(bool)) + v.AddArg(flagArg(boolval)) return true } return false @@ -32486,31 +32486,31 @@ func rewriteValueARM64_OpCom8_0(v *Value) bool { } func rewriteValueARM64_OpCondSelect_0(v *Value) bool { b := v.Block - // match: (CondSelect x y bool) - // cond: flagArg(bool) != nil - // result: (CSEL {bool.Op} x y flagArg(bool)) + // match: (CondSelect x y boolval) + // cond: flagArg(boolval) != nil + // result: (CSEL {boolval.Op} x y flagArg(boolval)) for { - bool := v.Args[2] + boolval := v.Args[2] x := v.Args[0] y := v.Args[1] - if !(flagArg(bool) != nil) { + if !(flagArg(boolval) != nil) { break } v.reset(OpARM64CSEL) - v.Aux = bool.Op + v.Aux = boolval.Op v.AddArg(x) v.AddArg(y) - v.AddArg(flagArg(bool)) + v.AddArg(flagArg(boolval)) return true } - // match: (CondSelect x y bool) - // cond: flagArg(bool) == nil - // result: (CSEL {OpARM64NotEqual} x y (CMPWconst [0] bool)) + // match: (CondSelect x y boolval) + // cond: flagArg(boolval) == nil + // result: (CSEL {OpARM64NotEqual} x y (CMPWconst [0] boolval)) for { - bool := v.Args[2] + boolval := v.Args[2] x := v.Args[0] y := v.Args[1] - if !(flagArg(bool) == nil) { + if !(flagArg(boolval) == nil) { break } v.reset(OpARM64CSEL) @@ -32519,7 +32519,7 @@ func rewriteValueARM64_OpCondSelect_0(v *Value) bool { v.AddArg(y) v0 := b.NewValue0(v.Pos, OpARM64CMPWconst, types.TypeFlags) v0.AuxInt = 0 - v0.AddArg(bool) + v0.AddArg(boolval) v.AddArg(v0) return true } -- GitLab From 9a49b17f25f88fd9824e2c20bdf4468269d0da43 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Thu, 21 Mar 2019 13:30:25 +0100 Subject: [PATCH 0555/1679] misc/cgo: gofmt testdata files Change-Id: I64e05a1f768cb57194506021bb7fdca0ad19bf1c Reviewed-on: https://go-review.googlesource.com/c/go/+/168461 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/testplugin/testdata/iface/main.go | 3 ++- misc/cgo/testplugin/testdata/plugin1/plugin1.go | 3 ++- misc/cgo/testplugin/testdata/plugin2/plugin2.go | 3 ++- misc/cgo/testshared/testdata/exe/exe.go | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/misc/cgo/testplugin/testdata/iface/main.go b/misc/cgo/testplugin/testdata/iface/main.go index 7b4ea97442..c04f28880f 100644 --- a/misc/cgo/testplugin/testdata/iface/main.go +++ b/misc/cgo/testplugin/testdata/iface/main.go @@ -5,9 +5,10 @@ package main import ( - "testplugin/iface_i" "log" "plugin" + + "testplugin/iface_i" ) func main() { diff --git a/misc/cgo/testplugin/testdata/plugin1/plugin1.go b/misc/cgo/testplugin/testdata/plugin1/plugin1.go index 136c179b65..d29d674ade 100644 --- a/misc/cgo/testplugin/testdata/plugin1/plugin1.go +++ b/misc/cgo/testplugin/testdata/plugin1/plugin1.go @@ -8,8 +8,9 @@ package main import "C" import ( - "testplugin/common" "reflect" + + "testplugin/common" ) func F() int { diff --git a/misc/cgo/testplugin/testdata/plugin2/plugin2.go b/misc/cgo/testplugin/testdata/plugin2/plugin2.go index 37168a13e1..31ed642ca5 100644 --- a/misc/cgo/testplugin/testdata/plugin2/plugin2.go +++ b/misc/cgo/testplugin/testdata/plugin2/plugin2.go @@ -12,9 +12,10 @@ import "C" // void cfunc() {} // uses cgo_topofstack import ( - "testplugin/common" "reflect" "strings" + + "testplugin/common" ) func init() { diff --git a/misc/cgo/testshared/testdata/exe/exe.go b/misc/cgo/testshared/testdata/exe/exe.go index 86582581a6..ee95f97bc9 100644 --- a/misc/cgo/testshared/testdata/exe/exe.go +++ b/misc/cgo/testshared/testdata/exe/exe.go @@ -1,10 +1,11 @@ package main import ( - "testshared/depBase" "os" "reflect" "runtime" + + "testshared/depBase" ) // Having a function declared in the main package triggered -- GitLab From 4906a00cdd0e71915d691acad3f852d498ee1a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Tudor=20C=C4=83lin?= Date: Thu, 21 Mar 2019 16:04:25 +0100 Subject: [PATCH 0556/1679] image/png: add Fuzz function Add a Fuzz function to package png, under the gofuzz build tag. This function is based on the png/png.go code, from github.com/dvyukov/go-fuzz-corpus, modified to use direct comparison of image bounds rather than reflect.DeepEqual. Updates #30979 Updates #19109 Change-Id: Idb86e7ded0c2d78e6cadbeda84c7b1f35b8c579c Reviewed-on: https://go-review.googlesource.com/c/go/+/168558 Reviewed-by: thepudds Reviewed-by: Dmitry Vyukov Run-TryBot: Dmitry Vyukov --- src/image/png/fuzz.go | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/image/png/fuzz.go diff --git a/src/image/png/fuzz.go b/src/image/png/fuzz.go new file mode 100644 index 0000000000..d9cb3921e5 --- /dev/null +++ b/src/image/png/fuzz.go @@ -0,0 +1,52 @@ +// Copyright 2019 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. + +// +build gofuzz + +package png + +import ( + "bytes" + "fmt" +) + +func Fuzz(data []byte) int { + cfg, err := DecodeConfig(bytes.NewReader(data)) + if err != nil { + return 0 + } + if cfg.Width*cfg.Height > 1e6 { + return 0 + } + img, err := Decode(bytes.NewReader(data)) + if err != nil { + return 0 + } + levels := []CompressionLevel{ + DefaultCompression, + NoCompression, + BestSpeed, + BestCompression, + } + for _, l := range levels { + var w bytes.Buffer + e := &Encoder{CompressionLevel: l} + err = e.Encode(&w, img) + if err != nil { + panic(err) + } + img1, err := Decode(&w) + if err != nil { + panic(err) + } + got := img1.Bounds() + want := img.Bounds() + if !got.Eq(want) { + fmt.Printf("bounds0: %#v\n", want) + fmt.Printf("bounds1: %#v\n", got) + panic("bounds have changed") + } + } + return 1 +} -- GitLab From 83d90bbc824e5874022a41bbbbe4f34c65876480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Fri, 22 Mar 2019 12:52:54 +0100 Subject: [PATCH 0557/1679] syscall: fix returned values of Dup2 on aix/ppc64 Change-Id: Ia78ea589cc6d58ff22f7d519399c06c5308419dd Reviewed-on: https://go-review.googlesource.com/c/go/+/168878 Reviewed-by: Tobias Klauser Run-TryBot: Tobias Klauser --- src/syscall/syscall_aix.go | 2 +- src/syscall/zsyscall_aix_ppc64.go | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 8039da735b..703cbf761c 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -46,7 +46,7 @@ func (ts *StTimespec_t) Nano() int64 { // But, as fcntl is currently not exported and isn't called with F_DUP2FD, // it doesn't matter. //sys fcntl(fd int, cmd int, arg int) (val int, err error) -//sys Dup2(old int, new int) (val int, err error) +//sys Dup2(old int, new int) (err error) //sysnb pipe(p *[2]_C_int) (err error) func Pipe(p []int) (err error) { diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index 52398e60f1..5ee4f49d12 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -294,9 +294,8 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Dup2(old int, new int) (val int, err error) { - r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Dup2)), 2, uintptr(old), uintptr(new), 0, 0, 0, 0) - val = int(r0) +func Dup2(old int, new int) (err error) { + _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Dup2)), 2, uintptr(old), uintptr(new), 0, 0, 0, 0) if e1 != 0 { err = errnoErr(e1) } -- GitLab From 08692bed1e796b5395b6e321c5adcd32f6fc43bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Fri, 22 Mar 2019 12:48:31 +0100 Subject: [PATCH 0558/1679] cmd/compile, misc/cgo: fix fortran tests on aix/ppc64 Enable pattern lib.a/shared.so.X in cgo_import_dynamic as on AIX, archive files (.a) often have shared objects (.so) inside them. Change-Id: I21096c75eb7fbcc7064b0b832bfa8ed862142051 Reviewed-on: https://go-review.googlesource.com/c/go/+/168877 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- misc/cgo/fortran/test.bash | 7 ++++++- src/cmd/compile/internal/gc/lex.go | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/misc/cgo/fortran/test.bash b/misc/cgo/fortran/test.bash index 1e0d59ea1c..9498da0208 100755 --- a/misc/cgo/fortran/test.bash +++ b/misc/cgo/fortran/test.bash @@ -14,12 +14,17 @@ goos=$(go env GOOS) libext="so" if [ "$goos" = "darwin" ]; then libext="dylib" +elif [ "$goos" = "aix" ]; then + libtext="a" fi case "$FC" in *gfortran*) libpath=$(dirname $($FC -print-file-name=libgfortran.$libext)) - export CGO_LDFLAGS="$CGO_LDFLAGS -Wl,-rpath,$libpath -L $libpath" + if [ "$goos" != "aix" ]; then + RPATH_FLAG="-Wl,-rpath,$libpath" + fi + export CGO_LDFLAGS="$CGO_LDFLAGS $RPATH_FLAG -L $libpath" ;; esac diff --git a/src/cmd/compile/internal/gc/lex.go b/src/cmd/compile/internal/gc/lex.go index bd68ebffff..557f98604d 100644 --- a/src/cmd/compile/internal/gc/lex.go +++ b/src/cmd/compile/internal/gc/lex.go @@ -116,8 +116,9 @@ func (p *noder) pragcgo(pos syntax.Pos, text string) { f[3] = strings.Trim(f[3], `"`) if objabi.GOOS == "aix" && f[3] != "" { // On Aix, library pattern must be "lib.a/object.o" + // or "lib.a/libname.so.X" n := strings.Split(f[3], "/") - if len(n) != 2 || !strings.HasSuffix(n[0], ".a") || !strings.HasSuffix(n[1], ".o") { + if len(n) != 2 || !strings.HasSuffix(n[0], ".a") || (!strings.HasSuffix(n[1], ".o") && !strings.Contains(n[1], ".so.")) { p.error(syntax.Error{Pos: pos, Msg: `usage: //go:cgo_import_dynamic local [remote ["lib.a/object.o"]]`}) return } -- GitLab From cf952e9e62a464e5df6773dd22907497078fbd90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Fri, 22 Mar 2019 12:54:37 +0100 Subject: [PATCH 0559/1679] cmd: enable -buildmode=pie on aix/ppc64 Change-Id: I939518462c931ba9feb125b2f299ef0706b124ce Reviewed-on: https://go-review.googlesource.com/c/go/+/168879 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/cmd/dist/test.go | 3 ++- src/cmd/go/internal/work/init.go | 1 + src/cmd/link/internal/ld/config.go | 2 +- src/cmd/link/internal/ld/lib.go | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index eaed9c4946..ec78890f8c 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -963,7 +963,8 @@ func (t *tester) supportedBuildmode(mode string) bool { return false case "pie": switch pair { - case "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-s390x", + case "aix/ppc64", + "linux-386", "linux-amd64", "linux-arm", "linux-arm64", "linux-ppc64le", "linux-s390x", "android-amd64", "android-arm", "android-arm64", "android-386": return true case "darwin-amd64": diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index 3381ab544c..d60295ce53 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -164,6 +164,7 @@ func buildModeInit() { codegenArg = "-shared" case "darwin/amd64": codegenArg = "-shared" + case "aix/ppc64": default: base.Fatalf("-buildmode=pie not supported on %s\n", platform) } diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 40be3a553c..5d59d4067b 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -38,7 +38,7 @@ func (mode *BuildMode) Set(s string) error { *mode = BuildModeExe case "pie": switch objabi.GOOS { - case "android", "linux": + case "aix", "android", "linux": case "darwin", "freebsd": switch objabi.GOARCH { case "amd64": diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 2900268a57..f2a9921c8e 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -179,7 +179,7 @@ func (ctxt *Link) CanUsePlugins() bool { func (ctxt *Link) UseRelro() bool { switch ctxt.BuildMode { case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePIE, BuildModePlugin: - return ctxt.IsELF + return ctxt.IsELF || ctxt.HeadType == objabi.Haix default: return ctxt.linkShared || (ctxt.HeadType == objabi.Haix && ctxt.LinkMode == LinkExternal) } @@ -1173,7 +1173,7 @@ func (ctxt *Link) hostlink() { } case BuildModePIE: // ELF. - if ctxt.HeadType != objabi.Hdarwin { + if ctxt.HeadType != objabi.Hdarwin && ctxt.HeadType != objabi.Haix { if ctxt.UseRelro() { argv = append(argv, "-Wl,-z,relro") } -- GitLab From 98891386146413e902bef41a7feb7595b86e4c1d Mon Sep 17 00:00:00 2001 From: Iskander Sharipov Date: Fri, 22 Mar 2019 15:30:30 +0300 Subject: [PATCH 0560/1679] sort: replace Errorf+FailNow with Fatalf Change-Id: I4f8d0178e780b86d1f551b367e2ddac3789be5aa Reviewed-on: https://go-review.googlesource.com/c/go/+/168880 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/sort/sort_test.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/sort/sort_test.go b/src/sort/sort_test.go index 3b31143a74..bfff3528d3 100644 --- a/src/sort/sort_test.go +++ b/src/sort/sort_test.go @@ -323,8 +323,7 @@ func (d *testingData) Less(i, j int) bool { } func (d *testingData) Swap(i, j int) { if d.nswap >= d.maxswap { - d.t.Errorf("%s: used %d swaps sorting slice of %d", d.desc, d.nswap, len(d.data)) - d.t.FailNow() + d.t.Fatalf("%s: used %d swaps sorting slice of %d", d.desc, d.nswap, len(d.data)) } d.nswap++ d.data[i], d.data[j] = d.data[j], d.data[i] @@ -433,9 +432,7 @@ func testBentleyMcIlroy(t *testing.T, sort func(Interface), maxswap func(int) in // mutating method Sort can call is TestingData.swap, // it suffices here just to check that the final slice is sorted. if !IntsAreSorted(mdata) { - t.Errorf("%s: ints not sorted", desc) - t.Errorf("\t%v", mdata) - t.FailNow() + t.Fatalf("%s: ints not sorted\n\t%v", desc, mdata) } } } @@ -517,8 +514,7 @@ func TestAdversary(t *testing.T) { // Check data is fully populated and sorted. for i, v := range d.data { if v != i { - t.Errorf("adversary data not fully sorted") - t.FailNow() + t.Fatalf("adversary data not fully sorted") } } } -- GitLab From d0cbf9bf53ceb989f79addf4b91346840b3b8a57 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Thu, 21 Mar 2019 03:24:47 +0000 Subject: [PATCH 0561/1679] cmd/compile: follow up intrinsifying math/bits.Add64 for arm64 This CL deals with the additional comments of CL 159017. Change-Id: I4ad3c60c834646d58dc0c544c741b92bfe83fb8b Reviewed-on: https://go-review.googlesource.com/c/go/+/168857 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/arm64/ssa.go | 2 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 6 ++- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 4 +- src/cmd/compile/internal/ssa/opGen.go | 47 +++++++++++++------- src/cmd/compile/internal/ssa/rewriteARM64.go | 33 ++++++++++++++ src/math/bits/bits_test.go | 4 +- test/codegen/mathbits.go | 4 +- 7 files changed, 77 insertions(+), 23 deletions(-) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 98cd6c3b03..0b9f62834c 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -260,7 +260,7 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.Reg = arm64.REGZERO p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() - case ssa.OpARM64ADCSflags: + case ssa.OpARM64ADCSflags, ssa.OpARM64ADDSflags: r := v.Reg0() r1 := v.Args[0].Reg() r2 := v.Args[1].Reg() diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 81696bc09d..70b1681c63 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -147,8 +147,6 @@ // 64-bit addition with carry. (Select0 (Add64carry x y c)) -> (Select0 (ADCSflags x y (Select1 (ADDSconstflags [-1] c)))) (Select1 (Add64carry x y c)) -> (ADCzerocarry (Select1 (ADCSflags x y (Select1 (ADDSconstflags [-1] c))))) -// The carry flag of c doesn't change. -(ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) -> (ADCSflags x y c) // boolean ops -- booleans are represented with 0=false, 1=true (AndB x y) -> (AND x y) @@ -1208,6 +1206,10 @@ (ADD a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MSUBW a x y) (SUB a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MADDW a x y) +// optimize ADCSflags and friends +(ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) -> (ADCSflags x y c) +(ADCSflags x y (Select1 (ADDSconstflags [-1] (MOVDconst [0])))) -> (ADDSflags x y) + // mul by constant (MUL x (MOVDconst [-1])) -> (NEG x) (MUL _ (MOVDconst [0])) -> (MOVDconst [0]) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index 05d57fa8ca..a885a8f467 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -146,6 +146,7 @@ func init() { gp11flags = regInfo{inputs: []regMask{gpg}, outputs: []regMask{gp, 0}} gp21 = regInfo{inputs: []regMask{gpg, gpg}, outputs: []regMask{gp}} gp21nog = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} + gp21flags = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp, 0}} gp2flags = regInfo{inputs: []regMask{gpg, gpg}} gp2flags1 = regInfo{inputs: []regMask{gp, gp}, outputs: []regMask{gp}} gp2flags1flags = regInfo{inputs: []regMask{gp, gp, 0}, outputs: []regMask{gp, 0}} @@ -176,9 +177,10 @@ func init() { // binary ops {name: "ADCSflags", argLength: 3, reg: gp2flags1flags, typ: "(UInt64,Flags)", asm: "ADCS", commutative: true}, // arg0+arg1+carry, set flags. {name: "ADCzerocarry", argLength: 1, reg: gp0flags1, typ: "UInt64", asm: "ADC"}, // ZR+ZR+carry - {name: "ADDSconstflags", argLength: 1, reg: gp11flags, typ: "(UInt64,Flags)", asm: "ADDS", aux: "Int64"}, // arg0+auxint, set flags. {name: "ADD", argLength: 2, reg: gp21, asm: "ADD", commutative: true}, // arg0 + arg1 {name: "ADDconst", argLength: 1, reg: gp11sp, asm: "ADD", aux: "Int64"}, // arg0 + auxInt + {name: "ADDSconstflags", argLength: 1, reg: gp11flags, typ: "(UInt64,Flags)", asm: "ADDS", aux: "Int64"}, // arg0+auxint, set flags. + {name: "ADDSflags", argLength: 2, reg: gp21flags, typ: "(UInt64,Flags)", asm: "ADDS", commutative: true}, // arg0+arg1, set flags. {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1 {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64"}, // arg0 - auxInt {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true}, // arg0 * arg1 diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index fec35b7c40..d71d6146d1 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1143,9 +1143,10 @@ const ( OpARM64ADCSflags OpARM64ADCzerocarry - OpARM64ADDSconstflags OpARM64ADD OpARM64ADDconst + OpARM64ADDSconstflags + OpARM64ADDSflags OpARM64SUB OpARM64SUBconst OpARM64MUL @@ -15169,29 +15170,28 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "ADDSconstflags", - auxType: auxInt64, - argLen: 1, - asm: arm64.AADDS, + name: "ADD", + argLen: 2, + commutative: true, + asm: arm64.AADD, reg: regInfo{ inputs: []inputInfo{ {0, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 + {1, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 }, outputs: []outputInfo{ - {1, 0}, {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 }, }, }, { - name: "ADD", - argLen: 2, - commutative: true, - asm: arm64.AADD, + name: "ADDconst", + auxType: auxInt64, + argLen: 1, + asm: arm64.AADD, reg: regInfo{ inputs: []inputInfo{ - {0, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 - {1, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 + {0, 1878786047}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 SP }, outputs: []outputInfo{ {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 @@ -15199,15 +15199,32 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "ADDconst", + name: "ADDSconstflags", auxType: auxInt64, argLen: 1, - asm: arm64.AADD, + asm: arm64.AADDS, reg: regInfo{ inputs: []inputInfo{ - {0, 1878786047}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 SP + {0, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "ADDSflags", + argLen: 2, + commutative: true, + asm: arm64.AADDS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + {1, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 }, outputs: []outputInfo{ + {1, 0}, {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 }, }, diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index cad3e53932..997439ec90 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -992,6 +992,39 @@ func rewriteValueARM64_OpARM64ADCSflags_0(v *Value) bool { v.AddArg(c) return true } + // match: (ADCSflags x y (Select1 (ADDSconstflags [-1] (MOVDconst [0])))) + // cond: + // result: (ADDSflags x y) + for { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 { + break + } + if v_2.Type != types.TypeFlags { + break + } + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64ADDSconstflags { + break + } + if v_2_0.AuxInt != -1 { + break + } + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64MOVDconst { + break + } + if v_2_0_0.AuxInt != 0 { + break + } + v.reset(OpARM64ADDSflags) + v.AddArg(x) + v.AddArg(y) + return true + } return false } func rewriteValueARM64_OpARM64ADD_0(v *Value) bool { diff --git a/src/math/bits/bits_test.go b/src/math/bits/bits_test.go index bfd0e287fa..afdfd393bb 100644 --- a/src/math/bits/bits_test.go +++ b/src/math/bits/bits_test.go @@ -741,7 +741,7 @@ func TestAddSubUint(t *testing.T) { test("Add intrinsic", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.x, a.y, a.c, a.z, a.cout) test("Add intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Add(x, y, c) }, a.y, a.x, a.c, a.z, a.cout) test("Sub intrinsic", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.x, a.c, a.y, a.cout) - test("Add intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) + test("Sub intrinsic symmetric", func(x, y, c uint) (uint, uint) { return Sub(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) } } @@ -802,7 +802,7 @@ func TestAddSubUint64(t *testing.T) { test("Add64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.x, a.y, a.c, a.z, a.cout) test("Add64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Add64(x, y, c) }, a.y, a.x, a.c, a.z, a.cout) test("Sub64 intrinsic", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.x, a.c, a.y, a.cout) - test("Add64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) + test("Sub64 intrinsic symmetric", func(x, y, c uint64) (uint64, uint64) { return Sub64(x, y, c) }, a.z, a.y, a.c, a.x, a.cout) } } diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 5c541bfd29..b6992c6bb4 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -387,7 +387,7 @@ func AddC(x, ci uint) (r, co uint) { } func AddZ(x, y uint) (r, co uint) { - // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" + // arm64:"ADDS","ADC",-"ADCS",-"ADD\t",-"CMP" // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ" return bits.Add(x, y, 0) } @@ -420,7 +420,7 @@ func Add64C(x, ci uint64) (r, co uint64) { } func Add64Z(x, y uint64) (r, co uint64) { - // arm64:"ADDS","ADCS","ADC",-"ADD\t",-"CMP" + // arm64:"ADDS","ADC",-"ADCS",-"ADD\t",-"CMP" // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ" return bits.Add64(x, y, 0) } -- GitLab From b06d2122eec394a044d7b04a011b5b79318dc4c0 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Thu, 13 Dec 2018 21:56:45 +0100 Subject: [PATCH 0562/1679] os,syscall: implement functions related to uid, gid and pid on js/wasm This change implements the following functions on js/wasm: - os.Chown - os.Fchown - os.Lchown - syscall.Getuid - syscall.Getgid - syscall.Geteuid - syscall.Getegid - syscall.Getgroups - syscall.Getpid - syscall.Getppid - syscall.Umask Change-Id: Icdb0fafc02c9df6e9e3573542f8499c3464dc671 Reviewed-on: https://go-review.googlesource.com/c/go/+/154157 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/work/build_test.go | 4 +-- src/os/os_unix_test.go | 9 ++++- src/os/sticky_bsd.go | 2 +- src/os/sticky_notbsd.go | 1 + src/syscall/fs_js.go | 14 ++++++-- src/syscall/syscall_js.go | 47 +++++++++++++++++++++----- 6 files changed, 62 insertions(+), 15 deletions(-) diff --git a/src/cmd/go/internal/work/build_test.go b/src/cmd/go/internal/work/build_test.go index ef95a408ca..55e1eea25b 100644 --- a/src/cmd/go/internal/work/build_test.go +++ b/src/cmd/go/internal/work/build_test.go @@ -227,8 +227,8 @@ func TestRespectSetgidDir(t *testing.T) { if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" { t.Skip("can't set SetGID bit with chmod on iOS") } - case "windows", "plan9", "js": - t.Skip("chown/chmod setgid are not supported on Windows, Plan 9, or JS") + case "windows", "plan9": + t.Skip("chown/chmod setgid are not supported on Windows or Plan 9") } var b Builder diff --git a/src/os/os_unix_test.go b/src/os/os_unix_test.go index 2aa930ea80..87c3bcd8fa 100644 --- a/src/os/os_unix_test.go +++ b/src/os/os_unix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris package os_test @@ -152,6 +152,9 @@ func TestLchown(t *testing.T) { gid := Getgid() t.Log("gid:", gid) if err = Lchown(linkname, -1, gid); err != nil { + if err, ok := err.(*PathError); ok && err.Err == syscall.ENOSYS { + t.Skip("lchown is unavailable") + } t.Fatalf("lchown %s -1 %d: %s", linkname, gid, err) } sys := dir.Sys().(*syscall.Stat_t) @@ -231,6 +234,10 @@ func TestMkdirStickyUmask(t *testing.T) { // See also issues: 22939, 24331 func newFileTest(t *testing.T, blocking bool) { + if runtime.GOOS == "js" { + t.Skipf("syscall.Pipe is not available on %s.", runtime.GOOS) + } + p := make([]int, 2) if err := syscall.Pipe(p); err != nil { t.Fatalf("pipe: %v", err) diff --git a/src/os/sticky_bsd.go b/src/os/sticky_bsd.go index ae2744f817..c09b1ac202 100644 --- a/src/os/sticky_bsd.go +++ b/src/os/sticky_bsd.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin dragonfly freebsd netbsd openbsd solaris +// +build aix darwin dragonfly freebsd js,wasm netbsd openbsd solaris package os diff --git a/src/os/sticky_notbsd.go b/src/os/sticky_notbsd.go index edb5f69bf0..c15850692c 100644 --- a/src/os/sticky_notbsd.go +++ b/src/os/sticky_notbsd.go @@ -6,6 +6,7 @@ // +build !darwin // +build !dragonfly // +build !freebsd +// +build !js !wasm // +build !netbsd // +build !openbsd // +build !solaris diff --git a/src/syscall/fs_js.go b/src/syscall/fs_js.go index fcc5f038b8..b36cefc69a 100644 --- a/src/syscall/fs_js.go +++ b/src/syscall/fs_js.go @@ -244,18 +244,26 @@ func Chown(path string, uid, gid int) error { if err := checkPath(path); err != nil { return err } - return ENOSYS + _, err := fsCall("chown", path, uint32(uid), uint32(gid)) + return err } func Fchown(fd int, uid, gid int) error { - return ENOSYS + _, err := fsCall("fchown", fd, uint32(uid), uint32(gid)) + return err } func Lchown(path string, uid, gid int) error { if err := checkPath(path); err != nil { return err } - return ENOSYS + if jsFS.Get("lchown") == js.Undefined() { + // fs.lchown is unavailable on Linux until Node.js 10.6.0 + // TODO(neelance): remove when we require at least this Node.js version + return ENOSYS + } + _, err := fsCall("lchown", path, uint32(uid), uint32(gid)) + return err } func UtimesNano(path string, ts []Timespec) error { diff --git a/src/syscall/syscall_js.go b/src/syscall/syscall_js.go index 4dfcc6ed64..99f9a935fe 100644 --- a/src/syscall/syscall_js.go +++ b/src/syscall/syscall_js.go @@ -285,14 +285,45 @@ func Getwd() (wd string, err error) { return string(buf[:n]), nil } -func Getegid() int { return 1 } -func Geteuid() int { return 1 } -func Getgid() int { return 1 } -func Getgroups() ([]int, error) { return []int{1}, nil } -func Getppid() int { return 2 } -func Getpid() int { return 3 } -func Gettimeofday(tv *Timeval) error { return ENOSYS } -func Getuid() int { return 1 } +func Getuid() int { + return jsProcess.Call("getuid").Int() +} + +func Getgid() int { + return jsProcess.Call("getgid").Int() +} + +func Geteuid() int { + return jsProcess.Call("geteuid").Int() +} + +func Getegid() int { + return jsProcess.Call("getegid").Int() +} + +func Getgroups() ([]int, error) { + array := jsProcess.Call("getgroups") + groups := make([]int, array.Length()) + for i := range groups { + groups[i] = array.Index(i).Int() + } + return groups, nil +} + +func Getpid() int { + return jsProcess.Get("pid").Int() +} + +func Getppid() int { + return jsProcess.Get("ppid").Int() +} + +func Umask(mask int) (oldmask int) { + return jsProcess.Call("umask", mask).Int() +} + +func Gettimeofday(tv *Timeval) error { return ENOSYS } + func Kill(pid int, signum Signal) error { return ENOSYS } func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { return 0, ENOSYS -- GitLab From 0fbf6818407366d79a7a388b58718f6c32ef16d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 13 Mar 2019 11:57:29 +0000 Subject: [PATCH 0563/1679] cmd/compile: reduce rulegen's for loop verbosity A lot of the naked for loops begin like: for { v := b.Control if v.Op != OpConstBool { break } ... return true } Instead, write them out in a more compact and readable way: for v.Op == OpConstBool { ... return true } This requires the addition of two bytes.Buffer writers, as this helps us make a decision based on future pieces of generated code. This probably makes rulegen slightly slower, but that's not noticeable; the code generation still takes ~3.5s on my laptop, excluding build time. The "v := b.Control" declaration can be moved to the top of each function. Even though the rules can modify b.Control when firing, they also make the function return, so v can't be used again. While at it, remove three unnecessary lines from the top of each rewriteBlock func. In total, this results in ~4k lines removed from the generated code, and a slight improvement in readability. Change-Id: I317e4c6a4842c64df506f4513375475fad2aeec5 Reviewed-on: https://go-review.googlesource.com/c/go/+/167399 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/gen/rulegen.go | 74 +- src/cmd/compile/internal/ssa/rewrite386.go | 637 ++---- .../internal/ssa/rewrite386splitload.go | 5 +- src/cmd/compile/internal/ssa/rewriteAMD64.go | 877 ++------- .../internal/ssa/rewriteAMD64splitload.go | 5 +- src/cmd/compile/internal/ssa/rewriteARM.go | 1711 +++-------------- src/cmd/compile/internal/ssa/rewriteARM64.go | 1207 ++---------- src/cmd/compile/internal/ssa/rewriteMIPS.go | 223 +-- src/cmd/compile/internal/ssa/rewriteMIPS64.go | 199 +- src/cmd/compile/internal/ssa/rewritePPC64.go | 475 +---- src/cmd/compile/internal/ssa/rewriteS390X.go | 247 +-- src/cmd/compile/internal/ssa/rewriteWasm.go | 5 +- src/cmd/compile/internal/ssa/rewritedec.go | 5 +- src/cmd/compile/internal/ssa/rewritedec64.go | 5 +- .../compile/internal/ssa/rewritedecArgs.go | 5 +- .../compile/internal/ssa/rewritegeneric.go | 23 +- 16 files changed, 991 insertions(+), 4712 deletions(-) diff --git a/src/cmd/compile/internal/ssa/gen/rulegen.go b/src/cmd/compile/internal/ssa/gen/rulegen.go index 2082ba15c4..4ca6796f7c 100644 --- a/src/cmd/compile/internal/ssa/gen/rulegen.go +++ b/src/cmd/compile/internal/ssa/gen/rulegen.go @@ -217,7 +217,7 @@ func genRulesSuffix(arch arch, suff string) { canFail = false fmt.Fprintf(buf, "for {\n") - pos, matchCanFail := genMatch(buf, arch, match, rule.loc) + pos, _, matchCanFail := genMatch(buf, arch, match, rule.loc) if pos == "" { pos = "v.Pos" } @@ -273,11 +273,10 @@ func genRulesSuffix(arch arch, suff string) { // so we can make this one function with a switch. fmt.Fprintf(w, "func rewriteBlock%s%s(b *Block) bool {\n", arch.name, suff) fmt.Fprintln(w, "config := b.Func.Config") - fmt.Fprintln(w, "_ = config") - fmt.Fprintln(w, "fe := b.Func.fe") - fmt.Fprintln(w, "_ = fe") fmt.Fprintln(w, "typ := &config.Types") fmt.Fprintln(w, "_ = typ") + fmt.Fprintln(w, "v := b.Control") + fmt.Fprintln(w, "_ = v") fmt.Fprintf(w, "switch b.Kind {\n") ops = nil for op := range blockrules { @@ -292,27 +291,26 @@ func genRulesSuffix(arch arch, suff string) { fmt.Fprintf(w, "// cond: %s\n", cond) fmt.Fprintf(w, "// result: %s\n", result) - fmt.Fprintf(w, "for {\n") - _, _, _, aux, s := extract(match) // remove parens, then split + loopw := new(bytes.Buffer) + // check match of control value pos := "" + checkOp := "" if s[0] != "nil" { - fmt.Fprintf(w, "v := b.Control\n") if strings.Contains(s[0], "(") { - pos, _ = genMatch0(w, arch, s[0], "v", map[string]struct{}{}, false, rule.loc) + pos, checkOp, _ = genMatch0(loopw, arch, s[0], "v", map[string]struct{}{}, rule.loc) } else { - fmt.Fprintf(w, "_ = v\n") // in case we don't use v - fmt.Fprintf(w, "%s := b.Control\n", s[0]) + fmt.Fprintf(loopw, "%s := b.Control\n", s[0]) } } if aux != "" { - fmt.Fprintf(w, "%s := b.Aux\n", aux) + fmt.Fprintf(loopw, "%s := b.Aux\n", aux) } if cond != "" { - fmt.Fprintf(w, "if !(%s) {\nbreak\n}\n", cond) + fmt.Fprintf(loopw, "if !(%s) {\nbreak\n}\n", cond) } // Rule matches. Generate result. @@ -338,19 +336,19 @@ func genRulesSuffix(arch arch, suff string) { log.Fatalf("unmatched successors %v in %s", m, rule) } - fmt.Fprintf(w, "b.Kind = %s\n", blockName(outop, arch)) + fmt.Fprintf(loopw, "b.Kind = %s\n", blockName(outop, arch)) if t[0] == "nil" { - fmt.Fprintf(w, "b.SetControl(nil)\n") + fmt.Fprintf(loopw, "b.SetControl(nil)\n") } else { if pos == "" { pos = "v.Pos" } - fmt.Fprintf(w, "b.SetControl(%s)\n", genResult0(w, arch, t[0], new(int), false, false, rule.loc, pos)) + fmt.Fprintf(loopw, "b.SetControl(%s)\n", genResult0(loopw, arch, t[0], new(int), false, false, rule.loc, pos)) } if aux != "" { - fmt.Fprintf(w, "b.Aux = %s\n", aux) + fmt.Fprintf(loopw, "b.Aux = %s\n", aux) } else { - fmt.Fprintln(w, "b.Aux = nil") + fmt.Fprintln(loopw, "b.Aux = nil") } succChanged := false @@ -366,13 +364,20 @@ func genRulesSuffix(arch arch, suff string) { if succs[0] != newsuccs[1] || succs[1] != newsuccs[0] { log.Fatalf("can only handle swapped successors in %s", rule) } - fmt.Fprintln(w, "b.swapSuccessors()") + fmt.Fprintln(loopw, "b.swapSuccessors()") } if *genLog { - fmt.Fprintf(w, "logRule(\"%s\")\n", rule.loc) + fmt.Fprintf(loopw, "logRule(\"%s\")\n", rule.loc) } - fmt.Fprintf(w, "return true\n") + fmt.Fprintf(loopw, "return true\n") + + if checkOp != "" { + fmt.Fprintf(w, "for v.Op == %s {\n", checkOp) + } else { + fmt.Fprintf(w, "for {\n") + } + io.Copy(w, loopw) fmt.Fprintf(w, "}\n") } @@ -398,24 +403,18 @@ func genRulesSuffix(arch arch, suff string) { // genMatch returns the variable whose source position should be used for the // result (or "" if no opinion), and a boolean that reports whether the match can fail. -func genMatch(w io.Writer, arch arch, match string, loc string) (string, bool) { - return genMatch0(w, arch, match, "v", map[string]struct{}{}, true, loc) +func genMatch(w io.Writer, arch arch, match string, loc string) (pos, checkOp string, canFail bool) { + return genMatch0(w, arch, match, "v", map[string]struct{}{}, loc) } -func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, top bool, loc string) (string, bool) { +func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, loc string) (pos, checkOp string, canFail bool) { if match[0] != '(' || match[len(match)-1] != ')' { panic("non-compound expr in genMatch0: " + match) } - pos := "" - canFail := false - op, oparch, typ, auxint, aux, args := parseValue(match, arch, loc) - // check op - if !top { - fmt.Fprintf(w, "if %s.Op != Op%s%s {\nbreak\n}\n", v, oparch, op.name) - canFail = true - } + checkOp = fmt.Sprintf("Op%s%s", oparch, op.name) + if op.faultOnNilArg0 || op.faultOnNilArg1 { // Prefer the position of an instruction which could fault. pos = v + ".Pos" @@ -521,8 +520,13 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t if argname == "b" { log.Fatalf("don't name args 'b', it is ambiguous with blocks") } + fmt.Fprintf(w, "%s := %s.Args[%d]\n", argname, v, i) - argPos, argCanFail := genMatch0(w, arch, arg, argname, m, false, loc) + w2 := new(bytes.Buffer) + argPos, argCheckOp, _ := genMatch0(w2, arch, arg, argname, m, loc) + fmt.Fprintf(w, "if %s.Op != %s {\nbreak\n}\n", argname, argCheckOp) + io.Copy(w, w2) + if argPos != "" { // Keep the argument in preference to the parent, as the // argument is normally earlier in program flow. @@ -531,16 +535,14 @@ func genMatch0(w io.Writer, arch arch, match, v string, m map[string]struct{}, t // in the program flow. pos = argPos } - if argCanFail { - canFail = true - } + canFail = true } if op.argLength == -1 { fmt.Fprintf(w, "if len(%s.Args) != %d {\nbreak\n}\n", v, len(args)) canFail = true } - return pos, canFail + return pos, checkOp, canFail } func genResult(w io.Writer, arch arch, result string, loc string, pos string) { diff --git a/src/cmd/compile/internal/ssa/rewrite386.go b/src/cmd/compile/internal/ssa/rewrite386.go index aae0c59300..99f672c54e 100644 --- a/src/cmd/compile/internal/ssa/rewrite386.go +++ b/src/cmd/compile/internal/ssa/rewrite386.go @@ -24477,21 +24477,16 @@ func rewriteValue386_OpZeromask_0(v *Value) bool { } func rewriteBlock386(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case Block386EQ: // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386EQ b.SetControl(cmp) @@ -24501,11 +24496,7 @@ func rewriteBlock386(b *Block) bool { // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24514,11 +24505,7 @@ func rewriteBlock386(b *Block) bool { // match: (EQ (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24528,11 +24515,7 @@ func rewriteBlock386(b *Block) bool { // match: (EQ (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24542,11 +24525,7 @@ func rewriteBlock386(b *Block) bool { // match: (EQ (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24556,11 +24535,7 @@ func rewriteBlock386(b *Block) bool { // match: (EQ (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24571,11 +24546,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386LE b.SetControl(cmp) @@ -24585,11 +24556,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24598,11 +24565,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24612,11 +24575,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24626,11 +24585,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24639,11 +24594,7 @@ func rewriteBlock386(b *Block) bool { // match: (GE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24653,11 +24604,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386LT b.SetControl(cmp) @@ -24667,11 +24614,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24681,11 +24624,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24695,11 +24634,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24709,11 +24644,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24722,11 +24653,7 @@ func rewriteBlock386(b *Block) bool { // match: (GT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24736,11 +24663,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETL cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != Op386SETL { - break - } + for v.Op == Op386SETL { cmp := v.Args[0] b.Kind = Block386LT b.SetControl(cmp) @@ -24750,11 +24673,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETLE cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETLE { - break - } + for v.Op == Op386SETLE { cmp := v.Args[0] b.Kind = Block386LE b.SetControl(cmp) @@ -24764,11 +24683,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETG cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != Op386SETG { - break - } + for v.Op == Op386SETG { cmp := v.Args[0] b.Kind = Block386GT b.SetControl(cmp) @@ -24778,11 +24693,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETGE cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETGE { - break - } + for v.Op == Op386SETGE { cmp := v.Args[0] b.Kind = Block386GE b.SetControl(cmp) @@ -24792,11 +24703,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETEQ cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != Op386SETEQ { - break - } + for v.Op == Op386SETEQ { cmp := v.Args[0] b.Kind = Block386EQ b.SetControl(cmp) @@ -24806,11 +24713,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETNE cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETNE { - break - } + for v.Op == Op386SETNE { cmp := v.Args[0] b.Kind = Block386NE b.SetControl(cmp) @@ -24820,11 +24723,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETB cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != Op386SETB { - break - } + for v.Op == Op386SETB { cmp := v.Args[0] b.Kind = Block386ULT b.SetControl(cmp) @@ -24834,11 +24733,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETBE cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETBE { - break - } + for v.Op == Op386SETBE { cmp := v.Args[0] b.Kind = Block386ULE b.SetControl(cmp) @@ -24848,11 +24743,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETA cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386SETA { - break - } + for v.Op == Op386SETA { cmp := v.Args[0] b.Kind = Block386UGT b.SetControl(cmp) @@ -24862,11 +24753,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETAE cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETAE { - break - } + for v.Op == Op386SETAE { cmp := v.Args[0] b.Kind = Block386UGE b.SetControl(cmp) @@ -24876,11 +24763,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETO cmp) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != Op386SETO { - break - } + for v.Op == Op386SETO { cmp := v.Args[0] b.Kind = Block386OS b.SetControl(cmp) @@ -24890,11 +24773,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETGF cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386SETGF { - break - } + for v.Op == Op386SETGF { cmp := v.Args[0] b.Kind = Block386UGT b.SetControl(cmp) @@ -24904,11 +24783,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETGEF cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386SETGEF { - break - } + for v.Op == Op386SETGEF { cmp := v.Args[0] b.Kind = Block386UGE b.SetControl(cmp) @@ -24918,11 +24793,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETEQF cmp) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != Op386SETEQF { - break - } + for v.Op == Op386SETEQF { cmp := v.Args[0] b.Kind = Block386EQF b.SetControl(cmp) @@ -24932,11 +24803,7 @@ func rewriteBlock386(b *Block) bool { // match: (If (SETNEF cmp) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != Op386SETNEF { - break - } + for v.Op == Op386SETNEF { cmp := v.Args[0] b.Kind = Block386NEF b.SetControl(cmp) @@ -24947,8 +24814,6 @@ func rewriteBlock386(b *Block) bool { // cond: // result: (NE (TESTB cond cond) yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = Block386NE v0 := b.NewValue0(v.Pos, Op386TESTB, types.TypeFlags) @@ -24962,11 +24827,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386GE b.SetControl(cmp) @@ -24976,11 +24837,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -24989,11 +24846,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25002,11 +24855,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25015,11 +24864,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25029,11 +24874,7 @@ func rewriteBlock386(b *Block) bool { // match: (LE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25044,11 +24885,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386GT b.SetControl(cmp) @@ -25058,11 +24895,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25072,11 +24905,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25085,11 +24914,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25098,11 +24923,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25112,11 +24933,7 @@ func rewriteBlock386(b *Block) bool { // match: (LT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25127,11 +24944,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETL { @@ -25153,11 +24966,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETL { @@ -25179,11 +24988,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETLE { @@ -25205,11 +25010,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETLE { @@ -25231,11 +25032,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETG { @@ -25257,11 +25054,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETG { @@ -25283,11 +25076,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGE { @@ -25309,11 +25098,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGE { @@ -25335,11 +25120,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETEQ { @@ -25361,11 +25142,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETEQ { @@ -25387,11 +25164,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETNE { @@ -25413,11 +25186,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETNE { @@ -25439,11 +25208,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETB { @@ -25465,11 +25230,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETB { @@ -25491,11 +25252,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETBE { @@ -25517,11 +25274,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETBE { @@ -25543,11 +25296,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETA { @@ -25569,11 +25318,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETA { @@ -25595,11 +25340,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETAE { @@ -25621,11 +25362,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETAE { @@ -25647,11 +25384,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETO { @@ -25673,11 +25406,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETO { @@ -25699,11 +25428,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGF { @@ -25725,11 +25450,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGF { @@ -25751,11 +25472,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGEF { @@ -25777,11 +25494,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETGEF { @@ -25803,11 +25516,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETEQF { @@ -25829,11 +25538,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETEQF { @@ -25855,11 +25560,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETNEF { @@ -25881,11 +25582,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != Op386TESTB { - break - } + for v.Op == Op386TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != Op386SETNEF { @@ -25907,11 +25604,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386NE b.SetControl(cmp) @@ -25921,11 +25614,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25935,11 +25624,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25948,11 +25633,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25961,11 +25642,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25974,11 +25651,7 @@ func rewriteBlock386(b *Block) bool { // match: (NE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25988,11 +25661,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (InvertFlags cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386ULE b.SetControl(cmp) @@ -26002,11 +25671,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26015,11 +25680,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26029,11 +25690,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26042,11 +25699,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26056,11 +25709,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26070,11 +25719,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (InvertFlags cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386ULT b.SetControl(cmp) @@ -26084,11 +25729,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26098,11 +25739,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26112,11 +25749,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26125,11 +25758,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26139,11 +25768,7 @@ func rewriteBlock386(b *Block) bool { // match: (UGT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26153,11 +25778,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (InvertFlags cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386UGE b.SetControl(cmp) @@ -26167,11 +25788,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26180,11 +25797,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26193,11 +25806,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26207,11 +25816,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26220,11 +25825,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26235,11 +25836,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (InvertFlags cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != Op386InvertFlags { - break - } + for v.Op == Op386InvertFlags { cmp := v.Args[0] b.Kind = Block386UGT b.SetControl(cmp) @@ -26249,11 +25846,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagEQ { - break - } + for v.Op == Op386FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26263,11 +25856,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagLT_ULT { - break - } + for v.Op == Op386FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26276,11 +25865,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagLT_UGT { - break - } + for v.Op == Op386FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26290,11 +25875,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != Op386FlagGT_ULT { - break - } + for v.Op == Op386FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26303,11 +25884,7 @@ func rewriteBlock386(b *Block) bool { // match: (ULT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != Op386FlagGT_UGT { - break - } + for v.Op == Op386FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil diff --git a/src/cmd/compile/internal/ssa/rewrite386splitload.go b/src/cmd/compile/internal/ssa/rewrite386splitload.go index 31ed4d0a41..1eaf2d9d48 100644 --- a/src/cmd/compile/internal/ssa/rewrite386splitload.go +++ b/src/cmd/compile/internal/ssa/rewrite386splitload.go @@ -169,11 +169,10 @@ func rewriteValue386splitload_Op386CMPWload_0(v *Value) bool { } func rewriteBlock386splitload(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64.go b/src/cmd/compile/internal/ssa/rewriteAMD64.go index c377e28170..b17c0a68c1 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64.go @@ -64676,21 +64676,16 @@ func rewriteValueAMD64_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockAMD64(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockAMD64EQ: // match: (EQ (TESTL (SHLL (MOVLconst [1]) x) y)) // cond: !config.nacl // result: (UGE (BTL x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { @@ -64718,11 +64713,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL y (SHLL (MOVLconst [1]) x))) // cond: !config.nacl // result: (UGE (BTL x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] y := v.Args[0] v_1 := v.Args[1] @@ -64751,11 +64742,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) // cond: !config.nacl // result: (UGE (BTQ x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { @@ -64783,11 +64770,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ y (SHLQ (MOVQconst [1]) x))) // cond: !config.nacl // result: (UGE (BTQ x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] y := v.Args[0] v_1 := v.Args[1] @@ -64816,11 +64799,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTLconst [c] x)) // cond: isUint32PowerOfTwo(c) && !config.nacl // result: (UGE (BTLconst [log2uint32(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTLconst { - break - } + for v.Op == OpAMD64TESTLconst { c := v.AuxInt x := v.Args[0] if !(isUint32PowerOfTwo(c) && !config.nacl) { @@ -64837,11 +64816,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQconst [c] x)) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (UGE (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQconst { - break - } + for v.Op == OpAMD64TESTQconst { c := v.AuxInt x := v.Args[0] if !(isUint64PowerOfTwo(c) && !config.nacl) { @@ -64858,11 +64833,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (UGE (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { @@ -64883,11 +64854,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ x (MOVQconst [c]))) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (UGE (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -64909,11 +64876,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLQconst { @@ -64944,11 +64907,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -64980,11 +64939,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLLconst { @@ -65015,11 +64970,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -65051,11 +65002,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { @@ -65086,11 +65033,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -65122,11 +65065,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTLconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { @@ -65157,11 +65096,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) // cond: z1==z2 && !config.nacl // result: (UGE (BTLconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -65193,11 +65128,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z1:(SHRQconst [63] x) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { @@ -65221,11 +65152,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTQ z2 z1:(SHRQconst [63] x))) // cond: z1==z2 && !config.nacl // result: (UGE (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -65250,11 +65177,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 && !config.nacl // result: (UGE (BTLconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { @@ -65278,11 +65201,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (TESTL z2 z1:(SHRLconst [31] x))) // cond: z1==z2 && !config.nacl // result: (UGE (BTLconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -65307,11 +65226,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64EQ b.SetControl(cmp) @@ -65321,11 +65236,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65334,11 +65245,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65348,11 +65255,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65362,11 +65265,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65376,11 +65275,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (EQ (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65391,11 +65286,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64LE b.SetControl(cmp) @@ -65405,11 +65296,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65418,11 +65305,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65432,11 +65315,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65446,11 +65325,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65459,11 +65334,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65473,11 +65344,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64LT b.SetControl(cmp) @@ -65487,11 +65354,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65501,11 +65364,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65515,11 +65374,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65529,11 +65384,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65542,11 +65393,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (GT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65556,11 +65403,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETL cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETL { - break - } + for v.Op == OpAMD64SETL { cmp := v.Args[0] b.Kind = BlockAMD64LT b.SetControl(cmp) @@ -65570,11 +65413,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETLE cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETLE { - break - } + for v.Op == OpAMD64SETLE { cmp := v.Args[0] b.Kind = BlockAMD64LE b.SetControl(cmp) @@ -65584,11 +65423,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETG cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETG { - break - } + for v.Op == OpAMD64SETG { cmp := v.Args[0] b.Kind = BlockAMD64GT b.SetControl(cmp) @@ -65598,11 +65433,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETGE cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETGE { - break - } + for v.Op == OpAMD64SETGE { cmp := v.Args[0] b.Kind = BlockAMD64GE b.SetControl(cmp) @@ -65612,11 +65443,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETEQ cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETEQ { - break - } + for v.Op == OpAMD64SETEQ { cmp := v.Args[0] b.Kind = BlockAMD64EQ b.SetControl(cmp) @@ -65626,11 +65453,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETNE cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETNE { - break - } + for v.Op == OpAMD64SETNE { cmp := v.Args[0] b.Kind = BlockAMD64NE b.SetControl(cmp) @@ -65640,11 +65463,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETB cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETB { - break - } + for v.Op == OpAMD64SETB { cmp := v.Args[0] b.Kind = BlockAMD64ULT b.SetControl(cmp) @@ -65654,11 +65473,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETBE cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETBE { - break - } + for v.Op == OpAMD64SETBE { cmp := v.Args[0] b.Kind = BlockAMD64ULE b.SetControl(cmp) @@ -65668,11 +65483,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETA cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETA { - break - } + for v.Op == OpAMD64SETA { cmp := v.Args[0] b.Kind = BlockAMD64UGT b.SetControl(cmp) @@ -65682,11 +65493,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETAE cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETAE { - break - } + for v.Op == OpAMD64SETAE { cmp := v.Args[0] b.Kind = BlockAMD64UGE b.SetControl(cmp) @@ -65696,11 +65503,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETO cmp) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETO { - break - } + for v.Op == OpAMD64SETO { cmp := v.Args[0] b.Kind = BlockAMD64OS b.SetControl(cmp) @@ -65710,11 +65513,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETGF cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETGF { - break - } + for v.Op == OpAMD64SETGF { cmp := v.Args[0] b.Kind = BlockAMD64UGT b.SetControl(cmp) @@ -65724,11 +65523,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETGEF cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETGEF { - break - } + for v.Op == OpAMD64SETGEF { cmp := v.Args[0] b.Kind = BlockAMD64UGE b.SetControl(cmp) @@ -65738,11 +65533,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETEQF cmp) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETEQF { - break - } + for v.Op == OpAMD64SETEQF { cmp := v.Args[0] b.Kind = BlockAMD64EQF b.SetControl(cmp) @@ -65752,11 +65543,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (If (SETNEF cmp) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64SETNEF { - break - } + for v.Op == OpAMD64SETNEF { cmp := v.Args[0] b.Kind = BlockAMD64NEF b.SetControl(cmp) @@ -65767,8 +65554,6 @@ func rewriteBlockAMD64(b *Block) bool { // cond: // result: (NE (TESTB cond cond) yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockAMD64NE v0 := b.NewValue0(v.Pos, OpAMD64TESTB, types.TypeFlags) @@ -65782,11 +65567,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64GE b.SetControl(cmp) @@ -65796,11 +65577,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65809,11 +65586,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65822,11 +65595,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65835,11 +65604,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65849,11 +65614,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65864,11 +65625,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64GT b.SetControl(cmp) @@ -65878,11 +65635,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65892,11 +65645,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65905,11 +65654,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65918,11 +65663,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65932,11 +65673,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (LT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -65947,11 +65684,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETL { @@ -65973,11 +65706,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETL cmp) (SETL cmp)) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETL { @@ -65999,11 +65728,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETLE { @@ -66025,11 +65750,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETLE cmp) (SETLE cmp)) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETLE { @@ -66051,11 +65772,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETG { @@ -66077,11 +65794,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETG cmp) (SETG cmp)) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETG { @@ -66103,11 +65816,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGE { @@ -66129,11 +65838,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGE cmp) (SETGE cmp)) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGE { @@ -66155,11 +65860,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETEQ { @@ -66181,11 +65882,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETEQ cmp) (SETEQ cmp)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETEQ { @@ -66207,11 +65904,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETNE { @@ -66233,11 +65926,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETNE cmp) (SETNE cmp)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETNE { @@ -66259,11 +65948,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETB { @@ -66285,11 +65970,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETB cmp) (SETB cmp)) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETB { @@ -66311,11 +65992,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETBE { @@ -66337,11 +66014,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETBE cmp) (SETBE cmp)) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETBE { @@ -66363,11 +66036,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETA { @@ -66389,11 +66058,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETA cmp) (SETA cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETA { @@ -66415,11 +66080,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETAE { @@ -66441,11 +66102,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETAE { @@ -66467,11 +66124,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETO { @@ -66493,11 +66146,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETO cmp) (SETO cmp)) yes no) // cond: // result: (OS cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETO { @@ -66519,11 +66168,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL (SHLL (MOVLconst [1]) x) y)) // cond: !config.nacl // result: (ULT (BTL x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLL { @@ -66551,11 +66196,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL y (SHLL (MOVLconst [1]) x))) // cond: !config.nacl // result: (ULT (BTL x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] y := v.Args[0] v_1 := v.Args[1] @@ -66584,11 +66225,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ (SHLQ (MOVQconst [1]) x) y)) // cond: !config.nacl // result: (ULT (BTQ x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { y := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SHLQ { @@ -66616,11 +66253,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ y (SHLQ (MOVQconst [1]) x))) // cond: !config.nacl // result: (ULT (BTQ x y)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] y := v.Args[0] v_1 := v.Args[1] @@ -66649,11 +66282,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTLconst [c] x)) // cond: isUint32PowerOfTwo(c) && !config.nacl // result: (ULT (BTLconst [log2uint32(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTLconst { - break - } + for v.Op == OpAMD64TESTLconst { c := v.AuxInt x := v.Args[0] if !(isUint32PowerOfTwo(c) && !config.nacl) { @@ -66670,11 +66299,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQconst [c] x)) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (ULT (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQconst { - break - } + for v.Op == OpAMD64TESTQconst { c := v.AuxInt x := v.Args[0] if !(isUint64PowerOfTwo(c) && !config.nacl) { @@ -66691,11 +66316,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ (MOVQconst [c]) x)) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (ULT (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { x := v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64MOVQconst { @@ -66716,11 +66337,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ x (MOVQconst [c]))) // cond: isUint64PowerOfTwo(c) && !config.nacl // result: (ULT (BTQconst [log2(c)] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -66742,11 +66359,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z1:(SHLQconst [63] (SHRQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLQconst { @@ -66777,11 +66390,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z2 z1:(SHLQconst [63] (SHRQconst [63] x)))) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -66813,11 +66422,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z1:(SHLLconst [31] (SHRQconst [31] x)) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHLLconst { @@ -66848,11 +66453,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z2 z1:(SHLLconst [31] (SHRQconst [31] x)))) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -66884,11 +66485,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z1:(SHRQconst [63] (SHLQconst [63] x)) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { @@ -66919,11 +66516,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z2 z1:(SHRQconst [63] (SHLQconst [63] x)))) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -66955,11 +66548,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z1:(SHRLconst [31] (SHLLconst [31] x)) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTLconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { @@ -66990,11 +66579,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z2 z1:(SHRLconst [31] (SHLLconst [31] x)))) // cond: z1==z2 && !config.nacl // result: (ULT (BTLconst [0] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -67026,11 +66611,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z1:(SHRQconst [63] x) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRQconst { @@ -67054,11 +66635,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTQ z2 z1:(SHRQconst [63] x))) // cond: z1==z2 && !config.nacl // result: (ULT (BTQconst [63] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTQ { - break - } + for v.Op == OpAMD64TESTQ { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -67083,11 +66660,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z1:(SHRLconst [31] x) z2)) // cond: z1==z2 && !config.nacl // result: (ULT (BTLconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { z2 := v.Args[1] z1 := v.Args[0] if z1.Op != OpAMD64SHRLconst { @@ -67111,11 +66684,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTL z2 z1:(SHRLconst [31] x))) // cond: z1==z2 && !config.nacl // result: (ULT (BTLconst [31] x)) - for { - v := b.Control - if v.Op != OpAMD64TESTL { - break - } + for v.Op == OpAMD64TESTL { _ = v.Args[1] z2 := v.Args[0] z1 := v.Args[1] @@ -67140,11 +66709,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGF { @@ -67166,11 +66731,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGF { @@ -67192,11 +66753,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGEF { @@ -67218,11 +66775,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETGEF { @@ -67244,11 +66797,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETEQF { @@ -67270,11 +66819,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETEQF cmp) (SETEQF cmp)) yes no) // cond: // result: (EQF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETEQF { @@ -67296,11 +66841,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETNEF { @@ -67322,11 +66863,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (TESTB (SETNEF cmp) (SETNEF cmp)) yes no) // cond: // result: (NEF cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64TESTB { - break - } + for v.Op == OpAMD64TESTB { _ = v.Args[1] v_0 := v.Args[0] if v_0.Op != OpAMD64SETNEF { @@ -67348,11 +66885,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64NE b.SetControl(cmp) @@ -67362,11 +66895,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67376,11 +66905,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67389,11 +66914,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67402,11 +66923,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67415,11 +66932,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (NE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67429,11 +66942,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (InvertFlags cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64ULE b.SetControl(cmp) @@ -67443,11 +66952,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67456,11 +66961,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67470,11 +66971,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67483,11 +66980,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67497,11 +66990,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67511,11 +67000,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (InvertFlags cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64ULT b.SetControl(cmp) @@ -67525,11 +67010,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67539,11 +67020,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67553,11 +67030,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67566,11 +67039,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67580,11 +67049,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (UGT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67594,11 +67059,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (InvertFlags cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64UGE b.SetControl(cmp) @@ -67608,11 +67069,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67621,11 +67078,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67634,11 +67087,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67648,11 +67097,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67661,11 +67106,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67676,11 +67117,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (InvertFlags cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpAMD64InvertFlags { - break - } + for v.Op == OpAMD64InvertFlags { cmp := v.Args[0] b.Kind = BlockAMD64UGT b.SetControl(cmp) @@ -67690,11 +67127,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagEQ { - break - } + for v.Op == OpAMD64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67704,11 +67137,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_ULT { - break - } + for v.Op == OpAMD64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67717,11 +67146,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagLT_UGT { - break - } + for v.Op == OpAMD64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67731,11 +67156,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_ULT { - break - } + for v.Op == OpAMD64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -67744,11 +67165,7 @@ func rewriteBlockAMD64(b *Block) bool { // match: (ULT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpAMD64FlagGT_UGT { - break - } + for v.Op == OpAMD64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil diff --git a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go index dbd0e031a4..0a0ff2dfbf 100644 --- a/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go +++ b/src/cmd/compile/internal/ssa/rewriteAMD64splitload.go @@ -218,11 +218,10 @@ func rewriteValueAMD64splitload_OpAMD64CMPWload_0(v *Value) bool { } func rewriteBlockAMD64splitload(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewriteARM.go b/src/cmd/compile/internal/ssa/rewriteARM.go index 9d3dbd88f8..1cbde5150e 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM.go +++ b/src/cmd/compile/internal/ssa/rewriteARM.go @@ -21697,21 +21697,16 @@ func rewriteValueARM_OpZeromask_0(v *Value) bool { } func rewriteBlockARM(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockARMEQ: // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -21720,11 +21715,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -21734,11 +21725,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -21748,11 +21735,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -21762,11 +21745,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -21776,11 +21755,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMEQ b.SetControl(cmp) @@ -21790,11 +21765,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (EQ (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21818,11 +21789,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (EQ (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21850,11 +21817,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (EQ (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21878,11 +21841,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21908,11 +21867,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21938,11 +21893,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21968,11 +21919,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -21998,11 +21945,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22028,11 +21971,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22058,11 +21997,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (EQ (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22086,11 +22021,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (EQ (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22118,11 +22049,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (EQ (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22146,11 +22073,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22176,11 +22099,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22206,11 +22125,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22236,11 +22151,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22266,11 +22177,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22296,11 +22203,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22326,11 +22229,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (EQ (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22354,11 +22253,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (EQ (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22382,11 +22277,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22412,11 +22303,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22442,11 +22329,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22472,11 +22355,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22502,11 +22381,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22532,11 +22407,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22562,11 +22433,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (EQ (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22590,11 +22457,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (EQ (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22618,11 +22481,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22648,11 +22507,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22678,11 +22533,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22708,11 +22559,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22738,11 +22585,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22768,11 +22611,7 @@ func rewriteBlockARM(b *Block) bool { // match: (EQ (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (EQ (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22799,11 +22638,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -22812,11 +22647,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -22826,11 +22657,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -22840,11 +22667,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -22853,11 +22676,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -22866,11 +22685,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMLE b.SetControl(cmp) @@ -22880,11 +22695,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (GE (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22908,11 +22719,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (GE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22940,11 +22747,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (GE (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22968,11 +22771,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -22998,11 +22797,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23028,11 +22823,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23058,11 +22849,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23088,11 +22875,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23118,11 +22901,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23148,11 +22927,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (GE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23176,11 +22951,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (GE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23208,11 +22979,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (GE (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23236,11 +23003,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23266,11 +23029,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23296,11 +23055,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23326,11 +23081,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23356,11 +23107,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23386,11 +23133,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23416,11 +23159,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (GE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23444,11 +23183,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (GE (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23472,11 +23207,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23502,11 +23233,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23532,11 +23259,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23562,11 +23285,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23592,11 +23311,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23622,11 +23337,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23652,11 +23363,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (GE (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23680,11 +23387,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (GE (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23708,11 +23411,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23738,11 +23437,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23768,11 +23463,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23798,11 +23489,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23828,11 +23515,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23858,11 +23541,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GE (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23889,11 +23568,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -23903,11 +23578,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -23917,11 +23588,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -23931,11 +23598,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -23944,11 +23607,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -23957,11 +23616,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMLT b.SetControl(cmp) @@ -23971,11 +23626,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (GT (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -23999,11 +23650,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (GT (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24031,11 +23678,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (GT (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24059,11 +23702,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24089,11 +23728,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24119,11 +23754,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24149,11 +23780,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24179,11 +23806,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24209,11 +23832,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24239,11 +23858,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (GT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24267,11 +23882,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (GT (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24295,11 +23906,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24325,11 +23932,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24355,11 +23958,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24385,11 +23984,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24415,11 +24010,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24445,11 +24036,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24475,11 +24062,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (GT (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24503,11 +24086,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (GT (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24535,11 +24114,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (GT (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24563,11 +24138,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24593,11 +24164,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24623,11 +24190,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24653,11 +24216,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24683,11 +24242,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24713,11 +24268,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24743,11 +24294,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (GT (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24771,11 +24318,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (GT (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24799,11 +24342,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24829,11 +24368,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24859,11 +24394,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24889,11 +24420,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24919,11 +24446,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24949,11 +24472,7 @@ func rewriteBlockARM(b *Block) bool { // match: (GT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (GT (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -24980,11 +24499,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (Equal cc) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpARMEqual { - break - } + for v.Op == OpARMEqual { cc := v.Args[0] b.Kind = BlockARMEQ b.SetControl(cc) @@ -24994,11 +24509,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (NotEqual cc) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpARMNotEqual { - break - } + for v.Op == OpARMNotEqual { cc := v.Args[0] b.Kind = BlockARMNE b.SetControl(cc) @@ -25008,11 +24519,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (LessThan cc) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpARMLessThan { - break - } + for v.Op == OpARMLessThan { cc := v.Args[0] b.Kind = BlockARMLT b.SetControl(cc) @@ -25022,11 +24529,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (LessThanU cc) yes no) // cond: // result: (ULT cc yes no) - for { - v := b.Control - if v.Op != OpARMLessThanU { - break - } + for v.Op == OpARMLessThanU { cc := v.Args[0] b.Kind = BlockARMULT b.SetControl(cc) @@ -25036,11 +24539,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (LessEqual cc) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpARMLessEqual { - break - } + for v.Op == OpARMLessEqual { cc := v.Args[0] b.Kind = BlockARMLE b.SetControl(cc) @@ -25050,11 +24549,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (LessEqualU cc) yes no) // cond: // result: (ULE cc yes no) - for { - v := b.Control - if v.Op != OpARMLessEqualU { - break - } + for v.Op == OpARMLessEqualU { cc := v.Args[0] b.Kind = BlockARMULE b.SetControl(cc) @@ -25064,11 +24559,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (GreaterThan cc) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpARMGreaterThan { - break - } + for v.Op == OpARMGreaterThan { cc := v.Args[0] b.Kind = BlockARMGT b.SetControl(cc) @@ -25078,11 +24569,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (GreaterThanU cc) yes no) // cond: // result: (UGT cc yes no) - for { - v := b.Control - if v.Op != OpARMGreaterThanU { - break - } + for v.Op == OpARMGreaterThanU { cc := v.Args[0] b.Kind = BlockARMUGT b.SetControl(cc) @@ -25092,11 +24579,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (GreaterEqual cc) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpARMGreaterEqual { - break - } + for v.Op == OpARMGreaterEqual { cc := v.Args[0] b.Kind = BlockARMGE b.SetControl(cc) @@ -25106,11 +24589,7 @@ func rewriteBlockARM(b *Block) bool { // match: (If (GreaterEqualU cc) yes no) // cond: // result: (UGE cc yes no) - for { - v := b.Control - if v.Op != OpARMGreaterEqualU { - break - } + for v.Op == OpARMGreaterEqualU { cc := v.Args[0] b.Kind = BlockARMUGE b.SetControl(cc) @@ -25121,8 +24600,6 @@ func rewriteBlockARM(b *Block) bool { // cond: // result: (NE (CMPconst [0] cond) yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockARMNE v0 := b.NewValue0(v.Pos, OpARMCMPconst, types.TypeFlags) @@ -25136,11 +24613,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25149,11 +24622,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25162,11 +24631,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25175,11 +24640,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25189,11 +24650,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -25203,11 +24660,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMGE b.SetControl(cmp) @@ -25217,11 +24670,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (LE (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25245,11 +24694,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (LE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25277,11 +24722,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (LE (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25305,11 +24746,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25335,11 +24772,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25365,11 +24798,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25395,11 +24824,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25425,11 +24850,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25455,11 +24876,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25485,11 +24902,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (LE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25513,11 +24926,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (LE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25545,11 +24954,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (LE (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25573,11 +24978,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25603,11 +25004,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25633,11 +25030,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25663,11 +25056,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25693,11 +25082,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25723,11 +25108,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25753,11 +25134,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (LE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25781,11 +25158,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (LE (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25809,11 +25182,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25839,11 +25208,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25869,11 +25234,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25899,11 +25260,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25929,11 +25286,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25959,11 +25312,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -25989,11 +25338,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (LE (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26017,11 +25362,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (LE (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26045,11 +25386,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26075,11 +25412,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26105,11 +25438,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26135,11 +25464,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26165,11 +25490,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26195,11 +25516,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LE (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26226,11 +25543,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26240,11 +25553,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26253,11 +25562,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26266,11 +25571,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26280,11 +25581,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -26294,11 +25591,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMGT b.SetControl(cmp) @@ -26308,11 +25601,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (LT (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26336,11 +25625,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (LT (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26368,11 +25653,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (LT (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26396,11 +25677,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26426,11 +25703,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26456,11 +25729,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26486,11 +25755,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26516,11 +25781,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26546,11 +25807,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26576,11 +25833,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (LT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26604,11 +25857,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (LT (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26636,11 +25885,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (LT (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26664,11 +25909,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26694,11 +25935,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26724,11 +25961,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26754,11 +25987,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26784,11 +26013,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26814,11 +26039,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26844,11 +26065,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (LT (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26872,11 +26089,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (LT (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26900,11 +26113,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26930,11 +26139,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26960,11 +26165,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -26990,11 +26191,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27020,11 +26217,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27050,11 +26243,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27080,11 +26269,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (LT (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27108,11 +26293,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (LT (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27136,11 +26317,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27166,11 +26343,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27196,11 +26369,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27226,11 +26395,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27256,11 +26421,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27286,11 +26447,7 @@ func rewriteBlockARM(b *Block) bool { // match: (LT (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (LT (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27317,11 +26474,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (Equal cc)) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27338,11 +26491,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (NotEqual cc)) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27359,11 +26508,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (LessThan cc)) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27380,11 +26525,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (LessThanU cc)) yes no) // cond: // result: (ULT cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27401,11 +26542,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (LessEqual cc)) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27422,11 +26559,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (LessEqualU cc)) yes no) // cond: // result: (ULE cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27443,11 +26576,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (GreaterThan cc)) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27464,11 +26593,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (GreaterThanU cc)) yes no) // cond: // result: (UGT cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27485,11 +26610,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (GreaterEqual cc)) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27506,11 +26627,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] (GreaterEqualU cc)) yes no) // cond: // result: (UGE cc yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27527,11 +26644,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -27541,11 +26654,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -27554,11 +26663,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -27567,11 +26672,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -27580,11 +26681,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -27593,11 +26690,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMNE b.SetControl(cmp) @@ -27607,11 +26700,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUB x y)) yes no) // cond: l.Uses==1 // result: (NE (CMP x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27635,11 +26724,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(MULS x y a)) yes no) // cond: l.Uses==1 // result: (NE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27667,11 +26752,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBconst [c] x)) yes no) // cond: l.Uses==1 // result: (NE (CMPconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27695,11 +26776,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27725,11 +26802,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27755,11 +26828,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27785,11 +26854,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27815,11 +26880,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27845,11 +26906,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(SUBshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMPshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27875,11 +26932,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADD x y)) yes no) // cond: l.Uses==1 // result: (NE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27903,11 +26956,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(MULA x y a)) yes no) // cond: l.Uses==1 // result: (NE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27935,11 +26984,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDconst [c] x)) yes no) // cond: l.Uses==1 // result: (NE (CMNconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27963,11 +27008,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -27993,11 +27034,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28023,11 +27060,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28053,11 +27086,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28083,11 +27112,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28113,11 +27138,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ADDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (CMNshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28143,11 +27164,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(AND x y)) yes no) // cond: l.Uses==1 // result: (NE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28171,11 +27188,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDconst [c] x)) yes no) // cond: l.Uses==1 // result: (NE (TSTconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28199,11 +27212,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28229,11 +27238,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28259,11 +27264,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28289,11 +27290,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28319,11 +27316,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28349,11 +27342,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(ANDshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TSTshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28379,11 +27368,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XOR x y)) yes no) // cond: l.Uses==1 // result: (NE (TEQ x y) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28407,11 +27392,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORconst [c] x)) yes no) // cond: l.Uses==1 // result: (NE (TEQconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28435,11 +27416,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftLL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftLL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28465,11 +27442,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftRL x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftRL x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28495,11 +27468,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftRA x y [c])) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftRA x y [c]) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28525,11 +27494,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftLLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftLLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28555,11 +27520,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftRLreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftRLreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28585,11 +27546,7 @@ func rewriteBlockARM(b *Block) bool { // match: (NE (CMPconst [0] l:(XORshiftRAreg x y z)) yes no) // cond: l.Uses==1 // result: (NE (TEQshiftRAreg x y z) yes no) - for { - v := b.Control - if v.Op != OpARMCMPconst { - break - } + for v.Op == OpARMCMPconst { if v.AuxInt != 0 { break } @@ -28616,11 +27573,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28629,11 +27582,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28643,11 +27592,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28656,11 +27601,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28670,11 +27611,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28683,11 +27620,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGE (InvertFlags cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMULE b.SetControl(cmp) @@ -28698,11 +27631,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28712,11 +27641,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28726,11 +27651,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28739,11 +27660,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28753,11 +27670,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28766,11 +27679,7 @@ func rewriteBlockARM(b *Block) bool { // match: (UGT (InvertFlags cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMULT b.SetControl(cmp) @@ -28781,11 +27690,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28794,11 +27699,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28807,11 +27708,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28821,11 +27718,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28834,11 +27727,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28848,11 +27737,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULE (InvertFlags cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMUGE b.SetControl(cmp) @@ -28863,11 +27748,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagEQ { - break - } + for v.Op == OpARMFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28877,11 +27758,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagLT_ULT { - break - } + for v.Op == OpARMFlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28890,11 +27767,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagLT_UGT { - break - } + for v.Op == OpARMFlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28904,11 +27777,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARMFlagGT_ULT { - break - } + for v.Op == OpARMFlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28917,11 +27786,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARMFlagGT_UGT { - break - } + for v.Op == OpARMFlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -28931,11 +27796,7 @@ func rewriteBlockARM(b *Block) bool { // match: (ULT (InvertFlags cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpARMInvertFlags { - break - } + for v.Op == OpARMInvertFlags { cmp := v.Args[0] b.Kind = BlockARMUGT b.SetControl(cmp) diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 997439ec90..0f55a6f7d8 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -38083,21 +38083,16 @@ func rewriteValueARM64_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockARM64(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockARM64EQ: // match: (EQ (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (EQ (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38121,11 +38116,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (EQ (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38149,11 +38140,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (EQ (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38177,11 +38164,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (EQ (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38205,11 +38188,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (EQ (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38233,11 +38212,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (EQ (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38261,11 +38236,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (EQ (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38289,11 +38260,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (EQ (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38317,11 +38284,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (EQ (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -38343,11 +38306,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (EQ (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -38369,11 +38328,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] x) yes no) // cond: // result: (Z x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38386,11 +38341,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] x) yes no) // cond: // result: (ZW x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38403,11 +38354,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (EQ (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38435,11 +38382,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (EQ (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38467,11 +38410,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (EQ (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38499,11 +38438,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (EQ (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38531,11 +38466,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (TSTconst [c] x) yes no) // cond: oneBit(c) // result: (TBZ {ntz(c)} x yes no) - for { - v := b.Control - if v.Op != OpARM64TSTconst { - break - } + for v.Op == OpARM64TSTconst { c := v.AuxInt x := v.Args[0] if !(oneBit(c)) { @@ -38549,11 +38480,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (TSTWconst [c] x) yes no) // cond: oneBit(int64(uint32(c))) // result: (TBZ {ntz(int64(uint32(c)))} x yes no) - for { - v := b.Control - if v.Op != OpARM64TSTWconst { - break - } + for v.Op == OpARM64TSTWconst { c := v.AuxInt x := v.Args[0] if !(oneBit(int64(uint32(c)))) { @@ -38567,11 +38494,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -38580,11 +38503,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -38594,11 +38513,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -38608,11 +38523,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -38622,11 +38533,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -38636,11 +38543,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64EQ b.SetControl(cmp) @@ -38651,11 +38554,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (FGE (InvertFlags cmp) yes no) // cond: // result: (FLE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64FLE b.SetControl(cmp) @@ -38666,11 +38565,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (FGT (InvertFlags cmp) yes no) // cond: // result: (FLT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64FLT b.SetControl(cmp) @@ -38681,11 +38576,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (FLE (InvertFlags cmp) yes no) // cond: // result: (FGE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64FGE b.SetControl(cmp) @@ -38696,11 +38587,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (FLT (InvertFlags cmp) yes no) // cond: // result: (FGT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64FGT b.SetControl(cmp) @@ -38711,11 +38598,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GE (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38739,11 +38622,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38767,11 +38646,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GE (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38795,11 +38670,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GE (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38823,11 +38694,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GE (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38851,11 +38718,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GE (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38879,11 +38742,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (GE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -38907,11 +38766,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (GE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -38935,11 +38790,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (GE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -38961,11 +38812,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (GE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -38987,11 +38834,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (GE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39019,11 +38862,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (GE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39051,11 +38890,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (GE (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39083,11 +38918,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (GE (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39115,11 +38946,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPWconst [0] x) yes no) // cond: // result: (TBZ {int64(31)} x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39132,11 +38959,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (CMPconst [0] x) yes no) // cond: // result: (TBZ {int64(63)} x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39149,11 +38972,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39162,11 +38981,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39176,11 +38991,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39190,11 +39001,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39203,11 +39010,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39216,11 +39019,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64LE b.SetControl(cmp) @@ -39231,11 +39030,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GT (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39259,11 +39054,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GT (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39287,11 +39078,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GT (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39315,11 +39102,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GT (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39343,11 +39126,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GT (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39371,11 +39150,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (GT (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39399,11 +39174,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (GT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39427,11 +39198,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (GT (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39455,11 +39222,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (GT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -39481,11 +39244,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (GT (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -39507,11 +39266,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (GT (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39539,11 +39294,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (GT (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39571,11 +39322,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (GT (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39603,11 +39350,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (GT (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39635,11 +39378,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39649,11 +39388,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39663,11 +39398,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39677,11 +39408,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39690,11 +39417,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -39703,11 +39426,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64LT b.SetControl(cmp) @@ -39718,11 +39437,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (Equal cc) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpARM64Equal { - break - } + for v.Op == OpARM64Equal { cc := v.Args[0] b.Kind = BlockARM64EQ b.SetControl(cc) @@ -39732,11 +39447,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (NotEqual cc) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpARM64NotEqual { - break - } + for v.Op == OpARM64NotEqual { cc := v.Args[0] b.Kind = BlockARM64NE b.SetControl(cc) @@ -39746,11 +39457,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessThan cc) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThan { - break - } + for v.Op == OpARM64LessThan { cc := v.Args[0] b.Kind = BlockARM64LT b.SetControl(cc) @@ -39760,11 +39467,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessThanU cc) yes no) // cond: // result: (ULT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThanU { - break - } + for v.Op == OpARM64LessThanU { cc := v.Args[0] b.Kind = BlockARM64ULT b.SetControl(cc) @@ -39774,11 +39477,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessEqual cc) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqual { - break - } + for v.Op == OpARM64LessEqual { cc := v.Args[0] b.Kind = BlockARM64LE b.SetControl(cc) @@ -39788,11 +39487,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessEqualU cc) yes no) // cond: // result: (ULE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqualU { - break - } + for v.Op == OpARM64LessEqualU { cc := v.Args[0] b.Kind = BlockARM64ULE b.SetControl(cc) @@ -39802,11 +39497,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterThan cc) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThan { - break - } + for v.Op == OpARM64GreaterThan { cc := v.Args[0] b.Kind = BlockARM64GT b.SetControl(cc) @@ -39816,11 +39507,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterThanU cc) yes no) // cond: // result: (UGT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThanU { - break - } + for v.Op == OpARM64GreaterThanU { cc := v.Args[0] b.Kind = BlockARM64UGT b.SetControl(cc) @@ -39830,11 +39517,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterEqual cc) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqual { - break - } + for v.Op == OpARM64GreaterEqual { cc := v.Args[0] b.Kind = BlockARM64GE b.SetControl(cc) @@ -39844,11 +39527,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterEqualU cc) yes no) // cond: // result: (UGE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqualU { - break - } + for v.Op == OpARM64GreaterEqualU { cc := v.Args[0] b.Kind = BlockARM64UGE b.SetControl(cc) @@ -39858,11 +39537,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessThanF cc) yes no) // cond: // result: (FLT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThanF { - break - } + for v.Op == OpARM64LessThanF { cc := v.Args[0] b.Kind = BlockARM64FLT b.SetControl(cc) @@ -39872,11 +39547,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (LessEqualF cc) yes no) // cond: // result: (FLE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqualF { - break - } + for v.Op == OpARM64LessEqualF { cc := v.Args[0] b.Kind = BlockARM64FLE b.SetControl(cc) @@ -39886,11 +39557,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterThanF cc) yes no) // cond: // result: (FGT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThanF { - break - } + for v.Op == OpARM64GreaterThanF { cc := v.Args[0] b.Kind = BlockARM64FGT b.SetControl(cc) @@ -39900,11 +39567,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (If (GreaterEqualF cc) yes no) // cond: // result: (FGE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqualF { - break - } + for v.Op == OpARM64GreaterEqualF { cc := v.Args[0] b.Kind = BlockARM64FGE b.SetControl(cc) @@ -39915,8 +39578,6 @@ func rewriteBlockARM64(b *Block) bool { // cond: // result: (NZ cond yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockARM64NZ b.SetControl(cond) @@ -39927,11 +39588,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LE (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -39955,11 +39612,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -39983,11 +39636,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LE (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40011,11 +39660,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LE (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40039,11 +39684,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LE (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40067,11 +39708,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LE (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40095,11 +39732,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (LE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40123,11 +39756,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (LE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40151,11 +39780,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (LE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -40177,11 +39802,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (LE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -40203,11 +39824,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (LE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40235,11 +39852,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (LE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40267,11 +39880,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (LE (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40299,11 +39908,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (LE (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40331,11 +39936,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40344,11 +39945,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40357,11 +39954,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40370,11 +39963,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40384,11 +39973,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40398,11 +39983,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64GE b.SetControl(cmp) @@ -40413,11 +39994,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LT (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40441,11 +40018,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LT (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40469,11 +40042,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LT (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40497,11 +40066,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LT (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40525,11 +40090,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LT (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40553,11 +40114,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (LT (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40581,11 +40138,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (LT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40609,11 +40162,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (LT (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40637,11 +40186,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (LT (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -40663,11 +40208,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (LT (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -40689,11 +40230,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (LT (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40721,11 +40258,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (LT (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40753,11 +40286,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (LT (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40785,11 +40314,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (LT (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40817,11 +40342,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPWconst [0] x) yes no) // cond: // result: (TBNZ {int64(31)} x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40834,11 +40355,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (CMPconst [0] x) yes no) // cond: // result: (TBNZ {int64(63)} x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40851,11 +40368,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40865,11 +40378,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40878,11 +40387,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40891,11 +40396,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40905,11 +40406,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40919,11 +40416,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64GT b.SetControl(cmp) @@ -40934,11 +40427,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (NE (TSTWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -40962,11 +40451,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (NE (TST x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -40990,11 +40475,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (NE (TSTW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41018,11 +40499,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] x:(ANDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (NE (TSTconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41046,11 +40523,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (NE (CMNconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41074,11 +40547,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] x:(ADDconst [c] y)) yes no) // cond: x.Uses == 1 // result: (NE (CMNWconst [c] y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41102,11 +40571,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (NE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41130,11 +40595,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] z:(ADD x y)) yes no) // cond: z.Uses == 1 // result: (NE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41158,11 +40619,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMP x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (NE (CMN x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMP { - break - } + for v.Op == OpARM64CMP { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -41184,11 +40641,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPW x z:(NEG y)) yes no) // cond: z.Uses == 1 // result: (NE (CMNW x y) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPW { - break - } + for v.Op == OpARM64CMPW { _ = v.Args[1] x := v.Args[0] z := v.Args[1] @@ -41210,11 +40663,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] x) yes no) // cond: // result: (NZ x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41227,11 +40676,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] x) yes no) // cond: // result: (NZW x yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41244,11 +40689,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] z:(MADD a x y)) yes no) // cond: z.Uses==1 // result: (NE (CMN a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41276,11 +40717,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPconst [0] z:(MSUB a x y)) yes no) // cond: z.Uses==1 // result: (NE (CMP a (MUL x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPconst { - break - } + for v.Op == OpARM64CMPconst { if v.AuxInt != 0 { break } @@ -41308,11 +40745,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] z:(MADDW a x y)) yes no) // cond: z.Uses==1 // result: (NE (CMNW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41340,11 +40773,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (CMPWconst [0] z:(MSUBW a x y)) yes no) // cond: z.Uses==1 // result: (NE (CMPW a (MULW x y)) yes no) - for { - v := b.Control - if v.Op != OpARM64CMPWconst { - break - } + for v.Op == OpARM64CMPWconst { if v.AuxInt != 0 { break } @@ -41372,11 +40801,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (TSTconst [c] x) yes no) // cond: oneBit(c) // result: (TBNZ {ntz(c)} x yes no) - for { - v := b.Control - if v.Op != OpARM64TSTconst { - break - } + for v.Op == OpARM64TSTconst { c := v.AuxInt x := v.Args[0] if !(oneBit(c)) { @@ -41390,11 +40815,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (TSTWconst [c] x) yes no) // cond: oneBit(int64(uint32(c))) // result: (TBNZ {ntz(int64(uint32(c)))} x yes no) - for { - v := b.Control - if v.Op != OpARM64TSTWconst { - break - } + for v.Op == OpARM64TSTWconst { c := v.AuxInt x := v.Args[0] if !(oneBit(int64(uint32(c)))) { @@ -41408,11 +40829,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41422,11 +40839,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41435,11 +40848,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41448,11 +40857,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41461,11 +40866,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41474,11 +40875,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64NE b.SetControl(cmp) @@ -41489,11 +40886,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (Equal cc) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpARM64Equal { - break - } + for v.Op == OpARM64Equal { cc := v.Args[0] b.Kind = BlockARM64EQ b.SetControl(cc) @@ -41503,11 +40896,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (NotEqual cc) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpARM64NotEqual { - break - } + for v.Op == OpARM64NotEqual { cc := v.Args[0] b.Kind = BlockARM64NE b.SetControl(cc) @@ -41517,11 +40906,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessThan cc) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThan { - break - } + for v.Op == OpARM64LessThan { cc := v.Args[0] b.Kind = BlockARM64LT b.SetControl(cc) @@ -41531,11 +40916,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessThanU cc) yes no) // cond: // result: (ULT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThanU { - break - } + for v.Op == OpARM64LessThanU { cc := v.Args[0] b.Kind = BlockARM64ULT b.SetControl(cc) @@ -41545,11 +40926,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessEqual cc) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqual { - break - } + for v.Op == OpARM64LessEqual { cc := v.Args[0] b.Kind = BlockARM64LE b.SetControl(cc) @@ -41559,11 +40936,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessEqualU cc) yes no) // cond: // result: (ULE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqualU { - break - } + for v.Op == OpARM64LessEqualU { cc := v.Args[0] b.Kind = BlockARM64ULE b.SetControl(cc) @@ -41573,11 +40946,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterThan cc) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThan { - break - } + for v.Op == OpARM64GreaterThan { cc := v.Args[0] b.Kind = BlockARM64GT b.SetControl(cc) @@ -41587,11 +40956,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterThanU cc) yes no) // cond: // result: (UGT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThanU { - break - } + for v.Op == OpARM64GreaterThanU { cc := v.Args[0] b.Kind = BlockARM64UGT b.SetControl(cc) @@ -41601,11 +40966,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterEqual cc) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqual { - break - } + for v.Op == OpARM64GreaterEqual { cc := v.Args[0] b.Kind = BlockARM64GE b.SetControl(cc) @@ -41615,11 +40976,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterEqualU cc) yes no) // cond: // result: (UGE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqualU { - break - } + for v.Op == OpARM64GreaterEqualU { cc := v.Args[0] b.Kind = BlockARM64UGE b.SetControl(cc) @@ -41629,11 +40986,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessThanF cc) yes no) // cond: // result: (FLT cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessThanF { - break - } + for v.Op == OpARM64LessThanF { cc := v.Args[0] b.Kind = BlockARM64FLT b.SetControl(cc) @@ -41643,11 +40996,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (LessEqualF cc) yes no) // cond: // result: (FLE cc yes no) - for { - v := b.Control - if v.Op != OpARM64LessEqualF { - break - } + for v.Op == OpARM64LessEqualF { cc := v.Args[0] b.Kind = BlockARM64FLE b.SetControl(cc) @@ -41657,11 +41006,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterThan cc) yes no) // cond: // result: (FGT cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterThan { - break - } + for v.Op == OpARM64GreaterThan { cc := v.Args[0] b.Kind = BlockARM64FGT b.SetControl(cc) @@ -41671,11 +41016,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (GreaterEqual cc) yes no) // cond: // result: (FGE cc yes no) - for { - v := b.Control - if v.Op != OpARM64GreaterEqual { - break - } + for v.Op == OpARM64GreaterEqual { cc := v.Args[0] b.Kind = BlockARM64FGE b.SetControl(cc) @@ -41685,11 +41026,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (ANDconst [c] x) yes no) // cond: oneBit(c) // result: (TBNZ {ntz(c)} x yes no) - for { - v := b.Control - if v.Op != OpARM64ANDconst { - break - } + for v.Op == OpARM64ANDconst { c := v.AuxInt x := v.Args[0] if !(oneBit(c)) { @@ -41703,11 +41040,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (MOVDconst [0]) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { if v.AuxInt != 0 { break } @@ -41720,11 +41053,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZ (MOVDconst [c]) yes no) // cond: c != 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(c != 0) { break @@ -41738,11 +41067,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZW (ANDconst [c] x) yes no) // cond: oneBit(int64(uint32(c))) // result: (TBNZ {ntz(int64(uint32(c)))} x yes no) - for { - v := b.Control - if v.Op != OpARM64ANDconst { - break - } + for v.Op == OpARM64ANDconst { c := v.AuxInt x := v.Args[0] if !(oneBit(int64(uint32(c)))) { @@ -41756,11 +41081,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZW (MOVDconst [c]) yes no) // cond: int32(c) == 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(int32(c) == 0) { break @@ -41774,11 +41095,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (NZW (MOVDconst [c]) yes no) // cond: int32(c) != 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(int32(c) != 0) { break @@ -41792,11 +41109,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41805,11 +41118,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41819,11 +41128,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41832,11 +41137,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41846,11 +41147,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41859,11 +41156,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGE (InvertFlags cmp) yes no) // cond: // result: (ULE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64ULE b.SetControl(cmp) @@ -41874,11 +41167,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41888,11 +41177,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (FlagLT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41902,11 +41187,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (FlagLT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41915,11 +41196,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (FlagGT_ULT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41929,11 +41206,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (FlagGT_UGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41942,11 +41215,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (UGT (InvertFlags cmp) yes no) // cond: // result: (ULT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64ULT b.SetControl(cmp) @@ -41957,11 +41226,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41970,11 +41235,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41983,11 +41244,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41997,11 +41254,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42010,11 +41263,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42024,11 +41273,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULE (InvertFlags cmp) yes no) // cond: // result: (UGE cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64UGE b.SetControl(cmp) @@ -42039,11 +41284,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagEQ { - break - } + for v.Op == OpARM64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42053,11 +41294,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (FlagLT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagLT_ULT { - break - } + for v.Op == OpARM64FlagLT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42066,11 +41303,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (FlagLT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagLT_UGT { - break - } + for v.Op == OpARM64FlagLT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42080,11 +41313,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (FlagGT_ULT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64FlagGT_ULT { - break - } + for v.Op == OpARM64FlagGT_ULT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42093,11 +41322,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (FlagGT_UGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64FlagGT_UGT { - break - } + for v.Op == OpARM64FlagGT_UGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -42107,11 +41332,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ULT (InvertFlags cmp) yes no) // cond: // result: (UGT cmp yes no) - for { - v := b.Control - if v.Op != OpARM64InvertFlags { - break - } + for v.Op == OpARM64InvertFlags { cmp := v.Args[0] b.Kind = BlockARM64UGT b.SetControl(cmp) @@ -42122,11 +41343,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (Z (ANDconst [c] x) yes no) // cond: oneBit(c) // result: (TBZ {ntz(c)} x yes no) - for { - v := b.Control - if v.Op != OpARM64ANDconst { - break - } + for v.Op == OpARM64ANDconst { c := v.AuxInt x := v.Args[0] if !(oneBit(c)) { @@ -42140,11 +41357,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (Z (MOVDconst [0]) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { if v.AuxInt != 0 { break } @@ -42156,11 +41369,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (Z (MOVDconst [c]) yes no) // cond: c != 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(c != 0) { break @@ -42175,11 +41384,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ZW (ANDconst [c] x) yes no) // cond: oneBit(int64(uint32(c))) // result: (TBZ {ntz(int64(uint32(c)))} x yes no) - for { - v := b.Control - if v.Op != OpARM64ANDconst { - break - } + for v.Op == OpARM64ANDconst { c := v.AuxInt x := v.Args[0] if !(oneBit(int64(uint32(c)))) { @@ -42193,11 +41398,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ZW (MOVDconst [c]) yes no) // cond: int32(c) == 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(int32(c) == 0) { break @@ -42210,11 +41411,7 @@ func rewriteBlockARM64(b *Block) bool { // match: (ZW (MOVDconst [c]) yes no) // cond: int32(c) != 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpARM64MOVDconst { - break - } + for v.Op == OpARM64MOVDconst { c := v.AuxInt if !(int32(c) != 0) { break diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS.go b/src/cmd/compile/internal/ssa/rewriteMIPS.go index 4c11640616..b597d7c899 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS.go @@ -9317,21 +9317,16 @@ func rewriteValueMIPS_OpZeromask_0(v *Value) bool { } func rewriteBlockMIPS(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockMIPSEQ: // match: (EQ (FPFlagTrue cmp) yes no) // cond: // result: (FPF cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSFPFlagTrue { - break - } + for v.Op == OpMIPSFPFlagTrue { cmp := v.Args[0] b.Kind = BlockMIPSFPF b.SetControl(cmp) @@ -9341,11 +9336,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (FPFlagFalse cmp) yes no) // cond: // result: (FPT cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSFPFlagFalse { - break - } + for v.Op == OpMIPSFPFlagFalse { cmp := v.Args[0] b.Kind = BlockMIPSFPT b.SetControl(cmp) @@ -9355,11 +9346,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGT _ _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9376,11 +9363,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTU _ _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9397,11 +9380,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTconst _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9417,11 +9396,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTUconst _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9437,11 +9412,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTzero _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9457,11 +9428,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTUzero _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9477,11 +9444,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (SGTUconst [1] x) yes no) // cond: // result: (NE x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTUconst { - break - } + for v.Op == OpMIPSSGTUconst { if v.AuxInt != 1 { break } @@ -9494,11 +9457,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (SGTUzero x) yes no) // cond: // result: (EQ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTUzero { - break - } + for v.Op == OpMIPSSGTUzero { x := v.Args[0] b.Kind = BlockMIPSEQ b.SetControl(x) @@ -9508,11 +9467,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (SGTconst [0] x) yes no) // cond: // result: (GEZ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTconst { - break - } + for v.Op == OpMIPSSGTconst { if v.AuxInt != 0 { break } @@ -9525,11 +9480,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (SGTzero x) yes no) // cond: // result: (LEZ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTzero { - break - } + for v.Op == OpMIPSSGTzero { x := v.Args[0] b.Kind = BlockMIPSLEZ b.SetControl(x) @@ -9539,11 +9490,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (MOVWconst [0]) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { if v.AuxInt != 0 { break } @@ -9555,11 +9502,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (EQ (MOVWconst [c]) yes no) // cond: c != 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(c != 0) { break @@ -9574,11 +9517,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (GEZ (MOVWconst [c]) yes no) // cond: int32(c) >= 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) >= 0) { break @@ -9591,11 +9530,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (GEZ (MOVWconst [c]) yes no) // cond: int32(c) < 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) < 0) { break @@ -9610,11 +9545,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (GTZ (MOVWconst [c]) yes no) // cond: int32(c) > 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) > 0) { break @@ -9627,11 +9558,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (GTZ (MOVWconst [c]) yes no) // cond: int32(c) <= 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) <= 0) { break @@ -9647,8 +9574,6 @@ func rewriteBlockMIPS(b *Block) bool { // cond: // result: (NE cond yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockMIPSNE b.SetControl(cond) @@ -9659,11 +9584,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (LEZ (MOVWconst [c]) yes no) // cond: int32(c) <= 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) <= 0) { break @@ -9676,11 +9597,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (LEZ (MOVWconst [c]) yes no) // cond: int32(c) > 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) > 0) { break @@ -9695,11 +9612,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (LTZ (MOVWconst [c]) yes no) // cond: int32(c) < 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) < 0) { break @@ -9712,11 +9625,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (LTZ (MOVWconst [c]) yes no) // cond: int32(c) >= 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(int32(c) >= 0) { break @@ -9731,11 +9640,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (FPFlagTrue cmp) yes no) // cond: // result: (FPT cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSFPFlagTrue { - break - } + for v.Op == OpMIPSFPFlagTrue { cmp := v.Args[0] b.Kind = BlockMIPSFPT b.SetControl(cmp) @@ -9745,11 +9650,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (FPFlagFalse cmp) yes no) // cond: // result: (FPF cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSFPFlagFalse { - break - } + for v.Op == OpMIPSFPFlagFalse { cmp := v.Args[0] b.Kind = BlockMIPSFPF b.SetControl(cmp) @@ -9759,11 +9660,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGT _ _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9780,11 +9677,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTU _ _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9801,11 +9694,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTconst _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9821,11 +9710,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTUconst _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9841,11 +9726,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTzero _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9861,11 +9742,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTUzero _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPSXORconst { - break - } + for v.Op == OpMIPSXORconst { if v.AuxInt != 1 { break } @@ -9881,11 +9758,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (SGTUconst [1] x) yes no) // cond: // result: (EQ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTUconst { - break - } + for v.Op == OpMIPSSGTUconst { if v.AuxInt != 1 { break } @@ -9898,11 +9771,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (SGTUzero x) yes no) // cond: // result: (NE x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTUzero { - break - } + for v.Op == OpMIPSSGTUzero { x := v.Args[0] b.Kind = BlockMIPSNE b.SetControl(x) @@ -9912,11 +9781,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (SGTconst [0] x) yes no) // cond: // result: (LTZ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTconst { - break - } + for v.Op == OpMIPSSGTconst { if v.AuxInt != 0 { break } @@ -9929,11 +9794,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (SGTzero x) yes no) // cond: // result: (GTZ x yes no) - for { - v := b.Control - if v.Op != OpMIPSSGTzero { - break - } + for v.Op == OpMIPSSGTzero { x := v.Args[0] b.Kind = BlockMIPSGTZ b.SetControl(x) @@ -9943,11 +9804,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (MOVWconst [0]) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { if v.AuxInt != 0 { break } @@ -9960,11 +9817,7 @@ func rewriteBlockMIPS(b *Block) bool { // match: (NE (MOVWconst [c]) yes no) // cond: c != 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPSMOVWconst { - break - } + for v.Op == OpMIPSMOVWconst { c := v.AuxInt if !(c != 0) { break diff --git a/src/cmd/compile/internal/ssa/rewriteMIPS64.go b/src/cmd/compile/internal/ssa/rewriteMIPS64.go index d9efa99261..453b81e75f 100644 --- a/src/cmd/compile/internal/ssa/rewriteMIPS64.go +++ b/src/cmd/compile/internal/ssa/rewriteMIPS64.go @@ -10036,21 +10036,16 @@ func rewriteValueMIPS64_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockMIPS64(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockMIPS64EQ: // match: (EQ (FPFlagTrue cmp) yes no) // cond: // result: (FPF cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64FPFlagTrue { - break - } + for v.Op == OpMIPS64FPFlagTrue { cmp := v.Args[0] b.Kind = BlockMIPS64FPF b.SetControl(cmp) @@ -10060,11 +10055,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (FPFlagFalse cmp) yes no) // cond: // result: (FPT cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64FPFlagFalse { - break - } + for v.Op == OpMIPS64FPFlagFalse { cmp := v.Args[0] b.Kind = BlockMIPS64FPT b.SetControl(cmp) @@ -10074,11 +10065,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGT _ _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10095,11 +10082,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTU _ _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10116,11 +10099,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTconst _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10136,11 +10115,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (XORconst [1] cmp:(SGTUconst _)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10156,11 +10131,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (SGTUconst [1] x) yes no) // cond: // result: (NE x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTUconst { - break - } + for v.Op == OpMIPS64SGTUconst { if v.AuxInt != 1 { break } @@ -10173,11 +10144,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (SGTU x (MOVVconst [0])) yes no) // cond: // result: (EQ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTU { - break - } + for v.Op == OpMIPS64SGTU { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -10195,11 +10162,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (SGTconst [0] x) yes no) // cond: // result: (GEZ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTconst { - break - } + for v.Op == OpMIPS64SGTconst { if v.AuxInt != 0 { break } @@ -10212,11 +10175,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (SGT x (MOVVconst [0])) yes no) // cond: // result: (LEZ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGT { - break - } + for v.Op == OpMIPS64SGT { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -10234,11 +10193,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (MOVVconst [0]) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { if v.AuxInt != 0 { break } @@ -10250,11 +10205,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (EQ (MOVVconst [c]) yes no) // cond: c != 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c != 0) { break @@ -10269,11 +10220,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (GEZ (MOVVconst [c]) yes no) // cond: c >= 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c >= 0) { break @@ -10286,11 +10233,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (GEZ (MOVVconst [c]) yes no) // cond: c < 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c < 0) { break @@ -10305,11 +10248,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (GTZ (MOVVconst [c]) yes no) // cond: c > 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c > 0) { break @@ -10322,11 +10261,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (GTZ (MOVVconst [c]) yes no) // cond: c <= 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c <= 0) { break @@ -10342,8 +10277,6 @@ func rewriteBlockMIPS64(b *Block) bool { // cond: // result: (NE cond yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockMIPS64NE b.SetControl(cond) @@ -10354,11 +10287,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (LEZ (MOVVconst [c]) yes no) // cond: c <= 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c <= 0) { break @@ -10371,11 +10300,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (LEZ (MOVVconst [c]) yes no) // cond: c > 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c > 0) { break @@ -10390,11 +10315,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (LTZ (MOVVconst [c]) yes no) // cond: c < 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c < 0) { break @@ -10407,11 +10328,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (LTZ (MOVVconst [c]) yes no) // cond: c >= 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c >= 0) { break @@ -10426,11 +10343,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (FPFlagTrue cmp) yes no) // cond: // result: (FPT cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64FPFlagTrue { - break - } + for v.Op == OpMIPS64FPFlagTrue { cmp := v.Args[0] b.Kind = BlockMIPS64FPT b.SetControl(cmp) @@ -10440,11 +10353,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (FPFlagFalse cmp) yes no) // cond: // result: (FPF cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64FPFlagFalse { - break - } + for v.Op == OpMIPS64FPFlagFalse { cmp := v.Args[0] b.Kind = BlockMIPS64FPF b.SetControl(cmp) @@ -10454,11 +10363,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGT _ _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10475,11 +10380,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTU _ _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10496,11 +10397,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTconst _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10516,11 +10413,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (XORconst [1] cmp:(SGTUconst _)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpMIPS64XORconst { - break - } + for v.Op == OpMIPS64XORconst { if v.AuxInt != 1 { break } @@ -10536,11 +10429,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (SGTUconst [1] x) yes no) // cond: // result: (EQ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTUconst { - break - } + for v.Op == OpMIPS64SGTUconst { if v.AuxInt != 1 { break } @@ -10553,11 +10442,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (SGTU x (MOVVconst [0])) yes no) // cond: // result: (NE x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTU { - break - } + for v.Op == OpMIPS64SGTU { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -10575,11 +10460,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (SGTconst [0] x) yes no) // cond: // result: (LTZ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGTconst { - break - } + for v.Op == OpMIPS64SGTconst { if v.AuxInt != 0 { break } @@ -10592,11 +10473,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (SGT x (MOVVconst [0])) yes no) // cond: // result: (GTZ x yes no) - for { - v := b.Control - if v.Op != OpMIPS64SGT { - break - } + for v.Op == OpMIPS64SGT { _ = v.Args[1] x := v.Args[0] v_1 := v.Args[1] @@ -10614,11 +10491,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (MOVVconst [0]) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { if v.AuxInt != 0 { break } @@ -10631,11 +10504,7 @@ func rewriteBlockMIPS64(b *Block) bool { // match: (NE (MOVVconst [c]) yes no) // cond: c != 0 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpMIPS64MOVVconst { - break - } + for v.Op == OpMIPS64MOVVconst { c := v.AuxInt if !(c != 0) { break diff --git a/src/cmd/compile/internal/ssa/rewritePPC64.go b/src/cmd/compile/internal/ssa/rewritePPC64.go index 4c25c39707..3b1b7e2a54 100644 --- a/src/cmd/compile/internal/ssa/rewritePPC64.go +++ b/src/cmd/compile/internal/ssa/rewritePPC64.go @@ -30173,21 +30173,16 @@ func rewriteValuePPC64_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockPPC64(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockPPC64EQ: // match: (EQ (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (EQ (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30208,11 +30203,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (EQ (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -30233,11 +30224,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30246,11 +30233,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30260,11 +30243,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30274,11 +30253,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64EQ b.SetControl(cmp) @@ -30288,11 +30263,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (EQ (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30313,11 +30284,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (EQ (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -30338,11 +30305,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (EQ (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30366,11 +30329,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (EQ (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30394,11 +30353,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (EQ (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (EQ (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30423,11 +30378,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30436,11 +30387,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30450,11 +30397,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30463,11 +30406,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64LE b.SetControl(cmp) @@ -30477,11 +30416,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (GE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30502,11 +30437,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (GE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -30527,11 +30458,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GE (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30555,11 +30482,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (GE (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30583,11 +30506,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (GE (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30612,11 +30531,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30626,11 +30541,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30640,11 +30551,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30653,11 +30560,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64LT b.SetControl(cmp) @@ -30667,11 +30570,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (GT (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30692,11 +30591,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (GT (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -30717,11 +30612,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (GT (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30745,11 +30636,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (GT (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30773,11 +30660,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (GT (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (GT (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -30802,11 +30685,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (Equal cc) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpPPC64Equal { - break - } + for v.Op == OpPPC64Equal { cc := v.Args[0] b.Kind = BlockPPC64EQ b.SetControl(cc) @@ -30816,11 +30695,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (NotEqual cc) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64NotEqual { - break - } + for v.Op == OpPPC64NotEqual { cc := v.Args[0] b.Kind = BlockPPC64NE b.SetControl(cc) @@ -30830,11 +30705,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (LessThan cc) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64LessThan { - break - } + for v.Op == OpPPC64LessThan { cc := v.Args[0] b.Kind = BlockPPC64LT b.SetControl(cc) @@ -30844,11 +30715,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (LessEqual cc) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64LessEqual { - break - } + for v.Op == OpPPC64LessEqual { cc := v.Args[0] b.Kind = BlockPPC64LE b.SetControl(cc) @@ -30858,11 +30725,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (GreaterThan cc) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64GreaterThan { - break - } + for v.Op == OpPPC64GreaterThan { cc := v.Args[0] b.Kind = BlockPPC64GT b.SetControl(cc) @@ -30872,11 +30735,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (GreaterEqual cc) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64GreaterEqual { - break - } + for v.Op == OpPPC64GreaterEqual { cc := v.Args[0] b.Kind = BlockPPC64GE b.SetControl(cc) @@ -30886,11 +30745,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (FLessThan cc) yes no) // cond: // result: (FLT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64FLessThan { - break - } + for v.Op == OpPPC64FLessThan { cc := v.Args[0] b.Kind = BlockPPC64FLT b.SetControl(cc) @@ -30900,11 +30755,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (FLessEqual cc) yes no) // cond: // result: (FLE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64FLessEqual { - break - } + for v.Op == OpPPC64FLessEqual { cc := v.Args[0] b.Kind = BlockPPC64FLE b.SetControl(cc) @@ -30914,11 +30765,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (FGreaterThan cc) yes no) // cond: // result: (FGT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64FGreaterThan { - break - } + for v.Op == OpPPC64FGreaterThan { cc := v.Args[0] b.Kind = BlockPPC64FGT b.SetControl(cc) @@ -30928,11 +30775,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (If (FGreaterEqual cc) yes no) // cond: // result: (FGE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64FGreaterEqual { - break - } + for v.Op == OpPPC64FGreaterEqual { cc := v.Args[0] b.Kind = BlockPPC64FGE b.SetControl(cc) @@ -30943,8 +30786,6 @@ func rewriteBlockPPC64(b *Block) bool { // cond: // result: (NE (CMPWconst [0] cond) yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockPPC64NE v0 := b.NewValue0(v.Pos, OpPPC64CMPWconst, types.TypeFlags) @@ -30958,11 +30799,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30971,11 +30808,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30984,11 +30817,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -30998,11 +30827,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64GE b.SetControl(cmp) @@ -31012,11 +30837,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (LE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31037,11 +30858,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (LE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31062,11 +30879,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LE (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31090,11 +30903,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (LE (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31118,11 +30927,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (LE (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31147,11 +30952,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31161,11 +30962,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31174,11 +30971,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31188,11 +30981,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64GT b.SetControl(cmp) @@ -31202,11 +30991,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (LT (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31227,11 +31012,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (LT (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31252,11 +31033,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (LT (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31280,11 +31057,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (LT (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31308,11 +31081,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (LT (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (LT (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31337,11 +31106,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (Equal cc)) yes no) // cond: // result: (EQ cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31358,11 +31123,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (NotEqual cc)) yes no) // cond: // result: (NE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31379,11 +31140,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (LessThan cc)) yes no) // cond: // result: (LT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31400,11 +31157,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (LessEqual cc)) yes no) // cond: // result: (LE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31421,11 +31174,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (GreaterThan cc)) yes no) // cond: // result: (GT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31442,11 +31191,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (GreaterEqual cc)) yes no) // cond: // result: (GE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31463,11 +31208,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (FLessThan cc)) yes no) // cond: // result: (FLT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31484,11 +31225,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (FLessEqual cc)) yes no) // cond: // result: (FLE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31505,11 +31242,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (FGreaterThan cc)) yes no) // cond: // result: (FGT cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31526,11 +31259,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (FGreaterEqual cc)) yes no) // cond: // result: (FGE cc yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31547,11 +31276,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (NE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31572,11 +31297,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (NE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31597,11 +31318,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpPPC64FlagEQ { - break - } + for v.Op == OpPPC64FlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31611,11 +31328,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagLT { - break - } + for v.Op == OpPPC64FlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31624,11 +31337,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpPPC64FlagGT { - break - } + for v.Op == OpPPC64FlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -31637,11 +31346,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpPPC64InvertFlags { - break - } + for v.Op == OpPPC64InvertFlags { cmp := v.Args[0] b.Kind = BlockPPC64NE b.SetControl(cmp) @@ -31651,11 +31356,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPconst [0] (ANDconst [c] x)) yes no) // cond: // result: (NE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31676,11 +31377,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPWconst [0] (ANDconst [c] x)) yes no) // cond: // result: (NE (ANDCCconst [c] x) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPWconst { - break - } + for v.Op == OpPPC64CMPWconst { if v.AuxInt != 0 { break } @@ -31701,11 +31398,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPconst [0] z:(AND x y)) yes no) // cond: z.Uses == 1 // result: (NE (ANDCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31729,11 +31422,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPconst [0] z:(OR x y)) yes no) // cond: z.Uses == 1 // result: (NE (ORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } @@ -31757,11 +31446,7 @@ func rewriteBlockPPC64(b *Block) bool { // match: (NE (CMPconst [0] z:(XOR x y)) yes no) // cond: z.Uses == 1 // result: (NE (XORCC x y) yes no) - for { - v := b.Control - if v.Op != OpPPC64CMPconst { - break - } + for v.Op == OpPPC64CMPconst { if v.AuxInt != 0 { break } diff --git a/src/cmd/compile/internal/ssa/rewriteS390X.go b/src/cmd/compile/internal/ssa/rewriteS390X.go index 78fa5c5c96..6c45719927 100644 --- a/src/cmd/compile/internal/ssa/rewriteS390X.go +++ b/src/cmd/compile/internal/ssa/rewriteS390X.go @@ -40897,21 +40897,16 @@ func rewriteValueS390X_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockS390X(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockS390XEQ: // match: (EQ (InvertFlags cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XEQ b.SetControl(cmp) @@ -40921,11 +40916,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (EQ (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40934,11 +40925,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (EQ (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40948,11 +40935,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (EQ (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40963,11 +40946,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GE (InvertFlags cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XLE b.SetControl(cmp) @@ -40977,11 +40956,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -40990,11 +40965,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GE (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41004,11 +40975,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GE (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41018,11 +40985,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GT (InvertFlags cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XLT b.SetControl(cmp) @@ -41032,11 +40995,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41046,11 +41005,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GT (FlagLT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41060,11 +41015,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (GT (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41074,11 +41025,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDLT { - break - } + for v.Op == OpS390XMOVDLT { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41102,11 +41049,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDLE { - break - } + for v.Op == OpS390XMOVDLE { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41130,11 +41073,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDGT { - break - } + for v.Op == OpS390XMOVDGT { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41158,11 +41097,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDGE { - break - } + for v.Op == OpS390XMOVDGE { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41186,11 +41121,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDEQ { - break - } + for v.Op == OpS390XMOVDEQ { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41214,11 +41145,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDNE { - break - } + for v.Op == OpS390XMOVDNE { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41242,11 +41169,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (GTF cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDGTnoinv { - break - } + for v.Op == OpS390XMOVDGTnoinv { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41270,11 +41193,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (If (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp) yes no) // cond: // result: (GEF cmp yes no) - for { - v := b.Control - if v.Op != OpS390XMOVDGEnoinv { - break - } + for v.Op == OpS390XMOVDGEnoinv { cmp := v.Args[2] v_0 := v.Args[0] if v_0.Op != OpS390XMOVDconst { @@ -41299,8 +41218,6 @@ func rewriteBlockS390X(b *Block) bool { // cond: // result: (NE (CMPWconst [0] (MOVBZreg cond)) yes no) for { - v := b.Control - _ = v cond := b.Control b.Kind = BlockS390XNE v0 := b.NewValue0(v.Pos, OpS390XCMPWconst, types.TypeFlags) @@ -41316,11 +41233,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LE (InvertFlags cmp) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XGE b.SetControl(cmp) @@ -41330,11 +41243,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LE (FlagEQ) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41343,11 +41252,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LE (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41356,11 +41261,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LE (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41371,11 +41272,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LT (InvertFlags cmp) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XGT b.SetControl(cmp) @@ -41385,11 +41282,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LT (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41399,11 +41292,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LT (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41412,11 +41301,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (LT (FlagGT) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41427,11 +41312,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDLT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (LT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41462,11 +41343,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDLE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (LE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41497,11 +41374,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDGT (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (GT cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41532,11 +41405,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDGE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (GE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41567,11 +41436,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDEQ (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (EQ cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41602,11 +41467,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDNE (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41637,11 +41498,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDGTnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (GTF cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41672,11 +41529,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (CMPWconst [0] (MOVDGEnoinv (MOVDconst [0]) (MOVDconst [1]) cmp)) yes no) // cond: // result: (GEF cmp yes no) - for { - v := b.Control - if v.Op != OpS390XCMPWconst { - break - } + for v.Op == OpS390XCMPWconst { if v.AuxInt != 0 { break } @@ -41707,11 +41560,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (InvertFlags cmp) yes no) // cond: // result: (NE cmp yes no) - for { - v := b.Control - if v.Op != OpS390XInvertFlags { - break - } + for v.Op == OpS390XInvertFlags { cmp := v.Args[0] b.Kind = BlockS390XNE b.SetControl(cmp) @@ -41721,11 +41570,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (FlagEQ) yes no) // cond: // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpS390XFlagEQ { - break - } + for v.Op == OpS390XFlagEQ { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41735,11 +41580,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (FlagLT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagLT { - break - } + for v.Op == OpS390XFlagLT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil @@ -41748,11 +41589,7 @@ func rewriteBlockS390X(b *Block) bool { // match: (NE (FlagGT) yes no) // cond: // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpS390XFlagGT { - break - } + for v.Op == OpS390XFlagGT { b.Kind = BlockFirst b.SetControl(nil) b.Aux = nil diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index c5fc8c815f..7796548ee4 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -6382,11 +6382,10 @@ func rewriteValueWasm_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockWasm(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewritedec.go b/src/cmd/compile/internal/ssa/rewritedec.go index b61886c989..fe135821eb 100644 --- a/src/cmd/compile/internal/ssa/rewritedec.go +++ b/src/cmd/compile/internal/ssa/rewritedec.go @@ -493,11 +493,10 @@ func rewriteValuedec_OpStringPtr_0(v *Value) bool { } func rewriteBlockdec(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewritedec64.go b/src/cmd/compile/internal/ssa/rewritedec64.go index 5a143a92a7..a67ae1ed52 100644 --- a/src/cmd/compile/internal/ssa/rewritedec64.go +++ b/src/cmd/compile/internal/ssa/rewritedec64.go @@ -2727,11 +2727,10 @@ func rewriteValuedec64_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockdec64(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewritedecArgs.go b/src/cmd/compile/internal/ssa/rewritedecArgs.go index 633c0fa8b5..6b811297b3 100644 --- a/src/cmd/compile/internal/ssa/rewritedecArgs.go +++ b/src/cmd/compile/internal/ssa/rewritedecArgs.go @@ -271,11 +271,10 @@ func rewriteValuedecArgs_OpArg_10(v *Value) bool { } func rewriteBlockdecArgs(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { } return false diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 543664c8bc..7bb446cf35 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -32620,21 +32620,16 @@ func rewriteValuegeneric_OpZeroExt8to64_0(v *Value) bool { } func rewriteBlockgeneric(b *Block) bool { config := b.Func.Config - _ = config - fe := b.Func.fe - _ = fe typ := &config.Types _ = typ + v := b.Control + _ = v switch b.Kind { case BlockIf: // match: (If (Not cond) yes no) // cond: // result: (If cond no yes) - for { - v := b.Control - if v.Op != OpNot { - break - } + for v.Op == OpNot { cond := v.Args[0] b.Kind = BlockIf b.SetControl(cond) @@ -32645,11 +32640,7 @@ func rewriteBlockgeneric(b *Block) bool { // match: (If (ConstBool [c]) yes no) // cond: c == 1 // result: (First nil yes no) - for { - v := b.Control - if v.Op != OpConstBool { - break - } + for v.Op == OpConstBool { c := v.AuxInt if !(c == 1) { break @@ -32662,11 +32653,7 @@ func rewriteBlockgeneric(b *Block) bool { // match: (If (ConstBool [c]) yes no) // cond: c == 0 // result: (First nil no yes) - for { - v := b.Control - if v.Op != OpConstBool { - break - } + for v.Op == OpConstBool { c := v.AuxInt if !(c == 0) { break -- GitLab From d923309a17d1b7eeacc75798cdca905d5b143681 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 21 Mar 2019 09:20:11 -0400 Subject: [PATCH 0564/1679] cmd/link: add optional sanity checking for duplicate symbols Introduce a new linker command line option "-strictdups", which enables sanity checking of "ok to duplicate" symbols, especially DWARF info symbols. Acceptable values are 0 (no checking) 1 (issue warnings) and 2 (issue a fatal error checks fail). Currently if we read a DWARF symbol (such as "go.info.PKG.FUNCTION") from one object file, and then encounter the same symbol later on while reading another object file, we simply discard the second one and move on with the link, since the two should in theory be identical. If as a result of a compiler bug we wind up with symbols that are not identical, this tends to (silently) result in incorrect DWARF generation, which may or may not be discovered depending on who is consuming the DWARF and what's being done with it. When this option is turned on, at the point where a duplicate symbol is detected in the object file reader, we check to make sure that the length/contents of the symbol are the same as the previously read symbol, and print a descriptive warning (or error) if not. For the time being this can be used for one-off testing to find problems; at some point it would be nice if we can enable it by default. Updates #30908. Change-Id: I64c4e07c326b4572db674ff17c93307e2eec607c Reviewed-on: https://go-review.googlesource.com/c/go/+/168410 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/link/internal/ld/lib.go | 13 ++++++- src/cmd/link/internal/ld/main.go | 1 + src/cmd/link/internal/objfile/objfile.go | 44 +++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index f2a9921c8e..1d44c0eb18 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1725,7 +1725,18 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, ldpkg(ctxt, f, lib, import1-import0-2, pn) // -2 for !\n f.Seek(import1, 0) - objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn) + flags := 0 + switch *FlagStrictDups { + case 0: + break + case 1: + flags = objfile.StrictDupsWarnFlag + case 2: + flags = objfile.StrictDupsErrFlag + default: + log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) + } + objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn, flags) addImports(ctxt, lib, pn) return nil } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index e1d2da3f30..e5859868b7 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -85,6 +85,7 @@ var ( Flag8 bool // use 64-bit addresses in symbol table flagInterpreter = flag.String("I", "", "use `linker` as ELF dynamic linker") FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") + FlagStrictDups = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).") FlagRound = flag.Int("R", -1, "set address rounding `quantum`") FlagTextAddr = flag.Int64("T", -1, "set text segment `address`") diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index b39e052106..9b76f2801d 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -17,8 +17,10 @@ import ( "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/sym" + "fmt" "io" "log" + "os" "strconv" "strings" ) @@ -39,6 +41,7 @@ type objReader struct { pn string dupSym *sym.Symbol localSymVersion int + flags int // rdBuf is used by readString and readSymName as scratch for reading strings. rdBuf []byte @@ -54,9 +57,22 @@ type objReader struct { file []*sym.Symbol } +// Flags to enable optional behavior during object loading/reading. + +const ( + NoFlag int = iota + + // Sanity-check duplicate symbol contents, issuing warning + // when duplicates have different lengths or contents. + StrictDupsWarnFlag + + // Similar to StrictDupsWarnFlag, but issue fatal error. + StrictDupsErrFlag +) + // Load loads an object file f into library lib. // The symbols loaded are added to syms. -func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string) { +func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string, flags int) { start := f.Offset() r := &objReader{ rd: f.Reader, @@ -66,6 +82,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, le pn: pn, dupSym: &sym.Symbol{Name: ".dup"}, localSymVersion: syms.IncVersion(), + flags: flags, } r.loadObjFile() if f.Offset() != start+length { @@ -340,6 +357,31 @@ overwrite: if s.Type == sym.SDWARFINFO { r.patchDWARFName(s) } + + if isdup && r.flags&(StrictDupsWarnFlag|StrictDupsErrFlag) != 0 { + // Compare the just-read symbol with the previously read + // symbol of the same name, verifying that they have the same + // payload. If not, issue a warning and possibly an error. + if !bytes.Equal(s.P, dup.P) { + reason := "same length but different contents" + if len(s.P) != len(dup.P) { + reason = fmt.Sprintf("new length %d != old length %d", + len(data), len(dup.P)) + } + fmt.Fprintf(os.Stderr, "cmd/link: while reading object for '%v': duplicate symbol '%s', previous def at '%v', with mismatched payload: %s\n", r.lib, dup, dup.Lib, reason) + + // For the moment, whitelist DWARF subprogram DIEs for + // auto-generated wrapper functions. What seems to happen + // here is that we get different line numbers on formal + // params; I am guessing that the pos is being inherited + // from the spot where the wrapper is needed. + whitelist := strings.HasPrefix(dup.Name, "go.info.go.interface") + + if r.flags&StrictDupsErrFlag != 0 && !whitelist { + log.Fatalf("failed duplicate symbol check on '%s' reading %s", dup.Name, r.pn) + } + } + } } func (r *objReader) patchDWARFName(s *sym.Symbol) { -- GitLab From 1e83369ca002218389e81235ed96d2bb509bb779 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Wed, 20 Mar 2019 18:16:33 +0000 Subject: [PATCH 0565/1679] Revert "cmd/go: fix the default build output name for versioned binaries" This reverts CL 140863 (commit bf94fc3ae387fc09929443393741919fac6727af). Reason for revert: There was a potential problem spotted in the original fix, which resulted in it being rolled back from release-branch.go1.12 and not included in Go 1.12.1 release. We intend to improve the fix and include it in Go 1.12.2 instead. To make the fix easier to backport, revert this change before re-applying the improved fix (next commit). Change-Id: If6c785f58482d2531b5927c5ea7002f548c21c7c Reviewed-on: https://go-review.googlesource.com/c/go/+/168402 Reviewed-by: Hyang-Ah Hana Kim --- src/cmd/go/internal/load/pkg.go | 71 +++++++++---------- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/build.go | 6 +- .../testdata/mod/rsc.io_fortune_v2_v2.0.0.txt | 6 -- .../testdata/script/mod_build_versioned.txt | 16 ----- 5 files changed, 37 insertions(+), 64 deletions(-) delete mode 100644 src/cmd/go/testdata/script/mod_build_versioned.txt diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 9da01a0372..a0333bd522 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1186,44 +1186,6 @@ var cgoSyscallExclude = map[string]bool{ var foldPath = make(map[string]string) -// DefaultExecName returns the default executable name of the given -// package. -func DefaultExecName(p *Package) string { - _, elem := filepath.Split(p.ImportPath) - if cfg.ModulesEnabled { - // NOTE(rsc): Using p.ImportPath instead of p.Dir - // makes sure we install a package in the root of a - // cached module directory as that package name - // not name@v1.2.3. - // Using p.ImportPath instead of p.Dir - // is probably correct all the time, - // even for non-module-enabled code, - // but I'm not brave enough to change the - // non-module behavior this late in the - // release cycle. Maybe for Go 1.12. - // See golang.org/issue/26869. - _, elem = pathpkg.Split(p.ImportPath) - - // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. - // See golang.org/issue/24667. - isVersion := func(v string) bool { - if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { - return false - } - for i := 2; i < len(v); i++ { - if c := v[i]; c < '0' || '9' < c { - return false - } - } - return true - } - if isVersion(elem) { - _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) - } - } - return elem -} - // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { @@ -1264,7 +1226,38 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { p.Error = &PackageError{Err: e} return } - elem := DefaultExecName(p) + _, elem := filepath.Split(p.Dir) + if cfg.ModulesEnabled { + // NOTE(rsc): Using p.ImportPath instead of p.Dir + // makes sure we install a package in the root of a + // cached module directory as that package name + // not name@v1.2.3. + // Using p.ImportPath instead of p.Dir + // is probably correct all the time, + // even for non-module-enabled code, + // but I'm not brave enough to change the + // non-module behavior this late in the + // release cycle. Maybe for Go 1.12. + // See golang.org/issue/26869. + _, elem = pathpkg.Split(p.ImportPath) + + // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. + // See golang.org/issue/24667. + isVersion := func(v string) bool { + if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { + return false + } + for i := 2; i < len(v); i++ { + if c := v[i]; c < '0' || '9' < c { + return false + } + } + return true + } + if isVersion(elem) { + _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) + } + } full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH { // Install cross-compiled binaries to subdirectories of bin. diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index aaca8fcf68..fe90af3be5 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -811,7 +811,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin if p.ImportPath == "command-line-arguments" { elem = p.Name } else { - elem = load.DefaultExecName(p) + _, elem = path.Split(p.ImportPath) } testBinary := elem + ".test" diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 82ac7d692f..21abd5ef5b 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -10,6 +10,7 @@ import ( "go/build" "os" "os/exec" + "path" "path/filepath" "runtime" "strings" @@ -284,7 +285,7 @@ func runBuild(cmd *base.Command, args []string) { pkgs := load.PackagesForBuild(args) if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" { - cfg.BuildO = load.DefaultExecName(pkgs[0]) + _, cfg.BuildO = path.Split(pkgs[0].ImportPath) cfg.BuildO += cfg.ExeSuffix } @@ -325,7 +326,8 @@ func runBuild(cmd *base.Command, args []string) { if p.Name != "main" { continue } - p.Target = filepath.Join(cfg.BuildO, load.DefaultExecName(p)) + _, elem := path.Split(p.ImportPath) + p.Target = filepath.Join(cfg.BuildO, elem) p.Target += cfg.ExeSuffix p.Stale = true p.StaleReason = "build -o flag in use" diff --git a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt index 3acd637931..cfa91f08a5 100644 --- a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt +++ b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt @@ -13,9 +13,3 @@ import "rsc.io/quote" func main() { println(quote.Hello()) } --- fortune_test.go -- -package main - -import "testing" - -func TestFortuneV2(t *testing.T) {} diff --git a/src/cmd/go/testdata/script/mod_build_versioned.txt b/src/cmd/go/testdata/script/mod_build_versioned.txt deleted file mode 100644 index eb081c9be1..0000000000 --- a/src/cmd/go/testdata/script/mod_build_versioned.txt +++ /dev/null @@ -1,16 +0,0 @@ -env GO111MODULE=on - -go get -m rsc.io/fortune/v2 - -# The default executable name shouldn't be v2$exe -go build rsc.io/fortune/v2 -! exists v2$exe -exists fortune$exe - -# The default test binary name shouldn't be v2.test$exe -go test -c rsc.io/fortune/v2 -! exists v2.test$exe -exists fortune.test$exe - --- go.mod -- -module scratch -- GitLab From 94563de87fad642677ffc62a4a82766597e39123 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Thu, 21 Mar 2019 13:31:32 -0400 Subject: [PATCH 0566/1679] cmd/go: fix the default build output name for versioned binaries This change is a re-apply of the reverted CL 140863 with changes to address issue #30821. Specifically, path.Split continues to be used to split the '/'-separated import path, rather than filepath.Split. Document the algorithm for how the default executable name is determined in DefaultExecName. Rename a variable returned from os.Stat from bs to fi for consistency. CL 140863 factored out the logic to determine the default executable name from the Package.load method into a DefaultExecName function, and started using it in more places to avoid having to re-implement the logic everywhere it's needed. Most previous callers already computed the default executable name based on the import path. The load.Package method, before CL 140863, was the exception, in that it used the p.Dir value in GOPATH mode instead. There was a NOTE(rsc) comment that it should be equivalent to use import path, but it was too late in Go 1.11 cycle to risk implementing that change. This is part 1, a more conservative change for backporting to Go 1.12.2, and it keeps the original behavior of splitting on p.Dir in GOPATH mode. Part 2 will address the NOTE(rsc) comment and modify behavior in Package.load to always use DefaultExecName which splits the import path rather than directory. It is intended to be included in Go 1.13. Fixes #27283 (again) Updates #26869 Fixes #30821 Change-Id: Ib1ebb95acba7c85c24e3a55c40cdf48405af34f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/167503 Reviewed-by: Jay Conrod Reviewed-by: Hyang-Ah Hana Kim --- src/cmd/go/internal/load/pkg.go | 53 ++++++++++++------- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/build.go | 10 ++-- .../testdata/mod/rsc.io_fortune_v2_v2.0.0.txt | 6 +++ .../testdata/script/mod_build_versioned.txt | 16 ++++++ 5 files changed, 60 insertions(+), 27 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_build_versioned.txt diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index a0333bd522..431dfe318e 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1186,6 +1186,36 @@ var cgoSyscallExclude = map[string]bool{ var foldPath = make(map[string]string) +// DefaultExecName returns the default executable name +// for a package with the import path importPath. +// +// The default executable name is the last element of the import path. +// In module-aware mode, an additional rule is used. If the last element +// is a vN path element specifying the major version, then the second last +// element of the import path is used instead. +func DefaultExecName(importPath string) string { + _, elem := pathpkg.Split(importPath) + if cfg.ModulesEnabled { + // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. + // See golang.org/issue/24667. + isVersion := func(v string) bool { + if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { + return false + } + for i := 2; i < len(v); i++ { + if c := v[i]; c < '0' || '9' < c { + return false + } + } + return true + } + if isVersion(elem) { + _, elem = pathpkg.Split(pathpkg.Dir(importPath)) + } + } + return elem +} + // load populates p using information from bp, err, which should // be the result of calling build.Context.Import. func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { @@ -1228,7 +1258,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { } _, elem := filepath.Split(p.Dir) if cfg.ModulesEnabled { - // NOTE(rsc): Using p.ImportPath instead of p.Dir + // NOTE(rsc,dmitshur): Using p.ImportPath instead of p.Dir // makes sure we install a package in the root of a // cached module directory as that package name // not name@v1.2.3. @@ -1237,26 +1267,9 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { // even for non-module-enabled code, // but I'm not brave enough to change the // non-module behavior this late in the - // release cycle. Maybe for Go 1.12. + // release cycle. Can be done for Go 1.13. // See golang.org/issue/26869. - _, elem = pathpkg.Split(p.ImportPath) - - // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. - // See golang.org/issue/24667. - isVersion := func(v string) bool { - if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { - return false - } - for i := 2; i < len(v); i++ { - if c := v[i]; c < '0' || '9' < c { - return false - } - } - return true - } - if isVersion(elem) { - _, elem = pathpkg.Split(pathpkg.Dir(p.ImportPath)) - } + elem = DefaultExecName(p.ImportPath) } full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH { diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index fe90af3be5..b43925d5e5 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -811,7 +811,7 @@ func builderTest(b *work.Builder, p *load.Package) (buildAction, runAction, prin if p.ImportPath == "command-line-arguments" { elem = p.Name } else { - _, elem = path.Split(p.ImportPath) + elem = load.DefaultExecName(p.ImportPath) } testBinary := elem + ".test" diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 21abd5ef5b..eac027e09e 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -10,7 +10,6 @@ import ( "go/build" "os" "os/exec" - "path" "path/filepath" "runtime" "strings" @@ -285,7 +284,7 @@ func runBuild(cmd *base.Command, args []string) { pkgs := load.PackagesForBuild(args) if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" { - _, cfg.BuildO = path.Split(pkgs[0].ImportPath) + cfg.BuildO = load.DefaultExecName(pkgs[0].ImportPath) cfg.BuildO += cfg.ExeSuffix } @@ -320,14 +319,13 @@ func runBuild(cmd *base.Command, args []string) { // If the -o name exists and is a directory, then // write all main packages to that directory. // Otherwise require only a single package be built. - if bs, err := os.Stat(cfg.BuildO); err == nil && bs.IsDir() { + if fi, err := os.Stat(cfg.BuildO); err == nil && fi.IsDir() { a := &Action{Mode: "go build"} for _, p := range pkgs { if p.Name != "main" { continue } - _, elem := path.Split(p.ImportPath) - p.Target = filepath.Join(cfg.BuildO, elem) + p.Target = filepath.Join(cfg.BuildO, load.DefaultExecName(p.ImportPath)) p.Target += cfg.ExeSuffix p.Stale = true p.StaleReason = "build -o flag in use" @@ -540,7 +538,7 @@ func InstallPackages(patterns []string, pkgs []*load.Package) { if len(patterns) == 0 && len(pkgs) == 1 && pkgs[0].Name == "main" { // Compute file 'go build' would have created. // If it exists and is an executable file, remove it. - _, targ := filepath.Split(pkgs[0].ImportPath) + targ := load.DefaultExecName(pkgs[0].ImportPath) targ += cfg.ExeSuffix if filepath.Join(pkgs[0].Dir, targ) != pkgs[0].Target { // maybe $GOBIN is the current directory fi, err := os.Stat(targ) diff --git a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt index cfa91f08a5..3acd637931 100644 --- a/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt +++ b/src/cmd/go/testdata/mod/rsc.io_fortune_v2_v2.0.0.txt @@ -13,3 +13,9 @@ import "rsc.io/quote" func main() { println(quote.Hello()) } +-- fortune_test.go -- +package main + +import "testing" + +func TestFortuneV2(t *testing.T) {} diff --git a/src/cmd/go/testdata/script/mod_build_versioned.txt b/src/cmd/go/testdata/script/mod_build_versioned.txt new file mode 100644 index 0000000000..eb081c9be1 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_build_versioned.txt @@ -0,0 +1,16 @@ +env GO111MODULE=on + +go get -m rsc.io/fortune/v2 + +# The default executable name shouldn't be v2$exe +go build rsc.io/fortune/v2 +! exists v2$exe +exists fortune$exe + +# The default test binary name shouldn't be v2.test$exe +go test -c rsc.io/fortune/v2 +! exists v2.test$exe +exists fortune.test$exe + +-- go.mod -- +module scratch -- GitLab From 1257d05088c3842efa2aa23f8d6abe000e494f1a Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 22 Mar 2019 14:18:22 -0400 Subject: [PATCH 0567/1679] testing: fix fractional ns/op printing CL 166717 changed the way ns/op benchmark results were printed and inadvertently rounded all ns/op results down to an integer, even if they were small enough to print with digits after the decimal place. For example, prior to this change, we got output like BenchmarkFast-8 380491575 3.12 ns/op CL 166717 changed this to BenchmarkFast-8 380491575 3.00 ns/op This had the further side-effect that ns/op values between 0 and 1 would not be printed at all because they would be rounded down to 0. This CL fixes this by always recomputing the float64 value of ns/op instead of using the int64 truncation from BenchmarkResult.NsPerOp. Fixes #30997. Fixes #31005. Change-Id: I21f73b9d5cc5ad41e7ff535675d07ca00051ecd7 Reviewed-on: https://go-review.googlesource.com/c/go/+/168937 Reviewed-by: Josh Bleecher Snyder --- src/testing/benchmark.go | 9 +++++++-- src/testing/benchmark_test.go | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 407e371c66..6dcfcb02c7 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -406,9 +406,14 @@ func (r BenchmarkResult) String() string { buf := new(strings.Builder) fmt.Fprintf(buf, "%8d", r.N) - if ns := r.NsPerOp(); ns != 0 { + // Get ns/op as a float. + ns, ok := r.Extra["ns/op"] + if !ok { + ns = float64(r.T.Nanoseconds()) / float64(r.N) + } + if ns != 0 { buf.WriteByte('\t') - prettyPrint(buf, float64(ns), "ns/op") + prettyPrint(buf, ns, "ns/op") } if mbs := r.mbPerSec(); mbs != 0 { diff --git a/src/testing/benchmark_test.go b/src/testing/benchmark_test.go index 7d28fb632a..a872d6798b 100644 --- a/src/testing/benchmark_test.go +++ b/src/testing/benchmark_test.go @@ -12,6 +12,7 @@ import ( "sync/atomic" "testing" "text/template" + "time" ) var prettyPrintTests = []struct { @@ -40,6 +41,32 @@ func TestPrettyPrint(t *testing.T) { } } +func TestResultString(t *testing.T) { + // Test fractional ns/op handling + r := testing.BenchmarkResult{ + N: 100, + T: 240 * time.Nanosecond, + } + if r.NsPerOp() != 2 { + t.Errorf("NsPerOp: expected 2, actual %v", r.NsPerOp()) + } + if want, got := " 100\t 2.40 ns/op", r.String(); want != got { + t.Errorf("String: expected %q, actual %q", want, got) + } + + // Test sub-1 ns/op (issue #31005) + r.T = 40 * time.Nanosecond + if want, got := " 100\t 0.400 ns/op", r.String(); want != got { + t.Errorf("String: expected %q, actual %q", want, got) + } + + // Test 0 ns/op + r.T = 0 + if want, got := " 100", r.String(); want != got { + t.Errorf("String: expected %q, actual %q", want, got) + } +} + func TestRunParallel(t *testing.T) { testing.Benchmark(func(b *testing.B) { procs := uint32(0) -- GitLab From a189467cdae5421c863cf940778d681ecb1d3d2f Mon Sep 17 00:00:00 2001 From: Ben Shi Date: Fri, 15 Mar 2019 08:26:53 +0000 Subject: [PATCH 0568/1679] cmd/internal/obj/mips: add MADD/MSUB This CL implements MADD&MSUB, which are mips32r2 instructions. Change-Id: I06fe51573569baf3b71536336b34b95ccd24750b Reviewed-on: https://go-review.googlesource.com/c/go/+/167680 Run-TryBot: Ben Shi Reviewed-by: Cherry Zhang --- src/cmd/asm/internal/arch/mips.go | 3 ++- src/cmd/asm/internal/asm/testdata/mips.s | 8 ++++++++ src/cmd/internal/obj/mips/a.out.go | 2 ++ src/cmd/internal/obj/mips/anames.go | 2 ++ src/cmd/internal/obj/mips/asm0.go | 6 ++++++ 5 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/cmd/asm/internal/arch/mips.go b/src/cmd/asm/internal/arch/mips.go index 14b29331e5..22c9ebd2da 100644 --- a/src/cmd/asm/internal/arch/mips.go +++ b/src/cmd/asm/internal/arch/mips.go @@ -38,7 +38,8 @@ func IsMIPSMUL(op obj.As) bool { switch op { case mips.AMUL, mips.AMULU, mips.AMULV, mips.AMULVU, mips.ADIV, mips.ADIVU, mips.ADIVV, mips.ADIVVU, - mips.AREM, mips.AREMU, mips.AREMV, mips.AREMVU: + mips.AREM, mips.AREMU, mips.AREMV, mips.AREMVU, + mips.AMADD, mips.AMSUB: return true } return false diff --git a/src/cmd/asm/internal/asm/testdata/mips.s b/src/cmd/asm/internal/asm/testdata/mips.s index 0c6f7fd552..7136d686d7 100644 --- a/src/cmd/asm/internal/asm/testdata/mips.s +++ b/src/cmd/asm/internal/asm/testdata/mips.s @@ -424,7 +424,15 @@ label4: CALL foo(SB) RET foo(SB) + // unary operation NEGW R1, R2 // 00011023 + CLZ R1, R2 // 70221020 + CLO R1, R2 // 70221021 + + // to (Hi, Lo) + MADD R2, R1 // 70220000 + MSUB R2, R1 // 70220004 + MUL R2, R1 // 00220018 // END // diff --git a/src/cmd/internal/obj/mips/a.out.go b/src/cmd/internal/obj/mips/a.out.go index d2ae2f8c0b..026e8db76a 100644 --- a/src/cmd/internal/obj/mips/a.out.go +++ b/src/cmd/internal/obj/mips/a.out.go @@ -319,6 +319,7 @@ const ( ALL ALLV ALUI + AMADD AMOVB AMOVBU AMOVD @@ -334,6 +335,7 @@ const ( AMOVWF AMOVWL AMOVWR + AMSUB AMUL AMULD AMULF diff --git a/src/cmd/internal/obj/mips/anames.go b/src/cmd/internal/obj/mips/anames.go index d588d131bc..9a2e4f5703 100644 --- a/src/cmd/internal/obj/mips/anames.go +++ b/src/cmd/internal/obj/mips/anames.go @@ -46,6 +46,7 @@ var Anames = []string{ "LL", "LLV", "LUI", + "MADD", "MOVB", "MOVBU", "MOVD", @@ -61,6 +62,7 @@ var Anames = []string{ "MOVWF", "MOVWL", "MOVWR", + "MSUB", "MUL", "MULD", "MULF", diff --git a/src/cmd/internal/obj/mips/asm0.go b/src/cmd/internal/obj/mips/asm0.go index c117269c35..c08d97a9aa 100644 --- a/src/cmd/internal/obj/mips/asm0.go +++ b/src/cmd/internal/obj/mips/asm0.go @@ -959,6 +959,8 @@ func buildop(ctxt *obj.Link) { opset(ADIVU, r0) opset(AMULU, r0) opset(ADIV, r0) + opset(AMADD, r0) + opset(AMSUB, r0) case AMULV: opset(ADIVV, r0) @@ -1785,6 +1787,10 @@ func (c *ctxt0) oprrr(a obj.As) uint32 { return SP(3, 4) | OP(4, 1) case ACLZ: return SP(3, 4) | OP(4, 0) + case AMADD: + return SP(3, 4) | OP(0, 0) + case AMSUB: + return SP(3, 4) | OP(0, 4) } if a < 0 { -- GitLab From 2396101e0590cb7d77556924249c26af0ccd9eff Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sun, 17 Mar 2019 13:45:46 +0100 Subject: [PATCH 0569/1679] src/cmd/internal/obj/wasm: optimize blocks in wasm binary This change optimizes the blocks in the wasm binary by generating the entryPointLoop only if it is used and adding an unwindExit block to be able to use the short BrIf instruction for unwinding the stack. These changes were suggested by the wasm-opt tool and reduce the wasm binary size of "hello world" by 1.5%. Change-Id: Ie52db2fa2d9b8482f9a78b7c189231750811fe97 Reviewed-on: https://go-review.googlesource.com/c/go/+/167937 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/wasm/wasmobj.go | 114 +++++++++++++++++---------- 1 file changed, 71 insertions(+), 43 deletions(-) diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go index 4a499b4f91..ad98cfe90a 100644 --- a/src/cmd/internal/obj/wasm/wasmobj.go +++ b/src/cmd/internal/obj/wasm/wasmobj.go @@ -341,47 +341,20 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { p = appendp(p, AEnd) } - // Add Block instructions for resume points and BrTable to jump to selected resume point. - if numResumePoints > 0 { - p := s.Func.Text - p = appendp(p, ALoop) // entryPointLoop, used to jump between basic blocks - - for i := 0; i < numResumePoints+1; i++ { - p = appendp(p, ABlock) - } - p = appendp(p, AGet, regAddr(REG_PC_B)) // read next basic block from PC_B - p = appendp(p, ABrTable, obj.Addr{Val: tableIdxs}) - p = appendp(p, AEnd) // end of Block - - for p.Link != nil { - p = p.Link - } - - p = appendp(p, AEnd) // end of entryPointLoop - p = appendp(p, obj.AUNDEF) - } - - p := s.Func.Text + // record the branches targeting the entry loop and the unwind exit, + // their targets with be filled in later + var entryPointLoopBranches []*obj.Prog + var unwindExitBranches []*obj.Prog currentDepth := 0 - blockDepths := make(map[*obj.Prog]int) - for p != nil { + for p := s.Func.Text; p != nil; p = p.Link { switch p.As { case ABlock, ALoop, AIf: currentDepth++ - blockDepths[p] = currentDepth case AEnd: currentDepth-- } switch p.As { - case ABr, ABrIf: - if p.To.Type == obj.TYPE_BRANCH { - blockDepth, ok := blockDepths[p.To.Val.(*obj.Prog)] - if !ok { - panic("label not at block") - } - p.To = constAddr(int64(currentDepth - blockDepth)) - } case obj.AJMP: jmp := *p p.As = obj.ANOP @@ -389,8 +362,9 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { if jmp.To.Type == obj.TYPE_BRANCH { // jump to basic block p = appendp(p, AI32Const, constAddr(jmp.To.Val.(*obj.Prog).Pc)) - p = appendp(p, ASet, regAddr(REG_PC_B)) // write next basic block to PC_B - p = appendp(p, ABr, constAddr(int64(currentDepth-1))) // jump to beginning of entryPointLoop + p = appendp(p, ASet, regAddr(REG_PC_B)) // write next basic block to PC_B + p = appendp(p, ABr) // jump to beginning of entryPointLoop + entryPointLoopBranches = append(entryPointLoopBranches, p) break } @@ -478,16 +452,16 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } // return value of call is on the top of the stack, indicating whether to unwind the WebAssembly stack - p = appendp(p, AIf) if call.As == ACALLNORESUME && call.To.Sym != sigpanic { // sigpanic unwinds the stack, but it never resumes // trying to unwind WebAssembly stack but call has no resume point, terminate with error + p = appendp(p, AIf) p = appendp(p, obj.AUNDEF) + p = appendp(p, AEnd) } else { // unwinding WebAssembly stack to switch goroutine, return 1 - p = appendp(p, AI32Const, constAddr(1)) - p = appendp(p, AReturn) + p = appendp(p, ABrIf) + unwindExitBranches = append(unwindExitBranches, p) } - p = appendp(p, AEnd) // jump to before the call if jmpdefer has reset the return address to the call's PC if call.To.Sym == deferreturn { @@ -550,12 +524,9 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { p = appendp(p, AI32Const, constAddr(0)) p = appendp(p, AReturn) } - - p = p.Link } - p = s.Func.Text - for p != nil { + for p := s.Func.Text; p != nil; p = p.Link { switch p.From.Name { case obj.NAME_AUTO: p.From.Offset += int64(framesize) @@ -702,8 +673,65 @@ func preprocess(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { p = appendp(p, ACall, obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: s}) p.Mark = WasmImport } + } + + { + p := s.Func.Text + if len(unwindExitBranches) > 0 { + p = appendp(p, ABlock) // unwindExit, used to return 1 when unwinding the stack + for _, b := range unwindExitBranches { + b.To = obj.Addr{Type: obj.TYPE_BRANCH, Val: p} + } + } + if len(entryPointLoopBranches) > 0 { + p = appendp(p, ALoop) // entryPointLoop, used to jump between basic blocks + for _, b := range entryPointLoopBranches { + b.To = obj.Addr{Type: obj.TYPE_BRANCH, Val: p} + } + } + if numResumePoints > 0 { + // Add Block instructions for resume points and BrTable to jump to selected resume point. + for i := 0; i < numResumePoints+1; i++ { + p = appendp(p, ABlock) + } + p = appendp(p, AGet, regAddr(REG_PC_B)) // read next basic block from PC_B + p = appendp(p, ABrTable, obj.Addr{Val: tableIdxs}) + p = appendp(p, AEnd) // end of Block + } + for p.Link != nil { + p = p.Link // function instructions + } + if len(entryPointLoopBranches) > 0 { + p = appendp(p, AEnd) // end of entryPointLoop + } + p = appendp(p, obj.AUNDEF) + if len(unwindExitBranches) > 0 { + p = appendp(p, AEnd) // end of unwindExit + p = appendp(p, AI32Const, constAddr(1)) + } + } + + currentDepth = 0 + blockDepths := make(map[*obj.Prog]int) + for p := s.Func.Text; p != nil; p = p.Link { + switch p.As { + case ABlock, ALoop, AIf: + currentDepth++ + blockDepths[p] = currentDepth + case AEnd: + currentDepth-- + } - p = p.Link + switch p.As { + case ABr, ABrIf: + if p.To.Type == obj.TYPE_BRANCH { + blockDepth, ok := blockDepths[p.To.Val.(*obj.Prog)] + if !ok { + panic("label not at block") + } + p.To = constAddr(int64(currentDepth - blockDepth)) + } + } } } -- GitLab From b434bbf197b3683643d4d6b52bca687982e336b5 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sat, 23 Mar 2019 14:18:19 +0100 Subject: [PATCH 0570/1679] cmd/go: add GOWASM environment variable This change adds the environment variable GOWASM, which is a comma separated list of experimental WebAssembly features that the compiled WebAssembly binary is allowed to use. The default is to use no experimental features. Initially there are no features avaiable. More information about feature proposals can be found at https://github.com/WebAssembly/proposals Change-Id: I4c8dc534c99ecff8bb075dded0186ca8f8decaef Reviewed-on: https://go-review.googlesource.com/c/go/+/168881 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- doc/install-source.html | 11 +++++++++++ src/cmd/go/internal/cfg/cfg.go | 1 + src/cmd/go/internal/envcmd/env.go | 2 ++ src/cmd/internal/objabi/util.go | 24 ++++++++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/doc/install-source.html b/doc/install-source.html index c11151be64..46dc618a9c 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -638,6 +638,17 @@ for which the compiler will target. The default is power8. + +
  • $GOWASM (for wasm only) +

    + This variable is a comma separated list of experimental WebAssembly features that the compiled WebAssembly binary is allowed to use. + The default is to use no experimental features. +

    +
      +
    • (no features yet)
    • +
    +
  • +

    diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 80a154b066..35f7f1a173 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -105,6 +105,7 @@ var ( GOMIPS = objabi.GOMIPS GOMIPS64 = objabi.GOMIPS64 GOPPC64 = fmt.Sprintf("%s%d", "power", objabi.GOPPC64) + GOWASM = objabi.GOWASM ) // Update build context to use our computed GOROOT. diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index 08291dfb14..645f83246a 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -83,6 +83,8 @@ func MkEnv() []cfg.EnvVar { env = append(env, cfg.EnvVar{Name: "GOMIPS64", Value: cfg.GOMIPS64}) case "ppc64", "ppc64le": env = append(env, cfg.EnvVar{Name: "GOPPC64", Value: cfg.GOPPC64}) + case "wasm": + env = append(env, cfg.EnvVar{Name: "GOWASM", Value: cfg.GOWASM.String()}) } cc := cfg.DefaultCC(cfg.Goos, cfg.Goarch) diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index 665c8b3be6..c007f6c475 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -29,6 +29,7 @@ var ( GOMIPS = gomips() GOMIPS64 = gomips64() GOPPC64 = goppc64() + GOWASM = gowasm() GO_LDSO = defaultGO_LDSO Version = version ) @@ -76,6 +77,29 @@ func goppc64() int { panic("unreachable") } +type gowasmFeatures struct { + // no features yet +} + +func (f *gowasmFeatures) String() string { + var flags []string + // no features yet + return strings.Join(flags, ",") +} + +func gowasm() (f gowasmFeatures) { + for _, opt := range strings.Split(envOr("GOWASM", ""), ",") { + switch opt { + // no features yet + case "": + // ignore + default: + log.Fatalf("Invalid GOWASM value. No such feature: " + opt) + } + } + return +} + func Getgoextlinkenabled() string { return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) } -- GitLab From e770b5b3aa9a2b6a7dcdc95cacd7ad3940ad34c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Wed, 20 Mar 2019 15:47:56 +0000 Subject: [PATCH 0571/1679] text/template: allow using -}} with many spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lexSpace consumed all spaces, even if the last one was part of a right delimiter like " -}}". Thus, "3 -}}" wouldn't lex as "3" and a right delimiter, but as "3", "-", and "}}". To fix that, make lexSpace stop if it encounters a right delimiter. Fixes #30948. Change-Id: I80a5546e5809e54f6823e2bf3a57a7e8808329be Reviewed-on: https://go-review.googlesource.com/c/go/+/168457 Reviewed-by: Daniel Martí --- src/text/template/parse/lex.go | 69 +++++++++++++++++---------- src/text/template/parse/parse_test.go | 1 + 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/text/template/parse/lex.go b/src/text/template/parse/lex.go index 92b97f423f..3d57708796 100644 --- a/src/text/template/parse/lex.go +++ b/src/text/template/parse/lex.go @@ -107,17 +107,18 @@ type stateFn func(*lexer) stateFn // lexer holds the state of the scanner. type lexer struct { - name string // the name of the input; used only for error reports - input string // the string being scanned - leftDelim string // start of action - rightDelim string // end of action - pos Pos // current position in the input - start Pos // start position of this item - width Pos // width of last rune read from input - items chan item // channel of scanned items - parenDepth int // nesting depth of ( ) exprs - line int // 1+number of newlines seen - startLine int // start line of this item + name string // the name of the input; used only for error reports + input string // the string being scanned + leftDelim string // start of action + rightDelim string // end of action + trimRightDelim string // end of action with trim marker + pos Pos // current position in the input + start Pos // start position of this item + width Pos // width of last rune read from input + items chan item // channel of scanned items + parenDepth int // nesting depth of ( ) exprs + line int // 1+number of newlines seen + startLine int // start line of this item } // next returns the next rune in the input. @@ -210,13 +211,14 @@ func lex(name, input, left, right string) *lexer { right = rightDelim } l := &lexer{ - name: name, - input: input, - leftDelim: left, - rightDelim: right, - items: make(chan item), - line: 1, - startLine: 1, + name: name, + input: input, + leftDelim: left, + rightDelim: right, + trimRightDelim: rightTrimMarker + right, + items: make(chan item), + line: 1, + startLine: 1, } go l.run() return l @@ -275,14 +277,12 @@ func rightTrimLength(s string) Pos { // atRightDelim reports whether the lexer is at a right delimiter, possibly preceded by a trim marker. func (l *lexer) atRightDelim() (delim, trimSpaces bool) { - if strings.HasPrefix(l.input[l.pos:], l.rightDelim) { - return true, false - } - // The right delim might have the marker before. - if strings.HasPrefix(l.input[l.pos:], rightTrimMarker) && - strings.HasPrefix(l.input[l.pos+trimMarkerLen:], l.rightDelim) { + if strings.HasPrefix(l.input[l.pos:], l.trimRightDelim) { // With trim marker. return true, true } + if strings.HasPrefix(l.input[l.pos:], l.rightDelim) { // Without trim marker. + return true, false + } return false, false } @@ -366,6 +366,7 @@ func lexInsideAction(l *lexer) stateFn { case r == eof || isEndOfLine(r): return l.errorf("unclosed action") case isSpace(r): + l.backup() // Put space back in case we have " -}}". return lexSpace case r == '=': l.emit(itemAssign) @@ -418,10 +419,26 @@ func lexInsideAction(l *lexer) stateFn { } // lexSpace scans a run of space characters. -// One space has already been seen. +// We have not consumed the first space, which is known to be present. +// Take care if there is a trim-marked right delimiter, which starts with a space. func lexSpace(l *lexer) stateFn { - for isSpace(l.peek()) { + var r rune + var numSpaces int + for { + r = l.peek() + if !isSpace(r) { + break + } l.next() + numSpaces++ + } + // Be careful about a trim-marked closing delimiter, which has a minus + // after a space. We know there is a space, so check for the '-' that might follow. + if strings.HasPrefix(l.input[l.pos-1:], l.trimRightDelim) { + l.backup() // Before the space. + if numSpaces == 1 { + return lexRightDelim // On the delim, so go right to that. + } } l.emit(itemSpace) return lexInsideAction diff --git a/src/text/template/parse/parse_test.go b/src/text/template/parse/parse_test.go index 5cb41d0bf5..6932cf232e 100644 --- a/src/text/template/parse/parse_test.go +++ b/src/text/template/parse/parse_test.go @@ -244,6 +244,7 @@ var parseTests = []parseTest{ {"trim left", "x \r\n\t{{- 3}}", noError, `"x"{{3}}`}, {"trim right", "{{3 -}}\n\n\ty", noError, `{{3}}"y"`}, {"trim left and right", "x \r\n\t{{- 3 -}}\n\n\ty", noError, `"x"{{3}}"y"`}, + {"trim with extra spaces", "x\n{{- 3 -}}\ny", noError, `"x"{{3}}"y"`}, {"comment trim left", "x \r\n\t{{- /* hi */}}", noError, `"x"`}, {"comment trim right", "{{/* hi */ -}}\n\n\ty", noError, `"y"`}, {"comment trim left and right", "x \r\n\t{{- /* */ -}}\n\n\ty", noError, `"x""y"`}, -- GitLab From 7722f6d228da78a03ff233713cd5856db124ce3d Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sun, 24 Mar 2019 15:49:45 +1100 Subject: [PATCH 0572/1679] cmd/go: keep WINDIR during TestScript TestScript executes PowerShell. And PowerShell appears to require WINDIR environment variable to exists on windows-arm. So keep WINDIR environment variable when running PowerShell. Fixes #30711 Change-Id: I14dde6614347325a8f3caf994ea8ab05294450a5 Reviewed-on: https://go-review.googlesource.com/c/go/+/168859 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/script_test.go | 1 + src/cmd/go/testdata/script/build_acl_windows.txt | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/go/script_test.go b/src/cmd/go/script_test.go index 9cb5b49d29..7c5dd48340 100644 --- a/src/cmd/go/script_test.go +++ b/src/cmd/go/script_test.go @@ -84,6 +84,7 @@ type backgroundCmd struct { var extraEnvKeys = []string{ "SYSTEMROOT", // must be preserved on Windows to find DLLs; golang.org/issue/25210 + "WINDIR", // must be preserved on Windows to be able to run PowerShell command; golang.org/issue/30711 "LD_LIBRARY_PATH", // must be preserved on Unix systems to find shared libraries "CC", // don't lose user settings when invoking cgo "GO_TESTING_GOTOOLS", // for gccgo testing diff --git a/src/cmd/go/testdata/script/build_acl_windows.txt b/src/cmd/go/testdata/script/build_acl_windows.txt index 21b8879a11..13a3ba226a 100644 --- a/src/cmd/go/testdata/script/build_acl_windows.txt +++ b/src/cmd/go/testdata/script/build_acl_windows.txt @@ -1,5 +1,4 @@ [!windows] stop -[arm] skip # TODO(golang.org/issue/30711): Skip broken test. [!exec:icacls] skip [!exec:powershell] skip -- GitLab From c7bb4533cb7d91eadc9c674e48dc644bc831e64e Mon Sep 17 00:00:00 2001 From: sergey Date: Sun, 24 Mar 2019 19:33:19 +0300 Subject: [PATCH 0573/1679] net/url: check for lowercase before uppercase in shouldEscape MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most chars in URLs are lowercase, so check that first. Performance change: String-4 7.62µs ± 1% 7.27µs ± 3% -4.61% (p=0.008 n=5+5) QueryEscape/#00-4 92.6ns ± 3% 90.3ns ± 1% -2.48% (p=0.016 n=5+5) QueryEscape/#01-4 515ns ± 4% 510ns ± 2% ~ (p=0.683 n=5+5) QueryEscape/#02-4 375ns ± 1% 343ns ± 1% -8.52% (p=0.008 n=5+5) QueryEscape/#03-4 758ns ± 1% 699ns ± 1% -7.83% (p=0.008 n=5+5) QueryEscape/#04-4 6.06µs ± 1% 5.74µs ± 1% -5.38% (p=0.008 n=5+5) PathEscape/#00-4 140ns ± 1% 135ns ± 2% -3.85% (p=0.008 n=5+5) PathEscape/#01-4 511ns ± 3% 507ns ± 3% ~ (p=0.587 n=5+5) PathEscape/#02-4 372ns ± 1% 342ns ± 2% -8.22% (p=0.008 n=5+5) PathEscape/#03-4 747ns ± 1% 685ns ± 1% -8.30% (p=0.008 n=5+5) PathEscape/#04-4 5.94µs ± 1% 5.64µs ± 3% -4.98% (p=0.008 n=5+5) QueryUnescape/#00-4 111ns ± 4% 110ns ± 2% ~ (p=0.952 n=5+5) QueryUnescape/#01-4 390ns ± 0% 391ns ± 2% ~ (p=0.714 n=5+5) QueryUnescape/#02-4 297ns ± 5% 295ns ± 3% ~ (p=0.524 n=5+5) QueryUnescape/#03-4 543ns ± 3% 556ns ± 2% +2.39% (p=0.032 n=5+5) QueryUnescape/#04-4 3.23µs ± 3% 3.22µs ± 2% ~ (p=1.000 n=5+5) PathUnescape/#00-4 111ns ± 1% 110ns ± 3% ~ (p=0.881 n=5+5) PathUnescape/#01-4 389ns ± 2% 386ns ± 2% ~ (p=0.444 n=5+5) PathUnescape/#02-4 297ns ± 1% 295ns ± 3% ~ (p=0.738 n=5+5) PathUnescape/#03-4 557ns ± 3% 553ns ± 2% ~ (p=0.810 n=5+5) PathUnescape/#04-4 2.94µs ± 2% 2.97µs ± 2% ~ (p=0.222 n=5+5) Change-Id: I7e6d64cd5f8f5218cb40f52f0015168a8674aabb Reviewed-on: https://go-review.googlesource.com/c/go/+/168883 Reviewed-by: Brad Fitzpatrick --- src/net/url/url.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/url/url.go b/src/net/url/url.go index 64274a0a36..b60e238781 100644 --- a/src/net/url/url.go +++ b/src/net/url/url.go @@ -100,7 +100,7 @@ func (e InvalidHostError) Error() string { // reserved characters correctly. See golang.org/issue/5684. func shouldEscape(c byte, mode encoding) bool { // §2.3 Unreserved characters (alphanum) - if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' { + if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { return false } -- GitLab From 869620bbeaef7698ef6210c896f913257fe2e43b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Jedin=C3=BD?= Date: Sat, 23 Mar 2019 00:00:48 +0000 Subject: [PATCH 0574/1679] log: expose Writer() method of the standard logger The Go 1.12 introduced Writer() method for logger objects, but it was not exposed as log package function for standard logger. This commit adds such Writer() function. Change-Id: Ia81b1524839fe05c152ecb5eaef047a076349fea GitHub-Last-Rev: dc152ea641dd928178dbd921e2d0f6361661a0d6 GitHub-Pull-Request: golang/go#31009 Reviewed-on: https://go-review.googlesource.com/c/go/+/168920 Run-TryBot: Rob Pike TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/log/log.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/log/log.go b/src/log/log.go index 527f853438..12a9e7b8ce 100644 --- a/src/log/log.go +++ b/src/log/log.go @@ -288,6 +288,11 @@ func SetPrefix(prefix string) { std.SetPrefix(prefix) } +// Writer returns the output destination for the standard logger. +func Writer() io.Writer { + return std.Writer() +} + // These functions write to the standard logger. // Print calls Output to print to the standard logger. -- GitLab From 56e1614c47cca7dc76b435f485fe86fe088d5127 Mon Sep 17 00:00:00 2001 From: Hasan Ozgan Date: Fri, 8 Feb 2019 00:50:51 +0000 Subject: [PATCH 0575/1679] path/filepath: add examples for Base, Dir and IsAbs Change-Id: I7a438409748f0f9d6517a7ea1cdee6512ce3ca8a Reviewed-on: https://go-review.googlesource.com/c/go/+/161678 Run-TryBot: Rob Pike Reviewed-by: Rob Pike --- src/path/filepath/example_unix_test.go | 71 ++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/path/filepath/example_unix_test.go b/src/path/filepath/example_unix_test.go index 20ec8927b4..23f21380d0 100644 --- a/src/path/filepath/example_unix_test.go +++ b/src/path/filepath/example_unix_test.go @@ -94,3 +94,74 @@ func ExampleMatch() { // true // true } + +func ExampleBase() { + fmt.Println("On Unix:") + fmt.Println(filepath.Base("/foo/bar/baz.js")) + fmt.Println(filepath.Base("/foo/bar/baz")) + fmt.Println(filepath.Base("/foo/bar/baz/")) + fmt.Println(filepath.Base("dev.txt")) + fmt.Println(filepath.Base("../todo.txt")) + fmt.Println(filepath.Base("..")) + fmt.Println(filepath.Base(".")) + fmt.Println(filepath.Base("/")) + fmt.Println(filepath.Base("")) + + // Output: + // On Unix: + // baz.js + // baz + // baz + // dev.txt + // todo.txt + // .. + // . + // / + // . +} + +func ExampleDir() { + fmt.Println("On Unix:") + fmt.Println(filepath.Dir("/foo/bar/baz.js")) + fmt.Println(filepath.Dir("/foo/bar/baz")) + fmt.Println(filepath.Dir("/foo/bar/baz/")) + fmt.Println(filepath.Dir("/dirty//path///")) + fmt.Println(filepath.Dir("dev.txt")) + fmt.Println(filepath.Dir("../todo.txt")) + fmt.Println(filepath.Dir("..")) + fmt.Println(filepath.Dir(".")) + fmt.Println(filepath.Dir("/")) + fmt.Println(filepath.Dir("")) + + // Output: + // On Unix: + // /foo/bar + // /foo/bar + // /foo/bar/baz + // /dirty/path + // . + // .. + // . + // . + // / + // . +} + +func ExampleIsAbs() { + fmt.Println("On Unix:") + fmt.Println(filepath.IsAbs("/home/gopher")) + fmt.Println(filepath.IsAbs(".bashrc")) + fmt.Println(filepath.IsAbs("..")) + fmt.Println(filepath.IsAbs(".")) + fmt.Println(filepath.IsAbs("/")) + fmt.Println(filepath.IsAbs("")) + + // Output: + // On Unix: + // true + // false + // false + // false + // true + // false +} -- GitLab From fb9b818bbd2273579ea09f71017ee42bbc91a3b3 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sun, 24 Mar 2019 18:21:11 +0100 Subject: [PATCH 0576/1679] cmd/link/internal/wasm: do not generate more than 100000 data segments Some WebAssembly runtimes (e.g. Node.js) fail to load a wasm binary if it has more than 100000 data segments. Do not skip zero regions any more if the limit was reached. Change-Id: I14c4c2aba142d1d2b887bce6d03b8c1c1746c5ec Reviewed-on: https://go-review.googlesource.com/c/go/+/168884 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/internal/wasm/asm.go | 38 +++++++++++++++++++------------ 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index 2665659fe0..abb4409188 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -427,8 +427,11 @@ func writeDataSec(ctxt *ld.Link) { // overhead of adding a new segment (same as wasm-opt's memory-packing optimization uses). const segmentOverhead = 8 + // Generate at most this many segments. A higher number of segments gets rejected by some WebAssembly runtimes. + const maxNumSegments = 100000 + var segments []*dataSegment - for _, sec := range sections { + for secIndex, sec := range sections { data := ld.DatblkBytes(ctxt, int64(sec.Vaddr), int64(sec.Length)) offset := int32(sec.Vaddr) @@ -441,21 +444,26 @@ func writeDataSec(ctxt *ld.Link) { for len(data) > 0 { dataLen := int32(len(data)) var segmentEnd, zeroEnd int32 - for { - // look for beginning of zeroes - for segmentEnd < dataLen && data[segmentEnd] != 0 { - segmentEnd++ - } - // look for end of zeroes - zeroEnd = segmentEnd - for zeroEnd < dataLen && data[zeroEnd] == 0 { - zeroEnd++ - } - // emit segment if omitting zeroes reduces the output size - if zeroEnd-segmentEnd >= segmentOverhead || zeroEnd == dataLen { - break + if len(segments)+(len(sections)-secIndex) == maxNumSegments { + segmentEnd = dataLen + zeroEnd = dataLen + } else { + for { + // look for beginning of zeroes + for segmentEnd < dataLen && data[segmentEnd] != 0 { + segmentEnd++ + } + // look for end of zeroes + zeroEnd = segmentEnd + for zeroEnd < dataLen && data[zeroEnd] == 0 { + zeroEnd++ + } + // emit segment if omitting zeroes reduces the output size + if zeroEnd-segmentEnd >= segmentOverhead || zeroEnd == dataLen { + break + } + segmentEnd = zeroEnd } - segmentEnd = zeroEnd } segments = append(segments, &dataSegment{ -- GitLab From 9eef9648005c17681800fdb55ed2404ab769761e Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sun, 24 Mar 2019 18:17:43 +0100 Subject: [PATCH 0577/1679] misc/wasm: exit with code 1 if WebAssembly.instantiate fails go_js_wasm_exec was returning with code 0 if WebAssembly.instantiate failed. This made failing tests show as passed. Change-Id: Icfb2f42e9f1c3c70ca4a130a61a63cb305edff32 Reviewed-on: https://go-review.googlesource.com/c/go/+/168885 Run-TryBot: Richard Musiol Reviewed-by: Brad Fitzpatrick Reviewed-by: Cherry Zhang TryBot-Result: Gobot Gobot --- misc/wasm/wasm_exec.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index e939e8527a..29427d91e5 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -477,7 +477,7 @@ !global.process.versions.electron ) { if (process.argv.length < 3) { - process.stderr.write("usage: go_js_wasm_exec [wasm binary] [arguments]\n"); + console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); process.exit(1); } @@ -495,7 +495,8 @@ }); return go.run(result.instance); }).catch((err) => { - throw err; + console.error(err); + process.exit(1); }); } })(); -- GitLab From 68a98d52794fc324841f62732411f6bba23fc62c Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 22 Mar 2019 08:14:45 -0400 Subject: [PATCH 0578/1679] cmd/compile: better handling for PAUTOHEAP in DWARF inline gen When generating DWARF inline info records, the post-SSA code looks through the original "pre-inline" dcl list for the function so as to handle situations where formal params are promoted or optimized away. This code was not properly handling the case where an output parameter was promoted to the heap -- in this case the param node is converted in place from class PPARAMOUT to class PAUTOHEAP. This caused inconsistencies later on, since the variable entry in the abstract subprogram DIE wound up as a local and not an output parameter. Fixes #30908. Change-Id: Ia70b89f0cf7f9b16246d95df17ad6e307228b8c7 Reviewed-on: https://go-review.googlesource.com/c/go/+/168818 Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/dwinl.go | 2 +- src/cmd/compile/internal/gc/pgen.go | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/dwinl.go b/src/cmd/compile/internal/gc/dwinl.go index ade76f40f8..cc42a04c64 100644 --- a/src/cmd/compile/internal/gc/dwinl.go +++ b/src/cmd/compile/internal/gc/dwinl.go @@ -127,7 +127,7 @@ func assembleInlines(fnsym *obj.LSym, dwVars []*dwarf.Var) dwarf.InlCalls { DeclLine: v.DeclLine, DeclCol: v.DeclCol, } - synthesized := strings.HasPrefix(v.Name, "~r") || canonName == "_" + synthesized := strings.HasPrefix(v.Name, "~r") || canonName == "_" || strings.HasPrefix(v.Name, "~b") if idx, found := m[vp]; found { v.ChildIndex = int32(idx) v.IsInAbstract = !synthesized diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index 5b9b6ce45e..b0ed01947a 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -593,8 +593,22 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, [] typename := dwarf.InfoPrefix + typesymname(n.Type) decls = append(decls, n) abbrev := dwarf.DW_ABRV_AUTO_LOCLIST + isReturnValue := (n.Class() == PPARAMOUT) if n.Class() == PPARAM || n.Class() == PPARAMOUT { abbrev = dwarf.DW_ABRV_PARAM_LOCLIST + } else if n.Class() == PAUTOHEAP { + // If dcl in question has been promoted to heap, do a bit + // of extra work to recover original class (auto or param); + // see issue 30908. This insures that we get the proper + // signature in the abstract function DIE, but leaves a + // misleading location for the param (we want pointer-to-heap + // and not stack). + // TODO(thanm): generate a better location expression + stackcopy := n.Name.Param.Stackcopy + if stackcopy != nil && (stackcopy.Class() == PPARAM || stackcopy.Class() == PPARAMOUT) { + abbrev = dwarf.DW_ABRV_PARAM_LOCLIST + isReturnValue = (stackcopy.Class() == PPARAMOUT) + } } inlIndex := 0 if genDwarfInline > 1 { @@ -608,7 +622,7 @@ func createDwarfVars(fnsym *obj.LSym, fn *Func, automDecls []*Node) ([]*Node, [] declpos := Ctxt.InnermostPos(n.Pos) vars = append(vars, &dwarf.Var{ Name: n.Sym.Name, - IsReturnValue: n.Class() == PPARAMOUT, + IsReturnValue: isReturnValue, Abbrev: abbrev, StackOffset: int32(n.Xoffset), Type: Ctxt.Lookup(typename), -- GitLab From fbd74a8922434ada5871a875598b58cbca4ff0d6 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 22 Mar 2019 15:24:36 -0400 Subject: [PATCH 0579/1679] test: support -ldflags for "rundir" tests, new -P option For "rundir" tests, allow users to add in linker flags as well as compiler flags, e.g. // rundir -m -ldflags -w The directive above will pass "-m" to the compiler on each package compilation and "-w" to the linker for the final link. In addition, if "-P" is specified with 'rundir', then for each compile pass in "-p " to set the packagepath explicitly, which is closer to how the compiler is run by 'go build'. Change-Id: I04720011a89d1bd8dcb4f2ccb4af1d74f6a01da1 Reviewed-on: https://go-review.googlesource.com/c/go/+/168977 Reviewed-by: Cherry Zhang --- test/run.go | 56 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/test/run.go b/test/run.go index 97d54902a7..292903f932 100644 --- a/test/run.go +++ b/test/run.go @@ -233,12 +233,15 @@ func compileInDir(runcmd runCmd, dir string, flags []string, localImports bool, return runcmd(cmd...) } -func linkFile(runcmd runCmd, goname string) (err error) { +func linkFile(runcmd runCmd, goname string, ldflags []string) (err error) { pfile := strings.Replace(goname, ".go", ".o", -1) cmd := []string{goTool(), "tool", "link", "-w", "-o", "a.exe", "-L", "."} if *linkshared { cmd = append(cmd, "-linkshared", "-installsuffix=dynlink") } + if ldflags != nil { + cmd = append(cmd, ldflags...) + } cmd = append(cmd, pfile) _, err = runcmd(cmd...) return @@ -324,6 +327,18 @@ func goDirFiles(longdir string) (filter []os.FileInfo, err error) { var packageRE = regexp.MustCompile(`(?m)^package ([\p{Lu}\p{Ll}\w]+)`) +func getPackageNameFromSource(fn string) (string, error) { + data, err := ioutil.ReadFile(fn) + if err != nil { + return "", err + } + pkgname := packageRE.FindStringSubmatch(string(data)) + if pkgname == nil { + return "", fmt.Errorf("cannot find package name in %s", fn) + } + return pkgname[1], nil +} + // If singlefilepkgs is set, each file is considered a separate package // even if the package names are the same. func goDirPackages(longdir string, singlefilepkgs bool) ([][]string, error) { @@ -335,19 +350,13 @@ func goDirPackages(longdir string, singlefilepkgs bool) ([][]string, error) { m := make(map[string]int) for _, file := range files { name := file.Name() - data, err := ioutil.ReadFile(filepath.Join(longdir, name)) - if err != nil { - return nil, err - } - pkgname := packageRE.FindStringSubmatch(string(data)) - if pkgname == nil { - return nil, fmt.Errorf("cannot find package name in %s", name) - } - i, ok := m[pkgname[1]] + pkgname, err := getPackageNameFromSource(filepath.Join(longdir, name)) + check(err) + i, ok := m[pkgname] if singlefilepkgs || !ok { i = len(pkgs) pkgs = append(pkgs, nil) - m[pkgname[1]] = i + m[pkgname] = i } pkgs[i] = append(pkgs[i], name) } @@ -502,6 +511,7 @@ func (t *test) run() { wantError := false wantAuto := false singlefilepkgs := false + setpkgpaths := false localImports := true f := strings.Fields(action) if len(f) > 0 { @@ -540,6 +550,8 @@ func (t *test) run() { wantError = false case "-s": singlefilepkgs = true + case "-P": + setpkgpaths = true case "-n": // Do not set relative path for local imports to current dir, // e.g. do not pass -D . -I . to the compiler. @@ -765,8 +777,26 @@ func (t *test) run() { t.err = err return } + // Split flags into gcflags and ldflags + ldflags := []string{} + for i, fl := range flags { + if fl == "-ldflags" { + ldflags = flags[i+1:] + flags = flags[0:i] + break + } + } + for i, gofiles := range pkgs { - _, err := compileInDir(runcmd, longdir, flags, localImports, gofiles...) + pflags := []string{} + pflags = append(pflags, flags...) + if setpkgpaths { + fp := filepath.Join(longdir, gofiles[0]) + pkgname, serr := getPackageNameFromSource(fp) + check(serr) + pflags = append(pflags, "-p", pkgname) + } + _, err := compileInDir(runcmd, longdir, pflags, localImports, gofiles...) // Allow this package compilation fail based on conditions below; // its errors were checked in previous case. if err != nil && !(wantError && action == "errorcheckandrundir" && i == len(pkgs)-2) { @@ -774,7 +804,7 @@ func (t *test) run() { return } if i == len(pkgs)-1 { - err = linkFile(runcmd, gofiles[0]) + err = linkFile(runcmd, gofiles[0], ldflags) if err != nil { t.err = err return -- GitLab From 6582ee9cba7e4b5ffba1048782393d2557e64f1f Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 22 Mar 2019 14:57:32 -0400 Subject: [PATCH 0580/1679] test: new test for issue 30908 New test case designed to mimic the code in issue 30908, which features duplicate but non-indentical DWARF abstract subprogram DIEs. Updates #30908. Change-Id: Iacb4b53e6a988e46c801cdac236cef883c553f8f Reviewed-on: https://go-review.googlesource.com/c/go/+/168957 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: David Chase --- test/fixedbugs/issue30908.dir/a.go | 32 +++++++++++++++++++++++++++ test/fixedbugs/issue30908.dir/b.go | 35 ++++++++++++++++++++++++++++++ test/fixedbugs/issue30908.dir/m.go | 21 ++++++++++++++++++ test/fixedbugs/issue30908.go | 9 ++++++++ 4 files changed, 97 insertions(+) create mode 100644 test/fixedbugs/issue30908.dir/a.go create mode 100644 test/fixedbugs/issue30908.dir/b.go create mode 100644 test/fixedbugs/issue30908.dir/m.go create mode 100644 test/fixedbugs/issue30908.go diff --git a/test/fixedbugs/issue30908.dir/a.go b/test/fixedbugs/issue30908.dir/a.go new file mode 100644 index 0000000000..2f0abc3780 --- /dev/null +++ b/test/fixedbugs/issue30908.dir/a.go @@ -0,0 +1,32 @@ +// Copyright 2019 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 a + +import ( + "errors" + "strings" +) + +var G interface{} + +func Unmarshal(data []byte, o interface{}) error { + G = o + v, ok := o.(*map[string]interface{}) + if !ok { + return errors.New("eek") + } + vals := make(map[string]interface{}) + s := string(data) + items := strings.Split(s, " ") + var err error + for _, item := range items { + vals[item] = s + if item == "error" { + err = errors.New("ouch") + } + } + *v = vals + return err +} diff --git a/test/fixedbugs/issue30908.dir/b.go b/test/fixedbugs/issue30908.dir/b.go new file mode 100644 index 0000000000..2f543985b4 --- /dev/null +++ b/test/fixedbugs/issue30908.dir/b.go @@ -0,0 +1,35 @@ +// Copyright 2019 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 b + +import ( + "io/ioutil" + + "./a" +) + +var G int + +// An inlinable function. To trigger the bug in question this needs +// to be inlined here within the package and also inlined into some +// other package that imports it. +func ReadValues(data []byte) (vals map[string]interface{}, err error) { + err = a.Unmarshal(data, &vals) + if len(vals) == 0 { + vals = map[string]interface{}{} + } + return +} + +// A local call to the function above, which triggers the "move to heap" +// of the output param. +func CallReadValues(filename string) (map[string]interface{}, error) { + defer func() { G++ }() + data, err := ioutil.ReadFile(filename) + if err != nil { + return map[string]interface{}{}, err + } + return ReadValues(data) +} diff --git a/test/fixedbugs/issue30908.dir/m.go b/test/fixedbugs/issue30908.dir/m.go new file mode 100644 index 0000000000..a170a6eed6 --- /dev/null +++ b/test/fixedbugs/issue30908.dir/m.go @@ -0,0 +1,21 @@ +// Copyright 2019 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 main + +import ( + "os" + + "./b" +) + +func main() { + seed := "some things are better" + bsl := []byte(seed) + b.CallReadValues("/dev/null") + vals, err := b.ReadValues(bsl) + if vals["better"] != seed || err != nil { + os.Exit(1) + } +} diff --git a/test/fixedbugs/issue30908.go b/test/fixedbugs/issue30908.go new file mode 100644 index 0000000000..8863b396aa --- /dev/null +++ b/test/fixedbugs/issue30908.go @@ -0,0 +1,9 @@ +// rundir -P -l=4 -ldflags -strictdups=2 + +// Copyright 2019 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. + +// +build !nacl,!js + +package ignored -- GitLab From cf99535e218c542d01f252492789ff88acc4bfb9 Mon Sep 17 00:00:00 2001 From: sergey Date: Sun, 17 Feb 2019 21:29:39 +0300 Subject: [PATCH 0581/1679] net/http: reduce allocs on write cookie MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pregrow buffer to reduce allocs on building cookie string. We calc cookie name value and domain size (most distributed by value) and add 110 extra characters allows to write most cookie attributes without additional allocations in most cases. name old time/op new time/op delta CookieString-4 1.65µs ± 3% 1.27µs ± 2% -23.01% (p=0.008 n=5+5) ReadSetCookies-4 5.78µs ± 4% 5.67µs ± 3% ~ (p=0.310 n=5+5) ReadCookies-4 7.12µs ± 4% 7.04µs ± 3% ~ (p=0.690 n=5+5) name old alloc/op new alloc/op delta CookieString-4 360B ± 0% 144B ± 0% -60.00% (p=0.008 n=5+5) ReadSetCookies-4 976B ± 0% 976B ± 0% ~ (all equal) ReadCookies-4 2.17kB ± 0% 2.17kB ± 0% ~ (all equal) name old allocs/op new allocs/op delta CookieString-4 5.00 ± 0% 1.00 ± 0% -80.00% (p=0.008 n=5+5) ReadSetCookies-4 15.0 ± 0% 15.0 ± 0% ~ (all equal) ReadCookies-4 16.0 ± 0% 16.0 ± 0% ~ (all equal) Change-Id: I50defac954a135b785b3551342b00878429b3d7f Reviewed-on: https://go-review.googlesource.com/c/go/+/163017 Reviewed-by: Volker Dobler Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick --- src/net/http/cookie.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/net/http/cookie.go b/src/net/http/cookie.go index 63f62214db..b8bc72b622 100644 --- a/src/net/http/cookie.go +++ b/src/net/http/cookie.go @@ -168,7 +168,11 @@ func (c *Cookie) String() string { if c == nil || !isCookieNameValid(c.Name) { return "" } + // extraCookieLength derived from typical length of cookie attributes + // see RFC 6265 Sec 4.1. + const extraCookieLength = 110 var b strings.Builder + b.Grow(len(c.Name) + len(c.Value) + len(c.Domain) + len(c.Path) + extraCookieLength) b.WriteString(sanitizeCookieName(c.Name)) b.WriteRune('=') b.WriteString(sanitizeCookieValue(c.Value)) -- GitLab From 42cdc26665a6aeccb6c8fd9c0620961c7b434862 Mon Sep 17 00:00:00 2001 From: Hasan Ozgan Date: Thu, 7 Feb 2019 23:22:54 +0000 Subject: [PATCH 0582/1679] database/sql: add example for DB.Prepare and Tx.Prepare Change-Id: Ib9272a7713ed7aaf8ad54c4827be8c095763e648 Reviewed-on: https://go-review.googlesource.com/c/go/+/161677 Reviewed-by: Daniel Theophanes Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/database/sql/example_test.go | 57 ++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/database/sql/example_test.go b/src/database/sql/example_test.go index 6f9bd91276..2bf2a9fccf 100644 --- a/src/database/sql/example_test.go +++ b/src/database/sql/example_test.go @@ -163,6 +163,63 @@ func ExampleDB_PingContext() { log.Println(status) } +func ExampleDB_Prepare() { + projects := []struct { + mascot string + release int + }{ + {"tux", 1991}, + {"duke", 1996}, + {"gopher", 2009}, + {"moby dock", 2013}, + } + + stmt, err := db.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )") + if err != nil { + log.Fatal(err) + } + defer stmt.Close() // Prepared statements take up server resources and should be closed after use. + + for id, project := range projects { + if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil { + log.Fatal(err) + } + } +} + +func ExampleTx_Prepare() { + projects := []struct { + mascot string + release int + }{ + {"tux", 1991}, + {"duke", 1996}, + {"gopher", 2009}, + {"moby dock", 2013}, + } + + tx, err := db.Begin() + if err != nil { + log.Fatal(err) + } + defer tx.Rollback() // The rollback will be ignored if the tx has been committed later in the function. + + stmt, err := tx.Prepare("INSERT INTO projects(id, mascot, release, category) VALUES( ?, ?, ?, ? )") + if err != nil { + log.Fatal(err) + } + defer stmt.Close() // Prepared statements take up server resources and should be closed after use. + + for id, project := range projects { + if _, err := stmt.Exec(id+1, project.mascot, project.release, "open source"); err != nil { + log.Fatal(err) + } + } + if err := tx.Commit(); err != nil { + log.Fatal(err) + } +} + func ExampleConn_BeginTx() { tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}) if err != nil { -- GitLab From 9a8979deb01fd43a660351aedff2c155f9fe5ff6 Mon Sep 17 00:00:00 2001 From: Vladimir Kovpak Date: Wed, 13 Mar 2019 09:39:21 +0000 Subject: [PATCH 0583/1679] math/rand: add example for Intn func Change-Id: I831ffb5c3fa2872d71def8d8461f0adbd4ae2c1a GitHub-Last-Rev: 2adfcd2d5a592ef4c63da781240a391da89b5d9e GitHub-Pull-Request: golang/go#30706 Reviewed-on: https://go-review.googlesource.com/c/go/+/166426 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/math/rand/example_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/math/rand/example_test.go b/src/math/rand/example_test.go index adeeaa0b46..4107613555 100644 --- a/src/math/rand/example_test.go +++ b/src/math/rand/example_test.go @@ -140,3 +140,18 @@ func ExampleShuffle_slicesInUnison() { // E: 5 // B: 2 } + +func ExampleIntn() { + // Seeding with the same value results in the same random sequence each run. + // For different numbers, seed with a different value, such as + // time.Now().UnixNano(), which yields a constantly-changing number. + rand.Seed(86) + fmt.Println(rand.Intn(100)) + fmt.Println(rand.Intn(100)) + fmt.Println(rand.Intn(100)) + + // Output: + // 42 + // 76 + // 30 +} -- GitLab From 88adc33827f1e01953a6a3f40d927a2b7efcce3e Mon Sep 17 00:00:00 2001 From: Michael Fraenkel Date: Wed, 27 Feb 2019 15:27:42 -0500 Subject: [PATCH 0584/1679] context: remove dependency on reflect Make context depend on reflectlite instead of reflect in effort to eventually make net no longer depend on unicode tables. With this CL we're down to just: net -> context -> fmt -> unicode tables The next CL can remove context -> fmt. Updates #30440 Change-Id: I7f5df15f975d9dc862c59aa8477c1cfd6ff4967e Reviewed-on: https://go-review.googlesource.com/c/go/+/164239 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/context/context.go | 4 ++-- src/go/build/deps_test.go | 4 ++-- src/internal/reflectlite/type.go | 7 +++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/context/context.go b/src/context/context.go index 21a40d5947..36f83c7b5b 100644 --- a/src/context/context.go +++ b/src/context/context.go @@ -50,7 +50,7 @@ package context import ( "errors" "fmt" - "reflect" + "internal/reflectlite" "sync" "time" ) @@ -468,7 +468,7 @@ func WithValue(parent Context, key, val interface{}) Context { if key == nil { panic("nil key") } - if !reflect.TypeOf(key).Comparable() { + if !reflectlite.TypeOf(key).Comparable() { panic("key is not comparable") } return &valueCtx{parent, key, val} diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index df1d8dd3b3..e9ea0fabd8 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -249,7 +249,7 @@ var pkgDeps = map[string][]string{ "compress/gzip": {"L4", "compress/flate"}, "compress/lzw": {"L4"}, "compress/zlib": {"L4", "compress/flate"}, - "context": {"errors", "fmt", "reflect", "sync", "time"}, + "context": {"errors", "fmt", "internal/reflectlite", "sync", "time"}, "database/sql": {"L4", "container/list", "context", "database/sql/driver", "database/sql/internal"}, "database/sql/driver": {"L4", "context", "time", "database/sql/internal"}, "debug/dwarf": {"L4"}, @@ -324,7 +324,7 @@ var pkgDeps = map[string][]string{ // do networking portably, it must have a small dependency set: just L0+basic os. "net": { "L0", "CGO", - "context", "math/rand", "os", "reflect", "sort", "syscall", "time", + "context", "math/rand", "os", "sort", "syscall", "time", "internal/nettrace", "internal/poll", "internal/syscall/unix", "internal/syscall/windows", "internal/singleflight", "internal/race", "golang.org/x/net/dns/dnsmessage", "golang.org/x/net/lif", "golang.org/x/net/route", diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go index 70c3723de7..9767ffbd0d 100644 --- a/src/internal/reflectlite/type.go +++ b/src/internal/reflectlite/type.go @@ -44,6 +44,9 @@ type Type interface { // AssignableTo reports whether a value of the type is assignable to type u. AssignableTo(u Type) bool + // Comparable reports whether values of this type are comparable. + Comparable() bool + // Elem returns a type's element type. // It panics if the type's Kind is not Ptr. Elem() Type @@ -663,6 +666,10 @@ func (t *rtype) AssignableTo(u Type) bool { return directlyAssignable(uu, t) || implements(uu, t) } +func (t *rtype) Comparable() bool { + return t.alg != nil && t.alg.equal != nil +} + // implements reports whether the type V implements the interface type T. func implements(T, V *rtype) bool { if T.Kind() != Interface { -- GitLab From 2034fbab5b1d11bc59cb476bc3f49ee1b344839d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 15 Jan 2019 14:50:09 -0800 Subject: [PATCH 0585/1679] cmd/compile: use existing instructions instead of nops for inline marks Instead of always inserting a nop to use as the target of an inline mark, see if we can instead find an instruction we're issuing anyway with the correct line number, and use that instruction. That way, we don't need to issue a nop. Makes cmd/go 0.3% smaller. Update #29571 Change-Id: If6cfc93ab3352ec2c6e0878f8074a3bf0786b2f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/158021 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- misc/cgo/test/callback.go | 2 +- src/cmd/compile/internal/gc/dwinl.go | 46 ++++++++++---------- src/cmd/compile/internal/gc/ssa.go | 64 +++++++++++++++++++++++++++- src/cmd/internal/src/pos.go | 4 ++ src/cmd/internal/src/xpos.go | 6 +++ 5 files changed, 96 insertions(+), 26 deletions(-) diff --git a/misc/cgo/test/callback.go b/misc/cgo/test/callback.go index d48aeaabd9..e749650293 100644 --- a/misc/cgo/test/callback.go +++ b/misc/cgo/test/callback.go @@ -199,7 +199,7 @@ func testCallbackCallers(t *testing.T) { t.Errorf("expected %d frames, got %d", len(name), n) } for i := 0; i < n; i++ { - f := runtime.FuncForPC(pc[i]) + f := runtime.FuncForPC(pc[i] - 1) // TODO: use runtime.CallersFrames if f == nil { t.Fatalf("expected non-nil Func for pc %d", pc[i]) } diff --git a/src/cmd/compile/internal/gc/dwinl.go b/src/cmd/compile/internal/gc/dwinl.go index cc42a04c64..27e2cbcd98 100644 --- a/src/cmd/compile/internal/gc/dwinl.go +++ b/src/cmd/compile/internal/gc/dwinl.go @@ -147,8 +147,8 @@ func assembleInlines(fnsym *obj.LSym, dwVars []*dwarf.Var) dwarf.InlCalls { // Make a second pass through the progs to compute PC ranges for // the various inlined calls. + start := int64(-1) curii := -1 - var crange *dwarf.Range var prevp *obj.Prog for p := fnsym.Func.Text; p != nil; prevp, p = p, p.Link { if prevp != nil && p.Pos == prevp.Pos { @@ -157,17 +157,17 @@ func assembleInlines(fnsym *obj.LSym, dwVars []*dwarf.Var) dwarf.InlCalls { ii := posInlIndex(p.Pos) if ii == curii { continue - } else { - // Close out the current range - endRange(crange, p) - - // Begin new range - crange = beginRange(inlcalls.Calls, p, ii, imap) - curii = ii } + // Close out the current range + if start != -1 { + addRange(inlcalls.Calls, start, p.Pc, curii, imap) + } + // Begin new range + start = p.Pc + curii = ii } - if crange != nil { - crange.End = fnsym.Size + if start != -1 { + addRange(inlcalls.Calls, start, fnsym.Size, curii, imap) } // Debugging @@ -287,26 +287,26 @@ func posInlIndex(xpos src.XPos) int { return -1 } -func endRange(crange *dwarf.Range, p *obj.Prog) { - if crange == nil { - return +func addRange(calls []dwarf.InlCall, start, end int64, ii int, imap map[int]int) { + if start == -1 { + panic("bad range start") + } + if end == -1 { + panic("bad range end") } - crange.End = p.Pc -} - -func beginRange(calls []dwarf.InlCall, p *obj.Prog, ii int, imap map[int]int) *dwarf.Range { if ii == -1 { - return nil + return } + if start == end { + return + } + // Append range to correct inlined call callIdx, found := imap[ii] if !found { - Fatalf("can't find inlIndex %d in imap for prog at %d\n", ii, p.Pc) + Fatalf("can't find inlIndex %d in imap for prog at %d\n", ii, start) } call := &calls[callIdx] - - // Set up range and append to correct inlined call - call.Ranges = append(call.Ranges, dwarf.Range{Start: p.Pc, End: -1}) - return &call.Ranges[len(call.Ranges)-1] + call.Ranges = append(call.Ranges, dwarf.Range{Start: start, End: end}) } func dumpInlCall(inlcalls dwarf.InlCalls, idx, ilevel int) { diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 52515bdb1d..a7c1917ff1 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5239,6 +5239,16 @@ func genssa(f *ssa.Func, pp *Progs) { } } + // inlMarks has an entry for each Prog that implements an inline mark. + // It maps from that Prog to the global inlining id of the inlined body + // which should unwind to this Prog's location. + var inlMarks map[*obj.Prog]int32 + var inlMarkList []*obj.Prog + + // inlMarksByPos maps from a (column 1) source position to the set of + // Progs that are in the set above and have that source position. + var inlMarksByPos map[src.XPos][]*obj.Prog + // Emit basic blocks for i, b := range f.Blocks { s.bstart[b.ID] = s.pp.next @@ -5276,8 +5286,14 @@ func genssa(f *ssa.Func, pp *Progs) { } case ssa.OpInlMark: p := thearch.Ginsnop(s.pp) - pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32()) - // TODO: if matching line number, merge somehow with previous instruction? + if inlMarks == nil { + inlMarks = map[*obj.Prog]int32{} + inlMarksByPos = map[src.XPos][]*obj.Prog{} + } + inlMarks[p] = v.AuxInt32() + inlMarkList = append(inlMarkList, p) + pos := v.Pos.AtColumn1() + inlMarksByPos[pos] = append(inlMarksByPos[pos], p) default: // let the backend handle it @@ -5318,6 +5334,50 @@ func genssa(f *ssa.Func, pp *Progs) { } } + if inlMarks != nil { + // We have some inline marks. Try to find other instructions we're + // going to emit anyway, and use those instructions instead of the + // inline marks. + for p := pp.Text; p != nil; p = p.Link { + if p.As == obj.ANOP || p.As == obj.AFUNCDATA || p.As == obj.APCDATA || p.As == obj.ATEXT || p.As == obj.APCALIGN || thearch.LinkArch.Family == sys.Wasm { + // Don't use 0-sized instructions as inline marks, because we need + // to identify inline mark instructions by pc offset. + // (Some of these instructions are sometimes zero-sized, sometimes not. + // We must not use anything that even might be zero-sized.) + // TODO: are there others? + continue + } + if _, ok := inlMarks[p]; ok { + // Don't use inline marks themselves. We don't know + // whether they will be zero-sized or not yet. + continue + } + pos := p.Pos.AtColumn1() + s := inlMarksByPos[pos] + if len(s) == 0 { + continue + } + for _, m := range s { + // We found an instruction with the same source position as + // some of the inline marks. + // Use this instruction instead. + pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[m]) + // Make the inline mark a real nop, so it doesn't generate any code. + m.As = obj.ANOP + m.Pos = src.NoXPos + m.From = obj.Addr{} + m.To = obj.Addr{} + } + delete(inlMarksByPos, pos) + } + // Any unmatched inline marks now need to be added to the inlining tree (and will generate a nop instruction). + for _, p := range inlMarkList { + if p.As != obj.ANOP { + pp.curfn.Func.lsym.Func.AddInlMark(p, inlMarks[p]) + } + } + } + if Ctxt.Flag_locationlists { e.curfn.Func.DebugInfo = ssa.BuildFuncDebug(Ctxt, f, Debug_locationlist > 1, stackOffset) bstart := s.bstart diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go index 5063b133f3..a30b4b6e4a 100644 --- a/src/cmd/internal/src/pos.go +++ b/src/cmd/internal/src/pos.go @@ -430,3 +430,7 @@ func (x lico) lineNumberHTML() string { } return fmt.Sprintf("<%s>%s%d", style, pfx, x.Line(), style) } + +func (x lico) atColumn1() lico { + return makeLico(x.Line(), 1) +} diff --git a/src/cmd/internal/src/xpos.go b/src/cmd/internal/src/xpos.go index d7ec91f92c..c94f9e997b 100644 --- a/src/cmd/internal/src/xpos.go +++ b/src/cmd/internal/src/xpos.go @@ -80,6 +80,12 @@ func (p XPos) LineNumberHTML() string { return p.lico.lineNumberHTML() } +// AtColumn1 returns the same location but shifted to column 1. +func (p XPos) AtColumn1() XPos { + p.lico = p.lico.atColumn1() + return p +} + // A PosTable tracks Pos -> XPos conversions and vice versa. // Its zero value is a ready-to-use PosTable. type PosTable struct { -- GitLab From 24f846e21240f6d6ab2ca23fe319230b7d7f8168 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 22 Mar 2019 14:51:33 -0700 Subject: [PATCH 0586/1679] runtime: skip wb call in growslice when unnecessary Instrumenting make.bash reveals that almost half (49.54%) of the >16 million calls to growslice for pointer-containing slices are growing from an empty to a non-empty slice. In that case, there is no need to call the write barrier, which does some work before discovering that no pointers need shading. Change-Id: Ide741468d8dee7ad43ea0bfbea6ccdf680030a0f Reviewed-on: https://go-review.googlesource.com/c/go/+/168959 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/slice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/slice.go b/src/runtime/slice.go index 2309b1a615..dca41ff8cd 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -179,7 +179,7 @@ func growslice(et *_type, old slice, cap int) slice { } else { // Note: can't use rawmem (which avoids zeroing of memory), because then GC can scan uninitialized memory. p = mallocgc(capmem, et, true) - if writeBarrier.enabled { + if lenmem > 0 && writeBarrier.enabled { // Only shade the pointers in old.array since we know the destination slice p // only contains nil pointers because it has been cleared during alloc. bulkBarrierPreWriteSrcOnly(uintptr(p), uintptr(old.array), lenmem) -- GitLab From 6e7bc021eed9e039aa4cf4c2800e91f3145b5930 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Thu, 21 Mar 2019 15:18:04 -0400 Subject: [PATCH 0587/1679] cmd/dist: set GOPATH to internal directory during build Since GO111MODULE=on by default, the Go command needs a location for the module cache, even though it doesn't need to be written when building std and cmd. If GOROOT is checked out to $HOME/go, which is also the default location for GOPATH, this causes unnecessary problems late in the build. With this change, dist sets GOPATH to $GOROOT/pkg/obj/go-path. This is next to the temporary GOCACHE, $GOROOT/pkg/obj/go-build. Fixes #30960 Change-Id: I60771ee7f7c67ced1d2dc7c66b5885703fad1b63 Reviewed-on: https://go-review.googlesource.com/c/go/+/168697 Run-TryBot: Jay Conrod Reviewed-by: Ian Lance Taylor --- src/cmd/dist/build.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index b3e9ad33e9..b724d16456 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -235,6 +235,13 @@ func xinit() { // make.bash really does start from a clean slate. os.Setenv("GOCACHE", pathf("%s/pkg/obj/go-build", goroot)) + // Set GOPATH to an internal directory. We shouldn't actually + // need to store files here, since the toolchain won't + // depend on modules outside of vendor directories, but if + // GOPATH points somewhere else (e.g., to GOROOT), the + // go tool may complain. + os.Setenv("GOPATH", pathf("%s/pkg/obj/gopath", goroot)) + // Make the environment more predictable. os.Setenv("LANG", "C") os.Setenv("LANGUAGE", "en_US.UTF8") -- GitLab From 501632339f36e7e836ec94958351cee51ee76461 Mon Sep 17 00:00:00 2001 From: Matt Layher Date: Mon, 25 Mar 2019 14:05:31 -0400 Subject: [PATCH 0588/1679] net: add missing period in conn.File documentation Change-Id: Ie873d7ed595c91cee4c1aa6c22fa44b61b6190ff Reviewed-on: https://go-review.googlesource.com/c/go/+/169138 Run-TryBot: Matt Layher Reviewed-by: Brad Fitzpatrick --- src/net/net.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/net/net.go b/src/net/net.go index 77b8f69074..3bdccc8468 100644 --- a/src/net/net.go +++ b/src/net/net.go @@ -282,7 +282,7 @@ func (c *conn) SetWriteBuffer(bytes int) error { return nil } -// File returns a copy of the underlying os.File +// File returns a copy of the underlying os.File. // It is the caller's responsibility to close f when finished. // Closing c does not affect f, and closing f does not affect c. // -- GitLab From db16de920370892b0241d3fa0617dddff2417a4d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 25 Mar 2019 12:34:27 -0700 Subject: [PATCH 0589/1679] runtime: remove kindNoPointers We already have the ptrdata field in a type, which encodes exactly the same information that kindNoPointers does. My problem with kindNoPointers is that it often leads to double-negative code like: t.kind & kindNoPointers != 0 Much clearer is: t.ptrdata == 0 Update #27167 Change-Id: I92307d7f018a6bbe3daca4a4abb4225e359349b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/169157 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/reflect.go | 3 --- src/cmd/internal/objabi/typekind.go | 1 - src/internal/reflectlite/type.go | 1 - src/reflect/export_test.go | 2 +- src/reflect/swapper.go | 2 +- src/reflect/type.go | 35 ++++++-------------------- src/runtime/cgocall.go | 4 +-- src/runtime/cgocheck.go | 6 ++--- src/runtime/chan.go | 2 +- src/runtime/heapdump.go | 2 +- src/runtime/malloc.go | 2 +- src/runtime/map.go | 12 ++++----- src/runtime/map_fast32.go | 8 +++--- src/runtime/map_fast64.go | 8 +++--- src/runtime/map_faststr.go | 4 +-- src/runtime/mbarrier.go | 16 ++++++------ src/runtime/mbitmap.go | 2 +- src/runtime/mfinal.go | 2 +- src/runtime/slice.go | 2 +- src/runtime/typekind.go | 1 - 20 files changed, 44 insertions(+), 71 deletions(-) diff --git a/src/cmd/compile/internal/gc/reflect.go b/src/cmd/compile/internal/gc/reflect.go index 03fbbb123d..e39509a595 100644 --- a/src/cmd/compile/internal/gc/reflect.go +++ b/src/cmd/compile/internal/gc/reflect.go @@ -882,9 +882,6 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int { ot = duint8(lsym, ot, t.Align) // fieldAlign i = kinds[t.Etype] - if !types.Haspointers(t) { - i |= objabi.KindNoPointers - } if isdirectiface(t) { i |= objabi.KindDirectIface } diff --git a/src/cmd/internal/objabi/typekind.go b/src/cmd/internal/objabi/typekind.go index f0e6f472e5..990ff1888d 100644 --- a/src/cmd/internal/objabi/typekind.go +++ b/src/cmd/internal/objabi/typekind.go @@ -36,6 +36,5 @@ const ( KindUnsafePointer KindDirectIface = 1 << 5 KindGCProg = 1 << 6 - KindNoPointers = 1 << 7 KindMask = (1 << 5) - 1 ) diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go index 9767ffbd0d..faecb8755d 100644 --- a/src/internal/reflectlite/type.go +++ b/src/internal/reflectlite/type.go @@ -370,7 +370,6 @@ func (n name) pkgPath() string { const ( kindDirectIface = 1 << 5 kindGCProg = 1 << 6 // Type.gc points to GC program - kindNoPointers = 1 << 7 kindMask = (1 << 5) - 1 ) diff --git a/src/reflect/export_test.go b/src/reflect/export_test.go index 3c47d6712f..1c78570110 100644 --- a/src/reflect/export_test.go +++ b/src/reflect/export_test.go @@ -40,7 +40,7 @@ func FuncLayout(t Type, rcvr Type) (frametype Type, argSize, retOffset uintptr, for i := uintptr(0); i < ft.ptrdata/ptrSize; i++ { gc = append(gc, gcdata[i/8]>>(i%8)&1) } - ptrs = ft.kind&kindNoPointers == 0 + ptrs = ft.ptrdata != 0 return } diff --git a/src/reflect/swapper.go b/src/reflect/swapper.go index bf77b682c4..016f95d7b0 100644 --- a/src/reflect/swapper.go +++ b/src/reflect/swapper.go @@ -29,7 +29,7 @@ func Swapper(slice interface{}) func(i, j int) { typ := v.Type().Elem().(*rtype) size := typ.Size() - hasPtr := typ.kind&kindNoPointers == 0 + hasPtr := typ.ptrdata != 0 // Some common & small cases, without using memmove: if hasPtr { diff --git a/src/reflect/type.go b/src/reflect/type.go index b1df4f22fc..aeb0edc6d1 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -586,7 +586,6 @@ type Method struct { const ( kindDirectIface = 1 << 5 kindGCProg = 1 << 6 // Type.gc points to GC program - kindNoPointers = 1 << 7 kindMask = (1 << 5) - 1 ) @@ -782,7 +781,7 @@ func (t *rtype) FieldAlign() int { return int(t.fieldAlign) } func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) } -func (t *rtype) pointers() bool { return t.kind&kindNoPointers == 0 } +func (t *rtype) pointers() bool { return t.ptrdata != 0 } func (t *rtype) common() *rtype { return t } @@ -2156,13 +2155,6 @@ const ( ) func bucketOf(ktyp, etyp *rtype) *rtype { - // See comment on hmap.overflow in ../runtime/map.go. - var kind uint8 - if ktyp.kind&kindNoPointers != 0 && etyp.kind&kindNoPointers != 0 && - ktyp.size <= maxKeySize && etyp.size <= maxValSize { - kind = kindNoPointers - } - if ktyp.size > maxKeySize { ktyp = PtrTo(ktyp).(*rtype) } @@ -2189,12 +2181,12 @@ func bucketOf(ktyp, etyp *rtype) *rtype { panic("reflect: bad size computation in MapOf") } - if kind != kindNoPointers { + if ktyp.ptrdata != 0 || etyp.ptrdata != 0 { nptr := (bucketSize*(1+ktyp.size+etyp.size) + ptrSize) / ptrSize mask := make([]byte, (nptr+7)/8) base := bucketSize / ptrSize - if ktyp.kind&kindNoPointers == 0 { + if ktyp.ptrdata != 0 { if ktyp.kind&kindGCProg != 0 { panic("reflect: unexpected GC program in MapOf") } @@ -2210,7 +2202,7 @@ func bucketOf(ktyp, etyp *rtype) *rtype { } base += bucketSize * ktyp.size / ptrSize - if etyp.kind&kindNoPointers == 0 { + if etyp.ptrdata != 0 { if etyp.kind&kindGCProg != 0 { panic("reflect: unexpected GC program in MapOf") } @@ -2241,7 +2233,7 @@ func bucketOf(ktyp, etyp *rtype) *rtype { b := &rtype{ align: ptrSize, size: size, - kind: kind, + kind: uint8(Struct), ptrdata: ptrdata, gcdata: gcdata, } @@ -2349,7 +2341,6 @@ func StructOf(fields []StructField) Type { repr = make([]byte, 0, 64) fset = map[string]struct{}{} // fields' names - hasPtr = false // records whether at least one struct-field is a pointer hasGCProg = false // records whether a struct-field type has a GCProg ) @@ -2370,9 +2361,6 @@ func StructOf(fields []StructField) Type { if ft.kind&kindGCProg != 0 { hasGCProg = true } - if ft.pointers() { - hasPtr = true - } // Update string and hash name := f.name.name() @@ -2657,11 +2645,6 @@ func StructOf(fields []StructField) Type { if len(methods) > 0 { typ.tflag |= tflagUncommon } - if !hasPtr { - typ.kind |= kindNoPointers - } else { - typ.kind &^= kindNoPointers - } if hasGCProg { lastPtrField := 0 @@ -2869,11 +2852,9 @@ func ArrayOf(count int, elem Type) Type { array.len = uintptr(count) array.slice = SliceOf(elem).(*rtype) - array.kind &^= kindNoPointers switch { - case typ.kind&kindNoPointers != 0 || array.size == 0: + case typ.ptrdata == 0 || array.size == 0: // No pointers. - array.kind |= kindNoPointers array.gcdata = nil array.ptrdata = 0 @@ -3087,8 +3068,6 @@ func funcLayout(t *funcType, rcvr *rtype) (frametype *rtype, argSize, retOffset } if ptrmap.n > 0 { x.gcdata = &ptrmap.data[0] - } else { - x.kind |= kindNoPointers } var s string @@ -3135,7 +3114,7 @@ func (bv *bitVector) append(bit uint8) { } func addTypeBits(bv *bitVector, offset uintptr, t *rtype) { - if t.kind&kindNoPointers != 0 { + if t.ptrdata == 0 { return } diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go index 85b6c8289a..123607247a 100644 --- a/src/runtime/cgocall.go +++ b/src/runtime/cgocall.go @@ -460,7 +460,7 @@ const cgoResultFail = "cgo result has Go pointer" // depending on indir. The top parameter is whether we are at the top // level, where Go pointers are allowed. func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) { - if t.kind&kindNoPointers != 0 { + if t.ptrdata == 0 { // If the type has no pointers there is nothing to do. return } @@ -523,7 +523,7 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool, msg string) { if !top { panic(errorString(msg)) } - if st.elem.kind&kindNoPointers != 0 { + if st.elem.ptrdata == 0 { return } for i := 0; i < s.cap; i++ { diff --git a/src/runtime/cgocheck.go b/src/runtime/cgocheck.go index 7f3c4aa803..ed854e5e2b 100644 --- a/src/runtime/cgocheck.go +++ b/src/runtime/cgocheck.go @@ -64,7 +64,7 @@ func cgoCheckWriteBarrier(dst *uintptr, src uintptr) { //go:nosplit //go:nowritebarrier func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer, off, size uintptr) { - if typ.kind&kindNoPointers != 0 { + if typ.ptrdata == 0 { return } if !cgoIsGoPointer(src) { @@ -83,7 +83,7 @@ func cgoCheckMemmove(typ *_type, dst, src unsafe.Pointer, off, size uintptr) { //go:nosplit //go:nowritebarrier func cgoCheckSliceCopy(typ *_type, dst, src slice, n int) { - if typ.kind&kindNoPointers != 0 { + if typ.ptrdata == 0 { return } if !cgoIsGoPointer(src.array) { @@ -203,7 +203,7 @@ func cgoCheckBits(src unsafe.Pointer, gcbits *byte, off, size uintptr) { //go:nowritebarrier //go:systemstack func cgoCheckUsingType(typ *_type, src unsafe.Pointer, off, size uintptr) { - if typ.kind&kindNoPointers != 0 { + if typ.ptrdata == 0 { return } diff --git a/src/runtime/chan.go b/src/runtime/chan.go index 389bf799e2..8194457434 100644 --- a/src/runtime/chan.go +++ b/src/runtime/chan.go @@ -95,7 +95,7 @@ func makechan(t *chantype, size int) *hchan { c = (*hchan)(mallocgc(hchanSize, nil, true)) // Race detector uses this location for synchronization. c.buf = c.raceaddr() - case elem.kind&kindNoPointers != 0: + case elem.ptrdata == 0: // Elements do not contain pointers. // Allocate hchan and buf in one call. c = (*hchan)(mallocgc(hchanSize+mem, nil, true)) diff --git a/src/runtime/heapdump.go b/src/runtime/heapdump.go index ca56708a04..992df6391e 100644 --- a/src/runtime/heapdump.go +++ b/src/runtime/heapdump.go @@ -195,7 +195,7 @@ func dumptype(t *_type) { dwritebyte('.') dwrite(name.str, uintptr(name.len)) } - dumpbool(t.kind&kindDirectIface == 0 || t.kind&kindNoPointers == 0) + dumpbool(t.kind&kindDirectIface == 0 || t.ptrdata != 0) } // dump an object diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index be3a9bd26f..9feec1b007 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -858,7 +858,7 @@ func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { dataSize := size c := gomcache() var x unsafe.Pointer - noscan := typ == nil || typ.kind&kindNoPointers != 0 + noscan := typ == nil || typ.ptrdata == 0 if size <= maxSmallSize { if noscan && size < maxTinySize { // Tiny allocator. diff --git a/src/runtime/map.go b/src/runtime/map.go index 9c25b63348..0ebbf2ae76 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -264,7 +264,7 @@ func (h *hmap) newoverflow(t *maptype, b *bmap) *bmap { ovf = (*bmap)(newobject(t.bucket)) } h.incrnoverflow() - if t.bucket.kind&kindNoPointers != 0 { + if t.bucket.ptrdata == 0 { h.createOverflow() *h.extra.overflow = append(*h.extra.overflow, ovf) } @@ -368,7 +368,7 @@ func makeBucketArray(t *maptype, b uint8, dirtyalloc unsafe.Pointer) (buckets un // but may not be empty. buckets = dirtyalloc size := t.bucket.size * nbuckets - if t.bucket.kind&kindNoPointers == 0 { + if t.bucket.ptrdata != 0 { memclrHasPointers(buckets, size) } else { memclrNoHeapPointers(buckets, size) @@ -742,13 +742,13 @@ search: // Only clear key if there are pointers in it. if t.indirectkey() { *(*unsafe.Pointer)(k) = nil - } else if t.key.kind&kindNoPointers == 0 { + } else if t.key.ptrdata != 0 { memclrHasPointers(k, t.key.size) } v := add(unsafe.Pointer(b), dataOffset+bucketCnt*uintptr(t.keysize)+i*uintptr(t.valuesize)) if t.indirectvalue() { *(*unsafe.Pointer)(v) = nil - } else if t.elem.kind&kindNoPointers == 0 { + } else if t.elem.ptrdata != 0 { memclrHasPointers(v, t.elem.size) } else { memclrNoHeapPointers(v, t.elem.size) @@ -820,7 +820,7 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) { // grab snapshot of bucket state it.B = h.B it.buckets = h.buckets - if t.bucket.kind&kindNoPointers != 0 { + if t.bucket.ptrdata == 0 { // Allocate the current slice and remember pointers to both current and old. // This preserves all relevant overflow buckets alive even if // the table grows and/or overflow buckets are added to the table @@ -1232,7 +1232,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) { } } // Unlink the overflow buckets & clear key/value to help GC. - if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 { + if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 { b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)) // Preserve b.tophash because the evacuation // state is maintained there. diff --git a/src/runtime/map_fast32.go b/src/runtime/map_fast32.go index 20f55e17c6..fc72f583fa 100644 --- a/src/runtime/map_fast32.go +++ b/src/runtime/map_fast32.go @@ -299,11 +299,11 @@ search: continue } // Only clear key if there are pointers in it. - if t.key.kind&kindNoPointers == 0 { + if t.key.ptrdata != 0 { memclrHasPointers(k, t.key.size) } v := add(unsafe.Pointer(b), dataOffset+bucketCnt*4+i*uintptr(t.valuesize)) - if t.elem.kind&kindNoPointers == 0 { + if t.elem.ptrdata != 0 { memclrHasPointers(v, t.elem.size) } else { memclrNoHeapPointers(v, t.elem.size) @@ -418,7 +418,7 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) { dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check // Copy key. - if sys.PtrSize == 4 && t.key.kind&kindNoPointers == 0 && writeBarrier.enabled { + if sys.PtrSize == 4 && t.key.ptrdata != 0 && writeBarrier.enabled { // Write with a write barrier. *(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k) } else { @@ -436,7 +436,7 @@ func evacuate_fast32(t *maptype, h *hmap, oldbucket uintptr) { } } // Unlink the overflow buckets & clear key/value to help GC. - if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 { + if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 { b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)) // Preserve b.tophash because the evacuation // state is maintained there. diff --git a/src/runtime/map_fast64.go b/src/runtime/map_fast64.go index e00a7569f9..03115197f3 100644 --- a/src/runtime/map_fast64.go +++ b/src/runtime/map_fast64.go @@ -299,11 +299,11 @@ search: continue } // Only clear key if there are pointers in it. - if t.key.kind&kindNoPointers == 0 { + if t.key.ptrdata != 0 { memclrHasPointers(k, t.key.size) } v := add(unsafe.Pointer(b), dataOffset+bucketCnt*8+i*uintptr(t.valuesize)) - if t.elem.kind&kindNoPointers == 0 { + if t.elem.ptrdata != 0 { memclrHasPointers(v, t.elem.size) } else { memclrNoHeapPointers(v, t.elem.size) @@ -418,7 +418,7 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) { dst.b.tophash[dst.i&(bucketCnt-1)] = top // mask dst.i as an optimization, to avoid a bounds check // Copy key. - if t.key.kind&kindNoPointers == 0 && writeBarrier.enabled { + if t.key.ptrdata != 0 && writeBarrier.enabled { if sys.PtrSize == 8 { // Write with a write barrier. *(*unsafe.Pointer)(dst.k) = *(*unsafe.Pointer)(k) @@ -442,7 +442,7 @@ func evacuate_fast64(t *maptype, h *hmap, oldbucket uintptr) { } } // Unlink the overflow buckets & clear key/value to help GC. - if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 { + if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 { b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)) // Preserve b.tophash because the evacuation // state is maintained there. diff --git a/src/runtime/map_faststr.go b/src/runtime/map_faststr.go index 2eac2b5bb5..504a3a1d5f 100644 --- a/src/runtime/map_faststr.go +++ b/src/runtime/map_faststr.go @@ -332,7 +332,7 @@ search: // Clear key's pointer. k.str = nil v := add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)) - if t.elem.kind&kindNoPointers == 0 { + if t.elem.ptrdata != 0 { memclrHasPointers(v, t.elem.size) } else { memclrNoHeapPointers(v, t.elem.size) @@ -461,7 +461,7 @@ func evacuate_faststr(t *maptype, h *hmap, oldbucket uintptr) { } // Unlink the overflow buckets & clear key/value to help GC. // Unlink the overflow buckets & clear key/value to help GC. - if h.flags&oldIterator == 0 && t.bucket.kind&kindNoPointers == 0 { + if h.flags&oldIterator == 0 && t.bucket.ptrdata != 0 { b := add(h.oldbuckets, oldbucket*uintptr(t.bucketsize)) // Preserve b.tophash because the evacuation // state is maintained there. diff --git a/src/runtime/mbarrier.go b/src/runtime/mbarrier.go index c0bd236313..df3ab6fc3c 100644 --- a/src/runtime/mbarrier.go +++ b/src/runtime/mbarrier.go @@ -157,7 +157,7 @@ func typedmemmove(typ *_type, dst, src unsafe.Pointer) { if dst == src { return } - if typ.kind&kindNoPointers == 0 { + if typ.ptrdata != 0 { bulkBarrierPreWrite(uintptr(dst), uintptr(src), typ.size) } // There's a race here: if some other goroutine can write to @@ -195,7 +195,7 @@ func reflectlite_typedmemmove(typ *_type, dst, src unsafe.Pointer) { // dst and src point off bytes into the value and only copies size bytes. //go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) { - if writeBarrier.needed && typ.kind&kindNoPointers == 0 && size >= sys.PtrSize { + if writeBarrier.needed && typ.ptrdata != 0 && size >= sys.PtrSize { // Pointer-align start address for bulk barrier. adst, asrc, asize := dst, src, size if frag := -off & (sys.PtrSize - 1); frag != 0 { @@ -223,7 +223,7 @@ func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size // //go:nosplit func reflectcallmove(typ *_type, dst, src unsafe.Pointer, size uintptr) { - if writeBarrier.needed && typ != nil && typ.kind&kindNoPointers == 0 && size >= sys.PtrSize { + if writeBarrier.needed && typ != nil && typ.ptrdata != 0 && size >= sys.PtrSize { bulkBarrierPreWrite(uintptr(dst), uintptr(src), size) } memmove(dst, src, size) @@ -264,7 +264,7 @@ func typedslicecopy(typ *_type, dst, src slice) int { return n } - // Note: No point in checking typ.kind&kindNoPointers here: + // Note: No point in checking typ.ptrdata here: // compiler only emits calls to typedslicecopy for types with pointers, // and growslice and reflect_typedslicecopy check for pointers // before calling typedslicecopy. @@ -280,7 +280,7 @@ func typedslicecopy(typ *_type, dst, src slice) int { //go:linkname reflect_typedslicecopy reflect.typedslicecopy func reflect_typedslicecopy(elemType *_type, dst, src slice) int { - if elemType.kind&kindNoPointers != 0 { + if elemType.ptrdata == 0 { n := dst.len if n > src.len { n = src.len @@ -317,7 +317,7 @@ func reflect_typedslicecopy(elemType *_type, dst, src slice) int { // //go:nosplit func typedmemclr(typ *_type, ptr unsafe.Pointer) { - if typ.kind&kindNoPointers == 0 { + if typ.ptrdata != 0 { bulkBarrierPreWrite(uintptr(ptr), 0, typ.size) } memclrNoHeapPointers(ptr, typ.size) @@ -330,7 +330,7 @@ func reflect_typedmemclr(typ *_type, ptr unsafe.Pointer) { //go:linkname reflect_typedmemclrpartial reflect.typedmemclrpartial func reflect_typedmemclrpartial(typ *_type, ptr unsafe.Pointer, off, size uintptr) { - if typ.kind&kindNoPointers == 0 { + if typ.ptrdata != 0 { bulkBarrierPreWrite(uintptr(ptr), 0, size) } memclrNoHeapPointers(ptr, size) @@ -338,7 +338,7 @@ func reflect_typedmemclrpartial(typ *_type, ptr unsafe.Pointer, off, size uintpt // memclrHasPointers clears n bytes of typed memory starting at ptr. // The caller must ensure that the type of the object at ptr has -// pointers, usually by checking typ.kind&kindNoPointers. However, ptr +// pointers, usually by checking typ.ptrdata. However, ptr // does not have to point to the start of the allocation. // //go:nosplit diff --git a/src/runtime/mbitmap.go b/src/runtime/mbitmap.go index 2f00add83e..6fcdea1538 100644 --- a/src/runtime/mbitmap.go +++ b/src/runtime/mbitmap.go @@ -581,7 +581,7 @@ func (h heapBits) setCheckmarked(size uintptr) { // The pointer bitmap is not maintained for allocations containing // no pointers at all; any caller of bulkBarrierPreWrite must first // make sure the underlying allocation contains pointers, usually -// by checking typ.kind&kindNoPointers. +// by checking typ.ptrdata. // // Callers must perform cgo checks if writeBarrier.cgo. // diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go index a8c51e3e02..37b2c381dd 100644 --- a/src/runtime/mfinal.go +++ b/src/runtime/mfinal.go @@ -356,7 +356,7 @@ func SetFinalizer(obj interface{}, finalizer interface{}) { if uintptr(e.data) != base { // As an implementation detail we allow to set finalizers for an inner byte // of an object if it could come from tiny alloc (see mallocgc for details). - if ot.elem == nil || ot.elem.kind&kindNoPointers == 0 || ot.elem.size >= maxTinySize { + if ot.elem == nil || ot.elem.ptrdata != 0 || ot.elem.size >= maxTinySize { throw("runtime.SetFinalizer: pointer not at beginning of allocated block") } } diff --git a/src/runtime/slice.go b/src/runtime/slice.go index dca41ff8cd..79cfc69c54 100644 --- a/src/runtime/slice.go +++ b/src/runtime/slice.go @@ -171,7 +171,7 @@ func growslice(et *_type, old slice, cap int) slice { } var p unsafe.Pointer - if et.kind&kindNoPointers != 0 { + if et.ptrdata == 0 { p = mallocgc(capmem, nil, false) // The append() that calls growslice is going to overwrite from old.len to cap (which will be the new length). // Only clear the part that will not be overwritten. diff --git a/src/runtime/typekind.go b/src/runtime/typekind.go index abb27777fe..7087a9b046 100644 --- a/src/runtime/typekind.go +++ b/src/runtime/typekind.go @@ -34,7 +34,6 @@ const ( kindDirectIface = 1 << 5 kindGCProg = 1 << 6 - kindNoPointers = 1 << 7 kindMask = (1 << 5) - 1 ) -- GitLab From 50fe9461eb551d3df340c36fb3f24f9faf461422 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Tue, 26 Mar 2019 07:16:53 +1100 Subject: [PATCH 0590/1679] fmt: fix spelling mistake in example Mea culpa. Beat Takeshi, sumimasen. Fixes #31023. Change-Id: Ie2f27a5867724a8a1b8c3082c3389c8fd6d1dee7 Reviewed-on: https://go-review.googlesource.com/c/go/+/168861 Reviewed-by: Brad Fitzpatrick --- src/fmt/example_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fmt/example_test.go b/src/fmt/example_test.go index 56ce47f836..5962834226 100644 --- a/src/fmt/example_test.go +++ b/src/fmt/example_test.go @@ -321,13 +321,13 @@ func Example_formats() { // Result: &{Kim 22} 0x010203 // See comment above. // Arrays and slices are formatted by applying the format to each element. - greats := [5]string{"Katano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"} + greats := [5]string{"Kitano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"} fmt.Printf("%v %q\n", greats, greats) - // Result: [Katano Kobayashi Kurosawa Miyazaki Ozu] ["Katano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] + // Result: [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] kGreats := greats[:3] fmt.Printf("%v %q %#v\n", kGreats, kGreats, kGreats) - // Result: [Katano Kobayashi Kurosawa] ["Katano" "Kobayashi" "Kurosawa"] []string{"Katano", "Kobayashi", "Kurosawa"} + // Result: [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} // Byte slices are special. Integer verbs like %d print the elements in // that format. The %s and %q forms treat the slice like a string. The %x @@ -358,8 +358,8 @@ func Example_formats() { // map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true} // {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22} // &{Kim 22} 0x0 - // [Katano Kobayashi Kurosawa Miyazaki Ozu] ["Katano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] - // [Katano Kobayashi Kurosawa] ["Katano" "Kobayashi" "Kurosawa"] []string{"Katano", "Kobayashi", "Kurosawa"} + // [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] + // [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} // [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98 // 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC" } -- GitLab From e6df1799791fac7262effe4464bd5c82bbb275cb Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 25 Mar 2019 21:36:31 +0000 Subject: [PATCH 0591/1679] cmd/dist: move GOPATH setting from init to bootstrap CL 168697 unconditionally set GOPATH in dist, which broke the misc-vet-vetall builder, because cmd/vet/all depends on GOPATH. Fixes #30971 Change-Id: If6a58e054c6a4fedc2ea506a2c443348489c91f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/169217 Run-TryBot: Brad Fitzpatrick Reviewed-by: Jay Conrod --- src/cmd/dist/build.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index b724d16456..e5d4b2458a 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -235,13 +235,6 @@ func xinit() { // make.bash really does start from a clean slate. os.Setenv("GOCACHE", pathf("%s/pkg/obj/go-build", goroot)) - // Set GOPATH to an internal directory. We shouldn't actually - // need to store files here, since the toolchain won't - // depend on modules outside of vendor directories, but if - // GOPATH points somewhere else (e.g., to GOROOT), the - // go tool may complain. - os.Setenv("GOPATH", pathf("%s/pkg/obj/gopath", goroot)) - // Make the environment more predictable. os.Setenv("LANG", "C") os.Setenv("LANGUAGE", "en_US.UTF8") @@ -1211,6 +1204,13 @@ func cmdbootstrap() { xflagparse(0) + // Set GOPATH to an internal directory. We shouldn't actually + // need to store files here, since the toolchain won't + // depend on modules outside of vendor directories, but if + // GOPATH points somewhere else (e.g., to GOROOT), the + // go tool may complain. + os.Setenv("GOPATH", pathf("%s/pkg/obj/gopath", goroot)) + if debug { // cmd/buildid is used in debug mode. toolchain = append(toolchain, "cmd/buildid") -- GitLab From a591fd08dd30de0e22e759df0fcff961fb3d32d8 Mon Sep 17 00:00:00 2001 From: Caleb Spare Date: Mon, 25 Mar 2019 13:27:34 -0700 Subject: [PATCH 0592/1679] testing: correct two spelling/grammar issues Change-Id: Ic7f7a34e12cc2845e0385a5a872e694d5dca7372 Reviewed-on: https://go-review.googlesource.com/c/go/+/169158 Reviewed-by: Brad Fitzpatrick --- src/testing/benchmark.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/testing/benchmark.go b/src/testing/benchmark.go index 6dcfcb02c7..cc22bdd2b5 100644 --- a/src/testing/benchmark.go +++ b/src/testing/benchmark.go @@ -135,7 +135,7 @@ func (b *B) StopTimer() { } } -// ResetTimer zeros the elapsed benchmark time and memory allocation counters +// ResetTimer zeroes the elapsed benchmark time and memory allocation counters // and deletes user-reported metrics. // It does not affect whether the timer is running. func (b *B) ResetTimer() { @@ -752,7 +752,7 @@ func (b *B) SetParallelism(p int) { } } -// Benchmark benchmarks a single function. Useful for creating +// Benchmark benchmarks a single function. It is useful for creating // custom benchmarks that do not use the "go test" command. // // If f calls Run, the result will be an estimate of running all its -- GitLab From e4ba40030f9ba4b61bb28dbf78bb41a7b14e6788 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 18 Mar 2019 16:10:07 -0700 Subject: [PATCH 0593/1679] math/big: accept non-decimal floats with Rat.SetString This fixes an old oversight. Rat.SetString already permitted fractions a/b where both a and b could independently specify a base prefix. With this CL, it now also accepts non-decimal floating-point numbers. Fixes #29799. Change-Id: I9cc65666a5cebb00f0202da2e4fc5654a02e3234 Reviewed-on: https://go-review.googlesource.com/c/go/+/168237 Reviewed-by: Emmanuel Odeke --- src/math/big/floatconv.go | 14 ++-- src/math/big/nat.go | 7 +- src/math/big/ratconv.go | 124 ++++++++++++++++++++++++++++------- src/math/big/ratconv_test.go | 26 +++++++- 4 files changed, 133 insertions(+), 38 deletions(-) diff --git a/src/math/big/floatconv.go b/src/math/big/floatconv.go index 88216f5600..95e32d3319 100644 --- a/src/math/big/floatconv.go +++ b/src/math/big/floatconv.go @@ -70,8 +70,8 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) { } // len(z.mant) > 0 - // The mantissa may have a decimal point (fcount <= 0) and there - // may be a nonzero exponent exp. The decimal point amounts to a + // The mantissa may have a radix point (fcount <= 0) and there + // may be a nonzero exponent exp. The radix point amounts to a // division by b**(-fcount). An exponent means multiplication by // ebase**exp. Finally, mantissa normalization (shift left) requires // a correcting multiplication by 2**(-shiftcount). Multiplications @@ -85,11 +85,11 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) { exp2 := int64(len(z.mant))*_W - fnorm(z.mant) exp5 := int64(0) - // determine binary or decimal exponent contribution of decimal point + // determine binary or decimal exponent contribution of radix point if fcount < 0 { - // The mantissa has a "decimal" point ddd.dddd; and - // -fcount is the number of digits to the right of '.'. - // Adjust relevant exponent accordingly. + // The mantissa has a radix point ddd.dddd; and + // -fcount is the number of digits to the right + // of '.'. Adjust relevant exponent accordingly. d := int64(fcount) switch b { case 10: @@ -111,7 +111,7 @@ func (z *Float) scan(r io.ByteScanner, base int) (f *Float, b int, err error) { switch ebase { case 10: exp5 += exp - fallthrough + fallthrough // see fallthrough above case 2: exp2 += exp default: diff --git a/src/math/big/nat.go b/src/math/big/nat.go index 336633a2fa..22d7a6cac0 100644 --- a/src/math/big/nat.go +++ b/src/math/big/nat.go @@ -35,9 +35,10 @@ import ( type nat []Word var ( - natOne = nat{1} - natTwo = nat{2} - natTen = nat{10} + natOne = nat{1} + natTwo = nat{2} + natFive = nat{5} + natTen = nat{10} ) func (z nat) clear() { diff --git a/src/math/big/ratconv.go b/src/math/big/ratconv.go index 07288ca94f..3ea03d5c61 100644 --- a/src/math/big/ratconv.go +++ b/src/math/big/ratconv.go @@ -38,10 +38,22 @@ func (z *Rat) Scan(s fmt.ScanState, ch rune) error { } // SetString sets z to the value of s and returns z and a boolean indicating -// success. s can be given as a fraction "a/b" or as a decimal floating-point -// number optionally followed by an exponent. The entire string (not just a prefix) -// must be valid for success. If the operation failed, the value of z is -// undefined but the returned value is nil. +// success. s can be given as a (possibly signed) fraction "a/b", or as a +// floating-point number optionally followed by an exponent. +// If a fraction is provided, both the dividend and the divisor may be a +// decimal integer or independently use a prefix of ``0b'', ``0'' or ``0o'', +// or ``0x'' (or their upper-case variants) to denote a binary, octal, or +// hexadecimal integer, respectively. The divisor may not be signed. +// If a floating-point number is provided, it may be in decimal form or +// use any of the same prefixes as above but for ``0'' to denote a non-decimal +// mantissa. A leading ``0'' is considered a decimal leading 0; it does not +// indicate octal representation in this case. +// An optional base-10 ``e'' or base-2 ``p'' (or their upper-case variants) +// exponent may be provided as well, except for hexadecimal floats which +// only accept an (optional) ``p'' exponent (because an ``e'' or ``E'' cannot +// be distinguished from a mantissa digit). +// The entire string, not just a prefix, must be valid for success. If the +// operation failed, the value of z is undefined but the returned value is nil. func (z *Rat) SetString(s string) (*Rat, bool) { if len(s) == 0 { return nil, false @@ -78,16 +90,17 @@ func (z *Rat) SetString(s string) (*Rat, bool) { } // mantissa - // TODO(gri) allow other bases besides 10 for mantissa and exponent? (issue #29799) - var ecorr int - z.a.abs, _, ecorr, err = z.a.abs.scan(r, 10, true) + var base int + var fcount int // fractional digit count; valid if <= 0 + z.a.abs, base, fcount, err = z.a.abs.scan(r, 0, true) if err != nil { return nil, false } // exponent var exp int64 - exp, _, err = scanExponent(r, false, false) + var ebase int + exp, ebase, err = scanExponent(r, true, true) if err != nil { return nil, false } @@ -103,30 +116,91 @@ func (z *Rat) SetString(s string) (*Rat, bool) { } // len(z.a.abs) > 0 - // correct exponent - if ecorr < 0 { - exp += int64(ecorr) + // The mantissa may have a radix point (fcount <= 0) and there + // may be a nonzero exponent exp. The radix point amounts to a + // division by base**(-fcount), which equals a multiplication by + // base**fcount. An exponent means multiplication by ebase**exp. + // Multiplications are commutative, so we can apply them in any + // order. We only have powers of 2 and 10, and we split powers + // of 10 into the product of the same powers of 2 and 5. This + // may reduce the the size of shift/multiplication factors or + // divisors required to create the final fraction, depending + // on the actual floating-point value. + + // determine binary or decimal exponent contribution of radix point + var exp2, exp5 int64 + if fcount < 0 { + // The mantissa has a radix point ddd.dddd; and + // -fcount is the number of digits to the right + // of '.'. Adjust relevant exponent accordingly. + d := int64(fcount) + switch base { + case 10: + exp5 = d + fallthrough // 10**e == 5**e * 2**e + case 2: + exp2 = d + case 8: + exp2 = d * 3 // octal digits are 3 bits each + case 16: + exp2 = d * 4 // hexadecimal digits are 4 bits each + default: + panic("unexpected mantissa base") + } + // fcount consumed - not needed anymore } - // compute exponent power - expabs := exp - if expabs < 0 { - expabs = -expabs + // take actual exponent into account + switch ebase { + case 10: + exp5 += exp + fallthrough // see fallthrough above + case 2: + exp2 += exp + default: + panic("unexpected exponent base") + } + // exp consumed - not needed anymore + + // compute pow5 if needed + pow5 := z.b.abs + if exp5 != 0 { + n := exp5 + if n < 0 { + n = -n + } + pow5 = pow5.expNN(natFive, nat(nil).setWord(Word(n)), nil) } - powTen := nat(nil).expNN(natTen, nat(nil).setWord(Word(expabs)), nil) - // complete fraction - if exp < 0 { - z.b.abs = powTen - z.norm() - } else { - z.a.abs = z.a.abs.mul(z.a.abs, powTen) - z.b.abs = z.b.abs[:0] + // apply dividend contributions of exponents + // (start with exp5 so the numbers to multiply are smaller) + if exp5 > 0 { + z.a.abs = z.a.abs.mul(z.a.abs, pow5) + exp5 = 0 + } + if exp2 > 0 { + if int64(uint(exp2)) != exp2 { + panic("exponent too large") + } + z.a.abs = z.a.abs.shl(z.a.abs, uint(exp2)) + exp2 = 0 + } + + // apply divisor contributions of exponents + z.b.abs = z.b.abs.setWord(1) + if exp5 < 0 { + z.b.abs = pow5 + } + if exp2 < 0 { + if int64(uint(-exp2)) != -exp2 { + panic("exponent too large") + } + z.b.abs = z.b.abs.shl(z.b.abs, uint(-exp2)) } z.a.neg = neg && len(z.a.abs) > 0 // 0 has no sign - return z, true + return z.norm(), true } // scanExponent scans the longest possible prefix of r representing a base 10 @@ -250,7 +324,7 @@ func (x *Rat) RatString() string { } // FloatString returns a string representation of x in decimal form with prec -// digits of precision after the decimal point. The last digit is rounded to +// digits of precision after the radix point. The last digit is rounded to // nearest, with halves rounded away from zero. func (x *Rat) FloatString(prec int) string { var buf []byte diff --git a/src/math/big/ratconv_test.go b/src/math/big/ratconv_test.go index dea4d1933a..87ee9fa972 100644 --- a/src/math/big/ratconv_test.go +++ b/src/math/big/ratconv_test.go @@ -135,29 +135,49 @@ var setStringTests = []StringTest{ var setStringTests2 = []StringTest{ // invalid {in: "4/3x"}, + {in: "0/-1"}, + {in: "-1/-1"}, // invalid with separators // (smoke tests only - a comprehensive set of tests is in natconv_test.go) {in: "10_/1"}, {in: "_10/1"}, {in: "1/1__0"}, - {in: "1_000.0"}, // floats are base 10 which doesn't permit separators; see also issue #29799 // valid {"0b1000/3", "8/3", true}, {"0B1000/0x8", "1", true}, - {"-010/1", "-8", true}, - {"-010.", "-10", true}, + {"-010/1", "-8", true}, // 0-prefix indicates octal in this case + {"-010.0", "-10", true}, {"-0o10/1", "-8", true}, {"0x10/1", "16", true}, {"0x10/0x20", "1/2", true}, + {"0010", "10", true}, // 0-prefix is ignored in this case (not a fraction) + {"0x10.0", "16", true}, + {"0x1.8", "3/2", true}, + {"0X1.8p4", "24", true}, + {"0x1.1E2", "2289/2048", true}, // E is part of hex mantissa, not exponent + {"0b1.1E2", "150", true}, + {"0B1.1P3", "12", true}, + {"0o10e-2", "2/25", true}, + {"0O10p-3", "1", true}, + // valid with separators // (smoke tests only - a comprehensive set of tests is in natconv_test.go) {"0b_1000/3", "8/3", true}, {"0B_10_00/0x8", "1", true}, {"0xdead/0B1101_1110_1010_1101", "1", true}, {"0B1101_1110_1010_1101/0XD_E_A_D", "1", true}, + {"1_000.0", "1000", true}, + + {"0x_10.0", "16", true}, + {"0x1_0.0", "16", true}, + {"0x1.8_0", "3/2", true}, + {"0X1.8p0_4", "24", true}, + {"0b1.1_0E2", "150", true}, + {"0o1_0e-2", "2/25", true}, + {"0O_10p-3", "1", true}, } func TestRatSetString(t *testing.T) { -- GitLab From 270de1c110221c309c832b526012f3e21b35f581 Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Mon, 25 Mar 2019 22:40:27 +0000 Subject: [PATCH 0594/1679] math: use Sincos instead of Sin and Cos in Jn and Yn Change-Id: I0da3857013f1d4e90820fb043314d78924113a27 GitHub-Last-Rev: 7c3d813c6e188a4afda54b736db14370e52b6f94 GitHub-Pull-Request: golang/go#31019 Reviewed-on: https://go-review.googlesource.com/c/go/+/169078 Reviewed-by: Robert Griesemer --- src/math/jn.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/math/jn.go b/src/math/jn.go index 4a8ddfad9b..b1aca8ff6b 100644 --- a/src/math/jn.go +++ b/src/math/jn.go @@ -103,15 +103,15 @@ func Jn(n int, x float64) float64 { // 3 s+c c-s var temp float64 - switch n & 3 { + switch s, c := Sincos(x); n & 3 { case 0: - temp = Cos(x) + Sin(x) + temp = c + s case 1: - temp = -Cos(x) + Sin(x) + temp = -c + s case 2: - temp = -Cos(x) - Sin(x) + temp = -c - s case 3: - temp = Cos(x) - Sin(x) + temp = c - s } b = (1 / SqrtPi) * temp / Sqrt(x) } else { @@ -278,15 +278,15 @@ func Yn(n int, x float64) float64 { // 3 s+c c-s var temp float64 - switch n & 3 { + switch s, c := Sincos(x); n & 3 { case 0: - temp = Sin(x) - Cos(x) + temp = s - c case 1: - temp = -Sin(x) - Cos(x) + temp = -s - c case 2: - temp = -Sin(x) + Cos(x) + temp = -s + c case 3: - temp = Sin(x) + Cos(x) + temp = s + c } b = (1 / SqrtPi) * temp / Sqrt(x) } else { -- GitLab From c4f87ed26ffc17e6cf326d33e49f639d9bf7cf86 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 25 Mar 2019 16:34:19 -0700 Subject: [PATCH 0595/1679] cmd/compile: fix "append outside assignment" ICE Some special-case code paths in order.go didn't expect OCALLFUNC to have Ninit; in particular, OAS2FUNC and ODEFER/OGO failed to call o.init on their child OCALLFUNC node. This resulted in not all of the AST being properly ordered. This was noticed because order is responsible for introducing an invariant around how OAPPEND is used, which is enforced by walk. However, there were perhaps simpler cases (e.g., simple order of evaluation) that were being silently miscompiled. Fixes #31010. Change-Id: Ib928890ab5ec2aebd8e30a030bc2b404387f9123 Reviewed-on: https://go-review.googlesource.com/c/go/+/169257 Run-TryBot: Matthew Dempsky Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/order.go | 6 ++++++ test/fixedbugs/issue31010.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 test/fixedbugs/issue31010.go diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 7b86537a21..aae18ff227 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -383,6 +383,10 @@ func (o *Order) init(n *Node) { // call orders the call expression n. // n.Op is OCALLMETH/OCALLFUNC/OCALLINTER or a builtin like OCOPY. func (o *Order) call(n *Node) { + if n.Ninit.Len() > 0 { + // Caller should have already called o.init(n). + Fatalf("%v with unexpected ninit", n.Op) + } n.Left = o.expr(n.Left, nil) n.Right = o.expr(n.Right, nil) // ODDDARG temp o.exprList(n.List) @@ -578,6 +582,7 @@ func (o *Order) stmt(n *Node) { case OAS2FUNC: t := o.markTemp() o.exprList(n.List) + o.init(n.Rlist.First()) o.call(n.Rlist.First()) o.as2(n) o.cleanTemp(t) @@ -637,6 +642,7 @@ func (o *Order) stmt(n *Node) { // Special: order arguments to inner call but not call itself. case ODEFER, OGO: t := o.markTemp() + o.init(n.Left) o.call(n.Left) o.out = append(o.out, n) o.cleanTemp(t) diff --git a/test/fixedbugs/issue31010.go b/test/fixedbugs/issue31010.go new file mode 100644 index 0000000000..836e85fd12 --- /dev/null +++ b/test/fixedbugs/issue31010.go @@ -0,0 +1,24 @@ +// compile + +// Copyright 2019 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 p + +var ( + x int + xs []int +) + +func a([]int) (int, error) + +func b() (int, error) { + return a(append(xs, x)) +} + +func c(int, error) (int, error) + +func d() (int, error) { + return c(b()) +} -- GitLab From 17f888c5a8479b0915f23c4a9a453430f276c53b Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 25 Mar 2019 19:16:46 -0700 Subject: [PATCH 0596/1679] reflect: fix typeptrdata We can't use ptrdata inside of typeptrdata, because it won't be properly initialized until typeptrdata returns. Fixes #31039 Change-Id: Ib8c89191a7e4cce678a05d351bb6ded81ba23aae Reviewed-on: https://go-review.googlesource.com/c/go/+/169317 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/reflect/type.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/reflect/type.go b/src/reflect/type.go index aeb0edc6d1..10509ac418 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2775,20 +2775,20 @@ func runtimeStructField(field StructField) structField { // containing pointer data. Anything after this offset is scalar data. // keep in sync with ../cmd/compile/internal/gc/reflect.go func typeptrdata(t *rtype) uintptr { - if !t.pointers() { - return 0 - } switch t.Kind() { case Struct: st := (*structType)(unsafe.Pointer(t)) // find the last field that has pointers. - field := 0 + field := -1 for i := range st.fields { ft := st.fields[i].typ if ft.pointers() { field = i } } + if field == -1 { + return 0 + } f := st.fields[field] return f.offset() + f.typ.ptrdata -- GitLab From b7b7b4d6d4304758c15de940c36ab7d063249ef2 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Mon, 25 Mar 2019 20:29:18 -0700 Subject: [PATCH 0597/1679] reflect: initialize ptrdata earlier in StructOf It needs to be set before addTypeBits is called. Fixes #31043 Change-Id: I692b4047dc17bd68202d45da41dd55d432383e59 Reviewed-on: https://go-review.googlesource.com/c/go/+/169318 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/reflect/type.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reflect/type.go b/src/reflect/type.go index 10509ac418..83e59014ed 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -2639,6 +2639,7 @@ func StructOf(fields []StructField) Type { typ.tflag = 0 typ.hash = hash typ.size = size + typ.ptrdata = typeptrdata(typ.common()) typ.align = typalign typ.fieldAlign = typalign typ.ptrToThis = 0 @@ -2709,7 +2710,6 @@ func StructOf(fields []StructField) Type { typ.gcdata = &bv.data[0] } } - typ.ptrdata = typeptrdata(typ.common()) typ.alg = new(typeAlg) if hashable { typ.alg.hash = func(p unsafe.Pointer, seed uintptr) uintptr { -- GitLab From 0ec302c49ee3dd1a7f290db9a326bbfb734e8c35 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 25 Mar 2019 22:57:27 +0000 Subject: [PATCH 0598/1679] cmd: update go.mod versions for vetall bug Updates golang/go#30971 Updates golang/go#31040 Change-Id: I305fbddb6f79cbe3d7e29225841309ab00b1e7dd Reviewed-on: https://go-review.googlesource.com/c/go/+/169239 Run-TryBot: Brad Fitzpatrick Reviewed-by: Dmitri Shuralyov --- src/cmd/go.mod | 6 +- src/cmd/go.sum | 12 ++-- .../x/crypto/ssh/terminal/terminal.go | 67 +++++++++++-------- .../x/sys/windows/syscall_windows.go | 1 + .../golang.org/x/sys/windows/types_windows.go | 16 ++++- .../x/sys/windows/zsyscall_windows.go | 19 ++++++ .../x/tools/go/analysis/passes/tests/tests.go | 44 +++++++----- src/cmd/vendor/modules.txt | 6 +- 8 files changed, 111 insertions(+), 60 deletions(-) diff --git a/src/cmd/go.mod b/src/cmd/go.mod index e0ac8cf6eb..54b527af69 100644 --- a/src/cmd/go.mod +++ b/src/cmd/go.mod @@ -6,7 +6,7 @@ require ( github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44 // indirect golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 - golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a - golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca // indirect - golang.org/x/tools v0.0.0-20190320160634-b6b7807791df + golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c + golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc // indirect + golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04 ) diff --git a/src/cmd/go.sum b/src/cmd/go.sum index 57bb4fa012..dcbcd91338 100644 --- a/src/cmd/go.sum +++ b/src/cmd/go.sum @@ -5,12 +5,12 @@ github.com/ianlancetaylor/demangle v0.0.0-20180524225900-fc6590592b44/go.mod h1: golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045 h1:Pn8fQdvx+z1avAi7fdM2kRYWQNxGlavNDSyzrQg2SsU= golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a h1:YX8ljsm6wXlHZO+aRz9Exqr0evNhKRNe5K/gi+zKh4U= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca h1:o2TLx1bGN3W+Ei0EMU5fShLupLmTOU95KvJJmfYhAzM= -golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc h1:4gbWbmmPFp4ySWICouJl6emP0MyS31yy9SrTlAGFT+g= +golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190320160634-b6b7807791df h1:taFQs++Xc5kswn4bzUZyWI+ShGK1r9pFxQAiVZaRfto= -golang.org/x/tools v0.0.0-20190320160634-b6b7807791df/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04 h1:SRYGE+BqJRgY8JH4p2NmwTPeuREKqKYw5IuEmthTHKQ= +golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= diff --git a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go index 9d666ffcf0..2f04ee5b5c 100644 --- a/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ b/src/cmd/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -7,6 +7,7 @@ package terminal import ( "bytes" "io" + "strconv" "sync" "unicode/utf8" ) @@ -271,34 +272,44 @@ func (t *Terminal) moveCursorToPos(pos int) { } func (t *Terminal) move(up, down, left, right int) { - movement := make([]rune, 3*(up+down+left+right)) - m := movement - for i := 0; i < up; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'A' - m = m[3:] - } - for i := 0; i < down; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'B' - m = m[3:] - } - for i := 0; i < left; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'D' - m = m[3:] - } - for i := 0; i < right; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'C' - m = m[3:] - } - - t.queue(movement) + m := []rune{} + + // 1 unit up can be expressed as ^[[A or ^[A + // 5 units up can be expressed as ^[[5A + + if up == 1 { + m = append(m, keyEscape, '[', 'A') + } else if up > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(up))...) + m = append(m, 'A') + } + + if down == 1 { + m = append(m, keyEscape, '[', 'B') + } else if down > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(down))...) + m = append(m, 'B') + } + + if right == 1 { + m = append(m, keyEscape, '[', 'C') + } else if right > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(right))...) + m = append(m, 'C') + } + + if left == 1 { + m = append(m, keyEscape, '[', 'D') + } else if left > 1 { + m = append(m, keyEscape, '[') + m = append(m, []rune(strconv.Itoa(left))...) + m = append(m, 'D') + } + + t.queue(m) } func (t *Terminal) clearLineToRight() { diff --git a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go index f72fa55f3e..7aff0d0225 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -137,6 +137,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW //sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) //sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) //sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] //sys CloseHandle(handle Handle) (err error) //sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] diff --git a/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go index 141ca81bd7..bbf19f0dcd 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/types_windows.go @@ -126,9 +126,19 @@ const ( OPEN_ALWAYS = 4 TRUNCATE_EXISTING = 5 - FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 - FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 - FILE_FLAG_OVERLAPPED = 0x40000000 + FILE_FLAG_OPEN_REQUIRING_OPLOCK = 0x00040000 + FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000 + FILE_FLAG_OPEN_NO_RECALL = 0x00100000 + FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 + FILE_FLAG_SESSION_AWARE = 0x00800000 + FILE_FLAG_POSIX_SEMANTICS = 0x01000000 + FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 + FILE_FLAG_DELETE_ON_CLOSE = 0x04000000 + FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000 + FILE_FLAG_RANDOM_ACCESS = 0x10000000 + FILE_FLAG_NO_BUFFERING = 0x20000000 + FILE_FLAG_OVERLAPPED = 0x40000000 + FILE_FLAG_WRITE_THROUGH = 0x80000000 HANDLE_FLAG_INHERIT = 0x00000001 STARTF_USESTDHANDLES = 0x00000100 diff --git a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 75dcd275ca..eb9f06296e 100644 --- a/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/src/cmd/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -77,6 +77,7 @@ var ( procCreateFileW = modkernel32.NewProc("CreateFileW") procReadFile = modkernel32.NewProc("ReadFile") procWriteFile = modkernel32.NewProc("WriteFile") + procGetOverlappedResult = modkernel32.NewProc("GetOverlappedResult") procSetFilePointer = modkernel32.NewProc("SetFilePointer") procCloseHandle = modkernel32.NewProc("CloseHandle") procGetStdHandle = modkernel32.NewProc("GetStdHandle") @@ -654,6 +655,24 @@ func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) return } +func GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error) { + var _p0 uint32 + if wait { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall6(procGetOverlappedResult.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(done)), uintptr(_p0), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) newlowoffset = uint32(r0) diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go index 35b0a3e7cc..5dd060800c 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/tests/tests.go @@ -84,23 +84,25 @@ func isTestParam(typ ast.Expr, wantType string) bool { return false } -func lookup(pkg *types.Package, name string) types.Object { +func lookup(pkg *types.Package, name string) []types.Object { if o := pkg.Scope().Lookup(name); o != nil { - return o - } - - // If this package is ".../foo_test" and it imports a package - // ".../foo", try looking in the latter package. - // This heuristic should work even on build systems that do not - // record any special link between the packages. - if basePath := strings.TrimSuffix(pkg.Path(), "_test"); basePath != pkg.Path() { - for _, imp := range pkg.Imports() { - if imp.Path() == basePath { - return imp.Scope().Lookup(name) - } + return []types.Object{o} + } + + var ret []types.Object + // Search through the imports to see if any of them define name. + // It's hard to tell in general which package is being tested, so + // for the purposes of the analysis, allow the object to appear + // in any of the imports. This guarantees there are no false positives + // because the example needs to use the object so it must be defined + // in the package or one if its imports. On the other hand, false + // negatives are possible, but should be rare. + for _, imp := range pkg.Imports() { + if obj := imp.Scope().Lookup(name); obj != nil { + ret = append(ret, obj) } } - return nil + return ret } func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) { @@ -121,9 +123,9 @@ func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) { exName = strings.TrimPrefix(fnName, "Example") elems = strings.SplitN(exName, "_", 3) ident = elems[0] - obj = lookup(pass.Pkg, ident) + objs = lookup(pass.Pkg, ident) ) - if ident != "" && obj == nil { + if ident != "" && len(objs) == 0 { // Check ExampleFoo and ExampleBadFoo. pass.Reportf(fn.Pos(), "%s refers to unknown identifier: %s", fnName, ident) // Abort since obj is absent and no subsequent checks can be performed. @@ -145,7 +147,15 @@ func checkExample(pass *analysis.Pass, fn *ast.FuncDecl) { mmbr := elems[1] if !isExampleSuffix(mmbr) { // Check ExampleFoo_Method and ExampleFoo_BadMethod. - if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj == nil { + found := false + // Check if Foo.Method exists in this package or its imports. + for _, obj := range objs { + if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj != nil { + found = true + break + } + } + if !found { pass.Reportf(fn.Pos(), "%s refers to unknown field or method: %s.%s", fnName, ident, mmbr) } } diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index 2b3dc6fe2f..44b1288d5d 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -21,12 +21,12 @@ golang.org/x/arch/arm/armasm golang.org/x/arch/arm64/arm64asm golang.org/x/arch/ppc64/ppc64asm golang.org/x/arch/x86/x86asm -# golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a +# golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c golang.org/x/crypto/ssh/terminal -# golang.org/x/sys v0.0.0-20190318195719-6c81ef8f67ca +# golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/tools v0.0.0-20190320160634-b6b7807791df +# golang.org/x/tools v0.0.0-20190325223049-1d95b17f1b04 golang.org/x/tools/go/analysis/passes/asmdecl golang.org/x/tools/go/analysis/passes/assign golang.org/x/tools/go/analysis/passes/atomic -- GitLab From cd5309355e25dda4a33bcf5c931aae5a15f9de94 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Mon, 25 Mar 2019 00:31:41 +0100 Subject: [PATCH 0599/1679] syscall/js: improve type checks of js.Value's methods Add more explicit checks if the given js.Value is of the correct type instead of erroring on the JavaScript layer. Change-Id: I30b18a76820fb68f6ac279bb88a57456f5bab467 Reviewed-on: https://go-review.googlesource.com/c/go/+/168886 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/js/js.go | 42 ++++++++++++++++++++++++---- src/syscall/js/js_test.go | 59 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go index 0893db022d..bccf188fa5 100644 --- a/src/syscall/js/js.go +++ b/src/syscall/js/js.go @@ -216,6 +216,10 @@ func (t Type) String() string { } } +func (t Type) isObject() bool { + return t == TypeObject || t == TypeFunction +} + // Type returns the JavaScript type of the value v. It is similar to JavaScript's typeof operator, // except that it returns TypeNull instead of TypeObject for null. func (v Value) Type() Type { @@ -244,28 +248,44 @@ func (v Value) Type() Type { } // Get returns the JavaScript property p of value v. +// It panics if v is not a JavaScript object. func (v Value) Get(p string) Value { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.Get", vType}) + } return makeValue(valueGet(v.ref, p)) } func valueGet(v ref, p string) ref // Set sets the JavaScript property p of value v to ValueOf(x). +// It panics if v is not a JavaScript object. func (v Value) Set(p string, x interface{}) { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.Set", vType}) + } valueSet(v.ref, p, ValueOf(x).ref) } func valueSet(v ref, p string, x ref) // Index returns JavaScript index i of value v. +// It panics if v is not a JavaScript object. func (v Value) Index(i int) Value { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.Index", vType}) + } return makeValue(valueIndex(v.ref, i)) } func valueIndex(v ref, i int) ref // SetIndex sets the JavaScript index i of value v to ValueOf(x). +// It panics if v is not a JavaScript object. func (v Value) SetIndex(i int, x interface{}) { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.SetIndex", vType}) + } valueSetIndex(v.ref, i, ValueOf(x).ref) } @@ -280,7 +300,11 @@ func makeArgs(args []interface{}) []ref { } // Length returns the JavaScript property "length" of v. +// It panics if v is not a JavaScript object. func (v Value) Length() int { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.SetIndex", vType}) + } return valueLength(v.ref) } @@ -292,7 +316,7 @@ func valueLength(v ref) int func (v Value) Call(m string, args ...interface{}) Value { res, ok := valueCall(v.ref, m, makeArgs(args)) if !ok { - if vType := v.Type(); vType != TypeObject && vType != TypeFunction { // check here to avoid overhead in success case + if vType := v.Type(); !vType.isObject() { // check here to avoid overhead in success case panic(&ValueError{"Value.Call", vType}) } if propType := v.Get(m).Type(); propType != TypeFunction { @@ -306,7 +330,7 @@ func (v Value) Call(m string, args ...interface{}) Value { func valueCall(v ref, m string, args []ref) (ref, bool) // Invoke does a JavaScript call of the value v with the given arguments. -// It panics if v is not a function. +// It panics if v is not a JavaScript function. // The arguments get mapped to JavaScript values according to the ValueOf function. func (v Value) Invoke(args ...interface{}) Value { res, ok := valueInvoke(v.ref, makeArgs(args)) @@ -322,11 +346,14 @@ func (v Value) Invoke(args ...interface{}) Value { func valueInvoke(v ref, args []ref) (ref, bool) // New uses JavaScript's "new" operator with value v as constructor and the given arguments. -// It panics if v is not a function. +// It panics if v is not a JavaScript function. // The arguments get mapped to JavaScript values according to the ValueOf function. func (v Value) New(args ...interface{}) Value { res, ok := valueNew(v.ref, makeArgs(args)) if !ok { + if vType := v.Type(); vType != TypeFunction { // check here to avoid overhead in success case + panic(&ValueError{"Value.Invoke", vType}) + } panic(Error{makeValue(res)}) } return makeValue(res) @@ -350,17 +377,20 @@ func (v Value) float(method string) float64 { return *(*float64)(unsafe.Pointer(&v.ref)) } -// Float returns the value v as a float64. It panics if v is not a JavaScript number. +// Float returns the value v as a float64. +// It panics if v is not a JavaScript number. func (v Value) Float() float64 { return v.float("Value.Float") } -// Int returns the value v truncated to an int. It panics if v is not a JavaScript number. +// Int returns the value v truncated to an int. +// It panics if v is not a JavaScript number. func (v Value) Int() int { return int(v.float("Value.Int")) } -// Bool returns the value v as a bool. It panics if v is not a JavaScript boolean. +// Bool returns the value v as a bool. +// It panics if v is not a JavaScript boolean. func (v Value) Bool() bool { switch v.ref { case valueTrue.ref: diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go index c14d2cc24c..594284faf9 100644 --- a/src/syscall/js/js_test.go +++ b/src/syscall/js/js_test.go @@ -202,10 +202,30 @@ func TestLength(t *testing.T) { } } +func TestGet(t *testing.T) { + // positive cases get tested per type + + expectValueError(t, func() { + dummys.Get("zero").Get("badField") + }) +} + +func TestSet(t *testing.T) { + // positive cases get tested per type + + expectValueError(t, func() { + dummys.Get("zero").Set("badField", 42) + }) +} + func TestIndex(t *testing.T) { if got := dummys.Get("someArray").Index(1).Int(); got != 42 { t.Errorf("got %#v, want %#v", got, 42) } + + expectValueError(t, func() { + dummys.Get("zero").Index(1) + }) } func TestSetIndex(t *testing.T) { @@ -213,6 +233,10 @@ func TestSetIndex(t *testing.T) { if got := dummys.Get("someArray").Index(2).Int(); got != 99 { t.Errorf("got %#v, want %#v", got, 99) } + + expectValueError(t, func() { + dummys.Get("zero").SetIndex(2, 99) + }) } func TestCall(t *testing.T) { @@ -223,6 +247,13 @@ func TestCall(t *testing.T) { if got := dummys.Call("add", js.Global().Call("eval", "40"), 2).Int(); got != 42 { t.Errorf("got %#v, want %#v", got, 42) } + + expectPanic(t, func() { + dummys.Call("zero") + }) + expectValueError(t, func() { + dummys.Get("zero").Call("badMethod") + }) } func TestInvoke(t *testing.T) { @@ -230,12 +261,20 @@ func TestInvoke(t *testing.T) { if got := dummys.Get("add").Invoke(i, 2).Int(); got != 42 { t.Errorf("got %#v, want %#v", got, 42) } + + expectValueError(t, func() { + dummys.Get("zero").Invoke() + }) } func TestNew(t *testing.T) { if got := js.Global().Get("Array").New(42).Length(); got != 42 { t.Errorf("got %#v, want %#v", got, 42) } + + expectValueError(t, func() { + dummys.Get("zero").New() + }) } func TestInstanceOf(t *testing.T) { @@ -379,3 +418,23 @@ func TestTruthy(t *testing.T) { t.Errorf("got %#v, want %#v", got, want) } } + +func expectValueError(t *testing.T, fn func()) { + defer func() { + err := recover() + if _, ok := err.(*js.ValueError); !ok { + t.Errorf("expected *js.ValueError, got %T", err) + } + }() + fn() +} + +func expectPanic(t *testing.T, fn func()) { + defer func() { + err := recover() + if err == nil { + t.Errorf("expected panic") + } + }() + fn() +} -- GitLab From db7e74696087edefd03162583cc8d45ad5bd2f06 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 25 Mar 2019 22:57:27 +0000 Subject: [PATCH 0600/1679] cmd/vet/all: don't use the x/tools vet in GOPATH Updates golang/go#31040 Change-Id: I76e3044b2cc992e63194654a825e70307075eff3 Reviewed-on: https://go-review.googlesource.com/c/go/+/169237 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Dmitri Shuralyov --- src/cmd/vet/all/main.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index 6e4a4e297e..e4f8eccd8c 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -243,7 +243,17 @@ func (p platform) vet() { } cmd := exec.Command(cmdGoPath, "build", "-o", vetTool, "golang.org/x/tools/go/analysis/cmd/vet") - cmd.Env = os.Environ() + cmd.Env = append(os.Environ(), + // Setting GO111MODULE to on is redundant in master + // (Go 1.13), but not if we backport this to Go 1.11/1.12 + // release branches (for our own builder usage) or if + // master ends up reverting its GO111MODULE default. If + // that happens, we want to force it on here anyway, as + // we're now depending on it. + "GO111MODULE=on", + ) + // Use the module that cmd/vet/all is a part of: + cmd.Dir = filepath.Join(runtime.GOROOT(), "src", "cmd", "vet", "all") // golang.org/x/tools does not have a vendor directory, so don't try to use // one in module mode. @@ -259,19 +269,6 @@ func (p platform) vet() { } } - // The coordinator places a copy of golang.org/x/tools in GOPATH. - // If we can find it there, use that specific version. - for _, gp := range filepath.SplitList(os.Getenv("GOPATH")) { - gopathDir := filepath.Join(gp, "src", "golang.org", "x", "tools", "go", "analysis", "cmd", "vet") - if _, err := os.Stat(gopathDir); err == nil { - cmd.Dir = gopathDir - } - } - if cmd.Dir == "" { - // Otherwise, move to tmpdir and let the module loader resolve the latest version. - cmd.Dir = tmpdir - } - cmd.Stderr = os.Stderr cmd.Stdout = os.Stderr if err := cmd.Run(); err != nil { -- GitLab From e007916cea969c4d5917da931413fba4eb43e8f6 Mon Sep 17 00:00:00 2001 From: Dmitri Shuralyov Date: Thu, 21 Mar 2019 14:00:46 -0400 Subject: [PATCH 0601/1679] cmd/go/internal/load: always use DefaultExecName to determine binary name It should produce equivalent results to split on the import path of the package rather than its directory, in GOPATH mode. That means the common code in DefaultExecName can be used. We're in the middle of Go 1.12 cycle, so now is a good time to make it happen for Go 1.13. Modify isVersionElement to accept path elements like "v2", "v3", "v10", rather than "/v2", "/v3", "/v10". Then use it in DefaultExecName instead of the ad-hoc isVersion function. There is no change in behavior. Add tests for DefaultExecName and isVersionElement. Updates #26869 Change-Id: Ic6da2c92587459aa2b327385e994b72a6e183092 Reviewed-on: https://go-review.googlesource.com/c/go/+/168678 Run-TryBot: Dmitri Shuralyov TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/load/pkg.go | 46 +++++-------------- src/cmd/go/internal/load/pkg_test.go | 68 ++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 35 deletions(-) create mode 100644 src/cmd/go/internal/load/pkg_test.go diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 431dfe318e..3827d3184e 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -802,7 +802,7 @@ func findVersionElement(path string) (i, j int) { j = len(path) for i = len(path) - 1; i >= 0; i-- { if path[i] == '/' { - if isVersionElement(path[i:j]) { + if isVersionElement(path[i+1 : j]) { return i, j } j = i @@ -814,10 +814,10 @@ func findVersionElement(path string) (i, j int) { // isVersionElement reports whether s is a well-formed path version element: // v2, v3, v10, etc, but not v0, v05, v1. func isVersionElement(s string) bool { - if len(s) < 3 || s[0] != '/' || s[1] != 'v' || s[2] == '0' || s[2] == '1' && len(s) == 3 { + if len(s) < 2 || s[0] != 'v' || s[1] == '0' || s[1] == '1' && len(s) == 2 { return false } - for i := 2; i < len(s); i++ { + for i := 1; i < len(s); i++ { if s[i] < '0' || '9' < s[i] { return false } @@ -1190,26 +1190,16 @@ var foldPath = make(map[string]string) // for a package with the import path importPath. // // The default executable name is the last element of the import path. -// In module-aware mode, an additional rule is used. If the last element -// is a vN path element specifying the major version, then the second last -// element of the import path is used instead. +// In module-aware mode, an additional rule is used on import paths +// consisting of two or more path elements. If the last element is +// a vN path element specifying the major version, then the +// second last element of the import path is used instead. func DefaultExecName(importPath string) string { _, elem := pathpkg.Split(importPath) if cfg.ModulesEnabled { - // If this is example.com/mycmd/v2, it's more useful to install it as mycmd than as v2. - // See golang.org/issue/24667. - isVersion := func(v string) bool { - if len(v) < 2 || v[0] != 'v' || v[1] < '1' || '9' < v[1] { - return false - } - for i := 2; i < len(v); i++ { - if c := v[i]; c < '0' || '9' < c { - return false - } - } - return true - } - if isVersion(elem) { + // If this is example.com/mycmd/v2, it's more useful to + // install it as mycmd than as v2. See golang.org/issue/24667. + if elem != importPath && isVersionElement(elem) { _, elem = pathpkg.Split(pathpkg.Dir(importPath)) } } @@ -1256,21 +1246,7 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { p.Error = &PackageError{Err: e} return } - _, elem := filepath.Split(p.Dir) - if cfg.ModulesEnabled { - // NOTE(rsc,dmitshur): Using p.ImportPath instead of p.Dir - // makes sure we install a package in the root of a - // cached module directory as that package name - // not name@v1.2.3. - // Using p.ImportPath instead of p.Dir - // is probably correct all the time, - // even for non-module-enabled code, - // but I'm not brave enough to change the - // non-module behavior this late in the - // release cycle. Can be done for Go 1.13. - // See golang.org/issue/26869. - elem = DefaultExecName(p.ImportPath) - } + elem := DefaultExecName(p.ImportPath) full := cfg.BuildContext.GOOS + "_" + cfg.BuildContext.GOARCH + "/" + elem if cfg.BuildContext.GOOS != base.ToolGOOS || cfg.BuildContext.GOARCH != base.ToolGOARCH { // Install cross-compiled binaries to subdirectories of bin. diff --git a/src/cmd/go/internal/load/pkg_test.go b/src/cmd/go/internal/load/pkg_test.go new file mode 100644 index 0000000000..9ddc20d050 --- /dev/null +++ b/src/cmd/go/internal/load/pkg_test.go @@ -0,0 +1,68 @@ +package load + +import ( + "cmd/go/internal/cfg" + "testing" +) + +func TestDefaultExecName(t *testing.T) { + oldModulesEnabled := cfg.ModulesEnabled + defer func() { cfg.ModulesEnabled = oldModulesEnabled }() + for _, tt := range []struct { + in string + wantMod string + wantGopath string + }{ + {"example.com/mycmd", "mycmd", "mycmd"}, + {"example.com/mycmd/v0", "v0", "v0"}, + {"example.com/mycmd/v1", "v1", "v1"}, + {"example.com/mycmd/v2", "mycmd", "v2"}, // Semantic import versioning, use second last element in module mode. + {"example.com/mycmd/v3", "mycmd", "v3"}, // Semantic import versioning, use second last element in module mode. + {"mycmd", "mycmd", "mycmd"}, + {"mycmd/v0", "v0", "v0"}, + {"mycmd/v1", "v1", "v1"}, + {"mycmd/v2", "mycmd", "v2"}, // Semantic import versioning, use second last element in module mode. + {"v0", "v0", "v0"}, + {"v1", "v1", "v1"}, + {"v2", "v2", "v2"}, + } { + { + cfg.ModulesEnabled = true + gotMod := DefaultExecName(tt.in) + if gotMod != tt.wantMod { + t.Errorf("DefaultExecName(%q) in module mode = %v; want %v", tt.in, gotMod, tt.wantMod) + } + } + { + cfg.ModulesEnabled = false + gotGopath := DefaultExecName(tt.in) + if gotGopath != tt.wantGopath { + t.Errorf("DefaultExecName(%q) in gopath mode = %v; want %v", tt.in, gotGopath, tt.wantGopath) + } + } + } +} + +func TestIsVersionElement(t *testing.T) { + t.Parallel() + for _, tt := range []struct { + in string + want bool + }{ + {"v0", false}, + {"v05", false}, + {"v1", false}, + {"v2", true}, + {"v3", true}, + {"v9", true}, + {"v10", true}, + {"v11", true}, + {"v", false}, + {"vx", false}, + } { + got := isVersionElement(tt.in) + if got != tt.want { + t.Errorf("isVersionElement(%q) = %v; want %v", tt.in, got, tt.want) + } + } +} -- GitLab From b5cf035d1ca21ee4bf799c6d97b2759471b76483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 25 Mar 2019 10:26:44 +0100 Subject: [PATCH 0602/1679] runtime: improve sigtramp on aix/ppc64 to handle SIGPROF R14, R15 must be saved in sigtramp because they might be modified by Go code when a SIGPROF occurs. Fixes #28555 Change-Id: I573541f108d7d6aac8e60d33c649e5db943f3ef5 Reviewed-on: https://go-review.googlesource.com/c/go/+/169117 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/crash_cgo_test.go | 3 -- src/runtime/crash_test.go | 3 -- src/runtime/os_aix.go | 2 ++ src/runtime/pprof/pprof_test.go | 2 +- src/runtime/pprof/proto_test.go | 4 --- src/runtime/proc.go | 2 +- src/runtime/sys_aix_ppc64.s | 60 ++++++++++++++++----------------- 7 files changed, 33 insertions(+), 43 deletions(-) diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index 07eba78c8a..af3c1f82a7 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -229,9 +229,6 @@ func TestCgoPanicDeadlock(t *testing.T) { } func TestCgoCCodeSIGPROF(t *testing.T) { - if runtime.GOOS == "aix" { - t.Skip("pprof not yet available on AIX (see golang.org/issue/28555)") - } t.Parallel() got := runTestProg(t, "testprogcgo", "CgoCCodeSIGPROF") want := "OK\n" diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go index 03ebf022a6..c54bb57da2 100644 --- a/src/runtime/crash_test.go +++ b/src/runtime/crash_test.go @@ -623,9 +623,6 @@ func TestBadTraceback(t *testing.T) { } func TestTimePprof(t *testing.T) { - if runtime.GOOS == "aix" { - t.Skip("pprof not yet available on AIX (see golang.org/issue/28555)") - } fn := runTestProg(t, "testprog", "TimeProf") fn = strings.TrimSpace(fn) defer os.Remove(fn) diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go index 141ce3bb11..45c7174e05 100644 --- a/src/runtime/os_aix.go +++ b/src/runtime/os_aix.go @@ -233,6 +233,8 @@ func setSignalstackSP(s *stackt, sp uintptr) { func (c *sigctxt) fixsigcode(sig uint32) { } +//go:nosplit +//go:nowritebarrierrec func sigaddset(mask *sigset, i int) { (*mask)[(i-1)/64] |= 1 << ((uint32(i) - 1) & 63) } diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go index 7c6043ffdb..964e83abc6 100644 --- a/src/runtime/pprof/pprof_test.go +++ b/src/runtime/pprof/pprof_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !aix,!nacl,!js +// +build !nacl,!js package pprof diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index cb38150da8..4452d51231 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -312,10 +312,6 @@ func TestMapping(t *testing.T) { testenv.MustHaveGoRun(t) testenv.MustHaveCGO(t) - if runtime.GOOS == "aix" { - t.Skip("pprof not yet available on AIX (see golang.org/issue/28555)") - } - prog := "./testdata/mappingtest/main.go" // GoOnly includes only Go symbols that runtime will symbolize. diff --git a/src/runtime/proc.go b/src/runtime/proc.go index a077a5da03..9e993afba9 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3758,7 +3758,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) { // Normal traceback is impossible or has failed. // See if it falls into several common cases. n = 0 - if (GOOS == "windows" || GOOS == "solaris" || GOOS == "darwin") && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 { + if (GOOS == "windows" || GOOS == "solaris" || GOOS == "darwin" || GOOS == "aix") && mp.libcallg != 0 && mp.libcallpc != 0 && mp.libcallsp != 0 { // Libcall, i.e. runtime syscall on windows. // Collect Go stack that leads to the call. n = gentraceback(mp.libcallpc, mp.libcallsp, 0, mp.libcallg.ptr(), 0, &stk[0], len(stk), nil, nil, 0) diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index ee572cb4de..65fcae0c0c 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -97,6 +97,7 @@ GLOBL runtime·sigtramp(SB), NOPTR, $24 // This funcion must not have any frame as we want to control how // every registers are used. +// TODO(aix): Implement SetCgoTraceback handler. TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 MOVD LR, R0 MOVD R0, 16(R1) @@ -107,39 +108,42 @@ TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 // more stack available than NOSPLIT would have us believe. // To defeat the linker, we make our own stack frame with // more space. - SUB $128+FIXED_FRAME, R1 + SUB $144+FIXED_FRAME, R1 // Save registers MOVD R31, 56(R1) MOVD g, 64(R1) MOVD R29, 72(R1) + MOVD R14, 80(R1) + MOVD R15, 88(R1) BL runtime·load_g(SB) CMP $0, g - BEQ sigtrampnog // g == nil + BEQ sigtramp // g == nil + MOVD g_m(g), R6 + CMP $0, R6 + BEQ sigtramp // g.m == nil // Save m->libcall. We need to do this because we // might get interrupted by a signal in runtime·asmcgocall. - - // save m->libcall - MOVD g_m(g), R6 MOVD (m_libcall+libcall_fn)(R6), R7 - MOVD R7, 80(R1) + MOVD R7, 96(R1) MOVD (m_libcall+libcall_args)(R6), R7 - MOVD R7, 88(R1) + MOVD R7, 104(R1) MOVD (m_libcall+libcall_n)(R6), R7 - MOVD R7, 96(R1) + MOVD R7, 112(R1) MOVD (m_libcall+libcall_r1)(R6), R7 - MOVD R7, 104(R1) + MOVD R7, 120(R1) MOVD (m_libcall+libcall_r2)(R6), R7 - MOVD R7, 112(R1) + MOVD R7, 128(R1) // save errno, it might be EINTR; stuff we do here might reset it. MOVD (m_mOS+mOS_perrno)(R6), R8 MOVD 0(R8), R8 - MOVD R8, 120(R1) + MOVD R8, 136(R1) +sigtramp: MOVW R3, FIXED_FRAME+0(R1) MOVD R4, FIXED_FRAME+8(R1) MOVD R5, FIXED_FRAME+16(R1) @@ -147,22 +151,27 @@ TEXT runtime·_sigtramp(SB),NOSPLIT|NOFRAME,$0 MOVD R12, CTR BL (CTR) + CMP $0, g + BEQ exit // g == nil MOVD g_m(g), R6 + CMP $0, R6 + BEQ exit // g.m == nil + // restore libcall - MOVD 80(R1), R7 + MOVD 96(R1), R7 MOVD R7, (m_libcall+libcall_fn)(R6) - MOVD 88(R1), R7 + MOVD 104(R1), R7 MOVD R7, (m_libcall+libcall_args)(R6) - MOVD 96(R1), R7 + MOVD 112(R1), R7 MOVD R7, (m_libcall+libcall_n)(R6) - MOVD 104(R1), R7 + MOVD 120(R1), R7 MOVD R7, (m_libcall+libcall_r1)(R6) - MOVD 112(R1), R7 + MOVD 128(R1), R7 MOVD R7, (m_libcall+libcall_r2)(R6) // restore errno MOVD (m_mOS+mOS_perrno)(R6), R7 - MOVD 120(R1), R8 + MOVD 136(R1), R8 MOVD R8, 0(R7) exit: @@ -170,26 +179,15 @@ exit: MOVD 56(R1),R31 MOVD 64(R1),g MOVD 72(R1),R29 + MOVD 80(R1), R14 + MOVD 88(R1), R15 // Don't use RET because we need to restore R31 ! - ADD $128+FIXED_FRAME, R1 + ADD $144+FIXED_FRAME, R1 MOVD 16(R1), R0 MOVD R0, LR BR (LR) -sigtrampnog: - // Signal arrived on a non-Go thread. - // SIGPROF handler is not yet available so simply call badsignal, - // after having created *sigctxt. - MOVD R4, 80(R1) - MOVD R5, 88(R1) - MOVD R1, R4 - ADD $80, R4 - MOVD R4, FIXED_FRAME+8(R1) - MOVD R3, FIXED_FRAME+0(R1) - BL runtime·badsignal(SB) - JMP exit - // runtime.tstart is a function descriptor to the real tstart. DATA runtime·tstart+0(SB)/8, $runtime·_tstart(SB) DATA runtime·tstart+8(SB)/8, $TOC(SB) -- GitLab From f2e51f00158c2dcdff37c573c24f798d1e63db31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20B=C3=BCnemann?= Date: Mon, 25 Mar 2019 23:12:21 +0000 Subject: [PATCH 0603/1679] crypto/x509: look for CAs at /etc/ssl/cert.pem for Alpine Linux Alpine Linux uses /etc/ssl/cert.pem as default ca-bundle which is preinstalled since 3.7 and was installed as part of the libressl package in 3.5 and 3.6. The path /etc/ssl/certs/ca-certificates.crt is only valid if the full ca-certificates package is installed by hand, which contains all single CA certs and uses update-ca-certificates to bundle them. The priority for /etc/ssl/certs/ca-certificates.crt should be kept higher than /etc/ssl/cert.pem in case the user installed custom CA certs. Change-Id: I1c86a6ad84d8ee1163560655743a5ce9f2408af1 GitHub-Last-Rev: 0ba4d599e412640248d4e688537aaea4c43ecbcc GitHub-Pull-Request: golang/go#31042 Reviewed-on: https://go-review.googlesource.com/c/go/+/169238 Reviewed-by: Filippo Valsorda --- src/crypto/x509/root_linux.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/crypto/x509/root_linux.go b/src/crypto/x509/root_linux.go index aa1785e4c6..267775dc5f 100644 --- a/src/crypto/x509/root_linux.go +++ b/src/crypto/x509/root_linux.go @@ -11,4 +11,5 @@ var certFiles = []string{ "/etc/ssl/ca-bundle.pem", // OpenSUSE "/etc/pki/tls/cacert.pem", // OpenELEC "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7 + "/etc/ssl/cert.pem", // Alpine Linux } -- GitLab From 724a86fcede55d0e80da4a779ef64a2eb5d235a8 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 27 Feb 2019 20:08:36 +0000 Subject: [PATCH 0604/1679] context: don't depend on fmt So the net package doesn't indirectly depend on unicode tables. But we're still not quite there, because a new test added in this CL reveals that we still have a path to unicode via: deps_test.go:570: TODO(issue 30440): policy violation: net => sort => reflect => unicode Updates #30440 Change-Id: I710c2061dfbaa8e866c92e6c824bd8df35784165 Reviewed-on: https://go-review.googlesource.com/c/go/+/169080 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/context/context.go | 35 +++++++++++++++++++++++++++---- src/context/context_test.go | 2 +- src/go/build/deps_test.go | 36 +++++++++++++++++++++++++++++++- src/internal/reflectlite/type.go | 7 +++++++ 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/src/context/context.go b/src/context/context.go index 36f83c7b5b..77298f6531 100644 --- a/src/context/context.go +++ b/src/context/context.go @@ -49,7 +49,6 @@ package context import ( "errors" - "fmt" "internal/reflectlite" "sync" "time" @@ -338,8 +337,19 @@ func (c *cancelCtx) Err() error { return err } +type stringer interface { + String() string +} + +func contextName(c Context) string { + if s, ok := c.(stringer); ok { + return s.String() + } + return reflectlite.TypeOf(c).String() +} + func (c *cancelCtx) String() string { - return fmt.Sprintf("%v.WithCancel", c.Context) + return contextName(c.Context) + ".WithCancel" } // cancel closes c.done, cancels each of c's children, and, if @@ -420,7 +430,9 @@ func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { } func (c *timerCtx) String() string { - return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, time.Until(c.deadline)) + return contextName(c.cancelCtx.Context) + ".WithDeadline(" + + c.deadline.String() + " [" + + time.Until(c.deadline).String() + "])" } func (c *timerCtx) cancel(removeFromParent bool, err error) { @@ -481,8 +493,23 @@ type valueCtx struct { key, val interface{} } +// stringify tries a bit to stringify v, without using fmt, since we don't +// want context depending on the unicode tables. This is only used by +// *valueCtx.String(). +func stringify(v interface{}) string { + if s, ok := v.(stringer); ok { + return s.String() + } + if s, ok := v.(string); ok { + return s + } + return "" +} + func (c *valueCtx) String() string { - return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) + return contextName(c.Context) + ".WithValue(type " + + reflectlite.TypeOf(c.key).String() + + ", val " + stringify(c.val) + ")" } func (c *valueCtx) Value(key interface{}) interface{} { diff --git a/src/context/context_test.go b/src/context/context_test.go index f73f2837b8..0cec169915 100644 --- a/src/context/context_test.go +++ b/src/context/context_test.go @@ -343,7 +343,7 @@ func XTestValues(t testingT) { c1 := WithValue(Background(), k1, "c1k1") check(c1, "c1", "c1k1", "", "") - if got, want := fmt.Sprint(c1), `context.Background.WithValue(1, "c1k1")`; got != want { + if got, want := fmt.Sprint(c1), `context.Background.WithValue(type context.key1, val c1k1)`; got != want { t.Errorf("c.String() = %q want %q", got, want) } diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index e9ea0fabd8..92b115eb53 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -249,7 +249,7 @@ var pkgDeps = map[string][]string{ "compress/gzip": {"L4", "compress/flate"}, "compress/lzw": {"L4"}, "compress/zlib": {"L4", "compress/flate"}, - "context": {"errors", "fmt", "internal/reflectlite", "sync", "time"}, + "context": {"errors", "internal/reflectlite", "sync", "time"}, "database/sql": {"L4", "container/list", "context", "database/sql/driver", "database/sql/internal"}, "database/sql/driver": {"L4", "context", "time", "database/sql/internal"}, "debug/dwarf": {"L4"}, @@ -520,15 +520,21 @@ func TestDependencies(t *testing.T) { } sort.Strings(all) + sawImport := map[string]map[string]bool{} // from package => to package => true + for _, pkg := range all { imports, err := findImports(pkg) if err != nil { t.Error(err) continue } + if sawImport[pkg] == nil { + sawImport[pkg] = map[string]bool{} + } ok := allowed(pkg) var bad []string for _, imp := range imports { + sawImport[pkg][imp] = true if !ok[imp] { bad = append(bad, imp) } @@ -537,6 +543,34 @@ func TestDependencies(t *testing.T) { t.Errorf("unexpected dependency: %s imports %v", pkg, bad) } } + + // depPath returns the path between the given from and to packages. + // It returns the empty string if there's no dependency path. + var depPath func(string, string) string + depPath = func(from, to string) string { + if sawImport[from][to] { + return from + " => " + to + } + for pkg := range sawImport[from] { + if p := depPath(pkg, to); p != "" { + return from + " => " + p + } + } + return "" + } + + // Also test some high-level policy goals are being met by not finding + // these dependency paths: + badPaths := []struct{ from, to string }{ + {"net", "unicode"}, + } + + for _, path := range badPaths { + if how := depPath(path.from, path.to); how != "" { + t.Logf("TODO(issue 30440): policy violation: %s", how) + } + } + } var buildIgnore = []byte("\n// +build ignore") diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go index faecb8755d..3375464647 100644 --- a/src/internal/reflectlite/type.go +++ b/src/internal/reflectlite/type.go @@ -47,6 +47,13 @@ type Type interface { // Comparable reports whether values of this type are comparable. Comparable() bool + // String returns a string representation of the type. + // The string representation may use shortened package names + // (e.g., base64 instead of "encoding/base64") and is not + // guaranteed to be unique among types. To test for type identity, + // compare the Types directly. + String() string + // Elem returns a type's element type. // It panics if the type's Kind is not Ptr. Elem() Type -- GitLab From 08ba9c02910790c5ec9083dc32a1e2683bc77dc3 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Thu, 15 Nov 2018 23:35:27 +0530 Subject: [PATCH 0605/1679] cmd/go/internal/{run,work,generate}: document file path location requirement Mention that .go files must be from a single directory for them to be treated as a single package. Fixes #21529 Change-Id: I79cb08b9f43888814b1249a7b50bc7bc70bc1c72 Reviewed-on: https://go-review.googlesource.com/c/go/+/149797 Reviewed-by: Dmitri Shuralyov --- src/cmd/go/alldocs.go | 10 +++++----- src/cmd/go/internal/generate/generate.go | 4 ++-- src/cmd/go/internal/run/run.go | 2 +- src/cmd/go/internal/work/build.go | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 5b62ed939c..8dd3f8eb18 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -74,8 +74,8 @@ // Build compiles the packages named by the import paths, // along with their dependencies, but it does not install the results. // -// If the arguments to build are a list of .go files, build treats -// them as a list of source files specifying a single package. +// If the arguments to build are a list of .go files from a single directory, +// build treats them as a list of source files specifying a single package. // // When compiling a single main package, build writes // the resulting executable to an output file named after @@ -505,8 +505,8 @@ // "go tool foo". // // Generate processes packages in the order given on the command line, -// one at a time. If the command line lists .go files, they are treated -// as a single package. Within a package, generate processes the +// one at a time. If the command line lists .go files from a single directory, +// they are treated as a single package. Within a package, generate processes the // source files in a package in file name order, one at a time. Within // a source file, generate runs generators in the order they appear // in the file, one at a time. @@ -1170,7 +1170,7 @@ // go run [build flags] [-exec xprog] package [arguments...] // // Run compiles and runs the named main Go package. -// Typically the package is specified as a list of .go source files, +// Typically the package is specified as a list of .go source files from a single directory, // but it may also be an import path, file system path, or pattern // matching a single known package, as in 'go run .' or 'go run my/cmd'. // diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index 23e2ecc224..38c8274b40 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -110,8 +110,8 @@ specifies that the command "foo" represents the generator "go tool foo". Generate processes packages in the order given on the command line, -one at a time. If the command line lists .go files, they are treated -as a single package. Within a package, generate processes the +one at a time. If the command line lists .go files from a single directory, +they are treated as a single package. Within a package, generate processes the source files in a package in file name order, one at a time. Within a source file, generate runs generators in the order they appear in the file, one at a time. diff --git a/src/cmd/go/internal/run/run.go b/src/cmd/go/internal/run/run.go index feccf23b27..8b3006bf2c 100644 --- a/src/cmd/go/internal/run/run.go +++ b/src/cmd/go/internal/run/run.go @@ -22,7 +22,7 @@ var CmdRun = &base.Command{ Short: "compile and run Go program", Long: ` Run compiles and runs the named main Go package. -Typically the package is specified as a list of .go source files, +Typically the package is specified as a list of .go source files from a single directory, but it may also be an import path, file system path, or pattern matching a single known package, as in 'go run .' or 'go run my/cmd'. diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index eac027e09e..96b3744444 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -27,8 +27,8 @@ var CmdBuild = &base.Command{ Build compiles the packages named by the import paths, along with their dependencies, but it does not install the results. -If the arguments to build are a list of .go files, build treats -them as a list of source files specifying a single package. +If the arguments to build are a list of .go files from a single directory, +build treats them as a list of source files specifying a single package. When compiling a single main package, build writes the resulting executable to an output file named after -- GitLab From f0e0be6e9020caff0b44e0dcb44c8b2e707710f0 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Tue, 26 Mar 2019 11:24:40 +0700 Subject: [PATCH 0606/1679] os: document exit status range value Fixes #30959 Change-Id: I9d30d79e2dbb3f8c8d6555f8c64862b133638d5d Reviewed-on: https://go-review.googlesource.com/c/go/+/169357 Reviewed-by: Brad Fitzpatrick Reviewed-by: Rob Pike --- src/os/proc.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/os/proc.go b/src/os/proc.go index 804128a1da..7364d631f2 100644 --- a/src/os/proc.go +++ b/src/os/proc.go @@ -56,6 +56,8 @@ func Getgroups() ([]int, error) { // Exit causes the current program to exit with the given status code. // Conventionally, code zero indicates success, non-zero an error. // The program terminates immediately; deferred functions are not run. +// +// For portability, the status code should be in the range [0, 125]. func Exit(code int) { if code == 0 { // Give race detector a chance to fail the program. -- GitLab From 39a51a4b0d698491baaa252e21be2a51516379ea Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 25 Mar 2019 17:39:11 +0000 Subject: [PATCH 0607/1679] sort, internal/reflectlite: flesh out reflectlite enough for use by sort Now the net package is back to no longer depending on unicode. And lock that in with a test. Fixes #30440 Change-Id: I18b89b02f7d96488783adc07308da990f505affd Reviewed-on: https://go-review.googlesource.com/c/go/+/169137 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/go_test.go | 2 +- src/cmd/go/internal/load/pkg.go | 7 +++ src/go/build/deps_test.go | 10 +++- src/internal/reflectlite/swapper.go | 74 +++++++++++++++++++++++++++++ src/internal/reflectlite/type.go | 8 ++++ src/internal/reflectlite/value.go | 51 ++++++++++++++++++++ src/runtime/chan.go | 8 ++++ src/runtime/map.go | 12 +++++ src/sort/slice.go | 16 ++++--- src/sort/slice_pre113.go | 46 ++++++++++++++++++ 10 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 src/internal/reflectlite/swapper.go create mode 100644 src/sort/slice_pre113.go diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 1ee50ac983..d7e9ab4c74 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -1888,7 +1888,7 @@ func TestGoListTest(t *testing.T) { tg.grepStdout(`^runtime/cgo$`, "missing runtime/cgo") tg.run("list", "-deps", "-f", "{{if .DepOnly}}{{.ImportPath}}{{end}}", "sort") - tg.grepStdout(`^reflect$`, "missing reflect") + tg.grepStdout(`^internal/reflectlite$`, "missing internal/reflectlite") tg.grepStdoutNot(`^sort`, "unexpected sort") } diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 3827d3184e..cc81cc0317 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -969,6 +969,13 @@ func disallowInternal(srcDir string, importer *Package, importerPath string, p * return p } + // The sort package depends on internal/reflectlite, but during bootstrap + // the path rewriting causes the normal internal checks to fail. + // Instead, just ignore the internal rules during bootstrap. + if p.Standard && strings.HasPrefix(importerPath, "bootstrap/") { + return p + } + // The stack includes p.ImportPath. // If that's the only thing on the stack, we started // with a name given on the command line, not an diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 92b115eb53..853a7e64c8 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -120,7 +120,7 @@ var pkgDeps = map[string][]string{ "image/color/palette": {"L2", "image/color"}, "internal/fmtsort": {"reflect", "sort"}, "reflect": {"L2"}, - "sort": {"reflect"}, + "sort": {"internal/reflectlite"}, "L3": { "L2", @@ -563,11 +563,12 @@ func TestDependencies(t *testing.T) { // these dependency paths: badPaths := []struct{ from, to string }{ {"net", "unicode"}, + {"os", "unicode"}, } for _, path := range badPaths { if how := depPath(path.from, path.to); how != "" { - t.Logf("TODO(issue 30440): policy violation: %s", how) + t.Errorf("policy violation: %s", how) } } @@ -585,6 +586,11 @@ func findImports(pkg string) ([]string, error) { var haveImport = map[string]bool{} for _, file := range files { name := file.Name() + if name == "slice_pre113.go" { + // This file is ignored by build tags which aren't + // handled by this findImports func. + continue + } if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") { continue } diff --git a/src/internal/reflectlite/swapper.go b/src/internal/reflectlite/swapper.go new file mode 100644 index 0000000000..4594fb5ee2 --- /dev/null +++ b/src/internal/reflectlite/swapper.go @@ -0,0 +1,74 @@ +// Copyright 2016 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 reflectlite + +import "unsafe" + +// Swapper returns a function that swaps the elements in the provided +// slice. +// +// Swapper panics if the provided interface is not a slice. +func Swapper(slice interface{}) func(i, j int) { + v := ValueOf(slice) + if v.Kind() != Slice { + panic(&ValueError{Method: "Swapper", Kind: v.Kind()}) + } + // Fast path for slices of size 0 and 1. Nothing to swap. + switch v.Len() { + case 0: + return func(i, j int) { panic("reflect: slice index out of range") } + case 1: + return func(i, j int) { + if i != 0 || j != 0 { + panic("reflect: slice index out of range") + } + } + } + + typ := v.Type().Elem().(*rtype) + size := typ.Size() + hasPtr := typ.ptrdata != 0 + + // Some common & small cases, without using memmove: + if hasPtr { + if size == ptrSize { + ps := *(*[]unsafe.Pointer)(v.ptr) + return func(i, j int) { ps[i], ps[j] = ps[j], ps[i] } + } + if typ.Kind() == String { + ss := *(*[]string)(v.ptr) + return func(i, j int) { ss[i], ss[j] = ss[j], ss[i] } + } + } else { + switch size { + case 8: + is := *(*[]int64)(v.ptr) + return func(i, j int) { is[i], is[j] = is[j], is[i] } + case 4: + is := *(*[]int32)(v.ptr) + return func(i, j int) { is[i], is[j] = is[j], is[i] } + case 2: + is := *(*[]int16)(v.ptr) + return func(i, j int) { is[i], is[j] = is[j], is[i] } + case 1: + is := *(*[]int8)(v.ptr) + return func(i, j int) { is[i], is[j] = is[j], is[i] } + } + } + + s := (*sliceHeader)(v.ptr) + tmp := unsafe_New(typ) // swap scratch space + + return func(i, j int) { + if uint(i) >= uint(s.Len) || uint(j) >= uint(s.Len) { + panic("reflect: slice index out of range") + } + val1 := arrayAt(s.Data, i, size, "i < s.Len") + val2 := arrayAt(s.Data, j, size, "j < s.Len") + typedmemmove(typ, tmp, val1) + typedmemmove(typ, val1, val2) + typedmemmove(typ, val2, tmp) + } +} diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go index 3375464647..03274bcd4c 100644 --- a/src/internal/reflectlite/type.go +++ b/src/internal/reflectlite/type.go @@ -35,6 +35,10 @@ type Type interface { // will be the empty string. PkgPath() string + // Size returns the number of bytes needed to store + // a value of the given type; it is analogous to unsafe.Sizeof. + Size() uintptr + // Kind returns the specific kind of this type. Kind() Kind @@ -482,8 +486,12 @@ func (t *rtype) String() string { return s } +func (t *rtype) Size() uintptr { return t.size } + func (t *rtype) Kind() Kind { return Kind(t.kind & kindMask) } +func (t *rtype) pointers() bool { return t.ptrdata != 0 } + func (t *rtype) common() *rtype { return t } func (t *rtype) exportedMethods() []method { diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go index 837fa6c638..985087254f 100644 --- a/src/internal/reflectlite/value.go +++ b/src/internal/reflectlite/value.go @@ -9,6 +9,8 @@ import ( "unsafe" ) +const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const + // Value is the reflection interface to a Go value. // // Not all methods apply to all kinds of values. Restrictions, @@ -84,6 +86,18 @@ func (f flag) ro() flag { return 0 } +// pointer returns the underlying pointer represented by v. +// v.Kind() must be Ptr, Map, Chan, Func, or UnsafePointer +func (v Value) pointer() unsafe.Pointer { + if v.typ.size != ptrSize || !v.typ.pointers() { + panic("can't call pointer on a non-pointer Value") + } + if v.flag&flagIndir != 0 { + return *(*unsafe.Pointer)(v.ptr) + } + return v.ptr +} + // packEface converts v to the empty interface. func packEface(v Value) interface{} { t := v.typ @@ -316,6 +330,32 @@ func (v Value) Kind() Kind { return v.kind() } +// implemented in runtime: +func chanlen(unsafe.Pointer) int +func maplen(unsafe.Pointer) int + +// Len returns v's length. +// It panics if v's Kind is not Array, Chan, Map, Slice, or String. +func (v Value) Len() int { + k := v.kind() + switch k { + case Array: + tt := (*arrayType)(unsafe.Pointer(v.typ)) + return int(tt.len) + case Chan: + return chanlen(v.pointer()) + case Map: + return maplen(v.pointer()) + case Slice: + // Slice is bigger than a word; assume flagIndir. + return (*sliceHeader)(v.ptr).Len + case String: + // String is bigger than a word; assume flagIndir. + return (*stringHeader)(v.ptr).Len + } + panic(&ValueError{"reflect.Value.Len", v.kind()}) +} + // NumMethod returns the number of exported methods in the value's method set. func (v Value) numMethod() int { if v.typ == nil { @@ -427,6 +467,17 @@ func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value panic(context + ": value of type " + v.typ.String() + " is not assignable to type " + dst.String()) } +// arrayAt returns the i-th element of p, +// an array whose elements are eltSize bytes wide. +// The array pointed at by p must have at least i+1 elements: +// it is invalid (but impossible to check here) to pass i >= len, +// because then the result will point outside the array. +// whySafe must explain why i < len. (Passing "i < len" is fine; +// the benefit is to surface this assumption at the call site.) +func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer { + return add(p, uintptr(i)*eltSize, "i < len") +} + func ifaceE2I(t *rtype, src interface{}, dst unsafe.Pointer) // typedmemmove copies a value of type t to dst from src. diff --git a/src/runtime/chan.go b/src/runtime/chan.go index 8194457434..8334c1ebba 100644 --- a/src/runtime/chan.go +++ b/src/runtime/chan.go @@ -678,6 +678,14 @@ func reflect_chanlen(c *hchan) int { return int(c.qcount) } +//go:linkname reflectlite_chanlen internal/reflectlite.chanlen +func reflectlite_chanlen(c *hchan) int { + if c == nil { + return 0 + } + return int(c.qcount) +} + //go:linkname reflect_chancap reflect.chancap func reflect_chancap(c *hchan) int { if c == nil { diff --git a/src/runtime/map.go b/src/runtime/map.go index 0ebbf2ae76..bb32526846 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -1371,6 +1371,18 @@ func reflect_maplen(h *hmap) int { return h.count } +//go:linkname reflectlite_maplen internal/reflectlite.maplen +func reflectlite_maplen(h *hmap) int { + if h == nil { + return 0 + } + if raceenabled { + callerpc := getcallerpc() + racereadpc(unsafe.Pointer(h), callerpc, funcPC(reflect_maplen)) + } + return h.count +} + //go:linkname reflect_ismapkey reflect.ismapkey func reflect_ismapkey(t *_type) bool { return ismapkey(t) diff --git a/src/sort/slice.go b/src/sort/slice.go index 206f12173d..5196affcfd 100644 --- a/src/sort/slice.go +++ b/src/sort/slice.go @@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !compiler_bootstrap go1.8 +// +build !compiler_bootstrap go1.13 package sort -import "reflect" +import ( + "internal/reflectlite" +) // Slice sorts the provided slice given the provided less function. // @@ -15,8 +17,8 @@ import "reflect" // // The function panics if the provided interface is not a slice. func Slice(slice interface{}, less func(i, j int) bool) { - rv := reflect.ValueOf(slice) - swap := reflect.Swapper(slice) + rv := reflectlite.ValueOf(slice) + swap := reflectlite.Swapper(slice) length := rv.Len() quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length)) } @@ -26,8 +28,8 @@ func Slice(slice interface{}, less func(i, j int) bool) { // // The function panics if the provided interface is not a slice. func SliceStable(slice interface{}, less func(i, j int) bool) { - rv := reflect.ValueOf(slice) - swap := reflect.Swapper(slice) + rv := reflectlite.ValueOf(slice) + swap := reflectlite.Swapper(slice) stable_func(lessSwap{less, swap}, rv.Len()) } @@ -35,7 +37,7 @@ func SliceStable(slice interface{}, less func(i, j int) bool) { // // The function panics if the provided interface is not a slice. func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool { - rv := reflect.ValueOf(slice) + rv := reflectlite.ValueOf(slice) n := rv.Len() for i := n - 1; i > 0; i-- { if less(i, i-1) { diff --git a/src/sort/slice_pre113.go b/src/sort/slice_pre113.go new file mode 100644 index 0000000000..4d5f759a92 --- /dev/null +++ b/src/sort/slice_pre113.go @@ -0,0 +1,46 @@ +// Copyright 2017 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. + +// +build go1.8,!go1.13 + +package sort + +import "reflect" + +// Slice sorts the provided slice given the provided less function. +// +// The sort is not guaranteed to be stable. For a stable sort, use +// SliceStable. +// +// The function panics if the provided interface is not a slice. +func Slice(slice interface{}, less func(i, j int) bool) { + rv := reflect.ValueOf(slice) + swap := reflect.Swapper(slice) + length := rv.Len() + quickSort_func(lessSwap{less, swap}, 0, length, maxDepth(length)) +} + +// SliceStable sorts the provided slice given the provided less +// function while keeping the original order of equal elements. +// +// The function panics if the provided interface is not a slice. +func SliceStable(slice interface{}, less func(i, j int) bool) { + rv := reflect.ValueOf(slice) + swap := reflect.Swapper(slice) + stable_func(lessSwap{less, swap}, rv.Len()) +} + +// SliceIsSorted tests whether a slice is sorted. +// +// The function panics if the provided interface is not a slice. +func SliceIsSorted(slice interface{}, less func(i, j int) bool) bool { + rv := reflect.ValueOf(slice) + n := rv.Len() + for i := n - 1; i > 0; i-- { + if less(i, i-1) { + return false + } + } + return true +} -- GitLab From f24e1099cb28d5ab793e5259c6ee2733227eb2f2 Mon Sep 17 00:00:00 2001 From: Ben Hoyt Date: Wed, 27 Mar 2019 07:36:27 -0400 Subject: [PATCH 0608/1679] bytes: make TrimSpace return nil on all-space input Issue #29122 introduced a subtle regression due to the way that TrimFuncLeft is written: previously TrimSpace returned nil when given an input of all whitespace, but with the #29122 changes it returned an empty slice on all-space input. This change adds a special case to the new, optimized TrimSpace to go back to that behavior. While it is odd behavior and people shouldn't be relying on these functions returning a nil slice in practice, it's not worth the breakage of code that does. This tweak doesn't change the TrimSpace benchmarks significantly. Fixes #31038 Change-Id: Idb495d02b474054d2b2f593c2e318a7a6625688a Reviewed-on: https://go-review.googlesource.com/c/go/+/169518 Reviewed-by: Ian Lance Taylor --- src/bytes/bytes.go | 5 +++ src/bytes/bytes_test.go | 71 ++++++++++++++++++++++++----------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index 08fc14d837..bdd55fca4a 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -788,6 +788,11 @@ func TrimSpace(s []byte) []byte { // At this point s[start:stop] starts and ends with an ASCII // non-space bytes, so we're done. Non-ASCII cases have already // been handled above. + if start == stop { + // Special case to preserve previous TrimLeftFunc behavior, + // returning nil instead of empty slice if all spaces. + return nil + } return s[start:stop] } diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index d508fc9895..a29ad5f3a0 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -909,54 +909,65 @@ func TestFieldsFunc(t *testing.T) { } // Test case for any function which accepts and returns a byte slice. -// For ease of creation, we write the byte slices as strings. +// For ease of creation, we write the input byte slice as a string. type StringTest struct { - in, out string + in string + out []byte } var upperTests = []StringTest{ - {"", ""}, - {"abc", "ABC"}, - {"AbC123", "ABC123"}, - {"azAZ09_", "AZAZ09_"}, - {"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char + {"", []byte("")}, + {"abc", []byte("ABC")}, + {"AbC123", []byte("ABC123")}, + {"azAZ09_", []byte("AZAZ09_")}, + {"\u0250\u0250\u0250\u0250\u0250", []byte("\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F")}, // grows one byte per char } var lowerTests = []StringTest{ - {"", ""}, - {"abc", "abc"}, - {"AbC123", "abc123"}, - {"azAZ09_", "azaz09_"}, - {"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", "\u0251\u0251\u0251\u0251\u0251"}, // shrinks one byte per char + {"", []byte("")}, + {"abc", []byte("abc")}, + {"AbC123", []byte("abc123")}, + {"azAZ09_", []byte("azaz09_")}, + {"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", []byte("\u0251\u0251\u0251\u0251\u0251")}, // shrinks one byte per char } const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000" var trimSpaceTests = []StringTest{ - {"", ""}, - {"abc", "abc"}, - {space + "abc" + space, "abc"}, - {" ", ""}, - {" \t\r\n \t\t\r\r\n\n ", ""}, - {" \t\r\n x\t\t\r\r\n\n ", "x"}, - {" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"}, - {"1 \t\r\n2", "1 \t\r\n2"}, - {" x\x80", "x\x80"}, - {" x\xc0", "x\xc0"}, - {"x \xc0\xc0 ", "x \xc0\xc0"}, - {"x \xc0", "x \xc0"}, - {"x \xc0 ", "x \xc0"}, - {"x \xc0\xc0 ", "x \xc0\xc0"}, - {"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"}, - {"x ☺ ", "x ☺"}, + {"", nil}, + {" a", []byte("a")}, + {"b ", []byte("b")}, + {"abc", []byte("abc")}, + {space + "abc" + space, []byte("abc")}, + {" ", nil}, + {"\u3000 ", nil}, + {" \u3000", nil}, + {" \t\r\n \t\t\r\r\n\n ", nil}, + {" \t\r\n x\t\t\r\r\n\n ", []byte("x")}, + {" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", []byte("x\t\t\r\r\ny")}, + {"1 \t\r\n2", []byte("1 \t\r\n2")}, + {" x\x80", []byte("x\x80")}, + {" x\xc0", []byte("x\xc0")}, + {"x \xc0\xc0 ", []byte("x \xc0\xc0")}, + {"x \xc0", []byte("x \xc0")}, + {"x \xc0 ", []byte("x \xc0")}, + {"x \xc0\xc0 ", []byte("x \xc0\xc0")}, + {"x ☺\xc0\xc0 ", []byte("x ☺\xc0\xc0")}, + {"x ☺ ", []byte("x ☺")}, } // Execute f on each test case. funcName should be the name of f; it's used // in failure reports. func runStringTests(t *testing.T, f func([]byte) []byte, funcName string, testCases []StringTest) { for _, tc := range testCases { - actual := string(f([]byte(tc.in))) - if actual != tc.out { + actual := f([]byte(tc.in)) + if actual == nil && tc.out != nil { + t.Errorf("%s(%q) = nil; want %q", funcName, tc.in, tc.out) + } + if actual != nil && tc.out == nil { + t.Errorf("%s(%q) = %q; want nil", funcName, tc.in, actual) + } + if !Equal(actual, tc.out) { t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out) } } -- GitLab From 90a3ce02dc25adcf1598faf11a66b151ada3f637 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 27 Mar 2019 14:25:24 +0100 Subject: [PATCH 0609/1679] cmd/link/internal/ld: skip TLS section on Android We don't use the TLS section on android, and dropping it avoids complaints about underalignment from the Android Q linker. Updates #29674 Change-Id: I91dabf2a58e6eb1783872639a6a144858db09cef Reviewed-on: https://go-review.googlesource.com/c/go/+/169618 Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/lib.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 1d44c0eb18..b331e39fe3 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -453,18 +453,23 @@ func (ctxt *Link) loadlib() { } } - tlsg := ctxt.Syms.Lookup("runtime.tlsg", 0) - - // runtime.tlsg is used for external linking on platforms that do not define - // a variable to hold g in assembly (currently only intel). - if tlsg.Type == 0 { - tlsg.Type = sym.STLSBSS - tlsg.Size = int64(ctxt.Arch.PtrSize) - } else if tlsg.Type != sym.SDYNIMPORT { - Errorf(nil, "runtime declared tlsg variable %v", tlsg.Type) - } - tlsg.Attr |= sym.AttrReachable - ctxt.Tlsg = tlsg + // The Android Q linker started to complain about underalignment of the our TLS + // section. We don't actually use the section on android, so dont't + // generate it. + if objabi.GOOS != "android" { + tlsg := ctxt.Syms.Lookup("runtime.tlsg", 0) + + // runtime.tlsg is used for external linking on platforms that do not define + // a variable to hold g in assembly (currently only intel). + if tlsg.Type == 0 { + tlsg.Type = sym.STLSBSS + tlsg.Size = int64(ctxt.Arch.PtrSize) + } else if tlsg.Type != sym.SDYNIMPORT { + Errorf(nil, "runtime declared tlsg variable %v", tlsg.Type) + } + tlsg.Attr |= sym.AttrReachable + ctxt.Tlsg = tlsg + } var moduledata *sym.Symbol if ctxt.BuildMode == BuildModePlugin { -- GitLab From 5ee2290420889281637b536473a9a51ffd63dda4 Mon Sep 17 00:00:00 2001 From: Brian Kessler Date: Thu, 31 Jan 2019 22:28:21 -0700 Subject: [PATCH 0610/1679] math/big: implement Rat.SetUint64 Implemented via the underlying Int.SetUint64. Added tests for Rat.SetInt64 and Rat.SetUint64. Fixes #29579 Change-Id: I03faaffc93e36873b202b58ae72b139dea5c40f9 Reviewed-on: https://go-review.googlesource.com/c/go/+/160682 Run-TryBot: Robert Griesemer TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/rat.go | 7 ++++++ src/math/big/rat_test.go | 51 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/src/math/big/rat.go b/src/math/big/rat.go index 5d0800ca93..675889f33b 100644 --- a/src/math/big/rat.go +++ b/src/math/big/rat.go @@ -339,6 +339,13 @@ func (z *Rat) SetInt64(x int64) *Rat { return z } +// SetUint64 sets z to x and returns z. +func (z *Rat) SetUint64(x uint64) *Rat { + z.a.SetUint64(x) + z.b.abs = z.b.abs[:0] + return z +} + // Set sets z to x (by making a copy of x) and returns z. func (z *Rat) Set(x *Rat) *Rat { if z != x { diff --git a/src/math/big/rat_test.go b/src/math/big/rat_test.go index afda68658f..b169477e23 100644 --- a/src/math/big/rat_test.go +++ b/src/math/big/rat_test.go @@ -620,3 +620,54 @@ func TestIsFinite(t *testing.T) { } } } + +func TestRatSetInt64(t *testing.T) { + var testCases = []int64{ + 0, + 1, + -1, + 12345, + -98765, + math.MaxInt64, + math.MinInt64, + } + var r = new(Rat) + for i, want := range testCases { + r.SetInt64(want) + if !r.IsInt() { + t.Errorf("#%d: Rat.SetInt64(%d) is not an integer", i, want) + } + num := r.Num() + if !num.IsInt64() { + t.Errorf("#%d: Rat.SetInt64(%d) numerator is not an int64", i, want) + } + got := num.Int64() + if got != want { + t.Errorf("#%d: Rat.SetInt64(%d) = %d, but expected %d", i, want, got, want) + } + } +} + +func TestRatSetUint64(t *testing.T) { + var testCases = []uint64{ + 0, + 1, + 12345, + ^uint64(0), + } + var r = new(Rat) + for i, want := range testCases { + r.SetUint64(want) + if !r.IsInt() { + t.Errorf("#%d: Rat.SetUint64(%d) is not an integer", i, want) + } + num := r.Num() + if !num.IsUint64() { + t.Errorf("#%d: Rat.SetUint64(%d) numerator is not a uint64", i, want) + } + got := num.Uint64() + if got != want { + t.Errorf("#%d: Rat.SetUint64(%d) = %d, but expected %d", i, want, got, want) + } + } +} -- GitLab From c7f7f59368c3a964b8214018dc5100806b243938 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Mon, 11 Mar 2019 13:58:20 +0700 Subject: [PATCH 0611/1679] os: reject WriteAt if file opened in append mode WriteAt use pwrite syscall on *nix or WriteFile on Windows. On Linux/Windows, these system calls always write to end of file in append mode, regardless of offset parameter. It is hard (maybe impossible) to make WriteAt work portably. Making WriteAt returns an error if file is opened in append mode, we guarantee to get consistent behavior between platforms, also prevent user from accidently corrupting their data. Fixes #30716 Change-Id: If83d935a22a29eed2ff8fe53d13d0b4798aa2b81 Reviewed-on: https://go-review.googlesource.com/c/go/+/166578 Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/export_test.go | 1 + src/os/file.go | 15 ++++++++++++++- src/os/file_plan9.go | 7 ++++--- src/os/file_unix.go | 1 + src/os/file_windows.go | 7 ++++--- src/os/os_test.go | 15 +++++++++++++++ 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/os/export_test.go b/src/os/export_test.go index d735aeea61..812432cee4 100644 --- a/src/os/export_test.go +++ b/src/os/export_test.go @@ -8,3 +8,4 @@ package os var Atime = atime var LstatP = &lstat +var ErrWriteAtInAppendMode = errWriteAtInAppendMode diff --git a/src/os/file.go b/src/os/file.go index a44263ee8a..258a3e6109 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -163,13 +163,20 @@ func (f *File) Write(b []byte) (n int, err error) { return n, err } +var errWriteAtInAppendMode = errors.New("os: invalid use of WriteAt on file opened with O_APPEND") + // WriteAt writes len(b) bytes to the File starting at byte offset off. // It returns the number of bytes written and an error, if any. // WriteAt returns a non-nil error when n != len(b). +// +// If file was opened with the O_APPEND flag, WriteAt returns an error. func (f *File) WriteAt(b []byte, off int64) (n int, err error) { if err := f.checkValid("write"); err != nil { return 0, err } + if f.appendMode { + return 0, errWriteAtInAppendMode + } if off < 0 { return 0, &PathError{"writeat", f.name, errors.New("negative offset")} @@ -286,7 +293,13 @@ func Create(name string) (*File, error) { // If there is an error, it will be of type *PathError. func OpenFile(name string, flag int, perm FileMode) (*File, error) { testlog.Open(name) - return openFileNolog(name, flag, perm) + f, err := openFileNolog(name, flag, perm) + if err != nil { + return nil, err + } + f.appendMode = flag&O_APPEND != 0 + + return f, nil } // lstat is overridden in tests. diff --git a/src/os/file_plan9.go b/src/os/file_plan9.go index 3fa12e6816..14091873cf 100644 --- a/src/os/file_plan9.go +++ b/src/os/file_plan9.go @@ -22,9 +22,10 @@ func fixLongPath(path string) string { // can overwrite this data, which could cause the finalizer // to close the wrong file descriptor. type file struct { - fd int - name string - dirinfo *dirInfo // nil unless directory being read + fd int + name string + dirinfo *dirInfo // nil unless directory being read + appendMode bool // whether file is opened for appending } // Fd returns the integer Plan 9 file descriptor referencing the open file. diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 4b62abfb5c..1cd8000dd4 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -52,6 +52,7 @@ type file struct { dirinfo *dirInfo // nil unless directory being read nonblock bool // whether we set nonblocking mode stdoutOrErr bool // whether this is stdout or stderr + appendMode bool // whether file is opened for appending } // Fd returns the integer Unix file descriptor referencing the open file. diff --git a/src/os/file_windows.go b/src/os/file_windows.go index f311ae11d9..08444d728f 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -19,9 +19,10 @@ import ( // can overwrite this data, which could cause the finalizer // to close the wrong file descriptor. type file struct { - pfd poll.FD - name string - dirinfo *dirInfo // nil unless directory being read + pfd poll.FD + name string + dirinfo *dirInfo // nil unless directory being read + appendMode bool // whether file is opened for appending } // Fd returns the Windows handle referencing the open file. diff --git a/src/os/os_test.go b/src/os/os_test.go index c5c6b49e8f..1de46c29f5 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -1646,6 +1646,21 @@ func TestWriteAtNegativeOffset(t *testing.T) { } } +// Verify that WriteAt doesn't work in append mode. +func TestWriteAtInAppendMode(t *testing.T) { + defer chtmpdir(t)() + f, err := OpenFile("write_at_in_append_mode.txt", O_APPEND|O_CREATE, 0666) + if err != nil { + t.Fatalf("OpenFile: %v", err) + } + defer f.Close() + + _, err = f.WriteAt([]byte(""), 1) + if err != ErrWriteAtInAppendMode { + t.Fatalf("f.WriteAt returned %v, expected %v", err, ErrWriteAtInAppendMode) + } +} + func writeFile(t *testing.T, fname string, flag int, text string) string { f, err := OpenFile(fname, flag, 0666) if err != nil { -- GitLab From 53c9c068115168ebcc1e649fa7a15a804a99d92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Tue, 26 Mar 2019 15:00:00 +0100 Subject: [PATCH 0612/1679] misc/cgo: enable testso and testsovar on aix/ppc64 On AIX, shared objects must be wrapped under an archive file. For testso, creating libcgosotest with an extern symbol isn't AIX-friendly. By default, ld will block such behavior. Rather than forcing ld to work as on Linux and using the run-time linking, goCallback became a function pointer which is set by setCallback(). Updates #30565 Change-Id: I455ab32faddd41f1b0c84cc9e503788044ad49b2 Reviewed-on: https://go-review.googlesource.com/c/go/+/169020 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- misc/cgo/testso/so_test.go | 15 ++++++++++++--- misc/cgo/testso/testdata/cgoso.c | 2 +- misc/cgo/testso/testdata/cgoso.go | 1 + misc/cgo/testso/testdata/cgoso_c.c | 9 +++++++++ misc/cgo/testso/testdata/cgoso_unix.go | 2 +- misc/cgo/testsovar/so_test.go | 15 ++++++++++++--- misc/cgo/testsovar/testdata/cgoso.go | 1 + 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/misc/cgo/testso/so_test.go b/misc/cgo/testso/so_test.go index 68388caa90..9c7f272439 100644 --- a/misc/cgo/testso/so_test.go +++ b/misc/cgo/testso/so_test.go @@ -28,9 +28,6 @@ func requireTestSOSupported(t *testing.T) { if runtime.GOOS == "linux" { t.Skip("External linking not implemented on aix/ppc64 (issue #8912).") } - if runtime.GOOS == "aix" { - t.Skip("Using shared object isn't yet available on aix/ppc64 (issue #30565)") - } case "mips64le", "mips64": t.Skip("External linking not implemented on mips64.") } @@ -85,6 +82,8 @@ func TestSO(t *testing.T) { case "windows": ext = "dll" args = append(args, "-DEXPORT_DLL") + case "aix": + ext = "so.1" } sofname := "libcgosotest." + ext args = append(args, "-o", sofname, "cgoso_c.c") @@ -98,6 +97,16 @@ func TestSO(t *testing.T) { } t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + if runtime.GOOS == "aix" { + // Shared object must be wrapped by an archive + cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1") + cmd.Dir = modRoot + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + } + cmd = exec.Command("go", "build", "-o", "main.exe", "main.go") cmd.Dir = modRoot cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) diff --git a/misc/cgo/testso/testdata/cgoso.c b/misc/cgo/testso/testdata/cgoso.c index 917f472d36..612e5d335a 100644 --- a/misc/cgo/testso/testdata/cgoso.c +++ b/misc/cgo/testso/testdata/cgoso.c @@ -4,7 +4,7 @@ #include "_cgo_export.h" -#ifdef WIN32 +#if defined(WIN32) || defined(_AIX) extern void setCallback(void *); void init() { setCallback(goCallback); diff --git a/misc/cgo/testso/testdata/cgoso.go b/misc/cgo/testso/testdata/cgoso.go index 29814fa43a..bba5de3312 100644 --- a/misc/cgo/testso/testdata/cgoso.go +++ b/misc/cgo/testso/testdata/cgoso.go @@ -15,6 +15,7 @@ package cgosotest #cgo netbsd LDFLAGS: -L. libcgosotest.so #cgo darwin LDFLAGS: -L. libcgosotest.dylib #cgo windows LDFLAGS: -L. libcgosotest.dll +#cgo aix LDFLAGS: -L. -l cgosotest void init(void); void sofunc(void); diff --git a/misc/cgo/testso/testdata/cgoso_c.c b/misc/cgo/testso/testdata/cgoso_c.c index 7a38022b54..e5015ed5e8 100644 --- a/misc/cgo/testso/testdata/cgoso_c.c +++ b/misc/cgo/testso/testdata/cgoso_c.c @@ -14,6 +14,15 @@ __declspec(dllexport) void setCallback(void *f) goCallback = (void (*)())f; } __declspec(dllexport) void sofunc(void); +#elif defined(_AIX) +// AIX doesn't allow the creation of a shared object with an +// undefined symbol. It's possible to bypass this problem by +// using -Wl,-G and -Wl,-brtl option which allows run-time linking. +// However, that's not how most of AIX shared object works. +// Therefore, it's better to consider goCallback as a pointer and +// to set up during an init function. +void (*goCallback)(void); +void setCallback(void *f) { goCallback = f; } #else extern void goCallback(void); void setCallback(void *f) { (void)f; } diff --git a/misc/cgo/testso/testdata/cgoso_unix.go b/misc/cgo/testso/testdata/cgoso_unix.go index 49cdeaa2f5..1860694f1e 100644 --- a/misc/cgo/testso/testdata/cgoso_unix.go +++ b/misc/cgo/testso/testdata/cgoso_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build dragonfly freebsd linux netbsd solaris +// +build aix dragonfly freebsd linux netbsd solaris package cgosotest diff --git a/misc/cgo/testsovar/so_test.go b/misc/cgo/testsovar/so_test.go index 68388caa90..9c7f272439 100644 --- a/misc/cgo/testsovar/so_test.go +++ b/misc/cgo/testsovar/so_test.go @@ -28,9 +28,6 @@ func requireTestSOSupported(t *testing.T) { if runtime.GOOS == "linux" { t.Skip("External linking not implemented on aix/ppc64 (issue #8912).") } - if runtime.GOOS == "aix" { - t.Skip("Using shared object isn't yet available on aix/ppc64 (issue #30565)") - } case "mips64le", "mips64": t.Skip("External linking not implemented on mips64.") } @@ -85,6 +82,8 @@ func TestSO(t *testing.T) { case "windows": ext = "dll" args = append(args, "-DEXPORT_DLL") + case "aix": + ext = "so.1" } sofname := "libcgosotest." + ext args = append(args, "-o", sofname, "cgoso_c.c") @@ -98,6 +97,16 @@ func TestSO(t *testing.T) { } t.Logf("%s:\n%s", strings.Join(cmd.Args, " "), out) + if runtime.GOOS == "aix" { + // Shared object must be wrapped by an archive + cmd = exec.Command("ar", "-X64", "-q", "libcgosotest.a", "libcgosotest.so.1") + cmd.Dir = modRoot + out, err = cmd.CombinedOutput() + if err != nil { + t.Fatalf("%s: %s\n%s", strings.Join(cmd.Args, " "), err, out) + } + } + cmd = exec.Command("go", "build", "-o", "main.exe", "main.go") cmd.Dir = modRoot cmd.Env = append(os.Environ(), "GOPATH="+GOPATH) diff --git a/misc/cgo/testsovar/testdata/cgoso.go b/misc/cgo/testsovar/testdata/cgoso.go index 88d44c2c6e..9c7f95e92e 100644 --- a/misc/cgo/testsovar/testdata/cgoso.go +++ b/misc/cgo/testsovar/testdata/cgoso.go @@ -19,6 +19,7 @@ package cgosotest #cgo netbsd LDFLAGS: -L. libcgosotest.so #cgo darwin LDFLAGS: -L. libcgosotest.dylib #cgo windows LDFLAGS: -L. libcgosotest.dll +#cgo aix LDFLAGS: -L. -l cgosotest #include "cgoso_c.h" -- GitLab From 38dc177d3ac5b5a8cb6b7f9039144cbe8bd58036 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 25 Mar 2019 10:31:30 +0100 Subject: [PATCH 0613/1679] runtime: create library startup for aix/ppc64 As .init_array section aren't available on AIX, the Go runtime initialization is made with gcc constructor attribute. However, as cgo tool is building a binary in order to get imported C symbols, Go symbols imported for this initilization must be ignored. -Wl,-berok is mandatory otherwize ld will fail to create this binary, _rt0_aix_ppc64_lib and runtime_rt0_go aren't defined in runtime/cgo. These two symbols must also be ignored when creating _cgo_import.go. Change-Id: Icf2e0282f5b50de5fa82007439a428e6147efef1 Reviewed-on: https://go-review.googlesource.com/c/go/+/169118 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/out.go | 6 ++ src/cmd/go/internal/work/security.go | 1 + src/runtime/cgo/callbacks_aix.go | 1 + src/runtime/cgo/cgo.go | 1 + src/runtime/cgo/gcc_aix_ppc64.c | 16 +++ src/runtime/os2_aix.go | 100 +++++++++++++++--- src/runtime/os_aix.go | 68 +++++++++++- src/runtime/rt0_aix_ppc64.s | 150 +++++++++++++++++++++++++++ src/runtime/symtab.go | 3 + src/runtime/sys_aix_ppc64.s | 104 ++++++++++++++----- 10 files changed, 409 insertions(+), 41 deletions(-) diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 5d61a2fb8a..5b3a7cb9c1 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -336,6 +336,12 @@ func dynimport(obj string) { fatalf("cannot load imported symbols from XCOFF file %s: %v", obj, err) } for _, s := range sym { + if s.Name == "runtime_rt0_go" || s.Name == "_rt0_ppc64_aix_lib" { + // These symbols are imported by runtime/cgo but + // must not be added to _cgo_import.go as there are + // Go symbols. + continue + } fmt.Fprintf(stdout, "//go:cgo_import_dynamic %s %s %q\n", s.Name, s.Name, s.Library) } lib, err := f.ImportedLibraries() diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go index 9e26ab8353..8351e4c731 100644 --- a/src/cmd/go/internal/work/security.go +++ b/src/cmd/go/internal/work/security.go @@ -171,6 +171,7 @@ var validLinkerFlags = []*lazyregexp.Regexp{ re(`-Wl,--(no-)?allow-shlib-undefined`), re(`-Wl,--(no-)?as-needed`), re(`-Wl,-Bdynamic`), + re(`-Wl,-berok`), re(`-Wl,-Bstatic`), re(`-WL,-O([^@,\-][^,]*)?`), re(`-Wl,-d[ny]`), diff --git a/src/runtime/cgo/callbacks_aix.go b/src/runtime/cgo/callbacks_aix.go index 7dafb6b310..f4b6fe25fa 100644 --- a/src/runtime/cgo/callbacks_aix.go +++ b/src/runtime/cgo/callbacks_aix.go @@ -8,3 +8,4 @@ package cgo // longcall on cgo programs (cf gcc_aix_ppc64.c). //go:cgo_export_static __cgo_topofstack //go:cgo_export_static runtime.rt0_go +//go:cgo_export_static _rt0_ppc64_aix_lib diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go index 241a821e4f..eb11c0e100 100644 --- a/src/runtime/cgo/cgo.go +++ b/src/runtime/cgo/cgo.go @@ -20,6 +20,7 @@ package cgo #cgo !android,linux LDFLAGS: -lpthread #cgo netbsd LDFLAGS: -lpthread #cgo openbsd LDFLAGS: -lpthread +#cgo aix LDFLAGS: -Wl,-berok #cgo CFLAGS: -Wall -Werror diff --git a/src/runtime/cgo/gcc_aix_ppc64.c b/src/runtime/cgo/gcc_aix_ppc64.c index d54c0ff32d..f4f50b89ce 100644 --- a/src/runtime/cgo/gcc_aix_ppc64.c +++ b/src/runtime/cgo/gcc_aix_ppc64.c @@ -12,6 +12,7 @@ */ extern int __attribute__((longcall)) __cgo_topofstack(void); extern int __attribute__((longcall)) runtime_rt0_go(int argc, char **argv); +extern void __attribute__((longcall)) _rt0_ppc64_aix_lib(void); int _cgo_topofstack(void) { return __cgo_topofstack(); @@ -20,3 +21,18 @@ int _cgo_topofstack(void) { int main(int argc, char **argv) { return runtime_rt0_go(argc, argv); } + +static void libinit(void) __attribute__ ((constructor)); + +/* + * libinit aims to replace .init_array section which isn't available on aix. + * Using __attribute__ ((constructor)) let gcc handles this instead of + * adding special code in cmd/link. + * However, it will be called for every Go programs which has cgo. + * Inside _rt0_ppc64_aix_lib(), runtime.isarchive is checked in order + * to know if this program is a c-archive or a simple cgo program. + * If it's not set, _rt0_ppc64_ax_lib() returns directly. + */ +static void libinit() { + _rt0_ppc64_aix_lib(); +} diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go index e2ae04a55d..2ec32feb9c 100644 --- a/src/runtime/os2_aix.go +++ b/src/runtime/os2_aix.go @@ -363,15 +363,34 @@ func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) { return c.r1, c.err } +func exit1(code int32) + //go:nosplit func exit(code int32) { - syscall1(&libc_exit, uintptr(code)) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + syscall1(&libc_exit, uintptr(code)) + return + } + exit1(code) } +func write1(fd, p uintptr, n int32) int32 + //go:nosplit func write(fd uintptr, p unsafe.Pointer, n int32) int32 { - r, _ := syscall3(&libc_write, uintptr(fd), uintptr(p), uintptr(n)) - return int32(r) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + r, _ := syscall3(&libc_write, uintptr(fd), uintptr(p), uintptr(n)) + return int32(r) + } + return write1(fd, uintptr(p), n) } @@ -428,13 +447,24 @@ func madvise(addr unsafe.Pointer, n uintptr, flags int32) { } } +func sigaction1(sig, new, old uintptr) + //go:nosplit func sigaction(sig uintptr, new, old *sigactiont) { - r, err := syscall3(&libc_sigaction, sig, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) - if int32(r) == -1 { - println("Sigaction failed for sig: ", sig, " with error:", hex(err)) - throw("syscall sigaction") + _g_ := getg() + + // Check the validity of g because without a g during + // runtime.libpreinit. + if _g_ != nil { + r, err := syscall3(&libc_sigaction, sig, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) + if int32(r) == -1 { + println("Sigaction failed for sig: ", sig, " with error:", hex(err)) + throw("syscall sigaction") + } + return } + + sigaction1(sig, uintptr(unsafe.Pointer(new)), uintptr(unsafe.Pointer(old))) } //go:nosplit @@ -574,16 +604,36 @@ func pthread_attr_destroy(attr *pthread_attr) int32 { return int32(r) } +func pthread_attr_init1(attr uintptr) int32 + //go:nosplit func pthread_attr_init(attr *pthread_attr) int32 { - r, _ := syscall1(&libpthread_attr_init, uintptr(unsafe.Pointer(attr))) - return int32(r) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + r, _ := syscall1(&libpthread_attr_init, uintptr(unsafe.Pointer(attr))) + return int32(r) + } + + return pthread_attr_init1(uintptr(unsafe.Pointer(attr))) } +func pthread_attr_setdetachstate1(attr uintptr, state int32) int32 + //go:nosplit func pthread_attr_setdetachstate(attr *pthread_attr, state int32) int32 { - r, _ := syscall2(&libpthread_attr_setdetachstate, uintptr(unsafe.Pointer(attr)), uintptr(state)) - return int32(r) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + r, _ := syscall2(&libpthread_attr_setdetachstate, uintptr(unsafe.Pointer(attr)), uintptr(state)) + return int32(r) + } + + return pthread_attr_setdetachstate1(uintptr(unsafe.Pointer(attr)), state) } //go:nosplit @@ -598,16 +648,36 @@ func pthread_attr_getstacksize(attr *pthread_attr, size *uint64) int32 { return int32(r) } +func pthread_attr_setstacksize1(attr uintptr, size uint64) int32 + //go:nosplit func pthread_attr_setstacksize(attr *pthread_attr, size uint64) int32 { - r, _ := syscall2(&libpthread_attr_setstacksize, uintptr(unsafe.Pointer(attr)), uintptr(size)) - return int32(r) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + r, _ := syscall2(&libpthread_attr_setstacksize, uintptr(unsafe.Pointer(attr)), uintptr(size)) + return int32(r) + } + + return pthread_attr_setstacksize1(uintptr(unsafe.Pointer(attr)), size) } +func pthread_create1(tid, attr, fn, arg uintptr) int32 + //go:nosplit func pthread_create(tid *pthread, attr *pthread_attr, fn *funcDescriptor, arg unsafe.Pointer) int32 { - r, _ := syscall4(&libpthread_create, uintptr(unsafe.Pointer(tid)), uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(fn)), uintptr(arg)) - return int32(r) + _g_ := getg() + + // Check the validity of g because without a g during + // newosproc0. + if _g_ != nil { + r, _ := syscall4(&libpthread_create, uintptr(unsafe.Pointer(tid)), uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(fn)), uintptr(arg)) + return int32(r) + } + + return pthread_create1(uintptr(unsafe.Pointer(tid)), uintptr(unsafe.Pointer(attr)), uintptr(unsafe.Pointer(fn)), uintptr(arg)) } // On multi-thread program, sigprocmask must not be called. diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go index 45c7174e05..faec9ac113 100644 --- a/src/runtime/os_aix.go +++ b/src/runtime/os_aix.go @@ -97,6 +97,66 @@ func osinit() { setupSystemConf() } +// newosproc0 is a version of newosproc that can be called before the runtime +// is initialized. +// +// This function is not safe to use after initialization as it does not pass an M as fnarg. +// +//go:nosplit +func newosproc0(stacksize uintptr, fn *funcDescriptor) { + var ( + attr pthread_attr + oset sigset + tid pthread + ) + + if pthread_attr_init(&attr) != 0 { + write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate))) + exit(1) + } + + if pthread_attr_setstacksize(&attr, threadStackSize) != 0 { + write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate))) + exit(1) + } + + if pthread_attr_setdetachstate(&attr, _PTHREAD_CREATE_DETACHED) != 0 { + write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate))) + exit(1) + } + + // Disable signals during create, so that the new thread starts + // with signals disabled. It will enable them in minit. + sigprocmask(_SIG_SETMASK, &sigset_all, &oset) + var ret int32 + for tries := 0; tries < 20; tries++ { + // pthread_create can fail with EAGAIN for no reasons + // but it will be ok if it retries. + ret = pthread_create(&tid, &attr, fn, nil) + if ret != _EAGAIN { + break + } + usleep(uint32(tries+1) * 1000) // Milliseconds. + } + sigprocmask(_SIG_SETMASK, &oset, nil) + if ret != 0 { + write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate))) + exit(1) + } + +} + +var failthreadcreate = []byte("runtime: failed to create new OS thread\n") + +// Called to do synchronous initialization of Go code built with +// -buildmode=c-archive or -buildmode=c-shared. +// None of the Go runtime is initialized. +//go:nosplit +//go:nowritebarrierrec +func libpreinit() { + initsig(true) +} + // Ms related functions func mpreinit(mp *m) { mp.gsignal = malg(32 * 1024) // AIX wants >= 8K @@ -213,7 +273,13 @@ func setsig(i uint32, fn uintptr) { //go:nosplit //go:nowritebarrierrec func setsigstack(i uint32) { - throw("Not yet implemented\n") + var sa sigactiont + sigaction(uintptr(i), nil, &sa) + if sa.sa_flags&_SA_ONSTACK != 0 { + return + } + sa.sa_flags |= _SA_ONSTACK + sigaction(uintptr(i), &sa, nil) } //go:nosplit diff --git a/src/runtime/rt0_aix_ppc64.s b/src/runtime/rt0_aix_ppc64.s index 843494b202..e06caa1671 100644 --- a/src/runtime/rt0_aix_ppc64.s +++ b/src/runtime/rt0_aix_ppc64.s @@ -47,3 +47,153 @@ TEXT _main(SB),NOSPLIT,$-8 MOVD R12, CTR BR (CTR) + +TEXT _rt0_ppc64_aix_lib(SB),NOSPLIT,$-8 + // Start with standard C stack frame layout and linkage. + MOVD LR, R0 + MOVD R0, 16(R1) // Save LR in caller's frame. + MOVW CR, R0 // Save CR in caller's frame + MOVD R0, 8(R1) + + MOVDU R1, -344(R1) // Allocate frame. + + // Preserve callee-save registers. + MOVD R14, 48(R1) + MOVD R15, 56(R1) + MOVD R16, 64(R1) + MOVD R17, 72(R1) + MOVD R18, 80(R1) + MOVD R19, 88(R1) + MOVD R20, 96(R1) + MOVD R21,104(R1) + MOVD R22, 112(R1) + MOVD R23, 120(R1) + MOVD R24, 128(R1) + MOVD R25, 136(R1) + MOVD R26, 144(R1) + MOVD R27, 152(R1) + MOVD R28, 160(R1) + MOVD R29, 168(R1) + MOVD g, 176(R1) // R30 + MOVD R31, 184(R1) + FMOVD F14, 192(R1) + FMOVD F15, 200(R1) + FMOVD F16, 208(R1) + FMOVD F17, 216(R1) + FMOVD F18, 224(R1) + FMOVD F19, 232(R1) + FMOVD F20, 240(R1) + FMOVD F21, 248(R1) + FMOVD F22, 256(R1) + FMOVD F23, 264(R1) + FMOVD F24, 272(R1) + FMOVD F25, 280(R1) + FMOVD F26, 288(R1) + FMOVD F27, 296(R1) + FMOVD F28, 304(R1) + FMOVD F29, 312(R1) + FMOVD F30, 320(R1) + FMOVD F31, 328(R1) + + // Synchronous initialization. + MOVD $runtime·reginit(SB), R12 + MOVD R12, CTR + BL (CTR) + + MOVBZ runtime·isarchive(SB), R3 // Check buildmode = c-archive + CMP $0, R3 + BEQ done + + MOVD R14, _rt0_ppc64_aix_lib_argc<>(SB) + MOVD R15, _rt0_ppc64_aix_lib_argv<>(SB) + + MOVD $runtime·libpreinit(SB), R12 + MOVD R12, CTR + BL (CTR) + + // Create a new thread to do the runtime initialization and return. + MOVD _cgo_sys_thread_create(SB), R12 + CMP $0, R12 + BEQ nocgo + MOVD $_rt0_ppc64_aix_lib_go(SB), R3 + MOVD $0, R4 + MOVD R2, 40(R1) + MOVD 8(R12), R2 + MOVD (R12), R12 + MOVD R12, CTR + BL (CTR) + MOVD 40(R1), R2 + BR done + +nocgo: + MOVD $0x800000, R12 // stacksize = 8192KB + MOVD R12, 8(R1) + MOVD $_rt0_ppc64_aix_lib_go(SB), R12 + MOVD R12, 16(R1) + MOVD $runtime·newosproc0(SB),R12 + MOVD R12, CTR + BL (CTR) + +done: + // Restore saved registers. + MOVD 48(R1), R14 + MOVD 56(R1), R15 + MOVD 64(R1), R16 + MOVD 72(R1), R17 + MOVD 80(R1), R18 + MOVD 88(R1), R19 + MOVD 96(R1), R20 + MOVD 104(R1), R21 + MOVD 112(R1), R22 + MOVD 120(R1), R23 + MOVD 128(R1), R24 + MOVD 136(R1), R25 + MOVD 144(R1), R26 + MOVD 152(R1), R27 + MOVD 160(R1), R28 + MOVD 168(R1), R29 + MOVD 176(R1), g // R30 + MOVD 184(R1), R31 + FMOVD 196(R1), F14 + FMOVD 200(R1), F15 + FMOVD 208(R1), F16 + FMOVD 216(R1), F17 + FMOVD 224(R1), F18 + FMOVD 232(R1), F19 + FMOVD 240(R1), F20 + FMOVD 248(R1), F21 + FMOVD 256(R1), F22 + FMOVD 264(R1), F23 + FMOVD 272(R1), F24 + FMOVD 280(R1), F25 + FMOVD 288(R1), F26 + FMOVD 296(R1), F27 + FMOVD 304(R1), F28 + FMOVD 312(R1), F29 + FMOVD 320(R1), F30 + FMOVD 328(R1), F31 + + ADD $344, R1 + + MOVD 8(R1), R0 + MOVFL R0, $0xff + MOVD 16(R1), R0 + MOVD R0, LR + RET + +DATA _rt0_ppc64_aix_lib_go+0(SB)/8, $__rt0_ppc64_aix_lib_go(SB) +DATA _rt0_ppc64_aix_lib_go+8(SB)/8, $TOC(SB) +DATA _rt0_ppc64_aix_lib_go+16(SB)/8, $0 +GLOBL _rt0_ppc64_aix_lib_go(SB), NOPTR, $24 + +TEXT __rt0_ppc64_aix_lib_go(SB),NOSPLIT,$0 + MOVD _rt0_ppc64_aix_lib_argc<>(SB), R3 + MOVD _rt0_ppc64_aix_lib_argv<>(SB), R4 + MOVD $runtime·rt0_go(SB), R12 + MOVD R12, CTR + BR (CTR) + +DATA _rt0_ppc64_aix_lib_argc<>(SB)/8, $0 +GLOBL _rt0_ppc64_aix_lib_argc<>(SB),NOPTR, $8 +DATA _rt0_ppc64_aix_lib_argv<>(SB)/8, $0 +GLOBL _rt0_ppc64_aix_lib_argv<>(SB),NOPTR, $8 diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index a7538482dc..d61affa54a 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -445,6 +445,9 @@ func moduledataverify1(datap *moduledata) { for j := 0; j <= i; j++ { print("\t", hex(datap.ftab[j].entry), " ", funcname(funcInfo{(*_func)(unsafe.Pointer(&datap.pclntable[datap.ftab[j].funcoff])), datap}), "\n") } + if GOOS == "aix" && isarchive { + println("-Wl,-bnoobjreorder is mandatory on aix/ppc64 with c-archive") + } throw("invalid runtime symbol table") } } diff --git a/src/runtime/sys_aix_ppc64.s b/src/runtime/sys_aix_ppc64.s index 65fcae0c0c..9e1a95f31e 100644 --- a/src/runtime/sys_aix_ppc64.s +++ b/src/runtime/sys_aix_ppc64.s @@ -216,17 +216,22 @@ TEXT runtime·_tstart(SB),NOSPLIT,$0 MOVD R0, R3 RET + +#define CSYSCALL() \ + MOVD 0(R12), R12 \ + MOVD R2, 40(R1) \ + MOVD 0(R12), R0 \ + MOVD 8(R12), R2 \ + MOVD R0, CTR \ + BL (CTR) \ + MOVD 40(R1), R2 \ + BL runtime·reginit(SB) + + // Runs on OS stack, called from runtime·osyield. TEXT runtime·osyield1(SB),NOSPLIT,$0 MOVD $libc_sched_yield(SB), R12 - MOVD 0(R12), R12 - MOVD R2, 40(R1) - MOVD 0(R12), R0 - MOVD 8(R12), R2 - MOVD R0, CTR - BL (CTR) - MOVD 40(R1), R2 - BL runtime·reginit(SB) + CSYSCALL() RET @@ -236,26 +241,75 @@ TEXT runtime·sigprocmask1(SB),NOSPLIT,$0-24 MOVD new+8(FP), R4 MOVD old+16(FP), R5 MOVD $libpthread_sigthreadmask(SB), R12 - MOVD 0(R12), R12 - MOVD R2, 40(R1) - MOVD 0(R12), R0 - MOVD 8(R12), R2 - MOVD R0, CTR - BL (CTR) - MOVD 40(R1), R2 - BL runtime·reginit(SB) + CSYSCALL() RET // Runs on OS stack, called from runtime·usleep. -TEXT runtime·usleep1(SB),NOSPLIT,$0-8 +TEXT runtime·usleep1(SB),NOSPLIT,$0-4 MOVW us+0(FP), R3 MOVD $libc_usleep(SB), R12 - MOVD 0(R12), R12 - MOVD R2, 40(R1) - MOVD 0(R12), R0 - MOVD 8(R12), R2 - MOVD R0, CTR - BL (CTR) - MOVD 40(R1), R2 - BL runtime·reginit(SB) + CSYSCALL() + RET + +// Runs on OS stack, called from runtime·exit. +TEXT runtime·exit1(SB),NOSPLIT,$0-4 + MOVW code+0(FP), R3 + MOVD $libc_exit(SB), R12 + CSYSCALL() + RET + +// Runs on OS stack, called from runtime·write. +TEXT runtime·write1(SB),NOSPLIT,$0-28 + MOVD fd+0(FP), R3 + MOVD p+8(FP), R4 + MOVW n+16(FP), R5 + MOVD $libc_write(SB), R12 + CSYSCALL() + MOVW R3, ret+24(FP) + RET + +// Runs on OS stack, called from runtime·pthread_attr_init. +TEXT runtime·pthread_attr_init1(SB),NOSPLIT,$0-12 + MOVD attr+0(FP), R3 + MOVD $libpthread_attr_init(SB), R12 + CSYSCALL() + MOVW R3, ret+8(FP) + RET + +// Runs on OS stack, called from runtime·pthread_attr_setstacksize. +TEXT runtime·pthread_attr_setstacksize1(SB),NOSPLIT,$0-20 + MOVD attr+0(FP), R3 + MOVD size+8(FP), R4 + MOVD $libpthread_attr_setstacksize(SB), R12 + CSYSCALL() + MOVW R3, ret+16(FP) + RET + +// Runs on OS stack, called from runtime·pthread_setdetachstate. +TEXT runtime·pthread_attr_setdetachstate1(SB),NOSPLIT,$0-20 + MOVD attr+0(FP), R3 + MOVW state+8(FP), R4 + MOVD $libpthread_attr_setdetachstate(SB), R12 + CSYSCALL() + MOVW R3, ret+16(FP) + RET + +// Runs on OS stack, called from runtime·pthread_create. +TEXT runtime·pthread_create1(SB),NOSPLIT,$0-36 + MOVD tid+0(FP), R3 + MOVD attr+8(FP), R4 + MOVD fn+16(FP), R5 + MOVD arg+24(FP), R6 + MOVD $libpthread_create(SB), R12 + CSYSCALL() + MOVW R3, ret+32(FP) + RET + +// Runs on OS stack, called from runtime·sigaction. +TEXT runtime·sigaction1(SB),NOSPLIT,$0-24 + MOVD sig+0(FP), R3 + MOVD new+8(FP), R4 + MOVD old+16(FP), R5 + MOVD $libc_sigaction(SB), R12 + CSYSCALL() RET -- GitLab From d47db6dc0ce72d1371c81a677b45d7bdba39ff46 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sat, 23 Mar 2019 01:43:06 +0700 Subject: [PATCH 0614/1679] cmd/compile: fix literal struct interface {} lost passing by value CL 135377 introduces pass strings and slices to convT2{E,I} by value. Before that CL, all types, except interface will be allocated temporary address. The CL changes the logic that only constant and type which needs address (determine by convFuncName) will be allocated. It fails to cover the case where type is static composite literal. Adding condition to check that case fixes the issue. Also, static composite literal node implies constant type, so consttype checking can be removed. Fixes #30956 Change-Id: Ifc750a029fb4889c2d06e73e44bf85e6ef4ce881 Reviewed-on: https://go-review.googlesource.com/c/go/+/168858 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/order.go | 6 +++--- test/fixedbugs/issue30956.go | 32 ++++++++++++++++++++++++++++ test/fixedbugs/issue30956.out | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 test/fixedbugs/issue30956.go create mode 100644 test/fixedbugs/issue30956.out diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index aae18ff227..3aca63abaf 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -1060,10 +1060,10 @@ func (o *Order) expr(n, lhs *Node) *Node { if n.Left.Type.IsInterface() { break } - if _, needsaddr := convFuncName(n.Left.Type, n.Type); needsaddr || consttype(n.Left) > 0 { + if _, needsaddr := convFuncName(n.Left.Type, n.Type); needsaddr || isStaticCompositeLiteral(n.Left) { // Need a temp if we need to pass the address to the conversion function. - // We also process constants here, making a named static global whose - // address we can put directly in an interface (see OCONVIFACE case in walk). + // We also process static composite literal node here, making a named static global + // whose address we can put directly in an interface (see OCONVIFACE case in walk). n.Left = o.addrTemp(n.Left) } diff --git a/test/fixedbugs/issue30956.go b/test/fixedbugs/issue30956.go new file mode 100644 index 0000000000..021e6c5d47 --- /dev/null +++ b/test/fixedbugs/issue30956.go @@ -0,0 +1,32 @@ +// run + +// Copyright 2019 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. + +// Check for compile generated static data for literal +// composite struct + +package main + +import "fmt" + +type X struct { + V interface{} + + a int + b int + c int +} + +func pr(x X) { + fmt.Println(x.V) +} + +func main() { + pr(X{ + V: struct { + A int + }{42}, + }) +} diff --git a/test/fixedbugs/issue30956.out b/test/fixedbugs/issue30956.out new file mode 100644 index 0000000000..04f25e8ae7 --- /dev/null +++ b/test/fixedbugs/issue30956.out @@ -0,0 +1 @@ +{42} -- GitLab From f7f4eef385f72ee0617bd8b7878c0a71eb4f3d18 Mon Sep 17 00:00:00 2001 From: John Date: Wed, 27 Mar 2019 17:30:32 +0000 Subject: [PATCH 0615/1679] mime: add javascript module mime type (.mjs) There are default mime types in this package for handling static content, but there's a new one missing ".mjs" that is "Content-Type: text/javascript". https://developers.google.com/web/fundamentals/primers/modules#mjs Change-Id: Ie842ece0cb55770fb6c9eb65f8bfee2ecf7bc624 GitHub-Last-Rev: e26d9f76171c987112d5d6db292446819a8393e2 GitHub-Pull-Request: golang/go#31071 Reviewed-on: https://go-review.googlesource.com/c/go/+/169502 Reviewed-by: Brad Fitzpatrick --- src/mime/type.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mime/type.go b/src/mime/type.go index 64e26ffb7c..3a8fe4447f 100644 --- a/src/mime/type.go +++ b/src/mime/type.go @@ -68,6 +68,7 @@ var builtinTypesLower = map[string]string{ ".png": "image/png", ".svg": "image/svg+xml", ".xml": "text/xml; charset=utf-8", + ".mjs": "text/javascript", } var once sync.Once // guards initMime -- GitLab From 697f4183e6815beacbd254942160e71a2e0cde60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 25 Mar 2019 10:33:49 +0100 Subject: [PATCH 0616/1679] cmd/link: allow buildmode c-archive for aix/ppc64 Change-Id: Ia268b0d64dc89866aa09bfffcaa109741088a904 Reviewed-on: https://go-review.googlesource.com/c/go/+/169119 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/config.go | 2 +- src/cmd/link/internal/ld/data.go | 9 ++++++++- src/cmd/link/internal/ld/lib.go | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 5d59d4067b..85842f2fa2 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -51,7 +51,7 @@ func (mode *BuildMode) Set(s string) error { *mode = BuildModePIE case "c-archive": switch objabi.GOOS { - case "darwin", "linux": + case "aix", "darwin", "linux": case "freebsd": switch objabi.GOARCH { case "amd64": diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 717597dfd5..da75ce8dc4 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -1000,7 +1000,7 @@ func dosymtype(ctxt *Link) { for _, s := range ctxt.Syms.Allsym { // Create a new entry in the .init_array section that points to the // library initializer function. - if s.Name == *flagEntrySymbol { + if s.Name == *flagEntrySymbol && ctxt.HeadType != objabi.Haix { addinitarrdata(ctxt, s) } } @@ -1380,6 +1380,13 @@ func (ctxt *Link) dodata() { case BuildModeCArchive, BuildModeCShared, BuildModeShared, BuildModePlugin: hasinitarr = true } + + if ctxt.HeadType == objabi.Haix { + if len(data[sym.SINITARR]) > 0 { + Errorf(nil, "XCOFF format doesn't allow .init_array section") + } + } + if hasinitarr && len(data[sym.SINITARR]) > 0 { sect := addsection(ctxt.Arch, &Segdata, ".init_array", 06) sect.Align = dataMaxAlign[sym.SINITARR] diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index b331e39fe3..f53e0273c6 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -1102,7 +1102,11 @@ func (ctxt *Link) archive() { } ctxt.Out.f = nil - argv := []string{*flagExtar, "-q", "-c", "-s", *flagOutfile} + argv := []string{*flagExtar, "-q", "-c", "-s"} + if ctxt.HeadType == objabi.Haix { + argv = append(argv, "-X64") + } + argv = append(argv, *flagOutfile) argv = append(argv, filepath.Join(*flagTmpdir, "go.o")) argv = append(argv, hostobjCopy()...) -- GitLab From cacab6455503e04b276542baffc19f5113ef133d Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 26 Mar 2019 12:02:36 -0400 Subject: [PATCH 0617/1679] cmd/link: change -strictdups checking to handle mix of flags Update the recently-added '-strictdups' sanity checking to avoid failing the link in cases where we have objects feeding into the link with a mix of command line flags (and in particular some with "-N" and some without). This scenario will trigger errors/warnings due to inlinable functions and wrapper functions that have different sizes due to presence or lack of optimization. Update #31034. Change-Id: I1dd9e37c2f9bea5da0ab82e32e6fc210aebf6a65 Reviewed-on: https://go-review.googlesource.com/c/go/+/169160 Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/link/internal/ld/dwarf.go | 12 ++++++++++++ src/cmd/link/internal/ld/lib.go | 10 +++++++++- src/cmd/link/internal/ld/main.go | 1 + src/cmd/link/internal/objfile/objfile.go | 9 +++++---- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index d923b7599d..e86247dd04 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1797,6 +1797,7 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // fake root DIE for compile unit DIEs var dwroot dwarf.DWDie + flagVariants := make(map[string]bool) for _, lib := range ctxt.Library { unit := &compilationUnit{lib: lib} @@ -1825,7 +1826,11 @@ func dwarfGenerateDebugInfo(ctxt *Link) { // version, so it should be safe for readers to scan // forward to the semicolon. producer += "; " + string(producerExtra.P) + flagVariants[string(producerExtra.P)] = true + } else { + flagVariants[""] = true } + newattr(unit.dwinfo, dwarf.DW_AT_producer, dwarf.DW_CLS_STRING, int64(len(producer)), producer) if len(lib.Textp) == 0 { @@ -1876,6 +1881,13 @@ func dwarfGenerateDebugInfo(ctxt *Link) { } } + // Fix for 31034: if the objects feeding into this link were compiled + // with different sets of flags, then don't issue an error if + // the -strictdups checks fail. + if checkStrictDups > 1 && len(flagVariants) > 1 { + checkStrictDups = 1 + } + // Create DIEs for global variables and the types they use. genasmsym(ctxt, defdwsymb) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index f53e0273c6..c5f35af254 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -200,6 +200,10 @@ var ( nerrors int liveness int64 + + // See -strictdups command line flag. + checkStrictDups int // 0=off 1=warning 2=error + strictDupMsgCount int ) var ( @@ -283,6 +287,9 @@ func errorexit() { if nerrors != 0 { Exit(2) } + if checkStrictDups > 1 && strictDupMsgCount > 0 { + Exit(2) + } Exit(0) } @@ -1745,7 +1752,8 @@ func ldobj(ctxt *Link, f *bio.Reader, lib *sym.Library, length int64, pn string, default: log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) } - objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn, flags) + c := objfile.Load(ctxt.Arch, ctxt.Syms, f, lib, eof-f.Offset(), pn, flags) + strictDupMsgCount += c addImports(ctxt, lib, pn) return nil } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index e5859868b7..48a9953893 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -148,6 +148,7 @@ func Main(arch *sys.Arch, theArch Arch) { if objabi.Fieldtrack_enabled != 0 { ctxt.Reachparent = make(map[*sym.Symbol]*sym.Symbol) } + checkStrictDups = *FlagStrictDups startProfile() if ctxt.BuildMode == BuildModeUnset { diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index 9b76f2801d..f3957822b0 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -42,6 +42,7 @@ type objReader struct { dupSym *sym.Symbol localSymVersion int flags int + strictDupMsgs int // rdBuf is used by readString and readSymName as scratch for reading strings. rdBuf []byte @@ -72,7 +73,7 @@ const ( // Load loads an object file f into library lib. // The symbols loaded are added to syms. -func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string, flags int) { +func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string, flags int) int { start := f.Offset() r := &objReader{ rd: f.Reader, @@ -88,6 +89,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, le if f.Offset() != start+length { log.Fatalf("%s: unexpected end at %d, want %d", pn, f.Offset(), start+length) } + return r.strictDupMsgs } func (r *objReader) loadObjFile() { @@ -376,9 +378,8 @@ overwrite: // params; I am guessing that the pos is being inherited // from the spot where the wrapper is needed. whitelist := strings.HasPrefix(dup.Name, "go.info.go.interface") - - if r.flags&StrictDupsErrFlag != 0 && !whitelist { - log.Fatalf("failed duplicate symbol check on '%s' reading %s", dup.Name, r.pn) + if !whitelist { + r.strictDupMsgs++ } } } -- GitLab From ad8b7a70c52d808d41d20b514f518984a179b3fa Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Tue, 26 Mar 2019 12:05:25 -0400 Subject: [PATCH 0618/1679] test: fix fixedbugs/issue30908.go to work with no-opt builder Update the issue 30908 test to work with the no-opt builder (this requires a corresponding change in the linker as well). As part of this change, 'rundir' tests are now linked without passing "-w" to the linker. Updates #30908. Fixes #31034. Change-Id: Ic776e1607075c295e409e1c8230aaf55a79a6323 Reviewed-on: https://go-review.googlesource.com/c/go/+/169161 Reviewed-by: Ian Lance Taylor --- test/fixedbugs/issue30908.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixedbugs/issue30908.go b/test/fixedbugs/issue30908.go index 8863b396aa..60fbd11457 100644 --- a/test/fixedbugs/issue30908.go +++ b/test/fixedbugs/issue30908.go @@ -1,4 +1,4 @@ -// rundir -P -l=4 -ldflags -strictdups=2 +// rundir -P -ldflags -strictdups=2 -w=0 // Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style -- GitLab From 3089d189569ed272eaf2bc6c4330e848a46e9999 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 27 Mar 2019 17:41:12 +0000 Subject: [PATCH 0619/1679] net: fix test after 8.8.8.8 changed its reverse DNS name Google's 8.8.8.8 DNS server used to reports its reverse DNS name as ending in ".google.com". Now it's "dns.google.". Change-Id: I7dd15f03239e5c3f202e471618ab867690cb4f9d Reviewed-on: https://go-review.googlesource.com/c/go/+/169679 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Dmitri Shuralyov --- src/net/lookup_test.go | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index 1c0a4509c8..28a895e15d 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -254,14 +254,11 @@ func TestLookupGmailTXT(t *testing.T) { } } -var lookupGooglePublicDNSAddrTests = []struct { - addr, name string -}{ - {"8.8.8.8", ".google.com."}, - {"8.8.4.4", ".google.com."}, - - {"2001:4860:4860::8888", ".google.com."}, - {"2001:4860:4860::8844", ".google.com."}, +var lookupGooglePublicDNSAddrTests = []string{ + "8.8.8.8", + "8.8.4.4", + "2001:4860:4860::8888", + "2001:4860:4860::8844", } func TestLookupGooglePublicDNSAddr(t *testing.T) { @@ -273,8 +270,8 @@ func TestLookupGooglePublicDNSAddr(t *testing.T) { defer dnsWaitGroup.Wait() - for _, tt := range lookupGooglePublicDNSAddrTests { - names, err := LookupAddr(tt.addr) + for _, ip := range lookupGooglePublicDNSAddrTests { + names, err := LookupAddr(ip) if err != nil { t.Fatal(err) } @@ -282,8 +279,8 @@ func TestLookupGooglePublicDNSAddr(t *testing.T) { t.Error("got no record") } for _, name := range names { - if !strings.HasSuffix(name, tt.name) { - t.Errorf("got %s; want a record containing %s", name, tt.name) + if !strings.HasSuffix(name, ".google.com.") && !strings.HasSuffix(name, ".google.") { + t.Errorf("got %q; want a record ending in .google.com. or .google.", name) } } } @@ -659,8 +656,8 @@ func testDots(t *testing.T, mode string) { t.Errorf("LookupAddr(8.8.8.8): %v (mode=%v)", err, mode) } else { for _, name := range names { - if !strings.HasSuffix(name, ".google.com.") { - t.Errorf("LookupAddr(8.8.8.8) = %v, want names ending in .google.com. with trailing dot (mode=%v)", names, mode) + if !strings.HasSuffix(name, ".google.com.") && !strings.HasSuffix(name, ".google.") { + t.Errorf("LookupAddr(8.8.8.8) = %v, want names ending in .google.com or .google with trailing dot (mode=%v)", names, mode) break } } -- GitLab From 591193b01fbf0ae6ad4ad6fee610d7807b8bdf7c Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 20 Mar 2019 14:29:28 -0400 Subject: [PATCH 0620/1679] cmd/compile: enhance debug_test for infinite loops ssa/debug_test.go already had a step limit; this exposes it to individual tests, and it is then set low for the infinite loop tests. That however is not enough; in an infinite loop debuggers see an unchanging line number, and therefore keep trying until they see a different one. To do this, the concept of a "bogus" line number is introduced, and on output single-instruction infinite loops are detected and a hardware nop with correct line number is inserted into the loop; the branch itself receives a bogus line number. This breaks up the endless stream of same line number and causes both gdb and delve to not hang; Delve complains about the incorrect line number while gdb does a sort of odd step-to-nowhere that then steps back to the loop. Since repeats are suppressed in the reference file, a single line is shown there. (The wrong line number mentioned in previous message was an artifact of debug_test.go, not Delve, and is now fixed.) The bogus line number exposed in Delve is less than wonderful, but compared to hanging, it is better. Fixes #30664. Change-Id: I30c927cf8869a84c6c9b84033ee44d7044aab552 Reviewed-on: https://go-review.googlesource.com/c/go/+/168477 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/ssa.go | 6 ++++ src/cmd/compile/internal/ssa/debug_test.go | 29 +++++++++++++------ .../ssa/testdata/infloop.dlv-opt.nexts | 12 ++++++++ .../ssa/testdata/infloop.gdb-opt.nexts | 4 +++ .../compile/internal/ssa/testdata/infloop.go | 16 ++++++++++ src/cmd/internal/src/pos.go | 15 ++++++++-- src/cmd/internal/src/xpos.go | 10 +++++++ 7 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 src/cmd/compile/internal/ssa/testdata/infloop.dlv-opt.nexts create mode 100644 src/cmd/compile/internal/ssa/testdata/infloop.gdb-opt.nexts create mode 100644 src/cmd/compile/internal/ssa/testdata/infloop.go diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index a7c1917ff1..17a9a2664c 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5315,6 +5315,12 @@ func genssa(f *ssa.Func, pp *Progs) { } } } + // If this is an empty infinite loop, stick a hardware NOP in there so that debuggers are less confused. + if s.bstart[b.ID] == s.pp.next && len(b.Succs) == 1 && b.Succs[0].Block() == b { + p := thearch.Ginsnop(s.pp) + p.Pos = p.Pos.WithIsStmt() + b.Pos = b.Pos.WithBogusLine() // Debuggers are not good about infinite loops, force a change in line number + } // Emit control flow instructions for block var next *ssa.Block if i < len(f.Blocks)-1 && Debug['N'] == 0 { diff --git a/src/cmd/compile/internal/ssa/debug_test.go b/src/cmd/compile/internal/ssa/debug_test.go index 7246a13ff6..8db2f8ef41 100644 --- a/src/cmd/compile/internal/ssa/debug_test.go +++ b/src/cmd/compile/internal/ssa/debug_test.go @@ -156,33 +156,34 @@ func TestNexting(t *testing.T) { subTest(t, debugger+"-dbg-race", "i22600", dbgFlags, append(moreargs, "-race")...) - optSubTest(t, debugger+"-opt", "hist", optFlags, moreargs...) - optSubTest(t, debugger+"-opt", "scopes", optFlags, moreargs...) + optSubTest(t, debugger+"-opt", "hist", optFlags, 1000, moreargs...) + optSubTest(t, debugger+"-opt", "scopes", optFlags, 1000, moreargs...) + optSubTest(t, debugger+"-opt", "infloop", optFlags, 10, moreargs...) } // subTest creates a subtest that compiles basename.go with the specified gcflags and additional compiler arguments, // then runs the debugger on the resulting binary, with any comment-specified actions matching tag triggered. func subTest(t *testing.T, tag string, basename string, gcflags string, moreargs ...string) { t.Run(tag+"-"+basename, func(t *testing.T) { - testNexting(t, basename, tag, gcflags, moreargs...) + testNexting(t, basename, tag, gcflags, 1000, moreargs...) }) } // optSubTest is the same as subTest except that it skips the test if the runtime and libraries // were not compiled with optimization turned on. (The skip may not be necessary with Go 1.10 and later) -func optSubTest(t *testing.T, tag string, basename string, gcflags string, moreargs ...string) { +func optSubTest(t *testing.T, tag string, basename string, gcflags string, count int, moreargs ...string) { // If optimized test is run with unoptimized libraries (compiled with -N -l), it is very likely to fail. // This occurs in the noopt builders (for example). t.Run(tag+"-"+basename, func(t *testing.T) { if *force || optimizedLibs { - testNexting(t, basename, tag, gcflags, moreargs...) + testNexting(t, basename, tag, gcflags, count, moreargs...) } else { t.Skip("skipping for unoptimized stdlib/runtime") } }) } -func testNexting(t *testing.T, base, tag, gcflags string, moreArgs ...string) { +func testNexting(t *testing.T, base, tag, gcflags string, count int, moreArgs ...string) { // (1) In testdata, build sample.go into test-sample. // (2) Run debugger gathering a history // (3) Read expected history from testdata/sample..nexts @@ -219,7 +220,7 @@ func testNexting(t *testing.T, base, tag, gcflags string, moreArgs ...string) { } else { dbg = newGdb(tag, exe) } - h1 := runDbgr(dbg, 1000) + h1 := runDbgr(dbg, count) if *dryrun { fmt.Printf("# Tag for above is %s\n", dbg.tag()) return @@ -261,6 +262,7 @@ func runDbgr(dbg dbgr, maxNext int) *nextHist { break } } + dbg.quit() h := dbg.hist() return h } @@ -298,7 +300,7 @@ func (t tstring) String() string { } type pos struct { - line uint16 + line uint32 file uint8 // Artifact of plans to implement differencing instead of calling out to diff. } @@ -386,7 +388,7 @@ func (h *nextHist) add(file, line, text string) bool { } } l := len(h.ps) - p := pos{line: uint16(li), file: fi} + p := pos{line: uint32(li), file: fi} if l == 0 || *repeats || h.ps[l-1] != p { h.ps = append(h.ps, p) @@ -721,6 +723,15 @@ func varsToPrint(line, lookfor string) []string { func (s *gdbState) quit() { response := s.ioState.writeRead("q\n") if strings.Contains(response.o, "Quit anyway? (y or n)") { + defer func() { + if r := recover(); r != nil { + if s, ok := r.(string); !(ok && strings.Contains(s, "'Y\n'")) { + // Not the panic that was expected. + fmt.Printf("Expected a broken pipe panic, but saw the following panic instead") + panic(r) + } + } + }() s.ioState.writeRead("Y\n") } } diff --git a/src/cmd/compile/internal/ssa/testdata/infloop.dlv-opt.nexts b/src/cmd/compile/internal/ssa/testdata/infloop.dlv-opt.nexts new file mode 100644 index 0000000000..19496de660 --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/infloop.dlv-opt.nexts @@ -0,0 +1,12 @@ + ./testdata/infloop.go +6: func test() { +8: go func() {}() +10: for { +1048575: +10: for { +1048575: +10: for { +1048575: +10: for { +1048575: +10: for { diff --git a/src/cmd/compile/internal/ssa/testdata/infloop.gdb-opt.nexts b/src/cmd/compile/internal/ssa/testdata/infloop.gdb-opt.nexts new file mode 100644 index 0000000000..d465ad1396 --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/infloop.gdb-opt.nexts @@ -0,0 +1,4 @@ + src/cmd/compile/internal/ssa/testdata/infloop.go +6: func test() { +8: go func() {}() +10: for { diff --git a/src/cmd/compile/internal/ssa/testdata/infloop.go b/src/cmd/compile/internal/ssa/testdata/infloop.go new file mode 100644 index 0000000000..cdb374fb57 --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/infloop.go @@ -0,0 +1,16 @@ +package main + +var sink int + +//go:noinline +func test() { + // This is for #30167, incorrect line numbers in an infinite loop + go func() {}() + + for { + } +} + +func main() { + test() +} diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go index a30b4b6e4a..8344a5a612 100644 --- a/src/cmd/internal/src/pos.go +++ b/src/cmd/internal/src/pos.go @@ -304,7 +304,8 @@ type lico uint32 // TODO: Prologue and epilogue are perhaps better handled as psuedoops for the assembler, // because they have almost no interaction with other uses of the position. const ( - lineBits, lineMax = 20, 1< lineMax { // cannot represent line, use max. line so we have some information @@ -365,7 +376,7 @@ func makeLico(line, col uint) lico { col = colMax } // default is not-sure-if-statement - return lico(line<> lineShift } diff --git a/src/cmd/internal/src/xpos.go b/src/cmd/internal/src/xpos.go index c94f9e997b..593251539c 100644 --- a/src/cmd/internal/src/xpos.go +++ b/src/cmd/internal/src/xpos.go @@ -60,6 +60,16 @@ func (p XPos) WithIsStmt() XPos { return p } +// WithBogusLine returns a bogus line that won't match any recorded for the source code. +// Its use is to disrupt the statements within an infinite loop so that the debugger +// will not itself loop infinitely waiting for the line number to change. +// gdb chooses not to display the bogus line; delve shows it with a complaint, but the +// alternative behavior is to hang. +func (p XPos) WithBogusLine() XPos { + p.lico = makeBogusLico() + return p +} + // WithXlogue returns the same location but marked with DWARF function prologue/epilogue func (p XPos) WithXlogue(x PosXlogue) XPos { p.lico = p.lico.withXlogue(x) -- GitLab From 4dce6dbb1e3269211e9dafb6a406035696993574 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 27 Mar 2019 15:50:36 -0700 Subject: [PATCH 0621/1679] math/big: temporarily disable buggy shlVU assembly for arm64 This addresses the failures we have seen in #31084. The correct fix is to find the actual bug in the assembly code. Updates #31084. Change-Id: I437780c53d0c4423d742e2e3b650b899ce845372 Reviewed-on: https://go-review.googlesource.com/c/go/+/169721 Run-TryBot: Robert Griesemer Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/math/big/arith_arm64.s | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/math/big/arith_arm64.s b/src/math/big/arith_arm64.s index eebdf59fb2..bb23751ba3 100644 --- a/src/math/big/arith_arm64.s +++ b/src/math/big/arith_arm64.s @@ -197,6 +197,10 @@ len0: // func shlVU(z, x []Word, s uint) (c Word) TEXT ·shlVU(SB),NOSPLIT,$0 + // Disable assembly for now - it is subtly incorrect. + // See #31084 for a test that fails using this code. + B ·shlVU_g(SB) + MOVD z+0(FP), R0 MOVD z_len+8(FP), R1 MOVD x+24(FP), R2 -- GitLab From 92e6cf4c0f9bf2e1ecd57f22a430d96020cbdd69 Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 27 Mar 2019 16:15:04 -0400 Subject: [PATCH 0622/1679] cmd/compile: repair ssa/debug_test regression Code introduced in [2034fbab5b1d11bc59cb476bc3f49ee1b344839d] cmd/compile: use existing instructions instead of nops for inline marks to change a src.Pos's column to 1 accidentally reset the is_stmt and prologue/epilogue bits, and that turned out to cause a regression in ssa/debug_test. Preserving that information fixed the regression. Change-Id: I7c6859c8b68d9c6f7c0cbc8805c1f41dc5c1d5fb Reviewed-on: https://go-review.googlesource.com/c/go/+/169739 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/internal/src/pos.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go index 8344a5a612..954c00716f 100644 --- a/src/cmd/internal/src/pos.go +++ b/src/cmd/internal/src/pos.go @@ -311,7 +311,9 @@ const ( colBits, colMax = 32 - lineBits - xlogueBits - isStmtBits, 1< Date: Mon, 25 Mar 2019 22:42:54 -0700 Subject: [PATCH 0623/1679] runtime: fix minor doc typo Change-Id: I0a1ebaf41a1bc95508fd9aa782953ddca5ef49c9 Reviewed-on: https://go-review.googlesource.com/c/go/+/169724 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/map.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/map.go b/src/runtime/map.go index bb32526846..1282a12193 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -288,7 +288,7 @@ func makemap64(t *maptype, hint int64, h *hmap) *hmap { return makemap(t, int(hint), h) } -// makehmap_small implements Go map creation for make(map[k]v) and +// makemap_small implements Go map creation for make(map[k]v) and // make(map[k]v, hint) when hint is known to be at most bucketCnt // at compile time and the map needs to be allocated on the heap. func makemap_small() *hmap { -- GitLab From 722b1abbcf842be5276c0d2ebde6aa076a4f4687 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 27 Mar 2019 18:00:24 -0700 Subject: [PATCH 0624/1679] runtime: fix TestLldbPython test with modules enabled Fixes #30751 Change-Id: I1f783578df499d52eaec3690303671661c8bf5fb Reviewed-on: https://go-review.googlesource.com/c/go/+/169725 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/runtime-lldb_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/runtime/runtime-lldb_test.go b/src/runtime/runtime-lldb_test.go index fe3a0eb90d..c7b769ce83 100644 --- a/src/runtime/runtime-lldb_test.go +++ b/src/runtime/runtime-lldb_test.go @@ -151,7 +151,13 @@ func TestLldbPython(t *testing.T) { src := filepath.Join(dir, "main.go") err = ioutil.WriteFile(src, []byte(lldbHelloSource), 0644) if err != nil { - t.Fatalf("failed to create file: %v", err) + t.Fatalf("failed to create src file: %v", err) + } + + mod := filepath.Join(dir, "go.mod") + err = ioutil.WriteFile(mod, []byte("module lldbtest"), 0644) + if err != nil { + t.Fatalf("failed to create mod file: %v", err) } // As of 2018-07-17, lldb doesn't support compressed DWARF, so -- GitLab From ea9eddb3e77f69bc559b8d8e647cb6d3b0562b80 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 28 Mar 2019 02:09:32 +0000 Subject: [PATCH 0625/1679] net/http: fix typo in Response.Body field docs Fixes #31096 Change-Id: I5b36bfc6d18eb8c1bbf15abcd92b0e6559cda3c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/169683 Reviewed-by: Dmitri Shuralyov --- src/net/http/response.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/net/http/response.go b/src/net/http/response.go index 6d22c2892d..2065a25015 100644 --- a/src/net/http/response.go +++ b/src/net/http/response.go @@ -12,12 +12,13 @@ import ( "crypto/tls" "errors" "fmt" - "golang.org/x/net/http/httpguts" "io" "net/textproto" "net/url" "strconv" "strings" + + "golang.org/x/net/http/httpguts" ) var respExcludeHeader = map[string]bool{ @@ -66,7 +67,7 @@ type Response struct { // with a "chunked" Transfer-Encoding. // // As of Go 1.12, the Body will be also implement io.Writer - // on a successful "101 Switching Protocols" responses, + // on a successful "101 Switching Protocols" response, // as used by WebSockets and HTTP/2's "h2c" mode. Body io.ReadCloser -- GitLab From 2bd767b1022dd3254bcec469f0ee164024726486 Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Thu, 28 Mar 2019 01:22:37 +0100 Subject: [PATCH 0626/1679] syscall/js: improve Value.String() for non-string values This change modifies Value.String() to use the following representations for non-string values: It avoids JavaScript conversion semantics in the Go API and lowers the risk of hidden bugs by unexpected conversions, e.g. the conversion of the number 42 to the string "42". See discussion in #29642. This is a breaking change, which are still allowed for syscall/js. The impact should be small since it only affects uses of Value.String() with non-string values, which should be uncommon. Updates #29642. Change-Id: I2c27be6e24befe8cb713031fbf66f7b6041e7148 Reviewed-on: https://go-review.googlesource.com/c/go/+/169757 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/js/js.go | 30 ++++++++++++++++++++++++++++-- src/syscall/js/js_test.go | 24 ++++++++++++++++++++---- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go index bccf188fa5..0acc7da9bf 100644 --- a/src/syscall/js/js.go +++ b/src/syscall/js/js.go @@ -422,9 +422,35 @@ func (v Value) Truthy() bool { } } -// String returns the value v converted to string according to JavaScript type conversions. +// String returns the value v as a string. +// String is a special case because of Go's String method convention. Unlike the other getters, +// it does not panic if v's Type is not TypeString. Instead, it returns a string of the form "" +// or "" where T is v's type and V is a string representation of v's value. func (v Value) String() string { - str, length := valuePrepareString(v.ref) + switch v.Type() { + case TypeString: + return jsString(v.ref) + case TypeUndefined: + return "" + case TypeNull: + return "" + case TypeBoolean: + return "" + case TypeNumber: + return "" + case TypeSymbol: + return "" + case TypeObject: + return "" + case TypeFunction: + return "" + default: + panic("bad type") + } +} + +func jsString(v ref) string { + str, length := valuePrepareString(v) b := make([]byte, length) valueLoadString(str, b) return string(b) diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go index 594284faf9..20ccac7779 100644 --- a/src/syscall/js/js_test.go +++ b/src/syscall/js/js_test.go @@ -72,10 +72,26 @@ func TestString(t *testing.T) { t.Errorf("same value not equal") } - wantInt := "42" - o = dummys.Get("someInt") - if got := o.String(); got != wantInt { - t.Errorf("got %#v, want %#v", got, wantInt) + if got, want := js.Undefined().String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.Null().String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.ValueOf(true).String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.ValueOf(42.5).String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.Global().Call("Symbol").String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.Global().String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) + } + if got, want := js.Global().Get("setTimeout").String(), ""; got != want { + t.Errorf("got %#v, want %#v", got, want) } } -- GitLab From c1e60b6e336dba3820cb27442cec33d15b2a5f7d Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Wed, 27 Mar 2019 12:39:45 +0700 Subject: [PATCH 0627/1679] os/user: use os.UserHomeDir for user.HomeDir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using os.UserHomeDir for user.HomeDir helps us deduplicate the logic and keep the behavior consistent. Also make os.UserHomeDir return "/sdcard" in android. See: https://go-review.googlesource.com/c/go/+/37960/1/src/os/user/lookup_stubs.go#48 Fixes #31070 Change-Id: I521bad050bc5761ecc5c0085501374d2cf8e6897 Reviewed-on: https://go-review.googlesource.com/c/go/+/169540 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí Reviewed-by: Brad Fitzpatrick --- src/os/file.go | 4 +++- src/os/user/lookup_stubs.go | 10 +++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/os/file.go b/src/os/file.go index 258a3e6109..86af707865 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -468,8 +468,10 @@ func UserHomeDir() (string, error) { } // On some geese the home directory is not always defined. switch runtime.GOOS { - case "nacl", "android": + case "nacl": return "/", nil + case "android": + return "/sdcard", nil case "darwin": if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" { return "/", nil diff --git a/src/os/user/lookup_stubs.go b/src/os/user/lookup_stubs.go index 61bf1dc7a6..6a20d78781 100644 --- a/src/os/user/lookup_stubs.go +++ b/src/os/user/lookup_stubs.go @@ -26,12 +26,14 @@ func current() (*User, error) { if err == nil { return u, nil } + + homeDir, _ := os.UserHomeDir() u = &User{ Uid: uid, Gid: currentGID(), Username: os.Getenv("USER"), Name: "", // ignored - HomeDir: os.Getenv("HOME"), + HomeDir: homeDir, } // On NaCL and Android, return a dummy user instead of failing. switch runtime.GOOS { @@ -42,9 +44,6 @@ func current() (*User, error) { if u.Username == "" { u.Username = "nacl" } - if u.HomeDir == "" { - u.HomeDir = "/" - } case "android": if u.Uid == "" { u.Uid = "1" @@ -52,9 +51,6 @@ func current() (*User, error) { if u.Username == "" { u.Username = "android" } - if u.HomeDir == "" { - u.HomeDir = "/sdcard" - } } // cgo isn't available, but if we found the minimum information // without it, use it: -- GitLab From 9f6b21caeaba3362f3385e635054f94d7f0499f3 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 27 Mar 2019 12:15:47 -0700 Subject: [PATCH 0628/1679] cmd/compile: fix ICE from invalid operations on float/complex constants Typechecking treats all untyped numbers as integers for the purposes of validating operators. However, when I refactoring constant operation evalution in golang.org/cl/139901, I mistakenly interpreted that the only invalid case that needed to be preserved was % (modulo) on floating-point values. This CL restores the other remaining cases that were dropped from that CL. It also uses the phrasing "invalid operation" instead of "illegal constant expression" for better consistency with the rest of cmd/compile and with go/types. Lastly, this CL extends setconst to recognize failed constant folding (e.g., division by zero) so that we can properly mark those expressions as broken rather than continuing forward with bogus values that might lead to further spurious errors. Fixes #31060. Change-Id: I1ab6491371925e22bc8b95649f1a0eed010abca6 Reviewed-on: https://go-review.googlesource.com/c/go/+/169719 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/gc/const.go | 63 ++++++++++++++++++---------- test/const1.go | 2 +- test/fixedbugs/issue31060.go | 30 +++++++++++++ 3 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 test/fixedbugs/issue31060.go diff --git a/src/cmd/compile/internal/gc/const.go b/src/cmd/compile/internal/gc/const.go index ef4b933f68..39adba0f07 100644 --- a/src/cmd/compile/internal/gc/const.go +++ b/src/cmd/compile/internal/gc/const.go @@ -838,15 +838,13 @@ Outer: case ODIV: if y.CmpInt64(0) == 0 { yyerror("division by zero") - u.SetOverflow() - break + return Val{} } u.Quo(y) case OMOD: if y.CmpInt64(0) == 0 { yyerror("division by zero") - u.SetOverflow() - break + return Val{} } u.Rem(y) case OOR: @@ -877,13 +875,13 @@ Outer: case ODIV: if y.CmpFloat64(0) == 0 { yyerror("division by zero") - u.SetFloat64(1) - break + return Val{} } u.Quo(y) - case OMOD: - // TODO(mdempsky): Move to typecheck. - yyerror("illegal constant expression: floating-point %% operation") + case OMOD, OOR, OAND, OANDNOT, OXOR: + // TODO(mdempsky): Move to typecheck; see #31060. + yyerror("invalid operation: operator %v not defined on untyped float", op) + return Val{} default: break Outer } @@ -907,9 +905,12 @@ Outer: case ODIV: if !u.Div(y) { yyerror("complex division by zero") - u.Real.SetFloat64(1) - u.Imag.SetFloat64(0) + return Val{} } + case OMOD, OOR, OAND, OANDNOT, OXOR: + // TODO(mdempsky): Move to typecheck; see #31060. + yyerror("invalid operation: operator %v not defined on untyped complex", op) + return Val{} default: break Outer } @@ -956,19 +957,31 @@ func unaryOp(op Op, x Val, t *types.Type) Val { } case OBITNOT: - x := x.U.(*Mpint) + switch x.Ctype() { + case CTINT, CTRUNE: + x := x.U.(*Mpint) - u := new(Mpint) - u.Rune = x.Rune - if t.IsSigned() || t.IsUntyped() { - // Signed values change sign. - u.SetInt64(-1) - } else { - // Unsigned values invert their bits. - u.Set(maxintval[t.Etype]) + u := new(Mpint) + u.Rune = x.Rune + if t.IsSigned() || t.IsUntyped() { + // Signed values change sign. + u.SetInt64(-1) + } else { + // Unsigned values invert their bits. + u.Set(maxintval[t.Etype]) + } + u.Xor(x) + return Val{U: u} + + case CTFLT: + // TODO(mdempsky): Move to typecheck; see #31060. + yyerror("invalid operation: operator %v not defined on untyped float", op) + return Val{} + case CTCPLX: + // TODO(mdempsky): Move to typecheck; see #31060. + yyerror("invalid operation: operator %v not defined on untyped complex", op) + return Val{} } - u.Xor(x) - return Val{U: u} case ONOT: return Val{U: !x.U.(bool)} @@ -1001,6 +1014,12 @@ func shiftOp(x Val, op Op, y Val) Val { // setconst rewrites n as an OLITERAL with value v. func setconst(n *Node, v Val) { + // If constant folding failed, mark n as broken and give up. + if v.U == nil { + n.Type = nil + return + } + // Ensure n.Orig still points to a semantically-equivalent // expression after we rewrite n into a constant. if n.Orig == n { diff --git a/test/const1.go b/test/const1.go index 62abe4145a..3fd5b55522 100644 --- a/test/const1.go +++ b/test/const1.go @@ -68,7 +68,7 @@ var ( c3 float64 = float64(Big) * Big // ERROR "overflow" c4 = Big * Big // ERROR "overflow" c5 = Big / 0 // ERROR "division by zero" - c6 = 1000 % 1e3 // ERROR "floating-point % operation|expected integer type" + c6 = 1000 % 1e3 // ERROR "invalid operation|expected integer type" ) func f(int) diff --git a/test/fixedbugs/issue31060.go b/test/fixedbugs/issue31060.go new file mode 100644 index 0000000000..a1ba705160 --- /dev/null +++ b/test/fixedbugs/issue31060.go @@ -0,0 +1,30 @@ +// errorcheck + +// Copyright 2019 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 p + +const ( + f = 1.0 + c = 1.0i + + _ = ^f // ERROR "invalid operation|expected integer" + _ = ^c // ERROR "invalid operation|expected integer" + + _ = f % f // ERROR "invalid operation|expected integer" + _ = c % c // ERROR "invalid operation|expected integer" + + _ = f & f // ERROR "invalid operation|expected integer" + _ = c & c // ERROR "invalid operation|expected integer" + + _ = f | f // ERROR "invalid operation|expected integer" + _ = c | c // ERROR "invalid operation|expected integer" + + _ = f ^ f // ERROR "invalid operation|expected integer" + _ = c ^ c // ERROR "invalid operation|expected integer" + + _ = f &^ f // ERROR "invalid operation|expected integer" + _ = c &^ c // ERROR "invalid operation|expected integer" +) -- GitLab From b2f19dad8bb2b942badcc1ea6f7147b11fed926e Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 28 Mar 2019 13:25:21 +0100 Subject: [PATCH 0629/1679] runtime/cgo: remove threadentry functions specialized for android The specialized functions set up the g register using the pthread API instead of setg_gcc, but the inittls functions have already made sure setg_gcc works. Updates #29674 Change-Id: Ie67c068d638af8b5823978ee839f6b61b2228996 Reviewed-on: https://go-review.googlesource.com/c/go/+/169797 Reviewed-by: Ian Lance Taylor --- src/runtime/cgo/gcc_android_386.c | 23 ----------------------- src/runtime/cgo/gcc_android_amd64.c | 23 ----------------------- src/runtime/cgo/gcc_linux_386.c | 8 +------- src/runtime/cgo/gcc_linux_amd64.c | 7 +------ 4 files changed, 2 insertions(+), 59 deletions(-) diff --git a/src/runtime/cgo/gcc_android_386.c b/src/runtime/cgo/gcc_android_386.c index 28f553c446..d31b37e2f3 100644 --- a/src/runtime/cgo/gcc_android_386.c +++ b/src/runtime/cgo/gcc_android_386.c @@ -7,9 +7,6 @@ #include #include "libcgo.h" -static void* threadentry(void*); -static pthread_key_t k1; - #define magic1 (0x23581321U) static void @@ -44,7 +41,6 @@ inittls(void) asm volatile("movl %%gs:0xf8, %0" : "=r"(x)); pthread_setspecific(k, 0); if (x == magic1) { - k1 = k; break; } if(ntofree >= nelem(tofree)) { @@ -68,23 +64,4 @@ inittls(void) } } - -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - if (pthread_setspecific(k1, (void*)ts.g) != 0) { - fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); - abort(); - } - - crosscall_386(ts.fn); - return nil; -} - void (*x_cgo_inittls)(void) = inittls; -void* (*x_cgo_threadentry)(void*) = threadentry; diff --git a/src/runtime/cgo/gcc_android_amd64.c b/src/runtime/cgo/gcc_android_amd64.c index 6f92d90dd4..a6c590a5a9 100644 --- a/src/runtime/cgo/gcc_android_amd64.c +++ b/src/runtime/cgo/gcc_android_amd64.c @@ -7,9 +7,6 @@ #include #include "libcgo.h" -static void* threadentry(void*); -static pthread_key_t k1; - #define magic1 (0x23581321345589ULL) static void @@ -49,7 +46,6 @@ inittls(void) asm volatile("movq %%fs:0x1d0, %0" : "=r"(x)); pthread_setspecific(k, 0); if(x == magic1) { - k1 = k; break; } if(ntofree >= nelem(tofree)) { @@ -73,23 +69,4 @@ inittls(void) } } - -static void* -threadentry(void *v) -{ - ThreadStart ts; - - ts = *(ThreadStart*)v; - free(v); - - if (pthread_setspecific(k1, (void*)ts.g) != 0) { - fprintf(stderr, "runtime/cgo: pthread_setspecific failed\n"); - abort(); - } - - crosscall_amd64(ts.fn); - return nil; -} - void (*x_cgo_inittls)(void) = inittls; -void* (*x_cgo_threadentry)(void*) = threadentry; diff --git a/src/runtime/cgo/gcc_linux_386.c b/src/runtime/cgo/gcc_linux_386.c index 6be4569b7a..9156b056ff 100644 --- a/src/runtime/cgo/gcc_linux_386.c +++ b/src/runtime/cgo/gcc_linux_386.c @@ -11,9 +11,8 @@ static void *threadentry(void*); static void (*setg_gcc)(void*); -// These will be set in gcc_android_386.c for android-specific customization. +// This will be set in gcc_android_386.c for android-specific customization. void (*x_cgo_inittls)(void); -void* (*x_cgo_threadentry)(void*); void x_cgo_init(G *g, void (*setg)(void*)) @@ -32,7 +31,6 @@ x_cgo_init(G *g, void (*setg)(void*)) } } - void _cgo_sys_thread_start(ThreadStart *ts) { @@ -66,10 +64,6 @@ _cgo_sys_thread_start(ThreadStart *ts) static void* threadentry(void *v) { - if (x_cgo_threadentry) { - return x_cgo_threadentry(v); - } - ThreadStart ts; ts = *(ThreadStart*)v; diff --git a/src/runtime/cgo/gcc_linux_amd64.c b/src/runtime/cgo/gcc_linux_amd64.c index 42008c3191..e899447844 100644 --- a/src/runtime/cgo/gcc_linux_amd64.c +++ b/src/runtime/cgo/gcc_linux_amd64.c @@ -13,9 +13,8 @@ static void* threadentry(void*); static void (*setg_gcc)(void*); -// These will be set in gcc_android_amd64.c for android-specific customization. +// This will be set in gcc_android_amd64.c for android-specific customization. void (*x_cgo_inittls)(void); -void* (*x_cgo_threadentry)(void*); void x_cgo_init(G* g, void (*setg)(void*)) @@ -83,10 +82,6 @@ _cgo_sys_thread_start(ThreadStart *ts) static void* threadentry(void *v) { - if (x_cgo_threadentry) { - return x_cgo_threadentry(v); - } - ThreadStart ts; ts = *(ThreadStart*)v; -- GitLab From c196d38d5e1d35c5b1eb1b19648532ea91442979 Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Fri, 29 Mar 2019 01:26:45 +1100 Subject: [PATCH 0630/1679] cmd/dist: pass cgotest linkmode via GOFLAGS cgotest attempts to exercise various linkmodes, however with recent refactoring TestCrossPackageTests is no longer running tests with these linkmodes. Specifying the linkmode via GOFLAGS restores previous behaviour. Note that the -ldflags="-linkmode=external -s" case cannot be passed through as GOFLAGS does not permit spaces in values and -ldflags can only be specified once. Fixes #31083. Change-Id: I2ce6c60da3f3d60495af283ea9122fb68a7a4f41 Reviewed-on: https://go-review.googlesource.com/c/go/+/169779 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/dist/test.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index ec78890f8c..3f8f12c9e9 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -1002,10 +1002,12 @@ func (t *tester) runHostTest(dir, pkg string) error { } func (t *tester) cgoTest(dt *distTest) error { - t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=auto") + cmd := t.addCmd(dt, "misc/cgo/test", t.goTest()) + cmd.Env = append(os.Environ(), "GOFLAGS=-ldflags=-linkmode=auto") if t.internalLink() { - t.addCmd(dt, "misc/cgo/test", t.goTest(), "-tags=internal", "-ldflags", "-linkmode=internal") + cmd := t.addCmd(dt, "misc/cgo/test", t.goTest(), "-tags=internal") + cmd.Env = append(os.Environ(), "GOFLAGS=-ldflags=-linkmode=internal") } pair := gohostos + "-" + goarch @@ -1017,8 +1019,11 @@ func (t *tester) cgoTest(dt *distTest) error { if !t.extLink() { break } - t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external") - t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external -s") + cmd := t.addCmd(dt, "misc/cgo/test", t.goTest()) + cmd.Env = append(os.Environ(), "GOFLAGS=-ldflags=-linkmode=external") + + cmd = t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external -s") + case "aix-ppc64", "android-arm", "dragonfly-amd64", @@ -1026,9 +1031,10 @@ func (t *tester) cgoTest(dt *distTest) error { "linux-386", "linux-amd64", "linux-arm", "linux-ppc64le", "linux-s390x", "netbsd-386", "netbsd-amd64": - cmd := t.addCmd(dt, "misc/cgo/test", t.goTest(), "-ldflags", "-linkmode=external") + cmd := t.addCmd(dt, "misc/cgo/test", t.goTest()) + cmd.Env = append(os.Environ(), "GOFLAGS=-ldflags=-linkmode=external") // A -g argument in CGO_CFLAGS should not affect how the test runs. - cmd.Env = append(os.Environ(), "CGO_CFLAGS=-g0") + cmd.Env = append(cmd.Env, "CGO_CFLAGS=-g0") t.addCmd(dt, "misc/cgo/testtls", t.goTest(), "-ldflags", "-linkmode=auto") t.addCmd(dt, "misc/cgo/testtls", t.goTest(), "-ldflags", "-linkmode=external") -- GitLab From ee2836048c5a5e48e35b7cb67303c3fe22728eca Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 25 Mar 2019 12:32:41 -0700 Subject: [PATCH 0631/1679] cmd/compile: change sinit.go functions into methods This will make it easier for subsequent CLs to track additional state during package initialization scheduling. Passes toolstash-check. Updates #22326. Change-Id: I528792ad34f41a4be52951531eb7525a94c9f350 Reviewed-on: https://go-review.googlesource.com/c/go/+/169898 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/order.go | 6 +- src/cmd/compile/internal/gc/sinit.go | 100 +++++++++++++++------------ 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/cmd/compile/internal/gc/order.go b/src/cmd/compile/internal/gc/order.go index 3aca63abaf..fd89254479 100644 --- a/src/cmd/compile/internal/gc/order.go +++ b/src/cmd/compile/internal/gc/order.go @@ -208,9 +208,9 @@ func (o *Order) addrTemp(n *Node) *Node { dowidth(n.Type) vstat := staticname(n.Type) vstat.Name.SetReadonly(true) - var out []*Node - staticassign(vstat, n, &out) - if out != nil { + var s InitSchedule + s.staticassign(vstat, n) + if s.out != nil { Fatalf("staticassign of const generated code: %+v", n) } vstat = typecheck(vstat, ctxExpr) diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 93afeb90a6..75756be0ef 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -26,6 +26,14 @@ type InitPlan struct { E []InitEntry } +type InitSchedule struct { + out []*Node +} + +func (s *InitSchedule) append(n *Node) { + s.out = append(s.out, n) +} + var ( initlist []*Node initplans map[*Node]*InitPlan @@ -34,20 +42,20 @@ var ( // init1 walks the AST starting at n, and accumulates in out // the list of definitions needing init code in dependency order. -func init1(n *Node, out *[]*Node) { +func (s *InitSchedule) init1(n *Node) { if n == nil { return } - init1(n.Left, out) - init1(n.Right, out) + s.init1(n.Left) + s.init1(n.Right) for _, n1 := range n.List.Slice() { - init1(n1, out) + s.init1(n1) } if n.isMethodExpression() { // Methods called as Type.Method(receiver, ...). // Definitions for method expressions are stored in type->nname. - init1(asNode(n.Type.FuncType().Nname), out) + s.init1(asNode(n.Type.FuncType().Nname)) } if n.Op != ONAME { @@ -108,7 +116,7 @@ func init1(n *Node, out *[]*Node) { Fatalf("init1: bad defn") case ODCLFUNC: - init2list(defn.Nbody, out) + s.init2list(defn.Nbody) case OAS: if defn.Left != n { @@ -122,15 +130,15 @@ func init1(n *Node, out *[]*Node) { break } - init2(defn.Right, out) + s.init2(defn.Right) if Debug['j'] != 0 { fmt.Printf("%v\n", n.Sym) } - if n.isBlank() || !staticinit(n, out) { + if n.isBlank() || !s.staticinit(n) { if Debug['%'] != 0 { Dump("nonstatic", defn) } - *out = append(*out, defn) + s.append(defn) } case OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV: @@ -139,12 +147,12 @@ func init1(n *Node, out *[]*Node) { } defn.SetInitorder(InitPending) for _, n2 := range defn.Rlist.Slice() { - init1(n2, out) + s.init1(n2) } if Debug['%'] != 0 { Dump("nonstatic", defn) } - *out = append(*out, defn) + s.append(defn) defn.SetInitorder(InitDone) } } @@ -196,7 +204,7 @@ func foundinitloop(node, visited *Node) { } // recurse over n, doing init1 everywhere. -func init2(n *Node, out *[]*Node) { +func (s *InitSchedule) init2(n *Node) { if n == nil || n.Initorder() == InitDone { return } @@ -205,38 +213,38 @@ func init2(n *Node, out *[]*Node) { Fatalf("name %v with ninit: %+v\n", n.Sym, n) } - init1(n, out) - init2(n.Left, out) - init2(n.Right, out) - init2list(n.Ninit, out) - init2list(n.List, out) - init2list(n.Rlist, out) - init2list(n.Nbody, out) + s.init1(n) + s.init2(n.Left) + s.init2(n.Right) + s.init2list(n.Ninit) + s.init2list(n.List) + s.init2list(n.Rlist) + s.init2list(n.Nbody) switch n.Op { case OCLOSURE: - init2list(n.Func.Closure.Nbody, out) + s.init2list(n.Func.Closure.Nbody) case ODOTMETH, OCALLPART: - init2(asNode(n.Type.FuncType().Nname), out) + s.init2(asNode(n.Type.FuncType().Nname)) } } -func init2list(l Nodes, out *[]*Node) { +func (s *InitSchedule) init2list(l Nodes) { for _, n := range l.Slice() { - init2(n, out) + s.init2(n) } } -func initreorder(l []*Node, out *[]*Node) { +func (s *InitSchedule) initreorder(l []*Node) { for _, n := range l { switch n.Op { case ODCLFUNC, ODCLCONST, ODCLTYPE: continue } - initreorder(n.Ninit.Slice(), out) + s.initreorder(n.Ninit.Slice()) n.Ninit.Set(nil) - init1(n, out) + s.init1(n) } } @@ -244,18 +252,18 @@ func initreorder(l []*Node, out *[]*Node) { // declarations and outputs the corresponding list of statements // to include in the init() function body. func initfix(l []*Node) []*Node { - var lout []*Node + var s InitSchedule initplans = make(map[*Node]*InitPlan) lno := lineno - initreorder(l, &lout) + s.initreorder(l) lineno = lno initplans = nil - return lout + return s.out } // compilation of top-level (static) assignments // into DATA statements if at all possible. -func staticinit(n *Node, out *[]*Node) bool { +func (s *InitSchedule) staticinit(n *Node) bool { if n.Op != ONAME || n.Class() != PEXTERN || n.Name.Defn == nil || n.Name.Defn.Op != OAS { Fatalf("staticinit") } @@ -263,12 +271,12 @@ func staticinit(n *Node, out *[]*Node) bool { lineno = n.Pos l := n.Name.Defn.Left r := n.Name.Defn.Right - return staticassign(l, r, out) + return s.staticassign(l, r) } // like staticassign but we are copying an already // initialized value r. -func staticcopy(l *Node, r *Node, out *[]*Node) bool { +func (s *InitSchedule) staticcopy(l *Node, r *Node) bool { if r.Op != ONAME { return false } @@ -294,12 +302,12 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool { switch r.Op { case ONAME: - if staticcopy(l, r, out) { + if s.staticcopy(l, r) { return true } // We may have skipped past one or more OCONVNOPs, so // use conv to ensure r is assignable to l (#13263). - *out = append(*out, nod(OAS, l, conv(r, l.Type))) + s.append(nod(OAS, l, conv(r, l.Type))) return true case OLITERAL: @@ -350,7 +358,7 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool { continue } ll := n.sepcopy() - if staticcopy(ll, e.Expr, out) { + if s.staticcopy(ll, e.Expr) { continue } // Requires computation, but we're @@ -359,7 +367,7 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool { rr.Type = ll.Type rr.Xoffset += e.Xoffset setlineno(rr) - *out = append(*out, nod(OAS, ll, rr)) + s.append(nod(OAS, ll, rr)) } return true @@ -368,14 +376,14 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool { return false } -func staticassign(l *Node, r *Node, out *[]*Node) bool { +func (s *InitSchedule) staticassign(l *Node, r *Node) bool { for r.Op == OCONVNOP { r = r.Left } switch r.Op { case ONAME: - return staticcopy(l, r, out) + return s.staticcopy(l, r) case OLITERAL: if isZero(r) { @@ -404,8 +412,8 @@ func staticassign(l *Node, r *Node, out *[]*Node) bool { gdata(l, nod(OADDR, a, nil), int(l.Type.Width)) // Init underlying literal. - if !staticassign(a, r.Left, out) { - *out = append(*out, nod(OAS, a, r.Left)) + if !s.staticassign(a, r.Left) { + s.append(nod(OAS, a, r.Left)) } return true } @@ -452,8 +460,8 @@ func staticassign(l *Node, r *Node, out *[]*Node) bool { } setlineno(e.Expr) a := n.sepcopy() - if !staticassign(a, e.Expr, out) { - *out = append(*out, nod(OAS, a, e.Expr)) + if !s.staticassign(a, e.Expr) { + s.append(nod(OAS, a, e.Expr)) } } @@ -516,15 +524,15 @@ func staticassign(l *Node, r *Node, out *[]*Node) bool { n.Type = val.Type setlineno(val) a := n.sepcopy() - if !staticassign(a, val, out) { - *out = append(*out, nod(OAS, a, val)) + if !s.staticassign(a, val) { + s.append(nod(OAS, a, val)) } } else { // Construct temp to hold val, write pointer to temp into n. a := staticname(val.Type) inittemps[val] = a - if !staticassign(a, val, out) { - *out = append(*out, nod(OAS, a, val)) + if !s.staticassign(a, val) { + s.append(nod(OAS, a, val)) } ptr := nod(OADDR, a, nil) n.Type = types.NewPtr(val.Type) -- GitLab From 57bd57745431da4aeb85d6caae145e5f4dfbca38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Tue, 26 Mar 2019 14:55:48 +0100 Subject: [PATCH 0632/1679] cmd/vet/all: enable AIX checks Fixes #27985 Change-Id: I2f3d06ced9da9fc56f30f1285a8d393e689c29ac Reviewed-on: https://go-review.googlesource.com/c/go/+/169019 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/vet/all/main.go | 6 ------ src/cmd/vet/all/whitelist/aix_ppc64.txt | 8 ++++++++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 src/cmd/vet/all/whitelist/aix_ppc64.txt diff --git a/src/cmd/vet/all/main.go b/src/cmd/vet/all/main.go index e4f8eccd8c..0c699751ec 100644 --- a/src/cmd/vet/all/main.go +++ b/src/cmd/vet/all/main.go @@ -209,12 +209,6 @@ func (p platform) vet() { return } - if p.os == "aix" && p.arch == "ppc64" { - // TODO(aix): enable as soon as the aix/ppc64 port has fully landed - fmt.Println("skipping aix/ppc64") - return - } - var buf bytes.Buffer fmt.Fprintf(&buf, "go run main.go -p %s\n", p) diff --git a/src/cmd/vet/all/whitelist/aix_ppc64.txt b/src/cmd/vet/all/whitelist/aix_ppc64.txt new file mode 100644 index 0000000000..49ff6df2ea --- /dev/null +++ b/src/cmd/vet/all/whitelist/aix_ppc64.txt @@ -0,0 +1,8 @@ +// aix/ppc64-specific vet whitelist. See readme.txt for details. + +runtime/asm_ppc64x.s: [ppc64] sigreturn: function sigreturn missing Go declaration +runtime/sys_aix_ppc64.s: [ppc64] callCfunction: function callCfunction missing Go declaration +runtime/sys_aix_ppc64.s: [ppc64] _asmsyscall6: function _asmsyscall6 missing Go declaration +runtime/sys_aix_ppc64.s: [ppc64] _sigtramp: function _sigtramp missing Go declaration +runtime/sys_aix_ppc64.s: [ppc64] _sigtramp: use of 16(R1) points beyond argument frame +runtime/sys_aix_ppc64.s: [ppc64] _tstart: function _tstart missing Go declaration -- GitLab From d23bf3daa9384a8c30d3231b5f02d0bea481415e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 25 Mar 2019 12:35:42 -0700 Subject: [PATCH 0633/1679] cmd/compile: move sinit.go globals into InitSchedule Eliminates global state from sinit.go. Passes toolstash-check. Updates #22326. Change-Id: Ie3cb14bff625baa20134d1488962ab02d24f0c15 Reviewed-on: https://go-review.googlesource.com/c/go/+/169899 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/sinit.go | 84 ++++++++++++++-------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/src/cmd/compile/internal/gc/sinit.go b/src/cmd/compile/internal/gc/sinit.go index 75756be0ef..d755ea35cc 100644 --- a/src/cmd/compile/internal/gc/sinit.go +++ b/src/cmd/compile/internal/gc/sinit.go @@ -27,19 +27,16 @@ type InitPlan struct { } type InitSchedule struct { - out []*Node + out []*Node + initlist []*Node + initplans map[*Node]*InitPlan + inittemps map[*Node]*Node } func (s *InitSchedule) append(n *Node) { s.out = append(s.out, n) } -var ( - initlist []*Node - initplans map[*Node]*InitPlan - inittemps = make(map[*Node]*Node) -) - // init1 walks the AST starting at n, and accumulates in out // the list of definitions needing init code in dependency order. func (s *InitSchedule) init1(n *Node) { @@ -86,16 +83,16 @@ func (s *InitSchedule) init1(n *Node) { // a variable in the program, the tree walk will reach a cycle // involving that variable. if n.Class() != PFUNC { - foundinitloop(n, n) + s.foundinitloop(n, n) } - for i := len(initlist) - 1; i >= 0; i-- { - x := initlist[i] + for i := len(s.initlist) - 1; i >= 0; i-- { + x := s.initlist[i] if x == n { break } if x.Class() != PFUNC { - foundinitloop(n, x) + s.foundinitloop(n, x) } } @@ -105,7 +102,7 @@ func (s *InitSchedule) init1(n *Node) { // reached a new unvisited node. n.SetInitorder(InitPending) - initlist = append(initlist, n) + s.initlist = append(s.initlist, n) // make sure that everything n depends on is initialized. // n->defn is an assignment to n @@ -157,18 +154,18 @@ func (s *InitSchedule) init1(n *Node) { } } - last := len(initlist) - 1 - if initlist[last] != n { - Fatalf("bad initlist %v", initlist) + last := len(s.initlist) - 1 + if s.initlist[last] != n { + Fatalf("bad initlist %v", s.initlist) } - initlist[last] = nil // allow GC - initlist = initlist[:last] + s.initlist[last] = nil // allow GC + s.initlist = s.initlist[:last] n.SetInitorder(InitDone) } // foundinitloop prints an init loop error and exits. -func foundinitloop(node, visited *Node) { +func (s *InitSchedule) foundinitloop(node, visited *Node) { // If there have already been errors printed, // those errors probably confused us and // there might not be a loop. Let the user @@ -180,9 +177,9 @@ func foundinitloop(node, visited *Node) { // Find the index of node and visited in the initlist. var nodeindex, visitedindex int - for ; initlist[nodeindex] != node; nodeindex++ { + for ; s.initlist[nodeindex] != node; nodeindex++ { } - for ; initlist[visitedindex] != visited; visitedindex++ { + for ; s.initlist[visitedindex] != visited; visitedindex++ { } // There is a loop involving visited. We know about node and @@ -190,12 +187,12 @@ func foundinitloop(node, visited *Node) { fmt.Printf("%v: initialization loop:\n", visited.Line()) // Print visited -> ... -> n1 -> node. - for _, n := range initlist[visitedindex:] { + for _, n := range s.initlist[visitedindex:] { fmt.Printf("\t%v %v refers to\n", n.Line(), n.Sym) } // Print node -> ... -> visited. - for _, n := range initlist[nodeindex:visitedindex] { + for _, n := range s.initlist[nodeindex:visitedindex] { fmt.Printf("\t%v %v refers to\n", n.Line(), n.Sym) } @@ -252,12 +249,13 @@ func (s *InitSchedule) initreorder(l []*Node) { // declarations and outputs the corresponding list of statements // to include in the init() function body. func initfix(l []*Node) []*Node { - var s InitSchedule - initplans = make(map[*Node]*InitPlan) + s := InitSchedule{ + initplans: make(map[*Node]*InitPlan), + inittemps: make(map[*Node]*Node), + } lno := lineno s.initreorder(l) lineno = lno - initplans = nil return s.out } @@ -328,13 +326,13 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool { switch r.Left.Op { case OARRAYLIT, OSLICELIT, OSTRUCTLIT, OMAPLIT: // copy pointer - gdata(l, nod(OADDR, inittemps[r], nil), int(l.Type.Width)) + gdata(l, nod(OADDR, s.inittemps[r], nil), int(l.Type.Width)) return true } case OSLICELIT: // copy slice - a := inittemps[r] + a := s.inittemps[r] n := l.copy() n.Xoffset = l.Xoffset + int64(array_array) @@ -346,7 +344,7 @@ func (s *InitSchedule) staticcopy(l *Node, r *Node) bool { return true case OARRAYLIT, OSTRUCTLIT: - p := initplans[r] + p := s.initplans[r] n := l.copy() for i := range p.E { @@ -408,7 +406,7 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { // Init pointer. a := staticname(r.Left.Type) - inittemps[r] = a + s.inittemps[r] = a gdata(l, nod(OADDR, a, nil), int(l.Type.Width)) // Init underlying literal. @@ -427,12 +425,12 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { } case OSLICELIT: - initplan(r) + s.initplan(r) // Init slice. bound := r.Right.Int64() ta := types.NewArray(r.Type.Elem(), bound) a := staticname(ta) - inittemps[r] = a + s.inittemps[r] = a n := l.copy() n.Xoffset = l.Xoffset + int64(array_array) gdata(n, nod(OADDR, a, nil), Widthptr) @@ -446,9 +444,9 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { fallthrough case OARRAYLIT, OSTRUCTLIT: - initplan(r) + s.initplan(r) - p := initplans[r] + p := s.initplans[r] n := l.copy() for i := range p.E { e := &p.E[i] @@ -530,7 +528,7 @@ func (s *InitSchedule) staticassign(l *Node, r *Node) bool { } else { // Construct temp to hold val, write pointer to temp into n. a := staticname(val.Type) - inittemps[val] = a + s.inittemps[val] = a if !s.staticassign(a, val) { s.append(nod(OAS, a, val)) } @@ -1251,12 +1249,12 @@ func stataddr(nam *Node, n *Node) bool { return false } -func initplan(n *Node) { - if initplans[n] != nil { +func (s *InitSchedule) initplan(n *Node) { + if s.initplans[n] != nil { return } p := new(InitPlan) - initplans[n] = p + s.initplans[n] = p switch n.Op { default: Fatalf("initplan") @@ -1271,7 +1269,7 @@ func initplan(n *Node) { } a = a.Right } - addvalue(p, k*n.Type.Elem().Width, a) + s.addvalue(p, k*n.Type.Elem().Width, a) k++ } @@ -1280,7 +1278,7 @@ func initplan(n *Node) { if a.Op != OSTRUCTKEY { Fatalf("initplan structlit") } - addvalue(p, a.Xoffset, a.Left) + s.addvalue(p, a.Xoffset, a.Left) } case OMAPLIT: @@ -1288,12 +1286,12 @@ func initplan(n *Node) { if a.Op != OKEY { Fatalf("initplan maplit") } - addvalue(p, -1, a.Right) + s.addvalue(p, -1, a.Right) } } } -func addvalue(p *InitPlan, xoffset int64, n *Node) { +func (s *InitSchedule) addvalue(p *InitPlan, xoffset int64, n *Node) { // special case: zero can be dropped entirely if isZero(n) { return @@ -1301,8 +1299,8 @@ func addvalue(p *InitPlan, xoffset int64, n *Node) { // special case: inline struct and array (not slice) literals if isvaluelit(n) { - initplan(n) - q := initplans[n] + s.initplan(n) + q := s.initplans[n] for _, qe := range q.E { // qe is a copy; we are not modifying entries in q.E qe.Xoffset += xoffset -- GitLab From 4d23cbc67100c1ce50b7d4fcc67e50091f92eb5b Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sat, 23 Mar 2019 15:25:42 +0100 Subject: [PATCH 0634/1679] cmd/compile: add sign-extension operators on wasm This change adds the GOWASM option "signext" to enable the generation of experimental sign-extension operators. The feature is in phase 4 of the WebAssembly proposal process: https://github.com/WebAssembly/meetings/blob/master/process/phases.md More information on the feature can be found at: https://github.com/WebAssembly/sign-extension-ops/blob/master/proposals/sign-extension-ops/Overview.md Change-Id: I6b30069390a8699fbecd9fb4d1d61e13c59b0333 Reviewed-on: https://go-review.googlesource.com/c/go/+/168882 Reviewed-by: Cherry Zhang Reviewed-by: Ian Lance Taylor Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- doc/install-source.html | 2 +- src/cmd/compile/internal/ssa/gen/Wasm.rules | 3 + src/cmd/compile/internal/ssa/gen/WasmOps.go | 4 ++ src/cmd/compile/internal/ssa/opGen.go | 42 ++++++++++++ src/cmd/compile/internal/ssa/rewriteWasm.go | 72 +++++++++++++++++++++ src/cmd/compile/internal/wasm/ssa.go | 5 +- src/cmd/go/alldocs.go | 3 + src/cmd/go/internal/help/helpdoc.go | 3 + src/cmd/internal/obj/wasm/a.out.go | 7 +- src/cmd/internal/obj/wasm/anames.go | 6 ++ src/cmd/internal/obj/wasm/wasmobj.go | 2 +- src/cmd/internal/objabi/util.go | 9 ++- 12 files changed, 151 insertions(+), 7 deletions(-) diff --git a/doc/install-source.html b/doc/install-source.html index 46dc618a9c..9c73b925b1 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -645,7 +645,7 @@ for which the compiler will target. The default is power8. The default is to use no experimental features.

    diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index 83e1be798e..72f4805edf 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -56,6 +56,9 @@ (ZeroExt32to64 x:(I64Load32U _ _)) -> x (ZeroExt16to(64|32) x:(I64Load16U _ _)) -> x (ZeroExt8to(64|32|16) x:(I64Load8U _ _)) -> x +(SignExt32to64 x) && objabi.GOWASM.SignExt -> (I64Extend32S x) +(SignExt8to(64|32|16) x) && objabi.GOWASM.SignExt -> (I64Extend8S x) +(SignExt16to(64|32) x) && objabi.GOWASM.SignExt -> (I64Extend16S x) (SignExt32to64 x) -> (I64ShrS (I64Shl x (I64Const [32])) (I64Const [32])) (SignExt16to(64|32) x) -> (I64ShrS (I64Shl x (I64Const [48])) (I64Const [48])) (SignExt8to(64|32|16) x) -> (I64ShrS (I64Shl x (I64Const [56])) (I64Const [56])) diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index 4a01bf6c28..4e5f076575 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -192,6 +192,10 @@ func init() { {name: "F64ConvertI64S", asm: "F64ConvertI64S", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the signed integer arg0 to a float {name: "F64ConvertI64U", asm: "F64ConvertI64U", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the unsigned integer arg0 to a float + {name: "I64Extend8S", asm: "I64Extend8S", argLength: 1, reg: gp11, typ: "Int64"}, // sign-extend arg0 from 8 to 64 bit + {name: "I64Extend16S", asm: "I64Extend16S", argLength: 1, reg: gp11, typ: "Int64"}, // sign-extend arg0 from 16 to 64 bit + {name: "I64Extend32S", asm: "I64Extend32S", argLength: 1, reg: gp11, typ: "Int64"}, // sign-extend arg0 from 32 to 64 bit + {name: "F64Sqrt", asm: "F64Sqrt", argLength: 1, reg: fp11, typ: "Float64"}, // sqrt(arg0) {name: "F64Trunc", asm: "F64Trunc", argLength: 1, reg: fp11, typ: "Float64"}, // trunc(arg0) {name: "F64Ceil", asm: "F64Ceil", argLength: 1, reg: fp11, typ: "Float64"}, // ceil(arg0) diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index d71d6146d1..214d68757c 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -2136,6 +2136,9 @@ const ( OpWasmI64TruncF64U OpWasmF64ConvertI64S OpWasmF64ConvertI64U + OpWasmI64Extend8S + OpWasmI64Extend16S + OpWasmI64Extend32S OpWasmF64Sqrt OpWasmF64Trunc OpWasmF64Ceil @@ -28724,6 +28727,45 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "I64Extend8S", + argLen: 1, + asm: wasm.AI64Extend8S, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, + { + name: "I64Extend16S", + argLen: 1, + asm: wasm.AI64Extend16S, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, + { + name: "I64Extend32S", + argLen: 1, + asm: wasm.AI64Extend32S, + reg: regInfo{ + inputs: []inputInfo{ + {0, 4295032831}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 SP + }, + outputs: []outputInfo{ + {0, 65535}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 + }, + }, + }, { name: "F64Sqrt", argLen: 1, diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index 7796548ee4..fe85922e31 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -4426,6 +4426,18 @@ func rewriteValueWasm_OpSignExt16to32_0(v *Value) bool { return true } // match: (SignExt16to32 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend16S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend16S) + v.AddArg(x) + return true + } + // match: (SignExt16to32 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [48])) (I64Const [48])) for { @@ -4461,6 +4473,18 @@ func rewriteValueWasm_OpSignExt16to64_0(v *Value) bool { return true } // match: (SignExt16to64 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend16S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend16S) + v.AddArg(x) + return true + } + // match: (SignExt16to64 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [48])) (I64Const [48])) for { @@ -4496,6 +4520,18 @@ func rewriteValueWasm_OpSignExt32to64_0(v *Value) bool { return true } // match: (SignExt32to64 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend32S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend32S) + v.AddArg(x) + return true + } + // match: (SignExt32to64 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [32])) (I64Const [32])) for { @@ -4531,6 +4567,18 @@ func rewriteValueWasm_OpSignExt8to16_0(v *Value) bool { return true } // match: (SignExt8to16 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend8S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend8S) + v.AddArg(x) + return true + } + // match: (SignExt8to16 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [56])) (I64Const [56])) for { @@ -4566,6 +4614,18 @@ func rewriteValueWasm_OpSignExt8to32_0(v *Value) bool { return true } // match: (SignExt8to32 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend8S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend8S) + v.AddArg(x) + return true + } + // match: (SignExt8to32 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [56])) (I64Const [56])) for { @@ -4601,6 +4661,18 @@ func rewriteValueWasm_OpSignExt8to64_0(v *Value) bool { return true } // match: (SignExt8to64 x) + // cond: objabi.GOWASM.SignExt + // result: (I64Extend8S x) + for { + x := v.Args[0] + if !(objabi.GOWASM.SignExt) { + break + } + v.reset(OpWasmI64Extend8S) + v.AddArg(x) + return true + } + // match: (SignExt8to64 x) // cond: // result: (I64ShrS (I64Shl x (I64Const [56])) (I64Const [56])) for { diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index d2ac2df613..7575df548a 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -317,7 +317,10 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { p := s.Prog(wasm.ACall) p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncU} - case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U, ssa.OpWasmF64Sqrt, ssa.OpWasmF64Trunc, ssa.OpWasmF64Ceil, ssa.OpWasmF64Floor, ssa.OpWasmF64Nearest, ssa.OpWasmF64Abs, ssa.OpWasmI64Ctz, ssa.OpWasmI64Clz, ssa.OpWasmI64Popcnt: + case + ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U, + ssa.OpWasmI64Extend8S, ssa.OpWasmI64Extend16S, ssa.OpWasmI64Extend32S, + ssa.OpWasmF64Sqrt, ssa.OpWasmF64Trunc, ssa.OpWasmF64Ceil, ssa.OpWasmF64Floor, ssa.OpWasmF64Nearest, ssa.OpWasmF64Abs, ssa.OpWasmI64Ctz, ssa.OpWasmI64Clz, ssa.OpWasmI64Popcnt: getValue64(s, v.Args[0]) s.Prog(v.Op.Asm()) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 8dd3f8eb18..f42635f6a8 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1569,6 +1569,9 @@ // GOMIPS64 // For GOARCH=mips64{,le}, whether to use floating point instructions. // Valid values are hardfloat (default), softfloat. +// GOWASM +// For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use. +// Valid values are: signext. // // Special-purpose environment variables: // diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index d931c9225b..777bd511b1 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -563,6 +563,9 @@ Architecture-specific environment variables: GOMIPS64 For GOARCH=mips64{,le}, whether to use floating point instructions. Valid values are hardfloat (default), softfloat. + GOWASM + For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use. + Valid values are: signext. Special-purpose environment variables: diff --git a/src/cmd/internal/obj/wasm/a.out.go b/src/cmd/internal/obj/wasm/a.out.go index f1830ba036..29ea87f3b0 100644 --- a/src/cmd/internal/obj/wasm/a.out.go +++ b/src/cmd/internal/obj/wasm/a.out.go @@ -210,8 +210,13 @@ const ( AI64ReinterpretF64 AF32ReinterpretI32 AF64ReinterpretI64 + AI32Extend8S + AI32Extend16S + AI64Extend8S + AI64Extend16S + AI64Extend32S - // End of low-level WebAssembly instructions. + ALast // Sentinel: End of low-level WebAssembly instructions. ARESUMEPOINT // ACALLNORESUME is a call which is not followed by a resume point. diff --git a/src/cmd/internal/obj/wasm/anames.go b/src/cmd/internal/obj/wasm/anames.go index 7ef09d665e..fb4b72c398 100644 --- a/src/cmd/internal/obj/wasm/anames.go +++ b/src/cmd/internal/obj/wasm/anames.go @@ -177,6 +177,12 @@ var Anames = []string{ "I64ReinterpretF64", "F32ReinterpretI32", "F64ReinterpretI64", + "I32Extend8S", + "I32Extend16S", + "I64Extend8S", + "I64Extend16S", + "I64Extend32S", + "Last", "RESUMEPOINT", "CALLNORESUME", "RETUNWIND", diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go index ad98cfe90a..dded62a4be 100644 --- a/src/cmd/internal/obj/wasm/wasmobj.go +++ b/src/cmd/internal/obj/wasm/wasmobj.go @@ -886,7 +886,7 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } switch { - case p.As < AUnreachable || p.As > AF64ReinterpretI64: + case p.As < AUnreachable || p.As >= ALast: panic(fmt.Sprintf("unexpected assembler op: %s", p.As)) case p.As < AEnd: w.WriteByte(byte(p.As - AUnreachable + 0x00)) diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index c007f6c475..02f9d9273a 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -78,19 +78,22 @@ func goppc64() int { } type gowasmFeatures struct { - // no features yet + SignExt bool } func (f *gowasmFeatures) String() string { var flags []string - // no features yet + if f.SignExt { + flags = append(flags, "signext") + } return strings.Join(flags, ",") } func gowasm() (f gowasmFeatures) { for _, opt := range strings.Split(envOr("GOWASM", ""), ",") { switch opt { - // no features yet + case "signext": + f.SignExt = true case "": // ignore default: -- GitLab From 93af67783796a48b3f59bd969dc0c528c37571ec Mon Sep 17 00:00:00 2001 From: Daniel Cormier Date: Fri, 10 Nov 2017 11:50:13 -0500 Subject: [PATCH 0635/1679] net/textproto: properly write terminating sequence if DotWriter is closed with no writes Fixed textproto.Writer.DotWriter() to properly write \r\n.\r\n to the buffer when Close() is called without any bytes written. This properly writes the terminating sequence outlined in RFC 5321 section 4.1.1.4 and RFC 3977 section 3.1.1, even when no other bytes are written. Change-Id: I262fd2963ee76fff7ffae8e3cb0e86255694b361 Reviewed-on: https://go-review.googlesource.com/c/go/+/77350 Reviewed-by: Brad Fitzpatrick --- src/net/textproto/writer.go | 5 +++-- src/net/textproto/writer_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/net/textproto/writer.go b/src/net/textproto/writer.go index 1bc5974c6c..33c146c022 100644 --- a/src/net/textproto/writer.go +++ b/src/net/textproto/writer.go @@ -58,7 +58,8 @@ type dotWriter struct { } const ( - wstateBeginLine = iota // beginning of line; initial state; must be zero + wstateBegin = iota // initial state; must be zero + wstateBeginLine // beginning of line wstateCR // wrote \r (possibly at end of line) wstateData // writing data in middle of line ) @@ -68,7 +69,7 @@ func (d *dotWriter) Write(b []byte) (n int, err error) { for n < len(b) { c := b[n] switch d.state { - case wstateBeginLine: + case wstateBegin, wstateBeginLine: d.state = wstateData if c == '.' { // escape leading dot diff --git a/src/net/textproto/writer_test.go b/src/net/textproto/writer_test.go index ac03669fa2..2afef11b5e 100644 --- a/src/net/textproto/writer_test.go +++ b/src/net/textproto/writer_test.go @@ -33,3 +33,29 @@ func TestDotWriter(t *testing.T) { t.Fatalf("wrote %q", s) } } + +func TestDotWriterCloseEmptyWrite(t *testing.T) { + var buf bytes.Buffer + w := NewWriter(bufio.NewWriter(&buf)) + d := w.DotWriter() + n, err := d.Write([]byte{}) + if n != 0 || err != nil { + t.Fatalf("Write: %d, %s", n, err) + } + d.Close() + want := "\r\n.\r\n" + if s := buf.String(); s != want { + t.Fatalf("wrote %q; want %q", s, want) + } +} + +func TestDotWriterCloseNoWrite(t *testing.T) { + var buf bytes.Buffer + w := NewWriter(bufio.NewWriter(&buf)) + d := w.DotWriter() + d.Close() + want := "\r\n.\r\n" + if s := buf.String(); s != want { + t.Fatalf("wrote %q; want %q", s, want) + } +} -- GitLab From fa5dbd06e57475a6b788ebf0468c132ec9cd77fc Mon Sep 17 00:00:00 2001 From: Leonardo Comelli Date: Tue, 19 Mar 2019 03:53:04 +0000 Subject: [PATCH 0636/1679] cmd: ignore the directory named go.mod The existing implementation does not check in all cases whether go.mod is a regular file. Fixes #30788 Change-Id: I6d140545c3cfada651612efd5bee2fbdcb747ca7 GitHub-Last-Rev: 4a9b251e378d9d7cc8768d395c360d3542fc9bc6 GitHub-Pull-Request: golang/go#30830 Reviewed-on: https://go-review.googlesource.com/c/go/+/167393 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 4 ++-- src/cmd/go/internal/modload/search.go | 2 +- src/cmd/go/internal/search/search.go | 2 +- src/cmd/go/testdata/script/mod_dir.txt | 20 ++++++++++++++++++++ 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_dir.txt diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index db3e1a9e5b..83ef0e0b4f 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -233,8 +233,8 @@ func dirInModule(path, mpath, mdir string, isLocal bool) (dir string, haveGoFile if isLocal { for d := dir; d != mdir && len(d) > len(mdir); { haveGoMod := haveGoModCache.Do(d, func() interface{} { - _, err := os.Stat(filepath.Join(d, "go.mod")) - return err == nil + fi, err := os.Stat(filepath.Join(d, "go.mod")) + return err == nil && !fi.IsDir() }).(bool) if haveGoMod { diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 753b3be6de..3af39747c6 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -76,7 +76,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } // Stop at module boundaries. if path != root { - if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil { + if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() { return filepath.SkipDir } } diff --git a/src/cmd/go/internal/search/search.go b/src/cmd/go/internal/search/search.go index 0ca60e7349..20e8f0ad1e 100644 --- a/src/cmd/go/internal/search/search.go +++ b/src/cmd/go/internal/search/search.go @@ -190,7 +190,7 @@ func MatchPackagesInFS(pattern string) *Match { if !top && cfg.ModulesEnabled { // Ignore other modules found in subdirectories. - if _, err := os.Stat(filepath.Join(path, "go.mod")); err == nil { + if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() { return filepath.SkipDir } } diff --git a/src/cmd/go/testdata/script/mod_dir.txt b/src/cmd/go/testdata/script/mod_dir.txt new file mode 100644 index 0000000000..05548f6366 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_dir.txt @@ -0,0 +1,20 @@ +# The directory named go.mod should be ignored + +env GO111MODULE=on + +cd $WORK/sub + +go list . +stdout 'x/sub' + +mkdir go.mod +exists go.mod + +go list . +stdout 'x/sub' + +-- $WORK/go.mod -- +module x + +-- $WORK/sub/x.go -- +package x \ No newline at end of file -- GitLab From 5ee1d5d39f0c802be0de31533042ddc3871a0b1e Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 25 Mar 2019 16:06:16 -0700 Subject: [PATCH 0637/1679] cmd/compile: minor cleanup Use constants that are easier to read. Change-Id: I11fd6363b3bd283a4cc7c9908c2327123c64dcf7 Reviewed-on: https://go-review.googlesource.com/c/go/+/169723 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/ssa.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 17a9a2664c..a50e56f8f2 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -4695,7 +4695,7 @@ var f32_u64 = f2uCvtTab{ or: ssa.OpOr64, floatValue: (*state).constFloat32, intValue: (*state).constInt64, - cutoff: 9223372036854775808, + cutoff: 1 << 63, } var f64_u64 = f2uCvtTab{ @@ -4705,7 +4705,7 @@ var f64_u64 = f2uCvtTab{ or: ssa.OpOr64, floatValue: (*state).constFloat64, intValue: (*state).constInt64, - cutoff: 9223372036854775808, + cutoff: 1 << 63, } var f32_u32 = f2uCvtTab{ @@ -4715,7 +4715,7 @@ var f32_u32 = f2uCvtTab{ or: ssa.OpOr32, floatValue: (*state).constFloat32, intValue: func(s *state, t *types.Type, v int64) *ssa.Value { return s.constInt32(t, int32(v)) }, - cutoff: 2147483648, + cutoff: 1 << 31, } var f64_u32 = f2uCvtTab{ @@ -4725,7 +4725,7 @@ var f64_u32 = f2uCvtTab{ or: ssa.OpOr32, floatValue: (*state).constFloat64, intValue: func(s *state, t *types.Type, v int64) *ssa.Value { return s.constInt32(t, int32(v)) }, - cutoff: 2147483648, + cutoff: 1 << 31, } func (s *state) float32ToUint64(n *Node, x *ssa.Value, ft, tt *types.Type) *ssa.Value { -- GitLab From f07a99e30a86e302724fbcb189defd5ebb80b8df Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 19 Mar 2019 16:36:21 -0400 Subject: [PATCH 0638/1679] cmd/go: recognize android suffix when constructing build list cmd/go/internal/imports.ScanDir extracts a list of imports from a directory. It's used instead of go/build.ImportDir when constructing the build list. GOOS and GOARCH may be used to filter files. With this change, imports.MatchFile understands that when the "android" tag is set, the "linux" tag is implied. Fixes #30888 Change-Id: Ia29bd1590b69c9183ab14a879d5fc1b639f8eaef Reviewed-on: https://go-review.googlesource.com/c/go/+/168378 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/imports/build.go | 6 +-- src/cmd/go/internal/imports/scan_test.go | 41 +++++++++++++++---- .../imports/testdata/android/a_android.go | 3 ++ .../testdata/android/b_android_arm64.go | 3 ++ .../imports/testdata/android/c_linux.go | 3 ++ .../imports/testdata/android/d_linux_arm64.go | 3 ++ .../go/internal/imports/testdata/android/e.go | 5 +++ .../go/internal/imports/testdata/android/f.go | 5 +++ .../go/internal/imports/testdata/android/g.go | 5 +++ .../imports/testdata/android/tags.txt | 1 + .../imports/testdata/android/want.txt | 6 +++ .../internal/imports/testdata/star/tags.txt | 1 + .../internal/imports/testdata/star/want.txt | 4 ++ .../imports/testdata/{import1 => star}/x.go | 0 .../imports/testdata/{import1 => star}/x1.go | 0 .../testdata/{import1 => star}/x_darwin.go | 0 .../testdata/{import1 => star}/x_windows.go | 0 17 files changed, 76 insertions(+), 10 deletions(-) create mode 100644 src/cmd/go/internal/imports/testdata/android/a_android.go create mode 100644 src/cmd/go/internal/imports/testdata/android/b_android_arm64.go create mode 100644 src/cmd/go/internal/imports/testdata/android/c_linux.go create mode 100644 src/cmd/go/internal/imports/testdata/android/d_linux_arm64.go create mode 100644 src/cmd/go/internal/imports/testdata/android/e.go create mode 100644 src/cmd/go/internal/imports/testdata/android/f.go create mode 100644 src/cmd/go/internal/imports/testdata/android/g.go create mode 100644 src/cmd/go/internal/imports/testdata/android/tags.txt create mode 100644 src/cmd/go/internal/imports/testdata/android/want.txt create mode 100644 src/cmd/go/internal/imports/testdata/star/tags.txt create mode 100644 src/cmd/go/internal/imports/testdata/star/want.txt rename src/cmd/go/internal/imports/testdata/{import1 => star}/x.go (100%) rename src/cmd/go/internal/imports/testdata/{import1 => star}/x1.go (100%) rename src/cmd/go/internal/imports/testdata/{import1 => star}/x_darwin.go (100%) rename src/cmd/go/internal/imports/testdata/{import1 => star}/x_windows.go (100%) diff --git a/src/cmd/go/internal/imports/build.go b/src/cmd/go/internal/imports/build.go index ddf425b020..3718dbba3c 100644 --- a/src/cmd/go/internal/imports/build.go +++ b/src/cmd/go/internal/imports/build.go @@ -184,13 +184,13 @@ func MatchFile(name string, tags map[string]bool) bool { } n := len(l) if n >= 2 && KnownOS[l[n-2]] && KnownArch[l[n-1]] { - return tags[l[n-2]] && tags[l[n-1]] + return matchTag(l[n-2], tags, true) && matchTag(l[n-1], tags, true) } if n >= 1 && KnownOS[l[n-1]] { - return tags[l[n-1]] + return matchTag(l[n-1], tags, true) } if n >= 1 && KnownArch[l[n-1]] { - return tags[l[n-1]] + return matchTag(l[n-1], tags, true) } return true } diff --git a/src/cmd/go/internal/imports/scan_test.go b/src/cmd/go/internal/imports/scan_test.go index 6a2ff62ba7..e424656cae 100644 --- a/src/cmd/go/internal/imports/scan_test.go +++ b/src/cmd/go/internal/imports/scan_test.go @@ -5,10 +5,13 @@ package imports import ( + "bytes" "internal/testenv" + "io/ioutil" + "path" "path/filepath" - "reflect" "runtime" + "strings" "testing" ) @@ -51,17 +54,41 @@ func TestScan(t *testing.T) { t.Errorf("json missing test import net/http (%q)", testImports) } } - -func TestScanStar(t *testing.T) { +func TestScanDir(t *testing.T) { testenv.MustHaveGoBuild(t) - imports, _, err := ScanDir("testdata/import1", map[string]bool{"*": true}) + dirs, err := ioutil.ReadDir("testdata") if err != nil { t.Fatal(err) } + for _, dir := range dirs { + if !dir.IsDir() || strings.HasPrefix(dir.Name(), ".") { + continue + } + t.Run(dir.Name(), func(t *testing.T) { + tagsData, err := ioutil.ReadFile(filepath.Join("testdata", dir.Name(), "tags.txt")) + if err != nil { + t.Fatalf("error reading tags: %v", err) + } + tags := make(map[string]bool) + for _, t := range strings.Fields(string(tagsData)) { + tags[t] = true + } + + wantData, err := ioutil.ReadFile(filepath.Join("testdata", dir.Name(), "want.txt")) + if err != nil { + t.Fatalf("error reading want: %v", err) + } + want := string(bytes.TrimSpace(wantData)) - want := []string{"import1", "import2", "import3", "import4"} - if !reflect.DeepEqual(imports, want) { - t.Errorf("ScanDir testdata/import1:\nhave %v\nwant %v", imports, want) + imports, _, err := ScanDir(path.Join("testdata", dir.Name()), tags) + if err != nil { + t.Fatal(err) + } + got := strings.Join(imports, "\n") + if got != want { + t.Errorf("ScanDir: got imports:\n%s\n\nwant:\n%s", got, want) + } + }) } } diff --git a/src/cmd/go/internal/imports/testdata/android/a_android.go b/src/cmd/go/internal/imports/testdata/android/a_android.go new file mode 100644 index 0000000000..2ed972eca5 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/a_android.go @@ -0,0 +1,3 @@ +package android + +import _ "a" diff --git a/src/cmd/go/internal/imports/testdata/android/b_android_arm64.go b/src/cmd/go/internal/imports/testdata/android/b_android_arm64.go new file mode 100644 index 0000000000..ee9c312b5d --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/b_android_arm64.go @@ -0,0 +1,3 @@ +package android + +import _ "b" diff --git a/src/cmd/go/internal/imports/testdata/android/c_linux.go b/src/cmd/go/internal/imports/testdata/android/c_linux.go new file mode 100644 index 0000000000..91624ce637 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/c_linux.go @@ -0,0 +1,3 @@ +package android + +import _ "c" diff --git a/src/cmd/go/internal/imports/testdata/android/d_linux_arm64.go b/src/cmd/go/internal/imports/testdata/android/d_linux_arm64.go new file mode 100644 index 0000000000..34e07df247 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/d_linux_arm64.go @@ -0,0 +1,3 @@ +package android + +import _ "d" diff --git a/src/cmd/go/internal/imports/testdata/android/e.go b/src/cmd/go/internal/imports/testdata/android/e.go new file mode 100644 index 0000000000..d9b2db769b --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/e.go @@ -0,0 +1,5 @@ +// +build android + +package android + +import _ "e" diff --git a/src/cmd/go/internal/imports/testdata/android/f.go b/src/cmd/go/internal/imports/testdata/android/f.go new file mode 100644 index 0000000000..281e4dd6b9 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/f.go @@ -0,0 +1,5 @@ +// +build linux + +package android + +import _ "f" diff --git a/src/cmd/go/internal/imports/testdata/android/g.go b/src/cmd/go/internal/imports/testdata/android/g.go new file mode 100644 index 0000000000..66a789c0ad --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/g.go @@ -0,0 +1,5 @@ +// +build !android + +package android + +import _ "g" diff --git a/src/cmd/go/internal/imports/testdata/android/tags.txt b/src/cmd/go/internal/imports/testdata/android/tags.txt new file mode 100644 index 0000000000..aaf5a6b91d --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/tags.txt @@ -0,0 +1 @@ +android arm64 \ No newline at end of file diff --git a/src/cmd/go/internal/imports/testdata/android/want.txt b/src/cmd/go/internal/imports/testdata/android/want.txt new file mode 100644 index 0000000000..0fdf397db0 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/android/want.txt @@ -0,0 +1,6 @@ +a +b +c +d +e +f diff --git a/src/cmd/go/internal/imports/testdata/star/tags.txt b/src/cmd/go/internal/imports/testdata/star/tags.txt new file mode 100644 index 0000000000..f59ec20aab --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/star/tags.txt @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/src/cmd/go/internal/imports/testdata/star/want.txt b/src/cmd/go/internal/imports/testdata/star/want.txt new file mode 100644 index 0000000000..139f5f4975 --- /dev/null +++ b/src/cmd/go/internal/imports/testdata/star/want.txt @@ -0,0 +1,4 @@ +import1 +import2 +import3 +import4 diff --git a/src/cmd/go/internal/imports/testdata/import1/x.go b/src/cmd/go/internal/imports/testdata/star/x.go similarity index 100% rename from src/cmd/go/internal/imports/testdata/import1/x.go rename to src/cmd/go/internal/imports/testdata/star/x.go diff --git a/src/cmd/go/internal/imports/testdata/import1/x1.go b/src/cmd/go/internal/imports/testdata/star/x1.go similarity index 100% rename from src/cmd/go/internal/imports/testdata/import1/x1.go rename to src/cmd/go/internal/imports/testdata/star/x1.go diff --git a/src/cmd/go/internal/imports/testdata/import1/x_darwin.go b/src/cmd/go/internal/imports/testdata/star/x_darwin.go similarity index 100% rename from src/cmd/go/internal/imports/testdata/import1/x_darwin.go rename to src/cmd/go/internal/imports/testdata/star/x_darwin.go diff --git a/src/cmd/go/internal/imports/testdata/import1/x_windows.go b/src/cmd/go/internal/imports/testdata/star/x_windows.go similarity index 100% rename from src/cmd/go/internal/imports/testdata/import1/x_windows.go rename to src/cmd/go/internal/imports/testdata/star/x_windows.go -- GitLab From b3e2da629abc5a569a6bfa09f8077f57791ac857 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 28 Mar 2019 16:32:09 -0700 Subject: [PATCH 0639/1679] cmd/internal/src: fix a few typos in documentation Noticed while reading recent commits. Change-Id: Ibcd500b0ea5732364124572a17b374402d715090 Reviewed-on: https://go-review.googlesource.com/c/go/+/170059 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/internal/src/pos.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/internal/src/pos.go b/src/cmd/internal/src/pos.go index 954c00716f..0e8973fe90 100644 --- a/src/cmd/internal/src/pos.go +++ b/src/cmd/internal/src/pos.go @@ -301,11 +301,11 @@ type lico uint32 // The bitfield order is chosen to make IsStmt be the least significant // part of a position; its use is to communicate statement edges through // instruction scrambling in code generation, not to impose an order. -// TODO: Prologue and epilogue are perhaps better handled as psuedoops for the assembler, +// TODO: Prologue and epilogue are perhaps better handled as pseudo-ops for the assembler, // because they have almost no interaction with other uses of the position. const ( lineBits, lineMax = 20, 1< Date: Thu, 28 Mar 2019 12:50:47 -0700 Subject: [PATCH 0640/1679] runtime: fix TestLldbPython in module mode (again) When run with GOPATH=/dev/null, go build fails: $ GOPATH=/dev/null go test -run=TestLldbPython -v -count=1 runtime === RUN TestLldbPython --- FAIL: TestLldbPython (0.21s) runtime-lldb_test.go:169: building source exit status 1 go: failed to create cache directory /dev/null/pkg/mod/cache: mkdir /dev/null: not a directory FAIL FAIL runtime 0.220s But run.bash sets GOPATH=/dev/null. Fix this by setting GOPATH to the empty string before passing to 'go build'. Fixes #31100 Change-Id: I573c4755d209e0c3eb26c20d4f7870c2961f2782 Reviewed-on: https://go-review.googlesource.com/c/go/+/169918 Run-TryBot: Josh Bleecher Snyder Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/runtime/runtime-lldb_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/runtime-lldb_test.go b/src/runtime/runtime-lldb_test.go index c7b769ce83..985745d97c 100644 --- a/src/runtime/runtime-lldb_test.go +++ b/src/runtime/runtime-lldb_test.go @@ -164,6 +164,7 @@ func TestLldbPython(t *testing.T) { // disable it for this test. cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=all=-N -l", "-ldflags=-compressdwarf=false", "-o", "a.exe") cmd.Dir = dir + cmd.Env = append(os.Environ(), "GOPATH=") // issue 31100 out, err := cmd.CombinedOutput() if err != nil { t.Fatalf("building source %v\n%s", err, out) -- GitLab From 5b68cb65d3385edbd42fd19484a9e9be7fadbec7 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Wed, 13 Feb 2019 08:49:52 +0530 Subject: [PATCH 0641/1679] go/ast: fix SortImports to handle block comments The current algorithm only assumed line comments which always appear at the end of an import spec. This caused block comments which can appear before a spec to be attached to the previous spec. So while mapping a comment to an import spec, we maintain additional information on whether the comment is supposed to appear on the left or right of the spec. And we also take into account the possibility of "//line" comments in the source. So we use unadjusted line numbers. While at it, added some more testcases from tools/go/ast/astutil/imports_test.go Fixes #18929 Change-Id: If920426641702a8a93904b2ec1d3455749169f69 Reviewed-on: https://go-review.googlesource.com/c/go/+/162337 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer --- src/cmd/gofmt/testdata/import.golden | 60 +++++++++++++++++++++ src/cmd/gofmt/testdata/import.input | 62 +++++++++++++++++++++ src/go/ast/import.go | 81 ++++++++++++++++++++-------- 3 files changed, 180 insertions(+), 23 deletions(-) diff --git a/src/cmd/gofmt/testdata/import.golden b/src/cmd/gofmt/testdata/import.golden index 51d7be79df..f7d742e3e8 100644 --- a/src/cmd/gofmt/testdata/import.golden +++ b/src/cmd/gofmt/testdata/import.golden @@ -1,3 +1,4 @@ +// package comment package main import ( @@ -20,6 +21,10 @@ import ( "io" ) +// We reset the line numbering to test that +// the formatting works independent of line directives +//line :19 + import ( "errors" "fmt" @@ -124,3 +129,58 @@ import ( "dedup_by_group" ) + +import ( + "fmt" // for Printf + /* comment */ io1 "io" + /* comment */ io2 "io" + /* comment */ "log" +) + +import ( + "fmt" + /* comment */ io1 "io" + /* comment */ io2 "io" // hello + "math" /* right side */ + // end +) + +import ( + "errors" // for New + "fmt" + /* comment */ io1 "io" /* before */ // after + io2 "io" // another + // end +) + +import ( + "errors" // for New + /* left */ "fmt" /* right */ + "log" // for Fatal + /* left */ "math" /* right */ +) + +import /* why */ /* comment here? */ ( + /* comment */ "fmt" + "math" +) + +// Reset it again +//line :100 + +// Dedup with different import styles +import ( + "path" + . "path" + _ "path" + pathpkg "path" +) + +/* comment */ +import ( + "fmt" + "math" // for Abs + // This is a new run + "errors" + "fmt" +) diff --git a/src/cmd/gofmt/testdata/import.input b/src/cmd/gofmt/testdata/import.input index 9a4b09dbf9..6e3a3a3bed 100644 --- a/src/cmd/gofmt/testdata/import.input +++ b/src/cmd/gofmt/testdata/import.input @@ -1,3 +1,4 @@ +// package comment package main import ( @@ -20,6 +21,10 @@ import ( "io" ) +// We reset the line numbering to test that +// the formatting works independent of line directives +//line :19 + import ( "fmt" "math" @@ -129,3 +134,60 @@ import ( "dedup_by_group" ) + +import ( + /* comment */ io1 "io" + "fmt" // for Printf + /* comment */ "log" + /* comment */ io2 "io" +) + +import ( + /* comment */ io2 "io" // hello + /* comment */ io1 "io" + "math" /* right side */ + "fmt" + // end +) + +import ( + /* comment */ io1 "io" /* before */ // after + "fmt" + "errors" // for New + io2 "io" // another + // end +) + +import ( + /* left */ "fmt" /* right */ + "errors" // for New + /* left */ "math" /* right */ + "log" // for Fatal +) + +import /* why */ /* comment here? */ ( + /* comment */ "fmt" + "math" +) + +// Reset it again +//line :100 + +// Dedup with different import styles +import ( + "path" + . "path" + _ "path" + "path" + pathpkg "path" +) + +/* comment */ +import ( + "math" // for Abs + "fmt" + // This is a new run + "errors" + "fmt" + "errors" +) diff --git a/src/go/ast/import.go b/src/go/ast/import.go index be23c7fc43..7102884c85 100644 --- a/src/go/ast/import.go +++ b/src/go/ast/import.go @@ -30,7 +30,7 @@ func SortImports(fset *token.FileSet, f *File) { i := 0 specs := d.Specs[:0] for j, s := range d.Specs { - if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line { + if j > i && lineAt(fset, s.Pos()) > 1+lineAt(fset, d.Specs[j-1].End()) { // j begins a new run. End this one. specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...) i = j @@ -42,8 +42,8 @@ func SortImports(fset *token.FileSet, f *File) { // Deduping can leave a blank line before the rparen; clean that up. if len(d.Specs) > 0 { lastSpec := d.Specs[len(d.Specs)-1] - lastLine := fset.Position(lastSpec.Pos()).Line - rParenLine := fset.Position(d.Rparen).Line + lastLine := lineAt(fset, lastSpec.Pos()) + rParenLine := lineAt(fset, d.Rparen) for rParenLine > lastLine+1 { rParenLine-- fset.File(d.Rparen).MergeLine(rParenLine) @@ -52,6 +52,10 @@ func SortImports(fset *token.FileSet, f *File) { } } +func lineAt(fset *token.FileSet, pos token.Pos) int { + return fset.PositionFor(pos, false).Line +} + func importPath(s Spec) string { t, err := strconv.Unquote(s.(*ImportSpec).Path.Value) if err == nil { @@ -89,6 +93,11 @@ type posSpan struct { End token.Pos } +type cgPos struct { + left bool // true if comment is to the left of the spec, false otherwise. + cg *CommentGroup +} + func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { // Can't short-circuit here even if specs are already sorted, // since they might yet need deduplication. @@ -104,39 +113,57 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { } // Identify comments in this range. - // Any comment from pos[0].Start to the final line counts. - lastLine := fset.Position(pos[len(pos)-1].End).Line - cstart := len(f.Comments) - cend := len(f.Comments) + begSpecs := pos[0].Start + endSpecs := pos[len(pos)-1].End + beg := fset.File(begSpecs).LineStart(lineAt(fset, begSpecs)) + end := fset.File(endSpecs).LineStart(lineAt(fset, endSpecs) + 1) // beginning of next line + first := len(f.Comments) + last := -1 for i, g := range f.Comments { - if g.Pos() < pos[0].Start { - continue - } - if i < cstart { - cstart = i - } - if fset.Position(g.End()).Line > lastLine { - cend = i + if g.End() >= end { break } + // g.End() < end + if beg <= g.Pos() { + // comment is within the range [beg, end[ of import declarations + if i < first { + first = i + } + if i > last { + last = i + } + } } - comments := f.Comments[cstart:cend] - // Assign each comment to the import spec preceding it. - importComments := map[*ImportSpec][]*CommentGroup{} + var comments []*CommentGroup + if last >= 0 { + comments = f.Comments[first : last+1] + } + + // Assign each comment to the import spec on the same line. + importComments := map[*ImportSpec][]cgPos{} specIndex := 0 for _, g := range comments { for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() { specIndex++ } + var left bool + // A block comment can appear before the first import spec. + if specIndex == 0 && pos[specIndex].Start > g.Pos() { + left = true + } else if specIndex+1 < len(specs) && // Or it can appear on the left of an import spec. + lineAt(fset, pos[specIndex].Start)+1 == lineAt(fset, g.Pos()) { + specIndex++ + left = true + } s := specs[specIndex].(*ImportSpec) - importComments[s] = append(importComments[s], g) + importComments[s] = append(importComments[s], cgPos{left: left, cg: g}) } // Sort the import specs by import path. // Remove duplicates, when possible without data loss. // Reassign the import paths to have the same position sequence. - // Reassign each comment to abut the end of its spec. + // Reassign each comment to the spec on the same line. // Sort the comments by new position. sort.Slice(specs, func(i, j int) bool { ipath := importPath(specs[i]) @@ -160,7 +187,7 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { deduped = append(deduped, s) } else { p := s.Pos() - fset.File(p).MergeLine(fset.Position(p).Line) + fset.File(p).MergeLine(lineAt(fset, p)) } } specs = deduped @@ -174,8 +201,16 @@ func sortSpecs(fset *token.FileSet, f *File, specs []Spec) []Spec { s.Path.ValuePos = pos[i].Start s.EndPos = pos[i].End for _, g := range importComments[s] { - for _, c := range g.List { - c.Slash = pos[i].End + for _, c := range g.cg.List { + if g.left { + c.Slash = pos[i].Start - 1 + } else { + // An import spec can have both block comment and a line comment + // to its right. In that case, both of them will have the same pos. + // But while formatting the AST, the line comment gets moved to + // after the block comment. + c.Slash = pos[i].End + } } } } -- GitLab From 4a7cd9d9df6750581c76123a8c448a6f22744151 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Wed, 27 Mar 2019 20:23:13 +0530 Subject: [PATCH 0642/1679] internal/bytealg: simplify memchr for wasm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Get rid of an extra register R5 which just recalculated the value of R4. Reuse R4 instead. We also remove the casting of c to an unsigned char because the initial load of R0 is done with I32Load8U anyways. Also indent the code to make it more readable. name old time/op new time/op delta IndexRune 597ns ± 3% 580ns ± 3% -2.93% (p=0.002 n=10+10) IndexRuneLongString 634ns ± 4% 654ns ± 3% +3.07% (p=0.004 n=10+10) IndexRuneFastPath 57.6ns ± 3% 56.9ns ± 4% ~ (p=0.210 n=10+10) Index 104ns ± 3% 104ns ± 4% ~ (p=0.639 n=10+10) LastIndex 87.1ns ± 5% 85.7ns ± 3% ~ (p=0.171 n=10+10) IndexByte 34.4ns ± 4% 32.9ns ± 5% -4.28% (p=0.002 n=10+10) IndexHard1 21.6ms ± 1% 21.8ms ± 3% ~ (p=0.460 n=8+10) IndexHard2 21.6ms ± 2% 21.9ms ± 5% ~ (p=0.133 n=9+10) IndexHard3 21.8ms ± 3% 21.7ms ± 1% ~ (p=0.579 n=10+10) IndexHard4 21.6ms ± 1% 21.9ms ± 4% ~ (p=0.360 n=8+10) LastIndexHard1 25.1ms ± 2% 25.4ms ± 5% ~ (p=0.853 n=10+10) LastIndexHard2 25.3ms ± 6% 25.2ms ± 5% ~ (p=0.796 n=10+10) LastIndexHard3 25.3ms ± 4% 25.2ms ± 3% ~ (p=0.739 n=10+10) IndexTorture 130µs ± 3% 133µs ± 5% ~ (p=0.218 n=10+10) IndexAnyASCII/1:1 98.4ns ± 5% 96.6ns ± 5% ~ (p=0.054 n=10+10) IndexAnyASCII/1:2 109ns ± 4% 110ns ± 3% ~ (p=0.232 n=10+10) IndexAnyASCII/1:4 135ns ± 4% 134ns ± 3% ~ (p=0.671 n=10+10) IndexAnyASCII/1:8 184ns ± 4% 184ns ± 3% ~ (p=0.749 n=10+10) IndexAnyASCII/1:16 289ns ± 3% 281ns ± 3% -2.73% (p=0.001 n=9+10) IndexAnyASCII/16:1 322ns ± 3% 307ns ± 3% -4.71% (p=0.000 n=10+10) IndexAnyASCII/16:2 329ns ± 3% 320ns ± 3% -2.89% (p=0.008 n=10+10) IndexAnyASCII/16:4 353ns ± 3% 339ns ± 3% -3.91% (p=0.001 n=10+10) IndexAnyASCII/16:8 390ns ± 3% 374ns ± 3% -4.06% (p=0.000 n=10+10) IndexAnyASCII/16:16 471ns ± 4% 452ns ± 2% -4.22% (p=0.000 n=10+10) IndexAnyASCII/256:1 2.94µs ± 4% 2.91µs ± 2% ~ (p=0.424 n=10+10) IndexAnyASCII/256:2 2.92µs ± 3% 2.90µs ± 2% ~ (p=0.388 n=9+10) IndexAnyASCII/256:4 2.93µs ± 1% 2.90µs ± 1% -0.98% (p=0.036 n=8+9) IndexAnyASCII/256:8 3.03µs ± 5% 2.97µs ± 3% ~ (p=0.085 n=10+10) IndexAnyASCII/256:16 3.07µs ± 4% 3.01µs ± 1% -2.03% (p=0.003 n=10+9) IndexAnyASCII/4096:1 45.8µs ± 3% 45.9µs ± 2% ~ (p=0.905 n=10+9) IndexAnyASCII/4096:2 46.7µs ± 3% 46.2µs ± 3% ~ (p=0.190 n=10+10) IndexAnyASCII/4096:4 45.7µs ± 2% 46.4µs ± 3% +1.37% (p=0.022 n=9+10) IndexAnyASCII/4096:8 46.4µs ± 3% 46.0µs ± 2% ~ (p=0.436 n=10+10) IndexAnyASCII/4096:16 46.6µs ± 3% 46.7µs ± 2% ~ (p=0.971 n=10+10) IndexPeriodic/IndexPeriodic2 1.40ms ± 3% 1.40ms ± 2% ~ (p=0.853 n=10+10) IndexPeriodic/IndexPeriodic4 1.40ms ± 3% 1.40ms ± 3% ~ (p=0.579 n=10+10) IndexPeriodic/IndexPeriodic8 1.42ms ± 3% 1.39ms ± 2% -1.60% (p=0.029 n=10+10) IndexPeriodic/IndexPeriodic16 616µs ± 5% 583µs ± 5% -5.32% (p=0.001 n=10+10) IndexPeriodic/IndexPeriodic32 313µs ± 5% 301µs ± 2% -3.67% (p=0.002 n=10+10) IndexPeriodic/IndexPeriodic64 169µs ± 5% 164µs ± 5% -3.17% (p=0.023 n=10+10) NodeJS version - 10.2.1 Change-Id: I9a8268314b5652c4aeffc4c5c72d2fd1a384aa9e Reviewed-on: https://go-review.googlesource.com/c/go/+/169777 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/internal/bytealg/indexbyte_wasm.s | 271 +++++++++++++------------- 1 file changed, 133 insertions(+), 138 deletions(-) diff --git a/src/internal/bytealg/indexbyte_wasm.s b/src/internal/bytealg/indexbyte_wasm.s index 4d940a3bb0..ef4bd93070 100644 --- a/src/internal/bytealg/indexbyte_wasm.s +++ b/src/internal/bytealg/indexbyte_wasm.s @@ -49,149 +49,144 @@ TEXT ·IndexByteString(SB), NOSPLIT, $0-32 RET -// compiled with emscripten -// params: s, c, len +// initially compiled with emscripten and then modified over time. +// params: +// R0: s +// R1: c +// R2: len // ret: index TEXT memchr<>(SB), NOSPLIT, $0 Get R1 - I32Const $255 - I32And Set R4 Block - Block - Get R2 - I32Const $0 - I32Ne - Tee R3 - Get R0 - I32Const $3 - I32And - I32Const $0 - I32Ne - I32And - If - Get R1 - I32Const $255 - I32And - Set R5 - Loop - Get R0 - I32Load8U $0 - Get R5 - I32Eq - BrIf $2 - Get R2 - I32Const $-1 - I32Add - Tee R2 - I32Const $0 - I32Ne - Tee R3 - Get R0 - I32Const $1 - I32Add - Tee R0 - I32Const $3 - I32And - I32Const $0 - I32Ne - I32And - BrIf $0 - End - End - Get R3 - BrIf $0 - I32Const $0 - Set R1 - Br $1 - End - Get R0 - I32Load8U $0 - Get R1 - I32Const $255 - I32And - Tee R3 - I32Eq - If - Get R2 - Set R1 - Else - Get R4 - I32Const $16843009 - I32Mul - Set R4 - Block - Block - Get R2 - I32Const $3 - I32GtU - If - Get R2 - Set R1 - Loop - Get R0 - I32Load $0 - Get R4 - I32Xor - Tee R2 - I32Const $-2139062144 - I32And - I32Const $-2139062144 - I32Xor - Get R2 - I32Const $-16843009 - I32Add - I32And - I32Eqz - If - Get R0 - I32Const $4 - I32Add - Set R0 - Get R1 - I32Const $-4 - I32Add - Tee R1 - I32Const $3 - I32GtU - BrIf $1 - Br $3 - End - End - Else - Get R2 - Set R1 - Br $1 - End - Br $1 - End - Get R1 - I32Eqz - If - I32Const $0 - Set R1 - Br $3 - End - End - Loop - Get R0 - I32Load8U $0 - Get R3 - I32Eq - BrIf $2 - Get R0 - I32Const $1 - I32Add - Set R0 - Get R1 - I32Const $-1 - I32Add - Tee R1 - BrIf $0 - I32Const $0 - Set R1 - End - End + Block + Get R2 + I32Const $0 + I32Ne + Tee R3 + Get R0 + I32Const $3 + I32And + I32Const $0 + I32Ne + I32And + If + Loop + Get R0 + I32Load8U $0 + Get R1 + I32Eq + BrIf $2 + Get R2 + I32Const $-1 + I32Add + Tee R2 + I32Const $0 + I32Ne + Tee R3 + Get R0 + I32Const $1 + I32Add + Tee R0 + I32Const $3 + I32And + I32Const $0 + I32Ne + I32And + BrIf $0 + End + End + Get R3 + BrIf $0 + I32Const $0 + Set R1 + Br $1 + End + Get R0 + I32Load8U $0 + Get R4 + Tee R3 + I32Eq + If + Get R2 + Set R1 + Else + Get R4 + I32Const $16843009 + I32Mul + Set R4 + Block + Block + Get R2 + I32Const $3 + I32GtU + If + Get R2 + Set R1 + Loop + Get R0 + I32Load $0 + Get R4 + I32Xor + Tee R2 + I32Const $-2139062144 + I32And + I32Const $-2139062144 + I32Xor + Get R2 + I32Const $-16843009 + I32Add + I32And + I32Eqz + If + Get R0 + I32Const $4 + I32Add + Set R0 + Get R1 + I32Const $-4 + I32Add + Tee R1 + I32Const $3 + I32GtU + BrIf $1 + Br $3 + End + End + Else + Get R2 + Set R1 + Br $1 + End + Br $1 + End + Get R1 + I32Eqz + If + I32Const $0 + Set R1 + Br $3 + End + End + Loop + Get R0 + I32Load8U $0 + Get R3 + I32Eq + BrIf $2 + Get R0 + I32Const $1 + I32Add + Set R0 + Get R1 + I32Const $-1 + I32Add + Tee R1 + BrIf $0 + I32Const $0 + Set R1 + End + End End Get R0 I32Const $0 -- GitLab From ddef157813686870e26c3c2c83bd5af6bef71a61 Mon Sep 17 00:00:00 2001 From: zdjones Date: Wed, 6 Feb 2019 19:49:15 +0000 Subject: [PATCH 0643/1679] cmd/compile: make prove use poset to check non-negatives Prove currently fails to remove bounds checks of the form: if i >= 0 { // hint that i is non-negative for i < len(data) { // i becomes Phi in the loop SSA _ = data[i] // data[Phi]; bounds check!! i++ } } addIndVarRestrictions fails to identify that the loop induction variable, (Phi), is non-negative. As a result, the restrictions, i <= Phi < len(data), are only added for the signed domain. When testing the bounds check, addBranchRestrictions is similarly unable to infer that Phi is non-negative. As a result, the restriction, Phi >= len(data), is only added/tested for the unsigned domain. This CL changes the isNonNegative method to utilise the factTable's partially ordered set (poset). It also adds field factTable.zero to allow isNonNegative to query the poset using the zero(0) constant found or created early in prove. Fixes #28956 Change-Id: I792f886c652eeaa339b0d57d5faefbf5922fe44f Reviewed-on: https://go-review.googlesource.com/c/go/+/161437 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Giovanni Bajo --- src/cmd/compile/internal/ssa/prove.go | 35 ++++++++++++++++----------- test/prove.go | 20 +++++++++++++++ 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index 1e5f4e9c6c..2ab9aafaa1 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -174,6 +174,10 @@ type factsTable struct { // more than one len(s) for a slice. We could keep a list if necessary. lens map[ID]*Value caps map[ID]*Value + + // zero is a reference to the zero-valued constant assigned or created + // during the len/cap sweep that begins prove. + zero *Value } // checkpointFact is an invalid value used for checkpointing @@ -566,7 +570,11 @@ func (ft *factsTable) isNonNegative(v *Value) bool { } } - return false + // Check if the signed poset can prove that the value is >= 0 + if ft.zero == nil { + ft.zero = v.Block.NewValue0I(v.Block.Pos, OpConst64, v.Block.Func.Config.Types.Int64, 0) + } + return ft.order[0].OrderedOrEqual(ft.zero, v) } // checkpoint saves the current state of known relations. @@ -734,13 +742,12 @@ func prove(f *Func) { ft.checkpoint() // Find length and capacity ops. - var zero *Value for _, b := range f.Blocks { for _, v := range b.Values { // If we found a zero constant, save it (so we don't have // to build one later). - if zero == nil && v.Op == OpConst64 && v.AuxInt == 0 { - zero = v + if ft.zero == nil && v.Op == OpConst64 && v.AuxInt == 0 { + ft.zero = v } if v.Uses == 0 { // We don't care about dead values. @@ -749,28 +756,28 @@ func prove(f *Func) { } switch v.Op { case OpStringLen: - if zero == nil { - zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) + if ft.zero == nil { + ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) } - ft.update(b, v, zero, signed, gt|eq) + ft.update(b, v, ft.zero, signed, gt|eq) case OpSliceLen: if ft.lens == nil { ft.lens = map[ID]*Value{} } ft.lens[v.Args[0].ID] = v - if zero == nil { - zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) + if ft.zero == nil { + ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) } - ft.update(b, v, zero, signed, gt|eq) + ft.update(b, v, ft.zero, signed, gt|eq) case OpSliceCap: if ft.caps == nil { ft.caps = map[ID]*Value{} } ft.caps[v.Args[0].ID] = v - if zero == nil { - zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) + if ft.zero == nil { + ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) } - ft.update(b, v, zero, signed, gt|eq) + ft.update(b, v, ft.zero, signed, gt|eq) } } } @@ -904,7 +911,7 @@ func getBranch(sdom SparseTree, p *Block, b *Block) branch { // starting in Block b. func addIndVarRestrictions(ft *factsTable, b *Block, iv indVar) { d := signed - if isNonNegative(iv.min) && isNonNegative(iv.max) { + if ft.isNonNegative(iv.min) && ft.isNonNegative(iv.max) { d |= unsigned } diff --git a/test/prove.go b/test/prove.go index 2db0a841e2..275528dde7 100644 --- a/test/prove.go +++ b/test/prove.go @@ -706,6 +706,26 @@ func range2(b [][32]int) { } } +// signhint1-2 test whether the hint (int >= 0) is propagated into the loop. +func signHint1(i int, data []byte) { + if i >= 0 { + for i < len(data) { // ERROR "Induction variable: limits \[\?,\?\), increment 1$" + _ = data[i] // ERROR "Proved IsInBounds$" + i++ + } + } +} + +func signHint2(b []byte, n int) { + if n < 0 { + panic("") + } + _ = b[25] + for i := n; i <= 25; i++ { // ERROR "Induction variable: limits \[\?,25\], increment 1$" + b[i] = 123 // ERROR "Proved IsInBounds$" + } +} + //go:noinline func useInt(a int) { } -- GitLab From 154e5abfcdb8ffe193d2af4c8ef590f4d9a27008 Mon Sep 17 00:00:00 2001 From: Ben Hoyt Date: Thu, 28 Mar 2019 17:49:43 -0400 Subject: [PATCH 0644/1679] bytes, strings: add tests for TrimLeftFunc and TrimRightFunc When I was working on the fix for #31038 (make TrimSpace return nil on all-space input) I noticed that there were no tests for TrimLeftFunc and TrimRightFunc, including the funky nil behavior. So add some! I've just reused the existing TrimFunc test cases for TrimLeftFunc and TrimRightFunc, as well as adding new tests for the empty string and all-trimmed cases (which test the nil-returning behavior of TrimFunc and TrimLeftFunc). Change-Id: Ib580d4364e9b3c91350305f9d9873080d7862904 Reviewed-on: https://go-review.googlesource.com/c/go/+/170061 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/bytes/bytes_test.go | 75 +++++++++++++++++++++++++++++++------ src/strings/strings_test.go | 67 +++++++++++++++++++++++++++------ 2 files changed, 118 insertions(+), 24 deletions(-) diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index a29ad5f3a0..4b000a3d2b 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -1261,8 +1261,11 @@ var isValidRune = predicate{ } type TrimFuncTest struct { - f predicate - in, out string + f predicate + in string + trimOut []byte + leftOut []byte + rightOut []byte } func not(p predicate) predicate { @@ -1275,20 +1278,68 @@ func not(p predicate) predicate { } var trimFuncTests = []TrimFuncTest{ - {isSpace, space + " hello " + space, "hello"}, - {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"}, - {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"}, - {not(isSpace), "hello" + space + "hello", space}, - {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"}, - {isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"}, - {not(isValidRune), "\xc0a\xc0", "a"}, + {isSpace, space + " hello " + space, + []byte("hello"), + []byte("hello " + space), + []byte(space + " hello")}, + {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", + []byte("hello"), + []byte("hello34\u0e50\u0e51"), + []byte("\u0e50\u0e5212hello")}, + {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", + []byte("hello"), + []byte("helloEF\u2C6F\u2C6FGH\u2C6F\u2C6F"), + []byte("\u2C6F\u2C6F\u2C6F\u2C6FABCDhello")}, + {not(isSpace), "hello" + space + "hello", + []byte(space), + []byte(space + "hello"), + []byte("hello" + space)}, + {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", + []byte("\u0e50\u0e521234\u0e50\u0e51"), + []byte("\u0e50\u0e521234\u0e50\u0e51helo"), + []byte("hello\u0e50\u0e521234\u0e50\u0e51")}, + {isValidRune, "ab\xc0a\xc0cd", + []byte("\xc0a\xc0"), + []byte("\xc0a\xc0cd"), + []byte("ab\xc0a\xc0")}, + {not(isValidRune), "\xc0a\xc0", + []byte("a"), + []byte("a\xc0"), + []byte("\xc0a")}, + // The nils returned by TrimLeftFunc are odd behavior, but we need + // to preserve backwards compatibility. + {isSpace, "", + nil, + nil, + []byte("")}, + {isSpace, " ", + nil, + nil, + []byte("")}, } func TestTrimFunc(t *testing.T) { for _, tc := range trimFuncTests { - actual := string(TrimFunc([]byte(tc.in), tc.f.f)) - if actual != tc.out { - t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out) + trimmers := []struct { + name string + trim func(s []byte, f func(r rune) bool) []byte + out []byte + }{ + {"TrimFunc", TrimFunc, tc.trimOut}, + {"TrimLeftFunc", TrimLeftFunc, tc.leftOut}, + {"TrimRightFunc", TrimRightFunc, tc.rightOut}, + } + for _, trimmer := range trimmers { + actual := trimmer.trim([]byte(tc.in), tc.f.f) + if actual == nil && trimmer.out != nil { + t.Errorf("%s(%q, %q) = nil; want %q", trimmer.name, tc.in, tc.f.name, trimmer.out) + } + if actual != nil && trimmer.out == nil { + t.Errorf("%s(%q, %q) = %q; want nil", trimmer.name, tc.in, tc.f.name, actual) + } + if !Equal(actual, trimmer.out) { + t.Errorf("%s(%q, %q) = %q; want %q", trimmer.name, tc.in, tc.f.name, actual, trimmer.out) + } } } } diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index 500671aca4..8f0a7a1a0a 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -864,23 +864,66 @@ func not(p predicate) predicate { } var trimFuncTests = []struct { - f predicate - in, out string + f predicate + in string + trimOut string + leftOut string + rightOut string }{ - {isSpace, space + " hello " + space, "hello"}, - {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"}, - {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"}, - {not(isSpace), "hello" + space + "hello", space}, - {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"}, - {isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"}, - {not(isValidRune), "\xc0a\xc0", "a"}, + {isSpace, space + " hello " + space, + "hello", + "hello " + space, + space + " hello"}, + {isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", + "hello", + "hello34\u0e50\u0e51", + "\u0e50\u0e5212hello"}, + {isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", + "hello", + "helloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", + "\u2C6F\u2C6F\u2C6F\u2C6FABCDhello"}, + {not(isSpace), "hello" + space + "hello", + space, + space + "hello", + "hello" + space}, + {not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", + "\u0e50\u0e521234\u0e50\u0e51", + "\u0e50\u0e521234\u0e50\u0e51helo", + "hello\u0e50\u0e521234\u0e50\u0e51"}, + {isValidRune, "ab\xc0a\xc0cd", + "\xc0a\xc0", + "\xc0a\xc0cd", + "ab\xc0a\xc0"}, + {not(isValidRune), "\xc0a\xc0", + "a", + "a\xc0", + "\xc0a"}, + {isSpace, "", + "", + "", + ""}, + {isSpace, " ", + "", + "", + ""}, } func TestTrimFunc(t *testing.T) { for _, tc := range trimFuncTests { - actual := TrimFunc(tc.in, tc.f.f) - if actual != tc.out { - t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out) + trimmers := []struct { + name string + trim func(s string, f func(r rune) bool) string + out string + }{ + {"TrimFunc", TrimFunc, tc.trimOut}, + {"TrimLeftFunc", TrimLeftFunc, tc.leftOut}, + {"TrimRightFunc", TrimRightFunc, tc.rightOut}, + } + for _, trimmer := range trimmers { + actual := trimmer.trim(tc.in, tc.f.f) + if actual != trimmer.out { + t.Errorf("%s(%q, %q) = %q; want %q", trimmer.name, tc.in, tc.f.name, actual, trimmer.out) + } } } } -- GitLab From 70ea70ecfda68abbc5b3c7703dc671f75adde645 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 27 Mar 2019 14:59:10 -0700 Subject: [PATCH 0645/1679] runtime: rename p racectx field to raceprocctx Both g and p had a racectx field, but they held different kinds of values. The g field held ThreadState values while the p field held Processor values (to use the names used in the C++ code in the compiler_rt support library). Rename the p field to raceprocctx to reduce potential confusion. Change-Id: Iefba0e259d240171e973054c452c3c15bf3f8f8f Reviewed-on: https://go-review.googlesource.com/c/go/+/169960 Reviewed-by: Dmitry Vyukov Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/runtime/proc.go | 10 +++++----- src/runtime/race_amd64.s | 2 +- src/runtime/race_ppc64le.s | 2 +- src/runtime/runtime2.go | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 9e993afba9..78940625b8 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3956,12 +3956,12 @@ func procresize(nprocs int32) *p { pp.mcache = allocmcache() } } - if raceenabled && pp.racectx == 0 { + if raceenabled && pp.raceprocctx == 0 { if old == 0 && i == 0 { - pp.racectx = raceprocctx0 + pp.raceprocctx = raceprocctx0 raceprocctx0 = 0 // bootstrap } else { - pp.racectx = raceproccreate() + pp.raceprocctx = raceproccreate() } } } @@ -4019,8 +4019,8 @@ func procresize(nprocs int32) *p { gfpurge(p) traceProcFree(p) if raceenabled { - raceprocdestroy(p.racectx) - p.racectx = 0 + raceprocdestroy(p.raceprocctx) + p.raceprocctx = 0 } p.gcAssistTime = 0 p.status = _Pdead diff --git a/src/runtime/race_amd64.s b/src/runtime/race_amd64.s index 2a65b0faee..4ed9533bfb 100644 --- a/src/runtime/race_amd64.s +++ b/src/runtime/race_amd64.s @@ -398,7 +398,7 @@ TEXT runtime·racecallbackthunk(SB), NOSPLIT, $56-8 MOVQ g(RARG0), RARG0 MOVQ g_m(RARG0), RARG0 MOVQ m_p(RARG0), RARG0 - MOVQ p_racectx(RARG0), RARG0 + MOVQ p_raceprocctx(RARG0), RARG0 MOVQ RARG0, (RARG1) RET diff --git a/src/runtime/race_ppc64le.s b/src/runtime/race_ppc64le.s index 5c723e0f51..8aba786d3f 100644 --- a/src/runtime/race_ppc64le.s +++ b/src/runtime/race_ppc64le.s @@ -455,7 +455,7 @@ TEXT runtime·racecallbackthunk(SB), NOSPLIT, $-8 MOVD 0(R13)(R10*1), g MOVD g_m(g), R3 MOVD m_p(R3), R3 - MOVD p_racectx(R3), R3 + MOVD p_raceprocctx(R3), R3 MOVD R3, (R4) MOVD R9, g // restore R30 ?? RET diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index df9cbaef20..0dd2e929a0 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -482,7 +482,7 @@ type p struct { sysmontick sysmontick // last tick observed by sysmon m muintptr // back-link to associated m (nil if idle) mcache *mcache - racectx uintptr + raceprocctx uintptr deferpool [5][]*_defer // pool of available defer structs of different sizes (see panic.go) deferpoolbuf [5][32]*_defer -- GitLab From 2cc347382f4df3fb40d8d81ec9331f0748b1c394 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 28 Mar 2019 23:37:54 -0400 Subject: [PATCH 0646/1679] net/http/httputil: make ReverseProxy flush headers on FlushInterval A regression was introduced in CL 137335 (5440bfc) that caused FlushInterval to not be honored until the first Write() call was encountered. This change starts the flush timer as part of setting up the maxLatencyWriter. Fixes #31125 Fixes #31126 Change-Id: I75325bd926652922219bd1457b2b00ac6d0d41b0 Reviewed-on: https://go-review.googlesource.com/c/go/+/170066 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/httputil/reverseproxy.go | 5 +++ src/net/http/httputil/reverseproxy_test.go | 42 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/net/http/httputil/reverseproxy.go b/src/net/http/httputil/reverseproxy.go index 92d7f63af5..0e0731b08f 100644 --- a/src/net/http/httputil/reverseproxy.go +++ b/src/net/http/httputil/reverseproxy.go @@ -389,6 +389,11 @@ func (p *ReverseProxy) copyResponse(dst io.Writer, src io.Reader, flushInterval latency: flushInterval, } defer mlw.stop() + + // set up initial timer so headers get flushed even if body writes are delayed + mlw.flushPending = true + mlw.t = time.AfterFunc(flushInterval, mlw.delayedFlush) + dst = mlw } } diff --git a/src/net/http/httputil/reverseproxy_test.go b/src/net/http/httputil/reverseproxy_test.go index 5edefa08e5..367ba73ae2 100644 --- a/src/net/http/httputil/reverseproxy_test.go +++ b/src/net/http/httputil/reverseproxy_test.go @@ -9,6 +9,7 @@ package httputil import ( "bufio" "bytes" + "context" "errors" "fmt" "io" @@ -317,6 +318,47 @@ func TestReverseProxyFlushInterval(t *testing.T) { } } +func TestReverseProxyFlushIntervalHeaders(t *testing.T) { + const expected = "hi" + stopCh := make(chan struct{}) + backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add("MyHeader", expected) + w.WriteHeader(200) + w.(http.Flusher).Flush() + <-stopCh + })) + defer backend.Close() + defer close(stopCh) + + backendURL, err := url.Parse(backend.URL) + if err != nil { + t.Fatal(err) + } + + proxyHandler := NewSingleHostReverseProxy(backendURL) + proxyHandler.FlushInterval = time.Microsecond + + frontend := httptest.NewServer(proxyHandler) + defer frontend.Close() + + req, _ := http.NewRequest("GET", frontend.URL, nil) + req.Close = true + + ctx, cancel := context.WithTimeout(req.Context(), 10*time.Second) + defer cancel() + req = req.WithContext(ctx) + + res, err := frontend.Client().Do(req) + if err != nil { + t.Fatalf("Get: %v", err) + } + defer res.Body.Close() + + if res.Header.Get("MyHeader") != expected { + t.Errorf("got header %q; expected %q", res.Header.Get("MyHeader"), expected) + } +} + func TestReverseProxyCancelation(t *testing.T) { const backendResponse = "I am the backend" -- GitLab From 1d10b17589ce651caeb0841b2312065ee44f800d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 28 Mar 2019 13:11:53 +0100 Subject: [PATCH 0647/1679] cmd/link/ld,cmd/internal/obj,runtime: make the Android TLS offset dynamic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We're going to need a different TLS offset for Android Q, so the static offsets used for 386 and amd64 are no longer viable on Android. Introduce runtime·tls_g and use that for indexing into TLS storage. As an added benefit, we can then merge the TLS setup code for all android GOARCHs. While we're at it, remove a bunch of android special cases no longer needed. Updates #29674 Updates #29249 (perhaps fixes it) Change-Id: I77c7385aec7de8f1f6a4da7c9c79999157e39572 Reviewed-on: https://go-review.googlesource.com/c/go/+/169817 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/obj/x86/obj6.go | 22 ++++++--- src/cmd/link/internal/ld/data.go | 10 ++-- src/cmd/link/internal/ld/sym.go | 17 +------ src/runtime/asm_386.s | 17 ++++++- src/runtime/asm_amd64.s | 23 +++++++-- src/runtime/cgo/gcc_android.c | 35 ++++++++++++++ src/runtime/cgo/gcc_android_386.c | 67 --------------------------- src/runtime/cgo/gcc_android_amd64.c | 72 ----------------------------- src/runtime/cgo/gcc_android_arm.c | 42 ----------------- src/runtime/cgo/gcc_android_arm64.c | 42 ----------------- src/runtime/cgo/gcc_linux_386.c | 8 ++-- src/runtime/cgo/gcc_linux_amd64.c | 8 ++-- src/runtime/sys_linux_386.s | 8 +--- src/runtime/sys_linux_amd64.s | 6 +-- 14 files changed, 102 insertions(+), 275 deletions(-) delete mode 100644 src/runtime/cgo/gcc_android_386.c delete mode 100644 src/runtime/cgo/gcc_android_amd64.c delete mode 100644 src/runtime/cgo/gcc_android_arm.c delete mode 100644 src/runtime/cgo/gcc_android_arm64.c diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index a6931e8441..eb0e88b494 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -41,13 +41,8 @@ import ( func CanUse1InsnTLS(ctxt *obj.Link) bool { if isAndroid { - // For android, we use a disgusting hack that assumes - // the thread-local storage slot for g is allocated - // using pthread_key_create with a fixed offset - // (see src/runtime/cgo/gcc_android_amd64.c). - // This makes access to the TLS storage (for g) doable - // with 1 instruction. - return true + // Android uses a global variable for the tls offset. + return false } if ctxt.Arch.Family == sys.I386 { @@ -162,6 +157,18 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { } } + // Android uses a tls offset determined at runtime. Rewrite + // MOVQ TLS, BX + // to + // MOVQ runtime.tls_g(SB), BX + if isAndroid && (p.As == AMOVQ || p.As == AMOVL) && p.From.Type == obj.TYPE_REG && p.From.Reg == REG_TLS && p.To.Type == obj.TYPE_REG && REG_AX <= p.To.Reg && p.To.Reg <= REG_R15 { + p.From.Type = obj.TYPE_MEM + p.From.Name = obj.NAME_EXTERN + p.From.Reg = REG_NONE + p.From.Sym = ctxt.Lookup("runtime.tls_g") + p.From.Index = REG_NONE + } + // TODO: Remove. if ctxt.Headtype == objabi.Hwindows && ctxt.Arch.Family == sys.AMD64 || ctxt.Headtype == objabi.Hplan9 { if p.From.Scale == 1 && p.From.Index == REG_TLS { @@ -1007,6 +1014,7 @@ func load_g_cx(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) *obj.Prog { progedit(ctxt, p, newprog) for p.Link != next { p = p.Link + progedit(ctxt, p, newprog) } if p.From.Index == REG_TLS { diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index da75ce8dc4..e421caabce 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -218,9 +218,7 @@ func relocsym(ctxt *Link, s *sym.Symbol) { Errorf(s, "unknown reloc to %v: %d (%s)", r.Sym.Name, r.Type, sym.RelocName(ctxt.Arch, r.Type)) } case objabi.R_TLS_LE: - isAndroidX86 := objabi.GOOS == "android" && (ctxt.Arch.InFamily(sys.AMD64, sys.I386)) - - if ctxt.LinkMode == LinkExternal && ctxt.IsELF && !isAndroidX86 { + if ctxt.LinkMode == LinkExternal && ctxt.IsELF { r.Done = false if r.Sym == nil { r.Sym = ctxt.Tlsg @@ -243,7 +241,7 @@ func relocsym(ctxt *Link, s *sym.Symbol) { // related to the fact that our own TLS storage happens // to take up 8 bytes. o = 8 + r.Sym.Value - } else if ctxt.IsELF || ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hdarwin || isAndroidX86 { + } else if ctxt.IsELF || ctxt.HeadType == objabi.Hplan9 || ctxt.HeadType == objabi.Hdarwin { o = int64(ctxt.Tlsoffset) + r.Add } else if ctxt.HeadType == objabi.Hwindows { o = r.Add @@ -251,9 +249,7 @@ func relocsym(ctxt *Link, s *sym.Symbol) { log.Fatalf("unexpected R_TLS_LE relocation for %v", ctxt.HeadType) } case objabi.R_TLS_IE: - isAndroidX86 := objabi.GOOS == "android" && (ctxt.Arch.InFamily(sys.AMD64, sys.I386)) - - if ctxt.LinkMode == LinkExternal && ctxt.IsELF && !isAndroidX86 { + if ctxt.LinkMode == LinkExternal && ctxt.IsELF { r.Done = false if r.Sym == nil { r.Sym = ctxt.Tlsg diff --git a/src/cmd/link/internal/ld/sym.go b/src/cmd/link/internal/ld/sym.go index a487b5e5f6..bf7a56aff2 100644 --- a/src/cmd/link/internal/ld/sym.go +++ b/src/cmd/link/internal/ld/sym.go @@ -61,6 +61,7 @@ func linknew(arch *sys.Arch) *Link { } // computeTLSOffset records the thread-local storage offset. +// Not used for Android where the TLS offset is determined at runtime. func (ctxt *Link) computeTLSOffset() { switch ctxt.HeadType { default: @@ -80,21 +81,7 @@ func (ctxt *Link) computeTLSOffset() { objabi.Hopenbsd, objabi.Hdragonfly, objabi.Hsolaris: - if objabi.GOOS == "android" { - switch ctxt.Arch.Family { - case sys.AMD64: - // Android/amd64 constant - offset from 0(FS) to our TLS slot. - // Explained in src/runtime/cgo/gcc_android_*.c - ctxt.Tlsoffset = 0x1d0 - case sys.I386: - // Android/386 constant - offset from 0(GS) to our TLS slot. - ctxt.Tlsoffset = 0xf8 - default: - ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize - } - } else { - ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize - } + ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize case objabi.Hnacl: switch ctxt.Arch.Family { diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 8805dbf7d6..8995436184 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -171,9 +171,18 @@ nocpuinfo: MOVL _cgo_init(SB), AX TESTL AX, AX JZ needtls +#ifdef GOOS_android + MOVL 0(TLS), BX + MOVL BX, 12(SP) // arg 4: TLS base, stored in the first slot (TLS_SLOT_SELF). + MOVL $runtime·tls_g(SB), 8(SP) // arg 3: &tls_g +#else + MOVL $0, BX + MOVL BX, 12(SP) // arg 3,4: not used when using platform's TLS + MOVL BX, 8(SP) +#endif MOVL $setg_gcc<>(SB), BX - MOVL BX, 4(SP) - MOVL BP, 0(SP) + MOVL BX, 4(SP) // arg 2: setg_gcc + MOVL BP, 0(SP) // arg 1: g0 CALL AX // update stackguard after _cgo_init @@ -1553,3 +1562,7 @@ TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 MOVL AX, lo+4(FP) MOVL CX, y+8(FP) JMP runtime·goPanicExtendSlice3CU(SB) + +#ifdef GOOS_android +GLOBL runtime·tls_g+0(SB), NOPTR, $4 +#endif diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index d3e5c54378..149b04dfdf 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -132,9 +132,22 @@ nocpuinfo: MOVQ _cgo_init(SB), AX TESTQ AX, AX JZ needtls - // g0 already in DI - MOVQ DI, CX // Win64 uses CX for first parameter - MOVQ $setg_gcc<>(SB), SI + // arg 1: g0, already in DI + MOVQ $setg_gcc<>(SB), SI // arg 2: setg_gcc +#ifdef GOOS_android + MOVQ $runtime·tls_g(SB), DX // arg 3: &tls_g + MOVQ 0(TLS), CX // arg 4: TLS base, stored in the first slot (TLS_SLOT_SELF). +#else + MOVQ $0, DX // arg 3, 4: not used when using platform's TLS + MOVQ $0, CX +#endif +#ifdef GOOS_windows + // Adjust for the Win64 calling convention. + MOVQ CX, R9 // arg 4 + MOVQ DX, R8 // arg 3 + MOVQ SI, DX // arg 2 + MOVQ DI, CX // arg 1 +#endif CALL AX // update stackguard after _cgo_init @@ -1698,3 +1711,7 @@ TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 MOVQ AX, x+0(FP) MOVQ CX, y+8(FP) JMP runtime·goPanicSlice3CU(SB) + +#ifdef GOOS_android +GLOBL runtime·tls_g+0(SB), NOPTR, $8 +#endif diff --git a/src/runtime/cgo/gcc_android.c b/src/runtime/cgo/gcc_android.c index b756edefa9..44bd550a7c 100644 --- a/src/runtime/cgo/gcc_android.c +++ b/src/runtime/cgo/gcc_android.c @@ -4,6 +4,7 @@ #include #include +#include #include "libcgo.h" void @@ -29,3 +30,37 @@ fatalf(const char* format, ...) abort(); } + +// Truncated to a different magic value on 32-bit; that's ok. +#define magic1 (0x23581321345589ULL) + +// inittls allocates a thread-local storage slot for g. +// +// It finds the first available slot using pthread_key_create and uses +// it as the offset value for runtime.tls_g. +static void +inittls(void **tlsg, void **tlsbase) +{ + pthread_key_t k; + int i, err; + + err = pthread_key_create(&k, nil); + if(err != 0) { + fatalf("pthread_key_create failed: %d", err); + } + pthread_setspecific(k, (void*)magic1); + // If thread local slots are laid out as we expect, our magic word will + // be located at some low offset from tlsbase. However, just in case something went + // wrong, the search is limited to sensible offsets. PTHREAD_KEYS_MAX was the + // original limit, but issue 19472 made a higher limit necessary. + for (i=0; i<384; i++) { + if (*(tlsbase+i) == (void*)magic1) { + *tlsg = (void*)(i*sizeof(void *)); + pthread_setspecific(k, 0); + return; + } + } + fatalf("could not find pthread key"); +} + +void (*x_cgo_inittls)(void **tlsg, void **tlsbase) = inittls; diff --git a/src/runtime/cgo/gcc_android_386.c b/src/runtime/cgo/gcc_android_386.c deleted file mode 100644 index d31b37e2f3..0000000000 --- a/src/runtime/cgo/gcc_android_386.c +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 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. - -#include /* for strerror */ -#include -#include -#include "libcgo.h" - -#define magic1 (0x23581321U) - -static void -inittls(void) -{ - uint32 x; - pthread_key_t tofree[128], k; - int i, ntofree; - - /* - * Same logic, code as gcc_android_amd64.c:/inittls. - * Note that this is a temporary hack that should be fixed soon. - * - * TODO: fix this. - * - * The linker and runtime hard-code this constant offset - * from %gs where we expect to find g. Disgusting. - * - * Known to src/cmd/link/internal/ld/sym.go:/0xf8 - * and to src/runtime/sys_linux_386.s:/0xf8 or /GOOS_android. - * TODO(hyangah): check 0xb0 works with API23+ - * - * As disgusting as on the darwin/386, darwin/amd64. - */ - ntofree = 0; - for(;;) { - if(pthread_key_create(&k, nil) != 0) { - fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); - abort(); - } - pthread_setspecific(k, (void*)magic1); - asm volatile("movl %%gs:0xf8, %0" : "=r"(x)); - pthread_setspecific(k, 0); - if (x == magic1) { - break; - } - if(ntofree >= nelem(tofree)) { - fprintf(stderr, "runtime/cgo: could not obtain pthread_keys\n"); - fprintf(stderr, "\ttried"); - for(i=0; i /* for strerror */ -#include -#include -#include "libcgo.h" - -#define magic1 (0x23581321345589ULL) - -static void -inittls(void) -{ - uint64 x; - pthread_key_t tofree[128], k; - int i, ntofree; - - /* - * Same logic, code as gcc_darwin_386.c:/inittls. - * Note that this is a temporary hack that should be fixed soon. - * Android-L and M bionic's pthread implementation differ - * significantly, and can change any time. - * https://android-review.googlesource.com/#/c/134202 - * - * We chose %fs:0x1d0 which seems to work in testing with Android - * emulators (API22, API23) but it may break any time. - * - * TODO: fix this. - * - * The linker and runtime hard-code this constant offset - * from %fs where we expect to find g. Disgusting. - * - * Known to src/cmd/link/internal/ld/sym.go:/0x1d0 - * and to src/runtime/sys_linux_amd64.s:/0x1d0 or /GOOS_android. - * - * As disgusting as on the darwin/386, darwin/amd64. - */ - ntofree = 0; - for(;;) { - if(pthread_key_create(&k, nil) != 0) { - fprintf(stderr, "runtime/cgo: pthread_key_create failed\n"); - abort(); - } - pthread_setspecific(k, (void*)magic1); - asm volatile("movq %%fs:0x1d0, %0" : "=r"(x)); - pthread_setspecific(k, 0); - if(x == magic1) { - break; - } - if(ntofree >= nelem(tofree)) { - fprintf(stderr, "runtime/cgo: could not obtain pthread_keys\n"); - fprintf(stderr, "\ttried"); - for(i=0; i -#include -#include -#include -#include "libcgo.h" - -#define magic1 (0x23581321U) - -// inittls allocates a thread-local storage slot for g. -// -// It finds the first available slot using pthread_key_create and uses -// it as the offset value for runtime.tlsg. -static void -inittls(void **tlsg, void **tlsbase) -{ - pthread_key_t k; - int i, err; - - err = pthread_key_create(&k, nil); - if(err != 0) { - fatalf("pthread_key_create failed: %d", err); - } - pthread_setspecific(k, (void*)magic1); - // If thread local slots are laid out as we expect, our magic word will - // be located at some low offset from tlsbase. However, just in case something went - // wrong, the search is limited to sensible offsets. PTHREAD_KEYS_MAX was the - // original limit, but issue 19472 made a higher limit necessary. - for (i=0; i<384; i++) { - if (*(tlsbase+i) == (void*)magic1) { - *tlsg = (void*)(i*sizeof(void *)); - pthread_setspecific(k, 0); - return; - } - } - fatalf("could not find pthread key"); -} - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase) = inittls; diff --git a/src/runtime/cgo/gcc_android_arm64.c b/src/runtime/cgo/gcc_android_arm64.c deleted file mode 100644 index 499a11f738..0000000000 --- a/src/runtime/cgo/gcc_android_arm64.c +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 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. - -#include -#include -#include -#include -#include "libcgo.h" - -#define magic1 (0x23581321345589ULL) - -// inittls allocates a thread-local storage slot for g. -// -// It finds the first available slot using pthread_key_create and uses -// it as the offset value for runtime.tlsg. -static void -inittls(void **tlsg, void **tlsbase) -{ - pthread_key_t k; - int i, err; - - err = pthread_key_create(&k, nil); - if(err != 0) { - fatalf("pthread_key_create failed: %d", err); - } - pthread_setspecific(k, (void*)magic1); - // If thread local slots are laid out as we expect, our magic word will - // be located at some low offset from tlsbase. However, just in case something went - // wrong, the search is limited to sensible offsets. PTHREAD_KEYS_MAX was the - // original limit, but issue 19472 made a higher limit necessary. - for (i=0; i<384; i++) { - if (*(tlsbase+i) == (void*)magic1) { - *tlsg = (void*)(i*sizeof(void *)); - pthread_setspecific(k, 0); - return; - } - } - fatalf("could not find pthread key"); -} - -void (*x_cgo_inittls)(void **tlsg, void **tlsbase) = inittls; diff --git a/src/runtime/cgo/gcc_linux_386.c b/src/runtime/cgo/gcc_linux_386.c index 9156b056ff..ece9f933c5 100644 --- a/src/runtime/cgo/gcc_linux_386.c +++ b/src/runtime/cgo/gcc_linux_386.c @@ -11,11 +11,11 @@ static void *threadentry(void*); static void (*setg_gcc)(void*); -// This will be set in gcc_android_386.c for android-specific customization. -void (*x_cgo_inittls)(void); +// This will be set in gcc_android.c for android-specific customization. +void (*x_cgo_inittls)(void **tlsg, void **tlsbase); void -x_cgo_init(G *g, void (*setg)(void*)) +x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) { pthread_attr_t attr; size_t size; @@ -27,7 +27,7 @@ x_cgo_init(G *g, void (*setg)(void*)) pthread_attr_destroy(&attr); if (x_cgo_inittls) { - x_cgo_inittls(); + x_cgo_inittls(tlsg, tlsbase); } } diff --git a/src/runtime/cgo/gcc_linux_amd64.c b/src/runtime/cgo/gcc_linux_amd64.c index e899447844..9134e0df92 100644 --- a/src/runtime/cgo/gcc_linux_amd64.c +++ b/src/runtime/cgo/gcc_linux_amd64.c @@ -13,11 +13,11 @@ static void* threadentry(void*); static void (*setg_gcc)(void*); -// This will be set in gcc_android_amd64.c for android-specific customization. -void (*x_cgo_inittls)(void); +// This will be set in gcc_android.c for android-specific customization. +void (*x_cgo_inittls)(void **tlsg, void **tlsbase); void -x_cgo_init(G* g, void (*setg)(void*)) +x_cgo_init(G *g, void (*setg)(void*), void **tlsg, void **tlsbase) { pthread_attr_t *attr; size_t size; @@ -49,7 +49,7 @@ x_cgo_init(G* g, void (*setg)(void*)) free(attr); if (x_cgo_inittls) { - x_cgo_inittls(); + x_cgo_inittls(tlsg, tlsbase); } } diff --git a/src/runtime/sys_linux_386.s b/src/runtime/sys_linux_386.s index 40b55a67eb..8c791b3004 100644 --- a/src/runtime/sys_linux_386.s +++ b/src/runtime/sys_linux_386.s @@ -575,12 +575,8 @@ TEXT runtime·setldt(SB),NOSPLIT,$32 MOVL address+4(FP), DX // base address #ifdef GOOS_android - /* - * Same as in sys_darwin_386.s:/ugliness, different constant. - * address currently holds m->tls, which must be %gs:0xf8. - * See cgo/gcc_android_386.c for the derivation of the constant. - */ - SUBL $0xf8, DX + // Android stores the TLS offset in runtime·tls_g. + SUBL runtime·tls_g(SB), DX MOVL DX, 0(DX) #else /* diff --git a/src/runtime/sys_linux_amd64.s b/src/runtime/sys_linux_amd64.s index b709f77060..5c300f553d 100644 --- a/src/runtime/sys_linux_amd64.s +++ b/src/runtime/sys_linux_amd64.s @@ -605,10 +605,8 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 // set tls base to DI TEXT runtime·settls(SB),NOSPLIT,$32 #ifdef GOOS_android - // Same as in sys_darwin_386.s:/ugliness, different constant. - // DI currently holds m->tls, which must be fs:0x1d0. - // See cgo/gcc_android_amd64.c for the derivation of the constant. - SUBQ $0x1d0, DI // In android, the tls base + // Android stores the TLS offset in runtime·tls_g. + SUBQ runtime·tls_g(SB), DI #else ADDQ $8, DI // ELF wants to use -8(FS) #endif -- GitLab From 95f18757a0fa283c4237ca03b48049980fe9b9c3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 29 Mar 2019 12:13:02 +0100 Subject: [PATCH 0648/1679] runtime/cgo: use free TLS slot on Android Q Android assumes pthread tls keys correspond to some offset from the TLS base. This is about to change in a future version of Android. Fortunately, Android Q leaves a slot open for use to use, TLS_SLOT_APP. Fixes #29674 Change-Id: Id6ba19afacdfed9b262453714715435e2544185f Reviewed-on: https://go-review.googlesource.com/c/go/+/170117 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: Ian Lance Taylor --- src/runtime/cgo/gcc_android.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/runtime/cgo/gcc_android.c b/src/runtime/cgo/gcc_android.c index 44bd550a7c..a626cd0681 100644 --- a/src/runtime/cgo/gcc_android.c +++ b/src/runtime/cgo/gcc_android.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "libcgo.h" void @@ -34,6 +35,9 @@ fatalf(const char* format, ...) // Truncated to a different magic value on 32-bit; that's ok. #define magic1 (0x23581321345589ULL) +// From https://android.googlesource.com/platform/bionic/+/refs/heads/master/libc/private/bionic_asm_tls.h#69. +#define TLS_SLOT_APP 2 + // inittls allocates a thread-local storage slot for g. // // It finds the first available slot using pthread_key_create and uses @@ -43,6 +47,22 @@ inittls(void **tlsg, void **tlsbase) { pthread_key_t k; int i, err; + void *handle, *get_ver; + + // Check for Android Q where we can use the free TLS_SLOT_APP slot. + handle = dlopen(NULL, RTLD_LAZY); + if (handle == NULL) { + fatalf("inittls: failed to dlopen main program"); + return; + } + // android_get_device_api_level is introduced in Android Q, so its mere presence + // is enough. + get_ver = dlsym(handle, "android_get_device_api_level"); + dlclose(handle); + if (get_ver != NULL) { + *tlsg = (void *)(TLS_SLOT_APP*sizeof(void *)); + return; + } err = pthread_key_create(&k, nil); if(err != 0) { @@ -60,7 +80,7 @@ inittls(void **tlsg, void **tlsbase) return; } } - fatalf("could not find pthread key"); + fatalf("inittls: could not find pthread key"); } void (*x_cgo_inittls)(void **tlsg, void **tlsbase) = inittls; -- GitLab From 6966b67510df9a96dd798e5f6e26c5ad6dd925a5 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 7 Mar 2019 13:18:38 +0000 Subject: [PATCH 0649/1679] cmd/asm: add 'insert program mask' instruction for s390x This CL adds the 'insert program mask' (IPM) instruction to s390x. IPM stores the current program mask (which contains the condition code) into a general purpose register. This instruction will be useful when implementing intrinsics for the arithmetic functions in the math/bits package. We can also potentially use it to convert some condition codes into bool values. The condition code can be saved and restored using an instruction sequence such as: IPM R4 // save condition code to R4 ... TMLH R4, $0x3000 // restore condition code from R4 We can also use IPM to save the carry bit to a register using an instruction sequence such as: IPM R4 // save condition code to R4 RISBLGZ $31, $31, $3, R4, R4 // isolate carry bit in R4 Change-Id: I169d450b6ea1a7ff8c0286115ddc42618da8a2f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/165997 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/asm/internal/asm/testdata/s390x.s | 3 +++ src/cmd/internal/obj/s390x/a.out.go | 3 +++ src/cmd/internal/obj/s390x/anames.go | 1 + src/cmd/internal/obj/s390x/asmz.go | 6 ++++++ 4 files changed, 13 insertions(+) diff --git a/src/cmd/asm/internal/asm/testdata/s390x.s b/src/cmd/asm/internal/asm/testdata/s390x.s index 0e50303d70..fbe1203aaa 100644 --- a/src/cmd/asm/internal/asm/testdata/s390x.s +++ b/src/cmd/asm/internal/asm/testdata/s390x.s @@ -219,6 +219,9 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16- TMLH R3, $0 // a7300000 TMLL R4, $32768 // a7418000 + IPM R3 // b2220030 + IPM R12 // b22200c0 + BNE 0(PC) // a7740000 BEQ 0(PC) // a7840000 BLT 0(PC) // a7440000 diff --git a/src/cmd/internal/obj/s390x/a.out.go b/src/cmd/internal/obj/s390x/a.out.go index af321f6131..fb246cbc47 100644 --- a/src/cmd/internal/obj/s390x/a.out.go +++ b/src/cmd/internal/obj/s390x/a.out.go @@ -366,6 +366,9 @@ const ( ATMLH ATMLL + // insert program mask + AIPM + // compare and swap ACS ACSG diff --git a/src/cmd/internal/obj/s390x/anames.go b/src/cmd/internal/obj/s390x/anames.go index 9cea9f962d..3a21e90ab1 100644 --- a/src/cmd/internal/obj/s390x/anames.go +++ b/src/cmd/internal/obj/s390x/anames.go @@ -120,6 +120,7 @@ var Anames = []string{ "TMHL", "TMLH", "TMLL", + "IPM", "CS", "CSG", "SYNC", diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 7d49103be6..4c938eadcc 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -260,6 +260,9 @@ var optab = []Optab{ // test under mask Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91, 0}, + // insert program mask + Optab{AIPM, C_REG, C_NONE, C_NONE, C_NONE, 92, 0}, + // 32-bit access registers Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, @@ -3766,6 +3769,9 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { } zRI(opcode, uint32(p.From.Reg), uint32(c.vregoff(&p.To)), asm) + case 92: // insert program mask + zRRE(op_IPM, uint32(p.From.Reg), 0, asm) + case 93: // GOT lookup v := c.vregoff(&p.To) if v != 0 { -- GitLab From c90f6dd4966087d85e1dcafc02b64ecb0c7f4e7e Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Thu, 28 Mar 2019 00:53:19 +1100 Subject: [PATCH 0650/1679] cmd/link: permit duplicate weak symbols Permit weak symbols to be duplicates - most external linkers allow this and there are various situations where they can occur (including retpoline and retguard). Fixes #29563 Change-Id: I355493c847fbc8f670a85a643db65a4cf8f9883d Reviewed-on: https://go-review.googlesource.com/c/go/+/169658 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/testdata/issue29563.go | 12 ++++++++++++ misc/cgo/test/testdata/issue29563/weak.go | 13 +++++++++++++ misc/cgo/test/testdata/issue29563/weak1.c | 11 +++++++++++ misc/cgo/test/testdata/issue29563/weak2.c | 11 +++++++++++ src/cmd/link/internal/loadelf/ldelf.go | 5 +++++ 5 files changed, 52 insertions(+) create mode 100644 misc/cgo/test/testdata/issue29563.go create mode 100644 misc/cgo/test/testdata/issue29563/weak.go create mode 100644 misc/cgo/test/testdata/issue29563/weak1.c create mode 100644 misc/cgo/test/testdata/issue29563/weak2.c diff --git a/misc/cgo/test/testdata/issue29563.go b/misc/cgo/test/testdata/issue29563.go new file mode 100644 index 0000000000..84def3ca44 --- /dev/null +++ b/misc/cgo/test/testdata/issue29563.go @@ -0,0 +1,12 @@ +// Copyright 2019 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. + +// +build !windows + +// Issue 29563: internal linker fails on duplicate weak symbols. +// No runtime test; just make sure it compiles. + +package cgotest + +import _ "cgotest/issue29563" diff --git a/misc/cgo/test/testdata/issue29563/weak.go b/misc/cgo/test/testdata/issue29563/weak.go new file mode 100644 index 0000000000..21cf635cca --- /dev/null +++ b/misc/cgo/test/testdata/issue29563/weak.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 issue29563 + +//int foo1(); +//int foo2(); +import "C" + +func Bar() int { + return int(C.foo1()) + int(C.foo2()) +} diff --git a/misc/cgo/test/testdata/issue29563/weak1.c b/misc/cgo/test/testdata/issue29563/weak1.c new file mode 100644 index 0000000000..86a22734ad --- /dev/null +++ b/misc/cgo/test/testdata/issue29563/weak1.c @@ -0,0 +1,11 @@ +// Copyright 2019 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. + +extern int weaksym __attribute__((__weak__)); +int weaksym = 42; + +int foo1() +{ + return weaksym; +} diff --git a/misc/cgo/test/testdata/issue29563/weak2.c b/misc/cgo/test/testdata/issue29563/weak2.c new file mode 100644 index 0000000000..e01eae8b58 --- /dev/null +++ b/misc/cgo/test/testdata/issue29563/weak2.c @@ -0,0 +1,11 @@ +// Copyright 2019 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. + +extern int weaksym __attribute__((__weak__)); +int weaksym = 42; + +int foo2() +{ + return weaksym; +} diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index d85d91948a..916b7cf9f2 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -1088,6 +1088,11 @@ func readelfsym(arch *sys.Arch, syms *sym.Symbols, elfobj *ElfObj, i int, elfsym if elfsym.other == 2 { s.Attr |= sym.AttrVisibilityHidden } + + // Allow weak symbols to be duplicated when already defined. + if s.Outer != nil { + s.Attr |= sym.AttrDuplicateOK + } } default: -- GitLab From d8f60eea64a568b272222960eb253bfc08cfbac2 Mon Sep 17 00:00:00 2001 From: David Chase Date: Wed, 19 Sep 2018 16:20:35 -0400 Subject: [PATCH 0651/1679] cmd/compile: enhance induction variable detection for unrolled loops MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Would suggest extending capabilities (32-bit, unsigned, etc) in separate CLs because prove bugs are so mystifying. This implements the suggestion in this comment https://go-review.googlesource.com/c/go/+/104041/10/src/cmd/compile/internal/ssa/loopbce.go#164 for inferring properly bounded iteration for loops of the form for i := K0; i < KNN-(K-1); i += K for i := K0; i <= KNN-K; i += K Where KNN is "known non negative" (i.e., len or cap) and K is also not negative. Because i <= KNN-K, i+K <= KNN and no overflow occurs. Also handles decreasing case (K1 > 0) for i := KNN; i >= K0; i -= K1 which works when MININT+K1 < K0 (i.e. MININT < K0-K1, no overflow) Signed only, also only 64 bit for now. Change-Id: I5da6015aba2f781ec76c4ad59c9c48d952325fdc Reviewed-on: https://go-review.googlesource.com/c/go/+/136375 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Alexandru Moșoi --- src/cmd/compile/internal/ssa/loopbce.go | 98 +++++++++++++++++++- test/prove.go | 117 ++++++++++++++++++++++++ 2 files changed, 211 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/ssa/loopbce.go b/src/cmd/compile/internal/ssa/loopbce.go index 8ab1a0c695..5f02643ccd 100644 --- a/src/cmd/compile/internal/ssa/loopbce.go +++ b/src/cmd/compile/internal/ssa/loopbce.go @@ -4,7 +4,10 @@ package ssa -import "fmt" +import ( + "fmt" + "math" +) type indVarFlags uint8 @@ -59,6 +62,7 @@ func findIndVar(f *Func) []indVar { // Check thet the control if it either ind />= ind. // TODO: Handle 32-bit comparisons. + // TODO: Handle unsigned comparisons? switch b.Control.Op { case OpLeq64: flags |= indVarMaxInc @@ -165,15 +169,101 @@ func findIndVar(f *Func) []indVar { continue } - // We can only guarantee that the loops runs within limits of induction variable - // if the increment is ±1 or when the limits are constants. - if step != 1 { + // We can only guarantee that the loop runs within limits of induction variable + // if (one of) + // (1) the increment is ±1 + // (2) the limits are constants + // (3) loop is of the form k0 upto Known_not_negative-k inclusive, step <= k + // (4) loop is of the form k0 upto Known_not_negative-k exclusive, step <= k+1 + // (5) loop is of the form Known_not_negative downto k0, minint+step < k0 + if step > 1 { ok := false if min.Op == OpConst64 && max.Op == OpConst64 { if max.AuxInt > min.AuxInt && max.AuxInt%step == min.AuxInt%step { // handle overflow ok = true } } + // Handle induction variables of these forms. + // KNN is known-not-negative. + // SIGNED ARITHMETIC ONLY. (see switch on b.Control.Op above) + // Possibilitis for KNN are len and cap; perhaps we can infer others. + // for i := 0; i <= KNN-k ; i += k + // for i := 0; i < KNN-(k-1); i += k + // Also handle decreasing. + + // "Proof" copied from https://go-review.googlesource.com/c/go/+/104041/10/src/cmd/compile/internal/ssa/loopbce.go#164 + // + // In the case of + // // PC is Positive Constant + // L := len(A)-PC + // for i := 0; i < L; i = i+PC + // + // we know: + // + // 0 + PC does not over/underflow. + // len(A)-PC does not over/underflow + // maximum value for L is MaxInt-PC + // i < L <= MaxInt-PC means i + PC < MaxInt hence no overflow. + + // To match in SSA: + // if (a) min.Op == OpConst64(k0) + // and (b) k0 >= MININT + step + // and (c) max.Op == OpSubtract(Op{StringLen,SliceLen,SliceCap}, k) + // or (c) max.Op == OpAdd(Op{StringLen,SliceLen,SliceCap}, -k) + // or (c) max.Op == Op{StringLen,SliceLen,SliceCap} + // and (d) if upto loop, require indVarMaxInc && step <= k or !indVarMaxInc && step-1 <= k + + if min.Op == OpConst64 && min.AuxInt >= step+math.MinInt64 { + knn := max + k := int64(0) + var kArg *Value + + switch max.Op { + case OpSub64: + knn = max.Args[0] + kArg = max.Args[1] + + case OpAdd64: + knn = max.Args[0] + kArg = max.Args[1] + if knn.Op == OpConst64 { + knn, kArg = kArg, knn + } + } + switch knn.Op { + case OpSliceLen, OpStringLen, OpSliceCap: + default: + knn = nil + } + + if kArg != nil && kArg.Op == OpConst64 { + k = kArg.AuxInt + if max.Op == OpAdd64 { + k = -k + } + } + if k >= 0 && knn != nil { + if inc.AuxInt > 0 { // increasing iteration + // The concern for the relation between step and k is to ensure that iv never exceeds knn + // i.e., iv < knn-(K-1) ==> iv + K <= knn; iv <= knn-K ==> iv +K < knn + if step <= k || flags&indVarMaxInc == 0 && step-1 == k { + ok = true + } + } else { // decreasing iteration + // Will be decrementing from max towards min; max is knn-k; will only attempt decrement if + // knn-k >[=] min; underflow is only a concern if min-step is not smaller than min. + // This all assumes signed integer arithmetic + // This is already assured by the test above: min.AuxInt >= step+math.MinInt64 + ok = true + } + } + } + + // TODO: other unrolling idioms + // for i := 0; i < KNN - KNN % k ; i += k + // for i := 0; i < KNN&^(k-1) ; i += k // k a power of 2 + // for i := 0; i < KNN&(-k) ; i += k // k a power of 2 + if !ok { continue } diff --git a/test/prove.go b/test/prove.go index 275528dde7..39b23c5e0a 100644 --- a/test/prove.go +++ b/test/prove.go @@ -726,6 +726,123 @@ func signHint2(b []byte, n int) { } } +// Induction variable in unrolled loop. +func unrollUpExcl(a []int) int { + var i, x int + for i = 0; i < len(a)-1; i += 2 { // ERROR "Induction variable: limits \[0,\?\), increment 2$" + x += a[i] // ERROR "Proved IsInBounds$" + x += a[i+1] + } + if i == len(a)-1 { + x += a[i] + } + return x +} + +// Induction variable in unrolled loop. +func unrollUpIncl(a []int) int { + var i, x int + for i = 0; i <= len(a)-2; i += 2 { // ERROR "Induction variable: limits \[0,\?\], increment 2$" + x += a[i] + x += a[i+1] + } + if i == len(a)-1 { + x += a[i] + } + return x +} + +// Induction variable in unrolled loop. +func unrollDownExcl0(a []int) int { + var i, x int + for i = len(a) - 1; i > 0; i -= 2 { // ERROR "Induction variable: limits \(0,\?\], increment 2$" + x += a[i] // ERROR "Proved IsInBounds$" + x += a[i-1] // ERROR "Proved IsInBounds$" + } + if i == 0 { + x += a[i] + } + return x +} + +// Induction variable in unrolled loop. +func unrollDownExcl1(a []int) int { + var i, x int + for i = len(a) - 1; i >= 1; i -= 2 { // ERROR "Induction variable: limits \[1,\?\], increment 2$" + x += a[i] // ERROR "Proved IsInBounds$" + x += a[i-1] // ERROR "Proved IsInBounds$" + } + if i == 0 { + x += a[i] + } + return x +} + +// Induction variable in unrolled loop. +func unrollDownInclStep(a []int) int { + var i, x int + for i = len(a); i >= 2; i -= 2 { // ERROR "Induction variable: limits \[2,\?\], increment 2$" + x += a[i-1] // ERROR "Proved IsInBounds$" + x += a[i-2] + } + if i == 1 { + x += a[i-1] + } + return x +} + +// Not an induction variable (step too large) +func unrollExclStepTooLarge(a []int) int { + var i, x int + for i = 0; i < len(a)-1; i += 3 { + x += a[i] + x += a[i+1] + } + if i == len(a)-1 { + x += a[i] + } + return x +} + +// Not an induction variable (step too large) +func unrollInclStepTooLarge(a []int) int { + var i, x int + for i = 0; i <= len(a)-2; i += 3 { + x += a[i] + x += a[i+1] + } + if i == len(a)-1 { + x += a[i] + } + return x +} + +// Not an induction variable (min too small, iterating down) +func unrollDecMin(a []int) int { + var i, x int + for i = len(a); i >= math.MinInt64; i -= 2 { + x += a[i-1] + x += a[i-2] + } + if i == 1 { // ERROR "Disproved Eq64$" + x += a[i-1] + } + return x +} + +// Not an induction variable (min too small, iterating up -- perhaps could allow, but why bother?) +func unrollIncMin(a []int) int { + var i, x int + for i = len(a); i >= math.MinInt64; i += 2 { + x += a[i-1] + x += a[i-2] + } + if i == 1 { // ERROR "Disproved Eq64$" + x += a[i-1] + } + return x +} + //go:noinline func useInt(a int) { } -- GitLab From ee780d4a780be9d8517583bb7c3598c834b6f775 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Tue, 26 Mar 2019 20:21:21 -0400 Subject: [PATCH 0652/1679] cmd/go: clarify error when package is removed in a module If no module in the build list provides an imported package, we try to upgrade to the "@latest" version. If there is a requirement on a version of the module which is newer than the "@latest" version (e.g., a prerelease or pseudoversion), we cannot upgrade further. We previously reported "looping trying to add package" when we saw the package in "@latest" but it was removed later. The meaning of this is unclear for users, so with this change, we explain the package was removed. Fixes #30394 Change-Id: I1b7fec2c37e762fb600e66ee8a4df4aeaf13e67a Reviewed-on: https://go-review.googlesource.com/c/go/+/169720 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/import.go | 17 ++++++++++++++++- src/cmd/go/internal/modload/load.go | 3 +++ .../mod/example.com_missingpkg_v1.0.0.txt | 11 +++++++++++ .../mod/example.com_missingpkg_v1.0.1-beta.txt | 8 ++++++++ .../mod/example.com_usemissingpre_v1.0.0.txt | 13 +++++++++++++ .../script/mod_missingpkg_prerelease.txt | 12 ++++++++++++ 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt create mode 100644 src/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt create mode 100644 src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 83ef0e0b4f..305e0ddb75 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -28,6 +28,10 @@ import ( type ImportMissingError struct { ImportPath string Module module.Version + + // newMissingVersion is set to a newer version of Module if one is present + // in the build list. When set, we can't automatically upgrade. + newMissingVersion string } func (e *ImportMissingError) Error() string { @@ -189,7 +193,18 @@ func Import(path string) (m module.Version, dir string, err error) { } return module.Version{}, "", &ImportMissingError{ImportPath: path} } - return m, "", &ImportMissingError{ImportPath: path, Module: m} + newMissingVersion := "" + for _, bm := range buildList { + if bm.Path == m.Path && semver.Compare(bm.Version, m.Version) > 0 { + // This typically happens when a package is present at the "@latest" + // version (e.g., v1.0.0) of a module, but we have a newer version + // of the same module in the build list (e.g., v1.0.1-beta), and + // the package is not present there. + newMissingVersion = bm.Version + break + } + } + return m, "", &ImportMissingError{ImportPath: path, Module: m, newMissingVersion: newMissingVersion} } // maybeInModule reports whether, syntactically, diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 71b7308c0d..57c2dd25a6 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -547,6 +547,9 @@ func (ld *loader) load(roots func() []string) { } for _, pkg := range ld.pkgs { if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" { + if err.newMissingVersion != "" { + base.Fatalf("go: %s: package provided by %s at latest version %s but not at required version %s", pkg.stackText(), err.Module.Path, err.Module.Version, err.newMissingVersion) + } if added[pkg.path] { base.Fatalf("go: %s: looping trying to add package", pkg.stackText()) } diff --git a/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt new file mode 100644 index 0000000000..15f3f69557 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.0.txt @@ -0,0 +1,11 @@ +The deprecated package is present in this version (which is @latest) but +is deleted in a newer prerelease version. + +-- .mod -- +module example.com/missingpkg +-- .info -- +{"Version":"v1.0.0"} +-- lib.go -- +package lib +-- deprecated/deprecated.go -- +package deprecated diff --git a/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt b/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt new file mode 100644 index 0000000000..44580fe4cb --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_missingpkg_v1.0.1-beta.txt @@ -0,0 +1,8 @@ +The deprecated package is deleted in this version. + +-- .mod -- +module example.com/missingpkg +-- .info -- +{"Version":"v1.0.1-beta"} +-- lib.go -- +package lib diff --git a/src/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt new file mode 100644 index 0000000000..5e1c5c815e --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_usemissingpre_v1.0.0.txt @@ -0,0 +1,13 @@ +This module requires example.com/missingpkg at a prerelease version, which +is newer than @latest. + +-- .mod -- +module example.com/usemissingpre + +require example.com/missingpkg v1.0.1-beta +-- .info -- +{"Version":"v1.0.0"} +-- use.go -- +package use + +import _ "example.com/missingpkg" diff --git a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt new file mode 100644 index 0000000000..e7409d1d86 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt @@ -0,0 +1,12 @@ +env GO111MODULE=on + +! go list use.go +stderr 'import "example.com/missingpkg/deprecated": package provided by example.com/missingpkg at latest version v1.0.0 but not at required version v1.0.1-beta' + +-- use.go -- +package use + +import ( + _ "example.com/missingpkg/deprecated" + _ "example.com/usemissingpre" +) -- GitLab From 576442b27bae5009ad7582d5175caadf29f7bf5b Mon Sep 17 00:00:00 2001 From: zdjones Date: Fri, 29 Mar 2019 19:17:35 +0000 Subject: [PATCH 0653/1679] cmd/compile: preempt repeated checks for the zero constant in prove Prove requires access to a zero-valued constant in multiple heavily-used code paths. Currently, prove is checking for the existence of the constant on every iteration of these paths, and creating it if not found. This CL preempts all of these checks by finding or creating the zero constant Value, just once, when the factsTable is initialised on entry to prove(). The Method used to initialise the zero constant, func.ConstInt64(), finds an existing constant if present, or creates one in the entry block otherwise. Fixes #31141 Change-Id: Ic9a2fd9d79b67025e24d4483f6e87cf8213ead24 Reviewed-on: https://go-review.googlesource.com/c/go/+/170118 Reviewed-by: Giovanni Bajo Run-TryBot: Giovanni Bajo TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/prove.go | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index 2ab9aafaa1..f70ec0c830 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -195,6 +195,7 @@ func newFactsTable(f *Func) *factsTable { ft.stack = make([]fact, 4) ft.limits = make(map[ID]limit) ft.limitStack = make([]limitFact, 4) + ft.zero = f.ConstInt64(f.Config.Types.Int64, 0) return ft } @@ -571,9 +572,6 @@ func (ft *factsTable) isNonNegative(v *Value) bool { } // Check if the signed poset can prove that the value is >= 0 - if ft.zero == nil { - ft.zero = v.Block.NewValue0I(v.Block.Pos, OpConst64, v.Block.Func.Config.Types.Int64, 0) - } return ft.order[0].OrderedOrEqual(ft.zero, v) } @@ -744,11 +742,6 @@ func prove(f *Func) { // Find length and capacity ops. for _, b := range f.Blocks { for _, v := range b.Values { - // If we found a zero constant, save it (so we don't have - // to build one later). - if ft.zero == nil && v.Op == OpConst64 && v.AuxInt == 0 { - ft.zero = v - } if v.Uses == 0 { // We don't care about dead values. // (There can be some that are CSEd but not removed yet.) @@ -756,27 +749,18 @@ func prove(f *Func) { } switch v.Op { case OpStringLen: - if ft.zero == nil { - ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) - } ft.update(b, v, ft.zero, signed, gt|eq) case OpSliceLen: if ft.lens == nil { ft.lens = map[ID]*Value{} } ft.lens[v.Args[0].ID] = v - if ft.zero == nil { - ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) - } ft.update(b, v, ft.zero, signed, gt|eq) case OpSliceCap: if ft.caps == nil { ft.caps = map[ID]*Value{} } ft.caps[v.Args[0].ID] = v - if ft.zero == nil { - ft.zero = b.NewValue0I(b.Pos, OpConst64, f.Config.Types.Int64, 0) - } ft.update(b, v, ft.zero, signed, gt|eq) } } -- GitLab From 6e37e3a80b903a33f2b1c2b230d4fabee4398312 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 29 Mar 2019 13:25:15 -0700 Subject: [PATCH 0654/1679] runtime: use raceprocctx in race_arm64 In CL 169960 I didn't realize that we also have race detector support for arm64. Change-Id: If77bfb0f700a04c04416dad61ef11e27b1c98e07 Reviewed-on: https://go-review.googlesource.com/c/go/+/170105 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/runtime/race_arm64.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/race_arm64.s b/src/runtime/race_arm64.s index 48b119f8c4..192a847ad8 100644 --- a/src/runtime/race_arm64.s +++ b/src/runtime/race_arm64.s @@ -427,7 +427,7 @@ TEXT runtime·racecallbackthunk(SB), NOSPLIT|NOFRAME, $0 load_g MOVD g_m(g), R0 MOVD m_p(R0), R0 - MOVD p_racectx(R0), R0 + MOVD p_raceprocctx(R0), R0 MOVD R0, (R1) MOVD R13, g JMP (LR) -- GitLab From 637f34fee0dd3533e2d9eead6fd6e1dc25eb8d26 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sat, 30 Mar 2019 10:49:09 -0400 Subject: [PATCH 0655/1679] cmd/link: allow duplicated weak symbols on Mach-O This fixes cgo test issue29563 on Darwin. Updates #29563. Change-Id: If480078461247cd7c95931ae3ad4ca89736dd550 Reviewed-on: https://go-review.googlesource.com/c/go/+/170015 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/loadmacho/ldmacho.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/cmd/link/internal/loadmacho/ldmacho.go b/src/cmd/link/internal/loadmacho/ldmacho.go index 85aa606ff5..e2b0d63aa3 100644 --- a/src/cmd/link/internal/loadmacho/ldmacho.go +++ b/src/cmd/link/internal/loadmacho/ldmacho.go @@ -43,11 +43,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -const ( - N_EXT = 0x01 - N_TYPE = 0x1e - N_STAB = 0xe0 -) // TODO(crawshaw): de-duplicate these symbols with cmd/internal/ld const ( @@ -161,6 +156,19 @@ type ldMachoDysymtab struct { indir []uint32 } +// ldMachoSym.type_ +const ( + N_EXT = 0x01 + N_TYPE = 0x1e + N_STAB = 0xe0 +) + +// ldMachoSym.desc +const ( + N_WEAK_REF = 0x40 + N_WEAK_DEF = 0x80 +) + const ( LdMachoCpuVax = 1 LdMachoCpu68000 = 6 @@ -616,6 +624,9 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i if machsym.type_&N_EXT == 0 { s.Attr |= sym.AttrDuplicateOK } + if machsym.desc&(N_WEAK_REF|N_WEAK_DEF) != 0 { + s.Attr |= sym.AttrDuplicateOK + } machsym.sym = s if machsym.sectnum == 0 { // undefined continue -- GitLab From 2d41444ad0c1540f064695a9a4678dda6c0d2a51 Mon Sep 17 00:00:00 2001 From: zdjones Date: Sat, 30 Mar 2019 17:28:05 +0000 Subject: [PATCH 0656/1679] cmd/compile: make prove learn index >= 0 from successful bounds checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When branching at a bounds check for indexing or slicing ops, prove currently only learns from the upper bound. On the positive branch, we currently learn i < len(a) (or i <= len(a)) in both the signed and unsigned domains. This CL makes prove also learn from the lower bound. Specifically, on the positive branch from index or slicing ops, prove will now ALSO learn i >= 0 in the signed domain (this fact is of no value in the unsigned domain). The substantive change itself is only an additional call to addRestrictions, though I've also inverted the nested switch statements around that call for the sake of clarity. This CL removes 92 bounds checks from std and cmd. It passes all tests and shows no deltas on compilecmp. Fixes #28885 Change-Id: I13eccc36e640eb599fa6dc5aa3be3c7d7abd2d9e Reviewed-on: https://go-review.googlesource.com/c/go/+/170121 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Giovanni Bajo --- src/cmd/compile/internal/ssa/prove.go | 48 ++++++++++++++++----------- test/prove.go | 10 ++++++ 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index f70ec0c830..973e3cd4f2 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -931,31 +931,41 @@ func addBranchRestrictions(ft *factsTable, b *Block, br branch) { if d == signed && ft.isNonNegative(c.Args[0]) && ft.isNonNegative(c.Args[1]) { d |= unsigned } - switch br { - case negative: - switch b.Control.Op { // Special cases - case OpIsInBounds, OpIsSliceInBounds: - // 0 <= a0 < a1 (or 0 <= a0 <= a1) - // - // On the positive branch, we learn a0 < a1, - // both signed and unsigned. - // - // On the negative branch, we learn (0 > a0 || - // a0 >= a1). In the unsigned domain, this is - // simply a0 >= a1 (which is the reverse of the - // positive branch, so nothing surprising). - // But in the signed domain, we can't express the || - // condition, so check if a0 is non-negative instead, - // to be able to learn something. + switch b.Control.Op { + case OpIsInBounds, OpIsSliceInBounds: + // 0 <= a0 < a1 (or 0 <= a0 <= a1) + // + // On the positive branch, we learn: + // signed: 0 <= a0 < a1 (or 0 <= a0 <= a1) + // unsigned: a0 < a1 (or a0 <= a1) + // + // On the negative branch, we learn (0 > a0 || + // a0 >= a1). In the unsigned domain, this is + // simply a0 >= a1 (which is the reverse of the + // positive branch, so nothing surprising). + // But in the signed domain, we can't express the || + // condition, so check if a0 is non-negative instead, + // to be able to learn something. + switch br { + case negative: d = unsigned if ft.isNonNegative(c.Args[0]) { d |= signed } + addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r^(lt|gt|eq)) + case positive: + addRestrictions(b, ft, signed, ft.zero, c.Args[0], lt|eq) + addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r) + } + default: + switch br { + case negative: + addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r^(lt|gt|eq)) + case positive: + addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r) } - addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r^(lt|gt|eq)) - case positive: - addRestrictions(b, ft, d, c.Args[0], c.Args[1], tr.r) } + } } diff --git a/test/prove.go b/test/prove.go index 39b23c5e0a..6e92b9eec2 100644 --- a/test/prove.go +++ b/test/prove.go @@ -726,6 +726,16 @@ func signHint2(b []byte, n int) { } } +// indexGT0 tests whether prove learns int index >= 0 from bounds check. +func indexGT0(b []byte, n int) { + _ = b[n] + _ = b[25] + + for i := n; i <= 25; i++ { // ERROR "Induction variable: limits \[\?,25\], increment 1$" + b[i] = 123 // ERROR "Proved IsInBounds$" + } +} + // Induction variable in unrolled loop. func unrollUpExcl(a []int) int { var i, x int -- GitLab From e6ad619ad673d7484535afd4185209b0e9aa95c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 8 Mar 2019 18:12:07 +0000 Subject: [PATCH 0657/1679] cmd/go: further reduce init work MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The first biggest offender was crypto/des.init at ~1%. It's cryptographically broken and the init function is relatively expensive, which is unfortunate as both crypto/tls and crypto/x509 (and by extension, cmd/go) import it. Hide the work behind sync.Once. The second biggest offender was flag.sortFlags at just under 1%, used by the Visit flagset methods. It allocated two slices, which made a difference as cmd/go iterates over multiple flagsets during init. Use a single slice with a direct sort.Interface implementation. Another big offender is initializing global maps. Reducing this work in cmd/go/internal/imports and net/textproto gives us close to another whole 1% in saved work. The former can use map literals, and the latter can hide the work behind sync.Once. Finally, compress/flate used newHuffmanBitWriter as part of init, which allocates many objects and slices. Yet it only used one of the slice fields. Allocating just that slice saves a surprising ~0.3%, since we generated a lot of unnecessary garbage. All in all, these little pieces amount to just over 3% saved CPU time. name old time/op new time/op delta ExecGoEnv-8 3.61ms ± 1% 3.50ms ± 0% -3.02% (p=0.000 n=10+10) Updates #26775. Updates #29382. Change-Id: I915416e88a874c63235ba512617c8aef35c0ca8b Reviewed-on: https://go-review.googlesource.com/c/go/+/166459 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/imports/build.go | 53 ++++++++++++++++++------ src/compress/flate/huffman_bit_writer.go | 6 +-- src/crypto/des/block.go | 14 +++++-- src/flag/flag.go | 12 +++--- src/net/textproto/reader.go | 11 ++++- src/net/textproto/reader_test.go | 1 + 6 files changed, 70 insertions(+), 27 deletions(-) diff --git a/src/cmd/go/internal/imports/build.go b/src/cmd/go/internal/imports/build.go index 3718dbba3c..fd0a300bc8 100644 --- a/src/cmd/go/internal/imports/build.go +++ b/src/cmd/go/internal/imports/build.go @@ -195,17 +195,46 @@ func MatchFile(name string, tags map[string]bool) bool { return true } -var KnownOS = make(map[string]bool) -var KnownArch = make(map[string]bool) - -func init() { - for _, v := range strings.Fields(goosList) { - KnownOS[v] = true - } - for _, v := range strings.Fields(goarchList) { - KnownArch[v] = true - } +var KnownOS = map[string]bool{ + "aix": true, + "android": true, + "darwin": true, + "dragonfly": true, + "freebsd": true, + "hurd": true, + "js": true, + "linux": true, + "nacl": true, + "netbsd": true, + "openbsd": true, + "plan9": true, + "solaris": true, + "windows": true, + "zos": true, } -const goosList = "aix android darwin dragonfly freebsd hurd js linux nacl netbsd openbsd plan9 solaris windows zos " -const goarchList = "386 amd64 amd64p32 arm armbe arm64 arm64be ppc64 ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc riscv riscv64 s390 s390x sparc sparc64 wasm " +var KnownArch = map[string]bool{ + "386": true, + "amd64": true, + "amd64p32": true, + "arm": true, + "armbe": true, + "arm64": true, + "arm64be": true, + "ppc64": true, + "ppc64le": true, + "mips": true, + "mipsle": true, + "mips64": true, + "mips64le": true, + "mips64p32": true, + "mips64p32le": true, + "ppc": true, + "riscv": true, + "riscv64": true, + "s390": true, + "s390x": true, + "sparc": true, + "sparc64": true, + "wasm": true, +} diff --git a/src/compress/flate/huffman_bit_writer.go b/src/compress/flate/huffman_bit_writer.go index f42a921e67..3e19061f8b 100644 --- a/src/compress/flate/huffman_bit_writer.go +++ b/src/compress/flate/huffman_bit_writer.go @@ -609,10 +609,10 @@ func (w *huffmanBitWriter) writeTokens(tokens []token, leCodes, oeCodes []hcode) var huffOffset *huffmanEncoder func init() { - w := newHuffmanBitWriter(nil) - w.offsetFreq[0] = 1 + offsetFreq := make([]int32, offsetCodeCount) + offsetFreq[0] = 1 huffOffset = newHuffmanEncoder(offsetCodeCount) - huffOffset.generate(w.offsetFreq, 15) + huffOffset.generate(offsetFreq, 15) } // writeBlockHuff encodes a block of bytes as either diff --git a/src/crypto/des/block.go b/src/crypto/des/block.go index 21e6d4e82f..3e3fe06c02 100644 --- a/src/crypto/des/block.go +++ b/src/crypto/des/block.go @@ -4,7 +4,10 @@ package des -import "encoding/binary" +import ( + "encoding/binary" + "sync" +) func cryptBlock(subkeys []uint64, dst, src []byte, decrypt bool) { b := binary.BigEndian.Uint64(src) @@ -42,7 +45,8 @@ func decryptBlock(subkeys []uint64, dst, src []byte) { cryptBlock(subkeys, dst, src, true) } -// DES Feistel function +// DES Feistel function. feistelBox must be initialized via +// feistelBoxOnce.Do(initFeistelBox) first. func feistel(l, r uint32, k0, k1 uint64) (lout, rout uint32) { var t uint32 @@ -77,6 +81,8 @@ func feistel(l, r uint32, k0, k1 uint64) (lout, rout uint32) { // for sBoxes[s][i][j] << 4*(7-s) var feistelBox [8][64]uint32 +var feistelBoxOnce sync.Once + // general purpose function to perform DES block permutations func permuteBlock(src uint64, permutation []uint8) (block uint64) { for position, n := range permutation { @@ -86,7 +92,7 @@ func permuteBlock(src uint64, permutation []uint8) (block uint64) { return } -func init() { +func initFeistelBox() { for s := range sBoxes { for i := 0; i < 4; i++ { for j := 0; j < 16; j++ { @@ -219,6 +225,8 @@ func ksRotate(in uint32) (out []uint32) { // creates 16 56-bit subkeys from the original key func (c *desCipher) generateSubkeys(keyBytes []byte) { + feistelBoxOnce.Do(initFeistelBox) + // apply PC1 permutation to key key := binary.BigEndian.Uint64(keyBytes) permutedKey := permuteBlock(key, permutedChoice1[:]) diff --git a/src/flag/flag.go b/src/flag/flag.go index c312c62a58..9fed4d82b3 100644 --- a/src/flag/flag.go +++ b/src/flag/flag.go @@ -341,17 +341,15 @@ type Flag struct { // sortFlags returns the flags as a slice in lexicographical sorted order. func sortFlags(flags map[string]*Flag) []*Flag { - list := make(sort.StringSlice, len(flags)) + result := make([]*Flag, len(flags)) i := 0 for _, f := range flags { - list[i] = f.Name + result[i] = f i++ } - list.Sort() - result := make([]*Flag, len(list)) - for i, name := range list { - result[i] = flags[name] - } + sort.Slice(result, func(i, j int) bool { + return result[i].Name < result[j].Name + }) return result } diff --git a/src/net/textproto/reader.go b/src/net/textproto/reader.go index 2c4f25d5ae..a5cab993b2 100644 --- a/src/net/textproto/reader.go +++ b/src/net/textproto/reader.go @@ -11,6 +11,7 @@ import ( "io/ioutil" "strconv" "strings" + "sync" ) // A Reader implements convenience methods for reading requests @@ -27,6 +28,7 @@ type Reader struct { // should be reading from an io.LimitReader or similar Reader to bound // the size of responses. func NewReader(r *bufio.Reader) *Reader { + commonHeaderOnce.Do(initCommonHeader) return &Reader{R: r} } @@ -571,6 +573,8 @@ func (r *Reader) upcomingHeaderNewlines() (n int) { // If s contains a space or invalid header field bytes, it is // returned without modifications. func CanonicalMIMEHeaderKey(s string) string { + commonHeaderOnce.Do(initCommonHeader) + // Quick check for canonical encoding. upper := true for i := 0; i < len(s); i++ { @@ -642,9 +646,12 @@ func canonicalMIMEHeaderKey(a []byte) string { } // commonHeader interns common header strings. -var commonHeader = make(map[string]string) +var commonHeader map[string]string + +var commonHeaderOnce sync.Once -func init() { +func initCommonHeader() { + commonHeader = make(map[string]string) for _, v := range []string{ "Accept", "Accept-Charset", diff --git a/src/net/textproto/reader_test.go b/src/net/textproto/reader_test.go index 6d9bcd841b..6ff7eefe91 100644 --- a/src/net/textproto/reader_test.go +++ b/src/net/textproto/reader_test.go @@ -338,6 +338,7 @@ func TestReadMultiLineError(t *testing.T) { } func TestCommonHeaders(t *testing.T) { + commonHeaderOnce.Do(initCommonHeader) for h := range commonHeader { if h != CanonicalMIMEHeaderKey(h) { t.Errorf("Non-canonical header %q in commonHeader", h) -- GitLab From 7b62e984d941c753e7fb20f8b59a49acf62c88a7 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Sun, 31 Mar 2019 15:23:07 +0100 Subject: [PATCH 0658/1679] runtime: always mask shift amount regardless of architecture Currently the shift amount is only masked on x86. Change it so it is masked on all architectures. In the worst case we generate a couple of extra instructions to perform the masking and in the best case we can elide overflow checks. This particular shift could also be replaced with a rotate instruction during optimization which would remove both the masking instructions and overflow checks on all architectures. Fixes #31165. Change-Id: I16b7a8800b4ba8813dc83735dfc59564e661d3b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/170122 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/map.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/runtime/map.go b/src/runtime/map.go index 1282a12193..d2ff19336f 100644 --- a/src/runtime/map.go +++ b/src/runtime/map.go @@ -181,10 +181,8 @@ type hiter struct { // bucketShift returns 1< Date: Sun, 31 Mar 2019 22:33:52 +0100 Subject: [PATCH 0659/1679] cmd/compile: update stale comment in prove MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a follow-up CL to https://golang.org/cl/170118, updating a comment made incorrect by that CL. Change-Id: I5a29cfae331fbbbb36c96d96f9e4949393a5942d Reviewed-on: https://go-review.googlesource.com/c/go/+/170123 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/prove.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/ssa/prove.go b/src/cmd/compile/internal/ssa/prove.go index 973e3cd4f2..a73cd613f2 100644 --- a/src/cmd/compile/internal/ssa/prove.go +++ b/src/cmd/compile/internal/ssa/prove.go @@ -175,8 +175,7 @@ type factsTable struct { lens map[ID]*Value caps map[ID]*Value - // zero is a reference to the zero-valued constant assigned or created - // during the len/cap sweep that begins prove. + // zero is a zero-valued constant zero *Value } -- GitLab From 4091cf972a37418c847426bd15709cd0128fad81 Mon Sep 17 00:00:00 2001 From: Segev Finer Date: Fri, 29 Mar 2019 09:35:06 +0000 Subject: [PATCH 0660/1679] cmd/doc: correctly indent pre-formatted blocks They were previously indented at the same level as the normal text when printing a single symbol or the description of a field. Running "go doc text/template Must": Before: func Must(t *Template, err error) *Template Must is a helper that wraps a call to a function returning (*Template, error) and panics if the error is non-nil. It is intended for use in variable initializations such as var t = template.Must(template.New("name").Parse("text")) After: func Must(t *Template, err error) *Template Must is a helper that wraps a call to a function returning (*Template, error) and panics if the error is non-nil. It is intended for use in variable initializations such as var t = template.Must(template.New("name").Parse("text")) Running "go doc http Request.Header": Before: type Request struct { // Header contains the request header fields either received // by the server or to be sent by the client. // // If a server received a request with header lines, // // Host: example.com // accept-encoding: gzip, deflate // Accept-Language: en-us // fOO: Bar // foo: two // // then // // Header = map[string][]string{ // "Accept-Encoding": {"gzip, deflate"}, // "Accept-Language": {"en-us"}, // "Foo": {"Bar", "two"}, // } ... After: type Request struct { // Header contains the request header fields either received by the server or // to be sent by the client. // // If a server received a request with header lines, // // Host: example.com // accept-encoding: gzip, deflate // Accept-Language: en-us // fOO: Bar // foo: two // // then // // Header = map[string][]string{ // "Accept-Encoding": {"gzip, deflate"}, // "Accept-Language": {"en-us"}, // "Foo": {"Bar", "two"}, // } ... Fixes #29708 Change-Id: Ibe1a6a7a76d6b19c5737ba6e8210e3ad0b88ce16 GitHub-Last-Rev: 439c0fe70a01490cbd9c3613eba3fe45a3ffd9be GitHub-Pull-Request: golang/go#31120 Reviewed-on: https://go-review.googlesource.com/c/go/+/169957 Run-TryBot: Rob Pike TryBot-Result: Gobot Gobot Reviewed-by: Rob Pike --- src/cmd/doc/doc_test.go | 31 +++++++++++++++++++++++++++++++ src/cmd/doc/pkg.go | 12 +++++++++--- src/cmd/doc/testdata/pkg.go | 22 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/cmd/doc/doc_test.go b/src/cmd/doc/doc_test.go index 5532cf537d..22468db1ff 100644 --- a/src/cmd/doc/doc_test.go +++ b/src/cmd/doc/doc_test.go @@ -721,6 +721,37 @@ var tests = []test{ []string{"Foo struct"}, nil, }, + { + "formatted doc on function", + []string{p, "ExportedFormattedDoc"}, + []string{ + `func ExportedFormattedDoc\(a int\) bool`, + ` Comment about exported function with formatting\. + + Example + + fmt\.Println\(FormattedDoc\(\)\) + + Text after pre-formatted block\.`, + }, + nil, + }, + { + "formatted doc on type field", + []string{p, "ExportedFormattedType.ExportedField"}, + []string{ + `type ExportedFormattedType struct`, + ` // Comment before exported field with formatting\. + //[ ] + // Example + //[ ] + // a\.ExportedField = 123 + //[ ] + // Text after pre-formatted block\.`, + `ExportedField int`, + }, + nil, + }, } func TestDoc(t *testing.T) { diff --git a/src/cmd/doc/pkg.go b/src/cmd/doc/pkg.go index e3a44c4283..12b76c2ad0 100644 --- a/src/cmd/doc/pkg.go +++ b/src/cmd/doc/pkg.go @@ -5,6 +5,7 @@ package main import ( + "bufio" "bytes" "fmt" "go/ast" @@ -221,7 +222,7 @@ func (pkg *Package) emit(comment string, node ast.Node) { } if comment != "" && !showSrc { pkg.newlines(1) - doc.ToText(&pkg.buf, comment, " ", indent, indentedWidth) + doc.ToText(&pkg.buf, comment, indent, indent+indent, indentedWidth) pkg.newlines(2) // Blank line after comment to separate from next item. } else { pkg.newlines(1) @@ -1005,8 +1006,13 @@ func (pkg *Package) printFieldDoc(symbol, fieldName string) bool { pkg.Printf("type %s struct {\n", typ.Name) } if field.Doc != nil { - for _, comment := range field.Doc.List { - doc.ToText(&pkg.buf, comment.Text, indent, indent, indentedWidth) + // To present indented blocks in comments correctly, process the comment as + // a unit before adding the leading // to each line. + docBuf := bytes.Buffer{} + doc.ToText(&docBuf, field.Doc.Text(), "", indent, indentedWidth) + scanner := bufio.NewScanner(&docBuf) + for scanner.Scan() { + fmt.Fprintf(&pkg.buf, "%s// %s\n", indent, scanner.Bytes()) } } s := pkg.oneLineNode(field.Type) diff --git a/src/cmd/doc/testdata/pkg.go b/src/cmd/doc/testdata/pkg.go index 88e8c215d0..759b7723a6 100644 --- a/src/cmd/doc/testdata/pkg.go +++ b/src/cmd/doc/testdata/pkg.go @@ -207,3 +207,25 @@ const ( Duplicate = iota duplicate ) + +// Comment about exported function with formatting. +// +// Example +// +// fmt.Println(FormattedDoc()) +// +// Text after pre-formatted block. +func ExportedFormattedDoc(a int) bool { + return true +} + +type ExportedFormattedType struct { + // Comment before exported field with formatting. + // + // Example + // + // a.ExportedField = 123 + // + // Text after pre-formatted block. + ExportedField int +} -- GitLab From d6b2b35e641eeac9f764d21dcaed46973b3e2720 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Fri, 15 Mar 2019 13:41:48 -0400 Subject: [PATCH 0661/1679] cmd/go: refactor load.LoadPackage into other functions LoadPackage was used to load a *load.Package for a command line argument, after pattern expansion. It provided two special cases on top of LoadImport. First, it ensured that "cmd/" packages in GOROOT were installed in "$GOROOT/bin" or "$GOROOT/pkg/tool". Second, it translated absolute paths to packages in GOROOT and GOPATH into regular import paths. With this change, LoadImport now ensures "cmd/" packages have the right Target (without the need for a special case) and search.ImportPaths translates absolute paths. LoadPackage no longer handles these special cases and has been renamed to LoadImportWithFlags, since it's still useful for loading implicit dependencies. Updates #29758 Change-Id: I9d54036f90c3ccd9b3a0fe0eaddaa7749593cc91 Reviewed-on: https://go-review.googlesource.com/c/go/+/167748 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/get/get.go | 9 +-- src/cmd/go/internal/load/pkg.go | 104 +++------------------------ src/cmd/go/internal/search/search.go | 29 ++++++-- src/cmd/go/internal/test/test.go | 2 +- src/cmd/go/internal/work/action.go | 8 +-- src/cmd/go/internal/work/gc.go | 2 +- 6 files changed, 44 insertions(+), 110 deletions(-) diff --git a/src/cmd/go/internal/get/get.go b/src/cmd/go/internal/get/get.go index a314c57160..fe15515efc 100644 --- a/src/cmd/go/internal/get/get.go +++ b/src/cmd/go/internal/get/get.go @@ -177,12 +177,6 @@ func runGet(cmd *base.Command, args []string) { // everything. load.ClearPackageCache() - // In order to rebuild packages information completely, - // we need to clear commands cache. Command packages are - // referring to evicted packages from the package cache. - // This leads to duplicated loads of the standard packages. - load.ClearCmdCache() - pkgs := load.PackagesForBuild(args) // Phase 3. Install. @@ -240,7 +234,8 @@ func download(arg string, parent *load.Package, stk *load.ImportStack, mode int) } load1 := func(path string, mode int) *load.Package { if parent == nil { - return load.LoadPackageNoFlags(path, stk) + mode := 0 // don't do module or vendor resolution + return load.LoadImport(path, base.Cwd, nil, stk, nil, mode) } return load.LoadImport(path, parent.Dir, parent, stk, nil, mode|load.ResolveModule) } diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index cc81cc0317..6361862969 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -377,7 +377,7 @@ func ClearPackageCachePartial(args []string) { } } -// ReloadPackageNoFlags is like LoadPackageNoFlags but makes sure +// ReloadPackageNoFlags is like LoadImport but makes sure // not to use the package cache. // It is only for use by GOPATH-based "go get". // TODO(rsc): When GOPATH-based "go get" is removed, delete this function. @@ -387,7 +387,7 @@ func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { delete(packageCache, p.Dir) delete(packageCache, p.ImportPath) } - return LoadPackageNoFlags(arg, stk) + return LoadImport(arg, base.Cwd, nil, stk, nil, 0) } // dirToImportPath returns the pseudo-import path we use for a package @@ -552,7 +552,7 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo bp.ImportPath = importPath if cfg.GOBIN != "" { bp.BinDir = cfg.GOBIN - } else if cfg.ModulesEnabled { + } else if cfg.ModulesEnabled && !bp.Goroot { bp.BinDir = ModBinDir() } if modDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path && @@ -1716,99 +1716,17 @@ func TestPackageList(roots []*Package) []*Package { return all } -var cmdCache = map[string]*Package{} - -func ClearCmdCache() { - for name := range cmdCache { - delete(cmdCache, name) - } -} - -// LoadPackage loads the package named by arg. -func LoadPackage(arg string, stk *ImportStack) *Package { - p := loadPackage(arg, stk) +// LoadImportWithFlags loads the package with the given import path and +// sets tool flags on that package. This function is useful loading implicit +// dependencies (like sync/atomic for coverage). +// TODO(jayconrod): delete this function and set flags automatically +// in LoadImport instead. +func LoadImportWithFlags(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { + p := LoadImport(path, srcDir, parent, stk, importPos, mode) setToolFlags(p) return p } -// LoadPackageNoFlags is like LoadPackage -// but does not guarantee that the build tool flags are set in the result. -// It is only for use by GOPATH-based "go get" -// and is only appropriate for preliminary loading of packages. -// A real load using LoadPackage or (more likely) -// Packages, PackageAndErrors, or PackagesForBuild -// must be done before passing the package to any build -// steps, so that the tool flags can be set properly. -// TODO(rsc): When GOPATH-based "go get" is removed, delete this function. -func LoadPackageNoFlags(arg string, stk *ImportStack) *Package { - return loadPackage(arg, stk) -} - -// loadPackage is like loadImport but is used for command-line arguments, -// not for paths found in import statements. In addition to ordinary import paths, -// loadPackage accepts pseudo-paths beginning with cmd/ to denote commands -// in the Go command directory, as well as paths to those directories. -func loadPackage(arg string, stk *ImportStack) *Package { - if arg == "" { - panic("loadPackage called with empty package path") - } - if build.IsLocalImport(arg) { - dir := arg - if !filepath.IsAbs(dir) { - if abs, err := filepath.Abs(dir); err == nil { - // interpret relative to current directory - dir = abs - } - } - if sub, ok := hasSubdir(cfg.GOROOTsrc, dir); ok && strings.HasPrefix(sub, "cmd/") && !strings.Contains(sub[4:], "/") { - arg = sub - } - } - if strings.HasPrefix(arg, "cmd/") && !strings.Contains(arg[4:], "/") { - if p := cmdCache[arg]; p != nil { - return p - } - stk.Push(arg) - defer stk.Pop() - - bp, err := cfg.BuildContext.ImportDir(filepath.Join(cfg.GOROOTsrc, arg), 0) - bp.ImportPath = arg - bp.Goroot = true - bp.BinDir = cfg.GOROOTbin - bp.Root = cfg.GOROOT - bp.SrcRoot = cfg.GOROOTsrc - p := new(Package) - cmdCache[arg] = p - p.load(stk, bp, err) - if p.Error == nil && p.Name != "main" { - p.Error = &PackageError{ - ImportStack: stk.Copy(), - Err: fmt.Sprintf("expected package main but found package %s in %s", p.Name, p.Dir), - } - } - return p - } - - // Wasn't a command; must be a package. - // If it is a local import path but names a standard package, - // we treat it as if the user specified the standard package. - // This lets you run go test ./ioutil in package io and be - // referring to io/ioutil rather than a hypothetical import of - // "./ioutil". - if build.IsLocalImport(arg) || filepath.IsAbs(arg) { - dir := arg - if !filepath.IsAbs(arg) { - dir = filepath.Join(base.Cwd, arg) - } - bp, _ := cfg.BuildContext.ImportDir(dir, build.FindOnly) - if bp.ImportPath != "" && bp.ImportPath != "." { - arg = bp.ImportPath - } - } - - return LoadImport(arg, base.Cwd, nil, stk, nil, 0) -} - // Packages returns the packages named by the // command line arguments 'args'. If a named package // cannot be loaded at all (for example, if the directory does not exist), @@ -1850,7 +1768,7 @@ func PackagesAndErrors(patterns []string) []*Package { if pkg == "" { panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern)) } - p := loadPackage(pkg, &stk) + p := LoadImport(pkg, base.Cwd, nil, &stk, nil, 0) p.Match = append(p.Match, m.Pattern) p.Internal.CmdlinePkg = true if m.Literal { diff --git a/src/cmd/go/internal/search/search.go b/src/cmd/go/internal/search/search.go index 20e8f0ad1e..0167c8d755 100644 --- a/src/cmd/go/internal/search/search.go +++ b/src/cmd/go/internal/search/search.go @@ -327,14 +327,35 @@ func ImportPathsQuiet(patterns []string) []*Match { out = append(out, MatchPackages(a)) continue } - if strings.Contains(a, "...") { - if build.IsLocalImport(a) { - out = append(out, MatchPackagesInFS(a)) + + if build.IsLocalImport(a) || filepath.IsAbs(a) { + var m *Match + if strings.Contains(a, "...") { + m = MatchPackagesInFS(a) } else { - out = append(out, MatchPackages(a)) + m = &Match{Pattern: a, Literal: true, Pkgs: []string{a}} + } + + // Change the file import path to a regular import path if the package + // is in GOPATH or GOROOT. We don't report errors here; LoadImport + // (or something similar) will report them later. + for i, dir := range m.Pkgs { + if !filepath.IsAbs(dir) { + dir = filepath.Join(base.Cwd, dir) + } + if bp, _ := cfg.BuildContext.ImportDir(dir, build.FindOnly); bp.ImportPath != "" && bp.ImportPath != "." { + m.Pkgs[i] = bp.ImportPath + } } + out = append(out, m) continue } + + if strings.Contains(a, "...") { + out = append(out, MatchPackages(a)) + continue + } + out = append(out, &Match{Pattern: a, Literal: true, Pkgs: []string{a}}) } return out diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index b43925d5e5..225dab31de 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -760,7 +760,7 @@ func ensureImport(p *load.Package, pkg string) { } } - p1 := load.LoadPackage(pkg, &load.ImportStack{}) + p1 := load.LoadImportWithFlags(pkg, p.Dir, p, &load.ImportStack{}, nil, 0) if p1.Error != nil { base.Fatalf("load %s: %v", pkg, p1.Error) } diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index a47b9ba370..415df94f4a 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -289,7 +289,7 @@ func readpkglist(shlibpath string) (pkgs []*load.Package) { if strings.HasPrefix(t, "pkgpath ") { t = strings.TrimPrefix(t, "pkgpath ") t = strings.TrimSuffix(t, ";") - pkgs = append(pkgs, load.LoadPackage(t, &stk)) + pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd, nil, &stk, nil, 0)) } } } else { @@ -300,7 +300,7 @@ func readpkglist(shlibpath string) (pkgs []*load.Package) { scanner := bufio.NewScanner(bytes.NewBuffer(pkglistbytes)) for scanner.Scan() { t := scanner.Text() - pkgs = append(pkgs, load.LoadPackage(t, &stk)) + pkgs = append(pkgs, load.LoadImportWithFlags(t, base.Cwd, nil, &stk, nil, 0)) } } return @@ -405,7 +405,7 @@ func (b *Builder) vetAction(mode, depMode BuildMode, p *load.Package) *Action { // vet expects to be able to import "fmt". var stk load.ImportStack stk.Push("vet") - p1 := load.LoadPackage("fmt", &stk) + p1 := load.LoadImportWithFlags("fmt", p.Dir, p, &stk, nil, 0) stk.Pop() aFmt := b.CompileAction(ModeBuild, depMode, p1) @@ -705,7 +705,7 @@ func (b *Builder) linkSharedAction(mode, depMode BuildMode, shlib string, a1 *Ac } } var stk load.ImportStack - p := load.LoadPackage(pkg, &stk) + p := load.LoadImportWithFlags(pkg, base.Cwd, nil, &stk, nil, 0) if p.Error != nil { base.Fatalf("load %s: %v", pkg, p.Error) } diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index 3d09f69fcc..cdd0989a93 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -304,7 +304,7 @@ func (gcToolchain) symabis(b *Builder, a *Action, sfiles []string) (string, erro otherPkgs = []string{"sync/atomic"} } for _, p2name := range otherPkgs { - p2 := load.LoadPackage(p2name, &load.ImportStack{}) + p2 := load.LoadImportWithFlags(p2name, p.Dir, p, &load.ImportStack{}, nil, 0) if len(p2.SFiles) == 0 { continue } -- GitLab From a7fc71092dfb6c6d5fef09b8c85b7d9e78908717 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 15 Mar 2019 14:58:40 -0400 Subject: [PATCH 0662/1679] cmd/go/internal/modget: support the suffix '@patch' in 'go get' As of this change, an explicit '@patch' suffix is to '-u=patch' as '@latest' is to '-u'. RELNOTE='go get' in module mode now supports the version suffix '@patch'. Fixes #26812 Change-Id: Ib5eee40de640440f7470d37a574b311ef8a67f67 Reviewed-on: https://go-review.googlesource.com/c/go/+/167747 Run-TryBot: Bryan C. Mills Reviewed-by: Jay Conrod --- src/cmd/go/alldocs.go | 17 +- src/cmd/go/internal/modget/get.go | 173 +++++++++++++----- src/cmd/go/internal/modload/load.go | 11 +- ...ch.example.com_depofdirectpatch_v1.0.0.txt | 11 ++ ...ch.example.com_depofdirectpatch_v1.0.1.txt | 11 ++ .../mod/patch.example.com_direct_v1.0.0.txt | 21 +++ .../mod/patch.example.com_direct_v1.0.1.txt | 27 +++ .../mod/patch.example.com_direct_v1.1.0.txt | 21 +++ .../mod/patch.example.com_indirect_v1.0.0.txt | 11 ++ .../mod/patch.example.com_indirect_v1.0.1.txt | 11 ++ .../mod/patch.example.com_indirect_v1.1.0.txt | 11 ++ .../go/testdata/script/mod_upgrade_patch.txt | 29 --- .../testdata/script/mod_upgrade_patch_mod.txt | 85 +++++++++ .../testdata/script/mod_upgrade_patch_pkg.txt | 88 +++++++++ 14 files changed, 444 insertions(+), 83 deletions(-) create mode 100644 src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt create mode 100644 src/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt delete mode 100644 src/cmd/go/testdata/script/mod_upgrade_patch.txt create mode 100644 src/cmd/go/testdata/script/mod_upgrade_patch_mod.txt create mode 100644 src/cmd/go/testdata/script/mod_upgrade_patch_pkg.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index f42635f6a8..f02df514b7 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -558,8 +558,6 @@ // For modules stored in source control repositories, the version suffix can // also be a commit hash, branch identifier, or other syntax known to the // source control system, as in 'go get golang.org/x/text@master'. -// The version suffix @latest explicitly requests the default behavior -// described above. // // If a module under consideration is already a dependency of the current // development module, then get will update the required version. @@ -568,6 +566,13 @@ // dependency should be removed entirely, downgrading or removing modules // depending on it as needed. // +// The version suffix @latest explicitly requests the latest minor release of the +// given path. +// +// The suffix @patch requests the latest patch release: if the path is already in +// the build list, the selected version will have the same minor version. +// If the path is not already in the build list, @patch is equivalent to @latest. +// // Although get defaults to using the latest version of the module containing // a named package, it does not use the latest version of that module's // dependencies. Instead it prefers to use the specific dependency versions @@ -581,9 +586,11 @@ // patch releases when available. Continuing the previous example, // 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). // -// The -u=patch flag (not -u patch) instructs get to update dependencies -// to use newer patch releases when available. Continuing the previous example, -// 'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). +// The -u=patch flag (not -u patch) also instructs get to update dependencies, +// but changes the default to select patch releases. +// Continuing the previous example, +// 'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3), +// while 'go get -u=patch A' will use a patch release of A instead. // // In general, adding a new dependency may require upgrading // existing dependencies to keep a working build, and 'go get' does diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 17a0ed45e2..40bbd50746 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -21,7 +21,6 @@ import ( "cmd/go/internal/work" "fmt" "os" - pathpkg "path" "path/filepath" "strings" ) @@ -49,8 +48,6 @@ suffix to the package argument, as in 'go get golang.org/x/text@v0.3.0'. For modules stored in source control repositories, the version suffix can also be a commit hash, branch identifier, or other syntax known to the source control system, as in 'go get golang.org/x/text@master'. -The version suffix @latest explicitly requests the default behavior -described above. If a module under consideration is already a dependency of the current development module, then get will update the required version. @@ -59,6 +56,13 @@ downgrades the dependency. The version suffix @none indicates that the dependency should be removed entirely, downgrading or removing modules depending on it as needed. +The version suffix @latest explicitly requests the latest minor release of the +given path. + +The suffix @patch requests the latest patch release: if the path is already in +the build list, the selected version will have the same minor version. +If the path is not already in the build list, @patch is equivalent to @latest. + Although get defaults to using the latest version of the module containing a named package, it does not use the latest version of that module's dependencies. Instead it prefers to use the specific dependency versions @@ -72,9 +76,11 @@ The -u flag instructs get to update dependencies to use newer minor or patch releases when available. Continuing the previous example, 'go get -u A' will use the latest A with B v1.3.1 (not B v1.2.3). -The -u=patch flag (not -u patch) instructs get to update dependencies -to use newer patch releases when available. Continuing the previous example, -'go get -u=patch A' will use the latest A with B v1.2.4 (not B v1.2.3). +The -u=patch flag (not -u patch) also instructs get to update dependencies, +but changes the default to select patch releases. +Continuing the previous example, +'go get -u=patch A@latest' will use the latest A with B v1.2.4 (not B v1.2.3), +while 'go get -u=patch A' will use a patch release of A instead. In general, adding a new dependency may require upgrading existing dependencies to keep a working build, and 'go get' does @@ -165,6 +171,9 @@ func (v *upgradeFlag) Set(s string) error { if s == "false" { s = "" } + if s == "true" { + s = "latest" + } *v = upgradeFlag(s) return nil } @@ -180,12 +189,12 @@ func init() { // A task holds the state for processing a single get argument (path@vers). type task struct { - arg string // original argument - index int + arg string // original argument path string // package path part of arg forceModulePath bool // path must be interpreted as a module path vers string // version part of arg m module.Version // module version indicated by argument + prevM module.Version // module version from initial build list req []module.Version // m's requirement list (not upgraded) } @@ -196,7 +205,7 @@ func runGet(cmd *base.Command, args []string) { } switch getU { - case "", "patch", "true": + case "", "latest", "patch": // ok default: base.Fatalf("go get: unknown upgrade flag -u=%s", getU) @@ -230,6 +239,7 @@ func runGet(cmd *base.Command, args []string) { // and a list of install targets (for the "go install" at the end). var tasks []*task var install []string + var needModule []*task for _, arg := range search.CleanPatterns(args) { // Argument is module query path@vers, or else path with implicit @latest. path := arg @@ -245,6 +255,12 @@ func runGet(cmd *base.Command, args []string) { install = append(install, path) } + // If the user runs 'go get -u=patch some/module', update some/module to a + // patch release, not a minor version. + if vers == "" && getU != "" { + vers = string(getU) + } + // Deciding which module to upgrade/downgrade for a particular argument is difficult. // Patterns only make it more difficult. // We impose restrictions to avoid needing to interlace pattern expansion, @@ -271,25 +287,43 @@ func runGet(cmd *base.Command, args []string) { // - Import paths without patterns are left as is, for resolution by getQuery (eventually modload.Import). // if search.IsRelativePath(path) { - // Check that this relative pattern only matches directories in the current module, - // and then record the current module as the target. - dir := path - if i := strings.Index(path, "..."); i >= 0 { - dir, _ = pathpkg.Split(path[:i]) - } - abs, err := filepath.Abs(dir) - if err != nil { - base.Errorf("go get %s: %v", arg, err) - continue + t := &task{arg: arg, path: modload.Target.Path, vers: "", prevM: modload.Target, forceModulePath: true} + + // If the path is relative, always upgrade the entire main module. + // (TODO(golang.org/issue/26902): maybe we should upgrade the modules + // containing the dependencies of the requested packages instead.) + // + // If the path is explicit, at least check that it is a package in the main module. + if len(args) > 0 { + if *getM { + base.Errorf("go get %s: -m requires a module path, but a relative path must be a package in the main module", arg) + continue + } + + pkgPath := modload.DirImportPath(filepath.FromSlash(path)) + if pkgs := modload.TargetPackages(pkgPath); len(pkgs) == 0 { + if strings.Contains(path, "...") { + fmt.Fprintf(os.Stderr, "go get %s: warning: pattern patched no packages", arg) + } else { + abs, err := filepath.Abs(path) + if err != nil { + abs = path + } + base.Errorf("go get %s: path %s is not in module rooted at %s", arg, abs, modload.ModRoot()) + } + continue + } } - if !str.HasFilePathPrefix(abs, modload.ModRoot()) { - base.Errorf("go get %s: directory %s is outside module root %s", arg, abs, modload.ModRoot()) - continue + + switch vers { + case "", "latest", "patch": + tasks = append(tasks, t) + default: + base.Errorf("go get %s: can't request explicit version of path in main module", arg) } - // TODO: Check if abs is inside a nested module. - tasks = append(tasks, &task{arg: arg, path: modload.Target.Path, vers: ""}) continue } + if path == "all" { // TODO: If *getM, should this be the module pattern "all"? @@ -306,30 +340,19 @@ func runGet(cmd *base.Command, args []string) { m := modload.PackageModule(pkg) if m.Path != "" && !seen[m] { seen[m] = true - tasks = append(tasks, &task{arg: arg, path: m.Path, vers: "latest", forceModulePath: true}) + tasks = append(tasks, &task{arg: arg, path: m.Path, vers: vers, prevM: m, forceModulePath: true}) } } continue } - if search.IsMetaPackage(path) { - // Already handled "all", so this must be "std" or "cmd", - // which are entirely in the standard library. - if path != arg { - base.Errorf("go get %s: cannot use pattern %q with explicit version", arg, arg) - } - if *getM { - base.Errorf("go get %s: cannot use pattern %q with -m", arg, arg) - continue - } - continue - } + if strings.Contains(path, "...") { // Apply to modules in build list matched by pattern (golang.org/x/...), if any. match := search.MatchPattern(path) matched := false for _, m := range modload.BuildList() { if match(m.Path) || str.HasPathPrefix(path, m.Path) { - tasks = append(tasks, &task{arg: arg, path: m.Path, vers: vers, forceModulePath: true}) + tasks = append(tasks, &task{arg: arg, path: m.Path, vers: vers, prevM: m, forceModulePath: true}) matched = true } } @@ -345,10 +368,66 @@ func runGet(cmd *base.Command, args []string) { continue } } - tasks = append(tasks, &task{arg: arg, path: path, vers: vers}) + t := &task{arg: arg, path: path, vers: vers} + if vers == "patch" { + if *getM { + for _, m := range modload.BuildList() { + if m.Path == path { + t.prevM = m + break + } + } + tasks = append(tasks, t) + } else { + // We need to know the module containing t so that we can restrict the patch to its minor version. + needModule = append(needModule, t) + } + } else { + // The requested version of path doesn't depend on the existing version, + // so don't bother resolving it. + tasks = append(tasks, t) + } } base.ExitIfErrors() + if len(needModule) > 0 { + paths := make([]string, len(needModule)) + for i, t := range needModule { + paths[i] = t.path + } + matches := modload.ImportPaths(paths) + if len(matches) != len(paths) { + base.Fatalf("go get: internal error: ImportPaths resolved %d paths to %d matches", len(paths), len(matches)) + } + + for i, match := range matches { + t := needModule[i] + if len(match.Pkgs) == 0 { + // Let modload.Query resolve the path during task processing. + tasks = append(tasks, t) + continue + } + + allStd := true + for _, pkg := range match.Pkgs { + m := modload.PackageModule(pkg) + if m.Path == "" { + // pkg is in the standard library. + } else { + allStd = false + tasks = append(tasks, &task{arg: t.arg, path: pkg, vers: t.vers, prevM: m}) + } + } + if allStd { + if *getM { + base.Errorf("go get %s: cannot use pattern %q with -m", t.arg, t.arg) + } else if t.path != t.arg { + base.Errorf("go get %s: cannot use pattern %q with explicit version", t.arg, t.arg) + } + } + } + } + // Now we've reduced the upgrade/downgrade work to a list of path@vers pairs (tasks). // Resolve each one in parallel. reqs := modload.Reqs() @@ -363,7 +442,7 @@ func runGet(cmd *base.Command, args []string) { t.m = module.Version{Path: t.path, Version: "none"} return } - m, err := getQuery(t.path, t.vers, t.forceModulePath) + m, err := getQuery(t.path, t.vers, t.prevM, t.forceModulePath) if err != nil { base.Errorf("go get %v: %v", t.arg, err) return @@ -412,7 +491,6 @@ func runGet(cmd *base.Command, args []string) { upgraded, err := mvs.UpgradeAll(upgradeTarget, &upgrader{ Reqs: modload.Reqs(), targets: named, - patch: getU == "patch", tasks: byPath, }) if err != nil { @@ -554,9 +632,16 @@ func runGet(cmd *base.Command, args []string) { // to determine the underlying module version being requested. // If forceModulePath is set, getQuery must interpret path // as a module path. -func getQuery(path, vers string, forceModulePath bool) (module.Version, error) { - if vers == "" { +func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (module.Version, error) { + switch vers { + case "": vers = "latest" + case "patch": + if prevM.Version == "" { + vers = "latest" + } else { + vers = semver.MajorMinor(prevM.Version) + } } // First choice is always to assume path is a module path. @@ -625,7 +710,7 @@ func (u *upgrader) Upgrade(m module.Version) (module.Version, error) { // only ever returns untagged versions, // which is not what we want. query := "latest" - if u.patch { + if getU == "patch" { // For patch upgrade, query "v1.2". query = semver.MajorMinor(m.Version) } diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 57c2dd25a6..d55e0c5403 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -339,7 +339,7 @@ func loadAll(testAll bool) []string { if !testAll { loaded.testRoots = true } - all := TargetPackages() + all := TargetPackages("...") loaded.load(func() []string { return all }) WriteGoMod() @@ -357,10 +357,11 @@ func loadAll(testAll bool) []string { // Only "ignore" and malformed build tag requirements are considered false. var anyTags = map[string]bool{"*": true} -// TargetPackages returns the list of packages in the target (top-level) module, -// under all build tag settings. -func TargetPackages() []string { - return matchPackages("...", anyTags, false, []module.Version{Target}) +// TargetPackages returns the list of packages in the target (top-level) module +// matching pattern, which may be relative to the working directory, under all +// build tag settings. +func TargetPackages(pattern string) []string { + return matchPackages(pattern, anyTags, false, []module.Version{Target}) } // BuildList returns the module build list, diff --git a/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt b/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt new file mode 100644 index 0000000000..40616c668a --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.0.txt @@ -0,0 +1,11 @@ +patch.example.com/depofdirectpatch v1.0.0 +written by hand + +-- .mod -- +module patch.example.com/depofdirectpatch +-- .info -- +{"Version":"v1.0.0"} +-- go.mod -- +module patch.example.com/depofdirectpatch +-- depofdirectpatch.go -- +package depofdirectpatch diff --git a/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt b/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt new file mode 100644 index 0000000000..e075028656 --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_depofdirectpatch_v1.0.1.txt @@ -0,0 +1,11 @@ +patch.example.com/depofdirectpatch v1.0.1 +written by hand + +-- .mod -- +module patch.example.com/depofdirectpatch +-- .info -- +{"Version":"v1.0.1"} +-- go.mod -- +module patch.example.com/depofdirectpatch +-- depofdirectpatch.go -- +package depofdirectpatch diff --git a/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt new file mode 100644 index 0000000000..1e775fb89b --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.0.txt @@ -0,0 +1,21 @@ +patch.example.com/direct v1.0.0 +written by hand + +-- .mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 +) +-- .info -- +{"Version":"v1.0.0"} +-- go.mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 +) +-- direct.go -- +package direct + +import _ "patch.example.com/indirect" diff --git a/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt new file mode 100644 index 0000000000..64912b7b43 --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.0.1.txt @@ -0,0 +1,27 @@ +patch.example.com/direct v1.0.1 +written by hand + +-- .mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 + patch.example.com/depofdirectpatch v1.0.0 +) +-- .info -- +{"Version":"v1.0.1"} +-- go.mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 + patch.example.com/depofdirectpatch v1.0.0 +) +-- direct.go -- +package direct + +import _ "patch.example.com/indirect" +-- usedepofdirectpatch/unused.go -- +package usedepofdirectpatch + +import _ "patch.example.com/depofdirectpatch" diff --git a/src/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt new file mode 100644 index 0000000000..406e3b9f62 --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_direct_v1.1.0.txt @@ -0,0 +1,21 @@ +patch.example.com/direct v1.1.0 +written by hand + +-- .mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 +) +-- .info -- +{"Version":"v1.1.0"} +-- go.mod -- +module patch.example.com/direct + +require ( + patch.example.com/indirect v1.0.0 +) +-- direct.go -- +package direct + +import _ "patch.example.com/indirect" diff --git a/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt new file mode 100644 index 0000000000..ea7f5e2d8d --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.0.txt @@ -0,0 +1,11 @@ +patch.example.com/indirect v1.0.0 +written by hand + +-- .mod -- +module patch.example.com/indirect +-- .info -- +{"Version":"v1.0.0"} +-- go.mod -- +module patch.example.com/indirect +-- direct.go -- +package indirect diff --git a/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt new file mode 100644 index 0000000000..8c6cf8e7bf --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.0.1.txt @@ -0,0 +1,11 @@ +patch.example.com/indirect v1.0.1 +written by hand + +-- .mod -- +module patch.example.com/indirect +-- .info -- +{"Version":"v1.0.1"} +-- go.mod -- +module patch.example.com/indirect +-- direct.go -- +package indirect diff --git a/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt new file mode 100644 index 0000000000..f7229d417a --- /dev/null +++ b/src/cmd/go/testdata/mod/patch.example.com_indirect_v1.1.0.txt @@ -0,0 +1,11 @@ +patch.example.com/indirect v1.1.0 +written by hand + +-- .mod -- +module patch.example.com/indirect +-- .info -- +{"Version":"v1.1.0"} +-- go.mod -- +module patch.example.com/indirect +-- direct.go -- +package indirect diff --git a/src/cmd/go/testdata/script/mod_upgrade_patch.txt b/src/cmd/go/testdata/script/mod_upgrade_patch.txt deleted file mode 100644 index 3c27cdbf7b..0000000000 --- a/src/cmd/go/testdata/script/mod_upgrade_patch.txt +++ /dev/null @@ -1,29 +0,0 @@ -env GO111MODULE=on - -go list -m all -stdout '^rsc.io/quote v1.4.0' -stdout '^rsc.io/sampler v1.0.0' - -# get -u=patch rsc.io/quote should take latest quote & patch update its deps -go get -m -u=patch rsc.io/quote -go list -m all -stdout '^rsc.io/quote v1.5.2' -stdout '^rsc.io/sampler v1.3.1' -stdout '^golang.org/x/text v0.0.0-' - -# get -u=patch quote@v1.2.0 should take that version of quote & patch update its deps -go get -m -u=patch rsc.io/quote@v1.2.0 -go list -m all -stdout '^rsc.io/quote v1.2.0' -stdout '^rsc.io/sampler v1.3.1' -stdout '^golang.org/x/text v0.0.0-' - -# get -u=patch with no args applies to all deps -go get -m -u=patch -go list -m all -stdout '^rsc.io/quote v1.2.1' - --- go.mod -- -module x -require rsc.io/quote v1.4.0 - diff --git a/src/cmd/go/testdata/script/mod_upgrade_patch_mod.txt b/src/cmd/go/testdata/script/mod_upgrade_patch_mod.txt new file mode 100644 index 0000000000..0853c37d3f --- /dev/null +++ b/src/cmd/go/testdata/script/mod_upgrade_patch_mod.txt @@ -0,0 +1,85 @@ +env GO111MODULE=on + +# Initially, we are at v1.0.0 for all dependencies. +cp go.mod go.mod.orig +go list -m all +stdout '^patch.example.com/direct v1.0.0' +stdout '^patch.example.com/indirect v1.0.0' +! stdout '^patch.example.com/depofdirectpatch' + +# get -m -u=patch, with no arguments, should patch-update all dependencies, +# pulling in transitive dependencies and also patching those. +# +# TODO(golang.org/issue/26902): We should not update transitive dependencies +# that don't affect the transitive import graph of the main module in any way. +cp go.mod.orig go.mod +go get -m -u=patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.1' # TODO: leave at v1.0.0 + +# 'get -m all@patch' should be equivalent to 'get -u=patch -m all' +cp go.mod.orig go.mod +go get -m all@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.0' + +# Requesting the direct dependency with -u=patch but without an explicit version +# should patch-update it and its dependencies. +cp go.mod.orig go.mod +go get -m -u=patch patch.example.com/direct +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.1' # TODO: leave at v1.0.0 + +# Requesting only the indirect dependency should not update the direct one. +cp go.mod.orig go.mod +go get -m -u=patch patch.example.com/indirect +go list -m all +stdout '^patch.example.com/direct v1.0.0' +stdout '^patch.example.com/indirect v1.0.1' +! stdout '^patch.example.com/depofdirectpatch' + +# @patch should apply only to the specific module. +# but the result must reflect its upgraded requirements. +cp go.mod.orig go.mod +go get -m patch.example.com/direct@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.0' +stdout '^patch.example.com/depofdirectpatch v1.0.0' + +# An explicit @patch should override a general -u. +cp go.mod.orig go.mod +go get -m -u patch.example.com/direct@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.1.0' +stdout '^patch.example.com/depofdirectpatch v1.0.1' + +# An explicit @latest should override a general -u=patch. +cp go.mod.orig go.mod +go get -m -u=patch patch.example.com/direct@latest +go list -m all +stdout '^patch.example.com/direct v1.1.0' +stdout '^patch.example.com/indirect v1.0.1' +! stdout '^patch.example.com/depofdirectpatch' + +# Standard-library modules cannot be upgraded explicitly. +cp go.mod.orig go.mod +! go get -m std@patch +stderr 'explicit requirement on standard-library module std not allowed' + + +-- go.mod -- +module x + +require patch.example.com/direct v1.0.0 + +-- main.go -- +package x +import _ "patch.example.com/direct" diff --git a/src/cmd/go/testdata/script/mod_upgrade_patch_pkg.txt b/src/cmd/go/testdata/script/mod_upgrade_patch_pkg.txt new file mode 100644 index 0000000000..8aedaefd90 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_upgrade_patch_pkg.txt @@ -0,0 +1,88 @@ +env GO111MODULE=on + +# Initially, we are at v1.0.0 for all dependencies. +cp go.mod go.mod.orig +go list -m all +stdout '^patch.example.com/direct v1.0.0' +stdout '^patch.example.com/indirect v1.0.0' +! stdout '^patch.example.com/depofdirectpatch' + +# get -u=patch, with no arguments, should patch-update all dependencies, +# pulling in transitive dependencies and also patching those. +# +# TODO(golang.org/issue/26902): We should not update dependencies +# that don't affect the transitive import graph of the main module in any way. +cp go.mod.orig go.mod +go get -u=patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.1' # TODO: leave at v1.0.0 + +# 'get all@patch' should be equivalent to 'get -u=patch all' +cp go.mod.orig go.mod +go get all@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.0' + +# Requesting the direct dependency with -u=patch but without an explicit version +# should patch-update it and its dependencies. +cp go.mod.orig go.mod +go get -u=patch patch.example.com/direct +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.1' +stdout '^patch.example.com/depofdirectpatch v1.0.1' # TODO: leave at v1.0.0 + +# Requesting only the indirect dependency should not update the direct one. +cp go.mod.orig go.mod +go get -u=patch patch.example.com/indirect +go list -m all +stdout '^patch.example.com/direct v1.0.0' +stdout '^patch.example.com/indirect v1.0.1' +! stdout '^patch.example.com/depofdirectpatch' + +# @patch should apply only to the specific module, +# but the result must reflect its upgraded requirements. +cp go.mod.orig go.mod +go get patch.example.com/direct@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.0.0' +stdout '^patch.example.com/depofdirectpatch v1.0.0' + +# An explicit @patch should override a general -u. +cp go.mod.orig go.mod +go get -u patch.example.com/direct@patch +go list -m all +stdout '^patch.example.com/direct v1.0.1' +stdout '^patch.example.com/indirect v1.1.0' +stdout '^patch.example.com/depofdirectpatch v1.0.1' + +# An explicit @latest should override a general -u=patch. +cp go.mod.orig go.mod +go get -u=patch patch.example.com/direct@latest +go list -m all +stdout '^patch.example.com/direct v1.1.0' +stdout '^patch.example.com/indirect v1.0.1' +! stdout '^patch.example.com/depofdirectpatch' + +# Standard-library packages cannot be upgraded explicitly. +cp go.mod.orig go.mod +! go get cmd/vet@patch +stderr 'cannot use pattern .* with explicit version' + +# However, standard-library packages without explicit versions are fine. +go get -u=patch -d cmd/get + + +-- go.mod -- +module x + +require patch.example.com/direct v1.0.0 + +-- main.go -- +package x +import _ "patch.example.com/direct" -- GitLab From 5fc55b31803e9929d104ce58a4dcbef97a87a83e Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sat, 30 Mar 2019 03:16:44 +0700 Subject: [PATCH 0663/1679] cmd/compile: use FmtLeft to generate symbol name for unexported interface methods The bug in 29612 is that there are two similar-looking anonymous interface types in two different packages, ./p1/ssa and ./p2/ssa: v.(interface{ foo() }).foo() These types should be treated differently because the unexported method makes the types different (according to the spec). But when generating the type descriptors for those two types, they both have the name "interface { ssa.foo() }". They thus get the same symbol, and the linker happily unifies them. It picks an arbitrary one for the runtime to use, but that breaks conversions from concrete types that have a foo method from the package which had its interface type overwritten. We need to encode the metadata symbol for unexported methods as package path qualified (The same as we did in CL 27791 for struct fields). So switching from FmtUnsigned to Fmtleft by default fixes the issue. In case of generating namedata, FmtUnsigned is used. The benchmark result ends up in no significant change of compiled binary compare to the immediate parent. Fixes #29612 Change-Id: I775aff91ae4a1bb16eb18a48d55e3b606f3f3352 Reviewed-on: https://go-review.googlesource.com/c/go/+/170157 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/fmt.go | 6 ++++- test/fixedbugs/issue29612.dir/main.go | 24 ++++++++++++++++++ test/fixedbugs/issue29612.dir/p1/ssa/ssa.go | 18 +++++++++++++ test/fixedbugs/issue29612.dir/p2/ssa/ssa.go | 28 +++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue29612.dir/main.go create mode 100644 test/fixedbugs/issue29612.dir/p1/ssa/ssa.go create mode 100644 test/fixedbugs/issue29612.dir/p2/ssa/ssa.go diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index 12f341b660..67b521feed 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -752,7 +752,11 @@ func typefmt(t *types.Type, flag FmtFlag, mode fmtMode, depth int) string { case types.IsExported(f.Sym.Name): buf = append(buf, sconv(f.Sym, FmtShort, mode)...) default: - buf = append(buf, sconv(f.Sym, FmtUnsigned, mode)...) + flag1 := FmtLeft + if flag&FmtUnsigned != 0 { + flag1 = FmtUnsigned + } + buf = append(buf, sconv(f.Sym, flag1, mode)...) } buf = append(buf, tconv(f.Type, FmtShort, mode, depth)...) } diff --git a/test/fixedbugs/issue29612.dir/main.go b/test/fixedbugs/issue29612.dir/main.go new file mode 100644 index 0000000000..9dbc4c4cd9 --- /dev/null +++ b/test/fixedbugs/issue29612.dir/main.go @@ -0,0 +1,24 @@ +// run + +// Copyright 2019 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. + +// Do not panic on conversion to anonymous interface, which +// is similar-looking interface types in different packages. + +package main + +import ( + ssa1 "./p1/ssa" + ssa2 "./p2/ssa" +) + +func main() { + v1 := &ssa1.T{} + _ = v1 + + v2 := &ssa2.T{} + ssa2.Works(v2) + ssa2.Panics(v2) // This call must not panic +} diff --git a/test/fixedbugs/issue29612.dir/p1/ssa/ssa.go b/test/fixedbugs/issue29612.dir/p1/ssa/ssa.go new file mode 100644 index 0000000000..8f6eb97f8f --- /dev/null +++ b/test/fixedbugs/issue29612.dir/p1/ssa/ssa.go @@ -0,0 +1,18 @@ +// Copyright 2019 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 ssa + +type T struct{} + +func (T) foo() {} + +type fooer interface { + foo() +} + +func Unused(v interface{}) { + v.(fooer).foo() + v.(interface{ foo() }).foo() +} diff --git a/test/fixedbugs/issue29612.dir/p2/ssa/ssa.go b/test/fixedbugs/issue29612.dir/p2/ssa/ssa.go new file mode 100644 index 0000000000..df57314b8c --- /dev/null +++ b/test/fixedbugs/issue29612.dir/p2/ssa/ssa.go @@ -0,0 +1,28 @@ +// Copyright 2019 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 ssa + +type T struct{} + +func (T) foo() {} + +type fooer interface { + foo() +} + +func Works(v interface{}) { + switch v.(type) { + case interface{}: + v.(fooer).foo() + } +} + +func Panics(v interface{}) { + switch v.(type) { + case interface{}: + v.(fooer).foo() + v.(interface{ foo() }).foo() + } +} -- GitLab From 726a9398f7dddfb681174a6bb71d1ad7c92142b6 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Sat, 30 Mar 2019 14:11:05 +0000 Subject: [PATCH 0664/1679] cmd/compile/internal/gc: minor cleanup of slicing Tidy the code up a little bit to move variable definitions closer to uses, prefer early return to else branches and some other minor tweaks. I'd like to make some more changes to this code in the near future and this CL should make those changes cleaner. Change-Id: Ie7d7f2e4bb1e670347941e255c9cdc1703282db5 Reviewed-on: https://go-review.googlesource.com/c/go/+/170120 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/ssa.go | 96 ++++++++++++++---------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index a50e56f8f2..be317c2109 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2415,7 +2415,7 @@ func (s *state) expr(n *Node) *ssa.Value { if max != nil { k = s.expr(max) } - p, l, c := s.slice(n.Left.Type, v, i, j, k, n.Bounded()) + p, l, c := s.slice(v, i, j, k, n.Bounded()) return s.newValue3(ssa.OpSliceMake, n.Type, p, l, c) case OSLICESTR: @@ -2428,7 +2428,7 @@ func (s *state) expr(n *Node) *ssa.Value { if high != nil { j = s.expr(high) } - p, l, _ := s.slice(n.Left.Type, v, i, j, nil, n.Bounded()) + p, l, _ := s.slice(v, i, j, nil, n.Bounded()) return s.newValue2(ssa.OpStringMake, n.Type, p, l) case OCALLFUNC: @@ -4359,35 +4359,25 @@ func (s *state) storeArg(n *Node, t *types.Type, off int64) { // slice computes the slice v[i:j:k] and returns ptr, len, and cap of result. // i,j,k may be nil, in which case they are set to their default value. -// t is a slice, ptr to array, or string type. -func (s *state) slice(t *types.Type, v, i, j, k *ssa.Value, bounded bool) (p, l, c *ssa.Value) { - var elemtype *types.Type - var ptrtype *types.Type - var ptr *ssa.Value - var len *ssa.Value - var cap *ssa.Value - zero := s.constInt(types.Types[TINT], 0) +// v may be a slice, string or pointer to an array. +func (s *state) slice(v, i, j, k *ssa.Value, bounded bool) (p, l, c *ssa.Value) { + t := v.Type + var ptr, len, cap *ssa.Value switch { case t.IsSlice(): - elemtype = t.Elem() - ptrtype = types.NewPtr(elemtype) - ptr = s.newValue1(ssa.OpSlicePtr, ptrtype, v) + ptr = s.newValue1(ssa.OpSlicePtr, types.NewPtr(t.Elem()), v) len = s.newValue1(ssa.OpSliceLen, types.Types[TINT], v) cap = s.newValue1(ssa.OpSliceCap, types.Types[TINT], v) case t.IsString(): - elemtype = types.Types[TUINT8] - ptrtype = types.NewPtr(elemtype) - ptr = s.newValue1(ssa.OpStringPtr, ptrtype, v) + ptr = s.newValue1(ssa.OpStringPtr, types.NewPtr(types.Types[TUINT8]), v) len = s.newValue1(ssa.OpStringLen, types.Types[TINT], v) cap = len case t.IsPtr(): if !t.Elem().IsArray() { s.Fatalf("bad ptr to array in slice %v\n", t) } - elemtype = t.Elem().Elem() - ptrtype = types.NewPtr(elemtype) s.nilCheck(v) - ptr = v + ptr = s.newValue1(ssa.OpCopy, types.NewPtr(t.Elem().Elem()), v) len = s.constInt(types.Types[TINT], t.Elem().NumElem()) cap = len default: @@ -4396,7 +4386,7 @@ func (s *state) slice(t *types.Type, v, i, j, k *ssa.Value, bounded bool) (p, l, // Set default values if i == nil { - i = zero + i = s.constInt(types.Types[TINT], 0) } if j == nil { j = len @@ -4433,47 +4423,53 @@ func (s *state) slice(t *types.Type, v, i, j, k *ssa.Value, bounded bool) (p, l, i = s.boundsCheck(i, j, ssa.BoundsSliceB, bounded) } - // Generate the following code assuming that indexes are in bounds. - // The masking is to make sure that we don't generate a slice - // that points to the next object in memory. - // rlen = j - i - // rcap = k - i - // delta = i * elemsize - // rptr = p + delta&mask(rcap) - // result = (SliceMake rptr rlen rcap) - // where mask(x) is 0 if x==0 and -1 if x>0. + // Word-sized integer operations. subOp := s.ssaOp(OSUB, types.Types[TINT]) mulOp := s.ssaOp(OMUL, types.Types[TINT]) andOp := s.ssaOp(OAND, types.Types[TINT]) + + // Calculate the length (rlen) and capacity (rcap) of the new slice. + // For strings the capacity of the result is unimportant. However, + // we use rcap to test if we've generated a zero-length slice. + // Use length of strings for that. rlen := s.newValue2(subOp, types.Types[TINT], j, i) - var rcap *ssa.Value - switch { - case t.IsString(): - // Capacity of the result is unimportant. However, we use - // rcap to test if we've generated a zero-length slice. - // Use length of strings for that. - rcap = rlen - case j == k: - rcap = rlen - default: + rcap := rlen + if j != k && !t.IsString() { rcap = s.newValue2(subOp, types.Types[TINT], k, i) } - var rptr *ssa.Value if (i.Op == ssa.OpConst64 || i.Op == ssa.OpConst32) && i.AuxInt == 0 { // No pointer arithmetic necessary. - rptr = ptr - } else { - // delta = # of bytes to offset pointer by. - delta := s.newValue2(mulOp, types.Types[TINT], i, s.constInt(types.Types[TINT], elemtype.Width)) - // If we're slicing to the point where the capacity is zero, - // zero out the delta. - mask := s.newValue1(ssa.OpSlicemask, types.Types[TINT], rcap) - delta = s.newValue2(andOp, types.Types[TINT], delta, mask) - // Compute rptr = ptr + delta - rptr = s.newValue2(ssa.OpAddPtr, ptrtype, ptr, delta) + return ptr, rlen, rcap } + // Calculate the base pointer (rptr) for the new slice. + // + // Generate the following code assuming that indexes are in bounds. + // The masking is to make sure that we don't generate a slice + // that points to the next object in memory. We cannot just set + // the pointer to nil because then we would create a nil slice or + // string. + // + // rcap = k - i + // rlen = j - i + // rptr = ptr + (mask(rcap) & (i * stride)) + // + // Where mask(x) is 0 if x==0 and -1 if x>0 and stride is the width + // of the element type. + stride := s.constInt(types.Types[TINT], ptr.Type.Elem().Width) + + // The delta is the number of bytes to offset ptr by. + delta := s.newValue2(mulOp, types.Types[TINT], i, stride) + + // If we're slicing to the point where the capacity is zero, + // zero out the delta. + mask := s.newValue1(ssa.OpSlicemask, types.Types[TINT], rcap) + delta = s.newValue2(andOp, types.Types[TINT], delta, mask) + + // Compute rptr = ptr + delta. + rptr := s.newValue2(ssa.OpAddPtr, ptr.Type, ptr, delta) + return rptr, rlen, rcap } -- GitLab From 46c3e217188043c7cea9e181f0d61825d2636ad7 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 1 Apr 2019 22:20:06 +0000 Subject: [PATCH 0665/1679] runtime: skip broken TestLldbPython It's broken on our builders (once we enabled dev mode on our Macs, see CL 170339) Updates #31188 Change-Id: Iceea65dc79576057b401a461bfe39254fed1f7ed Reviewed-on: https://go-review.googlesource.com/c/go/+/170281 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Brad Fitzpatrick --- src/runtime/runtime-lldb_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/runtime-lldb_test.go b/src/runtime/runtime-lldb_test.go index 985745d97c..1e2e5d5be9 100644 --- a/src/runtime/runtime-lldb_test.go +++ b/src/runtime/runtime-lldb_test.go @@ -139,6 +139,7 @@ func TestLldbPython(t *testing.T) { if final := os.Getenv("GOROOT_FINAL"); final != "" && runtime.GOROOT() != final { t.Skip("gdb test can fail with GOROOT_FINAL pending") } + testenv.SkipFlaky(t, 31188) checkLldbPython(t) -- GitLab From 56517216c052649daab6c439f386f9dc02e90c3a Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 1 Apr 2019 14:12:51 +0200 Subject: [PATCH 0666/1679] internal/bytealg: fix function reference in comments There's no IndexShortStr func, refer to Index instead. Change-Id: I6923e7ad3e910e4b5fb0c07d6339ddfec4111f4f Reviewed-on: https://go-review.googlesource.com/c/go/+/170124 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/internal/bytealg/index_arm64.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internal/bytealg/index_arm64.go b/src/internal/bytealg/index_arm64.go index 251e63567e..e87c109519 100644 --- a/src/internal/bytealg/index_arm64.go +++ b/src/internal/bytealg/index_arm64.go @@ -4,7 +4,7 @@ package bytealg -// Empirical data shows that using IndexShortStr can get better +// Empirical data shows that using Index can get better // performance when len(s) <= 16. const MaxBruteForce = 16 @@ -14,7 +14,7 @@ func init() { } // Cutover reports the number of failures of IndexByte we should tolerate -// before switching over to IndexShortStr. +// before switching over to Index. // n is the number of bytes processed so far. // See the bytes.Index implementation for details. func Cutover(n int) int { -- GitLab From 3aacfce6cf7e5f0346906e5236433852f4075368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Mon, 25 Mar 2019 10:34:57 +0100 Subject: [PATCH 0667/1679] runtime, cmd/dist, misc/cgo: enable c-archive for aix/ppc64 Change-Id: Ib9a40d5596f5735a00483e2d2db965402f05671b Reviewed-on: https://go-review.googlesource.com/c/go/+/169120 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/testcarchive/carchive_test.go | 23 +++++++++++++++-------- misc/cgo/testcarchive/testdata/main4.c | 15 +++++++++++---- misc/cgo/testcarchive/testdata/main5.c | 4 +++- src/cmd/dist/test.go | 3 ++- src/runtime/os3_solaris.go | 1 + src/runtime/os_aix.go | 8 ++++++++ src/runtime/os_dragonfly.go | 1 + src/runtime/os_freebsd.go | 1 + src/runtime/os_linux.go | 1 + src/runtime/os_netbsd.go | 1 + src/runtime/os_openbsd.go | 1 + src/runtime/signal_darwin_386.go | 1 + src/runtime/signal_darwin_amd64.go | 1 + src/runtime/signal_darwin_arm.go | 1 + src/runtime/signal_darwin_arm64.go | 1 + src/runtime/signal_unix.go | 1 + 16 files changed, 50 insertions(+), 14 deletions(-) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index 611a770245..b7f04356a9 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -110,6 +110,11 @@ func testMain(m *testing.M) int { // TODO(crawshaw): can we do better? cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...) } + if GOOS == "aix" { + // -Wl,-bnoobjreorder is mandatory to keep the same layout + // in .text section. + cc = append(cc, "-Wl,-bnoobjreorder") + } libbase := GOOS + "_" + GOARCH if runtime.Compiler == "gccgo" { libbase = "gccgo_" + libgodir + "_fPIC" @@ -318,7 +323,7 @@ func TestSignalForwarding(t *testing.T) { } func TestSignalForwardingExternal(t *testing.T) { - if GOOS == "freebsd" { + if GOOS == "freebsd" || GOOS == "aix" { t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH) } checkSignalForwardingTest(t) @@ -594,13 +599,15 @@ func TestPIE(t *testing.T) { t.Fatal(err) } - f, err := elf.Open("testp" + exeSuffix) - if err != nil { - t.Fatal("elf.Open failed: ", err) - } - defer f.Close() - if hasDynTag(t, f, elf.DT_TEXTREL) { - t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix) + if GOOS != "aix" { + f, err := elf.Open("testp" + exeSuffix) + if err != nil { + t.Fatal("elf.Open failed: ", err) + } + defer f.Close() + if hasDynTag(t, f, elf.DT_TEXTREL) { + t.Errorf("%s has DT_TEXTREL flag", "testp"+exeSuffix) + } } } diff --git a/misc/cgo/testcarchive/testdata/main4.c b/misc/cgo/testcarchive/testdata/main4.c index a74763dd70..04f774008f 100644 --- a/misc/cgo/testcarchive/testdata/main4.c +++ b/misc/cgo/testcarchive/testdata/main4.c @@ -14,6 +14,13 @@ #include "libgo4.h" +#ifdef _AIX +// On AIX, CSIGSTKSZ is too small to handle Go sighandler. +#define CSIGSTKSZ 0x4000 +#else +#define CSIGSTKSZ SIGSTKSZ +#endif + static void die(const char* msg) { perror(msg); exit(EXIT_FAILURE); @@ -53,12 +60,12 @@ static void* thread1(void* arg __attribute__ ((unused))) { // Set up an alternate signal stack for this thread. memset(&ss, 0, sizeof ss); - ss.ss_sp = malloc(SIGSTKSZ); + ss.ss_sp = malloc(CSIGSTKSZ); if (ss.ss_sp == NULL) { die("malloc"); } ss.ss_flags = 0; - ss.ss_size = SIGSTKSZ; + ss.ss_size = CSIGSTKSZ; if (sigaltstack(&ss, NULL) < 0) { die("sigaltstack"); } @@ -112,12 +119,12 @@ static void* thread2(void* arg __attribute__ ((unused))) { // Set up an alternate signal stack for this thread. memset(&ss, 0, sizeof ss); - ss.ss_sp = malloc(SIGSTKSZ); + ss.ss_sp = malloc(CSIGSTKSZ); if (ss.ss_sp == NULL) { die("malloc"); } ss.ss_flags = 0; - ss.ss_size = SIGSTKSZ; + ss.ss_size = CSIGSTKSZ; if (sigaltstack(&ss, NULL) < 0) { die("sigaltstack"); } diff --git a/misc/cgo/testcarchive/testdata/main5.c b/misc/cgo/testcarchive/testdata/main5.c index 9d0da33652..d431ce01ce 100644 --- a/misc/cgo/testcarchive/testdata/main5.c +++ b/misc/cgo/testcarchive/testdata/main5.c @@ -14,6 +14,8 @@ #include "libgo2.h" +int *nilp; + int main(int argc, char** argv) { int verbose; int test; @@ -39,7 +41,7 @@ int main(int argc, char** argv) { printf("attempting segfault\n"); } - volatile int crash = *(int *) 0; + *nilp = 0; break; } diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 3f8f12c9e9..df86ae7223 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -928,7 +928,8 @@ func (t *tester) supportedBuildmode(mode string) bool { return false } switch pair { - case "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64", + case "aix-ppc64", + "darwin-386", "darwin-amd64", "darwin-arm", "darwin-arm64", "linux-amd64", "linux-386", "linux-ppc64le", "linux-s390x", "freebsd-amd64", "windows-amd64", "windows-386": diff --git a/src/runtime/os3_solaris.go b/src/runtime/os3_solaris.go index 11d2c9b098..b5f8a7c042 100644 --- a/src/runtime/os3_solaris.go +++ b/src/runtime/os3_solaris.go @@ -273,6 +273,7 @@ func sigdelset(mask *sigset, i int) { mask.__sigbits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/os_aix.go b/src/runtime/os_aix.go index faec9ac113..197869f989 100644 --- a/src/runtime/os_aix.go +++ b/src/runtime/os_aix.go @@ -296,7 +296,15 @@ func setSignalstackSP(s *stackt, sp uintptr) { *(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { + switch sig { + case _SIGPIPE: + // For SIGPIPE, c.sigcode() isn't set to _SI_USER as on Linux. + // Therefore, raisebadsignal won't raise SIGPIPE again if + // it was deliver in a non-Go thread. + c.set_sigcode(_SI_USER) + } } //go:nosplit diff --git a/src/runtime/os_dragonfly.go b/src/runtime/os_dragonfly.go index eb7e159d35..4fda7ea806 100644 --- a/src/runtime/os_dragonfly.go +++ b/src/runtime/os_dragonfly.go @@ -252,6 +252,7 @@ func sigdelset(mask *sigset, i int) { mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index ba0afa23bf..cbb72cf55e 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -365,6 +365,7 @@ func sigdelset(mask *sigset, i int) { mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index 8f3afe0577..a817020c90 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -395,6 +395,7 @@ func setSignalstackSP(s *stackt, sp uintptr) { *(*uintptr)(unsafe.Pointer(&s.ss_sp)) = sp } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index fa3c9fa649..da024cd309 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -328,6 +328,7 @@ func sigdelset(mask *sigset, i int) { mask.__bits[(i-1)/32] &^= 1 << ((uint32(i) - 1) & 31) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 42fe315bcd..2d6334ec86 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -302,6 +302,7 @@ func sigdelset(mask *sigset, i int) { *mask &^= 1 << (uint32(i) - 1) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { } diff --git a/src/runtime/signal_darwin_386.go b/src/runtime/signal_darwin_386.go index c162959c12..3dc5334997 100644 --- a/src/runtime/signal_darwin_386.go +++ b/src/runtime/signal_darwin_386.go @@ -40,6 +40,7 @@ func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x } func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) } func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { switch sig { case _SIGTRAP: diff --git a/src/runtime/signal_darwin_amd64.go b/src/runtime/signal_darwin_amd64.go index 40de4812b8..abc212ad51 100644 --- a/src/runtime/signal_darwin_amd64.go +++ b/src/runtime/signal_darwin_amd64.go @@ -48,6 +48,7 @@ func (c *sigctxt) set_rsp(x uint64) { c.regs().rsp = x } func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) } func (c *sigctxt) set_sigaddr(x uint64) { c.info.si_addr = x } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { switch sig { case _SIGTRAP: diff --git a/src/runtime/signal_darwin_arm.go b/src/runtime/signal_darwin_arm.go index 9a5d3ac5bb..9098b1053d 100644 --- a/src/runtime/signal_darwin_arm.go +++ b/src/runtime/signal_darwin_arm.go @@ -50,6 +50,7 @@ func (c *sigctxt) set_r10(x uint32) { c.regs().r[10] = x } func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) } func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { switch sig { case _SIGTRAP: diff --git a/src/runtime/signal_darwin_arm64.go b/src/runtime/signal_darwin_arm64.go index 41b8fcaab9..690ffe4ae2 100644 --- a/src/runtime/signal_darwin_arm64.go +++ b/src/runtime/signal_darwin_arm64.go @@ -67,6 +67,7 @@ func (c *sigctxt) set_sigaddr(x uint64) { c.info.si_addr = (*byte)(unsafe.Pointer(uintptr(x))) } +//go:nosplit func (c *sigctxt) fixsigcode(sig uint32) { switch sig { case _SIGTRAP: diff --git a/src/runtime/signal_unix.go b/src/runtime/signal_unix.go index 8814f7836d..1dd56989b4 100644 --- a/src/runtime/signal_unix.go +++ b/src/runtime/signal_unix.go @@ -296,6 +296,7 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { sigprofNonGoPC(c.sigpc()) return } + c.fixsigcode(sig) badsignal(uintptr(sig), c) return } -- GitLab From 4ebc6514faa8530d1a68b4e04f57dc5c25bcb01c Mon Sep 17 00:00:00 2001 From: Mark Ryan Date: Mon, 18 Mar 2019 15:48:34 +0100 Subject: [PATCH 0668/1679] cmd/asm: Fix EVEX RIP-relative addressing AVX-512 instructions that use RIP-relative addressing and require the R bit of the EVEX prefix to be zero, i.e., instructions that use Z8-Z15 or Z24-Z31, are incorrectly encoded by the assembler. The reason is that the location of the offset at which the relative address is to be written is incorrectly computed when the R bit is clear. For example, VMOVUPS bInitX<>+0(SB), Z0 encodes correctly to 62 f1 7c 48 10 05 66 e9 02 00 whereas VMOVUPS bInitX<>+0(SB), Z8 encodes incorrectly to 62 71 7c 48 10 05 00 56 e9 02 00 Note the extra zero byte between the ModR/M byte (05) and the relative address starting with 56. This error results in the first byte of the following instruction being overwritten and typically, a program crash. This commit fixes the issue in the same way that is fixed for VEX encoded instructions, by simply not incrementing the offset for EVEX instructions. Existing test code created for a similar VEX encoding issue (19518) has been modified to also test for the issue addressed by this commit. Fixes #31001 Change-Id: If84719ac22ebb5fb3c42ff96cd32b611ad497414 Reviewed-on: https://go-review.googlesource.com/c/go/+/168562 Run-TryBot: Ilya Tocar TryBot-Result: Gobot Gobot Reviewed-by: Ilya Tocar --- src/cmd/internal/obj/x86/asm6.go | 2 +- ...{issue19518_test.go => pcrelative_test.go} | 33 ++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) rename src/cmd/internal/obj/x86/{issue19518_test.go => pcrelative_test.go} (67%) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index 91a2fc22ff..a81de43845 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -5374,7 +5374,7 @@ func (ab *AsmBuf) asmins(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { if int64(r.Off) < p.Pc { break } - if ab.rexflag != 0 && !ab.vexflag { + if ab.rexflag != 0 && !ab.vexflag && !ab.evexflag { r.Off++ } if r.Type == objabi.R_PCREL { diff --git a/src/cmd/internal/obj/x86/issue19518_test.go b/src/cmd/internal/obj/x86/pcrelative_test.go similarity index 67% rename from src/cmd/internal/obj/x86/issue19518_test.go rename to src/cmd/internal/obj/x86/pcrelative_test.go index 174e2dd846..51b60cf93e 100644 --- a/src/cmd/internal/obj/x86/issue19518_test.go +++ b/src/cmd/internal/obj/x86/pcrelative_test.go @@ -6,6 +6,7 @@ package x86_test import ( "bytes" + "fmt" "internal/testenv" "io/ioutil" "os" @@ -17,7 +18,7 @@ import ( const asmData = ` GLOBL zeros<>(SB),8,$64 TEXT ·testASM(SB),4,$0 -VMOVDQU zeros<>(SB), Y8 // PC relative relocation is off by 1, for Y8-15 +VMOVUPS zeros<>(SB), %s // PC relative relocation is off by 1, for Y8-Y15, Z8-15 and Z24-Z31 RET ` @@ -31,13 +32,13 @@ func main() { } ` -func objdumpOutput(t *testing.T) []byte { - tmpdir, err := ioutil.TempDir("", "19518") +func objdumpOutput(t *testing.T, mname, source string) []byte { + tmpdir, err := ioutil.TempDir("", mname) if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpdir) - err = ioutil.WriteFile(filepath.Join(tmpdir, "go.mod"), []byte("module issue19518\n"), 0666) + err = ioutil.WriteFile(filepath.Join(tmpdir, "go.mod"), []byte(fmt.Sprintf("module %s\n", mname)), 0666) if err != nil { t.Fatal(err) } @@ -46,7 +47,7 @@ func objdumpOutput(t *testing.T) []byte { t.Fatal(err) } defer tmpfile.Close() - _, err = tmpfile.WriteString(asmData) + _, err = tmpfile.WriteString(source) if err != nil { t.Fatal(err) } @@ -85,17 +86,19 @@ func objdumpOutput(t *testing.T) []byte { return objout } -func TestVexPCrelative(t *testing.T) { +func TestVexEvexPCrelative(t *testing.T) { testenv.MustHaveGoBuild(t) - objout := objdumpOutput(t) - data := bytes.Split(objout, []byte("\n")) - for idx := len(data) - 1; idx >= 0; idx-- { - // OBJDUMP doesn't know about VMOVDQU, - // so instead of checking that it was assembled correctly, - // check that RET wasn't overwritten. - if bytes.Index(data[idx], []byte("RET")) != -1 { - return +LOOP: + for _, reg := range []string{"Y0", "Y8", "Z0", "Z8", "Z16", "Z24"} { + asm := fmt.Sprintf(asmData, reg) + objout := objdumpOutput(t, "pcrelative", asm) + data := bytes.Split(objout, []byte("\n")) + for idx := len(data) - 1; idx >= 0; idx-- { + // check that RET wasn't overwritten. + if bytes.Index(data[idx], []byte("RET")) != -1 { + continue LOOP + } } + t.Errorf("VMOVUPS zeros<>(SB), %s overwrote RET", reg) } - t.Fatal("RET was overwritten") } -- GitLab From abefcac10a635c5c6afdeada810f4663e6cb6f17 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 1 Apr 2019 11:58:33 -0700 Subject: [PATCH 0669/1679] cmd/compile: skip escape analysis diagnostics for OADDR For most nodes (e.g., OPTRLIT, OMAKESLICE, OCONVIFACE), escape analysis prints "escapes to heap" or "does not escape" to indicate whether that node's allocation can be heap or stack allocated. These messages are also emitted for OADDR, even though OADDR does not actually allocate anything itself. Moreover, it's redundant because escape analysis already prints "moved to heap" diagnostics when an OADDR node like "&x" causes x to require heap allocation. Because OADDR nodes don't allocate memory, my escape analysis rewrite doesn't naturally emit the "escapes to heap" / "does not escape" diagnostics for them. It's also non-trivial to replicate the exact semantics esc.go uses for OADDR. Since there are so many of these messages, I'm disabling them in this CL by themselves. I modified esc.go to suppress the Warnl calls without any other behavior changes, and then used a shell script to automatically remove any ERROR messages mentioned by run.go in "missing error" or "no match for" lines. Fixes #16300. Updates #23109. Change-Id: I3993e2743c3ff83ccd0893f4e73b366ff8871a57 Reviewed-on: https://go-review.googlesource.com/c/go/+/170319 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang Reviewed-by: David Chase --- src/cmd/compile/internal/gc/esc.go | 4 +- test/closure3.dir/main.go | 6 +- test/escape2.go | 194 ++++++++++++++--------------- test/escape2n.go | 194 ++++++++++++++--------------- test/escape4.go | 12 +- test/escape5.go | 32 ++--- test/escape_array.go | 6 +- test/escape_because.go | 10 +- test/escape_calls.go | 6 +- test/escape_closure.go | 36 +++--- test/escape_field.go | 38 +++--- test/escape_iface.go | 54 ++++---- test/escape_indir.go | 40 +++--- test/escape_level.go | 56 ++++----- test/escape_map.go | 22 ++-- test/escape_param.go | 132 ++++++++++---------- test/escape_slice.go | 22 ++-- test/escape_struct_param1.go | 144 ++++++++++----------- test/escape_struct_param2.go | 138 ++++++++++---------- test/escape_struct_return.go | 24 ++-- test/fixedbugs/issue12006.go | 18 +-- test/fixedbugs/issue12588.go | 28 ++--- test/fixedbugs/issue13799.go | 18 +-- test/fixedbugs/issue19743.go | 4 +- test/fixedbugs/issue21709.go | 4 +- test/fixedbugs/issue4099.go | 4 +- test/fixedbugs/issue7921.go | 12 +- test/inline.go | 6 +- test/inline_sync.go | 10 +- test/live_syscall.go | 8 +- test/uintptrescapes2.go | 4 +- 31 files changed, 643 insertions(+), 643 deletions(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 42ced85ca2..5180a07ce8 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -399,7 +399,7 @@ func escAnalyze(all []*Node, recursive bool) { if Debug['m'] != 0 { for _, n := range e.noesc { - if n.Esc == EscNone { + if n.Esc == EscNone && n.Op != OADDR { Warnl(n.Pos, "%v %S does not escape", e.curfnSym(n), n) } } @@ -1894,7 +1894,7 @@ func (e *EscState) escwalkBody(level Level, dst *Node, src *Node, step *EscStep, } if leaks { src.Esc = EscHeap - if Debug['m'] != 0 && osrcesc != src.Esc { + if Debug['m'] != 0 && osrcesc != src.Esc && src.Op != OADDR { p := src if p.Left.Op == OCLOSURE { p = p.Left // merely to satisfy error messages in tests diff --git a/test/closure3.dir/main.go b/test/closure3.dir/main.go index ae4bef79a6..3ec90139a3 100644 --- a/test/closure3.dir/main.go +++ b/test/closure3.dir/main.go @@ -208,7 +208,7 @@ func main() { func() { // ERROR "func literal does not escape" func() { // ERROR "can inline main.func24" a = 2 - }() // ERROR "inlining call to main.func24" "&a does not escape" + }() // ERROR "inlining call to main.func24" }() if a != 2 { ppanic("a != 2") @@ -220,7 +220,7 @@ func main() { func(b int) { // ERROR "func literal does not escape" func() { // ERROR "can inline main.func25.1" b = 3 - }() // ERROR "inlining call to main.func25.1" "&b does not escape" + }() // ERROR "inlining call to main.func25.1" if b != 3 { ppanic("b != 3") } @@ -272,7 +272,7 @@ func main() { a = a * x b = b * y c = c * z - }(10) // ERROR "inlining call to main.func28.1.1" "&a does not escape" "&b does not escape" "&c does not escape" + }(10) // ERROR "inlining call to main.func28.1.1" return a + c }(100) + b }(1000); r != 2350 { diff --git a/test/escape2.go b/test/escape2.go index a39291e855..a95f89a5cd 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -19,7 +19,7 @@ import ( var gxx *int func foo1(x int) { // ERROR "moved to heap: x$" - gxx = &x // ERROR "&x escapes to heap$" + gxx = &x } func foo2(yy *int) { // ERROR "leaking param: yy$" @@ -27,7 +27,7 @@ func foo2(yy *int) { // ERROR "leaking param: yy$" } func foo3(x int) *int { // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } type T *T @@ -43,7 +43,7 @@ func foo4(xx, yy *int) { // ERROR "foo4 xx does not escape$" "foo4 yy does not e // xx isn't going anywhere, so taking address of yy is ok func foo5(xx **int, yy *int) { // ERROR "foo5 xx does not escape$" "foo5 yy does not escape$" - xx = &yy // ERROR "foo5 &yy does not escape$" + xx = &yy } func foo6(xx **int, yy *int) { // ERROR "foo6 xx does not escape$" "leaking param: yy$" @@ -70,8 +70,8 @@ func foo10(xx, yy *int) { // ERROR "foo10 xx does not escape$" "foo10 yy does no func foo11() int { x, y := 0, 42 - xx := &x // ERROR "foo11 &x does not escape$" - yy := &y // ERROR "foo11 &y does not escape$" + xx := &x + yy := &y *xx = *yy return x } @@ -93,7 +93,7 @@ func foo14(yyy **int) { // ERROR "foo14 yyy does not escape$" } func foo15(yy *int) { // ERROR "moved to heap: yy$" - xxx = &yy // ERROR "&yy escapes to heap$" + xxx = &yy } func foo16(yy *int) { // ERROR "leaking param: yy$" @@ -105,7 +105,7 @@ func foo17(yy *int) { // ERROR "foo17 yy does not escape$" } func foo18(y int) { // ERROR "moved to heap: y$" - *xxx = &y // ERROR "&y escapes to heap$" + *xxx = &y } func foo19(y int) { @@ -134,7 +134,7 @@ func (b *Bar) NoLeak() int { // ERROR "\(\*Bar\).NoLeak b does not escape$" } func (b *Bar) Leak() *int { // ERROR "leaking param: b to result ~r0 level=0$" - return &b.i // ERROR "&b.i escapes to heap$" + return &b.i } func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param: b to result ~r0 level=1$" @@ -147,19 +147,19 @@ func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b to result ~r0 level=0$ func (b Bar) LeaksToo() *int { // ERROR "leaking param: b to result ~r0 level=0$" v := 0 // ERROR "moved to heap: v$" - b.ii = &v // ERROR "&v escapes to heap$" + b.ii = &v return b.ii } func (b *Bar) LeaksABit() *int { // ERROR "leaking param: b to result ~r0 level=1$" v := 0 // ERROR "moved to heap: v$" - b.ii = &v // ERROR "&v escapes to heap$" + b.ii = &v return b.ii } func (b Bar) StillNoLeak() int { // ERROR "Bar.StillNoLeak b does not escape$" v := 0 - b.ii = &v // ERROR "Bar.StillNoLeak &v does not escape$" + b.ii = &v return b.i } @@ -181,7 +181,7 @@ func (b *Bar2) NoLeak() int { // ERROR "\(\*Bar2\).NoLeak b does not escape$" } func (b *Bar2) Leak() []int { // ERROR "leaking param: b to result ~r0 level=0$" - return b.i[:] // ERROR "b.i escapes to heap$" + return b.i[:] } func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param: b to result ~r0 level=1$" @@ -193,12 +193,12 @@ func (b Bar2) AgainNoLeak() [12]int { // ERROR "Bar2.AgainNoLeak b does not esca } func (b *Bar2) LeakSelf() { // ERROR "leaking param: b$" - b.ii = b.i[0:4] // ERROR "b.i escapes to heap$" + b.ii = b.i[0:4] } func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b$" var buf []int - buf = b.i[0:] // ERROR "b.i escapes to heap$" + buf = b.i[0:] b.ii = buf } @@ -212,7 +212,7 @@ func foo21() func() int { func foo21a() func() int { x := 42 // ERROR "moved to heap: x$" return func() int { // ERROR "func literal escapes to heap$" - x++ // ERROR "&x escapes to heap$" + x++ return x } } @@ -239,12 +239,12 @@ func foo23a(x int) func() int { func foo23b(x int) *(func() int) { f := func() int { return x } // ERROR "func literal escapes to heap$" "moved to heap: f$" - return &f // ERROR "&f escapes to heap$" + return &f } func foo23c(x int) func() int { // ERROR "moved to heap: x$" return func() int { // ERROR "func literal escapes to heap$" - x++ // ERROR "&x escapes to heap$" + x++ return x } } @@ -267,11 +267,11 @@ func foonoleak(xx *int) int { // ERROR "foonoleak xx does not escape$" } func foo31(x int) int { // ERROR "moved to heap: x$" - return fooleak(&x) // ERROR "&x escapes to heap$" + return fooleak(&x) } func foo32(x int) int { - return foonoleak(&x) // ERROR "foo32 &x does not escape$" + return foonoleak(&x) } type Foo struct { @@ -299,15 +299,15 @@ func (f *Foo) NoLeak() { // ERROR "\(\*Foo\).NoLeak f does not escape$" } func foo41(x int) { // ERROR "moved to heap: x$" - F.xx = &x // ERROR "&x escapes to heap$" + F.xx = &x } func (f *Foo) foo42(x int) { // ERROR "\(\*Foo\).foo42 f does not escape$" "moved to heap: x$" - f.xx = &x // ERROR "&x escapes to heap$" + f.xx = &x } func foo43(f *Foo, x int) { // ERROR "foo43 f does not escape$" "moved to heap: x$" - f.xx = &x // ERROR "&x escapes to heap$" + f.xx = &x } func foo44(yy *int) { // ERROR "leaking param: yy$" @@ -324,7 +324,7 @@ func (f *Foo) foo46() { // ERROR "leaking param content: f$" } func (f *Foo) foo47() { // ERROR "leaking param: f$" - f.xx = &f.x // ERROR "&f.x escapes to heap$" + f.xx = &f.x } var ptrSlice []*int @@ -340,38 +340,38 @@ func foo51(i *int) { // ERROR "leaking param: i$" } func indaddr1(x int) *int { // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } func indaddr2(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" - return *&x // ERROR "indaddr2 &x does not escape$" + return *&x } func indaddr3(x *int32) *int { // ERROR "leaking param: x to result ~r1 level=0$" - return *(**int)(unsafe.Pointer(&x)) // ERROR "indaddr3 &x does not escape$" + return *(**int)(unsafe.Pointer(&x)) } // From package math: func Float32bits(f float32) uint32 { - return *(*uint32)(unsafe.Pointer(&f)) // ERROR "Float32bits &f does not escape$" + return *(*uint32)(unsafe.Pointer(&f)) } func Float32frombits(b uint32) float32 { - return *(*float32)(unsafe.Pointer(&b)) // ERROR "Float32frombits &b does not escape$" + return *(*float32)(unsafe.Pointer(&b)) } func Float64bits(f float64) uint64 { - return *(*uint64)(unsafe.Pointer(&f)) // ERROR "Float64bits &f does not escape$" + return *(*uint64)(unsafe.Pointer(&f)) } func Float64frombits(b uint64) float64 { - return *(*float64)(unsafe.Pointer(&b)) // ERROR "Float64frombits &b does not escape$" + return *(*float64)(unsafe.Pointer(&b)) } // contrast with func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f$" - return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap$" + return (*uint64)(unsafe.Pointer(&f)) } func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f to result ~r1 level=0$" @@ -384,7 +384,7 @@ func typesw(i interface{}) *int { // ERROR "leaking param: i to result ~r1 level return val case *int8: v := int(*val) // ERROR "moved to heap: v$" - return &v // ERROR "&v escapes to heap$" + return &v } return nil } @@ -501,20 +501,20 @@ func foo71(x *int) []*int { // ERROR "leaking param: x$" func foo71a(x int) []*int { // ERROR "moved to heap: x$" var y []*int - y = append(y, &x) // ERROR "&x escapes to heap$" + y = append(y, &x) return y } func foo72() { var x int var y [1]*int - y[0] = &x // ERROR "foo72 &x does not escape$" + y[0] = &x } func foo72aa() [10]*int { var x int // ERROR "moved to heap: x$" var y [10]*int - y[0] = &x // ERROR "&x escapes to heap$" + y[0] = &x return y } @@ -523,7 +523,7 @@ func foo72a() { for i := 0; i < 10; i++ { // escapes its scope x := i // ERROR "moved to heap: x$" - y[i] = &x // ERROR "&x escapes to heap$" + y[i] = &x } return } @@ -532,7 +532,7 @@ func foo72b() [10]*int { var y [10]*int for i := 0; i < 10; i++ { x := i // ERROR "moved to heap: x$" - y[i] = &x // ERROR "&x escapes to heap$" + y[i] = &x } return y } @@ -555,7 +555,7 @@ func foo731() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope defer func() { // ERROR "func literal escapes to heap$" - vv = 42 // ERROR "&vv escapes to heap$" + vv = 42 println(vv) }() } @@ -579,7 +579,7 @@ func foo74a() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope fn := func() { // ERROR "func literal escapes to heap$" - vv += 1 // ERROR "&vv escapes to heap$" + vv += 1 println(vv) } defer fn() @@ -606,7 +606,7 @@ func foo74c() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope array[i] = func() { // ERROR "func literal escapes to heap$" - println(&vv) // ERROR "&vv escapes to heap$" "foo74c.func1 &vv does not escape$" + println(&vv) } } } @@ -616,7 +616,7 @@ func myprint(y *int, x ...interface{}) *int { // ERROR "leaking param: y to resu } func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "leaking param: x to result ~r2 level=0$" "myprint1 y does not escape$" - return &x[0] // ERROR "&x\[0\] escapes to heap$" + return &x[0] } func foo75(z *int) { // ERROR "foo75 z does not escape$" @@ -703,12 +703,12 @@ func dotdotdot() { } func foo78(z int) *int { // ERROR "moved to heap: z$" - return &z // ERROR "&z escapes to heap$" + return &z } func foo78a(z int) *int { // ERROR "moved to heap: z$" - y := &z // ERROR "&z escapes to heap$" - x := &y // ERROR "foo78a &y does not escape$" + y := &z + x := &y return *x // really return y } @@ -740,12 +740,12 @@ func noop(x, y *int) {} // ERROR "noop x does not escape$" "noop y does not esca func foo82() { var x, y, z int // ERROR "moved to heap: x$" "moved to heap: y$" "moved to heap: z$" - go noop(tee(&z)) // ERROR "&z escapes to heap$" - go noop(&x, &y) // ERROR "&x escapes to heap$" "&y escapes to heap$" + go noop(tee(&z)) + go noop(&x, &y) for { var u, v, w int // ERROR "moved to heap: u$" "moved to heap: v$" "moved to heap: w$" - defer noop(tee(&u)) // ERROR "&u escapes to heap$" - defer noop(&v, &w) // ERROR "&v escapes to heap$" "&w escapes to heap$" + defer noop(tee(&u)) + defer noop(&v, &w) } } @@ -837,7 +837,7 @@ func foo101(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" // does not leak m func foo101a(m [1]*int) *int { // ERROR "foo101a m does not escape$" for i := range m { // ERROR "moved to heap: i$" - return &i // ERROR "&i escapes to heap$" + return &i } return nil } @@ -917,10 +917,10 @@ func foo115(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" func foo116(b bool) *int { if b { x := 1 // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } else { y := 1 // ERROR "moved to heap: y$" - return &y // ERROR "&y escapes to heap$" + return &y } return nil } @@ -932,7 +932,7 @@ func foo117(unknown func(interface{})) { // ERROR "foo117 unknown does not escap func foo118(unknown func(*int)) { // ERROR "foo118 unknown does not escape$" x := 1 // ERROR "moved to heap: x$" - unknown(&x) // ERROR "&x escapes to heap$" + unknown(&x) } func external(*int) @@ -1184,7 +1184,7 @@ L1: func foo124(x **int) { // ERROR "foo124 x does not escape$" var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo124 func literal does not escape$" *x = p // ERROR "leaking closure reference p$" }() @@ -1192,7 +1192,7 @@ func foo124(x **int) { // ERROR "foo124 x does not escape$" func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo125 func literal does not escape$" ch <- p // ERROR "leaking closure reference p$" }() @@ -1204,7 +1204,7 @@ func foo126() { // loopdepth 1 var i int // ERROR "moved to heap: i$" func() { // ERROR "foo126 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i" + px = &i // ERROR "leaking closure reference i" }() } _ = px @@ -1214,21 +1214,21 @@ var px *int func foo127() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i q := p px = q } func foo128() { var i int - p := &i // ERROR "foo128 &i does not escape$" + p := &i q := p _ = q } func foo129() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo129 func literal does not escape$" q := p // ERROR "leaking closure reference p$" func() { // ERROR "foo129.func1 func literal does not escape$" @@ -1242,7 +1242,7 @@ func foo130() { for { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo130 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } } @@ -1250,27 +1250,27 @@ func foo130() { func foo131() { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo131 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo132() { var i int // ERROR "moved to heap: i$" go func() { // ERROR "func literal escapes to heap$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo133() { var i int // ERROR "moved to heap: i$" defer func() { // ERROR "foo133 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo134() { var i int - p := &i // ERROR "foo134 &i does not escape$" + p := &i func() { // ERROR "foo134 func literal does not escape$" q := p func() { // ERROR "foo134.func1 func literal does not escape$" @@ -1282,7 +1282,7 @@ func foo134() { func foo135() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i go func() { // ERROR "func literal escapes to heap$" q := p func() { // ERROR "foo135.func1 func literal does not escape$" @@ -1294,7 +1294,7 @@ func foo135() { func foo136() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i go func() { // ERROR "func literal escapes to heap$" q := p // ERROR "leaking closure reference p$" func() { // ERROR "foo136.func1 func literal does not escape$" @@ -1306,7 +1306,7 @@ func foo136() { func foo137() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo137 func literal does not escape$" q := p // ERROR "leaking closure reference p$" go func() { // ERROR "func literal escapes to heap$" @@ -1321,7 +1321,7 @@ func foo138() *byte { x [1]byte } t := new(T) // ERROR "new\(T\) escapes to heap$" - return &t.x[0] // ERROR "&t.x\[0\] escapes to heap$" + return &t.x[0] } func foo139() *byte { @@ -1331,7 +1331,7 @@ func foo139() *byte { } } t := new(T) // ERROR "new\(T\) escapes to heap$" - return &t.x.y // ERROR "&t.x.y escapes to heap$" + return &t.x.y } // issue 4751 @@ -1364,16 +1364,16 @@ func F4(x []byte) func G() { var buf1 [10]byte - F1(buf1[:]) // ERROR "G buf1 does not escape$" + F1(buf1[:]) var buf2 [10]byte // ERROR "moved to heap: buf2$" - F2(buf2[:]) // ERROR "buf2 escapes to heap$" + F2(buf2[:]) var buf3 [10]byte - F3(buf3[:]) // ERROR "G buf3 does not escape$" + F3(buf3[:]) var buf4 [10]byte // ERROR "moved to heap: buf4$" - F4(buf4[:]) // ERROR "buf4 escapes to heap$" + F4(buf4[:]) } type Tm struct { @@ -1404,7 +1404,7 @@ func foo143() { func() { // ERROR "foo143 func literal does not escape$" for i := 0; i < 1; i++ { var t Tm - t.M() // ERROR "foo143.func1 t does not escape$" + t.M() } }() } @@ -1420,9 +1420,9 @@ func foo144a(*int) func foo144() { var x int - foo144a(&x) // ERROR "foo144 &x does not escape$" + foo144a(&x) var y int - foo144b(&y) // ERROR "foo144 &y does not escape$" + foo144b(&y) } //go:noescape @@ -1437,27 +1437,27 @@ type List struct { func foo145(l List) { // ERROR "foo145 l does not escape$" var p *List - for p = &l; p.Next != nil; p = p.Next { // ERROR "foo145 &l does not escape$" + for p = &l; p.Next != nil; p = p.Next { } } func foo146(l List) { // ERROR "foo146 l does not escape$" var p *List - p = &l // ERROR "foo146 &l does not escape$" + p = &l for ; p.Next != nil; p = p.Next { } } func foo147(l List) { // ERROR "foo147 l does not escape$" var p *List - p = &l // ERROR "foo147 &l does not escape$" + p = &l for p.Next != nil { p = p.Next } } func foo148(l List) { // ERROR "foo148 l does not escape$" - for p := &l; p.Next != nil; p = p.Next { // ERROR "foo148 &l does not escape$" + for p := &l; p.Next != nil; p = p.Next { } } @@ -1466,7 +1466,7 @@ func foo148(l List) { // ERROR "foo148 l does not escape$" func foo149(l List) { // ERROR "foo149 l does not escape$" var p *List for { - for p = &l; p.Next != nil; p = p.Next { // ERROR "foo149 &l does not escape$" + for p = &l; p.Next != nil; p = p.Next { } } } @@ -1494,25 +1494,25 @@ func foo151(x *int) { // ERROR "leaking param: x$" func bar151() { var a [64]int // ERROR "moved to heap: a$" a[4] = 101 - foo151(&(&a)[4:8][0]) // ERROR "&\(&a\)\[4:8\]\[0\] escapes to heap$" "&a escapes to heap$" + foo151(&(&a)[4:8][0]) } func bar151b() { var a [10]int // ERROR "moved to heap: a$" - b := a[:] // ERROR "a escapes to heap$" - foo151(&b[4:8][0]) // ERROR "&b\[4:8\]\[0\] escapes to heap$" + b := a[:] + foo151(&b[4:8][0]) } func bar151c() { var a [64]int // ERROR "moved to heap: a$" a[4] = 101 - foo151(&(&a)[4:8:8][0]) // ERROR "&\(&a\)\[4:8:8\]\[0\] escapes to heap$" "&a escapes to heap$" + foo151(&(&a)[4:8:8][0]) } func bar151d() { var a [10]int // ERROR "moved to heap: a$" - b := a[:] // ERROR "a escapes to heap$" - foo151(&b[4:8:8][0]) // ERROR "&b\[4:8:8\]\[0\] escapes to heap$" + b := a[:] + foo151(&b[4:8:8][0]) } // issue 8120 @@ -1531,12 +1531,12 @@ type V struct { // BAD -- level of leak ought to be 0 func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" - return &V{u.String()} // ERROR "&V literal escapes to heap$" "NewV u does not escape" + return &V{u.String()} // ERROR "&V literal escapes to heap$" } func foo152() { a := "a" // ERROR "moved to heap: a$" - u := U{&a} // ERROR "&a escapes to heap$" + u := U{&a} v := NewV(u) println(v) } @@ -1546,7 +1546,7 @@ func foo152() { func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" switch x := v.(type) { case int: // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } panic(0) } @@ -1554,7 +1554,7 @@ func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level // issue 8185 - &result escaping into result func f() (x int, y *int) { // ERROR "moved to heap: x$" - y = &x // ERROR "&x escapes to heap$" + y = &x return } @@ -1572,21 +1572,21 @@ type Lit struct { func ptrlitNoescape() { // Both literal and element do not escape. i := 0 - x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" "ptrlitNoescape &i does not escape$" + x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" _ = x } func ptrlitNoEscape2() { // Literal does not escape, but element does. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&i escapes to heap$" "ptrlitNoEscape2 &Lit literal does not escape$" + x := &Lit{&i} // ERROR "ptrlitNoEscape2 &Lit literal does not escape$" sink = *x // ERROR "\*x escapes to heap$" } func ptrlitEscape() { // Both literal and element escape. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" "&i escapes to heap$" + x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" sink = x // ERROR "x escapes to heap$" } @@ -1609,7 +1609,7 @@ func (b *Buffer) foo() { // ERROR "\(\*Buffer\).foo b does not escape$" } func (b *Buffer) bar() { // ERROR "leaking param: b$" - b.buf1 = b.arr[1:2] // ERROR "b.arr escapes to heap$" + b.buf1 = b.arr[1:2] } func (b *Buffer) arrayPtr() { // ERROR "\(\*Buffer\).arrayPtr b does not escape" @@ -1644,7 +1644,7 @@ type StructWithString struct { func fieldFlowTracking() { var x StructWithString i := 0 // ERROR "moved to heap: i$" - x.p = &i // ERROR "&i escapes to heap$" + x.p = &i sink = x.s // ERROR "x.s escapes to heap$" } @@ -1836,11 +1836,11 @@ func issue12397(x, y int) { // ERROR "moved to heap: y$" if false { gxx = &x } else { - gxx = &y // ERROR "&y escapes to heap$" + gxx = &y } if true { - gxx = &y // ERROR "&y escapes to heap$" + gxx = &y } else { gxx = &x } diff --git a/test/escape2n.go b/test/escape2n.go index 989cf18d35..bb29eea732 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -19,7 +19,7 @@ import ( var gxx *int func foo1(x int) { // ERROR "moved to heap: x$" - gxx = &x // ERROR "&x escapes to heap$" + gxx = &x } func foo2(yy *int) { // ERROR "leaking param: yy$" @@ -27,7 +27,7 @@ func foo2(yy *int) { // ERROR "leaking param: yy$" } func foo3(x int) *int { // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } type T *T @@ -43,7 +43,7 @@ func foo4(xx, yy *int) { // ERROR "foo4 xx does not escape$" "foo4 yy does not e // xx isn't going anywhere, so taking address of yy is ok func foo5(xx **int, yy *int) { // ERROR "foo5 xx does not escape$" "foo5 yy does not escape$" - xx = &yy // ERROR "foo5 &yy does not escape$" + xx = &yy } func foo6(xx **int, yy *int) { // ERROR "foo6 xx does not escape$" "leaking param: yy$" @@ -70,8 +70,8 @@ func foo10(xx, yy *int) { // ERROR "foo10 xx does not escape$" "foo10 yy does no func foo11() int { x, y := 0, 42 - xx := &x // ERROR "foo11 &x does not escape$" - yy := &y // ERROR "foo11 &y does not escape$" + xx := &x + yy := &y *xx = *yy return x } @@ -93,7 +93,7 @@ func foo14(yyy **int) { // ERROR "foo14 yyy does not escape$" } func foo15(yy *int) { // ERROR "moved to heap: yy$" - xxx = &yy // ERROR "&yy escapes to heap$" + xxx = &yy } func foo16(yy *int) { // ERROR "leaking param: yy$" @@ -105,7 +105,7 @@ func foo17(yy *int) { // ERROR "foo17 yy does not escape$" } func foo18(y int) { // ERROR "moved to heap: y$" - *xxx = &y // ERROR "&y escapes to heap$" + *xxx = &y } func foo19(y int) { @@ -134,7 +134,7 @@ func (b *Bar) NoLeak() int { // ERROR "\(\*Bar\).NoLeak b does not escape$" } func (b *Bar) Leak() *int { // ERROR "leaking param: b to result ~r0 level=0$" - return &b.i // ERROR "&b.i escapes to heap$" + return &b.i } func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param: b to result ~r0 level=1$" @@ -147,19 +147,19 @@ func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b to result ~r0 level=0$ func (b Bar) LeaksToo() *int { // ERROR "leaking param: b to result ~r0 level=0$" v := 0 // ERROR "moved to heap: v$" - b.ii = &v // ERROR "&v escapes to heap$" + b.ii = &v return b.ii } func (b *Bar) LeaksABit() *int { // ERROR "leaking param: b to result ~r0 level=1$" v := 0 // ERROR "moved to heap: v$" - b.ii = &v // ERROR "&v escapes to heap$" + b.ii = &v return b.ii } func (b Bar) StillNoLeak() int { // ERROR "Bar.StillNoLeak b does not escape$" v := 0 - b.ii = &v // ERROR "Bar.StillNoLeak &v does not escape$" + b.ii = &v return b.i } @@ -181,7 +181,7 @@ func (b *Bar2) NoLeak() int { // ERROR "\(\*Bar2\).NoLeak b does not escape$" } func (b *Bar2) Leak() []int { // ERROR "leaking param: b to result ~r0 level=0$" - return b.i[:] // ERROR "b.i escapes to heap$" + return b.i[:] } func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param: b to result ~r0 level=1$" @@ -193,12 +193,12 @@ func (b Bar2) AgainNoLeak() [12]int { // ERROR "Bar2.AgainNoLeak b does not esca } func (b *Bar2) LeakSelf() { // ERROR "leaking param: b$" - b.ii = b.i[0:4] // ERROR "b.i escapes to heap$" + b.ii = b.i[0:4] } func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b$" var buf []int - buf = b.i[0:] // ERROR "b.i escapes to heap$" + buf = b.i[0:] b.ii = buf } @@ -212,7 +212,7 @@ func foo21() func() int { func foo21a() func() int { x := 42 // ERROR "moved to heap: x$" return func() int { // ERROR "func literal escapes to heap$" - x++ // ERROR "&x escapes to heap$" + x++ return x } } @@ -239,12 +239,12 @@ func foo23a(x int) func() int { func foo23b(x int) *(func() int) { f := func() int { return x } // ERROR "func literal escapes to heap$" "moved to heap: f$" - return &f // ERROR "&f escapes to heap$" + return &f } func foo23c(x int) func() int { // ERROR "moved to heap: x$" return func() int { // ERROR "func literal escapes to heap$" - x++ // ERROR "&x escapes to heap$" + x++ return x } } @@ -267,11 +267,11 @@ func foonoleak(xx *int) int { // ERROR "foonoleak xx does not escape$" } func foo31(x int) int { // ERROR "moved to heap: x$" - return fooleak(&x) // ERROR "&x escapes to heap$" + return fooleak(&x) } func foo32(x int) int { - return foonoleak(&x) // ERROR "foo32 &x does not escape$" + return foonoleak(&x) } type Foo struct { @@ -299,15 +299,15 @@ func (f *Foo) NoLeak() { // ERROR "\(\*Foo\).NoLeak f does not escape$" } func foo41(x int) { // ERROR "moved to heap: x$" - F.xx = &x // ERROR "&x escapes to heap$" + F.xx = &x } func (f *Foo) foo42(x int) { // ERROR "\(\*Foo\).foo42 f does not escape$" "moved to heap: x$" - f.xx = &x // ERROR "&x escapes to heap$" + f.xx = &x } func foo43(f *Foo, x int) { // ERROR "foo43 f does not escape$" "moved to heap: x$" - f.xx = &x // ERROR "&x escapes to heap$" + f.xx = &x } func foo44(yy *int) { // ERROR "leaking param: yy$" @@ -324,7 +324,7 @@ func (f *Foo) foo46() { // ERROR "leaking param content: f$" } func (f *Foo) foo47() { // ERROR "leaking param: f$" - f.xx = &f.x // ERROR "&f.x escapes to heap$" + f.xx = &f.x } var ptrSlice []*int @@ -340,38 +340,38 @@ func foo51(i *int) { // ERROR "leaking param: i$" } func indaddr1(x int) *int { // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } func indaddr2(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" - return *&x // ERROR "indaddr2 &x does not escape$" + return *&x } func indaddr3(x *int32) *int { // ERROR "leaking param: x to result ~r1 level=0$" - return *(**int)(unsafe.Pointer(&x)) // ERROR "indaddr3 &x does not escape$" + return *(**int)(unsafe.Pointer(&x)) } // From package math: func Float32bits(f float32) uint32 { - return *(*uint32)(unsafe.Pointer(&f)) // ERROR "Float32bits &f does not escape$" + return *(*uint32)(unsafe.Pointer(&f)) } func Float32frombits(b uint32) float32 { - return *(*float32)(unsafe.Pointer(&b)) // ERROR "Float32frombits &b does not escape$" + return *(*float32)(unsafe.Pointer(&b)) } func Float64bits(f float64) uint64 { - return *(*uint64)(unsafe.Pointer(&f)) // ERROR "Float64bits &f does not escape$" + return *(*uint64)(unsafe.Pointer(&f)) } func Float64frombits(b uint64) float64 { - return *(*float64)(unsafe.Pointer(&b)) // ERROR "Float64frombits &b does not escape$" + return *(*float64)(unsafe.Pointer(&b)) } // contrast with func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f$" - return (*uint64)(unsafe.Pointer(&f)) // ERROR "&f escapes to heap$" + return (*uint64)(unsafe.Pointer(&f)) } func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f to result ~r1 level=0$" @@ -384,7 +384,7 @@ func typesw(i interface{}) *int { // ERROR "leaking param: i to result ~r1 level return val case *int8: v := int(*val) // ERROR "moved to heap: v$" - return &v // ERROR "&v escapes to heap$" + return &v } return nil } @@ -501,20 +501,20 @@ func foo71(x *int) []*int { // ERROR "leaking param: x$" func foo71a(x int) []*int { // ERROR "moved to heap: x$" var y []*int - y = append(y, &x) // ERROR "&x escapes to heap$" + y = append(y, &x) return y } func foo72() { var x int var y [1]*int - y[0] = &x // ERROR "foo72 &x does not escape$" + y[0] = &x } func foo72aa() [10]*int { var x int // ERROR "moved to heap: x$" var y [10]*int - y[0] = &x // ERROR "&x escapes to heap$" + y[0] = &x return y } @@ -523,7 +523,7 @@ func foo72a() { for i := 0; i < 10; i++ { // escapes its scope x := i // ERROR "moved to heap: x$" - y[i] = &x // ERROR "&x escapes to heap$" + y[i] = &x } return } @@ -532,7 +532,7 @@ func foo72b() [10]*int { var y [10]*int for i := 0; i < 10; i++ { x := i // ERROR "moved to heap: x$" - y[i] = &x // ERROR "&x escapes to heap$" + y[i] = &x } return y } @@ -555,7 +555,7 @@ func foo731() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope defer func() { // ERROR "func literal escapes to heap$" - vv = 42 // ERROR "&vv escapes to heap$" + vv = 42 println(vv) }() } @@ -579,7 +579,7 @@ func foo74a() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope fn := func() { // ERROR "func literal escapes to heap$" - vv += 1 // ERROR "&vv escapes to heap$" + vv += 1 println(vv) } defer fn() @@ -606,7 +606,7 @@ func foo74c() { vv := v // ERROR "moved to heap: vv$" // actually just escapes its scope array[i] = func() { // ERROR "func literal escapes to heap$" - println(&vv) // ERROR "&vv escapes to heap$" "foo74c.func1 &vv does not escape$" + println(&vv) } } } @@ -616,7 +616,7 @@ func myprint(y *int, x ...interface{}) *int { // ERROR "leaking param: y to resu } func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "leaking param: x to result ~r2 level=0$" "myprint1 y does not escape$" - return &x[0] // ERROR "&x\[0\] escapes to heap$" + return &x[0] } func foo75(z *int) { // ERROR "foo75 z does not escape$" @@ -703,12 +703,12 @@ func dotdotdot() { } func foo78(z int) *int { // ERROR "moved to heap: z$" - return &z // ERROR "&z escapes to heap$" + return &z } func foo78a(z int) *int { // ERROR "moved to heap: z$" - y := &z // ERROR "&z escapes to heap$" - x := &y // ERROR "foo78a &y does not escape$" + y := &z + x := &y return *x // really return y } @@ -740,12 +740,12 @@ func noop(x, y *int) {} // ERROR "noop x does not escape$" "noop y does not esca func foo82() { var x, y, z int // ERROR "moved to heap: x$" "moved to heap: y$" "moved to heap: z$" - go noop(tee(&z)) // ERROR "&z escapes to heap$" - go noop(&x, &y) // ERROR "&x escapes to heap$" "&y escapes to heap$" + go noop(tee(&z)) + go noop(&x, &y) for { var u, v, w int // ERROR "moved to heap: u$" "moved to heap: v$" "moved to heap: w$" - defer noop(tee(&u)) // ERROR "&u escapes to heap$" - defer noop(&v, &w) // ERROR "&v escapes to heap$" "&w escapes to heap$" + defer noop(tee(&u)) + defer noop(&v, &w) } } @@ -837,7 +837,7 @@ func foo101(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" // does not leak m func foo101a(m [1]*int) *int { // ERROR "foo101a m does not escape$" for i := range m { // ERROR "moved to heap: i$" - return &i // ERROR "&i escapes to heap$" + return &i } return nil } @@ -917,10 +917,10 @@ func foo115(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" func foo116(b bool) *int { if b { x := 1 // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } else { y := 1 // ERROR "moved to heap: y$" - return &y // ERROR "&y escapes to heap$" + return &y } return nil } @@ -932,7 +932,7 @@ func foo117(unknown func(interface{})) { // ERROR "foo117 unknown does not escap func foo118(unknown func(*int)) { // ERROR "foo118 unknown does not escape$" x := 1 // ERROR "moved to heap: x$" - unknown(&x) // ERROR "&x escapes to heap$" + unknown(&x) } func external(*int) @@ -1184,7 +1184,7 @@ L1: func foo124(x **int) { // ERROR "foo124 x does not escape$" var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo124 func literal does not escape$" *x = p // ERROR "leaking closure reference p$" }() @@ -1192,7 +1192,7 @@ func foo124(x **int) { // ERROR "foo124 x does not escape$" func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo125 func literal does not escape$" ch <- p // ERROR "leaking closure reference p$" }() @@ -1204,7 +1204,7 @@ func foo126() { // loopdepth 1 var i int // ERROR "moved to heap: i$" func() { // ERROR "foo126 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i" + px = &i // ERROR "leaking closure reference i" }() } _ = px @@ -1214,21 +1214,21 @@ var px *int func foo127() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i q := p px = q } func foo128() { var i int - p := &i // ERROR "foo128 &i does not escape$" + p := &i q := p _ = q } func foo129() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo129 func literal does not escape$" q := p // ERROR "leaking closure reference p$" func() { // ERROR "foo129.func1 func literal does not escape$" @@ -1242,7 +1242,7 @@ func foo130() { for { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo130 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } } @@ -1250,27 +1250,27 @@ func foo130() { func foo131() { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo131 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo132() { var i int // ERROR "moved to heap: i$" go func() { // ERROR "func literal escapes to heap$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo133() { var i int // ERROR "moved to heap: i$" defer func() { // ERROR "foo133 func literal does not escape$" - px = &i // ERROR "&i escapes to heap$" "leaking closure reference i$" + px = &i // ERROR "leaking closure reference i$" }() } func foo134() { var i int - p := &i // ERROR "foo134 &i does not escape$" + p := &i func() { // ERROR "foo134 func literal does not escape$" q := p func() { // ERROR "foo134.func1 func literal does not escape$" @@ -1282,7 +1282,7 @@ func foo134() { func foo135() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i go func() { // ERROR "func literal escapes to heap$" q := p func() { // ERROR "foo135.func1 func literal does not escape$" @@ -1294,7 +1294,7 @@ func foo135() { func foo136() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i go func() { // ERROR "func literal escapes to heap$" q := p // ERROR "leaking closure reference p$" func() { // ERROR "foo136.func1 func literal does not escape$" @@ -1306,7 +1306,7 @@ func foo136() { func foo137() { var i int // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" + p := &i func() { // ERROR "foo137 func literal does not escape$" q := p // ERROR "leaking closure reference p$" go func() { // ERROR "func literal escapes to heap$" @@ -1321,7 +1321,7 @@ func foo138() *byte { x [1]byte } t := new(T) // ERROR "new\(T\) escapes to heap$" - return &t.x[0] // ERROR "&t.x\[0\] escapes to heap$" + return &t.x[0] } func foo139() *byte { @@ -1331,7 +1331,7 @@ func foo139() *byte { } } t := new(T) // ERROR "new\(T\) escapes to heap$" - return &t.x.y // ERROR "&t.x.y escapes to heap$" + return &t.x.y } // issue 4751 @@ -1364,16 +1364,16 @@ func F4(x []byte) func G() { var buf1 [10]byte - F1(buf1[:]) // ERROR "G buf1 does not escape$" + F1(buf1[:]) var buf2 [10]byte // ERROR "moved to heap: buf2$" - F2(buf2[:]) // ERROR "buf2 escapes to heap$" + F2(buf2[:]) var buf3 [10]byte - F3(buf3[:]) // ERROR "G buf3 does not escape$" + F3(buf3[:]) var buf4 [10]byte // ERROR "moved to heap: buf4$" - F4(buf4[:]) // ERROR "buf4 escapes to heap$" + F4(buf4[:]) } type Tm struct { @@ -1404,7 +1404,7 @@ func foo143() { func() { // ERROR "foo143 func literal does not escape$" for i := 0; i < 1; i++ { var t Tm - t.M() // ERROR "foo143.func1 t does not escape$" + t.M() } }() } @@ -1420,9 +1420,9 @@ func foo144a(*int) func foo144() { var x int - foo144a(&x) // ERROR "foo144 &x does not escape$" + foo144a(&x) var y int - foo144b(&y) // ERROR "foo144 &y does not escape$" + foo144b(&y) } //go:noescape @@ -1437,27 +1437,27 @@ type List struct { func foo145(l List) { // ERROR "foo145 l does not escape$" var p *List - for p = &l; p.Next != nil; p = p.Next { // ERROR "foo145 &l does not escape$" + for p = &l; p.Next != nil; p = p.Next { } } func foo146(l List) { // ERROR "foo146 l does not escape$" var p *List - p = &l // ERROR "foo146 &l does not escape$" + p = &l for ; p.Next != nil; p = p.Next { } } func foo147(l List) { // ERROR "foo147 l does not escape$" var p *List - p = &l // ERROR "foo147 &l does not escape$" + p = &l for p.Next != nil { p = p.Next } } func foo148(l List) { // ERROR "foo148 l does not escape$" - for p := &l; p.Next != nil; p = p.Next { // ERROR "foo148 &l does not escape$" + for p := &l; p.Next != nil; p = p.Next { } } @@ -1466,7 +1466,7 @@ func foo148(l List) { // ERROR "foo148 l does not escape$" func foo149(l List) { // ERROR "foo149 l does not escape$" var p *List for { - for p = &l; p.Next != nil; p = p.Next { // ERROR "foo149 &l does not escape$" + for p = &l; p.Next != nil; p = p.Next { } } } @@ -1494,25 +1494,25 @@ func foo151(x *int) { // ERROR "leaking param: x$" func bar151() { var a [64]int // ERROR "moved to heap: a$" a[4] = 101 - foo151(&(&a)[4:8][0]) // ERROR "&\(&a\)\[4:8\]\[0\] escapes to heap$" "&a escapes to heap$" + foo151(&(&a)[4:8][0]) } func bar151b() { var a [10]int // ERROR "moved to heap: a$" - b := a[:] // ERROR "a escapes to heap$" - foo151(&b[4:8][0]) // ERROR "&b\[4:8\]\[0\] escapes to heap$" + b := a[:] + foo151(&b[4:8][0]) } func bar151c() { var a [64]int // ERROR "moved to heap: a$" a[4] = 101 - foo151(&(&a)[4:8:8][0]) // ERROR "&\(&a\)\[4:8:8\]\[0\] escapes to heap$" "&a escapes to heap$" + foo151(&(&a)[4:8:8][0]) } func bar151d() { var a [10]int // ERROR "moved to heap: a$" - b := a[:] // ERROR "a escapes to heap$" - foo151(&b[4:8:8][0]) // ERROR "&b\[4:8:8\]\[0\] escapes to heap$" + b := a[:] + foo151(&b[4:8:8][0]) } // issue 8120 @@ -1531,12 +1531,12 @@ type V struct { // BAD -- level of leak ought to be 0 func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" - return &V{u.String()} // ERROR "&V literal escapes to heap$" "NewV u does not escape" + return &V{u.String()} // ERROR "&V literal escapes to heap$" } func foo152() { a := "a" // ERROR "moved to heap: a$" - u := U{&a} // ERROR "&a escapes to heap$" + u := U{&a} v := NewV(u) println(v) } @@ -1546,7 +1546,7 @@ func foo152() { func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" switch x := v.(type) { case int: // ERROR "moved to heap: x$" - return &x // ERROR "&x escapes to heap$" + return &x } panic(0) } @@ -1554,7 +1554,7 @@ func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level // issue 8185 - &result escaping into result func f() (x int, y *int) { // ERROR "moved to heap: x$" - y = &x // ERROR "&x escapes to heap$" + y = &x return } @@ -1572,21 +1572,21 @@ type Lit struct { func ptrlitNoescape() { // Both literal and element do not escape. i := 0 - x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" "ptrlitNoescape &i does not escape$" + x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" _ = x } func ptrlitNoEscape2() { // Literal does not escape, but element does. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&i escapes to heap$" "ptrlitNoEscape2 &Lit literal does not escape$" + x := &Lit{&i} // ERROR "ptrlitNoEscape2 &Lit literal does not escape$" sink = *x // ERROR "\*x escapes to heap$" } func ptrlitEscape() { // Both literal and element escape. i := 0 // ERROR "moved to heap: i$" - x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" "&i escapes to heap$" + x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" sink = x // ERROR "x escapes to heap$" } @@ -1609,7 +1609,7 @@ func (b *Buffer) foo() { // ERROR "\(\*Buffer\).foo b does not escape$" } func (b *Buffer) bar() { // ERROR "leaking param: b$" - b.buf1 = b.arr[1:2] // ERROR "b.arr escapes to heap$" + b.buf1 = b.arr[1:2] } func (b *Buffer) arrayPtr() { // ERROR "\(\*Buffer\).arrayPtr b does not escape" @@ -1644,7 +1644,7 @@ type StructWithString struct { func fieldFlowTracking() { var x StructWithString i := 0 // ERROR "moved to heap: i$" - x.p = &i // ERROR "&i escapes to heap$" + x.p = &i sink = x.s // ERROR "x.s escapes to heap$" } @@ -1836,11 +1836,11 @@ func issue12397(x, y int) { // ERROR "moved to heap: y$" if false { gxx = &x } else { - gxx = &y // ERROR "&y escapes to heap$" + gxx = &y } if true { - gxx = &y // ERROR "&y escapes to heap$" + gxx = &y } else { gxx = &x } diff --git a/test/escape4.go b/test/escape4.go index 0fe3305397..a4a9c14a3e 100644 --- a/test/escape4.go +++ b/test/escape4.go @@ -12,22 +12,22 @@ package foo var p *int func alloc(x int) *int { // ERROR "can inline alloc" "moved to heap: x" - return &x // ERROR "&x escapes to heap" + return &x } var f func() func f1() { - p = alloc(2) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x" + p = alloc(2) // ERROR "inlining call to alloc" "moved to heap: x" // Escape analysis used to miss inlined code in closures. func() { // ERROR "can inline f1.func1" p = alloc(3) // ERROR "inlining call to alloc" - }() // ERROR "inlining call to f1.func1" "inlining call to alloc" "&x escapes to heap" "moved to heap: x" + }() // ERROR "inlining call to f1.func1" "inlining call to alloc" "moved to heap: x" f = func() { // ERROR "func literal escapes to heap" "can inline f1.func2" - p = alloc(3) // ERROR "inlining call to alloc" "&x escapes to heap" "moved to heap: x" + p = alloc(3) // ERROR "inlining call to alloc" "moved to heap: x" } f() } @@ -43,7 +43,7 @@ func f5() *byte { x [1]byte } t := new(T) // ERROR "new.T. escapes to heap" - return &t.x[0] // ERROR "&t.x.0. escapes to heap" + return &t.x[0] } func f6() *byte { @@ -53,5 +53,5 @@ func f6() *byte { } } t := new(T) // ERROR "new.T. escapes to heap" - return &t.x.y // ERROR "&t.x.y escapes to heap" + return &t.x.y } diff --git a/test/escape5.go b/test/escape5.go index e26ecd5275..4dbe89f313 100644 --- a/test/escape5.go +++ b/test/escape5.go @@ -60,37 +60,37 @@ func leaktosink(p *int) *int { // ERROR "leaking param: p" func f1() { var x int - p := noleak(&x) // ERROR "&x does not escape" + p := noleak(&x) _ = p } func f2() { var x int - p := leaktoret(&x) // ERROR "&x does not escape" + p := leaktoret(&x) _ = p } func f3() { var x int // ERROR "moved to heap: x" - p := leaktoret(&x) // ERROR "&x escapes to heap" + p := leaktoret(&x) gp = p } func f4() { var x int // ERROR "moved to heap: x" - p, q := leaktoret2(&x) // ERROR "&x escapes to heap" + p, q := leaktoret2(&x) gp = p gp = q } func f5() { var x int - leaktoret22(leaktoret2(&x)) // ERROR "&x does not escape" + leaktoret22(leaktoret2(&x)) } func f6() { var x int // ERROR "moved to heap: x" - px1, px2 := leaktoret22(leaktoret2(&x)) // ERROR "&x escapes to heap" + px1, px2 := leaktoret22(leaktoret2(&x)) gp = px1 _ = px2 } @@ -142,7 +142,7 @@ func f8(p *T1) (k T2) { // ERROR "leaking param: p to result k" "leaking param: func f9() { var j T1 // ERROR "moved to heap: j" - f8(&j) // ERROR "&j escapes to heap" + f8(&j) } func f10() { @@ -159,8 +159,8 @@ func f12(_ **int) { } func f13() { var x *int - f11(&x) // ERROR "&x does not escape" - f12(&x) // ERROR "&x does not escape" + f11(&x) + f12(&x) runtime.KeepAlive(&x) // ERROR "&x does not escape" } @@ -172,8 +172,8 @@ func (_ *U) N() {} func _() { var u U - u.M() // ERROR "u does not escape" - u.N() // ERROR "u does not escape" + u.M() + u.N() } // Issue 24730: taking address in a loop causes unnecessary escape @@ -182,15 +182,15 @@ type T24730 struct { } func (t *T24730) g() { // ERROR "t does not escape" - y := t.x[:] // ERROR "t\.x does not escape" - for i := range t.x[:] { // ERROR "t\.x does not escape" - y = t.x[:] // ERROR "t\.x does not escape" + y := t.x[:] + for i := range t.x[:] { + y = t.x[:] y[i] = 1 } var z *byte - for i := range t.x[:] { // ERROR "t\.x does not escape" - z = &t.x[i] // ERROR "t\.x\[i\] does not escape" + for i := range t.x[:] { + z = &t.x[i] *z = 2 } } diff --git a/test/escape_array.go b/test/escape_array.go index c2c3e2c857..231186ca1f 100644 --- a/test/escape_array.go +++ b/test/escape_array.go @@ -27,16 +27,16 @@ func bff(a, b *string) U { // ERROR "leaking param: a to result ~r2 level=0$" "l func tbff1() *string { a := "cat" b := "dog" // ERROR "moved to heap: b$" - u := bff(&a, &b) // ERROR "tbff1 &a does not escape$" "tbff1 &b does not escape$" + u := bff(&a, &b) _ = u[0] - return &b // ERROR "&b escapes to heap$" + return &b } // BAD: need fine-grained analysis to track u[0] and u[1] differently. func tbff2() *string { a := "cat" // ERROR "moved to heap: a$" b := "dog" // ERROR "moved to heap: b$" - u := bff(&a, &b) // ERROR "&a escapes to heap$" "&b escapes to heap$" + u := bff(&a, &b) _ = u[0] return u[1] } diff --git a/test/escape_because.go b/test/escape_because.go index 64fa28ddda..7ba5d679a1 100644 --- a/test/escape_because.go +++ b/test/escape_because.go @@ -40,7 +40,7 @@ func f2(q *int) { // ERROR "from &u \(address-of\) at escape_because.go:43$" "fr s := q t := pair{s, nil} u := t // ERROR "moved to heap: u$" - sink = &u // ERROR "&u escapes to heap$" "from &u \(interface-converted\) at escape_because.go:43$" "from sink \(assigned to top level variable\) at escape_because.go:43$" + sink = &u // ERROR "&u escapes to heap$" "from sink \(assigned to top level variable\) at escape_because.go:43$" } func f3(r *int) interface{} { // ERROR "from \[\]\*int literal \(slice-literal-element\) at escape_because.go:47$" "from c \(assigned\) at escape_because.go:47$" "from c \(interface-converted\) at escape_because.go:48$" "from ~r1 \(return\) at escape_because.go:48$" "leaking param: r" @@ -78,7 +78,7 @@ func f8(x int, y *int) *int { // ERROR "from ~r2 \(return\) at escape_because.go return y } x-- - return f8(*y, &x) // ERROR "&x escapes to heap$" "from y \(arg to recursive call\) at escape_because.go:81$" "from ~r2 \(return\) at escape_because.go:78$" "from ~r2 \(returned from recursive function\) at escape_because.go:76$" + return f8(*y, &x) } func f9(x int, y ...*int) *int { // ERROR "from y\[0\] \(dot of pointer\) at escape_because.go:86$" "from ~r2 \(return\) at escape_because.go:86$" "from ~r2 \(returned from recursive function\) at escape_because.go:84$" "leaking param content: y$" "leaking param: y to result ~r2 level=1$" "moved to heap: x$" @@ -86,7 +86,7 @@ func f9(x int, y ...*int) *int { // ERROR "from y\[0\] \(dot of pointer\) at esc return y[0] } x-- - return f9(*y[0], &x) // ERROR "&x escapes to heap$" "f9 ... argument does not escape$" "from ... argument \(... arg to recursive call\) at escape_because.go:89$" + return f9(*y[0], &x) // ERROR "f9 ... argument does not escape$" } func f10(x map[*int]*int, y, z *int) *int { // ERROR "f10 x does not escape$" "from x\[y\] \(key of map put\) at escape_because.go:93$" "from x\[y\] \(value of map put\) at escape_because.go:93$" "leaking param: y$" "leaking param: z$" @@ -132,14 +132,14 @@ func leakThroughOAS2() { // See #26987. i := 0 // ERROR "moved to heap: i$" j := 0 // ERROR "moved to heap: j$" - sink, sink = &i, &j // ERROR "&i escapes to heap$" "from sink \(assign-pair\) at escape_because.go:135$" "from &i \(interface-converted\) at escape_because.go:135$" "&j escapes to heap$" "from &j \(interface-converted\) at escape_because.go:135" + sink, sink = &i, &j // ERROR "&i escapes to heap$" "from sink \(assign-pair\) at escape_because.go:135$" "&j escapes to heap$" } func leakThroughOAS2FUNC() { // See #26987. i := 0 // ERROR "moved to heap: i$" j := 0 - sink, _ = leakParams(&i, &j) // ERROR "&i escapes to heap$" "&j does not escape$" "from .out0 \(passed-to-and-returned-from-call\) at escape_because.go:142$" "from sink \(assign-pair-func-call\) at escape_because.go:142$" + sink, _ = leakParams(&i, &j) } // The list below is all of the why-escapes messages seen building the escape analysis tests. diff --git a/test/escape_calls.go b/test/escape_calls.go index 20cb643334..186c6f8098 100644 --- a/test/escape_calls.go +++ b/test/escape_calls.go @@ -19,7 +19,7 @@ func g(*byte) string func h(e int) { var x [32]byte // ERROR "moved to heap: x$" - g(&f(x[:])[0]) // ERROR "&f\(x\[:\]\)\[0\] escapes to heap$" "x escapes to heap$" + g(&f(x[:])[0]) } type Node struct { @@ -33,8 +33,8 @@ func walk(np **Node) int { // ERROR "leaking param content: np" if n == nil { return 0 } - wl := walk(&n.left) // ERROR "walk &n.left does not escape" - wr := walk(&n.right) // ERROR "walk &n.right does not escape" + wl := walk(&n.left) + wr := walk(&n.right) if wl < wr { n.left, n.right = n.right, n.left wl, wr = wr, wl diff --git a/test/escape_closure.go b/test/escape_closure.go index fc35cb59cf..93efe94ed7 100644 --- a/test/escape_closure.go +++ b/test/escape_closure.go @@ -15,7 +15,7 @@ func ClosureCallArgs0() { func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 // BAD: x should not escape to heap here - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs1() { @@ -24,7 +24,7 @@ func ClosureCallArgs1() { func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 // BAD: x should not escape to heap here - }(&x) // ERROR "&x escapes to heap" + }(&x) } } @@ -34,7 +34,7 @@ func ClosureCallArgs2() { x := 0 // ERROR "moved to heap: x" func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 - }(&x) // ERROR "&x escapes to heap" + }(&x) } } @@ -42,7 +42,7 @@ func ClosureCallArgs3() { x := 0 // ERROR "moved to heap: x" func(p *int) { // ERROR "leaking param: p" "func literal does not escape" sink = p // ERROR "p escapes to heap" - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs4() { @@ -50,21 +50,21 @@ func ClosureCallArgs4() { x := 0 // ERROR "moved to heap: x" _ = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" return p - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs5() { x := 0 // ERROR "moved to heap: x" sink = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" "\(func literal\)\(&x\) escapes to heap" return p - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs6() { x := 0 // ERROR "moved to heap: x" func(p *int) { // ERROR "moved to heap: p" "func literal does not escape" sink = &p // ERROR "&p escapes to heap" - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs7() { @@ -73,7 +73,7 @@ func ClosureCallArgs7() { x := 0 // ERROR "moved to heap: x" func(p *int) { // ERROR "leaking param: p" "func literal does not escape" pp = p - }(&x) // ERROR "&x escapes to heap" + }(&x) } _ = pp } @@ -83,7 +83,7 @@ func ClosureCallArgs8() { defer func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 // BAD: x should not escape to heap here - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs9() { @@ -92,7 +92,7 @@ func ClosureCallArgs9() { for { defer func(p *int) { // ERROR "func literal escapes to heap" "p does not escape" *p = 1 - }(&x) // ERROR "&x escapes to heap" + }(&x) } } @@ -101,7 +101,7 @@ func ClosureCallArgs10() { x := 0 // ERROR "moved to heap: x" defer func(p *int) { // ERROR "func literal escapes to heap" "p does not escape" *p = 1 - }(&x) // ERROR "&x escapes to heap" + }(&x) } } @@ -109,7 +109,7 @@ func ClosureCallArgs11() { x := 0 // ERROR "moved to heap: x" defer func(p *int) { // ERROR "leaking param: p" "func literal does not escape" sink = p // ERROR "p escapes to heap" - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs12() { @@ -117,33 +117,33 @@ func ClosureCallArgs12() { x := 0 // ERROR "moved to heap: x" defer func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" return p - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs13() { x := 0 // ERROR "moved to heap: x" defer func(p *int) { // ERROR "moved to heap: p" "func literal does not escape" sink = &p // ERROR "&p escapes to heap" - }(&x) // ERROR "&x escapes to heap" + }(&x) } func ClosureCallArgs14() { x := 0 // ERROR "moved to heap: x" // BAD: &x should not escape here - p := &x // ERROR "moved to heap: p" "&x escapes to heap" + p := &x // ERROR "moved to heap: p" _ = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" return *p // BAD: p should not escape here - }(&p) // ERROR "&p escapes to heap" + }(&p) } func ClosureCallArgs15() { x := 0 // ERROR "moved to heap: x" - p := &x // ERROR "moved to heap: p" "&x escapes to heap" + p := &x // ERROR "moved to heap: p" sink = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" "\(func literal\)\(&p\) escapes to heap" return *p // BAD: p should not escape here - }(&p) // ERROR "&p escapes to heap" + }(&p) } func ClosureLeak1(s string) string { // ERROR "ClosureLeak1 s does not escape" diff --git a/test/escape_field.go b/test/escape_field.go index e8835ae6ff..ae2425871f 100644 --- a/test/escape_field.go +++ b/test/escape_field.go @@ -23,7 +23,7 @@ type Y struct { func field0() { i := 0 // ERROR "moved to heap: i$" var x X - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i sink = x.p1 // ERROR "x\.p1 escapes to heap" } @@ -31,21 +31,21 @@ func field1() { i := 0 // ERROR "moved to heap: i$" var x X // BAD: &i should not escape - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i sink = x.p2 // ERROR "x\.p2 escapes to heap" } func field3() { i := 0 // ERROR "moved to heap: i$" var x X - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i sink = x // ERROR "x escapes to heap" } func field4() { i := 0 // ERROR "moved to heap: i$" var y Y - y.x.p1 = &i // ERROR "&i escapes to heap$" + y.x.p1 = &i x := y.x sink = x // ERROR "x escapes to heap" } @@ -54,7 +54,7 @@ func field5() { i := 0 // ERROR "moved to heap: i$" var x X // BAD: &i should not escape here - x.a[0] = &i // ERROR "&i escapes to heap$" + x.a[0] = &i sink = x.a[1] // ERROR "x\.a\[1\] escapes to heap" } @@ -67,14 +67,14 @@ func field6a() { i := 0 // ERROR "moved to heap: i$" var x X // BAD: &i should not escape - x.p1 = &i // ERROR "&i escapes to heap$" - field6(&x) // ERROR "field6a &x does not escape" + x.p1 = &i + field6(&x) } func field7() { i := 0 var y Y - y.x.p1 = &i // ERROR "field7 &i does not escape$" + y.x.p1 = &i x := y.x var y1 Y y1.x = x @@ -84,7 +84,7 @@ func field7() { func field8() { i := 0 // ERROR "moved to heap: i$" var y Y - y.x.p1 = &i // ERROR "&i escapes to heap$" + y.x.p1 = &i x := y.x var y1 Y y1.x = x @@ -94,7 +94,7 @@ func field8() { func field9() { i := 0 // ERROR "moved to heap: i$" var y Y - y.x.p1 = &i // ERROR "&i escapes to heap$" + y.x.p1 = &i x := y.x var y1 Y y1.x = x @@ -105,7 +105,7 @@ func field10() { i := 0 // ERROR "moved to heap: i$" var y Y // BAD: &i should not escape - y.x.p1 = &i // ERROR "&i escapes to heap$" + y.x.p1 = &i x := y.x var y1 Y y1.x = x @@ -114,33 +114,33 @@ func field10() { func field11() { i := 0 // ERROR "moved to heap: i$" - x := X{p1: &i} // ERROR "&i escapes to heap$" + x := X{p1: &i} sink = x.p1 // ERROR "x\.p1 escapes to heap" } func field12() { i := 0 // ERROR "moved to heap: i$" // BAD: &i should not escape - x := X{p1: &i} // ERROR "&i escapes to heap$" + x := X{p1: &i} sink = x.p2 // ERROR "x\.p2 escapes to heap" } func field13() { i := 0 // ERROR "moved to heap: i$" - x := &X{p1: &i} // ERROR "&i escapes to heap$" "field13 &X literal does not escape$" + x := &X{p1: &i} // ERROR "field13 &X literal does not escape$" sink = x.p1 // ERROR "x\.p1 escapes to heap" } func field14() { i := 0 // ERROR "moved to heap: i$" // BAD: &i should not escape - x := &X{p1: &i} // ERROR "&i escapes to heap$" "field14 &X literal does not escape$" + x := &X{p1: &i} // ERROR "field14 &X literal does not escape$" sink = x.p2 // ERROR "x\.p2 escapes to heap" } func field15() { i := 0 // ERROR "moved to heap: i$" - x := &X{p1: &i} // ERROR "&X literal escapes to heap$" "&i escapes to heap$" + x := &X{p1: &i} // ERROR "&X literal escapes to heap$" sink = x // ERROR "x escapes to heap" } @@ -148,7 +148,7 @@ func field16() { i := 0 // ERROR "moved to heap: i$" var x X // BAD: &i should not escape - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i var iface interface{} = x // ERROR "x escapes to heap" x1 := iface.(X) sink = x1.p2 // ERROR "x1\.p2 escapes to heap" @@ -157,7 +157,7 @@ func field16() { func field17() { i := 0 // ERROR "moved to heap: i$" var x X - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i var iface interface{} = x // ERROR "x escapes to heap" x1 := iface.(X) sink = x1.p1 // ERROR "x1\.p1 escapes to heap" @@ -167,7 +167,7 @@ func field18() { i := 0 // ERROR "moved to heap: i$" var x X // BAD: &i should not escape - x.p1 = &i // ERROR "&i escapes to heap$" + x.p1 = &i var iface interface{} = x // ERROR "x escapes to heap" y, _ := iface.(Y) // Put X, but extracted Y. The cast will fail, so y is zero initialized. sink = y // ERROR "y escapes to heap" diff --git a/test/escape_iface.go b/test/escape_iface.go index 8a11d7eb82..2a08547165 100644 --- a/test/escape_iface.go +++ b/test/escape_iface.go @@ -32,26 +32,26 @@ func (M0) M() { func efaceEscape0() { { i := 0 - v := M0{&i} // ERROR "&i does not escape" + v := M0{&i} var x M = v // ERROR "v does not escape" _ = x } { i := 0 // ERROR "moved to heap: i" - v := M0{&i} // ERROR "&i escapes to heap" + v := M0{&i} var x M = v // ERROR "v escapes to heap" sink = x // ERROR "x escapes to heap" } { i := 0 - v := M0{&i} // ERROR "&i does not escape" + v := M0{&i} var x M = v // ERROR "v does not escape" v1 := x.(M0) _ = v1 } { i := 0 // ERROR "moved to heap: i" - v := M0{&i} // ERROR "&i escapes to heap" + v := M0{&i} // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" v1 := x.(M0) @@ -59,20 +59,20 @@ func efaceEscape0() { } { i := 0 // ERROR "moved to heap: i" - v := M0{&i} // ERROR "&i escapes to heap" + v := M0{&i} // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" x.M() } { i := 0 // ERROR "moved to heap: i" - v := M0{&i} // ERROR "&i escapes to heap" + v := M0{&i} var x M = v // ERROR "v escapes to heap" mescapes(x) } { i := 0 - v := M0{&i} // ERROR "&i does not escape" + v := M0{&i} var x M = v // ERROR "v does not escape" mdoesnotescape(x) } @@ -90,26 +90,26 @@ func (M1) M() { func efaceEscape1() { { i := 0 - v := M1{&i, 0} // ERROR "&i does not escape" + v := M1{&i, 0} var x M = v // ERROR "v does not escape" _ = x } { i := 0 // ERROR "moved to heap: i" - v := M1{&i, 0} // ERROR "&i escapes to heap" + v := M1{&i, 0} var x M = v // ERROR "v escapes to heap" sink = x // ERROR "x escapes to heap" } { i := 0 - v := M1{&i, 0} // ERROR "&i does not escape" + v := M1{&i, 0} var x M = v // ERROR "v does not escape" v1 := x.(M1) _ = v1 } { i := 0 // ERROR "moved to heap: i" - v := M1{&i, 0} // ERROR "&i escapes to heap" + v := M1{&i, 0} // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" v1 := x.(M1) @@ -117,20 +117,20 @@ func efaceEscape1() { } { i := 0 // ERROR "moved to heap: i" - v := M1{&i, 0} // ERROR "&i escapes to heap" + v := M1{&i, 0} // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" x.M() } { i := 0 // ERROR "moved to heap: i" - v := M1{&i, 0} // ERROR "&i escapes to heap" + v := M1{&i, 0} var x M = v // ERROR "v escapes to heap" mescapes(x) } { i := 0 - v := M1{&i, 0} // ERROR "&i does not escape" + v := M1{&i, 0} var x M = v // ERROR "v does not escape" mdoesnotescape(x) } @@ -147,26 +147,26 @@ func (*M2) M() { func efaceEscape2() { { i := 0 - v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2 literal does not escape" var x M = v // ERROR "v does not escape" _ = x } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" var x M = v // ERROR "v escapes to heap" sink = x // ERROR "x escapes to heap" } { i := 0 - v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2 literal does not escape" var x M = v // ERROR "v does not escape" v1 := x.(*M2) _ = v1 } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" v1 := x.(*M2) @@ -174,7 +174,7 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2 literal does not escape" // BAD: v does not escape to heap here var x M = v // ERROR "v does not escape" v1 := x.(*M2) @@ -182,7 +182,7 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2 literal does not escape" // BAD: v does not escape to heap here var x M = v // ERROR "v does not escape" v1, ok := x.(*M2) @@ -191,20 +191,20 @@ func efaceEscape2() { } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" // BAD: v does not escape to heap here var x M = v // ERROR "v escapes to heap" x.M() } { i := 0 // ERROR "moved to heap: i" - v := &M2{&i} // ERROR "&i escapes to heap" "&M2 literal escapes to heap" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" var x M = v // ERROR "v escapes to heap" mescapes(x) } { i := 0 - v := &M2{&i} // ERROR "&i does not escape" "&M2 literal does not escape" + v := &M2{&i} // ERROR "&M2 literal does not escape" var x M = v // ERROR "v does not escape" mdoesnotescape(x) } @@ -235,8 +235,8 @@ func dotTypeEscape2() { // #13805, #15796 var x interface{} = i // ERROR "i does not escape" var y interface{} = j // ERROR "j does not escape" - *(&v) = x.(int) // ERROR "&v does not escape" - *(&v), *(&ok) = y.(int) // ERROR "&v does not escape" "&ok does not escape" + *(&v) = x.(int) + *(&v), *(&ok) = y.(int) } { i := 0 @@ -246,7 +246,7 @@ func dotTypeEscape2() { // #13805, #15796 var y interface{} = j // ERROR "j does not escape" sink = x.(int) // ERROR "x.\(int\) escapes to heap" - sink, *(&ok) = y.(int) // ERROR "&ok does not escape" + sink, *(&ok) = y.(int) } { i := 0 // ERROR "moved to heap: i" @@ -256,6 +256,6 @@ func dotTypeEscape2() { // #13805, #15796 var y interface{} = &j // ERROR "&j escapes to heap" sink = x.(*int) // ERROR "x.\(\*int\) escapes to heap" - sink, *(&ok) = y.(*int) // ERROR "&ok does not escape" + sink, *(&ok) = y.(*int) } } diff --git a/test/escape_indir.go b/test/escape_indir.go index aac4e675c4..ce21ea821f 100644 --- a/test/escape_indir.go +++ b/test/escape_indir.go @@ -25,42 +25,42 @@ func constptr0() { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" // BAD: i should not escape here - x.p = &i // ERROR "&i escapes to heap" + x.p = &i _ = x } func constptr01() *ConstPtr { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" - x.p = &i // ERROR "&i escapes to heap" + x.p = &i return x } func constptr02() ConstPtr { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" - x.p = &i // ERROR "&i escapes to heap" + x.p = &i return *x } func constptr03() **ConstPtr { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" "moved to heap: x" - x.p = &i // ERROR "&i escapes to heap" - return &x // ERROR "&x escapes to heap" + x.p = &i + return &x } func constptr1() { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal escapes to heap" - x.p = &i // ERROR "&i escapes to heap" + x.p = &i sink = x // ERROR "x escapes to heap" } func constptr2() { i := 0 // ERROR "moved to heap: i" x := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" - x.p = &i // ERROR "&i escapes to heap" + x.p = &i sink = *x // ERROR "\*x escapes to heap" } @@ -87,15 +87,15 @@ func constptr6(p *ConstPtr) { // ERROR "leaking param content: p" func constptr7() **ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" "moved to heap: p" var tmp ConstPtr2 - p1 := &tmp // ERROR "&tmp does not escape" + p1 := &tmp p.c = *p1 - return &p // ERROR "&p escapes to heap" + return &p } func constptr8() *ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" var tmp ConstPtr2 - p.c = *&tmp // ERROR "&tmp does not escape" + p.c = *&tmp return p } @@ -103,7 +103,7 @@ func constptr9() ConstPtr { p := new(ConstPtr) // ERROR "new\(ConstPtr\) does not escape" var p1 ConstPtr2 i := 0 // ERROR "moved to heap: i" - p1.p = &i // ERROR "&i escapes to heap" + p1.p = &i p.c = p1 return *p } @@ -112,9 +112,9 @@ func constptr10() ConstPtr { x := &ConstPtr{} // ERROR "moved to heap: x" "&ConstPtr literal escapes to heap" i := 0 // ERROR "moved to heap: i" var p *ConstPtr - p = &ConstPtr{p: &i, x: &x} // ERROR "&i escapes to heap" "&x escapes to heap" "&ConstPtr literal does not escape" + p = &ConstPtr{p: &i, x: &x} // ERROR "&ConstPtr literal does not escape" var pp **ConstPtr - pp = &p // ERROR "&p does not escape" + pp = &p return **pp } @@ -122,7 +122,7 @@ func constptr11() *ConstPtr { i := 0 // ERROR "moved to heap: i" p := new(ConstPtr) // ERROR "new\(ConstPtr\) escapes to heap" p1 := &ConstPtr{} // ERROR "&ConstPtr literal does not escape" - p1.p = &i // ERROR "&i escapes to heap" + p1.p = &i *p = *p1 return p } @@ -130,13 +130,13 @@ func constptr11() *ConstPtr { func foo(p **int) { // ERROR "foo p does not escape" i := 0 // ERROR "moved to heap: i" y := p - *y = &i // ERROR "&i escapes to heap" + *y = &i } func foo1(p *int) { // ERROR "p does not escape" i := 0 // ERROR "moved to heap: i" - y := &p // ERROR "&p does not escape" - *y = &i // ERROR "&i escapes to heap" + y := &p + *y = &i } func foo2() { @@ -146,15 +146,15 @@ func foo2() { x := new(int) // ERROR "moved to heap: x" "new\(int\) escapes to heap" sink = &x // ERROR "&x escapes to heap" var z Z - z.f = &x // ERROR "&x does not escape" + z.f = &x p := z.f i := 0 // ERROR "moved to heap: i" - *p = &i // ERROR "&i escapes to heap" + *p = &i } var global *byte func f() { var x byte // ERROR "moved to heap: x" - global = &*&x // ERROR "&\(\*\(&x\)\) escapes to heap" "&x escapes to heap" + global = &*&x } diff --git a/test/escape_level.go b/test/escape_level.go index 490f615f73..44a23e5a4d 100644 --- a/test/escape_level.go +++ b/test/escape_level.go @@ -12,64 +12,64 @@ var sink interface{} func level0() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "moved to heap: p0" "&i escapes to heap" - p1 := &p0 // ERROR "moved to heap: p1" "&p0 escapes to heap" - p2 := &p1 // ERROR "moved to heap: p2" "&p1 escapes to heap" + p0 := &i // ERROR "moved to heap: p0" + p1 := &p0 // ERROR "moved to heap: p1" + p2 := &p1 // ERROR "moved to heap: p2" sink = &p2 // ERROR "&p2 escapes to heap" } func level1() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "moved to heap: p0" "&i escapes to heap" - p1 := &p0 // ERROR "moved to heap: p1" "&p0 escapes to heap" - p2 := &p1 // ERROR "&p1 escapes to heap" + p0 := &i // ERROR "moved to heap: p0" + p1 := &p0 // ERROR "moved to heap: p1" + p2 := &p1 sink = p2 // ERROR "p2 escapes to heap" } func level2() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "moved to heap: p0" "&i escapes to heap" - p1 := &p0 // ERROR "&p0 escapes to heap" - p2 := &p1 // ERROR "&p1 does not escape" + p0 := &i // ERROR "moved to heap: p0" + p1 := &p0 + p2 := &p1 sink = *p2 // ERROR "\*p2 escapes to heap" } func level3() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "&i escapes to heap" - p1 := &p0 // ERROR "&p0 does not escape" - p2 := &p1 // ERROR "&p1 does not escape" + p0 := &i + p1 := &p0 + p2 := &p1 sink = **p2 // ERROR "\* \(\*p2\) escapes to heap" } func level4() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "moved to heap: p0" "&i escapes to heap" - p1 := &p0 // ERROR "&p0 escapes to heap" + p0 := &i // ERROR "moved to heap: p0" + p1 := &p0 p2 := p1 // ERROR "moved to heap: p2" sink = &p2 // ERROR "&p2 escapes to heap" } func level5() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "moved to heap: p0" "&i escapes to heap" - p1 := &p0 // ERROR "&p0 escapes to heap" + p0 := &i // ERROR "moved to heap: p0" + p1 := &p0 p2 := p1 sink = p2 // ERROR "p2 escapes to heap" } func level6() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "&i escapes to heap" - p1 := &p0 // ERROR "&p0 does not escape" + p0 := &i + p1 := &p0 p2 := p1 sink = *p2 // ERROR "\*p2 escapes to heap" } func level7() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "&i escapes to heap" - p1 := &p0 // ERROR "&p0 does not escape" + p0 := &i + p1 := &p0 // note *p1 == &i p2 := *p1 // ERROR "moved to heap: p2" sink = &p2 // ERROR "&p2 escapes to heap" @@ -77,32 +77,32 @@ func level7() { func level8() { i := 0 // ERROR "moved to heap: i" - p0 := &i // ERROR "&i escapes to heap" - p1 := &p0 // ERROR "&p0 does not escape" + p0 := &i + p1 := &p0 p2 := *p1 sink = p2 // ERROR "p2 escapes to heap" } func level9() { i := 0 - p0 := &i // ERROR "&i does not escape" - p1 := &p0 // ERROR "&p0 does not escape" + p0 := &i + p1 := &p0 p2 := *p1 sink = *p2 // ERROR "\*p2 escapes to heap" } func level10() { i := 0 - p0 := &i // ERROR "&i does not escape" + p0 := &i p1 := *p0 - p2 := &p1 // ERROR "&p1 does not escape" + p2 := &p1 sink = *p2 // ERROR "\*p2 escapes to heap" } func level11() { i := 0 - p0 := &i // ERROR "&i does not escape" - p1 := &p0 // ERROR "&p0 does not escape" + p0 := &i + p1 := &p0 p2 := **p1 // ERROR "moved to heap: p2" sink = &p2 // ERROR "&p2 escapes to heap" } diff --git a/test/escape_map.go b/test/escape_map.go index 99cbd482a6..9912b55a35 100644 --- a/test/escape_map.go +++ b/test/escape_map.go @@ -16,7 +16,7 @@ func map0() { i := 0 // ERROR "moved to heap: i" // BAD: j should not escape j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j _ = m } @@ -25,15 +25,15 @@ func map1() *int { // BAD: i should not escape i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" - return m[&i] // ERROR "&i does not escape" + m[&i] = &j + return m[&i] } func map2() map[*int]*int { m := make(map[*int]*int) // ERROR "make\(map\[\*int\]\*int\) escapes to heap" i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j return m } @@ -42,7 +42,7 @@ func map3() []*int { i := 0 // ERROR "moved to heap: i" // BAD: j should not escape j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j var r []*int for k := range m { r = append(r, k) @@ -55,7 +55,7 @@ func map4() []*int { // BAD: i should not escape i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j var r []*int for k, v := range m { // We want to test exactly "for k, v := range m" rather than "for _, v := range m". @@ -70,7 +70,7 @@ func map4() []*int { func map5(m map[*int]*int) { // ERROR "m does not escape" i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j } func map6(m map[*int]*int) { // ERROR "m does not escape" @@ -79,7 +79,7 @@ func map6(m map[*int]*int) { // ERROR "m does not escape" } i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m[&i] = &j // ERROR "&i escapes to heap" "&j escapes to heap" + m[&i] = &j } func map7() { @@ -87,14 +87,14 @@ func map7() { i := 0 // ERROR "moved to heap: i" // BAD: j should not escape j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal does not escape" + m := map[*int]*int{&i: &j} // ERROR "literal does not escape" _ = m } func map8() { i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal escapes to heap" + m := map[*int]*int{&i: &j} // ERROR "literal escapes to heap" sink = m // ERROR "m escapes to heap" } @@ -102,6 +102,6 @@ func map9() *int { // BAD: i should not escape i := 0 // ERROR "moved to heap: i" j := 0 // ERROR "moved to heap: j" - m := map[*int]*int{&i: &j} // ERROR "&i escapes to heap" "&j escapes to heap" "literal does not escape" + m := map[*int]*int{&i: &j} // ERROR "literal does not escape" return m[nil] } diff --git a/test/escape_param.go b/test/escape_param.go index 175a4f03dd..0a81e8c9c8 100644 --- a/test/escape_param.go +++ b/test/escape_param.go @@ -22,12 +22,12 @@ func param0(p *int) *int { // ERROR "leaking param: p to result ~r1" func caller0a() { i := 0 - _ = param0(&i) // ERROR "caller0a &i does not escape$" + _ = param0(&i) } func caller0b() { i := 0 // ERROR "moved to heap: i$" - sink = param0(&i) // ERROR "&i escapes to heap$" "param0\(&i\) escapes to heap" + sink = param0(&i) // ERROR "param0\(&i\) escapes to heap" } // in, in -> out, out @@ -38,7 +38,7 @@ func param1(p1, p2 *int) (*int, *int) { // ERROR "leaking param: p1 to result ~r func caller1() { i := 0 // ERROR "moved to heap: i$" j := 0 - sink, _ = param1(&i, &j) // ERROR "&i escapes to heap$" "caller1 &j does not escape$" + sink, _ = param1(&i, &j) } // in -> other in @@ -49,14 +49,14 @@ func param2(p1 *int, p2 **int) { // ERROR "leaking param: p1$" "param2 p2 does n func caller2a() { i := 0 // ERROR "moved to heap: i$" var p *int - param2(&i, &p) // ERROR "&i escapes to heap$" "caller2a &p does not escape$" + param2(&i, &p) _ = p } func caller2b() { i := 0 // ERROR "moved to heap: i$" var p *int - param2(&i, &p) // ERROR "&i escapes to heap$" "caller2b &p does not escape$" + param2(&i, &p) sink = p // ERROR "p escapes to heap$" } @@ -144,16 +144,16 @@ func param3(p *Pair) { // ERROR "param3 p does not escape" func caller3a() { i := 0 j := 0 - p := Pair{&i, &j} // ERROR "caller3a &i does not escape" "caller3a &j does not escape" - param3(&p) // ERROR "caller3a &p does not escape" + p := Pair{&i, &j} + param3(&p) _ = p } func caller3b() { i := 0 // ERROR "moved to heap: i$" j := 0 // ERROR "moved to heap: j$" - p := Pair{&i, &j} // ERROR "&i escapes to heap$" "&j escapes to heap$" - param3(&p) // ERROR "caller3b &p does not escape" + p := Pair{&i, &j} + param3(&p) sink = p // ERROR "p escapes to heap$" } @@ -165,14 +165,14 @@ func (p *Pair) param4(i *int) { // ERROR "\(\*Pair\).param4 p does not escape$" func caller4a() { i := 0 // ERROR "moved to heap: i$" p := Pair{} - p.param4(&i) // ERROR "&i escapes to heap$" "caller4a p does not escape$" + p.param4(&i) _ = p } func caller4b() { i := 0 // ERROR "moved to heap: i$" p := Pair{} - p.param4(&i) // ERROR "&i escapes to heap$" "caller4b p does not escape$" + p.param4(&i) sink = p // ERROR "p escapes to heap$" } @@ -183,7 +183,7 @@ func param5(i *int) { // ERROR "leaking param: i$" func caller5() { i := 0 // ERROR "moved to heap: i$" - param5(&i) // ERROR "&i escapes to heap$" + param5(&i) } // *in -> heap @@ -193,9 +193,9 @@ func param6(i ***int) { // ERROR "leaking param content: i$" func caller6a() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" - p2 := &p // ERROR "&p escapes to heap$" - param6(&p2) // ERROR "caller6a &p2 does not escape" + p := &i // ERROR "moved to heap: p$" + p2 := &p + param6(&p2) } // **in -> heap @@ -205,9 +205,9 @@ func param7(i ***int) { // ERROR "leaking param content: i$" func caller7() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" - p2 := &p // ERROR "&p escapes to heap$" - param7(&p2) // ERROR "caller7 &p2 does not escape" + p := &i // ERROR "moved to heap: p$" + p2 := &p + param7(&p2) } // **in -> heap @@ -217,8 +217,8 @@ func param8(i **int) { // ERROR "param8 i does not escape$" func caller8() { i := 0 - p := &i // ERROR "caller8 &i does not escape$" - param8(&p) // ERROR "caller8 &p does not escape$" + p := &i + param8(&p) } // *in -> out @@ -228,16 +228,16 @@ func param9(p ***int) **int { // ERROR "leaking param: p to result ~r1 level=1" func caller9a() { i := 0 - p := &i // ERROR "caller9a &i does not escape" - p2 := &p // ERROR "caller9a &p does not escape" - _ = param9(&p2) // ERROR "caller9a &p2 does not escape$" + p := &i + p2 := &p + _ = param9(&p2) } func caller9b() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" - p2 := &p // ERROR "&p escapes to heap$" - sink = param9(&p2) // ERROR "caller9b &p2 does not escape$" "param9\(&p2\) escapes to heap" + p := &i // ERROR "moved to heap: p$" + p2 := &p + sink = param9(&p2) // ERROR "param9\(&p2\) escapes to heap" } // **in -> out @@ -247,45 +247,45 @@ func param10(p ***int) *int { // ERROR "leaking param: p to result ~r1 level=2" func caller10a() { i := 0 - p := &i // ERROR "caller10a &i does not escape" - p2 := &p // ERROR "caller10a &p does not escape" - _ = param10(&p2) // ERROR "caller10a &p2 does not escape$" + p := &i + p2 := &p + _ = param10(&p2) } func caller10b() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" - p2 := &p // ERROR "caller10b &p does not escape$" - sink = param10(&p2) // ERROR "caller10b &p2 does not escape$" "param10\(&p2\) escapes to heap" + p := &i + p2 := &p + sink = param10(&p2) // ERROR "param10\(&p2\) escapes to heap" } // in escapes to heap (address of param taken and returned) func param11(i **int) ***int { // ERROR "moved to heap: i$" - return &i // ERROR "&i escapes to heap$" + return &i } func caller11a() { i := 0 // ERROR "moved to heap: i" - p := &i // ERROR "moved to heap: p" "&i escapes to heap" - _ = param11(&p) // ERROR "&p escapes to heap" + p := &i // ERROR "moved to heap: p" + _ = param11(&p) } func caller11b() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" - sink = param11(&p) // ERROR "&p escapes to heap$" "param11\(&p\) escapes to heap" + p := &i // ERROR "moved to heap: p$" + sink = param11(&p) // ERROR "param11\(&p\) escapes to heap" } func caller11c() { // GOOD i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "moved to heap: p" "&i escapes to heap" - sink = *param11(&p) // ERROR "&p escapes to heap" "\*param11\(&p\) escapes to heap" + p := &i // ERROR "moved to heap: p" + sink = *param11(&p) // ERROR "\*param11\(&p\) escapes to heap" } func caller11d() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap" "moved to heap: p" - p2 := &p // ERROR "&p escapes to heap" + p := &i // ERROR "moved to heap: p" + p2 := &p sink = param11(p2) // ERROR "param11\(p2\) escapes to heap" } @@ -295,38 +295,38 @@ type Indir struct { } func (r *Indir) param12(i **int) { // ERROR "\(\*Indir\).param12 r does not escape$" "moved to heap: i$" - r.p = &i // ERROR "&i escapes to heap$" + r.p = &i } func caller12a() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" + p := &i // ERROR "moved to heap: p$" var r Indir - r.param12(&p) // ERROR "&p escapes to heap$" "caller12a r does not escape$" + r.param12(&p) _ = r } func caller12b() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" + p := &i // ERROR "moved to heap: p$" r := &Indir{} // ERROR "caller12b &Indir literal does not escape$" - r.param12(&p) // ERROR "&p escapes to heap$" + r.param12(&p) _ = r } func caller12c() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" + p := &i // ERROR "moved to heap: p$" r := Indir{} - r.param12(&p) // ERROR "&p escapes to heap$" "caller12c r does not escape$" + r.param12(&p) sink = r // ERROR "r escapes to heap$" } func caller12d() { i := 0 // ERROR "moved to heap: i$" - p := &i // ERROR "&i escapes to heap$" "moved to heap: p$" + p := &i // ERROR "moved to heap: p$" r := Indir{} - r.param12(&p) // ERROR "&p escapes to heap$" "caller12d r does not escape$" + r.param12(&p) sink = **r.p // ERROR "\* \(\*r\.p\) escapes to heap" } @@ -343,24 +343,24 @@ func caller13a() { i := 0 // ERROR "moved to heap: i$" var p *int var v Val - v.p = &p // ERROR "caller13a &p does not escape$" - v.param13(&i) // ERROR "&i escapes to heap$" + v.p = &p + v.param13(&i) _ = v } func caller13b() { i := 0 // ERROR "moved to heap: i$" var p *int - v := Val{&p} // ERROR "caller13b &p does not escape$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := Val{&p} + v.param13(&i) _ = v } func caller13c() { i := 0 // ERROR "moved to heap: i$" var p *int - v := &Val{&p} // ERROR "caller13c &Val literal does not escape$" "caller13c &p does not escape$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := &Val{&p} // ERROR "caller13c &Val literal does not escape$" + v.param13(&i) _ = v } @@ -368,40 +368,40 @@ func caller13d() { i := 0 // ERROR "moved to heap: i$" var p *int // ERROR "moved to heap: p$" var v Val - v.p = &p // ERROR "&p escapes to heap$" - v.param13(&i) // ERROR "&i escapes to heap$" + v.p = &p + v.param13(&i) sink = v // ERROR "v escapes to heap$" } func caller13e() { i := 0 // ERROR "moved to heap: i$" var p *int // ERROR "moved to heap: p$" - v := Val{&p} // ERROR "&p escapes to heap$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := Val{&p} + v.param13(&i) sink = v // ERROR "v escapes to heap$" } func caller13f() { i := 0 // ERROR "moved to heap: i$" var p *int // ERROR "moved to heap: p$" - v := &Val{&p} // ERROR "&Val literal escapes to heap$" "&p escapes to heap$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := &Val{&p} // ERROR "&Val literal escapes to heap$" + v.param13(&i) sink = v // ERROR "v escapes to heap$" } func caller13g() { i := 0 // ERROR "moved to heap: i$" var p *int - v := Val{&p} // ERROR "caller13g &p does not escape$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := Val{&p} + v.param13(&i) sink = *v.p // ERROR "\*v\.p escapes to heap" } func caller13h() { i := 0 // ERROR "moved to heap: i$" var p *int - v := &Val{&p} // ERROR "caller13h &Val literal does not escape$" "caller13h &p does not escape$" - v.param13(&i) // ERROR "&i escapes to heap$" + v := &Val{&p} // ERROR "caller13h &Val literal does not escape$" + v.param13(&i) sink = **v.p // ERROR "\* \(\*v\.p\) escapes to heap" } diff --git a/test/escape_slice.go b/test/escape_slice.go index ffd7cdb509..03053cf326 100644 --- a/test/escape_slice.go +++ b/test/escape_slice.go @@ -19,28 +19,28 @@ func slice0() { var s []*int // BAD: i should not escape i := 0 // ERROR "moved to heap: i" - s = append(s, &i) // ERROR "&i escapes to heap" + s = append(s, &i) _ = s } func slice1() *int { var s []*int i := 0 // ERROR "moved to heap: i" - s = append(s, &i) // ERROR "&i escapes to heap" + s = append(s, &i) return s[0] } func slice2() []*int { var s []*int i := 0 // ERROR "moved to heap: i" - s = append(s, &i) // ERROR "&i escapes to heap" + s = append(s, &i) return s } func slice3() *int { var s []*int i := 0 // ERROR "moved to heap: i" - s = append(s, &i) // ERROR "&i escapes to heap" + s = append(s, &i) for _, p := range s { return p } @@ -49,7 +49,7 @@ func slice3() *int { func slice4(s []*int) { // ERROR "s does not escape" i := 0 // ERROR "moved to heap: i" - s[0] = &i // ERROR "&i escapes to heap" + s[0] = &i } func slice5(s []*int) { // ERROR "s does not escape" @@ -57,39 +57,39 @@ func slice5(s []*int) { // ERROR "s does not escape" s = make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" } i := 0 // ERROR "moved to heap: i" - s[0] = &i // ERROR "&i escapes to heap" + s[0] = &i } func slice6() { s := make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" // BAD: i should not escape i := 0 // ERROR "moved to heap: i" - s[0] = &i // ERROR "&i escapes to heap" + s[0] = &i _ = s } func slice7() *int { s := make([]*int, 10) // ERROR "make\(\[\]\*int, 10\) does not escape" i := 0 // ERROR "moved to heap: i" - s[0] = &i // ERROR "&i escapes to heap" + s[0] = &i return s[0] } func slice8() { i := 0 - s := []*int{&i} // ERROR "&i does not escape" "literal does not escape" + s := []*int{&i} // ERROR "literal does not escape" _ = s } func slice9() *int { i := 0 // ERROR "moved to heap: i" - s := []*int{&i} // ERROR "&i escapes to heap" "literal does not escape" + s := []*int{&i} // ERROR "literal does not escape" return s[0] } func slice10() []*int { i := 0 // ERROR "moved to heap: i" - s := []*int{&i} // ERROR "&i escapes to heap" "literal escapes to heap" + s := []*int{&i} // ERROR "literal escapes to heap" return s } diff --git a/test/escape_struct_param1.go b/test/escape_struct_param1.go index 076fbc8ca3..7004946e2f 100644 --- a/test/escape_struct_param1.go +++ b/test/escape_struct_param1.go @@ -36,16 +36,16 @@ func (u *U) SPPi() *string { // ERROR "leaking param: u to result ~r0 level=2$" func tSPPi() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" - pps := &ps // ERROR "tSPPi &ps does not escape$" + ps := &s + pps := &ps pu := &U{ps, pps} // ERROR "tSPPi &U literal does not escape$" Ssink = pu.SPPi() } func tiSPP() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" - pps := &ps // ERROR "tiSPP &ps does not escape$" + ps := &s + pps := &ps pu := &U{ps, pps} // ERROR "tiSPP &U literal does not escape$" Ssink = *pu.SPP() } @@ -53,8 +53,8 @@ func tiSPP() { // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of ps func tSP() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" "moved to heap: ps$" - pps := &ps // ERROR "&ps escapes to heap$" + ps := &s // ERROR "moved to heap: ps$" + pps := &ps pu := &U{ps, pps} // ERROR "tSP &U literal does not escape$" Ssink = pu.SP() } @@ -92,7 +92,7 @@ func (v *V) USPPia() *string { // ERROR "leaking param: v to result ~r0 level=2$ } func (v *V) USPPib() *string { // ERROR "leaking param: v to result ~r0 level=2$" - return v._u.SPPi() // ERROR "\(\*V\).USPPib v._u does not escape$" + return v._u.SPPi() } func (v *V) UPiSPa() *string { // ERROR "leaking param: v to result ~r0 level=2$" @@ -119,13 +119,13 @@ func tUPiSPa() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPa &ps2 does not escape$" "tUPiSPa &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPa &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPa &V literal does not escape$" "tUPiSPa &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPa &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPa &V literal does not escape$" Ssink = v.UPiSPa() // Ssink = &s3 (only &s3 really escapes) } @@ -137,13 +137,13 @@ func tUPiSPb() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPb &ps2 does not escape$" "tUPiSPb &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPb &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPb &V literal does not escape$" "tUPiSPb &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPb &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPb &V literal does not escape$" Ssink = v.UPiSPb() // Ssink = &s3 (only &s3 really escapes) } @@ -155,13 +155,13 @@ func tUPiSPc() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPc &ps2 does not escape$" "tUPiSPc &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPc &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPc &V literal does not escape$" "tUPiSPc &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPc &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPc &V literal does not escape$" Ssink = v.UPiSPc() // Ssink = &s3 (only &s3 really escapes) } @@ -173,13 +173,13 @@ func tUPiSPd() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPd &ps2 does not escape$" "tUPiSPd &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPd &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPd &V literal does not escape$" "tUPiSPd &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPd &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPd &V literal does not escape$" Ssink = v.UPiSPd() // Ssink = &s3 (only &s3 really escapes) } @@ -192,11 +192,11 @@ func (v V) UPiSPPib() *string { // ERROR "leaking param: v to result ~r0 level=2 } func (v V) UPiSPPic() *string { // ERROR "leaking param: v to result ~r0 level=2$" - return *v.UP()._spp // ERROR "V.UPiSPPic v does not escape$" + return *v.UP()._spp } func (v V) UPiSPPid() *string { // ERROR "leaking param: v to result ~r0 level=2$" - return v.UP().SPPi() // ERROR "V.UPiSPPid v does not escape$" + return v.UP().SPPi() } // BAD: need fine-grained (field-sensitive) analysis to avoid spurious escape of all but &s4 @@ -207,13 +207,13 @@ func tUPiSPPia() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPia &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPia &ps2 does not escape$" "tUPiSPPia &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPia &U literal does not escape$" "tUPiSPPia &ps4 does not escape$" "tUPiSPPia &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPia &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPia &V literal does not escape$" "tUPiSPPia &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPia &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPia &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPia &V literal does not escape$" Ssink = v.UPiSPPia() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -225,13 +225,13 @@ func tUPiSPPib() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPib &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPib &ps2 does not escape$" "tUPiSPPib &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPib &U literal does not escape$" "tUPiSPPib &ps4 does not escape$" "tUPiSPPib &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPib &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPib &V literal does not escape$" "tUPiSPPib &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPib &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPib &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPib &V literal does not escape$" Ssink = v.UPiSPPib() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -243,13 +243,13 @@ func tUPiSPPic() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPic &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPic &ps2 does not escape$" "tUPiSPPic &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPic &U literal does not escape$" "tUPiSPPic &ps4 does not escape$" "tUPiSPPic &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPic &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPic &V literal does not escape$" "tUPiSPPic &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPic &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPic &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPic &V literal does not escape$" Ssink = v.UPiSPPic() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -261,13 +261,13 @@ func tUPiSPPid() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPid &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPid &ps2 does not escape$" "tUPiSPPid &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPid &U literal does not escape$" "tUPiSPPid &ps4 does not escape$" "tUPiSPPid &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPid &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPid &V literal does not escape$" "tUPiSPPid &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPid &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPid &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPid &V literal does not escape$" Ssink = v.UPiSPPid() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -287,12 +287,12 @@ func tUPPiSPPia() { s4 := "dog" s5 := "emu" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPPiSPPia &s2 does not escape$" - ps4 := &s4 // ERROR "tUPPiSPPia &s4 does not escape$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" - u1 := U{&s1, &ps2} // ERROR "tUPPiSPPia &ps2 does not escape$" "tUPPiSPPia &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPPiSPPia &U literal does not escape$" "tUPPiSPPia &ps4 does not escape$" "tUPPiSPPia &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "tUPPiSPPia &U literal does not escape$" "tUPPiSPPia &ps6 does not escape$" "tUPPiSPPia &s5 does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPPiSPPia &V literal does not escape$" "tUPPiSPPia &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPPiSPPia &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPPiSPPia &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPPiSPPia &V literal does not escape$" Ssink = v.UPPiSPPia() // Ssink = *&ps6 = &s6 (only &s6 really escapes) } diff --git a/test/escape_struct_param2.go b/test/escape_struct_param2.go index d5305d4f40..5a9b271958 100644 --- a/test/escape_struct_param2.go +++ b/test/escape_struct_param2.go @@ -36,16 +36,16 @@ func (u U) SPPi() *string { // ERROR "leaking param: u to result ~r0 level=1$" func tSPPi() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" - pps := &ps // ERROR "tSPPi &ps does not escape$" + ps := &s + pps := &ps pu := &U{ps, pps} // ERROR "tSPPi &U literal does not escape$" Ssink = pu.SPPi() } func tiSPP() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" - pps := &ps // ERROR "tiSPP &ps does not escape$" + ps := &s + pps := &ps pu := &U{ps, pps} // ERROR "tiSPP &U literal does not escape$" Ssink = *pu.SPP() } @@ -53,8 +53,8 @@ func tiSPP() { // BAD: need fine-grained analysis to avoid spurious escape of ps func tSP() { s := "cat" // ERROR "moved to heap: s$" - ps := &s // ERROR "&s escapes to heap$" "moved to heap: ps$" - pps := &ps // ERROR "&ps escapes to heap$" + ps := &s // ERROR "moved to heap: ps$" + pps := &ps pu := &U{ps, pps} // ERROR "tSP &U literal does not escape$" Ssink = pu.SP() } @@ -119,13 +119,13 @@ func tUPiSPa() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPa &ps2 does not escape$" "tUPiSPa &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPa &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPa &V literal does not escape$" "tUPiSPa &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPa &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPa &V literal does not escape$" Ssink = v.UPiSPa() // Ssink = &s3 (only &s3 really escapes) } @@ -137,13 +137,13 @@ func tUPiSPb() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPb &ps2 does not escape$" "tUPiSPb &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPb &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPb &V literal does not escape$" "tUPiSPb &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPb &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPb &V literal does not escape$" Ssink = v.UPiSPb() // Ssink = &s3 (only &s3 really escapes) } @@ -155,13 +155,13 @@ func tUPiSPc() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPc &ps2 does not escape$" "tUPiSPc &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPc &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPc &V literal does not escape$" "tUPiSPc &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPc &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPc &V literal does not escape$" Ssink = v.UPiSPc() // Ssink = &s3 (only &s3 really escapes) } @@ -173,13 +173,13 @@ func tUPiSPd() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "&s2 escapes to heap$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" "moved to heap: ps4$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPd &ps2 does not escape$" "tUPiSPd &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "&ps4 escapes to heap$" "&s3 escapes to heap$" "tUPiSPd &U literal does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" "&ps6 escapes to heap$" "&s5 escapes to heap$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPd &V literal does not escape$" "tUPiSPd &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 // ERROR "moved to heap: ps4$" + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPd &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "&U literal escapes to heap$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPd &V literal does not escape$" Ssink = v.UPiSPd() // Ssink = &s3 (only &s3 really escapes) } @@ -207,13 +207,13 @@ func tUPiSPPia() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPia &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPia &ps2 does not escape$" "tUPiSPPia &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPia &U literal does not escape$" "tUPiSPPia &ps4 does not escape$" "tUPiSPPia &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPia &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPia &V literal does not escape$" "tUPiSPPia &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPia &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPia &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPia &V literal does not escape$" Ssink = v.UPiSPPia() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -225,13 +225,13 @@ func tUPiSPPib() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPib &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPib &ps2 does not escape$" "tUPiSPPib &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPib &U literal does not escape$" "tUPiSPPib &ps4 does not escape$" "tUPiSPPib &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPib &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPib &V literal does not escape$" "tUPiSPPib &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPib &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPib &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPib &V literal does not escape$" Ssink = v.UPiSPPib() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -243,13 +243,13 @@ func tUPiSPPic() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPic &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPic &ps2 does not escape$" "tUPiSPPic &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPic &U literal does not escape$" "tUPiSPPic &ps4 does not escape$" "tUPiSPPic &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPic &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPic &V literal does not escape$" "tUPiSPPic &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPic &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPic &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPic &V literal does not escape$" Ssink = v.UPiSPPic() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -261,13 +261,13 @@ func tUPiSPPid() { s4 := "dog" // ERROR "moved to heap: s4$" s5 := "emu" // ERROR "moved to heap: s5$" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPiSPPid &s2 does not escape$" - ps4 := &s4 // ERROR "&s4 escapes to heap$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" "moved to heap: ps6$" - u1 := U{&s1, &ps2} // ERROR "tUPiSPPid &ps2 does not escape$" "tUPiSPPid &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPiSPPid &U literal does not escape$" "tUPiSPPid &ps4 does not escape$" "tUPiSPPid &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "&ps6 escapes to heap$" "&s5 escapes to heap$" "tUPiSPPid &U literal does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPiSPPid &V literal does not escape$" "tUPiSPPid &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 // ERROR "moved to heap: ps6$" + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPiSPPid &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPiSPPid &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPiSPPid &V literal does not escape$" Ssink = v.UPiSPPid() // Ssink = *&ps4 = &s4 (only &s4 really escapes) } @@ -287,12 +287,12 @@ func tUPPiSPPia() { // This test is sensitive to the level cap in function summa s4 := "dog" s5 := "emu" s6 := "fox" // ERROR "moved to heap: s6$" - ps2 := &s2 // ERROR "tUPPiSPPia &s2 does not escape$" - ps4 := &s4 // ERROR "tUPPiSPPia &s4 does not escape$" - ps6 := &s6 // ERROR "&s6 escapes to heap$" - u1 := U{&s1, &ps2} // ERROR "tUPPiSPPia &ps2 does not escape$" "tUPPiSPPia &s1 does not escape$" - u2 := &U{&s3, &ps4} // ERROR "tUPPiSPPia &U literal does not escape$" "tUPPiSPPia &ps4 does not escape$" "tUPPiSPPia &s3 does not escape$" - u3 := &U{&s5, &ps6} // ERROR "tUPPiSPPia &U literal does not escape$" "tUPPiSPPia &ps6 does not escape$" "tUPPiSPPia &s5 does not escape$" - v := &V{u1, u2, &u3} // ERROR "tUPPiSPPia &V literal does not escape$" "tUPPiSPPia &u3 does not escape$" + ps2 := &s2 + ps4 := &s4 + ps6 := &s6 + u1 := U{&s1, &ps2} + u2 := &U{&s3, &ps4} // ERROR "tUPPiSPPia &U literal does not escape$" + u3 := &U{&s5, &ps6} // ERROR "tUPPiSPPia &U literal does not escape$" + v := &V{u1, u2, &u3} // ERROR "tUPPiSPPia &V literal does not escape$" Ssink = v.UPPiSPPia() // Ssink = *&ps6 = &s6 (only &s6 really escapes) } diff --git a/test/escape_struct_return.go b/test/escape_struct_return.go index 565f08ece3..8a9e0963fa 100644 --- a/test/escape_struct_return.go +++ b/test/escape_struct_return.go @@ -25,8 +25,8 @@ func B(spp **string) U { // ERROR "leaking param: spp to result ~r1 level=0$" "l func tA1() { s := "cat" - sp := &s // ERROR "tA1 &s does not escape$" - spp := &sp // ERROR "tA1 &sp does not escape$" + sp := &s + spp := &sp u := A(sp, spp) _ = u println(s) @@ -34,24 +34,24 @@ func tA1() { func tA2() { s := "cat" - sp := &s // ERROR "tA2 &s does not escape$" - spp := &sp // ERROR "tA2 &sp does not escape$" + sp := &s + spp := &sp u := A(sp, spp) println(*u._sp) } func tA3() { s := "cat" - sp := &s // ERROR "tA3 &s does not escape$" - spp := &sp // ERROR "tA3 &sp does not escape$" + sp := &s + spp := &sp u := A(sp, spp) println(**u._spp) } func tB1() { s := "cat" - sp := &s // ERROR "tB1 &s does not escape$" - spp := &sp // ERROR "tB1 &sp does not escape$" + sp := &s + spp := &sp u := B(spp) _ = u println(s) @@ -59,16 +59,16 @@ func tB1() { func tB2() { s := "cat" - sp := &s // ERROR "tB2 &s does not escape$" - spp := &sp // ERROR "tB2 &sp does not escape$" + sp := &s + spp := &sp u := B(spp) println(*u._sp) } func tB3() { s := "cat" - sp := &s // ERROR "tB3 &s does not escape$" - spp := &sp // ERROR "tB3 &sp does not escape$" + sp := &s + spp := &sp u := B(spp) println(**u._spp) } diff --git a/test/fixedbugs/issue12006.go b/test/fixedbugs/issue12006.go index 9d81a043fc..4a64e5416e 100644 --- a/test/fixedbugs/issue12006.go +++ b/test/fixedbugs/issue12006.go @@ -37,28 +37,28 @@ func FooNz(vals ...*int) (s int) { // ERROR "leaking param: vals" func TFooN() { for i := 0; i < 1000; i++ { var i, j int - FooN(&i, &j) // ERROR "TFooN &i does not escape" "TFooN &j does not escape" "TFooN ... argument does not escape" + FooN(&i, &j) // ERROR "TFooN ... argument does not escape" } } func TFooNx() { for i := 0; i < 1000; i++ { var i, j, k int // ERROR "moved to heap: i" "moved to heap: j" "moved to heap: k" - FooNx(&k, &i, &j) // ERROR "&k escapes to heap" "&i escapes to heap" "&j escapes to heap" "TFooNx ... argument does not escape" + FooNx(&k, &i, &j) // ERROR "TFooNx ... argument does not escape" } } func TFooNy() { for i := 0; i < 1000; i++ { var i, j, k int // ERROR "moved to heap: i" "moved to heap: j" "moved to heap: k" - FooNy(&k, &i, &j) // ERROR "&i escapes to heap" "&j escapes to heap" "&k escapes to heap" "... argument escapes to heap" + FooNy(&k, &i, &j) // ERROR "... argument escapes to heap" } } func TFooNz() { for i := 0; i < 1000; i++ { var i, j int // ERROR "moved to heap: i" "moved to heap: j" - FooNz(&i, &j) // ERROR "&i escapes to heap" "&j escapes to heap" "... argument escapes to heap" + FooNz(&i, &j) // ERROR "... argument escapes to heap" } } @@ -83,7 +83,7 @@ func FooI(args ...interface{}) { // ERROR "leaking param content: args" func TFooI() { a := int32(1) // ERROR "moved to heap: a" b := "cat" - c := &a // ERROR "&a escapes to heap" + c := &a FooI(a, b, c) // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooI ... argument does not escape" } @@ -107,14 +107,14 @@ func FooJ(args ...interface{}) *int32 { // ERROR "leaking param: args to result func TFooJ1() { a := int32(1) b := "cat" - c := &a // ERROR "TFooJ1 &a does not escape" + c := &a FooJ(a, b, c) // ERROR "TFooJ1 a does not escape" "TFooJ1 b does not escape" "TFooJ1 c does not escape" "TFooJ1 ... argument does not escape" } func TFooJ2() { a := int32(1) // ERROR "moved to heap: a" b := "cat" - c := &a // ERROR "&a escapes to heap" + c := &a isink = FooJ(a, b, c) // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooJ2 ... argument does not escape" } @@ -143,7 +143,7 @@ func FooK(args fakeSlice) *int32 { // ERROR "leaking param: args to result ~r1 l func TFooK2() { a := int32(1) // ERROR "moved to heap: a" b := "cat" - c := &a // ERROR "&a escapes to heap" + c := &a fs := fakeSlice{3, &[4]interface{}{a, b, c, nil}} // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooK2 &\[4\]interface {} literal does not escape" isink = FooK(fs) } @@ -168,7 +168,7 @@ func FooL(args []interface{}) *int32 { // ERROR "leaking param: args to result ~ func TFooL2() { a := int32(1) // ERROR "moved to heap: a" b := "cat" - c := &a // ERROR "&a escapes to heap" + c := &a s := []interface{}{a, b, c} // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooL2 \[\]interface {} literal does not escape" isink = FooL(s) } diff --git a/test/fixedbugs/issue12588.go b/test/fixedbugs/issue12588.go index 87f1d478d6..f99807b98b 100644 --- a/test/fixedbugs/issue12588.go +++ b/test/fixedbugs/issue12588.go @@ -18,7 +18,7 @@ type B struct { } func f(a A) int { - for i, x := range &a.b { // ERROR "f &a.b does not escape" + for i, x := range &a.b { if x != 0 { return 64*i + int(x) } @@ -27,7 +27,7 @@ func f(a A) int { } func g(a *A) int { // ERROR "g a does not escape" - for i, x := range &a.b { // ERROR "g &a.b does not escape" + for i, x := range &a.b { if x != 0 { return 64*i + int(x) } @@ -36,7 +36,7 @@ func g(a *A) int { // ERROR "g a does not escape" } func h(a *B) *uint64 { // ERROR "leaking param: a to result ~r1 level=1" - for i, x := range &a.b { // ERROR "h &a.b does not escape" + for i, x := range &a.b { if i == 0 { return x } @@ -45,7 +45,7 @@ func h(a *B) *uint64 { // ERROR "leaking param: a to result ~r1 level=1" } func h2(a *B) *uint64 { // ERROR "leaking param: a to result ~r1 level=1" - p := &a.b // ERROR "h2 &a.b does not escape" + p := &a.b for i, x := range p { if i == 0 { return x @@ -56,7 +56,7 @@ func h2(a *B) *uint64 { // ERROR "leaking param: a to result ~r1 level=1" // Seems like below should be level=1, not 0. func k(a B) *uint64 { // ERROR "leaking param: a to result ~r1 level=0" - for i, x := range &a.b { // ERROR "k &a.b does not escape" + for i, x := range &a.b { if i == 0 { return x } @@ -70,16 +70,16 @@ func main() { var a1, a2 A var b1, b2, b3, b4 B var x1, x2, x3, x4 uint64 // ERROR "moved to heap: x1" "moved to heap: x3" - b1.b[0] = &x1 // ERROR "&x1 escapes to heap" - b2.b[0] = &x2 // ERROR "main &x2 does not escape" - b3.b[0] = &x3 // ERROR "&x3 escapes to heap" - b4.b[0] = &x4 // ERROR "main &x4 does not escape" + b1.b[0] = &x1 + b2.b[0] = &x2 + b3.b[0] = &x3 + b4.b[0] = &x4 f(a1) - g(&a2) // ERROR "main &a2 does not escape" - sink = h(&b1) // ERROR "main &b1 does not escape" - h(&b2) // ERROR "main &b2 does not escape" - sink = h2(&b1) // ERROR "main &b1 does not escape" - h2(&b4) // ERROR "main &b4 does not escape" + g(&a2) + sink = h(&b1) + h(&b2) + sink = h2(&b1) + h2(&b4) x1 = 17 println("*sink=", *sink) // Verify that sink addresses x1 x3 = 42 diff --git a/test/fixedbugs/issue13799.go b/test/fixedbugs/issue13799.go index 4819b5af96..b9bf49ca42 100644 --- a/test/fixedbugs/issue13799.go +++ b/test/fixedbugs/issue13799.go @@ -50,10 +50,10 @@ func test1(iter int) { // var fn func() // this makes it work, because fn stays off heap j := 0 // ERROR "moved to heap: j$" fn = func() { // ERROR "func literal escapes to heap$" - m[i] = append(m[i], 0) // ERROR "&i escapes to heap$" - if j < 25 { // ERROR "&j escapes to heap$" + m[i] = append(m[i], 0) + if j < 25 { j++ - fn() // ERROR "&fn escapes to heap$" + fn() } } fn() @@ -92,16 +92,16 @@ func test3(iter int) { const maxI = 500 var x int // ERROR "moved to heap: x$" - m := &x // ERROR "&x escapes to heap$" + m := &x var fn func() // ERROR "moved to heap: fn$" for i := 0; i < maxI; i++ { // var fn func() // this makes it work, because fn stays off heap j := 0 // ERROR "moved to heap: j$" fn = func() { // ERROR "func literal escapes to heap$" - if j < 100 { // ERROR "&j escapes to heap$" + if j < 100 { j++ - fn() // ERROR "&fn escapes to heap$" + fn() } else { *m = *m + 1 } @@ -118,7 +118,7 @@ func test4(iter int) { const maxI = 500 var x int - m := &x // ERROR "test4 &x does not escape$" + m := &x // var fn func() for i := 0; i < maxI; i++ { @@ -157,7 +157,7 @@ func test5(iter int) { const maxI = 500 var x int // ERROR "moved to heap: x$" - m := &x // ERROR "&x escapes to heap$" + m := &x var fn *str for i := 0; i < maxI; i++ { @@ -175,7 +175,7 @@ func test6(iter int) { const maxI = 500 var x int - m := &x // ERROR "&x does not escape$" + m := &x // var fn *str for i := 0; i < maxI; i++ { diff --git a/test/fixedbugs/issue19743.go b/test/fixedbugs/issue19743.go index e57b19c8d0..5089cc61d8 100644 --- a/test/fixedbugs/issue19743.go +++ b/test/fixedbugs/issue19743.go @@ -22,8 +22,8 @@ func toString(b immutableBytes) string { // ERROR "leaking param: b$" return s } - strHeader := (*reflect.StringHeader)(unsafe.Pointer(&s)) // ERROR "toString &s does not escape$" - strHeader.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data // ERROR "toString &b does not escape$" + strHeader := (*reflect.StringHeader)(unsafe.Pointer(&s)) + strHeader.Data = (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data l := len(b) strHeader.Len = l diff --git a/test/fixedbugs/issue21709.go b/test/fixedbugs/issue21709.go index bf5d9d23f1..6e7f1d5ba6 100644 --- a/test/fixedbugs/issue21709.go +++ b/test/fixedbugs/issue21709.go @@ -17,7 +17,7 @@ func F1() { var s S // ERROR "moved to heap: s" for i := 0; i < N; i++ { fs := []func(){ // ERROR "F1 \[\]func\(\) literal does not escape" - s.Inc, // ERROR "F1 s.Inc does not escape" "s escapes to heap" + s.Inc, // ERROR "F1 s.Inc does not escape" } for _, f := range fs { f() @@ -29,7 +29,7 @@ func F2() { var s S // ERROR "moved to heap: s" for i := 0; i < N; i++ { for _, f := range []func(){ // ERROR "F2 \[\]func\(\) literal does not escape" - s.Inc, // ERROR "F2 s.Inc does not escape" "s escapes to heap" + s.Inc, // ERROR "F2 s.Inc does not escape" } { f() } diff --git a/test/fixedbugs/issue4099.go b/test/fixedbugs/issue4099.go index 8ea809c214..5a4ea7c998 100644 --- a/test/fixedbugs/issue4099.go +++ b/test/fixedbugs/issue4099.go @@ -19,8 +19,8 @@ func F2([]byte) func G() { var buf1 [10]byte - F1(buf1[:]) // ERROR "buf1 does not escape" + F1(buf1[:]) var buf2 [10]byte // ERROR "moved to heap: buf2" - F2(buf2[:]) // ERROR "buf2 escapes to heap" + F2(buf2[:]) } diff --git a/test/fixedbugs/issue7921.go b/test/fixedbugs/issue7921.go index ce8d09a276..e19b113062 100644 --- a/test/fixedbugs/issue7921.go +++ b/test/fixedbugs/issue7921.go @@ -17,9 +17,9 @@ func bufferNotEscape() string { // copied during String() call, but object "handle" itself // can be stack-allocated. var b bytes.Buffer - b.WriteString("123") // ERROR "bufferNotEscape b does not escape$" - b.Write([]byte{'4'}) // ERROR "bufferNotEscape \[\]byte literal does not escape$" "bufferNotEscape b does not escape$" - return b.String() // ERROR "bufferNotEscape b does not escape$" "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$" + b.WriteString("123") + b.Write([]byte{'4'}) // ERROR "bufferNotEscape \[\]byte literal does not escape$" + return b.String() // ERROR "inlining call to bytes.\(\*Buffer\).String$" "string\(bytes.b.buf\[bytes.b.off:\]\) escapes to heap$" } func bufferNoEscape2(xs []string) int { // ERROR "bufferNoEscape2 xs does not escape$" @@ -41,9 +41,9 @@ func bufferNoEscape3(xs []string) string { // ERROR "bufferNoEscape3 xs does not func bufferNoEscape4() []byte { var b bytes.Buffer - b.Grow(64) // ERROR "bufferNoEscape4 b does not escape$" "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$" - useBuffer(&b) // ERROR "bufferNoEscape4 &b does not escape$" - return b.Bytes() // ERROR "bufferNoEscape4 b does not escape$" "inlining call to bytes.\(\*Buffer\).Bytes$" + b.Grow(64) // ERROR "bufferNoEscape4 ignoring self-assignment in bytes.b.buf = bytes.b.buf\[:bytes.m·3\]$" "inlining call to bytes.\(\*Buffer\).Grow$" + useBuffer(&b) + return b.Bytes() // ERROR "inlining call to bytes.\(\*Buffer\).Bytes$" } func bufferNoEscape5() { // ERROR "can inline bufferNoEscape5$" diff --git a/test/inline.go b/test/inline.go index 9428c1487b..7e0551708e 100644 --- a/test/inline.go +++ b/test/inline.go @@ -74,7 +74,7 @@ func m() int { // address taking prevents closure inlining func n() int { foo := func() int { return 1 } // ERROR "can inline n.func1" "func literal does not escape" - bar := &foo // ERROR "&foo does not escape" + bar := &foo x := (*bar)() + foo() return x } @@ -115,7 +115,7 @@ func s0(x int) int { foo := func() { // ERROR "can inline s0.func1" "s0 func literal does not escape" x = x + 1 } - foo() // ERROR "inlining call to s0.func1" "&x does not escape" + foo() // ERROR "inlining call to s0.func1" return x } @@ -124,7 +124,7 @@ func s1(x int) int { return x } x = x + 1 - return foo() // ERROR "inlining call to s1.func1" "&x does not escape" + return foo() // ERROR "inlining call to s1.func1" } // can't currently inline functions with a break statement diff --git a/test/inline_sync.go b/test/inline_sync.go index 46ee4c62ed..30b436af41 100644 --- a/test/inline_sync.go +++ b/test/inline_sync.go @@ -24,30 +24,30 @@ var mutex *sync.Mutex func small5() { // ERROR "can inline small5" // the Unlock fast path should be inlined - mutex.Unlock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Unlock" "&sync\.m\.state escapes to heap" + mutex.Unlock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Unlock" } func small6() { // ERROR "can inline small6" // the Lock fast path should be inlined - mutex.Lock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Lock" "&sync\.m\.state escapes to heap" + mutex.Lock() // ERROR "inlining call to sync\.\(\*Mutex\)\.Lock" } var once *sync.Once func small7() { // ERROR "can inline small7" // the Do fast path should be inlined - once.Do(small5) // ERROR "inlining call to sync\.\(\*Once\)\.Do" "&sync\.o\.done escapes to heap" + once.Do(small5) // ERROR "inlining call to sync\.\(\*Once\)\.Do" } var rwmutex *sync.RWMutex func small8() { // ERROR "can inline small8" // the RUnlock fast path should be inlined - rwmutex.RUnlock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RUnlock" "&sync\.rw\.readerCount escapes to heap" + rwmutex.RUnlock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RUnlock" } func small9() { // ERROR "can inline small9" // the RLock fast path should be inlined - rwmutex.RLock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RLock" "&sync\.rw\.readerCount escapes to heap" "&sync\.rw\.readerSem escapes to heap" + rwmutex.RLock() // ERROR "inlining call to sync\.\(\*RWMutex\)\.RLock" } diff --git a/test/live_syscall.go b/test/live_syscall.go index 7b44717350..2d1ef14de7 100644 --- a/test/live_syscall.go +++ b/test/live_syscall.go @@ -19,22 +19,22 @@ func f(uintptr) // ERROR "f assuming arg#1 is unsafe uintptr" func g() { // ERROR "can inline g" var t int - f(uintptr(unsafe.Pointer(&t))) // ERROR "live at call to f: .?autotmp" "g &t does not escape" "stack object .autotmp_[0-9]+ unsafe.Pointer$" + f(uintptr(unsafe.Pointer(&t))) // ERROR "live at call to f: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$" } func h() { // ERROR "can inline h" var v int - syscall.Syscall(0, 1, uintptr(unsafe.Pointer(&v)), 2) // ERROR "live at call to Syscall: .?autotmp" "h &v does not escape" "stack object .autotmp_[0-9]+ unsafe.Pointer$" + syscall.Syscall(0, 1, uintptr(unsafe.Pointer(&v)), 2) // ERROR "live at call to Syscall: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$" } func i() { // ERROR "can inline i" var t int - p := unsafe.Pointer(&t) // ERROR "i &t does not escape" + p := unsafe.Pointer(&t) f(uintptr(p)) // ERROR "live at call to f: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$" } func j() { // ERROR "can inline j" var v int - p := unsafe.Pointer(&v) // ERROR "j &v does not escape" + p := unsafe.Pointer(&v) syscall.Syscall(0, 1, uintptr(p), 2) // ERROR "live at call to Syscall: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$" } diff --git a/test/uintptrescapes2.go b/test/uintptrescapes2.go index 2c8dfd7102..b8117b857b 100644 --- a/test/uintptrescapes2.go +++ b/test/uintptrescapes2.go @@ -30,9 +30,9 @@ func F4(...uintptr) {} // ERROR "escaping ...uintptr" func G() { var t int // ERROR "moved to heap" - F1(uintptr(unsafe.Pointer(&t))) // ERROR "live at call to F1: .?autotmp" "&t escapes to heap" "stack object .autotmp_[0-9]+ unsafe.Pointer$" + F1(uintptr(unsafe.Pointer(&t))) // ERROR "live at call to F1: .?autotmp" "stack object .autotmp_[0-9]+ unsafe.Pointer$" var t2 int // ERROR "moved to heap" - F3(uintptr(unsafe.Pointer(&t2))) // ERROR "live at call to F3: .?autotmp" "&t2 escapes to heap" + F3(uintptr(unsafe.Pointer(&t2))) // ERROR "live at call to F3: .?autotmp" } func H() { -- GitLab From e29f74efb90b8a7f20fd4ffce4038c824c173f50 Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Mon, 25 Feb 2019 13:56:18 +0100 Subject: [PATCH 0670/1679] compile,link: export package name in debug_info Add a new custom attribute to compile units containing the package name of the package (i.e. the name after the 'package' keyword), so that debuggers can know it when it's different from the last segment of the package path. Change-Id: Ieadaab6f47091aabf2f4dc42c8524452eaa6715b Reviewed-on: https://go-review.googlesource.com/c/go/+/163677 Run-TryBot: Alessandro Arzilli TryBot-Result: Gobot Gobot Reviewed-by: Heschi Kreinick --- src/cmd/compile/internal/gc/main.go | 14 +++++++ src/cmd/internal/dwarf/dwarf.go | 4 ++ src/cmd/link/internal/ld/dwarf.go | 6 +++ src/cmd/link/internal/ld/dwarf_test.go | 53 ++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 98ff2a3d27..20bc4acc6a 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -497,6 +497,8 @@ func Main(archInit func(*Arch)) { finishUniverse() + recordPackageName() + typecheckok = true // Process top-level declarations in phases. @@ -1406,6 +1408,18 @@ func recordFlags(flags ...string) { s.P = cmd.Bytes()[1:] } +// recordPackageName records the name of the package being +// compiled, so that the linker can save it in the compile unit's DIE. +func recordPackageName() { + s := Ctxt.Lookup(dwarf.CUInfoPrefix + "packagename." + myimportpath) + s.Type = objabi.SDWARFINFO + // Sometimes (for example when building tests) we can link + // together two package main archives. So allow dups. + s.Set(obj.AttrDuplicateOK, true) + Ctxt.Data = append(Ctxt.Data, s) + s.P = []byte(localpkg.Name) +} + // flag_lang is the language version we are compiling for, set by the -lang flag. var flag_lang string diff --git a/src/cmd/internal/dwarf/dwarf.go b/src/cmd/internal/dwarf/dwarf.go index 7f37cf059d..df80039063 100644 --- a/src/cmd/internal/dwarf/dwarf.go +++ b/src/cmd/internal/dwarf/dwarf.go @@ -298,6 +298,8 @@ const ( DW_AT_go_embedded_field = 0x2903 DW_AT_go_runtime_type = 0x2904 + DW_AT_go_package_name = 0x2905 // Attribute for DW_TAG_compile_unit + DW_AT_internal_location = 253 // params and locals; not emitted ) @@ -369,6 +371,7 @@ var abbrevs = [DW_NABRV]dwAbbrev{ {DW_AT_ranges, DW_FORM_sec_offset}, {DW_AT_comp_dir, DW_FORM_string}, {DW_AT_producer, DW_FORM_string}, + {DW_AT_go_package_name, DW_FORM_string}, }, }, @@ -381,6 +384,7 @@ var abbrevs = [DW_NABRV]dwAbbrev{ {DW_AT_language, DW_FORM_data1}, {DW_AT_comp_dir, DW_FORM_string}, {DW_AT_producer, DW_FORM_string}, + {DW_AT_go_package_name, DW_FORM_string}, }, }, diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index e86247dd04..feee63d065 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1833,6 +1833,12 @@ func dwarfGenerateDebugInfo(ctxt *Link) { newattr(unit.dwinfo, dwarf.DW_AT_producer, dwarf.DW_CLS_STRING, int64(len(producer)), producer) + var pkgname string + if s := ctxt.Syms.ROLookup(dwarf.CUInfoPrefix+"packagename."+unit.lib.Pkg, 0); s != nil { + pkgname = string(s.P) + } + newattr(unit.dwinfo, dwarf.DW_AT_go_package_name, dwarf.DW_CLS_STRING, int64(len(pkgname)), pkgname) + if len(lib.Textp) == 0 { unit.dwinfo.Abbrev = dwarf.DW_ABRV_COMPUNIT_TEXTLESS } diff --git a/src/cmd/link/internal/ld/dwarf_test.go b/src/cmd/link/internal/ld/dwarf_test.go index 287ad5c99d..333680511a 100644 --- a/src/cmd/link/internal/ld/dwarf_test.go +++ b/src/cmd/link/internal/ld/dwarf_test.go @@ -1142,3 +1142,56 @@ func main() { } } } + +func TestPackageNameAttr(t *testing.T) { + const dwarfAttrGoPackageName = dwarf.Attr(0x2905) + const dwarfGoLanguage = 22 + + testenv.MustHaveGoBuild(t) + + if runtime.GOOS == "plan9" { + t.Skip("skipping on plan9; no DWARF symbol table in executables") + } + + t.Parallel() + + dir, err := ioutil.TempDir("", "go-build") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + const prog = "package main\nfunc main() {\nprintln(\"hello world\")\n}\n" + + f := gobuild(t, dir, prog, NoOpt) + + defer f.Close() + + d, err := f.DWARF() + if err != nil { + t.Fatalf("error reading DWARF: %v", err) + } + + rdr := d.Reader() + for { + e, err := rdr.Next() + if err != nil { + t.Fatal(err) + } + if e == nil { + break + } + if e.Tag != dwarf.TagCompileUnit { + continue + } + if lang, _ := e.Val(dwarf.AttrLanguage).(int64); lang != dwarfGoLanguage { + continue + } + + _, ok := e.Val(dwarfAttrGoPackageName).(string) + if !ok { + name, _ := e.Val(dwarf.AttrName).(string) + t.Errorf("found compile unit without package name: %s", name) + } + } +} -- GitLab From 131eb8fbf80fd8b51ae8b5c5220d566582a41e71 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 1 Apr 2019 14:01:58 -0700 Subject: [PATCH 0671/1679] cmd/compile: trim more unnecessary escape analysis messages "leaking closure reference" is redundant for similar reasons as "&x escapes to heap" for OADDR nodes: the reference itself does not allocate, and we already report when the referenced variable is moved to heap. "mark escaped content" is redundant with "leaking param content". Updates #23109. Change-Id: I1ab599cb1e8434f1918dd80596a70cba7dc8a0cf Reviewed-on: https://go-review.googlesource.com/c/go/+/170321 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/esc.go | 8 -------- test/escape2.go | 24 ++++++++++++------------ test/escape2n.go | 24 ++++++++++++------------ test/escape_array.go | 8 ++++---- 4 files changed, 28 insertions(+), 36 deletions(-) diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index 5180a07ce8..f162fc641b 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -1837,10 +1837,6 @@ func (e *EscState) escwalkBody(level Level, dst *Node, src *Node, step *EscStep, src.Op == ONAME && src.Class() == PPARAM && src.Esc&EscMask < EscHeap && level.int() > 0 { src.Esc = escMax(EscContentEscapes|src.Esc, EscNone) - if Debug['m'] != 0 { - Warnl(src.Pos, "mark escaped content: %S", src) - step.describe(src) - } } leaks = level.int() <= 0 && level.guaranteedDereference() <= 0 && dstE.Loopdepth < modSrcLoopdepth @@ -1880,10 +1876,6 @@ func (e *EscState) escwalkBody(level Level, dst *Node, src *Node, step *EscStep, // Treat a captured closure variable as equivalent to the // original variable. if src.IsClosureVar() { - if leaks && Debug['m'] != 0 { - Warnl(src.Pos, "leaking closure reference %S", src) - step.describe(src) - } e.escwalk(level, dst, src.Name.Defn, e.stepWalk(dst, src.Name.Defn, "closure-var", step)) } diff --git a/test/escape2.go b/test/escape2.go index a95f89a5cd..e3561a0f60 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -1186,7 +1186,7 @@ func foo124(x **int) { // ERROR "foo124 x does not escape$" var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo124 func literal does not escape$" - *x = p // ERROR "leaking closure reference p$" + *x = p }() } @@ -1194,7 +1194,7 @@ func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo125 func literal does not escape$" - ch <- p // ERROR "leaking closure reference p$" + ch <- p }() } @@ -1204,7 +1204,7 @@ func foo126() { // loopdepth 1 var i int // ERROR "moved to heap: i$" func() { // ERROR "foo126 func literal does not escape$" - px = &i // ERROR "leaking closure reference i" + px = &i }() } _ = px @@ -1230,9 +1230,9 @@ func foo129() { var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo129 func literal does not escape$" - q := p // ERROR "leaking closure reference p$" + q := p func() { // ERROR "foo129.func1 func literal does not escape$" - r := q // ERROR "leaking closure reference q$" + r := q px = r }() }() @@ -1242,7 +1242,7 @@ func foo130() { for { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo130 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } } @@ -1250,21 +1250,21 @@ func foo130() { func foo131() { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo131 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } func foo132() { var i int // ERROR "moved to heap: i$" go func() { // ERROR "func literal escapes to heap$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } func foo133() { var i int // ERROR "moved to heap: i$" defer func() { // ERROR "foo133 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } @@ -1296,9 +1296,9 @@ func foo136() { var i int // ERROR "moved to heap: i$" p := &i go func() { // ERROR "func literal escapes to heap$" - q := p // ERROR "leaking closure reference p$" + q := p func() { // ERROR "foo136.func1 func literal does not escape$" - r := q // ERROR "leaking closure reference q$" + r := q px = r }() }() @@ -1308,7 +1308,7 @@ func foo137() { var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo137 func literal does not escape$" - q := p // ERROR "leaking closure reference p$" + q := p go func() { // ERROR "func literal escapes to heap$" r := q _ = r diff --git a/test/escape2n.go b/test/escape2n.go index bb29eea732..6ec198fd32 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -1186,7 +1186,7 @@ func foo124(x **int) { // ERROR "foo124 x does not escape$" var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo124 func literal does not escape$" - *x = p // ERROR "leaking closure reference p$" + *x = p }() } @@ -1194,7 +1194,7 @@ func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo125 func literal does not escape$" - ch <- p // ERROR "leaking closure reference p$" + ch <- p }() } @@ -1204,7 +1204,7 @@ func foo126() { // loopdepth 1 var i int // ERROR "moved to heap: i$" func() { // ERROR "foo126 func literal does not escape$" - px = &i // ERROR "leaking closure reference i" + px = &i }() } _ = px @@ -1230,9 +1230,9 @@ func foo129() { var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo129 func literal does not escape$" - q := p // ERROR "leaking closure reference p$" + q := p func() { // ERROR "foo129.func1 func literal does not escape$" - r := q // ERROR "leaking closure reference q$" + r := q px = r }() }() @@ -1242,7 +1242,7 @@ func foo130() { for { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo130 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } } @@ -1250,21 +1250,21 @@ func foo130() { func foo131() { var i int // ERROR "moved to heap: i$" func() { // ERROR "foo131 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } func foo132() { var i int // ERROR "moved to heap: i$" go func() { // ERROR "func literal escapes to heap$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } func foo133() { var i int // ERROR "moved to heap: i$" defer func() { // ERROR "foo133 func literal does not escape$" - px = &i // ERROR "leaking closure reference i$" + px = &i }() } @@ -1296,9 +1296,9 @@ func foo136() { var i int // ERROR "moved to heap: i$" p := &i go func() { // ERROR "func literal escapes to heap$" - q := p // ERROR "leaking closure reference p$" + q := p func() { // ERROR "foo136.func1 func literal does not escape$" - r := q // ERROR "leaking closure reference q$" + r := q px = r }() }() @@ -1308,7 +1308,7 @@ func foo137() { var i int // ERROR "moved to heap: i$" p := &i func() { // ERROR "foo137 func literal does not escape$" - q := p // ERROR "leaking closure reference p$" + q := p go func() { // ERROR "func literal escapes to heap$" r := q _ = r diff --git a/test/escape_array.go b/test/escape_array.go index 231186ca1f..d363b98eac 100644 --- a/test/escape_array.go +++ b/test/escape_array.go @@ -26,7 +26,7 @@ func bff(a, b *string) U { // ERROR "leaking param: a to result ~r2 level=0$" "l func tbff1() *string { a := "cat" - b := "dog" // ERROR "moved to heap: b$" + b := "dog" // ERROR "moved to heap: b$" u := bff(&a, &b) _ = u[0] return &b @@ -34,8 +34,8 @@ func tbff1() *string { // BAD: need fine-grained analysis to track u[0] and u[1] differently. func tbff2() *string { - a := "cat" // ERROR "moved to heap: a$" - b := "dog" // ERROR "moved to heap: b$" + a := "cat" // ERROR "moved to heap: a$" + b := "dog" // ERROR "moved to heap: b$" u := bff(&a, &b) _ = u[0] return u[1] @@ -71,7 +71,7 @@ func fuo(x *U, y *U) *string { // ERROR "leaking param: x to result ~r2 level=1$ // pointers stored in small array literals do not escape; // large array literals are heap allocated; // pointers stored in large array literals escape. -func hugeLeaks1(x **string, y **string) { // ERROR "leaking param content: x" "hugeLeaks1 y does not escape" "mark escaped content: x" +func hugeLeaks1(x **string, y **string) { // ERROR "leaking param content: x" "hugeLeaks1 y does not escape" a := [10]*string{*y} _ = a // 4 x 4,000,000 exceeds MaxStackVarSize, therefore it must be heap allocated if pointers are 4 bytes or larger. -- GitLab From 2d683807135d8179d292a4f6f03be3cf7e4d30d3 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 8 Feb 2019 11:24:29 -0500 Subject: [PATCH 0672/1679] cmd/go/internal/web2: make netrc parsing more robust - Respect the NETRC environment variable if set. - Ignore lines that contain macro definitions. - Associate the 'machine' token with only the tokens that follow (not precede) it. Updates #29888 Updates #26232 Change-Id: I3128b7d6da2d6492df7c864e165eea1a27384f0f Reviewed-on: https://go-review.googlesource.com/c/go/+/161698 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/web2/web.go | 78 ++++++++++++++++++++++------ src/cmd/go/internal/web2/web_test.go | 25 ++++++++- 2 files changed, 86 insertions(+), 17 deletions(-) diff --git a/src/cmd/go/internal/web2/web.go b/src/cmd/go/internal/web2/web.go index 64934f1d50..02b828ffa6 100644 --- a/src/cmd/go/internal/web2/web.go +++ b/src/cmd/go/internal/web2/web.go @@ -37,29 +37,61 @@ type netrcLine struct { password string } -var netrcOnce sync.Once -var netrc []netrcLine +var ( + netrcOnce sync.Once + netrc []netrcLine + netrcErr error +) func parseNetrc(data string) []netrcLine { + // See https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html + // for documentation on the .netrc format. var nrc []netrcLine var l netrcLine + inMacro := false for _, line := range strings.Split(data, "\n") { + if inMacro { + if line == "" { + inMacro = false + } + continue + } + f := strings.Fields(line) - for i := 0; i < len(f)-1; i += 2 { + i := 0 + for ; i < len(f)-1; i += 2 { + // Reset at each "machine" token. + // “The auto-login process searches the .netrc file for a machine token + // that matches […]. Once a match is made, the subsequent .netrc tokens + // are processed, stopping when the end of file is reached or another + // machine or a default token is encountered.” switch f[i] { case "machine": - l.machine = f[i+1] + l = netrcLine{machine: f[i+1]} + case "default": + break case "login": l.login = f[i+1] case "password": l.password = f[i+1] + case "macdef": + // “A macro is defined with the specified name; its contents begin with + // the next .netrc line and continue until a null line (consecutive + // new-line characters) is encountered.” + inMacro = true + } + if l.machine != "" && l.login != "" && l.password != "" { + nrc = append(nrc, l) + l = netrcLine{} } } - if l.machine != "" && l.login != "" && l.password != "" { - nrc = append(nrc, l) - l = netrcLine{} + + if i < len(f) && f[i] == "default" { + // “There can be only one default token, and it must be after all machine tokens.” + break } } + return nrc } @@ -73,22 +105,36 @@ func havePassword(machine string) bool { return false } -func netrcPath() string { - switch runtime.GOOS { - case "windows": - return filepath.Join(os.Getenv("USERPROFILE"), "_netrc") - case "plan9": - return filepath.Join(os.Getenv("home"), ".netrc") - default: - return filepath.Join(os.Getenv("HOME"), ".netrc") +func netrcPath() (string, error) { + if env := os.Getenv("NETRC"); env != "" { + return env, nil } + dir, err := os.UserHomeDir() + if err != nil { + return "", err + } + base := ".netrc" + if runtime.GOOS == "windows" { + base = "_netrc" + } + return filepath.Join(dir, base), nil } func readNetrc() { - data, err := ioutil.ReadFile(netrcPath()) + path, err := netrcPath() + if err != nil { + netrcErr = err + return + } + + data, err := ioutil.ReadFile(path) if err != nil { + if !os.IsNotExist(err) { + netrcErr = err + } return } + netrc = parseNetrc(string(data)) } diff --git a/src/cmd/go/internal/web2/web_test.go b/src/cmd/go/internal/web2/web_test.go index c6f6b1eff4..e6787a5b54 100644 --- a/src/cmd/go/internal/web2/web_test.go +++ b/src/cmd/go/internal/web2/web_test.go @@ -10,16 +10,37 @@ import ( ) var testNetrc = ` +machine incomplete +password none + machine api.github.com login user password pwd machine incomlete.host login justlogin - + machine test.host login user2 password pwd2 + +machine oneline login user3 password pwd3 + +machine ignore.host macdef ignore + login nobody + password nothing + +machine hasmacro.too macdef ignore-next-lines login user4 password pwd4 + login nobody + password nothing + +default +login anonymous +password gopher@golang.org + +machine after.default +login oops +password too-late-in-file ` func TestReadNetrc(t *testing.T) { @@ -27,6 +48,8 @@ func TestReadNetrc(t *testing.T) { want := []netrcLine{ {"api.github.com", "user", "pwd"}, {"test.host", "user2", "pwd2"}, + {"oneline", "user3", "pwd3"}, + {"hasmacro.too", "user4", "pwd4"}, } if !reflect.DeepEqual(lines, want) { -- GitLab From 20389553c7d287a4fffb9718e328a514640a915c Mon Sep 17 00:00:00 2001 From: Joel Sing Date: Wed, 20 Mar 2019 03:58:42 +1100 Subject: [PATCH 0673/1679] crypto/tls: simplify intermediate certificate handling The certificates argument to verifyServerCertificate must contain at least one certificate. Simplify the intermediate certificate handling code accordingly. Change-Id: I8292cdfb51f418e011d6d97f47d10b4e631aa932 Reviewed-on: https://go-review.googlesource.com/c/go/+/169657 Reviewed-by: Filippo Valsorda --- src/crypto/tls/handshake_client.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/crypto/tls/handshake_client.go b/src/crypto/tls/handshake_client.go index 31bd069bbc..c07cc6d507 100644 --- a/src/crypto/tls/handshake_client.go +++ b/src/crypto/tls/handshake_client.go @@ -826,11 +826,7 @@ func (c *Conn) verifyServerCertificate(certificates [][]byte) error { DNSName: c.config.ServerName, Intermediates: x509.NewCertPool(), } - - for i, cert := range certs { - if i == 0 { - continue - } + for _, cert := range certs[1:] { opts.Intermediates.AddCert(cert) } var err error -- GitLab From 814c97b3133d0e5a8aa884e2ef752aaf7e7bd500 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 2 Apr 2019 14:14:51 -0700 Subject: [PATCH 0674/1679] runtime/internal/atomic: fix wasm's StorepNoWB implementation Package unsafe's safety rules require that pointers converted to uintptr must be converted back to pointer-type before being stored into memory. In particular, storing a pointer into a non-pointer-typed expression does not guarantee the pointer stays valid, even if the expression refers to a pointer-typed variable. wasm's StorepNoWB implementation violates these rules by storing a pointer through a uintptr-typed expression. This happens to work today because esc.go is lenient in its implementation of package unsafe's rules, but my escape analysis rewrite follows them more rigorously, which causes val to be treated as a non-leaking parameter. This CL fixes the issue by using a *T-typed expression, where T is marked //go:notinheap so that the compiler still omits the write barrier as appropriate. Updates #23109. Change-Id: I49bc5474dbaa95729e5c93201493afe692591bc8 Reviewed-on: https://go-review.googlesource.com/c/go/+/170323 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/runtime/internal/atomic/atomic_wasm.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime/internal/atomic/atomic_wasm.go b/src/runtime/internal/atomic/atomic_wasm.go index 71288e9003..9c2193fa1b 100644 --- a/src/runtime/internal/atomic/atomic_wasm.go +++ b/src/runtime/internal/atomic/atomic_wasm.go @@ -123,10 +123,13 @@ func Store64(ptr *uint64, val uint64) { *ptr = val } +//go:notinheap +type noWB struct{} + //go:noinline //go:nosplit func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) { - *(*uintptr)(ptr) = uintptr(val) + *(**noWB)(ptr) = (*noWB)(val) } //go:nosplit -- GitLab From fc7ac2e8c0499d047ce0120a2f5df23093df6c17 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 2 Apr 2019 23:58:43 +0200 Subject: [PATCH 0675/1679] runtime/cgo: look for android_get_device_api_level in libc.so The presence of the android_get_device_api_level symbol is used to detect Android Q or later. Use the suggestion by Ryan Prichard and look for it in libc.so and not in the entire program where someone else might have defined it. Manually tested on an Android Q amd64 emulator and arm64 Pixel. Updates #29674 Change-Id: Iaef35d8f8910037b3690aa21f319e216a05a9a73 Reviewed-on: https://go-review.googlesource.com/c/go/+/170127 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/runtime/cgo/gcc_android.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/cgo/gcc_android.c b/src/runtime/cgo/gcc_android.c index a626cd0681..5075023282 100644 --- a/src/runtime/cgo/gcc_android.c +++ b/src/runtime/cgo/gcc_android.c @@ -50,7 +50,7 @@ inittls(void **tlsg, void **tlsbase) void *handle, *get_ver; // Check for Android Q where we can use the free TLS_SLOT_APP slot. - handle = dlopen(NULL, RTLD_LAZY); + handle = dlopen("libc.so", RTLD_LAZY); if (handle == NULL) { fatalf("inittls: failed to dlopen main program"); return; -- GitLab From 2da9659158f87c1d3c0ccb7ff8aec7c1bafe570b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 2 Apr 2019 15:05:33 -0700 Subject: [PATCH 0676/1679] misc/cgo/testcarchive: skip TestSignalForwardingExternal on darwin/amd64 On darwin/amd64 the runtime method sigctxt.fixsigcode changes SIGSEGV signals so that they are never marked SI_USER. CL 169120 changed the signal handler to call fixsigcode even when the signal is delivered to a non-Go thread. This breaks TestSignalForwardingExternal, so skip it. Change-Id: I6740fb5a8f4f854ca69793537a983a696da3b495 Reviewed-on: https://go-review.googlesource.com/c/go/+/170446 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- misc/cgo/testcarchive/carchive_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/misc/cgo/testcarchive/carchive_test.go b/misc/cgo/testcarchive/carchive_test.go index b7f04356a9..5fbe9caafb 100644 --- a/misc/cgo/testcarchive/carchive_test.go +++ b/misc/cgo/testcarchive/carchive_test.go @@ -325,6 +325,8 @@ func TestSignalForwarding(t *testing.T) { func TestSignalForwardingExternal(t *testing.T) { if GOOS == "freebsd" || GOOS == "aix" { t.Skipf("skipping on %s/%s; signal always goes to the Go runtime", GOOS, GOARCH) + } else if GOOS == "darwin" && GOARCH == "amd64" { + t.Skipf("skipping on %s/%s: runtime does not permit SI_USER SIGSEGV", GOOS, GOARCH) } checkSignalForwardingTest(t) -- GitLab From 64f22e4bd6a1c7fe8a2dcf52cc8ac4c39d5abbb4 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Mon, 7 Jan 2019 22:15:47 +0530 Subject: [PATCH 0677/1679] image/jpeg: reduce bound checks from idct and fdct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before - $gotip build -gcflags="-d=ssa/check_bce/debug=1" fdct.go idct.go ./fdct.go:89:10: Found IsInBounds ./fdct.go:90:10: Found IsInBounds ./fdct.go:91:10: Found IsInBounds ./fdct.go:92:10: Found IsInBounds ./fdct.go:93:10: Found IsInBounds ./fdct.go:94:10: Found IsInBounds ./fdct.go:95:10: Found IsInBounds ./fdct.go:96:10: Found IsInBounds ./idct.go:77:9: Found IsInBounds ./idct.go:77:27: Found IsInBounds ./idct.go:77:45: Found IsInBounds ./idct.go:78:7: Found IsInBounds ./idct.go:78:25: Found IsInBounds ./idct.go:78:43: Found IsInBounds ./idct.go:78:61: Found IsInBounds ./idct.go:79:13: Found IsInBounds ./idct.go:92:13: Found IsInBounds ./idct.go:93:12: Found IsInBounds ./idct.go:94:12: Found IsInBounds ./idct.go:95:12: Found IsInBounds ./idct.go:97:12: Found IsInBounds ./idct.go:98:12: Found IsInBounds ./idct.go:99:12: Found IsInBounds After - $gotip build -gcflags="-d=ssa/check_bce/debug=1" fdct.go idct.go ./fdct.go:90:9: Found IsSliceInBounds ./idct.go:76:11: Found IsSliceInBounds ./idct.go:145:11: Found IsSliceInBounds name old time/op new time/op delta FDCT-4 1.85µs ± 2% 1.74µs ± 1% -5.95% (p=0.000 n=10+10) IDCT-4 1.94µs ± 2% 1.89µs ± 1% -2.67% (p=0.000 n=10+9) DecodeBaseline-4 1.45ms ± 2% 1.46ms ± 1% ~ (p=0.156 n=9+10) DecodeProgressive-4 2.21ms ± 1% 2.21ms ± 1% ~ (p=0.796 n=10+10) EncodeRGBA-4 24.9ms ± 1% 25.0ms ± 1% ~ (p=0.075 n=10+10) EncodeYCbCr-4 26.1ms ± 1% 26.2ms ± 1% ~ (p=0.573 n=8+10) name old speed new speed delta DecodeBaseline-4 42.5MB/s ± 2% 42.4MB/s ± 1% ~ (p=0.162 n=9+10) DecodeProgressive-4 27.9MB/s ± 1% 27.9MB/s ± 1% ~ (p=0.796 n=10+10) EncodeRGBA-4 49.4MB/s ± 1% 49.1MB/s ± 1% ~ (p=0.066 n=10+10) EncodeYCbCr-4 35.3MB/s ± 1% 35.2MB/s ± 1% ~ (p=0.586 n=8+10) name old alloc/op new alloc/op delta DecodeBaseline-4 63.0kB ± 0% 63.0kB ± 0% ~ (all equal) DecodeProgressive-4 260kB ± 0% 260kB ± 0% ~ (all equal) EncodeRGBA-4 4.40kB ± 0% 4.40kB ± 0% ~ (all equal) EncodeYCbCr-4 4.40kB ± 0% 4.40kB ± 0% ~ (all equal) name old allocs/op new allocs/op delta DecodeBaseline-4 5.00 ± 0% 5.00 ± 0% ~ (all equal) DecodeProgressive-4 13.0 ± 0% 13.0 ± 0% ~ (all equal) EncodeRGBA-4 4.00 ± 0% 4.00 ± 0% ~ (all equal) EncodeYCbCr-4 4.00 ± 0% 4.00 ± 0% ~ (all equal) Updates #24499 Change-Id: I6828d077b851817503a7c1a08235763f81bdadf9 Reviewed-on: https://go-review.googlesource.com/c/go/+/167417 Run-TryBot: Agniva De Sarker TryBot-Result: Gobot Gobot Reviewed-by: Nigel Tao --- src/image/jpeg/fdct.go | 34 ++++++++-------- src/image/jpeg/idct.go | 88 +++++++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 59 deletions(-) diff --git a/src/image/jpeg/fdct.go b/src/image/jpeg/fdct.go index 201a5abd0b..c7a973ec3c 100644 --- a/src/image/jpeg/fdct.go +++ b/src/image/jpeg/fdct.go @@ -86,14 +86,16 @@ const ( func fdct(b *block) { // Pass 1: process rows. for y := 0; y < 8; y++ { - x0 := b[y*8+0] - x1 := b[y*8+1] - x2 := b[y*8+2] - x3 := b[y*8+3] - x4 := b[y*8+4] - x5 := b[y*8+5] - x6 := b[y*8+6] - x7 := b[y*8+7] + y8 := y * 8 + s := b[y8 : y8+8 : y8+8] // Small cap improves performance, see https://golang.org/issue/27857 + x0 := s[0] + x1 := s[1] + x2 := s[2] + x3 := s[3] + x4 := s[4] + x5 := s[5] + x6 := s[6] + x7 := s[7] tmp0 := x0 + x7 tmp1 := x1 + x6 @@ -110,12 +112,12 @@ func fdct(b *block) { tmp2 = x2 - x5 tmp3 = x3 - x4 - b[y*8+0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits - b[y*8+4] = (tmp10 - tmp11) << pass1Bits + s[0] = (tmp10 + tmp11 - 8*centerJSample) << pass1Bits + s[4] = (tmp10 - tmp11) << pass1Bits z1 := (tmp12 + tmp13) * fix_0_541196100 z1 += 1 << (constBits - pass1Bits - 1) - b[y*8+2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits) - b[y*8+6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits) + s[2] = (z1 + tmp12*fix_0_765366865) >> (constBits - pass1Bits) + s[6] = (z1 - tmp13*fix_1_847759065) >> (constBits - pass1Bits) tmp10 = tmp0 + tmp3 tmp11 = tmp1 + tmp2 @@ -134,10 +136,10 @@ func fdct(b *block) { tmp12 += z1 tmp13 += z1 - b[y*8+1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits) - b[y*8+3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits) - b[y*8+5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits) - b[y*8+7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits) + s[1] = (tmp0 + tmp10 + tmp12) >> (constBits - pass1Bits) + s[3] = (tmp1 + tmp11 + tmp13) >> (constBits - pass1Bits) + s[5] = (tmp2 + tmp11 + tmp12) >> (constBits - pass1Bits) + s[7] = (tmp3 + tmp10 + tmp13) >> (constBits - pass1Bits) } // Pass 2: process columns. // We remove pass1Bits scaling, but leave results scaled up by an overall factor of 8. diff --git a/src/image/jpeg/idct.go b/src/image/jpeg/idct.go index 46fcaecb79..a3957c8ada 100644 --- a/src/image/jpeg/idct.go +++ b/src/image/jpeg/idct.go @@ -73,30 +73,31 @@ func idct(src *block) { // Horizontal 1-D IDCT. for y := 0; y < 8; y++ { y8 := y * 8 + s := src[y8 : y8+8 : y8+8] // Small cap improves performance, see https://golang.org/issue/27857 // If all the AC components are zero, then the IDCT is trivial. - if src[y8+1] == 0 && src[y8+2] == 0 && src[y8+3] == 0 && - src[y8+4] == 0 && src[y8+5] == 0 && src[y8+6] == 0 && src[y8+7] == 0 { - dc := src[y8+0] << 3 - src[y8+0] = dc - src[y8+1] = dc - src[y8+2] = dc - src[y8+3] = dc - src[y8+4] = dc - src[y8+5] = dc - src[y8+6] = dc - src[y8+7] = dc + if s[1] == 0 && s[2] == 0 && s[3] == 0 && + s[4] == 0 && s[5] == 0 && s[6] == 0 && s[7] == 0 { + dc := s[0] << 3 + s[0] = dc + s[1] = dc + s[2] = dc + s[3] = dc + s[4] = dc + s[5] = dc + s[6] = dc + s[7] = dc continue } // Prescale. - x0 := (src[y8+0] << 11) + 128 - x1 := src[y8+4] << 11 - x2 := src[y8+6] - x3 := src[y8+2] - x4 := src[y8+1] - x5 := src[y8+7] - x6 := src[y8+5] - x7 := src[y8+3] + x0 := (s[0] << 11) + 128 + x1 := s[4] << 11 + x2 := s[6] + x3 := s[2] + x4 := s[1] + x5 := s[7] + x6 := s[5] + x7 := s[3] // Stage 1. x8 := w7 * (x4 + x5) @@ -126,14 +127,14 @@ func idct(src *block) { x4 = (r2*(x4-x5) + 128) >> 8 // Stage 4. - src[y8+0] = (x7 + x1) >> 8 - src[y8+1] = (x3 + x2) >> 8 - src[y8+2] = (x0 + x4) >> 8 - src[y8+3] = (x8 + x6) >> 8 - src[y8+4] = (x8 - x6) >> 8 - src[y8+5] = (x0 - x4) >> 8 - src[y8+6] = (x3 - x2) >> 8 - src[y8+7] = (x7 - x1) >> 8 + s[0] = (x7 + x1) >> 8 + s[1] = (x3 + x2) >> 8 + s[2] = (x0 + x4) >> 8 + s[3] = (x8 + x6) >> 8 + s[4] = (x8 - x6) >> 8 + s[5] = (x0 - x4) >> 8 + s[6] = (x3 - x2) >> 8 + s[7] = (x7 - x1) >> 8 } // Vertical 1-D IDCT. @@ -141,16 +142,17 @@ func idct(src *block) { // Similar to the horizontal 1-D IDCT case, if all the AC components are zero, then the IDCT is trivial. // However, after performing the horizontal 1-D IDCT, there are typically non-zero AC components, so // we do not bother to check for the all-zero case. + s := src[x : x+57 : x+57] // Small cap improves performance, see https://golang.org/issue/27857 // Prescale. - y0 := (src[8*0+x] << 8) + 8192 - y1 := src[8*4+x] << 8 - y2 := src[8*6+x] - y3 := src[8*2+x] - y4 := src[8*1+x] - y5 := src[8*7+x] - y6 := src[8*5+x] - y7 := src[8*3+x] + y0 := (s[8*0] << 8) + 8192 + y1 := s[8*4] << 8 + y2 := s[8*6] + y3 := s[8*2] + y4 := s[8*1] + y5 := s[8*7] + y6 := s[8*5] + y7 := s[8*3] // Stage 1. y8 := w7*(y4+y5) + 4 @@ -180,13 +182,13 @@ func idct(src *block) { y4 = (r2*(y4-y5) + 128) >> 8 // Stage 4. - src[8*0+x] = (y7 + y1) >> 14 - src[8*1+x] = (y3 + y2) >> 14 - src[8*2+x] = (y0 + y4) >> 14 - src[8*3+x] = (y8 + y6) >> 14 - src[8*4+x] = (y8 - y6) >> 14 - src[8*5+x] = (y0 - y4) >> 14 - src[8*6+x] = (y3 - y2) >> 14 - src[8*7+x] = (y7 - y1) >> 14 + s[8*0] = (y7 + y1) >> 14 + s[8*1] = (y3 + y2) >> 14 + s[8*2] = (y0 + y4) >> 14 + s[8*3] = (y8 + y6) >> 14 + s[8*4] = (y8 - y6) >> 14 + s[8*5] = (y0 - y4) >> 14 + s[8*6] = (y3 - y2) >> 14 + s[8*7] = (y7 - y1) >> 14 } } -- GitLab From e014184c438699b1637b1d623492f33669105002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 3 Apr 2019 13:58:57 +0200 Subject: [PATCH 0678/1679] syscall: on AIX use nsendmsg and nrecvmsg, define SockaddrDatalink This commit changes sendmsg, recvmsg to use nsendmsg, nrecvmsg on AIX. These syscalls support the new msghdr structure (with Control and Controllen) which is needed for golang.org/x/net. Also define SockaddrDataLink. Change-Id: I233fbd24f9eb86648e0d4d50c2b56da3626292d0 Reviewed-on: https://go-review.googlesource.com/c/go/+/170537 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/syscall/syscall_aix.go | 19 ++++++++++++++++-- src/syscall/types_aix.go | 24 +++++++++++++---------- src/syscall/zsyscall_aix_ppc64.go | 16 ++++++++-------- src/syscall/ztypes_aix_ppc64.go | 32 +++++++++++++++++++++---------- 4 files changed, 61 insertions(+), 30 deletions(-) diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 703cbf761c..0110ec12c1 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -225,8 +225,11 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) //sys Shutdown(s int, how int) (err error) -//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) -//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// In order to use msghdr structure with Control, Controllen in golang.org/x/net, +// nrecvmsg and nsendmsg must be used. +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = nrecvmsg +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { @@ -442,6 +445,18 @@ func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { return nil, EAFNOSUPPORT } +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [120]uint8 + raw RawSockaddrDatalink +} + /* * Wait */ diff --git a/src/syscall/types_aix.go b/src/syscall/types_aix.go index ee9380a673..cbc47cc6c1 100644 --- a/src/syscall/types_aix.go +++ b/src/syscall/types_aix.go @@ -23,6 +23,7 @@ package syscall #include #include +#include #include #include @@ -113,6 +114,8 @@ type RawSockaddrInet6 C.struct_sockaddr_in6 type RawSockaddrUnix C.struct_sockaddr_un +type RawSockaddrDatalink C.struct_sockaddr_dl + type RawSockaddr C.struct_sockaddr type RawSockaddrAny C.struct_sockaddr_any @@ -134,16 +137,17 @@ type Linger C.struct_linger type Msghdr C.struct_msghdr const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter ) // Ptrace requests diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index 5ee4f49d12..63ed69a3a2 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -32,8 +32,8 @@ import "unsafe" //go:cgo_import_dynamic libc_recvfrom recvfrom "libc.a/shr_64.o" //go:cgo_import_dynamic libc_sendto sendto "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Shutdown shutdown "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_recvmsg recvmsg "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_sendmsg sendmsg "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_nrecvmsg nrecvmsg "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_nsendmsg nsendmsg "libc.a/shr_64.o" //go:cgo_import_dynamic libc_accept accept "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Openat openat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_ptrace64 ptrace64 "libc.a/shr_64.o" @@ -122,8 +122,8 @@ import "unsafe" //go:linkname libc_recvfrom libc_recvfrom //go:linkname libc_sendto libc_sendto //go:linkname libc_Shutdown libc_Shutdown -//go:linkname libc_recvmsg libc_recvmsg -//go:linkname libc_sendmsg libc_sendmsg +//go:linkname libc_nrecvmsg libc_nrecvmsg +//go:linkname libc_nsendmsg libc_nsendmsg //go:linkname libc_accept libc_accept //go:linkname libc_Openat libc_Openat //go:linkname libc_ptrace64 libc_ptrace64 @@ -215,8 +215,8 @@ var ( libc_recvfrom, libc_sendto, libc_Shutdown, - libc_recvmsg, - libc_sendmsg, + libc_nrecvmsg, + libc_nsendmsg, libc_accept, libc_Openat, libc_ptrace64, @@ -578,7 +578,7 @@ func Shutdown(s int, how int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_nrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) @@ -589,7 +589,7 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { - r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_nsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) n = int(r0) if e1 != 0 { err = errnoErr(e1) diff --git a/src/syscall/ztypes_aix_ppc64.go b/src/syscall/ztypes_aix_ppc64.go index 68810dbe7e..e7a25ece67 100644 --- a/src/syscall/ztypes_aix_ppc64.go +++ b/src/syscall/ztypes_aix_ppc64.go @@ -166,6 +166,17 @@ type RawSockaddrUnix struct { Path [1023]uint8 } +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [120]uint8 +} + type RawSockaddr struct { Len uint8 Family uint8 @@ -220,16 +231,17 @@ type Msghdr struct { } const ( - SizeofSockaddrInet4 = 0x10 - SizeofSockaddrInet6 = 0x1c - SizeofSockaddrAny = 0x404 - SizeofSockaddrUnix = 0x401 - SizeofLinger = 0x8 - SizeofIPMreq = 0x8 - SizeofIPv6Mreq = 0x14 - SizeofMsghdr = 0x30 - SizeofCmsghdr = 0xc - SizeofICMPv6Filter = 0x20 + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x404 + SizeofSockaddrUnix = 0x401 + SizeofSockaddrDatalink = 0x80 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofICMPv6Filter = 0x20 ) const ( -- GitLab From 94507d2213fbd0a5e3b5276904f41c6bc0e03aba Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 2 Apr 2019 22:38:39 +0200 Subject: [PATCH 0679/1679] bytes: merge explodetests into splittests splittests already contains most of the tests that cover explode. Add the missing ones and skip the append test for empty results which would otherwise lead to an "index out of range" panic. Change-Id: I2cb922282d2676be9ef85f186513075ae17c0243 Reviewed-on: https://go-review.googlesource.com/c/go/+/170126 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/bytes/bytes_test.go | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index 4b000a3d2b..d760d4b52a 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -677,34 +677,6 @@ func BenchmarkCountSingle(b *testing.B) { }) } -type ExplodeTest struct { - s string - n int - a []string -} - -var explodetests = []ExplodeTest{ - {"", -1, []string{}}, - {abcd, -1, []string{"a", "b", "c", "d"}}, - {faces, -1, []string{"☺", "☻", "☹"}}, - {abcd, 2, []string{"a", "bcd"}}, -} - -func TestExplode(t *testing.T) { - for _, tt := range explodetests { - a := SplitN([]byte(tt.s), nil, tt.n) - result := sliceOfString(a) - if !eq(result, tt.a) { - t.Errorf(`Explode("%s", %d) = %v; want %v`, tt.s, tt.n, result, tt.a) - continue - } - s := Join(a, []byte{}) - if string(s) != tt.s { - t.Errorf(`Join(Explode("%s", %d), "") = "%s"`, tt.s, tt.n, s) - } - } -} - type SplitTest struct { s string sep string @@ -713,7 +685,9 @@ type SplitTest struct { } var splittests = []SplitTest{ + {"", "", -1, []string{}}, {abcd, "a", 0, nil}, + {abcd, "", 2, []string{"a", "bcd"}}, {abcd, "a", -1, []string{"", "bcd"}}, {abcd, "z", -1, []string{"abcd"}}, {abcd, "", -1, []string{"a", "b", "c", "d"}}, @@ -743,7 +717,7 @@ func TestSplit(t *testing.T) { t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a) continue } - if tt.n == 0 { + if tt.n == 0 || len(a) == 0 { continue } -- GitLab From 17436af8413071a50515c90af69c23f77cb201e3 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 3 Apr 2019 09:45:48 -0400 Subject: [PATCH 0680/1679] cmd/go/internal/modload: fix aliasing bug in (*mvsReqs).Required with -mod=vendor (*mvsReqs).Required assumes that it is safe to mutate the slice returned by (*mvsReqs).required. In most cases, that was true, but in the case of -mod=vendor it resulted in unsynchronized (and potentially interfering) writes to the global vendorList. Fixes #30550 Change-Id: I99bcc2037e0182418b7dfda1002f8b540dbf3a1d Reviewed-on: https://go-review.googlesource.com/c/go/+/170598 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/modload/load.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index d55e0c5403..ea0ac6771f 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -976,27 +976,27 @@ func readVendorList() { } func (r *mvsReqs) modFileToList(f *modfile.File) []module.Version { - var list []module.Version + list := make([]module.Version, 0, len(f.Require)) for _, r := range f.Require { list = append(list, r.Mod) } return list } +// required returns a unique copy of the requirements of mod. func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { if mod == Target { if modFile != nil && modFile.Go != nil { r.versions.LoadOrStore(mod, modFile.Go.Version) } - var list []module.Version - return append(list, r.buildList[1:]...), nil + return append([]module.Version(nil), r.buildList[1:]...), nil } if cfg.BuildMod == "vendor" { // For every module other than the target, // return the full list of modules from modules.txt. readVendorList() - return vendorList, nil + return append([]module.Version(nil), vendorList...), nil } if targetInGorootSrc { -- GitLab From 556b3f5bdf935d80d83b26520838852fd840ef70 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 2 Apr 2019 23:23:24 -0700 Subject: [PATCH 0681/1679] test: add regress tests for unsafe.Pointer rules Updates #23109. Change-Id: I55f7860c868acc948a6397ab6a9295e177724a56 Reviewed-on: https://go-review.googlesource.com/c/go/+/170450 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- test/escape_unsafe.go | 69 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 test/escape_unsafe.go diff --git a/test/escape_unsafe.go b/test/escape_unsafe.go new file mode 100644 index 0000000000..16f14c07be --- /dev/null +++ b/test/escape_unsafe.go @@ -0,0 +1,69 @@ +// errorcheck -0 -m -l + +// Copyright 2019 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. + +// Test escape analysis for unsafe.Pointer rules. + +package escape + +import ( + "reflect" + "unsafe" +) + +// (1) Conversion of a *T1 to Pointer to *T2. + +func convert(p *float64) *uint64 { // ERROR "leaking param: p to result ~r1 level=0$" + return (*uint64)(unsafe.Pointer(p)) +} + +// (3) Conversion of a Pointer to a uintptr and back, with arithmetic. + +func arithAdd() unsafe.Pointer { + var x [2]byte // ERROR "moved to heap: x" + return unsafe.Pointer(uintptr(unsafe.Pointer(&x[0])) + 1) +} + +func arithSub() unsafe.Pointer { + var x [2]byte // ERROR "moved to heap: x" + return unsafe.Pointer(uintptr(unsafe.Pointer(&x[1])) - 1) +} + +func arithMask() unsafe.Pointer { + var x [2]byte // ERROR "moved to heap: x" + return unsafe.Pointer(uintptr(unsafe.Pointer(&x[1])) &^ 1) +} + +// (5) Conversion of the result of reflect.Value.Pointer or +// reflect.Value.UnsafeAddr from uintptr to Pointer. + +// BAD: should be "leaking param: p to result ~r1 level=0$" +func valuePointer(p *int) unsafe.Pointer { // ERROR "leaking param: p$" + return unsafe.Pointer(reflect.ValueOf(p).Pointer()) // ERROR "p escapes to heap" +} + +// BAD: should be "leaking param: p to result ~r1 level=0$" +func valueUnsafeAddr(p *int) unsafe.Pointer { // ERROR "leaking param: p$" + return unsafe.Pointer(reflect.ValueOf(p).Elem().UnsafeAddr()) // ERROR "p escapes to heap" +} + +// (6) Conversion of a reflect.SliceHeader or reflect.StringHeader +// Data field to or from Pointer. + +func fromSliceData(s []int) unsafe.Pointer { // ERROR "leaking param: s to result ~r1 level=0$" + return unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&s)).Data) +} + +func fromStringData(s string) unsafe.Pointer { // ERROR "leaking param: s to result ~r1 level=0$" + return unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&s)).Data) +} + +func toSliceData(s *[]int, p unsafe.Pointer) { // ERROR "s does not escape" "leaking param: p$" + (*reflect.SliceHeader)(unsafe.Pointer(s)).Data = uintptr(p) +} + +func toStringData(s *string, p unsafe.Pointer) { // ERROR "s does not escape" "leaking param: p$" + (*reflect.SliceHeader)(unsafe.Pointer(s)).Data = uintptr(p) +} -- GitLab From 2cc17bc5f205345ae215806266343d0bb013a861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 23 Nov 2018 16:56:23 +0000 Subject: [PATCH 0682/1679] encoding/json: speed up tokenization of literals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decoder.Decode and Unmarshal actually scan the input bytes twice - the first time to check for syntax errors and the length of the value, and the second to perform the decoding. It's in the second scan that we actually tokenize the bytes. Since syntax errors aren't a possibility, we can take shortcuts. In particular, literals such as quoted strings are very common in JSON, so we can avoid a lot of work by special casing them. name old time/op new time/op delta CodeDecoder-8 10.3ms ± 1% 9.1ms ± 0% -11.89% (p=0.002 n=6+6) UnicodeDecoder-8 342ns ± 0% 283ns ± 0% -17.25% (p=0.000 n=6+5) DecoderStream-8 239ns ± 0% 230ns ± 0% -3.90% (p=0.000 n=6+5) CodeUnmarshal-8 11.0ms ± 0% 9.8ms ± 0% -11.45% (p=0.002 n=6+6) CodeUnmarshalReuse-8 10.3ms ± 0% 9.0ms ± 0% -12.72% (p=0.004 n=5+6) UnmarshalString-8 104ns ± 0% 92ns ± 0% -11.35% (p=0.002 n=6+6) UnmarshalFloat64-8 93.2ns ± 0% 87.6ns ± 0% -6.01% (p=0.010 n=6+4) UnmarshalInt64-8 74.5ns ± 0% 71.5ns ± 0% -3.91% (p=0.000 n=5+6) name old speed new speed delta CodeDecoder-8 189MB/s ± 1% 214MB/s ± 0% +13.50% (p=0.002 n=6+6) UnicodeDecoder-8 40.9MB/s ± 0% 49.5MB/s ± 0% +20.96% (p=0.002 n=6+6) CodeUnmarshal-8 176MB/s ± 0% 199MB/s ± 0% +12.93% (p=0.002 n=6+6) Updates #28923. Change-Id: I7a5e2aef51bd4ddf2004aad24210f6f50e01eaeb Reviewed-on: https://go-review.googlesource.com/c/go/+/151042 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/json/decode.go | 54 ++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 3f9fe1f573..59b6fd166c 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -361,6 +361,52 @@ func (d *decodeState) scanWhile(op int) { d.opcode = d.scan.eof() } +// rescanLiteral is similar to scanWhile(scanContinue), but it specialises the +// common case where we're decoding a literal. The decoder scans the input +// twice, once for syntax errors and to check the length of the value, and the +// second to perform the decoding. +// +// Only in the second step do we use decodeState to tokenize literals, so we +// know there aren't any syntax errors. We can take advantage of that knowledge, +// and scan a literal's bytes much more quickly. +func (d *decodeState) rescanLiteral() { + data, i := d.data, d.off +Switch: + switch data[i-1] { + case '"': // string + for ; i < len(data); i++ { + switch data[i] { + case '\\': + i++ // escaped char + case '"': + i++ // tokenize the closing quote too + break Switch + } + } + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number + for ; i < len(data); i++ { + switch data[i] { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + '.', 'e', 'E', '+', '-': + default: + break Switch + } + } + case 't': // true + i += len("rue") + case 'f': // false + i += len("alse") + case 'n': // null + i += len("ull") + } + if i < len(data) { + d.opcode = stateEndValue(&d.scan, data[i]) + } else { + d.opcode = scanEnd + } + d.off = i + 1 +} + // value consumes a JSON value from d.data[d.off-1:], decoding into v, and // reads the following byte ahead. If v is invalid, the value is discarded. // The first byte of the value has been read already. @@ -392,7 +438,7 @@ func (d *decodeState) value(v reflect.Value) error { case scanBeginLiteral: // All bytes inside literal return scanContinue op code. start := d.readIndex() - d.scanWhile(scanContinue) + d.rescanLiteral() if v.IsValid() { if err := d.literalStore(d.data[start:d.readIndex()], v, false); err != nil { @@ -677,7 +723,7 @@ func (d *decodeState) object(v reflect.Value) error { // Read key. start := d.readIndex() - d.scanWhile(scanContinue) + d.rescanLiteral() item := d.data[start:d.readIndex()] key, ok := unquoteBytes(item) if !ok { @@ -1083,7 +1129,7 @@ func (d *decodeState) objectInterface() map[string]interface{} { // Read string key. start := d.readIndex() - d.scanWhile(scanContinue) + d.rescanLiteral() item := d.data[start:d.readIndex()] key, ok := unquote(item) if !ok { @@ -1122,7 +1168,7 @@ func (d *decodeState) objectInterface() map[string]interface{} { func (d *decodeState) literalInterface() interface{} { // All bytes inside literal return scanContinue op code. start := d.readIndex() - d.scanWhile(scanContinue) + d.rescanLiteral() item := d.data[start:d.readIndex()] -- GitLab From b0bcd7aeb0060361fc8ff04cc4b6764aa146b086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 3 Apr 2019 14:58:05 +0200 Subject: [PATCH 0683/1679] cmd/go: add a note in help buildmode for c-archive on AIX As ld on AIX doesn't keep the same layout in .text section, -Wl,-bnoobjreoder must be passed to gcc when building a C program with a Go archive. Change-Id: I89b584cce43ab5792f315192b073923c10d5690e Reviewed-on: https://go-review.googlesource.com/c/go/+/170538 Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/cmd/go/alldocs.go | 3 +++ src/cmd/go/internal/help/helpdoc.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index f02df514b7..de07d910d8 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1421,6 +1421,9 @@ // Build the listed main packages, plus all packages that they // import, into a Go plugin. Packages not named main are ignored. // +// On AIX, when linking a C program that uses a Go archive built with +// -buildmode=c-archive, you must pass -Wl,-bnoobjreorder to the C compiler. +// // // Calling between Go and C // diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index 777bd511b1..eb663e99b6 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -689,6 +689,9 @@ are: -buildmode=plugin Build the listed main packages, plus all packages that they import, into a Go plugin. Packages not named main are ignored. + +On AIX, when linking a C program that uses a Go archive built with +-buildmode=c-archive, you must pass -Wl,-bnoobjreorder to the C compiler. `, } -- GitLab From 8c896aa46655cfbdfd9971fb16a830046fcdf81c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 3 Apr 2019 09:33:13 -0400 Subject: [PATCH 0684/1679] cmd/go/internal/lockedfile: add a sync.Mutex to lockedfile.Mutex MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The compiler (and race detector) don't interpret locking a file as a synchronization operation, so we add an explicit (and redundant) sync.Mutex to make that property clear. The additional synchronization makes it safe to parallelize the tests in cmd/go/internal/modfetch/coderepo_test.go, which cuts the wall time of that test by around 50%. Updates #30550 Change-Id: Ief3479020ebf9e0fee524a4aae5568697727c683 Reviewed-on: https://go-review.googlesource.com/c/go/+/170597 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Daniel Martí Reviewed-by: Jay Conrod --- src/cmd/go/internal/lockedfile/mutex.go | 11 +- src/cmd/go/internal/modfetch/coderepo_test.go | 321 ++++++++++-------- 2 files changed, 180 insertions(+), 152 deletions(-) diff --git a/src/cmd/go/internal/lockedfile/mutex.go b/src/cmd/go/internal/lockedfile/mutex.go index 17f3751c37..180a36c620 100644 --- a/src/cmd/go/internal/lockedfile/mutex.go +++ b/src/cmd/go/internal/lockedfile/mutex.go @@ -7,6 +7,7 @@ package lockedfile import ( "fmt" "os" + "sync" ) // A Mutex provides mutual exclusion within and across processes by locking a @@ -21,7 +22,8 @@ import ( // must not be copied after first use. The Path field must be set before first // use and must not be change thereafter. type Mutex struct { - Path string // The path to the well-known lock file. Must be non-empty. + Path string // The path to the well-known lock file. Must be non-empty. + mu sync.Mutex // A redundant mutex. The race detector doesn't know about file locking, so in tests we may need to lock something that it understands. } // MutexAt returns a new Mutex with Path set to the given non-empty path. @@ -56,5 +58,10 @@ func (mu *Mutex) Lock() (unlock func(), err error) { if err != nil { return nil, err } - return func() { f.Close() }, nil + mu.mu.Lock() + + return func() { + mu.mu.Unlock() + f.Close() + }, nil } diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index 078362700f..68bede80d9 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -45,7 +45,7 @@ var altVgotests = []string{ vgotest1hg, } -var codeRepoTests = []struct { +type codeRepoTest struct { path string lookerr string mpath string @@ -59,7 +59,9 @@ var codeRepoTests = []struct { gomoderr string zip []string ziperr string -}{ +} + +var codeRepoTests = []codeRepoTest{ { path: "github.com/rsc/vgotest1", rev: "v0.0.0", @@ -339,131 +341,138 @@ var codeRepoTests = []struct { func TestCodeRepo(t *testing.T) { testenv.MustHaveExternalNetwork(t) - tmpdir, err := ioutil.TempDir("", "vgo-modfetch-test-") + tmpdir, err := ioutil.TempDir("", "modfetch-test-") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpdir) - for _, tt := range codeRepoTests { - f := func(t *testing.T) { - repo, err := Lookup(tt.path) - if tt.lookerr != "" { - if err != nil && err.Error() == tt.lookerr { - return - } - t.Errorf("Lookup(%q): %v, want error %q", tt.path, err, tt.lookerr) - } - if err != nil { - t.Fatalf("Lookup(%q): %v", tt.path, err) - } - if tt.mpath == "" { - tt.mpath = tt.path - } - if mpath := repo.ModulePath(); mpath != tt.mpath { - t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath) - } - info, err := repo.Stat(tt.rev) - if err != nil { - if tt.err != "" { - if !strings.Contains(err.Error(), tt.err) { - t.Fatalf("repoStat(%q): %v, wanted %q", tt.rev, err, tt.err) + + t.Run("parallel", func(t *testing.T) { + for _, tt := range codeRepoTests { + f := func(tt codeRepoTest) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + repo, err := Lookup(tt.path) + if tt.lookerr != "" { + if err != nil && err.Error() == tt.lookerr { + return + } + t.Errorf("Lookup(%q): %v, want error %q", tt.path, err, tt.lookerr) } - return - } - t.Fatalf("repo.Stat(%q): %v", tt.rev, err) - } - if tt.err != "" { - t.Errorf("repo.Stat(%q): success, wanted error", tt.rev) - } - if info.Version != tt.version { - t.Errorf("info.Version = %q, want %q", info.Version, tt.version) - } - if info.Name != tt.name { - t.Errorf("info.Name = %q, want %q", info.Name, tt.name) - } - if info.Short != tt.short { - t.Errorf("info.Short = %q, want %q", info.Short, tt.short) - } - if !info.Time.Equal(tt.time) { - t.Errorf("info.Time = %v, want %v", info.Time, tt.time) - } - if tt.gomod != "" || tt.gomoderr != "" { - data, err := repo.GoMod(tt.version) - if err != nil && tt.gomoderr == "" { - t.Errorf("repo.GoMod(%q): %v", tt.version, err) - } else if err != nil && tt.gomoderr != "" { - if err.Error() != tt.gomoderr { - t.Errorf("repo.GoMod(%q): %v, want %q", tt.version, err, tt.gomoderr) + if err != nil { + t.Fatalf("Lookup(%q): %v", tt.path, err) } - } else if tt.gomoderr != "" { - t.Errorf("repo.GoMod(%q) = %q, want error %q", tt.version, data, tt.gomoderr) - } else if string(data) != tt.gomod { - t.Errorf("repo.GoMod(%q) = %q, want %q", tt.version, data, tt.gomod) - } - } - if tt.zip != nil || tt.ziperr != "" { - f, err := ioutil.TempFile(tmpdir, tt.version+".zip.") - if err != nil { - t.Fatalf("ioutil.TempFile: %v", err) - } - zipfile := f.Name() - err = repo.Zip(f, tt.version) - f.Close() - if err != nil { - if tt.ziperr != "" { - if err.Error() == tt.ziperr { + if tt.mpath == "" { + tt.mpath = tt.path + } + if mpath := repo.ModulePath(); mpath != tt.mpath { + t.Errorf("repo.ModulePath() = %q, want %q", mpath, tt.mpath) + } + info, err := repo.Stat(tt.rev) + if err != nil { + if tt.err != "" { + if !strings.Contains(err.Error(), tt.err) { + t.Fatalf("repoStat(%q): %v, wanted %q", tt.rev, err, tt.err) + } return } - t.Fatalf("repo.Zip(%q): %v, want error %q", tt.version, err, tt.ziperr) + t.Fatalf("repo.Stat(%q): %v", tt.rev, err) } - t.Fatalf("repo.Zip(%q): %v", tt.version, err) - } - if tt.ziperr != "" { - t.Errorf("repo.Zip(%q): success, want error %q", tt.version, tt.ziperr) - } - prefix := tt.path + "@" + tt.version + "/" - z, err := zip.OpenReader(zipfile) - if err != nil { - t.Fatalf("open zip %s: %v", zipfile, err) - } - var names []string - for _, file := range z.File { - if !strings.HasPrefix(file.Name, prefix) { - t.Errorf("zip entry %v does not start with prefix %v", file.Name, prefix) - continue + if tt.err != "" { + t.Errorf("repo.Stat(%q): success, wanted error", tt.rev) + } + if info.Version != tt.version { + t.Errorf("info.Version = %q, want %q", info.Version, tt.version) + } + if info.Name != tt.name { + t.Errorf("info.Name = %q, want %q", info.Name, tt.name) + } + if info.Short != tt.short { + t.Errorf("info.Short = %q, want %q", info.Short, tt.short) + } + if !info.Time.Equal(tt.time) { + t.Errorf("info.Time = %v, want %v", info.Time, tt.time) + } + if tt.gomod != "" || tt.gomoderr != "" { + data, err := repo.GoMod(tt.version) + if err != nil && tt.gomoderr == "" { + t.Errorf("repo.GoMod(%q): %v", tt.version, err) + } else if err != nil && tt.gomoderr != "" { + if err.Error() != tt.gomoderr { + t.Errorf("repo.GoMod(%q): %v, want %q", tt.version, err, tt.gomoderr) + } + } else if tt.gomoderr != "" { + t.Errorf("repo.GoMod(%q) = %q, want error %q", tt.version, data, tt.gomoderr) + } else if string(data) != tt.gomod { + t.Errorf("repo.GoMod(%q) = %q, want %q", tt.version, data, tt.gomod) + } + } + if tt.zip != nil || tt.ziperr != "" { + f, err := ioutil.TempFile(tmpdir, tt.version+".zip.") + if err != nil { + t.Fatalf("ioutil.TempFile: %v", err) + } + zipfile := f.Name() + err = repo.Zip(f, tt.version) + f.Close() + if err != nil { + if tt.ziperr != "" { + if err.Error() == tt.ziperr { + return + } + t.Fatalf("repo.Zip(%q): %v, want error %q", tt.version, err, tt.ziperr) + } + t.Fatalf("repo.Zip(%q): %v", tt.version, err) + } + if tt.ziperr != "" { + t.Errorf("repo.Zip(%q): success, want error %q", tt.version, tt.ziperr) + } + prefix := tt.path + "@" + tt.version + "/" + z, err := zip.OpenReader(zipfile) + if err != nil { + t.Fatalf("open zip %s: %v", zipfile, err) + } + var names []string + for _, file := range z.File { + if !strings.HasPrefix(file.Name, prefix) { + t.Errorf("zip entry %v does not start with prefix %v", file.Name, prefix) + continue + } + names = append(names, file.Name[len(prefix):]) + } + z.Close() + if !reflect.DeepEqual(names, tt.zip) { + t.Fatalf("zip = %v\nwant %v\n", names, tt.zip) + } } - names = append(names, file.Name[len(prefix):]) - } - z.Close() - if !reflect.DeepEqual(names, tt.zip) { - t.Fatalf("zip = %v\nwant %v\n", names, tt.zip) } } - } - t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f) - if strings.HasPrefix(tt.path, vgotest1git) { - for _, alt := range altVgotests { - // Note: Communicating with f through tt; should be cleaned up. - old := tt - tt.path = alt + strings.TrimPrefix(tt.path, vgotest1git) - if strings.HasPrefix(tt.mpath, vgotest1git) { - tt.mpath = alt + strings.TrimPrefix(tt.mpath, vgotest1git) - } - var m map[string]string - if alt == vgotest1hg { - m = hgmap + t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f(tt)) + if strings.HasPrefix(tt.path, vgotest1git) { + for _, alt := range altVgotests { + // Note: Communicating with f through tt; should be cleaned up. + old := tt + tt.path = alt + strings.TrimPrefix(tt.path, vgotest1git) + if strings.HasPrefix(tt.mpath, vgotest1git) { + tt.mpath = alt + strings.TrimPrefix(tt.mpath, vgotest1git) + } + var m map[string]string + if alt == vgotest1hg { + m = hgmap + } + tt.version = remap(tt.version, m) + tt.name = remap(tt.name, m) + tt.short = remap(tt.short, m) + tt.rev = remap(tt.rev, m) + tt.gomoderr = remap(tt.gomoderr, m) + tt.ziperr = remap(tt.ziperr, m) + t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f(tt)) + tt = old } - tt.version = remap(tt.version, m) - tt.name = remap(tt.name, m) - tt.short = remap(tt.short, m) - tt.rev = remap(tt.rev, m) - tt.gomoderr = remap(tt.gomoderr, m) - tt.ziperr = remap(tt.ziperr, m) - t.Run(strings.ReplaceAll(tt.path, "/", "_")+"/"+tt.rev, f) - tt = old } } - } + }) } var hgmap = map[string]string{ @@ -538,21 +547,27 @@ func TestCodeRepoVersions(t *testing.T) { t.Fatal(err) } defer os.RemoveAll(tmpdir) - for _, tt := range codeRepoVersionsTests { - t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { - repo, err := Lookup(tt.path) - if err != nil { - t.Fatalf("Lookup(%q): %v", tt.path, err) - } - list, err := repo.Versions(tt.prefix) - if err != nil { - t.Fatalf("Versions(%q): %v", tt.prefix, err) - } - if !reflect.DeepEqual(list, tt.versions) { - t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions) - } - }) - } + + t.Run("parallel", func(t *testing.T) { + for _, tt := range codeRepoVersionsTests { + t.Run(strings.ReplaceAll(tt.path, "/", "_"), func(t *testing.T) { + tt := tt + t.Parallel() + + repo, err := Lookup(tt.path) + if err != nil { + t.Fatalf("Lookup(%q): %v", tt.path, err) + } + list, err := repo.Versions(tt.prefix) + if err != nil { + t.Fatalf("Versions(%q): %v", tt.prefix, err) + } + if !reflect.DeepEqual(list, tt.versions) { + t.Fatalf("Versions(%q):\nhave %v\nwant %v", tt.prefix, list, tt.versions) + } + }) + } + }) } var latestTests = []struct { @@ -586,31 +601,37 @@ func TestLatest(t *testing.T) { t.Fatal(err) } defer os.RemoveAll(tmpdir) - for _, tt := range latestTests { - name := strings.ReplaceAll(tt.path, "/", "_") - t.Run(name, func(t *testing.T) { - repo, err := Lookup(tt.path) - if err != nil { - t.Fatalf("Lookup(%q): %v", tt.path, err) - } - info, err := repo.Latest() - if err != nil { - if tt.err != "" { - if err.Error() == tt.err { - return + + t.Run("parallel", func(t *testing.T) { + for _, tt := range latestTests { + name := strings.ReplaceAll(tt.path, "/", "_") + t.Run(name, func(t *testing.T) { + tt := tt + t.Parallel() + + repo, err := Lookup(tt.path) + if err != nil { + t.Fatalf("Lookup(%q): %v", tt.path, err) + } + info, err := repo.Latest() + if err != nil { + if tt.err != "" { + if err.Error() == tt.err { + return + } + t.Fatalf("Latest(): %v, want %q", err, tt.err) } - t.Fatalf("Latest(): %v, want %q", err, tt.err) + t.Fatalf("Latest(): %v", err) } - t.Fatalf("Latest(): %v", err) - } - if tt.err != "" { - t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err) - } - if info.Version != tt.version { - t.Fatalf("Latest() = %v, want %v", info.Version, tt.version) - } - }) - } + if tt.err != "" { + t.Fatalf("Latest() = %v, want error %q", info.Version, tt.err) + } + if info.Version != tt.version { + t.Fatalf("Latest() = %v, want %v", info.Version, tt.version) + } + }) + } + }) } // fixedTagsRepo is a fake codehost.Repo that returns a fixed list of tags -- GitLab From 1e3cdd1edce67350f8007e4a9b9b555f1e27c5b4 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 11 Mar 2019 18:53:08 -0400 Subject: [PATCH 0685/1679] cmd/go: print require chains in build list errors mvs.BuildList and functions that invoke it directly (UpgradeAll) now return an *mvs.BuildListError when there is an error retrieving the requirements for a module. This new error prints the chain of requirements from the main module to the module where the error occurred. These errors come up most commonly when a go.mod file has an unexpected module path or can't be parsed for some other reason. It's currently difficult to debug these errors because it's not clear where the "bad" module is required from. Tools like "go list -m" and "go mod why" don't work without the build graph. Fixes #30661 Change-Id: I3c9d4683dcd9a5d7c259e5e4cc7e1ee209700b10 Reviewed-on: https://go-review.googlesource.com/c/go/+/166984 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/load.go | 23 +--- src/cmd/go/internal/mvs/mvs.go | 122 ++++++++++++++---- src/cmd/go/internal/mvs/mvs_test.go | 5 +- .../mod/example.com_badchain_a_v1.0.0.txt | 12 ++ .../mod/example.com_badchain_a_v1.1.0.txt | 12 ++ .../mod/example.com_badchain_b_v1.0.0.txt | 12 ++ .../mod/example.com_badchain_b_v1.1.0.txt | 12 ++ .../mod/example.com_badchain_c_v1.0.0.txt | 8 ++ .../mod/example.com_badchain_c_v1.1.0.txt | 8 ++ .../go/testdata/script/mod_load_badchain.txt | 41 ++++++ 10 files changed, 209 insertions(+), 46 deletions(-) create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt create mode 100644 src/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt create mode 100644 src/cmd/go/testdata/script/mod_load_badchain.txt diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index ea0ac6771f..78681b165a 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -1023,13 +1023,11 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { gomod := filepath.Join(dir, "go.mod") data, err := ioutil.ReadFile(gomod) if err != nil { - base.Errorf("go: parsing %s: %v", base.ShortPath(gomod), err) - return nil, ErrRequire + return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err) } f, err := modfile.ParseLax(gomod, data, nil) if err != nil { - base.Errorf("go: parsing %s: %v", base.ShortPath(gomod), err) - return nil, ErrRequire + return nil, fmt.Errorf("parsing %s: %v", base.ShortPath(gomod), err) } if f.Go != nil { r.versions.LoadOrStore(mod, f.Go.Version) @@ -1050,22 +1048,18 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { data, err := modfetch.GoMod(mod.Path, mod.Version) if err != nil { - base.Errorf("go: %s@%s: %v\n", mod.Path, mod.Version, err) - return nil, ErrRequire + return nil, fmt.Errorf("%s@%s: %v", mod.Path, mod.Version, err) } f, err := modfile.ParseLax("go.mod", data, nil) if err != nil { - base.Errorf("go: %s@%s: parsing go.mod: %v", mod.Path, mod.Version, err) - return nil, ErrRequire + return nil, fmt.Errorf("%s@%s: parsing go.mod: %v", mod.Path, mod.Version, err) } if f.Module == nil { - base.Errorf("go: %s@%s: parsing go.mod: missing module line", mod.Path, mod.Version) - return nil, ErrRequire + return nil, fmt.Errorf("%s@%s: parsing go.mod: missing module line", mod.Path, mod.Version) } if mpath := f.Module.Mod.Path; mpath != origPath && mpath != mod.Path { - base.Errorf("go: %s@%s: parsing go.mod: unexpected module path %q", mod.Path, mod.Version, mpath) - return nil, ErrRequire + return nil, fmt.Errorf("%s@%s: parsing go.mod: unexpected module path %q", mod.Path, mod.Version, mpath) } if f.Go != nil { r.versions.LoadOrStore(mod, f.Go.Version) @@ -1074,11 +1068,6 @@ func (r *mvsReqs) required(mod module.Version) ([]module.Version, error) { return r.modFileToList(f), nil } -// ErrRequire is the sentinel error returned when Require encounters problems. -// It prints the problems directly to standard error, so that multiple errors -// can be displayed easily. -var ErrRequire = errors.New("error loading module requirements") - func (*mvsReqs) Max(v1, v2 string) string { if v1 != "" && semver.Compare(v1, v2) == -1 { return v2 diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go index aa109693f3..160e6089db 100644 --- a/src/cmd/go/internal/mvs/mvs.go +++ b/src/cmd/go/internal/mvs/mvs.go @@ -9,7 +9,9 @@ package mvs import ( "fmt" "sort" + "strings" "sync" + "sync/atomic" "cmd/go/internal/base" "cmd/go/internal/module" @@ -59,12 +61,38 @@ type Reqs interface { Previous(m module.Version) (module.Version, error) } -type MissingModuleError struct { - Module module.Version +// BuildListError decorates an error that occurred gathering requirements +// while constructing a build list. BuildListError prints the chain +// of requirements to the module where the error occurred. +type BuildListError struct { + Err error + Stack []module.Version } -func (e *MissingModuleError) Error() string { - return fmt.Sprintf("missing module: %v", e.Module) +func (e *BuildListError) Error() string { + b := &strings.Builder{} + errMsg := e.Err.Error() + stack := e.Stack + + // Don't print modules at the beginning of the chain without a + // version. These always seem to be the main module or a + // synthetic module ("target@"). + for len(stack) > 0 && stack[len(stack)-1].Version == "" { + stack = stack[:len(stack)-1] + } + + // Don't print the last module if the error message already + // starts with module path and version. + if len(stack) > 0 && strings.HasPrefix(errMsg, fmt.Sprintf("%s@%s: ", stack[0].Path, stack[0].Version)) { + // error already mentions module + stack = stack[1:] + } + + for i := len(stack) - 1; i >= 0; i-- { + fmt.Fprintf(b, "%s@%s ->\n\t", stack[i].Path, stack[i].Version) + } + b.WriteString(errMsg) + return b.String() } // BuildList returns the build list for the target module. @@ -78,33 +106,40 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) mo // does high-latency network operations. var work par.Work work.Add(target) + + type modGraphNode struct { + m module.Version + required []module.Version + upgrade module.Version + err error + } var ( mu sync.Mutex - min = map[string]string{target.Path: target.Version} - firstErr error + modGraph = map[module.Version]*modGraphNode{} + min = map[string]string{} // maps module path to minimum required version + haveErr int32 ) + + work.Add(target) work.Do(10, func(item interface{}) { m := item.(module.Version) - required, err := reqs.Required(m) + node := &modGraphNode{m: m} mu.Lock() - if err != nil && firstErr == nil { - firstErr = err - } - if firstErr != nil { - mu.Unlock() - return - } + modGraph[m] = node if v, ok := min[m.Path]; !ok || reqs.Max(v, m.Version) != v { min[m.Path] = m.Version } mu.Unlock() - for _, r := range required { - if r.Path == "" { - base.Errorf("Required(%v) returned zero module in list", m) - continue - } + required, err := reqs.Required(m) + if err != nil { + node.err = err + atomic.StoreInt32(&haveErr, 1) + return + } + node.required = required + for _, r := range node.required { work.Add(r) } @@ -114,13 +149,49 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) mo base.Errorf("Upgrade(%v) returned zero module", m) return } - work.Add(u) + if u != m { + node.upgrade = u + work.Add(u) + } } }) - if firstErr != nil { - return nil, firstErr + // If there was an error, find the shortest path from the target to the + // node where the error occurred so we can report a useful error message. + if haveErr != 0 { + // neededBy[a] = b means a was added to the module graph by b. + neededBy := make(map[*modGraphNode]*modGraphNode) + q := make([]*modGraphNode, 0, len(modGraph)) + q = append(q, modGraph[target]) + for len(q) > 0 { + node := q[0] + q = q[1:] + + if node.err != nil { + err := &BuildListError{Err: node.err} + for n := node; n != nil; n = neededBy[n] { + err.Stack = append(err.Stack, n.m) + } + return nil, err + } + + neighbors := node.required + if node.upgrade.Path != "" { + neighbors = append(neighbors, node.upgrade) + } + for _, neighbor := range neighbors { + nn := modGraph[neighbor] + if neededBy[nn] != nil { + continue + } + neededBy[nn] = node + q = append(q, nn) + } + } } + + // Construct the list by traversing the graph again, replacing older + // modules with required minimum versions. if v := min[target.Path]; v != target.Version { panic(fmt.Sprintf("mistake: chose version %q instead of target %+v", v, target)) // TODO: Don't panic. } @@ -128,11 +199,8 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) mo list := []module.Version{target} listed := map[string]bool{target.Path: true} for i := 0; i < len(list); i++ { - m := list[i] - required, err := reqs.Required(m) - if err != nil { - return nil, err - } + n := modGraph[list[i]] + required := n.required for _, r := range required { v := min[r.Path] if r.Path != target.Path && reqs.Max(v, r.Version) != v { diff --git a/src/cmd/go/internal/mvs/mvs_test.go b/src/cmd/go/internal/mvs/mvs_test.go index 2a27dfb288..cab4bb241b 100644 --- a/src/cmd/go/internal/mvs/mvs_test.go +++ b/src/cmd/go/internal/mvs/mvs_test.go @@ -5,6 +5,7 @@ package mvs import ( + "fmt" "reflect" "strings" "testing" @@ -446,7 +447,7 @@ func (r reqsMap) Upgrade(m module.Version) (module.Version, error) { } } if u.Path == "" { - return module.Version{}, &MissingModuleError{module.Version{Path: m.Path, Version: ""}} + return module.Version{}, fmt.Errorf("missing module: %v", module.Version{Path: m.Path}) } return u, nil } @@ -467,7 +468,7 @@ func (r reqsMap) Previous(m module.Version) (module.Version, error) { func (r reqsMap) Required(m module.Version) ([]module.Version, error) { rr, ok := r[m] if !ok { - return nil, &MissingModuleError{m} + return nil, fmt.Errorf("missing module: %v", m) } return rr, nil } diff --git a/src/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt new file mode 100644 index 0000000000..d7bf6471b7 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_a_v1.0.0.txt @@ -0,0 +1,12 @@ +example.com/badchain/a v1.0.0 + +-- .mod -- +module example.com/badchain/a + +require example.com/badchain/b v1.0.0 +-- .info -- +{"Version":"v1.0.0"} +-- a.go -- +package a + +import _ "example.com/badchain/b" diff --git a/src/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt new file mode 100644 index 0000000000..92190d8ac1 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_a_v1.1.0.txt @@ -0,0 +1,12 @@ +example.com/badchain/a v1.1.0 + +-- .mod -- +module example.com/badchain/a + +require example.com/badchain/b v1.1.0 +-- .info -- +{"Version":"v1.1.0"} +-- a.go -- +package a + +import _ "example.com/badchain/b" diff --git a/src/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt new file mode 100644 index 0000000000..d42b8aab16 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_b_v1.0.0.txt @@ -0,0 +1,12 @@ +example.com/badchain/b v1.0.0 + +-- .mod -- +module example.com/badchain/b + +require example.com/badchain/c v1.0.0 +-- .info -- +{"Version":"v1.0.0"} +-- b.go -- +package b + +import _ "example.com/badchain/c" diff --git a/src/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt new file mode 100644 index 0000000000..664818474c --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_b_v1.1.0.txt @@ -0,0 +1,12 @@ +example.com/badchain/b v1.1.0 + +-- .mod -- +module example.com/badchain/b + +require example.com/badchain/c v1.1.0 +-- .info -- +{"Version":"v1.1.0"} +-- b.go -- +package b + +import _ "example.com/badchain/c" diff --git a/src/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt new file mode 100644 index 0000000000..9c717cb0e6 --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_c_v1.0.0.txt @@ -0,0 +1,8 @@ +example.com/badchain/c v1.0.0 + +-- .mod -- +module example.com/badchain/c +-- .info -- +{"Version":"v1.0.0"} +-- c.go -- +package c diff --git a/src/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt b/src/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt new file mode 100644 index 0000000000..da19ebd9ec --- /dev/null +++ b/src/cmd/go/testdata/mod/example.com_badchain_c_v1.1.0.txt @@ -0,0 +1,8 @@ +example.com/badchain/c v1.1.0 + +-- .mod -- +module example.com/badchain/wrong +-- .info -- +{"Version":"v1.1.0"} +-- c.go -- +package c diff --git a/src/cmd/go/testdata/script/mod_load_badchain.txt b/src/cmd/go/testdata/script/mod_load_badchain.txt new file mode 100644 index 0000000000..ded6e1669d --- /dev/null +++ b/src/cmd/go/testdata/script/mod_load_badchain.txt @@ -0,0 +1,41 @@ +[short] skip +env GO111MODULE=on + +# Download everything to avoid "finding" messages in stderr later. +cp go.mod.orig go.mod +go mod download +go mod download example.com/badchain/a@v1.1.0 +go mod download example.com/badchain/b@v1.1.0 +go mod download example.com/badchain/c@v1.1.0 + +# Try to upgrade example.com/badchain/a (and its dependencies). +! go get -u example.com/badchain/a +cmp stderr upgrade-a-expected +cmp go.mod go.mod.orig + +# Try to upgrade the main module. This upgrades everything, including +# modules that aren't direct requirements, so the error stack is shorter. +! go get -u +cmp stderr upgrade-main-expected +cmp go.mod go.mod.orig + +# Upgrade manually. Listing modules should produce an error. +go mod edit -require=example.com/badchain/a@v1.1.0 +! go list -m +cmp stderr list-expected + +-- go.mod.orig -- +module m + +require example.com/badchain/a v1.0.0 +-- upgrade-main-expected -- +go get: example.com/badchain/c@v1.0.0 -> + example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" +-- upgrade-a-expected -- +go get: example.com/badchain/a@v1.1.0 -> + example.com/badchain/b@v1.1.0 -> + example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" +-- list-expected -- +go: example.com/badchain/a@v1.1.0 -> + example.com/badchain/b@v1.1.0 -> + example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" -- GitLab From ce17481b7a83fb6eee2c00a6ce70ef024ae03aef Mon Sep 17 00:00:00 2001 From: Kenichi Tsunokawa Date: Wed, 3 Apr 2019 17:56:44 +0000 Subject: [PATCH 0686/1679] mime: add .jpeg for builtin Change-Id: I32b0c02039d8baca1358dac2cc0afd14fa6cd173 GitHub-Last-Rev: d3be7aa039fbe94450c54f2c1dc5a510cf183378 GitHub-Pull-Request: golang/go#31232 Reviewed-on: https://go-review.googlesource.com/c/go/+/170657 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/mime/type.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mime/type.go b/src/mime/type.go index 3a8fe4447f..a7292387c0 100644 --- a/src/mime/type.go +++ b/src/mime/type.go @@ -62,6 +62,7 @@ var builtinTypesLower = map[string]string{ ".htm": "text/html; charset=utf-8", ".html": "text/html; charset=utf-8", ".jpg": "image/jpeg", + ".jpeg": "image/jpeg", ".js": "application/javascript", ".wasm": "application/wasm", ".pdf": "application/pdf", -- GitLab From f33b67b870208071a737768a6165198ccf340ec0 Mon Sep 17 00:00:00 2001 From: Romain Baugue Date: Wed, 27 Mar 2019 10:13:38 +0100 Subject: [PATCH 0687/1679] reflect: document that method sets are lexicographically sorted Fixes #30688 Change-Id: I8b63feba4b18bc07a09f6fbfaa33c1b3326b40e6 Reviewed-on: https://go-review.googlesource.com/c/go/+/169597 Reviewed-by: Rob Pike --- src/reflect/type.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/reflect/type.go b/src/reflect/type.go index 83e59014ed..7aafc505bd 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -54,6 +54,9 @@ type Type interface { // // For an interface type, the returned Method's Type field gives the // method signature, without a receiver, and the Func field is nil. + // + // Only exported methods are accessible and they are sorted in + // lexicographic order. Method(int) Method // MethodByName returns the method with that name in the type's -- GitLab From 61e0cac2988c29130417a323fd539604983854fb Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 3 Apr 2019 19:38:11 +0000 Subject: [PATCH 0688/1679] strings: document that NewReplacer can panic Fixes #31233 Change-Id: I2831d5e6532d3f4ed7eb99af5d6e0e1a41ebac9a Reviewed-on: https://go-review.googlesource.com/c/go/+/170624 Reviewed-by: Andrew Bonventre --- src/strings/replace.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/strings/replace.go b/src/strings/replace.go index ace0b8d646..ccab1fb861 100644 --- a/src/strings/replace.go +++ b/src/strings/replace.go @@ -26,6 +26,8 @@ type replacer interface { // NewReplacer returns a new Replacer from a list of old, new string // pairs. Replacements are performed in the order they appear in the // target string, without overlapping matches. +// +// NewReplacer panics if given an odd number of arguments. func NewReplacer(oldnew ...string) *Replacer { if len(oldnew)%2 == 1 { panic("strings.NewReplacer: odd argument count") -- GitLab From a8b4bee683cbb54601bccefbfc28f95aa4340526 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 3 Apr 2019 13:27:31 -0400 Subject: [PATCH 0689/1679] cmd/go/internal/modfetch: replace nanomsg.org with vcs-test in TestCodeRepo nanomsg.org currently performs an HTTPS-to-HTTP redirect, so this case fails after the fix for #29591. Updates #29591 Change-Id: I6306d378ef213e98c0271258bbc6669bb33f9021 Reviewed-on: https://go-review.googlesource.com/c/go/+/170637 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modfetch/coderepo_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/internal/modfetch/coderepo_test.go b/src/cmd/go/internal/modfetch/coderepo_test.go index 68bede80d9..fcea6a0c1b 100644 --- a/src/cmd/go/internal/modfetch/coderepo_test.go +++ b/src/cmd/go/internal/modfetch/coderepo_test.go @@ -328,13 +328,13 @@ var codeRepoTests = []codeRepoTest{ gomod: "module gopkg.in/natefinch/lumberjack.v2\n", }, { - path: "nanomsg.org/go/mangos/v2", - rev: "v2.0.2", - version: "v2.0.2", - name: "63f66a65137b9a648ac9f7bf0160b4a4d17d7999", - short: "63f66a65137b", - time: time.Date(2018, 12, 1, 15, 7, 40, 0, time.UTC), - gomod: "module nanomsg.org/go/mangos/v2\n\nrequire (\n\tgithub.com/Microsoft/go-winio v0.4.11\n\tgithub.com/droundy/goopt v0.0.0-20170604162106-0b8effe182da\n\tgithub.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect\n\tgithub.com/gorilla/websocket v1.4.0\n\tgithub.com/jtolds/gls v4.2.1+incompatible // indirect\n\tgithub.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d // indirect\n\tgithub.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c\n\tgolang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect\n)\n", + path: "vcs-test.golang.org/go/v2module/v2", + rev: "v2.0.0", + version: "v2.0.0", + name: "203b91c896acd173aa719e4cdcb7d463c4b090fa", + short: "203b91c896ac", + time: time.Date(2019, 4, 3, 15, 52, 15, 0, time.UTC), + gomod: "module vcs-test.golang.org/go/v2module/v2\n\ngo 1.12\n", }, } -- GitLab From e9d12739976cbc25deb9226db25897c4824a8684 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 8 Jan 2019 10:34:16 -0500 Subject: [PATCH 0690/1679] cmd/go/internal/web: reject insecure redirects from secure origins We rely on SSL certificates to verify the identity of origin servers. If an HTTPS server redirects through a plain-HTTP URL, that hop can be compromised. We should allow it only if the user set the -insecure flag explicitly. Fixes #29591 Change-Id: I00639541cca2ca034c01c464385a43b3aa8ee84f Reviewed-on: https://go-review.googlesource.com/c/go/+/156838 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/go_test.go | 16 --------------- src/cmd/go/internal/web/http.go | 20 +++++++++++++------ .../testdata/script/get_insecure_redirect.txt | 11 ++++++++++ 3 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 src/cmd/go/testdata/script/get_insecure_redirect.txt diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index d7e9ab4c74..473f62ca5b 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -3407,22 +3407,6 @@ func TestGoGetDotSlashDownload(t *testing.T) { tg.run("get", "./pprof_mac_fix") } -// Issue 13037: Was not parsing tags in 404 served over HTTPS -func TestGoGetHTTPS404(t *testing.T) { - testenv.MustHaveExternalNetwork(t) - switch runtime.GOOS { - case "darwin", "linux", "freebsd": - default: - t.Skipf("test case does not work on %s", runtime.GOOS) - } - - tg := testgo(t) - defer tg.cleanup() - tg.tempDir("src") - tg.setenv("GOPATH", tg.path(".")) - tg.run("get", "bazil.org/fuse/fs/fstestutil") -} - // Test that you cannot import a main package. // See golang.org/issue/4210 and golang.org/issue/17475. func TestImportMain(t *testing.T) { diff --git a/src/cmd/go/internal/web/http.go b/src/cmd/go/internal/web/http.go index 6e347fbf86..c1714b4d38 100644 --- a/src/cmd/go/internal/web/http.go +++ b/src/cmd/go/internal/web/http.go @@ -25,10 +25,6 @@ import ( "cmd/internal/browser" ) -// httpClient is the default HTTP client, but a variable so it can be -// changed by tests, without modifying http.DefaultClient. -var httpClient = http.DefaultClient - // impatientInsecureHTTPClient is used in -insecure mode, // when we're connecting to https servers that might not be there // or might be using self-signed certificates. @@ -42,6 +38,18 @@ var impatientInsecureHTTPClient = &http.Client{ }, } +// securityPreservingHTTPClient is like the default HTTP client, but rejects +// redirects to plain-HTTP URLs if the original URL was secure. +var securityPreservingHTTPClient = &http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + if len(via) > 0 && via[0].URL.Scheme == "https" && req.URL.Scheme != "https" { + lastHop := via[len(via)-1].URL + return fmt.Errorf("redirected from secure URL %s to insecure URL %s", lastHop, req.URL) + } + return nil + }, +} + type HTTPError struct { status string StatusCode int @@ -54,7 +62,7 @@ func (e *HTTPError) Error() string { // Get returns the data from an HTTP GET request for the given URL. func Get(url string) ([]byte, error) { - resp, err := httpClient.Get(url) + resp, err := securityPreservingHTTPClient.Get(url) if err != nil { return nil, err } @@ -87,7 +95,7 @@ func GetMaybeInsecure(importPath string, security SecurityMode) (urlStr string, if security == Insecure && scheme == "https" { // fail earlier res, err = impatientInsecureHTTPClient.Get(urlStr) } else { - res, err = httpClient.Get(urlStr) + res, err = securityPreservingHTTPClient.Get(urlStr) } return } diff --git a/src/cmd/go/testdata/script/get_insecure_redirect.txt b/src/cmd/go/testdata/script/get_insecure_redirect.txt new file mode 100644 index 0000000000..c3520bfcab --- /dev/null +++ b/src/cmd/go/testdata/script/get_insecure_redirect.txt @@ -0,0 +1,11 @@ +# golang.org/issue/13037: 'go get' was not parsing tags in 404 served over HTTPS. +# golang.org/issue/29591: 'go get' was following plain-HTTP redirects even without -insecure. + +[!net] skip + +env GOPROXY= + +! go get -d vcs-test.golang.org/insecure/go/insecure +stderr 'redirected .* to insecure URL' + +go get -d -insecure vcs-test.golang.org/insecure/go/insecure -- GitLab From 60736733ec988864c7cd91115e2761d6f6635df2 Mon Sep 17 00:00:00 2001 From: smasher164 Date: Thu, 7 Feb 2019 03:38:21 -0500 Subject: [PATCH 0691/1679] cmd/compile: return assignment mismatch error in var declarations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some var declarations return "extra expression" or "missing expression" errors when they should return “assignment mismatch” instead. Change the returned error messages to exhibit the desired behavior. Fixes #30085. Change-Id: I7189355fbb0f976d70100779db4f81a9ae64fb11 Reviewed-on: https://go-review.googlesource.com/c/go/+/161558 Reviewed-by: Robert Griesemer Run-TryBot: Robert Griesemer --- src/cmd/compile/internal/gc/dcl.go | 5 +++-- test/fixedbugs/issue30085.go | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue30085.go diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index 9f25e5e15b..12875e798e 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -166,11 +166,12 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node { return append(init, as2) } + nel := len(el) for _, v := range vl { var e *Node if doexpr { if len(el) == 0 { - yyerror("missing expression in var declaration") + yyerror("assignment mismatch: %d variables but %d values", len(vl), nel) break } e = el[0] @@ -194,7 +195,7 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node { } if len(el) != 0 { - yyerror("extra expression in var declaration") + yyerror("assignment mismatch: %d variables but %d values", len(vl), nel) } return init } diff --git a/test/fixedbugs/issue30085.go b/test/fixedbugs/issue30085.go new file mode 100644 index 0000000000..8223c855cd --- /dev/null +++ b/test/fixedbugs/issue30085.go @@ -0,0 +1,12 @@ +// errorcheck + +// Copyright 2019 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 main + +func main() { + var c, d = 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values" + var e, f, g = 1, 2 // ERROR "assignment mismatch: 3 variables but 2 values" +} -- GitLab From 48ef01051ae58265088ee87f3a408224d2cfaec3 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 3 Apr 2019 13:16:58 -0700 Subject: [PATCH 0692/1679] cmd/compile: handle new panicindex/slice names in optimizations These new calls should not prevent NOSPLIT promotion, like the old ones. These new calls should not prevent racefuncenter/exit removal. (The latter was already true, as the new calls are not yet lowered to StaticCalls at the point where racefuncenter/exit removal is done.) Add tests to make sure we don't regress (again). Fixes #31219 Change-Id: I3fb6b17cdd32c425829f1e2498defa813a5a9ace Reviewed-on: https://go-review.googlesource.com/c/go/+/170639 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Ilya Tocar --- src/cmd/compile/internal/ssa/rewrite.go | 19 +++++++++++-------- src/cmd/internal/obj/x86/obj6.go | 8 +++++++- test/codegen/race.go | 20 ++++++++++++++++++++ test/codegen/stack.go | 11 +++++++++++ test/run.go | 3 +++ 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 test/codegen/race.go diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 8165852263..6fc504e020 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -1129,17 +1129,20 @@ func needRaceCleanup(sym interface{}, v *Value) bool { for _, v := range b.Values { switch v.Op { case OpStaticCall: - switch v.Aux.(fmt.Stringer).String() { - case "runtime.racefuncenter", "runtime.racefuncexit", "runtime.panicindex", - "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap", - "runtime.panicshift": // Check for racefuncenter will encounter racefuncexit and vice versa. // Allow calls to panic* - default: - // If we encountered any call, we need to keep racefunc*, - // for accurate stacktraces. - return false + s := v.Aux.(fmt.Stringer).String() + switch s { + case "runtime.racefuncenter", "runtime.racefuncexit", + "runtime.panicdivide", "runtime.panicwrap", + "runtime.panicshift": + continue } + // If we encountered any call, we need to keep racefunc*, + // for accurate stacktraces. + return false + case OpPanicBounds, OpPanicExtend: + // Note: these are panic generators that are ok (like the static calls above). case OpClosureCall, OpInterCall: // We must keep the race functions if there are any other call types. return false diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index eb0e88b494..2fba397a87 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -975,7 +975,13 @@ func isZeroArgRuntimeCall(s *obj.LSym) bool { return false } switch s.Name { - case "runtime.panicindex", "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap", "runtime.panicshift": + case "runtime.panicdivide", "runtime.panicwrap", "runtime.panicshift": + return true + } + if strings.HasPrefix(s.Name, "runtime.panicIndex") || strings.HasPrefix(s.Name, "runtime.panicSlice") { + // These functions do take arguments (in registers), + // but use no stack before they do a stack check. We + // should include them. See issue 31219. return true } return false diff --git a/test/codegen/race.go b/test/codegen/race.go new file mode 100644 index 0000000000..ed6706f880 --- /dev/null +++ b/test/codegen/race.go @@ -0,0 +1,20 @@ +// asmcheck -race + +// Copyright 2019 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 codegen + +// Check that we elide racefuncenter/racefuncexit for +// functions with no calls (but which might panic +// in various ways). See issue 31219. +// amd64:-"CALL.*racefuncenter.*" +func RaceMightPanic(a []int, i, j, k, s int) { + var b [4]int + _ = b[i] // panicIndex + _ = a[i:j] // panicSlice + _ = a[i:j:k] // also panicSlice + _ = i << s // panicShift + _ = i / j // panicDivide +} diff --git a/test/codegen/stack.go b/test/codegen/stack.go index ed2c1ed959..ca37622286 100644 --- a/test/codegen/stack.go +++ b/test/codegen/stack.go @@ -98,3 +98,14 @@ func check_asmout(a, b int) int { // arm:`.*b\+4\(FP\)` return b } + +// Check that simple functions get promoted to nosplit, even when +// they might panic in various ways. See issue 31219. +// amd64:"TEXT\t.*NOSPLIT.*" +func MightPanic(a []int, i, j, k, s int) { + _ = a[i] // panicIndex + _ = a[i:j] // panicSlice + _ = a[i:j:k] // also panicSlice + _ = i << s // panicShift + _ = i / j // panicDivide +} diff --git a/test/run.go b/test/run.go index 292903f932..460d4f2d8c 100644 --- a/test/run.go +++ b/test/run.go @@ -660,6 +660,9 @@ func (t *test) run() { cmdline = append(cmdline, long) cmd := exec.Command(goTool(), cmdline...) cmd.Env = append(os.Environ(), env.Environ()...) + if len(flags) > 0 && flags[0] == "-race" { + cmd.Env = append(cmd.Env, "CGO_ENABLED=1") + } var buf bytes.Buffer cmd.Stdout, cmd.Stderr = &buf, &buf -- GitLab From 9da6530faab0a58c4c4e02b2f3f4a5c754dcbd4e Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 20 Mar 2019 10:47:17 -0700 Subject: [PATCH 0693/1679] syscall: avoid _getdirentries64 on darwin Getdirentries is implemented with the __getdirentries64 function in libSystem.dylib. That function works, but it's on Apple's can't-be-used-in-an-app-store-application list. Implement Getdirentries using the underlying fdopendir/readdir_r/closedir. The simulation isn't faithful, and could be slow, but it should handle common cases. Don't use Getdirentries in the stdlib, use fdopendir/readdir_r/closedir instead (via (*os.File).readdirnames). Fixes #30933 Update #28984 RELNOTE=yes Change-Id: Ia6b5d003e5bfe43ba54b1e1d9cfa792cc6511717 Reviewed-on: https://go-review.googlesource.com/c/go/+/168479 Reviewed-by: Emmanuel Odeke Reviewed-by: Brad Fitzpatrick Run-TryBot: Emmanuel Odeke TryBot-Result: Gobot Gobot --- ...fd_opendir_ios.go => fd_opendir_darwin.go} | 3 - src/os/{dir_ios.go => dir_darwin.go} | 13 ++--- src/os/dir_unix.go | 2 +- src/runtime/sys_darwin.go | 11 ++++ src/runtime/sys_darwin_32.go | 11 ---- src/runtime/sys_darwin_386.s | 37 +++++++++++- src/runtime/sys_darwin_64.go | 11 ---- src/runtime/sys_darwin_amd64.s | 37 +++++++++++- src/runtime/sys_darwin_arm.s | 2 +- src/runtime/sys_darwin_arm64.s | 6 +- src/syscall/dirent_bsd_test.go | 2 +- src/syscall/mksyscall.pl | 4 ++ src/syscall/syscall_darwin.go | 55 ++++++++++++++++++ src/syscall/syscall_darwin_386.go | 15 ++++- src/syscall/syscall_darwin_amd64.go | 15 ++++- src/syscall/syscall_darwin_arm.go | 7 --- src/syscall/syscall_darwin_arm64.go | 9 +-- src/syscall/zsyscall_darwin_386.go | 50 +++++++++-------- src/syscall/zsyscall_darwin_386.s | 8 ++- src/syscall/zsyscall_darwin_amd64.go | 50 +++++++++-------- src/syscall/zsyscall_darwin_amd64.s | 8 ++- src/syscall/zsyscall_darwin_arm.go | 56 +++++++++---------- src/syscall/zsyscall_darwin_arm64.go | 56 +++++++++---------- 23 files changed, 303 insertions(+), 165 deletions(-) rename src/internal/poll/{fd_opendir_ios.go => fd_opendir_darwin.go} (95%) rename src/os/{dir_ios.go => dir_darwin.go} (84%) diff --git a/src/internal/poll/fd_opendir_ios.go b/src/internal/poll/fd_opendir_darwin.go similarity index 95% rename from src/internal/poll/fd_opendir_ios.go rename to src/internal/poll/fd_opendir_darwin.go index e646bd9a96..c7d3318c72 100644 --- a/src/internal/poll/fd_opendir_ios.go +++ b/src/internal/poll/fd_opendir_darwin.go @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin -// +build arm arm64 - package poll import ( diff --git a/src/os/dir_ios.go b/src/os/dir_darwin.go similarity index 84% rename from src/os/dir_ios.go rename to src/os/dir_darwin.go index 8c14d89508..2f9ba78d68 100644 --- a/src/os/dir_ios.go +++ b/src/os/dir_darwin.go @@ -2,9 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin -// +build arm arm64 - package os import ( @@ -47,12 +44,12 @@ func (f *File) readdirnames(n int) (names []string, err error) { names = make([]string, 0, size) var dirent syscall.Dirent - var entptr uintptr - for len(names) < size { - if res := readdir_r(d.dir, uintptr(unsafe.Pointer(&dirent)), uintptr(unsafe.Pointer(&entptr))); res != 0 { + var entptr *syscall.Dirent + for len(names) < size || n == -1 { + if res := readdir_r(d.dir, &dirent, &entptr); res != 0 { return names, wrapSyscallError("readdir", syscall.Errno(res)) } - if entptr == 0 { // EOF + if entptr == nil { // EOF break } if dirent.Ino == 0 { @@ -84,4 +81,4 @@ func (f *File) readdirnames(n int) (names []string, err error) { func closedir(dir uintptr) (err error) //go:linkname readdir_r syscall.readdir_r -func readdir_r(dir, entry, result uintptr) (res int) +func readdir_r(dir uintptr, entry *syscall.Dirent, result **syscall.Dirent) (res int) diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go index bd99ef4813..b2c8fe6f15 100644 --- a/src/os/dir_unix.go +++ b/src/os/dir_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build aix darwin,!arm,!arm64 dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris +// +build aix dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris package os diff --git a/src/runtime/sys_darwin.go b/src/runtime/sys_darwin.go index f34ac88352..434fa5f588 100644 --- a/src/runtime/sys_darwin.go +++ b/src/runtime/sys_darwin.go @@ -89,6 +89,17 @@ func syscall_syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) } func syscall6X() +//go:linkname syscall_syscallPtr syscall.syscallPtr +//go:nosplit +//go:cgo_unsafe_args +func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { + entersyscallblock() + libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn)) + exitsyscall() + return +} +func syscallPtr() + //go:linkname syscall_rawSyscall syscall.rawSyscall //go:nosplit //go:cgo_unsafe_args diff --git a/src/runtime/sys_darwin_32.go b/src/runtime/sys_darwin_32.go index 2f17091327..f126be83e5 100644 --- a/src/runtime/sys_darwin_32.go +++ b/src/runtime/sys_darwin_32.go @@ -19,14 +19,3 @@ func syscall_syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2, e return } func syscall9() - -//go:linkname syscall_syscallPtr syscall.syscallPtr -//go:nosplit -//go:cgo_unsafe_args -func syscall_syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { - entersyscallblock() - libcCall(unsafe.Pointer(funcPC(syscallPtr)), unsafe.Pointer(&fn)) - exitsyscall() - return -} -func syscallPtr() diff --git a/src/runtime/sys_darwin_386.s b/src/runtime/sys_darwin_386.s index 1bc1a63c28..d318509e0a 100644 --- a/src/runtime/sys_darwin_386.s +++ b/src/runtime/sys_darwin_386.s @@ -675,9 +675,42 @@ ok: POPL BP RET -// Not used on 386. +// syscallPtr is like syscall except the libc function reports an +// error by returning NULL and setting errno. TEXT runtime·syscallPtr(SB),NOSPLIT,$0 - MOVL $0xf1, 0xf1 // crash + PUSHL BP + MOVL SP, BP + SUBL $24, SP + MOVL 32(SP), CX + MOVL (0*4)(CX), AX // fn + MOVL (1*4)(CX), DX // a1 + MOVL DX, 0(SP) + MOVL (2*4)(CX), DX // a2 + MOVL DX, 4(SP) + MOVL (3*4)(CX), DX // a3 + MOVL DX, 8(SP) + + CALL AX + + MOVL 32(SP), CX + MOVL AX, (4*4)(CX) // r1 + MOVL DX, (5*4)(CX) // r2 + + // syscallPtr libc functions return NULL on error + // and set errno. + TESTL AX, AX + JNE ok + + // Get error code from libc. + CALL libc_error(SB) + MOVL (AX), AX + MOVL 32(SP), CX + MOVL AX, (6*4)(CX) // err + +ok: + XORL AX, AX // no error (it's ignored anyway) + MOVL BP, SP + POPL BP RET // syscall6 calls a function in libc on behalf of the syscall package. diff --git a/src/runtime/sys_darwin_64.go b/src/runtime/sys_darwin_64.go index 8c128811b9..07b0bb54af 100644 --- a/src/runtime/sys_darwin_64.go +++ b/src/runtime/sys_darwin_64.go @@ -19,14 +19,3 @@ func syscall_syscallX(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { return } func syscallX() - -//go:linkname syscall_syscallXPtr syscall.syscallXPtr -//go:nosplit -//go:cgo_unsafe_args -func syscall_syscallXPtr(fn, a1, a2, a3 uintptr) (r1, r2, err uintptr) { - entersyscallblock() - libcCall(unsafe.Pointer(funcPC(syscallXPtr)), unsafe.Pointer(&fn)) - exitsyscall() - return -} -func syscallXPtr() diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s index f99cb00ab8..934c510b88 100644 --- a/src/runtime/sys_darwin_amd64.s +++ b/src/runtime/sys_darwin_amd64.s @@ -637,9 +637,40 @@ ok: POPQ BP RET -// Not used on amd64. -TEXT runtime·syscallXPtr(SB),NOSPLIT,$0 - MOVL $0xf1, 0xf1 // crash +// syscallPtr is like syscallX except that the libc function reports an +// error by returning NULL and setting errno. +TEXT runtime·syscallPtr(SB),NOSPLIT,$0 + PUSHQ BP + MOVQ SP, BP + SUBQ $16, SP + MOVQ (0*8)(DI), CX // fn + MOVQ (2*8)(DI), SI // a2 + MOVQ (3*8)(DI), DX // a3 + MOVQ DI, (SP) + MOVQ (1*8)(DI), DI // a1 + XORL AX, AX // vararg: say "no float args" + + CALL CX + + MOVQ (SP), DI + MOVQ AX, (4*8)(DI) // r1 + MOVQ DX, (5*8)(DI) // r2 + + // syscallPtr libc functions return NULL on error + // and set errno. + TESTQ AX, AX + JNE ok + + // Get error code from libc. + CALL libc_error(SB) + MOVLQSX (AX), AX + MOVQ (SP), DI + MOVQ AX, (6*8)(DI) // err + +ok: + XORL AX, AX // no error (it's ignored anyway) + MOVQ BP, SP + POPQ BP RET // syscall6 calls a function in libc on behalf of the syscall package. diff --git a/src/runtime/sys_darwin_arm.s b/src/runtime/sys_darwin_arm.s index 54c7afbf34..6c3fa0739d 100644 --- a/src/runtime/sys_darwin_arm.s +++ b/src/runtime/sys_darwin_arm.s @@ -418,7 +418,7 @@ ok: RET // syscallPtr is like syscall except the libc function reports an -// error by returning NULL. +// error by returning NULL and setting errno. TEXT runtime·syscallPtr(SB),NOSPLIT,$0 MOVW.W R0, -4(R13) // push structure pointer MOVW 0(R0), R12 // fn diff --git a/src/runtime/sys_darwin_arm64.s b/src/runtime/sys_darwin_arm64.s index 29951d8ad7..89a2b8a054 100644 --- a/src/runtime/sys_darwin_arm64.s +++ b/src/runtime/sys_darwin_arm64.s @@ -465,9 +465,9 @@ TEXT runtime·syscallX(SB),NOSPLIT,$0 ok: RET -// syscallXPtr is like syscallX except that the libc function reports an -// error by returning NULL. -TEXT runtime·syscallXPtr(SB),NOSPLIT,$0 +// syscallPtr is like syscallX except that the libc function reports an +// error by returning NULL and setting errno. +TEXT runtime·syscallPtr(SB),NOSPLIT,$0 SUB $16, RSP // push structure pointer MOVD R0, (RSP) diff --git a/src/syscall/dirent_bsd_test.go b/src/syscall/dirent_bsd_test.go index e5f5eb3f8a..e5b8357af7 100644 --- a/src/syscall/dirent_bsd_test.go +++ b/src/syscall/dirent_bsd_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin,!arm,!arm64 dragonfly freebsd netbsd openbsd +// +build darwin dragonfly freebsd netbsd openbsd package syscall_test diff --git a/src/syscall/mksyscall.pl b/src/syscall/mksyscall.pl index 667ca54c02..75345df159 100755 --- a/src/syscall/mksyscall.pl +++ b/src/syscall/mksyscall.pl @@ -350,6 +350,10 @@ while(<>) { $text .= "//go:linkname $funcname $funcname\n"; # Tell the linker that funcname can be found in libSystem using varname without the libc_ prefix. my $basename = substr $funcname, 5; + if($basename eq "readdir_r" && ($ENV{'GOARCH'} eq "386" || $ENV{'GOARCH'} eq "amd64")) { + # Hack to make sure we get the 64-bit inode version on darwin/macOS. + $basename .= "\$INODE64" + } $text .= "//go:cgo_import_dynamic $funcname $basename \"/usr/lib/libSystem.B.dylib\"\n\n"; } } diff --git a/src/syscall/syscall_darwin.go b/src/syscall/syscall_darwin.go index 80e42b0aec..59669a473d 100644 --- a/src/syscall/syscall_darwin.go +++ b/src/syscall/syscall_darwin.go @@ -258,6 +258,7 @@ func Kill(pid int, signum Signal) (err error) { return kill(pid, int(signum), 1) //sys Chown(path string, uid int, gid int) (err error) //sys Chroot(path string) (err error) //sys Close(fd int) (err error) +//sys closedir(dir uintptr) (err error) //sys Dup(fd int) (nfd int, err error) //sys Dup2(from int, to int) (err error) //sys Exchangedata(path1 string, path2 string, options int) (err error) @@ -301,6 +302,7 @@ func Kill(pid int, signum Signal) (err error) { return kill(pid, int(signum), 1) //sys Pread(fd int, p []byte, offset int64) (n int, err error) //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) //sys read(fd int, p []byte) (n int, err error) +//sys readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) //sys Readlink(path string, buf []byte) (n int, err error) //sys Rename(from string, to string) (err error) //sys Revoke(path string) (err error) @@ -363,12 +365,65 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { return } +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + // Simulate Getdirentries using fdopendir/readdir_r/closedir. + const ptrSize = unsafe.Sizeof(uintptr(0)) + d, err := fdopendir(fd) + if err != nil { + return 0, err + } + defer closedir(d) + // We keep the number of records already returned in *basep. + // It's not the full required semantics, but should handle the case + // of calling Getdirentries repeatedly. + // It won't handle assigning the results of lseek to *basep, or handle + // the directory being edited underfoot. + skip := *basep + *basep = 0 + for { + var entry Dirent + var entryp *Dirent + e := readdir_r(d, &entry, &entryp) + if e != 0 { + return n, errnoErr(e) + } + if entryp == nil { + break + } + if skip > 0 { + skip-- + *basep++ + continue + } + reclen := int(entry.Reclen) + if reclen > len(buf) { + // Not enough room. Return for now. + // *basep will let us know where we should start up again. + // Note: this strategy for suspending in the middle and + // restarting is O(n^2) in the length of the directory. Oh well. + break + } + // Copy entry into return buffer. + s := struct { + ptr unsafe.Pointer + siz int + cap int + }{ptr: unsafe.Pointer(&entry), siz: reclen, cap: reclen} + copy(buf, *(*[]byte)(unsafe.Pointer(&s))) + buf = buf[reclen:] + n += reclen + *basep++ + } + return n, nil +} + // Implemented in the runtime package (runtime/sys_darwin.go) func syscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func syscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) func syscall6X(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) func rawSyscall(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func rawSyscall6(fn, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) +func syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) // Find the entry point for f. See comments in runtime/proc.go for the // function of the same name. diff --git a/src/syscall/syscall_darwin_386.go b/src/syscall/syscall_darwin_386.go index 045ebc726b..e4908d1f9c 100644 --- a/src/syscall/syscall_darwin_386.go +++ b/src/syscall/syscall_darwin_386.go @@ -16,7 +16,6 @@ func setTimeval(sec, usec int64) Timeval { //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_fstat64 //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_fstatfs64 -//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS___getdirentries64 //sysnb Gettimeofday(tp *Timeval) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_lstat64 //sys Stat(path string, stat *Stat_t) (err error) = SYS_stat64 @@ -59,6 +58,20 @@ func libc_sendfile_trampoline() //go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" +func fdopendir(fd int) (dir uintptr, err error) { + r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0) + dir = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fdopendir_trampoline() + +//go:linkname libc_fdopendir libc_fdopendir +//go:cgo_import_dynamic libc_fdopendir fdopendir$INODE64 "/usr/lib/libSystem.B.dylib" + // Implemented in the runtime package (runtime/sys_darwin_32.go) func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) diff --git a/src/syscall/syscall_darwin_amd64.go b/src/syscall/syscall_darwin_amd64.go index 7b6493bf9f..6fc7fb7f10 100644 --- a/src/syscall/syscall_darwin_amd64.go +++ b/src/syscall/syscall_darwin_amd64.go @@ -16,7 +16,6 @@ func setTimeval(sec, usec int64) Timeval { //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_fstat64 //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_fstatfs64 -//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS___getdirentries64 //sysnb Gettimeofday(tp *Timeval) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_lstat64 //sys Stat(path string, stat *Stat_t) (err error) = SYS_stat64 @@ -59,6 +58,20 @@ func libc_sendfile_trampoline() //go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" +func fdopendir(fd int) (dir uintptr, err error) { + r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0) + dir = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_fdopendir_trampoline() + +//go:linkname libc_fdopendir libc_fdopendir +//go:cgo_import_dynamic libc_fdopendir fdopendir$INODE64 "/usr/lib/libSystem.B.dylib" + // Implemented in the runtime package (runtime/sys_darwin_64.go) func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) diff --git a/src/syscall/syscall_darwin_arm.go b/src/syscall/syscall_darwin_arm.go index cb7489ed7b..c1b417de92 100644 --- a/src/syscall/syscall_darwin_arm.go +++ b/src/syscall/syscall_darwin_arm.go @@ -14,20 +14,14 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } -//sys closedir(dir uintptr) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sysnb Gettimeofday(tp *Timeval) (err error) //sys Lstat(path string, stat *Stat_t) (err error) -//sys readdir_r(dir uintptr, entry uintptr, result uintptr) (res int) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return 0, ENOSYS -} - func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint32(fd) k.Filter = int16(mode) @@ -79,7 +73,6 @@ func libc_fdopendir_trampoline() //go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib" // Implemented in the runtime package (runtime/sys_darwin_32.go) -func syscallPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // sic diff --git a/src/syscall/syscall_darwin_arm64.go b/src/syscall/syscall_darwin_arm64.go index 57902d45c6..3a4c9629ac 100644 --- a/src/syscall/syscall_darwin_arm64.go +++ b/src/syscall/syscall_darwin_arm64.go @@ -14,20 +14,14 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int64(sec), Usec: int32(usec)} } -//sys closedir(dir uintptr) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sysnb Gettimeofday(tp *Timeval) (err error) //sys Lstat(path string, stat *Stat_t) (err error) -//sys readdir_r(dirp uintptr, entry uintptr, result uintptr) (res int) //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) //sys fstatat(fd int, path string, stat *Stat_t, flags int) (err error) -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - return 0, ENOSYS -} - func SetKevent(k *Kevent_t, fd, mode, flags int) { k.Ident = uint64(fd) k.Filter = int16(mode) @@ -65,7 +59,7 @@ func libc_sendfile_trampoline() //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" func fdopendir(fd int) (dir uintptr, err error) { - r0, _, e1 := syscallXPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0) + r0, _, e1 := syscallPtr(funcPC(libc_fdopendir_trampoline), uintptr(fd), 0, 0) dir = uintptr(r0) if e1 != 0 { err = errnoErr(e1) @@ -80,6 +74,5 @@ func libc_fdopendir_trampoline() // Implemented in the runtime package (runtime/sys_darwin_64.go) func syscallX(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) -func syscallXPtr(fn, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) // sic diff --git a/src/syscall/zsyscall_darwin_386.go b/src/syscall/zsyscall_darwin_386.go index 7f783eb40d..06b188f6c4 100644 --- a/src/syscall/zsyscall_darwin_386.go +++ b/src/syscall/zsyscall_darwin_386.go @@ -545,6 +545,21 @@ func libc_close_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(fd int) (nfd int, err error) { r0, _, e1 := syscall(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) @@ -1254,6 +1269,19 @@ func libc_read_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r$INODE64 "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1960,28 +1988,6 @@ func libc_fstatfs64_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___getdirentries64_trampoline() - -//go:linkname libc___getdirentries64 libc___getdirentries64 -//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Gettimeofday(tp *Timeval) (err error) { _, _, e1 := rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { diff --git a/src/syscall/zsyscall_darwin_386.s b/src/syscall/zsyscall_darwin_386.s index a688192501..ba52e93fe9 100644 --- a/src/syscall/zsyscall_darwin_386.s +++ b/src/syscall/zsyscall_darwin_386.s @@ -7,6 +7,8 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 @@ -73,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 JMP libc_dup(SB) TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 @@ -157,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 JMP libc_read(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 @@ -235,8 +241,6 @@ TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstat64(SB) TEXT ·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) -TEXT ·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0 - JMP libc___getdirentries64(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_lstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_darwin_amd64.go b/src/syscall/zsyscall_darwin_amd64.go index 141f071105..d7d08211be 100644 --- a/src/syscall/zsyscall_darwin_amd64.go +++ b/src/syscall/zsyscall_darwin_amd64.go @@ -545,6 +545,21 @@ func libc_close_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(fd int) (nfd int, err error) { r0, _, e1 := syscall(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) @@ -1254,6 +1269,19 @@ func libc_read_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r$INODE64 "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1960,28 +1988,6 @@ func libc_fstatfs64_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := syscall6(funcPC(libc___getdirentries64_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc___getdirentries64_trampoline() - -//go:linkname libc___getdirentries64 libc___getdirentries64 -//go:cgo_import_dynamic libc___getdirentries64 __getdirentries64 "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Gettimeofday(tp *Timeval) (err error) { _, _, e1 := rawSyscall(funcPC(libc_gettimeofday_trampoline), uintptr(unsafe.Pointer(tp)), 0, 0) if e1 != 0 { diff --git a/src/syscall/zsyscall_darwin_amd64.s b/src/syscall/zsyscall_darwin_amd64.s index 21ab38e3ee..32c9e11456 100644 --- a/src/syscall/zsyscall_darwin_amd64.s +++ b/src/syscall/zsyscall_darwin_amd64.s @@ -7,6 +7,8 @@ TEXT ·libc_getfsstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_getfsstat64(SB) TEXT ·libc_setattrlist_trampoline(SB),NOSPLIT,$0-0 JMP libc_setattrlist(SB) +TEXT ·libc_fdopendir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_fdopendir(SB) TEXT ·libc_sendfile_trampoline(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) TEXT ·libc_getgroups_trampoline(SB),NOSPLIT,$0-0 @@ -73,6 +75,8 @@ TEXT ·libc_chroot_trampoline(SB),NOSPLIT,$0-0 JMP libc_chroot(SB) TEXT ·libc_close_trampoline(SB),NOSPLIT,$0-0 JMP libc_close(SB) +TEXT ·libc_closedir_trampoline(SB),NOSPLIT,$0-0 + JMP libc_closedir(SB) TEXT ·libc_dup_trampoline(SB),NOSPLIT,$0-0 JMP libc_dup(SB) TEXT ·libc_dup2_trampoline(SB),NOSPLIT,$0-0 @@ -157,6 +161,8 @@ TEXT ·libc_pwrite_trampoline(SB),NOSPLIT,$0-0 JMP libc_pwrite(SB) TEXT ·libc_read_trampoline(SB),NOSPLIT,$0-0 JMP libc_read(SB) +TEXT ·libc_readdir_r_trampoline(SB),NOSPLIT,$0-0 + JMP libc_readdir_r(SB) TEXT ·libc_readlink_trampoline(SB),NOSPLIT,$0-0 JMP libc_readlink(SB) TEXT ·libc_rename_trampoline(SB),NOSPLIT,$0-0 @@ -235,8 +241,6 @@ TEXT ·libc_fstat64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstat64(SB) TEXT ·libc_fstatfs64_trampoline(SB),NOSPLIT,$0-0 JMP libc_fstatfs64(SB) -TEXT ·libc___getdirentries64_trampoline(SB),NOSPLIT,$0-0 - JMP libc___getdirentries64(SB) TEXT ·libc_gettimeofday_trampoline(SB),NOSPLIT,$0-0 JMP libc_gettimeofday(SB) TEXT ·libc_lstat64_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_darwin_arm.go b/src/syscall/zsyscall_darwin_arm.go index 9bfaac6ef7..a640c7425a 100644 --- a/src/syscall/zsyscall_darwin_arm.go +++ b/src/syscall/zsyscall_darwin_arm.go @@ -545,6 +545,21 @@ func libc_close_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(fd int) (nfd int, err error) { r0, _, e1 := syscall(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) @@ -1254,6 +1269,19 @@ func libc_read_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1930,21 +1958,6 @@ func libc_openat_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func closedir(dir uintptr) (err error) { - _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_closedir_trampoline() - -//go:linkname libc_closedir libc_closedir -//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall(funcPC(libc_fstat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2010,19 +2023,6 @@ func libc_lstat_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readdir_r(dir uintptr, entry uintptr, result uintptr) (res int) { - r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(entry), uintptr(result)) - res = int(r0) - return -} - -func libc_readdir_r_trampoline() - -//go:linkname libc_readdir_r libc_readdir_r -//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/src/syscall/zsyscall_darwin_arm64.go b/src/syscall/zsyscall_darwin_arm64.go index cdb3630ebd..e6d362d3a4 100644 --- a/src/syscall/zsyscall_darwin_arm64.go +++ b/src/syscall/zsyscall_darwin_arm64.go @@ -545,6 +545,21 @@ func libc_close_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func closedir(dir uintptr) (err error) { + _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_closedir_trampoline() + +//go:linkname libc_closedir libc_closedir +//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Dup(fd int) (nfd int, err error) { r0, _, e1 := syscall(funcPC(libc_dup_trampoline), uintptr(fd), 0, 0) nfd = int(r0) @@ -1254,6 +1269,19 @@ func libc_read_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { + r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dir), uintptr(unsafe.Pointer(entry)), uintptr(unsafe.Pointer(result))) + res = Errno(r0) + return +} + +func libc_readdir_r_trampoline() + +//go:linkname libc_readdir_r libc_readdir_r +//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Readlink(path string, buf []byte) (n int, err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1930,21 +1958,6 @@ func libc_openat_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func closedir(dir uintptr) (err error) { - _, _, e1 := syscall(funcPC(libc_closedir_trampoline), uintptr(dir), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -func libc_closedir_trampoline() - -//go:linkname libc_closedir libc_closedir -//go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fstat(fd int, stat *Stat_t) (err error) { _, _, e1 := syscall(funcPC(libc_fstat_trampoline), uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) if e1 != 0 { @@ -2010,19 +2023,6 @@ func libc_lstat_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func readdir_r(dirp uintptr, entry uintptr, result uintptr) (res int) { - r0, _, _ := syscall(funcPC(libc_readdir_r_trampoline), uintptr(dirp), uintptr(entry), uintptr(result)) - res = int(r0) - return -} - -func libc_readdir_r_trampoline() - -//go:linkname libc_readdir_r libc_readdir_r -//go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Stat(path string, stat *Stat_t) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) -- GitLab From 4145c5da1f533fafd928769d18d5be60968cb9dc Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Thu, 28 Mar 2019 13:32:31 -0700 Subject: [PATCH 0694/1679] cmd/compile: better recovery after := (rather than =) in declarations Before this fix, a mistaken := in a (const/type/var) declaration ended that declaration with an error from which the parser didn't recover well. This low-cost change will provide a better error message and lets the parser recover perfectly. Fixes #31092. Change-Id: Ic4f94dc5e29dd00b7ef6d53a80dded638e3cea80 Reviewed-on: https://go-review.googlesource.com/c/go/+/169958 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/syntax/parser.go | 22 +++++++++++++++---- .../internal/syntax/testdata/issue31092.src | 16 ++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/cmd/compile/internal/syntax/testdata/issue31092.src diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index e1cd8f9f5a..d4e9bf2f96 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -170,6 +170,20 @@ func (p *parser) want(tok token) { } } +// gotAssign is like got(_Assign) but it also accepts ":=" +// (and reports an error) for better parser error recovery. +func (p *parser) gotAssign() bool { + switch p.tok { + case _Define: + p.syntaxError("expecting =") + fallthrough + case _Assign: + p.next() + return true + } + return false +} + // ---------------------------------------------------------------------------- // Error handling @@ -514,7 +528,7 @@ func (p *parser) constDecl(group *Group) Decl { d.NameList = p.nameList(p.name()) if p.tok != _EOF && p.tok != _Semi && p.tok != _Rparen { d.Type = p.typeOrNil() - if p.got(_Assign) { + if p.gotAssign() { d.Values = p.exprList() } } @@ -533,7 +547,7 @@ func (p *parser) typeDecl(group *Group) Decl { d.pos = p.pos() d.Name = p.name() - d.Alias = p.got(_Assign) + d.Alias = p.gotAssign() d.Type = p.typeOrNil() if d.Type == nil { d.Type = p.bad() @@ -556,11 +570,11 @@ func (p *parser) varDecl(group *Group) Decl { d.pos = p.pos() d.NameList = p.nameList(p.name()) - if p.got(_Assign) { + if p.gotAssign() { d.Values = p.exprList() } else { d.Type = p.type_() - if p.got(_Assign) { + if p.gotAssign() { d.Values = p.exprList() } } diff --git a/src/cmd/compile/internal/syntax/testdata/issue31092.src b/src/cmd/compile/internal/syntax/testdata/issue31092.src new file mode 100644 index 0000000000..b1839b8f46 --- /dev/null +++ b/src/cmd/compile/internal/syntax/testdata/issue31092.src @@ -0,0 +1,16 @@ +// Copyright 2018 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. + +// Test cases for issue 31092: Better synchronization of +// parser after seeing an := rather than an = in a const, +// type, or variable declaration. + +package p + +const _ /* ERROR unexpected := */ := 0 +type _ /* ERROR unexpected := */ := int +var _ /* ERROR unexpected := */ := 0 + +const _ int /* ERROR unexpected := */ := 0 +var _ int /* ERROR unexpected := */ := 0 -- GitLab From 964fe4b80ff7a9e5490f11de0e216ae34a019ebc Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Wed, 3 Apr 2019 02:01:50 +0000 Subject: [PATCH 0695/1679] math/big: simplify shlVU_g and shrVU_g MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rewrote a few lines to be more idiomatic/less assembly-ish. Benchmarked with `go test -bench Float -tags math_big_pure_go`: name old time/op new time/op delta FloatString/100-8 751ns ± 0% 746ns ± 1% -0.71% (p=0.000 n=10+10) FloatString/1000-8 22.9µs ± 0% 22.9µs ± 0% ~ (p=0.271 n=10+10) FloatString/10000-8 1.89ms ± 0% 1.89ms ± 0% ~ (p=0.481 n=10+10) FloatString/100000-8 184ms ± 0% 184ms ± 0% ~ (p=0.094 n=9+9) FloatAdd/10-8 56.4ns ± 1% 56.5ns ± 0% ~ (p=0.170 n=9+9) FloatAdd/100-8 59.7ns ± 0% 59.3ns ± 0% -0.70% (p=0.000 n=8+9) FloatAdd/1000-8 101ns ± 0% 99ns ± 0% -1.89% (p=0.000 n=8+8) FloatAdd/10000-8 553ns ± 0% 536ns ± 0% -3.00% (p=0.000 n=9+10) FloatAdd/100000-8 4.94µs ± 0% 4.74µs ± 0% -3.94% (p=0.000 n=9+10) FloatSub/10-8 50.3ns ± 0% 50.5ns ± 0% +0.52% (p=0.000 n=8+8) FloatSub/100-8 52.0ns ± 0% 52.2ns ± 1% +0.46% (p=0.012 n=8+10) FloatSub/1000-8 77.9ns ± 0% 77.3ns ± 0% -0.80% (p=0.000 n=7+8) FloatSub/10000-8 371ns ± 0% 362ns ± 0% -2.67% (p=0.000 n=10+10) FloatSub/100000-8 3.20µs ± 0% 3.10µs ± 0% -3.16% (p=0.000 n=10+10) ParseFloatSmallExp-8 7.84µs ± 0% 7.82µs ± 0% -0.17% (p=0.037 n=9+9) ParseFloatLargeExp-8 29.3µs ± 1% 29.5µs ± 0% ~ (p=0.059 n=9+8) FloatSqrt/64-8 516ns ± 0% 519ns ± 0% +0.54% (p=0.000 n=9+9) FloatSqrt/128-8 1.07µs ± 0% 1.07µs ± 0% ~ (p=0.109 n=8+9) FloatSqrt/256-8 1.23µs ± 0% 1.23µs ± 0% +0.50% (p=0.000 n=9+9) FloatSqrt/1000-8 3.43µs ± 0% 3.44µs ± 0% +0.53% (p=0.000 n=9+8) FloatSqrt/10000-8 40.9µs ± 0% 40.7µs ± 0% -0.39% (p=0.000 n=9+8) FloatSqrt/100000-8 1.07ms ± 0% 1.07ms ± 0% -0.10% (p=0.017 n=10+9) FloatSqrt/1000000-8 89.3ms ± 0% 89.2ms ± 0% -0.07% (p=0.015 n=9+8) Change-Id: Ibf07c6142719d11bc7f329246957d87a9f3ba3d2 GitHub-Last-Rev: 870a041ab7bb9c24be083114f53653a5f4eed611 GitHub-Pull-Request: golang/go#31220 Reviewed-on: https://go-review.googlesource.com/c/go/+/170449 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/arith.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/math/big/arith.go b/src/math/big/arith.go index ed51f38836..b0885f261f 100644 --- a/src/math/big/arith.go +++ b/src/math/big/arith.go @@ -160,14 +160,11 @@ func shlVU_g(z, x []Word, s uint) (c Word) { s &= _W - 1 // hint to the compiler that shifts by s don't need guard code ŝ := _W - s ŝ &= _W - 1 // ditto - w1 := x[len(z)-1] - c = w1 >> ŝ + c = x[len(z)-1] >> ŝ for i := len(z) - 1; i > 0; i-- { - w := w1 - w1 = x[i-1] - z[i] = w<>ŝ + z[i] = x[i]<>ŝ } - z[0] = w1 << s + z[0] = x[0] << s return } @@ -182,14 +179,11 @@ func shrVU_g(z, x []Word, s uint) (c Word) { s &= _W - 1 // hint to the compiler that shifts by s don't need guard code ŝ := _W - s ŝ &= _W - 1 // ditto - w1 := x[0] - c = w1 << ŝ + c = x[0] << ŝ for i := 0; i < len(z)-1; i++ { - w := w1 - w1 = x[i+1] - z[i] = w>>s | w1<<ŝ + z[i] = x[i]>>s | x[i+1]<<ŝ } - z[len(z)-1] = w1 >> s + z[len(z)-1] = x[len(z)-1] >> s return } -- GitLab From 1abf3aa55bb8b346bb1575ac8db5022f215df65a Mon Sep 17 00:00:00 2001 From: Leo Antunes Date: Thu, 4 Apr 2019 08:50:27 +0000 Subject: [PATCH 0696/1679] net: add KeepAlive field to ListenConfig This commit adds a KeepAlive field to ListenConfig and uses it analogously to Dialer.KeepAlive to set TCP KeepAlives per default on Accept() Fixes #23378 Change-Id: I57eaf9508c979e7f0e2b8c5dd8e8901f6eb27fd6 GitHub-Last-Rev: e9e035d53ee8aa3d899d12db08b293f599daecb6 GitHub-Pull-Request: golang/go#31242 Reviewed-on: https://go-review.googlesource.com/c/go/+/170678 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/dial.go | 8 ++++++++ src/net/file_plan9.go | 2 +- src/net/file_unix.go | 2 +- src/net/http/server.go | 22 ++-------------------- src/net/tcpsock.go | 1 + src/net/tcpsock_plan9.go | 14 ++++++++++++-- src/net/tcpsock_posix.go | 14 ++++++++++++-- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/net/dial.go b/src/net/dial.go index 1dd8690739..1f3ce1dfa3 100644 --- a/src/net/dial.go +++ b/src/net/dial.go @@ -596,6 +596,14 @@ type ListenConfig struct { // necessarily the ones passed to Listen. For example, passing "tcp" to // Listen will cause the Control function to be called with "tcp4" or "tcp6". Control func(network, address string, c syscall.RawConn) error + + // KeepAlive specifies the keep-alive period for network + // connections accepted by this listener. + // If zero, keep-alives are enabled if supported by the protocol + // and operating system. Network protocols or operating systems + // that do not support keep-alives ignore this field. + // If negative, keep-alives are disabled. + KeepAlive time.Duration } // Listen announces on the local network address. diff --git a/src/net/file_plan9.go b/src/net/file_plan9.go index d16e5a166c..dfb23d2e84 100644 --- a/src/net/file_plan9.go +++ b/src/net/file_plan9.go @@ -127,7 +127,7 @@ func fileListener(f *os.File) (Listener, error) { return nil, errors.New("file does not represent a listener") } - return &TCPListener{fd}, nil + return &TCPListener{fd: fd}, nil } func filePacketConn(f *os.File) (PacketConn, error) { diff --git a/src/net/file_unix.go b/src/net/file_unix.go index 452a079bfc..dba69554ca 100644 --- a/src/net/file_unix.go +++ b/src/net/file_unix.go @@ -93,7 +93,7 @@ func fileListener(f *os.File) (Listener, error) { } switch laddr := fd.laddr.(type) { case *TCPAddr: - return &TCPListener{fd}, nil + return &TCPListener{fd: fd}, nil case *UnixAddr: return &UnixListener{fd: fd, path: laddr.Name, unlink: false}, nil } diff --git a/src/net/http/server.go b/src/net/http/server.go index 4e9ea34491..14f74285c1 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2792,7 +2792,7 @@ func (srv *Server) ListenAndServe() error { if err != nil { return err } - return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}) + return srv.Serve(ln) } var testHookServerServe func(*Server, net.Listener) // used if non-nil @@ -3076,7 +3076,7 @@ func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error { defer ln.Close() - return srv.ServeTLS(tcpKeepAliveListener{ln.(*net.TCPListener)}, certFile, keyFile) + return srv.ServeTLS(ln, certFile, keyFile) } // setupHTTP2_ServeTLS conditionally configures HTTP/2 on @@ -3269,24 +3269,6 @@ func (tw *timeoutWriter) writeHeader(code int) { tw.code = code } -// tcpKeepAliveListener sets TCP keep-alive timeouts on accepted -// connections. It's used by ListenAndServe and ListenAndServeTLS so -// dead TCP connections (e.g. closing laptop mid-download) eventually -// go away. -type tcpKeepAliveListener struct { - *net.TCPListener -} - -func (ln tcpKeepAliveListener) Accept() (net.Conn, error) { - tc, err := ln.AcceptTCP() - if err != nil { - return nil, err - } - tc.SetKeepAlive(true) - tc.SetKeepAlivePeriod(3 * time.Minute) - return tc, nil -} - // onceCloseListener wraps a net.Listener, protecting it from // multiple Close calls. type onceCloseListener struct { diff --git a/src/net/tcpsock.go b/src/net/tcpsock.go index db5d1f8482..666c804169 100644 --- a/src/net/tcpsock.go +++ b/src/net/tcpsock.go @@ -224,6 +224,7 @@ func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error) { // use variables of type Listener instead of assuming TCP. type TCPListener struct { fd *netFD + lc ListenConfig } // SyscallConn returns a raw network connection. diff --git a/src/net/tcpsock_plan9.go b/src/net/tcpsock_plan9.go index f70ef6f43a..e538f55865 100644 --- a/src/net/tcpsock_plan9.go +++ b/src/net/tcpsock_plan9.go @@ -8,6 +8,7 @@ import ( "context" "io" "os" + "time" ) func (c *TCPConn) readFrom(r io.Reader) (int64, error) { @@ -44,7 +45,16 @@ func (ln *TCPListener) accept() (*TCPConn, error) { if err != nil { return nil, err } - return newTCPConn(fd), nil + tc := newTCPConn(fd) + if ln.lc.KeepAlive >= 0 { + setKeepAlive(fd, true) + ka := ln.lc.KeepAlive + if ln.lc.KeepAlive == 0 { + ka = 3 * time.Minute + } + setKeepAlivePeriod(fd, ka) + } + return tc, nil } func (ln *TCPListener) close() error { @@ -74,5 +84,5 @@ func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListe if err != nil { return nil, err } - return &TCPListener{fd}, nil + return &TCPListener{fd: fd, lc: sl.ListenConfig}, nil } diff --git a/src/net/tcpsock_posix.go b/src/net/tcpsock_posix.go index 64e71bf97c..14d383b74d 100644 --- a/src/net/tcpsock_posix.go +++ b/src/net/tcpsock_posix.go @@ -11,6 +11,7 @@ import ( "io" "os" "syscall" + "time" ) func sockaddrToTCP(sa syscall.Sockaddr) Addr { @@ -140,7 +141,16 @@ func (ln *TCPListener) accept() (*TCPConn, error) { if err != nil { return nil, err } - return newTCPConn(fd), nil + tc := newTCPConn(fd) + if ln.lc.KeepAlive >= 0 { + setKeepAlive(fd, true) + ka := ln.lc.KeepAlive + if ln.lc.KeepAlive == 0 { + ka = 3 * time.Minute + } + setKeepAlivePeriod(fd, ka) + } + return tc, nil } func (ln *TCPListener) close() error { @@ -160,5 +170,5 @@ func (sl *sysListener) listenTCP(ctx context.Context, laddr *TCPAddr) (*TCPListe if err != nil { return nil, err } - return &TCPListener{fd}, nil + return &TCPListener{fd: fd, lc: sl.ListenConfig}, nil } -- GitLab From cf8cc7f63c7ddefb666a6e8d99a4843d3277db9f Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sun, 24 Mar 2019 12:14:27 +0100 Subject: [PATCH 0697/1679] cmd/compile: add saturating conversions on wasm This change adds the GOWASM option "satconv" to enable the generation of experimental saturating (non-trapping) float-to-int conversions. It improves the performance of the conversion by 42%. Previously the conversions had already been augmented with helper functions to have saturating behavior. Now Wasm.rules is always using the new operation names and wasm/ssa.go is falling back to the helpers if the feature is not enabled. The feature is in phase 4 of the WebAssembly proposal process: https://github.com/WebAssembly/meetings/blob/master/process/phases.md More information on the feature can be found at: https://github.com/WebAssembly/nontrapping-float-to-int-conversions/blob/master/proposals/nontrapping-float-to-int-conversion/Overview.md Change-Id: Ic6c3688017054ede804b02b6b0ffd4a02ef33ad7 Reviewed-on: https://go-review.googlesource.com/c/go/+/170119 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- doc/install-source.html | 1 + src/cmd/compile/internal/ssa/gen/Wasm.rules | 16 +++++------ src/cmd/compile/internal/ssa/gen/WasmOps.go | 4 +-- src/cmd/compile/internal/ssa/opGen.go | 12 ++++---- src/cmd/compile/internal/ssa/rewriteWasm.go | 32 ++++++++++----------- src/cmd/compile/internal/wasm/ssa.go | 21 ++++++++++---- src/cmd/go/alldocs.go | 2 +- src/cmd/go/internal/help/helpdoc.go | 2 +- src/cmd/internal/obj/wasm/a.out.go | 9 ++++++ src/cmd/internal/obj/wasm/anames.go | 8 ++++++ src/cmd/internal/obj/wasm/wasmobj.go | 9 ++++-- src/cmd/internal/objabi/util.go | 6 ++++ 12 files changed, 80 insertions(+), 42 deletions(-) diff --git a/doc/install-source.html b/doc/install-source.html index 9c73b925b1..6a0c3844ae 100644 --- a/doc/install-source.html +++ b/doc/install-source.html @@ -645,6 +645,7 @@ for which the compiler will target. The default is power8. The default is to use no experimental features.

    diff --git a/src/cmd/compile/internal/ssa/gen/Wasm.rules b/src/cmd/compile/internal/ssa/gen/Wasm.rules index 72f4805edf..a832abf0fb 100644 --- a/src/cmd/compile/internal/ssa/gen/Wasm.rules +++ b/src/cmd/compile/internal/ssa/gen/Wasm.rules @@ -84,14 +84,14 @@ (Cvt64Uto32F x) -> (LoweredRound32F (F64ConvertI64U x)) (Cvt64Uto64F x) -> (F64ConvertI64U x) -(Cvt32Fto32 x) -> (I64TruncF64S x) -(Cvt32Fto64 x) -> (I64TruncF64S x) -(Cvt64Fto32 x) -> (I64TruncF64S x) -(Cvt64Fto64 x) -> (I64TruncF64S x) -(Cvt32Fto32U x) -> (I64TruncF64U x) -(Cvt32Fto64U x) -> (I64TruncF64U x) -(Cvt64Fto32U x) -> (I64TruncF64U x) -(Cvt64Fto64U x) -> (I64TruncF64U x) +(Cvt32Fto32 x) -> (I64TruncSatF64S x) +(Cvt32Fto64 x) -> (I64TruncSatF64S x) +(Cvt64Fto32 x) -> (I64TruncSatF64S x) +(Cvt64Fto64 x) -> (I64TruncSatF64S x) +(Cvt32Fto32U x) -> (I64TruncSatF64U x) +(Cvt32Fto64U x) -> (I64TruncSatF64U x) +(Cvt64Fto32U x) -> (I64TruncSatF64U x) +(Cvt64Fto64U x) -> (I64TruncSatF64U x) (Cvt32Fto64F x) -> x (Cvt64Fto32F x) -> (LoweredRound32F x) diff --git a/src/cmd/compile/internal/ssa/gen/WasmOps.go b/src/cmd/compile/internal/ssa/gen/WasmOps.go index 4e5f076575..de035c985a 100644 --- a/src/cmd/compile/internal/ssa/gen/WasmOps.go +++ b/src/cmd/compile/internal/ssa/gen/WasmOps.go @@ -187,8 +187,8 @@ func init() { {name: "F64Mul", asm: "F64Mul", argLength: 2, reg: fp21, typ: "Float64"}, // arg0 * arg1 {name: "F64Div", asm: "F64Div", argLength: 2, reg: fp21, typ: "Float64"}, // arg0 / arg1 - {name: "I64TruncF64S", asm: "I64TruncF64S", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to a signed integer - {name: "I64TruncF64U", asm: "I64TruncF64U", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to an unsigned integer + {name: "I64TruncSatF64S", asm: "I64TruncSatF64S", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to a signed integer (saturating) + {name: "I64TruncSatF64U", asm: "I64TruncSatF64U", argLength: 1, reg: regInfo{inputs: []regMask{fp}, outputs: []regMask{gp}}, typ: "Int64"}, // truncates the float arg0 to an unsigned integer (saturating) {name: "F64ConvertI64S", asm: "F64ConvertI64S", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the signed integer arg0 to a float {name: "F64ConvertI64U", asm: "F64ConvertI64U", argLength: 1, reg: regInfo{inputs: []regMask{gp}, outputs: []regMask{fp}}, typ: "Float64"}, // converts the unsigned integer arg0 to a float diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 214d68757c..06dcb2d7ac 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -2132,8 +2132,8 @@ const ( OpWasmF64Sub OpWasmF64Mul OpWasmF64Div - OpWasmI64TruncF64S - OpWasmI64TruncF64U + OpWasmI64TruncSatF64S + OpWasmI64TruncSatF64U OpWasmF64ConvertI64S OpWasmF64ConvertI64U OpWasmI64Extend8S @@ -28676,9 +28676,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "I64TruncF64S", + name: "I64TruncSatF64S", argLen: 1, - asm: wasm.AI64TruncF64S, + asm: wasm.AI64TruncSatF64S, reg: regInfo{ inputs: []inputInfo{ {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 @@ -28689,9 +28689,9 @@ var opcodeTable = [...]opInfo{ }, }, { - name: "I64TruncF64U", + name: "I64TruncSatF64U", argLen: 1, - asm: wasm.AI64TruncF64U, + asm: wasm.AI64TruncSatF64U, reg: regInfo{ inputs: []inputInfo{ {0, 4294901760}, // F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15 diff --git a/src/cmd/compile/internal/ssa/rewriteWasm.go b/src/cmd/compile/internal/ssa/rewriteWasm.go index fe85922e31..d02ed1e87f 100644 --- a/src/cmd/compile/internal/ssa/rewriteWasm.go +++ b/src/cmd/compile/internal/ssa/rewriteWasm.go @@ -1095,10 +1095,10 @@ func rewriteValueWasm_OpCtz8NonZero_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto32_0(v *Value) bool { // match: (Cvt32Fto32 x) // cond: - // result: (I64TruncF64S x) + // result: (I64TruncSatF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64S) + v.reset(OpWasmI64TruncSatF64S) v.AddArg(x) return true } @@ -1106,10 +1106,10 @@ func rewriteValueWasm_OpCvt32Fto32_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto32U_0(v *Value) bool { // match: (Cvt32Fto32U x) // cond: - // result: (I64TruncF64U x) + // result: (I64TruncSatF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64U) + v.reset(OpWasmI64TruncSatF64U) v.AddArg(x) return true } @@ -1117,10 +1117,10 @@ func rewriteValueWasm_OpCvt32Fto32U_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto64_0(v *Value) bool { // match: (Cvt32Fto64 x) // cond: - // result: (I64TruncF64S x) + // result: (I64TruncSatF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64S) + v.reset(OpWasmI64TruncSatF64S) v.AddArg(x) return true } @@ -1140,10 +1140,10 @@ func rewriteValueWasm_OpCvt32Fto64F_0(v *Value) bool { func rewriteValueWasm_OpCvt32Fto64U_0(v *Value) bool { // match: (Cvt32Fto64U x) // cond: - // result: (I64TruncF64U x) + // result: (I64TruncSatF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64U) + v.reset(OpWasmI64TruncSatF64U) v.AddArg(x) return true } @@ -1215,10 +1215,10 @@ func rewriteValueWasm_OpCvt32to64F_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto32_0(v *Value) bool { // match: (Cvt64Fto32 x) // cond: - // result: (I64TruncF64S x) + // result: (I64TruncSatF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64S) + v.reset(OpWasmI64TruncSatF64S) v.AddArg(x) return true } @@ -1237,10 +1237,10 @@ func rewriteValueWasm_OpCvt64Fto32F_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto32U_0(v *Value) bool { // match: (Cvt64Fto32U x) // cond: - // result: (I64TruncF64U x) + // result: (I64TruncSatF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64U) + v.reset(OpWasmI64TruncSatF64U) v.AddArg(x) return true } @@ -1248,10 +1248,10 @@ func rewriteValueWasm_OpCvt64Fto32U_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto64_0(v *Value) bool { // match: (Cvt64Fto64 x) // cond: - // result: (I64TruncF64S x) + // result: (I64TruncSatF64S x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64S) + v.reset(OpWasmI64TruncSatF64S) v.AddArg(x) return true } @@ -1259,10 +1259,10 @@ func rewriteValueWasm_OpCvt64Fto64_0(v *Value) bool { func rewriteValueWasm_OpCvt64Fto64U_0(v *Value) bool { // match: (Cvt64Fto64U x) // cond: - // result: (I64TruncF64U x) + // result: (I64TruncSatF64U x) for { x := v.Args[0] - v.reset(OpWasmI64TruncF64U) + v.reset(OpWasmI64TruncSatF64U) v.AddArg(x) return true } diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 7575df548a..63eb319edb 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -10,6 +10,7 @@ import ( "cmd/compile/internal/types" "cmd/internal/obj" "cmd/internal/obj/wasm" + "cmd/internal/objabi" ) func Init(arch *gc.Arch) { @@ -307,15 +308,23 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value) { } s.Prog(wasm.AI64DivS) - case ssa.OpWasmI64TruncF64S: + case ssa.OpWasmI64TruncSatF64S: getValue64(s, v.Args[0]) - p := s.Prog(wasm.ACall) - p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncS} + if objabi.GOWASM.SatConv { + s.Prog(v.Op.Asm()) + } else { + p := s.Prog(wasm.ACall) + p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncS} + } - case ssa.OpWasmI64TruncF64U: + case ssa.OpWasmI64TruncSatF64U: getValue64(s, v.Args[0]) - p := s.Prog(wasm.ACall) - p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncU} + if objabi.GOWASM.SatConv { + s.Prog(v.Op.Asm()) + } else { + p := s.Prog(wasm.ACall) + p.To = obj.Addr{Type: obj.TYPE_MEM, Name: obj.NAME_EXTERN, Sym: gc.WasmTruncU} + } case ssa.OpWasmF64Neg, ssa.OpWasmF64ConvertI64S, ssa.OpWasmF64ConvertI64U, diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index de07d910d8..008e306efb 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -1581,7 +1581,7 @@ // Valid values are hardfloat (default), softfloat. // GOWASM // For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use. -// Valid values are: signext. +// Valid values are satconv, signext. // // Special-purpose environment variables: // diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index eb663e99b6..98d4bd0382 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -565,7 +565,7 @@ Architecture-specific environment variables: Valid values are hardfloat (default), softfloat. GOWASM For GOARCH=wasm, comma-separated list of experimental WebAssembly features to use. - Valid values are: signext. + Valid values are satconv, signext. Special-purpose environment variables: diff --git a/src/cmd/internal/obj/wasm/a.out.go b/src/cmd/internal/obj/wasm/a.out.go index 29ea87f3b0..c686f1d6f0 100644 --- a/src/cmd/internal/obj/wasm/a.out.go +++ b/src/cmd/internal/obj/wasm/a.out.go @@ -216,6 +216,15 @@ const ( AI64Extend16S AI64Extend32S + AI32TruncSatF32S // opcode 0xFC 0x00 + AI32TruncSatF32U + AI32TruncSatF64S + AI32TruncSatF64U + AI64TruncSatF32S + AI64TruncSatF32U + AI64TruncSatF64S + AI64TruncSatF64U + ALast // Sentinel: End of low-level WebAssembly instructions. ARESUMEPOINT diff --git a/src/cmd/internal/obj/wasm/anames.go b/src/cmd/internal/obj/wasm/anames.go index fb4b72c398..c8552e7f18 100644 --- a/src/cmd/internal/obj/wasm/anames.go +++ b/src/cmd/internal/obj/wasm/anames.go @@ -182,6 +182,14 @@ var Anames = []string{ "I64Extend8S", "I64Extend16S", "I64Extend32S", + "I32TruncSatF32S", + "I32TruncSatF32U", + "I32TruncSatF64S", + "I32TruncSatF64U", + "I64TruncSatF32S", + "I64TruncSatF32U", + "I64TruncSatF64S", + "I64TruncSatF64U", "Last", "RESUMEPOINT", "CALLNORESUME", diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go index dded62a4be..0474e3b4b1 100644 --- a/src/cmd/internal/obj/wasm/wasmobj.go +++ b/src/cmd/internal/obj/wasm/wasmobj.go @@ -886,7 +886,7 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { } switch { - case p.As < AUnreachable || p.As >= ALast: + case p.As < AUnreachable: panic(fmt.Sprintf("unexpected assembler op: %s", p.As)) case p.As < AEnd: w.WriteByte(byte(p.As - AUnreachable + 0x00)) @@ -894,8 +894,13 @@ func assemble(ctxt *obj.Link, s *obj.LSym, newprog obj.ProgAlloc) { w.WriteByte(byte(p.As - AEnd + 0x0B)) case p.As < AI32Load: w.WriteByte(byte(p.As - ADrop + 0x1A)) - default: + case p.As < AI32TruncSatF32S: w.WriteByte(byte(p.As - AI32Load + 0x28)) + case p.As < ALast: + w.WriteByte(0xFC) + w.WriteByte(byte(p.As - AI32TruncSatF32S + 0x00)) + default: + panic(fmt.Sprintf("unexpected assembler op: %s", p.As)) } switch p.As { diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index 02f9d9273a..e28447d141 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -79,10 +79,14 @@ func goppc64() int { type gowasmFeatures struct { SignExt bool + SatConv bool } func (f *gowasmFeatures) String() string { var flags []string + if f.SatConv { + flags = append(flags, "satconv") + } if f.SignExt { flags = append(flags, "signext") } @@ -92,6 +96,8 @@ func (f *gowasmFeatures) String() string { func gowasm() (f gowasmFeatures) { for _, opt := range strings.Split(envOr("GOWASM", ""), ",") { switch opt { + case "satconv": + f.SatConv = true case "signext": f.SignExt = true case "": -- GitLab From bead358611e36fe0991c171a8a4a4924f4f0e584 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 4 Apr 2019 11:01:22 -0400 Subject: [PATCH 0698/1679] math/bits: add gccgo-friendly code for compiler bootstrap When building as part of the bootstrap process, avoid use of "go:linkname" applied to variables, since this feature is ill-defined/unsupported for gccgo. Updates #30771. Change-Id: Id44d01b5c98d292702e5075674117518cb59e2d0 Reviewed-on: https://go-review.googlesource.com/c/go/+/170737 Reviewed-by: Ian Lance Taylor Reviewed-by: Cherry Zhang Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/math/bits/bits.go | 8 -------- src/math/bits/bits_errors.go | 15 +++++++++++++++ src/math/bits/bits_errors_bootstrap.go | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 src/math/bits/bits_errors.go create mode 100644 src/math/bits/bits_errors_bootstrap.go diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go index 6f367dcc93..24d910c27e 100644 --- a/src/math/bits/bits.go +++ b/src/math/bits/bits.go @@ -8,8 +8,6 @@ // functions for the predeclared unsigned integer types. package bits -import _ "unsafe" // for go:linkname - const uintSize = 32 << (^uint(0) >> 32 & 1) // 32 or 64 // UintSize is the size of a uint in bits. @@ -524,9 +522,3 @@ func Div64(hi, lo, y uint64) (quo, rem uint64) { return q1*two32 + q0, (un21*two32 + un0 - q0*y) >> s } - -//go:linkname overflowError runtime.overflowError -var overflowError error - -//go:linkname divideError runtime.divideError -var divideError error diff --git a/src/math/bits/bits_errors.go b/src/math/bits/bits_errors.go new file mode 100644 index 0000000000..192b4bee00 --- /dev/null +++ b/src/math/bits/bits_errors.go @@ -0,0 +1,15 @@ +// Copyright 2019 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. + +// +build !compiler_bootstrap + +package bits + +import _ "unsafe" + +//go:linkname overflowError runtime.overflowError +var overflowError error + +//go:linkname divideError runtime.divideError +var divideError error diff --git a/src/math/bits/bits_errors_bootstrap.go b/src/math/bits/bits_errors_bootstrap.go new file mode 100644 index 0000000000..5df5738848 --- /dev/null +++ b/src/math/bits/bits_errors_bootstrap.go @@ -0,0 +1,22 @@ +// Copyright 2019 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. + +// +build compiler_bootstrap + +// This version used only for bootstrap (on this path we want +// to avoid use of go:linkname as applied to variables). + +package bits + +type errorString string + +func (e errorString) RuntimeError() {} + +func (e errorString) Error() string { + return "runtime error: " + string(e) +} + +var overflowError = error(errorString("integer overflow")) + +var divideError = error(errorString("integer divide by zero")) -- GitLab From f6b42a53e5ac1f1c3f3b1c9ed2407e68e0b637a0 Mon Sep 17 00:00:00 2001 From: grant Date: Wed, 3 Apr 2019 14:21:21 +0000 Subject: [PATCH 0699/1679] net: use libSystem bindings for DNS resolution on macos if cgo is unavailable This change adds directives to link the res_search function in libSystem. The corresponding Go function is then used in `lookup_darwin.go` for resolution when cgo is disabled. This makes DNS resolution logic more reliable as macOS has some unique quirks such as the `/etc/resolver/` directory for specifying nameservers. Fixes #12524 Change-Id: I367263c4951383965b3ef6491196152f78e614b1 GitHub-Last-Rev: 3c3ff6bfa7e4811f206f3b119a867c841a016e10 GitHub-Pull-Request: golang/go#30686 Reviewed-on: https://go-review.googlesource.com/c/go/+/166297 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/net/cgo_darwin_stub.go | 209 ++++++++++++++++++++++++++++++ src/net/cgo_stub.go | 1 + src/net/conf.go | 5 + src/runtime/lookup_darwin.go | 35 +++++ src/runtime/lookup_darwin_386.s | 50 +++++++ src/runtime/lookup_darwin_amd64.s | 40 ++++++ src/runtime/lookup_darwin_arm.s | 25 ++++ src/runtime/lookup_darwin_arm64.s | 21 +++ 8 files changed, 386 insertions(+) create mode 100644 src/net/cgo_darwin_stub.go create mode 100644 src/runtime/lookup_darwin.go create mode 100644 src/runtime/lookup_darwin_386.s create mode 100644 src/runtime/lookup_darwin_amd64.s create mode 100644 src/runtime/lookup_darwin_arm.s create mode 100644 src/runtime/lookup_darwin_arm64.s diff --git a/src/net/cgo_darwin_stub.go b/src/net/cgo_darwin_stub.go new file mode 100644 index 0000000000..544df7fd6c --- /dev/null +++ b/src/net/cgo_darwin_stub.go @@ -0,0 +1,209 @@ +// Copyright 2019 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. + +// +build !netgo,!cgo +// +build darwin + +package net + +import ( + "context" + "errors" + "sync" + + "golang.org/x/net/dns/dnsmessage" +) + +type addrinfoErrno int + +func (eai addrinfoErrno) Error() string { return "" } +func (eai addrinfoErrno) Temporary() bool { return false } +func (eai addrinfoErrno) Timeout() bool { return false } + +func cgoLookupHost(ctx context.Context, name string) (addrs []string, err error, completed bool) { + resources, err := resolverGetResources(ctx, name, int32(dnsmessage.TypeALL), int32(dnsmessage.ClassINET)) + if err != nil { + return + } + addrs, err = parseHostsFromResources(resources) + if err != nil { + return + } + return addrs, nil, true +} + +func cgoLookupPort(ctx context.Context, network, service string) (port int, err error, completed bool) { + port, err = goLookupPort(network, service) // we can just use netgo lookup + return port, err, err == nil +} + +func cgoLookupIP(ctx context.Context, network, name string) (addrs []IPAddr, err error, completed bool) { + + var resources []dnsmessage.Resource + switch ipVersion(network) { + case '4': + resources, err = resolverGetResources(ctx, name, int32(dnsmessage.TypeA), int32(dnsmessage.ClassINET)) + case '6': + resources, err = resolverGetResources(ctx, name, int32(dnsmessage.TypeAAAA), int32(dnsmessage.ClassINET)) + default: + resources, err = resolverGetResources(ctx, name, int32(dnsmessage.TypeALL), int32(dnsmessage.ClassINET)) + } + if err != nil { + return + } + + addrs, err = parseIPsFromResources(resources) + if err != nil { + return + } + + return addrs, nil, true +} + +func cgoLookupCNAME(ctx context.Context, name string) (cname string, err error, completed bool) { + resources, err := resolverGetResources(ctx, name, int32(dnsmessage.TypeCNAME), int32(dnsmessage.ClassINET)) + if err != nil { + return + } + cname, err = parseCNAMEFromResources(resources) + if err != nil { + return "", err, false + } + return cname, nil, true +} + +func cgoLookupPTR(ctx context.Context, addr string) (ptrs []string, err error, completed bool) { + resources, err := resolverGetResources(ctx, addr, int32(dnsmessage.TypePTR), int32(dnsmessage.ClassINET)) + if err != nil { + return + } + ptrs, err = parsePTRsFromResources(resources) + if err != nil { + return + } + return ptrs, nil, true +} + +var ( + resInitOnce sync.Once + errCode int32 +) + +// resolverGetResources will make a call to the 'res_search' routine in libSystem +// and parse the output as a slice of resource resources which can then be parsed +func resolverGetResources(ctx context.Context, hostname string, rtype, class int32) ([]dnsmessage.Resource, error) { + + resInitOnce.Do(func() { + errCode = res_init() + }) + if errCode < 0 { + return nil, errors.New("could not initialize name resolver data") + } + + var byteHostname = []byte(hostname) + var responseBuffer [512]byte + var size int32 + + size, errCode = res_search(&byteHostname[0], class, rtype, &responseBuffer[0], int32(len(responseBuffer))) + if errCode != 0 { + return nil, errors.New("could not complete domain resolution return code " + string(errCode)) + } + if size == 0 { + return nil, errors.New("received empty response") + } + + var msg dnsmessage.Message + err := msg.Unpack(responseBuffer[:]) + if err != nil { + return nil, err + } + + var dnsParser dnsmessage.Parser + if _, err := dnsParser.Start(responseBuffer[:]); err != nil { + return nil, err + } + + var resources []dnsmessage.Resource + for { + r, err := dnsParser.Answer() + if err == dnsmessage.ErrSectionDone { + break + } + if err != nil { + return nil, err + } + resources = append(resources, r) + } + return resources, nil +} + +func parseHostsFromResources(resources []dnsmessage.Resource) ([]string, error) { + var answers []string + + for i := range resources { + switch resources[i].Header.Type { + case dnsmessage.TypeA: + b := resources[i].Body.(*dnsmessage.AResource) + answers = append(answers, string(b.A[:])) + case dnsmessage.TypeAAAA: + b := resources[i].Body.(*dnsmessage.AAAAResource) + answers = append(answers, string(b.AAAA[:])) + default: + return nil, errors.New("could not parse an A or AAAA response from message buffer") + } + } + return answers, nil +} + +func parseIPsFromResources(resources []dnsmessage.Resource) ([]IPAddr, error) { + var answers []IPAddr + + for i := range resources { + switch resources[i].Header.Type { + case dnsmessage.TypeA: + b := resources[i].Body.(*dnsmessage.AResource) + ip := parseIPv4(string(b.A[:])) + answers = append(answers, IPAddr{IP: ip}) + case dnsmessage.TypeAAAA: + b := resources[i].Body.(*dnsmessage.AAAAResource) + ip, zone := parseIPv6Zone(string(b.AAAA[:])) + answers = append(answers, IPAddr{IP: ip, Zone: zone}) + default: + return nil, errors.New("could not parse an A or AAAA response from message buffer") + } + } + return answers, nil +} + +func parseCNAMEFromResources(resources []dnsmessage.Resource) (string, error) { + if len(resources) == 0 { + return "", errors.New("no CNAME record received") + } + c, ok := resources[0].Body.(*dnsmessage.CNAMEResource) + if !ok { + return "", errors.New("could not parse CNAME record") + } + return c.CNAME.String(), nil +} + +func parsePTRsFromResources(resources []dnsmessage.Resource) ([]string, error) { + var answers []string + for i := range resources { + switch resources[i].Header.Type { + case dnsmessage.TypePTR: + p := resources[0].Body.(*dnsmessage.PTRResource) + answers = append(answers, p.PTR.String()) + default: + return nil, errors.New("could not parse a PTR response from message buffer") + + } + } + return answers, nil +} + +// res_init and res_search are defined in runtime/lookup_darwin.go + +func res_init() int32 + +func res_search(dname *byte, class int32, rtype int32, answer *byte, anslen int32) (int32, int32) diff --git a/src/net/cgo_stub.go b/src/net/cgo_stub.go index 041f8af129..aa15ab4dc1 100644 --- a/src/net/cgo_stub.go +++ b/src/net/cgo_stub.go @@ -3,6 +3,7 @@ // license that can be found in the LICENSE file. // +build !cgo netgo +// +build !darwin package net diff --git a/src/net/conf.go b/src/net/conf.go index 971b1a399a..1c88f096ba 100644 --- a/src/net/conf.go +++ b/src/net/conf.go @@ -70,6 +70,11 @@ func initConfVal() { // their own DNS requests. So always use cgo instead, which // avoids that. if runtime.GOOS == "darwin" { + // Normally we force netGo to be true if building without cgo enabled. + // On Darwin, we can call libc even if cgo is not enabled, so only set netGo to true + // if explicitly requested. + confVal.netGo = dnsMode == "go" + confVal.forceCgoLookupHost = true return } diff --git a/src/runtime/lookup_darwin.go b/src/runtime/lookup_darwin.go new file mode 100644 index 0000000000..c39b937ccf --- /dev/null +++ b/src/runtime/lookup_darwin.go @@ -0,0 +1,35 @@ +// Copyright 2019 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 runtime + +import ( + "unsafe" +) + +//go:linkname res_init net.res_init +//go:nosplit +//go:cgo_unsafe_args +func res_init() int32 { + return libcCall(unsafe.Pointer(funcPC(res_init_trampoline)), nil) +} +func res_init_trampoline() + +//go:linkname res_search net.res_search +//go:nosplit +//go:cgo_unsafe_args +func res_search(dname *byte, class int32, rtype int32, answer *byte, anslen int32) (int32, int32) { + args := struct { + dname *byte + class, rtype int32 + answer *byte + anslen, retSize, retErr int32 + }{dname, class, rtype, answer, anslen, 0, 0} + libcCall(unsafe.Pointer(funcPC(res_search_trampoline)), unsafe.Pointer(&args)) + return args.retSize, args.retErr +} +func res_search_trampoline() + +//go:cgo_import_dynamic libc_res_search res_search "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_res_init res_init "/usr/lib/libSystem.B.dylib" diff --git a/src/runtime/lookup_darwin_386.s b/src/runtime/lookup_darwin_386.s new file mode 100644 index 0000000000..4995e51df5 --- /dev/null +++ b/src/runtime/lookup_darwin_386.s @@ -0,0 +1,50 @@ +// Copyright 2019 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. + +#include "go_asm.h" +#include "go_tls.h" +#include "textflag.h" + +TEXT runtime·res_init_trampoline(SB),NOSPLIT,$0 + PUSHL BP + MOVL SP, BP + SUBL $8, SP + CALL libc_res_init(SB) + CMPL AX, $-1 + JNE ok + CALL libc_error(SB) +ok: + MOVL BP, SP + POPL BP + RET + +TEXT runtime·res_search_trampoline(SB),NOSPLIT,$0 + PUSHL BP + MOVL SP, BP + SUBL $24, SP + MOVL 32(SP), CX + MOVL 16(CX), AX // arg 5 anslen + MOVL AX, 16(SP) + MOVL 12(CX), AX // arg 4 answer + MOVL AX, 12(SP) + MOVL 8(CX), AX // arg 3 type + MOVL AX, 8(SP) + MOVL 4(CX), AX // arg 2 class + MOVL AX, 4(SP) + MOVL 0(CX), AX // arg 1 name + MOVL AX, 0(SP) + CALL libc_res_search(SB) + XORL DX, DX + CMPL AX, $-1 + JNE ok + CALL libc_error(SB) + MOVL (AX), DX + XORL AX, AX +ok: + MOVL 32(SP), CX + MOVL AX, 20(CX) + MOVL DX, 24(CX) + MOVL BP, SP + POPL BP + RET diff --git a/src/runtime/lookup_darwin_amd64.s b/src/runtime/lookup_darwin_amd64.s new file mode 100644 index 0000000000..bfe70c2d01 --- /dev/null +++ b/src/runtime/lookup_darwin_amd64.s @@ -0,0 +1,40 @@ +// Copyright 2019 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. + +#include "go_asm.h" +#include "go_tls.h" +#include "textflag.h" + +TEXT runtime·res_init_trampoline(SB),NOSPLIT,$0 + PUSHQ BP + MOVQ SP, BP + CALL libc_res_init(SB) + CMPQ AX, $-1 + JNE ok + CALL libc_error(SB) +ok: + POPQ BP + RET + +TEXT runtime·res_search_trampoline(SB),NOSPLIT,$0 + PUSHQ BP + MOVQ SP, BP + MOVQ DI, BX // move DI into BX to preserve struct addr + MOVL 24(BX), R8 // arg 5 anslen + MOVQ 16(BX), CX // arg 4 answer + MOVL 12(BX), DX // arg 3 type + MOVL 8(BX), SI // arg 2 class + MOVQ 0(BX), DI // arg 1 name + CALL libc_res_search(SB) + XORL DX, DX + CMPQ AX, $-1 + JNE ok + CALL libc_error(SB) + MOVLQSX (AX), DX // move return from libc_error into DX + XORL AX, AX // size on error is 0 +ok: + MOVQ AX, 28(BX) // size + MOVQ DX, 32(BX) // error code + POPQ BP + RET diff --git a/src/runtime/lookup_darwin_arm.s b/src/runtime/lookup_darwin_arm.s new file mode 100644 index 0000000000..bf69d21213 --- /dev/null +++ b/src/runtime/lookup_darwin_arm.s @@ -0,0 +1,25 @@ +// Copyright 2015 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. + +// System calls and other sys.stuff for ARM64, Darwin +// System calls are implemented in libSystem, this file contains +// trampolines that convert from Go to C calling convention. + +#include "go_asm.h" +#include "go_tls.h" +#include "textflag.h" + +// On darwin/arm, the runtime always uses runtime/cgo +// for resolution. This will just exit with a nominal +// exit code. + +TEXT runtime·res_search_trampoline(SB),NOSPLIT,$0 + MOVW $90, R0 + BL libc_exit(SB) + RET + +TEXT runtime·res_init_trampoline(SB),NOSPLIT,$0 + MOVW $91, R0 + BL libc_exit(SB) + RET diff --git a/src/runtime/lookup_darwin_arm64.s b/src/runtime/lookup_darwin_arm64.s new file mode 100644 index 0000000000..31061e15c0 --- /dev/null +++ b/src/runtime/lookup_darwin_arm64.s @@ -0,0 +1,21 @@ +// Copyright 2019 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. + +#include "go_asm.h" +#include "go_tls.h" +#include "textflag.h" + +// On darwin/arm, the runtime always uses runtime/cgo +// for resolution. This will just exit with a nominal +// exit code. + +TEXT runtime·res_search_trampoline(SB),NOSPLIT,$0 + MOVW $90, R0 + BL libc_exit(SB) + RET + +TEXT runtime·res_init_trampoline(SB),NOSPLIT,$0 + MOVW $91, R0 + BL libc_exit(SB) + RET -- GitLab From 3ebb1ad9cddf4711d4b0f44c24da1ceac3d9e069 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sun, 30 Dec 2018 19:47:27 -0500 Subject: [PATCH 0700/1679] runtime: ring buffer for binary debug logging This adds an internal runtime debug log. It uses per-M time-stamped ring buffers of binary log records. On panic, these buffers are collected, interleaved, and printed. The entry-point to the debug log is a new "dlog" function. dlog is designed so it can be used even from very constrained corners of the runtime such as signal handlers or inside the write barrier. The facility is only enabled if the debuglog build tag is set. Otherwise, it compiles away to a no-op implementation. The debug log format is also designed so it would be reasonable to decode from a core dump, though this hasn't been implemented. Change-Id: I6e2737c286358e97a0d8091826498070b95b66a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/157997 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- src/runtime/debuglog.go | 808 ++++++++++++++++++++++++++++ src/runtime/debuglog_off.go | 19 + src/runtime/debuglog_on.go | 45 ++ src/runtime/debuglog_test.go | 158 ++++++ src/runtime/export_debuglog_test.go | 46 ++ src/runtime/panic.go | 2 + src/runtime/runtime2.go | 2 + src/runtime/signal_sighandler.go | 2 + 8 files changed, 1082 insertions(+) create mode 100644 src/runtime/debuglog.go create mode 100644 src/runtime/debuglog_off.go create mode 100644 src/runtime/debuglog_on.go create mode 100644 src/runtime/debuglog_test.go create mode 100644 src/runtime/export_debuglog_test.go diff --git a/src/runtime/debuglog.go b/src/runtime/debuglog.go new file mode 100644 index 0000000000..3f8481270a --- /dev/null +++ b/src/runtime/debuglog.go @@ -0,0 +1,808 @@ +// Copyright 2019 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. + +// This file provides an internal debug logging facility. The debug +// log is a lightweight, in-memory, per-M ring buffer. By default, the +// runtime prints the debug log on panic. +// +// To print something to the debug log, call dlog to obtain a dlogger +// and use the methods on that to add values. The values will be +// space-separated in the output (much like println). +// +// This facility can be enabled by passing -tags debuglog when +// building. Without this tag, dlog calls compile to nothing. + +package runtime + +import ( + "runtime/internal/atomic" + "unsafe" +) + +// debugLogBytes is the size of each per-M ring buffer. This is +// allocated off-heap to avoid blowing up the M and hence the GC'd +// heap size. +const debugLogBytes = 16 << 10 + +// debugLogStringLimit the the maximum number of bytes in a string. +// Above this, the string will be truncated with "..(n more bytes).." +const debugLogStringLimit = debugLogBytes / 8 + +// dlog returns a debug logger. The caller can use methods on the +// returned logger to add values, which will be space-separated in the +// final output, much like println. The caller must call end() to +// finish the message. +// +// dlog can be used from highly-constrained corners of the runtime: it +// is safe to use in the signal handler, from within the write +// barrier, from within the stack implementation, and in places that +// must be recursively nosplit. +// +// This will be compiled away if built without the debuglog build tag. +// However, argument construction may not be. If any of the arguments +// are not literals or trivial expressions, consider protecting the +// call with "if dlogEnabled". +// +//go:nosplit +//go:nowritebarrierrec +func dlog() *dlogger { + if !dlogEnabled { + return nil + } + + // Get the time. + tick, nano := uint64(cputicks()), uint64(nanotime()) + + // Try to get a cached logger. + l := getCachedDlogger() + + // If we couldn't get a cached logger, try to get one from the + // global pool. + if l == nil { + allp := (*uintptr)(unsafe.Pointer(&allDloggers)) + all := (*dlogger)(unsafe.Pointer(atomic.Loaduintptr(allp))) + for l1 := all; l1 != nil; l1 = l1.allLink { + if atomic.Load(&l1.owned) == 0 && atomic.Cas(&l1.owned, 0, 1) { + l = l1 + break + } + } + } + + // If that failed, allocate a new logger. + if l == nil { + l = (*dlogger)(sysAlloc(unsafe.Sizeof(dlogger{}), nil)) + if l == nil { + throw("failed to allocate debug log") + } + l.w.r.data = &l.w.data + l.owned = 1 + + // Prepend to allDloggers list. + headp := (*uintptr)(unsafe.Pointer(&allDloggers)) + for { + head := atomic.Loaduintptr(headp) + l.allLink = (*dlogger)(unsafe.Pointer(head)) + if atomic.Casuintptr(headp, head, uintptr(unsafe.Pointer(l))) { + break + } + } + } + + // If the time delta is getting too high, write a new sync + // packet. We set the limit so we don't write more than 6 + // bytes of delta in the record header. + const deltaLimit = 1<<(3*7) - 1 // ~2ms between sync packets + if tick-l.w.tick > deltaLimit || nano-l.w.nano > deltaLimit { + l.w.writeSync(tick, nano) + } + + // Reserve space for framing header. + l.w.ensure(debugLogHeaderSize) + l.w.write += debugLogHeaderSize + + // Write record header. + l.w.uvarint(tick - l.w.tick) + l.w.uvarint(nano - l.w.nano) + gp := getg() + if gp != nil && gp.m != nil && gp.m.p != 0 { + l.w.varint(int64(gp.m.p.ptr().id)) + } else { + l.w.varint(-1) + } + + return l +} + +// A dlogger writes to the debug log. +// +// To obtain a dlogger, call dlog(). When done with the dlogger, call +// end(). +// +//go:notinheap +type dlogger struct { + w debugLogWriter + + // allLink is the next dlogger in the allDloggers list. + allLink *dlogger + + // owned indicates that this dlogger is owned by an M. This is + // accessed atomically. + owned uint32 +} + +// allDloggers is a list of all dloggers, linked through +// dlogger.allLink. This is accessed atomically. This is prepend only, +// so it doesn't need to protect against ABA races. +var allDloggers *dlogger + +//go:nosplit +func (l *dlogger) end() { + if !dlogEnabled { + return + } + + // Fill in framing header. + size := l.w.write - l.w.r.end + if !l.w.writeFrameAt(l.w.r.end, size) { + throw("record too large") + } + + // Commit the record. + l.w.r.end = l.w.write + + // Attempt to return this logger to the cache. + if putCachedDlogger(l) { + return + } + + // Return the logger to the global pool. + atomic.Store(&l.owned, 0) +} + +const ( + debugLogUnknown = 1 + iota + debugLogBoolTrue + debugLogBoolFalse + debugLogInt + debugLogUint + debugLogHex + debugLogPtr + debugLogString + debugLogConstString + debugLogStringOverflow + + debugLogPC + debugLogTraceback +) + +//go:nosplit +func (l *dlogger) b(x bool) *dlogger { + if !dlogEnabled { + return l + } + if x { + l.w.byte(debugLogBoolTrue) + } else { + l.w.byte(debugLogBoolFalse) + } + return l +} + +//go:nosplit +func (l *dlogger) i(x int) *dlogger { + return l.i64(int64(x)) +} + +//go:nosplit +func (l *dlogger) i8(x int8) *dlogger { + return l.i64(int64(x)) +} + +//go:nosplit +func (l *dlogger) i16(x int16) *dlogger { + return l.i64(int64(x)) +} + +//go:nosplit +func (l *dlogger) i32(x int32) *dlogger { + return l.i64(int64(x)) +} + +//go:nosplit +func (l *dlogger) i64(x int64) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogInt) + l.w.varint(x) + return l +} + +//go:nosplit +func (l *dlogger) u(x uint) *dlogger { + return l.u64(uint64(x)) +} + +//go:nosplit +func (l *dlogger) uptr(x uintptr) *dlogger { + return l.u64(uint64(x)) +} + +//go:nosplit +func (l *dlogger) u8(x uint8) *dlogger { + return l.u64(uint64(x)) +} + +//go:nosplit +func (l *dlogger) u16(x uint16) *dlogger { + return l.u64(uint64(x)) +} + +//go:nosplit +func (l *dlogger) u32(x uint32) *dlogger { + return l.u64(uint64(x)) +} + +//go:nosplit +func (l *dlogger) u64(x uint64) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogUint) + l.w.uvarint(x) + return l +} + +//go:nosplit +func (l *dlogger) hex(x uint64) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogHex) + l.w.uvarint(x) + return l +} + +//go:nosplit +func (l *dlogger) p(x interface{}) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogPtr) + if x == nil { + l.w.uvarint(0) + } else { + v := efaceOf(&x) + switch v._type.kind & kindMask { + case kindChan, kindFunc, kindMap, kindPtr, kindUnsafePointer: + l.w.uvarint(uint64(uintptr(v.data))) + default: + throw("not a pointer type") + } + } + return l +} + +//go:nosplit +func (l *dlogger) s(x string) *dlogger { + if !dlogEnabled { + return l + } + str := stringStructOf(&x) + datap := &firstmoduledata + if len(x) > 4 && datap.etext <= uintptr(str.str) && uintptr(str.str) < datap.end { + // String constants are in the rodata section, which + // isn't recorded in moduledata. But it has to be + // somewhere between etext and end. + l.w.byte(debugLogConstString) + l.w.uvarint(uint64(str.len)) + l.w.uvarint(uint64(uintptr(str.str) - datap.etext)) + } else { + l.w.byte(debugLogString) + var b []byte + bb := (*slice)(unsafe.Pointer(&b)) + bb.array = str.str + bb.len, bb.cap = str.len, str.len + if len(b) > debugLogStringLimit { + b = b[:debugLogStringLimit] + } + l.w.uvarint(uint64(len(b))) + l.w.bytes(b) + if len(b) != len(x) { + l.w.byte(debugLogStringOverflow) + l.w.uvarint(uint64(len(x) - len(b))) + } + } + return l +} + +//go:nosplit +func (l *dlogger) pc(x uintptr) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogPC) + l.w.uvarint(uint64(x)) + return l +} + +//go:nosplit +func (l *dlogger) traceback(x []uintptr) *dlogger { + if !dlogEnabled { + return l + } + l.w.byte(debugLogTraceback) + l.w.uvarint(uint64(len(x))) + for _, pc := range x { + l.w.uvarint(uint64(pc)) + } + return l +} + +// A debugLogWriter is a ring buffer of binary debug log records. +// +// A log record consists of a 2-byte framing header and a sequence of +// fields. The framing header gives the size of the record as a little +// endian 16-bit value. Each field starts with a byte indicating its +// type, followed by type-specific data. If the size in the framing +// header is 0, it's a sync record consisting of two little endian +// 64-bit values giving a new time base. +// +// Because this is a ring buffer, new records will eventually +// overwrite old records. Hence, it maintains a reader that consumes +// the log as it gets overwritten. That reader state is where an +// actual log reader would start. +// +//go:notinheap +type debugLogWriter struct { + write uint64 + data debugLogBuf + + // tick and nano are the time bases from the most recently + // written sync record. + tick, nano uint64 + + // r is a reader that consumes records as they get overwritten + // by the writer. It also acts as the initial reader state + // when printing the log. + r debugLogReader + + // buf is a scratch buffer for encoding. This is here to + // reduce stack usage. + buf [10]byte +} + +//go:notinheap +type debugLogBuf [debugLogBytes]byte + +const ( + // debugLogHeaderSize is the number of bytes in the framing + // header of every dlog record. + debugLogHeaderSize = 2 + + // debugLogSyncSize is the number of bytes in a sync record. + debugLogSyncSize = debugLogHeaderSize + 2*8 +) + +//go:nosplit +func (l *debugLogWriter) ensure(n uint64) { + for l.write+n >= l.r.begin+uint64(len(l.data)) { + // Consume record at begin. + if l.r.skip() == ^uint64(0) { + // Wrapped around within a record. + // + // TODO(austin): It would be better to just + // eat the whole buffer at this point, but we + // have to communicate that to the reader + // somehow. + throw("record wrapped around") + } + } +} + +//go:nosplit +func (l *debugLogWriter) writeFrameAt(pos, size uint64) bool { + l.data[pos%uint64(len(l.data))] = uint8(size) + l.data[(pos+1)%uint64(len(l.data))] = uint8(size >> 8) + return size <= 0xFFFF +} + +//go:nosplit +func (l *debugLogWriter) writeSync(tick, nano uint64) { + l.tick, l.nano = tick, nano + l.ensure(debugLogHeaderSize) + l.writeFrameAt(l.write, 0) + l.write += debugLogHeaderSize + l.writeUint64LE(tick) + l.writeUint64LE(nano) + l.r.end = l.write +} + +//go:nosplit +func (l *debugLogWriter) writeUint64LE(x uint64) { + var b [8]byte + b[0] = byte(x) + b[1] = byte(x >> 8) + b[2] = byte(x >> 16) + b[3] = byte(x >> 24) + b[4] = byte(x >> 32) + b[5] = byte(x >> 40) + b[6] = byte(x >> 48) + b[7] = byte(x >> 56) + l.bytes(b[:]) +} + +//go:nosplit +func (l *debugLogWriter) byte(x byte) { + l.ensure(1) + pos := l.write + l.write++ + l.data[pos%uint64(len(l.data))] = x +} + +//go:nosplit +func (l *debugLogWriter) bytes(x []byte) { + l.ensure(uint64(len(x))) + pos := l.write + l.write += uint64(len(x)) + for len(x) > 0 { + n := copy(l.data[pos%uint64(len(l.data)):], x) + pos += uint64(n) + x = x[n:] + } +} + +//go:nosplit +func (l *debugLogWriter) varint(x int64) { + var u uint64 + if x < 0 { + u = (^uint64(x) << 1) | 1 // complement i, bit 0 is 1 + } else { + u = (uint64(x) << 1) // do not complement i, bit 0 is 0 + } + l.uvarint(u) +} + +//go:nosplit +func (l *debugLogWriter) uvarint(u uint64) { + i := 0 + for u >= 0x80 { + l.buf[i] = byte(u) | 0x80 + u >>= 7 + i++ + } + l.buf[i] = byte(u) + i++ + l.bytes(l.buf[:i]) +} + +type debugLogReader struct { + data *debugLogBuf + + // begin and end are the positions in the log of the beginning + // and end of the log data, modulo len(data). + begin, end uint64 + + // tick and nano are the current time base at begin. + tick, nano uint64 +} + +//go:nosplit +func (r *debugLogReader) skip() uint64 { + // Read size at pos. + if r.begin+debugLogHeaderSize > r.end { + return ^uint64(0) + } + size := uint64(r.readUint16LEAt(r.begin)) + if size == 0 { + // Sync packet. + r.tick = r.readUint64LEAt(r.begin + debugLogHeaderSize) + r.nano = r.readUint64LEAt(r.begin + debugLogHeaderSize + 8) + size = debugLogSyncSize + } + if r.begin+size > r.end { + return ^uint64(0) + } + r.begin += size + return size +} + +//go:nosplit +func (r *debugLogReader) readUint16LEAt(pos uint64) uint16 { + return uint16(r.data[pos%uint64(len(r.data))]) | + uint16(r.data[(pos+1)%uint64(len(r.data))])<<8 +} + +//go:nosplit +func (r *debugLogReader) readUint64LEAt(pos uint64) uint64 { + var b [8]byte + for i := range b { + b[i] = r.data[pos%uint64(len(r.data))] + pos++ + } + return uint64(b[0]) | uint64(b[1])<<8 | + uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | + uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func (r *debugLogReader) peek() (tick uint64) { + // Consume any sync records. + size := uint64(0) + for size == 0 { + if r.begin+debugLogHeaderSize > r.end { + return ^uint64(0) + } + size = uint64(r.readUint16LEAt(r.begin)) + if size != 0 { + break + } + if r.begin+debugLogSyncSize > r.end { + return ^uint64(0) + } + // Sync packet. + r.tick = r.readUint64LEAt(r.begin + debugLogHeaderSize) + r.nano = r.readUint64LEAt(r.begin + debugLogHeaderSize + 8) + r.begin += debugLogSyncSize + } + + // Peek tick delta. + if r.begin+size > r.end { + return ^uint64(0) + } + pos := r.begin + debugLogHeaderSize + var u uint64 + for i := uint(0); ; i += 7 { + b := r.data[pos%uint64(len(r.data))] + pos++ + u |= uint64(b&^0x80) << i + if b&0x80 == 0 { + break + } + } + if pos > r.begin+size { + return ^uint64(0) + } + return r.tick + u +} + +func (r *debugLogReader) header() (end, tick, nano uint64, p int) { + // Read size. We've already skipped sync packets and checked + // bounds in peek. + size := uint64(r.readUint16LEAt(r.begin)) + end = r.begin + size + r.begin += debugLogHeaderSize + + // Read tick, nano, and p. + tick = r.uvarint() + r.tick + nano = r.uvarint() + r.nano + p = int(r.varint()) + + return +} + +func (r *debugLogReader) uvarint() uint64 { + var u uint64 + for i := uint(0); ; i += 7 { + b := r.data[r.begin%uint64(len(r.data))] + r.begin++ + u |= uint64(b&^0x80) << i + if b&0x80 == 0 { + break + } + } + return u +} + +func (r *debugLogReader) varint() int64 { + u := r.uvarint() + var v int64 + if u&1 == 0 { + v = int64(u >> 1) + } else { + v = ^int64(u >> 1) + } + return v +} + +func (r *debugLogReader) printVal() bool { + typ := r.data[r.begin%uint64(len(r.data))] + r.begin++ + + switch typ { + default: + print("\n") + return false + + case debugLogUnknown: + print("") + + case debugLogBoolTrue: + print(true) + + case debugLogBoolFalse: + print(false) + + case debugLogInt: + print(r.varint()) + + case debugLogUint: + print(r.uvarint()) + + case debugLogHex, debugLogPtr: + print(hex(r.uvarint())) + + case debugLogString: + sl := r.uvarint() + if r.begin+sl > r.end { + r.begin = r.end + print("") + break + } + for sl > 0 { + b := r.data[r.begin%uint64(len(r.data)):] + if uint64(len(b)) > sl { + b = b[:sl] + } + r.begin += uint64(len(b)) + sl -= uint64(len(b)) + gwrite(b) + } + + case debugLogConstString: + len, ptr := int(r.uvarint()), uintptr(r.uvarint()) + ptr += firstmoduledata.etext + str := stringStruct{ + str: unsafe.Pointer(ptr), + len: len, + } + s := *(*string)(unsafe.Pointer(&str)) + print(s) + + case debugLogStringOverflow: + print("..(", r.uvarint(), " more bytes)..") + + case debugLogPC: + printDebugLogPC(uintptr(r.uvarint())) + + case debugLogTraceback: + n := int(r.uvarint()) + for i := 0; i < n; i++ { + print("\n\t") + printDebugLogPC(uintptr(r.uvarint())) + } + } + + return true +} + +// printDebugLog prints the debug log. +func printDebugLog() { + if !dlogEnabled { + return + } + + // This function should not panic or throw since it is used in + // the fatal panic path and this may deadlock. + + printlock() + + // Get the list of all debug logs. + allp := (*uintptr)(unsafe.Pointer(&allDloggers)) + all := (*dlogger)(unsafe.Pointer(atomic.Loaduintptr(allp))) + + // Count the logs. + n := 0 + for l := all; l != nil; l = l.allLink { + n++ + } + if n == 0 { + printunlock() + return + } + + // Prepare read state for all logs. + type readState struct { + debugLogReader + first bool + lost uint64 + nextTick uint64 + } + state1 := sysAlloc(unsafe.Sizeof(readState{})*uintptr(n), nil) + if state1 == nil { + println("failed to allocate read state for", n, "logs") + printunlock() + return + } + state := (*[1 << 20]readState)(state1)[:n] + { + l := all + for i := range state { + s := &state[i] + s.debugLogReader = l.w.r + s.first = true + s.lost = l.w.r.begin + s.nextTick = s.peek() + l = l.allLink + } + } + + // Print records. + for { + // Find the next record. + var best struct { + tick uint64 + i int + } + best.tick = ^uint64(0) + for i := range state { + if state[i].nextTick < best.tick { + best.tick = state[i].nextTick + best.i = i + } + } + if best.tick == ^uint64(0) { + break + } + + // Print record. + s := &state[best.i] + if s.first { + print(">> begin log ", best.i) + if s.lost != 0 { + print("; lost first ", s.lost>>10, "KB") + } + print(" <<\n") + s.first = false + } + + end, _, nano, p := s.header() + oldEnd := s.end + s.end = end + + print("[") + var tmpbuf [21]byte + pnano := int64(nano) - runtimeInitTime + if pnano < 0 { + // Logged before runtimeInitTime was set. + pnano = 0 + } + print(string(itoaDiv(tmpbuf[:], uint64(pnano), 9))) + print(" P ", p, "] ") + + for i := 0; s.begin < s.end; i++ { + if i > 0 { + print(" ") + } + if !s.printVal() { + // Abort this P log. + print("") + end = oldEnd + break + } + } + println() + + // Move on to the next record. + s.begin = end + s.end = oldEnd + s.nextTick = s.peek() + } + + printunlock() +} + +func printDebugLogPC(pc uintptr) { + print(hex(pc)) + fn := findfunc(pc) + if !fn.valid() { + print(" [unknown PC]") + } else { + name := funcname(fn) + file, line := funcline(fn, pc) + print(" [", name, "+", hex(pc-fn.entry), + " ", file, ":", line, "]") + } +} diff --git a/src/runtime/debuglog_off.go b/src/runtime/debuglog_off.go new file mode 100644 index 0000000000..bb3e172498 --- /dev/null +++ b/src/runtime/debuglog_off.go @@ -0,0 +1,19 @@ +// Copyright 2019 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. + +// +build !debuglog + +package runtime + +const dlogEnabled = false + +type dlogPerM struct{} + +func getCachedDlogger() *dlogger { + return nil +} + +func putCachedDlogger(l *dlogger) bool { + return false +} diff --git a/src/runtime/debuglog_on.go b/src/runtime/debuglog_on.go new file mode 100644 index 0000000000..3d477e8ef5 --- /dev/null +++ b/src/runtime/debuglog_on.go @@ -0,0 +1,45 @@ +// Copyright 2019 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. + +// +build debuglog + +package runtime + +const dlogEnabled = true + +// dlogPerM is the per-M debug log data. This is embedded in the m +// struct. +type dlogPerM struct { + dlogCache *dlogger +} + +// getCachedDlogger returns a cached dlogger if it can do so +// efficiently, or nil otherwise. The returned dlogger will be owned. +func getCachedDlogger() *dlogger { + mp := acquirem() + // We don't return a cached dlogger if we're running on the + // signal stack in case the signal arrived while in + // get/putCachedDlogger. (Too bad we don't have non-atomic + // exchange!) + var l *dlogger + if getg() != mp.gsignal { + l = mp.dlogCache + mp.dlogCache = nil + } + releasem(mp) + return l +} + +// putCachedDlogger attempts to return l to the local cache. It +// returns false if this fails. +func putCachedDlogger(l *dlogger) bool { + mp := acquirem() + if getg() != mp.gsignal && mp.dlogCache == nil { + mp.dlogCache = l + releasem(mp) + return true + } + releasem(mp) + return false +} diff --git a/src/runtime/debuglog_test.go b/src/runtime/debuglog_test.go new file mode 100644 index 0000000000..2570e3565b --- /dev/null +++ b/src/runtime/debuglog_test.go @@ -0,0 +1,158 @@ +// Copyright 2019 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. + +// TODO(austin): All of these tests are skipped if the debuglog build +// tag isn't provided. That means we basically never test debuglog. +// There are two potential ways around this: +// +// 1. Make these tests re-build the runtime test with the debuglog +// build tag and re-invoke themselves. +// +// 2. Always build the whole debuglog infrastructure and depend on +// linker dead-code elimination to drop it. This is easy for dlog() +// since there won't be any calls to it. For printDebugLog, we can +// make panic call a wrapper that is call printDebugLog if the +// debuglog build tag is set, or otherwise do nothing. Then tests +// could call printDebugLog directly. This is the right answer in +// principle, but currently our linker reads in all symbols +// regardless, so this would slow down and bloat all links. If the +// linker gets more efficient about this, we should revisit this +// approach. + +package runtime_test + +import ( + "bytes" + "fmt" + "regexp" + "runtime" + "strings" + "sync" + "sync/atomic" + "testing" +) + +func skipDebugLog(t *testing.T) { + if !runtime.DlogEnabled { + t.Skip("debug log disabled (rebuild with -tags debuglog)") + } +} + +func dlogCanonicalize(x string) string { + begin := regexp.MustCompile(`(?m)^>> begin log \d+ <<\n`) + x = begin.ReplaceAllString(x, "") + prefix := regexp.MustCompile(`(?m)^\[[^]]+\]`) + x = prefix.ReplaceAllString(x, "[]") + return x +} + +func TestDebugLog(t *testing.T) { + skipDebugLog(t) + runtime.ResetDebugLog() + runtime.Dlog().S("testing").End() + got := dlogCanonicalize(runtime.DumpDebugLog()) + if want := "[] testing\n"; got != want { + t.Fatalf("want %q, got %q", want, got) + } +} + +func TestDebugLogTypes(t *testing.T) { + skipDebugLog(t) + runtime.ResetDebugLog() + var varString = strings.Repeat("a", 4) + runtime.Dlog().B(true).B(false).I(-42).I16(0x7fff).U64(^uint64(0)).Hex(0xfff).P(nil).S(varString).S("const string").End() + got := dlogCanonicalize(runtime.DumpDebugLog()) + if want := "[] true false -42 32767 18446744073709551615 0xfff 0x0 aaaa const string\n"; got != want { + t.Fatalf("want %q, got %q", want, got) + } +} + +func TestDebugLogSym(t *testing.T) { + skipDebugLog(t) + runtime.ResetDebugLog() + pc, _, _, _ := runtime.Caller(0) + runtime.Dlog().PC(pc).End() + got := dlogCanonicalize(runtime.DumpDebugLog()) + want := regexp.MustCompile(`\[\] 0x[0-9a-f]+ \[runtime_test\.TestDebugLogSym\+0x[0-9a-f]+ .*/debuglog_test\.go:[0-9]+\]\n`) + if !want.MatchString(got) { + t.Fatalf("want matching %s, got %q", want, got) + } +} + +func TestDebugLogInterleaving(t *testing.T) { + skipDebugLog(t) + runtime.ResetDebugLog() + var wg sync.WaitGroup + done := int32(0) + wg.Add(1) + go func() { + // Encourage main goroutine to move around to + // different Ms and Ps. + for atomic.LoadInt32(&done) == 0 { + runtime.Gosched() + } + wg.Done() + }() + var want bytes.Buffer + for i := 0; i < 1000; i++ { + runtime.Dlog().I(i).End() + fmt.Fprintf(&want, "[] %d\n", i) + runtime.Gosched() + } + atomic.StoreInt32(&done, 1) + wg.Wait() + + gotFull := runtime.DumpDebugLog() + got := dlogCanonicalize(gotFull) + if got != want.String() { + // Since the timestamps are useful in understand + // failures of this test, we print the uncanonicalized + // output. + t.Fatalf("want %q, got (uncanonicalized) %q", want.String(), gotFull) + } +} + +func TestDebugLogWraparound(t *testing.T) { + skipDebugLog(t) + + // Make sure we don't switch logs so it's easier to fill one up. + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + runtime.ResetDebugLog() + var longString = strings.Repeat("a", 128) + var want bytes.Buffer + for i, j := 0, 0; j < 2*runtime.DebugLogBytes; i, j = i+1, j+len(longString) { + runtime.Dlog().I(i).S(longString).End() + fmt.Fprintf(&want, "[] %d %s\n", i, longString) + } + log := runtime.DumpDebugLog() + + // Check for "lost" message. + lost := regexp.MustCompile(`^>> begin log \d+; lost first \d+KB <<\n`) + if !lost.MatchString(log) { + t.Fatalf("want matching %s, got %q", lost, log) + } + idx := lost.FindStringIndex(log) + // Strip lost message. + log = dlogCanonicalize(log[idx[1]:]) + + // Check log. + if !strings.HasSuffix(want.String(), log) { + t.Fatalf("wrong suffix:\n%s", log) + } +} + +func TestDebugLogLongString(t *testing.T) { + skipDebugLog(t) + + runtime.ResetDebugLog() + var longString = strings.Repeat("a", runtime.DebugLogStringLimit+1) + runtime.Dlog().S(longString).End() + got := dlogCanonicalize(runtime.DumpDebugLog()) + want := "[] " + strings.Repeat("a", runtime.DebugLogStringLimit) + " ..(1 more bytes)..\n" + if got != want { + t.Fatalf("want %q, got %q", want, got) + } +} diff --git a/src/runtime/export_debuglog_test.go b/src/runtime/export_debuglog_test.go new file mode 100644 index 0000000000..8cd943b438 --- /dev/null +++ b/src/runtime/export_debuglog_test.go @@ -0,0 +1,46 @@ +// Copyright 2019 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. + +// Export debuglog guts for testing. + +package runtime + +const DlogEnabled = dlogEnabled + +const DebugLogBytes = debugLogBytes + +const DebugLogStringLimit = debugLogStringLimit + +var Dlog = dlog + +func (l *dlogger) End() { l.end() } +func (l *dlogger) B(x bool) *dlogger { return l.b(x) } +func (l *dlogger) I(x int) *dlogger { return l.i(x) } +func (l *dlogger) I16(x int16) *dlogger { return l.i16(x) } +func (l *dlogger) U64(x uint64) *dlogger { return l.u64(x) } +func (l *dlogger) Hex(x uint64) *dlogger { return l.hex(x) } +func (l *dlogger) P(x interface{}) *dlogger { return l.p(x) } +func (l *dlogger) S(x string) *dlogger { return l.s(x) } +func (l *dlogger) PC(x uintptr) *dlogger { return l.pc(x) } + +func DumpDebugLog() string { + g := getg() + g.writebuf = make([]byte, 0, 1<<20) + printDebugLog() + buf := g.writebuf + g.writebuf = nil + + return string(buf) +} + +func ResetDebugLog() { + stopTheWorld("ResetDebugLog") + for l := allDloggers; l != nil; l = l.allLink { + l.w.write = 0 + l.w.tick, l.w.nano = 0, 0 + l.w.r.begin, l.w.r.end = 0, 0 + l.w.r.tick, l.w.r.nano = 0, 0 + } + startTheWorld() +} diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 543fd23c01..f39a4bc0a2 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -925,6 +925,8 @@ func dopanic_m(gp *g, pc, sp uintptr) bool { lock(&deadlock) } + printDebugLog() + return docrash } diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 0dd2e929a0..cfea1cd45f 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -468,6 +468,8 @@ type m struct { vdsoSP uintptr // SP for traceback while in VDSO call (0 if not in call) vdsoPC uintptr // PC for traceback while in VDSO call + dlogPerM + mOS } diff --git a/src/runtime/signal_sighandler.go b/src/runtime/signal_sighandler.go index 6e71e41f52..bec4653218 100644 --- a/src/runtime/signal_sighandler.go +++ b/src/runtime/signal_sighandler.go @@ -148,5 +148,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) { crash() } + printDebugLog() + exit(2) } -- GitLab From a8e83d2febe28a79e2906a9249ab2d79e0523c2a Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 4 Apr 2019 14:08:06 -0700 Subject: [PATCH 0701/1679] syscall: don't use INODE64 for fdopendir on darwin/386 The INODE64 variant only exists on 64-bit. Fixes #31262 Change-Id: I528277c9b3312fdb15463ccbea0d537ff300f4ae Reviewed-on: https://go-review.googlesource.com/c/go/+/170837 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/syscall/syscall_darwin_386.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/syscall/syscall_darwin_386.go b/src/syscall/syscall_darwin_386.go index e4908d1f9c..d39c65505c 100644 --- a/src/syscall/syscall_darwin_386.go +++ b/src/syscall/syscall_darwin_386.go @@ -70,7 +70,7 @@ func fdopendir(fd int) (dir uintptr, err error) { func libc_fdopendir_trampoline() //go:linkname libc_fdopendir libc_fdopendir -//go:cgo_import_dynamic libc_fdopendir fdopendir$INODE64 "/usr/lib/libSystem.B.dylib" +//go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib" // Implemented in the runtime package (runtime/sys_darwin_32.go) func syscall9(fn, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno) -- GitLab From ead895688def46f4c74c2a4c7ee560fc46663000 Mon Sep 17 00:00:00 2001 From: Filippo Valsorda Date: Thu, 4 Apr 2019 12:46:50 -0400 Subject: [PATCH 0702/1679] math/big: do not panic in Exp when y < 0 and x doesn't have an inverse If x does not have an inverse modulo m, and a negative exponent is used, return nil just like ModInverse does now. Change-Id: I8fa72f7a851e8cf77c5fab529ede88408740626f Reviewed-on: https://go-review.googlesource.com/c/go/+/170757 Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer --- src/math/big/int.go | 9 +++++++-- src/math/big/int_test.go | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/math/big/int.go b/src/math/big/int.go index afad1bc961..8e52f0ab27 100644 --- a/src/math/big/int.go +++ b/src/math/big/int.go @@ -463,7 +463,8 @@ func (x *Int) TrailingZeroBits() uint { } // Exp sets z = x**y mod |m| (i.e. the sign of m is ignored), and returns z. -// If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. +// If m == nil or m == 0, z = x**y unless y <= 0 then z = 1. If m > 0, y < 0, +// and x and n are not relatively prime, z is unchanged and nil is returned. // // Modular exponentation of inputs of a particular size is not a // cryptographically constant-time operation. @@ -475,7 +476,11 @@ func (z *Int) Exp(x, y, m *Int) *Int { return z.SetInt64(1) } // for y < 0: x**y mod m == (x**(-1))**|y| mod m - xWords = new(Int).ModInverse(x, m).abs + inverse := new(Int).ModInverse(x, m) + if inverse == nil { + return nil + } + xWords = inverse.abs } yWords := y.abs diff --git a/src/math/big/int_test.go b/src/math/big/int_test.go index 2435b3610c..ade973b207 100644 --- a/src/math/big/int_test.go +++ b/src/math/big/int_test.go @@ -533,6 +533,9 @@ var expTests = []struct { {"1", "0", "", "1"}, {"-10", "0", "", "1"}, {"1234", "-1", "", "1"}, + {"1234", "-1", "0", "1"}, + {"17", "-100", "1234", "865"}, + {"2", "-100", "1234", ""}, // m == 1 {"0", "0", "1", "0"}, @@ -605,10 +608,15 @@ func TestExp(t *testing.T) { for i, test := range expTests { x, ok1 := new(Int).SetString(test.x, 0) y, ok2 := new(Int).SetString(test.y, 0) - out, ok3 := new(Int).SetString(test.out, 0) - var ok4 bool - var m *Int + var ok3, ok4 bool + var out, m *Int + + if len(test.out) == 0 { + out, ok3 = nil, true + } else { + out, ok3 = new(Int).SetString(test.out, 0) + } if len(test.m) == 0 { m, ok4 = nil, true @@ -622,10 +630,10 @@ func TestExp(t *testing.T) { } z1 := new(Int).Exp(x, y, m) - if !isNormalized(z1) { + if z1 != nil && !isNormalized(z1) { t.Errorf("#%d: %v is not normalized", i, *z1) } - if z1.Cmp(out) != 0 { + if !(z1 == nil && out == nil || z1.Cmp(out) == 0) { t.Errorf("#%d: got %x want %x", i, z1, out) } -- GitLab From cebc4e514ae209dc00e171d70e10ef5bc17ba10d Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Wed, 9 Jan 2019 16:40:01 -0500 Subject: [PATCH 0703/1679] cmd/go: parallelize package loading load.PackageAndErrors now preloads data used to build load.Package structures. Multiple packages may be preloaded in parallel, so this parallelizes most of the package loading work. The actual package construction and error-checking process is still sequential, since this process needs to detect and report cycles. Fixes #29758 Change-Id: Icf37e6669836ce8aad076e34fd895f97f4f3f9e2 Reviewed-on: https://go-review.googlesource.com/c/go/+/161397 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 545 +++++++++++++++++++++---------- src/cmd/go/internal/load/test.go | 12 +- src/cmd/go/internal/par/work.go | 41 +++ 3 files changed, 416 insertions(+), 182 deletions(-) diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 6361862969..6d3a2972a1 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -7,6 +7,7 @@ package load import ( "bytes" + "errors" "fmt" "go/build" "go/token" @@ -14,6 +15,7 @@ import ( "os" pathpkg "path" "path/filepath" + "runtime" "sort" "strconv" "strings" @@ -23,6 +25,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" "cmd/go/internal/modinfo" + "cmd/go/internal/par" "cmd/go/internal/search" "cmd/go/internal/str" ) @@ -356,25 +359,40 @@ func (sp *ImportStack) shorterThan(t []string) bool { return false // they are equal } -// packageCache is a lookup cache for loadPackage, +// packageCache is a lookup cache for LoadImport, // so that if we look up a package multiple times // we return the same pointer each time. var packageCache = map[string]*Package{} +// ClearPackageCache clears the in-memory package cache and the preload caches. +// It is only for use by GOPATH-based "go get". +// TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function. func ClearPackageCache() { for name := range packageCache { delete(packageCache, name) } + resolvedImportCache.Clear() + packageDataCache.Clear() } +// ClearPackageCachePartial clears packages with the given import paths from the +// in-memory package cache and the preload caches. It is only for use by +// GOPATH-based "go get". +// TODO(jayconrod): When GOPATH-based "go get" is removed, delete this function. func ClearPackageCachePartial(args []string) { + shouldDelete := make(map[string]bool) for _, arg := range args { - p := packageCache[arg] - if p != nil { - delete(packageCache, p.Dir) - delete(packageCache, p.ImportPath) + shouldDelete[arg] = true + if p := packageCache[arg]; p != nil { + delete(packageCache, arg) } } + resolvedImportCache.DeleteIf(func(key interface{}) bool { + return shouldDelete[key.(importSpec).path] + }) + packageDataCache.DeleteIf(func(key interface{}) bool { + return shouldDelete[key.(string)] + }) } // ReloadPackageNoFlags is like LoadImport but makes sure @@ -384,8 +402,11 @@ func ClearPackageCachePartial(args []string) { func ReloadPackageNoFlags(arg string, stk *ImportStack) *Package { p := packageCache[arg] if p != nil { - delete(packageCache, p.Dir) - delete(packageCache, p.ImportPath) + delete(packageCache, arg) + resolvedImportCache.DeleteIf(func(key interface{}) bool { + return key.(importSpec).path == p.ImportPath + }) + packageDataCache.Delete(p.ImportPath) } return LoadImport(arg, base.Cwd, nil, stk, nil, 0) } @@ -440,6 +461,10 @@ const ( // this package, as part of a bigger load operation, and by GOPATH-based "go get". // TODO(rsc): When GOPATH-based "go get" is removed, unexport this function. func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { + return loadImport(nil, path, srcDir, parent, stk, importPos, mode) +} + +func loadImport(pre *preload, path, srcDir string, parent *Package, stk *ImportStack, importPos []token.Position, mode int) *Package { if path == "" { panic("LoadImport called with empty package path") } @@ -447,127 +472,51 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo stk.Push(path) defer stk.Pop() - if strings.HasPrefix(path, "mod/") { - // Paths beginning with "mod/" might accidentally - // look in the module cache directory tree in $GOPATH/pkg/mod/. - // This prefix is owned by the Go core for possible use in the - // standard library (since it does not begin with a domain name), - // so it's OK to disallow entirely. - return &Package{ - PackagePublic: PackagePublic{ - ImportPath: path, - Error: &PackageError{ - ImportStack: stk.Copy(), - Err: fmt.Sprintf("disallowed import path %q", path), - }, - }, - } + var parentPath, parentRoot string + parentIsStd := false + if parent != nil { + parentPath = parent.ImportPath + parentRoot = parent.Root + parentIsStd = parent.Standard } - - if strings.Contains(path, "@") { - var text string - if cfg.ModulesEnabled { - text = "can only use path@version syntax with 'go get'" - } else { - text = "cannot use path@version syntax in GOPATH mode" - } + bp, loaded, err := loadPackageData(path, parentPath, srcDir, parentRoot, parentIsStd, mode) + if loaded && pre != nil && !IgnoreImports { + pre.preloadImports(bp.Imports, bp) + } + if bp == nil { return &Package{ PackagePublic: PackagePublic{ ImportPath: path, Error: &PackageError{ ImportStack: stk.Copy(), - Err: text, + Err: err.Error(), }, }, } } - parentPath := "" - parentIsStd := false - if parent != nil { - parentPath = parent.ImportPath - parentIsStd = parent.Standard - } - - // Determine canonical identifier for this package. - // For a local import the identifier is the pseudo-import path - // we create from the full directory to the package. - // Otherwise it is the usual import path. - // For vendored imports, it is the expanded form. - importPath := path - origPath := path - isLocal := build.IsLocalImport(path) - var modDir string - var modErr error - if isLocal { - importPath = dirToImportPath(filepath.Join(srcDir, path)) - } else if cfg.ModulesEnabled { - var p string - modDir, p, modErr = ModLookup(parentPath, parentIsStd, path) - if modErr == nil { - importPath = p - } - } else if mode&ResolveImport != 0 { - // We do our own path resolution, because we want to - // find out the key to use in packageCache without the - // overhead of repeated calls to buildContext.Import. - // The code is also needed in a few other places anyway. - path = ResolveImportPath(parent, path) - importPath = path - } else if mode&ResolveModule != 0 { - path = ModuleImportPath(parent, path) - importPath = path - } - + importPath := bp.ImportPath p := packageCache[importPath] if p != nil { p = reusePackage(p, stk) } else { p = new(Package) - p.Internal.Local = isLocal + p.Internal.Local = build.IsLocalImport(path) p.ImportPath = importPath packageCache[importPath] = p // Load package. - // Import always returns bp != nil, even if an error occurs, + // loadPackageData may return bp != nil even if an error occurs, // in order to return partial information. - var bp *build.Package - var err error - if modDir != "" { - bp, err = cfg.BuildContext.ImportDir(modDir, 0) - } else if modErr != nil { - bp = new(build.Package) - err = fmt.Errorf("unknown import path %q: %v", importPath, modErr) - } else if cfg.ModulesEnabled && path != "unsafe" { - bp = new(build.Package) - err = fmt.Errorf("unknown import path %q: internal error: module loader did not resolve import", importPath) - } else { - buildMode := build.ImportComment - if mode&ResolveImport == 0 || path != origPath { - // Not vendoring, or we already found the vendored path. - buildMode |= build.IgnoreVendor - } - bp, err = cfg.BuildContext.Import(path, srcDir, buildMode) - } - bp.ImportPath = importPath - if cfg.GOBIN != "" { - bp.BinDir = cfg.GOBIN - } else if cfg.ModulesEnabled && !bp.Goroot { - bp.BinDir = ModBinDir() - } - if modDir == "" && err == nil && !isLocal && bp.ImportComment != "" && bp.ImportComment != path && - !strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") { - err = fmt.Errorf("code in directory %s expects import %q", bp.Dir, bp.ImportComment) - } p.load(stk, bp, err) if p.Error != nil && p.Error.Pos == "" { p = setErrorPos(p, importPos) } - if modDir == "" && origPath != cleanImport(origPath) { + if !cfg.ModulesEnabled && path != cleanImport(path) { p.Error = &PackageError{ ImportStack: stk.Copy(), - Err: fmt.Sprintf("non-canonical import path: %q should be %q", origPath, pathpkg.Clean(origPath)), + Err: fmt.Sprintf("non-canonical import path: %q should be %q", path, pathpkg.Clean(path)), } p.Incomplete = true } @@ -578,7 +527,7 @@ func LoadImport(path, srcDir string, parent *Package, stk *ImportStack, importPo return setErrorPos(perr, importPos) } if mode&ResolveImport != 0 { - if perr := disallowVendor(srcDir, parent, parentPath, origPath, p, stk); perr != p { + if perr := disallowVendor(srcDir, parent, parentPath, path, p, stk); perr != p { return setErrorPos(perr, importPos) } } @@ -613,6 +562,244 @@ func setErrorPos(p *Package, importPos []token.Position) *Package { return p } +// loadPackageData loads information needed to construct a *Package. The result +// is cached, and later calls to loadPackageData for the same package will return +// the same data. +// +// loadPackageData returns a non-nil package even if err is non-nil unless +// the package path is malformed (for example, the path contains "mod/" or "@"). +// +// loadPackageData returns a boolean, loaded, which is true if this is the +// first time the package was loaded. Callers may preload imports in this case. +func loadPackageData(path, parentPath, parentDir, parentRoot string, parentIsStd bool, mode int) (bp *build.Package, loaded bool, err error) { + if path == "" { + panic("loadPackageData called with empty package path") + } + + if strings.HasPrefix(path, "mod/") { + // Paths beginning with "mod/" might accidentally + // look in the module cache directory tree in $GOPATH/pkg/mod/. + // This prefix is owned by the Go core for possible use in the + // standard library (since it does not begin with a domain name), + // so it's OK to disallow entirely. + return nil, false, fmt.Errorf("disallowed import path %q", path) + } + + if strings.Contains(path, "@") { + if cfg.ModulesEnabled { + return nil, false, errors.New("can only use path@version syntax with 'go get'") + } else { + return nil, false, errors.New("cannot use path@version syntax in GOPATH mode") + } + } + + // Determine canonical package path and directory. + // For a local import the identifier is the pseudo-import path + // we create from the full directory to the package. + // Otherwise it is the usual import path. + // For vendored imports, it is the expanded form. + importKey := importSpec{ + path: path, + parentPath: parentPath, + parentDir: parentDir, + parentRoot: parentRoot, + parentIsStd: parentIsStd, + mode: mode, + } + r := resolvedImportCache.Do(importKey, func() interface{} { + var r resolvedImport + if build.IsLocalImport(path) { + r.dir = filepath.Join(parentDir, path) + r.path = dirToImportPath(r.dir) + } else if cfg.ModulesEnabled { + r.dir, r.path, r.err = ModLookup(parentPath, parentIsStd, path) + } else if mode&ResolveImport != 0 { + // We do our own path resolution, because we want to + // find out the key to use in packageCache without the + // overhead of repeated calls to buildContext.Import. + // The code is also needed in a few other places anyway. + r.path = resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd) + } else if mode&ResolveModule != 0 { + r.path = moduleImportPath(path, parentPath, parentDir, parentRoot) + } + if r.path == "" { + r.path = path + } + return r + }).(resolvedImport) + // Invariant: r.path is set to the resolved import path. If the path cannot + // be resolved, r.path is set to path, the source import path. + // r.path is never empty. + + // Load the package from its directory. If we already found the package's + // directory when resolving its import path, use that. + data := packageDataCache.Do(r.path, func() interface{} { + loaded = true + var data packageData + if r.dir != "" { + var buildMode build.ImportMode + if !cfg.ModulesEnabled { + buildMode = build.ImportComment + } + data.p, data.err = cfg.BuildContext.ImportDir(r.dir, buildMode) + } else if r.err != nil { + data.p = new(build.Package) + data.err = fmt.Errorf("unknown import path %q: %v", r.path, r.err) + } else if cfg.ModulesEnabled && path != "unsafe" { + data.p = new(build.Package) + data.err = fmt.Errorf("unknown import path %q: internal error: module loader did not resolve import", r.path) + } else { + buildMode := build.ImportComment + if mode&ResolveImport == 0 || r.path != path { + // Not vendoring, or we already found the vendored path. + buildMode |= build.IgnoreVendor + } + data.p, data.err = cfg.BuildContext.Import(r.path, parentDir, buildMode) + } + data.p.ImportPath = r.path + if cfg.GOBIN != "" { + data.p.BinDir = cfg.GOBIN + } else if cfg.ModulesEnabled && !data.p.Goroot { + data.p.BinDir = ModBinDir() + } + if !cfg.ModulesEnabled && data.err == nil && + data.p.ImportComment != "" && data.p.ImportComment != path && + !strings.Contains(path, "/vendor/") && !strings.HasPrefix(path, "vendor/") { + data.err = fmt.Errorf("code in directory %s expects import %q", data.p.Dir, data.p.ImportComment) + } + return data + }).(packageData) + + return data.p, loaded, data.err +} + +// importSpec describes an import declaration in source code. It is used as a +// cache key for resolvedImportCache. +type importSpec struct { + path string + parentPath, parentDir, parentRoot string + parentIsStd bool + mode int +} + +// resolvedImport holds a canonical identifier for a package. It may also contain +// a path to the package's directory and an error if one occurred. resolvedImport +// is the value type in resolvedImportCache. +type resolvedImport struct { + path, dir string + err error +} + +// packageData holds information loaded from a package. It is the value type +// in packageDataCache. +type packageData struct { + p *build.Package + err error +} + +// resolvedImportCache maps import strings (importSpec) to canonical package names +// (resolvedImport). +var resolvedImportCache par.Cache + +// packageDataCache maps canonical package names (string) to package metadata +// (packageData). +var packageDataCache par.Cache + +// preloadWorkerCount is the number of concurrent goroutines that can load +// packages. Experimentally, there are diminishing returns with more than +// 4 workers. This was measured on the following machines. +// +// * MacBookPro with a 4-core Intel Core i7 CPU +// * Linux workstation with 6-core Intel Xeon CPU +// * Linux workstation with 24-core Intel Xeon CPU +// +// It is very likely (though not confirmed) that this workload is limited +// by memory bandwidth. We don't have a good way to determine the number of +// workers that would saturate the bus though, so runtime.GOMAXPROCS +// seems like a reasonable default. +var preloadWorkerCount = runtime.GOMAXPROCS(0) + +// preload holds state for managing concurrent preloading of package data. +// +// A preload should be created with newPreload before loading a large +// package graph. flush must be called when package loading is complete +// to ensure preload goroutines are no longer active. This is necessary +// because of global mutable state that cannot safely be read and written +// concurrently. In particular, packageDataCache may be cleared by "go get" +// in GOPATH mode, and modload.loaded (accessed via ModLookup) may be +// modified by modload.ImportPaths (ModImportPaths). +type preload struct { + cancel chan struct{} + sema chan struct{} +} + +// newPreload creates a new preloader. flush must be called later to avoid +// accessing global state while it is being modified. +func newPreload() *preload { + pre := &preload{ + cancel: make(chan struct{}), + sema: make(chan struct{}, preloadWorkerCount), + } + return pre +} + +// preloadMatches loads data for package paths matched by patterns. +// When preloadMatches returns, some packages may not be loaded yet, but +// loadPackageData and loadImport are always safe to call. +func (pre *preload) preloadMatches(matches []*search.Match) { + for _, m := range matches { + for _, pkg := range m.Pkgs { + select { + case <-pre.cancel: + return + case pre.sema <- struct{}{}: + go func(pkg string) { + mode := 0 // don't use vendoring or module import resolution + bp, loaded, err := loadPackageData(pkg, "", base.Cwd, "", false, mode) + <-pre.sema + if bp != nil && loaded && err == nil && !IgnoreImports { + pre.preloadImports(bp.Imports, bp) + } + }(pkg) + } + } + } +} + +// preloadImports queues a list of imports for preloading. +// When preloadImports returns, some packages may not be loaded yet, +// but loadPackageData and loadImport are always safe to call. +func (pre *preload) preloadImports(imports []string, parent *build.Package) { + parentIsStd := parent.Goroot && parent.ImportPath != "" && search.IsStandardImportPath(parent.ImportPath) + for _, path := range imports { + if path == "C" || path == "unsafe" { + continue + } + select { + case <-pre.cancel: + return + case pre.sema <- struct{}{}: + go func(path string) { + bp, loaded, err := loadPackageData(path, parent.ImportPath, parent.Dir, parent.Root, parentIsStd, ResolveImport) + <-pre.sema + if bp != nil && loaded && err == nil && !IgnoreImports { + pre.preloadImports(bp.Imports, bp) + } + }(path) + } + } +} + +// flush stops pending preload operations. flush blocks until preload calls to +// loadPackageData have completed. The preloader will not make any new calls +// to loadPackageData. +func (pre *preload) flush() { + close(pre.cancel) + for i := 0; i < preloadWorkerCount; i++ { + pre.sema <- struct{}{} + } +} + func cleanImport(path string) string { orig := path path = pathpkg.Clean(path) @@ -622,18 +809,13 @@ func cleanImport(path string) string { return path } -var isDirCache = map[string]bool{} +var isDirCache par.Cache func isDir(path string) bool { - result, ok := isDirCache[path] - if ok { - return result - } - - fi, err := os.Stat(path) - result = err == nil && fi.IsDir() - isDirCache[path] = result - return result + return isDirCache.Do(path, func() interface{} { + fi, err := os.Stat(path) + return err == nil && fi.IsDir() + }).(bool) } // ResolveImportPath returns the true meaning of path when it appears in parent. @@ -642,37 +824,44 @@ func isDir(path string) bool { // If vendor expansion doesn't trigger, then the path is also subject to // Go 1.11 module legacy conversion (golang.org/issue/25069). func ResolveImportPath(parent *Package, path string) (found string) { + var parentPath, parentDir, parentRoot string + parentIsStd := false + if parent != nil { + parentPath = parent.ImportPath + parentDir = parent.Dir + parentRoot = parent.Root + parentIsStd = parent.Standard + } + return resolveImportPath(path, parentPath, parentDir, parentRoot, parentIsStd) +} + +func resolveImportPath(path, parentPath, parentDir, parentRoot string, parentIsStd bool) (found string) { if cfg.ModulesEnabled { - parentPath := "" - parentIsStd := false - if parent != nil { - parentPath = parent.ImportPath - parentIsStd = parent.Standard - } if _, p, e := ModLookup(parentPath, parentIsStd, path); e == nil { return p } return path } - found = VendoredImportPath(parent, path) + found = vendoredImportPath(path, parentPath, parentDir, parentRoot) if found != path { return found } - return ModuleImportPath(parent, path) + return moduleImportPath(path, parentPath, parentDir, parentRoot) } // dirAndRoot returns the source directory and workspace root // for the package p, guaranteeing that root is a path prefix of dir. -func dirAndRoot(p *Package) (dir, root string) { - dir = filepath.Clean(p.Dir) - root = filepath.Join(p.Root, "src") - if !str.HasFilePathPrefix(dir, root) || p.ImportPath != "command-line-arguments" && filepath.Join(root, p.ImportPath) != dir { +func dirAndRoot(path string, dir, root string) (string, string) { + origDir, origRoot := dir, root + dir = filepath.Clean(dir) + root = filepath.Join(root, "src") + if !str.HasFilePathPrefix(dir, root) || path != "command-line-arguments" && filepath.Join(root, path) != dir { // Look for symlinks before reporting error. dir = expandPath(dir) root = expandPath(root) } - if !str.HasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || p.ImportPath != "command-line-arguments" && !p.Internal.Local && filepath.Join(root, p.ImportPath) != dir { + if !str.HasFilePathPrefix(dir, root) || len(dir) <= len(root) || dir[len(root)] != filepath.Separator || path != "command-line-arguments" && !build.IsLocalImport(path) && filepath.Join(root, path) != dir { base.Fatalf("unexpected directory layout:\n"+ " import path: %s\n"+ " root: %s\n"+ @@ -680,27 +869,27 @@ func dirAndRoot(p *Package) (dir, root string) { " expand root: %s\n"+ " expand dir: %s\n"+ " separator: %s", - p.ImportPath, - filepath.Join(p.Root, "src"), - filepath.Clean(p.Dir), - root, - dir, + path, + filepath.Join(origRoot, "src"), + filepath.Clean(origDir), + origRoot, + origDir, string(filepath.Separator)) } return dir, root } -// VendoredImportPath returns the vendor-expansion of path when it appears in parent. +// vendoredImportPath returns the vendor-expansion of path when it appears in parent. // If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path, // x/vendor/path, vendor/path, or else stay path if none of those exist. -// VendoredImportPath returns the expanded path or, if no expansion is found, the original. -func VendoredImportPath(parent *Package, path string) (found string) { - if parent == nil || parent.Root == "" { +// vendoredImportPath returns the expanded path or, if no expansion is found, the original. +func vendoredImportPath(path, parentPath, parentDir, parentRoot string) (found string) { + if parentRoot == "" { return path } - dir, root := dirAndRoot(parent) + dir, root := dirAndRoot(parentPath, parentDir, parentRoot) vpath := "vendor/" + path for i := len(dir); i >= len(root); i-- { @@ -716,7 +905,7 @@ func VendoredImportPath(parent *Package, path string) (found string) { } targ := filepath.Join(dir[:i], vpath) if isDir(targ) && hasGoFiles(targ) { - importPath := parent.ImportPath + importPath := parentPath if importPath == "command-line-arguments" { // If parent.ImportPath is 'command-line-arguments'. // set to relative directory to root (also chopped root directory) @@ -746,54 +935,48 @@ func VendoredImportPath(parent *Package, path string) (found string) { var ( modulePrefix = []byte("\nmodule ") - goModPathCache = make(map[string]string) + goModPathCache par.Cache ) // goModPath returns the module path in the go.mod in dir, if any. func goModPath(dir string) (path string) { - path, ok := goModPathCache[dir] - if ok { - return path - } - defer func() { - goModPathCache[dir] = path - }() - - data, err := ioutil.ReadFile(filepath.Join(dir, "go.mod")) - if err != nil { - return "" - } - var i int - if bytes.HasPrefix(data, modulePrefix[1:]) { - i = 0 - } else { - i = bytes.Index(data, modulePrefix) - if i < 0 { + return goModPathCache.Do(dir, func() interface{} { + data, err := ioutil.ReadFile(filepath.Join(dir, "go.mod")) + if err != nil { return "" } - i++ - } - line := data[i:] + var i int + if bytes.HasPrefix(data, modulePrefix[1:]) { + i = 0 + } else { + i = bytes.Index(data, modulePrefix) + if i < 0 { + return "" + } + i++ + } + line := data[i:] - // Cut line at \n, drop trailing \r if present. - if j := bytes.IndexByte(line, '\n'); j >= 0 { - line = line[:j] - } - if line[len(line)-1] == '\r' { - line = line[:len(line)-1] - } - line = line[len("module "):] + // Cut line at \n, drop trailing \r if present. + if j := bytes.IndexByte(line, '\n'); j >= 0 { + line = line[:j] + } + if line[len(line)-1] == '\r' { + line = line[:len(line)-1] + } + line = line[len("module "):] - // If quoted, unquote. - path = strings.TrimSpace(string(line)) - if path != "" && path[0] == '"' { - s, err := strconv.Unquote(path) - if err != nil { - return "" + // If quoted, unquote. + path = strings.TrimSpace(string(line)) + if path != "" && path[0] == '"' { + s, err := strconv.Unquote(path) + if err != nil { + return "" + } + path = s } - path = s - } - return path + return path + }).(string) } // findVersionElement returns the slice indices of the final version element /vN in path. @@ -825,7 +1008,7 @@ func isVersionElement(s string) bool { return true } -// ModuleImportPath translates import paths found in go modules +// moduleImportPath translates import paths found in go modules // back down to paths that can be resolved in ordinary builds. // // Define “new” code as code with a go.mod file in the same directory @@ -833,8 +1016,8 @@ func isVersionElement(s string) bool { // x/y/v2/z does not exist and x/y/go.mod says “module x/y/v2”, // then go build will read the import as x/y/z instead. // See golang.org/issue/25069. -func ModuleImportPath(parent *Package, path string) (found string) { - if parent == nil || parent.Root == "" { +func moduleImportPath(path, parentPath, parentDir, parentRoot string) (found string) { + if parentRoot == "" { return path } @@ -846,7 +1029,7 @@ func ModuleImportPath(parent *Package, path string) (found string) { return path } - dir, root := dirAndRoot(parent) + dir, root := dirAndRoot(parentPath, parentDir, parentRoot) // Consider dir and parents, up to and including root. for i := len(dir); i >= len(root); i-- { @@ -1763,12 +1946,16 @@ func PackagesAndErrors(patterns []string) []*Package { seenPkg = make(map[*Package]bool) ) + pre := newPreload() + defer pre.flush() + pre.preloadMatches(matches) + for _, m := range matches { for _, pkg := range m.Pkgs { if pkg == "" { panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern)) } - p := LoadImport(pkg, base.Cwd, nil, &stk, nil, 0) + p := loadImport(pre, pkg, base.Cwd, nil, &stk, nil, 0) p.Match = append(p.Match, m.Pattern) p.Internal.CmdlinePkg = true if m.Literal { diff --git a/src/cmd/go/internal/load/test.go b/src/cmd/go/internal/load/test.go index c8e0b3f5f6..1385c47eab 100644 --- a/src/cmd/go/internal/load/test.go +++ b/src/cmd/go/internal/load/test.go @@ -91,13 +91,19 @@ func TestPackagesFor(p *Package, cover *TestCover) (pmain, ptest, pxtest *Packag // The caller is expected to have checked that len(p.TestGoFiles)+len(p.XTestGoFiles) > 0, // or else there's no point in any of this. func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest *Package) { + pre := newPreload() + defer pre.flush() + allImports := append([]string{}, p.TestImports...) + allImports = append(allImports, p.XTestImports...) + pre.preloadImports(allImports, p.Internal.Build) + var ptestErr, pxtestErr *PackageError var imports, ximports []*Package var stk ImportStack stk.Push(p.ImportPath + " (test)") rawTestImports := str.StringList(p.TestImports) for i, path := range p.TestImports { - p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) + p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.TestImportPos[path], ResolveImport) if str.Contains(p1.Deps, p.ImportPath) || p1.ImportPath == p.ImportPath { // Same error that loadPackage returns (via reusePackage) in pkg.go. // Can't change that code, because that code is only for loading the @@ -116,7 +122,7 @@ func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest * pxtestNeedsPtest := false rawXTestImports := str.StringList(p.XTestImports) for i, path := range p.XTestImports { - p1 := LoadImport(path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) + p1 := loadImport(pre, path, p.Dir, p, &stk, p.Internal.Build.XTestImportPos[path], ResolveImport) if p1.ImportPath == p.ImportPath { pxtestNeedsPtest = true } else { @@ -232,7 +238,7 @@ func TestPackagesAndErrors(p *Package, cover *TestCover) (pmain, ptest, pxtest * if dep == ptest.ImportPath { pmain.Internal.Imports = append(pmain.Internal.Imports, ptest) } else { - p1 := LoadImport(dep, "", nil, &stk, nil, 0) + p1 := loadImport(pre, dep, "", nil, &stk, nil, 0) pmain.Internal.Imports = append(pmain.Internal.Imports, p1) } } diff --git a/src/cmd/go/internal/par/work.go b/src/cmd/go/internal/par/work.go index a568c86f60..960cec6fb1 100644 --- a/src/cmd/go/internal/par/work.go +++ b/src/cmd/go/internal/par/work.go @@ -147,3 +147,44 @@ func (c *Cache) Get(key interface{}) interface{} { } return e.result } + +// Clear removes all entries in the cache. +// +// Concurrent calls to Get may return old values. Concurrent calls to Do +// may return old values or store results in entries that have been deleted. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache) Clear() { + c.m.Range(func(key, value interface{}) bool { + c.m.Delete(key) + return true + }) +} + +// Delete removes an entry from the map. It is safe to call Delete for an +// entry that does not exist. Delete will return quickly, even if the result +// for a key is still being computed; the computation will finish, but the +// result won't be accessible through the cache. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache) Delete(key interface{}) { + c.m.Delete(key) +} + +// DeleteIf calls pred for each key in the map. If pred returns true for a key, +// DeleteIf removes the corresponding entry. If the result for a key is +// still being computed, DeleteIf will remove the entry without waiting for +// the computation to finish. The result won't be accessible through the cache. +// +// TODO(jayconrod): Delete this after the package cache clearing functions +// in internal/load have been removed. +func (c *Cache) DeleteIf(pred func(key interface{}) bool) { + c.m.Range(func(key, _ interface{}) bool { + if pred(key) { + c.Delete(key) + } + return true + }) +} -- GitLab From f947c4dcfe6f22e6c92e6e5a170096b518a18448 Mon Sep 17 00:00:00 2001 From: Darren Grant Date: Thu, 14 Mar 2019 16:33:35 -0400 Subject: [PATCH 0704/1679] builtin: spec correction for panic() Upon unrecovered panic and program termination, process exit code is hard-coded to 2, not set to the parameter passed to panic(). Change-Id: If64b75493227b4fd69c0bbb529f84e6df2d1b93f Reviewed-on: https://go-review.googlesource.com/c/go/+/167709 Reviewed-by: Robert Griesemer --- src/builtin/builtin.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/builtin/builtin.go b/src/builtin/builtin.go index 61ed6100b4..01190e9900 100644 --- a/src/builtin/builtin.go +++ b/src/builtin/builtin.go @@ -226,10 +226,9 @@ func close(c chan<- Type) // invocation of F then behaves like a call to panic, terminating G's // execution and running any deferred functions. This continues until all // functions in the executing goroutine have stopped, in reverse order. At -// that point, the program is terminated and the error condition is reported, -// including the value of the argument to panic. This termination sequence -// is called panicking and can be controlled by the built-in function -// recover. +// that point, the program is terminated with a non-zero exit code. This +// termination sequence is called panicking and can be controlled by the +// built-in function recover. func panic(v interface{}) // The recover built-in function allows a program to manage behavior of a -- GitLab From cea44714fb4e79b939e5b781ee61e97b3d7e1c14 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 5 Apr 2019 10:05:57 -0400 Subject: [PATCH 0705/1679] runtime: fix typo in debuglog comment Change-Id: I8a40461b93eab034ed930e0c5e32391f84cdbc5a Reviewed-on: https://go-review.googlesource.com/c/go/+/170799 Reviewed-by: Ian Lance Taylor Reviewed-by: Sebastien Binet --- src/runtime/debuglog.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/debuglog.go b/src/runtime/debuglog.go index 3f8481270a..100f2d370a 100644 --- a/src/runtime/debuglog.go +++ b/src/runtime/debuglog.go @@ -25,7 +25,7 @@ import ( // heap size. const debugLogBytes = 16 << 10 -// debugLogStringLimit the the maximum number of bytes in a string. +// debugLogStringLimit is the maximum number of bytes in a string. // Above this, the string will be truncated with "..(n more bytes).." const debugLogStringLimit = debugLogBytes / 8 -- GitLab From db0c524211d82af1f632b78c80d22d734c8b1be2 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 5 Apr 2019 17:10:40 +0200 Subject: [PATCH 0706/1679] syscall: allow empty string argument to SetsockoptString Don't panic with "index out of range" on empty string argument. Fixes golang/go#31277 Change-Id: I005f9523caec76337cb2ec87272a6be4736bce18 Reviewed-on: https://go-review.googlesource.com/c/go/+/170937 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/syscall_unix.go | 6 +++++- src/syscall/syscall_unix_test.go | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/syscall/syscall_unix.go b/src/syscall/syscall_unix.go index fd54dc0dc7..f73f55462a 100644 --- a/src/syscall/syscall_unix.go +++ b/src/syscall/syscall_unix.go @@ -323,7 +323,11 @@ func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { } func SetsockoptString(fd, level, opt int, s string) (err error) { - return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) + var p unsafe.Pointer + if len(s) > 0 { + p = unsafe.Pointer(&[]byte(s)[0]) + } + return setsockopt(fd, level, opt, p, uintptr(len(s))) } func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { diff --git a/src/syscall/syscall_unix_test.go b/src/syscall/syscall_unix_test.go index 085afb2941..1a2c41dacd 100644 --- a/src/syscall/syscall_unix_test.go +++ b/src/syscall/syscall_unix_test.go @@ -355,3 +355,11 @@ func TestSeekFailure(t *testing.T) { t.Fatalf("Seek(-1, 0, 0) return error with empty message") } } + +func TestSetsockoptString(t *testing.T) { + // should not panic on empty string, see issue #31277 + err := syscall.SetsockoptString(-1, 0, 0, "") + if err == nil { + t.Fatalf("SetsockoptString: did not fail") + } +} -- GitLab From c7a4099b9926b466b55c7271868d9dfb0271117e Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 5 Apr 2019 09:03:46 -0700 Subject: [PATCH 0707/1679] syscall: dup the argument to fdopendir fdopendir takes ownership of its file descriptor argument. Getdirentries shouldn't do that, so dup the file descriptor before passing to fdopendir. Fixes #31269 Change-Id: Ie36be8fd6c59eb339dcc9f40228d4191fc1e5850 Reviewed-on: https://go-review.googlesource.com/c/go/+/170698 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/syscall/syscall_darwin.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/syscall/syscall_darwin.go b/src/syscall/syscall_darwin.go index 59669a473d..7ceceff2c1 100644 --- a/src/syscall/syscall_darwin.go +++ b/src/syscall/syscall_darwin.go @@ -368,10 +368,15 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // Simulate Getdirentries using fdopendir/readdir_r/closedir. const ptrSize = unsafe.Sizeof(uintptr(0)) - d, err := fdopendir(fd) + fd2, err := Dup(fd) if err != nil { return 0, err } + d, err := fdopendir(fd2) + if err != nil { + Close(fd2) + return 0, err + } defer closedir(d) // We keep the number of records already returned in *basep. // It's not the full required semantics, but should handle the case -- GitLab From d47da9497f7e17aab1d4b3169604f62b491a9dd1 Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Fri, 5 Apr 2019 10:23:15 -0700 Subject: [PATCH 0708/1679] database/sql: add NullTime This matches NullBool, NullFloat64, and NullInt64. Fixes #30305 Change-Id: I79bfcf04a3d43b965d2a3159b0ac22f3e8084a53 Reviewed-on: https://go-review.googlesource.com/c/go/+/170699 Run-TryBot: Daniel Theophanes TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/database/sql/fakedb_test.go | 4 +++- src/database/sql/sql.go | 26 ++++++++++++++++++++++++++ src/database/sql/sql_test.go | 15 +++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/database/sql/fakedb_test.go b/src/database/sql/fakedb_test.go index dcdd264baa..f30edc00ea 100644 --- a/src/database/sql/fakedb_test.go +++ b/src/database/sql/fakedb_test.go @@ -1158,7 +1158,9 @@ func converterForType(typ string) driver.ValueConverter { // TODO(coopernurse): add type-specific converter return driver.Null{Converter: driver.DefaultParameterConverter} case "datetime": - return driver.DefaultParameterConverter + return driver.NotNull{Converter: driver.DefaultParameterConverter} + case "nulldatetime": + return driver.Null{Converter: driver.DefaultParameterConverter} case "any": return anyTypeConverter{} } diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index 8cdc903c68..3b3ac27436 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -286,6 +286,32 @@ func (n NullBool) Value() (driver.Value, error) { return n.Bool, nil } +// NullTime represents a time.Time that may be null. +// NullTime implements the Scanner interface so +// it can be used as a scan destination, similar to NullString. +type NullTime struct { + Time time.Time + Valid bool // Valid is true if Time is not NULL +} + +// Scan implements the Scanner interface. +func (n *NullTime) Scan(value interface{}) error { + if value == nil { + n.Time, n.Valid = time.Time{}, false + return nil + } + n.Valid = true + return convertAssign(&n.Time, value) +} + +// Value implements the driver Valuer interface. +func (n NullTime) Value() (driver.Value, error) { + if !n.Valid { + return nil, nil + } + return n.Time, nil +} + // Scanner is an interface used by Scan. type Scanner interface { // Scan assigns a value from a database driver. diff --git a/src/database/sql/sql_test.go b/src/database/sql/sql_test.go index 64b9dfea5c..c07c5d3bd2 100644 --- a/src/database/sql/sql_test.go +++ b/src/database/sql/sql_test.go @@ -1695,6 +1695,21 @@ func TestNullBoolParam(t *testing.T) { nullTestRun(t, spec) } +func TestNullTimeParam(t *testing.T) { + t0 := time.Time{} + t1 := time.Date(2000, 1, 1, 8, 9, 10, 11, time.UTC) + t2 := time.Date(2010, 1, 1, 8, 9, 10, 11, time.UTC) + spec := nullTestSpec{"nulldatetime", "datetime", [6]nullTestRow{ + {NullTime{t1, true}, t2, NullTime{t1, true}}, + {NullTime{t1, false}, t2, NullTime{t0, false}}, + {t1, t2, NullTime{t1, true}}, + {NullTime{t1, true}, t2, NullTime{t1, true}}, + {NullTime{t1, false}, t2, NullTime{t0, false}}, + {t2, NullTime{t1, false}, nil}, + }} + nullTestRun(t, spec) +} + func nullTestRun(t *testing.T, spec nullTestSpec) { db := newTestDB(t, "") defer closeDB(t, db) -- GitLab From 5ec938cdcf7ab59f6d397cb3fa4d17459057ef61 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Fri, 5 Apr 2019 14:29:16 -0400 Subject: [PATCH 0709/1679] doc: document Go 1.12.2 Change-Id: I990c451ff24844b39dee2477cec4caa9db2e8ebb Reviewed-on: https://go-review.googlesource.com/c/go/+/170883 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index c7dde6ff4d..1cbb6133f4 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -40,6 +40,14 @@ packages. See the Go +1.12.2 milestone on our issue tracker for details. +

    +

    go1.11 (released 2018/08/24)

    -- GitLab From e47ced78578c471cbcd34a7d6b223a71e84a46c8 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Fri, 5 Apr 2019 14:31:54 -0400 Subject: [PATCH 0710/1679] doc: document Go 1.11.7 Change-Id: Iec5e69b3ea163f42234d3b73696427a7aa8732e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/170884 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index 1cbb6133f4..a978ddccd5 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -106,6 +106,13 @@ runtime, go command, and the crypto/x509, encoding/json on our issue tracker for details.

    +

    +go1.11.7 (released 2019/04/05) includes fixes to the runtime and the +net packages. See the +Go +1.11.7 milestone on our issue tracker for details. +

    +

    go1.10 (released 2018/02/16)

    -- GitLab From 2b605670020fc637e20a609b1dc86c1f0e7afdd1 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 1 Mar 2019 13:16:37 -0500 Subject: [PATCH 0711/1679] sync: internal fixed size lock-free queue for sync.Pool This is the first step toward fixing multiple issues with sync.Pool. This adds a fixed size, lock-free, single-producer, multi-consumer queue that will be used in the new Pool stealing implementation. For #22950, #22331. Change-Id: I50e85e3cb83a2ee71f611ada88e7f55996504bb5 Reviewed-on: https://go-review.googlesource.com/c/go/+/166957 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/sync/export_test.go | 25 ++++++ src/sync/pool_test.go | 73 ++++++++++++++++ src/sync/poolqueue.go | 185 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 src/sync/poolqueue.go diff --git a/src/sync/export_test.go b/src/sync/export_test.go index 669076efad..0252b64f58 100644 --- a/src/sync/export_test.go +++ b/src/sync/export_test.go @@ -9,3 +9,28 @@ var Runtime_Semacquire = runtime_Semacquire var Runtime_Semrelease = runtime_Semrelease var Runtime_procPin = runtime_procPin var Runtime_procUnpin = runtime_procUnpin + +// poolDequeue testing. +type PoolDequeue interface { + PushHead(val interface{}) bool + PopHead() (interface{}, bool) + PopTail() (interface{}, bool) +} + +func NewPoolDequeue(n int) PoolDequeue { + return &poolDequeue{ + vals: make([]eface, n), + } +} + +func (d *poolDequeue) PushHead(val interface{}) bool { + return d.pushHead(val) +} + +func (d *poolDequeue) PopHead() (interface{}, bool) { + return d.popHead() +} + +func (d *poolDequeue) PopTail() (interface{}, bool) { + return d.popTail() +} diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 9e5132bb18..6e9f9f3463 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -150,6 +150,79 @@ func TestPoolStress(t *testing.T) { } } +func TestPoolDequeue(t *testing.T) { + const P = 10 + // In long mode, do enough pushes to wrap around the 21-bit + // indexes. + N := 1<<21 + 1000 + if testing.Short() { + N = 1e3 + } + d := NewPoolDequeue(16) + have := make([]int32, N) + var stop int32 + var wg WaitGroup + + // Start P-1 consumers. + for i := 1; i < P; i++ { + wg.Add(1) + go func() { + fail := 0 + for atomic.LoadInt32(&stop) == 0 { + val, ok := d.PopTail() + if ok { + fail = 0 + atomic.AddInt32(&have[val.(int)], 1) + if val.(int) == N-1 { + atomic.StoreInt32(&stop, 1) + } + } else { + // Speed up the test by + // allowing the pusher to run. + if fail++; fail%100 == 0 { + runtime.Gosched() + } + } + } + wg.Done() + }() + } + + // Start 1 producer. + nPopHead := 0 + wg.Add(1) + go func() { + for j := 0; j < N; j++ { + for !d.PushHead(j) { + // Allow a popper to run. + runtime.Gosched() + } + if j%10 == 0 { + val, ok := d.PopHead() + if ok { + nPopHead++ + atomic.AddInt32(&have[val.(int)], 1) + } + } + } + wg.Done() + }() + wg.Wait() + + // Check results. + for i, count := range have { + if count != 1 { + t.Errorf("expected have[%d] = 1, got %d", i, count) + } + } + if nPopHead == 0 { + // In theory it's possible in a valid schedule for + // popHead to never succeed, but in practice it almost + // always succeeds, so this is unlikely to flake. + t.Errorf("popHead never succeeded") + } +} + func BenchmarkPool(b *testing.B) { var p Pool b.RunParallel(func(pb *testing.PB) { diff --git a/src/sync/poolqueue.go b/src/sync/poolqueue.go new file mode 100644 index 0000000000..bc2ab647ff --- /dev/null +++ b/src/sync/poolqueue.go @@ -0,0 +1,185 @@ +// Copyright 2019 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 sync + +import ( + "sync/atomic" + "unsafe" +) + +// poolDequeue is a lock-free fixed-size single-producer, +// multi-consumer queue. The single producer can both push and pop +// from the head, and consumers can pop from the tail. +// +// It has the added feature that it nils out unused slots to avoid +// unnecessary retention of objects. This is important for sync.Pool, +// but not typically a property considered in the literature. +type poolDequeue struct { + // headTail packs together a 32-bit head index and a 32-bit + // tail index. Both are indexes into vals modulo len(vals)-1. + // + // tail = index of oldest data in queue + // head = index of next slot to fill + // + // Slots in the range [tail, head) are owned by consumers. + // A consumer continues to own a slot outside this range until + // it nils the slot, at which point ownership passes to the + // producer. + // + // The head index is stored in the most-significant bits so + // that we can atomically add to it and the overflow is + // harmless. + headTail uint64 + + // vals is a ring buffer of interface{} values stored in this + // dequeue. The size of this must be a power of 2. + // + // vals[i].typ is nil if the slot is empty and non-nil + // otherwise. A slot is still in use until *both* the tail + // index has moved beyond it and typ has been set to nil. This + // is set to nil atomically by the consumer and read + // atomically by the producer. + vals []eface +} + +type eface struct { + typ, val unsafe.Pointer +} + +const dequeueBits = 32 + +// dequeueLimit is the maximum size of a poolDequeue. +// +// This is half of 1<> dequeueBits) & mask) + tail = uint32(ptrs & mask) + return +} + +func (d *poolDequeue) pack(head, tail uint32) uint64 { + const mask = 1< Date: Fri, 1 Mar 2019 14:54:00 -0500 Subject: [PATCH 0712/1679] sync: internal dynamically sized lock-free queue for sync.Pool This adds a dynamically sized, lock-free, single-producer, multi-consumer queue that will be used in the new Pool stealing implementation. It's built on top of the fixed-size queue added in the previous CL. For #22950, #22331. Change-Id: Ifc0ca3895bec7e7f9289ba9fb7dd0332bf96ba5a Reviewed-on: https://go-review.googlesource.com/c/go/+/166958 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/sync/export_test.go | 17 ++++++ src/sync/pool_test.go | 9 ++- src/sync/poolqueue.go | 132 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 153 insertions(+), 5 deletions(-) diff --git a/src/sync/export_test.go b/src/sync/export_test.go index 0252b64f58..10d3599f47 100644 --- a/src/sync/export_test.go +++ b/src/sync/export_test.go @@ -34,3 +34,20 @@ func (d *poolDequeue) PopHead() (interface{}, bool) { func (d *poolDequeue) PopTail() (interface{}, bool) { return d.popTail() } + +func NewPoolChain() PoolDequeue { + return new(poolChain) +} + +func (c *poolChain) PushHead(val interface{}) bool { + c.pushHead(val) + return true +} + +func (c *poolChain) PopHead() (interface{}, bool) { + return c.popHead() +} + +func (c *poolChain) PopTail() (interface{}, bool) { + return c.popTail() +} diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 6e9f9f3463..62085b5c96 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -151,6 +151,14 @@ func TestPoolStress(t *testing.T) { } func TestPoolDequeue(t *testing.T) { + testPoolDequeue(t, NewPoolDequeue(16)) +} + +func TestPoolChain(t *testing.T) { + testPoolDequeue(t, NewPoolChain()) +} + +func testPoolDequeue(t *testing.T, d PoolDequeue) { const P = 10 // In long mode, do enough pushes to wrap around the 21-bit // indexes. @@ -158,7 +166,6 @@ func TestPoolDequeue(t *testing.T) { if testing.Short() { N = 1e3 } - d := NewPoolDequeue(16) have := make([]int32, N) var stop int32 var wg WaitGroup diff --git a/src/sync/poolqueue.go b/src/sync/poolqueue.go index bc2ab647ff..22f74969d9 100644 --- a/src/sync/poolqueue.go +++ b/src/sync/poolqueue.go @@ -52,10 +52,10 @@ const dequeueBits = 32 // dequeueLimit is the maximum size of a poolDequeue. // -// This is half of 1<= dequeueLimit { + // Can't make it any bigger. + newSize = dequeueLimit + } + + d2 := &poolChainElt{prev: d} + d2.vals = make([]eface, newSize) + c.head = d2 + storePoolChainElt(&d.next, d2) + d2.pushHead(val) +} + +func (c *poolChain) popHead() (interface{}, bool) { + d := c.head + for d != nil { + if val, ok := d.popHead(); ok { + return val, ok + } + // There may still be unconsumed elements in the + // previous dequeue, so try backing up. + d = loadPoolChainElt(&d.prev) + } + return nil, false +} + +func (c *poolChain) popTail() (interface{}, bool) { + d := loadPoolChainElt(&c.tail) + if d == nil { + return nil, false + } + + for { + // It's important that we load the next pointer + // *before* popping the tail. In general, d may be + // transiently empty, but if next is non-nil before + // the pop and the pop fails, then d is permanently + // empty, which is the only condition under which it's + // safe to drop d from the chain. + d2 := loadPoolChainElt(&d.next) + + if val, ok := d.popTail(); ok { + return val, ok + } + + if d2 == nil { + // This is the only dequeue. It's empty right + // now, but could be pushed to in the future. + return nil, false + } + + // The tail of the chain has been drained, so move on + // to the next dequeue. Try to drop it from the chain + // so the next pop doesn't have to look at the empty + // dequeue again. + if atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(&c.tail)), unsafe.Pointer(d), unsafe.Pointer(d2)) { + // We won the race. Clear the prev pointer so + // the garbage collector can collect the empty + // dequeue and so popHead doesn't back up + // further than necessary. + storePoolChainElt(&d2.prev, nil) + } + d = d2 + } +} -- GitLab From 59f2704dabf0c68bc645adb0ed4a8d94cdbcd7bb Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 8 Mar 2019 15:01:34 -0500 Subject: [PATCH 0713/1679] sync: add Pool benchmarks to stress STW and reuse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds two benchmarks that will highlight two problems in Pool that we're about to address. The first benchmark measures the impact of large Pools on GC STW time. Currently, STW time is O(# of items in Pools), and this benchmark demonstrates 70µs STW times. The second benchmark measures the impact of fully clearing all Pools on each GC. Typically this is a problem in heavily-loaded systems because it causes a spike in allocation. This benchmark stresses this by simulating an expensive "New" function, so the cost of creating new objects is reflected in the ns/op of the benchmark. For #22950, #22331. Change-Id: I0c8853190d23144026fa11837b6bf42adc461722 Reviewed-on: https://go-review.googlesource.com/c/go/+/166959 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/sync/pool_test.go | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 62085b5c96..5649a9dc83 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -10,6 +10,7 @@ package sync_test import ( "runtime" "runtime/debug" + "sort" . "sync" "sync/atomic" "testing" @@ -253,3 +254,84 @@ func BenchmarkPoolOverflow(b *testing.B) { } }) } + +var globalSink interface{} + +func BenchmarkPoolSTW(b *testing.B) { + // Take control of GC. + defer debug.SetGCPercent(debug.SetGCPercent(-1)) + + var mstats runtime.MemStats + var pauses []uint64 + + var p Pool + for i := 0; i < b.N; i++ { + // Put a large number of items into a pool. + const N = 100000 + var item interface{} = 42 + for i := 0; i < N; i++ { + p.Put(item) + } + // Do a GC. + runtime.GC() + // Record pause time. + runtime.ReadMemStats(&mstats) + pauses = append(pauses, mstats.PauseNs[(mstats.NumGC+255)%256]) + } + + // Get pause time stats. + sort.Slice(pauses, func(i, j int) bool { return pauses[i] < pauses[j] }) + var total uint64 + for _, ns := range pauses { + total += ns + } + // ns/op for this benchmark is average STW time. + b.ReportMetric(float64(total)/float64(b.N), "ns/op") + b.ReportMetric(float64(pauses[len(pauses)*95/100]), "p95-ns/STW") + b.ReportMetric(float64(pauses[len(pauses)*50/100]), "p50-ns/STW") +} + +func BenchmarkPoolExpensiveNew(b *testing.B) { + // Populate a pool with items that are expensive to construct + // to stress pool cleanup and subsequent reconstruction. + + // Create a ballast so the GC has a non-zero heap size and + // runs at reasonable times. + globalSink = make([]byte, 8<<20) + defer func() { globalSink = nil }() + + // Create a pool that's "expensive" to fill. + var p Pool + var nNew uint64 + p.New = func() interface{} { + atomic.AddUint64(&nNew, 1) + time.Sleep(time.Millisecond) + return 42 + } + var mstats1, mstats2 runtime.MemStats + runtime.ReadMemStats(&mstats1) + b.RunParallel(func(pb *testing.PB) { + // Simulate 100X the number of goroutines having items + // checked out from the Pool simultaneously. + items := make([]interface{}, 100) + var sink []byte + for pb.Next() { + // Stress the pool. + for i := range items { + items[i] = p.Get() + // Simulate doing some work with this + // item checked out. + sink = make([]byte, 32<<10) + } + for i, v := range items { + p.Put(v) + items[i] = nil + } + } + _ = sink + }) + runtime.ReadMemStats(&mstats2) + + b.ReportMetric(float64(mstats2.NumGC-mstats1.NumGC)/float64(b.N), "GCs/op") + b.ReportMetric(float64(nNew)/float64(b.N), "New/op") +} -- GitLab From d5fd2dd6a17a816b7dfd99d4df70a85f1bf0de31 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 1 Mar 2019 15:33:33 -0500 Subject: [PATCH 0714/1679] sync: use lock-free structure for Pool stealing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, Pool stores each per-P shard's overflow in a slice protected by a Mutex. In order to store to the overflow or steal from another shard, a P must lock that shard's Mutex. This allows for simple synchronization between Put and Get, but has unfortunate consequences for clearing pools. Pools are cleared during STW sweep termination, and hence rely on pinning a goroutine to its P to synchronize between Get/Put and clearing. This makes the Get/Put fast path extremely fast because it can rely on quiescence-style coordination, which doesn't even require atomic writes, much less locking. The catch is that a goroutine cannot acquire a Mutex while pinned to its P (as this could deadlock). Hence, it must drop the pin on the slow path. But this means the slow path is not synchronized with clearing. As a result, 1) It's difficult to reason about races between clearing and the slow path. Furthermore, this reasoning often depends on unspecified nuances of where preemption points can occur. 2) Clearing must zero out the pointer to every object in every Pool to prevent a concurrent slow path from causing all objects to be retained. Since this happens during STW, this has an O(# objects in Pools) effect on STW time. 3) We can't implement a victim cache without making clearing even slower. This CL solves these problems by replacing the locked overflow slice with a lock-free structure. This allows Gets and Puts to be pinned the whole time they're manipulating the shards slice (Pool.local), which eliminates the races between Get/Put and clearing. This, in turn, eliminates the need to zero all object pointers, reducing clearing to O(# of Pools) during STW. In addition to significantly reducing STW impact, this also happens to speed up the Get/Put fast-path and the slow path. It somewhat increases the cost of PoolExpensiveNew, but we'll fix that in the next CL. name old time/op new time/op delta Pool-12 3.00ns ± 0% 2.21ns ±36% -26.32% (p=0.000 n=18+19) PoolOverflow-12 600ns ± 1% 587ns ± 1% -2.21% (p=0.000 n=16+18) PoolSTW-12 71.0µs ± 2% 5.6µs ± 3% -92.15% (p=0.000 n=20+20) PoolExpensiveNew-12 3.14ms ± 5% 3.69ms ± 7% +17.67% (p=0.000 n=19+20) name old p50-ns/STW new p50-ns/STW delta PoolSTW-12 70.7k ± 1% 5.5k ± 2% -92.25% (p=0.000 n=20+20) name old p95-ns/STW new p95-ns/STW delta PoolSTW-12 73.1k ± 2% 6.7k ± 4% -90.86% (p=0.000 n=18+19) name old GCs/op new GCs/op delta PoolExpensiveNew-12 0.38 ± 1% 0.39 ± 1% +2.07% (p=0.000 n=20+18) name old New/op new New/op delta PoolExpensiveNew-12 33.9 ± 6% 40.0 ± 6% +17.97% (p=0.000 n=19+20) (https://perf.golang.org/search?q=upload:20190311.1) Fixes #22331. For #22950. Change-Id: Ic5cd826e25e218f3f8256dbc4d22835c1fecb391 Reviewed-on: https://go-review.googlesource.com/c/go/+/166960 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/sync/pool.go | 74 +++++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/src/sync/pool.go b/src/sync/pool.go index e54f917225..c447cb73aa 100644 --- a/src/sync/pool.go +++ b/src/sync/pool.go @@ -55,9 +55,8 @@ type Pool struct { // Local per-P Pool appendix. type poolLocalInternal struct { - private interface{} // Can be used only by the respective P. - shared []interface{} // Can be used by any P. - Mutex // Protects shared. + private interface{} // Can be used only by the respective P. + shared poolChain // Local P can pushHead/popHead; any P can popTail. } type poolLocal struct { @@ -97,17 +96,15 @@ func (p *Pool) Put(x interface{}) { race.ReleaseMerge(poolRaceAddr(x)) race.Disable() } - l := p.pin() + l, _ := p.pin() if l.private == nil { l.private = x x = nil } - runtime_procUnpin() if x != nil { - l.Lock() - l.shared = append(l.shared, x) - l.Unlock() + l.shared.pushHead(x) } + runtime_procUnpin() if race.Enabled { race.Enable() } @@ -125,22 +122,19 @@ func (p *Pool) Get() interface{} { if race.Enabled { race.Disable() } - l := p.pin() + l, pid := p.pin() x := l.private l.private = nil - runtime_procUnpin() if x == nil { - l.Lock() - last := len(l.shared) - 1 - if last >= 0 { - x = l.shared[last] - l.shared = l.shared[:last] - } - l.Unlock() + // Try to pop the head of the local shard. We prefer + // the head over the tail for temporal locality of + // reuse. + x, _ = l.shared.popHead() if x == nil { - x = p.getSlow() + x = p.getSlow(pid) } } + runtime_procUnpin() if race.Enabled { race.Enable() if x != nil { @@ -153,31 +147,24 @@ func (p *Pool) Get() interface{} { return x } -func (p *Pool) getSlow() (x interface{}) { +func (p *Pool) getSlow(pid int) interface{} { // See the comment in pin regarding ordering of the loads. size := atomic.LoadUintptr(&p.localSize) // load-acquire local := p.local // load-consume // Try to steal one element from other procs. - pid := runtime_procPin() - runtime_procUnpin() for i := 0; i < int(size); i++ { l := indexLocal(local, (pid+i+1)%int(size)) - l.Lock() - last := len(l.shared) - 1 - if last >= 0 { - x = l.shared[last] - l.shared = l.shared[:last] - l.Unlock() - break + if x, _ := l.shared.popTail(); x != nil { + return x } - l.Unlock() } - return x + return nil } -// pin pins the current goroutine to P, disables preemption and returns poolLocal pool for the P. +// pin pins the current goroutine to P, disables preemption and +// returns poolLocal pool for the P and the P's id. // Caller must call runtime_procUnpin() when done with the pool. -func (p *Pool) pin() *poolLocal { +func (p *Pool) pin() (*poolLocal, int) { pid := runtime_procPin() // In pinSlow we store to localSize and then to local, here we load in opposite order. // Since we've disabled preemption, GC cannot happen in between. @@ -186,12 +173,12 @@ func (p *Pool) pin() *poolLocal { s := atomic.LoadUintptr(&p.localSize) // load-acquire l := p.local // load-consume if uintptr(pid) < s { - return indexLocal(l, pid) + return indexLocal(l, pid), pid } return p.pinSlow() } -func (p *Pool) pinSlow() *poolLocal { +func (p *Pool) pinSlow() (*poolLocal, int) { // Retry under the mutex. // Can not lock the mutex while pinned. runtime_procUnpin() @@ -202,7 +189,7 @@ func (p *Pool) pinSlow() *poolLocal { s := p.localSize l := p.local if uintptr(pid) < s { - return indexLocal(l, pid) + return indexLocal(l, pid), pid } if p.local == nil { allPools = append(allPools, p) @@ -212,26 +199,17 @@ func (p *Pool) pinSlow() *poolLocal { local := make([]poolLocal, size) atomic.StorePointer(&p.local, unsafe.Pointer(&local[0])) // store-release atomic.StoreUintptr(&p.localSize, uintptr(size)) // store-release - return &local[pid] + return &local[pid], pid } func poolCleanup() { // This function is called with the world stopped, at the beginning of a garbage collection. // It must not allocate and probably should not call any runtime functions. - // Defensively zero out everything, 2 reasons: - // 1. To prevent false retention of whole Pools. - // 2. If GC happens while a goroutine works with l.shared in Put/Get, - // it will retain whole Pool. So next cycle memory consumption would be doubled. + + // Because the world is stopped, no pool user can be in a + // pinned section (in effect, this has all Ps pinned). for i, p := range allPools { allPools[i] = nil - for i := 0; i < int(p.localSize); i++ { - l := indexLocal(p.local, i) - l.private = nil - for j := range l.shared { - l.shared[j] = nil - } - l.shared = nil - } p.local = nil p.localSize = 0 } -- GitLab From 2dcbf8b3691e72d1b04e9376488cef3b6f93b286 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sat, 2 Mar 2019 15:16:29 -0500 Subject: [PATCH 0715/1679] sync: smooth out Pool behavior over GC with a victim cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, every Pool is cleared completely at the start of each GC. This is a problem for heavy users of Pool because it causes an allocation spike immediately after Pools are clear, which impacts both throughput and latency. This CL fixes this by introducing a victim cache mechanism. Instead of clearing Pools, the victim cache is dropped and the primary cache is moved to the victim cache. As a result, in steady-state, there are (roughly) no new allocations, but if Pool usage drops, objects will still be collected within two GCs (as opposed to one). This victim cache approach also improves Pool's impact on GC dynamics. The current approach causes all objects in Pools to be short lived. However, if an application is in steady state and is just going to repopulate its Pools, then these objects impact the live heap size *as if* they were long lived. Since Pooled objects count as short lived when computing the GC trigger and goal, but act as long lived objects in the live heap, this causes GC to trigger too frequently. If Pooled objects are a non-trivial portion of an application's heap, this increases the CPU overhead of GC. The victim cache lets Pooled objects affect the GC trigger and goal as long-lived objects. This has no impact on Get/Put performance, but substantially reduces the impact to the Pool user when a GC happens. PoolExpensiveNew demonstrates this in the substantially reduction in the rate at which the "New" function is called. name old time/op new time/op delta Pool-12 2.21ns ±36% 2.00ns ± 0% ~ (p=0.070 n=19+16) PoolOverflow-12 587ns ± 1% 583ns ± 1% -0.77% (p=0.000 n=18+18) PoolSTW-12 5.57µs ± 3% 4.52µs ± 4% -18.82% (p=0.000 n=20+19) PoolExpensiveNew-12 3.69ms ± 7% 1.25ms ± 5% -66.25% (p=0.000 n=20+19) name old p50-ns/STW new p50-ns/STW delta PoolSTW-12 5.48k ± 2% 4.53k ± 2% -17.32% (p=0.000 n=20+20) name old p95-ns/STW new p95-ns/STW delta PoolSTW-12 6.69k ± 4% 5.13k ± 3% -23.31% (p=0.000 n=19+18) name old GCs/op new GCs/op delta PoolExpensiveNew-12 0.39 ± 1% 0.32 ± 2% -17.95% (p=0.000 n=18+20) name old New/op new New/op delta PoolExpensiveNew-12 40.0 ± 6% 12.4 ± 6% -68.91% (p=0.000 n=20+19) (https://perf.golang.org/search?q=upload:20190311.2) Fixes #22950. Change-Id: If2e183d948c650417283076aacc20739682cdd70 Reviewed-on: https://go-review.googlesource.com/c/go/+/166961 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/sync/pool.go | 60 ++++++++++++++++++++++++++++++++++++++----- src/sync/pool_test.go | 15 ++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/sync/pool.go b/src/sync/pool.go index c447cb73aa..f58fdd46bc 100644 --- a/src/sync/pool.go +++ b/src/sync/pool.go @@ -47,6 +47,9 @@ type Pool struct { local unsafe.Pointer // local fixed-size per-P pool, actual type is [P]poolLocal localSize uintptr // size of the local array + victim unsafe.Pointer // local from previous cycle + victimSize uintptr // size of victims array + // New optionally specifies a function to generate // a value when Get would otherwise return nil. // It may not be changed concurrently with calls to Get. @@ -150,14 +153,39 @@ func (p *Pool) Get() interface{} { func (p *Pool) getSlow(pid int) interface{} { // See the comment in pin regarding ordering of the loads. size := atomic.LoadUintptr(&p.localSize) // load-acquire - local := p.local // load-consume + locals := p.local // load-consume // Try to steal one element from other procs. for i := 0; i < int(size); i++ { - l := indexLocal(local, (pid+i+1)%int(size)) + l := indexLocal(locals, (pid+i+1)%int(size)) + if x, _ := l.shared.popTail(); x != nil { + return x + } + } + + // Try the victim cache. We do this after attempting to steal + // from all primary caches because we want objects in the + // victim cache to age out if at all possible. + size = atomic.LoadUintptr(&p.victimSize) + if uintptr(pid) >= size { + return nil + } + locals = p.victim + l := indexLocal(locals, pid) + if x := l.private; x != nil { + l.private = nil + return x + } + for i := 0; i < int(size); i++ { + l := indexLocal(locals, (pid+i)%int(size)) if x, _ := l.shared.popTail(); x != nil { return x } } + + // Mark the victim cache as empty for future gets don't bother + // with it. + atomic.StoreUintptr(&p.victimSize, 0) + return nil } @@ -208,17 +236,37 @@ func poolCleanup() { // Because the world is stopped, no pool user can be in a // pinned section (in effect, this has all Ps pinned). - for i, p := range allPools { - allPools[i] = nil + + // Drop victim caches from all pools. + for _, p := range oldPools { + p.victim = nil + p.victimSize = 0 + } + + // Move primary cache to victim cache. + for _, p := range allPools { + p.victim = p.local + p.victimSize = p.localSize p.local = nil p.localSize = 0 } - allPools = []*Pool{} + + // The pools with non-empty primary caches now have non-empty + // victim caches and no pools have primary caches. + oldPools, allPools = allPools, nil } var ( allPoolsMu Mutex - allPools []*Pool + + // allPools is the set of pools that have non-empty primary + // caches. Protected by either 1) allPoolsMu and pinning or 2) + // STW. + allPools []*Pool + + // oldPools is the set of pools that may have non-empty victim + // caches. Protected by STW. + oldPools []*Pool ) func init() { diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 5649a9dc83..796a5a0a73 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -41,11 +41,20 @@ func TestPool(t *testing.T) { } Runtime_procUnpin() - p.Put("c") - debug.SetGCPercent(100) // to allow following GC to actually run + // Put in a large number of objects so they spill into + // stealable space. + for i := 0; i < 100; i++ { + p.Put("c") + } + // After one GC, the victim cache should keep them alive. + runtime.GC() + if g := p.Get(); g != "c" { + t.Fatalf("got %#v; want c after GC", g) + } + // A second GC should drop the victim cache. runtime.GC() if g := p.Get(); g != nil { - t.Fatalf("got %#v; want nil after GC", g) + t.Fatalf("got %#v; want nil after second GC", g) } } -- GitLab From ac40a7fb9e2650f0a0999bea7639477337fe161e Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 25 Mar 2019 22:24:03 -0400 Subject: [PATCH 0716/1679] runtime: fix sanity check in notetsleep CL 3660 replaced m.gcing with m.preemptoff, but unintentionally reversed the sense of part of a sanity check in notetsleep. Originally, notetsleep required that it be called from g0 or with preemption disabled (specifically from within the garbage collector). CL 3660 made it require that it be called from g0 or that preemption be *enabled*. I'm not sure why it had the original exception for being called from a user g within the garbage collector, but the current garbage collector certainly doesn't need that, and the new condition is completely wrong. Make the sanity check just require that it's called on g0. Change-Id: I6980d44f5a4461935e10b1b33a981e32b1b7b0c9 Reviewed-on: https://go-review.googlesource.com/c/go/+/170063 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/lock_sema.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/lock_sema.go b/src/runtime/lock_sema.go index 08dfd2b664..fcc531ce78 100644 --- a/src/runtime/lock_sema.go +++ b/src/runtime/lock_sema.go @@ -262,7 +262,7 @@ func notetsleep_internal(n *note, ns int64, gp *g, deadline int64) bool { func notetsleep(n *note, ns int64) bool { gp := getg() - if gp != gp.m.g0 && gp.m.preemptoff != "" { + if gp != gp.m.g0 { throw("notetsleep not on g0") } semacreate(gp.m) -- GitLab From ea9859f858b603cbf49f0a930f83c56a716490a4 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Mon, 25 Mar 2019 21:16:33 -0400 Subject: [PATCH 0717/1679] runtime: use acquirem/releasem more widely We've copy-pasted the pattern of releasem in many places. This CL replaces almost everywhere that manipulates g.m.locks and g.preempt with calls to acquirem/releasem. There are a few where we do something more complicated, like where exitsyscall has to restore the stack bound differently depending on the preempt flag, which this CL leaves alone. Change-Id: Ia7a46c261daea6e7802b80e7eb9227499f460433 Reviewed-on: https://go-review.googlesource.com/c/go/+/170064 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/proc.go | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 78940625b8..6b5b3e2b2b 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -645,7 +645,7 @@ func ready(gp *g, traceskip int, next bool) { // Mark runnable. _g_ := getg() - _g_.m.locks++ // disable preemption because it can be holding p in a local var + mp := acquirem() // disable preemption because it can be holding p in a local var if status&^_Gscan != _Gwaiting { dumpgstatus(gp) throw("bad g->status in ready") @@ -657,10 +657,7 @@ func ready(gp *g, traceskip int, next bool) { if atomic.Load(&sched.npidle) != 0 && atomic.Load(&sched.nmspinning) == 0 { wakep() } - _g_.m.locks-- - if _g_.m.locks == 0 && _g_.preempt { // restore the preemption request in Case we've cleared it in newstack - _g_.stackguard0 = stackPreempt - } + releasem(mp) } // freezeStopWait is a large value that freezetheworld sets @@ -1080,9 +1077,7 @@ func stopTheWorldWithSema() { } func startTheWorldWithSema(emitTraceEvent bool) int64 { - _g_ := getg() - - _g_.m.locks++ // disable preemption because it can be holding p in a local var + mp := acquirem() // disable preemption because it can be holding p in a local var if netpollinited() { list := netpoll(false) // non-blocking injectglist(&list) @@ -1132,10 +1127,7 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 { wakep() } - _g_.m.locks-- - if _g_.m.locks == 0 && _g_.preempt { // restore the preemption request in case we've cleared it in newstack - _g_.stackguard0 = stackPreempt - } + releasem(mp) return startTime } @@ -1464,7 +1456,7 @@ type cgothreadstart struct { //go:yeswritebarrierrec func allocm(_p_ *p, fn func()) *m { _g_ := getg() - _g_.m.locks++ // disable GC because it can be called from sysmon + acquirem() // disable GC because it can be called from sysmon if _g_.m.p == 0 { acquirep(_p_) // temporarily borrow p for mallocs in this function } @@ -1505,10 +1497,7 @@ func allocm(_p_ *p, fn func()) *m { if _p_ == _g_.m.p.ptr() { releasep() } - _g_.m.locks-- - if _g_.m.locks == 0 && _g_.preempt { // restore the preemption request in case we've cleared it in newstack - _g_.stackguard0 = stackPreempt - } + releasem(_g_.m) return mp } @@ -3255,7 +3244,7 @@ func newproc1(fn *funcval, argp *uint8, narg int32, callergp *g, callerpc uintpt _g_.m.throwing = -1 // do not dump full stacks throw("go of nil func value") } - _g_.m.locks++ // disable preemption because it can be holding p in a local var + acquirem() // disable preemption because it can be holding p in a local var siz := narg siz = (siz + 7) &^ 7 @@ -3350,10 +3339,7 @@ func newproc1(fn *funcval, argp *uint8, narg int32, callergp *g, callerpc uintpt if atomic.Load(&sched.npidle) != 0 && atomic.Load(&sched.nmspinning) == 0 && mainStarted { wakep() } - _g_.m.locks-- - if _g_.m.locks == 0 && _g_.preempt { // restore the preemption request in case we've cleared it in newstack - _g_.stackguard0 = stackPreempt - } + releasem(_g_.m) } // saveAncestors copies previous ancestors of the given caller g and -- GitLab From 68d89bb8e05afc2aa050b4c5ad0df4b3af03c45d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 3 Apr 2019 14:47:55 -0400 Subject: [PATCH 0718/1679] runtime: separate stack freeing from stack shrinking Currently, shrinkstack will free the stack if the goroutine is dead. There are only two places that call shrinkstack: scanstack, which will never call it if the goroutine is dead; and markrootFreeGStacks, which only calls it on dead goroutines. Clean this up by separating stack freeing out of shrinkstack. Change-Id: I7d7891e620550c32a2220833923a025704986681 Reviewed-on: https://go-review.googlesource.com/c/go/+/170890 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- src/runtime/mgcmark.go | 4 +++- src/runtime/stack.go | 10 ---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/runtime/mgcmark.go b/src/runtime/mgcmark.go index cc4e7d06d3..91f79c44db 100644 --- a/src/runtime/mgcmark.go +++ b/src/runtime/mgcmark.go @@ -270,7 +270,9 @@ func markrootFreeGStacks() { // Free stacks. q := gQueue{list.head, list.head} for gp := list.head.ptr(); gp != nil; gp = gp.schedlink.ptr() { - shrinkstack(gp) + stackfree(gp.stack) + gp.stack.lo = 0 + gp.stack.hi = 0 // Manipulate the queue directly since the Gs are // already all linked the right way. q.tail.set(gp) diff --git a/src/runtime/stack.go b/src/runtime/stack.go index 85902a6b68..d5d09ba7d7 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -1077,16 +1077,6 @@ func gostartcallfn(gobuf *gobuf, fv *funcval) { // gp must be stopped, but the world need not be. func shrinkstack(gp *g) { gstatus := readgstatus(gp) - if gstatus&^_Gscan == _Gdead { - if gp.stack.lo != 0 { - // Free whole stack - it will get reallocated - // if G is used again. - stackfree(gp.stack) - gp.stack.lo = 0 - gp.stack.hi = 0 - } - return - } if gp.stack.lo == 0 { throw("missing stack in shrinkstack") } -- GitLab From 06cff114cf786d5f901aa41ac873f9e8bb8e1eba Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 5 Apr 2019 13:01:58 -0700 Subject: [PATCH 0719/1679] syscall: use openat instead of dup to make a really new file descriptor Update #31269 Change-Id: I0e7184420055b8dfd23688dab9f9d8cba1fa2485 Reviewed-on: https://go-review.googlesource.com/c/go/+/170892 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/getdirentries_test.go | 82 +++++++++++++++++++++++++++++++ src/syscall/syscall_darwin.go | 8 ++- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/syscall/getdirentries_test.go diff --git a/src/syscall/getdirentries_test.go b/src/syscall/getdirentries_test.go new file mode 100644 index 0000000000..b20ae1d1e3 --- /dev/null +++ b/src/syscall/getdirentries_test.go @@ -0,0 +1,82 @@ +// Copyright 2019 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. + +// +build darwin freebsd netbsd openbsd + +package syscall_test + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" + "syscall" + "testing" + "unsafe" +) + +func TestGetdirentries(t *testing.T) { + for _, count := range []int{10, 1000} { + t.Run(fmt.Sprintf("n=%d", count), func(t *testing.T) { + testGetdirentries(t, count) + }) + } +} +func testGetdirentries(t *testing.T, count int) { + d, err := ioutil.TempDir("", "getdirentries-test") + if err != nil { + t.Fatalf("Tempdir: %v", err) + } + defer os.RemoveAll(d) + var names []string + for i := 0; i < count; i++ { + names = append(names, fmt.Sprintf("file%03d", i)) + } + + // Make files in the temp directory + for _, name := range names { + err := ioutil.WriteFile(filepath.Join(d, name), []byte("data"), 0) + if err != nil { + t.Fatalf("WriteFile: %v", err) + } + } + + // Read files using Getdirentries + var names2 []string + fd, err := syscall.Open(d, syscall.O_RDONLY, 0) + if err != nil { + t.Fatalf("Open: %v", err) + } + defer syscall.Close(fd) + var base uintptr + var buf [2048]byte + for { + n, err := syscall.Getdirentries(fd, buf[:], &base) + if err != nil { + t.Fatalf("Getdirentries: %v", err) + } + if n == 0 { + break + } + data := buf[:n] + for len(data) > 0 { + dirent := (*syscall.Dirent)(unsafe.Pointer(&data[0])) + data = data[dirent.Reclen:] + name := make([]byte, dirent.Namlen) + for i := 0; i < int(dirent.Namlen); i++ { + name[i] = byte(dirent.Name[i]) + } + names2 = append(names2, string(name)) + } + } + + names = append(names, ".", "..") // Getdirentries returns these also + sort.Strings(names) + sort.Strings(names2) + if strings.Join(names, ":") != strings.Join(names2, ":") { + t.Errorf("names don't match\n names: %q\nnames2: %q", names, names2) + } +} diff --git a/src/syscall/syscall_darwin.go b/src/syscall/syscall_darwin.go index 7ceceff2c1..422f3d4425 100644 --- a/src/syscall/syscall_darwin.go +++ b/src/syscall/syscall_darwin.go @@ -368,7 +368,13 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // Simulate Getdirentries using fdopendir/readdir_r/closedir. const ptrSize = unsafe.Sizeof(uintptr(0)) - fd2, err := Dup(fd) + // We need to duplicate the incoming file descriptor + // because the caller expects to retain control of it, but + // fdopendir expects to take control of its argument. + // Just Dup'ing the file descriptor is not enough, as the + // result shares underlying state. Use openat to make a really + // new file descriptor referring to the same directory. + fd2, err := openat(fd, ".", O_RDONLY, 0) if err != nil { return 0, err } -- GitLab From cb6646234cb6565d19d9efea987c8d8fc9be5c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 5 Apr 2019 22:28:31 +0200 Subject: [PATCH 0720/1679] encoding/json: use SetBytes in UnmarshalReuse benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was the only benchmark missing the SetBytes call, as spotted earlier by Bryan. It's not required to make the benchmark useful, but it can still be a good way to see how its speed is affected by the reduced allocations: name time/op CodeUnmarshal-8 12.1ms ± 1% CodeUnmarshalReuse-8 11.4ms ± 1% name speed CodeUnmarshal-8 161MB/s ± 1% CodeUnmarshalReuse-8 171MB/s ± 1% name alloc/op CodeUnmarshal-8 3.28MB ± 0% CodeUnmarshalReuse-8 1.94MB ± 0% name allocs/op CodeUnmarshal-8 92.7k ± 0% CodeUnmarshalReuse-8 77.6k ± 0% While at it, remove some unnecessary empty lines. Change-Id: Ib2bd92d5b3237b8f3092e8c6f863dab548fee2f5 Reviewed-on: https://go-review.googlesource.com/c/go/+/170938 Run-TryBot: Daniel Martí Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/encoding/json/bench_test.go | 2 +- src/encoding/json/example_test.go | 1 - src/encoding/json/stream_test.go | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/encoding/json/bench_test.go b/src/encoding/json/bench_test.go index c81ab8e993..f2592e3dbd 100644 --- a/src/encoding/json/bench_test.go +++ b/src/encoding/json/bench_test.go @@ -242,7 +242,7 @@ func BenchmarkCodeUnmarshalReuse(b *testing.B) { } } }) - // TODO(bcmills): Is there a missing b.SetBytes here? + b.SetBytes(int64(len(codeJSON))) } func BenchmarkUnmarshalString(b *testing.B) { diff --git a/src/encoding/json/example_test.go b/src/encoding/json/example_test.go index 4c075ddaa6..2088c34297 100644 --- a/src/encoding/json/example_test.go +++ b/src/encoding/json/example_test.go @@ -170,7 +170,6 @@ func ExampleDecoder_Decode_stream() { // Sam: Go fmt who? // Ed: Go fmt yourself! // json.Delim: ] - } // This example uses RawMessage to delay parsing part of a JSON message. diff --git a/src/encoding/json/stream_test.go b/src/encoding/json/stream_test.go index 8dc74e5466..1d1999da25 100644 --- a/src/encoding/json/stream_test.go +++ b/src/encoding/json/stream_test.go @@ -368,7 +368,6 @@ var tokenStreamCases = []tokenStreamCase{ } func TestDecodeInStream(t *testing.T) { - for ci, tcase := range tokenStreamCases { dec := NewDecoder(strings.NewReader(tcase.json)) @@ -401,7 +400,6 @@ func TestDecodeInStream(t *testing.T) { } } } - } // Test from golang.org/issue/11893 -- GitLab From ad6c691542e2d842c90e2f7870021d16ffa71878 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Sat, 6 Apr 2019 12:42:51 -0700 Subject: [PATCH 0721/1679] cmd/compile: remove AUNDEF opcode This opcode was only used to mark unreachable code for plive to use. plive now uses the SSA representation, so it knows locations are unreachable because they are ends of Exit blocks. It doesn't need these opcodes any more. These opcodes actually used space in the binary, 2 bytes per undef on x86 and more for other archs. Makes the amd64 go binary 0.2% smaller. Change-Id: I64c84c35db7c7949617a3a5830f09c8e5fcd2620 Reviewed-on: https://go-review.googlesource.com/c/go/+/171058 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/amd64/ssa.go | 1 - src/cmd/compile/internal/arm/ssa.go | 1 - src/cmd/compile/internal/arm64/ssa.go | 1 - src/cmd/compile/internal/gc/ssa.go | 7 +++++++ src/cmd/compile/internal/mips/ssa.go | 1 - src/cmd/compile/internal/mips64/ssa.go | 1 - src/cmd/compile/internal/ppc64/ssa.go | 1 - src/cmd/compile/internal/s390x/ssa.go | 1 - src/cmd/compile/internal/wasm/ssa.go | 1 - src/cmd/compile/internal/x86/ssa.go | 1 - 10 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/cmd/compile/internal/amd64/ssa.go b/src/cmd/compile/internal/amd64/ssa.go index 5b8590c357..693316bdc7 100644 --- a/src/cmd/compile/internal/amd64/ssa.go +++ b/src/cmd/compile/internal/amd64/ssa.go @@ -1208,7 +1208,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index 8af6b1e6ed..ee9c9f1c3f 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -929,7 +929,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index 0b9f62834c..be4ddb4b6b 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -1006,7 +1006,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index be317c2109..dd056afcca 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -5335,6 +5335,13 @@ func genssa(f *ssa.Func, pp *Progs) { } } } + if f.Blocks[len(f.Blocks)-1].Kind == ssa.BlockExit { + // We need the return address of a panic call to + // still be inside the function in question. So if + // it ends in a call which doesn't return, add a + // nop (which will never execute) after the call. + thearch.Ginsnop(pp) + } if inlMarks != nil { // We have some inline marks. Try to find other instructions we're diff --git a/src/cmd/compile/internal/mips/ssa.go b/src/cmd/compile/internal/mips/ssa.go index d2ea0f46bb..19b7c95bfd 100644 --- a/src/cmd/compile/internal/mips/ssa.go +++ b/src/cmd/compile/internal/mips/ssa.go @@ -828,7 +828,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: diff --git a/src/cmd/compile/internal/mips64/ssa.go b/src/cmd/compile/internal/mips64/ssa.go index d0c8b06900..01b8ed0564 100644 --- a/src/cmd/compile/internal/mips64/ssa.go +++ b/src/cmd/compile/internal/mips64/ssa.go @@ -793,7 +793,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: diff --git a/src/cmd/compile/internal/ppc64/ssa.go b/src/cmd/compile/internal/ppc64/ssa.go index a32f80fb29..49f78ee188 100644 --- a/src/cmd/compile/internal/ppc64/ssa.go +++ b/src/cmd/compile/internal/ppc64/ssa.go @@ -1291,7 +1291,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index d90605bcbd..c5b2d74bcc 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -815,7 +815,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index 63eb319edb..7fdd335ee9 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -97,7 +97,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { p.To.Sym = b.Aux.(*obj.LSym) case ssa.BlockExit: - s.Prog(obj.AUNDEF) case ssa.BlockDefer: p := s.Prog(wasm.AGet) diff --git a/src/cmd/compile/internal/x86/ssa.go b/src/cmd/compile/internal/x86/ssa.go index b7b0f44529..66c7b753c6 100644 --- a/src/cmd/compile/internal/x86/ssa.go +++ b/src/cmd/compile/internal/x86/ssa.go @@ -916,7 +916,6 @@ func ssaGenBlock(s *gc.SSAGenState, b, next *ssa.Block) { s.Branches = append(s.Branches, gc.Branch{P: p, B: b.Succs[0].Block()}) } case ssa.BlockExit: - s.Prog(obj.AUNDEF) // tell plive.go that we never reach here case ssa.BlockRet: s.Prog(obj.ARET) case ssa.BlockRetJmp: -- GitLab From 1c00deeaf96743362a103957266f92e47ff90bc6 Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Sun, 7 Apr 2019 09:33:36 +1000 Subject: [PATCH 0722/1679] image: deprecate ZP and ZR They were added a very long time ago, as a convenience before Go had struct literals. Today, it is better to use the zero-valued literal. For example, the compiler cannot prove that ZP or ZR have not been modified. Change-Id: I7469f1c751e91bf76fe1eab07b5772eccb5d6405 Reviewed-on: https://go-review.googlesource.com/c/go/+/171097 Reviewed-by: Nigel Tao --- src/image/geom.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/image/geom.go b/src/image/geom.go index ed7dde2c84..8bb249c1e0 100644 --- a/src/image/geom.go +++ b/src/image/geom.go @@ -67,6 +67,8 @@ func (p Point) Eq(q Point) bool { } // ZP is the zero Point. +// +// Deprecated: Use a literal image.Point{} instead. var ZP Point // Pt is shorthand for Point{X, Y}. @@ -254,6 +256,8 @@ func (r Rectangle) ColorModel() color.Model { } // ZR is the zero Rectangle. +// +// Deprecated: Use a literal image.Rectangle{} instead. var ZR Rectangle // Rect is shorthand for Rectangle{Pt(x0, y0), Pt(x1, y1)}. The returned -- GitLab From 1cff98d4fe3a39356b697225ff27ba5e2f1ef217 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 15:11:39 +0200 Subject: [PATCH 0723/1679] bootstrap.bash: remove exec wrappers Without this change, building an Android toolchain fails: $ CGO_ENABLED=1 GOARCH=arm64 GOOS=android ./bootstrap.bash ... rmdir: failed to remove 'bin/go_android_arm64_exec': Not a directory Change-Id: Ibc3b1e2fd24b73a63bd3020ce1e813f2b4496125 Reviewed-on: https://go-review.googlesource.com/c/go/+/170941 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/bootstrap.bash | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bootstrap.bash b/src/bootstrap.bash index 32b736ad78..673fb61c67 100755 --- a/src/bootstrap.bash +++ b/src/bootstrap.bash @@ -72,6 +72,7 @@ if [ "$goos" = "$gohostos" -a "$goarch" = "$gohostarch" ]; then # prepare a clean toolchain for others. true else + rm bin/go_${goos}_${goarch}_exec mv bin/*_*/* bin rmdir bin/*_* rm -rf "pkg/${gohostos}_${gohostarch}" "pkg/tool/${gohostos}_${gohostarch}" -- GitLab From 71371d850f4255c4ec2d6900e026dfb3dd660c98 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 20:00:39 +0200 Subject: [PATCH 0724/1679] os: skip Open("/") on Android It's not supported in an app context: $ go test -short os --- FAIL: TestChdirAndGetwd (0.00s) os_test.go:1213: Open /: open /: permission denied Change-Id: I56b951f925a50fd67715ee2f1de64951ee867e91 Reviewed-on: https://go-review.googlesource.com/c/go/+/170946 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/os_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/os_test.go b/src/os/os_test.go index 1de46c29f5..b7e26f47b7 100644 --- a/src/os/os_test.go +++ b/src/os/os_test.go @@ -1185,7 +1185,7 @@ func TestChdirAndGetwd(t *testing.T) { // /usr/bin does not usually exist on Plan 9 or Android. switch runtime.GOOS { case "android": - dirs = []string{"/", "/system/bin"} + dirs = []string{"/system/bin"} case "plan9": dirs = []string{"/", "/usr"} case "darwin": -- GitLab From 7331edcef567bb9fdc848f3b8e18dd0da0987372 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 19:53:30 +0200 Subject: [PATCH 0725/1679] os/exec: skip unsupported test on Android The underlying system call tested by TestCredentialNoSetGroups is blocked on Android. Discovered while running all.bash from an Android device; the syscall is only blocked in an app context. Change-Id: I16fd2e64636a0958b0ec86820723c0577b8f8f24 Reviewed-on: https://go-review.googlesource.com/c/go/+/170945 Run-TryBot: Elias Naur Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/exec/exec_posix_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/os/exec/exec_posix_test.go b/src/os/exec/exec_posix_test.go index 46799cdbdb..d4d67ac933 100644 --- a/src/os/exec/exec_posix_test.go +++ b/src/os/exec/exec_posix_test.go @@ -8,6 +8,7 @@ package exec_test import ( "os/user" + "runtime" "strconv" "syscall" "testing" @@ -15,6 +16,10 @@ import ( ) func TestCredentialNoSetGroups(t *testing.T) { + if runtime.GOOS == "android" { + t.Skip("unsupported on Android") + } + u, err := user.Current() if err != nil { t.Fatalf("error getting current user: %v", err) -- GitLab From ef38e21eb58abe9c37b52bf5cabc115bb3dd3ebc Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 20:29:24 +0200 Subject: [PATCH 0726/1679] net: pass TMPDIR to test client process Fixes the TestSplice test on Android where the default TMPDIR (/data/local/tmp) might not be available. Change-Id: I4f104d11254ba855b1bd2dfa0547d69b7bce4878 Reviewed-on: https://go-review.googlesource.com/c/go/+/170947 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/splice_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/net/splice_test.go b/src/net/splice_test.go index e2a6638e8f..0ba2f164c2 100644 --- a/src/net/splice_test.go +++ b/src/net/splice_test.go @@ -369,6 +369,7 @@ func startSpliceClient(conn Conn, op string, chunkSize, totalSize int) (func(), "GO_NET_TEST_SPLICE_OP=" + op, "GO_NET_TEST_SPLICE_CHUNK_SIZE=" + strconv.Itoa(chunkSize), "GO_NET_TEST_SPLICE_TOTAL_SIZE=" + strconv.Itoa(totalSize), + "TMPDIR=" + os.Getenv("TMPDIR"), } cmd.ExtraFiles = append(cmd.ExtraFiles, f) cmd.Stdout = os.Stdout -- GitLab From 9017b6149e0fcac8b60e5b755cddb98ea37daaf9 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 8 Apr 2019 00:16:40 +0200 Subject: [PATCH 0727/1679] misc/cgo/test: skip Setgid test on Android The setgid syscall is blocked on Android in app context. Change-Id: I1ff25840bbc25d472ad4e29eb1b51f183a6c4392 Reviewed-on: https://go-review.googlesource.com/c/go/+/170949 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/cgo/test/cgo_linux_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/misc/cgo/test/cgo_linux_test.go b/misc/cgo/test/cgo_linux_test.go index c2e96b5387..7b56e11a27 100644 --- a/misc/cgo/test/cgo_linux_test.go +++ b/misc/cgo/test/cgo_linux_test.go @@ -4,8 +4,16 @@ package cgotest -import "testing" +import ( + "runtime" + "testing" +) -func TestSetgid(t *testing.T) { testSetgid(t) } +func TestSetgid(t *testing.T) { + if runtime.GOOS == "android" { + t.Skip("unsupported on Android") + } + testSetgid(t) +} func Test6997(t *testing.T) { test6997(t) } func TestBuildID(t *testing.T) { testBuildID(t) } -- GitLab From 20995f627422a3dce2039f06b5dfe1dc0ca174c6 Mon Sep 17 00:00:00 2001 From: Jannis Andrija Schnitzer Date: Mon, 8 Apr 2019 07:31:59 +0000 Subject: [PATCH 0728/1679] archive/zip: use Modified in FileHeader.FileInfo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Modified field allows representation of extended timestamps, which provide more accuracy than the legacy MS-DOS timestamps. The FileInfo method provides an implementation of the os.FileInfo interface for files inside archives. With this change, we make FileInfo use the Modified field, if present, to return more detailed timestamps from its ModTime method. Fixes #28350 Change-Id: Ia31b5b871a3e61df38a3a1325787ae23ea0b8088 GitHub-Last-Rev: 13e94be3f8ba58717911354146670fc2bc594692 GitHub-Pull-Request: golang/go#28352 Reviewed-on: https://go-review.googlesource.com/c/go/+/144382 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Joe Tsai --- src/archive/zip/struct.go | 13 ++++++++---- src/archive/zip/zip_test.go | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/archive/zip/struct.go b/src/archive/zip/struct.go index bd637d185b..686e79781a 100644 --- a/src/archive/zip/struct.go +++ b/src/archive/zip/struct.go @@ -154,10 +154,15 @@ func (fi headerFileInfo) Size() int64 { } return int64(fi.fh.UncompressedSize) } -func (fi headerFileInfo) IsDir() bool { return fi.Mode().IsDir() } -func (fi headerFileInfo) ModTime() time.Time { return fi.fh.ModTime() } -func (fi headerFileInfo) Mode() os.FileMode { return fi.fh.Mode() } -func (fi headerFileInfo) Sys() interface{} { return fi.fh } +func (fi headerFileInfo) IsDir() bool { return fi.Mode().IsDir() } +func (fi headerFileInfo) ModTime() time.Time { + if fi.fh.Modified.IsZero() { + return fi.fh.ModTime() + } + return fi.fh.Modified.UTC() +} +func (fi headerFileInfo) Mode() os.FileMode { return fi.fh.Mode() } +func (fi headerFileInfo) Sys() interface{} { return fi.fh } // FileInfoHeader creates a partially-populated FileHeader from an // os.FileInfo. diff --git a/src/archive/zip/zip_test.go b/src/archive/zip/zip_test.go index 3d5c759851..efdb5bd044 100644 --- a/src/archive/zip/zip_test.go +++ b/src/archive/zip/zip_test.go @@ -114,6 +114,47 @@ func TestFileHeaderRoundTrip64(t *testing.T) { testHeaderRoundTrip(fh, uint32max, fh.UncompressedSize64, t) } +func TestFileHeaderRoundTripModified(t *testing.T) { + fh := &FileHeader{ + Name: "foo.txt", + UncompressedSize: 987654321, + Modified: time.Now().Local(), + ModifiedTime: 1234, + ModifiedDate: 5678, + } + fi := fh.FileInfo() + fh2, err := FileInfoHeader(fi) + if err != nil { + t.Fatal(err) + } + if got, want := fh2.Modified, fh.Modified.UTC(); got != want { + t.Errorf("Modified: got %s, want %s\n", got, want) + } + if got, want := fi.ModTime(), fh.Modified.UTC(); got != want { + t.Errorf("Modified: got %s, want %s\n", got, want) + } +} + +func TestFileHeaderRoundTripWithoutModified(t *testing.T) { + fh := &FileHeader{ + Name: "foo.txt", + UncompressedSize: 987654321, + ModifiedTime: 1234, + ModifiedDate: 5678, + } + fi := fh.FileInfo() + fh2, err := FileInfoHeader(fi) + if err != nil { + t.Fatal(err) + } + if got, want := fh2.ModTime(), fh.ModTime(); got != want { + t.Errorf("Modified: got %s, want %s\n", got, want) + } + if got, want := fi.ModTime(), fh.ModTime(); got != want { + t.Errorf("Modified: got %s, want %s\n", got, want) + } +} + type repeatedByte struct { off int64 b byte -- GitLab From f70d457a366a498ff91c4fb8dd03eca576b898bb Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 8 Apr 2019 09:54:33 +0200 Subject: [PATCH 0729/1679] strings: unindent Fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CL 56470 unindented bytes.Fields, but not strings.Fields. Do so now to make it easier to diff the two functions for potential differences. Change-Id: Ifef81f50cee64e8277e91efa5ec5521d8d21d3bd Reviewed-on: https://go-review.googlesource.com/c/go/+/170951 Run-TryBot: Tobias Klauser Reviewed-by: Daniel Martí TryBot-Result: Gobot Gobot --- src/strings/strings.go | 54 +++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/strings/strings.go b/src/strings/strings.go index e14fffb2b8..5a126a7a19 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -341,38 +341,38 @@ func Fields(s string) []string { wasSpace = isSpace } - if setBits < utf8.RuneSelf { // ASCII fast path - a := make([]string, n) - na := 0 - fieldStart := 0 - i := 0 - // Skip spaces in the front of the input. - for i < len(s) && asciiSpace[s[i]] != 0 { + if setBits >= utf8.RuneSelf { + // Some runes in the input string are not ASCII. + return FieldsFunc(s, unicode.IsSpace) + } + // ASCII fast path + a := make([]string, n) + na := 0 + fieldStart := 0 + i := 0 + // Skip spaces in the front of the input. + for i < len(s) && asciiSpace[s[i]] != 0 { + i++ + } + fieldStart = i + for i < len(s) { + if asciiSpace[s[i]] == 0 { i++ + continue } - fieldStart = i - for i < len(s) { - if asciiSpace[s[i]] == 0 { - i++ - continue - } - a[na] = s[fieldStart:i] - na++ + a[na] = s[fieldStart:i] + na++ + i++ + // Skip spaces in between fields. + for i < len(s) && asciiSpace[s[i]] != 0 { i++ - // Skip spaces in between fields. - for i < len(s) && asciiSpace[s[i]] != 0 { - i++ - } - fieldStart = i - } - if fieldStart < len(s) { // Last field might end at EOF. - a[na] = s[fieldStart:] } - return a + fieldStart = i } - - // Some runes in the input string are not ASCII. - return FieldsFunc(s, unicode.IsSpace) + if fieldStart < len(s) { // Last field might end at EOF. + a[na] = s[fieldStart:] + } + return a } // FieldsFunc splits the string s at each run of Unicode code points c satisfying f(c) -- GitLab From 23d4c6cdd6712ba45ea4ec784bcb99cb883ab0ea Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 31 Jan 2019 16:57:29 +0000 Subject: [PATCH 0730/1679] runtime: merge codepaths in scavengeLargest This change just makes the code in scavengeLargest easier to reason about by reducing the number of exit points to the method. It should still be correct either way because the condition checked at the end (released > nbytes) will always be false if we return, but this just makes the code a little easier to maintain. Change-Id: If60da7696aca3fab3b5ddfc795d600d87c988238 Reviewed-on: https://go-review.googlesource.com/c/go/+/160617 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/mheap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 47e3a33391..8b7ed742c9 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -1381,7 +1381,7 @@ func (h *mheap) scavengeLargest(nbytes uintptr) { // This check also preserves the invariant that spans that have // `scavenged` set are only ever in the `scav` treap, and // those which have it unset are only in the `free` treap. - return + break } n := t.prev() h.free.erase(t) -- GitLab From 7bb8fc10331eacc34bd38dc557a3856c8923c605 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Mon, 11 Feb 2019 17:20:59 +0000 Subject: [PATCH 0731/1679] runtime: use iterator instead of raw node for treap find Right now the mTreap structure exposes the treapNode structure through only one interface: find. There's no reason (performance or otherwise) for exposing this, and we get a cleaner abstraction through the iterators this way. This change also makes it easier to make changes to the mTreap implementation without violating its interface. Change-Id: I5ef86b8ac81a47d05d8404df65af9ec5f419dc40 Reviewed-on: https://go-review.googlesource.com/c/go/+/164098 Reviewed-by: Austin Clements --- src/runtime/mgclarge.go | 12 ++++++------ src/runtime/mheap.go | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/runtime/mgclarge.go b/src/runtime/mgclarge.go index 7b01a11780..dba617c25d 100644 --- a/src/runtime/mgclarge.go +++ b/src/runtime/mgclarge.go @@ -295,13 +295,13 @@ func (root *mTreap) removeNode(t *treapNode) { mheap_.treapalloc.free(unsafe.Pointer(t)) } -// find searches for, finds, and returns the treap node containing the -// smallest span that can hold npages. If no span has at least npages -// it returns nil. +// find searches for, finds, and returns the treap iterator representing +// the position of the smallest span that can hold npages. If no span has +// at least npages it returns an invalid iterator. // This is slightly more complicated than a simple binary tree search // since if an exact match is not found the next larger node is // returned. -func (root *mTreap) find(npages uintptr) *treapNode { +func (root *mTreap) find(npages uintptr) treapIter { t := root.treap for t != nil { if t.spanKey == nil { @@ -312,10 +312,10 @@ func (root *mTreap) find(npages uintptr) *treapNode { } else if t.left != nil && t.left.npagesKey >= npages { t = t.left } else { - return t + return treapIter{t} } } - return nil + return treapIter{} } // removeSpan searches for, finds, deletes span along with diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 8b7ed742c9..e9cd62d7d8 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -1126,12 +1126,12 @@ func (h *mheap) pickFreeSpan(npage uintptr) *mspan { // Note that we want the _smaller_ free span, i.e. the free span // closer in size to the amount we requested (npage). var s *mspan - if tf != nil && (ts == nil || tf.spanKey.npages <= ts.spanKey.npages) { - s = tf.spanKey - h.free.removeNode(tf) - } else if ts != nil && (tf == nil || tf.spanKey.npages > ts.spanKey.npages) { - s = ts.spanKey - h.scav.removeNode(ts) + if tf.valid() && (!ts.valid() || tf.span().npages <= ts.span().npages) { + s = tf.span() + h.free.erase(tf) + } else if ts.valid() && (!tf.valid() || tf.span().npages > ts.span().npages) { + s = ts.span() + h.scav.erase(ts) } return s } -- GitLab From c46ebec322b4f61a219f73f3f0f590cf001a074d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 2 Apr 2019 15:00:54 -0700 Subject: [PATCH 0732/1679] cmd/compile: get rid of unnecessary inline marks If no other instruction mentions an inline mark, we can get rid of it. This normally happens when the inlined function is empty, or when all of its code is folded into other instructions. Also use consistent statement-ness for inline mark positions, so that more of them can be removed in favor of existing instructions. Update #29571 Fixes #31172 Change-Id: I71f84d355101f37a27960d9e8528f42f92767496 Reviewed-on: https://go-review.googlesource.com/c/go/+/170445 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/inl.go | 2 +- src/cmd/compile/internal/ssa/deadcode.go | 31 ++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 88c294173b..38be394bfb 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -1054,7 +1054,7 @@ func mkinlcall(n, fn *Node, maxCost int32) *Node { // to put a breakpoint. Not sure if that's really necessary or not // (in which case it could go at the end of the function instead). inlMark := nod(OINLMARK, nil, nil) - inlMark.Pos = n.Pos + inlMark.Pos = n.Pos.WithDefaultStmt() inlMark.Xoffset = int64(newIndex) ninit.Append(inlMark) diff --git a/src/cmd/compile/internal/ssa/deadcode.go b/src/cmd/compile/internal/ssa/deadcode.go index 3c0f8f858a..ceb2933766 100644 --- a/src/cmd/compile/internal/ssa/deadcode.go +++ b/src/cmd/compile/internal/ssa/deadcode.go @@ -76,6 +76,30 @@ func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value return } + // Record all the inline indexes we need + var liveInlIdx map[int]bool + pt := f.Config.ctxt.PosTable + for _, b := range f.Blocks { + for _, v := range b.Values { + i := pt.Pos(v.Pos).Base().InliningIndex() + if i < 0 { + continue + } + if liveInlIdx == nil { + liveInlIdx = map[int]bool{} + } + liveInlIdx[i] = true + } + i := pt.Pos(b.Pos).Base().InliningIndex() + if i < 0 { + continue + } + if liveInlIdx == nil { + liveInlIdx = map[int]bool{} + } + liveInlIdx[i] = true + } + // Find all live values q := f.Cache.deadcode.q[:0] defer func() { f.Cache.deadcode.q = q }() @@ -103,6 +127,13 @@ func liveValues(f *Func, reachable []bool) (live []bool, liveOrderStmts []*Value } if v.Type.IsVoid() && !live[v.ID] { // The only Void ops are nil checks and inline marks. We must keep these. + if v.Op == OpInlMark && !liveInlIdx[int(v.AuxInt)] { + // We don't need marks for bodies that + // have been completely optimized away. + // TODO: save marks only for bodies which + // have a faulting instruction or a call? + continue + } live[v.ID] = true q = append(q, v) if v.Pos.IsStmt() != src.PosNotStmt { -- GitLab From 081bc62d728c0dc47fb62d26936f297d50efc1f4 Mon Sep 17 00:00:00 2001 From: Daniel Theophanes Date: Sat, 6 Apr 2019 09:50:28 -0700 Subject: [PATCH 0733/1679] cmd/go: do not write output when -o is not specified, but folder with same name exists Fixes #31296 Change-Id: Ib8850fe22749ca0bf268614ba045ffe3fc68f5cc Reviewed-on: https://go-review.googlesource.com/c/go/+/171057 Run-TryBot: Daniel Theophanes TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/work/build.go | 5 +++++ src/cmd/go/testdata/script/build_multi_main.txt | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 96b3744444..15faf578f8 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -283,6 +283,8 @@ func runBuild(cmd *base.Command, args []string) { pkgs := load.PackagesForBuild(args) + explicitO := len(cfg.BuildO) > 0 + if len(pkgs) == 1 && pkgs[0].Name == "main" && cfg.BuildO == "" { cfg.BuildO = load.DefaultExecName(pkgs[0].ImportPath) cfg.BuildO += cfg.ExeSuffix @@ -320,6 +322,9 @@ func runBuild(cmd *base.Command, args []string) { // write all main packages to that directory. // Otherwise require only a single package be built. if fi, err := os.Stat(cfg.BuildO); err == nil && fi.IsDir() { + if !explicitO { + base.Fatalf("go build: build output %q already exists and is a directory", cfg.BuildO) + } a := &Action{Mode: "go build"} for _, p := range pkgs { if p.Name != "main" { diff --git a/src/cmd/go/testdata/script/build_multi_main.txt b/src/cmd/go/testdata/script/build_multi_main.txt index 734e8d88d2..89fe2bec13 100644 --- a/src/cmd/go/testdata/script/build_multi_main.txt +++ b/src/cmd/go/testdata/script/build_multi_main.txt @@ -7,6 +7,9 @@ go build -o $WORK/bin ./cmd/c1 ./cmd/c2 ! go build -o $WORK/bin ./pkg1 ./pkg1 stderr 'no main packages' +! go build ./cmd/c1 +stderr 'already exists and is a directory' + -- go.mod -- module exmod @@ -25,3 +28,6 @@ package pkg1 -- pkg2/pkg2.go -- package pkg2 + +-- c1$exe/keep.txt -- +Create c1 directory. -- GitLab From 00530918db29102a0186bcf2b3e699a742d298fa Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 8 Apr 2019 15:45:16 +0200 Subject: [PATCH 0734/1679] misc/cgo/testcshared: use adb exec-out instead of adb shell Adb exec-out is like adb shell except non-flaky in non-interactive settings. Don't ask why. Change-Id: I7ac3c72912883d80bc787c1d0fc101db6bae9c52 Reviewed-on: https://go-review.googlesource.com/c/go/+/170952 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/testcshared/cshared_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index 8c4c3c7e57..8dac639042 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -46,7 +46,7 @@ func testMain(m *testing.M) int { androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid()) if GOOS == "android" { - args := append(adbCmd(), "shell", "mkdir", "-p", androiddir) + args := append(adbCmd(), "exec-out", "mkdir", "-p", androiddir) cmd := exec.Command(args[0], args[1:]...) out, err := cmd.CombinedOutput() if err != nil { @@ -191,7 +191,7 @@ func adbRun(t *testing.T, env []string, adbargs ...string) string { if GOOS != "android" { t.Fatalf("trying to run adb command when operating system is not android.") } - args := append(adbCmd(), "shell") + args := append(adbCmd(), "exec-out") // Propagate LD_LIBRARY_PATH to the adb shell invocation. for _, e := range env { if strings.Index(e, "LD_LIBRARY_PATH=") != -1 { @@ -298,7 +298,7 @@ func cleanupAndroid() { if GOOS != "android" { return } - args := append(adbCmd(), "shell", "rm", "-rf", androiddir) + args := append(adbCmd(), "exec-out", "rm", "-rf", androiddir) cmd := exec.Command(args[0], args[1:]...) out, err := cmd.CombinedOutput() if err != nil { -- GitLab From 81c7beb04eda3ecc97e723793e11c61732ff37e8 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 16:58:13 +0200 Subject: [PATCH 0735/1679] cmd/dist: set buildmode=pie on Android Android refuses to run non-PIE binaries, a restriction already encoded in the cmd/go tool's buildModeInit function. This CL adds the necessary flags to cmd/dist to make ./make.bash run on an Android device. Change-Id: I162084f573befaa41dcb47a2b78448bce5b83d35 Reviewed-on: https://go-review.googlesource.com/c/go/+/170943 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Emmanuel Odeke --- src/cmd/dist/build.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index e5d4b2458a..fec3b2cedc 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -657,7 +657,11 @@ func runInstall(dir string, ch chan struct{}) { if elem == "go" { elem = "go_bootstrap" } - link = []string{pathf("%s/link", tooldir), "-o", pathf("%s/%s%s", tooldir, elem, exe)} + link = []string{pathf("%s/link", tooldir)} + if goos == "android" { + link = append(link, "-buildmode=pie") + } + link = append(link, "-o", pathf("%s/%s%s", tooldir, elem, exe)) targ = len(link) - 1 } ttarg := mtime(link[targ]) @@ -862,6 +866,9 @@ func runInstall(dir string, ch chan struct{}) { // compiler to generate ABI wrappers for everything. compile = append(compile, "-allabis") } + if goos == "android" { + compile = append(compile, "-shared") + } compile = append(compile, gofiles...) var wg sync.WaitGroup -- GitLab From bec67e1130db10dc901c5b214c7df081ed4191ab Mon Sep 17 00:00:00 2001 From: Jingnan Si Date: Mon, 8 Apr 2019 19:02:40 +0000 Subject: [PATCH 0736/1679] runtime: follow Windows calling convention for _cgo_sys_thread_create Windows requires space for four pointers on the stack. Change-Id: I9f7ba3e09b6c660f86d15139bb51954fffc8ccb1 GitHub-Last-Rev: 76d21bcc2b07edfde6daa45000093d070e2337bc GitHub-Pull-Request: golang/go#30944 Reviewed-on: https://go-review.googlesource.com/c/go/+/168351 Reviewed-by: Ian Lance Taylor --- src/runtime/rt0_windows_amd64.s | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/runtime/rt0_windows_amd64.s b/src/runtime/rt0_windows_amd64.s index 1604711cdb..345e141802 100644 --- a/src/runtime/rt0_windows_amd64.s +++ b/src/runtime/rt0_windows_amd64.s @@ -14,12 +14,14 @@ TEXT _rt0_amd64_windows(SB),NOSPLIT,$-8 // library is loaded. For static libraries it is called when the // final executable starts, during the C runtime initialization // phase. -TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x28 - MOVQ BP, 0x00(SP) - MOVQ BX, 0x08(SP) - MOVQ AX, 0x10(SP) - MOVQ CX, 0x18(SP) - MOVQ DX, 0x20(SP) +// Leave space for four pointers on the stack as required +// by the Windows amd64 calling convention. +TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x48 + MOVQ BP, 0x20(SP) + MOVQ BX, 0x28(SP) + MOVQ AX, 0x30(SP) + MOVQ CX, 0x38(SP) + MOVQ DX, 0x40(SP) // Create a new thread to do the runtime initialization and return. MOVQ _cgo_sys_thread_create(SB), AX @@ -27,11 +29,11 @@ TEXT _rt0_amd64_windows_lib(SB),NOSPLIT,$0x28 MOVQ $0, DX CALL AX - MOVQ 0x00(SP), BP - MOVQ 0x08(SP), BX - MOVQ 0x10(SP), AX - MOVQ 0x18(SP), CX - MOVQ 0x20(SP), DX + MOVQ 0x20(SP), BP + MOVQ 0x28(SP), BX + MOVQ 0x30(SP), AX + MOVQ 0x38(SP), CX + MOVQ 0x40(SP), DX RET TEXT _rt0_amd64_windows_lib_go(SB),NOSPLIT,$0 -- GitLab From 8759b4d3843494b60dd9d58458b4f2774baf5fcb Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Mon, 8 Apr 2019 15:43:32 -0400 Subject: [PATCH 0737/1679] doc: document Go 1.12.3 Change-Id: I84c9a8ddbd3101dd478e4a8a4e191863e68c6af6 Reviewed-on: https://go-review.googlesource.com/c/go/+/171140 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index a978ddccd5..a9ab9cc2d9 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -48,6 +48,14 @@ command, the runtime, and the doc, net, 1.12.2 milestone on our issue tracker for details.

    +

    +go1.12.3 (released 2019/04/08) fixes an issue where using the prebuilt binary +releases on older versions of GNU/Linux +led to failures +when linking programs that used cgo. +Only Linux users who hit this issue need to update. +

    +

    go1.11 (released 2018/08/24)

    -- GitLab From 739a78f2b8de3139ec253719d0a688c08b8e5324 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Mon, 8 Apr 2019 15:42:30 -0400 Subject: [PATCH 0738/1679] doc: document Go 1.11.8 Change-Id: Ia06f7005f466e55a22c76bf2b47d74ee8eb77dd1 Reviewed-on: https://go-review.googlesource.com/c/go/+/171139 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/release.html b/doc/devel/release.html index a9ab9cc2d9..c622cb17c5 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -121,6 +121,14 @@ go1.11.7 (released 2019/04/05) includes fixes to the runtime and the 1.11.7 milestone on our issue tracker for details.

    +

    +go1.11.8 (released 2019/04/08) fixes an issue where using the prebuilt binary +releases on older versions of GNU/Linux +led to failures +when linking programs that used cgo. +Only Linux users who hit this issue need to update. +

    +

    go1.10 (released 2018/02/16)

    -- GitLab From 6f512c8d6696b288372c48c19058bbe9dcb79da0 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Mon, 8 Apr 2019 16:07:49 -0400 Subject: [PATCH 0739/1679] doc: correct link in 1.11.8 notes Change-Id: I09e0c2720ec0a51dc73c24b4550a749448656025 Reviewed-on: https://go-review.googlesource.com/c/go/+/171143 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/release.html b/doc/devel/release.html index c622cb17c5..a4069be407 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -124,7 +124,7 @@ go1.11.7 (released 2019/04/05) includes fixes to the runtime and the

    go1.11.8 (released 2019/04/08) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux -led to failures +led to failures when linking programs that used cgo. Only Linux users who hit this issue need to update.

    -- GitLab From 973c0312e36fd56b6b2111a07a19de63e0dcbf03 Mon Sep 17 00:00:00 2001 From: Andrew Bonventre Date: Mon, 8 Apr 2019 16:09:15 -0400 Subject: [PATCH 0740/1679] doc: correct link in 1.12.3 notes Change-Id: I6dd60ea7b8a8756be97503e163c2386af16e4e12 Reviewed-on: https://go-review.googlesource.com/c/go/+/171144 Reviewed-by: Brad Fitzpatrick --- doc/devel/release.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/release.html b/doc/devel/release.html index a4069be407..2a7a499024 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -51,7 +51,7 @@ command, the runtime, and the doc, net,

    go1.12.3 (released 2019/04/08) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux -led to failures +led to failures when linking programs that used cgo. Only Linux users who hit this issue need to update.

    -- GitLab From f18c31a49c1105be0341b32392a433cf65f227da Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 8 Apr 2019 17:57:53 +0200 Subject: [PATCH 0741/1679] runtime,runtime/cgo: set up TLS storage for Android Q without cgo Android Q frees a static TLS slot for us to use. Use the offset of that slot as the default for our TLS offset. As a result, runtime/cgo is no more a requirement for Android Q and newer. Updates #31343 Updates #29674 Change-Id: I759049b2e2865bd3d4fdc05a8cfc6db8b0da1f5d Reviewed-on: https://go-review.googlesource.com/c/go/+/170955 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/runtime/asm_386.s | 3 +++ src/runtime/asm_amd64.s | 3 +++ src/runtime/cgo/gcc_android.c | 8 ++++++-- src/runtime/tls_arm.s | 5 +++++ src/runtime/tls_arm64.s | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 8995436184..61aae47c08 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -1564,5 +1564,8 @@ TEXT runtime·panicExtendSlice3CU(SB),NOSPLIT,$0-12 JMP runtime·goPanicExtendSlice3CU(SB) #ifdef GOOS_android +// Use the free TLS_SLOT_APP slot #2 on Android Q. +// Earlier androids are set up in gcc_android.c. +DATA runtime·tls_g+0(SB)/4, $8 GLOBL runtime·tls_g+0(SB), NOPTR, $4 #endif diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index 149b04dfdf..7b2fdf0d3d 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -1713,5 +1713,8 @@ TEXT runtime·panicSlice3CU(SB),NOSPLIT,$0-16 JMP runtime·goPanicSlice3CU(SB) #ifdef GOOS_android +// Use the free TLS_SLOT_APP slot #2 on Android Q. +// Earlier androids are set up in gcc_android.c. +DATA runtime·tls_g+0(SB)/8, $16 GLOBL runtime·tls_g+0(SB), NOPTR, $8 #endif diff --git a/src/runtime/cgo/gcc_android.c b/src/runtime/cgo/gcc_android.c index 5075023282..321a5150b9 100644 --- a/src/runtime/cgo/gcc_android.c +++ b/src/runtime/cgo/gcc_android.c @@ -47,7 +47,7 @@ inittls(void **tlsg, void **tlsbase) { pthread_key_t k; int i, err; - void *handle, *get_ver; + void *handle, *get_ver, *off; // Check for Android Q where we can use the free TLS_SLOT_APP slot. handle = dlopen("libc.so", RTLD_LAZY); @@ -60,7 +60,11 @@ inittls(void **tlsg, void **tlsbase) get_ver = dlsym(handle, "android_get_device_api_level"); dlclose(handle); if (get_ver != NULL) { - *tlsg = (void *)(TLS_SLOT_APP*sizeof(void *)); + off = (void *)(TLS_SLOT_APP*sizeof(void *)); + // tlsg is initialized to Q's free TLS slot. Verify it while we're here. + if (*tlsg != off) { + fatalf("tlsg offset wrong, got %ld want %ld\n", *tlsg, off); + } return; } diff --git a/src/runtime/tls_arm.s b/src/runtime/tls_arm.s index 400c16a177..9b8855e170 100644 --- a/src/runtime/tls_arm.s +++ b/src/runtime/tls_arm.s @@ -103,6 +103,11 @@ TEXT setg_gcc<>(SB),NOSPLIT,$0 B runtime·save_g(SB) #ifdef TLSG_IS_VARIABLE +#ifdef GOOS_android +// Use the free TLS_SLOT_APP slot #2 on Android Q. +// Earlier androids are set up in gcc_android.c. +DATA runtime·tls_g+0(SB)/4, $8 +#endif GLOBL runtime·tls_g+0(SB), NOPTR, $4 #else GLOBL runtime·tls_g+0(SB), TLSBSS, $4 diff --git a/src/runtime/tls_arm64.s b/src/runtime/tls_arm64.s index 62ae6faf21..fb8627db29 100644 --- a/src/runtime/tls_arm64.s +++ b/src/runtime/tls_arm64.s @@ -43,6 +43,11 @@ nocgo: RET #ifdef TLSG_IS_VARIABLE +#ifdef GOOS_android +// Use the free TLS_SLOT_APP slot #2 on Android Q. +// Earlier androids are set up in gcc_android.c. +DATA runtime·tls_g+0(SB)/8, $16 +#endif GLOBL runtime·tls_g+0(SB), NOPTR, $8 #else GLOBL runtime·tls_g+0(SB), TLSBSS, $8 -- GitLab From e4665da9bcdd4e9136c7ed97ab4253def130b89d Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sun, 7 Apr 2019 15:02:31 +0200 Subject: [PATCH 0742/1679] cmd/go/internal/work: make toolchain builds reproducible when buildmode=pie When buildmode=pie, external linking is forced, and our toolchain build id will be included in the external build id, resulting in the building of a toolchain tool will never reach a fixed point id. More importantly, this change will make make.bash converge on self-hosted Android builds (Android refuses to run non-PIE executables). Fixes #31320 Updates #18968 Change-Id: Icb5db9f4b1b688afe37f4dafe261ffda580fa4e7 Reviewed-on: https://go-review.googlesource.com/c/go/+/170942 Run-TryBot: Elias Naur TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/work/gc.go | 9 ++++++++- src/cmd/internal/sys/supported.go | 8 ++++++++ src/cmd/link/internal/ld/config.go | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/cmd/go/internal/work/gc.go b/src/cmd/go/internal/work/gc.go index cdd0989a93..1721ecbc4e 100644 --- a/src/cmd/go/internal/work/gc.go +++ b/src/cmd/go/internal/work/gc.go @@ -21,6 +21,7 @@ import ( "cmd/go/internal/load" "cmd/go/internal/str" "cmd/internal/objabi" + "cmd/internal/sys" "crypto/sha1" ) @@ -525,7 +526,13 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string) // Store BuildID inside toolchain binaries as a unique identifier of the // tool being run, for use by content-based staleness determination. if root.Package.Goroot && strings.HasPrefix(root.Package.ImportPath, "cmd/") { - ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID) + // When buildmode=pie, external linking will include our build + // id in the external linker's build id, which will cause our + // build id to not match the next time the tool is built. + // Rely on the external build id instead. + if ldBuildmode != "pie" || !sys.PIEDefaultsToExternalLink(cfg.Goos, cfg.Goarch) { + ldflags = append(ldflags, "-X=cmd/internal/objabi.buildID="+root.buildID) + } } // If the user has not specified the -extld option, then specify the diff --git a/src/cmd/internal/sys/supported.go b/src/cmd/internal/sys/supported.go index a53da6ed2c..c963971f59 100644 --- a/src/cmd/internal/sys/supported.go +++ b/src/cmd/internal/sys/supported.go @@ -27,3 +27,11 @@ func MSanSupported(goos, goarch string) bool { return false } } + +// PIEDefaultsToExternalLink reports whether goos/goarch defaults +// to external linking for buildmode=pie. +func PIEDefaultsToExternalLink(goos, goarch string) bool { + // Currently all systems external link PIE binaries. + // See https://golang.org/issue/18968. + return true +} diff --git a/src/cmd/link/internal/ld/config.go b/src/cmd/link/internal/ld/config.go index 85842f2fa2..b404f1897d 100644 --- a/src/cmd/link/internal/ld/config.go +++ b/src/cmd/link/internal/ld/config.go @@ -256,8 +256,8 @@ func determineLinkMode(ctxt *Link) { ctxt.LinkMode = LinkExternal } else if iscgo && externalobj { ctxt.LinkMode = LinkExternal - } else if ctxt.BuildMode == BuildModePIE { - ctxt.LinkMode = LinkExternal // https://golang.org/issue/18968 + } else if ctxt.BuildMode == BuildModePIE && sys.PIEDefaultsToExternalLink(objabi.GOOS, objabi.GOARCH) { + ctxt.LinkMode = LinkExternal } else { ctxt.LinkMode = LinkInternal } -- GitLab From 336f951b07645e3c5ce8d624b1af0dcd5a80b948 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 5 Apr 2019 16:43:08 -0700 Subject: [PATCH 0743/1679] cmd/compile: add ORESULT, remove OINDREGSP This change is mostly cosmetic. OINDREGSP was used only for reading the results of a function call. In recognition of that fact, rename it to ORESULT. Along the way, trim down our handling of it to the bare minimum, and rely on the increased clarity of ORESULT to inline nodarg. Passes toolstash-check. Change-Id: I25b177df4ea54a8e94b1698d044c297b7e453c64 Reviewed-on: https://go-review.googlesource.com/c/go/+/170705 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/fmt.go | 3 - src/cmd/compile/internal/gc/op_string.go | 164 ++++++++++++++++++++++- src/cmd/compile/internal/gc/ssa.go | 7 +- src/cmd/compile/internal/gc/syntax.go | 4 +- src/cmd/compile/internal/gc/walk.go | 35 +---- 5 files changed, 174 insertions(+), 39 deletions(-) diff --git a/src/cmd/compile/internal/gc/fmt.go b/src/cmd/compile/internal/gc/fmt.go index 67b521feed..72b1e35b6a 100644 --- a/src/cmd/compile/internal/gc/fmt.go +++ b/src/cmd/compile/internal/gc/fmt.go @@ -1579,9 +1579,6 @@ func (n *Node) nodedump(s fmt.State, flag FmtFlag, mode fmtMode) { default: mode.Fprintf(s, "%v%j", n.Op, n) - case OINDREGSP: - mode.Fprintf(s, "%v-SP%j", n.Op, n) - case OLITERAL: mode.Fprintf(s, "%v-%v%j", n.Op, n.Val(), n) diff --git a/src/cmd/compile/internal/gc/op_string.go b/src/cmd/compile/internal/gc/op_string.go index af55df68a3..d8910e7d06 100644 --- a/src/cmd/compile/internal/gc/op_string.go +++ b/src/cmd/compile/internal/gc/op_string.go @@ -4,9 +4,169 @@ package gc import "strconv" -const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNEWOBJNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVEINDREGSPINLMARKRETJMPGETGEND" +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[OXXX-0] + _ = x[ONAME-1] + _ = x[ONONAME-2] + _ = x[OTYPE-3] + _ = x[OPACK-4] + _ = x[OLITERAL-5] + _ = x[OADD-6] + _ = x[OSUB-7] + _ = x[OOR-8] + _ = x[OXOR-9] + _ = x[OADDSTR-10] + _ = x[OADDR-11] + _ = x[OANDAND-12] + _ = x[OAPPEND-13] + _ = x[OBYTES2STR-14] + _ = x[OBYTES2STRTMP-15] + _ = x[ORUNES2STR-16] + _ = x[OSTR2BYTES-17] + _ = x[OSTR2BYTESTMP-18] + _ = x[OSTR2RUNES-19] + _ = x[OAS-20] + _ = x[OAS2-21] + _ = x[OAS2FUNC-22] + _ = x[OAS2RECV-23] + _ = x[OAS2MAPR-24] + _ = x[OAS2DOTTYPE-25] + _ = x[OASOP-26] + _ = x[OCALL-27] + _ = x[OCALLFUNC-28] + _ = x[OCALLMETH-29] + _ = x[OCALLINTER-30] + _ = x[OCALLPART-31] + _ = x[OCAP-32] + _ = x[OCLOSE-33] + _ = x[OCLOSURE-34] + _ = x[OCOMPLIT-35] + _ = x[OMAPLIT-36] + _ = x[OSTRUCTLIT-37] + _ = x[OARRAYLIT-38] + _ = x[OSLICELIT-39] + _ = x[OPTRLIT-40] + _ = x[OCONV-41] + _ = x[OCONVIFACE-42] + _ = x[OCONVNOP-43] + _ = x[OCOPY-44] + _ = x[ODCL-45] + _ = x[ODCLFUNC-46] + _ = x[ODCLFIELD-47] + _ = x[ODCLCONST-48] + _ = x[ODCLTYPE-49] + _ = x[ODELETE-50] + _ = x[ODOT-51] + _ = x[ODOTPTR-52] + _ = x[ODOTMETH-53] + _ = x[ODOTINTER-54] + _ = x[OXDOT-55] + _ = x[ODOTTYPE-56] + _ = x[ODOTTYPE2-57] + _ = x[OEQ-58] + _ = x[ONE-59] + _ = x[OLT-60] + _ = x[OLE-61] + _ = x[OGE-62] + _ = x[OGT-63] + _ = x[ODEREF-64] + _ = x[OINDEX-65] + _ = x[OINDEXMAP-66] + _ = x[OKEY-67] + _ = x[OSTRUCTKEY-68] + _ = x[OLEN-69] + _ = x[OMAKE-70] + _ = x[OMAKECHAN-71] + _ = x[OMAKEMAP-72] + _ = x[OMAKESLICE-73] + _ = x[OMUL-74] + _ = x[ODIV-75] + _ = x[OMOD-76] + _ = x[OLSH-77] + _ = x[ORSH-78] + _ = x[OAND-79] + _ = x[OANDNOT-80] + _ = x[ONEW-81] + _ = x[ONEWOBJ-82] + _ = x[ONOT-83] + _ = x[OBITNOT-84] + _ = x[OPLUS-85] + _ = x[ONEG-86] + _ = x[OOROR-87] + _ = x[OPANIC-88] + _ = x[OPRINT-89] + _ = x[OPRINTN-90] + _ = x[OPAREN-91] + _ = x[OSEND-92] + _ = x[OSLICE-93] + _ = x[OSLICEARR-94] + _ = x[OSLICESTR-95] + _ = x[OSLICE3-96] + _ = x[OSLICE3ARR-97] + _ = x[OSLICEHEADER-98] + _ = x[ORECOVER-99] + _ = x[ORECV-100] + _ = x[ORUNESTR-101] + _ = x[OSELRECV-102] + _ = x[OSELRECV2-103] + _ = x[OIOTA-104] + _ = x[OREAL-105] + _ = x[OIMAG-106] + _ = x[OCOMPLEX-107] + _ = x[OALIGNOF-108] + _ = x[OOFFSETOF-109] + _ = x[OSIZEOF-110] + _ = x[OBLOCK-111] + _ = x[OBREAK-112] + _ = x[OCASE-113] + _ = x[OXCASE-114] + _ = x[OCONTINUE-115] + _ = x[ODEFER-116] + _ = x[OEMPTY-117] + _ = x[OFALL-118] + _ = x[OFOR-119] + _ = x[OFORUNTIL-120] + _ = x[OGOTO-121] + _ = x[OIF-122] + _ = x[OLABEL-123] + _ = x[OGO-124] + _ = x[ORANGE-125] + _ = x[ORETURN-126] + _ = x[OSELECT-127] + _ = x[OSWITCH-128] + _ = x[OTYPESW-129] + _ = x[OTCHAN-130] + _ = x[OTMAP-131] + _ = x[OTSTRUCT-132] + _ = x[OTINTER-133] + _ = x[OTFUNC-134] + _ = x[OTARRAY-135] + _ = x[ODDD-136] + _ = x[ODDDARG-137] + _ = x[OINLCALL-138] + _ = x[OEFACE-139] + _ = x[OITAB-140] + _ = x[OIDATA-141] + _ = x[OSPTR-142] + _ = x[OCLOSUREVAR-143] + _ = x[OCFUNC-144] + _ = x[OCHECKNIL-145] + _ = x[OVARDEF-146] + _ = x[OVARKILL-147] + _ = x[OVARLIVE-148] + _ = x[ORESULT-149] + _ = x[OINLMARK-150] + _ = x[ORETJMP-151] + _ = x[OGETG-152] + _ = x[OEND-153] +} + +const _Op_name = "XXXNAMENONAMETYPEPACKLITERALADDSUBORXORADDSTRADDRANDANDAPPENDBYTES2STRBYTES2STRTMPRUNES2STRSTR2BYTESSTR2BYTESTMPSTR2RUNESASAS2AS2FUNCAS2RECVAS2MAPRAS2DOTTYPEASOPCALLCALLFUNCCALLMETHCALLINTERCALLPARTCAPCLOSECLOSURECOMPLITMAPLITSTRUCTLITARRAYLITSLICELITPTRLITCONVCONVIFACECONVNOPCOPYDCLDCLFUNCDCLFIELDDCLCONSTDCLTYPEDELETEDOTDOTPTRDOTMETHDOTINTERXDOTDOTTYPEDOTTYPE2EQNELTLEGEGTDEREFINDEXINDEXMAPKEYSTRUCTKEYLENMAKEMAKECHANMAKEMAPMAKESLICEMULDIVMODLSHRSHANDANDNOTNEWNEWOBJNOTBITNOTPLUSNEGORORPANICPRINTPRINTNPARENSENDSLICESLICEARRSLICESTRSLICE3SLICE3ARRSLICEHEADERRECOVERRECVRUNESTRSELRECVSELRECV2IOTAREALIMAGCOMPLEXALIGNOFOFFSETOFSIZEOFBLOCKBREAKCASEXCASECONTINUEDEFEREMPTYFALLFORFORUNTILGOTOIFLABELGORANGERETURNSELECTSWITCHTYPESWTCHANTMAPTSTRUCTTINTERTFUNCTARRAYDDDDDDARGINLCALLEFACEITABIDATASPTRCLOSUREVARCFUNCCHECKNILVARDEFVARKILLVARLIVERESULTINLMARKRETJMPGETGEND" -var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 469, 472, 478, 482, 485, 489, 494, 499, 505, 510, 514, 519, 527, 535, 541, 550, 561, 568, 572, 579, 586, 594, 598, 602, 606, 613, 620, 628, 634, 639, 644, 648, 653, 661, 666, 671, 675, 678, 686, 690, 692, 697, 699, 704, 710, 716, 722, 728, 733, 737, 744, 750, 755, 761, 764, 770, 777, 782, 786, 791, 795, 805, 810, 818, 824, 831, 838, 846, 853, 859, 863, 866} +var _Op_index = [...]uint16{0, 3, 7, 13, 17, 21, 28, 31, 34, 36, 39, 45, 49, 55, 61, 70, 82, 91, 100, 112, 121, 123, 126, 133, 140, 147, 157, 161, 165, 173, 181, 190, 198, 201, 206, 213, 220, 226, 235, 243, 251, 257, 261, 270, 277, 281, 284, 291, 299, 307, 314, 320, 323, 329, 336, 344, 348, 355, 363, 365, 367, 369, 371, 373, 375, 380, 385, 393, 396, 405, 408, 412, 420, 427, 436, 439, 442, 445, 448, 451, 454, 460, 463, 469, 472, 478, 482, 485, 489, 494, 499, 505, 510, 514, 519, 527, 535, 541, 550, 561, 568, 572, 579, 586, 594, 598, 602, 606, 613, 620, 628, 634, 639, 644, 648, 653, 661, 666, 671, 675, 678, 686, 690, 692, 697, 699, 704, 710, 716, 722, 728, 733, 737, 744, 750, 755, 761, 764, 770, 777, 782, 786, 791, 795, 805, 810, 818, 824, 831, 838, 844, 851, 857, 861, 864} func (i Op) String() string { if i >= Op(len(_Op_index)-1) { diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index dd056afcca..6c06362385 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2276,7 +2276,7 @@ func (s *state) expr(n *Node) *ssa.Value { case OADDR: return s.addr(n.Left, n.Bounded()) - case OINDREGSP: + case ORESULT: addr := s.constOffPtrSP(types.NewPtr(n.Type), n.Xoffset) return s.load(n.Type, addr) @@ -3929,9 +3929,8 @@ func (s *state) addr(n *Node, bounded bool) *ssa.Value { s.Fatalf("variable address class %v not implemented", n.Class()) return nil } - case OINDREGSP: - // indirect off REGSP - // used for storing/loading arguments/returns to/from callees + case ORESULT: + // load return from callee return s.constOffPtrSP(t, n.Xoffset) case OINDEX: if n.Left.Type.IsSlice() { diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 278633489e..12bc9c3ae6 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -43,7 +43,7 @@ type Node struct { // Various. Usually an offset into a struct. For example: // - ONAME nodes that refer to local variables use it to identify their stack frame position. - // - ODOT, ODOTPTR, and OINDREGSP use it to indicate offset relative to their base address. + // - ODOT, ODOTPTR, and ORESULT use it to indicate offset relative to their base address. // - OSTRUCTKEY uses it to store the named field's offset. // - Named OLITERALs use it to store their ambient iota value. // - OINLMARK stores an index into the inlTree data structure. @@ -751,7 +751,7 @@ const ( OVARDEF // variable is about to be fully initialized OVARKILL // variable is dead OVARLIVE // variable is alive - OINDREGSP // offset plus indirect of REGSP, such as 8(SP). + ORESULT // result of a function call; Xoffset is stack offset OINLMARK // start of an inlined body, with file/line of caller. Xoffset is an index into the inline tree. // arch-specific opcodes diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 3533a3e230..be4f9ab5c0 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -481,7 +481,7 @@ opswitch: Dump("walk", n) Fatalf("walkexpr: switch 1 unknown op %+S", n) - case ONONAME, OINDREGSP, OEMPTY, OGETG, ONEWOBJ: + case ONONAME, OEMPTY, OGETG, ONEWOBJ: case OTYPE, ONAME, OLITERAL: // TODO(mdempsky): Just return n; see discussion on CL 38655. @@ -1674,7 +1674,12 @@ func ascompatet(nl Nodes, nr *types.Type) []*Node { l = tmp } - a := nod(OAS, l, nodarg(r)) + res := nod(ORESULT, nil, nil) + res.Xoffset = Ctxt.FixedFrameSize() + r.Offset + res.Type = r.Type + res.SetTypecheck(1) + + a := nod(OAS, l, res) a = convas(a, &nn) updateHasCall(a) if a.HasCall() { @@ -1687,32 +1692,6 @@ func ascompatet(nl Nodes, nr *types.Type) []*Node { return append(nn.Slice(), mm.Slice()...) } -// nodarg returns a Node for the function argument f. -// f is a *types.Field within a struct *types.Type. -// -// The node is for use by a caller invoking the given -// function, preparing the arguments before the call -// or retrieving the results after the call. -// In this case, the node will correspond to an outgoing argument -// slot like 8(SP). -func nodarg(f *types.Field) *Node { - // Build fake name for individual variable. - n := newname(lookup("__")) - n.Type = f.Type - if f.Offset == BADWIDTH { - Fatalf("nodarg: offset not computed for %v", f) - } - n.Xoffset = f.Offset - n.Orig = asNode(f.Nname) - - // preparing arguments for call - n.Op = OINDREGSP - n.Xoffset += Ctxt.FixedFrameSize() - n.SetTypecheck(1) - n.SetAddrtaken(true) // keep optimizers at bay - return n -} - // package all the arguments that match a ... T parameter into a []T. func mkdotargslice(typ *types.Type, args []*Node, init *Nodes, ddd *Node) *Node { esc := uint16(EscUnknown) -- GitLab From 7756a72b35e10a4cd03772ed852f2b3214971469 Mon Sep 17 00:00:00 2001 From: Neven Sajko Date: Sat, 30 Mar 2019 19:45:46 +0000 Subject: [PATCH 0744/1679] all: change the old assembly style AX:CX to CX, AX Assembly files with "/vendor/" or "testdata" in their paths were ignored. Change-Id: I3882ff07eb4426abb9f8ee96f82dff73c81cd61f GitHub-Last-Rev: 51ae8c324d72a12a059272fcf8568e670bfaf21b GitHub-Pull-Request: golang/go#31166 Reviewed-on: https://go-review.googlesource.com/c/go/+/170197 Reviewed-by: Brad Fitzpatrick Reviewed-by: Josh Bleecher Snyder Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/crypto/elliptic/p256_asm_amd64.s | 8 ++++---- src/math/big/arith_386.s | 8 ++++---- src/math/big/arith_amd64.s | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/crypto/elliptic/p256_asm_amd64.s b/src/crypto/elliptic/p256_asm_amd64.s index a4e3757977..7afa54a58c 100644 --- a/src/crypto/elliptic/p256_asm_amd64.s +++ b/src/crypto/elliptic/p256_asm_amd64.s @@ -2300,10 +2300,10 @@ TEXT ·p256PointDoubleAsm(SB),NOSPLIT,$256-48 CMOVQEQ t3, acc7 ANDQ t0, mul0 - SHRQ $1, acc4:acc5 - SHRQ $1, acc5:acc6 - SHRQ $1, acc6:acc7 - SHRQ $1, acc7:mul0 + SHRQ $1, acc5, acc4 + SHRQ $1, acc6, acc5 + SHRQ $1, acc7, acc6 + SHRQ $1, mul0, acc7 ST (y) ///////////////////////// LDacc (x) diff --git a/src/math/big/arith_386.s b/src/math/big/arith_386.s index 864fbc554e..f61da2aba7 100644 --- a/src/math/big/arith_386.s +++ b/src/math/big/arith_386.s @@ -136,7 +136,7 @@ TEXT ·shlVU(SB),NOSPLIT,$0 MOVL s+24(FP), CX MOVL (SI)(BX*4), AX // w1 = x[n-1] MOVL $0, DX - SHLL CX, DX:AX // w1>>ŝ + SHLL CX, AX, DX // w1>>ŝ MOVL DX, c+28(FP) CMPL BX, $0 @@ -145,7 +145,7 @@ TEXT ·shlVU(SB),NOSPLIT,$0 // i > 0 L8: MOVL AX, DX // w = w1 MOVL -4(SI)(BX*4), AX // w1 = x[i-1] - SHLL CX, DX:AX // w<>ŝ + SHLL CX, AX, DX // w<>ŝ MOVL DX, (DI)(BX*4) // z[i] = w<>ŝ SUBL $1, BX // i-- JG L8 // i > 0 @@ -171,7 +171,7 @@ TEXT ·shrVU(SB),NOSPLIT,$0 MOVL s+24(FP), CX MOVL (SI), AX // w1 = x[0] MOVL $0, DX - SHRL CX, DX:AX // w1<<ŝ + SHRL CX, AX, DX // w1<<ŝ MOVL DX, c+28(FP) MOVL $0, BX // i = 0 @@ -180,7 +180,7 @@ TEXT ·shrVU(SB),NOSPLIT,$0 // i < n-1 L9: MOVL AX, DX // w = w1 MOVL 4(SI)(BX*4), AX // w1 = x[i+1] - SHRL CX, DX:AX // w>>s | w1<<ŝ + SHRL CX, AX, DX // w>>s | w1<<ŝ MOVL DX, (DI)(BX*4) // z[i] = w>>s | w1<<ŝ ADDL $1, BX // i++ diff --git a/src/math/big/arith_amd64.s b/src/math/big/arith_amd64.s index a0d1660f51..b75639f540 100644 --- a/src/math/big/arith_amd64.s +++ b/src/math/big/arith_amd64.s @@ -264,7 +264,7 @@ TEXT ·shlVU(SB),NOSPLIT,$0 MOVQ s+48(FP), CX MOVQ (R8)(BX*8), AX // w1 = x[n-1] MOVQ $0, DX - SHLQ CX, DX:AX // w1>>ŝ + SHLQ CX, AX, DX // w1>>ŝ MOVQ DX, c+56(FP) CMPQ BX, $0 @@ -273,7 +273,7 @@ TEXT ·shlVU(SB),NOSPLIT,$0 // i > 0 L8: MOVQ AX, DX // w = w1 MOVQ -8(R8)(BX*8), AX // w1 = x[i-1] - SHLQ CX, DX:AX // w<>ŝ + SHLQ CX, AX, DX // w<>ŝ MOVQ DX, (R10)(BX*8) // z[i] = w<>ŝ SUBQ $1, BX // i-- JG L8 // i > 0 @@ -299,7 +299,7 @@ TEXT ·shrVU(SB),NOSPLIT,$0 MOVQ s+48(FP), CX MOVQ (R8), AX // w1 = x[0] MOVQ $0, DX - SHRQ CX, DX:AX // w1<<ŝ + SHRQ CX, AX, DX // w1<<ŝ MOVQ DX, c+56(FP) MOVQ $0, BX // i = 0 @@ -308,7 +308,7 @@ TEXT ·shrVU(SB),NOSPLIT,$0 // i < n-1 L9: MOVQ AX, DX // w = w1 MOVQ 8(R8)(BX*8), AX // w1 = x[i+1] - SHRQ CX, DX:AX // w>>s | w1<<ŝ + SHRQ CX, AX, DX // w>>s | w1<<ŝ MOVQ DX, (R10)(BX*8) // z[i] = w>>s | w1<<ŝ ADDQ $1, BX // i++ -- GitLab From 7ea4cd3fa9f081532eba1b3ac0587e65b47319c6 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Tue, 9 Apr 2019 10:00:38 +0900 Subject: [PATCH 0745/1679] cmd/cover: rename temporary directory prefix for consistency This change renames the temporary directory prefix for testing to go-testcover from gotestcover. It looks like other packages have the "go-" prefix for temporary directories, such as go-build, go-tool-dist and go-nettest. Change-Id: I91ab570d33c4c1bb48e6e01451a811272f6f8b77 Reviewed-on: https://go-review.googlesource.com/c/go/+/171100 Reviewed-by: Brad Fitzpatrick --- src/cmd/cover/cover_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/cover/cover_test.go b/src/cmd/cover/cover_test.go index bac448cd47..ea970a61da 100644 --- a/src/cmd/cover/cover_test.go +++ b/src/cmd/cover/cover_test.go @@ -81,7 +81,7 @@ var debug = flag.Bool("debug", false, "keep rewritten files for debugging") // We use TestMain to set up a temporary directory and remove it when // the tests are done. func TestMain(m *testing.M) { - dir, err := ioutil.TempDir("", "gotestcover") + dir, err := ioutil.TempDir("", "go-testcover") if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) -- GitLab From 2ab75c0f40fa452d275da896017cf7222fb7ca30 Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Tue, 9 Apr 2019 10:10:21 +0900 Subject: [PATCH 0746/1679] syscall: gofmt -w -s Change-Id: Ib46f1a528e16cd0c2617defbf4dcd1f1b582cdc2 Reviewed-on: https://go-review.googlesource.com/c/go/+/171101 Run-TryBot: Mikio Hara TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/fs_js.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/syscall/fs_js.go b/src/syscall/fs_js.go index b36cefc69a..89459979af 100644 --- a/src/syscall/fs_js.go +++ b/src/syscall/fs_js.go @@ -38,9 +38,9 @@ type jsFile struct { var filesMu sync.Mutex var files = map[int]*jsFile{ - 0: &jsFile{}, - 1: &jsFile{}, - 2: &jsFile{}, + 0: {}, + 1: {}, + 2: {}, } func fdToFile(fd int) (*jsFile, error) { -- GitLab From 08e1823a632783e3f71b358f2f546ab0f13a6d98 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Mon, 8 Apr 2019 15:53:35 +0200 Subject: [PATCH 0747/1679] bytes: optimize ToLower and ToUpper for ASCII-only case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow what CL 68370 and CL 76470 did for the respective functions in package strings. Also adjust godoc strings to match the respective strings functions and mention the special case for ASCII-only byte slices which don't need conversion. name old time/op new time/op delta ToUpper/#00-8 9.35ns ± 3% 6.08ns ± 2% -35.04% (p=0.000 n=9+9) ToUpper/ONLYUPPER-8 77.7ns ± 1% 16.9ns ± 2% -78.22% (p=0.000 n=10+10) ToUpper/abc-8 36.5ns ± 1% 22.1ns ± 1% -39.43% (p=0.000 n=10+8) ToUpper/AbC123-8 56.9ns ± 2% 28.2ns ± 2% -50.54% (p=0.000 n=8+10) ToUpper/azAZ09_-8 62.3ns ± 1% 26.9ns ± 1% -56.82% (p=0.000 n=9+10) ToUpper/longStrinGwitHmixofsmaLLandcAps-8 219ns ± 2% 63ns ± 2% -71.17% (p=0.000 n=10+10) ToUpper/longɐstringɐwithɐnonasciiⱯchars-8 367ns ± 2% 374ns ± 3% +2.05% (p=0.000 n=9+10) ToUpper/ɐɐɐɐɐ-8 200ns ± 1% 206ns ± 1% +2.49% (p=0.000 n=10+10) ToUpper/a\u0080\U0010ffff-8 90.4ns ± 1% 93.8ns ± 0% +3.82% (p=0.000 n=10+7) ToLower/#00-8 9.59ns ± 1% 6.13ns ± 2% -36.08% (p=0.000 n=10+10) ToLower/abc-8 36.4ns ± 1% 10.4ns ± 1% -71.50% (p=0.000 n=10+10) ToLower/AbC123-8 55.8ns ± 1% 27.5ns ± 1% -50.61% (p=0.000 n=10+10) ToLower/azAZ09_-8 61.7ns ± 1% 30.2ns ± 1% -50.98% (p=0.000 n=8+10) ToLower/longStrinGwitHmixofsmaLLandcAps-8 226ns ± 1% 64ns ± 1% -71.53% (p=0.000 n=10+9) ToLower/LONGⱯSTRINGⱯWITHⱯNONASCIIⱯCHARS-8 354ns ± 0% 361ns ± 0% +2.18% (p=0.000 n=10+10) ToLower/ⱭⱭⱭⱭⱭ-8 180ns ± 1% 186ns ± 0% +3.45% (p=0.000 n=10+9) ToLower/A\u0080\U0010ffff-8 91.7ns ± 0% 94.5ns ± 0% +2.99% (p=0.000 n=10+10) Change-Id: Ifdb8ae328ff9feacd1c170db8eebbf98c399e204 Reviewed-on: https://go-review.googlesource.com/c/go/+/170954 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/bytes/bytes.go | 63 ++++++++++++++++++++++++++++++++++++++--- src/bytes/bytes_test.go | 35 +++++++++++++++++++++++ 2 files changed, 94 insertions(+), 4 deletions(-) diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index bdd55fca4a..22aeded5e1 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -521,11 +521,66 @@ func Repeat(b []byte, count int) []byte { return nb } -// ToUpper treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters within it mapped to their upper case. -func ToUpper(s []byte) []byte { return Map(unicode.ToUpper, s) } +// ToUpper returns a copy of the byte slice s with all Unicode letters mapped to +// their upper case. +func ToUpper(s []byte) []byte { + isASCII, hasLower := true, false + for i := 0; i < len(s); i++ { + c := s[i] + if c >= utf8.RuneSelf { + isASCII = false + break + } + hasLower = hasLower || ('a' <= c && c <= 'z') + } + + if isASCII { // optimize for ASCII-only byte slices. + if !hasLower { + // Just return a copy. + return append([]byte(""), s...) + } + b := make([]byte, len(s)) + for i := 0; i < len(s); i++ { + c := s[i] + if 'a' <= c && c <= 'z' { + c -= 'a' - 'A' + } + b[i] = c + } + return b + } + return Map(unicode.ToUpper, s) +} -// ToLower treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters mapped to their lower case. -func ToLower(s []byte) []byte { return Map(unicode.ToLower, s) } +// ToLower returns a copy of the byte slice s with all Unicode letters mapped to +// their lower case. +func ToLower(s []byte) []byte { + isASCII, hasUpper := true, false + for i := 0; i < len(s); i++ { + c := s[i] + if c >= utf8.RuneSelf { + isASCII = false + break + } + hasUpper = hasUpper || ('A' <= c && c <= 'Z') + } + + if isASCII { // optimize for ASCII-only byte slices. + if !hasUpper { + return append([]byte(""), s...) + } + b := make([]byte, len(s)) + for i := 0; i < len(s); i++ { + c := s[i] + if 'A' <= c && c <= 'Z' { + c += 'a' - 'A' + } + b[i] = c + } + return b + } + return Map(unicode.ToLower, s) +} // ToTitle treats s as UTF-8-encoded bytes and returns a copy with all the Unicode letters mapped to their title case. func ToTitle(s []byte) []byte { return Map(unicode.ToTitle, s) } diff --git a/src/bytes/bytes_test.go b/src/bytes/bytes_test.go index d760d4b52a..340810facf 100644 --- a/src/bytes/bytes_test.go +++ b/src/bytes/bytes_test.go @@ -891,10 +891,14 @@ type StringTest struct { var upperTests = []StringTest{ {"", []byte("")}, + {"ONLYUPPER", []byte("ONLYUPPER")}, {"abc", []byte("ABC")}, {"AbC123", []byte("ABC123")}, {"azAZ09_", []byte("AZAZ09_")}, + {"longStrinGwitHmixofsmaLLandcAps", []byte("LONGSTRINGWITHMIXOFSMALLANDCAPS")}, + {"long\u0250string\u0250with\u0250nonascii\u2C6Fchars", []byte("LONG\u2C6FSTRING\u2C6FWITH\u2C6FNONASCII\u2C6FCHARS")}, {"\u0250\u0250\u0250\u0250\u0250", []byte("\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F")}, // grows one byte per char + {"a\u0080\U0010FFFF", []byte("A\u0080\U0010FFFF")}, // test utf8.RuneSelf and utf8.MaxRune } var lowerTests = []StringTest{ @@ -902,7 +906,10 @@ var lowerTests = []StringTest{ {"abc", []byte("abc")}, {"AbC123", []byte("abc123")}, {"azAZ09_", []byte("azaz09_")}, + {"longStrinGwitHmixofsmaLLandcAps", []byte("longstringwithmixofsmallandcaps")}, + {"LONG\u2C6FSTRING\u2C6FWITH\u2C6FNONASCII\u2C6FCHARS", []byte("long\u0250string\u0250with\u0250nonascii\u0250chars")}, {"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", []byte("\u0251\u0251\u0251\u0251\u0251")}, // shrinks one byte per char + {"A\u0080\U0010FFFF", []byte("a\u0080\U0010FFFF")}, // test utf8.RuneSelf and utf8.MaxRune } const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000" @@ -1029,6 +1036,34 @@ func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTest func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) } +func BenchmarkToUpper(b *testing.B) { + for _, tc := range upperTests { + tin := []byte(tc.in) + b.Run(tc.in, func(b *testing.B) { + for i := 0; i < b.N; i++ { + actual := ToUpper(tin) + if !Equal(actual, tc.out) { + b.Errorf("ToUpper(%q) = %q; want %q", tc.in, actual, tc.out) + } + } + }) + } +} + +func BenchmarkToLower(b *testing.B) { + for _, tc := range lowerTests { + tin := []byte(tc.in) + b.Run(tc.in, func(b *testing.B) { + for i := 0; i < b.N; i++ { + actual := ToLower(tin) + if !Equal(actual, tc.out) { + b.Errorf("ToLower(%q) = %q; want %q", tc.in, actual, tc.out) + } + } + }) + } +} + func TestTrimSpace(t *testing.T) { runStringTests(t, TrimSpace, "TrimSpace", trimSpaceTests) } type RepeatTest struct { -- GitLab From 4166ff42c09cae4ca9e15154627e7cfc80586c65 Mon Sep 17 00:00:00 2001 From: Andrei Vagin Date: Fri, 29 Mar 2019 10:43:31 -0700 Subject: [PATCH 0748/1679] runtime: preempt a goroutine which calls a lot of short system calls A goroutine should be preempted if it runs for 10ms without blocking. We found that this doesn't work for goroutines which call short system calls. For example, the next program can stuck for seconds without this fix: $ cat main.go package main import ( "runtime" "syscall" ) func main() { runtime.GOMAXPROCS(1) c := make(chan int) go func() { c <- 1 for { t := syscall.Timespec{ Nsec: 300, } if true { syscall.Nanosleep(&t, nil) } } }() <-c } $ time go run main.go real 0m8.796s user 0m0.367s sys 0m0.893s Updates #10958 Change-Id: Id3be54d3779cc28bfc8b33fe578f13778f1ae2a2 Reviewed-on: https://go-review.googlesource.com/c/go/+/170138 Reviewed-by: Dmitry Vyukov Run-TryBot: Dmitry Vyukov TryBot-Result: Gobot Gobot --- src/runtime/export_test.go | 2 ++ src/runtime/proc.go | 28 ++++++++-------- src/runtime/proc_test.go | 67 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 9eaf92dc7c..a16e664895 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -34,6 +34,8 @@ var Fastlog2 = fastlog2 var Atoi = atoi var Atoi32 = atoi32 +var Nanotime = nanotime + type LFNode struct { Next uint64 Pushcnt uintptr diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 6b5b3e2b2b..29763d328a 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -4380,10 +4380,24 @@ func retake(now int64) uint32 { } pd := &_p_.sysmontick s := _p_.status + sysretake := false + if s == _Prunning || s == _Psyscall { + // Preempt G if it's running for too long. + t := int64(_p_.schedtick) + if int64(pd.schedtick) != t { + pd.schedtick = uint32(t) + pd.schedwhen = now + } else if pd.schedwhen+forcePreemptNS <= now { + preemptone(_p_) + // In case of syscall, preemptone() doesn't + // work, because there is no M wired to P. + sysretake = true + } + } if s == _Psyscall { // Retake P from syscall if it's there for more than 1 sysmon tick (at least 20us). t := int64(_p_.syscalltick) - if int64(pd.syscalltick) != t { + if !sysretake && int64(pd.syscalltick) != t { pd.syscalltick = uint32(t) pd.syscallwhen = now continue @@ -4412,18 +4426,6 @@ func retake(now int64) uint32 { } incidlelocked(1) lock(&allpLock) - } else if s == _Prunning { - // Preempt G if it's running for too long. - t := int64(_p_.schedtick) - if int64(pd.schedtick) != t { - pd.schedtick = uint32(t) - pd.schedwhen = now - continue - } - if pd.schedwhen+forcePreemptNS > now { - continue - } - preemptone(_p_) } } unlock(&allpLock) diff --git a/src/runtime/proc_test.go b/src/runtime/proc_test.go index 1715324aa0..09b0652bee 100644 --- a/src/runtime/proc_test.go +++ b/src/runtime/proc_test.go @@ -5,6 +5,7 @@ package runtime_test import ( + "fmt" "math" "net" "runtime" @@ -910,3 +911,69 @@ func TestLockOSThreadAvoidsStatePropagation(t *testing.T) { t.Errorf("want %q, got %q", want, output) } } + +// fakeSyscall emulates a system call. +//go:nosplit +func fakeSyscall(duration time.Duration) { + runtime.Entersyscall() + for start := runtime.Nanotime(); runtime.Nanotime()-start < int64(duration); { + } + runtime.Exitsyscall() +} + +// Check that a goroutine will be preempted if it is calling short system calls. +func testPreemptionAfterSyscall(t *testing.T, syscallDuration time.Duration) { + if runtime.GOARCH == "wasm" { + t.Skip("no preemption on wasm yet") + } + + defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2)) + + interations := 10 + if testing.Short() { + interations = 1 + } + const ( + maxDuration = 3 * time.Second + nroutines = 8 + ) + + for i := 0; i < interations; i++ { + c := make(chan bool, nroutines) + stop := uint32(0) + + start := time.Now() + for g := 0; g < nroutines; g++ { + go func(stop *uint32) { + c <- true + for atomic.LoadUint32(stop) == 0 { + fakeSyscall(syscallDuration) + } + c <- true + }(&stop) + } + // wait until all goroutines have started. + for g := 0; g < nroutines; g++ { + <-c + } + atomic.StoreUint32(&stop, 1) + // wait until all goroutines have finished. + for g := 0; g < nroutines; g++ { + <-c + } + duration := time.Since(start) + + if duration > maxDuration { + t.Errorf("timeout exceeded: %v (%v)", duration, maxDuration) + } + } +} + +func TestPreemptionAfterSyscall(t *testing.T) { + for _, i := range []time.Duration{10, 100, 1000} { + d := i * time.Microsecond + t.Run(fmt.Sprint(d), func(t *testing.T) { + testPreemptionAfterSyscall(t, d) + }) + } +} -- GitLab From 78175474c4a93c2b18516d2127a160b83926c143 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 9 Apr 2019 08:35:36 +0200 Subject: [PATCH 0749/1679] strings: use Go style character range comparison in ToUpper/ToLower As noted by Brad in CL 170954 for package bytes. Change-Id: I2772a356299e54ba5b7884d537e6649039adb9be Reviewed-on: https://go-review.googlesource.com/c/go/+/171198 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/strings/strings.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strings/strings.go b/src/strings/strings.go index 5a126a7a19..1805a14bd2 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -559,7 +559,7 @@ func ToUpper(s string) string { isASCII = false break } - hasLower = hasLower || (c >= 'a' && c <= 'z') + hasLower = hasLower || ('a' <= c && c <= 'z') } if isASCII { // optimize for ASCII-only strings. @@ -570,7 +570,7 @@ func ToUpper(s string) string { b.Grow(len(s)) for i := 0; i < len(s); i++ { c := s[i] - if c >= 'a' && c <= 'z' { + if 'a' <= c && c <= 'z' { c -= 'a' - 'A' } b.WriteByte(c) @@ -589,7 +589,7 @@ func ToLower(s string) string { isASCII = false break } - hasUpper = hasUpper || (c >= 'A' && c <= 'Z') + hasUpper = hasUpper || ('A' <= c && c <= 'Z') } if isASCII { // optimize for ASCII-only strings. @@ -600,7 +600,7 @@ func ToLower(s string) string { b.Grow(len(s)) for i := 0; i < len(s); i++ { c := s[i] - if c >= 'A' && c <= 'Z' { + if 'A' <= c && c <= 'Z' { c += 'a' - 'A' } b.WriteByte(c) -- GitLab From 016625c26591d375a4bfcf83532ff8407860612a Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Tue, 9 Apr 2019 08:32:22 +0200 Subject: [PATCH 0750/1679] strings: add TestIndexByte Add TestIndexByte to package strings similar to the already existing TestIndexByte in package bytes. Change-Id: Ib60695cb326156a4fe48138c66393ebbd11e4a25 Reviewed-on: https://go-review.googlesource.com/c/go/+/171197 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/strings/strings_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/strings/strings_test.go b/src/strings/strings_test.go index 8f0a7a1a0a..9766521615 100644 --- a/src/strings/strings_test.go +++ b/src/strings/strings_test.go @@ -199,6 +199,18 @@ func TestLastIndex(t *testing.T) { runIndexTests(t, LastIndex, "LastIndex", l func TestIndexAny(t *testing.T) { runIndexTests(t, IndexAny, "IndexAny", indexAnyTests) } func TestLastIndexAny(t *testing.T) { runIndexTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests) } +func TestIndexByte(t *testing.T) { + for _, tt := range indexTests { + if len(tt.sep) != 1 { + continue + } + pos := IndexByte(tt.s, tt.sep[0]) + if pos != tt.out { + t.Errorf(`IndexByte(%q, %q) = %v; want %v`, tt.s, tt.sep[0], pos, tt.out) + } + } +} + func TestLastIndexByte(t *testing.T) { testCases := []IndexTest{ {"", "q", -1}, -- GitLab From 68c664141cc3c0cecfe9171627d49e942c929a93 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 9 Apr 2019 12:10:27 -0400 Subject: [PATCH 0751/1679] cmd/internal/obj/x86: allow non-zero offset in TLS reference An instruction that references TLS, e.g. MOVQ 0(TLS), AX on some platforms (e.g. Android), or in shared mode, may be translated to (assuming TLS offset already loaded to CX) MOVQ 0(CX)(TLS*1), AX which in turns translates to movq %fs:(%rcx), %rax We have rejected non-zero offset for TLS reference, like 16(TLS). Actually, the instruction can take offset, i.e. it is a valid instruction for, e.g., movq %fs:16(%rcx),%rcx So, allow offset in TLS reference. Change-Id: Iaf1996bad7fe874e0c298ea441af5acb136a4028 Reviewed-on: https://go-review.googlesource.com/c/go/+/171151 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/asm/internal/asm/testdata/386.s | 4 ++++ src/cmd/asm/internal/asm/testdata/amd64.s | 4 ++++ src/cmd/internal/obj/x86/asm6.go | 16 +++++----------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cmd/asm/internal/asm/testdata/386.s b/src/cmd/asm/internal/asm/testdata/386.s index d524a4c8c1..e0855f5e4b 100644 --- a/src/cmd/asm/internal/asm/testdata/386.s +++ b/src/cmd/asm/internal/asm/testdata/386.s @@ -89,6 +89,10 @@ label: loop: LOOP loop // LOOP +// Tests for TLS reference. + MOVL (TLS), AX + MOVL 8(TLS), DX + // LTYPE0 nonnon { outcode(int($1), &$2); } RET RET foo(SB) diff --git a/src/cmd/asm/internal/asm/testdata/amd64.s b/src/cmd/asm/internal/asm/testdata/amd64.s index 680d8eff38..1dec7f4135 100644 --- a/src/cmd/asm/internal/asm/testdata/amd64.s +++ b/src/cmd/asm/internal/asm/testdata/amd64.s @@ -143,6 +143,10 @@ loop: MOVB foo+32(SP)(CX*4), AH // 8a648c20 MOVB foo+32323(SP)(CX*8), R9 // 448a8ccc437e0000 +// Tests for TLS reference. + MOVQ (TLS), AX + MOVQ 8(TLS), DX + // LTYPE0 nonnon { outcode($1, &$2); } RET // c3 RET foo(SB) diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index a81de43845..336446449b 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -2345,17 +2345,14 @@ func prefixof(ctxt *obj.Link, a *obj.Addr) int { if ctxt.Arch.Family == sys.I386 { if a.Index == REG_TLS && ctxt.Flag_shared { // When building for inclusion into a shared library, an instruction of the form - // MOVL 0(CX)(TLS*1), AX + // MOVL off(CX)(TLS*1), AX // becomes - // mov %gs:(%ecx), %eax + // mov %gs:off(%ecx), %eax // which assumes that the correct TLS offset has been loaded into %ecx (today // there is only one TLS variable -- g -- so this is OK). When not building for // a shared library the instruction it becomes - // mov 0x0(%ecx), $eax + // mov 0x0(%ecx), %eax // and a R_TLS_LE relocation, and so does not require a prefix. - if a.Offset != 0 { - ctxt.Diag("cannot handle non-0 offsets to TLS") - } return 0x65 // GS } return 0 @@ -2374,15 +2371,12 @@ func prefixof(ctxt *obj.Link, a *obj.Addr) int { case REG_TLS: if ctxt.Flag_shared && ctxt.Headtype != objabi.Hwindows { // When building for inclusion into a shared library, an instruction of the form - // MOV 0(CX)(TLS*1), AX + // MOV off(CX)(TLS*1), AX // becomes - // mov %fs:(%rcx), %rax + // mov %fs:off(%rcx), %rax // which assumes that the correct TLS offset has been loaded into %rcx (today // there is only one TLS variable -- g -- so this is OK). When not building for // a shared library the instruction does not require a prefix. - if a.Offset != 0 { - log.Fatalf("cannot handle non-0 offsets to TLS") - } return 0x64 } -- GitLab From 9a0a150c9f50f920f35cc4d50ac3005503f44f2d Mon Sep 17 00:00:00 2001 From: Nigel Tao Date: Sun, 7 Apr 2019 13:50:06 +1000 Subject: [PATCH 0752/1679] all: spell "Deprecated: Use etc" consistently Change-Id: I209b75dc8dc4da881b68e5c5d98cbf08c1032dfc Reviewed-on: https://go-review.googlesource.com/c/go/+/171098 Reviewed-by: Dmitri Shuralyov --- src/crypto/x509/x509.go | 2 +- src/go/importer/importer.go | 2 +- src/runtime/cpuprof.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 0d68d82993..4aca7ca40b 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -2278,7 +2278,7 @@ type CertificateRequest struct { // Attributes contains the CSR attributes that can parse as // pkix.AttributeTypeAndValueSET. // - // Deprecated: use Extensions and ExtraExtensions instead for parsing and + // Deprecated: Use Extensions and ExtraExtensions instead for parsing and // generating the requestedExtensions attribute. Attributes []pkix.AttributeTypeAndValueSET diff --git a/src/go/importer/importer.go b/src/go/importer/importer.go index c809c9ab86..fbbc3c9017 100644 --- a/src/go/importer/importer.go +++ b/src/go/importer/importer.go @@ -73,7 +73,7 @@ func ForCompiler(fset *token.FileSet, compiler string, lookup Lookup) types.Impo // For calls ForCompiler with a new FileSet. // -// Deprecated: use ForCompiler, which populates a FileSet +// Deprecated: Use ForCompiler, which populates a FileSet // with the positions of objects created by the importer. func For(compiler string, lookup Lookup) types.Importer { return ForCompiler(token.NewFileSet(), compiler, lookup) diff --git a/src/runtime/cpuprof.go b/src/runtime/cpuprof.go index e00dcb1bbd..81038f5c48 100644 --- a/src/runtime/cpuprof.go +++ b/src/runtime/cpuprof.go @@ -179,7 +179,7 @@ func (p *cpuProfile) addLostAtomic64(count uint64) { // The details of generating that format have changed, // so this functionality has been removed. // -// Deprecated: use the runtime/pprof package, +// Deprecated: Use the runtime/pprof package, // or the handlers in the net/http/pprof package, // or the testing package's -test.cpuprofile flag instead. func CPUProfile() []byte { -- GitLab From eddb41eb2cb7699f3515a229ff069ca914c7c879 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 8 Apr 2019 23:12:52 +0200 Subject: [PATCH 0753/1679] runtime: correct the TLS base offset on Android CL 170955 set tlsg to the Android Q free TLS slot offset in the linker data (16 on amd64, 8 on 386), offsetting all TLS relative access. We need the 0'th slot (TLS_SLOT_SELF) at initialization, so compensate with a corresponding negative offset. Fixes the android/386 and android/amd64 builders broken by CL 170955. Change-Id: I9882088c0c8bc6a777d2aabc9404cb76f02b6cea Reviewed-on: https://go-review.googlesource.com/c/go/+/170956 TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/runtime/asm_386.s | 6 ++++-- src/runtime/asm_amd64.s | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/runtime/asm_386.s b/src/runtime/asm_386.s index 61aae47c08..682f1ab5d0 100644 --- a/src/runtime/asm_386.s +++ b/src/runtime/asm_386.s @@ -172,8 +172,10 @@ nocpuinfo: TESTL AX, AX JZ needtls #ifdef GOOS_android - MOVL 0(TLS), BX - MOVL BX, 12(SP) // arg 4: TLS base, stored in the first slot (TLS_SLOT_SELF). + // arg 4: TLS base, stored in slot 0 (Android's TLS_SLOT_SELF). + // Compensate for tls_g (+8). + MOVL -8(TLS), BX + MOVL BX, 12(SP) MOVL $runtime·tls_g(SB), 8(SP) // arg 3: &tls_g #else MOVL $0, BX diff --git a/src/runtime/asm_amd64.s b/src/runtime/asm_amd64.s index 7b2fdf0d3d..e5b987858d 100644 --- a/src/runtime/asm_amd64.s +++ b/src/runtime/asm_amd64.s @@ -136,7 +136,9 @@ nocpuinfo: MOVQ $setg_gcc<>(SB), SI // arg 2: setg_gcc #ifdef GOOS_android MOVQ $runtime·tls_g(SB), DX // arg 3: &tls_g - MOVQ 0(TLS), CX // arg 4: TLS base, stored in the first slot (TLS_SLOT_SELF). + // arg 4: TLS base, stored in slot 0 (Android's TLS_SLOT_SELF). + // Compensate for tls_g (+16). + MOVQ -16(TLS), CX #else MOVQ $0, DX // arg 3, 4: not used when using platform's TLS MOVQ $0, CX -- GitLab From 607493bed678cbf3a456e9de8e7e74622ec83da8 Mon Sep 17 00:00:00 2001 From: smileeye Date: Tue, 9 Apr 2019 22:47:38 +0800 Subject: [PATCH 0754/1679] cmd/asm/internal/arch: improve the comment of function IsMIPSMUL The check of MADD&MSUB was added to the function IsMIPSMUL in a previous commit, and the comments should also be updated. Change-Id: I2d3da055d55b459b908714c542dff99ab5c6cf99 Reviewed-on: https://go-review.googlesource.com/c/go/+/171102 Reviewed-by: Brad Fitzpatrick --- src/cmd/asm/internal/arch/mips.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/asm/internal/arch/mips.go b/src/cmd/asm/internal/arch/mips.go index 22c9ebd2da..79fb7cf02e 100644 --- a/src/cmd/asm/internal/arch/mips.go +++ b/src/cmd/asm/internal/arch/mips.go @@ -33,7 +33,7 @@ func IsMIPSCMP(op obj.As) bool { } // IsMIPSMUL reports whether the op (as defined by an mips.A* constant) is -// one of the MUL/DIV/REM instructions that require special handling. +// one of the MUL/DIV/REM/MADD/MSUB instructions that require special handling. func IsMIPSMUL(op obj.As) bool { switch op { case mips.AMUL, mips.AMULU, mips.AMULV, mips.AMULVU, -- GitLab From fda5e6d6fa7abfe974a58dfeeceb95a8165d1b63 Mon Sep 17 00:00:00 2001 From: Ahsun Ahmed Date: Thu, 21 Mar 2019 22:45:49 +0600 Subject: [PATCH 0755/1679] errors: return false if nil error is passed to As Fixes #30970 Change-Id: I333676b55a2364e329fffeafca8fc57d45a0b84b Reviewed-on: https://go-review.googlesource.com/c/go/+/168598 Reviewed-by: Marcel van Lohuizen Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot --- src/errors/wrap.go | 9 ++++----- src/errors/wrap_test.go | 4 ++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/errors/wrap.go b/src/errors/wrap.go index fc7bf71f8a..b1a15d01dd 100644 --- a/src/errors/wrap.go +++ b/src/errors/wrap.go @@ -72,7 +72,7 @@ func Is(err, target error) bool { // matches a type if it is assignable to the target type, or if it has a method // As(interface{}) bool such that As(target) returns true. As will panic if // target is not a non-nil pointer to a type which implements error or is of -// interface type. +// interface type. As returns false if error is nil. // // The As method should set the target to its value and return true if err // matches the type to which target points. @@ -89,7 +89,7 @@ func As(err error, target interface{}) bool { panic("errors: *target must be interface or implement error") } targetType := typ.Elem() - for { + for err != nil { if reflectlite.TypeOf(err).AssignableTo(targetType) { val.Elem().Set(reflectlite.ValueOf(err)) return true @@ -97,10 +97,9 @@ func As(err error, target interface{}) bool { if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { return true } - if err = Unwrap(err); err == nil { - return false - } + err = Unwrap(err) } + return false } var errorType = reflectlite.TypeOf((*error)(nil)).Elem() diff --git a/src/errors/wrap_test.go b/src/errors/wrap_test.go index 657890c1a6..022f429c0c 100644 --- a/src/errors/wrap_test.go +++ b/src/errors/wrap_test.go @@ -90,6 +90,10 @@ func TestAs(t *testing.T) { target interface{} match bool }{{ + nil, + &errP, + false, + }, { wrapped{"pittied the fool", errorT{}}, &errT, true, -- GitLab From a6af1041f6889fddd71c2a08308f52637b3f345d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 10 Apr 2019 11:06:58 -0700 Subject: [PATCH 0756/1679] syscall: store skip count in file descriptor offset Multiple calls to ReadDirent expect to return subsequent portions of the directory listing. There's no place to store our progress other than the file descriptor offset. Fortunately, the file descriptor offset doesn't need to be a real offset. We can store any int64 we want there. Fixes #31368 Change-Id: I49e4e0e7ff707d3e96aa5d43e3b0199531013cde Reviewed-on: https://go-review.googlesource.com/c/go/+/171477 Run-TryBot: Keith Randall Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/syscall/dirent_bsd_test.go | 59 +++++++++++++++++++++++++++++++++- src/syscall/syscall_darwin.go | 34 ++++++++++++++------ 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/src/syscall/dirent_bsd_test.go b/src/syscall/dirent_bsd_test.go index e5b8357af7..c0ae2a91b9 100644 --- a/src/syscall/dirent_bsd_test.go +++ b/src/syscall/dirent_bsd_test.go @@ -8,6 +8,7 @@ package syscall_test import ( "bytes" + "fmt" "io/ioutil" "os" "path/filepath" @@ -16,6 +17,7 @@ import ( "strings" "syscall" "testing" + "unsafe" ) func TestDirent(t *testing.T) { @@ -41,10 +43,10 @@ func TestDirent(t *testing.T) { buf := bytes.Repeat([]byte("DEADBEAF"), direntBufSize/8) fd, err := syscall.Open(d, syscall.O_RDONLY, 0) - defer syscall.Close(fd) if err != nil { t.Fatalf("syscall.open: %v", err) } + defer syscall.Close(fd) n, err := syscall.ReadDirent(fd, buf) if err != nil { t.Fatalf("syscall.readdir: %v", err) @@ -74,3 +76,58 @@ func TestDirent(t *testing.T) { } } } + +func TestDirentRepeat(t *testing.T) { + const N = 100 + + // Make a directory containing N files + d, err := ioutil.TempDir("", "direntRepeat-test") + if err != nil { + t.Fatalf("tempdir: %v", err) + } + defer os.RemoveAll(d) + + var files []string + for i := 0; i < N; i++ { + files = append(files, fmt.Sprintf("file%d", i)) + } + for _, file := range files { + err = ioutil.WriteFile(filepath.Join(d, file), []byte("contents"), 0644) + if err != nil { + t.Fatalf("writefile: %v", err) + } + } + + // Read the directory entries using ReadDirent. + fd, err := syscall.Open(d, syscall.O_RDONLY, 0) + if err != nil { + t.Fatalf("syscall.open: %v", err) + } + defer syscall.Close(fd) + var files2 []string + for { + // Note: the buf is small enough that this loop will need to + // execute multiple times. See issue #31368. + buf := make([]byte, N*unsafe.Offsetof(syscall.Dirent{}.Name)/4) + n, err := syscall.ReadDirent(fd, buf) + if err != nil { + t.Fatalf("syscall.readdir: %v", err) + } + if n == 0 { + break + } + buf = buf[:n] + for len(buf) > 0 { + var consumed int + consumed, _, files2 = syscall.ParseDirent(buf, -1, files2) + buf = buf[consumed:] + } + } + + // Check results + sort.Strings(files) + sort.Strings(files2) + if strings.Join(files, "|") != strings.Join(files2, "|") { + t.Errorf("bad file list: want\n%q\ngot\n%q", files, files2) + } +} diff --git a/src/syscall/syscall_darwin.go b/src/syscall/syscall_darwin.go index 422f3d4425..e5d0d5c386 100644 --- a/src/syscall/syscall_darwin.go +++ b/src/syscall/syscall_darwin.go @@ -368,6 +368,18 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { // Simulate Getdirentries using fdopendir/readdir_r/closedir. const ptrSize = unsafe.Sizeof(uintptr(0)) + + // We store the number of entries to skip in the seek + // offset of fd. See issue #31368. + // It's not the full required semantics, but should handle the case + // of calling Getdirentries or ReadDirent repeatedly. + // It won't handle assigning the results of lseek to *basep, or handle + // the directory being edited underfoot. + skip, err := Seek(fd, 0, 1 /* SEEK_CUR */) + if err != nil { + return 0, err + } + // We need to duplicate the incoming file descriptor // because the caller expects to retain control of it, but // fdopendir expects to take control of its argument. @@ -384,13 +396,8 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { return 0, err } defer closedir(d) - // We keep the number of records already returned in *basep. - // It's not the full required semantics, but should handle the case - // of calling Getdirentries repeatedly. - // It won't handle assigning the results of lseek to *basep, or handle - // the directory being edited underfoot. - skip := *basep - *basep = 0 + + var cnt int64 for { var entry Dirent var entryp *Dirent @@ -403,13 +410,13 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { } if skip > 0 { skip-- - *basep++ + cnt++ continue } reclen := int(entry.Reclen) if reclen > len(buf) { // Not enough room. Return for now. - // *basep will let us know where we should start up again. + // The counter will let us know where we should start up again. // Note: this strategy for suspending in the middle and // restarting is O(n^2) in the length of the directory. Oh well. break @@ -423,8 +430,15 @@ func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { copy(buf, *(*[]byte)(unsafe.Pointer(&s))) buf = buf[reclen:] n += reclen - *basep++ + cnt++ } + // Set the seek offset of the input fd to record + // how many files we've already returned. + _, err = Seek(fd, cnt, 0 /* SEEK_SET */) + if err != nil { + return n, err + } + return n, nil } -- GitLab From c3495058786a3c05699f0d4a39ecc7df39e58897 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Sun, 7 Apr 2019 13:56:58 +0700 Subject: [PATCH 0757/1679] os: fix RemoveAll hangs on large directory golang.org/cl/121255 added close and re-open the directory when looping, prevent us from missing some if previous iteration deleted files. The CL introdued a bug. If we can not delete all entries in one request, the looping never exits, causing RemoveAll hangs. To fix that, simply discard the entries if we can not delete all of them in one iteration, then continue reading entries and delete them. Also make sure removeall_at return first error it encounters. Fixes #29921 Change-Id: I8ec3a4c822d8d2d95d9f1ab71547879da395bc4a Reviewed-on: https://go-review.googlesource.com/c/go/+/171099 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/os/export_test.go | 1 + src/os/path.go | 3 +++ src/os/removeall_at.go | 48 ++++++++++++++++++++++++++-------------- src/os/removeall_noat.go | 40 +++++++++++++++++++++++---------- src/os/removeall_test.go | 46 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 110 insertions(+), 28 deletions(-) diff --git a/src/os/export_test.go b/src/os/export_test.go index 812432cee4..d17d5e6230 100644 --- a/src/os/export_test.go +++ b/src/os/export_test.go @@ -9,3 +9,4 @@ package os var Atime = atime var LstatP = &lstat var ErrWriteAtInAppendMode = errWriteAtInAppendMode +var RemoveAllTestHook = &removeAllTestHook diff --git a/src/os/path.go b/src/os/path.go index ba43ea3525..9d7ecad792 100644 --- a/src/os/path.go +++ b/src/os/path.go @@ -58,6 +58,9 @@ func MkdirAll(path string, perm FileMode) error { return nil } +// removeAllTestHook is a hook for testing. +var removeAllTestHook = func(err error) error { return err } + // RemoveAll removes path and any children it contains. // It removes everything it can but returns the first error // it encounters. If the path does not exist, RemoveAll diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 330963b354..3098b93368 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -91,7 +91,8 @@ func removeAllFrom(parent *File, base string) error { // Remove the directory's entries. var recurseErr error for { - const request = 1024 + const reqSize = 1024 + var respSize int // Open the directory to recurse into file, err := openFdAt(parentFd, base) @@ -103,23 +104,37 @@ func removeAllFrom(parent *File, base string) error { break } - names, readErr := file.Readdirnames(request) - // Errors other than EOF should stop us from continuing. - if readErr != nil && readErr != io.EOF { - file.Close() - if IsNotExist(readErr) { - return nil + for { + numErr := 0 + + names, readErr := file.Readdirnames(reqSize) + // Errors other than EOF should stop us from continuing. + if readErr != nil && readErr != io.EOF { + file.Close() + if IsNotExist(readErr) { + return nil + } + return &PathError{"readdirnames", base, readErr} } - return &PathError{"readdirnames", base, readErr} - } - for _, name := range names { - err := removeAllFrom(file, name) - if err != nil { - if pathErr, ok := err.(*PathError); ok { - pathErr.Path = base + string(PathSeparator) + pathErr.Path + respSize = len(names) + for _, name := range names { + err := removeAllFrom(file, name) + if err != nil { + if pathErr, ok := err.(*PathError); ok { + pathErr.Path = base + string(PathSeparator) + pathErr.Path + } + numErr++ + if recurseErr == nil { + recurseErr = err + } } - recurseErr = err + } + + // If we can delete any entry, break to start new iteration. + // Otherwise, we discard current names, get next entries and try deleting them. + if numErr != reqSize { + break } } @@ -131,13 +146,14 @@ func removeAllFrom(parent *File, base string) error { file.Close() // Finish when the end of the directory is reached - if len(names) < request { + if respSize < reqSize { break } } // Remove the directory itself. unlinkError := unix.Unlinkat(parentFd, base, unix.AT_REMOVEDIR) + unlinkError = removeAllTestHook(unlinkError) if unlinkError == nil || IsNotExist(unlinkError) { return nil } diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go index 5a7dc263f0..a0694fa4ce 100644 --- a/src/os/removeall_noat.go +++ b/src/os/removeall_noat.go @@ -56,8 +56,30 @@ func removeAll(path string) error { return err } - const request = 1024 - names, err1 := fd.Readdirnames(request) + const reqSize = 1024 + var names []string + var readErr error + + for { + numErr := 0 + names, readErr = fd.Readdirnames(reqSize) + + for _, name := range names { + err1 := RemoveAll(path + string(PathSeparator) + name) + if err == nil { + err = err1 + } + if err1 != nil { + numErr++ + } + } + + // If we can delete any entry, break to start new iteration. + // Otherwise, we discard current names, get next entries and try deleting them. + if numErr != reqSize { + break + } + } // Removing files from the directory may have caused // the OS to reshuffle it. Simply calling Readdirnames @@ -66,19 +88,12 @@ func removeAll(path string) error { // directory. See issue 20841. fd.Close() - for _, name := range names { - err1 := RemoveAll(path + string(PathSeparator) + name) - if err == nil { - err = err1 - } - } - - if err1 == io.EOF { + if readErr == io.EOF { break } // If Readdirnames returned an error, use it. if err == nil { - err = err1 + err = readErr } if len(names) == 0 { break @@ -88,7 +103,7 @@ func removeAll(path string) error { // got fewer than request names from Readdirnames, try // simply removing the directory now. If that // succeeds, we are done. - if len(names) < request { + if len(names) < reqSize { err1 := Remove(path) if err1 == nil || IsNotExist(err1) { return nil @@ -109,6 +124,7 @@ func removeAll(path string) error { // Remove directory. err1 := Remove(path) + err1 = removeAllTestHook(err1) if err1 == nil || IsNotExist(err1) { return nil } diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index 2bd14979e0..eb9459445c 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -5,6 +5,7 @@ package os_test import ( + "errors" "fmt" "io/ioutil" . "os" @@ -405,3 +406,48 @@ func TestRemoveUnreadableDir(t *testing.T) { t.Fatal(err) } } + +// Issue 29921 +func TestRemoveAllWithMoreErrorThanReqSize(t *testing.T) { + if testing.Short() { + t.Skip("skipping in short mode") + } + oldRemoveAllTestHook := RemoveAllTestHook + *RemoveAllTestHook = func(err error) error { + return errors.New("error from RemoveAllTestHook") + } + defer func() { + *RemoveAllTestHook = *oldRemoveAllTestHook + }() + + tmpDir, err := ioutil.TempDir("", "TestRemoveAll-") + if err != nil { + t.Fatal(err) + } + defer RemoveAll(tmpDir) + + path := filepath.Join(tmpDir, "_TestRemoveAllWithMoreErrorThanReqSize_") + + // Make directory with 1025 files and remove. + if err := MkdirAll(path, 0777); err != nil { + t.Fatalf("MkdirAll %q: %s", path, err) + } + for i := 0; i < 1025; i++ { + fpath := filepath.Join(path, fmt.Sprintf("file%d", i)) + fd, err := Create(fpath) + if err != nil { + t.Fatalf("create %q: %s", fpath, err) + } + fd.Close() + } + + // This call should not hang + if err := RemoveAll(path); err == nil { + t.Fatal("Want error from RemoveAllTestHook, got nil") + } + + // We hook to inject error, but the actual files must be deleted + if _, err := Lstat(path); err == nil { + t.Fatal("directory must be deleted even with removeAllTetHook run") + } +} -- GitLab From 512b3c63b7472d2baab881de4dbcbd0ab8e447ab Mon Sep 17 00:00:00 2001 From: Mihai Moldovan Date: Tue, 9 Apr 2019 10:25:49 +0000 Subject: [PATCH 0758/1679] cmd/dist: add BOOT_GO_LDFLAGS - counterpart of BOOT_GO_GCFLAGS This allows passing custom LDFLAGS while building the bootstrapping tool. Afterwards, GO_LDFLAGS will be used as usual. Change-Id: I1e224e3ce8bf7b2ce1ef8fec1894720338f04396 GitHub-Last-Rev: 17d40dc2dd2f0815331cb2f8de3445f86687cc45 GitHub-Pull-Request: golang/go#31298 Reviewed-on: https://go-review.googlesource.com/c/go/+/171037 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/dist/build.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index fec3b2cedc..15ed4278ac 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -198,6 +198,7 @@ func xinit() { } gogcflags = os.Getenv("BOOT_GO_GCFLAGS") + goldflags = os.Getenv("BOOT_GO_LDFLAGS") cc, cxx := "gcc", "g++" if defaultclang { @@ -661,6 +662,9 @@ func runInstall(dir string, ch chan struct{}) { if goos == "android" { link = append(link, "-buildmode=pie") } + if goldflags != "" { + link = append(link, goldflags) + } link = append(link, "-o", pathf("%s/%s%s", tooldir, elem, exe)) targ = len(link) - 1 } @@ -1265,7 +1269,7 @@ func cmdbootstrap() { } gogcflags = os.Getenv("GO_GCFLAGS") // we were using $BOOT_GO_GCFLAGS until now - goldflags = os.Getenv("GO_LDFLAGS") + goldflags = os.Getenv("GO_LDFLAGS") // we were using $BOOT_GO_LDFLAGS until now goBootstrap := pathf("%s/go_bootstrap", tooldir) cmdGo := pathf("%s/go", gobin) if debug { -- GitLab From 2ab6d0172eb9112eba8c6e05a813e260985d20cf Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Thu, 17 Jan 2019 20:05:20 +0000 Subject: [PATCH 0759/1679] runtime: throw if scavenge necessary during coalescing Currently when coalescing if two adjacent spans are scavenged, we subtract their sizes from memstats and re-scavenge the new combined span. This is wasteful however, since the realignment semantics make this case of having to re-scavenge impossible. In realign() inside of coalesce(), there was also a bug: on systems where physPageSize > pageSize, we wouldn't realign because a condition had the wrong sign. This wasteful re-scavenging has been masking this bug this whole time. So, this change fixes that first. Then this change gets rid of the needsScavenge logic and instead checks explicitly for the possibility of unscavenged pages near the physical page boundary. If the possibility exists, it throws. The intent of throwing here is to catch changes to the runtime which cause this invariant to no longer hold, at which point it would likely be appropriate to scavenge the additional pages (and only the additional pages) at that point. Change-Id: I185e3d7b53e36e90cf9ace5fa297a9e8008d75f3 Reviewed-on: https://go-review.googlesource.com/c/go/+/158377 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/mheap.go | 61 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index e9cd62d7d8..9e177284a5 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -428,28 +428,40 @@ func (s *mspan) physPageBounds() (uintptr, uintptr) { } func (h *mheap) coalesce(s *mspan) { - // We scavenge s at the end after coalescing if s or anything - // it merged with is marked scavenged. - needsScavenge := false - prescavenged := s.released() // number of bytes already scavenged. - // merge is a helper which merges other into s, deletes references to other // in heap metadata, and then discards it. other must be adjacent to s. - merge := func(other *mspan) { + merge := func(a, b, other *mspan) { + // Caller must ensure a.startAddr < b.startAddr and that either a or + // b is s. a and b must be adjacent. other is whichever of the two is + // not s. + + if pageSize < physPageSize && a.scavenged && b.scavenged { + // If we're merging two scavenged spans on systems where + // pageSize < physPageSize, then their boundary should always be on + // a physical page boundary, due to the realignment that happens + // during coalescing. Throw if this case is no longer true, which + // means the implementation should probably be changed to scavenge + // along the boundary. + _, start := a.physPageBounds() + end, _ := b.physPageBounds() + if start != end { + println("runtime: a.base=", hex(a.base()), "a.npages=", a.npages) + println("runtime: b.base=", hex(b.base()), "b.npages=", b.npages) + println("runtime: physPageSize=", physPageSize, "pageSize=", pageSize) + throw("neighboring scavenged spans boundary is not a physical page boundary") + } + } + // Adjust s via base and npages and also in heap metadata. s.npages += other.npages s.needzero |= other.needzero - if other.startAddr < s.startAddr { + if a == s { + h.setSpan(s.base()+s.npages*pageSize-1, s) + } else { s.startAddr = other.startAddr h.setSpan(s.base(), s) - } else { - h.setSpan(s.base()+s.npages*pageSize-1, s) } - // If before or s are scavenged, then we need to scavenge the final coalesced span. - needsScavenge = needsScavenge || other.scavenged || s.scavenged - prescavenged += other.released() - // The size is potentially changing so the treap needs to delete adjacent nodes and // insert back as a combined node. if other.scavenged { @@ -468,9 +480,9 @@ func (h *mheap) coalesce(s *mspan) { // b is s. a and b must be adjacent. other is whichever of the two is // not s. - // If pageSize <= physPageSize then spans are always aligned + // If pageSize >= physPageSize then spans are always aligned // to physical page boundaries, so just exit. - if pageSize <= physPageSize { + if pageSize >= physPageSize { return } // Since we're resizing other, we must remove it from the treap. @@ -505,7 +517,7 @@ func (h *mheap) coalesce(s *mspan) { // Coalesce with earlier, later spans. if before := spanOf(s.base() - 1); before != nil && before.state == mSpanFree { if s.scavenged == before.scavenged { - merge(before) + merge(before, s, before) } else { realign(before, s, before) } @@ -514,26 +526,11 @@ func (h *mheap) coalesce(s *mspan) { // Now check to see if next (greater addresses) span is free and can be coalesced. if after := spanOf(s.base() + s.npages*pageSize); after != nil && after.state == mSpanFree { if s.scavenged == after.scavenged { - merge(after) + merge(s, after, after) } else { realign(s, after, after) } } - - if needsScavenge { - // When coalescing spans, some physical pages which - // were not returned to the OS previously because - // they were only partially covered by the span suddenly - // become available for scavenging. We want to make sure - // those holes are filled in, and the span is properly - // scavenged. Rather than trying to detect those holes - // directly, we collect how many bytes were already - // scavenged above and subtract that from heap_released - // before re-scavenging the entire newly-coalesced span, - // which will implicitly bump up heap_released. - memstats.heap_released -= uint64(prescavenged) - s.scavenge() - } } func (s *mspan) scavenge() uintptr { -- GitLab From d13a9312f52a3e861e02aff8ccb3f237b45b0822 Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Sat, 9 Feb 2019 00:13:37 +0000 Subject: [PATCH 0760/1679] runtime: add tests for runtime mTreap This change exports the runtime mTreap in export_test.go and then adds a series of tests which check that the invariants of the treap are maintained under different operations. These tests also include tests for the treap iterator type. Also, we note that the find() operation on the treap never actually was best-fit, so the tests just ensure that it returns an appropriately sized span. For #30333. Change-Id: If81f7c746dda6677ebca925cb0a940134701b894 Reviewed-on: https://go-review.googlesource.com/c/go/+/164100 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/export_test.go | 113 ++++++++++++++++++++ src/runtime/mgclarge.go | 12 ++- src/runtime/treap_test.go | 207 +++++++++++++++++++++++++++++++++++++ 3 files changed, 329 insertions(+), 3 deletions(-) create mode 100644 src/runtime/treap_test.go diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index a16e664895..c950a6dc8e 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -515,3 +515,116 @@ func MapTombstoneCheck(m map[int]int) { } } } + +// Span is a safe wrapper around an mspan, whose memory +// is managed manually. +type Span struct { + *mspan +} + +func AllocSpan(base, npages uintptr) Span { + lock(&mheap_.lock) + s := (*mspan)(mheap_.spanalloc.alloc()) + unlock(&mheap_.lock) + s.init(base, npages) + return Span{s} +} + +func (s *Span) Free() { + lock(&mheap_.lock) + mheap_.spanalloc.free(unsafe.Pointer(s.mspan)) + unlock(&mheap_.lock) + s.mspan = nil +} + +func (s Span) Base() uintptr { + return s.mspan.base() +} + +func (s Span) Pages() uintptr { + return s.mspan.npages +} + +type TreapIter struct { + treapIter +} + +func (t TreapIter) Span() Span { + return Span{t.span()} +} + +func (t TreapIter) Valid() bool { + return t.valid() +} + +func (t TreapIter) Next() TreapIter { + return TreapIter{t.next()} +} + +func (t TreapIter) Prev() TreapIter { + return TreapIter{t.prev()} +} + +// Treap is a safe wrapper around mTreap for testing. +// +// It must never be heap-allocated because mTreap is +// notinheap. +// +//go:notinheap +type Treap struct { + mTreap +} + +func (t *Treap) Start() TreapIter { + return TreapIter{t.start()} +} + +func (t *Treap) End() TreapIter { + return TreapIter{t.end()} +} + +func (t *Treap) Insert(s Span) { + // mTreap uses a fixalloc in mheap_ for treapNode + // allocation which requires the mheap_ lock to manipulate. + // Locking here is safe because the treap itself never allocs + // or otherwise ends up grabbing this lock. + lock(&mheap_.lock) + t.insert(s.mspan) + unlock(&mheap_.lock) + t.CheckInvariants() +} + +func (t *Treap) Find(npages uintptr) TreapIter { + return TreapIter{t.find(npages)} +} + +func (t *Treap) Erase(i TreapIter) { + // mTreap uses a fixalloc in mheap_ for treapNode + // freeing which requires the mheap_ lock to manipulate. + // Locking here is safe because the treap itself never allocs + // or otherwise ends up grabbing this lock. + lock(&mheap_.lock) + t.erase(i.treapIter) + unlock(&mheap_.lock) + t.CheckInvariants() +} + +func (t *Treap) RemoveSpan(s Span) { + // See Erase about locking. + lock(&mheap_.lock) + t.removeSpan(s.mspan) + unlock(&mheap_.lock) + t.CheckInvariants() +} + +func (t *Treap) Size() int { + i := 0 + t.mTreap.treap.walkTreap(func(t *treapNode) { + i++ + }) + return i +} + +func (t *Treap) CheckInvariants() { + t.mTreap.treap.walkTreap(checkTreapNode) +} diff --git a/src/runtime/mgclarge.go b/src/runtime/mgclarge.go index dba617c25d..d816183c0c 100644 --- a/src/runtime/mgclarge.go +++ b/src/runtime/mgclarge.go @@ -134,16 +134,19 @@ func checkTreapNode(t *treapNode) { return t.npagesKey < npages } // t.npagesKey == npages - return uintptr(unsafe.Pointer(t.spanKey)) < uintptr(unsafe.Pointer(s)) + return t.spanKey.base() < s.base() } if t == nil { return } - if t.spanKey.npages != t.npagesKey || t.spanKey.next != nil { + if t.spanKey.next != nil || t.spanKey.prev != nil || t.spanKey.list != nil { + throw("span may be on an mSpanList while simultaneously in the treap") + } + if t.spanKey.npages != t.npagesKey { println("runtime: checkTreapNode treapNode t=", t, " t.npagesKey=", t.npagesKey, "t.spanKey.npages=", t.spanKey.npages) - throw("why does span.npages and treap.ngagesKey do not match?") + throw("span.npages and treap.npagesKey do not match") } if t.left != nil && lessThan(t.left.npagesKey, t.left.spanKey) { throw("t.lessThan(t.left.npagesKey, t.left.spanKey) is not false") @@ -301,6 +304,9 @@ func (root *mTreap) removeNode(t *treapNode) { // This is slightly more complicated than a simple binary tree search // since if an exact match is not found the next larger node is // returned. +// TODO(mknyszek): It turns out this routine does not actually find the +// best-fit span, so either fix that or move to something else first, and +// evaluate the performance implications of doing so. func (root *mTreap) find(npages uintptr) treapIter { t := root.treap for t != nil { diff --git a/src/runtime/treap_test.go b/src/runtime/treap_test.go new file mode 100644 index 0000000000..49d97699ca --- /dev/null +++ b/src/runtime/treap_test.go @@ -0,0 +1,207 @@ +// Copyright 2019 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 runtime_test + +import ( + "runtime" + "testing" +) + +var spanDesc = map[uintptr]uintptr{ + 0xc0000000: 2, + 0xc0006000: 1, + 0xc0010000: 8, + 0xc0022000: 7, + 0xc0034000: 4, + 0xc0040000: 5, + 0xc0050000: 5, + 0xc0060000: 5000, +} + +// Wrap the Treap one more time because go:notinheap doesn't +// actually follow a structure across package boundaries. +// +//go:notinheap +type treap struct { + runtime.Treap +} + +// This test ensures that the treap implementation in the runtime +// maintains all stated invariants after different sequences of +// insert, removeSpan, find, and erase. Invariants specific to the +// treap data structure are checked implicitly: after each mutating +// operation, treap-related invariants are checked for the entire +// treap. +func TestTreap(t *testing.T) { + // Set up a bunch of spans allocated into mheap_. + spans := make([]runtime.Span, 0, len(spanDesc)) + for base, pages := range spanDesc { + s := runtime.AllocSpan(base, pages) + defer s.Free() + spans = append(spans, s) + } + t.Run("Insert", func(t *testing.T) { + tr := treap{} + // Test just a very basic insert/remove for sanity. + tr.Insert(spans[0]) + tr.RemoveSpan(spans[0]) + }) + t.Run("FindTrivial", func(t *testing.T) { + tr := treap{} + // Test just a very basic find operation for sanity. + tr.Insert(spans[0]) + i := tr.Find(1) + if i.Span() != spans[0] { + t.Fatal("found unknown span in treap") + } + tr.RemoveSpan(spans[0]) + }) + t.Run("Find", func(t *testing.T) { + // Note that Find doesn't actually find the best-fit + // element, so just make sure it always returns an element + // that is at least large enough to satisfy the request. + // + // Run this 10 times, recreating the treap each time. + // Because of the non-deterministic structure of a treap, + // we'll be able to test different structures this way. + for i := 0; i < 10; i++ { + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + i := tr.Find(5) + if i.Span().Pages() < 5 { + t.Fatalf("expected span of size at least 5, got size %d", i.Span().Pages()) + } + for _, s := range spans { + tr.RemoveSpan(s) + } + } + }) + t.Run("Iterate", func(t *testing.T) { + t.Run("StartToEnd", func(t *testing.T) { + // Ensure progressing an iterator actually goes over the whole treap + // from the start and that it iterates over the elements in order. + // Also ensures that Start returns a valid iterator. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + nspans := 0 + lastSize := uintptr(0) + for i := tr.Start(); i.Valid(); i = i.Next() { + nspans++ + if lastSize > i.Span().Pages() { + t.Fatalf("not iterating in correct order: encountered size %d before %d", lastSize, i.Span().Pages()) + } + lastSize = i.Span().Pages() + } + if nspans != len(spans) { + t.Fatal("failed to iterate forwards over full treap") + } + for _, s := range spans { + tr.RemoveSpan(s) + } + }) + t.Run("EndToStart", func(t *testing.T) { + // Ensure progressing an iterator actually goes over the whole treap + // from the end and that it iterates over the elements in reverse + // order. Also ensures that End returns a valid iterator. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + nspans := 0 + lastSize := ^uintptr(0) + for i := tr.End(); i.Valid(); i = i.Prev() { + nspans++ + if lastSize < i.Span().Pages() { + t.Fatalf("not iterating in correct order: encountered size %d before %d", lastSize, i.Span().Pages()) + } + lastSize = i.Span().Pages() + } + if nspans != len(spans) { + t.Fatal("failed to iterate backwards over full treap") + } + for _, s := range spans { + tr.RemoveSpan(s) + } + }) + t.Run("Prev", func(t *testing.T) { + // Test the iterator invariant that i.prev().next() == i. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + i := tr.Start().Next().Next() + p := i.Prev() + if !p.Valid() { + t.Fatal("i.prev() is invalid") + } + if p.Next().Span() != i.Span() { + t.Fatal("i.prev().next() != i") + } + for _, s := range spans { + tr.RemoveSpan(s) + } + }) + t.Run("Next", func(t *testing.T) { + // Test the iterator invariant that i.next().prev() == i. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + i := tr.Start().Next().Next() + n := i.Next() + if !n.Valid() { + t.Fatal("i.next() is invalid") + } + if n.Prev().Span() != i.Span() { + t.Fatal("i.next().prev() != i") + } + for _, s := range spans { + tr.RemoveSpan(s) + } + }) + }) + t.Run("EraseOne", func(t *testing.T) { + // Test that erasing one iterator correctly retains + // all relationships between elements. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + i := tr.Start().Next().Next().Next() + s := i.Span() + n := i.Next() + p := i.Prev() + tr.Erase(i) + if n.Prev().Span() != p.Span() { + t.Fatal("p, n := i.Prev(), i.Next(); n.prev() != p after i was erased") + } + if p.Next().Span() != n.Span() { + t.Fatal("p, n := i.Prev(), i.Next(); p.next() != n after i was erased") + } + tr.Insert(s) + for _, s := range spans { + tr.RemoveSpan(s) + } + }) + t.Run("EraseAll", func(t *testing.T) { + // Test that erasing iterators actually removes nodes from the treap. + tr := treap{} + for _, s := range spans { + tr.Insert(s) + } + for i := tr.Start(); i.Valid(); { + n := i.Next() + tr.Erase(i) + i = n + } + if size := tr.Size(); size != 0 { + t.Fatalf("should have emptied out treap, %d spans left", size) + } + }) +} -- GitLab From 7b33b6274f36ecc5dd5c24c99c2f72d3edf79b3d Mon Sep 17 00:00:00 2001 From: Michael Anthony Knyszek Date: Fri, 29 Mar 2019 16:02:05 +0000 Subject: [PATCH 0761/1679] runtime: introduce treapForSpan to reduce code duplication Currently which treap a span should be inserted into/removed from is checked by looking at the span's properties. This logic is repeated in four places. As this logic gets more complex, it makes sense to de-duplicate this, so introduce treapForSpan instead which captures this logic by returning the appropriate treap for the span. For #30333. Change-Id: I4bd933d93dc50c5fc7c7c7f56ceb95194dcbfbcc Reviewed-on: https://go-review.googlesource.com/c/go/+/170857 Run-TryBot: Michael Knyszek TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/mheap.go | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 9e177284a5..ef31c8df16 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -464,11 +464,7 @@ func (h *mheap) coalesce(s *mspan) { // The size is potentially changing so the treap needs to delete adjacent nodes and // insert back as a combined node. - if other.scavenged { - h.scav.removeSpan(other) - } else { - h.free.removeSpan(other) - } + h.treapForSpan(other).removeSpan(other) other.state = mSpanDead h.spanalloc.free(unsafe.Pointer(other)) } @@ -486,11 +482,8 @@ func (h *mheap) coalesce(s *mspan) { return } // Since we're resizing other, we must remove it from the treap. - if other.scavenged { - h.scav.removeSpan(other) - } else { - h.free.removeSpan(other) - } + h.treapForSpan(other).removeSpan(other) + // Round boundary to the nearest physical page size, toward the // scavenged span. boundary := b.startAddr @@ -507,11 +500,7 @@ func (h *mheap) coalesce(s *mspan) { h.setSpan(boundary, b) // Re-insert other now that it has a new size. - if other.scavenged { - h.scav.insert(other) - } else { - h.free.insert(other) - } + h.treapForSpan(other).insert(other) } // Coalesce with earlier, later spans. @@ -1112,6 +1101,15 @@ func (h *mheap) setSpans(base, npage uintptr, s *mspan) { } } +// treapForSpan returns the appropriate treap for a span for +// insertion and removal. +func (h *mheap) treapForSpan(span *mspan) *mTreap { + if span.scavenged { + return &h.scav + } + return &h.free +} + // pickFreeSpan acquires a free span from internal free list // structures if one is available. Otherwise returns nil. // h must be locked. @@ -1343,11 +1341,7 @@ func (h *mheap) freeSpanLocked(s *mspan, acctinuse, acctidle bool, unusedsince i h.coalesce(s) // Insert s into the appropriate treap. - if s.scavenged { - h.scav.insert(s) - } else { - h.free.insert(s) - } + h.treapForSpan(s).insert(s) } // scavengeLargest scavenges nbytes worth of spans in unscav -- GitLab From 3cb92fcba71f9c0d64b3b714fc92870065848345 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Tue, 2 Apr 2019 04:35:50 -0700 Subject: [PATCH 0762/1679] cmd/link/internal/ld: fix c-archive mach-o compatibility These workarounds predate proper DWARF support and are no longer necessary. Before this patch, running `/usr/bin/symbols go.o` using the object in the c-archive would fail, causing App Store rejections. Fixes #31022 #28997 Change-Id: I6a210b6369c13038777c6e21e874e81afcb50c2f Reviewed-on: https://go-review.googlesource.com/c/go/+/170377 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/dwarf_test.go | 20 ++++++++++++++++++++ src/cmd/link/internal/ld/macho.go | 8 ++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index ecc96019be..235db39dda 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -5,6 +5,7 @@ package main import ( + "bytes" cmddwarf "cmd/internal/dwarf" "cmd/internal/objfile" "debug/dwarf" @@ -86,6 +87,22 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) } exe = filepath.Join(tmpDir, "go.o") } + + if runtime.GOOS == "darwin" { + if _, err = exec.LookPath("symbols"); err == nil { + // Ensure Apple's tooling can parse our object for symbols. + out, err = exec.Command("symbols", exe).CombinedOutput() + if err != nil { + t.Fatal(err) + } else { + if bytes.HasPrefix(out, []byte("Unable to find file")) { + // This failure will cause the App Store to reject our binaries. + t.Fatalf("/usr/bin/symbols %v: failed to parse file", filepath.Base(exe)) + } + } + } + } + f, err := objfile.Open(exe) if err != nil { t.Fatal(err) @@ -148,6 +165,9 @@ func testDWARF(t *testing.T, buildmode string, expectDWARF bool, env ...string) func TestDWARF(t *testing.T) { testDWARF(t, "", true) + if runtime.GOOS == "darwin" { + testDWARF(t, "c-archive", true) + } } func TestDWARFiOS(t *testing.T) { diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index d13857081a..6ebae160b1 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -560,12 +560,8 @@ func Asmbmacho(ctxt *Link) { ms = newMachoSeg("", 40) ms.fileoffset = Segtext.Fileoff - if ctxt.Arch.Family == sys.ARM || ctxt.BuildMode == BuildModeCArchive { - ms.filesize = Segdata.Fileoff + Segdata.Filelen - Segtext.Fileoff - } else { - ms.filesize = Segdwarf.Fileoff + Segdwarf.Filelen - Segtext.Fileoff - ms.vsize = Segdwarf.Vaddr + Segdwarf.Length - Segtext.Vaddr - } + ms.filesize = Segdwarf.Fileoff + Segdwarf.Filelen - Segtext.Fileoff + ms.vsize = Segdwarf.Vaddr + Segdwarf.Length - Segtext.Vaddr } /* segment for zero page */ -- GitLab From 770f2a17d28ae9311331692ff5e7e5950ec2c267 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 11 Apr 2019 09:09:39 -0700 Subject: [PATCH 0763/1679] syscall: enforce minimum buffer size to call ReadDirent freebsd and netbsd require a minimum buffer size of 1K. Note this doesn't quite fix freebsd, it has other bugs, I'll file a separate issue. Fixes #31403 Change-Id: I9d7e78f6d30859b34715afadc4b8bd3b1ecc606b Reviewed-on: https://go-review.googlesource.com/c/go/+/171757 Run-TryBot: Keith Randall Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/syscall/dirent_bsd_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/syscall/dirent_bsd_test.go b/src/syscall/dirent_bsd_test.go index c0ae2a91b9..1f8410d7fc 100644 --- a/src/syscall/dirent_bsd_test.go +++ b/src/syscall/dirent_bsd_test.go @@ -12,6 +12,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "sort" "strconv" "strings" @@ -79,6 +80,14 @@ func TestDirent(t *testing.T) { func TestDirentRepeat(t *testing.T) { const N = 100 + // Note: the size of the buffer is small enough that the loop + // below will need to execute multiple times. See issue #31368. + size := N * unsafe.Offsetof(syscall.Dirent{}.Name) / 4 + if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" { + if size < 1024 { + size = 1024 // DIRBLKSIZ, see issue 31403. + } + } // Make a directory containing N files d, err := ioutil.TempDir("", "direntRepeat-test") @@ -106,9 +115,7 @@ func TestDirentRepeat(t *testing.T) { defer syscall.Close(fd) var files2 []string for { - // Note: the buf is small enough that this loop will need to - // execute multiple times. See issue #31368. - buf := make([]byte, N*unsafe.Offsetof(syscall.Dirent{}.Name)/4) + buf := make([]byte, size) n, err := syscall.ReadDirent(fd, buf) if err != nil { t.Fatalf("syscall.readdir: %v", err) -- GitLab From 8d86ef221631757ef4d89401947db674c730f94e Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 11 Apr 2019 14:00:07 -0400 Subject: [PATCH 0764/1679] runtime: set itab.fun[0] only on successful conversion For a failed interface conversion not in ",ok" form, getitab calls itab.init to get the name of the missing method for the panic message. itab.init will try to find the methods, populate the method table as it goes. When some method is missing, it sets itab.fun[0] to 0 before return. There is a small window that itab.fun[0] could be non-zero. If concurrently, another goroutine tries to do the same interface conversion, it will read the same itab's fun[0]. If this happens in the small window, it sees a non-zero fun[0] and thinks the conversion succeeded, which is bad. Fix the race by setting fun[0] to non-zero only when we know the conversion succeeds. While here, also simplify the syntax slightly. Fixes #31419. Change-Id: Ied34d3043079eb933e330c5877b85e13f98f1916 Reviewed-on: https://go-review.googlesource.com/c/go/+/171759 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/runtime/iface.go | 9 +++++- test/fixedbugs/issue31419.go | 58 ++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 test/fixedbugs/issue31419.go diff --git a/src/runtime/iface.go b/src/runtime/iface.go index 246b63b897..bb4eccc9bd 100644 --- a/src/runtime/iface.go +++ b/src/runtime/iface.go @@ -195,6 +195,8 @@ func (m *itab) init() string { nt := int(x.mcount) xmhdr := (*[1 << 16]method)(add(unsafe.Pointer(x), uintptr(x.moff)))[:nt:nt] j := 0 + methods := (*[1 << 16]unsafe.Pointer)(unsafe.Pointer(&m.fun[0]))[:ni:ni] + var fun0 unsafe.Pointer imethods: for k := 0; k < ni; k++ { i := &inter.mhdr[k] @@ -216,7 +218,11 @@ imethods: if tname.isExported() || pkgPath == ipkg { if m != nil { ifn := typ.textOff(t.ifn) - *(*unsafe.Pointer)(add(unsafe.Pointer(&m.fun[0]), uintptr(k)*sys.PtrSize)) = ifn + if k == 0 { + fun0 = ifn // we'll set m.fun[0] at the end + } else { + methods[k] = ifn + } } continue imethods } @@ -226,6 +232,7 @@ imethods: m.fun[0] = 0 return iname } + m.fun[0] = uintptr(fun0) m.hash = typ.hash return "" } diff --git a/test/fixedbugs/issue31419.go b/test/fixedbugs/issue31419.go new file mode 100644 index 0000000000..233111ae14 --- /dev/null +++ b/test/fixedbugs/issue31419.go @@ -0,0 +1,58 @@ +// run + +// Copyright 2019 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. + +// Issue 31419: race in getitab when two goroutines try +// to do the same failed interface conversion. + +package main + +type T int + +func (t T) M() {} + +type I interface { + M() + M2() +} + +var t T +var e interface{} = &t +var ok = false +var ch = make(chan int) + +func main() { + _, ok = e.(I) // populate itab cache with a false result + + go f() // get itab in a loop + + var i I + for k := 0; k < 10000; k++ { + i, ok = e.(I) // read the cached itab + if ok { + println("iteration", k, "i =", i, "&t =", &t) + panic("conversion succeeded") + } + } + <-ch +} + +func f() { + for i := 0; i < 10000; i++ { + f1() + } + ch <- 1 +} + +func f1() { + defer func() { + err := recover() + if err == nil { + panic("did not panic") + } + }() + i := e.(I) // triggers itab.init, for getting the panic string + _ = i +} -- GitLab From 2ebdb5ec0652742afe7f0c58f708ca5128ef5d5e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 11 Apr 2019 15:42:21 -0400 Subject: [PATCH 0765/1679] os: fix aliasing bug in RemoveAllTestHook restoration The code to swap RemoveAllTestHook in and out in TestRemoveAllWithMoreErrorThanReqSize was making a copy of the RemoveAllTestHook pointer, then attempting to restore by loading from the copy of that pointer. Since the two copies of the pointer aliased the same address, the restore operation had no effect, and any RemoveAll tests that happened to run after TestRemoveAllWithMoreErrorThanReqSize would fail. Fixes #31421 Change-Id: I7028475f5ceb3b0a2fa69d22af8d3379508c4531 Reviewed-on: https://go-review.googlesource.com/c/go/+/171777 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick --- src/os/removeall_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/os/removeall_test.go b/src/os/removeall_test.go index eb9459445c..96e0fc5a55 100644 --- a/src/os/removeall_test.go +++ b/src/os/removeall_test.go @@ -412,13 +412,14 @@ func TestRemoveAllWithMoreErrorThanReqSize(t *testing.T) { if testing.Short() { t.Skip("skipping in short mode") } - oldRemoveAllTestHook := RemoveAllTestHook + + defer func(oldHook func(error) error) { + *RemoveAllTestHook = oldHook + }(*RemoveAllTestHook) + *RemoveAllTestHook = func(err error) error { return errors.New("error from RemoveAllTestHook") } - defer func() { - *RemoveAllTestHook = *oldRemoveAllTestHook - }() tmpDir, err := ioutil.TempDir("", "TestRemoveAll-") if err != nil { -- GitLab From d86c35e5232744674907fec5bd738dd3fbbf0f53 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 11 Apr 2019 15:47:33 -0400 Subject: [PATCH 0766/1679] test: add testcases for gccgo bug Add a couple of testcase for a gccgo type checking bug. Updates #31412. Change-Id: I7a813dafde78e4add1432602d2af5fe879415e1c Reviewed-on: https://go-review.googlesource.com/c/go/+/171761 Run-TryBot: Brad Fitzpatrick Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- test/fixedbugs/issue31412a.go | 32 ++++++++++++++++++++++++++++++++ test/fixedbugs/issue31412b.go | 20 ++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 test/fixedbugs/issue31412a.go create mode 100644 test/fixedbugs/issue31412b.go diff --git a/test/fixedbugs/issue31412a.go b/test/fixedbugs/issue31412a.go new file mode 100644 index 0000000000..75021c68d2 --- /dev/null +++ b/test/fixedbugs/issue31412a.go @@ -0,0 +1,32 @@ +// compile + +// Copyright 2019 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. + +// This code was incorrectly flagged as erroneous by gccgo. + +package main + +type Name string + +type EFunc func(int) int + +func Register(f EFunc, names ...Name) int { + return f(len(names)) +} + +const ( + B Name = "B" +) + +func RegisterIt() { + n := B + "Duck" + d := B + "Goose" + f := func(x int) int { return x + 9 } + Register(f, n, d) +} + +func main() { + RegisterIt() +} diff --git a/test/fixedbugs/issue31412b.go b/test/fixedbugs/issue31412b.go new file mode 100644 index 0000000000..6c4ec00dc9 --- /dev/null +++ b/test/fixedbugs/issue31412b.go @@ -0,0 +1,20 @@ +// errorcheck + +// Copyright 2019 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. + +// This code was incorrectly accepted by gccgo. + +package main + +type N string +type M string + +const B N = "B" +const C M = "C" + +func main() { + q := B + C // ERROR "mismatched types|incompatible types" + println(q) +} -- GitLab From 0188cb0e8a7a2355a0eebbf557fc444e5bfa30de Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 3 Apr 2019 16:32:42 -0400 Subject: [PATCH 0767/1679] runtime: note about improved _Gscan bit handling Change-Id: I8de5aa64a24e77e0ef876918fcace7668769ebc2 Reviewed-on: https://go-review.googlesource.com/c/go/+/171022 Reviewed-by: Michael Knyszek --- src/runtime/runtime2.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index cfea1cd45f..8d749f3d7c 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -22,6 +22,13 @@ const ( // If you add to this list, add to the list // of "okay during garbage collection" status // in mgcmark.go too. + // + // TODO(austin): The _Gscan bit could be much lighter-weight. + // For example, we could choose not to run _Gscanrunnable + // goroutines found in the run queue, rather than CAS-looping + // until they become _Grunnable. And transitions like + // _Gscanwaiting -> _Gscanrunnable are actually okay because + // they don't affect stack ownership. // _Gidle means this goroutine was just allocated and has not // yet been initialized. -- GitLab From 9d088fbfda273e26f78c9b05bcc97a8f674cf69b Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 11 Apr 2019 15:43:54 -0400 Subject: [PATCH 0768/1679] runtime: abstract initializing and destroying Ps out of procresize procresize is rather ungainly because it includes all of the code to initialize new Ps and tear down unused Ps. Pull these out into their own methods on the p type. This also tweaks the initialization loop in procresize so we only initialize new Ps (and Ps we previously destroyed) rather than asking each P "have you been initialized?" This is for #10958 and #24543, but it's also just a nice cleanup. Change-Id: Ic1242066f572c94a23cea8ea4dc47c918e31d559 Reviewed-on: https://go-review.googlesource.com/c/go/+/171762 Reviewed-by: Michael Knyszek --- src/runtime/proc.go | 168 ++++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 77 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 29763d328a..1e3c53826c 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -3881,6 +3881,92 @@ func setcpuprofilerate(hz int32) { _g_.m.locks-- } +// init initializes pp, which may be a freshly allocated p or a +// previously destroyed p, and transitions it to status _Pgcstop. +func (pp *p) init(id int32) { + pp.id = id + pp.status = _Pgcstop + pp.sudogcache = pp.sudogbuf[:0] + for i := range pp.deferpool { + pp.deferpool[i] = pp.deferpoolbuf[i][:0] + } + pp.wbBuf.reset() + if pp.mcache == nil { + if id == 0 { + if getg().m.mcache == nil { + throw("missing mcache?") + } + pp.mcache = getg().m.mcache // bootstrap + } else { + pp.mcache = allocmcache() + } + } + if raceenabled && pp.raceprocctx == 0 { + if id == 0 { + pp.raceprocctx = raceprocctx0 + raceprocctx0 = 0 // bootstrap + } else { + pp.raceprocctx = raceproccreate() + } + } +} + +// destroy releases all of the resources associated with pp and +// transitions it to status _Pdead. +// +// sched.lock must be held and the world must be stopped. +func (pp *p) destroy() { + // Move all runnable goroutines to the global queue + for pp.runqhead != pp.runqtail { + // Pop from tail of local queue + pp.runqtail-- + gp := pp.runq[pp.runqtail%uint32(len(pp.runq))].ptr() + // Push onto head of global queue + globrunqputhead(gp) + } + if pp.runnext != 0 { + globrunqputhead(pp.runnext.ptr()) + pp.runnext = 0 + } + // If there's a background worker, make it runnable and put + // it on the global queue so it can clean itself up. + if gp := pp.gcBgMarkWorker.ptr(); gp != nil { + casgstatus(gp, _Gwaiting, _Grunnable) + if trace.enabled { + traceGoUnpark(gp, 0) + } + globrunqput(gp) + // This assignment doesn't race because the + // world is stopped. + pp.gcBgMarkWorker.set(nil) + } + // Flush p's write barrier buffer. + if gcphase != _GCoff { + wbBufFlush1(pp) + pp.gcw.dispose() + } + for i := range pp.sudogbuf { + pp.sudogbuf[i] = nil + } + pp.sudogcache = pp.sudogbuf[:0] + for i := range pp.deferpool { + for j := range pp.deferpoolbuf[i] { + pp.deferpoolbuf[i][j] = nil + } + pp.deferpool[i] = pp.deferpoolbuf[i][:0] + } + freemcache(pp.mcache) + pp.mcache = nil + gfpurge(pp) + traceProcFree(pp) + if raceenabled { + raceprocdestroy(pp.raceprocctx) + pp.raceprocctx = 0 + } + pp.gcAssistTime = 0 + pp.status = _Pdead +} + // Change number of processors. The world is stopped, sched is locked. // gcworkbufs are not being modified by either the GC or // the write barrier code. @@ -3919,40 +4005,16 @@ func procresize(nprocs int32) *p { } // initialize new P's - for i := int32(0); i < nprocs; i++ { + for i := old; i < nprocs; i++ { pp := allp[i] if pp == nil { pp = new(p) - pp.id = i - pp.status = _Pgcstop - pp.sudogcache = pp.sudogbuf[:0] - for i := range pp.deferpool { - pp.deferpool[i] = pp.deferpoolbuf[i][:0] - } - pp.wbBuf.reset() - atomicstorep(unsafe.Pointer(&allp[i]), unsafe.Pointer(pp)) - } - if pp.mcache == nil { - if old == 0 && i == 0 { - if getg().m.mcache == nil { - throw("missing mcache?") - } - pp.mcache = getg().m.mcache // bootstrap - } else { - pp.mcache = allocmcache() - } - } - if raceenabled && pp.raceprocctx == 0 { - if old == 0 && i == 0 { - pp.raceprocctx = raceprocctx0 - raceprocctx0 = 0 // bootstrap - } else { - pp.raceprocctx = raceproccreate() - } } + pp.init(i) + atomicstorep(unsafe.Pointer(&allp[i]), unsafe.Pointer(pp)) } - // free unused P's + // release resources from unused P's for i := nprocs; i < old; i++ { p := allp[i] if trace.enabled && p == getg().m.p.ptr() { @@ -3961,55 +4023,7 @@ func procresize(nprocs int32) *p { traceGoSched() traceProcStop(p) } - // move all runnable goroutines to the global queue - for p.runqhead != p.runqtail { - // pop from tail of local queue - p.runqtail-- - gp := p.runq[p.runqtail%uint32(len(p.runq))].ptr() - // push onto head of global queue - globrunqputhead(gp) - } - if p.runnext != 0 { - globrunqputhead(p.runnext.ptr()) - p.runnext = 0 - } - // if there's a background worker, make it runnable and put - // it on the global queue so it can clean itself up - if gp := p.gcBgMarkWorker.ptr(); gp != nil { - casgstatus(gp, _Gwaiting, _Grunnable) - if trace.enabled { - traceGoUnpark(gp, 0) - } - globrunqput(gp) - // This assignment doesn't race because the - // world is stopped. - p.gcBgMarkWorker.set(nil) - } - // Flush p's write barrier buffer. - if gcphase != _GCoff { - wbBufFlush1(p) - p.gcw.dispose() - } - for i := range p.sudogbuf { - p.sudogbuf[i] = nil - } - p.sudogcache = p.sudogbuf[:0] - for i := range p.deferpool { - for j := range p.deferpoolbuf[i] { - p.deferpoolbuf[i][j] = nil - } - p.deferpool[i] = p.deferpoolbuf[i][:0] - } - freemcache(p.mcache) - p.mcache = nil - gfpurge(p) - traceProcFree(p) - if raceenabled { - raceprocdestroy(p.raceprocctx) - p.raceprocctx = 0 - } - p.gcAssistTime = 0 - p.status = _Pdead + p.destroy() // can't free P itself because it can be referenced by an M in syscall } -- GitLab From ab2a0803383f0f019db0b2252095f2fdb7735cea Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 11 Apr 2019 04:57:14 +0000 Subject: [PATCH 0769/1679] doc: document Go 1.12.4 and Go 1.11.9 Updates #31293 Change-Id: I3d72f732be7b28059310ea6fc134c3bfac81492d Reviewed-on: https://go-review.googlesource.com/c/go/+/171578 Reviewed-by: Dmitri Shuralyov --- doc/devel/release.html | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/devel/release.html b/doc/devel/release.html index 2a7a499024..1d0b535197 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -49,7 +49,13 @@ command, the runtime, and the doc, net,

    -go1.12.3 (released 2019/04/08) fixes an issue where using the prebuilt binary +go1.12.3 (released 2019/04/08) was accidentally released without its +intended fix. It is identical to go1.12.2, except for its version +number. The intended fix is in go1.12.4. +

    + +

    +go1.12.4 (released 2019/04/11) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. @@ -122,7 +128,13 @@ go1.11.7 (released 2019/04/05) includes fixes to the runtime and the

    -go1.11.8 (released 2019/04/08) fixes an issue where using the prebuilt binary +go1.11.8 (released 2019/04/08) was accidentally released without its +intended fix. It is identical to go1.11.7, except for its version +number. The intended fix is in go1.11.9. +

    + +

    +go1.11.9 (released 2019/04/11) fixes an issue where using the prebuilt binary releases on older versions of GNU/Linux led to failures when linking programs that used cgo. -- GitLab From ccaa4913864d49137012d04a0cd3ddf2d8ffc015 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 11 Apr 2019 16:35:56 -0400 Subject: [PATCH 0770/1679] cmd/go: log failures to remove workdir Failures here don't otherwise affect the build, but they do cause a slow file leak in the user's temp directory. The user deserves at least a cursory warning that something may be amiss. Updates #30789 Change-Id: Id0e72b1967e7f7c88cdc94d532554496653f264b Reviewed-on: https://go-review.googlesource.com/c/go/+/171764 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/work/action.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 415df94f4a..052811d34a 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -242,7 +242,11 @@ func (b *Builder) Init() { } if !cfg.BuildWork { workdir := b.WorkDir - base.AtExit(func() { os.RemoveAll(workdir) }) + base.AtExit(func() { + if err := os.RemoveAll(workdir); err != nil { + fmt.Fprintf(os.Stderr, "go: failed to remove work dir: %s\n", err) + } + }) } } -- GitLab From a5032bc86c1a661cf3a68d5095c7a86591c62bc1 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 11 Apr 2019 16:18:29 -0400 Subject: [PATCH 0771/1679] os: don't leak file in ExampleOpenFile_append failure path Fixes #31424 Change-Id: I8364578cbc77827552bd764c716f68495ec51547 Reviewed-on: https://go-review.googlesource.com/c/go/+/171763 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/example_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/os/example_test.go b/src/os/example_test.go index 8b6566e149..822886f70c 100644 --- a/src/os/example_test.go +++ b/src/os/example_test.go @@ -28,6 +28,7 @@ func ExampleOpenFile_append() { log.Fatal(err) } if _, err := f.Write([]byte("appended some data\n")); err != nil { + f.Close() // ignore error; Write error takes precedence log.Fatal(err) } if err := f.Close(); err != nil { -- GitLab From 4e2b4d7fb2343ea5a05fcb9da821b6912ca86893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 10 Apr 2019 16:29:57 +0200 Subject: [PATCH 0772/1679] runtime: move libcall to stack for syscall package on aix/ppc64 Inside syscall_syscall6 function, libcall can directly be on the stack. This is first function called with //go:nosplit, unlike runtime syscalls which can be called during the sigtramp or by others //go:nosplit functions. Change-Id: Icc28def1a63e525850ec3bfb8184b995dfeaa736 Reviewed-on: https://go-review.googlesource.com/c/go/+/171338 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/syscall_aix.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/runtime/syscall_aix.go b/src/runtime/syscall_aix.go index 7f2bcbe9d9..1ed1dfa0bb 100644 --- a/src/runtime/syscall_aix.go +++ b/src/runtime/syscall_aix.go @@ -69,11 +69,13 @@ func syscall_RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) { } //go:nosplit +//go:cgo_unsafe_args func syscall_syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { - c := getg().m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = nargs - c.args = uintptr(noescape(unsafe.Pointer(&a1))) + c := libcall{ + fn: fn, + n: nargs, + args: uintptr(unsafe.Pointer(&a1)), + } entersyscallblock() asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) @@ -82,11 +84,13 @@ func syscall_syscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err ui } //go:nosplit +//go:cgo_unsafe_args func syscall_rawSyscall6(fn, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) { - c := getg().m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = nargs - c.args = uintptr(noescape(unsafe.Pointer(&a1))) + c := libcall{ + fn: fn, + n: nargs, + args: uintptr(unsafe.Pointer(&a1)), + } asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) -- GitLab From 7f9e0220cdc3516308d24bba4ef8180b6a923a27 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 11 Apr 2019 18:05:19 -0700 Subject: [PATCH 0773/1679] cmd/link: fix off-by-one in ftabaddstring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ftabaddstring adds a string to the pclntab. The pclntab uses C strings, so the code added 1 to the length. However, it also added an extraneous 1 in the Grow call. Remove that. While we're here, simplify, document, remove an unnecessary parameter, and remove some unnecessary conversions. Shaves off a few bytes here and there, and thus updates #6853. file before after Δ % go 14671316 14659028 -12288 -0.084% addr2line 4280552 4276456 -4096 -0.096% api 6058936 6050744 -8192 -0.135% buildid 2861040 2856944 -4096 -0.143% cgo 4867912 4863816 -4096 -0.084% compile 25770104 25753720 -16384 -0.064% cover 5286888 5282792 -4096 -0.077% dist 3634048 3629952 -4096 -0.113% doc 4691000 4686904 -4096 -0.087% fix 3393736 3389640 -4096 -0.121% link 6109280 6105184 -4096 -0.067% nm 4225960 4221864 -4096 -0.097% objdump 4636520 4632424 -4096 -0.088% pack 2285200 2281104 -4096 -0.179% pprof 14657508 14645220 -12288 -0.084% test2json 2818568 2814472 -4096 -0.145% trace 11618524 11610332 -8192 -0.071% vet 8403544 8395352 -8192 -0.097% Change-Id: I20b1f541de5d3ed326dd937aad6a43801862df51 Reviewed-on: https://go-review.googlesource.com/c/go/+/171820 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/link/internal/ld/pcln.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 5c590608e3..5924acc0b0 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -104,12 +104,11 @@ func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 { return int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(start))) } -func ftabaddstring(ctxt *Link, ftab *sym.Symbol, s string) int32 { - n := int32(len(s)) + 1 - start := int32(len(ftab.P)) - ftab.Grow(int64(start) + int64(n) + 1) +func ftabaddstring(ftab *sym.Symbol, s string) int32 { + start := len(ftab.P) + ftab.Grow(int64(start + len(s) + 1)) // make room for s plus trailing NUL copy(ftab.P[start:], s) - return start + return int32(start) } // numberfile assigns a file number to the file if it hasn't been assigned already. @@ -236,7 +235,7 @@ func (ctxt *Link) pclntab() { nameToOffset := func(name string) int32 { nameoff, ok := funcnameoff[name] if !ok { - nameoff = ftabaddstring(ctxt, ftab, name) + nameoff = ftabaddstring(ftab, name) funcnameoff[name] = nameoff } return nameoff @@ -446,7 +445,7 @@ func (ctxt *Link) pclntab() { ftab.SetUint32(ctxt.Arch, int64(start), uint32(len(ctxt.Filesyms)+1)) for i := len(ctxt.Filesyms) - 1; i >= 0; i-- { s := ctxt.Filesyms[i] - ftab.SetUint32(ctxt.Arch, int64(start)+s.Value*4, uint32(ftabaddstring(ctxt, ftab, s.Name))) + ftab.SetUint32(ctxt.Arch, int64(start)+s.Value*4, uint32(ftabaddstring(ftab, s.Name))) } ftab.Size = int64(len(ftab.P)) -- GitLab From df1cdbf7933ae03d716e4ce657f15d8e77309da5 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 12 Apr 2019 14:20:21 +0200 Subject: [PATCH 0774/1679] bootstrap.bash: fix build if no exec wrapper exists Since CL 170941 bootstrap.bash fails if no exec wrapper exists for a given GOOS/GOARCH yet: #### Building ../../go-linux-arm-bootstrap Building Go cmd/dist using /usr/local/go. Building Go toolchain1 using /usr/local/go. Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1. Building Go toolchain2 using go_bootstrap and Go toolchain1. Building Go toolchain3 using go_bootstrap and Go toolchain2. Building packages and commands for host, linux/amd64. Building packages and commands for target, linux/arm. rm: cannot remove 'bin/go_linux_arm_exec': No such file or directory Fix it by using 'rm -f' to ignore nonexisting files. Change-Id: Ib4b1e19747052fa4dca06319f35cc25a0545c4f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/171722 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Elias Naur --- src/bootstrap.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bootstrap.bash b/src/bootstrap.bash index 673fb61c67..bc9d445345 100755 --- a/src/bootstrap.bash +++ b/src/bootstrap.bash @@ -72,7 +72,7 @@ if [ "$goos" = "$gohostos" -a "$goarch" = "$gohostarch" ]; then # prepare a clean toolchain for others. true else - rm bin/go_${goos}_${goarch}_exec + rm -f bin/go_${goos}_${goarch}_exec mv bin/*_*/* bin rmdir bin/*_* rm -rf "pkg/${gohostos}_${gohostarch}" "pkg/tool/${gohostos}_${gohostarch}" -- GitLab From f448c212a101f4fcf54a694e4a1cfd3459635bcb Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 11 Apr 2019 16:48:05 -0400 Subject: [PATCH 0775/1679] runtime: delete unused isscanstatus function Change-Id: I693250e980cc60ea151736b42ac6b1426ab801b3 Reviewed-on: https://go-review.googlesource.com/c/go/+/171765 Run-TryBot: Austin Clements Reviewed-by: Michael Knyszek TryBot-Result: Gobot Gobot --- src/runtime/proc.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 1e3c53826c..16794e1ab0 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -692,13 +692,6 @@ func freezetheworld() { usleep(1000) } -func isscanstatus(status uint32) bool { - if status == _Gscan { - throw("isscanstatus: Bad status Gscan") - } - return status&_Gscan == _Gscan -} - // All reads and writes of g's status go through readgstatus, casgstatus // castogscanstatus, casfrom_Gscanstatus. //go:nosplit -- GitLab From 90458ec80e545989634940629f7393eb45545315 Mon Sep 17 00:00:00 2001 From: Daniel Langner Date: Fri, 12 Apr 2019 12:21:16 +0000 Subject: [PATCH 0776/1679] doc/go_faq: fix grammar Change-Id: Idbd6c97d754e3565aeade4d9e8011a76e8da19c2 GitHub-Last-Rev: 22e917e5ca429d76506346841e5b3c93c2a5f3fb GitHub-Pull-Request: golang/go#31439 Reviewed-on: https://go-review.googlesource.com/c/go/+/171885 Reviewed-by: Brad Fitzpatrick --- doc/go_faq.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/go_faq.html b/doc/go_faq.html index 305878f237..dd3ba84cac 100644 --- a/doc/go_faq.html +++ b/doc/go_faq.html @@ -2082,8 +2082,8 @@ At the beginning of the project we considered using LLVM for our performance goals. More important in retrospect, starting with LLVM would have made it harder to introduce some of the ABI and related changes, such as -stack management, that Go requires but not are not part of the -standard C setup. +stack management, that Go requires but are not part of the standard +C setup. A new LLVM implementation is starting to come together now, however.

    -- GitLab From 77fa11dffb59334eb32502c53faf9946a7caa1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Thu, 11 Apr 2019 16:26:38 +0200 Subject: [PATCH 0777/1679] net: retrieve if unix network is available only once for AIX The previous version was executing "oslevel -s" everytime testableNetwork was called with unix/unixgram network. The current version retrieves if the network is possible only once at the beginning of the tests. This is clearly faster: ok net 74.045s ok net 5.098s Change-Id: I12549da27721f85c007cf17cab5cfdbfeb839cf6 Reviewed-on: https://go-review.googlesource.com/c/go/+/171717 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/platform_test.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/net/platform_test.go b/src/net/platform_test.go index 7e9ad70d19..10f55c971d 100644 --- a/src/net/platform_test.go +++ b/src/net/platform_test.go @@ -14,6 +14,23 @@ import ( "testing" ) +var unixEnabledOnAIX bool + +func init() { + if runtime.GOOS == "aix" { + // Unix network isn't properly working on AIX 7.2 with + // Technical Level < 2. + // The information is retrieved only once in this init() + // instead of everytime testableNetwork is called. + out, _ := exec.Command("oslevel", "-s").Output() + if len(out) >= len("7200-XX-ZZ-YYMM") { // AIX 7.2, Tech Level XX, Service Pack ZZ, date YYMM + aixVer := string(out[:4]) + tl, _ := strconv.Atoi(string(out[5:7])) + unixEnabledOnAIX = aixVer > "7200" || (aixVer == "7200" && tl >= 2) + } + } +} + // testableNetwork reports whether network is testable on the current // platform configuration. func testableNetwork(network string) bool { @@ -38,15 +55,7 @@ func testableNetwork(network string) bool { case "android", "nacl", "plan9", "windows": return false case "aix": - // Unix network isn't properly working on AIX 7.2 with Technical Level < 2 - out, err := exec.Command("oslevel", "-s").Output() - if err != nil { - return false - } - if tl, err := strconv.Atoi(string(out[5:7])); err != nil || tl < 2 { - return false - } - return true + return unixEnabledOnAIX } // iOS does not support unix, unixgram. if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { -- GitLab From 63cad96a9b38bfcde48a167e070cc8843c5aed13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 10 Apr 2019 17:16:48 +0200 Subject: [PATCH 0778/1679] syscall: add aix to syscall_unix_test.go This file was forgotten during the port of aix/ppc64. In order to make its tests passed, a few things were added: - Add termios.h to zerrors - Add AF_LOCAL = AF_UNIX as this constant doesn't exits natively on AIX - Fix the alignment in cmsghdr structure. TestPassFD doesn't work on AIX TL<2 because getsockname isn't working as expected with unix socket. Change-Id: I928705bfc78ada29e66df61fe97d8f379f8c739b Reviewed-on: https://go-review.googlesource.com/c/go/+/171339 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/syscall/mkerrors.sh | 1 + src/syscall/sockcmsg_unix.go | 3 ++ src/syscall/syscall_aix.go | 7 ++++ src/syscall/syscall_unix_test.go | 23 ++++++++++- src/syscall/zerrors_aix_ppc64.go | 69 +++++++++++++++++++++++++++++++ src/syscall/zsyscall_aix_ppc64.go | 27 ++++++++++++ 6 files changed, 129 insertions(+), 1 deletion(-) diff --git a/src/syscall/mkerrors.sh b/src/syscall/mkerrors.sh index d5880dcaf2..fc86d8bd7e 100755 --- a/src/syscall/mkerrors.sh +++ b/src/syscall/mkerrors.sh @@ -28,6 +28,7 @@ includes_AIX=' #include #include #include +#include ' includes_Darwin=' diff --git a/src/syscall/sockcmsg_unix.go b/src/syscall/sockcmsg_unix.go index fa198686b1..fd5bfaf549 100644 --- a/src/syscall/sockcmsg_unix.go +++ b/src/syscall/sockcmsg_unix.go @@ -18,6 +18,9 @@ func cmsgAlignOf(salen int) int { salign := sizeofPtr switch runtime.GOOS { + case "aix": + // There is no alignment on AIX. + salign = 1 case "darwin", "dragonfly", "solaris": // NOTE: It seems like 64-bit Darwin, DragonFly BSD and // Solaris kernels still require 32-bit aligned access to diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go index 0110ec12c1..ade2a9d367 100644 --- a/src/syscall/syscall_aix.go +++ b/src/syscall/syscall_aix.go @@ -28,6 +28,11 @@ const ( SYS_FCNTL ) +const ( + // AF_LOCAL doesn't exist on AIX + AF_LOCAL = AF_UNIX +) + func (ts *StTimespec_t) Unix() (sec int64, nsec int64) { return int64(ts.Sec), int64(ts.Nsec) } @@ -601,6 +606,7 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid), //sys Geteuid() (euid int) //sys Getegid() (egid int) //sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) //sysnb Getrlimit(which int, lim *Rlimit) (err error) //sysnb Getuid() (uid int) //sys Kill(pid int, signum Signal) (err error) @@ -623,6 +629,7 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid), //sysnb Seteuid(euid int) (err error) //sysnb Setgid(gid int) (err error) //sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) //sysnb Setregid(rgid int, egid int) (err error) //sysnb Setreuid(ruid int, euid int) (err error) //sysnb Setrlimit(which int, lim *Rlimit) (err error) diff --git a/src/syscall/syscall_unix_test.go b/src/syscall/syscall_unix_test.go index 1a2c41dacd..3462fb2446 100644 --- a/src/syscall/syscall_unix_test.go +++ b/src/syscall/syscall_unix_test.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package syscall_test @@ -17,6 +17,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strconv" "syscall" "testing" "time" @@ -131,6 +132,26 @@ func TestFcntlFlock(t *testing.T) { func TestPassFD(t *testing.T) { testenv.MustHaveExec(t) + if runtime.GOOS == "aix" { + // Unix network isn't properly working on AIX 7.2 with Technical Level < 2 + out, err := exec.Command("oslevel", "-s").Output() + if err != nil { + t.Skipf("skipping on AIX because oslevel -s failed: %v", err) + } + if len(out) < len("7200-XX-ZZ-YYMM") { // AIX 7.2, Tech Level XX, Service Pack ZZ, date YYMM + t.Skip("skipping on AIX because oslevel -s hasn't the right length") + } + aixVer := string(out[:4]) + tl, err := strconv.Atoi(string(out[5:7])) + if err != nil { + t.Skipf("skipping on AIX because oslevel -s output cannot be parsed: %v", err) + } + if aixVer < "7200" || (aixVer == "7200" && tl < 2) { + t.Skip("skipped on AIX versions previous to 7.2 TL 2") + } + + } + if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { passFDChild() return diff --git a/src/syscall/zerrors_aix_ppc64.go b/src/syscall/zerrors_aix_ppc64.go index 60130099a7..9a545ea403 100644 --- a/src/syscall/zerrors_aix_ppc64.go +++ b/src/syscall/zerrors_aix_ppc64.go @@ -54,12 +54,28 @@ const ( B600 = 0x8 B75 = 0x2 B9600 = 0xd + BRKINT = 0x2 CFLUSH = 0xf + CLOCAL = 0x800 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 CSIOCGIFCONF = -0x3fef96dc + CSIZE = 0x30 + CSMAP_DIR = "/usr/lib/nls/csmap/" CSTART = '\021' CSTOP = '\023' + CSTOPB = 0x40 CSUSP = 0x1a ECHO = 0x8 + ECHOCTL = 0x20000 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x80000 + ECHONL = 0x40 + ECHOPRT = 0x40000 ECH_ICMPID = 0x2 ETHERNET_CSMACD = 0x6 EVENP = 0x80 @@ -108,11 +124,15 @@ const ( F_ULOCK = 0x0 F_UNLCK = 0x3 F_WRLCK = 0x2 + HUPCL = 0x400 + ICANON = 0x2 ICMP6_FILTER = 0x26 ICMP6_SEC_SEND_DEL = 0x46 ICMP6_SEC_SEND_GET = 0x47 ICMP6_SEC_SEND_SET = 0x44 ICMP6_SEC_SEND_SET_CGA_ADDR = 0x45 + ICRNL = 0x100 + IEXTEN = 0x200000 IFA_FIRSTALIAS = 0x2000 IFA_ROUTE = 0x1 IFF_64BIT = 0x4000000 @@ -216,6 +236,12 @@ const ( IFT_X25DDN = 0x4 IFT_X25PLE = 0x28 IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x10000 + INLCR = 0x40 + INPCK = 0x10 IN_CLASSA_HOST = 0xffffff IN_CLASSA_MAX = 0x80 IN_CLASSA_NET = 0xff000000 @@ -369,6 +395,11 @@ const ( IP_TTL = 0x4 IP_UNBLOCK_SOURCE = 0x3b IP_UNICAST_HOPS = 0x4 + ISIG = 0x1 + ISTRIP = 0x20 + IXANY = 0x1000 + IXOFF = 0x400 + IXON = 0x200 I_FLUSH = 0x20005305 LNOFLSH = 0x8000 LOCK_EX = 0x2 @@ -413,7 +444,16 @@ const ( MS_INVALIDATE = 0x40 MS_PER_SEC = 0x3e8 MS_SYNC = 0x20 + NOFLSH = 0x80 NOFLUSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + ONOEOT = 0x80000 + OPOST = 0x1 O_ACCMODE = 0x23 O_APPEND = 0x8 O_CIO = 0x80 @@ -448,6 +488,10 @@ const ( O_TRUNC = 0x200 O_TTY_INIT = 0x0 O_WRONLY = 0x1 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 PENDIN = 0x20000000 PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 @@ -794,6 +838,9 @@ const ( S_RESFMT8 = 0x2c000000 S_WRBAND = 0x80 S_WRNORM = 0x40 + TCIFLUSH = 0x0 + TCIOFLUSH = 0x2 + TCOFLUSH = 0x1 TCP_24DAYS_WORTH_OF_SLOWTICKS = 0x3f4800 TCP_ACLADD = 0x23 TCP_ACLBIND = 0x26 @@ -834,6 +881,7 @@ const ( TCP_STDURG = 0x10 TCP_TIMESTAMP_OPTLEN = 0xc TCP_UNSETPRIV = 0x28 + TCSAFLUSH = 0x2 TIOCCBRK = 0x2000747a TIOCCDTR = 0x20007478 TIOCCONS = 0xffffffff80047462 @@ -897,7 +945,28 @@ const ( TIOCSWINSZ = 0xffffffff80087467 TIOCUCNTL = 0xffffffff80047466 TOSTOP = 0x10000 + VDISCRD = 0xc + VDSUSP = 0xa + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xe + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0x7 + VSTOP = 0x8 + VSTRT = 0x7 + VSUSP = 0x9 + VT0 = 0x0 + VT1 = 0x8000 VTDELAY = 0x2000 + VTDLY = 0x8000 + VTIME = 0x5 + VWERSE = 0xd WPARSTART = 0x1 WPARSTOP = 0x2 WPARTTYNAME = "Global" diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go index 63ed69a3a2..384fead4d2 100644 --- a/src/syscall/zsyscall_aix_ppc64.go +++ b/src/syscall/zsyscall_aix_ppc64.go @@ -60,6 +60,7 @@ import "unsafe" //go:cgo_import_dynamic libc_Geteuid geteuid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getegid getegid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getppid getppid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_Getpriority getpriority "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getrlimit getrlimit "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Getuid getuid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Kill kill "libc.a/shr_64.o" @@ -82,6 +83,7 @@ import "unsafe" //go:cgo_import_dynamic libc_Seteuid seteuid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setgid setgid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setpgid setpgid "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_Setpriority setpriority "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setregid setregid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setreuid setreuid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_Setrlimit setrlimit "libc.a/shr_64.o" @@ -150,6 +152,7 @@ import "unsafe" //go:linkname libc_Geteuid libc_Geteuid //go:linkname libc_Getegid libc_Getegid //go:linkname libc_Getppid libc_Getppid +//go:linkname libc_Getpriority libc_Getpriority //go:linkname libc_Getrlimit libc_Getrlimit //go:linkname libc_Getuid libc_Getuid //go:linkname libc_Kill libc_Kill @@ -172,6 +175,7 @@ import "unsafe" //go:linkname libc_Seteuid libc_Seteuid //go:linkname libc_Setgid libc_Setgid //go:linkname libc_Setpgid libc_Setpgid +//go:linkname libc_Setpriority libc_Setpriority //go:linkname libc_Setregid libc_Setregid //go:linkname libc_Setreuid libc_Setreuid //go:linkname libc_Setrlimit libc_Setrlimit @@ -243,6 +247,7 @@ var ( libc_Geteuid, libc_Getegid, libc_Getppid, + libc_Getpriority, libc_Getrlimit, libc_Getuid, libc_Kill, @@ -265,6 +270,7 @@ var ( libc_Seteuid, libc_Setgid, libc_Setpgid, + libc_Setpriority, libc_Setregid, libc_Setreuid, libc_Setrlimit, @@ -898,6 +904,17 @@ func Getppid() (ppid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Getpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Getrlimit(which int, lim *Rlimit) (err error) { _, _, e1 := rawSyscall6(uintptr(unsafe.Pointer(&libc_Getrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) if e1 != 0 { @@ -1198,6 +1215,16 @@ func Setpgid(pid int, pgid int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_Setpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Setregid(rgid int, egid int) (err error) { _, _, e1 := rawSyscall6(uintptr(unsafe.Pointer(&libc_Setregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) if e1 != 0 { -- GitLab From 480df2c2b4bc668e6b3a9d2f9ade1593da875be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Fri, 12 Apr 2019 11:32:48 +0200 Subject: [PATCH 0779/1679] runtime: remove debug prints in netpoll_aix.go Change-Id: I80cca386de23cde39ab4ed3be9878374dc7607ec Reviewed-on: https://go-review.googlesource.com/c/go/+/171721 Reviewed-by: Austin Clements Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot --- src/runtime/netpoll_aix.go | 41 -------------------------------------- 1 file changed, 41 deletions(-) diff --git a/src/runtime/netpoll_aix.go b/src/runtime/netpoll_aix.go index 0ad8718fe0..f0ba09460e 100644 --- a/src/runtime/netpoll_aix.go +++ b/src/runtime/netpoll_aix.go @@ -50,8 +50,6 @@ var ( pendingUpdates int32 ) -const pollVerbose = false - func netpollinit() { var p [2]int32 @@ -71,13 +69,7 @@ func netpollinit() { fcntl(wrwake, _F_SETFD, _FD_CLOEXEC) // Pre-allocate array of pollfd structures for poll. - if pollVerbose { - println("*** allocating") - } pfds = make([]pollfd, 1, 128) - if pollVerbose { - println("*** allocating done", &pfds[0]) - } // Poll the read side of the pipe. pfds[0].fd = rdwake @@ -99,18 +91,12 @@ func netpolldescriptor() uintptr { func netpollwakeup() { if pendingUpdates == 0 { pendingUpdates = 1 - if pollVerbose { - println("*** writing 1 byte") - } b := [1]byte{0} write(uintptr(wrwake), unsafe.Pointer(&b[0]), 1) } } func netpollopen(fd uintptr, pd *pollDesc) int32 { - if pollVerbose { - println("*** netpollopen", fd) - } lock(&mtxpoll) netpollwakeup() @@ -125,9 +111,6 @@ func netpollopen(fd uintptr, pd *pollDesc) int32 { } func netpollclose(fd uintptr) int32 { - if pollVerbose { - println("*** netpollclose", fd) - } lock(&mtxpoll) netpollwakeup() @@ -150,9 +133,6 @@ func netpollclose(fd uintptr) int32 { } func netpollarm(pd *pollDesc, mode int) { - if pollVerbose { - println("*** netpollarm", pd.fd, mode) - } lock(&mtxpoll) netpollwakeup() @@ -175,30 +155,18 @@ func netpoll(block bool) gList { timeout = 0 return gList{} } - if pollVerbose { - println("*** netpoll", block) - } retry: lock(&mtxpoll) lock(&mtxset) pendingUpdates = 0 unlock(&mtxpoll) - if pollVerbose { - println("*** netpoll before poll") - } n, e := poll(&pfds[0], uintptr(len(pfds)), timeout) - if pollVerbose { - println("*** netpoll after poll", n) - } if n < 0 { if e != _EINTR { println("errno=", e, " len(pfds)=", len(pfds)) throw("poll failed") } - if pollVerbose { - println("*** poll failed") - } unlock(&mtxset) goto retry } @@ -206,9 +174,6 @@ retry: if n != 0 && pfds[0].revents&(_POLLIN|_POLLHUP|_POLLERR) != 0 { var b [1]byte for read(rdwake, unsafe.Pointer(&b[0]), 1) == 1 { - if pollVerbose { - println("*** read 1 byte from pipe") - } } // Do not look at the other fds in this case as the mode may have changed // XXX only additions of flags are made, so maybe it is ok @@ -229,9 +194,6 @@ retry: pfd.events &= ^_POLLOUT } if mode != 0 { - if pollVerbose { - println("*** netpollready i=", i, "revents=", pfd.revents, "events=", pfd.events, "pd=", pds[i]) - } pds[i].everr = false if pfd.revents == _POLLERR { pds[i].everr = true @@ -244,8 +206,5 @@ retry: if block && toRun.empty() { goto retry } - if pollVerbose { - println("*** netpoll returning end") - } return toRun } -- GitLab From 8c7564deadedda87097e0eedd3e8f85bcd895ff0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Fri, 12 Apr 2019 14:23:13 +0200 Subject: [PATCH 0780/1679] runtime: add //go:cgo_unsafe_args to AIX syscallX functions On AIX, syscallX functions are using the first argument to retrieve the next arguments when calling asmcgocall. Therefore,//go:cgo_unsafe_args is needed. Change-Id: I7fe0fbf0c961250a6573c66a8b0eb897dff94bfe Reviewed-on: https://go-review.googlesource.com/c/go/+/171723 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os2_aix.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go index 2ec32feb9c..47cb1290fe 100644 --- a/src/runtime/os2_aix.go +++ b/src/runtime/os2_aix.go @@ -215,6 +215,7 @@ func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) { //go:nowritebarrier //go:nosplit +//go:cgo_unsafe_args func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { gp := getg() mp := gp.m @@ -245,6 +246,7 @@ func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { //go:nowritebarrier //go:nosplit +//go:cgo_unsafe_args func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { gp := getg() mp := gp.m @@ -275,6 +277,7 @@ func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { //go:nowritebarrier //go:nosplit +//go:cgo_unsafe_args func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { gp := getg() mp := gp.m @@ -305,6 +308,7 @@ func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { //go:nowritebarrier //go:nosplit +//go:cgo_unsafe_args func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { gp := getg() mp := gp.m @@ -335,6 +339,7 @@ func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { //go:nowritebarrier //go:nosplit +//go:cgo_unsafe_args func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) { gp := getg() mp := gp.m -- GitLab From c70a7849af56828462ed7d2a5051d917ef6432dc Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 12 Apr 2019 12:02:49 -0700 Subject: [PATCH 0781/1679] cmd/internal/obj: stop plist flushing early on error If preprocessing or assembling has failed, we should not proceed. First, there's no point. Second, I will shortly add some sanity checks to linkpcln that will fail on malformed input. Change-Id: I055eeab1c2f3a66b4b2cadb551bbf4ab55d176f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/171886 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/plist.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index 9d376f739f..8b177c5a02 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -105,6 +105,9 @@ func Flushplist(ctxt *Link, plist *Plist, newprog ProgAlloc, myimportpath string linkpatch(ctxt, s, newprog) ctxt.Arch.Preprocess(ctxt, s, newprog) ctxt.Arch.Assemble(ctxt, s, newprog) + if ctxt.Errors > 0 { + continue + } linkpcln(ctxt, s) ctxt.populateDWARF(plist.Curfn, s, myimportpath) } -- GitLab From 134ef176f0ebe7e47cd69a400f73cb310a3152c0 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 12 Apr 2019 09:29:43 -0700 Subject: [PATCH 0782/1679] cmd/link, cmd/internal/obj: use encoding/binary for varint This code was written before the c2go toolchain conversion. Replace the handwritten varint encoding routines and the handwritten unsigned-to-signed conversions with calls to encoding/binary. Passes toolstash-check. Change-Id: I30d7f408cde3772ee98a3825e83075c4e1ec96d8 Reviewed-on: https://go-review.googlesource.com/c/go/+/171769 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/internal/obj/pcln.go | 34 +++++++-------- src/cmd/link/internal/ld/pcln.go | 72 +++++++++++--------------------- 2 files changed, 40 insertions(+), 66 deletions(-) diff --git a/src/cmd/internal/obj/pcln.go b/src/cmd/internal/obj/pcln.go index 84dd494930..e7f340595f 100644 --- a/src/cmd/internal/obj/pcln.go +++ b/src/cmd/internal/obj/pcln.go @@ -6,6 +6,7 @@ package obj import ( "cmd/internal/src" + "encoding/binary" "log" ) @@ -14,13 +15,6 @@ const ( EpilogueBegin // overload "is_stmt" to include epilogue_end ) -func addvarint(d *Pcdata, v uint32) { - for ; v >= 0x80; v >>= 7 { - d.P = append(d.P, uint8(v|0x80)) - } - d.P = append(d.P, uint8(v)) -} - // funcpctab writes to dst a pc-value table mapping the code in func to the values // returned by valfunc parameterized by arg. The invocation of valfunc to update the // current value is, for each p, @@ -52,8 +46,8 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* ctxt.Logf("%6x %6d %v\n", uint64(pc), val, func_.Func.Text) } + buf := make([]byte, binary.MaxVarintLen32) started := false - var delta uint32 for p := func_.Func.Text; p != nil; p = p.Link { // Update val. If it's not changing, keep going. val = valfunc(ctxt, func_, val, p, 0, arg) @@ -97,17 +91,15 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* } if started { - addvarint(dst, uint32((p.Pc-pc)/int64(ctxt.Arch.MinLC))) + pcdelta := (p.Pc - pc) / int64(ctxt.Arch.MinLC) + n := binary.PutUvarint(buf, uint64(pcdelta)) + dst.P = append(dst.P, buf[:n]...) pc = p.Pc } - delta = uint32(val) - uint32(oldval) - if delta>>31 != 0 { - delta = 1 | ^(delta << 1) - } else { - delta <<= 1 - } - addvarint(dst, delta) + delta := val - oldval + n := binary.PutVarint(buf, int64(delta)) + dst.P = append(dst.P, buf[:n]...) oldval = val started = true val = valfunc(ctxt, func_, val, p, 1, arg) @@ -117,8 +109,14 @@ func funcpctab(ctxt *Link, dst *Pcdata, func_ *LSym, desc string, valfunc func(* if dbg { ctxt.Logf("%6x done\n", uint64(func_.Func.Text.Pc+func_.Size)) } - addvarint(dst, uint32((func_.Size-pc)/int64(ctxt.Arch.MinLC))) - addvarint(dst, 0) // terminator + v := (func_.Size - pc) / int64(ctxt.Arch.MinLC) + if v < 0 { + ctxt.Diag("negative pc offset: %v", v) + } + n := binary.PutUvarint(buf, uint64(v)) + dst.P = append(dst.P, buf[:n]...) + // add terminating varint-encoded 0, which is just 0 + dst.P = append(dst.P, 0) } if dbg { diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 5924acc0b0..33bbd37b36 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -9,6 +9,7 @@ import ( "cmd/internal/src" "cmd/internal/sys" "cmd/link/internal/sym" + "encoding/binary" "log" "os" "path/filepath" @@ -17,22 +18,6 @@ import ( // iteration over encoded pcdata tables. -func getvarint(pp *[]byte) uint32 { - v := uint32(0) - p := *pp - for shift := 0; ; shift += 7 { - v |= uint32(p[0]&0x7F) << uint(shift) - tmp4 := p - p = p[1:] - if tmp4[0]&0x80 == 0 { - break - } - } - - *pp = p - return v -} - func pciternext(it *Pciter) { it.pc = it.nextpc if it.done != 0 { @@ -44,21 +29,28 @@ func pciternext(it *Pciter) { } // value delta - v := getvarint(&it.p) + val, n := binary.Varint(it.p) + if n <= 0 { + log.Fatalf("bad value varint in pciternext: read %v", n) + } + it.p = it.p[n:] - if v == 0 && it.start == 0 { + if val == 0 && it.start == 0 { it.done = 1 return } it.start = 0 - dv := int32(v>>1) ^ (int32(v<<31) >> 31) - it.value += dv + it.value += int32(val) // pc delta - v = getvarint(&it.p) + pc, n := binary.Uvarint(it.p) + if n <= 0 { + log.Fatalf("bad pc varint in pciternext: read %v", n) + } + it.p = it.p[n:] - it.nextpc = it.pc + v*it.pcscale + it.nextpc = it.pc + uint32(pc)*it.pcscale } func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) { @@ -73,28 +65,6 @@ func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) { pciternext(it) } -func addvarint(d *sym.Pcdata, val uint32) { - n := int32(0) - for v := val; v >= 0x80; v >>= 7 { - n++ - } - n++ - - old := len(d.P) - for cap(d.P) < len(d.P)+int(n) { - d.P = append(d.P[:cap(d.P)], 0) - } - d.P = d.P[:old+int(n)] - - p := d.P[old:] - var v uint32 - for v = val; v >= 0x80; v >>= 7 { - p[0] = byte(v | 0x80) - p = p[1:] - } - p[0] = byte(v) -} - func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 { var start int32 if len(d.P) > 0 { @@ -128,6 +98,7 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) { numberfile(ctxt, f) } + buf := make([]byte, binary.MaxVarintLen32) newval := int32(-1) var out sym.Pcdata var it Pciter @@ -147,15 +118,20 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) { dv := val - newval newval = val - v := (uint32(dv) << 1) ^ uint32(dv>>31) - addvarint(&out, v) + + // value + n := binary.PutVarint(buf, int64(dv)) + out.P = append(out.P, buf[:n]...) // pc delta - addvarint(&out, (it.nextpc-it.pc)/it.pcscale) + pc := (it.nextpc - it.pc) / it.pcscale + n = binary.PutUvarint(buf, uint64(pc)) + out.P = append(out.P, buf[:n]...) } // terminating value delta - addvarint(&out, 0) + // we want to write varint-encoded 0, which is just 0 + out.P = append(out.P, 0) *d = out } -- GitLab From 6d64dd731b55de5c018552d8e62cc75da5d05331 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 12 Apr 2019 13:06:52 -0700 Subject: [PATCH 0783/1679] cmd/link: make Pciter more idiomatic Rename it to PCIter and convert it to use methods. Set pcscale once, during construction, to make call sites clearer. Change some ints to bools. Use a simple iteration termination condition, instead of the cap comparison from the c2go translation. Instead of requiring a Pcdata, which requires one caller to synthesize a fake Pcdata, just ask for a byte slice. Passes toolstash-check. Change-Id: I811da0e929cf4a806bd6d70357ccf2911cd0c737 Reviewed-on: https://go-review.googlesource.com/c/go/+/171770 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/ld/dwarf.go | 30 ++++++++--------- src/cmd/link/internal/ld/lib.go | 4 +-- src/cmd/link/internal/ld/link.go | 11 ------- src/cmd/link/internal/ld/pcln.go | 55 ++++++++++++++++++++----------- 4 files changed, 53 insertions(+), 47 deletions(-) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index feee63d065..c7184477de 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1205,28 +1205,28 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { file := 1 ls.AddAddr(ctxt.Arch, s) - var pcfile Pciter - var pcline Pciter - var pcstmt Pciter + pcfile := newPCIter(ctxt) + pcline := newPCIter(ctxt) + pcstmt := newPCIter(ctxt) for i, s := range unit.lib.Textp { finddebugruntimepath(s) - pciterinit(ctxt, &pcfile, &s.FuncInfo.Pcfile) - pciterinit(ctxt, &pcline, &s.FuncInfo.Pcline) + pcfile.init(s.FuncInfo.Pcfile.P) + pcline.init(s.FuncInfo.Pcline.P) isStmtSym := dwarfFuncSym(ctxt, s, dwarf.IsStmtPrefix, false) if isStmtSym != nil && len(isStmtSym.P) > 0 { - pciterinit(ctxt, &pcstmt, &sym.Pcdata{P: isStmtSym.P}) + pcstmt.init(isStmtSym.P) } else { // Assembly files lack a pcstmt section, we assume that every instruction // is a valid statement. - pcstmt.done = 1 + pcstmt.done = true pcstmt.value = 1 } var thispc uint32 // TODO this loop looks like it could exit with work remaining. - for pcfile.done == 0 && pcline.done == 0 { + for !pcfile.done && !pcline.done { // Only changed if it advanced if int32(file) != pcfile.value { ls.AddUint8(dwarf.DW_LNS_set_file) @@ -1266,18 +1266,18 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { if pcline.nextpc < thispc { thispc = pcline.nextpc } - if pcstmt.done == 0 && pcstmt.nextpc < thispc { + if !pcstmt.done && pcstmt.nextpc < thispc { thispc = pcstmt.nextpc } if pcfile.nextpc == thispc { - pciternext(&pcfile) + pcfile.next() } - if pcstmt.done == 0 && pcstmt.nextpc == thispc { - pciternext(&pcstmt) + if !pcstmt.done && pcstmt.nextpc == thispc { + pcstmt.next() } if pcline.nextpc == thispc { - pciternext(&pcline) + pcline.next() } } if is_stmt == 0 && i < len(unit.lib.Textp)-1 { @@ -1442,7 +1442,7 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { fs.AddBytes(zeros[:pad]) var deltaBuf []byte - var pcsp Pciter + pcsp := newPCIter(ctxt) for _, s := range ctxt.Textp { if s.FuncInfo == nil { continue @@ -1451,7 +1451,7 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { // Emit a FDE, Section 6.4.1. // First build the section contents into a byte buffer. deltaBuf = deltaBuf[:0] - for pciterinit(ctxt, &pcsp, &s.FuncInfo.Pcsp); pcsp.done == 0; pciternext(&pcsp) { + for pcsp.init(s.FuncInfo.Pcsp.P); !pcsp.done; pcsp.next() { nextpc := pcsp.nextpc // pciterinit goes up to the end of the function, diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index c5f35af254..62f2453358 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2112,9 +2112,9 @@ func stkcheck(ctxt *Link, up *chain, depth int) int { endr := len(s.R) var ch1 chain - var pcsp Pciter + pcsp := newPCIter(ctxt) var r *sym.Reloc - for pciterinit(ctxt, &pcsp, &s.FuncInfo.Pcsp); pcsp.done == 0; pciternext(&pcsp) { + for pcsp.init(s.FuncInfo.Pcsp.P); !pcsp.done; pcsp.next() { // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc). // Check stack size in effect for this span. diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index 8ed5c6e27e..a7609b9c7c 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -169,14 +169,3 @@ func addImports(ctxt *Link, l *sym.Library, pn string) { } l.ImportStrings = nil } - -type Pciter struct { - d sym.Pcdata - p []byte - pc uint32 - nextpc uint32 - pcscale uint32 - value int32 - start int - done int -} diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 33bbd37b36..9f253f0205 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -16,15 +16,32 @@ import ( "strings" ) -// iteration over encoded pcdata tables. +// PCIter iterates over encoded pcdata tables. +type PCIter struct { + p []byte + pc uint32 + nextpc uint32 + pcscale uint32 + value int32 + start bool + done bool +} -func pciternext(it *Pciter) { +// newPCIter creates a PCIter and configures it for ctxt's architecture. +func newPCIter(ctxt *Link) *PCIter { + it := new(PCIter) + it.pcscale = uint32(ctxt.Arch.MinLC) + return it +} + +// next advances it to the next pc. +func (it *PCIter) next() { it.pc = it.nextpc - if it.done != 0 { + if it.done { return } - if -cap(it.p) >= -cap(it.d.P[len(it.d.P):]) { - it.done = 1 + if len(it.p) == 0 { + it.done = true return } @@ -35,12 +52,12 @@ func pciternext(it *Pciter) { } it.p = it.p[n:] - if val == 0 && it.start == 0 { - it.done = 1 + if val == 0 && !it.start { + it.done = true return } - it.start = 0 + it.start = false it.value += int32(val) // pc delta @@ -53,16 +70,16 @@ func pciternext(it *Pciter) { it.nextpc = it.pc + uint32(pc)*it.pcscale } -func pciterinit(ctxt *Link, it *Pciter, d *sym.Pcdata) { - it.d = *d - it.p = it.d.P +// init prepares it to iterate over p, +// and advances it to the first pc. +func (it *PCIter) init(p []byte) { + it.p = p it.pc = 0 it.nextpc = 0 it.value = -1 - it.start = 1 - it.done = 0 - it.pcscale = uint32(ctxt.Arch.MinLC) - pciternext(it) + it.start = true + it.done = false + it.next() } func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 { @@ -101,8 +118,8 @@ func renumberfiles(ctxt *Link, files []*sym.Symbol, d *sym.Pcdata) { buf := make([]byte, binary.MaxVarintLen32) newval := int32(-1) var out sym.Pcdata - var it Pciter - for pciterinit(ctxt, &it, d); it.done == 0; pciternext(&it) { + it := newPCIter(ctxt) + for it.init(d.P); !it.done; it.next() { // value delta oldval := it.value @@ -316,8 +333,8 @@ func (ctxt *Link) pclntab() { renumberfiles(ctxt, pcln.File, &pcln.Pcfile) if false { // Sanity check the new numbering - var it Pciter - for pciterinit(ctxt, &it, &pcln.Pcfile); it.done == 0; pciternext(&it) { + it := newPCIter(ctxt) + for it.init(pcln.Pcfile.P); !it.done; it.next() { if it.value < 1 || it.value > int32(len(ctxt.Filesyms)) { Errorf(s, "bad file number in pcfile: %d not in range [1, %d]\n", it.value, len(ctxt.Filesyms)) errorexit() -- GitLab From c40bffd90535bd9d5bf6a398f5227ff2c9aaed52 Mon Sep 17 00:00:00 2001 From: Romain Baugue Date: Wed, 10 Apr 2019 16:20:43 +0200 Subject: [PATCH 0784/1679] reflect: add Value.IsZero Fixes #7501 Change-Id: Iac7c79cd4b30a90b14ed84bf1eba758972232a6c Reviewed-on: https://go-review.googlesource.com/c/go/+/171337 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/reflect/all_test.go | 107 ++++++++++++++++++++++++++++++++++++++++ src/reflect/value.go | 40 +++++++++++++++ 2 files changed, 147 insertions(+) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 10b52456f3..cbf0f5a93f 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -1061,6 +1061,113 @@ func TestIsNil(t *testing.T) { NotNil(fi, t) } +func TestIsZero(t *testing.T) { + for i, tt := range []struct { + x interface{} + want bool + }{ + // Booleans + {true, false}, + {false, true}, + // Numeric types + {int(0), true}, + {int(1), false}, + {int8(0), true}, + {int8(1), false}, + {int16(0), true}, + {int16(1), false}, + {int32(0), true}, + {int32(1), false}, + {int64(0), true}, + {int64(1), false}, + {uint(0), true}, + {uint(1), false}, + {uint8(0), true}, + {uint8(1), false}, + {uint16(0), true}, + {uint16(1), false}, + {uint32(0), true}, + {uint32(1), false}, + {uint64(0), true}, + {uint64(1), false}, + {float32(0), true}, + {float32(1.2), false}, + {float64(0), true}, + {float64(1.2), false}, + {math.Copysign(0, -1), false}, + {complex64(0), true}, + {complex64(1.2), false}, + {complex128(0), true}, + {complex128(1.2), false}, + {complex(math.Copysign(0, -1), 0), false}, + {complex(0, math.Copysign(0, -1)), false}, + {complex(math.Copysign(0, -1), math.Copysign(0, -1)), false}, + {uintptr(0), true}, + {uintptr(128), false}, + // Array + {Zero(TypeOf([5]string{})).Interface(), true}, + {[5]string{"", "", "", "", ""}, true}, + {[5]string{}, true}, + {[5]string{"", "", "", "a", ""}, false}, + // Chan + {(chan string)(nil), true}, + {make(chan string), false}, + {time.After(1), false}, + // Func + {(func())(nil), true}, + {New, false}, + // Interface + {New(TypeOf(new(error)).Elem()).Elem(), true}, + {(io.Reader)(strings.NewReader("")), false}, + // Map + {(map[string]string)(nil), true}, + {map[string]string{}, false}, + {make(map[string]string), false}, + // Ptr + {(*func())(nil), true}, + {(*int)(nil), true}, + {new(int), false}, + // Slice + {[]string{}, false}, + {([]string)(nil), true}, + {make([]string, 0), false}, + // Strings + {"", true}, + {"not-zero", false}, + // Structs + {T{}, true}, + {T{123, 456.75, "hello", &_i}, false}, + // UnsafePointer + {(unsafe.Pointer)(nil), true}, + {(unsafe.Pointer)(new(int)), false}, + } { + var x Value + if v, ok := tt.x.(Value); ok { + x = v + } else { + x = ValueOf(tt.x) + } + + b := x.IsZero() + if b != tt.want { + t.Errorf("%d: IsZero((%s)(%+v)) = %t, want %t", i, x.Kind(), tt.x, b, tt.want) + } + + if !Zero(TypeOf(tt.x)).IsZero() { + t.Errorf("%d: IsZero(Zero(TypeOf((%s)(%+v)))) is false", i, x.Kind(), tt.x) + } + } + + func() { + defer func() { + if r := recover(); r == nil { + t.Error("should panic for invalid value") + } + }() + (Value{}).IsZero() + }() +} + func TestInterfaceExtraction(t *testing.T) { var s struct { W io.Writer diff --git a/src/reflect/value.go b/src/reflect/value.go index 5951b18b8c..75d817f827 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -1071,6 +1071,46 @@ func (v Value) IsValid() bool { return v.flag != 0 } +// IsZero reports whether v is a zero value for its type. +// It panics if the argument is invalid. +func (v Value) IsZero() bool { + switch v.kind() { + case Bool: + return !v.Bool() + case Int, Int8, Int16, Int32, Int64: + return v.Int() == 0 + case Uint, Uint8, Uint16, Uint32, Uint64, Uintptr: + return v.Uint() == 0 + case Float32, Float64: + return math.Float64bits(v.Float()) == 0 + case Complex64, Complex128: + c := v.Complex() + return math.Float64bits(real(c)) == 0 && math.Float64bits(imag(c)) == 0 + case Array: + for i := 0; i < v.Len(); i++ { + if !v.Index(i).IsZero() { + return false + } + } + return true + case Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer: + return v.IsNil() + case String: + return v.Len() == 0 + case Struct: + for i := 0; i < v.NumField(); i++ { + if !v.Field(i).IsZero() { + return false + } + } + return true + default: + // This should never happens, but will act as a safeguard for + // later, as a default value doesn't makes sense here. + panic(&ValueError{"reflect.Value.IsZero", v.Kind()}) + } +} + // Kind returns v's Kind. // If v is the zero Value (IsValid returns false), Kind returns Invalid. func (v Value) Kind() Kind { -- GitLab From ee64b35531a841ab4dbe41c17390214f9dea654f Mon Sep 17 00:00:00 2001 From: OkamotoYuki Date: Sun, 10 Mar 2019 02:38:12 +0000 Subject: [PATCH 0785/1679] cmd/go/internal/test: pass default timeout to test programs if not given from command line Make 'go test' command to pass the default timeout (10m) to test programs if the value is not given from command line. Fixes #28147 Change-Id: I7856e452224a51a92da03bab8e3a0f9d7c41d32a GitHub-Last-Rev: 66f9a6f90e9ffe7c58d5c1fe32af84e16ea74ab8 GitHub-Pull-Request: golang/go#30545 Reviewed-on: https://go-review.googlesource.com/c/go/+/164963 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/test/test.go | 15 ++++++++++++--- src/cmd/go/testdata/script/test_timeout.txt | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/test_timeout.txt diff --git a/src/cmd/go/internal/test/test.go b/src/cmd/go/internal/test/test.go index 225dab31de..9b9bbce0dd 100644 --- a/src/cmd/go/internal/test/test.go +++ b/src/cmd/go/internal/test/test.go @@ -484,8 +484,9 @@ var ( pkgArgs []string pkgs []*load.Package - testKillTimeout = 10 * time.Minute - testCacheExpire time.Time // ignore cached test results before this time + testActualTimeout = 10 * time.Minute // actual timeout which is passed to tests + testKillTimeout = testActualTimeout + 1*time.Minute // backup alarm + testCacheExpire time.Time // ignore cached test results before this time ) // testVetFlags is the list of flags to pass to vet when invoked automatically during go test. @@ -552,13 +553,21 @@ func runTest(cmd *base.Command, args []string) { // the test wedges with a goroutine spinning and its background // timer does not get a chance to fire. if dt, err := time.ParseDuration(testTimeout); err == nil && dt > 0 { - testKillTimeout = dt + 1*time.Minute + testActualTimeout = dt + testKillTimeout = testActualTimeout + 1*time.Minute } else if err == nil && dt == 0 { // An explicit zero disables the test timeout. + // No timeout is passed to tests. // Let it have one century (almost) before we kill it. + testActualTimeout = -1 testKillTimeout = 100 * 365 * 24 * time.Hour } + // Pass timeout to tests if it exists. + if testActualTimeout > 0 { + testArgs = append(testArgs, "-test.timeout="+testActualTimeout.String()) + } + // show passing test output (after buffering) with -v flag. // must buffer because tests are running in parallel, and // otherwise the output will get mixed. diff --git a/src/cmd/go/testdata/script/test_timeout.txt b/src/cmd/go/testdata/script/test_timeout.txt new file mode 100644 index 0000000000..9087a9030e --- /dev/null +++ b/src/cmd/go/testdata/script/test_timeout.txt @@ -0,0 +1,21 @@ +env GO111MODULE=off +cd a + +# No timeout is passed via 'go test' command. +go test -v +stdout '10m0s' + +# Timeout is passed via 'go test' command. +go test -v -timeout 30m +stdout '30m0s' + +-- a/timeout_test.go -- +package t +import ( + "flag" + "fmt" + "testing" +) +func TestTimeout(t *testing.T) { + fmt.Println(flag.Lookup("test.timeout").Value.String()) +} \ No newline at end of file -- GitLab From ab2f83c387fcc00efbdcc0a5c249af26c84ff425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Fri, 5 Apr 2019 23:06:49 +0200 Subject: [PATCH 0786/1679] encoding/json: remove a bounds check in readValue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readValue is a hot function, clocking in at ~13% flat CPU use in CodeDecoder. In particular, looping over the bytes is slow. That's partially because the code contains a bounds check at the start of the loop. The source of the problem is that scanp is a signed integer, and comes from a field, so the compiler doesn't know that it's non-negative. Help it with a simple and comparatively cheap hint. While at it, use scanp as the index variable directly, removing the need for a duplicate index variable which is later added back into scanp. name old time/op new time/op delta CodeDecoder-8 11.3ms ± 1% 11.2ms ± 1% -0.98% (p=0.000 n=9+9) name old speed new speed delta CodeDecoder-8 172MB/s ± 1% 174MB/s ± 1% +0.99% (p=0.000 n=9+9) Updates #28923. Change-Id: I138f83babdf316fc97697cc18f595c3403c1ddb7 Reviewed-on: https://go-review.googlesource.com/c/go/+/170939 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/json/stream.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/encoding/json/stream.go b/src/encoding/json/stream.go index 7d5137fbc7..e29127499b 100644 --- a/src/encoding/json/stream.go +++ b/src/encoding/json/stream.go @@ -92,20 +92,23 @@ func (dec *Decoder) readValue() (int, error) { scanp := dec.scanp var err error Input: - for { + // help the compiler see that scanp is never negative, so it can remove + // some bounds checks below. + for scanp >= 0 { + // Look in the buffer for a new value. - for i, c := range dec.buf[scanp:] { + for ; scanp < len(dec.buf); scanp++ { + c := dec.buf[scanp] dec.scan.bytes++ switch dec.scan.step(&dec.scan, c) { case scanEnd: - scanp += i break Input case scanEndObject, scanEndArray: // scanEnd is delayed one byte. // We might block trying to get that byte from src, // so instead invent a space byte. if stateEndValue(&dec.scan, ' ') == scanEnd { - scanp += i + 1 + scanp++ break Input } case scanError: @@ -113,7 +116,6 @@ Input: return 0, dec.scan.err } } - scanp = len(dec.buf) // Did the last read have an error? // Delayed until now to allow buffer scan. -- GitLab From 7cd39de2d9bd54087acab9c016ce9a3f57256140 Mon Sep 17 00:00:00 2001 From: Udalov Max Date: Sat, 13 Apr 2019 16:18:15 +0300 Subject: [PATCH 0787/1679] crypto/sha1: use math/bits.RotateLeft32 instead of ad-hoc implementation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes code more idiomatic and shows small performance gains of generic benchmarks. Updates: #31456 name old time/op new time/op delta Hash8Bytes-8 275ns ± 4% 270ns ± 0% ~ (p=0.213 n=9+8) Hash320Bytes-8 1.46µs ± 5% 1.39µs ± 1% -4.54% (p=0.000 n=10+10) Hash1K-8 3.99µs ± 5% 3.86µs ± 1% -3.38% (p=0.023 n=10+10) Hash8K-8 28.9µs ± 0% 28.9µs ± 1% ~ (p=0.315 n=10+10) name old speed new speed delta Hash8Bytes-8 28.8MB/s ± 9% 29.6MB/s ± 0% ~ (p=0.151 n=10+8) Hash320Bytes-8 220MB/s ± 5% 230MB/s ± 1% +4.65% (p=0.000 n=10+10) Hash1K-8 257MB/s ± 5% 265MB/s ± 1% +3.38% (p=0.023 n=10+10) Hash8K-8 283MB/s ± 0% 284MB/s ± 1% ~ (p=0.315 n=10+10) Change-Id: Iee63aa042614e3bbeda9aaf5236180d4153f03c4 Reviewed-on: https://go-review.googlesource.com/c/go/+/171729 Reviewed-by: Ilya Tokar Run-TryBot: Ilya Tokar TryBot-Result: Gobot Gobot --- src/crypto/sha1/sha1block.go | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/src/crypto/sha1/sha1block.go b/src/crypto/sha1/sha1block.go index 1d37544940..321d34351c 100644 --- a/src/crypto/sha1/sha1block.go +++ b/src/crypto/sha1/sha1block.go @@ -4,6 +4,10 @@ package sha1 +import ( + "math/bits" +) + const ( _K0 = 0x5A827999 _K1 = 0x6ED9EBA1 @@ -33,48 +37,37 @@ func blockGeneric(dig *digest, p []byte) { i := 0 for ; i < 16; i++ { f := b&c | (^b)&d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K0 - a, b, c, d, e = t, a, b30, c, d + t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K0 + a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d } for ; i < 20; i++ { tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] w[i&0xf] = tmp<<1 | tmp>>(32-1) f := b&c | (^b)&d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K0 - a, b, c, d, e = t, a, b30, c, d + t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K0 + a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d } for ; i < 40; i++ { tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] w[i&0xf] = tmp<<1 | tmp>>(32-1) f := b ^ c ^ d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K1 - a, b, c, d, e = t, a, b30, c, d + t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K1 + a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d } for ; i < 60; i++ { tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] w[i&0xf] = tmp<<1 | tmp>>(32-1) f := ((b | c) & d) | (b & c) - - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K2 - a, b, c, d, e = t, a, b30, c, d + t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K2 + a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d } for ; i < 80; i++ { tmp := w[(i-3)&0xf] ^ w[(i-8)&0xf] ^ w[(i-14)&0xf] ^ w[(i)&0xf] w[i&0xf] = tmp<<1 | tmp>>(32-1) f := b ^ c ^ d - a5 := a<<5 | a>>(32-5) - b30 := b<<30 | b>>(32-30) - t := a5 + f + e + w[i&0xf] + _K3 - a, b, c, d, e = t, a, b30, c, d + t := bits.RotateLeft32(a, 5) + f + e + w[i&0xf] + _K3 + a, b, c, d, e = t, a, bits.RotateLeft32(b, 30), c, d } h0 += a -- GitLab From f125b32d19cdb0e2650e8b7ae7b909b4bd0ae2a2 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Fri, 12 Apr 2019 14:03:39 +0200 Subject: [PATCH 0788/1679] cmd/compile/internal/arm: merge cases in ssaGenValue Merge case statement for OpARMSLL, OpARMSRL and OpARMSRA into an existing one using the same logic. Change-Id: Ic4224668228902e5188fb0559b5f1949cfea1381 Reviewed-on: https://go-review.googlesource.com/c/go/+/171724 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/arm/ssa.go | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/cmd/compile/internal/arm/ssa.go b/src/cmd/compile/internal/arm/ssa.go index ee9c9f1c3f..16752977a8 100644 --- a/src/cmd/compile/internal/arm/ssa.go +++ b/src/cmd/compile/internal/arm/ssa.go @@ -206,6 +206,9 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { ssa.OpARMADDD, ssa.OpARMSUBF, ssa.OpARMSUBD, + ssa.OpARMSLL, + ssa.OpARMSRL, + ssa.OpARMSRA, ssa.OpARMMULF, ssa.OpARMMULD, ssa.OpARMNMULF, @@ -247,18 +250,6 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.Reg = r1 p.To.Type = obj.TYPE_REG p.To.Reg = r - case ssa.OpARMSLL, - ssa.OpARMSRL, - ssa.OpARMSRA: - r := v.Reg() - r1 := v.Args[0].Reg() - r2 := v.Args[1].Reg() - p := s.Prog(v.Op.Asm()) - p.From.Type = obj.TYPE_REG - p.From.Reg = r2 - p.Reg = r1 - p.To.Type = obj.TYPE_REG - p.To.Reg = r case ssa.OpARMSRAcond: // ARM shift instructions uses only the low-order byte of the shift amount // generate conditional instructions to deal with large shifts -- GitLab From a6e892d26d6ee59799f55bc50521605ebf75ea67 Mon Sep 17 00:00:00 2001 From: Yuval Pavel Zholkover Date: Sat, 13 Apr 2019 14:35:23 +0300 Subject: [PATCH 0789/1679] cmd/dist: enable VFPv3 on freebsd/arm Since CL 165799 was merged, VFP detection should work properly on FreeBSD. Updates #27619 Change-Id: I386e856ceb54f0bf6e6bf83bf2d1e19154ba53f4 Reviewed-on: https://go-review.googlesource.com/c/go/+/171728 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/cmd/dist/util.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/cmd/dist/util.go b/src/cmd/dist/util.go index 996e058b31..e6a3887a72 100644 --- a/src/cmd/dist/util.go +++ b/src/cmd/dist/util.go @@ -397,10 +397,6 @@ func xgetgoarm() string { // Conservative default for cross-compilation. return "5" } - if goos == "freebsd" { - // FreeBSD has broken VFP support. - return "5" - } // Try to exec ourselves in a mode to detect VFP support. // Seeing how far it gets determines which instructions failed. -- GitLab From a01d108e30a00f9126253e061d679b07d9ff72b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B0=D0=B4=D0=B1=D0=B5=D0=BA=20?= =?UTF-8?q?=D0=90=D1=85=D0=BC=D0=B5=D0=B4=D0=BE=D0=B2?= Date: Sat, 13 Apr 2019 17:38:36 +0300 Subject: [PATCH 0790/1679] strings: remove "a copy of the string" from ToUpper/ToLower comments When string letters are all in lower/upper cases, both functions respectively return original string. Fixes #30987 Change-Id: Ie8d664f7af5e087f82c1bc156933e9a995645bf4 Reviewed-on: https://go-review.googlesource.com/c/go/+/171735 Reviewed-by: Brad Fitzpatrick --- src/strings/strings.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/strings.go b/src/strings/strings.go index 1805a14bd2..e3fdd9feaf 100644 --- a/src/strings/strings.go +++ b/src/strings/strings.go @@ -550,7 +550,7 @@ func Repeat(s string, count int) string { return b.String() } -// ToUpper returns a copy of the string s with all Unicode letters mapped to their upper case. +// ToUpper returns s with all Unicode letters mapped to their upper case. func ToUpper(s string) string { isASCII, hasLower := true, false for i := 0; i < len(s); i++ { @@ -580,7 +580,7 @@ func ToUpper(s string) string { return Map(unicode.ToUpper, s) } -// ToLower returns a copy of the string s with all Unicode letters mapped to their lower case. +// ToLower returns s with all Unicode letters mapped to their lower case. func ToLower(s string) string { isASCII, hasUpper := true, false for i := 0; i < len(s); i++ { -- GitLab From 60a8dbf3b4e10627b9f5c3a0a0bf4462247270c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sat, 23 Mar 2019 16:20:35 +0000 Subject: [PATCH 0791/1679] go/token: add IsIdentifier, IsKeyword, and IsExported MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Telling whether a string is a valid Go identifier can seem like an easy task, but it's easy to forget about the edge cases. For example, some implementations out there forget that an empty string or keywords like "func" aren't valid identifiers. Add a simple implementation with proper Unicode support, and start using it in cmd/cover and cmd/doc. Other pieces of the standard library reimplement part of this logic, but don't use a "func(string) bool" signature, so we're leaving them untouched for now. Add some tests too, to ensure that we actually got these edge cases correctly. Since telling whether a string is a valid identifier requires knowing that it's not a valid keyword, add IsKeyword too. The internal map was already accessible via Lookup, but "Lookup(str) != IDENT" isn't as easy to understand as IsKeyword(str). And, as per Josh's suggestion, we could have IsKeyword (and probably Lookup too) use a perfect hash function instead of a global map. Finally, for consistency with these new functions, add IsExported. That makes go/ast.IsExported a bit redundant, so perhaps it can be deprecated in favor of go/token.IsExported in the future. Clarify that token.IsExported doesn't imply token.IsIdentifier, to avoid ambiguity. Fixes #30064. Change-Id: I0e0e49215fd7e47b603ebc2b5a44086c51ba57f7 Reviewed-on: https://go-review.googlesource.com/c/go/+/169018 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Robert Griesemer Reviewed-by: Alan Donovan --- src/cmd/cover/cover.go | 19 +------------------ src/cmd/doc/main.go | 23 +++++++---------------- src/go/ast/ast.go | 15 ++++----------- src/go/token/token.go | 34 +++++++++++++++++++++++++++++++++- src/go/token/token_test.go | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 src/go/token/token_test.go diff --git a/src/cmd/cover/cover.go b/src/cmd/cover/cover.go index 2394e57977..1748606c5e 100644 --- a/src/cmd/cover/cover.go +++ b/src/cmd/cover/cover.go @@ -16,7 +16,6 @@ import ( "log" "os" "sort" - "unicode" "cmd/internal/edit" "cmd/internal/objabi" @@ -117,7 +116,7 @@ func parseFlags() error { return fmt.Errorf("too many options") } - if *varVar != "" && !isValidIdentifier(*varVar) { + if *varVar != "" && !token.IsIdentifier(*varVar) { return fmt.Errorf("-var: %q is not a valid identifier", *varVar) } @@ -685,22 +684,6 @@ func (f *File) addVariables(w io.Writer) { } } -func isValidIdentifier(ident string) bool { - if len(ident) == 0 { - return false - } - for i, c := range ident { - if i > 0 && unicode.IsDigit(c) { - continue - } - if c == '_' || unicode.IsLetter(c) { - continue - } - return false - } - return true -} - // It is possible for positions to repeat when there is a line // directive that does not specify column information and the input // has not been passed through gofmt. diff --git a/src/cmd/doc/main.go b/src/cmd/doc/main.go index ec15ec5826..9b24c5874f 100644 --- a/src/cmd/doc/main.go +++ b/src/cmd/doc/main.go @@ -42,6 +42,7 @@ import ( "flag" "fmt" "go/build" + "go/token" "io" "log" "os" @@ -333,28 +334,18 @@ func parseSymbol(str string) (symbol, method string) { case 1: case 2: method = elem[1] - isIdentifier(method) + if !token.IsIdentifier(method) { + log.Fatalf("invalid identifier %q", method) + } default: log.Printf("too many periods in symbol specification") usage() } symbol = elem[0] - isIdentifier(symbol) - return -} - -// isIdentifier checks that the name is valid Go identifier, and -// logs and exits if it is not. -func isIdentifier(name string) { - if len(name) == 0 { - log.Fatal("empty symbol") - } - for i, ch := range name { - if unicode.IsLetter(ch) || ch == '_' || i > 0 && unicode.IsDigit(ch) { - continue - } - log.Fatalf("invalid identifier %q", name) + if !token.IsIdentifier(symbol) { + log.Fatalf("invalid identifier %q", symbol) } + return } // isExported reports whether the name is an exported identifier. diff --git a/src/go/ast/ast.go b/src/go/ast/ast.go index fd109507b8..d8f6f668cc 100644 --- a/src/go/ast/ast.go +++ b/src/go/ast/ast.go @@ -10,8 +10,6 @@ package ast import ( "go/token" "strings" - "unicode" - "unicode/utf8" ) // ---------------------------------------------------------------------------- @@ -523,18 +521,13 @@ func (*ChanType) exprNode() {} // func NewIdent(name string) *Ident { return &Ident{token.NoPos, name, nil} } -// IsExported reports whether name is an exported Go symbol -// (that is, whether it begins with an upper-case letter). +// IsExported reports whether name starts with an upper-case letter. // -func IsExported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} +func IsExported(name string) bool { return token.IsExported(name) } -// IsExported reports whether id is an exported Go symbol -// (that is, whether it begins with an uppercase letter). +// IsExported reports whether id starts with an upper-case letter. // -func (id *Ident) IsExported() bool { return IsExported(id.Name) } +func (id *Ident) IsExported() bool { return token.IsExported(id.Name) } func (id *Ident) String() string { if id != nil { diff --git a/src/go/token/token.go b/src/go/token/token.go index 865f63f4a1..96a1079ec3 100644 --- a/src/go/token/token.go +++ b/src/go/token/token.go @@ -7,7 +7,11 @@ // package token -import "strconv" +import ( + "strconv" + "unicode" + "unicode/utf8" +) // Token is the set of lexical tokens of the Go programming language. type Token int @@ -306,3 +310,31 @@ func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator // it returns false otherwise. // func (tok Token) IsKeyword() bool { return keyword_beg < tok && tok < keyword_end } + +// IsExported reports whether name starts with an upper-case letter. +// +func IsExported(name string) bool { + ch, _ := utf8.DecodeRuneInString(name) + return unicode.IsUpper(ch) +} + +// IsKeyword reports whether name is a Go keyword, such as "func" or "return". +// +func IsKeyword(name string) bool { + // TODO: opt: use a perfect hash function instead of a global map. + _, ok := keywords[name] + return ok +} + +// IsIdentifier reports whether name is a Go identifier, that is, a non-empty +// string made up of letters, digits, and underscores, where the first character +// is not a digit. Keywords are not identifiers. +// +func IsIdentifier(name string) bool { + for i, c := range name { + if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) { + return false + } + } + return name != "" && !IsKeyword(name) +} diff --git a/src/go/token/token_test.go b/src/go/token/token_test.go new file mode 100644 index 0000000000..eff38cc928 --- /dev/null +++ b/src/go/token/token_test.go @@ -0,0 +1,33 @@ +// Copyright 2019 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 token + +import "testing" + +func TestIsIdentifier(t *testing.T) { + tests := []struct { + name string + in string + want bool + }{ + {"Empty", "", false}, + {"Space", " ", false}, + {"SpaceSuffix", "foo ", false}, + {"Number", "123", false}, + {"Keyword", "func", false}, + + {"LettersASCII", "foo", true}, + {"MixedASCII", "_bar123", true}, + {"UppercaseKeyword", "Func", true}, + {"LettersUnicode", "fóö", true}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + if got := IsIdentifier(test.in); got != test.want { + t.Fatalf("IsIdentifier(%q) = %t, want %v", test.in, got, test.want) + } + }) + } +} -- GitLab From 0bd101cecc5458a8463b8d672bf1745c3cbb7c02 Mon Sep 17 00:00:00 2001 From: Yuval Pavel Zholkover Date: Sat, 13 Apr 2019 14:31:07 +0300 Subject: [PATCH 0792/1679] cmd/dist: enable cgo for freebsd/arm Change-Id: Icc1a54da848bf446919c0d5470d1e79fad339832 Reviewed-on: https://go-review.googlesource.com/c/go/+/171727 Reviewed-by: Tobias Klauser Reviewed-by: Ian Lance Taylor --- src/cmd/dist/build.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 15ed4278ac..2ace44a994 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1485,7 +1485,7 @@ var cgoEnabled = map[string]bool{ "dragonfly/amd64": true, "freebsd/386": true, "freebsd/amd64": true, - "freebsd/arm": false, + "freebsd/arm": true, "linux/386": true, "linux/amd64": true, "linux/arm": true, -- GitLab From aafe257390cc9048e8b5df898fabd79a9e0d4c39 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 28 Mar 2019 12:51:30 -0400 Subject: [PATCH 0793/1679] cmd/link, runtime: mark goexit as the top of the call stack This CL adds a new attribute, TOPFRAME, which can be used to mark functions that should be treated as being at the top of the call stack. The function `runtime.goexit` has been marked this way on architectures that use a link register. This will stop programs that use DWARF to unwind the call stack from unwinding past `runtime.goexit` on architectures that use a link register. For example, it eliminates "corrupt stack?" warnings when generating a backtrace that hits `runtime.goexit` in GDB on s390x. Similar code should be added for non-link-register architectures (i.e. amd64, 386). They mark the top of the call stack slightly differently to link register architectures so I haven't added that code (they need to mark "rip" as undefined). Fixes #24385. Change-Id: I15b4c69ac75b491daa0acf0d981cb80eb06488de Reviewed-on: https://go-review.googlesource.com/c/go/+/169726 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/internal/goobj/read.go | 2 ++ src/cmd/internal/obj/link.go | 6 ++++++ src/cmd/internal/obj/objfile.go | 6 ++++++ src/cmd/internal/obj/plist.go | 1 + src/cmd/internal/obj/textflag.go | 4 ++++ src/cmd/link/internal/ld/dwarf.go | 22 +++++++++++++++++----- src/cmd/link/internal/objfile/objfile.go | 3 +++ src/cmd/link/internal/sym/attribute.go | 6 +++++- src/runtime/asm_arm.s | 2 +- src/runtime/asm_arm64.s | 2 +- src/runtime/asm_mips64x.s | 2 +- src/runtime/asm_mipsx.s | 2 +- src/runtime/asm_ppc64x.s | 2 +- src/runtime/asm_s390x.s | 2 +- src/runtime/runtime-gdb_test.go | 22 ++++++++++++++++++++++ src/runtime/textflag.h | 3 +++ 16 files changed, 75 insertions(+), 12 deletions(-) diff --git a/src/cmd/internal/goobj/read.go b/src/cmd/internal/goobj/read.go index 84aed6eeea..dd29bacd04 100644 --- a/src/cmd/internal/goobj/read.go +++ b/src/cmd/internal/goobj/read.go @@ -97,6 +97,7 @@ type Func struct { Frame int64 // size in bytes of local variable frame Leaf bool // function omits save of link register (ARM) NoSplit bool // function omits stack split prologue + TopFrame bool // function is the top of the call stack Var []Var // detail about local variables PCSP Data // PC → SP offset map PCFile Data // PC → file number map (index into File) @@ -576,6 +577,7 @@ func (r *objReader) parseObject(prefix []byte) error { f.Frame = r.readInt() flags := r.readInt() f.Leaf = flags&(1<<0) != 0 + f.TopFrame = flags&(1<<4) != 0 f.NoSplit = r.readInt() != 0 f.Var = make([]Var, r.readInt()) for i := range f.Var { diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index f506f60d06..5d4e5db27f 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -489,6 +489,10 @@ const ( // target of an inline during compilation AttrWasInlined + // TopFrame means that this function is an entry point and unwinders should not + // keep unwinding beyond this frame. + AttrTopFrame + // attrABIBase is the value at which the ABI is encoded in // Attribute. This must be last; all bits after this are // assumed to be an ABI value. @@ -511,6 +515,7 @@ func (a Attribute) NeedCtxt() bool { return a&AttrNeedCtxt != 0 } func (a Attribute) NoFrame() bool { return a&AttrNoFrame != 0 } func (a Attribute) Static() bool { return a&AttrStatic != 0 } func (a Attribute) WasInlined() bool { return a&AttrWasInlined != 0 } +func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } func (a *Attribute) Set(flag Attribute, value bool) { if value { @@ -544,6 +549,7 @@ var textAttrStrings = [...]struct { {bit: AttrNoFrame, s: "NOFRAME"}, {bit: AttrStatic, s: "STATIC"}, {bit: AttrWasInlined, s: ""}, + {bit: AttrTopFrame, s: "TOPFRAME"}, } // TextAttrString formats a for printing in as part of a TEXT prog. diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index a94717a404..0aa0d2ac44 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -230,6 +230,9 @@ func (w *objWriter) writeSymDebug(s *LSym) { if s.NoSplit() { fmt.Fprintf(ctxt.Bso, "nosplit ") } + if s.TopFrame() { + fmt.Fprintf(ctxt.Bso, "topframe ") + } fmt.Fprintf(ctxt.Bso, "size=%d", s.Size) if s.Type == objabi.STEXT { fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x", uint64(s.Func.Args), uint64(s.Func.Locals)) @@ -342,6 +345,9 @@ func (w *objWriter) writeSym(s *LSym) { if ctxt.Flag_shared { flags |= 1 << 3 } + if s.TopFrame() { + flags |= 1 << 4 + } w.writeInt(flags) w.writeInt(int64(len(s.Func.Autom))) for _, a := range s.Func.Autom { diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index 8b177c5a02..303fa469e4 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -132,6 +132,7 @@ func (ctxt *Link) InitTextSym(s *LSym, flag int) { s.Set(AttrWrapper, flag&WRAPPER != 0) s.Set(AttrNeedCtxt, flag&NEEDCTXT != 0) s.Set(AttrNoFrame, flag&NOFRAME != 0) + s.Set(AttrTopFrame, flag&TOPFRAME != 0) s.Type = objabi.STEXT ctxt.Text = append(ctxt.Text, s) diff --git a/src/cmd/internal/obj/textflag.go b/src/cmd/internal/obj/textflag.go index d8a52da4af..d2cec734b1 100644 --- a/src/cmd/internal/obj/textflag.go +++ b/src/cmd/internal/obj/textflag.go @@ -47,4 +47,8 @@ const ( // Function can call reflect.Type.Method or reflect.Type.MethodByName. REFLECTMETHOD = 1024 + + // Function is the top of the call stack. Call stack unwinders should stop + // at this function. + TOPFRAME = 2048 ) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index c7184477de..0d159c7658 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1451,6 +1451,13 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { // Emit a FDE, Section 6.4.1. // First build the section contents into a byte buffer. deltaBuf = deltaBuf[:0] + if haslinkregister(ctxt) && s.Attr.TopFrame() { + // Mark the link register as having an undefined value. + // This stops call stack unwinders progressing any further. + // TODO: similar mark on non-LR architectures. + deltaBuf = append(deltaBuf, dwarf.DW_CFA_undefined) + deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) + } for pcsp.init(s.FuncInfo.Pcsp.P); !pcsp.done; pcsp.next() { nextpc := pcsp.nextpc @@ -1463,7 +1470,13 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { } } - if haslinkregister(ctxt) { + spdelta := int64(pcsp.value) + if !haslinkregister(ctxt) { + // Return address has been pushed onto stack. + spdelta += int64(ctxt.Arch.PtrSize) + } + + if haslinkregister(ctxt) && !s.Attr.TopFrame() { // TODO(bryanpkc): This is imprecise. In general, the instruction // that stores the return address to the stack frame is not the // same one that allocates the frame. @@ -1472,17 +1485,16 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol { // after a stack frame has been allocated. deltaBuf = append(deltaBuf, dwarf.DW_CFA_offset_extended_sf) deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) - deltaBuf = dwarf.AppendSleb128(deltaBuf, -int64(pcsp.value)/dataAlignmentFactor) + deltaBuf = dwarf.AppendSleb128(deltaBuf, -spdelta/dataAlignmentFactor) } else { // The return address is restored into the link register // when a stack frame has been de-allocated. deltaBuf = append(deltaBuf, dwarf.DW_CFA_same_value) deltaBuf = dwarf.AppendUleb128(deltaBuf, uint64(thearch.Dwarfreglr)) } - deltaBuf = appendPCDeltaCFA(ctxt.Arch, deltaBuf, int64(nextpc)-int64(pcsp.pc), int64(pcsp.value)) - } else { - deltaBuf = appendPCDeltaCFA(ctxt.Arch, deltaBuf, int64(nextpc)-int64(pcsp.pc), int64(ctxt.Arch.PtrSize)+int64(pcsp.value)) } + + deltaBuf = appendPCDeltaCFA(ctxt.Arch, deltaBuf, int64(nextpc)-int64(pcsp.pc), spdelta) } pad := int(Rnd(int64(len(deltaBuf)), int64(ctxt.Arch.PtrSize))) - len(deltaBuf) deltaBuf = append(deltaBuf, zeros[:pad]...) diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index f3957822b0..7f93912a44 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -282,6 +282,9 @@ overwrite: if flags&(1<<3) != 0 { s.Attr |= sym.AttrShared } + if flags&(1<<4) != 0 { + s.Attr |= sym.AttrTopFrame + } n := r.readInt() pc.Autom = r.autom[:n:n] if !isdup { diff --git a/src/cmd/link/internal/sym/attribute.go b/src/cmd/link/internal/sym/attribute.go index 62ccef91a6..74fda1495e 100644 --- a/src/cmd/link/internal/sym/attribute.go +++ b/src/cmd/link/internal/sym/attribute.go @@ -75,7 +75,10 @@ const ( // AttrContainer is set on text symbols that are present as the .Outer for some // other symbol. AttrContainer - // 17 attributes defined so far. + // AttrTopFrame means that the function is an entry point and unwinders + // should stop when they hit this function. + AttrTopFrame + // 18 attributes defined so far. ) func (a Attribute) DuplicateOK() bool { return a&AttrDuplicateOK != 0 } @@ -95,6 +98,7 @@ func (a Attribute) Shared() bool { return a&AttrShared != 0 } func (a Attribute) VisibilityHidden() bool { return a&AttrVisibilityHidden != 0 } func (a Attribute) SubSymbol() bool { return a&AttrSubSymbol != 0 } func (a Attribute) Container() bool { return a&AttrContainer != 0 } +func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } func (a Attribute) CgoExport() bool { return a.CgoExportDynamic() || a.CgoExportStatic() diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s index af7da64ce6..5c6dfedac8 100644 --- a/src/runtime/asm_arm.s +++ b/src/runtime/asm_arm.s @@ -864,7 +864,7 @@ TEXT _cgo_topofstack(SB),NOSPLIT,$8 // The top-most function running on a goroutine // returns to goexit+PCQuantum. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 MOVW R0, R0 // NOP BL runtime·goexit1(SB) // does not return // traceback from goexit1 must hit code range of goexit diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index f7cf0d3544..871dc95dea 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -1124,7 +1124,7 @@ TEXT runtime·return0(SB), NOSPLIT, $0 // The top-most function running on a goroutine // returns to goexit+PCQuantum. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 MOVD R0, R0 // NOP BL runtime·goexit1(SB) // does not return diff --git a/src/runtime/asm_mips64x.s b/src/runtime/asm_mips64x.s index 257c13e9af..8e591400d1 100644 --- a/src/runtime/asm_mips64x.s +++ b/src/runtime/asm_mips64x.s @@ -642,7 +642,7 @@ TEXT _cgo_topofstack(SB),NOSPLIT,$16 // The top-most function running on a goroutine // returns to goexit+PCQuantum. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 NOR R0, R0 // NOP JAL runtime·goexit1(SB) // does not return // traceback from goexit1 must hit code range of goexit diff --git a/src/runtime/asm_mipsx.s b/src/runtime/asm_mipsx.s index 9f38bbc71e..971dc37658 100644 --- a/src/runtime/asm_mipsx.s +++ b/src/runtime/asm_mipsx.s @@ -653,7 +653,7 @@ TEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0 // The top-most function running on a goroutine // returns to goexit+PCQuantum. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 NOR R0, R0 // NOP JAL runtime·goexit1(SB) // does not return // traceback from goexit1 must hit code range of goexit diff --git a/src/runtime/asm_ppc64x.s b/src/runtime/asm_ppc64x.s index d7fc66bda1..8b850683f7 100644 --- a/src/runtime/asm_ppc64x.s +++ b/src/runtime/asm_ppc64x.s @@ -880,7 +880,7 @@ TEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0 // pointer in the correct place). // goexit+_PCQuantum is halfway through the usual global entry point prologue // that derives r2 from r12 which is a bit silly, but not harmful. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 MOVD 24(R1), R2 BL runtime·goexit1(SB) // does not return // traceback from goexit1 must hit code range of goexit diff --git a/src/runtime/asm_s390x.s b/src/runtime/asm_s390x.s index 5b9e0cd481..e646ea009a 100644 --- a/src/runtime/asm_s390x.s +++ b/src/runtime/asm_s390x.s @@ -775,7 +775,7 @@ TEXT _cgo_topofstack(SB),NOSPLIT|NOFRAME,$0 // The top-most function running on a goroutine // returns to goexit+PCQuantum. -TEXT runtime·goexit(SB),NOSPLIT|NOFRAME,$0-0 +TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 BYTE $0x07; BYTE $0x00; // 2-byte nop BL runtime·goexit1(SB) // does not return // traceback from goexit1 must hit code range of goexit diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index d47c7c2262..8117a5c979 100644 --- a/src/runtime/runtime-gdb_test.go +++ b/src/runtime/runtime-gdb_test.go @@ -82,6 +82,22 @@ func checkGdbPython(t *testing.T) { } } +// checkCleanBacktrace checks that the given backtrace is well formed and does +// not contain any error messages from GDB. +func checkCleanBacktrace(t *testing.T, backtrace string) { + backtrace = strings.TrimSpace(backtrace) + lines := strings.Split(backtrace, "\n") + if len(lines) == 0 { + t.Fatalf("empty backtrace") + } + for i, l := range lines { + if !strings.HasPrefix(l, fmt.Sprintf("#%v ", i)) { + t.Fatalf("malformed backtrace at line %v: %v", i, l) + } + } + // TODO(mundaym): check for unknown frames (e.g. "??"). +} + const helloSource = ` import "fmt" import "runtime" @@ -272,6 +288,11 @@ func testGdbPython(t *testing.T, cgo bool) { t.Fatalf("info locals failed: %s", bl) } + // Check that the backtraces are well formed. + checkCleanBacktrace(t, blocks["goroutine 1 bt"]) + checkCleanBacktrace(t, blocks["goroutine 2 bt"]) + checkCleanBacktrace(t, blocks["goroutine 1 bt at the end"]) + btGoroutine1Re := regexp.MustCompile(`(?m)^#0\s+(0x[0-9a-f]+\s+in\s+)?main\.main.+at`) if bl := blocks["goroutine 1 bt"]; !btGoroutine1Re.MatchString(bl) { t.Fatalf("goroutine 1 bt failed: %s", bl) @@ -281,6 +302,7 @@ func testGdbPython(t *testing.T, cgo bool) { if bl := blocks["goroutine 2 bt"]; !btGoroutine2Re.MatchString(bl) { t.Fatalf("goroutine 2 bt failed: %s", bl) } + btGoroutine1AtTheEndRe := regexp.MustCompile(`(?m)^#0\s+(0x[0-9a-f]+\s+in\s+)?main\.main.+at`) if bl := blocks["goroutine 1 bt at the end"]; !btGoroutine1AtTheEndRe.MatchString(bl) { t.Fatalf("goroutine 1 bt at the end failed: %s", bl) diff --git a/src/runtime/textflag.h b/src/runtime/textflag.h index d1bb52cc00..daca36d948 100644 --- a/src/runtime/textflag.h +++ b/src/runtime/textflag.h @@ -32,3 +32,6 @@ #define NOFRAME 512 // Function can call reflect.Type.Method or reflect.Type.MethodByName. #define REFLECTMETHOD 1024 +// Function is the top of the call stack. Call stack unwinders should stop +// at this function. +#define TOPFRAME 2048 -- GitLab From d91f7e6637cc96029cd5a360a0a74153b39a3ae6 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 28 Mar 2019 08:05:43 -0400 Subject: [PATCH 0794/1679] runtime: fix GDB tests on s390x running Ubuntu 18.04 On Ubuntu 18.04 I am seeing GDB fail to restore the stack pointer during this test because stack unwinding can't find the PC. This CL is essentially a partial revert of CL 23940 and fixes the issue on s390x. Change-Id: Ib4c41162dc85dc882eb6e248330f4082c3fa94c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/169857 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/runtime/runtime-gdb.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/runtime-gdb.py b/src/runtime/runtime-gdb.py index 48960b7f61..72645d289e 100644 --- a/src/runtime/runtime-gdb.py +++ b/src/runtime/runtime-gdb.py @@ -540,8 +540,8 @@ class GoroutineCmd(gdb.Command): # In GDB, assignments to sp must be done from the # top-most frame, so select frame 0 first. gdb.execute('select-frame 0') - gdb.parse_and_eval('$sp = $save_sp') gdb.parse_and_eval('$pc = $save_pc') + gdb.parse_and_eval('$sp = $save_sp') save_frame.select() -- GitLab From 97c4ad432743d74ee59648dee0db1b107c701834 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 2 Apr 2019 10:40:12 -0700 Subject: [PATCH 0795/1679] cmd/compile: add new escape analysis implementation This CL adds a new escape analysis implementation, which can be enabled through the -newescape compiler flag. This implementation focuses on simplicity, but in the process ends up using less memory, speeding up some compile-times, fixing memory corruption issues, and overall significantly improving escape analysis results. Updates #23109. Change-Id: I6176d9a7ae9d80adb0208d4112b8a1e1f4c9143a Reviewed-on: https://go-review.googlesource.com/c/go/+/170322 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/esc.go | 43 +- src/cmd/compile/internal/gc/escape.go | 1386 +++++++++++++++++++++++++ src/cmd/compile/internal/gc/main.go | 1 + 3 files changed, 1415 insertions(+), 15 deletions(-) create mode 100644 src/cmd/compile/internal/gc/escape.go diff --git a/src/cmd/compile/internal/gc/esc.go b/src/cmd/compile/internal/gc/esc.go index f162fc641b..ceefde74a1 100644 --- a/src/cmd/compile/internal/gc/esc.go +++ b/src/cmd/compile/internal/gc/esc.go @@ -41,8 +41,16 @@ import ( // not escape, then new(T) can be rewritten into a stack allocation. // The same is true of slice literals. +// If newescape is true, then escape.go drives escape analysis instead +// of esc.go. +var newescape bool + func escapes(all []*Node) { - visitBottomUp(all, escAnalyze) + esc := escAnalyze + if newescape { + esc = escapeFuncs + } + visitBottomUp(all, esc) } const ( @@ -393,7 +401,7 @@ func escAnalyze(all []*Node, recursive bool) { // for all top level functions, tag the typenodes corresponding to the param nodes for _, n := range all { if n.Op == ODCLFUNC { - e.esctag(n) + esctag(n) } } @@ -516,7 +524,7 @@ func (e *EscState) esclist(l Nodes, parent *Node) { } } -func (e *EscState) isSliceSelfAssign(dst, src *Node) bool { +func isSliceSelfAssign(dst, src *Node) bool { // Detect the following special case. // // func (b *Buffer) Foo() { @@ -566,8 +574,8 @@ func (e *EscState) isSliceSelfAssign(dst, src *Node) bool { // isSelfAssign reports whether assignment from src to dst can // be ignored by the escape analysis as it's effectively a self-assignment. -func (e *EscState) isSelfAssign(dst, src *Node) bool { - if e.isSliceSelfAssign(dst, src) { +func isSelfAssign(dst, src *Node) bool { + if isSliceSelfAssign(dst, src) { return true } @@ -589,7 +597,7 @@ func (e *EscState) isSelfAssign(dst, src *Node) bool { case ODOT, ODOTPTR: // Safe trailing accessors that are permitted to differ. case OINDEX: - if e.mayAffectMemory(dst.Right) || e.mayAffectMemory(src.Right) { + if mayAffectMemory(dst.Right) || mayAffectMemory(src.Right) { return false } default: @@ -602,7 +610,7 @@ func (e *EscState) isSelfAssign(dst, src *Node) bool { // mayAffectMemory reports whether n evaluation may affect program memory state. // If expression can't affect it, then it can be safely ignored by the escape analysis. -func (e *EscState) mayAffectMemory(n *Node) bool { +func mayAffectMemory(n *Node) bool { // We may want to use "memory safe" black list instead of general // "side-effect free", which can include all calls and other ops // that can affect allocate or change global state. @@ -616,18 +624,26 @@ func (e *EscState) mayAffectMemory(n *Node) bool { // Left+Right group. case OINDEX, OADD, OSUB, OOR, OXOR, OMUL, OLSH, ORSH, OAND, OANDNOT, ODIV, OMOD: - return e.mayAffectMemory(n.Left) || e.mayAffectMemory(n.Right) + return mayAffectMemory(n.Left) || mayAffectMemory(n.Right) // Left group. case ODOT, ODOTPTR, ODEREF, OCONVNOP, OCONV, OLEN, OCAP, ONOT, OBITNOT, OPLUS, ONEG, OALIGNOF, OOFFSETOF, OSIZEOF: - return e.mayAffectMemory(n.Left) + return mayAffectMemory(n.Left) default: return true } } +func mustHeapAlloc(n *Node) bool { + // TODO(mdempsky): Cleanup this mess. + return n.Type != nil && + (n.Type.Width > maxStackVarSize || + (n.Op == ONEW || n.Op == OPTRLIT) && n.Type.Elem().Width >= maxImplicitStackVarSize || + n.Op == OMAKESLICE && !isSmallMakeSlice(n)) +} + func (e *EscState) esc(n *Node, parent *Node) { if n == nil { return @@ -658,10 +674,7 @@ func (e *EscState) esc(n *Node, parent *Node) { // Big stuff and non-constant-sized stuff escapes unconditionally. // "Big" conditions that were scattered around in walk have been // gathered here. - if n.Esc != EscHeap && n.Type != nil && - (n.Type.Width > maxStackVarSize || - (n.Op == ONEW || n.Op == OPTRLIT) && n.Type.Elem().Width >= maxImplicitStackVarSize || - n.Op == OMAKESLICE && !isSmallMakeSlice(n)) { + if n.Esc != EscHeap && mustHeapAlloc(n) { // isSmallMakeSlice returns false for non-constant len/cap. // If that's the case, print a more accurate escape reason. var msgVerb, escapeMsg string @@ -756,7 +769,7 @@ opSwitch: case OAS, OASOP: // Filter out some no-op assignments for escape analysis. - if e.isSelfAssign(n.Left, n.Right) { + if isSelfAssign(n.Left, n.Right) { if Debug['m'] != 0 { Warnl(n.Pos, "%v ignoring self-assignment in %S", e.curfnSym(n), n) } @@ -2182,7 +2195,7 @@ const unsafeUintptrTag = "unsafe-uintptr" // marked go:uintptrescapes. const uintptrEscapesTag = "uintptr-escapes" -func (e *EscState) esctag(fn *Node) { +func esctag(fn *Node) { fn.Esc = EscFuncTagged name := func(s *types.Sym, narg int) string { diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go new file mode 100644 index 0000000000..61be503bc3 --- /dev/null +++ b/src/cmd/compile/internal/gc/escape.go @@ -0,0 +1,1386 @@ +// Copyright 2018 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 gc + +import ( + "cmd/compile/internal/types" + "fmt" +) + +// Escape analysis. +// +// Here we analyze functions to determine which Go variables +// (including implicit allocations such as calls to "new" or "make", +// composite literals, etc.) can be allocated on the stack. The two +// key invariants we have to ensure are: (1) pointers to stack objects +// cannot be stored in the heap, and (2) pointers to a stack object +// cannot outlive that object (e.g., because the declaring function +// returned and destroyed the object's stack frame, or its space is +// reused across loop iterations for logically distinct variables). +// +// We implement this with a static data-flow analysis of the AST. +// First, we construct a directed weighted graph where vertices +// (termed "locations") represent variables allocated by statements +// and expressions, and edges represent assignments between variables +// (with weights reperesenting addressing/dereference counts). +// +// Next we walk the graph looking for assignment paths that might +// violate the invariants stated above. If a variable v's address is +// stored in the heap or elsewhere that may outlive it, then v is +// marked as requiring heap allocation. +// +// To support interprocedural analysis, we also record data-flow from +// each function's parameters to the heap and to its result +// parameters. This information is summarized as "paremeter tags", +// which are used at static call sites to improve escape analysis of +// function arguments. + +// Constructing the location graph. +// +// Every allocating statement (e.g., variable declaration) or +// expression (e.g., "new" or "make") is first mapped to a unique +// "location." +// +// We also model every Go assignment as a directed edges between +// locations. The number of derefence operations minus the number of +// addressing operations is recorded as the edge's weight (termed +// "derefs"). For example: +// +// p = &q // -1 +// p = q // 0 +// p = *q // 1 +// p = **q // 2 +// +// p = **&**&q // 2 +// +// Note that the & operator can only be applied to addressable +// expressions, and the expression &x itself is not addressable, so +// derefs cannot go below -1. +// +// Every Go language construct is lowered into this representation, +// generally without sensitivity to flow, path, or context; and +// without distinguishing elements within a compound variable. For +// example: +// +// var x struct { f, g *int } +// var u []*int +// +// x.f = u[0] +// +// is modeled simply as +// +// x = *u +// +// That is, we don't distinguish x.f from x.g, or u[0] from u[1], +// u[2], etc. However, we do record the implicit dereference involved +// in indexing a slice. + +type Escape struct { + allLocs []*EscLocation + + curfn *Node + + // loopDepth counts the current loop nesting depth within + // curfn. It increments within each "for" loop and at each + // label with a corresponding backwards "goto" (i.e., + // unstructured loop). + loopDepth int + + heapLoc EscLocation + blankLoc EscLocation +} + +// An EscLocation represents an abstract location that stores a Go +// variable. +type EscLocation struct { + n *Node // represented variable or expression, if any + curfn *Node // enclosing function + edges []EscEdge // incoming edges + loopDepth int // loopDepth at declaration + + // derefs and walkgen are used during walk to track the + // minimal dereferences from the walk root. + derefs int // >= -1 + walkgen uint32 + + // escapes reports whether the represented variable's address + // escapes; that is, whether the variable must be heap + // allocated. + escapes bool + + // transient reports whether the represented expression's + // address does not outlive the statement; that is, whether + // its storage can be immediately reused. + transient bool + + // paramEsc records the represented parameter's escape tags. + // See "Parameter tags" below for details. + paramEsc uint16 +} + +// An EscEdge represents an assignment edge between two Go variables. +type EscEdge struct { + src *EscLocation + derefs int // >= -1 +} + +// escapeFuncs performs escape analysis on a minimal batch of +// functions. +func escapeFuncs(fns []*Node, recursive bool) { + for _, fn := range fns { + if fn.Op != ODCLFUNC { + Fatalf("unexpected node: %v", fn) + } + } + + var e Escape + + // Construct data-flow graph from syntax trees. + for _, fn := range fns { + e.initFunc(fn) + } + for _, fn := range fns { + e.walkFunc(fn) + } + e.curfn = nil + + e.walkAll() + e.finish() + + // Record parameter tags for package export data. + for _, fn := range fns { + esctag(fn) + } +} + +func (e *Escape) initFunc(fn *Node) { + if fn.Op != ODCLFUNC || fn.Esc != EscFuncUnknown { + Fatalf("unexpected node: %v", fn) + } + fn.Esc = EscFuncPlanned + if Debug['m'] > 3 { + Dump("escAnalyze", fn) + } + + e.curfn = fn + e.loopDepth = 1 + + // Allocate locations for local variables. + for _, dcl := range fn.Func.Dcl { + if dcl.Op == ONAME { + loc := e.newLoc(dcl, false) + + if dcl.Class() == PPARAM && fn.Nbody.Len() == 0 && !fn.Noescape() { + loc.paramEsc = EscHeap + } + } + } +} + +func (e *Escape) walkFunc(fn *Node) { + fn.Esc = EscFuncStarted + + // Identify labels that mark the head of an unstructured loop. + inspectList(fn.Nbody, func(n *Node) bool { + switch n.Op { + case OLABEL: + n.Sym.Label = asTypesNode(&nonlooping) + + case OGOTO: + // If we visited the label before the goto, + // then this is a looping label. + if n.Sym.Label == asTypesNode(&nonlooping) { + n.Sym.Label = asTypesNode(&looping) + } + } + + return true + }) + + e.curfn = fn + e.loopDepth = 1 + e.stmts(fn.Nbody) +} + +// Below we implement the methods for walking the AST and recording +// data flow edges. Note that because a sub-expression might have +// side-effects, it's important to always visit the entire AST. +// +// For example, write either: +// +// if x { +// e.discard(n.Left) +// } else { +// e.value(k, n.Left) +// } +// +// or +// +// if x { +// k = e.discardHole() +// } +// e.value(k, n.Left) +// +// Do NOT write: +// +// // BAD: possibly loses side-effects within n.Left +// if !x { +// e.value(k, n.Left) +// } + +// stmt evaluates a single Go statement. +func (e *Escape) stmt(n *Node) { + if n == nil { + return + } + + lno := setlineno(n) + defer func() { + lineno = lno + }() + + if Debug['m'] > 2 { + fmt.Printf("%v:[%d] %v stmt: %v\n", linestr(lineno), e.loopDepth, funcSym(e.curfn), n) + } + + e.stmts(n.Ninit) + + switch n.Op { + default: + Fatalf("unexpected stmt: %v", n) + + case ODCLCONST, ODCLTYPE, OEMPTY, OFALL, OINLMARK: + // nop + + case OBREAK, OCONTINUE, OGOTO: + // TODO(mdempsky): Handle dead code? + + case OBLOCK: + e.stmts(n.List) + + case ODCL: + // Record loop depth at declaration. + if !n.Left.isBlank() { + e.dcl(n.Left) + } + + case OLABEL: + switch asNode(n.Sym.Label) { + case &nonlooping: + if Debug['m'] > 2 { + fmt.Printf("%v:%v non-looping label\n", linestr(lineno), n) + } + case &looping: + if Debug['m'] > 2 { + fmt.Printf("%v: %v looping label\n", linestr(lineno), n) + } + e.loopDepth++ + default: + Fatalf("label missing tag") + } + n.Sym.Label = nil + + case OIF: + e.discard(n.Left) + e.stmts(n.Nbody) + e.stmts(n.Rlist) + + case OFOR, OFORUNTIL: + e.loopDepth++ + e.discard(n.Left) + e.stmt(n.Right) + e.stmts(n.Nbody) + e.loopDepth-- + + case ORANGE: + // for List = range Right { Nbody } + + // Right is evaluated outside the loop. + tv := e.newLoc(n, false) + e.expr(tv.asHole(), n.Right) + + e.loopDepth++ + ks := e.addrs(n.List) + if len(ks) >= 2 { + if n.Right.Type.IsArray() { + e.flow(ks[1].note(n, "range"), tv) + } else { + e.flow(ks[1].deref(n, "range-deref"), tv) + } + } + + e.stmts(n.Nbody) + e.loopDepth-- + + case OSWITCH: + var tv *EscLocation + if n.Left != nil { + if n.Left.Op == OTYPESW { + k := e.discardHole() + if n.Left.Left != nil { + tv = e.newLoc(n.Left, false) + k = tv.asHole() + } + e.expr(k, n.Left.Right) + } else { + e.discard(n.Left) + } + } + + for _, cas := range n.List.Slice() { // cases + if tv != nil { + // type switch variables have no ODCL. + cv := cas.Rlist.First() + k := e.dcl(cv) + if types.Haspointers(cv.Type) { + e.flow(k.dotType(cv.Type, n, "switch case"), tv) + } + } + + e.discards(cas.List) + e.stmts(cas.Nbody) + } + + case OSELECT: + for _, cas := range n.List.Slice() { + e.stmt(cas.Left) + e.stmts(cas.Nbody) + } + case OSELRECV: + e.assign(n.Left, n.Right, "selrecv", n) + case OSELRECV2: + e.assign(n.Left, n.Right, "selrecv", n) + e.assign(n.List.First(), nil, "selrecv", n) + case ORECV: + // TODO(mdempsky): Consider e.discard(n.Left). + e.exprSkipInit(e.discardHole(), n) // already visited n.Ninit + case OSEND: + e.discard(n.Left) + e.assignHeap(n.Right, "send", n) + + case OAS, OASOP: + e.assign(n.Left, n.Right, "assign", n) + + case OAS2: + for i, nl := range n.List.Slice() { + e.assign(nl, n.Rlist.Index(i), "assign-pair", n) + } + + case OAS2DOTTYPE: // v, ok = x.(type) + e.assign(n.List.First(), n.Rlist.First(), "assign-pair-dot-type", n) + e.assign(n.List.Second(), nil, "assign-pair-dot-type", n) + case OAS2MAPR: // v, ok = m[k] + e.assign(n.List.First(), n.Rlist.First(), "assign-pair-mapr", n) + e.assign(n.List.Second(), nil, "assign-pair-mapr", n) + case OAS2RECV: // v, ok = <-ch + e.assign(n.List.First(), n.Rlist.First(), "assign-pair-receive", n) + e.assign(n.List.Second(), nil, "assign-pair-receive", n) + + case OAS2FUNC: + e.stmts(n.Rlist.First().Ninit) + e.call(e.addrs(n.List), n.Rlist.First(), nil) + case ORETURN: + results := e.curfn.Type.Results().FieldSlice() + for i, v := range n.List.Slice() { + e.assign(asNode(results[i].Nname), v, "return", n) + } + case OCALLFUNC, OCALLMETH, OCALLINTER, OCLOSE, OCOPY, ODELETE, OPANIC, OPRINT, OPRINTN, ORECOVER: + e.call(nil, n, nil) + case OGO, ODEFER: + e.stmts(n.Left.Ninit) + e.call(nil, n.Left, n) + + case ORETJMP: + // TODO(mdempsky): What do? esc.go just ignores it. + } +} + +func (e *Escape) stmts(l Nodes) { + // TODO(mdempsky): Preserve and restore e.loopDepth? See also #22438. + for _, n := range l.Slice() { + e.stmt(n) + } +} + +// expr models evaluating an expression n and flowing the result into +// hole k. +func (e *Escape) expr(k EscHole, n *Node) { + if n == nil { + return + } + e.stmts(n.Ninit) + e.exprSkipInit(k, n) +} + +func (e *Escape) exprSkipInit(k EscHole, n *Node) { + if n == nil { + return + } + + lno := setlineno(n) + defer func() { + lineno = lno + }() + + if k.derefs >= 0 && !types.Haspointers(n.Type) { + k = e.discardHole() + } + + switch n.Op { + default: + Fatalf("unexpected expr: %v", n) + + case OLITERAL, OGETG, OCLOSUREVAR, OTYPE: + // nop + + case ONAME: + if n.Class() == PFUNC || n.Class() == PEXTERN { + return + } + e.flow(k, e.oldLoc(n)) + + case OPLUS, ONEG, OBITNOT, ONOT: + e.discard(n.Left) + case OADD, OSUB, OOR, OXOR, OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT, OEQ, ONE, OLT, OLE, OGT, OGE, OANDAND, OOROR: + e.discard(n.Left) + e.discard(n.Right) + + case OADDR: + e.expr(k.addr(n, "address-of"), n.Left) // "address-of" + case ODEREF: + e.expr(k.deref(n, "indirection"), n.Left) // "indirection" + case ODOT, ODOTMETH, ODOTINTER: + e.expr(k.note(n, "dot"), n.Left) + case ODOTPTR: + e.expr(k.deref(n, "dot of pointer"), n.Left) // "dot of pointer" + case ODOTTYPE, ODOTTYPE2: + e.expr(k.dotType(n.Type, n, "dot"), n.Left) + case OINDEX: + if n.Left.Type.IsArray() { + e.expr(k.note(n, "fixed-array-index-of"), n.Left) + } else { + // TODO(mdempsky): Fix why reason text. + e.expr(k.deref(n, "dot of pointer"), n.Left) + } + e.discard(n.Right) + case OINDEXMAP: + e.discard(n.Left) + e.discard(n.Right) + case OSLICE, OSLICEARR, OSLICE3, OSLICE3ARR, OSLICESTR: + e.expr(k.note(n, "slice"), n.Left) + low, high, max := n.SliceBounds() + e.discard(low) + e.discard(high) + e.discard(max) + + case OCONV, OCONVNOP: + if n.Type.Etype == TUNSAFEPTR && n.Left.Type.Etype == TUINTPTR { + e.unsafeValue(k, n.Left) + } else { + e.expr(k, n.Left) + } + case OCONVIFACE: + if !n.Left.Type.IsInterface() && !isdirectiface(n.Left.Type) { + k = e.spill(k, n) + } else { + // esc.go prints "escapes to heap" / "does not + // escape" messages for OCONVIFACE even when + // they don't allocate. Match that behavior + // because it's easy. + // TODO(mdempsky): Remove and cleanup test expectations. + _ = e.spill(k, n) + } + e.expr(k.note(n, "interface-converted"), n.Left) + + case ORECV: + e.discard(n.Left) + + case OCALLMETH, OCALLFUNC, OCALLINTER, OLEN, OCAP, OCOMPLEX, OREAL, OIMAG, OAPPEND, OCOPY: + e.call([]EscHole{k}, n, nil) + + case ONEW: + e.spill(k, n) + + case OMAKESLICE: + e.spill(k, n) + e.discard(n.Left) + e.discard(n.Right) + case OMAKECHAN: + e.discard(n.Left) + case OMAKEMAP: + e.spill(k, n) + e.discard(n.Left) + + case ORECOVER: + // nop + + case OCALLPART: + e.spill(k, n) + + // esc.go says "Contents make it to memory, lose + // track." I think we can just flow n.Left to our + // spilled location though. + // TODO(mdempsky): Try that. + e.assignHeap(n.Left, "call part", n) + + case OPTRLIT: + e.expr(e.spill(k, n), n.Left) + + case OARRAYLIT: + for _, elt := range n.List.Slice() { + if elt.Op == OKEY { + elt = elt.Right + } + e.expr(k.note(n, "array literal element"), elt) + } + + case OSLICELIT: + k = e.spill(k, n) + + for _, elt := range n.List.Slice() { + if elt.Op == OKEY { + elt = elt.Right + } + e.expr(k.note(n, "slice-literal-element"), elt) + } + + case OSTRUCTLIT: + for _, elt := range n.List.Slice() { + e.expr(k.note(n, "struct literal element"), elt.Left) + } + + case OMAPLIT: + e.spill(k, n) + + // Map keys and values are always stored in the heap. + for _, elt := range n.List.Slice() { + e.assignHeap(elt.Left, "map literal key", n) + e.assignHeap(elt.Right, "map literal value", n) + } + + case OCLOSURE: + k = e.spill(k, n) + + // Link addresses of captured variables to closure. + for _, v := range n.Func.Closure.Func.Cvars.Slice() { + if v.Op == OXXX { // unnamed out argument; see dcl.go:/^funcargs + continue + } + + k := k + if !v.Name.Byval() { + k = k.addr(v, "reference") + } + + e.expr(k.note(n, "captured by a closure"), v.Name.Defn) + } + + case ORUNES2STR, OBYTES2STR, OSTR2RUNES, OSTR2BYTES, ORUNESTR: + e.spill(k, n) + e.discard(n.Left) + + case OADDSTR: + e.spill(k, n) + + // Arguments of OADDSTR never escape; + // runtime.concatstrings makes sure of that. + e.discards(n.List) + } +} + +// unsafeValue evaluates a uintptr-typed arithmetic expression looking +// for conversions from an unsafe.Pointer. +func (e *Escape) unsafeValue(k EscHole, n *Node) { + if n.Type.Etype != TUINTPTR { + Fatalf("unexpected type %v for %v", n.Type, n) + } + + e.stmts(n.Ninit) + + switch n.Op { + case OCONV, OCONVNOP: + if n.Left.Type.Etype == TUNSAFEPTR { + e.expr(k, n.Left) + } else { + e.discard(n.Left) + } + case ODOTPTR: + if isReflectHeaderDataField(n) { + e.expr(k.deref(n, "reflect.Header.Data"), n.Left) + } else { + e.discard(n.Left) + } + case OPLUS, ONEG, OBITNOT: + e.unsafeValue(k, n.Left) + case OADD, OSUB, OOR, OXOR, OMUL, ODIV, OMOD, OLSH, ORSH, OAND, OANDNOT: + e.unsafeValue(k, n.Left) + e.unsafeValue(k, n.Right) + default: + e.exprSkipInit(e.discardHole(), n) + } +} + +// discard evaluates an expression n for side-effects, but discards +// its value. +func (e *Escape) discard(n *Node) { + e.expr(e.discardHole(), n) +} + +func (e *Escape) discards(l Nodes) { + for _, n := range l.Slice() { + e.discard(n) + } +} + +// addr evaluates an addressable expression n and returns an EscHole +// that represents storing into the represented location. +func (e *Escape) addr(n *Node) EscHole { + if n == nil || n.isBlank() { + // Can happen at least in OSELRECV. + // TODO(mdempsky): Anywhere else? + return e.discardHole() + } + + k := e.heapHole() + + switch n.Op { + default: + Fatalf("unexpected addr: %v", n) + case ONAME: + if n.Class() == PEXTERN { + break + } + k = e.oldLoc(n).asHole() + case ODOT: + k = e.addr(n.Left) + case OINDEX: + e.discard(n.Right) + if n.Left.Type.IsArray() { + k = e.addr(n.Left) + } else { + e.discard(n.Left) + } + case ODEREF, ODOTPTR: + e.discard(n) + case OINDEXMAP: + e.discard(n.Left) + e.assignHeap(n.Right, "key of map put", n) + } + + if !types.Haspointers(n.Type) { + k = e.discardHole() + } + + return k +} + +func (e *Escape) addrs(l Nodes) []EscHole { + var ks []EscHole + for _, n := range l.Slice() { + ks = append(ks, e.addr(n)) + } + return ks +} + +// assign evaluates the assignment dst = src. +func (e *Escape) assign(dst, src *Node, why string, where *Node) { + // Filter out some no-op assignments for escape analysis. + ignore := dst != nil && src != nil && isSelfAssign(dst, src) + if ignore && Debug['m'] != 0 { + Warnl(where.Pos, "%v ignoring self-assignment in %S", funcSym(e.curfn), where) + } + + k := e.addr(dst) + if dst != nil && dst.Op == ODOTPTR && isReflectHeaderDataField(dst) { + e.unsafeValue(e.heapHole(), src) + } else { + if ignore { + k = e.discardHole() + } + e.expr(k, src) + } +} + +func (e *Escape) assignHeap(src *Node, why string, where *Node) { + e.expr(e.heapHole().note(where, why), src) +} + +// call evaluates a call expressions, including builtin calls. ks +// should contain the holes representing where the function callee's +// results flows; where is the OGO/ODEFER context of the call, if any. +func (e *Escape) call(ks []EscHole, call, where *Node) { + // First, pick out the function callee, its type, and receiver + // (if any) and normal arguments list. + var fn, recv *Node + var fntype *types.Type + args := call.List.Slice() + switch call.Op { + case OCALLFUNC: + fn = call.Left + if fn.Op == OCLOSURE { + fn = fn.Func.Closure.Func.Nname + } + fntype = fn.Type + case OCALLMETH: + fn = asNode(call.Left.Type.FuncType().Nname) + fntype = fn.Type + recv = call.Left.Left + case OCALLINTER: + fntype = call.Left.Type + recv = call.Left.Left + case OAPPEND, ODELETE, OPRINT, OPRINTN, ORECOVER: + // ok + case OLEN, OCAP, OREAL, OIMAG, OCLOSE, OPANIC: + args = []*Node{call.Left} + case OCOMPLEX, OCOPY: + args = []*Node{call.Left, call.Right} + default: + Fatalf("unexpected call op: %v", call.Op) + } + + static := fn != nil && fn.Op == ONAME && fn.Class() == PFUNC + + // Setup evaluation holes for each receiver/argument. + var recvK EscHole + var paramKs []EscHole + + if where != nil && !(where.Op == ODEFER && e.loopDepth == 1) { + if recv != nil { + recvK = e.heapHole() + } + for range args { + paramKs = append(paramKs, e.heapHole()) + } + } else if static && fn.Name.Defn != nil && fn.Name.Defn.Esc < EscFuncTagged { + // Static call to function in same mutually recursive + // group; incorporate into data flow graph. + + if fn.Name.Defn.Esc == EscFuncUnknown { + Fatalf("graph inconsistency") + } + + if ks != nil { + for i, result := range fntype.Results().FieldSlice() { + e.expr(ks[i], asNode(result.Nname)) + } + } + + if r := fntype.Recv(); r != nil { + recvK = e.addr(asNode(r.Nname)) + } + for _, param := range fntype.Params().FieldSlice() { + paramKs = append(paramKs, e.addr(asNode(param.Nname))) + } + } else if call.Op == OCALLFUNC || call.Op == OCALLMETH || call.Op == OCALLINTER { + // Dynamic call, or call to previously tagged + // function. Setup flows to heap and/or ks according + // to parameter tags. + if r := fntype.Recv(); r != nil { + recvK = e.tagHole(ks, r, static, where) + } + for _, param := range fntype.Params().FieldSlice() { + paramKs = append(paramKs, e.tagHole(ks, param, static, where)) + } + } else { + // Handle escape analysis for builtins. + + // By default, we just discard everything. However, if + // we're in a top-level defer statement, we can't + // allow transient values. + k := e.discardHole() + if where != nil { + k = e.newLoc(where, false).asHole() + } + for range args { + paramKs = append(paramKs, k) + } + + switch call.Op { + case OAPPEND: + // Appendee slice may flow directly to the + // result, if it has enough + // capacity. Alternatively, a new heap slice + // might be allocated, and all slice elements + // might flow to heap. + paramKs[0] = e.teeHole(paramKs[0], ks[0]) + if types.Haspointers(args[0].Type.Elem()) { + paramKs[0] = e.teeHole(paramKs[0], e.heapHole().deref(call, "appendee slice")) + } + + if call.IsDDD() { + if args[1].Type.IsSlice() && types.Haspointers(args[1].Type.Elem()) { + paramKs[1] = e.teeHole(paramKs[1], e.heapHole().deref(call, "appended slice...")) + } + } else { + for i := 1; i < len(args); i++ { + paramKs[i] = e.heapHole() + } + } + + case OCOPY: + if call.Right.Type.IsSlice() && types.Haspointers(call.Right.Type.Elem()) { + paramKs[1] = e.teeHole(paramKs[1], e.heapHole().deref(call, "copied slice")) + } + + case OPANIC: + paramKs[0] = e.heapHole() + } + } + + // TODO(mdempsky): Remove after early ddd-ification. + if fntype != nil && fntype.IsVariadic() && !call.IsDDD() { + vi := fntype.NumParams() - 1 + + elt := fntype.Params().Field(vi).Type.Elem() + nva := call.List.Len() + nva -= vi + + // Introduce ODDDARG node to represent ... allocation. + ddd := nodl(call.Pos, ODDDARG, nil, nil) + ddd.Type = types.NewPtr(types.NewArray(elt, int64(nva))) + call.Right = ddd + + dddK := e.spill(paramKs[vi], ddd) + paramKs = paramKs[:vi] + for i := 0; i < nva; i++ { + paramKs = append(paramKs, dddK) + } + } + + if call.Op == OCALLFUNC { + // Evaluate callee function expression. + k := e.discardHole() + if where != nil { + if where.Op == ODEFER && e.loopDepth == 1 { + k = e.newLoc(nil, false).asHole() + } else { + k = e.heapHole() + } + } + e.expr(k, call.Left) + } + + if recv != nil { + // TODO(mdempsky): Handle go:uintptrescapes here too? + e.expr(recvK, recv) + } + + for i, arg := range args { + // For arguments to go:uintptrescapes, peel + // away an unsafe.Pointer->uintptr conversion, + // if present. + if static && arg.Op == OCONVNOP && arg.Type.Etype == TUINTPTR && arg.Left.Type.Etype == TUNSAFEPTR { + x := i + if fntype.IsVariadic() && x >= fntype.NumParams() { + x = fntype.NumParams() - 1 + } + if fntype.Params().Field(x).Note == uintptrEscapesTag { + arg = arg.Left + } + } + + e.expr(paramKs[i], arg) + } +} + +// tagHole returns a hole for evaluating an argument passed to param. +// ks should contain the holes representing where the function +// callee's results flows; static indicates whether this is a static +// call; where is the OGO/ODEFER context of the call, if any. +func (e *Escape) tagHole(ks []EscHole, param *types.Field, static bool, where *Node) EscHole { + // If this is a dynamic call, we can't rely on param.Note. + if !static { + return e.heapHole() + } + + esc := parsetag(param.Note) + switch esc { + case EscHeap, EscUnknown: + return e.heapHole() + } + + var tagKs []EscHole + if where != nil { + tagKs = append(tagKs, e.newLoc(nil, false).asHole()) + } + + if esc&EscContentEscapes != 0 { + tagKs = append(tagKs, e.heapHole().shift(1)) + } + + if ks != nil { + for i := 0; i < numEscReturns; i++ { + if x := getEscReturn(esc, i); x >= 0 { + tagKs = append(tagKs, ks[i].shift(x)) + } + } + } + + return e.teeHole(tagKs...) +} + +// An EscHole represents a context for evaluation a Go +// expression. E.g., when evaluating p in "x = **p", we'd have a hole +// with dst==x and derefs==2. +type EscHole struct { + dst *EscLocation + derefs int // >= -1 +} + +func (k EscHole) note(where *Node, why string) EscHole { + // TODO(mdempsky): Keep a record of where/why for diagnostics. + return k +} + +func (k EscHole) shift(delta int) EscHole { + k.derefs += delta + if k.derefs < -1 { + Fatalf("derefs underflow: %v", k.derefs) + } + return k +} + +func (k EscHole) deref(where *Node, why string) EscHole { return k.shift(1).note(where, why) } +func (k EscHole) addr(where *Node, why string) EscHole { return k.shift(-1).note(where, why) } + +func (k EscHole) dotType(t *types.Type, where *Node, why string) EscHole { + if !t.IsInterface() && !isdirectiface(t) { + k = k.shift(1) + } + return k.note(where, why) +} + +// teeHole returns a new hole that flows into each hole of ks, +// similar to the Unix tee(1) command. +func (e *Escape) teeHole(ks ...EscHole) EscHole { + if len(ks) == 0 { + return e.discardHole() + } + if len(ks) == 1 { + return ks[0] + } + // TODO(mdempsky): Optimize if there's only one non-discard hole? + + // Given holes "l1 = _", "l2 = **_", "l3 = *_", ..., create a + // new temporary location ltmp, wire it into place, and return + // a hole for "ltmp = _". + loc := e.newLoc(nil, true) + for _, k := range ks { + // N.B., "p = &q" and "p = &tmp; tmp = q" are not + // semantically equivalent. To combine holes like "l1 + // = _" and "l2 = &_", we'd need to wire them as "l1 = + // *ltmp" and "l2 = ltmp" and return "ltmp = &_" + // instead. + if k.derefs < 0 { + Fatalf("teeHole: negative derefs") + } + + e.flow(k, loc) + } + return loc.asHole() +} + +func (e *Escape) dcl(n *Node) EscHole { + loc := e.oldLoc(n) + loc.loopDepth = e.loopDepth + return loc.asHole() +} + +func (e *Escape) spill(k EscHole, n *Node) EscHole { + // TODO(mdempsky): Optimize. E.g., if k is the heap or blank, + // then we already know whether n leaks, and we can return a + // more optimized hole. + loc := e.newLoc(n, true) + e.flow(k.addr(n, "spill"), loc) + return loc.asHole() +} + +// canonicalNode returns the canonical *Node that n logically +// represents. +func canonicalNode(n *Node) *Node { + if n != nil && n.IsClosureVar() { + n = n.Name.Defn + if n.IsClosureVar() { + Fatalf("still closure var") + } + } + + return n +} + +func (e *Escape) newLoc(n *Node, transient bool) *EscLocation { + if e.curfn == nil { + Fatalf("e.curfn isn't set") + } + + n = canonicalNode(n) + loc := &EscLocation{ + n: n, + curfn: e.curfn, + loopDepth: e.loopDepth, + transient: transient, + } + e.allLocs = append(e.allLocs, loc) + if n != nil { + if n.Op == ONAME && n.Name.Curfn != e.curfn { + Fatalf("curfn mismatch: %v != %v", n.Name.Curfn, e.curfn) + } + + if n.HasOpt() { + Fatalf("%v already has a location", n) + } + n.SetOpt(loc) + + // TODO(mdempsky): Perhaps set n.Esc and then just return &HeapLoc? + if mustHeapAlloc(n) && !loc.isName(PPARAM) && !loc.isName(PPARAMOUT) { + e.flow(e.heapHole().addr(nil, ""), loc) + } + } + return loc +} + +func (e *Escape) oldLoc(n *Node) *EscLocation { + n = canonicalNode(n) + return n.Opt().(*EscLocation) +} + +func (l *EscLocation) asHole() EscHole { + return EscHole{dst: l} +} + +func (e *Escape) flow(k EscHole, src *EscLocation) { + dst := k.dst + if dst == &e.blankLoc { + return + } + if dst == src && k.derefs >= 0 { + return + } + // TODO(mdempsky): More optimizations? + + // TODO(mdempsky): Deduplicate edges? + dst.edges = append(dst.edges, EscEdge{src: src, derefs: k.derefs}) +} + +func (e *Escape) heapHole() EscHole { return e.heapLoc.asHole() } +func (e *Escape) discardHole() EscHole { return e.blankLoc.asHole() } + +// walkAll computes the minimal dereferences between all pairs of +// locations. +func (e *Escape) walkAll() { + var walkgen uint32 + + for _, loc := range e.allLocs { + walkgen++ + e.walkOne(loc, walkgen) + } + + // Walk the heap last so that we catch any edges to the heap + // added during walkOne. + walkgen++ + e.walkOne(&e.heapLoc, walkgen) +} + +// walkOne computes the minimal number of dereferences from root to +// all other locations. +func (e *Escape) walkOne(root *EscLocation, walkgen uint32) { + // The data flow graph has negative edges (from addressing + // operations), so we use the Bellman-Ford algorithm. However, + // we don't have to worry about infinite negative cycles since + // we bound intermediate dereference counts to 0. + root.walkgen = walkgen + root.derefs = 0 + + todo := []*EscLocation{root} + for len(todo) > 0 { + l := todo[len(todo)-1] + todo = todo[:len(todo)-1] + + base := l.derefs + + // If l.derefs < 0, then l's address flows to root. + addressOf := base < 0 + if addressOf { + // For a flow path like "root = &l; l = x", + // l's address flows to root, but x's does + // not. We recognize this by lower bounding + // base at 0. + base = 0 + + // If l's address flows to a non-transient + // location, then l can't be transiently + // allocated. + if !root.transient { + l.transient = false + // TODO(mdempsky): Should we re-walk from l now? + } + } + + if e.outlives(root, l) { + // If l's address flows somewhere that + // outlives it, then l needs to be heap + // allocated. + if addressOf && !l.escapes { + l.escapes = true + + // If l is heap allocated, then any + // values stored into it flow to the + // heap too. + // TODO(mdempsky): Better way to handle this? + if root != &e.heapLoc { + e.flow(e.heapHole(), l) + } + } + + // l's value flows to root. If l is a function + // parameter and root is the heap or a + // corresponding result parameter, then record + // that value flow for tagging the function + // later. + if l.isName(PPARAM) { + l.leakTo(root, base) + } + } + + for _, edge := range l.edges { + derefs := base + edge.derefs + if edge.src.walkgen != walkgen || edge.src.derefs > derefs { + edge.src.walkgen = walkgen + edge.src.derefs = derefs + todo = append(todo, edge.src) + } + } + } +} + +// outlives reports whether values stored in l may survive beyond +// other's lifetime if stack allocated. +func (e *Escape) outlives(l, other *EscLocation) bool { + // The heap outlives everything. + if l == &e.heapLoc { + return true + } + + // We don't know what callers do with returned values, so + // pessimistically we need to assume they flow to the heap and + // outlive everything too. + if l.isName(PPARAMOUT) { + // Exception: Directly called closures can return + // locations allocated outside of them without forcing + // them to the heap. For example: + // + // var u int // okay to stack allocate + // *(func() *int { return &u }()) = 42 + if containsClosure(other.curfn, l.curfn) && l.curfn.Func.Closure.Func.Top&ctxCallee != 0 { + return false + } + + return true + } + + // If l and other are within the same function, then l + // outlives other if it was declared outside other's loop + // scope. For example: + // + // var l *int + // for { + // l = new(int) + // } + if l.curfn == other.curfn && l.loopDepth < other.loopDepth { + return true + } + + // If other is declared within a child closure of where l is + // declared, then l outlives it. For example: + // + // var l *int + // func() { + // l = new(int) + // } + if containsClosure(l.curfn, other.curfn) { + return true + } + + return false +} + +// containsClosure reports whether c is a closure contained within f. +func containsClosure(f, c *Node) bool { + if f.Op != ODCLFUNC || c.Op != ODCLFUNC { + Fatalf("bad containsClosure: %v, %v", f, c) + } + + // Common case. + if f == c { + return false + } + + // Closures within function Foo are named like "Foo.funcN..." + // TODO(mdempsky): Better way to recognize this. + fn := f.Func.Nname.Sym.Name + cn := c.Func.Nname.Sym.Name + return len(cn) > len(fn) && cn[:len(fn)] == fn && cn[len(fn)] == '.' +} + +// leak records that parameter l leaks to sink. +func (l *EscLocation) leakTo(sink *EscLocation, derefs int) { + // Short circuit if l already leaks to heap. + if l.paramEsc == EscHeap { + return + } + + // If sink is a result parameter and we can fit return bits + // into the escape analysis tag, then record a return leak. + if sink.isName(PPARAMOUT) && sink.curfn == l.curfn { + // TODO(mdempsky): Eliminate dependency on Vargen here. + ri := int(sink.n.Name.Vargen) - 1 + if ri < numEscReturns { + // Leak to result parameter. + if old := getEscReturn(l.paramEsc, ri); old < 0 || derefs < old { + l.paramEsc = setEscReturn(l.paramEsc, ri, derefs) + } + return + } + } + + // Otherwise, record as heap leak. + if derefs > 0 { + l.paramEsc |= EscContentEscapes + } else { + l.paramEsc = EscHeap + } +} + +func (e *Escape) finish() { + for _, loc := range e.allLocs { + n := loc.n + if n == nil { + continue + } + n.SetOpt(nil) + + // Update n.Esc based on escape analysis results. + // + // TODO(mdempsky): Simplify once compatibility with + // esc.go is no longer necessary. + // + // TODO(mdempsky): Describe path when Debug['m'] >= 2. + + if loc.escapes { + if Debug['m'] != 0 && n.Op != ONAME { + Warnl(n.Pos, "%S escapes to heap", n) + } + n.Esc = EscHeap + addrescapes(n) + } else if loc.isName(PPARAM) { + n.Esc = finalizeEsc(loc.paramEsc) + + if Debug['m'] != 0 && types.Haspointers(n.Type) { + if n.Esc == EscNone { + Warnl(n.Pos, "%S %S does not escape", funcSym(loc.curfn), n) + } else if n.Esc == EscHeap { + Warnl(n.Pos, "leaking param: %S", n) + } else { + if n.Esc&EscContentEscapes != 0 { + Warnl(n.Pos, "leaking param content: %S", n) + } + for i := 0; i < numEscReturns; i++ { + if x := getEscReturn(n.Esc, i); x >= 0 { + res := n.Name.Curfn.Type.Results().Field(i).Sym + Warnl(n.Pos, "leaking param: %S to result %v level=%d", n, res, x) + } + } + } + } + } else { + n.Esc = EscNone + if loc.transient { + switch n.Op { + case OCALLPART, OCLOSURE, ODDDARG, OARRAYLIT, OSLICELIT, OPTRLIT, OSTRUCTLIT: + n.SetNoescape(true) + } + } + + if Debug['m'] != 0 && n.Op != ONAME && n.Op != OTYPESW && n.Op != ORANGE && n.Op != ODEFER { + Warnl(n.Pos, "%S %S does not escape", funcSym(loc.curfn), n) + } + } + } +} + +func (l *EscLocation) isName(c Class) bool { + return l.n != nil && l.n.Op == ONAME && l.n.Class() == c +} + +func finalizeEsc(esc uint16) uint16 { + esc = optimizeReturns(esc) + + if esc>>EscReturnBits != 0 { + esc |= EscReturn + } else if esc&EscMask == 0 { + esc |= EscNone + } + + return esc +} + +func optimizeReturns(esc uint16) uint16 { + if esc&EscContentEscapes != 0 { + // EscContentEscapes represents a path of length 1 + // from the heap. No point in keeping paths of equal + // or longer length to result parameters. + for i := 0; i < numEscReturns; i++ { + if x := getEscReturn(esc, i); x >= 1 { + esc = setEscReturn(esc, i, -1) + } + } + } + return esc +} + +// Parameter tags. +// +// The escape bits saved for each analyzed parameter record the +// minimal derefs (if any) from that parameter to the heap, or to any +// of its function's (first numEscReturns) result parameters. +// +// Paths to the heap are encoded via EscHeap (length 0) or +// EscContentEscapes (length 1); if neither of these are set, then +// there's no path to the heap. +// +// Paths to the result parameters are encoded in the upper +// bits. +// +// There are other values stored in the escape bits by esc.go for +// vestigial reasons, and other special tag values used (e.g., +// uintptrEscapesTag and unsafeUintptrTag). These could be simplified +// once compatibility with esc.go is no longer a concern. + +const numEscReturns = (16 - EscReturnBits) / bitsPerOutputInTag + +func getEscReturn(esc uint16, i int) int { + return int((esc>>escReturnShift(i))&bitsMaskForTag) - 1 +} + +func setEscReturn(esc uint16, i, v int) uint16 { + if v < -1 { + Fatalf("invalid esc return value: %v", v) + } + if v > maxEncodedLevel { + v = maxEncodedLevel + } + + shift := escReturnShift(i) + esc &^= bitsMaskForTag << shift + esc |= uint16(v+1) << shift + return esc +} + +func escReturnShift(i int) uint { + if uint(i) >= numEscReturns { + Fatalf("esc return index out of bounds: %v", i) + } + return uint(EscReturnBits + i*bitsPerOutputInTag) +} diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 20bc4acc6a..69652834a1 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -253,6 +253,7 @@ func Main(archInit func(*Arch)) { flag.StringVar(&blockprofile, "blockprofile", "", "write block profile to `file`") flag.StringVar(&mutexprofile, "mutexprofile", "", "write mutex profile to `file`") flag.StringVar(&benchfile, "bench", "", "append benchmark times to `file`") + flag.BoolVar(&newescape, "newescape", false, "enable new escape analysis") objabi.Flagparse(usage) // Record flags that affect the build result. (And don't -- GitLab From f8c6f986fd459945ec76930d88bd45d45b359c77 Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Wed, 3 Apr 2019 17:12:27 -0700 Subject: [PATCH 0796/1679] math/big: don't clobber shared underlying array in pow5 computation Rearranged code slightly to make lifetime of underlying array of pow5 more explicit in code. Fixes #31184. Change-Id: I063081f0e54097c499988d268a23813746592654 Reviewed-on: https://go-review.googlesource.com/c/go/+/170641 Reviewed-by: Filippo Valsorda --- src/math/big/ratconv.go | 31 +++++++++++++------------------ src/math/big/ratconv_test.go | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/math/big/ratconv.go b/src/math/big/ratconv.go index 3ea03d5c61..f29ec98cdc 100644 --- a/src/math/big/ratconv.go +++ b/src/math/big/ratconv.go @@ -162,36 +162,31 @@ func (z *Rat) SetString(s string) (*Rat, bool) { } // exp consumed - not needed anymore - // compute pow5 if needed - pow5 := z.b.abs + // apply exp5 contributions + // (start with exp5 so the numbers to multiply are smaller) if exp5 != 0 { n := exp5 if n < 0 { n = -n } - pow5 = pow5.expNN(natFive, nat(nil).setWord(Word(n)), nil) + pow5 := z.b.abs.expNN(natFive, nat(nil).setWord(Word(n)), nil) // use underlying array of z.b.abs + if exp5 > 0 { + z.a.abs = z.a.abs.mul(z.a.abs, pow5) + z.b.abs = z.b.abs.setWord(1) + } else { + z.b.abs = pow5 + } + } else { + z.b.abs = z.b.abs.setWord(1) } - // apply dividend contributions of exponents - // (start with exp5 so the numbers to multiply are smaller) - if exp5 > 0 { - z.a.abs = z.a.abs.mul(z.a.abs, pow5) - exp5 = 0 - } + // apply exp2 contributions if exp2 > 0 { if int64(uint(exp2)) != exp2 { panic("exponent too large") } z.a.abs = z.a.abs.shl(z.a.abs, uint(exp2)) - exp2 = 0 - } - - // apply divisor contributions of exponents - z.b.abs = z.b.abs.setWord(1) - if exp5 < 0 { - z.b.abs = pow5 - } - if exp2 < 0 { + } else if exp2 < 0 { if int64(uint(-exp2)) != -exp2 { panic("exponent too large") } diff --git a/src/math/big/ratconv_test.go b/src/math/big/ratconv_test.go index 87ee9fa972..ba0d1ba9e1 100644 --- a/src/math/big/ratconv_test.go +++ b/src/math/big/ratconv_test.go @@ -574,3 +574,18 @@ func TestFloat64SpecialCases(t *testing.T) { } } } + +func TestIssue31184(t *testing.T) { + var x Rat + for _, want := range []string{ + "-213.090", + "8.192", + "16.000", + } { + x.SetString(want) + got := x.FloatString(3) + if got != want { + t.Errorf("got %s, want %s", got, want) + } + } +} -- GitLab From 827044e7a629128d967e79e6b92fc17f3bc4870b Mon Sep 17 00:00:00 2001 From: Udalov Max Date: Sat, 13 Apr 2019 18:54:03 +0300 Subject: [PATCH 0797/1679] crypto/sha512: use math/bits.RotateLeft64 instead of ad-hoc implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes code more readable and idiomatic and slightly increase performance. Updates #31456 Benchstat: name old time/op new time/op delta Hash8Bytes-8 281ns ± 4% 280ns ± 3% ~ (p=0.640 n=10+10) Hash1K-8 2.01µs ± 6% 2.02µs ± 3% ~ (p=0.481 n=10+10) Hash8K-8 14.2µs ± 6% 13.5µs ± 1% -4.90% (p=0.001 n=10+10) name old speed new speed delta Hash8Bytes-8 28.5MB/s ± 4% 28.5MB/s ± 3% ~ (p=0.516 n=10+10) Hash1K-8 510MB/s ± 6% 507MB/s ± 4% ~ (p=0.481 n=10+10) Hash8K-8 576MB/s ± 6% 605MB/s ± 1% +5.02% (p=0.001 n=10+10) Tested on macbook pro 2018 Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz Change-Id: I1f5b78096dd49d14ffcb9129142c4a4e05b81ff9 Reviewed-on: https://go-review.googlesource.com/c/go/+/171736 Reviewed-by: Filippo Valsorda --- src/crypto/sha512/sha512block.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/crypto/sha512/sha512block.go b/src/crypto/sha512/sha512block.go index 42e8d19fe8..81569c5f84 100644 --- a/src/crypto/sha512/sha512block.go +++ b/src/crypto/sha512/sha512block.go @@ -8,6 +8,8 @@ package sha512 +import "math/bits" + var _K = []uint64{ 0x428a2f98d728ae22, 0x7137449123ef65cd, @@ -102,9 +104,9 @@ func blockGeneric(dig *digest, p []byte) { } for i := 16; i < 80; i++ { v1 := w[i-2] - t1 := (v1>>19 | v1<<(64-19)) ^ (v1>>61 | v1<<(64-61)) ^ (v1 >> 6) + t1 := bits.RotateLeft64(v1, -19) ^ bits.RotateLeft64(v1, -61) ^ (v1 >> 6) v2 := w[i-15] - t2 := (v2>>1 | v2<<(64-1)) ^ (v2>>8 | v2<<(64-8)) ^ (v2 >> 7) + t2 := bits.RotateLeft64(v2, -1) ^ bits.RotateLeft64(v2, -8) ^ (v2 >> 7) w[i] = t1 + w[i-7] + t2 + w[i-16] } @@ -112,9 +114,9 @@ func blockGeneric(dig *digest, p []byte) { a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7 for i := 0; i < 80; i++ { - t1 := h + ((e>>14 | e<<(64-14)) ^ (e>>18 | e<<(64-18)) ^ (e>>41 | e<<(64-41))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] + t1 := h + (bits.RotateLeft64(e, -14) ^ bits.RotateLeft64(e, -18) ^ bits.RotateLeft64(e, -41)) + ((e & f) ^ (^e & g)) + _K[i] + w[i] - t2 := ((a>>28 | a<<(64-28)) ^ (a>>34 | a<<(64-34)) ^ (a>>39 | a<<(64-39))) + ((a & b) ^ (a & c) ^ (b & c)) + t2 := (bits.RotateLeft64(a, -28) ^ bits.RotateLeft64(a, -34) ^ bits.RotateLeft64(a, -39)) + ((a & b) ^ (a & c) ^ (b & c)) h = g g = f -- GitLab From 3ebd9523bb0dcb975a34ec402f23eee07e81562f Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 15 Apr 2019 10:36:17 -0700 Subject: [PATCH 0798/1679] os: don't treat RemoveAll("/x") as RemoveAll("x") Fixes #31468 Change-Id: I5c4e61631b8af35bfc14b0cb9bc77feec100e340 Reviewed-on: https://go-review.googlesource.com/c/go/+/172058 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/os/export_unix_test.go | 9 +++++++++ src/os/os_unix_test.go | 25 +++++++++++++++++++++++++ src/os/path_unix.go | 18 ++++++++++++++---- 3 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 src/os/export_unix_test.go diff --git a/src/os/export_unix_test.go b/src/os/export_unix_test.go new file mode 100644 index 0000000000..032b1a9dbf --- /dev/null +++ b/src/os/export_unix_test.go @@ -0,0 +1,9 @@ +// Copyright 2019 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. + +// +build aix darwin dragonfly freebsd js,wasm linux nacl netbsd openbsd solaris + +package os + +var SplitPath = splitPath diff --git a/src/os/os_unix_test.go b/src/os/os_unix_test.go index 87c3bcd8fa..fa4c594136 100644 --- a/src/os/os_unix_test.go +++ b/src/os/os_unix_test.go @@ -288,3 +288,28 @@ func TestNewFileNonBlock(t *testing.T) { t.Parallel() newFileTest(t, false) } + +func TestSplitPath(t *testing.T) { + t.Parallel() + for _, tt := range []struct{ path, wantDir, wantBase string }{ + {"a", ".", "a"}, + {"a/", ".", "a"}, + {"a//", ".", "a"}, + {"a/b", "a", "b"}, + {"a/b/", "a", "b"}, + {"a/b/c", "a/b", "c"}, + {"/a", "/", "a"}, + {"/a/", "/", "a"}, + {"/a/b", "/a", "b"}, + {"/a/b/", "/a", "b"}, + {"/a/b/c", "/a/b", "c"}, + {"//a", "/", "a"}, + {"//a/", "/", "a"}, + {"///a", "/", "a"}, + {"///a/", "/", "a"}, + } { + if dir, base := SplitPath(tt.path); dir != tt.wantDir || base != tt.wantBase { + t.Errorf("splitPath(%q) = %q, %q, want %q, %q", tt.path, dir, base, tt.wantDir, tt.wantBase) + } + } +} diff --git a/src/os/path_unix.go b/src/os/path_unix.go index a08ddaf6db..df423d2c9d 100644 --- a/src/os/path_unix.go +++ b/src/os/path_unix.go @@ -38,20 +38,30 @@ func basename(name string) string { func splitPath(path string) (string, string) { // if no better parent is found, the path is relative from "here" dirname := "." - // if no slashes in path, base is path - basename := path + + // Remove all but one leading slash. + for len(path) > 1 && path[0] == '/' && path[1] == '/' { + path = path[1:] + } i := len(path) - 1 - // Remove trailing slashes + // Remove trailing slashes. for ; i > 0 && path[i] == '/'; i-- { path = path[:i] } + // if no slashes in path, base is path + basename := path + // Remove leading directory path for i--; i >= 0; i-- { if path[i] == '/' { - dirname = path[:i] + if i == 0 { + dirname = path[:1] + } else { + dirname = path[:i] + } basename = path[i+1:] break } -- GitLab From d3a23874affca830033dee2a7a5a816bedebf55a Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 15 Apr 2019 09:25:23 -0700 Subject: [PATCH 0799/1679] cmd/link: clean up pclntab More minor cleanup: * Code simplification * Move variable declaration closer to use * Add docs * Refactor loop Change-Id: I6f662cb65038b6ad927eb83757b241ac1ef58943 Reviewed-on: https://go-review.googlesource.com/c/go/+/172078 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/pcln.go | 35 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 9f253f0205..96b2028d10 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -201,7 +201,6 @@ func (ctxt *Link) pclntab() { // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] // end PC [thearch.ptrsize bytes] // offset to file table [4 bytes] - nfunc := int32(0) // Find container symbols and mark them as such. for _, s := range ctxt.Textp { @@ -210,9 +209,15 @@ func (ctxt *Link) pclntab() { } } + // Gather some basic stats and info. + var nfunc int32 for _, s := range ctxt.Textp { - if emitPcln(ctxt, s) { - nfunc++ + if !emitPcln(ctxt, s) { + continue + } + nfunc++ + if pclntabFirstFunc == nil { + pclntabFirstFunc = s } } @@ -234,10 +239,8 @@ func (ctxt *Link) pclntab() { return nameoff } - nfunc = 0 - var last *sym.Symbol + nfunc = 0 // repurpose nfunc as a running index for _, s := range ctxt.Textp { - last = s if !emitPcln(ctxt, s) { continue } @@ -246,10 +249,6 @@ func (ctxt *Link) pclntab() { pcln = &pclntabZpcln } - if pclntabFirstFunc == nil { - pclntabFirstFunc = s - } - if len(pcln.InlTree) > 0 { if len(pcln.Pcdata) <= objabi.PCDATA_InlTreeIndex { // Create inlining pcdata table. @@ -270,7 +269,7 @@ func (ctxt *Link) pclntab() { } funcstart := int32(len(ftab.P)) - funcstart += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) + funcstart += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) // align to ptrsize ftab.SetAddr(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), s) ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint64(funcstart)) @@ -402,16 +401,15 @@ func (ctxt *Link) pclntab() { off += 4 } for i := range pcln.Funcdata { + dataoff := int64(off) + int64(ctxt.Arch.PtrSize)*int64(i) if pcln.Funcdata[i] == nil { - ftab.SetUint(ctxt.Arch, int64(off)+int64(ctxt.Arch.PtrSize)*int64(i), uint64(pcln.Funcdataoff[i])) - } else { - // TODO: Dedup. - funcdataBytes += pcln.Funcdata[i].Size - - ftab.SetAddrPlus(ctxt.Arch, int64(off)+int64(ctxt.Arch.PtrSize)*int64(i), pcln.Funcdata[i], pcln.Funcdataoff[i]) + ftab.SetUint(ctxt.Arch, dataoff, uint64(pcln.Funcdataoff[i])) + continue } + // TODO: Dedup. + funcdataBytes += pcln.Funcdata[i].Size + ftab.SetAddrPlus(ctxt.Arch, dataoff, pcln.Funcdata[i], pcln.Funcdataoff[i]) } - off += int32(len(pcln.Funcdata)) * int32(ctxt.Arch.PtrSize) } @@ -423,6 +421,7 @@ func (ctxt *Link) pclntab() { nfunc++ } + last := ctxt.Textp[len(ctxt.Textp)-1] pclntabLastFunc = last // Final entry of table is just end pc. ftab.SetAddrPlus(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, last.Size) -- GitLab From d79aea6b9622650b01df64c7930567ad0267a3fc Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 15 Apr 2019 09:39:29 -0700 Subject: [PATCH 0800/1679] cmd/link: deduplicate pctab info in pclntab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing pclntab construction took care to re-use strings: filenames and fully qualified function names. It did not try to deduplicate pctab information, perhaps because the author assumed that there wouldn't be much duplication. This change introduces that deduplication. The cache gets a 33% hit rate during make.bash. This doesn't require any changes to the file format, and shrinks binaries by about 1%. Updates #6853 file before after Δ % go 14659236 14515876 -143360 -0.978% addr2line 4272424 4223272 -49152 -1.150% api 6050808 5993464 -57344 -0.948% asm 4906416 4869552 -36864 -0.751% buildid 2861104 2824240 -36864 -1.288% cgo 4859784 4810632 -49152 -1.011% compile 25749656 25213080 -536576 -2.084% cover 5286952 5229608 -57344 -1.085% dist 3634192 3597328 -36864 -1.014% doc 4691080 4641928 -49152 -1.048% fix 3397960 3361096 -36864 -1.085% link 6113568 6064432 -49136 -0.804% nm 4221928 4172776 -49152 -1.164% objdump 4636600 4587448 -49152 -1.060% pack 2281184 2256608 -24576 -1.077% pprof 14641204 14485556 -155648 -1.063% test2json 2814536 2785864 -28672 -1.019% trace 11602204 11487516 -114688 -0.989% vet 8399528 8313512 -86016 -1.024% Change-Id: I59c6aae522700a0d36ddd2cbca6e22ecdf17eea2 Reviewed-on: https://go-review.googlesource.com/c/go/+/172079 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/pcln.go | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 96b2028d10..6c0a9e9ebc 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -82,15 +82,6 @@ func (it *PCIter) init(p []byte) { it.next() } -func addpctab(ctxt *Link, ftab *sym.Symbol, off int32, d *sym.Pcdata) int32 { - var start int32 - if len(d.P) > 0 { - start = int32(len(ftab.P)) - ftab.AddBytes(d.P) - } - return int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(start))) -} - func ftabaddstring(ftab *sym.Symbol, s string) int32 { start := len(ftab.P) ftab.Grow(int64(start + len(s) + 1)) // make room for s plus trailing NUL @@ -239,6 +230,20 @@ func (ctxt *Link) pclntab() { return nameoff } + pctaboff := make(map[string]uint32) + writepctab := func(off int32, p []byte) int32 { + start, ok := pctaboff[string(p)] + if !ok { + if len(p) > 0 { + start = uint32(len(ftab.P)) + ftab.AddBytes(p) + } + pctaboff[string(p)] = start + } + newoff := int32(ftab.SetUint32(ctxt.Arch, int64(off), start)) + return newoff + } + nfunc = 0 // repurpose nfunc as a running index for _, s := range ctxt.Textp { if !emitPcln(ctxt, s) { @@ -370,10 +375,9 @@ func (ctxt *Link) pclntab() { } // pcdata - off = addpctab(ctxt, ftab, off, &pcln.Pcsp) - - off = addpctab(ctxt, ftab, off, &pcln.Pcfile) - off = addpctab(ctxt, ftab, off, &pcln.Pcline) + off = writepctab(off, pcln.Pcsp.P) + off = writepctab(off, pcln.Pcfile.P) + off = writepctab(off, pcln.Pcline.P) off = int32(ftab.SetUint32(ctxt.Arch, int64(off), uint32(len(pcln.Pcdata)))) // funcID uint8 @@ -391,7 +395,7 @@ func (ctxt *Link) pclntab() { // nfuncdata must be the final entry. off = int32(ftab.SetUint8(ctxt.Arch, int64(off), uint8(len(pcln.Funcdata)))) for i := range pcln.Pcdata { - off = addpctab(ctxt, ftab, off, &pcln.Pcdata[i]) + off = writepctab(off, pcln.Pcdata[i].P) } // funcdata, must be pointer-aligned and we're only int32-aligned. -- GitLab From ad832284c7441da9b2eaecdd0f634af6b35a75a4 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Sat, 13 Apr 2019 10:27:35 -0400 Subject: [PATCH 0801/1679] runtime: remove some unused fields in m and p Change-Id: Ie0171f48aaf48d8399ef578f95352445741d83a9 Reviewed-on: https://go-review.googlesource.com/c/go/+/171773 Reviewed-by: Ian Lance Taylor --- src/runtime/runtime2.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index 8d749f3d7c..6d4633821b 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -434,7 +434,6 @@ type m struct { profilehz int32 spinning bool // m is out of work and is actively looking for work blocked bool // m is blocked on a note - inwb bool // m is executing a write barrier newSigstack bool // minit on C thread called sigaltstack printlock int8 incgo bool // m is executing a cgo call @@ -481,8 +480,6 @@ type m struct { } type p struct { - lock mutex - id int32 status uint32 // one of pidle/prunning/... link puintptr @@ -536,10 +533,12 @@ type p struct { palloc persistentAlloc // per-P to avoid mutex + _ uint32 // Alignment for atomic fields below + // Per-P GC state - gcAssistTime int64 // Nanoseconds in assistAlloc - gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker - gcBgMarkWorker guintptr + gcAssistTime int64 // Nanoseconds in assistAlloc + gcFractionalMarkTime int64 // Nanoseconds in fractional mark worker (atomic) + gcBgMarkWorker guintptr // (atomic) gcMarkWorkerMode gcMarkWorkerMode // gcMarkWorkerStartTime is the nanotime() at which this mark -- GitLab From dec5d99b71ed8693ddecf2a979735a7f907a3490 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Tue, 16 Apr 2019 01:51:14 +0700 Subject: [PATCH 0802/1679] cmd/compile: remove outdate comment of treecopy Since golang.org/cl/32487, treecopy does not handle non-iota ONONAME and iota ONONAME anymore. Change-Id: Icd5a81333a0d4d04adef2dbc58db92ce67aa0860 Reviewed-on: https://go-review.googlesource.com/c/go/+/172038 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/subr.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 775147bff7..156e3c2c94 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -435,10 +435,9 @@ func nodstr(s string) *Node { } // treecopy recursively copies n, with the exception of -// ONAME, OLITERAL, OTYPE, and non-iota ONONAME leaves. -// Copies of iota ONONAME nodes are assigned the current -// value of iota_. If pos.IsKnown(), it sets the source -// position of newly allocated nodes to pos. +// ONAME, OLITERAL, OTYPE, and ONONAME leaves. +// If pos.IsKnown(), it sets the source position of newly +// allocated nodes to pos. func treecopy(n *Node, pos src.XPos) *Node { if n == nil { return nil -- GitLab From 2c802e9980427a1d47384b222dcbf4c9b4e84944 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 15 Mar 2019 14:58:55 +0000 Subject: [PATCH 0803/1679] net/http: add Server BaseContext & ConnContext fields to control early context Fixes golang/go#30694 Change-Id: I12a0a870e4aee6576e879d88a4868666ef448298 Reviewed-on: https://go-review.googlesource.com/c/go/+/167681 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: JP Sugarbroad Reviewed-by: Brad Fitzpatrick --- src/net/http/serve_test.go | 37 +++++++++++++++++++++++++++++++++++++ src/net/http/server.go | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index ea6d7c2fda..f10a4272ab 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -6034,6 +6034,43 @@ func TestStripPortFromHost(t *testing.T) { } } +func TestServerContexts(t *testing.T) { + setParallel(t) + defer afterTest(t) + type baseKey struct{} + type connKey struct{} + ch := make(chan context.Context, 1) + ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) { + ch <- r.Context() + })) + ts.Config.BaseContext = func(ln net.Listener) context.Context { + if strings.Contains(reflect.TypeOf(ln).String(), "onceClose") { + t.Errorf("unexpected onceClose listener type %T", ln) + } + return context.WithValue(context.Background(), baseKey{}, "base") + } + ts.Config.ConnContext = func(ctx context.Context, c net.Conn) context.Context { + if got, want := ctx.Value(baseKey{}), "base"; got != want { + t.Errorf("in ConnContext, base context key = %#v; want %q", got, want) + } + return context.WithValue(ctx, connKey{}, "conn") + } + ts.Start() + defer ts.Close() + res, err := ts.Client().Get(ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + ctx := <-ch + if got, want := ctx.Value(baseKey{}), "base"; got != want { + t.Errorf("base context key = %#v; want %q", got, want) + } + if got, want := ctx.Value(connKey{}), "conn"; got != want { + t.Errorf("conn context key = %#v; want %q", got, want) + } +} + func BenchmarkResponseStatusLine(b *testing.B) { b.ReportAllocs() b.RunParallel(func(pb *testing.PB) { diff --git a/src/net/http/server.go b/src/net/http/server.go index 14f74285c1..bc6d93bce0 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2542,6 +2542,20 @@ type Server struct { // If nil, logging is done via the log package's standard logger. ErrorLog *log.Logger + // BaseContext optionally specifies a function that returns + // the base context for incoming requests on this server. + // The provided Listener is the specific Listener that's + // about to start accepting requests. + // If BaseContext is nil, the default is context.Background(). + // If non-nil, it must return a non-nil context. + BaseContext func(net.Listener) context.Context + + // ConnContext optionally specifies a function that modifies + // the context used for a newly connection c. The provided ctx + // is derived from the base context and has a ServerContextKey + // value. + ConnContext func(ctx context.Context, c net.Conn) context.Context + disableKeepAlives int32 // accessed atomically. inShutdown int32 // accessed atomically (non-zero means we're in Shutdown) nextProtoOnce sync.Once // guards setupHTTP2_* init @@ -2838,6 +2852,7 @@ func (srv *Server) Serve(l net.Listener) error { fn(srv, l) // call hook with unwrapped listener } + origListener := l l = &onceCloseListener{Listener: l} defer l.Close() @@ -2850,8 +2865,16 @@ func (srv *Server) Serve(l net.Listener) error { } defer srv.trackListener(&l, false) - var tempDelay time.Duration // how long to sleep on accept failure - baseCtx := context.Background() // base is always background, per Issue 16220 + var tempDelay time.Duration // how long to sleep on accept failure + + baseCtx := context.Background() + if srv.BaseContext != nil { + baseCtx = srv.BaseContext(origListener) + if baseCtx == nil { + panic("BaseContext returned a nil context") + } + } + ctx := context.WithValue(baseCtx, ServerContextKey, srv) for { rw, e := l.Accept() @@ -2876,6 +2899,12 @@ func (srv *Server) Serve(l net.Listener) error { } return e } + if cc := srv.ConnContext; cc != nil { + ctx = cc(ctx, rw) + if ctx == nil { + panic("ConnContext returned nil") + } + } tempDelay = 0 c := srv.newConn(rw) c.setState(c.rwc, StateNew) // before Serve can return -- GitLab From 6b7114b9e5d872fe981a5c988915e4440f8df59c Mon Sep 17 00:00:00 2001 From: sergey Date: Sun, 24 Feb 2019 14:26:55 +0300 Subject: [PATCH 0804/1679] net/http: speed up parsing of Cookie headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parse the headers without splitting them upfront to reduce memory allocations. For non-pathological Cookie headers we can make a good estimate of the number of cookies in there and preallocate the slice of cookies name old time/op new time/op delta CookieString-4 1.73µs ± 2% 1.70µs ± 5% ~ (p=0.841 n=5+5) ReadSetCookies-4 6.09µs ± 3% 5.93µs ± 3% ~ (p=0.095 n=5+5) ReadCookies-4 7.63µs ± 1% 6.41µs ± 4% -15.99% (p=0.008 n=5+5) name old alloc/op new alloc/op delta CookieString-4 360B ± 0% 360B ± 0% ~ (all equal) ReadSetCookies-4 976B ± 0% 976B ± 0% ~ (all equal) ReadCookies-4 2.17kB ± 0% 1.84kB ± 0% -15.13% (p=0.008 n=5+5) name old allocs/op new allocs/op delta CookieString-4 5.00 ± 0% 5.00 ± 0% ~ (all equal) ReadSetCookies-4 15.0 ± 0% 15.0 ± 0% ~ (all equal) ReadCookies-4 16.0 ± 0% 11.0 ± 0% -31.25% (p=0.008 n=5+5) Change-Id: Ica1ca0d40c0d8d275134d1dfafb73f1082115826 Reviewed-on: https://go-review.googlesource.com/c/go/+/163617 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/cookie.go | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/net/http/cookie.go b/src/net/http/cookie.go index b8bc72b622..7d02796f30 100644 --- a/src/net/http/cookie.go +++ b/src/net/http/cookie.go @@ -230,25 +230,28 @@ func (c *Cookie) String() string { // // if filter isn't empty, only cookies of that name are returned func readCookies(h Header, filter string) []*Cookie { - lines, ok := h["Cookie"] - if !ok { + lines := h["Cookie"] + if len(lines) == 0 { return []*Cookie{} } - cookies := []*Cookie{} + cookies := make([]*Cookie, 0, len(lines)+strings.Count(lines[0], ";")) for _, line := range lines { - parts := strings.Split(strings.TrimSpace(line), ";") - if len(parts) == 1 && parts[0] == "" { - continue - } - // Per-line attributes - for i := 0; i < len(parts); i++ { - parts[i] = strings.TrimSpace(parts[i]) - if len(parts[i]) == 0 { + line = strings.TrimSpace(line) + + var part string + for len(line) > 0 { // continue since we have rest + if splitIndex := strings.Index(line, ";"); splitIndex > 0 { + part, line = line[:splitIndex], line[splitIndex+1:] + } else { + part, line = line, "" + } + part = strings.TrimSpace(part) + if len(part) == 0 { continue } - name, val := parts[i], "" - if j := strings.Index(name, "="); j >= 0 { + name, val := part, "" + if j := strings.Index(part, "="); j >= 0 { name, val = name[:j], name[j+1:] } if !isCookieNameValid(name) { -- GitLab From 09b2b6e9dd2ce009c3aafdff02727f200c63c574 Mon Sep 17 00:00:00 2001 From: bronze1man Date: Mon, 14 Jan 2019 15:41:02 +0000 Subject: [PATCH 0805/1679] net/http: remove unnecessary string replace operation in Cookie.String Fixes #29135 Change-Id: I4c10b0395047775e8488b8b0f00f74a7fa01b86c GitHub-Last-Rev: 120977040506794f00c74383289f913b1e0edd4a GitHub-Pull-Request: golang/go#29728 Reviewed-on: https://go-review.googlesource.com/c/go/+/157777 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/net/http/cookie.go | 2 +- src/net/http/cookie_test.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/net/http/cookie.go b/src/net/http/cookie.go index 7d02796f30..fd8c71c645 100644 --- a/src/net/http/cookie.go +++ b/src/net/http/cookie.go @@ -173,7 +173,7 @@ func (c *Cookie) String() string { const extraCookieLength = 110 var b strings.Builder b.Grow(len(c.Name) + len(c.Value) + len(c.Domain) + len(c.Path) + extraCookieLength) - b.WriteString(sanitizeCookieName(c.Name)) + b.WriteString(c.Name) b.WriteRune('=') b.WriteString(sanitizeCookieValue(c.Value)) diff --git a/src/net/http/cookie_test.go b/src/net/http/cookie_test.go index 9536a69c20..bfaea46f8c 100644 --- a/src/net/http/cookie_test.go +++ b/src/net/http/cookie_test.go @@ -127,6 +127,22 @@ var writeSetCookiesTests = []struct { &Cookie{Name: "\t"}, ``, }, + { + &Cookie{Name: "\r"}, + ``, + }, + { + &Cookie{Name: "a\nb", Value: "v"}, + ``, + }, + { + &Cookie{Name: "a\nb", Value: "v"}, + ``, + }, + { + &Cookie{Name: "a\rb", Value: "v"}, + ``, + }, } func TestWriteSetCookies(t *testing.T) { -- GitLab From a337cb2bf072e6215ecf6d2e9040f4383359e5dd Mon Sep 17 00:00:00 2001 From: Ross Light Date: Fri, 12 Apr 2019 14:29:59 -0700 Subject: [PATCH 0806/1679] cmd/go/internal/modget: s/prerelease/pre-release/ For prose consistency with other documentation. Change-Id: I1588fbe1feace2a97b02b20bba730ed730b84fa3 Reviewed-on: https://go-review.googlesource.com/c/go/+/171772 Run-TryBot: Ross Light TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 2 +- src/cmd/go/internal/modget/get.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 008e306efb..2cc00f29b1 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -549,7 +549,7 @@ // For each named package or package pattern, get must decide which version of // the corresponding module to use. By default, get chooses the latest tagged // release version, such as v0.4.5 or v1.2.3. If there are no tagged release -// versions, get chooses the latest tagged prerelease version, such as +// versions, get chooses the latest tagged pre-release version, such as // v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest // known commit. // diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index 40bbd50746..c8368acce3 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -39,7 +39,7 @@ The first step is to resolve which dependencies to add. For each named package or package pattern, get must decide which version of the corresponding module to use. By default, get chooses the latest tagged release version, such as v0.4.5 or v1.2.3. If there are no tagged release -versions, get chooses the latest tagged prerelease version, such as +versions, get chooses the latest tagged pre-release version, such as v0.0.1-pre1. If there are no tagged versions at all, get chooses the latest known commit. -- GitLab From f248cd3a0753ce02928525268d9c7d1fcceffee0 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 15 Apr 2019 17:55:58 -0700 Subject: [PATCH 0807/1679] runtime: print more information when testCgoPprof fails Change-Id: I820dae0303959096f0c434b7e69ecb3bf070df09 Reviewed-on: https://go-review.googlesource.com/c/go/+/172197 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/crash_cgo_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/crash_cgo_test.go b/src/runtime/crash_cgo_test.go index af3c1f82a7..56cfb0856e 100644 --- a/src/runtime/crash_cgo_test.go +++ b/src/runtime/crash_cgo_test.go @@ -281,7 +281,7 @@ func testCgoPprof(t *testing.T, buildArg, runArg, top, bottom string) { // See Issue 18243 and Issue 19938. t.Skipf("Skipping failing test on Alpine (golang.org/issue/18243). Ignoring error: %v", err) } - t.Fatal(err) + t.Fatalf("%s\n\n%v", got, err) } fn := strings.TrimSpace(string(got)) defer os.Remove(fn) -- GitLab From e61985427eb734ed686d63908cf15118cabe5db8 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Fri, 12 Apr 2019 10:49:12 +0100 Subject: [PATCH 0808/1679] cmd/internal/obj/s390x: remove param field from optab The param field isn't useful, we can just use REGSP instead. Change-Id: I2ac68131c390209cc84e43aa7620ccbf5ae69120 Reviewed-on: https://go-review.googlesource.com/c/go/+/171725 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/internal/obj/s390x/asmz.go | 527 ++++++++++++++--------------- 1 file changed, 263 insertions(+), 264 deletions(-) diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 4c938eadcc..1521aa656b 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -61,356 +61,355 @@ type Optab struct { a3 uint8 // From3 a4 uint8 // To type_ int8 - param int16 // REGSP for auto variables } var optab = []Optab{ - // instruction, From, Reg, From3, To, type, param - Optab{obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0}, - Optab{obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0}, + // instruction, From, Reg, From3, To, type + Optab{obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0}, + Optab{obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0}, // move register - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 1, 0}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_REG, 1, 0}, + Optab{AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{AMOVB, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{AMOVW, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 1}, + Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_REG, 1}, // load constant - Optab{AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26, REGSP}, - Optab{AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26, REGSP}, - Optab{AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26, REGSP}, - Optab{AMOVD, C_DCON, C_NONE, C_NONE, C_REG, 3, 0}, - Optab{AMOVW, C_DCON, C_NONE, C_NONE, C_REG, 3, 0}, - Optab{AMOVWZ, C_DCON, C_NONE, C_NONE, C_REG, 3, 0}, - Optab{AMOVB, C_DCON, C_NONE, C_NONE, C_REG, 3, 0}, - Optab{AMOVBZ, C_DCON, C_NONE, C_NONE, C_REG, 3, 0}, + Optab{AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26}, + Optab{AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26}, + Optab{AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26}, + Optab{AMOVD, C_DCON, C_NONE, C_NONE, C_REG, 3}, + Optab{AMOVW, C_DCON, C_NONE, C_NONE, C_REG, 3}, + Optab{AMOVWZ, C_DCON, C_NONE, C_NONE, C_REG, 3}, + Optab{AMOVB, C_DCON, C_NONE, C_NONE, C_REG, 3}, + Optab{AMOVBZ, C_DCON, C_NONE, C_NONE, C_REG, 3}, // store constant - Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72, REGSP}, - Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72, 0}, - Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72, 0}, + Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, + Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, // store - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74, 0}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74, 0}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 0}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 0}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74, 0}, + Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74}, // load - Optab{AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVDBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVHBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36, REGSP}, - Optab{AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVDBR, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVHBR, C_LOREG, C_NONE, C_NONE, C_REG, 36, 0}, - Optab{AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75, 0}, - Optab{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75, 0}, - Optab{AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 0}, - Optab{AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 0}, - Optab{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 75, 0}, + Optab{AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVDBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVHBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVDBR, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVHBR, C_LOREG, C_NONE, C_NONE, C_REG, 36}, + Optab{AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75}, + Optab{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75}, + Optab{AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75}, + Optab{AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75}, + Optab{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 75}, // interlocked load and op - Optab{ALAAG, C_REG, C_REG, C_NONE, C_LOREG, 99, 0}, + Optab{ALAAG, C_REG, C_REG, C_NONE, C_LOREG, 99}, // integer arithmetic - Optab{AADD, C_REG, C_REG, C_NONE, C_REG, 2, 0}, - Optab{AADD, C_REG, C_NONE, C_NONE, C_REG, 2, 0}, - Optab{AADD, C_LCON, C_REG, C_NONE, C_REG, 22, 0}, - Optab{AADD, C_LCON, C_NONE, C_NONE, C_REG, 22, 0}, - Optab{AADD, C_LOREG, C_NONE, C_NONE, C_REG, 12, 0}, - Optab{AADD, C_LAUTO, C_NONE, C_NONE, C_REG, 12, REGSP}, - Optab{ASUB, C_LCON, C_REG, C_NONE, C_REG, 21, 0}, - Optab{ASUB, C_LCON, C_NONE, C_NONE, C_REG, 21, 0}, - Optab{ASUB, C_LOREG, C_NONE, C_NONE, C_REG, 12, 0}, - Optab{ASUB, C_LAUTO, C_NONE, C_NONE, C_REG, 12, REGSP}, - Optab{AMULHD, C_REG, C_NONE, C_NONE, C_REG, 4, 0}, - Optab{AMULHD, C_REG, C_REG, C_NONE, C_REG, 4, 0}, - Optab{ADIVW, C_REG, C_REG, C_NONE, C_REG, 2, 0}, - Optab{ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2, 0}, - Optab{ASUB, C_REG, C_REG, C_NONE, C_REG, 10, 0}, - Optab{ASUB, C_REG, C_NONE, C_NONE, C_REG, 10, 0}, - Optab{ANEG, C_REG, C_NONE, C_NONE, C_REG, 47, 0}, - Optab{ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47, 0}, + Optab{AADD, C_REG, C_REG, C_NONE, C_REG, 2}, + Optab{AADD, C_REG, C_NONE, C_NONE, C_REG, 2}, + Optab{AADD, C_LCON, C_REG, C_NONE, C_REG, 22}, + Optab{AADD, C_LCON, C_NONE, C_NONE, C_REG, 22}, + Optab{AADD, C_LOREG, C_NONE, C_NONE, C_REG, 12}, + Optab{AADD, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, + Optab{ASUB, C_LCON, C_REG, C_NONE, C_REG, 21}, + Optab{ASUB, C_LCON, C_NONE, C_NONE, C_REG, 21}, + Optab{ASUB, C_LOREG, C_NONE, C_NONE, C_REG, 12}, + Optab{ASUB, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, + Optab{AMULHD, C_REG, C_NONE, C_NONE, C_REG, 4}, + Optab{AMULHD, C_REG, C_REG, C_NONE, C_REG, 4}, + Optab{ADIVW, C_REG, C_REG, C_NONE, C_REG, 2}, + Optab{ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2}, + Optab{ASUB, C_REG, C_REG, C_NONE, C_REG, 10}, + Optab{ASUB, C_REG, C_NONE, C_NONE, C_REG, 10}, + Optab{ANEG, C_REG, C_NONE, C_NONE, C_REG, 47}, + Optab{ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47}, // integer logical - Optab{AAND, C_REG, C_REG, C_NONE, C_REG, 6, 0}, - Optab{AAND, C_REG, C_NONE, C_NONE, C_REG, 6, 0}, - Optab{AAND, C_LCON, C_NONE, C_NONE, C_REG, 23, 0}, - Optab{AAND, C_LOREG, C_NONE, C_NONE, C_REG, 12, 0}, - Optab{AAND, C_LAUTO, C_NONE, C_NONE, C_REG, 12, REGSP}, - Optab{AANDW, C_REG, C_REG, C_NONE, C_REG, 6, 0}, - Optab{AANDW, C_REG, C_NONE, C_NONE, C_REG, 6, 0}, - Optab{AANDW, C_LCON, C_NONE, C_NONE, C_REG, 24, 0}, - Optab{AANDW, C_LOREG, C_NONE, C_NONE, C_REG, 12, 0}, - Optab{AANDW, C_LAUTO, C_NONE, C_NONE, C_REG, 12, REGSP}, - Optab{ASLD, C_REG, C_NONE, C_NONE, C_REG, 7, 0}, - Optab{ASLD, C_REG, C_REG, C_NONE, C_REG, 7, 0}, - Optab{ASLD, C_SCON, C_REG, C_NONE, C_REG, 7, 0}, - Optab{ASLD, C_SCON, C_NONE, C_NONE, C_REG, 7, 0}, + Optab{AAND, C_REG, C_REG, C_NONE, C_REG, 6}, + Optab{AAND, C_REG, C_NONE, C_NONE, C_REG, 6}, + Optab{AAND, C_LCON, C_NONE, C_NONE, C_REG, 23}, + Optab{AAND, C_LOREG, C_NONE, C_NONE, C_REG, 12}, + Optab{AAND, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, + Optab{AANDW, C_REG, C_REG, C_NONE, C_REG, 6}, + Optab{AANDW, C_REG, C_NONE, C_NONE, C_REG, 6}, + Optab{AANDW, C_LCON, C_NONE, C_NONE, C_REG, 24}, + Optab{AANDW, C_LOREG, C_NONE, C_NONE, C_REG, 12}, + Optab{AANDW, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, + Optab{ASLD, C_REG, C_NONE, C_NONE, C_REG, 7}, + Optab{ASLD, C_REG, C_REG, C_NONE, C_REG, 7}, + Optab{ASLD, C_SCON, C_REG, C_NONE, C_REG, 7}, + Optab{ASLD, C_SCON, C_NONE, C_NONE, C_REG, 7}, // compare and swap - Optab{ACSG, C_REG, C_REG, C_NONE, C_SOREG, 79, 0}, + Optab{ACSG, C_REG, C_REG, C_NONE, C_SOREG, 79}, // floating point - Optab{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 32, 0}, - Optab{AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 0}, - Optab{AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 0}, - Optab{AFMADD, C_FREG, C_FREG, C_NONE, C_FREG, 34, 0}, - Optab{AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 0}, - Optab{AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, REGSP}, - Optab{AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 0}, - Optab{AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 0}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, REGSP}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 0}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 0}, - Optab{AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 67, 0}, - Optab{ALDGR, C_REG, C_NONE, C_NONE, C_FREG, 81, 0}, - Optab{ALGDR, C_FREG, C_NONE, C_NONE, C_REG, 81, 0}, - Optab{ACEFBRA, C_REG, C_NONE, C_NONE, C_FREG, 82, 0}, - Optab{ACFEBRA, C_FREG, C_NONE, C_NONE, C_REG, 83, 0}, - Optab{AFIEBR, C_SCON, C_FREG, C_NONE, C_FREG, 48, 0}, - Optab{ACPSDR, C_FREG, C_FREG, C_NONE, C_FREG, 49, 0}, - Optab{ALTDBR, C_FREG, C_NONE, C_NONE, C_FREG, 50, 0}, - Optab{ATCDB, C_FREG, C_NONE, C_NONE, C_SCON, 51, 0}, + Optab{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 32}, + Optab{AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33}, + Optab{AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33}, + Optab{AFMADD, C_FREG, C_FREG, C_NONE, C_FREG, 34}, + Optab{AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32}, + Optab{AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36}, + Optab{AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36}, + Optab{AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75}, + Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35}, + Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35}, + Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 67}, + Optab{ALDGR, C_REG, C_NONE, C_NONE, C_FREG, 81}, + Optab{ALGDR, C_FREG, C_NONE, C_NONE, C_REG, 81}, + Optab{ACEFBRA, C_REG, C_NONE, C_NONE, C_FREG, 82}, + Optab{ACFEBRA, C_FREG, C_NONE, C_NONE, C_REG, 83}, + Optab{AFIEBR, C_SCON, C_FREG, C_NONE, C_FREG, 48}, + Optab{ACPSDR, C_FREG, C_FREG, C_NONE, C_FREG, 49}, + Optab{ALTDBR, C_FREG, C_NONE, C_NONE, C_FREG, 50}, + Optab{ATCDB, C_FREG, C_NONE, C_NONE, C_SCON, 51}, // load symbol address (plus offset) - Optab{AMOVD, C_SYMADDR, C_NONE, C_NONE, C_REG, 19, 0}, - Optab{AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 93, 0}, - Optab{AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 94, 0}, - Optab{AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 95, 0}, + Optab{AMOVD, C_SYMADDR, C_NONE, C_NONE, C_REG, 19}, + Optab{AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 93}, + Optab{AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 94}, + Optab{AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 95}, // system call - Optab{ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5, 0}, - Optab{ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77, 0}, + Optab{ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5}, + Optab{ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77}, // branch - Optab{ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16, 0}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 0}, - Optab{ABC, C_SCON, C_REG, C_NONE, C_LBRA, 16, 0}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_REG, 18, 0}, - Optab{ABR, C_REG, C_NONE, C_NONE, C_REG, 18, 0}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 0}, - Optab{ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 0}, - Optab{ACMPBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89, 0}, - Optab{ACMPBEQ, C_REG, C_NONE, C_ADDCON, C_SBRA, 90, 0}, - Optab{ACMPBEQ, C_REG, C_NONE, C_SCON, C_SBRA, 90, 0}, - Optab{ACMPUBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89, 0}, - Optab{ACMPUBEQ, C_REG, C_NONE, C_ANDCON, C_SBRA, 90, 0}, + Optab{ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16}, + Optab{ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11}, + Optab{ABC, C_SCON, C_REG, C_NONE, C_LBRA, 16}, + Optab{ABR, C_NONE, C_NONE, C_NONE, C_REG, 18}, + Optab{ABR, C_REG, C_NONE, C_NONE, C_REG, 18}, + Optab{ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15}, + Optab{ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15}, + Optab{ACMPBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89}, + Optab{ACMPBEQ, C_REG, C_NONE, C_ADDCON, C_SBRA, 90}, + Optab{ACMPBEQ, C_REG, C_NONE, C_SCON, C_SBRA, 90}, + Optab{ACMPUBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89}, + Optab{ACMPUBEQ, C_REG, C_NONE, C_ANDCON, C_SBRA, 90}, // move on condition - Optab{AMOVDEQ, C_REG, C_NONE, C_NONE, C_REG, 17, 0}, + Optab{AMOVDEQ, C_REG, C_NONE, C_NONE, C_REG, 17}, // find leftmost one - Optab{AFLOGR, C_REG, C_NONE, C_NONE, C_REG, 8, 0}, + Optab{AFLOGR, C_REG, C_NONE, C_NONE, C_REG, 8}, // population count - Optab{APOPCNT, C_REG, C_NONE, C_NONE, C_REG, 9, 0}, + Optab{APOPCNT, C_REG, C_NONE, C_NONE, C_REG, 9}, // compare - Optab{ACMP, C_REG, C_NONE, C_NONE, C_REG, 70, 0}, - Optab{ACMP, C_REG, C_NONE, C_NONE, C_LCON, 71, 0}, - Optab{ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70, 0}, - Optab{ACMPU, C_REG, C_NONE, C_NONE, C_LCON, 71, 0}, - Optab{AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70, 0}, - Optab{AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70, 0}, + Optab{ACMP, C_REG, C_NONE, C_NONE, C_REG, 70}, + Optab{ACMP, C_REG, C_NONE, C_NONE, C_LCON, 71}, + Optab{ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70}, + Optab{ACMPU, C_REG, C_NONE, C_NONE, C_LCON, 71}, + Optab{AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70}, + Optab{AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70}, // test under mask - Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91, 0}, + Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91}, // insert program mask - Optab{AIPM, C_REG, C_NONE, C_NONE, C_NONE, 92, 0}, + Optab{AIPM, C_REG, C_NONE, C_NONE, C_NONE, 92}, // 32-bit access registers - Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, - Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68, 0}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_AREG, 69, 0}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_AREG, 69, 0}, + Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68}, + Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68}, + Optab{AMOVW, C_REG, C_NONE, C_NONE, C_AREG, 69}, + Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_AREG, 69}, // macros - Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LOREG, 96, 0}, - Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LAUTO, 96, REGSP}, + Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LOREG, 96}, + Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LAUTO, 96}, // load/store multiple - Optab{ASTMG, C_REG, C_REG, C_NONE, C_LOREG, 97, 0}, - Optab{ASTMG, C_REG, C_REG, C_NONE, C_LAUTO, 97, REGSP}, - Optab{ALMG, C_LOREG, C_REG, C_NONE, C_REG, 98, 0}, - Optab{ALMG, C_LAUTO, C_REG, C_NONE, C_REG, 98, REGSP}, + Optab{ASTMG, C_REG, C_REG, C_NONE, C_LOREG, 97}, + Optab{ASTMG, C_REG, C_REG, C_NONE, C_LAUTO, 97}, + Optab{ALMG, C_LOREG, C_REG, C_NONE, C_REG, 98}, + Optab{ALMG, C_LAUTO, C_REG, C_NONE, C_REG, 98}, // bytes - Optab{ABYTE, C_SCON, C_NONE, C_NONE, C_NONE, 40, 0}, - Optab{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 0}, - Optab{ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 0}, - Optab{ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31, 0}, + Optab{ABYTE, C_SCON, C_NONE, C_NONE, C_NONE, 40}, + Optab{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40}, + Optab{ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31}, + Optab{ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31}, // fast synchronization - Optab{ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 80, 0}, + Optab{ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 80}, // store clock - Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SAUTO, 88, REGSP}, - Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SOREG, 88, 0}, + Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SAUTO, 88}, + Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SOREG, 88}, // storage and storage - Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LOREG, 84, 0}, - Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LAUTO, 84, REGSP}, - Optab{AMVC, C_SCON, C_NONE, C_LAUTO, C_LAUTO, 84, REGSP}, + Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LOREG, 84}, + Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LAUTO, 84}, + Optab{AMVC, C_SCON, C_NONE, C_LAUTO, C_LAUTO, 84}, // address - Optab{ALARL, C_LCON, C_NONE, C_NONE, C_REG, 85, 0}, - Optab{ALARL, C_SYMADDR, C_NONE, C_NONE, C_REG, 85, 0}, - Optab{ALA, C_SOREG, C_NONE, C_NONE, C_REG, 86, 0}, - Optab{ALA, C_SAUTO, C_NONE, C_NONE, C_REG, 86, REGSP}, - Optab{AEXRL, C_SYMADDR, C_NONE, C_NONE, C_REG, 87, 0}, + Optab{ALARL, C_LCON, C_NONE, C_NONE, C_REG, 85}, + Optab{ALARL, C_SYMADDR, C_NONE, C_NONE, C_REG, 85}, + Optab{ALA, C_SOREG, C_NONE, C_NONE, C_REG, 86}, + Optab{ALA, C_SAUTO, C_NONE, C_NONE, C_REG, 86}, + Optab{AEXRL, C_SYMADDR, C_NONE, C_NONE, C_REG, 87}, // misc - Optab{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78, 0}, - Optab{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0}, - Optab{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0}, - Optab{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0}, - Optab{obj.ANOP, C_SAUTO, C_NONE, C_NONE, C_NONE, 0, 0}, + Optab{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78}, + Optab{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0}, + Optab{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0}, + Optab{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0}, + Optab{obj.ANOP, C_SAUTO, C_NONE, C_NONE, C_NONE, 0}, // vector instructions // VRX store - Optab{AVST, C_VREG, C_NONE, C_NONE, C_SOREG, 100, 0}, - Optab{AVST, C_VREG, C_NONE, C_NONE, C_SAUTO, 100, REGSP}, - Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SOREG, 100, 0}, - Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 100, REGSP}, + Optab{AVST, C_VREG, C_NONE, C_NONE, C_SOREG, 100}, + Optab{AVST, C_VREG, C_NONE, C_NONE, C_SAUTO, 100}, + Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SOREG, 100}, + Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 100}, // VRX load - Optab{AVL, C_SOREG, C_NONE, C_NONE, C_VREG, 101, 0}, - Optab{AVL, C_SAUTO, C_NONE, C_NONE, C_VREG, 101, REGSP}, - Optab{AVLEG, C_SCON, C_NONE, C_SOREG, C_VREG, 101, 0}, - Optab{AVLEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 101, REGSP}, + Optab{AVL, C_SOREG, C_NONE, C_NONE, C_VREG, 101}, + Optab{AVL, C_SAUTO, C_NONE, C_NONE, C_VREG, 101}, + Optab{AVLEG, C_SCON, C_NONE, C_SOREG, C_VREG, 101}, + Optab{AVLEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 101}, // VRV scatter - Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SOREG, 102, 0}, - Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 102, REGSP}, + Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SOREG, 102}, + Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 102}, // VRV gather - Optab{AVGEG, C_SCON, C_NONE, C_SOREG, C_VREG, 103, 0}, - Optab{AVGEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 103, REGSP}, + Optab{AVGEG, C_SCON, C_NONE, C_SOREG, C_VREG, 103}, + Optab{AVGEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 103}, // VRS element shift/rotate and load gr to/from vr element - Optab{AVESLG, C_SCON, C_VREG, C_NONE, C_VREG, 104, 0}, - Optab{AVESLG, C_REG, C_VREG, C_NONE, C_VREG, 104, 0}, - Optab{AVESLG, C_SCON, C_NONE, C_NONE, C_VREG, 104, 0}, - Optab{AVESLG, C_REG, C_NONE, C_NONE, C_VREG, 104, 0}, - Optab{AVLGVG, C_SCON, C_VREG, C_NONE, C_REG, 104, 0}, - Optab{AVLGVG, C_REG, C_VREG, C_NONE, C_REG, 104, 0}, - Optab{AVLVGG, C_SCON, C_REG, C_NONE, C_VREG, 104, 0}, - Optab{AVLVGG, C_REG, C_REG, C_NONE, C_VREG, 104, 0}, + Optab{AVESLG, C_SCON, C_VREG, C_NONE, C_VREG, 104}, + Optab{AVESLG, C_REG, C_VREG, C_NONE, C_VREG, 104}, + Optab{AVESLG, C_SCON, C_NONE, C_NONE, C_VREG, 104}, + Optab{AVESLG, C_REG, C_NONE, C_NONE, C_VREG, 104}, + Optab{AVLGVG, C_SCON, C_VREG, C_NONE, C_REG, 104}, + Optab{AVLGVG, C_REG, C_VREG, C_NONE, C_REG, 104}, + Optab{AVLVGG, C_SCON, C_REG, C_NONE, C_VREG, 104}, + Optab{AVLVGG, C_REG, C_REG, C_NONE, C_VREG, 104}, // VRS store multiple - Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SOREG, 105, 0}, - Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SAUTO, 105, REGSP}, + Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SOREG, 105}, + Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SAUTO, 105}, // VRS load multiple - Optab{AVLM, C_SOREG, C_VREG, C_NONE, C_VREG, 106, 0}, - Optab{AVLM, C_SAUTO, C_VREG, C_NONE, C_VREG, 106, REGSP}, + Optab{AVLM, C_SOREG, C_VREG, C_NONE, C_VREG, 106}, + Optab{AVLM, C_SAUTO, C_VREG, C_NONE, C_VREG, 106}, // VRS store with length - Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SOREG, 107, 0}, - Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SAUTO, 107, REGSP}, + Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SOREG, 107}, + Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SAUTO, 107}, // VRS load with length - Optab{AVLL, C_REG, C_NONE, C_SOREG, C_VREG, 108, 0}, - Optab{AVLL, C_REG, C_NONE, C_SAUTO, C_VREG, 108, REGSP}, + Optab{AVLL, C_REG, C_NONE, C_SOREG, C_VREG, 108}, + Optab{AVLL, C_REG, C_NONE, C_SAUTO, C_VREG, 108}, // VRI-a - Optab{AVGBM, C_ANDCON, C_NONE, C_NONE, C_VREG, 109, 0}, - Optab{AVZERO, C_NONE, C_NONE, C_NONE, C_VREG, 109, 0}, - Optab{AVREPIG, C_ADDCON, C_NONE, C_NONE, C_VREG, 109, 0}, - Optab{AVREPIG, C_SCON, C_NONE, C_NONE, C_VREG, 109, 0}, - Optab{AVLEIG, C_SCON, C_NONE, C_ADDCON, C_VREG, 109, 0}, - Optab{AVLEIG, C_SCON, C_NONE, C_SCON, C_VREG, 109, 0}, + Optab{AVGBM, C_ANDCON, C_NONE, C_NONE, C_VREG, 109}, + Optab{AVZERO, C_NONE, C_NONE, C_NONE, C_VREG, 109}, + Optab{AVREPIG, C_ADDCON, C_NONE, C_NONE, C_VREG, 109}, + Optab{AVREPIG, C_SCON, C_NONE, C_NONE, C_VREG, 109}, + Optab{AVLEIG, C_SCON, C_NONE, C_ADDCON, C_VREG, 109}, + Optab{AVLEIG, C_SCON, C_NONE, C_SCON, C_VREG, 109}, // VRI-b generate mask - Optab{AVGMG, C_SCON, C_NONE, C_SCON, C_VREG, 110, 0}, + Optab{AVGMG, C_SCON, C_NONE, C_SCON, C_VREG, 110}, // VRI-c replicate - Optab{AVREPG, C_UCON, C_VREG, C_NONE, C_VREG, 111, 0}, + Optab{AVREPG, C_UCON, C_VREG, C_NONE, C_VREG, 111}, // VRI-d element rotate and insert under mask and // shift left double by byte - Optab{AVERIMG, C_SCON, C_VREG, C_VREG, C_VREG, 112, 0}, - Optab{AVSLDB, C_SCON, C_VREG, C_VREG, C_VREG, 112, 0}, + Optab{AVERIMG, C_SCON, C_VREG, C_VREG, C_VREG, 112}, + Optab{AVSLDB, C_SCON, C_VREG, C_VREG, C_VREG, 112}, // VRI-d fp test data class immediate - Optab{AVFTCIDB, C_SCON, C_VREG, C_NONE, C_VREG, 113, 0}, + Optab{AVFTCIDB, C_SCON, C_VREG, C_NONE, C_VREG, 113}, // VRR-a load reg - Optab{AVLR, C_VREG, C_NONE, C_NONE, C_VREG, 114, 0}, + Optab{AVLR, C_VREG, C_NONE, C_NONE, C_VREG, 114}, // VRR-a compare - Optab{AVECG, C_VREG, C_NONE, C_NONE, C_VREG, 115, 0}, + Optab{AVECG, C_VREG, C_NONE, C_NONE, C_VREG, 115}, // VRR-b - Optab{AVCEQG, C_VREG, C_VREG, C_NONE, C_VREG, 117, 0}, - Optab{AVFAEF, C_VREG, C_VREG, C_NONE, C_VREG, 117, 0}, - Optab{AVPKSG, C_VREG, C_VREG, C_NONE, C_VREG, 117, 0}, + Optab{AVCEQG, C_VREG, C_VREG, C_NONE, C_VREG, 117}, + Optab{AVFAEF, C_VREG, C_VREG, C_NONE, C_VREG, 117}, + Optab{AVPKSG, C_VREG, C_VREG, C_NONE, C_VREG, 117}, // VRR-c - Optab{AVAQ, C_VREG, C_VREG, C_NONE, C_VREG, 118, 0}, - Optab{AVAQ, C_VREG, C_NONE, C_NONE, C_VREG, 118, 0}, - Optab{AVNOT, C_VREG, C_NONE, C_NONE, C_VREG, 118, 0}, - Optab{AVPDI, C_SCON, C_VREG, C_VREG, C_VREG, 123, 0}, + Optab{AVAQ, C_VREG, C_VREG, C_NONE, C_VREG, 118}, + Optab{AVAQ, C_VREG, C_NONE, C_NONE, C_VREG, 118}, + Optab{AVNOT, C_VREG, C_NONE, C_NONE, C_VREG, 118}, + Optab{AVPDI, C_SCON, C_VREG, C_VREG, C_VREG, 123}, // VRR-c shifts - Optab{AVERLLVG, C_VREG, C_VREG, C_NONE, C_VREG, 119, 0}, - Optab{AVERLLVG, C_VREG, C_NONE, C_NONE, C_VREG, 119, 0}, + Optab{AVERLLVG, C_VREG, C_VREG, C_NONE, C_VREG, 119}, + Optab{AVERLLVG, C_VREG, C_NONE, C_NONE, C_VREG, 119}, // VRR-d // 2 3 1 4 - Optab{AVACQ, C_VREG, C_VREG, C_VREG, C_VREG, 120, 0}, + Optab{AVACQ, C_VREG, C_VREG, C_VREG, C_VREG, 120}, // VRR-e - Optab{AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 121, 0}, + Optab{AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 121}, // VRR-f - Optab{AVLVGP, C_REG, C_REG, C_NONE, C_VREG, 122, 0}, + Optab{AVLVGP, C_REG, C_REG, C_NONE, C_VREG, 122}, } var oprange [ALAST & obj.AMask][]Optab @@ -2929,7 +2928,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { d2 := c.vregoff(&p.From) b2 := p.From.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } x2 := p.From.Index if -DISP20/2 > d2 || d2 >= DISP20/2 { @@ -3155,7 +3154,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { v := c.regoff(&p.From) r := p.From.Reg if r == 0 { - r = o.param + r = REGSP } i := p.From.Index if v >= 0 && v < DISP12 { @@ -3254,7 +3253,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { d2 := c.regoff(&p.To) b2 := p.To.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } x2 := p.To.Index if d2 < -DISP20/2 || d2 >= DISP20/2 { @@ -3271,7 +3270,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { d2 := c.regoff(&p.From) b2 := p.From.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } x2 := p.From.Index if d2 < -DISP20/2 || d2 >= DISP20/2 { @@ -3393,7 +3392,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { c.ctxt.Diag("cannot use index register") } if r == 0 { - r = o.param + r = REGSP } var opcode uint32 switch p.As { @@ -3601,10 +3600,10 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { b1 := p.To.Reg b2 := p.GetFrom3().Reg if b1 == 0 { - b1 = o.param + b1 = REGSP } if b2 == 0 { - b2 = o.param + b2 = REGSP } d1 := c.regoff(&p.To) d2 := c.regoff(p.GetFrom3()) @@ -3671,7 +3670,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { x := p.From.Index b := p.From.Reg if b == 0 { - b = o.param + b = REGSP } switch p.As { case ALA: @@ -3705,9 +3704,9 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { opcode = op_STCKF } v := c.vregoff(&p.To) - r := int(p.To.Reg) + r := p.To.Reg if r == 0 { - r = int(o.param) + r = REGSP } zS(opcode, uint32(r), uint32(v), asm) @@ -3827,7 +3826,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := c.vregoff(&p.To) reg := p.To.Reg if reg == 0 { - reg = o.param + reg = REGSP } if length <= 0 { c.ctxt.Diag("cannot CLEAR %d bytes, must be greater than 0", length) @@ -3873,7 +3872,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := c.regoff(&p.To) reg := p.To.Reg if reg == 0 { - reg = o.param + reg = REGSP } if offset < -DISP20/2 || offset >= DISP20/2 { if reg != REGTMP { @@ -3900,7 +3899,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := c.regoff(&p.From) reg := p.From.Reg if reg == 0 { - reg = o.param + reg = REGSP } if offset < -DISP20/2 || offset >= DISP20/2 { if reg != REGTMP { @@ -3963,7 +3962,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { } b2 := p.To.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } d2 := uint32(c.vregoff(&p.To)) zVRX(op, uint32(v1), uint32(p.To.Index), uint32(b2), d2, m3, asm) @@ -3977,7 +3976,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { } b2 := src.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } d2 := uint32(c.vregoff(src)) zVRX(op, uint32(p.To.Reg), uint32(src.Index), uint32(b2), d2, m3, asm) @@ -3987,7 +3986,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { m3 := uint32(c.vregoff(&p.From)) b2 := p.To.Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } d2 := uint32(c.vregoff(&p.To)) zVRV(op, uint32(p.Reg), uint32(p.To.Index), uint32(b2), d2, m3, asm) @@ -3997,7 +3996,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { m3 := uint32(c.vregoff(&p.From)) b2 := p.GetFrom3().Reg if b2 == 0 { - b2 = o.param + b2 = REGSP } d2 := uint32(c.vregoff(p.GetFrom3())) zVRV(op, uint32(p.To.Reg), uint32(p.GetFrom3().Index), uint32(b2), d2, m3, asm) @@ -4016,7 +4015,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := uint32(c.vregoff(&p.To)) reg := p.To.Reg if reg == 0 { - reg = o.param + reg = REGSP } zVRS(op, uint32(p.From.Reg), uint32(p.Reg), uint32(reg), offset, 0, asm) @@ -4025,7 +4024,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := uint32(c.vregoff(&p.From)) reg := p.From.Reg if reg == 0 { - reg = o.param + reg = REGSP } zVRS(op, uint32(p.Reg), uint32(p.To.Reg), uint32(reg), offset, 0, asm) @@ -4034,7 +4033,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := uint32(c.vregoff(&p.To)) reg := p.To.Reg if reg == 0 { - reg = o.param + reg = REGSP } zVRS(op, uint32(p.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm) @@ -4043,7 +4042,7 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { offset := uint32(c.vregoff(p.GetFrom3())) reg := p.GetFrom3().Reg if reg == 0 { - reg = o.param + reg = REGSP } zVRS(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm) -- GitLab From 9c843f031d31d85891d08f68ca5e6009a83bb0ce Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Fri, 12 Apr 2019 11:04:11 +0100 Subject: [PATCH 0809/1679] cmd/internal/obj/s390x: handle RestArgs in s390x assembler Allow up to 3 RestArgs arguments to be specified. This is needed to for us to add the 'rotate and ... bits' instructions, which require 5 arguments, cleanly. Change-Id: I76b89adfb5e3cd85a43023e412f0cc202d489e0b Reviewed-on: https://go-review.googlesource.com/c/go/+/171726 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/internal/obj/s390x/asmz.go | 595 +++++++++++++++-------------- 1 file changed, 302 insertions(+), 293 deletions(-) diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index 1521aa656b..f4f2317e1e 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -32,6 +32,7 @@ package s390x import ( "cmd/internal/obj" "cmd/internal/objabi" + "fmt" "log" "math" "sort" @@ -55,361 +56,362 @@ const ( ) type Optab struct { - as obj.As // opcode - a1 uint8 // From - a2 uint8 // Reg - a3 uint8 // From3 - a4 uint8 // To - type_ int8 + as obj.As // opcode + i uint8 // handler index + a1 uint8 // From + a2 uint8 // Reg + a3 uint8 // RestArgs[0] + a4 uint8 // RestArgs[1] + a5 uint8 // RestArgs[2] + a6 uint8 // To } var optab = []Optab{ - // instruction, From, Reg, From3, To, type - Optab{obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0}, - Optab{obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0}, + // zero-length instructions + Optab{i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE}, + Optab{i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE}, + Optab{i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON}, + Optab{i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR}, + Optab{i: 0, as: obj.ANOP}, + Optab{i: 0, as: obj.ANOP, a1: C_SAUTO}, // move register - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_REG, 1}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 1}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_REG, 1}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 1}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 1}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_REG, 1}, + Optab{i: 1, as: AMOVD, a1: C_REG, a6: C_REG}, + Optab{i: 1, as: AMOVB, a1: C_REG, a6: C_REG}, + Optab{i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG}, + Optab{i: 1, as: AMOVW, a1: C_REG, a6: C_REG}, + Optab{i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG}, + Optab{i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG}, + Optab{i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG}, // load constant - Optab{AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26}, - Optab{AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26}, - Optab{AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26}, - Optab{AMOVD, C_DCON, C_NONE, C_NONE, C_REG, 3}, - Optab{AMOVW, C_DCON, C_NONE, C_NONE, C_REG, 3}, - Optab{AMOVWZ, C_DCON, C_NONE, C_NONE, C_REG, 3}, - Optab{AMOVB, C_DCON, C_NONE, C_NONE, C_REG, 3}, - Optab{AMOVBZ, C_DCON, C_NONE, C_NONE, C_REG, 3}, + Optab{i: 26, as: AMOVD, a1: C_LACON, a6: C_REG}, + Optab{i: 26, as: AMOVW, a1: C_LACON, a6: C_REG}, + Optab{i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG}, + Optab{i: 3, as: AMOVD, a1: C_DCON, a6: C_REG}, + Optab{i: 3, as: AMOVW, a1: C_DCON, a6: C_REG}, + Optab{i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG}, + Optab{i: 3, as: AMOVB, a1: C_DCON, a6: C_REG}, + Optab{i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG}, // store constant - Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LAUTO, 72}, - Optab{AMOVD, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVD, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVW, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVW, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVWZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVB, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVB, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVBZ, C_SCON, C_NONE, C_NONE, C_LOREG, 72}, - Optab{AMOVBZ, C_ADDCON, C_NONE, C_NONE, C_LOREG, 72}, + Optab{i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO}, + Optab{i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG}, + Optab{i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG}, // store - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVDBR, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVHBR, C_REG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74}, - Optab{AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74}, - Optab{AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74}, + Optab{i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO}, + Optab{i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG}, + Optab{i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG}, + Optab{i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR}, + Optab{i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR}, + Optab{i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR}, + Optab{i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR}, + Optab{i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR}, // load - Optab{AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVDBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVHBR, C_LAUTO, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVDBR, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVHBR, C_LOREG, C_NONE, C_NONE, C_REG, 36}, - Optab{AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75}, - Optab{AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75}, - Optab{AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75}, - Optab{AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75}, - Optab{AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 75}, + Optab{i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG}, + Optab{i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG}, + Optab{i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG}, + Optab{i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG}, + Optab{i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG}, + Optab{i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG}, + Optab{i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG}, + Optab{i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG}, // interlocked load and op - Optab{ALAAG, C_REG, C_REG, C_NONE, C_LOREG, 99}, + Optab{i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG}, // integer arithmetic - Optab{AADD, C_REG, C_REG, C_NONE, C_REG, 2}, - Optab{AADD, C_REG, C_NONE, C_NONE, C_REG, 2}, - Optab{AADD, C_LCON, C_REG, C_NONE, C_REG, 22}, - Optab{AADD, C_LCON, C_NONE, C_NONE, C_REG, 22}, - Optab{AADD, C_LOREG, C_NONE, C_NONE, C_REG, 12}, - Optab{AADD, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, - Optab{ASUB, C_LCON, C_REG, C_NONE, C_REG, 21}, - Optab{ASUB, C_LCON, C_NONE, C_NONE, C_REG, 21}, - Optab{ASUB, C_LOREG, C_NONE, C_NONE, C_REG, 12}, - Optab{ASUB, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, - Optab{AMULHD, C_REG, C_NONE, C_NONE, C_REG, 4}, - Optab{AMULHD, C_REG, C_REG, C_NONE, C_REG, 4}, - Optab{ADIVW, C_REG, C_REG, C_NONE, C_REG, 2}, - Optab{ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2}, - Optab{ASUB, C_REG, C_REG, C_NONE, C_REG, 10}, - Optab{ASUB, C_REG, C_NONE, C_NONE, C_REG, 10}, - Optab{ANEG, C_REG, C_NONE, C_NONE, C_REG, 47}, - Optab{ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47}, + Optab{i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 2, as: AADD, a1: C_REG, a6: C_REG}, + Optab{i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG}, + Optab{i: 22, as: AADD, a1: C_LCON, a6: C_REG}, + Optab{i: 12, as: AADD, a1: C_LOREG, a6: C_REG}, + Optab{i: 12, as: AADD, a1: C_LAUTO, a6: C_REG}, + Optab{i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG}, + Optab{i: 21, as: ASUB, a1: C_LCON, a6: C_REG}, + Optab{i: 12, as: ASUB, a1: C_LOREG, a6: C_REG}, + Optab{i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG}, + Optab{i: 4, as: AMULHD, a1: C_REG, a6: C_REG}, + Optab{i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 2, as: ADIVW, a1: C_REG, a6: C_REG}, + Optab{i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 10, as: ASUB, a1: C_REG, a6: C_REG}, + Optab{i: 47, as: ANEG, a1: C_REG, a6: C_REG}, + Optab{i: 47, as: ANEG, a6: C_REG}, // integer logical - Optab{AAND, C_REG, C_REG, C_NONE, C_REG, 6}, - Optab{AAND, C_REG, C_NONE, C_NONE, C_REG, 6}, - Optab{AAND, C_LCON, C_NONE, C_NONE, C_REG, 23}, - Optab{AAND, C_LOREG, C_NONE, C_NONE, C_REG, 12}, - Optab{AAND, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, - Optab{AANDW, C_REG, C_REG, C_NONE, C_REG, 6}, - Optab{AANDW, C_REG, C_NONE, C_NONE, C_REG, 6}, - Optab{AANDW, C_LCON, C_NONE, C_NONE, C_REG, 24}, - Optab{AANDW, C_LOREG, C_NONE, C_NONE, C_REG, 12}, - Optab{AANDW, C_LAUTO, C_NONE, C_NONE, C_REG, 12}, - Optab{ASLD, C_REG, C_NONE, C_NONE, C_REG, 7}, - Optab{ASLD, C_REG, C_REG, C_NONE, C_REG, 7}, - Optab{ASLD, C_SCON, C_REG, C_NONE, C_REG, 7}, - Optab{ASLD, C_SCON, C_NONE, C_NONE, C_REG, 7}, + Optab{i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 6, as: AAND, a1: C_REG, a6: C_REG}, + Optab{i: 23, as: AAND, a1: C_LCON, a6: C_REG}, + Optab{i: 12, as: AAND, a1: C_LOREG, a6: C_REG}, + Optab{i: 12, as: AAND, a1: C_LAUTO, a6: C_REG}, + Optab{i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 6, as: AANDW, a1: C_REG, a6: C_REG}, + Optab{i: 24, as: AANDW, a1: C_LCON, a6: C_REG}, + Optab{i: 12, as: AANDW, a1: C_LOREG, a6: C_REG}, + Optab{i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG}, + Optab{i: 7, as: ASLD, a1: C_REG, a6: C_REG}, + Optab{i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG}, + Optab{i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG}, + Optab{i: 7, as: ASLD, a1: C_SCON, a6: C_REG}, // compare and swap - Optab{ACSG, C_REG, C_REG, C_NONE, C_SOREG, 79}, + Optab{i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG}, // floating point - Optab{AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 32}, - Optab{AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33}, - Optab{AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33}, - Optab{AFMADD, C_FREG, C_FREG, C_NONE, C_FREG, 34}, - Optab{AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32}, - Optab{AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36}, - Optab{AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36}, - Optab{AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35}, - Optab{AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74}, - Optab{AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 67}, - Optab{ALDGR, C_REG, C_NONE, C_NONE, C_FREG, 81}, - Optab{ALGDR, C_FREG, C_NONE, C_NONE, C_REG, 81}, - Optab{ACEFBRA, C_REG, C_NONE, C_NONE, C_FREG, 82}, - Optab{ACFEBRA, C_FREG, C_NONE, C_NONE, C_REG, 83}, - Optab{AFIEBR, C_SCON, C_FREG, C_NONE, C_FREG, 48}, - Optab{ACPSDR, C_FREG, C_FREG, C_NONE, C_FREG, 49}, - Optab{ALTDBR, C_FREG, C_NONE, C_NONE, C_FREG, 50}, - Optab{ATCDB, C_FREG, C_NONE, C_NONE, C_SCON, 51}, + Optab{i: 32, as: AFADD, a1: C_FREG, a6: C_FREG}, + Optab{i: 33, as: AFABS, a1: C_FREG, a6: C_FREG}, + Optab{i: 33, as: AFABS, a6: C_FREG}, + Optab{i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG}, + Optab{i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG}, + Optab{i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG}, + Optab{i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG}, + Optab{i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG}, + Optab{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO}, + Optab{i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG}, + Optab{i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR}, + Optab{i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG}, + Optab{i: 81, as: ALDGR, a1: C_REG, a6: C_FREG}, + Optab{i: 81, as: ALGDR, a1: C_FREG, a6: C_REG}, + Optab{i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG}, + Optab{i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG}, + Optab{i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG}, + Optab{i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG}, + Optab{i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG}, + Optab{i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON}, // load symbol address (plus offset) - Optab{AMOVD, C_SYMADDR, C_NONE, C_NONE, C_REG, 19}, - Optab{AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 93}, - Optab{AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 94}, - Optab{AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 95}, + Optab{i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG}, + Optab{i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG}, + Optab{i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG}, + Optab{i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG}, // system call - Optab{ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5}, - Optab{ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77}, + Optab{i: 5, as: ASYSCALL}, + Optab{i: 77, as: ASYSCALL, a1: C_SCON}, // branch - Optab{ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11}, - Optab{ABC, C_SCON, C_REG, C_NONE, C_LBRA, 16}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_REG, 18}, - Optab{ABR, C_REG, C_NONE, C_NONE, C_REG, 18}, - Optab{ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15}, - Optab{ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15}, - Optab{ACMPBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89}, - Optab{ACMPBEQ, C_REG, C_NONE, C_ADDCON, C_SBRA, 90}, - Optab{ACMPBEQ, C_REG, C_NONE, C_SCON, C_SBRA, 90}, - Optab{ACMPUBEQ, C_REG, C_REG, C_NONE, C_SBRA, 89}, - Optab{ACMPUBEQ, C_REG, C_NONE, C_ANDCON, C_SBRA, 90}, + Optab{i: 16, as: ABEQ, a6: C_SBRA}, + Optab{i: 11, as: ABR, a6: C_LBRA}, + Optab{i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA}, + Optab{i: 18, as: ABR, a6: C_REG}, + Optab{i: 18, as: ABR, a1: C_REG, a6: C_REG}, + Optab{i: 15, as: ABR, a6: C_ZOREG}, + Optab{i: 15, as: ABC, a6: C_ZOREG}, + Optab{i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA}, + Optab{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA}, + Optab{i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA}, + Optab{i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA}, + Optab{i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA}, // move on condition - Optab{AMOVDEQ, C_REG, C_NONE, C_NONE, C_REG, 17}, + Optab{i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG}, // find leftmost one - Optab{AFLOGR, C_REG, C_NONE, C_NONE, C_REG, 8}, + Optab{i: 8, as: AFLOGR, a1: C_REG, a6: C_REG}, // population count - Optab{APOPCNT, C_REG, C_NONE, C_NONE, C_REG, 9}, + Optab{i: 9, as: APOPCNT, a1: C_REG, a6: C_REG}, // compare - Optab{ACMP, C_REG, C_NONE, C_NONE, C_REG, 70}, - Optab{ACMP, C_REG, C_NONE, C_NONE, C_LCON, 71}, - Optab{ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70}, - Optab{ACMPU, C_REG, C_NONE, C_NONE, C_LCON, 71}, - Optab{AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70}, - Optab{AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70}, + Optab{i: 70, as: ACMP, a1: C_REG, a6: C_REG}, + Optab{i: 71, as: ACMP, a1: C_REG, a6: C_LCON}, + Optab{i: 70, as: ACMPU, a1: C_REG, a6: C_REG}, + Optab{i: 71, as: ACMPU, a1: C_REG, a6: C_LCON}, + Optab{i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG}, + Optab{i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG}, // test under mask - Optab{ATMHH, C_REG, C_NONE, C_NONE, C_ANDCON, 91}, + Optab{i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON}, // insert program mask - Optab{AIPM, C_REG, C_NONE, C_NONE, C_NONE, 92}, + Optab{i: 92, as: AIPM, a1: C_REG}, // 32-bit access registers - Optab{AMOVW, C_AREG, C_NONE, C_NONE, C_REG, 68}, - Optab{AMOVWZ, C_AREG, C_NONE, C_NONE, C_REG, 68}, - Optab{AMOVW, C_REG, C_NONE, C_NONE, C_AREG, 69}, - Optab{AMOVWZ, C_REG, C_NONE, C_NONE, C_AREG, 69}, + Optab{i: 68, as: AMOVW, a1: C_AREG, a6: C_REG}, + Optab{i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG}, + Optab{i: 69, as: AMOVW, a1: C_REG, a6: C_AREG}, + Optab{i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG}, // macros - Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LOREG, 96}, - Optab{ACLEAR, C_LCON, C_NONE, C_NONE, C_LAUTO, 96}, + Optab{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG}, + Optab{i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO}, // load/store multiple - Optab{ASTMG, C_REG, C_REG, C_NONE, C_LOREG, 97}, - Optab{ASTMG, C_REG, C_REG, C_NONE, C_LAUTO, 97}, - Optab{ALMG, C_LOREG, C_REG, C_NONE, C_REG, 98}, - Optab{ALMG, C_LAUTO, C_REG, C_NONE, C_REG, 98}, + Optab{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG}, + Optab{i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO}, + Optab{i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG}, + Optab{i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG}, // bytes - Optab{ABYTE, C_SCON, C_NONE, C_NONE, C_NONE, 40}, - Optab{AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40}, - Optab{ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31}, - Optab{ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31}, + Optab{i: 40, as: ABYTE, a1: C_SCON}, + Optab{i: 40, as: AWORD, a1: C_LCON}, + Optab{i: 31, as: ADWORD, a1: C_LCON}, + Optab{i: 31, as: ADWORD, a1: C_DCON}, // fast synchronization - Optab{ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 80}, + Optab{i: 80, as: ASYNC}, // store clock - Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SAUTO, 88}, - Optab{ASTCK, C_NONE, C_NONE, C_NONE, C_SOREG, 88}, + Optab{i: 88, as: ASTCK, a6: C_SAUTO}, + Optab{i: 88, as: ASTCK, a6: C_SOREG}, // storage and storage - Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LOREG, 84}, - Optab{AMVC, C_SCON, C_NONE, C_LOREG, C_LAUTO, 84}, - Optab{AMVC, C_SCON, C_NONE, C_LAUTO, C_LAUTO, 84}, + Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG}, + Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO}, + Optab{i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO}, // address - Optab{ALARL, C_LCON, C_NONE, C_NONE, C_REG, 85}, - Optab{ALARL, C_SYMADDR, C_NONE, C_NONE, C_REG, 85}, - Optab{ALA, C_SOREG, C_NONE, C_NONE, C_REG, 86}, - Optab{ALA, C_SAUTO, C_NONE, C_NONE, C_REG, 86}, - Optab{AEXRL, C_SYMADDR, C_NONE, C_NONE, C_REG, 87}, - - // misc - Optab{obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78}, - Optab{obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0}, - Optab{obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0}, - Optab{obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0}, - Optab{obj.ANOP, C_SAUTO, C_NONE, C_NONE, C_NONE, 0}, + Optab{i: 85, as: ALARL, a1: C_LCON, a6: C_REG}, + Optab{i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG}, + Optab{i: 86, as: ALA, a1: C_SOREG, a6: C_REG}, + Optab{i: 86, as: ALA, a1: C_SAUTO, a6: C_REG}, + Optab{i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG}, + + // undefined (deliberate illegal instruction) + Optab{i: 78, as: obj.AUNDEF}, // vector instructions // VRX store - Optab{AVST, C_VREG, C_NONE, C_NONE, C_SOREG, 100}, - Optab{AVST, C_VREG, C_NONE, C_NONE, C_SAUTO, 100}, - Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SOREG, 100}, - Optab{AVSTEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 100}, + Optab{i: 100, as: AVST, a1: C_VREG, a6: C_SOREG}, + Optab{i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO}, + Optab{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG}, + Optab{i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO}, // VRX load - Optab{AVL, C_SOREG, C_NONE, C_NONE, C_VREG, 101}, - Optab{AVL, C_SAUTO, C_NONE, C_NONE, C_VREG, 101}, - Optab{AVLEG, C_SCON, C_NONE, C_SOREG, C_VREG, 101}, - Optab{AVLEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 101}, + Optab{i: 101, as: AVL, a1: C_SOREG, a6: C_VREG}, + Optab{i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG}, + Optab{i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG}, + Optab{i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG}, // VRV scatter - Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SOREG, 102}, - Optab{AVSCEG, C_SCON, C_VREG, C_NONE, C_SAUTO, 102}, + Optab{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG}, + Optab{i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO}, // VRV gather - Optab{AVGEG, C_SCON, C_NONE, C_SOREG, C_VREG, 103}, - Optab{AVGEG, C_SCON, C_NONE, C_SAUTO, C_VREG, 103}, + Optab{i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG}, + Optab{i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG}, // VRS element shift/rotate and load gr to/from vr element - Optab{AVESLG, C_SCON, C_VREG, C_NONE, C_VREG, 104}, - Optab{AVESLG, C_REG, C_VREG, C_NONE, C_VREG, 104}, - Optab{AVESLG, C_SCON, C_NONE, C_NONE, C_VREG, 104}, - Optab{AVESLG, C_REG, C_NONE, C_NONE, C_VREG, 104}, - Optab{AVLGVG, C_SCON, C_VREG, C_NONE, C_REG, 104}, - Optab{AVLGVG, C_REG, C_VREG, C_NONE, C_REG, 104}, - Optab{AVLVGG, C_SCON, C_REG, C_NONE, C_VREG, 104}, - Optab{AVLVGG, C_REG, C_REG, C_NONE, C_VREG, 104}, + Optab{i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG}, + Optab{i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG}, + Optab{i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG}, + Optab{i: 104, as: AVESLG, a1: C_REG, a6: C_VREG}, + Optab{i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG}, + Optab{i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG}, + Optab{i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG}, + Optab{i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG}, // VRS store multiple - Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SOREG, 105}, - Optab{AVSTM, C_VREG, C_VREG, C_NONE, C_SAUTO, 105}, + Optab{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG}, + Optab{i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO}, // VRS load multiple - Optab{AVLM, C_SOREG, C_VREG, C_NONE, C_VREG, 106}, - Optab{AVLM, C_SAUTO, C_VREG, C_NONE, C_VREG, 106}, + Optab{i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG}, + Optab{i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG}, // VRS store with length - Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SOREG, 107}, - Optab{AVSTL, C_REG, C_VREG, C_NONE, C_SAUTO, 107}, + Optab{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG}, + Optab{i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO}, // VRS load with length - Optab{AVLL, C_REG, C_NONE, C_SOREG, C_VREG, 108}, - Optab{AVLL, C_REG, C_NONE, C_SAUTO, C_VREG, 108}, + Optab{i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG}, + Optab{i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG}, // VRI-a - Optab{AVGBM, C_ANDCON, C_NONE, C_NONE, C_VREG, 109}, - Optab{AVZERO, C_NONE, C_NONE, C_NONE, C_VREG, 109}, - Optab{AVREPIG, C_ADDCON, C_NONE, C_NONE, C_VREG, 109}, - Optab{AVREPIG, C_SCON, C_NONE, C_NONE, C_VREG, 109}, - Optab{AVLEIG, C_SCON, C_NONE, C_ADDCON, C_VREG, 109}, - Optab{AVLEIG, C_SCON, C_NONE, C_SCON, C_VREG, 109}, + Optab{i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG}, + Optab{i: 109, as: AVZERO, a6: C_VREG}, + Optab{i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG}, + Optab{i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG}, + Optab{i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG}, + Optab{i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG}, // VRI-b generate mask - Optab{AVGMG, C_SCON, C_NONE, C_SCON, C_VREG, 110}, + Optab{i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG}, // VRI-c replicate - Optab{AVREPG, C_UCON, C_VREG, C_NONE, C_VREG, 111}, + Optab{i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG}, // VRI-d element rotate and insert under mask and // shift left double by byte - Optab{AVERIMG, C_SCON, C_VREG, C_VREG, C_VREG, 112}, - Optab{AVSLDB, C_SCON, C_VREG, C_VREG, C_VREG, 112}, + Optab{i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG}, + Optab{i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG}, // VRI-d fp test data class immediate - Optab{AVFTCIDB, C_SCON, C_VREG, C_NONE, C_VREG, 113}, + Optab{i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG}, // VRR-a load reg - Optab{AVLR, C_VREG, C_NONE, C_NONE, C_VREG, 114}, + Optab{i: 114, as: AVLR, a1: C_VREG, a6: C_VREG}, // VRR-a compare - Optab{AVECG, C_VREG, C_NONE, C_NONE, C_VREG, 115}, + Optab{i: 115, as: AVECG, a1: C_VREG, a6: C_VREG}, // VRR-b - Optab{AVCEQG, C_VREG, C_VREG, C_NONE, C_VREG, 117}, - Optab{AVFAEF, C_VREG, C_VREG, C_NONE, C_VREG, 117}, - Optab{AVPKSG, C_VREG, C_VREG, C_NONE, C_VREG, 117}, + Optab{i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG}, + Optab{i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG}, + Optab{i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG}, // VRR-c - Optab{AVAQ, C_VREG, C_VREG, C_NONE, C_VREG, 118}, - Optab{AVAQ, C_VREG, C_NONE, C_NONE, C_VREG, 118}, - Optab{AVNOT, C_VREG, C_NONE, C_NONE, C_VREG, 118}, - Optab{AVPDI, C_SCON, C_VREG, C_VREG, C_VREG, 123}, + Optab{i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG}, + Optab{i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG}, + Optab{i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG}, + Optab{i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG}, // VRR-c shifts - Optab{AVERLLVG, C_VREG, C_VREG, C_NONE, C_VREG, 119}, - Optab{AVERLLVG, C_VREG, C_NONE, C_NONE, C_VREG, 119}, + Optab{i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG}, + Optab{i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG}, // VRR-d - // 2 3 1 4 - Optab{AVACQ, C_VREG, C_VREG, C_VREG, C_VREG, 120}, + Optab{i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG}, // VRR-e - Optab{AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 121}, + Optab{i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG}, // VRR-f - Optab{AVLVGP, C_REG, C_REG, C_NONE, C_VREG, 122}, + Optab{i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG}, } var oprange [ALAST & obj.AMask][]Optab @@ -652,62 +654,69 @@ func (c *ctxtz) aclass(a *obj.Addr) int { } func (c *ctxtz) oplook(p *obj.Prog) *Optab { - a1 := int(p.Optab) - if a1 != 0 { - return &optab[a1-1] + // Return cached optab entry if available. + if p.Optab != 0 { + return &optab[p.Optab-1] } - a1 = int(p.From.Class) - if a1 == 0 { - a1 = c.aclass(&p.From) + 1 - p.From.Class = int8(a1) + if len(p.RestArgs) > 3 { + c.ctxt.Diag("too many RestArgs: got %v, maximum is 3\n", len(p.RestArgs)) + return nil } - a1-- - a3 := C_NONE + 1 - if p.GetFrom3() != nil { - a3 = int(p.GetFrom3().Class) - if a3 == 0 { - a3 = c.aclass(p.GetFrom3()) + 1 - p.GetFrom3().Class = int8(a3) - } + // Initialize classes for all arguments. + p.From.Class = int8(c.aclass(&p.From) + 1) + p.To.Class = int8(c.aclass(&p.To) + 1) + for i := range p.RestArgs { + p.RestArgs[i].Class = int8(c.aclass(&p.RestArgs[i]) + 1) } - a3-- - a4 := int(p.To.Class) - if a4 == 0 { - a4 = c.aclass(&p.To) + 1 - p.To.Class = int8(a4) + // Mirrors the argument list in Optab. + args := [...]int8{ + p.From.Class - 1, + C_NONE, // p.Reg + C_NONE, // p.RestArgs[0] + C_NONE, // p.RestArgs[1] + C_NONE, // p.RestArgs[2] + p.To.Class - 1, } - - a4-- - a2 := C_NONE - if p.Reg != 0 { - if REG_R0 <= p.Reg && p.Reg <= REG_R15 { - a2 = C_REG - } else if REG_V0 <= p.Reg && p.Reg <= REG_V31 { - a2 = C_VREG - } else if REG_F0 <= p.Reg && p.Reg <= REG_F15 { - a2 = C_FREG - } else if REG_AR0 <= p.Reg && p.Reg <= REG_AR15 { - a2 = C_AREG - } + // Fill in argument class for p.Reg. + switch { + case REG_R0 <= p.Reg && p.Reg <= REG_R15: + args[1] = C_REG + case REG_V0 <= p.Reg && p.Reg <= REG_V31: + args[1] = C_VREG + case REG_F0 <= p.Reg && p.Reg <= REG_F15: + args[1] = C_FREG + case REG_AR0 <= p.Reg && p.Reg <= REG_AR15: + args[1] = C_AREG + } + // Fill in argument classes for p.RestArgs. + for i, a := range p.RestArgs { + args[2+i] = a.Class - 1 } + // Lookup op in optab. ops := oprange[p.As&obj.AMask] - c1 := &xcmp[a1] - c2 := &xcmp[a2] - c3 := &xcmp[a3] - c4 := &xcmp[a4] + cmp := [len(args)]*[C_NCLASS]bool{} + for i := range cmp { + cmp[i] = &xcmp[args[i]] + } for i := range ops { op := &ops[i] - if (int(op.a2) == a2 || c2[op.a2]) && c4[op.a4] && c1[op.a1] && c3[op.a3] { + if cmp[0][op.a1] && cmp[1][op.a2] && + cmp[2][op.a3] && cmp[3][op.a4] && + cmp[4][op.a5] && cmp[5][op.a6] { p.Optab = uint16(cap(optab) - cap(ops) + i + 1) return op } } - // cannot find a case; abort - c.ctxt.Diag("illegal combination %v %v %v %v %v\n", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4)) + // Cannot find a case; abort. + s := "" + for _, a := range args { + s += fmt.Sprintf(" %v", DRconv(int(a))) + } + c.ctxt.Diag("illegal combination %v%v\n", p.As, s) c.ctxt.Diag("prog: %v\n", p) return nil } @@ -2624,9 +2633,9 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { return } - switch o.type_ { + switch o.i { default: - c.ctxt.Diag("unknown type %d", o.type_) + c.ctxt.Diag("unknown index %d", o.i) case 0: // PSEUDO OPS break -- GitLab From 0f79510dc5d2e586924dae6e531529fe5fa7cbd2 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Thu, 24 Jan 2019 16:16:41 +0000 Subject: [PATCH 0810/1679] cmd/asm: add s390x 'rotate then ... selected bits' instructions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds the following instructions, useful for shifting/rotating and masking operations: * RNSBG - rotate then and selected bits * ROSBG - rotate then or selected bits * RXSBG - rotate then exclusive or selected bits * RISBG - rotate then insert selected bits It also adds the 'T' (test), 'Z' (zero), 'H' (high), 'L' (low) and 'N' (no test) variants of these instructions as appropriate. Operands are ordered as: I₃, I₄, I₅, R₂, R₁. Key: I₃=start, I₄=end, I₅=amount, R₂=source, R₁=destination Change-Id: I200d12287e1df7447f37f4919da5e9a93d27c792 Reviewed-on: https://go-review.googlesource.com/c/go/+/159357 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/asm/internal/asm/asm.go | 6 +++ src/cmd/asm/internal/asm/testdata/s390x.s | 15 ++++++++ src/cmd/internal/obj/s390x/a.out.go | 14 +++++++ src/cmd/internal/obj/s390x/anames.go | 14 +++++++ src/cmd/internal/obj/s390x/asmz.go | 46 +++++++++++++++++++++++ 5 files changed, 95 insertions(+) diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go index 3d99af6889..d83cfb2284 100644 --- a/src/cmd/asm/internal/asm/asm.go +++ b/src/cmd/asm/internal/asm/asm.go @@ -789,6 +789,12 @@ func (p *Parser) asmInstruction(op obj.As, cond string, a []obj.Addr) { prog.To = a[4] break } + if p.arch.Family == sys.S390X { + prog.From = a[0] + prog.RestArgs = []obj.Addr{a[1], a[2], a[3]} + prog.To = a[4] + break + } p.errorf("can't handle %s instruction with 5 operands", op) return case 6: diff --git a/src/cmd/asm/internal/asm/testdata/s390x.s b/src/cmd/asm/internal/asm/testdata/s390x.s index fbe1203aaa..713ad12aca 100644 --- a/src/cmd/asm/internal/asm/testdata/s390x.s +++ b/src/cmd/asm/internal/asm/testdata/s390x.s @@ -182,6 +182,21 @@ TEXT main·foo(SB),DUPOK|NOSPLIT,$16-0 // TEXT main.foo(SB), DUPOK|NOSPLIT, $16- XORW (R1), R2 // 57201000 XORW -1(R1), R2 // e3201fffff57 + RNSBG $0, $31, $32, R1, R2 // ec21001f2054 + RXSBG $17, $8, $16, R3, R4 // ec4311081057 + ROSBG $9, $24, $11, R5, R6 // ec6509180b56 + RNSBGT $0, $31, $32, R7, R8 // ec87801f2054 + RXSBGT $17, $8, $16, R9, R10 // eca991081057 + ROSBGT $9, $24, $11, R11, R0 // ec0b89180b56 + RISBG $0, $31, $32, R1, R2 // ec21001f2055 + RISBGN $17, $8, $16, R3, R4 // ec4311081059 + RISBGZ $9, $24, $11, R5, R6 // ec6509980b55 + RISBGNZ $0, $31, $32, R7, R8 // ec87009f2059 + RISBHG $17, $8, $16, R9, R10 // eca91108105d + RISBLG $9, $24, $11, R11, R0 // ec0b09180b51 + RISBHGZ $17, $8, $16, R9, R10 // eca91188105d + RISBLGZ $9, $24, $11, R11, R0 // ec0b09980b51 + LAA R1, R2, 524287(R3) // eb213fff7ff8 LAAG R4, R5, -524288(R6) // eb54600080e8 LAAL R7, R8, 8192(R9) // eb87900002fa diff --git a/src/cmd/internal/obj/s390x/a.out.go b/src/cmd/internal/obj/s390x/a.out.go index fb246cbc47..d11a3834b0 100644 --- a/src/cmd/internal/obj/s390x/a.out.go +++ b/src/cmd/internal/obj/s390x/a.out.go @@ -289,6 +289,20 @@ const ( ASRAD ARLL ARLLG + ARNSBG + ARXSBG + AROSBG + ARNSBGT + ARXSBGT + AROSBGT + ARISBG + ARISBGN + ARISBGZ + ARISBGNZ + ARISBHG + ARISBLG + ARISBHGZ + ARISBLGZ // floating point AFABS diff --git a/src/cmd/internal/obj/s390x/anames.go b/src/cmd/internal/obj/s390x/anames.go index 3a21e90ab1..a9bdfcafe9 100644 --- a/src/cmd/internal/obj/s390x/anames.go +++ b/src/cmd/internal/obj/s390x/anames.go @@ -60,6 +60,20 @@ var Anames = []string{ "SRAD", "RLL", "RLLG", + "RNSBG", + "RXSBG", + "ROSBG", + "RNSBGT", + "RXSBGT", + "ROSBGT", + "RISBG", + "RISBGN", + "RISBGZ", + "RISBGNZ", + "RISBHG", + "RISBLG", + "RISBHGZ", + "RISBLGZ", "FABS", "FADD", "FADDS", diff --git a/src/cmd/internal/obj/s390x/asmz.go b/src/cmd/internal/obj/s390x/asmz.go index f4f2317e1e..5cd4dca2a2 100644 --- a/src/cmd/internal/obj/s390x/asmz.go +++ b/src/cmd/internal/obj/s390x/asmz.go @@ -196,6 +196,7 @@ var optab = []Optab{ Optab{i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG}, Optab{i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG}, Optab{i: 7, as: ASLD, a1: C_SCON, a6: C_REG}, + Optab{i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG}, // compare and swap Optab{i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG}, @@ -953,6 +954,20 @@ func buildop(ctxt *obj.Link) { opset(ASRAW, r) opset(ARLL, r) opset(ARLLG, r) + case ARNSBG: + opset(ARXSBG, r) + opset(AROSBG, r) + opset(ARNSBGT, r) + opset(ARXSBGT, r) + opset(AROSBGT, r) + opset(ARISBG, r) + opset(ARISBGN, r) + opset(ARISBGZ, r) + opset(ARISBGNZ, r) + opset(ARISBHG, r) + opset(ARISBLG, r) + opset(ARISBHGZ, r) + opset(ARISBLGZ, r) case ACSG: opset(ACS, r) case ASUB: @@ -2993,6 +3008,37 @@ func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) { zRXY(opxy, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm) } + case 13: // rotate, followed by operation + r1 := p.To.Reg + r2 := p.RestArgs[2].Reg + i3 := uint8(p.From.Offset) // start + i4 := uint8(p.RestArgs[0].Offset) // end + i5 := uint8(p.RestArgs[1].Offset) // rotate amount + switch p.As { + case ARNSBGT, ARXSBGT, AROSBGT: + i3 |= 0x80 // test-results + case ARISBGZ, ARISBGNZ, ARISBHGZ, ARISBLGZ: + i4 |= 0x80 // zero-remaining-bits + } + var opcode uint32 + switch p.As { + case ARNSBG, ARNSBGT: + opcode = op_RNSBG + case ARXSBG, ARXSBGT: + opcode = op_RXSBG + case AROSBG, AROSBGT: + opcode = op_ROSBG + case ARISBG, ARISBGZ: + opcode = op_RISBG + case ARISBGN, ARISBGNZ: + opcode = op_RISBGN + case ARISBHG, ARISBHGZ: + opcode = op_RISBHG + case ARISBLG, ARISBLGZ: + opcode = op_RISBLG + } + zRIE(_f, uint32(opcode), uint32(r1), uint32(r2), 0, uint32(i3), uint32(i4), 0, uint32(i5), asm) + case 15: // br/bl (reg) r := p.To.Reg if p.As == ABCL || p.As == ABL { -- GitLab From 36b0593f79c17c45985b17239e5f65d13da49949 Mon Sep 17 00:00:00 2001 From: Ivan Osadchiy Date: Sat, 13 Apr 2019 16:55:24 +0300 Subject: [PATCH 0811/1679] crypto/sha256: Use bits.RotateLeft32 instead of ad-hoc implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improves readability of the generic implementation. Updates #31456. Benchmarks (i7-4980HQ CPU) name old time/op new time/op delta Hash8Bytes-8 339ns ± 3% 337ns ± 2% ~ (p=0.595 n=5+5) Hash1K-8 5.12µs ± 6% 4.97µs ± 6% ~ (p=0.310 n=5+5) Hash8K-8 37.6µs ± 5% 38.1µs ± 6% ~ (p=0.841 n=5+5) name old speed new speed delta Hash8Bytes-8 23.6MB/s ± 3% 23.8MB/s ± 3% ~ (p=0.690 n=5+5) Hash1K-8 200MB/s ± 6% 206MB/s ± 5% ~ (p=0.310 n=5+5) Hash8K-8 218MB/s ± 5% 215MB/s ± 6% ~ (p=0.841 n=5+5) Change-Id: Ic488841699138efde76e900bce1dd38fdbc88ec6 Reviewed-on: https://go-review.googlesource.com/c/go/+/171731 Reviewed-by: Ilya Tokar Run-TryBot: Ilya Tokar TryBot-Result: Gobot Gobot --- src/crypto/sha256/sha256block.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/crypto/sha256/sha256block.go b/src/crypto/sha256/sha256block.go index d43bbf0245..bd2f9da93c 100644 --- a/src/crypto/sha256/sha256block.go +++ b/src/crypto/sha256/sha256block.go @@ -8,6 +8,8 @@ package sha256 +import "math/bits" + var _K = []uint32{ 0x428a2f98, 0x71374491, @@ -87,18 +89,18 @@ func blockGeneric(dig *digest, p []byte) { } for i := 16; i < 64; i++ { v1 := w[i-2] - t1 := (v1>>17 | v1<<(32-17)) ^ (v1>>19 | v1<<(32-19)) ^ (v1 >> 10) + t1 := (bits.RotateLeft32(v1, -17)) ^ (bits.RotateLeft32(v1, -19)) ^ (v1 >> 10) v2 := w[i-15] - t2 := (v2>>7 | v2<<(32-7)) ^ (v2>>18 | v2<<(32-18)) ^ (v2 >> 3) + t2 := (bits.RotateLeft32(v2, -7)) ^ (bits.RotateLeft32(v2, -18)) ^ (v2 >> 3) w[i] = t1 + w[i-7] + t2 + w[i-16] } a, b, c, d, e, f, g, h := h0, h1, h2, h3, h4, h5, h6, h7 for i := 0; i < 64; i++ { - t1 := h + ((e>>6 | e<<(32-6)) ^ (e>>11 | e<<(32-11)) ^ (e>>25 | e<<(32-25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] + t1 := h + ((bits.RotateLeft32(e, -6)) ^ (bits.RotateLeft32(e, -11)) ^ (bits.RotateLeft32(e, -25))) + ((e & f) ^ (^e & g)) + _K[i] + w[i] - t2 := ((a>>2 | a<<(32-2)) ^ (a>>13 | a<<(32-13)) ^ (a>>22 | a<<(32-22))) + ((a & b) ^ (a & c) ^ (b & c)) + t2 := ((bits.RotateLeft32(a, -2)) ^ (bits.RotateLeft32(a, -13)) ^ (bits.RotateLeft32(a, -22))) + ((a & b) ^ (a & c) ^ (b & c)) h = g g = f -- GitLab From b39d0eab902cb6b90aa99bcf11ca622c00219c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Tue, 16 Apr 2019 14:19:18 +0200 Subject: [PATCH 0812/1679] syscall: move helper handler before AIX handler in TestPassFD The AIX special handler which skips this test if unix network isn't supported, doesn't need to be called inside the helper process. Change-Id: I7ff2c4e6b20eceb977380294858cae63034ffe0d Reviewed-on: https://go-review.googlesource.com/c/go/+/172160 Run-TryBot: Tobias Klauser TryBot-Result: Gobot Gobot Reviewed-by: Tobias Klauser --- src/syscall/syscall_unix_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/syscall/syscall_unix_test.go b/src/syscall/syscall_unix_test.go index 3462fb2446..62109ac3e7 100644 --- a/src/syscall/syscall_unix_test.go +++ b/src/syscall/syscall_unix_test.go @@ -132,6 +132,11 @@ func TestFcntlFlock(t *testing.T) { func TestPassFD(t *testing.T) { testenv.MustHaveExec(t) + if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { + passFDChild() + return + } + if runtime.GOOS == "aix" { // Unix network isn't properly working on AIX 7.2 with Technical Level < 2 out, err := exec.Command("oslevel", "-s").Output() @@ -152,11 +157,6 @@ func TestPassFD(t *testing.T) { } - if os.Getenv("GO_WANT_HELPER_PROCESS") == "1" { - passFDChild() - return - } - tempDir, err := ioutil.TempDir("", "TestPassFD") if err != nil { t.Fatal(err) -- GitLab From 9b968df17782f21cc0af14c9d3c0bcf4cf3f911f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 15 Apr 2019 23:10:50 +0900 Subject: [PATCH 0813/1679] all: clean up code with token.IsExported MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A handful of packages were reimplementing IsExported, so use token.IsExported instead. This caused the deps test to fail for net/rpc. However, net/rpc deals with Go types, and go/token is light and fairly low-level in terms of Go tooling packages, so that's okay. While at it, replace all uses of ast.IsExported with token.IsExported. This is more consistent, and also means that the import graphs are leaner. A couple of files no longer need to import go/ast, for example. We can't get rid of cmd/compile/internal/types.IsExported, as the compiler can only depend on go/token as of Go 1.4. However, gc used different implementations in a couple of places, so consolidate the use of types.IsExported there. Finally, we can't get rid of the copied IsExported implementation in encoding/gob, as go/token depends on it as part of a test. That test can't be an external test either, so there's no easy way to break the import cycle. Overall, this removes about forty lines of unnecessary code. Change-Id: I86a475b7614261e6a7b0b153d5ca02b9f64a7b2d Reviewed-on: https://go-review.googlesource.com/c/go/+/172037 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/api/goapi.go | 2 +- src/cmd/compile/internal/gc/dump.go | 9 +-------- src/cmd/compile/internal/gc/iexport.go | 3 +-- src/cmd/doc/main.go | 14 +++----------- src/go/build/deps_test.go | 2 +- src/go/doc/exports.go | 12 ++++++------ src/go/doc/reader.go | 4 ++-- src/go/internal/gcimporter/bimport.go | 11 ++--------- src/go/types/object.go | 5 ++--- src/net/http/response_test.go | 4 ++-- src/net/rpc/server.go | 13 +++---------- src/reflect/all_test.go | 13 ++----------- 12 files changed, 26 insertions(+), 66 deletions(-) diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index 1a0242f60c..b728baea1d 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -241,7 +241,7 @@ func (w *Walker) export(pkg *types.Package) { w.current = pkg scope := pkg.Scope() for _, name := range scope.Names() { - if ast.IsExported(name) { + if token.IsExported(name) { w.emitObj(scope.Lookup(name)) } } diff --git a/src/cmd/compile/internal/gc/dump.go b/src/cmd/compile/internal/gc/dump.go index 8de90adf05..29eb1c1e48 100644 --- a/src/cmd/compile/internal/gc/dump.go +++ b/src/cmd/compile/internal/gc/dump.go @@ -16,8 +16,6 @@ import ( "os" "reflect" "regexp" - "unicode" - "unicode/utf8" ) // dump is like fdump but prints to stderr. @@ -216,7 +214,7 @@ func (p *dumper) dump(x reflect.Value, depth int) { for i, n := 0, typ.NumField(); i < n; i++ { // Exclude non-exported fields because their // values cannot be accessed via reflection. - if name := typ.Field(i).Name; isExported(name) { + if name := typ.Field(i).Name; types.IsExported(name) { if !p.fieldrx.MatchString(name) { omitted = true continue // field name not selected by filter @@ -274,11 +272,6 @@ func isZeroVal(x reflect.Value) bool { return false } -func isExported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - func commonPrefixLen(a, b string) (i int) { for i < len(a) && i < len(b) && a[i] == b[i] { i++ diff --git a/src/cmd/compile/internal/gc/iexport.go b/src/cmd/compile/internal/gc/iexport.go index d50d3e9400..93099bfe3d 100644 --- a/src/cmd/compile/internal/gc/iexport.go +++ b/src/cmd/compile/internal/gc/iexport.go @@ -206,7 +206,6 @@ import ( "cmd/internal/src" "encoding/binary" "fmt" - "go/ast" "io" "math/big" "strings" @@ -1400,7 +1399,7 @@ func (w *exportWriter) localIdent(s *types.Sym, v int32) { name = fmt.Sprintf("%s·%d", name, v) } - if !ast.IsExported(name) && s.Pkg != w.currPkg { + if !types.IsExported(name) && s.Pkg != w.currPkg { Fatalf("weird package in name: %v => %v, not %q", s, name, w.currPkg.Path) } diff --git a/src/cmd/doc/main.go b/src/cmd/doc/main.go index 9b24c5874f..9e3ad0c0e7 100644 --- a/src/cmd/doc/main.go +++ b/src/cmd/doc/main.go @@ -49,8 +49,6 @@ import ( "path" "path/filepath" "strings" - "unicode" - "unicode/utf8" ) var ( @@ -235,7 +233,7 @@ func parseArgs(args []string) (pkg *build.Package, path, symbol string, more boo // case letter, it can only be a symbol in the current directory. // Kills the problem caused by case-insensitive file systems // matching an upper case name as a package name. - if isUpper(arg) { + if token.IsExported(arg) { pkg, err := build.ImportDir(".", build.ImportComment) if err == nil { return pkg, "", arg, false @@ -352,19 +350,13 @@ func parseSymbol(str string) (symbol, method string) { // If the unexported flag (-u) is true, isExported returns true because // it means that we treat the name as if it is exported. func isExported(name string) bool { - return unexported || isUpper(name) -} - -// isUpper reports whether the name starts with an upper case letter. -func isUpper(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) + return unexported || token.IsExported(name) } // findNextPackage returns the next full file name path that matches the // (perhaps partial) package path pkg. The boolean reports if any match was found. func findNextPackage(pkg string) (string, bool) { - if pkg == "" || isUpper(pkg) { // Upper case symbol cannot be a package name. + if pkg == "" || token.IsExported(pkg) { // Upper case symbol cannot be a package name. return "", false } if filepath.IsAbs(pkg) { diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 853a7e64c8..c81d313b72 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -443,7 +443,7 @@ var pkgDeps = map[string][]string{ }, "net/http/httputil": {"L4", "NET", "OS", "context", "net/http", "net/http/internal", "golang.org/x/net/http/httpguts"}, "net/http/pprof": {"L4", "OS", "html/template", "net/http", "runtime/pprof", "runtime/trace"}, - "net/rpc": {"L4", "NET", "encoding/gob", "html/template", "net/http"}, + "net/rpc": {"L4", "NET", "encoding/gob", "html/template", "net/http", "go/token"}, "net/rpc/jsonrpc": {"L4", "NET", "encoding/json", "net/rpc"}, } diff --git a/src/go/doc/exports.go b/src/go/doc/exports.go index 5f99bf7772..819c030c9b 100644 --- a/src/go/doc/exports.go +++ b/src/go/doc/exports.go @@ -17,7 +17,7 @@ import ( func filterIdentList(list []*ast.Ident) []*ast.Ident { j := 0 for _, x := range list { - if ast.IsExported(x.Name) { + if token.IsExported(x.Name) { list[j] = x j++ } @@ -59,7 +59,7 @@ func filterExprList(list []ast.Expr, filter Filter, export bool) []ast.Expr { // and reports whether at least one exported name exists. func updateIdentList(list []*ast.Ident) (hasExported bool) { for i, x := range list { - if ast.IsExported(x.Name) { + if token.IsExported(x.Name) { hasExported = true } else { list[i] = underscore @@ -121,7 +121,7 @@ func (r *reader) filterFieldList(parent *namedType, fields *ast.FieldList, ityp if n := len(field.Names); n == 0 { // anonymous field fname := r.recordAnonymousField(parent, field.Type) - if ast.IsExported(fname) { + if token.IsExported(fname) { keepField = true } else if ityp != nil && fname == "error" { // possibly the predeclared error interface; keep @@ -199,7 +199,7 @@ func (r *reader) filterSpec(spec ast.Spec) bool { // always keep imports so we can collect them return true case *ast.ValueSpec: - s.Values = filterExprList(s.Values, ast.IsExported, true) + s.Values = filterExprList(s.Values, token.IsExported, true) if len(s.Values) > 0 || s.Type == nil && len(s.Values) == 0 { // If there are values declared on RHS, just replace the unexported // identifiers on the LHS with underscore, so that it matches @@ -219,7 +219,7 @@ func (r *reader) filterSpec(spec ast.Spec) bool { } } case *ast.TypeSpec: - if name := s.Name.Name; ast.IsExported(name) { + if name := s.Name.Name; token.IsExported(name) { r.filterType(r.lookupType(s.Name.Name), s.Type) return true } else if name == "error" { @@ -290,7 +290,7 @@ func (r *reader) filterDecl(decl ast.Decl) bool { // conflicting method will be filtered here, too - // thus, removing these methods early will not lead // to the false removal of possible conflicts - return ast.IsExported(d.Name.Name) + return token.IsExported(d.Name.Name) } return false } diff --git a/src/go/doc/reader.go b/src/go/doc/reader.go index 49d2af771a..c277b35e89 100644 --- a/src/go/doc/reader.go +++ b/src/go/doc/reader.go @@ -169,7 +169,7 @@ type reader struct { } func (r *reader) isVisible(name string) bool { - return r.mode&AllDecls != 0 || ast.IsExported(name) + return r.mode&AllDecls != 0 || token.IsExported(name) } // lookupType returns the base type with the given name. @@ -833,7 +833,7 @@ func sortedFuncs(m methodSet, allMethods bool) []*Func { switch { case m.Decl == nil: // exclude conflict entry - case allMethods, m.Level == 0, !ast.IsExported(removeStar(m.Orig)): + case allMethods, m.Level == 0, !token.IsExported(removeStar(m.Orig)): // forced inclusion, method not embedded, or method // embedded but original receiver type not exported list[i] = m diff --git a/src/go/internal/gcimporter/bimport.go b/src/go/internal/gcimporter/bimport.go index 4e3023b906..cf03632aa2 100644 --- a/src/go/internal/gcimporter/bimport.go +++ b/src/go/internal/gcimporter/bimport.go @@ -14,8 +14,6 @@ import ( "strconv" "strings" "sync" - "unicode" - "unicode/utf8" ) type importer struct { @@ -446,7 +444,7 @@ func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type { // TODO(gri) replace this with something closer to fieldName pos := p.pos() name := p.string() - if !exported(name) { + if !token.IsExported(name) { p.pkg() } @@ -675,7 +673,7 @@ func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name st alias = true fallthrough default: - if !exported(name) { + if !token.IsExported(name) { pkg = p.pkg() } } @@ -730,11 +728,6 @@ func (p *importer) param(named bool) (*types.Var, bool) { return types.NewVar(token.NoPos, pkg, name, t), isddd } -func exported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - func (p *importer) value() constant.Value { switch tag := p.tagOrIndex(); tag { case falseTag: diff --git a/src/go/types/object.go b/src/go/types/object.go index cf773238a0..374b24d1ac 100644 --- a/src/go/types/object.go +++ b/src/go/types/object.go @@ -7,7 +7,6 @@ package types import ( "bytes" "fmt" - "go/ast" "go/constant" "go/token" ) @@ -59,7 +58,7 @@ type Object interface { // Id returns name if it is exported, otherwise it // returns the name qualified with the package path. func Id(pkg *Package, name string) string { - if ast.IsExported(name) { + if token.IsExported(name) { return name } // unexported names need the package path for differentiation @@ -139,7 +138,7 @@ func (obj *object) Type() Type { return obj.typ } // Exported reports whether the object is exported (starts with a capital letter). // It doesn't take into account whether the object is in a local (function) scope // or not. -func (obj *object) Exported() bool { return ast.IsExported(obj.name) } +func (obj *object) Exported() bool { return token.IsExported(obj.name) } // Id is a wrapper for Id(obj.Pkg(), obj.Name()). func (obj *object) Id() string { return Id(obj.pkg, obj.name) } diff --git a/src/net/http/response_test.go b/src/net/http/response_test.go index c46f13f798..ee7f0d0b70 100644 --- a/src/net/http/response_test.go +++ b/src/net/http/response_test.go @@ -10,7 +10,7 @@ import ( "compress/gzip" "crypto/rand" "fmt" - "go/ast" + "go/token" "io" "io/ioutil" "net/http/internal" @@ -736,7 +736,7 @@ func diff(t *testing.T, prefix string, have, want interface{}) { } for i := 0; i < hv.NumField(); i++ { name := hv.Type().Field(i).Name - if !ast.IsExported(name) { + if !token.IsExported(name) { continue } hf := hv.Field(i).Interface() diff --git a/src/net/rpc/server.go b/src/net/rpc/server.go index 7bb6476ffa..9cb928240f 100644 --- a/src/net/rpc/server.go +++ b/src/net/rpc/server.go @@ -130,6 +130,7 @@ import ( "bufio" "encoding/gob" "errors" + "go/token" "io" "log" "net" @@ -137,8 +138,6 @@ import ( "reflect" "strings" "sync" - "unicode" - "unicode/utf8" ) const ( @@ -202,12 +201,6 @@ func NewServer() *Server { // DefaultServer is the default instance of *Server. var DefaultServer = NewServer() -// Is this an exported - upper case - name? -func isExported(name string) bool { - rune, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(rune) -} - // Is this type exported or a builtin? func isExportedOrBuiltinType(t reflect.Type) bool { for t.Kind() == reflect.Ptr { @@ -215,7 +208,7 @@ func isExportedOrBuiltinType(t reflect.Type) bool { } // PkgPath will be non-empty even for an exported type, // so we need to check the type name as well. - return isExported(t.Name()) || t.PkgPath() == "" + return token.IsExported(t.Name()) || t.PkgPath() == "" } // Register publishes in the server the set of methods of the @@ -251,7 +244,7 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro log.Print(s) return errors.New(s) } - if !isExported(sname) && !useName { + if !token.IsExported(sname) && !useName { s := "rpc.Register: type " + sname + " is not exported" log.Print(s) return errors.New(s) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index cbf0f5a93f..964d8c6e95 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -9,6 +9,7 @@ import ( "encoding/base64" "flag" "fmt" + "go/token" "io" "math" "math/rand" @@ -22,8 +23,6 @@ import ( "sync/atomic" "testing" "time" - "unicode" - "unicode/utf8" "unsafe" ) @@ -4671,7 +4670,7 @@ func TestStructOfExportRules(t *testing.T) { if n == "" { panic("field.Name must not be empty") } - exported := isExported(n) + exported := token.IsExported(n) if exported != test.exported { t.Errorf("test-%d: got exported=%v want exported=%v", i, exported, test.exported) } @@ -4679,14 +4678,6 @@ func TestStructOfExportRules(t *testing.T) { } } -// isExported reports whether name is an exported Go symbol -// (that is, whether it begins with an upper-case letter). -// -func isExported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - func TestStructOfGC(t *testing.T) { type T *uintptr tt := TypeOf(T(nil)) -- GitLab From e47090ab40967c2e5e6058838319259b4cc0d508 Mon Sep 17 00:00:00 2001 From: Dmitry Savintsev Date: Tue, 16 Apr 2019 11:20:51 +0200 Subject: [PATCH 0814/1679] doc: fix typo in go1.12 release notes Change-Id: I3cb4fb7cacba51bfd611ade918f16c618e2569fd Reviewed-on: https://go-review.googlesource.com/c/go/+/172159 Reviewed-by: Brad Fitzpatrick --- doc/go1.12.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/go1.12.html b/doc/go1.12.html index 2945eb1c43..cc19c0f31a 100644 --- a/doc/go1.12.html +++ b/doc/go1.12.html @@ -791,7 +791,7 @@ for { A new BuildInfo type exposes the build information read from the running binary, available only in binaries built with module support. This includes the main package path, main - module information, and the module dependencies. This type is given though the + module information, and the module dependencies. This type is given through the ReadBuildInfo function on BuildInfo.

    -- GitLab From 460f9c60689c38bdd938d09903f3b414f6082a7d Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Mon, 8 Apr 2019 00:36:55 +0200 Subject: [PATCH 0815/1679] runtime, cmd/link: optimize memory allocation on wasm WebAssembly's memory is contiguous. Allocating memory at a high address also allocates all memory up to that address. This change reduces the initial memory allocated on wasm from 1GB to 16MB by using multiple heap arenas and reducing the size of a heap arena. Fixes #27462. Change-Id: Ic941e6edcadd411e65a14cb2f9fd6c8eae02fc7a Reviewed-on: https://go-review.googlesource.com/c/go/+/170950 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/link/internal/wasm/asm.go | 18 +++++++++--------- src/runtime/malloc.go | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index abb4409188..ea6b406c7e 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -297,18 +297,18 @@ func writeTableSec(ctxt *ld.Link, fns []*wasmFunc) { } // writeMemorySec writes the section that declares linear memories. Currently one linear memory is being used. +// Linear memory always starts at address zero. More memory can be requested with the GrowMemory instruction. func writeMemorySec(ctxt *ld.Link) { sizeOffset := writeSecHeader(ctxt, sectionMemory) - // Linear memory always starts at address zero. - // The unit of the sizes is "WebAssembly page size", which is 64Ki. - // The minimum is currently set to 1GB, which is a lot. - // More memory can be requested with the grow_memory instruction, - // but this operation currently is rather slow, so we avoid it for now. - // TODO(neelance): Use lower initial memory size. - writeUleb128(ctxt.Out, 1) // number of memories - ctxt.Out.WriteByte(0x00) // no maximum memory size - writeUleb128(ctxt.Out, 1024*16) // minimum (initial) memory size + const ( + initialSize = 16 << 20 // 16MB, enough for runtime init without growing + wasmPageSize = 64 << 10 // 64KB + ) + + writeUleb128(ctxt.Out, 1) // number of memories + ctxt.Out.WriteByte(0x00) // no maximum memory size + writeUleb128(ctxt.Out, initialSize/wasmPageSize) // minimum (initial) memory size writeSecSize(ctxt, sizeOffset) } diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index 9feec1b007..c22c7aa7dc 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -248,7 +248,7 @@ const ( // logHeapArenaBytes is log_2 of heapArenaBytes. For clarity, // prefer using heapArenaBytes where possible (we need the // constant to compute some other constants). - logHeapArenaBytes = (6+20)*(_64bit*(1-sys.GoosWindows)*(1-sys.GoosAix)) + (2+20)*(_64bit*sys.GoosWindows) + (2+20)*(1-_64bit) + (8+20)*sys.GoosAix + logHeapArenaBytes = (6+20)*(_64bit*(1-sys.GoosWindows)*(1-sys.GoosAix)*(1-sys.GoarchWasm)) + (2+20)*(_64bit*sys.GoosWindows) + (2+20)*(1-_64bit) + (8+20)*sys.GoosAix + (2+20)*sys.GoarchWasm // heapArenaBitmapBytes is the size of each heap arena's bitmap. heapArenaBitmapBytes = heapArenaBytes / (sys.PtrSize * 8 / 2) @@ -394,7 +394,7 @@ func mallocinit() { _g_.m.mcache = allocmcache() // Create initial arena growth hints. - if sys.PtrSize == 8 && GOARCH != "wasm" { + if sys.PtrSize == 8 { // On a 64-bit machine, we pick the following hints // because: // -- GitLab From ae85ae5db2d3b6a3dfb75ade74e0f11234375594 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 16 Apr 2019 08:52:42 +0200 Subject: [PATCH 0816/1679] runtime: avoid getg in preinit on Android sigaction is called as part of library mode initializers (_rt0_*_lib). Sigaction in turn calls getg, but on Android the TLS offset for g has not been initialized and getg might return garbage. Add a check for initialization before calling getg. Fixes the golang.org/x/mobile/bind/java tests on amd64 and 386. Fixes #31476 Change-Id: Id2c41fdc983239eca039b49a54b8853c5669d127 Reviewed-on: https://go-review.googlesource.com/c/go/+/172158 Reviewed-by: Ian Lance Taylor --- src/runtime/cgo_sigaction.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime/cgo_sigaction.go b/src/runtime/cgo_sigaction.go index 3ef6800cd9..bc5e0786d9 100644 --- a/src/runtime/cgo_sigaction.go +++ b/src/runtime/cgo_sigaction.go @@ -39,7 +39,10 @@ func sigaction(sig uint32, new, old *sigactiont) { var ret int32 - g := getg() + var g *g + if mainStarted { + g = getg() + } sp := uintptr(unsafe.Pointer(&sig)) switch { case g == nil: -- GitLab From 4ee85e67e127b6679d461f1d4ae836afdf4251f4 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 8 Apr 2019 15:49:58 +0200 Subject: [PATCH 0817/1679] misc/cgo/testcshared: support testing on self-hosted android Only invoke adb for android if we're not running on android already. Change-Id: I4eb94286a5bf09b382716a0474f3aebec40f5d74 Reviewed-on: https://go-review.googlesource.com/c/go/+/170953 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/testcshared/cshared_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/misc/cgo/testcshared/cshared_test.go b/misc/cgo/testcshared/cshared_test.go index 8dac639042..97f786e6c5 100644 --- a/misc/cgo/testcshared/cshared_test.go +++ b/misc/cgo/testcshared/cshared_test.go @@ -13,6 +13,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "strings" "sync" "testing" @@ -45,7 +46,7 @@ func testMain(m *testing.M) int { } androiddir = fmt.Sprintf("/data/local/tmp/testcshared-%d", os.Getpid()) - if GOOS == "android" { + if runtime.GOOS != GOOS && GOOS == "android" { args := append(adbCmd(), "exec-out", "mkdir", "-p", androiddir) cmd := exec.Command(args[0], args[1:]...) out, err := cmd.CombinedOutput() @@ -177,7 +178,7 @@ func adbCmd() []string { } func adbPush(t *testing.T, filename string) { - if GOOS != "android" { + if runtime.GOOS == GOOS || GOOS != "android" { return } args := append(adbCmd(), "push", filename, fmt.Sprintf("%s/%s", androiddir, filename)) @@ -236,7 +237,7 @@ func run(t *testing.T, extraEnv []string, args ...string) string { func runExe(t *testing.T, extraEnv []string, args ...string) string { t.Helper() - if GOOS == "android" { + if runtime.GOOS != GOOS && GOOS == "android" { return adbRun(t, append(os.Environ(), extraEnv...), args...) } return run(t, extraEnv, args...) @@ -268,7 +269,7 @@ func createHeaders() error { return fmt.Errorf("command failed: %v\n%v\n%s\n", args, err, out) } - if GOOS == "android" { + if runtime.GOOS != GOOS && GOOS == "android" { args = append(adbCmd(), "push", libgoname, fmt.Sprintf("%s/%s", androiddir, libgoname)) cmd = exec.Command(args[0], args[1:]...) out, err = cmd.CombinedOutput() -- GitLab From c4953a62f90f90f1ab2ac07d5664dd515936835e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=9C=E6=AC=A2=E5=85=B0=E8=8A=B1=E5=B1=B1=E4=B8=98?= Date: Tue, 16 Apr 2019 15:08:32 +0000 Subject: [PATCH 0818/1679] context: simplify stringify with a type switch Minor style change. Change-Id: Ib30243a71a83de1a67d3d005bfdd1e04265fca1e GitHub-Last-Rev: 9d654de10eaa6f01ece29790fb81bc41dfd61eaf GitHub-Pull-Request: golang/go#31479 Reviewed-on: https://go-review.googlesource.com/c/go/+/172199 Reviewed-by: Brad Fitzpatrick Reviewed-by: Sameer Ajmani --- src/context/context.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/context/context.go b/src/context/context.go index 77298f6531..ad67d2301d 100644 --- a/src/context/context.go +++ b/src/context/context.go @@ -497,10 +497,10 @@ type valueCtx struct { // want context depending on the unicode tables. This is only used by // *valueCtx.String(). func stringify(v interface{}) string { - if s, ok := v.(stringer); ok { + switch s := v.(type) { + case stringer: return s.String() - } - if s, ok := v.(string); ok { + case string: return s } return "" -- GitLab From 64dc4ba73f9086709cd0cbcdc80dc116511d9081 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Tue, 29 Jan 2019 15:58:57 +0000 Subject: [PATCH 0819/1679] math: use new mnemonics for 'rotate then insert' on s390x Mnemonics for these instructions were added to the assembler in CL 159357. Change-Id: Ie11c45ecc9cead9a8850fcc929b0211cfd980fe5 Reviewed-on: https://go-review.googlesource.com/c/go/+/160157 Run-TryBot: Michael Munday TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/math/acosh_s390x.s | 28 +++++------------- src/math/asinh_s390x.s | 20 ++++--------- src/math/atan2_s390x.s | 16 +++-------- src/math/atan_s390x.s | 8 ++---- src/math/atanh_s390x.s | 8 ++---- src/math/cbrt_s390x.s | 12 ++------ src/math/cosh_s390x.s | 32 ++++++--------------- src/math/erf_s390x.s | 12 ++------ src/math/erfc_s390x.s | 8 ++---- src/math/exp_s390x.s | 16 +++-------- src/math/expm1_s390x.s | 16 +++-------- src/math/log10_s390x.s | 28 +++++------------- src/math/log1p_s390x.s | 12 ++------ src/math/log_s390x.s | 24 ++++------------ src/math/pow_s390x.s | 64 +++++++++++------------------------------- src/math/sinh_s390x.s | 20 ++++--------- src/math/tanh_s390x.s | 8 ++---- 17 files changed, 83 insertions(+), 249 deletions(-) diff --git a/src/math/acosh_s390x.s b/src/math/acosh_s390x.s index 87a5d00154..9294c48e6b 100644 --- a/src/math/acosh_s390x.s +++ b/src/math/acosh_s390x.s @@ -90,17 +90,11 @@ L2: MOVH $0x0, R1 SUBW R5, R3 FMOVD $0, F10 - WORD $0xEC4320AF //risbg %r4,%r3,32,128+47,0 - BYTE $0x00 - BYTE $0x55 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $32, $47, $0, R3, R4 + RISBGZ $57, $60, $51, R3, R3 BYTE $0x18 //lr %r2,%r4 BYTE $0x24 - WORD $0xEC14001F //risbgn %r1,%r4,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R4, R1 SUBW $0x100000, R2 SRAW $8, R2, R2 ORW $0x45000000, R2 @@ -119,9 +113,7 @@ L5: FMOVD 64(R9), F2 WFMADB V6, V4, V1, V6 FMOVD 56(R9), F1 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $57, $60, $0, R3, R3 WFMADB V0, V2, V1, V2 FMOVD 48(R9), F1 WFMADB V4, V6, V2, V6 @@ -158,15 +150,9 @@ L4: MOVH $0x0, R1 SUBW R5, R3 SRAW $8, R3, R2 - WORD $0xEC4320AF //risbg %r4,%r3,32,128+47,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $32, $47, $0, R3, R4 ANDW $0xFFFFFF00, R2 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $57, $60, $51, R3, R3 ORW $0x45000000, R2 - WORD $0xEC14001F //risbgn %r1,%r4,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R4, R1 BR L5 diff --git a/src/math/asinh_s390x.s b/src/math/asinh_s390x.s index a3680c661f..1bcf2954c4 100644 --- a/src/math/asinh_s390x.s +++ b/src/math/asinh_s390x.s @@ -98,14 +98,10 @@ L9: MOVH $0x0, R2 SUBW R5, R3 FMOVD $0, F8 - WORD $0xEC4320AF //risbg %r4,%r3,32,128+47,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $32, $47, $0, R3, R4 BYTE $0x18 //lr %r1,%r4 BYTE $0x14 - WORD $0xEC24001F //risbgn %r2,%r4,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R4, R2 SUBW $0x100000, R1 SRAW $8, R1, R1 ORW $0x45000000, R1 @@ -137,13 +133,9 @@ L5: SRAD $32, R5 MOVH $0x0, R2 SUBW R5, R3 - WORD $0xEC4320AF //risbg %r4,%r3,32,128+47,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $32, $47, $0, R3, R4 SRAW $8, R4, R1 - WORD $0xEC24001F //risbgn %r2,%r4,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R4, R2 ORW $0x45000000, R1 L6: LDGR R2, F2 @@ -160,9 +152,7 @@ L6: FMOVD 144(R9), F0 WFMADB V6, V4, V1, V6 FMOVD 136(R9), F1 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $57, $60, $51, R3, R3 WFMADB V2, V0, V1, V0 FMOVD 128(R9), F1 WFMADB V4, V6, V0, V6 diff --git a/src/math/atan2_s390x.s b/src/math/atan2_s390x.s index c7a8a09d05..6b9af252e2 100644 --- a/src/math/atan2_s390x.s +++ b/src/math/atan2_s390x.s @@ -144,16 +144,10 @@ Normal: MOVD $·atan2rodataL25<>+0(SB), R9 LGDR F0, R2 LGDR F2, R1 - WORD $0xEC2220BF //risbgn %r2,%r2,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 - WORD $0xEC1120BF //risbgn %r1,%r1,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R2, R2 + RISBGNZ $32, $63, $32, R1, R1 WORD $0xB9170032 //llgtr %r3,%r2 - WORD $0xEC523FBF //risbg %r5,%r2,64-1,128+63,64+32+1 - BYTE $0x61 - BYTE $0x55 + RISBGZ $63, $63, $33, R2, R5 WORD $0xB9170041 //llgtr %r4,%r1 WFLCDB V0, V20 MOVW R4, R6 @@ -224,9 +218,7 @@ L7: MOVW R1, R6 CMPBGE R6, $0, L1 L18: - WORD $0xEC223ABC //risbg %r2,%r2,58,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $58, $60, $3, R2, R2 MOVD $·atan2xpi2h<>+0(SB), R1 MOVD ·atan2xpim<>+0(SB), R3 LDGR R3, F0 diff --git a/src/math/atan_s390x.s b/src/math/atan_s390x.s index 713727ddbf..3a7e59bb1a 100644 --- a/src/math/atan_s390x.s +++ b/src/math/atan_s390x.s @@ -55,9 +55,7 @@ TEXT ·atanAsm(SB), NOSPLIT, $0-16 MOVD $·atanrodataL8<>+0(SB), R5 MOVH $0x3FE0, R3 LGDR F0, R1 - WORD $0xEC1120BF //risbgn %r1,%r1,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R1, R1 RLL $16, R1, R2 ANDW $0x7FF0, R2 MOVW R2, R6 @@ -66,9 +64,7 @@ TEXT ·atanAsm(SB), NOSPLIT, $0-16 MOVD $·atanxmone<>+0(SB), R3 FMOVD 0(R3), F2 WFDDB V0, V2, V0 - WORD $0xEC113FBF //risbg %r1,%r1,64-1,128+63,64+32+1 - BYTE $0x61 - BYTE $0x55 + RISBGZ $63, $63, $33, R1, R1 MOVD $·atanxpi2h<>+0(SB), R3 MOVWZ R1, R1 SLD $3, R1, R1 diff --git a/src/math/atanh_s390x.s b/src/math/atanh_s390x.s index e7c6359704..c4ec2b2648 100644 --- a/src/math/atanh_s390x.s +++ b/src/math/atanh_s390x.s @@ -136,9 +136,7 @@ L9: BYTE $0x1B SUBW R4, R2 WFSDB V3, V2, V3 - WORD $0xEC1220AF //risbg %r1,%r2,32,128+47,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $32, $47, $0, R2, R1 SLD $32, R1, R1 LDGR R1, F2 WFMADB V4, V2, V16, V4 @@ -162,9 +160,7 @@ L9: WFMADB V2, V6, V3, V6 VLVGF $0, R1, V4 LDEBR F4, F4 - WORD $0xEC2239BC //risbg %r2,%r2,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $57, $60, $51, R2, R2 MOVD $·atanhtab2076<>+0(SB), R1 FMOVD 16(R5), F3 WORD $0x68521000 //ld %f5,0(%r2,%r1) diff --git a/src/math/cbrt_s390x.s b/src/math/cbrt_s390x.s index d79b48fc79..87bba531b8 100644 --- a/src/math/cbrt_s390x.s +++ b/src/math/cbrt_s390x.s @@ -106,18 +106,12 @@ L2: LGDR F2, R2 SRAD $32, R2 L4: - WORD $0xEC3239BE //risbg %r3,%r2,57,128+62,64-25 - BYTE $0x27 - BYTE $0x55 + RISBGZ $57, $62, $39, R2, R3 MOVD $·cbrttab12067<>+0(SB), R1 WORD $0x48131000 //lh %r1,0(%r3,%r1) - WORD $0xEC3239BE //risbg %r3,%r2,57,128+62,64-19 - BYTE $0x2D - BYTE $0x55 + RISBGZ $57, $62, $45, R2, R3 MOVD $·cbrttab22068<>+0(SB), R5 - WORD $0xEC223CBF //risbgn %r2,%r2,64-4,128+63,64+44+4 - BYTE $0x70 - BYTE $0x59 + RISBGNZ $60, $63, $48, R2, R2 WORD $0x4A135000 //ah %r1,0(%r3,%r5) BYTE $0x18 //lr %r3,%r1 BYTE $0x31 diff --git a/src/math/cosh_s390x.s b/src/math/cosh_s390x.s index 5e7a8d88cc..ca1d86e803 100644 --- a/src/math/cosh_s390x.s +++ b/src/math/cosh_s390x.s @@ -116,14 +116,10 @@ L14: MOVD $coshe1<>+0(SB), R3 WFMADB V1, V6, V5, V6 FMOVD 0(R3), F5 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 WFMADB V1, V7, V5, V1 BVS L22 - WORD $0xEC4139BC //risbg %r4,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R4 MOVD $coshtab<>+0(SB), R3 WFMADB V3, V6, V1, V6 WORD $0x68043000 //ld %f0,0(%r4,%r3) @@ -131,9 +127,7 @@ L14: WORD $0xA71AF000 //ahi %r1,-4096 WFMADB V2, V6, V0, V6 L17: - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 LDGR R2, F2 FMADD F2, F6, F2 MOVD $coshx4ff<>+0(SB), R1 @@ -176,27 +170,19 @@ L20: LGDR F3, R1 MOVD $coshtab<>+0(SB), R5 WFMADB V4, V6, V1, V3 - WORD $0xEC4139BC //risbg %r4,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R4 WFMSDB V4, V6, V1, V6 WORD $0x68145000 //ld %f1,0(%r4,%r5) WFMSDB V4, V1, V0, V2 WORD $0xA7487FBE //lhi %r4,32702 FMADD F3, F2, F1 SUBW R1, R4 - WORD $0xECC439BC //risbg %r12,%r4,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R4, R12 WORD $0x682C5000 //ld %f2,0(%r12,%r5) FMSUB F2, F4, F0 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 WFMADB V0, V6, V2, V6 - WORD $0xEC34000F //risbgn %r3,%r4,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R4, R3 LDGR R2, F2 LDGR R3, F0 FMADD F2, F1, F2 @@ -210,9 +196,7 @@ L22: MOVD $coshtab<>+0(SB), R4 SUBW R1, R3 WFMSDB V3, V6, V1, V6 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R3, R3 WORD $0x68034000 //ld %f0,0(%r3,%r4) FMSUB F0, F3, F2 WORD $0xA7386FBE //lhi %r3,28606 diff --git a/src/math/erf_s390x.s b/src/math/erf_s390x.s index 5be5d4de16..99ab436e09 100644 --- a/src/math/erf_s390x.s +++ b/src/math/erf_s390x.s @@ -104,9 +104,7 @@ TEXT ·erfAsm(SB), NOSPLIT, $0-16 FMOVD F0, F6 SRAD $48, R1 MOVH $16383, R3 - WORD $0xEC2131BF //risbg %r2,%r1,49,128+63,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $49, $63, $0, R1, R2 MOVW R2, R6 MOVW R3, R7 CMPBGT R6, R7, L2 @@ -221,13 +219,9 @@ L9: FMOVD 200(R5), F3 MOVH R1,R1 WFMADB V4, V3, V5, V3 - WORD $0xEC2139BC //risbg %r2,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R2 WFMADB V1, V6, V3, V6 - WORD $0xEC31000F //risbgn %r3,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R3 MOVD $·erftab2066<>+0(SB), R1 FMOVD 192(R5), F1 LDGR R3, F3 diff --git a/src/math/erfc_s390x.s b/src/math/erfc_s390x.s index 0cb606d6de..7e9d469cc6 100644 --- a/src/math/erfc_s390x.s +++ b/src/math/erfc_s390x.s @@ -242,16 +242,12 @@ L11: WFMADB V0, V2, V3, V0 FMOVD 584(R9), F3 WFMADB V4, V6, V3, V6 - WORD $0xECC339BC //risbg %r12,%r3,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R3, R12 WFMADB V2, V0, V6, V0 MOVD $·erfctab2069<>+0(SB), R5 WORD $0x682C5000 //ld %f2,0(%r12,%r5) FMADD F2, F4, F4 - WORD $0xEC43000F //risbgn %r4,%r3,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R3, R4 WFMADB V4, V0, V2, V4 LDGR R4, F2 FMADD F4, F2, F2 diff --git a/src/math/exp_s390x.s b/src/math/exp_s390x.s index cef1ce7684..e0ec823073 100644 --- a/src/math/exp_s390x.s +++ b/src/math/exp_s390x.s @@ -91,9 +91,7 @@ L2: WFMADB V0, V4, V3, V4 FMOVD 8(R5), F3 WFMADB V2, V1, V3, V1 - WORD $0xEC3139BC //risbg %r3,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R3 WFMADB V0, V4, V1, V0 MOVD $·exptexp<>+0(SB), R2 WORD $0x68432000 //ld %f4,0(%r3,%r2) @@ -142,9 +140,7 @@ L6: WFMADB V6, V1, V7, V1 FMOVD 8(R5), F7 WFMADB V4, V5, V7, V5 - WORD $0xEC3139BC //risbg %r3,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R3 WFMADB V6, V1, V5, V6 MOVD $·exptexp<>+0(SB), R2 WFCHDBS V2, V0, V0 @@ -154,9 +150,7 @@ L6: WFMADB V4, V6, V1, V4 BEQ L21 ADDW $0xF000, R1 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 LDGR R2, F0 FMADD F0, F4, F0 MOVD $·expx4ff<>+0(SB), R3 @@ -170,9 +164,7 @@ L13: RET L21: ADDW $0x1000, R1 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 LDGR R2, F0 FMADD F0, F4, F0 MOVD $·expx2ff<>+0(SB), R3 diff --git a/src/math/expm1_s390x.s b/src/math/expm1_s390x.s index c7c793b982..16c861bb18 100644 --- a/src/math/expm1_s390x.s +++ b/src/math/expm1_s390x.s @@ -99,9 +99,7 @@ L2: FMADD F5, F4, F0 FMOVD 16(R5), F6 WFMADB V0, V2, V6, V2 - WORD $0xEC3139BC //risbg %r3,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R3 WORD $0xB3130022 //lcdbr %f2,%f2 MOVD $·expm1tab<>+0(SB), R2 WORD $0x68432000 //ld %f4,0(%r3,%r2) @@ -157,9 +155,7 @@ L6: FMADD F4, F1, F6 LGDR F5, R1 WORD $0xB3130066 //lcdbr %f6,%f6 - WORD $0xEC3139BC //risbg %r3,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R3 WORD $0x68432000 //ld %f4,0(%r3,%r2) FMADD F4, F1, F1 MOVD $0x4086000000000000, R2 @@ -168,9 +164,7 @@ L6: WFCHDBS V2, V0, V0 BEQ L21 ADDW $0xF000, R1 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 LDGR R2, F0 FMADD F0, F4, F0 MOVD $·expm1x4ff<>+0(SB), R3 @@ -186,9 +180,7 @@ L7: RET L21: ADDW $0x1000, R1 - WORD $0xEC21000F //risbgn %r2,%r1,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R1, R2 LDGR R2, F0 FMADD F0, F4, F0 MOVD $·expm1x2ff<>+0(SB), R3 diff --git a/src/math/log10_s390x.s b/src/math/log10_s390x.s index d6b750065b..3638afe700 100644 --- a/src/math/log10_s390x.s +++ b/src/math/log10_s390x.s @@ -62,13 +62,9 @@ TEXT ·log10Asm(SB),NOSPLIT,$8-16 BYTE $0xFF WORD $0x5840F008 //l %r4, 8(%r15) SUBW R4, R2, R3 - WORD $0xEC5320AF //risbg %r5,%r3,32,128+47,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $32, $47, $0, R3, R5 MOVH $0x0, R1 - WORD $0xEC15001F //risbgn %r1,%r5,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R5, R1 WORD $0xC0590016 //iilf %r5,1507327 BYTE $0xFF BYTE $0xFF @@ -94,13 +90,9 @@ L2: BYTE $0x1C FMOVD F0, x-8(SP) WORD $0x5B20F008 //s %r2, 8(%r15) - WORD $0xEC3239BC //risbg %r3,%r2,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $57, $60, $51, R2, R3 ANDW $0xFFFF0000, R2 - WORD $0xEC12001F //risbgn %r1,%r2,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R2, R1 ADDW $0x4000000, R2 BLEU L17 L8: @@ -122,9 +114,7 @@ L4: FMOVD log10rodataL19<>+72(SB), F1 WFMADB V0, V2, V1, V2 FMOVD log10rodataL19<>+64(SB), F1 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,0 - BYTE $0x00 - BYTE $0x55 + RISBGZ $57, $60, $0, R3, R3 WFMADB V4, V6, V2, V6 FMOVD log10rodataL19<>+56(SB), F2 WFMADB V0, V1, V2, V1 @@ -145,12 +135,8 @@ L4: RET L16: - WORD $0xEC2328B7 //risbg %r2,%r3,40,128+55,64-8 - BYTE $0x38 - BYTE $0x55 - WORD $0xEC3339BC //risbg %r3,%r3,57,128+60,64-13 - BYTE $0x33 - BYTE $0x55 + RISBGZ $40, $55, $56, R3, R2 + RISBGZ $57, $60, $51, R3, R3 ORW $0x45000000, R2 BR L4 L13: diff --git a/src/math/log1p_s390x.s b/src/math/log1p_s390x.s index ba4933d5b0..00eb374996 100644 --- a/src/math/log1p_s390x.s +++ b/src/math/log1p_s390x.s @@ -105,12 +105,8 @@ TEXT ·log1pAsm(SB), NOSPLIT, $0-16 SRW $16, R1, R1 BYTE $0x18 //lr %r4,%r1 BYTE $0x41 - WORD $0xEC24000F //risbgn %r2,%r4,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 - WORD $0xEC54101F //risbgn %r5,%r4,64-64+16,64-64+16+16-1,64-16-16 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $15, $48, R4, R2 + RISBGN $16, $31, $32, R4, R5 MOVW R0, R6 MOVW R3, R7 CMPBGT R6, R7, L8 @@ -155,9 +151,7 @@ L8: WFMADB V6, V5, V2, V6 FMOVD 0(R2), F4 WFMADB V0, V6, V4, V6 - WORD $0xEC1139BC //risbg %r1,%r1,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R1, R1 MOVD $·log1ptab<>+0(SB), R2 MOVD $·log1pxl1<>+0(SB), R3 WORD $0x68112000 //ld %f1,0(%r1,%r2) diff --git a/src/math/log_s390x.s b/src/math/log_s390x.s index 7bcfdfcffa..4b514f3dd4 100644 --- a/src/math/log_s390x.s +++ b/src/math/log_s390x.s @@ -68,15 +68,9 @@ TEXT ·logAsm(SB), NOSPLIT, $0-16 SRAD $48, R1, R1 MOVD $0x40F03E8000000000, R8 SUBW R1, R4 - WORD $0xEC2420BB //risbg %r2,%r4,32,128+59,0 - BYTE $0x00 - BYTE $0x55 - WORD $0xEC62000F //risbgn %r6,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 - WORD $0xEC82101F //risbgn %r8,%r2,64-64+16,64-64+16+16-1,64-16-16 - BYTE $0x20 - BYTE $0x59 + RISBGZ $32, $59, $0, R4, R2 + RISBGN $0, $15, $48, R2, R6 + RISBGN $16, $31, $32, R2, R8 MOVW R1, R7 CMPBGT R7, $22, L17 LTDBR F0, F0 @@ -103,12 +97,8 @@ L15: BYTE $0x51 MOVW R1, R7 CMPBLE R7, $22, L7 - WORD $0xEC63000F //risbgn %r6,%r3,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 - WORD $0xEC82101F //risbgn %r8,%r2,64-64+16,64-64+16+16-1,64-16-16 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $15, $48, R3, R6 + RISBGN $16, $31, $32, R2, R8 L2: MOVH R5, R5 MOVH $0x7FEF, R1 @@ -116,9 +106,7 @@ L2: BGT L1 LDGR R6, F2 FMUL F2, F0 - WORD $0xEC4439BB //risbg %r4,%r4,57,128+59,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $59, $3, R4, R4 FMOVD 80(R9), F2 MOVD $·logxm<>+0(SB), R7 ADD R7, R4 diff --git a/src/math/pow_s390x.s b/src/math/pow_s390x.s index 754b119e24..9a0fff334b 100644 --- a/src/math/pow_s390x.s +++ b/src/math/pow_s390x.s @@ -301,13 +301,9 @@ Normal: WORD $0xC0298009 //iilf %r2,2148095317 BYTE $0x55 BYTE $0x55 - WORD $0xEC1320BF //risbgn %r1,%r3,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R3, R1 SUBW R1, R2 - WORD $0xEC323ABF //risbgn %r3,%r2,64-6,128+63,64+44+6 - BYTE $0x72 - BYTE $0x59 + RISBGNZ $58, $63, $50, R2, R3 BYTE $0x18 //lr %r5,%r1 BYTE $0x51 MOVD $·powtabi<>+0(SB), R12 @@ -322,12 +318,8 @@ Normal: ORW R5, R1 WORD $0x5A234000 //a %r2,0(%r3,%r4) MOVD $0x3FF0000000000000, R5 - WORD $0xEC3228BF //risbg %r3,%r2,64-24,128+63,64+32+24 - BYTE $0x78 - BYTE $0x55 - WORD $0xEC82001F //risbgn %r8,%r2,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGZ $40, $63, $56, R2, R3 + RISBGN $0, $31, $32, R2, R8 ORW $0x45000000, R3 MOVW R1, R6 CMPBLT R6, $0, L42 @@ -399,16 +391,12 @@ L2: WFMADB V1, V3, V7, V1 FMOVD 16(R9), F5 WFMADB V4, V5, V16, V5 - WORD $0xEC4239BC //risbg %r4,%r2,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R2, R4 WFMADB V3, V1, V5, V1 MOVD $·powtexp<>+0(SB), R3 WORD $0x68343000 //ld %f3,0(%r4,%r3) FMADD F3, F4, F4 - WORD $0xEC52000F //risbgn %r5,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R5 WFMADB V4, V1, V3, V4 LGDR F6, R2 LDGR R5, F1 @@ -449,18 +437,12 @@ L11: MOVW R2, R7 MOVW R1, R6 CMPBLE R7, R6, L34 - WORD $0xEC1520BF //risbgn %r1,%r5,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R5, R1 LGDR F6, R2 MOVD $powiadd<>+0(SB), R3 - WORD $0xEC223CBC //risbg %r2,%r2,60,128+60,64-60 - BYTE $0x04 - BYTE $0x55 + RISBGZ $60, $60, $4, R2, R2 WORD $0x5A123000 //a %r1,0(%r2,%r3) - WORD $0xEC51001F //risbgn %r5,%r1,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R1, R5 LDGR R5, F1 FMADD F1, F4, F1 MOVD $powxscale<>+0(SB), R1 @@ -487,16 +469,10 @@ L3: BYTE $0x55 BYTE $0x55 LGDR F4, R3 - WORD $0xEC3320BF //risbgn %r3,%r3,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R3, R3 SUBW R3, R2, R3 - WORD $0xEC2321AB //risbg %r2,%r3,33,128+43,0 - BYTE $0x00 - BYTE $0x55 - WORD $0xEC333ABF //risbgn %r3,%r3,64-6,128+63,64+44+6 - BYTE $0x72 - BYTE $0x59 + RISBGZ $33, $43, $0, R3, R2 + RISBGNZ $58, $63, $50, R3, R3 WORD $0xE303C000 //llgc %r0,0(%r3,%r12) BYTE $0x00 BYTE $0x90 @@ -504,14 +480,10 @@ L3: WORD $0x5A234000 //a %r2,0(%r3,%r4) BYTE $0x18 //lr %r3,%r2 BYTE $0x32 - WORD $0xEC83001F //risbgn %r8,%r3,64-64+0,64-64+0+32-1,64-0-32 - BYTE $0x20 - BYTE $0x59 + RISBGN $0, $31, $32, R3, R8 ADDW $0x4000000, R3 BLEU L5 - WORD $0xEC3328BF //risbg %r3,%r3,64-24,128+63,64+32+24 - BYTE $0x78 - BYTE $0x55 + RISBGZ $40, $63, $56, R3, R3 ORW $0x45000000, R3 BR L2 L9: @@ -540,9 +512,7 @@ L18: WFMDB V4, V5, V1 BR L1 L5: - WORD $0xEC3321B2 //risbg %r3,%r3,33,128+50,64-1 - BYTE $0x3F - BYTE $0x55 + RISBGZ $33, $50, $63, R3, R3 WORD $0xC23B4000 //alfi %r3,1073741824 BYTE $0x00 BYTE $0x00 @@ -571,9 +541,7 @@ L16: BR L1 L48: LGDR F0, R3 - WORD $0xEC1320BF //risbgn %r1,%r3,64-32,128+63,64+0+32 - BYTE $0x60 - BYTE $0x59 + RISBGNZ $32, $63, $32, R3, R1 MOVW R1, R6 CMPBEQ R6, $0, L29 LTDBR F2, F2 diff --git a/src/math/sinh_s390x.s b/src/math/sinh_s390x.s index bad2e218f8..73701f24f1 100644 --- a/src/math/sinh_s390x.s +++ b/src/math/sinh_s390x.s @@ -153,9 +153,7 @@ L6: VLGVG $0, V16, R2 WFMADB V6, V3, V5, V6 RLL $3, R2, R2 - WORD $0xEC12000F //risbgn %r1,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R1 BEQ L9 WFMSDB V0, V1, V6, V0 MOVD $sinhx4ff<>+0(SB), R3 @@ -165,9 +163,7 @@ L6: ANDW $0xFFFF, R2 WORD $0xA53FEFB6 //llill %r3,61366 SUBW R2, R3, R2 - WORD $0xEC12000F //risbgn %r1,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R1 LDGR R1, F2 FMUL F2, F0 FMOVD F0, ret+8(FP) @@ -195,9 +191,7 @@ L20: FMOVD 0(R2), F5 LGDR F6, R2 RLL $3, R2, R2 - WORD $0xEC12000F //risbgn %r1,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R1 WFMADB V2, V1, V0, V1 LDGR R1, F0 MOVD $sinhe5<>+0(SB), R1 @@ -211,9 +205,7 @@ L20: FNEG F4, F4 ANDW $0xFFFF, R2 SUBW R2, R4, R2 - WORD $0xEC32000F //risbgn %r3,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R3 LDGR R3, F6 WFADB V0, V6, V16 MOVD $sinhe4<>+0(SB), R1 @@ -242,9 +234,7 @@ L9: FMOVD 0(R3), F2 FMUL F2, F0 WORD $0xA72AF000 //ahi %r2,-4096 - WORD $0xEC12000F //risbgn %r1,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R1 LDGR R1, F2 FMUL F2, F0 FMOVD F0, ret+8(FP) diff --git a/src/math/tanh_s390x.s b/src/math/tanh_s390x.s index 456ed623ee..7e2d4dd797 100644 --- a/src/math/tanh_s390x.s +++ b/src/math/tanh_s390x.s @@ -76,15 +76,11 @@ L2: WFMSDB V0, V4, V2, V4 MOVD $tanhtab<>+0(SB), R3 LGDR F4, R2 - WORD $0xEC4239BC //risbg %r4,%r2,57,128+60,3 - BYTE $0x03 - BYTE $0x55 + RISBGZ $57, $60, $3, R2, R4 WORD $0xED105058 //cdb %f1,.L19-.L18(%r5) BYTE $0x00 BYTE $0x19 - WORD $0xEC12000F //risbgn %r1,%r2,64-64+0,64-64+0+16-1,64-0-16 - BYTE $0x30 - BYTE $0x59 + RISBGN $0, $15, $48, R2, R1 WORD $0x68543000 //ld %f5,0(%r4,%r3) LDGR R1, F6 BLT L3 -- GitLab From 1eed2a5ab299807341af05eca2a829d95f08c6e8 Mon Sep 17 00:00:00 2001 From: Fedor Korotkiy Date: Thu, 28 Feb 2019 15:35:30 +0300 Subject: [PATCH 0820/1679] cmd/go: PackageVetx in vet.cfg should list only immediate dependencies. Updates #30296 Change-Id: Ifea1a4c82c1c5b31fdc2e96fdbb1274748c8f50e Reviewed-on: https://go-review.googlesource.com/c/go/+/164459 Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/work/action.go | 2 +- src/cmd/go/testdata/script/vet_deps.txt | 34 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/cmd/go/testdata/script/vet_deps.txt diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 052811d34a..0232c45ebe 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -423,7 +423,7 @@ func (b *Builder) vetAction(mode, depMode BuildMode, p *load.Package) *Action { } else { deps = []*Action{a1, aFmt} } - for _, p1 := range load.PackageList(p.Internal.Imports) { + for _, p1 := range p.Internal.Imports { deps = append(deps, b.vetAction(mode, depMode, p1)) } diff --git a/src/cmd/go/testdata/script/vet_deps.txt b/src/cmd/go/testdata/script/vet_deps.txt new file mode 100644 index 0000000000..b2a8f168b3 --- /dev/null +++ b/src/cmd/go/testdata/script/vet_deps.txt @@ -0,0 +1,34 @@ +env GO111MODULE=off + +# Issue 30296. Verify that "go vet" uses only immediate dependencies. + +# First run fills the cache. +go vet a + +go vet -x a +! stderr 'transitive' + +-- a/a.go -- +package a + +import "b" + +func F() { + b.F() +} + +-- b/b.go -- +package b + +import "transitive" + +func F() { + transitive.F() +} + +-- transitive/c.go -- +package transitive + +func F() { +} + -- GitLab From 94e720059f902339699b8bf7b2b10897311b50f8 Mon Sep 17 00:00:00 2001 From: Kunpei Sakai Date: Tue, 21 Aug 2018 19:30:30 +0900 Subject: [PATCH 0821/1679] net/http: introduce DialerAndTLSConfigSupportsHTTP2 in Transport Even when a custom TLS config or custom dialer is specified, enables HTTP/2 if DialerAndTLSConfigSupportsHTTP2 is true. By this change, avoid automatically enabling HTTP/2 if DialContext is set. This change also ensures that DefaultTransport still automatically enable HTTP/2 as discussed in #14391. Updates #14391 Fixes #27011 Change-Id: Icc46416810bee61dbd65ebc96468335030b80573 Reviewed-on: https://go-review.googlesource.com/c/go/+/130256 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick Run-TryBot: Kunpei Sakai TryBot-Result: Gobot Gobot --- src/net/http/transport.go | 18 +++++++++++++----- src/net/http/transport_test.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index de1fb96818..88dbfe7c6e 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -46,10 +46,11 @@ var DefaultTransport RoundTripper = &Transport{ KeepAlive: 30 * time.Second, DualStack: true, }).DialContext, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, + DialerAndTLSConfigSupportsHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, } // DefaultMaxIdleConnsPerHost is the default value of Transport's @@ -257,6 +258,12 @@ type Transport struct { // h2transport (via onceSetNextProtoDefaults) nextProtoOnce sync.Once h2transport h2Transport // non-nil if http2 wired up + + // DialerAndTLSConfigSupportsHTTP2 controls whether HTTP/2 is enabled when a non-zero + // TLSClientConfig or Dial, DialTLS or DialContext func is provided. By default, use of any those fields conservatively + // disables HTTP/2. To use a customer dialer or TLS config and still attempt HTTP/2 + // upgrades, set this to true. + DialerAndTLSConfigSupportsHTTP2 bool } // h2Transport is the interface we expect to be able to call from @@ -296,12 +303,13 @@ func (t *Transport) onceSetNextProtoDefaults() { // Transport. return } - if t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil { + if !t.DialerAndTLSConfigSupportsHTTP2 && (t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil || t.DialContext != nil) { // Be conservative and don't automatically enable // http2 if they've specified a custom TLS config or // custom dialers. Let them opt-in themselves via // http2.ConfigureTransport so we don't surprise them // by modifying their tls.Config. Issue 14275. + // However, if DialerAndTLSConfigSupportsHTTP2 is true, it overrides the above checks. return } t2, err := http2configureTransport(t) diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 23864a4957..789d52c5d5 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -3593,6 +3593,13 @@ func TestTransportAutomaticHTTP2(t *testing.T) { testTransportAutoHTTP(t, &Transport{}, true) } +func TestTransportAutomaticHTTP2_DialerAndTLSConfigSupportsHTTP2AndTLSConfig(t *testing.T) { + testTransportAutoHTTP(t, &Transport{ + DialerAndTLSConfigSupportsHTTP2: true, + TLSClientConfig: new(tls.Config), + }, true) +} + // golang.org/issue/14391: also check DefaultTransport func TestTransportAutomaticHTTP2_DefaultTransport(t *testing.T) { testTransportAutoHTTP(t, DefaultTransport.(*Transport), true) @@ -3623,6 +3630,13 @@ func TestTransportAutomaticHTTP2_Dial(t *testing.T) { }, false) } +func TestTransportAutomaticHTTP2_DialContext(t *testing.T) { + var d net.Dialer + testTransportAutoHTTP(t, &Transport{ + DialContext: d.DialContext, + }, false) +} + func TestTransportAutomaticHTTP2_DialTLS(t *testing.T) { testTransportAutoHTTP(t, &Transport{ DialTLS: func(network, addr string) (net.Conn, error) { -- GitLab From a9831633be548c039ada30a2fb9d7290c35ac0c0 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 2 Apr 2019 14:44:13 -0700 Subject: [PATCH 0822/1679] cmd/compile: update escape analysis tests for newescape The new escape analysis implementation tries to emit debugging diagnostics that are compatible with the existing implementation, but there's a handful of cases that are easier to handle by updating the test expectations instead. For regress tests that need updating, the original file is copied to oldescapeXXX.go.go with -newescape=false added to the //errorcheck line, while the file is updated in place with -newescape=true and new test requirements. Notable test changes: 1) escape_because.go looks for a lot of detailed internal debugging messages that are fairly particular to how esc.go works and that I haven't attempted to port over to escape.go yet. 2) There are a lot of "leaking param: x to result ~r1 level=-1" messages for code like func(p *int) *T { return &T{p} } that were simply wrong. Here &T must be heap allocated unconditionally (because it's being returned); and since p is stored into it, p escapes unconditionally too. esc.go incorrectly reports that p escapes conditionally only if the returned pointer escaped. 3) esc.go used to print each "leaking param" analysis result as it discovered them, which could lead to redundant messages (e.g., that a param leaks at level=0 and level=1). escape.go instead prints everything at the end, once it knows the shortest path to each sink. 4) esc.go didn't precisely model direct-interface types, resulting in some values unnecessarily escaping to the heap when stored into non-escaping interface values. 5) For functions written in assembly, esc.go only printed "does not escape" messages, whereas escape.go prints "does not escape" or "leaking param" as appropriate, consistent with the behavior for functions written in Go. 6) 12 tests included "BAD" annotations identifying cases where esc.go was unnecessarily heap allocating something. These are all fixed by escape.go. Updates #23109. Change-Id: Iabc9eb14c94c9cadde3b183478d1fd54f013502f Reviewed-on: https://go-review.googlesource.com/c/go/+/170447 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- test/escape2.go | 15 +- test/escape2n.go | 15 +- test/escape5.go | 4 +- test/escape_because.go | 2 +- test/escape_calls.go | 4 +- test/escape_closure.go | 41 +- test/escape_field.go | 8 +- test/escape_iface.go | 5 +- test/escape_param.go | 4 +- test/escape_struct_return.go | 4 +- test/fixedbugs/issue12006.go | 4 +- test/fixedbugs/issue17318.go | 8 +- test/fixedbugs/oldescape_issue12006.go | 174 ++ test/fixedbugs/oldescape_issue17318.go | 47 + test/linkname.dir/linkname2.go | 2 +- test/linkname.go | 2 +- test/oldescape2.go | 1847 ++++++++++++++++++++++ test/oldescape2n.go | 1847 ++++++++++++++++++++++ test/oldescape5.go | 247 +++ test/oldescape_calls.go | 54 + test/oldescape_closure.go | 173 ++ test/oldescape_field.go | 174 ++ test/oldescape_iface.go | 261 +++ test/oldescape_linkname.dir/linkname1.go | 10 + test/oldescape_linkname.dir/linkname2.go | 13 + test/oldescape_linkname.dir/linkname3.go | 11 + test/oldescape_linkname.go | 15 + test/oldescape_param.go | 441 ++++++ test/oldescape_struct_return.go | 74 + 29 files changed, 5442 insertions(+), 64 deletions(-) create mode 100644 test/fixedbugs/oldescape_issue12006.go create mode 100644 test/fixedbugs/oldescape_issue17318.go create mode 100644 test/oldescape2.go create mode 100644 test/oldescape2n.go create mode 100644 test/oldescape5.go create mode 100644 test/oldescape_calls.go create mode 100644 test/oldescape_closure.go create mode 100644 test/oldescape_field.go create mode 100644 test/oldescape_iface.go create mode 100644 test/oldescape_linkname.dir/linkname1.go create mode 100644 test/oldescape_linkname.dir/linkname2.go create mode 100644 test/oldescape_linkname.dir/linkname3.go create mode 100644 test/oldescape_linkname.go create mode 100644 test/oldescape_param.go create mode 100644 test/oldescape_struct_return.go diff --git a/test/escape2.go b/test/escape2.go index e3561a0f60..f682621c25 100644 --- a/test/escape2.go +++ b/test/escape2.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -121,7 +121,7 @@ func NewBar() *Bar { return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" } -func NewBarp(x *int) *Bar { // ERROR "leaking param: x to result ~r1 level=-1$" +func NewBarp(x *int) *Bar { // ERROR "leaking param: x$" return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" } @@ -758,7 +758,7 @@ type LimitedFooer struct { N int64 } -func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r to result ~r2 level=-1$" +func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r$" return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" } @@ -1360,7 +1360,7 @@ func F2([]byte) func F3(x []byte) // ERROR "F3 x does not escape$" -func F4(x []byte) +func F4(x []byte) // ERROR "leaking param: x$" func G() { var buf1 [10]byte @@ -1529,8 +1529,7 @@ type V struct { s *string } -// BAD -- level of leak ought to be 0 -func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" +func NewV(u U) *V { // ERROR "leaking param: u$" return &V{u.String()} // ERROR "&V literal escapes to heap$" } @@ -1543,7 +1542,7 @@ func foo152() { // issue 8176 - &x in type switch body not marked as escaping -func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" +func foo153(v interface{}) *int { // ERROR "foo153 v does not escape" switch x := v.(type) { case int: // ERROR "moved to heap: x$" return &x @@ -1806,7 +1805,7 @@ func issue10353() { issue10353a(x)() } -func issue10353a(x *int) func() { // ERROR "leaking param: x to result ~r1 level=-1$" +func issue10353a(x *int) func() { // ERROR "leaking param: x$" return func() { // ERROR "func literal escapes to heap$" println(*x) } diff --git a/test/escape2n.go b/test/escape2n.go index 6ec198fd32..2fd26f7c5c 100644 --- a/test/escape2n.go +++ b/test/escape2n.go @@ -1,4 +1,4 @@ -// errorcheck -0 -N -m -l +// errorcheck -0 -N -m -l -newescape=true // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -121,7 +121,7 @@ func NewBar() *Bar { return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" } -func NewBarp(x *int) *Bar { // ERROR "leaking param: x to result ~r1 level=-1$" +func NewBarp(x *int) *Bar { // ERROR "leaking param: x$" return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" } @@ -758,7 +758,7 @@ type LimitedFooer struct { N int64 } -func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r to result ~r2 level=-1$" +func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r$" return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" } @@ -1360,7 +1360,7 @@ func F2([]byte) func F3(x []byte) // ERROR "F3 x does not escape$" -func F4(x []byte) +func F4(x []byte) // ERROR "leaking param: x$" func G() { var buf1 [10]byte @@ -1529,8 +1529,7 @@ type V struct { s *string } -// BAD -- level of leak ought to be 0 -func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" +func NewV(u U) *V { // ERROR "leaking param: u$" return &V{u.String()} // ERROR "&V literal escapes to heap$" } @@ -1543,7 +1542,7 @@ func foo152() { // issue 8176 - &x in type switch body not marked as escaping -func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" +func foo153(v interface{}) *int { // ERROR "foo153 v does not escape" switch x := v.(type) { case int: // ERROR "moved to heap: x$" return &x @@ -1806,7 +1805,7 @@ func issue10353() { issue10353a(x)() } -func issue10353a(x *int) func() { // ERROR "leaking param: x to result ~r1 level=-1$" +func issue10353a(x *int) func() { // ERROR "leaking param: x$" return func() { // ERROR "func literal escapes to heap$" println(*x) } diff --git a/test/escape5.go b/test/escape5.go index 4dbe89f313..393a4b0ac4 100644 --- a/test/escape5.go +++ b/test/escape5.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -129,7 +129,7 @@ type T2 struct { Y *T1 } -func f8(p *T1) (k T2) { // ERROR "leaking param: p to result k" "leaking param: p" +func f8(p *T1) (k T2) { // ERROR "leaking param: p$" if p == nil { k = T2{} return diff --git a/test/escape_because.go b/test/escape_because.go index 7ba5d679a1..e0a4214e7c 100644 --- a/test/escape_because.go +++ b/test/escape_because.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -m -l +// errorcheck -0 -m -m -l -newescape=false // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/test/escape_calls.go b/test/escape_calls.go index 186c6f8098..53f14dffd3 100644 --- a/test/escape_calls.go +++ b/test/escape_calls.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -36,7 +36,7 @@ func walk(np **Node) int { // ERROR "leaking param content: np" wl := walk(&n.left) wr := walk(&n.right) if wl < wr { - n.left, n.right = n.right, n.left + n.left, n.right = n.right, n.left // ERROR "ignoring self-assignment" wl, wr = wr, wl } *np = n diff --git a/test/escape_closure.go b/test/escape_closure.go index 93efe94ed7..cf055d3b34 100644 --- a/test/escape_closure.go +++ b/test/escape_closure.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -11,27 +11,24 @@ package escape var sink interface{} func ClosureCallArgs0() { - x := 0 // ERROR "moved to heap: x" + x := 0 func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 - // BAD: x should not escape to heap here }(&x) } func ClosureCallArgs1() { - x := 0 // ERROR "moved to heap: x" + x := 0 for { func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 - // BAD: x should not escape to heap here }(&x) } } func ClosureCallArgs2() { for { - // BAD: x should not escape here - x := 0 // ERROR "moved to heap: x" + x := 0 func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 }(&x) @@ -46,8 +43,7 @@ func ClosureCallArgs3() { } func ClosureCallArgs4() { - // BAD: x should not leak here - x := 0 // ERROR "moved to heap: x" + x := 0 _ = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" return p }(&x) @@ -55,7 +51,9 @@ func ClosureCallArgs4() { func ClosureCallArgs5() { x := 0 // ERROR "moved to heap: x" - sink = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" "\(func literal\)\(&x\) escapes to heap" + // TODO(mdempsky): We get "leaking param: p" here because the new escape analysis pass + // can tell that p flows directly to sink, but it's a little weird. Re-evaluate. + sink = func(p *int) *int { // ERROR "leaking param: p" "func literal does not escape" "\(func literal\)\(&x\) escapes to heap" return p }(&x) } @@ -79,10 +77,9 @@ func ClosureCallArgs7() { } func ClosureCallArgs8() { - x := 0 // ERROR "moved to heap: x" + x := 0 defer func(p *int) { // ERROR "p does not escape" "func literal does not escape" *p = 1 - // BAD: x should not escape to heap here }(&x) } @@ -113,8 +110,7 @@ func ClosureCallArgs11() { } func ClosureCallArgs12() { - // BAD: x should not leak - x := 0 // ERROR "moved to heap: x" + x := 0 defer func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" return p }(&x) @@ -128,21 +124,18 @@ func ClosureCallArgs13() { } func ClosureCallArgs14() { - x := 0 // ERROR "moved to heap: x" - // BAD: &x should not escape here - p := &x // ERROR "moved to heap: p" + x := 0 + p := &x _ = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" return *p - // BAD: p should not escape here }(&p) } func ClosureCallArgs15() { x := 0 // ERROR "moved to heap: x" - p := &x // ERROR "moved to heap: p" - sink = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" "\(func literal\)\(&p\) escapes to heap" + p := &x + sink = func(p **int) *int { // ERROR "leaking param content: p" "func literal does not escape" "\(func literal\)\(&p\) escapes to heap" return *p - // BAD: p should not escape here }(&p) } @@ -152,7 +145,7 @@ func ClosureLeak1(s string) string { // ERROR "ClosureLeak1 s does not escape" } // See #14409 -- returning part of captured var leaks it. -func ClosureLeak1a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" +func ClosureLeak1a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1$" return func() string { // ERROR "ClosureLeak1a func literal does not escape" return a[0] }() @@ -163,11 +156,11 @@ func ClosureLeak2(s string) string { // ERROR "ClosureLeak2 s does not escape" c := ClosureLeak2a(t) // ERROR "ClosureLeak2 ... argument does not escape" return c } -func ClosureLeak2a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" +func ClosureLeak2a(a ...string) string { // ERROR "leaking param content: a" return ClosureLeak2b(func() string { // ERROR "ClosureLeak2a func literal does not escape" return a[0] }) } -func ClosureLeak2b(f func() string) string { // ERROR "leaking param: f to result ~r1 level=1" +func ClosureLeak2b(f func() string) string { // ERROR "ClosureLeak2b f does not escape" return f() } diff --git a/test/escape_field.go b/test/escape_field.go index ae2425871f..5d5a6f36b4 100644 --- a/test/escape_field.go +++ b/test/escape_field.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -149,7 +149,7 @@ func field16() { var x X // BAD: &i should not escape x.p1 = &i - var iface interface{} = x // ERROR "x escapes to heap" + var iface interface{} = x // ERROR "field16 x does not escape" x1 := iface.(X) sink = x1.p2 // ERROR "x1\.p2 escapes to heap" } @@ -158,7 +158,7 @@ func field17() { i := 0 // ERROR "moved to heap: i$" var x X x.p1 = &i - var iface interface{} = x // ERROR "x escapes to heap" + var iface interface{} = x // ERROR "field17 x does not escape" x1 := iface.(X) sink = x1.p1 // ERROR "x1\.p1 escapes to heap" } @@ -168,7 +168,7 @@ func field18() { var x X // BAD: &i should not escape x.p1 = &i - var iface interface{} = x // ERROR "x escapes to heap" + var iface interface{} = x // ERROR "field18 x does not escape" y, _ := iface.(Y) // Put X, but extracted Y. The cast will fail, so y is zero initialized. sink = y // ERROR "y escapes to heap" } diff --git a/test/escape_iface.go b/test/escape_iface.go index 2a08547165..50c69cd5c1 100644 --- a/test/escape_iface.go +++ b/test/escape_iface.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -110,8 +110,7 @@ func efaceEscape1() { { i := 0 // ERROR "moved to heap: i" v := M1{&i, 0} - // BAD: v does not escape to heap here - var x M = v // ERROR "v escapes to heap" + var x M = v // ERROR "efaceEscape1 v does not escape" v1 := x.(M1) sink = v1 // ERROR "v1 escapes to heap" } diff --git a/test/escape_param.go b/test/escape_param.go index 0a81e8c9c8..2097556744 100644 --- a/test/escape_param.go +++ b/test/escape_param.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -415,7 +415,7 @@ func f(x *Node) { // ERROR "leaking param content: x" Sink = &Node{x.p} // ERROR "&Node literal escapes to heap" } -func g(x *Node) *Node { // ERROR "leaking param: x to result ~r1 level=0" +func g(x *Node) *Node { // ERROR "leaking param content: x" return &Node{x.p} // ERROR "&Node literal escapes to heap" } diff --git a/test/escape_struct_return.go b/test/escape_struct_return.go index 8a9e0963fa..2b6de1c76a 100644 --- a/test/escape_struct_return.go +++ b/test/escape_struct_return.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -19,7 +19,7 @@ func A(sp *string, spp **string) U { // ERROR "leaking param: sp to result ~r2 l return U{sp, spp} } -func B(spp **string) U { // ERROR "leaking param: spp to result ~r1 level=0$" "leaking param: spp to result ~r1 level=1$" +func B(spp **string) U { // ERROR "leaking param: spp to result ~r1 level=0$" return U{*spp, spp} } diff --git a/test/fixedbugs/issue12006.go b/test/fixedbugs/issue12006.go index 4a64e5416e..adbbb28b1b 100644 --- a/test/fixedbugs/issue12006.go +++ b/test/fixedbugs/issue12006.go @@ -1,4 +1,4 @@ -// errorcheck -0 -m -l +// errorcheck -0 -m -l -newescape=true // Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -23,7 +23,7 @@ func FooNx(x *int, vals ...*int) (s int) { // ERROR "leaking param: x" "leaking var sink []*int -func FooNy(x *int, vals ...*int) (s int) { // ERROR "leaking param: x" "leaking param: vals" "leaking param content: vals" +func FooNy(x *int, vals ...*int) (s int) { // ERROR "leaking param: x" "leaking param: vals" vals = append(vals, x) sink = vals return FooN(vals...) diff --git a/test/fixedbugs/issue17318.go b/test/fixedbugs/issue17318.go index fe00859bd7..f875517542 100644 --- a/test/fixedbugs/issue17318.go +++ b/test/fixedbugs/issue17318.go @@ -1,4 +1,4 @@ -// errorcheck -0 -N -m -l +// errorcheck -0 -N -m -l -newescape=true // Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style @@ -26,8 +26,8 @@ func (e ent) String() string { } //go:noinline -func foo(ops closure, j int) (err fmt.Stringer) { // ERROR "leaking param: ops$" "leaking param: ops to result err level=0$" - enqueue := func(i int) fmt.Stringer { // ERROR "func literal escapes to heap$" +func foo(ops closure, j int) (err fmt.Stringer) { // ERROR "foo ops does not escape" + enqueue := func(i int) fmt.Stringer { // ERROR "foo func literal does not escape" return ops(i, j) // ERROR "ops\(i, j\) escapes to heap$" } err = enqueue(4) @@ -39,7 +39,7 @@ func foo(ops closure, j int) (err fmt.Stringer) { // ERROR "leaking param: ops$" func main() { // 3 identical functions, to get different escape behavior. - f := func(i, j int) ent { // ERROR "func literal escapes to heap$" + f := func(i, j int) ent { // ERROR "main func literal does not escape" return ent(i + j) } i := foo(f, 3).(ent) diff --git a/test/fixedbugs/oldescape_issue12006.go b/test/fixedbugs/oldescape_issue12006.go new file mode 100644 index 0000000000..0697f58b64 --- /dev/null +++ b/test/fixedbugs/oldescape_issue12006.go @@ -0,0 +1,174 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis through ... parameters. + +package foo + +func FooN(vals ...*int) (s int) { // ERROR "FooN vals does not escape" + for _, v := range vals { + s += *v + } + return s +} + +// Append forces heap allocation and copies entries in vals to heap, therefore they escape to heap. +func FooNx(x *int, vals ...*int) (s int) { // ERROR "leaking param: x" "leaking param content: vals" + vals = append(vals, x) + return FooN(vals...) +} + +var sink []*int + +func FooNy(x *int, vals ...*int) (s int) { // ERROR "leaking param: x" "leaking param: vals" "leaking param content: vals" + vals = append(vals, x) + sink = vals + return FooN(vals...) +} + +func FooNz(vals ...*int) (s int) { // ERROR "leaking param: vals" + sink = vals + return FooN(vals...) +} + +func TFooN() { + for i := 0; i < 1000; i++ { + var i, j int + FooN(&i, &j) // ERROR "TFooN ... argument does not escape" + } +} + +func TFooNx() { + for i := 0; i < 1000; i++ { + var i, j, k int // ERROR "moved to heap: i" "moved to heap: j" "moved to heap: k" + FooNx(&k, &i, &j) // ERROR "TFooNx ... argument does not escape" + } +} + +func TFooNy() { + for i := 0; i < 1000; i++ { + var i, j, k int // ERROR "moved to heap: i" "moved to heap: j" "moved to heap: k" + FooNy(&k, &i, &j) // ERROR "... argument escapes to heap" + } +} + +func TFooNz() { + for i := 0; i < 1000; i++ { + var i, j int // ERROR "moved to heap: i" "moved to heap: j" + FooNz(&i, &j) // ERROR "... argument escapes to heap" + } +} + +var isink *int32 + +func FooI(args ...interface{}) { // ERROR "leaking param content: args" + for i := 0; i < len(args); i++ { + switch x := args[i].(type) { + case nil: + println("is nil") + case int32: + println("is int32") + case *int32: + println("is *int32") + isink = x + case string: + println("is string") + } + } +} + +func TFooI() { + a := int32(1) // ERROR "moved to heap: a" + b := "cat" + c := &a + FooI(a, b, c) // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooI ... argument does not escape" +} + +func FooJ(args ...interface{}) *int32 { // ERROR "leaking param: args to result ~r1 level=1" + for i := 0; i < len(args); i++ { + switch x := args[i].(type) { + case nil: + println("is nil") + case int32: + println("is int32") + case *int32: + println("is *int32") + return x + case string: + println("is string") + } + } + return nil +} + +func TFooJ1() { + a := int32(1) + b := "cat" + c := &a + FooJ(a, b, c) // ERROR "TFooJ1 a does not escape" "TFooJ1 b does not escape" "TFooJ1 c does not escape" "TFooJ1 ... argument does not escape" +} + +func TFooJ2() { + a := int32(1) // ERROR "moved to heap: a" + b := "cat" + c := &a + isink = FooJ(a, b, c) // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooJ2 ... argument does not escape" +} + +type fakeSlice struct { + l int + a *[4]interface{} +} + +func FooK(args fakeSlice) *int32 { // ERROR "leaking param: args to result ~r1 level=1" + for i := 0; i < args.l; i++ { + switch x := (*args.a)[i].(type) { + case nil: + println("is nil") + case int32: + println("is int32") + case *int32: + println("is *int32") + return x + case string: + println("is string") + } + } + return nil +} + +func TFooK2() { + a := int32(1) // ERROR "moved to heap: a" + b := "cat" + c := &a + fs := fakeSlice{3, &[4]interface{}{a, b, c, nil}} // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooK2 &\[4\]interface {} literal does not escape" + isink = FooK(fs) +} + +func FooL(args []interface{}) *int32 { // ERROR "leaking param: args to result ~r1 level=1" + for i := 0; i < len(args); i++ { + switch x := args[i].(type) { + case nil: + println("is nil") + case int32: + println("is int32") + case *int32: + println("is *int32") + return x + case string: + println("is string") + } + } + return nil +} + +func TFooL2() { + a := int32(1) // ERROR "moved to heap: a" + b := "cat" + c := &a + s := []interface{}{a, b, c} // ERROR "a escapes to heap" "b escapes to heap" "c escapes to heap" "TFooL2 \[\]interface {} literal does not escape" + isink = FooL(s) +} diff --git a/test/fixedbugs/oldescape_issue17318.go b/test/fixedbugs/oldescape_issue17318.go new file mode 100644 index 0000000000..10084ba812 --- /dev/null +++ b/test/fixedbugs/oldescape_issue17318.go @@ -0,0 +1,47 @@ +// errorcheck -0 -N -m -l -newescape=false + +// Copyright 2016 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. + +// The escape analyzer needs to run till its root set settles +// (this is not that often, it turns out). +// This test is likely to become stale because the leak depends +// on a spurious-escape bug -- return an interface as a named +// output parameter appears to cause the called closure to escape, +// where returning it as a regular type does not. + +package main + +import ( + "fmt" +) + +type closure func(i, j int) ent + +type ent int + +func (e ent) String() string { + return fmt.Sprintf("%d", int(e)) // ERROR "ent.String ... argument does not escape$" "int\(e\) escapes to heap$" +} + +//go:noinline +func foo(ops closure, j int) (err fmt.Stringer) { // ERROR "leaking param: ops$" "leaking param: ops to result err level=0$" + enqueue := func(i int) fmt.Stringer { // ERROR "func literal escapes to heap$" + return ops(i, j) // ERROR "ops\(i, j\) escapes to heap$" + } + err = enqueue(4) + if err != nil { + return err + } + return // return result of enqueue, a fmt.Stringer +} + +func main() { + // 3 identical functions, to get different escape behavior. + f := func(i, j int) ent { // ERROR "func literal escapes to heap$" + return ent(i + j) + } + i := foo(f, 3).(ent) + fmt.Printf("foo(f,3)=%d\n", int(i)) // ERROR "int\(i\) escapes to heap$" "main ... argument does not escape$" +} diff --git a/test/linkname.dir/linkname2.go b/test/linkname.dir/linkname2.go index 5df4f50ff2..9323ac5f1e 100644 --- a/test/linkname.dir/linkname2.go +++ b/test/linkname.dir/linkname2.go @@ -3,7 +3,7 @@ package y import _ "unsafe" //go:linkname byteIndex linkname1.indexByte -func byteIndex(xs []byte, b byte) int +func byteIndex(xs []byte, b byte) int // ERROR "leaking param: xs" func ContainsSlash(data []byte) bool { // ERROR "leaking param: data" "can inline ContainsSlash" if byteIndex(data, '/') != -1 { diff --git a/test/linkname.go b/test/linkname.go index c94a113c90..8e79b51b9b 100644 --- a/test/linkname.go +++ b/test/linkname.go @@ -1,4 +1,4 @@ -// errorcheckandrundir -0 -m -l=4 +// errorcheckandrundir -0 -m -l=4 -newescape=true // Copyright 2010 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style diff --git a/test/oldescape2.go b/test/oldescape2.go new file mode 100644 index 0000000000..864a956164 --- /dev/null +++ b/test/oldescape2.go @@ -0,0 +1,1847 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2010 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. + +// Test, using compiler diagnostic flags, that the escape analysis is working. +// Compiles but does not run. Inlining is disabled. + +// escape2n.go contains all the same tests but compiles with -N. + +package foo + +import ( + "fmt" + "unsafe" +) + +var gxx *int + +func foo1(x int) { // ERROR "moved to heap: x$" + gxx = &x +} + +func foo2(yy *int) { // ERROR "leaking param: yy$" + gxx = yy +} + +func foo3(x int) *int { // ERROR "moved to heap: x$" + return &x +} + +type T *T + +func foo3b(t T) { // ERROR "leaking param: t$" + *t = t +} + +// xx isn't going anywhere, so use of yy is ok +func foo4(xx, yy *int) { // ERROR "foo4 xx does not escape$" "foo4 yy does not escape$" + xx = yy +} + +// xx isn't going anywhere, so taking address of yy is ok +func foo5(xx **int, yy *int) { // ERROR "foo5 xx does not escape$" "foo5 yy does not escape$" + xx = &yy +} + +func foo6(xx **int, yy *int) { // ERROR "foo6 xx does not escape$" "leaking param: yy$" + *xx = yy +} + +func foo7(xx **int, yy *int) { // ERROR "foo7 xx does not escape$" "foo7 yy does not escape$" + **xx = *yy +} + +func foo8(xx, yy *int) int { // ERROR "foo8 xx does not escape$" "foo8 yy does not escape$" + xx = yy + return *xx +} + +func foo9(xx, yy *int) *int { // ERROR "leaking param: xx to result ~r2 level=0$" "leaking param: yy to result ~r2 level=0$" + xx = yy + return xx +} + +func foo10(xx, yy *int) { // ERROR "foo10 xx does not escape$" "foo10 yy does not escape$" + *xx = *yy +} + +func foo11() int { + x, y := 0, 42 + xx := &x + yy := &y + *xx = *yy + return x +} + +var xxx **int + +func foo12(yyy **int) { // ERROR "leaking param: yyy$" + xxx = yyy +} + +// Must treat yyy as leaking because *yyy leaks, and the escape analysis +// summaries in exported metadata do not distinguish these two cases. +func foo13(yyy **int) { // ERROR "leaking param content: yyy$" + *xxx = *yyy +} + +func foo14(yyy **int) { // ERROR "foo14 yyy does not escape$" + **xxx = **yyy +} + +func foo15(yy *int) { // ERROR "moved to heap: yy$" + xxx = &yy +} + +func foo16(yy *int) { // ERROR "leaking param: yy$" + *xxx = yy +} + +func foo17(yy *int) { // ERROR "foo17 yy does not escape$" + **xxx = *yy +} + +func foo18(y int) { // ERROR "moved to heap: y$" + *xxx = &y +} + +func foo19(y int) { + **xxx = y +} + +type Bar struct { + i int + ii *int +} + +func NewBar() *Bar { + return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" +} + +func NewBarp(x *int) *Bar { // ERROR "leaking param: x to result ~r1 level=-1$" + return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" +} + +func NewBarp2(x *int) *Bar { // ERROR "NewBarp2 x does not escape$" + return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap$" +} + +func (b *Bar) NoLeak() int { // ERROR "\(\*Bar\).NoLeak b does not escape$" + return *(b.ii) +} + +func (b *Bar) Leak() *int { // ERROR "leaking param: b to result ~r0 level=0$" + return &b.i +} + +func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param: b to result ~r0 level=1$" + return b.ii +} + +func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b to result ~r0 level=0$" + return b.ii +} + +func (b Bar) LeaksToo() *int { // ERROR "leaking param: b to result ~r0 level=0$" + v := 0 // ERROR "moved to heap: v$" + b.ii = &v + return b.ii +} + +func (b *Bar) LeaksABit() *int { // ERROR "leaking param: b to result ~r0 level=1$" + v := 0 // ERROR "moved to heap: v$" + b.ii = &v + return b.ii +} + +func (b Bar) StillNoLeak() int { // ERROR "Bar.StillNoLeak b does not escape$" + v := 0 + b.ii = &v + return b.i +} + +func goLeak(b *Bar) { // ERROR "leaking param: b$" + go b.NoLeak() +} + +type Bar2 struct { + i [12]int + ii []int +} + +func NewBar2() *Bar2 { + return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap$" +} + +func (b *Bar2) NoLeak() int { // ERROR "\(\*Bar2\).NoLeak b does not escape$" + return b.i[0] +} + +func (b *Bar2) Leak() []int { // ERROR "leaking param: b to result ~r0 level=0$" + return b.i[:] +} + +func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param: b to result ~r0 level=1$" + return b.ii[0:1] +} + +func (b Bar2) AgainNoLeak() [12]int { // ERROR "Bar2.AgainNoLeak b does not escape$" + return b.i +} + +func (b *Bar2) LeakSelf() { // ERROR "leaking param: b$" + b.ii = b.i[0:4] +} + +func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b$" + var buf []int + buf = b.i[0:] + b.ii = buf +} + +func foo21() func() int { + x := 42 + return func() int { // ERROR "func literal escapes to heap$" + return x + } +} + +func foo21a() func() int { + x := 42 // ERROR "moved to heap: x$" + return func() int { // ERROR "func literal escapes to heap$" + x++ + return x + } +} + +func foo22() int { + x := 42 + return func() int { // ERROR "foo22 func literal does not escape$" + return x + }() +} + +func foo23(x int) func() int { + return func() int { // ERROR "func literal escapes to heap$" + return x + } +} + +func foo23a(x int) func() int { + f := func() int { // ERROR "func literal escapes to heap$" + return x + } + return f +} + +func foo23b(x int) *(func() int) { + f := func() int { return x } // ERROR "func literal escapes to heap$" "moved to heap: f$" + return &f +} + +func foo23c(x int) func() int { // ERROR "moved to heap: x$" + return func() int { // ERROR "func literal escapes to heap$" + x++ + return x + } +} + +func foo24(x int) int { + return func() int { // ERROR "foo24 func literal does not escape$" + return x + }() +} + +var x *int + +func fooleak(xx *int) int { // ERROR "leaking param: xx$" + x = xx + return *x +} + +func foonoleak(xx *int) int { // ERROR "foonoleak xx does not escape$" + return *x + *xx +} + +func foo31(x int) int { // ERROR "moved to heap: x$" + return fooleak(&x) +} + +func foo32(x int) int { + return foonoleak(&x) +} + +type Foo struct { + xx *int + x int +} + +var F Foo +var pf *Foo + +func (f *Foo) fooleak() { // ERROR "leaking param: f$" + pf = f +} + +func (f *Foo) foonoleak() { // ERROR "\(\*Foo\).foonoleak f does not escape$" + F.x = f.x +} + +func (f *Foo) Leak() { // ERROR "leaking param: f$" + f.fooleak() +} + +func (f *Foo) NoLeak() { // ERROR "\(\*Foo\).NoLeak f does not escape$" + f.foonoleak() +} + +func foo41(x int) { // ERROR "moved to heap: x$" + F.xx = &x +} + +func (f *Foo) foo42(x int) { // ERROR "\(\*Foo\).foo42 f does not escape$" "moved to heap: x$" + f.xx = &x +} + +func foo43(f *Foo, x int) { // ERROR "foo43 f does not escape$" "moved to heap: x$" + f.xx = &x +} + +func foo44(yy *int) { // ERROR "leaking param: yy$" + F.xx = yy +} + +func (f *Foo) foo45() { // ERROR "\(\*Foo\).foo45 f does not escape$" + F.x = f.x +} + +// See foo13 above for explanation of why f leaks. +func (f *Foo) foo46() { // ERROR "leaking param content: f$" + F.xx = f.xx +} + +func (f *Foo) foo47() { // ERROR "leaking param: f$" + f.xx = &f.x +} + +var ptrSlice []*int + +func foo50(i *int) { // ERROR "leaking param: i$" + ptrSlice[0] = i +} + +var ptrMap map[*int]*int + +func foo51(i *int) { // ERROR "leaking param: i$" + ptrMap[i] = i +} + +func indaddr1(x int) *int { // ERROR "moved to heap: x$" + return &x +} + +func indaddr2(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return *&x +} + +func indaddr3(x *int32) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return *(**int)(unsafe.Pointer(&x)) +} + +// From package math: + +func Float32bits(f float32) uint32 { + return *(*uint32)(unsafe.Pointer(&f)) +} + +func Float32frombits(b uint32) float32 { + return *(*float32)(unsafe.Pointer(&b)) +} + +func Float64bits(f float64) uint64 { + return *(*uint64)(unsafe.Pointer(&f)) +} + +func Float64frombits(b uint64) float64 { + return *(*float64)(unsafe.Pointer(&b)) +} + +// contrast with +func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f$" + return (*uint64)(unsafe.Pointer(&f)) +} + +func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f to result ~r1 level=0$" + return (*uint64)(unsafe.Pointer(f)) +} + +func typesw(i interface{}) *int { // ERROR "leaking param: i to result ~r1 level=0$" + switch val := i.(type) { + case *int: + return val + case *int8: + v := int(*val) // ERROR "moved to heap: v$" + return &v + } + return nil +} + +func exprsw(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + switch j := i; *j + 110 { + case 12: + return j + case 42: + return nil + } + return nil + +} + +// assigning to an array element is like assigning to the array +func foo60(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + var a [12]*int + a[0] = i + return a[1] +} + +func foo60a(i *int) *int { // ERROR "foo60a i does not escape$" + var a [12]*int + a[0] = i + return nil +} + +// assigning to a struct field is like assigning to the struct +func foo61(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + type S struct { + a, b *int + } + var s S + s.a = i + return s.b +} + +func foo61a(i *int) *int { // ERROR "foo61a i does not escape$" + type S struct { + a, b *int + } + var s S + s.a = i + return nil +} + +// assigning to a struct field is like assigning to the struct but +// here this subtlety is lost, since s.a counts as an assignment to a +// track-losing dereference. +func foo62(i *int) *int { // ERROR "leaking param: i$" + type S struct { + a, b *int + } + s := new(S) // ERROR "foo62 new\(S\) does not escape$" + s.a = i + return nil // s.b +} + +type M interface { + M() +} + +func foo63(m M) { // ERROR "foo63 m does not escape$" +} + +func foo64(m M) { // ERROR "leaking param: m$" + m.M() +} + +func foo64b(m M) { // ERROR "leaking param: m$" + defer m.M() +} + +type MV int + +func (MV) M() {} + +func foo65() { + var mv MV + foo63(&mv) // ERROR "foo65 &mv does not escape$" +} + +func foo66() { + var mv MV // ERROR "moved to heap: mv$" + foo64(&mv) // ERROR "&mv escapes to heap$" +} + +func foo67() { + var mv MV + foo63(mv) // ERROR "foo67 mv does not escape$" +} + +func foo68() { + var mv MV + // escapes but it's an int so irrelevant + foo64(mv) // ERROR "mv escapes to heap$" +} + +func foo69(m M) { // ERROR "leaking param: m$" + foo64(m) +} + +func foo70(mv1 *MV, m M) { // ERROR "leaking param: m$" "leaking param: mv1$" + m = mv1 // ERROR "mv1 escapes to heap$" + foo64(m) +} + +func foo71(x *int) []*int { // ERROR "leaking param: x$" + var y []*int + y = append(y, x) + return y +} + +func foo71a(x int) []*int { // ERROR "moved to heap: x$" + var y []*int + y = append(y, &x) + return y +} + +func foo72() { + var x int + var y [1]*int + y[0] = &x +} + +func foo72aa() [10]*int { + var x int // ERROR "moved to heap: x$" + var y [10]*int + y[0] = &x + return y +} + +func foo72a() { + var y [10]*int + for i := 0; i < 10; i++ { + // escapes its scope + x := i // ERROR "moved to heap: x$" + y[i] = &x + } + return +} + +func foo72b() [10]*int { + var y [10]*int + for i := 0; i < 10; i++ { + x := i // ERROR "moved to heap: x$" + y[i] = &x + } + return y +} + +// issue 2145 +func foo73() { + s := []int{3, 2, 1} // ERROR "foo73 \[\]int literal does not escape$" + for _, v := range s { + vv := v + // actually just escapes its scope + defer func() { // ERROR "func literal escapes to heap$" + println(vv) + }() + } +} + +func foo731() { + s := []int{3, 2, 1} // ERROR "foo731 \[\]int literal does not escape$" + for _, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + defer func() { // ERROR "func literal escapes to heap$" + vv = 42 + println(vv) + }() + } +} + +func foo74() { + s := []int{3, 2, 1} // ERROR "foo74 \[\]int literal does not escape$" + for _, v := range s { + vv := v + // actually just escapes its scope + fn := func() { // ERROR "func literal escapes to heap$" + println(vv) + } + defer fn() + } +} + +func foo74a() { + s := []int{3, 2, 1} // ERROR "foo74a \[\]int literal does not escape$" + for _, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + fn := func() { // ERROR "func literal escapes to heap$" + vv += 1 + println(vv) + } + defer fn() + } +} + +// issue 3975 +func foo74b() { + var array [3]func() + s := []int{3, 2, 1} // ERROR "foo74b \[\]int literal does not escape$" + for i, v := range s { + vv := v + // actually just escapes its scope + array[i] = func() { // ERROR "func literal escapes to heap$" + println(vv) + } + } +} + +func foo74c() { + var array [3]func() + s := []int{3, 2, 1} // ERROR "foo74c \[\]int literal does not escape$" + for i, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + array[i] = func() { // ERROR "func literal escapes to heap$" + println(&vv) + } + } +} + +func myprint(y *int, x ...interface{}) *int { // ERROR "leaking param: y to result ~r2 level=0$" "myprint x does not escape$" + return y +} + +func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "leaking param: x to result ~r2 level=0$" "myprint1 y does not escape$" + return &x[0] +} + +func foo75(z *int) { // ERROR "foo75 z does not escape$" + myprint(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75 ... argument does not escape$" +} + +func foo75a(z *int) { // ERROR "foo75a z does not escape$" + myprint1(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75a ... argument does not escape$" +} + +func foo75esc(z *int) { // ERROR "leaking param: z$" + gxx = myprint(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75esc ... argument does not escape$" +} + +func foo75aesc(z *int) { // ERROR "foo75aesc z does not escape$" + var ppi **interface{} // assignments to pointer dereferences lose track + *ppi = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" +} + +func foo75aesc1(z *int) { // ERROR "foo75aesc1 z does not escape$" + sink = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "myprint1\(z, 1, 2, 3\) escapes to heap$" +} + +func foo76(z *int) { // ERROR "z does not escape" + myprint(nil, z) // ERROR "foo76 ... argument does not escape$" "z does not escape" +} + +func foo76a(z *int) { // ERROR "z does not escape" + myprint1(nil, z) // ERROR "foo76a ... argument does not escape$" "z does not escape" +} + +func foo76b() { + myprint(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76b ... argument does not escape$" +} + +func foo76c() { + myprint1(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76c ... argument does not escape$" +} + +func foo76d() { + defer myprint(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76d ... argument does not escape$" +} + +func foo76e() { + defer myprint1(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76e ... argument does not escape$" +} + +func foo76f() { + for { + // TODO: This one really only escapes its scope, but we don't distinguish yet. + defer myprint(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" + } +} + +func foo76g() { + for { + defer myprint1(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" + } +} + +func foo77(z []interface{}) { // ERROR "foo77 z does not escape$" + myprint(nil, z...) // z does not escape +} + +func foo77a(z []interface{}) { // ERROR "foo77a z does not escape$" + myprint1(nil, z...) +} + +func foo77b(z []interface{}) { // ERROR "leaking param: z$" + var ppi **interface{} + *ppi = myprint1(nil, z...) +} + +func foo77c(z []interface{}) { // ERROR "leaking param: z$" + sink = myprint1(nil, z...) // ERROR "myprint1\(nil, z...\) escapes to heap$" +} + +func dotdotdot() { + i := 0 + myprint(nil, &i) // ERROR "&i does not escape" "dotdotdot ... argument does not escape$" + + j := 0 + myprint1(nil, &j) // ERROR "&j does not escape" "dotdotdot ... argument does not escape$" +} + +func foo78(z int) *int { // ERROR "moved to heap: z$" + return &z +} + +func foo78a(z int) *int { // ERROR "moved to heap: z$" + y := &z + x := &y + return *x // really return y +} + +func foo79() *int { + return new(int) // ERROR "new\(int\) escapes to heap$" +} + +func foo80() *int { + var z *int + for { + // Really just escapes its scope but we don't distinguish + z = new(int) // ERROR "new\(int\) escapes to heap$" + } + _ = z + return nil +} + +func foo81() *int { + for { + z := new(int) // ERROR "foo81 new\(int\) does not escape$" + _ = z + } + return nil +} + +func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param: p to result x level=0$" "leaking param: p to result y level=0$" + +func noop(x, y *int) {} // ERROR "noop x does not escape$" "noop y does not escape$" + +func foo82() { + var x, y, z int // ERROR "moved to heap: x$" "moved to heap: y$" "moved to heap: z$" + go noop(tee(&z)) + go noop(&x, &y) + for { + var u, v, w int // ERROR "moved to heap: u$" "moved to heap: v$" "moved to heap: w$" + defer noop(tee(&u)) + defer noop(&v, &w) + } +} + +type Fooer interface { + Foo() +} + +type LimitedFooer struct { + Fooer + N int64 +} + +func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r to result ~r2 level=-1$" + return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" +} + +func foo90(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo91(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo92(x *int) [2]*int { // ERROR "leaking param: x to result ~r1 level=0$" + return [2]*int{x, nil} +} + +// does not leak c +func foo93(c chan *int) *int { // ERROR "foo93 c does not escape$" + for v := range c { + return v + } + return nil +} + +// does not leak m +func foo94(m map[*int]*int, b bool) *int { // ERROR "leaking param: m to result ~r2 level=1" + for k, v := range m { + if b { + return k + } + return v + } + return nil +} + +// does leak x +func foo95(m map[*int]*int, x *int) { // ERROR "foo95 m does not escape$" "leaking param: x$" + m[x] = x +} + +// does not leak m but does leak content +func foo96(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1" + return m[0] +} + +// does leak m +func foo97(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" + return m[0] +} + +// does not leak m +func foo98(m map[int]*int) *int { // ERROR "foo98 m does not escape$" + return m[0] +} + +// does leak m +func foo99(m *[1]*int) []*int { // ERROR "leaking param: m to result ~r1 level=0$" + return m[:] +} + +// does not leak m +func foo100(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1" + for _, v := range m { + return v + } + return nil +} + +// does leak m +func foo101(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" + for _, v := range m { + return v + } + return nil +} + +// does not leak m +func foo101a(m [1]*int) *int { // ERROR "foo101a m does not escape$" + for i := range m { // ERROR "moved to heap: i$" + return &i + } + return nil +} + +// does leak x +func foo102(m []*int, x *int) { // ERROR "foo102 m does not escape$" "leaking param: x$" + m[0] = x +} + +// does not leak x +func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x does not escape$" + m[0] = x +} + +var y []*int + +// does not leak x but does leak content +func foo104(x []*int) { // ERROR "leaking param content: x" + copy(y, x) +} + +// does not leak x but does leak content +func foo105(x []*int) { // ERROR "leaking param content: x" + _ = append(y, x...) +} + +// does leak x +func foo106(x *int) { // ERROR "leaking param: x$" + _ = append(y, x) +} + +func foo107(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo108(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo109(x *int) *int { // ERROR "leaking param: x$" + m := map[*int]*int{x: nil} // ERROR "foo109 map\[\*int\]\*int literal does not escape$" + for k, _ := range m { + return k + } + return nil +} + +func foo110(x *int) *int { // ERROR "leaking param: x$" + m := map[*int]*int{nil: x} // ERROR "foo110 map\[\*int\]\*int literal does not escape$" + return m[nil] +} + +func foo111(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0" + m := []*int{x} // ERROR "foo111 \[\]\*int literal does not escape$" + return m[0] +} + +func foo112(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := [1]*int{x} + return m[0] +} + +func foo113(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := Bar{ii: x} + return m.ii +} + +func foo114(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := &Bar{ii: x} // ERROR "foo114 &Bar literal does not escape$" + return m.ii +} + +func foo115(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1)) +} + +func foo116(b bool) *int { + if b { + x := 1 // ERROR "moved to heap: x$" + return &x + } else { + y := 1 // ERROR "moved to heap: y$" + return &y + } + return nil +} + +func foo117(unknown func(interface{})) { // ERROR "foo117 unknown does not escape$" + x := 1 // ERROR "moved to heap: x$" + unknown(&x) // ERROR "&x escapes to heap$" +} + +func foo118(unknown func(*int)) { // ERROR "foo118 unknown does not escape$" + x := 1 // ERROR "moved to heap: x$" + unknown(&x) +} + +func external(*int) + +func foo119(x *int) { // ERROR "leaking param: x$" + external(x) +} + +func foo120() { + // formerly exponential time analysis +L1: +L2: +L3: +L4: +L5: +L6: +L7: +L8: +L9: +L10: +L11: +L12: +L13: +L14: +L15: +L16: +L17: +L18: +L19: +L20: +L21: +L22: +L23: +L24: +L25: +L26: +L27: +L28: +L29: +L30: +L31: +L32: +L33: +L34: +L35: +L36: +L37: +L38: +L39: +L40: +L41: +L42: +L43: +L44: +L45: +L46: +L47: +L48: +L49: +L50: +L51: +L52: +L53: +L54: +L55: +L56: +L57: +L58: +L59: +L60: +L61: +L62: +L63: +L64: +L65: +L66: +L67: +L68: +L69: +L70: +L71: +L72: +L73: +L74: +L75: +L76: +L77: +L78: +L79: +L80: +L81: +L82: +L83: +L84: +L85: +L86: +L87: +L88: +L89: +L90: +L91: +L92: +L93: +L94: +L95: +L96: +L97: +L98: +L99: +L100: + // use the labels to silence compiler errors + goto L1 + goto L2 + goto L3 + goto L4 + goto L5 + goto L6 + goto L7 + goto L8 + goto L9 + goto L10 + goto L11 + goto L12 + goto L13 + goto L14 + goto L15 + goto L16 + goto L17 + goto L18 + goto L19 + goto L20 + goto L21 + goto L22 + goto L23 + goto L24 + goto L25 + goto L26 + goto L27 + goto L28 + goto L29 + goto L30 + goto L31 + goto L32 + goto L33 + goto L34 + goto L35 + goto L36 + goto L37 + goto L38 + goto L39 + goto L40 + goto L41 + goto L42 + goto L43 + goto L44 + goto L45 + goto L46 + goto L47 + goto L48 + goto L49 + goto L50 + goto L51 + goto L52 + goto L53 + goto L54 + goto L55 + goto L56 + goto L57 + goto L58 + goto L59 + goto L60 + goto L61 + goto L62 + goto L63 + goto L64 + goto L65 + goto L66 + goto L67 + goto L68 + goto L69 + goto L70 + goto L71 + goto L72 + goto L73 + goto L74 + goto L75 + goto L76 + goto L77 + goto L78 + goto L79 + goto L80 + goto L81 + goto L82 + goto L83 + goto L84 + goto L85 + goto L86 + goto L87 + goto L88 + goto L89 + goto L90 + goto L91 + goto L92 + goto L93 + goto L94 + goto L95 + goto L96 + goto L97 + goto L98 + goto L99 + goto L100 +} + +func foo121() { + for i := 0; i < 10; i++ { + defer myprint(nil, i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + go myprint(nil, i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + } +} + +// same as foo121 but check across import +func foo121b() { + for i := 0; i < 10; i++ { + defer fmt.Printf("%d", i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + go fmt.Printf("%d", i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + } +} + +// a harmless forward jump +func foo122() { + var i *int + + goto L1 +L1: + i = new(int) // ERROR "foo122 new\(int\) does not escape$" + _ = i +} + +// a backward jump, increases loopdepth +func foo123() { + var i *int + +L1: + i = new(int) // ERROR "new\(int\) escapes to heap$" + + goto L1 + _ = i +} + +func foo124(x **int) { // ERROR "foo124 x does not escape$" + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo124 func literal does not escape$" + *x = p + }() +} + +func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo125 func literal does not escape$" + ch <- p + }() +} + +func foo126() { + var px *int // loopdepth 0 + for { + // loopdepth 1 + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo126 func literal does not escape$" + px = &i + }() + } + _ = px +} + +var px *int + +func foo127() { + var i int // ERROR "moved to heap: i$" + p := &i + q := p + px = q +} + +func foo128() { + var i int + p := &i + q := p + _ = q +} + +func foo129() { + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo129 func literal does not escape$" + q := p + func() { // ERROR "foo129.func1 func literal does not escape$" + r := q + px = r + }() + }() +} + +func foo130() { + for { + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo130 func literal does not escape$" + px = &i + }() + } +} + +func foo131() { + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo131 func literal does not escape$" + px = &i + }() +} + +func foo132() { + var i int // ERROR "moved to heap: i$" + go func() { // ERROR "func literal escapes to heap$" + px = &i + }() +} + +func foo133() { + var i int // ERROR "moved to heap: i$" + defer func() { // ERROR "foo133 func literal does not escape$" + px = &i + }() +} + +func foo134() { + var i int + p := &i + func() { // ERROR "foo134 func literal does not escape$" + q := p + func() { // ERROR "foo134.func1 func literal does not escape$" + r := q + _ = r + }() + }() +} + +func foo135() { + var i int // ERROR "moved to heap: i$" + p := &i + go func() { // ERROR "func literal escapes to heap$" + q := p + func() { // ERROR "foo135.func1 func literal does not escape$" + r := q + _ = r + }() + }() +} + +func foo136() { + var i int // ERROR "moved to heap: i$" + p := &i + go func() { // ERROR "func literal escapes to heap$" + q := p + func() { // ERROR "foo136.func1 func literal does not escape$" + r := q + px = r + }() + }() +} + +func foo137() { + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo137 func literal does not escape$" + q := p + go func() { // ERROR "func literal escapes to heap$" + r := q + _ = r + }() + }() +} + +func foo138() *byte { + type T struct { + x [1]byte + } + t := new(T) // ERROR "new\(T\) escapes to heap$" + return &t.x[0] +} + +func foo139() *byte { + type T struct { + x struct { + y byte + } + } + t := new(T) // ERROR "new\(T\) escapes to heap$" + return &t.x.y +} + +// issue 4751 +func foo140() interface{} { + type T struct { + X string + } + type U struct { + X string + T *T + } + t := &T{} // ERROR "&T literal escapes to heap$" + return U{ // ERROR "U literal escapes to heap$" + X: t.X, + T: t, + } +} + +//go:noescape + +func F1([]byte) + +func F2([]byte) + +//go:noescape + +func F3(x []byte) // ERROR "F3 x does not escape$" + +func F4(x []byte) + +func G() { + var buf1 [10]byte + F1(buf1[:]) + + var buf2 [10]byte // ERROR "moved to heap: buf2$" + F2(buf2[:]) + + var buf3 [10]byte + F3(buf3[:]) + + var buf4 [10]byte // ERROR "moved to heap: buf4$" + F4(buf4[:]) +} + +type Tm struct { + x int +} + +func (t *Tm) M() { // ERROR "\(\*Tm\).M t does not escape$" +} + +func foo141() { + var f func() + + t := new(Tm) // ERROR "new\(Tm\) escapes to heap$" + f = t.M // ERROR "foo141 t.M does not escape$" + _ = f +} + +var gf func() + +func foo142() { + t := new(Tm) // ERROR "new\(Tm\) escapes to heap$" + gf = t.M // ERROR "t.M escapes to heap$" +} + +// issue 3888. +func foo143() { + for i := 0; i < 1000; i++ { + func() { // ERROR "foo143 func literal does not escape$" + for i := 0; i < 1; i++ { + var t Tm + t.M() + } + }() + } +} + +// issue 5773 +// Check that annotations take effect regardless of whether they +// are before or after the use in the source code. + +//go:noescape + +func foo144a(*int) + +func foo144() { + var x int + foo144a(&x) + var y int + foo144b(&y) +} + +//go:noescape + +func foo144b(*int) + +// issue 7313: for loop init should not be treated as "in loop" + +type List struct { + Next *List +} + +func foo145(l List) { // ERROR "foo145 l does not escape$" + var p *List + for p = &l; p.Next != nil; p = p.Next { + } +} + +func foo146(l List) { // ERROR "foo146 l does not escape$" + var p *List + p = &l + for ; p.Next != nil; p = p.Next { + } +} + +func foo147(l List) { // ERROR "foo147 l does not escape$" + var p *List + p = &l + for p.Next != nil { + p = p.Next + } +} + +func foo148(l List) { // ERROR "foo148 l does not escape$" + for p := &l; p.Next != nil; p = p.Next { + } +} + +// related: address of variable should have depth of variable, not of loop + +func foo149(l List) { // ERROR "foo149 l does not escape$" + var p *List + for { + for p = &l; p.Next != nil; p = p.Next { + } + } +} + +// issue 7934: missed ... if element type had no pointers + +var save150 []byte + +func foo150(x ...byte) { // ERROR "leaking param: x$" + save150 = x +} + +func bar150() { + foo150(1, 2, 3) // ERROR "... argument escapes to heap$" +} + +// issue 7931: bad handling of slice of array + +var save151 *int + +func foo151(x *int) { // ERROR "leaking param: x$" + save151 = x +} + +func bar151() { + var a [64]int // ERROR "moved to heap: a$" + a[4] = 101 + foo151(&(&a)[4:8][0]) +} + +func bar151b() { + var a [10]int // ERROR "moved to heap: a$" + b := a[:] + foo151(&b[4:8][0]) +} + +func bar151c() { + var a [64]int // ERROR "moved to heap: a$" + a[4] = 101 + foo151(&(&a)[4:8:8][0]) +} + +func bar151d() { + var a [10]int // ERROR "moved to heap: a$" + b := a[:] + foo151(&b[4:8:8][0]) +} + +// issue 8120 + +type U struct { + s *string +} + +func (u *U) String() *string { // ERROR "leaking param: u to result ~r0 level=1$" + return u.s +} + +type V struct { + s *string +} + +// BAD -- level of leak ought to be 0 +func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" + return &V{u.String()} // ERROR "&V literal escapes to heap$" +} + +func foo152() { + a := "a" // ERROR "moved to heap: a$" + u := U{&a} + v := NewV(u) + println(v) +} + +// issue 8176 - &x in type switch body not marked as escaping + +func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" + switch x := v.(type) { + case int: // ERROR "moved to heap: x$" + return &x + } + panic(0) +} + +// issue 8185 - &result escaping into result + +func f() (x int, y *int) { // ERROR "moved to heap: x$" + y = &x + return +} + +func g() (x interface{}) { // ERROR "moved to heap: x$" + x = &x // ERROR "&x escapes to heap$" + return +} + +var sink interface{} + +type Lit struct { + p *int +} + +func ptrlitNoescape() { + // Both literal and element do not escape. + i := 0 + x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" + _ = x +} + +func ptrlitNoEscape2() { + // Literal does not escape, but element does. + i := 0 // ERROR "moved to heap: i$" + x := &Lit{&i} // ERROR "ptrlitNoEscape2 &Lit literal does not escape$" + sink = *x // ERROR "\*x escapes to heap$" +} + +func ptrlitEscape() { + // Both literal and element escape. + i := 0 // ERROR "moved to heap: i$" + x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" + sink = x // ERROR "x escapes to heap$" +} + +// self-assignments + +type Buffer struct { + arr [64]byte + arrPtr *[64]byte + buf1 []byte + buf2 []byte + str1 string + str2 string +} + +func (b *Buffer) foo() { // ERROR "\(\*Buffer\).foo b does not escape$" + b.buf1 = b.buf1[1:2] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf1\[1:2\]$" + b.buf1 = b.buf1[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf1\[1:2:3\]$" + b.buf1 = b.buf2[1:2] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf2\[1:2\]$" + b.buf1 = b.buf2[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf2\[1:2:3\]$" +} + +func (b *Buffer) bar() { // ERROR "leaking param: b$" + b.buf1 = b.arr[1:2] +} + +func (b *Buffer) arrayPtr() { // ERROR "\(\*Buffer\).arrayPtr b does not escape" + b.buf1 = b.arrPtr[1:2] // ERROR "\(\*Buffer\).arrayPtr ignoring self-assignment in b.buf1 = b.arrPtr\[1:2\]$" + b.buf1 = b.arrPtr[1:2:3] // ERROR "\(\*Buffer\).arrayPtr ignoring self-assignment in b.buf1 = b.arrPtr\[1:2:3\]$" +} + +func (b *Buffer) baz() { // ERROR "\(\*Buffer\).baz b does not escape$" + b.str1 = b.str1[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment in b.str1 = b.str1\[1:2\]$" + b.str1 = b.str2[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment in b.str1 = b.str2\[1:2\]$" +} + +func (b *Buffer) bat() { // ERROR "leaking param content: b$" + o := new(Buffer) // ERROR "new\(Buffer\) escapes to heap$" + o.buf1 = b.buf1[1:2] + sink = o // ERROR "o escapes to heap$" +} + +func quux(sp *string, bp *[]byte) { // ERROR "quux bp does not escape$" "quux sp does not escape$" + *sp = (*sp)[1:2] // ERROR "quux ignoring self-assignment in \*sp = \(\*sp\)\[1:2\]$" + *bp = (*bp)[1:2] // ERROR "quux ignoring self-assignment in \*bp = \(\*bp\)\[1:2\]$" +} + +type StructWithString struct { + p *int + s string +} + +// This is escape analysis false negative. +// We assign the pointer to x.p but leak x.s. Escape analysis coarsens flows +// to just x, and thus &i looks escaping. +func fieldFlowTracking() { + var x StructWithString + i := 0 // ERROR "moved to heap: i$" + x.p = &i + sink = x.s // ERROR "x.s escapes to heap$" +} + +// String operations. + +func slicebytetostring0() { + b := make([]byte, 20) // ERROR "slicebytetostring0 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "slicebytetostring0 string\(b\) does not escape$" + _ = s +} + +func slicebytetostring1() { + b := make([]byte, 20) // ERROR "slicebytetostring1 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "slicebytetostring1 string\(b\) does not escape$" + s1 := s[0:1] + _ = s1 +} + +func slicebytetostring2() { + b := make([]byte, 20) // ERROR "slicebytetostring2 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "string\(b\) escapes to heap$" + s1 := s[0:1] // ERROR "moved to heap: s1$" + sink = &s1 // ERROR "&s1 escapes to heap$" +} + +func slicebytetostring3() { + b := make([]byte, 20) // ERROR "slicebytetostring3 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "string\(b\) escapes to heap$" + s1 := s[0:1] + sink = s1 // ERROR "s1 escapes to heap$" +} + +func addstr0() { + s0 := "a" + s1 := "b" + s := s0 + s1 // ERROR "addstr0 s0 \+ s1 does not escape$" + _ = s +} + +func addstr1() { + s0 := "a" + s1 := "b" + s := "c" + s += s0 + s1 // ERROR "addstr1 s0 \+ s1 does not escape$" + _ = s +} + +func addstr2() { + b := make([]byte, 20) // ERROR "addstr2 make\(\[\]byte, 20\) does not escape$" + s0 := "a" + s := string(b) + s0 // ERROR "addstr2 string\(b\) \+ s0 does not escape$" "addstr2 string\(b\) does not escape$" + _ = s +} + +func addstr3() { + s0 := "a" + s1 := "b" + s := s0 + s1 // ERROR "s0 \+ s1 escapes to heap$" + s2 := s[0:1] + sink = s2 // ERROR "s2 escapes to heap$" +} + +func intstring0() bool { + // string does not escape + x := '0' + s := string(x) // ERROR "intstring0 string\(x\) does not escape$" + return s == "0" +} + +func intstring1() string { + // string does not escape, but the buffer does + x := '0' + s := string(x) // ERROR "string\(x\) escapes to heap$" + return s +} + +func intstring2() { + // string escapes to heap + x := '0' + s := string(x) // ERROR "moved to heap: s$" "string\(x\) escapes to heap$" + sink = &s // ERROR "&s escapes to heap$" +} + +func stringtoslicebyte0() { + s := "foo" + x := []byte(s) // ERROR "stringtoslicebyte0 \(\[\]byte\)\(s\) does not escape$" + _ = x +} + +func stringtoslicebyte1() []byte { + s := "foo" + return []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$" +} + +func stringtoslicebyte2() { + s := "foo" + sink = []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$" +} + +func stringtoslicerune0() { + s := "foo" + x := []rune(s) // ERROR "stringtoslicerune0 \(\[\]rune\)\(s\) does not escape$" + _ = x +} + +func stringtoslicerune1() []rune { + s := "foo" + return []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$" +} + +func stringtoslicerune2() { + s := "foo" + sink = []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$" +} + +func slicerunetostring0() { + r := []rune{1, 2, 3} // ERROR "slicerunetostring0 \[\]rune literal does not escape$" + s := string(r) // ERROR "slicerunetostring0 string\(r\) does not escape$" + _ = s +} + +func slicerunetostring1() string { + r := []rune{1, 2, 3} // ERROR "slicerunetostring1 \[\]rune literal does not escape$" + return string(r) // ERROR "string\(r\) escapes to heap$" +} + +func slicerunetostring2() { + r := []rune{1, 2, 3} // ERROR "slicerunetostring2 \[\]rune literal does not escape$" + sink = string(r) // ERROR "string\(r\) escapes to heap$" +} + +func makemap0() { + m := make(map[int]int) // ERROR "makemap0 make\(map\[int\]int\) does not escape$" + m[0] = 0 + m[1]++ + delete(m, 1) + sink = m[0] // ERROR "m\[0\] escapes to heap$" +} + +func makemap1() map[int]int { + return make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$" +} + +func makemap2() { + m := make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$" + sink = m // ERROR "m escapes to heap$" +} + +func nonescapingEface(m map[interface{}]bool) bool { // ERROR "nonescapingEface m does not escape$" + return m["foo"] // ERROR "nonescapingEface .foo. does not escape$" +} + +func nonescapingIface(m map[M]bool) bool { // ERROR "nonescapingIface m does not escape$" + return m[MV(0)] // ERROR "nonescapingIface MV\(0\) does not escape$" +} + +func issue10353() { + x := new(int) // ERROR "new\(int\) escapes to heap$" + issue10353a(x)() +} + +func issue10353a(x *int) func() { // ERROR "leaking param: x to result ~r1 level=-1$" + return func() { // ERROR "func literal escapes to heap$" + println(*x) + } +} + +func issue10353b() { + var f func() + for { + x := new(int) // ERROR "new\(int\) escapes to heap$" + f = func() { // ERROR "func literal escapes to heap$" + println(*x) + } + } + _ = f +} + +func issue11387(x int) func() int { + f := func() int { return x } // ERROR "func literal escapes to heap" + slice1 := []func() int{f} // ERROR "\[\].* does not escape" + slice2 := make([]func() int, 1) // ERROR "make\(.*\) does not escape" + copy(slice2, slice1) + return slice2[0] +} + +func issue12397(x, y int) { // ERROR "moved to heap: y$" + // x does not escape below, because all relevant code is dead. + if false { + gxx = &x + } else { + gxx = &y + } + + if true { + gxx = &y + } else { + gxx = &x + } +} diff --git a/test/oldescape2n.go b/test/oldescape2n.go new file mode 100644 index 0000000000..fb2a956618 --- /dev/null +++ b/test/oldescape2n.go @@ -0,0 +1,1847 @@ +// errorcheck -0 -N -m -l -newescape=false + +// Copyright 2010 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. + +// Test, using compiler diagnostic flags, that the escape analysis is working. +// Compiles but does not run. Inlining is disabled. +// Registerization is disabled too (-N), which should +// have no effect on escape analysis. + +package foo + +import ( + "fmt" + "unsafe" +) + +var gxx *int + +func foo1(x int) { // ERROR "moved to heap: x$" + gxx = &x +} + +func foo2(yy *int) { // ERROR "leaking param: yy$" + gxx = yy +} + +func foo3(x int) *int { // ERROR "moved to heap: x$" + return &x +} + +type T *T + +func foo3b(t T) { // ERROR "leaking param: t$" + *t = t +} + +// xx isn't going anywhere, so use of yy is ok +func foo4(xx, yy *int) { // ERROR "foo4 xx does not escape$" "foo4 yy does not escape$" + xx = yy +} + +// xx isn't going anywhere, so taking address of yy is ok +func foo5(xx **int, yy *int) { // ERROR "foo5 xx does not escape$" "foo5 yy does not escape$" + xx = &yy +} + +func foo6(xx **int, yy *int) { // ERROR "foo6 xx does not escape$" "leaking param: yy$" + *xx = yy +} + +func foo7(xx **int, yy *int) { // ERROR "foo7 xx does not escape$" "foo7 yy does not escape$" + **xx = *yy +} + +func foo8(xx, yy *int) int { // ERROR "foo8 xx does not escape$" "foo8 yy does not escape$" + xx = yy + return *xx +} + +func foo9(xx, yy *int) *int { // ERROR "leaking param: xx to result ~r2 level=0$" "leaking param: yy to result ~r2 level=0$" + xx = yy + return xx +} + +func foo10(xx, yy *int) { // ERROR "foo10 xx does not escape$" "foo10 yy does not escape$" + *xx = *yy +} + +func foo11() int { + x, y := 0, 42 + xx := &x + yy := &y + *xx = *yy + return x +} + +var xxx **int + +func foo12(yyy **int) { // ERROR "leaking param: yyy$" + xxx = yyy +} + +// Must treat yyy as leaking because *yyy leaks, and the escape analysis +// summaries in exported metadata do not distinguish these two cases. +func foo13(yyy **int) { // ERROR "leaking param content: yyy$" + *xxx = *yyy +} + +func foo14(yyy **int) { // ERROR "foo14 yyy does not escape$" + **xxx = **yyy +} + +func foo15(yy *int) { // ERROR "moved to heap: yy$" + xxx = &yy +} + +func foo16(yy *int) { // ERROR "leaking param: yy$" + *xxx = yy +} + +func foo17(yy *int) { // ERROR "foo17 yy does not escape$" + **xxx = *yy +} + +func foo18(y int) { // ERROR "moved to heap: y$" + *xxx = &y +} + +func foo19(y int) { + **xxx = y +} + +type Bar struct { + i int + ii *int +} + +func NewBar() *Bar { + return &Bar{42, nil} // ERROR "&Bar literal escapes to heap$" +} + +func NewBarp(x *int) *Bar { // ERROR "leaking param: x to result ~r1 level=-1$" + return &Bar{42, x} // ERROR "&Bar literal escapes to heap$" +} + +func NewBarp2(x *int) *Bar { // ERROR "NewBarp2 x does not escape$" + return &Bar{*x, nil} // ERROR "&Bar literal escapes to heap$" +} + +func (b *Bar) NoLeak() int { // ERROR "\(\*Bar\).NoLeak b does not escape$" + return *(b.ii) +} + +func (b *Bar) Leak() *int { // ERROR "leaking param: b to result ~r0 level=0$" + return &b.i +} + +func (b *Bar) AlsoNoLeak() *int { // ERROR "leaking param: b to result ~r0 level=1$" + return b.ii +} + +func (b Bar) AlsoLeak() *int { // ERROR "leaking param: b to result ~r0 level=0$" + return b.ii +} + +func (b Bar) LeaksToo() *int { // ERROR "leaking param: b to result ~r0 level=0$" + v := 0 // ERROR "moved to heap: v$" + b.ii = &v + return b.ii +} + +func (b *Bar) LeaksABit() *int { // ERROR "leaking param: b to result ~r0 level=1$" + v := 0 // ERROR "moved to heap: v$" + b.ii = &v + return b.ii +} + +func (b Bar) StillNoLeak() int { // ERROR "Bar.StillNoLeak b does not escape$" + v := 0 + b.ii = &v + return b.i +} + +func goLeak(b *Bar) { // ERROR "leaking param: b$" + go b.NoLeak() +} + +type Bar2 struct { + i [12]int + ii []int +} + +func NewBar2() *Bar2 { + return &Bar2{[12]int{42}, nil} // ERROR "&Bar2 literal escapes to heap$" +} + +func (b *Bar2) NoLeak() int { // ERROR "\(\*Bar2\).NoLeak b does not escape$" + return b.i[0] +} + +func (b *Bar2) Leak() []int { // ERROR "leaking param: b to result ~r0 level=0$" + return b.i[:] +} + +func (b *Bar2) AlsoNoLeak() []int { // ERROR "leaking param: b to result ~r0 level=1$" + return b.ii[0:1] +} + +func (b Bar2) AgainNoLeak() [12]int { // ERROR "Bar2.AgainNoLeak b does not escape$" + return b.i +} + +func (b *Bar2) LeakSelf() { // ERROR "leaking param: b$" + b.ii = b.i[0:4] +} + +func (b *Bar2) LeakSelf2() { // ERROR "leaking param: b$" + var buf []int + buf = b.i[0:] + b.ii = buf +} + +func foo21() func() int { + x := 42 + return func() int { // ERROR "func literal escapes to heap$" + return x + } +} + +func foo21a() func() int { + x := 42 // ERROR "moved to heap: x$" + return func() int { // ERROR "func literal escapes to heap$" + x++ + return x + } +} + +func foo22() int { + x := 42 + return func() int { // ERROR "foo22 func literal does not escape$" + return x + }() +} + +func foo23(x int) func() int { + return func() int { // ERROR "func literal escapes to heap$" + return x + } +} + +func foo23a(x int) func() int { + f := func() int { // ERROR "func literal escapes to heap$" + return x + } + return f +} + +func foo23b(x int) *(func() int) { + f := func() int { return x } // ERROR "func literal escapes to heap$" "moved to heap: f$" + return &f +} + +func foo23c(x int) func() int { // ERROR "moved to heap: x$" + return func() int { // ERROR "func literal escapes to heap$" + x++ + return x + } +} + +func foo24(x int) int { + return func() int { // ERROR "foo24 func literal does not escape$" + return x + }() +} + +var x *int + +func fooleak(xx *int) int { // ERROR "leaking param: xx$" + x = xx + return *x +} + +func foonoleak(xx *int) int { // ERROR "foonoleak xx does not escape$" + return *x + *xx +} + +func foo31(x int) int { // ERROR "moved to heap: x$" + return fooleak(&x) +} + +func foo32(x int) int { + return foonoleak(&x) +} + +type Foo struct { + xx *int + x int +} + +var F Foo +var pf *Foo + +func (f *Foo) fooleak() { // ERROR "leaking param: f$" + pf = f +} + +func (f *Foo) foonoleak() { // ERROR "\(\*Foo\).foonoleak f does not escape$" + F.x = f.x +} + +func (f *Foo) Leak() { // ERROR "leaking param: f$" + f.fooleak() +} + +func (f *Foo) NoLeak() { // ERROR "\(\*Foo\).NoLeak f does not escape$" + f.foonoleak() +} + +func foo41(x int) { // ERROR "moved to heap: x$" + F.xx = &x +} + +func (f *Foo) foo42(x int) { // ERROR "\(\*Foo\).foo42 f does not escape$" "moved to heap: x$" + f.xx = &x +} + +func foo43(f *Foo, x int) { // ERROR "foo43 f does not escape$" "moved to heap: x$" + f.xx = &x +} + +func foo44(yy *int) { // ERROR "leaking param: yy$" + F.xx = yy +} + +func (f *Foo) foo45() { // ERROR "\(\*Foo\).foo45 f does not escape$" + F.x = f.x +} + +// See foo13 above for explanation of why f leaks. +func (f *Foo) foo46() { // ERROR "leaking param content: f$" + F.xx = f.xx +} + +func (f *Foo) foo47() { // ERROR "leaking param: f$" + f.xx = &f.x +} + +var ptrSlice []*int + +func foo50(i *int) { // ERROR "leaking param: i$" + ptrSlice[0] = i +} + +var ptrMap map[*int]*int + +func foo51(i *int) { // ERROR "leaking param: i$" + ptrMap[i] = i +} + +func indaddr1(x int) *int { // ERROR "moved to heap: x$" + return &x +} + +func indaddr2(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return *&x +} + +func indaddr3(x *int32) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return *(**int)(unsafe.Pointer(&x)) +} + +// From package math: + +func Float32bits(f float32) uint32 { + return *(*uint32)(unsafe.Pointer(&f)) +} + +func Float32frombits(b uint32) float32 { + return *(*float32)(unsafe.Pointer(&b)) +} + +func Float64bits(f float64) uint64 { + return *(*uint64)(unsafe.Pointer(&f)) +} + +func Float64frombits(b uint64) float64 { + return *(*float64)(unsafe.Pointer(&b)) +} + +// contrast with +func float64bitsptr(f float64) *uint64 { // ERROR "moved to heap: f$" + return (*uint64)(unsafe.Pointer(&f)) +} + +func float64ptrbitsptr(f *float64) *uint64 { // ERROR "leaking param: f to result ~r1 level=0$" + return (*uint64)(unsafe.Pointer(f)) +} + +func typesw(i interface{}) *int { // ERROR "leaking param: i to result ~r1 level=0$" + switch val := i.(type) { + case *int: + return val + case *int8: + v := int(*val) // ERROR "moved to heap: v$" + return &v + } + return nil +} + +func exprsw(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + switch j := i; *j + 110 { + case 12: + return j + case 42: + return nil + } + return nil + +} + +// assigning to an array element is like assigning to the array +func foo60(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + var a [12]*int + a[0] = i + return a[1] +} + +func foo60a(i *int) *int { // ERROR "foo60a i does not escape$" + var a [12]*int + a[0] = i + return nil +} + +// assigning to a struct field is like assigning to the struct +func foo61(i *int) *int { // ERROR "leaking param: i to result ~r1 level=0$" + type S struct { + a, b *int + } + var s S + s.a = i + return s.b +} + +func foo61a(i *int) *int { // ERROR "foo61a i does not escape$" + type S struct { + a, b *int + } + var s S + s.a = i + return nil +} + +// assigning to a struct field is like assigning to the struct but +// here this subtlety is lost, since s.a counts as an assignment to a +// track-losing dereference. +func foo62(i *int) *int { // ERROR "leaking param: i$" + type S struct { + a, b *int + } + s := new(S) // ERROR "foo62 new\(S\) does not escape$" + s.a = i + return nil // s.b +} + +type M interface { + M() +} + +func foo63(m M) { // ERROR "foo63 m does not escape$" +} + +func foo64(m M) { // ERROR "leaking param: m$" + m.M() +} + +func foo64b(m M) { // ERROR "leaking param: m$" + defer m.M() +} + +type MV int + +func (MV) M() {} + +func foo65() { + var mv MV + foo63(&mv) // ERROR "foo65 &mv does not escape$" +} + +func foo66() { + var mv MV // ERROR "moved to heap: mv$" + foo64(&mv) // ERROR "&mv escapes to heap$" +} + +func foo67() { + var mv MV + foo63(mv) // ERROR "foo67 mv does not escape$" +} + +func foo68() { + var mv MV + // escapes but it's an int so irrelevant + foo64(mv) // ERROR "mv escapes to heap$" +} + +func foo69(m M) { // ERROR "leaking param: m$" + foo64(m) +} + +func foo70(mv1 *MV, m M) { // ERROR "leaking param: m$" "leaking param: mv1$" + m = mv1 // ERROR "mv1 escapes to heap$" + foo64(m) +} + +func foo71(x *int) []*int { // ERROR "leaking param: x$" + var y []*int + y = append(y, x) + return y +} + +func foo71a(x int) []*int { // ERROR "moved to heap: x$" + var y []*int + y = append(y, &x) + return y +} + +func foo72() { + var x int + var y [1]*int + y[0] = &x +} + +func foo72aa() [10]*int { + var x int // ERROR "moved to heap: x$" + var y [10]*int + y[0] = &x + return y +} + +func foo72a() { + var y [10]*int + for i := 0; i < 10; i++ { + // escapes its scope + x := i // ERROR "moved to heap: x$" + y[i] = &x + } + return +} + +func foo72b() [10]*int { + var y [10]*int + for i := 0; i < 10; i++ { + x := i // ERROR "moved to heap: x$" + y[i] = &x + } + return y +} + +// issue 2145 +func foo73() { + s := []int{3, 2, 1} // ERROR "foo73 \[\]int literal does not escape$" + for _, v := range s { + vv := v + // actually just escapes its scope + defer func() { // ERROR "func literal escapes to heap$" + println(vv) + }() + } +} + +func foo731() { + s := []int{3, 2, 1} // ERROR "foo731 \[\]int literal does not escape$" + for _, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + defer func() { // ERROR "func literal escapes to heap$" + vv = 42 + println(vv) + }() + } +} + +func foo74() { + s := []int{3, 2, 1} // ERROR "foo74 \[\]int literal does not escape$" + for _, v := range s { + vv := v + // actually just escapes its scope + fn := func() { // ERROR "func literal escapes to heap$" + println(vv) + } + defer fn() + } +} + +func foo74a() { + s := []int{3, 2, 1} // ERROR "foo74a \[\]int literal does not escape$" + for _, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + fn := func() { // ERROR "func literal escapes to heap$" + vv += 1 + println(vv) + } + defer fn() + } +} + +// issue 3975 +func foo74b() { + var array [3]func() + s := []int{3, 2, 1} // ERROR "foo74b \[\]int literal does not escape$" + for i, v := range s { + vv := v + // actually just escapes its scope + array[i] = func() { // ERROR "func literal escapes to heap$" + println(vv) + } + } +} + +func foo74c() { + var array [3]func() + s := []int{3, 2, 1} // ERROR "foo74c \[\]int literal does not escape$" + for i, v := range s { + vv := v // ERROR "moved to heap: vv$" + // actually just escapes its scope + array[i] = func() { // ERROR "func literal escapes to heap$" + println(&vv) + } + } +} + +func myprint(y *int, x ...interface{}) *int { // ERROR "leaking param: y to result ~r2 level=0$" "myprint x does not escape$" + return y +} + +func myprint1(y *int, x ...interface{}) *interface{} { // ERROR "leaking param: x to result ~r2 level=0$" "myprint1 y does not escape$" + return &x[0] +} + +func foo75(z *int) { // ERROR "foo75 z does not escape$" + myprint(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75 ... argument does not escape$" +} + +func foo75a(z *int) { // ERROR "foo75a z does not escape$" + myprint1(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75a ... argument does not escape$" +} + +func foo75esc(z *int) { // ERROR "leaking param: z$" + gxx = myprint(z, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo75esc ... argument does not escape$" +} + +func foo75aesc(z *int) { // ERROR "foo75aesc z does not escape$" + var ppi **interface{} // assignments to pointer dereferences lose track + *ppi = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" +} + +func foo75aesc1(z *int) { // ERROR "foo75aesc1 z does not escape$" + sink = myprint1(z, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" "myprint1\(z, 1, 2, 3\) escapes to heap$" +} + +func foo76(z *int) { // ERROR "z does not escape" + myprint(nil, z) // ERROR "foo76 ... argument does not escape$" "z does not escape" +} + +func foo76a(z *int) { // ERROR "z does not escape" + myprint1(nil, z) // ERROR "foo76a ... argument does not escape$" "z does not escape" +} + +func foo76b() { + myprint(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76b ... argument does not escape$" +} + +func foo76c() { + myprint1(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76c ... argument does not escape$" +} + +func foo76d() { + defer myprint(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76d ... argument does not escape$" +} + +func foo76e() { + defer myprint1(nil, 1, 2, 3) // ERROR "1 does not escape" "2 does not escape" "3 does not escape" "foo76e ... argument does not escape$" +} + +func foo76f() { + for { + // TODO: This one really only escapes its scope, but we don't distinguish yet. + defer myprint(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" + } +} + +func foo76g() { + for { + defer myprint1(nil, 1, 2, 3) // ERROR "... argument escapes to heap$" "1 escapes to heap$" "2 escapes to heap$" "3 escapes to heap$" + } +} + +func foo77(z []interface{}) { // ERROR "foo77 z does not escape$" + myprint(nil, z...) // z does not escape +} + +func foo77a(z []interface{}) { // ERROR "foo77a z does not escape$" + myprint1(nil, z...) +} + +func foo77b(z []interface{}) { // ERROR "leaking param: z$" + var ppi **interface{} + *ppi = myprint1(nil, z...) +} + +func foo77c(z []interface{}) { // ERROR "leaking param: z$" + sink = myprint1(nil, z...) // ERROR "myprint1\(nil, z...\) escapes to heap$" +} + +func dotdotdot() { + i := 0 + myprint(nil, &i) // ERROR "&i does not escape" "dotdotdot ... argument does not escape$" + + j := 0 + myprint1(nil, &j) // ERROR "&j does not escape" "dotdotdot ... argument does not escape$" +} + +func foo78(z int) *int { // ERROR "moved to heap: z$" + return &z +} + +func foo78a(z int) *int { // ERROR "moved to heap: z$" + y := &z + x := &y + return *x // really return y +} + +func foo79() *int { + return new(int) // ERROR "new\(int\) escapes to heap$" +} + +func foo80() *int { + var z *int + for { + // Really just escapes its scope but we don't distinguish + z = new(int) // ERROR "new\(int\) escapes to heap$" + } + _ = z + return nil +} + +func foo81() *int { + for { + z := new(int) // ERROR "foo81 new\(int\) does not escape$" + _ = z + } + return nil +} + +func tee(p *int) (x, y *int) { return p, p } // ERROR "leaking param: p to result x level=0$" "leaking param: p to result y level=0$" + +func noop(x, y *int) {} // ERROR "noop x does not escape$" "noop y does not escape$" + +func foo82() { + var x, y, z int // ERROR "moved to heap: x$" "moved to heap: y$" "moved to heap: z$" + go noop(tee(&z)) + go noop(&x, &y) + for { + var u, v, w int // ERROR "moved to heap: u$" "moved to heap: v$" "moved to heap: w$" + defer noop(tee(&u)) + defer noop(&v, &w) + } +} + +type Fooer interface { + Foo() +} + +type LimitedFooer struct { + Fooer + N int64 +} + +func LimitFooer(r Fooer, n int64) Fooer { // ERROR "leaking param: r to result ~r2 level=-1$" + return &LimitedFooer{r, n} // ERROR "&LimitedFooer literal escapes to heap$" +} + +func foo90(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo91(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo92(x *int) [2]*int { // ERROR "leaking param: x to result ~r1 level=0$" + return [2]*int{x, nil} +} + +// does not leak c +func foo93(c chan *int) *int { // ERROR "foo93 c does not escape$" + for v := range c { + return v + } + return nil +} + +// does not leak m +func foo94(m map[*int]*int, b bool) *int { // ERROR "leaking param: m to result ~r2 level=1" + for k, v := range m { + if b { + return k + } + return v + } + return nil +} + +// does leak x +func foo95(m map[*int]*int, x *int) { // ERROR "foo95 m does not escape$" "leaking param: x$" + m[x] = x +} + +// does not leak m but does leak content +func foo96(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1" + return m[0] +} + +// does leak m +func foo97(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" + return m[0] +} + +// does not leak m +func foo98(m map[int]*int) *int { // ERROR "foo98 m does not escape$" + return m[0] +} + +// does leak m +func foo99(m *[1]*int) []*int { // ERROR "leaking param: m to result ~r1 level=0$" + return m[:] +} + +// does not leak m +func foo100(m []*int) *int { // ERROR "leaking param: m to result ~r1 level=1" + for _, v := range m { + return v + } + return nil +} + +// does leak m +func foo101(m [1]*int) *int { // ERROR "leaking param: m to result ~r1 level=0$" + for _, v := range m { + return v + } + return nil +} + +// does not leak m +func foo101a(m [1]*int) *int { // ERROR "foo101a m does not escape$" + for i := range m { // ERROR "moved to heap: i$" + return &i + } + return nil +} + +// does leak x +func foo102(m []*int, x *int) { // ERROR "foo102 m does not escape$" "leaking param: x$" + m[0] = x +} + +// does not leak x +func foo103(m [1]*int, x *int) { // ERROR "foo103 m does not escape$" "foo103 x does not escape$" + m[0] = x +} + +var y []*int + +// does not leak x but does leak content +func foo104(x []*int) { // ERROR "leaking param content: x" + copy(y, x) +} + +// does not leak x but does leak content +func foo105(x []*int) { // ERROR "leaking param content: x" + _ = append(y, x...) +} + +// does leak x +func foo106(x *int) { // ERROR "leaking param: x$" + _ = append(y, x) +} + +func foo107(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{x: nil} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo108(x *int) map[*int]*int { // ERROR "leaking param: x$" + return map[*int]*int{nil: x} // ERROR "map\[\*int\]\*int literal escapes to heap$" +} + +func foo109(x *int) *int { // ERROR "leaking param: x$" + m := map[*int]*int{x: nil} // ERROR "foo109 map\[\*int\]\*int literal does not escape$" + for k, _ := range m { + return k + } + return nil +} + +func foo110(x *int) *int { // ERROR "leaking param: x$" + m := map[*int]*int{nil: x} // ERROR "foo110 map\[\*int\]\*int literal does not escape$" + return m[nil] +} + +func foo111(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0" + m := []*int{x} // ERROR "foo111 \[\]\*int literal does not escape$" + return m[0] +} + +func foo112(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := [1]*int{x} + return m[0] +} + +func foo113(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := Bar{ii: x} + return m.ii +} + +func foo114(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + m := &Bar{ii: x} // ERROR "foo114 &Bar literal does not escape$" + return m.ii +} + +func foo115(x *int) *int { // ERROR "leaking param: x to result ~r1 level=0$" + return (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(x)) + 1)) +} + +func foo116(b bool) *int { + if b { + x := 1 // ERROR "moved to heap: x$" + return &x + } else { + y := 1 // ERROR "moved to heap: y$" + return &y + } + return nil +} + +func foo117(unknown func(interface{})) { // ERROR "foo117 unknown does not escape$" + x := 1 // ERROR "moved to heap: x$" + unknown(&x) // ERROR "&x escapes to heap$" +} + +func foo118(unknown func(*int)) { // ERROR "foo118 unknown does not escape$" + x := 1 // ERROR "moved to heap: x$" + unknown(&x) +} + +func external(*int) + +func foo119(x *int) { // ERROR "leaking param: x$" + external(x) +} + +func foo120() { + // formerly exponential time analysis +L1: +L2: +L3: +L4: +L5: +L6: +L7: +L8: +L9: +L10: +L11: +L12: +L13: +L14: +L15: +L16: +L17: +L18: +L19: +L20: +L21: +L22: +L23: +L24: +L25: +L26: +L27: +L28: +L29: +L30: +L31: +L32: +L33: +L34: +L35: +L36: +L37: +L38: +L39: +L40: +L41: +L42: +L43: +L44: +L45: +L46: +L47: +L48: +L49: +L50: +L51: +L52: +L53: +L54: +L55: +L56: +L57: +L58: +L59: +L60: +L61: +L62: +L63: +L64: +L65: +L66: +L67: +L68: +L69: +L70: +L71: +L72: +L73: +L74: +L75: +L76: +L77: +L78: +L79: +L80: +L81: +L82: +L83: +L84: +L85: +L86: +L87: +L88: +L89: +L90: +L91: +L92: +L93: +L94: +L95: +L96: +L97: +L98: +L99: +L100: + // use the labels to silence compiler errors + goto L1 + goto L2 + goto L3 + goto L4 + goto L5 + goto L6 + goto L7 + goto L8 + goto L9 + goto L10 + goto L11 + goto L12 + goto L13 + goto L14 + goto L15 + goto L16 + goto L17 + goto L18 + goto L19 + goto L20 + goto L21 + goto L22 + goto L23 + goto L24 + goto L25 + goto L26 + goto L27 + goto L28 + goto L29 + goto L30 + goto L31 + goto L32 + goto L33 + goto L34 + goto L35 + goto L36 + goto L37 + goto L38 + goto L39 + goto L40 + goto L41 + goto L42 + goto L43 + goto L44 + goto L45 + goto L46 + goto L47 + goto L48 + goto L49 + goto L50 + goto L51 + goto L52 + goto L53 + goto L54 + goto L55 + goto L56 + goto L57 + goto L58 + goto L59 + goto L60 + goto L61 + goto L62 + goto L63 + goto L64 + goto L65 + goto L66 + goto L67 + goto L68 + goto L69 + goto L70 + goto L71 + goto L72 + goto L73 + goto L74 + goto L75 + goto L76 + goto L77 + goto L78 + goto L79 + goto L80 + goto L81 + goto L82 + goto L83 + goto L84 + goto L85 + goto L86 + goto L87 + goto L88 + goto L89 + goto L90 + goto L91 + goto L92 + goto L93 + goto L94 + goto L95 + goto L96 + goto L97 + goto L98 + goto L99 + goto L100 +} + +func foo121() { + for i := 0; i < 10; i++ { + defer myprint(nil, i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + go myprint(nil, i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + } +} + +// same as foo121 but check across import +func foo121b() { + for i := 0; i < 10; i++ { + defer fmt.Printf("%d", i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + go fmt.Printf("%d", i) // ERROR "... argument escapes to heap$" "i escapes to heap$" + } +} + +// a harmless forward jump +func foo122() { + var i *int + + goto L1 +L1: + i = new(int) // ERROR "foo122 new\(int\) does not escape$" + _ = i +} + +// a backward jump, increases loopdepth +func foo123() { + var i *int + +L1: + i = new(int) // ERROR "new\(int\) escapes to heap$" + + goto L1 + _ = i +} + +func foo124(x **int) { // ERROR "foo124 x does not escape$" + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo124 func literal does not escape$" + *x = p + }() +} + +func foo125(ch chan *int) { // ERROR "foo125 ch does not escape$" + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo125 func literal does not escape$" + ch <- p + }() +} + +func foo126() { + var px *int // loopdepth 0 + for { + // loopdepth 1 + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo126 func literal does not escape$" + px = &i + }() + } + _ = px +} + +var px *int + +func foo127() { + var i int // ERROR "moved to heap: i$" + p := &i + q := p + px = q +} + +func foo128() { + var i int + p := &i + q := p + _ = q +} + +func foo129() { + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo129 func literal does not escape$" + q := p + func() { // ERROR "foo129.func1 func literal does not escape$" + r := q + px = r + }() + }() +} + +func foo130() { + for { + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo130 func literal does not escape$" + px = &i + }() + } +} + +func foo131() { + var i int // ERROR "moved to heap: i$" + func() { // ERROR "foo131 func literal does not escape$" + px = &i + }() +} + +func foo132() { + var i int // ERROR "moved to heap: i$" + go func() { // ERROR "func literal escapes to heap$" + px = &i + }() +} + +func foo133() { + var i int // ERROR "moved to heap: i$" + defer func() { // ERROR "foo133 func literal does not escape$" + px = &i + }() +} + +func foo134() { + var i int + p := &i + func() { // ERROR "foo134 func literal does not escape$" + q := p + func() { // ERROR "foo134.func1 func literal does not escape$" + r := q + _ = r + }() + }() +} + +func foo135() { + var i int // ERROR "moved to heap: i$" + p := &i + go func() { // ERROR "func literal escapes to heap$" + q := p + func() { // ERROR "foo135.func1 func literal does not escape$" + r := q + _ = r + }() + }() +} + +func foo136() { + var i int // ERROR "moved to heap: i$" + p := &i + go func() { // ERROR "func literal escapes to heap$" + q := p + func() { // ERROR "foo136.func1 func literal does not escape$" + r := q + px = r + }() + }() +} + +func foo137() { + var i int // ERROR "moved to heap: i$" + p := &i + func() { // ERROR "foo137 func literal does not escape$" + q := p + go func() { // ERROR "func literal escapes to heap$" + r := q + _ = r + }() + }() +} + +func foo138() *byte { + type T struct { + x [1]byte + } + t := new(T) // ERROR "new\(T\) escapes to heap$" + return &t.x[0] +} + +func foo139() *byte { + type T struct { + x struct { + y byte + } + } + t := new(T) // ERROR "new\(T\) escapes to heap$" + return &t.x.y +} + +// issue 4751 +func foo140() interface{} { + type T struct { + X string + } + type U struct { + X string + T *T + } + t := &T{} // ERROR "&T literal escapes to heap$" + return U{ // ERROR "U literal escapes to heap$" + X: t.X, + T: t, + } +} + +//go:noescape + +func F1([]byte) + +func F2([]byte) + +//go:noescape + +func F3(x []byte) // ERROR "F3 x does not escape$" + +func F4(x []byte) + +func G() { + var buf1 [10]byte + F1(buf1[:]) + + var buf2 [10]byte // ERROR "moved to heap: buf2$" + F2(buf2[:]) + + var buf3 [10]byte + F3(buf3[:]) + + var buf4 [10]byte // ERROR "moved to heap: buf4$" + F4(buf4[:]) +} + +type Tm struct { + x int +} + +func (t *Tm) M() { // ERROR "\(\*Tm\).M t does not escape$" +} + +func foo141() { + var f func() + + t := new(Tm) // ERROR "new\(Tm\) escapes to heap$" + f = t.M // ERROR "foo141 t.M does not escape$" + _ = f +} + +var gf func() + +func foo142() { + t := new(Tm) // ERROR "new\(Tm\) escapes to heap$" + gf = t.M // ERROR "t.M escapes to heap$" +} + +// issue 3888. +func foo143() { + for i := 0; i < 1000; i++ { + func() { // ERROR "foo143 func literal does not escape$" + for i := 0; i < 1; i++ { + var t Tm + t.M() + } + }() + } +} + +// issue 5773 +// Check that annotations take effect regardless of whether they +// are before or after the use in the source code. + +//go:noescape + +func foo144a(*int) + +func foo144() { + var x int + foo144a(&x) + var y int + foo144b(&y) +} + +//go:noescape + +func foo144b(*int) + +// issue 7313: for loop init should not be treated as "in loop" + +type List struct { + Next *List +} + +func foo145(l List) { // ERROR "foo145 l does not escape$" + var p *List + for p = &l; p.Next != nil; p = p.Next { + } +} + +func foo146(l List) { // ERROR "foo146 l does not escape$" + var p *List + p = &l + for ; p.Next != nil; p = p.Next { + } +} + +func foo147(l List) { // ERROR "foo147 l does not escape$" + var p *List + p = &l + for p.Next != nil { + p = p.Next + } +} + +func foo148(l List) { // ERROR "foo148 l does not escape$" + for p := &l; p.Next != nil; p = p.Next { + } +} + +// related: address of variable should have depth of variable, not of loop + +func foo149(l List) { // ERROR "foo149 l does not escape$" + var p *List + for { + for p = &l; p.Next != nil; p = p.Next { + } + } +} + +// issue 7934: missed ... if element type had no pointers + +var save150 []byte + +func foo150(x ...byte) { // ERROR "leaking param: x$" + save150 = x +} + +func bar150() { + foo150(1, 2, 3) // ERROR "... argument escapes to heap$" +} + +// issue 7931: bad handling of slice of array + +var save151 *int + +func foo151(x *int) { // ERROR "leaking param: x$" + save151 = x +} + +func bar151() { + var a [64]int // ERROR "moved to heap: a$" + a[4] = 101 + foo151(&(&a)[4:8][0]) +} + +func bar151b() { + var a [10]int // ERROR "moved to heap: a$" + b := a[:] + foo151(&b[4:8][0]) +} + +func bar151c() { + var a [64]int // ERROR "moved to heap: a$" + a[4] = 101 + foo151(&(&a)[4:8:8][0]) +} + +func bar151d() { + var a [10]int // ERROR "moved to heap: a$" + b := a[:] + foo151(&b[4:8:8][0]) +} + +// issue 8120 + +type U struct { + s *string +} + +func (u *U) String() *string { // ERROR "leaking param: u to result ~r0 level=1$" + return u.s +} + +type V struct { + s *string +} + +// BAD -- level of leak ought to be 0 +func NewV(u U) *V { // ERROR "leaking param: u to result ~r1 level=-1" + return &V{u.String()} // ERROR "&V literal escapes to heap$" +} + +func foo152() { + a := "a" // ERROR "moved to heap: a$" + u := U{&a} + v := NewV(u) + println(v) +} + +// issue 8176 - &x in type switch body not marked as escaping + +func foo153(v interface{}) *int { // ERROR "leaking param: v to result ~r1 level=-1$" + switch x := v.(type) { + case int: // ERROR "moved to heap: x$" + return &x + } + panic(0) +} + +// issue 8185 - &result escaping into result + +func f() (x int, y *int) { // ERROR "moved to heap: x$" + y = &x + return +} + +func g() (x interface{}) { // ERROR "moved to heap: x$" + x = &x // ERROR "&x escapes to heap$" + return +} + +var sink interface{} + +type Lit struct { + p *int +} + +func ptrlitNoescape() { + // Both literal and element do not escape. + i := 0 + x := &Lit{&i} // ERROR "ptrlitNoescape &Lit literal does not escape$" + _ = x +} + +func ptrlitNoEscape2() { + // Literal does not escape, but element does. + i := 0 // ERROR "moved to heap: i$" + x := &Lit{&i} // ERROR "ptrlitNoEscape2 &Lit literal does not escape$" + sink = *x // ERROR "\*x escapes to heap$" +} + +func ptrlitEscape() { + // Both literal and element escape. + i := 0 // ERROR "moved to heap: i$" + x := &Lit{&i} // ERROR "&Lit literal escapes to heap$" + sink = x // ERROR "x escapes to heap$" +} + +// self-assignments + +type Buffer struct { + arr [64]byte + arrPtr *[64]byte + buf1 []byte + buf2 []byte + str1 string + str2 string +} + +func (b *Buffer) foo() { // ERROR "\(\*Buffer\).foo b does not escape$" + b.buf1 = b.buf1[1:2] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf1\[1:2\]$" + b.buf1 = b.buf1[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf1\[1:2:3\]$" + b.buf1 = b.buf2[1:2] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf2\[1:2\]$" + b.buf1 = b.buf2[1:2:3] // ERROR "\(\*Buffer\).foo ignoring self-assignment in b.buf1 = b.buf2\[1:2:3\]$" +} + +func (b *Buffer) bar() { // ERROR "leaking param: b$" + b.buf1 = b.arr[1:2] +} + +func (b *Buffer) arrayPtr() { // ERROR "\(\*Buffer\).arrayPtr b does not escape" + b.buf1 = b.arrPtr[1:2] // ERROR "\(\*Buffer\).arrayPtr ignoring self-assignment in b.buf1 = b.arrPtr\[1:2\]$" + b.buf1 = b.arrPtr[1:2:3] // ERROR "\(\*Buffer\).arrayPtr ignoring self-assignment in b.buf1 = b.arrPtr\[1:2:3\]$" +} + +func (b *Buffer) baz() { // ERROR "\(\*Buffer\).baz b does not escape$" + b.str1 = b.str1[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment in b.str1 = b.str1\[1:2\]$" + b.str1 = b.str2[1:2] // ERROR "\(\*Buffer\).baz ignoring self-assignment in b.str1 = b.str2\[1:2\]$" +} + +func (b *Buffer) bat() { // ERROR "leaking param content: b$" + o := new(Buffer) // ERROR "new\(Buffer\) escapes to heap$" + o.buf1 = b.buf1[1:2] + sink = o // ERROR "o escapes to heap$" +} + +func quux(sp *string, bp *[]byte) { // ERROR "quux bp does not escape$" "quux sp does not escape$" + *sp = (*sp)[1:2] // ERROR "quux ignoring self-assignment in \*sp = \(\*sp\)\[1:2\]$" + *bp = (*bp)[1:2] // ERROR "quux ignoring self-assignment in \*bp = \(\*bp\)\[1:2\]$" +} + +type StructWithString struct { + p *int + s string +} + +// This is escape analysis false negative. +// We assign the pointer to x.p but leak x.s. Escape analysis coarsens flows +// to just x, and thus &i looks escaping. +func fieldFlowTracking() { + var x StructWithString + i := 0 // ERROR "moved to heap: i$" + x.p = &i + sink = x.s // ERROR "x.s escapes to heap$" +} + +// String operations. + +func slicebytetostring0() { + b := make([]byte, 20) // ERROR "slicebytetostring0 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "slicebytetostring0 string\(b\) does not escape$" + _ = s +} + +func slicebytetostring1() { + b := make([]byte, 20) // ERROR "slicebytetostring1 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "slicebytetostring1 string\(b\) does not escape$" + s1 := s[0:1] + _ = s1 +} + +func slicebytetostring2() { + b := make([]byte, 20) // ERROR "slicebytetostring2 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "string\(b\) escapes to heap$" + s1 := s[0:1] // ERROR "moved to heap: s1$" + sink = &s1 // ERROR "&s1 escapes to heap$" +} + +func slicebytetostring3() { + b := make([]byte, 20) // ERROR "slicebytetostring3 make\(\[\]byte, 20\) does not escape$" + s := string(b) // ERROR "string\(b\) escapes to heap$" + s1 := s[0:1] + sink = s1 // ERROR "s1 escapes to heap$" +} + +func addstr0() { + s0 := "a" + s1 := "b" + s := s0 + s1 // ERROR "addstr0 s0 \+ s1 does not escape$" + _ = s +} + +func addstr1() { + s0 := "a" + s1 := "b" + s := "c" + s += s0 + s1 // ERROR "addstr1 s0 \+ s1 does not escape$" + _ = s +} + +func addstr2() { + b := make([]byte, 20) // ERROR "addstr2 make\(\[\]byte, 20\) does not escape$" + s0 := "a" + s := string(b) + s0 // ERROR "addstr2 string\(b\) \+ s0 does not escape$" "addstr2 string\(b\) does not escape$" + _ = s +} + +func addstr3() { + s0 := "a" + s1 := "b" + s := s0 + s1 // ERROR "s0 \+ s1 escapes to heap$" + s2 := s[0:1] + sink = s2 // ERROR "s2 escapes to heap$" +} + +func intstring0() bool { + // string does not escape + x := '0' + s := string(x) // ERROR "intstring0 string\(x\) does not escape$" + return s == "0" +} + +func intstring1() string { + // string does not escape, but the buffer does + x := '0' + s := string(x) // ERROR "string\(x\) escapes to heap$" + return s +} + +func intstring2() { + // string escapes to heap + x := '0' + s := string(x) // ERROR "moved to heap: s$" "string\(x\) escapes to heap$" + sink = &s // ERROR "&s escapes to heap$" +} + +func stringtoslicebyte0() { + s := "foo" + x := []byte(s) // ERROR "stringtoslicebyte0 \(\[\]byte\)\(s\) does not escape$" + _ = x +} + +func stringtoslicebyte1() []byte { + s := "foo" + return []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$" +} + +func stringtoslicebyte2() { + s := "foo" + sink = []byte(s) // ERROR "\(\[\]byte\)\(s\) escapes to heap$" +} + +func stringtoslicerune0() { + s := "foo" + x := []rune(s) // ERROR "stringtoslicerune0 \(\[\]rune\)\(s\) does not escape$" + _ = x +} + +func stringtoslicerune1() []rune { + s := "foo" + return []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$" +} + +func stringtoslicerune2() { + s := "foo" + sink = []rune(s) // ERROR "\(\[\]rune\)\(s\) escapes to heap$" +} + +func slicerunetostring0() { + r := []rune{1, 2, 3} // ERROR "slicerunetostring0 \[\]rune literal does not escape$" + s := string(r) // ERROR "slicerunetostring0 string\(r\) does not escape$" + _ = s +} + +func slicerunetostring1() string { + r := []rune{1, 2, 3} // ERROR "slicerunetostring1 \[\]rune literal does not escape$" + return string(r) // ERROR "string\(r\) escapes to heap$" +} + +func slicerunetostring2() { + r := []rune{1, 2, 3} // ERROR "slicerunetostring2 \[\]rune literal does not escape$" + sink = string(r) // ERROR "string\(r\) escapes to heap$" +} + +func makemap0() { + m := make(map[int]int) // ERROR "makemap0 make\(map\[int\]int\) does not escape$" + m[0] = 0 + m[1]++ + delete(m, 1) + sink = m[0] // ERROR "m\[0\] escapes to heap$" +} + +func makemap1() map[int]int { + return make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$" +} + +func makemap2() { + m := make(map[int]int) // ERROR "make\(map\[int\]int\) escapes to heap$" + sink = m // ERROR "m escapes to heap$" +} + +func nonescapingEface(m map[interface{}]bool) bool { // ERROR "nonescapingEface m does not escape$" + return m["foo"] // ERROR "nonescapingEface .foo. does not escape$" +} + +func nonescapingIface(m map[M]bool) bool { // ERROR "nonescapingIface m does not escape$" + return m[MV(0)] // ERROR "nonescapingIface MV\(0\) does not escape$" +} + +func issue10353() { + x := new(int) // ERROR "new\(int\) escapes to heap$" + issue10353a(x)() +} + +func issue10353a(x *int) func() { // ERROR "leaking param: x to result ~r1 level=-1$" + return func() { // ERROR "func literal escapes to heap$" + println(*x) + } +} + +func issue10353b() { + var f func() + for { + x := new(int) // ERROR "new\(int\) escapes to heap$" + f = func() { // ERROR "func literal escapes to heap$" + println(*x) + } + } + _ = f +} + +func issue11387(x int) func() int { + f := func() int { return x } // ERROR "func literal escapes to heap" + slice1 := []func() int{f} // ERROR "\[\].* does not escape" + slice2 := make([]func() int, 1) // ERROR "make\(.*\) does not escape" + copy(slice2, slice1) + return slice2[0] +} + +func issue12397(x, y int) { // ERROR "moved to heap: y$" + // x does not escape below, because all relevant code is dead. + if false { + gxx = &x + } else { + gxx = &y + } + + if true { + gxx = &y + } else { + gxx = &x + } +} diff --git a/test/oldescape5.go b/test/oldescape5.go new file mode 100644 index 0000000000..53d0ff801d --- /dev/null +++ b/test/oldescape5.go @@ -0,0 +1,247 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2012 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. + +// Test, using compiler diagnostic flags, that the escape analysis is working. +// Compiles but does not run. Inlining is disabled. + +package foo + +import "runtime" + +func noleak(p *int) int { // ERROR "p does not escape" + return *p +} + +func leaktoret(p *int) *int { // ERROR "leaking param: p to result" + return p +} + +func leaktoret2(p *int) (*int, *int) { // ERROR "leaking param: p to result ~r1" "leaking param: p to result ~r2" + return p, p +} + +func leaktoret22(p, q *int) (*int, *int) { // ERROR "leaking param: p to result ~r2" "leaking param: q to result ~r3" + return p, q +} + +func leaktoret22b(p, q *int) (*int, *int) { // ERROR "leaking param: p to result ~r3" "leaking param: q to result ~r2" + return leaktoret22(q, p) +} + +func leaktoret22c(p, q *int) (*int, *int) { // ERROR "leaking param: p to result ~r3" "leaking param: q to result ~r2" + r, s := leaktoret22(q, p) + return r, s +} + +func leaktoret22d(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + r, s = leaktoret22(q, p) + return +} + +func leaktoret22e(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + r, s = leaktoret22(q, p) + return r, s +} + +func leaktoret22f(p, q *int) (r, s *int) { // ERROR "leaking param: p to result s" "leaking param: q to result r" + rr, ss := leaktoret22(q, p) + return rr, ss +} + +var gp *int + +func leaktosink(p *int) *int { // ERROR "leaking param: p" + gp = p + return p +} + +func f1() { + var x int + p := noleak(&x) + _ = p +} + +func f2() { + var x int + p := leaktoret(&x) + _ = p +} + +func f3() { + var x int // ERROR "moved to heap: x" + p := leaktoret(&x) + gp = p +} + +func f4() { + var x int // ERROR "moved to heap: x" + p, q := leaktoret2(&x) + gp = p + gp = q +} + +func f5() { + var x int + leaktoret22(leaktoret2(&x)) +} + +func f6() { + var x int // ERROR "moved to heap: x" + px1, px2 := leaktoret22(leaktoret2(&x)) + gp = px1 + _ = px2 +} + +type T struct{ x int } + +func (t *T) Foo(u int) (*T, bool) { // ERROR "leaking param: t to result" + t.x += u + return t, true +} + +func f7() *T { + r, _ := new(T).Foo(42) // ERROR "new.T. escapes to heap" + return r +} + +func leakrecursive1(p, q *int) (*int, *int) { // ERROR "leaking param: p" "leaking param: q" + return leakrecursive2(q, p) +} + +func leakrecursive2(p, q *int) (*int, *int) { // ERROR "leaking param: p" "leaking param: q" + if *p > *q { + return leakrecursive1(q, p) + } + // without this, leakrecursive? are safe for p and q, b/c in fact their graph does not have leaking edges. + return p, q +} + +var global interface{} + +type T1 struct { + X *int +} + +type T2 struct { + Y *T1 +} + +func f8(p *T1) (k T2) { // ERROR "leaking param: p to result k" "leaking param: p" + if p == nil { + k = T2{} + return + } + + // should make p leak always + global = p // ERROR "p escapes to heap" + return T2{p} +} + +func f9() { + var j T1 // ERROR "moved to heap: j" + f8(&j) +} + +func f10() { + // These don't escape but are too big for the stack + var x [1 << 30]byte // ERROR "moved to heap: x" + var y = make([]byte, 1<<30) // ERROR "make\(\[\]byte, 1 << 30\) escapes to heap" + _ = x[0] + y[0] +} + +// Test for issue 19687 (passing to unnamed parameters does not escape). +func f11(**int) { +} +func f12(_ **int) { +} +func f13() { + var x *int + f11(&x) + f12(&x) + runtime.KeepAlive(&x) // ERROR "&x does not escape" +} + +// Test for issue 24305 (passing to unnamed receivers does not escape). +type U int + +func (*U) M() {} +func (_ *U) N() {} + +func _() { + var u U + u.M() + u.N() +} + +// Issue 24730: taking address in a loop causes unnecessary escape +type T24730 struct { + x [64]byte +} + +func (t *T24730) g() { // ERROR "t does not escape" + y := t.x[:] + for i := range t.x[:] { + y = t.x[:] + y[i] = 1 + } + + var z *byte + for i := range t.x[:] { + z = &t.x[i] + *z = 2 + } +} + +// Issue 15730: copy causes unnecessary escape + +var sink []byte +var sink2 []int +var sink3 []*int + +func f15730a(args ...interface{}) { // ERROR "args does not escape" + for _, arg := range args { + switch a := arg.(type) { + case string: + copy(sink, a) + } + } +} + +func f15730b(args ...interface{}) { // ERROR "args does not escape" + for _, arg := range args { + switch a := arg.(type) { + case []int: + copy(sink2, a) + } + } +} + +func f15730c(args ...interface{}) { // ERROR "leaking param content: args" + for _, arg := range args { + switch a := arg.(type) { + case []*int: + // copy pointerful data should cause escape + copy(sink3, a) + } + } +} + +// Issue 29000: unnamed parameter is not handled correctly + +var sink4 interface{} +var alwaysFalse = false + +func f29000(_ int, x interface{}) { // ERROR "leaking param: x" + sink4 = x + if alwaysFalse { + g29000() + } +} + +func g29000() { + x := 1 + f29000(2, x) // ERROR "x escapes to heap" +} diff --git a/test/oldescape_calls.go b/test/oldescape_calls.go new file mode 100644 index 0000000000..715e832113 --- /dev/null +++ b/test/oldescape_calls.go @@ -0,0 +1,54 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis for function parameters. + +// In this test almost everything is BAD except the simplest cases +// where input directly flows to output. + +package foo + +func f(buf []byte) []byte { // ERROR "leaking param: buf to result ~r1 level=0$" + return buf +} + +func g(*byte) string + +func h(e int) { + var x [32]byte // ERROR "moved to heap: x$" + g(&f(x[:])[0]) +} + +type Node struct { + s string + left, right *Node +} + +func walk(np **Node) int { // ERROR "leaking param content: np" + n := *np + w := len(n.s) + if n == nil { + return 0 + } + wl := walk(&n.left) + wr := walk(&n.right) + if wl < wr { + n.left, n.right = n.right, n.left + wl, wr = wr, wl + } + *np = n + return w + wl + wr +} + +// Test for bug where func var f used prototype's escape analysis results. +func prototype(xyz []string) {} // ERROR "prototype xyz does not escape" +func bar() { + var got [][]string + f := prototype + f = func(ss []string) { got = append(got, ss) } // ERROR "leaking param: ss" "func literal does not escape" + s := "string" + f([]string{s}) // ERROR "\[\]string literal escapes to heap" +} diff --git a/test/oldescape_closure.go b/test/oldescape_closure.go new file mode 100644 index 0000000000..386605dfcd --- /dev/null +++ b/test/oldescape_closure.go @@ -0,0 +1,173 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis for closure arguments. + +package escape + +var sink interface{} + +func ClosureCallArgs0() { + x := 0 // ERROR "moved to heap: x" + func(p *int) { // ERROR "p does not escape" "func literal does not escape" + *p = 1 + // BAD: x should not escape to heap here + }(&x) +} + +func ClosureCallArgs1() { + x := 0 // ERROR "moved to heap: x" + for { + func(p *int) { // ERROR "p does not escape" "func literal does not escape" + *p = 1 + // BAD: x should not escape to heap here + }(&x) + } +} + +func ClosureCallArgs2() { + for { + // BAD: x should not escape here + x := 0 // ERROR "moved to heap: x" + func(p *int) { // ERROR "p does not escape" "func literal does not escape" + *p = 1 + }(&x) + } +} + +func ClosureCallArgs3() { + x := 0 // ERROR "moved to heap: x" + func(p *int) { // ERROR "leaking param: p" "func literal does not escape" + sink = p // ERROR "p escapes to heap" + }(&x) +} + +func ClosureCallArgs4() { + // BAD: x should not leak here + x := 0 // ERROR "moved to heap: x" + _ = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" + return p + }(&x) +} + +func ClosureCallArgs5() { + x := 0 // ERROR "moved to heap: x" + sink = func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" "\(func literal\)\(&x\) escapes to heap" + return p + }(&x) +} + +func ClosureCallArgs6() { + x := 0 // ERROR "moved to heap: x" + func(p *int) { // ERROR "moved to heap: p" "func literal does not escape" + sink = &p // ERROR "&p escapes to heap" + }(&x) +} + +func ClosureCallArgs7() { + var pp *int + for { + x := 0 // ERROR "moved to heap: x" + func(p *int) { // ERROR "leaking param: p" "func literal does not escape" + pp = p + }(&x) + } + _ = pp +} + +func ClosureCallArgs8() { + x := 0 // ERROR "moved to heap: x" + defer func(p *int) { // ERROR "p does not escape" "func literal does not escape" + *p = 1 + // BAD: x should not escape to heap here + }(&x) +} + +func ClosureCallArgs9() { + // BAD: x should not leak + x := 0 // ERROR "moved to heap: x" + for { + defer func(p *int) { // ERROR "func literal escapes to heap" "p does not escape" + *p = 1 + }(&x) + } +} + +func ClosureCallArgs10() { + for { + x := 0 // ERROR "moved to heap: x" + defer func(p *int) { // ERROR "func literal escapes to heap" "p does not escape" + *p = 1 + }(&x) + } +} + +func ClosureCallArgs11() { + x := 0 // ERROR "moved to heap: x" + defer func(p *int) { // ERROR "leaking param: p" "func literal does not escape" + sink = p // ERROR "p escapes to heap" + }(&x) +} + +func ClosureCallArgs12() { + // BAD: x should not leak + x := 0 // ERROR "moved to heap: x" + defer func(p *int) *int { // ERROR "leaking param: p to result ~r1" "func literal does not escape" + return p + }(&x) +} + +func ClosureCallArgs13() { + x := 0 // ERROR "moved to heap: x" + defer func(p *int) { // ERROR "moved to heap: p" "func literal does not escape" + sink = &p // ERROR "&p escapes to heap" + }(&x) +} + +func ClosureCallArgs14() { + x := 0 // ERROR "moved to heap: x" + // BAD: &x should not escape here + p := &x // ERROR "moved to heap: p" + _ = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" + return *p + // BAD: p should not escape here + }(&p) +} + +func ClosureCallArgs15() { + x := 0 // ERROR "moved to heap: x" + p := &x // ERROR "moved to heap: p" + sink = func(p **int) *int { // ERROR "leaking param: p to result ~r1 level=1" "func literal does not escape" "\(func literal\)\(&p\) escapes to heap" + return *p + // BAD: p should not escape here + }(&p) +} + +func ClosureLeak1(s string) string { // ERROR "ClosureLeak1 s does not escape" + t := s + "YYYY" // ERROR "escapes to heap" + return ClosureLeak1a(t) // ERROR "ClosureLeak1 ... argument does not escape" +} + +// See #14409 -- returning part of captured var leaks it. +func ClosureLeak1a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" + return func() string { // ERROR "ClosureLeak1a func literal does not escape" + return a[0] + }() +} + +func ClosureLeak2(s string) string { // ERROR "ClosureLeak2 s does not escape" + t := s + "YYYY" // ERROR "escapes to heap" + c := ClosureLeak2a(t) // ERROR "ClosureLeak2 ... argument does not escape" + return c +} +func ClosureLeak2a(a ...string) string { // ERROR "leaking param: a to result ~r1 level=1" + return ClosureLeak2b(func() string { // ERROR "ClosureLeak2a func literal does not escape" + return a[0] + }) +} +func ClosureLeak2b(f func() string) string { // ERROR "leaking param: f to result ~r1 level=1" + return f() +} diff --git a/test/oldescape_field.go b/test/oldescape_field.go new file mode 100644 index 0000000000..e4213aaf59 --- /dev/null +++ b/test/oldescape_field.go @@ -0,0 +1,174 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis with respect to field assignments. + +package escape + +var sink interface{} + +type X struct { + p1 *int + p2 *int + a [2]*int +} + +type Y struct { + x X +} + +func field0() { + i := 0 // ERROR "moved to heap: i$" + var x X + x.p1 = &i + sink = x.p1 // ERROR "x\.p1 escapes to heap" +} + +func field1() { + i := 0 // ERROR "moved to heap: i$" + var x X + // BAD: &i should not escape + x.p1 = &i + sink = x.p2 // ERROR "x\.p2 escapes to heap" +} + +func field3() { + i := 0 // ERROR "moved to heap: i$" + var x X + x.p1 = &i + sink = x // ERROR "x escapes to heap" +} + +func field4() { + i := 0 // ERROR "moved to heap: i$" + var y Y + y.x.p1 = &i + x := y.x + sink = x // ERROR "x escapes to heap" +} + +func field5() { + i := 0 // ERROR "moved to heap: i$" + var x X + // BAD: &i should not escape here + x.a[0] = &i + sink = x.a[1] // ERROR "x\.a\[1\] escapes to heap" +} + +// BAD: we are not leaking param x, only x.p2 +func field6(x *X) { // ERROR "leaking param content: x$" + sink = x.p2 // ERROR "x\.p2 escapes to heap" +} + +func field6a() { + i := 0 // ERROR "moved to heap: i$" + var x X + // BAD: &i should not escape + x.p1 = &i + field6(&x) +} + +func field7() { + i := 0 + var y Y + y.x.p1 = &i + x := y.x + var y1 Y + y1.x = x + _ = y1.x.p1 +} + +func field8() { + i := 0 // ERROR "moved to heap: i$" + var y Y + y.x.p1 = &i + x := y.x + var y1 Y + y1.x = x + sink = y1.x.p1 // ERROR "y1\.x\.p1 escapes to heap" +} + +func field9() { + i := 0 // ERROR "moved to heap: i$" + var y Y + y.x.p1 = &i + x := y.x + var y1 Y + y1.x = x + sink = y1.x // ERROR "y1\.x escapes to heap" +} + +func field10() { + i := 0 // ERROR "moved to heap: i$" + var y Y + // BAD: &i should not escape + y.x.p1 = &i + x := y.x + var y1 Y + y1.x = x + sink = y1.x.p2 // ERROR "y1\.x\.p2 escapes to heap" +} + +func field11() { + i := 0 // ERROR "moved to heap: i$" + x := X{p1: &i} + sink = x.p1 // ERROR "x\.p1 escapes to heap" +} + +func field12() { + i := 0 // ERROR "moved to heap: i$" + // BAD: &i should not escape + x := X{p1: &i} + sink = x.p2 // ERROR "x\.p2 escapes to heap" +} + +func field13() { + i := 0 // ERROR "moved to heap: i$" + x := &X{p1: &i} // ERROR "field13 &X literal does not escape$" + sink = x.p1 // ERROR "x\.p1 escapes to heap" +} + +func field14() { + i := 0 // ERROR "moved to heap: i$" + // BAD: &i should not escape + x := &X{p1: &i} // ERROR "field14 &X literal does not escape$" + sink = x.p2 // ERROR "x\.p2 escapes to heap" +} + +func field15() { + i := 0 // ERROR "moved to heap: i$" + x := &X{p1: &i} // ERROR "&X literal escapes to heap$" + sink = x // ERROR "x escapes to heap" +} + +func field16() { + i := 0 // ERROR "moved to heap: i$" + var x X + // BAD: &i should not escape + x.p1 = &i + var iface interface{} = x // ERROR "x escapes to heap" + x1 := iface.(X) + sink = x1.p2 // ERROR "x1\.p2 escapes to heap" +} + +func field17() { + i := 0 // ERROR "moved to heap: i$" + var x X + x.p1 = &i + var iface interface{} = x // ERROR "x escapes to heap" + x1 := iface.(X) + sink = x1.p1 // ERROR "x1\.p1 escapes to heap" +} + +func field18() { + i := 0 // ERROR "moved to heap: i$" + var x X + // BAD: &i should not escape + x.p1 = &i + var iface interface{} = x // ERROR "x escapes to heap" + y, _ := iface.(Y) // Put X, but extracted Y. The cast will fail, so y is zero initialized. + sink = y // ERROR "y escapes to heap" +} diff --git a/test/oldescape_iface.go b/test/oldescape_iface.go new file mode 100644 index 0000000000..88502df99b --- /dev/null +++ b/test/oldescape_iface.go @@ -0,0 +1,261 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis for interface conversions. + +package escape + +var sink interface{} + +type M interface { + M() +} + +func mescapes(m M) { // ERROR "leaking param: m" + sink = m // ERROR "m escapes to heap" +} + +func mdoesnotescape(m M) { // ERROR "m does not escape" +} + +// Tests for type stored directly in iface and with value receiver method. +type M0 struct { + p *int +} + +func (M0) M() { +} + +func efaceEscape0() { + { + i := 0 + v := M0{&i} + var x M = v // ERROR "v does not escape" + _ = x + } + { + i := 0 // ERROR "moved to heap: i" + v := M0{&i} + var x M = v // ERROR "v escapes to heap" + sink = x // ERROR "x escapes to heap" + } + { + i := 0 + v := M0{&i} + var x M = v // ERROR "v does not escape" + v1 := x.(M0) + _ = v1 + } + { + i := 0 // ERROR "moved to heap: i" + v := M0{&i} + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + v1 := x.(M0) + sink = v1 // ERROR "v1 escapes to heap" + } + { + i := 0 // ERROR "moved to heap: i" + v := M0{&i} + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + x.M() + } + { + i := 0 // ERROR "moved to heap: i" + v := M0{&i} + var x M = v // ERROR "v escapes to heap" + mescapes(x) + } + { + i := 0 + v := M0{&i} + var x M = v // ERROR "v does not escape" + mdoesnotescape(x) + } +} + +// Tests for type stored indirectly in iface and with value receiver method. +type M1 struct { + p *int + x int +} + +func (M1) M() { +} + +func efaceEscape1() { + { + i := 0 + v := M1{&i, 0} + var x M = v // ERROR "v does not escape" + _ = x + } + { + i := 0 // ERROR "moved to heap: i" + v := M1{&i, 0} + var x M = v // ERROR "v escapes to heap" + sink = x // ERROR "x escapes to heap" + } + { + i := 0 + v := M1{&i, 0} + var x M = v // ERROR "v does not escape" + v1 := x.(M1) + _ = v1 + } + { + i := 0 // ERROR "moved to heap: i" + v := M1{&i, 0} + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + v1 := x.(M1) + sink = v1 // ERROR "v1 escapes to heap" + } + { + i := 0 // ERROR "moved to heap: i" + v := M1{&i, 0} + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + x.M() + } + { + i := 0 // ERROR "moved to heap: i" + v := M1{&i, 0} + var x M = v // ERROR "v escapes to heap" + mescapes(x) + } + { + i := 0 + v := M1{&i, 0} + var x M = v // ERROR "v does not escape" + mdoesnotescape(x) + } +} + +// Tests for type stored directly in iface and with pointer receiver method. +type M2 struct { + p *int +} + +func (*M2) M() { +} + +func efaceEscape2() { + { + i := 0 + v := &M2{&i} // ERROR "&M2 literal does not escape" + var x M = v // ERROR "v does not escape" + _ = x + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" + var x M = v // ERROR "v escapes to heap" + sink = x // ERROR "x escapes to heap" + } + { + i := 0 + v := &M2{&i} // ERROR "&M2 literal does not escape" + var x M = v // ERROR "v does not escape" + v1 := x.(*M2) + _ = v1 + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + v1 := x.(*M2) + sink = v1 // ERROR "v1 escapes to heap" + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal does not escape" + // BAD: v does not escape to heap here + var x M = v // ERROR "v does not escape" + v1 := x.(*M2) + sink = *v1 // ERROR "v1 escapes to heap" + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal does not escape" + // BAD: v does not escape to heap here + var x M = v // ERROR "v does not escape" + v1, ok := x.(*M2) + sink = *v1 // ERROR "v1 escapes to heap" + _ = ok + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" + // BAD: v does not escape to heap here + var x M = v // ERROR "v escapes to heap" + x.M() + } + { + i := 0 // ERROR "moved to heap: i" + v := &M2{&i} // ERROR "&M2 literal escapes to heap" + var x M = v // ERROR "v escapes to heap" + mescapes(x) + } + { + i := 0 + v := &M2{&i} // ERROR "&M2 literal does not escape" + var x M = v // ERROR "v does not escape" + mdoesnotescape(x) + } +} + +type T1 struct { + p *int +} + +type T2 struct { + T1 T1 +} + +func dotTypeEscape() *T2 { // #11931 + var x interface{} + x = &T1{p: new(int)} // ERROR "new\(int\) escapes to heap" "&T1 literal does not escape" + return &T2{ + T1: *(x.(*T1)), // ERROR "&T2 literal escapes to heap" + } +} + +func dotTypeEscape2() { // #13805, #15796 + { + i := 0 + j := 0 + var v int + var ok bool + var x interface{} = i // ERROR "i does not escape" + var y interface{} = j // ERROR "j does not escape" + + *(&v) = x.(int) + *(&v), *(&ok) = y.(int) + } + { + i := 0 + j := 0 + var ok bool + var x interface{} = i // ERROR "i does not escape" + var y interface{} = j // ERROR "j does not escape" + + sink = x.(int) // ERROR "x.\(int\) escapes to heap" + sink, *(&ok) = y.(int) + } + { + i := 0 // ERROR "moved to heap: i" + j := 0 // ERROR "moved to heap: j" + var ok bool + var x interface{} = &i // ERROR "&i escapes to heap" + var y interface{} = &j // ERROR "&j escapes to heap" + + sink = x.(*int) // ERROR "x.\(\*int\) escapes to heap" + sink, *(&ok) = y.(*int) + } +} diff --git a/test/oldescape_linkname.dir/linkname1.go b/test/oldescape_linkname.dir/linkname1.go new file mode 100644 index 0000000000..9c61522fcc --- /dev/null +++ b/test/oldescape_linkname.dir/linkname1.go @@ -0,0 +1,10 @@ +package x + +func indexByte(xs []byte, b byte) int { // ERROR "indexByte xs does not escape" + for i, x := range xs { + if x == b { + return i + } + } + return -1 +} diff --git a/test/oldescape_linkname.dir/linkname2.go b/test/oldescape_linkname.dir/linkname2.go new file mode 100644 index 0000000000..5df4f50ff2 --- /dev/null +++ b/test/oldescape_linkname.dir/linkname2.go @@ -0,0 +1,13 @@ +package y + +import _ "unsafe" + +//go:linkname byteIndex linkname1.indexByte +func byteIndex(xs []byte, b byte) int + +func ContainsSlash(data []byte) bool { // ERROR "leaking param: data" "can inline ContainsSlash" + if byteIndex(data, '/') != -1 { + return true + } + return false +} diff --git a/test/oldescape_linkname.dir/linkname3.go b/test/oldescape_linkname.dir/linkname3.go new file mode 100644 index 0000000000..cbbd3a10ba --- /dev/null +++ b/test/oldescape_linkname.dir/linkname3.go @@ -0,0 +1,11 @@ +package main + +import _ "./linkname1" +import "./linkname2" + +func main() { // ERROR "can inline main" + str := "hello/world" + bs := []byte(str) // ERROR "\(\[\]byte\)\(str\) escapes to heap" + if y.ContainsSlash(bs) { // ERROR "inlining call to y.ContainsSlash" + } +} diff --git a/test/oldescape_linkname.go b/test/oldescape_linkname.go new file mode 100644 index 0000000000..f99df1bb80 --- /dev/null +++ b/test/oldescape_linkname.go @@ -0,0 +1,15 @@ +// errorcheckandrundir -0 -m -l=4 -newescape=false + +// Copyright 2010 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. + +// Tests that linknames are included in export data (issue 18167). +package ignored + +/* +Without CL 33911, this test would fail with the following error: + +main.main: relocation target linkname2.byteIndex not defined +main.main: undefined: "linkname2.byteIndex" +*/ diff --git a/test/oldescape_param.go b/test/oldescape_param.go new file mode 100644 index 0000000000..3a3eee2a5b --- /dev/null +++ b/test/oldescape_param.go @@ -0,0 +1,441 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis for function parameters. + +// In this test almost everything is BAD except the simplest cases +// where input directly flows to output. + +package escape + +func zero() int { return 0 } + +var sink interface{} + +// in -> out +func param0(p *int) *int { // ERROR "leaking param: p to result ~r1" + return p +} + +func caller0a() { + i := 0 + _ = param0(&i) +} + +func caller0b() { + i := 0 // ERROR "moved to heap: i$" + sink = param0(&i) // ERROR "param0\(&i\) escapes to heap" +} + +// in, in -> out, out +func param1(p1, p2 *int) (*int, *int) { // ERROR "leaking param: p1 to result ~r2" "leaking param: p2 to result ~r3" + return p1, p2 +} + +func caller1() { + i := 0 // ERROR "moved to heap: i$" + j := 0 + sink, _ = param1(&i, &j) +} + +// in -> other in +func param2(p1 *int, p2 **int) { // ERROR "leaking param: p1$" "param2 p2 does not escape$" + *p2 = p1 +} + +func caller2a() { + i := 0 // ERROR "moved to heap: i$" + var p *int + param2(&i, &p) + _ = p +} + +func caller2b() { + i := 0 // ERROR "moved to heap: i$" + var p *int + param2(&i, &p) + sink = p // ERROR "p escapes to heap$" +} + +func paramArraySelfAssign(p *PairOfPairs) { // ERROR "p does not escape" + p.pairs[0] = p.pairs[1] // ERROR "ignoring self-assignment in p.pairs\[0\] = p.pairs\[1\]" +} + +func paramArraySelfAssignUnsafeIndex(p *PairOfPairs) { // ERROR "leaking param content: p" + // Function call inside index disables self-assignment case to trigger. + p.pairs[zero()] = p.pairs[1] + p.pairs[zero()+1] = p.pairs[1] +} + +type PairOfPairs struct { + pairs [2]*Pair +} + +type BoxedPair struct { + pair *Pair +} + +type WrappedPair struct { + pair Pair +} + +func leakParam(x interface{}) { // ERROR "leaking param: x" + sink = x +} + +func sinkAfterSelfAssignment1(box *BoxedPair) { // ERROR "leaking param content: box" + box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2" + sink = box.pair.p2 // ERROR "box.pair.p2 escapes to heap" +} + +func sinkAfterSelfAssignment2(box *BoxedPair) { // ERROR "leaking param content: box" + box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2" + sink = box.pair // ERROR "box.pair escapes to heap" +} + +func sinkAfterSelfAssignment3(box *BoxedPair) { // ERROR "leaking param content: box" + box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2" + leakParam(box.pair.p2) // ERROR "box.pair.p2 escapes to heap" +} + +func sinkAfterSelfAssignment4(box *BoxedPair) { // ERROR "leaking param content: box" + box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2" + leakParam(box.pair) // ERROR "box.pair escapes to heap" +} + +func selfAssignmentAndUnrelated(box1, box2 *BoxedPair) { // ERROR "leaking param content: box2" "box1 does not escape" + box1.pair.p1 = box1.pair.p2 // ERROR "ignoring self-assignment in box1.pair.p1 = box1.pair.p2" + leakParam(box2.pair.p2) // ERROR "box2.pair.p2 escapes to heap" +} + +func notSelfAssignment1(box1, box2 *BoxedPair) { // ERROR "leaking param content: box2" "box1 does not escape" + box1.pair.p1 = box2.pair.p1 +} + +func notSelfAssignment2(p1, p2 *PairOfPairs) { // ERROR "leaking param content: p2" "p1 does not escape" + p1.pairs[0] = p2.pairs[1] +} + +func notSelfAssignment3(p1, p2 *PairOfPairs) { // ERROR "leaking param content: p2" "p1 does not escape" + p1.pairs[0].p1 = p2.pairs[1].p1 +} + +func boxedPairSelfAssign(box *BoxedPair) { // ERROR "box does not escape" + box.pair.p1 = box.pair.p2 // ERROR "ignoring self-assignment in box.pair.p1 = box.pair.p2" +} + +func wrappedPairSelfAssign(w *WrappedPair) { // ERROR "w does not escape" + w.pair.p1 = w.pair.p2 // ERROR "ignoring self-assignment in w.pair.p1 = w.pair.p2" +} + +// in -> in +type Pair struct { + p1 *int + p2 *int +} + +func param3(p *Pair) { // ERROR "param3 p does not escape" + p.p1 = p.p2 // ERROR "param3 ignoring self-assignment in p.p1 = p.p2" +} + +func caller3a() { + i := 0 + j := 0 + p := Pair{&i, &j} + param3(&p) + _ = p +} + +func caller3b() { + i := 0 // ERROR "moved to heap: i$" + j := 0 // ERROR "moved to heap: j$" + p := Pair{&i, &j} + param3(&p) + sink = p // ERROR "p escapes to heap$" +} + +// in -> rcvr +func (p *Pair) param4(i *int) { // ERROR "\(\*Pair\).param4 p does not escape$" "leaking param: i$" + p.p1 = i +} + +func caller4a() { + i := 0 // ERROR "moved to heap: i$" + p := Pair{} + p.param4(&i) + _ = p +} + +func caller4b() { + i := 0 // ERROR "moved to heap: i$" + p := Pair{} + p.param4(&i) + sink = p // ERROR "p escapes to heap$" +} + +// in -> heap +func param5(i *int) { // ERROR "leaking param: i$" + sink = i // ERROR "i escapes to heap$" +} + +func caller5() { + i := 0 // ERROR "moved to heap: i$" + param5(&i) +} + +// *in -> heap +func param6(i ***int) { // ERROR "leaking param content: i$" + sink = *i // ERROR "\*i escapes to heap$" +} + +func caller6a() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + p2 := &p + param6(&p2) +} + +// **in -> heap +func param7(i ***int) { // ERROR "leaking param content: i$" + sink = **i // ERROR "\* \(\*i\) escapes to heap" +} + +func caller7() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + p2 := &p + param7(&p2) +} + +// **in -> heap +func param8(i **int) { // ERROR "param8 i does not escape$" + sink = **i // ERROR "\* \(\*i\) escapes to heap" +} + +func caller8() { + i := 0 + p := &i + param8(&p) +} + +// *in -> out +func param9(p ***int) **int { // ERROR "leaking param: p to result ~r1 level=1" + return *p +} + +func caller9a() { + i := 0 + p := &i + p2 := &p + _ = param9(&p2) +} + +func caller9b() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + p2 := &p + sink = param9(&p2) // ERROR "param9\(&p2\) escapes to heap" +} + +// **in -> out +func param10(p ***int) *int { // ERROR "leaking param: p to result ~r1 level=2" + return **p +} + +func caller10a() { + i := 0 + p := &i + p2 := &p + _ = param10(&p2) +} + +func caller10b() { + i := 0 // ERROR "moved to heap: i$" + p := &i + p2 := &p + sink = param10(&p2) // ERROR "param10\(&p2\) escapes to heap" +} + +// in escapes to heap (address of param taken and returned) +func param11(i **int) ***int { // ERROR "moved to heap: i$" + return &i +} + +func caller11a() { + i := 0 // ERROR "moved to heap: i" + p := &i // ERROR "moved to heap: p" + _ = param11(&p) +} + +func caller11b() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + sink = param11(&p) // ERROR "param11\(&p\) escapes to heap" +} + +func caller11c() { // GOOD + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p" + sink = *param11(&p) // ERROR "\*param11\(&p\) escapes to heap" +} + +func caller11d() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p" + p2 := &p + sink = param11(p2) // ERROR "param11\(p2\) escapes to heap" +} + +// &in -> rcvr +type Indir struct { + p ***int +} + +func (r *Indir) param12(i **int) { // ERROR "\(\*Indir\).param12 r does not escape$" "moved to heap: i$" + r.p = &i +} + +func caller12a() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + var r Indir + r.param12(&p) + _ = r +} + +func caller12b() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + r := &Indir{} // ERROR "caller12b &Indir literal does not escape$" + r.param12(&p) + _ = r +} + +func caller12c() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + r := Indir{} + r.param12(&p) + sink = r // ERROR "r escapes to heap$" +} + +func caller12d() { + i := 0 // ERROR "moved to heap: i$" + p := &i // ERROR "moved to heap: p$" + r := Indir{} + r.param12(&p) + sink = **r.p // ERROR "\* \(\*r\.p\) escapes to heap" +} + +// in -> value rcvr +type Val struct { + p **int +} + +func (v Val) param13(i *int) { // ERROR "Val.param13 v does not escape$" "leaking param: i$" + *v.p = i +} + +func caller13a() { + i := 0 // ERROR "moved to heap: i$" + var p *int + var v Val + v.p = &p + v.param13(&i) + _ = v +} + +func caller13b() { + i := 0 // ERROR "moved to heap: i$" + var p *int + v := Val{&p} + v.param13(&i) + _ = v +} + +func caller13c() { + i := 0 // ERROR "moved to heap: i$" + var p *int + v := &Val{&p} // ERROR "caller13c &Val literal does not escape$" + v.param13(&i) + _ = v +} + +func caller13d() { + i := 0 // ERROR "moved to heap: i$" + var p *int // ERROR "moved to heap: p$" + var v Val + v.p = &p + v.param13(&i) + sink = v // ERROR "v escapes to heap$" +} + +func caller13e() { + i := 0 // ERROR "moved to heap: i$" + var p *int // ERROR "moved to heap: p$" + v := Val{&p} + v.param13(&i) + sink = v // ERROR "v escapes to heap$" +} + +func caller13f() { + i := 0 // ERROR "moved to heap: i$" + var p *int // ERROR "moved to heap: p$" + v := &Val{&p} // ERROR "&Val literal escapes to heap$" + v.param13(&i) + sink = v // ERROR "v escapes to heap$" +} + +func caller13g() { + i := 0 // ERROR "moved to heap: i$" + var p *int + v := Val{&p} + v.param13(&i) + sink = *v.p // ERROR "\*v\.p escapes to heap" +} + +func caller13h() { + i := 0 // ERROR "moved to heap: i$" + var p *int + v := &Val{&p} // ERROR "caller13h &Val literal does not escape$" + v.param13(&i) + sink = **v.p // ERROR "\* \(\*v\.p\) escapes to heap" +} + +type Node struct { + p *Node +} + +var Sink *Node + +func f(x *Node) { // ERROR "leaking param content: x" + Sink = &Node{x.p} // ERROR "&Node literal escapes to heap" +} + +func g(x *Node) *Node { // ERROR "leaking param: x to result ~r1 level=0" + return &Node{x.p} // ERROR "&Node literal escapes to heap" +} + +func h(x *Node) { // ERROR "leaking param: x" + y := &Node{x} // ERROR "h &Node literal does not escape" + Sink = g(y) + f(y) +} + +// interface(in) -> out +// See also issue 29353. + +// Convert to a non-direct interface, require an allocation and +// copy x to heap (not to result). +func param14a(x [4]*int) interface{} { // ERROR "leaking param: x$" + return x // ERROR "x escapes to heap" +} + +// Convert to a direct interface, does not need an allocation. +// So x only leaks to result. +func param14b(x *int) interface{} { // ERROR "leaking param: x to result ~r1 level=0" + return x // ERROR "x escapes to heap" +} diff --git a/test/oldescape_struct_return.go b/test/oldescape_struct_return.go new file mode 100644 index 0000000000..5088cf863c --- /dev/null +++ b/test/oldescape_struct_return.go @@ -0,0 +1,74 @@ +// errorcheck -0 -m -l -newescape=false + +// Copyright 2015 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. + +// Test escape analysis for function parameters. + +package foo + +var Ssink *string + +type U struct { + _sp *string + _spp **string +} + +func A(sp *string, spp **string) U { // ERROR "leaking param: sp to result ~r2 level=0$" "leaking param: spp to result ~r2 level=0$" + return U{sp, spp} +} + +func B(spp **string) U { // ERROR "leaking param: spp to result ~r1 level=0$" "leaking param: spp to result ~r1 level=1$" + return U{*spp, spp} +} + +func tA1() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + _ = u + println(s) +} + +func tA2() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + println(*u._sp) +} + +func tA3() { + s := "cat" + sp := &s + spp := &sp + u := A(sp, spp) + println(**u._spp) +} + +func tB1() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + _ = u + println(s) +} + +func tB2() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + println(*u._sp) +} + +func tB3() { + s := "cat" + sp := &s + spp := &sp + u := B(spp) + println(**u._spp) +} -- GitLab From 8285c85fe32147fb27d7aa5cfc41b8bd9d65fa0d Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Thu, 11 Apr 2019 14:28:24 -0700 Subject: [PATCH 0823/1679] syscall: skip DirentRepeat test on freebsd Dirent doesn't work properly. Diable the test for now. Update #31416 Change-Id: I34a8045598a9c303dcc754ce04da3c124f122d1a Reviewed-on: https://go-review.googlesource.com/c/go/+/171818 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/syscall/dirent_bsd_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/syscall/dirent_bsd_test.go b/src/syscall/dirent_bsd_test.go index 1f8410d7fc..43b667b6b6 100644 --- a/src/syscall/dirent_bsd_test.go +++ b/src/syscall/dirent_bsd_test.go @@ -87,6 +87,9 @@ func TestDirentRepeat(t *testing.T) { if size < 1024 { size = 1024 // DIRBLKSIZ, see issue 31403. } + if runtime.GOOS == "freebsd" { + t.Skip("need to fix issue 31416 first") + } } // Make a directory containing N files -- GitLab From 2a931bad4e4d7eabdb685b6dc74406373ad6e7e4 Mon Sep 17 00:00:00 2001 From: Kunpei Sakai Date: Wed, 17 Apr 2019 01:19:54 +0900 Subject: [PATCH 0824/1679] net/http: rename DialerAndTLSConfigSupportsHTTP2 to ForceAttemptHTTP2 Transport.DialerAndTLSConfigSupportsHTTP2 was added just earlier in CL 130256 but we thought of a better name moments after submitting. ForceAttemptHTTP2 is shorter, more direct, and doesn't constrain what we can use it with in the future. Updates #14391 Updates #27011 Change-Id: Ie5fc71bafcbcaa1941b5d49f748b6d710503d477 Reviewed-on: https://go-review.googlesource.com/c/go/+/172299 Reviewed-by: Brad Fitzpatrick --- src/net/http/transport.go | 18 +++++++++--------- src/net/http/transport_test.go | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 88dbfe7c6e..6d82f44ff6 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -46,11 +46,11 @@ var DefaultTransport RoundTripper = &Transport{ KeepAlive: 30 * time.Second, DualStack: true, }).DialContext, - DialerAndTLSConfigSupportsHTTP2: true, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, } // DefaultMaxIdleConnsPerHost is the default value of Transport's @@ -259,11 +259,11 @@ type Transport struct { nextProtoOnce sync.Once h2transport h2Transport // non-nil if http2 wired up - // DialerAndTLSConfigSupportsHTTP2 controls whether HTTP/2 is enabled when a non-zero + // ForceAttemptHTTP2 controls whether HTTP/2 is enabled when a non-zero // TLSClientConfig or Dial, DialTLS or DialContext func is provided. By default, use of any those fields conservatively // disables HTTP/2. To use a customer dialer or TLS config and still attempt HTTP/2 // upgrades, set this to true. - DialerAndTLSConfigSupportsHTTP2 bool + ForceAttemptHTTP2 bool } // h2Transport is the interface we expect to be able to call from @@ -303,13 +303,13 @@ func (t *Transport) onceSetNextProtoDefaults() { // Transport. return } - if !t.DialerAndTLSConfigSupportsHTTP2 && (t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil || t.DialContext != nil) { + if !t.ForceAttemptHTTP2 && (t.TLSClientConfig != nil || t.Dial != nil || t.DialTLS != nil || t.DialContext != nil) { // Be conservative and don't automatically enable // http2 if they've specified a custom TLS config or // custom dialers. Let them opt-in themselves via // http2.ConfigureTransport so we don't surprise them // by modifying their tls.Config. Issue 14275. - // However, if DialerAndTLSConfigSupportsHTTP2 is true, it overrides the above checks. + // However, if ForceAttemptHTTP2 is true, it overrides the above checks. return } t2, err := http2configureTransport(t) diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 789d52c5d5..5b1dbf9eff 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -3595,8 +3595,8 @@ func TestTransportAutomaticHTTP2(t *testing.T) { func TestTransportAutomaticHTTP2_DialerAndTLSConfigSupportsHTTP2AndTLSConfig(t *testing.T) { testTransportAutoHTTP(t, &Transport{ - DialerAndTLSConfigSupportsHTTP2: true, - TLSClientConfig: new(tls.Config), + ForceAttemptHTTP2: true, + TLSClientConfig: new(tls.Config), }, true) } -- GitLab From 518ee55d7814a1de66ec9e2fb4829711cc63d0aa Mon Sep 17 00:00:00 2001 From: ShiKaiWi Date: Sun, 14 Apr 2019 17:09:40 +0000 Subject: [PATCH 0825/1679] expvar: improve Map.addKey for large number of keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing implementation has poor performance for inserting large number of keys because it chooses to append the new key to the sorted keys array and then sort the new array again (time complexity is O(nlogn)). The improvement tries to utilize the sorted keys array by searching the index and doing an insertion if any (time complexity is O(logn)). Benchmarked on 4-core machine with `go test -cpu 1,2,4,8 -count 5 -benchmem -bench=.`(the equal results are omitted): name old time/op new time/op delta MapAddDifferentRandom-8 408µs ±11% 69µs ± 3% -82.95% (p=0.008 n=5+5) MapAddDifferentRandom-4 389µs ±19% 69µs ± 2% -82.28% (p=0.008 n=5+5) MapAddDifferentRandom-2 365µs ± 4% 75µs ± 6% -79.51% (p=0.008 n=5+5) MapSetDifferentRandom-8 365µs ± 4% 76µs ±40% -79.07% (p=0.008 n=5+5) MapAddDifferentRandom 366µs ± 3% 78µs ± 6% -78.66% (p=0.008 n=5+5) MapSetDifferentRandom 369µs ± 2% 81µs ±34% -77.99% (p=0.008 n=5+5) MapSetDifferentRandom-2 378µs ±10% 100µs ±32% -73.47% (p=0.008 n=5+5) MapSetDifferentRandom-4 352µs ± 4% 108µs ± 7% -69.40% (p=0.008 n=5+5) IntAdd-2 23.1ns ±21% 15.5ns ±23% -32.79% (p=0.032 n=5+5) IntSet-2 21.4ns ±14% 16.7ns ±17% -22.00% (p=0.016 n=5+5) FloatAdd-8 88.8ns ± 9% 70.8ns ±25% -20.23% (p=0.024 n=5+5) FloatSet-2 22.3ns ±15% 17.8ns ±14% -20.14% (p=0.008 n=5+5) IntAdd-8 21.7ns ± 3% 18.7ns ± 4% -14.00% (p=0.008 n=5+5) MapAddDifferent-8 1.58µs ± 7% 1.42µs ± 6% -10.06% (p=0.016 n=5+5) StringSet-2 42.4ns ± 1% 43.7ns ± 5% +3.07% (p=0.048 n=4+5) FloatSet 8.27ns ± 2% 8.60ns ± 1% +3.94% (p=0.008 n=5+5) FloatAdd 12.5ns ± 2% 13.0ns ± 4% +4.33% (p=0.032 n=5+5) MapSetString-4 94.6ns ± 0% 101.7ns ± 4% +7.55% (p=0.016 n=4+5) MapAddSameSteadyState-2 34.9ns ± 3% 37.7ns ± 5% +8.14% (p=0.008 n=5+5) StringSet-4 34.5ns ± 0% 37.6ns ± 9% +9.02% (p=0.016 n=4+5) MapSetDifferent-8 377ns ± 3% 411ns ± 7% +9.07% (p=0.008 n=5+5) MapAddSameSteadyState 39.1ns ± 2% 42.8ns ± 6% +9.36% (p=0.008 n=5+5) MapAddDifferentSteadyState 172ns ± 4% 190ns ± 9% +10.96% (p=0.016 n=5+5) MapSet 143ns ± 4% 159ns ± 2% +11.06% (p=0.008 n=5+5) MapSet-4 96.9ns ± 5% 107.8ns ± 6% +11.25% (p=0.008 n=5+5) MapSet-2 102ns ± 6% 114ns ± 8% +11.94% (p=0.008 n=5+5) IntSet 8.18ns ± 1% 12.78ns ±13% +56.31% (p=0.008 n=5+5) name old alloc/op new alloc/op delta MapSetDifferentRandom-4 19.8kB ± 0% 16.6kB ± 0% -16.21% (p=0.008 n=5+5) MapSetDifferentRandom 19.8kB ± 0% 16.6kB ± 0% -16.21% (p=0.008 n=5+5) MapSetDifferentRandom-8 19.8kB ± 0% 16.6kB ± 0% -16.20% (p=0.008 n=5+5) MapSetDifferentRandom-2 19.8kB ± 0% 16.6kB ± 0% -16.20% (p=0.008 n=5+5) MapAddDifferentRandom 20.6kB ± 0% 17.4kB ± 0% -15.57% (p=0.008 n=5+5) MapAddDifferentRandom-8 20.6kB ± 0% 17.4kB ± 0% -15.57% (p=0.008 n=5+5) MapAddDifferentRandom-2 20.6kB ± 0% 17.4kB ± 0% -15.56% (p=0.008 n=5+5) MapAddDifferentRandom-4 20.6kB ± 0% 17.4kB ± 0% -15.56% (p=0.008 n=5+5) MapAddDifferent 1.09kB ± 0% 0.96kB ± 0% -11.76% (p=0.008 n=5+5) MapAddDifferent-2 1.09kB ± 0% 0.96kB ± 0% -11.76% (p=0.008 n=5+5) MapAddDifferent-4 1.09kB ± 0% 0.96kB ± 0% -11.76% (p=0.008 n=5+5) MapAddDifferent-8 1.09kB ± 0% 0.96kB ± 0% -11.76% (p=0.008 n=5+5) MapAddSame 480B ± 0% 448B ± 0% -6.67% (p=0.008 n=5+5) MapAddSame-2 480B ± 0% 448B ± 0% -6.67% (p=0.008 n=5+5) MapAddSame-4 480B ± 0% 448B ± 0% -6.67% (p=0.008 n=5+5) MapAddSame-8 480B ± 0% 448B ± 0% -6.67% (p=0.008 n=5+5) name old allocs/op new allocs/op delta MapSetDifferentRandom 423 ± 0% 323 ± 0% -23.64% (p=0.008 n=5+5) MapSetDifferentRandom-2 423 ± 0% 323 ± 0% -23.64% (p=0.008 n=5+5) MapSetDifferentRandom-4 423 ± 0% 323 ± 0% -23.64% (p=0.008 n=5+5) MapSetDifferentRandom-8 423 ± 0% 323 ± 0% -23.64% (p=0.008 n=5+5) MapAddDifferentRandom 523 ± 0% 423 ± 0% -19.12% (p=0.008 n=5+5) MapAddDifferentRandom-2 523 ± 0% 423 ± 0% -19.12% (p=0.008 n=5+5) MapAddDifferentRandom-4 523 ± 0% 423 ± 0% -19.12% (p=0.008 n=5+5) MapAddDifferentRandom-8 523 ± 0% 423 ± 0% -19.12% (p=0.008 n=5+5) MapAddDifferent 31.0 ± 0% 27.0 ± 0% -12.90% (p=0.008 n=5+5) MapAddDifferent-2 31.0 ± 0% 27.0 ± 0% -12.90% (p=0.008 n=5+5) MapAddDifferent-4 31.0 ± 0% 27.0 ± 0% -12.90% (p=0.008 n=5+5) MapAddDifferent-8 31.0 ± 0% 27.0 ± 0% -12.90% (p=0.008 n=5+5) MapAddSame 11.0 ± 0% 10.0 ± 0% -9.09% (p=0.008 n=5+5) MapAddSame-2 11.0 ± 0% 10.0 ± 0% -9.09% (p=0.008 n=5+5) MapAddSame-4 11.0 ± 0% 10.0 ± 0% -9.09% (p=0.008 n=5+5) MapAddSame-8 11.0 ± 0% 10.0 ± 0% -9.09% (p=0.008 n=5+5) Fixes #31414 Change-Id: I2dd655dec9dbbf8d7881a0f3f8edcb3d29199a48 GitHub-Last-Rev: a816fe3f62498481500a0ce9695de9fd3aa9f7b7 GitHub-Pull-Request: golang/go#31418 Reviewed-on: https://go-review.googlesource.com/c/go/+/171718 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/expvar/expvar.go | 10 ++++++++-- src/expvar/expvar_test.go | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/expvar/expvar.go b/src/expvar/expvar.go index 976b300d63..c0dc0532b1 100644 --- a/src/expvar/expvar.go +++ b/src/expvar/expvar.go @@ -141,8 +141,14 @@ func (v *Map) Init() *Map { func (v *Map) addKey(key string) { v.keysMu.Lock() defer v.keysMu.Unlock() - v.keys = append(v.keys, key) - sort.Strings(v.keys) + // Using insertion sort to place key into the already-sorted v.keys. + if i := sort.SearchStrings(v.keys, key); i >= len(v.keys) { + v.keys = append(v.keys, key) + } else if v.keys[i] != key { + v.keys = append(v.keys, "") + copy(v.keys[i+1:], v.keys[i:]) + v.keys[i] = key + } } func (v *Map) Get(key string) Var { diff --git a/src/expvar/expvar_test.go b/src/expvar/expvar_test.go index 804b56c1aa..7b1f83a7d7 100644 --- a/src/expvar/expvar_test.go +++ b/src/expvar/expvar_test.go @@ -6,6 +6,7 @@ package expvar import ( "bytes" + "crypto/sha1" "encoding/json" "fmt" "net" @@ -299,6 +300,26 @@ func BenchmarkMapSetDifferent(b *testing.B) { }) } +// BenchmarkMapSetDifferentRandom simulates such a case where the concerned +// keys of Map.Set are generated dynamically and as a result insertion is +// out of order and the number of the keys may be large. +func BenchmarkMapSetDifferentRandom(b *testing.B) { + keys := make([]string, 100) + for i := range keys { + keys[i] = fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprint(i)))) + } + + v := new(Int) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + m := new(Map).Init() + for _, k := range keys { + m.Set(k, v) + } + } +} + func BenchmarkMapSetString(b *testing.B) { m := new(Map).Init() @@ -350,6 +371,25 @@ func BenchmarkMapAddDifferent(b *testing.B) { }) } +// BenchmarkMapAddDifferentRandom simulates such a case where that the concerned +// keys of Map.Add are generated dynamically and as a result insertion is out of +// order and the number of the keys may be large. +func BenchmarkMapAddDifferentRandom(b *testing.B) { + keys := make([]string, 100) + for i := range keys { + keys[i] = fmt.Sprintf("%x", sha1.Sum([]byte(fmt.Sprint(i)))) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + m := new(Map).Init() + for _, k := range keys { + m.Add(k, 1) + } + } +} + func BenchmarkMapAddSameSteadyState(b *testing.B) { m := new(Map).Init() b.RunParallel(func(pb *testing.PB) { -- GitLab From 56b8ee23986c48ec63a0411f12b3fcaad61d6c06 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 16 Apr 2019 13:07:29 -0400 Subject: [PATCH 0826/1679] cmd/go: retry RemoveAll(workdir) for up to 500ms On some configurations of Windows, directories containing executable files may be locked for a while after the executable exits (perhaps due to antivirus scans?). It's probably worth a little extra latency on exit to avoid filling up the user's temporary directory with leaked files. Updates #30789 Change-Id: Iae7fcdd07fb9ecfb05967cfe0c8833db646d2f85 Reviewed-on: https://go-review.googlesource.com/c/go/+/172337 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/work/action.go | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 0232c45ebe..1134b1f35b 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -16,8 +16,10 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "strings" "sync" + "time" "cmd/go/internal/base" "cmd/go/internal/cache" @@ -243,8 +245,23 @@ func (b *Builder) Init() { if !cfg.BuildWork { workdir := b.WorkDir base.AtExit(func() { - if err := os.RemoveAll(workdir); err != nil { - fmt.Fprintf(os.Stderr, "go: failed to remove work dir: %s\n", err) + start := time.Now() + for { + err := os.RemoveAll(workdir) + if err == nil { + return + } + + // On some configurations of Windows, directories containing executable + // files may be locked for a while after the executable exits (perhaps + // due to antivirus scans?). It's probably worth a little extra latency + // on exit to avoid filling up the user's temporary directory with leaked + // files. (See golang.org/issue/30789.) + if runtime.GOOS != "windows" || time.Since(start) >= 500*time.Millisecond { + fmt.Fprintf(os.Stderr, "go: failed to remove work dir: %s\n", err) + return + } + time.Sleep(5 * time.Millisecond) } }) } -- GitLab From a16dcc00526dbb5ff411004c987a4182a8d68e7c Mon Sep 17 00:00:00 2001 From: Gergely Brautigam Date: Sat, 9 Mar 2019 13:28:50 +0100 Subject: [PATCH 0827/1679] cmd/go: report non-Go files as package error This change modifies cmd/go/list to format the error correctly in case -e flag is set. It also fixes a bug where the package loader was only ever checking the first pattern if it had the go extension. This caused and error when a file without .go extension was not the first argument. Fixes #29899 Change-Id: I029bf4465ad4ad054434b8337c1d2a59369783da Reviewed-on: https://go-review.googlesource.com/c/go/+/166398 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/load/pkg.go | 17 ++++++++++++++--- .../testdata/script/list_test_non_go_files.txt | 13 +++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/cmd/go/testdata/script/list_test_non_go_files.txt diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go index 6d3a2972a1..68acb96a80 100644 --- a/src/cmd/go/internal/load/pkg.go +++ b/src/cmd/go/internal/load/pkg.go @@ -1935,8 +1935,12 @@ func Packages(args []string) []*Package { // cannot be loaded at all. // The packages that fail to load will have p.Error != nil. func PackagesAndErrors(patterns []string) []*Package { - if len(patterns) > 0 && strings.HasSuffix(patterns[0], ".go") { - return []*Package{GoFilesPackage(patterns)} + if len(patterns) > 0 { + for _, p := range patterns { + if strings.HasSuffix(p, ".go") { + return []*Package{GoFilesPackage(patterns)} + } + } } matches := ImportPaths(patterns) @@ -2048,7 +2052,14 @@ func GoFilesPackage(gofiles []string) *Package { for _, f := range gofiles { if !strings.HasSuffix(f, ".go") { - base.Fatalf("named files must be .go files") + pkg := new(Package) + pkg.Internal.Local = true + pkg.Internal.CmdlineFiles = true + pkg.Name = f + pkg.Error = &PackageError{ + Err: fmt.Sprintf("named files must be .go files: %s", pkg.Name), + } + return pkg } } diff --git a/src/cmd/go/testdata/script/list_test_non_go_files.txt b/src/cmd/go/testdata/script/list_test_non_go_files.txt new file mode 100644 index 0000000000..16b98f4a37 --- /dev/null +++ b/src/cmd/go/testdata/script/list_test_non_go_files.txt @@ -0,0 +1,13 @@ +env GO111MODULE=off + +# issue 29899: handling files with non-Go extension +go list -e -test -json -- c.c x.go +stdout '"Err": "named files must be .go files: c.c"' + +! go list -test -json -- c.c x.go +stderr 'can''t load package: named files must be .go files: c.c' + +-- x.go -- +package main +-- c.c -- +package c -- GitLab From 996a687ebbf81b26f81b41b8e62ef21d8b0826af Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 2 Apr 2019 14:43:27 -0700 Subject: [PATCH 0828/1679] cmd/compile: enable -newescape by default RELNOTE=yes The new escape analysis pass is more precise, which for most Go code should be an improvement. However, it may also break code that happened to work before (e.g., code that violated the unsafe.Pointer safety rules). The old escape analysis pass can be re-enabled with "go build -gcflags=all=-newescape=false". N.B., it's NOT recommended to mix the old and new escape analysis passes such as by omitting "all=". While the old and new escape analysis passes use similar and mostly compatible metadata, there are cases (e.g., closure handling) where they semantically differ and could lead to memory corruption errors in compiled programs. Fixes #23109. Change-Id: I0b1b6a6de5e240cb30c87a165f47bb8795491158 Reviewed-on: https://go-review.googlesource.com/c/go/+/170448 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: David Chase --- src/cmd/compile/internal/gc/main.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 69652834a1..71a4024765 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -253,13 +253,13 @@ func Main(archInit func(*Arch)) { flag.StringVar(&blockprofile, "blockprofile", "", "write block profile to `file`") flag.StringVar(&mutexprofile, "mutexprofile", "", "write mutex profile to `file`") flag.StringVar(&benchfile, "bench", "", "append benchmark times to `file`") - flag.BoolVar(&newescape, "newescape", false, "enable new escape analysis") + flag.BoolVar(&newescape, "newescape", true, "enable new escape analysis") objabi.Flagparse(usage) // Record flags that affect the build result. (And don't // record flags that don't, since that would cause spurious // changes in the binary.) - recordFlags("B", "N", "l", "msan", "race", "shared", "dynlink", "dwarflocationlists") + recordFlags("B", "N", "l", "msan", "race", "shared", "dynlink", "dwarflocationlists", "newescape") Ctxt.Flag_shared = flag_dynlink || flag_shared Ctxt.Flag_dynlink = flag_dynlink -- GitLab From 75308c98e3068691cdf21914bb4eca2c81ce1b15 Mon Sep 17 00:00:00 2001 From: Constantin Konstantinidis Date: Sun, 14 Apr 2019 07:52:05 +0200 Subject: [PATCH 0829/1679] cmd/go: remove auto-deriving module path for github.com This fix removes the special case of auto-deriving the module path only for VCS github.com. Error message now explicitly requests the module path. Documentation and its FAQ do not need an update as only the beginning of the message is mentioned and is not modified. Fixes #27951 Change-Id: Icaf87a38b5c58451edba9beaa12ae9a68e288ca1 Reviewed-on: https://go-review.googlesource.com/c/go/+/172019 Reviewed-by: Daniel Lublin Reviewed-by: Bryan C. Mills Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modload/init.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index d0beb6e747..4bc4a2449c 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -559,17 +559,10 @@ func findModulePath(dir string) (string, error) { } } - // Look for .git/config with github origin as last resort. - data, _ = ioutil.ReadFile(filepath.Join(dir, ".git/config")) - if m := gitOriginRE.FindSubmatch(data); m != nil { - return "github.com/" + string(m[1]), nil - } - - return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, module path not specified)", dir) + return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, module path must be specified)", dir) } var ( - gitOriginRE = lazyregexp.New(`(?m)^\[remote "origin"\]\r?\n\turl = (?:https://github.com/|git@github.com:|gh:)([^/]+/[^/]+?)(\.git)?\r?\n`) importCommentRE = lazyregexp.New(`(?m)^package[ \t]+[^ \t\r\n/]+[ \t]+//[ \t]+import[ \t]+(\"[^"]+\")[ \t]*\r?\n`) ) -- GitLab From 6997671d2e69cb3d5ac26b34564d117eed472260 Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 8 Apr 2019 14:31:21 -0400 Subject: [PATCH 0830/1679] cmd/go: handle wildcards for unknown modules in "go get" For example, "go get golang.org/x/tools/cmd/..." will add a requirement for "golang.org/x/tools" to go.mod and will install executables from the "cmd" subdirectory. Fixes #29363 Change-Id: Id53f051710708d7760ffe831d4274fd54533d2b7 Reviewed-on: https://go-review.googlesource.com/c/go/+/171138 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modget/get.go | 28 ++++++-- src/cmd/go/internal/modload/query.go | 65 +++++++++++++++++++ .../go/testdata/script/mod_get_patterns.txt | 33 ++++++++++ 3 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_get_patterns.txt diff --git a/src/cmd/go/internal/modget/get.go b/src/cmd/go/internal/modget/get.go index c8368acce3..e183151d29 100644 --- a/src/cmd/go/internal/modget/get.go +++ b/src/cmd/go/internal/modget/get.go @@ -351,15 +351,18 @@ func runGet(cmd *base.Command, args []string) { match := search.MatchPattern(path) matched := false for _, m := range modload.BuildList() { + // TODO(bcmills): Patterns that don't contain the module path but do + // contain partial package paths will not match here. For example, + // ...html/... would not match html/template or golang.org/x/net/html. + // Related golang.org/issue/26902. if match(m.Path) || str.HasPathPrefix(path, m.Path) { tasks = append(tasks, &task{arg: arg, path: m.Path, vers: vers, prevM: m, forceModulePath: true}) matched = true } } // If matched, we're done. - // Otherwise assume pattern is inside a single module - // (golang.org/x/text/unicode/...) and leave for usual lookup. - // Unless we're using -m. + // If we're using -m, report an error. + // Otherwise, look up a module containing packages that match the pattern. if matched { continue } @@ -367,7 +370,10 @@ func runGet(cmd *base.Command, args []string) { base.Errorf("go get %s: pattern matches no modules in build list", arg) continue } + tasks = append(tasks, &task{arg: arg, path: path, vers: vers}) + continue } + t := &task{arg: arg, path: path, vers: vers} if vers == "patch" { if *getM { @@ -605,7 +611,7 @@ func runGet(cmd *base.Command, args []string) { if p.Error != nil { if len(args) == 0 && getU != "" && strings.HasPrefix(p.Error.Err, "no Go files") { // Upgrading modules: skip the implicitly-requested package at the - // current directory, even if it is not tho module root. + // current directory, even if it is not the module root. continue } if strings.Contains(p.Error.Err, "cannot find module providing") && modload.ModuleInfo(p.ImportPath) != nil { @@ -644,14 +650,22 @@ func getQuery(path, vers string, prevM module.Version, forceModulePath bool) (mo } } - // First choice is always to assume path is a module path. - // If that works out, we're done. + // If the path has a wildcard, search for a module that matches the pattern. + if strings.Contains(path, "...") { + if forceModulePath { + panic("forceModulePath is true for path with wildcard " + path) + } + _, m, _, err := modload.QueryPattern(path, vers, modload.Allowed) + return m, err + } + + // Try interpreting the path as a module path. info, err := modload.Query(path, vers, modload.Allowed) if err == nil { return module.Version{Path: path, Version: info.Version}, nil } - // Even if the query fails, if the path must be a real module, then report the query error. + // If the query fails, and the path must be a real module, report the query error. if forceModulePath || *getM { return module.Version{}, err } diff --git a/src/cmd/go/internal/modload/query.go b/src/cmd/go/internal/modload/query.go index 30bdc4dc7d..84950732be 100644 --- a/src/cmd/go/internal/modload/query.go +++ b/src/cmd/go/internal/modload/query.go @@ -10,6 +10,7 @@ import ( "cmd/go/internal/module" "cmd/go/internal/semver" "cmd/go/internal/str" + "errors" "fmt" pathpkg "path" "strings" @@ -254,3 +255,67 @@ func QueryPackage(path, query string, allowed func(module.Version) bool) (module return module.Version{}, nil, finalErr } + +// QueryPattern looks up a module with at least one package matching the +// given pattern at the given version. It returns a list of matched packages +// and information about the module. +// +// QueryPattern queries modules with package paths up to the first "..." +// in the pattern. For the pattern "example.com/a/b.../c", QueryPattern would +// consider prefixes of "example.com/a". If multiple modules have versions +// that match the query and packages that match the pattern, QueryPattern +// picks the one with the longest module path. +func QueryPattern(pattern string, query string, allowed func(module.Version) bool) ([]string, module.Version, *modfetch.RevInfo, error) { + i := strings.Index(pattern, "...") + if i < 0 { + m, info, err := QueryPackage(pattern, query, allowed) + if err != nil { + return nil, module.Version{}, nil, err + } else { + return []string{pattern}, m, info, nil + } + } + base := pathpkg.Dir(pattern[:i+3]) + + // Return the most specific error for the longest module path. + const ( + errNoModule = 0 + errNoVersion = 1 + errNoMatch = 2 + ) + errLevel := errNoModule + finalErr := errors.New("cannot find module matching pattern") + + for p := base; p != "." && p != "/"; p = pathpkg.Dir(p) { + info, err := Query(p, query, allowed) + if err != nil { + if _, ok := err.(*codehost.VCSError); ok { + // A VCSError means we know where to find the code, + // we just can't. Abort search. + return nil, module.Version{}, nil, err + } + if errLevel < errNoVersion { + errLevel = errNoVersion + finalErr = err + } + continue + } + m := module.Version{Path: p, Version: info.Version} + // matchPackages also calls fetch but treats errors as fatal, so we + // fetch here first. + _, _, err = fetch(m) + if err != nil { + return nil, module.Version{}, nil, err + } + pkgs := matchPackages(pattern, anyTags, false, []module.Version{m}) + if len(pkgs) > 0 { + return pkgs, m, info, nil + } + if errLevel < errNoMatch { + errLevel = errNoMatch + finalErr = fmt.Errorf("no matching packages in module %s@%s", m.Path, m.Version) + } + } + + return nil, module.Version{}, nil, finalErr +} diff --git a/src/cmd/go/testdata/script/mod_get_patterns.txt b/src/cmd/go/testdata/script/mod_get_patterns.txt new file mode 100644 index 0000000000..123490da6c --- /dev/null +++ b/src/cmd/go/testdata/script/mod_get_patterns.txt @@ -0,0 +1,33 @@ +env GO111MODULE=on + +# If a pattern doesn't match any modules in the build list, +# and -m is used, an error should be reported. +cp go.mod.orig go.mod +! go get -m rsc.io/quote/... +stderr 'pattern matches no modules in build list' + +# If a pattern doesn't match any modules in the build list, +# we assume the pattern matches a single module where the +# part of the pattern before "..." is the module path. +cp go.mod.orig go.mod +go get -d rsc.io/quote/... +grep 'require rsc.io/quote' go.mod + +cp go.mod.orig go.mod +! go get -d rsc.io/quote/x... +stderr 'go get rsc.io/quote/x...: no matching packages in module rsc.io/quote@v1.5.2' +! grep 'require rsc.io/quote' go.mod + +! go get -d rsc.io/quote/x/... +stderr 'go get rsc.io/quote/x/...: no matching packages in module rsc.io/quote@v1.5.2' +! grep 'require rsc.io/quote' go.mod + +-- go.mod.orig -- +module m + +go 1.13 + +-- use/use.go -- +package use + +import _ "rsc.io/quote" -- GitLab From f7c967259254fa90e1f1951f83fb66850ae3809a Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 8 Apr 2019 16:57:13 -0400 Subject: [PATCH 0831/1679] cmd/go: describe dependencies in build list error messages mvs.BuildList reports errors with a chain of modules to make it clear why the module where the error occurred was part of the build. This is a little confusing with "go get -u" since there are edges in the module graph for requirements and for updates. With this change, we now print "requires" or "updates to" between each module version in the chain. Updates #30661 Change-Id: Ie689500ea86857e715b250b9e0cae0bc6686dc32 Reviewed-on: https://go-review.googlesource.com/c/go/+/171150 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/mvs/mvs.go | 45 ++++++++++++------- .../go/testdata/script/mod_load_badchain.txt | 24 +++++----- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go index 160e6089db..284a6fc339 100644 --- a/src/cmd/go/internal/mvs/mvs.go +++ b/src/cmd/go/internal/mvs/mvs.go @@ -65,33 +65,41 @@ type Reqs interface { // while constructing a build list. BuildListError prints the chain // of requirements to the module where the error occurred. type BuildListError struct { - Err error - Stack []module.Version + err error + stack []buildListErrorElem +} + +type buildListErrorElem struct { + m module.Version + + // nextReason is the reason this module depends on the next module in the + // stack. Typically either "requires", or "upgraded to". + nextReason string } func (e *BuildListError) Error() string { b := &strings.Builder{} - errMsg := e.Err.Error() - stack := e.Stack + errMsg := e.err.Error() + stack := e.stack // Don't print modules at the beginning of the chain without a // version. These always seem to be the main module or a // synthetic module ("target@"). - for len(stack) > 0 && stack[len(stack)-1].Version == "" { + for len(stack) > 0 && stack[len(stack)-1].m.Version == "" { stack = stack[:len(stack)-1] } // Don't print the last module if the error message already // starts with module path and version. - if len(stack) > 0 && strings.HasPrefix(errMsg, fmt.Sprintf("%s@%s: ", stack[0].Path, stack[0].Version)) { - // error already mentions module - stack = stack[1:] + errMentionsLast := len(stack) > 0 && strings.HasPrefix(errMsg, fmt.Sprintf("%s@%s: ", stack[0].m.Path, stack[0].m.Version)) + for i := len(stack) - 1; i >= 1; i-- { + fmt.Fprintf(b, "%s@%s %s\n\t", stack[i].m.Path, stack[i].m.Version, stack[i].nextReason) } - - for i := len(stack) - 1; i >= 0; i-- { - fmt.Fprintf(b, "%s@%s ->\n\t", stack[i].Path, stack[i].Version) + if errMentionsLast || len(stack) == 0 { + b.WriteString(errMsg) + } else { + fmt.Fprintf(b, "%s@%s: %s", stack[0].m.Path, stack[0].m.Version, errMsg) } - b.WriteString(errMsg) return b.String() } @@ -168,9 +176,16 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) mo q = q[1:] if node.err != nil { - err := &BuildListError{Err: node.err} - for n := node; n != nil; n = neededBy[n] { - err.Stack = append(err.Stack, n.m) + err := &BuildListError{ + err: node.err, + stack: []buildListErrorElem{{m: node.m}}, + } + for n, prev := neededBy[node], node; n != nil; n, prev = neededBy[n], n { + reason := "requires" + if n.upgrade == prev.m { + reason = "updating to" + } + err.stack = append(err.stack, buildListErrorElem{m: n.m, nextReason: reason}) } return nil, err } diff --git a/src/cmd/go/testdata/script/mod_load_badchain.txt b/src/cmd/go/testdata/script/mod_load_badchain.txt index ded6e1669d..aa01300e6c 100644 --- a/src/cmd/go/testdata/script/mod_load_badchain.txt +++ b/src/cmd/go/testdata/script/mod_load_badchain.txt @@ -8,18 +8,18 @@ go mod download example.com/badchain/a@v1.1.0 go mod download example.com/badchain/b@v1.1.0 go mod download example.com/badchain/c@v1.1.0 -# Try to upgrade example.com/badchain/a (and its dependencies). +# Try to update example.com/badchain/a (and its dependencies). ! go get -u example.com/badchain/a -cmp stderr upgrade-a-expected +cmp stderr update-a-expected cmp go.mod go.mod.orig -# Try to upgrade the main module. This upgrades everything, including +# Try to update the main module. This updates everything, including # modules that aren't direct requirements, so the error stack is shorter. ! go get -u -cmp stderr upgrade-main-expected +cmp stderr update-main-expected cmp go.mod go.mod.orig -# Upgrade manually. Listing modules should produce an error. +# update manually. Listing modules should produce an error. go mod edit -require=example.com/badchain/a@v1.1.0 ! go list -m cmp stderr list-expected @@ -28,14 +28,14 @@ cmp stderr list-expected module m require example.com/badchain/a v1.0.0 --- upgrade-main-expected -- -go get: example.com/badchain/c@v1.0.0 -> +-- update-main-expected -- +go get: example.com/badchain/c@v1.0.0 updating to example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" --- upgrade-a-expected -- -go get: example.com/badchain/a@v1.1.0 -> - example.com/badchain/b@v1.1.0 -> +-- update-a-expected -- +go get: example.com/badchain/a@v1.1.0 requires + example.com/badchain/b@v1.1.0 requires example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" -- list-expected -- -go: example.com/badchain/a@v1.1.0 -> - example.com/badchain/b@v1.1.0 -> +go: example.com/badchain/a@v1.1.0 requires + example.com/badchain/b@v1.1.0 requires example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" -- GitLab From 2bdbc942f5ae3da8cad8d0f2bd3f4ce75a821e6c Mon Sep 17 00:00:00 2001 From: Jay Conrod Date: Mon, 15 Apr 2019 15:34:49 -0400 Subject: [PATCH 0832/1679] cmd/go: print package import chains for some build list errors When we construct the build list by loading packages (e.g., in "go build", "go list", or "go test"), we may load additional modules not mentioned in the original build list. If we encounter an error loading one of these modules, mvs.BuildList currently returns a BuildListError with a chain of requirments. Unfortunately, this is not helpful, since the graph is structured such that these missing modules are direct requirements of the main module. With this change, loader.load keeps track of the package that caused each "missing" module to be added. If an error occurs in a missing module, the chain of package imports is printed instead of the module requirements. Fixes #31475 Change-Id: Ie484814af42ceea3e85fedc38e705ba3a38cd495 Reviewed-on: https://go-review.googlesource.com/c/go/+/171859 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/modload/load.go | 34 ++++++++++++++----- src/cmd/go/internal/mvs/mvs.go | 15 ++++++-- .../go/testdata/script/mod_load_badchain.txt | 33 +++++++++++++++++- .../script/mod_missingpkg_prerelease.txt | 2 +- 4 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go index 78681b165a..388837e205 100644 --- a/src/cmd/go/internal/modload/load.go +++ b/src/cmd/go/internal/modload/load.go @@ -546,6 +546,7 @@ func (ld *loader) load(roots func() []string) { for _, m := range buildList { haveMod[m] = true } + modAddedBy := make(map[module.Version]*loadPkg) for _, pkg := range ld.pkgs { if err, ok := pkg.err.(*ImportMissingError); ok && err.Module.Path != "" { if err.newMissingVersion != "" { @@ -558,6 +559,7 @@ func (ld *loader) load(roots func() []string) { numAdded++ if !haveMod[err.Module] { haveMod[err.Module] = true + modAddedBy[err.Module] = pkg buildList = append(buildList, err.Module) } continue @@ -573,6 +575,14 @@ func (ld *loader) load(roots func() []string) { reqs = Reqs() buildList, err = mvs.BuildList(Target, reqs) if err != nil { + // If an error was found in a newly added module, report the package + // import stack instead of the module requirement stack. Packages + // are more descriptive. + if err, ok := err.(*mvs.BuildListError); ok { + if pkg := modAddedBy[err.Module()]; pkg != nil { + base.Fatalf("go: %s: %v", pkg.stackText(), err.Err) + } + } base.Fatalf("go: %v", err) } } @@ -804,27 +814,33 @@ func (ld *loader) buildStacks() { // stackText builds the import stack text to use when // reporting an error in pkg. It has the general form // -// import root -> -// import other -> -// import other2 -> -// import pkg +// root imports +// other imports +// other2 tested by +// other2.test imports +// pkg // func (pkg *loadPkg) stackText() string { var stack []*loadPkg - for p := pkg.stack; p != nil; p = p.stack { + for p := pkg; p != nil; p = p.stack { stack = append(stack, p) } var buf bytes.Buffer for i := len(stack) - 1; i >= 0; i-- { p := stack[i] + fmt.Fprint(&buf, p.path) if p.testOf != nil { - fmt.Fprintf(&buf, "test ->\n\t") - } else { - fmt.Fprintf(&buf, "import %q ->\n\t", p.path) + fmt.Fprint(&buf, ".test") + } + if i > 0 { + if stack[i-1].testOf == p { + fmt.Fprint(&buf, " tested by\n\t") + } else { + fmt.Fprint(&buf, " imports\n\t") + } } } - fmt.Fprintf(&buf, "import %q", pkg.path) return buf.String() } diff --git a/src/cmd/go/internal/mvs/mvs.go b/src/cmd/go/internal/mvs/mvs.go index 284a6fc339..d1c3d8c08a 100644 --- a/src/cmd/go/internal/mvs/mvs.go +++ b/src/cmd/go/internal/mvs/mvs.go @@ -65,7 +65,7 @@ type Reqs interface { // while constructing a build list. BuildListError prints the chain // of requirements to the module where the error occurred. type BuildListError struct { - err error + Err error stack []buildListErrorElem } @@ -77,9 +77,18 @@ type buildListErrorElem struct { nextReason string } +// Module returns the module where the error occurred. If the module stack +// is empty, this returns a zero value. +func (e *BuildListError) Module() module.Version { + if len(e.stack) == 0 { + return module.Version{} + } + return e.stack[0].m +} + func (e *BuildListError) Error() string { b := &strings.Builder{} - errMsg := e.err.Error() + errMsg := e.Err.Error() stack := e.stack // Don't print modules at the beginning of the chain without a @@ -177,7 +186,7 @@ func buildList(target module.Version, reqs Reqs, upgrade func(module.Version) mo if node.err != nil { err := &BuildListError{ - err: node.err, + Err: node.err, stack: []buildListErrorElem{{m: node.m}}, } for n, prev := neededBy[node], node; n != nil; n, prev = neededBy[n], n { diff --git a/src/cmd/go/testdata/script/mod_load_badchain.txt b/src/cmd/go/testdata/script/mod_load_badchain.txt index aa01300e6c..d0fdb485c2 100644 --- a/src/cmd/go/testdata/script/mod_load_badchain.txt +++ b/src/cmd/go/testdata/script/mod_load_badchain.txt @@ -19,15 +19,39 @@ cmp go.mod go.mod.orig cmp stderr update-main-expected cmp go.mod go.mod.orig -# update manually. Listing modules should produce an error. +# Update manually. Listing modules should produce an error. go mod edit -require=example.com/badchain/a@v1.1.0 ! go list -m cmp stderr list-expected +# Try listing a package that imports a package +# in a module without a requirement. +go mod edit -droprequire example.com/badchain/a +! go list m/use +cmp stderr list-missing-expected + +! go list -test m/testuse +cmp stderr list-missing-test-expected + -- go.mod.orig -- module m require example.com/badchain/a v1.0.0 +-- use/use.go -- +package use + +import _ "example.com/badchain/c" +-- testuse/testuse.go -- +package testuse +-- testuse/testuse_test.go -- +package testuse + +import ( + "testing" + _ "example.com/badchain/c" +) + +func Test(t *testing.T) {} -- update-main-expected -- go get: example.com/badchain/c@v1.0.0 updating to example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" @@ -39,3 +63,10 @@ go get: example.com/badchain/a@v1.1.0 requires go: example.com/badchain/a@v1.1.0 requires example.com/badchain/b@v1.1.0 requires example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" +-- list-missing-expected -- +go: m/use imports + example.com/badchain/c: example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" +-- list-missing-test-expected -- +go: m/testuse tested by + m/testuse.test imports + example.com/badchain/c: example.com/badchain/c@v1.1.0: parsing go.mod: unexpected module path "example.com/badchain/wrong" diff --git a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt index e7409d1d86..6203606c22 100644 --- a/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt +++ b/src/cmd/go/testdata/script/mod_missingpkg_prerelease.txt @@ -1,7 +1,7 @@ env GO111MODULE=on ! go list use.go -stderr 'import "example.com/missingpkg/deprecated": package provided by example.com/missingpkg at latest version v1.0.0 but not at required version v1.0.1-beta' +stderr 'example.com/missingpkg/deprecated: package provided by example.com/missingpkg at latest version v1.0.0 but not at required version v1.0.1-beta' -- use.go -- package use -- GitLab From 644543dd6447b39800825f66411df06066baa84e Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Tue, 16 Apr 2019 20:32:31 +0700 Subject: [PATCH 0833/1679] cmd/compile: fix const declaration group broken with closure In typecheckclosure, a xfunc node will be put to xtop. But that node can be shared between multiple closures, like in a const declaration group: const ( x = unsafe.Sizeof(func() {}) y ) It makes a xfunc node appears multiple times in xtop, causing duplicate initLSym run. To fix this issue, we only do typecheck for xfunc one time, and setup closure node earlier in typecheckclosure process. Fixes #30709 Change-Id: Ic924a157ee9f3e5d776214bef5390849ddc8aab9 Reviewed-on: https://go-review.googlesource.com/c/go/+/172298 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/closure.go | 14 +++++++---- test/fixedbugs/issue30709.go | 33 ++++++++++++++++++++++++++ test/fixedbugs/issue30709.out | 4 ++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 test/fixedbugs/issue30709.go create mode 100644 test/fixedbugs/issue30709.out diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 6db0f02001..89e2a4ef00 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -73,6 +73,16 @@ func (p *noder) funcLit(expr *syntax.FuncLit) *Node { func typecheckclosure(clo *Node, top int) { xfunc := clo.Func.Closure + clo.Func.Ntype = typecheck(clo.Func.Ntype, Etype) + clo.Type = clo.Func.Ntype.Type + clo.Func.Top = top + + // Do not typecheck xfunc twice, otherwise, we will end up pushing + // xfunc to xtop multiple times, causing initLSym called twice. + // See #30709 + if xfunc.Typecheck() == 1 { + return + } for _, ln := range xfunc.Func.Cvars.Slice() { n := ln.Name.Defn @@ -95,10 +105,6 @@ func typecheckclosure(clo *Node, top int) { declare(xfunc.Func.Nname, PFUNC) xfunc = typecheck(xfunc, ctxStmt) - clo.Func.Ntype = typecheck(clo.Func.Ntype, Etype) - clo.Type = clo.Func.Ntype.Type - clo.Func.Top = top - // Type check the body now, but only if we're inside a function. // At top level (in a variable initialization: curfn==nil) we're not // ready to type check code yet; we'll check it later, because the diff --git a/test/fixedbugs/issue30709.go b/test/fixedbugs/issue30709.go new file mode 100644 index 0000000000..49524540ed --- /dev/null +++ b/test/fixedbugs/issue30709.go @@ -0,0 +1,33 @@ +// run + +// Copyright 2019 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. + +// Check closure in const declaration group can be compiled +// and set correct value + +package main + +import "unsafe" + +const ( + x = unsafe.Sizeof(func() {}) + y +) + +func main() { + const ( + z = unsafe.Sizeof(func() {}) + t + ) + + // x and y must be equal + println(x == y) + // size must be greater than zero + println(y > 0) + + // Same logic as x, y above + println(z == t) + println(t > 0) +} diff --git a/test/fixedbugs/issue30709.out b/test/fixedbugs/issue30709.out new file mode 100644 index 0000000000..1140ff52e2 --- /dev/null +++ b/test/fixedbugs/issue30709.out @@ -0,0 +1,4 @@ +true +true +true +true -- GitLab From 13b7c04d3f15e5b3bc767057de148d8bf116dcf4 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 16 Apr 2019 11:59:05 -0700 Subject: [PATCH 0834/1679] runtime/internal/atomic: fix s390x's StorepNoWB implementation Same as CL 170323, but for s390x instead of wasm. Fixes #31495. Change-Id: Ie39f649f5e33690375a8bcb1bc3b92d912ca4398 Reviewed-on: https://go-review.googlesource.com/c/go/+/172417 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/runtime/internal/atomic/atomic_s390x.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/runtime/internal/atomic/atomic_s390x.go b/src/runtime/internal/atomic/atomic_s390x.go index ec294a27ba..2ffbec0b3f 100644 --- a/src/runtime/internal/atomic/atomic_s390x.go +++ b/src/runtime/internal/atomic/atomic_s390x.go @@ -42,11 +42,14 @@ func Store64(ptr *uint64, val uint64) { *ptr = val } +//go:notinheap +type noWB struct{} + // NO go:noescape annotation; see atomic_pointer.go. //go:noinline //go:nosplit func StorepNoWB(ptr unsafe.Pointer, val unsafe.Pointer) { - *(*uintptr)(ptr) = uintptr(val) + *(**noWB)(ptr) = (*noWB)(val) } //go:noinline -- GitLab From 34b1f210462409f8c05d927a80d973b5692c1d26 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 16 Apr 2019 16:14:31 -0400 Subject: [PATCH 0835/1679] cmd/go/internal/renameio: mask spurious "Access is denied" errors on Windows Fixes #31247 Change-Id: I85a760a5d36ae835c97a13f980804d06b658857e Reviewed-on: https://go-review.googlesource.com/c/go/+/172418 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/go/internal/renameio/renameio.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/renameio/renameio.go b/src/cmd/go/internal/renameio/renameio.go index 8f59e1a577..3f3f1708fa 100644 --- a/src/cmd/go/internal/renameio/renameio.go +++ b/src/cmd/go/internal/renameio/renameio.go @@ -11,6 +11,9 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" + "strings" + "time" ) const patternSuffix = "*.tmp" @@ -59,5 +62,22 @@ func WriteToFile(filename string, data io.Reader) (err error) { if err := f.Close(); err != nil { return err } - return os.Rename(f.Name(), filename) + + var start time.Time + for { + err := os.Rename(f.Name(), filename) + if err == nil || runtime.GOOS != "windows" || !strings.HasSuffix(err.Error(), "Access is denied.") { + return err + } + + // Windows seems to occasionally trigger spurious "Access is denied" errors + // here (see golang.org/issue/31247). We're not sure why. It's probably + // worth a little extra latency to avoid propagating the spurious errors. + if start.IsZero() { + start = time.Now() + } else if time.Since(start) >= 500*time.Millisecond { + return err + } + time.Sleep(5 * time.Millisecond) + } } -- GitLab From 5781df421e721088f3ff6229f0e8d4e4c04765b8 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 28 Mar 2019 16:15:14 -0700 Subject: [PATCH 0836/1679] all: s/cancelation/cancellation/ Though there is variation in the spelling of canceled, cancellation is always spelled with a double l. Reference: https://www.grammarly.com/blog/canceled-vs-cancelled/ Change-Id: I240f1a297776c8e27e74f3eca566d2bc4c856f2f Reviewed-on: https://go-review.googlesource.com/c/go/+/170060 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/ssa.go | 4 ++-- .../x/tools/go/analysis/passes/lostcancel/lostcancel.go | 4 ++-- src/context/context.go | 6 +++--- src/context/context_test.go | 4 ++-- src/context/example_test.go | 2 +- src/database/sql/sql.go | 2 +- src/internal/poll/fd_windows.go | 6 +++--- src/math/j0.go | 4 ++-- src/math/j1.go | 4 ++-- src/net/dial.go | 2 +- src/net/dial_test.go | 4 ++-- src/net/http/client.go | 6 +++--- src/net/http/http.go | 2 +- src/net/http/request.go | 2 +- src/net/http/socks_bundle.go | 2 +- src/net/http/transport.go | 8 ++++---- src/net/http/transport_test.go | 2 +- src/net/lookup.go | 2 +- src/net/net.go | 2 +- src/os/timeout_test.go | 4 ++-- src/runtime/signal_solaris.go | 2 +- src/vendor/golang.org/x/net/nettest/conntest.go | 6 +++--- 22 files changed, 40 insertions(+), 40 deletions(-) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 6c06362385..8159dc7bca 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -2094,7 +2094,7 @@ func (s *state) expr(n *Node) *ssa.Value { addop := ssa.OpAdd64F subop := ssa.OpSub64F pt := floatForComplex(n.Type) // Could be Float32 or Float64 - wt := types.Types[TFLOAT64] // Compute in Float64 to minimize cancelation error + wt := types.Types[TFLOAT64] // Compute in Float64 to minimize cancellation error areal := s.newValue1(ssa.OpComplexReal, pt, a) breal := s.newValue1(ssa.OpComplexReal, pt, b) @@ -2137,7 +2137,7 @@ func (s *state) expr(n *Node) *ssa.Value { subop := ssa.OpSub64F divop := ssa.OpDiv64F pt := floatForComplex(n.Type) // Could be Float32 or Float64 - wt := types.Types[TFLOAT64] // Compute in Float64 to minimize cancelation error + wt := types.Types[TFLOAT64] // Compute in Float64 to minimize cancellation error areal := s.newValue1(ssa.OpComplexReal, pt, a) breal := s.newValue1(ssa.OpComplexReal, pt, b) diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go index b5161836a5..5be1ef0d57 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package lostcancel defines an Analyzer that checks for failure to -// call a context cancelation function. +// call a context cancellation function. package lostcancel import ( @@ -20,7 +20,7 @@ import ( const Doc = `check cancel func returned by context.WithCancel is called -The cancelation function returned by context.WithCancel, WithTimeout, +The cancellation function returned by context.WithCancel, WithTimeout, and WithDeadline must be called or the new context will remain live until its parent context is cancelled. (The background context is never cancelled.)` diff --git a/src/context/context.go b/src/context/context.go index ad67d2301d..93bf5b627d 100644 --- a/src/context/context.go +++ b/src/context/context.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package context defines the Context type, which carries deadlines, -// cancelation signals, and other request-scoped values across API boundaries +// cancellation signals, and other request-scoped values across API boundaries // and between processes. // // Incoming requests to a server should create a Context, and outgoing @@ -54,7 +54,7 @@ import ( "time" ) -// A Context carries a deadline, a cancelation signal, and other values across +// A Context carries a deadline, a cancellation signal, and other values across // API boundaries. // // Context's methods may be called by multiple goroutines simultaneously. @@ -92,7 +92,7 @@ type Context interface { // } // // See https://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. + // a Done channel for cancellation. Done() <-chan struct{} // If Done is not yet closed, Err returns nil. diff --git a/src/context/context_test.go b/src/context/context_test.go index 0cec169915..0e69e2f6fd 100644 --- a/src/context/context_test.go +++ b/src/context/context_test.go @@ -94,7 +94,7 @@ func XTestWithCancel(t testingT) { } cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate + time.Sleep(100 * time.Millisecond) // let cancellation propagate for i, c := range contexts { select { @@ -306,7 +306,7 @@ func XTestCanceledTimeout(t testingT) { o := otherContext{c} c, cancel := WithTimeout(o, 2*time.Second) cancel() - time.Sleep(100 * time.Millisecond) // let cancelation propagate + time.Sleep(100 * time.Millisecond) // let cancellation propagate select { case <-c.Done(): default: diff --git a/src/context/example_test.go b/src/context/example_test.go index 2b28b57704..b91a8acef3 100644 --- a/src/context/example_test.go +++ b/src/context/example_test.go @@ -59,7 +59,7 @@ func ExampleWithDeadline() { ctx, cancel := context.WithDeadline(context.Background(), d) // Even though ctx will be expired, it is good practice to call its - // cancelation function in any case. Failure to do so may keep the + // cancellation function in any case. Failure to do so may keep the // context and its parent alive longer than necessary. defer cancel() diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go index 3b3ac27436..5013505cd9 100644 --- a/src/database/sql/sql.go +++ b/src/database/sql/sql.go @@ -8,7 +8,7 @@ // The sql package must be used in conjunction with a database driver. // See https://golang.org/s/sqldrivers for a list of drivers. // -// Drivers that do not support context cancelation will not return until +// Drivers that do not support context cancellation will not return until // after the query is completed. // // For usage examples, see the wiki page at diff --git a/src/internal/poll/fd_windows.go b/src/internal/poll/fd_windows.go index 92bab5f9dd..f96e441abe 100644 --- a/src/internal/poll/fd_windows.go +++ b/src/internal/poll/fd_windows.go @@ -258,7 +258,7 @@ func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, erro s.req <- ioSrvReq{o, nil} <-o.errc } - // Wait for cancelation to complete. + // Wait for cancellation to complete. fd.pd.waitCanceled(int(o.mode)) if o.errno != 0 { err = syscall.Errno(o.errno) @@ -267,8 +267,8 @@ func (s *ioSrv) ExecIO(o *operation, submit func(o *operation) error) (int, erro } return 0, err } - // We issued a cancelation request. But, it seems, IO operation succeeded - // before the cancelation request run. We need to treat the IO operation as + // We issued a cancellation request. But, it seems, IO operation succeeded + // before the cancellation request run. We need to treat the IO operation as // succeeded (the bytes are actually sent/recv from network). return int(o.qty), nil } diff --git a/src/math/j0.go b/src/math/j0.go index 5523fc34a0..cb5f07bca6 100644 --- a/src/math/j0.go +++ b/src/math/j0.go @@ -38,7 +38,7 @@ package math // = 1/sqrt(2) * (cos(x) + sin(x)) // sin(x0) = sin(x)cos(pi/4)-cos(x)sin(pi/4) // = 1/sqrt(2) * (sin(x) - cos(x)) -// (To avoid cancelation, use +// (To avoid cancellation, use // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) // to compute the worse one.) // @@ -186,7 +186,7 @@ func Y0(x float64) float64 { // = 1/sqrt(2) * (sin(x) + cos(x)) // sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) // = 1/sqrt(2) * (sin(x) - cos(x)) - // To avoid cancelation, use + // To avoid cancellation, use // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) // to compute the worse one. diff --git a/src/math/j1.go b/src/math/j1.go index f1adcb6f41..7c7d279730 100644 --- a/src/math/j1.go +++ b/src/math/j1.go @@ -39,7 +39,7 @@ package math // = 1/sqrt(2) * (sin(x) - cos(x)) // sin(x1) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) // = -1/sqrt(2) * (sin(x) + cos(x)) -// (To avoid cancelation, use +// (To avoid cancellation, use // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) // to compute the worse one.) // @@ -197,7 +197,7 @@ func Y1(x float64) float64 { // = 1/sqrt(2) * (sin(x) - cos(x)) // sin(x0) = sin(x)cos(3pi/4)-cos(x)sin(3pi/4) // = -1/sqrt(2) * (cos(x) + sin(x)) - // To avoid cancelation, use + // To avoid cancellation, use // sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x)) // to compute the worse one. diff --git a/src/net/dial.go b/src/net/dial.go index 1f3ce1dfa3..7c03b54ceb 100644 --- a/src/net/dial.go +++ b/src/net/dial.go @@ -76,7 +76,7 @@ type Dialer struct { // Cancel is an optional channel whose closure indicates that // the dial should be canceled. Not all types of dials support - // cancelation. + // cancellation. // // Deprecated: Use DialContext instead. Cancel <-chan struct{} diff --git a/src/net/dial_test.go b/src/net/dial_test.go index 3a2c59a2d1..3646ab9815 100644 --- a/src/net/dial_test.go +++ b/src/net/dial_test.go @@ -463,7 +463,7 @@ func TestDialParallelSpuriousConnection(t *testing.T) { origTestHookDialTCP := testHookDialTCP defer func() { testHookDialTCP = origTestHookDialTCP }() testHookDialTCP = func(ctx context.Context, net string, laddr, raddr *TCPAddr) (*TCPConn, error) { - // Sleep long enough for Happy Eyeballs to kick in, and inhibit cancelation. + // Sleep long enough for Happy Eyeballs to kick in, and inhibit cancellation. // This forces dialParallel to juggle two successful connections. time.Sleep(fallbackDelay * 2) @@ -865,7 +865,7 @@ func TestCancelAfterDial(t *testing.T) { d := &Dialer{Cancel: cancel} c, err := d.Dial("tcp", ln.Addr().String()) - // Immediately after dialing, request cancelation and sleep. + // Immediately after dialing, request cancellation and sleep. // Before Issue 15078 was fixed, this would cause subsequent operations // to fail with an i/o timeout roughly 50% of the time. close(cancel) diff --git a/src/net/http/client.go b/src/net/http/client.go index 921f86bd92..aa54806c45 100644 --- a/src/net/http/client.go +++ b/src/net/http/client.go @@ -100,7 +100,7 @@ type Client struct { // For compatibility, the Client will also use the deprecated // CancelRequest method on Transport if found. New // RoundTripper implementations should use the Request's Context - // for cancelation instead of implementing CancelRequest. + // for cancellation instead of implementing CancelRequest. Timeout time.Duration } @@ -643,7 +643,7 @@ func (c *Client) do(req *Request) (retres *Response, reterr error) { reqBodyClosed = true if !deadline.IsZero() && didTimeout() { err = &httpError{ - // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancelation/ + // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancellation/ err: err.Error() + " (Client.Timeout exceeded while awaiting headers)", timeout: true, } @@ -870,7 +870,7 @@ func (b *cancelTimerBody) Read(p []byte) (n int, err error) { } if b.reqDidTimeout() { err = &httpError{ - // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancelation/ + // TODO: early in cycle: s/Client.Timeout exceeded/timeout or context cancellation/ err: err.Error() + " (Client.Timeout exceeded while reading body)", timeout: true, } diff --git a/src/net/http/http.go b/src/net/http/http.go index 1c829ae87f..3510fe604d 100644 --- a/src/net/http/http.go +++ b/src/net/http/http.go @@ -19,7 +19,7 @@ import ( const maxInt64 = 1<<63 - 1 // aLongTimeAgo is a non-zero time, far in the past, used for -// immediate cancelation of network operations. +// immediate cancellation of network operations. var aLongTimeAgo = time.Unix(1, 0) // TODO(bradfitz): move common stuff here. The other files have accumulated diff --git a/src/net/http/request.go b/src/net/http/request.go index 24e941f038..da5ac2c71b 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -327,7 +327,7 @@ type Request struct { // The returned context is always non-nil; it defaults to the // background context. // -// For outgoing client requests, the context controls cancelation. +// For outgoing client requests, the context controls cancellation. // // For incoming server requests, the context is canceled when the // client's connection closes, the request is canceled (with HTTP/2), diff --git a/src/net/http/socks_bundle.go b/src/net/http/socks_bundle.go index e6640dd404..3a947a0c91 100644 --- a/src/net/http/socks_bundle.go +++ b/src/net/http/socks_bundle.go @@ -453,7 +453,7 @@ func (up *socksUsernamePassword) Authenticate(ctx context.Context, rw io.ReadWri b = append(b, up.Username...) b = append(b, byte(len(up.Password))) b = append(b, up.Password...) - // TODO(mikio): handle IO deadlines and cancelation if + // TODO(mikio): handle IO deadlines and cancellation if // necessary if _, err := rw.Write(b); err != nil { return err diff --git a/src/net/http/transport.go b/src/net/http/transport.go index 6d82f44ff6..377914177f 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -1039,7 +1039,7 @@ func (t *Transport) getConn(treq *transportRequest, cm connectMethod) (*persistC t.decHostConnCount(cmKey) select { case <-req.Cancel: - // It was an error due to cancelation, so prioritize that + // It was an error due to cancellation, so prioritize that // error value. (Issue 16049) return nil, errRequestCanceledConn case <-req.Context().Done(): @@ -1050,7 +1050,7 @@ func (t *Transport) getConn(treq *transportRequest, cm connectMethod) (*persistC } return nil, err default: - // It wasn't an error due to cancelation, so + // It wasn't an error due to cancellation, so // return the original error message: return nil, v.err } @@ -1557,7 +1557,7 @@ func (pc *persistConn) isBroken() bool { } // canceled returns non-nil if the connection was closed due to -// CancelRequest or due to context cancelation. +// CancelRequest or due to context cancellation. func (pc *persistConn) canceled() error { pc.mu.Lock() defer pc.mu.Unlock() @@ -1813,7 +1813,7 @@ func (pc *persistConn) readLoop() { // Before looping back to the top of this function and peeking on // the bufio.Reader, wait for the caller goroutine to finish - // reading the response body. (or for cancelation or death) + // reading the response body. (or for cancellation or death) select { case bodyEOF := <-waitForBodyRead: pc.t.setReqCanceler(rc.req, nil) // before pc might return to idle pool diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index 5b1dbf9eff..857f0d5928 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -2114,7 +2114,7 @@ func testCancelRequestWithChannelBeforeDo(t *testing.T, withCtx bool) { } } else { if err == nil || !strings.Contains(err.Error(), "canceled") { - t.Errorf("Do error = %v; want cancelation", err) + t.Errorf("Do error = %v; want cancellation", err) } } } diff --git a/src/net/lookup.go b/src/net/lookup.go index 08e8d01385..0af1e2c289 100644 --- a/src/net/lookup.go +++ b/src/net/lookup.go @@ -255,7 +255,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP resolverFunc = alt } - // We don't want a cancelation of ctx to affect the + // We don't want a cancellation of ctx to affect the // lookupGroup operation. Otherwise if our context gets // canceled it might cause an error to be returned to a lookup // using a completely different context. However we need to preserve diff --git a/src/net/net.go b/src/net/net.go index 3bdccc8468..b44ecb6711 100644 --- a/src/net/net.go +++ b/src/net/net.go @@ -473,7 +473,7 @@ func (e *OpError) Error() string { var ( // aLongTimeAgo is a non-zero time, far in the past, used for - // immediate cancelation of dials. + // immediate cancellation of dials. aLongTimeAgo = time.Unix(1, 0) // nonDeadline and noCancel are just zero values for diff --git a/src/os/timeout_test.go b/src/os/timeout_test.go index 4720738d24..5d7ea7ea29 100644 --- a/src/os/timeout_test.go +++ b/src/os/timeout_test.go @@ -514,7 +514,7 @@ func TestReadWriteDeadlineRace(t *testing.T) { } // TestRacyRead tests that it is safe to mutate the input Read buffer -// immediately after cancelation has occurred. +// immediately after cancellation has occurred. func TestRacyRead(t *testing.T) { t.Parallel() @@ -553,7 +553,7 @@ func TestRacyRead(t *testing.T) { } // TestRacyWrite tests that it is safe to mutate the input Write buffer -// immediately after cancelation has occurred. +// immediately after cancellation has occurred. func TestRacyWrite(t *testing.T) { t.Parallel() diff --git a/src/runtime/signal_solaris.go b/src/runtime/signal_solaris.go index a8eeeee129..25f8ad55a6 100644 --- a/src/runtime/signal_solaris.go +++ b/src/runtime/signal_solaris.go @@ -41,7 +41,7 @@ var sigtable = [...]sigTabT{ /* 33 */ {_SigNotify, "SIGLWP: reserved signal no longer used by"}, /* 34 */ {_SigNotify, "SIGFREEZE: special signal used by CPR"}, /* 35 */ {_SigNotify, "SIGTHAW: special signal used by CPR"}, - /* 36 */ {_SigSetStack + _SigUnblock, "SIGCANCEL: reserved signal for thread cancellation"}, // Oracle's spelling of cancelation. + /* 36 */ {_SigSetStack + _SigUnblock, "SIGCANCEL: reserved signal for thread cancellation"}, // Oracle's spelling of cancellation. /* 37 */ {_SigNotify, "SIGLOST: resource lost (eg, record-lock lost)"}, /* 38 */ {_SigNotify, "SIGXRES: resource control exceeded"}, /* 39 */ {_SigNotify, "SIGJVM1: reserved signal for Java Virtual Machine"}, diff --git a/src/vendor/golang.org/x/net/nettest/conntest.go b/src/vendor/golang.org/x/net/nettest/conntest.go index 5bd3a8c68c..adbcaf02c6 100644 --- a/src/vendor/golang.org/x/net/nettest/conntest.go +++ b/src/vendor/golang.org/x/net/nettest/conntest.go @@ -138,7 +138,7 @@ func testPingPong(t *testing.T, c1, c2 net.Conn) { } // testRacyRead tests that it is safe to mutate the input Read buffer -// immediately after cancelation has occurred. +// immediately after cancellation has occurred. func testRacyRead(t *testing.T, c1, c2 net.Conn) { go chunkedCopy(c2, rand.New(rand.NewSource(0))) @@ -166,7 +166,7 @@ func testRacyRead(t *testing.T, c1, c2 net.Conn) { } // testRacyWrite tests that it is safe to mutate the input Write buffer -// immediately after cancelation has occurred. +// immediately after cancellation has occurred. func testRacyWrite(t *testing.T, c1, c2 net.Conn) { go chunkedCopy(ioutil.Discard, c2) @@ -314,7 +314,7 @@ func testCloseTimeout(t *testing.T, c1, c2 net.Conn) { defer wg.Wait() wg.Add(3) - // Test for cancelation upon connection closure. + // Test for cancellation upon connection closure. c1.SetDeadline(neverTimeout) go func() { defer wg.Done() -- GitLab From 7cdacf558fde27e1ac76f2f839a8cd7690d7e2ad Mon Sep 17 00:00:00 2001 From: Ainar Garipov Date: Tue, 16 Apr 2019 23:48:19 +0300 Subject: [PATCH 0837/1679] test: add regress test for issue 28369 Also gofmt test/escape5.go. Fixes #28369. Change-Id: I0a11748fd2b5cf01cb5437ae15827d9db91c0c0d Reviewed-on: https://go-review.googlesource.com/c/go/+/172358 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- test/escape5.go | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/test/escape5.go b/test/escape5.go index 393a4b0ac4..11cab629a7 100644 --- a/test/escape5.go +++ b/test/escape5.go @@ -9,7 +9,10 @@ package foo -import "runtime" +import ( + "runtime" + "unsafe" +) func noleak(p *int) int { // ERROR "p does not escape" return *p @@ -71,13 +74,13 @@ func f2() { } func f3() { - var x int // ERROR "moved to heap: x" + var x int // ERROR "moved to heap: x" p := leaktoret(&x) gp = p } func f4() { - var x int // ERROR "moved to heap: x" + var x int // ERROR "moved to heap: x" p, q := leaktoret2(&x) gp = p gp = q @@ -89,7 +92,7 @@ func f5() { } func f6() { - var x int // ERROR "moved to heap: x" + var x int // ERROR "moved to heap: x" px1, px2 := leaktoret22(leaktoret2(&x)) gp = px1 _ = px2 @@ -245,3 +248,17 @@ func g29000() { x := 1 f29000(2, x) // ERROR "x escapes to heap" } + +// Issue 28369: taking an address of a parameter and converting it into a uintptr causes an +// unnecessary escape. + +var sink28369 uintptr + +func f28369(n int) int { + if n == 0 { + sink28369 = uintptr(unsafe.Pointer(&n)) + return n + } + + return 1 + f28369(n-1) +} -- GitLab From 431b5c69ca214ce4291f008c1ce2a50b22bc2d2d Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 16 Apr 2019 21:39:00 +0000 Subject: [PATCH 0838/1679] crypto/tls, crypto/x509: update spelling of marshal* Per https://golang.org/wiki/Spelling and CL 33017. Change-Id: Ia813a81d25603883114c4e4b6997eb560d6a3690 Reviewed-on: https://go-review.googlesource.com/c/go/+/172457 Reviewed-by: Dmitri Shuralyov --- src/crypto/tls/handshake_messages.go | 2 +- src/crypto/x509/pkcs8.go | 4 ++-- src/crypto/x509/pkcs8_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/crypto/tls/handshake_messages.go b/src/crypto/tls/handshake_messages.go index 864fbd4757..2d21377737 100644 --- a/src/crypto/tls/handshake_messages.go +++ b/src/crypto/tls/handshake_messages.go @@ -320,7 +320,7 @@ func (m *clientHelloMsg) marshalWithoutBinders() []byte { } // updateBinders updates the m.pskBinders field, if necessary updating the -// cached marshalled representation. The supplied binders must have the same +// cached marshaled representation. The supplied binders must have the same // length as the current m.pskBinders. func (m *clientHelloMsg) updateBinders(pskBinders [][]byte) { if len(pskBinders) != len(m.pskBinders) { diff --git a/src/crypto/x509/pkcs8.go b/src/crypto/x509/pkcs8.go index bf3bd9e565..fa8d408228 100644 --- a/src/crypto/x509/pkcs8.go +++ b/src/crypto/x509/pkcs8.go @@ -80,7 +80,7 @@ func MarshalPKCS8PrivateKey(key interface{}) ([]byte, error) { case *ecdsa.PrivateKey: oid, ok := oidFromNamedCurve(k.Curve) if !ok { - return nil, errors.New("x509: unknown curve while marshalling to PKCS#8") + return nil, errors.New("x509: unknown curve while marshaling to PKCS#8") } oidBytes, err := asn1.Marshal(oid) @@ -100,7 +100,7 @@ func MarshalPKCS8PrivateKey(key interface{}) ([]byte, error) { } default: - return nil, fmt.Errorf("x509: unknown key type while marshalling PKCS#8: %T", key) + return nil, fmt.Errorf("x509: unknown key type while marshaling PKCS#8: %T", key) } return asn1.Marshal(privKey) diff --git a/src/crypto/x509/pkcs8_test.go b/src/crypto/x509/pkcs8_test.go index 4a72cc0c5e..9e890c386e 100644 --- a/src/crypto/x509/pkcs8_test.go +++ b/src/crypto/x509/pkcs8_test.go @@ -103,7 +103,7 @@ func TestPKCS8(t *testing.T) { continue } if !bytes.Equal(derBytes, reserialised) { - t.Errorf("%s: marshalled PKCS#8 didn't match original: got %x, want %x", test.name, reserialised, derBytes) + t.Errorf("%s: marshaled PKCS#8 didn't match original: got %x, want %x", test.name, reserialised, derBytes) continue } } -- GitLab From 850844ef65a89a12e66dd749c8862a7ff77f865e Mon Sep 17 00:00:00 2001 From: Sergey Yanykin Date: Sat, 13 Apr 2019 16:46:23 +0300 Subject: [PATCH 0839/1679] cmd/link/internal/ld: inline dosymtab Updates #20205 Change-Id: I44a7ee46a1cdc7fe6fd36c4db4c0dd87a19f7f5d Reviewed-on: https://go-review.googlesource.com/c/go/+/171733 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot --- src/cmd/link/internal/ld/data.go | 13 ------------- src/cmd/link/internal/ld/symtab.go | 11 ++++++++++- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index e421caabce..b869eea278 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -990,19 +990,6 @@ func addinitarrdata(ctxt *Link, s *sym.Symbol) { sp.AddAddr(ctxt.Arch, s) } -func dosymtype(ctxt *Link) { - switch ctxt.BuildMode { - case BuildModeCArchive, BuildModeCShared: - for _, s := range ctxt.Syms.Allsym { - // Create a new entry in the .init_array section that points to the - // library initializer function. - if s.Name == *flagEntrySymbol && ctxt.HeadType != objabi.Haix { - addinitarrdata(ctxt, s) - } - } - } -} - // symalign returns the required alignment for the given symbol s. func symalign(s *sym.Symbol) int32 { min := int32(thearch.Minalign) diff --git a/src/cmd/link/internal/ld/symtab.go b/src/cmd/link/internal/ld/symtab.go index 3add7197b8..d686a8a476 100644 --- a/src/cmd/link/internal/ld/symtab.go +++ b/src/cmd/link/internal/ld/symtab.go @@ -326,7 +326,16 @@ func textsectionmap(ctxt *Link) uint32 { } func (ctxt *Link) symtab() { - dosymtype(ctxt) + switch ctxt.BuildMode { + case BuildModeCArchive, BuildModeCShared: + for _, s := range ctxt.Syms.Allsym { + // Create a new entry in the .init_array section that points to the + // library initializer function. + if s.Name == *flagEntrySymbol && ctxt.HeadType != objabi.Haix { + addinitarrdata(ctxt, s) + } + } + } // Define these so that they'll get put into the symbol table. // data.c:/^address will provide the actual values. -- GitLab From d7df9de5a2d8978351705901a9252888c7a935bb Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 28 Oct 2018 14:52:51 -0500 Subject: [PATCH 0840/1679] crypto/tls: fix a minor MAC vs padding leak The CBC mode ciphers in TLS are a disaster. By ordering authentication and encryption wrong, they are very subtly dependent on details and implementation of the padding check, admitting attacks such as POODLE and Lucky13. crypto/tls does not promise full countermeasures for Lucky13 and still contains some timing variations. This change fixes one of the easy ones: by checking the MAC, then the padding, rather than all at once, there is a very small timing variation between bad MAC and (good MAC, bad padding). The consequences depend on the effective padding value used in the MAC when the padding is bad. extractPadding simply uses the last byte's value, leaving the padding bytes effectively unchecked. This is the scenario in SSL 3.0 that led to POODLE. Specifically, the attacker can take an input record which uses 16 bytes of padding (a full block) and replace the final block with some interesting block. The MAC check will succeed with 1/256 probability due to the final byte being 16. This again means that after 256 queries, the attacker can decrypt one byte. To fix this, bitwise AND the two values so they may be checked with one branch. Additionally, zero the padding if the padding check failed, to make things more robust. Updates #27071 Change-Id: I332b14d215078928ffafe3cfeba1a68189f08db3 Reviewed-on: https://go-review.googlesource.com/c/go/+/170701 Reviewed-by: Filippo Valsorda Run-TryBot: Filippo Valsorda TryBot-Result: Gobot Gobot --- src/crypto/tls/conn.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/crypto/tls/conn.go b/src/crypto/tls/conn.go index f61d43203f..0c7952f7b8 100644 --- a/src/crypto/tls/conn.go +++ b/src/crypto/tls/conn.go @@ -274,6 +274,17 @@ func extractPadding(payload []byte) (toRemove int, good byte) { good &= good << 1 good = uint8(int8(good) >> 7) + // Zero the padding length on error. This ensures any unchecked bytes + // are included in the MAC. Otherwise, an attacker that could + // distinguish MAC failures from padding failures could mount an attack + // similar to POODLE in SSL 3.0: given a good ciphertext that uses a + // full block's worth of padding, replace the final block with another + // block. If the MAC check passed but the padding check failed, the + // last byte of that block decrypted to the block size. + // + // See also macAndPaddingGood logic below. + paddingLen &= good + toRemove = int(paddingLen) + 1 return } @@ -416,7 +427,15 @@ func (hc *halfConn) decrypt(record []byte) ([]byte, recordType, error) { remoteMAC := payload[n : n+macSize] localMAC := hc.mac.MAC(hc.seq[0:], record[:recordHeaderLen], payload[:n], payload[n+macSize:]) - if subtle.ConstantTimeCompare(localMAC, remoteMAC) != 1 || paddingGood != 255 { + // This is equivalent to checking the MACs and paddingGood + // separately, but in constant-time to prevent distinguishing + // padding failures from MAC failures. Depending on what value + // of paddingLen was returned on bad padding, distinguishing + // bad MAC from bad padding can lead to an attack. + // + // See also the logic at the end of extractPadding. + macAndPaddingGood := subtle.ConstantTimeCompare(localMAC, remoteMAC) & int(paddingGood) + if macAndPaddingGood != 1 { return nil, 0, alertBadRecordMAC } -- GitLab From 33e5da48d5d22a722f2363b15e2d53061fb71cf4 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 16 Apr 2019 15:52:05 -0700 Subject: [PATCH 0841/1679] internal/poll: avoid unnecessary memory allocation in Writev Writev was allocating a new []syscall.Iovec every call, rather than reusing the cached copy available at *fd.iovec. Fixes #26663. Change-Id: I5967b0d82dc671ce0eaf4ec36cc2a0e46eadde02 Reviewed-on: https://go-review.googlesource.com/c/go/+/172419 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/internal/poll/writev.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/internal/poll/writev.go b/src/internal/poll/writev.go index 04e3522d8a..a48a38be08 100644 --- a/src/internal/poll/writev.go +++ b/src/internal/poll/writev.go @@ -51,7 +51,10 @@ func (fd *FD) Writev(v *[][]byte) (int64, error) { if len(iovecs) == 0 { break } - fd.iovecs = &iovecs // cache + if fd.iovecs == nil { + fd.iovecs = new([]syscall.Iovec) + } + *fd.iovecs = iovecs // cache var wrote uintptr wrote, err = writev(fd.Sysfd, iovecs) -- GitLab From dbc17037815bdce5df3f355f2171c57804f7870e Mon Sep 17 00:00:00 2001 From: jfbus Date: Tue, 26 Mar 2019 18:21:53 +0000 Subject: [PATCH 0842/1679] net: support single-request resolv.conf option in pure Go resolver There is a DNS resolution issue in Kubernetes (UDP response packets get dropped due to a race in conntrack between the parallel A and AAAA queries, causing timeouts in DNS queries). A workaround is to enable single-request / single-request-reopen in resolv.conf in order to use sequential A and AAAA queries instead of parallel queries. With this PR, the pure Go resolver searches for "single-request" and "single-request-reopen" in resolv.conf and send A and AAAA queries sequentially when found. Fixes #29644 Change-Id: I906b3484008c1b9adf2e3e9241ea23767e29df59 GitHub-Last-Rev: d481acfb4c49d82fd474078b31a1a4697b57dadf GitHub-Pull-Request: golang/go#29661 Reviewed-on: https://go-review.googlesource.com/c/go/+/157377 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/dnsclient_unix.go | 58 ++++++++++----- src/net/dnsclient_unix_test.go | 74 +++++++++++++++++++ src/net/dnsconfig_unix.go | 30 +++++--- src/net/dnsconfig_unix_test.go | 22 ++++++ .../single-request-reopen-resolv.conf | 1 + src/net/testdata/single-request-resolv.conf | 1 + 6 files changed, 155 insertions(+), 31 deletions(-) create mode 100644 src/net/testdata/single-request-reopen-resolv.conf create mode 100644 src/net/testdata/single-request-resolv.conf diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 5472494356..4e7462b66f 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -569,34 +569,52 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order resolvConf.mu.RLock() conf := resolvConf.dnsConfig resolvConf.mu.RUnlock() - type racer struct { + type result struct { p dnsmessage.Parser server string error } - lane := make(chan racer, 1) + lane := make(chan result, 1) qtypes := [...]dnsmessage.Type{dnsmessage.TypeA, dnsmessage.TypeAAAA} - var lastErr error - for _, fqdn := range conf.nameList(name) { - for _, qtype := range qtypes { + var queryFn func(fqdn string, qtype dnsmessage.Type) + var responseFn func(fqdn string, qtype dnsmessage.Type) result + if conf.singleRequest { + queryFn = func(fqdn string, qtype dnsmessage.Type) {} + responseFn = func(fqdn string, qtype dnsmessage.Type) result { + dnsWaitGroup.Add(1) + defer dnsWaitGroup.Done() + p, server, err := r.tryOneName(ctx, conf, fqdn, qtype) + return result{p, server, err} + } + } else { + queryFn = func(fqdn string, qtype dnsmessage.Type) { dnsWaitGroup.Add(1) go func(qtype dnsmessage.Type) { p, server, err := r.tryOneName(ctx, conf, fqdn, qtype) - lane <- racer{p, server, err} + lane <- result{p, server, err} dnsWaitGroup.Done() }(qtype) } + responseFn = func(fqdn string, qtype dnsmessage.Type) result { + return <-lane + } + } + var lastErr error + for _, fqdn := range conf.nameList(name) { + for _, qtype := range qtypes { + queryFn(fqdn, qtype) + } hitStrictError := false - for range qtypes { - racer := <-lane - if racer.error != nil { - if nerr, ok := racer.error.(Error); ok && nerr.Temporary() && r.strictErrors() { + for _, qtype := range qtypes { + result := responseFn(fqdn, qtype) + if result.error != nil { + if nerr, ok := result.error.(Error); ok && nerr.Temporary() && r.strictErrors() { // This error will abort the nameList loop. hitStrictError = true - lastErr = racer.error + lastErr = result.error } else if lastErr == nil || fqdn == name+"." { // Prefer error for original name. - lastErr = racer.error + lastErr = result.error } continue } @@ -618,12 +636,12 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order loop: for { - h, err := racer.p.AnswerHeader() + h, err := result.p.AnswerHeader() if err != nil && err != dnsmessage.ErrSectionDone { lastErr = &DNSError{ Err: "cannot marshal DNS message", Name: name, - Server: racer.server, + Server: result.server, } } if err != nil { @@ -631,35 +649,35 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order } switch h.Type { case dnsmessage.TypeA: - a, err := racer.p.AResource() + a, err := result.p.AResource() if err != nil { lastErr = &DNSError{ Err: "cannot marshal DNS message", Name: name, - Server: racer.server, + Server: result.server, } break loop } addrs = append(addrs, IPAddr{IP: IP(a.A[:])}) case dnsmessage.TypeAAAA: - aaaa, err := racer.p.AAAAResource() + aaaa, err := result.p.AAAAResource() if err != nil { lastErr = &DNSError{ Err: "cannot marshal DNS message", Name: name, - Server: racer.server, + Server: result.server, } break loop } addrs = append(addrs, IPAddr{IP: IP(aaaa.AAAA[:])}) default: - if err := racer.p.SkipAnswer(); err != nil { + if err := result.p.SkipAnswer(); err != nil { lastErr = &DNSError{ Err: "cannot marshal DNS message", Name: name, - Server: racer.server, + Server: result.server, } break loop } diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 810f400f0b..51d54a4cca 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -17,6 +17,7 @@ import ( "reflect" "strings" "sync" + "sync/atomic" "testing" "time" @@ -1621,3 +1622,76 @@ func TestTXTRecordTwoStrings(t *testing.T) { t.Errorf("txt[1], got %q, want %q", txt[1], want) } } + +// Issue 29644: support single-request resolv.conf option in pure Go resolver. +// The A and AAAA queries will be sent sequentially, not in parallel. +func TestSingleRequestLookup(t *testing.T) { + defer dnsWaitGroup.Wait() + var ( + firstcalled int32 + ipv4 int32 = 1 + ipv6 int32 = 2 + ) + fake := fakeDNSServer{rh: func(n, s string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) { + r := dnsmessage.Message{ + Header: dnsmessage.Header{ + ID: q.ID, + Response: true, + }, + Questions: q.Questions, + } + for _, question := range q.Questions { + switch question.Type { + case dnsmessage.TypeA: + if question.Name.String() == "slowipv4.example.net." { + time.Sleep(10 * time.Millisecond) + } + if !atomic.CompareAndSwapInt32(&firstcalled, 0, ipv4) { + t.Errorf("the A query was received after the AAAA query !") + } + r.Answers = append(r.Answers, dnsmessage.Resource{ + Header: dnsmessage.ResourceHeader{ + Name: q.Questions[0].Name, + Type: dnsmessage.TypeA, + Class: dnsmessage.ClassINET, + Length: 4, + }, + Body: &dnsmessage.AResource{ + A: TestAddr, + }, + }) + case dnsmessage.TypeAAAA: + atomic.CompareAndSwapInt32(&firstcalled, 0, ipv6) + r.Answers = append(r.Answers, dnsmessage.Resource{ + Header: dnsmessage.ResourceHeader{ + Name: q.Questions[0].Name, + Type: dnsmessage.TypeAAAA, + Class: dnsmessage.ClassINET, + Length: 16, + }, + Body: &dnsmessage.AAAAResource{ + AAAA: TestAddr6, + }, + }) + } + } + return r, nil + }} + r := Resolver{PreferGo: true, Dial: fake.DialContext} + + conf, err := newResolvConfTest() + if err != nil { + t.Fatal(err) + } + defer conf.teardown() + if err := conf.writeAndUpdate([]string{"options single-request"}); err != nil { + t.Fatal(err) + } + for _, name := range []string{"hostname.example.net", "slowipv4.example.net"} { + firstcalled = 0 + _, err := r.LookupIPAddr(context.Background(), name) + if err != nil { + t.Error(err) + } + } +} diff --git a/src/net/dnsconfig_unix.go b/src/net/dnsconfig_unix.go index 842d408e56..3ca8d71f5f 100644 --- a/src/net/dnsconfig_unix.go +++ b/src/net/dnsconfig_unix.go @@ -21,17 +21,18 @@ var ( ) type dnsConfig struct { - servers []string // server addresses (in host:port form) to use - search []string // rooted suffixes to append to local name - ndots int // number of dots in name to trigger absolute lookup - timeout time.Duration // wait before giving up on a query, including retries - attempts int // lost packets before giving up on server - rotate bool // round robin among servers - unknownOpt bool // anything unknown was encountered - lookup []string // OpenBSD top-level database "lookup" order - err error // any error that occurs during open of resolv.conf - mtime time.Time // time of resolv.conf modification - soffset uint32 // used by serverOffset + servers []string // server addresses (in host:port form) to use + search []string // rooted suffixes to append to local name + ndots int // number of dots in name to trigger absolute lookup + timeout time.Duration // wait before giving up on a query, including retries + attempts int // lost packets before giving up on server + rotate bool // round robin among servers + unknownOpt bool // anything unknown was encountered + lookup []string // OpenBSD top-level database "lookup" order + err error // any error that occurs during open of resolv.conf + mtime time.Time // time of resolv.conf modification + soffset uint32 // used by serverOffset + singleRequest bool // use sequential A and AAAA queries instead of parallel queries } // See resolv.conf(5) on a Linux machine. @@ -115,6 +116,13 @@ func dnsReadConfig(filename string) *dnsConfig { conf.attempts = n case s == "rotate": conf.rotate = true + case s == "single-request" || s == "single-request-reopen": + // Linux option: + // http://man7.org/linux/man-pages/man5/resolv.conf.5.html + // "By default, glibc performs IPv4 and IPv6 lookups in parallel [...] + // This option disables the behavior and makes glibc + // perform the IPv6 and IPv4 requests sequentially." + conf.singleRequest = true default: conf.unknownOpt = true } diff --git a/src/net/dnsconfig_unix_test.go b/src/net/dnsconfig_unix_test.go index 0797559d1a..f16f90ad50 100644 --- a/src/net/dnsconfig_unix_test.go +++ b/src/net/dnsconfig_unix_test.go @@ -102,6 +102,28 @@ var dnsReadConfigTests = []struct { search: []string{"c.symbolic-datum-552.internal."}, }, }, + { + name: "testdata/single-request-resolv.conf", + want: &dnsConfig{ + servers: defaultNS, + ndots: 1, + singleRequest: true, + timeout: 5 * time.Second, + attempts: 2, + search: []string{"domain.local."}, + }, + }, + { + name: "testdata/single-request-reopen-resolv.conf", + want: &dnsConfig{ + servers: defaultNS, + ndots: 1, + singleRequest: true, + timeout: 5 * time.Second, + attempts: 2, + search: []string{"domain.local."}, + }, + }, } func TestDNSReadConfig(t *testing.T) { diff --git a/src/net/testdata/single-request-reopen-resolv.conf b/src/net/testdata/single-request-reopen-resolv.conf new file mode 100644 index 0000000000..9bddeb3844 --- /dev/null +++ b/src/net/testdata/single-request-reopen-resolv.conf @@ -0,0 +1 @@ +options single-request-reopen \ No newline at end of file diff --git a/src/net/testdata/single-request-resolv.conf b/src/net/testdata/single-request-resolv.conf new file mode 100644 index 0000000000..5595d29a66 --- /dev/null +++ b/src/net/testdata/single-request-resolv.conf @@ -0,0 +1 @@ +options single-request \ No newline at end of file -- GitLab From 755b50952c9571202322bf63a42254ea8ea5655c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Wed, 17 Apr 2019 08:32:33 -0400 Subject: [PATCH 0843/1679] cmd/compile/internal/ssa: skip TestNexting/gdb-dbg-i22558 This test fails frequently in the longtest builder, and the failures on the build dashboard have masked two other regressions so far. Let's skip it until it can be fixed. Updates #31263 Change-Id: I82bae216ebc3c5fd395c27c72c196334a130af7d Reviewed-on: https://go-review.googlesource.com/c/go/+/172423 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick Reviewed-by: David Chase TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/ssa/debug_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cmd/compile/internal/ssa/debug_test.go b/src/cmd/compile/internal/ssa/debug_test.go index 8db2f8ef41..091086f3b9 100644 --- a/src/cmd/compile/internal/ssa/debug_test.go +++ b/src/cmd/compile/internal/ssa/debug_test.go @@ -165,6 +165,9 @@ func TestNexting(t *testing.T) { // then runs the debugger on the resulting binary, with any comment-specified actions matching tag triggered. func subTest(t *testing.T, tag string, basename string, gcflags string, moreargs ...string) { t.Run(tag+"-"+basename, func(t *testing.T) { + if t.Name() == "TestNexting/gdb-dbg-i22558" { + testenv.SkipFlaky(t, 31263) + } testNexting(t, basename, tag, gcflags, 1000, moreargs...) }) } -- GitLab From 52d9ce89ef71d95a4ce5f1a92155bb0c0b811957 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 16 Apr 2019 16:32:26 -0700 Subject: [PATCH 0844/1679] test: add escape regress tests for runtime and sync atomics There weren't any tests to make sure these work correctly, and this led to escape analysis regressions in both linux/s390x and js/wasm. The underlying issue that cmd/compile is only getting some of these correct because escape analysis doesn't understand //go:linkname is still present, but at least this addresses the fragility aspect. Updates #15283. Change-Id: I546aee1899d098b2e3de45e9b33c3ca22de485f8 Reviewed-on: https://go-review.googlesource.com/c/go/+/172420 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- test/escape_runtime_atomic.go | 33 ++++++++++++++++++++++++++++++ test/escape_sync_atomic.go | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 test/escape_runtime_atomic.go create mode 100644 test/escape_sync_atomic.go diff --git a/test/escape_runtime_atomic.go b/test/escape_runtime_atomic.go new file mode 100644 index 0000000000..6dfd4aa211 --- /dev/null +++ b/test/escape_runtime_atomic.go @@ -0,0 +1,33 @@ +// errorcheck -0 -m -l + +// Copyright 2019 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. + +// Test escape analysis for runtime/internal/atomic. + +package escape + +import ( + "runtime/internal/atomic" + "unsafe" +) + +// BAD: should be "leaking param content". +func Loadp(addr unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr" + return atomic.Loadp(addr) +} + +var ptr unsafe.Pointer + +func Storep() { + var x int // ERROR "moved to heap: x" + atomic.StorepNoWB(unsafe.Pointer(&ptr), unsafe.Pointer(&x)) +} + +func Casp1() { + // BAD: x doesn't need to be heap allocated + var x int // ERROR "moved to heap: x" + var y int // ERROR "moved to heap: y" + atomic.Casp1(&ptr, unsafe.Pointer(&x), unsafe.Pointer(&y)) +} diff --git a/test/escape_sync_atomic.go b/test/escape_sync_atomic.go new file mode 100644 index 0000000000..8da71a0ccf --- /dev/null +++ b/test/escape_sync_atomic.go @@ -0,0 +1,38 @@ +// errorcheck -0 -m -l + +// Copyright 2019 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. + +// Test escape analysis for sync/atomic. + +package escape + +import ( + "sync/atomic" + "unsafe" +) + +// BAD: should be "leaking param content". +func LoadPointer(addr *unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr" + return atomic.LoadPointer(addr) +} + +var ptr unsafe.Pointer + +func StorePointer() { + var x int // ERROR "moved to heap: x" + atomic.StorePointer(&ptr, unsafe.Pointer(&x)) +} + +func SwapPointer() { + var x int // ERROR "moved to heap: x" + atomic.SwapPointer(&ptr, unsafe.Pointer(&x)) +} + +func CompareAndSwapPointer() { + // BAD: x doesn't need to be heap allocated + var x int // ERROR "moved to heap: x" + var y int // ERROR "moved to heap: y" + atomic.CompareAndSwapPointer(&ptr, unsafe.Pointer(&x), unsafe.Pointer(&y)) +} -- GitLab From ff3ae455d9f0965fcd0857c855b3ac4ea866920e Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Tue, 16 Apr 2019 17:30:35 -0700 Subject: [PATCH 0845/1679] test: add regress test cases for self-assignment Cherry pointed out this case in review for CL 136496. That CL was slightly too aggressive, and I likely would have made the same mistake if I tried it myself. Updates #27772. Change-Id: I1fafabb9f8d9aba0494aa71333a4e17cf1bac5c8 Reviewed-on: https://go-review.googlesource.com/c/go/+/172421 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- test/escape_selfassign.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 test/escape_selfassign.go diff --git a/test/escape_selfassign.go b/test/escape_selfassign.go new file mode 100644 index 0000000000..b4fa2084df --- /dev/null +++ b/test/escape_selfassign.go @@ -0,0 +1,32 @@ +// errorcheck -0 -m -l + +// Copyright 2019 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. + +// Test escape analysis for self assignments. + +package escape + +type S struct { + i int + pi *int +} + +var sink S + +func f(p *S) { // ERROR "leaking param: p" + p.pi = &p.i + sink = *p +} + +// BAD: "leaking param: p" is too conservative +func g(p *S) { // ERROR "leaking param: p" + p.pi = &p.i +} + +func h() { + var s S // ERROR "moved to heap: s" + g(&s) + sink = s +} -- GitLab From f85d0e32e5cd462c4617d0189ad858d5a775424c Mon Sep 17 00:00:00 2001 From: Michael Fraenkel Date: Tue, 16 Apr 2019 20:45:41 -0400 Subject: [PATCH 0846/1679] test: add escape regress for empty variadic function Fixes #30898 Change-Id: I903dd8ed2b10c49b2291ad0858774f3ca2f5b223 Reviewed-on: https://go-review.googlesource.com/c/go/+/172422 Reviewed-by: Matthew Dempsky Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot --- test/fixedbugs/issue30898.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 test/fixedbugs/issue30898.go diff --git a/test/fixedbugs/issue30898.go b/test/fixedbugs/issue30898.go new file mode 100644 index 0000000000..012d5a2634 --- /dev/null +++ b/test/fixedbugs/issue30898.go @@ -0,0 +1,19 @@ +// errorcheck -0 -m + +// Copyright 2019 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. + +// Test escape analysis for functions with variadic arguments + +package foo + +func debugf(format string, args ...interface{}) { // ERROR "can inline debugf" "format does not escape" "args does not escape" + // Dummy implementation for non-debug build. + // A non-empty implementation would be enabled with a build tag. +} + +func bar() { // ERROR "can inline bar" + value := 10 + debugf("value is %d", value) // ERROR "inlining call to debugf" "value does not escape" "\[\]interface {} literal does not escape" +} -- GitLab From e5986209e082cd207989d7f8759ba92e3f9dd8cb Mon Sep 17 00:00:00 2001 From: Baokun Lee Date: Tue, 29 Jan 2019 15:34:26 +0800 Subject: [PATCH 0847/1679] cmd/go: Remove old mod helper prints in Go 1.12. Change-Id: I43d233739ce6a6fbc4ee281b569d6230dd552cb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/160057 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/main.go | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index e529e96986..35a507680f 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -133,37 +133,6 @@ func main() { os.Exit(2) } - // TODO(rsc): Remove all these helper prints in Go 1.12. - switch args[0] { - case "mod": - if len(args) >= 2 { - flag := args[1] - if strings.HasPrefix(flag, "--") { - flag = flag[1:] - } - if i := strings.Index(flag, "="); i >= 0 { - flag = flag[:i] - } - switch flag { - case "-sync", "-fix": - fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod tidy\n", flag) - os.Exit(2) - case "-init", "-graph", "-vendor", "-verify": - fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod %s\n", flag, flag[1:]) - os.Exit(2) - case "-fmt", "-json", "-module", "-require", "-droprequire", "-replace", "-dropreplace", "-exclude", "-dropexclude": - fmt.Fprintf(os.Stderr, "go: go mod %s is now go mod edit %s\n", flag, flag) - os.Exit(2) - } - } - case "vendor": - fmt.Fprintf(os.Stderr, "go: vgo vendor is now go mod vendor\n") - os.Exit(2) - case "verify": - fmt.Fprintf(os.Stderr, "go: vgo verify is now go mod verify\n") - os.Exit(2) - } - // Set environment (GOOS, GOARCH, etc) explicitly. // In theory all the commands we invoke should have // the same default computation of these as we do, -- GitLab From 9dce58d30d1005e0cbac40789429cd3543d80836 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 17 Apr 2019 11:23:53 -0700 Subject: [PATCH 0848/1679] runtime/internal/atomic: remove bad go:noescape annotations on Loadp The //go:noescape directive says that arguments don't leak at all, which is too aggressive of a claim for functions that return pointers derived from their parameters. Remove the directive for now. Long term fix will require a new directive that allows more fine-grained control over escape analysis information supplied for functions implemented in assembly. Also, update the BAD comments in the test cases for Loadp: we really want that *ptr leaks to the result parameter, not that *ptr leaks to the heap. Updates #31525. Change-Id: Ibfa61f2b70daa7ed3223056b57eeee777eef2e31 Reviewed-on: https://go-review.googlesource.com/c/go/+/172578 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/internal/atomic/atomic_arm.go | 2 +- src/runtime/internal/atomic/atomic_arm64.go | 2 +- src/runtime/internal/atomic/atomic_mips64x.go | 2 +- src/runtime/internal/atomic/atomic_mipsx.go | 2 +- src/runtime/internal/atomic/atomic_ppc64x.go | 2 +- test/escape_runtime_atomic.go | 4 ++-- test/escape_sync_atomic.go | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/runtime/internal/atomic/atomic_arm.go b/src/runtime/internal/atomic/atomic_arm.go index 51b42ba238..abedee0e35 100644 --- a/src/runtime/internal/atomic/atomic_arm.go +++ b/src/runtime/internal/atomic/atomic_arm.go @@ -181,7 +181,7 @@ func armcas(ptr *uint32, old, new uint32) bool //go:noescape func Load(addr *uint32) uint32 -//go:noescape +// NO go:noescape annotation; *addr escapes if result escapes (#31525) func Loadp(addr unsafe.Pointer) unsafe.Pointer //go:noescape diff --git a/src/runtime/internal/atomic/atomic_arm64.go b/src/runtime/internal/atomic/atomic_arm64.go index a2da27e7ed..8e83cc6f53 100644 --- a/src/runtime/internal/atomic/atomic_arm64.go +++ b/src/runtime/internal/atomic/atomic_arm64.go @@ -32,7 +32,7 @@ func Load(ptr *uint32) uint32 //go:noescape func Load64(ptr *uint64) uint64 -//go:noescape +// NO go:noescape annotation; *ptr escapes if result escapes (#31525) func Loadp(ptr unsafe.Pointer) unsafe.Pointer //go:noescape diff --git a/src/runtime/internal/atomic/atomic_mips64x.go b/src/runtime/internal/atomic/atomic_mips64x.go index 98a8fca929..ca2e509266 100644 --- a/src/runtime/internal/atomic/atomic_mips64x.go +++ b/src/runtime/internal/atomic/atomic_mips64x.go @@ -32,7 +32,7 @@ func Load(ptr *uint32) uint32 //go:noescape func Load64(ptr *uint64) uint64 -//go:noescape +// NO go:noescape annotation; *ptr escapes if result escapes (#31525) func Loadp(ptr unsafe.Pointer) unsafe.Pointer //go:noescape diff --git a/src/runtime/internal/atomic/atomic_mipsx.go b/src/runtime/internal/atomic/atomic_mipsx.go index 1cd6d9a9ce..79eb582232 100644 --- a/src/runtime/internal/atomic/atomic_mipsx.go +++ b/src/runtime/internal/atomic/atomic_mipsx.go @@ -116,7 +116,7 @@ func Xchguintptr(ptr *uintptr, new uintptr) uintptr //go:noescape func Load(ptr *uint32) uint32 -//go:noescape +// NO go:noescape annotation; *ptr escapes if result escapes (#31525) func Loadp(ptr unsafe.Pointer) unsafe.Pointer //go:noescape diff --git a/src/runtime/internal/atomic/atomic_ppc64x.go b/src/runtime/internal/atomic/atomic_ppc64x.go index 4f1a95c5bd..0e9a51f6a1 100644 --- a/src/runtime/internal/atomic/atomic_ppc64x.go +++ b/src/runtime/internal/atomic/atomic_ppc64x.go @@ -32,7 +32,7 @@ func Load(ptr *uint32) uint32 //go:noescape func Load64(ptr *uint64) uint64 -//go:noescape +// NO go:noescape annotation; *ptr escapes if result escapes (#31525) func Loadp(ptr unsafe.Pointer) unsafe.Pointer //go:noescape diff --git a/test/escape_runtime_atomic.go b/test/escape_runtime_atomic.go index 6dfd4aa211..efe2013fb9 100644 --- a/test/escape_runtime_atomic.go +++ b/test/escape_runtime_atomic.go @@ -13,8 +13,8 @@ import ( "unsafe" ) -// BAD: should be "leaking param content". -func Loadp(addr unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr" +// BAD: should always be "leaking param: addr to result ~r1 level=1$". +func Loadp(addr unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr( to result ~r1 level=1)?$" return atomic.Loadp(addr) } diff --git a/test/escape_sync_atomic.go b/test/escape_sync_atomic.go index 8da71a0ccf..e509b37511 100644 --- a/test/escape_sync_atomic.go +++ b/test/escape_sync_atomic.go @@ -13,8 +13,8 @@ import ( "unsafe" ) -// BAD: should be "leaking param content". -func LoadPointer(addr *unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr" +// BAD: should be "leaking param: addr to result ~r1 level=1$". +func LoadPointer(addr *unsafe.Pointer) unsafe.Pointer { // ERROR "leaking param: addr$" return atomic.LoadPointer(addr) } -- GitLab From e92853523d11d1e50d89a3c017c5d902aed0596a Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 17 Apr 2019 11:37:54 -0700 Subject: [PATCH 0849/1679] cmd/compile: use named fields in nodl We use a struct to allocate two structs simultaneously. Because we embed structs rather than using named fields, the compiler generates forwarding method stubs for the anonymous type. In theory, the compiler could detect that these stubs are unnecessary: The value in question has a very limited scope, the methods are not called, and there are operations where an interface would need to be satisfied. This compiler optimization is unlikely to happen, though; the ROI is likely to be low. Instead, just give the fields names. Cuts 64k off the cmd/compile binary. Change-Id: Id10ec69c23cd2dd33306f4c1bc75724e3c571b56 Reviewed-on: https://go-review.googlesource.com/c/go/+/172579 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/subr.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 156e3c2c94..5e74bee031 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -306,20 +306,20 @@ func nodl(pos src.XPos, op Op, nleft, nright *Node) *Node { switch op { case OCLOSURE, ODCLFUNC: var x struct { - Node - Func + n Node + f Func } - n = &x.Node - n.Func = &x.Func + n = &x.n + n.Func = &x.f case ONAME: Fatalf("use newname instead") case OLABEL, OPACK: var x struct { - Node - Name + n Node + m Name } - n = &x.Node - n.Name = &x.Name + n = &x.n + n.Name = &x.m default: n = new(Node) } -- GitLab From b5946ed48d75332ba95962a181a28bb6b203459f Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 17 Apr 2019 15:40:46 -0700 Subject: [PATCH 0850/1679] test: fix escape_runtime_atomic.go Casp1 is implemented in Go on js/wasm, so escape analysis correctly determines that the "old" parameter does not escape (which is good). Unfortunately, test/run.go doesn't have a way to indicate that ERROR messages are optional, and cmd/compile only emits diagnostics for "var x int" when it's moved to the heap; not when it stays on the stack. To accomodate that this test currently passes on some GOARCHes but not others, rewrite the Casp1 test to use "x := new(int)" and allow both "new(int) escapes to heap" or "new(int) does not escape". Updates #31525. Change-Id: I40150a7ff9042f184386ccdb2d4d428f63e8ba4f Reviewed-on: https://go-review.googlesource.com/c/go/+/172602 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- test/escape_runtime_atomic.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/escape_runtime_atomic.go b/test/escape_runtime_atomic.go index efe2013fb9..62e8fede27 100644 --- a/test/escape_runtime_atomic.go +++ b/test/escape_runtime_atomic.go @@ -26,8 +26,8 @@ func Storep() { } func Casp1() { - // BAD: x doesn't need to be heap allocated - var x int // ERROR "moved to heap: x" - var y int // ERROR "moved to heap: y" - atomic.Casp1(&ptr, unsafe.Pointer(&x), unsafe.Pointer(&y)) + // BAD: should always be "does not escape" + x := new(int) // ERROR "escapes to heap|does not escape" + var y int // ERROR "moved to heap: y" + atomic.Casp1(&ptr, unsafe.Pointer(x), unsafe.Pointer(&y)) } -- GitLab From 3b37ff453edd9664045e656d1c02e63703517399 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Tue, 16 Apr 2019 02:49:09 +0000 Subject: [PATCH 0851/1679] cmd/link: increase the reserved space for ELF relocations Currently the offset values of ELF relocations and Macho relocations are 256 and 512 respectively, which means that the space reserved for ELF relocations is only 256. But AARCH64 has more than 256 ELF relocation types, in fact the maximum AARCH64 ELF relocation type recorded in file src/debug/elf/elf.go is 1032 currently. So this CL increases the offset of Macho relocations to 2048 to leave enough space for AARCH64 ELF relocations. Change-Id: I784ac38aeb3e102ac7825f6d621086849c8d3146 Reviewed-on: https://go-review.googlesource.com/c/go/+/172497 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/internal/objabi/util.go | 5 ++ src/cmd/link/internal/amd64/asm.go | 40 ++++++------- src/cmd/link/internal/arm/asm.go | 26 ++++----- src/cmd/link/internal/ld/data.go | 4 +- src/cmd/link/internal/ld/pe.go | 2 +- src/cmd/link/internal/loadelf/ldelf.go | 2 +- src/cmd/link/internal/loadmacho/ldmacho.go | 4 +- src/cmd/link/internal/ppc64/asm.go | 30 +++++----- src/cmd/link/internal/s390x/asm.go | 66 +++++++++++----------- src/cmd/link/internal/sym/reloc.go | 8 +-- src/cmd/link/internal/x86/asm.go | 23 ++++---- 11 files changed, 109 insertions(+), 101 deletions(-) diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index e28447d141..57f19f2e3c 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -34,6 +34,11 @@ var ( Version = version ) +const ( + ElfRelocOffset = 256 + MachoRelocOffset = 2048 // reserve enough space for ELF relocations +) + func goarm() int { switch v := envOr("GOARM", defaultGOARM); v { case "5": diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index e922fe2db9..fca4877a45 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -103,13 +103,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { switch r.Type { default: - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) return false } // Handle relocations found in ELF object files. - case 256 + objabi.RelocType(elf.R_X86_64_PC32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PC32): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_X86_64_PC32 relocation for dynamic symbol %s", targ.Name) } @@ -122,7 +122,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += 4 return true - case 256 + objabi.RelocType(elf.R_X86_64_PC64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PC64): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_X86_64_PC64 relocation for dynamic symbol %s", targ.Name) } @@ -133,7 +133,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += 8 return true - case 256 + objabi.RelocType(elf.R_X86_64_PLT32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_PLT32): r.Type = objabi.R_PCREL r.Add += 4 if targ.Type == sym.SDYNIMPORT { @@ -144,7 +144,9 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_X86_64_GOTPCREL), 256 + objabi.RelocType(elf.R_X86_64_GOTPCRELX), 256 + objabi.RelocType(elf.R_X86_64_REX_GOTPCRELX): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_GOTPCREL), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_GOTPCRELX), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_REX_GOTPCRELX): if targ.Type != sym.SDYNIMPORT { // have symbol if r.Off >= 2 && s.P[r.Off-2] == 0x8b { @@ -167,7 +169,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += int64(targ.Got()) return true - case 256 + objabi.RelocType(elf.R_X86_64_64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_X86_64_64): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_X86_64_64 relocation for dynamic symbol %s", targ.Name) } @@ -175,9 +177,9 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true // Handle relocations found in Mach-O object files. - case 512 + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 0, - 512 + ld.MACHO_X86_64_RELOC_SIGNED*2 + 0, - 512 + ld.MACHO_X86_64_RELOC_BRANCH*2 + 0: + case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 0, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED*2 + 0, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 0: // TODO: What is the difference between all these? r.Type = objabi.R_ADDR @@ -186,7 +188,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } return true - case 512 + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1: + case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_BRANCH*2 + 1: if targ.Type == sym.SDYNIMPORT { addpltsym(ctxt, targ) r.Sym = ctxt.Syms.Lookup(".plt", 0) @@ -196,11 +198,11 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } fallthrough - case 512 + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 1, - 512 + ld.MACHO_X86_64_RELOC_SIGNED*2 + 1, - 512 + ld.MACHO_X86_64_RELOC_SIGNED_1*2 + 1, - 512 + ld.MACHO_X86_64_RELOC_SIGNED_2*2 + 1, - 512 + ld.MACHO_X86_64_RELOC_SIGNED_4*2 + 1: + case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_UNSIGNED*2 + 1, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED*2 + 1, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_1*2 + 1, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_2*2 + 1, + objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_SIGNED_4*2 + 1: r.Type = objabi.R_PCREL if targ.Type == sym.SDYNIMPORT { @@ -208,7 +210,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } return true - case 512 + ld.MACHO_X86_64_RELOC_GOT_LOAD*2 + 1: + case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_GOT_LOAD*2 + 1: if targ.Type != sym.SDYNIMPORT { // have symbol // turn MOVQ of GOT entry into LEAQ of symbol itself @@ -223,7 +225,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } fallthrough - case 512 + ld.MACHO_X86_64_RELOC_GOT*2 + 1: + case objabi.MachoRelocOffset + ld.MACHO_X86_64_RELOC_GOT*2 + 1: if targ.Type != sym.SDYNIMPORT { ld.Errorf(s, "unexpected GOT reloc for non-dynamic symbol %s", targ.Name) } @@ -333,7 +335,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_X86_64_32))) } rela.AddUint64(ctxt.Arch, uint64(r.Add)) - r.Type = 256 // ignore during relocsym + r.Type = objabi.ElfRelocOffset // ignore during relocsym return true } @@ -359,7 +361,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { s.Value = got.Size got.AddUint64(ctxt.Arch, 0) ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(targ.Dynid)) - r.Type = 256 // ignore during relocsym + r.Type = objabi.ElfRelocOffset // ignore during relocsym return true } } diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index efcd41d72b..7ea1fe5f8f 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -120,13 +120,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { switch r.Type { default: - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) return false } // Handle relocations found in ELF object files. - case 256 + objabi.RelocType(elf.R_ARM_PLT32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_PLT32): r.Type = objabi.R_CALLARM if targ.Type == sym.SDYNIMPORT { @@ -137,11 +137,11 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_ARM_THM_PC22): // R_ARM_THM_CALL + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_THM_PC22): // R_ARM_THM_CALL ld.Exitf("R_ARM_THM_CALL, are you using -marm?") return false - case 256 + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT32): // R_ARM_GOT_BREL if targ.Type != sym.SDYNIMPORT { addgotsyminternal(ctxt, targ) } else { @@ -153,7 +153,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += int64(targ.Got()) return true - case 256 + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOT_PREL): // GOT(nil) + A - nil if targ.Type != sym.SDYNIMPORT { addgotsyminternal(ctxt, targ) } else { @@ -165,19 +165,19 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += int64(targ.Got()) + 4 return true - case 256 + objabi.RelocType(elf.R_ARM_GOTOFF): // R_ARM_GOTOFF32 + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTOFF): // R_ARM_GOTOFF32 r.Type = objabi.R_GOTOFF return true - case 256 + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_GOTPC): // R_ARM_BASE_PREL r.Type = objabi.R_PCREL r.Sym = ctxt.Syms.Lookup(".got", 0) r.Add += 4 return true - case 256 + objabi.RelocType(elf.R_ARM_CALL): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_CALL): r.Type = objabi.R_CALLARM if targ.Type == sym.SDYNIMPORT { addpltsym(ctxt, targ) @@ -187,13 +187,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_ARM_REL32): // R_ARM_REL32 + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_REL32): // R_ARM_REL32 r.Type = objabi.R_PCREL r.Add += 4 return true - case 256 + objabi.RelocType(elf.R_ARM_ABS32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_ABS32): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_ARM_ABS32 relocation for dynamic symbol %s", targ.Name) } @@ -201,7 +201,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true // we can just ignore this, because we are targeting ARM V5+ anyway - case 256 + objabi.RelocType(elf.R_ARM_V4BX): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_V4BX): if r.Sym != nil { // R_ARM_V4BX is ABS relocation, so this symbol is a dummy symbol, ignore it r.Sym.Type = 0 @@ -210,8 +210,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Sym = nil return true - case 256 + objabi.RelocType(elf.R_ARM_PC24), - 256 + objabi.RelocType(elf.R_ARM_JUMP24): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_PC24), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_ARM_JUMP24): r.Type = objabi.R_CALLARM if targ.Type == sym.SDYNIMPORT { addpltsym(ctxt, targ) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index b869eea278..cb74b9a723 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -162,7 +162,7 @@ func relocsym(ctxt *Link, s *sym.Symbol) { } } - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { continue } if r.Siz == 0 { // informational relocation - no work to do @@ -636,7 +636,7 @@ func dynrelocsym(ctxt *Link, s *sym.Symbol) { continue } - if r.Sym != nil && r.Sym.Type == sym.SDYNIMPORT || r.Type >= 256 { + if r.Sym != nil && r.Sym.Type == sym.SDYNIMPORT || r.Type >= objabi.ElfRelocOffset { if r.Sym != nil && !r.Sym.Attr.Reachable() { Errorf(s, "dynamic relocation to unreachable symbol %s", r.Sym.Name) } diff --git a/src/cmd/link/internal/ld/pe.go b/src/cmd/link/internal/ld/pe.go index 3d9cb4898d..ca29da4f01 100644 --- a/src/cmd/link/internal/ld/pe.go +++ b/src/cmd/link/internal/ld/pe.go @@ -1401,7 +1401,7 @@ func addPEBaseRelocSym(ctxt *Link, s *sym.Symbol, rt *peBaseRelocTable) { if !r.Sym.Attr.Reachable() { continue } - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { continue } if r.Siz == 0 { // informational relocation diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index 916b7cf9f2..a22a77bd47 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -923,7 +923,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i rp.Sym = elfsym.sym } - rp.Type = 256 + objabi.RelocType(info) + rp.Type = objabi.ElfRelocOffset + objabi.RelocType(info) rp.Siz, err = relSize(arch, pn, uint32(info)) if err != nil { return nil, 0, err diff --git a/src/cmd/link/internal/loadmacho/ldmacho.go b/src/cmd/link/internal/loadmacho/ldmacho.go index e2b0d63aa3..a8e41a94c7 100644 --- a/src/cmd/link/internal/loadmacho/ldmacho.go +++ b/src/cmd/link/internal/loadmacho/ldmacho.go @@ -771,7 +771,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i // handle reference to __IMPORT/__pointers. // how much worse can this get? // why are we supporting 386 on the mac anyway? - rp.Type = 512 + MACHO_FAKE_GOTPCREL + rp.Type = objabi.MachoRelocOffset + MACHO_FAKE_GOTPCREL // figure out which pointer this is a reference to. k = int(uint64(ks.res1) + (uint64(rel.value)-ks.addr)/4) @@ -805,7 +805,7 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i } rp.Siz = rel.length - rp.Type = 512 + (objabi.RelocType(rel.type_) << 1) + objabi.RelocType(rel.pcrel) + rp.Type = objabi.MachoRelocOffset + (objabi.RelocType(rel.type_) << 1) + objabi.RelocType(rel.pcrel) rp.Off = int32(rel.addr) // Handle X86_64_RELOC_SIGNED referencing a section (rel->extrn == 0). diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index a857694962..d376c4de58 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -95,7 +95,7 @@ func genplt(ctxt *ld.Link) { for _, s := range ctxt.Textp { for i := range s.R { r := &s.R[i] - if r.Type != 256+objabi.RelocType(elf.R_PPC64_REL24) || r.Sym.Type != sym.SDYNIMPORT { + if r.Type != objabi.ElfRelocOffset+objabi.RelocType(elf.R_PPC64_REL24) || r.Sym.Type != sym.SDYNIMPORT { continue } @@ -275,13 +275,13 @@ func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { switch r.Type { default: - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) return false } // Handle relocations found in ELF object files. - case 256 + objabi.RelocType(elf.R_PPC64_REL24): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL24): r.Type = objabi.R_CALLPOWER // This is a local call, so the caller isn't setting @@ -298,7 +298,7 @@ func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_PPC_REL32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC_REL32): r.Type = objabi.R_PCREL r.Add += 4 @@ -308,7 +308,7 @@ func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_PPC64_ADDR64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_ADDR64): r.Type = objabi.R_ADDR if targ.Type == sym.SDYNIMPORT { // These happen in .toc sections @@ -318,54 +318,54 @@ func addelfdynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { rela.AddAddrPlus(ctxt.Arch, s, int64(r.Off)) rela.AddUint64(ctxt.Arch, ld.ELF64_R_INFO(uint32(targ.Dynid), uint32(elf.R_PPC64_ADDR64))) rela.AddUint64(ctxt.Arch, uint64(r.Add)) - r.Type = 256 // ignore during relocsym + r.Type = objabi.ElfRelocOffset // ignore during relocsym } return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_LO | sym.RV_CHECK_OVERFLOW return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16_LO): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_LO): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_LO return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16_HA): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_HA): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16_HI): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_HI): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16_DS): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_DS): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_DS | sym.RV_CHECK_OVERFLOW return true - case 256 + objabi.RelocType(elf.R_PPC64_TOC16_LO_DS): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_TOC16_LO_DS): r.Type = objabi.R_POWER_TOC r.Variant = sym.RV_POWER_DS return true - case 256 + objabi.RelocType(elf.R_PPC64_REL16_LO): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_LO): r.Type = objabi.R_PCREL r.Variant = sym.RV_POWER_LO r.Add += 2 // Compensate for relocation size of 2 return true - case 256 + objabi.RelocType(elf.R_PPC64_REL16_HI): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_HI): r.Type = objabi.R_PCREL r.Variant = sym.RV_POWER_HI | sym.RV_CHECK_OVERFLOW r.Add += 2 return true - case 256 + objabi.RelocType(elf.R_PPC64_REL16_HA): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_PPC64_REL16_HA): r.Type = objabi.R_PCREL r.Variant = sym.RV_POWER_HA | sym.RV_CHECK_OVERFLOW r.Add += 2 diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 88199f3a56..46a6ffef82 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -107,30 +107,30 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { switch r.Type { default: - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { ld.Errorf(s, "unexpected relocation type %d", r.Type) return false } // Handle relocations found in ELF object files. - case 256 + objabi.RelocType(elf.R_390_12), - 256 + objabi.RelocType(elf.R_390_GOT12): - ld.Errorf(s, "s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_12), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT12): + ld.Errorf(s, "s390x 12-bit relocations have not been implemented (relocation type %d)", r.Type-objabi.ElfRelocOffset) return false - case 256 + objabi.RelocType(elf.R_390_8), - 256 + objabi.RelocType(elf.R_390_16), - 256 + objabi.RelocType(elf.R_390_32), - 256 + objabi.RelocType(elf.R_390_64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_8), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_16), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_32), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_64): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_390_nn relocation for dynamic symbol %s", targ.Name) } r.Type = objabi.R_ADDR return true - case 256 + objabi.RelocType(elf.R_390_PC16), - 256 + objabi.RelocType(elf.R_390_PC32), - 256 + objabi.RelocType(elf.R_390_PC64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC16), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC32), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC64): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_390_PCnn relocation for dynamic symbol %s", targ.Name) } @@ -143,14 +143,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += int64(r.Siz) return true - case 256 + objabi.RelocType(elf.R_390_GOT16), - 256 + objabi.RelocType(elf.R_390_GOT32), - 256 + objabi.RelocType(elf.R_390_GOT64): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT16), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT32), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOT64): + ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) return true - case 256 + objabi.RelocType(elf.R_390_PLT16DBL), - 256 + objabi.RelocType(elf.R_390_PLT32DBL): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT16DBL), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT32DBL): r.Type = objabi.R_PCREL r.Variant = sym.RV_390_DBL r.Add += int64(r.Siz) @@ -161,8 +161,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } return true - case 256 + objabi.RelocType(elf.R_390_PLT32), - 256 + objabi.RelocType(elf.R_390_PLT64): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT32), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PLT64): r.Type = objabi.R_PCREL r.Add += int64(r.Siz) if targ.Type == sym.SDYNIMPORT { @@ -172,37 +172,37 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } return true - case 256 + objabi.RelocType(elf.R_390_COPY): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_COPY): + ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) return false - case 256 + objabi.RelocType(elf.R_390_GLOB_DAT): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GLOB_DAT): + ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) return false - case 256 + objabi.RelocType(elf.R_390_JMP_SLOT): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_JMP_SLOT): + ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) return false - case 256 + objabi.RelocType(elf.R_390_RELATIVE): - ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-256) + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_RELATIVE): + ld.Errorf(s, "unimplemented S390x relocation: %v", r.Type-objabi.ElfRelocOffset) return false - case 256 + objabi.RelocType(elf.R_390_GOTOFF): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTOFF): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_390_GOTOFF relocation for dynamic symbol %s", targ.Name) } r.Type = objabi.R_GOTOFF return true - case 256 + objabi.RelocType(elf.R_390_GOTPC): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPC): r.Type = objabi.R_PCREL r.Sym = ctxt.Syms.Lookup(".got", 0) r.Add += int64(r.Siz) return true - case 256 + objabi.RelocType(elf.R_390_PC16DBL), - 256 + objabi.RelocType(elf.R_390_PC32DBL): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC16DBL), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_PC32DBL): r.Type = objabi.R_PCREL r.Variant = sym.RV_390_DBL r.Add += int64(r.Siz) @@ -211,14 +211,14 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { } return true - case 256 + objabi.RelocType(elf.R_390_GOTPCDBL): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTPCDBL): r.Type = objabi.R_PCREL r.Variant = sym.RV_390_DBL r.Sym = ctxt.Syms.Lookup(".got", 0) r.Add += int64(r.Siz) return true - case 256 + objabi.RelocType(elf.R_390_GOTENT): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_390_GOTENT): addgotsym(ctxt, targ) r.Type = objabi.R_PCREL diff --git a/src/cmd/link/internal/sym/reloc.go b/src/cmd/link/internal/sym/reloc.go index da696d327b..9c862f109d 100644 --- a/src/cmd/link/internal/sym/reloc.go +++ b/src/cmd/link/internal/sym/reloc.go @@ -57,8 +57,8 @@ func RelocName(arch *sys.Arch, r objabi.RelocType) string { // Uncomment code when we include those in bootstrap code. switch { - case r >= 512: // Mach-O - // nr := (r - 512)>>1 + case r >= objabi.MachoRelocOffset: // Mach-O + // nr := (r - objabi.MachoRelocOffset)>>1 // switch ctxt.Arch.Family { // case sys.AMD64: // return macho.RelocTypeX86_64(nr).String() @@ -71,8 +71,8 @@ func RelocName(arch *sys.Arch, r objabi.RelocType) string { // default: // panic("unreachable") // } - case r >= 256: // ELF - nr := r - 256 + case r >= objabi.ElfRelocOffset: // ELF + nr := r - objabi.ElfRelocOffset switch arch.Family { case sys.AMD64: return elf.R_X86_64(nr).String() diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 1744ab4d99..9472f5516d 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -172,13 +172,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { switch r.Type { default: - if r.Type >= 256 { + if r.Type >= objabi.ElfRelocOffset { ld.Errorf(s, "unexpected relocation type %d (%s)", r.Type, sym.RelocName(ctxt.Arch, r.Type)) return false } // Handle relocations found in ELF object files. - case 256 + objabi.RelocType(elf.R_386_PC32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_PC32): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_386_PC32 relocation for dynamic symbol %s", targ.Name) } @@ -191,7 +191,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += 4 return true - case 256 + objabi.RelocType(elf.R_386_PLT32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_PLT32): r.Type = objabi.R_PCREL r.Add += 4 if targ.Type == sym.SDYNIMPORT { @@ -202,7 +202,8 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { return true - case 256 + objabi.RelocType(elf.R_386_GOT32), 256 + objabi.RelocType(elf.R_386_GOT32X): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOT32), + objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOT32X): if targ.Type != sym.SDYNIMPORT { // have symbol if r.Off >= 2 && s.P[r.Off-2] == 0x8b { @@ -233,31 +234,31 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Add += int64(targ.Got()) return true - case 256 + objabi.RelocType(elf.R_386_GOTOFF): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTOFF): r.Type = objabi.R_GOTOFF return true - case 256 + objabi.RelocType(elf.R_386_GOTPC): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_GOTPC): r.Type = objabi.R_PCREL r.Sym = ctxt.Syms.Lookup(".got", 0) r.Add += 4 return true - case 256 + objabi.RelocType(elf.R_386_32): + case objabi.ElfRelocOffset + objabi.RelocType(elf.R_386_32): if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected R_386_32 relocation for dynamic symbol %s", targ.Name) } r.Type = objabi.R_ADDR return true - case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0: + case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 0: r.Type = objabi.R_ADDR if targ.Type == sym.SDYNIMPORT { ld.Errorf(s, "unexpected reloc for dynamic symbol %s", targ.Name) } return true - case 512 + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1: + case objabi.MachoRelocOffset + ld.MACHO_GENERIC_RELOC_VANILLA*2 + 1: if targ.Type == sym.SDYNIMPORT { addpltsym(ctxt, targ) r.Sym = ctxt.Syms.Lookup(".plt", 0) @@ -269,7 +270,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { r.Type = objabi.R_PCREL return true - case 512 + ld.MACHO_FAKE_GOTPCREL: + case objabi.MachoRelocOffset + ld.MACHO_FAKE_GOTPCREL: if targ.Type != sym.SDYNIMPORT { // have symbol // turn MOVL of GOT entry into LEAL of symbol itself @@ -342,7 +343,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool { s.Value = got.Size got.AddUint32(ctxt.Arch, 0) ctxt.Syms.Lookup(".linkedit.got", 0).AddUint32(ctxt.Arch, uint32(targ.Dynid)) - r.Type = 256 // ignore during relocsym + r.Type = objabi.ElfRelocOffset // ignore during relocsym return true } } -- GitLab From 4312a18b8a1d7d35dcc45cdf4280260c3933a2ed Mon Sep 17 00:00:00 2001 From: erifan01 Date: Wed, 17 Apr 2019 01:44:24 +0000 Subject: [PATCH 0852/1679] runtime/cgo: declare variable setg_gcc as static variable setg_gcc in runtime/cgo/*.c should be static, otherwise it will be mixed with the function of the same name in runtime/asm_*.s or tls_*.s, which causes an error when building PIE with internal linking mode. Fixes #31485 Change-Id: I79b311ffcaf450984328db65397840ae7d85e65d Reviewed-on: https://go-review.googlesource.com/c/go/+/172498 Reviewed-by: Ian Lance Taylor --- src/runtime/cgo/gcc_darwin_arm.c | 2 +- src/runtime/cgo/gcc_darwin_arm64.c | 2 +- src/runtime/cgo/gcc_linux_arm.c | 2 +- src/runtime/cgo/gcc_linux_arm64.c | 2 +- src/runtime/cgo/gcc_linux_mips64x.c | 2 +- src/runtime/cgo/gcc_linux_mipsx.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/runtime/cgo/gcc_darwin_arm.c b/src/runtime/cgo/gcc_darwin_arm.c index dd7d4f90e1..b1e2502b5d 100644 --- a/src/runtime/cgo/gcc_darwin_arm.c +++ b/src/runtime/cgo/gcc_darwin_arm.c @@ -47,7 +47,7 @@ inittls(void **tlsg, void **tlsbase) } static void *threadentry(void*); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) diff --git a/src/runtime/cgo/gcc_darwin_arm64.c b/src/runtime/cgo/gcc_darwin_arm64.c index c99725d2d6..a0f75910c8 100644 --- a/src/runtime/cgo/gcc_darwin_arm64.c +++ b/src/runtime/cgo/gcc_darwin_arm64.c @@ -48,7 +48,7 @@ inittls(void **tlsg, void **tlsbase) } static void *threadentry(void*); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) diff --git a/src/runtime/cgo/gcc_linux_arm.c b/src/runtime/cgo/gcc_linux_arm.c index 870a8a4a82..61855b96b2 100644 --- a/src/runtime/cgo/gcc_linux_arm.c +++ b/src/runtime/cgo/gcc_linux_arm.c @@ -11,7 +11,7 @@ static void *threadentry(void*); void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) diff --git a/src/runtime/cgo/gcc_linux_arm64.c b/src/runtime/cgo/gcc_linux_arm64.c index 8630f2f03e..261c884ac9 100644 --- a/src/runtime/cgo/gcc_linux_arm64.c +++ b/src/runtime/cgo/gcc_linux_arm64.c @@ -13,7 +13,7 @@ static void *threadentry(void*); void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) diff --git a/src/runtime/cgo/gcc_linux_mips64x.c b/src/runtime/cgo/gcc_linux_mips64x.c index afcd3234e8..42837b14df 100644 --- a/src/runtime/cgo/gcc_linux_mips64x.c +++ b/src/runtime/cgo/gcc_linux_mips64x.c @@ -15,7 +15,7 @@ static void *threadentry(void*); void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) diff --git a/src/runtime/cgo/gcc_linux_mipsx.c b/src/runtime/cgo/gcc_linux_mipsx.c index 2a5f64a727..a44ea3057d 100644 --- a/src/runtime/cgo/gcc_linux_mipsx.c +++ b/src/runtime/cgo/gcc_linux_mipsx.c @@ -15,7 +15,7 @@ static void *threadentry(void*); void (*x_cgo_inittls)(void **tlsg, void **tlsbase); -void (*setg_gcc)(void*); +static void (*setg_gcc)(void*); void _cgo_sys_thread_start(ThreadStart *ts) -- GitLab From cbaa8e5f93a9571c30271c0f6d7c874793ec49ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= Date: Wed, 17 Apr 2019 13:32:19 +0200 Subject: [PATCH 0853/1679] runtime: move libcall to stack for runtime syscalls on AIX As the stackguard was increased on AIX by CL 157117, every syscalls can now have libcall directly on the stack. This fixes some concurrency bugs which seems to occur when semasleep is interrupted by a SIGPROF signal. Change-Id: I905a9618d13ef227dad6f8328b0f958f2f917a5b Reviewed-on: https://go-review.googlesource.com/c/go/+/172359 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/runtime/os2_aix.go | 77 +++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/src/runtime/os2_aix.go b/src/runtime/os2_aix.go index 47cb1290fe..750c8c6115 100644 --- a/src/runtime/os2_aix.go +++ b/src/runtime/os2_aix.go @@ -169,12 +169,13 @@ func syscall0(fn *libFunc) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &mp.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 0 - c.args = uintptr(noescape(unsafe.Pointer(&fn))) // it's unused but must be non-nil, otherwise crashes + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 0, + args: uintptr(unsafe.Pointer(&fn)), // it's unused but must be non-nil, otherwise crashes + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -199,12 +200,13 @@ func syscall1(fn *libFunc, a0 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 1 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 1, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -230,12 +232,13 @@ func syscall2(fn *libFunc, a0, a1 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 2 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 2, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -261,12 +264,13 @@ func syscall3(fn *libFunc, a0, a1, a2 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 3 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 3, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -292,12 +296,13 @@ func syscall4(fn *libFunc, a0, a1, a2, a3 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 4 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 4, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -323,12 +328,13 @@ func syscall5(fn *libFunc, a0, a1, a2, a3, a4 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 5 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 5, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 @@ -354,12 +360,13 @@ func syscall6(fn *libFunc, a0, a1, a2, a3, a4, a5 uintptr) (r, err uintptr) { resetLibcall = false // See comment in sys_darwin.go:libcCall } - c := &gp.m.libcall - c.fn = uintptr(unsafe.Pointer(fn)) - c.n = 6 - c.args = uintptr(noescape(unsafe.Pointer(&a0))) + c := libcall{ + fn: uintptr(unsafe.Pointer(fn)), + n: 6, + args: uintptr(unsafe.Pointer(&a0)), + } - asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(c)) + asmcgocall(unsafe.Pointer(&asmsyscall6), unsafe.Pointer(&c)) if resetLibcall { mp.libcallsp = 0 -- GitLab From c226f6432d465ad9e2d21962353ba86834a2afcb Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Thu, 18 Apr 2019 13:28:55 +1000 Subject: [PATCH 0854/1679] strconv: pre-allocate in appendQuotedWith The byte-at-a-time allocation done quoting strings in appendQuotedWith grows the output incrementally, which is poor behavior for very large strings. An easy fix is to make sure the buffer has enough room at least for an unquoted string. Add a benchmark with a megabyte of non-ASCII data. Before: 39 allocations. After: 7 allocations. We could do better by doing a lot more work but this seems like a big result for little effort. Fixes #31472. Change-Id: I852139e0a2bd13722c4dd329ded8ae1759abad5b Reviewed-on: https://go-review.googlesource.com/c/go/+/172677 Reviewed-by: Ian Lance Taylor Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot --- src/strconv/quote.go | 7 +++++++ src/strconv/strconv_test.go | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/strconv/quote.go b/src/strconv/quote.go index d8a1ed9ecc..b50496a0ff 100644 --- a/src/strconv/quote.go +++ b/src/strconv/quote.go @@ -25,6 +25,13 @@ func quoteRuneWith(r rune, quote byte, ASCIIonly, graphicOnly bool) string { } func appendQuotedWith(buf []byte, s string, quote byte, ASCIIonly, graphicOnly bool) []byte { + // Often called with big strings, so preallocate. If there's quoting, + // this is conservative but still helps a lot. + if cap(buf)-len(buf) < len(s) { + nBuf := make([]byte, len(buf), len(buf)+1+len(s)+1) + copy(nBuf, buf) + buf = nBuf + } buf = append(buf, quote) for width := 0; len(s) > 0; s = s[width:] { r := rune(s[0]) diff --git a/src/strconv/strconv_test.go b/src/strconv/strconv_test.go index 0c14236097..d3c1e953de 100644 --- a/src/strconv/strconv_test.go +++ b/src/strconv/strconv_test.go @@ -30,6 +30,9 @@ var ( AppendFloat(localBuf[:0], 1.23, 'g', 5, 64) }}, {0, `AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64)`, func() { AppendFloat(globalBuf[:0], 1.23, 'g', 5, 64) }}, + // In practice we see 7 for the next one, but allow some slop. + // Before pre-allocation in appendQuotedWith, we saw 39. + {10, `AppendQuoteToASCII(nil, oneMB)`, func() { AppendQuoteToASCII(nil, string(oneMB)) }}, {0, `ParseFloat("123.45", 64)`, func() { ParseFloat("123.45", 64) }}, {0, `ParseFloat("123.456789123456789", 64)`, func() { ParseFloat("123.456789123456789", 64) }}, {0, `ParseFloat("1.000000000000000111022302462515654042363166809082031251", 64)`, func() { @@ -41,6 +44,8 @@ var ( } ) +var oneMB []byte // Will be allocated to 1MB of random data by TestCountMallocs. + func TestCountMallocs(t *testing.T) { if testing.Short() { t.Skip("skipping malloc count in short mode") @@ -48,6 +53,11 @@ func TestCountMallocs(t *testing.T) { if runtime.GOMAXPROCS(0) > 1 { t.Skip("skipping; GOMAXPROCS>1") } + // Allocate a big messy buffer for AppendQuoteToASCII's test. + oneMB = make([]byte, 1e6) + for i := range oneMB { + oneMB[i] = byte(i) + } for _, mt := range mallocTest { allocs := testing.AllocsPerRun(100, mt.fn) if max := float64(mt.count); allocs > max { -- GitLab From 3235f7c0720338a160debe6e9c632b8af968b4dd Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 17 Apr 2019 22:41:51 -0700 Subject: [PATCH 0855/1679] cmd/link: don't fail if multiple ELF sections have the same name New versions of clang can generate multiple sections named ".text" when using vague C++ linkage. This is valid ELF, but would cause the Go linker to report an error when using internal linking: symbol PACKAGEPATH(.text) listed multiple times Avoid the problem by renaming section symbol names if there is a name collision. Change-Id: I41127e95003d5b4554aaf849177b3fe000382c02 Reviewed-on: https://go-review.googlesource.com/c/go/+/172697 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/link/elf_test.go | 112 +++++++++++++++++++++++++ src/cmd/link/internal/loadelf/ldelf.go | 8 ++ 2 files changed, 120 insertions(+) create mode 100644 src/cmd/link/elf_test.go diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go new file mode 100644 index 0000000000..9eb8d1a14b --- /dev/null +++ b/src/cmd/link/elf_test.go @@ -0,0 +1,112 @@ +// Copyright 2019 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. + +// +build dragonfly freebsd linux netbsd openbsd + +package main + +import ( + "internal/testenv" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +var asmSource = ` + .section .text1,"ax" +s1: + .byte 0 + .section .text2,"ax" +s2: + .byte 0 +` + +var goSource = ` +package main +func main() {} +` + +// The linker used to crash if an ELF input file had multiple text sections +// with the same name. +func TestSectionsWithSameName(t *testing.T) { + testenv.MustHaveGoBuild(t) + t.Parallel() + + objcopy, err := exec.LookPath("objcopy") + if err != nil { + t.Skipf("can't find objcopy: %v", err) + } + + dir, err := ioutil.TempDir("", "go-link-TestSectionsWithSameName") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + gopath := filepath.Join(dir, "GOPATH") + env := append(os.Environ(), "GOPATH="+gopath) + + if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), []byte("module elf_test\n"), 0666); err != nil { + t.Fatal(err) + } + + asmFile := filepath.Join(dir, "x.s") + if err := ioutil.WriteFile(asmFile, []byte(asmSource), 0444); err != nil { + t.Fatal(err) + } + + goTool := testenv.GoToolPath(t) + cmd := exec.Command(goTool, "env", "CC") + cmd.Env = env + ccb, err := cmd.Output() + if err != nil { + t.Fatal(err) + } + cc := strings.TrimSpace(string(ccb)) + + cmd = exec.Command(goTool, "env", "GOGCCFLAGS") + cmd.Env = env + cflagsb, err := cmd.Output() + if err != nil { + t.Fatal(err) + } + cflags := strings.Fields(string(cflagsb)) + + asmObj := filepath.Join(dir, "x.o") + t.Logf("%s %v -o %s %s", cc, cflags, asmObj, asmFile) + if out, err := exec.Command(cc, append(cflags, "-c", "-o", asmObj, asmFile)...).CombinedOutput(); err != nil { + t.Logf("%s", out) + t.Fatal(err) + } + + asm2Obj := filepath.Join(dir, "x2.syso") + t.Logf("%s --rename-section .text2=.text1 %s %s", objcopy, asmObj, asm2Obj) + if out, err := exec.Command(objcopy, "--rename-section", ".text2=.text1", asmObj, asm2Obj).CombinedOutput(); err != nil { + t.Logf("%s", out) + t.Fatal(err) + } + + for _, s := range []string{asmFile, asmObj} { + if err := os.Remove(s); err != nil { + t.Fatal(err) + } + } + + goFile := filepath.Join(dir, "main.go") + if err := ioutil.WriteFile(goFile, []byte(goSource), 0444); err != nil { + t.Fatal(err) + } + + cmd = exec.Command(goTool, "build") + cmd.Dir = dir + cmd.Env = env + t.Logf("%s build", goTool) + if out, err := cmd.CombinedOutput(); err != nil { + t.Logf("%s", out) + t.Fatal(err) + } +} diff --git a/src/cmd/link/internal/loadelf/ldelf.go b/src/cmd/link/internal/loadelf/ldelf.go index a22a77bd47..a38c90b1b8 100644 --- a/src/cmd/link/internal/loadelf/ldelf.go +++ b/src/cmd/link/internal/loadelf/ldelf.go @@ -678,6 +678,8 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i // as well use one large chunk. // create symbols for elfmapped sections + sectsymNames := make(map[string]bool) + counter := 0 for i := 0; uint(i) < elfobj.nsect; i++ { sect = &elfobj.sect[i] if sect.type_ == SHT_ARM_ATTRIBUTES && sect.name == ".ARM.attributes" { @@ -709,6 +711,12 @@ func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length i } name := fmt.Sprintf("%s(%s)", pkg, sect.name) + for sectsymNames[name] { + counter++ + name = fmt.Sprintf("%s(%s%d)", pkg, sect.name, counter) + } + sectsymNames[name] = true + s := syms.Lookup(name, localSymVersion) switch int(sect.flags) & (ElfSectFlagAlloc | ElfSectFlagWrite | ElfSectFlagExec) { -- GitLab From 3e2ceaf4def85005d90d37b8b4510d3e40b16fb7 Mon Sep 17 00:00:00 2001 From: Rens Rikkerink <1952177+ikkerens@users.noreply.github.com> Date: Tue, 9 Apr 2019 20:16:35 +0000 Subject: [PATCH 0856/1679] cmd/go: mod init outside of GOPATH silently fails Running `go mod init` outside of GOPATH with `GO111MODULE=off` silently fails. This behavior was undocumented. This CL makes go mod fail with the error: go: modules disabled by GO111MODULE=off; see 'go help modules' Comparing with already erroring GO111MODULE= conditions: * With GO111MODULE=auto, inside GOPATH: go modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules' * With GO111MODULE=auto outside of GOPATH: go: cannot determine module path for source directory /path/to/dir (outside GOPATH, no import comments) Fixes #31342 Change-Id: I749787d2a8640913c4ac263072d051314d76e778 GitHub-Last-Rev: b38447457d8cabed367ea4872cf7f238a49539c7 GitHub-Pull-Request: golang/go#31255 Reviewed-on: https://go-review.googlesource.com/c/go/+/170697 Reviewed-by: Bryan C. Mills Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modcmd/init.go | 3 +++ src/cmd/go/testdata/script/mod_off_init.txt | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 src/cmd/go/testdata/script/mod_off_init.txt diff --git a/src/cmd/go/internal/modcmd/init.go b/src/cmd/go/internal/modcmd/init.go index 0f7421e584..b94453bab0 100644 --- a/src/cmd/go/internal/modcmd/init.go +++ b/src/cmd/go/internal/modcmd/init.go @@ -35,6 +35,9 @@ func runInit(cmd *base.Command, args []string) { if len(args) == 1 { modload.CmdModModule = args[0] } + if os.Getenv("GO111MODULE") == "off" { + base.Fatalf("go mod init: modules disabled by GO111MODULE=off; see 'go help modules'") + } if _, err := os.Stat("go.mod"); err == nil { base.Fatalf("go mod init: go.mod already exists") } diff --git a/src/cmd/go/testdata/script/mod_off_init.txt b/src/cmd/go/testdata/script/mod_off_init.txt new file mode 100644 index 0000000000..f9a4e10bd4 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_off_init.txt @@ -0,0 +1,7 @@ +env GO111MODULE=off + +# This script tests that running go mod init with +# GO111MODULE=off when outside of GOPATH will fatal +# with an error message. +! go mod init +stderr 'go mod init: modules disabled by GO111MODULE=off; see ''go help modules''' -- GitLab From 24a6478be345bce2c551c7f5f287ee1ad6edcbd6 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 18 Apr 2019 10:05:33 -0700 Subject: [PATCH 0857/1679] cmd/compile: use named fields in newnamel CL 172579 added field names in nodl. See that CL for an explanation. Cuong Manh Le pointed out that we should do the same in newnamel. This cuts 40k off the cmd/compile binary. Change-Id: I427b117531c59630dee36f1257aad8975626b2c2 Reviewed-on: https://go-review.googlesource.com/c/go/+/172604 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/subr.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 5e74bee031..55b96e5c9b 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -347,13 +347,13 @@ func newnamel(pos src.XPos, s *types.Sym) *Node { } var x struct { - Node - Name - Param + n Node + m Name + p Param } - n := &x.Node - n.Name = &x.Name - n.Name.Param = &x.Param + n := &x.n + n.Name = &x.m + n.Name.Param = &x.p n.Op = ONAME n.Pos = pos -- GitLab From e900964e0f2709fe9ac5d4c8f760c3398ec0bbbd Mon Sep 17 00:00:00 2001 From: Andrew Z Allen Date: Thu, 18 Apr 2019 00:30:03 -0600 Subject: [PATCH 0858/1679] testing/quick: clarify that Config.MaxCount is from a flag Document that the default quickcheck configuration is to run 100 times and that there is a flag that configures it called "quickchecks". Change-Id: I46fdab9d572e132ccc23ef907f9cc6b2d06b37c4 Reviewed-on: https://go-review.googlesource.com/c/go/+/172698 Reviewed-by: Brad Fitzpatrick --- src/testing/quick/quick.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/testing/quick/quick.go b/src/testing/quick/quick.go index 0457fc7571..2cfb6c85db 100644 --- a/src/testing/quick/quick.go +++ b/src/testing/quick/quick.go @@ -180,7 +180,8 @@ type Config struct { MaxCount int // MaxCountScale is a non-negative scale factor applied to the // default maximum. - // If zero, the default is unchanged. + // If zero, the default is configured by the -quickchecks flag + // which defaults to 100. MaxCountScale float64 // Rand specifies a source of random numbers. // If nil, a default pseudo-random source will be used. -- GitLab From 825ff1e3171a97fba1f29473d0be484ebfdc08b4 Mon Sep 17 00:00:00 2001 From: jfbus Date: Thu, 18 Apr 2019 12:39:24 +0000 Subject: [PATCH 0859/1679] net: use DNS over TCP when use-vc is set in resolv.conf There is a DNS resolution bug in Kubernetes (UDP response packets get dropped by conntrack, causing timeouts in DNS queries). The recommended workaround on Linux is to configure the resolver to use TCP for DNS queries, by setting the use-vc option in resolv.conf. With this PR, the pure Go resolver searches for "use-vc" in resolv.conf and switches to TCP when found. Fixes #29358 Change-Id: I26b935cae2c80e5bb9955da83299a8dea84591de GitHub-Last-Rev: 70bc00fe41f44f0b2b3cfebe67bbcc45701968cf GitHub-Pull-Request: golang/go#29594 Reviewed-on: https://go-review.googlesource.com/c/go/+/156366 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/dnsclient_unix.go | 18 ++++++++++-- src/net/dnsclient_unix_test.go | 33 ++++++++++++++++++++-- src/net/dnsconfig_unix.go | 9 ++++++ src/net/dnsconfig_unix_test.go | 33 ++++++++++++++++++++++ src/net/testdata/freebsd-usevc-resolv.conf | 1 + src/net/testdata/linux-use-vc-resolv.conf | 1 + src/net/testdata/openbsd-tcp-resolv.conf | 1 + 7 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 src/net/testdata/freebsd-usevc-resolv.conf create mode 100644 src/net/testdata/linux-use-vc-resolv.conf create mode 100644 src/net/testdata/openbsd-tcp-resolv.conf diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 4e7462b66f..7ed4ea8708 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -26,6 +26,12 @@ import ( "golang.org/x/net/dns/dnsmessage" ) +const ( + // to be used as a useTCP parameter to exchange + useTCPOnly = true + useUDPOrTCP = false +) + var ( errLameReferral = errors.New("lame referral") errCannotUnmarshalDNSMessage = errors.New("cannot unmarshal DNS message") @@ -131,13 +137,19 @@ func dnsStreamRoundTrip(c Conn, id uint16, query dnsmessage.Question, b []byte) } // exchange sends a query on the connection and hopes for a response. -func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Question, timeout time.Duration) (dnsmessage.Parser, dnsmessage.Header, error) { +func (r *Resolver) exchange(ctx context.Context, server string, q dnsmessage.Question, timeout time.Duration, useTCP bool) (dnsmessage.Parser, dnsmessage.Header, error) { q.Class = dnsmessage.ClassINET id, udpReq, tcpReq, err := newRequest(q) if err != nil { return dnsmessage.Parser{}, dnsmessage.Header{}, errCannotMarshalDNSMessage } - for _, network := range []string{"udp", "tcp"} { + var networks []string + if useTCP { + networks = []string{"tcp"} + } else { + networks = []string{"udp", "tcp"} + } + for _, network := range networks { ctx, cancel := context.WithDeadline(ctx, time.Now().Add(timeout)) defer cancel() @@ -241,7 +253,7 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string, for j := uint32(0); j < sLen; j++ { server := cfg.servers[(serverOffset+j)%sLen] - p, h, err := r.exchange(ctx, server, q, cfg.timeout) + p, h, err := r.exchange(ctx, server, q, cfg.timeout, cfg.useTCP) if err != nil { dnsErr := &DNSError{ Err: err.Error(), diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index 51d54a4cca..f1ed58c837 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -81,7 +81,7 @@ func TestDNSTransportFallback(t *testing.T) { for _, tt := range dnsTransportFallbackTests { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, h, err := r.exchange(ctx, tt.server, tt.question, time.Second) + _, h, err := r.exchange(ctx, tt.server, tt.question, time.Second, useUDPOrTCP) if err != nil { t.Error(err) continue @@ -137,7 +137,7 @@ func TestSpecialDomainName(t *testing.T) { for _, tt := range specialDomainNameTests { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - _, h, err := r.exchange(ctx, server, tt.question, 3*time.Second) + _, h, err := r.exchange(ctx, server, tt.question, 3*time.Second, useUDPOrTCP) if err != nil { t.Error(err) continue @@ -1564,7 +1564,7 @@ func TestDNSDialTCP(t *testing.T) { } r := Resolver{PreferGo: true, Dial: fake.DialContext} ctx := context.Background() - _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second) + _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second, useUDPOrTCP) if err != nil { t.Fatal("exhange failed:", err) } @@ -1695,3 +1695,30 @@ func TestSingleRequestLookup(t *testing.T) { } } } + +// Issue 29358. Add configuration knob to force TCP-only DNS requests in the pure Go resolver. +func TestDNSUseTCP(t *testing.T) { + fake := fakeDNSServer{ + rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) { + r := dnsmessage.Message{ + Header: dnsmessage.Header{ + ID: q.Header.ID, + Response: true, + RCode: dnsmessage.RCodeSuccess, + }, + Questions: q.Questions, + } + if n == "udp" { + t.Fatal("udp protocol was used instead of tcp") + } + return r, nil + }, + } + r := Resolver{PreferGo: true, Dial: fake.DialContext} + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + _, _, err := r.exchange(ctx, "0.0.0.0", mustQuestion("com.", dnsmessage.TypeALL, dnsmessage.ClassINET), time.Second, useTCPOnly) + if err != nil { + t.Fatal("exchange failed:", err) + } +} diff --git a/src/net/dnsconfig_unix.go b/src/net/dnsconfig_unix.go index 3ca8d71f5f..877e77c049 100644 --- a/src/net/dnsconfig_unix.go +++ b/src/net/dnsconfig_unix.go @@ -33,6 +33,7 @@ type dnsConfig struct { mtime time.Time // time of resolv.conf modification soffset uint32 // used by serverOffset singleRequest bool // use sequential A and AAAA queries instead of parallel queries + useTCP bool // force usage of TCP for DNS resolutions } // See resolv.conf(5) on a Linux machine. @@ -123,6 +124,14 @@ func dnsReadConfig(filename string) *dnsConfig { // This option disables the behavior and makes glibc // perform the IPv6 and IPv4 requests sequentially." conf.singleRequest = true + case s == "use-vc" || s == "usevc" || s == "tcp": + // Linux (use-vc), FreeBSD (usevc) and OpenBSD (tcp) option: + // http://man7.org/linux/man-pages/man5/resolv.conf.5.html + // "Sets RES_USEVC in _res.options. + // This option forces the use of TCP for DNS resolutions." + // https://www.freebsd.org/cgi/man.cgi?query=resolv.conf&sektion=5&manpath=freebsd-release-ports + // https://man.openbsd.org/resolv.conf.5 + conf.useTCP = true default: conf.unknownOpt = true } diff --git a/src/net/dnsconfig_unix_test.go b/src/net/dnsconfig_unix_test.go index f16f90ad50..42880123c5 100644 --- a/src/net/dnsconfig_unix_test.go +++ b/src/net/dnsconfig_unix_test.go @@ -124,6 +124,39 @@ var dnsReadConfigTests = []struct { search: []string{"domain.local."}, }, }, + { + name: "testdata/linux-use-vc-resolv.conf", + want: &dnsConfig{ + servers: defaultNS, + ndots: 1, + useTCP: true, + timeout: 5 * time.Second, + attempts: 2, + search: []string{"domain.local."}, + }, + }, + { + name: "testdata/freebsd-usevc-resolv.conf", + want: &dnsConfig{ + servers: defaultNS, + ndots: 1, + useTCP: true, + timeout: 5 * time.Second, + attempts: 2, + search: []string{"domain.local."}, + }, + }, + { + name: "testdata/openbsd-tcp-resolv.conf", + want: &dnsConfig{ + servers: defaultNS, + ndots: 1, + useTCP: true, + timeout: 5 * time.Second, + attempts: 2, + search: []string{"domain.local."}, + }, + }, } func TestDNSReadConfig(t *testing.T) { diff --git a/src/net/testdata/freebsd-usevc-resolv.conf b/src/net/testdata/freebsd-usevc-resolv.conf new file mode 100644 index 0000000000..4afb281c5b --- /dev/null +++ b/src/net/testdata/freebsd-usevc-resolv.conf @@ -0,0 +1 @@ +options usevc \ No newline at end of file diff --git a/src/net/testdata/linux-use-vc-resolv.conf b/src/net/testdata/linux-use-vc-resolv.conf new file mode 100644 index 0000000000..4e4a58b7a7 --- /dev/null +++ b/src/net/testdata/linux-use-vc-resolv.conf @@ -0,0 +1 @@ +options use-vc \ No newline at end of file diff --git a/src/net/testdata/openbsd-tcp-resolv.conf b/src/net/testdata/openbsd-tcp-resolv.conf new file mode 100644 index 0000000000..7929e50e8d --- /dev/null +++ b/src/net/testdata/openbsd-tcp-resolv.conf @@ -0,0 +1 @@ +options tcp \ No newline at end of file -- GitLab From 02bd0fd39cb6ffd840901ea751a61047ccad47cb Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Fri, 19 Apr 2019 07:08:37 +1000 Subject: [PATCH 0860/1679] testing/quick: simplify explanation of -quickchecks flag CL 172698 documented this flag but the description was missing punctuation and could be clearer. Change-Id: I310d91ae8c6b947ce7d1ae7559882f49778f770a Reviewed-on: https://go-review.googlesource.com/c/go/+/172817 Reviewed-by: Brad Fitzpatrick --- src/testing/quick/quick.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/testing/quick/quick.go b/src/testing/quick/quick.go index 2cfb6c85db..c01647ecf0 100644 --- a/src/testing/quick/quick.go +++ b/src/testing/quick/quick.go @@ -180,8 +180,8 @@ type Config struct { MaxCount int // MaxCountScale is a non-negative scale factor applied to the // default maximum. - // If zero, the default is configured by the -quickchecks flag - // which defaults to 100. + // A count of zero implies the default, which is usually 100 + // but can be set by the -quickchecks flag. MaxCountScale float64 // Rand specifies a source of random numbers. // If nil, a default pseudo-random source will be used. -- GitLab From c8aaec2f70c5ccbca1ec2152c57d19981ac09133 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 18 Apr 2019 21:34:41 +0000 Subject: [PATCH 0861/1679] runtime/trace: also treat plan9 as a low memory system Fixes #31554 Updates #12032 (also originally about plan9, but later openbsd/arm) Change-Id: Ib9f35d27a2304f38bf271c38c0b9153d210d8f95 Reviewed-on: https://go-review.googlesource.com/c/go/+/172837 Run-TryBot: Brad Fitzpatrick Reviewed-by: David du Colombier <0intro@gmail.com> TryBot-Result: Gobot Gobot --- src/runtime/trace/trace_test.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/runtime/trace/trace_test.go b/src/runtime/trace/trace_test.go index fc81abc30f..e289fa5e12 100644 --- a/src/runtime/trace/trace_test.go +++ b/src/runtime/trace/trace_test.go @@ -237,7 +237,7 @@ func TestTraceStress(t *testing.T) { runtime.GC() // Trigger GC from malloc. n := int(1e3) - if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm" { + if isMemoryConstrained() { // Reduce allocation to avoid running out of // memory on the builder - see issue/12032. n = 512 @@ -322,6 +322,21 @@ func TestTraceStress(t *testing.T) { testBrokenTimestamps(t, trace) } +// isMemoryConstrained reports whether the current machine is likely +// to be memory constrained. +// This was originally for the openbsd/arm builder (Issue 12032). +// TODO: move this to testenv? Make this look at memory? Look at GO_BUILDER_NAME? +func isMemoryConstrained() bool { + if runtime.GOOS == "plan9" { + return true + } + switch runtime.GOARCH { + case "arm", "mips", "mipsle": + return true + } + return false +} + // Do a bunch of various stuff (timers, GC, network, etc) in a separate goroutine. // And concurrently with all that start/stop trace 3 times. func TestTraceStressStartStop(t *testing.T) { @@ -381,9 +396,9 @@ func TestTraceStressStartStop(t *testing.T) { runtime.GC() // Trigger GC from malloc. n := int(1e3) - if runtime.GOOS == "openbsd" && runtime.GOARCH == "arm" { + if isMemoryConstrained() { // Reduce allocation to avoid running out of - // memory on the builder - see issue/12032. + // memory on the builder. n = 512 } for i := 0; i < n; i++ { -- GitLab From bdd7bb5526d5ba6a3471ce03ae953bb6d793b501 Mon Sep 17 00:00:00 2001 From: LE Manh Cuong Date: Fri, 19 Apr 2019 16:35:24 +0700 Subject: [PATCH 0862/1679] cmd/compile: remove unused func nodfltconst Its only usage was removed in golang.org/cl/103860 Change-Id: I2a230b9475b0aadf3892b89f5e4ee6d4c5b70394 Reviewed-on: https://go-review.googlesource.com/c/go/+/172917 Reviewed-by: Keith Randall Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/subr.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 55b96e5c9b..04dd2f7c2d 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -416,12 +416,6 @@ func nodintconst(v int64) *Node { return nodlit(Val{u}) } -func nodfltconst(v *Mpflt) *Node { - u := newMpflt() - u.Set(v) - return nodlit(Val{u}) -} - func nodnil() *Node { return nodlit(Val{new(NilVal)}) } -- GitLab From 7f1612652b24fbb7f5a361735f656784f2d48cb1 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 2 Apr 2019 14:58:31 -0400 Subject: [PATCH 0863/1679] cmd/go/internal/modcmd: skip files with the "ignore" constraint in 'go mod vendor' 'go mod vendor' already drops test files and testdata directories, so users should not expect the vendored module to include unnecessary files in general. Files tagged "ignore" are typically only used to refresh or regenerate source files within the module to be vendored, so users of that module do not need them. Fixes #31088 Change-Id: I1ce9545e9b37c8e779a1826a9d494ac29d2cbfb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/172978 Run-TryBot: Bryan C. Mills Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/go/internal/modcmd/vendor.go | 38 ++++++++++++++++++----- src/cmd/go/testdata/script/mod_vendor.txt | 9 ++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/cmd/go/internal/modcmd/vendor.go b/src/cmd/go/internal/modcmd/vendor.go index b70f25cec3..7265e62a2f 100644 --- a/src/cmd/go/internal/modcmd/vendor.go +++ b/src/cmd/go/internal/modcmd/vendor.go @@ -15,6 +15,7 @@ import ( "cmd/go/internal/base" "cmd/go/internal/cfg" + "cmd/go/internal/imports" "cmd/go/internal/modload" "cmd/go/internal/module" ) @@ -100,7 +101,7 @@ func vendorPkg(vdir, pkg string) { if src == "" { fmt.Fprintf(os.Stderr, "internal error: no pkg for %s -> %s\n", pkg, realPath) } - copyDir(dst, src, matchNonTest) + copyDir(dst, src, matchPotentialSourceFile) if m := modload.PackageModule(realPath); m.Path != "" { copyMetadata(m.Path, realPath, dst, src) } @@ -153,7 +154,7 @@ var metaPrefixes = []string{ } // matchMetadata reports whether info is a metadata file. -func matchMetadata(info os.FileInfo) bool { +func matchMetadata(dir string, info os.FileInfo) bool { name := info.Name() for _, p := range metaPrefixes { if strings.HasPrefix(name, p) { @@ -163,13 +164,36 @@ func matchMetadata(info os.FileInfo) bool { return false } -// matchNonTest reports whether info is any non-test file (including non-Go files). -func matchNonTest(info os.FileInfo) bool { - return !strings.HasSuffix(info.Name(), "_test.go") +var anyTagsExceptIgnore = map[string]bool{"*": true} + +// matchPotentialSourceFile reports whether info may be relevant to a build operation. +func matchPotentialSourceFile(dir string, info os.FileInfo) bool { + if strings.HasSuffix(info.Name(), "_test.go") { + return false + } + if strings.HasSuffix(info.Name(), ".go") { + f, err := os.Open(filepath.Join(dir, info.Name())) + if err != nil { + base.Fatalf("go mod vendor: %v", err) + } + defer f.Close() + + content, err := imports.ReadImports(f, false, nil) + if err == nil && !imports.ShouldBuild(content, anyTagsExceptIgnore) { + // The file is explicitly tagged "ignore", so it can't affect the build. + // Leave it out. + return false + } + return true + } + + // We don't know anything about this file, so optimistically assume that it is + // needed. + return true } // copyDir copies all regular files satisfying match(info) from src to dst. -func copyDir(dst, src string, match func(os.FileInfo) bool) { +func copyDir(dst, src string, match func(dir string, info os.FileInfo) bool) { files, err := ioutil.ReadDir(src) if err != nil { base.Fatalf("go mod vendor: %v", err) @@ -178,7 +202,7 @@ func copyDir(dst, src string, match func(os.FileInfo) bool) { base.Fatalf("go mod vendor: %v", err) } for _, file := range files { - if file.IsDir() || !file.Mode().IsRegular() || !match(file) { + if file.IsDir() || !file.Mode().IsRegular() || !match(src, file) { continue } r, err := os.Open(filepath.Join(src, file.Name())) diff --git a/src/cmd/go/testdata/script/mod_vendor.txt b/src/cmd/go/testdata/script/mod_vendor.txt index 203183be88..25a77a3670 100644 --- a/src/cmd/go/testdata/script/mod_vendor.txt +++ b/src/cmd/go/testdata/script/mod_vendor.txt @@ -38,6 +38,7 @@ stdout 'src[\\/]w' stderr 'src[\\/]vendor[\\/]w' ! exists vendor/x/testdata +! exists vendor/a/foo/bar/b/ignored.go ! exists vendor/a/foo/bar/b/main_test.go exists vendor/a/foo/AUTHORS.txt @@ -102,6 +103,14 @@ replace ( -- a/foo/bar/b/main.go -- package b +-- a/foo/bar/b/ignored.go -- +// This file is intended for use with "go run"; it isn't really part of the package. + +// +build ignore + +package main + +func main() {} -- a/foo/bar/b/main_test.go -- package b -- GitLab From d68ac59113e8c6d6a79abf9d608fd24c3566b91c Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Tue, 2 Apr 2019 15:03:08 -0400 Subject: [PATCH 0864/1679] {,cmd/}vendor: rerun 'go mod vendor' to prune ignored files Updates #31088 Change-Id: Ia126e4e83ac5cb12c2c4151d5e5c975497598f24 Reviewed-on: https://go-review.googlesource.com/c/go/+/172979 Reviewed-by: Brad Fitzpatrick --- .../ianlancetaylor/demangle/c++filt.go | 144 --- .../golang.org/x/sys/unix/mkasm_darwin.go | 61 -- .../vendor/golang.org/x/sys/unix/mkpost.go | 106 -- .../vendor/golang.org/x/sys/unix/mksyscall.go | 402 -------- .../x/sys/unix/mksyscall_aix_ppc.go | 404 -------- .../x/sys/unix/mksyscall_aix_ppc64.go | 602 ----------- .../x/sys/unix/mksyscall_solaris.go | 335 ------ .../vendor/golang.org/x/sys/unix/mksysnum.go | 190 ---- .../vendor/golang.org/x/sys/unix/types_aix.go | 236 ----- .../golang.org/x/sys/unix/types_darwin.go | 277 ----- .../golang.org/x/sys/unix/types_dragonfly.go | 263 ----- .../golang.org/x/sys/unix/types_freebsd.go | 356 ------- .../golang.org/x/sys/unix/types_netbsd.go | 289 ------ .../golang.org/x/sys/unix/types_openbsd.go | 282 ----- .../golang.org/x/sys/unix/types_solaris.go | 266 ----- .../analysis/passes/lostcancel/lostcancel.go | 4 +- .../x/tools/go/analysis/unitchecker/main.go | 64 -- .../golang.org/x/net/lif/defs_solaris.go | 90 -- .../golang.org/x/net/nettest/conntest.go | 6 +- .../golang.org/x/net/route/defs_darwin.go | 114 -- .../golang.org/x/net/route/defs_dragonfly.go | 113 -- .../golang.org/x/net/route/defs_freebsd.go | 337 ------ .../golang.org/x/net/route/defs_netbsd.go | 112 -- .../golang.org/x/net/route/defs_openbsd.go | 116 --- .../golang.org/x/text/unicode/bidi/gen.go | 133 --- .../x/text/unicode/bidi/gen_ranges.go | 57 - .../x/text/unicode/bidi/gen_trieval.go | 64 -- .../x/text/unicode/norm/maketables.go | 976 ------------------ .../golang.org/x/text/unicode/norm/triegen.go | 117 --- 29 files changed, 5 insertions(+), 6511 deletions(-) delete mode 100644 src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mkpost.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_aix.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go delete mode 100644 src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go delete mode 100644 src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/main.go delete mode 100644 src/vendor/golang.org/x/net/lif/defs_solaris.go delete mode 100644 src/vendor/golang.org/x/net/route/defs_darwin.go delete mode 100644 src/vendor/golang.org/x/net/route/defs_dragonfly.go delete mode 100644 src/vendor/golang.org/x/net/route/defs_freebsd.go delete mode 100644 src/vendor/golang.org/x/net/route/defs_netbsd.go delete mode 100644 src/vendor/golang.org/x/net/route/defs_openbsd.go delete mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen.go delete mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go delete mode 100644 src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go delete mode 100644 src/vendor/golang.org/x/text/unicode/norm/maketables.go delete mode 100644 src/vendor/golang.org/x/text/unicode/norm/triegen.go diff --git a/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go b/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go deleted file mode 100644 index 7ba817c9fe..0000000000 --- a/src/cmd/vendor/github.com/ianlancetaylor/demangle/c++filt.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -// This is a program that works like the GNU c++filt program. -// It's here for testing purposes and as an example. - -package main - -import ( - "bufio" - "flag" - "fmt" - "io" - "os" - "strings" - "unicode" - - "github.com/ianlancetaylor/demangle" -) - -func flagUsage() { - usage(os.Stderr, 2) -} - -func usage(w io.Writer, status int) { - fmt.Fprintf(w, "Usage: %s [options] [mangled names]\n", os.Args[0]) - flag.CommandLine.SetOutput(w) - flag.PrintDefaults() - fmt.Fprintln(w, `Demangled names are displayed to stdout -If a name cannot be demangled it is just echoed to stdout. -If no names are provided on the command line, stdin is read.`) - os.Exit(status) -} - -var stripUnderscore = flag.Bool("_", false, "Ignore first leading underscore") -var noParams = flag.Bool("p", false, "Do not display function argument types") -var noVerbose = flag.Bool("i", false, "Do not show implementation details (if any)") -var help = flag.Bool("h", false, "Display help information") -var debug = flag.Bool("d", false, "Display debugging information for strings on command line") - -// Unimplemented c++filt flags: -// -n (opposite of -_) -// -t (demangle types) -// -s (set demangling style) -// -V (print version information) - -// Characters considered to be part of a symbol. -const symbolChars = "_$." - -func main() { - flag.Usage = func() { usage(os.Stderr, 1) } - flag.Parse() - - if *help { - usage(os.Stdout, 0) - } - - out := bufio.NewWriter(os.Stdout) - - if flag.NArg() > 0 { - for _, f := range flag.Args() { - if *debug { - a, err := demangle.ToAST(f, options()...) - if err != nil { - fmt.Fprintf(os.Stderr, "%s: %v\n", f, err) - } else { - fmt.Fprintf(out, "%#v\n", a) - } - } else { - doDemangle(out, f) - } - out.WriteByte('\n') - } - if err := out.Flush(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - return - } - - scanner := bufio.NewScanner(bufio.NewReader(os.Stdin)) - for scanner.Scan() { - line := scanner.Text() - start := -1 - for i, c := range line { - if unicode.IsLetter(c) || unicode.IsNumber(c) || strings.ContainsRune(symbolChars, c) { - if start < 0 { - start = i - } - } else { - if start >= 0 { - doDemangle(out, line[start:i]) - } - out.WriteRune(c) - start = -1 - } - } - if start >= 0 { - doDemangle(out, line[start:]) - start = -1 - } - out.WriteByte('\n') - if err := out.Flush(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - } -} - -// Demangle a string just as the GNU c++filt program does. -func doDemangle(out *bufio.Writer, name string) { - skip := 0 - if name[0] == '.' || name[0] == '$' { - skip++ - } - if *stripUnderscore && name[skip] == '_' { - skip++ - } - result := demangle.Filter(name[skip:], options()...) - if result == name[skip:] { - out.WriteString(name) - } else { - if name[0] == '.' { - out.WriteByte('.') - } - out.WriteString(result) - } -} - -// options returns the demangling options to use based on the command -// line flags. -func options() []demangle.Option { - var options []demangle.Option - if *noParams { - options = append(options, demangle.NoParams) - } - if !*noVerbose { - options = append(options, demangle.Verbose) - } - return options -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go deleted file mode 100644 index 4548b993db..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkasm_darwin.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018 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. - -// +build ignore - -// mkasm_darwin.go generates assembly trampolines to call libSystem routines from Go. -//This program must be run after mksyscall.go. -package main - -import ( - "bytes" - "fmt" - "io/ioutil" - "log" - "os" - "strings" -) - -func main() { - in1, err := ioutil.ReadFile("syscall_darwin.go") - if err != nil { - log.Fatalf("can't open syscall_darwin.go: %s", err) - } - arch := os.Args[1] - in2, err := ioutil.ReadFile(fmt.Sprintf("syscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open syscall_darwin_%s.go: %s", arch, err) - } - in3, err := ioutil.ReadFile(fmt.Sprintf("zsyscall_darwin_%s.go", arch)) - if err != nil { - log.Fatalf("can't open zsyscall_darwin_%s.go: %s", arch, err) - } - in := string(in1) + string(in2) + string(in3) - - trampolines := map[string]bool{} - - var out bytes.Buffer - - fmt.Fprintf(&out, "// go run mkasm_darwin.go %s\n", strings.Join(os.Args[1:], " ")) - fmt.Fprintf(&out, "// Code generated by the command above; DO NOT EDIT.\n") - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "// +build go1.12\n") - fmt.Fprintf(&out, "\n") - fmt.Fprintf(&out, "#include \"textflag.h\"\n") - for _, line := range strings.Split(in, "\n") { - if !strings.HasPrefix(line, "func ") || !strings.HasSuffix(line, "_trampoline()") { - continue - } - fn := line[5 : len(line)-13] - if !trampolines[fn] { - trampolines[fn] = true - fmt.Fprintf(&out, "TEXT ·%s_trampoline(SB),NOSPLIT,$0-0\n", fn) - fmt.Fprintf(&out, "\tJMP\t%s(SB)\n", fn) - } - } - err = ioutil.WriteFile(fmt.Sprintf("zsyscall_darwin_%s.s", arch), out.Bytes(), 0644) - if err != nil { - log.Fatalf("can't write zsyscall_darwin_%s.s: %s", arch, err) - } -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go b/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go deleted file mode 100644 index 9feddd00c4..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mkpost.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -// mkpost processes the output of cgo -godefs to -// modify the generated types. It is used to clean up -// the sys API in an architecture specific manner. -// -// mkpost is run after cgo -godefs; see README.md. -package main - -import ( - "bytes" - "fmt" - "go/format" - "io/ioutil" - "log" - "os" - "regexp" -) - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check that we are using the Docker-based build system if we should be. - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - os.Stderr.WriteString("In the Docker-based build system, mkpost should not be called directly.\n") - os.Stderr.WriteString("See README.md\n") - os.Exit(1) - } - } - - b, err := ioutil.ReadAll(os.Stdin) - if err != nil { - log.Fatal(err) - } - - // Intentionally export __val fields in Fsid and Sigset_t - valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`) - b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}")) - - // Intentionally export __fds_bits field in FdSet - fdSetRegex := regexp.MustCompile(`type (FdSet) struct {(\s+)X__fds_bits(\s+\S+\s+)}`) - b = fdSetRegex.ReplaceAll(b, []byte("type $1 struct {${2}Bits$3}")) - - // If we have empty Ptrace structs, we should delete them. Only s390x emits - // nonempty Ptrace structs. - ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) - b = ptraceRexexp.ReplaceAll(b, nil) - - // Replace the control_regs union with a blank identifier for now. - controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) - b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) - - // Remove fields that are added by glibc - // Note that this is unstable as the identifers are private. - removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Convert [65]int8 to [65]byte in Utsname members to simplify - // conversion to string; see golang.org/issue/20753 - convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) - b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) - - // Convert [1024]int8 to [1024]byte in Ptmget members - convertPtmget := regexp.MustCompile(`([SC]n)(\s+)\[(\d+)\]u?int8`) - b = convertPtmget.ReplaceAll(b, []byte("$1[$3]byte")) - - // Remove spare fields (e.g. in Statx_t) - spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) - b = spareFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove cgo padding fields - removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) - b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove padding, hidden, or unused fields - removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`) - b = removeFieldsRegex.ReplaceAll(b, []byte("_")) - - // Remove the first line of warning from cgo - b = b[bytes.IndexByte(b, '\n')+1:] - // Modify the command in the header to include: - // mkpost, our own warning, and a build tag. - replacement := fmt.Sprintf(`$1 | go run mkpost.go -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s,%s`, goarch, goos) - cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) - b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) - - // gofmt - b, err = format.Source(b) - if err != nil { - log.Fatal(err) - } - - os.Stdout.Write(b) -} diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go deleted file mode 100644 index bed93d4890..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall.go +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright 2018 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. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_darwin.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named errno. - -A line beginning with //sysnb is like //sys, except that the -goroutine will not be suspended during the execution of the system -call. This must only be used for system calls which can never -block, as otherwise the system call could cause all goroutines to -hang. -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - plan9 = flag.Bool("plan9", false, "plan9") - openbsd = flag.Bool("openbsd", false, "openbsd") - netbsd = flag.Bool("netbsd", false, "netbsd") - dragonfly = flag.Bool("dragonfly", false, "dragonfly") - arm = flag.Bool("arm", false, "arm") // 64-bit value should use (even, odd)-pair - tags = flag.String("tags", "", "build tags") - filename = flag.String("output", "", "output file name (standard output if omitted)") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - // Get the OS and architecture (using GOARCH_TARGET if it exists) - goos := os.Getenv("GOOS") - if goos == "" { - fmt.Fprintln(os.Stderr, "GOOS not defined in environment") - os.Exit(1) - } - goarch := os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - - // Check that we are using the Docker-based build system if we should - if goos == "linux" { - if os.Getenv("GOLANG_SYS_BUILD") != "docker" { - fmt.Fprintf(os.Stderr, "In the Docker-based build system, mksyscall should not be called directly.\n") - fmt.Fprintf(os.Stderr, "See README.md\n") - os.Exit(1) - } - } - - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - libc := false - if goos == "darwin" && strings.Contains(buildTags(), ",go1.12") { - libc = true - } - trampolines := map[string]bool{} - - text := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, errno error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, sysname := f[2], f[3], f[4], f[5] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Go function header. - outDecl := "" - if len(out) > 0 { - outDecl = fmt.Sprintf(" (%s)", strings.Join(out, ", ")) - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outDecl) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - break - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, %s = BytePtrFromString(%s)\n", n, errvar, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d *byte\n", n) - text += fmt.Sprintf("\t_p%d, _ = BytePtrFromString(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass dummy pointer in that case. - // Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). - text += fmt.Sprintf("\tvar _p%d unsafe.Pointer\n", n) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = unsafe.Pointer(&%s[0])\n\t}", p.Name, n, p.Name) - text += fmt.Sprintf(" else {\n\t\t_p%d = unsafe.Pointer(&_zero)\n\t}\n", n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && (*openbsd || *netbsd) { - args = append(args, "0") - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if p.Type == "int64" && *dragonfly { - if regexp.MustCompile(`^(?i)extp(read|write)`).FindStringSubmatch(funct) == nil { - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else if endianness == "little-endian" { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } else if (p.Type == "int64" || p.Type == "uint64") && endianness != "" { - if len(args)%2 == 1 && *arm { - // arm abi specifies 64-bit argument uses - // (even, odd) pair - args = append(args, "0") - } - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - - // Determine which form to use; pad args with zeros. - asm := "Syscall" - if nonblock != nil { - if errvar == "" && goos == "linux" { - asm = "RawSyscallNoError" - } else { - asm = "RawSyscall" - } - } else { - if errvar == "" && goos == "linux" { - asm = "SyscallNoError" - } - } - if len(args) <= 3 { - for len(args) < 3 { - args = append(args, "0") - } - } else if len(args) <= 6 { - asm += "6" - for len(args) < 6 { - args = append(args, "0") - } - } else if len(args) <= 9 { - asm += "9" - for len(args) < 9 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s:%s too many arguments to system call\n", path, funct) - } - - // System call number. - if sysname == "" { - sysname = "SYS_" + funct - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToUpper(sysname) - } - - var libcFn string - if libc { - asm = "syscall_" + strings.ToLower(asm[:1]) + asm[1:] // internal syscall call - sysname = strings.TrimPrefix(sysname, "SYS_") // remove SYS_ - sysname = strings.ToLower(sysname) // lowercase - if sysname == "getdirentries64" { - // Special case - libSystem name and - // raw syscall name don't match. - sysname = "__getdirentries64" - } - libcFn = sysname - sysname = "funcPC(libc_" + sysname + "_trampoline)" - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(%s, %s)", asm, sysname, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" && !*plan9 { - reg = "e1" - ret[2] = reg - doErrno = true - } else if p.Name == "err" && *plan9 { - ret[0] = "r0" - ret[2] = "e1" - break - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s:%s not enough registers for int64 return\n", path, funct) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" || *plan9 { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - if errvar == "" && goos == "linux" { - // raw syscall without error on Linux, see golang.org/issue/22924 - text += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - } - text += body - - if *plan9 && ret[2] == "e1" { - text += "\tif int32(r0) == -1 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } else if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = errnoErr(e1)\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n\n" - - if libc && !trampolines[libcFn] { - // some system calls share a trampoline, like read and readlen. - trampolines[libcFn] = true - // Declare assembly trampoline. - text += fmt.Sprintf("func libc_%s_trampoline()\n", libcFn) - // Assembly trampoline calls the libc_* function, which this magic - // redirects to use the function from libSystem. - text += fmt.Sprintf("//go:linkname libc_%s libc_%s\n", libcFn, libcFn) - text += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"/usr/lib/libSystem.B.dylib\"\n", libcFn, libcFn) - text += "\n" - } - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -import ( - "syscall" - "unsafe" -) - -var _ syscall.Errno - -%s -` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go deleted file mode 100644 index f2c58fb7cc..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2019 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. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - cExtern := "/*\n#include \n#include \n" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // Check if value return, err return available - errvar := "" - retvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - retvar = p.Name - rettype = p.Type - } - } - - // System call name. - if sysname == "" { - sysname = funct - } - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // Change p.Types to c - var cIn []string - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - cIn = append(cIn, "int") - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if funct != "fcntl" && funct != "FcntlInt" && funct != "readlen" && funct != "writelen" { - // Imports of system calls from libc - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - - // So file name. - if *aix { - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - } - - strconvfunc := "C.CString" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if text != "" { - text += "\n" - } - - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments to Syscall. - var args []string - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "C.uintptr_t(uintptr(unsafe.Pointer("+p.Name+")))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\t_p%d := uintptr(unsafe.Pointer(%s(%s)))\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(unsafe.Pointer(_p%d)))", n)) - n++ - text += fmt.Sprintf("\tvar _p%d int\n", n) - text += fmt.Sprintf("\t_p%d = len(%s)\n", n, p.Name) - args = append(args, fmt.Sprintf("C.size_t(_p%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - n++ - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("_p%d", n)) - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "unsafe.Pointer" { - args = append(args, fmt.Sprintf("C.uintptr_t(uintptr(%s))", p.Name)) - } else if p.Type == "int" { - if (argN == 2) && ((funct == "readlen") || (funct == "writelen")) { - args = append(args, fmt.Sprintf("C.size_t(%s)", p.Name)) - } else if argN == 0 && funct == "fcntl" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if (argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt")) { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - args = append(args, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - args = append(args, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - args = append(args, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - args = append(args, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := "" - if sysname == "exit" { - if errvar != "" { - call += "er :=" - } else { - call += "" - } - } else if errvar != "" { - call += "r0,er :=" - } else if retvar != "" { - call += "r0,_ :=" - } else { - call += "" - } - call += fmt.Sprintf("C.%s(%s)", sysname, arglist) - - // Assign return values. - body := "" - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - } else { - reg = "r0" - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - - // verify return - if sysname != "exit" && errvar != "" { - if regexp.MustCompile(`^uintptr`).FindStringSubmatch(cRettype) != nil { - body += "\tif (uintptr(r0) ==^uintptr(0) && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } else { - body += "\tif (r0 ==-1 && er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - } else if errvar != "" { - body += "\tif (er != nil) {\n" - body += fmt.Sprintf("\t\t%s = er\n", errvar) - body += "\t}\n" - } - - text += fmt.Sprintf("\t%s\n", call) - text += body - - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, cExtern, imp, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - - -%s -*/ -import "C" -import ( - "unsafe" -) - - -%s - -%s -` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go deleted file mode 100644 index 45b4429088..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go +++ /dev/null @@ -1,602 +0,0 @@ -// Copyright 2019 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. - -// +build ignore - -/* -This program reads a file containing function prototypes -(like syscall_aix.go) and generates system call bodies. -The prototypes are marked by lines beginning with "//sys" -and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt - - -This program will generate three files and handle both gc and gccgo implementation: - - zsyscall_aix_ppc64.go: the common part of each implementation (error handler, pointer creation) - - zsyscall_aix_ppc64_gc.go: gc part with //go_cgo_import_dynamic and a call to syscall6 - - zsyscall_aix_ppc64_gccgo.go: gccgo part with C function and conversion to C type. - - The generated code looks like this - -zsyscall_aix_ppc64.go -func asyscall(...) (n int, err error) { - // Pointer Creation - r1, e1 := callasyscall(...) - // Type Conversion - // Error Handler - return -} - -zsyscall_aix_ppc64_gc.go -//go:cgo_import_dynamic libc_asyscall asyscall "libc.a/shr_64.o" -//go:linkname libc_asyscall libc_asyscall -var asyscall syscallFunc - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_asyscall)), "nb_args", ... ) - return -} - -zsyscall_aix_ppc64_ggcgo.go - -// int asyscall(...) - -import "C" - -func callasyscall(...) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.asyscall(...)) - e1 = syscall.GetErrno() - return -} -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "io/ioutil" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - aix = flag.Bool("aix", false, "aix") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_aix_ppc64.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_aix_ppc64.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - // GCCGO - textgccgo := "" - cExtern := "/*\n#include \n" - // GC - textgc := "" - dynimports := "" - linknames := "" - var vars []string - // COMMON - textcommon := "" - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - if sysname == "" { - sysname = funct - } - - onlyCommon := false - if funct == "readlen" || funct == "writelen" || funct == "FcntlInt" || funct == "FcntlFlock" { - // This function call another syscall which is already implemented. - // Therefore, the gc and gccgo part must not be generated. - onlyCommon = true - } - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - - textcommon += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - if !onlyCommon { - textgccgo += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - textgc += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - } - - // Check if value return, err return available - errvar := "" - rettype := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - } else { - rettype = p.Type - } - } - - sysname = regexp.MustCompile(`([a-z])([A-Z])`).ReplaceAllString(sysname, `${1}_$2`) - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // GCCGO Prototype return type - cRettype := "" - if rettype == "unsafe.Pointer" { - cRettype = "uintptr_t" - } else if rettype == "uintptr" { - cRettype = "uintptr_t" - } else if regexp.MustCompile(`^_`).FindStringSubmatch(rettype) != nil { - cRettype = "uintptr_t" - } else if rettype == "int" { - cRettype = "int" - } else if rettype == "int32" { - cRettype = "int" - } else if rettype == "int64" { - cRettype = "long long" - } else if rettype == "uint32" { - cRettype = "unsigned int" - } else if rettype == "uint64" { - cRettype = "unsigned long long" - } else { - cRettype = "int" - } - if sysname == "exit" { - cRettype = "void" - } - - // GCCGO Prototype arguments type - var cIn []string - for i, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "string" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t", "size_t") - } else if p.Type == "unsafe.Pointer" { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "uintptr" { - cIn = append(cIn, "uintptr_t") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil { - cIn = append(cIn, "uintptr_t") - } else if p.Type == "int" { - if (i == 0 || i == 2) && funct == "fcntl" { - // These fcntl arguments needs to be uintptr to be able to call FcntlInt and FcntlFlock - cIn = append(cIn, "uintptr_t") - } else { - cIn = append(cIn, "int") - } - - } else if p.Type == "int32" { - cIn = append(cIn, "int") - } else if p.Type == "int64" { - cIn = append(cIn, "long long") - } else if p.Type == "uint32" { - cIn = append(cIn, "unsigned int") - } else if p.Type == "uint64" { - cIn = append(cIn, "unsigned long long") - } else { - cIn = append(cIn, "int") - } - } - - if !onlyCommon { - // GCCGO Prototype Generation - // Imports of system calls from libc - cExtern += fmt.Sprintf("%s %s", cRettype, sysname) - cIn := strings.Join(cIn, ", ") - cExtern += fmt.Sprintf("(%s);\n", cIn) - } - // GC Library name - if modname == "" { - modname = "libc.a/shr_64.o" - } else { - fmt.Fprintf(os.Stderr, "%s: only syscall using libc are available\n", funct) - os.Exit(1) - } - sysvarname := fmt.Sprintf("libc_%s", sysname) - - if !onlyCommon { - // GC Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic %s %s \"%s\"\n", sysvarname, sysname, modname) - // GC Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s %s\n", sysvarname, sysvarname) - // GC Library proc address variable. - vars = append(vars, sysvarname) - } - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - // Go function header. - if outps != "" { - outps = fmt.Sprintf(" (%s)", outps) - } - if textcommon != "" { - textcommon += "\n" - } - - textcommon += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outps) - - // Prepare arguments tocall. - var argscommon []string // Arguments in the common part - var argscall []string // Arguments for call prototype - var argsgc []string // Arguments for gc call (with syscall6) - var argsgccgo []string // Arguments for gccgo call (with C.name_of_syscall) - n := 0 - argN := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(%s))", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "string" && errvar != "" { - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr ", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - textcommon += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - textcommon += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - textcommon += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n)) - n++ - } else if m := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); m != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - textcommon += fmt.Sprintf("\tvar _p%d *%s\n", n, m[1]) - textcommon += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - argscommon = append(argscommon, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("len(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("_p%d uintptr", n), fmt.Sprintf("_lenp%d int", n)) - argsgc = append(argsgc, fmt.Sprintf("_p%d", n), fmt.Sprintf("uintptr(_lenp%d)", n)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(_p%d)", n), fmt.Sprintf("C.size_t(_lenp%d)", n)) - n++ - } else if p.Type == "int64" && endianness != "" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses int64 with 32 bits mode. Case not yet implemented\n") - } else if p.Type == "bool" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses bool. Case not yet implemented\n") - } else if regexp.MustCompile(`^_`).FindStringSubmatch(p.Type) != nil || p.Type == "unsafe.Pointer" { - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else if p.Type == "int" { - if (argN == 0 || argN == 2) && ((funct == "fcntl") || (funct == "FcntlInt") || (funct == "FcntlFlock")) { - // These fcntl arguments need to be uintptr to be able to call FcntlInt and FcntlFlock - argscommon = append(argscommon, fmt.Sprintf("uintptr(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - - } else { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - } else if p.Type == "int32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } else if p.Type == "int64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s int64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.longlong(%s)", p.Name)) - } else if p.Type == "uint32" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint32", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uint(%s)", p.Name)) - } else if p.Type == "uint64" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uint64", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.ulonglong(%s)", p.Name)) - } else if p.Type == "uintptr" { - argscommon = append(argscommon, p.Name) - argscall = append(argscall, fmt.Sprintf("%s uintptr", p.Name)) - argsgc = append(argsgc, p.Name) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.uintptr_t(%s)", p.Name)) - } else { - argscommon = append(argscommon, fmt.Sprintf("int(%s)", p.Name)) - argscall = append(argscall, fmt.Sprintf("%s int", p.Name)) - argsgc = append(argsgc, fmt.Sprintf("uintptr(%s)", p.Name)) - argsgccgo = append(argsgccgo, fmt.Sprintf("C.int(%s)", p.Name)) - } - argN++ - } - nargs := len(argsgc) - - // COMMON function generation - argscommonlist := strings.Join(argscommon, ", ") - callcommon := fmt.Sprintf("call%s(%s)", sysname, argscommonlist) - ret := []string{"_", "_"} - body := "" - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[1] = reg - doErrno = true - } else { - reg = "r0" - ret[0] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%s != 0", reg) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" { - textcommon += fmt.Sprintf("\t%s\n", callcommon) - } else { - textcommon += fmt.Sprintf("\t%s, %s := %s\n", ret[0], ret[1], callcommon) - } - textcommon += body - - if doErrno { - textcommon += "\tif e1 != 0 {\n" - textcommon += "\t\terr = errnoErr(e1)\n" - textcommon += "\t}\n" - } - textcommon += "\treturn\n" - textcommon += "}\n" - - if onlyCommon { - continue - } - - // CALL Prototype - callProto := fmt.Sprintf("func call%s(%s) (r1 uintptr, e1 Errno) {\n", sysname, strings.Join(argscall, ", ")) - - // GC function generation - asm := "syscall6" - if nonblock != nil { - asm = "rawSyscall6" - } - - if len(argsgc) <= 6 { - for len(argsgc) < 6 { - argsgc = append(argsgc, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call", funct) - os.Exit(1) - } - argsgclist := strings.Join(argsgc, ", ") - callgc := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, argsgclist) - - textgc += callProto - textgc += fmt.Sprintf("\tr1, _, e1 = %s\n", callgc) - textgc += "\treturn\n}\n" - - // GCCGO function generation - argsgccgolist := strings.Join(argsgccgo, ", ") - callgccgo := fmt.Sprintf("C.%s(%s)", sysname, argsgccgolist) - textgccgo += callProto - textgccgo += fmt.Sprintf("\tr1 = uintptr(%s)\n", callgccgo) - textgccgo += "\te1 = syscall.GetErrno()\n" - textgccgo += "\treturn\n}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - - // Print zsyscall_aix_ppc64.go - err := ioutil.WriteFile("zsyscall_aix_ppc64.go", - []byte(fmt.Sprintf(srcTemplate1, cmdLine(), buildTags(), pack, imp, textcommon)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gc.go - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - err = ioutil.WriteFile("zsyscall_aix_ppc64_gc.go", - []byte(fmt.Sprintf(srcTemplate2, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, textgc)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - - // Print zsyscall_aix_ppc64_gccgo.go - err = ioutil.WriteFile("zsyscall_aix_ppc64_gccgo.go", - []byte(fmt.Sprintf(srcTemplate3, cmdLine(), buildTags(), pack, cExtern, imp, textgccgo)), - 0644) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } -} - -const srcTemplate1 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "unsafe" -) - - -%s - -%s -` -const srcTemplate2 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build !gccgo - -package %s - -import ( - "unsafe" -) -%s -%s -%s -type syscallFunc uintptr - -var ( -%s -) - -// Implemented in runtime/syscall_aix.go. -func rawSyscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) -func syscall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno) - -%s -` -const srcTemplate3 = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s -// +build gccgo - -package %s - -%s -*/ -import "C" -import ( - "syscall" -) - - -%s - -%s -` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go b/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go deleted file mode 100644 index 3d864738b6..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksyscall_solaris.go +++ /dev/null @@ -1,335 +0,0 @@ -// Copyright 2019 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. - -// +build ignore - -/* - This program reads a file containing function prototypes - (like syscall_solaris.go) and generates system call bodies. - The prototypes are marked by lines beginning with "//sys" - and read like func declarations if //sys is replaced by func, but: - * The parameter lists must give a name for each argument. - This includes return parameters. - * The parameter lists must give a type for each argument: - the (x, y, z int) shorthand is not allowed. - * If the return parameter is an error number, it must be named err. - * If go func name needs to be different than its libc name, - * or the function is not in libc, name could be specified - * at the end, after "=" sign, like - //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt -*/ - -package main - -import ( - "bufio" - "flag" - "fmt" - "os" - "regexp" - "strings" -) - -var ( - b32 = flag.Bool("b32", false, "32bit big-endian") - l32 = flag.Bool("l32", false, "32bit little-endian") - tags = flag.String("tags", "", "build tags") -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksyscall_solaris.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return *tags -} - -// Param is function parameter -type Param struct { - Name string - Type string -} - -// usage prints the program usage -func usage() { - fmt.Fprintf(os.Stderr, "usage: go run mksyscall_solaris.go [-b32 | -l32] [-tags x,y] [file ...]\n") - os.Exit(1) -} - -// parseParamList parses parameter list and returns a slice of parameters -func parseParamList(list string) []string { - list = strings.TrimSpace(list) - if list == "" { - return []string{} - } - return regexp.MustCompile(`\s*,\s*`).Split(list, -1) -} - -// parseParam splits a parameter into name and type -func parseParam(p string) Param { - ps := regexp.MustCompile(`^(\S*) (\S*)$`).FindStringSubmatch(p) - if ps == nil { - fmt.Fprintf(os.Stderr, "malformed parameter: %s\n", p) - os.Exit(1) - } - return Param{ps[1], ps[2]} -} - -func main() { - flag.Usage = usage - flag.Parse() - if len(flag.Args()) <= 0 { - fmt.Fprintf(os.Stderr, "no files to parse provided\n") - usage() - } - - endianness := "" - if *b32 { - endianness = "big-endian" - } else if *l32 { - endianness = "little-endian" - } - - pack := "" - text := "" - dynimports := "" - linknames := "" - var vars []string - for _, path := range flag.Args() { - file, err := os.Open(path) - if err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - s := bufio.NewScanner(file) - for s.Scan() { - t := s.Text() - t = strings.TrimSpace(t) - t = regexp.MustCompile(`\s+`).ReplaceAllString(t, ` `) - if p := regexp.MustCompile(`^package (\S+)$`).FindStringSubmatch(t); p != nil && pack == "" { - pack = p[1] - } - nonblock := regexp.MustCompile(`^\/\/sysnb `).FindStringSubmatch(t) - if regexp.MustCompile(`^\/\/sys `).FindStringSubmatch(t) == nil && nonblock == nil { - continue - } - - // Line must be of the form - // func Open(path string, mode int, perm int) (fd int, err error) - // Split into name, in params, out params. - f := regexp.MustCompile(`^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$`).FindStringSubmatch(t) - if f == nil { - fmt.Fprintf(os.Stderr, "%s:%s\nmalformed //sys declaration\n", path, t) - os.Exit(1) - } - funct, inps, outps, modname, sysname := f[2], f[3], f[4], f[5], f[6] - - // Split argument lists on comma. - in := parseParamList(inps) - out := parseParamList(outps) - - inps = strings.Join(in, ", ") - outps = strings.Join(out, ", ") - - // Try in vain to keep people from editing this file. - // The theory is that they jump into the middle of the file - // without reading the header. - text += "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n" - - // So file name. - if modname == "" { - modname = "libc" - } - - // System call name. - if sysname == "" { - sysname = funct - } - - // System call pointer variable name. - sysvarname := fmt.Sprintf("proc%s", sysname) - - strconvfunc := "BytePtrFromString" - strconvtype := "*byte" - - sysname = strings.ToLower(sysname) // All libc functions are lowercase. - - // Runtime import of function to allow cross-platform builds. - dynimports += fmt.Sprintf("//go:cgo_import_dynamic libc_%s %s \"%s.so\"\n", sysname, sysname, modname) - // Link symbol to proc address variable. - linknames += fmt.Sprintf("//go:linkname %s libc_%s\n", sysvarname, sysname) - // Library proc address variable. - vars = append(vars, sysvarname) - - // Go function header. - outlist := strings.Join(out, ", ") - if outlist != "" { - outlist = fmt.Sprintf(" (%s)", outlist) - } - if text != "" { - text += "\n" - } - text += fmt.Sprintf("func %s(%s)%s {\n", funct, strings.Join(in, ", "), outlist) - - // Check if err return available - errvar := "" - for _, param := range out { - p := parseParam(param) - if p.Type == "error" { - errvar = p.Name - continue - } - } - - // Prepare arguments to Syscall. - var args []string - n := 0 - for _, param := range in { - p := parseParam(param) - if regexp.MustCompile(`^\*`).FindStringSubmatch(p.Type) != nil { - args = append(args, "uintptr(unsafe.Pointer("+p.Name+"))") - } else if p.Type == "string" && errvar != "" { - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, %s = %s(%s)\n", n, errvar, strconvfunc, p.Name) - text += fmt.Sprintf("\tif %s != nil {\n\t\treturn\n\t}\n", errvar) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if p.Type == "string" { - fmt.Fprintf(os.Stderr, path+":"+funct+" uses string arguments, but has no error return\n") - text += fmt.Sprintf("\tvar _p%d %s\n", n, strconvtype) - text += fmt.Sprintf("\t_p%d, _ = %s(%s)\n", n, strconvfunc, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n)) - n++ - } else if s := regexp.MustCompile(`^\[\](.*)`).FindStringSubmatch(p.Type); s != nil { - // Convert slice into pointer, length. - // Have to be careful not to take address of &a[0] if len == 0: - // pass nil in that case. - text += fmt.Sprintf("\tvar _p%d *%s\n", n, s[1]) - text += fmt.Sprintf("\tif len(%s) > 0 {\n\t\t_p%d = &%s[0]\n\t}\n", p.Name, n, p.Name) - args = append(args, fmt.Sprintf("uintptr(unsafe.Pointer(_p%d))", n), fmt.Sprintf("uintptr(len(%s))", p.Name)) - n++ - } else if p.Type == "int64" && endianness != "" { - if endianness == "big-endian" { - args = append(args, fmt.Sprintf("uintptr(%s>>32)", p.Name), fmt.Sprintf("uintptr(%s)", p.Name)) - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name), fmt.Sprintf("uintptr(%s>>32)", p.Name)) - } - } else if p.Type == "bool" { - text += fmt.Sprintf("\tvar _p%d uint32\n", n) - text += fmt.Sprintf("\tif %s {\n\t\t_p%d = 1\n\t} else {\n\t\t_p%d = 0\n\t}\n", p.Name, n, n) - args = append(args, fmt.Sprintf("uintptr(_p%d)", n)) - n++ - } else { - args = append(args, fmt.Sprintf("uintptr(%s)", p.Name)) - } - } - nargs := len(args) - - // Determine which form to use; pad args with zeros. - asm := "sysvicall6" - if nonblock != nil { - asm = "rawSysvicall6" - } - if len(args) <= 6 { - for len(args) < 6 { - args = append(args, "0") - } - } else { - fmt.Fprintf(os.Stderr, "%s: too many arguments to system call\n", path) - os.Exit(1) - } - - // Actual call. - arglist := strings.Join(args, ", ") - call := fmt.Sprintf("%s(uintptr(unsafe.Pointer(&%s)), %d, %s)", asm, sysvarname, nargs, arglist) - - // Assign return values. - body := "" - ret := []string{"_", "_", "_"} - doErrno := false - for i := 0; i < len(out); i++ { - p := parseParam(out[i]) - reg := "" - if p.Name == "err" { - reg = "e1" - ret[2] = reg - doErrno = true - } else { - reg = fmt.Sprintf("r%d", i) - ret[i] = reg - } - if p.Type == "bool" { - reg = fmt.Sprintf("%d != 0", reg) - } - if p.Type == "int64" && endianness != "" { - // 64-bit number in r1:r0 or r0:r1. - if i+2 > len(out) { - fmt.Fprintf(os.Stderr, "%s: not enough registers for int64 return\n", path) - os.Exit(1) - } - if endianness == "big-endian" { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i, i+1) - } else { - reg = fmt.Sprintf("int64(r%d)<<32 | int64(r%d)", i+1, i) - } - ret[i] = fmt.Sprintf("r%d", i) - ret[i+1] = fmt.Sprintf("r%d", i+1) - } - if reg != "e1" { - body += fmt.Sprintf("\t%s = %s(%s)\n", p.Name, p.Type, reg) - } - } - if ret[0] == "_" && ret[1] == "_" && ret[2] == "_" { - text += fmt.Sprintf("\t%s\n", call) - } else { - text += fmt.Sprintf("\t%s, %s, %s := %s\n", ret[0], ret[1], ret[2], call) - } - text += body - - if doErrno { - text += "\tif e1 != 0 {\n" - text += "\t\terr = e1\n" - text += "\t}\n" - } - text += "\treturn\n" - text += "}\n" - } - if err := s.Err(); err != nil { - fmt.Fprintf(os.Stderr, err.Error()) - os.Exit(1) - } - file.Close() - } - imp := "" - if pack != "unix" { - imp = "import \"golang.org/x/sys/unix\"\n" - - } - vardecls := "\t" + strings.Join(vars, ",\n\t") - vardecls += " syscallFunc" - fmt.Printf(srcTemplate, cmdLine(), buildTags(), pack, imp, dynimports, linknames, vardecls, text) -} - -const srcTemplate = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package %s - -import ( - "syscall" - "unsafe" -) -%s -%s -%s -var ( -%s -) - -%s -` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go b/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go deleted file mode 100644 index 07f8960ff3..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/mksysnum.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2018 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. - -// +build ignore - -// Generate system call table for DragonFly, NetBSD, -// FreeBSD, OpenBSD or Darwin from master list -// (for example, /usr/src/sys/kern/syscalls.master or -// sys/syscall.h). -package main - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "regexp" - "strings" -) - -var ( - goos, goarch string -) - -// cmdLine returns this programs's commandline arguments -func cmdLine() string { - return "go run mksysnum.go " + strings.Join(os.Args[1:], " ") -} - -// buildTags returns build tags -func buildTags() string { - return fmt.Sprintf("%s,%s", goarch, goos) -} - -func checkErr(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - os.Exit(1) - } -} - -// source string and substring slice for regexp -type re struct { - str string // source string - sub []string // matched sub-string -} - -// Match performs regular expression match -func (r *re) Match(exp string) bool { - r.sub = regexp.MustCompile(exp).FindStringSubmatch(r.str) - if r.sub != nil { - return true - } - return false -} - -// fetchFile fetches a text file from URL -func fetchFile(URL string) io.Reader { - resp, err := http.Get(URL) - checkErr(err) - defer resp.Body.Close() - body, err := ioutil.ReadAll(resp.Body) - checkErr(err) - return strings.NewReader(string(body)) -} - -// readFile reads a text file from path -func readFile(path string) io.Reader { - file, err := os.Open(os.Args[1]) - checkErr(err) - return file -} - -func format(name, num, proto string) string { - name = strings.ToUpper(name) - // There are multiple entries for enosys and nosys, so comment them out. - nm := re{str: name} - if nm.Match(`^SYS_E?NOSYS$`) { - name = fmt.Sprintf("// %s", name) - } - if name == `SYS_SYS_EXIT` { - name = `SYS_EXIT` - } - return fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) -} - -func main() { - // Get the OS (using GOOS_TARGET if it exist) - goos = os.Getenv("GOOS_TARGET") - if goos == "" { - goos = os.Getenv("GOOS") - } - // Get the architecture (using GOARCH_TARGET if it exists) - goarch = os.Getenv("GOARCH_TARGET") - if goarch == "" { - goarch = os.Getenv("GOARCH") - } - // Check if GOOS and GOARCH environment variables are defined - if goarch == "" || goos == "" { - fmt.Fprintf(os.Stderr, "GOARCH or GOOS not defined in environment\n") - os.Exit(1) - } - - file := strings.TrimSpace(os.Args[1]) - var syscalls io.Reader - if strings.HasPrefix(file, "https://") || strings.HasPrefix(file, "http://") { - // Download syscalls.master file - syscalls = fetchFile(file) - } else { - syscalls = readFile(file) - } - - var text, line string - s := bufio.NewScanner(syscalls) - for s.Scan() { - t := re{str: line} - if t.Match(`^(.*)\\$`) { - // Handle continuation - line = t.sub[1] - line += strings.TrimLeft(s.Text(), " \t") - } else { - // New line - line = s.Text() - } - t = re{str: line} - if t.Match(`\\$`) { - continue - } - t = re{str: line} - - switch goos { - case "dragonfly": - if t.Match(`^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "freebsd": - if t.Match(`^([0-9]+)\s+\S+\s+(?:NO)?STD\s+({ \S+\s+(\w+).*)$`) { - num, proto := t.sub[1], t.sub[2] - name := fmt.Sprintf("SYS_%s", t.sub[3]) - text += format(name, num, proto) - } - case "openbsd": - if t.Match(`^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$`) { - num, proto, name := t.sub[1], t.sub[3], t.sub[4] - text += format(name, num, proto) - } - case "netbsd": - if t.Match(`^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$`) { - num, proto, compat := t.sub[1], t.sub[6], t.sub[8] - name := t.sub[7] + "_" + t.sub[9] - if t.sub[11] != "" { - name = t.sub[7] + "_" + t.sub[11] - } - name = strings.ToUpper(name) - if compat == "" || compat == "13" || compat == "30" || compat == "50" { - text += fmt.Sprintf(" %s = %s; // %s\n", name, num, proto) - } - } - case "darwin": - if t.Match(`^#define\s+SYS_(\w+)\s+([0-9]+)`) { - name, num := t.sub[1], t.sub[2] - name = strings.ToUpper(name) - text += fmt.Sprintf(" SYS_%s = %s;\n", name, num) - } - default: - fmt.Fprintf(os.Stderr, "unrecognized GOOS=%s\n", goos) - os.Exit(1) - - } - } - err := s.Err() - checkErr(err) - - fmt.Printf(template, cmdLine(), buildTags(), text) -} - -const template = `// %s -// Code generated by the command above; see README.md. DO NOT EDIT. - -// +build %s - -package unix - -const( -%s)` diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go b/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go deleted file mode 100644 index 25e834940d..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_aix.go +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright 2018 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. - -// +build ignore -// +build aix - -/* -Input to cgo -godefs. See also mkerrors.sh and mkall.sh -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - - -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -type off64 C.off64_t -type off C.off_t -type Mode_t C.mode_t - -// Time - -type Timespec C.struct_timespec - -type StTimespec C.struct_st_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Timex C.struct_timex - -type Time_t C.time_t - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -type Timezone C.struct_timezone - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit64 - -type Pid_t C.pid_t - -type _Gid_t C.gid_t - -type dev_t C.dev_t - -// Files - -type Stat_t C.struct_stat - -type StatxTimestamp C.struct_statx_timestamp - -type Statx_t C.struct_statx - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Cmsghdr C.struct_cmsghdr - -type ICMPv6Filter C.struct_icmp6_filter - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type Linger C.struct_linger - -type Msghdr C.struct_msghdr - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr -) - -type IfMsgHdr C.struct_if_msghdr - -// Misc - -type FdSet C.fd_set - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -type Sigset_t C.sigset_t - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -//poll - -type PollFd struct { - Fd int32 - Events uint16 - Revents uint16 -} - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -//flock_t - -type Flock_t C.struct_flock64 - -// Statfs - -type Fsid_t C.struct_fsid_t -type Fsid64_t C.struct_fsid64_t - -type Statfs_t C.struct_statfs - -const RNDGETENTCNT = 0x80045200 diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go b/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go deleted file mode 100644 index 9fd2aaa6a2..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_darwin.go +++ /dev/null @@ -1,277 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define __DARWIN_UNIX03 0 -#define KERNEL -#define _DARWIN_USE_64_BIT_INODE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat64 - -type Statfs_t C.struct_statfs64 - -type Flock_t C.struct_flock - -type Fstore_t C.struct_fstore - -type Radvisory_t C.struct_radvisory - -type Fbootstraptransfer_t C.struct_fbootstraptransfer - -type Log2phys_t C.struct_log2phys - -type Fsid C.struct_fsid - -type Dirent C.struct_dirent - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet4Pktinfo C.struct_in_pktinfo - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfmaMsghdr2 C.struct_ifma_msghdr2 - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// uname - -type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go b/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go deleted file mode 100644 index 3365dd79d0..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_dragonfly.go +++ /dev/null @@ -1,263 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Uname - -type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go deleted file mode 100644 index 7470798951..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_freebsd.go +++ /dev/null @@ -1,356 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define _WANT_FREEBSD11_STAT 1 -#define _WANT_FREEBSD11_STATFS 1 -#define _WANT_FREEBSD11_DIRENT 1 -#define _WANT_FREEBSD11_KEVENT 1 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -// This structure is a duplicate of if_data on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_data8 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; -// FIXME: these are now unions, so maybe need to change definitions? -#undef ifi_epoch - time_t ifi_epoch; -#undef ifi_lastchange - struct timeval ifi_lastchange; -}; - -// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. -// See /usr/include/net/if.h. -struct if_msghdr8 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data8 ifm_data; -}; -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -const ( - _statfsVersion = C.STATFS_VERSION - _dirblksiz = C.DIRBLKSIZ -) - -type Stat_t C.struct_stat - -type stat_freebsd11_t C.struct_freebsd11_stat - -type Statfs_t C.struct_statfs - -type statfs_freebsd11_t C.struct_freebsd11_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type dirent_freebsd11 C.struct_freebsd11_dirent - -type Fsid C.struct_fsid - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPMreqn C.struct_ip_mreqn - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPMreqn = C.sizeof_struct_ip_mreqn - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent_freebsd11 - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - sizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 - sizeofIfData = C.sizeof_struct_if_data - SizeofIfData = C.sizeof_struct_if_data8 - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type ifMsghdr C.struct_if_msghdr - -type IfMsghdr C.struct_if_msghdr8 - -type ifData C.struct_if_data - -type IfData C.struct_if_data8 - -type IfaMsghdr C.struct_ifa_msghdr - -type IfmaMsghdr C.struct_ifma_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr - SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfZbuf C.struct_bpf_zbuf - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfZbufHeader C.struct_bpf_zbuf_header - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLINIGNEOF = C.POLLINIGNEOF - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Capabilities - -type CapRights C.struct_cap_rights - -// Uname - -type Utsname C.struct_utsname diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go deleted file mode 100644 index 2dd4f9542c..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_netbsd.go +++ /dev/null @@ -1,289 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Advice to Fadvise - -const ( - FADV_NORMAL = C.POSIX_FADV_NORMAL - FADV_RANDOM = C.POSIX_FADV_RANDOM - FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL - FADV_WILLNEED = C.POSIX_FADV_WILLNEED - FADV_DONTNEED = C.POSIX_FADV_DONTNEED - FADV_NOREUSE = C.POSIX_FADV_NOREUSE -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -type Ptmget C.struct_ptmget - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Sysctl - -type Sysctlnode C.struct_sysctlnode - -// Uname - -type Utsname C.struct_utsname - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go b/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go deleted file mode 100644 index 8aafbe4469..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_openbsd.go +++ /dev/null @@ -1,282 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Statfs_t C.struct_statfs - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -type Fsid C.fsid_t - -// File system limits - -const ( - PathMax = C.PATH_MAX -) - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Ptrace requests - -const ( - PTRACE_TRACEME = C.PT_TRACE_ME - PTRACE_CONT = C.PT_CONTINUE - PTRACE_KILL = C.PT_KILL -) - -// Events (kqueue, kevent) - -type Kevent_t C.struct_kevent - -// Select - -type FdSet C.fd_set - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type IfAnnounceMsghdr C.struct_if_announcemsghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -type Mclpool C.struct_mclpool - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfHdr C.struct_bpf_hdr - -type BpfTimeval C.struct_bpf_timeval - -// Terminal handling - -type Termios C.struct_termios - -type Winsize C.struct_winsize - -// fchmodat-like syscalls. - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW -) - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) - -// Signal Sets - -type Sigset_t C.sigset_t - -// Uname - -type Utsname C.struct_utsname - -// Uvmexp - -const SizeofUvmexp = C.sizeof_struct_uvmexp - -type Uvmexp C.struct_uvmexp - -// Clockinfo - -const SizeofClockinfo = C.sizeof_struct_clockinfo - -type Clockinfo C.struct_clockinfo diff --git a/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go b/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go deleted file mode 100644 index 2b716f9348..0000000000 --- a/src/cmd/vendor/golang.org/x/sys/unix/types_solaris.go +++ /dev/null @@ -1,266 +0,0 @@ -// 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. - -// +build ignore - -/* -Input to cgo -godefs. See README.md -*/ - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package unix - -/* -#define KERNEL -// These defines ensure that builds done on newer versions of Solaris are -// backwards-compatible with older versions of Solaris and -// OpenSolaris-based derivatives. -#define __USE_SUNOS_SOCKETS__ // msghdr -#define __USE_LEGACY_PROTOTYPES__ // iovec -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -enum { - sizeofPtr = sizeof(void*), -}; - -union sockaddr_all { - struct sockaddr s1; // this one gets used for fields - struct sockaddr_in s2; // these pad it out - struct sockaddr_in6 s3; - struct sockaddr_un s4; - struct sockaddr_dl s5; -}; - -struct sockaddr_any { - struct sockaddr addr; - char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; -}; - -*/ -import "C" - -// Machine characteristics - -const ( - SizeofPtr = C.sizeofPtr - SizeofShort = C.sizeof_short - SizeofInt = C.sizeof_int - SizeofLong = C.sizeof_long - SizeofLongLong = C.sizeof_longlong - PathMax = C.PATH_MAX - MaxHostNameLen = C.MAXHOSTNAMELEN -) - -// Basic types - -type ( - _C_short C.short - _C_int C.int - _C_long C.long - _C_long_long C.longlong -) - -// Time - -type Timespec C.struct_timespec - -type Timeval C.struct_timeval - -type Timeval32 C.struct_timeval32 - -type Tms C.struct_tms - -type Utimbuf C.struct_utimbuf - -// Processes - -type Rusage C.struct_rusage - -type Rlimit C.struct_rlimit - -type _Gid_t C.gid_t - -// Files - -type Stat_t C.struct_stat - -type Flock_t C.struct_flock - -type Dirent C.struct_dirent - -// Filesystems - -type _Fsblkcnt_t C.fsblkcnt_t - -type Statvfs_t C.struct_statvfs - -// Sockets - -type RawSockaddrInet4 C.struct_sockaddr_in - -type RawSockaddrInet6 C.struct_sockaddr_in6 - -type RawSockaddrUnix C.struct_sockaddr_un - -type RawSockaddrDatalink C.struct_sockaddr_dl - -type RawSockaddr C.struct_sockaddr - -type RawSockaddrAny C.struct_sockaddr_any - -type _Socklen C.socklen_t - -type Linger C.struct_linger - -type Iovec C.struct_iovec - -type IPMreq C.struct_ip_mreq - -type IPv6Mreq C.struct_ipv6_mreq - -type Msghdr C.struct_msghdr - -type Cmsghdr C.struct_cmsghdr - -type Inet6Pktinfo C.struct_in6_pktinfo - -type IPv6MTUInfo C.struct_ip6_mtuinfo - -type ICMPv6Filter C.struct_icmp6_filter - -const ( - SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in - SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - SizeofSockaddrAny = C.sizeof_struct_sockaddr_any - SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un - SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl - SizeofLinger = C.sizeof_struct_linger - SizeofIPMreq = C.sizeof_struct_ip_mreq - SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - SizeofMsghdr = C.sizeof_struct_msghdr - SizeofCmsghdr = C.sizeof_struct_cmsghdr - SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo - SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -// Select - -type FdSet C.fd_set - -// Misc - -type Utsname C.struct_utsname - -type Ustat_t C.struct_ustat - -const ( - AT_FDCWD = C.AT_FDCWD - AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW - AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW - AT_REMOVEDIR = C.AT_REMOVEDIR - AT_EACCESS = C.AT_EACCESS -) - -// Routing and interface messages - -const ( - SizeofIfMsghdr = C.sizeof_struct_if_msghdr - SizeofIfData = C.sizeof_struct_if_data - SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr - SizeofRtMsghdr = C.sizeof_struct_rt_msghdr - SizeofRtMetrics = C.sizeof_struct_rt_metrics -) - -type IfMsghdr C.struct_if_msghdr - -type IfData C.struct_if_data - -type IfaMsghdr C.struct_ifa_msghdr - -type RtMsghdr C.struct_rt_msghdr - -type RtMetrics C.struct_rt_metrics - -// Berkeley packet filter - -const ( - SizeofBpfVersion = C.sizeof_struct_bpf_version - SizeofBpfStat = C.sizeof_struct_bpf_stat - SizeofBpfProgram = C.sizeof_struct_bpf_program - SizeofBpfInsn = C.sizeof_struct_bpf_insn - SizeofBpfHdr = C.sizeof_struct_bpf_hdr -) - -type BpfVersion C.struct_bpf_version - -type BpfStat C.struct_bpf_stat - -type BpfProgram C.struct_bpf_program - -type BpfInsn C.struct_bpf_insn - -type BpfTimeval C.struct_bpf_timeval - -type BpfHdr C.struct_bpf_hdr - -// Terminal handling - -type Termios C.struct_termios - -type Termio C.struct_termio - -type Winsize C.struct_winsize - -// poll - -type PollFd C.struct_pollfd - -const ( - POLLERR = C.POLLERR - POLLHUP = C.POLLHUP - POLLIN = C.POLLIN - POLLNVAL = C.POLLNVAL - POLLOUT = C.POLLOUT - POLLPRI = C.POLLPRI - POLLRDBAND = C.POLLRDBAND - POLLRDNORM = C.POLLRDNORM - POLLWRBAND = C.POLLWRBAND - POLLWRNORM = C.POLLWRNORM -) diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go index 5be1ef0d57..b5161836a5 100644 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel/lostcancel.go @@ -3,7 +3,7 @@ // license that can be found in the LICENSE file. // Package lostcancel defines an Analyzer that checks for failure to -// call a context cancellation function. +// call a context cancelation function. package lostcancel import ( @@ -20,7 +20,7 @@ import ( const Doc = `check cancel func returned by context.WithCancel is called -The cancellation function returned by context.WithCancel, WithTimeout, +The cancelation function returned by context.WithCancel, WithTimeout, and WithDeadline must be called or the new context will remain live until its parent context is cancelled. (The background context is never cancelled.)` diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/main.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/main.go deleted file mode 100644 index 844e8f3dac..0000000000 --- a/src/cmd/vendor/golang.org/x/tools/go/analysis/unitchecker/main.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build ignore - -// This file provides an example command for static checkers -// conforming to the golang.org/x/tools/go/analysis API. -// It serves as a model for the behavior of the cmd/vet tool in $GOROOT. -// Being based on the unitchecker driver, it must be run by go vet: -// -// $ go build -o unitchecker main.go -// $ go vet -vettool=unitchecker my/project/... -// -// For a checker also capable of running standalone, use multichecker. -package main - -import ( - "golang.org/x/tools/go/analysis/unitchecker" - - "golang.org/x/tools/go/analysis/passes/asmdecl" - "golang.org/x/tools/go/analysis/passes/assign" - "golang.org/x/tools/go/analysis/passes/atomic" - "golang.org/x/tools/go/analysis/passes/bools" - "golang.org/x/tools/go/analysis/passes/buildtag" - "golang.org/x/tools/go/analysis/passes/cgocall" - "golang.org/x/tools/go/analysis/passes/composite" - "golang.org/x/tools/go/analysis/passes/copylock" - "golang.org/x/tools/go/analysis/passes/httpresponse" - "golang.org/x/tools/go/analysis/passes/loopclosure" - "golang.org/x/tools/go/analysis/passes/lostcancel" - "golang.org/x/tools/go/analysis/passes/nilfunc" - "golang.org/x/tools/go/analysis/passes/printf" - "golang.org/x/tools/go/analysis/passes/shift" - "golang.org/x/tools/go/analysis/passes/stdmethods" - "golang.org/x/tools/go/analysis/passes/structtag" - "golang.org/x/tools/go/analysis/passes/tests" - "golang.org/x/tools/go/analysis/passes/unmarshal" - "golang.org/x/tools/go/analysis/passes/unreachable" - "golang.org/x/tools/go/analysis/passes/unsafeptr" - "golang.org/x/tools/go/analysis/passes/unusedresult" -) - -func main() { - unitchecker.Main( - asmdecl.Analyzer, - assign.Analyzer, - atomic.Analyzer, - bools.Analyzer, - buildtag.Analyzer, - cgocall.Analyzer, - composite.Analyzer, - copylock.Analyzer, - httpresponse.Analyzer, - loopclosure.Analyzer, - lostcancel.Analyzer, - nilfunc.Analyzer, - printf.Analyzer, - shift.Analyzer, - stdmethods.Analyzer, - structtag.Analyzer, - tests.Analyzer, - unmarshal.Analyzer, - unreachable.Analyzer, - unsafeptr.Analyzer, - unusedresult.Analyzer, - ) -} diff --git a/src/vendor/golang.org/x/net/lif/defs_solaris.go b/src/vendor/golang.org/x/net/lif/defs_solaris.go deleted file mode 100644 index 02c19981d2..0000000000 --- a/src/vendor/golang.org/x/net/lif/defs_solaris.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package lif - -/* -#include -#include - -#include -#include -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_INET6 = C.AF_INET6 - - sysSOCK_DGRAM = C.SOCK_DGRAM -) - -type sockaddrStorage C.struct_sockaddr_storage - -const ( - sysLIFC_NOXMIT = C.LIFC_NOXMIT - sysLIFC_EXTERNAL_SOURCE = C.LIFC_EXTERNAL_SOURCE - sysLIFC_TEMPORARY = C.LIFC_TEMPORARY - sysLIFC_ALLZONES = C.LIFC_ALLZONES - sysLIFC_UNDER_IPMP = C.LIFC_UNDER_IPMP - sysLIFC_ENABLED = C.LIFC_ENABLED - - sysSIOCGLIFADDR = C.SIOCGLIFADDR - sysSIOCGLIFDSTADDR = C.SIOCGLIFDSTADDR - sysSIOCGLIFFLAGS = C.SIOCGLIFFLAGS - sysSIOCGLIFMTU = C.SIOCGLIFMTU - sysSIOCGLIFNETMASK = C.SIOCGLIFNETMASK - sysSIOCGLIFMETRIC = C.SIOCGLIFMETRIC - sysSIOCGLIFNUM = C.SIOCGLIFNUM - sysSIOCGLIFINDEX = C.SIOCGLIFINDEX - sysSIOCGLIFSUBNET = C.SIOCGLIFSUBNET - sysSIOCGLIFLNKINFO = C.SIOCGLIFLNKINFO - sysSIOCGLIFCONF = C.SIOCGLIFCONF - sysSIOCGLIFHWADDR = C.SIOCGLIFHWADDR -) - -const ( - sysIFF_UP = C.IFF_UP - sysIFF_BROADCAST = C.IFF_BROADCAST - sysIFF_DEBUG = C.IFF_DEBUG - sysIFF_LOOPBACK = C.IFF_LOOPBACK - sysIFF_POINTOPOINT = C.IFF_POINTOPOINT - sysIFF_NOTRAILERS = C.IFF_NOTRAILERS - sysIFF_RUNNING = C.IFF_RUNNING - sysIFF_NOARP = C.IFF_NOARP - sysIFF_PROMISC = C.IFF_PROMISC - sysIFF_ALLMULTI = C.IFF_ALLMULTI - sysIFF_INTELLIGENT = C.IFF_INTELLIGENT - sysIFF_MULTICAST = C.IFF_MULTICAST - sysIFF_MULTI_BCAST = C.IFF_MULTI_BCAST - sysIFF_UNNUMBERED = C.IFF_UNNUMBERED - sysIFF_PRIVATE = C.IFF_PRIVATE -) - -const ( - sizeofLifnum = C.sizeof_struct_lifnum - sizeofLifreq = C.sizeof_struct_lifreq - sizeofLifconf = C.sizeof_struct_lifconf - sizeofLifIfinfoReq = C.sizeof_struct_lif_ifinfo_req -) - -type lifnum C.struct_lifnum - -type lifreq C.struct_lifreq - -type lifconf C.struct_lifconf - -type lifIfinfoReq C.struct_lif_ifinfo_req - -const ( - sysIFT_IPV4 = C.IFT_IPV4 - sysIFT_IPV6 = C.IFT_IPV6 - sysIFT_6TO4 = C.IFT_6TO4 -) diff --git a/src/vendor/golang.org/x/net/nettest/conntest.go b/src/vendor/golang.org/x/net/nettest/conntest.go index adbcaf02c6..5bd3a8c68c 100644 --- a/src/vendor/golang.org/x/net/nettest/conntest.go +++ b/src/vendor/golang.org/x/net/nettest/conntest.go @@ -138,7 +138,7 @@ func testPingPong(t *testing.T, c1, c2 net.Conn) { } // testRacyRead tests that it is safe to mutate the input Read buffer -// immediately after cancellation has occurred. +// immediately after cancelation has occurred. func testRacyRead(t *testing.T, c1, c2 net.Conn) { go chunkedCopy(c2, rand.New(rand.NewSource(0))) @@ -166,7 +166,7 @@ func testRacyRead(t *testing.T, c1, c2 net.Conn) { } // testRacyWrite tests that it is safe to mutate the input Write buffer -// immediately after cancellation has occurred. +// immediately after cancelation has occurred. func testRacyWrite(t *testing.T, c1, c2 net.Conn) { go chunkedCopy(ioutil.Discard, c2) @@ -314,7 +314,7 @@ func testCloseTimeout(t *testing.T, c1, c2 net.Conn) { defer wg.Wait() wg.Add(3) - // Test for cancellation upon connection closure. + // Test for cancelation upon connection closure. c1.SetDeadline(neverTimeout) go func() { defer wg.Done() diff --git a/src/vendor/golang.org/x/net/route/defs_darwin.go b/src/vendor/golang.org/x/net/route/defs_darwin.go deleted file mode 100644 index e7716442d2..0000000000 --- a/src/vendor/golang.org/x/net/route/defs_darwin.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -package route - -/* -#include -#include - -#include -#include -#include - -#include -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_ROUTE = C.AF_ROUTE - sysAF_LINK = C.AF_LINK - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW - - sysNET_RT_DUMP = C.NET_RT_DUMP - sysNET_RT_FLAGS = C.NET_RT_FLAGS - sysNET_RT_IFLIST = C.NET_RT_IFLIST - sysNET_RT_STAT = C.NET_RT_STAT - sysNET_RT_TRASH = C.NET_RT_TRASH - sysNET_RT_IFLIST2 = C.NET_RT_IFLIST2 - sysNET_RT_DUMP2 = C.NET_RT_DUMP2 - sysNET_RT_MAXID = C.NET_RT_MAXID -) - -const ( - sysCTL_MAXNAME = C.CTL_MAXNAME - - sysCTL_UNSPEC = C.CTL_UNSPEC - sysCTL_KERN = C.CTL_KERN - sysCTL_VM = C.CTL_VM - sysCTL_VFS = C.CTL_VFS - sysCTL_NET = C.CTL_NET - sysCTL_DEBUG = C.CTL_DEBUG - sysCTL_HW = C.CTL_HW - sysCTL_MACHDEP = C.CTL_MACHDEP - sysCTL_USER = C.CTL_USER - sysCTL_MAXID = C.CTL_MAXID -) - -const ( - sysRTM_VERSION = C.RTM_VERSION - - sysRTM_ADD = C.RTM_ADD - sysRTM_DELETE = C.RTM_DELETE - sysRTM_CHANGE = C.RTM_CHANGE - sysRTM_GET = C.RTM_GET - sysRTM_LOSING = C.RTM_LOSING - sysRTM_REDIRECT = C.RTM_REDIRECT - sysRTM_MISS = C.RTM_MISS - sysRTM_LOCK = C.RTM_LOCK - sysRTM_OLDADD = C.RTM_OLDADD - sysRTM_OLDDEL = C.RTM_OLDDEL - sysRTM_RESOLVE = C.RTM_RESOLVE - sysRTM_NEWADDR = C.RTM_NEWADDR - sysRTM_DELADDR = C.RTM_DELADDR - sysRTM_IFINFO = C.RTM_IFINFO - sysRTM_NEWMADDR = C.RTM_NEWMADDR - sysRTM_DELMADDR = C.RTM_DELMADDR - sysRTM_IFINFO2 = C.RTM_IFINFO2 - sysRTM_NEWMADDR2 = C.RTM_NEWMADDR2 - sysRTM_GET2 = C.RTM_GET2 - - sysRTA_DST = C.RTA_DST - sysRTA_GATEWAY = C.RTA_GATEWAY - sysRTA_NETMASK = C.RTA_NETMASK - sysRTA_GENMASK = C.RTA_GENMASK - sysRTA_IFP = C.RTA_IFP - sysRTA_IFA = C.RTA_IFA - sysRTA_AUTHOR = C.RTA_AUTHOR - sysRTA_BRD = C.RTA_BRD - - sysRTAX_DST = C.RTAX_DST - sysRTAX_GATEWAY = C.RTAX_GATEWAY - sysRTAX_NETMASK = C.RTAX_NETMASK - sysRTAX_GENMASK = C.RTAX_GENMASK - sysRTAX_IFP = C.RTAX_IFP - sysRTAX_IFA = C.RTAX_IFA - sysRTAX_AUTHOR = C.RTAX_AUTHOR - sysRTAX_BRD = C.RTAX_BRD - sysRTAX_MAX = C.RTAX_MAX -) - -const ( - sizeofIfMsghdrDarwin15 = C.sizeof_struct_if_msghdr - sizeofIfaMsghdrDarwin15 = C.sizeof_struct_ifa_msghdr - sizeofIfmaMsghdrDarwin15 = C.sizeof_struct_ifma_msghdr - sizeofIfMsghdr2Darwin15 = C.sizeof_struct_if_msghdr2 - sizeofIfmaMsghdr2Darwin15 = C.sizeof_struct_ifma_msghdr2 - sizeofIfDataDarwin15 = C.sizeof_struct_if_data - sizeofIfData64Darwin15 = C.sizeof_struct_if_data64 - - sizeofRtMsghdrDarwin15 = C.sizeof_struct_rt_msghdr - sizeofRtMsghdr2Darwin15 = C.sizeof_struct_rt_msghdr2 - sizeofRtMetricsDarwin15 = C.sizeof_struct_rt_metrics - - sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 -) diff --git a/src/vendor/golang.org/x/net/route/defs_dragonfly.go b/src/vendor/golang.org/x/net/route/defs_dragonfly.go deleted file mode 100644 index dd31de269a..0000000000 --- a/src/vendor/golang.org/x/net/route/defs_dragonfly.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -package route - -/* -#include -#include - -#include -#include -#include - -#include -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_ROUTE = C.AF_ROUTE - sysAF_LINK = C.AF_LINK - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW - - sysNET_RT_DUMP = C.NET_RT_DUMP - sysNET_RT_FLAGS = C.NET_RT_FLAGS - sysNET_RT_IFLIST = C.NET_RT_IFLIST - sysNET_RT_MAXID = C.NET_RT_MAXID -) - -const ( - sysCTL_MAXNAME = C.CTL_MAXNAME - - sysCTL_UNSPEC = C.CTL_UNSPEC - sysCTL_KERN = C.CTL_KERN - sysCTL_VM = C.CTL_VM - sysCTL_VFS = C.CTL_VFS - sysCTL_NET = C.CTL_NET - sysCTL_DEBUG = C.CTL_DEBUG - sysCTL_HW = C.CTL_HW - sysCTL_MACHDEP = C.CTL_MACHDEP - sysCTL_USER = C.CTL_USER - sysCTL_P1003_1B = C.CTL_P1003_1B - sysCTL_LWKT = C.CTL_LWKT - sysCTL_MAXID = C.CTL_MAXID -) - -const ( - sysRTM_VERSION = C.RTM_VERSION - - sysRTM_ADD = C.RTM_ADD - sysRTM_DELETE = C.RTM_DELETE - sysRTM_CHANGE = C.RTM_CHANGE - sysRTM_GET = C.RTM_GET - sysRTM_LOSING = C.RTM_LOSING - sysRTM_REDIRECT = C.RTM_REDIRECT - sysRTM_MISS = C.RTM_MISS - sysRTM_LOCK = C.RTM_LOCK - sysRTM_OLDADD = C.RTM_OLDADD - sysRTM_OLDDEL = C.RTM_OLDDEL - sysRTM_RESOLVE = C.RTM_RESOLVE - sysRTM_NEWADDR = C.RTM_NEWADDR - sysRTM_DELADDR = C.RTM_DELADDR - sysRTM_IFINFO = C.RTM_IFINFO - sysRTM_NEWMADDR = C.RTM_NEWMADDR - sysRTM_DELMADDR = C.RTM_DELMADDR - sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE - sysRTM_IEEE80211 = C.RTM_IEEE80211 - - sysRTA_DST = C.RTA_DST - sysRTA_GATEWAY = C.RTA_GATEWAY - sysRTA_NETMASK = C.RTA_NETMASK - sysRTA_GENMASK = C.RTA_GENMASK - sysRTA_IFP = C.RTA_IFP - sysRTA_IFA = C.RTA_IFA - sysRTA_AUTHOR = C.RTA_AUTHOR - sysRTA_BRD = C.RTA_BRD - sysRTA_MPLS1 = C.RTA_MPLS1 - sysRTA_MPLS2 = C.RTA_MPLS2 - sysRTA_MPLS3 = C.RTA_MPLS3 - - sysRTAX_DST = C.RTAX_DST - sysRTAX_GATEWAY = C.RTAX_GATEWAY - sysRTAX_NETMASK = C.RTAX_NETMASK - sysRTAX_GENMASK = C.RTAX_GENMASK - sysRTAX_IFP = C.RTAX_IFP - sysRTAX_IFA = C.RTAX_IFA - sysRTAX_AUTHOR = C.RTAX_AUTHOR - sysRTAX_BRD = C.RTAX_BRD - sysRTAX_MPLS1 = C.RTAX_MPLS1 - sysRTAX_MPLS2 = C.RTAX_MPLS2 - sysRTAX_MPLS3 = C.RTAX_MPLS3 - sysRTAX_MAX = C.RTAX_MAX -) - -const ( - sizeofIfMsghdrDragonFlyBSD4 = C.sizeof_struct_if_msghdr - sizeofIfaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifa_msghdr - sizeofIfmaMsghdrDragonFlyBSD4 = C.sizeof_struct_ifma_msghdr - sizeofIfAnnouncemsghdrDragonFlyBSD4 = C.sizeof_struct_if_announcemsghdr - - sizeofRtMsghdrDragonFlyBSD4 = C.sizeof_struct_rt_msghdr - sizeofRtMetricsDragonFlyBSD4 = C.sizeof_struct_rt_metrics - - sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 -) diff --git a/src/vendor/golang.org/x/net/route/defs_freebsd.go b/src/vendor/golang.org/x/net/route/defs_freebsd.go deleted file mode 100644 index d95594d8ea..0000000000 --- a/src/vendor/golang.org/x/net/route/defs_freebsd.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -package route - -/* -#include -#include - -#include -#include -#include - -#include - -struct if_data_freebsd7 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; - time_t __ifi_epoch; - struct timeval __ifi_lastchange; -}; - -struct if_data_freebsd8 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; - time_t __ifi_epoch; - struct timeval __ifi_lastchange; -}; - -struct if_data_freebsd9 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_spare_char1; - u_char ifi_spare_char2; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - u_long ifi_hwassist; - time_t __ifi_epoch; - struct timeval __ifi_lastchange; -}; - -struct if_data_freebsd10 { - u_char ifi_type; - u_char ifi_physical; - u_char ifi_addrlen; - u_char ifi_hdrlen; - u_char ifi_link_state; - u_char ifi_vhid; - u_char ifi_baudrate_pf; - u_char ifi_datalen; - u_long ifi_mtu; - u_long ifi_metric; - u_long ifi_baudrate; - u_long ifi_ipackets; - u_long ifi_ierrors; - u_long ifi_opackets; - u_long ifi_oerrors; - u_long ifi_collisions; - u_long ifi_ibytes; - u_long ifi_obytes; - u_long ifi_imcasts; - u_long ifi_omcasts; - u_long ifi_iqdrops; - u_long ifi_noproto; - uint64_t ifi_hwassist; - time_t __ifi_epoch; - struct timeval __ifi_lastchange; -}; - -struct if_data_freebsd11 { - uint8_t ifi_type; - uint8_t ifi_physical; - uint8_t ifi_addrlen; - uint8_t ifi_hdrlen; - uint8_t ifi_link_state; - uint8_t ifi_vhid; - uint16_t ifi_datalen; - uint32_t ifi_mtu; - uint32_t ifi_metric; - uint64_t ifi_baudrate; - uint64_t ifi_ipackets; - uint64_t ifi_ierrors; - uint64_t ifi_opackets; - uint64_t ifi_oerrors; - uint64_t ifi_collisions; - uint64_t ifi_ibytes; - uint64_t ifi_obytes; - uint64_t ifi_imcasts; - uint64_t ifi_omcasts; - uint64_t ifi_iqdrops; - uint64_t ifi_oqdrops; - uint64_t ifi_noproto; - uint64_t ifi_hwassist; - union { - time_t tt; - uint64_t ph; - } __ifi_epoch; - union { - struct timeval tv; - struct { - uint64_t ph1; - uint64_t ph2; - } ph; - } __ifi_lastchange; -}; - -struct if_msghdr_freebsd7 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data_freebsd7 ifm_data; -}; - -struct if_msghdr_freebsd8 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data_freebsd8 ifm_data; -}; - -struct if_msghdr_freebsd9 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data_freebsd9 ifm_data; -}; - -struct if_msghdr_freebsd10 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data_freebsd10 ifm_data; -}; - -struct if_msghdr_freebsd11 { - u_short ifm_msglen; - u_char ifm_version; - u_char ifm_type; - int ifm_addrs; - int ifm_flags; - u_short ifm_index; - struct if_data_freebsd11 ifm_data; -}; -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_ROUTE = C.AF_ROUTE - sysAF_LINK = C.AF_LINK - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW - - sysNET_RT_DUMP = C.NET_RT_DUMP - sysNET_RT_FLAGS = C.NET_RT_FLAGS - sysNET_RT_IFLIST = C.NET_RT_IFLIST - sysNET_RT_IFMALIST = C.NET_RT_IFMALIST - sysNET_RT_IFLISTL = C.NET_RT_IFLISTL -) - -const ( - sysCTL_MAXNAME = C.CTL_MAXNAME - - sysCTL_UNSPEC = C.CTL_UNSPEC - sysCTL_KERN = C.CTL_KERN - sysCTL_VM = C.CTL_VM - sysCTL_VFS = C.CTL_VFS - sysCTL_NET = C.CTL_NET - sysCTL_DEBUG = C.CTL_DEBUG - sysCTL_HW = C.CTL_HW - sysCTL_MACHDEP = C.CTL_MACHDEP - sysCTL_USER = C.CTL_USER - sysCTL_P1003_1B = C.CTL_P1003_1B -) - -const ( - sysRTM_VERSION = C.RTM_VERSION - - sysRTM_ADD = C.RTM_ADD - sysRTM_DELETE = C.RTM_DELETE - sysRTM_CHANGE = C.RTM_CHANGE - sysRTM_GET = C.RTM_GET - sysRTM_LOSING = C.RTM_LOSING - sysRTM_REDIRECT = C.RTM_REDIRECT - sysRTM_MISS = C.RTM_MISS - sysRTM_LOCK = C.RTM_LOCK - sysRTM_RESOLVE = C.RTM_RESOLVE - sysRTM_NEWADDR = C.RTM_NEWADDR - sysRTM_DELADDR = C.RTM_DELADDR - sysRTM_IFINFO = C.RTM_IFINFO - sysRTM_NEWMADDR = C.RTM_NEWMADDR - sysRTM_DELMADDR = C.RTM_DELMADDR - sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE - sysRTM_IEEE80211 = C.RTM_IEEE80211 - - sysRTA_DST = C.RTA_DST - sysRTA_GATEWAY = C.RTA_GATEWAY - sysRTA_NETMASK = C.RTA_NETMASK - sysRTA_GENMASK = C.RTA_GENMASK - sysRTA_IFP = C.RTA_IFP - sysRTA_IFA = C.RTA_IFA - sysRTA_AUTHOR = C.RTA_AUTHOR - sysRTA_BRD = C.RTA_BRD - - sysRTAX_DST = C.RTAX_DST - sysRTAX_GATEWAY = C.RTAX_GATEWAY - sysRTAX_NETMASK = C.RTAX_NETMASK - sysRTAX_GENMASK = C.RTAX_GENMASK - sysRTAX_IFP = C.RTAX_IFP - sysRTAX_IFA = C.RTAX_IFA - sysRTAX_AUTHOR = C.RTAX_AUTHOR - sysRTAX_BRD = C.RTAX_BRD - sysRTAX_MAX = C.RTAX_MAX -) - -const ( - sizeofIfMsghdrlFreeBSD10 = C.sizeof_struct_if_msghdrl - sizeofIfaMsghdrFreeBSD10 = C.sizeof_struct_ifa_msghdr - sizeofIfaMsghdrlFreeBSD10 = C.sizeof_struct_ifa_msghdrl - sizeofIfmaMsghdrFreeBSD10 = C.sizeof_struct_ifma_msghdr - sizeofIfAnnouncemsghdrFreeBSD10 = C.sizeof_struct_if_announcemsghdr - - sizeofRtMsghdrFreeBSD10 = C.sizeof_struct_rt_msghdr - sizeofRtMetricsFreeBSD10 = C.sizeof_struct_rt_metrics - - sizeofIfMsghdrFreeBSD7 = C.sizeof_struct_if_msghdr_freebsd7 - sizeofIfMsghdrFreeBSD8 = C.sizeof_struct_if_msghdr_freebsd8 - sizeofIfMsghdrFreeBSD9 = C.sizeof_struct_if_msghdr_freebsd9 - sizeofIfMsghdrFreeBSD10 = C.sizeof_struct_if_msghdr_freebsd10 - sizeofIfMsghdrFreeBSD11 = C.sizeof_struct_if_msghdr_freebsd11 - - sizeofIfDataFreeBSD7 = C.sizeof_struct_if_data_freebsd7 - sizeofIfDataFreeBSD8 = C.sizeof_struct_if_data_freebsd8 - sizeofIfDataFreeBSD9 = C.sizeof_struct_if_data_freebsd9 - sizeofIfDataFreeBSD10 = C.sizeof_struct_if_data_freebsd10 - sizeofIfDataFreeBSD11 = C.sizeof_struct_if_data_freebsd11 - - sizeofIfMsghdrlFreeBSD10Emu = C.sizeof_struct_if_msghdrl - sizeofIfaMsghdrFreeBSD10Emu = C.sizeof_struct_ifa_msghdr - sizeofIfaMsghdrlFreeBSD10Emu = C.sizeof_struct_ifa_msghdrl - sizeofIfmaMsghdrFreeBSD10Emu = C.sizeof_struct_ifma_msghdr - sizeofIfAnnouncemsghdrFreeBSD10Emu = C.sizeof_struct_if_announcemsghdr - - sizeofRtMsghdrFreeBSD10Emu = C.sizeof_struct_rt_msghdr - sizeofRtMetricsFreeBSD10Emu = C.sizeof_struct_rt_metrics - - sizeofIfMsghdrFreeBSD7Emu = C.sizeof_struct_if_msghdr_freebsd7 - sizeofIfMsghdrFreeBSD8Emu = C.sizeof_struct_if_msghdr_freebsd8 - sizeofIfMsghdrFreeBSD9Emu = C.sizeof_struct_if_msghdr_freebsd9 - sizeofIfMsghdrFreeBSD10Emu = C.sizeof_struct_if_msghdr_freebsd10 - sizeofIfMsghdrFreeBSD11Emu = C.sizeof_struct_if_msghdr_freebsd11 - - sizeofIfDataFreeBSD7Emu = C.sizeof_struct_if_data_freebsd7 - sizeofIfDataFreeBSD8Emu = C.sizeof_struct_if_data_freebsd8 - sizeofIfDataFreeBSD9Emu = C.sizeof_struct_if_data_freebsd9 - sizeofIfDataFreeBSD10Emu = C.sizeof_struct_if_data_freebsd10 - sizeofIfDataFreeBSD11Emu = C.sizeof_struct_if_data_freebsd11 - - sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 -) diff --git a/src/vendor/golang.org/x/net/route/defs_netbsd.go b/src/vendor/golang.org/x/net/route/defs_netbsd.go deleted file mode 100644 index b0abd549a0..0000000000 --- a/src/vendor/golang.org/x/net/route/defs_netbsd.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -package route - -/* -#include -#include - -#include -#include -#include - -#include -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_ROUTE = C.AF_ROUTE - sysAF_LINK = C.AF_LINK - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW - - sysNET_RT_DUMP = C.NET_RT_DUMP - sysNET_RT_FLAGS = C.NET_RT_FLAGS - sysNET_RT_IFLIST = C.NET_RT_IFLIST - sysNET_RT_MAXID = C.NET_RT_MAXID -) - -const ( - sysCTL_MAXNAME = C.CTL_MAXNAME - - sysCTL_UNSPEC = C.CTL_UNSPEC - sysCTL_KERN = C.CTL_KERN - sysCTL_VM = C.CTL_VM - sysCTL_VFS = C.CTL_VFS - sysCTL_NET = C.CTL_NET - sysCTL_DEBUG = C.CTL_DEBUG - sysCTL_HW = C.CTL_HW - sysCTL_MACHDEP = C.CTL_MACHDEP - sysCTL_USER = C.CTL_USER - sysCTL_DDB = C.CTL_DDB - sysCTL_PROC = C.CTL_PROC - sysCTL_VENDOR = C.CTL_VENDOR - sysCTL_EMUL = C.CTL_EMUL - sysCTL_SECURITY = C.CTL_SECURITY - sysCTL_MAXID = C.CTL_MAXID -) - -const ( - sysRTM_VERSION = C.RTM_VERSION - - sysRTM_ADD = C.RTM_ADD - sysRTM_DELETE = C.RTM_DELETE - sysRTM_CHANGE = C.RTM_CHANGE - sysRTM_GET = C.RTM_GET - sysRTM_LOSING = C.RTM_LOSING - sysRTM_REDIRECT = C.RTM_REDIRECT - sysRTM_MISS = C.RTM_MISS - sysRTM_LOCK = C.RTM_LOCK - sysRTM_OLDADD = C.RTM_OLDADD - sysRTM_OLDDEL = C.RTM_OLDDEL - sysRTM_RESOLVE = C.RTM_RESOLVE - sysRTM_NEWADDR = C.RTM_NEWADDR - sysRTM_DELADDR = C.RTM_DELADDR - sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE - sysRTM_IEEE80211 = C.RTM_IEEE80211 - sysRTM_SETGATE = C.RTM_SETGATE - sysRTM_LLINFO_UPD = C.RTM_LLINFO_UPD - sysRTM_IFINFO = C.RTM_IFINFO - sysRTM_CHGADDR = C.RTM_CHGADDR - - sysRTA_DST = C.RTA_DST - sysRTA_GATEWAY = C.RTA_GATEWAY - sysRTA_NETMASK = C.RTA_NETMASK - sysRTA_GENMASK = C.RTA_GENMASK - sysRTA_IFP = C.RTA_IFP - sysRTA_IFA = C.RTA_IFA - sysRTA_AUTHOR = C.RTA_AUTHOR - sysRTA_BRD = C.RTA_BRD - sysRTA_TAG = C.RTA_TAG - - sysRTAX_DST = C.RTAX_DST - sysRTAX_GATEWAY = C.RTAX_GATEWAY - sysRTAX_NETMASK = C.RTAX_NETMASK - sysRTAX_GENMASK = C.RTAX_GENMASK - sysRTAX_IFP = C.RTAX_IFP - sysRTAX_IFA = C.RTAX_IFA - sysRTAX_AUTHOR = C.RTAX_AUTHOR - sysRTAX_BRD = C.RTAX_BRD - sysRTAX_TAG = C.RTAX_TAG - sysRTAX_MAX = C.RTAX_MAX -) - -const ( - sizeofIfMsghdrNetBSD7 = C.sizeof_struct_if_msghdr - sizeofIfaMsghdrNetBSD7 = C.sizeof_struct_ifa_msghdr - sizeofIfAnnouncemsghdrNetBSD7 = C.sizeof_struct_if_announcemsghdr - - sizeofRtMsghdrNetBSD7 = C.sizeof_struct_rt_msghdr - sizeofRtMetricsNetBSD7 = C.sizeof_struct_rt_metrics - - sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 -) diff --git a/src/vendor/golang.org/x/net/route/defs_openbsd.go b/src/vendor/golang.org/x/net/route/defs_openbsd.go deleted file mode 100644 index 173bb5d513..0000000000 --- a/src/vendor/golang.org/x/net/route/defs_openbsd.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2016 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. - -// +build ignore - -package route - -/* -#include -#include - -#include -#include -#include - -#include -*/ -import "C" - -const ( - sysAF_UNSPEC = C.AF_UNSPEC - sysAF_INET = C.AF_INET - sysAF_ROUTE = C.AF_ROUTE - sysAF_LINK = C.AF_LINK - sysAF_INET6 = C.AF_INET6 - - sysSOCK_RAW = C.SOCK_RAW - - sysNET_RT_DUMP = C.NET_RT_DUMP - sysNET_RT_FLAGS = C.NET_RT_FLAGS - sysNET_RT_IFLIST = C.NET_RT_IFLIST - sysNET_RT_STATS = C.NET_RT_STATS - sysNET_RT_TABLE = C.NET_RT_TABLE - sysNET_RT_IFNAMES = C.NET_RT_IFNAMES - sysNET_RT_MAXID = C.NET_RT_MAXID -) - -const ( - sysCTL_MAXNAME = C.CTL_MAXNAME - - sysCTL_UNSPEC = C.CTL_UNSPEC - sysCTL_KERN = C.CTL_KERN - sysCTL_VM = C.CTL_VM - sysCTL_FS = C.CTL_FS - sysCTL_NET = C.CTL_NET - sysCTL_DEBUG = C.CTL_DEBUG - sysCTL_HW = C.CTL_HW - sysCTL_MACHDEP = C.CTL_MACHDEP - sysCTL_DDB = C.CTL_DDB - sysCTL_VFS = C.CTL_VFS - sysCTL_MAXID = C.CTL_MAXID -) - -const ( - sysRTM_VERSION = C.RTM_VERSION - - sysRTM_ADD = C.RTM_ADD - sysRTM_DELETE = C.RTM_DELETE - sysRTM_CHANGE = C.RTM_CHANGE - sysRTM_GET = C.RTM_GET - sysRTM_LOSING = C.RTM_LOSING - sysRTM_REDIRECT = C.RTM_REDIRECT - sysRTM_MISS = C.RTM_MISS - sysRTM_LOCK = C.RTM_LOCK - sysRTM_RESOLVE = C.RTM_RESOLVE - sysRTM_NEWADDR = C.RTM_NEWADDR - sysRTM_DELADDR = C.RTM_DELADDR - sysRTM_IFINFO = C.RTM_IFINFO - sysRTM_IFANNOUNCE = C.RTM_IFANNOUNCE - sysRTM_DESYNC = C.RTM_DESYNC - sysRTM_INVALIDATE = C.RTM_INVALIDATE - sysRTM_BFD = C.RTM_BFD - sysRTM_PROPOSAL = C.RTM_PROPOSAL - - sysRTA_DST = C.RTA_DST - sysRTA_GATEWAY = C.RTA_GATEWAY - sysRTA_NETMASK = C.RTA_NETMASK - sysRTA_GENMASK = C.RTA_GENMASK - sysRTA_IFP = C.RTA_IFP - sysRTA_IFA = C.RTA_IFA - sysRTA_AUTHOR = C.RTA_AUTHOR - sysRTA_BRD = C.RTA_BRD - sysRTA_SRC = C.RTA_SRC - sysRTA_SRCMASK = C.RTA_SRCMASK - sysRTA_LABEL = C.RTA_LABEL - sysRTA_BFD = C.RTA_BFD - sysRTA_DNS = C.RTA_DNS - sysRTA_STATIC = C.RTA_STATIC - sysRTA_SEARCH = C.RTA_SEARCH - - sysRTAX_DST = C.RTAX_DST - sysRTAX_GATEWAY = C.RTAX_GATEWAY - sysRTAX_NETMASK = C.RTAX_NETMASK - sysRTAX_GENMASK = C.RTAX_GENMASK - sysRTAX_IFP = C.RTAX_IFP - sysRTAX_IFA = C.RTAX_IFA - sysRTAX_AUTHOR = C.RTAX_AUTHOR - sysRTAX_BRD = C.RTAX_BRD - sysRTAX_SRC = C.RTAX_SRC - sysRTAX_SRCMASK = C.RTAX_SRCMASK - sysRTAX_LABEL = C.RTAX_LABEL - sysRTAX_BFD = C.RTAX_BFD - sysRTAX_DNS = C.RTAX_DNS - sysRTAX_STATIC = C.RTAX_STATIC - sysRTAX_SEARCH = C.RTAX_SEARCH - sysRTAX_MAX = C.RTAX_MAX -) - -const ( - sizeofRtMsghdr = C.sizeof_struct_rt_msghdr - - sizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 -) diff --git a/src/vendor/golang.org/x/text/unicode/bidi/gen.go b/src/vendor/golang.org/x/text/unicode/bidi/gen.go deleted file mode 100644 index 040f3013d5..0000000000 --- a/src/vendor/golang.org/x/text/unicode/bidi/gen.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -package main - -import ( - "flag" - "log" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -var outputFile = flag.String("out", "tables.go", "output file") - -func main() { - gen.Init() - gen.Repackage("gen_trieval.go", "trieval.go", "bidi") - gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi") - - genTables() -} - -// bidiClass names and codes taken from class "bc" in -// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt -var bidiClass = map[string]Class{ - "AL": AL, // ArabicLetter - "AN": AN, // ArabicNumber - "B": B, // ParagraphSeparator - "BN": BN, // BoundaryNeutral - "CS": CS, // CommonSeparator - "EN": EN, // EuropeanNumber - "ES": ES, // EuropeanSeparator - "ET": ET, // EuropeanTerminator - "L": L, // LeftToRight - "NSM": NSM, // NonspacingMark - "ON": ON, // OtherNeutral - "R": R, // RightToLeft - "S": S, // SegmentSeparator - "WS": WS, // WhiteSpace - - "FSI": Control, - "PDF": Control, - "PDI": Control, - "LRE": Control, - "LRI": Control, - "LRO": Control, - "RLE": Control, - "RLI": Control, - "RLO": Control, -} - -func genTables() { - if numClass > 0x0F { - log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass) - } - w := gen.NewCodeWriter() - defer w.WriteGoFile(*outputFile, "bidi") - - gen.WriteUnicodeVersion(w) - - t := triegen.NewTrie("bidi") - - // Build data about bracket mapping. These bits need to be or-ed with - // any other bits. - orMask := map[rune]uint64{} - - xorMap := map[rune]int{} - xorMasks := []rune{0} // First value is no-op. - - ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) { - r1 := p.Rune(0) - r2 := p.Rune(1) - xor := r1 ^ r2 - if _, ok := xorMap[xor]; !ok { - xorMap[xor] = len(xorMasks) - xorMasks = append(xorMasks, xor) - } - entry := uint64(xorMap[xor]) << xorMaskShift - switch p.String(2) { - case "o": - entry |= openMask - case "c", "n": - default: - log.Fatalf("Unknown bracket class %q.", p.String(2)) - } - orMask[r1] = entry - }) - - w.WriteComment(` - xorMasks contains masks to be xor-ed with brackets to get the reverse - version.`) - w.WriteVar("xorMasks", xorMasks) - - done := map[rune]bool{} - - insert := func(r rune, c Class) { - if !done[r] { - t.Insert(r, orMask[r]|uint64(c)) - done[r] = true - } - } - - // Insert the derived BiDi properties. - ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) { - r := p.Rune(0) - class, ok := bidiClass[p.String(1)] - if !ok { - log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1)) - } - insert(r, class) - }) - visitDefaults(insert) - - // TODO: use sparse blocks. This would reduce table size considerably - // from the looks of it. - - sz, err := t.Gen(w) - if err != nil { - log.Fatal(err) - } - w.Size += sz -} - -// dummy values to make methods in gen_common compile. The real versions -// will be generated by this file to tables.go. -var ( - xorMasks []rune -) diff --git a/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go b/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go deleted file mode 100644 index 51bd68fa7f..0000000000 --- a/src/vendor/golang.org/x/text/unicode/bidi/gen_ranges.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -package main - -import ( - "unicode" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/ucd" - "golang.org/x/text/unicode/rangetable" -) - -// These tables are hand-extracted from: -// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt -func visitDefaults(fn func(r rune, c Class)) { - // first write default values for ranges listed above. - visitRunes(fn, AL, []rune{ - 0x0600, 0x07BF, // Arabic - 0x08A0, 0x08FF, // Arabic Extended-A - 0xFB50, 0xFDCF, // Arabic Presentation Forms - 0xFDF0, 0xFDFF, - 0xFE70, 0xFEFF, - 0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols - }) - visitRunes(fn, R, []rune{ - 0x0590, 0x05FF, // Hebrew - 0x07C0, 0x089F, // Nko et al. - 0xFB1D, 0xFB4F, - 0x00010800, 0x00010FFF, // Cypriot Syllabary et. al. - 0x0001E800, 0x0001EDFF, - 0x0001EF00, 0x0001EFFF, - }) - visitRunes(fn, ET, []rune{ // European Terminator - 0x20A0, 0x20Cf, // Currency symbols - }) - rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) { - fn(r, BN) // Boundary Neutral - }) - ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) { - if p.String(1) == "Default_Ignorable_Code_Point" { - fn(p.Rune(0), BN) // Boundary Neutral - } - }) -} - -func visitRunes(fn func(r rune, c Class), c Class, runes []rune) { - for i := 0; i < len(runes); i += 2 { - lo, hi := runes[i], runes[i+1] - for j := lo; j <= hi; j++ { - fn(j, c) - } - } -} diff --git a/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go b/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go deleted file mode 100644 index 9cb9942894..0000000000 --- a/src/vendor/golang.org/x/text/unicode/bidi/gen_trieval.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -package main - -// Class is the Unicode BiDi class. Each rune has a single class. -type Class uint - -const ( - L Class = iota // LeftToRight - R // RightToLeft - EN // EuropeanNumber - ES // EuropeanSeparator - ET // EuropeanTerminator - AN // ArabicNumber - CS // CommonSeparator - B // ParagraphSeparator - S // SegmentSeparator - WS // WhiteSpace - ON // OtherNeutral - BN // BoundaryNeutral - NSM // NonspacingMark - AL // ArabicLetter - Control // Control LRO - PDI - - numClass - - LRO // LeftToRightOverride - RLO // RightToLeftOverride - LRE // LeftToRightEmbedding - RLE // RightToLeftEmbedding - PDF // PopDirectionalFormat - LRI // LeftToRightIsolate - RLI // RightToLeftIsolate - FSI // FirstStrongIsolate - PDI // PopDirectionalIsolate - - unknownClass = ^Class(0) -) - -var controlToClass = map[rune]Class{ - 0x202D: LRO, // LeftToRightOverride, - 0x202E: RLO, // RightToLeftOverride, - 0x202A: LRE, // LeftToRightEmbedding, - 0x202B: RLE, // RightToLeftEmbedding, - 0x202C: PDF, // PopDirectionalFormat, - 0x2066: LRI, // LeftToRightIsolate, - 0x2067: RLI, // RightToLeftIsolate, - 0x2068: FSI, // FirstStrongIsolate, - 0x2069: PDI, // PopDirectionalIsolate, -} - -// A trie entry has the following bits: -// 7..5 XOR mask for brackets -// 4 1: Bracket open, 0: Bracket close -// 3..0 Class type - -const ( - openMask = 0x10 - xorMaskShift = 5 -) diff --git a/src/vendor/golang.org/x/text/unicode/norm/maketables.go b/src/vendor/golang.org/x/text/unicode/norm/maketables.go deleted file mode 100644 index 8d418160ca..0000000000 --- a/src/vendor/golang.org/x/text/unicode/norm/maketables.go +++ /dev/null @@ -1,976 +0,0 @@ -// Copyright 2011 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. - -// +build ignore - -// Normalization table generator. -// Data read from the web. -// See forminfo.go for a description of the trie values associated with each rune. - -package main - -import ( - "bytes" - "flag" - "fmt" - "io" - "log" - "sort" - "strconv" - "strings" - - "golang.org/x/text/internal/gen" - "golang.org/x/text/internal/triegen" - "golang.org/x/text/internal/ucd" -) - -func main() { - gen.Init() - loadUnicodeData() - compactCCC() - loadCompositionExclusions() - completeCharFields(FCanonical) - completeCharFields(FCompatibility) - computeNonStarterCounts() - verifyComputed() - printChars() - testDerived() - printTestdata() - makeTables() -} - -var ( - tablelist = flag.String("tables", - "all", - "comma-separated list of which tables to generate; "+ - "can be 'decomp', 'recomp', 'info' and 'all'") - test = flag.Bool("test", - false, - "test existing tables against DerivedNormalizationProps and generate test data for regression testing") - verbose = flag.Bool("verbose", - false, - "write data to stdout as it is parsed") -) - -const MaxChar = 0x10FFFF // anything above this shouldn't exist - -// Quick Check properties of runes allow us to quickly -// determine whether a rune may occur in a normal form. -// For a given normal form, a rune may be guaranteed to occur -// verbatim (QC=Yes), may or may not combine with another -// rune (QC=Maybe), or may not occur (QC=No). -type QCResult int - -const ( - QCUnknown QCResult = iota - QCYes - QCNo - QCMaybe -) - -func (r QCResult) String() string { - switch r { - case QCYes: - return "Yes" - case QCNo: - return "No" - case QCMaybe: - return "Maybe" - } - return "***UNKNOWN***" -} - -const ( - FCanonical = iota // NFC or NFD - FCompatibility // NFKC or NFKD - FNumberOfFormTypes -) - -const ( - MComposed = iota // NFC or NFKC - MDecomposed // NFD or NFKD - MNumberOfModes -) - -// This contains only the properties we're interested in. -type Char struct { - name string - codePoint rune // if zero, this index is not a valid code point. - ccc uint8 // canonical combining class - origCCC uint8 - excludeInComp bool // from CompositionExclusions.txt - compatDecomp bool // it has a compatibility expansion - - nTrailingNonStarters uint8 - nLeadingNonStarters uint8 // must be equal to trailing if non-zero - - forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility - - state State -} - -var chars = make([]Char, MaxChar+1) -var cccMap = make(map[uint8]uint8) - -func (c Char) String() string { - buf := new(bytes.Buffer) - - fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name) - fmt.Fprintf(buf, " ccc: %v\n", c.ccc) - fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp) - fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp) - fmt.Fprintf(buf, " state: %v\n", c.state) - fmt.Fprintf(buf, " NFC:\n") - fmt.Fprint(buf, c.forms[FCanonical]) - fmt.Fprintf(buf, " NFKC:\n") - fmt.Fprint(buf, c.forms[FCompatibility]) - - return buf.String() -} - -// In UnicodeData.txt, some ranges are marked like this: -// 3400;;Lo;0;L;;;;;N;;;;; -// 4DB5;;Lo;0;L;;;;;N;;;;; -// parseCharacter keeps a state variable indicating the weirdness. -type State int - -const ( - SNormal State = iota // known to be zero for the type - SFirst - SLast - SMissing -) - -var lastChar = rune('\u0000') - -func (c Char) isValid() bool { - return c.codePoint != 0 && c.state != SMissing -} - -type FormInfo struct { - quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed - verified [MNumberOfModes]bool // index: MComposed or MDecomposed - - combinesForward bool // May combine with rune on the right - combinesBackward bool // May combine with rune on the left - isOneWay bool // Never appears in result - inDecomp bool // Some decompositions result in this char. - decomp Decomposition - expandedDecomp Decomposition -} - -func (f FormInfo) String() string { - buf := bytes.NewBuffer(make([]byte, 0)) - - fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed]) - fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed]) - fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward) - fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward) - fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay) - fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp) - fmt.Fprintf(buf, " decomposition: %X\n", f.decomp) - fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp) - - return buf.String() -} - -type Decomposition []rune - -func parseDecomposition(s string, skipfirst bool) (a []rune, err error) { - decomp := strings.Split(s, " ") - if len(decomp) > 0 && skipfirst { - decomp = decomp[1:] - } - for _, d := range decomp { - point, err := strconv.ParseUint(d, 16, 64) - if err != nil { - return a, err - } - a = append(a, rune(point)) - } - return a, nil -} - -func loadUnicodeData() { - f := gen.OpenUCDFile("UnicodeData.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(ucd.CodePoint) - char := &chars[r] - - char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass)) - decmap := p.String(ucd.DecompMapping) - - exp, err := parseDecomposition(decmap, false) - isCompat := false - if err != nil { - if len(decmap) > 0 { - exp, err = parseDecomposition(decmap, true) - if err != nil { - log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err) - } - isCompat = true - } - } - - char.name = p.String(ucd.Name) - char.codePoint = r - char.forms[FCompatibility].decomp = exp - if !isCompat { - char.forms[FCanonical].decomp = exp - } else { - char.compatDecomp = true - } - if len(decmap) > 0 { - char.forms[FCompatibility].decomp = exp - } - } - if err := p.Err(); err != nil { - log.Fatal(err) - } -} - -// compactCCC converts the sparse set of CCC values to a continguous one, -// reducing the number of bits needed from 8 to 6. -func compactCCC() { - m := make(map[uint8]uint8) - for i := range chars { - c := &chars[i] - m[c.ccc] = 0 - } - cccs := []int{} - for v, _ := range m { - cccs = append(cccs, int(v)) - } - sort.Ints(cccs) - for i, c := range cccs { - cccMap[uint8(i)] = uint8(c) - m[uint8(c)] = uint8(i) - } - for i := range chars { - c := &chars[i] - c.origCCC = c.ccc - c.ccc = m[c.ccc] - } - if len(m) >= 1<<6 { - log.Fatalf("too many difference CCC values: %d >= 64", len(m)) - } -} - -// CompositionExclusions.txt has form: -// 0958 # ... -// See http://unicode.org/reports/tr44/ for full explanation -func loadCompositionExclusions() { - f := gen.OpenUCDFile("CompositionExclusions.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - c := &chars[p.Rune(0)] - if c.excludeInComp { - log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint) - } - c.excludeInComp = true - } - if e := p.Err(); e != nil { - log.Fatal(e) - } -} - -// hasCompatDecomp returns true if any of the recursive -// decompositions contains a compatibility expansion. -// In this case, the character may not occur in NFK*. -func hasCompatDecomp(r rune) bool { - c := &chars[r] - if c.compatDecomp { - return true - } - for _, d := range c.forms[FCompatibility].decomp { - if hasCompatDecomp(d) { - return true - } - } - return false -} - -// Hangul related constants. -const ( - HangulBase = 0xAC00 - HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28) - - JamoLBase = 0x1100 - JamoLEnd = 0x1113 - JamoVBase = 0x1161 - JamoVEnd = 0x1176 - JamoTBase = 0x11A8 - JamoTEnd = 0x11C3 - - JamoLVTCount = 19 * 21 * 28 - JamoTCount = 28 -) - -func isHangul(r rune) bool { - return HangulBase <= r && r < HangulEnd -} - -func isHangulWithoutJamoT(r rune) bool { - if !isHangul(r) { - return false - } - r -= HangulBase - return r < JamoLVTCount && r%JamoTCount == 0 -} - -func ccc(r rune) uint8 { - return chars[r].ccc -} - -// Insert a rune in a buffer, ordered by Canonical Combining Class. -func insertOrdered(b Decomposition, r rune) Decomposition { - n := len(b) - b = append(b, 0) - cc := ccc(r) - if cc > 0 { - // Use bubble sort. - for ; n > 0; n-- { - if ccc(b[n-1]) <= cc { - break - } - b[n] = b[n-1] - } - } - b[n] = r - return b -} - -// Recursively decompose. -func decomposeRecursive(form int, r rune, d Decomposition) Decomposition { - dcomp := chars[r].forms[form].decomp - if len(dcomp) == 0 { - return insertOrdered(d, r) - } - for _, c := range dcomp { - d = decomposeRecursive(form, c, d) - } - return d -} - -func completeCharFields(form int) { - // Phase 0: pre-expand decomposition. - for i := range chars { - f := &chars[i].forms[form] - if len(f.decomp) == 0 { - continue - } - exp := make(Decomposition, 0) - for _, c := range f.decomp { - exp = decomposeRecursive(form, c, exp) - } - f.expandedDecomp = exp - } - - // Phase 1: composition exclusion, mark decomposition. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - // Marks script-specific exclusions and version restricted. - f.isOneWay = c.excludeInComp - - // Singletons - f.isOneWay = f.isOneWay || len(f.decomp) == 1 - - // Non-starter decompositions - if len(f.decomp) > 1 { - chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0 - f.isOneWay = f.isOneWay || chk - } - - // Runes that decompose into more than two runes. - f.isOneWay = f.isOneWay || len(f.decomp) > 2 - - if form == FCompatibility { - f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint) - } - - for _, r := range f.decomp { - chars[r].forms[form].inDecomp = true - } - } - - // Phase 2: forward and backward combining. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - if !f.isOneWay && len(f.decomp) == 2 { - f0 := &chars[f.decomp[0]].forms[form] - f1 := &chars[f.decomp[1]].forms[form] - if !f0.isOneWay { - f0.combinesForward = true - } - if !f1.isOneWay { - f1.combinesBackward = true - } - } - if isHangulWithoutJamoT(rune(i)) { - f.combinesForward = true - } - } - - // Phase 3: quick check values. - for i := range chars { - c := &chars[i] - f := &c.forms[form] - - switch { - case len(f.decomp) > 0: - f.quickCheck[MDecomposed] = QCNo - case isHangul(rune(i)): - f.quickCheck[MDecomposed] = QCNo - default: - f.quickCheck[MDecomposed] = QCYes - } - switch { - case f.isOneWay: - f.quickCheck[MComposed] = QCNo - case (i & 0xffff00) == JamoLBase: - f.quickCheck[MComposed] = QCYes - if JamoLBase <= i && i < JamoLEnd { - f.combinesForward = true - } - if JamoVBase <= i && i < JamoVEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - f.combinesForward = true - } - if JamoTBase <= i && i < JamoTEnd { - f.quickCheck[MComposed] = QCMaybe - f.combinesBackward = true - } - case !f.combinesBackward: - f.quickCheck[MComposed] = QCYes - default: - f.quickCheck[MComposed] = QCMaybe - } - } -} - -func computeNonStarterCounts() { - // Phase 4: leading and trailing non-starter count - for i := range chars { - c := &chars[i] - - runes := []rune{rune(i)} - // We always use FCompatibility so that the CGJ insertion points do not - // change for repeated normalizations with different forms. - if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 { - runes = exp - } - // We consider runes that combine backwards to be non-starters for the - // purpose of Stream-Safe Text Processing. - for _, r := range runes { - if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nLeadingNonStarters++ - } - for i := len(runes) - 1; i >= 0; i-- { - if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward { - break - } - c.nTrailingNonStarters++ - } - if c.nTrailingNonStarters > 3 { - log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes) - } - - if isHangul(rune(i)) { - c.nTrailingNonStarters = 2 - if isHangulWithoutJamoT(rune(i)) { - c.nTrailingNonStarters = 1 - } - } - - if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t { - log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t) - } - if t := c.nTrailingNonStarters; t > 3 { - log.Fatalf("%U: number of trailing non-starters is %d > 3", t) - } - } -} - -func printBytes(w io.Writer, b []byte, name string) { - fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b)) - fmt.Fprintf(w, "var %s = [...]byte {", name) - for i, c := range b { - switch { - case i%64 == 0: - fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63) - case i%8 == 0: - fmt.Fprintf(w, "\n") - } - fmt.Fprintf(w, "0x%.2X, ", c) - } - fmt.Fprint(w, "\n}\n\n") -} - -// See forminfo.go for format. -func makeEntry(f *FormInfo, c *Char) uint16 { - e := uint16(0) - if r := c.codePoint; HangulBase <= r && r < HangulEnd { - e |= 0x40 - } - if f.combinesForward { - e |= 0x20 - } - if f.quickCheck[MDecomposed] == QCNo { - e |= 0x4 - } - switch f.quickCheck[MComposed] { - case QCYes: - case QCNo: - e |= 0x10 - case QCMaybe: - e |= 0x18 - default: - log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed]) - } - e |= uint16(c.nTrailingNonStarters) - return e -} - -// decompSet keeps track of unique decompositions, grouped by whether -// the decomposition is followed by a trailing and/or leading CCC. -type decompSet [7]map[string]bool - -const ( - normalDecomp = iota - firstMulti - firstCCC - endMulti - firstLeadingCCC - firstCCCZeroExcept - firstStarterWithNLead - lastDecomp -) - -var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"} - -func makeDecompSet() decompSet { - m := decompSet{} - for i := range m { - m[i] = make(map[string]bool) - } - return m -} -func (m *decompSet) insert(key int, s string) { - m[key][s] = true -} - -func printCharInfoTables(w io.Writer) int { - mkstr := func(r rune, f *FormInfo) (int, string) { - d := f.expandedDecomp - s := string([]rune(d)) - if max := 1 << 6; len(s) >= max { - const msg = "%U: too many bytes in decomposition: %d >= %d" - log.Fatalf(msg, r, len(s), max) - } - head := uint8(len(s)) - if f.quickCheck[MComposed] != QCYes { - head |= 0x40 - } - if f.combinesForward { - head |= 0x80 - } - s = string([]byte{head}) + s - - lccc := ccc(d[0]) - tccc := ccc(d[len(d)-1]) - cc := ccc(r) - if cc != 0 && lccc == 0 && tccc == 0 { - log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc) - } - if tccc < lccc && lccc != 0 { - const msg = "%U: lccc (%d) must be <= tcc (%d)" - log.Fatalf(msg, r, lccc, tccc) - } - index := normalDecomp - nTrail := chars[r].nTrailingNonStarters - nLead := chars[r].nLeadingNonStarters - if tccc > 0 || lccc > 0 || nTrail > 0 { - tccc <<= 2 - tccc |= nTrail - s += string([]byte{tccc}) - index = endMulti - for _, r := range d[1:] { - if ccc(r) == 0 { - index = firstCCC - } - } - if lccc > 0 || nLead > 0 { - s += string([]byte{lccc}) - if index == firstCCC { - log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r) - } - index = firstLeadingCCC - } - if cc != lccc { - if cc != 0 { - log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc) - } - index = firstCCCZeroExcept - } - } else if len(d) > 1 { - index = firstMulti - } - return index, s - } - - decompSet := makeDecompSet() - const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail. - decompSet.insert(firstStarterWithNLead, nLeadStr) - - // Store the uniqued decompositions in a byte buffer, - // preceded by their byte length. - for _, c := range chars { - for _, f := range c.forms { - if len(f.expandedDecomp) == 0 { - continue - } - if f.combinesBackward { - log.Fatalf("%U: combinesBackward and decompose", c.codePoint) - } - index, s := mkstr(c.codePoint, &f) - decompSet.insert(index, s) - } - } - - decompositions := bytes.NewBuffer(make([]byte, 0, 10000)) - size := 0 - positionMap := make(map[string]uint16) - decompositions.WriteString("\000") - fmt.Fprintln(w, "const (") - for i, m := range decompSet { - sa := []string{} - for s := range m { - sa = append(sa, s) - } - sort.Strings(sa) - for _, s := range sa { - p := decompositions.Len() - decompositions.WriteString(s) - positionMap[s] = uint16(p) - } - if cname[i] != "" { - fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len()) - } - } - fmt.Fprintln(w, "maxDecomp = 0x8000") - fmt.Fprintln(w, ")") - b := decompositions.Bytes() - printBytes(w, b, "decomps") - size += len(b) - - varnames := []string{"nfc", "nfkc"} - for i := 0; i < FNumberOfFormTypes; i++ { - trie := triegen.NewTrie(varnames[i]) - - for r, c := range chars { - f := c.forms[i] - d := f.expandedDecomp - if len(d) != 0 { - _, key := mkstr(c.codePoint, &f) - trie.Insert(rune(r), uint64(positionMap[key])) - if c.ccc != ccc(d[0]) { - // We assume the lead ccc of a decomposition !=0 in this case. - if ccc(d[0]) == 0 { - log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc) - } - } - } else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward { - // Handle cases where it can't be detected that the nLead should be equal - // to nTrail. - trie.Insert(c.codePoint, uint64(positionMap[nLeadStr])) - } else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 { - trie.Insert(c.codePoint, uint64(0x8000|v)) - } - } - sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]})) - if err != nil { - log.Fatal(err) - } - size += sz - } - return size -} - -func contains(sa []string, s string) bool { - for _, a := range sa { - if a == s { - return true - } - } - return false -} - -func makeTables() { - w := &bytes.Buffer{} - - size := 0 - if *tablelist == "" { - return - } - list := strings.Split(*tablelist, ",") - if *tablelist == "all" { - list = []string{"recomp", "info"} - } - - // Compute maximum decomposition size. - max := 0 - for _, c := range chars { - if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max { - max = n - } - } - - fmt.Fprintln(w, "const (") - fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.") - fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion()) - fmt.Fprintln(w) - fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform") - fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at") - fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that") - fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.") - fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max) - fmt.Fprintln(w, ")\n") - - // Print the CCC remap table. - size += len(cccMap) - fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap)) - for i := 0; i < len(cccMap); i++ { - if i%8 == 0 { - fmt.Fprintln(w) - } - fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)]) - } - fmt.Fprintln(w, "\n}\n") - - if contains(list, "info") { - size += printCharInfoTables(w) - } - - if contains(list, "recomp") { - // Note that we use 32 bit keys, instead of 64 bit. - // This clips the bits of three entries, but we know - // this won't cause a collision. The compiler will catch - // any changes made to UnicodeData.txt that introduces - // a collision. - // Note that the recomposition map for NFC and NFKC - // are identical. - - // Recomposition map - nrentries := 0 - for _, c := range chars { - f := c.forms[FCanonical] - if !f.isOneWay && len(f.decomp) > 0 { - nrentries++ - } - } - sz := nrentries * 8 - size += sz - fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz) - fmt.Fprintln(w, "var recompMap = map[uint32]rune{") - for i, c := range chars { - f := c.forms[FCanonical] - d := f.decomp - if !f.isOneWay && len(d) > 0 { - key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1])) - fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i) - } - } - fmt.Fprintf(w, "}\n\n") - } - - fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size) - gen.WriteGoFile("tables.go", "norm", w.Bytes()) -} - -func printChars() { - if *verbose { - for _, c := range chars { - if !c.isValid() || c.state == SMissing { - continue - } - fmt.Println(c) - } - } -} - -// verifyComputed does various consistency tests. -func verifyComputed() { - for i, c := range chars { - for _, f := range c.forms { - isNo := (f.quickCheck[MDecomposed] == QCNo) - if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) { - log.Fatalf("%U: NF*D QC must be No if rune decomposes", i) - } - - isMaybe := f.quickCheck[MComposed] == QCMaybe - if f.combinesBackward != isMaybe { - log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i) - } - if len(f.decomp) > 0 && f.combinesForward && isMaybe { - log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i) - } - - if len(f.expandedDecomp) != 0 { - continue - } - if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b { - // We accept these runes to be treated differently (it only affects - // segment breaking in iteration, most likely on improper use), but - // reconsider if more characters are added. - // U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; - // U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; - // U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; - // U+318E HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; - // U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; - // U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; - if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) { - log.Fatalf("%U: nLead was %v; want %v", i, a, b) - } - } - } - nfc := c.forms[FCanonical] - nfkc := c.forms[FCompatibility] - if nfc.combinesBackward != nfkc.combinesBackward { - log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint) - } - } -} - -// Use values in DerivedNormalizationProps.txt to compare against the -// values we computed. -// DerivedNormalizationProps.txt has form: -// 00C0..00C5 ; NFD_QC; N # ... -// 0374 ; NFD_QC; N # ... -// See http://unicode.org/reports/tr44/ for full explanation -func testDerived() { - f := gen.OpenUCDFile("DerivedNormalizationProps.txt") - defer f.Close() - p := ucd.New(f) - for p.Next() { - r := p.Rune(0) - c := &chars[r] - - var ftype, mode int - qt := p.String(1) - switch qt { - case "NFC_QC": - ftype, mode = FCanonical, MComposed - case "NFD_QC": - ftype, mode = FCanonical, MDecomposed - case "NFKC_QC": - ftype, mode = FCompatibility, MComposed - case "NFKD_QC": - ftype, mode = FCompatibility, MDecomposed - default: - continue - } - var qr QCResult - switch p.String(2) { - case "Y": - qr = QCYes - case "N": - qr = QCNo - case "M": - qr = QCMaybe - default: - log.Fatalf(`Unexpected quick check value "%s"`, p.String(2)) - } - if got := c.forms[ftype].quickCheck[mode]; got != qr { - log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr) - } - c.forms[ftype].verified[mode] = true - } - if err := p.Err(); err != nil { - log.Fatal(err) - } - // Any unspecified value must be QCYes. Verify this. - for i, c := range chars { - for j, fd := range c.forms { - for k, qr := range fd.quickCheck { - if !fd.verified[k] && qr != QCYes { - m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n" - log.Printf(m, i, j, k, qr, c.name) - } - } - } - } -} - -var testHeader = `const ( - Yes = iota - No - Maybe -) - -type formData struct { - qc uint8 - combinesForward bool - decomposition string -} - -type runeData struct { - r rune - ccc uint8 - nLead uint8 - nTrail uint8 - f [2]formData // 0: canonical; 1: compatibility -} - -func f(qc uint8, cf bool, dec string) [2]formData { - return [2]formData{{qc, cf, dec}, {qc, cf, dec}} -} - -func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData { - return [2]formData{{qc, cf, d}, {qck, cfk, dk}} -} - -var testData = []runeData{ -` - -func printTestdata() { - type lastInfo struct { - ccc uint8 - nLead uint8 - nTrail uint8 - f string - } - - last := lastInfo{} - w := &bytes.Buffer{} - fmt.Fprintf(w, testHeader) - for r, c := range chars { - f := c.forms[FCanonical] - qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - f = c.forms[FCompatibility] - qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp) - s := "" - if d == dk && qc == qck && cf == cfk { - s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d) - } else { - s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk) - } - current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s} - if last != current { - fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s) - last = current - } - } - fmt.Fprintln(w, "}") - gen.WriteGoFile("data_test.go", "norm", w.Bytes()) -} diff --git a/src/vendor/golang.org/x/text/unicode/norm/triegen.go b/src/vendor/golang.org/x/text/unicode/norm/triegen.go deleted file mode 100644 index 45d711900d..0000000000 --- a/src/vendor/golang.org/x/text/unicode/norm/triegen.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2011 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. - -// +build ignore - -// Trie table generator. -// Used by make*tables tools to generate a go file with trie data structures -// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte -// sequence are used to lookup offsets in the index table to be used for the -// next byte. The last byte is used to index into a table with 16-bit values. - -package main - -import ( - "fmt" - "io" -) - -const maxSparseEntries = 16 - -type normCompacter struct { - sparseBlocks [][]uint64 - sparseOffset []uint16 - sparseCount int - name string -} - -func mostFrequentStride(a []uint64) int { - counts := make(map[int]int) - var v int - for _, x := range a { - if stride := int(x) - v; v != 0 && stride >= 0 { - counts[stride]++ - } - v = int(x) - } - var maxs, maxc int - for stride, cnt := range counts { - if cnt > maxc || (cnt == maxc && stride < maxs) { - maxs, maxc = stride, cnt - } - } - return maxs -} - -func countSparseEntries(a []uint64) int { - stride := mostFrequentStride(a) - var v, count int - for _, tv := range a { - if int(tv)-v != stride { - if tv != 0 { - count++ - } - } - v = int(tv) - } - return count -} - -func (c *normCompacter) Size(v []uint64) (sz int, ok bool) { - if n := countSparseEntries(v); n <= maxSparseEntries { - return (n+1)*4 + 2, true - } - return 0, false -} - -func (c *normCompacter) Store(v []uint64) uint32 { - h := uint32(len(c.sparseOffset)) - c.sparseBlocks = append(c.sparseBlocks, v) - c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount)) - c.sparseCount += countSparseEntries(v) + 1 - return h -} - -func (c *normCompacter) Handler() string { - return c.name + "Sparse.lookup" -} - -func (c *normCompacter) Print(w io.Writer) (retErr error) { - p := func(f string, x ...interface{}) { - if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil { - retErr = err - } - } - - ls := len(c.sparseBlocks) - p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2) - p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset) - - ns := c.sparseCount - p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4) - p("var %sSparseValues = [%d]valueRange {", c.name, ns) - for i, b := range c.sparseBlocks { - p("\n// Block %#x, offset %#x", i, c.sparseOffset[i]) - var v int - stride := mostFrequentStride(b) - n := countSparseEntries(b) - p("\n{value:%#04x,lo:%#02x},", stride, uint8(n)) - for i, nv := range b { - if int(nv)-v != stride { - if v != 0 { - p(",hi:%#02x},", 0x80+i-1) - } - if nv != 0 { - p("\n{value:%#04x,lo:%#02x", nv, 0x80+i) - } - } - v = int(nv) - } - if v != 0 { - p(",hi:%#02x},", 0x80+len(b)-1) - } - } - p("\n}\n\n") - return -} -- GitLab From c1544ff906c3696774152aaa6594d6cefce15552 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Wed, 17 Apr 2019 10:46:01 -0700 Subject: [PATCH 0865/1679] cmd/compile: move phi tighten after critical The phi tighten pass moves rematerializable phi args to the immediate predecessor of the phis. This reduces value lifetimes for regalloc. However, the critical edge removal pass can introduce new blocks, which can change what a block's immediate precedessor is. This can result in tightened phi args being spilled unnecessarily. This change moves the phi tighten pass after the critical edge pass, when the block structure is stable. This improves the code generated for func f(s string) bool { return s == "abcde" } Before this change: "".f STEXT nosplit size=44 args=0x18 locals=0x0 0x0000 00000 (x.go:3) MOVQ "".s+16(SP), AX 0x0005 00005 (x.go:3) CMPQ AX, $5 0x0009 00009 (x.go:3) JNE 40 0x000b 00011 (x.go:3) MOVQ "".s+8(SP), AX 0x0010 00016 (x.go:3) CMPL (AX), $1684234849 0x0016 00022 (x.go:3) JNE 36 0x0018 00024 (x.go:3) CMPB 4(AX), $101 0x001c 00028 (x.go:3) SETEQ AL 0x001f 00031 (x.go:3) MOVB AL, "".~r1+24(SP) 0x0023 00035 (x.go:3) RET 0x0024 00036 (x.go:3) XORL AX, AX 0x0026 00038 (x.go:3) JMP 31 0x0028 00040 (x.go:3) XORL AX, AX 0x002a 00042 (x.go:3) JMP 31 Observe the duplicated blocks at the end. After this change: "".f STEXT nosplit size=40 args=0x18 locals=0x0 0x0000 00000 (x.go:3) MOVQ "".s+16(SP), AX 0x0005 00005 (x.go:3) CMPQ AX, $5 0x0009 00009 (x.go:3) JNE 36 0x000b 00011 (x.go:3) MOVQ "".s+8(SP), AX 0x0010 00016 (x.go:3) CMPL (AX), $1684234849 0x0016 00022 (x.go:3) JNE 36 0x0018 00024 (x.go:3) CMPB 4(AX), $101 0x001c 00028 (x.go:3) SETEQ AL 0x001f 00031 (x.go:3) MOVB AL, "".~r1+24(SP) 0x0023 00035 (x.go:3) RET 0x0024 00036 (x.go:3) XORL AX, AX 0x0026 00038 (x.go:3) JMP 31 Change-Id: I12c81aa53b89456cb5809aa5396378245f3beda9 Reviewed-on: https://go-review.googlesource.com/c/go/+/172597 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/ssa/compile.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go index 38f12abf18..8f9c26d065 100644 --- a/src/cmd/compile/internal/ssa/compile.go +++ b/src/cmd/compile/internal/ssa/compile.go @@ -414,9 +414,9 @@ var passes = [...]pass{ {name: "late phielim", fn: phielim}, {name: "late copyelim", fn: copyelim}, {name: "tighten", fn: tighten}, // move values closer to their uses - {name: "phi tighten", fn: phiTighten}, {name: "late deadcode", fn: deadcode}, {name: "critical", fn: critical, required: true}, // remove critical edges + {name: "phi tighten", fn: phiTighten}, // place rematerializable phi args near uses to reduce value lifetimes {name: "likelyadjust", fn: likelyadjust}, {name: "layout", fn: layout, required: true}, // schedule blocks {name: "schedule", fn: schedule, required: true}, // schedule values @@ -467,6 +467,8 @@ var passOrder = [...]constraint{ {"decompose builtin", "late opt"}, // decompose builtin is the last pass that may introduce new float ops, so run softfloat after it {"decompose builtin", "softfloat"}, + // remove critical edges before phi tighten, so that phi args get better placement + {"critical", "phi tighten"}, // don't layout blocks until critical edges have been removed {"critical", "layout"}, // regalloc requires the removal of all critical edges -- GitLab From 4aeac68c92c5b79d098aaa7fba168d4c943541ba Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Thu, 11 Apr 2019 12:18:10 -0700 Subject: [PATCH 0866/1679] runtime, cmd/compile: re-order PCDATA and FUNCDATA indices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pclntab encoding supports writing only some PCDATA and FUNCDATA values. However, the encoding is dense: The max index in use determines the space used. We should thus choose a numbering in which frequently used indices are smaller. This change re-orders the PCDATA and FUNCDATA indices using that principle, using a quick and dirty instrumentation to measure index frequency. It shrinks binaries by about 0.5%. Updates #6853 file before after Δ % go 14745044 14671316 -73728 -0.500% addr2line 4305128 4280552 -24576 -0.571% api 6095800 6058936 -36864 -0.605% asm 4930928 4906352 -24576 -0.498% buildid 2881520 2861040 -20480 -0.711% cgo 4896584 4867912 -28672 -0.586% compile 25868408 25770104 -98304 -0.380% cover 5319656 5286888 -32768 -0.616% dist 3654528 3634048 -20480 -0.560% doc 4719672 4691000 -28672 -0.607% fix 3418312 3393736 -24576 -0.719% link 6137952 6109280 -28672 -0.467% nm 4250536 4225960 -24576 -0.578% objdump 4665192 4636520 -28672 -0.615% pack 2297488 2285200 -12288 -0.535% pprof 14735332 14657508 -77824 -0.528% test2json 2834952 2818568 -16384 -0.578% trace 11679964 11618524 -61440 -0.526% vet 8452696 8403544 -49152 -0.581% Change-Id: I30665dce57ec7a52e7d3c6718560b3aa5b83dd0b Reviewed-on: https://go-review.googlesource.com/c/go/+/171760 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/internal/objabi/funcdata.go | 13 +++++++------ src/runtime/funcdata.h | 12 ++++++------ src/runtime/symtab.go | 16 +++++++++------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/cmd/internal/objabi/funcdata.go b/src/cmd/internal/objabi/funcdata.go index 231d11b185..addbd2ac88 100644 --- a/src/cmd/internal/objabi/funcdata.go +++ b/src/cmd/internal/objabi/funcdata.go @@ -11,14 +11,15 @@ package objabi // ../../../runtime/symtab.go. const ( - PCDATA_StackMapIndex = 0 - PCDATA_InlTreeIndex = 1 - PCDATA_RegMapIndex = 2 + PCDATA_RegMapIndex = 0 + PCDATA_StackMapIndex = 1 + PCDATA_InlTreeIndex = 2 + FUNCDATA_ArgsPointerMaps = 0 FUNCDATA_LocalsPointerMaps = 1 - FUNCDATA_InlTree = 2 - FUNCDATA_RegPointerMaps = 3 - FUNCDATA_StackObjects = 4 + FUNCDATA_RegPointerMaps = 2 + FUNCDATA_StackObjects = 3 + FUNCDATA_InlTree = 4 // ArgsSizeUnknown is set in Func.argsize to mark all functions // whose argument size is unknown (C vararg functions, and diff --git a/src/runtime/funcdata.h b/src/runtime/funcdata.h index 1ee67c8683..d9a35c51a0 100644 --- a/src/runtime/funcdata.h +++ b/src/runtime/funcdata.h @@ -8,15 +8,15 @@ // // These must agree with symtab.go and ../cmd/internal/objabi/funcdata.go. -#define PCDATA_StackMapIndex 0 -#define PCDATA_InlTreeIndex 1 -#define PCDATA_RegMapIndex 2 +#define PCDATA_RegMapIndex 0 +#define PCDATA_StackMapIndex 1 +#define PCDATA_InlTreeIndex 2 #define FUNCDATA_ArgsPointerMaps 0 /* garbage collector blocks */ #define FUNCDATA_LocalsPointerMaps 1 -#define FUNCDATA_InlTree 2 -#define FUNCDATA_RegPointerMaps 3 -#define FUNCDATA_StackObjects 4 +#define FUNCDATA_RegPointerMaps 2 +#define FUNCDATA_StackObjects 3 +#define FUNCDATA_InlTree 4 // Pseudo-assembly statements. diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index d61affa54a..c0e8dc279b 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -198,15 +198,17 @@ func (f *Func) funcInfo() funcInfo { // // See funcdata.h and ../cmd/internal/objabi/funcdata.go. const ( - _PCDATA_StackMapIndex = 0 - _PCDATA_InlTreeIndex = 1 - _PCDATA_RegMapIndex = 2 + _PCDATA_RegMapIndex = 0 + _PCDATA_StackMapIndex = 1 + _PCDATA_InlTreeIndex = 2 + _FUNCDATA_ArgsPointerMaps = 0 _FUNCDATA_LocalsPointerMaps = 1 - _FUNCDATA_InlTree = 2 - _FUNCDATA_RegPointerMaps = 3 - _FUNCDATA_StackObjects = 4 - _ArgsSizeUnknown = -0x80000000 + _FUNCDATA_RegPointerMaps = 2 + _FUNCDATA_StackObjects = 3 + _FUNCDATA_InlTree = 4 + + _ArgsSizeUnknown = -0x80000000 ) // A FuncID identifies particular functions that need to be treated -- GitLab From 5ccaf2c6ade286ca30c345ae1cfa0560dc02fedd Mon Sep 17 00:00:00 2001 From: Kai Dong Date: Fri, 19 Apr 2019 03:23:23 +0000 Subject: [PATCH 0867/1679] sync: update comment Comment update. Change-Id: If0d054216f9953f42df04647b85c38008b85b026 GitHub-Last-Rev: 133b4670be6dd1c94d16361c3a7a4bbdf8a355ab GitHub-Pull-Request: golang/go#31539 Reviewed-on: https://go-review.googlesource.com/c/go/+/172700 Reviewed-by: Austin Clements --- src/sync/pool.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sync/pool.go b/src/sync/pool.go index f58fdd46bc..ca7afdb12f 100644 --- a/src/sync/pool.go +++ b/src/sync/pool.go @@ -194,7 +194,7 @@ func (p *Pool) getSlow(pid int) interface{} { // Caller must call runtime_procUnpin() when done with the pool. func (p *Pool) pin() (*poolLocal, int) { pid := runtime_procPin() - // In pinSlow we store to localSize and then to local, here we load in opposite order. + // In pinSlow we store to local and then to localSize, here we load in opposite order. // Since we've disabled preemption, GC cannot happen in between. // Thus here we must observe local at least as large localSize. // We can observe a newer/larger local, it is fine (we must observe its zero-initialized-ness). -- GitLab From 4c236b9b097882f3aef8116e1ac9f65463bf6f01 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 19 Apr 2019 09:50:01 -0700 Subject: [PATCH 0868/1679] cmd/link: require cgo support for TestSectionsWithSameName The test doesn't really require cgo, but it does require that we know the right flags to use to run the C compiler, and that is not necessarily correct if we don't support cgo. Fixes #31565 Change-Id: I04dc8db26697caa470e91ad712376aa621cf765d Reviewed-on: https://go-review.googlesource.com/c/go/+/172981 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/link/elf_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/elf_test.go b/src/cmd/link/elf_test.go index 9eb8d1a14b..3df9869284 100644 --- a/src/cmd/link/elf_test.go +++ b/src/cmd/link/elf_test.go @@ -34,6 +34,7 @@ func main() {} // with the same name. func TestSectionsWithSameName(t *testing.T) { testenv.MustHaveGoBuild(t) + testenv.MustHaveCGO(t) t.Parallel() objcopy, err := exec.LookPath("objcopy") @@ -77,7 +78,7 @@ func TestSectionsWithSameName(t *testing.T) { cflags := strings.Fields(string(cflagsb)) asmObj := filepath.Join(dir, "x.o") - t.Logf("%s %v -o %s %s", cc, cflags, asmObj, asmFile) + t.Logf("%s %v -c -o %s %s", cc, cflags, asmObj, asmFile) if out, err := exec.Command(cc, append(cflags, "-c", "-o", asmObj, asmFile)...).CombinedOutput(); err != nil { t.Logf("%s", out) t.Fatal(err) -- GitLab From 4a119141303407d9223296e9092611560665d3e1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 19 Apr 2019 09:48:36 -0700 Subject: [PATCH 0869/1679] bootstrap.bash: make source writable before cleaning Otherwise the "git clean" command fails with errors like rm: cannot remove '/home/iant/go-linux-ppc64-bootstrap/pkg/mod/golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c/encoding/simplifiedchinese/all.go': Permission denied Change-Id: Iecfb1fed6d59819d7fdceb9e391a2b3f81ea620c Reviewed-on: https://go-review.googlesource.com/c/go/+/172998 Run-TryBot: Ian Lance Taylor Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/bootstrap.bash | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bootstrap.bash b/src/bootstrap.bash index bc9d445345..92a4718286 100755 --- a/src/bootstrap.bash +++ b/src/bootstrap.bash @@ -49,6 +49,7 @@ cp -R "$src" "$targ" cd "$targ" echo echo "#### Cleaning $targ" +chmod -R +w . rm -f .gitignore if [ -e .git ]; then git clean -f -d -- GitLab From 97252f620ff8718ca9f7fef0ddebef16c6993612 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Fri, 19 Apr 2019 11:53:33 -0400 Subject: [PATCH 0870/1679] runtime: suppress thread event prints in gdb test Pass "set print thread-events off" to gdb to suppress thread event prints, like "[New Thread 0xe7b83b40 (LWP 18609)]". We don't check them, and the extra output may confuse our other checks, in particular, checkCleanBacktrace. Hopefully fixes #31569. Change-Id: I6549e1280da7afa1d2e38da2b2fa7cc18c2f0373 Reviewed-on: https://go-review.googlesource.com/c/go/+/172980 Run-TryBot: Cherry Zhang Reviewed-by: Bryan C. Mills TryBot-Result: Gobot Gobot --- src/runtime/runtime-gdb_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go index 8117a5c979..66f275969b 100644 --- a/src/runtime/runtime-gdb_test.go +++ b/src/runtime/runtime-gdb_test.go @@ -180,6 +180,7 @@ func testGdbPython(t *testing.T, cgo bool) { args := []string{"-nx", "-q", "--batch", "-iex", "add-auto-load-safe-path " + filepath.Join(runtime.GOROOT(), "src", "runtime"), "-ex", "set startup-with-shell off", + "-ex", "set print thread-events off", } if cgo { // When we build the cgo version of the program, the system's -- GitLab From 64e29f94e29ce6fa01537f639aec5fbea28a6a7f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 19 Apr 2019 16:09:17 +0000 Subject: [PATCH 0871/1679] internal/goversion: add new package, move Go 1.x constant there out of go/build Found by Josh, who says in the bug that it shrinks cmd/compile by 1.6 MB (6.5%). Fixes #31563 Change-Id: I35127af539630e628a0a4f2273af519093536c38 Reviewed-on: https://go-review.googlesource.com/c/go/+/172997 Reviewed-by: Ian Lance Taylor Reviewed-by: Josh Bleecher Snyder --- src/cmd/compile/internal/gc/dep_test.go | 26 +++++++++++++++++++++++++ src/cmd/compile/internal/gc/main.go | 5 ++--- src/cmd/dist/buildtool.go | 1 + src/go/build/build.go | 18 ++++++++--------- src/go/build/deps_test.go | 2 +- src/internal/goversion/goversion.go | 13 +++++++++++++ 6 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 src/cmd/compile/internal/gc/dep_test.go create mode 100644 src/internal/goversion/goversion.go diff --git a/src/cmd/compile/internal/gc/dep_test.go b/src/cmd/compile/internal/gc/dep_test.go new file mode 100644 index 0000000000..7fc9be5e64 --- /dev/null +++ b/src/cmd/compile/internal/gc/dep_test.go @@ -0,0 +1,26 @@ +// Copyright 2019 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 gc + +import ( + "internal/testenv" + "os/exec" + "strings" + "testing" +) + +func TestDeps(t *testing.T) { + testenv.MustHaveGoBuild(t) + out, err := exec.Command("go", "list", "-f", "{{.Deps}}", "cmd/compile/internal/gc").Output() + if err != nil { + t.Fatal(err) + } + for _, dep := range strings.Fields(strings.Trim(string(out), "[]")) { + switch dep { + case "go/build", "go/token": + t.Errorf("undesired dependency on %q", dep) + } + } +} diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index 71a4024765..969b596907 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -19,7 +19,7 @@ import ( "cmd/internal/sys" "flag" "fmt" - "go/build" + "internal/goversion" "io" "io/ioutil" "log" @@ -1426,8 +1426,7 @@ var flag_lang string // currentLang returns the current language version. func currentLang() string { - tags := build.Default.ReleaseTags - return tags[len(tags)-1] + return fmt.Sprintf("go1.%d", goversion.Version) } // goVersionRE is a regular expression that matches the valid diff --git a/src/cmd/dist/buildtool.go b/src/cmd/dist/buildtool.go index 7b85927785..26e12991a4 100644 --- a/src/cmd/dist/buildtool.go +++ b/src/cmd/dist/buildtool.go @@ -89,6 +89,7 @@ var bootstrapDirs = []string{ "debug/elf", "debug/macho", "debug/pe", + "internal/goversion", "internal/xcoff", "math/big", "math/bits", diff --git a/src/go/build/build.go b/src/go/build/build.go index 1be10f1fb8..1ad076089d 100644 --- a/src/go/build/build.go +++ b/src/go/build/build.go @@ -13,6 +13,7 @@ import ( "go/parser" "go/token" "internal/goroot" + "internal/goversion" "io" "io/ioutil" "log" @@ -292,15 +293,14 @@ func defaultContext() Context { c.GOPATH = envOr("GOPATH", defaultGOPATH()) c.Compiler = runtime.Compiler - // Each major Go release in the Go 1.x series should add a tag here. - // Old tags should not be removed. That is, the go1.x tag is present - // in all releases >= Go 1.x. Code that requires Go 1.x or later should - // say "+build go1.x", and code that should only be built before Go 1.x - // (perhaps it is the stub to use in that case) should say "+build !go1.x". - // NOTE: If you add to this list, also update the doc comment in doc.go. - // NOTE: The last element in ReleaseTags should be the current release. - const version = 13 // go1.13 - for i := 1; i <= version; i++ { + // Each major Go release in the Go 1.x series adds a new + // "go1.x" release tag. That is, the go1.x tag is present in + // all releases >= Go 1.x. Code that requires Go 1.x or later + // should say "+build go1.x", and code that should only be + // built before Go 1.x (perhaps it is the stub to use in that + // case) should say "+build !go1.x". + // The last element in ReleaseTags is the current release. + for i := 1; i <= goversion.Version; i++ { c.ReleaseTags = append(c.ReleaseTags, "go1."+strconv.Itoa(i)) } diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index c81d313b72..50650bd373 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -268,7 +268,7 @@ var pkgDeps = map[string][]string{ "encoding/pem": {"L4"}, "encoding/xml": {"L4", "encoding"}, "flag": {"L4", "OS"}, - "go/build": {"L4", "OS", "GOPARSER", "internal/goroot"}, + "go/build": {"L4", "OS", "GOPARSER", "internal/goroot", "internal/goversion"}, "html": {"L4"}, "image/draw": {"L4", "image/internal/imageutil"}, "image/gif": {"L4", "compress/lzw", "image/color/palette", "image/draw"}, diff --git a/src/internal/goversion/goversion.go b/src/internal/goversion/goversion.go new file mode 100644 index 0000000000..8f9c7c99c2 --- /dev/null +++ b/src/internal/goversion/goversion.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 goversion + +// Version is the current Go 1.x version. During development cycles on +// the master branch it changes to be the version of the next Go 1.x +// release. +// +// When incrementing this, also add to the list at src/go/build/doc.go +// (search for "onward"). +const Version = 13 -- GitLab From 47150aafbfaadf1f193b8840df02f388998e83ab Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 19 Apr 2019 10:15:58 -0400 Subject: [PATCH 0872/1679] cmd/go/internal/modfetch: comment on known bug in isVendoredPackage Fixes #31562 Change-Id: Ida30dd8071eccb6b490ab89a1de087038fe26796 Reviewed-on: https://go-review.googlesource.com/c/go/+/172977 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modfetch/coderepo.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/cmd/go/internal/modfetch/coderepo.go b/src/cmd/go/internal/modfetch/coderepo.go index 7aedf1d861..3581f93fe7 100644 --- a/src/cmd/go/internal/modfetch/coderepo.go +++ b/src/cmd/go/internal/modfetch/coderepo.go @@ -634,6 +634,19 @@ func isVendoredPackage(name string) bool { if strings.HasPrefix(name, "vendor/") { i += len("vendor/") } else if j := strings.Index(name, "/vendor/"); j >= 0 { + // This offset looks incorrect; this should probably be + // + // i = j + len("/vendor/") + // + // (See https://golang.org/issue/31562.) + // + // Unfortunately, we can't fix it without invalidating checksums. + // Fortunately, the error appears to be strictly conservative: we'll retain + // vendored packages that we should have pruned, but we won't prune + // non-vendored packages that we should have retained. + // + // Since this defect doesn't seem to break anything, it's not worth fixing + // for now. i += len("/vendor/") } else { return false -- GitLab From b2f94d3e88775fae4cf19d34c87a61efa814d079 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 3 Apr 2019 22:41:48 -0400 Subject: [PATCH 0873/1679] cmd/link: mmap output file Use mmap for writing most of the output file content, specifically, the sections and segments. After layout, we already know the sizes and file offsets for the sections and segments. So we can just write the bytes by copying to a mmap'd backing store. The writing of the output file is split into two parts. The first part writes the sections and segments to the mmap'd region. The second part writes some extra content, for which we don't know the size, so we use direct file IO. This is in preparation for mmap'ing input files read-only. Change-Id: I9f3b4616a9f96bfd5c940d74c50aacd6d330f7d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/170738 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/amd64/asm.go | 2 ++ src/cmd/link/internal/amd64/obj.go | 1 + src/cmd/link/internal/arm/asm.go | 2 ++ src/cmd/link/internal/arm/obj.go | 1 + src/cmd/link/internal/arm64/asm.go | 2 ++ src/cmd/link/internal/arm64/obj.go | 1 + src/cmd/link/internal/ld/data.go | 6 ++-- src/cmd/link/internal/ld/lib.go | 15 +++++--- src/cmd/link/internal/ld/main.go | 25 +++++++++++-- src/cmd/link/internal/ld/outbuf.go | 43 +++++++++++++++++++--- src/cmd/link/internal/ld/outbuf_mmap.go | 44 +++++++++++++++++++++++ src/cmd/link/internal/ld/outbuf_nommap.go | 15 ++++++++ src/cmd/link/internal/mips/asm.go | 2 ++ src/cmd/link/internal/mips/obj.go | 1 + src/cmd/link/internal/mips64/asm.go | 2 ++ src/cmd/link/internal/mips64/obj.go | 1 + src/cmd/link/internal/ppc64/asm.go | 2 ++ src/cmd/link/internal/ppc64/obj.go | 1 + src/cmd/link/internal/s390x/asm.go | 2 ++ src/cmd/link/internal/s390x/obj.go | 3 +- src/cmd/link/internal/wasm/asm.go | 4 ++- src/cmd/link/internal/wasm/obj.go | 1 + src/cmd/link/internal/x86/asm.go | 2 ++ src/cmd/link/internal/x86/obj.go | 1 + 24 files changed, 165 insertions(+), 14 deletions(-) create mode 100644 src/cmd/link/internal/ld/outbuf_mmap.go create mode 100644 src/cmd/link/internal/ld/outbuf_nommap.go diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index fca4877a45..7dbe99c581 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -704,7 +704,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { machlink := int64(0) if ctxt.HeadType == objabi.Hdarwin { machlink = ld.Domacholink(ctxt) diff --git a/src/cmd/link/internal/amd64/obj.go b/src/cmd/link/internal/amd64/obj.go index eeeed1ab1a..23741eb4f6 100644 --- a/src/cmd/link/internal/amd64/obj.go +++ b/src/cmd/link/internal/amd64/obj.go @@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/arm/asm.go b/src/cmd/link/internal/arm/asm.go index 7ea1fe5f8f..43d387c862 100644 --- a/src/cmd/link/internal/arm/asm.go +++ b/src/cmd/link/internal/arm/asm.go @@ -800,7 +800,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { machlink = uint32(ld.Domacholink(ctxt)) diff --git a/src/cmd/link/internal/arm/obj.go b/src/cmd/link/internal/arm/obj.go index ea91711df0..45a406ec06 100644 --- a/src/cmd/link/internal/arm/obj.go +++ b/src/cmd/link/internal/arm/obj.go @@ -52,6 +52,7 @@ func Init() (*sys.Arch, ld.Arch) { Archrelocvariant: archrelocvariant, Trampoline: trampoline, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 5ba038d147..c832099726 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -426,7 +426,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { machlink = uint32(ld.Domacholink(ctxt)) diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 04202012ee..2f8a141139 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index cb74b9a723..a6f75b74e1 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -792,6 +792,7 @@ func Datblk(ctxt *Link, addr int64, size int64) { writeDatblkToOutBuf(ctxt, ctxt.Out, addr, size) } +// Used only on Wasm for now. func DatblkBytes(ctxt *Link, addr int64, size int64) []byte { buf := bytes.NewBuffer(make([]byte, 0, size)) out := &OutBuf{w: bufio.NewWriter(buf)} @@ -2319,7 +2320,8 @@ func (ctxt *Link) address() []*sym.Segment { } // layout assigns file offsets and lengths to the segments in order. -func (ctxt *Link) layout(order []*sym.Segment) { +// Returns the file size containing all the segments. +func (ctxt *Link) layout(order []*sym.Segment) uint64 { var prev *sym.Segment for _, seg := range order { if prev == nil { @@ -2348,7 +2350,7 @@ func (ctxt *Link) layout(order []*sym.Segment) { } prev = seg } - + return prev.Fileoff + prev.Filelen } // add a trampoline with symbol s (to be laid down after the current function) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 62f2453358..c474878191 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -127,8 +127,15 @@ type Arch struct { // offset value. Archrelocvariant func(link *Link, rel *sym.Reloc, sym *sym.Symbol, offset int64) (relocatedOffset int64) - Trampoline func(*Link, *sym.Reloc, *sym.Symbol) - Asmb func(*Link) + Trampoline func(*Link, *sym.Reloc, *sym.Symbol) + + // Asmb and Asmb2 are arch-specific routines that write the output + // file. Typically, Asmb writes most of the content (sections and + // segments), for which we have computed the size and offset. Asmb2 + // writes the rest. + Asmb func(*Link) + Asmb2 func(*Link) + Elfreloc1 func(*Link, *sym.Reloc, int64) bool Elfsetupplt func(*Link) Gentext func(*Link) @@ -261,7 +268,7 @@ func libinit(ctxt *Link) { Lflag(ctxt, filepath.Join(objabi.GOROOT, "pkg", fmt.Sprintf("%s_%s%s%s", objabi.GOOS, objabi.GOARCH, suffixsep, suffix))) mayberemoveoutfile() - f, err := os.OpenFile(*flagOutfile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775) + f, err := os.OpenFile(*flagOutfile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) if err != nil { Exitf("cannot create %s: %v", *flagOutfile, err) } @@ -1014,7 +1021,7 @@ func hostlinksetup(ctxt *Link) { p := filepath.Join(*flagTmpdir, "go.o") var err error - f, err := os.OpenFile(p, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0775) + f, err := os.OpenFile(p, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) if err != nil { Exitf("cannot create %s: %v", p, err) } diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 48a9953893..1b2d376fd4 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -241,8 +241,29 @@ func Main(arch *sys.Arch, theArch Arch) { order := ctxt.address() ctxt.reloc() dwarfcompress(ctxt) - ctxt.layout(order) - thearch.Asmb(ctxt) + filesize := ctxt.layout(order) + + // Write out the output file. + // It is split into two parts (Asmb and Asmb2). The first + // part writes most of the content (sections and segments), + // for which we have computed the size and offset, in a + // mmap'd region. The second part writes more content, for + // which we don't know the size. + var outputMmapped bool + if ctxt.Arch.Family != sys.Wasm { + // Don't mmap if we're building for Wasm. Wasm file + // layout is very different so filesize is meaningless. + err := ctxt.Out.Mmap(filesize) + outputMmapped = err == nil + } + if outputMmapped { + thearch.Asmb(ctxt) + ctxt.Out.Munmap() + } else { + thearch.Asmb(ctxt) + } + thearch.Asmb2(ctxt) + ctxt.undef() ctxt.hostlink() ctxt.archive() diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index 5df2be4301..f1b5d7495c 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -8,6 +8,7 @@ import ( "bufio" "cmd/internal/sys" "encoding/binary" + "log" "os" ) @@ -20,10 +21,18 @@ import ( // // Second, it provides a very cheap offset counter that doesn't require // any system calls to read the value. +// +// It also mmaps the output file (if available). The intended usage is: +// - Mmap the output file +// - Write the content +// - possibly apply any edits in the output buffer +// - Munmap the output file +// - possibly write more content to the file, which will not be edited later. type OutBuf struct { arch *sys.Arch off int64 w *bufio.Writer + buf []byte // backing store of mmap'd output file f *os.File encbuf [8]byte // temp buffer used by WriteN methods } @@ -32,9 +41,11 @@ func (out *OutBuf) SeekSet(p int64) { if p == out.off { return } - out.Flush() - if _, err := out.f.Seek(p, 0); err != nil { - Exitf("seeking to %d in %s: %v", p, out.f.Name(), err) + if out.buf == nil { + out.Flush() + if _, err := out.f.Seek(p, 0); err != nil { + Exitf("seeking to %d in %s: %v", p, out.f.Name(), err) + } } out.off = p } @@ -49,12 +60,22 @@ func (out *OutBuf) Offset() int64 { // to explicitly handle the returned error as long as Flush is // eventually called. func (out *OutBuf) Write(v []byte) (int, error) { + if out.buf != nil { + n := copy(out.buf[out.off:], v) + out.off += int64(n) + return n, nil + } n, err := out.w.Write(v) out.off += int64(n) return n, err } func (out *OutBuf) Write8(v uint8) { + if out.buf != nil { + out.buf[out.off] = v + out.off++ + return + } if err := out.w.WriteByte(v); err == nil { out.off++ } @@ -92,6 +113,14 @@ func (out *OutBuf) Write64b(v uint64) { } func (out *OutBuf) WriteString(s string) { + if out.buf != nil { + n := copy(out.buf[out.off:], s) + if n != len(s) { + log.Fatalf("WriteString truncated. buffer size: %d, offset: %d, len(s)=%d", len(out.buf), out.off, len(s)) + } + out.off += int64(n) + return + } n, _ := out.w.WriteString(s) out.off += int64(n) } @@ -120,7 +149,13 @@ func (out *OutBuf) WriteStringPad(s string, n int, pad []byte) { } func (out *OutBuf) Flush() { - if err := out.w.Flush(); err != nil { + var err error + if out.buf != nil { + err = out.Msync() + } else { + err = out.w.Flush() + } + if err != nil { Exitf("flushing %s: %v", out.f.Name(), err) } } diff --git a/src/cmd/link/internal/ld/outbuf_mmap.go b/src/cmd/link/internal/ld/outbuf_mmap.go new file mode 100644 index 0000000000..4075141171 --- /dev/null +++ b/src/cmd/link/internal/ld/outbuf_mmap.go @@ -0,0 +1,44 @@ +// Copyright 2019 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. + +// +build darwin dragonfly freebsd linux openbsd + +package ld + +import ( + "syscall" + "unsafe" +) + +func (out *OutBuf) Mmap(filesize uint64) error { + err := out.f.Truncate(int64(filesize)) + if err != nil { + Exitf("resize output file failed: %v", err) + } + out.buf, err = syscall.Mmap(int(out.f.Fd()), 0, int(filesize), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED|syscall.MAP_FILE) + return err +} + +func (out *OutBuf) Munmap() { + err := out.Msync() + if err != nil { + Exitf("msync output file failed: %v", err) + } + syscall.Munmap(out.buf) + out.buf = nil + _, err = out.f.Seek(out.off, 0) + if err != nil { + Exitf("seek output file failed: %v", err) + } +} + +func (out *OutBuf) Msync() error { + // TODO: netbsd supports mmap and msync, but the syscall package doesn't define MSYNC. + // It is excluded from the build tag for now. + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_SYNC) + if errno != 0 { + return errno + } + return nil +} diff --git a/src/cmd/link/internal/ld/outbuf_nommap.go b/src/cmd/link/internal/ld/outbuf_nommap.go new file mode 100644 index 0000000000..36a3286099 --- /dev/null +++ b/src/cmd/link/internal/ld/outbuf_nommap.go @@ -0,0 +1,15 @@ +// Copyright 2019 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!openbsd + +package ld + +import "errors" + +var errNotSupported = errors.New("mmap not supported") + +func (out *OutBuf) Mmap(filesize uint64) error { return errNotSupported } +func (out *OutBuf) Munmap() { panic("unreachable") } +func (out *OutBuf) Msync() error { panic("unreachable") } diff --git a/src/cmd/link/internal/mips/asm.go b/src/cmd/link/internal/mips/asm.go index 8409e43afc..f05455e520 100644 --- a/src/cmd/link/internal/mips/asm.go +++ b/src/cmd/link/internal/mips/asm.go @@ -197,7 +197,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/mips/obj.go b/src/cmd/link/internal/mips/obj.go index 3c71e23497..231e1ff322 100644 --- a/src/cmd/link/internal/mips/obj.go +++ b/src/cmd/link/internal/mips/obj.go @@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/mips64/asm.go b/src/cmd/link/internal/mips64/asm.go index 51eba596dc..25a1d94dcc 100644 --- a/src/cmd/link/internal/mips64/asm.go +++ b/src/cmd/link/internal/mips64/asm.go @@ -209,7 +209,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/mips64/obj.go b/src/cmd/link/internal/mips64/obj.go index b01746e59a..96042083f6 100644 --- a/src/cmd/link/internal/mips64/obj.go +++ b/src/cmd/link/internal/mips64/obj.go @@ -53,6 +53,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/ppc64/asm.go b/src/cmd/link/internal/ppc64/asm.go index d376c4de58..365a45ec13 100644 --- a/src/cmd/link/internal/ppc64/asm.go +++ b/src/cmd/link/internal/ppc64/asm.go @@ -1103,7 +1103,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/ppc64/obj.go b/src/cmd/link/internal/ppc64/obj.go index bd85856c97..51d1791f21 100644 --- a/src/cmd/link/internal/ppc64/obj.go +++ b/src/cmd/link/internal/ppc64/obj.go @@ -54,6 +54,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/s390x/asm.go b/src/cmd/link/internal/s390x/asm.go index 46a6ffef82..8540377400 100644 --- a/src/cmd/link/internal/s390x/asm.go +++ b/src/cmd/link/internal/s390x/asm.go @@ -540,7 +540,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { /* output symbol table */ ld.Symsize = 0 diff --git a/src/cmd/link/internal/s390x/obj.go b/src/cmd/link/internal/s390x/obj.go index a7e30e2d65..3454476b0f 100644 --- a/src/cmd/link/internal/s390x/obj.go +++ b/src/cmd/link/internal/s390x/obj.go @@ -50,7 +50,8 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, Archreloc: archreloc, Archrelocvariant: archrelocvariant, - Asmb: asmb, // in asm.go + Asmb: asmb, // in asm.go + Asmb2: asmb2, // in asm.go Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, diff --git a/src/cmd/link/internal/wasm/asm.go b/src/cmd/link/internal/wasm/asm.go index ea6b406c7e..8ab58b200f 100644 --- a/src/cmd/link/internal/wasm/asm.go +++ b/src/cmd/link/internal/wasm/asm.go @@ -92,9 +92,11 @@ func assignAddress(ctxt *ld.Link, sect *sym.Section, n int, s *sym.Symbol, va ui return sect, n, va } +func asmb(ctxt *ld.Link) {} // dummy + // asmb writes the final WebAssembly module binary. // Spec: https://webassembly.github.io/spec/core/binary/modules.html -func asmb(ctxt *ld.Link) { +func asmb2(ctxt *ld.Link) { if ctxt.Debugvlog != 0 { ctxt.Logf("%5.2f asmb\n", ld.Cputime()) } diff --git a/src/cmd/link/internal/wasm/obj.go b/src/cmd/link/internal/wasm/obj.go index 55f34e335b..f8090a3551 100644 --- a/src/cmd/link/internal/wasm/obj.go +++ b/src/cmd/link/internal/wasm/obj.go @@ -18,6 +18,7 @@ func Init() (*sys.Arch, ld.Arch) { Archinit: archinit, AssignAddress: assignAddress, Asmb: asmb, + Asmb2: asmb2, Gentext: gentext, } diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 9472f5516d..427ccaf629 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -662,7 +662,9 @@ func asmb(ctxt *ld.Link) { ctxt.Out.SeekSet(int64(ld.Segdwarf.Fileoff)) ld.Dwarfblk(ctxt, int64(ld.Segdwarf.Vaddr), int64(ld.Segdwarf.Filelen)) +} +func asmb2(ctxt *ld.Link) { machlink := uint32(0) if ctxt.HeadType == objabi.Hdarwin { machlink = uint32(ld.Domacholink(ctxt)) diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index dbb31263a8..f1fad20081 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -51,6 +51,7 @@ func Init() (*sys.Arch, ld.Arch) { Archreloc: archreloc, Archrelocvariant: archrelocvariant, Asmb: asmb, + Asmb2: asmb2, Elfreloc1: elfreloc1, Elfsetupplt: elfsetupplt, Gentext: gentext, -- GitLab From 15a31bd9c8e4c7b2de092266ae34e1588dc35270 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 4 Apr 2019 00:30:25 -0400 Subject: [PATCH 0874/1679] cmd/link: apply R_DWARFFILEREF later Apply R_DWARFFILEREF relocations later, along with other relocations, so that we don't modify symbols' contents before they are written to the output buffer. This is in preparation for mmap'ing input files read-only. Change-Id: I8e9ffb2f05acf8f198589b8770f277beb3847541 Reviewed-on: https://go-review.googlesource.com/c/go/+/170740 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/data.go | 10 ++++------ src/cmd/link/internal/ld/dwarf.go | 10 ++++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index a6f75b74e1..04fe3cb3b5 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -168,12 +168,6 @@ func relocsym(ctxt *Link, s *sym.Symbol) { if r.Siz == 0 { // informational relocation - no work to do continue } - if r.Type == objabi.R_DWARFFILEREF { - // These should have been processed previously during - // line table writing. - Errorf(s, "orphan R_DWARFFILEREF reloc to %v", r.Sym.Name) - continue - } // We need to be able to reference dynimport symbols when linking against // shared libraries, and Solaris, Darwin and AIX need it always @@ -490,6 +484,10 @@ func relocsym(ctxt *Link, s *sym.Symbol) { // This isn't a real relocation so it must not update // its offset value. continue + + case objabi.R_DWARFFILEREF: + // The final file index is saved in r.Add in dwarf.go:writelines. + o = r.Add } if r.Variant != sym.RV_NONE { diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 0d159c7658..9e7fea0101 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -1302,7 +1302,7 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { ls.SetUint32(ctxt.Arch, headerLengthOffset, uint32(headerend-headerstart)) } - // Apply any R_DWARFFILEREF relocations, since we now know the + // Process any R_DWARFFILEREF relocations, since we now know the // line table file indices for this compilation unit. Note that // this loop visits only subprogram DIEs: if the compiler is // changed to generate DW_AT_decl_file attributes for other @@ -1315,8 +1315,6 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { if r.Type != objabi.R_DWARFFILEREF { continue } - // Mark relocation as applied (signal to relocsym) - r.Done = true idx, ok := fileNums[int(r.Sym.Value)] if ok { if int(int32(idx)) != idx { @@ -1329,7 +1327,11 @@ func writelines(ctxt *Link, unit *compilationUnit, ls *sym.Symbol) { Errorf(f, "bad R_DWARFFILEREF relocation offset %d + 4 would write past length %d", r.Off, len(s.P)) continue } - ctxt.Arch.ByteOrder.PutUint32(f.P[r.Off:r.Off+4], uint32(idx)) + if r.Add != 0 { + Errorf(f, "bad R_DWARFFILEREF relocation: addend not zero") + } + r.Sym.Attr |= sym.AttrReachable | sym.AttrNotInSymbolTable + r.Add = int64(idx) // record the index in r.Add, we'll apply it in the reloc phase. } else { _, found := missing[int(r.Sym.Value)] if !found { -- GitLab From 248444d5eb91a26fa0b050172b22fc2cf7c72936 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 10 Apr 2019 10:18:52 -0400 Subject: [PATCH 0875/1679] cmd/link: apply DWARF relocations while doing compression We are preparing for applying relocations to the output buffer. However, for DWARF compression, relocations need to be applied before compression, but we don't have an output buffer at that time. We also cannot delay DWARF compression to when we mmap the output file, because we need the size of the DWARF sections to compute the file size. Instead of applying all the relocations together, we apply relocations in DWARF sections one symbol at a time, right before it is writing out for compression. As the symbol content may be in read-only memory (in the future), we use a temporary buffer for applying the relocations, and immediately write it out. If compression is not used, relocations are still applied all together. This is in preparation for mmap'ing input files read-only. Change-Id: Iae6d2dd71313897d5054bcc458d3bb78075b30c3 Reviewed-on: https://go-review.googlesource.com/c/go/+/171397 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/data.go | 14 ++++++++++++++ src/cmd/link/internal/ld/dwarf.go | 7 ++++--- src/cmd/link/internal/ld/link.go | 2 ++ src/cmd/link/internal/ld/main.go | 2 +- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 04fe3cb3b5..7f4fe71cb4 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -2385,6 +2385,12 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { log.Fatalf("NewWriterLevel failed: %s", err) } for _, sym := range syms { + // sym.P may be read-only. Apply relocations in a + // temporary buffer, and immediately write it out. + oldP := sym.P + ctxt.relocbuf = append(ctxt.relocbuf[:0], sym.P...) + sym.P = ctxt.relocbuf + relocsym(ctxt, sym) if _, err := z.Write(sym.P); err != nil { log.Fatalf("compression failed: %s", err) } @@ -2399,6 +2405,14 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { } i -= int64(n) } + // Restore sym.P, for 1. not holding temp buffer live + // unnecessarily, 2. if compression is not beneficial, + // we'll go back to use the uncompressed contents, in + // which case we still need sym.P. + sym.P = oldP + for i := range sym.R { + sym.R[i].Done = false + } } if err := z.Close(); err != nil { log.Fatalf("compression failed: %s", err) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 9e7fea0101..974c7ed329 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -2125,9 +2125,9 @@ func dwarfaddelfsectionsyms(ctxt *Link) { } } -// dwarfcompress compresses the DWARF sections. This must happen after -// relocations are applied. After this, dwarfp will contain a -// different (new) set of symbols, and sections may have been replaced. +// dwarfcompress compresses the DWARF sections. Relocations are applied +// on the fly. After this, dwarfp will contain a different (new) set of +// symbols, and sections may have been replaced. func dwarfcompress(ctxt *Link) { supported := ctxt.IsELF || ctxt.HeadType == objabi.Hwindows || ctxt.HeadType == objabi.Hdarwin if !ctxt.compressDWARF || !supported || ctxt.LinkMode != LinkInternal { @@ -2161,6 +2161,7 @@ func dwarfcompress(ctxt *Link) { } } dwarfp = newDwarfp + ctxt.relocbuf = nil // no longer needed, don't hold it live // Re-compute the locations of the compressed DWARF symbols // and sections, since the layout of these within the file is diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index a7609b9c7c..d3ffacf54e 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -93,6 +93,8 @@ type Link struct { compUnits []*compilationUnit // DWARF compilation units compUnitByPackage map[*sym.Library]*compilationUnit + + relocbuf []byte // temporary buffer for applying relocations } type unresolvedSymKey struct { diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 1b2d376fd4..aac37883e1 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -239,8 +239,8 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.symtab() ctxt.dodata() order := ctxt.address() - ctxt.reloc() dwarfcompress(ctxt) + ctxt.reloc() filesize := ctxt.layout(order) // Write out the output file. -- GitLab From f957a7e3572435c7d7031df8c58f63ebb633ecf7 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 3 Apr 2019 23:35:44 -0400 Subject: [PATCH 0876/1679] cmd/link: apply relocations later Move the phase of applying relocations later, after the sections and segments are written to the mmap'd output region. Then apply relocations directly in the output region, instead of the input. So the input slices we read in don't need to be modified. This is in preparation for mmap'ing input files read-only. Change-Id: If9c80657b4469da36aec5a9ab6acf664f5af8fa0 Reviewed-on: https://go-review.googlesource.com/c/go/+/170739 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/cmd/link/internal/ld/data.go | 2 +- src/cmd/link/internal/ld/main.go | 7 ++++++- src/cmd/link/internal/ld/outbuf.go | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 7f4fe71cb4..5d31de99ee 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -765,7 +765,7 @@ func blk(out *OutBuf, syms []*sym.Symbol, addr, size int64, pad []byte) { out.WriteStringPad("", int(s.Value-addr), pad) addr = s.Value } - out.Write(s.P) + out.WriteSym(s) addr += int64(len(s.P)) if addr < s.Value+s.Size { out.WriteStringPad("", int(s.Value+s.Size-addr), pad) diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index aac37883e1..e0725a1384 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -240,7 +240,6 @@ func Main(arch *sys.Arch, theArch Arch) { ctxt.dodata() order := ctxt.address() dwarfcompress(ctxt) - ctxt.reloc() filesize := ctxt.layout(order) // Write out the output file. @@ -257,9 +256,15 @@ func Main(arch *sys.Arch, theArch Arch) { outputMmapped = err == nil } if outputMmapped { + // Asmb will redirect symbols to the output file mmap, and relocations + // will be applied directly there. thearch.Asmb(ctxt) + ctxt.reloc() ctxt.Out.Munmap() } else { + // If we don't mmap, we need to apply relocations before + // writing out. + ctxt.reloc() thearch.Asmb(ctxt) } thearch.Asmb2(ctxt) diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index f1b5d7495c..3efd43d6ae 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -7,6 +7,7 @@ package ld import ( "bufio" "cmd/internal/sys" + "cmd/link/internal/sym" "encoding/binary" "log" "os" @@ -148,6 +149,20 @@ func (out *OutBuf) WriteStringPad(s string, n int, pad []byte) { } } +// WriteSym writes the content of a Symbol, then changes the Symbol's content +// to point to the output buffer that we just wrote, so we can apply further +// edit to the symbol content. +// If the output file is not Mmap'd, just writes the content. +func (out *OutBuf) WriteSym(s *sym.Symbol) { + if out.buf != nil { + start := out.off + out.Write(s.P) + s.P = out.buf[start:out.off] + } else { + out.Write(s.P) + } +} + func (out *OutBuf) Flush() { var err error if out.buf != nil { -- GitLab From dbe32284ff4fb96906cdb121508eba668dbc5bae Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 4 Apr 2019 00:29:16 -0400 Subject: [PATCH 0877/1679] cmd/link: mmap object data This resurrects CL 121198, except that this time we map read-only. In case that we need to apply relocations to the symbol's content that is backed by read-only memory, we do our own copy- on-write. This can happen if we failed to mmap the output file, or we build for Wasm. Memory profile for building k8s.io/kubernetes/cmd/kube-apiserver on Linux/AMD64: Old (before this sequence of CLs): inuse_space 1598.75MB total 669.87MB 41.90% 41.90% 669.87MB 41.90% cmd/link/internal/objfile.(*objReader).readSlices New: inuse_space 1280.45MB total 441.18MB 34.46% 34.46% 441.18MB 34.46% cmd/link/internal/objfile.(*objReader).readSlices Change-Id: I6b4d29d6eee9828089ea3120eb38c212db21330b Reviewed-on: https://go-review.googlesource.com/c/go/+/170741 Run-TryBot: Cherry Zhang Reviewed-by: Austin Clements TryBot-Result: Gobot Gobot --- src/cmd/internal/bio/buf.go | 24 +++++++++ src/cmd/internal/bio/buf_mmap.go | 62 ++++++++++++++++++++++++ src/cmd/internal/bio/buf_nommap.go | 11 +++++ src/cmd/link/internal/ld/data.go | 45 +++++++++++------ src/cmd/link/internal/ld/outbuf.go | 1 + src/cmd/link/internal/objfile/objfile.go | 16 ++++-- src/cmd/link/internal/sym/attribute.go | 6 ++- 7 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 src/cmd/internal/bio/buf_mmap.go create mode 100644 src/cmd/internal/bio/buf_nommap.go diff --git a/src/cmd/internal/bio/buf.go b/src/cmd/internal/bio/buf.go index a3edd74383..388105c3c7 100644 --- a/src/cmd/internal/bio/buf.go +++ b/src/cmd/internal/bio/buf.go @@ -7,6 +7,7 @@ package bio import ( "bufio" + "io" "log" "os" ) @@ -105,3 +106,26 @@ func (r *Reader) File() *os.File { func (w *Writer) File() *os.File { return w.f } + +// Slice reads the next length bytes of r into a slice. +// +// This slice may be backed by mmap'ed memory. Currently, this memory +// will never be unmapped. The second result reports whether the +// backing memory is read-only. +func (r *Reader) Slice(length uint64) ([]byte, bool, error) { + if length == 0 { + return []byte{}, false, nil + } + + data, ok := r.sliceOS(length) + if ok { + return data, true, nil + } + + data = make([]byte, length) + _, err := io.ReadFull(r, data) + if err != nil { + return nil, false, err + } + return data, false, nil +} diff --git a/src/cmd/internal/bio/buf_mmap.go b/src/cmd/internal/bio/buf_mmap.go new file mode 100644 index 0000000000..b8c78b3311 --- /dev/null +++ b/src/cmd/internal/bio/buf_mmap.go @@ -0,0 +1,62 @@ +// Copyright 2019 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. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package bio + +import ( + "runtime" + "sync/atomic" + "syscall" +) + +// mmapLimit is the maximum number of mmaped regions to create before +// falling back to reading into a heap-allocated slice. This exists +// because some operating systems place a limit on the number of +// distinct mapped regions per process. As of this writing: +// +// Darwin unlimited +// DragonFly 1000000 (vm.max_proc_mmap) +// FreeBSD unlimited +// Linux 65530 (vm.max_map_count) // TODO: query /proc/sys/vm/max_map_count? +// NetBSD unlimited +// OpenBSD unlimited +var mmapLimit int32 = 1<<31 - 1 + +func init() { + // Linux is the only practically concerning OS. + if runtime.GOOS == "linux" { + mmapLimit = 30000 + } +} + +func (r *Reader) sliceOS(length uint64) ([]byte, bool) { + // For small slices, don't bother with the overhead of a + // mapping, especially since we have no way to unmap it. + const threshold = 16 << 10 + if length < threshold { + return nil, false + } + + // Have we reached the mmap limit? + if atomic.AddInt32(&mmapLimit, -1) < 0 { + atomic.AddInt32(&mmapLimit, 1) + return nil, false + } + + // Page-align the offset. + off := r.Offset() + align := syscall.Getpagesize() + aoff := off &^ int64(align-1) + + data, err := syscall.Mmap(int(r.f.Fd()), aoff, int(length+uint64(off-aoff)), syscall.PROT_READ, syscall.MAP_SHARED|syscall.MAP_FILE) + if err != nil { + return nil, false + } + + data = data[off-aoff:] + r.Seek(int64(length), 1) + return data, true +} diff --git a/src/cmd/internal/bio/buf_nommap.go b/src/cmd/internal/bio/buf_nommap.go new file mode 100644 index 0000000000..f43c67ac2d --- /dev/null +++ b/src/cmd/internal/bio/buf_nommap.go @@ -0,0 +1,11 @@ +// Copyright 2019 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. + +// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd + +package bio + +func (r *Reader) sliceOS(length uint64) ([]byte, bool) { + return nil, false +} diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 5d31de99ee..52d33edbbb 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -127,6 +127,15 @@ func trampoline(ctxt *Link, s *sym.Symbol) { // This is a performance-critical function for the linker; be careful // to avoid introducing unnecessary allocations in the main loop. func relocsym(ctxt *Link, s *sym.Symbol) { + if len(s.R) == 0 { + return + } + if s.Attr.ReadOnly() { + // The symbol's content is backed by read-only memory. + // Copy it to writable memory to apply relocations. + s.P = append([]byte(nil), s.P...) + s.Attr.Set(sym.AttrReadOnly, false) + } for ri := int32(0); ri < int32(len(s.R)); ri++ { r := &s.R[ri] if r.Done { @@ -2384,17 +2393,21 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { if err != nil { log.Fatalf("NewWriterLevel failed: %s", err) } - for _, sym := range syms { - // sym.P may be read-only. Apply relocations in a + for _, s := range syms { + // s.P may be read-only. Apply relocations in a // temporary buffer, and immediately write it out. - oldP := sym.P - ctxt.relocbuf = append(ctxt.relocbuf[:0], sym.P...) - sym.P = ctxt.relocbuf - relocsym(ctxt, sym) - if _, err := z.Write(sym.P); err != nil { + oldP := s.P + wasReadOnly := s.Attr.ReadOnly() + if len(s.R) != 0 && wasReadOnly { + ctxt.relocbuf = append(ctxt.relocbuf[:0], s.P...) + s.P = ctxt.relocbuf + s.Attr.Set(sym.AttrReadOnly, false) + } + relocsym(ctxt, s) + if _, err := z.Write(s.P); err != nil { log.Fatalf("compression failed: %s", err) } - for i := sym.Size - int64(len(sym.P)); i > 0; { + for i := s.Size - int64(len(s.P)); i > 0; { b := zeros[:] if i < int64(len(b)) { b = b[:i] @@ -2405,13 +2418,15 @@ func compressSyms(ctxt *Link, syms []*sym.Symbol) []byte { } i -= int64(n) } - // Restore sym.P, for 1. not holding temp buffer live - // unnecessarily, 2. if compression is not beneficial, - // we'll go back to use the uncompressed contents, in - // which case we still need sym.P. - sym.P = oldP - for i := range sym.R { - sym.R[i].Done = false + // Restore s.P if a temporary buffer was used. If compression + // is not beneficial, we'll go back to use the uncompressed + // contents, in which case we still need s.P. + if len(s.R) != 0 && wasReadOnly { + s.P = oldP + s.Attr.Set(sym.AttrReadOnly, wasReadOnly) + for i := range s.R { + s.R[i].Done = false + } } } if err := z.Close(); err != nil { diff --git a/src/cmd/link/internal/ld/outbuf.go b/src/cmd/link/internal/ld/outbuf.go index 3efd43d6ae..f8e65ef8ae 100644 --- a/src/cmd/link/internal/ld/outbuf.go +++ b/src/cmd/link/internal/ld/outbuf.go @@ -158,6 +158,7 @@ func (out *OutBuf) WriteSym(s *sym.Symbol) { start := out.off out.Write(s.P) s.P = out.buf[start:out.off] + s.Attr.Set(sym.AttrReadOnly, false) } else { out.Write(s.P) } diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index 7f93912a44..3de669ee8d 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -34,7 +34,7 @@ var emptyPkg = []byte(`"".`) // objReader reads Go object files. type objReader struct { - rd *bufio.Reader + rd *bio.Reader arch *sys.Arch syms *sym.Symbols lib *sym.Library @@ -43,6 +43,7 @@ type objReader struct { localSymVersion int flags int strictDupMsgs int + dataSize int // rdBuf is used by readString and readSymName as scratch for reading strings. rdBuf []byte @@ -56,6 +57,8 @@ type objReader struct { funcdata []*sym.Symbol funcdataoff []int64 file []*sym.Symbol + + dataReadOnly bool // whether data is backed by read-only memory } // Flags to enable optional behavior during object loading/reading. @@ -76,7 +79,7 @@ const ( func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, lib *sym.Library, length int64, pn string, flags int) int { start := f.Offset() r := &objReader{ - rd: f.Reader, + rd: f, lib: lib, arch: arch, syms: syms, @@ -133,7 +136,10 @@ func (r *objReader) loadObjFile() { r.readSlices() // Data section - r.readFull(r.data) + r.data, r.dataReadOnly, err = r.rd.Slice(uint64(r.dataSize)) + if err != nil { + log.Fatalf("%s: error reading %s", r.pn, err) + } // Defined symbols for { @@ -156,9 +162,8 @@ func (r *objReader) loadObjFile() { } func (r *objReader) readSlices() { + r.dataSize = r.readInt() n := r.readInt() - r.data = make([]byte, n) - n = r.readInt() r.reloc = make([]sym.Reloc, n) n = r.readInt() r.pcdata = make([]sym.Pcdata, n) @@ -249,6 +254,7 @@ overwrite: dup.Gotype = typ } s.P = data + s.Attr.Set(sym.AttrReadOnly, r.dataReadOnly) if nreloc > 0 { s.R = r.reloc[:nreloc:nreloc] if !isdup { diff --git a/src/cmd/link/internal/sym/attribute.go b/src/cmd/link/internal/sym/attribute.go index 74fda1495e..4b69bf32d0 100644 --- a/src/cmd/link/internal/sym/attribute.go +++ b/src/cmd/link/internal/sym/attribute.go @@ -78,7 +78,10 @@ const ( // AttrTopFrame means that the function is an entry point and unwinders // should stop when they hit this function. AttrTopFrame - // 18 attributes defined so far. + // AttrReadOnly indicates whether the symbol's content (Symbol.P) is backed by + // read-only memory. + AttrReadOnly + // 19 attributes defined so far. ) func (a Attribute) DuplicateOK() bool { return a&AttrDuplicateOK != 0 } @@ -99,6 +102,7 @@ func (a Attribute) VisibilityHidden() bool { return a&AttrVisibilityHidden != 0 func (a Attribute) SubSymbol() bool { return a&AttrSubSymbol != 0 } func (a Attribute) Container() bool { return a&AttrContainer != 0 } func (a Attribute) TopFrame() bool { return a&AttrTopFrame != 0 } +func (a Attribute) ReadOnly() bool { return a&AttrReadOnly != 0 } func (a Attribute) CgoExport() bool { return a.CgoExportDynamic() || a.CgoExportStatic() -- GitLab From 14b5b4a2a13c3148fdfeb4852436661791a13e2e Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Fri, 19 Apr 2019 12:27:25 -0400 Subject: [PATCH 0878/1679] cmd/go/internal/modload: fix boundary conditions in matchPackages This makes the boundary logic of matchPackages consistent with modload.dirInModule. Previously, matchPackages always stopped at go.mod file, even within the vendor tree. However, we do not guarantee that the vendor tree is free of such files in general. matchPackages also issued needless stat operations for modules in the module cach, which we already know to be free of nested modules. On systems with slow filesystems (such as macOS), those extra calls could potentially slow package matching considerably. Change-Id: I71979ab752e1d3971b370b37085d30502690413b Reviewed-on: https://go-review.googlesource.com/c/go/+/172985 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/search.go | 36 +++++++++++++------ .../testdata/script/mod_patterns_vendor.txt | 28 +++++++++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_patterns_vendor.txt diff --git a/src/cmd/go/internal/modload/search.go b/src/cmd/go/internal/modload/search.go index 3af39747c6..d82386eca3 100644 --- a/src/cmd/go/internal/modload/search.go +++ b/src/cmd/go/internal/modload/search.go @@ -35,7 +35,13 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } var pkgs []string - walkPkgs := func(root, importPathRoot string, includeVendor bool) { + type pruning int8 + const ( + pruneVendor = pruning(1 << iota) + pruneGoMod + ) + + walkPkgs := func(root, importPathRoot string, prune pruning) { root = filepath.Clean(root) filepath.Walk(root, func(path string, fi os.FileInfo, err error) error { if err != nil { @@ -75,7 +81,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] return filepath.SkipDir } // Stop at module boundaries. - if path != root { + if (prune&pruneGoMod != 0) && path != root { if fi, err := os.Stat(filepath.Join(path, "go.mod")); err == nil && !fi.IsDir() { return filepath.SkipDir } @@ -90,7 +96,7 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } } - if elem == "vendor" && !includeVendor { + if elem == "vendor" && (prune&pruneVendor != 0) { return filepath.SkipDir } return nil @@ -98,16 +104,16 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] } if useStd { - walkPkgs(cfg.GOROOTsrc, "", true) + walkPkgs(cfg.GOROOTsrc, "", pruneGoMod) if treeCanMatch("cmd") { - walkPkgs(filepath.Join(cfg.GOROOTsrc, "cmd"), "cmd", true) + walkPkgs(filepath.Join(cfg.GOROOTsrc, "cmd"), "cmd", pruneGoMod) } } if cfg.BuildMod == "vendor" { if HasModRoot() { - walkPkgs(ModRoot(), targetPrefix, false) - walkPkgs(filepath.Join(ModRoot(), "vendor"), "", false) + walkPkgs(ModRoot(), targetPrefix, pruneGoMod|pruneVendor) + walkPkgs(filepath.Join(ModRoot(), "vendor"), "", pruneVendor) } return pkgs } @@ -116,23 +122,33 @@ func matchPackages(pattern string, tags map[string]bool, useStd bool, modules [] if !treeCanMatch(mod.Path) { continue } - var root, modPrefix string + + var ( + root, modPrefix string + isLocal bool + ) if mod == Target { if !HasModRoot() { continue // If there is no main module, we can't search in it. } root = ModRoot() modPrefix = targetPrefix + isLocal = true } else { var err error - root, _, err = fetch(mod) + root, isLocal, err = fetch(mod) if err != nil { base.Errorf("go: %v", err) continue } modPrefix = mod.Path } - walkPkgs(root, modPrefix, false) + + prune := pruneVendor + if isLocal { + prune |= pruneGoMod + } + walkPkgs(root, modPrefix, prune) } return pkgs diff --git a/src/cmd/go/testdata/script/mod_patterns_vendor.txt b/src/cmd/go/testdata/script/mod_patterns_vendor.txt new file mode 100644 index 0000000000..b4dc401117 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_patterns_vendor.txt @@ -0,0 +1,28 @@ +env GO111MODULE=on + +go list -mod=vendor example.com/... +stdout ^example.com/x$ +stdout ^example.com/x/y$ +! stdout ^example.com/x/vendor + +-- go.mod -- +module example.com/m + +-- vendor/modules.txt -- +# example.com/x v0.0.0 +example.com/x +# example.com/x/y v0.1.0 +example.com/x/y + +-- vendor/example.com/x/go.mod -- +module example.com/x +-- vendor/example.com/x/x.go -- +package x + +-- vendor/example.com/x/y/go.mod -- +module example.com/x/y +-- vendor/example.com/x/y/y.go -- +package y + +-- vendor/example.com/x/vendor/z/z.go -- +package z -- GitLab From 059f2d4a467465183820710df43a234f02d9c255 Mon Sep 17 00:00:00 2001 From: Yuval Pavel Zholkover Date: Fri, 19 Apr 2019 15:41:38 +0300 Subject: [PATCH 0879/1679] os: disable the use of netpoll on directories as well on *BSDs Follow up CL 156379. Updates #19093 Change-Id: I5ea3177fc5911d3af71cbb32584249e419e9d4a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/172937 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/os/file_unix.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/os/file_unix.go b/src/os/file_unix.go index 1cd8000dd4..89c05b2657 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -122,25 +122,27 @@ func newFile(fd uintptr, name string, kind newFileKind) *File { // we assume they know what they are doing so we allow it to be // used with kqueue. if kind == kindOpenFile { - var st syscall.Stat_t switch runtime.GOOS { - case "dragonfly", "freebsd", "netbsd", "openbsd": + case "darwin", "dragonfly", "freebsd", "netbsd", "openbsd": + var st syscall.Stat_t + err := syscall.Fstat(fdi, &st) + typ := st.Mode & syscall.S_IFMT // Don't try to use kqueue with regular files on *BSDs. // On FreeBSD a regular file is always // reported as ready for writing. // On Dragonfly, NetBSD and OpenBSD the fd is signaled // only once as ready (both read and write). // Issue 19093. - if err := syscall.Fstat(fdi, &st); err == nil && st.Mode&syscall.S_IFMT == syscall.S_IFREG { + // Also don't add directories to the netpoller. + if err == nil && (typ == syscall.S_IFREG || typ == syscall.S_IFDIR) { pollable = false } - case "darwin": // In addition to the behavior described above for regular files, // on Darwin, kqueue does not work properly with fifos: // closing the last writer does not cause a kqueue event // for any readers. See issue #24164. - if err := syscall.Fstat(fdi, &st); err == nil && (st.Mode&syscall.S_IFMT == syscall.S_IFIFO || st.Mode&syscall.S_IFMT == syscall.S_IFREG) { + if runtime.GOOS == "darwin" && typ == syscall.S_IFIFO { pollable = false } } -- GitLab From 4590abe0723cbe639f88578d9d570b136ba0850b Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Fri, 19 Apr 2019 14:50:57 -0400 Subject: [PATCH 0880/1679] cmd/link: adjust whitelist for -strictdups checking for plan9 Add a couple of additional entries to the white list used to screen out errors for builtin functions; these correspond to cases that appear to come up only on the plan9 builder. Updates #31503. Change-Id: I48ab942ab2894240efe651ec7b7eace7aa5cb45e Reviewed-on: https://go-review.googlesource.com/c/go/+/172986 Reviewed-by: David du Colombier <0intro@gmail.com> Reviewed-by: Ian Lance Taylor Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/link/internal/objfile/objfile.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cmd/link/internal/objfile/objfile.go b/src/cmd/link/internal/objfile/objfile.go index 3de669ee8d..4f30f58dfc 100644 --- a/src/cmd/link/internal/objfile/objfile.go +++ b/src/cmd/link/internal/objfile/objfile.go @@ -386,7 +386,9 @@ overwrite: // here is that we get different line numbers on formal // params; I am guessing that the pos is being inherited // from the spot where the wrapper is needed. - whitelist := strings.HasPrefix(dup.Name, "go.info.go.interface") + whitelist := (strings.HasPrefix(dup.Name, "go.info.go.interface") || + strings.HasPrefix(dup.Name, "go.info.go.builtin") || + strings.HasPrefix(dup.Name, "go.isstmt.go.builtin")) if !whitelist { r.strictDupMsgs++ } -- GitLab From dc193dee15294e451ceaae2e50e539255f4a37b6 Mon Sep 17 00:00:00 2001 From: Than McIntosh Date: Thu, 18 Apr 2019 09:45:40 -0400 Subject: [PATCH 0881/1679] go/internal/gccgoimporter: improve alias handling for anonymous fields The code in the parser that deals with anonymous structure fields records the fact that a field is anonymous, then tries to install a proxy name for the field based on the name of the type used to declare the field. If that type was an alias, the current recipe for determining the proxy name was not working properly; enhance the code to recover and report the alias name used. Fixes #31540. Change-Id: I9b7369ed558a288b56d85170c6f1144daf5228eb Reviewed-on: https://go-review.googlesource.com/c/go/+/172603 Reviewed-by: Ian Lance Taylor --- .../internal/gccgoimporter/importer_test.go | 1 + src/go/internal/gccgoimporter/parser.go | 46 +++++++++++++------ .../gccgoimporter/testdata/issue31540.go | 26 +++++++++++ .../gccgoimporter/testdata/issue31540.gox | 16 +++++++ 4 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 src/go/internal/gccgoimporter/testdata/issue31540.go create mode 100644 src/go/internal/gccgoimporter/testdata/issue31540.gox diff --git a/src/go/internal/gccgoimporter/importer_test.go b/src/go/internal/gccgoimporter/importer_test.go index ee01883203..21a3bcbe98 100644 --- a/src/go/internal/gccgoimporter/importer_test.go +++ b/src/go/internal/gccgoimporter/importer_test.go @@ -92,6 +92,7 @@ var importerTests = [...]importerTest{ {pkgpath: "nointerface", name: "I", want: "type I int"}, {pkgpath: "issue29198", name: "FooServer", want: "type FooServer struct{FooServer *FooServer; user string; ctx context.Context}"}, {pkgpath: "issue30628", name: "Apple", want: "type Apple struct{hey sync.RWMutex; x int; RQ [517]struct{Count uintptr; NumBytes uintptr; Last uintptr}}"}, + {pkgpath: "issue31540", name: "S", want: "type S struct{b int; map[Y]Z}"}, } func TestGoxImporter(t *testing.T) { diff --git a/src/go/internal/gccgoimporter/parser.go b/src/go/internal/gccgoimporter/parser.go index d0081ad3b8..5fd913c54a 100644 --- a/src/go/internal/gccgoimporter/parser.go +++ b/src/go/internal/gccgoimporter/parser.go @@ -31,6 +31,7 @@ type parser struct { typeData []string // unparsed type data (v3 and later) fixups []fixupRecord // fixups to apply at end of parsing initdata InitData // package init priority data + aliases map[int]string // maps saved type number to alias name } // When reading export data it's possible to encounter a defined type @@ -57,6 +58,7 @@ func (p *parser) init(filename string, src io.Reader, imports map[string]*types. p.scanner = new(scanner.Scanner) p.initScanner(filename, src) p.imports = imports + p.aliases = make(map[int]string) p.typeList = make([]types.Type, 1 /* type numbers start at 1 */, 16) } @@ -238,17 +240,22 @@ func deref(typ types.Type) types.Type { // Field = Name Type [string] . func (p *parser) parseField(pkg *types.Package) (field *types.Var, tag string) { name := p.parseName() - typ := p.parseType(pkg) + typ, n := p.parseTypeExtended(pkg) anon := false if name == "" { anon = true - switch typ := deref(typ).(type) { - case *types.Basic: - name = typ.Name() - case *types.Named: - name = typ.Obj().Name() - default: - p.error("anonymous field expected") + // Alias? + if aname, ok := p.aliases[n]; ok { + name = aname + } else { + switch typ := deref(typ).(type) { + case *types.Basic: + name = typ.Name() + case *types.Named: + name = typ.Obj().Name() + default: + p.error("anonymous field expected") + } } } field = types.NewField(token.NoPos, pkg, name, typ, anon) @@ -495,6 +502,7 @@ func (p *parser) parseNamedType(nlist []int) types.Type { } t := p.parseType(pkg, nlist...) obj = types.NewTypeName(token.NoPos, pkg, name, t) + p.aliases[nlist[len(nlist)-1]] = name scope.Insert(obj) return t } @@ -702,7 +710,8 @@ func (p *parser) parseResultList(pkg *types.Package) *types.Tuple { if p.tok == scanner.Ident && p.lit == "inl" { return nil } - return types.NewTuple(types.NewParam(token.NoPos, pkg, "", p.parseTypeAfterAngle(pkg))) + taa, _ := p.parseTypeAfterAngle(pkg) + return types.NewTuple(types.NewParam(token.NoPos, pkg, "", taa)) case '(': params, _ := p.parseParamList(pkg) @@ -876,16 +885,18 @@ func lookupBuiltinType(typ int) types.Type { // func (p *parser) parseType(pkg *types.Package, n ...int) types.Type { p.expect('<') - return p.parseTypeAfterAngle(pkg, n...) + t, _ := p.parseTypeAfterAngle(pkg, n...) + return t } // (*parser).Type after reading the "<". -func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type) { +func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type, n1 int) { p.expectKeyword("type") + n1 = 0 switch p.tok { case scanner.Int: - n1 := p.parseInt() + n1 = p.parseInt() if p.tok == '>' { if len(p.typeData) > 0 && p.typeList[n1] == nil { p.parseSavedType(pkg, n1, n) @@ -908,7 +919,7 @@ func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type default: p.errorf("expected type number, got %s (%q)", scanner.TokenString(p.tok), p.lit) - return nil + return nil, 0 } if t == nil || t == reserved { @@ -919,6 +930,15 @@ func (p *parser) parseTypeAfterAngle(pkg *types.Package, n ...int) (t types.Type return } +// parseTypeExtended is identical to parseType, but if the type in +// question is a saved type, returns the index as well as the type +// pointer (index returned is zero if we parsed a builtin). +func (p *parser) parseTypeExtended(pkg *types.Package, n ...int) (t types.Type, n1 int) { + p.expect('<') + t, n1 = p.parseTypeAfterAngle(pkg, n...) + return +} + // InlineBody = "" .{NN} // Reports whether a body was skipped. func (p *parser) skipInlineBody() { diff --git a/src/go/internal/gccgoimporter/testdata/issue31540.go b/src/go/internal/gccgoimporter/testdata/issue31540.go new file mode 100644 index 0000000000..2c6799ec40 --- /dev/null +++ b/src/go/internal/gccgoimporter/testdata/issue31540.go @@ -0,0 +1,26 @@ +// Copyright 2019 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 issue31540 + +type Y struct { + q int +} + +type Z map[int]int + +type X = map[Y]Z + +type A1 = X + +type A2 = A1 + +type S struct { + b int + A2 +} + +func Hallo() S { + return S{} +} diff --git a/src/go/internal/gccgoimporter/testdata/issue31540.gox b/src/go/internal/gccgoimporter/testdata/issue31540.gox new file mode 100644 index 0000000000..abdc696caf --- /dev/null +++ b/src/go/internal/gccgoimporter/testdata/issue31540.gox @@ -0,0 +1,16 @@ +v3; +package issue31540 +pkgpath issue31540 +types 11 7 23 23 20 22 20 21 57 31 45 36 +type 1 "A1" = +type 2 "A2" = +type 3 "S" +type 4 "X" = +type 5 "Y" +type 6 "Z" +type 7 struct { .go.mapalias.b ; ? ; } +type 8 map [] +type 9 struct { .go.mapalias.q ; } +type 10 map [] +func Hallo () +checksum C3FAF2524A90BC11225EE65D059BF27DFB69134B -- GitLab From 376ce8c88033eede19d6295f9a79263f73c0fddb Mon Sep 17 00:00:00 2001 From: David Chase Date: Mon, 15 Apr 2019 21:27:04 -0400 Subject: [PATCH 0882/1679] cmd/compile: shortcut intrinsic inlining AFTER getcallerXX check A check in inl.go to prevent inlining of functions calling either getcallerpc or getcallersp does not work when these functions are intrinsics. Swap checks to fix. Includes test. No bug, this was discovered in the course of a ridiculous experiment with inlining. Change-Id: Ie1392523bb89882d586678f2674e1a4eadc5e431 Reviewed-on: https://go-review.googlesource.com/c/go/+/172217 Run-TryBot: David Chase TryBot-Result: Gobot Gobot Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/inl.go | 9 +++++---- test/run.go | 2 +- test/runtime/README | 7 +++++++ test/runtime/inlinegcpc.go | 29 +++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 test/runtime/README create mode 100644 test/runtime/inlinegcpc.go diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go index 38be394bfb..35cbadafd7 100644 --- a/src/cmd/compile/internal/gc/inl.go +++ b/src/cmd/compile/internal/gc/inl.go @@ -289,10 +289,6 @@ func (v *hairyVisitor) visit(n *Node) bool { switch n.Op { // Call is okay if inlinable and we have the budget for the body. case OCALLFUNC: - if isIntrinsicCall(n) { - v.budget-- - break - } // Functions that call runtime.getcaller{pc,sp} can not be inlined // because getcaller{pc,sp} expect a pointer to the caller's first argument. // @@ -309,6 +305,11 @@ func (v *hairyVisitor) visit(n *Node) bool { } } + if isIntrinsicCall(n) { + v.budget-- + break + } + if fn := n.Left.Func; fn != nil && fn.Inl != nil { v.budget -= fn.Inl.Cost break diff --git a/test/run.go b/test/run.go index 460d4f2d8c..f66db630c5 100644 --- a/test/run.go +++ b/test/run.go @@ -49,7 +49,7 @@ var ( // dirs are the directories to look for *.go files in. // TODO(bradfitz): just use all directories? - dirs = []string{".", "ken", "chan", "interface", "syntax", "dwarf", "fixedbugs", "codegen"} + dirs = []string{".", "ken", "chan", "interface", "syntax", "dwarf", "fixedbugs", "codegen", "runtime"} // ratec controls the max number of tests running at a time. ratec chan bool diff --git a/test/runtime/README b/test/runtime/README new file mode 100644 index 0000000000..249031afc1 --- /dev/null +++ b/test/runtime/README @@ -0,0 +1,7 @@ +// Copyright 2019 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. + +The runtime directory contains tests that specifically need +to be compiled as-if in the runtime package. For error-check +tests, these require the additional flags -+ and -p=runtime. diff --git a/test/runtime/inlinegcpc.go b/test/runtime/inlinegcpc.go new file mode 100644 index 0000000000..0943205ffd --- /dev/null +++ b/test/runtime/inlinegcpc.go @@ -0,0 +1,29 @@ +// errorcheck -0 -+ -p=runtime -m -newescape=true + +// Copyright 2019 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 runtime + +// A function that calls runtime.getcallerpc or runtime.getcallersp() +// cannot be inlined, no matter how small it is. + +func getcallerpc() uintptr +func getcallersp() uintptr + +func pc() uintptr { + return getcallerpc() + 1 +} + +func cpc() uintptr { // ERROR "can inline cpc" + return pc() + 2 +} + +func sp() uintptr { + return getcallersp() + 3 +} + +func csp() uintptr { // ERROR "can inline csp" + return sp() + 4 +} -- GitLab From 9f9e17a82fd7afa622424f51e458bb383cb952ce Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Fri, 19 Apr 2019 12:20:56 -0700 Subject: [PATCH 0883/1679] cmd/compile: fix ICE from go/defer call to variadic function The special case logic for go/defer arguments in Escape.call was scattered around a bit and was somewhat inconsistently handled across different types of function calls and parameters. This CL pulls the logic out into a separate callStmt method that's used uniformly for all kinds of function calls and arguments. Fixes #31573. Change-Id: Icdcdf611754dc3fcf1af7cb52879fb4b73a7a31f Reviewed-on: https://go-review.googlesource.com/c/go/+/173019 Run-TryBot: Matthew Dempsky TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/cmd/compile/internal/gc/escape.go | 94 +++++++++++++-------------- test/fixedbugs/issue31573.go | 49 ++++++++++++++ 2 files changed, 96 insertions(+), 47 deletions(-) create mode 100644 test/fixedbugs/issue31573.go diff --git a/src/cmd/compile/internal/gc/escape.go b/src/cmd/compile/internal/gc/escape.go index 61be503bc3..88dc9ef8a8 100644 --- a/src/cmd/compile/internal/gc/escape.go +++ b/src/cmd/compile/internal/gc/escape.go @@ -746,14 +746,7 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { var recvK EscHole var paramKs []EscHole - if where != nil && !(where.Op == ODEFER && e.loopDepth == 1) { - if recv != nil { - recvK = e.heapHole() - } - for range args { - paramKs = append(paramKs, e.heapHole()) - } - } else if static && fn.Name.Defn != nil && fn.Name.Defn.Esc < EscFuncTagged { + if static && fn.Name.Defn != nil && fn.Name.Defn.Esc < EscFuncTagged { // Static call to function in same mutually recursive // group; incorporate into data flow graph. @@ -778,32 +771,25 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { // function. Setup flows to heap and/or ks according // to parameter tags. if r := fntype.Recv(); r != nil { - recvK = e.tagHole(ks, r, static, where) + recvK = e.tagHole(ks, r, static) } for _, param := range fntype.Params().FieldSlice() { - paramKs = append(paramKs, e.tagHole(ks, param, static, where)) + paramKs = append(paramKs, e.tagHole(ks, param, static)) } } else { // Handle escape analysis for builtins. - - // By default, we just discard everything. However, if - // we're in a top-level defer statement, we can't - // allow transient values. - k := e.discardHole() - if where != nil { - k = e.newLoc(where, false).asHole() - } + // By default, we just discard everything. for range args { - paramKs = append(paramKs, k) + paramKs = append(paramKs, e.discardHole()) } switch call.Op { case OAPPEND: // Appendee slice may flow directly to the - // result, if it has enough - // capacity. Alternatively, a new heap slice - // might be allocated, and all slice elements - // might flow to heap. + // result, if it has enough capacity. + // Alternatively, a new heap slice might be + // allocated, and all slice elements might + // flow to heap. paramKs[0] = e.teeHole(paramKs[0], ks[0]) if types.Haspointers(args[0].Type.Elem()) { paramKs[0] = e.teeHole(paramKs[0], e.heapHole().deref(call, "appendee slice")) @@ -829,6 +815,22 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { } } + if call.Op == OCALLFUNC { + // Evaluate callee function expression. + e.expr(e.augmentParamHole(e.discardHole(), where), call.Left) + } + + if recv != nil { + // TODO(mdempsky): Handle go:uintptrescapes here too? + e.expr(e.augmentParamHole(recvK, where), recv) + } + + // Apply augmentParamHole before ODDDARG so that it affects + // the implicit slice allocation for variadic calls, if any. + for i, paramK := range paramKs { + paramKs[i] = e.augmentParamHole(paramK, where) + } + // TODO(mdempsky): Remove after early ddd-ification. if fntype != nil && fntype.IsVariadic() && !call.IsDDD() { vi := fntype.NumParams() - 1 @@ -849,24 +851,6 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { } } - if call.Op == OCALLFUNC { - // Evaluate callee function expression. - k := e.discardHole() - if where != nil { - if where.Op == ODEFER && e.loopDepth == 1 { - k = e.newLoc(nil, false).asHole() - } else { - k = e.heapHole() - } - } - e.expr(k, call.Left) - } - - if recv != nil { - // TODO(mdempsky): Handle go:uintptrescapes here too? - e.expr(recvK, recv) - } - for i, arg := range args { // For arguments to go:uintptrescapes, peel // away an unsafe.Pointer->uintptr conversion, @@ -881,15 +865,35 @@ func (e *Escape) call(ks []EscHole, call, where *Node) { } } + // no augmentParamHole here; handled in loop before ODDDARG e.expr(paramKs[i], arg) } } +// augmentParamHole augments parameter holes as necessary for use in +// go/defer statements. +func (e *Escape) augmentParamHole(k EscHole, where *Node) EscHole { + if where == nil { + return k + } + + // Top level defers arguments don't escape to heap, but they + // do need to last until end of function. Tee with a + // non-transient location to avoid arguments from being + // transiently allocated. + if where.Op == ODEFER && e.loopDepth == 1 { + // TODO(mdempsky): Eliminate redundant EscLocation allocs. + return e.teeHole(k, e.newLoc(nil, false).asHole()) + } + + return e.heapHole() +} + // tagHole returns a hole for evaluating an argument passed to param. // ks should contain the holes representing where the function // callee's results flows; static indicates whether this is a static -// call; where is the OGO/ODEFER context of the call, if any. -func (e *Escape) tagHole(ks []EscHole, param *types.Field, static bool, where *Node) EscHole { +// call. +func (e *Escape) tagHole(ks []EscHole, param *types.Field, static bool) EscHole { // If this is a dynamic call, we can't rely on param.Note. if !static { return e.heapHole() @@ -902,10 +906,6 @@ func (e *Escape) tagHole(ks []EscHole, param *types.Field, static bool, where *N } var tagKs []EscHole - if where != nil { - tagKs = append(tagKs, e.newLoc(nil, false).asHole()) - } - if esc&EscContentEscapes != 0 { tagKs = append(tagKs, e.heapHole().shift(1)) } diff --git a/test/fixedbugs/issue31573.go b/test/fixedbugs/issue31573.go new file mode 100644 index 0000000000..fb4fdc81e7 --- /dev/null +++ b/test/fixedbugs/issue31573.go @@ -0,0 +1,49 @@ +// errorcheck -0 -m + +// Copyright 2019 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 p + +func f(...*int) {} // ERROR "can inline f$" + +func g() { + defer f() // ERROR "... argument does not escape$" + defer f(new(int)) // ERROR "... argument does not escape$" "new\(int\) does not escape$" + defer f(new(int), new(int)) // ERROR "... argument does not escape$" "new\(int\) does not escape$" + + defer f(nil...) + defer f([]*int{}...) // ERROR "\[\]\*int literal does not escape$" + defer f([]*int{new(int)}...) // ERROR "\[\]\*int literal does not escape$" "new\(int\) does not escape$" + defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal does not escape$" "new\(int\) does not escape$" + + go f() // ERROR "... argument escapes to heap$" + go f(new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + go f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + + go f(nil...) + go f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" + go f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + + for { + defer f() // ERROR "... argument escapes to heap$" + defer f(new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + defer f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + + defer f(nil...) + defer f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" + defer f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + defer f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + + go f() // ERROR "... argument escapes to heap$" + go f(new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + go f(new(int), new(int)) // ERROR "... argument escapes to heap$" "new\(int\) escapes to heap$" + + go f(nil...) + go f([]*int{}...) // ERROR "\[\]\*int literal escapes to heap$" + go f([]*int{new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + go f([]*int{new(int), new(int)}...) // ERROR "\[\]\*int literal escapes to heap$" "new\(int\) escapes to heap$" + } +} -- GitLab From a1c481d85139f77ab27210526f9dfa2f3b375ef9 Mon Sep 17 00:00:00 2001 From: "Bryan C. Mills" Date: Thu, 28 Mar 2019 13:18:37 -0400 Subject: [PATCH 0884/1679] cmd/go: only add a 'go' directive on 'go mod tidy' or when a conversion occurs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the go.mod file exists and is empty, we initialize it from any of various formats supported by legacy dependency-management tools. We also initialize the 'go' directive at that point: we know that the go.mod file is incomplete, because it does not reflect the information in the legacy configuration file, and since we know that the go.mod file is incomplete, we should complete it with as much information as we have — including the version of the language currently in use. However, if there is no legacy configuration file present, then we cannot infer that the go.mod file is incomplete: it may correctly specify a module without external dependencies. In that case, we should not initialize the 'go' directive either: the user will not be expecting unnecessary edits to the go.mod file, and we generally do not make unnecessary-but-helpful edits unless 'go mod tidy' is invoked explicitly. Fixes #30790 Fixes #31100 Change-Id: I05a7872bce54a917c10d910cd9a616cab52e2730 Reviewed-on: https://go-review.googlesource.com/c/go/+/169877 Run-TryBot: Bryan C. Mills TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/go/internal/modcmd/tidy.go | 1 + src/cmd/go/internal/modload/init.go | 12 ++++++++---- src/cmd/go/testdata/script/mod_init_empty.txt | 16 ++++++++++++++++ src/cmd/go/testdata/script/mod_std_vendor.txt | 2 +- 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 src/cmd/go/testdata/script/mod_init_empty.txt diff --git a/src/cmd/go/internal/modcmd/tidy.go b/src/cmd/go/internal/modcmd/tidy.go index 789e936608..8c68ec51d8 100644 --- a/src/cmd/go/internal/modcmd/tidy.go +++ b/src/cmd/go/internal/modcmd/tidy.go @@ -64,6 +64,7 @@ func runTidy(cmd *base.Command, args []string) { } } modload.SetBuildList(keep) + modload.AddGoStmt() modTidyGoSum() // updates memory copy; WriteGoMod on next line flushes it out modload.WriteGoMod() } diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 4bc4a2449c..fad204a2dd 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -408,10 +408,9 @@ func legacyModInit() { fmt.Fprintf(os.Stderr, "go: creating new go.mod: module %s\n", path) modFile = new(modfile.File) modFile.AddModuleStmt(path) + AddGoStmt() } - addGoStmt() - for _, name := range altConfigs { cfg := filepath.Join(modRoot, name) data, err := ioutil.ReadFile(cfg) @@ -420,6 +419,7 @@ func legacyModInit() { if convert == nil { return } + AddGoStmt() fmt.Fprintf(os.Stderr, "go: copying requirements from %s\n", base.ShortPath(cfg)) cfg = filepath.ToSlash(cfg) if err := modconv.ConvertLegacyConfig(modFile, cfg, data); err != nil { @@ -434,8 +434,12 @@ func legacyModInit() { } } -// addGoStmt adds a go statement referring to the current version. -func addGoStmt() { +// AddGoStmt adds a go directive to the go.mod file if it does not already include one. +// The 'go' version added, if any, is the latest version supported by this toolchain. +func AddGoStmt() { + if modFile.Go != nil && modFile.Go.Version != "" { + return + } tags := build.Default.ReleaseTags version := tags[len(tags)-1] if !strings.HasPrefix(version, "go") || !modfile.GoVersionRE.MatchString(version[2:]) { diff --git a/src/cmd/go/testdata/script/mod_init_empty.txt b/src/cmd/go/testdata/script/mod_init_empty.txt new file mode 100644 index 0000000000..b6357bb053 --- /dev/null +++ b/src/cmd/go/testdata/script/mod_init_empty.txt @@ -0,0 +1,16 @@ +env GO111MODULE=on + +env GOPATH=$devnull + +go list -m +stdout '^example.com$' + +go list +stdout '^example.com$' + +-- go.mod -- +module example.com +-- main.go -- +package main + +func main() {} diff --git a/src/cmd/go/testdata/script/mod_std_vendor.txt b/src/cmd/go/testdata/script/mod_std_vendor.txt index 5aa544cb77..5986cff594 100644 --- a/src/cmd/go/testdata/script/mod_std_vendor.txt +++ b/src/cmd/go/testdata/script/mod_std_vendor.txt @@ -20,7 +20,7 @@ stdout ^vendor/golang.org/x/crypto # dep of .TestImports # Modules outside the standard library should not use the packages vendored there... cd broken ! go build -mod=readonly -stderr 'updates to go.mod needed' +stderr 'disabled by -mod=readonly' ! go build -mod=vendor stderr 'cannot find package' stderr 'hpack' -- GitLab From 78f0de10eccf3606dbc4b854a4cd3a7e502edc07 Mon Sep 17 00:00:00 2001 From: Maya Rashish Date: Sat, 20 Apr 2019 11:57:11 +0000 Subject: [PATCH 0885/1679] runtime: move linux specific code into linux specific files Allows us to stop whitelisting this error on many OS/arch combinations XXX I'm not sure I am running vet correctly, and testing all platforms right. Change-Id: I29f548bd5f4a63bd13c4d0667d4209c75c886fd9 GitHub-Last-Rev: 52f6ff4a6b986e86f8b26c3d19da7707d39f1664 GitHub-Pull-Request: golang/go#31583 Reviewed-on: https://go-review.googlesource.com/c/go/+/173157 Run-TryBot: Benny Siegert TryBot-Result: Gobot Gobot Reviewed-by: Benny Siegert --- src/cmd/vet/all/whitelist/darwin_arm.txt | 5 ----- src/cmd/vet/all/whitelist/darwin_arm64.txt | 3 --- src/cmd/vet/all/whitelist/freebsd_arm.txt | 1 - src/cmd/vet/all/whitelist/nacl_arm.txt | 1 - src/cmd/vet/all/whitelist/netbsd_arm.txt | 1 - src/cmd/vet/all/whitelist/openbsd_arm.txt | 1 - src/cmd/vet/all/whitelist/plan9_arm.txt | 1 - src/runtime/asm_arm.s | 3 --- src/runtime/asm_arm64.s | 3 --- src/runtime/sys_linux_arm.s | 3 +++ src/runtime/sys_linux_arm64.s | 3 +++ 11 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 src/cmd/vet/all/whitelist/darwin_arm.txt delete mode 100644 src/cmd/vet/all/whitelist/darwin_arm64.txt diff --git a/src/cmd/vet/all/whitelist/darwin_arm.txt b/src/cmd/vet/all/whitelist/darwin_arm.txt deleted file mode 100644 index 1c25c6a939..0000000000 --- a/src/cmd/vet/all/whitelist/darwin_arm.txt +++ /dev/null @@ -1,5 +0,0 @@ -// darwin/arm-specific vet whitelist. See readme.txt for details. - -// Ok. - -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration diff --git a/src/cmd/vet/all/whitelist/darwin_arm64.txt b/src/cmd/vet/all/whitelist/darwin_arm64.txt deleted file mode 100644 index a1edb71383..0000000000 --- a/src/cmd/vet/all/whitelist/darwin_arm64.txt +++ /dev/null @@ -1,3 +0,0 @@ -// darwin/arm64-specific vet whitelist. See readme.txt for details. - -runtime/asm_arm64.s: [arm64] sigreturn: function sigreturn missing Go declaration diff --git a/src/cmd/vet/all/whitelist/freebsd_arm.txt b/src/cmd/vet/all/whitelist/freebsd_arm.txt index 11e5c42fd8..5cb6989a26 100644 --- a/src/cmd/vet/all/whitelist/freebsd_arm.txt +++ b/src/cmd/vet/all/whitelist/freebsd_arm.txt @@ -1,4 +1,3 @@ // freebsd/arm-specific vet whitelist. See readme.txt for details. -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration runtime/sys_freebsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration diff --git a/src/cmd/vet/all/whitelist/nacl_arm.txt b/src/cmd/vet/all/whitelist/nacl_arm.txt index dde0092570..fbdcb5d229 100644 --- a/src/cmd/vet/all/whitelist/nacl_arm.txt +++ b/src/cmd/vet/all/whitelist/nacl_arm.txt @@ -1,6 +1,5 @@ // nacl/arm-specific vet whitelist. See readme.txt for details. -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration runtime/sys_nacl_arm.s: [arm] nacl_clock_gettime: function nacl_clock_gettime missing Go declaration runtime/sys_nacl_arm.s: [arm] nacl_sysinfo: function nacl_sysinfo missing Go declaration runtime/sys_nacl_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration diff --git a/src/cmd/vet/all/whitelist/netbsd_arm.txt b/src/cmd/vet/all/whitelist/netbsd_arm.txt index c0a0aa2114..85adae2129 100644 --- a/src/cmd/vet/all/whitelist/netbsd_arm.txt +++ b/src/cmd/vet/all/whitelist/netbsd_arm.txt @@ -1,5 +1,4 @@ // netbsd/arm-specific vet whitelist. See readme.txt for details. -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration runtime/sys_netbsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration syscall/asm_netbsd_arm.s: [arm] Syscall9: unknown variable trap; offset 0 is num+0(FP) diff --git a/src/cmd/vet/all/whitelist/openbsd_arm.txt b/src/cmd/vet/all/whitelist/openbsd_arm.txt index 16bf26c734..14823e1bf8 100644 --- a/src/cmd/vet/all/whitelist/openbsd_arm.txt +++ b/src/cmd/vet/all/whitelist/openbsd_arm.txt @@ -1,4 +1,3 @@ // openbsd/arm-specific vet whitelist. See readme.txt for details. -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration runtime/sys_openbsd_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration diff --git a/src/cmd/vet/all/whitelist/plan9_arm.txt b/src/cmd/vet/all/whitelist/plan9_arm.txt index 5af3271760..af155e819f 100644 --- a/src/cmd/vet/all/whitelist/plan9_arm.txt +++ b/src/cmd/vet/all/whitelist/plan9_arm.txt @@ -1,4 +1,3 @@ // plan9/arm-specific vet whitelist. See readme.txt for details. -runtime/asm_arm.s: [arm] sigreturn: function sigreturn missing Go declaration runtime/sys_plan9_arm.s: [arm] read_tls_fallback: function read_tls_fallback missing Go declaration diff --git a/src/runtime/asm_arm.s b/src/runtime/asm_arm.s index 5c6dfedac8..efd0e2a1a2 100644 --- a/src/runtime/asm_arm.s +++ b/src/runtime/asm_arm.s @@ -891,9 +891,6 @@ TEXT runtime·usplitR0(SB),NOSPLIT,$0 SUB R1, R3, R1 RET -TEXT runtime·sigreturn(SB),NOSPLIT,$0-0 - RET - #ifndef GOOS_nacl // This is called from .init_array and follows the platform, not Go, ABI. TEXT runtime·addmoduledata(SB),NOSPLIT,$0-8 diff --git a/src/runtime/asm_arm64.s b/src/runtime/asm_arm64.s index 871dc95dea..6e3b1b14a6 100644 --- a/src/runtime/asm_arm64.s +++ b/src/runtime/asm_arm64.s @@ -1128,9 +1128,6 @@ TEXT runtime·goexit(SB),NOSPLIT|NOFRAME|TOPFRAME,$0-0 MOVD R0, R0 // NOP BL runtime·goexit1(SB) // does not return -TEXT runtime·sigreturn(SB),NOSPLIT,$0-0 - RET - // This is called from .init_array and follows the platform, not Go, ABI. TEXT runtime·addmoduledata(SB),NOSPLIT,$0-0 SUB $0x10, RSP diff --git a/src/runtime/sys_linux_arm.s b/src/runtime/sys_linux_arm.s index 43a58335c8..637123be45 100644 --- a/src/runtime/sys_linux_arm.s +++ b/src/runtime/sys_linux_arm.s @@ -606,3 +606,6 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-4 SWI $0 MOVW R0, ret+0(FP) RET + +TEXT runtime·sigreturn(SB),NOSPLIT,$0-0 + RET diff --git a/src/runtime/sys_linux_arm64.s b/src/runtime/sys_linux_arm64.s index 8b344be8f8..321d74254c 100644 --- a/src/runtime/sys_linux_arm64.s +++ b/src/runtime/sys_linux_arm64.s @@ -599,3 +599,6 @@ TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 SVC MOVD R0, ret+0(FP) RET + +TEXT runtime·sigreturn(SB),NOSPLIT,$0-0 + RET -- GitLab From d23cba683e59f6092c1e3f676c8e83e7973f27dd Mon Sep 17 00:00:00 2001 From: Maya Rashish Date: Sat, 20 Apr 2019 14:39:33 +0000 Subject: [PATCH 0886/1679] all: add start of netbsd/arm64 support This works well enough to run some code natively on arm64, but not well enough for more complicated code. I've been suggested to start a pull request anyway. Updates #30824 Change-Id: Ib4f63e0e8a9edfc862cf65b5f1b0fbf9a8a1628e GitHub-Last-Rev: b01b105e0446e349c8d9895d3ac6918fa0cdc48c GitHub-Pull-Request: golang/go#29398 Reviewed-on: https://go-review.googlesource.com/c/go/+/155739 Run-TryBot: Benny Siegert TryBot-Result: Gobot Gobot Reviewed-by: Benny Siegert --- src/cmd/api/goapi.go | 2 + src/cmd/dist/build.go | 1 + src/cmd/link/internal/arm64/asm.go | 2 +- src/cmd/link/internal/arm64/obj.go | 5 +- src/runtime/cgo/gcc_netbsd_arm64.c | 78 ++ src/runtime/defs1_netbsd_arm64.go | 195 +++ src/runtime/os_netbsd_arm64.go | 24 + src/runtime/rt0_netbsd_arm64.s | 103 ++ src/runtime/signal_arm64.go | 2 +- src/runtime/signal_netbsd_arm64.go | 73 ++ src/runtime/sys_netbsd_arm64.s | 391 ++++++ src/runtime/tls_arm64.h | 5 + src/syscall/asm_netbsd_arm64.s | 129 ++ src/syscall/syscall_netbsd_arm64.go | 31 + src/syscall/zerrors_netbsd_arm64.go | 1700 ++++++++++++++++++++++++++ src/syscall/zsyscall_netbsd_arm64.go | 1260 +++++++++++++++++++ src/syscall/zsysnum_netbsd_arm64.go | 273 +++++ src/syscall/ztypes_netbsd_arm64.go | 415 +++++++ 18 files changed, 4685 insertions(+), 4 deletions(-) create mode 100644 src/runtime/cgo/gcc_netbsd_arm64.c create mode 100644 src/runtime/defs1_netbsd_arm64.go create mode 100644 src/runtime/os_netbsd_arm64.go create mode 100644 src/runtime/rt0_netbsd_arm64.s create mode 100644 src/runtime/signal_netbsd_arm64.go create mode 100644 src/runtime/sys_netbsd_arm64.s create mode 100644 src/syscall/asm_netbsd_arm64.s create mode 100644 src/syscall/syscall_netbsd_arm64.go create mode 100644 src/syscall/zerrors_netbsd_arm64.go create mode 100644 src/syscall/zsyscall_netbsd_arm64.go create mode 100644 src/syscall/zsysnum_netbsd_arm64.go create mode 100644 src/syscall/ztypes_netbsd_arm64.go diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index b728baea1d..c74ee9bfa2 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -77,6 +77,8 @@ var contexts = []*build.Context{ {GOOS: "netbsd", GOARCH: "amd64"}, {GOOS: "netbsd", GOARCH: "arm", CgoEnabled: true}, {GOOS: "netbsd", GOARCH: "arm"}, + {GOOS: "netbsd", GOARCH: "arm64", CgoEnabled: true}, + {GOOS: "netbsd", GOARCH: "arm64"}, {GOOS: "openbsd", GOARCH: "386", CgoEnabled: true}, {GOOS: "openbsd", GOARCH: "386"}, {GOOS: "openbsd", GOARCH: "amd64", CgoEnabled: true}, diff --git a/src/cmd/dist/build.go b/src/cmd/dist/build.go index 2ace44a994..6b58a04946 100644 --- a/src/cmd/dist/build.go +++ b/src/cmd/dist/build.go @@ -1510,6 +1510,7 @@ var cgoEnabled = map[string]bool{ "netbsd/386": true, "netbsd/amd64": true, "netbsd/arm": true, + "netbsd/arm64": true, "openbsd/386": true, "openbsd/amd64": true, "openbsd/arm": true, diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index c832099726..778946cbfd 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -359,7 +359,7 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo return int64(o1)<<32 | int64(o0), true case objabi.R_ARM64_TLS_LE: r.Done = false - if ctxt.HeadType != objabi.Hlinux { + if ctxt.HeadType == objabi.Hdarwin { ld.Errorf(s, "TLS reloc on unsupported OS %v", ctxt.HeadType) } // The TCB is two pointers. This is not documented anywhere, but is diff --git a/src/cmd/link/internal/arm64/obj.go b/src/cmd/link/internal/arm64/obj.go index 2f8a141139..102d152ad6 100644 --- a/src/cmd/link/internal/arm64/obj.go +++ b/src/cmd/link/internal/arm64/obj.go @@ -61,7 +61,7 @@ func Init() (*sys.Arch, ld.Arch) { Freebsddynld: "XXX", Openbsddynld: "XXX", - Netbsddynld: "XXX", + Netbsddynld: "/libexec/ld.elf_so", Dragonflydynld: "XXX", Solarisdynld: "XXX", } @@ -84,7 +84,8 @@ func archinit(ctxt *ld.Link) { *ld.FlagRound = 4096 } - case objabi.Hlinux: /* arm64 elf */ + case objabi.Hlinux, /* arm64 elf */ + objabi.Hnetbsd: ld.Elfinit(ctxt) ld.HEADR = ld.ELFRESERVE if *ld.FlagTextAddr == -1 { diff --git a/src/runtime/cgo/gcc_netbsd_arm64.c b/src/runtime/cgo/gcc_netbsd_arm64.c new file mode 100644 index 0000000000..b29fab0f8c --- /dev/null +++ b/src/runtime/cgo/gcc_netbsd_arm64.c @@ -0,0 +1,78 @@ +// Copyright 2019 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. + +#include +#include +#include +#include +#include "libcgo.h" +#include "libcgo_unix.h" + +static void *threadentry(void*); + +static void (*setg_gcc)(void*); + +void +x_cgo_init(G *g, void (*setg)(void*)) +{ + pthread_attr_t attr; + size_t size; + + setg_gcc = setg; + pthread_attr_init(&attr); + pthread_attr_getstacksize(&attr, &size); + g->stacklo = (uintptr)&attr - size + 4096; + pthread_attr_destroy(&attr); +} + + +void +_cgo_sys_thread_start(ThreadStart *ts) +{ + pthread_attr_t attr; + sigset_t ign, oset; + pthread_t p; + size_t size; + int err; + + sigfillset(&ign); + pthread_sigmask(SIG_SETMASK, &ign, &oset); + + pthread_attr_init(&attr); + pthread_attr_getstacksize(&attr, &size); + // Leave stacklo=0 and set stackhi=size; mstart will do the rest. + ts->g->stackhi = size; + err = _cgo_try_pthread_create(&p, &attr, threadentry, ts); + + pthread_sigmask(SIG_SETMASK, &oset, nil); + + if (err != 0) { + fprintf(stderr, "runtime/cgo: pthread_create failed: %s\n", strerror(err)); + abort(); + } +} + +static void* +threadentry(void *v) +{ + ThreadStart ts; + stack_t ss; + + ts = *(ThreadStart*)v; + free(v); + + // On NetBSD, a new thread inherits the signal stack of the + // creating thread. That confuses minit, so we remove that + // signal stack here before calling the regular mstart. It's + // a bit baroque to remove a signal stack here only to add one + // in minit, but it's a simple change that keeps NetBSD + // working like other OS's. At this point all signals are + // blocked, so there is no race. + memset(&ss, 0, sizeof ss); + ss.ss_flags = SS_DISABLE; + sigaltstack(&ss, nil); + + crosscall1(ts.fn, setg_gcc, (void*)ts.g); + return nil; +} diff --git a/src/runtime/defs1_netbsd_arm64.go b/src/runtime/defs1_netbsd_arm64.go new file mode 100644 index 0000000000..d40b88286b --- /dev/null +++ b/src/runtime/defs1_netbsd_arm64.go @@ -0,0 +1,195 @@ +// created by cgo -cdefs and then converted to Go +// cgo -cdefs defs_netbsd.go defs_netbsd_arm.go + +package runtime + +const ( + _EINTR = 0x4 + _EFAULT = 0xe + + _PROT_NONE = 0x0 + _PROT_READ = 0x1 + _PROT_WRITE = 0x2 + _PROT_EXEC = 0x4 + + _MAP_ANON = 0x1000 + _MAP_PRIVATE = 0x2 + _MAP_FIXED = 0x10 + + _MADV_FREE = 0x6 + + _SA_SIGINFO = 0x40 + _SA_RESTART = 0x2 + _SA_ONSTACK = 0x1 + + _SIGHUP = 0x1 + _SIGINT = 0x2 + _SIGQUIT = 0x3 + _SIGILL = 0x4 + _SIGTRAP = 0x5 + _SIGABRT = 0x6 + _SIGEMT = 0x7 + _SIGFPE = 0x8 + _SIGKILL = 0x9 + _SIGBUS = 0xa + _SIGSEGV = 0xb + _SIGSYS = 0xc + _SIGPIPE = 0xd + _SIGALRM = 0xe + _SIGTERM = 0xf + _SIGURG = 0x10 + _SIGSTOP = 0x11 + _SIGTSTP = 0x12 + _SIGCONT = 0x13 + _SIGCHLD = 0x14 + _SIGTTIN = 0x15 + _SIGTTOU = 0x16 + _SIGIO = 0x17 + _SIGXCPU = 0x18 + _SIGXFSZ = 0x19 + _SIGVTALRM = 0x1a + _SIGPROF = 0x1b + _SIGWINCH = 0x1c + _SIGINFO = 0x1d + _SIGUSR1 = 0x1e + _SIGUSR2 = 0x1f + + _FPE_INTDIV = 0x1 + _FPE_INTOVF = 0x2 + _FPE_FLTDIV = 0x3 + _FPE_FLTOVF = 0x4 + _FPE_FLTUND = 0x5 + _FPE_FLTRES = 0x6 + _FPE_FLTINV = 0x7 + _FPE_FLTSUB = 0x8 + + _BUS_ADRALN = 0x1 + _BUS_ADRERR = 0x2 + _BUS_OBJERR = 0x3 + + _SEGV_MAPERR = 0x1 + _SEGV_ACCERR = 0x2 + + _ITIMER_REAL = 0x0 + _ITIMER_VIRTUAL = 0x1 + _ITIMER_PROF = 0x2 + + _EV_ADD = 0x1 + _EV_DELETE = 0x2 + _EV_CLEAR = 0x20 + _EV_RECEIPT = 0 + _EV_ERROR = 0x4000 + _EV_EOF = 0x8000 + _EVFILT_READ = 0x0 + _EVFILT_WRITE = 0x1 +) + +type sigset struct { + __bits [4]uint32 +} + +type siginfo struct { + _signo int32 + _code int32 + _errno int32 + _reason uintptr + _reasonx [16]byte +} + +type stackt struct { + ss_sp uintptr + ss_size uintptr + ss_flags int32 +} + +type timespec struct { + tv_sec int64 + tv_nsec int64 +} + +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 +} + +type timeval struct { + tv_sec int64 + tv_usec int32 + _ [4]byte // EABI +} + +func (tv *timeval) set_usec(x int32) { + tv.tv_usec = x +} + +type itimerval struct { + it_interval timeval + it_value timeval +} + +type mcontextt struct { + __gregs [35]uint64 + __fregs [4160]byte // _NFREG * 128 + 32 + 32 + _ [8]uint64 // future use +} + +type ucontextt struct { + uc_flags uint32 + uc_link *ucontextt + uc_sigmask sigset + uc_stack stackt + _ [4]byte // EABI + uc_mcontext mcontextt + __uc_pad [2]int32 +} + +type keventt struct { + ident uint64 + filter uint32 + flags uint32 + fflags uint32 + pad_cgo_0 [4]byte + data int64 + udata *byte +} + +// created by cgo -cdefs and then converted to Go +// cgo -cdefs defs_netbsd.go defs_netbsd_arm.go + +const ( + _REG_X0 = 0 + _REG_X1 = 1 + _REG_X2 = 2 + _REG_X3 = 3 + _REG_X4 = 4 + _REG_X5 = 5 + _REG_X6 = 6 + _REG_X7 = 7 + _REG_X8 = 8 + _REG_X9 = 9 + _REG_X10 = 10 + _REG_X11 = 11 + _REG_X12 = 12 + _REG_X13 = 13 + _REG_X14 = 14 + _REG_X15 = 15 + _REG_X16 = 16 + _REG_X17 = 17 + _REG_X18 = 18 + _REG_X19 = 19 + _REG_X20 = 20 + _REG_X21 = 21 + _REG_X22 = 22 + _REG_X23 = 23 + _REG_X24 = 24 + _REG_X25 = 25 + _REG_X26 = 26 + _REG_X27 = 27 + _REG_X28 = 28 + _REG_X29 = 29 + _REG_X30 = 30 + _REG_X31 = 31 + _REG_ELR = 32 + _REG_SPSR = 33 + _REG_TPIDR = 34 +) diff --git a/src/runtime/os_netbsd_arm64.go b/src/runtime/os_netbsd_arm64.go new file mode 100644 index 0000000000..fd81eb7557 --- /dev/null +++ b/src/runtime/os_netbsd_arm64.go @@ -0,0 +1,24 @@ +// Copyright 2019 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 runtime + +import "unsafe" + +func lwp_mcontext_init(mc *mcontextt, stk unsafe.Pointer, mp *m, gp *g, fn uintptr) { + // Machine dependent mcontext initialisation for LWP. + mc.__gregs[_REG_ELR] = uint64(funcPC(lwp_tramp)) + mc.__gregs[_REG_X31] = uint64(uintptr(stk)) + mc.__gregs[_REG_X0] = uint64(uintptr(unsafe.Pointer(mp))) + mc.__gregs[_REG_X1] = uint64(uintptr(unsafe.Pointer(mp.g0))) + mc.__gregs[_REG_X2] = uint64(fn) +} + +//go:nosplit +func cputicks() int64 { + // Currently cputicks() is used in blocking profiler and to seed runtime·fastrand(). + // runtime·nanotime() is a poor approximation of CPU ticks that is enough for the profiler. + // TODO: need more entropy to better seed fastrand. + return nanotime() +} diff --git a/src/runtime/rt0_netbsd_arm64.s b/src/runtime/rt0_netbsd_arm64.s new file mode 100644 index 0000000000..75ecbe5176 --- /dev/null +++ b/src/runtime/rt0_netbsd_arm64.s @@ -0,0 +1,103 @@ +// Copyright 2019 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. + +#include "textflag.h" + +TEXT _rt0_arm64_netbsd(SB),NOSPLIT|NOFRAME,$0 + MOVD 0(RSP), R0 // argc + ADD $8, RSP, R1 // argv + BL main(SB) + +// When building with -buildmode=c-shared, this symbol is called when the shared +// library is loaded. +TEXT _rt0_arm64_netbsd_lib(SB),NOSPLIT,$184 + // Preserve callee-save registers. + MOVD R19, 24(RSP) + MOVD R20, 32(RSP) + MOVD R21, 40(RSP) + MOVD R22, 48(RSP) + MOVD R23, 56(RSP) + MOVD R24, 64(RSP) + MOVD R25, 72(RSP) + MOVD R26, 80(RSP) + MOVD R27, 88(RSP) + FMOVD F8, 96(RSP) + FMOVD F9, 104(RSP) + FMOVD F10, 112(RSP) + FMOVD F11, 120(RSP) + FMOVD F12, 128(RSP) + FMOVD F13, 136(RSP) + FMOVD F14, 144(RSP) + FMOVD F15, 152(RSP) + MOVD g, 160(RSP) + + // Initialize g as null in case of using g later e.g. sigaction in cgo_sigaction.go + MOVD ZR, g + + MOVD R0, _rt0_arm64_netbsd_lib_argc<>(SB) + MOVD R1, _rt0_arm64_netbsd_lib_argv<>(SB) + + // Synchronous initialization. + MOVD $runtime·libpreinit(SB), R4 + BL (R4) + + // Create a new thread to do the runtime initialization and return. + MOVD _cgo_sys_thread_create(SB), R4 + CMP $0, R4 + BEQ nocgo + MOVD $_rt0_arm64_netbsd_lib_go(SB), R0 + MOVD $0, R1 + SUB $16, RSP // reserve 16 bytes for sp-8 where fp may be saved. + BL (R4) + ADD $16, RSP + B restore + +nocgo: + MOVD $0x800000, R0 // stacksize = 8192KB + MOVD $_rt0_arm64_netbsd_lib_go(SB), R1 + MOVD R0, 8(RSP) + MOVD R1, 16(RSP) + MOVD $runtime·newosproc0(SB),R4 + BL (R4) + +restore: + // Restore callee-save registers. + MOVD 24(RSP), R19 + MOVD 32(RSP), R20 + MOVD 40(RSP), R21 + MOVD 48(RSP), R22 + MOVD 56(RSP), R23 + MOVD 64(RSP), R24 + MOVD 72(RSP), R25 + MOVD 80(RSP), R26 + MOVD 88(RSP), R27 + FMOVD 96(RSP), F8 + FMOVD 104(RSP), F9 + FMOVD 112(RSP), F10 + FMOVD 120(RSP), F11 + FMOVD 128(RSP), F12 + FMOVD 136(RSP), F13 + FMOVD 144(RSP), F14 + FMOVD 152(RSP), F15 + MOVD 160(RSP), g + RET + +TEXT _rt0_arm64_netbsd_lib_go(SB),NOSPLIT,$0 + MOVD _rt0_arm64_netbsd_lib_argc<>(SB), R0 + MOVD _rt0_arm64_netbsd_lib_argv<>(SB), R1 + MOVD $runtime·rt0_go(SB),R4 + B (R4) + +DATA _rt0_arm64_netbsd_lib_argc<>(SB)/8, $0 +GLOBL _rt0_arm64_netbsd_lib_argc<>(SB),NOPTR, $8 +DATA _rt0_arm64_netbsd_lib_argv<>(SB)/8, $0 +GLOBL _rt0_arm64_netbsd_lib_argv<>(SB),NOPTR, $8 + + +TEXT main(SB),NOSPLIT|NOFRAME,$0 + MOVD $runtime·rt0_go(SB), R2 + BL (R2) +exit: + MOVD $0, R0 + SVC $1 // sys_exit diff --git a/src/runtime/signal_arm64.go b/src/runtime/signal_arm64.go index 2d4c9e8129..49605736cd 100644 --- a/src/runtime/signal_arm64.go +++ b/src/runtime/signal_arm64.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build linux darwin +// +build linux darwin netbsd package runtime diff --git a/src/runtime/signal_netbsd_arm64.go b/src/runtime/signal_netbsd_arm64.go new file mode 100644 index 0000000000..8dfdfeadd5 --- /dev/null +++ b/src/runtime/signal_netbsd_arm64.go @@ -0,0 +1,73 @@ +// Copyright 2019 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 runtime + +import "unsafe" + +type sigctxt struct { + info *siginfo + ctxt unsafe.Pointer +} + +//go:nosplit +//go:nowritebarrierrec +func (c *sigctxt) regs() *mcontextt { + return (*mcontextt)(unsafe.Pointer(&(*ucontextt)(c.ctxt).uc_mcontext)) +} + +func (c *sigctxt) r0() uint64 { return c.regs().__gregs[_REG_X0] } +func (c *sigctxt) r1() uint64 { return c.regs().__gregs[_REG_X1] } +func (c *sigctxt) r2() uint64 { return c.regs().__gregs[_REG_X2] } +func (c *sigctxt) r3() uint64 { return c.regs().__gregs[_REG_X3] } +func (c *sigctxt) r4() uint64 { return c.regs().__gregs[_REG_X4] } +func (c *sigctxt) r5() uint64 { return c.regs().__gregs[_REG_X5] } +func (c *sigctxt) r6() uint64 { return c.regs().__gregs[_REG_X6] } +func (c *sigctxt) r7() uint64 { return c.regs().__gregs[_REG_X7] } +func (c *sigctxt) r8() uint64 { return c.regs().__gregs[_REG_X8] } +func (c *sigctxt) r9() uint64 { return c.regs().__gregs[_REG_X9] } +func (c *sigctxt) r10() uint64 { return c.regs().__gregs[_REG_X10] } +func (c *sigctxt) r11() uint64 { return c.regs().__gregs[_REG_X11] } +func (c *sigctxt) r12() uint64 { return c.regs().__gregs[_REG_X12] } +func (c *sigctxt) r13() uint64 { return c.regs().__gregs[_REG_X13] } +func (c *sigctxt) r14() uint64 { return c.regs().__gregs[_REG_X14] } +func (c *sigctxt) r15() uint64 { return c.regs().__gregs[_REG_X15] } +func (c *sigctxt) r16() uint64 { return c.regs().__gregs[_REG_X16] } +func (c *sigctxt) r17() uint64 { return c.regs().__gregs[_REG_X17] } +func (c *sigctxt) r18() uint64 { return c.regs().__gregs[_REG_X18] } +func (c *sigctxt) r19() uint64 { return c.regs().__gregs[_REG_X19] } +func (c *sigctxt) r20() uint64 { return c.regs().__gregs[_REG_X20] } +func (c *sigctxt) r21() uint64 { return c.regs().__gregs[_REG_X21] } +func (c *sigctxt) r22() uint64 { return c.regs().__gregs[_REG_X22] } +func (c *sigctxt) r23() uint64 { return c.regs().__gregs[_REG_X23] } +func (c *sigctxt) r24() uint64 { return c.regs().__gregs[_REG_X24] } +func (c *sigctxt) r25() uint64 { return c.regs().__gregs[_REG_X25] } +func (c *sigctxt) r26() uint64 { return c.regs().__gregs[_REG_X26] } +func (c *sigctxt) r27() uint64 { return c.regs().__gregs[_REG_X27] } +func (c *sigctxt) r28() uint64 { return c.regs().__gregs[_REG_X28] } +func (c *sigctxt) r29() uint64 { return c.regs().__gregs[_REG_X29] } +func (c *sigctxt) lr() uint64 { return c.regs().__gregs[_REG_X30] } +func (c *sigctxt) sp() uint64 { return c.regs().__gregs[_REG_X31] } + +//go:nosplit +//go:nowritebarrierrec +func (c *sigctxt) pc() uint64 { return c.regs().__gregs[_REG_ELR] } + +func (c *sigctxt) fault() uintptr { return uintptr(c.info._reason) } +func (c *sigctxt) trap() uint64 { return 0 } +func (c *sigctxt) error() uint64 { return 0 } +func (c *sigctxt) oldmask() uint64 { return 0 } + +func (c *sigctxt) sigcode() uint64 { return uint64(c.info._code) } +func (c *sigctxt) sigaddr() uint64 { return uint64(c.info._reason) } + +func (c *sigctxt) set_pc(x uint64) { c.regs().__gregs[_REG_ELR] = x } +func (c *sigctxt) set_sp(x uint64) { c.regs().__gregs[_REG_X31] = x } +func (c *sigctxt) set_lr(x uint64) { c.regs().__gregs[_REG_X30] = x } +func (c *sigctxt) set_r28(x uint64) { c.regs().__gregs[_REG_X28] = x } + +func (c *sigctxt) set_sigcode(x uint64) { c.info._code = int32(x) } +func (c *sigctxt) set_sigaddr(x uint64) { + c.info._reason = uintptr(x) +} diff --git a/src/runtime/sys_netbsd_arm64.s b/src/runtime/sys_netbsd_arm64.s new file mode 100644 index 0000000000..ff8db73bbb --- /dev/null +++ b/src/runtime/sys_netbsd_arm64.s @@ -0,0 +1,391 @@ +// Copyright 2019 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. + +// +// System calls and other sys.stuff for arm64, NetBSD +// + +#include "go_asm.h" +#include "go_tls.h" +#include "textflag.h" + +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 3 +#define FD_CLOEXEC 1 +#define F_SETFD 2 + +#define SYS_exit 1 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_getpid 20 +#define SYS_kill 37 +#define SYS_munmap 73 +#define SYS_madvise 75 +#define SYS_fcntl 92 +#define SYS_mmap 197 +#define SYS___sysctl 202 +#define SYS___sigaltstack14 281 +#define SYS___sigprocmask14 293 +#define SYS_getcontext 307 +#define SYS_setcontext 308 +#define SYS__lwp_create 309 +#define SYS__lwp_exit 310 +#define SYS__lwp_self 311 +#define SYS__lwp_kill 318 +#define SYS__lwp_unpark 321 +#define SYS___sigaction_sigtramp 340 +#define SYS_kqueue 344 +#define SYS_sched_yield 350 +#define SYS___setitimer50 425 +#define SYS___clock_gettime50 427 +#define SYS___nanosleep50 430 +#define SYS___kevent50 435 +#define SYS_openat 468 +#define SYS____lwp_park60 478 + +// int32 lwp_create(void *context, uintptr flags, void *lwpid) +TEXT runtime·lwp_create(SB),NOSPLIT,$0 + MOVD ctxt+0(FP), R0 + MOVD flags+8(FP), R1 + MOVD lwpid+16(FP), R2 + SVC $SYS__lwp_create + BCC ok + NEG R0, R0 +ok: + MOVW R0, ret+24(FP) + RET + +TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 + CMP $0, R1 + BEQ nog + CMP $0, R2 + BEQ nog + + MOVD R0, g_m(R1) + MOVD R1, g +nog: + CALL (R2) + + MOVD $0, R0 // crash (not reached) + MOVD R0, (R8) + +TEXT runtime·osyield(SB),NOSPLIT,$0 + SVC $SYS_sched_yield + RET + +TEXT runtime·lwp_park(SB),NOSPLIT,$0 + MOVW clockid+0(FP), R0 // arg 1 - clockid + MOVW flags+4(FP), R1 // arg 2 - flags + MOVD ts+8(FP), R2 // arg 3 - ts + MOVW unpark+16(FP), R3 // arg 4 - unpark + MOVD hint+24(FP), R4 // arg 5 - hint + MOVD unparkhint+32(FP), R5 // arg 6 - unparkhint + SVC $SYS____lwp_park60 + MOVW R0, ret+40(FP) + RET + +TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 + MOVW lwp+0(FP), R0 // arg 1 - lwp + MOVD hint+8(FP), R1 // arg 2 - hint + SVC $SYS__lwp_unpark + MOVW R0, ret+16(FP) + RET + +TEXT runtime·lwp_self(SB),NOSPLIT,$0 + SVC $SYS__lwp_self + MOVW R0, ret+0(FP) + RET + +// Exit the entire program (like C exit) +TEXT runtime·exit(SB),NOSPLIT,$-8 + MOVD code+0(FP), R0 // arg 1 - exit status + SVC $SYS_exit + MOVD $0, R0 // If we're still running, + MOVD R0, (R0) // crash + +// XXX the use of R1 here does not make sense. +// Does it not matter? +// func exitThread(wait *uint32) +TEXT runtime·exitThread(SB),NOSPLIT,$0-8 + MOVW wait+0(FP), R0 + // We're done using the stack. + MOVW $0, R1 + STLRW R1, (R0) + SVC $SYS__lwp_exit + JMP 0(PC) + +TEXT runtime·open(SB),NOSPLIT|NOFRAME,$-8 + MOVD name+0(FP), R0 // arg 1 - pathname + MOVW mode+8(FP), R1 // arg 2 - flags + MOVW perm+12(FP), R2 // arg 3 - mode + SVC $SYS_open + BCC ok + MOVW $-1, R0 +ok: + MOVW R0, ret+16(FP) + RET + +TEXT runtime·closefd(SB),NOSPLIT,$-8 + MOVW fd+0(FP), R0 // arg 1 - fd + SVC $SYS_close + BCC ok + MOVW $-1, R0 +ok: + MOVW R0, ret+8(FP) + RET + +TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0 + MOVW fd+0(FP), R0 // arg 1 - fd + MOVD p+8(FP), R1 // arg 2 - buf + MOVW n+16(FP), R2 // arg 3 - count + SVC $SYS_read + BCC ok + MOVW $-1, R0 +ok: + MOVW R0, ret+24(FP) + RET + +TEXT runtime·write(SB),NOSPLIT,$-8 + MOVD fd+0(FP), R0 // arg 1 - fd + MOVD p+8(FP), R1 // arg 2 - buf + MOVW n+16(FP), R2 // arg 3 - nbyte + SVC $SYS_write + BCC ok + MOVW $-1, R0 +ok: + MOVW R1, ret+24(FP) + RET + +TEXT runtime·usleep(SB),NOSPLIT,$24-4 + MOVW usec+0(FP), R3 + MOVD R3, R5 + MOVW $1000000, R4 + UDIV R4, R3 + MOVD R3, 8(RSP) // sec + MUL R3, R4 + SUB R4, R5 + MOVW $1000, R4 + MUL R4, R5 + MOVD R5, 16(RSP) // nsec + + MOVD RSP, R0 // arg 1 - rqtp + MOVD $0, R1 // arg 2 - rmtp + SVC $SYS___nanosleep50 + RET + +TEXT runtime·raise(SB),NOSPLIT,$16 + SVC $SYS__lwp_self + // arg 1 - target (lwp_self) + MOVW sig+0(FP), R1 // arg 2 - signo + SVC $SYS__lwp_kill + RET + +TEXT runtime·raiseproc(SB),NOSPLIT,$16 + SVC $SYS_getpid + // arg 1 - pid (from getpid) + MOVD sig+0(FP), R1 // arg 2 - signo + SVC $SYS_kill + RET + +TEXT runtime·setitimer(SB),NOSPLIT,$-8 + MOVW mode+0(FP), R0 // arg 1 - which + MOVD new+8(FP), R1 // arg 2 - itv + MOVD old+16(FP), R2 // arg 3 - oitv + SVC $SYS___setitimer50 + RET + +// func walltime() (sec int64, nsec int32) +TEXT runtime·walltime(SB), NOSPLIT, $32 + MOVW $CLOCK_REALTIME, R0 // arg 1 - clock_id + MOVW 8(RSP), R1 // arg 2 - tp + SVC $SYS___clock_gettime50 + + MOVD 8(RSP), R0 // sec + MOVW 16(RSP), R1 // nsec + + // sec is in R0, nsec in R1 + MOVD R0, sec+0(FP) + MOVW R1, nsec+8(FP) + RET + +// int64 nanotime(void) so really +// void nanotime(int64 *nsec) +TEXT runtime·nanotime(SB), NOSPLIT, $32 + MOVD $CLOCK_MONOTONIC, R0 // arg 1 - clock_id + MOVD $8(RSP), R1 // arg 2 - tp + SVC $SYS___clock_gettime50 + MOVD 8(RSP), R0 // sec + MOVW 16(RSP), R2 // nsec + + // sec is in R0, nsec in R2 + // return nsec in R2 + MOVD $1000000000, R3 + MUL R3, R0 + ADD R2, R0 + + MOVD R0, ret+0(FP) + RET + +TEXT runtime·getcontext(SB),NOSPLIT,$-8 + MOVD ctxt+0(FP), R0 // arg 1 - context + SVC $SYS_getcontext + BCS fail + RET +fail: + MOVD $0, R0 + MOVD R0, (R0) // crash + +TEXT runtime·sigprocmask(SB),NOSPLIT,$0 + MOVW how+0(FP), R0 // arg 1 - how + MOVD new+8(FP), R1 // arg 2 - set + MOVD old+16(FP), R2 // arg 3 - oset + SVC $SYS___sigprocmask14 + BCS fail + RET +fail: + MOVD $0, R0 + MOVD R0, (R0) // crash + +TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-8 + MOVD g, R0 + SVC $SYS_setcontext + MOVD $0x4242, R0 // Something failed, return magic number + SVC $SYS_exit + +TEXT runtime·sigaction(SB),NOSPLIT,$-8 + MOVW sig+0(FP), R0 // arg 1 - signum + MOVD new+8(FP), R1 // arg 2 - nsa + MOVD old+16(FP), R2 // arg 3 - osa + // arg 4 - tramp + MOVD $runtime·sigreturn_tramp(SB), R3 + MOVW $2, R4 // arg 5 - vers + SVC $SYS___sigaction_sigtramp + BCS fail + RET +fail: + MOVD $0, R0 + MOVD R0, (R0) // crash + +// XXX ??? +TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 + MOVW sig+8(FP), R0 + MOVD info+16(FP), R1 + MOVD ctx+24(FP), R2 + MOVD fn+0(FP), R11 + BL (R11) + RET + +TEXT runtime·sigtramp(SB),NOSPLIT,$24 + // this might be called in external code context, + // where g is not set. + // first save R0, because runtime·load_g will clobber it + MOVD R0, 8(RSP) // signum + MOVB runtime·iscgo(SB), R0 + CMP $0, R0 + // XXX branch destination + BEQ 2(PC) + BL runtime·load_g(SB) + + MOVD R1, 16(RSP) + MOVD R2, 24(RSP) + BL runtime·sigtrampgo(SB) + RET + +TEXT runtime·mmap(SB),NOSPLIT,$0 + MOVD addr+0(FP), R0 // arg 1 - addr + MOVD n+8(FP), R1 // arg 2 - len + MOVW prot+16(FP), R2 // arg 3 - prot + MOVW flags+20(FP), R3 // arg 4 - flags + MOVW fd+24(FP), R4 // arg 5 - fd + MOVW $0, R5 // arg 6 - pad + MOVD off+28(FP), R6 // arg 7 - offset + SVC $SYS_mmap + BCS fail + MOVD R0, p+32(FP) + MOVD $0, err+40(FP) + RET +fail: + MOVD $0, p+32(FP) + MOVD R0, err+40(FP) + RET + +TEXT runtime·munmap(SB),NOSPLIT,$0 + MOVD addr+0(FP), R0 // arg 1 - addr + MOVD n+8(FP), R1 // arg 2 - len + SVC $SYS_munmap + BCS fail + RET +fail: + MOVD $0, R0 + MOVD R0, (R0) // crash + +TEXT runtime·madvise(SB),NOSPLIT,$0 + MOVD addr+0(FP), R0 // arg 1 - addr + MOVD n+8(FP), R1 // arg 2 - len + MOVW flags+16(FP), R2 // arg 3 - behav + SVC $SYS_madvise + BCC ok + MOVD $-1, R0 +ok: + MOVD R0, ret+24(FP) + RET + +TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 + MOVD new+0(FP), R0 // arg 1 - nss + MOVD old+8(FP), R1 // arg 2 - oss + SVC $SYS___sigaltstack14 + BCS fail + RET +fail: + MOVD $0, R0 + MOVD R0, (R0) // crash + +TEXT runtime·sysctl(SB),NOSPLIT,$0 + MOVD mib+0(FP), R0 // arg 1 - name + MOVW miblen+8(FP), R1 // arg 2 - namelen + MOVD out+16(FP), R2 // arg 3 - oldp + MOVD size+24(FP), R3 // arg 4 - oldlenp + MOVD dst+32(FP), R4 // arg 5 - newp + MOVD ndst+40(FP), R5 // arg 6 - newlen + SVC $SYS___sysctl + BCC ok + NEG R0, R0 +ok: + MOVW R0, ret+48(FP) + RET + +// int32 runtime·kqueue(void) +TEXT runtime·kqueue(SB),NOSPLIT,$0 + MOVD $0, R0 + SVC $SYS_kqueue + BCC ok + NEG R0, R0 +ok: + MOVW R0, ret+0(FP) + RET + +// int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) +TEXT runtime·kevent(SB),NOSPLIT,$0 + MOVW kq+0(FP), R0 // arg 1 - kq + MOVD ch+8(FP), R1 // arg 2 - changelist + MOVW nch+16(FP), R2 // arg 3 - nchanges + MOVD ev+24(FP), R3 // arg 4 - eventlist + MOVW nev+32(FP), R4 // arg 5 - nevents + MOVD ts+40(FP), R5 // arg 6 - timeout + SVC $SYS___kevent50 + BCC ok + NEG R0, R0 +ok: + MOVW R0, ret+48(FP) + RET + +// void runtime·closeonexec(int32 fd) +TEXT runtime·closeonexec(SB),NOSPLIT,$0 + MOVW fd+0(FP), R0 // arg 1 - fd + MOVW $F_SETFD, R1 + MOVW $FD_CLOEXEC, R2 + SVC $SYS_fcntl + RET diff --git a/src/runtime/tls_arm64.h b/src/runtime/tls_arm64.h index c29fa7f7a9..fcd111f448 100644 --- a/src/runtime/tls_arm64.h +++ b/src/runtime/tls_arm64.h @@ -20,6 +20,11 @@ #define MRS_TPIDR_R0 WORD $0xd53bd060 // MRS TPIDRRO_EL0, R0 #endif +#ifdef GOOS_netbsd +#define TPIDR TPIDRRO_EL0 +#define MRS_TPIDR_R0 WORD $0xd53bd040 // MRS TPIDRRO_EL0, R0 +#endif + // Define something that will break the build if // the GOOS is unknown. #ifndef TPIDR diff --git a/src/syscall/asm_netbsd_arm64.s b/src/syscall/asm_netbsd_arm64.s new file mode 100644 index 0000000000..fbcd3388c9 --- /dev/null +++ b/src/syscall/asm_netbsd_arm64.s @@ -0,0 +1,129 @@ +// Copyright 2019 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. + +#include "textflag.h" + +// +// System call support for ARM64, NetBSD +// + +#define SYS_syscall 0 + +// func Syscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr) +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BL runtime·entersyscall(SB) + MOVD trap+0(FP), R17 + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + SVC $SYS_syscall + BCC ok + MOVD $-1, R1 + MOVD R1, r1+32(FP) // r1 + MOVD ZR, r2+40(FP) // r2 + MOVD R0, err+48(FP) // err + BL runtime·exitsyscall(SB) + RET +ok: + MOVD R0, r1+32(FP) // r1 + MOVD R1, r2+40(FP) // r2 + MOVD ZR, err+48(FP) // err + BL runtime·exitsyscall(SB) + RET + +// func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr) +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + MOVD trap+0(FP), R17 // syscall entry + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + SVC $SYS_syscall + BCC ok + MOVD $-1, R1 + MOVD R1, r1+32(FP) // r1 + MOVD ZR, r2+40(FP) // r2 + MOVD R0, err+48(FP) // err + RET +ok: + MOVD R0, r1+32(FP) // r1 + MOVD R1, r2+40(FP) // r2 + MOVD ZR, err+48(FP) // err + RET + +// func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BL runtime·entersyscall(SB) + MOVD trap+0(FP), R17 // syscall entry + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD a4+32(FP), R3 + MOVD a5+40(FP), R4 + MOVD a6+48(FP), R5 + SVC $SYS_syscall + BCC ok + MOVD $-1, R1 + MOVD R1, r1+56(FP) // r1 + MOVD ZR, r2+64(FP) // r2 + MOVD R0, err+72(FP) // err + BL runtime·exitsyscall(SB) + RET +ok: + MOVD R0, r1+56(FP) // r1 + MOVD R1, r2+64(FP) // r2 + MOVD ZR, err+72(FP) // err + BL runtime·exitsyscall(SB) + RET + +// func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + MOVD trap+0(FP), R17 // syscall entry + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD a4+32(FP), R3 + MOVD a5+40(FP), R4 + MOVD a6+48(FP), R5 + SVC $SYS_syscall + BCC ok + MOVD $-1, R1 + MOVD R1, r1+56(FP) // r1 + MOVD ZR, r2+64(FP) // r2 + MOVD R0, err+72(FP) // err + RET +ok: + MOVD R0, r1+56(FP) // r1 + MOVD R1, r2+64(FP) // r2 + MOVD ZR, R0 + MOVD R0, err+72(FP) // err + RET + +// Actually Syscall7 +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + BL runtime·entersyscall(SB) + MOVD num+0(FP), R17 // syscall entry + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD a4+32(FP), R3 + MOVD a5+40(FP), R4 + MOVD a6+48(FP), R5 + MOVD a7+56(FP), R6 + //MOVD a8+64(FP), R7 + //MOVD a9+72(FP), R8 + SVC $SYS_syscall + BCC ok + MOVD $-1, R1 + MOVD R1, r1+80(FP) // r1 + MOVD ZR, r2+88(FP) // r2 + MOVD R0, err+96(FP) // err + BL runtime·exitsyscall(SB) + RET +ok: + MOVD R0, r1+80(FP) // r1 + MOVD R1, r2+88(FP) // r2 + MOVD ZR, err+96(FP) // err + BL runtime·exitsyscall(SB) + RET + diff --git a/src/syscall/syscall_netbsd_arm64.go b/src/syscall/syscall_netbsd_arm64.go new file mode 100644 index 0000000000..d15b762d19 --- /dev/null +++ b/src/syscall/syscall_netbsd_arm64.go @@ -0,0 +1,31 @@ +// Copyright 2019 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 syscall + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/src/syscall/zerrors_netbsd_arm64.go b/src/syscall/zerrors_netbsd_arm64.go new file mode 100644 index 0000000000..6f6453f6ee --- /dev/null +++ b/src/syscall/zerrors_netbsd_arm64.go @@ -0,0 +1,1700 @@ +// mkerrors.sh -m64 +// Code generated by the command above; DO NOT EDIT. + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +// +build arm64,netbsd + +package syscall + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = Errno(0x7) + EACCES = Errno(0xd) + EADDRINUSE = Errno(0x30) + EADDRNOTAVAIL = Errno(0x31) + EAFNOSUPPORT = Errno(0x2f) + EAGAIN = Errno(0x23) + EALREADY = Errno(0x25) + EAUTH = Errno(0x50) + EBADF = Errno(0x9) + EBADMSG = Errno(0x58) + EBADRPC = Errno(0x48) + EBUSY = Errno(0x10) + ECANCELED = Errno(0x57) + ECHILD = Errno(0xa) + ECONNABORTED = Errno(0x35) + ECONNREFUSED = Errno(0x3d) + ECONNRESET = Errno(0x36) + EDEADLK = Errno(0xb) + EDESTADDRREQ = Errno(0x27) + EDOM = Errno(0x21) + EDQUOT = Errno(0x45) + EEXIST = Errno(0x11) + EFAULT = Errno(0xe) + EFBIG = Errno(0x1b) + EFTYPE = Errno(0x4f) + EHOSTDOWN = Errno(0x40) + EHOSTUNREACH = Errno(0x41) + EIDRM = Errno(0x52) + EILSEQ = Errno(0x55) + EINPROGRESS = Errno(0x24) + EINTR = Errno(0x4) + EINVAL = Errno(0x16) + EIO = Errno(0x5) + EISCONN = Errno(0x38) + EISDIR = Errno(0x15) + ELAST = Errno(0x60) + ELOOP = Errno(0x3e) + EMFILE = Errno(0x18) + EMLINK = Errno(0x1f) + EMSGSIZE = Errno(0x28) + EMULTIHOP = Errno(0x5e) + ENAMETOOLONG = Errno(0x3f) + ENEEDAUTH = Errno(0x51) + ENETDOWN = Errno(0x32) + ENETRESET = Errno(0x34) + ENETUNREACH = Errno(0x33) + ENFILE = Errno(0x17) + ENOATTR = Errno(0x5d) + ENOBUFS = Errno(0x37) + ENODATA = Errno(0x59) + ENODEV = Errno(0x13) + ENOENT = Errno(0x2) + ENOEXEC = Errno(0x8) + ENOLCK = Errno(0x4d) + ENOLINK = Errno(0x5f) + ENOMEM = Errno(0xc) + ENOMSG = Errno(0x53) + ENOPROTOOPT = Errno(0x2a) + ENOSPC = Errno(0x1c) + ENOSR = Errno(0x5a) + ENOSTR = Errno(0x5b) + ENOSYS = Errno(0x4e) + ENOTBLK = Errno(0xf) + ENOTCONN = Errno(0x39) + ENOTDIR = Errno(0x14) + ENOTEMPTY = Errno(0x42) + ENOTSOCK = Errno(0x26) + ENOTSUP = Errno(0x56) + ENOTTY = Errno(0x19) + ENXIO = Errno(0x6) + EOPNOTSUPP = Errno(0x2d) + EOVERFLOW = Errno(0x54) + EPERM = Errno(0x1) + EPFNOSUPPORT = Errno(0x2e) + EPIPE = Errno(0x20) + EPROCLIM = Errno(0x43) + EPROCUNAVAIL = Errno(0x4c) + EPROGMISMATCH = Errno(0x4b) + EPROGUNAVAIL = Errno(0x4a) + EPROTO = Errno(0x60) + EPROTONOSUPPORT = Errno(0x2b) + EPROTOTYPE = Errno(0x29) + ERANGE = Errno(0x22) + EREMOTE = Errno(0x47) + EROFS = Errno(0x1e) + ERPCMISMATCH = Errno(0x49) + ESHUTDOWN = Errno(0x3a) + ESOCKTNOSUPPORT = Errno(0x2c) + ESPIPE = Errno(0x1d) + ESRCH = Errno(0x3) + ESTALE = Errno(0x46) + ETIME = Errno(0x5c) + ETIMEDOUT = Errno(0x3c) + ETOOMANYREFS = Errno(0x3b) + ETXTBSY = Errno(0x1a) + EUSERS = Errno(0x44) + EWOULDBLOCK = Errno(0x23) + EXDEV = Errno(0x12) +) + +// Signals +const ( + SIGABRT = Signal(0x6) + SIGALRM = Signal(0xe) + SIGBUS = Signal(0xa) + SIGCHLD = Signal(0x14) + SIGCONT = Signal(0x13) + SIGEMT = Signal(0x7) + SIGFPE = Signal(0x8) + SIGHUP = Signal(0x1) + SIGILL = Signal(0x4) + SIGINFO = Signal(0x1d) + SIGINT = Signal(0x2) + SIGIO = Signal(0x17) + SIGIOT = Signal(0x6) + SIGKILL = Signal(0x9) + SIGPIPE = Signal(0xd) + SIGPROF = Signal(0x1b) + SIGPWR = Signal(0x20) + SIGQUIT = Signal(0x3) + SIGSEGV = Signal(0xb) + SIGSTOP = Signal(0x11) + SIGSYS = Signal(0xc) + SIGTERM = Signal(0xf) + SIGTRAP = Signal(0x5) + SIGTSTP = Signal(0x12) + SIGTTIN = Signal(0x15) + SIGTTOU = Signal(0x16) + SIGURG = Signal(0x10) + SIGUSR1 = Signal(0x1e) + SIGUSR2 = Signal(0x1f) + SIGVTALRM = Signal(0x1a) + SIGWINCH = Signal(0x1c) + SIGXCPU = Signal(0x18) + SIGXFSZ = Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/src/syscall/zsyscall_netbsd_arm64.go b/src/syscall/zsyscall_netbsd_arm64.go new file mode 100644 index 0000000000..758f398228 --- /dev/null +++ b/src/syscall/zsyscall_netbsd_arm64.go @@ -0,0 +1,1260 @@ +// mksyscall.pl -netbsd -tags netbsd,arm64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm64.go +// Code generated by the command above; DO NOT EDIT. + +// +build netbsd,arm64 + +package syscall + +import "unsafe" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func paccept(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, sigmask *sigset, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_PACCEPT, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(unsafe.Pointer(sigmask)), uintptr(flags), 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS___GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/src/syscall/zsysnum_netbsd_arm64.go b/src/syscall/zsysnum_netbsd_arm64.go new file mode 100644 index 0000000000..31e13bf3b6 --- /dev/null +++ b/src/syscall/zsysnum_netbsd_arm64.go @@ -0,0 +1,273 @@ +// mksysnum_netbsd.pl +// Code generated by the command above; DO NOT EDIT. + +// +build arm64,netbsd + +package syscall + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/src/syscall/ztypes_netbsd_arm64.go b/src/syscall/ztypes_netbsd_arm64.go new file mode 100644 index 0000000000..6d7f9edf34 --- /dev/null +++ b/src/syscall/ztypes_netbsd_arm64.go @@ -0,0 +1,415 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build arm64,netbsd + +package syscall + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + pathMax = 0x400 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +const ( + _AT_FDCWD = -0x64 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type sigset struct { + X__bits [4]uint32 +} -- GitLab From 68d4b1265ec7915dccfccf6c0e32f9ab2d9c3a86 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Sat, 20 Apr 2019 11:09:34 -0700 Subject: [PATCH 0887/1679] cmd/compile: reduce bits.Div64(0, lo, y) to 64 bit division With this change, these two functions generate identical code: func f(x uint64) (uint64, uint64) { return bits.Div64(0, x, 5) } func g(x uint64) (uint64, uint64) { return x / 5, x % 5 } Updates #31582 Change-Id: Ia96c2e67f8af5dd985823afee5f155608c04a4b6 Reviewed-on: https://go-review.googlesource.com/c/go/+/173197 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- .../compile/internal/ssa/gen/generic.rules | 2 + .../compile/internal/ssa/rewritegeneric.go | 54 +++++++++++++++++++ test/codegen/mathbits.go | 5 ++ 3 files changed, 61 insertions(+) diff --git a/src/cmd/compile/internal/ssa/gen/generic.rules b/src/cmd/compile/internal/ssa/gen/generic.rules index aac7438e0a..510cec0f4b 100644 --- a/src/cmd/compile/internal/ssa/gen/generic.rules +++ b/src/cmd/compile/internal/ssa/gen/generic.rules @@ -146,6 +146,8 @@ (Div64u (Const64 [c]) (Const64 [d])) && d != 0 -> (Const64 [int64(uint64(c)/uint64(d))]) (Div32F (Const32F [c]) (Const32F [d])) -> (Const32F [auxFrom32F(auxTo32F(c) / auxTo32F(d))]) (Div64F (Const64F [c]) (Const64F [d])) -> (Const64F [auxFrom64F(auxTo64F(c) / auxTo64F(d))]) +(Select0 (Div128u (Const64 [0]) lo y)) -> (Div64u lo y) +(Select1 (Div128u (Const64 [0]) lo y)) -> (Mod64u lo y) (Not (ConstBool [c])) -> (ConstBool [1-c]) diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index 7bb446cf35..fe2fbb82c0 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -389,6 +389,10 @@ func rewriteValuegeneric(v *Value) bool { return rewriteValuegeneric_OpRsh8x64_0(v) case OpRsh8x8: return rewriteValuegeneric_OpRsh8x8_0(v) + case OpSelect0: + return rewriteValuegeneric_OpSelect0_0(v) + case OpSelect1: + return rewriteValuegeneric_OpSelect1_0(v) case OpSignExt16to32: return rewriteValuegeneric_OpSignExt16to32_0(v) case OpSignExt16to64: @@ -26587,6 +26591,56 @@ func rewriteValuegeneric_OpRsh8x8_0(v *Value) bool { } return false } +func rewriteValuegeneric_OpSelect0_0(v *Value) bool { + // match: (Select0 (Div128u (Const64 [0]) lo y)) + // cond: + // result: (Div64u lo y) + for { + v_0 := v.Args[0] + if v_0.Op != OpDiv128u { + break + } + y := v_0.Args[2] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst64 { + break + } + if v_0_0.AuxInt != 0 { + break + } + lo := v_0.Args[1] + v.reset(OpDiv64u) + v.AddArg(lo) + v.AddArg(y) + return true + } + return false +} +func rewriteValuegeneric_OpSelect1_0(v *Value) bool { + // match: (Select1 (Div128u (Const64 [0]) lo y)) + // cond: + // result: (Mod64u lo y) + for { + v_0 := v.Args[0] + if v_0.Op != OpDiv128u { + break + } + y := v_0.Args[2] + v_0_0 := v_0.Args[0] + if v_0_0.Op != OpConst64 { + break + } + if v_0_0.AuxInt != 0 { + break + } + lo := v_0.Args[1] + v.reset(OpMod64u) + v.AddArg(lo) + v.AddArg(y) + return true + } + return false +} func rewriteValuegeneric_OpSignExt16to32_0(v *Value) bool { // match: (SignExt16to32 (Const16 [c])) // cond: diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index b6992c6bb4..6676c69188 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -538,3 +538,8 @@ func Div64(hi, lo, x uint64) (q, r uint64) { // amd64:"DIVQ" return bits.Div64(hi, lo, x) } + +func Div64degenerate(x uint64) (q, r uint64) { + // amd64:-"DIVQ" + return bits.Div64(0, x, 5) +} -- GitLab From db42bb3b70fe82e9d33011fb36b4171897663ccf Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 19 Apr 2019 17:39:11 -0400 Subject: [PATCH 0888/1679] runtime: error formatting fix g.m is an muintptr, but we want to print it in hex like a pointer. Change-Id: Ifc48ed77fb2e93cff7a49d98adc7b9679d26c3b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/172988 Run-TryBot: Austin Clements Reviewed-by: Brad Fitzpatrick --- src/runtime/proc.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 16794e1ab0..30ddeadff5 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -4124,7 +4124,7 @@ func releasep() *p { } _p_ := _g_.m.p.ptr() if _p_.m.ptr() != _g_.m || _p_.mcache != _g_.m.mcache || _p_.status != _Prunning { - print("releasep: m=", _g_.m, " m->p=", _g_.m.p.ptr(), " p->m=", _p_.m, " m->mcache=", _g_.m.mcache, " p->mcache=", _p_.mcache, " p->status=", _p_.status, "\n") + print("releasep: m=", _g_.m, " m->p=", _g_.m.p.ptr(), " p->m=", hex(_p_.m), " m->mcache=", _g_.m.mcache, " p->mcache=", _p_.mcache, " p->status=", _p_.status, "\n") throw("releasep: invalid p state") } if trace.enabled { -- GitLab From f8f265b9cfd57970b2bc8b3dd8531cedaf57ccc1 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Wed, 20 Mar 2019 12:46:20 +0000 Subject: [PATCH 0889/1679] cmd/compile: intrinsify math/bits.Sub64 for arm64 This CL instrinsifies Sub64 with arm64 instruction sequence NEGS, SBCS, NGC and NEG, and optimzes the case of borrowing chains. Benchmarks: name old time/op new time/op delta Sub-64 2.500000ns +- 0% 2.048000ns +- 1% -18.08% (p=0.000 n=10+10) Sub32-64 2.500000ns +- 0% 2.500000ns +- 0% ~ (all equal) Sub64-64 2.500000ns +- 0% 2.080000ns +- 0% -16.80% (p=0.000 n=10+7) Sub64multiple-64 7.090000ns +- 0% 2.090000ns +- 0% -70.52% (p=0.000 n=10+10) Change-Id: I3d2664e009a9635e13b55d2c4567c7b34c2c0655 Reviewed-on: https://go-review.googlesource.com/c/go/+/159018 Reviewed-by: Cherry Zhang Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/arm64/ssa.go | 17 ++- src/cmd/compile/internal/gc/ssa.go | 4 +- src/cmd/compile/internal/ssa/gen/ARM64.rules | 8 +- src/cmd/compile/internal/ssa/gen/ARM64Ops.go | 34 ++--- src/cmd/compile/internal/ssa/opGen.go | 58 +++++++++ src/cmd/compile/internal/ssa/rewriteARM64.go | 128 +++++++++++++++++++ test/codegen/mathbits.go | 10 ++ 7 files changed, 240 insertions(+), 19 deletions(-) diff --git a/src/cmd/compile/internal/arm64/ssa.go b/src/cmd/compile/internal/arm64/ssa.go index be4ddb4b6b..d3fc89d400 100644 --- a/src/cmd/compile/internal/arm64/ssa.go +++ b/src/cmd/compile/internal/arm64/ssa.go @@ -260,7 +260,10 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.Reg = arm64.REGZERO p.To.Type = obj.TYPE_REG p.To.Reg = v.Reg() - case ssa.OpARM64ADCSflags, ssa.OpARM64ADDSflags: + case ssa.OpARM64ADCSflags, + ssa.OpARM64ADDSflags, + ssa.OpARM64SBCSflags, + ssa.OpARM64SUBSflags: r := v.Reg0() r1 := v.Args[0].Reg() r2 := v.Args[1].Reg() @@ -270,6 +273,18 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { p.Reg = r1 p.To.Type = obj.TYPE_REG p.To.Reg = r + case ssa.OpARM64NEGSflags: + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_REG + p.From.Reg = v.Args[0].Reg() + p.To.Type = obj.TYPE_REG + p.To.Reg = v.Reg0() + case ssa.OpARM64NGCzerocarry: + p := s.Prog(v.Op.Asm()) + p.From.Type = obj.TYPE_REG + p.From.Reg = arm64.REGZERO + p.To.Type = obj.TYPE_REG + p.To.Reg = v.Reg() case ssa.OpARM64EXTRconst, ssa.OpARM64EXTRWconst: p := s.Prog(v.Op.Asm()) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 8159dc7bca..930779045a 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -3579,8 +3579,8 @@ func init() { func(s *state, n *Node, args []*ssa.Value) *ssa.Value { return s.newValue3(ssa.OpSub64borrow, types.NewTuple(types.Types[TUINT64], types.Types[TUINT64]), args[0], args[1], args[2]) }, - sys.AMD64) - alias("math/bits", "Sub", "math/bits", "Sub64", sys.ArchAMD64) + sys.AMD64, sys.ARM64) + alias("math/bits", "Sub", "math/bits", "Sub64", sys.ArchAMD64, sys.ArchARM64) addF("math/bits", "Div64", func(s *state, n *Node, args []*ssa.Value) *ssa.Value { // check for divide-by-zero/overflow and panic with appropriate message diff --git a/src/cmd/compile/internal/ssa/gen/ARM64.rules b/src/cmd/compile/internal/ssa/gen/ARM64.rules index 70b1681c63..de7ab3861d 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64.rules +++ b/src/cmd/compile/internal/ssa/gen/ARM64.rules @@ -148,6 +148,10 @@ (Select0 (Add64carry x y c)) -> (Select0 (ADCSflags x y (Select1 (ADDSconstflags [-1] c)))) (Select1 (Add64carry x y c)) -> (ADCzerocarry (Select1 (ADCSflags x y (Select1 (ADDSconstflags [-1] c))))) +// 64-bit subtraction with borrowing. +(Select0 (Sub64borrow x y bo)) -> (Select0 (SBCSflags x y (Select1 (NEGSflags bo)))) +(Select1 (Sub64borrow x y bo)) -> (NEG (NGCzerocarry (Select1 (SBCSflags x y (Select1 (NEGSflags bo)))))) + // boolean ops -- booleans are represented with 0=false, 1=true (AndB x y) -> (AND x y) (OrB x y) -> (OR x y) @@ -1206,9 +1210,11 @@ (ADD a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MSUBW a x y) (SUB a l:(MNEGW x y)) && a.Type.Size() != 8 && l.Uses==1 && clobber(l) -> (MADDW a x y) -// optimize ADCSflags and friends +// optimize ADCSflags, SBCSflags and friends (ADCSflags x y (Select1 (ADDSconstflags [-1] (ADCzerocarry c)))) -> (ADCSflags x y c) (ADCSflags x y (Select1 (ADDSconstflags [-1] (MOVDconst [0])))) -> (ADDSflags x y) +(SBCSflags x y (Select1 (NEGSflags (NEG (NGCzerocarry bo))))) -> (SBCSflags x y bo) +(SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) -> (SUBSflags x y) // mul by constant (MUL x (MOVDconst [-1])) -> (NEG x) diff --git a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go index a885a8f467..ece53eb750 100644 --- a/src/cmd/compile/internal/ssa/gen/ARM64Ops.go +++ b/src/cmd/compile/internal/ssa/gen/ARM64Ops.go @@ -183,6 +183,8 @@ func init() { {name: "ADDSflags", argLength: 2, reg: gp21flags, typ: "(UInt64,Flags)", asm: "ADDS", commutative: true}, // arg0+arg1, set flags. {name: "SUB", argLength: 2, reg: gp21, asm: "SUB"}, // arg0 - arg1 {name: "SUBconst", argLength: 1, reg: gp11, asm: "SUB", aux: "Int64"}, // arg0 - auxInt + {name: "SBCSflags", argLength: 3, reg: gp2flags1flags, typ: "(UInt64,Flags)", asm: "SBCS"}, // arg0-(arg1+borrowing), set flags. + {name: "SUBSflags", argLength: 2, reg: gp21flags, typ: "(UInt64,Flags)", asm: "SUBS"}, // arg0 - arg1, set flags. {name: "MUL", argLength: 2, reg: gp21, asm: "MUL", commutative: true}, // arg0 * arg1 {name: "MULW", argLength: 2, reg: gp21, asm: "MULW", commutative: true}, // arg0 * arg1, 32-bit {name: "MNEG", argLength: 2, reg: gp21, asm: "MNEG", commutative: true}, // -arg0 * arg1 @@ -224,21 +226,23 @@ func init() { {name: "LoweredMuluhilo", argLength: 2, reg: gp22, resultNotInArgs: true}, // arg0 * arg1, returns (hi, lo) // unary ops - {name: "MVN", argLength: 1, reg: gp11, asm: "MVN"}, // ^arg0 - {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"}, // -arg0 - {name: "FABSD", argLength: 1, reg: fp11, asm: "FABSD"}, // abs(arg0), float64 - {name: "FNEGS", argLength: 1, reg: fp11, asm: "FNEGS"}, // -arg0, float32 - {name: "FNEGD", argLength: 1, reg: fp11, asm: "FNEGD"}, // -arg0, float64 - {name: "FSQRTD", argLength: 1, reg: fp11, asm: "FSQRTD"}, // sqrt(arg0), float64 - {name: "REV", argLength: 1, reg: gp11, asm: "REV"}, // byte reverse, 64-bit - {name: "REVW", argLength: 1, reg: gp11, asm: "REVW"}, // byte reverse, 32-bit - {name: "REV16W", argLength: 1, reg: gp11, asm: "REV16W"}, // byte reverse in each 16-bit halfword, 32-bit - {name: "RBIT", argLength: 1, reg: gp11, asm: "RBIT"}, // bit reverse, 64-bit - {name: "RBITW", argLength: 1, reg: gp11, asm: "RBITW"}, // bit reverse, 32-bit - {name: "CLZ", argLength: 1, reg: gp11, asm: "CLZ"}, // count leading zero, 64-bit - {name: "CLZW", argLength: 1, reg: gp11, asm: "CLZW"}, // count leading zero, 32-bit - {name: "VCNT", argLength: 1, reg: fp11, asm: "VCNT"}, // count set bits for each 8-bit unit and store the result in each 8-bit unit - {name: "VUADDLV", argLength: 1, reg: fp11, asm: "VUADDLV"}, // unsigned sum of eight bytes in a 64-bit value, zero extended to 64-bit. + {name: "MVN", argLength: 1, reg: gp11, asm: "MVN"}, // ^arg0 + {name: "NEG", argLength: 1, reg: gp11, asm: "NEG"}, // -arg0 + {name: "NEGSflags", argLength: 1, reg: gp11flags, typ: "(UInt64,Flags)", asm: "NEGS"}, // -arg0, set flags. + {name: "NGCzerocarry", argLength: 1, reg: gp0flags1, typ: "UInt64", asm: "NGC"}, // -1 if borrowing, 0 otherwise. + {name: "FABSD", argLength: 1, reg: fp11, asm: "FABSD"}, // abs(arg0), float64 + {name: "FNEGS", argLength: 1, reg: fp11, asm: "FNEGS"}, // -arg0, float32 + {name: "FNEGD", argLength: 1, reg: fp11, asm: "FNEGD"}, // -arg0, float64 + {name: "FSQRTD", argLength: 1, reg: fp11, asm: "FSQRTD"}, // sqrt(arg0), float64 + {name: "REV", argLength: 1, reg: gp11, asm: "REV"}, // byte reverse, 64-bit + {name: "REVW", argLength: 1, reg: gp11, asm: "REVW"}, // byte reverse, 32-bit + {name: "REV16W", argLength: 1, reg: gp11, asm: "REV16W"}, // byte reverse in each 16-bit halfword, 32-bit + {name: "RBIT", argLength: 1, reg: gp11, asm: "RBIT"}, // bit reverse, 64-bit + {name: "RBITW", argLength: 1, reg: gp11, asm: "RBITW"}, // bit reverse, 32-bit + {name: "CLZ", argLength: 1, reg: gp11, asm: "CLZ"}, // count leading zero, 64-bit + {name: "CLZW", argLength: 1, reg: gp11, asm: "CLZW"}, // count leading zero, 32-bit + {name: "VCNT", argLength: 1, reg: fp11, asm: "VCNT"}, // count set bits for each 8-bit unit and store the result in each 8-bit unit + {name: "VUADDLV", argLength: 1, reg: fp11, asm: "VUADDLV"}, // unsigned sum of eight bytes in a 64-bit value, zero extended to 64-bit. {name: "LoweredRound32F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, {name: "LoweredRound64F", argLength: 1, reg: fp11, resultInArg0: true, zeroWidth: true}, diff --git a/src/cmd/compile/internal/ssa/opGen.go b/src/cmd/compile/internal/ssa/opGen.go index 06dcb2d7ac..1af77c88de 100644 --- a/src/cmd/compile/internal/ssa/opGen.go +++ b/src/cmd/compile/internal/ssa/opGen.go @@ -1149,6 +1149,8 @@ const ( OpARM64ADDSflags OpARM64SUB OpARM64SUBconst + OpARM64SBCSflags + OpARM64SUBSflags OpARM64MUL OpARM64MULW OpARM64MNEG @@ -1187,6 +1189,8 @@ const ( OpARM64LoweredMuluhilo OpARM64MVN OpARM64NEG + OpARM64NEGSflags + OpARM64NGCzerocarry OpARM64FABSD OpARM64FNEGS OpARM64FNEGD @@ -15260,6 +15264,36 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "SBCSflags", + argLen: 3, + asm: arm64.ASBCS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + {1, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "SUBSflags", + argLen: 2, + asm: arm64.ASUBS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + {1, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, { name: "MUL", argLen: 2, @@ -15808,6 +15842,30 @@ var opcodeTable = [...]opInfo{ }, }, }, + { + name: "NEGSflags", + argLen: 1, + asm: arm64.ANEGS, + reg: regInfo{ + inputs: []inputInfo{ + {0, 805044223}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 g R30 + }, + outputs: []outputInfo{ + {1, 0}, + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, + { + name: "NGCzerocarry", + argLen: 1, + asm: arm64.ANGC, + reg: regInfo{ + outputs: []outputInfo{ + {0, 670826495}, // R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15 R16 R17 R19 R20 R21 R22 R23 R24 R25 R26 R30 + }, + }, + }, { name: "FABSD", argLen: 1, diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index 0f55a6f7d8..bc7f17dfb3 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -319,6 +319,8 @@ func rewriteValueARM64(v *Value) bool { return rewriteValueARM64_OpARM64RORWconst_0(v) case OpARM64RORconst: return rewriteValueARM64_OpARM64RORconst_0(v) + case OpARM64SBCSflags: + return rewriteValueARM64_OpARM64SBCSflags_0(v) case OpARM64SLL: return rewriteValueARM64_OpARM64SLL_0(v) case OpARM64SLLconst: @@ -28509,6 +28511,80 @@ func rewriteValueARM64_OpARM64RORconst_0(v *Value) bool { } return false } +func rewriteValueARM64_OpARM64SBCSflags_0(v *Value) bool { + b := v.Block + typ := &b.Func.Config.Types + // match: (SBCSflags x y (Select1 (NEGSflags (NEG (NGCzerocarry bo))))) + // cond: + // result: (SBCSflags x y bo) + for { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 { + break + } + if v_2.Type != types.TypeFlags { + break + } + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64NEGSflags { + break + } + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64NEG { + break + } + if v_2_0_0.Type != typ.UInt64 { + break + } + v_2_0_0_0 := v_2_0_0.Args[0] + if v_2_0_0_0.Op != OpARM64NGCzerocarry { + break + } + if v_2_0_0_0.Type != typ.UInt64 { + break + } + bo := v_2_0_0_0.Args[0] + v.reset(OpARM64SBCSflags) + v.AddArg(x) + v.AddArg(y) + v.AddArg(bo) + return true + } + // match: (SBCSflags x y (Select1 (NEGSflags (MOVDconst [0])))) + // cond: + // result: (SUBSflags x y) + for { + _ = v.Args[2] + x := v.Args[0] + y := v.Args[1] + v_2 := v.Args[2] + if v_2.Op != OpSelect1 { + break + } + if v_2.Type != types.TypeFlags { + break + } + v_2_0 := v_2.Args[0] + if v_2_0.Op != OpARM64NEGSflags { + break + } + v_2_0_0 := v_2_0.Args[0] + if v_2_0_0.Op != OpARM64MOVDconst { + break + } + if v_2_0_0.AuxInt != 0 { + break + } + v.reset(OpARM64SUBSflags) + v.AddArg(x) + v.AddArg(y) + return true + } + return false +} func rewriteValueARM64_OpARM64SLL_0(v *Value) bool { // match: (SLL x (MOVDconst [c])) // cond: @@ -36898,6 +36974,30 @@ func rewriteValueARM64_OpSelect0_0(v *Value) bool { v.AddArg(v0) return true } + // match: (Select0 (Sub64borrow x y bo)) + // cond: + // result: (Select0 (SBCSflags x y (Select1 (NEGSflags bo)))) + for { + v_0 := v.Args[0] + if v_0.Op != OpSub64borrow { + break + } + bo := v_0.Args[2] + x := v_0.Args[0] + y := v_0.Args[1] + v.reset(OpSelect0) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpARM64SBCSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v0.AddArg(x) + v0.AddArg(y) + v1 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v2 := b.NewValue0(v.Pos, OpARM64NEGSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v2.AddArg(bo) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } return false } func rewriteValueARM64_OpSelect1_0(v *Value) bool { @@ -36930,6 +37030,34 @@ func rewriteValueARM64_OpSelect1_0(v *Value) bool { v.AddArg(v0) return true } + // match: (Select1 (Sub64borrow x y bo)) + // cond: + // result: (NEG (NGCzerocarry (Select1 (SBCSflags x y (Select1 (NEGSflags bo)))))) + for { + v_0 := v.Args[0] + if v_0.Op != OpSub64borrow { + break + } + bo := v_0.Args[2] + x := v_0.Args[0] + y := v_0.Args[1] + v.reset(OpARM64NEG) + v.Type = typ.UInt64 + v0 := b.NewValue0(v.Pos, OpARM64NGCzerocarry, typ.UInt64) + v1 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v2 := b.NewValue0(v.Pos, OpARM64SBCSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v2.AddArg(x) + v2.AddArg(y) + v3 := b.NewValue0(v.Pos, OpSelect1, types.TypeFlags) + v4 := b.NewValue0(v.Pos, OpARM64NEGSflags, types.NewTuple(typ.UInt64, types.TypeFlags)) + v4.AddArg(bo) + v3.AddArg(v4) + v2.AddArg(v3) + v1.AddArg(v2) + v0.AddArg(v1) + v.AddArg(v0) + return true + } return false } func rewriteValueARM64_OpSignExt16to32_0(v *Value) bool { diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go index 6676c69188..70874590fe 100644 --- a/test/codegen/mathbits.go +++ b/test/codegen/mathbits.go @@ -446,21 +446,25 @@ func Add64M(p, q, r *[3]uint64) { func Sub(x, y, ci uint) (r, co uint) { // amd64:"NEGL","SBBQ","NEGQ" + // arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP" return bits.Sub(x, y, ci) } func SubC(x, ci uint) (r, co uint) { // amd64:"NEGL","SBBQ","NEGQ" + // arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP" return bits.Sub(x, 7, ci) } func SubZ(x, y uint) (r, co uint) { // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL" + // arm64:"SUBS","NGC","NEG",-"SBCS",-"ADD",-"SUB\t",-"CMP" return bits.Sub(x, y, 0) } func SubR(x, y, ci uint) uint { // amd64:"NEGL","SBBQ",-"NEGQ" + // arm64:"NEGS","SBCS",-"NGC",-"NEG\t",-"ADD",-"SUB",-"CMP" r, _ := bits.Sub(x, y, ci) return r } @@ -468,27 +472,32 @@ func SubM(p, q, r *[3]uint) { var c uint r[0], c = bits.Sub(p[0], q[0], c) // amd64:"SBBQ",-"NEGL",-"NEGQ" + // arm64:"SBCS",-"NEGS",-"NGC",-"NEG",-"ADD",-"SUB",-"CMP" r[1], c = bits.Sub(p[1], q[1], c) r[2], c = bits.Sub(p[2], q[2], c) } func Sub64(x, y, ci uint64) (r, co uint64) { // amd64:"NEGL","SBBQ","NEGQ" + // arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP" return bits.Sub64(x, y, ci) } func Sub64C(x, ci uint64) (r, co uint64) { // amd64:"NEGL","SBBQ","NEGQ" + // arm64:"NEGS","SBCS","NGC","NEG",-"ADD",-"SUB",-"CMP" return bits.Sub64(x, 7, ci) } func Sub64Z(x, y uint64) (r, co uint64) { // amd64:"SUBQ","SBBQ","NEGQ",-"NEGL" + // arm64:"SUBS","NGC","NEG",-"SBCS",-"ADD",-"SUB\t",-"CMP" return bits.Sub64(x, y, 0) } func Sub64R(x, y, ci uint64) uint64 { // amd64:"NEGL","SBBQ",-"NEGQ" + // arm64:"NEGS","SBCS",-"NGC",-"NEG\t",-"ADD",-"SUB",-"CMP" r, _ := bits.Sub64(x, y, ci) return r } @@ -496,6 +505,7 @@ func Sub64M(p, q, r *[3]uint64) { var c uint64 r[0], c = bits.Sub64(p[0], q[0], c) // amd64:"SBBQ",-"NEGL",-"NEGQ" + // arm64:"SBCS",-"NEGS",-"NGC",-"NEG",-"ADD",-"SUB",-"CMP" r[1], c = bits.Sub64(p[1], q[1], c) r[2], c = bits.Sub64(p[2], q[2], c) } -- GitLab From d17d41e58d2f69d284398f1d86d93c0f31648b16 Mon Sep 17 00:00:00 2001 From: erifan01 Date: Wed, 16 May 2018 06:25:07 +0000 Subject: [PATCH 0890/1679] math/big: optimize mulAddVWW on arm64 for better performance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unroll the cycle 4 times to reduce load overhead. Benchmarks: name old time/op new time/op delta MulAddVWW/1-8 15.9ns ± 0% 11.9ns ± 0% -24.92% (p=0.000 n=8+8) MulAddVWW/2-8 16.1ns ± 0% 13.9ns ± 1% -13.82% (p=0.000 n=8+8) MulAddVWW/3-8 18.9ns ± 0% 17.3ns ± 0% -8.47% (p=0.000 n=8+8) MulAddVWW/4-8 21.7ns ± 0% 19.5ns ± 0% -10.14% (p=0.000 n=8+8) MulAddVWW/5-8 25.1ns ± 0% 22.5ns ± 0% -10.27% (p=0.000 n=8+8) MulAddVWW/10-8 41.6ns ± 0% 40.0ns ± 0% -3.79% (p=0.000 n=8+8) MulAddVWW/100-8 368ns ± 0% 363ns ± 0% -1.36% (p=0.000 n=8+8) MulAddVWW/1000-8 3.52µs ± 0% 3.52µs ± 0% -0.14% (p=0.000 n=8+8) MulAddVWW/10000-8 35.1µs ± 0% 35.1µs ± 0% -0.01% (p=0.000 n=7+6) MulAddVWW/100000-8 351µs ± 0% 351µs ± 0% +0.15% (p=0.038 n=8+8) Change-Id: I052a4db286ac6e4f3293289c7e9a82027da0405e Reviewed-on: https://go-review.googlesource.com/c/go/+/155780 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot Reviewed-by: Cherry Zhang --- src/math/big/arith_arm64.s | 51 ++++++++++++++++++++++++++++++++------ src/math/big/arith_test.go | 18 ++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/math/big/arith_arm64.s b/src/math/big/arith_arm64.s index bb23751ba3..114d5f67f2 100644 --- a/src/math/big/arith_arm64.s +++ b/src/math/big/arith_arm64.s @@ -363,16 +363,51 @@ TEXT ·mulAddVWW(SB),NOSPLIT,$0 MOVD x+24(FP), R2 MOVD y+48(FP), R3 MOVD r+56(FP), R4 -loop: - CBZ R0, done + // c, z = x * y + r + TBZ $0, R0, two MOVD.P 8(R2), R5 - UMULH R5, R3, R7 - MUL R5, R3, R6 - ADDS R4, R6 - ADC $0, R7 - MOVD.P R6, 8(R1) - MOVD R7, R4 + MUL R3, R5, R7 + UMULH R3, R5, R8 + ADDS R4, R7 + ADC $0, R8, R4 // c, z[i] = x[i] * y + r + MOVD.P R7, 8(R1) SUB $1, R0 +two: + TBZ $1, R0, loop + LDP.P 16(R2), (R5, R6) + MUL R3, R5, R10 + UMULH R3, R5, R11 + ADDS R4, R10 + MUL R3, R6, R12 + UMULH R3, R6, R13 + ADCS R12, R11 + ADC $0, R13, R4 + + STP.P (R10, R11), 16(R1) + SUB $2, R0 +loop: + CBZ R0, done + LDP.P 32(R2), (R5, R6) + LDP -16(R2), (R7, R8) + + MUL R3, R5, R10 + UMULH R3, R5, R11 + ADDS R4, R10 + MUL R3, R6, R12 + UMULH R3, R6, R13 + ADCS R11, R12 + + MUL R3, R7, R14 + UMULH R3, R7, R15 + ADCS R13, R14 + MUL R3, R8, R16 + UMULH R3, R8, R17 + ADCS R15, R16 + ADC $0, R17, R4 + + STP.P (R10, R12), 32(R1) + STP (R14, R16), -16(R1) + SUB $4, R0 B loop done: MOVD R4, c+64(FP) diff --git a/src/math/big/arith_test.go b/src/math/big/arith_test.go index 8a64321102..d28f680688 100644 --- a/src/math/big/arith_test.go +++ b/src/math/big/arith_test.go @@ -371,6 +371,24 @@ func TestMulAddWWW(t *testing.T) { } } +func BenchmarkMulAddVWW(b *testing.B) { + for _, n := range benchSizes { + if isRaceBuilder && n > 1e3 { + continue + } + z := make([]Word, n+1) + x := rndV(n) + y := rndW() + r := rndW() + b.Run(fmt.Sprint(n), func(b *testing.B) { + b.SetBytes(int64(n * _W)) + for i := 0; i < b.N; i++ { + mulAddVWW(z, x, y, r) + } + }) + } +} + func BenchmarkAddMulVVW(b *testing.B) { for _, n := range benchSizes { if isRaceBuilder && n > 1e3 { -- GitLab From fe1afe8d4ca06c56f583a9296282697f39d27d97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Sun, 25 Nov 2018 00:24:20 +0000 Subject: [PATCH 0891/1679] encoding/json: avoid work when unquoting strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can work out how many bytes can be unquoted trivially in rescanLiteral, which already iterates over a string's bytes. Removing the extra loop in unquoteBytes simplifies the function and speeds it up, especially when decoding simple strings, which are common. While at it, we can remove unnecessary checks like len(s)<2 and s[0]=='"'. Add a comment explaining why. name old time/op new time/op delta CodeDecoder-8 11.2ms ± 0% 11.1ms ± 1% -1.63% (p=0.000 n=9+10) name old speed new speed delta CodeDecoder-8 173MB/s ± 0% 175MB/s ± 1% +1.66% (p=0.000 n=9+10) Updates #28923. Change-Id: I2436a3a7f8148a2f7a6a4cdbd7dec6b32ef5e20c Reviewed-on: https://go-review.googlesource.com/c/go/+/151157 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/json/decode.go | 68 ++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 59b6fd166c..3c40eb9cef 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -273,6 +273,9 @@ type decodeState struct { savedError error useNumber bool disallowUnknownFields bool + // safeUnquote is the number of current string literal bytes that don't + // need to be unquoted. When negative, no bytes need unquoting. + safeUnquote int } // readIndex returns the position of the last byte read. @@ -374,13 +377,27 @@ func (d *decodeState) rescanLiteral() { Switch: switch data[i-1] { case '"': // string + // safeUnquote is initialized at -1, which means that all bytes + // checked so far can be unquoted at a later time with no work + // at all. When reaching the closing '"', if safeUnquote is + // still -1, all bytes can be unquoted with no work. Otherwise, + // only those bytes up until the first '\\' or non-ascii rune + // can be safely unquoted. + safeUnquote := -1 for ; i < len(data); i++ { - switch data[i] { - case '\\': + if c := data[i]; c == '\\' { + if safeUnquote < 0 { // first unsafe byte + safeUnquote = int(i - d.off) + } i++ // escaped char - case '"': + } else if c == '"' { + d.safeUnquote = safeUnquote i++ // tokenize the closing quote too break Switch + } else if c >= utf8.RuneSelf { + if safeUnquote < 0 { // first unsafe byte + safeUnquote = int(i - d.off) + } } } case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': // number @@ -725,7 +742,7 @@ func (d *decodeState) object(v reflect.Value) error { start := d.readIndex() d.rescanLiteral() item := d.data[start:d.readIndex()] - key, ok := unquoteBytes(item) + key, ok := d.unquoteBytes(item) if !ok { panic(phasePanicMsg) } @@ -922,7 +939,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool d.saveError(&UnmarshalTypeError{Value: val, Type: v.Type(), Offset: int64(d.readIndex())}) return nil } - s, ok := unquoteBytes(item) + s, ok := d.unquoteBytes(item) if !ok { if fromQuoted { return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) @@ -973,7 +990,7 @@ func (d *decodeState) literalStore(item []byte, v reflect.Value, fromQuoted bool } case '"': // string - s, ok := unquoteBytes(item) + s, ok := d.unquoteBytes(item) if !ok { if fromQuoted { return fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into %v", item, v.Type()) @@ -1131,7 +1148,7 @@ func (d *decodeState) objectInterface() map[string]interface{} { start := d.readIndex() d.rescanLiteral() item := d.data[start:d.readIndex()] - key, ok := unquote(item) + key, ok := d.unquote(item) if !ok { panic(phasePanicMsg) } @@ -1180,7 +1197,7 @@ func (d *decodeState) literalInterface() interface{} { return c == 't' case '"': // string - s, ok := unquote(item) + s, ok := d.unquote(item) if !ok { panic(phasePanicMsg) } @@ -1223,38 +1240,21 @@ func getu4(s []byte) rune { // unquote converts a quoted JSON string literal s into an actual string t. // The rules are different than for Go, so cannot use strconv.Unquote. -func unquote(s []byte) (t string, ok bool) { - s, ok = unquoteBytes(s) +func (d *decodeState) unquote(s []byte) (t string, ok bool) { + s, ok = d.unquoteBytes(s) t = string(s) return } -func unquoteBytes(s []byte) (t []byte, ok bool) { - if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' { - return - } +func (d *decodeState) unquoteBytes(s []byte) (t []byte, ok bool) { + r := d.safeUnquote + // The bytes have been scanned, so we know that the first and last bytes + // are double quotes. s = s[1 : len(s)-1] - // Check for unusual characters. If there are none, - // then no unquoting is needed, so return a slice of the - // original bytes. - r := 0 - for r < len(s) { - c := s[r] - if c == '\\' || c == '"' || c < ' ' { - break - } - if c < utf8.RuneSelf { - r++ - continue - } - rr, size := utf8.DecodeRune(s[r:]) - if rr == utf8.RuneError && size == 1 { - break - } - r += size - } - if r == len(s) { + // If there are no unusual characters, no unquoting is needed, so return + // a slice of the original bytes. + if r == -1 { return s, true } -- GitLab From 744fcfec4e94d9585d2be6f9efae8480a2f2fc8d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 19 Apr 2019 15:56:37 -0400 Subject: [PATCH 0892/1679] runtime: improve mstart comments Some of the comments were unclear or outdated. Change-Id: I02e01bf60def0074c1fa760e94aa992e9e4969b9 Reviewed-on: https://go-review.googlesource.com/c/go/+/172987 Run-TryBot: Austin Clements TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- src/runtime/proc.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 30ddeadff5..57ad17d594 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1125,7 +1125,7 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 { return startTime } -// Called to start an M. +// mstart is the entry-point for new Ms. // // This must not split the stack because we may not even have stack // bounds set up yet. @@ -1150,9 +1150,11 @@ func mstart() { _g_.stack.hi = uintptr(noescape(unsafe.Pointer(&size))) _g_.stack.lo = _g_.stack.hi - size + 1024 } - // Initialize stack guards so that we can start calling - // both Go and C functions with stack growth prologues. + // Initialize stack guard so that we can start calling regular + // Go code. _g_.stackguard0 = _g_.stack.lo + _StackGuard + // This is the g0, so we can also call go:systemstack + // functions, which check stackguard1. _g_.stackguard1 = _g_.stackguard0 mstart1() -- GitLab From d1f43ccef7a8285bf3bcd3518d4f38838ce5da1c Mon Sep 17 00:00:00 2001 From: Maya Rashish Date: Mon, 22 Apr 2019 10:01:22 +0000 Subject: [PATCH 0893/1679] runtime: use named macros on NetBSD It will use the full names that appear in netbsd's /usr/include/sys/syscall.h names. This adds some compat-goo (sys_sigprocmask->SYS_sigprocmask14), which might not be pretty, but the information about whether the compat version is used is probably important, as Go will keep using interfaces even after they are considered compatibility, which has caused problems in the past. also, the same names appear in ktrace (with the numbers). Change-Id: Idc1bb254ee33757a39ba224d91e8fbb0331e2149 GitHub-Last-Rev: b915e8f8a323cdc2d03119c3cf18e35d08c63d18 GitHub-Pull-Request: golang/go#31594 Reviewed-on: https://go-review.googlesource.com/c/go/+/173158 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/runtime/sys_netbsd_386.s | 110 +++++++++++++++++++++----------- src/runtime/sys_netbsd_amd64.s | 112 ++++++++++++++++++++++----------- src/runtime/sys_netbsd_arm.s | 110 +++++++++++++++++++++----------- src/runtime/sys_netbsd_arm64.s | 70 ++++++++++----------- 4 files changed, 256 insertions(+), 146 deletions(-) diff --git a/src/runtime/sys_netbsd_386.s b/src/runtime/sys_netbsd_386.s index 66f4620cab..5501e10106 100644 --- a/src/runtime/sys_netbsd_386.s +++ b/src/runtime/sys_netbsd_386.s @@ -10,9 +10,45 @@ #include "go_tls.h" #include "textflag.h" +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 3 +#define FD_CLOEXEC 1 +#define F_SETFD 2 + +#define SYS_exit 1 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_getpid 20 +#define SYS_kill 37 +#define SYS_munmap 73 +#define SYS_madvise 75 +#define SYS_fcntl 92 +#define SYS_mmap 197 +#define SYS___sysctl 202 +#define SYS___sigaltstack14 281 +#define SYS___sigprocmask14 293 +#define SYS_getcontext 307 +#define SYS_setcontext 308 +#define SYS__lwp_create 309 +#define SYS__lwp_exit 310 +#define SYS__lwp_self 311 +#define SYS__lwp_setprivate 317 +#define SYS__lwp_kill 318 +#define SYS__lwp_unpark 321 +#define SYS___sigaction_sigtramp 340 +#define SYS_kqueue 344 +#define SYS_sched_yield 350 +#define SYS___setitimer50 425 +#define SYS___clock_gettime50 427 +#define SYS___nanosleep50 430 +#define SYS___kevent50 435 +#define SYS____lwp_park60 478 + // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT,$-4 - MOVL $1, AX + MOVL $SYS_exit, AX INT $0x80 MOVL $0xf1, 0xf1 // crash RET @@ -22,13 +58,13 @@ TEXT runtime·exitThread(SB),NOSPLIT,$0-4 MOVL wait+0(FP), AX // We're done using the stack. MOVL $0, (AX) - MOVL $310, AX // sys__lwp_exit + MOVL $SYS__lwp_exit, AX INT $0x80 MOVL $0xf1, 0xf1 // crash JMP 0(PC) TEXT runtime·open(SB),NOSPLIT,$-4 - MOVL $5, AX + MOVL $SYS_open, AX INT $0x80 JAE 2(PC) MOVL $-1, AX @@ -36,7 +72,7 @@ TEXT runtime·open(SB),NOSPLIT,$-4 RET TEXT runtime·closefd(SB),NOSPLIT,$-4 - MOVL $6, AX + MOVL $SYS_close, AX INT $0x80 JAE 2(PC) MOVL $-1, AX @@ -44,7 +80,7 @@ TEXT runtime·closefd(SB),NOSPLIT,$-4 RET TEXT runtime·read(SB),NOSPLIT,$-4 - MOVL $3, AX + MOVL $SYS_read, AX INT $0x80 JAE 2(PC) MOVL $-1, AX @@ -52,7 +88,7 @@ TEXT runtime·read(SB),NOSPLIT,$-4 RET TEXT runtime·write(SB),NOSPLIT,$-4 - MOVL $4, AX // sys_write + MOVL $SYS_write, AX INT $0x80 JAE 2(PC) MOVL $-1, AX @@ -74,29 +110,29 @@ TEXT runtime·usleep(SB),NOSPLIT,$24 LEAL 12(SP), AX MOVL AX, 4(SP) // arg 1 - rqtp MOVL $0, 8(SP) // arg 2 - rmtp - MOVL $430, AX // sys_nanosleep + MOVL $SYS___nanosleep50, AX INT $0x80 RET TEXT runtime·raise(SB),NOSPLIT,$12 - MOVL $311, AX // sys__lwp_self + MOVL $SYS__lwp_self, AX INT $0x80 MOVL $0, 0(SP) MOVL AX, 4(SP) // arg 1 - target MOVL sig+0(FP), AX MOVL AX, 8(SP) // arg 2 - signo - MOVL $318, AX // sys__lwp_kill + MOVL $SYS__lwp_kill, AX INT $0x80 RET TEXT runtime·raiseproc(SB),NOSPLIT,$12 - MOVL $20, AX // sys_getpid + MOVL $SYS_getpid, AX INT $0x80 MOVL $0, 0(SP) MOVL AX, 4(SP) // arg 1 - pid MOVL sig+0(FP), AX MOVL AX, 8(SP) // arg 2 - signo - MOVL $37, AX // sys_kill + MOVL $SYS_kill, AX INT $0x80 RET @@ -114,7 +150,7 @@ TEXT runtime·mmap(SB),NOSPLIT,$36 MOVSL // arg 7 - offset MOVL $0, AX // top 32 bits of file offset STOSL - MOVL $197, AX // sys_mmap + MOVL $SYS_mmap, AX INT $0x80 JAE ok MOVL $0, p+24(FP) @@ -126,14 +162,14 @@ ok: RET TEXT runtime·munmap(SB),NOSPLIT,$-4 - MOVL $73, AX // sys_munmap + MOVL $SYS_munmap, AX INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash RET TEXT runtime·madvise(SB),NOSPLIT,$-4 - MOVL $75, AX // sys_madvise + MOVL $SYS_madvise, AX INT $0x80 JAE 2(PC) MOVL $-1, AX @@ -141,16 +177,16 @@ TEXT runtime·madvise(SB),NOSPLIT,$-4 RET TEXT runtime·setitimer(SB),NOSPLIT,$-4 - MOVL $425, AX // sys_setitimer + MOVL $SYS___setitimer50, AX INT $0x80 RET // func walltime() (sec int64, nsec int32) TEXT runtime·walltime(SB), NOSPLIT, $32 LEAL 12(SP), BX - MOVL $0, 4(SP) // arg 1 - clock_id + MOVL $CLOCK_REALTIME, 4(SP) // arg 1 - clock_id MOVL BX, 8(SP) // arg 2 - tp - MOVL $427, AX // sys_clock_gettime + MOVL $SYS___clock_gettime50, AX INT $0x80 MOVL 12(SP), AX // sec - l32 @@ -166,9 +202,9 @@ TEXT runtime·walltime(SB), NOSPLIT, $32 // void nanotime(int64 *nsec) TEXT runtime·nanotime(SB),NOSPLIT,$32 LEAL 12(SP), BX - MOVL $3, 4(SP) // arg 1 - clock_id CLOCK_MONOTONIC + MOVL $CLOCK_MONOTONIC, 4(SP) // arg 1 - clock_id MOVL BX, 8(SP) // arg 2 - tp - MOVL $427, AX // sys_clock_gettime + MOVL $SYS___clock_gettime50, AX INT $0x80 MOVL 16(SP), CX // sec - h32 @@ -187,14 +223,14 @@ TEXT runtime·nanotime(SB),NOSPLIT,$32 RET TEXT runtime·getcontext(SB),NOSPLIT,$-4 - MOVL $307, AX // sys_getcontext + MOVL $SYS_getcontext, AX INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash RET TEXT runtime·sigprocmask(SB),NOSPLIT,$-4 - MOVL $293, AX // sys_sigprocmask + MOVL $SYS___sigprocmask14, AX INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash @@ -203,10 +239,10 @@ TEXT runtime·sigprocmask(SB),NOSPLIT,$-4 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$0 LEAL 140(SP), AX // Load address of ucontext MOVL AX, 4(SP) - MOVL $308, AX // sys_setcontext + MOVL $SYS_setcontext, AX INT $0x80 MOVL $-1, 4(SP) // Something failed... - MOVL $1, AX // sys_exit + MOVL $SYS_exit, AX INT $0x80 TEXT runtime·sigaction(SB),NOSPLIT,$24 @@ -220,7 +256,7 @@ TEXT runtime·sigaction(SB),NOSPLIT,$24 STOSL // arg 4 - tramp MOVL $2, AX STOSL // arg 5 - vers - MOVL $340, AX // sys___sigaction_sigtramp + MOVL $SYS___sigaction_sigtramp, AX INT $0x80 JAE 2(PC) MOVL $0xf1, 0xf1 // crash @@ -275,7 +311,7 @@ TEXT runtime·lwp_create(SB),NOSPLIT,$16 MOVL AX, 8(SP) // arg 2 - flags MOVL lwpid+8(FP), AX MOVL AX, 12(SP) // arg 3 - lwpid - MOVL $309, AX // sys__lwp_create + MOVL $SYS__lwp_create, AX INT $0x80 JCC 2(PC) NEGL AX @@ -314,7 +350,7 @@ TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 RET TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 - MOVL $281, AX // sys___sigaltstack14 + MOVL $SYS___sigaltstack14, AX MOVL new+0(FP), BX MOVL old+4(FP), CX INT $0x80 @@ -336,31 +372,31 @@ TEXT runtime·settls(SB),NOSPLIT,$16 ADDL $4, CX MOVL $0, 0(SP) // syscall gap MOVL CX, 4(SP) // arg 1 - ptr - MOVL $317, AX // sys__lwp_setprivate + MOVL $SYS__lwp_setprivate, AX INT $0x80 JCC 2(PC) MOVL $0xf1, 0xf1 // crash RET TEXT runtime·osyield(SB),NOSPLIT,$-4 - MOVL $350, AX // sys_sched_yield + MOVL $SYS_sched_yield, AX INT $0x80 RET TEXT runtime·lwp_park(SB),NOSPLIT,$-4 - MOVL $478, AX // sys__lwp_park + MOVL $SYS____lwp_park60, AX INT $0x80 MOVL AX, ret+24(FP) RET TEXT runtime·lwp_unpark(SB),NOSPLIT,$-4 - MOVL $321, AX // sys__lwp_unpark + MOVL $SYS__lwp_unpark, AX INT $0x80 MOVL AX, ret+8(FP) RET TEXT runtime·lwp_self(SB),NOSPLIT,$-4 - MOVL $311, AX // sys__lwp_self + MOVL $SYS__lwp_self, AX INT $0x80 MOVL AX, ret+0(FP) RET @@ -375,7 +411,7 @@ TEXT runtime·sysctl(SB),NOSPLIT,$28 MOVSL // arg 4 - oldlenp MOVSL // arg 5 - newp MOVSL // arg 6 - newlen - MOVL $202, AX // sys___sysctl + MOVL $SYS___sysctl, AX INT $0x80 JAE 4(PC) NEGL AX @@ -389,7 +425,7 @@ GLOBL runtime·tlsoffset(SB),NOPTR,$4 // int32 runtime·kqueue(void) TEXT runtime·kqueue(SB),NOSPLIT,$0 - MOVL $344, AX + MOVL $SYS_kqueue, AX INT $0x80 JAE 2(PC) NEGL AX @@ -398,7 +434,7 @@ TEXT runtime·kqueue(SB),NOSPLIT,$0 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout) TEXT runtime·kevent(SB),NOSPLIT,$0 - MOVL $435, AX + MOVL $SYS___kevent50, AX INT $0x80 JAE 2(PC) NEGL AX @@ -407,12 +443,12 @@ TEXT runtime·kevent(SB),NOSPLIT,$0 // int32 runtime·closeonexec(int32 fd) TEXT runtime·closeonexec(SB),NOSPLIT,$32 - MOVL $92, AX // fcntl + MOVL $SYS_fcntl, AX // 0(SP) is where the caller PC would be; kernel skips it MOVL fd+0(FP), BX MOVL BX, 4(SP) // fd - MOVL $2, 8(SP) // F_SETFD - MOVL $1, 12(SP) // FD_CLOEXEC + MOVL $F_SETFD, 8(SP) + MOVL $FD_CLOEXEC, 12(SP) INT $0x80 JAE 2(PC) NEGL AX diff --git a/src/runtime/sys_netbsd_amd64.s b/src/runtime/sys_netbsd_amd64.s index 531c227a7b..588d811287 100644 --- a/src/runtime/sys_netbsd_amd64.s +++ b/src/runtime/sys_netbsd_amd64.s @@ -10,12 +10,48 @@ #include "go_tls.h" #include "textflag.h" +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 3 +#define FD_CLOEXEC 1 +#define F_SETFD 2 + +#define SYS_exit 1 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_getpid 20 +#define SYS_kill 37 +#define SYS_munmap 73 +#define SYS_madvise 75 +#define SYS_fcntl 92 +#define SYS_mmap 197 +#define SYS___sysctl 202 +#define SYS___sigaltstack14 281 +#define SYS___sigprocmask14 293 +#define SYS_getcontext 307 +#define SYS_setcontext 308 +#define SYS__lwp_create 309 +#define SYS__lwp_exit 310 +#define SYS__lwp_self 311 +#define SYS__lwp_setprivate 317 +#define SYS__lwp_kill 318 +#define SYS__lwp_unpark 321 +#define SYS___sigaction_sigtramp 340 +#define SYS_kqueue 344 +#define SYS_sched_yield 350 +#define SYS___setitimer50 425 +#define SYS___clock_gettime50 427 +#define SYS___nanosleep50 430 +#define SYS___kevent50 435 +#define SYS____lwp_park60 478 + // int32 lwp_create(void *context, uintptr flags, void *lwpid) TEXT runtime·lwp_create(SB),NOSPLIT,$0 MOVQ ctxt+0(FP), DI MOVQ flags+8(FP), SI MOVQ lwpid+16(FP), DX - MOVL $309, AX // sys__lwp_create + MOVL $SYS__lwp_create, AX SYSCALL JCC 2(PC) NEGQ AX @@ -38,12 +74,12 @@ TEXT runtime·lwp_tramp(SB),NOSPLIT,$0 CALL R12 // It shouldn't return. If it does, exit. - MOVL $310, AX // sys__lwp_exit + MOVL $SYS__lwp_exit, AX SYSCALL JMP -3(PC) // keep exiting TEXT runtime·osyield(SB),NOSPLIT,$0 - MOVL $350, AX // sys_sched_yield + MOVL $SYS_sched_yield, AX SYSCALL RET @@ -54,7 +90,7 @@ TEXT runtime·lwp_park(SB),NOSPLIT,$0 MOVL unpark+16(FP), R10 // arg 4 - unpark MOVQ hint+24(FP), R8 // arg 5 - hint MOVQ unparkhint+32(FP), R9 // arg 6 - unparkhint - MOVL $478, AX // sys__lwp_park + MOVL $SYS____lwp_park60, AX SYSCALL MOVL AX, ret+40(FP) RET @@ -62,13 +98,13 @@ TEXT runtime·lwp_park(SB),NOSPLIT,$0 TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 MOVL lwp+0(FP), DI // arg 1 - lwp MOVQ hint+8(FP), SI // arg 2 - hint - MOVL $321, AX // sys__lwp_unpark + MOVL $SYS__lwp_unpark, AX SYSCALL MOVL AX, ret+16(FP) RET TEXT runtime·lwp_self(SB),NOSPLIT,$0 - MOVL $311, AX // sys__lwp_self + MOVL $SYS__lwp_self, AX SYSCALL MOVL AX, ret+0(FP) RET @@ -76,7 +112,7 @@ TEXT runtime·lwp_self(SB),NOSPLIT,$0 // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT,$-8 MOVL code+0(FP), DI // arg 1 - exit status - MOVL $1, AX // sys_exit + MOVL $SYS_exit, AX SYSCALL MOVL $0xf1, 0xf1 // crash RET @@ -86,7 +122,7 @@ TEXT runtime·exitThread(SB),NOSPLIT,$0-8 MOVQ wait+0(FP), AX // We're done using the stack. MOVL $0, (AX) - MOVL $310, AX // sys__lwp_exit + MOVL $SYS__lwp_exit, AX SYSCALL MOVL $0xf1, 0xf1 // crash JMP 0(PC) @@ -95,7 +131,7 @@ TEXT runtime·open(SB),NOSPLIT,$-8 MOVQ name+0(FP), DI // arg 1 pathname MOVL mode+8(FP), SI // arg 2 flags MOVL perm+12(FP), DX // arg 3 mode - MOVL $5, AX + MOVL $SYS_open, AX SYSCALL JCC 2(PC) MOVL $-1, AX @@ -104,7 +140,7 @@ TEXT runtime·open(SB),NOSPLIT,$-8 TEXT runtime·closefd(SB),NOSPLIT,$-8 MOVL fd+0(FP), DI // arg 1 fd - MOVL $6, AX + MOVL $SYS_close, AX SYSCALL JCC 2(PC) MOVL $-1, AX @@ -115,7 +151,7 @@ TEXT runtime·read(SB),NOSPLIT,$-8 MOVL fd+0(FP), DI // arg 1 fd MOVQ p+8(FP), SI // arg 2 buf MOVL n+16(FP), DX // arg 3 count - MOVL $3, AX + MOVL $SYS_read, AX SYSCALL JCC 2(PC) MOVL $-1, AX @@ -126,7 +162,7 @@ TEXT runtime·write(SB),NOSPLIT,$-8 MOVQ fd+0(FP), DI // arg 1 - fd MOVQ p+8(FP), SI // arg 2 - buf MOVL n+16(FP), DX // arg 3 - nbyte - MOVL $4, AX // sys_write + MOVL $SYS_write, AX SYSCALL JCC 2(PC) MOVL $-1, AX @@ -145,25 +181,25 @@ TEXT runtime·usleep(SB),NOSPLIT,$16 MOVQ SP, DI // arg 1 - rqtp MOVQ $0, SI // arg 2 - rmtp - MOVL $430, AX // sys_nanosleep + MOVL $SYS___nanosleep50, AX SYSCALL RET TEXT runtime·raise(SB),NOSPLIT,$16 - MOVL $311, AX // sys__lwp_self + MOVL $SYS__lwp_self, AX SYSCALL MOVQ AX, DI // arg 1 - target MOVL sig+0(FP), SI // arg 2 - signo - MOVL $318, AX // sys__lwp_kill + MOVL $SYS__lwp_kill, AX SYSCALL RET TEXT runtime·raiseproc(SB),NOSPLIT,$16 - MOVL $20, AX // sys_getpid + MOVL $SYS_getpid, AX SYSCALL MOVQ AX, DI // arg 1 - pid MOVL sig+0(FP), SI // arg 2 - signo - MOVL $37, AX // sys_kill + MOVL $SYS_kill, AX SYSCALL RET @@ -171,15 +207,15 @@ TEXT runtime·setitimer(SB),NOSPLIT,$-8 MOVL mode+0(FP), DI // arg 1 - which MOVQ new+8(FP), SI // arg 2 - itv MOVQ old+16(FP), DX // arg 3 - oitv - MOVL $425, AX // sys_setitimer + MOVL $SYS___setitimer50, AX SYSCALL RET // func walltime() (sec int64, nsec int32) TEXT runtime·walltime(SB), NOSPLIT, $32 - MOVQ $0, DI // arg 1 - clock_id + MOVQ $CLOCK_REALTIME, DI // arg 1 - clock_id LEAQ 8(SP), SI // arg 2 - tp - MOVL $427, AX // sys_clock_gettime + MOVL $SYS___clock_gettime50, AX SYSCALL MOVQ 8(SP), AX // sec MOVL 16(SP), DX // nsec @@ -190,9 +226,9 @@ TEXT runtime·walltime(SB), NOSPLIT, $32 RET TEXT runtime·nanotime(SB),NOSPLIT,$32 - MOVQ $3, DI // arg 1 - clock_id CLOCK_MONOTONIC + MOVQ $CLOCK_MONOTONIC, DI // arg 1 - clock_id LEAQ 8(SP), SI // arg 2 - tp - MOVL $427, AX // sys_clock_gettime + MOVL $SYS___clock_gettime50, AX SYSCALL MOVQ 8(SP), AX // sec MOVL 16(SP), DX // nsec @@ -206,7 +242,7 @@ TEXT runtime·nanotime(SB),NOSPLIT,$32 TEXT runtime·getcontext(SB),NOSPLIT,$-8 MOVQ ctxt+0(FP), DI // arg 1 - context - MOVL $307, AX // sys_getcontext + MOVL $SYS_getcontext, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -216,7 +252,7 @@ TEXT runtime·sigprocmask(SB),NOSPLIT,$0 MOVL how+0(FP), DI // arg 1 - how MOVQ new+8(FP), SI // arg 2 - set MOVQ old+16(FP), DX // arg 3 - oset - MOVL $293, AX // sys_sigprocmask + MOVL $SYS___sigprocmask14, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -224,10 +260,10 @@ TEXT runtime·sigprocmask(SB),NOSPLIT,$0 TEXT runtime·sigreturn_tramp(SB),NOSPLIT,$-8 MOVQ R15, DI // Load address of ucontext - MOVQ $308, AX // sys_setcontext + MOVQ $SYS_setcontext, AX SYSCALL MOVQ $-1, DI // Something failed... - MOVL $1, AX // sys_exit + MOVL $SYS_exit, AX SYSCALL TEXT runtime·sigaction(SB),NOSPLIT,$-8 @@ -237,7 +273,7 @@ TEXT runtime·sigaction(SB),NOSPLIT,$-8 // arg 4 - tramp LEAQ runtime·sigreturn_tramp(SB), R10 MOVQ $2, R8 // arg 5 - vers - MOVL $340, AX // sys___sigaction_sigtramp + MOVL $SYS___sigaction_sigtramp, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -290,7 +326,7 @@ TEXT runtime·mmap(SB),NOSPLIT,$0 SUBQ $16, SP MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) MOVQ $0, R9 // arg 6 - pad - MOVL $197, AX // sys_mmap + MOVL $SYS_mmap, AX SYSCALL JCC ok ADDQ $16, SP @@ -306,7 +342,7 @@ ok: TEXT runtime·munmap(SB),NOSPLIT,$0 MOVQ addr+0(FP), DI // arg 1 - addr MOVQ n+8(FP), SI // arg 2 - len - MOVL $73, AX // sys_munmap + MOVL $SYS_munmap, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -317,7 +353,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 MOVQ addr+0(FP), DI // arg 1 - addr MOVQ n+8(FP), SI // arg 2 - len MOVL flags+16(FP), DX // arg 3 - behav - MOVQ $75, AX // sys_madvise + MOVQ $SYS_madvise, AX SYSCALL JCC 2(PC) MOVL $-1, AX @@ -327,7 +363,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 MOVQ new+0(FP), DI // arg 1 - nss MOVQ old+8(FP), SI // arg 2 - oss - MOVQ $281, AX // sys___sigaltstack14 + MOVQ $SYS___sigaltstack14, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -337,7 +373,7 @@ TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 TEXT runtime·settls(SB),NOSPLIT,$8 // adjust for ELF: wants to use -8(FS) for g ADDQ $8, DI // arg 1 - ptr - MOVQ $317, AX // sys__lwp_setprivate + MOVQ $SYS__lwp_setprivate, AX SYSCALL JCC 2(PC) MOVL $0xf1, 0xf1 // crash @@ -350,7 +386,7 @@ TEXT runtime·sysctl(SB),NOSPLIT,$0 MOVQ size+24(FP), R10 // arg 4 - oldlenp MOVQ dst+32(FP), R8 // arg 5 - newp MOVQ ndst+40(FP), R9 // arg 6 - newlen - MOVQ $202, AX // sys___sysctl + MOVQ $SYS___sysctl, AX SYSCALL JCC 4(PC) NEGQ AX @@ -363,7 +399,7 @@ TEXT runtime·sysctl(SB),NOSPLIT,$0 // int32 runtime·kqueue(void) TEXT runtime·kqueue(SB),NOSPLIT,$0 MOVQ $0, DI - MOVL $344, AX + MOVL $SYS_kqueue, AX SYSCALL JCC 2(PC) NEGQ AX @@ -378,7 +414,7 @@ TEXT runtime·kevent(SB),NOSPLIT,$0 MOVQ ev+24(FP), R10 MOVL nev+32(FP), R8 MOVQ ts+40(FP), R9 - MOVL $435, AX + MOVL $SYS___kevent50, AX SYSCALL JCC 2(PC) NEGQ AX @@ -388,8 +424,8 @@ TEXT runtime·kevent(SB),NOSPLIT,$0 // void runtime·closeonexec(int32 fd) TEXT runtime·closeonexec(SB),NOSPLIT,$0 MOVL fd+0(FP), DI // fd - MOVQ $2, SI // F_SETFD - MOVQ $1, DX // FD_CLOEXEC - MOVL $92, AX // fcntl + MOVQ $F_SETFD, SI + MOVQ $FD_CLOEXEC, DX + MOVL $SYS_fcntl, AX SYSCALL RET diff --git a/src/runtime/sys_netbsd_arm.s b/src/runtime/sys_netbsd_arm.s index 304075f295..e8f096807b 100644 --- a/src/runtime/sys_netbsd_arm.s +++ b/src/runtime/sys_netbsd_arm.s @@ -10,10 +10,48 @@ #include "go_tls.h" #include "textflag.h" +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 3 +#define FD_CLOEXEC 1 +#define F_SETFD 2 + +#define SWI_OS_NETBSD 0xa00000 +#define SYS_exit SWI_OS_NETBSD | 1 +#define SYS_read SWI_OS_NETBSD | 3 +#define SYS_write SWI_OS_NETBSD | 4 +#define SYS_open SWI_OS_NETBSD | 5 +#define SYS_close SWI_OS_NETBSD | 6 +#define SYS_getpid SWI_OS_NETBSD | 20 +#define SYS_kill SWI_OS_NETBSD | 37 +#define SYS_munmap SWI_OS_NETBSD | 73 +#define SYS_madvise SWI_OS_NETBSD | 75 +#define SYS_fcntl SWI_OS_NETBSD | 92 +#define SYS_mmap SWI_OS_NETBSD | 197 +#define SYS___sysctl SWI_OS_NETBSD | 202 +#define SYS___sigaltstack14 SWI_OS_NETBSD | 281 +#define SYS___sigprocmask14 SWI_OS_NETBSD | 293 +#define SYS_getcontext SWI_OS_NETBSD | 307 +#define SYS_setcontext SWI_OS_NETBSD | 308 +#define SYS__lwp_create SWI_OS_NETBSD | 309 +#define SYS__lwp_exit SWI_OS_NETBSD | 310 +#define SYS__lwp_self SWI_OS_NETBSD | 311 +#define SYS__lwp_getprivate SWI_OS_NETBSD | 316 +#define SYS__lwp_setprivate SWI_OS_NETBSD | 317 +#define SYS__lwp_kill SWI_OS_NETBSD | 318 +#define SYS__lwp_unpark SWI_OS_NETBSD | 321 +#define SYS___sigaction_sigtramp SWI_OS_NETBSD | 340 +#define SYS_kqueue SWI_OS_NETBSD | 344 +#define SYS_sched_yield SWI_OS_NETBSD | 350 +#define SYS___setitimer50 SWI_OS_NETBSD | 425 +#define SYS___clock_gettime50 SWI_OS_NETBSD | 427 +#define SYS___nanosleep50 SWI_OS_NETBSD | 430 +#define SYS___kevent50 SWI_OS_NETBSD | 435 +#define SYS____lwp_park60 SWI_OS_NETBSD | 478 + // Exit the entire program (like C exit) TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 MOVW code+0(FP), R0 // arg 1 exit status - SWI $0xa00001 + SWI $SYS_exit MOVW.CS $0, R8 // crash on syscall failure MOVW.CS R8, (R8) RET @@ -28,7 +66,7 @@ storeloop: STREX R2, (R0), R1 // stores R2 CMP $0, R1 BNE storeloop - SWI $0xa00136 // sys__lwp_exit + SWI $SYS__lwp_exit MOVW $1, R8 // crash MOVW R8, (R8) JMP 0(PC) @@ -37,14 +75,14 @@ TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0 MOVW name+0(FP), R0 MOVW mode+4(FP), R1 MOVW perm+8(FP), R2 - SWI $0xa00005 + SWI $SYS_open MOVW.CS $-1, R0 MOVW R0, ret+12(FP) RET TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0 MOVW fd+0(FP), R0 - SWI $0xa00006 + SWI $SYS_close MOVW.CS $-1, R0 MOVW R0, ret+4(FP) RET @@ -53,7 +91,7 @@ TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0 MOVW fd+0(FP), R0 MOVW p+4(FP), R1 MOVW n+8(FP), R2 - SWI $0xa00003 + SWI $SYS_read MOVW.CS $-1, R0 MOVW R0, ret+12(FP) RET @@ -62,7 +100,7 @@ TEXT runtime·write(SB),NOSPLIT|NOFRAME,$0 MOVW fd+0(FP), R0 // arg 1 - fd MOVW p+4(FP), R1 // arg 2 - buf MOVW n+8(FP), R2 // arg 3 - nbyte - SWI $0xa00004 // sys_write + SWI $SYS_write MOVW.CS $-1, R0 MOVW R0, ret+12(FP) RET @@ -72,12 +110,12 @@ TEXT runtime·lwp_create(SB),NOSPLIT,$0 MOVW ctxt+0(FP), R0 MOVW flags+4(FP), R1 MOVW lwpid+8(FP), R2 - SWI $0xa00135 // sys__lwp_create + SWI $SYS__lwp_create MOVW R0, ret+12(FP) RET TEXT runtime·osyield(SB),NOSPLIT,$0 - SWI $0xa0015e // sys_sched_yield + SWI $SYS_sched_yield RET TEXT runtime·lwp_park(SB),NOSPLIT,$8 @@ -89,19 +127,19 @@ TEXT runtime·lwp_park(SB),NOSPLIT,$8 MOVW R4, 4(R13) MOVW unparkhint+20(FP), R5 // arg 6 - unparkhint MOVW R5, 8(R13) - SWI $0xa001de // sys__lwp_park + SWI $SYS____lwp_park60 MOVW R0, ret+24(FP) RET TEXT runtime·lwp_unpark(SB),NOSPLIT,$0 MOVW lwp+0(FP), R0 // arg 1 - lwp MOVW hint+4(FP), R1 // arg 2 - hint - SWI $0xa00141 // sys__lwp_unpark + SWI $SYS__lwp_unpark MOVW R0, ret+8(FP) RET TEXT runtime·lwp_self(SB),NOSPLIT,$0 - SWI $0xa00137 // sys__lwp_self + SWI $SYS__lwp_self MOVW R0, ret+0(FP) RET @@ -128,33 +166,33 @@ TEXT runtime·usleep(SB),NOSPLIT,$16 MOVW $4(R13), R0 // arg 1 - rqtp MOVW $0, R1 // arg 2 - rmtp - SWI $0xa001ae // sys_nanosleep + SWI $SYS___nanosleep50 RET TEXT runtime·raise(SB),NOSPLIT,$16 - SWI $0xa00137 // sys__lwp_self, the returned R0 is arg 1 + SWI $SYS__lwp_self // the returned R0 is arg 1 MOVW sig+0(FP), R1 // arg 2 - signal - SWI $0xa0013e // sys__lwp_kill + SWI $SYS__lwp_kill RET TEXT runtime·raiseproc(SB),NOSPLIT,$16 - SWI $0xa00014 // sys_getpid, the returned R0 is arg 1 + SWI $SYS_getpid // the returned R0 is arg 1 MOVW sig+0(FP), R1 // arg 2 - signal - SWI $0xa00025 // sys_kill + SWI $SYS_kill RET TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0 MOVW mode+0(FP), R0 // arg 1 - which MOVW new+4(FP), R1 // arg 2 - itv MOVW old+8(FP), R2 // arg 3 - oitv - SWI $0xa001a9 // sys_setitimer + SWI $SYS___setitimer50 RET // func walltime() (sec int64, nsec int32) TEXT runtime·walltime(SB), NOSPLIT, $32 MOVW $0, R0 // CLOCK_REALTIME MOVW $8(R13), R1 - SWI $0xa001ab // clock_gettime + SWI $SYS___clock_gettime50 MOVW 8(R13), R0 // sec.low MOVW 12(R13), R1 // sec.high @@ -170,7 +208,7 @@ TEXT runtime·walltime(SB), NOSPLIT, $32 TEXT runtime·nanotime(SB), NOSPLIT, $32 MOVW $3, R0 // CLOCK_MONOTONIC MOVW $8(R13), R1 - SWI $0xa001ab // clock_gettime + SWI $SYS___clock_gettime50 MOVW 8(R13), R0 // sec.low MOVW 12(R13), R4 // sec.high @@ -188,7 +226,7 @@ TEXT runtime·nanotime(SB), NOSPLIT, $32 TEXT runtime·getcontext(SB),NOSPLIT|NOFRAME,$0 MOVW ctxt+0(FP), R0 // arg 1 - context - SWI $0xa00133 // sys_getcontext + SWI $SYS_getcontext MOVW.CS $0, R8 // crash on syscall failure MOVW.CS R8, (R8) RET @@ -197,7 +235,7 @@ TEXT runtime·sigprocmask(SB),NOSPLIT,$0 MOVW how+0(FP), R0 // arg 1 - how MOVW new+4(FP), R1 // arg 2 - set MOVW old+8(FP), R2 // arg 3 - oset - SWI $0xa00125 // sys_sigprocmask + SWI $SYS___sigprocmask14 MOVW.CS $0, R8 // crash on syscall failure MOVW.CS R8, (R8) RET @@ -206,10 +244,10 @@ TEXT runtime·sigreturn_tramp(SB),NOSPLIT|NOFRAME,$0 // on entry, SP points to siginfo, we add sizeof(ucontext) // to SP to get a pointer to ucontext. ADD $0x80, R13, R0 // 0x80 == sizeof(UcontextT) - SWI $0xa00134 // sys_setcontext + SWI $SYS_setcontext // something failed, we have to exit MOVW $0x4242, R0 // magic return number - SWI $0xa00001 // sys_exit + SWI $SYS_exit B -2(PC) // continue exit TEXT runtime·sigaction(SB),NOSPLIT,$4 @@ -220,7 +258,7 @@ TEXT runtime·sigaction(SB),NOSPLIT,$4 MOVW $2, R4 // arg 5 - vers MOVW R4, 4(R13) ADD $4, R13 // pass arg 5 on stack - SWI $0xa00154 // sys___sigaction_sigtramp + SWI $SYS___sigaction_sigtramp SUB $4, R13 MOVW.CS $3, R8 // crash on syscall failure MOVW.CS R8, (R8) @@ -266,7 +304,7 @@ TEXT runtime·mmap(SB),NOSPLIT,$12 MOVW $0, R6 // higher 32-bit for arg 6 MOVW R6, 12(R13) ADD $4, R13 // pass arg 5 and arg 6 on stack - SWI $0xa000c5 // sys_mmap + SWI $SYS_mmap SUB $4, R13 MOVW $0, R1 MOVW.CS R0, R1 // if error, move to R1 @@ -278,7 +316,7 @@ TEXT runtime·mmap(SB),NOSPLIT,$12 TEXT runtime·munmap(SB),NOSPLIT,$0 MOVW addr+0(FP), R0 // arg 1 - addr MOVW n+4(FP), R1 // arg 2 - len - SWI $0xa00049 // sys_munmap + SWI $SYS_munmap MOVW.CS $0, R8 // crash on syscall failure MOVW.CS R8, (R8) RET @@ -287,7 +325,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 MOVW addr+0(FP), R0 // arg 1 - addr MOVW n+4(FP), R1 // arg 2 - len MOVW flags+8(FP), R2 // arg 3 - behav - SWI $0xa0004b // sys_madvise + SWI $SYS_madvise MOVW.CS $-1, R0 MOVW R0, ret+12(FP) RET @@ -295,7 +333,7 @@ TEXT runtime·madvise(SB),NOSPLIT,$0 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 MOVW new+0(FP), R0 // arg 1 - nss MOVW old+4(FP), R1 // arg 2 - oss - SWI $0xa00119 // sys___sigaltstack14 + SWI $SYS___sigaltstack14 MOVW.CS $0, R8 // crash on syscall failure MOVW.CS R8, (R8) RET @@ -310,15 +348,15 @@ TEXT runtime·sysctl(SB),NOSPLIT,$8 MOVW ndst+20(FP), R4 // arg 6 - newlen MOVW R4, 8(R13) ADD $4, R13 // pass arg 5 and 6 on stack - SWI $0xa000ca // sys___sysctl + SWI $SYS___sysctl SUB $4, R13 MOVW R0, ret+24(FP) RET // int32 runtime·kqueue(void) TEXT runtime·kqueue(SB),NOSPLIT,$0 - SWI $0xa00158 // sys_kqueue - RSB.CS $0, R0 + SWI $SYS_kqueue + RSB.CS $0, R0 MOVW R0, ret+0(FP) RET @@ -333,7 +371,7 @@ TEXT runtime·kevent(SB),NOSPLIT,$8 MOVW ts+20(FP), R4 // timeout MOVW R4, 8(R13) ADD $4, R13 // pass arg 5 and 6 on stack - SWI $0xa001b3 // sys___kevent50 + SWI $SYS___kevent50 RSB.CS $0, R0 SUB $4, R13 MOVW R0, ret+24(FP) @@ -342,9 +380,9 @@ TEXT runtime·kevent(SB),NOSPLIT,$8 // void runtime·closeonexec(int32 fd) TEXT runtime·closeonexec(SB),NOSPLIT,$0 MOVW fd+0(FP), R0 // fd - MOVW $2, R1 // F_SETFD - MOVW $1, R2 // FD_CLOEXEC - SWI $0xa0005c // sys_fcntl + MOVW $F_SETFD, R1 // F_SETFD + MOVW $FD_CLOEXEC, R2 // FD_CLOEXEC + SWI $SYS_fcntl RET // TODO: this is only valid for ARMv7+ @@ -353,6 +391,6 @@ TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0 TEXT runtime·read_tls_fallback(SB),NOSPLIT|NOFRAME,$0 MOVM.WP [R1, R2, R3, R12], (R13) - SWI $0x00a0013c // _lwp_getprivate + SWI $SYS__lwp_getprivate MOVM.IAW (R13), [R1, R2, R3, R12] RET diff --git a/src/runtime/sys_netbsd_arm64.s b/src/runtime/sys_netbsd_arm64.s index ff8db73bbb..6f188ea995 100644 --- a/src/runtime/sys_netbsd_arm64.s +++ b/src/runtime/sys_netbsd_arm64.s @@ -10,41 +10,41 @@ #include "go_tls.h" #include "textflag.h" -#define CLOCK_REALTIME 0 -#define CLOCK_MONOTONIC 3 -#define FD_CLOEXEC 1 -#define F_SETFD 2 - -#define SYS_exit 1 -#define SYS_read 3 -#define SYS_write 4 -#define SYS_open 5 -#define SYS_close 6 -#define SYS_getpid 20 -#define SYS_kill 37 -#define SYS_munmap 73 -#define SYS_madvise 75 -#define SYS_fcntl 92 -#define SYS_mmap 197 -#define SYS___sysctl 202 -#define SYS___sigaltstack14 281 -#define SYS___sigprocmask14 293 -#define SYS_getcontext 307 -#define SYS_setcontext 308 -#define SYS__lwp_create 309 -#define SYS__lwp_exit 310 -#define SYS__lwp_self 311 -#define SYS__lwp_kill 318 -#define SYS__lwp_unpark 321 -#define SYS___sigaction_sigtramp 340 -#define SYS_kqueue 344 -#define SYS_sched_yield 350 -#define SYS___setitimer50 425 -#define SYS___clock_gettime50 427 -#define SYS___nanosleep50 430 -#define SYS___kevent50 435 -#define SYS_openat 468 -#define SYS____lwp_park60 478 +#define CLOCK_REALTIME 0 +#define CLOCK_MONOTONIC 3 +#define FD_CLOEXEC 1 +#define F_SETFD 2 + +#define SYS_exit 1 +#define SYS_read 3 +#define SYS_write 4 +#define SYS_open 5 +#define SYS_close 6 +#define SYS_getpid 20 +#define SYS_kill 37 +#define SYS_munmap 73 +#define SYS_madvise 75 +#define SYS_fcntl 92 +#define SYS_mmap 197 +#define SYS___sysctl 202 +#define SYS___sigaltstack14 281 +#define SYS___sigprocmask14 293 +#define SYS_getcontext 307 +#define SYS_setcontext 308 +#define SYS__lwp_create 309 +#define SYS__lwp_exit 310 +#define SYS__lwp_self 311 +#define SYS__lwp_kill 318 +#define SYS__lwp_unpark 321 +#define SYS___sigaction_sigtramp 340 +#define SYS_kqueue 344 +#define SYS_sched_yield 350 +#define SYS___setitimer50 425 +#define SYS___clock_gettime50 427 +#define SYS___nanosleep50 430 +#define SYS___kevent50 435 +#define SYS_openat 468 +#define SYS____lwp_park60 478 // int32 lwp_create(void *context, uintptr flags, void *lwpid) TEXT runtime·lwp_create(SB),NOSPLIT,$0 -- GitLab From 43001a0dc96a29f662f2782c5fb3ca998eadd623 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Wed, 10 Apr 2019 16:44:46 -0700 Subject: [PATCH 0894/1679] cmd/compile: use correct package name for stack object symbol Stack object generation code was always using the local package name for its symbol. Normally that doesn't matter, as we usually only compile functions in the local package. But for wrappers, the compiler generates functions which live in other packages. When there are two other packages with identical functions to wrap, the same name appears twice, and the compiler goes boom. Fixes #31252 Change-Id: I7026eebabe562cb159b8b6046cf656afd336ba25 Reviewed-on: https://go-review.googlesource.com/c/go/+/171464 Run-TryBot: Keith Randall TryBot-Result: Gobot Gobot Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/gc/obj.go | 2 +- src/cmd/compile/internal/gc/pgen.go | 2 +- test/fixedbugs/issue31252.dir/a.go | 13 +++++++++++++ test/fixedbugs/issue31252.dir/b.go | 13 +++++++++++++ test/fixedbugs/issue31252.dir/c.go | 26 ++++++++++++++++++++++++++ test/fixedbugs/issue31252.dir/main.go | 11 +++++++++++ test/fixedbugs/issue31252.go | 7 +++++++ 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 test/fixedbugs/issue31252.dir/a.go create mode 100644 test/fixedbugs/issue31252.dir/b.go create mode 100644 test/fixedbugs/issue31252.dir/c.go create mode 100644 test/fixedbugs/issue31252.dir/main.go create mode 100644 test/fixedbugs/issue31252.go diff --git a/src/cmd/compile/internal/gc/obj.go b/src/cmd/compile/internal/gc/obj.go index 5630e12ace..86d52f5084 100644 --- a/src/cmd/compile/internal/gc/obj.go +++ b/src/cmd/compile/internal/gc/obj.go @@ -287,7 +287,7 @@ func addGCLocals() { } } if x := s.Func.StackObjects; x != nil { - ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.LOCAL) + ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.DUPOK) } } } diff --git a/src/cmd/compile/internal/gc/pgen.go b/src/cmd/compile/internal/gc/pgen.go index b0ed01947a..8e4126d779 100644 --- a/src/cmd/compile/internal/gc/pgen.go +++ b/src/cmd/compile/internal/gc/pgen.go @@ -266,7 +266,7 @@ func compile(fn *Node) { // Also make sure we allocate a linker symbol // for the stack object data, for the same reason. if fn.Func.lsym.Func.StackObjects == nil { - fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym() + fn.Func.lsym.Func.StackObjects = Ctxt.Lookup(fn.Func.lsym.Name + ".stkobj") } } } diff --git a/test/fixedbugs/issue31252.dir/a.go b/test/fixedbugs/issue31252.dir/a.go new file mode 100644 index 0000000000..fa431502c0 --- /dev/null +++ b/test/fixedbugs/issue31252.dir/a.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 a + +import "fmt" + +type IndexController struct{} + +func (this *IndexController) Index(m *string) { + fmt.Println(m) +} diff --git a/test/fixedbugs/issue31252.dir/b.go b/test/fixedbugs/issue31252.dir/b.go new file mode 100644 index 0000000000..9bfc0ff92e --- /dev/null +++ b/test/fixedbugs/issue31252.dir/b.go @@ -0,0 +1,13 @@ +// Copyright 2019 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 b + +import "fmt" + +type IndexController struct{} + +func (this *IndexController) Index(m *string) { + fmt.Println(m) +} diff --git a/test/fixedbugs/issue31252.dir/c.go b/test/fixedbugs/issue31252.dir/c.go new file mode 100644 index 0000000000..928c8eee1c --- /dev/null +++ b/test/fixedbugs/issue31252.dir/c.go @@ -0,0 +1,26 @@ +// Copyright 2019 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 c + +import ( + "a" + "b" +) + +type HandlerFunc func(*string) + +func RouterInit() { + //home API + homeIndex := &a.IndexController{} + GET("/home/index/index", homeIndex.Index) + //admin API + adminIndex := &b.IndexController{} + GET("/admin/index/index", adminIndex.Index) + return +} + +func GET(path string, handlers ...HandlerFunc) { + return +} diff --git a/test/fixedbugs/issue31252.dir/main.go b/test/fixedbugs/issue31252.dir/main.go new file mode 100644 index 0000000000..25a7548668 --- /dev/null +++ b/test/fixedbugs/issue31252.dir/main.go @@ -0,0 +1,11 @@ +// Copyright 2019 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 main + +import "c" + +func main() { + c.RouterInit() +} diff --git a/test/fixedbugs/issue31252.go b/test/fixedbugs/issue31252.go new file mode 100644 index 0000000000..973ae1dcef --- /dev/null +++ b/test/fixedbugs/issue31252.go @@ -0,0 +1,7 @@ +// compiledir + +// Copyright 2019 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 ignored -- GitLab From e6ae4e86ad59c45f302a8828e77e6c234307fce4 Mon Sep 17 00:00:00 2001 From: Shawn Elliott Date: Mon, 22 Apr 2019 14:45:19 +0000 Subject: [PATCH 0895/1679] cmd/go/internal/generate: stop premature variable substitution in commands go:generate commands passed no arguments are currently subject to premature variable substitution due to mistakenly assuming append guarantees a copy. The change fixes this by forcing a slice copy at each invocation of a command. The previous code assumed that append would always generate a copy of its inputs. However, append wouldn't create a copy if there was no need to increase capacity and it would just return the original input slice. This resulted in premature variable substitutions in the "master word list" of generate commands, thus yielding incorrect results across multiple invocations of the same command when the body contained substitutions e.g. environment variables, moreover these can change during the lifetime of go:generate processing a file. Note that this behavior would not manifest itself if any arguments were passed to the command, because append would make a copy of the slice as it needed to increase its capacity. The "hacky" work-around was to always pass at least one argument to any command, even if the command ignores it. e.g., //go:generate MyNoArgsCmd ' ' This CL fixes that issue and removes the need for the hack mentioned above. Fixes #31608 Change-Id: I782ac2234bd7035a37f61c101ee4aee38ed8d29f GitHub-Last-Rev: 796d3430191f183c123c450a60b4a7987cc85e20 GitHub-Pull-Request: golang/go#31527 Reviewed-on: https://go-review.googlesource.com/c/go/+/172580 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/generate/generate.go | 7 +- src/cmd/go/internal/generate/generate_test.go | 198 ++++++++++++++++++ 2 files changed, 204 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/internal/generate/generate.go b/src/cmd/go/internal/generate/generate.go index 38c8274b40..19597c7a33 100644 --- a/src/cmd/go/internal/generate/generate.go +++ b/src/cmd/go/internal/generate/generate.go @@ -374,7 +374,12 @@ Words: // Substitute command if required. if len(words) > 0 && g.commands[words[0]] != nil { // Replace 0th word by command substitution. - words = append(g.commands[words[0]], words[1:]...) + // + // Force a copy of the command definition to + // ensure words doesn't end up as a reference + // to the g.commands content. + tmpCmdWords := append([]string(nil), (g.commands[words[0]])...) + words = append(tmpCmdWords, words[1:]...) } // Substitute environment variables. for i, word := range words { diff --git a/src/cmd/go/internal/generate/generate_test.go b/src/cmd/go/internal/generate/generate_test.go index defc15387f..b546218a3c 100644 --- a/src/cmd/go/internal/generate/generate_test.go +++ b/src/cmd/go/internal/generate/generate_test.go @@ -5,6 +5,7 @@ package generate import ( + "os" "reflect" "runtime" "testing" @@ -15,6 +16,15 @@ type splitTest struct { out []string } +// Same as above, except including source line number to set +type splitTestWithLine struct { + in string + out []string + lineNumber int +} + +const anyLineNo = 0 + var splitTests = []splitTest{ {"", nil}, {"x", []string{"x"}}, @@ -54,3 +64,191 @@ func TestGenerateCommandParse(t *testing.T) { } } } + +// These environment variables will be undefined before the splitTestWithLine tests +var undefEnvList = []string{ + "_XYZZY_", +} + +// These environment variables will be defined before the splitTestWithLine tests +var defEnvMap = map[string]string{ + "_PLUGH_": "SomeVal", + "_X": "Y", +} + +// TestGenerateCommandShortHand - similar to TestGenerateCommandParse, +// except: +// 1. if the result starts with -command, record that shorthand +// before moving on to the next test. +// 2. If a source line number is specified, set that in the parser +// before executing the test. i.e., execute the split as if it +// processing that source line. +func TestGenerateCommandShorthand(t *testing.T) { + g := &Generator{ + r: nil, // Unused here. + path: "/usr/ken/sys/proc.go", + dir: "/usr/ken/sys", + file: "proc.go", + pkg: "sys", + commands: make(map[string][]string), + } + + var inLine string + var expected, got []string + + g.setEnv() + + // Set up the system environment variables + for i := range undefEnvList { + os.Unsetenv(undefEnvList[i]) + } + for k := range defEnvMap { + os.Setenv(k, defEnvMap[k]) + } + + // simple command from environment variable + inLine = "//go:generate -command CMD0 \"ab${_X}cd\"" + expected = []string{"-command", "CMD0", "abYcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + // try again, with an extra level of indirection (should leave variable in command) + inLine = "//go:generate -command CMD0 \"ab${DOLLAR}{_X}cd\"" + expected = []string{"-command", "CMD0", "ab${_X}cd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + // Now the interesting part, record that output as a command + g.setShorthand(got) + + // see that the command still substitutes correctly from env. variable + inLine = "//go:generate CMD0" + expected = []string{"abYcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + // Now change the value of $X and see if the recorded definition is + // still intact (vs. having the $_X already substituted out) + + os.Setenv("_X", "Z") + inLine = "//go:generate CMD0" + expected = []string{"abZcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + // What if the variable is now undefined? Should be empty substitution. + + os.Unsetenv("_X") + inLine = "//go:generate CMD0" + expected = []string{"abcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + // Try another undefined variable as an extra check + os.Unsetenv("_Z") + inLine = "//go:generate -command CMD1 \"ab${_Z}cd\"" + expected = []string{"-command", "CMD1", "abcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + g.setShorthand(got) + + inLine = "//go:generate CMD1" + expected = []string{"abcd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + const val = "someNewValue" + os.Setenv("_Z", val) + + // try again with the properly-escaped variable. + + inLine = "//go:generate -command CMD2 \"ab${DOLLAR}{_Z}cd\"" + expected = []string{"-command", "CMD2", "ab${_Z}cd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } + + g.setShorthand(got) + + inLine = "//go:generate CMD2" + expected = []string{"ab" + val + "cd"} + got = g.split(inLine + "\n") + + if !reflect.DeepEqual(got, expected) { + t.Errorf("split(%q): got %q expected %q", inLine, got, expected) + } +} + +// Command-related tests for TestGenerateCommandShortHand2 +// -- Note line numbers included to check substitutions from "build-in" variable - $GOLINE +var splitTestsLines = []splitTestWithLine{ + {"-command TEST1 $GOLINE", []string{"-command", "TEST1", "22"}, 22}, + {"-command TEST2 ${DOLLAR}GOLINE", []string{"-command", "TEST2", "$GOLINE"}, 26}, + {"TEST1", []string{"22"}, 33}, + {"TEST2", []string{"66"}, 66}, + {"TEST1 ''", []string{"22", "''"}, 99}, + {"TEST2 ''", []string{"44", "''"}, 44}, +} + +// TestGenerateCommandShortHand - similar to TestGenerateCommandParse, +// except: +// 1. if the result starts with -command, record that shorthand +// before moving on to the next test. +// 2. If a source line number is specified, set that in the parser +// before executing the test. i.e., execute the split as if it +// processing that source line. +func TestGenerateCommandShortHand2(t *testing.T) { + g := &Generator{ + r: nil, // Unused here. + path: "/usr/ken/sys/proc.go", + dir: "/usr/ken/sys", + file: "proc.go", + pkg: "sys", + commands: make(map[string][]string), + } + g.setEnv() + for _, test := range splitTestsLines { + // if the test specified a line number, reflect that + if test.lineNumber != anyLineNo { + g.lineNum = test.lineNumber + g.setEnv() + } + // First with newlines. + got := g.split("//go:generate " + test.in + "\n") + if !reflect.DeepEqual(got, test.out) { + t.Errorf("split(%q): got %q expected %q", test.in, got, test.out) + } + // Then with CRLFs, thank you Windows. + got = g.split("//go:generate " + test.in + "\r\n") + if !reflect.DeepEqual(got, test.out) { + t.Errorf("split(%q): got %q expected %q", test.in, got, test.out) + } + if got[0] == "-command" { // record commands + g.setShorthand(got) + } + } +} -- GitLab From 1f0c102a57f62de6f66381c75732ba486da7b904 Mon Sep 17 00:00:00 2001 From: Tyler Bui-Palsulich Date: Mon, 22 Apr 2019 15:09:10 -0400 Subject: [PATCH 0896/1679] cmd/go: expand cannot determine module path error See suggestion 2 of #31543 by thepudds. We may want to expand 'go help mod init' in the future to document what the module path should look like. Change-Id: Ia559fa96fda871e011d53f42a803175abc512202 Reviewed-on: https://go-review.googlesource.com/c/go/+/173318 Run-TryBot: Jay Conrod TryBot-Result: Gobot Gobot Reviewed-by: Jay Conrod --- src/cmd/go/internal/modload/init.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index fad204a2dd..bc0541705f 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -512,7 +512,8 @@ func findModulePath(dir string) (string, error) { // TODO(bcmills): once we have located a plausible module path, we should // query version control (if available) to verify that it matches the major // version of the most recent tag. - // See https://golang.org/issue/29433 and https://golang.org/issue/27009. + // See https://golang.org/issue/29433, https://golang.org/issue/27009, and + // https://golang.org/issue/31549. // Cast about for import comments, // first in top-level directory, then in subdirectories. @@ -563,7 +564,15 @@ func findModulePath(dir string) (string, error) { } } - return "", fmt.Errorf("cannot determine module path for source directory %s (outside GOPATH, module path must be specified)", dir) + msg := `cannot determine module path for source directory %s (outside GOPATH, module path must be specified) + +Example usage: + 'go mod init example.com/m' to initialize a v0 or v1 module + 'go mod init example.com/m/v2' to initialize a v2 module + +Run 'go help mod init' for more information. +` + return "", fmt.Errorf(msg, dir) } var ( -- GitLab From 415da714fa2b7e96743e14fe0a33f02ae8c8dd5b Mon Sep 17 00:00:00 2001 From: Benoit Sigoure Date: Mon, 22 Apr 2019 14:35:01 -0700 Subject: [PATCH 0897/1679] net/http: document that Basic Auth may require URL encoding Explicitly warn callers that no URL encoding is performed and that they might need to do it. Fixes #31577 Change-Id: I52dc3fd2798ba8c3652d4a967b1c5c48eb69f43b Reviewed-on: https://go-review.googlesource.com/c/go/+/173319 Reviewed-by: Brad Fitzpatrick --- src/net/http/request.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/net/http/request.go b/src/net/http/request.go index da5ac2c71b..8afe1a7c0c 100644 --- a/src/net/http/request.go +++ b/src/net/http/request.go @@ -912,6 +912,10 @@ func parseBasicAuth(auth string) (username, password string, ok bool) { // // With HTTP Basic Authentication the provided username and password // are not encrypted. +// +// Some protocols may impose additional requirements on pre-escaping the +// username and password. For instance, when used with OAuth2, both arguments +// must be URL encoded first with url.QueryEscape. func (r *Request) SetBasicAuth(username, password string) { r.Header.Set("Authorization", "Basic "+basicAuth(username, password)) } -- GitLab From ef2806e4abca28e01320e08102915dc130417ada Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 22 Apr 2019 15:39:57 -0700 Subject: [PATCH 0898/1679] cmd/compile: change visitBottomUp from post-order traversal to pre-order No meaningful change, but allows the followup CL to pass toolstash-check. Change-Id: I1d852c97838be3f84cf795bc9daec9b15c705956 Reviewed-on: https://go-review.googlesource.com/c/go/+/173320 Run-TryBot: Matthew Dempsky Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/scc.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/cmd/compile/internal/gc/scc.go b/src/cmd/compile/internal/gc/scc.go index 80d5be6549..fec71953a4 100644 --- a/src/cmd/compile/internal/gc/scc.go +++ b/src/cmd/compile/internal/gc/scc.go @@ -117,13 +117,6 @@ func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { return min } - min = v.visitcodelist(n.Ninit, min) - min = v.visitcode(n.Left, min) - min = v.visitcode(n.Right, min) - min = v.visitcodelist(n.List, min) - min = v.visitcodelist(n.Nbody, min) - min = v.visitcodelist(n.Rlist, min) - switch n.Op { case OCALLFUNC, OCALLMETH: fn := asNode(n.Left.Type.Nname()) @@ -141,5 +134,12 @@ func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { } } + min = v.visitcodelist(n.Ninit, min) + min = v.visitcode(n.Left, min) + min = v.visitcode(n.Right, min) + min = v.visitcodelist(n.List, min) + min = v.visitcodelist(n.Nbody, min) + min = v.visitcodelist(n.Rlist, min) + return min } -- GitLab From e40dffe55ac0ec40fc325bf9ef03dde297fcc2c0 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 22 Apr 2019 14:22:25 -0700 Subject: [PATCH 0899/1679] cmd/compile: refactor visitBottomUp to use inspectList Passes toolstash-check. Change-Id: I02efba7bab3ea49d87c8472bbb99116565bf8423 Reviewed-on: https://go-review.googlesource.com/c/go/+/173321 Reviewed-by: Brad Fitzpatrick --- src/cmd/compile/internal/gc/scc.go | 59 +++++++++--------------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/src/cmd/compile/internal/gc/scc.go b/src/cmd/compile/internal/gc/scc.go index fec71953a4..0428a6af8d 100644 --- a/src/cmd/compile/internal/gc/scc.go +++ b/src/cmd/compile/internal/gc/scc.go @@ -71,9 +71,25 @@ func (v *bottomUpVisitor) visit(n *Node) uint32 { v.nodeID[n] = id v.visitgen++ min := v.visitgen - v.stack = append(v.stack, n) - min = v.visitcodelist(n.Nbody, min) + + inspectList(n.Nbody, func(n *Node) bool { + switch n.Op { + case OCALLFUNC, OCALLMETH: + fn := asNode(n.Left.Type.Nname()) + if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { + if m := v.visit(fn.Name.Defn); m < min { + min = m + } + } + case OCLOSURE: + if m := v.visit(n.Func.Closure); m < min { + min = m + } + } + return true + }) + if (min == id || min == id+1) && !n.Func.IsHiddenClosure() { // This node is the root of a strongly connected component. @@ -104,42 +120,3 @@ func (v *bottomUpVisitor) visit(n *Node) uint32 { return min } - -func (v *bottomUpVisitor) visitcodelist(l Nodes, min uint32) uint32 { - for _, n := range l.Slice() { - min = v.visitcode(n, min) - } - return min -} - -func (v *bottomUpVisitor) visitcode(n *Node, min uint32) uint32 { - if n == nil { - return min - } - - switch n.Op { - case OCALLFUNC, OCALLMETH: - fn := asNode(n.Left.Type.Nname()) - if fn != nil && fn.Op == ONAME && fn.Class() == PFUNC && fn.Name.Defn != nil { - m := v.visit(fn.Name.Defn) - if m < min { - min = m - } - } - - case OCLOSURE: - m := v.visit(n.Func.Closure) - if m < min { - min = m - } - } - - min = v.visitcodelist(n.Ninit, min) - min = v.visitcode(n.Left, min) - min = v.visitcode(n.Right, min) - min = v.visitcodelist(n.List, min) - min = v.visitcodelist(n.Nbody, min) - min = v.visitcodelist(n.Rlist, min) - - return min -} -- GitLab From f0e97546962736fe4aa73b7c7ed590f0134515e1 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 8 Apr 2019 11:23:42 -0400 Subject: [PATCH 0900/1679] cmd/go: add env -w and env -u to set and unset default env vars Setting environment variables for go command configuration is too difficult and system-specific. This CL adds go env -w, to change the default settings more easily, in a portable way. It also adds go env -u, to unset those changes. See https://golang.org/design/30411-env for details. Fixes #30411. Change-Id: I36e83f55b666459f8f7f482432a4a6ee015da71d Reviewed-on: https://go-review.googlesource.com/c/go/+/171137 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/alldocs.go | 57 +++-- src/cmd/go/go_test.go | 13 +- src/cmd/go/internal/base/goflags.go | 3 +- src/cmd/go/internal/cache/default.go | 3 +- src/cmd/go/internal/cfg/cfg.go | 254 ++++++++++++++++++++--- src/cmd/go/internal/envcmd/env.go | 240 +++++++++++++++++++-- src/cmd/go/internal/help/helpdoc.go | 47 +++-- src/cmd/go/internal/modfetch/notary.go | 4 +- src/cmd/go/internal/modfetch/proxy.go | 4 +- src/cmd/go/internal/modload/init.go | 27 +-- src/cmd/go/internal/work/action.go | 2 +- src/cmd/go/internal/work/exec.go | 35 ++-- src/cmd/go/internal/work/gccgo.go | 6 +- src/cmd/go/internal/work/security.go | 9 +- src/cmd/go/main.go | 10 +- src/cmd/go/testdata/script/env_write.txt | 87 ++++++++ src/cmd/internal/objabi/util.go | 2 +- src/make.bash | 1 + src/make.bat | 3 +- src/make.rc | 1 + src/runtime/extern.go | 3 + 21 files changed, 671 insertions(+), 140 deletions(-) create mode 100644 src/cmd/go/testdata/script/env_write.txt diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 2cc00f29b1..d012235b81 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -368,7 +368,7 @@ // // Usage: // -// go env [-json] [var ...] +// go env [-json] [-u] [-w] [var ...] // // Env prints Go environment information. // @@ -380,6 +380,14 @@ // The -json flag prints the environment in JSON format // instead of as a shell script. // +// The -u flag requires one or more arguments and unsets +// the default setting for the named environment variables, +// if one has been set with 'go env -w'. +// +// The -w flag requires one or more arguments of the +// form NAME=VALUE and changes the default settings +// of the named environment variables to the given values. +// // For more about environment variables, see 'go help environment'. // // @@ -1485,10 +1493,17 @@ // // Environment variables // -// The go command, and the tools it invokes, examine a few different -// environment variables. For many of these, you can see the default -// value of on your system by running 'go env NAME', where NAME is the -// name of the variable. +// The go command and the tools it invokes consult environment variables +// for configuration. If an environment variable is unset, the go command +// uses a sensible default setting. To see the effective setting of the +// variable , run 'go env '. To change the default setting, +// run 'go env -w ='. Defaults changed using 'go env -w' +// are recorded in a Go environment configuration file stored in the +// per-user configuration directory, as reported by os.UserConfigDir. +// The location of the configuration file can be changed by setting +// the environment variable GOENV, and 'go env GOENV' prints the +// effective location, but 'go env -w' cannot change the default location. +// See 'go help env' for details. // // General-purpose environment variables: // @@ -1502,10 +1517,15 @@ // GOCACHE // The directory where the go command will store cached // information for reuse in future builds. +// GOENV +// The location of the Go environment configuration file. +// Cannot be set using 'go env -w'. // GOFLAGS // A space-separated list of -flag=value settings to apply // to go commands by default, when the given flag is known by -// the current command. Flags listed on the command line +// the current command. Each entry must be a standalone flag. +// Because the entries are space-separated, flag values must +// not contain spaces. Flags listed on the command line // are applied after this list and therefore override it. // GOOS // The operating system for which to compile code. @@ -1514,21 +1534,18 @@ // For more details see: 'go help gopath'. // GOPROXY // URL of Go module proxy. See 'go help goproxy'. -// GORACE -// Options for the race detector. -// See https://golang.org/doc/articles/race_detector.html. // GOROOT // The root of the go tree. // GOTMPDIR // The directory where the go command will write // temporary source files, packages, and binaries. // -// Each entry in the GOFLAGS list must be a standalone flag. -// Because the entries are space-separated, flag values must -// not contain spaces. -// // Environment variables for use with cgo: // +// AR +// The command to use to manipulate library archives when +// building with the gccgo compiler. +// The default is 'ar'. // CC // The command to use to compile C code. // CGO_ENABLED @@ -1558,12 +1575,10 @@ // but for the linker. // CXX // The command to use to compile C++ code. +// FC +// The command to use to compile Fortran code. // PKG_CONFIG // Path to pkg-config tool. -// AR -// The command to use to manipulate library archives when -// building with the gccgo compiler. -// The default is 'ar'. // // Architecture-specific environment variables: // @@ -1598,9 +1613,11 @@ // when using -linkmode=auto with code that uses cgo. // Set to 0 to disable external linking mode, 1 to enable it. // GIT_ALLOW_PROTOCOL -// Defined by Git. A colon-separated list of schemes that are allowed to be used -// with git fetch/clone. If set, any scheme not explicitly mentioned will be -// considered insecure by 'go get'. +// Defined by Git. A colon-separated list of schemes that are allowed +// to be used with git fetch/clone. If set, any scheme not explicitly +// mentioned will be considered insecure by 'go get'. +// Because the variable is defined by Git, the default value cannot +// be set using 'go env -w'. // // Additional information available from 'go env' but not read from the environment: // diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 473f62ca5b..5ec02d8e49 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -6,8 +6,6 @@ package main_test import ( "bytes" - "cmd/go/internal/cache" - "cmd/internal/sys" "context" "debug/elf" "debug/macho" @@ -28,6 +26,10 @@ import ( "strings" "testing" "time" + + "cmd/go/internal/cache" + "cmd/go/internal/cfg" + "cmd/internal/sys" ) var ( @@ -119,6 +121,8 @@ var testCtx = context.Background() // The TestMain function creates a go command for testing purposes and // deletes it after the tests have been run. func TestMain(m *testing.M) { + // $GO_GCFLAGS a compiler debug flag known to cmd/dist, make.bash, etc. + // It is not a standard go command flag; use os.Getenv, not cfg.Getenv. if os.Getenv("GO_GCFLAGS") != "" { fmt.Fprintf(os.Stderr, "testing: warning: no tests to run\n") // magic string for cmd/go fmt.Printf("cmd/go test is not compatible with $GO_GCFLAGS being set\n") @@ -256,6 +260,7 @@ func TestMain(m *testing.M) { } } // Don't let these environment variables confuse the test. + os.Setenv("GOENV", "off") os.Unsetenv("GOBIN") os.Unsetenv("GOPATH") os.Unsetenv("GIT_ALLOW_PROTOCOL") @@ -264,7 +269,7 @@ func TestMain(m *testing.M) { // Setting HOME to a non-existent directory will break // those systems. Disable ccache and use real compiler. Issue 17668. os.Setenv("CCACHE_DISABLE", "1") - if os.Getenv("GOCACHE") == "" { + if cfg.Getenv("GOCACHE") == "" { os.Setenv("GOCACHE", testGOCACHE) // because $HOME is gone } @@ -5258,7 +5263,7 @@ func TestCacheVet(t *testing.T) { if strings.Contains(os.Getenv("GODEBUG"), "gocacheverify") { t.Skip("GODEBUG gocacheverify") } - if os.Getenv("GOCACHE") == "off" { + if cfg.Getenv("GOCACHE") == "off" { tooSlow(t) tg.makeTempdir() tg.setenv("GOCACHE", tg.path("cache")) diff --git a/src/cmd/go/internal/base/goflags.go b/src/cmd/go/internal/base/goflags.go index 2f50b50bfc..187c2a1472 100644 --- a/src/cmd/go/internal/base/goflags.go +++ b/src/cmd/go/internal/base/goflags.go @@ -7,7 +7,6 @@ package base import ( "flag" "fmt" - "os" "runtime" "strings" @@ -62,7 +61,7 @@ func InitGOFLAGS() { // (Both will show the GOFLAGS setting if let succeed.) hideErrors := cfg.CmdName == "env" || cfg.CmdName == "bug" - goflags = strings.Fields(os.Getenv("GOFLAGS")) + goflags = strings.Fields(cfg.Getenv("GOFLAGS")) if goflags == nil { goflags = []string{} // avoid work on later InitGOFLAGS call } diff --git a/src/cmd/go/internal/cache/default.go b/src/cmd/go/internal/cache/default.go index 7d389c3c1a..9f8dd8af4b 100644 --- a/src/cmd/go/internal/cache/default.go +++ b/src/cmd/go/internal/cache/default.go @@ -12,6 +12,7 @@ import ( "sync" "cmd/go/internal/base" + "cmd/go/internal/cfg" ) // Default returns the default cache to use, or nil if no cache should be used. @@ -73,7 +74,7 @@ func DefaultDir() string { // otherwise distinguish between an explicit "off" and a UserCacheDir error. defaultDirOnce.Do(func() { - defaultDir = os.Getenv("GOCACHE") + defaultDir = cfg.Getenv("GOCACHE") if filepath.IsAbs(defaultDir) || defaultDir == "off" { return } diff --git a/src/cmd/go/internal/cfg/cfg.go b/src/cmd/go/internal/cfg/cfg.go index 35f7f1a173..1060c8f6df 100644 --- a/src/cmd/go/internal/cfg/cfg.go +++ b/src/cmd/go/internal/cfg/cfg.go @@ -7,11 +7,15 @@ package cfg import ( + "bytes" "fmt" "go/build" + "io/ioutil" "os" "path/filepath" "runtime" + "strings" + "sync" "cmd/internal/objabi" ) @@ -46,6 +50,50 @@ var ( func defaultContext() build.Context { ctxt := build.Default ctxt.JoinPath = filepath.Join // back door to say "do not use go command" + + ctxt.GOROOT = findGOROOT() + if runtime.Compiler != "gccgo" { + // Note that we must use runtime.GOOS and runtime.GOARCH here, + // as the tool directory does not move based on environment + // variables. This matches the initialization of ToolDir in + // go/build, except for using ctxt.GOROOT rather than + // runtime.GOROOT. + build.ToolDir = filepath.Join(ctxt.GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) + } + + ctxt.GOPATH = envOr("GOPATH", ctxt.GOPATH) + + // Override defaults computed in go/build with defaults + // from go environment configuration file, if known. + ctxt.GOOS = envOr("GOOS", ctxt.GOOS) + ctxt.GOARCH = envOr("GOARCH", ctxt.GOARCH) + + // The go/build rule for whether cgo is enabled is: + // 1. If $CGO_ENABLED is set, respect it. + // 2. Otherwise, if this is a cross-compile, disable cgo. + // 3. Otherwise, use built-in default for GOOS/GOARCH. + // Recreate that logic here with the new GOOS/GOARCH setting. + if v := Getenv("CGO_ENABLED"); v == "0" || v == "1" { + ctxt.CgoEnabled = v[0] == '1' + } else if ctxt.GOOS != runtime.GOOS || ctxt.GOARCH != runtime.GOARCH { + ctxt.CgoEnabled = false + } else { + // Use built-in default cgo setting for GOOS/GOARCH. + // Note that ctxt.GOOS/GOARCH are derived from the preference list + // (1) environment, (2) go/env file, (3) runtime constants, + // while go/build.Default.GOOS/GOARCH are derived from the preference list + // (1) environment, (2) runtime constants. + // We know ctxt.GOOS/GOARCH == runtime.GOOS/GOARCH; + // no matter how that happened, go/build.Default will make the + // same decision (either the environment variables are set explicitly + // to match the runtime constants, or else they are unset, in which + // case go/build falls back to the runtime constants), so + // go/build.Default.GOOS/GOARCH == runtime.GOOS/GOARCH. + // So ctxt.CgoEnabled (== go/build.Default.CgoEnabled) is correct + // as is and can be left unmodified. + // Nothing to do here. + } + return ctxt } @@ -70,9 +118,10 @@ var CmdEnv []EnvVar // Global build parameters (used during package load) var ( - Goarch = BuildContext.GOARCH - Goos = BuildContext.GOOS - ExeSuffix string + Goarch = BuildContext.GOARCH + Goos = BuildContext.GOOS + + ExeSuffix = exeSuffix() // ModulesEnabled specifies whether the go command is running // in module-aware mode (as opposed to GOPATH mode). @@ -85,40 +134,195 @@ var ( GoModInGOPATH string ) -func init() { +func exeSuffix() string { if Goos == "windows" { - ExeSuffix = ".exe" + return ".exe" + } + return "" +} + +var envCache struct { + once sync.Once + m map[string]string +} + +// EnvFile returns the name of the Go environment configuration file. +func EnvFile() (string, error) { + if file := os.Getenv("GOENV"); file != "" { + if file == "off" { + return "", fmt.Errorf("GOENV=off") + } + return file, nil + } + dir, err := os.UserConfigDir() + if err != nil { + return "", err + } + if dir == "" { + return "", fmt.Errorf("missing user-config dir") + } + return filepath.Join(dir, "go/env"), nil +} + +func initEnvCache() { + envCache.m = make(map[string]string) + file, _ := EnvFile() + if file == "" { + return + } + data, err := ioutil.ReadFile(file) + if err != nil { + return + } + + for len(data) > 0 { + // Get next line. + line := data + i := bytes.IndexByte(data, '\n') + if i >= 0 { + line, data = line[:i], data[i+1:] + } else { + data = nil + } + + i = bytes.IndexByte(line, '=') + if i < 0 || line[0] < 'A' || 'Z' < line[0] { + // Line is missing = (or empty) or a comment or not a valid env name. Ignore. + // (This should not happen, since the file should be maintained almost + // exclusively by "go env -w", but better to silently ignore than to make + // the go command unusable just because somehow the env file has + // gotten corrupted.) + continue + } + key, val := line[:i], line[i+1:] + envCache.m[string(key)] = string(val) + } +} + +// Getenv gets the value for the configuration key. +// It consults the operating system environment +// and then the go/env file. +// If Getenv is called for a key that cannot be set +// in the go/env file (for example GODEBUG), it panics. +// This ensures that CanGetenv is accurate, so that +// 'go env -w' stays in sync with what Getenv can retrieve. +func Getenv(key string) string { + if !CanGetenv(key) { + switch key { + case "CGO_TEST_ALLOW", "CGO_TEST_DISALLOW", "CGO_test_ALLOW", "CGO_test_DISALLOW": + // used by internal/work/security_test.go; allow + default: + panic("internal error: invalid Getenv " + key) + } + } + val := os.Getenv(key) + if val != "" { + return val } + envCache.once.Do(initEnvCache) + return envCache.m[key] } +// CanGetenv reports whether key is a valid go/env configuration key. +func CanGetenv(key string) bool { + return strings.Contains(knownEnv, "\t"+key+"\n") +} + +var knownEnv = ` + AR + CC + CGO_CFLAGS + CGO_CFLAGS_ALLOW + CGO_CFLAGS_DISALLOW + CGO_CPPFLAGS + CGO_CPPFLAGS_ALLOW + CGO_CPPFLAGS_DISALLOW + CGO_CXXFLAGS + CGO_CXXFLAGS_ALLOW + CGO_CXXFLAGS_DISALLOW + CGO_ENABLED + CGO_FFLAGS + CGO_FFLAGS_ALLOW + CGO_FFLAGS_DISALLOW + CGO_LDFLAGS + CGO_LDFLAGS_ALLOW + CGO_LDFLAGS_DISALLOW + CXX + FC + GCCGO + GO111MODULE + GO386 + GOARCH + GOARM + GOBIN + GOCACHE + GOENV + GOEXE + GOFLAGS + GOGCCFLAGS + GOHOSTARCH + GOHOSTOS + GOMIPS + GOMIPS64 + GONOVERIFY + GOOS + GOPATH + GOPPC64 + GOPROXY + GOROOT + GOTMPDIR + GOTOOLDIR + GOWASM + GO_EXTLINK_ENABLED + PKG_CONFIG +` + var ( - GOROOT = findGOROOT() - GOBIN = os.Getenv("GOBIN") + GOROOT = BuildContext.GOROOT + GOBIN = Getenv("GOBIN") GOROOTbin = filepath.Join(GOROOT, "bin") GOROOTpkg = filepath.Join(GOROOT, "pkg") GOROOTsrc = filepath.Join(GOROOT, "src") GOROOT_FINAL = findGOROOT_FINAL() // Used in envcmd.MkEnv and build ID computations. - GOARM = fmt.Sprint(objabi.GOARM) - GO386 = objabi.GO386 - GOMIPS = objabi.GOMIPS - GOMIPS64 = objabi.GOMIPS64 - GOPPC64 = fmt.Sprintf("%s%d", "power", objabi.GOPPC64) - GOWASM = objabi.GOWASM + GOARM = envOr("GOARM", fmt.Sprint(objabi.GOARM)) + GO386 = envOr("GO386", objabi.GO386) + GOMIPS = envOr("GOMIPS", objabi.GOMIPS) + GOMIPS64 = envOr("GOMIPS64", objabi.GOMIPS64) + GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", objabi.GOPPC64)) + GOWASM = envOr("GOWASM", fmt.Sprint(objabi.GOWASM)) ) -// Update build context to use our computed GOROOT. -func init() { - BuildContext.GOROOT = GOROOT - if runtime.Compiler != "gccgo" { - // Note that we must use runtime.GOOS and runtime.GOARCH here, - // as the tool directory does not move based on environment - // variables. This matches the initialization of ToolDir in - // go/build, except for using GOROOT rather than - // runtime.GOROOT. - build.ToolDir = filepath.Join(GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) +// GetArchEnv returns the name and setting of the +// GOARCH-specific architecture environment variable. +// If the current architecture has no GOARCH-specific variable, +// GetArchEnv returns empty key and value. +func GetArchEnv() (key, val string) { + switch Goarch { + case "arm": + return "GOARM", GOARM + case "386": + return "GO386", GO386 + case "mips", "mipsle": + return "GOMIPS", GOMIPS + case "mips64", "mips64le": + return "GOMIPS64", GOMIPS64 + case "ppc64", "ppc64le": + return "GOPPC64", GOPPC64 + case "wasm": + return "GOWASM", GOWASM + } + return "", "" +} + +// envOr returns Getenv(key) if set, or else def. +func envOr(key, def string) string { + val := Getenv(key) + if val == "" { + val = def } + return val } // There is a copy of findGOROOT, isSameDir, and isGOROOT in @@ -132,7 +336,7 @@ func init() { // // There is a copy of this code in x/tools/cmd/godoc/goroot.go. func findGOROOT() string { - if env := os.Getenv("GOROOT"); env != "" { + if env := Getenv("GOROOT"); env != "" { return filepath.Clean(env) } def := filepath.Clean(runtime.GOROOT()) @@ -168,6 +372,8 @@ func findGOROOT() string { } func findGOROOT_FINAL() string { + // $GOROOT_FINAL is only for use during make.bash + // so it is not settable using go/env, so we use os.Getenv here. def := GOROOT if env := os.Getenv("GOROOT_FINAL"); env != "" { def = filepath.Clean(env) diff --git a/src/cmd/go/internal/envcmd/env.go b/src/cmd/go/internal/envcmd/env.go index 645f83246a..f03eeca9ff 100644 --- a/src/cmd/go/internal/envcmd/env.go +++ b/src/cmd/go/internal/envcmd/env.go @@ -10,6 +10,9 @@ import ( "fmt" "os" "path/filepath" + "unicode/utf8" + "io/ioutil" + "sort" "runtime" "strings" @@ -22,7 +25,7 @@ import ( ) var CmdEnv = &base.Command{ - UsageLine: "go env [-json] [var ...]", + UsageLine: "go env [-json] [-u] [-w] [var ...]", Short: "print Go environment information", Long: ` Env prints Go environment information. @@ -35,6 +38,14 @@ each named variable on its own line. The -json flag prints the environment in JSON format instead of as a shell script. +The -u flag requires one or more arguments and unsets +the default setting for the named environment variables, +if one has been set with 'go env -w'. + +The -w flag requires one or more arguments of the +form NAME=VALUE and changes the default settings +of the named environment variables to the given values. + For more about environment variables, see 'go help environment'. `, } @@ -43,26 +54,31 @@ func init() { CmdEnv.Run = runEnv // break init cycle } -var envJson = CmdEnv.Flag.Bool("json", false, "") +var ( + envJson = CmdEnv.Flag.Bool("json", false, "") + envU = CmdEnv.Flag.Bool("u", false, "") + envW = CmdEnv.Flag.Bool("w", false, "") +) func MkEnv() []cfg.EnvVar { var b work.Builder b.Init() + envFile, _ := cfg.EnvFile() env := []cfg.EnvVar{ {Name: "GOARCH", Value: cfg.Goarch}, {Name: "GOBIN", Value: cfg.GOBIN}, {Name: "GOCACHE", Value: cache.DefaultDir()}, + {Name: "GOENV", Value: envFile}, {Name: "GOEXE", Value: cfg.ExeSuffix}, - {Name: "GOFLAGS", Value: os.Getenv("GOFLAGS")}, + {Name: "GOFLAGS", Value: cfg.Getenv("GOFLAGS")}, {Name: "GOHOSTARCH", Value: runtime.GOARCH}, {Name: "GOHOSTOS", Value: runtime.GOOS}, {Name: "GOOS", Value: cfg.Goos}, {Name: "GOPATH", Value: cfg.BuildContext.GOPATH}, - {Name: "GOPROXY", Value: os.Getenv("GOPROXY")}, - {Name: "GORACE", Value: os.Getenv("GORACE")}, + {Name: "GOPROXY", Value: cfg.Getenv("GOPROXY")}, {Name: "GOROOT", Value: cfg.GOROOT}, - {Name: "GOTMPDIR", Value: os.Getenv("GOTMPDIR")}, + {Name: "GOTMPDIR", Value: cfg.Getenv("GOTMPDIR")}, {Name: "GOTOOLDIR", Value: base.ToolDir}, } @@ -72,29 +88,20 @@ func MkEnv() []cfg.EnvVar { env = append(env, cfg.EnvVar{Name: "GCCGO", Value: work.GccgoName}) } - switch cfg.Goarch { - case "arm": - env = append(env, cfg.EnvVar{Name: "GOARM", Value: cfg.GOARM}) - case "386": - env = append(env, cfg.EnvVar{Name: "GO386", Value: cfg.GO386}) - case "mips", "mipsle": - env = append(env, cfg.EnvVar{Name: "GOMIPS", Value: cfg.GOMIPS}) - case "mips64", "mips64le": - env = append(env, cfg.EnvVar{Name: "GOMIPS64", Value: cfg.GOMIPS64}) - case "ppc64", "ppc64le": - env = append(env, cfg.EnvVar{Name: "GOPPC64", Value: cfg.GOPPC64}) - case "wasm": - env = append(env, cfg.EnvVar{Name: "GOWASM", Value: cfg.GOWASM.String()}) + key, val := cfg.GetArchEnv() + if key != "" { + env = append(env, cfg.EnvVar{Name: key, Value: val}) } cc := cfg.DefaultCC(cfg.Goos, cfg.Goarch) - if env := strings.Fields(os.Getenv("CC")); len(env) > 0 { + if env := strings.Fields(cfg.Getenv("CC")); len(env) > 0 { cc = env[0] } cxx := cfg.DefaultCXX(cfg.Goos, cfg.Goarch) - if env := strings.Fields(os.Getenv("CXX")); len(env) > 0 { + if env := strings.Fields(cfg.Getenv("CXX")); len(env) > 0 { cxx = env[0] } + env = append(env, cfg.EnvVar{Name: "AR", Value: envOr("AR", "ar")}) env = append(env, cfg.EnvVar{Name: "CC", Value: cc}) env = append(env, cfg.EnvVar{Name: "CXX", Value: cxx}) @@ -107,6 +114,14 @@ func MkEnv() []cfg.EnvVar { return env } +func envOr(name, def string) string { + val := cfg.Getenv(name) + if val != "" { + return val + } + return def +} + func findEnv(env []cfg.EnvVar, name string) string { for _, e := range env { if e.Name == name { @@ -154,7 +169,25 @@ func ExtraEnvVarsCostly() []cfg.EnvVar { } } +// argKey returns the KEY part of the arg KEY=VAL, or else arg itself. +func argKey(arg string) string { + i := strings.Index(arg, "=") + if i < 0 { + return arg + } + return arg[:i] +} + func runEnv(cmd *base.Command, args []string) { + if *envJson && *envU { + base.Fatalf("go env: cannot use -json with -u") + } + if *envJson && *envW { + base.Fatalf("go env: cannot use -json with -w") + } + if *envU && *envW { + base.Fatalf("go env: cannot use -u with -w") + } env := cfg.CmdEnv env = append(env, ExtraEnvVars()...) @@ -165,7 +198,7 @@ func runEnv(cmd *base.Command, args []string) { if len(args) > 0 { needCostly = false for _, arg := range args { - switch arg { + switch argKey(arg) { case "CGO_CFLAGS", "CGO_CPPFLAGS", "CGO_CXXFLAGS", @@ -181,6 +214,55 @@ func runEnv(cmd *base.Command, args []string) { env = append(env, ExtraEnvVarsCostly()...) } + if *envW { + // Process and sanity-check command line. + if len(args) == 0 { + base.Fatalf("go env -w: no KEY=VALUE arguments given") + } + osEnv := make(map[string]string) + for _, e := range cfg.OrigEnv { + if i := strings.Index(e, "="); i >= 0 { + osEnv[e[:i]] = e[i+1:] + } + } + add := make(map[string]string) + for _, arg := range args { + i := strings.Index(arg, "=") + if i < 0 { + base.Fatalf("go env -w: arguments must be KEY=VALUE: invalid argument: %s", arg) + } + key, val := arg[:i], arg[i+1:] + if err := checkEnvWrite(key, val, env); err != nil { + base.Fatalf("go env -w: %v", err) + } + if _, ok := add[key]; ok { + base.Fatalf("go env -w: multiple values for key: %s", key) + } + add[key] = val + if osVal := osEnv[key]; osVal != "" && osVal != val { + fmt.Fprintf(os.Stderr, "warning: go env -w %s=... does not override conflicting OS environment variable\n", key) + } + } + updateEnvFile(add, nil) + return + } + + if *envU { + // Process and sanity-check command line. + if len(args) == 0 { + base.Fatalf("go env -u: no arguments given") + } + del := make(map[string]bool) + for _, arg := range args { + if err := checkEnvWrite(arg, "", env); err != nil { + base.Fatalf("go env -u: %v", err) + } + del[arg] = true + } + updateEnvFile(nil, del) + return + } + if len(args) > 0 { if *envJson { var es []cfg.EnvVar @@ -239,6 +321,118 @@ func printEnvAsJSON(env []cfg.EnvVar) { enc := json.NewEncoder(os.Stdout) enc.SetIndent("", "\t") if err := enc.Encode(m); err != nil { - base.Fatalf("%s", err) + base.Fatalf("go env -json: %s", err) + } +} + +func checkEnvWrite(key, val string, env []cfg.EnvVar) error { + switch key { + case "GOEXE", "GOGCCFLAGS", "GOHOSTARCH", "GOHOSTOS", "GOMOD", "GOTOOLDIR": + return fmt.Errorf("%s cannot be modified", key) + case "GOENV": + return fmt.Errorf("%s can only be set using the OS environment", key) + } + + // To catch typos and the like, check that we know the variable. + if !cfg.CanGetenv(key) { + return fmt.Errorf("unknown go command variable %s", key) + } + + if !utf8.ValidString(val) { + return fmt.Errorf("invalid UTF-8 in %s=... value", key) + } + if strings.Contains(val, "\x00") { + return fmt.Errorf("invalid NUL in %s=... value", key) + } + if strings.ContainsAny(val, "\v\r\n") { + return fmt.Errorf("invalid newline in %s=... value", key) + } + return nil +} + +func updateEnvFile(add map[string]string, del map[string]bool) { + file, err := cfg.EnvFile() + if file == "" { + base.Fatalf("go env: cannot find go env config: %v", err) + } + data, err := ioutil.ReadFile(file) + if err != nil && (!os.IsNotExist(err) || len(add) == 0) { + base.Fatalf("go env: reading go env config: %v", err) } + + lines := strings.SplitAfter(string(data), "\n") + if lines[len(lines)-1] == "" { + lines = lines[:len(lines)-1] + } else { + lines[len(lines)-1] += "\n" + } + + // Delete all but last copy of any duplicated variables, + // since the last copy is the one that takes effect. + prev := make(map[string]int) + for l, line := range lines { + if key := lineToKey(line); key != "" { + if p, ok := prev[key]; ok { + lines[p] = "" + } + prev[key] = l + } + } + + // Add variables (go env -w). Update existing lines in file if present, add to end otherwise. + for key, val := range add { + if p, ok := prev[key]; ok { + lines[p] = key + "=" + val + "\n" + delete(add, key) + } + } + for key, val := range add { + lines = append(lines, key + "=" + val + "\n") + } + + // Delete requested variables (go env -u). + for key := range del { + if p, ok := prev[key]; ok { + lines[p] = "" + } + } + + // Sort runs of KEY=VALUE lines + // (that is, blocks of lines where blocks are separated + // by comments, blank lines, or invalid lines). + start := 0 + for i := 0; i <= len(lines); i++ { + if i == len(lines) || lineToKey(lines[i]) == "" { + sortKeyValues(lines[start:i]) + start = i+1 + } + } + + data = []byte(strings.Join(lines, "")) + err = ioutil.WriteFile(file, data, 0666) + if err != nil { + // Try creating directory. + os.MkdirAll(filepath.Dir(file), 0777) + err = ioutil.WriteFile(file, data, 0666) + if err != nil { + base.Fatalf("go env: writing go env config: %v", err) + } + } +} + +// lineToKey returns the KEY part of the line KEY=VALUE or else an empty string. +func lineToKey(line string) string { + i := strings.Index(line, "=") + if i < 0 || strings.Contains(line[:i], "#") { + return "" + } + return line[:i] +} + +// sortKeyValues sorts a sequence of lines by key. +// It differs from sort.Strings in that GO386= sorts after GO=. +func sortKeyValues(lines []string) { + sort.Slice(lines, func(i, j int) bool { + return lineToKey(lines[i]) < lineToKey(lines[j]) + }) } diff --git a/src/cmd/go/internal/help/helpdoc.go b/src/cmd/go/internal/help/helpdoc.go index 98d4bd0382..43ad57f2c0 100644 --- a/src/cmd/go/internal/help/helpdoc.go +++ b/src/cmd/go/internal/help/helpdoc.go @@ -469,10 +469,17 @@ var HelpEnvironment = &base.Command{ Short: "environment variables", Long: ` -The go command, and the tools it invokes, examine a few different -environment variables. For many of these, you can see the default -value of on your system by running 'go env NAME', where NAME is the -name of the variable. +The go command and the tools it invokes consult environment variables +for configuration. If an environment variable is unset, the go command +uses a sensible default setting. To see the effective setting of the +variable , run 'go env '. To change the default setting, +run 'go env -w ='. Defaults changed using 'go env -w' +are recorded in a Go environment configuration file stored in the +per-user configuration directory, as reported by os.UserConfigDir. +The location of the configuration file can be changed by setting +the environment variable GOENV, and 'go env GOENV' prints the +effective location, but 'go env -w' cannot change the default location. +See 'go help env' for details. General-purpose environment variables: @@ -486,10 +493,15 @@ General-purpose environment variables: GOCACHE The directory where the go command will store cached information for reuse in future builds. + GOENV + The location of the Go environment configuration file. + Cannot be set using 'go env -w'. GOFLAGS A space-separated list of -flag=value settings to apply to go commands by default, when the given flag is known by - the current command. Flags listed on the command line + the current command. Each entry must be a standalone flag. + Because the entries are space-separated, flag values must + not contain spaces. Flags listed on the command line are applied after this list and therefore override it. GOOS The operating system for which to compile code. @@ -498,21 +510,18 @@ General-purpose environment variables: For more details see: 'go help gopath'. GOPROXY URL of Go module proxy. See 'go help goproxy'. - GORACE - Options for the race detector. - See https://golang.org/doc/articles/race_detector.html. GOROOT The root of the go tree. GOTMPDIR The directory where the go command will write temporary source files, packages, and binaries. -Each entry in the GOFLAGS list must be a standalone flag. -Because the entries are space-separated, flag values must -not contain spaces. - Environment variables for use with cgo: + AR + The command to use to manipulate library archives when + building with the gccgo compiler. + The default is 'ar'. CC The command to use to compile C code. CGO_ENABLED @@ -542,12 +551,10 @@ Environment variables for use with cgo: but for the linker. CXX The command to use to compile C++ code. + FC + The command to use to compile Fortran code. PKG_CONFIG Path to pkg-config tool. - AR - The command to use to manipulate library archives when - building with the gccgo compiler. - The default is 'ar'. Architecture-specific environment variables: @@ -582,9 +589,11 @@ Special-purpose environment variables: when using -linkmode=auto with code that uses cgo. Set to 0 to disable external linking mode, 1 to enable it. GIT_ALLOW_PROTOCOL - Defined by Git. A colon-separated list of schemes that are allowed to be used - with git fetch/clone. If set, any scheme not explicitly mentioned will be - considered insecure by 'go get'. + Defined by Git. A colon-separated list of schemes that are allowed + to be used with git fetch/clone. If set, any scheme not explicitly + mentioned will be considered insecure by 'go get'. + Because the variable is defined by Git, the default value cannot + be set using 'go env -w'. Additional information available from 'go env' but not read from the environment: diff --git a/src/cmd/go/internal/modfetch/notary.go b/src/cmd/go/internal/modfetch/notary.go index 9514958817..dea37ff450 100644 --- a/src/cmd/go/internal/modfetch/notary.go +++ b/src/cmd/go/internal/modfetch/notary.go @@ -6,11 +6,11 @@ package modfetch import ( "fmt" - "os" pathpkg "path" "strings" "cmd/go/internal/base" + "cmd/go/internal/cfg" "cmd/go/internal/get" "cmd/go/internal/module" ) @@ -67,7 +67,7 @@ func useNotary(mod module.Version) bool { if get.Insecure { return false } - wantNotary, err := notaryShouldVerify(mod.Path, os.Getenv("GONOVERIFY")) + wantNotary, err := notaryShouldVerify(mod.Path, cfg.Getenv("GONOVERIFY")) if err != nil { base.Fatalf("%v", err) } diff --git a/src/cmd/go/internal/modfetch/proxy.go b/src/cmd/go/internal/modfetch/proxy.go index 3d4d2becf4..cbf476d1e4 100644 --- a/src/cmd/go/internal/modfetch/proxy.go +++ b/src/cmd/go/internal/modfetch/proxy.go @@ -9,11 +9,11 @@ import ( "fmt" "io" "net/url" - "os" "strings" "time" "cmd/go/internal/base" + "cmd/go/internal/cfg" "cmd/go/internal/modfetch/codehost" "cmd/go/internal/module" "cmd/go/internal/semver" @@ -85,7 +85,7 @@ cached module versions with GOPROXY=https://example.com/proxy. `, } -var proxyURL = os.Getenv("GOPROXY") +var proxyURL = cfg.Getenv("GOPROXY") // SetProxy sets the proxy to use when fetching modules. // It accepts the same syntax as the GOPROXY environment variable, diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index bc0541705f..eaf4407529 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -6,6 +6,18 @@ package modload import ( "bytes" + "encoding/json" + "fmt" + "go/build" + "internal/lazyregexp" + "io/ioutil" + "os" + "path" + "path/filepath" + "runtime/debug" + "strconv" + "strings" + "cmd/go/internal/base" "cmd/go/internal/cache" "cmd/go/internal/cfg" @@ -18,17 +30,6 @@ import ( "cmd/go/internal/mvs" "cmd/go/internal/renameio" "cmd/go/internal/search" - "encoding/json" - "fmt" - "go/build" - "internal/lazyregexp" - "io/ioutil" - "os" - "path" - "path/filepath" - "runtime/debug" - "strconv" - "strings" ) var ( @@ -90,7 +91,7 @@ func Init() { } initialized = true - env := os.Getenv("GO111MODULE") + env := cfg.Getenv("GO111MODULE") switch env { default: base.Fatalf("go: unknown environment setting GO111MODULE=%s", env) @@ -294,7 +295,7 @@ func die() { if printStackInDie { debug.PrintStack() } - if os.Getenv("GO111MODULE") == "off" { + if cfg.Getenv("GO111MODULE") == "off" { base.Fatalf("go: modules disabled by GO111MODULE=off; see 'go help modules'") } if inGOPATH && !mustUseModules { diff --git a/src/cmd/go/internal/work/action.go b/src/cmd/go/internal/work/action.go index 1134b1f35b..7a74b1bb0d 100644 --- a/src/cmd/go/internal/work/action.go +++ b/src/cmd/go/internal/work/action.go @@ -226,7 +226,7 @@ func (b *Builder) Init() { if cfg.BuildN { b.WorkDir = "$WORK" } else { - tmp, err := ioutil.TempDir(os.Getenv("GOTMPDIR"), "go-build") + tmp, err := ioutil.TempDir(cfg.Getenv("GOTMPDIR"), "go-build") if err != nil { base.Fatalf("go: creating work dir: %v", err) } diff --git a/src/cmd/go/internal/work/exec.go b/src/cmd/go/internal/work/exec.go index 14d13f83d3..5d2659cef5 100644 --- a/src/cmd/go/internal/work/exec.go +++ b/src/cmd/go/internal/work/exec.go @@ -224,12 +224,16 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID { if len(p.SFiles) > 0 { fmt.Fprintf(h, "asm %q %q %q\n", b.toolID("asm"), forcedAsmflags, p.Internal.Asmflags) } + // GO386, GOARM, GOMIPS, etc. - baseArch := strings.TrimSuffix(cfg.BuildContext.GOARCH, "le") - fmt.Fprintf(h, "GO$GOARCH=%s\n", os.Getenv("GO"+strings.ToUpper(baseArch))) + key, val := cfg.GetArchEnv() + fmt.Fprintf(h, "%s=%s\n", key, val) // TODO(rsc): Convince compiler team not to add more magic environment variables, // or perhaps restrict the environment variables passed to subprocesses. + // Because these are clumsy, undocumented special-case hacks + // for debugging the compiler, they are not settable using 'go env -w', + // and so here we use os.Getenv, not cfg.Getenv. magic := []string{ "GOCLOBBERDEADHASH", "GOSSAFUNC", @@ -1115,21 +1119,16 @@ func (b *Builder) printLinkerConfig(h io.Writer, p *load.Package) { if p != nil { fmt.Fprintf(h, "linkflags %q\n", p.Internal.Ldflags) } - fmt.Fprintf(h, "GO$GOARCH=%s\n", os.Getenv("GO"+strings.ToUpper(cfg.BuildContext.GOARCH))) // GO386, GOARM, etc + + // GO386, GOARM, GOMIPS, etc. + key, val := cfg.GetArchEnv() + fmt.Fprintf(h, "%s=%s\n", key, val) // The linker writes source file paths that say GOROOT_FINAL. fmt.Fprintf(h, "GOROOT=%s\n", cfg.GOROOT_FINAL) - // TODO(rsc): Convince linker team not to add more magic environment variables, - // or perhaps restrict the environment variables passed to subprocesses. - magic := []string{ - "GO_EXTLINK_ENABLED", - } - for _, env := range magic { - if x := os.Getenv(env); x != "" { - fmt.Fprintf(h, "magic %s=%s\n", env, x) - } - } + // GO_EXTLINK_ENABLED controls whether the external linker is used. + fmt.Fprintf(h, "GO_EXTLINK_ENABLED=%s\n", cfg.Getenv("GO_EXTLINK_ENABLED")) // TODO(rsc): Do cgo settings and flags need to be included? // Or external linker settings and flags? @@ -2192,8 +2191,8 @@ func (b *Builder) gccld(p *load.Package, objdir, outfile string, flags []string, // Grab these before main helpfully overwrites them. var ( - origCC = os.Getenv("CC") - origCXX = os.Getenv("CXX") + origCC = cfg.Getenv("CC") + origCXX = cfg.Getenv("CXX") ) // gccCmd returns a gcc command line prefix @@ -2225,7 +2224,7 @@ func (b *Builder) cxxExe() []string { // fcExe returns the FC compiler setting without all the extra flags we add implicitly. func (b *Builder) fcExe() []string { - return b.compilerExe(os.Getenv("FC"), "gfortran") + return b.compilerExe(cfg.Getenv("FC"), "gfortran") } // compilerExe returns the compiler to use given an @@ -2391,7 +2390,7 @@ func (b *Builder) gccArchArgs() []string { // envList returns the value of the given environment variable broken // into fields, using the default value when the variable is empty. func envList(key, def string) []string { - v := os.Getenv(key) + v := cfg.Getenv(key) if v == "" { v = def } @@ -2448,7 +2447,7 @@ func (b *Builder) cgo(a *Action, cgoExe, objdir string, pcCFLAGS, pcLDFLAGS, cgo // Support gfortran out of the box and let others pass the correct link options // via CGO_LDFLAGS if len(ffiles) > 0 { - fc := os.Getenv("FC") + fc := cfg.Getenv("FC") if fc == "" { fc = "gfortran" } diff --git a/src/cmd/go/internal/work/gccgo.go b/src/cmd/go/internal/work/gccgo.go index 0ba690fd62..ff2621e1c4 100644 --- a/src/cmd/go/internal/work/gccgo.go +++ b/src/cmd/go/internal/work/gccgo.go @@ -26,7 +26,7 @@ var GccgoName, GccgoBin string var gccgoErr error func init() { - GccgoName = os.Getenv("GCCGO") + GccgoName = cfg.Getenv("GCCGO") if GccgoName == "" { GccgoName = "gccgo" } @@ -44,7 +44,7 @@ func (gccgoToolchain) linker() string { } func (gccgoToolchain) ar() string { - ar := os.Getenv("AR") + ar := cfg.Getenv("AR") if ar == "" { ar = "ar" } @@ -479,7 +479,7 @@ func (tools gccgoToolchain) link(b *Builder, root *Action, out, importcfg string ldflags = append(ldflags, "-lobjc") } if fortran { - fc := os.Getenv("FC") + fc := cfg.Getenv("FC") if fc == "" { fc = "gfortran" } diff --git a/src/cmd/go/internal/work/security.go b/src/cmd/go/internal/work/security.go index 8351e4c731..ecfb9df1b2 100644 --- a/src/cmd/go/internal/work/security.go +++ b/src/cmd/go/internal/work/security.go @@ -30,12 +30,13 @@ package work import ( - "cmd/go/internal/load" "fmt" "internal/lazyregexp" - "os" "regexp" "strings" + + "cmd/go/internal/cfg" + "cmd/go/internal/load" ) var re = lazyregexp.New @@ -229,14 +230,14 @@ func checkFlags(name, source string, list []string, valid []*lazyregexp.Regexp, allow *regexp.Regexp disallow *regexp.Regexp ) - if env := os.Getenv("CGO_" + name + "_ALLOW"); env != "" { + if env := cfg.Getenv("CGO_" + name + "_ALLOW"); env != "" { r, err := regexp.Compile(env) if err != nil { return fmt.Errorf("parsing $CGO_%s_ALLOW: %v", name, err) } allow = r } - if env := os.Getenv("CGO_" + name + "_DISALLOW"); env != "" { + if env := cfg.Getenv("CGO_" + name + "_DISALLOW"); env != "" { r, err := regexp.Compile(env) if err != nil { return fmt.Errorf("parsing $CGO_%s_DISALLOW: %v", name, err) diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index 35a507680f..0207862d0b 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -122,8 +122,14 @@ func main() { os.Exit(2) } if !filepath.IsAbs(p) { - fmt.Fprintf(os.Stderr, "go: GOPATH entry is relative; must be absolute path: %q.\nFor more details see: 'go help gopath'\n", p) - os.Exit(2) + if cfg.Getenv("GOPATH") == "" { + // We inferred $GOPATH from $HOME and did a bad job at it. + // Instead of dying, uninfer it. + cfg.BuildContext.GOPATH = "" + } else { + fmt.Fprintf(os.Stderr, "go: GOPATH entry is relative; must be absolute path: %q.\nFor more details see: 'go help gopath'\n", p) + os.Exit(2) + } } } } diff --git a/src/cmd/go/testdata/script/env_write.txt b/src/cmd/go/testdata/script/env_write.txt new file mode 100644 index 0000000000..bdc348c953 --- /dev/null +++ b/src/cmd/go/testdata/script/env_write.txt @@ -0,0 +1,87 @@ +env GO111MODULE=off + +# go env should default to the right places +env AppData=$HOME/windowsappdata +env home=$HOME/plan9home +go env GOENV +[aix] stdout $HOME/.config/go/env +[darwin] stdout $HOME/Library/Preferences/go/env +[freebsd] stdout $HOME/.config/go/env +[linux] stdout $HOME/.config/go/env +[netbsd] stdout $HOME/.config/go/env +[openbsd] stdout $HOME/.config/go/env +[plan9] stdout $HOME/plan9home/lib/go/env +[windows] stdout $HOME\\windowsappdata\\go\\env + +# Now override it to something writable. +env GOENV=$WORK/envdir/go/env +go env GOENV +stdout envdir[\\/]go[\\/]env + +# go env shows all variables +go env +stdout GOARCH= +stdout GOOS= +stdout GOROOT= + +# go env -w changes default setting +env root= +[windows] env root=c: +env GOPATH= +go env -w GOPATH=$root/non-exist/gopath +! stderr .+ +grep GOPATH=$root/non-exist/gopath $WORK/envdir/go/env +go env GOPATH +stdout /non-exist/gopath + +# go env -w does not override OS environment, and warns about that +env GOPATH=$root/other +go env -w GOPATH=$root/non-exist/gopath2 +stderr 'warning: go env -w GOPATH=... does not override conflicting OS environment variable' +go env GOPATH +stdout $root/other + +# but go env -w does do the update, and unsetting the env var exposes the change +env GOPATH= +go env GOPATH +stdout $root/non-exist/gopath2 + +# unsetting with go env -u does not warn about OS environment overrides, +# nor does it warn about variables that haven't been set by go env -w. +env GOPATH=$root/other +go env -u GOPATH +! stderr .+ +go env -u GOPATH +! stderr .+ + +# go env -w rejects unknown or bad variables +! go env -w GODEBUG=gctrace=1 +stderr 'unknown go command variable GODEBUG' +! go env -w GOEXE=.bat +stderr 'GOEXE cannot be modified' +! go env -w GOENV=/env +stderr 'GOENV can only be set using the OS environment' + +# go env -w can set multiple variables +env CC= +go env CC +! stdout ^xyc$ +go env -w GOOS=$GOOS CC=xyc +grep CC=xyc $GOENV +# file is maintained in sorted order +grep 'CC=xyc\nGOOS=' $GOENV +go env CC +stdout ^xyc$ + +# go env -u unsets effect of go env -w. +go env -u CC +go env CC +! stdout ^xyc$ + +# go env -w rejects double-set variables +! go env -w GOOS=$GOOS GOOS=$GOOS +stderr 'multiple values for key: GOOS' + +# go env -w rejects missing variables +! go env -w GOOS +stderr 'arguments must be KEY=VALUE: invalid argument: GOOS' diff --git a/src/cmd/internal/objabi/util.go b/src/cmd/internal/objabi/util.go index 57f19f2e3c..9e41b87aa4 100644 --- a/src/cmd/internal/objabi/util.go +++ b/src/cmd/internal/objabi/util.go @@ -87,7 +87,7 @@ type gowasmFeatures struct { SatConv bool } -func (f *gowasmFeatures) String() string { +func (f gowasmFeatures) String() string { var flags []string if f.SatConv { flags = append(flags, "satconv") diff --git a/src/make.bash b/src/make.bash index 2883f47c12..92d148110a 100755 --- a/src/make.bash +++ b/src/make.bash @@ -65,6 +65,7 @@ set -e +export GOENV=off unset GOBIN # Issue 14340 unset GOFLAGS unset GO111MODULE diff --git a/src/make.bat b/src/make.bat index d22cb30ab2..d18cd87d48 100644 --- a/src/make.bat +++ b/src/make.bat @@ -46,13 +46,14 @@ if x%4==x--no-local goto nolocal setlocal :nolocal +set GOENV=off set GOBUILDFAIL=0 set GOFLAGS= set GO111MODULE= if exist make.bat goto ok echo Must run make.bat from Go src directory. -goto fail +goto fail :ok :: Clean old generated file that will cause problems in the build. diff --git a/src/make.rc b/src/make.rc index f055ff8e14..f5e57e9755 100755 --- a/src/make.rc +++ b/src/make.rc @@ -47,6 +47,7 @@ if(~ $1 -v) { shift } +GOENV=off GOFLAGS=() GO111MODULE=() GOROOT = `{cd .. && pwd} diff --git a/src/runtime/extern.go b/src/runtime/extern.go index e308dd38b1..2917efefa6 100644 --- a/src/runtime/extern.go +++ b/src/runtime/extern.go @@ -136,6 +136,9 @@ that can be blocked in system calls on behalf of Go code; those do not count aga the GOMAXPROCS limit. This package's GOMAXPROCS function queries and changes the limit. +The GORACE variable configures the race detector, for programs built using -race. +See https://golang.org/doc/articles/race_detector.html for details. + The GOTRACEBACK variable controls the amount of output generated when a Go program fails due to an unrecovered panic or an unexpected runtime condition. By default, a failure prints a stack trace for the current goroutine, -- GitLab From 980a57a84b932b43fc2d3ab699f7c235472009ab Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Mon, 22 Apr 2019 17:04:59 -0700 Subject: [PATCH 0901/1679] cmd/compile: clean up string/bytes/runes conversion code Combine the OBYTES2STR and ORUNES2STR cases, as they are identical. Clean up the construction, commenting, and spacing of the other cases, and make them all match. Passes toolstash-check. Change-Id: I1be8a528927caeb15e49cb12ca0f11c0827dadd9 Reviewed-on: https://go-review.googlesource.com/c/go/+/173322 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Matthew Dempsky TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/walk.go | 46 ++++++++--------------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index be4f9ab5c0..837efbaf91 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -1355,50 +1355,36 @@ opswitch: a := nodnil() if n.Esc == EscNone { t := types.NewArray(types.Types[TUINT8], 4) - var_ := temp(t) - a = nod(OADDR, var_, nil) + a = nod(OADDR, temp(t), nil) } - // intstring(*[4]byte, rune) n = mkcall("intstring", n.Type, init, a, conv(n.Left, types.Types[TINT64])) - case OBYTES2STR: + case OBYTES2STR, ORUNES2STR: a := nodnil() if n.Esc == EscNone { // Create temporary buffer for string on stack. t := types.NewArray(types.Types[TUINT8], tmpstringbufsize) - a = nod(OADDR, temp(t), nil) } + fn := "slicebytetostring" + if n.Op == ORUNES2STR { + fn = "slicerunetostring" + } + // slicebytetostring(*[32]byte, []byte) string + // slicerunetostring(*[32]byte, []rune) string + n = mkcall(fn, n.Type, init, a, n.Left) - // slicebytetostring(*[32]byte, []byte) string; - n = mkcall("slicebytetostring", n.Type, init, a, n.Left) - - // slicebytetostringtmp([]byte) string; case OBYTES2STRTMP: n.Left = walkexpr(n.Left, init) - if !instrumenting { // Let the backend handle OBYTES2STRTMP directly // to avoid a function call to slicebytetostringtmp. break } - + // slicebytetostringtmp([]byte) string n = mkcall("slicebytetostringtmp", n.Type, init, n.Left) - // slicerunetostring(*[32]byte, []rune) string; - case ORUNES2STR: - a := nodnil() - - if n.Esc == EscNone { - // Create temporary buffer for string on stack. - t := types.NewArray(types.Types[TUINT8], tmpstringbufsize) - - a = nod(OADDR, temp(t), nil) - } - - n = mkcall("slicerunetostring", n.Type, init, a, n.Left) - case OSTR2BYTES: s := n.Left if Isconst(s, CTSTR) { @@ -1431,16 +1417,14 @@ opswitch: n = walkexpr(n, init) break } - a := nodnil() + a := nodnil() if n.Esc == EscNone { // Create temporary buffer for slice on stack. t := types.NewArray(types.Types[TUINT8], tmpstringbufsize) - a = nod(OADDR, temp(t), nil) } - - // stringtoslicebyte(*32[byte], string) []byte; + // stringtoslicebyte(*32[byte], string) []byte n = mkcall("stringtoslicebyte", n.Type, init, a, conv(s, types.Types[TSTRING])) case OSTR2BYTESTMP: @@ -1453,17 +1437,14 @@ opswitch: // for i, c := range []byte(string) n.Left = walkexpr(n.Left, init) - // stringtoslicerune(*[32]rune, string) []rune case OSTR2RUNES: a := nodnil() - if n.Esc == EscNone { // Create temporary buffer for slice on stack. t := types.NewArray(types.Types[TINT32], tmpstringbufsize) - a = nod(OADDR, temp(t), nil) } - + // stringtoslicerune(*[32]rune, string) []rune n = mkcall("stringtoslicerune", n.Type, init, a, conv(n.Left, types.Types[TSTRING])) case OARRAYLIT, OSLICELIT, OMAPLIT, OSTRUCTLIT, OPTRLIT: @@ -2536,7 +2517,6 @@ func addstr(n *Node, init *Nodes) *Node { if sz < tmpstringbufsize { // Create temporary buffer for result string on stack. t := types.NewArray(types.Types[TUINT8], tmpstringbufsize) - buf = nod(OADDR, temp(t), nil) } } -- GitLab From 7e08c7f43da876bc451b774808e323215a193abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Mon, 22 Apr 2019 23:36:43 +0700 Subject: [PATCH 0902/1679] encoding/json: index names for the struct decoder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the common case, structs have a handful of fields and most inputs match struct field names exactly. The previous code would do a linear search over the fields, stopping at the first exact match, and otherwise using the first case insensitive match. This is unfortunate, because it means that for the common case, we'd do a linear search with bytes.Equal. Even for structs with only two or three fields, that is pretty wasteful. Worse even, up until the exact match was found via the linear search, all previous fields would run their equalFold functions, which aren't cheap even in the simple case. Instead, cache a map along with the field list that indexes the fields by their name. This way, a case sensitive field search doesn't involve a linear search, nor does it involve any equalFold func calls. This patch should also slightly speed up cases where there's a case insensitive match but not a case sensitive one, as then we'd avoid calling bytes.Equal on all the fields. Though that's not a common case, and there are no benchmarks for it. name old time/op new time/op delta CodeDecoder-8 11.0ms ± 0% 10.6ms ± 1% -4.42% (p=0.000 n=9+10) name old speed new speed delta CodeDecoder-8 176MB/s ± 0% 184MB/s ± 1% +4.62% (p=0.000 n=9+10) name old alloc/op new alloc/op delta CodeDecoder-8 2.28MB ± 0% 2.28MB ± 0% ~ (p=0.725 n=10+10) name old allocs/op new allocs/op delta CodeDecoder-8 76.9k ± 0% 76.9k ± 0% ~ (all equal) Updates #28923. Change-Id: I9929c1f06c76505e5b96914199315dbdaae5dc76 Reviewed-on: https://go-review.googlesource.com/c/go/+/172918 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/encoding/json/decode.go | 23 +++++++++++++---------- src/encoding/json/encode.go | 27 ++++++++++++++++++--------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/encoding/json/decode.go b/src/encoding/json/decode.go index 3c40eb9cef..3ca3d7803e 100644 --- a/src/encoding/json/decode.go +++ b/src/encoding/json/decode.go @@ -8,7 +8,6 @@ package json import ( - "bytes" "encoding" "encoding/base64" "fmt" @@ -691,7 +690,7 @@ func (d *decodeState) object(v reflect.Value) error { return nil } - var fields []field + var fields structFields // Check type of target: // struct or @@ -761,14 +760,18 @@ func (d *decodeState) object(v reflect.Value) error { subv = mapElem } else { var f *field - for i := range fields { - ff := &fields[i] - if bytes.Equal(ff.nameBytes, key) { - f = ff - break - } - if f == nil && ff.equalFold(ff.nameBytes, key) { - f = ff + if i, ok := fields.nameIndex[string(key)]; ok { + // Found an exact name match. + f = &fields.list[i] + } else { + // Fall back to the expensive case-insensitive + // linear search. + for i := range fields.list { + ff := &fields.list[i] + if ff.equalFold(ff.nameBytes, key) { + f = ff + break + } } } if f != nil { diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index e3c5ffc9cb..197c0cba03 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -621,14 +621,19 @@ func unsupportedTypeEncoder(e *encodeState, v reflect.Value, _ encOpts) { } type structEncoder struct { - fields []field + fields structFields +} + +type structFields struct { + list []field + nameIndex map[string]int } func (se structEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) { next := byte('{') FieldLoop: - for i := range se.fields { - f := &se.fields[i] + for i := range se.fields.list { + f := &se.fields.list[i] // Find the nested struct field by following f.index. fv := v @@ -1063,7 +1068,7 @@ func (x byIndex) Less(i, j int) bool { // typeFields returns a list of fields that JSON should recognize for the given type. // The algorithm is breadth-first search over the set of structs to include - the top struct // and then any reachable anonymous structs. -func typeFields(t reflect.Type) []field { +func typeFields(t reflect.Type) structFields { // Anonymous fields to explore at the current level and the next. current := []field{} next := []field{{typ: t}} @@ -1237,7 +1242,11 @@ func typeFields(t reflect.Type) []field { f := &fields[i] f.encoder = typeEncoder(typeByIndex(t, f.index)) } - return fields + nameIndex := make(map[string]int, len(fields)) + for i, field := range fields { + nameIndex[field.name] = i + } + return structFields{fields, nameIndex} } // dominantField looks through the fields, all of which are known to @@ -1256,13 +1265,13 @@ func dominantField(fields []field) (field, bool) { return fields[0], true } -var fieldCache sync.Map // map[reflect.Type][]field +var fieldCache sync.Map // map[reflect.Type]structFields // cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -func cachedTypeFields(t reflect.Type) []field { +func cachedTypeFields(t reflect.Type) structFields { if f, ok := fieldCache.Load(t); ok { - return f.([]field) + return f.(structFields) } f, _ := fieldCache.LoadOrStore(t, typeFields(t)) - return f.([]field) + return f.(structFields) } -- GitLab From fac3b5d05ecf31a2491949cc905312a34e272ae8 Mon Sep 17 00:00:00 2001 From: Shubham Sharma Date: Thu, 21 Mar 2019 21:10:12 +0530 Subject: [PATCH 0903/1679] net: add IsNotFound field to DNSError This adds the ability to determine if a lookup error was due to a non-existent hostname. Previously users needed to do string matching on the DNSError.Err value. Fixes #28635 Change-Id: If4bd3ad32cbc2db5614f2c6b72e0a9161d813efa Reviewed-on: https://go-review.googlesource.com/c/go/+/168597 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/net/cgo_unix.go | 5 ++++- src/net/dnsclient_unix.go | 15 ++++++-------- src/net/dnsclient_unix_test.go | 38 ++++++++++++++++++++++++++++++---- src/net/lookup.go | 4 ++-- src/net/lookup_test.go | 3 +++ src/net/lookup_windows.go | 21 ++++++++++++++++--- src/net/net.go | 1 + 7 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/net/cgo_unix.go b/src/net/cgo_unix.go index 6420fd05e7..2baab5f193 100644 --- a/src/net/cgo_unix.go +++ b/src/net/cgo_unix.go @@ -158,6 +158,7 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e var res *C.struct_addrinfo gerrno, err := C.getaddrinfo((*C.char)(unsafe.Pointer(&h[0])), nil, &hints, &res) if gerrno != 0 { + isErrorNoSuchHost := false switch gerrno { case C.EAI_SYSTEM: if err == nil { @@ -172,10 +173,12 @@ func cgoLookupIPCNAME(network, name string) (addrs []IPAddr, cname string, err e } case C.EAI_NONAME: err = errNoSuchHost + isErrorNoSuchHost = true default: err = addrinfoErrno(gerrno) } - return nil, "", &DNSError{Err: err.Error(), Name: name} + + return nil, "", &DNSError{Err: err.Error(), Name: name, IsNotFound: isErrorNoSuchHost} } defer C.freeaddrinfo(res) diff --git a/src/net/dnsclient_unix.go b/src/net/dnsclient_unix.go index 7ed4ea8708..478ee51a81 100644 --- a/src/net/dnsclient_unix.go +++ b/src/net/dnsclient_unix.go @@ -284,10 +284,8 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string, if err == errNoSuchHost { // The name does not exist, so trying // another server won't help. - // - // TODO: indicate this in a more - // obvious way, such as a field on - // DNSError? + + dnsErr.IsNotFound = true return p, server, dnsErr } lastErr = dnsErr @@ -306,9 +304,8 @@ func (r *Resolver) tryOneName(ctx context.Context, cfg *dnsConfig, name string, if err == errNoSuchHost { // The name does not exist, so trying another // server won't help. - // - // TODO: indicate this in a more obvious way, - // such as a field on DNSError? + + lastErr.(*DNSError).IsNotFound = true return p, server, lastErr } } @@ -398,7 +395,7 @@ func (r *Resolver) lookup(ctx context.Context, name string, qtype dnsmessage.Typ // Other lookups might allow broader name syntax // (for example Multicast DNS allows UTF-8; see RFC 6762). // For consistency with libc resolvers, report no such host. - return dnsmessage.Parser{}, "", &DNSError{Err: errNoSuchHost.Error(), Name: name} + return dnsmessage.Parser{}, "", &DNSError{Err: errNoSuchHost.Error(), Name: name, IsNotFound: true} } resolvConf.tryUpdate("/etc/resolv.conf") resolvConf.mu.RLock() @@ -575,7 +572,7 @@ func (r *Resolver) goLookupIPCNAMEOrder(ctx context.Context, name string, order } if !isDomainName(name) { // See comment in func lookup above about use of errNoSuchHost. - return nil, dnsmessage.Name{}, &DNSError{Err: errNoSuchHost.Error(), Name: name} + return nil, dnsmessage.Name{}, &DNSError{Err: errNoSuchHost.Error(), Name: name, IsNotFound: true} } resolvConf.tryUpdate("/etc/resolv.conf") resolvConf.mu.RLock() diff --git a/src/net/dnsclient_unix_test.go b/src/net/dnsclient_unix_test.go index f1ed58c837..1b67494e51 100644 --- a/src/net/dnsclient_unix_test.go +++ b/src/net/dnsclient_unix_test.go @@ -666,7 +666,7 @@ func TestErrorForOriginalNameWhenSearching(t *testing.T) { wantErr *DNSError }{ {true, &DNSError{Name: fqdn, Err: "server misbehaving", IsTemporary: true}}, - {false, &DNSError{Name: fqdn, Err: errNoSuchHost.Error()}}, + {false, &DNSError{Name: fqdn, Err: errNoSuchHost.Error(), IsNotFound: true}}, } for _, tt := range cases { r := Resolver{PreferGo: true, StrictErrors: tt.strictErrors, Dial: fake.DialContext} @@ -1138,9 +1138,10 @@ func TestStrictErrorsLookupIP(t *testing.T) { } makeNxDomain := func() error { return &DNSError{ - Err: errNoSuchHost.Error(), - Name: name, - Server: server, + Err: errNoSuchHost.Error(), + Name: name, + Server: server, + IsNotFound: true, } } @@ -1472,6 +1473,32 @@ func TestIssue8434(t *testing.T) { } } +func TestIssueNoSuchHostExists(t *testing.T) { + err := lookupWithFake(fakeDNSServer{ + rh: func(n, _ string, q dnsmessage.Message, _ time.Time) (dnsmessage.Message, error) { + return dnsmessage.Message{ + Header: dnsmessage.Header{ + ID: q.ID, + Response: true, + RCode: dnsmessage.RCodeNameError, + }, + Questions: q.Questions, + }, nil + }, + }, "golang.org.", dnsmessage.TypeALL) + if err == nil { + t.Fatal("expected an error") + } + if _, ok := err.(Error); !ok { + t.Fatalf("err = %#v; wanted something supporting net.Error", err) + } + if de, ok := err.(*DNSError); !ok { + t.Fatalf("err = %#v; wanted a *net.DNSError", err) + } else if !de.IsNotFound { + t.Fatalf("IsNotFound = false for err = %#v; want IsNotFound == true", err) + } +} + // TestNoSuchHost verifies that tryOneName works correctly when the domain does // not exist. // @@ -1541,6 +1568,9 @@ func TestNoSuchHost(t *testing.T) { if de.Err != errNoSuchHost.Error() { t.Fatalf("Err = %#v; wanted %q", de.Err, errNoSuchHost.Error()) } + if !de.IsNotFound { + t.Fatalf("IsNotFound = %v wanted true", de.IsNotFound) + } }) } } diff --git a/src/net/lookup.go b/src/net/lookup.go index 0af1e2c289..24d0d25c3a 100644 --- a/src/net/lookup.go +++ b/src/net/lookup.go @@ -177,7 +177,7 @@ func (r *Resolver) LookupHost(ctx context.Context, host string) (addrs []string, // Make sure that no matter what we do later, host=="" is rejected. // parseIP, for example, does accept empty strings. if host == "" { - return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host} + return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host, IsNotFound: true} } if ip, _ := parseIPZone(host); ip != nil { return []string{host}, nil @@ -238,7 +238,7 @@ func (r *Resolver) lookupIPAddr(ctx context.Context, network, host string) ([]IP // Make sure that no matter what we do later, host=="" is rejected. // parseIP, for example, does accept empty strings. if host == "" { - return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host} + return nil, &DNSError{Err: errNoSuchHost.Error(), Name: host, IsNotFound: true} } if ip, zone := parseIPZone(host); ip != nil { return []IPAddr{{IP: ip, Zone: zone}}, nil diff --git a/src/net/lookup_test.go b/src/net/lookup_test.go index 28a895e15d..ed477a78c9 100644 --- a/src/net/lookup_test.go +++ b/src/net/lookup_test.go @@ -877,6 +877,9 @@ func TestLookupNonLDH(t *testing.T) { if !strings.HasSuffix(err.Error(), errNoSuchHost.Error()) { t.Fatalf("lookup error = %v, want %v", err, errNoSuchHost) } + if !err.(*DNSError).IsNotFound { + t.Fatalf("lookup error = %v, want true", err.(*DNSError).IsNotFound) + } } func TestLookupContextCancel(t *testing.T) { diff --git a/src/net/lookup_windows.go b/src/net/lookup_windows.go index 8a68d18a67..cd071c54b0 100644 --- a/src/net/lookup_windows.go +++ b/src/net/lookup_windows.go @@ -56,7 +56,12 @@ func lookupProtocol(ctx context.Context, name string) (int, error) { if proto, err := lookupProtocolMap(name); err == nil { return proto, nil } - r.err = &DNSError{Err: r.err.Error(), Name: name} + + dnsError := &DNSError{Err: r.err.Error(), Name: name} + if r.err == errNoSuchHost { + dnsError.IsNotFound = true + } + r.err = dnsError } return r.proto, r.err case <-ctx.Done(): @@ -98,7 +103,12 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr var result *syscall.AddrinfoW e := syscall.GetAddrInfoW(syscall.StringToUTF16Ptr(name), nil, &hints, &result) if e != nil { - return nil, &DNSError{Err: winError("getaddrinfow", e).Error(), Name: name} + err := winError("getaddrinfow", e) + dnsError := &DNSError{Err: err.Error(), Name: name} + if err == errNoSuchHost { + dnsError.IsNotFound = true + } + return nil, dnsError } defer syscall.FreeAddrInfoW(result) addrs := make([]IPAddr, 0, 5) @@ -176,7 +186,12 @@ func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int if port, err := lookupPortMap(network, service); err == nil { return port, nil } - return 0, &DNSError{Err: winError("getaddrinfow", e).Error(), Name: network + "/" + service} + err := winError("getaddrinfow", e) + dnsError := &DNSError{Err: err.Error(), Name: network + "/" + service} + if err == errNoSuchHost { + dnsError.IsNotFound = true + } + return 0, dnsError } defer syscall.FreeAddrInfoW(result) if result == nil { diff --git a/src/net/net.go b/src/net/net.go index b44ecb6711..0e078620a5 100644 --- a/src/net/net.go +++ b/src/net/net.go @@ -579,6 +579,7 @@ type DNSError struct { Server string // server used IsTimeout bool // if true, timed out; not all timeouts set this IsTemporary bool // if true, error is temporary; not all errors set this + IsNotFound bool // if true, host could not be found } func (e *DNSError) Error() string { -- GitLab From b51c157025c1ff08b5090d9cf13bc88a068c5190 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Mon, 22 Apr 2019 23:01:26 -0400 Subject: [PATCH 0904/1679] cmd/go: move runtime/debug.modinfo to runtime.modinfo It is easier to ensure that the symbol is always present if we move it to package runtime. Avoids init-time work. Also moves it next to buildVersion, the other similar symbol. Setting up for "go version ". For #31624. Change-Id: I943724469ce6992153e701257eb6f12da88c8e4e Reviewed-on: https://go-review.googlesource.com/c/go/+/173341 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/cmd/go/internal/modload/build.go | 12 +++--------- src/runtime/debug.go | 5 +++++ src/runtime/debug/mod.go | 6 +++--- src/runtime/proc.go | 8 ++++++++ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/cmd/go/internal/modload/build.go b/src/cmd/go/internal/modload/build.go index 25303ce59a..a41b176ccd 100644 --- a/src/cmd/go/internal/modload/build.go +++ b/src/cmd/go/internal/modload/build.go @@ -247,21 +247,15 @@ func findModule(target, path string) module.Version { } func ModInfoProg(info string) []byte { - // Inject a variable with the debug information as runtime/debug.modinfo, + // Inject a variable with the debug information as runtime.modinfo, // but compile it in package main so that it is specific to the binary. - // // The variable must be a literal so that it will have the correct value // before the initializer for package main runs. // - // We also want the value to be present even if runtime/debug.modinfo is - // otherwise unused in the rest of the program. Reading it in an init function - // suffices for now. - + // The runtime startup code refers to the variable, which keeps it live in all binaries. return []byte(fmt.Sprintf(`package main import _ "unsafe" -//go:linkname __debug_modinfo__ runtime/debug.modinfo +//go:linkname __debug_modinfo__ runtime.modinfo var __debug_modinfo__ = %q -var keepalive_modinfo = __debug_modinfo__ -func init() { keepalive_modinfo = __debug_modinfo__ } `, string(infoStart)+info+string(infoEnd))) } diff --git a/src/runtime/debug.go b/src/runtime/debug.go index 06bf0fa831..af5c3a1170 100644 --- a/src/runtime/debug.go +++ b/src/runtime/debug.go @@ -57,3 +57,8 @@ func NumCgoCall() int64 { func NumGoroutine() int { return int(gcount()) } + +//go:linkname debug_modinfo runtime/debug.modinfo +func debug_modinfo() string { + return modinfo +} diff --git a/src/runtime/debug/mod.go b/src/runtime/debug/mod.go index 2c5aa27b6e..e3b929a977 100644 --- a/src/runtime/debug/mod.go +++ b/src/runtime/debug/mod.go @@ -8,14 +8,14 @@ import ( "strings" ) -// set using cmd/go/internal/modload.ModInfoProg -var modinfo string +// exported from runtime +func modinfo() string // ReadBuildInfo returns the build information embedded // in the running binary. The information is available only // in binaries built with module support. func ReadBuildInfo() (info *BuildInfo, ok bool) { - return readBuildInfo(modinfo) + return readBuildInfo(modinfo()) } // BuildInfo represents the build information read from diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 57ad17d594..e94de3a43a 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -13,6 +13,9 @@ import ( var buildVersion = sys.TheVersion +// set using cmd/go/internal/modload.ModInfoProg +var modinfo string + // Goroutine scheduler // The scheduler's job is to distribute ready-to-run goroutines over worker threads. // @@ -577,6 +580,11 @@ func schedinit() { // to ensure runtime·buildVersion is kept in the resulting binary. buildVersion = "unknown" } + if len(modinfo) == 1 { + // Condition should never trigger. This code just serves + // to ensure runtime·modinfo is kept in the resulting binary. + modinfo = "" + } } func dumpgstatus(gp *g) { -- GitLab From d92bc7a55aa11777bdb4605eda6536c64defb0d3 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 23 Apr 2019 07:27:07 -0400 Subject: [PATCH 0905/1679] encoding/json: document HTML escaping in Compact Make explicit that Compact does HTML escaping. Fixes #30357. Change-Id: I4648f8f3e907d659db977d07253f716df6e07d7b Reviewed-on: https://go-review.googlesource.com/c/go/+/173417 Run-TryBot: Russ Cox Reviewed-by: Brad Fitzpatrick --- src/encoding/json/encode.go | 11 ++++++----- src/encoding/json/indent.go | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/encoding/json/encode.go b/src/encoding/json/encode.go index 197c0cba03..383460e52b 100644 --- a/src/encoding/json/encode.go +++ b/src/encoding/json/encode.go @@ -45,11 +45,12 @@ import ( // // String values encode as JSON strings coerced to valid UTF-8, // replacing invalid bytes with the Unicode replacement rune. -// The angle brackets "<" and ">" are escaped to "\u003c" and "\u003e" -// to keep some browsers from misinterpreting JSON output as HTML. -// Ampersand "&" is also escaped to "\u0026" for the same reason. -// This escaping can be disabled using an Encoder that had SetEscapeHTML(false) -// called on it. +// So that the JSON will be safe to embed inside HTML